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.
- package/.claude-plugin/marketplace.json +29 -0
- package/.claude-plugin/plugin.json +18 -0
- package/.codex-plugin/agents/explorer.toml +14 -0
- package/.codex-plugin/agents/session-reviewer.toml +23 -0
- package/.codex-plugin/agents/wave-worker.toml +15 -0
- package/.codex-plugin/config.toml +20 -0
- package/.codex-plugin/plugin.json +37 -0
- package/.cursor/rules/000-session-orchestrator.mdc +73 -0
- package/.cursor/rules/010-session-workflow.mdc +170 -0
- package/.cursor/rules/020-quality-gates.mdc +128 -0
- package/.cursor/rules/030-wave-execution.mdc +216 -0
- package/.cursor/rules/040-discovery.mdc +242 -0
- package/.cursor/rules/050-plan.mdc +235 -0
- package/.cursor/rules/060-evolve.mdc +232 -0
- package/.cursor/rules/070-gitlab-ops.mdc +246 -0
- package/.cursor/rules/080-ecosystem-health.mdc +145 -0
- package/.mcp.json +8 -0
- package/CHANGELOG.md +1544 -0
- package/LICENSE +21 -0
- package/NOTICE +64 -0
- package/README.md +242 -0
- package/SECURITY.md +90 -0
- package/agents/AGENTS.md +136 -0
- package/agents/analyst.md +99 -0
- package/agents/architect-reviewer.md +93 -0
- package/agents/code-implementer.md +106 -0
- package/agents/db-specialist.md +104 -0
- package/agents/dialectic-deriver.md +139 -0
- package/agents/docs-writer.md +113 -0
- package/agents/eval-judge.md +146 -0
- package/agents/memory-proposal-collector.md +297 -0
- package/agents/qa-strategist.md +102 -0
- package/agents/schemas/analyst.schema.json +46 -0
- package/agents/schemas/architect-reviewer.schema.json +50 -0
- package/agents/schemas/code-implementer.schema.json +61 -0
- package/agents/schemas/db-specialist.schema.json +80 -0
- package/agents/schemas/docs-writer.schema.json +56 -0
- package/agents/schemas/persona-panel-sidecar.schema.json +245 -0
- package/agents/schemas/qa-strategist.schema.json +46 -0
- package/agents/schemas/security-reviewer.schema.json +86 -0
- package/agents/schemas/session-reviewer.schema.json +69 -0
- package/agents/schemas/test-writer.schema.json +69 -0
- package/agents/schemas/ui-developer.schema.json +90 -0
- package/agents/schemas/ux-evaluator.schema.json +51 -0
- package/agents/security-reviewer.md +236 -0
- package/agents/session-reviewer.md +201 -0
- package/agents/skill-applied-judge.md +122 -0
- package/agents/test-writer.md +123 -0
- package/agents/ui-developer.md +109 -0
- package/agents/ux-evaluator.md +161 -0
- package/assets/icon.svg +11 -0
- package/assets/og-card.png +0 -0
- package/assets/og-card.svg +47 -0
- package/commands/autopilot-multi.md +74 -0
- package/commands/autopilot.md +80 -0
- package/commands/bootstrap.md +56 -0
- package/commands/brainstorm.md +48 -0
- package/commands/close.md +24 -0
- package/commands/debug.md +36 -0
- package/commands/discovery.md +32 -0
- package/commands/dispatcher.md +59 -0
- package/commands/eval.md +28 -0
- package/commands/evolve.md +10 -0
- package/commands/go.md +41 -0
- package/commands/grill.md +45 -0
- package/commands/harness-audit.md +26 -0
- package/commands/memory-cleanup.md +25 -0
- package/commands/persona-panel.md +121 -0
- package/commands/plan.md +15 -0
- package/commands/portfolio.md +97 -0
- package/commands/reconcile.md +23 -0
- package/commands/repo-audit.md +24 -0
- package/commands/session.md +30 -0
- package/commands/spinout.md +15 -0
- package/commands/sunset-review.md +27 -0
- package/commands/templates-ack.md +96 -0
- package/commands/test.md +97 -0
- package/docs/README.md +105 -0
- package/docs/USER-GUIDE.md +1403 -0
- package/docs/ci-setup.md +81 -0
- package/docs/codex-setup.md +142 -0
- package/docs/components.md +74 -0
- package/docs/cursor-setup.md +104 -0
- package/docs/events-schema.md +81 -0
- package/docs/migration-v3.md +148 -0
- package/docs/owner-config-schema.md +154 -0
- package/docs/persona-panel.md +433 -0
- package/docs/pi-setup.md +115 -0
- package/docs/plugin-architecture-v3.md +296 -0
- package/docs/pm-skills-marketplace.md +114 -0
- package/docs/policy-cache-validation-2026-04-28.md +118 -0
- package/docs/rule-authoring.md +316 -0
- package/docs/session-config-reference.md +1439 -0
- package/docs/session-config-template.md +961 -0
- package/docs/vault-docs-architecture.md +297 -0
- package/hooks/_lib/lock-bootstrap.mjs +272 -0
- package/hooks/_lib/lock-reconcile.mjs +93 -0
- package/hooks/_lib/profile-gate.mjs +95 -0
- package/hooks/_lib/transcript-history.mjs +211 -0
- package/hooks/agent-teams-h3-test.sh +362 -0
- package/hooks/config-protection.mjs +0 -0
- package/hooks/cwd-change-restore.mjs +131 -0
- package/hooks/enforce-commands.mjs +179 -0
- package/hooks/enforce-scope.mjs +273 -0
- package/hooks/hooks-codex.json +60 -0
- package/hooks/hooks-cursor.json +15 -0
- package/hooks/hooks-pi.json +115 -0
- package/hooks/hooks.json +215 -0
- package/hooks/loop-guard.mjs +260 -0
- package/hooks/on-session-end.mjs +217 -0
- package/hooks/on-session-start.mjs +660 -0
- package/hooks/on-stop.mjs +294 -0
- package/hooks/operator-steer.mjs +64 -0
- package/hooks/post-edit-validate.mjs +225 -0
- package/hooks/post-subagent-discovery-validator.mjs +398 -0
- package/hooks/post-tool-batch-wave-signal.mjs +328 -0
- package/hooks/post-tool-failure-corrective-context.mjs +248 -0
- package/hooks/post-tooluse-frontend-slop.mjs +184 -0
- package/hooks/pre-bash-destructive-guard.mjs +515 -0
- package/hooks/pre-bash-memory-propose-audit.mjs +206 -0
- package/hooks/pre-bash-staging-fence.mjs +223 -0
- package/hooks/pre-bash-templates-first.mjs +404 -0
- package/hooks/run-node.sh +72 -0
- package/hooks/skill-invocation-telemetry.mjs +99 -0
- package/hooks/subagent-telemetry.mjs +249 -0
- package/hooks/wave-scope-commit-guard.mjs +191 -0
- package/monitors/monitors.json +14 -0
- package/output-styles/finding-report.md +48 -0
- package/output-styles/session-report.md +53 -0
- package/output-styles/wave-summary.md +38 -0
- package/package.json +94 -0
- package/pi/extensions/session-orchestrator.ts +25 -0
- package/pi/prompts/autopilot-multi.md +12 -0
- package/pi/prompts/autopilot.md +12 -0
- package/pi/prompts/bootstrap.md +12 -0
- package/pi/prompts/brainstorm.md +12 -0
- package/pi/prompts/close.md +11 -0
- package/pi/prompts/debug.md +12 -0
- package/pi/prompts/discovery.md +12 -0
- package/pi/prompts/dispatcher.md +12 -0
- package/pi/prompts/eval.md +12 -0
- package/pi/prompts/evolve.md +12 -0
- package/pi/prompts/go.md +12 -0
- package/pi/prompts/grill.md +12 -0
- package/pi/prompts/harness-audit.md +12 -0
- package/pi/prompts/memory-cleanup.md +12 -0
- package/pi/prompts/persona-panel.md +12 -0
- package/pi/prompts/plan.md +12 -0
- package/pi/prompts/portfolio.md +12 -0
- package/pi/prompts/reconcile.md +12 -0
- package/pi/prompts/repo-audit.md +12 -0
- package/pi/prompts/session.md +12 -0
- package/pi/prompts/spinout.md +12 -0
- package/pi/prompts/sunset-review.md +12 -0
- package/pi/prompts/templates-ack.md +12 -0
- package/pi/prompts/test.md +12 -0
- package/rules/_index.md +51 -0
- package/rules/always-on/commit-discipline.md +26 -0
- package/rules/always-on/npm-quality-gates.md +26 -0
- package/rules/always-on/parallel-sessions.md +43 -0
- package/rules/opt-in-domain/prompt-caching.md +270 -0
- package/rules/opt-in-stack/backend-data.md +188 -0
- package/rules/opt-in-stack/backend.md +390 -0
- package/rules/opt-in-stack/frontend.md +98 -0
- package/rules/opt-in-stack/security-web.md +194 -0
- package/rules/opt-in-stack/swift.md +65 -0
- package/scripts/archive-closed-prds.mjs +416 -0
- package/scripts/autopilot-multi.mjs +802 -0
- package/scripts/autopilot.mjs +383 -0
- package/scripts/backfill-abandoned-sessions.mjs +265 -0
- package/scripts/backfill-learnings-expires.mjs +196 -0
- package/scripts/backfill-learnings.mjs +203 -0
- package/scripts/backfill-sessions.mjs +282 -0
- package/scripts/check-doc-consistency.sh +279 -0
- package/scripts/check-package-manager.mjs +445 -0
- package/scripts/ci/assert-vitest-green.mjs +267 -0
- package/scripts/codex-install.mjs +435 -0
- package/scripts/compute-grounding-injection.sh +186 -0
- package/scripts/cursor-install.mjs +113 -0
- package/scripts/dialectic-deriver.mjs +573 -0
- package/scripts/emit-event.mjs +160 -0
- package/scripts/emit-session.mjs +212 -0
- package/scripts/eval-session.mjs +262 -0
- package/scripts/export-hw-learnings.mjs +437 -0
- package/scripts/gc-stale-worktrees.mjs +666 -0
- package/scripts/generate-pi-prompts.mjs +127 -0
- package/scripts/harness-audit.mjs +287 -0
- package/scripts/lib/agent-frontmatter.mjs +266 -0
- package/scripts/lib/agent-output-schema.mjs +166 -0
- package/scripts/lib/agent-status.mjs +303 -0
- package/scripts/lib/ajv-loader.mjs +34 -0
- package/scripts/lib/auto-dialectic.mjs +382 -0
- package/scripts/lib/auto-dream.mjs +471 -0
- package/scripts/lib/autonomy/suitability.mjs +212 -0
- package/scripts/lib/autopilot/dep-graph.mjs +417 -0
- package/scripts/lib/autopilot/durable-telemetry.mjs +121 -0
- package/scripts/lib/autopilot/flags.mjs +104 -0
- package/scripts/lib/autopilot/kill-switches.mjs +174 -0
- package/scripts/lib/autopilot/loop.mjs +320 -0
- package/scripts/lib/autopilot/mr-draft.mjs +520 -0
- package/scripts/lib/autopilot/multi-killswitch.mjs +184 -0
- package/scripts/lib/autopilot/recent-runs.mjs +106 -0
- package/scripts/lib/autopilot/stall-sampler.mjs +97 -0
- package/scripts/lib/autopilot/telemetry.mjs +224 -0
- package/scripts/lib/autopilot/worktree-pipeline.mjs +605 -0
- package/scripts/lib/autopilot-telemetry.mjs +11 -0
- package/scripts/lib/autopilot.mjs +39 -0
- package/scripts/lib/backlog-scan.mjs +179 -0
- package/scripts/lib/bootstrap-lock-freshness.mjs +260 -0
- package/scripts/lib/bootstrap-lock-refresh.mjs +186 -0
- package/scripts/lib/build-live-signals.mjs +150 -0
- package/scripts/lib/ci-status-banner.mjs +425 -0
- package/scripts/lib/claude-md-budget-lint.mjs +246 -0
- package/scripts/lib/cli-flags.mjs +158 -0
- package/scripts/lib/codex/plugin-contract.mjs +610 -0
- package/scripts/lib/cold-start-detector.mjs +240 -0
- package/scripts/lib/command-blocker.mjs +458 -0
- package/scripts/lib/common.mjs +333 -0
- package/scripts/lib/config/auto-dream.mjs +77 -0
- package/scripts/lib/config/block-header.mjs +94 -0
- package/scripts/lib/config/broken-window.mjs +114 -0
- package/scripts/lib/config/coercers.mjs +248 -0
- package/scripts/lib/config/cold-start.mjs +92 -0
- package/scripts/lib/config/config-protection.mjs +120 -0
- package/scripts/lib/config/cross-repo.mjs +104 -0
- package/scripts/lib/config/custom-phases.mjs +213 -0
- package/scripts/lib/config/dialectic.mjs +92 -0
- package/scripts/lib/config/discovery-validator.mjs +75 -0
- package/scripts/lib/config/dispatcher-autonomy-capture.mjs +240 -0
- package/scripts/lib/config/dispatcher-autonomy.mjs +152 -0
- package/scripts/lib/config/docs-orchestrator.mjs +90 -0
- package/scripts/lib/config/docs-staleness.mjs +96 -0
- package/scripts/lib/config/drift-check.mjs +155 -0
- package/scripts/lib/config/eval.mjs +130 -0
- package/scripts/lib/config/events-rotation.mjs +74 -0
- package/scripts/lib/config/evolve.mjs +308 -0
- package/scripts/lib/config/frontend-slop-hook.mjs +104 -0
- package/scripts/lib/config/gitlab-portfolio.mjs +150 -0
- package/scripts/lib/config/handover-gate.mjs +106 -0
- package/scripts/lib/config/host-paths.mjs +76 -0
- package/scripts/lib/config/io.mjs +54 -0
- package/scripts/lib/config/loop-guard.mjs +117 -0
- package/scripts/lib/config/memory.mjs +150 -0
- package/scripts/lib/config/persona-gate-wave.mjs +258 -0
- package/scripts/lib/config/reconcile.mjs +205 -0
- package/scripts/lib/config/section-extractor.mjs +100 -0
- package/scripts/lib/config/skill-evolution.mjs +112 -0
- package/scripts/lib/config/slopcheck.mjs +99 -0
- package/scripts/lib/config/state-md-lock.mjs +83 -0
- package/scripts/lib/config/templates-first.mjs +94 -0
- package/scripts/lib/config/test.mjs +113 -0
- package/scripts/lib/config/vault-integration.mjs +201 -0
- package/scripts/lib/config/vault-mirror-quality.mjs +99 -0
- package/scripts/lib/config/vault-staleness.mjs +84 -0
- package/scripts/lib/config/vault-sync.mjs +96 -0
- package/scripts/lib/config/verification-auto-fix.mjs +84 -0
- package/scripts/lib/config/wave-reviewers.mjs +133 -0
- package/scripts/lib/config-schema.mjs +345 -0
- package/scripts/lib/config.mjs +474 -0
- package/scripts/lib/convergence-monitor.mjs +389 -0
- package/scripts/lib/coordinator-snapshot.mjs +371 -0
- package/scripts/lib/crypto-digest-utils.mjs +91 -0
- package/scripts/lib/discovery/helpers.mjs +127 -0
- package/scripts/lib/discovery/triage-state.mjs +279 -0
- package/scripts/lib/dispatcher/cli.mjs +257 -0
- package/scripts/lib/dispatcher/enumerate.mjs +243 -0
- package/scripts/lib/dispatcher/rank.mjs +363 -0
- package/scripts/lib/ecosystem-health.mjs +224 -0
- package/scripts/lib/ecosystem-wizard/ci-detector.mjs +18 -0
- package/scripts/lib/ecosystem-wizard/config-parser.mjs +54 -0
- package/scripts/lib/ecosystem-wizard/config-writer.mjs +287 -0
- package/scripts/lib/ecosystem-wizard/package-manager-detector.mjs +42 -0
- package/scripts/lib/ecosystem-wizard/wizard-prompt.mjs +246 -0
- package/scripts/lib/ecosystem-wizard.mjs +48 -0
- package/scripts/lib/env-check.mjs +89 -0
- package/scripts/lib/eval/engine.mjs +605 -0
- package/scripts/lib/eval/judge.mjs +433 -0
- package/scripts/lib/eval/report.mjs +367 -0
- package/scripts/lib/eval/schema.mjs +618 -0
- package/scripts/lib/eval/session-resolve.mjs +137 -0
- package/scripts/lib/eval/sink.mjs +77 -0
- package/scripts/lib/events-rotation.mjs +86 -0
- package/scripts/lib/events-schema.mjs +81 -0
- package/scripts/lib/events.mjs +80 -0
- package/scripts/lib/evolve/autonomy-verdict.mjs +461 -0
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +293 -0
- package/scripts/lib/exclusivity-matrix.mjs +68 -0
- package/scripts/lib/fetch-baseline.mjs +311 -0
- package/scripts/lib/file-lock.mjs +512 -0
- package/scripts/lib/frontend-detect/detect.mjs +138 -0
- package/scripts/lib/frontend-detect/rules.mjs +295 -0
- package/scripts/lib/frontmatter-guard.mjs +241 -0
- package/scripts/lib/gates/echo-stub-detect.mjs +39 -0
- package/scripts/lib/gates/gate-baseline.mjs +42 -0
- package/scripts/lib/gates/gate-full.mjs +85 -0
- package/scripts/lib/gates/gate-helpers.mjs +231 -0
- package/scripts/lib/gates/gate-incremental.mjs +76 -0
- package/scripts/lib/gates/gate-per-file.mjs +55 -0
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +447 -0
- package/scripts/lib/gitlab-portfolio/aggregator.mjs +383 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +428 -0
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +289 -0
- package/scripts/lib/gitlab-portfolio/vcs-detect.mjs +182 -0
- package/scripts/lib/handover-gate.mjs +222 -0
- package/scripts/lib/hardening.mjs +43 -0
- package/scripts/lib/hardware-pattern-detector.mjs +238 -0
- package/scripts/lib/harness-audit/categories/category1.mjs +123 -0
- package/scripts/lib/harness-audit/categories/category2.mjs +145 -0
- package/scripts/lib/harness-audit/categories/category3.mjs +143 -0
- package/scripts/lib/harness-audit/categories/category4.mjs +202 -0
- package/scripts/lib/harness-audit/categories/category5.mjs +152 -0
- package/scripts/lib/harness-audit/categories/category6.mjs +211 -0
- package/scripts/lib/harness-audit/categories/category7.mjs +125 -0
- package/scripts/lib/harness-audit/categories/category8.mjs +328 -0
- package/scripts/lib/harness-audit/categories/category9.mjs +294 -0
- package/scripts/lib/harness-audit/categories/helpers.mjs +165 -0
- package/scripts/lib/harness-audit/categories.mjs +19 -0
- package/scripts/lib/historical-guard.mjs +15 -0
- package/scripts/lib/host-identity.mjs +262 -0
- package/scripts/lib/instruction-budget-guard.mjs +332 -0
- package/scripts/lib/io.mjs +304 -0
- package/scripts/lib/issue-close-strip-labels.mjs +161 -0
- package/scripts/lib/language-mappers/README.md +57 -0
- package/scripts/lib/language-mappers/index.mjs +165 -0
- package/scripts/lib/language-mappers/markdown.mjs +149 -0
- package/scripts/lib/language-mappers/python.mjs +249 -0
- package/scripts/lib/language-mappers/swift.mjs +201 -0
- package/scripts/lib/language-mappers/typescript.mjs +433 -0
- package/scripts/lib/learnings/expiry-sweep.mjs +164 -0
- package/scripts/lib/learnings/filters.mjs +43 -0
- package/scripts/lib/learnings/io.mjs +255 -0
- package/scripts/lib/learnings/schema.mjs +518 -0
- package/scripts/lib/learnings/surface.mjs +207 -0
- package/scripts/lib/learnings.mjs +42 -0
- package/scripts/lib/lock-reaper.mjs +648 -0
- package/scripts/lib/locks/index.mjs +31 -0
- package/scripts/lib/locks/lock-body.mjs +62 -0
- package/scripts/lib/locks/staging-fence-lock.mjs +267 -0
- package/scripts/lib/locks/state-md-lock.mjs +351 -0
- package/scripts/lib/loop-readiness-banner.mjs +144 -0
- package/scripts/lib/memory-banner.mjs +478 -0
- package/scripts/lib/memory-cleanup/worktree-sweep.mjs +108 -0
- package/scripts/lib/memory-cleanup-stamp.mjs +56 -0
- package/scripts/lib/memory-paths.mjs +31 -0
- package/scripts/lib/memory-proposals/collector.mjs +334 -0
- package/scripts/lib/memory-proposals/schema.mjs +289 -0
- package/scripts/lib/memory-proposals/sink.mjs +507 -0
- package/scripts/lib/memory-proposals/store.mjs +441 -0
- package/scripts/lib/mission-status-schema.mjs +114 -0
- package/scripts/lib/mode-selector/alternatives.mjs +64 -0
- package/scripts/lib/mode-selector/constants.mjs +29 -0
- package/scripts/lib/mode-selector/context-pressure.mjs +157 -0
- package/scripts/lib/mode-selector/rationale.mjs +55 -0
- package/scripts/lib/mode-selector/scoring.mjs +221 -0
- package/scripts/lib/mode-selector-accuracy.mjs +121 -0
- package/scripts/lib/mode-selector.mjs +160 -0
- package/scripts/lib/multi-provider-build/providers.mjs +64 -0
- package/scripts/lib/multi-provider-build/templating.mjs +130 -0
- package/scripts/lib/named-baseline-resolver.mjs +233 -0
- package/scripts/lib/named-vault-resolver.mjs +433 -0
- package/scripts/lib/owner-config/coerce.mjs +29 -0
- package/scripts/lib/owner-config/constants.mjs +21 -0
- package/scripts/lib/owner-config/defaults.mjs +50 -0
- package/scripts/lib/owner-config/error.mjs +19 -0
- package/scripts/lib/owner-config/index.mjs +13 -0
- package/scripts/lib/owner-config/merge.mjs +52 -0
- package/scripts/lib/owner-config/validate.mjs +259 -0
- package/scripts/lib/owner-config-banner.mjs +126 -0
- package/scripts/lib/owner-config-loader.mjs +159 -0
- package/scripts/lib/owner-config.example.yaml +72 -0
- package/scripts/lib/owner-config.mjs +28 -0
- package/scripts/lib/owner-interview.mjs +243 -0
- package/scripts/lib/owner-yaml.mjs +571 -0
- package/scripts/lib/package-manager.mjs +160 -0
- package/scripts/lib/path-utils.mjs +217 -0
- package/scripts/lib/peer-cards/merger.mjs +310 -0
- package/scripts/lib/peer-cards/reader.mjs +125 -0
- package/scripts/lib/peer-cards/schema.mjs +230 -0
- package/scripts/lib/peer-cards/staleness-banner.mjs +86 -0
- package/scripts/lib/peer-cards/writer.mjs +138 -0
- package/scripts/lib/peer-discovery.mjs +200 -0
- package/scripts/lib/persona-panel/catalog-loader.mjs +577 -0
- package/scripts/lib/persona-panel/consolidator.mjs +370 -0
- package/scripts/lib/persona-panel/persona-runner.mjs +375 -0
- package/scripts/lib/persona-panel/threshold.mjs +130 -0
- package/scripts/lib/pi-hook-bridge.mjs +328 -0
- package/scripts/lib/platform.mjs +266 -0
- package/scripts/lib/playwright-driver/runner.mjs +297 -0
- package/scripts/lib/plugin-root.mjs +210 -0
- package/scripts/lib/pre-dispatch-check.mjs +126 -0
- package/scripts/lib/product-repo-detect.mjs +121 -0
- package/scripts/lib/profiles/registry.mjs +176 -0
- package/scripts/lib/profiles/schema.mjs +209 -0
- package/scripts/lib/qg-command-drift-banner.mjs +88 -0
- package/scripts/lib/quality-gate/diagnostics.mjs +92 -0
- package/scripts/lib/quality-gate.mjs +536 -0
- package/scripts/lib/quality-gates-cache.mjs +228 -0
- package/scripts/lib/quality-gates-policy.mjs +95 -0
- package/scripts/lib/recommendations-v0.mjs +156 -0
- package/scripts/lib/reconcile/eligibility.mjs +203 -0
- package/scripts/lib/reconcile/emitter.mjs +244 -0
- package/scripts/lib/reconcile/engine.mjs +412 -0
- package/scripts/lib/reconcile/idempotency.mjs +239 -0
- package/scripts/lib/reconcile/renderer.mjs +211 -0
- package/scripts/lib/reconcile/writer.mjs +293 -0
- package/scripts/lib/reconcile-nudge-banner.mjs +284 -0
- package/scripts/lib/resource-probe/evaluate.mjs +190 -0
- package/scripts/lib/resource-probe/parsers.mjs +181 -0
- package/scripts/lib/resource-probe/probe-platform.mjs +300 -0
- package/scripts/lib/resource-probe.mjs +95 -0
- package/scripts/lib/rule-loader.mjs +552 -0
- package/scripts/lib/rules-sync.mjs +439 -0
- package/scripts/lib/scope-gate.mjs +496 -0
- package/scripts/lib/session-close-backfill.mjs +539 -0
- package/scripts/lib/session-discovery.mjs +256 -0
- package/scripts/lib/session-end/phase-skip.mjs +357 -0
- package/scripts/lib/session-end/worktree-cleanup.mjs +112 -0
- package/scripts/lib/session-id.mjs +362 -0
- package/scripts/lib/session-lock.mjs +703 -0
- package/scripts/lib/session-registry.mjs +355 -0
- package/scripts/lib/session-schema/aliases.mjs +71 -0
- package/scripts/lib/session-schema/constants.mjs +115 -0
- package/scripts/lib/session-schema/normalizer.mjs +66 -0
- package/scripts/lib/session-schema/timestamps.mjs +64 -0
- package/scripts/lib/session-schema/validator.mjs +453 -0
- package/scripts/lib/session-schema.mjs +71 -0
- package/scripts/lib/session-token-rollup.mjs +137 -0
- package/scripts/lib/sessions-staleness-banner.mjs +247 -0
- package/scripts/lib/skill-evolution/blast-radius-classifier.mjs +114 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +270 -0
- package/scripts/lib/skill-evolution/config-validation-gate.mjs +279 -0
- package/scripts/lib/skill-evolution/engine.mjs +719 -0
- package/scripts/lib/skill-evolution/idempotency.mjs +279 -0
- package/scripts/lib/skill-evolution/mr-opener.mjs +507 -0
- package/scripts/lib/skill-health/join.mjs +181 -0
- package/scripts/lib/skill-health/score.mjs +123 -0
- package/scripts/lib/skill-invocations-schema.mjs +214 -0
- package/scripts/lib/skill-judge.mjs +348 -0
- package/scripts/lib/skill-judgments-schema.mjs +264 -0
- package/scripts/lib/slopcheck.mjs +501 -0
- package/scripts/lib/soul-resolve.mjs +118 -0
- package/scripts/lib/spiral-carryover.mjs +495 -0
- package/scripts/lib/state-md/body-sections.mjs +851 -0
- package/scripts/lib/state-md/frontmatter-mutators.mjs +453 -0
- package/scripts/lib/state-md/mission-status.mjs +247 -0
- package/scripts/lib/state-md/recommendations.mjs +57 -0
- package/scripts/lib/state-md/yaml-parser.mjs +234 -0
- package/scripts/lib/state-md-peer-guard.mjs +232 -0
- package/scripts/lib/state-md.mjs +53 -0
- package/scripts/lib/subagents-schema.mjs +309 -0
- package/scripts/lib/sunset/walker.mjs +1192 -0
- package/scripts/lib/test-runner/artifact-paths.mjs +94 -0
- package/scripts/lib/test-runner/fingerprint.mjs +33 -0
- package/scripts/lib/test-runner/issue-reconcile.mjs +770 -0
- package/scripts/lib/tmux-layout/layouts.mjs +224 -0
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +100 -0
- package/scripts/lib/tmux-layout/telemetry.mjs +88 -0
- package/scripts/lib/tmux-layout/tmux-shell.mjs +82 -0
- package/scripts/lib/tmux-layout/vcs-detector.mjs +88 -0
- package/scripts/lib/validate/check-agents.mjs +457 -0
- package/scripts/lib/validate/check-codex-plugin.mjs +37 -0
- package/scripts/lib/validate/check-commands.mjs +148 -0
- package/scripts/lib/validate/check-component-paths.mjs +112 -0
- package/scripts/lib/validate/check-dead-bridge.mjs +180 -0
- package/scripts/lib/validate/check-hooks-symmetry.mjs +258 -0
- package/scripts/lib/validate/check-json-files.mjs +116 -0
- package/scripts/lib/validate/check-owner-leakage.mjs +1011 -0
- package/scripts/lib/validate/check-path-utils-canary.mjs +175 -0
- package/scripts/lib/validate/check-peekaboo-driver-canary.mjs +201 -0
- package/scripts/lib/validate/check-pi-package.mjs +110 -0
- package/scripts/lib/validate/check-pi-prompts.mjs +43 -0
- package/scripts/lib/validate/check-playwright-mcp-canary.mjs +154 -0
- package/scripts/lib/validate/check-plugin-json.mjs +96 -0
- package/scripts/lib/validate/check-plugin-monitors.mjs +206 -0
- package/scripts/lib/validate/check-plugin-schema.mjs +137 -0
- package/scripts/lib/validate/check-rules.mjs +143 -0
- package/scripts/lib/validate/check-session-plan-routing.mjs +154 -0
- package/scripts/lib/validate/check-test-fixture-shapes.mjs +280 -0
- package/scripts/lib/validate/check-unicode-safety.mjs +533 -0
- package/scripts/lib/validate/confidential-names.mjs +169 -0
- package/scripts/lib/validate/dead-bridge-corpus.mjs +141 -0
- package/scripts/lib/validate/dead-bridge-detectors.mjs +568 -0
- package/scripts/lib/validate/tier-inference.mjs +100 -0
- package/scripts/lib/validate-vendored-rules.mjs +519 -0
- package/scripts/lib/vault-archive.mjs +404 -0
- package/scripts/lib/vault-backfill/glab.mjs +164 -0
- package/scripts/lib/vault-backfill/manifest.mjs +75 -0
- package/scripts/lib/vault-backfill/template.mjs +130 -0
- package/scripts/lib/vault-consolidate-fs.mjs +331 -0
- package/scripts/lib/vault-migration-rules.mjs +155 -0
- package/scripts/lib/vault-mirror/auto-commit.mjs +203 -0
- package/scripts/lib/vault-mirror/namespace.mjs +152 -0
- package/scripts/lib/vault-mirror/process.mjs +567 -0
- package/scripts/lib/vault-mirror/pseudonym-map.mjs +164 -0
- package/scripts/lib/vault-mirror/render-learnings.mjs +201 -0
- package/scripts/lib/vault-mirror/render-sessions.mjs +367 -0
- package/scripts/lib/vault-mirror/render.mjs +8 -0
- package/scripts/lib/vault-mirror/utils.mjs +217 -0
- package/scripts/lib/vault-relocation-rules.mjs +555 -0
- package/scripts/lib/vault-repo-backfill.mjs +235 -0
- package/scripts/lib/vault-staleness-banner.mjs +142 -0
- package/scripts/lib/vault-status/board-writer.mjs +769 -0
- package/scripts/lib/vault-status/narrative-mirror.mjs +544 -0
- package/scripts/lib/vault-sync-baseline.mjs +152 -0
- package/scripts/lib/wave-context.mjs +29 -0
- package/scripts/lib/wave-executor/pool.mjs +248 -0
- package/scripts/lib/wave-resource-gate.mjs +204 -0
- package/scripts/lib/wave-sizing.mjs +75 -0
- package/scripts/lib/webhook-url.mjs +105 -0
- package/scripts/lib/workspace.mjs +198 -0
- package/scripts/lib/worktree/constants.mjs +35 -0
- package/scripts/lib/worktree/index.mjs +17 -0
- package/scripts/lib/worktree/lifecycle.mjs +287 -0
- package/scripts/lib/worktree/listing.mjs +118 -0
- package/scripts/lib/worktree/meta.mjs +64 -0
- package/scripts/lib/worktree-freshness.mjs +313 -0
- package/scripts/lib/worktree.mjs +15 -0
- package/scripts/lifecycle-sim-v6.mjs +347 -0
- package/scripts/lock-reaper.mjs +185 -0
- package/scripts/mcp-server.sh +241 -0
- package/scripts/measure-policy-cache-effectiveness.mjs +427 -0
- package/scripts/memory-propose.mjs +464 -0
- package/scripts/migrate-cold-start-seed.mjs +404 -0
- package/scripts/migrate-learnings-jsonl.mjs +189 -0
- package/scripts/migrate-legacy-learnings.sh +61 -0
- package/scripts/migrate-sessions-jsonl.mjs +448 -0
- package/scripts/migrate-subagents-jsonl.mjs +196 -0
- package/scripts/migrate-vault-paths.mjs +796 -0
- package/scripts/parse-config.mjs +149 -0
- package/scripts/pi-install.mjs +117 -0
- package/scripts/print-applicable-rules.mjs +247 -0
- package/scripts/promote-vault-strict.mjs +496 -0
- package/scripts/relocate-vault-corpus.mjs +1178 -0
- package/scripts/run-migrate-v2-cross-repo.mjs +385 -0
- package/scripts/run-quality-gate.mjs +216 -0
- package/scripts/spikes/h3-agent-teams/preflight.sh +53 -0
- package/scripts/spikes/h3-agent-teams/run-h3.sh +112 -0
- package/scripts/spikes/h3-agent-teams/setup.sh +137 -0
- package/scripts/spikes/h3-agent-teams/toggle.sh +38 -0
- package/scripts/sweep-expired-learnings.mjs +135 -0
- package/scripts/sync-vault-schema.mjs +376 -0
- package/scripts/tests/fixtures/fetch-baseline/sample-rule.md +8 -0
- package/scripts/tmux-layout.mjs +245 -0
- package/scripts/token-audit.sh +191 -0
- package/scripts/typecheck.mjs +42 -0
- package/scripts/upload-social-preview.mjs +316 -0
- package/scripts/validate-config.mjs +46 -0
- package/scripts/validate-plugin-manifests.mjs +163 -0
- package/scripts/validate-plugin.mjs +264 -0
- package/scripts/validate-wave-scope.mjs +289 -0
- package/scripts/vault-backfill.mjs +404 -0
- package/scripts/vault-consolidate.mjs +596 -0
- package/scripts/vault-integration-watcher.mjs +394 -0
- package/scripts/vault-mirror.mjs +430 -0
- package/skills/_shared/bootstrap-gate.md +111 -0
- package/skills/_shared/config-reading.md +226 -0
- package/skills/_shared/instruction-file-resolution.md +79 -0
- package/skills/_shared/model-selection.md +64 -0
- package/skills/_shared/monitor-patterns.md +300 -0
- package/skills/_shared/parallel-aware-auq.md +121 -0
- package/skills/_shared/parallel-aware-preamble.md +185 -0
- package/skills/_shared/platform-tools.md +96 -0
- package/skills/_shared/state-ownership.md +221 -0
- package/skills/architecture/DEEPENING.md +37 -0
- package/skills/architecture/INTERFACE-DESIGN.md +44 -0
- package/skills/architecture/LANGUAGE.md +53 -0
- package/skills/architecture/SKILL.md +92 -0
- package/skills/autopilot/SKILL.md +419 -0
- package/skills/bootstrap/SKILL.md +592 -0
- package/skills/bootstrap/STATE.md.template +24 -0
- package/skills/bootstrap/_shared-template.md +243 -0
- package/skills/bootstrap/deep-template.md +659 -0
- package/skills/bootstrap/fast-template.md +251 -0
- package/skills/bootstrap/intensity-heuristic.md +80 -0
- package/skills/bootstrap/public-fallback.md +342 -0
- package/skills/bootstrap/standard-template.md +736 -0
- package/skills/bootstrap/templates/agents/project-code-review.md +18 -0
- package/skills/bootstrap/templates/agents/project-discovery.md +18 -0
- package/skills/bootstrap/templates/agents/project-quality-gate.md +18 -0
- package/skills/brainstorm/SKILL.md +268 -0
- package/skills/brainstorm/soul.md +49 -0
- package/skills/claude-md-drift-check/SKILL.md +186 -0
- package/skills/claude-md-drift-check/checker.mjs +1380 -0
- package/skills/claude-md-drift-check/checker.sh +37 -0
- package/skills/claude-md-drift-check/package.json +16 -0
- package/skills/convergence-monitoring/README.md +39 -0
- package/skills/convergence-monitoring/SIGNALS.md +246 -0
- package/skills/convergence-monitoring/SKILL.md +285 -0
- package/skills/daily/SKILL.md +222 -0
- package/skills/daily/generate.sh +92 -0
- package/skills/daily/templates/daily.md.tpl +36 -0
- package/skills/debug/SKILL.md +188 -0
- package/skills/debug/soul.md +35 -0
- package/skills/discovery/SKILL.md +567 -0
- package/skills/discovery/issue-templates.md +237 -0
- package/skills/discovery/probes/docs-staleness.mjs +195 -0
- package/skills/discovery/probes/frontend-slop.mjs +186 -0
- package/skills/discovery/probes/ssot-code-diff.mjs +310 -0
- package/skills/discovery/probes/supply-chain-slopcheck.mjs +440 -0
- package/skills/discovery/probes/vault-narrative-staleness.mjs +355 -0
- package/skills/discovery/probes/vault-staleness.mjs +272 -0
- package/skills/discovery/probes-arch.md +252 -0
- package/skills/discovery/probes-audit.md +95 -0
- package/skills/discovery/probes-code.md +329 -0
- package/skills/discovery/probes-docs.md +76 -0
- package/skills/discovery/probes-feature.md +150 -0
- package/skills/discovery/probes-infra.md +138 -0
- package/skills/discovery/probes-intro.md +25 -0
- package/skills/discovery/probes-session.md +495 -0
- package/skills/discovery/probes-supply-chain.md +94 -0
- package/skills/discovery/probes-ui.md +147 -0
- package/skills/discovery/probes-vault.md +64 -0
- package/skills/discovery/slop-patterns.md +115 -0
- package/skills/dispatcher/SKILL.md +173 -0
- package/skills/docs-orchestrator/SKILL.md +362 -0
- package/skills/docs-orchestrator/audience-mapping.md +140 -0
- package/skills/domain-model/ADR-FORMAT.md +47 -0
- package/skills/domain-model/CONTEXT-FORMAT.md +77 -0
- package/skills/domain-model/SKILL.md +85 -0
- package/skills/ecosystem-health/SKILL.md +119 -0
- package/skills/ecosystem-health/wizard.md +193 -0
- package/skills/eval/SKILL.md +293 -0
- package/skills/eval/rubric-v1.md +218 -0
- package/skills/evolve/SKILL.md +546 -0
- package/skills/frontmatter-guard/SKILL.md +126 -0
- package/skills/gitlab-ops/SKILL.md +368 -0
- package/skills/gitlab-portfolio/SKILL.md +196 -0
- package/skills/grill/SKILL.md +185 -0
- package/skills/grill/soul.md +55 -0
- package/skills/hook-development/SKILL.md +413 -0
- package/skills/mcp-builder/SKILL.md +260 -0
- package/skills/memory-cleanup/SKILL.md +310 -0
- package/skills/mode-selector/SKILL.md +226 -0
- package/skills/peekaboo-driver/SKILL.md +237 -0
- package/skills/peekaboo-driver/soul.md +32 -0
- package/skills/persona-panel/SKILL.md +365 -0
- package/skills/persona-panel/persona-format.md +205 -0
- package/skills/persona-panel/presets/designer-lens.md +87 -0
- package/skills/persona-panel/presets/engineer-lens.md +88 -0
- package/skills/persona-panel/presets/pm-lens.md +86 -0
- package/skills/plan/SKILL.md +496 -0
- package/skills/plan/mode-feature.md +141 -0
- package/skills/plan/mode-new.md +297 -0
- package/skills/plan/mode-retro.md +271 -0
- package/skills/plan/prd-feature-template.md +132 -0
- package/skills/plan/prd-full-template.md +151 -0
- package/skills/plan/prd-reviewer-prompt.md +103 -0
- package/skills/plan/retro-template.md +75 -0
- package/skills/plan/soul.md +62 -0
- package/skills/playwright-driver/SKILL.md +226 -0
- package/skills/playwright-driver/soul.md +30 -0
- package/skills/quality-gates/SKILL.md +212 -0
- package/skills/reconcile/SKILL.md +324 -0
- package/skills/repo-audit/SKILL.md +272 -0
- package/skills/session-end/SKILL.md +1044 -0
- package/skills/session-end/discovery-scan.md +37 -0
- package/skills/session-end/drift-operations.md +97 -0
- package/skills/session-end/learning-patterns.md +78 -0
- package/skills/session-end/metrics-collection.md +175 -0
- package/skills/session-end/phase-3-2-docs-verification.md +148 -0
- package/skills/session-end/phase-3-6-tail.md +344 -0
- package/skills/session-end/phase-3-7a-recommendations.md +86 -0
- package/skills/session-end/plan-verification.md +288 -0
- package/skills/session-end/session-metrics-write.md +223 -0
- package/skills/session-end/vault-operations.md +50 -0
- package/skills/session-end/verification-checklist.md +20 -0
- package/skills/session-plan/SKILL.md +554 -0
- package/skills/session-plan/wave-template.md +37 -0
- package/skills/session-start/SKILL.md +1043 -0
- package/skills/session-start/phase-2-5-docs-planning.md +119 -0
- package/skills/session-start/phase-4-5-resource-health.md +49 -0
- package/skills/session-start/phase-7-1-premise-check.md +47 -0
- package/skills/session-start/phase-7-5-mode-selector.md +237 -0
- package/skills/session-start/phase-8-5-express-path.md +61 -0
- package/skills/session-start/presentation-format.md +81 -0
- package/skills/session-start/soul.md +57 -0
- package/skills/skill-creator/SKILL.md +168 -0
- package/skills/spinout/SKILL.md +76 -0
- package/skills/sunset-review/SKILL.md +96 -0
- package/skills/test-runner/SKILL.md +362 -0
- package/skills/test-runner/rubric-v1.md +388 -0
- package/skills/test-runner/soul.md +46 -0
- package/skills/tmux-layout/SKILL.md +104 -0
- package/skills/ubiquitous-language/SKILL.md +97 -0
- package/skills/using-orchestrator/SKILL.md +144 -0
- package/skills/vault-mirror/SKILL.md +234 -0
- package/skills/vault-sync/SKILL.md +319 -0
- package/skills/vault-sync/package-lock.json +40 -0
- package/skills/vault-sync/package.json +11 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/90-archive/bad-archived.md +8 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/archive-test-vault/live-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/bad-type.md +8 -0
- package/skills/vault-sync/tests/fixtures/broken-frontmatter-vault/good-note.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/.obsidian/config.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/01-projects/foo/projects-baseline.md +10 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/03-daily/daily-2026-04-13.md +8 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/clean-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/has-dangling.md +9 -0
- package/skills/vault-sync/tests/fixtures/dangling-link-vault/real-target.md +8 -0
- package/skills/vault-sync/tests/fixtures/empty-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/missing-field-vault/missing-id.md +7 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/03-daily/daily-2026-04-13.md +9 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/nested-tag-vault/nested-tags-note.md +11 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/README.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_MOC.md +3 -0
- package/skills/vault-sync/tests/fixtures/no-frontmatter-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_MOC.md +11 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/_meta/.gitkeep +0 -0
- package/skills/vault-sync/tests/fixtures/with-moc-vault/hello-world.md +11 -0
- package/skills/vault-sync/tests/schema-drift.test.mjs +133 -0
- package/skills/vault-sync/validator.mjs +658 -0
- package/skills/vault-sync/validator.sh +55 -0
- package/skills/wave-executor/SKILL.md +496 -0
- package/skills/wave-executor/circuit-breaker.md +169 -0
- package/skills/wave-executor/wave-loop.md +1043 -0
- package/skills/write-executable-plan/SKILL.md +237 -0
- package/skills/write-executable-plan/plan-template.md +154 -0
- package/templates/_minimal/CLAUDE.md.tmpl +41 -0
- package/templates/_minimal/README.md.tmpl +15 -0
- package/templates/_minimal/gitignore.tmpl +47 -0
- package/templates/_shared/harte-regeln.md +16 -0
- package/templates/_shared/loop.md +90 -0
- package/templates/_shared/rules/parallel-sessions.md +77 -0
- package/templates/nextjs-minimal/README.md +30 -0
- package/templates/nextjs-minimal/app/layout.tsx +18 -0
- package/templates/nextjs-minimal/app/page.tsx +7 -0
- package/templates/nextjs-minimal/eslint.config.mjs +16 -0
- package/templates/nextjs-minimal/next.config.mjs +4 -0
- package/templates/nextjs-minimal/package.json +27 -0
- package/templates/nextjs-minimal/tsconfig.json +23 -0
- package/templates/node-minimal/README.md +33 -0
- package/templates/node-minimal/eslint.config.mjs +10 -0
- package/templates/node-minimal/package.json +21 -0
- package/templates/node-minimal/src/index.ts +1 -0
- package/templates/node-minimal/tests/sanity.test.ts +5 -0
- package/templates/node-minimal/tsconfig.json +17 -0
- package/templates/personas/README.md +150 -0
- package/templates/personas/accounting-compliance.v1.md +120 -0
- package/templates/personas/accounting-tax-advisor.v1.md +116 -0
- package/templates/personas/buyer-p1-cto.v1.md +125 -0
- package/templates/personas/buyer-p2-kanzlei.v1.md +134 -0
- package/templates/personas/buyer-p3-build.v1.md +130 -0
- package/templates/personas/buyer-p4-tech-veto.v1.md +130 -0
- package/templates/personas/buyer-p5-solo.v1.md +132 -0
- package/templates/personas/buyer-p6-ld.v1.md +130 -0
- package/templates/personas/klima-ai-expert.v1.md +114 -0
- package/templates/personas/klima-physicist.v1.md +117 -0
- package/templates/python-uv/README.md +28 -0
- package/templates/python-uv/pyproject.toml +32 -0
- package/templates/python-uv/src/__PROJECT_NAME__/__init__.py +0 -0
- package/templates/python-uv/src/__PROJECT_NAME__/main.py +6 -0
- package/templates/python-uv/tests/test_sanity.py +2 -0
- package/templates/static-html/README.md +19 -0
- package/templates/static-html/index.html +15 -0
- package/templates/static-html/script.js +1 -0
- 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
|
+
}
|