session-orchestrator 5.12.0 → 5.13.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 +2 -2
- package/.claude-plugin/plugin.json +4 -1
- package/.codex-plugin/agents/explorer.toml +1 -1
- package/.codex-plugin/agents/session-reviewer.toml +2 -2
- package/.codex-plugin/agents/wave-worker.toml +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.orchestrator/policy/blocked-commands.json +8 -0
- package/.orchestrator/policy/public-export.json +30 -0
- package/CHANGELOG.md +162 -4
- package/README.md +126 -127
- package/agents/analyst.md +7 -2
- package/agents/architect-reviewer.md +7 -2
- package/agents/code-implementer.md +4 -2
- package/agents/db-specialist.md +9 -2
- package/agents/dialectic-deriver.md +9 -3
- package/agents/docs-writer.md +7 -2
- package/agents/eval-judge.md +7 -1
- package/agents/qa-strategist.md +7 -2
- package/agents/security-reviewer.md +9 -2
- package/agents/session-reviewer.md +18 -2
- package/agents/skill-applied-judge.md +7 -1
- package/agents/test-writer.md +9 -2
- package/agents/ui-developer.md +9 -2
- package/agents/ux-evaluator.md +6 -1
- package/commands/session.md +1 -1
- package/commands/templates-ack.md +89 -18
- package/docs/agent-authoring.md +30 -11
- package/docs/ci-setup.md +38 -2
- package/docs/codex-setup.md +33 -9
- package/docs/components.md +13 -2
- package/docs/cursor-setup.md +3 -3
- package/docs/events-schema.md +5 -4
- package/docs/evidence-candidates.md +63 -0
- package/docs/fleet-checkin-audit.md +7 -4
- package/docs/github-mirror-protection.md +150 -3
- package/docs/install.md +90 -17
- package/docs/instruction-delivery.md +1 -1
- package/docs/migration-v4.md +2 -2
- package/docs/mods.md +118 -0
- package/docs/owner-config-schema.md +1 -0
- package/docs/plugin-architecture-v3.md +1 -1
- package/docs/pm-skills-marketplace.md +4 -3
- package/docs/rule-authoring.md +24 -13
- package/docs/scope-collision-guard.md +2 -1
- package/docs/session-config-reference.md +49 -15
- package/docs/session-config-template.md +30 -22
- package/docs/sessions-ledger-repair.md +137 -0
- package/docs/vault-docs-architecture.md +1 -1
- package/hooks/_lib/hook-import-set.json +406 -73
- package/hooks/_lib/hook-root.mjs +301 -0
- package/hooks/_lib/lock-bootstrap.mjs +434 -4
- package/hooks/_lib/orchestrator-ignore.mjs +3 -0
- package/hooks/_lib/subagent-transcript.mjs +2 -2
- package/hooks/_lib/vcs-create-matcher.mjs +13 -17
- package/hooks/cwd-change-restore.mjs +5 -1
- package/hooks/enforce-commands.mjs +4 -3
- package/hooks/enforce-scope.mjs +11 -1
- package/hooks/hooks-codex.json +48 -2
- package/hooks/hooks.json +31 -31
- package/hooks/on-session-end.mjs +38 -15
- package/hooks/on-session-start.mjs +139 -49
- package/hooks/on-stop.mjs +11 -6
- package/hooks/post-bash-issue-budget-refund.mjs +6 -1
- package/hooks/post-bash-write-verify.mjs +8 -4
- package/hooks/post-edit-validate.mjs +45 -52
- package/hooks/post-subagent-discovery-validator.mjs +2 -2
- package/hooks/post-tool-batch-wave-signal.mjs +8 -4
- package/hooks/post-tool-failure-corrective-context.mjs +5 -1
- package/hooks/pre-bash-destructive-guard.mjs +220 -8
- package/hooks/pre-bash-issue-budget.mjs +6 -1
- package/hooks/pre-bash-sessions-ledger-guard.mjs +691 -123
- package/hooks/pre-bash-staging-fence.mjs +258 -14
- package/hooks/pre-bash-templates-first.mjs +28 -27
- package/hooks/run-node.sh +1 -1
- package/hooks/skill-invocation-telemetry.mjs +15 -8
- package/hooks/subagent-telemetry.mjs +77 -14
- package/hooks/wave-scope-commit-guard.mjs +143 -14
- package/mods/so-hud/.claude-plugin/plugin.json +11 -0
- package/mods/so-hud/README.md +57 -0
- package/mods/so-hud/hooks/beacon-io.mjs +101 -0
- package/mods/so-hud/hooks/heredoc-scan.ts +394 -0
- package/mods/so-hud/hooks/hooks.json +1 -0
- package/mods/so-hud/hooks/logic.ts +182 -0
- package/mods/so-hud/hooks/register.tsx +670 -0
- package/mods/so-hud/hooks/rules.ts +2998 -0
- package/mods/so-hud/tsconfig.json +8 -0
- package/mods/so-hud/types/index.d.ts +36 -0
- package/package.json +4 -2
- package/rules/_index.md +1 -1
- package/rules/always-on/ask-via-tool.md +1 -1
- package/rules/always-on/loop-and-monitor.md +17 -194
- package/rules/always-on/parallel-sessions.md +3 -1
- package/rules/opt-in-stack/backend-data.md +1 -1
- package/rules/opt-in-stack/backend.md +1 -1
- package/rules/opt-in-stack/security-web.md +5 -1
- package/scripts/agent-usage-census.mjs +79 -0
- package/scripts/apply-session-learnings.mjs +34 -6
- package/scripts/archive-closed-prds.mjs +21 -5
- package/scripts/autopilot.mjs +11 -5
- package/scripts/backfill-abandoned-sessions.mjs +13 -3
- package/scripts/backfill-evidence-digest.mjs +2 -1
- package/scripts/backfill-learnings-from-vault.mjs +61 -6
- package/scripts/backfill-sessions.mjs +16 -2
- package/scripts/check-package-manager.mjs +26 -8
- package/scripts/check-sessions-integrity.mjs +4 -1
- package/scripts/ci/assert-vitest-green.mjs +3 -0
- package/scripts/ci/windows-smoke.mjs +201 -0
- package/scripts/close-precheck.mjs +55 -0
- package/scripts/dialectic-deriver.mjs +20 -12
- package/scripts/emit-event.mjs +2 -2
- package/scripts/emit-session.mjs +239 -20
- package/scripts/eval-session.mjs +17 -3
- package/scripts/export-hw-learnings.mjs +29 -2
- package/scripts/fleet-checkin-audit.mjs +8 -4
- package/scripts/fleet-checkin.mjs +39 -27
- package/scripts/gc-stale-worktrees.mjs +6 -1
- package/scripts/github-export.mjs +128 -0
- package/scripts/github-protection-audit.mjs +3 -1
- package/scripts/handover-queue-check.mjs +209 -0
- package/scripts/harness-audit.mjs +6 -4
- package/scripts/lib/agent-frontmatter.mjs +57 -10
- package/scripts/lib/agent-status.mjs +125 -7
- package/scripts/lib/agent-usage-census.mjs +394 -0
- package/scripts/lib/auto-dialectic.mjs +17 -10
- package/scripts/lib/auto-dream.mjs +22 -14
- package/scripts/lib/autopilot/loop.mjs +3 -1
- package/scripts/lib/autopilot/recent-runs.mjs +4 -2
- package/scripts/lib/autopilot/stall-sampler.mjs +2 -1
- package/scripts/lib/autopilot/telemetry.mjs +5 -1
- package/scripts/lib/autopilot/worktree-pipeline.mjs +5 -5
- package/scripts/lib/baseline-archetypes.mjs +10 -2
- package/scripts/lib/blocked-commands-policy.mjs +4 -3
- package/scripts/lib/build-live-signals.mjs +13 -9
- package/scripts/lib/ci-status-banner.mjs +329 -24
- package/scripts/lib/codex/plugin-contract.mjs +8 -0
- package/scripts/lib/cold-start-detector.mjs +5 -2
- package/scripts/lib/command-blocker.mjs +603 -43
- package/scripts/lib/common.mjs +3 -2
- package/scripts/lib/config/cross-repo.mjs +74 -7
- package/scripts/lib/config/host-paths.mjs +6 -2
- package/scripts/lib/config/section-extractor.mjs +65 -11
- package/scripts/lib/config/template-keys.mjs +153 -0
- package/scripts/lib/config/vault-integration.mjs +1 -0
- package/scripts/lib/config.mjs +2 -2
- package/scripts/lib/coordinator-snapshot.mjs +1 -1
- package/scripts/lib/discovery/triage-state.mjs +2 -1
- package/scripts/lib/dispatcher/rank.mjs +5 -7
- package/scripts/lib/ecosystem-health.mjs +2 -2
- package/scripts/lib/eval/engine.mjs +3 -2
- package/scripts/lib/eval/session-resolve.mjs +6 -2
- package/scripts/lib/eval/sink.mjs +4 -3
- package/scripts/lib/events-retention-banner.mjs +3 -2
- package/scripts/lib/events-schema.mjs +10 -0
- package/scripts/lib/events.mjs +23 -12
- package/scripts/lib/evolve/autonomy-verdict.mjs +4 -9
- package/scripts/lib/evolve/autopilot-effectiveness.mjs +8 -18
- package/scripts/lib/fleet-protocol.mjs +4 -0
- package/scripts/lib/gates/gate-full.mjs +172 -11
- package/scripts/lib/gates/gate-helpers.mjs +236 -23
- package/scripts/lib/git-config-drift.mjs +141 -7
- package/scripts/lib/github-export.mjs +447 -0
- package/scripts/lib/gitlab-portfolio/cli.mjs +16 -5
- package/scripts/lib/handover-queue-marks.mjs +159 -0
- package/scripts/lib/hardware-pattern-detector.mjs +103 -13
- package/scripts/lib/harness-audit/categories/category1.mjs +16 -4
- package/scripts/lib/harness-audit/categories/category4.mjs +11 -8
- package/scripts/lib/harness-audit/categories/category6.mjs +25 -5
- package/scripts/lib/harness-audit/categories/category9.mjs +10 -4
- package/scripts/lib/host-identity.mjs +9 -5
- package/scripts/lib/http-request.mjs +64 -0
- package/scripts/lib/instruction-budget-guard.mjs +30 -22
- package/scripts/lib/io.mjs +6 -3
- package/scripts/lib/issue-budget-reconcile.mjs +3 -2
- package/scripts/lib/issue-budget.mjs +36 -7
- package/scripts/lib/learnings/evidence-candidates.mjs +154 -0
- package/scripts/lib/learnings/expiry-sweep.mjs +99 -7
- package/scripts/lib/learnings/io.mjs +289 -15
- package/scripts/lib/learnings/select.mjs +53 -4
- package/scripts/lib/learnings/store-role.mjs +209 -0
- package/scripts/lib/learnings/surface.mjs +46 -7
- package/scripts/lib/ledger-path.mjs +113 -0
- package/scripts/lib/maintenance-due-banner.mjs +63 -12
- package/scripts/lib/memory-banner.mjs +5 -6
- package/scripts/lib/memory-proposals/collector.mjs +5 -2
- package/scripts/lib/memory-proposals/sink.mjs +7 -4
- package/scripts/lib/memory-proposals/store.mjs +22 -5
- package/scripts/lib/mode-selector-accuracy.mjs +2 -1
- package/scripts/lib/no-follow-open.mjs +57 -0
- package/scripts/lib/orphan-reaper/reaper-audit.mjs +4 -2
- package/scripts/lib/own-lock-root.mjs +95 -0
- package/scripts/lib/owner-interview.mjs +2 -1
- package/scripts/lib/owner-yaml.mjs +70 -7
- package/scripts/lib/platform.mjs +161 -9
- package/scripts/lib/plugin-update-banner.mjs +15 -11
- package/scripts/lib/pre-push-local-partial.mjs +117 -0
- package/scripts/lib/pre-push-remote-gate.mjs +151 -25
- package/scripts/lib/process-group.mjs +270 -34
- package/scripts/lib/project-hygiene.mjs +28 -0
- package/scripts/lib/quality-gate.mjs +33 -9
- package/scripts/lib/reconcile/backlog.mjs +29 -15
- package/scripts/lib/reconcile/engine.mjs +26 -2
- package/scripts/lib/reconcile/idempotency.mjs +65 -3
- package/scripts/lib/reconcile/rule-expiry-sweep.mjs +53 -12
- package/scripts/lib/reconcile/verdict-ledger.mjs +224 -0
- package/scripts/lib/reconcile-nudge-banner.mjs +40 -6
- package/scripts/lib/resource-probe/evaluate.mjs +32 -9
- package/scripts/lib/resource-probe/probe-platform.mjs +3 -1
- package/scripts/lib/rule-loader.mjs +20 -10
- package/scripts/lib/scope-baseline.mjs +123 -8
- package/scripts/lib/scope-echo.mjs +5 -2
- package/scripts/lib/scope-gate.mjs +55 -20
- package/scripts/lib/session-close-backfill.mjs +75 -7
- package/scripts/lib/session-end/close-precheck.mjs +151 -0
- package/scripts/lib/session-end/phase-skip.mjs +8 -7
- package/scripts/lib/session-end/tail-runner.mjs +7 -2
- package/scripts/lib/session-id.mjs +9 -1
- package/scripts/lib/session-identity/own-session.mjs +63 -0
- package/scripts/lib/session-lock.mjs +114 -0
- package/scripts/lib/session-record-repair.mjs +245 -35
- package/scripts/lib/session-registry.mjs +72 -9
- package/scripts/lib/session-schema/constants.mjs +9 -0
- package/scripts/lib/session-schema/filters.mjs +56 -1
- package/scripts/lib/session-schema/validator.mjs +15 -5
- package/scripts/lib/session-start-probes.mjs +149 -22
- package/scripts/lib/session-token-rollup.mjs +2 -1
- package/scripts/lib/session-work-trees.mjs +166 -0
- package/scripts/lib/sessions-canonical.mjs +61 -3
- package/scripts/lib/sessions-integrity-banner.mjs +17 -39
- package/scripts/lib/sessions-staleness-banner.mjs +8 -5
- package/scripts/lib/sh-quote.mjs +1 -0
- package/scripts/lib/skill-evidence-window.mjs +5 -1
- package/scripts/lib/skill-health/join.mjs +10 -9
- package/scripts/lib/skill-invocations-schema.mjs +13 -0
- package/scripts/lib/skill-judgments-schema.mjs +6 -2
- package/scripts/lib/snapshot-probe.mjs +414 -0
- package/scripts/lib/so-hud/collect.mjs +49 -5
- package/scripts/lib/so-hud/runtime.mjs +15 -4
- package/scripts/lib/spiral-carryover.mjs +8 -1
- package/scripts/lib/state-md/frontmatter-mutators.mjs +266 -8
- package/scripts/lib/state-md/idle-reset.mjs +14 -5
- package/scripts/lib/state-md/mission-status.mjs +5 -1
- package/scripts/lib/state-md-peer-guard.mjs +2 -0
- package/scripts/lib/state-md.mjs +31 -8
- package/scripts/lib/sunset/walker.mjs +4 -3
- package/scripts/lib/telemetry/consent.mjs +4 -2
- package/scripts/lib/telemetry/queue.mjs +3 -3
- package/scripts/lib/telemetry/sync.mjs +45 -9
- package/scripts/lib/test-runner/artifact-paths.mjs +10 -2
- package/scripts/lib/tmux-layout/layouts.mjs +20 -3
- package/scripts/lib/ux-grill/paths.mjs +5 -1
- package/scripts/lib/validate/check-agents.mjs +37 -6
- package/scripts/lib/validate/check-component-paths.mjs +25 -1
- package/scripts/lib/validate/check-guard-requires-parity.mjs +3 -3
- package/scripts/lib/validate/check-hooks-symmetry.mjs +53 -32
- package/scripts/lib/validate/check-json-files.mjs +3 -1
- package/scripts/lib/validate/check-learning-provenance.mjs +3 -2
- package/scripts/lib/validate/check-learnings-shell-writes.mjs +10 -4
- package/scripts/lib/validate/check-metrics-ledger-root.mjs +234 -0
- package/scripts/lib/validate/check-owner-leakage.mjs +159 -11
- package/scripts/lib/validate/check-test-posix-shell.mjs +246 -0
- package/scripts/lib/validate/check-unwired-features.mjs +4 -2
- package/scripts/lib/validate/check-vcs-repo-flag-positional.mjs +58 -0
- package/scripts/lib/validate/check-vcs-repo-flag.mjs +259 -73
- package/scripts/lib/validate/check-workflow-continue-on-error.mjs +63 -0
- package/scripts/lib/validate/confidential-names.mjs +3 -1
- package/scripts/lib/vault-mirror/migrate-ids.mjs +321 -0
- package/scripts/lib/vault-mirror/namespace.mjs +19 -7
- package/scripts/lib/vault-mirror/process.mjs +56 -27
- package/scripts/lib/vault-mirror/prune.mjs +5 -2
- package/scripts/lib/vault-mirror/render-learnings.mjs +3 -3
- package/scripts/lib/vault-mirror/render-sessions.mjs +36 -53
- package/scripts/lib/vault-mirror/retention.mjs +2 -2
- package/scripts/lib/vault-mirror/utils.mjs +79 -0
- package/scripts/lib/vault-staleness-banner.mjs +4 -7
- package/scripts/lib/vault-status/board-writer.mjs +2 -1
- package/scripts/lib/vault-status/narrative-mirror.mjs +66 -7
- package/scripts/lib/wave-executor/foreign-dispatch.mjs +20 -0
- package/scripts/lib/win-process-tree.mjs +137 -0
- package/scripts/lib/workspace.mjs +1 -1
- package/scripts/lib/worktree/constants.mjs +1 -1
- package/scripts/lib/worktree/lifecycle.mjs +1 -1
- package/scripts/lib/worktree/listing.mjs +1 -1
- package/scripts/lib/zx.mjs +50 -0
- package/scripts/mcp-server.mjs +16 -7
- package/scripts/mcp-server.sh +13 -83
- package/scripts/measure-policy-cache-effectiveness.mjs +7 -5
- package/scripts/memory-propose.mjs +10 -3
- package/scripts/migrate-cold-start-seed.mjs +7 -0
- package/scripts/migrate-legacy-learnings.sh +22 -0
- package/scripts/migrate-sessions-jsonl.mjs +16 -2
- package/scripts/migrate-vault-paths.mjs +29 -13
- package/scripts/parse-config.mjs +71 -14
- package/scripts/print-learnings-index.mjs +25 -2
- package/scripts/release-session-lock.mjs +94 -7
- package/scripts/release.mjs +451 -24
- package/scripts/relocate-vault-corpus.mjs +11 -7
- package/scripts/repair-invalid-sessions.mjs +68 -3
- package/scripts/resolve-session-invocation.mjs +10 -17
- package/scripts/run-migrate-v2-cross-repo.mjs +56 -1
- package/scripts/run-quality-gate.mjs +33 -7
- package/scripts/self-update.mjs +56 -7
- package/scripts/session-commit-files.mjs +133 -0
- package/scripts/site-numbers.mjs +52 -9
- package/scripts/snapshot-probe.mjs +156 -0
- package/scripts/so-hud.mjs +29 -6
- package/scripts/state-md-idle-reset.mjs +2 -1
- package/scripts/sweep-expired-learnings.mjs +54 -6
- package/scripts/sweep-expired-rules.mjs +4 -1
- package/scripts/validate-plugin.mjs +22 -0
- package/scripts/vault-integration-watcher.mjs +54 -6
- package/scripts/vault-mirror.mjs +9 -0
- package/skills/_shared/fleet-protocol.md +142 -1
- package/skills/_shared/instruction-file-resolution.md +1 -1
- package/skills/_shared/monitor-patterns.md +44 -25
- package/skills/_shared/platform-tools.md +7 -0
- package/skills/_shared/state-ownership.md +3 -2
- package/skills/architecture/references/domain-model.md +1 -1
- package/skills/bootstrap/SKILL.md +3 -1
- package/skills/bootstrap/_shared-template.md +4 -4
- package/skills/bootstrap/fast-template.md +1 -1
- package/skills/bootstrap/private-contract.md +1 -1
- package/skills/bootstrap/references/bootstrap-retroactive-flow.md +17 -9
- package/skills/bootstrap/templates/agents/project-code-review.md +5 -1
- package/skills/bootstrap/templates/agents/project-discovery.md +5 -1
- package/skills/bootstrap/templates/agents/project-quality-gate.md +5 -1
- package/skills/claude-md-drift-check/SKILL.md +3 -3
- package/skills/claude-md-drift-check/checker.mjs +61 -101
- package/skills/close/SKILL.md +20 -7
- package/skills/discovery/probes/docs-staleness.mjs +7 -5
- package/skills/discovery/probes/frontend-slop.mjs +7 -3
- package/skills/discovery/probes/ssot-code-diff.mjs +5 -3
- package/skills/discovery/probes/supply-chain-slopcheck.mjs +10 -8
- package/skills/discovery/probes/vault-narrative-staleness.mjs +30 -10
- package/skills/discovery/probes/vault-staleness.mjs +5 -3
- package/skills/discovery/probes-session.md +3 -0
- package/skills/discovery/probes-vault.md +2 -0
- package/skills/dispatcher/SKILL.md +1 -1
- package/skills/eval/SKILL.md +3 -1
- package/skills/evolve/SKILL.md +2 -0
- package/skills/evolve/references/evolve-analyze-mode.md +3 -3
- package/skills/evolve/references/evolve-dialectic-mode.md +1 -1
- package/skills/gitlab-ops/SKILL.md +7 -6
- package/skills/gitlab-portfolio/SKILL.md +2 -2
- package/skills/go/SKILL.md +13 -1
- package/skills/npm-publish/SKILL.md +5 -2
- package/skills/plan/SKILL.md +23 -10
- package/skills/plan/mode-feature.md +13 -8
- package/skills/plan/mode-new.md +6 -14
- package/skills/plan/prd-feature-template.md +19 -0
- package/skills/plan/prd-full-template.md +12 -5
- package/skills/plan/prd-premortem-panel.md +48 -0
- package/skills/plan/prd-reviewer-prompt.md +11 -3
- package/skills/plan/soul.md +1 -1
- package/skills/portfolio/SKILL.md +5 -6
- package/skills/quality-gates/SKILL.md +2 -4
- package/skills/reconcile/SKILL.md +27 -4
- package/skills/release/SKILL.md +16 -8
- package/skills/session-end/SKILL.md +94 -11
- package/skills/session-end/phase-3-2-docs-verification.md +1 -0
- package/skills/session-end/phase-3-6-tail.md +11 -7
- package/skills/session-end/phase-3-7a-recommendations.md +9 -2
- package/skills/session-end/plan-verification.md +16 -1
- package/skills/session-end/references/phase-3-documentation-updates.md +14 -12
- package/skills/session-end/references/phase-5-issue-cleanup.md +1 -1
- package/skills/session-end/references/session-summary-template.md +4 -0
- package/skills/session-end/session-metrics-write.md +7 -4
- package/skills/session-plan/SKILL.md +5 -3
- package/skills/session-start/SKILL.md +9 -3
- package/skills/session-start/phase-4-5-resource-health.md +11 -5
- package/skills/session-start/phase-8-5-express-path.md +4 -3
- package/skills/session-start/references/phase-1-2-session-lock.md +7 -5
- package/skills/session-start/references/phase-1-5-session-continuity.md +2 -2
- package/skills/session-start/references/phase-1-7-vault-status-board.md +1 -1
- package/skills/session-start/references/phase-4-ssot-environment-check.md +3 -2
- package/skills/tmux-layout/SKILL.md +2 -2
- package/skills/vault-sync/validator.mjs +3 -2
- package/skills/wave-executor/SKILL.md +5 -4
- package/skills/wave-executor/references/wave-executor-state-init.md +3 -3
- package/skills/wave-executor/references/wave-loop-dispatch.md +11 -5
- package/skills/wave-executor/references/wave-loop-review.md +13 -5
- package/skills/wave-executor/references/wave-loop-scope-manifest.md +1 -1
- package/assets/og-card.png +0 -0
- package/assets/og-card.svg +0 -47
- package/assets/wave-lifecycle.svg +0 -98
|
@@ -101,6 +101,7 @@ import { join, dirname } from 'node:path';
|
|
|
101
101
|
import { fileURLToPath } from 'node:url';
|
|
102
102
|
|
|
103
103
|
import { findProjectRoot } from './lib/common.mjs';
|
|
104
|
+
import { resolveLedgerPath } from './lib/ledger-path.mjs';
|
|
104
105
|
import { eventsFilePath } from './lib/events.mjs';
|
|
105
106
|
import { resolveStateArtifactPath } from './lib/state-md.mjs';
|
|
106
107
|
import {
|
|
@@ -154,6 +155,11 @@ Options:
|
|
|
154
155
|
--max-chars <n> Hard cap on the rendered index body (default: ${LEARNINGS_INDEX_MAX_CHARS}).
|
|
155
156
|
--pool-size <n> Active entries pulled before ranking (default: ${CANDIDATE_POOL_SIZE}).
|
|
156
157
|
--learnings <path> Learnings JSONL (default: .orchestrator/metrics/learnings.jsonl).
|
|
158
|
+
--evidence-candidates <path> Opt into a bounded local candidate JSON artifact.
|
|
159
|
+
Requires --source-repo and an exact non-empty --task-text.
|
|
160
|
+
Invalid/unavailable artifacts keep the baseline output;
|
|
161
|
+
provider status/counts go to stderr. No provider is run.
|
|
162
|
+
--source-repo <id> Explicit opaque repo ID bound to the candidate artifact.
|
|
157
163
|
--rules-dir <path> Natively-delivered rule corpus (default: .claude/rules).
|
|
158
164
|
Learnings already delivered as a rule file there are
|
|
159
165
|
excluded from the index (#1019). A path that does not
|
|
@@ -208,6 +214,8 @@ try {
|
|
|
208
214
|
'max-chars': { type: 'string' },
|
|
209
215
|
'pool-size': { type: 'string' },
|
|
210
216
|
learnings: { type: 'string' },
|
|
217
|
+
'evidence-candidates': { type: 'string' },
|
|
218
|
+
'source-repo': { type: 'string' },
|
|
211
219
|
'rules-dir': { type: 'string' },
|
|
212
220
|
'no-event': { type: 'boolean', default: false },
|
|
213
221
|
json: { type: 'boolean', default: false },
|
|
@@ -219,6 +227,14 @@ try {
|
|
|
219
227
|
}
|
|
220
228
|
|
|
221
229
|
const opts = parsed.values;
|
|
230
|
+
if (opts['evidence-candidates'] !== undefined &&
|
|
231
|
+
(!opts['evidence-candidates'] || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,99}$/.test(opts['source-repo'] ?? '') ||
|
|
232
|
+
!opts['task-text']?.trim() || opts['task-text'].length > 4000)) {
|
|
233
|
+
fail('--evidence-candidates requires a path, --source-repo ID and non-empty --task-text (at most 4000 characters)', 1);
|
|
234
|
+
}
|
|
235
|
+
if (opts['source-repo'] !== undefined && opts['evidence-candidates'] === undefined) {
|
|
236
|
+
fail('--source-repo requires --evidence-candidates', 1);
|
|
237
|
+
}
|
|
222
238
|
|
|
223
239
|
/**
|
|
224
240
|
* Parse a `--max-*` value: a non-negative integer. Anything else is a
|
|
@@ -249,7 +265,7 @@ const poolSize = parseCap(opts['pool-size'], CANDIDATE_POOL_SIZE, '--pool-size')
|
|
|
249
265
|
const repoRoot = findProjectRoot(process.cwd());
|
|
250
266
|
const learningsPath = opts.learnings
|
|
251
267
|
? opts.learnings
|
|
252
|
-
:
|
|
268
|
+
: resolveLedgerPath('.orchestrator/metrics/learnings.jsonl', repoRoot); // #1722
|
|
253
269
|
const eventsPath = eventsFilePath(repoRoot); // #1514 point 1: the repo's one ledger
|
|
254
270
|
// #1019 — the natively-delivered rule corpus. Every `.claude/rules/*.md` reaches
|
|
255
271
|
// a dispatched agent in FULL through Claude Code's own project-instruction
|
|
@@ -338,7 +354,11 @@ try {
|
|
|
338
354
|
selection = await selectLearningsFromFile(
|
|
339
355
|
learningsPath,
|
|
340
356
|
{ file_paths: scopePaths, text: taskText },
|
|
341
|
-
{ maxScoped, maxGlobal, maxChars, poolSize, rulesDir
|
|
357
|
+
{ maxScoped, maxGlobal, maxChars, poolSize, rulesDir,
|
|
358
|
+
...(opts['evidence-candidates'] !== undefined ? {
|
|
359
|
+
evidenceCandidates: opts['evidence-candidates'], sourceRepo: opts['source-repo'],
|
|
360
|
+
} : {}),
|
|
361
|
+
},
|
|
342
362
|
);
|
|
343
363
|
} catch (err) {
|
|
344
364
|
// `selectLearningsFromFile` is contractually total (contract point 1), so this
|
|
@@ -350,6 +370,9 @@ try {
|
|
|
350
370
|
|
|
351
371
|
const selected = selection.entries;
|
|
352
372
|
const scopeMatched = selection.scopeMatched;
|
|
373
|
+
if (selection.evidence) {
|
|
374
|
+
process.stderr.write(`[evidence-candidates] ${JSON.stringify(selection.evidence)}\n`);
|
|
375
|
+
}
|
|
353
376
|
|
|
354
377
|
// ---------------------------------------------------------------------------
|
|
355
378
|
// Render — the WRAPPER only; per-entry lines come from the selector
|
|
@@ -43,12 +43,15 @@
|
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
45
|
import { parseArgs } from 'node:util';
|
|
46
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
46
47
|
import path from 'node:path';
|
|
47
48
|
|
|
48
|
-
import { readLockDetailed, loadOwnerProof, release } from './lib/session-lock.mjs';
|
|
49
|
+
import { readLockDetailed, loadOwnerProof, release, writeReleaseMarker } from './lib/session-lock.mjs';
|
|
49
50
|
import { LOCK_RELEASED_EVENT } from './lib/session-transition.mjs';
|
|
50
51
|
import { emitEvent } from './lib/events.mjs';
|
|
51
52
|
import { isMainModule } from './lib/is-main-module.mjs';
|
|
53
|
+
import { registrySessionRoot, resolveOwnLockRootFor } from './lib/own-lock-root.mjs';
|
|
54
|
+
import { dotGitAncestor } from './lib/platform.mjs';
|
|
52
55
|
|
|
53
56
|
/**
|
|
54
57
|
* `caller` value stamped into the breadcrumb, so this fourth release site stays
|
|
@@ -69,18 +72,31 @@ WHAT IT DOES
|
|
|
69
72
|
3. Emits orchestrator.session.lock.released with the ids read BEFORE the
|
|
70
73
|
delete, plus caller="${PHASE_CALLER}".
|
|
71
74
|
4. RE-READS the lock path and exits 0 only when our lock is provably gone.
|
|
75
|
+
5. Leaves .orchestrator/runtime/lock-released/<raw-id>.json, so a compaction
|
|
76
|
+
or resume of this session does not re-create the lock (#1651); the
|
|
77
|
+
session's next deliberate acquire() removes it.
|
|
72
78
|
|
|
73
79
|
FLAGS
|
|
74
80
|
--session-id <id> REQUIRED. The RAW (physical) session id that owns the lock
|
|
75
81
|
— .orchestrator/session.lock "session_id", never STATE.md
|
|
76
82
|
"session" and never the semantic id. A lock owned by a
|
|
77
83
|
different id is NEVER released.
|
|
78
|
-
--repo-root <path> Repo whose lock is released
|
|
84
|
+
--repo-root <path> Repo whose lock is released. Default: the checkout whose
|
|
85
|
+
lock carries --session-id — the host registry's
|
|
86
|
+
session_root, the cwd's checkout, its main checkout, or a
|
|
87
|
+
registered linked worktree, in that order; with none of
|
|
88
|
+
them, the cwd's checkout (#1730). The JSON result names
|
|
89
|
+
the root (repo_root) and how it was found (root_source:
|
|
90
|
+
flag|registry|cwd|main-checkout|worktree|none).
|
|
79
91
|
--json Machine-readable result on stdout.
|
|
80
92
|
-h, --help Show this help and exit 0.
|
|
81
93
|
|
|
82
94
|
OUTCOMES
|
|
83
95
|
absent no lock file — nothing released, NO event, exit 0.
|
|
96
|
+
|
|
97
|
+
Without --repo-root the #1651 marker (absent and released alike) goes to the
|
|
98
|
+
lock's root, the cwd's checkout and the registry's session_root, existing
|
|
99
|
+
checkouts only; release_marker_roots lists each root with its result.
|
|
84
100
|
deleted our lock was removed and re-read as gone.
|
|
85
101
|
already-gone ownership matched but the lock had already vanished; the event
|
|
86
102
|
is still written, because a lock removed by a third party while
|
|
@@ -137,6 +153,53 @@ function ourLockIsGone(repoRoot, sessionId) {
|
|
|
137
153
|
return false;
|
|
138
154
|
}
|
|
139
155
|
|
|
156
|
+
/** @param {string} p */
|
|
157
|
+
function canonical(p) {
|
|
158
|
+
try { return realpathSync.native(p); } catch { return path.resolve(p); }
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Where the #1651 marker goes (#1730). A later compaction's SessionStart looks
|
|
163
|
+
* for it at `resolveSessionStartRoot`, which depends on THAT compaction's cwd —
|
|
164
|
+
* unknown here. So it goes to every root that reader can land on: the lock's
|
|
165
|
+
* root, the cwd's checkout and the registry's session_root. Only existing
|
|
166
|
+
* checkouts (a `.git` entry): a stale registry entry must not re-create the
|
|
167
|
+
* directory tree of a removed worktree. The marker is keyed on this session's
|
|
168
|
+
* own raw id, so an extra copy changes nothing for another session. With
|
|
169
|
+
* --repo-root the given root alone, as before.
|
|
170
|
+
*
|
|
171
|
+
* @param {{ root: string, source: string }} resolved
|
|
172
|
+
* @param {string} sessionId
|
|
173
|
+
* @returns {string[]}
|
|
174
|
+
*/
|
|
175
|
+
function markerRootsFor(resolved, sessionId) {
|
|
176
|
+
if (resolved.source === 'flag') return [resolved.root];
|
|
177
|
+
const cwdTop = dotGitAncestor(process.cwd()) || path.resolve(process.cwd());
|
|
178
|
+
const extra = [cwdTop, registrySessionRoot(sessionId)]
|
|
179
|
+
.filter((r) => typeof r === 'string' && existsSync(path.join(r, '.git')));
|
|
180
|
+
return [...new Set([resolved.root, ...extra].map(canonical))];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Write the marker at each root; a failed copy is named on stderr and in the
|
|
185
|
+
* result, never hidden behind one that was written.
|
|
186
|
+
*
|
|
187
|
+
* @param {string[]} roots
|
|
188
|
+
* @param {string} sessionId
|
|
189
|
+
* @returns {Array<{ root: string, ok: boolean }>}
|
|
190
|
+
*/
|
|
191
|
+
function writeMarkers(roots, sessionId) {
|
|
192
|
+
return roots.map((root) => {
|
|
193
|
+
const marker = writeReleaseMarker({ repoRoot: root, sessionId });
|
|
194
|
+
if (marker.ok !== true) {
|
|
195
|
+
process.stderr.write(
|
|
196
|
+
`release-session-lock: release marker not written at ${root} (${marker.reason}) — a compaction there may re-create the lock\n`,
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
return { root, ok: marker.ok === true };
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
140
203
|
/**
|
|
141
204
|
* CLI entry point.
|
|
142
205
|
*
|
|
@@ -175,11 +238,20 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
|
|
|
175
238
|
return 1;
|
|
176
239
|
}
|
|
177
240
|
|
|
178
|
-
|
|
241
|
+
// #1730: `/close` runs this without --repo-root, and its cwd is often not the
|
|
242
|
+
// checkout holding the lock — a worktree session's lock sits in the main
|
|
243
|
+
// checkout, or the shell cwd reset to the main checkout while the lock is in
|
|
244
|
+
// a worktree. Reading at the cwd answered `absent` with exit 0 and the lock
|
|
245
|
+
// stayed. An explicit --repo-root is taken as given.
|
|
246
|
+
const resolved = values['repo-root'] !== undefined
|
|
247
|
+
? { root: path.resolve(values['repo-root']), source: 'flag' }
|
|
248
|
+
: resolveOwnLockRootFor({ sessionId, cwd: process.cwd() });
|
|
249
|
+
const repoRoot = resolved.root;
|
|
179
250
|
|
|
180
251
|
const emitResult = async (result) => {
|
|
181
|
-
|
|
182
|
-
|
|
252
|
+
const located = { ...result, repo_root: repoRoot, root_source: resolved.source };
|
|
253
|
+
if (values.json) process.stdout.write(JSON.stringify(located, null, 2) + '\n');
|
|
254
|
+
else printHuman(located);
|
|
183
255
|
};
|
|
184
256
|
|
|
185
257
|
// -- Step 1: read the lock, and capture the ids BEFORE anything is deleted --
|
|
@@ -188,8 +260,14 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
|
|
|
188
260
|
if (lockDetail.status === 'absent') {
|
|
189
261
|
// Nothing was released, so nothing terminal happened: NO event. Writing one
|
|
190
262
|
// here would put a fictional lifecycle end into the stream — the idempotent
|
|
191
|
-
// re-run case is not a release.
|
|
192
|
-
|
|
263
|
+
// re-run case is not a release. The #1651 marker IS written: a session that
|
|
264
|
+
// closes without a lock (bootstrap fs-error, or an earlier release) must not
|
|
265
|
+
// get one re-created by a later compaction either (roots: markerRootsFor).
|
|
266
|
+
const markers = writeMarkers(markerRootsFor(resolved, sessionId), sessionId);
|
|
267
|
+
const result = {
|
|
268
|
+
ok: true, outcome: 'absent', verified: true, session_id: sessionId, event_emitted: false,
|
|
269
|
+
release_marker: markers.every((m) => m.ok), release_marker_roots: markers,
|
|
270
|
+
};
|
|
193
271
|
await emitResult(result);
|
|
194
272
|
return 0;
|
|
195
273
|
}
|
|
@@ -249,6 +327,13 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
|
|
|
249
327
|
const verified = ourLockIsGone(repoRoot, sessionId);
|
|
250
328
|
const outcome = alreadyGone ? 'already-gone' : 'deleted';
|
|
251
329
|
|
|
330
|
+
// #1651: leave "released on purpose" behind, so the SessionStart bootstrap
|
|
331
|
+
// does not re-create this lock after a compaction or resume of the same raw
|
|
332
|
+
// session (a headless run may hold the slot by then). Best-effort: a failed
|
|
333
|
+
// marker write is reported, but the release itself stands.
|
|
334
|
+
const markers = verified ? writeMarkers(markerRootsFor(resolved, sessionId), sessionId) : [];
|
|
335
|
+
const markerWritten = verified && markers.every((m) => m.ok);
|
|
336
|
+
|
|
252
337
|
// -- Step 4: the terminal breadcrumb --------------------------------------
|
|
253
338
|
// The ids are passed EXPLICITLY: the lock is gone by now, so emitEvent's
|
|
254
339
|
// lock-derived correlation would find nothing to attribute this record to.
|
|
@@ -275,6 +360,8 @@ export async function main({ argv = process.argv.slice(2) } = {}) {
|
|
|
275
360
|
...(semanticSessionId !== null ? { semantic_session_id: semanticSessionId } : {}),
|
|
276
361
|
event_emitted: eventEmitted,
|
|
277
362
|
...(emitError !== null ? { event_error: emitError } : {}),
|
|
363
|
+
release_marker: markerWritten,
|
|
364
|
+
release_marker_roots: markers,
|
|
278
365
|
};
|
|
279
366
|
await emitResult(result);
|
|
280
367
|
|