session-orchestrator 5.1.0 → 5.3.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/.agents/skills/architecture/SKILL.md +3 -1
- package/.agents/skills/autopilot/SKILL.md +6 -1
- package/.agents/skills/autopilot/agents/openai.yaml +5 -0
- package/.agents/skills/bootstrap/SKILL.md +7 -1
- package/.agents/skills/bootstrap/agents/openai.yaml +5 -0
- package/.agents/skills/brainstorm/SKILL.md +8 -1
- package/.agents/skills/brainstorm/agents/openai.yaml +5 -0
- package/.agents/skills/claude-md-drift-check/SKILL.md +3 -1
- package/.agents/skills/close/SKILL.md +21 -0
- package/.agents/skills/close/agents/openai.yaml +5 -0
- package/.agents/skills/convergence-monitoring/SKILL.md +4 -2
- package/.agents/skills/debug/SKILL.md +7 -1
- package/.agents/skills/debug/agents/openai.yaml +5 -0
- package/.agents/skills/discovery/SKILL.md +7 -2
- package/.agents/skills/discovery/agents/openai.yaml +5 -0
- package/.agents/skills/dispatcher/SKILL.md +7 -1
- package/.agents/skills/dispatcher/agents/openai.yaml +5 -0
- package/.agents/skills/docs-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ecosystem-health/SKILL.md +3 -1
- package/.agents/skills/eli5/SKILL.md +7 -1
- package/.agents/skills/eli5/agents/openai.yaml +5 -0
- package/.agents/skills/eval/SKILL.md +7 -2
- package/.agents/skills/eval/agents/openai.yaml +5 -0
- package/.agents/skills/evolve/SKILL.md +8 -3
- package/.agents/skills/evolve/agents/openai.yaml +5 -0
- package/.agents/skills/frontmatter-guard/SKILL.md +3 -1
- package/.agents/skills/gitlab-ops/SKILL.md +3 -1
- package/.agents/skills/gitlab-portfolio/SKILL.md +3 -1
- package/.agents/skills/go/SKILL.md +22 -0
- package/.agents/skills/go/agents/openai.yaml +5 -0
- package/.agents/skills/grill/SKILL.md +7 -1
- package/.agents/skills/grill/agents/openai.yaml +5 -0
- package/.agents/skills/harness-audit/SKILL.md +20 -0
- package/.agents/skills/harness-audit/agents/openai.yaml +5 -0
- package/.agents/skills/hook-development/SKILL.md +3 -1
- package/.agents/skills/mcp-builder/SKILL.md +3 -1
- package/.agents/skills/memory-cleanup/SKILL.md +6 -1
- package/.agents/skills/memory-cleanup/agents/openai.yaml +5 -0
- package/.agents/skills/mode-selector/SKILL.md +3 -1
- package/.agents/skills/npm-publish/SKILL.md +4 -2
- package/.agents/skills/peekaboo-driver/SKILL.md +3 -1
- package/.agents/skills/persona-panel/SKILL.md +6 -1
- package/.agents/skills/persona-panel/agents/openai.yaml +5 -0
- package/.agents/skills/plan/SKILL.md +8 -2
- package/.agents/skills/plan/agents/openai.yaml +5 -0
- package/.agents/skills/playwright-driver/SKILL.md +3 -1
- package/.agents/skills/portfolio/SKILL.md +21 -0
- package/.agents/skills/portfolio/agents/openai.yaml +5 -0
- package/.agents/skills/quality-gates/SKILL.md +3 -1
- package/.agents/skills/reconcile/SKILL.md +6 -1
- package/.agents/skills/reconcile/agents/openai.yaml +5 -0
- package/.agents/skills/release/SKILL.md +22 -0
- package/.agents/skills/release/agents/openai.yaml +5 -0
- package/.agents/skills/remote-offload/SKILL.md +3 -1
- package/.agents/skills/repo-audit/SKILL.md +6 -1
- package/.agents/skills/repo-audit/agents/openai.yaml +5 -0
- package/.agents/skills/session/SKILL.md +21 -0
- package/.agents/skills/session/agents/openai.yaml +5 -0
- package/.agents/skills/session-end/SKILL.md +3 -1
- package/.agents/skills/session-plan/SKILL.md +3 -1
- package/.agents/skills/session-start/SKILL.md +3 -1
- package/.agents/skills/spinout/SKILL.md +6 -1
- package/.agents/skills/spinout/agents/openai.yaml +5 -0
- package/.agents/skills/sunset-review/SKILL.md +7 -1
- package/.agents/skills/sunset-review/agents/openai.yaml +5 -0
- package/.agents/skills/templates-ack/SKILL.md +21 -0
- package/.agents/skills/templates-ack/agents/openai.yaml +5 -0
- package/.agents/skills/test/SKILL.md +21 -0
- package/.agents/skills/test/agents/openai.yaml +5 -0
- package/.agents/skills/test-runner/SKILL.md +3 -1
- package/.agents/skills/tmux-layout/SKILL.md +3 -1
- package/.agents/skills/using-orchestrator/SKILL.md +3 -1
- package/.agents/skills/ux-grill/SKILL.md +7 -1
- package/.agents/skills/ux-grill/agents/openai.yaml +5 -0
- package/.agents/skills/vault-mirror/SKILL.md +3 -1
- package/.agents/skills/vault-sync/SKILL.md +3 -1
- package/.agents/skills/wave-executor/SKILL.md +3 -1
- package/.agents/skills/write-executable-plan/SKILL.md +3 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +4 -4
- package/.codex-plugin/skills/autopilot/SKILL.md +5 -4
- package/.codex-plugin/skills/bootstrap/SKILL.md +8 -4
- package/.codex-plugin/skills/brainstorm/SKILL.md +11 -4
- package/.codex-plugin/skills/close/SKILL.md +3 -3
- package/.codex-plugin/skills/convergence-monitoring/SKILL.md +1 -1
- package/.codex-plugin/skills/debug/SKILL.md +11 -4
- package/.codex-plugin/skills/discovery/SKILL.md +8 -4
- package/.codex-plugin/skills/dispatcher/SKILL.md +4 -4
- package/.codex-plugin/skills/eli5/SKILL.md +9 -4
- package/.codex-plugin/skills/eval/SKILL.md +9 -4
- package/.codex-plugin/skills/evolve/SKILL.md +9 -4
- package/.codex-plugin/skills/go/SKILL.md +3 -3
- package/.codex-plugin/skills/grill/SKILL.md +11 -4
- package/.codex-plugin/skills/harness-audit/SKILL.md +4 -3
- package/.codex-plugin/skills/memory-cleanup/SKILL.md +9 -4
- package/.codex-plugin/skills/npm-publish/SKILL.md +1 -1
- package/.codex-plugin/skills/persona-panel/SKILL.md +5 -5
- package/.codex-plugin/skills/plan/SKILL.md +8 -4
- package/.codex-plugin/skills/portfolio/SKILL.md +3 -3
- package/.codex-plugin/skills/reconcile/SKILL.md +9 -4
- package/.codex-plugin/skills/release/SKILL.md +3 -3
- package/.codex-plugin/skills/repo-audit/SKILL.md +6 -4
- package/.codex-plugin/skills/session/SKILL.md +1 -1
- package/.codex-plugin/skills/spinout/SKILL.md +4 -4
- package/.codex-plugin/skills/sunset-review/SKILL.md +5 -4
- package/.codex-plugin/skills/test/SKILL.md +3 -3
- package/.codex-plugin/skills/ux-grill/SKILL.md +11 -4
- package/.cursor/commands/autopilot.md +4 -4
- package/.cursor/commands/bootstrap.md +5 -4
- package/.cursor/commands/brainstorm.md +5 -4
- package/.cursor/commands/close.md +4 -3
- package/.cursor/commands/debug.md +4 -4
- package/.cursor/commands/discovery.md +4 -4
- package/.cursor/commands/dispatcher.md +4 -4
- package/.cursor/commands/eli5.md +4 -4
- package/.cursor/commands/eval.md +4 -4
- package/.cursor/commands/evolve.md +4 -4
- package/.cursor/commands/go.md +4 -3
- package/.cursor/commands/grill.md +4 -4
- package/.cursor/commands/harness-audit.md +3 -3
- package/.cursor/commands/memory-cleanup.md +4 -4
- package/.cursor/commands/persona-panel.md +4 -4
- package/.cursor/commands/plan.md +5 -4
- package/.cursor/commands/portfolio.md +3 -3
- package/.cursor/commands/reconcile.md +4 -4
- package/.cursor/commands/release.md +4 -3
- package/.cursor/commands/repo-audit.md +4 -4
- package/.cursor/commands/session.md +1 -1
- package/.cursor/commands/spinout.md +4 -4
- package/.cursor/commands/sunset-review.md +4 -4
- package/.cursor/commands/test.md +3 -3
- package/.cursor/commands/ux-grill.md +4 -4
- package/.cursor/rules/000-session-orchestrator.mdc +0 -2
- package/.cursor/rules/010-session-workflow.mdc +2 -2
- package/.cursor/rules/050-plan.mdc +1 -1
- package/.cursor/skills/bootstrap/SKILL.md +1 -0
- package/.cursor/skills/close/SKILL.md +13 -0
- package/.cursor/skills/convergence-monitoring/SKILL.md +1 -0
- package/.cursor/skills/debug/SKILL.md +0 -1
- package/.cursor/skills/discovery/SKILL.md +0 -1
- package/.cursor/skills/dispatcher/SKILL.md +0 -1
- package/.cursor/skills/eli5/SKILL.md +0 -1
- package/.cursor/skills/eval/SKILL.md +1 -1
- package/.cursor/skills/evolve/SKILL.md +0 -1
- package/.cursor/skills/go/SKILL.md +13 -0
- package/.cursor/skills/grill/SKILL.md +0 -1
- package/.cursor/skills/harness-audit/SKILL.md +12 -0
- package/.cursor/skills/npm-publish/SKILL.md +1 -0
- package/.cursor/skills/portfolio/SKILL.md +12 -0
- package/.cursor/skills/release/SKILL.md +13 -0
- package/.cursor/skills/repo-audit/SKILL.md +0 -1
- package/.cursor/skills/sunset-review/SKILL.md +0 -1
- package/.cursor/skills/test/SKILL.md +12 -0
- package/.cursor/skills/ux-grill/SKILL.md +0 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.orchestrator/policy/blocked-commands.json +13 -4
- package/AGENTS.md +3 -2
- package/CHANGELOG.md +197 -0
- package/README.md +11 -9
- package/SECURITY.md +12 -0
- package/agents/dialectic-deriver.md +13 -10
- package/agents/eval-judge.md +67 -45
- package/agents/skill-applied-judge.md +34 -19
- package/commands/session.md +17 -3
- package/docs/baseline.md +12 -6
- package/docs/ci-setup.md +53 -0
- package/docs/codex-setup.md +15 -3
- package/docs/components.md +13 -6
- package/docs/events-schema.md +59 -9
- package/docs/install.md +16 -0
- package/docs/persona-panel.md +1 -1
- package/docs/pi-setup.md +1 -1
- package/docs/rule-authoring.md +135 -14
- package/docs/scope-collision-guard.md +2 -0
- package/docs/session-config-reference.md +106 -11
- package/docs/session-config-template.md +31 -2
- package/docs/telemetry.md +2 -0
- package/hooks/_lib/hook-import-set.json +125 -8
- package/hooks/_lib/subagent-paths.mjs +15 -0
- package/hooks/_lib/subagent-transcript.mjs +582 -31
- package/hooks/_lib/vcs-create-matcher.mjs +217 -62
- package/hooks/config-protection.mjs +11 -3
- package/hooks/cwd-change-restore.mjs +11 -3
- package/hooks/enforce-commands.mjs +70 -23
- package/hooks/enforce-scope.mjs +143 -33
- package/hooks/hooks-codex.json +1 -1
- package/hooks/hooks.json +1 -1
- package/hooks/loop-guard.mjs +11 -3
- package/hooks/on-session-end.mjs +72 -25
- package/hooks/on-session-start.mjs +48 -11
- package/hooks/on-stop.mjs +211 -23
- package/hooks/operator-steer.mjs +11 -3
- package/hooks/post-bash-issue-budget-refund.mjs +18 -8
- package/hooks/post-bash-write-verify.mjs +6 -2
- package/hooks/post-edit-import-probe.mjs +17 -9
- package/hooks/post-edit-validate.mjs +13 -5
- package/hooks/post-subagent-discovery-validator.mjs +98 -13
- package/hooks/post-tool-batch-wave-signal.mjs +200 -38
- package/hooks/post-tool-failure-corrective-context.mjs +11 -5
- package/hooks/post-tooluse-frontend-slop.mjs +10 -4
- package/hooks/pre-auq-clarity.mjs +18 -2
- package/hooks/pre-bash-destructive-guard.mjs +80 -9
- package/hooks/pre-bash-issue-budget.mjs +119 -28
- package/hooks/pre-bash-memory-propose-audit.mjs +86 -54
- package/hooks/pre-bash-sessions-ledger-guard.mjs +391 -20
- package/hooks/pre-bash-staging-fence.mjs +335 -31
- package/hooks/pre-bash-templates-first.mjs +19 -14
- package/hooks/pre-task-scope-disjoint.mjs +385 -5
- package/hooks/skill-invocation-telemetry.mjs +2 -1
- package/hooks/subagent-telemetry.mjs +15 -19
- package/hooks/wave-scope-commit-guard.mjs +197 -100
- package/monitors/monitors.json +1 -1
- package/output-styles/wave-summary.md +1 -1
- package/package.json +2 -1
- package/pi/prompts/autopilot.md +3 -3
- package/pi/prompts/bootstrap.md +3 -3
- package/pi/prompts/brainstorm.md +3 -3
- package/pi/prompts/close.md +2 -2
- package/pi/prompts/debug.md +3 -3
- package/pi/prompts/discovery.md +3 -3
- package/pi/prompts/dispatcher.md +3 -3
- package/pi/prompts/eli5.md +3 -3
- package/pi/prompts/eval.md +3 -3
- package/pi/prompts/evolve.md +3 -3
- package/pi/prompts/go.md +2 -2
- package/pi/prompts/grill.md +3 -3
- package/pi/prompts/harness-audit.md +2 -3
- package/pi/prompts/memory-cleanup.md +3 -3
- package/pi/prompts/persona-panel.md +3 -3
- package/pi/prompts/plan.md +3 -3
- package/pi/prompts/portfolio.md +2 -2
- package/pi/prompts/reconcile.md +3 -3
- package/pi/prompts/release.md +3 -3
- package/pi/prompts/repo-audit.md +3 -4
- package/pi/prompts/session.md +2 -2
- package/pi/prompts/spinout.md +3 -3
- package/pi/prompts/sunset-review.md +3 -3
- package/pi/prompts/templates-ack.md +1 -1
- package/pi/prompts/test.md +3 -3
- package/pi/prompts/ux-grill.md +3 -3
- package/rules/README.md +1 -1
- package/rules/opt-in-domain/prompt-caching.md +1 -1
- package/rules/opt-in-stack/backend-data.md +1 -1
- package/rules/opt-in-stack/backend.md +3 -3
- package/rules/opt-in-stack/frontend.md +1 -1
- package/rules/opt-in-stack/security-web.md +3 -3
- package/rules/opt-in-stack/swift.md +1 -1
- package/scripts/archive-closed-prds.mjs +2 -2
- package/scripts/auq-audit.mjs +2 -3
- package/scripts/autopilot.mjs +23 -2
- package/scripts/backfill-abandoned-sessions.mjs +171 -15
- package/scripts/backfill-evidence-digest.mjs +2 -1
- package/scripts/backfill-learnings-from-vault.mjs +2 -2
- package/scripts/check-package-manager.mjs +2 -2
- package/scripts/check-sessions-integrity.mjs +300 -0
- package/scripts/ci/assert-vitest-green.mjs +2 -1
- package/scripts/dialectic-deriver.mjs +50 -13
- package/scripts/emit-session.mjs +77 -32
- package/scripts/eval-session.mjs +65 -3
- package/scripts/export-hw-learnings.mjs +2 -1
- package/scripts/express-path.mjs +1 -1
- package/scripts/gc-stale-worktrees.mjs +2 -1
- package/scripts/generate-agents-skills.mjs +102 -29
- package/scripts/generate-codex-skills.mjs +48 -4
- package/scripts/generate-cursor-adapter.mjs +220 -11
- package/scripts/generate-hook-import-set.mjs +12 -27
- package/scripts/generate-pi-prompts.mjs +183 -13
- package/scripts/github-protection-audit.mjs +2 -3
- package/scripts/lib/agent-frontmatter.mjs +23 -1
- package/scripts/lib/agent-status.mjs +2 -31
- package/scripts/lib/auq/clarity.mjs +10 -2
- package/scripts/lib/auq/parse.mjs +12 -31
- package/scripts/lib/auq/schema.mjs +56 -41
- package/scripts/lib/auto-dialectic.mjs +304 -15
- package/scripts/lib/autopilot/flags.mjs +12 -1
- package/scripts/lib/autopilot/kill-switches.mjs +6 -3
- package/scripts/lib/autopilot/loop.mjs +14 -1
- package/scripts/lib/autopilot/stall-sampler.mjs +80 -23
- package/scripts/lib/ci-status-banner.mjs +376 -16
- package/scripts/lib/claude-md-budget-lint.mjs +2 -5
- package/scripts/lib/command-blocker.mjs +408 -33
- package/scripts/lib/config/dialectic.mjs +12 -3
- package/scripts/lib/config/drift-check.mjs +19 -0
- package/scripts/lib/config/gate.mjs +74 -0
- package/scripts/lib/config/reaper.mjs +162 -0
- package/scripts/lib/config.mjs +14 -0
- package/scripts/lib/convergence-monitor.mjs +76 -13
- package/scripts/lib/cursor-hook-bridge.mjs +2 -2
- package/scripts/lib/description-surface.mjs +2 -5
- package/scripts/lib/dispatcher/cli.mjs +2 -1
- package/scripts/lib/ecosystem-health.mjs +11 -0
- package/scripts/lib/ecosystem-wizard.mjs +2 -1
- package/scripts/lib/eval/engine.mjs +421 -53
- package/scripts/lib/eval/judge.mjs +463 -40
- package/scripts/lib/eval/schema.mjs +10 -1
- package/scripts/lib/events-rotation.mjs +221 -25
- package/scripts/lib/events-schema.mjs +114 -0
- package/scripts/lib/events.mjs +524 -5
- package/scripts/lib/fetch-baseline.mjs +3 -8
- package/scripts/lib/frontmatter-guard.mjs +21 -10
- package/scripts/lib/gates/gate-baseline.mjs +27 -2
- package/scripts/lib/gates/gate-full.mjs +28 -3
- package/scripts/lib/gates/gate-helpers.mjs +243 -21
- package/scripts/lib/gates/gate-incremental.mjs +28 -3
- package/scripts/lib/gates/gate-per-file.mjs +27 -2
- package/scripts/lib/gitlab-ops/stale-mr-sweep.mjs +2 -1
- package/scripts/lib/gitlab-portfolio/cli.mjs +2 -1
- package/scripts/lib/gitlab-portfolio/markdown-writer.mjs +6 -1
- package/scripts/lib/instruction-budget-guard.mjs +332 -50
- package/scripts/lib/io.mjs +42 -8
- package/scripts/lib/is-main-module.mjs +82 -0
- package/scripts/lib/issue-close-strip-labels.mjs +207 -49
- package/scripts/lib/js-mask.mjs +197 -0
- package/scripts/lib/learnings/evolve-telemetry.mjs +11 -7
- package/scripts/lib/locks/index.mjs +32 -25
- package/scripts/lib/maintenance-due-banner.mjs +122 -91
- package/scripts/lib/orphan-reaper.mjs +1588 -0
- package/scripts/lib/peer-cards/merger.mjs +48 -10
- package/scripts/lib/peer-cards/reader.mjs +78 -2
- package/scripts/lib/peer-discovery.mjs +2 -5
- package/scripts/lib/playwright-driver/runner.mjs +2 -1
- package/scripts/lib/process-group.mjs +899 -0
- package/scripts/lib/quality-gate.mjs +107 -28
- package/scripts/lib/reconcile/backlog.mjs +368 -0
- package/scripts/lib/reconcile/engine.mjs +55 -188
- package/scripts/lib/reconcile/rule-expiry-sweep.mjs +884 -0
- package/scripts/lib/reconcile/sanitize.mjs +69 -3
- package/scripts/lib/reconcile-nudge-banner.mjs +138 -45
- package/scripts/lib/resource-probe/parsers.mjs +31 -0
- package/scripts/lib/rule-loader.mjs +41 -12
- package/scripts/lib/rules-sync.mjs +2 -5
- package/scripts/lib/scope-echo.mjs +429 -7
- package/scripts/lib/scope-gate.mjs +605 -1
- package/scripts/lib/session-close-backfill.mjs +91 -12
- package/scripts/lib/session-id.mjs +9 -20
- package/scripts/lib/session-invocation.mjs +20 -0
- package/scripts/lib/session-schema/constants.mjs +30 -2
- package/scripts/lib/session-schema/normalizer.mjs +56 -4
- package/scripts/lib/session-schema.mjs +8 -3
- package/scripts/lib/session-start-probes.mjs +95 -10
- package/scripts/lib/sessions-canonical.mjs +23 -0
- package/scripts/lib/sessions-integrity-banner.mjs +7 -1
- package/scripts/lib/sessions-staleness-banner.mjs +193 -51
- package/scripts/lib/skill-evidence-window.mjs +891 -0
- package/scripts/lib/skill-evolution/candidate-intake.mjs +133 -12
- package/scripts/lib/skill-evolution/engine.mjs +18 -9
- package/scripts/lib/skill-judge.mjs +45 -3
- package/scripts/lib/state-md.mjs +84 -3
- package/scripts/lib/sunset/walker.mjs +31 -4
- package/scripts/lib/tail-window.mjs +56 -0
- package/scripts/lib/telemetry/schema.mjs +30 -0
- package/scripts/lib/telemetry/sync.mjs +61 -6
- package/scripts/lib/telemetry-flush-health-banner.mjs +4 -22
- package/scripts/lib/test-runner/issue-reconcile.mjs +48 -16
- package/scripts/lib/tests-src-ratio.mjs +2 -6
- package/scripts/lib/tmux-layout/telemetry-stats.mjs +74 -14
- package/scripts/lib/user-invocable-skills.mjs +205 -0
- package/scripts/lib/ux-grill/reconcile.mjs +48 -22
- package/scripts/lib/validate/check-agents-skills.mjs +26 -15
- package/scripts/lib/validate/check-banner-parity.mjs +2 -2
- package/scripts/lib/validate/check-cursor-adapter.mjs +3 -2
- package/scripts/lib/validate/check-dead-bridge.mjs +2 -2
- package/scripts/lib/validate/check-doc-cli-commands.mjs +2 -2
- package/scripts/lib/validate/check-entry-guard.mjs +329 -0
- package/scripts/lib/validate/check-guard-requires-parity.mjs +2 -2
- package/scripts/lib/validate/check-hook-entry-guards.mjs +636 -0
- package/scripts/lib/validate/check-hooks-emit-event-guard.mjs +2 -2
- package/scripts/lib/validate/check-learning-provenance.mjs +2 -2
- package/scripts/lib/validate/check-pi-prompts.mjs +1 -0
- package/scripts/lib/validate/check-rules.mjs +7 -5
- package/scripts/lib/validate/check-skill-links.mjs +35 -6
- package/scripts/lib/validate/check-skill-script-paths.mjs +241 -29
- package/scripts/lib/validate/check-test-git-config-target.mjs +26 -36
- package/scripts/lib/validate/check-unicode-safety.mjs +2 -2
- package/scripts/lib/validate/check-untracked-test-deps.mjs +9 -104
- package/scripts/lib/validate/check-unwired-features.mjs +220 -33
- package/scripts/lib/validate/check-validator-registration.mjs +36 -12
- package/scripts/lib/validate/check-vcs-repo-flag.mjs +2 -2
- package/scripts/lib/validate/confidential-names.mjs +10 -0
- package/scripts/lib/validate-vendored-rules.mjs +39 -12
- package/scripts/lib/vault-mirror/namespace.mjs +46 -8
- package/scripts/lib/vault-mirror/process.mjs +10 -3
- package/scripts/lib/vault-mirror/render-sessions.mjs +12 -2
- package/scripts/lib/vault-status/narrative-mirror.mjs +31 -7
- package/scripts/lib/vault-yaml.mjs +118 -0
- package/scripts/lib/wave-transcript-tail.mjs +2 -2
- package/scripts/lib/worktree/lifecycle.mjs +153 -1
- package/scripts/lock-reaper.mjs +2 -1
- package/scripts/materialize-wave-scope.mjs +87 -4
- package/scripts/migrate-sessions-jsonl.mjs +2 -1
- package/scripts/migrate-vault-paths.mjs +2 -3
- package/scripts/release-session-lock.mjs +305 -0
- package/scripts/release.mjs +109 -39
- package/scripts/relocate-vault-corpus.mjs +2 -3
- package/scripts/repair-invalid-sessions.mjs +2 -2
- package/scripts/resolve-session-invocation.mjs +59 -0
- package/scripts/run-quality-gate.mjs +156 -17
- package/scripts/session-shape.mjs +2 -2
- package/scripts/site-numbers.mjs +35 -11
- package/scripts/sweep-expired-rules.mjs +227 -0
- package/scripts/validate-plugin.mjs +21 -0
- package/scripts/validate-wave-scope.mjs +32 -105
- package/scripts/vault-consolidate.mjs +2 -2
- package/scripts/vault-mirror.mjs +11 -4
- package/scripts/wave-scope-binding.mjs +2 -3
- package/skills/_shared/bootstrap-gate.md +1 -1
- package/skills/_shared/monitor-patterns.md +1 -1
- package/skills/_shared/platform-tools.md +23 -11
- package/skills/_shared/research-evidence.md +53 -0
- package/skills/_shared/state-ownership.md +3 -0
- package/skills/autopilot/SKILL.md +80 -11
- package/skills/bootstrap/SKILL.md +51 -1
- package/skills/brainstorm/SKILL.md +16 -0
- package/skills/claude-md-drift-check/SKILL.md +1 -1
- package/skills/claude-md-drift-check/checker.mjs +49 -11
- package/{commands/close.md → skills/close/SKILL.md} +9 -3
- package/skills/convergence-monitoring/README.md +8 -1
- package/skills/convergence-monitoring/SIGNALS.md +50 -6
- package/skills/convergence-monitoring/SKILL.md +15 -6
- package/skills/debug/SKILL.md +10 -0
- package/skills/discovery/SKILL.md +24 -1
- package/skills/discovery/probes-session.md +2 -2
- package/skills/dispatcher/SKILL.md +38 -7
- package/skills/eli5/SKILL.md +11 -0
- package/skills/eval/SKILL.md +52 -23
- package/skills/eval/rubric-v1.md +1 -0
- package/skills/eval/rubric-v2.md +457 -0
- package/skills/evolve/SKILL.md +9 -2
- package/skills/evolve/references/evolve-dialectic-mode.md +46 -25
- package/skills/gitlab-ops/SKILL.md +3 -2
- package/{commands/go.md → skills/go/SKILL.md} +9 -1
- package/skills/grill/SKILL.md +19 -0
- package/{commands/harness-audit.md → skills/harness-audit/SKILL.md} +7 -2
- package/skills/hook-development/SKILL.md +46 -41
- package/skills/memory-cleanup/SKILL.md +7 -0
- package/skills/npm-publish/SKILL.md +2 -2
- package/skills/persona-panel/SKILL.md +56 -1
- package/skills/persona-panel/persona-format.md +1 -1
- package/skills/plan/SKILL.md +28 -1
- package/{commands/portfolio.md → skills/portfolio/SKILL.md} +8 -2
- package/skills/reconcile/SKILL.md +21 -0
- package/{commands/release.md → skills/release/SKILL.md} +16 -2
- package/skills/repo-audit/SKILL.md +7 -0
- package/skills/session-end/SKILL.md +13 -16
- package/skills/session-end/discovery-scan.md +1 -1
- package/skills/session-end/phase-3-6-tail.md +55 -9
- package/skills/session-end/plan-verification.md +2 -2
- package/skills/session-end/references/phase-5-issue-cleanup.md +9 -14
- package/skills/session-end/session-metrics-write.md +10 -0
- package/skills/session-plan/SKILL.md +18 -6
- package/skills/session-plan/references/session-plan-task-classification.md +2 -2
- package/skills/session-start/SKILL.md +5 -4
- package/skills/session-start/phase-8-5-express-path.md +6 -6
- package/skills/session-start/references/phase-1-5-session-continuity.md +1 -1
- package/skills/session-start/references/phase-2-7-portfolio-snapshot.md +1 -1
- package/skills/session-start/references/phase-4-ssot-environment-check.md +6 -4
- package/skills/spinout/SKILL.md +12 -1
- package/skills/sunset-review/SKILL.md +13 -0
- package/{commands/test.md → skills/test/SKILL.md} +10 -4
- package/skills/ux-grill/SKILL.md +20 -2
- package/skills/wave-executor/SKILL.md +14 -7
- package/skills/wave-executor/circuit-breaker.md +2 -0
- package/skills/wave-executor/references/wave-executor-state-init.md +18 -4
- package/skills/wave-executor/references/wave-loop-dispatch.md +5 -2
- package/skills/wave-executor/references/wave-loop-review.md +17 -1
- package/commands/autopilot.md +0 -80
- package/commands/bootstrap.md +0 -56
- package/commands/brainstorm.md +0 -48
- package/commands/debug.md +0 -36
- package/commands/discovery.md +0 -32
- package/commands/dispatcher.md +0 -59
- package/commands/eli5.md +0 -33
- package/commands/eval.md +0 -28
- package/commands/evolve.md +0 -10
- package/commands/grill.md +0 -45
- package/commands/memory-cleanup.md +0 -26
- package/commands/persona-panel.md +0 -121
- package/commands/plan.md +0 -15
- package/commands/reconcile.md +0 -23
- package/commands/repo-audit.md +0 -24
- package/commands/spinout.md +0 -15
- package/commands/sunset-review.md +0 -27
- package/commands/ux-grill.md +0 -51
|
@@ -41,63 +41,7 @@ import { join } from 'node:path';
|
|
|
41
41
|
// consumer repo or a test tmp-dir.
|
|
42
42
|
import { pathMatchesPattern, findScopeFile } from '../scripts/lib/hardening.mjs';
|
|
43
43
|
import { withStagingFenceLock } from '../scripts/lib/session-lock.mjs';
|
|
44
|
-
|
|
45
|
-
const repoRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
|
|
46
|
-
// #801: resolve wave-scope.json via the same precedence every other reader
|
|
47
|
-
// uses (.pi/.cursor/.codex/.claude — scope-gate.mjs findScopeFile). The prior
|
|
48
|
-
// hardcoded `.orchestrator/wave-scope.json` path was DEAD — the coordinator
|
|
49
|
-
// writes wave-scope.json to the state dir (.claude/ on Claude Code; see
|
|
50
|
-
// skills/wave-executor/wave-loop.md), so this guard never fired. findScopeFile
|
|
51
|
-
// returns null when no scope file exists at any precedence dir, preserving
|
|
52
|
-
// the "no active wave → exit 0" semantics below.
|
|
53
|
-
const scopePath = findScopeFile(repoRoot);
|
|
54
|
-
const fenceDir = join(repoRoot, '.orchestrator', 'staging-fence');
|
|
55
|
-
|
|
56
|
-
// ---------------------------------------------------------------------------
|
|
57
|
-
// Sub-mode B — allowedPaths check
|
|
58
|
-
// ---------------------------------------------------------------------------
|
|
59
|
-
|
|
60
|
-
const stagedOutput = execSync('git diff --cached --name-only', { encoding: 'utf8' });
|
|
61
|
-
const stagedFiles = stagedOutput.split('\n').filter(Boolean);
|
|
62
|
-
|
|
63
|
-
if (scopePath) {
|
|
64
|
-
let scope;
|
|
65
|
-
try {
|
|
66
|
-
scope = JSON.parse(readFileSync(scopePath, 'utf8'));
|
|
67
|
-
} catch (err) {
|
|
68
|
-
process.stderr.write(`wave-scope-commit-guard: failed to parse wave-scope.json: ${err.message}\n`);
|
|
69
|
-
process.exit(1);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const allowedPaths = Array.isArray(scope.allowedPaths) ? scope.allowedPaths : [];
|
|
73
|
-
if (allowedPaths.length > 0) {
|
|
74
|
-
const violations = stagedFiles.filter(
|
|
75
|
-
(f) => !allowedPaths.some((pattern) => pathMatchesPattern(f, pattern)),
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
if (violations.length > 0) {
|
|
79
|
-
process.stderr.write('✗ wave-scope-commit-guard: staged paths outside wave-scope.allowedPaths:\n');
|
|
80
|
-
for (const v of violations) process.stderr.write(` - ${v}\n`);
|
|
81
|
-
process.stderr.write('\nThese files were likely added by lint-staged eslint --fix / prettier --write.\n');
|
|
82
|
-
process.stderr.write('To proceed:\n');
|
|
83
|
-
process.stderr.write(' 1) git restore --staged <path> # for each foreign path\n');
|
|
84
|
-
process.stderr.write(' 2) git commit # retry\n');
|
|
85
|
-
process.exit(1);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
// Sub-mode C — cross-agent staging-fence reconciliation (issue #552)
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
//
|
|
94
|
-
// Skip entirely when no fence dir exists OR no staged files. The fence dir
|
|
95
|
-
// only appears when a wave-agent invoked `git add` while SO_WAVE_AGENT=1.
|
|
96
|
-
// Manual / coordinator commits never write a fence file, so this branch
|
|
97
|
-
// short-circuits to exit 0 for them (AC5 safe-default).
|
|
98
|
-
if (!existsSync(fenceDir) || stagedFiles.length === 0) {
|
|
99
|
-
process.exit(0);
|
|
100
|
-
}
|
|
44
|
+
import { isMainModule } from '../scripts/lib/is-main-module.mjs';
|
|
101
45
|
|
|
102
46
|
// Resolve the "current" agent id from SO_WAVE_AGENT_ID (when set by the
|
|
103
47
|
// caller) or fall back to a PID-derived marker. The fence files themselves
|
|
@@ -105,11 +49,20 @@ if (!existsSync(fenceDir) || stagedFiles.length === 0) {
|
|
|
105
49
|
// fence entries (we cross-check against SIBLINGS, not ourselves).
|
|
106
50
|
const ownAgentId = process.env.SO_WAVE_AGENT_ID ?? null;
|
|
107
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Recorded by the writer when a staging command stages a set no path operand
|
|
54
|
+
* names (`git add -A`, `git add .`, `git add -u`). Overlaps everything.
|
|
55
|
+
* Mirrors ALL_PATHS_MARKER in hooks/pre-bash-staging-fence.mjs.
|
|
56
|
+
*/
|
|
57
|
+
const ALL_PATHS_MARKER = '*';
|
|
58
|
+
|
|
108
59
|
/**
|
|
109
60
|
* Build a regex that finds a staged path inside a `git add` command string.
|
|
110
61
|
* Word-boundary on both sides so `src/foo.ts` does not match `src/foo.ts.bak`.
|
|
111
62
|
* The path is escaped so glob metacharacters (`*`, `?`) and shell metas
|
|
112
63
|
* cannot be reinterpreted.
|
|
64
|
+
*
|
|
65
|
+
* LEGACY PATH ONLY since #1404 — see the fallback branch in findOverlaps.
|
|
113
66
|
*/
|
|
114
67
|
function pathRegex(p) {
|
|
115
68
|
const escaped = p.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
@@ -117,8 +70,56 @@ function pathRegex(p) {
|
|
|
117
70
|
}
|
|
118
71
|
|
|
119
72
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
73
|
+
* Normalise a path token so reader and writer compare the same spelling.
|
|
74
|
+
*
|
|
75
|
+
* DELIBERATE DUPLICATE of the identically-named function in
|
|
76
|
+
* hooks/pre-bash-staging-fence.mjs: this guard is a husky pre-commit hook
|
|
77
|
+
* outside the Claude-Code hook import set, and the two sides must agree byte
|
|
78
|
+
* for byte. Change one, change both.
|
|
79
|
+
*
|
|
80
|
+
* @param {string} raw
|
|
81
|
+
* @returns {string}
|
|
82
|
+
*/
|
|
83
|
+
function normalizeStagedPath(raw) {
|
|
84
|
+
let p = String(raw).trim();
|
|
85
|
+
while (p.startsWith('./')) p = p.slice(2);
|
|
86
|
+
p = p.replace(/\/{2,}/g, '/');
|
|
87
|
+
while (p.length > 1 && p.endsWith('/')) p = p.slice(0, -1);
|
|
88
|
+
return p;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Does a path a sibling recorded overlap one of OUR staged files? Both sides
|
|
93
|
+
* arrive already normalised. A DIRECTORY entry overlaps every file beneath it
|
|
94
|
+
* (`src` overlaps `src/foo.ts`); the marker overlaps everything.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} fencePath
|
|
97
|
+
* @param {string} ourPath
|
|
98
|
+
* @returns {boolean}
|
|
99
|
+
*/
|
|
100
|
+
function pathsOverlap(fencePath, ourPath) {
|
|
101
|
+
if (fencePath === ALL_PATHS_MARKER) return true;
|
|
102
|
+
if (fencePath === ourPath) return true;
|
|
103
|
+
return ourPath.startsWith(`${fencePath}/`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Walk a single sibling fence file and return the staged paths a sibling
|
|
108
|
+
* agent also recorded an intent to stage.
|
|
109
|
+
*
|
|
110
|
+
* Two entry shapes are accepted:
|
|
111
|
+
* - #1404 shape `{ paths, command_hash, timestamp }` — path LISTS compared
|
|
112
|
+
* against our staged set.
|
|
113
|
+
* - LEGACY shape `{ command, timestamp }` — a fence file written by a
|
|
114
|
+
* pre-#1404 hook version. Live sessions on this host may hold such files
|
|
115
|
+
* RIGHT NOW, and dropping them would read as "no overlap" — silently
|
|
116
|
+
* weaker than before the change. So the old raw-command regex still runs
|
|
117
|
+
* for an entry that has `command` and no `paths`.
|
|
118
|
+
* NAMED CEILING (BV-004): this fallback exists only to span the sessions
|
|
119
|
+
* running across the upgrade. REVISIT TRIGGER — remove it one minor
|
|
120
|
+
* release after 5.3.0 (i.e. in 5.4.0), by which point no process started
|
|
121
|
+
* before the upgrade can still be writing fence files. The command text it
|
|
122
|
+
* reads is never PRINTED (issue #1404) — only the fact of the match is.
|
|
122
123
|
*/
|
|
123
124
|
function findOverlaps(fenceJsonPath, ourStaged) {
|
|
124
125
|
let body;
|
|
@@ -131,61 +132,157 @@ function findOverlaps(fenceJsonPath, ourStaged) {
|
|
|
131
132
|
if (!Array.isArray(body.staged_paths)) return [];
|
|
132
133
|
if (ownAgentId && body.agent_id === ownAgentId) return []; // skip self
|
|
133
134
|
|
|
135
|
+
const siblingAgent = body.agent_id ?? '<unknown>';
|
|
134
136
|
const matches = [];
|
|
135
137
|
for (const entry of body.staged_paths) {
|
|
138
|
+
if (Array.isArray(entry?.paths)) {
|
|
139
|
+
const hash = typeof entry.command_hash === 'string' ? entry.command_hash : '<no-hash>';
|
|
140
|
+
for (const raw of entry.paths) {
|
|
141
|
+
if (typeof raw !== 'string') continue;
|
|
142
|
+
const fencePath = normalizeStagedPath(raw);
|
|
143
|
+
for (const ours of ourStaged) {
|
|
144
|
+
if (pathsOverlap(fencePath, normalizeStagedPath(ours))) {
|
|
145
|
+
matches.push({ ourPath: ours, siblingAgent, fencePath, hash });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
136
152
|
const cmd = entry?.command;
|
|
137
153
|
if (typeof cmd !== 'string') continue;
|
|
138
154
|
for (const ours of ourStaged) {
|
|
139
155
|
if (pathRegex(ours).test(cmd)) {
|
|
140
|
-
matches.push({
|
|
156
|
+
matches.push({
|
|
157
|
+
ourPath: ours,
|
|
158
|
+
siblingAgent,
|
|
159
|
+
fencePath: '<legacy entry, pre-#1404>',
|
|
160
|
+
hash: '<legacy entry, pre-#1404>',
|
|
161
|
+
});
|
|
141
162
|
}
|
|
142
163
|
}
|
|
143
164
|
}
|
|
144
165
|
return matches;
|
|
145
166
|
}
|
|
146
167
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
/**
|
|
169
|
+
* Both sub-modes, in the order the pre-commit hook needs them. Every statement
|
|
170
|
+
* here used to sit at module top level, which meant a bare `import()` of this
|
|
171
|
+
* file ran `git rev-parse` / `git diff --cached` and could exit the IMPORTING
|
|
172
|
+
* process with 1 (#1393). Moved into a function so the entry guard below can
|
|
173
|
+
* gate it; the logic and its exit codes are unchanged.
|
|
174
|
+
*/
|
|
175
|
+
async function main() {
|
|
176
|
+
const repoRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
|
|
177
|
+
// #801: resolve wave-scope.json via the same precedence every other reader
|
|
178
|
+
// uses (.pi/.cursor/.codex/.claude — scope-gate.mjs findScopeFile). The prior
|
|
179
|
+
// hardcoded `.orchestrator/wave-scope.json` path was DEAD — the coordinator
|
|
180
|
+
// writes wave-scope.json to the state dir (.claude/ on Claude Code; see
|
|
181
|
+
// skills/wave-executor/wave-loop.md), so this guard never fired. findScopeFile
|
|
182
|
+
// returns null when no scope file exists at any precedence dir, preserving
|
|
183
|
+
// the "no active wave → exit 0" semantics below.
|
|
184
|
+
const scopePath = findScopeFile(repoRoot);
|
|
185
|
+
const fenceDir = join(repoRoot, '.orchestrator', 'staging-fence');
|
|
186
|
+
|
|
187
|
+
// -------------------------------------------------------------------------
|
|
188
|
+
// Sub-mode B — allowedPaths check
|
|
189
|
+
// -------------------------------------------------------------------------
|
|
190
|
+
|
|
191
|
+
const stagedOutput = execSync('git diff --cached --name-only', { encoding: 'utf8' });
|
|
192
|
+
const stagedFiles = stagedOutput.split('\n').filter(Boolean);
|
|
193
|
+
|
|
194
|
+
if (scopePath) {
|
|
195
|
+
let scope;
|
|
196
|
+
try {
|
|
197
|
+
scope = JSON.parse(readFileSync(scopePath, 'utf8'));
|
|
198
|
+
} catch (err) {
|
|
199
|
+
process.stderr.write(`wave-scope-commit-guard: failed to parse wave-scope.json: ${err.message}\n`);
|
|
200
|
+
process.exit(1);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const allowedPaths = Array.isArray(scope.allowedPaths) ? scope.allowedPaths : [];
|
|
204
|
+
if (allowedPaths.length > 0) {
|
|
205
|
+
const violations = stagedFiles.filter(
|
|
206
|
+
(f) => !allowedPaths.some((pattern) => pathMatchesPattern(f, pattern)),
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
if (violations.length > 0) {
|
|
210
|
+
process.stderr.write('✗ wave-scope-commit-guard: staged paths outside wave-scope.allowedPaths:\n');
|
|
211
|
+
for (const v of violations) process.stderr.write(` - ${v}\n`);
|
|
212
|
+
process.stderr.write('\nThese files were likely added by lint-staged eslint --fix / prettier --write.\n');
|
|
213
|
+
process.stderr.write('To proceed:\n');
|
|
214
|
+
process.stderr.write(' 1) git restore --staged <path> # for each foreign path\n');
|
|
215
|
+
process.stderr.write(' 2) git commit # retry\n');
|
|
216
|
+
process.exit(1);
|
|
164
217
|
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
);
|
|
168
|
-
} catch (err) {
|
|
169
|
-
// Lock acquisition failed — emit a warning but do NOT block the commit.
|
|
170
|
-
// The race-detection layer is opportunistic; a lock-acquire timeout is
|
|
171
|
-
// strictly less severe than blocking a legitimate commit on flaky FS.
|
|
172
|
-
process.stderr.write(
|
|
173
|
-
`⚠ wave-scope-commit-guard: staging-fence lock failed — ${err?.message ?? err}\n`,
|
|
174
|
-
);
|
|
175
|
-
process.exit(0);
|
|
176
|
-
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
177
220
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
221
|
+
// -------------------------------------------------------------------------
|
|
222
|
+
// Sub-mode C — cross-agent staging-fence reconciliation (issue #552)
|
|
223
|
+
// -------------------------------------------------------------------------
|
|
224
|
+
//
|
|
225
|
+
// Skip entirely when no fence dir exists OR no staged files. The fence dir
|
|
226
|
+
// only appears when a wave-agent invoked `git add` while SO_WAVE_AGENT=1.
|
|
227
|
+
// Manual / coordinator commits never write a fence file, so this branch
|
|
228
|
+
// short-circuits to exit 0 for them (AC5 safe-default).
|
|
229
|
+
if (!existsSync(fenceDir) || stagedFiles.length === 0) {
|
|
230
|
+
process.exit(0);
|
|
182
231
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
232
|
+
|
|
233
|
+
let overlaps = [];
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
await withStagingFenceLock(
|
|
237
|
+
repoRoot,
|
|
238
|
+
async () => {
|
|
239
|
+
let entries;
|
|
240
|
+
try {
|
|
241
|
+
entries = readdirSync(fenceDir);
|
|
242
|
+
} catch {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
for (const name of entries) {
|
|
246
|
+
if (!name.endsWith('.json')) continue;
|
|
247
|
+
if (name.startsWith('.')) continue; // skip .commit.lock, tmp files
|
|
248
|
+
const overlapsFromFile = findOverlaps(join(fenceDir, name), stagedFiles);
|
|
249
|
+
overlaps = overlaps.concat(overlapsFromFile);
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
{ timeoutMs: 5000 },
|
|
253
|
+
);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
// Lock acquisition failed — emit a warning but do NOT block the commit.
|
|
256
|
+
// The race-detection layer is opportunistic; a lock-acquire timeout is
|
|
257
|
+
// strictly less severe than blocking a legitimate commit on flaky FS.
|
|
258
|
+
process.stderr.write(
|
|
259
|
+
`⚠ wave-scope-commit-guard: staging-fence lock failed — ${err?.message ?? err}\n`,
|
|
260
|
+
);
|
|
261
|
+
process.exit(0);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (overlaps.length > 0) {
|
|
265
|
+
process.stderr.write('✗ wave-scope-commit-guard: staging-fence: cross-agent overlap detected:\n');
|
|
266
|
+
for (const o of overlaps) {
|
|
267
|
+
process.stderr.write(
|
|
268
|
+
` - ${o.ourPath} (sibling agent ${o.siblingAgent} recorded ${o.fencePath}, command ${o.hash})\n`,
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
process.stderr.write('\nAnother wave-agent recorded a `git add` for one or more of your staged paths.\n');
|
|
272
|
+
process.stderr.write('To proceed:\n');
|
|
273
|
+
process.stderr.write(' 1) Coordinate with the sibling agent OR\n');
|
|
274
|
+
process.stderr.write(' 2) git restore --staged <path> # for each conflicting path, then retry\n');
|
|
275
|
+
process.stderr.write(' 3) git commit --no-verify # bypass (PSA-001/PSA-003 risk — operator opt-out)\n');
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
process.exit(0);
|
|
189
280
|
}
|
|
190
281
|
|
|
191
|
-
|
|
282
|
+
// Entry guard (#1393): run only as the node script `.husky/pre-commit` execs —
|
|
283
|
+
// a bare `import()` must run no git command and must not exit the importing
|
|
284
|
+
// process. No shouldRunHook gate here: this file is NOT registered in
|
|
285
|
+
// hooks/hooks.json, so the profile-gate never governed it.
|
|
286
|
+
if (isMainModule(import.meta.url)) {
|
|
287
|
+
await main();
|
|
288
|
+
}
|
package/monitors/monitors.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
{
|
|
3
3
|
"name": "ecosystem-health",
|
|
4
4
|
"command": "node \"${CLAUDE_PLUGIN_ROOT}\"/scripts/lib/ecosystem-health.mjs --watch",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "Local state-file watcher: every 900 s it stats and reads ONE file, .orchestrator/metrics/ecosystem-health.jsonl under the plugin root, and emits one NDJSON line per change (appeared / disappeared / changed). No network, no CI or branch probing, no repo enumeration, no Session Config read. Nothing writes that file yet (0 writers, measured 2026-09-18), so every run emits `no-state-yet` and idles until SIGTERM — ceiling and revisit trigger at DEFAULT_INTERVAL_S in scripts/lib/ecosystem-health.mjs. Hung on session-start because the previous trigger (on-skill-invoke:ecosystem-health) was self-referential: it could only start when the ecosystem-health skill ran, and that skill has 0 recorded invocations fleet-wide, so the watcher never started once.",
|
|
6
6
|
"when": "on-skill-invoke:session-start"
|
|
7
7
|
},
|
|
8
8
|
{
|
|
@@ -32,7 +32,7 @@ Only include if the plan changed:
|
|
|
32
32
|
|
|
33
33
|
- One table row per agent — no nested details
|
|
34
34
|
- Status is exactly one of: `done`, `partial`, `failed`
|
|
35
|
-
- File lists use short relative paths (e.g., `hooks/on-stop.
|
|
35
|
+
- File lists use short relative paths (e.g., `hooks/on-stop.mjs`)
|
|
36
36
|
- Quality gates are pass/fail — no ambiguity
|
|
37
37
|
- Adaptations only when deviating from plan — omit if on track
|
|
38
38
|
- Keep under 20 lines total
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "session-orchestrator",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"description": "A repeatable Plan, Go, Close workflow for AI coding sessions: /session reads your repo and agrees the scope, /go runs the work in waves with a quality gate between each, /close verifies and commits. Runs on Claude Code, Codex CLI, Cursor and Pi.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://session-orchestrator.com",
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
"test": "node scripts/check-package-manager.mjs && vitest --run",
|
|
58
58
|
"test:coverage": "node scripts/check-package-manager.mjs && vitest --run --coverage",
|
|
59
59
|
"test:watch": "node scripts/check-package-manager.mjs && vitest",
|
|
60
|
+
"test:pack": "node scripts/check-package-manager.mjs && SO_PACK_TEST=1 vitest --run tests/scripts/pack-install-lifecycle.test.mjs",
|
|
60
61
|
"quality-gate": "node scripts/run-quality-gate.mjs --variant full-gate",
|
|
61
62
|
"lint": "eslint .",
|
|
62
63
|
"lint:fix": "eslint . --fix",
|
package/pi/prompts/autopilot.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when running an autonomous session-orchestration loop. Chains session-start → session-plan → wave-executor → session-end for N iterations with all 10 kill-switches (SPIRAL, FAILED wave, carryover > 50%, max-hours, max-sessions, resource-overload, token-budget, stall-timeout, sub-threshold confidence, user-abort). Reads Mode-Selector output (Phase B) to decide auto-execute vs. fallback. Writes one autopilot.jsonl record per loop run. Phase C scaffold (issue #277); implementation lives in scripts/lib/autopilot.mjs (Phase C-1 follow-up)."
|
|
3
3
|
argument-hint: "[--headless] [--verbose] [--max-sessions=N] [--max-hours=H] [--confidence-threshold=0.X] [--dry-run]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /autopilot
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/autopilot/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/bootstrap.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when scaffolding the minimum repository structure required by session-orchestrator. Invoked automatically by the Bootstrap Gate when CLAUDE.md, Session Config, or bootstrap.lock is missing. Also available as /bootstrap for manual invocation. Three intensity tiers: fast (demos/spikes), standard (MVPs), deep (production/team)."
|
|
3
3
|
argument-hint: "[--upgrade <tier>]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /bootstrap
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/bootstrap/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/brainstorm.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use when you have a feature idea but the scope or UX is still ambiguous — runs a lightweight Socratic design dialogue (3-5 AUQ rounds) and writes a spec markdown file. Use BEFORE /plan feature when product intent needs validation; skip to /plan feature when scope is already clear. HARD-GATE prevents any code work until the design is user-approved."
|
|
3
3
|
argument-hint: "[topic-or-feature-slug]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /brainstorm
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/brainstorm/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/close.md
CHANGED
|
@@ -4,8 +4,8 @@ description: End session with verification, commits, and documentation
|
|
|
4
4
|
|
|
5
5
|
# /close
|
|
6
6
|
|
|
7
|
-
Use the Session Orchestrator
|
|
7
|
+
Use the Session Orchestrator skill definition at `skills/close/SKILL.md`.
|
|
8
8
|
|
|
9
9
|
Arguments: $@
|
|
10
10
|
|
|
11
|
-
Read that
|
|
11
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/debug.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use when encountering any bug, test failure, build break, or unexpected behavior — runs a 4-phase systematic debugging process before proposing any fix. Iron Law: NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST. Produces a `.orchestrator/debug/` artifact the fixer agent must reference."
|
|
3
3
|
argument-hint: "[bug-description-or-issue-ref]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /debug
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/debug/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/discovery.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when running systematic quality discovery and issue detection. Runs modular probes adapted to the project's tech stack, presents findings interactively for user triage, and creates VCS issues for confirmed problems. Invoked standalone via /discovery or embedded in session-end."
|
|
3
3
|
argument-hint: "[all|code|infra|ui|arch|session|audit|vault|feature] [--since <git-ref>] [--full]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /discovery
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/discovery/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/dispatcher.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use when you want the orchestrator to pick the next repo to work on across your whole portfolio — it enumerates candidate repos below the confinement root, resolves free/busy from each repo's session.lock lease, ranks the FREE ones by backlog priority × staleness × readiness, recommends the single most worthwhile one via AskUserQuestion, atomically claims it, and routes you to the chosen entry command. Triggers: \"what should I work on next\", \"dispatch me to a repo\", \"pick the next project\", \"run /dispatcher\". <example>Context: operator finished a session and wants the next-best repo across the portfolio. user: \"/dispatcher\" assistant: \"Ranked 18 free repos — top recommendation: Pencil-Designs (score 4.50, 90d stale). Confirm via the picker, I'll claim its lease atomically, then route you to /session deep.\"</example>"
|
|
3
3
|
argument-hint: "[--dry-run] [--repo <name>]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /dispatcher
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/dispatcher/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/eli5.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Explain a topic like I'm a 5 year old — restate my last output, or a named topic, in plain words without dropping a single fact. Use when the user types /eli5 [topic], or says an answer was too technical, too long, or unclear about what he now has to do."
|
|
3
3
|
argument-hint: "[topic]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /eli5
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/eli5/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/eval.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill to run an honest session-process evaluation (Standard v1, aiat-llm-eval/1.0) — score the last completed orchestrator session against the pre-registered rubric-v2 dimensions, run /eval, evaluate this session, produce an eval report, or re-verify a stored eval run for reproducibility. Deterministic-first with an optional advisory LLM judge; never produces a global score."
|
|
3
3
|
argument-hint: "[--session <id>] [--no-write] [--verify <run-id>]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /eval
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/eval/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/evolve.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when extracting session patterns into reusable learnings. Three modes: analyze (extract from session history), review (edit/manage existing learnings), list (display active learnings). Manages .orchestrator/metrics/learnings.jsonl."
|
|
3
3
|
argument-hint: "[analyze|review|list|dialectic [--apply]]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /evolve
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/evolve/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/go.md
CHANGED
|
@@ -5,8 +5,8 @@ argument-hint: "[optional instructions]"
|
|
|
5
5
|
|
|
6
6
|
# /go
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/go/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
package/pi/prompts/grill.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use when the user wants a plan, design, or PRD stress-tested before any build — relentlessly interrogates one decision at a time, grounds every question in the codebase, hunts contradictions against the domain language and the code, and challenges the load-bearing assumptions. Triggered by \"grill me\", \"stress-test this plan\", \"poke holes in my design\". Composable — run standalone or as an adversarial pass before /plan feature."
|
|
3
3
|
argument-hint: "[file-path-or-topic]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /grill
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/grill/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run the harness audit and report the rubric score for this repository
|
|
3
|
-
argument-hint: ""
|
|
4
3
|
---
|
|
5
4
|
|
|
6
5
|
# /harness-audit
|
|
7
6
|
|
|
8
|
-
Use the Session Orchestrator
|
|
7
|
+
Use the Session Orchestrator skill definition at `skills/harness-audit/SKILL.md`.
|
|
9
8
|
|
|
10
9
|
Arguments: $@
|
|
11
10
|
|
|
12
|
-
Read that
|
|
11
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when performing manual memory consolidation (Dream-equivalent). Reviews, consolidates, and prunes memory files under ~/.claude/projects/*/memory/. Run after major refactors, every 5+ sessions, or when memory quality degrades (broken links, stale references, contradictions, MEMORY.md > 200 lines). Invoke with /memory-cleanup."
|
|
3
3
|
argument-hint: "[--dry-run | --apply-pending]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /memory-cleanup
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/memory-cleanup/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Use this skill when you need multi-persona parallel content review — domain experts, buyer personas, compliance reviewers, or custom catalog entries reviewing a target file or output. Dispatches N persona agents in parallel, consolidates verdicts via a configurable mode (voting-quorum, hard-gate-threshold, or coordinator-summary), and writes a timestamped sidecar to .orchestrator/persona-panel/. Invoked via /persona-panel <target-path>."
|
|
3
3
|
argument-hint: "<target> [--personas <names,...>] [--mode <voting|hard-gate|summary>] [--threshold <M-of-N|all|any>] [--grounding <off|re-derive>] [--dry-run]"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# /persona-panel
|
|
7
7
|
|
|
8
|
-
Use the Session Orchestrator
|
|
8
|
+
Use the Session Orchestrator skill definition at `skills/persona-panel/SKILL.md`.
|
|
9
9
|
|
|
10
10
|
Arguments: $@
|
|
11
11
|
|
|
12
|
-
Read that
|
|
12
|
+
Read that skill file and follow it exactly. When it references `$ARGUMENTS`, substitute the arguments above. Keep all Session Orchestrator platform fallbacks intact.
|