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,133 @@
1
+ // Tests for inlinePriorMilestoneSummary — the cross-milestone context bridging helper.
2
+ //
3
+ // Scenarios covered:
4
+ // (A) M002 with M001-SUMMARY.md present → returns string containing "Prior Milestone Summary" and summary content
5
+ // (B) M001 (no prior milestone in dir) → returns null
6
+ // (C) M002 with no M001-SUMMARY.md written → returns null
7
+ // (D) M003 with M002 dir present but no M002-SUMMARY.md → returns null
8
+
9
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
10
+ import { join, dirname } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { fileURLToPath } from 'node:url';
13
+
14
+ import { inlinePriorMilestoneSummary } from '../files.ts';
15
+ import { createTestContext } from './test-helpers.ts';
16
+
17
+ // ─── Worktree-aware prompt loader ──────────────────────────────────────────
18
+ const __dirname = dirname(fileURLToPath(import.meta.url));
19
+
20
+
21
+ const { assertEq, assertTrue, report } = createTestContext();
22
+ // ─── Fixture helpers ───────────────────────────────────────────────────────
23
+
24
+ function createFixtureBase(): string {
25
+ const base = mkdtempSync(join(tmpdir(), 'gsd-plan-ms-test-'));
26
+ mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
27
+ return base;
28
+ }
29
+
30
+ function writeMilestoneDir(base: string, mid: string): void {
31
+ mkdirSync(join(base, '.gsd', 'milestones', mid), { recursive: true });
32
+ }
33
+
34
+ function writeMilestoneSummary(base: string, mid: string, content: string): void {
35
+ const dir = join(base, '.gsd', 'milestones', mid);
36
+ mkdirSync(dir, { recursive: true });
37
+ writeFileSync(join(dir, `${mid}-SUMMARY.md`), content);
38
+ }
39
+
40
+ function cleanup(base: string): void {
41
+ rmSync(base, { recursive: true, force: true });
42
+ }
43
+
44
+ // ═══════════════════════════════════════════════════════════════════════════
45
+ // Tests
46
+ // ═══════════════════════════════════════════════════════════════════════════
47
+
48
+ async function main(): Promise<void> {
49
+
50
+ // ─── (A) M002 with M001-SUMMARY.md present ────────────────────────────────
51
+ console.log('\n── (A) M002 with M001-SUMMARY.md present → string containing "Prior Milestone Summary"');
52
+ {
53
+ const base = createFixtureBase();
54
+ try {
55
+ writeMilestoneDir(base, 'M001');
56
+ writeMilestoneDir(base, 'M002');
57
+ writeMilestoneSummary(base, 'M001', '# M001 Summary\n\nKey decisions: used TypeScript throughout.\n');
58
+
59
+ const result = await inlinePriorMilestoneSummary('M002', base);
60
+
61
+ assertTrue(result !== null, '(A) result is not null when prior milestone has SUMMARY');
62
+ assertTrue(
63
+ typeof result === 'string' && result.includes('Prior Milestone Summary'),
64
+ '(A) result contains "Prior Milestone Summary" label',
65
+ );
66
+ assertTrue(
67
+ typeof result === 'string' && result.includes('Key decisions: used TypeScript throughout.'),
68
+ '(A) result contains the summary file content',
69
+ );
70
+ } finally {
71
+ cleanup(base);
72
+ }
73
+ }
74
+
75
+ // ─── (B) M001 (no prior milestone in dir) ─────────────────────────────────
76
+ console.log('\n── (B) M001 — first milestone, no prior → null');
77
+ {
78
+ const base = createFixtureBase();
79
+ try {
80
+ writeMilestoneDir(base, 'M001');
81
+
82
+ const result = await inlinePriorMilestoneSummary('M001', base);
83
+
84
+ assertEq(result, null, '(B) M001 with no prior milestone → null');
85
+ } finally {
86
+ cleanup(base);
87
+ }
88
+ }
89
+
90
+ // ─── (C) M002 with no M001-SUMMARY.md ────────────────────────────────────
91
+ console.log('\n── (C) M002 with M001 dir but no M001-SUMMARY.md → null');
92
+ {
93
+ const base = createFixtureBase();
94
+ try {
95
+ writeMilestoneDir(base, 'M001');
96
+ writeMilestoneDir(base, 'M002');
97
+ // Intentionally do NOT write M001-SUMMARY.md
98
+
99
+ const result = await inlinePriorMilestoneSummary('M002', base);
100
+
101
+ assertEq(result, null, '(C) M002 when M001 has no SUMMARY file → null');
102
+ } finally {
103
+ cleanup(base);
104
+ }
105
+ }
106
+
107
+ // ─── (D) M003 with M002 dir but no M002-SUMMARY.md ───────────────────────
108
+ console.log('\n── (D) M003, M002 is immediately prior but has no SUMMARY → null');
109
+ {
110
+ const base = createFixtureBase();
111
+ try {
112
+ writeMilestoneDir(base, 'M001');
113
+ writeMilestoneDir(base, 'M002');
114
+ writeMilestoneDir(base, 'M003');
115
+ // M001 has a summary — but M002 (the immediately prior to M003) does NOT
116
+ writeMilestoneSummary(base, 'M001', '# M001 Summary\n\nOld context.\n');
117
+ // Intentionally do NOT write M002-SUMMARY.md
118
+
119
+ const result = await inlinePriorMilestoneSummary('M003', base);
120
+
121
+ assertEq(result, null, '(D) M003 when M002 (immediately prior) has no SUMMARY → null');
122
+ } finally {
123
+ cleanup(base);
124
+ }
125
+ }
126
+
127
+ report();
128
+ }
129
+
130
+ main().catch((error) => {
131
+ console.error(error);
132
+ process.exit(1);
133
+ });
@@ -0,0 +1,363 @@
1
+ import { validateTaskPlanContent, validateSlicePlanContent } from '../observability-validator.ts';
2
+ import { createTestContext } from './test-helpers.ts';
3
+
4
+ const { assertEq, assertTrue, report } = createTestContext();
5
+ // ═══════════════════════════════════════════════════════════════════════════
6
+ // validateTaskPlanContent — empty/missing Steps section
7
+ // ═══════════════════════════════════════════════════════════════════════════
8
+
9
+ console.log('\n=== validateTaskPlanContent: empty Steps section ===');
10
+ {
11
+ const content = `# T01: Some Task
12
+
13
+ ## Description
14
+
15
+ Do something useful.
16
+
17
+ ## Steps
18
+
19
+ ## Verification
20
+
21
+ - Run the tests and confirm output.
22
+ `;
23
+
24
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
25
+ const stepsIssues = issues.filter(i => i.ruleId === 'empty_steps_section');
26
+ assertTrue(stepsIssues.length >= 1, 'empty Steps section produces empty_steps_section issue');
27
+ if (stepsIssues.length > 0) {
28
+ assertEq(stepsIssues[0].severity, 'warning', 'empty_steps_section severity is warning');
29
+ assertEq(stepsIssues[0].scope, 'task-plan', 'empty_steps_section scope is task-plan');
30
+ }
31
+ }
32
+
33
+ console.log('\n=== validateTaskPlanContent: missing Steps section entirely ===');
34
+ {
35
+ const content = `# T01: Some Task
36
+
37
+ ## Description
38
+
39
+ Do something useful.
40
+
41
+ ## Verification
42
+
43
+ - Run the tests.
44
+ `;
45
+
46
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
47
+ const stepsIssues = issues.filter(i => i.ruleId === 'empty_steps_section');
48
+ assertTrue(stepsIssues.length >= 1, 'missing Steps section produces empty_steps_section issue');
49
+ }
50
+
51
+ // ═══════════════════════════════════════════════════════════════════════════
52
+ // validateTaskPlanContent — placeholder-only Verification
53
+ // ═══════════════════════════════════════════════════════════════════════════
54
+
55
+ console.log('\n=== validateTaskPlanContent: placeholder-only Verification ===');
56
+ {
57
+ const content = `# T01: Some Task
58
+
59
+ ## Steps
60
+
61
+ 1. Do the thing.
62
+ 2. Do the other thing.
63
+
64
+ ## Verification
65
+
66
+ - {{placeholder verification step}}
67
+ - {{another placeholder}}
68
+ `;
69
+
70
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
71
+ const verifyIssues = issues.filter(i => i.ruleId === 'placeholder_verification');
72
+ assertTrue(verifyIssues.length >= 1, 'placeholder-only Verification produces placeholder_verification issue');
73
+ if (verifyIssues.length > 0) {
74
+ assertEq(verifyIssues[0].severity, 'warning', 'placeholder_verification severity is warning');
75
+ assertEq(verifyIssues[0].scope, 'task-plan', 'placeholder_verification scope is task-plan');
76
+ }
77
+ }
78
+
79
+ console.log('\n=== validateTaskPlanContent: Verification with only template text ===');
80
+ {
81
+ const content = `# T01: Some Task
82
+
83
+ ## Steps
84
+
85
+ 1. Do the thing.
86
+
87
+ ## Verification
88
+
89
+ {{whatWasVerifiedAndHow — commands run, tests passed, behavior confirmed}}
90
+ `;
91
+
92
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
93
+ const verifyIssues = issues.filter(i => i.ruleId === 'placeholder_verification');
94
+ assertTrue(verifyIssues.length >= 1, 'template-text-only Verification produces placeholder_verification issue');
95
+ }
96
+
97
+ // ═══════════════════════════════════════════════════════════════════════════
98
+ // validateSlicePlanContent — empty inline task entries
99
+ // ═══════════════════════════════════════════════════════════════════════════
100
+
101
+ console.log('\n=== validateSlicePlanContent: empty inline task entries ===');
102
+ {
103
+ const content = `# S01: Some Slice
104
+
105
+ **Goal:** Build the thing.
106
+ **Demo:** It works.
107
+
108
+ ## Tasks
109
+
110
+ - [ ] **T01: First Task** \`est:20m\`
111
+
112
+ - [ ] **T02: Second Task** \`est:15m\`
113
+
114
+ ## Verification
115
+
116
+ - Run the tests.
117
+ `;
118
+
119
+ const issues = validateSlicePlanContent('S01-PLAN.md', content);
120
+ const emptyTaskIssues = issues.filter(i => i.ruleId === 'empty_task_entry');
121
+ assertTrue(emptyTaskIssues.length >= 1, 'task entries with no description produce empty_task_entry issue');
122
+ if (emptyTaskIssues.length > 0) {
123
+ assertEq(emptyTaskIssues[0].severity, 'warning', 'empty_task_entry severity is warning');
124
+ assertEq(emptyTaskIssues[0].scope, 'slice-plan', 'empty_task_entry scope is slice-plan');
125
+ }
126
+ }
127
+
128
+ console.log('\n=== validateSlicePlanContent: task entries with content are fine ===');
129
+ {
130
+ const content = `# S01: Some Slice
131
+
132
+ **Goal:** Build the thing.
133
+ **Demo:** It works.
134
+
135
+ ## Tasks
136
+
137
+ - [ ] **T01: First Task** \`est:20m\`
138
+ - Why: Because it matters.
139
+ - Files: \`src/index.ts\`
140
+ - Do: Implement the feature.
141
+
142
+ - [ ] **T02: Second Task** \`est:15m\`
143
+ - Why: Also important.
144
+ - Do: Add tests.
145
+
146
+ ## Verification
147
+
148
+ - Run the tests.
149
+ `;
150
+
151
+ const issues = validateSlicePlanContent('S01-PLAN.md', content);
152
+ const emptyTaskIssues = issues.filter(i => i.ruleId === 'empty_task_entry');
153
+ assertEq(emptyTaskIssues.length, 0, 'task entries with description content produce no empty_task_entry issues');
154
+ }
155
+
156
+ // ═══════════════════════════════════════════════════════════════════════════
157
+ // validateTaskPlanContent — scope_estimate over threshold
158
+ // ═══════════════════════════════════════════════════════════════════════════
159
+
160
+ console.log('\n=== validateTaskPlanContent: scope_estimate over threshold ===');
161
+ {
162
+ const content = `---
163
+ estimated_steps: 12
164
+ estimated_files: 15
165
+ ---
166
+
167
+ # T01: Big Task
168
+
169
+ ## Steps
170
+
171
+ 1. Step one.
172
+ 2. Step two.
173
+ 3. Step three.
174
+
175
+ ## Verification
176
+
177
+ - Check it works.
178
+ `;
179
+
180
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
181
+ const stepsOverIssues = issues.filter(i => i.ruleId === 'scope_estimate_steps_high');
182
+ const filesOverIssues = issues.filter(i => i.ruleId === 'scope_estimate_files_high');
183
+ assertTrue(stepsOverIssues.length >= 1, 'estimated_steps=12 (>=10) produces scope_estimate_steps_high issue');
184
+ assertTrue(filesOverIssues.length >= 1, 'estimated_files=15 (>=12) produces scope_estimate_files_high issue');
185
+ if (stepsOverIssues.length > 0) {
186
+ assertEq(stepsOverIssues[0].severity, 'warning', 'scope_estimate_steps_high severity is warning');
187
+ assertEq(stepsOverIssues[0].scope, 'task-plan', 'scope_estimate_steps_high scope is task-plan');
188
+ }
189
+ if (filesOverIssues.length > 0) {
190
+ assertEq(filesOverIssues[0].severity, 'warning', 'scope_estimate_files_high severity is warning');
191
+ }
192
+ }
193
+
194
+ // ═══════════════════════════════════════════════════════════════════════════
195
+ // validateTaskPlanContent — scope_estimate within limits
196
+ // ═══════════════════════════════════════════════════════════════════════════
197
+
198
+ console.log('\n=== validateTaskPlanContent: scope_estimate within limits ===');
199
+ {
200
+ const content = `---
201
+ estimated_steps: 4
202
+ estimated_files: 6
203
+ ---
204
+
205
+ # T01: Small Task
206
+
207
+ ## Steps
208
+
209
+ 1. Do the thing.
210
+
211
+ ## Verification
212
+
213
+ - Verify it works.
214
+ `;
215
+
216
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
217
+ const scopeIssues = issues.filter(i =>
218
+ i.ruleId === 'scope_estimate_steps_high' || i.ruleId === 'scope_estimate_files_high'
219
+ );
220
+ assertEq(scopeIssues.length, 0, 'scope_estimate within limits produces no scope issues');
221
+ }
222
+
223
+ // ═══════════════════════════════════════════════════════════════════════════
224
+ // validateTaskPlanContent — missing scope_estimate (no warning)
225
+ // ═══════════════════════════════════════════════════════════════════════════
226
+
227
+ console.log('\n=== validateTaskPlanContent: missing scope_estimate ===');
228
+ {
229
+ const content = `# T01: No Frontmatter Task
230
+
231
+ ## Steps
232
+
233
+ 1. Do the thing.
234
+
235
+ ## Verification
236
+
237
+ - Verify it works.
238
+ `;
239
+
240
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
241
+ const scopeIssues = issues.filter(i =>
242
+ i.ruleId === 'scope_estimate_steps_high' || i.ruleId === 'scope_estimate_files_high'
243
+ );
244
+ assertEq(scopeIssues.length, 0, 'missing scope_estimate produces no scope issues');
245
+ }
246
+
247
+ console.log('\n=== validateTaskPlanContent: frontmatter without scope keys ===');
248
+ {
249
+ const content = `---
250
+ id: T01
251
+ parent: S01
252
+ ---
253
+
254
+ # T01: Task With Other Frontmatter
255
+
256
+ ## Steps
257
+
258
+ 1. Do the thing.
259
+
260
+ ## Verification
261
+
262
+ - Verify it works.
263
+ `;
264
+
265
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
266
+ const scopeIssues = issues.filter(i =>
267
+ i.ruleId === 'scope_estimate_steps_high' || i.ruleId === 'scope_estimate_files_high'
268
+ );
269
+ assertEq(scopeIssues.length, 0, 'frontmatter without scope keys produces no scope issues');
270
+ }
271
+
272
+ // ═══════════════════════════════════════════════════════════════════════════
273
+ // Clean plans — no false positives
274
+ // ═══════════════════════════════════════════════════════════════════════════
275
+
276
+ console.log('\n=== Clean task plan: no plan-quality issues ===');
277
+ {
278
+ const content = `---
279
+ estimated_steps: 5
280
+ estimated_files: 3
281
+ ---
282
+
283
+ # T01: Well-Formed Task
284
+
285
+ ## Description
286
+
287
+ A real task with real content.
288
+
289
+ ## Steps
290
+
291
+ 1. Read the input files.
292
+ 2. Parse the configuration.
293
+ 3. Transform the data.
294
+ 4. Write the output.
295
+ 5. Verify the results.
296
+
297
+ ## Must-Haves
298
+
299
+ - [ ] Output file is valid JSON
300
+ - [ ] All input records are processed
301
+
302
+ ## Verification
303
+
304
+ - Run \`node --test tests/transform.test.ts\` — all assertions pass
305
+ - Manually inspect output.json for correct structure
306
+
307
+ ## Observability Impact
308
+
309
+ - Signals added/changed: structured error log on parse failure
310
+ - How a future agent inspects this: check stderr for JSON parse errors
311
+ - Failure state exposed: exit code 1 + error message on invalid input
312
+ `;
313
+
314
+ const issues = validateTaskPlanContent('T01-PLAN.md', content);
315
+ const planQualityIssues = issues.filter(i =>
316
+ i.ruleId === 'empty_steps_section' ||
317
+ i.ruleId === 'placeholder_verification' ||
318
+ i.ruleId === 'scope_estimate_steps_high' ||
319
+ i.ruleId === 'scope_estimate_files_high'
320
+ );
321
+ assertEq(planQualityIssues.length, 0, 'clean task plan produces no plan-quality issues');
322
+ }
323
+
324
+ console.log('\n=== Clean slice plan: no plan-quality issues ===');
325
+ {
326
+ const content = `# S01: Well-Formed Slice
327
+
328
+ **Goal:** Build a complete feature.
329
+ **Demo:** Run the test suite and see all green.
330
+
331
+ ## Tasks
332
+
333
+ - [ ] **T01: Create tests** \`est:20m\`
334
+ - Why: Tests define the contract before implementation.
335
+ - Files: \`tests/feature.test.ts\`
336
+ - Do: Write comprehensive test assertions.
337
+ - Verify: Test file runs without syntax errors.
338
+
339
+ - [ ] **T02: Implement feature** \`est:30m\`
340
+ - Why: Core implementation.
341
+ - Files: \`src/feature.ts\`
342
+ - Do: Build the feature to make tests pass.
343
+ - Verify: All tests pass.
344
+
345
+ ## Verification
346
+
347
+ - \`node --test tests/feature.test.ts\` — all assertions pass
348
+ - Check error output for diagnostic messages
349
+
350
+ ## Observability / Diagnostics
351
+
352
+ - Runtime signals: structured error objects with error codes
353
+ - Inspection surfaces: test output shows pass/fail counts
354
+ - Failure visibility: exit code 1 on failure with descriptive message
355
+ - Redaction constraints: none
356
+ `;
357
+
358
+ const issues = validateSlicePlanContent('S01-PLAN.md', content);
359
+ const planQualityIssues = issues.filter(i => i.ruleId === 'empty_task_entry');
360
+ assertEq(planQualityIssues.length, 0, 'clean slice plan produces no empty_task_entry issues');
361
+ }
362
+
363
+ report();