@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,234 @@
1
+ #!/usr/bin/env bash
2
+ # setup-branch-protection.sh
3
+ #
4
+ # Apply branch protection rules to `main` and `next` for the GSD repo.
5
+ # Idempotent — run as many times as you like. Re-running brings the live
6
+ # rules back to what this script declares, so the script IS the source of
7
+ # truth for branch protection.
8
+ #
9
+ # Usage:
10
+ # bash scripts/setup-branch-protection.sh # apply both
11
+ # bash scripts/setup-branch-protection.sh main # apply only main
12
+ # bash scripts/setup-branch-protection.sh next # apply only next
13
+ # DRY_RUN=1 bash scripts/setup-branch-protection.sh # show payloads, don't apply
14
+ #
15
+ # Requirements:
16
+ # - gh CLI authenticated against open-gsd/gsd-core with admin scope
17
+ # - jq installed
18
+ #
19
+ # What it sets:
20
+ #
21
+ # main (strict — production):
22
+ # - 2 required approving reviews
23
+ # - dismiss stale reviews on push
24
+ # - require code-owner review when CODEOWNERS applies
25
+ # - all required status checks must pass (defined in REQUIRED_CHECKS_MAIN below)
26
+ # - require branches to be up to date before merging (ON — `main` is production)
27
+ # - require linear history (OFF — release back-merges use merge commits)
28
+ # - require conversation resolution
29
+ # - require signed commits
30
+ # - block force-push and deletion
31
+ # - admins included
32
+ #
33
+ # next (loose — integration):
34
+ # - 1 required approving review
35
+ # - dismiss stale reviews on push
36
+ # - require code-owner review when CODEOWNERS applies
37
+ # - all required status checks must pass (defined in REQUIRED_CHECKS_NEXT below)
38
+ # - require branches to be up to date before merging (OFF — this is the whole point)
39
+ # - require linear history (OFF — auto-backmerge from main needs merge commits
40
+ # to preserve the link from next's history to main's release tags;
41
+ # feature PRs still squash-merge by repo merge-strategy setting)
42
+ # - require conversation resolution
43
+ # - require signed commits (OFF on next — easier for contributors)
44
+ # - block force-push and deletion
45
+ # - admins included
46
+ #
47
+ # See: docs/adr/XXXX-introduce-next-integration-branch.md
48
+ # See: docs/branching.md
49
+
50
+ set -euo pipefail
51
+
52
+ REPO="${REPO:-open-gsd/gsd-core}"
53
+ DRY_RUN="${DRY_RUN:-0}"
54
+
55
+ # Required status checks. Adjust as your CI suite evolves.
56
+ # The names must match the JOB NAME (not the workflow name) that GitHub
57
+ # records — check existing PRs to confirm.
58
+ REQUIRED_CHECKS_MAIN=(
59
+ "test"
60
+ "install-smoke"
61
+ "security-scan"
62
+ "Changeset Required / changeset-lint"
63
+ "Docs Required / docs-lint"
64
+ "Validate Branch Name / check-branch"
65
+ )
66
+
67
+ REQUIRED_CHECKS_NEXT=(
68
+ "test"
69
+ "Validate Branch Name / check-branch"
70
+ "Changeset Required / changeset-lint"
71
+ "Docs Required / docs-lint"
72
+ "PR Target Validator / validate-target"
73
+ )
74
+
75
+ require_cmd() {
76
+ command -v "$1" >/dev/null 2>&1 || {
77
+ echo "ERROR: missing required command: $1" >&2
78
+ exit 1
79
+ }
80
+ }
81
+
82
+ require_cmd gh
83
+ require_cmd jq
84
+
85
+ verify_auth() {
86
+ if ! gh auth status >/dev/null 2>&1; then
87
+ echo "ERROR: gh CLI is not authenticated. Run 'gh auth login' first." >&2
88
+ exit 1
89
+ fi
90
+ }
91
+
92
+ build_payload() {
93
+ local branch="$1"
94
+ shift
95
+ local checks_array=("$@")
96
+
97
+ # Branch-specific knobs.
98
+ local approvals require_up_to_date linear_history signed_commits
99
+ case "$branch" in
100
+ main)
101
+ approvals=2
102
+ require_up_to_date=true
103
+ linear_history=false
104
+ signed_commits=true
105
+ ;;
106
+ next)
107
+ approvals=1
108
+ require_up_to_date=false
109
+ # linear_history=false: auto-backmerge from main needs merge commits to
110
+ # preserve the link to release tags. Feature PRs still produce one
111
+ # commit each via repo-level "squash and merge" default — that gives
112
+ # us a clean log without enforcing linearity at the protection layer.
113
+ linear_history=false
114
+ signed_commits=false
115
+ ;;
116
+ *)
117
+ echo "ERROR: unknown branch '$branch'" >&2
118
+ exit 1
119
+ ;;
120
+ esac
121
+
122
+ # Build the contexts array via jq for safe quoting.
123
+ local contexts_json
124
+ contexts_json=$(printf '%s\n' "${checks_array[@]}" | jq -R . | jq -s .)
125
+
126
+ jq -n \
127
+ --argjson contexts "$contexts_json" \
128
+ --argjson approvals "$approvals" \
129
+ --argjson require_up_to_date "$require_up_to_date" \
130
+ --argjson linear_history "$linear_history" \
131
+ --argjson signed_commits "$signed_commits" \
132
+ '{
133
+ required_status_checks: {
134
+ strict: $require_up_to_date,
135
+ contexts: $contexts
136
+ },
137
+ enforce_admins: true,
138
+ required_pull_request_reviews: {
139
+ dismiss_stale_reviews: true,
140
+ require_code_owner_reviews: true,
141
+ required_approving_review_count: $approvals,
142
+ require_last_push_approval: false
143
+ },
144
+ restrictions: null,
145
+ required_linear_history: $linear_history,
146
+ allow_force_pushes: false,
147
+ allow_deletions: false,
148
+ required_conversation_resolution: true,
149
+ required_signatures: $signed_commits,
150
+ lock_branch: false,
151
+ allow_fork_syncing: true
152
+ }'
153
+ }
154
+
155
+ apply_protection() {
156
+ local branch="$1"
157
+ local checks_var_name
158
+ if [ "$branch" = "main" ]; then
159
+ checks_var_name="REQUIRED_CHECKS_MAIN"
160
+ else
161
+ checks_var_name="REQUIRED_CHECKS_NEXT"
162
+ fi
163
+
164
+ # Expand the array indirectly (bash 3 compatible — macOS default).
165
+ eval "local checks=(\"\${${checks_var_name}[@]}\")"
166
+
167
+ local payload
168
+ payload=$(build_payload "$branch" "${checks[@]}")
169
+
170
+ echo "──────────────────────────────────────────"
171
+ echo "Branch: $branch"
172
+ echo "Required checks (${#checks[@]}):"
173
+ printf ' - %s\n' "${checks[@]}"
174
+ echo "──────────────────────────────────────────"
175
+
176
+ if [ "$DRY_RUN" = "1" ]; then
177
+ echo "[DRY RUN] Would PUT to /repos/${REPO}/branches/${branch}/protection:"
178
+ echo "$payload" | jq .
179
+ return 0
180
+ fi
181
+
182
+ echo "Applying branch protection..."
183
+ echo "$payload" | gh api \
184
+ -X PUT \
185
+ -H "Accept: application/vnd.github+json" \
186
+ -H "X-GitHub-Api-Version: 2022-11-28" \
187
+ --input - \
188
+ "/repos/${REPO}/branches/${branch}/protection" \
189
+ >/dev/null
190
+ echo "✓ Protection rules applied to $branch."
191
+ }
192
+
193
+ ensure_branch_exists() {
194
+ local branch="$1"
195
+ if ! gh api "/repos/${REPO}/branches/${branch}" >/dev/null 2>&1; then
196
+ echo "ERROR: branch '$branch' does not exist in $REPO." >&2
197
+ if [ "$branch" = "next" ]; then
198
+ cat <<EOF >&2
199
+
200
+ Create the next branch first:
201
+ git checkout main && git pull --ff-only
202
+ git checkout -b next && git push -u origin next
203
+
204
+ Then re-run this script.
205
+ EOF
206
+ fi
207
+ exit 1
208
+ fi
209
+ }
210
+
211
+ main() {
212
+ verify_auth
213
+
214
+ local targets=()
215
+ if [ $# -eq 0 ]; then
216
+ targets=(main next)
217
+ else
218
+ targets=("$@")
219
+ fi
220
+
221
+ for branch in "${targets[@]}"; do
222
+ if [ "$branch" != "main" ] && [ "$branch" != "next" ]; then
223
+ echo "ERROR: unsupported branch '$branch'. Use 'main' or 'next'." >&2
224
+ exit 1
225
+ fi
226
+ ensure_branch_exists "$branch"
227
+ apply_protection "$branch"
228
+ done
229
+
230
+ echo ""
231
+ echo "Done. To verify: gh api /repos/${REPO}/branches/<branch>/protection | jq ."
232
+ }
233
+
234
+ main "$@"
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * strip-prose-atrefs.cjs
4
+ *
5
+ * Removes redundant @~/.claude/gsd-core/ path tokens from prose lines
6
+ * in <process> and <context> blocks. The path is already declared in
7
+ * <execution_context> where it actually loads the file. Prose copies are
8
+ * inert and add ~900 tokens/invocation of dead weight.
9
+ *
10
+ * Transformation rules (applied per matching line):
11
+ * - "Execute the X workflow from @PATH end-to-end." → "Execute end-to-end."
12
+ * - "Execute @PATH end-to-end." → "Execute end-to-end."
13
+ * - "Read and execute the X workflow from @PATH end-to-end." → "Execute end-to-end."
14
+ * - "Follow the X workflow at @PATH." → "Execute end-to-end."
15
+ * - "Output the X reference from @PATH." → "Execute end-to-end."
16
+ * - "**Follow the X** from `@PATH`." → "**Follow the X.**"
17
+ * - "- If it is '...': ... from @PATH end-to-end." → strip path token only
18
+ * - "- Otherwise: ... from @PATH end-to-end." → strip path token only
19
+ * - "- @PATH (label)" → "- (label)"
20
+ *
21
+ * Run with --dry-run to preview without writing.
22
+ */
23
+
24
+ 'use strict';
25
+
26
+ const fs = require('fs');
27
+ const path = require('path');
28
+
29
+ const DRY_RUN = process.argv.includes('--dry-run');
30
+ const ROOT = path.join(__dirname, '..');
31
+ const COMMANDS_DIR = path.join(ROOT, 'commands', 'gsd');
32
+
33
+ const AT_PATH_PATTERN = /@(?:~|\$HOME)\/.+?gsd-core\/[^\s`)]+/;
34
+ const mkAtRe = () => new RegExp(AT_PATH_PATTERN.source, 'g');
35
+
36
+ function transformLine(line) {
37
+ if (!AT_PATH_PATTERN.test(line)) return line;
38
+
39
+ const trimmed = line.trim();
40
+
41
+ // "- @PATH (label)" → "- (label)"
42
+ if (/^- @(?:~|\$HOME)\//.test(trimmed)) {
43
+ return line.replace(/^(\s*- )@(?:~|\$HOME)\/[^\s(]+\s*/, '$1');
44
+ }
45
+
46
+ // "**Follow the X workflow** from `@PATH`." → "**Follow the X workflow.**"
47
+ // "**Follow the X workflow** from `@PATH`" → "**Follow the X workflow.**"
48
+ if (/\*\*Follow the .+ workflow\*\* from `@/.test(trimmed)) {
49
+ return line.replace(/\s+from `@(?:~|\$HOME)\/[^`]+`\.?/, '.');
50
+ }
51
+
52
+ // Routing bullet: keep everything except "from @PATH" or bare "@PATH"
53
+ // "- If …: … from @PATH end-to-end." → strip path, keep bullet
54
+ // "- Otherwise: … from @PATH end-to-end." → strip path, keep bullet
55
+ if (/^- (?:If |Otherwise:|pass all)/.test(trimmed)) {
56
+ return line
57
+ .replace(/\s+from\s+@(?:~|\$HOME)\/\S+/g, '')
58
+ .replace(/@(?:~|\$HOME)\/\S+/g, '');
59
+ }
60
+
61
+ // "Execute [the X workflow] [from] @PATH [end-to-end]."
62
+ // "Read and execute …" / "Follow …" / "Output …"
63
+ // → collapse to leading indent + "Execute end-to-end."
64
+ const indent = line.match(/^(\s*)/)[1];
65
+ return `${indent}Execute end-to-end.`;
66
+ }
67
+
68
+ function processFile(filePath) {
69
+ const original = fs.readFileSync(filePath, 'utf-8');
70
+ const lines = original.split('\n');
71
+ const out = [];
72
+ let inProse = false; // true when inside <process> or <context> (not execution_context)
73
+
74
+ for (const line of lines) {
75
+ const t = line.trim();
76
+ if (/<(process|context)>/.test(t) && !t.includes('execution_context')) inProse = true;
77
+ if (/<\/(process|context)>/.test(t) && !t.includes('execution_context')) inProse = false;
78
+
79
+ if (inProse && AT_PATH_PATTERN.test(line)) {
80
+ const re = mkAtRe();
81
+ re.lastIndex = 0;
82
+ out.push(transformLine(line));
83
+ } else {
84
+ out.push(line);
85
+ }
86
+ }
87
+
88
+ const result = out.join('\n');
89
+ if (result === original) return false; // no change
90
+
91
+ if (!DRY_RUN) fs.writeFileSync(filePath, result, 'utf-8');
92
+ return true;
93
+ }
94
+
95
+ const files = fs.readdirSync(COMMANDS_DIR)
96
+ .filter(f => f.endsWith('.md'))
97
+ .map(f => path.join(COMMANDS_DIR, f));
98
+
99
+ let changed = 0;
100
+ for (const f of files) {
101
+ if (processFile(f)) {
102
+ console.log(`${DRY_RUN ? '[dry]' : 'fixed'}: ${path.basename(f)}`);
103
+ changed++;
104
+ }
105
+ }
106
+ console.log(`\n${changed} file(s) ${DRY_RUN ? 'would be' : 'were'} modified.`);
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * sync-manifest-versions.cjs
6
+ *
7
+ * Stamps the package.json version into every runtime-integration manifest whose
8
+ * top-level `version` field MUST track the package version. Called automatically
9
+ * by the `version` npm lifecycle script so that `npm version X.Y.Z` keeps all
10
+ * registered manifests in sync.
11
+ *
12
+ * Usage:
13
+ * node scripts/sync-manifest-versions.cjs # stamp + report
14
+ * node scripts/sync-manifest-versions.cjs --stage # stamp + git-stage manifests
15
+ * node scripts/sync-manifest-versions.cjs --check # report drift, exit 1 if any
16
+ */
17
+
18
+ const fs = require('fs');
19
+ const path = require('path');
20
+ const { execFileSync } = require('child_process');
21
+
22
+ const ROOT = path.resolve(__dirname, '..');
23
+
24
+ // Single source of truth: runtime-integration manifests whose top-level `version`
25
+ // MUST track package.json. Add a new manifest here so `npm version` keeps it in
26
+ // sync — the regression guard test (issue 844) fails if you forget.
27
+ const VERSIONED_MANIFESTS = [
28
+ '.claude-plugin/plugin.json',
29
+ 'gemini-extension.json',
30
+ ];
31
+
32
+ function readJson(p) {
33
+ return JSON.parse(fs.readFileSync(p, 'utf8'));
34
+ }
35
+
36
+ function getPackageVersion(root) {
37
+ const r = root || ROOT;
38
+ return readJson(path.join(r, 'package.json')).version;
39
+ }
40
+
41
+ // Stamp `version` into each registered manifest, preserving field order and
42
+ // 2-space + trailing-newline formatting. Returns the list of changed rel paths.
43
+ function syncManifestVersions(opts) {
44
+ const root = (opts && opts.root) || ROOT;
45
+ const v = (opts && opts.version) != null ? opts.version : getPackageVersion(root);
46
+ const changed = [];
47
+ for (const rel of VERSIONED_MANIFESTS) {
48
+ const abs = path.join(root, rel);
49
+ const manifest = readJson(abs);
50
+ if (manifest.version !== v) {
51
+ manifest.version = v;
52
+ fs.writeFileSync(abs, JSON.stringify(manifest, null, 2) + '\n');
53
+ changed.push(rel);
54
+ }
55
+ }
56
+ return changed;
57
+ }
58
+
59
+ // Registered manifests whose version != package version.
60
+ function findDrift(opts) {
61
+ const root = (opts && opts.root) || ROOT;
62
+ const v = (opts && opts.version) != null ? opts.version : getPackageVersion(root);
63
+ const drift = [];
64
+ for (const rel of VERSIONED_MANIFESTS) {
65
+ const found = readJson(path.join(root, rel)).version;
66
+ if (found !== v) drift.push({ manifest: rel, found, expected: v });
67
+ }
68
+ return drift;
69
+ }
70
+
71
+ // Best-effort outside git; fail-closed inside a work tree so a release never
72
+ // ships a stale manifest that the working-tree test already accepted.
73
+ function stageManifests(opts) {
74
+ const root = (opts && opts.root) || ROOT;
75
+ let insideWorkTree = false;
76
+ try {
77
+ insideWorkTree = execFileSync('git', ['rev-parse', '--is-inside-work-tree'], {
78
+ cwd: root,
79
+ stdio: ['ignore', 'pipe', 'ignore'],
80
+ }).toString().trim() === 'true';
81
+ } catch {}
82
+ if (!insideWorkTree) {
83
+ console.warn('sync-manifest-versions: not a git work tree; skipping staging.');
84
+ return;
85
+ }
86
+ try {
87
+ execFileSync('git', ['add', '--', ...VERSIONED_MANIFESTS], { cwd: root, stdio: ['ignore', 'ignore', 'pipe'] });
88
+ } catch (err) {
89
+ const detail = err && err.stderr ? err.stderr.toString().trim() : (err && err.message) || 'unknown error';
90
+ throw new Error(`sync-manifest-versions: failed to git-add manifests inside a work tree: ${detail}`);
91
+ }
92
+ }
93
+
94
+ module.exports = { VERSIONED_MANIFESTS, syncManifestVersions, findDrift, getPackageVersion, stageManifests };
95
+
96
+ if (require.main === module) {
97
+ const args = process.argv.slice(2);
98
+ const version = getPackageVersion();
99
+ if (args.includes('--check')) {
100
+ const drift = findDrift({ version });
101
+ if (drift.length) {
102
+ for (const d of drift) {
103
+ console.error('Manifest ' + d.manifest + ' version ' + d.found + ' != package.json ' + d.expected);
104
+ }
105
+ console.error('Run `node scripts/sync-manifest-versions.cjs` to fix.');
106
+ process.exitCode = 1;
107
+ } else {
108
+ console.log('All ' + VERSIONED_MANIFESTS.length + ' versioned manifests in sync at ' + version + '.');
109
+ }
110
+ } else {
111
+ const changed = syncManifestVersions({ version });
112
+ if (changed.length) {
113
+ console.log('Stamped ' + version + ' into: ' + changed.join(', '));
114
+ } else {
115
+ console.log('Versioned manifests already at ' + version + '.');
116
+ }
117
+ if (args.includes('--stage')) stageManifests();
118
+ }
119
+ }
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+ /**
3
+ * Sync the `next` branch's package.json version to a published release version.
4
+ *
5
+ * The release pipeline bumps the version only on the release/X.Y.Z branch at
6
+ * publish time, so `next` drifts and can carry a never-published placeholder
7
+ * (e.g. 1.3.1-dev.0) that leaks to source/dev installs reporting package.json
8
+ * version. This keeps `next` equal to the last published release for every
9
+ * release type (rc / hotfix / final). See issue #1104.
10
+ *
11
+ * Modes:
12
+ * default — open + admin-merge a `chore: sync next version` PR (used by
13
+ * release.yml's rc job, which has no next-targeting PR of its
14
+ * own). Idempotent: a no-op when `next` is already at the target.
15
+ * --in-place — set the version (+ manifests, via the npm `version` hook) in
16
+ * the current working tree only; the caller commits/pushes (used
17
+ * by auto-backmerge.yml, which folds it into its existing
18
+ * main->next PR).
19
+ *
20
+ * Subprocesses are bounded (repo convention) and the exec seam is injectable so
21
+ * the orchestration is unit-testable without git/gh/npm.
22
+ */
23
+ const { execFileSync } = require('child_process');
24
+
25
+ const RELEASE_VERSION = /^[0-9]+\.[0-9]+\.[0-9]+(-(rc|beta)\.[0-9]+)?$/;
26
+
27
+ /** True iff `v` is a publishable release version: X.Y.Z optionally -rc.N / -beta.N. Rejects -dev and anything else. */
28
+ function isReleaseVersion(v) {
29
+ return typeof v === 'string' && RELEASE_VERSION.test(v);
30
+ }
31
+
32
+ /** Read the `version` field out of a package.json text blob. Throws on a missing/non-string version. */
33
+ function versionFromPackageJson(text) {
34
+ const parsed = JSON.parse(text);
35
+ if (typeof parsed.version !== 'string') throw new Error('package.json has no string version');
36
+ return parsed.version;
37
+ }
38
+
39
+ function defaultRun(cmd, args, opts = {}) {
40
+ return execFileSync(cmd, args, {
41
+ encoding: 'utf8',
42
+ timeout: opts.timeout ?? 30000,
43
+ stdio: opts.stdio ?? ['ignore', 'pipe', 'inherit'],
44
+ });
45
+ }
46
+
47
+ /** Set package.json version (and manifests, via the npm `version` lifecycle hook) in the current tree. */
48
+ function applyVersion(version, { run = defaultRun } = {}) {
49
+ if (!isReleaseVersion(version)) {
50
+ throw new Error(`refusing to sync next to invalid/non-release version '${version}'`);
51
+ }
52
+ run('npm', ['version', version, '--no-git-tag-version', '--allow-same-version'], { timeout: 60000 });
53
+ }
54
+
55
+ /** Full PR-based sync to the `next` branch. Returns 'noop' | 'synced'. */
56
+ function syncViaPr(version, { run = defaultRun } = {}) {
57
+ if (!isReleaseVersion(version)) {
58
+ throw new Error(`refusing to sync next to invalid/non-release version '${version}'`);
59
+ }
60
+ run('git', ['fetch', 'origin', 'next'], { timeout: 30000 });
61
+ const current = versionFromPackageJson(run('git', ['show', 'origin/next:package.json'], { timeout: 15000 }));
62
+ if (current === version) {
63
+ process.stdout.write(`next already at ${version} — nothing to sync\n`);
64
+ return 'noop';
65
+ }
66
+ const branch = `chore/sync-next-version-${version}`;
67
+ run('git', ['checkout', '-B', branch, 'origin/next'], { timeout: 15000 });
68
+ applyVersion(version, { run });
69
+ run('git', ['add', '-u'], { timeout: 15000 });
70
+ // `git diff --cached --quiet` exits 0 when there is NO staged diff (execFileSync
71
+ // returns), exits 1 when there IS one (execFileSync throws). Proceed only on a diff.
72
+ let hasDiff = false;
73
+ try {
74
+ run('git', ['diff', '--cached', '--quiet'], { timeout: 15000 });
75
+ } catch (err) {
76
+ // exit 1 == there is a staged diff (expected); anything else is a real failure.
77
+ if (err && err.status === 1) hasDiff = true;
78
+ else throw err;
79
+ }
80
+ if (!hasDiff) {
81
+ process.stdout.write('no changes to commit — nothing to sync\n');
82
+ return 'noop';
83
+ }
84
+ run('git', ['commit', '-m', `chore: sync next package version to ${version}`], { timeout: 15000 });
85
+ run('git', ['push', '--force-with-lease', 'origin', branch], { timeout: 60000 });
86
+ let prUrl = run('gh', ['pr', 'list', '--head', branch, '--base', 'next', '--state', 'open',
87
+ '--json', 'url', '--jq', '.[0].url // ""'], { timeout: 30000 }).trim();
88
+ if (!prUrl) {
89
+ prUrl = run('gh', ['pr', 'create', '--base', 'next', '--head', branch,
90
+ '--title', `chore: sync next package version to ${version}`,
91
+ '--body', `Automated: keep \`next\`'s package.json at the last published release (\`${version}\`) so the default branch never carries a never-published version. Generated by the release pipeline (#1104).`,
92
+ ], { timeout: 60000 }).trim();
93
+ }
94
+ const m = prUrl.match(/\/pull\/(\d+)\b/);
95
+ if (!m) throw new Error(`could not parse PR number from gh output: ${prUrl}`);
96
+ const prNum = m[1];
97
+ try {
98
+ run('gh', ['pr', 'edit', prNum, '--add-label', 'automation', '--add-label', 'no-changelog'], { timeout: 30000 });
99
+ } catch {
100
+ /* labels are best-effort; admin-merge below still lands the PR */
101
+ }
102
+ try {
103
+ run('gh', ['pr', 'merge', '--admin', '--merge', prNum], { timeout: 60000 });
104
+ } catch (err) {
105
+ // tolerate "already merged"; rethrow anything else
106
+ const msg = String((err && (err.stderr || err.message)) || '');
107
+ if (!/already merged|not mergeable|Merged/i.test(msg)) throw err;
108
+ }
109
+ process.stdout.write(`synced next -> ${version} via PR #${prNum}\n`);
110
+ return 'synced';
111
+ }
112
+
113
+ function main(argv = process.argv.slice(2), deps = {}) {
114
+ const inPlace = argv.includes('--in-place');
115
+ const version = argv.find((a) => !a.startsWith('--'));
116
+ if (!version) throw new Error('usage: sync-next-version.cjs <version> [--in-place]');
117
+ if (inPlace) {
118
+ applyVersion(version, deps);
119
+ return;
120
+ }
121
+ syncViaPr(version, deps);
122
+ }
123
+
124
+ if (require.main === module) {
125
+ try {
126
+ main();
127
+ } catch (e) {
128
+ process.stderr.write(`error: ${e.message}\n`);
129
+ process.exitCode = 1;
130
+ }
131
+ }
132
+
133
+ module.exports = { isReleaseVersion, versionFromPackageJson, applyVersion, syncViaPr, main };
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ REPO="${REPO:-open-gsd/gsd-core}"
5
+ ENFORCEMENT="${ENFORCEMENT:-evaluate}"
6
+
7
+ case "$ENFORCEMENT" in
8
+ disabled|evaluate|active) ;;
9
+ *)
10
+ echo "ERROR: ENFORCEMENT must be one of: disabled|evaluate|active" >&2
11
+ exit 1
12
+ ;;
13
+ esac
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
16
+ RULESETS_DIR="$SCRIPT_DIR/../.github/rulesets"
17
+
18
+ for ruleset_file in "$RULESETS_DIR"/*.json; do
19
+ name="$(jq -r '.name' "$ruleset_file")"
20
+
21
+ body="$(jq --arg enforcement "$ENFORCEMENT" '.enforcement = $enforcement' "$ruleset_file")"
22
+
23
+ existing_id="$(gh api "repos/$REPO/rulesets" --jq ".[] | select(.name==\"$name\") | .id" 2>/dev/null || true)"
24
+
25
+ if [ -n "$existing_id" ]; then
26
+ gh api --method PUT "repos/$REPO/rulesets/$existing_id" \
27
+ --input - <<< "$body" > /dev/null
28
+ echo "[update] $name -> enforcement=$ENFORCEMENT"
29
+ else
30
+ gh api --method POST "repos/$REPO/rulesets" \
31
+ --input - <<< "$body" > /dev/null
32
+ echo "[create] $name -> enforcement=$ENFORCEMENT"
33
+ fi
34
+ done