@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,467 @@
1
+ "use strict";
2
+ /**
3
+ * Model Resolver — Model and effort resolution policy
4
+ *
5
+ * ADR-857 rollout phase 2f: extracted from core.cts (issue #888).
6
+ * Owns model and effort resolution policy: resolves the model, runtime tier,
7
+ * planning granularity, reasoning effort, and fast-mode for a given agent by
8
+ * reading project config and resolving against the model profiles and catalog.
9
+ * Behaviour is preserved byte-for-behaviour from the prior location; only
10
+ * the module boundary moved. The core.cjs re-export spine was retired in
11
+ * epic #1267; callers import resolvers from model-resolver.cjs directly.
12
+ *
13
+ * Dependencies (leaf modules only):
14
+ * - node:fs / node:path (stdlib, not currently needed — included for future use)
15
+ * - ./config-loader.cjs (loadConfig)
16
+ * - ./configuration.cjs (CONFIG_DEFAULTS as CANONICAL_CONFIG_DEFAULTS)
17
+ * - ./model-profiles.cjs (MODEL_PROFILES, AGENT_TO_PHASE_TYPE, AGENT_DEFAULT_TIERS, VALID_AGENT_TIERS, nextTier)
18
+ * - ./model-catalog.cjs (MODEL_ALIAS_MAP, RUNTIME_PROFILE_MAP, PROVIDER_PRESETS)
19
+ */
20
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
21
+ const configLoaderModule = require("./config-loader.cjs");
22
+ const { loadConfig } = configLoaderModule;
23
+ // ─── Configuration Module (for CANONICAL_CONFIG_DEFAULTS used by effort/fast_mode resolvers) ─
24
+ const configuration_cjs_1 = require("./configuration.cjs");
25
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
26
+ const modelProfiles = require("./model-profiles.cjs");
27
+ const { MODEL_PROFILES, AGENT_TO_PHASE_TYPE, AGENT_DEFAULT_TIERS, VALID_AGENT_TIERS, nextTier } = modelProfiles;
28
+ const model_catalog_cjs_1 = require("./model-catalog.cjs");
29
+ /**
30
+ * #2517 — Resolve the runtime-aware tier entry for (runtime, tier).
31
+ */
32
+ function resolveTierEntry({ runtime, tier, overrides }) {
33
+ if (!runtime || !tier)
34
+ return null;
35
+ const runtimeMap = model_catalog_cjs_1.RUNTIME_PROFILE_MAP;
36
+ const builtin = runtimeMap[runtime]?.[tier] || null;
37
+ const overridesMap = overrides;
38
+ const userRaw = overridesMap?.[runtime]?.[tier];
39
+ let userEntry = null;
40
+ if (userRaw) {
41
+ userEntry = typeof userRaw === 'string' ? { model: userRaw } : userRaw;
42
+ }
43
+ if (!builtin && !userEntry)
44
+ return null;
45
+ return { ...(builtin || {}), ...(userEntry || {}) };
46
+ }
47
+ /**
48
+ * Convenience wrapper used by resolveModelInternal.
49
+ */
50
+ function _resolveRuntimeTier(config, tier) {
51
+ return resolveTierEntry({
52
+ runtime: config['runtime'],
53
+ tier,
54
+ overrides: config['model_profile_overrides'],
55
+ });
56
+ }
57
+ // Reverse of the Claude tier-default IDs, plus the Fable alias which Claude
58
+ // Code's Agent tool accepts but which is not a GSD model-profile tier (#1133).
59
+ const CLAUDE_POLICY_ID_TO_ALIAS = {
60
+ ...Object.fromEntries(Object.entries(model_catalog_cjs_1.MODEL_ALIAS_MAP)
61
+ .filter((e) => typeof e[1] === 'string')
62
+ .map(([aliasName, id]) => [id, aliasName])),
63
+ 'claude-fable-5': 'fable',
64
+ };
65
+ const CLAUDE_AGENT_ALIASES = new Set(['opus', 'sonnet', 'haiku', 'fable']);
66
+ // Dedupe stderr warnings so repeated agent resolutions don't spam (#1133).
67
+ const _modelPolicyUnmappableWarned = new Set();
68
+ function warnModelPolicyUnmappable(agentType, policyModel, tier) {
69
+ const key = `${agentType}::${policyModel}::${tier}`;
70
+ if (_modelPolicyUnmappableWarned.has(key))
71
+ return;
72
+ _modelPolicyUnmappableWarned.add(key);
73
+ // MUST go to stderr — resolve-model's JSON result is parsed from stdout.
74
+ process.stderr.write(`gsd: warning — model_policy resolved "${policyModel}" for ${agentType}, ` +
75
+ `but it has no Claude agent alias; using "${tier}" instead.\n`);
76
+ }
77
+ // Test-only: reset the model_policy warn-dedupe cache between cases (#1133).
78
+ function _resetModelPolicyWarningCacheForTests() {
79
+ _modelPolicyUnmappableWarned.clear();
80
+ }
81
+ /**
82
+ * #49 — Provider-neutral model policy preset resolution.
83
+ */
84
+ function resolveModelPolicy(policy, tier) {
85
+ if (!policy || typeof policy !== 'object')
86
+ return null;
87
+ if (!tier)
88
+ return null;
89
+ const runtime = policy['runtime'];
90
+ const rtOverrides = policy['runtime_tiers'];
91
+ if (runtime && typeof runtime === 'string' && rtOverrides && typeof rtOverrides === 'object') {
92
+ const rtOverridesMap = rtOverrides;
93
+ if (Object.hasOwn(rtOverridesMap, runtime)) {
94
+ const runtimeEntry = rtOverridesMap[runtime];
95
+ if (runtimeEntry && typeof runtimeEntry === 'object' && Object.hasOwn(runtimeEntry, tier)) {
96
+ const raw = runtimeEntry[tier];
97
+ if (raw != null) {
98
+ const entry = typeof raw === 'string' ? { model: raw } : raw;
99
+ if (entry && entry['model'])
100
+ return entry['model'];
101
+ }
102
+ }
103
+ }
104
+ }
105
+ const provider = policy['provider'];
106
+ if (!provider || typeof provider !== 'string')
107
+ return null;
108
+ if (provider === 'generic' || provider === 'custom') {
109
+ const TIER_TO_POLICY_KEY = { opus: 'high', sonnet: 'medium', haiku: 'low' };
110
+ const policyKey = TIER_TO_POLICY_KEY[tier];
111
+ if (!policyKey)
112
+ return null;
113
+ const v = policy[policyKey];
114
+ return (v && typeof v === 'string') ? v : null;
115
+ }
116
+ const presetsMap = model_catalog_cjs_1.PROVIDER_PRESETS;
117
+ if (!Object.hasOwn(presetsMap, provider))
118
+ return null;
119
+ const presetForProvider = presetsMap[provider];
120
+ if (!presetForProvider || typeof presetForProvider !== 'object')
121
+ return null;
122
+ if (!Object.hasOwn(presetForProvider, tier))
123
+ return null;
124
+ const tierPresets = presetForProvider[tier];
125
+ if (!tierPresets || typeof tierPresets !== 'object')
126
+ return null;
127
+ const budget = (policy['budget'] && typeof policy['budget'] === 'string') ? policy['budget'] : 'medium';
128
+ if (!Object.hasOwn(tierPresets, budget))
129
+ return null;
130
+ const budgetEntry = tierPresets[budget];
131
+ if (!budgetEntry || !budgetEntry.model)
132
+ return null;
133
+ return budgetEntry.model;
134
+ }
135
+ function resolveModelInternal(cwd, agentType) {
136
+ const config = loadConfig(cwd);
137
+ // 1. Per-agent override
138
+ const modelOverrides = config['model_overrides'];
139
+ const override = modelOverrides?.[agentType];
140
+ if (override) {
141
+ return override;
142
+ }
143
+ // 2. Compute the tier
144
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
145
+ const profile = String(config['model_profile'] || 'balanced').toLowerCase();
146
+ const agentModels = MODEL_PROFILES[agentType];
147
+ const phaseType = (AGENT_TO_PHASE_TYPE)[agentType];
148
+ const configModels = config['models'];
149
+ const phaseTypeTier = (phaseType && configModels && typeof configModels === 'object')
150
+ ? configModels[phaseType]
151
+ : undefined;
152
+ const VALID_TIERS = new Set(['opus', 'sonnet', 'haiku', 'inherit']);
153
+ const tier = (phaseTypeTier && VALID_TIERS.has(phaseTypeTier))
154
+ ? phaseTypeTier
155
+ : (profile === 'inherit'
156
+ ? 'inherit'
157
+ : (agentModels ? (agentModels[profile] || agentModels['balanced']) : null));
158
+ // 2.5. model_policy preset (#49, #1133)
159
+ const configRuntime = config['runtime'];
160
+ if (tier && tier !== 'inherit') {
161
+ const onClaude = !configRuntime || configRuntime === 'claude';
162
+ const effectiveRuntime = configRuntime || 'claude';
163
+ const mergedPolicy = config['model_policy']
164
+ ? { ...config['model_policy'], runtime: effectiveRuntime }
165
+ : null;
166
+ const policyModel = resolveModelPolicy(mergedPolicy, tier);
167
+ if (policyModel) {
168
+ // Non-Claude runtimes take full model IDs verbatim (unchanged behavior).
169
+ if (!onClaude)
170
+ return policyModel;
171
+ // Claude Code's Agent tool takes tier aliases (opus/sonnet/haiku/fable),
172
+ // not full model IDs — map the policy-resolved ID back to an alias (#1133).
173
+ const aliasForId = CLAUDE_POLICY_ID_TO_ALIAS[policyModel];
174
+ if (aliasForId)
175
+ return aliasForId;
176
+ // The policy value may already be a bare Claude agent alias (e.g. "fable").
177
+ if (CLAUDE_AGENT_ALIASES.has(policyModel))
178
+ return policyModel;
179
+ // No Claude alias for this ID (e.g. a pinned minor version like
180
+ // claude-opus-4-5). Warn once and fall through to the tier alias rather
181
+ // than returning an ID Claude Code cannot spawn.
182
+ warnModelPolicyUnmappable(agentType, policyModel, tier);
183
+ }
184
+ }
185
+ // 3. Runtime-aware resolution (#2517)
186
+ if (configRuntime && configRuntime !== 'claude' && tier && tier !== 'inherit') {
187
+ const entry = _resolveRuntimeTier(config, tier);
188
+ if (entry?.model)
189
+ return entry.model;
190
+ }
191
+ // 4. resolve_model_ids: "omit"
192
+ if (config['resolve_model_ids'] === 'omit') {
193
+ return '';
194
+ }
195
+ // 5. Profile lookup (Claude-native default).
196
+ if (!agentModels) {
197
+ return profile === 'quality' ? 'opus'
198
+ : profile === 'budget' ? 'haiku'
199
+ : profile === 'inherit' ? 'inherit'
200
+ : 'sonnet';
201
+ }
202
+ if (tier === 'inherit')
203
+ return 'inherit';
204
+ const alias = tier;
205
+ if (config['resolve_model_ids']) {
206
+ return model_catalog_cjs_1.MODEL_ALIAS_MAP[alias] || alias;
207
+ }
208
+ return alias;
209
+ }
210
+ const VALID_GRANULARITIES = new Set(['coarse', 'standard', 'fine']);
211
+ /**
212
+ * Resolve the planning granularity for a phase type (#68).
213
+ */
214
+ function resolveGranularityInternal(cwd, phaseType, override) {
215
+ if (override !== undefined && override !== null && override !== '') {
216
+ if (VALID_GRANULARITIES.has(override)) {
217
+ return override;
218
+ }
219
+ }
220
+ const config = loadConfig(cwd);
221
+ const configGranularities = config['granularities'];
222
+ const perPhase = (phaseType && configGranularities && typeof configGranularities === 'object')
223
+ ? configGranularities[phaseType]
224
+ : undefined;
225
+ if (perPhase && VALID_GRANULARITIES.has(perPhase)) {
226
+ return perPhase;
227
+ }
228
+ if (config['granularity'] !== undefined && config['granularity'] !== null && config['granularity'] !== '') {
229
+ return config['granularity'];
230
+ }
231
+ const planning = config['planning'];
232
+ const planningGran = planning && planning['granularity'];
233
+ if (planningGran !== undefined && planningGran !== null && planningGran !== '') {
234
+ return planningGran;
235
+ }
236
+ return 'standard';
237
+ }
238
+ /**
239
+ * Validate a CLI granularity override at the command boundary. Empty/null/undefined
240
+ * are treated as "no override" (no-op). An invalid non-empty value calls `fail`.
241
+ */
242
+ function assertValidGranularityOverride(override, fail) {
243
+ if (override !== undefined && override !== null && override !== '' && !VALID_GRANULARITIES.has(override)) {
244
+ fail(`invalid granularity '${override}' (valid: ${[...VALID_GRANULARITIES].join(', ')})`);
245
+ }
246
+ }
247
+ /**
248
+ * #3024 — Resolve a model for a specific dynamic-routing attempt.
249
+ */
250
+ function resolveModelForTier(cwd, agentType, attempt) {
251
+ const config = loadConfig(cwd);
252
+ const attemptN = Number.isInteger(attempt) && attempt > 0 ? attempt : 0;
253
+ const modelOverrides = config['model_overrides'];
254
+ const override = modelOverrides?.[agentType];
255
+ if (override)
256
+ return override;
257
+ if (config['model_policy'] && config['runtime'] && config['runtime'] !== 'claude') {
258
+ return resolveModelInternal(cwd, agentType);
259
+ }
260
+ const dr = config['dynamic_routing'];
261
+ if (!dr || typeof dr !== 'object' || dr['enabled'] !== true) {
262
+ return resolveModelInternal(cwd, agentType);
263
+ }
264
+ const tierModels = dr['tier_models'];
265
+ if (!tierModels || typeof tierModels !== 'object') {
266
+ return resolveModelInternal(cwd, agentType);
267
+ }
268
+ const defaultTier = (AGENT_DEFAULT_TIERS)[agentType];
269
+ if (!defaultTier || !(VALID_AGENT_TIERS).has(defaultTier)) {
270
+ return resolveModelInternal(cwd, agentType);
271
+ }
272
+ const maxEscalations = Number.isInteger(dr['max_escalations']) && dr['max_escalations'] >= 0
273
+ ? dr['max_escalations']
274
+ : 1;
275
+ const escalationEnabled = dr['escalate_on_failure'] !== false;
276
+ const effectiveAttempt = escalationEnabled
277
+ ? Math.min(attemptN, maxEscalations)
278
+ : 0;
279
+ let tier = defaultTier;
280
+ for (let i = 0; i < effectiveAttempt; i += 1) {
281
+ const next = (nextTier)(tier);
282
+ if (!next || next === tier)
283
+ break;
284
+ tier = next;
285
+ }
286
+ const alias = tierModels[tier];
287
+ if (typeof alias !== 'string' || alias.length === 0) {
288
+ return resolveModelInternal(cwd, agentType);
289
+ }
290
+ return alias;
291
+ }
292
+ // ─── #443 — Unified effort + fast_mode resolvers ─────────────────────────────
293
+ const VALID_EFFORTS = ['minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
294
+ const EFFORT_SET = new Set(VALID_EFFORTS);
295
+ /**
296
+ * Walk one step up the effort ladder from `e`.
297
+ */
298
+ function nextEffort(e) {
299
+ const i = VALID_EFFORTS.indexOf(e);
300
+ if (i < 0)
301
+ return null;
302
+ return VALID_EFFORTS[Math.min(i + 1, VALID_EFFORTS.length - 1)];
303
+ }
304
+ /**
305
+ * #443 — Resolve a universal effort string for (cwd, agentType).
306
+ */
307
+ function resolveEffortInternal(cwd, agentType, opts) {
308
+ // Step 1: invocation override
309
+ if (opts && typeof opts.override === 'string' && EFFORT_SET.has(opts.override)) {
310
+ return opts.override;
311
+ }
312
+ const config = loadConfig(cwd);
313
+ const effortCfg = (config['effort'] && typeof config['effort'] === 'object' && !Array.isArray(config['effort']))
314
+ ? config['effort']
315
+ : null;
316
+ // Step 2: agent_overrides
317
+ if (effortCfg) {
318
+ const ao = effortCfg['agent_overrides'];
319
+ if (ao && typeof ao === 'object' && !Array.isArray(ao)) {
320
+ const v = ao[agentType];
321
+ if (typeof v === 'string' && EFFORT_SET.has(v))
322
+ return v;
323
+ }
324
+ }
325
+ else {
326
+ const canonicalEffort = (configuration_cjs_1.CONFIG_DEFAULTS)['effort'];
327
+ const mao = canonicalEffort && typeof canonicalEffort === 'object'
328
+ ? canonicalEffort['agent_overrides']
329
+ : undefined;
330
+ if (mao && typeof mao === 'object' && !Array.isArray(mao)) {
331
+ const v = mao[agentType];
332
+ if (typeof v === 'string' && EFFORT_SET.has(v))
333
+ return v;
334
+ }
335
+ }
336
+ // Step 3: routing_tier_defaults by agent's default tier.
337
+ const agentTier = (AGENT_DEFAULT_TIERS)[agentType];
338
+ if (agentTier) {
339
+ if (effortCfg && effortCfg['routing_tier_defaults'] &&
340
+ typeof effortCfg['routing_tier_defaults'] === 'object' &&
341
+ !Array.isArray(effortCfg['routing_tier_defaults'])) {
342
+ const v = effortCfg['routing_tier_defaults'][agentTier];
343
+ if (typeof v === 'string' && EFFORT_SET.has(v))
344
+ return v;
345
+ }
346
+ else if (!effortCfg) {
347
+ const canonicalEffort = (configuration_cjs_1.CONFIG_DEFAULTS)['effort'];
348
+ const manifestDefaults = canonicalEffort && typeof canonicalEffort === 'object'
349
+ ? canonicalEffort['routing_tier_defaults']
350
+ : undefined;
351
+ if (manifestDefaults && typeof manifestDefaults === 'object') {
352
+ const v = manifestDefaults[agentTier];
353
+ if (typeof v === 'string' && EFFORT_SET.has(v))
354
+ return v;
355
+ }
356
+ }
357
+ }
358
+ // Step 4: effort.default
359
+ if (effortCfg) {
360
+ const d = effortCfg['default'];
361
+ if (typeof d === 'string' && EFFORT_SET.has(d))
362
+ return d;
363
+ }
364
+ else {
365
+ const canonicalEffort = (configuration_cjs_1.CONFIG_DEFAULTS)['effort'];
366
+ const d = canonicalEffort && typeof canonicalEffort === 'object'
367
+ ? canonicalEffort['default']
368
+ : undefined;
369
+ if (typeof d === 'string' && EFFORT_SET.has(d))
370
+ return d;
371
+ }
372
+ // Step 5: hardcoded default
373
+ return 'high';
374
+ }
375
+ /**
376
+ * #443 — Resolve fast_mode boolean for (cwd, agentType).
377
+ */
378
+ function resolveFastModeInternal(cwd, agentType, opts) {
379
+ // Step 1: invocation override
380
+ if (opts && typeof opts.override === 'boolean') {
381
+ return opts.override;
382
+ }
383
+ const config = loadConfig(cwd);
384
+ const fmCfg = (config['fast_mode'] && typeof config['fast_mode'] === 'object' && !Array.isArray(config['fast_mode']))
385
+ ? config['fast_mode']
386
+ : null;
387
+ // Step 2: agent_overrides
388
+ if (fmCfg) {
389
+ const ao = fmCfg['agent_overrides'];
390
+ if (ao && typeof ao === 'object' && !Array.isArray(ao)) {
391
+ const v = ao[agentType];
392
+ if (typeof v === 'boolean')
393
+ return v;
394
+ }
395
+ }
396
+ // Step 3: routing_tier_defaults by agent's default tier.
397
+ const agentTier = (AGENT_DEFAULT_TIERS)[agentType];
398
+ if (agentTier) {
399
+ if (fmCfg && fmCfg['routing_tier_defaults'] &&
400
+ typeof fmCfg['routing_tier_defaults'] === 'object' &&
401
+ !Array.isArray(fmCfg['routing_tier_defaults'])) {
402
+ const v = fmCfg['routing_tier_defaults'][agentTier];
403
+ if (typeof v === 'boolean')
404
+ return v;
405
+ }
406
+ else if (!fmCfg) {
407
+ const canonicalFm = (configuration_cjs_1.CONFIG_DEFAULTS)['fast_mode'];
408
+ const manifestDefaults = canonicalFm && typeof canonicalFm === 'object'
409
+ ? canonicalFm['routing_tier_defaults']
410
+ : undefined;
411
+ if (manifestDefaults && typeof manifestDefaults === 'object') {
412
+ const v = manifestDefaults[agentTier];
413
+ if (typeof v === 'boolean')
414
+ return v;
415
+ }
416
+ }
417
+ }
418
+ // Step 4: fast_mode.enabled
419
+ if (fmCfg && typeof fmCfg['enabled'] === 'boolean') {
420
+ return fmCfg['enabled'];
421
+ }
422
+ // Step 5: hardcoded default
423
+ return false;
424
+ }
425
+ /**
426
+ * #443 — Resolve effort for a dynamic-routing attempt (with escalation).
427
+ */
428
+ function resolveEffortForTier(cwd, agentType, attempt) {
429
+ const base = resolveEffortInternal(cwd, agentType);
430
+ const config = loadConfig(cwd);
431
+ const dr = config['dynamic_routing'];
432
+ if (!dr || typeof dr !== 'object' || dr['enabled'] !== true) {
433
+ return base;
434
+ }
435
+ if (dr['escalate_on_failure'] === false) {
436
+ return base;
437
+ }
438
+ const maxEscalations = Number.isInteger(dr['max_escalations']) && dr['max_escalations'] >= 0
439
+ ? dr['max_escalations']
440
+ : 1;
441
+ const attemptN = Number.isInteger(attempt) && attempt > 0 ? attempt : 0;
442
+ const effectiveAttempt = Math.min(attemptN, maxEscalations);
443
+ let current = base;
444
+ for (let i = 0; i < effectiveAttempt; i++) {
445
+ const next = nextEffort(current);
446
+ if (!next || next === current)
447
+ break;
448
+ current = next;
449
+ }
450
+ return current;
451
+ }
452
+ module.exports = {
453
+ resolveTierEntry,
454
+ resolveModelPolicy,
455
+ resolveModelInternal,
456
+ _resetModelPolicyWarningCacheForTests,
457
+ VALID_GRANULARITIES,
458
+ resolveGranularityInternal,
459
+ assertValidGranularityOverride,
460
+ resolveModelForTier,
461
+ VALID_EFFORTS,
462
+ EFFORT_SET,
463
+ nextEffort,
464
+ resolveEffortInternal,
465
+ resolveFastModeInternal,
466
+ resolveEffortForTier,
467
+ };
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * DispatchEvent shape factory — issue #177 (ADR-0174 P1.3), extended in #178 (P1.4).
4
+ *
5
+ * Creates a structured event record for every Hub dispatch, used by
6
+ * DispatchLogger to emit stderr errors and opt-in file audit trails.
7
+ *
8
+ * ADR-457 build-at-publish: the hand-written
9
+ * bin/lib/observability/event.cjs collapsed to a TypeScript source of truth.
10
+ * Behaviour is preserved byte-for-behaviour from the prior hand-written .cjs;
11
+ * only types are added.
12
+ *
13
+ * Shape:
14
+ * traceId: string — UUID v4, generated per dispatch
15
+ * parentTraceId: string|undefined — propagated from the caller when it is a canonical UUID v4
16
+ * (RFC 4122); invalid values are silently coerced to undefined.
17
+ * command: string — the dispatched verb
18
+ * args?: unknown — only present when includeArgs === true
19
+ * result: { kind: 'ok' | 'UnknownCommand' | 'InvalidArgs' | 'HandlerRefusal' | 'HandlerFailure', ...payload }
20
+ * timestamp: string — ISO 8601
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.makeDispatchEvent = makeDispatchEvent;
24
+ const node_crypto_1 = require("node:crypto");
25
+ /**
26
+ * Canonical UUID v4 regex (RFC 4122).
27
+ */
28
+ const UUID_V4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
29
+ /**
30
+ * Returns true only when value is a canonical UUID v4 string.
31
+ */
32
+ function isValidParentTraceId(value) {
33
+ return typeof value === 'string' && UUID_V4_REGEX.test(value);
34
+ }
35
+ /**
36
+ * Create a DispatchEvent.
37
+ */
38
+ function makeDispatchEvent({ command, args, result, includeArgs = false, parentTraceId, }) {
39
+ const resolvedParentTraceId = isValidParentTraceId(parentTraceId) ? parentTraceId : undefined;
40
+ const event = {
41
+ traceId: (0, node_crypto_1.randomUUID)(),
42
+ parentTraceId: resolvedParentTraceId,
43
+ command: String(command),
44
+ result,
45
+ timestamp: new Date().toISOString(),
46
+ };
47
+ if (includeArgs && args !== undefined) {
48
+ event.args = args;
49
+ }
50
+ return Object.freeze(event);
51
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * DispatchLogger interface + default implementation — issue #177 (ADR-0174 P1.3).
4
+ *
5
+ * Interface:
6
+ * { onEvent(event: DispatchEvent): void }
7
+ *
8
+ * Default behaviour (createDefaultLogger):
9
+ * 1. Silent on success — no stdout/stderr when result.kind === 'ok'.
10
+ * 2. Structured JSON to stderr on error — one line per dispatch error.
11
+ * 3. Opt-in audit file — when GSD_AUDIT=1 OR config.audit.enabled===true,
12
+ * appends every event (success + error) as one JSON line to
13
+ * .planning/.gsd-trace.jsonl relative to `cwd`. Creates .planning/ if absent.
14
+ * 4. Args redaction — args omitted by default; included when GSD_AUDIT_ARGS=1.
15
+ *
16
+ * No-op logger (createNoOpLogger):
17
+ * Silent on all events. Used as the Hub default when no logger is injected.
18
+ *
19
+ * ADR-457 build-at-publish: the hand-written bin/lib/observability/logger.cjs
20
+ * collapsed to a TypeScript source of truth. Behaviour is preserved
21
+ * byte-for-behaviour from the prior hand-written .cjs; only types are added.
22
+ */
23
+ var __importDefault = (this && this.__importDefault) || function (mod) {
24
+ return (mod && mod.__esModule) ? mod : { "default": mod };
25
+ };
26
+ const node_fs_1 = __importDefault(require("node:fs"));
27
+ const node_path_1 = __importDefault(require("node:path"));
28
+ const redaction_cjs_1 = require("./redaction.cjs");
29
+ const AUDIT_FILE_NAME = '.gsd-trace.jsonl';
30
+ const PLANNING_DIR = '.planning';
31
+ // ─── helpers ─────────────────────────────────────────────────────────────────
32
+ /**
33
+ * Safely serialise a value to JSON, falling back to a placeholder on circular refs.
34
+ */
35
+ function _safeStringify(value) {
36
+ try {
37
+ return JSON.stringify(value);
38
+ }
39
+ catch {
40
+ return JSON.stringify({ _serializationError: true });
41
+ }
42
+ }
43
+ /**
44
+ * Determine whether the audit file should be written to.
45
+ */
46
+ function _isAuditEnabled(config) {
47
+ if (process.env['GSD_AUDIT'] === '1')
48
+ return true;
49
+ if (config && config.audit && config.audit.enabled === true)
50
+ return true;
51
+ return false;
52
+ }
53
+ /**
54
+ * Build the redacted plain object for the audit file.
55
+ * Preserves the full DispatchEvent structure.
56
+ */
57
+ function _toAuditRecord(event) {
58
+ return (0, redaction_cjs_1.redactEvent)(event);
59
+ }
60
+ /**
61
+ * Build the flattened stderr error line.
62
+ *
63
+ * Per ADR-0174 P1.3 contract: { "kind": "<variant>", "traceId": "<uuid>", ...typedPayload }
64
+ * The result's kind is promoted to top-level and the typed payload fields are spread in.
65
+ * The `result` wrapper is removed.
66
+ */
67
+ function _toStderrRecord(event) {
68
+ const redacted = (0, redaction_cjs_1.redactEvent)(event);
69
+ const { result, ...eventWithoutResult } = redacted;
70
+ // Flatten: top-level gets kind + typed payload fields from result
71
+ const resultObj = result;
72
+ const { kind, ...typedPayload } = resultObj;
73
+ return Object.assign({}, eventWithoutResult, { kind }, typedPayload);
74
+ }
75
+ /**
76
+ * Append one JSON line to the audit file.
77
+ * Creates .planning/ directory if it does not exist.
78
+ *
79
+ * Uses synchronous fs API (crash-safe for v1 — dispatch is synchronous).
80
+ */
81
+ function _appendAuditLine(cwd, event) {
82
+ const planningDir = node_path_1.default.join(cwd, PLANNING_DIR);
83
+ // Ensure the directory exists
84
+ if (!node_fs_1.default.existsSync(planningDir)) {
85
+ node_fs_1.default.mkdirSync(planningDir, { recursive: true });
86
+ }
87
+ const auditPath = node_path_1.default.join(planningDir, AUDIT_FILE_NAME);
88
+ node_fs_1.default.appendFileSync(auditPath, _safeStringify(event) + '\n', 'utf8');
89
+ }
90
+ /**
91
+ * Create a no-op logger. All events are silently dropped.
92
+ * This is the Hub's default when no logger is injected by the caller.
93
+ */
94
+ function createNoOpLogger() {
95
+ return {
96
+ onEvent(_event) {
97
+ // intentionally empty
98
+ },
99
+ };
100
+ }
101
+ /**
102
+ * Create the default DispatchLogger.
103
+ */
104
+ function createDefaultLogger({ cwd = process.cwd(), config } = {}) {
105
+ return {
106
+ /**
107
+ * @param event - A DispatchEvent from the Hub.
108
+ */
109
+ onEvent(event) {
110
+ const resultObj = event && event['result'];
111
+ const isOk = resultObj && resultObj['kind'] === 'ok';
112
+ // ── Audit file (both ok and error) ────────────────────────────────────
113
+ if (_isAuditEnabled(config)) {
114
+ try {
115
+ const auditRecord = _toAuditRecord(event);
116
+ _appendAuditLine(cwd, auditRecord);
117
+ }
118
+ catch (auditErr) {
119
+ // Audit errors must not surface to callers
120
+ process.stderr.write(_safeStringify({
121
+ level: 'warn',
122
+ source: 'DispatchLogger',
123
+ message: 'audit file write failed: ' + String(auditErr?.message ?? auditErr),
124
+ }) + '\n');
125
+ }
126
+ }
127
+ // ── Stderr on error ───────────────────────────────────────────────────
128
+ if (!isOk) {
129
+ try {
130
+ const stderrRecord = _toStderrRecord(event);
131
+ process.stderr.write(_safeStringify(stderrRecord) + '\n');
132
+ }
133
+ catch (stderrErr) {
134
+ // Last-resort: we cannot throw from the logger
135
+ process.stderr.write(_safeStringify({
136
+ level: 'warn',
137
+ source: 'DispatchLogger',
138
+ message: 'stderr emit failed: ' + String(stderrErr?.message ?? stderrErr),
139
+ }) + '\n');
140
+ }
141
+ }
142
+ // ── Silent on success (no else branch needed) ─────────────────────────
143
+ },
144
+ };
145
+ }
146
+ module.exports = { createDefaultLogger, createNoOpLogger };