gsd-pi 2.10.12 → 2.12.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 (504) hide show
  1. package/dist/bundled-extension-paths.d.ts +2 -0
  2. package/dist/bundled-extension-paths.js +10 -0
  3. package/dist/loader.js +45 -28
  4. package/dist/onboarding.js +100 -0
  5. package/dist/resource-loader.js +12 -3
  6. package/dist/resources/GSD-WORKFLOW.md +661 -0
  7. package/dist/resources/agents/researcher.md +29 -0
  8. package/dist/resources/agents/scout.md +56 -0
  9. package/dist/resources/agents/worker.md +31 -0
  10. package/dist/resources/extensions/ask-user-questions.ts +289 -0
  11. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +211 -0
  12. package/dist/resources/extensions/async-jobs/await-tool.ts +101 -0
  13. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +34 -0
  14. package/dist/resources/extensions/async-jobs/index.ts +133 -0
  15. package/dist/resources/extensions/async-jobs/job-manager.ts +211 -0
  16. package/dist/resources/extensions/bg-shell/index.ts +3179 -0
  17. package/dist/resources/extensions/browser-tools/BROWSER-TOOLS-V2-PROPOSAL.md +1277 -0
  18. package/dist/resources/extensions/browser-tools/capture.ts +165 -0
  19. package/dist/resources/extensions/browser-tools/core.d.ts +205 -0
  20. package/dist/resources/extensions/browser-tools/core.js +1057 -0
  21. package/dist/resources/extensions/browser-tools/evaluate-helpers.ts +184 -0
  22. package/dist/resources/extensions/browser-tools/index.ts +51 -0
  23. package/dist/resources/extensions/browser-tools/lifecycle.ts +270 -0
  24. package/dist/resources/extensions/browser-tools/package.json +24 -0
  25. package/dist/resources/extensions/browser-tools/refs.ts +264 -0
  26. package/dist/resources/extensions/browser-tools/settle.ts +197 -0
  27. package/dist/resources/extensions/browser-tools/state.ts +408 -0
  28. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +652 -0
  29. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +614 -0
  30. package/dist/resources/extensions/browser-tools/tools/assertions.ts +342 -0
  31. package/dist/resources/extensions/browser-tools/tools/forms.ts +801 -0
  32. package/dist/resources/extensions/browser-tools/tools/inspection.ts +492 -0
  33. package/dist/resources/extensions/browser-tools/tools/intent.ts +614 -0
  34. package/dist/resources/extensions/browser-tools/tools/interaction.ts +865 -0
  35. package/dist/resources/extensions/browser-tools/tools/navigation.ts +232 -0
  36. package/dist/resources/extensions/browser-tools/tools/pages.ts +303 -0
  37. package/dist/resources/extensions/browser-tools/tools/refs.ts +541 -0
  38. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +83 -0
  39. package/dist/resources/extensions/browser-tools/tools/session.ts +400 -0
  40. package/dist/resources/extensions/browser-tools/tools/wait.ts +247 -0
  41. package/dist/resources/extensions/browser-tools/utils.ts +660 -0
  42. package/dist/resources/extensions/context7/index.ts +428 -0
  43. package/dist/resources/extensions/context7/package.json +11 -0
  44. package/dist/resources/extensions/get-secrets-from-user.ts +625 -0
  45. package/dist/resources/extensions/google-search/index.ts +336 -0
  46. package/dist/resources/extensions/google-search/package.json +9 -0
  47. package/dist/resources/extensions/gsd/activity-log.ts +116 -0
  48. package/dist/resources/extensions/gsd/auto.ts +3732 -0
  49. package/dist/resources/extensions/gsd/commands.ts +544 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.ts +105 -0
  51. package/dist/resources/extensions/gsd/dashboard-overlay.ts +564 -0
  52. package/dist/resources/extensions/gsd/dispatch-guard.ts +78 -0
  53. package/dist/resources/extensions/gsd/docs/preferences-reference.md +278 -0
  54. package/dist/resources/extensions/gsd/doctor.ts +766 -0
  55. package/dist/resources/extensions/gsd/exit-command.ts +18 -0
  56. package/dist/resources/extensions/gsd/files.ts +857 -0
  57. package/dist/resources/extensions/gsd/git-service.ts +904 -0
  58. package/dist/resources/extensions/gsd/gitignore.ts +200 -0
  59. package/dist/resources/extensions/gsd/guided-flow.ts +1054 -0
  60. package/dist/resources/extensions/gsd/index.ts +735 -0
  61. package/dist/resources/extensions/gsd/metrics.ts +374 -0
  62. package/dist/resources/extensions/gsd/migrate/command.ts +218 -0
  63. package/dist/resources/extensions/gsd/migrate/index.ts +42 -0
  64. package/dist/resources/extensions/gsd/migrate/parser.ts +323 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.ts +624 -0
  66. package/dist/resources/extensions/gsd/migrate/preview.ts +48 -0
  67. package/dist/resources/extensions/gsd/migrate/transformer.ts +346 -0
  68. package/dist/resources/extensions/gsd/migrate/types.ts +370 -0
  69. package/dist/resources/extensions/gsd/migrate/validator.ts +55 -0
  70. package/dist/resources/extensions/gsd/migrate/writer.ts +539 -0
  71. package/dist/resources/extensions/gsd/native-git-bridge.ts +181 -0
  72. package/dist/resources/extensions/gsd/native-parser-bridge.ts +135 -0
  73. package/dist/resources/extensions/gsd/observability-validator.ts +408 -0
  74. package/dist/resources/extensions/gsd/package.json +11 -0
  75. package/dist/resources/extensions/gsd/paths.ts +339 -0
  76. package/dist/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  77. package/dist/resources/extensions/gsd/preferences.ts +988 -0
  78. package/dist/resources/extensions/gsd/prompt-loader.ts +92 -0
  79. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +25 -0
  80. package/dist/resources/extensions/gsd/prompts/complete-slice.md +27 -0
  81. package/dist/resources/extensions/gsd/prompts/discuss.md +237 -0
  82. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +29 -0
  83. package/dist/resources/extensions/gsd/prompts/execute-task.md +63 -0
  84. package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -0
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -0
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +61 -0
  87. package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +3 -0
  88. package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +29 -0
  89. package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -0
  90. package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +13 -0
  91. package/dist/resources/extensions/gsd/prompts/guided-resume-task.md +1 -0
  92. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +78 -0
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +55 -0
  94. package/dist/resources/extensions/gsd/prompts/queue.md +100 -0
  95. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +48 -0
  96. package/dist/resources/extensions/gsd/prompts/replan-slice.md +39 -0
  97. package/dist/resources/extensions/gsd/prompts/research-milestone.md +37 -0
  98. package/dist/resources/extensions/gsd/prompts/research-slice.md +28 -0
  99. package/dist/resources/extensions/gsd/prompts/review-migration.md +66 -0
  100. package/dist/resources/extensions/gsd/prompts/run-uat.md +109 -0
  101. package/dist/resources/extensions/gsd/prompts/system.md +190 -0
  102. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +123 -0
  103. package/dist/resources/extensions/gsd/roadmap-slices.ts +50 -0
  104. package/dist/resources/extensions/gsd/session-forensics.ts +500 -0
  105. package/dist/resources/extensions/gsd/skill-discovery.ts +137 -0
  106. package/dist/resources/extensions/gsd/state.ts +569 -0
  107. package/dist/resources/extensions/gsd/templates/context.md +76 -0
  108. package/dist/resources/extensions/gsd/templates/decisions.md +8 -0
  109. package/dist/resources/extensions/gsd/templates/milestone-summary.md +73 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +131 -0
  111. package/dist/resources/extensions/gsd/templates/preferences.md +23 -0
  112. package/dist/resources/extensions/gsd/templates/project.md +31 -0
  113. package/dist/resources/extensions/gsd/templates/reassessment.md +28 -0
  114. package/dist/resources/extensions/gsd/templates/requirements.md +81 -0
  115. package/dist/resources/extensions/gsd/templates/research.md +46 -0
  116. package/dist/resources/extensions/gsd/templates/roadmap.md +118 -0
  117. package/dist/resources/extensions/gsd/templates/secrets-manifest.md +22 -0
  118. package/dist/resources/extensions/gsd/templates/slice-context.md +58 -0
  119. package/dist/resources/extensions/gsd/templates/slice-summary.md +99 -0
  120. package/dist/resources/extensions/gsd/templates/state.md +19 -0
  121. package/dist/resources/extensions/gsd/templates/task-plan.md +52 -0
  122. package/dist/resources/extensions/gsd/templates/task-summary.md +57 -0
  123. package/dist/resources/extensions/gsd/templates/uat.md +54 -0
  124. package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +297 -0
  125. package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  126. package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +109 -0
  127. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +45 -0
  128. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +196 -0
  129. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  130. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +469 -0
  131. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +200 -0
  132. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +134 -0
  133. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +312 -0
  134. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +299 -0
  135. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +660 -0
  136. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +27 -0
  137. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +91 -0
  138. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +170 -0
  139. package/dist/resources/extensions/gsd/tests/doctor.test.ts +594 -0
  140. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +169 -0
  141. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +50 -0
  142. package/dist/resources/extensions/gsd/tests/git-service.test.ts +1788 -0
  143. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +577 -0
  144. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +580 -0
  145. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +283 -0
  146. package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +176 -0
  147. package/dist/resources/extensions/gsd/tests/metrics.test.ts +188 -0
  148. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +369 -0
  149. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +757 -0
  150. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +635 -0
  151. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +414 -0
  152. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +297 -0
  153. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +398 -0
  154. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +291 -0
  155. package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  156. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +66 -0
  157. package/dist/resources/extensions/gsd/tests/orphaned-branch.test.ts +353 -0
  158. package/dist/resources/extensions/gsd/tests/parsers.test.ts +1664 -0
  159. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +133 -0
  160. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +363 -0
  161. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  162. package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  163. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +126 -0
  164. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +142 -0
  165. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +281 -0
  166. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +155 -0
  167. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +99 -0
  168. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +493 -0
  169. package/dist/resources/extensions/gsd/tests/requirements.test.ts +106 -0
  170. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +35 -0
  171. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +11 -0
  172. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +41 -0
  173. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +316 -0
  174. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +185 -0
  175. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +123 -0
  176. package/dist/resources/extensions/gsd/tests/test-helpers.ts +61 -0
  177. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +219 -0
  178. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +234 -0
  179. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +75 -0
  180. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +234 -0
  181. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +141 -0
  182. package/dist/resources/extensions/gsd/tests/worktree.test.ts +597 -0
  183. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +122 -0
  184. package/dist/resources/extensions/gsd/types.ts +296 -0
  185. package/dist/resources/extensions/gsd/unit-runtime.ts +184 -0
  186. package/dist/resources/extensions/gsd/workspace-index.ts +189 -0
  187. package/dist/resources/extensions/gsd/worktree-command.ts +845 -0
  188. package/dist/resources/extensions/gsd/worktree-manager.ts +459 -0
  189. package/dist/resources/extensions/gsd/{worktree.js → worktree.ts} +92 -61
  190. package/dist/resources/extensions/mac-tools/index.ts +852 -0
  191. package/dist/resources/extensions/mac-tools/swift-cli/Package.swift +22 -0
  192. package/dist/resources/extensions/mac-tools/swift-cli/Sources/main.swift +1318 -0
  193. package/dist/resources/extensions/mcporter/index.ts +429 -0
  194. package/dist/resources/extensions/remote-questions/config.ts +81 -0
  195. package/dist/resources/extensions/remote-questions/discord-adapter.ts +128 -0
  196. package/dist/resources/extensions/remote-questions/format.ts +163 -0
  197. package/dist/resources/extensions/remote-questions/manager.ts +192 -0
  198. package/dist/resources/extensions/remote-questions/remote-command.ts +361 -0
  199. package/dist/resources/extensions/remote-questions/slack-adapter.ts +92 -0
  200. package/dist/resources/extensions/remote-questions/status.ts +31 -0
  201. package/dist/resources/extensions/remote-questions/store.ts +77 -0
  202. package/dist/resources/extensions/remote-questions/types.ts +75 -0
  203. package/dist/resources/extensions/search-the-web/cache.ts +78 -0
  204. package/dist/resources/extensions/search-the-web/command-search-provider.ts +99 -0
  205. package/dist/resources/extensions/search-the-web/format.ts +258 -0
  206. package/dist/resources/extensions/search-the-web/http.ts +238 -0
  207. package/dist/resources/extensions/search-the-web/index.ts +65 -0
  208. package/dist/resources/extensions/search-the-web/native-search.ts +165 -0
  209. package/dist/resources/extensions/search-the-web/provider.ts +136 -0
  210. package/dist/resources/extensions/search-the-web/tavily.ts +116 -0
  211. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +581 -0
  212. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +620 -0
  213. package/dist/resources/extensions/search-the-web/tool-search.ts +635 -0
  214. package/dist/resources/extensions/search-the-web/url-utils.ts +91 -0
  215. package/dist/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  216. package/dist/resources/extensions/shared/confirm-ui.ts +126 -0
  217. package/dist/resources/extensions/shared/interview-ui.ts +613 -0
  218. package/dist/resources/extensions/shared/next-action-ui.ts +197 -0
  219. package/dist/resources/extensions/shared/progress-widget.ts +282 -0
  220. package/dist/resources/extensions/shared/terminal.ts +23 -0
  221. package/dist/resources/extensions/shared/thinking-widget.ts +107 -0
  222. package/dist/resources/extensions/shared/ui.ts +400 -0
  223. package/dist/resources/extensions/shared/wizard-ui.ts +551 -0
  224. package/dist/resources/extensions/slash-commands/audit.ts +88 -0
  225. package/dist/resources/extensions/slash-commands/clear.ts +10 -0
  226. package/dist/resources/extensions/slash-commands/create-extension.ts +297 -0
  227. package/dist/resources/extensions/slash-commands/create-slash-command.ts +234 -0
  228. package/dist/resources/extensions/slash-commands/index.ts +12 -0
  229. package/dist/resources/extensions/subagent/agents.ts +126 -0
  230. package/dist/resources/extensions/subagent/index.ts +1072 -0
  231. package/dist/resources/extensions/subagent/isolation.ts +498 -0
  232. package/dist/resources/extensions/ttsr/index.ts +163 -0
  233. package/dist/resources/extensions/ttsr/rule-loader.ts +121 -0
  234. package/dist/resources/extensions/ttsr/ttsr-interrupt.md +6 -0
  235. package/dist/resources/extensions/ttsr/ttsr-manager.ts +430 -0
  236. package/dist/resources/extensions/universal-config/discovery.ts +78 -0
  237. package/dist/resources/extensions/universal-config/format.ts +160 -0
  238. package/dist/resources/extensions/universal-config/index.ts +118 -0
  239. package/dist/resources/extensions/universal-config/package.json +11 -0
  240. package/dist/resources/extensions/universal-config/scanners.ts +579 -0
  241. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +111 -0
  242. package/dist/resources/extensions/universal-config/tests/format.test.ts +111 -0
  243. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +438 -0
  244. package/dist/resources/extensions/universal-config/tools.ts +60 -0
  245. package/dist/resources/extensions/universal-config/types.ts +116 -0
  246. package/dist/resources/extensions/voice/index.ts +271 -0
  247. package/dist/resources/extensions/voice/speech-recognizer.py +504 -0
  248. package/dist/resources/extensions/voice/speech-recognizer.swift +154 -0
  249. package/dist/resources/skills/debug-like-expert/SKILL.md +231 -0
  250. package/dist/resources/skills/debug-like-expert/references/debugging-mindset.md +253 -0
  251. package/dist/resources/skills/debug-like-expert/references/hypothesis-testing.md +373 -0
  252. package/dist/resources/skills/debug-like-expert/references/investigation-techniques.md +337 -0
  253. package/dist/resources/skills/debug-like-expert/references/verification-patterns.md +425 -0
  254. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +361 -0
  255. package/dist/resources/skills/frontend-design/SKILL.md +45 -0
  256. package/dist/resources/skills/github-workflows/SKILL.md +92 -0
  257. package/dist/resources/skills/github-workflows/references/gh/SKILL.md +255 -0
  258. package/dist/resources/skills/github-workflows/references/gh/references/issue-stories.md +204 -0
  259. package/dist/resources/skills/github-workflows/references/gh/references/labels.md +170 -0
  260. package/dist/resources/skills/github-workflows/references/gh/references/milestones.md +158 -0
  261. package/dist/resources/skills/github-workflows/references/gh/references/projects-v2.md +177 -0
  262. package/dist/resources/skills/github-workflows/references/gh/scripts/experiment_cleanup.py +191 -0
  263. package/dist/resources/skills/github-workflows/references/gh/scripts/github_project_setup.py +799 -0
  264. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  265. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  266. package/dist/resources/skills/swiftui/SKILL.md +208 -0
  267. package/dist/resources/skills/swiftui/references/animations.md +921 -0
  268. package/dist/resources/skills/swiftui/references/architecture.md +1561 -0
  269. package/dist/resources/skills/swiftui/references/layout-system.md +1186 -0
  270. package/dist/resources/skills/swiftui/references/navigation.md +1492 -0
  271. package/dist/resources/skills/swiftui/references/networking-async.md +214 -0
  272. package/dist/resources/skills/swiftui/references/performance.md +1706 -0
  273. package/dist/resources/skills/swiftui/references/platform-integration.md +204 -0
  274. package/dist/resources/skills/swiftui/references/state-management.md +1443 -0
  275. package/dist/resources/skills/swiftui/references/swiftdata.md +297 -0
  276. package/dist/resources/skills/swiftui/references/testing-debugging.md +247 -0
  277. package/dist/resources/skills/swiftui/references/uikit-appkit-interop.md +218 -0
  278. package/dist/resources/skills/swiftui/workflows/add-feature.md +191 -0
  279. package/dist/resources/skills/swiftui/workflows/build-new-app.md +311 -0
  280. package/dist/resources/skills/swiftui/workflows/debug-swiftui.md +192 -0
  281. package/dist/resources/skills/swiftui/workflows/optimize-performance.md +197 -0
  282. package/dist/resources/skills/swiftui/workflows/ship-app.md +203 -0
  283. package/dist/resources/skills/swiftui/workflows/write-tests.md +235 -0
  284. package/dist/wizard.js +1 -0
  285. package/package.json +8 -6
  286. package/packages/native/dist/fd/index.d.ts +1 -0
  287. package/packages/native/dist/fd/index.js +1 -0
  288. package/packages/native/dist/grep/index.d.ts +2 -1
  289. package/packages/native/dist/grep/index.js +1 -0
  290. package/packages/native/src/__tests__/fd.test.mjs +35 -0
  291. package/packages/native/src/__tests__/grep.test.mjs +26 -9
  292. package/packages/native/src/fd/index.ts +1 -0
  293. package/packages/native/src/grep/index.ts +3 -2
  294. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  295. package/packages/pi-agent-core/dist/agent-loop.js +169 -55
  296. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  297. package/packages/pi-agent-core/dist/agent.d.ts +13 -1
  298. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  299. package/packages/pi-agent-core/dist/agent.js +16 -0
  300. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  301. package/packages/pi-agent-core/dist/types.d.ts +91 -1
  302. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  303. package/packages/pi-agent-core/dist/types.js.map +1 -1
  304. package/packages/pi-agent-core/src/agent-loop.ts +273 -63
  305. package/packages/pi-agent-core/src/agent.ts +24 -0
  306. package/packages/pi-agent-core/src/types.ts +98 -0
  307. package/packages/pi-ai/dist/env-api-keys.js +2 -0
  308. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  309. package/packages/pi-ai/dist/models.generated.d.ts +314 -0
  310. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/models.generated.js +236 -0
  312. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/providers/google-gemini-cli.js +6 -0
  315. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  317. package/packages/pi-ai/dist/providers/openai-completions.js +2 -0
  318. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  319. package/packages/pi-ai/dist/types.d.ts +1 -1
  320. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  321. package/packages/pi-ai/dist/types.js.map +1 -1
  322. package/packages/pi-ai/src/env-api-keys.ts +2 -0
  323. package/packages/pi-ai/src/models.generated.ts +236 -0
  324. package/packages/pi-ai/src/providers/google-gemini-cli.ts +8 -0
  325. package/packages/pi-ai/src/providers/openai-completions.ts +3 -0
  326. package/packages/pi-ai/src/types.ts +2 -1
  327. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/cli/args.js +1 -0
  329. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +26 -0
  331. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/core/agent-session.js +137 -22
  333. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +20 -0
  335. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/core/auth-storage.js +43 -0
  337. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts +51 -0
  339. package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -0
  340. package/packages/pi-coding-agent/dist/core/fallback-resolver.js +119 -0
  341. package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -0
  342. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts +2 -0
  343. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.d.ts.map +1 -0
  344. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +183 -0
  345. package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -0
  346. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  347. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  348. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  349. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  350. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  352. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +12 -1
  354. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/session-manager.js +37 -1
  356. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/session-manager.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/session-manager.test.js +61 -0
  360. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  362. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/settings-manager.js +47 -0
  364. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/tools/find.js +1 -0
  367. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +6 -15
  370. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +18 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +46 -4
  374. package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -2
  377. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  378. package/packages/pi-coding-agent/src/cli/args.ts +1 -0
  379. package/packages/pi-coding-agent/src/core/agent-session.ts +167 -22
  380. package/packages/pi-coding-agent/src/core/auth-storage.ts +45 -0
  381. package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +229 -0
  382. package/packages/pi-coding-agent/src/core/fallback-resolver.ts +165 -0
  383. package/packages/pi-coding-agent/src/core/index.ts +1 -0
  384. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  385. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -0
  386. package/packages/pi-coding-agent/src/core/session-manager.ts +51 -1
  387. package/packages/pi-coding-agent/src/core/settings-manager.ts +66 -0
  388. package/packages/pi-coding-agent/src/core/tools/find.ts +1 -0
  389. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +6 -16
  390. package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +49 -4
  391. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +28 -2
  392. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  393. package/packages/pi-tui/dist/autocomplete.js +3 -4
  394. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  395. package/packages/pi-tui/dist/components/editor.d.ts +7 -0
  396. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  397. package/packages/pi-tui/dist/components/editor.js +57 -50
  398. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  399. package/packages/pi-tui/src/autocomplete.ts +3 -5
  400. package/packages/pi-tui/src/components/editor.ts +70 -49
  401. package/pkg/dist/core/export-html/ansi-to-html.d.ts +22 -0
  402. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  403. package/pkg/dist/core/export-html/ansi-to-html.js +249 -0
  404. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -0
  405. package/pkg/dist/core/export-html/index.d.ts +37 -0
  406. package/pkg/dist/core/export-html/index.d.ts.map +1 -0
  407. package/pkg/dist/core/export-html/index.js +223 -0
  408. package/pkg/dist/core/export-html/index.js.map +1 -0
  409. package/pkg/dist/core/export-html/template.css +971 -0
  410. package/pkg/dist/core/export-html/template.html +54 -0
  411. package/pkg/dist/core/export-html/template.js +1583 -0
  412. package/pkg/dist/core/export-html/tool-renderer.d.ts +38 -0
  413. package/pkg/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  414. package/pkg/dist/core/export-html/tool-renderer.js +70 -0
  415. package/pkg/dist/core/export-html/tool-renderer.js.map +1 -0
  416. package/pkg/dist/core/export-html/vendor/highlight.min.js +1213 -0
  417. package/pkg/dist/core/export-html/vendor/marked.min.js +6 -0
  418. package/scripts/postinstall.js +30 -17
  419. package/src/resources/extensions/bg-shell/index.ts +51 -7
  420. package/src/resources/extensions/gsd/activity-log.ts +61 -14
  421. package/src/resources/extensions/gsd/auto.ts +288 -19
  422. package/src/resources/extensions/gsd/commands.ts +9 -3
  423. package/src/resources/extensions/gsd/dashboard-overlay.ts +55 -12
  424. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -0
  425. package/src/resources/extensions/gsd/doctor.ts +60 -3
  426. package/src/resources/extensions/gsd/files.ts +45 -1
  427. package/src/resources/extensions/gsd/git-service.ts +46 -41
  428. package/src/resources/extensions/gsd/guided-flow.ts +81 -9
  429. package/src/resources/extensions/gsd/index.ts +62 -1
  430. package/src/resources/extensions/gsd/native-git-bridge.ts +181 -0
  431. package/src/resources/extensions/gsd/paths.ts +35 -4
  432. package/src/resources/extensions/gsd/post-unit-hooks.ts +449 -0
  433. package/src/resources/extensions/gsd/preferences.ts +232 -1
  434. package/src/resources/extensions/gsd/prompt-loader.ts +45 -3
  435. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  436. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -3
  437. package/src/resources/extensions/gsd/prompts/discuss.md +10 -8
  438. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  439. package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +3 -1
  440. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +3 -1
  441. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +3 -1
  442. package/src/resources/extensions/gsd/prompts/guided-execute-task.md +3 -1
  443. package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +4 -2
  444. package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +3 -1
  445. package/src/resources/extensions/gsd/prompts/guided-research-slice.md +3 -1
  446. package/src/resources/extensions/gsd/prompts/plan-milestone.md +9 -12
  447. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -3
  448. package/src/resources/extensions/gsd/prompts/queue.md +3 -1
  449. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  450. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  451. package/src/resources/extensions/gsd/state.ts +130 -18
  452. package/src/resources/extensions/gsd/templates/context.md +1 -1
  453. package/src/resources/extensions/gsd/templates/state.md +3 -3
  454. package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +127 -0
  455. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +5 -1
  456. package/src/resources/extensions/gsd/tests/doctor.test.ts +115 -1
  457. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +6 -2
  458. package/src/resources/extensions/gsd/tests/git-service.test.ts +35 -35
  459. package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +8 -8
  460. package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +4 -1
  461. package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +54 -0
  462. package/src/resources/extensions/gsd/tests/orphaned-branch.test.ts +5 -5
  463. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +297 -0
  464. package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +226 -0
  465. package/src/resources/extensions/gsd/tests/regex-hardening.test.ts +12 -0
  466. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +6 -0
  467. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +4 -4
  468. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +4 -4
  469. package/src/resources/extensions/gsd/tests/worktree.test.ts +19 -19
  470. package/src/resources/extensions/gsd/types.ts +109 -0
  471. package/src/resources/extensions/gsd/worktree-manager.ts +72 -13
  472. package/src/resources/extensions/gsd/worktree.ts +5 -4
  473. package/src/resources/extensions/search-the-web/command-search-provider.ts +8 -4
  474. package/src/resources/extensions/search-the-web/native-search.ts +32 -23
  475. package/src/resources/extensions/search-the-web/provider.ts +19 -2
  476. package/src/resources/extensions/search-the-web/tool-fetch-page.ts +62 -0
  477. package/src/resources/extensions/search-the-web/tool-llm-context.ts +62 -3
  478. package/src/resources/extensions/search-the-web/tool-search.ts +62 -3
  479. package/src/resources/extensions/shared/bundled-extension-paths.ts +11 -0
  480. package/src/resources/extensions/subagent/index.ts +2 -1
  481. package/src/resources/skills/github-workflows/SKILL.md +5 -0
  482. package/dist/resources/extensions/gsd/git-service.d.ts +0 -225
  483. package/dist/resources/extensions/gsd/git-service.js +0 -756
  484. package/dist/resources/extensions/gsd/preferences.d.ts +0 -122
  485. package/dist/resources/extensions/gsd/preferences.js +0 -616
  486. package/dist/resources/extensions/gsd/worktree.d.ts +0 -106
  487. package/dist/resources/extensions/remote-questions/config.d.ts +0 -14
  488. package/dist/resources/extensions/remote-questions/config.js +0 -68
  489. package/dist/resources/extensions/remote-questions/discord-adapter.d.ts +0 -17
  490. package/dist/resources/extensions/remote-questions/discord-adapter.js +0 -118
  491. package/dist/resources/extensions/remote-questions/format.d.ts +0 -38
  492. package/dist/resources/extensions/remote-questions/format.js +0 -119
  493. package/dist/resources/extensions/remote-questions/manager.d.ts +0 -23
  494. package/dist/resources/extensions/remote-questions/manager.js +0 -161
  495. package/dist/resources/extensions/remote-questions/remote-command.d.ts +0 -6
  496. package/dist/resources/extensions/remote-questions/remote-command.js +0 -358
  497. package/dist/resources/extensions/remote-questions/slack-adapter.d.ts +0 -15
  498. package/dist/resources/extensions/remote-questions/slack-adapter.js +0 -82
  499. package/dist/resources/extensions/remote-questions/status.d.ts +0 -9
  500. package/dist/resources/extensions/remote-questions/status.js +0 -25
  501. package/dist/resources/extensions/remote-questions/store.d.ts +0 -11
  502. package/dist/resources/extensions/remote-questions/store.js +0 -66
  503. package/dist/resources/extensions/remote-questions/types.d.ts +0 -68
  504. package/dist/resources/extensions/remote-questions/types.js +0 -4
