gsd-antigravity-kit 2.0.0 → 2.1.0

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 (258) hide show
  1. package/.agent/skills/gsd/SKILL.md +26 -4
  2. package/.agent/skills/gsd/VERSION +1 -1
  3. package/.agent/skills/gsd/assets/templates/AI-SPEC.md +246 -0
  4. package/.agent/skills/gsd/assets/templates/DEBUG.md +7 -2
  5. package/.agent/skills/gsd/assets/templates/config.json +56 -48
  6. package/.agent/skills/gsd/assets/templates/research.md +40 -0
  7. package/.agent/skills/gsd/assets/templates/spec.md +307 -0
  8. package/.agent/skills/gsd/assets/templates/state.md +8 -0
  9. package/.agent/skills/gsd/bin/gsd-tools.cjs +212 -11
  10. package/.agent/skills/gsd/bin/help-manifest.json +8 -2
  11. package/.agent/skills/gsd/bin/hooks/gsd-check-update-worker.js +108 -0
  12. package/.agent/skills/gsd/bin/hooks/gsd-check-update.js +14 -89
  13. package/.agent/skills/gsd/bin/hooks/gsd-context-monitor.js +34 -5
  14. package/.agent/skills/gsd/bin/hooks/gsd-phase-boundary.sh +1 -0
  15. package/.agent/skills/gsd/bin/hooks/gsd-prompt-guard.js +1 -1
  16. package/.agent/skills/gsd/bin/hooks/gsd-read-guard.js +6 -1
  17. package/.agent/skills/gsd/bin/hooks/gsd-session-state.sh +1 -0
  18. package/.agent/skills/gsd/bin/hooks/gsd-statusline.js +150 -16
  19. package/.agent/skills/gsd/bin/hooks/gsd-validate-commit.sh +1 -0
  20. package/.agent/skills/gsd/bin/hooks/gsd-workflow-guard.js +1 -1
  21. package/.agent/skills/gsd/bin/lib/audit.cjs +757 -0
  22. package/.agent/skills/gsd/bin/lib/commands.cjs +17 -7
  23. package/.agent/skills/gsd/bin/lib/config.cjs +66 -20
  24. package/.agent/skills/gsd/bin/lib/core.cjs +212 -12
  25. package/.agent/skills/gsd/bin/lib/frontmatter.cjs +6 -8
  26. package/.agent/skills/gsd/bin/lib/graphify.cjs +494 -0
  27. package/.agent/skills/gsd/bin/lib/gsd2-import.cjs +511 -0
  28. package/.agent/skills/gsd/bin/lib/init.cjs +371 -18
  29. package/.agent/skills/gsd/bin/lib/intel.cjs +9 -30
  30. package/.agent/skills/gsd/bin/lib/milestone.cjs +18 -17
  31. package/.agent/skills/gsd/bin/lib/model-profiles.cjs +1 -0
  32. package/.agent/skills/gsd/bin/lib/phase.cjs +225 -98
  33. package/.agent/skills/gsd/bin/lib/profile-output.cjs +17 -5
  34. package/.agent/skills/gsd/bin/lib/roadmap.cjs +12 -5
  35. package/.agent/skills/gsd/bin/lib/state.cjs +394 -129
  36. package/.agent/skills/gsd/bin/lib/template.cjs +8 -4
  37. package/.agent/skills/gsd/bin/lib/uat.cjs +2 -1
  38. package/.agent/skills/gsd/bin/lib/verify.cjs +111 -42
  39. package/.agent/skills/gsd/migration_report.md +2 -2
  40. package/.agent/skills/gsd/references/agents/gsd-advisor-researcher.md +23 -0
  41. package/.agent/skills/gsd/references/agents/gsd-ai-researcher.md +133 -0
  42. package/.agent/skills/gsd/references/agents/gsd-code-fixer.md +11 -10
  43. package/.agent/skills/gsd/references/agents/gsd-code-reviewer.md +2 -2
  44. package/.agent/skills/gsd/references/agents/gsd-codebase-mapper.md +13 -2
  45. package/.agent/skills/gsd/references/agents/gsd-debug-session-manager.md +314 -0
  46. package/.agent/skills/gsd/references/agents/gsd-debugger.md +147 -76
  47. package/.agent/skills/gsd/references/agents/gsd-doc-verifier.md +1 -1
  48. package/.agent/skills/gsd/references/agents/gsd-doc-writer.md +615 -602
  49. package/.agent/skills/gsd/references/agents/gsd-domain-researcher.md +153 -0
  50. package/.agent/skills/gsd/references/agents/gsd-eval-auditor.md +175 -0
  51. package/.agent/skills/gsd/references/agents/gsd-eval-planner.md +154 -0
  52. package/.agent/skills/gsd/references/agents/gsd-executor.md +108 -38
  53. package/.agent/skills/gsd/references/agents/gsd-framework-selector.md +160 -0
  54. package/.agent/skills/gsd/references/agents/gsd-integration-checker.md +454 -443
  55. package/.agent/skills/gsd/references/agents/gsd-intel-updater.md +40 -20
  56. package/.agent/skills/gsd/references/agents/gsd-nyquist-auditor.md +187 -176
  57. package/.agent/skills/gsd/references/agents/gsd-pattern-mapper.md +335 -0
  58. package/.agent/skills/gsd/references/agents/gsd-phase-researcher.md +112 -13
  59. package/.agent/skills/gsd/references/agents/gsd-plan-checker.md +104 -10
  60. package/.agent/skills/gsd/references/agents/gsd-planner.md +125 -167
  61. package/.agent/skills/gsd/references/agents/gsd-project-researcher.md +25 -2
  62. package/.agent/skills/gsd/references/agents/gsd-research-synthesizer.md +3 -3
  63. package/.agent/skills/gsd/references/agents/gsd-roadmapper.md +12 -1
  64. package/.agent/skills/gsd/references/agents/gsd-security-auditor.md +139 -128
  65. package/.agent/skills/gsd/references/agents/gsd-ui-auditor.md +3 -3
  66. package/.agent/skills/gsd/references/agents/gsd-ui-checker.md +11 -2
  67. package/.agent/skills/gsd/references/agents/gsd-ui-researcher.md +27 -4
  68. package/.agent/skills/gsd/references/agents/gsd-verifier.md +13 -19
  69. package/.agent/skills/gsd/references/commands/atomic/add-todo.md +2 -2
  70. package/.agent/skills/gsd/references/commands/atomic/check-todos.md +2 -2
  71. package/.agent/skills/gsd/references/commands/atomic/cleanup.md +2 -2
  72. package/.agent/skills/gsd/references/commands/atomic/do.md +2 -2
  73. package/.agent/skills/gsd/references/commands/atomic/help.md +2 -2
  74. package/.agent/skills/gsd/references/commands/atomic/join-discord.md +2 -2
  75. package/.agent/skills/gsd/references/commands/atomic/note.md +2 -2
  76. package/.agent/skills/gsd/references/commands/atomic/session-report.md +2 -2
  77. package/.agent/skills/gsd/references/commands/atomic/ship.md +2 -2
  78. package/.agent/skills/gsd/references/commands/atomic/stats.md +2 -2
  79. package/.agent/skills/gsd/references/commands/atomic/thread.md +141 -41
  80. package/.agent/skills/gsd/references/commands/atomic/undo.md +2 -2
  81. package/.agent/skills/gsd/references/commands/milestone/add-backlog.md +15 -12
  82. package/.agent/skills/gsd/references/commands/milestone/audit-milestone.md +2 -2
  83. package/.agent/skills/gsd/references/commands/milestone/complete-milestone.md +2 -2
  84. package/.agent/skills/gsd/references/commands/milestone/milestone-summary.md +2 -2
  85. package/.agent/skills/gsd/references/commands/milestone/new-milestone.md +2 -2
  86. package/.agent/skills/gsd/references/commands/milestone/plan-milestone-gaps.md +2 -2
  87. package/.agent/skills/gsd/references/commands/milestone/plant-seed.md +2 -2
  88. package/.agent/skills/gsd/references/commands/milestone/review-backlog.md +4 -4
  89. package/.agent/skills/gsd/references/commands/misc/ai-integration-phase.md +38 -0
  90. package/.agent/skills/gsd/references/commands/misc/audit-fix.md +2 -2
  91. package/.agent/skills/gsd/references/commands/misc/audit-uat.md +2 -2
  92. package/.agent/skills/gsd/references/commands/misc/eval-review.md +34 -0
  93. package/.agent/skills/gsd/references/commands/misc/extract_learnings.md +24 -0
  94. package/.agent/skills/gsd/references/commands/misc/from-gsd2.md +49 -0
  95. package/.agent/skills/gsd/references/commands/misc/graphify.md +203 -0
  96. package/.agent/skills/gsd/references/commands/misc/inbox.md +40 -0
  97. package/.agent/skills/gsd/references/commands/misc/next.md +5 -3
  98. package/.agent/skills/gsd/references/commands/misc/progress.md +4 -3
  99. package/.agent/skills/gsd/references/commands/misc/sketch-wrap-up.md +33 -0
  100. package/.agent/skills/gsd/references/commands/misc/sketch.md +47 -0
  101. package/.agent/skills/gsd/references/commands/misc/spec-phase.md +64 -0
  102. package/.agent/skills/gsd/references/commands/misc/spike-wrap-up.md +33 -0
  103. package/.agent/skills/gsd/references/commands/misc/spike.md +43 -0
  104. package/.agent/skills/gsd/references/commands/misc/verify-work.md +2 -2
  105. package/.agent/skills/gsd/references/commands/phase/add-phase.md +2 -2
  106. package/.agent/skills/gsd/references/commands/phase/add-tests.md +2 -2
  107. package/.agent/skills/gsd/references/commands/phase/discuss-phase.md +5 -5
  108. package/.agent/skills/gsd/references/commands/phase/execute-phase.md +4 -4
  109. package/.agent/skills/gsd/references/commands/phase/insert-phase.md +2 -2
  110. package/.agent/skills/gsd/references/commands/phase/list-phase-assumptions.md +2 -2
  111. package/.agent/skills/gsd/references/commands/phase/plan-phase.md +3 -3
  112. package/.agent/skills/gsd/references/commands/phase/remove-phase.md +2 -2
  113. package/.agent/skills/gsd/references/commands/phase/research-phase.md +5 -5
  114. package/.agent/skills/gsd/references/commands/phase/secure-phase.md +2 -2
  115. package/.agent/skills/gsd/references/commands/phase/ui-phase.md +2 -2
  116. package/.agent/skills/gsd/references/commands/phase/ui-review.md +2 -2
  117. package/.agent/skills/gsd/references/commands/phase/validate-phase.md +2 -2
  118. package/.agent/skills/gsd/references/commands/phase/workstreams.md +9 -9
  119. package/.agent/skills/gsd/references/commands/project/analyze-dependencies.md +2 -2
  120. package/.agent/skills/gsd/references/commands/project/explore.md +2 -2
  121. package/.agent/skills/gsd/references/commands/project/import.md +2 -2
  122. package/.agent/skills/gsd/references/commands/project/intel.md +10 -10
  123. package/.agent/skills/gsd/references/commands/project/list-workspaces.md +2 -2
  124. package/.agent/skills/gsd/references/commands/project/map-codebase.md +2 -2
  125. package/.agent/skills/gsd/references/commands/project/new-project.md +2 -2
  126. package/.agent/skills/gsd/references/commands/project/new-workspace.md +2 -2
  127. package/.agent/skills/gsd/references/commands/project/remove-workspace.md +2 -2
  128. package/.agent/skills/gsd/references/commands/project/scan.md +2 -2
  129. package/.agent/skills/gsd/references/commands/system/autonomous.md +4 -3
  130. package/.agent/skills/gsd/references/commands/system/code-review-fix.md +3 -3
  131. package/.agent/skills/gsd/references/commands/system/code-review.md +3 -3
  132. package/.agent/skills/gsd/references/commands/system/debug.md +177 -100
  133. package/.agent/skills/gsd/references/commands/system/docs-update.md +2 -2
  134. package/.agent/skills/gsd/references/commands/system/fast.md +2 -2
  135. package/.agent/skills/gsd/references/commands/system/forensics.md +2 -2
  136. package/.agent/skills/gsd/references/commands/system/gsd-tools.md +153 -6
  137. package/.agent/skills/gsd/references/commands/system/health.md +2 -2
  138. package/.agent/skills/gsd/references/commands/system/manager.md +3 -3
  139. package/.agent/skills/gsd/references/commands/system/pause-work.md +2 -2
  140. package/.agent/skills/gsd/references/commands/system/pr-branch.md +2 -2
  141. package/.agent/skills/gsd/references/commands/system/profile-user.md +2 -2
  142. package/.agent/skills/gsd/references/commands/system/quick.md +127 -3
  143. package/.agent/skills/gsd/references/commands/system/reapply-patches.md +45 -6
  144. package/.agent/skills/gsd/references/commands/system/resume-work.md +2 -2
  145. package/.agent/skills/gsd/references/commands/system/review.md +6 -4
  146. package/.agent/skills/gsd/references/commands/system/set-profile.md +3 -3
  147. package/.agent/skills/gsd/references/commands/system/settings.md +2 -2
  148. package/.agent/skills/gsd/references/commands/system/update.md +2 -2
  149. package/.agent/skills/gsd/references/docs/ai-evals.md +156 -0
  150. package/.agent/skills/gsd/references/docs/ai-frameworks.md +186 -0
  151. package/.agent/skills/gsd/references/docs/artifact-types.md +18 -0
  152. package/.agent/skills/gsd/references/docs/autonomous-smart-discuss.md +277 -0
  153. package/.agent/skills/gsd/references/docs/checkpoints.md +30 -0
  154. package/.agent/skills/gsd/references/docs/common-bug-patterns.md +49 -49
  155. package/.agent/skills/gsd/references/docs/continuation-format.md +11 -7
  156. package/.agent/skills/gsd/references/docs/debugger-philosophy.md +76 -0
  157. package/.agent/skills/gsd/references/docs/decimal-phase-calculation.md +64 -64
  158. package/.agent/skills/gsd/references/docs/executor-examples.md +110 -0
  159. package/.agent/skills/gsd/references/docs/git-integration.md +4 -4
  160. package/.agent/skills/gsd/references/docs/git-planning-commit.md +40 -38
  161. package/.agent/skills/gsd/references/docs/ios-scaffold.md +123 -0
  162. package/.agent/skills/gsd/references/docs/mandatory-initial-read.md +2 -0
  163. package/.agent/skills/gsd/references/docs/phase-argument-parsing.md +61 -61
  164. package/.agent/skills/gsd/references/docs/planner-antipatterns.md +89 -0
  165. package/.agent/skills/gsd/references/docs/planner-revision.md +87 -87
  166. package/.agent/skills/gsd/references/docs/planner-source-audit.md +73 -0
  167. package/.agent/skills/gsd/references/docs/planning-config.md +33 -8
  168. package/.agent/skills/gsd/references/docs/project-skills-discovery.md +19 -0
  169. package/.agent/skills/gsd/references/docs/sketch-interactivity.md +41 -0
  170. package/.agent/skills/gsd/references/docs/sketch-theme-system.md +94 -0
  171. package/.agent/skills/gsd/references/docs/sketch-tooling.md +45 -0
  172. package/.agent/skills/gsd/references/docs/sketch-variant-patterns.md +81 -0
  173. package/.agent/skills/gsd/references/docs/tdd.md +67 -0
  174. package/.agent/skills/gsd/references/docs/universal-anti-patterns.md +5 -0
  175. package/.agent/skills/gsd/references/docs/workstream-flag.md +11 -11
  176. package/.agent/skills/gsd/references/mapping.md +1 -1
  177. package/.agent/skills/gsd/references/workflows/add-phase.md +112 -112
  178. package/.agent/skills/gsd/references/workflows/add-tests.md +6 -3
  179. package/.agent/skills/gsd/references/workflows/add-todo.md +5 -3
  180. package/.agent/skills/gsd/references/workflows/ai-integration-phase.md +284 -0
  181. package/.agent/skills/gsd/references/workflows/audit-fix.md +157 -157
  182. package/.agent/skills/gsd/references/workflows/audit-milestone.md +340 -340
  183. package/.agent/skills/gsd/references/workflows/audit-uat.md +109 -109
  184. package/.agent/skills/gsd/references/workflows/autonomous.md +20 -288
  185. package/.agent/skills/gsd/references/workflows/check-todos.md +4 -2
  186. package/.agent/skills/gsd/references/workflows/cleanup.md +3 -1
  187. package/.agent/skills/gsd/references/workflows/code-review-fix.md +497 -497
  188. package/.agent/skills/gsd/references/workflows/code-review.md +515 -515
  189. package/.agent/skills/gsd/references/workflows/complete-milestone.md +97 -24
  190. package/.agent/skills/gsd/references/workflows/diagnose-issues.md +238 -238
  191. package/.agent/skills/gsd/references/workflows/discovery-phase.md +2 -0
  192. package/.agent/skills/gsd/references/workflows/discuss-phase-assumptions.md +11 -11
  193. package/.agent/skills/gsd/references/workflows/discuss-phase.md +143 -19
  194. package/.agent/skills/gsd/references/workflows/do.md +8 -2
  195. package/.agent/skills/gsd/references/workflows/docs-update.md +5 -3
  196. package/.agent/skills/gsd/references/workflows/eval-review.md +155 -0
  197. package/.agent/skills/gsd/references/workflows/execute-phase.md +338 -54
  198. package/.agent/skills/gsd/references/workflows/execute-plan.md +80 -104
  199. package/.agent/skills/gsd/references/workflows/explore.md +3 -1
  200. package/.agent/skills/gsd/references/workflows/extract_learnings.md +232 -0
  201. package/.agent/skills/gsd/references/workflows/forensics.md +3 -3
  202. package/.agent/skills/gsd/references/workflows/health.md +2 -2
  203. package/.agent/skills/gsd/references/workflows/help.md +59 -1
  204. package/.agent/skills/gsd/references/workflows/import.md +3 -1
  205. package/.agent/skills/gsd/references/workflows/inbox.md +387 -384
  206. package/.agent/skills/gsd/references/workflows/insert-phase.md +130 -130
  207. package/.agent/skills/gsd/references/workflows/list-workspaces.md +56 -56
  208. package/.agent/skills/gsd/references/workflows/manager.md +5 -3
  209. package/.agent/skills/gsd/references/workflows/map-codebase.md +19 -5
  210. package/.agent/skills/gsd/references/workflows/milestone-summary.md +6 -6
  211. package/.agent/skills/gsd/references/workflows/new-milestone.md +63 -9
  212. package/.agent/skills/gsd/references/workflows/new-project.md +126 -22
  213. package/.agent/skills/gsd/references/workflows/new-workspace.md +6 -4
  214. package/.agent/skills/gsd/references/workflows/next.md +220 -153
  215. package/.agent/skills/gsd/references/workflows/note.md +2 -0
  216. package/.agent/skills/gsd/references/workflows/pause-work.md +11 -7
  217. package/.agent/skills/gsd/references/workflows/plan-milestone-gaps.md +273 -273
  218. package/.agent/skills/gsd/references/workflows/plan-phase.md +281 -62
  219. package/.agent/skills/gsd/references/workflows/plant-seed.md +4 -1
  220. package/.agent/skills/gsd/references/workflows/pr-branch.md +41 -13
  221. package/.agent/skills/gsd/references/workflows/profile-user.md +15 -13
  222. package/.agent/skills/gsd/references/workflows/progress.md +133 -21
  223. package/.agent/skills/gsd/references/workflows/quick.md +67 -27
  224. package/.agent/skills/gsd/references/workflows/remove-phase.md +155 -155
  225. package/.agent/skills/gsd/references/workflows/remove-workspace.md +4 -2
  226. package/.agent/skills/gsd/references/workflows/research-phase.md +3 -3
  227. package/.agent/skills/gsd/references/workflows/resume-project.md +3 -3
  228. package/.agent/skills/gsd/references/workflows/review.md +71 -8
  229. package/.agent/skills/gsd/references/workflows/scan.md +102 -102
  230. package/.agent/skills/gsd/references/workflows/secure-phase.md +7 -5
  231. package/.agent/skills/gsd/references/workflows/settings.md +24 -7
  232. package/.agent/skills/gsd/references/workflows/ship.md +71 -6
  233. package/.agent/skills/gsd/references/workflows/sketch-wrap-up.md +283 -0
  234. package/.agent/skills/gsd/references/workflows/sketch.md +263 -0
  235. package/.agent/skills/gsd/references/workflows/spec-phase.md +262 -0
  236. package/.agent/skills/gsd/references/workflows/spike-wrap-up.md +273 -0
  237. package/.agent/skills/gsd/references/workflows/spike.md +270 -0
  238. package/.agent/skills/gsd/references/workflows/stats.md +60 -60
  239. package/.agent/skills/gsd/references/workflows/transition.md +671 -671
  240. package/.agent/skills/gsd/references/workflows/ui-phase.md +33 -12
  241. package/.agent/skills/gsd/references/workflows/ui-review.md +6 -4
  242. package/.agent/skills/gsd/references/workflows/undo.md +3 -1
  243. package/.agent/skills/gsd/references/workflows/update.md +113 -2
  244. package/.agent/skills/gsd/references/workflows/validate-phase.md +7 -5
  245. package/.agent/skills/gsd/references/workflows/verify-phase.md +93 -10
  246. package/.agent/skills/gsd/references/workflows/verify-work.md +50 -10
  247. package/.agent/skills/gsd-converter/references/mapping.md +1 -1
  248. package/.agent/skills/gsd-converter/scripts/convert.py +36 -17
  249. package/.agent/skills/gsd-converter/scripts/regression_test.py +68 -33
  250. package/README.md +3 -2
  251. package/package.json +4 -2
  252. package/.agent/skills/release-manager/SKILL.md +0 -162
  253. package/.agent/skills/release-manager/bin/LICENSE +0 -21
  254. package/.agent/skills/release-manager/bin/gh.exe +0 -0
  255. package/.agent/skills/release-manager/references/update_kb_from_fixes.md +0 -29
  256. package/.agent/skills/release-manager/scripts/release.ps1 +0 -222
  257. package/.agent/skills/selectpaste-update/SKILL.md +0 -46
  258. package/.agent/skills/selectpaste-update/scripts/sync-commands.py +0 -317
