harnery 0.32.0 → 0.34.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/README.md +2 -0
- package/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +7 -1
- package/dist/commands/adapter.js +2 -2
- package/dist/commands/agents.d.ts +144 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +1408 -565
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +7 -6
- package/dist/commands/backup.d.ts +1 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +29 -16
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +234 -12
- package/dist/commands/checkpoint.d.ts.map +1 -1
- package/dist/commands/checkpoint.js +3 -2
- package/dist/commands/claude-desktop.d.ts +2 -2
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +2 -2
- package/dist/commands/context.js +1 -6
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +22 -38
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +91 -28
- package/dist/commands/doctor.d.ts +4 -2
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +55 -7
- package/dist/commands/events.d.ts +5 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +189 -0
- package/dist/commands/governor.d.ts.map +1 -1
- package/dist/commands/governor.js +13 -4
- package/dist/commands/init.d.ts +10 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +233 -51
- package/dist/commands/instructions.d.ts +4 -0
- package/dist/commands/instructions.d.ts.map +1 -0
- package/dist/commands/instructions.js +100 -0
- package/dist/commands/journal.d.ts.map +1 -1
- package/dist/commands/journal.js +4 -13
- package/dist/commands/ledger-v3.d.ts +5 -0
- package/dist/commands/ledger-v3.d.ts.map +1 -0
- package/dist/commands/ledger-v3.js +91 -0
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +15 -6
- package/dist/commands/sync.d.ts +1 -1
- package/dist/commands/sync.js +1 -1
- package/dist/commands/web.d.ts +6 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +67 -7
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +22 -5
- package/dist/core/adapter.d.ts +5 -0
- package/dist/core/adapter.d.ts.map +1 -0
- package/dist/core/adapter.js +1 -0
- package/dist/core/adapters/attest.d.ts +5 -2
- package/dist/core/adapters/attest.d.ts.map +1 -1
- package/dist/core/adapters/attest.js +8 -3
- package/dist/core/adapters/profiles.d.ts +6 -6
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +4 -4
- package/dist/core/agents/canonical-emit.d.ts +17 -15
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +27 -25
- package/dist/core/agents/cli.js +212 -235
- package/dist/core/agents/codex-archive-v3.d.ts +14 -0
- package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
- package/dist/core/agents/codex-archive-v3.js +110 -0
- package/dist/core/agents/coord-client.d.ts +19 -70
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +65 -155
- package/dist/core/agents/finalization.d.ts +4 -1
- package/dist/core/agents/finalization.d.ts.map +1 -1
- package/dist/core/agents/finalization.js +89 -32
- package/dist/core/agents/index.d.ts +5 -5
- package/dist/core/agents/index.d.ts.map +1 -1
- package/dist/core/agents/index.js +5 -5
- package/dist/core/agents/live-authority-v3.d.ts +59 -0
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
- package/dist/core/agents/live-authority-v3.js +233 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
- package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
- package/dist/core/agents/live-lifecycle-v3.js +91 -0
- package/dist/core/agents/live-observation-v3.d.ts +25 -0
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
- package/dist/core/agents/live-observation-v3.js +157 -0
- package/dist/core/agents/render/prompt-context.d.ts +10 -4
- package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
- package/dist/core/agents/render/prompt-context.js +61 -55
- package/dist/core/agents/render/session-context.d.ts +1 -1
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +15 -33
- package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +79 -127
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +3 -18
- package/dist/core/agents/rules/stop-hook.d.ts +9 -50
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +193 -236
- package/dist/core/agents/session-events.d.ts +5 -7
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +127 -95
- package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
- package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalization-state-v3.js +40 -0
- package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
- package/dist/core/agents/session-finalizer-v3.js +734 -0
- package/dist/core/agents/session-name-display.d.ts +40 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -0
- package/dist/core/agents/session-name-display.js +119 -0
- package/dist/core/agents/state/activity-log.d.ts +3 -3
- package/dist/core/agents/state/activity-log.d.ts.map +1 -1
- package/dist/core/agents/state/activity-log.js +7 -16
- package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +59 -199
- package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
- package/dist/core/agents/state/live-coordination-view.js +209 -0
- package/dist/core/agents/state/session-state.d.ts +45 -0
- package/dist/core/agents/state/session-state.d.ts.map +1 -0
- package/dist/core/agents/state/session-state.js +90 -0
- package/dist/core/agents/state/stale-sweep.d.ts +1 -1
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +26 -15
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +5 -7
- package/dist/core/config.d.ts +33 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +98 -2
- package/dist/core/context/index.d.ts +1 -4
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +9 -9
- package/dist/core/events/span-parent.d.ts +15 -0
- package/dist/core/events/span-parent.d.ts.map +1 -0
- package/dist/core/events/span-parent.js +34 -0
- package/dist/core/events/v3/advance.d.ts +14 -0
- package/dist/core/events/v3/advance.d.ts.map +1 -0
- package/dist/core/events/v3/advance.js +134 -0
- package/dist/core/events/v3/authority-outbox.d.ts +78 -0
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
- package/dist/core/events/v3/authority-outbox.js +399 -0
- package/dist/core/events/v3/base-builder.d.ts +20 -0
- package/dist/core/events/v3/base-builder.d.ts.map +1 -0
- package/dist/core/events/v3/base-builder.js +29 -0
- package/dist/core/events/v3/base-contract.d.ts +7576 -0
- package/dist/core/events/v3/base-contract.d.ts.map +1 -0
- package/dist/core/events/v3/base-contract.js +647 -0
- package/dist/core/events/v3/bootstrap.d.ts +34 -0
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
- package/dist/core/events/v3/bootstrap.js +175 -0
- package/dist/core/events/v3/builder.d.ts +20 -0
- package/dist/core/events/v3/builder.d.ts.map +1 -0
- package/dist/core/events/v3/builder.js +28 -0
- package/dist/core/events/v3/canonical.d.ts +31 -0
- package/dist/core/events/v3/canonical.d.ts.map +1 -0
- package/dist/core/events/v3/canonical.js +100 -0
- package/dist/core/events/v3/capabilities.d.ts +31 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/capabilities.js +107 -0
- package/dist/core/events/v3/capability-drift.d.ts +22 -0
- package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
- package/dist/core/events/v3/capability-drift.js +134 -0
- package/dist/core/events/v3/catalog.d.ts +38 -0
- package/dist/core/events/v3/catalog.d.ts.map +1 -0
- package/dist/core/events/v3/catalog.js +135 -0
- package/dist/core/events/v3/clock-order.d.ts +34 -0
- package/dist/core/events/v3/clock-order.d.ts.map +1 -0
- package/dist/core/events/v3/clock-order.js +35 -0
- package/dist/core/events/v3/contract.d.ts +171 -0
- package/dist/core/events/v3/contract.d.ts.map +1 -0
- package/dist/core/events/v3/contract.js +180 -0
- package/dist/core/events/v3/control.d.ts +111 -0
- package/dist/core/events/v3/control.d.ts.map +1 -0
- package/dist/core/events/v3/control.js +419 -0
- package/dist/core/events/v3/coordination-view.d.ts +69 -0
- package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
- package/dist/core/events/v3/coordination-view.js +119 -0
- package/dist/core/events/v3/economics.d.ts +77 -0
- package/dist/core/events/v3/economics.d.ts.map +1 -0
- package/dist/core/events/v3/economics.js +274 -0
- package/dist/core/events/v3/finalization-view.d.ts +26 -0
- package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
- package/dist/core/events/v3/finalization-view.js +37 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
- package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
- package/dist/core/events/v3/fingerprint-keys.js +217 -0
- package/dist/core/events/v3/generated.d.ts +4 -0
- package/dist/core/events/v3/generated.d.ts.map +1 -0
- package/dist/core/events/v3/generated.js +47 -0
- package/dist/core/events/v3/ids.d.ts +9 -0
- package/dist/core/events/v3/ids.d.ts.map +1 -0
- package/dist/core/events/v3/ids.js +25 -0
- package/dist/core/events/v3/index.d.ts +35 -0
- package/dist/core/events/v3/index.d.ts.map +1 -0
- package/dist/core/events/v3/index.js +33 -0
- package/dist/core/events/v3/latency.d.ts +63 -0
- package/dist/core/events/v3/latency.d.ts.map +1 -0
- package/dist/core/events/v3/latency.js +412 -0
- package/dist/core/events/v3/live-feed.d.ts +45 -0
- package/dist/core/events/v3/live-feed.d.ts.map +1 -0
- package/dist/core/events/v3/live-feed.js +246 -0
- package/dist/core/events/v3/live-observation.d.ts +35 -0
- package/dist/core/events/v3/live-observation.d.ts.map +1 -0
- package/dist/core/events/v3/live-observation.js +1 -0
- package/dist/core/events/v3/live-routing.d.ts +57 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -0
- package/dist/core/events/v3/live-routing.js +107 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command-recorder.js +477 -0
- package/dist/core/events/v3/producers/command.d.ts +50 -0
- package/dist/core/events/v3/producers/command.d.ts.map +1 -0
- package/dist/core/events/v3/producers/command.js +135 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
- package/dist/core/events/v3/producers/coordination.d.ts +90 -0
- package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
- package/dist/core/events/v3/producers/coordination.js +229 -0
- package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook-base.js +424 -0
- package/dist/core/events/v3/producers/hook.d.ts +29 -0
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
- package/dist/core/events/v3/producers/hook.js +71 -0
- package/dist/core/events/v3/producers/intake.d.ts +65 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
- package/dist/core/events/v3/producers/intake.js +244 -0
- package/dist/core/events/v3/producers/recorder.d.ts +240 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
- package/dist/core/events/v3/producers/recorder.js +2176 -0
- package/dist/core/events/v3/projection.d.ts +101 -0
- package/dist/core/events/v3/projection.d.ts.map +1 -0
- package/dist/core/events/v3/projection.js +479 -0
- package/dist/core/events/v3/reader.d.ts +75 -0
- package/dist/core/events/v3/reader.d.ts.map +1 -0
- package/dist/core/events/v3/reader.js +778 -0
- package/dist/core/events/v3/recovery-record.d.ts +47 -0
- package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
- package/dist/core/events/v3/recovery-record.js +167 -0
- package/dist/core/events/v3/recovery.d.ts +22 -0
- package/dist/core/events/v3/recovery.d.ts.map +1 -0
- package/dist/core/events/v3/recovery.js +227 -0
- package/dist/core/events/v3/span-state.d.ts +52 -0
- package/dist/core/events/v3/span-state.d.ts.map +1 -0
- package/dist/core/events/v3/span-state.js +142 -0
- package/dist/core/events/v3/targets.d.ts +23 -0
- package/dist/core/events/v3/targets.d.ts.map +1 -0
- package/dist/core/events/v3/targets.js +134 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
- package/dist/core/events/v3/turn-telemetry.js +168 -0
- package/dist/core/events/v3/validate.d.ts +9 -0
- package/dist/core/events/v3/validate.d.ts.map +1 -0
- package/dist/core/events/v3/validate.js +281 -0
- package/dist/core/events/v3/writer.d.ts +56 -0
- package/dist/core/events/v3/writer.d.ts.map +1 -0
- package/dist/core/events/v3/writer.js +335 -0
- package/dist/core/governor/index.d.ts +1 -1
- package/dist/core/governor/index.d.ts.map +1 -1
- package/dist/core/governor/index.js +1 -1
- package/dist/core/governor/plan-api.d.ts +2 -1
- package/dist/core/governor/plan-api.d.ts.map +1 -1
- package/dist/core/governor/plan-api.js +6 -3
- package/dist/core/governor/read.d.ts +1 -1
- package/dist/core/governor/read.d.ts.map +1 -1
- package/dist/core/governor/read.js +1 -1
- package/dist/core/governor/state.d.ts +9 -0
- package/dist/core/governor/state.d.ts.map +1 -1
- package/dist/core/governor/state.js +40 -3
- package/dist/core/guard/config.d.ts +5 -0
- package/dist/core/guard/config.d.ts.map +1 -0
- package/dist/core/guard/config.js +157 -0
- package/dist/core/guard/coordinator.d.ts +14 -0
- package/dist/core/guard/coordinator.d.ts.map +1 -0
- package/dist/core/guard/coordinator.js +173 -0
- package/dist/core/guard/evaluator.d.ts +4 -0
- package/dist/core/guard/evaluator.d.ts.map +1 -0
- package/dist/core/guard/evaluator.js +242 -0
- package/dist/core/guard/evidence-v3.d.ts +15 -0
- package/dist/core/guard/evidence-v3.d.ts.map +1 -0
- package/dist/core/guard/evidence-v3.js +171 -0
- package/dist/core/guard/index.d.ts +10 -0
- package/dist/core/guard/index.d.ts.map +1 -0
- package/dist/core/guard/index.js +6 -0
- package/dist/core/guard/live-source-v3.d.ts +40 -0
- package/dist/core/guard/live-source-v3.d.ts.map +1 -0
- package/dist/core/guard/live-source-v3.js +128 -0
- package/dist/core/guard/storage.d.ts +27 -0
- package/dist/core/guard/storage.d.ts.map +1 -0
- package/dist/core/guard/storage.js +140 -0
- package/dist/core/guard/types.d.ts +119 -0
- package/dist/core/guard/types.d.ts.map +1 -0
- package/dist/core/guard/types.js +1 -0
- package/dist/core/hooks/adapter/detect.d.ts +18 -1
- package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
- package/dist/core/hooks/adapter/detect.js +29 -0
- package/dist/core/hooks/adapter/events.d.ts +7 -4
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +13 -4
- package/dist/core/hooks/adapter/output.d.ts +2 -2
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.d.ts +7 -4
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +64 -24
- package/dist/core/hooks/adapter/wiring.d.ts +30 -4
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +89 -11
- package/dist/core/hooks/cli.d.ts +1 -1
- package/dist/core/hooks/cli.js +345 -400
- package/dist/core/hooks/codex-authorization.d.ts +30 -0
- package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
- package/dist/core/hooks/codex-authorization.js +199 -0
- package/dist/core/hooks/effects/image-capture.d.ts +20 -34
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +212 -221
- package/dist/core/hooks/effects/index.d.ts +1 -9
- package/dist/core/hooks/effects/index.d.ts.map +1 -1
- package/dist/core/hooks/effects/index.js +1 -24
- package/dist/core/hooks/events/input-hash.d.ts +7 -0
- package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
- package/dist/core/hooks/events/input-hash.js +43 -0
- package/dist/core/hooks/index.d.ts +4 -3
- package/dist/core/hooks/index.d.ts.map +1 -1
- package/dist/core/hooks/index.js +2 -3
- package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
- package/dist/core/hooks/resolve/coord-root.js +1 -1
- package/dist/core/hooks/resolve/owner.d.ts +16 -15
- package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
- package/dist/core/hooks/resolve/owner.js +51 -42
- package/dist/core/hooks/resolve/transcript.d.ts +33 -3
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +155 -14
- package/dist/core/hooks/session-name-presence.d.ts +9 -10
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +15 -15
- package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
- package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
- package/dist/core/journal/index.d.ts +2 -2
- package/dist/core/journal/index.d.ts.map +1 -1
- package/dist/core/journal/index.js +9 -22
- package/dist/core/presence/blob.d.ts +8 -3
- package/dist/core/presence/blob.d.ts.map +1 -1
- package/dist/core/presence/blob.js +54 -41
- package/dist/core/presence/codec-digest.d.ts +29 -0
- package/dist/core/presence/codec-digest.d.ts.map +1 -0
- package/dist/core/presence/codec-digest.js +170 -0
- package/dist/core/presence/index.js +15 -1
- package/dist/core/presence/relay-client.d.ts +1 -1
- package/dist/core/presence/relay-client.d.ts.map +1 -1
- package/dist/core/presence/relay-client.js +5 -5
- package/dist/core/work/index.d.ts +1 -1
- package/dist/core/work/index.d.ts.map +1 -1
- package/dist/core/work/index.js +1 -1
- package/dist/core/work/read.d.ts +1 -1
- package/dist/core/work/read.d.ts.map +1 -1
- package/dist/core/work/read.js +1 -1
- package/dist/core/work/runner.d.ts.map +1 -1
- package/dist/core/work/runner.js +6 -0
- package/dist/core/work/state.d.ts +9 -0
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +17 -3
- package/dist/core/workflow/engine.js +24 -25
- package/dist/core/workflow/live-session-v3.d.ts +19 -0
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
- package/dist/core/workflow/live-session-v3.js +86 -0
- package/dist/core/workflow/scope-id.d.ts +3 -0
- package/dist/core/workflow/scope-id.d.ts.map +1 -0
- package/dist/core/workflow/scope-id.js +5 -0
- package/dist/core/workflow/workspaces/leases.d.ts +4 -0
- package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +53 -19
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/browser/client.d.ts +41 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +203 -0
- package/dist/lib/browser/critique.d.ts +28 -2
- package/dist/lib/browser/critique.d.ts.map +1 -1
- package/dist/lib/browser/critique.js +74 -18
- package/dist/lib/browser/geometry.d.ts +1 -1
- package/dist/lib/browser/geometry.d.ts.map +1 -1
- package/dist/lib/browser/geometry.js +130 -6
- package/dist/lib/browser/index.d.ts +3 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +3 -0
- package/dist/lib/browser/qa-plan.d.ts +174 -0
- package/dist/lib/browser/qa-plan.d.ts.map +1 -0
- package/dist/lib/browser/qa-plan.js +321 -0
- package/dist/lib/browser/qa-reuse.d.ts +99 -0
- package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
- package/dist/lib/browser/qa-reuse.js +222 -0
- package/dist/lib/browser/qa-snapshot.d.ts +64 -0
- package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
- package/dist/lib/browser/qa-snapshot.js +171 -0
- package/dist/lib/browser/runts.d.ts.map +1 -1
- package/dist/lib/browser/runts.js +22 -1
- package/dist/lib/browser/tiling.d.ts +71 -0
- package/dist/lib/browser/tiling.d.ts.map +1 -0
- package/dist/lib/browser/tiling.js +118 -0
- package/dist/lib/context/index.d.ts +0 -3
- package/dist/lib/context/index.d.ts.map +1 -1
- package/dist/lib/context/index.js +20 -42
- package/dist/lib/council/index.d.ts +2 -2
- package/dist/lib/council/index.d.ts.map +1 -1
- package/dist/lib/council/index.js +9 -20
- package/dist/lib/docs-frontmatter.d.ts +1 -6
- package/dist/lib/docs-frontmatter.d.ts.map +1 -1
- package/dist/lib/docs-frontmatter.js +12 -78
- package/dist/lib/docs-index.d.ts +9 -0
- package/dist/lib/docs-index.d.ts.map +1 -1
- package/dist/lib/docs-index.js +32 -3
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +14 -30
- package/dist/lib/docs-metadata-audit.d.ts +19 -0
- package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
- package/dist/lib/docs-metadata-audit.js +132 -0
- package/dist/lib/docs-metadata-managed.d.ts +23 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
- package/dist/lib/docs-metadata-managed.js +78 -0
- package/dist/lib/docs-metadata-sync.d.ts +20 -0
- package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
- package/dist/lib/docs-metadata-sync.js +222 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
- package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2-schema.js +134 -0
- package/dist/lib/docs-metadata-v2.d.ts +21 -0
- package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
- package/dist/lib/docs-metadata-v2.js +424 -0
- package/dist/lib/docs-new.d.ts +11 -0
- package/dist/lib/docs-new.d.ts.map +1 -0
- package/dist/lib/docs-new.js +52 -0
- package/dist/lib/docs-sweep.d.ts.map +1 -1
- package/dist/lib/docs-sweep.js +45 -29
- package/dist/lib/headless/index.d.ts +98 -0
- package/dist/lib/headless/index.d.ts.map +1 -0
- package/dist/lib/headless/index.js +211 -0
- package/dist/lib/identities/assume.d.ts +4 -4
- package/dist/lib/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +52 -68
- package/dist/lib/instructions/apply.d.ts +5 -4
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +32 -20
- package/dist/lib/instructions/bundle.d.ts +33 -0
- package/dist/lib/instructions/bundle.d.ts.map +1 -0
- package/dist/lib/instructions/bundle.js +149 -0
- package/dist/lib/instructions/splice.d.ts +0 -1
- package/dist/lib/instructions/splice.d.ts.map +1 -1
- package/dist/lib/instructions/splice.js +22 -6
- package/dist/lib/instructions/templates.d.ts +7 -5
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +79 -9
- package/package.json +27 -6
- package/schemas/config.schema.json +120 -2
- package/schemas/docs-metadata-v2.schema.json +441 -0
- package/schemas/event-v3.schema.json +24472 -0
- package/src/commander.ts +7 -1
- package/src/commands/adapter.ts +2 -2
- package/src/commands/agents.ts +1737 -570
- package/src/commands/artifacts.ts +7 -6
- package/src/commands/backup.ts +29 -21
- package/src/commands/browse.ts +349 -8
- package/src/commands/checkpoint.ts +4 -3
- package/src/commands/claude-desktop.ts +7 -5
- package/src/commands/context.ts +1 -6
- package/src/commands/decision.ts +27 -44
- package/src/commands/docs.ts +100 -33
- package/src/commands/doctor.ts +73 -8
- package/src/commands/events.ts +256 -0
- package/src/commands/governor.ts +18 -4
- package/src/commands/init.ts +264 -57
- package/src/commands/instructions.ts +129 -0
- package/src/commands/journal.ts +4 -13
- package/src/commands/ledger-v3.ts +111 -0
- package/src/commands/presence.ts +18 -11
- package/src/commands/sync.ts +1 -1
- package/src/commands/web.ts +67 -8
- package/src/commands/work.ts +28 -5
- package/src/core/adapter.ts +5 -0
- package/src/core/adapters/attest.ts +8 -3
- package/src/core/adapters/profiles.ts +4 -6
- package/src/core/agents/canonical-emit.ts +39 -28
- package/src/core/agents/cli.ts +242 -263
- package/src/core/agents/codex-archive-v3.ts +138 -0
- package/src/core/agents/coord-client.ts +75 -177
- package/src/core/agents/finalization.ts +120 -38
- package/src/core/agents/index.ts +5 -5
- package/src/core/agents/live-authority-v3.ts +375 -0
- package/src/core/agents/live-lifecycle-v3.ts +140 -0
- package/src/core/agents/live-observation-v3.ts +216 -0
- package/src/core/agents/render/prompt-context.ts +89 -55
- package/src/core/agents/render/session-context.ts +23 -32
- package/src/core/agents/rules/claim-conflict.ts +85 -126
- package/src/core/agents/rules/commit-conflict.ts +3 -14
- package/src/core/agents/rules/stop-hook.ts +239 -293
- package/src/core/agents/session-events.ts +137 -104
- package/src/core/agents/session-finalization-state-v3.ts +90 -0
- package/src/core/agents/session-finalizer-v3.ts +953 -0
- package/src/core/agents/session-name-display.ts +149 -0
- package/src/core/agents/state/activity-log.ts +6 -14
- package/src/core/agents/state/heartbeat-writer.ts +98 -242
- package/src/core/agents/state/live-coordination-view.ts +290 -0
- package/src/core/agents/state/session-state.ts +143 -0
- package/src/core/agents/state/stale-sweep.ts +40 -17
- package/src/core/artifacts/index.ts +4 -5
- package/src/core/config.ts +148 -3
- package/src/core/context/index.ts +9 -17
- package/src/core/events/span-parent.ts +46 -0
- package/src/core/events/v3/advance.ts +168 -0
- package/src/core/events/v3/authority-outbox.ts +548 -0
- package/src/core/events/v3/base-builder.ts +60 -0
- package/src/core/events/v3/base-contract.ts +882 -0
- package/src/core/events/v3/bootstrap.ts +226 -0
- package/src/core/events/v3/builder.ts +59 -0
- package/src/core/events/v3/canonical.ts +153 -0
- package/src/core/events/v3/capabilities.ts +171 -0
- package/src/core/events/v3/capability-drift.ts +177 -0
- package/src/core/events/v3/catalog.ts +202 -0
- package/src/core/events/v3/clock-order.ts +41 -0
- package/src/core/events/v3/contract.ts +365 -0
- package/src/core/events/v3/control.ts +576 -0
- package/src/core/events/v3/coordination-view.ts +193 -0
- package/src/core/events/v3/economics.ts +384 -0
- package/src/core/events/v3/finalization-view.ts +67 -0
- package/src/core/events/v3/fingerprint-keys.ts +260 -0
- package/src/core/events/v3/generated.ts +48 -0
- package/src/core/events/v3/ids.ts +33 -0
- package/src/core/events/v3/index.ts +322 -0
- package/src/core/events/v3/latency.ts +551 -0
- package/src/core/events/v3/live-feed.ts +319 -0
- package/src/core/events/v3/live-observation.ts +39 -0
- package/src/core/events/v3/live-routing.ts +135 -0
- package/src/core/events/v3/producers/command-recorder.ts +631 -0
- package/src/core/events/v3/producers/command.ts +201 -0
- package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
- package/src/core/events/v3/producers/coordination.ts +355 -0
- package/src/core/events/v3/producers/hook-base.ts +578 -0
- package/src/core/events/v3/producers/hook.ts +119 -0
- package/src/core/events/v3/producers/intake.ts +319 -0
- package/src/core/events/v3/producers/recorder.ts +2805 -0
- package/src/core/events/v3/projection.ts +653 -0
- package/src/core/events/v3/reader.ts +1127 -0
- package/src/core/events/v3/recovery-record.ts +244 -0
- package/src/core/events/v3/recovery.ts +271 -0
- package/src/core/events/v3/span-state.ts +187 -0
- package/src/core/events/v3/targets.ts +182 -0
- package/src/core/events/v3/turn-telemetry.ts +259 -0
- package/src/core/events/v3/validate.ts +361 -0
- package/src/core/events/v3/writer.ts +419 -0
- package/src/core/governor/index.ts +3 -0
- package/src/core/governor/plan-api.ts +10 -2
- package/src/core/governor/read.ts +3 -0
- package/src/core/governor/state.ts +52 -5
- package/src/core/guard/config.ts +206 -0
- package/src/core/guard/coordinator.ts +227 -0
- package/src/core/guard/evaluator.ts +343 -0
- package/src/core/guard/evidence-v3.ts +227 -0
- package/src/core/guard/index.ts +35 -0
- package/src/core/guard/live-source-v3.ts +204 -0
- package/src/core/guard/storage.ts +188 -0
- package/src/core/guard/types.ts +152 -0
- package/src/core/hooks/adapter/detect.ts +28 -1
- package/src/core/hooks/adapter/events.ts +15 -6
- package/src/core/hooks/adapter/output.ts +7 -2
- package/src/core/hooks/adapter/parse.ts +81 -36
- package/src/core/hooks/adapter/wiring.ts +119 -13
- package/src/core/hooks/cli.ts +398 -422
- package/src/core/hooks/codex-authorization.ts +253 -0
- package/src/core/hooks/effects/image-capture.ts +228 -238
- package/src/core/hooks/effects/index.ts +1 -36
- package/src/core/hooks/events/input-hash.ts +47 -0
- package/src/core/hooks/index.ts +4 -11
- package/src/core/hooks/resolve/coord-root.ts +1 -1
- package/src/core/hooks/resolve/owner.ts +52 -45
- package/src/core/hooks/resolve/transcript.ts +165 -14
- package/src/core/hooks/session-name-presence.ts +14 -15
- package/src/core/hooks/unsafe-cross-shell.ts +1 -1
- package/src/core/journal/index.ts +15 -22
- package/src/core/presence/blob.ts +63 -38
- package/src/core/presence/codec-digest.ts +215 -0
- package/src/core/presence/index.ts +18 -1
- package/src/core/presence/relay-client.ts +5 -5
- package/src/core/work/index.ts +3 -0
- package/src/core/work/read.ts +3 -0
- package/src/core/work/runner.ts +6 -0
- package/src/core/work/state.ts +27 -3
- package/src/core/workflow/engine.ts +24 -24
- package/src/core/workflow/live-session-v3.ts +126 -0
- package/src/core/workflow/scope-id.ts +6 -0
- package/src/core/workflow/workspaces/leases.ts +56 -19
- package/src/index.ts +1 -1
- package/src/lib/browser/client.ts +230 -0
- package/src/lib/browser/critique.ts +104 -27
- package/src/lib/browser/geometry.ts +143 -14
- package/src/lib/browser/index.ts +34 -0
- package/src/lib/browser/qa-plan.ts +501 -0
- package/src/lib/browser/qa-reuse.ts +306 -0
- package/src/lib/browser/qa-snapshot.ts +223 -0
- package/src/lib/browser/runts.ts +27 -2
- package/src/lib/browser/tiling.ts +164 -0
- package/src/lib/context/index.ts +22 -46
- package/src/lib/council/index.ts +9 -21
- package/src/lib/docs-frontmatter.ts +8 -79
- package/src/lib/docs-index.ts +33 -3
- package/src/lib/docs-lint.ts +15 -29
- package/src/lib/docs-metadata-audit.ts +166 -0
- package/src/lib/docs-metadata-managed.ts +83 -0
- package/src/lib/docs-metadata-sync.ts +262 -0
- package/src/lib/docs-metadata-v2-schema.ts +138 -0
- package/src/lib/docs-metadata-v2.ts +646 -0
- package/src/lib/docs-new.ts +63 -0
- package/src/lib/docs-sweep.ts +42 -28
- package/src/lib/headless/index.ts +287 -0
- package/src/lib/identities/assume.ts +67 -86
- package/src/lib/instructions/apply.ts +33 -20
- package/src/lib/instructions/bundle.ts +199 -0
- package/src/lib/instructions/splice.ts +21 -7
- package/src/lib/instructions/templates.ts +85 -13
- package/dist/core/agents/cli-emit.d.ts +0 -27
- package/dist/core/agents/cli-emit.d.ts.map +0 -1
- package/dist/core/agents/cli-emit.js +0 -57
- package/dist/core/agents/codex-replay.d.ts +0 -29
- package/dist/core/agents/codex-replay.d.ts.map +0 -1
- package/dist/core/agents/codex-replay.js +0 -138
- package/dist/core/agents/events/consume.d.ts +0 -82
- package/dist/core/agents/events/consume.d.ts.map +0 -1
- package/dist/core/agents/events/consume.js +0 -195
- package/dist/core/agents/events/emit.d.ts +0 -42
- package/dist/core/agents/events/emit.d.ts.map +0 -1
- package/dist/core/agents/events/emit.js +0 -75
- package/dist/core/agents/events/ulid.d.ts +0 -11
- package/dist/core/agents/events/ulid.d.ts.map +0 -1
- package/dist/core/agents/events/ulid.js +0 -47
- package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
- package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
- package/dist/core/agents/state/heartbeat-projector.js +0 -527
- package/dist/core/hooks/events/emit.d.ts +0 -31
- package/dist/core/hooks/events/emit.d.ts.map +0 -1
- package/dist/core/hooks/events/emit.js +0 -93
- package/dist/core/hooks/events/rotate.d.ts +0 -43
- package/dist/core/hooks/events/rotate.d.ts.map +0 -1
- package/dist/core/hooks/events/rotate.js +0 -142
- package/dist/core/hooks/events/schema.d.ts +0 -312
- package/dist/core/hooks/events/schema.d.ts.map +0 -1
- package/dist/core/hooks/events/schema.js +0 -12
- package/dist/core/hooks/events/ulid.d.ts +0 -10
- package/dist/core/hooks/events/ulid.d.ts.map +0 -1
- package/dist/core/hooks/events/ulid.js +0 -47
- package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
- package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
- package/dist/lib/docs-frontmatter-migrate.js +0 -364
- package/src/core/agents/cli-emit.ts +0 -64
- package/src/core/agents/codex-replay.ts +0 -163
- package/src/core/agents/events/consume.ts +0 -254
- package/src/core/agents/events/emit.ts +0 -115
- package/src/core/agents/events/ulid.ts +0 -51
- package/src/core/agents/state/heartbeat-projector.ts +0 -582
- package/src/core/hooks/events/emit.ts +0 -125
- package/src/core/hooks/events/rotate.ts +0 -151
- package/src/core/hooks/events/schema.ts +0 -538
- package/src/core/hooks/events/ulid.ts +0 -51
- package/src/lib/docs-frontmatter-migrate.ts +0 -427
|
@@ -9,6 +9,7 @@ import { createHash, randomBytes } from "node:crypto";
|
|
|
9
9
|
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
10
10
|
import { basename, resolve } from "node:path";
|
|
11
11
|
import { monorepoRoot } from "../../core/agents/index.js";
|
|
12
|
+
import { readLiveCoordinationRows } from "../../core/agents/state/live-coordination-view.js";
|
|
12
13
|
import { resolveBinName } from "../../core/config.js";
|
|
13
14
|
import { ensureIdentity, lookupById as lookupIdentityById } from "../identities/index.js";
|
|
14
15
|
export const COUNCIL_SCHEMA_VERSION = 2;
|
|
@@ -176,7 +177,7 @@ export function setCouncilSteward(councilId, steward) {
|
|
|
176
177
|
* next-app's same-named constant. */
|
|
177
178
|
const KNOWN_AGENT_STALE_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
|
|
178
179
|
/**
|
|
179
|
-
* Active
|
|
180
|
+
* Active V3 generations + recently-archived journals, deduped by name.
|
|
180
181
|
* Used by `agents council set-steward` to refuse arbitrary names;
|
|
181
182
|
* pass `--allow-unknown` to bypass when bootstrapping a new agent.
|
|
182
183
|
*/
|
|
@@ -184,27 +185,15 @@ export function listKnownAgents() {
|
|
|
184
185
|
const root = monorepoRoot();
|
|
185
186
|
if (!root)
|
|
186
187
|
return [];
|
|
187
|
-
const activeDir = resolve(root, ".harnery", "active");
|
|
188
188
|
const archiveDir = resolve(root, ".harnery", "journal", "archived");
|
|
189
189
|
const byName = new Map();
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
continue;
|
|
198
|
-
const name = hb.name.startsWith("agent-") ? hb.name : `agent-${hb.name}`;
|
|
199
|
-
const last_seen = hb.last_heartbeat ?? new Date().toISOString();
|
|
200
|
-
const existing = byName.get(name);
|
|
201
|
-
if (existing?.state !== "active") {
|
|
202
|
-
byName.set(name, { name, state: "active", last_seen });
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
catch {
|
|
206
|
-
/* skip unreadable */
|
|
207
|
-
}
|
|
190
|
+
for (const row of readLiveCoordinationRows(root)) {
|
|
191
|
+
if (!row.name)
|
|
192
|
+
continue;
|
|
193
|
+
const name = row.name.startsWith("agent-") ? row.name : `agent-${row.name}`;
|
|
194
|
+
const existing = byName.get(name);
|
|
195
|
+
if (existing?.state !== "active") {
|
|
196
|
+
byName.set(name, { name, state: "active", last_seen: row.last_heartbeat });
|
|
208
197
|
}
|
|
209
198
|
}
|
|
210
199
|
const cutoff = Date.now() - KNOWN_AGENT_STALE_WINDOW_MS;
|
|
@@ -19,12 +19,7 @@ export type DocKind = "plan" | "issue" | "handoff";
|
|
|
19
19
|
* stripped from `body`, so status readers do not need try/catch.
|
|
20
20
|
*/
|
|
21
21
|
export declare function parseFrontmatter(text: string): ParsedFrontmatter;
|
|
22
|
-
/**
|
|
23
|
-
* Normalize a raw status token to the canonical enum for its kind.
|
|
24
|
-
* Returns null when the token can't be mapped (caller may fail loud).
|
|
25
|
-
*/
|
|
26
|
-
export declare function normalizeStatus(raw: string, kind?: DocKind): string | null;
|
|
27
|
-
/** Read and normalize a doc's YAML lifecycle status, or null when absent/invalid. */
|
|
22
|
+
/** Read a canonical v2 lifecycle status, or null when absent or invalid. */
|
|
28
23
|
export declare function readDocStatus(filePath: string, kind?: DocKind): string | null;
|
|
29
24
|
/** Same as {@link readDocStatus} but from an in-memory string (testable). */
|
|
30
25
|
export declare function readDocStatusFromText(content: string, kind?: DocKind): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/docs-frontmatter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBhE;
|
|
1
|
+
{"version":3,"file":"docs-frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/docs-frontmatter.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKnD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBhE;AAOD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CASpF;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGtD"}
|
|
@@ -26,84 +26,12 @@ export function parseFrontmatter(text) {
|
|
|
26
26
|
}
|
|
27
27
|
return { data, body: text.slice(m[0].length), raw: m[1] };
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Kind-independent token normalization (spacing / casing / punctuation
|
|
31
|
-
* variants). Kind-specific collapses (done -> shipped vs resolved) are applied
|
|
32
|
-
* in `normalizeStatus`.
|
|
33
|
-
*/
|
|
34
|
-
const GENERIC_NORMALIZE = {
|
|
35
|
-
in_progress: "in-progress",
|
|
36
|
-
inprogress: "in-progress",
|
|
37
|
-
"in progress": "in-progress",
|
|
38
|
-
"in-progress": "in-progress",
|
|
39
|
-
wip: "in-progress",
|
|
40
|
-
"wont-fix": "wontfix",
|
|
41
|
-
wontfix: "wontfix",
|
|
42
|
-
proposed: "proposed",
|
|
43
|
-
abandoned: "abandoned",
|
|
44
|
-
open: "open",
|
|
45
|
-
resolved: "resolved",
|
|
46
|
-
shipped: "shipped",
|
|
47
|
-
};
|
|
48
|
-
// "done"-family tokens collapse to different canonical values per kind.
|
|
49
|
-
const DONE_FAMILY = new Set(["done", "complete", "completed", "finished"]);
|
|
50
|
-
const KIND_NORMALIZE = {
|
|
51
|
-
plan: {
|
|
52
|
-
planning: "proposed",
|
|
53
|
-
draft: "proposed",
|
|
54
|
-
approved: "proposed",
|
|
55
|
-
plan: "proposed",
|
|
56
|
-
open: "proposed",
|
|
57
|
-
deferred: "proposed",
|
|
58
|
-
implemented: "shipped",
|
|
59
|
-
resolved: "shipped",
|
|
60
|
-
fixed: "shipped",
|
|
61
|
-
archived: "shipped",
|
|
62
|
-
shelved: "abandoned",
|
|
63
|
-
},
|
|
64
|
-
issue: {
|
|
65
|
-
"in progress": "open",
|
|
66
|
-
in_progress: "open",
|
|
67
|
-
"in-progress": "open",
|
|
68
|
-
blocked: "open",
|
|
69
|
-
mitigated: "open",
|
|
70
|
-
fixed: "resolved",
|
|
71
|
-
shipped: "resolved",
|
|
72
|
-
},
|
|
73
|
-
handoff: {
|
|
74
|
-
"in progress": "open",
|
|
75
|
-
in_progress: "open",
|
|
76
|
-
"in-progress": "open",
|
|
77
|
-
blocked: "open",
|
|
78
|
-
fixed: "resolved",
|
|
79
|
-
shipped: "resolved",
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
29
|
const ALLOWED_BY_KIND = {
|
|
83
30
|
plan: new Set(["proposed", "in-progress", "shipped", "abandoned"]),
|
|
84
31
|
issue: new Set(["open", "resolved", "wontfix"]),
|
|
85
32
|
handoff: new Set(["open", "resolved", "abandoned"]),
|
|
86
33
|
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Normalize a raw status token to the canonical enum for its kind.
|
|
90
|
-
* Returns null when the token can't be mapped (caller may fail loud).
|
|
91
|
-
*/
|
|
92
|
-
export function normalizeStatus(raw, kind) {
|
|
93
|
-
const t = raw.trim().toLowerCase();
|
|
94
|
-
if (!t)
|
|
95
|
-
return null;
|
|
96
|
-
if (DONE_FAMILY.has(t)) {
|
|
97
|
-
// plans ship; issues/handoffs resolve. Default to "shipped" when unknown.
|
|
98
|
-
return kind === "issue" || kind === "handoff" ? "resolved" : "shipped";
|
|
99
|
-
}
|
|
100
|
-
const normalized = (kind ? KIND_NORMALIZE[kind][t] : undefined) ?? GENERIC_NORMALIZE[t];
|
|
101
|
-
if (!normalized)
|
|
102
|
-
return null;
|
|
103
|
-
const allowed = kind ? ALLOWED_BY_KIND[kind] : ALL_CANONICAL;
|
|
104
|
-
return allowed.has(normalized) ? normalized : null;
|
|
105
|
-
}
|
|
106
|
-
/** Read and normalize a doc's YAML lifecycle status, or null when absent/invalid. */
|
|
34
|
+
/** Read a canonical v2 lifecycle status, or null when absent or invalid. */
|
|
107
35
|
export function readDocStatus(filePath, kind) {
|
|
108
36
|
let content;
|
|
109
37
|
try {
|
|
@@ -117,11 +45,17 @@ export function readDocStatus(filePath, kind) {
|
|
|
117
45
|
/** Same as {@link readDocStatus} but from an in-memory string (testable). */
|
|
118
46
|
export function readDocStatusFromText(content, kind) {
|
|
119
47
|
const { data } = parseFrontmatter(content);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
48
|
+
if (data.schema !== "harnery-doc/v2")
|
|
49
|
+
return null;
|
|
50
|
+
if (kind && data.type !== kind)
|
|
51
|
+
return null;
|
|
52
|
+
if (typeof data.status !== "string")
|
|
53
|
+
return null;
|
|
54
|
+
if (kind)
|
|
55
|
+
return ALLOWED_BY_KIND[kind].has(data.status) ? data.status : null;
|
|
56
|
+
return Object.values(ALLOWED_BY_KIND).some((allowed) => allowed.has(data.status))
|
|
57
|
+
? data.status
|
|
58
|
+
: null;
|
|
125
59
|
}
|
|
126
60
|
/** Whether a doc carries a non-empty status in leading YAML frontmatter. */
|
|
127
61
|
export function hasYamlStatus(content) {
|
package/dist/lib/docs-index.d.ts
CHANGED
|
@@ -7,6 +7,10 @@ export declare function initDocsContext(opts: {
|
|
|
7
7
|
* Idempotent: safe to run on every commit. Reads the first ~30 lines of
|
|
8
8
|
* each dated file to extract title and (for issues) status.
|
|
9
9
|
*
|
|
10
|
+
* Targets: the host root, every initialized git submodule, and first-level
|
|
11
|
+
* in-tree packages that keep `docs/audits` or `docs/issues` without being
|
|
12
|
+
* git submodules. Marker rules are unchanged.
|
|
13
|
+
*
|
|
10
14
|
* Preserves hand-written preambles. The command updates only the section
|
|
11
15
|
* between `<!-- BEGIN INDEX -->` and `<!-- END INDEX -->` markers. If a
|
|
12
16
|
* README exists without markers, the command refuses to overwrite it and
|
|
@@ -25,5 +29,10 @@ export interface IndexResult {
|
|
|
25
29
|
after: string;
|
|
26
30
|
}
|
|
27
31
|
export declare function extractStatus(content: string): string | undefined;
|
|
32
|
+
/** Root + initialized submodules + first-level in-tree packages with docs indexes. */
|
|
33
|
+
export declare function collectIndexTargets(): {
|
|
34
|
+
name: string;
|
|
35
|
+
path: string;
|
|
36
|
+
}[];
|
|
28
37
|
export declare function runIndex(opts: IndexOpts): Promise<IndexResult[]>;
|
|
29
38
|
//# sourceMappingURL=docs-index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-index.d.ts","sourceRoot":"","sources":["../../src/lib/docs-index.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAG/F;AAeD
|
|
1
|
+
{"version":3,"file":"docs-index.d.ts","sourceRoot":"","sources":["../../src/lib/docs-index.ts"],"names":[],"mappings":"AASA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAG/F;AAeD;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAkBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAsGD,sFAAsF;AACtF,wBAAgB,mBAAmB,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAqBtE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA2CtE"}
|
package/dist/lib/docs-index.js
CHANGED
|
@@ -122,13 +122,42 @@ function hasMarkers(existing) {
|
|
|
122
122
|
function buildNewReadme(kind, body) {
|
|
123
123
|
return `${defaultPreamble(kind)}\n${BEGIN_MARKER}\n${body}${END_MARKER}\n`;
|
|
124
124
|
}
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
const SKIP_NESTED_DIR_NAMES = new Set(["node_modules", "dist", "target"]);
|
|
126
|
+
function hasIndexableDocs(path) {
|
|
127
|
+
return existsSync(join(path, "docs", "audits")) || existsSync(join(path, "docs", "issues"));
|
|
128
|
+
}
|
|
129
|
+
/** Root + initialized submodules + first-level in-tree packages with docs indexes. */
|
|
130
|
+
export function collectIndexTargets() {
|
|
131
|
+
const byPath = new Map();
|
|
132
|
+
const add = (name, path) => {
|
|
133
|
+
byPath.set(path, { name, path });
|
|
134
|
+
};
|
|
135
|
+
add("(root)", REPO_ROOT);
|
|
127
136
|
for (const name of SUBMODULES) {
|
|
128
137
|
if (!isSubmoduleInitialized(name))
|
|
129
138
|
continue;
|
|
130
|
-
|
|
139
|
+
add(name, submodulePath(name));
|
|
140
|
+
}
|
|
141
|
+
if (!existsSync(REPO_ROOT))
|
|
142
|
+
return [...byPath.values()];
|
|
143
|
+
for (const ent of readdirSync(REPO_ROOT, { withFileTypes: true })) {
|
|
144
|
+
if (!ent.isDirectory() && !ent.isSymbolicLink())
|
|
145
|
+
continue;
|
|
146
|
+
if (ent.name.startsWith("."))
|
|
147
|
+
continue;
|
|
148
|
+
if (SKIP_NESTED_DIR_NAMES.has(ent.name))
|
|
149
|
+
continue;
|
|
150
|
+
if (isSubmoduleInitialized(ent.name))
|
|
151
|
+
continue;
|
|
152
|
+
const child = join(REPO_ROOT, ent.name);
|
|
153
|
+
if (!hasIndexableDocs(child))
|
|
154
|
+
continue;
|
|
155
|
+
add(ent.name, child);
|
|
131
156
|
}
|
|
157
|
+
return [...byPath.values()];
|
|
158
|
+
}
|
|
159
|
+
export async function runIndex(opts) {
|
|
160
|
+
const targets = collectIndexTargets();
|
|
132
161
|
const filter = opts.repo === "." ? "(root)" : opts.repo;
|
|
133
162
|
const filtered = filter ? targets.filter((t) => t.name === filter) : targets;
|
|
134
163
|
const results = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-lint.d.ts","sourceRoot":"","sources":["../../src/lib/docs-lint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"docs-lint.d.ts","sourceRoot":"","sources":["../../src/lib/docs-lint.ts"],"names":[],"mappings":"AAeA,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,GAAG,IAAI,CAMP;AAaD;;;;;;GAMG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0HD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMrD;AA0OD,wBAAsB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAiClE"}
|
package/dist/lib/docs-lint.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync as __existsSyncForDocs } from "node:fs";
|
|
2
2
|
import { resolve as __resolveForDocs } from "node:path";
|
|
3
3
|
import { hasYamlStatus } from "./docs-frontmatter.js";
|
|
4
|
+
import { initDocsMetadataAuditContext, runDocsMetadataAudit } from "./docs-metadata-audit.js";
|
|
4
5
|
import { sh } from "./exec.js";
|
|
5
6
|
// Module-level docs context, initialized by initDocsContext() before any
|
|
6
7
|
// other function in this file is called. Consumers pass repo metadata
|
|
@@ -15,6 +16,7 @@ export function initDocsContext(opts) {
|
|
|
15
16
|
SUBMODULES = opts.submodules;
|
|
16
17
|
EXTRA_EXCLUDED_PREFIXES = opts.extraExcludedPrefixes ?? [];
|
|
17
18
|
DOCS_ROOT_ALLOWLIST = opts.docsRootAllowlist ?? [];
|
|
19
|
+
initDocsMetadataAuditContext({ repoRoot: opts.repoRoot, submodules: opts.submodules });
|
|
18
20
|
}
|
|
19
21
|
function submodulePath(name) {
|
|
20
22
|
return __resolveForDocs(REPO_ROOT, name);
|
|
@@ -351,35 +353,6 @@ function checkChangelogNames(repoName, _repoPath, files) {
|
|
|
351
353
|
}
|
|
352
354
|
return violations;
|
|
353
355
|
}
|
|
354
|
-
/** Plans, issues, and handoffs must carry YAML lifecycle status (content check, slow). */
|
|
355
|
-
function checkStatusHeaders(repoName, repoPath, files) {
|
|
356
|
-
const violations = [];
|
|
357
|
-
const targetDirs = ["docs/plans/", "docs/issues/", "docs/handoffs/"];
|
|
358
|
-
for (const rel of files) {
|
|
359
|
-
const dirMatch = targetDirs.some((d) => rel.startsWith(d));
|
|
360
|
-
if (!dirMatch)
|
|
361
|
-
continue;
|
|
362
|
-
const name = basename(rel);
|
|
363
|
-
if (name === "README.md")
|
|
364
|
-
continue;
|
|
365
|
-
const full = join(repoPath, rel);
|
|
366
|
-
if (!hasStatusHeader(full)) {
|
|
367
|
-
const kind = rel.startsWith("docs/plans/")
|
|
368
|
-
? "plan"
|
|
369
|
-
: rel.startsWith("docs/issues/")
|
|
370
|
-
? "issue"
|
|
371
|
-
: "handoff";
|
|
372
|
-
violations.push({
|
|
373
|
-
severity: "error",
|
|
374
|
-
repo: repoName,
|
|
375
|
-
path: join(repoName === "(root)" ? "" : repoName, rel),
|
|
376
|
-
rule: "missing-status-header",
|
|
377
|
-
message: `${kind} missing status in leading YAML frontmatter`,
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
return violations;
|
|
382
|
-
}
|
|
383
356
|
/** Intentional monoliths >30KB need a declaration banner */
|
|
384
357
|
function checkMonolithDeclaration(repoName, repoPath, files) {
|
|
385
358
|
const violations = [];
|
|
@@ -434,9 +407,20 @@ export async function runLint(opts) {
|
|
|
434
407
|
violations.push(...checkDatedDirs(name, path, files));
|
|
435
408
|
violations.push(...checkChangelogNames(name, path, files));
|
|
436
409
|
if (!opts.fast) {
|
|
437
|
-
violations.push(...checkStatusHeaders(name, path, files));
|
|
438
410
|
violations.push(...checkMonolithDeclaration(name, path, files));
|
|
439
411
|
}
|
|
440
412
|
}
|
|
413
|
+
const metadataRows = await runDocsMetadataAudit({ repo: opts.repo });
|
|
414
|
+
for (const row of metadataRows) {
|
|
415
|
+
for (const issue of row.issues.filter((entry) => entry.severity === "error")) {
|
|
416
|
+
violations.push({
|
|
417
|
+
severity: "error",
|
|
418
|
+
repo: row.repo,
|
|
419
|
+
path: row.path,
|
|
420
|
+
rule: `metadata-v2:${issue.code}`,
|
|
421
|
+
message: issue.field ? `${issue.field}: ${issue.message}` : issue.message,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
441
425
|
return violations;
|
|
442
426
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type DocsMetadataProfile, type DocsMetadataValidationIssue } from "./docs-metadata-v2.js";
|
|
2
|
+
export declare function initDocsMetadataAuditContext(opts: {
|
|
3
|
+
repoRoot: string;
|
|
4
|
+
submodules: readonly string[];
|
|
5
|
+
}): void;
|
|
6
|
+
export interface DocsMetadataAuditOpts {
|
|
7
|
+
repo?: string;
|
|
8
|
+
}
|
|
9
|
+
export type DocsMetadataAuditState = "valid" | "invalid" | "legacy" | "missing";
|
|
10
|
+
export interface DocsMetadataAuditRow {
|
|
11
|
+
repo: string;
|
|
12
|
+
path: string;
|
|
13
|
+
state: DocsMetadataAuditState;
|
|
14
|
+
profile: DocsMetadataProfile | null;
|
|
15
|
+
issues: DocsMetadataValidationIssue[];
|
|
16
|
+
}
|
|
17
|
+
export declare function runDocsMetadataAudit(opts: DocsMetadataAuditOpts): Promise<DocsMetadataAuditRow[]>;
|
|
18
|
+
export declare function auditDocsMetadataText(content: string, path: string): DocsMetadataAuditRow | null;
|
|
19
|
+
//# sourceMappingURL=docs-metadata-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-metadata-audit.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-audit.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAIjC,MAAM,uBAAuB,CAAC;AAM/B,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,GAAG,IAAI,CAGP;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,2BAA2B,EAAE,CAAC;CACvC;AAuED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqBjC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAiChG"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
|
+
import { parseFrontmatter } from "./docs-frontmatter.js";
|
|
4
|
+
import { isManagedDocsMetadataFile, managedDocsMetadataType } from "./docs-metadata-managed.js";
|
|
5
|
+
import { docsMetadataProfileForType, isDocsMetadataV2, validateDocsMetadataV2, } from "./docs-metadata-v2.js";
|
|
6
|
+
import { sh } from "./exec.js";
|
|
7
|
+
let REPO_ROOT = "";
|
|
8
|
+
let SUBMODULES = [];
|
|
9
|
+
export function initDocsMetadataAuditContext(opts) {
|
|
10
|
+
REPO_ROOT = opts.repoRoot;
|
|
11
|
+
SUBMODULES = opts.submodules;
|
|
12
|
+
}
|
|
13
|
+
function isInitializedRepo(path) {
|
|
14
|
+
return existsSync(join(path, ".git"));
|
|
15
|
+
}
|
|
16
|
+
async function trackedMarkdownFiles(repoPath) {
|
|
17
|
+
const result = await sh('git ls-files --cached "**/*.md" "*.md"', { cwd: repoPath });
|
|
18
|
+
if (result.exitCode !== 0 || !result.stdout.trim())
|
|
19
|
+
return [];
|
|
20
|
+
return result.stdout
|
|
21
|
+
.trim()
|
|
22
|
+
.split("\n")
|
|
23
|
+
.filter((path) => path.endsWith(".md"));
|
|
24
|
+
}
|
|
25
|
+
function auditFile(repoName, repoPath, path) {
|
|
26
|
+
let content;
|
|
27
|
+
try {
|
|
28
|
+
content = readFileSync(join(repoPath, path), "utf8");
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return {
|
|
32
|
+
repo: repoName,
|
|
33
|
+
path: join(repoName === "(root)" ? "" : repoName, path),
|
|
34
|
+
state: "missing",
|
|
35
|
+
profile: null,
|
|
36
|
+
issues: [
|
|
37
|
+
{
|
|
38
|
+
severity: "error",
|
|
39
|
+
code: "file_unreadable",
|
|
40
|
+
field: "",
|
|
41
|
+
message: "metadata file could not be read",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const { data, raw } = parseFrontmatter(content);
|
|
47
|
+
const displayPath = join(repoName === "(root)" ? "" : repoName, path);
|
|
48
|
+
if (!isManagedDocsMetadataFile(path, data, raw !== null))
|
|
49
|
+
return null;
|
|
50
|
+
const expectedType = managedDocsMetadataType(path, data, raw !== null);
|
|
51
|
+
if (isDocsMetadataV2(data)) {
|
|
52
|
+
const result = validateDocsMetadataV2(data);
|
|
53
|
+
return {
|
|
54
|
+
repo: repoName,
|
|
55
|
+
path: displayPath,
|
|
56
|
+
state: result.valid ? "valid" : "invalid",
|
|
57
|
+
profile: result.profile,
|
|
58
|
+
issues: result.issues,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
const state = raw === null ? "missing" : "legacy";
|
|
62
|
+
return {
|
|
63
|
+
repo: repoName,
|
|
64
|
+
path: displayPath,
|
|
65
|
+
state,
|
|
66
|
+
profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
|
|
67
|
+
issues: [
|
|
68
|
+
{
|
|
69
|
+
severity: "error",
|
|
70
|
+
code: state === "missing" ? "missing_metadata" : "legacy_schema",
|
|
71
|
+
field: "schema",
|
|
72
|
+
message: state === "missing"
|
|
73
|
+
? "required document has no leading YAML metadata"
|
|
74
|
+
: "document still uses pre-v2 metadata",
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export async function runDocsMetadataAudit(opts) {
|
|
80
|
+
const targets = [
|
|
81
|
+
{ name: "(root)", path: REPO_ROOT },
|
|
82
|
+
...SUBMODULES.map((name) => ({ name, path: resolve(REPO_ROOT, name) })).filter((target) => isInitializedRepo(target.path)),
|
|
83
|
+
];
|
|
84
|
+
const filter = opts.repo === "." ? "(root)" : opts.repo;
|
|
85
|
+
const selected = filter ? targets.filter((target) => target.name === filter) : targets;
|
|
86
|
+
if (filter && selected.length === 0)
|
|
87
|
+
throw new Error(`Unknown repository: ${opts.repo}`);
|
|
88
|
+
const rows = [];
|
|
89
|
+
for (const target of selected) {
|
|
90
|
+
const files = await trackedMarkdownFiles(target.path);
|
|
91
|
+
for (const path of files) {
|
|
92
|
+
const row = auditFile(target.name, target.path, path);
|
|
93
|
+
if (row)
|
|
94
|
+
rows.push(row);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return rows.sort((a, b) => a.path.localeCompare(b.path));
|
|
98
|
+
}
|
|
99
|
+
export function auditDocsMetadataText(content, path) {
|
|
100
|
+
const root = resolve("/");
|
|
101
|
+
const parsed = parseFrontmatter(content);
|
|
102
|
+
if (!isManagedDocsMetadataFile(path, parsed.data, parsed.raw !== null))
|
|
103
|
+
return null;
|
|
104
|
+
const expectedType = managedDocsMetadataType(path, parsed.data, parsed.raw !== null);
|
|
105
|
+
if (isDocsMetadataV2(parsed.data)) {
|
|
106
|
+
const result = validateDocsMetadataV2(parsed.data);
|
|
107
|
+
return {
|
|
108
|
+
repo: "(root)",
|
|
109
|
+
path: relative(root, resolve(root, path)),
|
|
110
|
+
state: result.valid ? "valid" : "invalid",
|
|
111
|
+
profile: result.profile,
|
|
112
|
+
issues: result.issues,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const state = parsed.raw === null ? "missing" : "legacy";
|
|
116
|
+
return {
|
|
117
|
+
repo: "(root)",
|
|
118
|
+
path,
|
|
119
|
+
state,
|
|
120
|
+
profile: expectedType ? docsMetadataProfileForType(expectedType) : null,
|
|
121
|
+
issues: [
|
|
122
|
+
{
|
|
123
|
+
severity: "error",
|
|
124
|
+
code: state === "missing" ? "missing_metadata" : "legacy_schema",
|
|
125
|
+
field: "schema",
|
|
126
|
+
message: state === "missing"
|
|
127
|
+
? "required document has no leading YAML metadata"
|
|
128
|
+
: "document still uses pre-v2 metadata",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DocsMetadataType } from "./docs-metadata-v2.js";
|
|
2
|
+
/**
|
|
3
|
+
* Paths whose Markdown carries frontmatter belonging to another system:
|
|
4
|
+
* generated mirrors of documents that live elsewhere, vendored vendor
|
|
5
|
+
* specifications, and the placeholder headers inside document templates.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isExcludedDocsMetadataPath(path: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Return the v2 type expected for a Markdown file that participates in the
|
|
10
|
+
* managed metadata contract. Unmanaged Markdown and unrelated YAML-frontmatter
|
|
11
|
+
* systems return null.
|
|
12
|
+
*/
|
|
13
|
+
export declare function managedDocsMetadataType(path: string, data: Record<string, unknown>, hasFrontmatter: boolean): DocsMetadataType | null;
|
|
14
|
+
/**
|
|
15
|
+
* Whether a Markdown file has to satisfy the v2 contract.
|
|
16
|
+
*
|
|
17
|
+
* A file that claims the v2 schema marker is always checked, even when its
|
|
18
|
+
* `type` is missing or misspelled. Deciding membership from the type alone
|
|
19
|
+
* let a typo drop the document out of the audit entirely, so an invalid
|
|
20
|
+
* header reported as nothing rather than as an error.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isManagedDocsMetadataFile(path: string, data: Record<string, unknown>, hasFrontmatter: boolean): boolean;
|
|
23
|
+
//# sourceMappingURL=docs-metadata-managed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-metadata-managed.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-managed.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,gBAAgB,EAAwC,MAAM,uBAAuB,CAAC;AAMpG;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUhE;AAmBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,OAAO,GACtB,gBAAgB,GAAG,IAAI,CAczB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,cAAc,EAAE,OAAO,GACtB,OAAO,CAIT"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { isDocsMetadataType, isDocsMetadataV2 } from "./docs-metadata-v2.js";
|
|
3
|
+
function normalized(path) {
|
|
4
|
+
return path.replaceAll("\\", "/");
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Paths whose Markdown carries frontmatter belonging to another system:
|
|
8
|
+
* generated mirrors of documents that live elsewhere, vendored vendor
|
|
9
|
+
* specifications, and the placeholder headers inside document templates.
|
|
10
|
+
*/
|
|
11
|
+
export function isExcludedDocsMetadataPath(path) {
|
|
12
|
+
const rel = normalized(path);
|
|
13
|
+
const segments = rel.split("/");
|
|
14
|
+
return (segments.includes(".wiki-data") ||
|
|
15
|
+
// Dashboard surfaces render from copies of other repositories' documents.
|
|
16
|
+
/(?:^|\/)content\/dashboards\//.test(rel) ||
|
|
17
|
+
/(?:^|\/)docs\/shopify\/admin-api\//.test(rel) ||
|
|
18
|
+
/(?:^|\/)docs\/templates\//.test(rel));
|
|
19
|
+
}
|
|
20
|
+
function lifecycleType(path) {
|
|
21
|
+
const rel = normalized(path);
|
|
22
|
+
if (basename(rel).toLowerCase() === "readme.md")
|
|
23
|
+
return null;
|
|
24
|
+
// A repository may sit at any depth inside the host checkout, so the
|
|
25
|
+
// directory rules anchor on `docs/<kind>/` rather than a single optional
|
|
26
|
+
// path segment. A one-segment-only prefix hid every document in a
|
|
27
|
+
// repository nested two or more levels down.
|
|
28
|
+
if (/(?:^|\/)docs\/plans\//.test(rel))
|
|
29
|
+
return "plan";
|
|
30
|
+
if (/(?:^|\/)docs\/issues\//.test(rel))
|
|
31
|
+
return "issue";
|
|
32
|
+
if (/(?:^|\/)docs\/coordination\/issues\//.test(rel))
|
|
33
|
+
return "issue";
|
|
34
|
+
if (/(?:^|\/)docs\/handoffs\//.test(rel))
|
|
35
|
+
return "handoff";
|
|
36
|
+
if (/(?:^|\/)docs\/audits\//.test(rel))
|
|
37
|
+
return "audit";
|
|
38
|
+
if (/^harnery-dev\/plans\//.test(rel))
|
|
39
|
+
return "plan";
|
|
40
|
+
if (/^harnery-dev\/issues\//.test(rel))
|
|
41
|
+
return "issue";
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Return the v2 type expected for a Markdown file that participates in the
|
|
46
|
+
* managed metadata contract. Unmanaged Markdown and unrelated YAML-frontmatter
|
|
47
|
+
* systems return null.
|
|
48
|
+
*/
|
|
49
|
+
export function managedDocsMetadataType(path, data, hasFrontmatter) {
|
|
50
|
+
const rel = normalized(path);
|
|
51
|
+
if (isExcludedDocsMetadataPath(rel))
|
|
52
|
+
return null;
|
|
53
|
+
if (isDocsMetadataType(data.type))
|
|
54
|
+
return data.type;
|
|
55
|
+
const lifecycle = lifecycleType(rel);
|
|
56
|
+
if (lifecycle)
|
|
57
|
+
return lifecycle;
|
|
58
|
+
const name = basename(rel).toLowerCase();
|
|
59
|
+
if (/(?:^|\/)docs\/runbook\.md$/.test(rel) || (hasFrontmatter && /^.+-runbook\.md$/.test(name))) {
|
|
60
|
+
return "runbook";
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Whether a Markdown file has to satisfy the v2 contract.
|
|
66
|
+
*
|
|
67
|
+
* A file that claims the v2 schema marker is always checked, even when its
|
|
68
|
+
* `type` is missing or misspelled. Deciding membership from the type alone
|
|
69
|
+
* let a typo drop the document out of the audit entirely, so an invalid
|
|
70
|
+
* header reported as nothing rather than as an error.
|
|
71
|
+
*/
|
|
72
|
+
export function isManagedDocsMetadataFile(path, data, hasFrontmatter) {
|
|
73
|
+
if (isExcludedDocsMetadataPath(path))
|
|
74
|
+
return false;
|
|
75
|
+
if (isDocsMetadataV2(data))
|
|
76
|
+
return true;
|
|
77
|
+
return managedDocsMetadataType(path, data, hasFrontmatter) !== null;
|
|
78
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function initDocsMetadataSyncContext(opts: {
|
|
2
|
+
repoRoot: string;
|
|
3
|
+
submodules: readonly string[];
|
|
4
|
+
}): void;
|
|
5
|
+
export interface DocsMetadataSyncOpts {
|
|
6
|
+
repo?: string;
|
|
7
|
+
files?: string[];
|
|
8
|
+
check?: boolean;
|
|
9
|
+
reviewed?: boolean;
|
|
10
|
+
now?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface DocsMetadataSyncRow {
|
|
13
|
+
repo: string;
|
|
14
|
+
path: string;
|
|
15
|
+
status: "unchanged" | "updated" | "drift" | "invalid";
|
|
16
|
+
fields: string[];
|
|
17
|
+
message?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function runDocsMetadataSync(opts: DocsMetadataSyncOpts): Promise<DocsMetadataSyncRow[]>;
|
|
20
|
+
//# sourceMappingURL=docs-metadata-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-metadata-sync.d.ts","sourceRoot":"","sources":["../../src/lib/docs-metadata-sync.ts"],"names":[],"mappings":"AAWA,wBAAgB,2BAA2B,CAAC,IAAI,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,GAAG,IAAI,CAGP;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAyJhC"}
|