gsd-remix 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +21 -86
  2. package/README.zh-CN.md +13 -57
  3. package/agents/gsd-debugger.md +0 -3
  4. package/agents/gsd-executor.md +5 -11
  5. package/agents/gsd-phase-researcher.md +3 -107
  6. package/agents/gsd-plan-checker.md +0 -61
  7. package/agents/gsd-planner.md +4 -63
  8. package/agents/gsd-roadmapper.md +0 -29
  9. package/agents/gsd-security-auditor.md +62 -114
  10. package/agents/gsd-verifier.md +0 -3
  11. package/bin/install.js +20 -118
  12. package/commands/gsd/complete-milestone.md +0 -22
  13. package/commands/gsd/plan-phase.md +1 -2
  14. package/get-shit-done/bin/gsd-tools.cjs +5 -224
  15. package/get-shit-done/bin/lib/claude-md.cjs +427 -0
  16. package/get-shit-done/bin/lib/config-schema.cjs +2 -12
  17. package/get-shit-done/bin/lib/config.cjs +3 -12
  18. package/get-shit-done/bin/lib/core.cjs +4 -5
  19. package/get-shit-done/bin/lib/init.cjs +0 -163
  20. package/get-shit-done/bin/lib/model-profiles.cjs +12 -18
  21. package/get-shit-done/bin/lib/verify.cjs +0 -66
  22. package/get-shit-done/references/agent-contracts.md +0 -6
  23. package/get-shit-done/references/artifact-types.md +0 -30
  24. package/get-shit-done/references/continuation-format.md +0 -1
  25. package/get-shit-done/references/model-profiles.md +39 -37
  26. package/get-shit-done/references/planning-config.md +7 -12
  27. package/get-shit-done/references/verification-overrides.md +1 -1
  28. package/get-shit-done/templates/README.md +2 -9
  29. package/get-shit-done/templates/claude-md.md +0 -14
  30. package/get-shit-done/templates/config.json +5 -19
  31. package/get-shit-done/workflows/autonomous.md +9 -141
  32. package/get-shit-done/workflows/complete-milestone.md +3 -4
  33. package/get-shit-done/workflows/discuss-phase-assumptions.md +1 -18
  34. package/get-shit-done/workflows/discuss-phase.md +10 -104
  35. package/get-shit-done/workflows/do.md +1 -5
  36. package/get-shit-done/workflows/execute-phase.md +53 -103
  37. package/get-shit-done/workflows/execute-plan.md +4 -4
  38. package/get-shit-done/workflows/health.md +2 -5
  39. package/get-shit-done/workflows/help.md +0 -165
  40. package/get-shit-done/workflows/new-milestone.md +0 -51
  41. package/get-shit-done/workflows/new-project.md +2 -63
  42. package/get-shit-done/workflows/next.md +0 -23
  43. package/get-shit-done/workflows/pause-work.md +7 -15
  44. package/get-shit-done/workflows/plan-phase.md +20 -304
  45. package/get-shit-done/workflows/pr-branch.md +0 -1
  46. package/get-shit-done/workflows/progress.md +1 -68
  47. package/get-shit-done/workflows/quick.md +0 -3
  48. package/get-shit-done/workflows/research-phase.md +0 -1
  49. package/get-shit-done/workflows/settings.md +1 -57
  50. package/get-shit-done/workflows/transition.md +3 -86
  51. package/get-shit-done/workflows/verify-work.md +0 -64
  52. package/package.json +1 -1
  53. package/scripts/build-hooks.js +0 -2
  54. package/sdk/prompts/agents/gsd-executor.md +2 -0
  55. package/sdk/prompts/agents/gsd-plan-checker.md +0 -3
  56. package/sdk/prompts/agents/gsd-roadmapper.md +0 -29
  57. package/sdk/src/config.ts +4 -5
  58. package/sdk/src/golden/golden-integration-covered.ts +0 -2
  59. package/sdk/src/golden/golden-policy.ts +1 -1
  60. package/sdk/src/golden/golden.integration.test.ts +0 -27
  61. package/sdk/src/golden/read-only-golden-rows.ts +0 -15
  62. package/sdk/src/query/QUERY-HANDLERS.md +3 -34
  63. package/sdk/src/query/claude-md.ts +421 -0
  64. package/sdk/src/query/commit.test.ts +155 -1
  65. package/sdk/src/query/commit.ts +71 -17
  66. package/sdk/src/query/config-gates.test.ts +1 -2
  67. package/sdk/src/query/config-gates.ts +1 -5
  68. package/sdk/src/query/config-mutation.test.ts +0 -1
  69. package/sdk/src/query/config-mutation.ts +5 -6
  70. package/sdk/src/query/config-query.test.ts +2 -2
  71. package/sdk/src/query/config-query.ts +12 -18
  72. package/sdk/src/query/decomposed-handlers.test.ts +0 -64
  73. package/sdk/src/query/index.ts +4 -68
  74. package/sdk/src/query/init.test.ts +0 -64
  75. package/sdk/src/query/init.ts +0 -189
  76. package/sdk/src/query/normalize-query-command.ts +0 -2
  77. package/sdk/src/query/profile.test.ts +0 -43
  78. package/sdk/src/query/profile.ts +1 -141
  79. package/sdk/src/query/state-mutation.ts +18 -0
  80. package/sdk/src/runtime-health.ts +3 -3
  81. package/agents/gsd-ai-researcher.md +0 -133
  82. package/agents/gsd-doc-classifier.md +0 -168
  83. package/agents/gsd-doc-synthesizer.md +0 -204
  84. package/agents/gsd-doc-verifier.md +0 -217
  85. package/agents/gsd-doc-writer.md +0 -615
  86. package/agents/gsd-domain-researcher.md +0 -153
  87. package/agents/gsd-eval-auditor.md +0 -191
  88. package/agents/gsd-eval-planner.md +0 -154
  89. package/agents/gsd-framework-selector.md +0 -160
  90. package/agents/gsd-intel-updater.md +0 -334
  91. package/agents/gsd-nyquist-auditor.md +0 -203
  92. package/agents/gsd-ui-auditor.md +0 -495
  93. package/agents/gsd-ui-checker.md +0 -309
  94. package/agents/gsd-ui-researcher.md +0 -380
  95. package/agents/gsd-user-profiler.md +0 -171
  96. package/commands/gsd/ai-integration-phase.md +0 -36
  97. package/commands/gsd/analyze-dependencies.md +0 -34
  98. package/commands/gsd/audit-fix.md +0 -33
  99. package/commands/gsd/audit-milestone.md +0 -36
  100. package/commands/gsd/audit-uat.md +0 -24
  101. package/commands/gsd/docs-update.md +0 -48
  102. package/commands/gsd/eval-review.md +0 -32
  103. package/commands/gsd/explore.md +0 -27
  104. package/commands/gsd/extract_learnings.md +0 -22
  105. package/commands/gsd/forensics.md +0 -56
  106. package/commands/gsd/from-gsd2.md +0 -47
  107. package/commands/gsd/graphify.md +0 -201
  108. package/commands/gsd/import.md +0 -37
  109. package/commands/gsd/inbox.md +0 -38
  110. package/commands/gsd/ingest-docs.md +0 -42
  111. package/commands/gsd/intel.md +0 -179
  112. package/commands/gsd/join-discord.md +0 -19
  113. package/commands/gsd/list-phase-assumptions.md +0 -46
  114. package/commands/gsd/list-workspaces.md +0 -19
  115. package/commands/gsd/manager.md +0 -40
  116. package/commands/gsd/milestone-summary.md +0 -51
  117. package/commands/gsd/new-workspace.md +0 -44
  118. package/commands/gsd/plan-milestone-gaps.md +0 -34
  119. package/commands/gsd/plan-review-convergence.md +0 -52
  120. package/commands/gsd/plant-seed.md +0 -28
  121. package/commands/gsd/profile-user.md +0 -46
  122. package/commands/gsd/reapply-patches.md +0 -331
  123. package/commands/gsd/remove-workspace.md +0 -26
  124. package/commands/gsd/review.md +0 -40
  125. package/commands/gsd/scan.md +0 -26
  126. package/commands/gsd/secure-phase.md +0 -35
  127. package/commands/gsd/session-report.md +0 -19
  128. package/commands/gsd/set-profile.md +0 -12
  129. package/commands/gsd/ship.md +0 -23
  130. package/commands/gsd/sketch-wrap-up.md +0 -31
  131. package/commands/gsd/sketch.md +0 -49
  132. package/commands/gsd/spec-phase.md +0 -62
  133. package/commands/gsd/spike-wrap-up.md +0 -31
  134. package/commands/gsd/spike.md +0 -46
  135. package/commands/gsd/stats.md +0 -18
  136. package/commands/gsd/sync-skills.md +0 -19
  137. package/commands/gsd/thread.md +0 -227
  138. package/commands/gsd/ui-phase.md +0 -34
  139. package/commands/gsd/ui-review.md +0 -32
  140. package/commands/gsd/ultraplan-phase.md +0 -33
  141. package/commands/gsd/update.md +0 -37
  142. package/commands/gsd/validate-phase.md +0 -35
  143. package/commands/gsd/workstreams.md +0 -69
  144. package/get-shit-done/bin/lib/docs.cjs +0 -267
  145. package/get-shit-done/bin/lib/graphify.cjs +0 -494
  146. package/get-shit-done/bin/lib/gsd2-import.cjs +0 -511
  147. package/get-shit-done/bin/lib/intel.cjs +0 -639
  148. package/get-shit-done/bin/lib/profile-output.cjs +0 -1080
  149. package/get-shit-done/bin/lib/profile-pipeline.cjs +0 -539
  150. package/get-shit-done/bin/lib/workstream.cjs +0 -495
  151. package/get-shit-done/references/ai-evals.md +0 -156
  152. package/get-shit-done/references/ai-frameworks.md +0 -186
  153. package/get-shit-done/references/doc-conflict-engine.md +0 -91
  154. package/get-shit-done/references/model-profile-resolution.md +0 -38
  155. package/get-shit-done/references/planner-reviews.md +0 -39
  156. package/get-shit-done/references/sketch-interactivity.md +0 -41
  157. package/get-shit-done/references/sketch-theme-system.md +0 -94
  158. package/get-shit-done/references/sketch-tooling.md +0 -45
  159. package/get-shit-done/references/sketch-variant-patterns.md +0 -81
  160. package/get-shit-done/references/thinking-models-debug.md +0 -44
  161. package/get-shit-done/references/thinking-models-execution.md +0 -50
  162. package/get-shit-done/references/thinking-models-planning.md +0 -62
  163. package/get-shit-done/references/thinking-models-research.md +0 -50
  164. package/get-shit-done/references/thinking-models-verification.md +0 -55
  165. package/get-shit-done/references/thinking-partner.md +0 -96
  166. package/get-shit-done/references/user-profiling.md +0 -681
  167. package/get-shit-done/references/workstream-flag.md +0 -111
  168. package/get-shit-done/templates/AI-SPEC.md +0 -246
  169. package/get-shit-done/templates/SECURITY.md +0 -61
  170. package/get-shit-done/templates/UI-SPEC.md +0 -100
  171. package/get-shit-done/templates/VALIDATION.md +0 -76
  172. package/get-shit-done/templates/dev-preferences.md +0 -21
  173. package/get-shit-done/templates/user-profile.md +0 -146
  174. package/get-shit-done/workflows/ai-integration-phase.md +0 -284
  175. package/get-shit-done/workflows/analyze-dependencies.md +0 -96
  176. package/get-shit-done/workflows/audit-fix.md +0 -175
  177. package/get-shit-done/workflows/audit-milestone.md +0 -340
  178. package/get-shit-done/workflows/audit-uat.md +0 -109
  179. package/get-shit-done/workflows/docs-update.md +0 -1155
  180. package/get-shit-done/workflows/eval-review.md +0 -155
  181. package/get-shit-done/workflows/explore.md +0 -141
  182. package/get-shit-done/workflows/extract_learnings.md +0 -242
  183. package/get-shit-done/workflows/forensics.md +0 -265
  184. package/get-shit-done/workflows/import.md +0 -246
  185. package/get-shit-done/workflows/inbox.md +0 -387
  186. package/get-shit-done/workflows/ingest-docs.md +0 -328
  187. package/get-shit-done/workflows/list-phase-assumptions.md +0 -178
  188. package/get-shit-done/workflows/list-workspaces.md +0 -56
  189. package/get-shit-done/workflows/manager.md +0 -365
  190. package/get-shit-done/workflows/milestone-summary.md +0 -223
  191. package/get-shit-done/workflows/new-workspace.md +0 -239
  192. package/get-shit-done/workflows/plan-milestone-gaps.md +0 -273
  193. package/get-shit-done/workflows/plan-review-convergence.md +0 -254
  194. package/get-shit-done/workflows/plant-seed.md +0 -172
  195. package/get-shit-done/workflows/profile-user.md +0 -452
  196. package/get-shit-done/workflows/remove-workspace.md +0 -92
  197. package/get-shit-done/workflows/review.md +0 -344
  198. package/get-shit-done/workflows/scan.md +0 -102
  199. package/get-shit-done/workflows/secure-phase.md +0 -166
  200. package/get-shit-done/workflows/session-report.md +0 -146
  201. package/get-shit-done/workflows/ship.md +0 -302
  202. package/get-shit-done/workflows/sketch-wrap-up.md +0 -283
  203. package/get-shit-done/workflows/sketch.md +0 -286
  204. package/get-shit-done/workflows/spec-phase.md +0 -262
  205. package/get-shit-done/workflows/spike-wrap-up.md +0 -281
  206. package/get-shit-done/workflows/spike.md +0 -362
  207. package/get-shit-done/workflows/stats.md +0 -60
  208. package/get-shit-done/workflows/sync-skills.md +0 -182
  209. package/get-shit-done/workflows/ui-phase.md +0 -323
  210. package/get-shit-done/workflows/ui-review.md +0 -190
  211. package/get-shit-done/workflows/ultraplan-phase.md +0 -189
  212. package/get-shit-done/workflows/update.md +0 -587
  213. package/get-shit-done/workflows/validate-phase.md +0 -176
  214. package/hooks/dist/gsd-check-update-worker.js +0 -108
  215. package/hooks/dist/gsd-check-update.js +0 -63
  216. package/hooks/gsd-check-update-worker.js +0 -108
  217. package/hooks/gsd-check-update.js +0 -63
  218. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +0 -3
  219. package/sdk/src/query/docs-init.ts +0 -257
  220. package/sdk/src/query/intel.test.ts +0 -90
  221. package/sdk/src/query/intel.ts +0 -404
  222. package/sdk/src/query/profile-extract-messages.ts +0 -247
  223. package/sdk/src/query/profile-output.ts +0 -908
  224. package/sdk/src/query/profile-questionnaire-data.ts +0 -181
  225. package/sdk/src/query/profile-sample.ts +0 -184
  226. package/sdk/src/query/profile-scan-sessions.ts +0 -174
  227. package/sdk/src/query/workspace.test.ts +0 -119
  228. package/sdk/src/query/workspace.ts +0 -131
  229. package/sdk/src/query/workstream.test.ts +0 -51
  230. package/sdk/src/query/workstream.ts +0 -434
