{"id":"85c428f8-a07e-4a2f-b7b8-05dee73dc856","shortId":"Q2y3RM","kind":"skill","title":"ttm-update","tagline":"Check for takeToMarket updates and upgrade to the latest version. Compares installed version against npm registry and runs installer if newer version found.","description":"# /ttm-update\n\n## Step 0: First-run inline education\n\nRead `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).\n\nIf `inline_education` is false: skip this step. Else if `first_run_seen.ttm-update` is not `true`, print the explainer below verbatim, then mark this skill as seen:\n\n```bash\nnode \"${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs\" first-run mark ttm-update\n```\n\nUse this exact check (bash) to decide whether to print: `node \"${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs\" first-run check ttm-update --raw` -- the JSON `seen` field is `true` once the explainer has run before.\n\n### Explainer for `/ttm-update`\n\n`/ttm-update` checks your installed takeToMarket version against the\nnpm registry, detects whether you installed via npm or git clone,\nruns the appropriate upgrade path, then reconciles any locally-edited\nskill files against the new source and offers per-file diffs.\n\nWhy it matters: skills evolve quickly and an out-of-date install\nsilently misses gate improvements and bug fixes. This skill is the\nopinionated upgrader -- it knows the right command for your install\nmethod and preserves your local edits behind explicit prompts rather\nthan overwriting them.\n\n(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)\n\n---\n\nCheck if takeToMarket needs updating and upgrade if available.\n\n## Step: Detect install method\n\nDetect how the user installed takeToMarket before deciding how to upgrade.\nRun this FIRST, before any version or legacy-folder work:\n\n```bash\nnode \"${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs\" install-detect --raw\n```\n\nParse the JSON `method` field. The value will be one of:\n\n- **clone** — installed via `git clone`. Upgrades happen with `git pull` in the\n  plugin root, then re-running the installer (`node install.js` or `npx\n  taketomarket@latest --yes` from the cloned directory).\n- **npm** — installed via `npx taketomarket` or `npm install -g taketomarket`.\n  Upgrades happen via `npx taketomarket@latest --yes`.\n- **unknown** — could not locate a plugin root. Print manual instructions and\n  ask the user where takeToMarket is installed before continuing:\n  ```\n  Could not auto-detect your takeToMarket install location.\n  Manual upgrade options:\n    - npm:   npx taketomarket@latest --yes\n    - clone: cd <your-clone>; git pull; node install.js\n  ```\n  Halt the workflow until the user confirms the method to use.\n\nRemember the `method` and `root` values — they are used by the version-check\nbranching and the skill-file sync step below.\n\n## Step: Legacy folder migration\n\nBefore checking version, detect whether the project still uses the legacy\n`.marketing/` state directory and offer migration to `.taketomarket/`:\n\n```bash\nnode \"${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs\" legacy-folder check --raw\n```\n\nParse the JSON `state` field:\n\n- **legacy**: print `WARN: Legacy '.marketing/' detected. Migration will rename it to '.taketomarket/'. Recommend committing or backing up first.` then prompt with `AskUserQuestion`:\n  - question: \"Migrate `.marketing/` to `.taketomarket/` now? (recommended before upgrade)\"\n  - options: \"Yes, migrate now\" / \"Skip for now\"\n  - On Yes:\n    ```bash\n    node \"${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs\" legacy-folder migrate --raw\n    ```\n  - On Skip: continue with a note that the upgrade will land alongside the legacy folder.\n- **conflict**: print the error below, then halt before the version check:\n  ```\n  ERROR: Both .marketing/ and .taketomarket/ exist. Manual resolution required before upgrade.\n\n  To resolve:\n    1. Compare contents:  diff -r .marketing .taketomarket\n    2. Merge any unique files from .marketing/ into .taketomarket/.\n    3. Remove the legacy folder once .taketomarket/ is complete:\n       rm -rf .marketing\n    4. Re-run /ttm-update to continue the upgrade.\n  ```\n- **current** or **none**: continue silently.\n\n## Version check\n\n1. Get current installed version:\n```bash\ncat $HOME/.taketomarket/package.json 2>/dev/null | python3 -c \"import sys,json; print(json.load(sys.stdin).get('version','unknown'))\" 2>/dev/null || echo \"unknown\"\n```\n\n2. Get latest version from npm:\n```bash\nnpm show taketomarket version 2>/dev/null || echo \"unknown\"\n```\n\n3. Compare versions. If already up to date, confirm\n   \"takeToMarket vX.X.X is up to date.\" and skip the install + sync steps below.\n\n4. If a newer version is available, branch by the install `method` detected\n   earlier:\n\n   - **clone** — pull the latest source, then reinstall from the cloned directory:\n     ```bash\n     git -C \"<root>\" pull --ff-only && node \"<root>/install.js\"\n     ```\n     (Substitute the `root` returned from `install-detect`.)\n   - **npm** — upgrade via npm:\n     ```bash\n     npm install -g taketomarket@latest\n     ```\n     (Falling back to `npx taketomarket@latest --yes` is acceptable if `npm\n     install -g` is not desired.)\n   - **unknown** — print the manual instructions emitted in the detection step\n     and halt. Do NOT attempt an automatic install.\n\n## Step: Skill-file diff + sync\n\nAfter the install completes (clone or npm), reconcile any user-installed skill\nfiles under `~/.claude/skills/ttm-*/` against the freshly installed source under\n`<root>/skills/ttm-*/`. This catches the case where the user edited an installed\nskill or where the installer skipped a file.\n\nFor each `ttm-*` skill directory present in BOTH locations:\n\n1. Compare files (e.g., `SKILL.md` and any supporting files) between\n   `~/.claude/skills/<skill>/` and `<root>/skills/<skill>/`.\n2. For every file with a non-trivial diff, show the user a short summary of the\n   diff (filename + a few lines of context). Then use `AskUserQuestion` with\n   priority `critical`:\n   - question: \"Overwrite `~/.claude/skills/<skill>/<file>` with the new source?\"\n   - options: \"Yes, overwrite\" / \"Skip this file\" / \"Skip remaining files\"\n3. On \"Yes, overwrite\": copy the source file over the installed copy.\n4. On \"Skip remaining files\": stop the sync loop and continue to the log step.\n5. Track the count of files actually synced.\n\nIf `<root>` is `null` (unknown install method), skip this step entirely.\n\n## Step: Append to UPDATE-LOG.md\n\nRecord the upgrade outcome in `.taketomarket/UPDATE-LOG.md` (create the file if\nit does not exist). Append the following block:\n\n```\n## YYYY-MM-DD HH:MM\n- Updated from vX.X.X to vY.Y.Y\n- Method: <clone|npm>\n- Files synced: <count>\n- Folder migration: <yes|no>\n```\n\n`<yes|no>` reflects whether the legacy-folder migration step actually ran a\nrename during this invocation.\n\n## Next steps\n\nSee `${CLAUDE_PLUGIN_ROOT}/templates/next-step-footer.md`.\n<!-- next-step-footer -->","tags":["ttm","update","taketomarket","ranjanrishikesh","agent-skills","ai-marketing","claude","claude-code","codex","content-marketing","developerneurs","growth"],"capabilities":["skill","source-ranjanrishikesh","skill-ttm-update","topic-agent-skills","topic-ai-marketing","topic-claude","topic-claude-code","topic-codex","topic-content-marketing","topic-developerneurs","topic-growth","topic-gtm","topic-indie-hackers","topic-marketing-automation","topic-positioning"],"categories":["taketomarket"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/ranjanrishikesh/taketomarket/ttm-update","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add ranjanrishikesh/taketomarket","source_repo":"https://github.com/ranjanrishikesh/taketomarket","install_from":"skills.sh"}},"qualityScore":"0.456","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 13 github stars · SKILL.md body (6,682 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:54.150Z","embedding":null,"createdAt":"2026-05-17T13:03:44.706Z","updatedAt":"2026-05-18T19:06:54.150Z","lastSeenAt":"2026-05-18T19:06:54.150Z","tsv":"'/.claude/skills':795,831 '/.claude/skills/ttm-':750 '/bin/ttm-tools.cjs':79,101,267,436,492 '/dev/null':590,603,618 '/install.js':676 '/skills':797 '/skills/ttm-':757 '/templates/next-step-footer.md':955 '/ttm-update':27,124,125,569 '0':29 '1':537,581,785 '2':544,589,602,606,617,798 '3':553,621,845 '4':565,643,857 '5':872 'accept':703 'actual':878,942 'alongsid':509 'alreadi':625 'append':891,908 'appropri':146 'ask':342 'askuserquest':468,825 'attempt':725 'auto':354 'auto-detect':353 'automat':727 'avail':235,649 'back':462,696 'bash':74,91,262,431,487,586,612,668,689 'behind':207 'block':911 'boolean':45 'branch':399,650 'bug':185 'c':592,670 'canon':214 'case':761 'cat':587 'catch':759 'cd':369 'check':4,90,105,126,227,398,413,440,523,580 'claud':76,98,264,433,489,952 'clone':143,283,287,312,368,657,666,739,924 'command':197 'commit':460 'compar':14,538,622,786 'complet':561,738 'confirm':380,629 'conflict':513 'content':539 'context':822 'continu':350,500,571,577,867 'copi':849,856 'could':332,351 'count':875 'creat':900 'critic':828 'current':574,583 'date':178,628,635 'dd':915 'decid':93,247 'default':46 'desir':710 'detect':135,237,240,270,355,415,452,655,684,719 'diff':166,540,733,807,816 'directori':313,425,667,780 'e.g':788 'earlier':656 'echo':604,619 'edit':154,206,765 'educ':34,44,50 'els':56 'embed':217 'emit':716 'entir':889 'error':516,524 'everi':800 'evolv':171 'exact':89 'exist':529,907 'explain':65,118,122 'explicit':208 'fall':695 'fals':52 'ff':673 'ff-on':672 'field':113,276,446 'file':156,165,224,404,548,732,748,775,787,793,801,841,844,852,861,877,902,926 'filenam':817 'first':31,38,81,103,253,464 'first-run':30,80,102 'first_run_seen.ttm':58 'fix':186 'folder':260,410,439,495,512,557,928,939 'follow':910 'found':26 'fresh':753 'g':322,692,707 'gate':182 'get':582,599,607 'git':142,286,291,370,669 'halt':374,519,722 'happen':289,325 'hh':916 'home/.taketomarket/package.json':588 'import':593 'improv':183 'inlin':33,43,49 'instal':15,22,128,138,179,200,238,244,269,284,302,315,321,348,358,584,639,653,683,691,706,728,737,746,754,767,772,855,884 'install-detect':268,682 'install.js':304,373 'instruct':340,715 'invoc':948 'json':111,274,444,595 'json.load':597 'know':194 'land':508 'latest':12,308,329,366,608,660,694,700 'legaci':259,409,422,438,447,450,494,511,556,938 'legacy-fold':258,437,493,937 'line':820 'local':153,205 'locally-edit':152 'locat':334,359,784 'log':870 'loop':865 'manual':339,360,530,714 'mark':69,83 'market':423,451,471,526,542,550,564 'matter':169 'merg':545 'method':201,239,275,382,387,654,885,923 'migrat':411,428,453,470,480,496,929,940 'miss':181 'mm':914,917 'need':230 'new':159,834 'newer':24,646 'next':949 'node':75,97,263,303,372,432,488,675 'non':805 'non-trivi':804 'none':576 'note':503 'npm':18,133,140,314,320,363,611,613,685,688,690,705,741,925 'npx':306,317,327,364,698 'null':882 'object':41 'offer':162,427 'one':281 'opinion':191 'option':362,478,836 'out-of-d':175 'outcom':897 'overwrit':212,830,838,848 'pars':37,272,442 'path':148 'per':164 'per-fil':163 'plugin':77,99,265,295,336,434,490,953 'present':781 'preserv':203 'print':63,96,338,448,514,596,712 'prioriti':827 'project':418 'prompt':209,466 'pull':292,371,658,671 'python3':591 'question':469,829 'quick':172 'r':541 'ran':943 'rather':210 'raw':109,271,441,497 're':299,567 're-run':298,566 'read':35 'recommend':459,475 'reconcil':150,742 'record':894 'references/inline-education-blurbs.md':216 'reflect':934 'registri':19,134 'reinstal':663 'remain':843,860 'rememb':385 'remov':554 'renam':455,945 'requir':532 'resolut':531 'resolv':223,536 'return':680 'rf':563 'right':196 'rm':562 'root':78,100,266,296,337,389,435,491,679,954 'run':21,32,39,82,104,120,144,251,300,568 'runtim':226 'see':951 'seen':40,73,112 'short':812 'show':614,808 'silent':180,578 'skill':71,155,170,188,403,731,747,768,779 'skill-fil':402,730 'skill-ttm-update' 'skill.md':789 'skip':53,482,499,637,773,839,842,859,886 'sourc':160,215,661,755,835,851 'source-ranjanrishikesh' 'state':424,445 'step':28,55,236,406,408,641,720,729,871,888,890,941,950 'still':419 'stop':862 'substitut':677 'summari':813 'support':792 'sync':405,640,734,864,879,927 'sys':594 'sys.stdin':598 'taketomarket':6,129,229,245,307,318,323,328,346,357,365,430,458,473,528,543,552,559,615,630,693,699 'taketomarket/config.md':36 'taketomarket/update-log.md':899 'topic-agent-skills' 'topic-ai-marketing' 'topic-claude' 'topic-claude-code' 'topic-codex' 'topic-content-marketing' 'topic-developerneurs' 'topic-growth' 'topic-gtm' 'topic-indie-hackers' 'topic-marketing-automation' 'topic-positioning' 'track':873 'trivial':806 'true':47,62,115 'ttm':2,85,107,778 'ttm-updat':1,84,106 'uniqu':547 'unknown':331,601,605,620,711,883 'updat':3,7,59,86,108,231,918 'update-log.md':893 'upgrad':9,147,192,233,250,288,324,361,477,506,534,573,686,896 'use':87,384,393,420,824 'user':243,344,379,745,764,810 'user-instal':744 'valu':278,390 'verbatim':67,218 'version':13,16,25,130,256,397,414,522,579,585,600,609,616,623,647 'version-check':396 'via':139,285,316,326,687 'vx.x.x':631,920 'vy.y.y':922 'warn':449 'whether':94,136,416,935 'work':261 'workflow':220,376 'yes':309,330,367,479,486,701,837,847,930,932 'yyyi':913 'yyyy-mm-dd':912","prices":[{"id":"be74395c-3d19-4792-8d39-c5a1c9f21d71","listingId":"85c428f8-a07e-4a2f-b7b8-05dee73dc856","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"ranjanrishikesh","category":"taketomarket","install_from":"skills.sh"},"createdAt":"2026-05-17T13:03:44.706Z"}],"sources":[{"listingId":"85c428f8-a07e-4a2f-b7b8-05dee73dc856","source":"github","sourceId":"ranjanrishikesh/taketomarket/ttm-update","sourceUrl":"https://github.com/ranjanrishikesh/taketomarket/tree/main/skills/ttm-update","isPrimary":false,"firstSeenAt":"2026-05-17T13:03:44.706Z","lastSeenAt":"2026-05-18T19:06:54.150Z"}],"details":{"listingId":"85c428f8-a07e-4a2f-b7b8-05dee73dc856","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"ranjanrishikesh","slug":"ttm-update","github":{"repo":"ranjanrishikesh/taketomarket","stars":13,"topics":["agent-skills","ai-marketing","claude","claude-code","codex","content-marketing","developerneurs","growth","gtm","indie-hackers","marketing-automation","positioning","solopreneurs"],"license":"mit","html_url":"https://github.com/ranjanrishikesh/taketomarket","pushed_at":"2026-05-18T10:28:19Z","description":"Marketing OS for developerneurs + solopreneurs — engineers shipping products with zero marketing experience. Spec-driven campaigns with positioning-invariant quality gates.","skill_md_sha":"45582676489898db7198e2f66cb79c26f09b6c7d","skill_md_path":"skills/ttm-update/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/ranjanrishikesh/taketomarket/tree/main/skills/ttm-update"},"layout":"multi","source":"github","category":"taketomarket","frontmatter":{"name":"ttm-update","description":"Check for takeToMarket updates and upgrade to the latest version. Compares installed version against npm registry and runs installer if newer version found."},"skills_sh_url":"https://skills.sh/ranjanrishikesh/taketomarket/ttm-update"},"updatedAt":"2026-05-18T19:06:54.150Z"}}