@@ -0,0 +1,511 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * gsd2-import — Reverse migration from GSD-2 (.gsd/) to GSD v1 (.planning/)
5
+ *
6
+ * Reads a GSD-2 project directory structure and produces a complete
7
+ * .planning/ artifact tree in GSD v1 format.
8
+ *
9
+ * GSD-2 hierarchy: Milestone → Slice → Task
10
+ * GSD v1 hierarchy: Milestone (in ROADMAP.md) → Phase → Plan
11
+ *
12
+ * Mapping rules:
13
+ * - Slices are numbered sequentially across all milestones (01, 02, …)
14
+ * - Tasks within a slice become plans (01-01, 01-02, …)
15
+ * - Completed slices ([x] in ROADMAP) → [x] phases in ROADMAP.md
16
+ * - Tasks with a SUMMARY file → SUMMARY.md written
17
+ * - Slice RESEARCH.md → phase XX-RESEARCH.md
18
+ */
19
+
20
+ const fs = require('node:fs');
21
+ const path = require('node:path');
22
+
23
+ // ─── Utilities ──────────────────────────────────────────────────────────────
24
+
25
+ function readOptional(filePath) {
26
+ try { return fs.readFileSync(filePath, 'utf8'); } catch { return null; }
27
+ }
28
+
29
+ function zeroPad(n, width = 2) {
30
+ return String(n).padStart(width, '0');
31
+ }
32
+
33
+ function slugify(title) {
34
+ return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
35
+ }
36
+
37
+ // ─── GSD-2 Parser ───────────────────────────────────────────────────────────
38
+
39
+ /**
40
+ * Find the .gsd/ directory starting from a project root.
41
+ * Returns the absolute path or null if not found.
42
+ */
43
+ function findGsd2Root(startPath) {
44
+ if (path.basename(startPath) === '.gsd' && fs.existsSync(startPath)) {
45
+ return startPath;
46
+ }
47
+ const candidate = path.join(startPath, '.gsd');
48
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
49
+ return candidate;
50
+ }
51
+ return null;
52
+ }
53
+
54
+ /**
55
+ * Parse the ## Slices section from a GSD-2 milestone ROADMAP.md.
56
+ * Each slice entry looks like:
57
+ * - [x] **S01: Title** `risk:medium` `depends:[S00]`
58
+ */
59
+ function parseSlicesFromRoadmap(content) {
60
+ const slices = [];
61
+ const sectionMatch = content.match(/## Slices\n([\s\S]*?)(?:\n## |\n# |$)/);
62
+ if (!sectionMatch) return slices;
63
+
64
+ for (const line of sectionMatch[1].split('\n')) {
65
+ const m = line.match(/^- \[([x ])\]\s+\*\*(\w+):\s*([^*]+)\*\*/);
66
+ if (!m) continue;
67
+ slices.push({ done: m[1] === 'x', id: m[2].trim(), title: m[3].trim() });
68
+ }
69
+ return slices;
70
+ }
71
+
72
+ /**
73
+ * Parse the milestone title from the first heading in a GSD-2 ROADMAP.md.
74
+ * Format: # M001: Title
75
+ */
76
+ function parseMilestoneTitle(content) {
77
+ const m = content.match(/^# \w+:\s*(.+)/m);
78
+ return m ? m[1].trim() : null;
79
+ }
80
+
81
+ /**
82
+ * Parse a task title from a GSD-2 T##-PLAN.md.
83
+ * Format: # T01: Title
84
+ */
85
+ function parseTaskTitle(content, fallback) {
86
+ const m = content.match(/^# \w+:\s*(.+)/m);
87
+ return m ? m[1].trim() : fallback;
88
+ }
89
+
90
+ /**
91
+ * Parse the ## Description body from a GSD-2 task plan.
92
+ */
93
+ function parseTaskDescription(content) {
94
+ const m = content.match(/## Description\n+([\s\S]+?)(?:\n## |\n# |$)/);
95
+ return m ? m[1].trim() : '';
96
+ }
97
+
98
+ /**
99
+ * Parse ## Must-Haves items from a GSD-2 task plan.
100
+ */
101
+ function parseTaskMustHaves(content) {
102
+ const m = content.match(/## Must-Haves\n+([\s\S]+?)(?:\n## |\n# |$)/);
103
+ if (!m) return [];
104
+ return m[1].split('\n')
105
+ .map(l => l.match(/^- \[[ x]\]\s*(.+)/))
106
+ .filter(Boolean)
107
+ .map(match => match[1].trim());
108
+ }
109
+
110
+ /**
111
+ * Read all task plan files from a GSD-2 tasks/ directory.
112
+ */
113
+ function readTasksDir(tasksDir) {
114
+ if (!fs.existsSync(tasksDir)) return [];
115
+
116
+ return fs.readdirSync(tasksDir)
117
+ .filter(f => f.endsWith('-PLAN.md'))
118
+ .sort()
119
+ .map(tf => {
120
+ const tid = tf.replace('-PLAN.md', '');
121
+ const plan = readOptional(path.join(tasksDir, tf));
122
+ const summary = readOptional(path.join(tasksDir, `${tid}-SUMMARY.md`));
123
+ return {
124
+ id: tid,
125
+ title: plan ? parseTaskTitle(plan, tid) : tid,
126
+ description: plan ? parseTaskDescription(plan) : '',
127
+ mustHaves: plan ? parseTaskMustHaves(plan) : [],
128
+ plan,
129
+ summary,
130
+ done: !!summary,
131
+ };
132
+ });
133
+ }
134
+
135
+ /**
136
+ * Parse a complete GSD-2 .gsd/ directory into a structured representation.
137
+ */
138
+ function parseGsd2(gsdDir) {
139
+ const data = {
140
+ projectContent: readOptional(path.join(gsdDir, 'PROJECT.md')),
141
+ requirements: readOptional(path.join(gsdDir, 'REQUIREMENTS.md')),
142
+ milestones: [],
143
+ };
144
+
145
+ const milestonesBase = path.join(gsdDir, 'milestones');
146
+ if (!fs.existsSync(milestonesBase)) return data;
147
+
148
+ const milestoneIds = fs.readdirSync(milestonesBase)
149
+ .filter(d => fs.statSync(path.join(milestonesBase, d)).isDirectory())
150
+ .sort();
151
+
152
+ for (const mid of milestoneIds) {
153
+ const mDir = path.join(milestonesBase, mid);
154
+ const roadmapContent = readOptional(path.join(mDir, `${mid}-ROADMAP.md`));
155
+ const slicesDir = path.join(mDir, 'slices');
156
+
157
+ const sliceInfos = roadmapContent ? parseSlicesFromRoadmap(roadmapContent) : [];
158
+
159
+ const slices = sliceInfos.map(info => {
160
+ const sDir = path.join(slicesDir, info.id);
161
+ const hasSDir = fs.existsSync(sDir);
162
+ return {
163
+ id: info.id,
164
+ title: info.title,
165
+ done: info.done,
166
+ plan: hasSDir ? readOptional(path.join(sDir, `${info.id}-PLAN.md`)) : null,
167
+ summary: hasSDir ? readOptional(path.join(sDir, `${info.id}-SUMMARY.md`)) : null,
168
+ research: hasSDir ? readOptional(path.join(sDir, `${info.id}-RESEARCH.md`)) : null,
169
+ context: hasSDir ? readOptional(path.join(sDir, `${info.id}-CONTEXT.md`)) : null,
170
+ tasks: hasSDir ? readTasksDir(path.join(sDir, 'tasks')) : [],
171
+ };
172
+ });
173
+
174
+ data.milestones.push({
175
+ id: mid,
176
+ title: roadmapContent ? (parseMilestoneTitle(roadmapContent) ?? mid) : mid,
177
+ research: readOptional(path.join(mDir, `${mid}-RESEARCH.md`)),
178
+ slices,
179
+ });
180
+ }
181
+
182
+ return data;
183
+ }
184
+
185
+ // ─── Artifact Builders ──────────────────────────────────────────────────────
186
+
187
+ /**
188
+ * Build a GSD v1 PLAN.md from a GSD-2 task.
189
+ */
190
+ function buildPlanMd(task, phasePrefix, planPrefix, phaseSlug, milestoneTitle) {
191
+ const lines = [
192
+ '---',
193
+ `phase: "${phasePrefix}"`,
194
+ `plan: "${planPrefix}"`,
195
+ 'type: "implementation"',
196
+ '---',
197
+ '',
198
+ '<objective>',
199
+ task.title,
200
+ '</objective>',
201
+ '',
202
+ '<context>',
203
+ `Phase: ${phasePrefix} (${phaseSlug}) — Milestone: ${milestoneTitle}`,
204
+ ];
205
+
206
+ if (task.description) {
207
+ lines.push('', task.description);
208
+ }
209
+
210
+ lines.push('</context>');
211
+
212
+ if (task.mustHaves.length > 0) {
213
+ lines.push('', '<must_haves>');
214
+ for (const mh of task.mustHaves) {
215
+ lines.push(`- ${mh}`);
216
+ }
217
+ lines.push('</must_haves>');
218
+ }
219
+
220
+ return lines.join('\n') + '\n';
221
+ }
222
+
223
+ /**
224
+ * Build a GSD v1 SUMMARY.md from a GSD-2 task summary.
225
+ * Strips the GSD-2 frontmatter and preserves the body.
226
+ */
227
+ function buildSummaryMd(task, phasePrefix, planPrefix) {
228
+ const raw = task.summary || '';
229
+ // Strip GSD-2 frontmatter block (--- ... ---) if present
230
+ const bodyMatch = raw.match(/^---[\s\S]*?---\n+([\s\S]*)$/);
231
+ const body = bodyMatch ? bodyMatch[1].trim() : raw.trim();
232
+
233
+ return [
234
+ '---',
235
+ `phase: "${phasePrefix}"`,
236
+ `plan: "${planPrefix}"`,
237
+ '---',
238
+ '',
239
+ body || 'Task completed (migrated from GSD-2).',
240
+ '',
241
+ ].join('\n');
242
+ }
243
+
244
+ /**
245
+ * Build a GSD v1 XX-CONTEXT.md from a GSD-2 slice.
246
+ */
247
+ function buildContextMd(slice, phasePrefix) {
248
+ const lines = [
249
+ `# Phase ${phasePrefix} Context`,
250
+ '',
251
+ `Migrated from GSD-2 slice ${slice.id}: ${slice.title}`,
252
+ ];
253
+
254
+ const extra = slice.context || '';
255
+ if (extra.trim()) {
256
+ lines.push('', extra.trim());
257
+ }
258
+
259
+ return lines.join('\n') + '\n';
260
+ }
261
+
262
+ /**
263
+ * Build the GSD v1 ROADMAP.md with milestone-sectioned format.
264
+ */
265
+ function buildRoadmapMd(milestones, phaseMap) {
266
+ const lines = ['# Roadmap', ''];
267
+
268
+ for (const milestone of milestones) {
269
+ lines.push(`## ${milestone.id}: ${milestone.title}`, '');
270
+ const mPhases = phaseMap.filter(p => p.milestoneId === milestone.id);
271
+ for (const { slice, phaseNum } of mPhases) {
272
+ const prefix = zeroPad(phaseNum);
273
+ const slug = slugify(slice.title);
274
+ const check = slice.done ? 'x' : ' ';
275
+ lines.push(`- [${check}] **Phase ${prefix}: ${slug}** — ${slice.title}`);
276
+ }
277
+ lines.push('');
278
+ }
279
+
280
+ return lines.join('\n');
281
+ }
282
+
283
+ /**
284
+ * Build the GSD v1 STATE.md reflecting the current position in the project.
285
+ */
286
+ function buildStateMd(phaseMap) {
287
+ const currentEntry = phaseMap.find(p => !p.slice.done);
288
+ const totalPhases = phaseMap.length;
289
+ const donePhases = phaseMap.filter(p => p.slice.done).length;
290
+ const pct = totalPhases > 0 ? Math.round((donePhases / totalPhases) * 100) : 0;
291
+
292
+ const currentPhaseNum = currentEntry ? zeroPad(currentEntry.phaseNum) : zeroPad(totalPhases);
293
+ const currentSlug = currentEntry ? slugify(currentEntry.slice.title) : 'complete';
294
+ const status = currentEntry ? 'Ready to plan' : 'All phases complete';
295
+
296
+ const filled = Math.round(pct / 10);
297
+ const bar = `[${'█'.repeat(filled)}${'░'.repeat(10 - filled)}]`;
298
+ const today = new Date().toISOString().split('T')[0];
299
+
300
+ return [
301
+ '# Project State',
302
+ '',
303
+ '## Project Reference',
304
+ '',
305
+ 'See: .planning/PROJECT.md',
306
+ '',
307
+ `**Current focus:** Phase ${currentPhaseNum} (${currentSlug})`,
308
+ '',
309
+ '## Current Position',
310
+ '',
311
+ `Phase: ${currentPhaseNum} of ${zeroPad(totalPhases)} (${currentSlug})`,
312
+ `Status: ${status}`,
313
+ `Last activity: ${today} — Migrated from GSD-2`,
314
+ '',
315
+ `Progress: ${bar} ${pct}%`,
316
+ '',
317
+ '## Accumulated Context',
318
+ '',
319
+ '### Decisions',
320
+ '',
321
+ 'Migrated from GSD-2. Review PROJECT.md for key decisions.',
322
+ '',
323
+ '### Blockers/Concerns',
324
+ '',
325
+ 'None.',
326
+ '',
327
+ '## Session Continuity',
328
+ '',
329
+ `Last session: ${today}`,
330
+ 'Stopped at: Migration from GSD-2 completed',
331
+ 'Resume file: None',
332
+ '',
333
+ ].join('\n');
334
+ }
335
+
336
+ // ─── Transformer ─────────────────────────────────────────────────────────────
337
+
338
+ /**
339
+ * Convert parsed GSD-2 data into a map of relative path → file content.
340
+ * All paths are relative to the .planning/ root.
341
+ */
342
+ function buildPlanningArtifacts(gsd2Data) {
343
+ const artifacts = new Map();
344
+
345
+ // Passthrough files
346
+ artifacts.set('PROJECT.md', gsd2Data.projectContent || '# Project\n\n(Migrated from GSD-2)\n');
347
+ if (gsd2Data.requirements) {
348
+ artifacts.set('REQUIREMENTS.md', gsd2Data.requirements);
349
+ }
350
+
351
+ // Minimal valid v1 config
352
+ artifacts.set('config.json', JSON.stringify({ version: 1 }, null, 2) + '\n');
353
+
354
+ // Build sequential phase map: flatten Milestones → Slices into numbered phases
355
+ const phaseMap = [];
356
+ let phaseNum = 1;
357
+ for (const milestone of gsd2Data.milestones) {
358
+ for (const slice of milestone.slices) {
359
+ phaseMap.push({ milestoneId: milestone.id, milestoneTitle: milestone.title, slice, phaseNum });
360
+ phaseNum++;
361
+ }
362
+ }
363
+
364
+ artifacts.set('ROADMAP.md', buildRoadmapMd(gsd2Data.milestones, phaseMap));
365
+ artifacts.set('STATE.md', buildStateMd(phaseMap));
366
+
367
+ for (const { slice, phaseNum, milestoneTitle } of phaseMap) {
368
+ const prefix = zeroPad(phaseNum);
369
+ const slug = slugify(slice.title);
370
+ const dir = `phases/${prefix}-${slug}`;
371
+
372
+ artifacts.set(`${dir}/${prefix}-CONTEXT.md`, buildContextMd(slice, prefix));
373
+
374
+ if (slice.research) {
375
+ artifacts.set(`${dir}/${prefix}-RESEARCH.md`, slice.research);
376
+ }
377
+
378
+ for (let i = 0; i < slice.tasks.length; i++) {
379
+ const task = slice.tasks[i];
380
+ const planPrefix = zeroPad(i + 1);
381
+
382
+ artifacts.set(
383
+ `${dir}/${prefix}-${planPrefix}-PLAN.md`,
384
+ buildPlanMd(task, prefix, planPrefix, slug, milestoneTitle)
385
+ );
386
+
387
+ if (task.done && task.summary) {
388
+ artifacts.set(
389
+ `${dir}/${prefix}-${planPrefix}-SUMMARY.md`,
390
+ buildSummaryMd(task, prefix, planPrefix)
391
+ );
392
+ }
393
+ }
394
+ }
395
+
396
+ return artifacts;
397
+ }
398
+
399
+ // ─── Preview ─────────────────────────────────────────────────────────────────
400
+
401
+ /**
402
+ * Format a dry-run preview string for display before writing.
403
+ */
404
+ function buildPreview(gsd2Data, artifacts) {
405
+ const lines = ['Preview — files that will be created in .planning/:'];
406
+
407
+ for (const rel of artifacts.keys()) {
408
+ lines.push(` ${rel}`);
409
+ }
410
+
411
+ const totalSlices = gsd2Data.milestones.reduce((s, m) => s + m.slices.length, 0);
412
+ const doneSlices = gsd2Data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
413
+ const allTasks = gsd2Data.milestones.flatMap(m => m.slices.flatMap(sl => sl.tasks));
414
+ const doneTasks = allTasks.filter(t => t.done).length;
415
+
416
+ lines.push('');
417
+ lines.push(`Milestones: ${gsd2Data.milestones.length}`);
418
+ lines.push(`Phases (slices): ${totalSlices} (${doneSlices} completed)`);
419
+ lines.push(`Plans (tasks): ${allTasks.length} (${doneTasks} completed)`);
420
+ lines.push('');
421
+ lines.push('Cannot migrate automatically:');
422
+ lines.push(' - GSD-2 cost/token ledger (no v1 equivalent)');
423
+ lines.push(' - GSD-2 database state (rebuilt from files on first /gsd-health)');
424
+ lines.push(' - VS Code extension state');
425
+
426
+ return lines.join('\n');
427
+ }
428
+
429
+ // ─── Writer ───────────────────────────────────────────────────────────────────
430
+
431
+ /**
432
+ * Write all artifacts to the .planning/ directory.
433
+ */
434
+ function writePlanningDir(artifacts, planningRoot) {
435
+ for (const [rel, content] of artifacts) {
436
+ const absPath = path.join(planningRoot, rel);
437
+ fs.mkdirSync(path.dirname(absPath), { recursive: true });
438
+ fs.writeFileSync(absPath, content, 'utf8');
439
+ }
440
+ }
441
+
442
+ // ─── Command Handler ──────────────────────────────────────────────────────────
443
+
444
+ /**
445
+ * Entry point called from gsd-tools.cjs.
446
+ * Supports: --force, --dry-run, --path <dir>
447
+ */
448
+ function cmdFromGsd2(args, cwd, raw) {
449
+ const { output, error } = require('./core.cjs');
450
+
451
+ const force = args.includes('--force');
452
+ const dryRun = args.includes('--dry-run');
453
+
454
+ const pathIdx = args.indexOf('--path');
455
+ const projectDir = pathIdx >= 0 && args[pathIdx + 1]
456
+ ? path.resolve(cwd, args[pathIdx + 1])
457
+ : cwd;
458
+
459
+ const gsdDir = findGsd2Root(projectDir);
460
+ if (!gsdDir) {
461
+ return output({ success: false, error: `No .gsd/ directory found in ${projectDir}` }, raw);
462
+ }
463
+
464
+ const planningRoot = path.join(path.dirname(gsdDir), '.planning');
465
+ if (fs.existsSync(planningRoot) && !force) {
466
+ return output({
467
+ success: false,
468
+ error: `.planning/ already exists at ${planningRoot}. Pass --force to overwrite.`,
469
+ }, raw);
470
+ }
471
+
472
+ const gsd2Data = parseGsd2(gsdDir);
473
+ const artifacts = buildPlanningArtifacts(gsd2Data);
474
+ const preview = buildPreview(gsd2Data, artifacts);
475
+
476
+ if (dryRun) {
477
+ return output({ success: true, dryRun: true, preview }, raw);
478
+ }
479
+
480
+ writePlanningDir(artifacts, planningRoot);
481
+
482
+ return output({
483
+ success: true,
484
+ planningDir: planningRoot,
485
+ filesWritten: artifacts.size,
486
+ milestones: gsd2Data.milestones.length,
487
+ preview,
488
+ }, raw);
489
+ }
490
+
491
+ module.exports = {
492
+ findGsd2Root,
493
+ parseGsd2,
494
+ buildPlanningArtifacts,
495
+ buildPreview,
496
+ writePlanningDir,
497
+ cmdFromGsd2,
498
+ // Exported for unit tests
499
+ parseSlicesFromRoadmap,
500
+ parseMilestoneTitle,
501
+ parseTaskTitle,
502
+ parseTaskDescription,
503
+ parseTaskMustHaves,
504
+ buildPlanMd,
505
+ buildSummaryMd,
506
+ buildContextMd,
507
+ buildRoadmapMd,
508
+ buildStateMd,
509
+ slugify,
510
+ zeroPad,
511
+ };