@opengsd/gsd-core 1.17.0 → 1.19.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 (369) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -1
  3. package/.opencode/plugins/gsd-core.js +2 -3
  4. package/agents/gsd-advisor-researcher.compact.md +1 -1
  5. package/agents/gsd-advisor-researcher.md +1 -1
  6. package/agents/gsd-assumptions-analyzer.compact.md +1 -1
  7. package/agents/gsd-assumptions-analyzer.md +1 -1
  8. package/agents/gsd-code-fixer.compact.md +3 -3
  9. package/agents/gsd-code-fixer.md +5 -4
  10. package/agents/gsd-code-reviewer.compact.md +1 -1
  11. package/agents/gsd-code-reviewer.md +1 -1
  12. package/agents/gsd-codebase-mapper.compact.md +1 -1
  13. package/agents/gsd-codebase-mapper.md +1 -1
  14. package/agents/gsd-debugger.md +1 -1
  15. package/agents/gsd-doc-verifier.compact.md +4 -4
  16. package/agents/gsd-doc-verifier.md +4 -3
  17. package/agents/gsd-doc-writer.compact.md +23 -5
  18. package/agents/gsd-doc-writer.md +19 -6
  19. package/agents/gsd-eval-auditor.compact.md +1 -1
  20. package/agents/gsd-eval-auditor.md +1 -1
  21. package/agents/gsd-executor.md +7 -3
  22. package/agents/gsd-integration-checker.compact.md +1 -1
  23. package/agents/gsd-integration-checker.md +1 -1
  24. package/agents/gsd-nyquist-auditor.compact.md +1 -1
  25. package/agents/gsd-nyquist-auditor.md +1 -1
  26. package/agents/gsd-phase-researcher.md +1 -1
  27. package/agents/gsd-plan-checker.md +2 -1
  28. package/agents/gsd-planner.md +5 -4
  29. package/agents/gsd-project-researcher.compact.md +1 -1
  30. package/agents/gsd-project-researcher.md +1 -1
  31. package/agents/gsd-research-synthesizer.compact.md +5 -5
  32. package/agents/gsd-research-synthesizer.md +5 -5
  33. package/agents/gsd-roadmapper.compact.md +1 -1
  34. package/agents/gsd-roadmapper.md +1 -1
  35. package/agents/gsd-security-auditor.compact.md +1 -1
  36. package/agents/gsd-security-auditor.md +1 -1
  37. package/agents/gsd-ui-auditor.compact.md +1 -1
  38. package/agents/gsd-ui-auditor.md +1 -1
  39. package/agents/gsd-ui-checker.compact.md +1 -1
  40. package/agents/gsd-ui-checker.md +1 -1
  41. package/agents/gsd-ui-researcher.compact.md +13 -1
  42. package/agents/gsd-ui-researcher.md +28 -1
  43. package/agents/gsd-verifier.md +2 -2
  44. package/bin/install.js +460 -105
  45. package/commands/gsd/code-review.md +8 -0
  46. package/commands/gsd/pause-work.md +1 -1
  47. package/gsd-core/bin/gsd-tools.cjs +124 -18
  48. package/gsd-core/bin/lib/agent-install-check.cjs +29 -3
  49. package/gsd-core/bin/lib/args-terminator.cjs +114 -0
  50. package/gsd-core/bin/lib/broken-windows.cjs +59 -1
  51. package/gsd-core/bin/lib/capability-ledger.cjs +25 -0
  52. package/gsd-core/bin/lib/capability-lock.cjs +41 -8
  53. package/gsd-core/bin/lib/capability-registry.cjs +162 -74
  54. package/gsd-core/bin/lib/capability-source.cjs +3 -1
  55. package/gsd-core/bin/lib/capability-state.cjs +20 -11
  56. package/gsd-core/bin/lib/capability-validator.cjs +23 -4
  57. package/gsd-core/bin/lib/commands.cjs +5 -1
  58. package/gsd-core/bin/lib/config-loader.cjs +13 -3
  59. package/gsd-core/bin/lib/config.cjs +256 -58
  60. package/gsd-core/bin/lib/core-utils.cjs +34 -0
  61. package/gsd-core/bin/lib/decision-coverage-support.cjs +93 -0
  62. package/gsd-core/bin/lib/gate-context-drift.cjs +8 -3
  63. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +21 -1
  64. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +19 -1
  65. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +134 -13
  66. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +23 -3
  67. package/gsd-core/bin/lib/gate-predicate.cjs +8 -12
  68. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +114 -18
  69. package/gsd-core/bin/lib/gate-ui-safety.cjs +23 -5
  70. package/gsd-core/bin/lib/git-info-exclude.cjs +57 -0
  71. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +18 -3
  72. package/gsd-core/bin/lib/health-diagnostic-types.cjs +4 -0
  73. package/gsd-core/bin/lib/health-diagnostic.cjs +52 -1
  74. package/gsd-core/bin/lib/host-integration.cjs +13 -6
  75. package/gsd-core/bin/lib/init.cjs +76 -5
  76. package/gsd-core/bin/lib/install-effort-resolver.cjs +2 -2
  77. package/gsd-core/bin/lib/install-engine.cjs +246 -32
  78. package/gsd-core/bin/lib/install-model-override-resolver.cjs +4 -3
  79. package/gsd-core/bin/lib/install-profiles.cjs +14 -7
  80. package/gsd-core/bin/lib/installer-migration-report.cjs +2 -0
  81. package/gsd-core/bin/lib/markdown-line-diff.cjs +147 -0
  82. package/gsd-core/bin/lib/markdown-sectionizer.cjs +113 -0
  83. package/gsd-core/bin/lib/milestone-lock.cjs +8 -1
  84. package/gsd-core/bin/lib/milestone-release-map.cjs +244 -0
  85. package/gsd-core/bin/lib/milestone-release-tags.cjs +440 -0
  86. package/gsd-core/bin/lib/milestone.cjs +43 -1
  87. package/gsd-core/bin/lib/model-catalog.cjs +8 -0
  88. package/gsd-core/bin/lib/normalize-test-command.cjs +67 -0
  89. package/gsd-core/bin/lib/phase-id.cjs +21 -4
  90. package/gsd-core/bin/lib/phase-lifecycle.cjs +37 -4
  91. package/gsd-core/bin/lib/phase.cjs +235 -37
  92. package/gsd-core/bin/lib/planning-snapshot.cjs +3 -1
  93. package/gsd-core/bin/lib/planning-workspace.cjs +18 -0
  94. package/gsd-core/bin/lib/pristine-baseline.cjs +11 -3
  95. package/gsd-core/bin/lib/read-only-git-env.cjs +58 -0
  96. package/gsd-core/bin/lib/report-parser.cjs +57 -1
  97. package/gsd-core/bin/lib/review-lane-descriptor.cjs +35 -2
  98. package/gsd-core/bin/lib/review-lane-invocation.cjs +40 -0
  99. package/gsd-core/bin/lib/review-lane-runner.cjs +33 -4
  100. package/gsd-core/bin/lib/review-reviewer-selection.cjs +20 -1
  101. package/gsd-core/bin/lib/roadmap-parser.cjs +12 -0
  102. package/gsd-core/bin/lib/roadmap-upgrade.cjs +39 -2
  103. package/gsd-core/bin/lib/roadmap.cjs +89 -30
  104. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +428 -16
  105. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +8 -4
  106. package/gsd-core/bin/lib/runtime-homes.cjs +18 -0
  107. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +60 -16
  108. package/gsd-core/bin/lib/shell-command-projection.cjs +123 -16
  109. package/gsd-core/bin/lib/smart-entry.cjs +37 -16
  110. package/gsd-core/bin/lib/state-contract.cjs +29 -9
  111. package/gsd-core/bin/lib/state-document.cjs +47 -5
  112. package/gsd-core/bin/lib/state-transition.cjs +150 -34
  113. package/gsd-core/bin/lib/state.cjs +140 -88
  114. package/gsd-core/bin/lib/surface.cjs +9 -0
  115. package/gsd-core/bin/lib/task-command-router.cjs +7 -28
  116. package/gsd-core/bin/lib/task-content-resolution.cjs +46 -1
  117. package/gsd-core/bin/lib/tdd-red-evidence.cjs +5 -0
  118. package/gsd-core/bin/lib/tdd-test-files.cjs +42 -0
  119. package/gsd-core/bin/lib/verification.cjs +96 -9
  120. package/gsd-core/bin/lib/verify.cjs +38 -1
  121. package/gsd-core/bin/lib/worktree-safety.cjs +22 -1
  122. package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
  123. package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
  124. package/gsd-core/references/agent-contracts.md +1 -1
  125. package/gsd-core/references/agent-skills-bootstrap.md +26 -7
  126. package/gsd-core/references/git-integration.md +14 -3
  127. package/gsd-core/references/loop-hook-dispatch.md +13 -6
  128. package/gsd-core/references/planner-reversibility.md +18 -4
  129. package/gsd-core/references/planner-verify-command-grounding.md +18 -0
  130. package/gsd-core/references/planning-config.md +2 -0
  131. package/gsd-core/references/tdd.md +5 -4
  132. package/gsd-core/references/verifier-phase-gates.md +8 -1
  133. package/gsd-core/templates/DEBUG.md +16 -0
  134. package/gsd-core/templates/config.json +2 -1
  135. package/gsd-core/templates/verification-report.md +1 -1
  136. package/gsd-core/workflows/add-backlog.md +10 -2
  137. package/gsd-core/workflows/add-phase.md +5 -1
  138. package/gsd-core/workflows/add-tests.md +5 -1
  139. package/gsd-core/workflows/add-todo.md +5 -1
  140. package/gsd-core/workflows/ai-integration-phase.md +5 -1
  141. package/gsd-core/workflows/audit-fix.md +2 -1
  142. package/gsd-core/workflows/audit-milestone.md +21 -9
  143. package/gsd-core/workflows/autonomous/templates/minimal-context.md +41 -0
  144. package/gsd-core/workflows/autonomous.md +52 -64
  145. package/gsd-core/workflows/check-todos.md +5 -1
  146. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +10 -1
  147. package/gsd-core/workflows/code-review-fix.md +5 -1
  148. package/gsd-core/workflows/code-review.md +66 -8
  149. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +5 -1
  150. package/gsd-core/workflows/complete-milestone/steps/project-md-evolution-review.md +145 -0
  151. package/gsd-core/workflows/complete-milestone/steps/release-map.md +80 -0
  152. package/gsd-core/workflows/complete-milestone.md +64 -157
  153. package/gsd-core/workflows/debug.md +5 -1
  154. package/gsd-core/workflows/diagnose-issues.md +34 -6
  155. package/gsd-core/workflows/discuss-phase/modes/chain.md +5 -1
  156. package/gsd-core/workflows/discuss-phase/modes/power.md +1 -1
  157. package/gsd-core/workflows/discuss-phase-assumptions.md +44 -5
  158. package/gsd-core/workflows/discuss-phase-power.md +19 -2
  159. package/gsd-core/workflows/discuss-phase.md +11 -11
  160. package/gsd-core/workflows/docs-update/detail/elaboration.md +7 -6
  161. package/gsd-core/workflows/docs-update.md +27 -5
  162. package/gsd-core/workflows/edit-phase.md +5 -1
  163. package/gsd-core/workflows/eval-review.md +11 -3
  164. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +5 -1
  165. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +13 -7
  166. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +19 -8
  167. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +21 -3
  168. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +18 -1
  169. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +7 -3
  170. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +11 -2
  171. package/gsd-core/workflows/execute-phase.md +46 -11
  172. package/gsd-core/workflows/execute-plan.md +8 -4
  173. package/gsd-core/workflows/extract-learnings.md +6 -2
  174. package/gsd-core/workflows/forensics.md +5 -1
  175. package/gsd-core/workflows/health.md +2 -1
  176. package/gsd-core/workflows/import.md +6 -2
  177. package/gsd-core/workflows/insert-phase.md +5 -1
  178. package/gsd-core/workflows/manager.md +10 -2
  179. package/gsd-core/workflows/map-codebase.md +5 -1
  180. package/gsd-core/workflows/milestone-summary.md +10 -2
  181. package/gsd-core/workflows/new-milestone.md +13 -5
  182. package/gsd-core/workflows/new-project.md +9 -5
  183. package/gsd-core/workflows/next.md +8 -4
  184. package/gsd-core/workflows/pause-work.md +3 -3
  185. package/gsd-core/workflows/plan-phase/steps/auto-advance-check.md +70 -0
  186. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +7 -3
  187. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +6 -2
  188. package/gsd-core/workflows/plan-phase.md +54 -86
  189. package/gsd-core/workflows/plan-review-convergence.md +17 -5
  190. package/gsd-core/workflows/plant-seed.md +8 -4
  191. package/gsd-core/workflows/progress.md +6 -2
  192. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +1 -1
  193. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +8 -1
  194. package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +2 -1
  195. package/gsd-core/workflows/quick-batch.md +5 -1
  196. package/gsd-core/workflows/quick.md +23 -8
  197. package/gsd-core/workflows/remove-phase.md +5 -1
  198. package/gsd-core/workflows/resume-project.md +5 -1
  199. package/gsd-core/workflows/review.md +22 -15
  200. package/gsd-core/workflows/scan.md +5 -1
  201. package/gsd-core/workflows/section-manifest.json +5 -0
  202. package/gsd-core/workflows/secure-phase.md +6 -2
  203. package/gsd-core/workflows/settings.md +4 -3
  204. package/gsd-core/workflows/ship.md +16 -14
  205. package/gsd-core/workflows/spec-phase.md +3 -6
  206. package/gsd-core/workflows/thread.md +10 -2
  207. package/gsd-core/workflows/transition.md +5 -1
  208. package/gsd-core/workflows/ui-phase.md +5 -1
  209. package/gsd-core/workflows/ui-review.md +6 -2
  210. package/gsd-core/workflows/ultraplan-phase.md +5 -1
  211. package/gsd-core/workflows/update.md +5 -1
  212. package/gsd-core/workflows/validate-phase.md +6 -2
  213. package/gsd-core/workflows/verify-work/detail/elaboration.md +1 -1
  214. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -1
  215. package/gsd-core/workflows/verify-work.md +15 -6
  216. package/hooks/dist/gsd-agent-isolation-guard.js +14 -2
  217. package/hooks/dist/gsd-cursor-subagent-start.js +8 -3
  218. package/hooks/dist/gsd-path-export.js +95 -0
  219. package/hooks/dist/gsd-secret-read-guard.js +244 -53
  220. package/hooks/dist/gsd-statusline.js +35 -2
  221. package/hooks/dist/gsd-validate-commit.sh +27 -5
  222. package/hooks/dist/gsd-windsurf-pre-write.js +28 -1
  223. package/hooks/dist/gsd-workflow-guard.js +1 -1
  224. package/hooks/dist/gsd-worktree-path-guard.js +28 -1
  225. package/hooks/dist/lib/isolation-sentinel.js +44 -0
  226. package/hooks/dist/managed-hooks-registry.cjs +1 -0
  227. package/hooks/gsd-agent-isolation-guard.js +14 -2
  228. package/hooks/gsd-cursor-subagent-start.js +8 -3
  229. package/hooks/gsd-path-export.js +95 -0
  230. package/hooks/gsd-secret-read-guard.js +244 -53
  231. package/hooks/gsd-statusline.js +35 -2
  232. package/hooks/gsd-validate-commit.sh +27 -5
  233. package/hooks/gsd-windsurf-pre-write.js +28 -1
  234. package/hooks/gsd-workflow-guard.js +1 -1
  235. package/hooks/gsd-worktree-path-guard.js +28 -1
  236. package/hooks/hooks.json +1 -0
  237. package/hooks/lib/isolation-sentinel.js +44 -0
  238. package/hooks/managed-hooks-registry.cjs +1 -0
  239. package/package.json +13 -6
  240. package/pi/gsd.cjs +1047 -10
  241. package/pi/package-agents/gsd-advisor-researcher.md +113 -0
  242. package/pi/package-agents/gsd-ai-researcher.md +111 -0
  243. package/pi/package-agents/gsd-assumptions-analyzer.md +110 -0
  244. package/pi/package-agents/gsd-code-fixer.md +769 -0
  245. package/pi/package-agents/gsd-code-reviewer.md +402 -0
  246. package/pi/package-agents/gsd-codebase-mapper.md +850 -0
  247. package/pi/package-agents/gsd-debug-session-manager.md +416 -0
  248. package/pi/package-agents/gsd-debugger.md +1274 -0
  249. package/pi/package-agents/gsd-doc-classifier.md +269 -0
  250. package/pi/package-agents/gsd-doc-synthesizer.md +259 -0
  251. package/pi/package-agents/gsd-doc-verifier.md +212 -0
  252. package/pi/package-agents/gsd-doc-writer.md +626 -0
  253. package/pi/package-agents/gsd-dom-verifier.md +164 -0
  254. package/pi/package-agents/gsd-domain-researcher.md +144 -0
  255. package/pi/package-agents/gsd-eval-auditor.md +185 -0
  256. package/pi/package-agents/gsd-eval-planner.md +149 -0
  257. package/pi/package-agents/gsd-executor.md +894 -0
  258. package/pi/package-agents/gsd-framework-selector.md +159 -0
  259. package/pi/package-agents/gsd-integration-checker.md +476 -0
  260. package/pi/package-agents/gsd-intel-updater.md +338 -0
  261. package/pi/package-agents/gsd-mempalace-curator.md +49 -0
  262. package/pi/package-agents/gsd-nyquist-auditor.md +200 -0
  263. package/pi/package-agents/gsd-pattern-mapper.md +340 -0
  264. package/pi/package-agents/gsd-phase-researcher.md +897 -0
  265. package/pi/package-agents/gsd-plan-checker.md +1077 -0
  266. package/pi/package-agents/gsd-planner.md +1003 -0
  267. package/pi/package-agents/gsd-project-researcher.md +611 -0
  268. package/pi/package-agents/gsd-research-synthesizer.md +259 -0
  269. package/pi/package-agents/gsd-roadmapper.md +779 -0
  270. package/pi/package-agents/gsd-security-auditor.md +171 -0
  271. package/pi/package-agents/gsd-ui-auditor.md +581 -0
  272. package/pi/package-agents/gsd-ui-checker.md +417 -0
  273. package/pi/package-agents/gsd-ui-researcher.md +469 -0
  274. package/pi/package-agents/gsd-user-profiler.md +174 -0
  275. package/pi/package-agents/gsd-verifier.md +963 -0
  276. package/pi/package-agents/manifest.json +39 -0
  277. package/pi/package-skills/gsd-add-tests/SKILL.md +39 -0
  278. package/pi/package-skills/gsd-ai-integration-phase/SKILL.md +36 -0
  279. package/pi/package-skills/gsd-audit-fix/SKILL.md +34 -0
  280. package/pi/package-skills/gsd-audit-milestone/SKILL.md +40 -0
  281. package/pi/package-skills/gsd-audit-uat/SKILL.md +26 -0
  282. package/pi/package-skills/gsd-autonomous/SKILL.md +52 -0
  283. package/pi/package-skills/gsd-capture/SKILL.md +68 -0
  284. package/pi/package-skills/gsd-cleanup/SKILL.md +25 -0
  285. package/pi/package-skills/gsd-code-review/SKILL.md +71 -0
  286. package/pi/package-skills/gsd-complete-milestone/SKILL.md +147 -0
  287. package/pi/package-skills/gsd-config/SKILL.md +60 -0
  288. package/pi/package-skills/gsd-debug/SKILL.md +64 -0
  289. package/pi/package-skills/gsd-discuss-phase/SKILL.md +74 -0
  290. package/pi/package-skills/gsd-docs-update/SKILL.md +50 -0
  291. package/pi/package-skills/gsd-eval-review/SKILL.md +35 -0
  292. package/pi/package-skills/gsd-execute-phase/SKILL.md +62 -0
  293. package/pi/package-skills/gsd-explore/SKILL.md +26 -0
  294. package/pi/package-skills/gsd-extract-learnings/SKILL.md +25 -0
  295. package/pi/package-skills/gsd-fast/SKILL.md +33 -0
  296. package/pi/package-skills/gsd-forensics/SKILL.md +59 -0
  297. package/pi/package-skills/gsd-graphify/SKILL.md +210 -0
  298. package/pi/package-skills/gsd-health/SKILL.md +36 -0
  299. package/pi/package-skills/gsd-help/SKILL.md +37 -0
  300. package/pi/package-skills/gsd-import/SKILL.md +46 -0
  301. package/pi/package-skills/gsd-inbox/SKILL.md +42 -0
  302. package/pi/package-skills/gsd-ingest-docs/SKILL.md +43 -0
  303. package/pi/package-skills/gsd-manager/SKILL.md +46 -0
  304. package/pi/package-skills/gsd-map-codebase/SKILL.md +85 -0
  305. package/pi/package-skills/gsd-mempalace-capture/SKILL.md +111 -0
  306. package/pi/package-skills/gsd-mempalace-recall/SKILL.md +111 -0
  307. package/pi/package-skills/gsd-milestone-summary/SKILL.md +54 -0
  308. package/pi/package-skills/gsd-mvp-phase/SKILL.md +45 -0
  309. package/pi/package-skills/gsd-new-milestone/SKILL.md +49 -0
  310. package/pi/package-skills/gsd-new-project/SKILL.md +49 -0
  311. package/pi/package-skills/gsd-next/SKILL.md +34 -0
  312. package/pi/package-skills/gsd-ns-context/SKILL.md +31 -0
  313. package/pi/package-skills/gsd-ns-ideate/SKILL.md +30 -0
  314. package/pi/package-skills/gsd-ns-manage/SKILL.md +42 -0
  315. package/pi/package-skills/gsd-ns-project/SKILL.md +34 -0
  316. package/pi/package-skills/gsd-ns-review/SKILL.md +35 -0
  317. package/pi/package-skills/gsd-ns-workflow/SKILL.md +44 -0
  318. package/pi/package-skills/gsd-onboard/SKILL.md +46 -0
  319. package/pi/package-skills/gsd-pause-work/SKILL.md +48 -0
  320. package/pi/package-skills/gsd-phase/SKILL.md +61 -0
  321. package/pi/package-skills/gsd-plan-phase/SKILL.md +62 -0
  322. package/pi/package-skills/gsd-plan-review-convergence/SKILL.md +63 -0
  323. package/pi/package-skills/gsd-pr-branch/SKILL.md +31 -0
  324. package/pi/package-skills/gsd-profile-user/SKILL.md +48 -0
  325. package/pi/package-skills/gsd-progress/SKILL.md +51 -0
  326. package/pi/package-skills/gsd-quick/SKILL.md +179 -0
  327. package/pi/package-skills/gsd-quick-batch/SKILL.md +114 -0
  328. package/pi/package-skills/gsd-resume-work/SKILL.md +31 -0
  329. package/pi/package-skills/gsd-review/SKILL.md +50 -0
  330. package/pi/package-skills/gsd-review-backlog/SKILL.md +65 -0
  331. package/pi/package-skills/gsd-secure-phase/SKILL.md +37 -0
  332. package/pi/package-skills/gsd-settings/SKILL.md +30 -0
  333. package/pi/package-skills/gsd-ship/SKILL.md +27 -0
  334. package/pi/package-skills/gsd-sketch/SKILL.md +56 -0
  335. package/pi/package-skills/gsd-spec-phase/SKILL.md +63 -0
  336. package/pi/package-skills/gsd-spike/SKILL.md +53 -0
  337. package/pi/package-skills/gsd-stats/SKILL.md +22 -0
  338. package/pi/package-skills/gsd-surface/SKILL.md +177 -0
  339. package/pi/package-skills/gsd-thread/SKILL.md +29 -0
  340. package/pi/package-skills/gsd-ui-phase/SKILL.md +35 -0
  341. package/pi/package-skills/gsd-ui-review/SKILL.md +35 -0
  342. package/pi/package-skills/gsd-ultraplan-phase/SKILL.md +38 -0
  343. package/pi/package-skills/gsd-undo/SKILL.md +38 -0
  344. package/pi/package-skills/gsd-update/SKILL.md +51 -0
  345. package/pi/package-skills/gsd-validate-phase/SKILL.md +37 -0
  346. package/pi/package-skills/gsd-verify-work/SKILL.md +41 -0
  347. package/pi/package-skills/gsd-workspace/SKILL.md +57 -0
  348. package/pi/package-skills/gsd-workstreams/SKILL.md +73 -0
  349. package/scripts/audit-workflow-script-paths.cjs +1 -1
  350. package/scripts/build-hooks.js +4 -0
  351. package/scripts/command-contract-helpers.cjs +1 -1
  352. package/scripts/diagnose-windows-spawn-watcher.cjs +317 -0
  353. package/scripts/docs-guard-registry.cjs +22 -7
  354. package/scripts/gen-health-docs.cjs +13 -1
  355. package/scripts/gen-pi-package-skills.cjs +217 -0
  356. package/scripts/lib/macos-conformance-tier.generated.cjs +19 -0
  357. package/scripts/lib/platform-conformance-tier.generated.cjs +41 -0
  358. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +3 -3
  359. package/scripts/lint-phase-arg-assignment.cjs +2 -2
  360. package/scripts/lint-retired-runtime-name.cjs +5 -0
  361. package/scripts/lint-workflow-shellcheck-baseline.json +16 -16
  362. package/scripts/npm-audit-baseline.cjs +41 -7
  363. package/scripts/release-tarball-smoke.cjs +1 -0
  364. package/scripts/reviewed-or-maintainer-policy.cjs +181 -0
  365. package/scripts/select-docs-guards.cjs +1 -1
  366. package/scripts/self-test-report-policy.cjs +350 -0
  367. package/skills/gsd-code-review/SKILL.md +8 -0
  368. package/skills/gsd-pause-work/SKILL.md +1 -1
  369. package/vscode/package.json +1 -1