package/bin/install.js CHANGED
@@ -4295,7 +4295,7 @@ function copyWithPathReplacement(srcDir, destDir, pathPrefix, runtime, isCommand
4295
4295
  }
4296
4296
  }
4297
4297
 
4298
- function copySdkBundleToRuntime(srcRoot, gsdRuntimeDir) {
4298
+ function copySdkBundleToRuntime(srcRoot, gsdRuntimeDir, runtime, pathPrefix, isGlobal) {
4299
4299
  const sdkSrc = path.join(srcRoot, 'sdk');
4300
4300
  const sdkDest = path.join(gsdRuntimeDir, 'sdk');
4301
4301
  const sdkEntries = ['src', 'prompts', 'package.json', 'package-lock.json', 'tsconfig.json'];
@@ -4313,7 +4313,15 @@ function copySdkBundleToRuntime(srcRoot, gsdRuntimeDir) {
4313
4313
  for (const entry of sdkEntries) {
4314
4314
  const source = path.join(sdkSrc, entry);
4315
4315
  if (!fs.existsSync(source)) continue;
4316
- fs.cpSync(source, path.join(sdkDest, entry), { recursive: true });
4316
+ // The prompts/ mirror is markdown that must have Claude references (CLAUDE.md,
4317
+ // .claude/) rewritten for non-Claude runtimes (#2112). Route it through the same
4318
+ // transform used for the rest of the get-shit-done tree. SDK source and manifests
4319
+ // are copied verbatim so the bundled repair source stays a faithful rebuild input.
4320
+ if (entry === 'prompts' && runtime && runtime !== 'claude') {
4321
+ copyWithPathReplacement(source, path.join(sdkDest, entry), pathPrefix, runtime, false, isGlobal);
4322
+ } else {
4323
+ fs.cpSync(source, path.join(sdkDest, entry), { recursive: true });
4324
+ }
4317
4325
  }
4318
4326
 
4319
4327
  return true;
@@ -4801,7 +4809,7 @@ function uninstall(isGlobal, runtime = 'claude') {
4801
4809
  // 4. Remove GSD hooks
4802
4810
  const hooksDir = path.join(targetDir, 'hooks');
4803
4811
  if (fs.existsSync(hooksDir)) {
4804
- const gsdHooks = ['gsd-statusline.js', 'gsd-check-update.js', 'gsd-context-monitor.js', 'gsd-prompt-guard.js', 'gsd-read-guard.js', 'gsd-read-injection-scanner.js', 'gsd-workflow-guard.js', 'gsd-session-state.sh', 'gsd-validate-commit.sh', 'gsd-phase-boundary.sh'];
4812
+ const gsdHooks = ['gsd-statusline.js', 'gsd-context-monitor.js', 'gsd-prompt-guard.js', 'gsd-read-guard.js', 'gsd-read-injection-scanner.js', 'gsd-workflow-guard.js', 'gsd-session-state.sh', 'gsd-validate-commit.sh', 'gsd-phase-boundary.sh'];
4805
4813
  let hookCount = 0;
4806
4814
  for (const hook of gsdHooks) {
4807
4815
  const hookPath = path.join(hooksDir, hook);
@@ -4853,7 +4861,7 @@ function uninstall(isGlobal, runtime = 'claude') {
4853
4861
  // Remove GSD hooks from settings — per-hook granularity to preserve
4854
4862
  // user hooks that share an entry with a GSD hook (#1755 followup)
4855
4863
  const isGsdHookCommand = (cmd) =>
4856
- cmd && (cmd.includes('gsd-check-update') || cmd.includes('gsd-statusline') ||
4864
+ cmd && (cmd.includes('gsd-statusline') ||
4857
4865
  cmd.includes('gsd-session-state') || cmd.includes('gsd-context-monitor') ||
4858
4866
  cmd.includes('gsd-phase-boundary') || cmd.includes('gsd-prompt-guard') ||
4859
4867
  cmd.includes('gsd-read-guard') || cmd.includes('gsd-read-injection-scanner') ||
@@ -5363,9 +5371,9 @@ function writeManifest(configDir, runtime = 'claude') {
5363
5371
 
5364
5372
  /**
5365
5373
  * Detect user-modified GSD files by comparing against install manifest.
5366
- * Backs up modified files to gsd-local-patches/ for reapply after update.
5374
+ * Backs up modified files to gsd-local-patches/ for manual re-merge after reinstall.
5367
5375
  * Also saves pristine copies (from manifest) to gsd-pristine/ to enable
5368
- * three-way merge during reapply-patches (pristine vs user vs new).
5376
+ * a three-way merge (pristine vs user vs new) when re-merging by hand.
5369
5377
  */
5370
5378
  function saveLocalPatches(configDir) {
5371
5379
  const manifestPath = path.join(configDir, MANIFEST_NAME);
@@ -5393,7 +5401,7 @@ function saveLocalPatches(configDir) {
5393
5401
 
5394
5402
  // Save pristine copies of modified files from the CURRENT install (before wipe)
5395
5403
  // These represent the original GSD distribution files that the user then modified.
5396
- // The reapply-patches workflow uses these for three-way merge:
5404
+ // These enable a manual three-way merge after reinstall:
5397
5405
  // pristine (original) → user's version (what they changed) → new version (after update)
5398
5406
  if (modified.length > 0) {
5399
5407
  // We need the pristine originals, but the current files on disk are user-modified.
@@ -5434,13 +5442,6 @@ function reportLocalPatches(configDir, runtime = 'claude') {
5434
5442
  try { meta = JSON.parse(fs.readFileSync(metaPath, 'utf8')); } catch { return []; }
5435
5443
 
5436
5444
  if (meta.files && meta.files.length > 0) {
5437
- const reapplyCommand = (runtime === 'opencode' || runtime === 'kilo' || runtime === 'copilot')
5438
- ? '/gsd-reapply-patches'
5439
- : runtime === 'codex'
5440
- ? '$gsd-reapply-patches'
5441
- : runtime === 'cursor'
5442
- ? 'gsd-reapply-patches (mention the skill name)'
5443
- : '/gsd-reapply-patches';
5444
5445
  console.log('');
5445
5446
  console.log(' ' + yellow + 'Local patches detected' + reset + ' (from v' + meta.from_version + '):');
5446
5447
  for (const f of meta.files) {
@@ -5448,8 +5449,7 @@ function reportLocalPatches(configDir, runtime = 'claude') {
5448
5449
  }
5449
5450
  console.log('');
5450
5451
  console.log(' Your modifications are saved in ' + cyan + PATCHES_DIR_NAME + '/' + reset);
5451
- console.log(' Run ' + cyan + reapplyCommand + reset + ' to merge them into the new version.');
5452
- console.log(' Or manually compare and merge the files.');
5452
+ console.log(' Manually compare and merge the files into the new version.');
5453
5453
  console.log('');
5454
5454
  }
5455
5455
  return meta.files || [];
@@ -5729,7 +5729,7 @@ function install(isGlobal, runtime = 'claude') {
5729
5729
  const skillDest = path.join(targetDir, 'get-shit-done');
5730
5730
  const savedGsdArtifacts = preserveUserArtifacts(skillDest, ['USER-PROFILE.md']);
5731
5731
  copyWithPathReplacement(skillSrc, skillDest, pathPrefix, runtime, false, isGlobal);
5732
- const copiedSdkBundle = copySdkBundleToRuntime(src, skillDest);
5732
+ const copiedSdkBundle = copySdkBundleToRuntime(src, skillDest, runtime, pathPrefix, isGlobal);
5733
5733
  restoreUserArtifacts(skillDest, savedGsdArtifacts);
5734
5734
  if (verifyInstalled(skillDest, 'get-shit-done')) {
5735
5735
  console.log(` ${green}✓${reset} Installed get-shit-done`);
@@ -5896,8 +5896,8 @@ function install(isGlobal, runtime = 'claude') {
5896
5896
  // Ensure hook files are executable (fixes #1162 — missing +x permission)
5897
5897
  try { fs.chmodSync(destFile, 0o755); } catch (e) { /* Windows doesn't support chmod */ }
5898
5898
  } else {
5899
- // .sh hooks carry a gsd-hook-version header so gsd-check-update.js can
5900
- // detect staleness after updates — stamp the version just like .js hooks.
5899
+ // .sh hooks carry a gsd-hook-version header stamped with the install
5900
+ // version — stamp the version just like .js hooks.
5901
5901
  if (entry.endsWith('.sh')) {
5902
5902
  let content = fs.readFileSync(srcFile, 'utf8');
5903
5903
  content = content.replace(/\{\{GSD_VERSION\}\}/g, pkg.version);
@@ -5924,11 +5924,6 @@ function install(isGlobal, runtime = 'claude') {
5924
5924
  }
5925
5925
  }
5926
5926
 
5927
- // Clear stale update cache so next session re-evaluates hook versions
5928
- // Cache lives at ~/.cache/gsd/ (see hooks/gsd-check-update.js line 35-36)
5929
- const updateCacheFile = path.join(os.homedir(), '.cache', 'gsd', 'gsd-update-check.json');
5930
- try { fs.unlinkSync(updateCacheFile); } catch (e) { /* cache may not exist yet */ }
5931
-
5932
5927
  if (failures.length > 0) {
5933
5928
  console.error(`\n ${yellow}Installation incomplete!${reset} Failed: ${failures.join(', ')}`);
5934
5929
  process.exit(1);
@@ -5996,73 +5991,6 @@ function install(isGlobal, runtime = 'claude') {
5996
5991
  console.log(` ${green}✓${reset} Generated config.toml with ${agentCount} agent roles`);
5997
5992
  console.log(` ${green}✓${reset} Generated ${agentCount} agent .toml config files`);
5998
5993
 
5999
- // Copy hook files that are referenced in config.toml (#2153)
6000
- // The main hook-copy block is gated to non-Codex runtimes, but Codex registers
6001
- // gsd-check-update.js in config.toml — the file must physically exist.
6002
- const codexHooksSrc = path.join(src, 'hooks', 'dist');
6003
- if (fs.existsSync(codexHooksSrc)) {
6004
- const codexHooksDest = path.join(targetDir, 'hooks');
6005
- fs.mkdirSync(codexHooksDest, { recursive: true });
6006
- const configDirReplacement = getConfigDirFromHome(runtime, isGlobal);
6007
- for (const entry of fs.readdirSync(codexHooksSrc)) {
6008
- const srcFile = path.join(codexHooksSrc, entry);
6009
- if (!fs.statSync(srcFile).isFile()) continue;
6010
- const destFile = path.join(codexHooksDest, entry);
6011
- if (entry.endsWith('.js')) {
6012
- let content = fs.readFileSync(srcFile, 'utf8');
6013
- content = content.replace(/'\.claude'/g, configDirReplacement);
6014
- content = content.replace(/\/\.claude\//g, `/${getDirName(runtime)}/`);
6015
- content = content.replace(/\.claude\//g, `${getDirName(runtime)}/`);
6016
- content = content.replace(/\{\{GSD_VERSION\}\}/g, pkg.version);
6017
- fs.writeFileSync(destFile, content);
6018
- try { fs.chmodSync(destFile, 0o755); } catch (e) { /* Windows */ }
6019
- } else {
6020
- if (entry.endsWith('.sh')) {
6021
- let content = fs.readFileSync(srcFile, 'utf8');
6022
- content = content.replace(/\{\{GSD_VERSION\}\}/g, pkg.version);
6023
- fs.writeFileSync(destFile, content);
6024
- try { fs.chmodSync(destFile, 0o755); } catch (e) { /* Windows */ }
6025
- } else {
6026
- fs.copyFileSync(srcFile, destFile);
6027
- }
6028
- }
6029
- }
6030
- console.log(` ${green}✓${reset} Installed hooks`);
6031
- }
6032
-
6033
- // Add Codex hooks (SessionStart for update checking) — requires codex_hooks feature flag
6034
- const configPath = path.join(targetDir, 'config.toml');
6035
- try {
6036
- let configContent = fs.existsSync(configPath) ? fs.readFileSync(configPath, 'utf-8') : '';
6037
- const eol = detectLineEnding(configContent);
6038
- const codexHooksFeature = ensureCodexHooksFeature(configContent);
6039
- configContent = setManagedCodexHooksOwnership(codexHooksFeature.content, codexHooksFeature.ownership);
6040
-
6041
- // Add SessionStart hook for update checking
6042
- const updateCheckScript = path.resolve(targetDir, 'hooks', 'gsd-check-update.js').replace(/\\/g, '/');
6043
- const hookBlock =
6044
- `${eol}# GSD Hooks${eol}` +
6045
- `[[hooks]]${eol}` +
6046
- `event = "SessionStart"${eol}` +
6047
- `command = "node ${updateCheckScript}"${eol}`;
6048
-
6049
- // Migrate legacy gsd-update-check entries from prior installs (#1755 followup)
6050
- // Remove stale hook blocks that used the inverted filename or wrong path
6051
- if (configContent.includes('gsd-update-check')) {
6052
- configContent = configContent.replace(/\n# GSD Hooks\n\[\[hooks\]\]\nevent = "SessionStart"\ncommand = "node [^\n]*gsd-update-check\.js"\n/g, '\n');
6053
- configContent = configContent.replace(/\r\n# GSD Hooks\r\n\[\[hooks\]\]\r\nevent = "SessionStart"\r\ncommand = "node [^\r\n]*gsd-update-check\.js"\r\n/g, '\r\n');
6054
- }
6055
-
6056
- if (hasEnabledCodexHooksFeature(configContent) && !configContent.includes('gsd-check-update')) {
6057
- configContent += hookBlock;
6058
- }
6059
-
6060
- fs.writeFileSync(configPath, configContent, 'utf-8');
6061
- console.log(` ${green}✓${reset} Configured Codex hooks (SessionStart)`);
6062
- } catch (e) {
6063
- console.warn(` ${yellow}⚠${reset} Could not configure Codex hooks: ${e.message}`);
6064
- }
6065
-
6066
5994
  return { settingsPath: null, settings: null, statuslineCommand: null, runtime, configDir: targetDir };
6067
5995
  }
6068
5996
 
@@ -6131,9 +6059,6 @@ function install(isGlobal, runtime = 'claude') {
6131
6059
  const statuslineCommand = isGlobal
6132
6060
  ? buildHookCommand(targetDir, 'gsd-statusline.js', hookOpts)
6133
6061
  : 'node ' + localPrefix + '/hooks/gsd-statusline.js';
6134
- const updateCheckCommand = isGlobal
6135
- ? buildHookCommand(targetDir, 'gsd-check-update.js', hookOpts)
6136
- : 'node ' + localPrefix + '/hooks/gsd-check-update.js';
6137
6062
  const contextMonitorCommand = isGlobal
6138
6063
  ? buildHookCommand(targetDir, 'gsd-context-monitor.js', hookOpts)
6139
6064
  : 'node ' + localPrefix + '/hooks/gsd-context-monitor.js';
@@ -6158,7 +6083,7 @@ function install(isGlobal, runtime = 'claude') {
6158
6083
  }
6159
6084
  }
6160
6085
 
6161
- // Configure SessionStart hook for update checking (skip for opencode)
6086
+ // Configure GSD hooks (skip for opencode)
6162
6087
  if (!isOpencode && !isKilo) {
6163
6088
  if (!settings.hooks) {
6164
6089
  settings.hooks = {};
@@ -6167,29 +6092,6 @@ function install(isGlobal, runtime = 'claude') {
6167
6092
  settings.hooks.SessionStart = [];
6168
6093
  }
6169
6094
 
6170
- const hasGsdUpdateHook = settings.hooks.SessionStart.some(entry =>
6171
- entry.hooks && entry.hooks.some(h => h.command && h.command.includes('gsd-check-update'))
6172
- );
6173
-
6174
- // Guard: only register if the hook file was actually installed (#1754).
6175
- // When hooks/dist/ is missing from the npm package (as in v1.32.0), the
6176
- // copy step produces no files but the registration step ran unconditionally,
6177
- // causing "hook error" on every tool invocation.
6178
- const checkUpdateFile = path.join(targetDir, 'hooks', 'gsd-check-update.js');
6179
- if (!hasGsdUpdateHook && fs.existsSync(checkUpdateFile)) {
6180
- settings.hooks.SessionStart.push({
6181
- hooks: [
6182
- {
6183
- type: 'command',
6184
- command: updateCheckCommand
6185
- }
6186
- ]
6187
- });
6188
- console.log(` ${green}✓${reset} Configured update check hook`);
6189
- } else if (!hasGsdUpdateHook && !fs.existsSync(checkUpdateFile)) {
6190
- console.warn(` ${yellow}⚠${reset} Skipped update check hook — gsd-check-update.js not found at target`);
6191
- }
6192
-
6193
6095
  // Configure post-tool hook for context window monitoring
6194
6096
  if (!settings.hooks[postToolEvent]) {
6195
6097
  settings.hooks[postToolEvent] = [];
@@ -39,28 +39,6 @@ Output: Milestone archived (roadmap + requirements), PROJECT.md evolved, git tag
39
39
 
40
40
  **Follow complete-milestone.md workflow:**
41
41
 
42
- 0. **Check for audit:**
43
-
44
- - Look for `.planning/v{{version}}-MILESTONE-AUDIT.md`
45
- - If missing or stale: recommend `/gsd-audit-milestone` first
46
- - If audit status is `gaps_found`: recommend `/gsd-plan-milestone-gaps` first
47
- - If audit status is `passed`: proceed to step 1
48
-
49
- ```markdown
50
- ## Pre-flight Check
51
-
52
- {If no v{{version}}-MILESTONE-AUDIT.md:}
53
- ⚠ No milestone audit found. Run `/gsd-audit-milestone` first to verify
54
- requirements coverage, cross-phase integration, and E2E flows.
55
-
56
- {If audit has gaps:}
57
- ⚠ Milestone audit found gaps. Run `/gsd-plan-milestone-gaps` to create
58
- phases that close the gaps, or proceed anyway to accept as tech debt.
59
-
60
- {If audit passed:}
61
- ✓ Milestone audit passed. Proceeding with completion.
62
- ```
63
-
64
42
  1. **Verify readiness:**
65
43
 
66
44
  - Check all phases in milestone have completed plans (SUMMARY.md exists)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: gsd:plan-phase
3
3
  description: Create detailed phase plan (PLAN.md) with verification loop
4
- argument-hint: "[phase] [--auto] [--research] [--skip-research] [--gaps] [--skip-verify] [--prd <file>] [--reviews] [--text] [--tdd]"
4
+ argument-hint: "[phase] [--auto] [--research] [--skip-research] [--gaps] [--skip-verify] [--prd <file>] [--text] [--tdd]"
5
5
  agent: gsd-planner
6
6
  allowed-tools:
7
7
  - Read
@@ -40,7 +40,6 @@ Phase number: $ARGUMENTS (optional — auto-detects next unplanned phase if omit
40
40
  - `--gaps` — Gap closure mode (reads VERIFICATION.md, skips research)
41
41
  - `--skip-verify` — Skip verification loop
42
42
  - `--prd <file>` — Use a PRD/acceptance criteria file instead of discuss-phase. Parses requirements into CONTEXT.md automatically. Skips discuss-phase entirely.
43
- - `--reviews` — Replan incorporating cross-AI review feedback from REVIEWS.md (produced by `/gsd-review`)
44
43
  - `--text` — Use plain-text numbered lists instead of TUI menus (required for `/rc` remote sessions)
45
44
 
46
45
  Normalize phase input in step 2 before any directory lookups.
@@ -78,15 +78,6 @@
78
78
  * Open Artifact Audit:
79
79
  * audit-open [--json] Scan all .planning/ artifact types for unresolved items
80
80
  *
81
- * Intel:
82
- * intel query <term> Query intel files for a term
83
- * intel status Show intel file freshness
84
- * intel update Trigger intel refresh (returns agent spawn hint)
85
- * intel diff Show changed intel entries since last snapshot
86
- * intel snapshot Save current intel state as diff baseline
87
- * intel patch-meta <file> Update _meta.updated_at in an intel file
88
- * intel validate Validate intel file structure
89
- * intel extract-exports <file> Extract exported symbols from a source file
90
81
  *
91
82
  * Scaffolding:
92
83
  * scaffold context --phase <N> Create CONTEXT.md template
@@ -154,7 +145,6 @@
154
145
  * init progress All context for progress workflow
155
146
  *
156
147
  * Documentation:
157
- * docs-init Project context for docs-update workflow
158
148
  *
159
149
  * Learnings:
160
150
  * learnings list List all global learnings (JSON)
@@ -162,10 +152,6 @@
162
152
  * learnings copy Copy from current project's LEARNINGS.md
163
153
  * learnings prune --older-than <dur> Remove entries older than duration (e.g. 90d)
164
154
  * learnings delete <id> Delete a learning by ID
165
- *
166
- * GSD-2 Migration:
167
- * from-gsd2 [--path <dir>] [--force] [--dry-run]
168
- * Import a GSD-2 (.gsd/) project back to GSD v1 (.planning/) format
169
155
  */
170
156
 
171
157
  const fs = require('fs');
@@ -182,10 +168,7 @@ const milestone = require('./lib/milestone.cjs');
182
168
  const commands = require('./lib/commands.cjs');
183
169
  const init = require('./lib/init.cjs');
184
170
  const frontmatter = require('./lib/frontmatter.cjs');
185
- const profilePipeline = require('./lib/profile-pipeline.cjs');
186
- const profileOutput = require('./lib/profile-output.cjs');
187
- const workstream = require('./lib/workstream.cjs');
188
- const docs = require('./lib/docs.cjs');
171
+ const claudeMd = require('./lib/claude-md.cjs');
189
172
  const learnings = require('./lib/learnings.cjs');
190
173
 
191
174
  // ─── Arg parsing helpers ──────────────────────────────────────────────────────
@@ -320,7 +303,7 @@ async function main() {
320
303
  const command = args[0];
321
304
 
322
305
  if (!command) {
323
- error('Usage: gsd-tools <command> [args] [--raw] [--pick <field>] [--cwd <path>] [--ws <name>]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, config-new-project, init, workstream, docs-init');
306
+ error('Usage: gsd-tools <command> [args] [--raw] [--pick <field>] [--cwd <path>] [--ws <name>]\nCommands: state, resolve-model, find-phase, commit, verify-summary, verify, frontmatter, template, generate-slug, current-timestamp, list-todos, verify-path-exists, config-ensure-section, config-new-project, init');
324
307
  }
325
308
 
326
309
  // Reject flags that are never valid for any gsd-tools command. AI agents
@@ -887,17 +870,8 @@ async function runCommand(command, args, cwd, raw, defaultValue) {
887
870
  case 'manager':
888
871
  init.cmdInitManager(cwd, raw);
889
872
  break;
890
- case 'new-workspace':
891
- init.cmdInitNewWorkspace(cwd, raw);
892
- break;
893
- case 'list-workspaces':
894
- init.cmdInitListWorkspaces(cwd, raw);
895
- break;
896
- case 'remove-workspace':
897
- init.cmdInitRemoveWorkspace(cwd, args[2], raw);
898
- break;
899
873
  default:
900
- error(`Unknown init workflow: ${workflow}\nAvailable: execute-phase, plan-phase, new-project, new-milestone, quick, resume, verify-work, phase-op, todos, milestone-op, map-codebase, progress, manager, new-workspace, list-workspaces, remove-workspace`);
874
+ error(`Unknown init workflow: ${workflow}\nAvailable: execute-phase, plan-phase, new-project, new-milestone, quick, resume, verify-work, phase-op, todos, milestone-op, map-codebase, progress, manager`);
901
875
  }
902
876
  break;
903
877
  }
@@ -931,199 +905,14 @@ async function runCommand(command, args, cwd, raw, defaultValue) {
931
905
  break;
932
906
  }
933
907
 
934
- // ─── Profiling Pipeline ────────────────────────────────────────────────
935
-
936
- case 'scan-sessions': {
937
- const pathIdx = args.indexOf('--path');
938
- const sessionsPath = pathIdx !== -1 ? args[pathIdx + 1] : null;
939
- const verboseFlag = args.includes('--verbose');
940
- const jsonFlag = args.includes('--json');
941
- await profilePipeline.cmdScanSessions(sessionsPath, { verbose: verboseFlag, json: jsonFlag }, raw);
942
- break;
943
- }
944
-
945
- case 'extract-messages': {
946
- const sessionIdx = args.indexOf('--session');
947
- const sessionId = sessionIdx !== -1 ? args[sessionIdx + 1] : null;
948
- const limitIdx = args.indexOf('--limit');
949
- const limit = limitIdx !== -1 ? parseInt(args[limitIdx + 1], 10) : null;
950
- const pathIdx = args.indexOf('--path');
951
- const sessionsPath = pathIdx !== -1 ? args[pathIdx + 1] : null;
952
- const projectArg = args[1];
953
- if (!projectArg || projectArg.startsWith('--')) {
954
- error('Usage: gsd-tools extract-messages <project> [--session <id>] [--limit N] [--path <dir>]\nRun scan-sessions first to see available projects.');
955
- }
956
- await profilePipeline.cmdExtractMessages(projectArg, { sessionId, limit }, raw, sessionsPath);
957
- break;
958
- }
959
-
960
- case 'profile-sample': {
961
- const pathIdx = args.indexOf('--path');
962
- const sessionsPath = pathIdx !== -1 ? args[pathIdx + 1] : null;
963
- const limitIdx = args.indexOf('--limit');
964
- const limit = limitIdx !== -1 ? parseInt(args[limitIdx + 1], 10) : 150;
965
- const maxPerIdx = args.indexOf('--max-per-project');
966
- const maxPerProject = maxPerIdx !== -1 ? parseInt(args[maxPerIdx + 1], 10) : null;
967
- const maxCharsIdx = args.indexOf('--max-chars');
968
- const maxChars = maxCharsIdx !== -1 ? parseInt(args[maxCharsIdx + 1], 10) : 500;
969
- await profilePipeline.cmdProfileSample(sessionsPath, { limit, maxPerProject, maxChars }, raw);
970
- break;
971
- }
972
-
973
- // ─── Profile Output ──────────────────────────────────────────────────
974
-
975
- case 'write-profile': {
976
- const inputIdx = args.indexOf('--input');
977
- const inputPath = inputIdx !== -1 ? args[inputIdx + 1] : null;
978
- if (!inputPath) error('--input <analysis-json-path> is required');
979
- const outputIdx = args.indexOf('--output');
980
- const outputPath = outputIdx !== -1 ? args[outputIdx + 1] : null;
981
- profileOutput.cmdWriteProfile(cwd, { input: inputPath, output: outputPath }, raw);
982
- break;
983
- }
984
-
985
- case 'profile-questionnaire': {
986
- const answersIdx = args.indexOf('--answers');
987
- const answers = answersIdx !== -1 ? args[answersIdx + 1] : null;
988
- profileOutput.cmdProfileQuestionnaire({ answers }, raw);
989
- break;
990
- }
991
-
992
- case 'generate-dev-preferences': {
993
- const analysisIdx = args.indexOf('--analysis');
994
- const analysisPath = analysisIdx !== -1 ? args[analysisIdx + 1] : null;
995
- const outputIdx = args.indexOf('--output');
996
- const outputPath = outputIdx !== -1 ? args[outputIdx + 1] : null;
997
- const stackIdx = args.indexOf('--stack');
998
- const stack = stackIdx !== -1 ? args[stackIdx + 1] : null;
999
- profileOutput.cmdGenerateDevPreferences(cwd, { analysis: analysisPath, output: outputPath, stack }, raw);
1000
- break;
1001
- }
1002
-
1003
- case 'generate-claude-profile': {
1004
- const analysisIdx = args.indexOf('--analysis');
1005
- const analysisPath = analysisIdx !== -1 ? args[analysisIdx + 1] : null;
1006
- const outputIdx = args.indexOf('--output');
1007
- const outputPath = outputIdx !== -1 ? args[outputIdx + 1] : null;
1008
- const globalFlag = args.includes('--global');
1009
- profileOutput.cmdGenerateClaudeProfile(cwd, { analysis: analysisPath, output: outputPath, global: globalFlag }, raw);
1010
- break;
1011
- }
908
+ // ─── CLAUDE.md Generation ─────────────────────────────────────────────
1012
909
 
1013
910
  case 'generate-claude-md': {
1014
911
  const outputIdx = args.indexOf('--output');
1015
912
  const outputPath = outputIdx !== -1 ? args[outputIdx + 1] : null;
1016
913
  const autoFlag = args.includes('--auto');
1017
914
  const forceFlag = args.includes('--force');
1018
- profileOutput.cmdGenerateClaudeMd(cwd, { output: outputPath, auto: autoFlag, force: forceFlag }, raw);
1019
- break;
1020
- }
1021
-
1022
- case 'workstream': {
1023
- const subcommand = args[1];
1024
- if (subcommand === 'create') {
1025
- const migrateNameIdx = args.indexOf('--migrate-name');
1026
- const noMigrate = args.includes('--no-migrate');
1027
- workstream.cmdWorkstreamCreate(cwd, args[2], {
1028
- migrate: !noMigrate,
1029
- migrateName: migrateNameIdx !== -1 ? args[migrateNameIdx + 1] : null,
1030
- }, raw);
1031
- } else if (subcommand === 'list') {
1032
- workstream.cmdWorkstreamList(cwd, raw);
1033
- } else if (subcommand === 'status') {
1034
- workstream.cmdWorkstreamStatus(cwd, args[2], raw);
1035
- } else if (subcommand === 'complete') {
1036
- workstream.cmdWorkstreamComplete(cwd, args[2], {}, raw);
1037
- } else if (subcommand === 'set') {
1038
- workstream.cmdWorkstreamSet(cwd, args[2], raw);
1039
- } else if (subcommand === 'get') {
1040
- workstream.cmdWorkstreamGet(cwd, raw);
1041
- } else if (subcommand === 'progress') {
1042
- workstream.cmdWorkstreamProgress(cwd, raw);
1043
- } else {
1044
- error('Unknown workstream subcommand. Available: create, list, status, complete, set, get, progress');
1045
- }
1046
- break;
1047
- }
1048
-
1049
- // ─── Intel ────────────────────────────────────────────────────────────
1050
-
1051
- case 'intel': {
1052
- const intel = require('./lib/intel.cjs');
1053
- const subcommand = args[1];
1054
- if (subcommand === 'query') {
1055
- const term = args[2];
1056
- if (!term) error('Usage: gsd-tools intel query <term>');
1057
- const planningDir = path.join(cwd, '.planning');
1058
- core.output(intel.intelQuery(term, planningDir), raw);
1059
- } else if (subcommand === 'status') {
1060
- const planningDir = path.join(cwd, '.planning');
1061
- const status = intel.intelStatus(planningDir);
1062
- if (!raw && status.files) {
1063
- for (const file of Object.values(status.files)) {
1064
- if (file.updated_at) {
1065
- file.updated_at = core.timeAgo(new Date(file.updated_at));
1066
- }
1067
- }
1068
- }
1069
- core.output(status, raw);
1070
- } else if (subcommand === 'diff') {
1071
- const planningDir = path.join(cwd, '.planning');
1072
- core.output(intel.intelDiff(planningDir), raw);
1073
- } else if (subcommand === 'snapshot') {
1074
- const planningDir = path.join(cwd, '.planning');
1075
- core.output(intel.intelSnapshot(planningDir), raw);
1076
- } else if (subcommand === 'patch-meta') {
1077
- const filePath = args[2];
1078
- if (!filePath) error('Usage: gsd-tools intel patch-meta <file-path>');
1079
- core.output(intel.intelPatchMeta(path.resolve(cwd, filePath)), raw);
1080
- } else if (subcommand === 'validate') {
1081
- const planningDir = path.join(cwd, '.planning');
1082
- core.output(intel.intelValidate(planningDir), raw);
1083
- } else if (subcommand === 'extract-exports') {
1084
- const filePath = args[2];
1085
- if (!filePath) error('Usage: gsd-tools intel extract-exports <file-path>');
1086
- core.output(intel.intelExtractExports(path.resolve(cwd, filePath)), raw);
1087
- } else if (subcommand === 'update') {
1088
- const planningDir = path.join(cwd, '.planning');
1089
- core.output(intel.intelUpdate(planningDir), raw);
1090
- } else {
1091
- error('Unknown intel subcommand. Available: query, status, update, diff, snapshot, patch-meta, validate, extract-exports');
1092
- }
1093
- break;
1094
- }
1095
-
1096
- // ─── Graphify ──────────────────────────────────────────────────────────
1097
-
1098
- case 'graphify': {
1099
- const graphify = require('./lib/graphify.cjs');
1100
- const subcommand = args[1];
1101
- if (subcommand === 'query') {
1102
- const term = args[2];
1103
- if (!term) error('Usage: gsd-tools graphify query <term>');
1104
- const budgetIdx = args.indexOf('--budget');
1105
- const budget = budgetIdx !== -1 ? parseInt(args[budgetIdx + 1], 10) : null;
1106
- core.output(graphify.graphifyQuery(cwd, term, { budget }), raw);
1107
- } else if (subcommand === 'status') {
1108
- core.output(graphify.graphifyStatus(cwd), raw);
1109
- } else if (subcommand === 'diff') {
1110
- core.output(graphify.graphifyDiff(cwd), raw);
1111
- } else if (subcommand === 'build') {
1112
- if (args[2] === 'snapshot') {
1113
- core.output(graphify.writeSnapshot(cwd), raw);
1114
- } else {
1115
- core.output(graphify.graphifyBuild(cwd), raw);
1116
- }
1117
- } else {
1118
- error('Unknown graphify subcommand. Available: build, query, status, diff');
1119
- }
1120
- break;
1121
- }
1122
-
1123
- // ─── Documentation ────────────────────────────────────────────────────
1124
-
1125
- case 'docs-init': {
1126
- docs.cmdDocsInit(cwd, raw);
915
+ claudeMd.cmdGenerateClaudeMd(cwd, { output: outputPath, auto: autoFlag, force: forceFlag }, raw);
1127
916
  break;
1128
917
  }
1129
918
 
@@ -1247,14 +1036,6 @@ async function runCommand(command, args, cwd, raw, defaultValue) {
1247
1036
  break;
1248
1037
  }
1249
1038
 
1250
- // ─── GSD-2 Reverse Migration ───────────────────────────────────────────
1251
-
1252
- case 'from-gsd2': {
1253
- const gsd2Import = require('./lib/gsd2-import.cjs');
1254
- gsd2Import.cmdFromGsd2(args.slice(1), cwd, raw);
1255
- break;
1256
- }
1257
-
1258
1039
  default:
1259
1040
  error(`Unknown command: ${command}`);
1260
1041
  }