@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,167 @@
1
+ "use strict";
2
+ /**
3
+ * Research Store Module
4
+ *
5
+ * Provides deterministic cache key generation, TTL policy, path resolution,
6
+ * and JSON-backed put/get operations for research entries.
7
+ *
8
+ * ADR-457 build-at-publish: authored as TypeScript .cts → emits .cjs via tsc.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ const node_os_1 = __importDefault(require("node:os"));
15
+ const node_path_1 = __importDefault(require("node:path"));
16
+ const node_crypto_1 = __importDefault(require("node:crypto"));
17
+ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs");
18
+ // ---------------------------------------------------------------------------
19
+ // Constants
20
+ // ---------------------------------------------------------------------------
21
+ const DAY_MS = 86_400_000;
22
+ // ---------------------------------------------------------------------------
23
+ // researchKey
24
+ // ---------------------------------------------------------------------------
25
+ function normalize(x) {
26
+ if (x === null || x === undefined)
27
+ return '';
28
+ if (typeof x === 'object')
29
+ return JSON.stringify(x).trim().toLowerCase();
30
+ // After excluding null, undefined, and object, x can only be a primitive —
31
+ // cast through number | string | boolean to avoid no-base-to-string on unknown.
32
+ return `${x}`.trim().toLowerCase();
33
+ }
34
+ function researchKey(input) {
35
+ const parts = {
36
+ ecosystem: normalize(input.ecosystem),
37
+ library: normalize(input.library),
38
+ version: normalize(input.version),
39
+ query: normalize(input.query),
40
+ kind: normalize(input.kind),
41
+ };
42
+ const serialized = JSON.stringify(parts);
43
+ return node_crypto_1.default.createHash('sha256').update(serialized).digest('hex');
44
+ }
45
+ // ---------------------------------------------------------------------------
46
+ // ttlForSource
47
+ // ---------------------------------------------------------------------------
48
+ function ttlForSource(source, confidence) {
49
+ if (source === 'curated' && confidence === 'HIGH')
50
+ return 30 * DAY_MS;
51
+ if (source === 'curated' && confidence === 'MEDIUM')
52
+ return 7 * DAY_MS;
53
+ return DAY_MS;
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // tierForSource / resolveStorePath
57
+ // ---------------------------------------------------------------------------
58
+ const CURATED_SOURCES = new Set(['curated']);
59
+ function tierForSource(source) {
60
+ return CURATED_SOURCES.has(source) ? 'user' : 'project';
61
+ }
62
+ function resolveStorePath(cwd, source, { homeDir = node_os_1.default.homedir() } = {}) {
63
+ if (tierForSource(source) === 'user') {
64
+ return node_path_1.default.join(homeDir, '.gsd', 'research-cache');
65
+ }
66
+ return node_path_1.default.join(cwd, '.planning', 'research', '.cache');
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // isValidResearchKey
70
+ // ---------------------------------------------------------------------------
71
+ /**
72
+ * Returns true iff key is a valid 64-character lowercase hexadecimal SHA-256
73
+ * string (the exact shape produced by researchKey). Any other shape —
74
+ * including path-traversal sequences — is rejected.
75
+ */
76
+ function isValidResearchKey(key) {
77
+ return typeof key === 'string' && /^[0-9a-f]{64}$/.test(key);
78
+ }
79
+ // ---------------------------------------------------------------------------
80
+ // putResearch
81
+ // ---------------------------------------------------------------------------
82
+ function putResearch(cwd, key, payload, { clock = Date, homeDir = node_os_1.default.homedir() } = {}) {
83
+ // Defense-in-depth: reject any key that is not a 64-char sha256 hex string.
84
+ if (!isValidResearchKey(key)) {
85
+ throw new Error('invalid research key');
86
+ }
87
+ const { content, source, provider, confidence, kind, version } = payload;
88
+ let ttl = ttlForSource(source, confidence);
89
+ // Cap TTL when version is blank/missing — a versionless curated entry must not
90
+ // get the long 30-day window since we can't know if it's still current.
91
+ if (!version) {
92
+ ttl = Math.min(ttl, DAY_MS);
93
+ }
94
+ const fetched_at = new Date(clock.now()).toISOString();
95
+ const entry = { content, source, provider, confidence, fetched_at, ttl, kind };
96
+ const dir = resolveStorePath(cwd, source, { homeDir });
97
+ // Belt-and-suspenders: ensure the resolved file path stays inside the store dir.
98
+ const resolvedDir = node_path_1.default.resolve(dir);
99
+ const filePath = node_path_1.default.join(dir, `${key}.json`);
100
+ const resolvedFile = node_path_1.default.resolve(filePath);
101
+ if (!resolvedFile.startsWith(resolvedDir + node_path_1.default.sep)) {
102
+ throw new Error('invalid research key');
103
+ }
104
+ node_fs_1.default.mkdirSync(dir, { recursive: true });
105
+ (0, shell_command_projection_cjs_1.platformWriteSync)(filePath, JSON.stringify(entry));
106
+ return entry;
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // getResearch
110
+ // ---------------------------------------------------------------------------
111
+ function getResearch(cwd, key, { clock = Date, homeDir = node_os_1.default.homedir() } = {}) {
112
+ // Defense-in-depth: reject any key that is not a 64-char sha256 hex string.
113
+ if (!isValidResearchKey(key)) {
114
+ return { hit: false, stale: false, entry: null };
115
+ }
116
+ try {
117
+ // Search both physical tiers: user (curated) and project (web/etc.)
118
+ const userDir = node_path_1.default.join(homeDir, '.gsd', 'research-cache');
119
+ const projectDir = node_path_1.default.join(cwd, '.planning', 'research', '.cache');
120
+ const tierDirs = [userDir, projectDir];
121
+ const candidates = [];
122
+ for (const dir of tierDirs) {
123
+ const resolvedDir = node_path_1.default.resolve(dir);
124
+ const filePath = node_path_1.default.join(dir, `${key}.json`);
125
+ // Belt-and-suspenders: ensure path stays inside tier dir
126
+ if (!node_path_1.default.resolve(filePath).startsWith(resolvedDir + node_path_1.default.sep))
127
+ continue;
128
+ if (!node_fs_1.default.existsSync(filePath))
129
+ continue;
130
+ let entry;
131
+ try {
132
+ entry = JSON.parse(node_fs_1.default.readFileSync(filePath, 'utf8'));
133
+ }
134
+ catch {
135
+ // Corrupt file in this tier — skip it
136
+ continue;
137
+ }
138
+ // Finding 3: validate entry metadata shape before accepting as a candidate.
139
+ // An entry with missing/invalid fetched_at or ttl must be treated as a miss.
140
+ const parsedFetchedAt = Date.parse(entry.fetched_at);
141
+ if (!Number.isFinite(parsedFetchedAt))
142
+ continue;
143
+ if (typeof entry.ttl !== 'number' ||
144
+ !Number.isFinite(entry.ttl) ||
145
+ entry.ttl <= 0)
146
+ continue;
147
+ const age = clock.now() - parsedFetchedAt;
148
+ const stale = age > entry.ttl;
149
+ candidates.push({ entry, stale, age });
150
+ }
151
+ if (candidates.length === 0) {
152
+ return { hit: false, stale: false, entry: null };
153
+ }
154
+ // Prefer: non-stale over stale; among same-staleness, lowest age (most recent)
155
+ candidates.sort((a, b) => {
156
+ if (a.stale !== b.stale)
157
+ return a.stale ? 1 : -1; // non-stale first
158
+ return a.age - b.age; // lower age (more recent) first
159
+ });
160
+ const best = candidates[0];
161
+ return { hit: true, stale: best.stale, entry: best.entry };
162
+ }
163
+ catch {
164
+ return { hit: false, stale: false, entry: null };
165
+ }
166
+ }
167
+ module.exports = { isValidResearchKey, researchKey, ttlForSource, tierForSource, resolveStorePath, putResearch, getResearch };
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ /**
3
+ * Review Reviewer Selection Module (ADR-457 build-at-publish: the hand-written
4
+ * bin/lib/review-reviewer-selection.cjs collapsed to a TypeScript source of
5
+ * truth). Behaviour is preserved byte-for-behaviour from the prior hand-written
6
+ * .cjs; only types are added.
7
+ *
8
+ * Owns reviewer-selection policy projection for /gsd:review:
9
+ * explicit flags > --all > review.default_reviewers > all detected.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.KNOWN_REVIEWER_SLUGS = void 0;
13
+ exports.normalizeConfiguredDefaultReviewers = normalizeConfiguredDefaultReviewers;
14
+ exports.resolveReviewerSelection = resolveReviewerSelection;
15
+ exports.KNOWN_REVIEWER_SLUGS = [
16
+ 'gemini',
17
+ 'claude',
18
+ 'codex',
19
+ 'coderabbit',
20
+ 'opencode',
21
+ 'qwen',
22
+ 'cursor',
23
+ 'antigravity',
24
+ 'ollama',
25
+ 'lm_studio',
26
+ 'llama_cpp',
27
+ ];
28
+ function normalizeConfiguredDefaultReviewers(rawValue) {
29
+ if (rawValue === undefined || rawValue === null) {
30
+ return { absent: true, values: [], errors: [] };
31
+ }
32
+ if (!Array.isArray(rawValue)) {
33
+ return {
34
+ absent: false,
35
+ values: [],
36
+ errors: ['review.default_reviewers must be a JSON array of reviewer slugs'],
37
+ };
38
+ }
39
+ if (rawValue.length === 0) {
40
+ return {
41
+ absent: false,
42
+ values: [],
43
+ errors: ['review.default_reviewers cannot be empty'],
44
+ };
45
+ }
46
+ const seen = new Set();
47
+ const normalized = [];
48
+ const errors = [];
49
+ for (const item of rawValue) {
50
+ if (typeof item !== 'string') {
51
+ errors.push('review.default_reviewers must contain only string slugs');
52
+ continue;
53
+ }
54
+ if (!/^[a-zA-Z0-9_-]+$/.test(item)) {
55
+ errors.push(`invalid reviewer slug in review.default_reviewers: ${item}`);
56
+ continue;
57
+ }
58
+ const slug = item.toLowerCase();
59
+ if (!seen.has(slug)) {
60
+ seen.add(slug);
61
+ normalized.push(slug);
62
+ }
63
+ }
64
+ return { absent: false, values: normalized, errors };
65
+ }
66
+ function resolveReviewerSelection(input) {
67
+ const detected = new Set((input.detected ?? []).map((v) => String(v).toLowerCase()));
68
+ const explicitFlags = new Set((input.explicitFlags ?? []).map((v) => String(v).toLowerCase()));
69
+ const allFlag = !!input.allFlag;
70
+ const normalizedDefaults = normalizeConfiguredDefaultReviewers(input.configuredDefaultReviewers);
71
+ const warnings = [];
72
+ const infos = [];
73
+ const errors = [...normalizedDefaults.errors];
74
+ let source = 'no_config_all_detected';
75
+ let selected = [];
76
+ if (explicitFlags.size > 0) {
77
+ source = 'explicit_flags';
78
+ selected = [...explicitFlags].filter((slug) => detected.has(slug));
79
+ const missing = [...explicitFlags].filter((slug) => !detected.has(slug));
80
+ if (missing.length > 0) {
81
+ infos.push(`explicit reviewers missing on host: ${missing.join(', ')}`);
82
+ }
83
+ if (selected.length === 0 && errors.length === 0) {
84
+ errors.push('no selected reviewers are available for explicit flags');
85
+ }
86
+ }
87
+ else if (allFlag) {
88
+ source = 'all_flag';
89
+ selected = [...detected];
90
+ }
91
+ else if (!normalizedDefaults.absent) {
92
+ source = 'config_default';
93
+ const knownDefaults = [];
94
+ for (const slug of normalizedDefaults.values) {
95
+ if (!exports.KNOWN_REVIEWER_SLUGS.includes(slug)) {
96
+ warnings.push(`unknown reviewer slug in review.default_reviewers: ${slug}`);
97
+ }
98
+ else {
99
+ knownDefaults.push(slug);
100
+ }
101
+ }
102
+ const undetected = knownDefaults.filter((slug) => !detected.has(slug));
103
+ if (undetected.length > 0) {
104
+ infos.push(`configured reviewers not detected on this host: ${undetected.join(', ')}`);
105
+ }
106
+ selected = knownDefaults.filter((slug) => detected.has(slug));
107
+ if (selected.length === 0 && errors.length === 0) {
108
+ errors.push('all configured default reviewers are unavailable on this host');
109
+ }
110
+ }
111
+ else {
112
+ selected = [...detected];
113
+ }
114
+ return {
115
+ source,
116
+ selected: selected.sort(),
117
+ warnings,
118
+ infos,
119
+ errors,
120
+ };
121
+ }
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * Manifest-backed roadmap subcommand router.
4
+ * Keeps gsd-tools.cjs thin while preserving existing command semantics.
5
+ *
6
+ * ADR-457 build-at-publish: the hand-written bin/lib/roadmap-command-router.cjs
7
+ * collapsed to a TypeScript source of truth. Behaviour is preserved byte-for-behaviour
8
+ * from the prior hand-written .cjs; only types are added.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ const node_fs_1 = __importDefault(require("node:fs"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const command_aliases_cjs_1 = require("./command-aliases.cjs");
16
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
17
+ const cjsCommandRouterAdapter = require("./cjs-command-router-adapter.cjs");
18
+ const { routeCjsCommandFamily } = cjsCommandRouterAdapter;
19
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
20
+ const roadmapUpgrade = require("./roadmap-upgrade.cjs");
21
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
22
+ const planningWorkspace = require("./planning-workspace.cjs");
23
+ const { planningDir } = planningWorkspace;
24
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
25
+ const configLoaderMod = require("./config-loader.cjs");
26
+ const { loadConfig } = configLoaderMod;
27
+ // ─── W021 Implementation ──────────────────────────────────────────────────────
28
+ /**
29
+ * Check each phase entry in a milestone-prefixed ROADMAP.md for W021 violations.
30
+ *
31
+ * W021: a phase whose ID integer prefix does not match its enclosing milestone's
32
+ * major version number.
33
+ *
34
+ * Sentinel milestones (0 = pre-milestone, 999 = backlog) are exempt.
35
+ *
36
+ * @param content - ROADMAP.md content
37
+ * @returns Array of W021 warnings
38
+ */
39
+ function checkW021(content) {
40
+ const warnings = [];
41
+ // Sentinel milestone integers exempt from W021
42
+ const SENTINELS = new Set([0, 999]);
43
+ const MIGRATION_CMD = 'gsd-tools roadmap upgrade --convention milestone-prefixed';
44
+ // Milestone section heading: ## [GSD] v2.0 — Label OR ## v2.0: Label OR ## Roadmap v2.0
45
+ // OR ## ✅ v2.0 OR ## 🚧 v2.0 (emoji-prefixed variants used by roadmap templates)
46
+ // Capture the major integer.
47
+ const MILESTONE_RE = /^#{1,3}\s+(?:\[[^\]]+\]\s+|Roadmap\s+|[✅🚧]\s*)?v(\d+)\.\d+(?:\s|:|\s*—)/iu;
48
+ // Migrated phase heading: ### Phase M-NN: Name (M-NN or unpadded M-N form)
49
+ const PHASE_RE = /^#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+)-(\d+)(?:-\d+)*\s*:/i;
50
+ // Unprefixed legacy phase heading: ### Phase N: Name (no hyphen sub-index)
51
+ const UNPREFIXED_PHASE_RE = /^#{2,4}\s*(?:\[[^\]]+\]\s*)?Phase\s+(\d+[A-Za-z]?(?:\.\d+)*)\s*:/i;
52
+ let currentMilestoneMajor = null;
53
+ const lines = content.split('\n');
54
+ for (const line of lines) {
55
+ const milestoneMatch = line.match(MILESTONE_RE);
56
+ if (milestoneMatch) {
57
+ currentMilestoneMajor = parseInt(milestoneMatch[1], 10);
58
+ continue;
59
+ }
60
+ const phaseMatch = line.match(PHASE_RE);
61
+ if (phaseMatch) {
62
+ const phaseMajor = parseInt(phaseMatch[1], 10);
63
+ if (SENTINELS.has(phaseMajor))
64
+ continue; // exempt
65
+ if (currentMilestoneMajor !== null && phaseMajor !== currentMilestoneMajor) {
66
+ const phaseId = `${phaseMatch[1]}-${phaseMatch[2]}`;
67
+ warnings.push({
68
+ code: 'W021',
69
+ message: `Phase ID prefix mismatch: phase "${phaseId}" is listed under v${currentMilestoneMajor}.x ` +
70
+ `but its prefix (${phaseMajor}) does not match. ` +
71
+ `Run \`${MIGRATION_CMD}\` to fix.`,
72
+ });
73
+ }
74
+ continue;
75
+ }
76
+ // When the convention is active, an unprefixed heading (### Phase 1:) is itself a W021
77
+ // violation — it is missing the required M-NN prefix entirely.
78
+ const unprefixedMatch = line.match(UNPREFIXED_PHASE_RE);
79
+ if (unprefixedMatch && currentMilestoneMajor !== null) {
80
+ const rawId = unprefixedMatch[1];
81
+ // Skip if it matched PHASE_RE already (it didn't reach here in that case)
82
+ // Also skip if it looks like a bare integer whose prefix matches the section
83
+ // — those pass; only non-matching or non-prefixed forms fire W021.
84
+ const numericMajor = parseInt(rawId, 10);
85
+ if (!SENTINELS.has(numericMajor)) {
86
+ warnings.push({
87
+ code: 'W021',
88
+ message: `Phase ID "${rawId}" is not in M-NN form (milestone-prefixed convention is active). ` +
89
+ `Run \`${MIGRATION_CMD}\` to migrate.`,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ return warnings;
95
+ }
96
+ // ─── Router ───────────────────────────────────────────────────────────────────
97
+ function routeRoadmapCommand({ roadmap, args, cwd, raw, error }) {
98
+ routeCjsCommandFamily({
99
+ args,
100
+ subcommands: command_aliases_cjs_1.ROADMAP_SUBCOMMANDS,
101
+ unsupported: {},
102
+ error,
103
+ unknownMessage: (_subcommand, available) => `Unknown roadmap subcommand. Available: ${available.join(', ')}`,
104
+ handlers: {
105
+ 'get-phase': () => roadmap.cmdRoadmapGetPhase(cwd, args[2], raw),
106
+ analyze: () => roadmap.cmdRoadmapAnalyze(cwd, raw),
107
+ 'update-plan-progress': () => roadmap.cmdRoadmapUpdatePlanProgress(cwd, args[2], raw),
108
+ 'annotate-dependencies': () => roadmap.cmdRoadmapAnnotateDependencies(cwd, args[2], raw),
109
+ 'validate': () => {
110
+ const roadmapPath = node_path_1.default.join(planningDir(cwd), 'ROADMAP.md');
111
+ let roadmapContent = '';
112
+ try {
113
+ roadmapContent = node_fs_1.default.readFileSync(roadmapPath, 'utf8');
114
+ }
115
+ catch {
116
+ // ROADMAP.md missing — return empty warnings
117
+ }
118
+ // W021 only fires when phase_id_convention is explicitly 'milestone-prefixed'.
119
+ // Authoritative source: .planning/config.json (set by the upgrade command).
120
+ // Fallback: ROADMAP.md frontmatter (for projects that set the field there directly).
121
+ let convention;
122
+ try {
123
+ const cfg = loadConfig(cwd);
124
+ convention = cfg['phase_id_convention'];
125
+ }
126
+ catch {
127
+ convention = undefined;
128
+ }
129
+ if (convention === undefined || convention === null) {
130
+ // Fallback: read from ROADMAP.md frontmatter
131
+ const fmMatch = roadmapContent.match(/^---\r?\n([\s\S]+?)\r?\n---/);
132
+ if (fmMatch) {
133
+ const kvMatch = fmMatch[1].match(/^phase_id_convention:\s*(.*)$/m);
134
+ if (kvMatch) {
135
+ const val = kvMatch[1].trim();
136
+ if (val !== 'null' && val !== '') {
137
+ convention = val.replace(/^["']|["']$/g, '');
138
+ }
139
+ }
140
+ }
141
+ }
142
+ const warnings = (convention === 'milestone-prefixed')
143
+ ? checkW021(roadmapContent)
144
+ : [];
145
+ const result = { warnings };
146
+ if (raw)
147
+ process.stdout.write(JSON.stringify(result));
148
+ else
149
+ process.stdout.write(JSON.stringify(result, null, 2));
150
+ },
151
+ 'upgrade': () => {
152
+ const dryRun = !args.includes('--apply');
153
+ const convention = args.find((_a, i) => args[i - 1] === '--convention') || 'milestone-prefixed';
154
+ if (convention !== 'milestone-prefixed') {
155
+ process.stderr.write('Only --convention milestone-prefixed is supported\n');
156
+ process.exit(1);
157
+ }
158
+ const plan = roadmapUpgrade.computeMigrationPlan(cwd);
159
+ roadmapUpgrade.applyMigration(cwd, plan, { dryRun });
160
+ },
161
+ },
162
+ });
163
+ }
164
+ module.exports = {
165
+ routeRoadmapCommand,
166
+ };