@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,150 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * git-cmd.js — token-walk git command classifier.
5
+ *
6
+ * Determines whether a shell command string invokes a specific git
7
+ * subcommand. Handles the four forms that a naive `^git\s+commit` regex
8
+ * misses:
9
+ *
10
+ * bare: git commit -m "..." ✓
11
+ * -C path: git -C /some/path commit -m "..." ✓ (missed by regex)
12
+ * env-prefix: GIT_AUTHOR_NAME=x git commit "..." ✓ (missed by regex)
13
+ * full-path: /usr/bin/git commit -m "..." ✓ (missed by regex)
14
+ *
15
+ * This module is the single source of truth for git-commit detection so all
16
+ * hooks that need to gate on git commits share one implementation.
17
+ *
18
+ * Exported by the hooks/lib/ directory — require via a path relative to the
19
+ * hook's own __dirname:
20
+ *
21
+ * const { isGitSubcommand } = require(path.join(__dirname, 'lib', 'git-cmd.js'));
22
+ */
23
+
24
+ const path = require('path');
25
+
26
+ /**
27
+ * Git global options that take a following argument.
28
+ * These must be consumed as (option, argument) pairs when walking tokens.
29
+ */
30
+ const ARGUMENT_TAKING_FLAGS = new Set([
31
+ '-C', // working directory
32
+ '--git-dir', // path to git repository
33
+ '--work-tree', // path to working tree
34
+ '--namespace', // git namespace
35
+ '--super-prefix', // superproject-relative prefix
36
+ '--exec-path', // path to core git programs (when given an arg)
37
+ '--html-path',
38
+ '--man-path',
39
+ '--info-path',
40
+ '--list-cmds',
41
+ ]);
42
+
43
+ /**
44
+ * Git global flags that consume no extra argument.
45
+ */
46
+ const BOOLEAN_FLAGS = new Set([
47
+ '-p', '--paginate', '--no-pager',
48
+ '--no-replace-objects', '--bare',
49
+ '--literal-pathspecs', '--glob-pathspecs', '--noglob-pathspecs',
50
+ '--icase-pathspecs', '--no-optional-locks',
51
+ '-P', '--no-lazy-fetch',
52
+ '--version', '--help',
53
+ ]);
54
+
55
+ /**
56
+ * Tokenize a shell command string.
57
+ * Handles single-quoted strings, double-quoted strings, and unquoted tokens.
58
+ * Does NOT perform variable expansion or brace expansion.
59
+ *
60
+ * @param {string} cmd
61
+ * @returns {string[]}
62
+ */
63
+ function tokenize(cmd) {
64
+ const tokens = [];
65
+ let i = 0;
66
+ const len = cmd.length;
67
+
68
+ while (i < len) {
69
+ // Skip whitespace
70
+ while (i < len && /\s/.test(cmd[i])) i++;
71
+ if (i >= len) break;
72
+
73
+ let token = '';
74
+ while (i < len && !/\s/.test(cmd[i])) {
75
+ if (cmd[i] === "'") {
76
+ // Single-quoted string: take everything until closing '
77
+ i++;
78
+ while (i < len && cmd[i] !== "'") token += cmd[i++];
79
+ if (i < len) i++; // consume closing '
80
+ } else if (cmd[i] === '"') {
81
+ // Double-quoted string: take everything until closing " (no escape handling)
82
+ i++;
83
+ while (i < len && cmd[i] !== '"') token += cmd[i++];
84
+ if (i < len) i++; // consume closing "
85
+ } else {
86
+ token += cmd[i++];
87
+ }
88
+ }
89
+ if (token) tokens.push(token);
90
+ }
91
+
92
+ return tokens;
93
+ }
94
+
95
+ /**
96
+ * Return true if `cmd` invokes the git subcommand `sub`.
97
+ *
98
+ * @param {string} cmd - Full shell command string (may include env vars, full paths)
99
+ * @param {string} sub - Subcommand to test for, e.g. 'commit'
100
+ * @returns {boolean}
101
+ */
102
+ function isGitSubcommand(cmd, sub) {
103
+ if (!cmd || !sub) return false;
104
+
105
+ const tokens = tokenize(cmd);
106
+ let i = 0;
107
+
108
+ // Phase 1: skip leading VAR=VALUE environment assignments
109
+ while (i < tokens.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[i])) {
110
+ i++;
111
+ }
112
+
113
+ // Phase 2: the next token must be the git executable
114
+ if (i >= tokens.length) return false;
115
+ const gitToken = tokens[i++];
116
+ if (path.basename(gitToken) !== 'git') return false;
117
+
118
+ // Phase 3: consume git global options
119
+ while (i < tokens.length) {
120
+ const t = tokens[i];
121
+
122
+ // --flag=value form for argument-taking flags
123
+ const eqIdx = t.indexOf('=');
124
+ const flagName = eqIdx !== -1 ? t.slice(0, eqIdx) : t;
125
+ if (ARGUMENT_TAKING_FLAGS.has(flagName)) {
126
+ if (eqIdx !== -1) {
127
+ // consumed as one token: --git-dir=.git
128
+ i++;
129
+ } else {
130
+ // consumed as two tokens: -C /path
131
+ i += 2;
132
+ }
133
+ continue;
134
+ }
135
+
136
+ if (BOOLEAN_FLAGS.has(t)) {
137
+ i++;
138
+ continue;
139
+ }
140
+
141
+ // Not a global option — this is the subcommand
142
+ break;
143
+ }
144
+
145
+ // Phase 4: check the subcommand
146
+ if (i >= tokens.length) return false;
147
+ return tokens[i] === sub;
148
+ }
149
+
150
+ module.exports = { isGitSubcommand, tokenize };
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env bash
2
+ # gsd-graphify-rebuild.sh — detached rebuild runner for hooks/gsd-graphify-update.sh.
3
+ #
4
+ # Usage:
5
+ # gsd-graphify-rebuild.sh <STATUS_FILE> <LOCK_FILE> <HEAD_SHA> <MS_START> <GRAPHIFY_BIN>
6
+ #
7
+ # Writes its own PID into LOCK_FILE on start, removes LOCK_FILE on exit (any cause),
8
+ # runs `graphify update .` from the project root (cwd inherited from caller), copies
9
+ # the produced graphify-out/* into .planning/graphs/, and rewrites STATUS_FILE to
10
+ # reflect the final status ("ok" if graphify exited 0, "failed" otherwise).
11
+ #
12
+ # Designed to be invoked via `setsid ... &` so it is reparented away from the hook
13
+ # caller and never blocks the user-facing tool call.
14
+
15
+ set -uo pipefail
16
+
17
+ STATUS_FILE="${1:?STATUS_FILE required}"
18
+ LOCK_FILE="${2:?LOCK_FILE required}"
19
+ HEAD_SHA="${3:?HEAD_SHA required}"
20
+ MS_START="${4:?MS_START required}"
21
+ GRAPHIFY_BIN="${5:?GRAPHIFY_BIN required}"
22
+
23
+ # Atomic-ish lock acquire: write our PID and trap cleanup
24
+ echo "$$" > "$LOCK_FILE"
25
+ trap 'rm -f "$LOCK_FILE"' EXIT
26
+
27
+ "$GRAPHIFY_BIN" update . >/dev/null 2>&1
28
+ EXIT_CODE=$?
29
+
30
+ # Copy outputs only on success — failure path preserves the prior valid graph.
31
+ if [ "$EXIT_CODE" -eq 0 ] && [ -f graphify-out/graph.json ]; then
32
+ cp graphify-out/graph.json .planning/graphs/graph.json
33
+ cp graphify-out/graph.html .planning/graphs/graph.html 2>/dev/null || true
34
+ cp graphify-out/GRAPH_REPORT.md .planning/graphs/GRAPH_REPORT.md 2>/dev/null || true
35
+ cp .planning/graphs/graph.json .planning/graphs/.last-build-snapshot.json 2>/dev/null || true
36
+ fi
37
+
38
+ # Compute duration in ms
39
+ MS_END=$(node -e 'process.stdout.write(String(Date.now()))' 2>/dev/null || echo "$MS_START")
40
+ DURATION=$((MS_END - MS_START))
41
+
42
+ STATUS_NAME="ok"
43
+ [ "$EXIT_CODE" -eq 0 ] || STATUS_NAME="failed"
44
+
45
+ TS_END=$(date -u +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "")
46
+
47
+ # Write the final status file. Use Node for safe JSON encoding.
48
+ GSD_STATUS_TS="$TS_END" \
49
+ GSD_STATUS_NAME="$STATUS_NAME" \
50
+ GSD_EXIT_CODE="$EXIT_CODE" \
51
+ GSD_DURATION="$DURATION" \
52
+ GSD_HEAD_SHA="$HEAD_SHA" \
53
+ GSD_STATUS_FILE="$STATUS_FILE" \
54
+ node -e '
55
+ const fs = require("node:fs");
56
+ const status = {
57
+ ts: process.env.GSD_STATUS_TS,
58
+ status: process.env.GSD_STATUS_NAME,
59
+ exit_code: parseInt(process.env.GSD_EXIT_CODE, 10),
60
+ duration_ms: parseInt(process.env.GSD_DURATION, 10),
61
+ head_at_build: process.env.GSD_HEAD_SHA,
62
+ graphify_version: null,
63
+ };
64
+ fs.writeFileSync(process.env.GSD_STATUS_FILE, JSON.stringify(status, null, 2) + "\n");
65
+ ' 2>/dev/null || true
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Authoritative list of PP-managed hook files.
5
+ *
6
+ * Extracted from the worker script into a shared CJS module so that:
7
+ * 1. pp-check-update-worker.js can require() it directly (no source-level
8
+ * duplication).
9
+ * 2. Tests can assert against the exported array instead of regex-parsing
10
+ * the worker source (retiring the pending-migration-to-typed-ir token
11
+ * on managed-hooks.test.cjs and orphaned-hooks.test.cjs, per #455).
12
+ *
13
+ * These are the files PP ships into ~/.claude/hooks/ (or equivalent) and
14
+ * checks for staleness after an update. Orphaned files from removed features
15
+ * (e.g., pp-intel-*.js) must NOT be listed here — that would cause permanent
16
+ * stale warnings for users who haven't cleaned up manually (#1750).
17
+ */
18
+ const MANAGED_HOOKS = [
19
+ 'pp-check-update-worker.js',
20
+ 'pp-check-update.js',
21
+ 'pp-config-reload.js',
22
+ 'pp-context-monitor.js',
23
+ 'pp-cursor-post-tool.js',
24
+ 'pp-cursor-session-start.js',
25
+ 'pp-ensure-canonical-path.js',
26
+ 'pp-graphify-update.sh',
27
+ 'pp-phase-boundary.sh',
28
+ 'pp-prompt-guard.js',
29
+ 'pp-read-guard.js',
30
+ 'pp-read-injection-scanner.js',
31
+ 'pp-session-state.sh',
32
+ 'pp-statusline.js',
33
+ 'pp-update-banner.js',
34
+ 'pp-validate-commit.sh',
35
+ 'pp-workflow-guard.js',
36
+ 'pp-worktree-path-guard.js',
37
+ ];
38
+
39
+ module.exports = { MANAGED_HOOKS };
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ // pp-hook-version: {{PP_VERSION}}
3
+ // Background worker spawned by gsd-check-update.js (SessionStart hook).
4
+ // Checks for GSD updates and stale hooks, writes result to cache file.
5
+ // Receives paths via environment variables set by the parent hook.
6
+ //
7
+ // Using a separate file (rather than node -e '<inline code>') avoids the
8
+ // template-literal regex-escaping problem: regex source is plain JS here.
9
+
10
+ 'use strict';
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const { isSemverNewer } = require('../pp-core/bin/lib/semver-compare.cjs');
15
+ // Latest-version lookup is delegated to the single deterministic adapter
16
+ // (#498). checkLatestVersion() owns the npm-view call, the timeout/semver
17
+ // policy, and the package name — sourced from the baked Package Identity seam.
18
+ // The previous `require('../package.json').name` (#378) resolved to undefined
19
+ // in the installed tree (only a {"type":"commonjs"} marker ships), so the
20
+ // background check never reported updates.
21
+ const { checkLatestVersion } = require('../gsd-core/bin/check-latest-version.cjs');
22
+ const { PACKAGE_NAME } = require('../pp-core/bin/lib/package-identity.cjs');
23
+ // Authoritative list of managed hooks — shared with tests to retire source-grep
24
+ // assertions (pending-migration-to-typed-ir [#455]).
25
+ // NOTE: managed-hooks-registry.cjs must be in HOOKS_TO_COPY (scripts/build-hooks.js)
26
+ // so it is present in hooks/dist/ and ships to the installed runtime hooks/ dir.
27
+ // If it is missing (e.g., installed from an older dist), catch and degrade gracefully
28
+ // so the worker always proceeds to compute and write the result cache record.
29
+ let MANAGED_HOOKS = [];
30
+ try {
31
+ ({ MANAGED_HOOKS } = require('./managed-hooks-registry.cjs'));
32
+ } catch (e) {
33
+ // Module not found in installed runtime — stale-hook detection degrades to
34
+ // no-op (empty list means no hooks are checked for staleness). The worker
35
+ // still runs and writes package_name / installed / latest / update_available.
36
+ }
37
+
38
+ const cacheFile = process.env.GSD_CACHE_FILE;
39
+ const projectVersionFile = process.env.GSD_PROJECT_VERSION_FILE;
40
+ const globalVersionFile = process.env.GSD_GLOBAL_VERSION_FILE;
41
+
42
+ // Check project directory first (local install), then global
43
+ let installed = '0.0.0';
44
+ let configDir = '';
45
+ try {
46
+ if (fs.existsSync(projectVersionFile)) {
47
+ installed = fs.readFileSync(projectVersionFile, 'utf8').trim();
48
+ configDir = path.dirname(path.dirname(projectVersionFile));
49
+ } else if (fs.existsSync(globalVersionFile)) {
50
+ installed = fs.readFileSync(globalVersionFile, 'utf8').trim();
51
+ configDir = path.dirname(path.dirname(globalVersionFile));
52
+ }
53
+ } catch (e) {}
54
+
55
+ // Check for stale hooks — compare hook version headers against installed VERSION
56
+ // Hooks are installed at configDir/hooks/ (e.g. ~/.claude/hooks/) (#1421)
57
+ // Only check hooks that GSD currently ships — orphaned files from removed features
58
+ // (e.g., gsd-intel-*.js) must be ignored to avoid permanent stale warnings (#1750)
59
+ // MANAGED_HOOKS is imported from ./managed-hooks-registry.cjs above.
60
+
61
+ let staleHooks = [];
62
+ if (configDir) {
63
+ const hooksDir = path.join(configDir, 'hooks');
64
+ try {
65
+ if (fs.existsSync(hooksDir)) {
66
+ const hookFiles = fs.readdirSync(hooksDir).filter(f => MANAGED_HOOKS.includes(f));
67
+ for (const hookFile of hookFiles) {
68
+ try {
69
+ const content = fs.readFileSync(path.join(hooksDir, hookFile), 'utf8');
70
+ // Match both JS (//) and bash (#) comment styles
71
+ const versionMatch = content.match(/(?:\/\/|#) pp-hook-version:\s*(.+)/);
72
+ if (versionMatch) {
73
+ const hookVersion = versionMatch[1].trim();
74
+ if (isSemverNewer(installed, hookVersion) && !hookVersion.includes('{{')) {
75
+ staleHooks.push({ file: hookFile, hookVersion, installedVersion: installed });
76
+ }
77
+ } else {
78
+ // No version header at all — definitely stale (pre-version-tracking)
79
+ staleHooks.push({ file: hookFile, hookVersion: 'unknown', installedVersion: installed });
80
+ }
81
+ } catch (e) {}
82
+ }
83
+ }
84
+ } catch (e) {}
85
+ }
86
+
87
+ // Single adapter for the registry lookup (#498). checkLatestVersion() routes
88
+ // through the shell-projection seam, which already owns the Windows shell-flag
89
+ // policy, the timeout, and semver validation. A non-ok result leaves latest
90
+ // null, exactly as the previous inline try/catch did.
91
+ let latest = null;
92
+ try {
93
+ const lv = checkLatestVersion();
94
+ if (lv && lv.ok) latest = lv.version;
95
+ } catch (e) {}
96
+
97
+ const result = {
98
+ update_available: latest && isSemverNewer(latest, installed),
99
+ installed,
100
+ latest: latest || 'unknown',
101
+ checked: Math.floor(Date.now() / 1000),
102
+ stale_hooks: staleHooks.length > 0 ? staleHooks : undefined,
103
+ package_name: PACKAGE_NAME,
104
+ };
105
+
106
+ if (cacheFile) {
107
+ try { fs.writeFileSync(cacheFile, JSON.stringify(result)); } catch (e) {}
108
+ }
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+ // pp-hook-version: {{PP_VERSION}}
3
+ // Check for GSD updates in background, write result to cache
4
+ // Called by SessionStart hook - runs once per session
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const os = require('os');
9
+ const { spawn } = require('child_process');
10
+
11
+ const { updateCacheFileName } = require('../pp-core/bin/lib/package-identity.cjs');
12
+
13
+ const homeDir = os.homedir();
14
+ const cwd = process.cwd();
15
+
16
+ // Detect runtime config directory (supports Claude, OpenCode, Kilo, Gemini)
17
+ // Respects CLAUDE_CONFIG_DIR for custom config directory setups
18
+ function detectConfigDir(baseDir) {
19
+ // Check env override first (supports multi-account setups)
20
+ const envDir = process.env.CLAUDE_CONFIG_DIR;
21
+ if (envDir && fs.existsSync(path.join(envDir, 'pp-core', 'VERSION'))) {
22
+ return envDir;
23
+ }
24
+ for (const dir of ['.claude', '.gemini', '.config/kilo', '.kilo', '.config/opencode', '.opencode']) {
25
+ if (fs.existsSync(path.join(baseDir, dir, 'pp-core', 'VERSION'))) {
26
+ return path.join(baseDir, dir);
27
+ }
28
+ }
29
+ return envDir || path.join(baseDir, '.claude');
30
+ }
31
+
32
+ const globalConfigDir = detectConfigDir(homeDir);
33
+ const projectConfigDir = detectConfigDir(cwd);
34
+ // Use a shared, tool-agnostic cache directory to avoid multi-runtime
35
+ // resolution mismatches where check-update writes to one runtime's cache
36
+ // but statusline reads from another (#1421).
37
+ const cacheDir = path.join(homeDir, '.cache', 'gsd');
38
+ const cacheFile = path.join(cacheDir, updateCacheFileName);
39
+
40
+ // VERSION file locations (check project first, then global)
41
+ const projectVersionFile = path.join(projectConfigDir, 'pp-core', 'VERSION');
42
+ const globalVersionFile = path.join(globalConfigDir, 'pp-core', 'VERSION');
43
+
44
+ // Ensure cache directory exists
45
+ if (!fs.existsSync(cacheDir)) {
46
+ fs.mkdirSync(cacheDir, { recursive: true });
47
+ }
48
+
49
+ // Run check in background via a dedicated worker script.
50
+ // Spawning a file (rather than node -e '<inline code>') keeps the worker logic
51
+ // in plain JS with no template-literal regex-escaping concerns, and makes the
52
+ // worker independently testable.
53
+ const workerPath = path.join(__dirname, 'pp-check-update-worker.js');
54
+ const child = spawn(process.execPath, [workerPath], {
55
+ stdio: 'ignore',
56
+ windowsHide: true,
57
+ detached: true, // Required on Windows for proper process detachment
58
+ env: {
59
+ ...process.env,
60
+ GSD_CACHE_FILE: cacheFile,
61
+ GSD_PROJECT_VERSION_FILE: projectVersionFile,
62
+ GSD_GLOBAL_VERSION_FILE: globalVersionFile,
63
+ },
64
+ });
65
+
66
+ child.unref();
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ // pp-hook-version: {{PP_VERSION}}
3
+ // gsd-config-reload.js — FileChanged hook: hot-reload GSD config context
4
+ // Fires when .planning/config.json is modified, created, or deleted.
5
+ //
6
+ // When the user edits .planning/config.json mid-session, this hook reads the
7
+ // updated config and injects a summary as additionalContext so the agent knows
8
+ // the new configuration without requiring a session restart.
9
+ //
10
+ // Input (from Claude Code):
11
+ // { session_id, cwd, hook_event_name: "FileChanged",
12
+ // file_path: "/abs/path/.planning/config.json", event: "change"|"add"|"unlink" }
13
+ //
14
+ // Output:
15
+ // { hookSpecificOutput: { hookEventName: "FileChanged", additionalContext: "..." } }
16
+ // or exits 0 silently (if config absent, unreadable, or event is "unlink").
17
+ //
18
+ // Enabled for all Claude Code installs. This hook is always-on — it is a
19
+ // no-op when .planning/config.json is absent (ENOENT → exit 0).
20
+
21
+ const fs = require('fs');
22
+ const path = require('path');
23
+
24
+ let input = '';
25
+ // Timeout guard: if stdin does not close within 8s exit silently rather than
26
+ // hanging until Claude Code kills the process and reports "hook error".
27
+ const stdinTimeout = setTimeout(() => process.exit(0), 8000);
28
+ process.stdin.setEncoding('utf8');
29
+ process.stdin.on('data', chunk => (input += chunk));
30
+ process.stdin.on('end', () => {
31
+ clearTimeout(stdinTimeout);
32
+ try {
33
+ const data = JSON.parse(input);
34
+ const event = data.event; // "change" | "add" | "unlink"
35
+ const filePath = data.file_path || '';
36
+ const cwd = data.cwd || process.cwd();
37
+
38
+ // Only handle the GSD planning config — verify both basename and that the
39
+ // resolved path is .planning/config.json relative to cwd. The hook
40
+ // matcher ('config.json') fires on any watched config.json; this guard
41
+ // ensures an unrelated config.json in node_modules/ or elsewhere does not
42
+ // inject spurious additionalContext.
43
+ const basename = path.basename(filePath);
44
+ if (basename !== 'config.json') {
45
+ process.exit(0);
46
+ }
47
+ const expectedPath = path.resolve(cwd, '.planning', 'config.json');
48
+ if (path.resolve(filePath) !== expectedPath) {
49
+ process.exit(0);
50
+ }
51
+
52
+ // On unlink (deletion) emit a brief notice and exit
53
+ if (event === 'unlink') {
54
+ process.stdout.write(JSON.stringify({
55
+ hookSpecificOutput: {
56
+ hookEventName: 'FileChanged',
57
+ additionalContext:
58
+ 'GSD config (.planning/config.json) was deleted. ' +
59
+ 'Falling back to built-in defaults for this session.',
60
+ },
61
+ }));
62
+ process.exit(0);
63
+ }
64
+
65
+ // Read the updated config file
66
+ let config;
67
+ try {
68
+ const raw = fs.readFileSync(filePath, 'utf8');
69
+ config = JSON.parse(raw);
70
+ } catch (e) {
71
+ if (e && e.code === 'ENOENT') process.exit(0);
72
+ // Malformed JSON — inform the agent without crashing
73
+ process.stdout.write(JSON.stringify({
74
+ hookSpecificOutput: {
75
+ hookEventName: 'FileChanged',
76
+ additionalContext:
77
+ 'GSD config (.planning/config.json) was modified but could not be parsed. ' +
78
+ 'Check the file for JSON syntax errors.',
79
+ },
80
+ }));
81
+ process.exit(0);
82
+ }
83
+
84
+ // Build a concise summary of key config fields the agent cares about
85
+ const lines = ['GSD config reloaded (.planning/config.json updated):'];
86
+
87
+ if (config.runtime) lines.push(` runtime: ${config.runtime}`);
88
+ if (config.mode) lines.push(` mode: ${config.mode}`);
89
+
90
+ // hooks section (opt-in toggles agents act on)
91
+ if (config.hooks && typeof config.hooks === 'object') {
92
+ const hookKeys = Object.entries(config.hooks)
93
+ .filter(([, v]) => v !== undefined)
94
+ .map(([k, v]) => `${k}=${v}`)
95
+ .join(', ');
96
+ if (hookKeys) lines.push(` hooks: { ${hookKeys} }`);
97
+ }
98
+
99
+ // workflow section (key toggles)
100
+ if (config.workflow && typeof config.workflow === 'object') {
101
+ const wfKeys = Object.entries(config.workflow)
102
+ .filter(([, v]) => v !== undefined)
103
+ .map(([k, v]) => `${k}=${v}`)
104
+ .join(', ');
105
+ if (wfKeys) lines.push(` workflow: { ${wfKeys} }`);
106
+ }
107
+
108
+ // model overrides (agents use these)
109
+ if (config.models && typeof config.models === 'object') {
110
+ const modelKeys = Object.entries(config.models)
111
+ .filter(([, v]) => v !== undefined)
112
+ .map(([k, v]) => `${k}=${v}`)
113
+ .join(', ');
114
+ if (modelKeys) lines.push(` models: { ${modelKeys} }`);
115
+ }
116
+
117
+ if (lines.length === 1) {
118
+ // No notable fields — still confirm the reload happened
119
+ lines.push(' (no notable keys changed)');
120
+ }
121
+
122
+ const additionalContext = lines.join('\n');
123
+ process.stdout.write(JSON.stringify({
124
+ hookSpecificOutput: {
125
+ hookEventName: 'FileChanged',
126
+ additionalContext,
127
+ },
128
+ }));
129
+ } catch (e) {
130
+ // Silent fail — never block the session on a config reload error
131
+ process.exit(0);
132
+ }
133
+ });