harnery 0.35.0 → 0.36.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/dist/commander.d.ts +30 -5
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +124 -96
- package/dist/commands/agents.d.ts +23 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +379 -198
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +10 -10
- package/dist/commands/browse-session.d.ts.map +1 -1
- package/dist/commands/browse-session.js +12 -0
- package/dist/commands/browse.d.ts +1 -1
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +5 -4
- package/dist/commands/conversations.d.ts +10 -0
- package/dist/commands/conversations.d.ts.map +1 -0
- package/dist/commands/conversations.js +201 -0
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +5 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +13 -2
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +51 -7
- package/dist/commands/fetch.js +6 -5
- package/dist/commands/files.d.ts +22 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +113 -0
- package/dist/commands/governor.js +14 -12
- package/dist/commands/inbox.d.ts +5 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +57 -0
- package/dist/commands/init.d.ts +4 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +63 -13
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +347 -1
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +169 -0
- package/dist/commands/messages.d.ts +5 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +45 -0
- package/dist/commands/outline.d.ts +1 -1
- package/dist/commands/outline.d.ts.map +1 -1
- package/dist/commands/outline.js +2 -2
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.d.ts.map +1 -1
- package/dist/commands/read.js +2 -2
- package/dist/commands/semantic.d.ts.map +1 -1
- package/dist/commands/semantic.js +54 -2
- package/dist/commands/storage.d.ts +4 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +238 -0
- package/dist/commands/tunnel.d.ts +5 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +44 -31
- package/dist/commands/web.d.ts +3 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.js +3 -3
- package/dist/commands/workflow.js +13 -13
- package/dist/core/adapters/profiles.d.ts +1 -1
- package/dist/core/agents/cli.js +209 -39
- package/dist/core/agents/live-authority-v3.d.ts +47 -1
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +244 -10
- package/dist/core/agents/live-lifecycle-v3.js +6 -1
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +6 -1
- package/dist/core/agents/render/prompt-context.d.ts +9 -3
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +24 -7
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +94 -13
- package/dist/core/agents/rules/verdict.d.ts +1 -0
- package/dist/core/agents/rules/verdict.d.ts.map +1 -1
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +4 -0
- package/dist/core/agents/session-finalization-state-v3.js +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -1
- package/dist/core/agents/state/activity-log.d.ts +3 -0
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +6 -3
- package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +18 -0
- package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +15 -90
- package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
- package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +92 -0
- package/dist/core/artifacts/index.d.ts +21 -0
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +46 -1
- package/dist/core/config.d.ts +62 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -4
- package/dist/core/conversations/archive.d.ts +49 -0
- package/dist/core/conversations/archive.d.ts.map +1 -0
- package/dist/core/conversations/archive.js +136 -0
- package/dist/core/conversations/catalog.d.ts +10 -0
- package/dist/core/conversations/catalog.d.ts.map +1 -0
- package/dist/core/conversations/catalog.js +72 -0
- package/dist/core/conversations/context-pack.d.ts +6 -0
- package/dist/core/conversations/context-pack.d.ts.map +1 -0
- package/dist/core/conversations/context-pack.js +60 -0
- package/dist/core/conversations/contract.d.ts +155 -0
- package/dist/core/conversations/contract.d.ts.map +1 -0
- package/dist/core/conversations/contract.js +1 -0
- package/dist/core/conversations/evaluation.d.ts +16 -0
- package/dist/core/conversations/evaluation.d.ts.map +1 -0
- package/dist/core/conversations/evaluation.js +9 -0
- package/dist/core/conversations/index.d.ts +10 -0
- package/dist/core/conversations/index.d.ts.map +1 -0
- package/dist/core/conversations/index.js +9 -0
- package/dist/core/conversations/lifecycle.d.ts +28 -0
- package/dist/core/conversations/lifecycle.d.ts.map +1 -0
- package/dist/core/conversations/lifecycle.js +29 -0
- package/dist/core/conversations/normalize.d.ts +14 -0
- package/dist/core/conversations/normalize.d.ts.map +1 -0
- package/dist/core/conversations/normalize.js +82 -0
- package/dist/core/conversations/query.d.ts +8 -0
- package/dist/core/conversations/query.d.ts.map +1 -0
- package/dist/core/conversations/query.js +280 -0
- package/dist/core/conversations/search-index.d.ts +9 -0
- package/dist/core/conversations/search-index.d.ts.map +1 -0
- package/dist/core/conversations/search-index.js +29 -0
- package/dist/core/events/legacy-storage/canary.d.ts +18 -0
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/canary.js +150 -0
- package/dist/core/events/legacy-storage/fence.d.ts +15 -0
- package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/fence.js +115 -0
- package/dist/core/events/legacy-storage/index.d.ts +6 -0
- package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/index.js +5 -0
- package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
- package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/inventory.js +40 -0
- package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
- package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/manifest.js +108 -0
- package/dist/core/events/legacy-storage/reader.d.ts +15 -0
- package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
- package/dist/core/events/legacy-storage/reader.js +154 -0
- package/dist/core/events/v3/authority-outbox.d.ts +7 -2
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +16 -3
- package/dist/core/events/v3/base-contract.d.ts +81 -41
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +17 -7
- package/dist/core/events/v3/bootstrap.d.ts +39 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +167 -3
- package/dist/core/events/v3/capabilities.js +3 -3
- package/dist/core/events/v3/control-witness.d.ts +44 -0
- package/dist/core/events/v3/control-witness.d.ts.map +1 -0
- package/dist/core/events/v3/control-witness.js +233 -0
- package/dist/core/events/v3/control-writer.d.ts +4 -0
- package/dist/core/events/v3/control-writer.d.ts.map +1 -0
- package/dist/core/events/v3/control-writer.js +16 -0
- package/dist/core/events/v3/control.d.ts +8 -2
- package/dist/core/events/v3/control.d.ts.map +1 -1
- package/dist/core/events/v3/control.js +46 -18
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-view.js +16 -1
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +4 -2
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +3 -1
- package/dist/core/events/v3/live-route-observer.d.ts +31 -0
- package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
- package/dist/core/events/v3/live-route-observer.js +58 -0
- package/dist/core/events/v3/live-routing.d.ts +13 -21
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +45 -41
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
- package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
- package/dist/core/events/v3/producers/hook-base.js +1 -1
- package/dist/core/events/v3/producers/intake.d.ts +7 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +25 -2
- package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
- package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
- package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
- package/dist/core/events/v3/producers/recorder.d.ts +55 -1
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +353 -24
- package/dist/core/events/v3/reader.d.ts +51 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -1
- package/dist/core/events/v3/reader.js +181 -1
- package/dist/core/events/v3/rotation-config.d.ts +9 -0
- package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
- package/dist/core/events/v3/rotation-config.js +91 -0
- package/dist/core/events/v3/runtime-build.d.ts +11 -0
- package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-build.js +39 -0
- package/dist/core/events/v3/runtime-identity.d.ts +5 -0
- package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-identity.js +18 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
- package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
- package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/classify.js +149 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
- package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/eligibility.js +35 -0
- package/dist/core/events/v3/support-storage/index.d.ts +10 -0
- package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/index.js +9 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/inventory.js +94 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
- package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/maintenance.js +352 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
- package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
- package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/support-storage/recovery.js +22 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/events/v3/turn-telemetry.js +32 -2
- package/dist/core/events/v3/writer.d.ts +13 -1
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +126 -12
- package/dist/core/governor/plan-read.d.ts.map +1 -1
- package/dist/core/governor/plan-read.js +5 -21
- package/dist/core/governor/planning.js +6 -8
- package/dist/core/governor/service-read.d.ts +12 -0
- package/dist/core/governor/service-read.d.ts.map +1 -1
- package/dist/core/governor/service-read.js +266 -2
- package/dist/core/governor/service.d.ts +1 -0
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +53 -18
- package/dist/core/guard/evidence-v3.d.ts.map +1 -1
- package/dist/core/guard/evidence-v3.js +2 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +1 -0
- package/dist/core/hooks/adapter/output.d.ts +4 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +13 -5
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
- package/dist/core/hooks/cli.js +212 -30
- package/dist/core/hooks/effects/image-capture.d.ts +1 -1
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +4 -2
- package/dist/core/hooks/remediation-cap.d.ts +8 -3
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
- package/dist/core/hooks/remediation-cap.js +3 -11
- package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
- package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
- package/dist/core/hooks/resolve/coord-root.js +92 -11
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +5 -0
- package/dist/core/hooks/resolve/transcript.d.ts +8 -0
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +11 -0
- package/dist/core/inbox/contract.d.ts +64 -0
- package/dist/core/inbox/contract.d.ts.map +1 -0
- package/dist/core/inbox/contract.js +13 -0
- package/dist/core/inbox/index.d.ts +5 -0
- package/dist/core/inbox/index.d.ts.map +1 -0
- package/dist/core/inbox/index.js +4 -0
- package/dist/core/inbox/lifecycle.d.ts +22 -0
- package/dist/core/inbox/lifecycle.d.ts.map +1 -0
- package/dist/core/inbox/lifecycle.js +41 -0
- package/dist/core/inbox/service.d.ts +36 -0
- package/dist/core/inbox/service.d.ts.map +1 -0
- package/dist/core/inbox/service.js +210 -0
- package/dist/core/inbox/watcher.d.ts +7 -0
- package/dist/core/inbox/watcher.d.ts.map +1 -0
- package/dist/core/inbox/watcher.js +26 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -1
- package/dist/core/presence/codec-digest.js +14 -3
- package/dist/core/presence/relay-client.d.ts +1 -0
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +52 -8
- package/dist/core/semantic/adapters.d.ts +11 -8
- package/dist/core/semantic/adapters.d.ts.map +1 -1
- package/dist/core/semantic/adapters.js +169 -31
- package/dist/core/semantic/contract.d.ts +532 -48
- package/dist/core/semantic/contract.d.ts.map +1 -1
- package/dist/core/semantic/contract.js +104 -3
- package/dist/core/semantic/index.d.ts +7 -3
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +7 -3
- package/dist/core/semantic/once.d.ts +6 -1
- package/dist/core/semantic/once.d.ts.map +1 -1
- package/dist/core/semantic/once.js +80 -9
- package/dist/core/semantic/prompt.d.ts.map +1 -1
- package/dist/core/semantic/prompt.js +14 -1
- package/dist/core/semantic/review.d.ts +144 -0
- package/dist/core/semantic/review.d.ts.map +1 -0
- package/dist/core/semantic/review.js +544 -0
- package/dist/core/semantic/routes.d.ts +10 -0
- package/dist/core/semantic/routes.d.ts.map +1 -0
- package/dist/core/semantic/routes.js +21 -0
- package/dist/core/semantic/scheduler.d.ts +14 -3
- package/dist/core/semantic/scheduler.d.ts.map +1 -1
- package/dist/core/semantic/scheduler.js +30 -6
- package/dist/core/semantic/service-status.d.ts +20 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -1
- package/dist/core/semantic/service-status.js +60 -4
- package/dist/core/semantic/service.d.ts +1 -0
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +104 -15
- package/dist/core/semantic/soak.d.ts +75 -0
- package/dist/core/semantic/soak.d.ts.map +1 -0
- package/dist/core/semantic/soak.js +476 -0
- package/dist/core/semantic/storage.d.ts +11 -1
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +4 -3
- package/dist/core/semantic/usage.d.ts +43 -0
- package/dist/core/semantic/usage.d.ts.map +1 -0
- package/dist/core/semantic/usage.js +193 -0
- package/dist/core/semantic/validate.d.ts +3 -1
- package/dist/core/semantic/validate.d.ts.map +1 -1
- package/dist/core/semantic/validate.js +34 -1
- package/dist/core/storage/buffer.d.ts +28 -0
- package/dist/core/storage/buffer.d.ts.map +1 -0
- package/dist/core/storage/buffer.js +101 -0
- package/dist/core/storage/builtins.d.ts +3 -0
- package/dist/core/storage/builtins.d.ts.map +1 -0
- package/dist/core/storage/builtins.js +683 -0
- package/dist/core/storage/catalog.d.ts +19 -0
- package/dist/core/storage/catalog.d.ts.map +1 -0
- package/dist/core/storage/catalog.js +365 -0
- package/dist/core/storage/config.d.ts +16 -0
- package/dist/core/storage/config.d.ts.map +1 -0
- package/dist/core/storage/config.js +311 -0
- package/dist/core/storage/contract.d.ts +275 -0
- package/dist/core/storage/contract.d.ts.map +1 -0
- package/dist/core/storage/contract.js +3 -0
- package/dist/core/storage/durable-history.d.ts +36 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -0
- package/dist/core/storage/durable-history.js +606 -0
- package/dist/core/storage/health.d.ts +4 -0
- package/dist/core/storage/health.d.ts.map +1 -0
- package/dist/core/storage/health.js +65 -0
- package/dist/core/storage/index.d.ts +16 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +15 -0
- package/dist/core/storage/inventory.d.ts +25 -0
- package/dist/core/storage/inventory.d.ts.map +1 -0
- package/dist/core/storage/inventory.js +666 -0
- package/dist/core/storage/jsonl.d.ts +52 -0
- package/dist/core/storage/jsonl.d.ts.map +1 -0
- package/dist/core/storage/jsonl.js +156 -0
- package/dist/core/storage/log-retention.d.ts +52 -0
- package/dist/core/storage/log-retention.d.ts.map +1 -0
- package/dist/core/storage/log-retention.js +419 -0
- package/dist/core/storage/logger.d.ts +82 -0
- package/dist/core/storage/logger.d.ts.map +1 -0
- package/dist/core/storage/logger.js +411 -0
- package/dist/core/storage/maintenance-providers.d.ts +26 -0
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
- package/dist/core/storage/maintenance-providers.js +141 -0
- package/dist/core/storage/maintenance.d.ts +125 -0
- package/dist/core/storage/maintenance.d.ts.map +1 -0
- package/dist/core/storage/maintenance.js +609 -0
- package/dist/core/storage/metrics.d.ts +60 -0
- package/dist/core/storage/metrics.d.ts.map +1 -0
- package/dist/core/storage/metrics.js +134 -0
- package/dist/core/storage/policy.d.ts +7 -0
- package/dist/core/storage/policy.d.ts.map +1 -0
- package/dist/core/storage/policy.js +110 -0
- package/dist/core/storage/process-log.d.ts +38 -0
- package/dist/core/storage/process-log.d.ts.map +1 -0
- package/dist/core/storage/process-log.js +165 -0
- package/dist/core/storage/query.d.ts +34 -0
- package/dist/core/storage/query.d.ts.map +1 -0
- package/dist/core/storage/query.js +295 -0
- package/dist/core/storage/receipts.d.ts +23 -0
- package/dist/core/storage/receipts.d.ts.map +1 -0
- package/dist/core/storage/receipts.js +117 -0
- package/dist/core/storage/segments.d.ts +84 -0
- package/dist/core/storage/segments.d.ts.map +1 -0
- package/dist/core/storage/segments.js +542 -0
- package/dist/core/storage/sink-graph.d.ts +65 -0
- package/dist/core/storage/sink-graph.d.ts.map +1 -0
- package/dist/core/storage/sink-graph.js +213 -0
- package/dist/core/storage/storm-control.d.ts +23 -0
- package/dist/core/storage/storm-control.d.ts.map +1 -0
- package/dist/core/storage/storm-control.js +59 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +10 -14
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lazy-commands.d.ts +26 -0
- package/dist/lazy-commands.d.ts.map +1 -0
- package/dist/lazy-commands.js +210 -0
- package/dist/lib/docs-lint.d.ts +2 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +45 -80
- package/dist/lib/docs-metadata-audit.d.ts +3 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
- package/dist/lib/docs-metadata-audit.js +13 -23
- package/dist/lib/docs-metadata-sync.d.ts +1 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
- package/dist/lib/docs-metadata-sync.js +28 -10
- package/dist/lib/docs-repository-view.d.ts +22 -0
- package/dist/lib/docs-repository-view.d.ts.map +1 -0
- package/dist/lib/docs-repository-view.js +185 -0
- package/dist/lib/http/client.d.ts +11 -5
- package/dist/lib/http/client.d.ts.map +1 -1
- package/dist/lib/http/client.js +22 -4
- package/dist/lib/http/index.d.ts +1 -1
- package/dist/lib/http/index.d.ts.map +1 -1
- package/dist/lib/http/index.js +1 -1
- package/dist/lib/indexer-exclusions.d.ts +27 -0
- package/dist/lib/indexer-exclusions.d.ts.map +1 -0
- package/dist/lib/indexer-exclusions.js +176 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +5 -0
- package/dist/lib/local-file-url.d.ts +9 -0
- package/dist/lib/local-file-url.d.ts.map +1 -0
- package/dist/lib/local-file-url.js +20 -0
- package/dist/lib/web-performance.d.ts +118 -0
- package/dist/lib/web-performance.d.ts.map +1 -0
- package/dist/lib/web-performance.js +192 -0
- package/package.json +29 -2
- package/schemas/config.schema.json +58 -0
- package/schemas/event-v3.schema.json +324 -112
- package/src/commander.ts +462 -95
- package/src/commands/agents.ts +517 -190
- package/src/commands/backup.ts +18 -14
- package/src/commands/browse-session.ts +12 -0
- package/src/commands/browse.ts +6 -7
- package/src/commands/conversations.ts +279 -0
- package/src/commands/deinit.ts +6 -0
- package/src/commands/docs.ts +25 -6
- package/src/commands/doctor.ts +75 -9
- package/src/commands/fetch.ts +7 -6
- package/src/commands/files.ts +143 -0
- package/src/commands/governor.ts +13 -12
- package/src/commands/inbox.ts +61 -0
- package/src/commands/init.ts +78 -16
- package/src/commands/ledger-v3.ts +421 -1
- package/src/commands/logs.ts +224 -0
- package/src/commands/messages.ts +61 -0
- package/src/commands/outline.ts +6 -2
- package/src/commands/read.ts +6 -2
- package/src/commands/semantic.ts +66 -1
- package/src/commands/storage.ts +310 -0
- package/src/commands/tunnel.ts +66 -52
- package/src/commands/web.ts +77 -7
- package/src/commands/work.ts +3 -3
- package/src/commands/workflow.ts +13 -13
- package/src/core/agents/cli.ts +259 -53
- package/src/core/agents/live-authority-v3.ts +341 -10
- package/src/core/agents/live-lifecycle-v3.ts +6 -1
- package/src/core/agents/live-observation-v3.ts +6 -1
- package/src/core/agents/render/prompt-context.ts +27 -6
- package/src/core/agents/rules/stop-hook.ts +107 -16
- package/src/core/agents/rules/verdict.ts +1 -0
- package/src/core/agents/session-events.ts +4 -0
- package/src/core/agents/session-finalization-state-v3.ts +1 -1
- package/src/core/agents/session-finalizer-v3.ts +4 -1
- package/src/core/agents/state/activity-log.ts +7 -2
- package/src/core/agents/state/heartbeat-writer.ts +27 -0
- package/src/core/agents/state/live-coordination-view.ts +16 -105
- package/src/core/agents/state/live-coordination-writer.ts +141 -0
- package/src/core/artifacts/index.ts +64 -1
- package/src/core/config.ts +126 -5
- package/src/core/conversations/archive.ts +237 -0
- package/src/core/conversations/catalog.ts +79 -0
- package/src/core/conversations/context-pack.ts +72 -0
- package/src/core/conversations/contract.ts +178 -0
- package/src/core/conversations/evaluation.ts +30 -0
- package/src/core/conversations/index.ts +9 -0
- package/src/core/conversations/lifecycle.ts +63 -0
- package/src/core/conversations/normalize.ts +105 -0
- package/src/core/conversations/query.ts +318 -0
- package/src/core/conversations/search-index.ts +48 -0
- package/src/core/events/legacy-storage/canary.ts +177 -0
- package/src/core/events/legacy-storage/fence.ts +129 -0
- package/src/core/events/legacy-storage/index.ts +5 -0
- package/src/core/events/legacy-storage/inventory.ts +51 -0
- package/src/core/events/legacy-storage/manifest.ts +136 -0
- package/src/core/events/legacy-storage/reader.ts +178 -0
- package/src/core/events/v3/authority-outbox.ts +22 -1
- package/src/core/events/v3/base-contract.ts +17 -7
- package/src/core/events/v3/bootstrap.ts +195 -2
- package/src/core/events/v3/capabilities.ts +3 -3
- package/src/core/events/v3/control-witness.ts +339 -0
- package/src/core/events/v3/control-writer.ts +16 -0
- package/src/core/events/v3/control.ts +54 -18
- package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
- package/src/core/events/v3/coordination-view.ts +17 -1
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +5 -2
- package/src/core/events/v3/live-route-observer.ts +80 -0
- package/src/core/events/v3/live-routing.ts +64 -46
- package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
- package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
- package/src/core/events/v3/producers/hook-base.ts +1 -1
- package/src/core/events/v3/producers/intake.ts +30 -2
- package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
- package/src/core/events/v3/producers/recorder.ts +571 -33
- package/src/core/events/v3/reader.ts +243 -2
- package/src/core/events/v3/rotation-config.ts +98 -0
- package/src/core/events/v3/runtime-build.ts +41 -0
- package/src/core/events/v3/runtime-identity.ts +16 -0
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
- package/src/core/events/v3/support-storage/classify.ts +209 -0
- package/src/core/events/v3/support-storage/eligibility.ts +58 -0
- package/src/core/events/v3/support-storage/index.ts +9 -0
- package/src/core/events/v3/support-storage/inventory.ts +135 -0
- package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
- package/src/core/events/v3/support-storage/maintenance.ts +501 -0
- package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
- package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
- package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
- package/src/core/events/v3/support-storage/recovery.ts +43 -0
- package/src/core/events/v3/turn-telemetry.ts +58 -7
- package/src/core/events/v3/writer.ts +168 -16
- package/src/core/governor/plan-read.ts +5 -18
- package/src/core/governor/planning.ts +5 -8
- package/src/core/governor/service-read.ts +320 -2
- package/src/core/governor/service.ts +49 -22
- package/src/core/guard/evidence-v3.ts +1 -0
- package/src/core/hooks/adapter/events.ts +1 -0
- package/src/core/hooks/adapter/output.ts +12 -5
- package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
- package/src/core/hooks/cli.ts +226 -32
- package/src/core/hooks/effects/image-capture.ts +4 -1
- package/src/core/hooks/remediation-cap.ts +12 -6
- package/src/core/hooks/resolve/coord-root.ts +91 -11
- package/src/core/hooks/resolve/owner.ts +4 -0
- package/src/core/hooks/resolve/transcript.ts +18 -0
- package/src/core/inbox/contract.ts +81 -0
- package/src/core/inbox/index.ts +4 -0
- package/src/core/inbox/lifecycle.ts +104 -0
- package/src/core/inbox/service.ts +305 -0
- package/src/core/inbox/watcher.ts +36 -0
- package/src/core/presence/codec-digest.ts +15 -9
- package/src/core/presence/relay-client.ts +55 -7
- package/src/core/semantic/adapters.ts +200 -41
- package/src/core/semantic/contract.ts +135 -3
- package/src/core/semantic/index.ts +76 -2
- package/src/core/semantic/once.ts +93 -7
- package/src/core/semantic/prompt.ts +13 -1
- package/src/core/semantic/review.ts +803 -0
- package/src/core/semantic/routes.ts +30 -0
- package/src/core/semantic/scheduler.ts +49 -5
- package/src/core/semantic/service-status.ts +99 -5
- package/src/core/semantic/service.ts +116 -15
- package/src/core/semantic/soak.ts +638 -0
- package/src/core/semantic/storage.ts +20 -6
- package/src/core/semantic/usage.ts +272 -0
- package/src/core/semantic/validate.ts +31 -0
- package/src/core/storage/buffer.ts +124 -0
- package/src/core/storage/builtins.ts +916 -0
- package/src/core/storage/catalog.ts +467 -0
- package/src/core/storage/config.ts +423 -0
- package/src/core/storage/contract.ts +342 -0
- package/src/core/storage/durable-history.ts +738 -0
- package/src/core/storage/health.ts +76 -0
- package/src/core/storage/index.ts +15 -0
- package/src/core/storage/inventory.ts +859 -0
- package/src/core/storage/jsonl.ts +213 -0
- package/src/core/storage/log-retention.ts +555 -0
- package/src/core/storage/logger.ts +546 -0
- package/src/core/storage/maintenance-providers.ts +200 -0
- package/src/core/storage/maintenance.ts +929 -0
- package/src/core/storage/metrics.ts +199 -0
- package/src/core/storage/policy.ts +141 -0
- package/src/core/storage/process-log.ts +203 -0
- package/src/core/storage/query.ts +360 -0
- package/src/core/storage/receipts.ts +162 -0
- package/src/core/storage/segments.ts +721 -0
- package/src/core/storage/sink-graph.ts +343 -0
- package/src/core/storage/storm-control.ts +91 -0
- package/src/core/work/state.ts +12 -21
- package/src/core/workflow/live-session-v3.ts +2 -4
- package/src/index.ts +2 -0
- package/src/lazy-commands.ts +294 -0
- package/src/lib/docs-lint.ts +58 -77
- package/src/lib/docs-metadata-audit.ts +26 -21
- package/src/lib/docs-metadata-sync.ts +32 -9
- package/src/lib/docs-repository-view.ts +220 -0
- package/src/lib/http/client.ts +44 -8
- package/src/lib/http/index.ts +6 -1
- package/src/lib/indexer-exclusions.ts +173 -0
- package/src/lib/instructions/templates.ts +5 -0
- package/src/lib/local-file-url.ts +31 -0
- package/src/lib/web-performance.ts +335 -0
package/src/commands/doctor.ts
CHANGED
|
@@ -12,13 +12,17 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { spawnSync } from "node:child_process";
|
|
15
|
-
import { existsSync } from "node:fs";
|
|
15
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
16
16
|
import os from "node:os";
|
|
17
17
|
import path from "node:path";
|
|
18
18
|
import type { Command } from "commander";
|
|
19
19
|
import type { EmitContext } from "../commander.ts";
|
|
20
20
|
import { BUILTIN_ADAPTER_IDS } from "../core/adapters/index.ts";
|
|
21
21
|
import { resolveBinName, ripgrepAutoInstall } from "../core/config.ts";
|
|
22
|
+
import {
|
|
23
|
+
countSummarizedSinceV3,
|
|
24
|
+
listDiagnosticSummariesV3,
|
|
25
|
+
} from "../core/events/v3/producers/diagnostic-summaries.ts";
|
|
22
26
|
import { ADAPTER_SPECS, type AdapterId } from "../core/hooks/adapter/events.ts";
|
|
23
27
|
import { loadAdapterWiring, summarizeAdapterWiring } from "../core/hooks/adapter/wiring.ts";
|
|
24
28
|
import {
|
|
@@ -107,8 +111,10 @@ export function registerDoctorCommand(program: Command, emit: EmitContext): void
|
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
export async function runChecks(): Promise<Check[]> {
|
|
114
|
+
const root = findCoordProjectRoot();
|
|
110
115
|
const codexWslStatus = inspectCodexWslBridge();
|
|
111
|
-
const
|
|
116
|
+
const recentCodexMidFlightCount = root ? countRecentCodexMidFlightOnboardings(root) : 0;
|
|
117
|
+
const codexWslBridge = codexWslBridgeCheck(codexWslStatus, recentCodexMidFlightCount);
|
|
112
118
|
// Probe the adapter CLIs before the hook check runs, not in output order:
|
|
113
119
|
// an unwired adapter only matters if its CLI is actually installed, and
|
|
114
120
|
// probing once here keeps that join to one spawn per CLI.
|
|
@@ -163,18 +169,78 @@ function checkGitHookRegions(): Check {
|
|
|
163
169
|
}
|
|
164
170
|
}
|
|
165
171
|
|
|
166
|
-
function
|
|
167
|
-
|
|
172
|
+
export function codexWslBridgeCheck(
|
|
173
|
+
status: CodexWslBridgeStatus | null,
|
|
174
|
+
recentMidFlightCount = 0,
|
|
175
|
+
): Check | null {
|
|
176
|
+
if (!status && recentMidFlightCount === 0) return null;
|
|
177
|
+
const historical =
|
|
178
|
+
recentMidFlightCount === 0
|
|
179
|
+
? null
|
|
180
|
+
: `${recentMidFlightCount} Codex mid-flight onboarding${recentMidFlightCount === 1 ? "" : "s"} recorded in the last 48h`;
|
|
168
181
|
return {
|
|
169
182
|
name: "codex:WSL bridge",
|
|
170
|
-
severity: status
|
|
171
|
-
detail: status
|
|
172
|
-
hint:
|
|
173
|
-
|
|
174
|
-
|
|
183
|
+
severity: status?.ok && !historical ? "ok" : "warn",
|
|
184
|
+
detail: [status?.detail, historical].filter(Boolean).join("; "),
|
|
185
|
+
hint:
|
|
186
|
+
status?.ok && !historical
|
|
187
|
+
? undefined
|
|
188
|
+
: "forward CODEX_THREAD_ID through WSLENV in the Codex shell environment policy, then start a fresh task",
|
|
175
189
|
};
|
|
176
190
|
}
|
|
177
191
|
|
|
192
|
+
const CODEX_MID_FLIGHT_HISTORY_WINDOW_MS = 48 * 60 * 60 * 1000;
|
|
193
|
+
|
|
194
|
+
/** Count bounded, privacy-safe recovery diagnostics so a healthy environment
|
|
195
|
+
* now does not hide an intermittent Codex-to-WSL identity drop. */
|
|
196
|
+
export function countRecentCodexMidFlightOnboardings(
|
|
197
|
+
coordRoot: string,
|
|
198
|
+
nowMs = Date.now(),
|
|
199
|
+
windowMs = CODEX_MID_FLIGHT_HISTORY_WINDOW_MS,
|
|
200
|
+
): number {
|
|
201
|
+
// Occurrences past the producer's loose-exemplar bound live in summary
|
|
202
|
+
// files instead of loose diagnostics; count them too so the mitigation
|
|
203
|
+
// cannot hide an active Codex identity drop from this warning.
|
|
204
|
+
let count = 0;
|
|
205
|
+
try {
|
|
206
|
+
const listing = listDiagnosticSummariesV3(coordRoot);
|
|
207
|
+
count += countSummarizedSinceV3(
|
|
208
|
+
listing.summaries,
|
|
209
|
+
nowMs - windowMs,
|
|
210
|
+
(summary) =>
|
|
211
|
+
summary.category === "mid_flight_onboarding" && summary.metadata.adapter === "codex",
|
|
212
|
+
nowMs,
|
|
213
|
+
);
|
|
214
|
+
} catch {
|
|
215
|
+
// Summary reads are best-effort; loose diagnostics below still count.
|
|
216
|
+
}
|
|
217
|
+
const directory = path.join(coordRoot, ".harnery", "ledgers", "v3", "diagnostics");
|
|
218
|
+
if (!existsSync(directory)) return count;
|
|
219
|
+
for (const name of readdirSync(directory)) {
|
|
220
|
+
if (!name.startsWith("mid_flight_onboarding-") || !name.endsWith(".json")) continue;
|
|
221
|
+
try {
|
|
222
|
+
const row = JSON.parse(readFileSync(path.join(directory, name), "utf8")) as {
|
|
223
|
+
recorded_at?: unknown;
|
|
224
|
+
category?: unknown;
|
|
225
|
+
adapter?: unknown;
|
|
226
|
+
};
|
|
227
|
+
const recordedAt = typeof row.recorded_at === "string" ? Date.parse(row.recorded_at) : NaN;
|
|
228
|
+
if (
|
|
229
|
+
row.category === "mid_flight_onboarding" &&
|
|
230
|
+
row.adapter === "codex" &&
|
|
231
|
+
Number.isFinite(recordedAt) &&
|
|
232
|
+
recordedAt <= nowMs &&
|
|
233
|
+
nowMs - recordedAt <= windowMs
|
|
234
|
+
) {
|
|
235
|
+
count += 1;
|
|
236
|
+
}
|
|
237
|
+
} catch {
|
|
238
|
+
// A malformed best-effort diagnostic cannot make doctor fail.
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return count;
|
|
242
|
+
}
|
|
243
|
+
|
|
178
244
|
export function codexAuthorizationCheck(result: CodexHookAuthorizationResult): Check {
|
|
179
245
|
const reviewHint =
|
|
180
246
|
"terminal UI: run `/hooks`; Codex Desktop: open Settings > Hooks; after approval, start a fresh task";
|
package/src/commands/fetch.ts
CHANGED
|
@@ -86,7 +86,7 @@ async function runFetch(
|
|
|
86
86
|
const timeoutMs = Number.parseInt(opts.timeout, 10);
|
|
87
87
|
const ac = new AbortController();
|
|
88
88
|
const timer = setTimeout(() => ac.abort(), timeoutMs);
|
|
89
|
-
let result: Awaited<ReturnType<typeof fetchWithJar
|
|
89
|
+
let result: Awaited<ReturnType<typeof fetchWithJar<"bytes">>>;
|
|
90
90
|
try {
|
|
91
91
|
result = await fetchWithJar(url, {
|
|
92
92
|
method: opts.method,
|
|
@@ -96,13 +96,14 @@ async function runFetch(
|
|
|
96
96
|
redirect: opts.redirect as RequestRedirect,
|
|
97
97
|
signal: ac.signal,
|
|
98
98
|
extraHeaders: context?.extraHeaders,
|
|
99
|
+
responseType: "bytes",
|
|
99
100
|
});
|
|
100
101
|
} finally {
|
|
101
102
|
clearTimeout(timer);
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
if (opts.json) {
|
|
105
|
-
emit.data(result
|
|
106
|
+
emit.data({ ...result, body: new TextDecoder().decode(result.body) });
|
|
106
107
|
return;
|
|
107
108
|
}
|
|
108
109
|
if (opts.status) {
|
|
@@ -117,14 +118,14 @@ async function runFetch(
|
|
|
117
118
|
if (opts.output) {
|
|
118
119
|
writeFileSync(opts.output, result.body);
|
|
119
120
|
emit.file(opts.output, {
|
|
120
|
-
bytes: result.body.
|
|
121
|
+
bytes: result.body.byteLength,
|
|
121
122
|
status: result.status,
|
|
122
123
|
status_text: result.statusText,
|
|
123
124
|
});
|
|
124
125
|
} else {
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
emit.text(result.body);
|
|
126
|
+
// Text destinations decode at the presentation boundary. File output
|
|
127
|
+
// above keeps the response bytes intact regardless of MIME type.
|
|
128
|
+
emit.text(new TextDecoder().decode(result.body));
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
if (jar && result.cookiesSaved > 0) {
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { realpathSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import type { EmitContext, HarneryProgramContext } from "../commander.ts";
|
|
5
|
+
import { resolveCoordRoot } from "../core/agents/coord-client.ts";
|
|
6
|
+
import { DEFAULT_WEB_PORT, resolveWebPort } from "../core/config.ts";
|
|
7
|
+
import { localFilesOriginUrl, localFileViewerUrl } from "../lib/local-file-url.ts";
|
|
8
|
+
|
|
9
|
+
export { FILES_ORIGIN_HOST } from "../lib/local-file-url.ts";
|
|
10
|
+
|
|
11
|
+
export type LocalFileUrlMode = "auto" | "raw" | "viewer";
|
|
12
|
+
|
|
13
|
+
export interface LocalFileUrlOptions {
|
|
14
|
+
coordRoot: string;
|
|
15
|
+
port: number;
|
|
16
|
+
mode?: LocalFileUrlMode;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface LocalFileUrl {
|
|
20
|
+
url: string;
|
|
21
|
+
relPath: string;
|
|
22
|
+
mode: Exclude<LocalFileUrlMode, "auto">;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isOutsideRoot(relPath: string): boolean {
|
|
26
|
+
return relPath === "" || relPath === ".." || relPath.startsWith(`..${path.sep}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function canonicalRepoPath(input: string, coordRoot: string): string {
|
|
30
|
+
if (input.trim() === "") throw new Error("path must not be empty");
|
|
31
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: URL output must stay one clean line
|
|
32
|
+
if (/[\u0000-\u001f\u007f]/.test(input)) throw new Error("path contains control bytes");
|
|
33
|
+
|
|
34
|
+
let root: string;
|
|
35
|
+
try {
|
|
36
|
+
root = realpathSync(coordRoot);
|
|
37
|
+
} catch {
|
|
38
|
+
throw new Error(`coord root does not exist: ${coordRoot}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const candidate = path.isAbsolute(input) ? input : path.resolve(root, input);
|
|
42
|
+
let canonical: string;
|
|
43
|
+
try {
|
|
44
|
+
canonical = realpathSync(candidate);
|
|
45
|
+
} catch {
|
|
46
|
+
throw new Error(`file does not exist: ${input}`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const relPath = path.relative(root, canonical);
|
|
50
|
+
if (isOutsideRoot(relPath) || path.isAbsolute(relPath)) {
|
|
51
|
+
throw new Error(`file is outside the coord root: ${input}`);
|
|
52
|
+
}
|
|
53
|
+
if (!statSync(canonical).isFile()) throw new Error(`path is not a file: ${input}`);
|
|
54
|
+
return relPath.split(path.sep).join("/");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isHtmlPath(relPath: string): boolean {
|
|
58
|
+
const lower = relPath.toLowerCase();
|
|
59
|
+
return lower.endsWith(".html") || lower.endsWith(".htm");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Mint the local browser URL for a file under the dashboard's coord root.
|
|
64
|
+
* HTML defaults to the isolated files origin so scripts and relative assets
|
|
65
|
+
* work. Other files default to the dashboard viewer.
|
|
66
|
+
*/
|
|
67
|
+
export function mintLocalFileUrl(input: string, options: LocalFileUrlOptions): LocalFileUrl {
|
|
68
|
+
const relPath = canonicalRepoPath(input, options.coordRoot);
|
|
69
|
+
const requestedMode = options.mode ?? "auto";
|
|
70
|
+
const mode = requestedMode === "auto" ? (isHtmlPath(relPath) ? "raw" : "viewer") : requestedMode;
|
|
71
|
+
const url =
|
|
72
|
+
mode === "raw"
|
|
73
|
+
? localFilesOriginUrl(relPath, options.port)
|
|
74
|
+
: localFileViewerUrl(relPath, options.port);
|
|
75
|
+
return { url, relPath, mode };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function registerFilesCommand(
|
|
79
|
+
program: Command,
|
|
80
|
+
emit: EmitContext,
|
|
81
|
+
context?: HarneryProgramContext,
|
|
82
|
+
): void {
|
|
83
|
+
const files = program
|
|
84
|
+
.command("files")
|
|
85
|
+
.description("Mint browser links for files served by the local dashboard");
|
|
86
|
+
|
|
87
|
+
files
|
|
88
|
+
.command("url")
|
|
89
|
+
.description("Mint the local browser URL for a repo file")
|
|
90
|
+
.argument("<path>", "Repo-relative path, or an absolute path inside the coord root")
|
|
91
|
+
.option("-p, --port <port>", `Dashboard port (default ${DEFAULT_WEB_PORT})`)
|
|
92
|
+
.option("--coord-root <dir>", "Override the coord root")
|
|
93
|
+
.option("--raw", "Use the isolated files origin, regardless of extension")
|
|
94
|
+
.option("--viewer", "Use the dashboard file viewer, regardless of extension")
|
|
95
|
+
.action(
|
|
96
|
+
(
|
|
97
|
+
filePath: string,
|
|
98
|
+
opts: { port?: string; coordRoot?: string; raw?: boolean; viewer?: boolean },
|
|
99
|
+
) => {
|
|
100
|
+
if (opts.raw && opts.viewer) {
|
|
101
|
+
emit.error({
|
|
102
|
+
code: "conflicting_url_modes",
|
|
103
|
+
message: "--raw and --viewer cannot be used together",
|
|
104
|
+
});
|
|
105
|
+
emit.setExitCode(1);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const coordRoot =
|
|
109
|
+
opts.coordRoot ??
|
|
110
|
+
context?.resolveCoordRoot?.() ??
|
|
111
|
+
context?.repoRoot ??
|
|
112
|
+
resolveCoordRoot(process.cwd()) ??
|
|
113
|
+
process.cwd();
|
|
114
|
+
let port: number;
|
|
115
|
+
try {
|
|
116
|
+
port = resolveWebPort(opts.port, coordRoot);
|
|
117
|
+
} catch (error) {
|
|
118
|
+
emit.error({
|
|
119
|
+
code: "invalid_web_port",
|
|
120
|
+
message: error instanceof Error ? error.message : "invalid web port",
|
|
121
|
+
hint: `Use an integer from 1024 through 65535; the default is ${DEFAULT_WEB_PORT}.`,
|
|
122
|
+
});
|
|
123
|
+
emit.setExitCode(1);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const result = mintLocalFileUrl(filePath, {
|
|
128
|
+
coordRoot,
|
|
129
|
+
port,
|
|
130
|
+
mode: opts.raw ? "raw" : opts.viewer ? "viewer" : "auto",
|
|
131
|
+
});
|
|
132
|
+
emit.text(`${result.url}\n`);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
emit.error({
|
|
135
|
+
code: "invalid_local_file",
|
|
136
|
+
message: error instanceof Error ? error.message : "invalid local file path",
|
|
137
|
+
hint: "Pass an existing file inside the dashboard coord root.",
|
|
138
|
+
});
|
|
139
|
+
emit.setExitCode(1);
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
);
|
|
143
|
+
}
|
package/src/commands/governor.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
2
|
import { dirname, isAbsolute, resolve } from "node:path";
|
|
3
3
|
import type { Command } from "commander";
|
|
4
4
|
import type { EmitContext } from "../commander.ts";
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
probeBinaryVersion,
|
|
9
9
|
readAttestation,
|
|
10
10
|
} from "../core/adapters/index.ts";
|
|
11
|
+
import { resolveCoordRoot } from "../core/agents/coord-client.ts";
|
|
11
12
|
import { workflowSubscriptionOnly } from "../core/config.ts";
|
|
12
13
|
import { inspectAdapterSpread } from "../core/governor/adapter-spread.ts";
|
|
13
14
|
import {
|
|
@@ -22,7 +23,6 @@ import {
|
|
|
22
23
|
type GovernorRunReport,
|
|
23
24
|
type GovernorServiceConfig,
|
|
24
25
|
type GovernorServiceStatus,
|
|
25
|
-
governorServiceLogPath,
|
|
26
26
|
listGovernorsWithWarnings,
|
|
27
27
|
readGovernor,
|
|
28
28
|
readGovernorPlan,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
runGovernorServiceDaemon,
|
|
36
36
|
spawnGovernorService,
|
|
37
37
|
} from "../core/governor/index.ts";
|
|
38
|
-
import {
|
|
38
|
+
import { readGovernorServiceLogs } from "../core/governor/service-read.ts";
|
|
39
39
|
import type { PolicyIsolation } from "../core/policy/index.ts";
|
|
40
40
|
import { loadPolicyFile } from "../core/policy/index.ts";
|
|
41
41
|
import type { WorkflowSpecialistProfile } from "../core/workflow/index.ts";
|
|
@@ -401,16 +401,17 @@ function registerServiceCommand(
|
|
|
401
401
|
withGovernorRoot(emit, (coordRoot) => {
|
|
402
402
|
const lines = integer(opts.lines) ?? 50;
|
|
403
403
|
if (lines > 10_000) throw new Error("service log lines must not exceed 10000");
|
|
404
|
-
const
|
|
405
|
-
|
|
404
|
+
const result = readGovernorServiceLogs(coordRoot, {
|
|
405
|
+
max_bytes: 512 * 1024,
|
|
406
|
+
max_records: 10_000,
|
|
407
|
+
});
|
|
408
|
+
if (result.lines.length === 0) {
|
|
406
409
|
emit.text("no governor service log\n");
|
|
407
410
|
return;
|
|
408
411
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
.
|
|
412
|
-
.join("\n");
|
|
413
|
-
emit.text(selected.endsWith("\n") ? selected : `${selected}\n`);
|
|
412
|
+
emit.text(`${result.lines.slice(-lines).join("\n")}\n`);
|
|
413
|
+
if (result.truncated)
|
|
414
|
+
emit.log("governor service log read stopped at its bounded budget", "warn");
|
|
414
415
|
});
|
|
415
416
|
});
|
|
416
417
|
|
|
@@ -922,7 +923,7 @@ function delay(ms: number): Promise<void> {
|
|
|
922
923
|
}
|
|
923
924
|
|
|
924
925
|
function withGovernorRoot(emit: EmitContext, fn: (coordRoot: string) => void): void {
|
|
925
|
-
const coordRoot =
|
|
926
|
+
const coordRoot = resolveCoordRoot();
|
|
926
927
|
if (!coordRoot) {
|
|
927
928
|
emit.error({
|
|
928
929
|
code: "no_coord_root",
|
|
@@ -943,7 +944,7 @@ async function withGovernorRootAsync(
|
|
|
943
944
|
emit: EmitContext,
|
|
944
945
|
fn: (coordRoot: string) => Promise<void>,
|
|
945
946
|
): Promise<void> {
|
|
946
|
-
const coordRoot =
|
|
947
|
+
const coordRoot = resolveCoordRoot();
|
|
947
948
|
if (!coordRoot) {
|
|
948
949
|
emit.error({
|
|
949
950
|
code: "no_coord_root",
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { EmitContext } from "../commander.ts";
|
|
3
|
+
import type { HarneryInboxService } from "../core/inbox/service.ts";
|
|
4
|
+
|
|
5
|
+
export function registerInboxCommand(
|
|
6
|
+
program: Command,
|
|
7
|
+
emit: EmitContext,
|
|
8
|
+
service?: HarneryInboxService,
|
|
9
|
+
): void {
|
|
10
|
+
const inbox = program.command("inbox").description("Inspect private coordination inbox state");
|
|
11
|
+
inbox
|
|
12
|
+
.command("list <recipient>")
|
|
13
|
+
.option("--json", "Emit stable JSON")
|
|
14
|
+
.action((recipient: string, options: { json?: boolean }) => {
|
|
15
|
+
run(emit, () => {
|
|
16
|
+
const rows = requireInboxService(service)
|
|
17
|
+
.pending(recipient)
|
|
18
|
+
.map((record) => ({
|
|
19
|
+
message_id: record.message_id,
|
|
20
|
+
sender_instance_id: record.sender_instance_id,
|
|
21
|
+
sender_display_name: record.sender_display_name,
|
|
22
|
+
created_at: record.created_at,
|
|
23
|
+
body_bytes: record.body_bytes,
|
|
24
|
+
body: record.body,
|
|
25
|
+
}));
|
|
26
|
+
if (options.json) {
|
|
27
|
+
emit.config({ format: "json" });
|
|
28
|
+
emit.data({ schema: "harnery.inbox-list/v1", recipient_instance_id: recipient, rows });
|
|
29
|
+
} else emit.rows(rows);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
inbox
|
|
33
|
+
.command("status <recipient>")
|
|
34
|
+
.option("--json", "Emit stable JSON")
|
|
35
|
+
.action((recipient: string, options: { json?: boolean }) => {
|
|
36
|
+
run(emit, () => {
|
|
37
|
+
const status = requireInboxService(service).status(recipient);
|
|
38
|
+
if (options.json) {
|
|
39
|
+
emit.config({ format: "json" });
|
|
40
|
+
emit.data(status);
|
|
41
|
+
} else emit.rows([status as unknown as Record<string, unknown>]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function requireInboxService(service?: HarneryInboxService): HarneryInboxService {
|
|
47
|
+
if (!service) throw new Error("coordination inbox is not configured by this host");
|
|
48
|
+
return service;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function run(emit: EmitContext, action: () => void): void {
|
|
52
|
+
try {
|
|
53
|
+
action();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
emit.error({
|
|
56
|
+
code: "inbox_failed",
|
|
57
|
+
message: error instanceof Error ? error.message : String(error),
|
|
58
|
+
});
|
|
59
|
+
emit.setExitCode(1);
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/commands/init.ts
CHANGED
|
@@ -33,7 +33,6 @@ import {
|
|
|
33
33
|
readEventV3ControlState,
|
|
34
34
|
sha256V3,
|
|
35
35
|
} from "../core/events/v3/index.ts";
|
|
36
|
-
import { liveEventV3BuildId } from "../core/events/v3/live-routing.ts";
|
|
37
36
|
import { ADAPTER_SPECS, type AdapterId, type AdapterSpec } from "../core/hooks/adapter/events.ts";
|
|
38
37
|
import {
|
|
39
38
|
agentHookPathForProject,
|
|
@@ -46,6 +45,7 @@ import {
|
|
|
46
45
|
makeEntry,
|
|
47
46
|
type SettingsFile,
|
|
48
47
|
} from "../core/hooks/adapter/wiring.ts";
|
|
48
|
+
import { applyIndexerExclusions } from "../lib/indexer-exclusions.ts";
|
|
49
49
|
import {
|
|
50
50
|
type ApplyResult,
|
|
51
51
|
applyInstructions,
|
|
@@ -61,6 +61,7 @@ interface InitOpts {
|
|
|
61
61
|
adapter: string;
|
|
62
62
|
dryRun?: boolean;
|
|
63
63
|
check?: boolean;
|
|
64
|
+
instructionsOnly?: boolean;
|
|
64
65
|
projectRoot?: string;
|
|
65
66
|
}
|
|
66
67
|
|
|
@@ -75,7 +76,11 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
75
76
|
)
|
|
76
77
|
.option("--adapter <id>", "claude-code | cursor | codex", "claude-code")
|
|
77
78
|
.option("--dry-run", "Show what would change without writing")
|
|
78
|
-
.option("--check", "Report
|
|
79
|
+
.option("--check", "Report managed-surface drift without writing; exit 0/2/1")
|
|
80
|
+
.option(
|
|
81
|
+
"--instructions-only",
|
|
82
|
+
"Refresh only AGENTS.md regions and Harnery-owned skills; leave runtime wiring untouched",
|
|
83
|
+
)
|
|
79
84
|
.option("--project-root <path>", "Project root (default: git toplevel, else cwd)")
|
|
80
85
|
.action((opts: InitOpts) => {
|
|
81
86
|
const adapter = opts.adapter as AdapterId;
|
|
@@ -94,6 +99,44 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
94
99
|
// CLI re-stamps the host's name into committed agent-facing surfaces.
|
|
95
100
|
const bin = pinnedBinName(projectRoot) ?? (binName?.trim() ? binName : DEFAULT_BIN_NAME);
|
|
96
101
|
|
|
102
|
+
// ── --instructions-only: committed guidance, never runtime wiring ────
|
|
103
|
+
// Some hosts consume Harnery's managed instruction bundle without
|
|
104
|
+
// enabling local adapter hooks or an event ledger. Keep this branch
|
|
105
|
+
// before every coord-root, config, ledger, adapter-settings, and Git-hook
|
|
106
|
+
// operation so its no-runtime-writes contract is structural.
|
|
107
|
+
if (opts.instructionsOnly === true) {
|
|
108
|
+
if (opts.check === true) {
|
|
109
|
+
const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
|
|
110
|
+
const head =
|
|
111
|
+
status === "fresh"
|
|
112
|
+
? `${bin} init --instructions-only --check: instructions + skills are current`
|
|
113
|
+
: status === "drift"
|
|
114
|
+
? `${bin} init --instructions-only --check: drift found (re-run \`init --instructions-only\` to refresh)`
|
|
115
|
+
: `${bin} init --instructions-only --check: error`;
|
|
116
|
+
const lines = issues.length
|
|
117
|
+
? `\n${issues.map((issue) => ` ✗ ${issue}`).join("\n")}`
|
|
118
|
+
: "";
|
|
119
|
+
emit.text(`${head}${lines}`);
|
|
120
|
+
emit.setExitCode(status === "fresh" ? 0 : status === "drift" ? 2 : 1);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const dryRun = opts.dryRun === true;
|
|
125
|
+
let applied: ApplyResult;
|
|
126
|
+
try {
|
|
127
|
+
applied = applyInstructions(projectRoot, { binName: bin, adapter, dryRun });
|
|
128
|
+
} catch (err) {
|
|
129
|
+
if (!(err instanceof HostAddendumError)) throw err;
|
|
130
|
+
emit.text(`${bin} init --instructions-only: ${err.message}`);
|
|
131
|
+
emit.setExitCode(1);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
emit.text(
|
|
135
|
+
renderInstructionsOnly(projectRoot, bin, dryRun, applied.actions, applied.warnings),
|
|
136
|
+
);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
97
140
|
// ── --check: read-only drift report on every init-managed surface ─────
|
|
98
141
|
if (opts.check === true) {
|
|
99
142
|
const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
|
|
@@ -158,7 +201,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
158
201
|
if (gitHooks.status !== "fresh") issues.push(...gitHooks.issues);
|
|
159
202
|
const ledger = readEventV3ControlState(projectRoot);
|
|
160
203
|
if (ledger.state !== "active") issues.push(`event ledger V3 is ${ledger.state}`);
|
|
161
|
-
const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger
|
|
204
|
+
const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger);
|
|
162
205
|
if (ledgerRuntimeIssues.length > 0) {
|
|
163
206
|
issues.push(`event ledger V3 is runtime-stale (${ledgerRuntimeIssues.join(", ")})`);
|
|
164
207
|
}
|
|
@@ -199,6 +242,13 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
199
242
|
actions.push("+ created .harnery/ (+ .harnery/.gitignore)");
|
|
200
243
|
}
|
|
201
244
|
|
|
245
|
+
// ── 1a′. editor indexer exclusions ─────────────────────────────────────
|
|
246
|
+
// .harnery/.gitignore keeps git-aware tools out, but Cursor's codebase
|
|
247
|
+
// indexer and the VS Code/Cursor file watcher do not respect gitignore.
|
|
248
|
+
// A busy coord root holds enough ledger events and artifacts to become a
|
|
249
|
+
// boot-time indexing storm, so exclude it from both here.
|
|
250
|
+
actions.push(...applyIndexerExclusions(projectRoot, dryRun));
|
|
251
|
+
|
|
202
252
|
// ── 1b. stamp the host bin name ────────────────────────────────────────
|
|
203
253
|
// The coord binaries (agent-hook/agent-coord) and web UI run as harnery
|
|
204
254
|
// itself, so they can't see a consumer CLI's name; they read it back from
|
|
@@ -225,7 +275,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
225
275
|
// ── 1d. universal V3 event ledger ────────────────────────────────────
|
|
226
276
|
if (dryRun) {
|
|
227
277
|
const ledger = readEventV3ControlState(projectRoot);
|
|
228
|
-
const runtimeIssues = eventLedgerV3RuntimeIssues(ledger
|
|
278
|
+
const runtimeIssues = eventLedgerV3RuntimeIssues(ledger);
|
|
229
279
|
actions.push(
|
|
230
280
|
ledger.state === "active" && runtimeIssues.length === 0
|
|
231
281
|
? "· event ledger V3 is active"
|
|
@@ -236,7 +286,7 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
|
|
|
236
286
|
} else {
|
|
237
287
|
const harneryBuild = gitBuild(HARNERY_ROOT);
|
|
238
288
|
const ledgerBefore = readEventV3ControlState(projectRoot);
|
|
239
|
-
const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore
|
|
289
|
+
const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore);
|
|
240
290
|
const initialized = initializeEventLedgerV3({
|
|
241
291
|
coordRoot: projectRoot,
|
|
242
292
|
harneryBuild,
|
|
@@ -337,23 +387,16 @@ function digestConfig(path: string): `sha256:${string}` {
|
|
|
337
387
|
}
|
|
338
388
|
|
|
339
389
|
/**
|
|
340
|
-
* Runtime
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* hooks fail closed against stale approvals.
|
|
390
|
+
* Runtime contracts bound into an immutable V3 epoch. `init` replaces the
|
|
391
|
+
* epoch only when the schema or adapter capability contract changed. A new
|
|
392
|
+
* Harnery build alone keeps the current epoch and its live session generations.
|
|
344
393
|
*/
|
|
345
|
-
export function eventLedgerV3RuntimeIssues(
|
|
346
|
-
control: EventV3ControlState,
|
|
347
|
-
harneryBuild: string,
|
|
348
|
-
): string[] {
|
|
394
|
+
export function eventLedgerV3RuntimeIssues(control: EventV3ControlState): string[] {
|
|
349
395
|
if (control.state !== "active") return [];
|
|
350
396
|
const issues: string[] = [];
|
|
351
397
|
const profile = control.genesis.profile;
|
|
352
398
|
if (profile.initial_schema_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("schema digest");
|
|
353
399
|
if (profile.contract_source_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("contract digest");
|
|
354
|
-
if (!profile.producer_build_ids.includes(liveEventV3BuildId(harneryBuild))) {
|
|
355
|
-
issues.push("producer build");
|
|
356
|
-
}
|
|
357
400
|
const expectedCapabilities = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((value) =>
|
|
358
401
|
sha256V3(canonicalJsonV3(value)),
|
|
359
402
|
);
|
|
@@ -699,6 +742,25 @@ function render(
|
|
|
699
742
|
return `${head}\n root: ${projectRoot}\n${actions.map((a) => ` ${a}`).join("\n")}${warnBlock}${tail}`;
|
|
700
743
|
}
|
|
701
744
|
|
|
745
|
+
function renderInstructionsOnly(
|
|
746
|
+
projectRoot: string,
|
|
747
|
+
binName: string,
|
|
748
|
+
dryRun: boolean,
|
|
749
|
+
actions: string[],
|
|
750
|
+
warnings: string[] = [],
|
|
751
|
+
): string {
|
|
752
|
+
const head = dryRun
|
|
753
|
+
? `${binName} init --instructions-only (dry run): no changes written`
|
|
754
|
+
: `${binName} init --instructions-only`;
|
|
755
|
+
const warnBlock = warnings.length
|
|
756
|
+
? `\n${warnings.map((warning) => ` ! ${warning}`).join("\n")}`
|
|
757
|
+
: "";
|
|
758
|
+
const tail = dryRun
|
|
759
|
+
? "\nRe-run without --dry-run to apply."
|
|
760
|
+
: "\nDone. Adapter hooks, managed Git hooks, configuration, and event ledger state were left unchanged.";
|
|
761
|
+
return `${head}\n root: ${projectRoot}\n${actions.map((action) => ` ${action}`).join("\n")}${warnBlock}${tail}`;
|
|
762
|
+
}
|
|
763
|
+
|
|
702
764
|
function gitTopLevel(): string | null {
|
|
703
765
|
const r = spawnSync("git", ["rev-parse", "--show-toplevel"], { encoding: "utf8" });
|
|
704
766
|
const out = r.status === 0 ? r.stdout.trim() : "";
|