session-orchestrator 3.16.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 (762) hide show
  1. package/.claude-plugin/marketplace.json +29 -0
  2. package/.claude-plugin/plugin.json +18 -0
  3. package/.codex-plugin/agents/explorer.toml +14 -0
  4. package/.codex-plugin/agents/session-reviewer.toml +23 -0
  5. package/.codex-plugin/agents/wave-worker.toml +15 -0
  6. package/.codex-plugin/config.toml +20 -0
  7. package/.codex-plugin/plugin.json +37 -0
  8. package/.cursor/rules/000-session-orchestrator.mdc +73 -0
  9. package/.cursor/rules/010-session-workflow.mdc +170 -0
  10. package/.cursor/rules/020-quality-gates.mdc +128 -0
  11. package/.cursor/rules/030-wave-execution.mdc +216 -0
  12. package/.cursor/rules/040-discovery.mdc +242 -0
  13. package/.cursor/rules/050-plan.mdc +235 -0
  14. package/.cursor/rules/060-evolve.mdc +232 -0
  15. package/.cursor/rules/070-gitlab-ops.mdc +246 -0
  16. package/.cursor/rules/080-ecosystem-health.mdc +145 -0
  17. package/.mcp.json +8 -0
  18. package/CHANGELOG.md +1544 -0
  19. package/LICENSE +21 -0
  20. package/NOTICE +64 -0
  21. package/README.md +242 -0
  22. package/SECURITY.md +90 -0
  23. package/agents/AGENTS.md +136 -0
  24. package/agents/analyst.md +99 -0
  25. package/agents/architect-reviewer.md +93 -0
  26. package/agents/code-implementer.md +106 -0
  27. package/agents/db-specialist.md +104 -0
  28. package/agents/dialectic-deriver.md +139 -0
  29. package/agents/docs-writer.md +113 -0
  30. package/agents/eval-judge.md +146 -0
  31. package/agents/memory-proposal-collector.md +297 -0
  32. package/agents/qa-strategist.md +102 -0
  33. package/agents/schemas/analyst.schema.json +46 -0
  34. package/agents/schemas/architect-reviewer.schema.json +50 -0
  35. package/agents/schemas/code-implementer.schema.json +61 -0
  36. package/agents/schemas/db-specialist.schema.json +80 -0
  37. package/agents/schemas/docs-writer.schema.json +56 -0
  38. package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
  39. package/agents/schemas/qa-strategist.schema.json +46 -0
  40. package/agents/schemas/security-reviewer.schema.json +86 -0
  41. package/agents/schemas/session-reviewer.schema.json +69 -0
  42. package/agents/schemas/test-writer.schema.json +69 -0
  43. package/agents/schemas/ui-developer.schema.json +90 -0
  44. package/agents/schemas/ux-evaluator.schema.json +51 -0
  45. package/agents/security-reviewer.md +236 -0
  46. package/agents/session-reviewer.md +201 -0
  47. package/agents/skill-applied-judge.md +122 -0
  48. package/agents/test-writer.md +123 -0
  49. package/agents/ui-developer.md +109 -0
  50. package/agents/ux-evaluator.md +161 -0
  51. package/assets/icon.svg +11 -0
  52. package/assets/og-card.png +0 -0
  53. package/assets/og-card.svg +47 -0
  54. package/commands/autopilot-multi.md +74 -0
  55. package/commands/autopilot.md +80 -0
  56. package/commands/bootstrap.md +56 -0
  57. package/commands/brainstorm.md +48 -0
  58. package/commands/close.md +24 -0
  59. package/commands/debug.md +36 -0
  60. package/commands/discovery.md +32 -0
  61. package/commands/dispatcher.md +59 -0
  62. package/commands/eval.md +28 -0
  63. package/commands/evolve.md +10 -0
  64. package/commands/go.md +41 -0
  65. package/commands/grill.md +45 -0
  66. package/commands/harness-audit.md +26 -0
  67. package/commands/memory-cleanup.md +25 -0
  68. package/commands/persona-panel.md +121 -0
  69. package/commands/plan.md +15 -0
  70. package/commands/portfolio.md +97 -0
  71. package/commands/reconcile.md +23 -0
  72. package/commands/repo-audit.md +24 -0
  73. package/commands/session.md +30 -0
  74. package/commands/spinout.md +15 -0
  75. package/commands/sunset-review.md +27 -0
  76. package/commands/templates-ack.md +96 -0
  77. package/commands/test.md +97 -0
  78. package/docs/README.md +105 -0
  79. package/docs/USER-GUIDE.md +1403 -0
  80. package/docs/ci-setup.md +81 -0
  81. package/docs/codex-setup.md +142 -0
  82. package/docs/components.md +74 -0
  83. package/docs/cursor-setup.md +104 -0
  84. package/docs/events-schema.md +81 -0
  85. package/docs/migration-v3.md +148 -0
  86. package/docs/owner-config-schema.md +154 -0
  87. package/docs/persona-panel.md +433 -0
  88. package/docs/pi-setup.md +115 -0
  89. package/docs/plugin-architecture-v3.md +296 -0
  90. package/docs/pm-skills-marketplace.md +114 -0
  91. package/docs/policy-cache-validation-2026-04-28.md +118 -0
  92. package/docs/rule-authoring.md +316 -0
  93. package/docs/session-config-reference.md +1439 -0
  94. package/docs/session-config-template.md +961 -0
  95. package/docs/vault-docs-architecture.md +297 -0
  96. package/hooks/_lib/lock-bootstrap.mjs +272 -0
  97. package/hooks/_lib/lock-reconcile.mjs +93 -0
  98. package/hooks/_lib/profile-gate.mjs +95 -0
  99. package/hooks/_lib/transcript-history.mjs +211 -0
  100. package/hooks/agent-teams-h3-test.sh +362 -0
  101. package/hooks/config-protection.mjs +0 -0
  102. package/hooks/cwd-change-restore.mjs +131 -0
  103. package/hooks/enforce-commands.mjs +179 -0
  104. package/hooks/enforce-scope.mjs +273 -0
  105. package/hooks/hooks-codex.json +60 -0
  106. package/hooks/hooks-cursor.json +15 -0
  107. package/hooks/hooks-pi.json +115 -0
  108. package/hooks/hooks.json +215 -0
  109. package/hooks/loop-guard.mjs +260 -0
  110. package/hooks/on-session-end.mjs +217 -0
  111. package/hooks/on-session-start.mjs +660 -0
  112. package/hooks/on-stop.mjs +294 -0
  113. package/hooks/operator-steer.mjs +64 -0
  114. package/hooks/post-edit-validate.mjs +225 -0
  115. package/hooks/post-subagent-discovery-validator.mjs +398 -0
  116. package/hooks/post-tool-batch-wave-signal.mjs +328 -0
  117. package/hooks/post-tool-failure-corrective-context.mjs +248 -0
  118. package/hooks/post-tooluse-frontend-slop.mjs +184 -0
  119. package/hooks/pre-bash-destructive-guard.mjs +515 -0
  120. package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
  121. package/hooks/pre-bash-staging-fence.mjs +223 -0
  122. package/hooks/pre-bash-templates-first.mjs +404 -0
  123. package/hooks/run-node.sh +72 -0
  124. package/hooks/skill-invocation-telemetry.mjs +99 -0
  125. package/hooks/subagent-telemetry.mjs +249 -0
  126. package/hooks/wave-scope-commit-guard.mjs +191 -0
  127. package/monitors/monitors.json +14 -0
  128. package/output-styles/finding-report.md +48 -0
  129. package/output-styles/session-report.md +53 -0
  130. package/output-styles/wave-summary.md +38 -0
  131. package/package.json +94 -0
  132. package/pi/extensions/session-orchestrator.ts +25 -0
  133. package/pi/prompts/autopilot-multi.md +12 -0
  134. package/pi/prompts/autopilot.md +12 -0
  135. package/pi/prompts/bootstrap.md +12 -0
  136. package/pi/prompts/brainstorm.md +12 -0
  137. package/pi/prompts/close.md +11 -0
  138. package/pi/prompts/debug.md +12 -0
  139. package/pi/prompts/discovery.md +12 -0
  140. package/pi/prompts/dispatcher.md +12 -0
  141. package/pi/prompts/eval.md +12 -0
  142. package/pi/prompts/evolve.md +12 -0
  143. package/pi/prompts/go.md +12 -0
  144. package/pi/prompts/grill.md +12 -0
  145. package/pi/prompts/harness-audit.md +12 -0
  146. package/pi/prompts/memory-cleanup.md +12 -0
  147. package/pi/prompts/persona-panel.md +12 -0
  148. package/pi/prompts/plan.md +12 -0
  149. package/pi/prompts/portfolio.md +12 -0
  150. package/pi/prompts/reconcile.md +12 -0
  151. package/pi/prompts/repo-audit.md +12 -0
  152. package/pi/prompts/session.md +12 -0
  153. package/pi/prompts/spinout.md +12 -0
  154. package/pi/prompts/sunset-review.md +12 -0
  155. package/pi/prompts/templates-ack.md +12 -0
  156. package/pi/prompts/test.md +12 -0
  157. package/rules/_index.md +51 -0
  158. package/rules/always-on/commit-discipline.md +26 -0
  159. package/rules/always-on/npm-quality-gates.md +26 -0
  160. package/rules/always-on/parallel-sessions.md +43 -0
  161. package/rules/opt-in-domain/prompt-caching.md +270 -0
  162. package/rules/opt-in-stack/backend-data.md +188 -0
  163. package/rules/opt-in-stack/backend.md +390 -0
  164. package/rules/opt-in-stack/frontend.md +98 -0
  165. package/rules/opt-in-stack/security-web.md +194 -0
  166. package/rules/opt-in-stack/swift.md +65 -0
  167. package/scripts/archive-closed-prds.mjs +416 -0
  168. package/scripts/autopilot-multi.mjs +802 -0
  169. package/scripts/autopilot.mjs +383 -0
  170. package/scripts/backfill-abandoned-sessions.mjs +265 -0
  171. package/scripts/backfill-learnings-expires.mjs +196 -0
  172. package/scripts/backfill-learnings.mjs +203 -0
  173. package/scripts/backfill-sessions.mjs +282 -0
  174. package/scripts/check-doc-consistency.sh +279 -0
  175. package/scripts/check-package-manager.mjs +445 -0
  176. package/scripts/ci/assert-vitest-green.mjs +267 -0
  177. package/scripts/codex-install.mjs +435 -0
  178. package/scripts/compute-grounding-injection.sh +186 -0
  179. package/scripts/cursor-install.mjs +113 -0
  180. package/scripts/dialectic-deriver.mjs +573 -0
  181. package/scripts/emit-event.mjs +160 -0
  182. package/scripts/emit-session.mjs +212 -0
  183. package/scripts/eval-session.mjs +262 -0
  184. package/scripts/export-hw-learnings.mjs +437 -0
  185. package/scripts/gc-stale-worktrees.mjs +666 -0
  186. package/scripts/generate-pi-prompts.mjs +127 -0
  187. package/scripts/harness-audit.mjs +287 -0
  188. package/scripts/lib/agent-frontmatter.mjs +266 -0
  189. package/scripts/lib/agent-output-schema.mjs +166 -0
  190. package/scripts/lib/agent-status.mjs +303 -0
  191. package/scripts/lib/ajv-loader.mjs +34 -0
  192. package/scripts/lib/auto-dialectic.mjs +382 -0
  193. package/scripts/lib/auto-dream.mjs +471 -0
  194. package/scripts/lib/autonomy/suitability.mjs +212 -0
  195. package/scripts/lib/autopilot/dep-graph.mjs +417 -0
  196. package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
  197. package/scripts/lib/autopilot/flags.mjs +104 -0
  198. package/scripts/lib/autopilot/kill-switches.mjs +174 -0
  199. package/scripts/lib/autopilot/loop.mjs +320 -0
  200. package/scripts/lib/autopilot/mr-draft.mjs +520 -0
  201. package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
  202. package/scripts/lib/autopilot/recent-runs.mjs +106 -0
  203. package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
  204. package/scripts/lib/autopilot/telemetry.mjs +224 -0
  205. package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
  206. package/scripts/lib/autopilot-telemetry.mjs +11 -0
  207. package/scripts/lib/autopilot.mjs +39 -0
  208. package/scripts/lib/backlog-scan.mjs +179 -0
  209. package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
  210. package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
  211. package/scripts/lib/build-live-signals.mjs +150 -0
  212. package/scripts/lib/ci-status-banner.mjs +425 -0
  213. package/scripts/lib/claude-md-budget-lint.mjs +246 -0
  214. package/scripts/lib/cli-flags.mjs +158 -0
  215. package/scripts/lib/codex/plugin-contract.mjs +610 -0
  216. package/scripts/lib/cold-start-detector.mjs +240 -0
  217. package/scripts/lib/command-blocker.mjs +458 -0
  218. package/scripts/lib/common.mjs +333 -0
  219. package/scripts/lib/config/auto-dream.mjs +77 -0
  220. package/scripts/lib/config/block-header.mjs +94 -0
  221. package/scripts/lib/config/broken-window.mjs +114 -0
  222. package/scripts/lib/config/coercers.mjs +248 -0
  223. package/scripts/lib/config/cold-start.mjs +92 -0
  224. package/scripts/lib/config/config-protection.mjs +120 -0
  225. package/scripts/lib/config/cross-repo.mjs +104 -0
  226. package/scripts/lib/config/custom-phases.mjs +213 -0
  227. package/scripts/lib/config/dialectic.mjs +92 -0
  228. package/scripts/lib/config/discovery-validator.mjs +75 -0
  229. package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
  230. package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
  231. package/scripts/lib/config/docs-orchestrator.mjs +90 -0
  232. package/scripts/lib/config/docs-staleness.mjs +96 -0
  233. package/scripts/lib/config/drift-check.mjs +155 -0
  234. package/scripts/lib/config/eval.mjs +130 -0
  235. package/scripts/lib/config/events-rotation.mjs +74 -0
  236. package/scripts/lib/config/evolve.mjs +308 -0
  237. package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
  238. package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
  239. package/scripts/lib/config/handover-gate.mjs +106 -0
  240. package/scripts/lib/config/host-paths.mjs +76 -0
  241. package/scripts/lib/config/io.mjs +54 -0
  242. package/scripts/lib/config/loop-guard.mjs +117 -0
  243. package/scripts/lib/config/memory.mjs +150 -0
  244. package/scripts/lib/config/persona-gate-wave.mjs +258 -0
  245. package/scripts/lib/config/reconcile.mjs +205 -0
  246. package/scripts/lib/config/section-extractor.mjs +100 -0
  247. package/scripts/lib/config/skill-evolution.mjs +112 -0
  248. package/scripts/lib/config/slopcheck.mjs +99 -0
  249. package/scripts/lib/config/state-md-lock.mjs +83 -0
  250. package/scripts/lib/config/templates-first.mjs +94 -0
  251. package/scripts/lib/config/test.mjs +113 -0
  252. package/scripts/lib/config/vault-integration.mjs +201 -0
  253. package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
  254. package/scripts/lib/config/vault-staleness.mjs +84 -0
  255. package/scripts/lib/config/vault-sync.mjs +96 -0
  256. package/scripts/lib/config/verification-auto-fix.mjs +84 -0
  257. package/scripts/lib/config/wave-reviewers.mjs +133 -0
  258. package/scripts/lib/config-schema.mjs +345 -0
  259. package/scripts/lib/config.mjs +474 -0
  260. package/scripts/lib/convergence-monitor.mjs +389 -0
  261. package/scripts/lib/coordinator-snapshot.mjs +371 -0
  262. package/scripts/lib/crypto-digest-utils.mjs +91 -0
  263. package/scripts/lib/discovery/helpers.mjs +127 -0
  264. package/scripts/lib/discovery/triage-state.mjs +279 -0
  265. package/scripts/lib/dispatcher/cli.mjs +257 -0
  266. package/scripts/lib/dispatcher/enumerate.mjs +243 -0
  267. package/scripts/lib/dispatcher/rank.mjs +363 -0
  268. package/scripts/lib/ecosystem-health.mjs +224 -0
  269. package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
  270. package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
  271. package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
  272. package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
  273. package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
  274. package/scripts/lib/ecosystem-wizard.mjs +48 -0
  275. package/scripts/lib/env-check.mjs +89 -0
  276. package/scripts/lib/eval/engine.mjs +605 -0
  277. package/scripts/lib/eval/judge.mjs +433 -0
  278. package/scripts/lib/eval/report.mjs +367 -0
  279. package/scripts/lib/eval/schema.mjs +618 -0
  280. package/scripts/lib/eval/session-resolve.mjs +137 -0
  281. package/scripts/lib/eval/sink.mjs +77 -0
  282. package/scripts/lib/events-rotation.mjs +86 -0
  283. package/scripts/lib/events-schema.mjs +81 -0
  284. package/scripts/lib/events.mjs +80 -0
  285. package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
  286. package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
  287. package/scripts/lib/exclusivity-matrix.mjs +68 -0
  288. package/scripts/lib/fetch-baseline.mjs +311 -0
  289. package/scripts/lib/file-lock.mjs +512 -0
  290. package/scripts/lib/frontend-detect/detect.mjs +138 -0
  291. package/scripts/lib/frontend-detect/rules.mjs +295 -0
  292. package/scripts/lib/frontmatter-guard.mjs +241 -0
  293. package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
  294. package/scripts/lib/gates/gate-baseline.mjs +42 -0
  295. package/scripts/lib/gates/gate-full.mjs +85 -0
  296. package/scripts/lib/gates/gate-helpers.mjs +231 -0
  297. package/scripts/lib/gates/gate-incremental.mjs +76 -0
  298. package/scripts/lib/gates/gate-per-file.mjs +55 -0
  299. package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
  300. package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
  301. package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
  302. package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
  303. package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
  304. package/scripts/lib/handover-gate.mjs +222 -0
  305. package/scripts/lib/hardening.mjs +43 -0
  306. package/scripts/lib/hardware-pattern-detector.mjs +238 -0
  307. package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
  308. package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
  309. package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
  310. package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
  311. package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
  312. package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
  313. package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
  314. package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
  315. package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
  316. package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
  317. package/scripts/lib/harness-audit/categories.mjs +19 -0
  318. package/scripts/lib/historical-guard.mjs +15 -0
  319. package/scripts/lib/host-identity.mjs +262 -0
  320. package/scripts/lib/instruction-budget-guard.mjs +332 -0
  321. package/scripts/lib/io.mjs +304 -0
  322. package/scripts/lib/issue-close-strip-labels.mjs +161 -0
  323. package/scripts/lib/language-mappers/README.md +57 -0
  324. package/scripts/lib/language-mappers/index.mjs +165 -0
  325. package/scripts/lib/language-mappers/markdown.mjs +149 -0
  326. package/scripts/lib/language-mappers/python.mjs +249 -0
  327. package/scripts/lib/language-mappers/swift.mjs +201 -0
  328. package/scripts/lib/language-mappers/typescript.mjs +433 -0
  329. package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
  330. package/scripts/lib/learnings/filters.mjs +43 -0
  331. package/scripts/lib/learnings/io.mjs +255 -0
  332. package/scripts/lib/learnings/schema.mjs +518 -0
  333. package/scripts/lib/learnings/surface.mjs +207 -0
  334. package/scripts/lib/learnings.mjs +42 -0
  335. package/scripts/lib/lock-reaper.mjs +648 -0
  336. package/scripts/lib/locks/index.mjs +31 -0
  337. package/scripts/lib/locks/lock-body.mjs +62 -0
  338. package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
  339. package/scripts/lib/locks/state-md-lock.mjs +351 -0
  340. package/scripts/lib/loop-readiness-banner.mjs +144 -0
  341. package/scripts/lib/memory-banner.mjs +478 -0
  342. package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
  343. package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
  344. package/scripts/lib/memory-paths.mjs +31 -0
  345. package/scripts/lib/memory-proposals/collector.mjs +334 -0
  346. package/scripts/lib/memory-proposals/schema.mjs +289 -0
  347. package/scripts/lib/memory-proposals/sink.mjs +507 -0
  348. package/scripts/lib/memory-proposals/store.mjs +441 -0
  349. package/scripts/lib/mission-status-schema.mjs +114 -0
  350. package/scripts/lib/mode-selector/alternatives.mjs +64 -0
  351. package/scripts/lib/mode-selector/constants.mjs +29 -0
  352. package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
  353. package/scripts/lib/mode-selector/rationale.mjs +55 -0
  354. package/scripts/lib/mode-selector/scoring.mjs +221 -0
  355. package/scripts/lib/mode-selector-accuracy.mjs +121 -0
  356. package/scripts/lib/mode-selector.mjs +160 -0
  357. package/scripts/lib/multi-provider-build/providers.mjs +64 -0
  358. package/scripts/lib/multi-provider-build/templating.mjs +130 -0
  359. package/scripts/lib/named-baseline-resolver.mjs +233 -0
  360. package/scripts/lib/named-vault-resolver.mjs +433 -0
  361. package/scripts/lib/owner-config/coerce.mjs +29 -0
  362. package/scripts/lib/owner-config/constants.mjs +21 -0
  363. package/scripts/lib/owner-config/defaults.mjs +50 -0
  364. package/scripts/lib/owner-config/error.mjs +19 -0
  365. package/scripts/lib/owner-config/index.mjs +13 -0
  366. package/scripts/lib/owner-config/merge.mjs +52 -0
  367. package/scripts/lib/owner-config/validate.mjs +259 -0
  368. package/scripts/lib/owner-config-banner.mjs +126 -0
  369. package/scripts/lib/owner-config-loader.mjs +159 -0
  370. package/scripts/lib/owner-config.example.yaml +72 -0
  371. package/scripts/lib/owner-config.mjs +28 -0
  372. package/scripts/lib/owner-interview.mjs +243 -0
  373. package/scripts/lib/owner-yaml.mjs +571 -0
  374. package/scripts/lib/package-manager.mjs +160 -0
  375. package/scripts/lib/path-utils.mjs +217 -0
  376. package/scripts/lib/peer-cards/merger.mjs +310 -0
  377. package/scripts/lib/peer-cards/reader.mjs +125 -0
  378. package/scripts/lib/peer-cards/schema.mjs +230 -0
  379. package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
  380. package/scripts/lib/peer-cards/writer.mjs +138 -0
  381. package/scripts/lib/peer-discovery.mjs +200 -0
  382. package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
  383. package/scripts/lib/persona-panel/consolidator.mjs +370 -0
  384. package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
  385. package/scripts/lib/persona-panel/threshold.mjs +130 -0
  386. package/scripts/lib/pi-hook-bridge.mjs +328 -0
  387. package/scripts/lib/platform.mjs +266 -0
  388. package/scripts/lib/playwright-driver/runner.mjs +297 -0
  389. package/scripts/lib/plugin-root.mjs +210 -0
  390. package/scripts/lib/pre-dispatch-check.mjs +126 -0
  391. package/scripts/lib/product-repo-detect.mjs +121 -0
  392. package/scripts/lib/profiles/registry.mjs +176 -0
  393. package/scripts/lib/profiles/schema.mjs +209 -0
  394. package/scripts/lib/qg-command-drift-banner.mjs +88 -0
  395. package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
  396. package/scripts/lib/quality-gate.mjs +536 -0
  397. package/scripts/lib/quality-gates-cache.mjs +228 -0
  398. package/scripts/lib/quality-gates-policy.mjs +95 -0
  399. package/scripts/lib/recommendations-v0.mjs +156 -0
  400. package/scripts/lib/reconcile/eligibility.mjs +203 -0
  401. package/scripts/lib/reconcile/emitter.mjs +244 -0
  402. package/scripts/lib/reconcile/engine.mjs +412 -0
  403. package/scripts/lib/reconcile/idempotency.mjs +239 -0
  404. package/scripts/lib/reconcile/renderer.mjs +211 -0
  405. package/scripts/lib/reconcile/writer.mjs +293 -0
  406. package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
  407. package/scripts/lib/resource-probe/evaluate.mjs +190 -0
  408. package/scripts/lib/resource-probe/parsers.mjs +181 -0
  409. package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
  410. package/scripts/lib/resource-probe.mjs +95 -0
  411. package/scripts/lib/rule-loader.mjs +552 -0
  412. package/scripts/lib/rules-sync.mjs +439 -0
  413. package/scripts/lib/scope-gate.mjs +496 -0
  414. package/scripts/lib/session-close-backfill.mjs +539 -0
  415. package/scripts/lib/session-discovery.mjs +256 -0
  416. package/scripts/lib/session-end/phase-skip.mjs +357 -0
  417. package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
  418. package/scripts/lib/session-id.mjs +362 -0
  419. package/scripts/lib/session-lock.mjs +703 -0
  420. package/scripts/lib/session-registry.mjs +355 -0
  421. package/scripts/lib/session-schema/aliases.mjs +71 -0
  422. package/scripts/lib/session-schema/constants.mjs +115 -0
  423. package/scripts/lib/session-schema/normalizer.mjs +66 -0
  424. package/scripts/lib/session-schema/timestamps.mjs +64 -0
  425. package/scripts/lib/session-schema/validator.mjs +453 -0
  426. package/scripts/lib/session-schema.mjs +71 -0
  427. package/scripts/lib/session-token-rollup.mjs +137 -0
  428. package/scripts/lib/sessions-staleness-banner.mjs +247 -0
  429. package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
  430. package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
  431. package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
  432. package/scripts/lib/skill-evolution/engine.mjs +719 -0
  433. package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
  434. package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
  435. package/scripts/lib/skill-health/join.mjs +181 -0
  436. package/scripts/lib/skill-health/score.mjs +123 -0
  437. package/scripts/lib/skill-invocations-schema.mjs +214 -0
  438. package/scripts/lib/skill-judge.mjs +348 -0
  439. package/scripts/lib/skill-judgments-schema.mjs +264 -0
  440. package/scripts/lib/slopcheck.mjs +501 -0
  441. package/scripts/lib/soul-resolve.mjs +118 -0
  442. package/scripts/lib/spiral-carryover.mjs +495 -0
  443. package/scripts/lib/state-md/body-sections.mjs +851 -0
  444. package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
  445. package/scripts/lib/state-md/mission-status.mjs +247 -0
  446. package/scripts/lib/state-md/recommendations.mjs +57 -0
  447. package/scripts/lib/state-md/yaml-parser.mjs +234 -0
  448. package/scripts/lib/state-md-peer-guard.mjs +232 -0
  449. package/scripts/lib/state-md.mjs +53 -0
  450. package/scripts/lib/subagents-schema.mjs +309 -0
  451. package/scripts/lib/sunset/walker.mjs +1192 -0
  452. package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
  453. package/scripts/lib/test-runner/fingerprint.mjs +33 -0
  454. package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
  455. package/scripts/lib/tmux-layout/layouts.mjs +224 -0
  456. package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
  457. package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
  458. package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
  459. package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
  460. package/scripts/lib/validate/check-agents.mjs +457 -0
  461. package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
  462. package/scripts/lib/validate/check-commands.mjs +148 -0
  463. package/scripts/lib/validate/check-component-paths.mjs +112 -0
  464. package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
  465. package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
  466. package/scripts/lib/validate/check-json-files.mjs +116 -0
  467. package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
  468. package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
  469. package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
  470. package/scripts/lib/validate/check-pi-package.mjs +110 -0
  471. package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
  472. package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
  473. package/scripts/lib/validate/check-plugin-json.mjs +96 -0
  474. package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
  475. package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
  476. package/scripts/lib/validate/check-rules.mjs +143 -0
  477. package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
  478. package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
  479. package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
  480. package/scripts/lib/validate/confidential-names.mjs +169 -0
  481. package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
  482. package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
  483. package/scripts/lib/validate/tier-inference.mjs +100 -0
  484. package/scripts/lib/validate-vendored-rules.mjs +519 -0
  485. package/scripts/lib/vault-archive.mjs +404 -0
  486. package/scripts/lib/vault-backfill/glab.mjs +164 -0
  487. package/scripts/lib/vault-backfill/manifest.mjs +75 -0
  488. package/scripts/lib/vault-backfill/template.mjs +130 -0
  489. package/scripts/lib/vault-consolidate-fs.mjs +331 -0
  490. package/scripts/lib/vault-migration-rules.mjs +155 -0
  491. package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
  492. package/scripts/lib/vault-mirror/namespace.mjs +152 -0
  493. package/scripts/lib/vault-mirror/process.mjs +567 -0
  494. package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
  495. package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
  496. package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
  497. package/scripts/lib/vault-mirror/render.mjs +8 -0
  498. package/scripts/lib/vault-mirror/utils.mjs +217 -0
  499. package/scripts/lib/vault-relocation-rules.mjs +555 -0
  500. package/scripts/lib/vault-repo-backfill.mjs +235 -0
  501. package/scripts/lib/vault-staleness-banner.mjs +142 -0
  502. package/scripts/lib/vault-status/board-writer.mjs +769 -0
  503. package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
  504. package/scripts/lib/vault-sync-baseline.mjs +152 -0
  505. package/scripts/lib/wave-context.mjs +29 -0
  506. package/scripts/lib/wave-executor/pool.mjs +248 -0
  507. package/scripts/lib/wave-resource-gate.mjs +204 -0
  508. package/scripts/lib/wave-sizing.mjs +75 -0
  509. package/scripts/lib/webhook-url.mjs +105 -0
  510. package/scripts/lib/workspace.mjs +198 -0
  511. package/scripts/lib/worktree/constants.mjs +35 -0
  512. package/scripts/lib/worktree/index.mjs +17 -0
  513. package/scripts/lib/worktree/lifecycle.mjs +287 -0
  514. package/scripts/lib/worktree/listing.mjs +118 -0
  515. package/scripts/lib/worktree/meta.mjs +64 -0
  516. package/scripts/lib/worktree-freshness.mjs +313 -0
  517. package/scripts/lib/worktree.mjs +15 -0
  518. package/scripts/lifecycle-sim-v6.mjs +347 -0
  519. package/scripts/lock-reaper.mjs +185 -0
  520. package/scripts/mcp-server.sh +241 -0
  521. package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
  522. package/scripts/memory-propose.mjs +464 -0
  523. package/scripts/migrate-cold-start-seed.mjs +404 -0
  524. package/scripts/migrate-learnings-jsonl.mjs +189 -0
  525. package/scripts/migrate-legacy-learnings.sh +61 -0
  526. package/scripts/migrate-sessions-jsonl.mjs +448 -0
  527. package/scripts/migrate-subagents-jsonl.mjs +196 -0
  528. package/scripts/migrate-vault-paths.mjs +796 -0
  529. package/scripts/parse-config.mjs +149 -0
  530. package/scripts/pi-install.mjs +117 -0
  531. package/scripts/print-applicable-rules.mjs +247 -0
  532. package/scripts/promote-vault-strict.mjs +496 -0
  533. package/scripts/relocate-vault-corpus.mjs +1178 -0
  534. package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
  535. package/scripts/run-quality-gate.mjs +216 -0
  536. package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
  537. package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
  538. package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
  539. package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
  540. package/scripts/sweep-expired-learnings.mjs +135 -0
  541. package/scripts/sync-vault-schema.mjs +376 -0
  542. package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
  543. package/scripts/tmux-layout.mjs +245 -0
  544. package/scripts/token-audit.sh +191 -0
  545. package/scripts/typecheck.mjs +42 -0
  546. package/scripts/upload-social-preview.mjs +316 -0
  547. package/scripts/validate-config.mjs +46 -0
  548. package/scripts/validate-plugin-manifests.mjs +163 -0
  549. package/scripts/validate-plugin.mjs +264 -0
  550. package/scripts/validate-wave-scope.mjs +289 -0
  551. package/scripts/vault-backfill.mjs +404 -0
  552. package/scripts/vault-consolidate.mjs +596 -0
  553. package/scripts/vault-integration-watcher.mjs +394 -0
  554. package/scripts/vault-mirror.mjs +430 -0
  555. package/skills/_shared/bootstrap-gate.md +111 -0
  556. package/skills/_shared/config-reading.md +226 -0
  557. package/skills/_shared/instruction-file-resolution.md +79 -0
  558. package/skills/_shared/model-selection.md +64 -0
  559. package/skills/_shared/monitor-patterns.md +300 -0
  560. package/skills/_shared/parallel-aware-auq.md +121 -0
  561. package/skills/_shared/parallel-aware-preamble.md +185 -0
  562. package/skills/_shared/platform-tools.md +96 -0
  563. package/skills/_shared/state-ownership.md +221 -0
  564. package/skills/architecture/DEEPENING.md +37 -0
  565. package/skills/architecture/INTERFACE-DESIGN.md +44 -0
  566. package/skills/architecture/LANGUAGE.md +53 -0
  567. package/skills/architecture/SKILL.md +92 -0
  568. package/skills/autopilot/SKILL.md +419 -0
  569. package/skills/bootstrap/SKILL.md +592 -0
  570. package/skills/bootstrap/STATE.md.template +24 -0
  571. package/skills/bootstrap/_shared-template.md +243 -0
  572. package/skills/bootstrap/deep-template.md +659 -0
  573. package/skills/bootstrap/fast-template.md +251 -0
  574. package/skills/bootstrap/intensity-heuristic.md +80 -0
  575. package/skills/bootstrap/public-fallback.md +342 -0
  576. package/skills/bootstrap/standard-template.md +736 -0
  577. package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
  578. package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
  579. package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
  580. package/skills/brainstorm/SKILL.md +268 -0
  581. package/skills/brainstorm/soul.md +49 -0
  582. package/skills/claude-md-drift-check/SKILL.md +186 -0
  583. package/skills/claude-md-drift-check/checker.mjs +1380 -0
  584. package/skills/claude-md-drift-check/checker.sh +37 -0
  585. package/skills/claude-md-drift-check/package.json +16 -0
  586. package/skills/convergence-monitoring/README.md +39 -0
  587. package/skills/convergence-monitoring/SIGNALS.md +246 -0
  588. package/skills/convergence-monitoring/SKILL.md +285 -0
  589. package/skills/daily/SKILL.md +222 -0
  590. package/skills/daily/generate.sh +92 -0
  591. package/skills/daily/templates/daily.md.tpl +36 -0
  592. package/skills/debug/SKILL.md +188 -0
  593. package/skills/debug/soul.md +35 -0
  594. package/skills/discovery/SKILL.md +567 -0
  595. package/skills/discovery/issue-templates.md +237 -0
  596. package/skills/discovery/probes/docs-staleness.mjs +195 -0
  597. package/skills/discovery/probes/frontend-slop.mjs +186 -0
  598. package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
  599. package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
  600. package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
  601. package/skills/discovery/probes/vault-staleness.mjs +272 -0
  602. package/skills/discovery/probes-arch.md +252 -0
  603. package/skills/discovery/probes-audit.md +95 -0
  604. package/skills/discovery/probes-code.md +329 -0
  605. package/skills/discovery/probes-docs.md +76 -0
  606. package/skills/discovery/probes-feature.md +150 -0
  607. package/skills/discovery/probes-infra.md +138 -0
  608. package/skills/discovery/probes-intro.md +25 -0
  609. package/skills/discovery/probes-session.md +495 -0
  610. package/skills/discovery/probes-supply-chain.md +94 -0
  611. package/skills/discovery/probes-ui.md +147 -0
  612. package/skills/discovery/probes-vault.md +64 -0
  613. package/skills/discovery/slop-patterns.md +115 -0
  614. package/skills/dispatcher/SKILL.md +173 -0
  615. package/skills/docs-orchestrator/SKILL.md +362 -0
  616. package/skills/docs-orchestrator/audience-mapping.md +140 -0
  617. package/skills/domain-model/ADR-FORMAT.md +47 -0
  618. package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
  619. package/skills/domain-model/SKILL.md +85 -0
  620. package/skills/ecosystem-health/SKILL.md +119 -0
  621. package/skills/ecosystem-health/wizard.md +193 -0
  622. package/skills/eval/SKILL.md +293 -0
  623. package/skills/eval/rubric-v1.md +218 -0
  624. package/skills/evolve/SKILL.md +546 -0
  625. package/skills/frontmatter-guard/SKILL.md +126 -0
  626. package/skills/gitlab-ops/SKILL.md +368 -0
  627. package/skills/gitlab-portfolio/SKILL.md +196 -0
  628. package/skills/grill/SKILL.md +185 -0
  629. package/skills/grill/soul.md +55 -0
  630. package/skills/hook-development/SKILL.md +413 -0
  631. package/skills/mcp-builder/SKILL.md +260 -0
  632. package/skills/memory-cleanup/SKILL.md +310 -0
  633. package/skills/mode-selector/SKILL.md +226 -0
  634. package/skills/peekaboo-driver/SKILL.md +237 -0
  635. package/skills/peekaboo-driver/soul.md +32 -0
  636. package/skills/persona-panel/SKILL.md +365 -0
  637. package/skills/persona-panel/persona-format.md +205 -0
  638. package/skills/persona-panel/presets/designer-lens.md +87 -0
  639. package/skills/persona-panel/presets/engineer-lens.md +88 -0
  640. package/skills/persona-panel/presets/pm-lens.md +86 -0
  641. package/skills/plan/SKILL.md +496 -0
  642. package/skills/plan/mode-feature.md +141 -0
  643. package/skills/plan/mode-new.md +297 -0
  644. package/skills/plan/mode-retro.md +271 -0
  645. package/skills/plan/prd-feature-template.md +132 -0
  646. package/skills/plan/prd-full-template.md +151 -0
  647. package/skills/plan/prd-reviewer-prompt.md +103 -0
  648. package/skills/plan/retro-template.md +75 -0
  649. package/skills/plan/soul.md +62 -0
  650. package/skills/playwright-driver/SKILL.md +226 -0
  651. package/skills/playwright-driver/soul.md +30 -0
  652. package/skills/quality-gates/SKILL.md +212 -0
  653. package/skills/reconcile/SKILL.md +324 -0
  654. package/skills/repo-audit/SKILL.md +272 -0
  655. package/skills/session-end/SKILL.md +1044 -0
  656. package/skills/session-end/discovery-scan.md +37 -0
  657. package/skills/session-end/drift-operations.md +97 -0
  658. package/skills/session-end/learning-patterns.md +78 -0
  659. package/skills/session-end/metrics-collection.md +175 -0
  660. package/skills/session-end/phase-3-2-docs-verification.md +148 -0
  661. package/skills/session-end/phase-3-6-tail.md +344 -0
  662. package/skills/session-end/phase-3-7a-recommendations.md +86 -0
  663. package/skills/session-end/plan-verification.md +288 -0
  664. package/skills/session-end/session-metrics-write.md +223 -0
  665. package/skills/session-end/vault-operations.md +50 -0
  666. package/skills/session-end/verification-checklist.md +20 -0
  667. package/skills/session-plan/SKILL.md +554 -0
  668. package/skills/session-plan/wave-template.md +37 -0
  669. package/skills/session-start/SKILL.md +1043 -0
  670. package/skills/session-start/phase-2-5-docs-planning.md +119 -0
  671. package/skills/session-start/phase-4-5-resource-health.md +49 -0
  672. package/skills/session-start/phase-7-1-premise-check.md +47 -0
  673. package/skills/session-start/phase-7-5-mode-selector.md +237 -0
  674. package/skills/session-start/phase-8-5-express-path.md +61 -0
  675. package/skills/session-start/presentation-format.md +81 -0
  676. package/skills/session-start/soul.md +57 -0
  677. package/skills/skill-creator/SKILL.md +168 -0
  678. package/skills/spinout/SKILL.md +76 -0
  679. package/skills/sunset-review/SKILL.md +96 -0
  680. package/skills/test-runner/SKILL.md +362 -0
  681. package/skills/test-runner/rubric-v1.md +388 -0
  682. package/skills/test-runner/soul.md +46 -0
  683. package/skills/tmux-layout/SKILL.md +104 -0
  684. package/skills/ubiquitous-language/SKILL.md +97 -0
  685. package/skills/using-orchestrator/SKILL.md +144 -0
  686. package/skills/vault-mirror/SKILL.md +234 -0
  687. package/skills/vault-sync/SKILL.md +319 -0
  688. package/skills/vault-sync/package-lock.json +40 -0
  689. package/skills/vault-sync/package.json +11 -0
  690. package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
  691. package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
  692. package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
  693. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
  694. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
  695. package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
  696. package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
  697. package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
  698. package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
  699. package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
  700. package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
  701. package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
  702. package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
  703. package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
  704. package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
  705. package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
  706. package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
  707. package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
  708. package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
  709. package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
  710. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
  711. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
  712. package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
  713. package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
  714. package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
  715. package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
  716. package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
  717. package/skills/vault-sync/validator.mjs +658 -0
  718. package/skills/vault-sync/validator.sh +55 -0
  719. package/skills/wave-executor/SKILL.md +496 -0
  720. package/skills/wave-executor/circuit-breaker.md +169 -0
  721. package/skills/wave-executor/wave-loop.md +1043 -0
  722. package/skills/write-executable-plan/SKILL.md +237 -0
  723. package/skills/write-executable-plan/plan-template.md +154 -0
  724. package/templates/_minimal/CLAUDE.md.tmpl +41 -0
  725. package/templates/_minimal/README.md.tmpl +15 -0
  726. package/templates/_minimal/gitignore.tmpl +47 -0
  727. package/templates/_shared/harte-regeln.md +16 -0
  728. package/templates/_shared/loop.md +90 -0
  729. package/templates/_shared/rules/parallel-sessions.md +77 -0
  730. package/templates/nextjs-minimal/README.md +30 -0
  731. package/templates/nextjs-minimal/app/layout.tsx +18 -0
  732. package/templates/nextjs-minimal/app/page.tsx +7 -0
  733. package/templates/nextjs-minimal/eslint.config.mjs +16 -0
  734. package/templates/nextjs-minimal/next.config.mjs +4 -0
  735. package/templates/nextjs-minimal/package.json +27 -0
  736. package/templates/nextjs-minimal/tsconfig.json +23 -0
  737. package/templates/node-minimal/README.md +33 -0
  738. package/templates/node-minimal/eslint.config.mjs +10 -0
  739. package/templates/node-minimal/package.json +21 -0
  740. package/templates/node-minimal/src/index.ts +1 -0
  741. package/templates/node-minimal/tests/sanity.test.ts +5 -0
  742. package/templates/node-minimal/tsconfig.json +17 -0
  743. package/templates/personas/README.md +150 -0
  744. package/templates/personas/accounting-compliance.v1.md +120 -0
  745. package/templates/personas/accounting-tax-advisor.v1.md +116 -0
  746. package/templates/personas/buyer-p1-cto.v1.md +125 -0
  747. package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
  748. package/templates/personas/buyer-p3-build.v1.md +130 -0
  749. package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
  750. package/templates/personas/buyer-p5-solo.v1.md +132 -0
  751. package/templates/personas/buyer-p6-ld.v1.md +130 -0
  752. package/templates/personas/klima-ai-expert.v1.md +114 -0
  753. package/templates/personas/klima-physicist.v1.md +117 -0
  754. package/templates/python-uv/README.md +28 -0
  755. package/templates/python-uv/pyproject.toml +32 -0
  756. package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
  757. package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
  758. package/templates/python-uv/tests/test_sanity.py +2 -0
  759. package/templates/static-html/README.md +19 -0
  760. package/templates/static-html/index.html +15 -0
  761. package/templates/static-html/script.js +1 -0
  762. package/templates/static-html/styles.css +26 -0