@@ -0,0 +1,580 @@
1
+ /**
2
+ * Integration tests: deriveState, indexWorkspace, inlinePriorMilestoneSummary,
3
+ * dispatch-guard, and branch operations with unique-format (M001-abc123) and
4
+ * mixed classic+unique milestone directories.
5
+ *
6
+ * Uses real filesystem and git fixtures — no mocking.
7
+ */
8
+
9
+ import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
10
+ import { execSync } from 'node:child_process';
11
+ import { join } from 'node:path';
12
+ import { tmpdir } from 'node:os';
13
+
14
+ import { deriveState } from '../state.ts';
15
+ import { indexWorkspace } from '../workspace-index.ts';
16
+ import { inlinePriorMilestoneSummary } from '../files.ts';
17
+ import { getPriorSliceCompletionBlocker } from '../dispatch-guard.ts';
18
+ import {
19
+ ensureSliceBranch,
20
+ getCurrentBranch,
21
+ getSliceBranchName,
22
+ mergeSliceToMain,
23
+ parseSliceBranch,
24
+ switchToMain,
25
+ } from '../worktree.ts';
26
+ import { clearPathCache } from '../paths.ts';
27
+ import { createTestContext } from './test-helpers.ts';
28
+
29
+ // ─── Assertion Helpers ────────────────────────────────────────────────────
30
+
31
+ const { assertEq, assertTrue, assertMatch, report } = createTestContext();
32
+ // ─── Fixture Helpers ──────────────────────────────────────────────────────
33
+
34
+ function createFixtureBase(): string {
35
+ const base = mkdtempSync(join(tmpdir(), 'gsd-integration-mixed-'));
36
+ mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
37
+ return base;
38
+ }
39
+
40
+ function writeRoadmap(base: string, mid: string, content: string): void {
41
+ const dir = join(base, '.gsd', 'milestones', mid);
42
+ mkdirSync(dir, { recursive: true });
43
+ writeFileSync(join(dir, `${mid}-ROADMAP.md`), content);
44
+ }
45
+
46
+ function writePlan(base: string, mid: string, sid: string, content: string): void {
47
+ const dir = join(base, '.gsd', 'milestones', mid, 'slices', sid);
48
+ mkdirSync(join(dir, 'tasks'), { recursive: true });
49
+ writeFileSync(join(dir, `${sid}-PLAN.md`), content);
50
+ }
51
+
52
+ function writeMilestoneSummary(base: string, mid: string, content: string): void {
53
+ const dir = join(base, '.gsd', 'milestones', mid);
54
+ mkdirSync(dir, { recursive: true });
55
+ writeFileSync(join(dir, `${mid}-SUMMARY.md`), content);
56
+ }
57
+
58
+ function cleanup(base: string): void {
59
+ rmSync(base, { recursive: true, force: true });
60
+ }
61
+
62
+ function run(command: string, cwd: string): string {
63
+ return execSync(command, { cwd, stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8' }).trim();
64
+ }
65
+
66
+ function createGitRepo(): string {
67
+ const base = mkdtempSync(join(tmpdir(), 'gsd-integration-git-'));
68
+ mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
69
+ run('git init -b main', base);
70
+ run("git config user.name 'Integration Test'", base);
71
+ run("git config user.email 'test@example.com'", base);
72
+ return base;
73
+ }
74
+
75
+ // ═══════════════════════════════════════════════════════════════════════════
76
+ // Test Groups
77
+ // ═══════════════════════════════════════════════════════════════════════════
78
+
79
+ async function main(): Promise<void> {
80
+
81
+ // ─── Group 1: deriveState with new-format-only milestones ─────────────
82
+ console.log('\n=== Group 1: deriveState with new-format-only milestones ===');
83
+ {
84
+ const base = createFixtureBase();
85
+ try {
86
+ // Create M001-abc123 with roadmap + 2 slices (S01 complete, S02 in-progress)
87
+ writeRoadmap(base, 'M001-abc123', `# M001-abc123: Test Feature
88
+
89
+ **Vision:** Test vision
90
+
91
+ ## Slices
92
+ - [x] **S01: Setup** \`risk:low\` \`depends:[]\`
93
+ > Foundation work
94
+ - [ ] **S02: Core Logic** \`risk:medium\` \`depends:[]\`
95
+ > Main implementation
96
+ `);
97
+
98
+ // S01 is complete — write a plan with all tasks done
99
+ writePlan(base, 'M001-abc123', 'S01', `# S01: Setup
100
+
101
+ **Goal:** Setup
102
+ **Demo:** Setup works
103
+
104
+ ## Tasks
105
+ - [x] **T01: Init** \`est:10m\`
106
+ Initialize project.
107
+ `);
108
+
109
+ // S02 is in-progress — write a plan with first task not done
110
+ writePlan(base, 'M001-abc123', 'S02', `# S02: Core Logic
111
+
112
+ **Goal:** Implement core
113
+ **Demo:** Core works
114
+
115
+ ## Tasks
116
+ - [ ] **T01: Build core** \`est:20m\`
117
+ Build the core logic.
118
+ - [ ] **T02: Test core** \`est:15m\`
119
+ Test the core logic.
120
+ `);
121
+
122
+ const state = await deriveState(base);
123
+
124
+ // Phase should be executing (active milestone with incomplete slice + plan + tasks)
125
+ assertEq(state.phase, 'executing', 'G1: phase is executing');
126
+ assertTrue(state.activeMilestone !== null, 'G1: activeMilestone is not null');
127
+ assertEq(state.activeMilestone?.id, 'M001-abc123', 'G1: activeMilestone id is M001-abc123');
128
+ assertEq(state.activeMilestone?.title, 'Test Feature', 'G1: title stripped to Test Feature');
129
+
130
+ // Registry
131
+ assertEq(state.registry.length, 1, 'G1: registry has 1 entry');
132
+ assertEq(state.registry[0]?.id, 'M001-abc123', 'G1: registry entry id');
133
+ assertEq(state.registry[0]?.status, 'active', 'G1: registry entry status is active');
134
+ assertEq(state.registry[0]?.title, 'Test Feature', 'G1: registry title stripped');
135
+
136
+ // Active slice
137
+ assertTrue(state.activeSlice !== null, 'G1: activeSlice is not null');
138
+ assertEq(state.activeSlice?.id, 'S02', 'G1: activeSlice is S02');
139
+
140
+ // Progress
141
+ assertEq(state.progress?.milestones?.done, 0, 'G1: milestones done = 0');
142
+ assertEq(state.progress?.milestones?.total, 1, 'G1: milestones total = 1');
143
+ } finally {
144
+ cleanup(base);
145
+ }
146
+ }
147
+
148
+ // ─── Group 2: deriveState with mixed-format milestones ────────────────
149
+ console.log('\n=== Group 2: deriveState with mixed old+new format milestones ===');
150
+ {
151
+ const base = createFixtureBase();
152
+ try {
153
+ // M001 — complete milestone (all slices done + summary)
154
+ writeRoadmap(base, 'M001', `# M001: Legacy Feature
155
+
156
+ **Vision:** Legacy vision
157
+
158
+ ## Slices
159
+ - [x] **S01: Only Slice** \`risk:low\` \`depends:[]\`
160
+ > Done
161
+ `);
162
+
163
+ writePlan(base, 'M001', 'S01', `# S01: Only Slice
164
+
165
+ **Goal:** Done
166
+ **Demo:** Works
167
+
168
+ ## Tasks
169
+ - [x] **T01: Do it** \`est:10m\`
170
+ Did it.
171
+ `);
172
+
173
+ writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
174
+
175
+ **One-liner summary**
176
+
177
+ ## What Happened
178
+ Everything worked.
179
+ `);
180
+
181
+ // M002-abc123 — active milestone (incomplete slice)
182
+ writeRoadmap(base, 'M002-abc123', `# M002-abc123: New Feature
183
+
184
+ **Vision:** New vision
185
+
186
+ ## Slices
187
+ - [x] **S01: Setup** \`risk:low\` \`depends:[]\`
188
+ > Setup done
189
+ - [ ] **S02: Implementation** \`risk:medium\` \`depends:[]\`
190
+ > Main work
191
+ `);
192
+
193
+ writePlan(base, 'M002-abc123', 'S01', `# S01: Setup
194
+
195
+ **Goal:** Setup
196
+ **Demo:** Setup done
197
+
198
+ ## Tasks
199
+ - [x] **T01: Init** \`est:10m\`
200
+ Init done.
201
+ `);
202
+
203
+ writePlan(base, 'M002-abc123', 'S02', `# S02: Implementation
204
+
205
+ **Goal:** Implement
206
+ **Demo:** Works
207
+
208
+ ## Tasks
209
+ - [ ] **T01: Build** \`est:20m\`
210
+ Build it.
211
+ `);
212
+
213
+ const state = await deriveState(base);
214
+
215
+ // Registry — should have 2 entries sorted by seq number
216
+ assertEq(state.registry.length, 2, 'G2: registry has 2 entries');
217
+ assertEq(state.registry[0]?.id, 'M001', 'G2: registry[0] is M001 (sorted first)');
218
+ assertEq(state.registry[1]?.id, 'M002-abc123', 'G2: registry[1] is M002-abc123 (sorted second)');
219
+
220
+ // M001 is complete
221
+ assertEq(state.registry[0]?.status, 'complete', 'G2: M001 status is complete');
222
+ assertEq(state.registry[0]?.title, 'Legacy Feature', 'G2: M001 title stripped');
223
+
224
+ // M002-abc123 is active
225
+ assertEq(state.registry[1]?.status, 'active', 'G2: M002-abc123 status is active');
226
+ assertEq(state.registry[1]?.title, 'New Feature', 'G2: M002-abc123 title stripped');
227
+
228
+ // Active milestone
229
+ assertTrue(state.activeMilestone !== null, 'G2: activeMilestone is not null');
230
+ assertEq(state.activeMilestone?.id, 'M002-abc123', 'G2: activeMilestone is M002-abc123');
231
+ assertEq(state.activeMilestone?.title, 'New Feature', 'G2: activeMilestone title stripped');
232
+
233
+ // Phase
234
+ assertEq(state.phase, 'executing', 'G2: phase is executing');
235
+
236
+ // Active slice
237
+ assertEq(state.activeSlice?.id, 'S02', 'G2: activeSlice is S02');
238
+
239
+ // Progress
240
+ assertEq(state.progress?.milestones?.done, 1, 'G2: milestones done = 1');
241
+ assertEq(state.progress?.milestones?.total, 2, 'G2: milestones total = 2');
242
+ } finally {
243
+ cleanup(base);
244
+ }
245
+ }
246
+
247
+ // ─── Group 3: indexWorkspace with mixed-format milestones ─────────────
248
+ console.log('\n=== Group 3: indexWorkspace with mixed-format milestones ===');
249
+ {
250
+ const base = createFixtureBase();
251
+ try {
252
+ // Same fixture as Group 2: M001 (complete) + M002-abc123 (active)
253
+ writeRoadmap(base, 'M001', `# M001: Legacy Feature
254
+
255
+ **Vision:** Legacy vision
256
+
257
+ ## Slices
258
+ - [x] **S01: Only Slice** \`risk:low\` \`depends:[]\`
259
+ > Done
260
+ `);
261
+
262
+ writePlan(base, 'M001', 'S01', `# S01: Only Slice
263
+
264
+ **Goal:** Done
265
+ **Demo:** Works
266
+
267
+ ## Tasks
268
+ - [x] **T01: Do it** \`est:10m\`
269
+ Did it.
270
+ `);
271
+
272
+ writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
273
+
274
+ **One-liner summary**
275
+
276
+ ## What Happened
277
+ Everything worked.
278
+ `);
279
+
280
+ writeRoadmap(base, 'M002-abc123', `# M002-abc123: New Feature
281
+
282
+ **Vision:** New vision
283
+
284
+ ## Slices
285
+ - [ ] **S01: First Slice** \`risk:low\` \`depends:[]\`
286
+ > First work
287
+ `);
288
+
289
+ writePlan(base, 'M002-abc123', 'S01', `# S01: First Slice
290
+
291
+ **Goal:** First
292
+ **Demo:** First works
293
+
294
+ ## Tasks
295
+ - [ ] **T01: Build** \`est:20m\`
296
+ Build it.
297
+ `);
298
+
299
+ const index = await indexWorkspace(base);
300
+
301
+ // Both milestones indexed
302
+ assertEq(index.milestones.length, 2, 'G3: 2 milestones in index');
303
+ assertEq(index.milestones[0]?.id, 'M001', 'G3: index[0] is M001');
304
+ assertEq(index.milestones[1]?.id, 'M002-abc123', 'G3: index[1] is M002-abc123');
305
+
306
+ // Titles stripped from both formats
307
+ assertEq(index.milestones[0]?.title, 'Legacy Feature', 'G3: M001 title stripped');
308
+ assertEq(index.milestones[1]?.title, 'New Feature', 'G3: M002-abc123 title stripped');
309
+
310
+ // Active state
311
+ assertEq(index.active.milestoneId, 'M002-abc123', 'G3: active milestone is M002-abc123');
312
+ assertEq(index.active.sliceId, 'S01', 'G3: active slice is S01');
313
+
314
+ // Scopes include new-format paths
315
+ assertTrue(
316
+ index.scopes.some(s => s.scope === 'M002-abc123'),
317
+ 'G3: scope includes M002-abc123 milestone',
318
+ );
319
+ assertTrue(
320
+ index.scopes.some(s => s.scope === 'M002-abc123/S01'),
321
+ 'G3: scope includes M002-abc123/S01 slice',
322
+ );
323
+ assertTrue(
324
+ index.scopes.some(s => s.scope === 'M002-abc123/S01/T01'),
325
+ 'G3: scope includes M002-abc123/S01/T01 task',
326
+ );
327
+ } finally {
328
+ cleanup(base);
329
+ }
330
+ }
331
+
332
+ // ─── Group 4: inlinePriorMilestoneSummary with mixed formats ──────────
333
+ console.log('\n=== Group 4: inlinePriorMilestoneSummary with mixed formats ===');
334
+ {
335
+ const base = createFixtureBase();
336
+ try {
337
+ // M001 — completed with summary
338
+ mkdirSync(join(base, '.gsd', 'milestones', 'M001'), { recursive: true });
339
+ writeMilestoneSummary(base, 'M001', `# M001: Legacy Feature Summary
340
+
341
+ **Completed legacy feature**
342
+
343
+ ## What Happened
344
+ Built the legacy feature successfully.
345
+
346
+ ## Key Decisions
347
+ - Used old format for milestone IDs.
348
+ `);
349
+
350
+ // M002-abc123 — active milestone (just needs directory to exist)
351
+ mkdirSync(join(base, '.gsd', 'milestones', 'M002-abc123'), { recursive: true });
352
+
353
+ const result = await inlinePriorMilestoneSummary('M002-abc123', base);
354
+
355
+ // Result should be non-null (M001 is before M002-abc123)
356
+ assertTrue(result !== null, 'G4: result is non-null');
357
+ assertTrue(typeof result === 'string', 'G4: result is a string');
358
+
359
+ // Should contain the M001 summary content
360
+ assertTrue(result!.includes('Prior Milestone Summary'), 'G4: contains Prior Milestone Summary header');
361
+ assertTrue(result!.includes('Built the legacy feature successfully'), 'G4: contains M001 summary content');
362
+ assertTrue(result!.includes('Used old format for milestone IDs'), 'G4: contains M001 key decisions');
363
+ } finally {
364
+ cleanup(base);
365
+ }
366
+ }
367
+
368
+ // ─── Group 5: dispatch-guard with new-format milestones ──────────────
369
+ console.log('\n=== Group 5: dispatch-guard with new-format milestones ===');
370
+ {
371
+ const base = createGitRepo();
372
+ try {
373
+ // M001-abc123: all slices complete
374
+ writeRoadmap(base, 'M001-abc123', `# M001-abc123: First Feature
375
+
376
+ **Vision:** First
377
+
378
+ ## Slices
379
+ - [x] **S01: Done** \`risk:low\` \`depends:[]\`
380
+ > Completed
381
+ `);
382
+
383
+ // M002-abc123: S01 incomplete
384
+ writeRoadmap(base, 'M002-abc123', `# M002-abc123: Second Feature
385
+
386
+ **Vision:** Second
387
+
388
+ ## Slices
389
+ - [ ] **S01: Pending** \`risk:low\` \`depends:[]\`
390
+ > Not started
391
+ - [ ] **S02: Also Pending** \`risk:low\` \`depends:[S01]\`
392
+ > Not started
393
+ `);
394
+
395
+ // Initial commit so dispatch-guard can read from git branch
396
+ writeFileSync(join(base, 'README.md'), 'init\n');
397
+ run('git add .', base);
398
+ run('git commit -m init', base);
399
+
400
+ // No blocker: M001-abc123 is complete, dispatching M002-abc123/S01
401
+ assertEq(
402
+ getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01'),
403
+ null,
404
+ 'G5: no blocker for M002-abc123/S01 when M001-abc123 all complete',
405
+ );
406
+
407
+ // No blocker for first slice of first milestone
408
+ assertEq(
409
+ getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M001-abc123/S01/T01'),
410
+ null,
411
+ 'G5: no blocker for M001-abc123/S01/T01 (first milestone first slice)',
412
+ );
413
+
414
+ // Blocker: trying to dispatch M002-abc123/S02 when S01 is incomplete
415
+ assertMatch(
416
+ getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M002-abc123/S02/T01') ?? '',
417
+ /earlier slice M002-abc123\/S01 is not complete/,
418
+ 'G5: blocks M002-abc123/S02 when S01 incomplete',
419
+ );
420
+
421
+ // Non-slice dispatch type should not be blocked
422
+ assertEq(
423
+ getPriorSliceCompletionBlocker(base, 'main', 'plan-milestone', 'M002-abc123'),
424
+ null,
425
+ 'G5: non-slice dispatch type not blocked',
426
+ );
427
+
428
+ // Mixed format: M001 (incomplete) + M002-abc123
429
+ writeRoadmap(base, 'M001', `# M001: Legacy Feature
430
+
431
+ **Vision:** Legacy
432
+
433
+ ## Slices
434
+ - [x] **S01: Done** \`risk:low\` \`depends:[]\`
435
+ > Done
436
+ - [ ] **S02: Pending** \`risk:low\` \`depends:[S01]\`
437
+ > Pending
438
+ `);
439
+ run('git add .', base);
440
+ run('git commit -m add-m001', base);
441
+ clearPathCache();
442
+
443
+ // M001 (seq=1) < M001-abc123 (seq=1) — but M001 has incomplete S02
444
+ // Since M001 seq=1 and M002-abc123 seq=2, blocker should reference M001/S02
445
+ assertMatch(
446
+ getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01') ?? '',
447
+ /earlier slice M001\/S02 is not complete/,
448
+ 'G5: mixed-format blocker references M001/S02',
449
+ );
450
+
451
+ // Complete M001 and verify no blocker
452
+ writeRoadmap(base, 'M001', `# M001: Legacy Feature
453
+
454
+ **Vision:** Legacy
455
+
456
+ ## Slices
457
+ - [x] **S01: Done** \`risk:low\` \`depends:[]\`
458
+ > Done
459
+ - [x] **S02: Done** \`risk:low\` \`depends:[S01]\`
460
+ > Done
461
+ `);
462
+ run('git add .', base);
463
+ run('git commit -m complete-m001', base);
464
+ clearPathCache();
465
+
466
+ assertEq(
467
+ getPriorSliceCompletionBlocker(base, 'main', 'plan-slice', 'M002-abc123/S01'),
468
+ null,
469
+ 'G5: no blocker after M001 completed (mixed format)',
470
+ );
471
+
472
+ // M001-abc123 still has all complete, M002-abc123/S01 still incomplete
473
+ // Check that S02 of M002-abc123 is still blocked by its own S01
474
+ assertMatch(
475
+ getPriorSliceCompletionBlocker(base, 'main', 'execute-task', 'M002-abc123/S02/T01') ?? '',
476
+ /earlier slice M002-abc123\/S01 is not complete/,
477
+ 'G5: intra-milestone blocker still works in mixed-format context',
478
+ );
479
+ } finally {
480
+ cleanup(base);
481
+ }
482
+ }
483
+
484
+ // ─── Group 6: Branch operations with new-format IDs ─────────────────
485
+ console.log('\n=== Group 6: Branch operations with new-format IDs ===');
486
+ {
487
+ const base = createGitRepo();
488
+ try {
489
+ // Need a milestone dir and initial commit for branch ops
490
+ writeRoadmap(base, 'M001-abc123', `# M001-abc123: Branch Test
491
+
492
+ **Vision:** Test branches
493
+
494
+ ## Slices
495
+ - [ ] **S01: Slice One** \`risk:low\` \`depends:[]\`
496
+ > Branch test
497
+ `);
498
+ writePlan(base, 'M001-abc123', 'S01', `# S01: Slice One
499
+
500
+ **Goal:** Test
501
+ **Demo:** Branch works
502
+
503
+ ## Tasks
504
+ - [ ] **T01: Build** \`est:10m\`
505
+ Build it.
506
+ `);
507
+ writeFileSync(join(base, 'README.md'), 'initial\n');
508
+ run('git add .', base);
509
+ run('git commit -m init', base);
510
+
511
+ // Test getSliceBranchName with new-format ID
512
+ assertEq(
513
+ getSliceBranchName('M001-abc123', 'S01'),
514
+ 'gsd/M001-abc123/S01',
515
+ 'G6: getSliceBranchName returns gsd/M001-abc123/S01',
516
+ );
517
+
518
+ // Test parseSliceBranch with new-format branch name
519
+ const parsed = parseSliceBranch('gsd/M001-abc123/S01');
520
+ assertTrue(parsed !== null, 'G6: parseSliceBranch returns non-null for new-format');
521
+ assertEq(parsed?.milestoneId, 'M001-abc123', 'G6: parsed milestoneId is M001-abc123');
522
+ assertEq(parsed?.sliceId, 'S01', 'G6: parsed sliceId is S01');
523
+ assertEq(parsed?.worktreeName, null, 'G6: parsed worktreeName is null (no worktree)');
524
+
525
+ // Test ensureSliceBranch creates the branch
526
+ const created = ensureSliceBranch(base, 'M001-abc123', 'S01');
527
+ assertTrue(created, 'G6: ensureSliceBranch returns true (branch created)');
528
+ assertEq(
529
+ getCurrentBranch(base),
530
+ 'gsd/M001-abc123/S01',
531
+ 'G6: getCurrentBranch returns gsd/M001-abc123/S01',
532
+ );
533
+
534
+ // Idempotent: second ensure should not create
535
+ const secondCreate = ensureSliceBranch(base, 'M001-abc123', 'S01');
536
+ assertEq(secondCreate, false, 'G6: second ensureSliceBranch returns false');
537
+
538
+ // Make a change on the slice branch, commit, then merge to main
539
+ writeFileSync(join(base, 'feature.txt'), 'new feature from slice\n');
540
+ run('git add feature.txt', base);
541
+ run('git commit -m "feat: slice work"', base);
542
+
543
+ // Switch to main and merge
544
+ switchToMain(base);
545
+ assertEq(getCurrentBranch(base), 'main', 'G6: back on main after switchToMain');
546
+
547
+ const merge = mergeSliceToMain(base, 'M001-abc123', 'S01', 'Slice One');
548
+ assertEq(merge.branch, 'gsd/M001-abc123/S01', 'G6: merge reports correct branch');
549
+ assertEq(getCurrentBranch(base), 'main', 'G6: still on main after merge');
550
+ assertTrue(merge.deletedBranch, 'G6: merge deleted the slice branch');
551
+
552
+ // Verify the merged content exists on main
553
+ const content = readFileSync(join(base, 'feature.txt'), 'utf-8');
554
+ assertTrue(content.includes('new feature from slice'), 'G6: merged content on main');
555
+
556
+ // Verify branch is gone
557
+ const branches = run('git branch', base);
558
+ assertTrue(!branches.includes('gsd/M001-abc123/S01'), 'G6: slice branch deleted after merge');
559
+ } finally {
560
+ cleanup(base);
561
+ }
562
+ }
563
+
564
+ // ─── Summary ──────────────────────────────────────────────────────────
565
+ report();
566
+ }
567
+
568
+ // When run via vitest, wrap in test(); when run via tsx, call directly.
569
+ const isVitest = typeof globalThis !== 'undefined' && (globalThis as any).__vitest_worker__?.config?.defines != null && 'vitest' in (globalThis as any).__vitest_worker__.config.defines || process.env.VITEST;
570
+ if (isVitest) {
571
+ const { test } = await import('vitest');
572
+ test('integration-mixed-milestones: all groups pass', async () => {
573
+ await main();
574
+ });
575
+ } else {
576
+ main().catch((error) => {
577
+ console.error(error);
578
+ process.exit(1);
579
+ });
580
+ }