@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,260 @@
1
+ "use strict";
2
+ /**
3
+ * Post-planning gap analysis (#2493).
4
+ *
5
+ * Reads REQUIREMENTS.md (planning-root) and CONTEXT.md (per-phase) and compares
6
+ * each REQ-ID and D-ID against the concatenated text of all PLAN.md files in
7
+ * the phase directory. Emits a unified `Source | Item | Status` report.
8
+ *
9
+ * Gated on workflow.post_planning_gaps (default true). When false, returns
10
+ * { enabled: false } and does not scan.
11
+ *
12
+ * Coverage detection uses word-boundary regex matching to avoid false positives
13
+ * (REQ-1 must not match REQ-10).
14
+ *
15
+ * ADR-457 build-at-publish: the hand-written bin/lib/gap-checker.cjs collapsed
16
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
17
+ * from the prior hand-written .cjs; only strict types are added.
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ const node_fs_1 = __importDefault(require("node:fs"));
23
+ const node_path_1 = __importDefault(require("node:path"));
24
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
25
+ const io = require("./io.cjs");
26
+ const { output, error } = io;
27
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
28
+ const phaseId = require("./phase-id.cjs");
29
+ const { escapeRegex } = phaseId;
30
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
31
+ const planningWorkspace = require("./planning-workspace.cjs");
32
+ const { planningPaths, planningDir, findContextMdIn } = planningWorkspace;
33
+ const decisions_cjs_1 = require("./decisions.cjs");
34
+ /**
35
+ * Parse REQ-IDs from REQUIREMENTS.md content.
36
+ *
37
+ * Supports both checkbox (`- [ ] **REQ-NN** ...`) and traceability table
38
+ * (`| REQ-NN | ... |`) formats.
39
+ */
40
+ function parseRequirements(reqMd) {
41
+ if (!reqMd || typeof reqMd !== 'string')
42
+ return [];
43
+ const out = [];
44
+ const seen = new Set();
45
+ // Prefix-agnostic ID format: REQ-01, TST-01, BACK-07, INSP-04, etc.
46
+ const ID_PATTERN = '[A-Z][A-Z0-9]*-[A-Za-z0-9_-]+';
47
+ const checkboxRe = new RegExp(`^\\s*-\\s*\\[[x ]\\]\\s*\\*\\*(${ID_PATTERN})\\*\\*\\s*(.*)$`, 'gm');
48
+ let cm = checkboxRe.exec(reqMd);
49
+ while (cm !== null) {
50
+ const id = cm[1];
51
+ if (!seen.has(id)) {
52
+ seen.add(id);
53
+ out.push({ id, text: (cm[2] || '').trim() });
54
+ }
55
+ cm = checkboxRe.exec(reqMd);
56
+ }
57
+ const tableFirstCellRe = new RegExp(`^\\s*\\|\\s*(${ID_PATTERN})\\s*\\|`);
58
+ const separatorRowRe = /^\s*\|[\s:|-]+\|\s*$/;
59
+ const lines = reqMd.split(/\r?\n/);
60
+ for (let i = 0; i < lines.length; i += 1) {
61
+ const line = lines[i];
62
+ if (!line.includes('|'))
63
+ continue;
64
+ // Skip markdown table separator rows and header rows immediately preceding them.
65
+ if (separatorRowRe.test(line))
66
+ continue;
67
+ if (i + 1 < lines.length && separatorRowRe.test(lines[i + 1]))
68
+ continue;
69
+ const tm = tableFirstCellRe.exec(line);
70
+ if (!tm)
71
+ continue;
72
+ const id = tm[1];
73
+ if (!seen.has(id)) {
74
+ seen.add(id);
75
+ out.push({ id, text: '' });
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ function detectCoverage(items, planText) {
81
+ return items.map(it => {
82
+ const re = new RegExp('\\b' + escapeRegex(it.id) + '\\b');
83
+ return {
84
+ source: it.source,
85
+ item: it.id,
86
+ status: re.test(planText) ? 'Covered' : 'Not covered',
87
+ };
88
+ });
89
+ }
90
+ function naturalKey(s) {
91
+ return String(s).replace(/(\d+)/g, (_, n) => n.padStart(8, '0'));
92
+ }
93
+ function sortRows(rows) {
94
+ const sourceOrder = { 'REQUIREMENTS.md': 0, 'CONTEXT.md': 1 };
95
+ return rows.slice().sort((a, b) => {
96
+ const so = (sourceOrder[a.source] ?? 99) - (sourceOrder[b.source] ?? 99);
97
+ if (so !== 0)
98
+ return so;
99
+ return naturalKey(a.item).localeCompare(naturalKey(b.item));
100
+ });
101
+ }
102
+ function formatGapTable(rows) {
103
+ if (rows.length === 0) {
104
+ return '## Post-Planning Gap Analysis\n\nNo requirements or decisions to check.\n';
105
+ }
106
+ const header = '| Source | Item | Status |\n|--------|------|--------|';
107
+ const body = rows.map(r => {
108
+ const tick = r.status === 'Covered' ? '✓ Covered'
109
+ : r.status === 'Missing from REQUIREMENTS.md' ? '⚠ Missing from REQUIREMENTS.md'
110
+ : '✗ Not covered';
111
+ return `| ${r.source} | ${r.item} | ${tick} |`;
112
+ }).join('\n');
113
+ return `## Post-Planning Gap Analysis\n\n${header}\n${body}\n`;
114
+ }
115
+ function readGate(cwd) {
116
+ const cfgPath = node_path_1.default.join(planningDir(cwd), 'config.json');
117
+ try {
118
+ const raw = JSON.parse(node_fs_1.default.readFileSync(cfgPath, 'utf-8'));
119
+ if (raw && typeof raw === 'object' && 'workflow' in raw) {
120
+ const wf = raw['workflow'];
121
+ if (wf && typeof wf === 'object' && 'post_planning_gaps' in wf) {
122
+ const val = wf['post_planning_gaps'];
123
+ if (typeof val === 'boolean')
124
+ return val;
125
+ }
126
+ }
127
+ }
128
+ catch { /* fall through */ }
129
+ return true;
130
+ }
131
+ /**
132
+ * Normalize a raw `--phase-req-ids` argument into the scoping signal used by
133
+ * runGapAnalysis (#447). Mirrors §13's null/TBD skip semantics.
134
+ *
135
+ * undefined → flag absent: compare the whole REQUIREMENTS.md (back-compat)
136
+ * null | '' | TBD → no requirements mapped to this phase: skip the comparison
137
+ * "REQ-01,REQ-02" → restrict the comparison to these IDs
138
+ *
139
+ * Tolerates JSON-array-ish input (`["REQ-01","REQ-02"]`) since callers may pass
140
+ * the roadmap value through verbatim.
141
+ */
142
+ function normalizePhaseReqIds(rawVal) {
143
+ if (rawVal === undefined)
144
+ return undefined;
145
+ if (rawVal === null)
146
+ return null;
147
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
148
+ const v = String(rawVal).replace(/["'[\]()]/g, '').trim();
149
+ if (v === '' || /^(null|tbd|none)$/i.test(v))
150
+ return null;
151
+ // Tolerate comma-, space-, or newline-separated lists (callers may pass the
152
+ // roadmap value verbatim, whose serialization is not guaranteed).
153
+ const ids = v.split(/[\s,]+/).map(s => s.trim()).filter(Boolean);
154
+ return ids.length === 0 ? null : ids;
155
+ }
156
+ function runGapAnalysis(cwd, phaseDir, options = {}) {
157
+ const phaseReqIds = normalizePhaseReqIds(options.phaseReqIds);
158
+ if (!readGate(cwd)) {
159
+ return {
160
+ enabled: false,
161
+ rows: [],
162
+ table: '',
163
+ summary: 'workflow.post_planning_gaps disabled — skipping post-planning gap analysis',
164
+ counts: { total: 0, covered: 0, uncovered: 0 },
165
+ };
166
+ }
167
+ const absPhaseDir = node_path_1.default.isAbsolute(phaseDir) ? phaseDir : node_path_1.default.join(cwd, phaseDir);
168
+ const reqPath = planningPaths(cwd).requirements;
169
+ const reqMd = node_fs_1.default.existsSync(reqPath) ? node_fs_1.default.readFileSync(reqPath, 'utf-8') : '';
170
+ let reqItems = parseRequirements(reqMd).map(r => ({ ...r, source: 'REQUIREMENTS.md' }));
171
+ // Scope the requirements comparison to the phase's mapped REQ-IDs (#447).
172
+ // A phase that maps no requirements (phase_req_ids null/TBD) must not report
173
+ // every unrelated project REQ-ID as a gap — mirror §13's skip behavior.
174
+ // CONTEXT.md decisions (below) are always in scope regardless.
175
+ let ghostReqIds = [];
176
+ if (phaseReqIds === null) {
177
+ reqItems = [];
178
+ }
179
+ else if (Array.isArray(phaseReqIds)) {
180
+ const wanted = new Set(phaseReqIds);
181
+ const foundIds = new Set(reqItems.map(r => r.id));
182
+ reqItems = reqItems.filter(r => wanted.has(r.id));
183
+ ghostReqIds = phaseReqIds.filter(id => !foundIds.has(id));
184
+ }
185
+ // Read the phase directory once; reuse the listing for both context detection
186
+ // and plan-file enumeration (avoids redundant readdirSync calls).
187
+ let phaseDirFiles = [];
188
+ try {
189
+ if (node_fs_1.default.existsSync(absPhaseDir))
190
+ phaseDirFiles = node_fs_1.default.readdirSync(absPhaseDir);
191
+ }
192
+ catch { /* unreadable */ }
193
+ const ctxFile = findContextMdIn(phaseDirFiles);
194
+ const ctxPath = ctxFile ? node_path_1.default.join(absPhaseDir, ctxFile) : null;
195
+ const ctxMd = ctxPath ? node_fs_1.default.readFileSync(ctxPath, 'utf-8') : '';
196
+ const dItems = (0, decisions_cjs_1.parseDecisions)(ctxMd).map(d => ({ ...d, source: 'CONTEXT.md' }));
197
+ const items = [...reqItems, ...dItems];
198
+ let planText = '';
199
+ try {
200
+ if (phaseDirFiles.length > 0) {
201
+ const files = phaseDirFiles.filter(f => /-PLAN\.md$/.test(f));
202
+ planText = files.map(f => {
203
+ try {
204
+ return node_fs_1.default.readFileSync(node_path_1.default.join(absPhaseDir, f), 'utf-8');
205
+ }
206
+ catch {
207
+ return '';
208
+ }
209
+ }).join('\n');
210
+ }
211
+ }
212
+ catch { /* unreadable */ }
213
+ if (items.length === 0) {
214
+ return {
215
+ enabled: true,
216
+ rows: [],
217
+ table: '## Post-Planning Gap Analysis\n\nNo requirements or decisions to check.\n',
218
+ summary: 'no requirements or decisions to check',
219
+ counts: { total: 0, covered: 0, uncovered: 0 },
220
+ };
221
+ }
222
+ const rows = sortRows([
223
+ ...detectCoverage(items, planText),
224
+ ...ghostReqIds.map(id => ({ source: 'REQUIREMENTS.md', item: id, status: 'Missing from REQUIREMENTS.md' })),
225
+ ]);
226
+ const covered = rows.filter(r => r.status === 'Covered').length;
227
+ const uncovered = rows.length - covered;
228
+ const summary = uncovered === 0
229
+ ? `✓ All ${rows.length} items covered by plans`
230
+ : `⚠ ${uncovered} of ${rows.length} items not covered by any plan`;
231
+ return {
232
+ enabled: true,
233
+ rows,
234
+ table: formatGapTable(rows) + '\n' + summary + '\n',
235
+ summary,
236
+ counts: { total: rows.length, covered, uncovered },
237
+ };
238
+ }
239
+ function cmdGapAnalysis(cwd, args, raw) {
240
+ const idx = args.indexOf('--phase-dir');
241
+ if (idx === -1 || !args[idx + 1]) {
242
+ error('Usage: gap-analysis --phase-dir <path-to-phase-directory>');
243
+ }
244
+ const phaseDir = args[idx + 1];
245
+ // Optional --phase-req-ids scopes the requirements comparison (#447).
246
+ // Absent → compare the whole REQUIREMENTS.md (back-compat).
247
+ const reqIdx = args.indexOf('--phase-req-ids');
248
+ const phaseReqIds = reqIdx === -1 ? undefined : (args[reqIdx + 1] ?? '');
249
+ const result = runGapAnalysis(cwd, phaseDir, { phaseReqIds });
250
+ output(result, raw, result.table || result.summary);
251
+ }
252
+ module.exports = {
253
+ parseRequirements,
254
+ detectCoverage,
255
+ formatGapTable,
256
+ sortRows,
257
+ normalizePhaseReqIds,
258
+ runGapAnalysis,
259
+ cmdGapAnalysis,
260
+ };
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * Git Base-Branch Resolver — issue #1146.
4
+ *
5
+ * Single source of truth for detecting the repository's default branch.
6
+ * Replaces the duplicated per-workflow bash detection that only consulted
7
+ * `refs/remotes/origin/HEAD` then hardcoded `:-main`, which silently
8
+ * returned "main" for repos whose default branch is "master" whenever
9
+ * origin/HEAD was unset (git init + remote add / fetch without set-head /
10
+ * most CI checkouts / many worktrees).
11
+ *
12
+ * Precedence ladder (highest to lowest):
13
+ * 1. `git.base_branch` config override from .planning/config.json
14
+ * 2. `git symbolic-ref --short refs/remotes/origin/HEAD` (fast, no network)
15
+ * 3. `git remote show origin` HEAD branch ← AUTHORITATIVE; works when #2 unset
16
+ * 4. Local branch existence: "master" present + "main" absent → "master";
17
+ * "main" present → "main"
18
+ * 5. "main" (last-resort default)
19
+ *
20
+ * Every git subprocess is bounded with a timeout (≤ 30 s); on timeout/error
21
+ * the resolver degrades gracefully to the next tier — it never throws.
22
+ *
23
+ * Pure/testable: all I/O is injectable via the `deps` argument so unit
24
+ * tests can run without touching the real filesystem or spawning real git.
25
+ */
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.readConfigBaseBranch = readConfigBaseBranch;
31
+ exports.trySymbolicRef = trySymbolicRef;
32
+ exports.tryRemoteShow = tryRemoteShow;
33
+ exports.tryLocalBranch = tryLocalBranch;
34
+ exports.resolveBaseBranch = resolveBaseBranch;
35
+ exports.gitWorktreeInfoInternal = gitWorktreeInfoInternal;
36
+ exports.cmdGitBaseBranch = cmdGitBaseBranch;
37
+ const node_fs_1 = __importDefault(require("node:fs"));
38
+ const node_path_1 = __importDefault(require("node:path"));
39
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
40
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
41
+ /**
42
+ * Safely look up `git.base_branch` from the project's config.json.
43
+ * Returns the configured value (a non-empty, non-null string) or null.
44
+ */
45
+ function readConfigBaseBranch(planningDir, deps) {
46
+ const readFile = deps?.readFile ??
47
+ ((p) => { try {
48
+ return node_fs_1.default.readFileSync(p, 'utf8');
49
+ }
50
+ catch {
51
+ return null;
52
+ } });
53
+ const configPath = node_path_1.default.join(planningDir, 'config.json');
54
+ const raw = readFile(configPath);
55
+ if (!raw)
56
+ return null;
57
+ let cfg;
58
+ try {
59
+ cfg = JSON.parse(raw);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ if (!cfg || typeof cfg !== 'object' || Array.isArray(cfg))
65
+ return null;
66
+ const top = cfg;
67
+ // Support both "git.base_branch" (nested) and "base_branch" (flat legacy)
68
+ const gitSection = top.git;
69
+ if (gitSection && typeof gitSection === 'object' && !Array.isArray(gitSection)) {
70
+ const nested = gitSection.base_branch;
71
+ if (typeof nested === 'string' && nested.trim())
72
+ return nested.trim();
73
+ }
74
+ const flat = top.base_branch;
75
+ if (typeof flat === 'string' && flat.trim())
76
+ return flat.trim();
77
+ return null;
78
+ }
79
+ /**
80
+ * Try `git symbolic-ref --short refs/remotes/origin/HEAD` (no network).
81
+ * Strips the `origin/` prefix to return just the branch name.
82
+ * Returns null if unset or on error/timeout.
83
+ */
84
+ function trySymbolicRef(cwd, execGit) {
85
+ try {
86
+ const r = execGit(['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'], { cwd, timeout: 5_000 });
87
+ if (r.exitCode !== 0 || !r.stdout)
88
+ return null;
89
+ // Output is e.g. "origin/main" — strip the prefix
90
+ const branch = r.stdout.trim().replace(/^origin\//, '');
91
+ return branch || null;
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Try `git remote show origin` to read the HEAD branch.
99
+ * This is authoritative when origin/HEAD is unset locally.
100
+ * Requires network access but succeeds in the common CI case where
101
+ * origin/HEAD was never set after `git init && git remote add origin`.
102
+ *
103
+ * Parses the line: `HEAD branch: <name>`
104
+ * Returns null on error, timeout, or if the output is malformed.
105
+ */
106
+ function tryRemoteShow(cwd, execGit) {
107
+ try {
108
+ const r = execGit(['remote', 'show', 'origin'], { cwd, timeout: 15_000 });
109
+ if (r.exitCode !== 0 || !r.stdout)
110
+ return null;
111
+ // The line looks like: " HEAD branch: master"
112
+ const m = r.stdout.match(/^\s*HEAD branch:\s*(\S+)\s*$/m);
113
+ if (!m)
114
+ return null;
115
+ const branch = m[1];
116
+ // git emits "(unknown)" when the remote is offline but the local cache
117
+ // resolved it; treat that as non-authoritative and fall through.
118
+ if (!branch || branch === '(unknown)')
119
+ return null;
120
+ return branch;
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ /**
127
+ * Detect local branch existence as a tie-breaker when no remote info is available.
128
+ *
129
+ * Rules:
130
+ * - "master" present AND "main" absent → "master"
131
+ * - "main" present → "main"
132
+ * - Neither → null (fall through to default)
133
+ *
134
+ * Returns null on error/timeout.
135
+ */
136
+ function tryLocalBranch(cwd, execGit) {
137
+ try {
138
+ const r = execGit(['branch', '--list', 'main', 'master'], { cwd, timeout: 5_000 });
139
+ if (r.exitCode !== 0 || !r.stdout)
140
+ return null;
141
+ // `git branch --list main master` outputs one line per matching branch
142
+ const lines = r.stdout.split('\n').map(l => l.trim().replace(/^\*\s*/, ''));
143
+ const hasMain = lines.includes('main');
144
+ const hasMaster = lines.includes('master');
145
+ if (hasMaster && !hasMain)
146
+ return 'master';
147
+ if (hasMain)
148
+ return 'main';
149
+ return null;
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ }
155
+ /**
156
+ * Resolve the default/base branch for the repository at `cwd`.
157
+ *
158
+ * Consults the full precedence ladder and always returns a non-empty string.
159
+ * Never throws.
160
+ */
161
+ function resolveBaseBranch(cwd, deps) {
162
+ const execGit = deps?.execGit ?? shell_command_projection_cjs_1.execGit;
163
+ // Derive .planning dir relative to cwd (mirrors planningDir() in planning-workspace.cjs)
164
+ const planningDir = node_path_1.default.join(cwd, '.planning');
165
+ // 1. Config override
166
+ const configured = readConfigBaseBranch(planningDir, deps);
167
+ if (configured)
168
+ return configured;
169
+ // 2. symbolic-ref (fast, no network)
170
+ const symref = trySymbolicRef(cwd, execGit);
171
+ if (symref)
172
+ return symref;
173
+ // 3. git remote show origin (authoritative when origin/HEAD unset)
174
+ const remoteShow = tryRemoteShow(cwd, execGit);
175
+ if (remoteShow)
176
+ return remoteShow;
177
+ // 4. Local branch existence
178
+ const local = tryLocalBranch(cwd, execGit);
179
+ if (local)
180
+ return local;
181
+ // 5. Last-resort default
182
+ return 'main';
183
+ }
184
+ /**
185
+ * Detect whether `cwd` sits inside a git worktree, and if so, return the
186
+ * absolute path of the worktree root.
187
+ */
188
+ function gitWorktreeInfoInternal(cwd) {
189
+ try {
190
+ const insideResult = (0, shell_command_projection_cjs_1.execGit)(['rev-parse', '--is-inside-work-tree'], { cwd, timeout: 5000 });
191
+ if (insideResult.exitCode !== 0) {
192
+ return { inside: false, worktreeRoot: null };
193
+ }
194
+ const insideStdout = String(insideResult.stdout || '').trim();
195
+ if (insideStdout !== 'true') {
196
+ return { inside: false, worktreeRoot: null };
197
+ }
198
+ const rootResult = (0, shell_command_projection_cjs_1.execGit)(['rev-parse', '--show-toplevel'], { cwd, timeout: 5000 });
199
+ if (rootResult.exitCode !== 0) {
200
+ return { inside: true, worktreeRoot: null };
201
+ }
202
+ const root = String(rootResult.stdout || '').trim();
203
+ return { inside: true, worktreeRoot: root || null };
204
+ }
205
+ catch {
206
+ return { inside: false, worktreeRoot: null };
207
+ }
208
+ }
209
+ // ─── CLI entry point ──────────────────────────────────────────────────────────
210
+ /**
211
+ * CLI command: `gsd-tools git base-branch`
212
+ * Resolves the default branch and writes it to stdout (raw string, newline-terminated).
213
+ * Called by workflows via `gsd_run query git.base-branch`.
214
+ */
215
+ function cmdGitBaseBranch(cwd, _args, deps) {
216
+ const branch = resolveBaseBranch(cwd, deps);
217
+ const write = deps?.write ?? ((s) => process.stdout.write(s));
218
+ write(branch + '\n');
219
+ return branch;
220
+ }
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+ /**
3
+ * Graphify command router — CLI subcommand dispatcher for `gsd-tools graphify`.
4
+ *
5
+ * ADR-959 (phase 4d-impl-2) pilot: first real capability command cutover.
6
+ * Extracted from the hardcoded `case 'graphify':` arm in gsd-tools.cjs.
7
+ * Behaviour is preserved byte-for-behaviour from the prior inline case;
8
+ * the dispatch path now flows: default → dispatchCapabilityCommand →
9
+ * require(graphify-command-router.cjs) → routeGraphifyCommand.
10
+ *
11
+ * Router signature: { args, cwd, raw, error } — identical to the 12 existing
12
+ * host routers. No new handler/arg convention; the capability registry
13
+ * discovers this router by name.
14
+ *
15
+ * Arg indexing (preserved exactly from the original case):
16
+ * args[0] = 'graphify' (family — matched by dispatchCapabilityCommand)
17
+ * args[1] = subcommand (query | status | diff | build)
18
+ * args[2] = term (query) | 'snapshot' (build snapshot)
19
+ * args.indexOf('--budget') + 1 = budget value
20
+ *
21
+ * Test seam: pass `_graphify` in the options object to inject a recording mock
22
+ * instead of the real graphify module. The `_`-prefix follows the repo's
23
+ * established seam convention (see other routers). Production callers omit it.
24
+ */
25
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
26
+ const graphify = require("./graphify.cjs");
27
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
28
+ const io = require("./io.cjs");
29
+ const { output, ERROR_REASON } = io;
30
+ // ─── Implementation ───────────────────────────────────────────────────────────
31
+ function routeGraphifyCommand({ args, cwd, raw, error, _graphify }) {
32
+ const subcommand = args[1];
33
+ const g = _graphify ?? graphify;
34
+ if (subcommand === 'query') {
35
+ const term = args[2];
36
+ if (!term) {
37
+ error('Usage: gsd-tools graphify query <term>', ERROR_REASON.USAGE);
38
+ return;
39
+ }
40
+ const budgetIdx = args.indexOf('--budget');
41
+ let budget = null;
42
+ if (budgetIdx !== -1) {
43
+ const rawBudget = args[budgetIdx + 1];
44
+ if (rawBudget === undefined || Number.isNaN(parseInt(rawBudget, 10))) {
45
+ error('Usage: gsd-tools graphify query <term> [--budget <N>]', ERROR_REASON.USAGE);
46
+ return;
47
+ }
48
+ budget = parseInt(rawBudget, 10);
49
+ }
50
+ output(g.graphifyQuery(cwd, term, { budget }), raw);
51
+ }
52
+ else if (subcommand === 'status') {
53
+ output(g.graphifyStatus(cwd), raw);
54
+ }
55
+ else if (subcommand === 'diff') {
56
+ output(g.graphifyDiff(cwd), raw);
57
+ }
58
+ else if (subcommand === 'build') {
59
+ if (args[2] === 'snapshot') {
60
+ output(g.writeSnapshot(cwd), raw);
61
+ }
62
+ else {
63
+ output(g.graphifyBuild(cwd), raw);
64
+ }
65
+ }
66
+ else {
67
+ error('Unknown graphify subcommand. Available: build, query, status, diff', ERROR_REASON.SDK_UNKNOWN_COMMAND);
68
+ }
69
+ }
70
+ module.exports = {
71
+ routeGraphifyCommand,
72
+ };