@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,246 @@
1
+ "use strict";
2
+ /**
3
+ * Template — Template selection and fill operations
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written bin/lib/template.cjs collapsed
6
+ * to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
7
+ * from the prior hand-written .cjs; only strict types are added.
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
15
+ const ioMod = require("./io.cjs");
16
+ const { output, error } = ioMod;
17
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
18
+ const coreUtilsMod = require("./core-utils.cjs");
19
+ const { toPosixPath, generateSlugInternal } = coreUtilsMod;
20
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
21
+ const phaseIdMod = require("./phase-id.cjs");
22
+ const { normalizePhaseName } = phaseIdMod;
23
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
24
+ const phaseLocatorMod = require("./phase-locator.cjs");
25
+ const { findPhaseInternal } = phaseLocatorMod;
26
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
27
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
28
+ const planningWorkspace = require("./planning-workspace.cjs");
29
+ const { planningDir } = planningWorkspace;
30
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
31
+ const frontmatter = require("./frontmatter.cjs");
32
+ const { reconstructFrontmatter } = frontmatter;
33
+ // ─── cmdTemplateSelect ────────────────────────────────────────────────────────
34
+ function cmdTemplateSelect(cwd, planPath, raw) {
35
+ if (!planPath) {
36
+ error('plan-path required');
37
+ }
38
+ try {
39
+ const fullPath = node_path_1.default.join(cwd, planPath);
40
+ const content = node_fs_1.default.readFileSync(fullPath, 'utf-8');
41
+ // Simple heuristics
42
+ const taskMatch = content.match(/###\s*Task\s*\d+/g) || [];
43
+ const taskCount = taskMatch.length;
44
+ const decisionMatch = content.match(/decision/gi) || [];
45
+ const hasDecisions = decisionMatch.length > 0;
46
+ // Count file mentions
47
+ const fileMentions = new Set();
48
+ const filePattern = /`([^`]+\.[a-zA-Z]+)`/g;
49
+ let m;
50
+ while ((m = filePattern.exec(content)) !== null) {
51
+ if (m[1].includes('/') && !m[1].startsWith('http')) {
52
+ fileMentions.add(m[1]);
53
+ }
54
+ }
55
+ const fileCount = fileMentions.size;
56
+ let template = 'templates/summary-standard.md';
57
+ let type = 'standard';
58
+ if (taskCount <= 2 && fileCount <= 3 && !hasDecisions) {
59
+ template = 'templates/summary-minimal.md';
60
+ type = 'minimal';
61
+ }
62
+ else if (hasDecisions || fileCount > 6 || taskCount > 5) {
63
+ template = 'templates/summary-complex.md';
64
+ type = 'complex';
65
+ }
66
+ const result = { template, type, taskCount, fileCount, hasDecisions };
67
+ output(result, raw, template);
68
+ }
69
+ catch (e) {
70
+ // Fallback to standard
71
+ output({ template: 'templates/summary-standard.md', type: 'standard', error: e.message }, raw, 'templates/summary-standard.md');
72
+ }
73
+ }
74
+ // ─── cmdTemplateFill ──────────────────────────────────────────────────────────
75
+ function cmdTemplateFill(cwd, templateType, options, raw) {
76
+ if (!templateType) {
77
+ error('template type required: summary, plan, or verification');
78
+ }
79
+ if (!options.phase) {
80
+ error('--phase required');
81
+ }
82
+ const phaseInfo = findPhaseInternal(cwd, options.phase);
83
+ if (!phaseInfo || !phaseInfo.found) {
84
+ output({ error: 'Phase not found', phase: options.phase }, raw, undefined);
85
+ return;
86
+ }
87
+ const padded = normalizePhaseName(options.phase);
88
+ const today = new Date().toISOString().split('T')[0];
89
+ const phaseName = options.name || phaseInfo.phase_name || 'Unnamed';
90
+ const phaseSlug = phaseInfo.phase_slug || generateSlugInternal(phaseName);
91
+ const phaseId = `${padded}-${phaseSlug}`;
92
+ const planNum = (options.plan || '01').padStart(2, '0');
93
+ const fields = options.fields || {};
94
+ let frontmatterObj;
95
+ let body;
96
+ let fileName;
97
+ switch (templateType) {
98
+ case 'summary': {
99
+ frontmatterObj = {
100
+ phase: phaseId,
101
+ plan: planNum,
102
+ subsystem: '[primary category]',
103
+ tags: [],
104
+ provides: [],
105
+ affects: [],
106
+ 'tech-stack': { added: [], patterns: [] },
107
+ 'key-files': { created: [], modified: [] },
108
+ 'key-decisions': [],
109
+ 'patterns-established': [],
110
+ duration: '[X]min',
111
+ completed: today,
112
+ ...fields,
113
+ };
114
+ body = [
115
+ `# Phase ${options.phase}: ${phaseName} Summary`,
116
+ '',
117
+ '**[Substantive one-liner describing outcome]**',
118
+ '',
119
+ '## Performance',
120
+ '- **Duration:** [time]',
121
+ '- **Tasks:** [count completed]',
122
+ '- **Files modified:** [count]',
123
+ '',
124
+ '## Accomplishments',
125
+ '- [Key outcome 1]',
126
+ '- [Key outcome 2]',
127
+ '',
128
+ '## Task Commits',
129
+ '1. **Task 1: [task name]** - `hash`',
130
+ '',
131
+ '## Files Created/Modified',
132
+ '- `path/to/file.ts` - What it does',
133
+ '',
134
+ '## Decisions & Deviations',
135
+ '[Key decisions or "None - followed plan as specified"]',
136
+ '',
137
+ '## Next Phase Readiness',
138
+ '[What\'s ready for next phase]',
139
+ ].join('\n');
140
+ fileName = `${padded}-${planNum}-SUMMARY.md`;
141
+ break;
142
+ }
143
+ case 'plan': {
144
+ const planType = options.type || 'execute';
145
+ const wave = parseInt(String(options.wave), 10) || 1;
146
+ frontmatterObj = {
147
+ phase: phaseId,
148
+ plan: planNum,
149
+ type: planType,
150
+ wave,
151
+ depends_on: [],
152
+ files_modified: [],
153
+ autonomous: true,
154
+ user_setup: [],
155
+ must_haves: { truths: [], artifacts: [], key_links: [] },
156
+ ...fields,
157
+ };
158
+ const planBase = planningDir(cwd);
159
+ const projectRef = toPosixPath(node_path_1.default.relative(cwd, node_path_1.default.join(planBase, 'PROJECT.md')));
160
+ const roadmapRef = toPosixPath(node_path_1.default.relative(cwd, node_path_1.default.join(planBase, 'ROADMAP.md')));
161
+ const stateRef = toPosixPath(node_path_1.default.relative(cwd, node_path_1.default.join(planBase, 'STATE.md')));
162
+ body = [
163
+ `# Phase ${options.phase} Plan ${planNum}: [Title]`,
164
+ '',
165
+ '## Objective',
166
+ '- **What:** [What this plan builds]',
167
+ '- **Why:** [Why it matters for the phase goal]',
168
+ '- **Output:** [Concrete deliverable]',
169
+ '',
170
+ '## Context',
171
+ `@${projectRef}`,
172
+ `@${roadmapRef}`,
173
+ `@${stateRef}`,
174
+ '',
175
+ '## Tasks',
176
+ '',
177
+ '<task type="code">',
178
+ ' <name>[Task name]</name>',
179
+ ' <files>[file paths]</files>',
180
+ ' <action>[What to do]</action>',
181
+ ' <verify>[How to verify]</verify>',
182
+ ' <done>[Definition of done]</done>',
183
+ '</task>',
184
+ '',
185
+ '## Verification',
186
+ '[How to verify this plan achieved its objective]',
187
+ '',
188
+ '## Success Criteria',
189
+ '- [ ] [Criterion 1]',
190
+ '- [ ] [Criterion 2]',
191
+ ].join('\n');
192
+ fileName = `${padded}-${planNum}-PLAN.md`;
193
+ break;
194
+ }
195
+ case 'verification': {
196
+ frontmatterObj = {
197
+ phase: phaseId,
198
+ verified: new Date().toISOString(),
199
+ status: 'pending',
200
+ score: '0/0 must-haves verified',
201
+ ...fields,
202
+ };
203
+ body = [
204
+ `# Phase ${options.phase}: ${phaseName} — Verification`,
205
+ '',
206
+ '## Observable Truths',
207
+ '| # | Truth | Status | Evidence |',
208
+ '|---|-------|--------|----------|',
209
+ '| 1 | [Truth] | pending | |',
210
+ '',
211
+ '## Required Artifacts',
212
+ '| Artifact | Expected | Status | Details |',
213
+ '|----------|----------|--------|---------|',
214
+ '| [path] | [what] | pending | |',
215
+ '',
216
+ '## Key Link Verification',
217
+ '| From | To | Via | Status | Details |',
218
+ '|------|----|----|--------|---------|',
219
+ '| [source] | [target] | [connection] | pending | |',
220
+ '',
221
+ '## Requirements Coverage',
222
+ '| Requirement | Status | Blocking Issue |',
223
+ '|-------------|--------|----------------|',
224
+ '| [req] | pending | |',
225
+ '',
226
+ '## Result',
227
+ '[Pending verification]',
228
+ ].join('\n');
229
+ fileName = `${padded}-VERIFICATION.md`;
230
+ break;
231
+ }
232
+ default:
233
+ error(`Unknown template type: ${templateType}. Available: summary, plan, verification`);
234
+ return;
235
+ }
236
+ const fullContent = `---\n${reconstructFrontmatter(frontmatterObj)}\n---\n\n${body}\n`;
237
+ const outPath = node_path_1.default.join(cwd, phaseInfo.directory, fileName);
238
+ if (node_fs_1.default.existsSync(outPath)) {
239
+ output({ error: 'File already exists', path: toPosixPath(node_path_1.default.relative(cwd, outPath)) }, raw, undefined);
240
+ return;
241
+ }
242
+ (0, shell_command_projection_cjs_1.platformWriteSync)(outPath, fullContent);
243
+ const relPath = toPosixPath(node_path_1.default.relative(cwd, outPath));
244
+ output({ created: true, path: relPath, template: templateType }, raw, relPath);
245
+ }
246
+ module.exports = { cmdTemplateSelect, cmdTemplateFill };
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ /**
3
+ * UAT Predicate — Pure-computation UAT pass/fail evaluation
4
+ *
5
+ * Evaluates all *-UAT.md and *-VERIFICATION.md files in a phase directory and
6
+ * returns a typed report. Used by `phase uat-passed` to harden against the
7
+ * naive whole-file regex in cmdPhaseComplete which false-matches `result:` lines
8
+ * inside frontmatter, fenced code blocks, blockquotes, and HTML comments.
9
+ *
10
+ * Issue #247 — phase uat-passed predicate
11
+ *
12
+ * ADR-457 build-at-publish: compiled by tsc to gsd-core/bin/lib/uat-predicate.cjs.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ const node_fs_1 = __importDefault(require("node:fs"));
18
+ const node_path_1 = __importDefault(require("node:path"));
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const frontmatter = require("./frontmatter.cjs");
21
+ const { extractFrontmatter } = frontmatter;
22
+ // ─── Blocking state sets (documented for maintainability) ─────────────────────
23
+ // UAT file frontmatter `status` values that indicate the file is not fully done
24
+ const BLOCKING_UAT_FM_STATUSES = new Set([
25
+ 'partial', 'diagnosed', 'pending', 'blocked', 'in_progress', 'failed',
26
+ ]);
27
+ // UAT file frontmatter `result` values that indicate failure
28
+ const BLOCKING_UAT_FM_RESULTS = new Set(['pending', 'blocked', 'failed']);
29
+ // VERIFICATION file frontmatter `status` values that indicate passing
30
+ const PASSING_VERIFICATION_STATUSES = new Set([
31
+ 'complete', 'verified', 'passed', 'human_passed',
32
+ ]);
33
+ // VERIFICATION file frontmatter `status` values that explicitly block
34
+ const BLOCKING_VERIFICATION_FM_STATUSES = new Set([
35
+ 'human_needed', 'gaps_found', 'pending', 'blocked', 'partial',
36
+ 'failed', 'in_progress',
37
+ ]);
38
+ // UAT test-item `result` values that count as passing
39
+ const PASSING_RESULTS = new Set(['passed', 'pass']);
40
+ // ─── stripFalsePositiveContexts ───────────────────────────────────────────────
41
+ /**
42
+ * Remove contexts that can contain `result: ...` lines that are NOT real test results:
43
+ * (a) leading frontmatter block at byte 0
44
+ * (b) HTML comments (unterminated comments swallow to EOF — fail-closed)
45
+ * (c) fenced code blocks (backtick and tilde, indented too) via CommonMark state machine
46
+ * (d) blockquote lines
47
+ *
48
+ * Each step is a composable function (Kernighan's Law — independently testable).
49
+ * Returns surviving lines joined by '\n'. Robust to CRLF input.
50
+ */
51
+ function stripFalsePositiveContexts(content) {
52
+ // Step (a): strip leading frontmatter block only at byte 0
53
+ let stripped = content.replace(/^---\r?\n[\s\S]*?\r?\n---[ \t]*(\r?\n|$)/, '');
54
+ // Step (b): remove HTML comments anywhere; unterminated comment swallows to EOF
55
+ stripped = stripped.replace(/<!--[\s\S]*?(?:-->|$)/g, '');
56
+ // Step (c): remove fenced code blocks via CommonMark-style state machine (handles CRLF + indented fences)
57
+ stripped = _stripFencedBlocks(stripped).text;
58
+ // Step (d): remove blockquote lines
59
+ stripped = stripped
60
+ .split('\n')
61
+ .filter(line => !/^\s*>/.test(line))
62
+ .join('\n');
63
+ return stripped;
64
+ }
65
+ /**
66
+ * CommonMark-style fenced-code-block stripper.
67
+ * Tracks the opening delimiter char and length so that a ~~~ line inside a
68
+ * ``` fence is correctly treated as fence content, not a closing delimiter.
69
+ *
70
+ * Opening rule: first delimiter line with char+len sets openFence.
71
+ * Closing rule: delimiter line with SAME char, run length >= openFence.len,
72
+ * and NO trailing non-whitespace text closes the fence.
73
+ * All delimiter and content lines are dropped; non-fence lines are kept.
74
+ * Returns the kept text plus unterminatedFence:true if EOF inside a fence.
75
+ */
76
+ function _stripFencedBlocks(content) {
77
+ const lines = content.split('\n');
78
+ const kept = [];
79
+ let openFence = null;
80
+ const delimRe = /^(\s*)(`{3,}|~{3,})(.*)$/;
81
+ for (const rawLine of lines) {
82
+ // Tolerate CRLF: strip trailing \r for matching, but we work on split-by-\n lines
83
+ // (the outer caller joined by \n already; we just handle a stray \r in the last char)
84
+ const line = rawLine.replace(/\r$/, '');
85
+ const m = delimRe.exec(line);
86
+ if (m) {
87
+ const char = m[2][0];
88
+ const len = m[2].length;
89
+ const trailing = m[3];
90
+ if (openFence === null) {
91
+ // Opening delimiter — drop this line and record the fence
92
+ openFence = { char, len };
93
+ }
94
+ else if (char === openFence.char && len >= openFence.len && /^\s*$/.test(trailing)) {
95
+ // Closing delimiter (same char, sufficient length, no trailing text) — drop and close
96
+ openFence = null;
97
+ }
98
+ // else: mismatched delimiter inside fence (e.g. ~~~ inside ```) — drop as content
99
+ continue; // delimiter lines are always dropped
100
+ }
101
+ if (openFence === null) {
102
+ kept.push(rawLine);
103
+ }
104
+ // Lines inside fence are dropped
105
+ }
106
+ return { text: kept.join('\n'), unterminatedFence: openFence !== null };
107
+ }
108
+ /**
109
+ * Analyse raw markdown for structural anomalies (unterminated fence / comment).
110
+ * Exported for unit-testability and used by evaluateUatPassed for per-file malformed detection.
111
+ *
112
+ * FIX C: properly balanced comments are stripped before checking for a dangling <!--,
113
+ * so an earlier closed comment does not mask a later unterminated one.
114
+ */
115
+ function analyzeMarkdown(raw) {
116
+ // Detect an unterminated HTML comment via a paired scan: every `<!--` must
117
+ // have a following `-->`. Using indexOf (not a regex .replace of the comment
118
+ // token) avoids the js/incomplete-multi-character-sanitization pattern — and
119
+ // is exact: a closed earlier comment never masks a later unterminated one.
120
+ let unterminatedComment = false;
121
+ for (let i = 0;;) {
122
+ const open = raw.indexOf('<!--', i);
123
+ if (open === -1)
124
+ break;
125
+ const close = raw.indexOf('-->', open + 4);
126
+ if (close === -1) {
127
+ unterminatedComment = true;
128
+ break;
129
+ }
130
+ i = close + 3;
131
+ }
132
+ // Fence state machine gives the accurate unterminated-fence signal.
133
+ const { unterminatedFence } = _stripFencedBlocks(raw);
134
+ return { unterminatedFence, unterminatedComment };
135
+ }
136
+ // ─── parseUatResultItems ──────────────────────────────────────────────────────
137
+ /**
138
+ * HEADING-BLOCK parser: scan the CLEANED body (after stripFalsePositiveContexts)
139
+ * for UAT test blocks.
140
+ *
141
+ * For each ### N. Name heading, the block spans until the next ### heading or EOF.
142
+ * Within each block, find a column-0 anchored result line (rejects indented YAML
143
+ * block-scalar bodies and inline/quoted fakes).
144
+ *
145
+ * - If a heading block has NO column-0 result line → emit result:'missing' (blocker).
146
+ * - Support bracketed [passed] and bare passed (#2273).
147
+ * - Returns ALL items (both passing and non-passing).
148
+ */
149
+ function parseUatResultItems(cleanContent) {
150
+ const items = [];
151
+ // Find all ### N. Name headings (line-anchored)
152
+ const headingPattern = /^###\s*(\d+)\.\s*(.+)$/gm;
153
+ const headings = [];
154
+ let hMatch;
155
+ while ((hMatch = headingPattern.exec(cleanContent)) !== null) {
156
+ headings.push({
157
+ index: hMatch.index + hMatch[0].length,
158
+ test: parseInt(hMatch[1], 10),
159
+ name: hMatch[2].trim(),
160
+ });
161
+ }
162
+ for (let i = 0; i < headings.length; i++) {
163
+ const h = headings[i];
164
+ const blockStart = h.index;
165
+ // More precise: find next heading's position in the original string
166
+ // We'll slice from current heading end to the position just before next heading's "###"
167
+ const nextHeadingMatch = i + 1 < headings.length
168
+ ? cleanContent.lastIndexOf('\n###', headings[i + 1].index)
169
+ : -1;
170
+ const blockContent = nextHeadingMatch >= blockStart
171
+ ? cleanContent.slice(blockStart, nextHeadingMatch)
172
+ : cleanContent.slice(blockStart);
173
+ // Column-0 anchored result line: /^result:[ \t]*\[?([\w-]+)\]?/mi
174
+ // Uses [ \t]* (not \s*) so the captured value must sit on the SAME line as result:.
175
+ // A result: key with the value on a subsequent line yields no match → 'missing' (blocker).
176
+ const resultMatch = /^result:[ \t]*\[?([\w-]+)\]?/mi.exec(blockContent);
177
+ if (resultMatch) {
178
+ items.push({
179
+ test: h.test,
180
+ name: h.name,
181
+ result: resultMatch[1].toLowerCase(),
182
+ });
183
+ }
184
+ else {
185
+ // No column-0 result line → emit 'missing' (a non-passing state)
186
+ items.push({
187
+ test: h.test,
188
+ name: h.name,
189
+ result: 'missing',
190
+ });
191
+ }
192
+ }
193
+ return items;
194
+ }
195
+ // ─── evaluateUatPassed ────────────────────────────────────────────────────────
196
+ /**
197
+ * Evaluate all UAT/VERIFICATION files in a phase directory.
198
+ * Returns a UatPassedReport with the locked, stable shape defined by the interface.
199
+ *
200
+ * FAIL-CLOSED: any absence/ambiguity/malformed input → NOT passed.
201
+ * Pass requires at least one real passing check AND no blockers.
202
+ */
203
+ function evaluateUatPassed(phaseFullDir, opts) {
204
+ const requireVerification = opts?.policy?.requireVerification === true;
205
+ const blockers = [];
206
+ const checks = [];
207
+ const uatFiles = [];
208
+ const verificationFiles = [];
209
+ // Read the directory — if unreadable, treat as no files (fail-closed: no artifacts → not passed)
210
+ let dirEntries = [];
211
+ try {
212
+ dirEntries = node_fs_1.default.readdirSync(phaseFullDir);
213
+ }
214
+ catch {
215
+ // Unreadable dir — no_uat_artifacts:true, passed:false
216
+ const no_uat_artifacts = true;
217
+ if (requireVerification) {
218
+ blockers.push('policy: verification required but no passing *-VERIFICATION.md found');
219
+ }
220
+ return {
221
+ passed: false,
222
+ uat_files: [],
223
+ verification_files: [],
224
+ checks: [],
225
+ blockers,
226
+ no_uat_artifacts,
227
+ policy: { require_verification: requireVerification },
228
+ };
229
+ }
230
+ // Filter UAT and VERIFICATION files using the same filter as cmdPhaseComplete
231
+ const uatFileNames = dirEntries.filter(f => f.includes('-UAT') && f.endsWith('.md'));
232
+ const verFileNames = dirEntries.filter(f => f.includes('-VERIFICATION') && f.endsWith('.md'));
233
+ // ── Process UAT files ──────────────────────────────────────────────────────
234
+ for (const file of uatFileNames) {
235
+ uatFiles.push(file);
236
+ let raw = '';
237
+ try {
238
+ raw = node_fs_1.default.readFileSync(node_path_1.default.join(phaseFullDir, file), 'utf-8');
239
+ }
240
+ catch {
241
+ blockers.push(`${file}: could not read file`);
242
+ continue;
243
+ }
244
+ // ── Per-file malformed markdown guard ──────────────────────────────────
245
+ // FIX D: use accurate signals from analyzeMarkdown instead of heuristics.
246
+ // unterminatedFence: CommonMark state machine detects a genuinely unclosed fence.
247
+ // unterminatedComment: strips balanced comments first, then checks for leftover <!--.
248
+ const { unterminatedFence, unterminatedComment } = analyzeMarkdown(raw);
249
+ if (unterminatedFence || unterminatedComment) {
250
+ blockers.push(`${file}: malformed markdown (unterminated fence or comment)`);
251
+ }
252
+ const fm = extractFrontmatter(raw);
253
+ // File-level frontmatter status check
254
+ if (fm['status'] && BLOCKING_UAT_FM_STATUSES.has(fm['status'])) {
255
+ blockers.push(`${file}: frontmatter status=${fm['status']}`);
256
+ }
257
+ // File-level frontmatter result check
258
+ if (fm['result'] && BLOCKING_UAT_FM_RESULTS.has(fm['result'])) {
259
+ blockers.push(`${file}: frontmatter result=${fm['result']}`);
260
+ }
261
+ // Parse test items from the cleaned body (hardened against false positives)
262
+ const cleanContent = stripFalsePositiveContexts(raw);
263
+ const items = parseUatResultItems(cleanContent);
264
+ for (const item of items) {
265
+ const passing = PASSING_RESULTS.has(item.result);
266
+ checks.push({
267
+ file,
268
+ test: item.test,
269
+ name: item.name,
270
+ result: item.result,
271
+ passing,
272
+ });
273
+ if (!passing) {
274
+ blockers.push(`${file}: test ${item.test} (${item.result})`);
275
+ }
276
+ }
277
+ }
278
+ // ── Process VERIFICATION files ─────────────────────────────────────────────
279
+ let hasPassingVerification = false;
280
+ for (const file of verFileNames) {
281
+ verificationFiles.push(file);
282
+ let raw = '';
283
+ try {
284
+ raw = node_fs_1.default.readFileSync(node_path_1.default.join(phaseFullDir, file), 'utf-8');
285
+ }
286
+ catch {
287
+ blockers.push(`${file}: could not read verification file`);
288
+ continue;
289
+ }
290
+ const vfm = extractFrontmatter(raw);
291
+ const vStatus = vfm['status'];
292
+ if (vStatus && BLOCKING_VERIFICATION_FM_STATUSES.has(vStatus)) {
293
+ blockers.push(`${file}: verification status=${vStatus}`);
294
+ }
295
+ else if (vStatus && PASSING_VERIFICATION_STATUSES.has(vStatus)) {
296
+ // Allowlist: only explicitly-passing statuses count
297
+ hasPassingVerification = true;
298
+ }
299
+ // Missing or unknown status: does NOT count as passing, does NOT push a blocker
300
+ // (handled by the requireVerification policy check below if needed)
301
+ }
302
+ // ── Policy: requireVerification ───────────────────────────────────────────
303
+ if (requireVerification && !hasPassingVerification) {
304
+ blockers.push('policy: verification required but no passing *-VERIFICATION.md found');
305
+ }
306
+ // ── Determine no_uat_artifacts and passed ─────────────────────────────────
307
+ // no_uat_artifacts: true when no real UAT test items were parsed from any file
308
+ const no_uat_artifacts = checks.length === 0;
309
+ // FIX 1: require positive passing evidence; no vacuous pass
310
+ // passed = no blockers AND at least one check AND all checks passing
311
+ const passed = blockers.length === 0 && checks.length > 0 && checks.every(c => c.passing);
312
+ return {
313
+ passed,
314
+ uat_files: uatFiles,
315
+ verification_files: verificationFiles,
316
+ checks,
317
+ blockers,
318
+ no_uat_artifacts,
319
+ policy: {
320
+ require_verification: requireVerification,
321
+ },
322
+ };
323
+ }
324
+ module.exports = {
325
+ stripFalsePositiveContexts,
326
+ parseUatResultItems,
327
+ analyzeMarkdown,
328
+ evaluateUatPassed,
329
+ };