@@ -0,0 +1,474 @@
1
+ /**
2
+ * config.mjs — Session Config reader for CLAUDE.md / AGENTS.md.
3
+ *
4
+ * Thin orchestrator. All parsing logic lives in scripts/lib/config/:
5
+ * coercers.mjs — value coercion helpers (_coerceString, _coerceInteger, …)
6
+ * section-extractor.mjs — _extractConfigSection + _parseKV
7
+ * vault-sync.mjs — _parseVaultSync
8
+ * drift-check.mjs — _parseDriftCheck
9
+ * docs-orchestrator.mjs — _parseDocsOrchestrator
10
+ * vault-staleness.mjs — _parseVaultStaleness
11
+ * events-rotation.mjs — _parseEventsRotation
12
+ * vault-integration.mjs — _parseVaultIntegration + _parseResourceThresholds
13
+ *
14
+ * Originally ported from parse-config.sh (v2) plus its helper libs
15
+ * config-yaml-parser.sh and config-json-coercion.sh. Windows + CRLF safe.
16
+ *
17
+ * Part of v3.0.0 migration (Epic #124, issue #132).
18
+ * Split into per-section parsers: issue #284.
19
+ */
20
+
21
+ // Per-section parsers and coercers
22
+ import {
23
+ _getVal,
24
+ _coerceString,
25
+ _coerceInteger,
26
+ _coerceFloat,
27
+ _coerceBoolean,
28
+ _coerceList,
29
+ _coerceEnum,
30
+ _coerceObject,
31
+ _coerceBoolObject,
32
+ _coerceMaxTurns,
33
+ } from './config/coercers.mjs';
34
+
35
+ import { _extractConfigSection, _parseKV } from './config/section-extractor.mjs';
36
+ import { _parseVaultSync } from './config/vault-sync.mjs';
37
+ import { _parseDriftCheck } from './config/drift-check.mjs';
38
+ import { _parseDocsOrchestrator } from './config/docs-orchestrator.mjs';
39
+ import { _parseVaultStaleness } from './config/vault-staleness.mjs';
40
+ import { _parseDocsStaleness } from './config/docs-staleness.mjs';
41
+ import { _parseEventsRotation } from './config/events-rotation.mjs';
42
+ import { _parseVaultIntegration, _parseResourceThresholds } from './config/vault-integration.mjs';
43
+ import { _parseTest } from './config/test.mjs';
44
+ import { _parseGitlabPortfolio } from './config/gitlab-portfolio.mjs';
45
+ import { _parseWaveReviewers } from './config/wave-reviewers.mjs';
46
+ import { _parseCrossRepo } from './config/cross-repo.mjs';
47
+ import { _parsePersonaGateWave } from './config/persona-gate-wave.mjs';
48
+ import { _parseVaultMirrorQuality } from './config/vault-mirror-quality.mjs';
49
+ import { _parseColdStart } from './config/cold-start.mjs';
50
+ import { _parseAutoDream } from './config/auto-dream.mjs';
51
+ import { _parseStateMdLock } from './config/state-md-lock.mjs';
52
+ import { _parseHandoverGate } from './config/handover-gate.mjs';
53
+ import { _parseBrokenWindow } from './config/broken-window.mjs';
54
+ import { _parseSlopcheck } from './config/slopcheck.mjs';
55
+ import { _parseDiscoveryValidator } from './config/discovery-validator.mjs';
56
+ import { _parseTemplatesFirst } from './config/templates-first.mjs';
57
+ import { _parseVerificationAutoFix } from './config/verification-auto-fix.mjs';
58
+ import { _parseDialectic } from './config/dialectic.mjs';
59
+ import { _parseEval } from './config/eval.mjs';
60
+ import { _parseMemory } from './config/memory.mjs';
61
+ import { _parseReconcile } from './config/reconcile.mjs';
62
+ import { _parseCustomPhases } from './config/custom-phases.mjs';
63
+ import { _parseEvolve, _parseEvolveDecay } from './config/evolve.mjs';
64
+ import { _parseSkillEvolution } from './config/skill-evolution.mjs';
65
+ import { _parseDispatcherAutonomy, resolveDispatcherAutonomy } from './config/dispatcher-autonomy.mjs';
66
+ import { loadHostPaths, resolveHostPath } from './config/host-paths.mjs';
67
+ import { resolveNamedBaseline } from './named-baseline-resolver.mjs';
68
+
69
+ // Re-export the two functions that external callers import directly from this module.
70
+ export { _coerceEnum, _coerceCollisionRisk } from './config/coercers.mjs';
71
+
72
+ // readConfigFile lives in the dependency-free leaf config/io.mjs so that
73
+ // config/cross-repo.mjs (and other parsers) can import it without forming a
74
+ // cycle back through config.mjs (issue #664). Re-exported here unchanged for
75
+ // back-compat — every existing `import { readConfigFile } from '.../config.mjs'`
76
+ // caller keeps working.
77
+ //
78
+ // ORCHESTRATOR-LEVEL CALLERS ONLY — config sub-parsers MUST import from
79
+ // ./config/io.mjs directly to avoid re-forming the import cycle that #664
80
+ // broke. Any *.mjs under scripts/lib/config/ that imports from '../config.mjs'
81
+ // is a cycle regression (see tests/lib/config/cycle-guard.test.mjs).
82
+ export { readConfigFile } from './config/io.mjs';
83
+
84
+ // ---------------------------------------------------------------------------
85
+ // Public API
86
+ // ---------------------------------------------------------------------------
87
+
88
+ /**
89
+ * Parse ## Session Config block from markdown content.
90
+ * Applies all defaults for missing keys.
91
+ * @param {string} mdContent — full CLAUDE.md content
92
+ * @param {{ hostPaths?: { env?: Record<string, string|undefined>, ownerConfig?: object, cwd?: string } }} [opts]
93
+ * — `hostPaths` injects the host-local resolution context (issue #653). Tests MUST pass a
94
+ * hermetic ctx (e.g. `{ env: {}, ownerConfig: undefined }`) when asserting COMMITTED values:
95
+ * the default reads the real `owner.yaml`, so a host-local `paths:` override would otherwise
96
+ * bleed into fixture assertions (incident: 2026-07-03 Full-Gate red after the operator set
97
+ * `paths.baseline-path` host-locally). `cwd` feeds the `baselines:` match tier (#819) — a
98
+ * test-only DI seam; production always resolves it from `process.cwd()`.
99
+ * @returns {object} config object with EXACT same shape as parse-config.sh stdout
100
+ * @throws if any enum value is invalid
101
+ */
102
+ export function parseSessionConfig(mdContent, { hostPaths } = {}) {
103
+ const sectionLines = _extractConfigSection(mdContent);
104
+ const kv = _parseKV(sectionLines);
105
+
106
+ // Host-local path resolution context (issue #653): env-var > owner.yaml paths[key] >
107
+ // committed default. Loaded once so vault-dir + baseline-path resolve without
108
+ // re-reading disk. Applied AFTER sub-parsers run (see vault-integration/vault-sync
109
+ // overrides below) to keep the parsers pure for claude-md-drift-check's raw-value parity.
110
+ const hostCtx = hostPaths ?? loadHostPaths();
111
+
112
+ // String fields
113
+ const vcs = _coerceString(kv, 'vcs', undefined);
114
+ const gitlabHost = _coerceString(kv, 'gitlab-host', undefined);
115
+ const mirror = _coerceString(kv, 'mirror', undefined);
116
+ const special = _coerceString(kv, 'special', undefined);
117
+ const pencil = _coerceString(kv, 'pencil', undefined);
118
+ const testCommand = _coerceString(kv, 'test-command', 'npm test');
119
+ const typecheckCommand = _coerceString(kv, 'typecheck-command', 'npm run typecheck');
120
+ const lintCommand = _coerceString(kv, 'lint-command', 'npm run lint');
121
+ const baselineRef = _coerceString(kv, 'baseline-ref', undefined);
122
+ const baselineProjectId = _coerceString(kv, 'baseline-project-id', undefined);
123
+ // plan-baseline-path precedence (#819, extending #653):
124
+ // 1. SO_BASELINE_PATH env (highest — resolveNamedBaseline yields to it, so
125
+ // resolveHostPath's env tier below returns it)
126
+ // 2. baselines: match against cwd (per-context — the new tier)
127
+ // 3. owner.yaml paths.baseline-path (legacy — resolveHostPath)
128
+ // 4. committed Session Config value (fallback — resolveHostPath)
129
+ // Hosts WITHOUT a `baselines:` array behave byte-identically to pre-#819: the
130
+ // resolver returns the null-fallback and resolution falls straight through to
131
+ // resolveHostPath's env > owner.yaml > committed chain. `hostCtx.cwd` is only
132
+ // ever set by tests; production reads process.cwd().
133
+ const planBaselinePath = (() => {
134
+ const baselineMatch = resolveNamedBaseline({
135
+ cwd: hostCtx.cwd ?? process.cwd(),
136
+ ownerConfig: hostCtx.ownerConfig,
137
+ env: hostCtx.env,
138
+ });
139
+ if (
140
+ baselineMatch.source === 'match' &&
141
+ typeof baselineMatch.path === 'string' &&
142
+ baselineMatch.path.trim() !== ''
143
+ ) {
144
+ return baselineMatch.path;
145
+ }
146
+ return resolveHostPath(
147
+ 'baseline-path',
148
+ _coerceString(kv, 'plan-baseline-path', undefined),
149
+ hostCtx,
150
+ );
151
+ })();
152
+ const planDefaultVisibility = _coerceString(kv, 'plan-default-visibility', 'internal');
153
+ const planPrdLocation = _coerceString(kv, 'plan-prd-location', 'docs/prd/');
154
+ const planRetroLocation = _coerceString(kv, 'plan-retro-location', 'docs/retro/');
155
+
156
+ // Integer fields
157
+ const agentsPerWave = _coerceInteger(kv, 'agents-per-wave', 6);
158
+ const waves = _coerceInteger(kv, 'waves', 5);
159
+ const recentCommits = _coerceInteger(kv, 'recent-commits', 20);
160
+ const issueLimit = _coerceInteger(kv, 'issue-limit', 50);
161
+ const staleBranchDays = _coerceInteger(kv, 'stale-branch-days', 7);
162
+ const staleIssueDays = _coerceInteger(kv, 'stale-issue-days', 30);
163
+ const ssotFreshnessDays = _coerceInteger(kv, 'ssot-freshness-days', 5);
164
+ const pluginFreshnessDays = _coerceInteger(kv, 'plugin-freshness-days', 30);
165
+ const memoryCleanupThreshold = _coerceInteger(kv, 'memory-cleanup-threshold', 5);
166
+ const memoryCleanupSoftLimit = _coerceInteger(kv, 'memory-cleanup-soft-limit', 180);
167
+ const learningExpiryDays = _coerceInteger(kv, 'learning-expiry-days', 30);
168
+ const learningsSurfaceTopN = _coerceInteger(kv, 'learnings-surface-top-n', 15);
169
+ const groundingInjectionMaxFiles = _coerceInteger(kv, 'grounding-injection-max-files', 3);
170
+ const discoveryConfidenceThreshold = _coerceInteger(kv, 'discovery-confidence-threshold', 60);
171
+ // discovery-parallelism: bounded 1..16, silent fallback to default 5 (matches events-rotation pattern)
172
+ const discoveryParallelism = (() => {
173
+ const raw = _getVal(kv, 'discovery-parallelism', '5');
174
+ if (!/^\d+$/.test(raw)) return 5;
175
+ const n = parseInt(raw, 10);
176
+ if (n < 1 || n > 16) return 5;
177
+ return n;
178
+ })();
179
+
180
+ // Float fields
181
+ const learningDecayRate = _coerceFloat(kv, 'learning-decay-rate', 0.05, 0.0, 1.0);
182
+
183
+ // Boolean fields
184
+ const persistence = _coerceBoolean(kv, 'persistence', true);
185
+ const ecosystemHealth = _coerceBoolean(kv, 'ecosystem-health', false);
186
+ const discoveryOnClose = _coerceBoolean(kv, 'discovery-on-close', false);
187
+ const reasoningOutput = _coerceBoolean(kv, 'reasoning-output', false);
188
+ const groundingCheck = _coerceBoolean(kv, 'grounding-check', true);
189
+ const allowDestructiveOps = _coerceBoolean(kv, 'allow-destructive-ops', false);
190
+ const resourceAwareness = _coerceBoolean(kv, 'resource-awareness', true);
191
+ const enableHostBanner = _coerceBoolean(kv, 'enable-host-banner', true);
192
+
193
+ // List fields
194
+ const crossRepos = _coerceList(kv, 'cross-repos', undefined);
195
+ const ssotFiles = _coerceList(kv, 'ssot-files', undefined);
196
+ const discoveryProbes = _coerceList(kv, 'discovery-probes', '[all]');
197
+ const discoveryExcludePaths = _coerceList(kv, 'discovery-exclude-paths', '[]');
198
+ const healthEndpoints = _coerceList(kv, 'health-endpoints', undefined);
199
+ const worktreeExclude = _coerceList(
200
+ kv,
201
+ 'worktree-exclude',
202
+ '[node_modules, dist, build, .next, .nuxt, coverage, .cache, .turbo, .vercel, out]'
203
+ );
204
+
205
+ // Enum fields
206
+ const enforcement = _coerceEnum(kv, 'enforcement', 'warn', ['strict', 'warn', 'off']);
207
+ const isolation = _coerceEnum(kv, 'isolation', 'auto', ['worktree', 'none', 'auto']);
208
+ const discoverySeverityThreshold = _coerceEnum(kv, 'discovery-severity-threshold', 'low', ['critical', 'high', 'medium', 'low']);
209
+
210
+ // Object fields
211
+ const agentMapping = _coerceObject(kv, 'agent-mapping');
212
+ if (agentMapping !== null) {
213
+ // Validate role keys against canonical list from skills/_shared/config-reading.md
214
+ const ALLOWED_ROLES = ['impl', 'test', 'db', 'ui', 'security', 'compliance', 'docs', 'perf'];
215
+ const invalidKeys = [];
216
+ for (const [k, v] of Object.entries(agentMapping)) {
217
+ if (!ALLOWED_ROLES.includes(k)) {
218
+ invalidKeys.push(k);
219
+ continue;
220
+ }
221
+ if (typeof v !== 'string' || v === '') {
222
+ throw new Error(
223
+ `config.mjs: agent-mapping role '${k}' has invalid value '${v}' (expected non-empty string)`
224
+ );
225
+ }
226
+ }
227
+ if (invalidKeys.length > 0) {
228
+ throw new Error(
229
+ `config.mjs: agent-mapping contains invalid role key(s): ${invalidKeys.join(', ')} ` +
230
+ `(allowed: ${ALLOWED_ROLES.join(', ')})`
231
+ );
232
+ }
233
+ }
234
+ const enforcementGates = _coerceBoolObject(kv, 'enforcement-gates');
235
+
236
+ // Special field
237
+ const maxTurns = _coerceMaxTurns(kv);
238
+
239
+ // vault-integration: parsed from full content (block-scoped, avoids the
240
+ // pre-#593 KV-name collision where `enabled:` was shared with 15+ other
241
+ // blocks like docs-orchestrator/vault-staleness/slopcheck).
242
+ const vaultIntegration = _parseVaultIntegration(mdContent);
243
+ // Host-local override (issue #653) — applied here, NOT inside _parseVaultIntegration,
244
+ // so claude-md-drift-check (which calls the parser directly) keeps seeing raw values.
245
+ vaultIntegration['vault-dir'] = resolveHostPath('vault-dir', vaultIntegration['vault-dir'], hostCtx);
246
+
247
+ // resource-thresholds sub-keys (v3.1.0 env-aware — issue #166)
248
+ const resourceThresholds = _parseResourceThresholds(kv);
249
+
250
+ // vault-sync: parsed from full content (can live outside Session Config)
251
+ const vaultSync = _parseVaultSync(mdContent);
252
+ // Host-local override (issue #653) — same host source as vault-integration above.
253
+ vaultSync['vault-dir'] = resolveHostPath('vault-dir', vaultSync['vault-dir'], hostCtx);
254
+
255
+ // drift-check: parsed from full content (standalone top-level block)
256
+ const driftCheck = _parseDriftCheck(mdContent);
257
+
258
+ // docs-orchestrator: parsed from full content (standalone top-level block)
259
+ const docsOrchestrator = _parseDocsOrchestrator(mdContent);
260
+
261
+ // vault-staleness: parsed from full content (standalone top-level block)
262
+ const vaultStaleness = _parseVaultStaleness(mdContent);
263
+ // docs-staleness: parsed from full content (standalone top-level block, #781)
264
+ const docsStaleness = _parseDocsStaleness(mdContent);
265
+
266
+ // events-rotation: parsed from full content (standalone top-level block)
267
+ const eventsRotation = _parseEventsRotation(mdContent);
268
+
269
+ // vault-mirror.quality: parsed from full content (PRD F1.2 / issue #504)
270
+ const vaultMirror = _parseVaultMirrorQuality(mdContent);
271
+
272
+ // cold-start: parsed from full content (PRD F1.3 / issue #500)
273
+ const coldStart = _parseColdStart(mdContent);
274
+
275
+ // auto-dream: parsed from full content (issue #566). The `min-confidence`
276
+ // field is consumed by `collectProposals()` at session-end Phase 3.6.3 as a
277
+ // SECOND confidence gate above `memory.proposals.confidence-floor`.
278
+ const autoDream = _parseAutoDream(mdContent);
279
+
280
+ // state-md-lock: parsed from full content (PRD gsd Pattern 1 / issues #517, #518)
281
+ const stateMdLock = _parseStateMdLock(mdContent);
282
+
283
+ // handover-gate: parsed from full content (PRD 2026-07-07 /close
284
+ // Handover-Alignment-Gate — Epic #724)
285
+ const handoverGate = _parseHandoverGate(mdContent);
286
+
287
+ // broken-window-budget: parsed from full content (#730/H5 — session-end Phase 2.6)
288
+ const brokenWindow = _parseBrokenWindow(mdContent);
289
+
290
+ // slopcheck: parsed from full content (PRD gsd Pattern 2 / issues #517, #520)
291
+ const slopcheck = _parseSlopcheck(mdContent);
292
+
293
+ // skill-evolution: opt-in skill self-evolution autonomy block (OpenSpace C1 / issue #646)
294
+ const skillEvolution = _parseSkillEvolution(mdContent);
295
+
296
+ // dispatcher-autonomy: opt-in cross-repo dispatcher autonomy block (Epic #673 / issue #679).
297
+ // Parser stays pure (raw committed value) for claude-md-drift-check raw-value parity;
298
+ // the host-local override (env > owner.yaml > committed > off) is overlaid onto the
299
+ // FINAL object only — mirroring the vault-dir resolveHostPath pattern above. Reuses the
300
+ // already-loaded hostCtx.ownerConfig so owner.yaml is not read twice.
301
+ const dispatcherAutonomy = _parseDispatcherAutonomy(mdContent);
302
+ dispatcherAutonomy.autonomy = resolveDispatcherAutonomy({
303
+ committed: dispatcherAutonomy.autonomy,
304
+ ownerConfig: hostCtx.ownerConfig,
305
+ });
306
+
307
+ // discovery-validator: parsed from full content (PSA-006 enforcement / issue #567)
308
+ const discoveryValidator = _parseDiscoveryValidator(mdContent);
309
+
310
+ // templates-first: parsed from full content (PRD gsd Pattern 3 / issues #517, #519)
311
+ const templatesFirst = _parseTemplatesFirst(mdContent);
312
+
313
+ // verification-auto-fix: parsed from full content (PRD gsd Pattern 4 / issues #517, #521)
314
+ const verificationAutoFix = _parseVerificationAutoFix(mdContent);
315
+
316
+ // dialectic: parsed from full content (issue #506)
317
+ const dialectic = _parseDialectic(mdContent);
318
+
319
+ // eval: parsed from full content (Standard v1 eval harness, #809 / Epic #803)
320
+ const evalConfig = _parseEval(mdContent);
321
+
322
+ // memory: parsed from full content (issue #505 — banner opt-out)
323
+ const memory = _parseMemory(mdContent);
324
+
325
+ // reconcile: parsed from full content (FA4 #697 — config foundation for
326
+ // FA3 #696 advisory rule-proposal delivery at session-end Phase 3.6.8).
327
+ const reconcile = _parseReconcile(mdContent);
328
+
329
+ // test: parsed from full content (standalone top-level block, /test epic #378)
330
+ const testConfig = _parseTest(mdContent);
331
+
332
+ // gitlab-portfolio: parsed from full content (standalone top-level block, GH #41)
333
+ const gitlabPortfolio = _parseGitlabPortfolio(mdContent);
334
+
335
+ // cross-repo.projects: delegated per-section parser (#478, MED-1)
336
+ const crossRepoProjects = _parseCrossRepo(mdContent);
337
+
338
+ // wave-reviewers: parsed from full content; dual-key shim (persona-reviewers → wave-reviewers, #461)
339
+ const waveReviewers = _parseWaveReviewers(mdContent);
340
+ if (waveReviewers.deprecated) {
341
+ process.stderr.write(
342
+ "Session Config: 'persona-reviewers' is deprecated — rename to 'wave-reviewers'. " +
343
+ 'Will be removed in v4.0.\n'
344
+ );
345
+ }
346
+
347
+ // custom-phases: opt-in repo-declared deterministic phases run at session close /
348
+ // housekeeping with exit-code gating + summary reporting (#637). Defaults to [].
349
+ const customPhases = _parseCustomPhases(mdContent);
350
+
351
+ // evolve.extra-sources: opt-in EXTRA learning sources for /evolve — sidecar JSON
352
+ // files produced out-of-band by a domain measurement (e.g. an eval-learn regression
353
+ // report). /evolve READS them and emits domain-regression candidates; it never runs
354
+ // the measurement (read-only contract). Returned as 'evolve.extra-sources' (dotted,
355
+ // mirroring the cross-repo.projects precedent). Defaults to []. (#638)
356
+ const evolveExtraSources = _parseEvolve(mdContent);
357
+
358
+ // evolve.decay: memory time-decay tuning nested UNDER the `evolve:` block (#670).
359
+ // Adds a recency factor to learning surfacing — stale high-confidence learnings
360
+ // decay (multiplicative half-life blend, with a catastrophic-loss floor) so they
361
+ // no longer crowd out fresh signal. Conservative defaults (90-day half-life, 0.1
362
+ // floor, enabled) make the change degrade gently. Consumed by surfaceTopN's
363
+ // `opts.decay`. Nested (not a new top-level key) so claude-md-drift-check Check 6
364
+ // parity is unaffected. Returned as 'evolve.decay' (dotted, mirroring
365
+ // 'evolve.extra-sources').
366
+ const evolveDecay = _parseEvolveDecay(mdContent);
367
+
368
+ // persona-gate-wave: opt-in mid-wave persona-panel hook (#458). Returns null when absent.
369
+ const personaGateWave = _parsePersonaGateWave(mdContent);
370
+ if (personaGateWave !== null && personaGateWave.enabled === true && personaGateWave.mode === 'off') {
371
+ process.stderr.write(
372
+ "Session Config: 'persona-gate-wave' has enabled=true but mode=off — the hook will not fire. " +
373
+ "Set mode to 'warn' or 'strict', or set enabled=false to silence this warning.\n"
374
+ );
375
+ }
376
+
377
+ return {
378
+ 'agents-per-wave': agentsPerWave,
379
+ 'waves': waves,
380
+ 'recent-commits': recentCommits,
381
+ 'special': special,
382
+ 'vcs': vcs,
383
+ 'gitlab-host': gitlabHost,
384
+ 'mirror': mirror,
385
+ 'cross-repos': crossRepos,
386
+ 'cross-repo.projects': crossRepoProjects,
387
+ 'pencil': pencil,
388
+ 'ecosystem-health': ecosystemHealth,
389
+ 'health-endpoints': healthEndpoints,
390
+ 'issue-limit': issueLimit,
391
+ 'stale-branch-days': staleBranchDays,
392
+ 'stale-issue-days': staleIssueDays,
393
+ 'test-command': testCommand,
394
+ 'typecheck-command': typecheckCommand,
395
+ 'lint-command': lintCommand,
396
+ 'ssot-files': ssotFiles,
397
+ 'ssot-freshness-days': ssotFreshnessDays,
398
+ 'plugin-freshness-days': pluginFreshnessDays,
399
+ 'discovery-on-close': discoveryOnClose,
400
+ 'discovery-probes': discoveryProbes,
401
+ 'discovery-exclude-paths': discoveryExcludePaths,
402
+ 'discovery-severity-threshold': discoverySeverityThreshold,
403
+ 'discovery-confidence-threshold': discoveryConfidenceThreshold,
404
+ 'discovery-parallelism': discoveryParallelism,
405
+ 'persistence': persistence,
406
+ 'memory-cleanup-threshold': memoryCleanupThreshold,
407
+ 'memory-cleanup-soft-limit': memoryCleanupSoftLimit,
408
+ 'learning-expiry-days': learningExpiryDays,
409
+ 'learnings-surface-top-n': learningsSurfaceTopN,
410
+ 'learning-decay-rate': learningDecayRate,
411
+ 'enforcement': enforcement,
412
+ 'isolation': isolation,
413
+ 'max-turns': maxTurns,
414
+ 'baseline-ref': baselineRef,
415
+ 'baseline-project-id': baselineProjectId,
416
+ 'plan-baseline-path': planBaselinePath,
417
+ 'plan-default-visibility': planDefaultVisibility,
418
+ 'plan-prd-location': planPrdLocation,
419
+ 'plan-retro-location': planRetroLocation,
420
+ 'agent-mapping': agentMapping,
421
+ 'enforcement-gates': enforcementGates,
422
+ 'reasoning-output': reasoningOutput,
423
+ 'grounding-injection-max-files': groundingInjectionMaxFiles,
424
+ 'grounding-check': groundingCheck,
425
+ 'allow-destructive-ops': allowDestructiveOps,
426
+ 'resource-awareness': resourceAwareness,
427
+ 'enable-host-banner': enableHostBanner,
428
+ 'resource-thresholds': resourceThresholds,
429
+ 'worktree-exclude': worktreeExclude,
430
+ 'vault-integration': vaultIntegration,
431
+ 'vault-mirror': vaultMirror,
432
+ 'cold-start': coldStart,
433
+ 'auto-dream': autoDream,
434
+ 'state-md-lock': stateMdLock,
435
+ 'handover-gate': handoverGate,
436
+ 'broken-window-budget': brokenWindow,
437
+ 'slopcheck': slopcheck,
438
+ 'skill-evolution': skillEvolution,
439
+ 'dispatcher-autonomy': dispatcherAutonomy,
440
+ 'discovery-validator': discoveryValidator,
441
+ 'templates-first': templatesFirst,
442
+ 'verification-auto-fix': verificationAutoFix,
443
+ 'dialectic': dialectic,
444
+ 'eval': evalConfig,
445
+ 'memory': memory,
446
+ 'reconcile': reconcile,
447
+ 'vault-sync': vaultSync,
448
+ 'drift-check': driftCheck,
449
+ 'docs-orchestrator': docsOrchestrator,
450
+ 'vault-staleness': vaultStaleness,
451
+ 'docs-staleness': docsStaleness,
452
+ 'events-rotation': eventsRotation,
453
+ 'test': testConfig,
454
+ 'gitlab-portfolio': gitlabPortfolio,
455
+ 'wave-reviewers': waveReviewers,
456
+ 'persona-gate-wave': personaGateWave,
457
+ 'custom-phases': customPhases,
458
+ 'evolve.extra-sources': evolveExtraSources,
459
+ 'evolve.decay': evolveDecay,
460
+ };
461
+ }
462
+
463
+ /**
464
+ * Lookup a config value, falling back to default.
465
+ * @param {object} config — result of parseSessionConfig
466
+ * @param {string} key — key name (e.g., "agents-per-wave")
467
+ * @param {*} defaultValue — fallback if key missing or null
468
+ * @returns {*} the config value or defaultValue
469
+ */
470
+ export function getConfigValue(config, key, defaultValue = null) {
471
+ const val = config[key];
472
+ if (val === undefined || val === null) return defaultValue;
473
+ return val;
474
+ }