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,259 @@
1
+ /**
2
+ * owner-config/validate.mjs — Pure schema validator for the owner persona config.
3
+ * Never throws — returns {ok, value, errors}. Unknown top-level sections dropped.
4
+ */
5
+
6
+ import {
7
+ CURRENT_OWNER_SCHEMA_VERSION,
8
+ VALID_TONE_STYLES,
9
+ VALID_OUTPUT_LEVELS,
10
+ VALID_PREAMBLE_LEVELS,
11
+ VALID_COMMENTS_LEVELS,
12
+ } from './constants.mjs';
13
+
14
+ // Internal constants
15
+ const NAME_MAX = 100;
16
+ const TONALITY_MAX = 200;
17
+ const TEST_COMMAND_MAX = 200;
18
+ const EDITOR_MAX = 50;
19
+ const HEX64_RE = /^[a-f0-9]{64}$/i;
20
+ const ISO_639_1_RE = /^[a-z]{2}(-[A-Z]{2})?$/;
21
+
22
+ // Private helpers
23
+ const isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
24
+ const isNonEmptyString = (v, max) => typeof v === 'string' && v.length > 0 && (max === undefined || v.length <= max);
25
+
26
+ // Section validators (module-private)
27
+ function _validateSchemaVersionSection(raw, errors) {
28
+ const schemaVersion = raw['schema-version'];
29
+ if (schemaVersion === undefined || schemaVersion === null) {
30
+ errors.push('schema-version is required');
31
+ } else if (schemaVersion !== CURRENT_OWNER_SCHEMA_VERSION) {
32
+ errors.push(
33
+ `schema-version must be ${CURRENT_OWNER_SCHEMA_VERSION}, got: ${JSON.stringify(schemaVersion)}`
34
+ );
35
+ }
36
+ }
37
+
38
+ function _validateOwnerSection(raw, errors, ownerOut) {
39
+ const owner = raw.owner;
40
+ if (!isPlainObject(owner)) {
41
+ errors.push('owner must be an object');
42
+ return;
43
+ }
44
+ if (!isNonEmptyString(owner.name, NAME_MAX)) {
45
+ errors.push(`owner.name must be a non-empty string (max ${NAME_MAX} chars)`);
46
+ } else {
47
+ ownerOut.name = owner.name;
48
+ }
49
+ if (owner['email-hash'] !== undefined && owner['email-hash'] !== null) {
50
+ if (typeof owner['email-hash'] !== 'string' || !HEX64_RE.test(owner['email-hash'])) {
51
+ errors.push('owner.email-hash must be a 64-char hex string (sha256) or null');
52
+ } else {
53
+ ownerOut['email-hash'] = owner['email-hash'].toLowerCase();
54
+ }
55
+ }
56
+ if (!isNonEmptyString(owner.language, 10) || !ISO_639_1_RE.test(owner.language)) {
57
+ errors.push('owner.language must be an ISO-639-1 code (e.g. "de", "en", "en-US")');
58
+ } else {
59
+ ownerOut.language = owner.language;
60
+ }
61
+ }
62
+
63
+ function _validateToneSection(raw, errors, toneOut) {
64
+ if (raw.tone === undefined) return;
65
+ if (!isPlainObject(raw.tone)) {
66
+ errors.push('tone must be an object');
67
+ return;
68
+ }
69
+ if (raw.tone.style !== undefined) {
70
+ if (!VALID_TONE_STYLES.includes(raw.tone.style)) {
71
+ errors.push(`tone.style must be one of ${VALID_TONE_STYLES.join('|')}, got: ${raw.tone.style}`);
72
+ } else {
73
+ toneOut.style = raw.tone.style;
74
+ }
75
+ }
76
+ if (raw.tone.tonality !== undefined && raw.tone.tonality !== null) {
77
+ if (typeof raw.tone.tonality !== 'string' || raw.tone.tonality.length > TONALITY_MAX) {
78
+ errors.push(`tone.tonality must be a string (max ${TONALITY_MAX} chars) or null`);
79
+ } else {
80
+ toneOut.tonality = raw.tone.tonality;
81
+ }
82
+ }
83
+ }
84
+
85
+ function _validateEfficiencySection(raw, errors, efficiencyOut) {
86
+ if (raw.efficiency === undefined) return;
87
+ if (!isPlainObject(raw.efficiency)) {
88
+ errors.push('efficiency must be an object');
89
+ return;
90
+ }
91
+ if (raw.efficiency['output-level'] !== undefined) {
92
+ if (!VALID_OUTPUT_LEVELS.includes(raw.efficiency['output-level'])) {
93
+ errors.push(
94
+ `efficiency.output-level must be one of ${VALID_OUTPUT_LEVELS.join('|')}, got: ${raw.efficiency['output-level']}`
95
+ );
96
+ } else {
97
+ efficiencyOut['output-level'] = raw.efficiency['output-level'];
98
+ }
99
+ }
100
+ if (raw.efficiency.preamble !== undefined) {
101
+ if (!VALID_PREAMBLE_LEVELS.includes(raw.efficiency.preamble)) {
102
+ errors.push(
103
+ `efficiency.preamble must be one of ${VALID_PREAMBLE_LEVELS.join('|')}, got: ${raw.efficiency.preamble}`
104
+ );
105
+ } else {
106
+ efficiencyOut.preamble = raw.efficiency.preamble;
107
+ }
108
+ }
109
+ if (raw.efficiency['comments-in-code'] !== undefined) {
110
+ if (!VALID_COMMENTS_LEVELS.includes(raw.efficiency['comments-in-code'])) {
111
+ errors.push(
112
+ `efficiency.comments-in-code must be one of ${VALID_COMMENTS_LEVELS.join('|')}, got: ${raw.efficiency['comments-in-code']}`
113
+ );
114
+ } else {
115
+ efficiencyOut['comments-in-code'] = raw.efficiency['comments-in-code'];
116
+ }
117
+ }
118
+ }
119
+
120
+ function _validateHardwareSharingSection(raw, errors, hwOut) {
121
+ if (raw['hardware-sharing'] === undefined) return;
122
+ const hw = raw['hardware-sharing'];
123
+ if (!isPlainObject(hw)) {
124
+ errors.push('hardware-sharing must be an object');
125
+ return;
126
+ }
127
+ if (hw.enabled !== undefined) {
128
+ if (typeof hw.enabled !== 'boolean') {
129
+ errors.push(`hardware-sharing.enabled must be boolean, got: ${typeof hw.enabled}`);
130
+ } else {
131
+ hwOut.enabled = hw.enabled;
132
+ }
133
+ }
134
+ if (hw['hash-salt'] !== undefined && hw['hash-salt'] !== null) {
135
+ if (typeof hw['hash-salt'] !== 'string' || !HEX64_RE.test(hw['hash-salt'])) {
136
+ errors.push('hardware-sharing.hash-salt must be a 64-char hex string (32 bytes) or null');
137
+ } else {
138
+ hwOut['hash-salt'] = hw['hash-salt'].toLowerCase();
139
+ }
140
+ }
141
+ // Privacy contract: enabled=true requires hash-salt to be set.
142
+ if (hwOut.enabled && hwOut['hash-salt'] === null) {
143
+ errors.push('hardware-sharing.enabled=true requires hash-salt to be set (D4 consent contract)');
144
+ }
145
+ }
146
+
147
+ function _validateDefaultsSection(raw, errors, defaultsOut) {
148
+ if (raw.defaults === undefined) return;
149
+ if (!isPlainObject(raw.defaults)) {
150
+ errors.push('defaults must be an object');
151
+ return;
152
+ }
153
+ const ptc = raw.defaults['preferred-test-command'];
154
+ if (ptc !== undefined && ptc !== null) {
155
+ if (typeof ptc !== 'string' || ptc.length > TEST_COMMAND_MAX) {
156
+ errors.push(`defaults.preferred-test-command must be a string (max ${TEST_COMMAND_MAX} chars) or null`);
157
+ } else {
158
+ defaultsOut['preferred-test-command'] = ptc;
159
+ }
160
+ }
161
+ const pe = raw.defaults['preferred-editor'];
162
+ if (pe !== undefined && pe !== null) {
163
+ if (typeof pe !== 'string' || pe.length > EDITOR_MAX) {
164
+ errors.push(`defaults.preferred-editor must be a string (max ${EDITOR_MAX} chars) or null`);
165
+ } else {
166
+ defaultsOut['preferred-editor'] = pe;
167
+ }
168
+ }
169
+ }
170
+
171
+ function _validateMetadataSection(raw, errors, metadataOut) {
172
+ if (raw.metadata === undefined) return;
173
+ if (!isPlainObject(raw.metadata)) {
174
+ errors.push('metadata must be an object');
175
+ return;
176
+ }
177
+ if (raw.metadata.created_at !== undefined && raw.metadata.created_at !== null) {
178
+ if (typeof raw.metadata.created_at !== 'string' || Number.isNaN(Date.parse(raw.metadata.created_at))) {
179
+ errors.push('metadata.created_at must be an ISO 8601 timestamp string or null');
180
+ } else {
181
+ metadataOut.created_at = raw.metadata.created_at;
182
+ }
183
+ }
184
+ if (raw.metadata.updated_at !== undefined && raw.metadata.updated_at !== null) {
185
+ if (typeof raw.metadata.updated_at !== 'string' || Number.isNaN(Date.parse(raw.metadata.updated_at))) {
186
+ errors.push('metadata.updated_at must be an ISO 8601 timestamp string or null');
187
+ } else {
188
+ metadataOut.updated_at = raw.metadata.updated_at;
189
+ }
190
+ }
191
+ }
192
+
193
+ // Public API
194
+
195
+ /**
196
+ * Validate a raw owner config object. Defensive — never throws. Returns
197
+ * `{ok, value, errors}` where `value` is the normalized (default-filled)
198
+ * config when ok=true. When ok=false, `value` is null and `errors` is a
199
+ * non-empty array of human-readable messages.
200
+ *
201
+ * @param {unknown} raw
202
+ * @returns {{ok: boolean, value: object|null, errors: string[]}}
203
+ */
204
+ export function validate(raw) {
205
+ const errors = [];
206
+
207
+ if (!isPlainObject(raw)) {
208
+ return { ok: false, value: null, errors: ['owner config must be an object'] };
209
+ }
210
+
211
+ // schema-version (required, must be 1)
212
+ _validateSchemaVersionSection(raw, errors);
213
+
214
+ // owner (required)
215
+ const ownerOut = { name: '', 'email-hash': null, language: '' };
216
+ _validateOwnerSection(raw, errors, ownerOut);
217
+
218
+ // tone (optional; defaults applied)
219
+ const toneOut = { style: 'neutral', tonality: null };
220
+ _validateToneSection(raw, errors, toneOut);
221
+
222
+ // efficiency (optional; defaults applied)
223
+ const efficiencyOut = {
224
+ 'output-level': 'full',
225
+ preamble: 'minimal',
226
+ 'comments-in-code': 'minimal',
227
+ };
228
+ _validateEfficiencySection(raw, errors, efficiencyOut);
229
+
230
+ // hardware-sharing (optional; defaults applied)
231
+ const hwOut = { enabled: false, 'hash-salt': null };
232
+ _validateHardwareSharingSection(raw, errors, hwOut);
233
+
234
+ // defaults (optional)
235
+ const defaultsOut = { 'preferred-test-command': null, 'preferred-editor': null };
236
+ _validateDefaultsSection(raw, errors, defaultsOut);
237
+
238
+ // metadata (optional, auto-managed by writer)
239
+ const metadataOut = { created_at: null, updated_at: null };
240
+ _validateMetadataSection(raw, errors, metadataOut);
241
+
242
+ if (errors.length > 0) {
243
+ return { ok: false, value: null, errors };
244
+ }
245
+
246
+ return {
247
+ ok: true,
248
+ errors: [],
249
+ value: {
250
+ 'schema-version': CURRENT_OWNER_SCHEMA_VERSION,
251
+ owner: ownerOut,
252
+ tone: toneOut,
253
+ efficiency: efficiencyOut,
254
+ 'hardware-sharing': hwOut,
255
+ defaults: defaultsOut,
256
+ metadata: metadataOut,
257
+ },
258
+ };
259
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * owner-config-banner.mjs — #820
3
+ *
4
+ * Session-start Phase 4 readiness probe for the Owner Persona Layer's
5
+ * owner.yaml. Complements the per-section tolerance behaviour added to
6
+ * `loadOwnerConfig` (scripts/lib/owner-yaml.mjs, #820) by surfacing what
7
+ * would otherwise be a silent-failure class: a malformed OPTIONAL section
8
+ * silently replaced by defaults, or the whole file silently discarded
9
+ * because a REQUIRED section is invalid.
10
+ *
11
+ * Three findings, combined into a single null-or-warn result:
12
+ *
13
+ * 1. `droppedSections` present — an OPTIONAL object section (`paths`,
14
+ * `dispatcher`) was malformed and replaced by its default value.
15
+ * 2. Whole-file discard — a REQUIRED section (`owner`, `tone`,
16
+ * `efficiency`, `hardware-sharing`) was invalid, so `loadOwnerConfig`
17
+ * fell back to `source: 'defaults'` with `errors` populated (legacy
18
+ * behaviour, unchanged since #161).
19
+ * 3. `sectionWarnings` present (and nothing dropped) — an OPTIONAL list
20
+ * section (`vaults`, `baselines`) has invalid entries that lenient
21
+ * consumers will drop at point-of-use.
22
+ *
23
+ * Plain-JS — no Zod dependency. Never throws. Returns null (silent no-op)
24
+ * when the load was clean (`source: 'file'`, nothing dropped/warned) or the
25
+ * file is simply absent (`source: 'defaults'`, no errors).
26
+ *
27
+ * Mirrors the contract used by other Phase 4 banners
28
+ * (`scripts/lib/loop-readiness-banner.mjs`, `scripts/lib/vault-staleness-banner.mjs`,
29
+ * `scripts/lib/ci-status-banner.mjs`): a single `checkXxx()` entry point that
30
+ * returns `null` or `{ severity, message, ... }`.
31
+ *
32
+ * Cross-references:
33
+ * - `scripts/lib/owner-yaml.mjs` — loadOwnerConfig, validateOwnerSections.
34
+ * - `.claude/rules/owner-persona.md` — owner.yaml schema + privacy contract.
35
+ * - `skills/session-start/SKILL.md` Phase 4 — banner render site (wired separately).
36
+ * - Issue #820.
37
+ */
38
+
39
+ import { loadOwnerConfig, OWNER_YAML_PATH } from './owner-yaml.mjs';
40
+
41
+ /**
42
+ * Format a `{ section, errors }` entry into a short `"name" (first error)` tag.
43
+ * @param {{ section: string, errors?: string[] }} entry
44
+ * @returns {string}
45
+ */
46
+ function formatSectionTag(entry) {
47
+ const firstError = Array.isArray(entry?.errors) && entry.errors.length > 0 ? entry.errors[0] : 'invalid';
48
+ return `"${entry?.section}" (${firstError})`;
49
+ }
50
+
51
+ /**
52
+ * Check owner.yaml load health and produce a session-start banner.
53
+ *
54
+ * @param {{ loader?: (opts?: object) => {
55
+ * source: 'file'|'defaults'|'partial',
56
+ * errors: string[],
57
+ * droppedSections?: Array<{ section: string, errors: string[] }>,
58
+ * sectionWarnings?: Array<{ section: string, errors: string[] }>,
59
+ * } }} [opts]
60
+ * - `loader`: defaults to `loadOwnerConfig`; injectable for tests (fake loader).
61
+ * @returns {null | {
62
+ * severity: 'warn',
63
+ * message: string,
64
+ * droppedSections?: Array<{ section: string, errors: string[] }>,
65
+ * sectionWarnings?: Array<{ section: string, errors: string[] }>,
66
+ * discarded?: boolean,
67
+ * }}
68
+ */
69
+ export function checkOwnerConfig({ loader = loadOwnerConfig } = {}) {
70
+ try {
71
+ const result = loader();
72
+ if (!result || typeof result !== 'object') return null;
73
+
74
+ const errors = Array.isArray(result.errors) ? result.errors : [];
75
+ const droppedSections = Array.isArray(result.droppedSections) ? result.droppedSections : [];
76
+ const sectionWarnings = Array.isArray(result.sectionWarnings) ? result.sectionWarnings : [];
77
+
78
+ // Clean load (source 'file', nothing dropped/warned) — silent no-op.
79
+ if (result.source === 'file' && droppedSections.length === 0 && sectionWarnings.length === 0) {
80
+ return null;
81
+ }
82
+
83
+ // File simply absent (or unreadable with no schema errors) — silent no-op.
84
+ if (result.source === 'defaults' && errors.length === 0) {
85
+ return null;
86
+ }
87
+
88
+ // Whole-file discard: a REQUIRED section was invalid (legacy behaviour).
89
+ if (result.source === 'defaults' && errors.length > 0) {
90
+ const firstError = errors[0];
91
+ return {
92
+ severity: 'warn',
93
+ message:
94
+ `⚠ owner-config: ${OWNER_YAML_PATH} is invalid (${firstError}) — the entire file was ` +
95
+ 'discarded and defaults are in effect. Fix the file (see .claude/rules/owner-persona.md) ' +
96
+ 'to restore your settings.',
97
+ discarded: true,
98
+ };
99
+ }
100
+
101
+ // Per-section tolerance findings (#820): dropped OPTIONAL object
102
+ // section(s) and/or invalid OPTIONAL list section(s).
103
+ const parts = [];
104
+ if (droppedSections.length > 0) {
105
+ parts.push(`section(s) replaced by defaults: ${droppedSections.map(formatSectionTag).join(', ')}`);
106
+ }
107
+ if (sectionWarnings.length > 0) {
108
+ parts.push(
109
+ `section(s) with invalid entries (lenient consumers will drop bad entries): ` +
110
+ sectionWarnings.map(formatSectionTag).join(', '),
111
+ );
112
+ }
113
+
114
+ if (parts.length === 0) return null;
115
+
116
+ return {
117
+ severity: 'warn',
118
+ message: `⚠ owner-config: ${OWNER_YAML_PATH} — ${parts.join('; ')} — fix the file to restore full config.`,
119
+ ...(droppedSections.length > 0 ? { droppedSections } : {}),
120
+ ...(sectionWarnings.length > 0 ? { sectionWarnings } : {}),
121
+ };
122
+ } catch {
123
+ // Defensive catch-all — banner must never throw.
124
+ return null;
125
+ }
126
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * owner-config-loader.mjs — File-system loader for owner.yaml (Issue #174).
3
+ *
4
+ * Companion to the pure schema/validator in `owner-config.mjs`. Resolves the
5
+ * canonical config path (XDG-spec aware), reads the YAML, parses it, runs it
6
+ * through the validator, and returns a `{ok, value, errors, source, path}`
7
+ * envelope.
8
+ *
9
+ * ── PATH RESOLUTION ──────────────────────────────────────────────────────
10
+ *
11
+ * Default path: `${XDG_CONFIG_HOME ?? ${HOME}/.config}/session-orchestrator/owner.yaml`
12
+ * - macOS / Linux: `~/.config/session-orchestrator/owner.yaml`
13
+ * - Windows: `%APPDATA%\session-orchestrator\owner.yaml` when
14
+ * APPDATA is set and XDG_CONFIG_HOME is not (Node uses
15
+ * USERPROFILE for os.homedir() — falls back gracefully).
16
+ *
17
+ * Callers may pass an explicit `{path}` override (used by tests + D4
18
+ * baseline-propagation when the canonical path is overridden by env).
19
+ *
20
+ * ── RETURN SHAPE ─────────────────────────────────────────────────────────
21
+ *
22
+ * {
23
+ * ok: boolean, // false on any failure
24
+ * value: object|null, // normalized config when ok=true
25
+ * errors: string[], // populated on any failure
26
+ * source: 'file'|'missing'|'parse-error'|'validation-error',
27
+ * path: string, // resolved absolute path
28
+ * }
29
+ *
30
+ * `source: 'missing'` is NOT an error — owner.yaml is opt-in (the bootstrap
31
+ * interview in D2 creates it). Callers should treat `source: 'missing'` as
32
+ * "no owner persona configured; fall back to plugin defaults".
33
+ *
34
+ * ── PLATFORM PORTABILITY ─────────────────────────────────────────────────
35
+ *
36
+ * - Uses `os.homedir()` (Node-stdlib, OS-aware) rather than $HOME so the
37
+ * Windows path resolves correctly even when only USERPROFILE is set.
38
+ * - File reads are UTF-8 only. Owner.yaml is ASCII-safe by spec; non-UTF-8
39
+ * content yields `source: 'parse-error'`.
40
+ * - YAML parsing via `js-yaml` (devDep already pulled in by W2 quality-fix).
41
+ */
42
+
43
+ import { readFile } from 'node:fs/promises';
44
+ import { existsSync } from 'node:fs';
45
+ import { join } from 'node:path';
46
+ import { homedir } from 'node:os';
47
+ import yaml from 'js-yaml';
48
+
49
+ import { validate } from './owner-config.mjs';
50
+
51
+ // ---------------------------------------------------------------------------
52
+ // Path resolution
53
+ // ---------------------------------------------------------------------------
54
+
55
+ const APP_DIR = 'session-orchestrator';
56
+ const CONFIG_FILE = 'owner.yaml';
57
+
58
+ /**
59
+ * Resolve the canonical owner.yaml path on disk. Honours XDG_CONFIG_HOME
60
+ * when set (Linux convention), otherwise falls back to `${HOME}/.config`.
61
+ * Returns an absolute path string. Does NOT touch the filesystem.
62
+ *
63
+ * @returns {string} absolute path to owner.yaml
64
+ */
65
+ export function resolveOwnerConfigPath() {
66
+ const xdg = process.env.XDG_CONFIG_HOME;
67
+ const base = xdg && xdg.length > 0 ? xdg : join(homedir(), '.config');
68
+ return join(base, APP_DIR, CONFIG_FILE);
69
+ }
70
+
71
+ // ---------------------------------------------------------------------------
72
+ // Loader
73
+ // ---------------------------------------------------------------------------
74
+
75
+ /**
76
+ * Load and validate the owner.yaml config from disk.
77
+ *
78
+ * Defensive — never throws. Distinguishes four outcomes via the `source`
79
+ * field so callers can react differently to "missing file" (opt-in feature
80
+ * not yet enabled by the user) vs "malformed YAML" (broken state, surface
81
+ * to user).
82
+ *
83
+ * @param {{path?: string}} [opts]
84
+ * @returns {Promise<{ok: boolean, value: object|null, errors: string[], source: string, path: string}>}
85
+ */
86
+ export async function loadOwnerConfig(opts = {}) {
87
+ const path = opts.path ?? resolveOwnerConfigPath();
88
+
89
+ if (!existsSync(path)) {
90
+ return {
91
+ ok: false,
92
+ value: null,
93
+ errors: [],
94
+ source: 'missing',
95
+ path,
96
+ };
97
+ }
98
+
99
+ let raw;
100
+ try {
101
+ raw = await readFile(path, 'utf8');
102
+ } catch (err) {
103
+ return {
104
+ ok: false,
105
+ value: null,
106
+ errors: [`failed to read owner config: ${err.message}`],
107
+ source: 'parse-error',
108
+ path,
109
+ };
110
+ }
111
+
112
+ let parsed;
113
+ try {
114
+ // js-yaml's default schema (CORE_SCHEMA) is safe — it explicitly excludes
115
+ // the !!js/function and !!js/regexp tags from the legacy DEFAULT_SCHEMA
116
+ // that would let a malicious YAML file execute code or pollute prototypes.
117
+ parsed = yaml.load(raw);
118
+ } catch (err) {
119
+ return {
120
+ ok: false,
121
+ value: null,
122
+ errors: [`YAML parse error: ${err.message}`],
123
+ source: 'parse-error',
124
+ path,
125
+ };
126
+ }
127
+
128
+ // Empty file or YAML "null" → treat as parse-error so the caller knows
129
+ // there's nothing to merge (vs a missing file which opts the user out
130
+ // entirely).
131
+ if (parsed === null || parsed === undefined) {
132
+ return {
133
+ ok: false,
134
+ value: null,
135
+ errors: ['owner config is empty'],
136
+ source: 'parse-error',
137
+ path,
138
+ };
139
+ }
140
+
141
+ const validation = validate(parsed);
142
+ if (!validation.ok) {
143
+ return {
144
+ ok: false,
145
+ value: null,
146
+ errors: validation.errors,
147
+ source: 'validation-error',
148
+ path,
149
+ };
150
+ }
151
+
152
+ return {
153
+ ok: true,
154
+ value: validation.value,
155
+ errors: [],
156
+ source: 'file',
157
+ path,
158
+ };
159
+ }
@@ -0,0 +1,72 @@
1
+ # ~/.config/session-orchestrator/owner.yaml
2
+ #
3
+ # Per-user persona for the session-orchestrator plugin. Copy this file to
4
+ # ~/.config/session-orchestrator/owner.yaml (or $XDG_CONFIG_HOME/...) and
5
+ # fill in your values. NEVER commit this file to a project repo.
6
+ #
7
+ # Issue #174 (Sub-Epic #161 — Owner Persona Layer). Schema reference:
8
+ # docs/owner-config-schema.md.
9
+
10
+ # Schema version. MUST be 1. The plugin refuses to load mismatched versions.
11
+ schema-version: 1
12
+
13
+ owner:
14
+ # Required. Display name. 1-100 characters.
15
+ name: Your Name
16
+
17
+ # Optional. SHA256 hex digest of your email address. Used for cross-host
18
+ # identity correlation when sharing learnings (D4/C4). 64 hex chars exactly,
19
+ # or null to opt out. Plugin can compute this for you on first bootstrap.
20
+ email-hash: null
21
+
22
+ # Required. ISO-639-1 language code (e.g. "de", "en"). Optionally with a
23
+ # region tag like "en-US". Drives default response language in soul.md.
24
+ language: en
25
+
26
+ tone:
27
+ # How direct should responses be. One of: direct | neutral | friendly.
28
+ # Default: neutral.
29
+ style: direct
30
+
31
+ # Optional free-form descriptor. Up to 200 chars. Examples:
32
+ # "austrian-pragmatic", "british-dry", "minimal-comments".
33
+ tonality: austrian-pragmatic
34
+
35
+ efficiency:
36
+ # Caveman-inspired output dial. One of: lite | full | ultra.
37
+ # lite — minimum tokens, telegram style, why-use-many-token-when-few-do-trick.
38
+ # full — default, sentence-style narration.
39
+ # ultra — full + extra context, narrative tone (ECC/teaching mode).
40
+ output-level: full
41
+
42
+ # Pre-tool-call narration intensity. One of: minimal | verbose.
43
+ preamble: minimal
44
+
45
+ # Inline code comments. One of: minimal | full.
46
+ comments-in-code: minimal
47
+
48
+ hardware-sharing:
49
+ # Consent gate for sharing hardware-pattern learnings (Sub-Epic C+E).
50
+ # When true, the plugin may export anonymized hardware patterns (e.g.
51
+ # "Mac M1 16GB freezes at 8 parallel agents"). Default: false (off).
52
+ enabled: false
53
+
54
+ # 32-byte hex salt (64 chars), per-host. Used to derive a stable but
55
+ # anonymous host-class identifier. Generated on first bootstrap when
56
+ # hardware-sharing.enabled is set to true.
57
+ hash-salt: null
58
+
59
+ defaults:
60
+ # Optional. Override the project's `test-command` from CLAUDE.md (or
61
+ # AGENTS.md on Codex CLI) when no repo-local override exists. Up to 200
62
+ # chars. See skills/_shared/instruction-file-resolution.md for the alias rule.
63
+ preferred-test-command: null
64
+
65
+ # Optional. Editor command for "open in editor" actions. Up to 50 chars.
66
+ preferred-editor: null
67
+
68
+ metadata:
69
+ # Auto-set by the writer on first save (D2 bootstrap).
70
+ created_at: null
71
+ # Auto-bumped on every successful save.
72
+ updated_at: null
@@ -0,0 +1,28 @@
1
+ /**
2
+ * owner-config.mjs — Owner Persona schema + validator (Issue #174, Sub-Epic #161).
3
+ *
4
+ * Thin re-export wrapper. All logic lives in `./owner-config/` submodules:
5
+ * constants.mjs — frozen enum arrays + schema version
6
+ * error.mjs — OwnerConfigError class
7
+ * defaults.mjs — defaults() factory
8
+ * validate.mjs — validate() + 7 section helpers
9
+ * coerce.mjs — coerce() strict-mode wrapper
10
+ * merge.mjs — merge() deep-merge
11
+ * index.mjs — re-export hub (aggregates all 10 public symbols)
12
+ *
13
+ * For the full schema contract and module DAG see `./owner-config/index.mjs`.
14
+ * The loader (which does touch the disk) lives in `owner-config-loader.mjs`.
15
+ */
16
+
17
+ export {
18
+ CURRENT_OWNER_SCHEMA_VERSION,
19
+ VALID_TONE_STYLES,
20
+ VALID_OUTPUT_LEVELS,
21
+ VALID_PREAMBLE_LEVELS,
22
+ VALID_COMMENTS_LEVELS,
23
+ OwnerConfigError,
24
+ defaults,
25
+ validate,
26
+ coerce,
27
+ merge,
28
+ } from './owner-config/index.mjs';