@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,213 @@
1
+ "use strict";
2
+ /**
3
+ * Pure phase-id parsing/matching helpers — normalize, token match,
4
+ * milestone/phase-dir id parsing, phase-markdown regex builders.
5
+ *
6
+ * Extracted from core.cts (ADR-857 rollout phase 2a / issue #865).
7
+ * The hand-written bodies are preserved byte-for-behaviour; only the module
8
+ * boundary moved. The core.cjs re-export spine was retired in epic #1267;
9
+ * callers import phase-id helpers from phase-id.cjs directly.
10
+ *
11
+ * Dependencies: none (pure string/regex, no Node built-ins required).
12
+ */
13
+ // ─── Phase-id helpers ─────────────────────────────────────────────────────────
14
+ function escapeRegex(value) {
15
+ return String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
16
+ }
17
+ function normalizePhaseName(phase) {
18
+ const str = String(phase);
19
+ // Strip optional project_code prefix (e.g., 'CK-01' → '01')
20
+ const stripped = str.replace(/^[A-Z]{1,6}-(?=\d)/, '');
21
+ // Milestone-prefixed phase IDs: M-NN or M-N-N (deep decomposition).
22
+ const milestoneMatch = stripped.match(/^(\d+)((?:-\d+)+)([A-Z]?(?:\.\d+)*)$/i);
23
+ if (milestoneMatch) {
24
+ const major = milestoneMatch[1].padStart(2, '0');
25
+ const subSegments = milestoneMatch[2].slice(1).split('-').map(s => s.padStart(2, '0'));
26
+ const suffix = milestoneMatch[3] || '';
27
+ return `${major}-${subSegments.join('-')}${suffix}`;
28
+ }
29
+ // Standard numeric phases: 1, 01, 12A, 12.1
30
+ const match = stripped.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);
31
+ if (match) {
32
+ const padded = match[1].padStart(2, '0');
33
+ // Preserve original case of letter suffix (#1962).
34
+ const letter = match[2] || '';
35
+ const decimal = match[3] || '';
36
+ return padded + letter + decimal;
37
+ }
38
+ // Custom phase IDs (e.g. PROJ-42, AUTH-101): return as-is
39
+ return str;
40
+ }
41
+ function getMilestoneFromPhaseId(phaseId) {
42
+ const str = String(phaseId);
43
+ const stripped = str.replace(/^[A-Z]{1,6}-(?=\d)/i, '');
44
+ const m = stripped.match(/^0*(\d+)-\d/);
45
+ if (!m)
46
+ return null;
47
+ const major = parseInt(m[1], 10);
48
+ if (major === 0 || major === 999)
49
+ return null;
50
+ return `v${major}.0`;
51
+ }
52
+ function getPhaseDirFromPhaseId(phaseId, phaseName, projectCode) {
53
+ const str = String(phaseId);
54
+ const stripped = str.replace(/^[A-Z]{1,6}-(?=\d)/i, '');
55
+ const m = stripped.match(/^0*(\d+)-(0*(\d+(?:-\d+)*))$/);
56
+ if (!m)
57
+ return null;
58
+ const milestone = String(parseInt(m[1], 10)).padStart(2, '0');
59
+ const subParts = m[2].split('-').map(p => String(parseInt(p, 10)).padStart(2, '0'));
60
+ const sub = subParts.join('-');
61
+ const slug = phaseName
62
+ ? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')
63
+ : '';
64
+ const parts = [milestone, sub, slug].filter(Boolean);
65
+ const base = parts.join('-');
66
+ return projectCode ? `${projectCode}-${base}` : base;
67
+ }
68
+ /**
69
+ * Render a regex source fragment matching a phase number against ROADMAP/STATE
70
+ * prose regardless of zero-padding on either side.
71
+ */
72
+ function phaseMarkdownRegexSource(phaseNum) {
73
+ const stripped = String(phaseNum).replace(/^[A-Z]{1,6}-(?=\d)/i, '');
74
+ // Milestone-prefixed IDs: M-NN or M-N-N (deep).
75
+ const milestoneSegments = stripped.match(/^(\d+)((?:-\d+)*)([A-Z]?(?:\.\d+)*)$/i);
76
+ if (milestoneSegments && milestoneSegments[2]) {
77
+ const majorUnpadded = milestoneSegments[1].replace(/^0+/, '') || '0';
78
+ const subParts = milestoneSegments[2].slice(1).split('-');
79
+ const subFragments = subParts.map(s => {
80
+ const unpadded = s.replace(/^0+/, '') || '0';
81
+ return `0*${escapeRegex(unpadded)}`;
82
+ });
83
+ const suffix = milestoneSegments[3] || '';
84
+ const suffixFragment = suffix ? escapeRegex(suffix) : '';
85
+ return `0*${escapeRegex(majorUnpadded)}-${subFragments.join('-')}${suffixFragment}`;
86
+ }
87
+ // Plain numeric phase: 1, 01, 12A, 12.1
88
+ const match = stripped.match(/^0*(\d+)([A-Z])?((?:\.\d+)*)$/i);
89
+ if (!match)
90
+ return escapeRegex(phaseNum);
91
+ const integer = match[1].replace(/^0+/, '') || '0';
92
+ const letter = match[2] ? escapeRegex(match[2]) : '';
93
+ const decimal = match[3] ? escapeRegex(match[3]) : '';
94
+ return `0*${escapeRegex(integer)}${letter}${decimal}`;
95
+ }
96
+ /**
97
+ * #3599: when the caller passed a project-code-prefixed ID like `PROJ-42`,
98
+ * return the exact-escaped form.
99
+ */
100
+ function phaseMarkdownRegexSourceExact(phaseNum) {
101
+ const raw = String(phaseNum);
102
+ if (!/^[A-Z]{1,6}-(?=\d)/i.test(raw))
103
+ return null;
104
+ return escapeRegex(raw);
105
+ }
106
+ function comparePhaseNum(a, b) {
107
+ // Strip optional project_code prefix before comparing
108
+ const sa = String(a).replace(/^[A-Z]{1,6}-(?=\d)/i, '');
109
+ const sb = String(b).replace(/^[A-Z]{1,6}-(?=\d)/i, '');
110
+ const milestoneA = sa.match(/^(\d+)((?:-\d+)+)([A-Z]?(?:\.\d+)*)$/i);
111
+ const milestoneB = sb.match(/^(\d+)((?:-\d+)+)([A-Z]?(?:\.\d+)*)$/i);
112
+ if (milestoneA && milestoneB) {
113
+ const segsA = [parseInt(milestoneA[1], 10), ...milestoneA[2].slice(1).split('-').map(s => parseInt(s, 10))];
114
+ const segsB = [parseInt(milestoneB[1], 10), ...milestoneB[2].slice(1).split('-').map(s => parseInt(s, 10))];
115
+ const maxSegs = Math.max(segsA.length, segsB.length);
116
+ for (let i = 0; i < maxSegs; i++) {
117
+ const av = segsA[i] !== undefined ? segsA[i] : 0;
118
+ const bv = segsB[i] !== undefined ? segsB[i] : 0;
119
+ if (av !== bv)
120
+ return av - bv;
121
+ }
122
+ const sufA = milestoneA[3] || '';
123
+ const sufB = milestoneB[3] || '';
124
+ if (sufA !== sufB)
125
+ return sufA < sufB ? -1 : 1;
126
+ return 0;
127
+ }
128
+ if (milestoneA || milestoneB)
129
+ return String(a).localeCompare(String(b));
130
+ const pa = sa.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);
131
+ const pb = sb.match(/^(\d+)([A-Z])?((?:\.\d+)*)/i);
132
+ if (!pa || !pb)
133
+ return String(a).localeCompare(String(b));
134
+ const intDiff = parseInt(pa[1], 10) - parseInt(pb[1], 10);
135
+ if (intDiff !== 0)
136
+ return intDiff;
137
+ const la = (pa[2] || '').toUpperCase();
138
+ const lb = (pb[2] || '').toUpperCase();
139
+ if (la !== lb) {
140
+ if (!la)
141
+ return -1;
142
+ if (!lb)
143
+ return 1;
144
+ return la < lb ? -1 : 1;
145
+ }
146
+ const aDecParts = pa[3] ? pa[3].slice(1).split('.').map(p => parseInt(p, 10)) : [];
147
+ const bDecParts = pb[3] ? pb[3].slice(1).split('.').map(p => parseInt(p, 10)) : [];
148
+ const maxLen = Math.max(aDecParts.length, bDecParts.length);
149
+ if (aDecParts.length === 0 && bDecParts.length > 0)
150
+ return -1;
151
+ if (bDecParts.length === 0 && aDecParts.length > 0)
152
+ return 1;
153
+ for (let i = 0; i < maxLen; i++) {
154
+ const av = Number.isFinite(aDecParts[i]) ? aDecParts[i] : 0;
155
+ const bv = Number.isFinite(bDecParts[i]) ? bDecParts[i] : 0;
156
+ if (av !== bv)
157
+ return av - bv;
158
+ }
159
+ return 0;
160
+ }
161
+ /**
162
+ * Extract the phase token from a directory name.
163
+ */
164
+ function extractPhaseToken(dirName) {
165
+ const codePrefixMatch = dirName.match(/^([A-Z]{1,6})-(\d.*)/i);
166
+ let prefix = '';
167
+ let rest = dirName;
168
+ if (codePrefixMatch) {
169
+ prefix = codePrefixMatch[1] + '-';
170
+ rest = codePrefixMatch[2];
171
+ }
172
+ const segments = rest.split('-');
173
+ const tokenSegments = [];
174
+ for (let i = 0; i < segments.length; i++) {
175
+ const seg = segments[i];
176
+ if (/^\d/.test(seg) || (i === 0 && /^[A-Za-z]{1,3}\d/.test(seg))) {
177
+ tokenSegments.push(seg);
178
+ }
179
+ else {
180
+ break;
181
+ }
182
+ }
183
+ if (tokenSegments.length === 0) {
184
+ return dirName;
185
+ }
186
+ return prefix + tokenSegments.join('-');
187
+ }
188
+ /**
189
+ * Check if a directory name's phase token matches the normalized phase exactly.
190
+ */
191
+ function phaseTokenMatches(dirName, normalized) {
192
+ const token = extractPhaseToken(dirName);
193
+ if (token.toUpperCase() === normalized.toUpperCase())
194
+ return true;
195
+ const stripped = dirName.replace(/^[A-Z]{1,6}-(?=\d)/i, '');
196
+ if (stripped !== dirName) {
197
+ const strippedToken = extractPhaseToken(stripped);
198
+ if (strippedToken.toUpperCase() === normalized.toUpperCase())
199
+ return true;
200
+ }
201
+ return false;
202
+ }
203
+ module.exports = {
204
+ escapeRegex,
205
+ normalizePhaseName,
206
+ getMilestoneFromPhaseId,
207
+ getPhaseDirFromPhaseId,
208
+ phaseMarkdownRegexSource,
209
+ phaseMarkdownRegexSourceExact,
210
+ comparePhaseNum,
211
+ extractPhaseToken,
212
+ phaseTokenMatches,
213
+ };
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * Phase Lifecycle Pure Helpers — pure-computation functions extracted from
4
+ * the phase-lifecycle SDK handler (ADR-457 build-at-publish: the hand-written
5
+ * bin/lib/phase-lifecycle.cjs collapsed to a TypeScript source of truth).
6
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
7
+ * only types are added.
8
+ *
9
+ * I/O adapter pattern (ADR-3524 Section 4): each side supplies its own I/O
10
+ * (sync readFileSync for CJS, async readFile for SDK); the pure computation
11
+ * logic is shared via this generated artifact.
12
+ *
13
+ * Scope:
14
+ * - deriveProgressFromRoadmap(roadmapContent): count Complete rows => idempotent
15
+ * - clampPercent(completed, total): percent with 100 ceiling
16
+ *
17
+ * These two functions are the root-cause fix for issue #4.
18
+ *
19
+ * References:
20
+ * - ADR-3524 (docs/adr/3524-cjs-sdk-hard-seam.md)
21
+ * - Issue #4 (upstream gsd-core)
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.deriveProgressFromRoadmap = deriveProgressFromRoadmap;
25
+ exports.clampPercent = clampPercent;
26
+ /**
27
+ * Derive completed_phases, total_phases, and total_plans from ROADMAP content.
28
+ * Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
29
+ */
30
+ function deriveProgressFromRoadmap(roadmapContent) {
31
+ let completedPhases = null;
32
+ let totalPhases = null;
33
+ let totalPlans = null;
34
+ try {
35
+ // Count Complete rows in the progress table (Status column = "Complete").
36
+ // Pattern: row where the phase cell starts with a digit (data row, not header),
37
+ // followed by any cell content, then a "Complete" status cell.
38
+ // Handles both short form ("| 4. |") and long form ("| 01. Foundation |").
39
+ // See phase-lifecycle.ts ~line 1655 for the original SDK pattern.
40
+ const tableCompletePattern = /\|\s*\d+[^|]*\|\s*[^|]*\|\s*Complete\s*\|/gi;
41
+ const completeMatches = roadmapContent.match(tableCompletePattern);
42
+ completedPhases = completeMatches ? completeMatches.length : null;
43
+ // Count total phase rows in the progress table.
44
+ // Identify the table by looking for Phase|...|Status|...|Completed header.
45
+ const progressTableMatch = roadmapContent.match(/\|\s*Phase\s*\|[^|]*\|[^|]*Status[^|]*\|[^|]*Completed[^|]*\|[\s\S]*?(?=\n\n|\n##|$)/i);
46
+ if (progressTableMatch) {
47
+ const tableText = progressTableMatch[0];
48
+ // Count data rows (rows starting with pipe then a phase number)
49
+ const dataRowPattern = /^\|\s*\d+/gm;
50
+ const dataRows = tableText.match(dataRowPattern);
51
+ totalPhases = dataRows ? dataRows.length : null;
52
+ }
53
+ // Sum plan counts from M/N columns in progress table
54
+ let totalPlansSum = 0;
55
+ const planCellPattern = /\|\s*\d+[^|]*\|\s*(\d+)\/(\d+)\s*\|/gi;
56
+ let pm;
57
+ while ((pm = planCellPattern.exec(roadmapContent)) !== null) {
58
+ totalPlansSum += parseInt(pm[2], 10);
59
+ }
60
+ if (totalPlansSum > 0)
61
+ totalPlans = totalPlansSum;
62
+ }
63
+ catch { /* intentionally empty — fall through to existing values */ }
64
+ return { completedPhases, totalPhases, totalPlans };
65
+ }
66
+ /**
67
+ * Compute progress percent clamped to 100.
68
+ * Root cause fix for issue #4 — see gen-phase-lifecycle.mjs for full documentation.
69
+ */
70
+ function clampPercent(completed, total) {
71
+ if (!total || total <= 0)
72
+ return 0;
73
+ return Math.min(100, Math.round((completed / total) * 100));
74
+ }
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * Phase Locator — Phase-directory search and location
4
+ *
5
+ * ADR-857 rollout phase 2d: extracted from core.cts (issue #881).
6
+ * Owns active-phase discovery against the `.planning/phases/` tree
7
+ * (`searchPhaseInDir`, `findPhaseInternal`) and archived-phase-dir
8
+ * enumeration (`getArchivedPhaseDirs`), matching phase ids/tokens against
9
+ * the filesystem. Behaviour is preserved byte-for-behaviour from the prior
10
+ * location; only the module boundary moved. The core.cjs re-export spine
11
+ * was retired in epic #1267; callers import phase-locator helpers directly.
12
+ *
13
+ * Dependencies (leaf modules only — no loadConfig):
14
+ * - node:fs / node:path (stdlib)
15
+ * - ./phase-id.cjs (normalizePhaseName, phaseTokenMatches, extractPhaseToken)
16
+ * - ./core-utils.cjs (readSubdirectories, getPhaseFileStats, extractCanonicalPlanId, toPosixPath)
17
+ * - ./planning-workspace.cjs (planningDir)
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 phaseIdModule = require("./phase-id.cjs");
26
+ const { normalizePhaseName, phaseTokenMatches, extractPhaseToken } = phaseIdModule;
27
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
28
+ const coreUtilsModule = require("./core-utils.cjs");
29
+ const { readSubdirectories, getPhaseFileStats, extractCanonicalPlanId, toPosixPath } = coreUtilsModule;
30
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
31
+ const planningWorkspace = require("./planning-workspace.cjs");
32
+ const { planningDir } = planningWorkspace;
33
+ // ─── Phase search helpers ─────────────────────────────────────────────────────
34
+ function searchPhaseInDir(baseDir, relBase, normalized) {
35
+ try {
36
+ const dirs = readSubdirectories(baseDir, true);
37
+ const match = dirs.find(d => phaseTokenMatches(d, normalized));
38
+ if (!match)
39
+ return null;
40
+ const phaseToken = extractPhaseToken(match);
41
+ const phaseNumber = phaseToken || normalized;
42
+ const afterToken = match.slice(phaseToken ? phaseToken.length : 0).replace(/^-/, '');
43
+ const phaseName = afterToken || null;
44
+ const phaseDir = node_path_1.default.join(baseDir, match);
45
+ const { plans: unsortedPlans, summaries: unsortedSummaries, hasResearch, hasContext, hasVerification, hasReviews } = getPhaseFileStats(phaseDir);
46
+ const plans = unsortedPlans.sort();
47
+ const summaries = unsortedSummaries.sort();
48
+ const completedPlanIds = new Set(summaries.flatMap(s => {
49
+ const exact = s.replace('-SUMMARY.md', '').replace('SUMMARY.md', '');
50
+ const canonical = extractCanonicalPlanId(s);
51
+ return canonical === exact ? [exact] : [exact, canonical];
52
+ }));
53
+ const incompletePlans = plans.filter(p => {
54
+ const planId = p.replace('-PLAN.md', '').replace('PLAN.md', '');
55
+ const canonical = extractCanonicalPlanId(p);
56
+ return !completedPlanIds.has(planId) && !completedPlanIds.has(canonical);
57
+ });
58
+ return {
59
+ found: true,
60
+ directory: toPosixPath(node_path_1.default.join(relBase, match)),
61
+ phase_number: phaseNumber,
62
+ phase_name: phaseName,
63
+ phase_slug: phaseName ? phaseName.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '') : null,
64
+ plans,
65
+ summaries,
66
+ incomplete_plans: incompletePlans,
67
+ has_research: hasResearch,
68
+ has_context: hasContext,
69
+ has_verification: hasVerification,
70
+ has_reviews: hasReviews,
71
+ };
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ function findPhaseInternal(cwd, phase) {
78
+ if (!phase)
79
+ return null;
80
+ const phasesDir = node_path_1.default.join(planningDir(cwd), 'phases');
81
+ const normalized = normalizePhaseName(phase);
82
+ const relPhasesDir = toPosixPath(node_path_1.default.relative(cwd, phasesDir));
83
+ const current = searchPhaseInDir(phasesDir, relPhasesDir, normalized);
84
+ if (current)
85
+ return current;
86
+ const milestonesDir = node_path_1.default.join(cwd, '.planning', 'milestones');
87
+ if (!node_fs_1.default.existsSync(milestonesDir))
88
+ return null;
89
+ try {
90
+ const milestoneEntries = node_fs_1.default.readdirSync(milestonesDir, { withFileTypes: true });
91
+ const archiveDirs = milestoneEntries
92
+ .filter(e => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name))
93
+ .map(e => e.name)
94
+ .sort()
95
+ .reverse();
96
+ for (const archiveName of archiveDirs) {
97
+ const versionMatch = archiveName.match(/^(v[\d.]+)-phases$/);
98
+ const version = versionMatch[1];
99
+ const archivePath = node_path_1.default.join(milestonesDir, archiveName);
100
+ const relBase = '.planning/milestones/' + archiveName;
101
+ const result = searchPhaseInDir(archivePath, relBase, normalized);
102
+ if (result) {
103
+ result.archived = version;
104
+ return result;
105
+ }
106
+ }
107
+ }
108
+ catch { /* intentionally empty */ }
109
+ return null;
110
+ }
111
+ function getArchivedPhaseDirs(cwd) {
112
+ const milestonesDir = node_path_1.default.join(cwd, '.planning', 'milestones');
113
+ const results = [];
114
+ if (!node_fs_1.default.existsSync(milestonesDir))
115
+ return results;
116
+ try {
117
+ const milestoneEntries = node_fs_1.default.readdirSync(milestonesDir, { withFileTypes: true });
118
+ const phaseDirs = milestoneEntries
119
+ .filter(e => e.isDirectory() && /^v[\d.]+-phases$/.test(e.name))
120
+ .map(e => e.name)
121
+ .sort()
122
+ .reverse();
123
+ for (const archiveName of phaseDirs) {
124
+ const versionMatch = archiveName.match(/^(v[\d.]+)-phases$/);
125
+ const version = versionMatch[1];
126
+ const archivePath = node_path_1.default.join(milestonesDir, archiveName);
127
+ const dirs = readSubdirectories(archivePath, true);
128
+ for (const dir of dirs) {
129
+ results.push({
130
+ name: dir,
131
+ milestone: version,
132
+ basePath: node_path_1.default.join('.planning', 'milestones', archiveName),
133
+ fullPath: node_path_1.default.join(archivePath, dir),
134
+ });
135
+ }
136
+ }
137
+ }
138
+ catch { /* intentionally empty */ }
139
+ return results;
140
+ }
141
+ module.exports = {
142
+ searchPhaseInDir,
143
+ findPhaseInternal,
144
+ getArchivedPhaseDirs,
145
+ };