@@ -1075,6 +1075,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1075
1075
  // refusal below declines with the analyzer's own `missing_phase_details`
1076
1076
  // vocabulary and leaves ROADMAP.md byte-identical.
1077
1077
  let missingPhaseDetails = false;
1078
+ const warnings = [];
1078
1079
  withPlanningLock(cwd, () => {
1079
1080
  // #3957 (B9.4): captured BEFORE any transform runs, so the write/report
1080
1081
  // decision below reflects whether the transforms actually changed
@@ -1110,13 +1111,26 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1110
1111
  // Heading target: the exact grammar `planSectionPattern` /
1111
1112
  // `insertRowsPatternA|B` anchor on (an ATX phase heading for this phase).
1112
1113
  const headingTargetFound = new RegExp(phaseHeadingAnchor, 'i').test(gateActiveRegion);
1114
+ // #5545: the phase-checklist bullet grammar, defined ONCE for the writer
1115
+ // (an unchecked bullet to tick) and the gate probe (`anyState`).
1116
+ // Line-anchored, with only an optional `**` before the label and horizontal
1117
+ // whitespace, so a bullet that merely MENTIONS "Phase N" is not the phase's
1118
+ // bullet and no `\s` can run past the line end (which used to land the
1119
+ // `(completed …)` annotation on the NEXT line). A decorated bullet (emoji,
1120
+ // blockquote, link) is deliberately NOT the phase's bullet either — the
1121
+ // same narrowing #4965 made for `roadmap analyze`'s checklist reader.
1122
+ // The lookahead only PEEKS (its `\s` may see a newline but consumes none):
1123
+ // the label must be followed by `:`, whitespace or the end of the line, so
1124
+ // `Phase 2.1` / `Phase 20` are not `Phase 2`. Capture group 1 is the opening
1125
+ // `- [`, group 2 the rest of the line after the box.
1126
+ const phaseChecklistBullet = (anyState) => new RegExp(`^([ \\t]*-[ \\t]*\\[)${anyState ? '[ x]' : ' '}(\\][ \\t]*(?:\\*\\*)?[ \\t]*Phase[ \\t]+${phasePattern}${OPTIONAL_PHASE_TAG_SOURCE}(?=[:\\s]|$)[^\\n]*)`, 'im');
1113
1127
  // Checklist target: when the phase is complete, its own checklist bullet
1114
1128
  // (`- [ ] **Phase N: …**`) IS a writable phase row — the completion
1115
1129
  // checkbox stamp below updates it. Same grammar as that writer, widened
1116
1130
  // one notch to `[ x]` so an ALREADY-checked bullet still counts as a
1117
1131
  // found target: an idempotent re-run then takes the honest
1118
1132
  // "no changes were needed" decline instead of this refusal.
1119
- const checklistTargetFound = isComplete && new RegExp(`-\\s*\\[[ x]\\]\\s*.*Phase\\s+${phasePattern}${OPTIONAL_PHASE_TAG_SOURCE}[:\\s]`, 'i').test(gateActiveRegion);
1133
+ const checklistTargetFound = isComplete && phaseChecklistBullet(true).test(gateActiveRegion);
1120
1134
  // Table-row target: set by the row-scoped cell updates below.
1121
1135
  let tableRowFound = false;
1122
1136
  // Progress table row: update Plans Complete/Status/Completed columns BY
@@ -1190,6 +1204,16 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1190
1204
  }
1191
1205
  return text;
1192
1206
  });
