@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,225 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration: record first-time installer migration baseline.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written
6
+ * bin/lib/installer-migrations/000-first-time-baseline.cjs collapsed to a
7
+ * TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
8
+ * 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 BASELINE_MIGRATION_ID = '2026-05-11-first-time-baseline-scan';
16
+ // Runtime install surfaces must stay aligned with:
17
+ // - docs/installer-migrations.md#runtime-configuration-contract-registry
18
+ // - docs/ARCHITECTURE.md#runtime-install-contract-matrix
19
+ const RUNTIME_SURFACES = {
20
+ claude: ['pp-core', 'commands/gsd', 'skills', 'agents', 'hooks', 'settings.json'],
21
+ codex: ['pp-core', 'skills', 'agents', 'hooks', 'config.toml', 'hooks.json'],
22
+ gemini: ['pp-core', 'commands/gsd', 'hooks'],
23
+ opencode: ['pp-core', 'command', 'skills', 'agents'],
24
+ kilo: ['pp-core', 'command', 'skills', 'agents'],
25
+ copilot: ['pp-core', 'skills', 'agents'],
26
+ antigravity: ['pp-core', 'skills', 'agents'],
27
+ cursor: ['pp-core', 'skills', 'agents', 'hooks', 'hooks.json'],
28
+ windsurf: ['pp-core', 'skills', 'agents', 'rules'],
29
+ augment: ['pp-core', 'skills', 'agents'],
30
+ trae: ['pp-core', 'skills', 'agents', 'rules'],
31
+ qwen: ['pp-core', 'skills', 'agents'],
32
+ hermes: ['pp-core', 'skills/gsd', 'agents'],
33
+ cline: ['pp-core', 'skills', 'agents'],
34
+ codebuddy: ['pp-core', 'skills', 'agents'],
35
+ };
36
+ const COMMON_SURFACES = ['pp-core', 'skills', 'agents', 'hooks'];
37
+ const INTERNAL_TOP_LEVEL_NAMES = new Set([
38
+ 'pp-file-manifest.json',
39
+ 'pp-install-state.json',
40
+ 'pp-migration-backups',
41
+ 'pp-migration-journal',
42
+ ]);
43
+ const USER_OWNED_PATHS = new Set([
44
+ 'pp-core/USER-PROFILE.md',
45
+ 'commands/gsd/dev-preferences.md',
46
+ 'skills/gsd-dev-preferences/SKILL.md',
47
+ ]);
48
+ let knownGeneratedAgentNames = null;
49
+ function normalizeRelPath(relPath) {
50
+ return relPath.replace(/\\/g, '/').replace(/^\/+/, '');
51
+ }
52
+ function baselineInstallSurfaces(runtime) {
53
+ if (runtime && RUNTIME_SURFACES[runtime])
54
+ return RUNTIME_SURFACES[runtime];
55
+ return COMMON_SURFACES;
56
+ }
57
+ function walkFiles(root, relDir, files) {
58
+ const dir = node_path_1.default.join(root, relDir);
59
+ if (!node_fs_1.default.existsSync(dir))
60
+ return;
61
+ const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
62
+ for (const entry of entries) {
63
+ const relPath = node_path_1.default.posix.join(relDir, entry.name);
64
+ if (relDir === '' && INTERNAL_TOP_LEVEL_NAMES.has(entry.name))
65
+ continue;
66
+ if (entry.isDirectory()) {
67
+ walkFiles(root, relPath, files);
68
+ }
69
+ else if (entry.isFile()) {
70
+ files.add(normalizeRelPath(relPath));
71
+ }
72
+ }
73
+ }
74
+ function scanBaselineFiles(configDir, runtime) {
75
+ const relPaths = new Set();
76
+ for (const surface of baselineInstallSurfaces(runtime)) {
77
+ const normalized = normalizeRelPath(surface);
78
+ const fullPath = node_path_1.default.join(configDir, normalized);
79
+ if (!node_fs_1.default.existsSync(fullPath))
80
+ continue;
81
+ const stat = node_fs_1.default.statSync(fullPath);
82
+ if (stat.isDirectory()) {
83
+ walkFiles(configDir, normalized, relPaths);
84
+ }
85
+ else if (stat.isFile() && !INTERNAL_TOP_LEVEL_NAMES.has(normalized)) {
86
+ relPaths.add(normalized);
87
+ }
88
+ }
89
+ return [...relPaths];
90
+ }
91
+ function isUserOwnedBaselinePath(relPath) {
92
+ if (USER_OWNED_PATHS.has(relPath))
93
+ return true;
94
+ const parts = relPath.split('/');
95
+ // pp-core managed skills start with 'pp-' (new) or 'gsd-' (legacy back-compat);
96
+ // all other skill dirs are user-owned.
97
+ if (parts[0] === 'skills' && parts[1] && !parts[1].startsWith('pp-') && !parts[1].startsWith('gsd-'))
98
+ return true;
99
+ // Same for agents.
100
+ if (parts[0] === 'agents' && parts[1] && !parts[1].startsWith('pp-') && !parts[1].startsWith('gsd-'))
101
+ return true;
102
+ return false;
103
+ }
104
+ function listKnownGeneratedAgentNames() {
105
+ if (knownGeneratedAgentNames)
106
+ return knownGeneratedAgentNames;
107
+ knownGeneratedAgentNames = new Set();
108
+ const agentsDir = node_path_1.default.resolve(__dirname, '..', '..', '..', '..', 'agents');
109
+ try {
110
+ for (const entry of node_fs_1.default.readdirSync(agentsDir, { withFileTypes: true })) {
111
+ if (entry.isFile() && (entry.name.startsWith('pp-') || entry.name.startsWith('gsd-')) && entry.name.endsWith('.md')) {
112
+ knownGeneratedAgentNames.add(entry.name.replace(/\.md$/, ''));
113
+ }
114
+ }
115
+ }
116
+ catch {
117
+ // If the source agent directory is unavailable, fail closed and treat
118
+ // GSD-looking agent files as user-choice artifacts.
119
+ }
120
+ return knownGeneratedAgentNames;
121
+ }
122
+ function isKnownGeneratedAgentPath(relPath, runtime) {
123
+ const parts = relPath.split('/');
124
+ if (parts.length !== 2 || parts[0] !== 'agents')
125
+ return false;
126
+ const fileName = parts[1];
127
+ const extension = node_path_1.default.posix.extname(fileName);
128
+ if (extension !== '.md' && !(runtime === 'codex' && extension === '.toml'))
129
+ return false;
130
+ const agentName = fileName.slice(0, -extension.length);
131
+ return listKnownGeneratedAgentNames().has(agentName);
132
+ }
133
+ function isStaleGsdLookingPath(relPath) {
134
+ const baseName = node_path_1.default.posix.basename(relPath);
135
+ // Match gsd-* / gsd_* (legacy) and pp-* / pp_* (current) hook files that may
136
+ // be leftover from a prior install and need user decision at baseline scan.
137
+ if (/^gsd[-_]/.test(baseName))
138
+ return true;
139
+ if (/^pp[-_]/.test(baseName))
140
+ return true;
141
+ const parts = relPath.split('/');
142
+ if ((parts[0] === 'skills' || parts[0] === 'agents') && parts[1] && (parts[1].startsWith('gsd-') || parts[1].startsWith('pp-'))) {
143
+ return true;
144
+ }
145
+ return false;
146
+ }
147
+ function baselineActionRank(action) {
148
+ if (action.type === 'record-baseline')
149
+ return 0;
150
+ if (action.type === 'baseline-preserve-user')
151
+ return 1;
152
+ return 2;
153
+ }
154
+ const migration = {
155
+ id: BASELINE_MIGRATION_ID,
156
+ title: 'Record first-time installer migration baseline',
157
+ description: 'Classify existing install surfaces before destructive installer migrations run.',
158
+ introducedIn: '1.50.0',
159
+ scopes: ['global', 'local'],
160
+ destructive: false,
161
+ plan: ({ configDir, runtime, baselineScan, classifyArtifact }) => {
162
+ if (!baselineScan)
163
+ return [];
164
+ const actions = [];
165
+ for (const relPath of scanBaselineFiles(configDir, runtime)) {
166
+ // docs/installer-migrations.md#baseline-preserve-user keeps user-owned
167
+ // artifacts out of destructive migration flow.
168
+ if (isUserOwnedBaselinePath(relPath)) {
169
+ actions.push({
170
+ type: 'baseline-preserve-user',
171
+ relPath,
172
+ reason: 'known user-owned artifact preserved by first-time migration baseline',
173
+ classification: 'user-owned',
174
+ originalHash: null,
175
+ currentHash: null,
176
+ });
177
+ continue;
178
+ }
179
+ const artifact = classifyArtifact(relPath);
180
+ if (artifact.classification === 'managed-pristine' || artifact.classification === 'managed-modified') {
181
+ actions.push({
182
+ type: 'record-baseline',
183
+ relPath,
184
+ reason: 'existing manifest-managed file included in first-time migration baseline',
185
+ });
186
+ continue;
187
+ }
188
+ const currentHash = artifact.currentHash ?? null;
189
+ if (isKnownGeneratedAgentPath(relPath, runtime)) {
190
+ actions.push({
191
+ type: 'record-baseline',
192
+ relPath,
193
+ reason: 'known installer-generated agent included in first-time migration baseline',
194
+ classification: artifact.classification,
195
+ originalHash: artifact.originalHash ?? null,
196
+ currentHash,
197
+ });
198
+ continue;
199
+ }
200
+ if (isStaleGsdLookingPath(relPath)) {
201
+ actions.push({
202
+ type: 'prompt-user',
203
+ relPath,
204
+ reason: 'GSD-looking file is not proven manifest-managed and needs explicit user choice',
205
+ classification: 'stale-gsd-looking',
206
+ originalHash: artifact.originalHash ?? null,
207
+ currentHash,
208
+ prompt: 'Choose whether to remove this stale-looking GSD artifact or keep it as user-owned.',
209
+ choices: ['keep', 'remove'],
210
+ });
211
+ continue;
212
+ }
213
+ actions.push({
214
+ type: 'baseline-preserve-user',
215
+ relPath,
216
+ reason: 'unknown install-surface file preserved by first-time migration baseline',
217
+ classification: artifact.classification,
218
+ originalHash: artifact.originalHash ?? null,
219
+ currentHash,
220
+ });
221
+ }
222
+ return actions.sort((left, right) => baselineActionRank(left) - baselineActionRank(right) || left.relPath.localeCompare(right.relPath));
223
+ },
224
+ };
225
+ module.exports = migration;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration: remove manifest-managed legacy orphan hook files
4
+ * (ADR-457 build-at-publish: the hand-written
5
+ * bin/lib/installer-migrations/001-legacy-orphan-files.cjs collapsed to a
6
+ * TypeScript source of truth). Behaviour is preserved byte-for-behaviour from
7
+ * the prior hand-written .cjs; only types are added.
8
+ */
9
+ const LEGACY_ORPHAN_FILES = [
10
+ 'hooks/gsd-notify.sh',
11
+ 'hooks/statusline.js',
12
+ ];
13
+ const migration = {
14
+ id: '2026-05-11-legacy-orphan-files',
15
+ title: 'Remove manifest-managed legacy orphan hook files',
16
+ description: 'Remove legacy orphan hook files that are still manifest-managed.',
17
+ introducedIn: '1.50.0',
18
+ scopes: ['global', 'local'],
19
+ destructive: true,
20
+ // Retired generated hook files are removed only with manifest-managed
21
+ // evidence. This follows docs/installer-migrations.md#ownership and avoids
22
+ // relying on whether a runtime currently registers host hook config in the
23
+ // runtime contract registry.
24
+ plan: (ctx) => {
25
+ const actions = [];
26
+ for (const relPath of LEGACY_ORPHAN_FILES) {
27
+ const artifact = ctx.classifyArtifact(relPath);
28
+ if (artifact.classification === 'managed-pristine') {
29
+ actions.push({
30
+ type: 'remove-managed',
31
+ relPath,
32
+ reason: 'legacy orphan hook file retired by installer migration',
33
+ ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
34
+ });
35
+ }
36
+ else if (artifact.classification === 'managed-modified') {
37
+ actions.push({
38
+ type: 'backup-and-remove',
39
+ relPath,
40
+ reason: 'legacy orphan hook file retired by installer migration',
41
+ ownershipEvidence: 'legacy hook path is manifest-managed in gsd-file-manifest.json',
42
+ });
43
+ }
44
+ }
45
+ return actions;
46
+ },
47
+ };
48
+ module.exports = migration;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration: remove legacy Codex hooks.json GSD hook registrations.
4
+ *
5
+ * ADR-457 build-at-publish: the hand-written
6
+ * bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs collapsed to a
7
+ * TypeScript source of truth. Behaviour is preserved byte-for-behaviour from
8
+ * the prior hand-written .cjs; only types are added.
9
+ */
10
+ const shell_command_projection_cjs_1 = require("../shell-command-projection.cjs");
11
+ function isStructurallyEmpty(value) {
12
+ if (value === null || value === undefined)
13
+ return true;
14
+ if (Array.isArray(value))
15
+ return value.length === 0;
16
+ if (typeof value !== 'object')
17
+ return false;
18
+ for (const _key in value)
19
+ return false;
20
+ return true;
21
+ }
22
+ function isManagedCodexHookCommand(command, configDir) {
23
+ return (0, shell_command_projection_cjs_1.isManagedHookCommand)(command, {
24
+ surface: 'codex-hooks-json',
25
+ includeLegacyAliases: true,
26
+ configDir,
27
+ });
28
+ }
29
+ function pruneLegacyCodexHooksJsonValue(value, configDir) {
30
+ if (Array.isArray(value)) {
31
+ let changed = false;
32
+ const next = [];
33
+ for (const item of value) {
34
+ const pruned = pruneLegacyCodexHooksJsonValue(item, configDir);
35
+ if (pruned.changed)
36
+ changed = true;
37
+ if (pruned.changed && isStructurallyEmpty(pruned.value))
38
+ changed = true;
39
+ else
40
+ next.push(pruned.value);
41
+ }
42
+ return { value: next, changed };
43
+ }
44
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
45
+ const valueObj = value;
46
+ const command = valueObj['command'];
47
+ if (isManagedCodexHookCommand(command, configDir)) {
48
+ return { value: null, changed: true };
49
+ }
50
+ let changed = false;
51
+ const next = {};
52
+ for (const [key, child] of Object.entries(valueObj)) {
53
+ const pruned = pruneLegacyCodexHooksJsonValue(child, configDir);
54
+ if (pruned.changed)
55
+ changed = true;
56
+ if (pruned.changed && isStructurallyEmpty(pruned.value))
57
+ changed = true;
58
+ else
59
+ next[key] = pruned.value;
60
+ }
61
+ return { value: next, changed };
62
+ }
63
+ return { value, changed: false };
64
+ }
65
+ const migration = {
66
+ id: '2026-05-11-codex-legacy-hooks-json',
67
+ title: 'Remove legacy Codex hooks.json GSD hook registrations',
68
+ description: 'Remove legacy Codex hooks.json GSD hook registrations after config.toml migration.',
69
+ introducedIn: '1.50.0',
70
+ runtimes: ['codex'],
71
+ scopes: ['global', 'local'],
72
+ destructive: true,
73
+ runtimeContract: 'docs/installer-migrations.md#runtime-configuration-contract-registry Codex row',
74
+ plan: (ctx) => {
75
+ const { configDir } = ctx;
76
+ const hooksJson = ctx.readJson('hooks.json');
77
+ if (!hooksJson.exists || hooksJson.error)
78
+ return [];
79
+ const pruned = pruneLegacyCodexHooksJsonValue(hooksJson.value, configDir);
80
+ if (!pruned.changed)
81
+ return [];
82
+ return [
83
+ {
84
+ type: 'rewrite-json',
85
+ relPath: 'hooks.json',
86
+ value: pruned.value,
87
+ deleteIfEmpty: true,
88
+ reason: 'legacy Codex hooks.json GSD registration retired by installer migration',
89
+ ownershipEvidence: 'pruned command matches generated GSD hook command under the install hooks directory',
90
+ },
91
+ ];
92
+ },
93
+ };
94
+ module.exports = migration;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration 003: remove stale legacy get-shit-done/ runtime directory // gsd-allow-legacy-name
4
+ * files after the rename to gsd-core/ (#604).
5
+ *
6
+ * Background: the GSD runtime config subdirectory was renamed from
7
+ * get-shit-done/ to gsd-core/ in #604. On upgrade, both directories can exist // gsd-allow-legacy-name
8
+ * simultaneously. This migration removes prior-manifest-managed files from the
9
+ * legacy get-shit-done/ directory during install. Migrations run BEFORE the new // gsd-allow-legacy-name
10
+ * runtime is materialized, so gsd-core/ will not yet exist on the first upgrade
11
+ * run — the migration must not gate on its presence. If the install fails after
12
+ * migrations apply, the framework rolls back by restoring files from rollback
13
+ * storage (copied before deletion), so removing legacy files pre-materialization
14
+ * is safe.
15
+ *
16
+ * Per-file approach: the migration framework has no recursive directory-removal
17
+ * primitive — all actions operate on individual files identified by relPath. As
18
+ * a result, any empty subdirectory shells left under the legacy tree after all
19
+ * files are removed will remain on disk. Users can remove them manually if
20
+ * desired. This is a known, intentional limitation of the ADR-0008 design: the
21
+ * framework never removes directories, only files.
22
+ *
23
+ * User file preservation: files classified 'unknown' (not in the prior manifest)
24
+ * receive a 'baseline-preserve-user' action and are explicitly NOT removed.
25
+ */
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ const node_fs_1 = __importDefault(require("node:fs"));
30
+ const node_path_1 = __importDefault(require("node:path"));
31
+ function walkLegacyFiles(root, relDir, baseResolved, results) {
32
+ const dir = node_path_1.default.join(root, relDir);
33
+ const entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
34
+ for (const entry of entries) {
35
+ // Do not follow symlinks — skip them entirely to avoid out-of-tree traversal.
36
+ if (entry.isSymbolicLink())
37
+ continue; // gsd-allow-legacy-name (entry under legacy get-shit-done/ dir)
38
+ const relPath = node_path_1.default.posix.join(relDir, entry.name);
39
+ // Bounds check: ensure the resolved path stays under configDir.
40
+ const resolved = node_path_1.default.resolve(root, relPath);
41
+ if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
42
+ continue;
43
+ if (entry.isDirectory()) {
44
+ walkLegacyFiles(root, relPath, baseResolved, results);
45
+ }
46
+ else if (entry.isFile()) {
47
+ results.push(relPath);
48
+ }
49
+ }
50
+ }
51
+ const REASON = 'legacy runtime directory renamed to gsd-core (#604)';
52
+ const migration = {
53
+ id: '2026-06-02-rename-get-shit-done-to-gsd-core', // gsd-allow-legacy-name
54
+ title: 'Remove stale legacy get-shit-done/ runtime directory files (#604)', // gsd-allow-legacy-name
55
+ description: 'After the config dir rename from get-shit-done/ to gsd-core/ (#604), remove prior-manifest-managed files ' + // gsd-allow-legacy-name
56
+ 'from the stale legacy directory during install (framework rollback restores them if install fails). User-added files are preserved.',
57
+ introducedIn: '1.2.0',
58
+ scopes: ['global', 'local'],
59
+ destructive: true,
60
+ plan(ctx) {
61
+ const legacyRoot = node_path_1.default.join(ctx.configDir, 'get-shit-done'); // gsd-allow-legacy-name
62
+ // Idempotency: if the legacy directory doesn't exist, nothing to do.
63
+ if (!node_fs_1.default.existsSync(legacyRoot))
64
+ return [];
65
+ // Safety: if the legacy root itself is a symlink to an out-of-tree location,
66
+ // do not process it — walking a symlinked dir could emit removes outside configDir.
67
+ if (node_fs_1.default.lstatSync(legacyRoot).isSymbolicLink())
68
+ return []; // gsd-allow-legacy-name
69
+ const baseResolved = node_path_1.default.resolve(ctx.configDir);
70
+ const relPaths = [];
71
+ walkLegacyFiles(ctx.configDir, 'get-shit-done', baseResolved, relPaths); // gsd-allow-legacy-name
72
+ const actions = [];
73
+ for (const relPath of relPaths) {
74
+ // Bounds-check each relPath before emitting any action.
75
+ const resolved = node_path_1.default.resolve(ctx.configDir, relPath);
76
+ if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
77
+ continue;
78
+ const { classification } = ctx.classifyArtifact(relPath);
79
+ if (classification === 'managed-pristine') {
80
+ actions.push({
81
+ type: 'remove-managed',
82
+ relPath,
83
+ reason: REASON,
84
+ ownershipEvidence: 'present in prior install manifest as a managed GSD runtime file',
85
+ });
86
+ }
87
+ else if (classification === 'managed-modified') {
88
+ actions.push({
89
+ type: 'backup-and-remove',
90
+ relPath,
91
+ reason: REASON,
92
+ ownershipEvidence: 'managed GSD runtime file, locally modified; backed up before removal',
93
+ });
94
+ }
95
+ else if (classification === 'unknown') {
96
+ actions.push({
97
+ type: 'baseline-preserve-user',
98
+ relPath,
99
+ reason: 'user-added file under legacy runtime dir; preserved per ADR-0008',
100
+ ownershipEvidence: 'file is not present in the prior install manifest; treated as user-owned',
101
+ });
102
+ }
103
+ // 'managed-missing', 'missing', and any other classification: skip (no action)
104
+ }
105
+ return actions;
106
+ },
107
+ };
108
+ module.exports = migration;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * Installer migration 004: remove stale gsd-pristine/get-shit-done/ snapshot // gsd-allow-legacy-name
4
+ * files after the get-shit-done → gsd-core rename (#604, #934). // gsd-allow-legacy-name
5
+ *
6
+ * Background: migration 003 removed legacy runtime files from
7
+ * get-shit-done/ but did not touch gsd-pristine/get-shit-done/, the // gsd-allow-legacy-name
8
+ * parallel directory that holds pristine snapshots captured before the rename.
9
+ * These snapshot files are GSD-managed (written by the installer, never by the
10
+ * user) and reference stale get-shit-done/... key paths that no longer exist // gsd-allow-legacy-name
11
+ * in the active layout. When verify-reapply-patches.cjs looks up a backup entry
12
+ * keyed under gsd-core/... it finds no matching gsd-pristine/ snapshot, falls
13
+ * to over-broad mode, and reports false FAIL_INSTALLED_MISSING / // gsd-allow-legacy-name
14
+ * FAIL_USER_LINES_MISSING for every backed-up pre-rename file (#934).
15
+ *
16
+ * Fix: walk gsd-pristine/get-shit-done/ and emit remove-managed for each file. // gsd-allow-legacy-name
17
+ * These files are always GSD-written snapshots — users never place their own
18
+ * files inside gsd-pristine/ — so the classification override
19
+ * (managed-pristine) is safe: there is no user content to protect.
20
+ *
21
+ * Checksum safety: migration 003's body is left untouched. Adding this
22
+ * separate migration avoids modifying 003's checksum, which would break
23
+ * upgrade state for any user who already applied 003 (root cause of #670).
24
+ *
25
+ * Per-file approach: the migration framework has no recursive directory-removal
26
+ * primitive — all actions operate on individual files. Empty directory shells
27
+ * left after removal can be cleaned up manually; this is the intentional ADR-0008
28
+ * limitation.
29
+ */
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ const node_fs_1 = __importDefault(require("node:fs"));
34
+ const node_path_1 = __importDefault(require("node:path"));
35
+ function walkPristineFiles(root, relDir, baseResolved, results) {
36
+ const dir = node_path_1.default.join(root, relDir);
37
+ let entries;
38
+ try {
39
+ entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
40
+ }
41
+ catch {
42
+ return; // directory absent or unreadable — nothing to do
43
+ }
44
+ for (const entry of entries) {
45
+ // Do not follow symlinks — skip to avoid out-of-tree traversal.
46
+ if (entry.isSymbolicLink())
47
+ continue;
48
+ const relPath = node_path_1.default.posix.join(relDir, entry.name);
49
+ // Bounds check: ensure the resolved path stays under configDir.
50
+ const resolved = node_path_1.default.resolve(root, relPath);
51
+ if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
52
+ continue;
53
+ if (entry.isDirectory()) {
54
+ walkPristineFiles(root, relPath, baseResolved, results);
55
+ }
56
+ else if (entry.isFile()) {
57
+ results.push(relPath);
58
+ }
59
+ }
60
+ }
61
+ const REASON = 'stale pristine snapshot from legacy get-shit-done/ dir, orphaned by rename migration 003 (#604, #934)'; // gsd-allow-legacy-name
62
+ const migration = {
63
+ id: '2026-06-09-prune-stale-pristine-get-shit-done', // gsd-allow-legacy-name
64
+ title: 'Remove stale gsd-pristine/get-shit-done/ snapshot files (#934)', // gsd-allow-legacy-name
65
+ description: 'Migration 003 removed runtime files from get-shit-done/ but left the matching pristine snapshot ' + // gsd-allow-legacy-name
66
+ 'directory gsd-pristine/get-shit-done/ intact. Those snapshots reference stale key paths and cause ' + // gsd-allow-legacy-name
67
+ 'verify-reapply-patches false positives (#934). Remove all files under gsd-pristine/get-shit-done/ ' + // gsd-allow-legacy-name
68
+ 'as they are GSD-managed snapshots, never user content.',
69
+ introducedIn: '1.4.3',
70
+ scopes: ['global', 'local'],
71
+ destructive: true,
72
+ plan(ctx) {
73
+ const pristineGsdRoot = node_path_1.default.join(ctx.configDir, 'gsd-pristine', 'get-shit-done'); // gsd-allow-legacy-name
74
+ // Idempotency: if the stale pristine subdir doesn't exist, nothing to do.
75
+ if (!node_fs_1.default.existsSync(pristineGsdRoot))
76
+ return [];
77
+ // Safety: reject symlinks in ANY ancestor component of the path we will walk
78
+ // to prevent following a symlink out of configDir. Check both gsd-pristine/
79
+ // and gsd-pristine/get-shit-done/ — either being a symlink could redirect // gsd-allow-legacy-name
80
+ // the walk to an out-of-tree location.
81
+ const pristineParent = node_path_1.default.join(ctx.configDir, 'gsd-pristine');
82
+ try {
83
+ if (node_fs_1.default.lstatSync(pristineParent).isSymbolicLink())
84
+ return [];
85
+ }
86
+ catch {
87
+ return [];
88
+ }
89
+ try {
90
+ if (node_fs_1.default.lstatSync(pristineGsdRoot).isSymbolicLink())
91
+ return []; // gsd-allow-legacy-name
92
+ }
93
+ catch {
94
+ return [];
95
+ }
96
+ const baseResolved = node_path_1.default.resolve(ctx.configDir);
97
+ const relPaths = [];
98
+ walkPristineFiles(ctx.configDir, node_path_1.default.posix.join('gsd-pristine', 'get-shit-done'), baseResolved, relPaths); // gsd-allow-legacy-name
99
+ const actions = [];
100
+ for (const relPath of relPaths) {
101
+ // Bounds-check each relPath before emitting any action.
102
+ const resolved = node_path_1.default.resolve(ctx.configDir, relPath);
103
+ if (resolved !== baseResolved && !resolved.startsWith(baseResolved + node_path_1.default.sep))
104
+ continue;
105
+ // These files are GSD-managed pristine snapshots — the installer writes
106
+ // them during install/upgrade; users never place personal files inside
107
+ // gsd-pristine/. Pass classification: 'managed-pristine' explicitly so
108
+ // the framework does not downgrade remove-managed to preserve-user when
109
+ // the manifest has no entry (these paths were never in the manifest since
110
+ // they live under gsd-pristine/, not the tracked runtime dir).
111
+ actions.push({
112
+ type: 'remove-managed',
113
+ relPath,
114
+ reason: REASON,
115
+ ownershipEvidence: 'GSD-written pristine snapshot under gsd-pristine/get-shit-done/; ' + // gsd-allow-legacy-name
116
+ 'installer is the sole author of gsd-pristine/ contents; no user content lives here',
117
+ classification: 'managed-pristine',
118
+ });
119
+ }
120
+ return actions;
121
+ },
122
+ };
123
+ module.exports = migration;