@pareto4/pp-core 1.5.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 (618) hide show
  1. package/.claude-plugin/plugin.json +23 -0
  2. package/GEMINI.md +53 -0
  3. package/LICENSE +22 -0
  4. package/README.md +100 -0
  5. package/agents/pp-advisor-researcher.md +108 -0
  6. package/agents/pp-ai-researcher.md +114 -0
  7. package/agents/pp-assumptions-analyzer.md +105 -0
  8. package/agents/pp-code-fixer.md +669 -0
  9. package/agents/pp-code-reviewer.md +387 -0
  10. package/agents/pp-codebase-mapper.md +853 -0
  11. package/agents/pp-debug-session-manager.md +315 -0
  12. package/agents/pp-debugger.md +1453 -0
  13. package/agents/pp-doc-classifier.md +168 -0
  14. package/agents/pp-doc-synthesizer.md +204 -0
  15. package/agents/pp-doc-verifier.md +217 -0
  16. package/agents/pp-doc-writer.md +616 -0
  17. package/agents/pp-domain-researcher.md +147 -0
  18. package/agents/pp-eval-auditor.md +191 -0
  19. package/agents/pp-eval-planner.md +154 -0
  20. package/agents/pp-executor.md +808 -0
  21. package/agents/pp-framework-selector.md +160 -0
  22. package/agents/pp-integration-checker.md +470 -0
  23. package/agents/pp-intel-updater.md +339 -0
  24. package/agents/pp-mempalace-curator.md +47 -0
  25. package/agents/pp-nyquist-auditor.md +204 -0
  26. package/agents/pp-pattern-mapper.md +335 -0
  27. package/agents/pp-phase-researcher.md +867 -0
  28. package/agents/pp-plan-checker.md +988 -0
  29. package/agents/pp-planner.md +1052 -0
  30. package/agents/pp-project-researcher.md +612 -0
  31. package/agents/pp-research-synthesizer.md +260 -0
  32. package/agents/pp-roadmapper.md +741 -0
  33. package/agents/pp-security-auditor.md +156 -0
  34. package/agents/pp-ui-auditor.md +495 -0
  35. package/agents/pp-ui-checker.md +309 -0
  36. package/agents/pp-ui-researcher.md +375 -0
  37. package/agents/pp-user-profiler.md +171 -0
  38. package/agents/pp-verifier.md +967 -0
  39. package/assets/gsd-logo-2000-transparent.png +0 -0
  40. package/assets/gsd-logo-2000-transparent.svg +17 -0
  41. package/assets/gsd-logo-2000.png +0 -0
  42. package/assets/gsd-logo-2000.svg +21 -0
  43. package/assets/terminal.svg +68 -0
  44. package/bin/install.js +12370 -0
  45. package/bin/lib/ui-safety-gate.cjs +107 -0
  46. package/commands/pp-add-tests.md +42 -0
  47. package/commands/pp-ai-integration-phase.md +37 -0
  48. package/commands/pp-audit-fix.md +34 -0
  49. package/commands/pp-audit-milestone.md +37 -0
  50. package/commands/pp-audit-uat.md +24 -0
  51. package/commands/pp-autonomous.md +51 -0
  52. package/commands/pp-capture.md +62 -0
  53. package/commands/pp-cleanup.md +24 -0
  54. package/commands/pp-code-review.md +59 -0
  55. package/commands/pp-complete-milestone.md +143 -0
  56. package/commands/pp-config.md +56 -0
  57. package/commands/pp-debug.md +52 -0
  58. package/commands/pp-discovery.md +34 -0
  59. package/commands/pp-discuss-phase.md +77 -0
  60. package/commands/pp-docs-update.md +49 -0
  61. package/commands/pp-eval-review.md +33 -0
  62. package/commands/pp-execute-phase.md +65 -0
  63. package/commands/pp-explore.md +27 -0
  64. package/commands/pp-extract-learnings.md +23 -0
  65. package/commands/pp-fast.md +31 -0
  66. package/commands/pp-forensics.md +57 -0
  67. package/commands/pp-graphify.md +204 -0
  68. package/commands/pp-health.md +31 -0
  69. package/commands/pp-help.md +28 -0
  70. package/commands/pp-import.md +45 -0
  71. package/commands/pp-inbox.md +39 -0
  72. package/commands/pp-ingest-docs.md +42 -0
  73. package/commands/pp-manager.md +45 -0
  74. package/commands/pp-map-codebase.md +83 -0
  75. package/commands/pp-mempalace-capture.md +71 -0
  76. package/commands/pp-mempalace-recall.md +102 -0
  77. package/commands/pp-milestone-summary.md +51 -0
  78. package/commands/pp-mvp-phase.md +45 -0
  79. package/commands/pp-new-milestone.md +45 -0
  80. package/commands/pp-new-project.md +47 -0
  81. package/commands/pp-ns-context.md +25 -0
  82. package/commands/pp-ns-ideate.md +24 -0
  83. package/commands/pp-ns-manage.md +36 -0
  84. package/commands/pp-ns-project.md +27 -0
  85. package/commands/pp-ns-review.md +29 -0
  86. package/commands/pp-ns-workflow.md +35 -0
  87. package/commands/pp-pause-work.md +43 -0
  88. package/commands/pp-phase.md +56 -0
  89. package/commands/pp-plan-phase.md +63 -0
  90. package/commands/pp-plan-review-convergence.md +60 -0
  91. package/commands/pp-pr-branch.md +26 -0
  92. package/commands/pp-profile-user.md +46 -0
  93. package/commands/pp-progress.md +49 -0
  94. package/commands/pp-quick.md +174 -0
  95. package/commands/pp-resume-work.md +30 -0
  96. package/commands/pp-review-backlog.md +63 -0
  97. package/commands/pp-review.md +42 -0
  98. package/commands/pp-secure-phase.md +36 -0
  99. package/commands/pp-settings.md +29 -0
  100. package/commands/pp-ship.md +24 -0
  101. package/commands/pp-sketch.md +60 -0
  102. package/commands/pp-spec-phase.md +63 -0
  103. package/commands/pp-spike.md +57 -0
  104. package/commands/pp-stats.md +20 -0
  105. package/commands/pp-surface.md +162 -0
  106. package/commands/pp-thread.md +24 -0
  107. package/commands/pp-ui-phase.md +35 -0
  108. package/commands/pp-ui-review.md +33 -0
  109. package/commands/pp-ultraplan-phase.md +34 -0
  110. package/commands/pp-undo.md +35 -0
  111. package/commands/pp-update.md +49 -0
  112. package/commands/pp-validate-phase.md +36 -0
  113. package/commands/pp-verify-work.md +39 -0
  114. package/commands/pp-workspace.md +52 -0
  115. package/commands/pp-workstreams.md +70 -0
  116. package/gemini-extension.json +6 -0
  117. package/hooks/dist/lib/git-cmd.js +150 -0
  118. package/hooks/dist/lib/pp-graphify-rebuild.sh +65 -0
  119. package/hooks/dist/managed-hooks-registry.cjs +39 -0
  120. package/hooks/dist/pp-check-update-worker.js +108 -0
  121. package/hooks/dist/pp-check-update.js +66 -0
  122. package/hooks/dist/pp-config-reload.js +133 -0
  123. package/hooks/dist/pp-context-monitor.js +196 -0
  124. package/hooks/dist/pp-cursor-post-tool.js +75 -0
  125. package/hooks/dist/pp-cursor-session-start.js +52 -0
  126. package/hooks/dist/pp-ensure-canonical-path.js +305 -0
  127. package/hooks/dist/pp-graphify-update.sh +158 -0
  128. package/hooks/dist/pp-phase-boundary.sh +47 -0
  129. package/hooks/dist/pp-prompt-guard.js +97 -0
  130. package/hooks/dist/pp-read-guard.js +101 -0
  131. package/hooks/dist/pp-read-injection-scanner.js +203 -0
  132. package/hooks/dist/pp-session-state.sh +59 -0
  133. package/hooks/dist/pp-statusline.js +566 -0
  134. package/hooks/dist/pp-update-banner.js +138 -0
  135. package/hooks/dist/pp-validate-commit.sh +57 -0
  136. package/hooks/dist/pp-workflow-guard.js +167 -0
  137. package/hooks/dist/pp-worktree-path-guard.js +185 -0
  138. package/hooks/hooks.json +70 -0
  139. package/hooks/lib/git-cmd.js +150 -0
  140. package/hooks/lib/pp-graphify-rebuild.sh +65 -0
  141. package/hooks/managed-hooks-registry.cjs +39 -0
  142. package/hooks/pp-check-update-worker.js +108 -0
  143. package/hooks/pp-check-update.js +66 -0
  144. package/hooks/pp-config-reload.js +133 -0
  145. package/hooks/pp-context-monitor.js +196 -0
  146. package/hooks/pp-cursor-post-tool.js +75 -0
  147. package/hooks/pp-cursor-session-start.js +52 -0
  148. package/hooks/pp-ensure-canonical-path.js +305 -0
  149. package/hooks/pp-graphify-update.sh +158 -0
  150. package/hooks/pp-phase-boundary.sh +47 -0
  151. package/hooks/pp-prompt-guard.js +97 -0
  152. package/hooks/pp-read-guard.js +101 -0
  153. package/hooks/pp-read-injection-scanner.js +203 -0
  154. package/hooks/pp-session-state.sh +59 -0
  155. package/hooks/pp-statusline.js +566 -0
  156. package/hooks/pp-update-banner.js +138 -0
  157. package/hooks/pp-validate-commit.sh +57 -0
  158. package/hooks/pp-workflow-guard.js +167 -0
  159. package/hooks/pp-worktree-path-guard.js +185 -0
  160. package/package.json +125 -0
  161. package/pp-core/bin/check-latest-version.cjs +161 -0
  162. package/pp-core/bin/lib/active-workstream-store.cjs +297 -0
  163. package/pp-core/bin/lib/adr-parser.cjs +399 -0
  164. package/pp-core/bin/lib/agent-command-router.cjs +68 -0
  165. package/pp-core/bin/lib/agent-install-check.cjs +143 -0
  166. package/pp-core/bin/lib/artifacts.cjs +51 -0
  167. package/pp-core/bin/lib/audit-command-router.cjs +61 -0
  168. package/pp-core/bin/lib/audit.cjs +743 -0
  169. package/pp-core/bin/lib/capability-activation.cjs +113 -0
  170. package/pp-core/bin/lib/capability-registry.cjs +3727 -0
  171. package/pp-core/bin/lib/capability-state.cjs +497 -0
  172. package/pp-core/bin/lib/capability-writer.cjs +355 -0
  173. package/pp-core/bin/lib/check-command-router.cjs +800 -0
  174. package/pp-core/bin/lib/cjs-command-router-adapter.cjs +81 -0
  175. package/pp-core/bin/lib/cli-exit.cjs +61 -0
  176. package/pp-core/bin/lib/clock.cjs +95 -0
  177. package/pp-core/bin/lib/clusters.cjs +131 -0
  178. package/pp-core/bin/lib/code-review-flags.cjs +59 -0
  179. package/pp-core/bin/lib/command-aliases.cjs +809 -0
  180. package/pp-core/bin/lib/command-arg-projection.cjs +55 -0
  181. package/pp-core/bin/lib/command-roster.cjs +19 -0
  182. package/pp-core/bin/lib/command-routing-hub.cjs +300 -0
  183. package/pp-core/bin/lib/commands.cjs +1244 -0
  184. package/pp-core/bin/lib/config-loader.cjs +714 -0
  185. package/pp-core/bin/lib/config-schema.cjs +58 -0
  186. package/pp-core/bin/lib/config-types.cjs +20 -0
  187. package/pp-core/bin/lib/config.cjs +796 -0
  188. package/pp-core/bin/lib/configuration.cjs +209 -0
  189. package/pp-core/bin/lib/context-utilization.cjs +48 -0
  190. package/pp-core/bin/lib/core-utils.cjs +198 -0
  191. package/pp-core/bin/lib/decisions.cjs +136 -0
  192. package/pp-core/bin/lib/docs.cjs +264 -0
  193. package/pp-core/bin/lib/drift.cjs +364 -0
  194. package/pp-core/bin/lib/edge-probe.cjs +196 -0
  195. package/pp-core/bin/lib/fallow-runner.cjs +153 -0
  196. package/pp-core/bin/lib/federated-config.cjs +182 -0
  197. package/pp-core/bin/lib/frontmatter.cjs +494 -0
  198. package/pp-core/bin/lib/gap-checker.cjs +260 -0
  199. package/pp-core/bin/lib/git-base-branch.cjs +220 -0
  200. package/pp-core/bin/lib/graphify-command-router.cjs +72 -0
  201. package/pp-core/bin/lib/graphify.cjs +472 -0
  202. package/pp-core/bin/lib/gsd2-import.cjs +456 -0
  203. package/pp-core/bin/lib/init-command-router.cjs +62 -0
  204. package/pp-core/bin/lib/init.cjs +1912 -0
  205. package/pp-core/bin/lib/install-profiles.cjs +814 -0
  206. package/pp-core/bin/lib/installer-migration-authoring.cjs +122 -0
  207. package/pp-core/bin/lib/installer-migration-report.cjs +351 -0
  208. package/pp-core/bin/lib/installer-migrations/000-first-time-baseline.cjs +225 -0
  209. package/pp-core/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +48 -0
  210. package/pp-core/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +94 -0
  211. package/pp-core/bin/lib/installer-migrations/003-rename-get-shit-done-to-gsd-core.cjs +108 -0
  212. package/pp-core/bin/lib/installer-migrations/004-prune-stale-pristine-snapshots.cjs +123 -0
  213. package/pp-core/bin/lib/installer-migrations/005-rename-gsd-core-to-pp-core.cjs +109 -0
  214. package/pp-core/bin/lib/installer-migrations/006-rename-gsd-command-namespace.cjs +135 -0
  215. package/pp-core/bin/lib/installer-migrations.cjs +823 -0
  216. package/pp-core/bin/lib/intel-command-router.cjs +119 -0
  217. package/pp-core/bin/lib/intel.cjs +584 -0
  218. package/pp-core/bin/lib/io.cjs +220 -0
  219. package/pp-core/bin/lib/learnings.cjs +270 -0
  220. package/pp-core/bin/lib/legacy-cleanup.cjs +253 -0
  221. package/pp-core/bin/lib/loop-host-contract.cjs +105 -0
  222. package/pp-core/bin/lib/loop-resolver.cjs +479 -0
  223. package/pp-core/bin/lib/milestone.cjs +381 -0
  224. package/pp-core/bin/lib/model-catalog.cjs +154 -0
  225. package/pp-core/bin/lib/model-profiles.cjs +24 -0
  226. package/pp-core/bin/lib/model-resolver.cjs +467 -0
  227. package/pp-core/bin/lib/observability/event.cjs +51 -0
  228. package/pp-core/bin/lib/observability/logger.cjs +146 -0
  229. package/pp-core/bin/lib/observability/redaction.cjs +48 -0
  230. package/pp-core/bin/lib/package-identity.cjs +35 -0
  231. package/pp-core/bin/lib/package-legitimacy.cjs +368 -0
  232. package/pp-core/bin/lib/phase-command-router.cjs +209 -0
  233. package/pp-core/bin/lib/phase-id.cjs +213 -0
  234. package/pp-core/bin/lib/phase-lifecycle.cjs +74 -0
  235. package/pp-core/bin/lib/phase-locator.cjs +145 -0
  236. package/pp-core/bin/lib/phase.cjs +1446 -0
  237. package/pp-core/bin/lib/phases-command-router.cjs +43 -0
  238. package/pp-core/bin/lib/plan-drift-guard.cjs +117 -0
  239. package/pp-core/bin/lib/plan-scan.cjs +91 -0
  240. package/pp-core/bin/lib/planning-workspace.cjs +245 -0
  241. package/pp-core/bin/lib/probe-core.cjs +402 -0
  242. package/pp-core/bin/lib/profile-output.cjs +1164 -0
  243. package/pp-core/bin/lib/profile-pipeline-command-router.cjs +138 -0
  244. package/pp-core/bin/lib/profile-pipeline.cjs +519 -0
  245. package/pp-core/bin/lib/prohibition-enforcement.cjs +660 -0
  246. package/pp-core/bin/lib/project-root.cjs +119 -0
  247. package/pp-core/bin/lib/prompt-budget.cjs +305 -0
  248. package/pp-core/bin/lib/research-provider.cjs +137 -0
  249. package/pp-core/bin/lib/research-store.cjs +167 -0
  250. package/pp-core/bin/lib/review-reviewer-selection.cjs +121 -0
  251. package/pp-core/bin/lib/roadmap-command-router.cjs +166 -0
  252. package/pp-core/bin/lib/roadmap-parser.cjs +456 -0
  253. package/pp-core/bin/lib/roadmap-upgrade.cjs +476 -0
  254. package/pp-core/bin/lib/roadmap.cjs +738 -0
  255. package/pp-core/bin/lib/runtime-artifact-conversion.cjs +1966 -0
  256. package/pp-core/bin/lib/runtime-artifact-layout.cjs +342 -0
  257. package/pp-core/bin/lib/runtime-config-adapter-registry.cjs +103 -0
  258. package/pp-core/bin/lib/runtime-homes.cjs +272 -0
  259. package/pp-core/bin/lib/runtime-hooks-surface.cjs +1460 -0
  260. package/pp-core/bin/lib/runtime-name-policy.cjs +97 -0
  261. package/pp-core/bin/lib/runtime-slash.cjs +137 -0
  262. package/pp-core/bin/lib/schema-detect.cjs +159 -0
  263. package/pp-core/bin/lib/secrets.cjs +34 -0
  264. package/pp-core/bin/lib/security.cjs +480 -0
  265. package/pp-core/bin/lib/semver-compare.cjs +42 -0
  266. package/pp-core/bin/lib/shell-command-projection.cjs +550 -0
  267. package/pp-core/bin/lib/state-command-router.cjs +172 -0
  268. package/pp-core/bin/lib/state-document.cjs +312 -0
  269. package/pp-core/bin/lib/state.cjs +2587 -0
  270. package/pp-core/bin/lib/surface.cjs +505 -0
  271. package/pp-core/bin/lib/task-command-router.cjs +85 -0
  272. package/pp-core/bin/lib/teams-status.cjs +74 -0
  273. package/pp-core/bin/lib/template.cjs +246 -0
  274. package/pp-core/bin/lib/uat-predicate.cjs +329 -0
  275. package/pp-core/bin/lib/uat.cjs +359 -0
  276. package/pp-core/bin/lib/ui-safety-gate.cjs +98 -0
  277. package/pp-core/bin/lib/update-context.cjs +221 -0
  278. package/pp-core/bin/lib/validate-command-router.cjs +91 -0
  279. package/pp-core/bin/lib/validate.cjs +122 -0
  280. package/pp-core/bin/lib/verification-command-router.cjs +31 -0
  281. package/pp-core/bin/lib/verification.cjs +196 -0
  282. package/pp-core/bin/lib/verify-command-router.cjs +44 -0
  283. package/pp-core/bin/lib/verify.cjs +1932 -0
  284. package/pp-core/bin/lib/workstream-inventory-builder.cjs +81 -0
  285. package/pp-core/bin/lib/workstream-inventory.cjs +147 -0
  286. package/pp-core/bin/lib/workstream-name-policy.cjs +91 -0
  287. package/pp-core/bin/lib/workstream.cjs +386 -0
  288. package/pp-core/bin/lib/worktree-base-ref.cjs +350 -0
  289. package/pp-core/bin/lib/worktree-safety.cjs +985 -0
  290. package/pp-core/bin/pp-tools.cjs +2239 -0
  291. package/pp-core/bin/pp_run +20 -0
  292. package/pp-core/bin/shared/config-defaults.manifest.json +97 -0
  293. package/pp-core/bin/shared/config-schema.manifest.json +176 -0
  294. package/pp-core/bin/shared/model-catalog.json +160 -0
  295. package/pp-core/bin/shared/runtime-aliases.manifest.json +79 -0
  296. package/pp-core/bin/verify-reapply-patches.cjs +400 -0
  297. package/pp-core/contexts/dev.md +21 -0
  298. package/pp-core/contexts/research.md +22 -0
  299. package/pp-core/contexts/review.md +23 -0
  300. package/pp-core/references/agent-contracts.md +79 -0
  301. package/pp-core/references/ai-evals.md +156 -0
  302. package/pp-core/references/ai-frameworks.md +186 -0
  303. package/pp-core/references/artifact-types.md +131 -0
  304. package/pp-core/references/autonomous-smart-discuss.md +277 -0
  305. package/pp-core/references/checkpoints.md +814 -0
  306. package/pp-core/references/common-bug-patterns.md +114 -0
  307. package/pp-core/references/context-budget.md +85 -0
  308. package/pp-core/references/continuation-format.md +253 -0
  309. package/pp-core/references/debugger-philosophy.md +76 -0
  310. package/pp-core/references/decimal-phase-calculation.md +64 -0
  311. package/pp-core/references/doc-conflict-engine.md +91 -0
  312. package/pp-core/references/domain-probes.md +125 -0
  313. package/pp-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +7 -0
  314. package/pp-core/references/edge-probe-fixtures/01-round-half-even/requirements.json +1 -0
  315. package/pp-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +8 -0
  316. package/pp-core/references/edge-probe-fixtures/02-merge-intervals/requirements.json +1 -0
  317. package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +7 -0
  318. package/pp-core/references/edge-probe-fixtures/03-truncate-graphemes/requirements.json +1 -0
  319. package/pp-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +7 -0
  320. package/pp-core/references/edge-probe-fixtures/04-money-rounding/requirements.json +1 -0
  321. package/pp-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +8 -0
  322. package/pp-core/references/edge-probe-fixtures/05-list-dedupe/requirements.json +1 -0
  323. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +8 -0
  324. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/requirements.json +1 -0
  325. package/pp-core/references/edge-probe-fixtures/06-resolved-mixed/resolutions.json +4 -0
  326. package/pp-core/references/edge-probe.md +272 -0
  327. package/pp-core/references/execute-mvp-tdd.md +81 -0
  328. package/pp-core/references/executor-examples.md +110 -0
  329. package/pp-core/references/few-shot-examples/plan-checker.md +73 -0
  330. package/pp-core/references/few-shot-examples/verifier.md +109 -0
  331. package/pp-core/references/gate-prompts.md +100 -0
  332. package/pp-core/references/gates.md +70 -0
  333. package/pp-core/references/git-integration.md +298 -0
  334. package/pp-core/references/git-planning-commit.md +40 -0
  335. package/pp-core/references/ios-scaffold.md +123 -0
  336. package/pp-core/references/loop-hook-dispatch.md +61 -0
  337. package/pp-core/references/mandatory-initial-read.md +2 -0
  338. package/pp-core/references/model-profile-resolution.md +38 -0
  339. package/pp-core/references/model-profiles.md +245 -0
  340. package/pp-core/references/mvp-concepts.md +49 -0
  341. package/pp-core/references/phase-argument-parsing.md +61 -0
  342. package/pp-core/references/planner-antipatterns.md +176 -0
  343. package/pp-core/references/planner-chunked.md +49 -0
  344. package/pp-core/references/planner-gap-closure.md +62 -0
  345. package/pp-core/references/planner-graphify-auto-update.md +67 -0
  346. package/pp-core/references/planner-guidance.md +186 -0
  347. package/pp-core/references/planner-human-verify-mode.md +57 -0
  348. package/pp-core/references/planner-interface-context.md +62 -0
  349. package/pp-core/references/planner-load-graph-context.md +36 -0
  350. package/pp-core/references/planner-mvp-mode.md +53 -0
  351. package/pp-core/references/planner-reviews.md +42 -0
  352. package/pp-core/references/planner-revision.md +87 -0
  353. package/pp-core/references/planner-source-audit.md +73 -0
  354. package/pp-core/references/planning-config.md +477 -0
  355. package/pp-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
  356. package/pp-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
  357. package/pp-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
  358. package/pp-core/references/prohibition-probe.md +326 -0
  359. package/pp-core/references/project-skills-discovery.md +19 -0
  360. package/pp-core/references/questioning.md +162 -0
  361. package/pp-core/references/research-documentation-lookup.md +29 -0
  362. package/pp-core/references/research-philosophy.md +29 -0
  363. package/pp-core/references/research-verification-protocol.md +27 -0
  364. package/pp-core/references/revision-loop.md +97 -0
  365. package/pp-core/references/scout-codebase.md +51 -0
  366. package/pp-core/references/skeleton-template.md +48 -0
  367. package/pp-core/references/sketch-interactivity.md +41 -0
  368. package/pp-core/references/sketch-theme-system.md +94 -0
  369. package/pp-core/references/sketch-tooling.md +45 -0
  370. package/pp-core/references/sketch-variant-patterns.md +81 -0
  371. package/pp-core/references/spidr-splitting.md +69 -0
  372. package/pp-core/references/tdd.md +330 -0
  373. package/pp-core/references/thinking-models-debug.md +44 -0
  374. package/pp-core/references/thinking-models-execution.md +50 -0
  375. package/pp-core/references/thinking-models-planning.md +62 -0
  376. package/pp-core/references/thinking-models-research.md +50 -0
  377. package/pp-core/references/thinking-models-verification.md +55 -0
  378. package/pp-core/references/thinking-partner.md +96 -0
  379. package/pp-core/references/ui-brand.md +162 -0
  380. package/pp-core/references/universal-anti-patterns.md +63 -0
  381. package/pp-core/references/user-profiling.md +681 -0
  382. package/pp-core/references/user-story-template.md +58 -0
  383. package/pp-core/references/verification-overrides.md +227 -0
  384. package/pp-core/references/verification-patterns.md +612 -0
  385. package/pp-core/references/verify-mvp-mode.md +85 -0
  386. package/pp-core/references/workstream-flag.md +111 -0
  387. package/pp-core/references/worktree-branch-check.md +44 -0
  388. package/pp-core/references/worktree-path-safety.md +67 -0
  389. package/pp-core/templates/AI-SPEC.md +246 -0
  390. package/pp-core/templates/DEBUG.md +169 -0
  391. package/pp-core/templates/README.md +77 -0
  392. package/pp-core/templates/SECURITY.md +61 -0
  393. package/pp-core/templates/UAT.md +265 -0
  394. package/pp-core/templates/UI-SPEC.md +100 -0
  395. package/pp-core/templates/VALIDATION.md +76 -0
  396. package/pp-core/templates/claude-md.md +145 -0
  397. package/pp-core/templates/codebase/architecture.md +255 -0
  398. package/pp-core/templates/codebase/concerns.md +310 -0
  399. package/pp-core/templates/codebase/conventions.md +307 -0
  400. package/pp-core/templates/codebase/integrations.md +280 -0
  401. package/pp-core/templates/codebase/stack.md +186 -0
  402. package/pp-core/templates/codebase/structure.md +285 -0
  403. package/pp-core/templates/codebase/testing.md +480 -0
  404. package/pp-core/templates/config.json +62 -0
  405. package/pp-core/templates/context.md +352 -0
  406. package/pp-core/templates/continue-here.md +78 -0
  407. package/pp-core/templates/copilot-instructions.md +7 -0
  408. package/pp-core/templates/debug-subagent-prompt.md +91 -0
  409. package/pp-core/templates/dev-preferences.md +21 -0
  410. package/pp-core/templates/discovery.md +146 -0
  411. package/pp-core/templates/discussion-log.md +63 -0
  412. package/pp-core/templates/milestone-archive.md +123 -0
  413. package/pp-core/templates/milestone.md +115 -0
  414. package/pp-core/templates/phase-prompt.md +610 -0
  415. package/pp-core/templates/planner-subagent-prompt.md +117 -0
  416. package/pp-core/templates/project.md +203 -0
  417. package/pp-core/templates/requirements.md +231 -0
  418. package/pp-core/templates/research-project/ARCHITECTURE.md +204 -0
  419. package/pp-core/templates/research-project/FEATURES.md +147 -0
  420. package/pp-core/templates/research-project/PITFALLS.md +200 -0
  421. package/pp-core/templates/research-project/STACK.md +120 -0
  422. package/pp-core/templates/research-project/SUMMARY.md +170 -0
  423. package/pp-core/templates/research.md +592 -0
  424. package/pp-core/templates/retrospective.md +54 -0
  425. package/pp-core/templates/roadmap.md +202 -0
  426. package/pp-core/templates/spec.md +333 -0
  427. package/pp-core/templates/state.md +195 -0
  428. package/pp-core/templates/summary-complex.md +60 -0
  429. package/pp-core/templates/summary-minimal.md +42 -0
  430. package/pp-core/templates/summary-standard.md +49 -0
  431. package/pp-core/templates/summary.md +249 -0
  432. package/pp-core/templates/user-profile.md +146 -0
  433. package/pp-core/templates/user-setup.md +311 -0
  434. package/pp-core/templates/verification-report.md +335 -0
  435. package/pp-core/workflows/_runtime-launcher.snippet.sh +1 -0
  436. package/pp-core/workflows/add-backlog.md +91 -0
  437. package/pp-core/workflows/add-phase.md +113 -0
  438. package/pp-core/workflows/add-tests.md +355 -0
  439. package/pp-core/workflows/add-todo.md +161 -0
  440. package/pp-core/workflows/ai-integration-phase.md +295 -0
  441. package/pp-core/workflows/analyze-dependencies.md +96 -0
  442. package/pp-core/workflows/audit-fix.md +178 -0
  443. package/pp-core/workflows/audit-milestone.md +362 -0
  444. package/pp-core/workflows/audit-uat.md +110 -0
  445. package/pp-core/workflows/autonomous.md +886 -0
  446. package/pp-core/workflows/check-todos.md +180 -0
  447. package/pp-core/workflows/cleanup.md +195 -0
  448. package/pp-core/workflows/code-review-fix.md +506 -0
  449. package/pp-core/workflows/code-review.md +696 -0
  450. package/pp-core/workflows/complete-milestone.md +857 -0
  451. package/pp-core/workflows/debug.md +237 -0
  452. package/pp-core/workflows/diagnose-issues.md +245 -0
  453. package/pp-core/workflows/discovery-phase.md +291 -0
  454. package/pp-core/workflows/discovery-sprint.md +1546 -0
  455. package/pp-core/workflows/discuss-phase/modes/advisor.md +176 -0
  456. package/pp-core/workflows/discuss-phase/modes/all.md +28 -0
  457. package/pp-core/workflows/discuss-phase/modes/analyze.md +44 -0
  458. package/pp-core/workflows/discuss-phase/modes/auto.md +57 -0
  459. package/pp-core/workflows/discuss-phase/modes/batch.md +52 -0
  460. package/pp-core/workflows/discuss-phase/modes/chain.md +98 -0
  461. package/pp-core/workflows/discuss-phase/modes/default.md +141 -0
  462. package/pp-core/workflows/discuss-phase/modes/power.md +44 -0
  463. package/pp-core/workflows/discuss-phase/modes/text.md +55 -0
  464. package/pp-core/workflows/discuss-phase/templates/checkpoint.json +18 -0
  465. package/pp-core/workflows/discuss-phase/templates/context.md +136 -0
  466. package/pp-core/workflows/discuss-phase/templates/discussion-log.md +50 -0
  467. package/pp-core/workflows/discuss-phase-assumptions.md +675 -0
  468. package/pp-core/workflows/discuss-phase-power.md +291 -0
  469. package/pp-core/workflows/discuss-phase.md +520 -0
  470. package/pp-core/workflows/do.md +111 -0
  471. package/pp-core/workflows/docs-update.md +1168 -0
  472. package/pp-core/workflows/edit-phase.md +295 -0
  473. package/pp-core/workflows/eval-review.md +159 -0
  474. package/pp-core/workflows/execute-phase/steps/codebase-drift-gate.md +95 -0
  475. package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  476. package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +117 -0
  477. package/pp-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
  478. package/pp-core/workflows/execute-phase.md +1707 -0
  479. package/pp-core/workflows/execute-plan.md +541 -0
  480. package/pp-core/workflows/explore.md +146 -0
  481. package/pp-core/workflows/extract-learnings.md +243 -0
  482. package/pp-core/workflows/fast.md +124 -0
  483. package/pp-core/workflows/forensics.md +279 -0
  484. package/pp-core/workflows/graduation.md +196 -0
  485. package/pp-core/workflows/health.md +224 -0
  486. package/pp-core/workflows/help/modes/brief.md +22 -0
  487. package/pp-core/workflows/help/modes/default.md +50 -0
  488. package/pp-core/workflows/help/modes/full.md +791 -0
  489. package/pp-core/workflows/help/modes/topic.md +74 -0
  490. package/pp-core/workflows/help.md +24 -0
  491. package/pp-core/workflows/import.md +256 -0
  492. package/pp-core/workflows/inbox.md +387 -0
  493. package/pp-core/workflows/ingest-docs.md +340 -0
  494. package/pp-core/workflows/insert-phase.md +152 -0
  495. package/pp-core/workflows/list-phase-assumptions.md +178 -0
  496. package/pp-core/workflows/list-workspaces.md +57 -0
  497. package/pp-core/workflows/manager.md +435 -0
  498. package/pp-core/workflows/map-codebase.md +444 -0
  499. package/pp-core/workflows/milestone-summary.md +224 -0
  500. package/pp-core/workflows/mvp-phase.md +222 -0
  501. package/pp-core/workflows/new-milestone.md +643 -0
  502. package/pp-core/workflows/new-project.md +1563 -0
  503. package/pp-core/workflows/new-workspace.md +240 -0
  504. package/pp-core/workflows/next.md +347 -0
  505. package/pp-core/workflows/node-repair.md +92 -0
  506. package/pp-core/workflows/note.md +158 -0
  507. package/pp-core/workflows/pause-work.md +250 -0
  508. package/pp-core/workflows/plan-milestone-gaps.md +281 -0
  509. package/pp-core/workflows/plan-phase.md +1755 -0
  510. package/pp-core/workflows/plan-review-convergence.md +369 -0
  511. package/pp-core/workflows/plant-seed.md +230 -0
  512. package/pp-core/workflows/pr-branch.md +159 -0
  513. package/pp-core/workflows/profile-user.md +455 -0
  514. package/pp-core/workflows/progress.md +756 -0
  515. package/pp-core/workflows/quick.md +1045 -0
  516. package/pp-core/workflows/reapply-patches.md +443 -0
  517. package/pp-core/workflows/remove-phase.md +156 -0
  518. package/pp-core/workflows/remove-workspace.md +108 -0
  519. package/pp-core/workflows/resume-project.md +348 -0
  520. package/pp-core/workflows/review.md +765 -0
  521. package/pp-core/workflows/scan.md +107 -0
  522. package/pp-core/workflows/secure-phase.md +184 -0
  523. package/pp-core/workflows/session-report.md +146 -0
  524. package/pp-core/workflows/settings-advanced.md +816 -0
  525. package/pp-core/workflows/settings-integrations.md +312 -0
  526. package/pp-core/workflows/settings.md +592 -0
  527. package/pp-core/workflows/ship.md +465 -0
  528. package/pp-core/workflows/sketch-wrap-up.md +286 -0
  529. package/pp-core/workflows/sketch.md +361 -0
  530. package/pp-core/workflows/spec-phase.md +495 -0
  531. package/pp-core/workflows/spike-wrap-up.md +307 -0
  532. package/pp-core/workflows/spike.md +453 -0
  533. package/pp-core/workflows/stats.md +80 -0
  534. package/pp-core/workflows/sync-skills.md +182 -0
  535. package/pp-core/workflows/thread.md +222 -0
  536. package/pp-core/workflows/transition.md +694 -0
  537. package/pp-core/workflows/ui-phase.md +328 -0
  538. package/pp-core/workflows/ui-review.md +193 -0
  539. package/pp-core/workflows/ultraplan-phase.md +199 -0
  540. package/pp-core/workflows/undo.md +314 -0
  541. package/pp-core/workflows/update.md +501 -0
  542. package/pp-core/workflows/validate-phase.md +183 -0
  543. package/pp-core/workflows/verify-phase.md +569 -0
  544. package/pp-core/workflows/verify-work.md +804 -0
  545. package/scripts/affected-tests-lib.cjs +554 -0
  546. package/scripts/audit-workflow-script-paths.cjs +73 -0
  547. package/scripts/base64-scan.sh +351 -0
  548. package/scripts/build-hooks.js +254 -0
  549. package/scripts/changeset/README.md +129 -0
  550. package/scripts/changeset/cli.cjs +597 -0
  551. package/scripts/changeset/github-release-notes.cjs +199 -0
  552. package/scripts/changeset/lint.cjs +147 -0
  553. package/scripts/changeset/new.cjs +151 -0
  554. package/scripts/changeset/parse.cjs +114 -0
  555. package/scripts/changeset/render.cjs +34 -0
  556. package/scripts/changeset/serialize.cjs +130 -0
  557. package/scripts/check-alias-drift.cjs +114 -0
  558. package/scripts/check-env.cjs +312 -0
  559. package/scripts/check-npm-integrity.cjs +215 -0
  560. package/scripts/ci-guard-runner.cjs +22 -0
  561. package/scripts/ci-prepare-test-scope.cjs +93 -0
  562. package/scripts/ci-rebase-check.cjs +86 -0
  563. package/scripts/ci-test-scope.cjs +441 -0
  564. package/scripts/command-contract-helpers.cjs +64 -0
  565. package/scripts/diff-touches-shipped-paths.cjs +149 -0
  566. package/scripts/fix-slash-commands.cjs +161 -0
  567. package/scripts/gen-capability-registry.cjs +2646 -0
  568. package/scripts/gen-commands-reference.cjs +139 -0
  569. package/scripts/gen-inventory-manifest.cjs +114 -0
  570. package/scripts/gen-loop-host-contract.cjs +526 -0
  571. package/scripts/gen-research-agents.cjs +276 -0
  572. package/scripts/generate-package-identity.cjs +134 -0
  573. package/scripts/issue-dedupe.cjs +278 -0
  574. package/scripts/issue-version-gate.cjs +140 -0
  575. package/scripts/lib/allowlist-ratchet.cjs +236 -0
  576. package/scripts/lib/cli-exit.cjs +56 -0
  577. package/scripts/lint-allow-test-rule-refs.allowlist.json +328 -0
  578. package/scripts/lint-allow-test-rule-refs.cjs +162 -0
  579. package/scripts/lint-command-contract.cjs +118 -0
  580. package/scripts/lint-descriptions.cjs +87 -0
  581. package/scripts/lint-docs-required.cjs +222 -0
  582. package/scripts/lint-legacy-dir-name.cjs +166 -0
  583. package/scripts/lint-package-identity-drift.cjs +141 -0
  584. package/scripts/lint-pr-check-project-dir.cjs +99 -0
  585. package/scripts/lint-regression-test-names.allowlist.json +269 -0
  586. package/scripts/lint-regression-test-names.cjs +117 -0
  587. package/scripts/lint-shell-command-projection-drift.cjs +62 -0
  588. package/scripts/lint-skill-deps.cjs +185 -0
  589. package/scripts/lint-test-file-count.allowlist.json +181 -0
  590. package/scripts/lint-test-file-count.cjs +246 -0
  591. package/scripts/lint-windows-test-portability.cjs +178 -0
  592. package/scripts/mutation-matrix.cjs +323 -0
  593. package/scripts/pr-target-policy.cjs +63 -0
  594. package/scripts/pr-template-policy.cjs +268 -0
  595. package/scripts/prompt-injection-scan.sh +207 -0
  596. package/scripts/registry-smoke.cjs +337 -0
  597. package/scripts/release-notes/discord-release-summary.cjs +373 -0
  598. package/scripts/release-notes/format-github-release-notes.cjs +261 -0
  599. package/scripts/release-tarball-smoke.cjs +763 -0
  600. package/scripts/research-profiles.cjs +149 -0
  601. package/scripts/run-affected-tests.cjs +7 -0
  602. package/scripts/run-tests.cjs +589 -0
  603. package/scripts/secret-scan-lint.sh +231 -0
  604. package/scripts/secret-scan.sh +358 -0
  605. package/scripts/setup-branch-protection.sh +234 -0
  606. package/scripts/strip-prose-atrefs.cjs +106 -0
  607. package/scripts/sync-manifest-versions.cjs +119 -0
  608. package/scripts/sync-next-version.cjs +133 -0
  609. package/scripts/sync-rulesets.sh +34 -0
  610. package/scripts/sync-runtime-launcher.cjs +425 -0
  611. package/scripts/test-failure-reasons.cjs +34 -0
  612. package/scripts/update-size-baseline.cjs +68 -0
  613. package/scripts/verify-npm-publish.cjs +240 -0
  614. package/scripts/verify-opengsd-sweep.cjs +288 -0
  615. package/scripts/verify-phase-02-rename.sh +258 -0
  616. package/scripts/verify-phase-03-rename.sh +376 -0
  617. package/scripts/workflow-policy.cjs +483 -0
  618. package/scripts/workflow-size.cjs +90 -0
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ /**
3
+ * Manifest-backed state subcommand router.
4
+ * Keeps gsd-tools.cjs thin while preserving existing command semantics.
5
+ *
6
+ * Phase 5.1: handlers that have SDK equivalents are dispatched via
7
+ * executeForCjs (the sync bridge). CJS fallback is retained for:
8
+ * - complete-phase: no SDK counterpart.
9
+ * - Any command when GSD_WORKSTREAM is active (GSDTransport forces subprocess
10
+ * for workstream requests; subprocess is disabled in the sync bridge worker).
11
+ * - Any command when the SDK is not available (build not present).
12
+ *
13
+ * ADR-457 build-at-publish: the hand-written bin/lib/state-command-router.cjs
14
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
15
+ * from the prior hand-written .cjs; only types are added.
16
+ */
17
+ const command_aliases_cjs_1 = require("./command-aliases.cjs");
18
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
19
+ const cjsCommandRouterAdapter = require("./cjs-command-router-adapter.cjs");
20
+ const { routeHubCommandFamily } = cjsCommandRouterAdapter;
21
+ const command_arg_projection_cjs_1 = require("./command-arg-projection.cjs");
22
+ // ─── Types ────────────────────────────────────────────────────────────────────
23
+ // Helper: extract string-only named arg value (value flags never return boolean).
24
+ function strArg(opts, key) {
25
+ const v = opts[key];
26
+ if (typeof v === 'boolean')
27
+ return undefined;
28
+ return v;
29
+ }
30
+ // ─── Implementation ───────────────────────────────────────────────────────────
31
+ function routeStateCommand({ state, args, cwd, raw, error }) {
32
+ const parsePlans = (plans) => {
33
+ const parsedPlans = plans == null ? null : Number.parseInt(plans, 10);
34
+ if (plans != null && Number.isNaN(parsedPlans)) {
35
+ error('Invalid --plans value. Expected an integer.');
36
+ return null;
37
+ }
38
+ return parsedPlans;
39
+ };
40
+ routeHubCommandFamily({
41
+ family: 'state',
42
+ args,
43
+ subcommands: ['load', 'complete-phase', ...command_aliases_cjs_1.STATE_SUBCOMMANDS.filter((s) => s !== 'load')],
44
+ defaultSubcommand: 'load',
45
+ // No SDK-only state subcommands remain: add-roadmap-evolution was the last
46
+ // holdout after the SDK retirement (ADR-0174) and is now implemented in CJS
47
+ // (handler below). See #1140.
48
+ unsupported: {},
49
+ error,
50
+ cwd,
51
+ raw,
52
+ unknownMessage: (subcommand, available) => `Unknown state subcommand: "${subcommand}". Available: ${available.join(', ')}`,
53
+ handlers: {
54
+ load: () => state.cmdStateLoad(cwd, raw),
55
+ json: () => state.cmdStateJson(cwd, raw),
56
+ get: () => state.cmdStateGet(cwd, args[2], raw),
57
+ update: () => state.cmdStateUpdate(cwd, args[2], args[3]),
58
+ patch: () => {
59
+ const patches = {};
60
+ if (args.length === 3 && typeof args[2] === 'string' && args[2].trim().startsWith('{')) {
61
+ let parsed;
62
+ try {
63
+ parsed = JSON.parse(args[2]);
64
+ }
65
+ catch (err) {
66
+ error(`state patch: invalid JSON object: ${err.message}`);
67
+ return;
68
+ }
69
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
70
+ error('state patch: JSON input must be an object of field/value pairs.');
71
+ return;
72
+ }
73
+ for (const [key, value] of Object.entries(parsed)) {
74
+ if (key && value !== undefined) {
75
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
76
+ patches[key] = String(value);
77
+ }
78
+ }
79
+ }
80
+ else {
81
+ for (let i = 2; i < args.length; i += 2) {
82
+ const key = args[i].replace(/^--/, '');
83
+ const value = args[i + 1];
84
+ if (key && value !== undefined) {
85
+ patches[key] = value;
86
+ }
87
+ }
88
+ }
89
+ state.cmdStatePatch(cwd, patches, raw);
90
+ },
91
+ 'advance-plan': () => state.cmdStateAdvancePlan(cwd, raw),
92
+ 'record-metric': () => {
93
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'plan', 'duration', 'tasks', 'files']);
94
+ state.cmdStateRecordMetric(cwd, {
95
+ phase: strArg(a, 'phase'),
96
+ plan: strArg(a, 'plan'),
97
+ duration: strArg(a, 'duration'),
98
+ tasks: strArg(a, 'tasks'),
99
+ files: strArg(a, 'files'),
100
+ }, raw);
101
+ },
102
+ 'update-progress': () => state.cmdStateUpdateProgress(cwd, raw),
103
+ 'add-decision': () => {
104
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'summary', 'summary-file', 'rationale', 'rationale-file']);
105
+ state.cmdStateAddDecision(cwd, {
106
+ phase: strArg(a, 'phase'),
107
+ summary: strArg(a, 'summary'),
108
+ summary_file: strArg(a, 'summary-file'),
109
+ rationale: strArg(a, 'rationale') || '',
110
+ rationale_file: strArg(a, 'rationale-file'),
111
+ }, raw);
112
+ },
113
+ 'add-blocker': () => {
114
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['text', 'text-file']);
115
+ state.cmdStateAddBlocker(cwd, { text: strArg(a, 'text'), text_file: strArg(a, 'text-file') }, raw);
116
+ },
117
+ 'add-roadmap-evolution': () => {
118
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'action', 'after', 'note', 'note-file'], ['urgent']);
119
+ state.cmdStateAddRoadmapEvolution(cwd, {
120
+ phase: strArg(a, 'phase'),
121
+ action: strArg(a, 'action'),
122
+ after: strArg(a, 'after'),
123
+ note: strArg(a, 'note'),
124
+ note_file: strArg(a, 'note-file'),
125
+ urgent: a['urgent'] === true,
126
+ }, raw);
127
+ },
128
+ 'resolve-blocker': () => state.cmdStateResolveBlocker(cwd, strArg((0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['text']), 'text'), raw),
129
+ 'record-session': () => {
130
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['stopped-at', 'resume-file']);
131
+ // Pass resume_file as-is (undefined when --resume-file was not provided) so
132
+ // cmdStateRecordSession can distinguish "caller explicitly passed a value" from
133
+ // "option was not supplied" and apply the template-default-only replacement guard.
134
+ state.cmdStateRecordSession(cwd, { stopped_at: strArg(a, 'stopped-at'), resume_file: strArg(a, 'resume-file') }, raw);
135
+ },
136
+ 'begin-phase': () => {
137
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'name', 'plans']);
138
+ state.cmdStateBeginPhase(cwd, strArg(a, 'phase'), strArg(a, 'name'), parsePlans(strArg(a, 'plans')), raw);
139
+ },
140
+ 'signal-waiting': () => {
141
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['type', 'question', 'options', 'phase']);
142
+ state.cmdSignalWaiting(cwd, strArg(a, 'type'), strArg(a, 'question'), strArg(a, 'options'), strArg(a, 'phase'), raw);
143
+ },
144
+ 'signal-resume': () => state.cmdSignalResume(cwd, raw),
145
+ 'planned-phase': () => {
146
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase', 'name', 'plans']);
147
+ state.cmdStatePlannedPhase(cwd, strArg(a, 'phase'), parsePlans(strArg(a, 'plans')), raw);
148
+ },
149
+ validate: () => state.cmdStateValidate(cwd, raw),
150
+ sync: () => {
151
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, [], ['verify']);
152
+ state.cmdStateSync(cwd, { verify: a['verify'] }, raw);
153
+ },
154
+ prune: () => {
155
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['keep-recent'], ['dry-run']);
156
+ state.cmdStatePrune(cwd, { keepRecent: strArg(a, 'keep-recent') || '3', dryRun: a['dry-run'] === true }, raw);
157
+ },
158
+ // complete-phase: CJS-only — no SDK counterpart.
159
+ 'complete-phase': () => {
160
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['phase']);
161
+ state.cmdStateCompletePhase(cwd, raw, strArg(a, 'phase') || args[2]);
162
+ },
163
+ 'milestone-switch': () => {
164
+ const a = (0, command_arg_projection_cjs_1.parseNamedArgs)(args, ['milestone', 'name']);
165
+ state.cmdStateMilestoneSwitch(cwd, strArg(a, 'milestone'), strArg(a, 'name'), raw);
166
+ },
167
+ },
168
+ });
169
+ }
170
+ module.exports = {
171
+ routeStateCommand,
172
+ };
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ /**
3
+ * STATE.md Document Module — pure transforms for STATE.md text.
4
+ * This module does not read the filesystem and does not own persistence or locking.
5
+ *
6
+ * ADR-457 build-at-publish: the hand-written bin/lib/state-document.cjs collapsed
7
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
8
+ * from the prior hand-written .cjs; only types are added.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.KNOWN_STATUS_PATTERNS = exports.KNOWN_TEMPLATE_DEFAULTS = void 0;
12
+ exports.stateExtractField = stateExtractField;
13
+ exports.stateReplaceField = stateReplaceField;
14
+ exports.stateReplaceFieldWithFallback = stateReplaceFieldWithFallback;
15
+ exports.normalizeStateStatus = normalizeStateStatus;
16
+ exports.computeProgressPercent = computeProgressPercent;
17
+ exports.shouldPreserveExistingProgress = shouldPreserveExistingProgress;
18
+ exports.normalizeProgressNumbers = normalizeProgressNumbers;
19
+ exports.isStateTemplateDefault = isStateTemplateDefault;
20
+ exports.stateReplaceFieldIfTemplate = stateReplaceFieldIfTemplate;
21
+ // Internal helpers
22
+ function escapeRegex(str) {
23
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
24
+ }
25
+ function toFiniteNumber(value) {
26
+ const number = Number(value);
27
+ return Number.isFinite(number) ? number : null;
28
+ }
29
+ function existingProgressExceedsDerived(existingProgress, derivedProgress, key) {
30
+ const existing = toFiniteNumber(existingProgress[key]);
31
+ const derived = toFiniteNumber(derivedProgress[key]);
32
+ return existing !== null && derived !== null && existing > derived;
33
+ }
34
+ /**
35
+ * Return true if a pipe-table row's first cell is a separator cell (`---`
36
+ * variants) rather than a field name. Prevents the separator row
37
+ * `| --- | --- |` from being treated as a field named "---".
38
+ */
39
+ function isTableSeparatorRow(firstCell) {
40
+ // A separator cell contains only dashes, colons (alignment hints), and whitespace.
41
+ return /^[\s\-:]+$/.test(firstCell.trim());
42
+ }
43
+ /**
44
+ * Build a regex that matches a pipe-table row `| FieldName | value |` for the
45
+ * given (already-escaped) field name. The match is case-insensitive and
46
+ * tolerates variable amounts of whitespace around the cell contents.
47
+ *
48
+ * Capture group 1: leading pipe + whitespace before the field cell
49
+ * Capture group 2: the field name cell text (trimmed)
50
+ * Capture group 3: whitespace between field cell and separator pipe
51
+ * Capture group 4: the value cell text (trimmed)
52
+ * Capture group 5: trailing whitespace + closing pipe(s)
53
+ *
54
+ * We use a single-line match (`m` flag so ^ anchors work on each line) to
55
+ * avoid cross-row replacement.
56
+ */
57
+ function tableRowPattern(escapedFieldName) {
58
+ return new RegExp(`^(\\|[ \\t]*)(${escapedFieldName})([ \\t]*\\|[ \\t]*)([^|\\n]*?)([ \\t]*\\|[ \\t]*)$`, 'im');
59
+ }
60
+ function stateExtractField(content, fieldName) {
61
+ const escaped = escapeRegex(fieldName);
62
+ // Bold inline format: **FieldName:** value
63
+ const boldPattern = new RegExp(`\\*\\*${escaped}:\\*\\*[ \\t]*(.+)`, 'i');
64
+ const boldMatch = content.match(boldPattern);
65
+ if (boldMatch)
66
+ return boldMatch[1].trim();
67
+ // Plain line-start format: FieldName: value
68
+ const plainPattern = new RegExp(`^${escaped}:[ \\t]*(.+)`, 'im');
69
+ const plainMatch = content.match(plainPattern);
70
+ if (plainMatch)
71
+ return plainMatch[1].trim();
72
+ // Pipe-table format: | FieldName | value |
73
+ // (Separator rows such as `| --- | --- |` are excluded.)
74
+ const tableMatch = content.match(tableRowPattern(escaped));
75
+ if (tableMatch && !isTableSeparatorRow(tableMatch[2]))
76
+ return tableMatch[4].trim();
77
+ return null;
78
+ }
79
+ function stateReplaceField(content, fieldName, newValue) {
80
+ const escaped = escapeRegex(fieldName);
81
+ // Bold inline format: **FieldName:** value
82
+ const boldPattern = new RegExp(`(\\*\\*${escaped}:\\*\\*\\s*)(.*)`, 'i');
83
+ if (boldPattern.test(content)) {
84
+ return content.replace(boldPattern, (_match, prefix) => `${prefix}${newValue}`);
85
+ }
86
+ // Plain line-start format: FieldName: value
87
+ const plainPattern = new RegExp(`(^${escaped}:\\s*)(.*)`, 'im');
88
+ if (plainPattern.test(content)) {
89
+ return content.replace(plainPattern, (_match, prefix) => `${prefix}${newValue}`);
90
+ }
91
+ // Pipe-table format: | FieldName | value |
92
+ // Preserve the surrounding pipe/whitespace structure; only swap the value cell.
93
+ const tblPat = tableRowPattern(escaped);
94
+ const tblMatch = content.match(tblPat);
95
+ if (tblMatch && !isTableSeparatorRow(tblMatch[2])) {
96
+ // Reconstruct the row, preserving the original surrounding whitespace/pipes.
97
+ return content.replace(tblPat, (_m, leadPipe, fieldCell, midPipe, _oldVal, trailPipe) => `${leadPipe}${fieldCell}${midPipe}${newValue}${trailPipe}`);
98
+ }
99
+ return null;
100
+ }
101
+ function stateReplaceFieldWithFallback(content, primary, fallback, value) {
102
+ let result = stateReplaceField(content, primary, value);
103
+ if (result)
104
+ return result;
105
+ if (fallback) {
106
+ result = stateReplaceField(content, fallback, value);
107
+ if (result)
108
+ return result;
109
+ }
110
+ return content;
111
+ }
112
+ function normalizeStateStatus(status, pausedAt) {
113
+ let normalizedStatus = status || 'unknown';
114
+ const statusLower = (status || '').toLowerCase();
115
+ if (statusLower.includes('paused') || statusLower.includes('stopped') || pausedAt) {
116
+ normalizedStatus = 'paused';
117
+ }
118
+ else if (statusLower.includes('executing') || statusLower.includes('in progress')) {
119
+ normalizedStatus = 'executing';
120
+ }
121
+ else if (statusLower.includes('planning') || statusLower.includes('ready to plan')) {
122
+ normalizedStatus = 'planning';
123
+ }
124
+ else if (statusLower.includes('discussing')) {
125
+ normalizedStatus = 'discussing';
126
+ }
127
+ else if (statusLower.includes('verif')) {
128
+ normalizedStatus = 'verifying';
129
+ }
130
+ else if (statusLower.includes('complete') || statusLower.includes('done')) {
131
+ normalizedStatus = 'completed';
132
+ }
133
+ else if (statusLower.includes('ready to execute')) {
134
+ normalizedStatus = 'executing';
135
+ }
136
+ return normalizedStatus;
137
+ }
138
+ function computeProgressPercent(completedPlans, totalPlans, completedPhases, totalPhases) {
139
+ const hasPlanData = totalPlans !== null && totalPlans > 0 && completedPlans !== null;
140
+ const hasPhaseData = totalPhases !== null && totalPhases > 0 && completedPhases !== null;
141
+ if (!hasPlanData && !hasPhaseData)
142
+ return null;
143
+ // Use nullish coalescing to avoid non-null assertion operators (flow narrowing
144
+ // cannot track through intermediate boolean variables).
145
+ const planFraction = hasPlanData ? (completedPlans ?? 0) / (totalPlans ?? 1) : 1;
146
+ const phaseFraction = hasPhaseData ? (completedPhases ?? 0) / (totalPhases ?? 1) : 1;
147
+ return Math.min(100, Math.round(Math.min(planFraction, phaseFraction) * 100));
148
+ }
149
+ function shouldPreserveExistingProgress(existingProgress, derivedProgress) {
150
+ if (!existingProgress || typeof existingProgress !== 'object')
151
+ return false;
152
+ if (!derivedProgress || typeof derivedProgress !== 'object')
153
+ return false;
154
+ const existing = existingProgress;
155
+ const derived = derivedProgress;
156
+ return (existingProgressExceedsDerived(existing, derived, 'total_phases') ||
157
+ existingProgressExceedsDerived(existing, derived, 'completed_phases') ||
158
+ existingProgressExceedsDerived(existing, derived, 'total_plans') ||
159
+ existingProgressExceedsDerived(existing, derived, 'completed_plans'));
160
+ }
161
+ function normalizeProgressNumbers(progress) {
162
+ if (!progress || typeof progress !== 'object')
163
+ return progress;
164
+ const normalized = { ...progress };
165
+ for (const key of ['total_phases', 'completed_phases', 'total_plans', 'completed_plans', 'percent']) {
166
+ const number = toFiniteNumber(normalized[key]);
167
+ if (number !== null)
168
+ normalized[key] = number;
169
+ }
170
+ return normalized;
171
+ }
172
+ /**
173
+ * KNOWN_TEMPLATE_DEFAULTS — per-field table of string values that were written
174
+ * by a GSD handler (not by an executor / human). A value that appears in this
175
+ * list is safe to overwrite on the next handler call. Any other value was
176
+ * authored by the executor and must be preserved (Knuth invariant:
177
+ * handler-owns-transition-between-known-template-defaults).
178
+ *
179
+ * Keys must match the canonical field name as it appears in STATE.md.
180
+ * Comparison is case-insensitive so "None" and "none" both match.
181
+ *
182
+ * For Status, exact strings are supplemented by a pattern list
183
+ * (KNOWN_STATUS_PATTERNS) that matches handler-generated values whose exact
184
+ * text is variable (e.g. "Executing Phase 5").
185
+ */
186
+ exports.KNOWN_TEMPLATE_DEFAULTS = {
187
+ 'Resume File': ['None'],
188
+ 'Status': [
189
+ 'Ready to execute',
190
+ 'Phase complete — ready for verification',
191
+ 'Ready to plan',
192
+ 'Defining requirements',
193
+ 'Planning complete',
194
+ // Legacy / abbreviated handler values present in older STATE.md files
195
+ 'Executing',
196
+ 'In progress',
197
+ 'Planning',
198
+ 'Verifying',
199
+ 'Completed',
200
+ 'Done',
201
+ 'Active',
202
+ 'Paused',
203
+ 'unknown',
204
+ ],
205
+ // Last Activity is a date field; ISO date-only strings (YYYY-MM-DD) are the
206
+ // handler-generated form. We detect them by shape rather than an exhaustive
207
+ // list because the date changes every day.
208
+ // NOTE: entries here are matched by isStateTemplateDefault using the date regex
209
+ // in addition to exact string equality.
210
+ 'Last Activity': [],
211
+ 'Last activity': [],
212
+ };
213
+ /**
214
+ * Regex patterns that match handler-generated Status values whose text includes
215
+ * a variable component (e.g. phase number). Checked after the KNOWN_TEMPLATE_DEFAULTS
216
+ * exact-match list in isStateTemplateDefault.
217
+ */
218
+ exports.KNOWN_STATUS_PATTERNS = [
219
+ /^Executing Phase\s+\d+/i,
220
+ /^Planning Phase\s+\d+/i,
221
+ /^Phase\s+\d+\s+complete/i,
222
+ /^Verifying Phase\s+\d+/i,
223
+ /^Phase complete/i,
224
+ // #1070: LLM executors (e.g. OpenCode) may write "Complete ✓" or bare "Complete"
225
+ // when finishing a phase. Only bare terminal markers yield to the next phase's
226
+ // "Ready to execute" during planned-phase. The pattern is anchored at both ends
227
+ // so that statuses with trailing prose (e.g. "Complete but needs manual QA",
228
+ // "Complete — ready for verification") are NOT matched and are preserved as
229
+ // executor-authored values. Only exact forms like "Complete", "Complete ✓",
230
+ // "Complete✓", or "Complete ☑ " (trailing whitespace) match.
231
+ /^Complete\s*[✓✔✅☑]?\s*$/i,
232
+ ];
233
+ /**
234
+ * Returns true when the given value is a known template default for the field,
235
+ * meaning a GSD handler wrote it and a subsequent handler may replace it.
236
+ *
237
+ * A value is considered a template default when:
238
+ * (a) it appears in KNOWN_TEMPLATE_DEFAULTS[field] (exact, case-insensitive), OR
239
+ * (b) it matches the ISO date-only shape (YYYY-MM-DD) for Last Activity fields
240
+ * (handlers always write bare dates; executors write narrative prose).
241
+ *
242
+ * @param field - Canonical field name (case-sensitive key lookup attempted
243
+ * first, then case-insensitive fallback).
244
+ * @param value - The current value extracted from STATE.md.
245
+ * @returns boolean
246
+ */
247
+ function isStateTemplateDefault(field, value) {
248
+ if (value === null || value === undefined)
249
+ return true; // absent → initial write
250
+ // Narrow to string: callers pass string values extracted from STATE.md.
251
+ const v = (typeof value === 'string' ? value : `${value}`).trim();
252
+ if (v === '')
253
+ return true; // blank → treat as absent
254
+ // Look up the defaults list, trying exact key first then case-insensitive.
255
+ let defaults = exports.KNOWN_TEMPLATE_DEFAULTS[field];
256
+ if (!defaults) {
257
+ const fieldLower = field.toLowerCase();
258
+ const matchKey = Object.keys(exports.KNOWN_TEMPLATE_DEFAULTS).find(k => k.toLowerCase() === fieldLower);
259
+ defaults = matchKey ? exports.KNOWN_TEMPLATE_DEFAULTS[matchKey] : null;
260
+ }
261
+ if (defaults && defaults.some(d => d.toLowerCase() === v.toLowerCase())) {
262
+ return true;
263
+ }
264
+ const fieldLower = field.toLowerCase();
265
+ // Status: also check pattern list for variable handler-generated values
266
+ // (e.g. "Executing Phase 5", "Planning Phase 3").
267
+ if (fieldLower === 'status') {
268
+ if (exports.KNOWN_STATUS_PATTERNS.some(p => p.test(v)))
269
+ return true;
270
+ }
271
+ // Last Activity / Last activity: bare ISO date (YYYY-MM-DD) is handler-generated.
272
+ if (fieldLower === 'last activity') {
273
+ if (/^\d{4}-\d{2}-\d{2}$/.test(v))
274
+ return true;
275
+ }
276
+ return false;
277
+ }
278
+ /**
279
+ * Replaces a field in STATE.md content only when the existing value is a known
280
+ * template default (or the field is absent). If the existing value is
281
+ * executor-authored, the content is returned unchanged.
282
+ *
283
+ * When `newValue` is null or undefined the function is a no-op (returns content).
284
+ *
285
+ * @param content - Full STATE.md text.
286
+ * @param field - Field name as it appears in STATE.md.
287
+ * @param knownDefaults - The defaults list to check against (typically
288
+ * KNOWN_TEMPLATE_DEFAULTS[field]).
289
+ * @param newValue - Value to write when replacement is permitted.
290
+ * @returns Updated content (or original if skipped).
291
+ */
292
+ function stateReplaceFieldIfTemplate(content, field, knownDefaults, newValue) {
293
+ if (newValue === null || newValue === undefined)
294
+ return content;
295
+ const existing = stateExtractField(content, field);
296
+ // Inline check: absent/blank → always write; in list → write; else → skip.
297
+ if (existing === null || existing === undefined || existing.trim() === '') {
298
+ return stateReplaceField(content, field, newValue) || content;
299
+ }
300
+ const v = existing.trim();
301
+ const inList = (knownDefaults || []).some(d => d.toLowerCase() === v.toLowerCase());
302
+ const fieldLower = field.toLowerCase();
303
+ // Special-case: Status pattern list for variable handler-generated values.
304
+ const matchesStatusPattern = (fieldLower === 'status') && exports.KNOWN_STATUS_PATTERNS.some(p => p.test(v));
305
+ // Special-case: Last Activity bare ISO date (YYYY-MM-DD) is handler-generated.
306
+ const isDateShape = (fieldLower === 'last activity') && /^\d{4}-\d{2}-\d{2}$/.test(v);
307
+ if (inList || matchesStatusPattern || isDateShape) {
308
+ return stateReplaceField(content, field, newValue) || content;
309
+ }
310
+ // Executor-authored — preserve.
311
+ return content;
312
+ }