1207
+ // #4947: a word-prefixed Phase cell (`Phase 68`) is deliberately not a
1208
+ // writable table target (#4247 — the read side ignores it too), but when the
1209
+ // phase's heading section is still written the command reports
1210
+ // `updated: true` and the unwritten Status cell looked like a silent bug.
1211
+ // The row stays byte-identical; the output now says so.
1212
+ const wordPrefixedCellRe = new RegExp(`^Phase\\s+${phasePattern}\\.?(?:\\s|$)`, 'i');
1213
+ const progressTable = tableRowFound ? null : (0, markdown_table_cjs_1.findTableWithColumns)(gateActiveRegion, ['Phase', 'Status']);
1214
+ if (progressTable && progressTable.rows.some((row) => wordPrefixedCellRe.test((row['Phase'] ?? '').trim()))) {
1215
+ warnings.push(`Progress table row for phase ${formatDiagnosticToken(String(phaseNum))} was not updated: its Phase cell is word-prefixed ("Phase N"), and only a bare phase number (N or N.) is recognized. Edit that row by hand or rewrite the cell as the bare number.`);
1216
+ }
1193
1217
  // Update plan count in phase detail section.
1194
1218
  // Three recognised forms (all tolerated; canonical template uses the first):
1195
1219
  // `**Plans**: N plans` — bold word + outer colon (gsd-core/templates/roadmap.md)
@@ -1247,6 +1271,13 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1247
1271
  // wording, so it correctly falls through to arm 3 untouched. Kept as a
1248
1272
  // caller-side classifier (NOT seam grammar) reused below against the
1249
1273
  // `boldField` node's own parsed `value`.
1274
+ // #4947: a value that is exactly `TBD` is the planner's own "no plans yet"
1275
+ // marker, not an operator annotation — once plans exist it contradicts the
1276
+ // checklist this verb inserts right under it. `TBD — note` keeps its note
1277
+ // (row 5): on the bold path the note is the node's trailing span, which the
1278
+ // caller checks is empty; on the plain path the note is part of the value,
1279
+ // so the whole-value comparison already excludes it.
1280
+ const isBareTbd = (value) => value.trim() === 'TBD';
1250
1281
  const isTemplatePlaceholder = (value) => {
1251
1282
  const trimmed = value.trim();
1252
1283
  return /^\[\s*Number of plans\b[\s\S]*\]$/i.test(trimmed);
@@ -1272,6 +1303,35 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1272
1303
  const m = value.match(/^\d+\s+plans?/i);
1273
1304
  return m ? m[0].length : -1;
1274
1305
  };
1306
+ // #4947: the pending-plan clause a human or planner glues after the count
1307
+ // (`; 2 gap-closure plans pending (48-18, 48-19)`) is DERIVED from the same
1308
+ // plan/summary facts this verb already computes, so a completed plan left
1309
+ // listed as pending contradicts the count the verb just wrote. The verb
1310
+ // owns that one clause: ids that now have a SUMMARY.md are removed, the
1311
+ // number is recounted, and an emptied clause is dropped. Everything else in
1312
+ // the tail (`in 11 waves`, free prose) stays the operator's — a wave total
1313
+ // does not change when a plan completes. A clause whose ids are not all
1314
+ // plan ids (`(see backlog)`) is not provably derived, so it is left alone.
1315
+ const summarizedPlanIds = new Set(phaseInfo.summaries
1316
+ .map((summaryFile) => summaryFile.replace('-SUMMARY.md', '').replace('SUMMARY.md', ''))
1317
+ .filter((id) => id !== ''));
1318
+ const pendingClauseRe = /;[ \t]*(\d+)[ \t]+((?:[\w-]+[ \t]+)*?)plans?[ \t]+pending[ \t]*\(([^()\r\n]*)\)/i;
1319
+ const planIdShape = /^\d+(?:\.\d+)?-\d+(?:\.\d+)?$/;
1320
+ const reconcilePendingClause = (tail) => {
1321
+ const m = pendingClauseRe.exec(tail);
1322
+ if (!m)
1323
+ return tail;
1324
+ const ids = m[3].split(',').map((id) => id.trim());
1325
+ if (ids.length === 0 || !ids.every((id) => planIdShape.test(id)))
1326
+ return tail;
1327
+ const stillPending = ids.filter((id) => !summarizedPlanIds.has(id));
1328
+ if (stillPending.length === ids.length)
1329
+ return tail;
1330
+ const replacement = stillPending.length === 0
1331
+ ? ''
1332
+ : `; ${stillPending.length} ${m[2]}plan${stillPending.length === 1 ? '' : 's'} pending (${stillPending.join(', ')})`;
1333
+ return tail.slice(0, m.index) + replacement + tail.slice(m.index + m[0].length);
1334
+ };
1275
1335
  roadmapContent = replaceInCurrentMilestone(roadmapContent, planSectionPattern, (sectionText) => {
1276
1336
  const parsed = (0, planning_document_cjs_1.parsePlanningDoc)(sectionText, 'ROADMAP.md');
1277
1337
  if (!parsed.ok) {
@@ -1302,12 +1362,12 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1302
1362
  const plainFractionLen = fractionCountPrefixLength(plainValue);
1303
1363
  const plainBareLen = bareCountPrefixLength(plainValue);
1304
1364
  const plainCountPrefixLen = plainFractionLen >= 0 ? plainFractionLen : plainBareLen;
1305
- if (plainCountPrefixLen < 0 && !isTemplatePlaceholder(plainValue)) {
1365
+ if (plainCountPrefixLen < 0 && !isTemplatePlaceholder(plainValue) && !isBareTbd(plainValue)) {
1306
1366
  // Arm 3: freeform prose, TBD, a bracketed human annotation, or an
1307
1367
  // empty value — leave the section exactly as it was.
1308
1368
  return sectionText;
1309
1369
  }
1310
- const plainSuffix = plainCountPrefixLen >= 0 ? plainValue.slice(plainCountPrefixLen) : '';
1370
+ const plainSuffix = plainCountPrefixLen >= 0 ? reconcilePendingClause(plainValue.slice(plainCountPrefixLen)) : '';
1311
1371
  const newPlainLine = `${indent}Plans:${spacing}${planCountText}${plainSuffix}`;
1312
1372
  const start = plainMatch.index ?? sectionText.indexOf(whole);
1313
1373
  return sectionText.slice(0, start) + newPlainLine + sectionText.slice(start + whole.length);
@@ -1320,7 +1380,11 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1320
1380
  const fractionPrefixLen = fractionCountPrefixLength(currentValue);
1321
1381
  const barePrefixLen = bareCountPrefixLength(currentValue);
1322
1382
  const countPrefixLen = fractionPrefixLen >= 0 ? fractionPrefixLen : barePrefixLen;
1323
- if (countPrefixLen < 0 && !isTemplatePlaceholder(currentValue)) {
1383
+ const fieldNode = parsed.value.nodes.find((n) => n.id === fieldId);
1384
+ const trailingText = fieldNode && fieldNode.kind === 'boldField'
1385
+ ? parsed.value.source.slice(fieldNode.trailingSpan.start, fieldNode.trailingSpan.end)
1386
+ : '';
1387
+ if (countPrefixLen < 0 && !isTemplatePlaceholder(currentValue) && !(isBareTbd(currentValue) && trailingText.trim() === '')) {
1324
1388
  // Arm 3: freeform prose, TBD, a bracketed human annotation, or an
1325
1389
  // empty value — leave the section exactly as it was.
1326
1390
  return sectionText;
@@ -1331,7 +1395,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1331
1395
  // `setFieldValue`'s valueSpan/trailingSpan split additionally preserves
1332
1396
  // any EM-DASH-separated trailing annotation (#2853) automatically — no
1333
1397
  // separate "preserve trailing" branch needed for that shape.
1334
- const suffix = countPrefixLen >= 0 ? currentValue.slice(countPrefixLen) : '';
1398
+ const suffix = countPrefixLen >= 0 ? reconcilePendingClause(currentValue.slice(countPrefixLen)) : '';
1335
1399
  const newValueToWrite = planCountText + suffix;
1336
1400
  const staged = (0, planning_document_cjs_1.setFieldValue)(parsed.value, fieldId, newValueToWrite);
1337
1401
  if (!staged.ok) {
@@ -1348,24 +1412,25 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1348
1412
  });
1349
1413
  // If complete: check checkbox
1350
1414
  if (isComplete) {
1351
- const checkboxPattern = new RegExp(`(-\\s*\\[)[ ](\\]\\s*.*Phase\\s+${phasePattern}${OPTIONAL_PHASE_TAG_SOURCE}[:\\s][^\\n]*)`, 'i');
1352
- roadmapContent = replaceInCurrentMilestone(roadmapContent, checkboxPattern, `$1x$2 (completed ${today})`);
1415
+ roadmapContent = replaceInCurrentMilestone(roadmapContent, phaseChecklistBullet(false), `$1x$2 (completed ${today})`);
1353
1416
  }
1354
1417
  // Mark completed plan checkboxes (e.g. "- [ ] 50-01-PLAN.md", "- [ ] 50-01:", or "- [ ] **50-01**")
1355
1418
  // #4741: tick only plans the phase's own COUNT still counts. `plans` is the
1356
1419
  // superseded-filtered set (#2349 via scanPhasePlans) while `summaries` is
1357
1420
  // the raw *-SUMMARY.md listing — a superseded plan can carry a SUMMARY
1358
1421
  // (e.g. `status: halted`), and ticking it read as "executed" right under a
1359
- // count line that excludes it. The prefix match mirrors the checkbox regex
1360
- // below (rows match by planId prefix, which the PLAN-01.md naming shape
1361
- // relies on), so non-superseded plans tick exactly as before.
1422
+ // count line that excludes it. #5542: a summary belongs to a live plan only
1423
+ // by the SAME pairing rule the counts use (`summaryCandidates` via
1424
+ // `countMatchedSummaries`), never by id prefix — a leftover `47-1` summary
1425
+ // must not survive because a live `47-10` plan starts with `47-1`. Rows
1426
+ // match the id up to a boundary (`planRowPattern`), so `47-1` never ticks
1427
+ // `47-10-PLAN.md`.
1362
1428
  const tickableSummaries = phaseInfo.summaries
1363
1429
  .map((summaryFile) => ({ summaryFile, planId: summaryFile.replace('-SUMMARY.md', '').replace('SUMMARY.md', '') }))
1364
- .filter(({ planId }) => planId !== '' && phaseInfo.plans.some((planFile) => planFile.startsWith(planId)));
1430
+ .filter(({ summaryFile, planId }) => planId !== ''
1431
+ && coreUtils.summaryPairsWithAnyPlan(phaseInfo.plans, summaryFile));
1365
1432
  for (const { planId } of tickableSummaries) {
1366
- const planEscaped = (0, pattern_cjs_1.escapeRegex)(planId);
1367
- const planCheckboxPattern = new RegExp(`(-\\s*\\[) (\\]\\s*(?:\\*\\*)?${planEscaped}(?:\\*\\*)?)`, 'i');
1368
- roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
1433
+ roadmapContent = roadmapContent.replace(coreUtils.planRowPattern(planId), '$1x$2');
1369
1434
  }
1370
1435
  // Compute the active (post-</details>) region offset ONCE. Both the
1371
1436
  // missing-plan DETECTION and the row INSERTION must use the same active
@@ -1389,23 +1454,19 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1389
1454
  //
1390
1455
  // #4786: a plan row may be written WITH the `-PLAN.md` suffix (canonical
1391
1456
  // template form) or WITHOUT it (hand-written form: `- [x] 659-01 — desc`).
1392
- // The tick loop above keys on the bare planId stem with a PREFIX match
1393
- // (pre-existing, out of scope here), while detection required the full
1394
- // `-PLAN.md` filename — so every suffix-less row was counted missing and
1395
- // the insertion fired BESIDE the recognized list — 32 checkbox lines for
1396
- // 16 plans, exit 0. The stem arm below accepts the bare id only up to a
1397
- // boundary (whitespace / `:` / dashes / `-PLAN.md` / `.md` / `**` / `)`),
1398
- // so `5-011` never satisfies `5-01`. Deliberately NOT in the boundary set:
1399
- // `.` — a dotted sub-id (`5-01.5`) is a real distinct plan, and counting
1400
- // its row as 5-01's presence would suppress a genuine insertion.
1457
+ // The tick loop above keys on the bare planId stem, while detection required
1458
+ // the full `-PLAN.md` filename — so every suffix-less row was counted
1459
+ // missing and the insertion fired BESIDE the recognized list — 32 checkbox
1460
+ // lines for 16 plans, exit 0. The stem arm below accepts the bare id only
1461
+ // up to the SAME boundary the tick loop uses (`planRowPattern`, #5542), so
1462
+ // `5-011` never satisfies `5-01` and a dotted sub-id (`5-01.5`) is a real
1463
+ // distinct plan whose row does not count as 5-01's presence.
1401
1464
  const missingPlans = phaseInfo.plans.filter((planFile) => {
1402
1465
  const planEscaped = (0, pattern_cjs_1.escapeRegex)(planFile);
1403
1466
  if (new RegExp(`-\\s*\\[[x ]\\]\\s*(?:\\*\\*)?${planEscaped}`, 'i').test(activeRegion))
1404
1467
  return false;
1405
1468
  const stem = planFile.replace(/-PLAN\.md$/i, '');
1406
- const stemEscaped = (0, pattern_cjs_1.escapeRegex)(stem);
1407
- const stemPresent = new RegExp(`-\\s*\\[[x ]\\]\\s*(?:\\*\\*)?${stemEscaped}(?=$|\\s|:|—|–|-PLAN\\.md|\\.md|\\*\\*|\\))`, 'i').test(activeRegion);
1408
- return !stemPresent;
1469
+ return !coreUtils.planRowPattern(stem, { anyState: true }).test(activeRegion);
1409
1470
  });
1410
1471
  if (missingPlans.length > 0) {
1411
1472
  // Insert missing plan checklist rows (#1163). We prefer to anchor to the
@@ -1451,9 +1512,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1451
1512
  // (#4741: same superseded-filtered tick list as the loop above — a
1452
1513
  // pre-existing superseded row must stay unchecked on this path too).
1453
1514
  for (const { planId } of tickableSummaries) {
1454
- const planEscaped = (0, pattern_cjs_1.escapeRegex)(planId);
1455
- const planCheckboxPattern = new RegExp(`(-\\s*\\[) (\\]\\s*(?:\\*\\*)?${planEscaped}(?:\\*\\*)?)`, 'i');
1456
- roadmapContent = roadmapContent.replace(planCheckboxPattern, '$1x$2');
1515
+ roadmapContent = roadmapContent.replace(coreUtils.planRowPattern(planId), '$1x$2');
1457
1516
  }
1458
1517
  }
1459
1518
  }
@@ -1490,7 +1549,7 @@ function cmdRoadmapUpdatePlanProgress(cwd, phaseNum, raw) {
1490
1549
  verification_stale_check_indeterminate: verificationStaleCheckIndeterminate,
1491
1550
  };
1492
1551
  if (updated) {
1493
- output({ updated: true, ...computed }, raw, `${summaryCount}/${planCount} ${status}`);
1552
+ output(warnings.length > 0 ? { updated: true, ...computed, warnings } : { updated: true, ...computed }, raw, `${summaryCount}/${planCount} ${status}`);
1494
1553
  }
1495
1554
  else if (missingPhaseDetails) {
1496
1555
  // #4247: honest refusal — the reason names the real condition (the