@isaacriehm/cairn 0.1.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/LICENSE +21 -0
- package/README.md +37 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/backprop/id.d.ts +14 -0
- package/dist/backprop/id.js +40 -0
- package/dist/backprop/id.js.map +1 -0
- package/dist/backprop/index.d.ts +23 -0
- package/dist/backprop/index.js +21 -0
- package/dist/backprop/index.js.map +1 -0
- package/dist/backprop/prompt.d.ts +16 -0
- package/dist/backprop/prompt.js +101 -0
- package/dist/backprop/prompt.js.map +1 -0
- package/dist/backprop/runner.d.ts +18 -0
- package/dist/backprop/runner.js +95 -0
- package/dist/backprop/runner.js.map +1 -0
- package/dist/backprop/schema.d.ts +61 -0
- package/dist/backprop/schema.js +55 -0
- package/dist/backprop/schema.js.map +1 -0
- package/dist/backprop/types.d.ts +101 -0
- package/dist/backprop/types.js +24 -0
- package/dist/backprop/types.js.map +1 -0
- package/dist/backprop/writer.d.ts +27 -0
- package/dist/backprop/writer.js +301 -0
- package/dist/backprop/writer.js.map +1 -0
- package/dist/claude/error.d.ts +33 -0
- package/dist/claude/error.js +58 -0
- package/dist/claude/error.js.map +1 -0
- package/dist/claude/index.d.ts +3 -0
- package/dist/claude/index.js +3 -0
- package/dist/claude/index.js.map +1 -0
- package/dist/claude/runner.d.ts +11 -0
- package/dist/claude/runner.js +132 -0
- package/dist/claude/runner.js.map +1 -0
- package/dist/claude/types.d.ts +52 -0
- package/dist/claude/types.js +14 -0
- package/dist/claude/types.js.map +1 -0
- package/dist/cli/attention.d.ts +11 -0
- package/dist/cli/attention.js +234 -0
- package/dist/cli/attention.js.map +1 -0
- package/dist/cli/daemon.d.ts +54 -0
- package/dist/cli/daemon.js +351 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/doctor.d.ts +8 -0
- package/dist/cli/doctor.js +116 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/gc.d.ts +15 -0
- package/dist/cli/gc.js +139 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/hook.d.ts +18 -0
- package/dist/cli/hook.js +57 -0
- package/dist/cli/hook.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +127 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +1 -0
- package/dist/cli/init.js +77 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +52 -0
- package/dist/cli/install.js +308 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/join.d.ts +1 -0
- package/dist/cli/join.js +84 -0
- package/dist/cli/join.js.map +1 -0
- package/dist/cli/mcp.d.ts +1 -0
- package/dist/cli/mcp.js +62 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/mirror.d.ts +1 -0
- package/dist/cli/mirror.js +97 -0
- package/dist/cli/mirror.js.map +1 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/run.js +174 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/scope.d.ts +8 -0
- package/dist/cli/scope.js +65 -0
- package/dist/cli/scope.js.map +1 -0
- package/dist/cli/task.d.ts +18 -0
- package/dist/cli/task.js +137 -0
- package/dist/cli/task.js.map +1 -0
- package/dist/cli/watch.d.ts +1 -0
- package/dist/cli/watch.js +73 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/decision-capture/capture.d.ts +57 -0
- package/dist/decision-capture/capture.js +186 -0
- package/dist/decision-capture/capture.js.map +1 -0
- package/dist/decision-capture/extractor.d.ts +20 -0
- package/dist/decision-capture/extractor.js +103 -0
- package/dist/decision-capture/extractor.js.map +1 -0
- package/dist/decision-capture/id.d.ts +14 -0
- package/dist/decision-capture/id.js +44 -0
- package/dist/decision-capture/id.js.map +1 -0
- package/dist/decision-capture/index.d.ts +25 -0
- package/dist/decision-capture/index.js +21 -0
- package/dist/decision-capture/index.js.map +1 -0
- package/dist/decision-capture/prompt.d.ts +15 -0
- package/dist/decision-capture/prompt.js +68 -0
- package/dist/decision-capture/prompt.js.map +1 -0
- package/dist/decision-capture/refinement-prompt.d.ts +25 -0
- package/dist/decision-capture/refinement-prompt.js +146 -0
- package/dist/decision-capture/refinement-prompt.js.map +1 -0
- package/dist/decision-capture/refinement-schema.d.ts +52 -0
- package/dist/decision-capture/refinement-schema.js +61 -0
- package/dist/decision-capture/refinement-schema.js.map +1 -0
- package/dist/decision-capture/refinement.d.ts +60 -0
- package/dist/decision-capture/refinement.js +439 -0
- package/dist/decision-capture/refinement.js.map +1 -0
- package/dist/decision-capture/schema.d.ts +70 -0
- package/dist/decision-capture/schema.js +71 -0
- package/dist/decision-capture/schema.js.map +1 -0
- package/dist/decision-capture/types.d.ts +201 -0
- package/dist/decision-capture/types.js +20 -0
- package/dist/decision-capture/types.js.map +1 -0
- package/dist/decision-capture/writer.d.ts +90 -0
- package/dist/decision-capture/writer.js +267 -0
- package/dist/decision-capture/writer.js.map +1 -0
- package/dist/frontend/discord/acl.d.ts +6 -0
- package/dist/frontend/discord/acl.js +19 -0
- package/dist/frontend/discord/acl.js.map +1 -0
- package/dist/frontend/discord/channels.d.ts +29 -0
- package/dist/frontend/discord/channels.js +58 -0
- package/dist/frontend/discord/channels.js.map +1 -0
- package/dist/frontend/discord/classifier.d.ts +16 -0
- package/dist/frontend/discord/classifier.js +29 -0
- package/dist/frontend/discord/classifier.js.map +1 -0
- package/dist/frontend/discord/index.d.ts +118 -0
- package/dist/frontend/discord/index.js +1104 -0
- package/dist/frontend/discord/index.js.map +1 -0
- package/dist/frontend/discord/slash.d.ts +18 -0
- package/dist/frontend/discord/slash.js +90 -0
- package/dist/frontend/discord/slash.js.map +1 -0
- package/dist/frontend/inbox.d.ts +17 -0
- package/dist/frontend/inbox.js +30 -0
- package/dist/frontend/inbox.js.map +1 -0
- package/dist/frontend/index.d.ts +8 -0
- package/dist/frontend/index.js +6 -0
- package/dist/frontend/index.js.map +1 -0
- package/dist/frontend/stub/index.d.ts +58 -0
- package/dist/frontend/stub/index.js +144 -0
- package/dist/frontend/stub/index.js.map +1 -0
- package/dist/frontend/types.d.ts +247 -0
- package/dist/frontend/types.js +15 -0
- package/dist/frontend/types.js.map +1 -0
- package/dist/gc/apply.d.ts +26 -0
- package/dist/gc/apply.js +48 -0
- package/dist/gc/apply.js.map +1 -0
- package/dist/gc/canary.d.ts +42 -0
- package/dist/gc/canary.js +134 -0
- package/dist/gc/canary.js.map +1 -0
- package/dist/gc/classify.d.ts +25 -0
- package/dist/gc/classify.js +89 -0
- package/dist/gc/classify.js.map +1 -0
- package/dist/gc/doc-gardening.d.ts +29 -0
- package/dist/gc/doc-gardening.js +146 -0
- package/dist/gc/doc-gardening.js.map +1 -0
- package/dist/gc/frontmatter.d.ts +35 -0
- package/dist/gc/frontmatter.js +111 -0
- package/dist/gc/frontmatter.js.map +1 -0
- package/dist/gc/generator-drift.d.ts +28 -0
- package/dist/gc/generator-drift.js +53 -0
- package/dist/gc/generator-drift.js.map +1 -0
- package/dist/gc/index.d.ts +35 -0
- package/dist/gc/index.js +26 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/gc/quality-update.d.ts +23 -0
- package/dist/gc/quality-update.js +69 -0
- package/dist/gc/quality-update.js.map +1 -0
- package/dist/gc/stub-hits.d.ts +31 -0
- package/dist/gc/stub-hits.js +125 -0
- package/dist/gc/stub-hits.js.map +1 -0
- package/dist/gc/sweep.d.ts +56 -0
- package/dist/gc/sweep.js +178 -0
- package/dist/gc/sweep.js.map +1 -0
- package/dist/gc/types.d.ts +129 -0
- package/dist/gc/types.js +26 -0
- package/dist/gc/types.js.map +1 -0
- package/dist/ground/drift.d.ts +8 -0
- package/dist/ground/drift.js +23 -0
- package/dist/ground/drift.js.map +1 -0
- package/dist/ground/frontmatter.d.ts +20 -0
- package/dist/ground/frontmatter.js +49 -0
- package/dist/ground/frontmatter.js.map +1 -0
- package/dist/ground/glob.d.ts +10 -0
- package/dist/ground/glob.js +46 -0
- package/dist/ground/glob.js.map +1 -0
- package/dist/ground/index.d.ts +14 -0
- package/dist/ground/index.js +10 -0
- package/dist/ground/index.js.map +1 -0
- package/dist/ground/ledgers.d.ts +18 -0
- package/dist/ground/ledgers.js +103 -0
- package/dist/ground/ledgers.js.map +1 -0
- package/dist/ground/manifest.d.ts +10 -0
- package/dist/ground/manifest.js +88 -0
- package/dist/ground/manifest.js.map +1 -0
- package/dist/ground/paths.d.ts +20 -0
- package/dist/ground/paths.js +61 -0
- package/dist/ground/paths.js.map +1 -0
- package/dist/ground/quality-grades.d.ts +11 -0
- package/dist/ground/quality-grades.js +98 -0
- package/dist/ground/quality-grades.js.map +1 -0
- package/dist/ground/schemas.d.ts +306 -0
- package/dist/ground/schemas.js +188 -0
- package/dist/ground/schemas.js.map +1 -0
- package/dist/ground/walk.d.ts +7 -0
- package/dist/ground/walk.js +53 -0
- package/dist/ground/walk.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/init/detect.d.ts +25 -0
- package/dist/init/detect.js +336 -0
- package/dist/init/detect.js.map +1 -0
- package/dist/init/index.d.ts +14 -0
- package/dist/init/index.js +9 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/init.d.ts +68 -0
- package/dist/init/init.js +673 -0
- package/dist/init/init.js.map +1 -0
- package/dist/init/mapper.d.ts +160 -0
- package/dist/init/mapper.js +248 -0
- package/dist/init/mapper.js.map +1 -0
- package/dist/init/prompts.d.ts +70 -0
- package/dist/init/prompts.js +80 -0
- package/dist/init/prompts.js.map +1 -0
- package/dist/init/secrets.d.ts +18 -0
- package/dist/init/secrets.js +76 -0
- package/dist/init/secrets.js.map +1 -0
- package/dist/init/seed.d.ts +21 -0
- package/dist/init/seed.js +75 -0
- package/dist/init/seed.js.map +1 -0
- package/dist/init/setup-runners.d.ts +17 -0
- package/dist/init/setup-runners.js +70 -0
- package/dist/init/setup-runners.js.map +1 -0
- package/dist/init/types.d.ts +59 -0
- package/dist/init/types.js +10 -0
- package/dist/init/types.js.map +1 -0
- package/dist/init/walker.d.ts +53 -0
- package/dist/init/walker.js +460 -0
- package/dist/init/walker.js.map +1 -0
- package/dist/init/workflow-block.d.ts +34 -0
- package/dist/init/workflow-block.js +110 -0
- package/dist/init/workflow-block.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.js +23 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/context.d.ts +16 -0
- package/dist/mcp/context.js +8 -0
- package/dist/mcp/context.js.map +1 -0
- package/dist/mcp/errors.d.ts +17 -0
- package/dist/mcp/errors.js +23 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/path-allowlist.d.ts +25 -0
- package/dist/mcp/path-allowlist.js +66 -0
- package/dist/mcp/path-allowlist.js.map +1 -0
- package/dist/mcp/result.d.ts +8 -0
- package/dist/mcp/result.js +18 -0
- package/dist/mcp/result.js.map +1 -0
- package/dist/mcp/schemas.d.ts +153 -0
- package/dist/mcp/schemas.js +135 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +58 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/telemetry.d.ts +15 -0
- package/dist/mcp/telemetry.js +13 -0
- package/dist/mcp/telemetry.js.map +1 -0
- package/dist/mcp/tools/append.d.ts +8 -0
- package/dist/mcp/tools/append.js +33 -0
- package/dist/mcp/tools/append.js.map +1 -0
- package/dist/mcp/tools/archive.d.ts +8 -0
- package/dist/mcp/tools/archive.js +49 -0
- package/dist/mcp/tools/archive.js.map +1 -0
- package/dist/mcp/tools/ask-operator.d.ts +34 -0
- package/dist/mcp/tools/ask-operator.js +93 -0
- package/dist/mcp/tools/ask-operator.js.map +1 -0
- package/dist/mcp/tools/canonical-for-topic.d.ts +6 -0
- package/dist/mcp/tools/canonical-for-topic.js +40 -0
- package/dist/mcp/tools/canonical-for-topic.js.map +1 -0
- package/dist/mcp/tools/decision-get.d.ts +6 -0
- package/dist/mcp/tools/decision-get.js +49 -0
- package/dist/mcp/tools/decision-get.js.map +1 -0
- package/dist/mcp/tools/decisions-for-symbol.d.ts +7 -0
- package/dist/mcp/tools/decisions-for-symbol.js +42 -0
- package/dist/mcp/tools/decisions-for-symbol.js.map +1 -0
- package/dist/mcp/tools/decisions-in-scope.d.ts +7 -0
- package/dist/mcp/tools/decisions-in-scope.js +47 -0
- package/dist/mcp/tools/decisions-in-scope.js.map +1 -0
- package/dist/mcp/tools/drop-task.d.ts +12 -0
- package/dist/mcp/tools/drop-task.js +47 -0
- package/dist/mcp/tools/drop-task.js.map +1 -0
- package/dist/mcp/tools/get-full.d.ts +7 -0
- package/dist/mcp/tools/get-full.js +46 -0
- package/dist/mcp/tools/get-full.js.map +1 -0
- package/dist/mcp/tools/ground-get.d.ts +7 -0
- package/dist/mcp/tools/ground-get.js +80 -0
- package/dist/mcp/tools/ground-get.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +3 -0
- package/dist/mcp/tools/index.js +44 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invariant-get.d.ts +6 -0
- package/dist/mcp/tools/invariant-get.js +49 -0
- package/dist/mcp/tools/invariant-get.js.map +1 -0
- package/dist/mcp/tools/invariants-in-scope.d.ts +7 -0
- package/dist/mcp/tools/invariants-in-scope.js +65 -0
- package/dist/mcp/tools/invariants-in-scope.js.map +1 -0
- package/dist/mcp/tools/query-history.d.ts +9 -0
- package/dist/mcp/tools/query-history.js +33 -0
- package/dist/mcp/tools/query-history.js.map +1 -0
- package/dist/mcp/tools/record-decision.d.ts +14 -0
- package/dist/mcp/tools/record-decision.js +101 -0
- package/dist/mcp/tools/record-decision.js.map +1 -0
- package/dist/mcp/tools/record-run-event.d.ts +10 -0
- package/dist/mcp/tools/record-run-event.js +28 -0
- package/dist/mcp/tools/record-run-event.js.map +1 -0
- package/dist/mcp/tools/search.d.ts +9 -0
- package/dist/mcp/tools/search.js +165 -0
- package/dist/mcp/tools/search.js.map +1 -0
- package/dist/mcp/tools/supersedes-chain.d.ts +6 -0
- package/dist/mcp/tools/supersedes-chain.js +66 -0
- package/dist/mcp/tools/supersedes-chain.js.map +1 -0
- package/dist/mcp/tools/timeline.d.ts +9 -0
- package/dist/mcp/tools/timeline.js +65 -0
- package/dist/mcp/tools/timeline.js.map +1 -0
- package/dist/mcp/tools/types.d.ts +9 -0
- package/dist/mcp/tools/types.js +2 -0
- package/dist/mcp/tools/types.js.map +1 -0
- package/dist/mirror/clone.d.ts +6 -0
- package/dist/mirror/clone.js +48 -0
- package/dist/mirror/clone.js.map +1 -0
- package/dist/mirror/dirty-overlap.d.ts +13 -0
- package/dist/mirror/dirty-overlap.js +77 -0
- package/dist/mirror/dirty-overlap.js.map +1 -0
- package/dist/mirror/index.d.ts +7 -0
- package/dist/mirror/index.js +7 -0
- package/dist/mirror/index.js.map +1 -0
- package/dist/mirror/paths.d.ts +18 -0
- package/dist/mirror/paths.js +45 -0
- package/dist/mirror/paths.js.map +1 -0
- package/dist/mirror/push.d.ts +9 -0
- package/dist/mirror/push.js +27 -0
- package/dist/mirror/push.js.map +1 -0
- package/dist/mirror/state.d.ts +4 -0
- package/dist/mirror/state.js +36 -0
- package/dist/mirror/state.js.map +1 -0
- package/dist/mirror/sync.d.ts +9 -0
- package/dist/mirror/sync.js +33 -0
- package/dist/mirror/sync.js.map +1 -0
- package/dist/mirror/types.d.ts +77 -0
- package/dist/mirror/types.js +2 -0
- package/dist/mirror/types.js.map +1 -0
- package/dist/orchestrator/activity-summarizer.d.ts +33 -0
- package/dist/orchestrator/activity-summarizer.js +120 -0
- package/dist/orchestrator/activity-summarizer.js.map +1 -0
- package/dist/orchestrator/inbox.d.ts +78 -0
- package/dist/orchestrator/inbox.js +115 -0
- package/dist/orchestrator/inbox.js.map +1 -0
- package/dist/orchestrator/index.d.ts +9 -0
- package/dist/orchestrator/index.js +7 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +154 -0
- package/dist/orchestrator/orchestrator.js +2437 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/prompt.d.ts +19 -0
- package/dist/orchestrator/prompt.js +50 -0
- package/dist/orchestrator/prompt.js.map +1 -0
- package/dist/orchestrator/queue.d.ts +21 -0
- package/dist/orchestrator/queue.js +80 -0
- package/dist/orchestrator/queue.js.map +1 -0
- package/dist/orchestrator/run-log.d.ts +53 -0
- package/dist/orchestrator/run-log.js +92 -0
- package/dist/orchestrator/run-log.js.map +1 -0
- package/dist/orchestrator/runner.d.ts +56 -0
- package/dist/orchestrator/runner.js +172 -0
- package/dist/orchestrator/runner.js.map +1 -0
- package/dist/orchestrator/tool-digest.d.ts +35 -0
- package/dist/orchestrator/tool-digest.js +116 -0
- package/dist/orchestrator/tool-digest.js.map +1 -0
- package/dist/orchestrator/types.d.ts +263 -0
- package/dist/orchestrator/types.js +2 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/workspace.d.ts +21 -0
- package/dist/orchestrator/workspace.js +31 -0
- package/dist/orchestrator/workspace.js.map +1 -0
- package/dist/profiles/index.d.ts +3 -0
- package/dist/profiles/index.js +3 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/profiles/registry.d.ts +5 -0
- package/dist/profiles/registry.js +31 -0
- package/dist/profiles/registry.js.map +1 -0
- package/dist/profiles/types.d.ts +48 -0
- package/dist/profiles/types.js +11 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/unknown.d.ts +9 -0
- package/dist/profiles/unknown.js +17 -0
- package/dist/profiles/unknown.js.map +1 -0
- package/dist/reviewer/index.d.ts +6 -0
- package/dist/reviewer/index.js +5 -0
- package/dist/reviewer/index.js.map +1 -0
- package/dist/reviewer/prompt.d.ts +11 -0
- package/dist/reviewer/prompt.js +132 -0
- package/dist/reviewer/prompt.js.map +1 -0
- package/dist/reviewer/remediation.d.ts +15 -0
- package/dist/reviewer/remediation.js +61 -0
- package/dist/reviewer/remediation.js.map +1 -0
- package/dist/reviewer/reviewer.d.ts +9 -0
- package/dist/reviewer/reviewer.js +89 -0
- package/dist/reviewer/reviewer.js.map +1 -0
- package/dist/reviewer/schema.d.ts +45 -0
- package/dist/reviewer/schema.js +43 -0
- package/dist/reviewer/schema.js.map +1 -0
- package/dist/reviewer/types.d.ts +74 -0
- package/dist/reviewer/types.js +14 -0
- package/dist/reviewer/types.js.map +1 -0
- package/dist/sensors/attestation.d.ts +44 -0
- package/dist/sensors/attestation.js +262 -0
- package/dist/sensors/attestation.js.map +1 -0
- package/dist/sensors/catalog.d.ts +41 -0
- package/dist/sensors/catalog.js +123 -0
- package/dist/sensors/catalog.js.map +1 -0
- package/dist/sensors/decisions.d.ts +30 -0
- package/dist/sensors/decisions.js +393 -0
- package/dist/sensors/decisions.js.map +1 -0
- package/dist/sensors/diff.d.ts +27 -0
- package/dist/sensors/diff.js +148 -0
- package/dist/sensors/diff.js.map +1 -0
- package/dist/sensors/index.d.ts +13 -0
- package/dist/sensors/index.js +9 -0
- package/dist/sensors/index.js.map +1 -0
- package/dist/sensors/remediation.d.ts +20 -0
- package/dist/sensors/remediation.js +65 -0
- package/dist/sensors/remediation.js.map +1 -0
- package/dist/sensors/runner.d.ts +44 -0
- package/dist/sensors/runner.js +95 -0
- package/dist/sensors/runner.js.map +1 -0
- package/dist/sensors/structural.d.ts +30 -0
- package/dist/sensors/structural.js +204 -0
- package/dist/sensors/structural.js.map +1 -0
- package/dist/sensors/stub-catalog.d.ts +39 -0
- package/dist/sensors/stub-catalog.js +115 -0
- package/dist/sensors/stub-catalog.js.map +1 -0
- package/dist/sensors/types.d.ts +135 -0
- package/dist/sensors/types.js +14 -0
- package/dist/sensors/types.js.map +1 -0
- package/dist/tier0/classify.d.ts +5 -0
- package/dist/tier0/classify.js +91 -0
- package/dist/tier0/classify.js.map +1 -0
- package/dist/tier0/index.d.ts +3 -0
- package/dist/tier0/index.js +3 -0
- package/dist/tier0/index.js.map +1 -0
- package/dist/tier0/ollama.d.ts +22 -0
- package/dist/tier0/ollama.js +63 -0
- package/dist/tier0/ollama.js.map +1 -0
- package/dist/tier0/types.d.ts +24 -0
- package/dist/tier0/types.js +7 -0
- package/dist/tier0/types.js.map +1 -0
- package/dist/tightener/index.d.ts +4 -0
- package/dist/tightener/index.js +4 -0
- package/dist/tightener/index.js.map +1 -0
- package/dist/tightener/prompt.d.ts +3 -0
- package/dist/tightener/prompt.js +67 -0
- package/dist/tightener/prompt.js.map +1 -0
- package/dist/tightener/schema.d.ts +68 -0
- package/dist/tightener/schema.js +44 -0
- package/dist/tightener/schema.js.map +1 -0
- package/dist/tightener/tighten.d.ts +2 -0
- package/dist/tightener/tighten.js +66 -0
- package/dist/tightener/tighten.js.map +1 -0
- package/dist/tightener/types.d.ts +74 -0
- package/dist/tightener/types.js +6 -0
- package/dist/tightener/types.js.map +1 -0
- package/dist/uat/bundle.d.ts +68 -0
- package/dist/uat/bundle.js +168 -0
- package/dist/uat/bundle.js.map +1 -0
- package/dist/uat/index.d.ts +15 -0
- package/dist/uat/index.js +10 -0
- package/dist/uat/index.js.map +1 -0
- package/dist/uat/persistent.d.ts +64 -0
- package/dist/uat/persistent.js +206 -0
- package/dist/uat/persistent.js.map +1 -0
- package/dist/uat/probes/cli.d.ts +11 -0
- package/dist/uat/probes/cli.js +107 -0
- package/dist/uat/probes/cli.js.map +1 -0
- package/dist/uat/probes/http.d.ts +12 -0
- package/dist/uat/probes/http.js +139 -0
- package/dist/uat/probes/http.js.map +1 -0
- package/dist/uat/probes/index.d.ts +21 -0
- package/dist/uat/probes/index.js +30 -0
- package/dist/uat/probes/index.js.map +1 -0
- package/dist/uat/probes/integration.d.ts +18 -0
- package/dist/uat/probes/integration.js +188 -0
- package/dist/uat/probes/integration.js.map +1 -0
- package/dist/uat/probes/sql/config.d.ts +14 -0
- package/dist/uat/probes/sql/config.js +57 -0
- package/dist/uat/probes/sql/config.js.map +1 -0
- package/dist/uat/probes/sql/index.d.ts +29 -0
- package/dist/uat/probes/sql/index.js +43 -0
- package/dist/uat/probes/sql/index.js.map +1 -0
- package/dist/uat/probes/sql/mysql.d.ts +12 -0
- package/dist/uat/probes/sql/mysql.js +96 -0
- package/dist/uat/probes/sql/mysql.js.map +1 -0
- package/dist/uat/probes/sql/pg.d.ts +20 -0
- package/dist/uat/probes/sql/pg.js +102 -0
- package/dist/uat/probes/sql/pg.js.map +1 -0
- package/dist/uat/probes/sql/sqlite.d.ts +9 -0
- package/dist/uat/probes/sql/sqlite.js +58 -0
- package/dist/uat/probes/sql/sqlite.js.map +1 -0
- package/dist/uat/probes/sql/types.d.ts +46 -0
- package/dist/uat/probes/sql/types.js +10 -0
- package/dist/uat/probes/sql/types.js.map +1 -0
- package/dist/uat/probes/sql.d.ts +9 -0
- package/dist/uat/probes/sql.js +119 -0
- package/dist/uat/probes/sql.js.map +1 -0
- package/dist/uat/probes/ui.d.ts +19 -0
- package/dist/uat/probes/ui.js +244 -0
- package/dist/uat/probes/ui.js.map +1 -0
- package/dist/uat/prompt.d.ts +10 -0
- package/dist/uat/prompt.js +85 -0
- package/dist/uat/prompt.js.map +1 -0
- package/dist/uat/question.d.ts +50 -0
- package/dist/uat/question.js +139 -0
- package/dist/uat/question.js.map +1 -0
- package/dist/uat/rejection.d.ts +58 -0
- package/dist/uat/rejection.js +163 -0
- package/dist/uat/rejection.js.map +1 -0
- package/dist/uat/runner.d.ts +6 -0
- package/dist/uat/runner.js +96 -0
- package/dist/uat/runner.js.map +1 -0
- package/dist/uat/schema.d.ts +322 -0
- package/dist/uat/schema.js +189 -0
- package/dist/uat/schema.js.map +1 -0
- package/dist/uat/types.d.ts +268 -0
- package/dist/uat/types.js +18 -0
- package/dist/uat/types.js.map +1 -0
- package/dist/uat/uat.d.ts +89 -0
- package/dist/uat/uat.js +256 -0
- package/dist/uat/uat.js.map +1 -0
- package/dist/voice/index.d.ts +4 -0
- package/dist/voice/index.js +4 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/model.d.ts +23 -0
- package/dist/voice/model.js +46 -0
- package/dist/voice/model.js.map +1 -0
- package/dist/voice/pipe.d.ts +9 -0
- package/dist/voice/pipe.js +47 -0
- package/dist/voice/pipe.js.map +1 -0
- package/dist/voice/transcribe.d.ts +3 -0
- package/dist/voice/transcribe.js +43 -0
- package/dist/voice/transcribe.js.map +1 -0
- package/dist/voice/types.d.ts +26 -0
- package/dist/voice/types.js +9 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/watch/daemon.d.ts +21 -0
- package/dist/watch/daemon.js +143 -0
- package/dist/watch/daemon.js.map +1 -0
- package/dist/watch/index.d.ts +4 -0
- package/dist/watch/index.js +3 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/regenerate.d.ts +25 -0
- package/dist/watch/regenerate.js +51 -0
- package/dist/watch/regenerate.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writers for the invariant file + the generated sensor / E2E.
|
|
3
|
+
*
|
|
4
|
+
* The agent supplies content; the harness mints the id, materializes the
|
|
5
|
+
* frontmatter, and emits the boilerplate around the regex / E2E so the
|
|
6
|
+
* surface is uniform regardless of which agent wrote which invariant.
|
|
7
|
+
*/
|
|
8
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { dirname, join, resolve } from "node:path";
|
|
10
|
+
import { stringify as stringifyYaml } from "yaml";
|
|
11
|
+
import { invariantsDir } from "../ground/paths.js";
|
|
12
|
+
/**
|
|
13
|
+
* Materialize V<N>.md + the matching enforcement artifact. Returns
|
|
14
|
+
* repo-relative paths for both. Idempotent at the *path* level — if a file
|
|
15
|
+
* already exists at the target path the writer overwrites; the id allocator
|
|
16
|
+
* is responsible for picking a fresh id.
|
|
17
|
+
*/
|
|
18
|
+
export function writeInvariantArtifacts(args) {
|
|
19
|
+
const invariantPath = writeInvariantFile(args);
|
|
20
|
+
const sensorPath = writeEnforcement(args);
|
|
21
|
+
return { invariant_path: invariantPath, sensor_path: sensorPath };
|
|
22
|
+
}
|
|
23
|
+
function writeInvariantFile(args) {
|
|
24
|
+
const dir = invariantsDir(args.repoRoot);
|
|
25
|
+
mkdirSync(dir, { recursive: true });
|
|
26
|
+
const filename = `${args.invariantId}.md`;
|
|
27
|
+
const abs = join(dir, filename);
|
|
28
|
+
const rel = `.harness/ground/invariants/${filename}`;
|
|
29
|
+
const sensorRel = predictSensorRelPath(args);
|
|
30
|
+
const frontmatter = {
|
|
31
|
+
id: args.invariantId,
|
|
32
|
+
title: args.output.title,
|
|
33
|
+
type: "invariant",
|
|
34
|
+
status: "active",
|
|
35
|
+
audience: "dual",
|
|
36
|
+
generated: new Date().toISOString(),
|
|
37
|
+
"verified-at": new Date().toISOString(),
|
|
38
|
+
source_run: args.runId,
|
|
39
|
+
introduced_for_bug: args.output.introduced_for_bug,
|
|
40
|
+
sensor: sensorRel,
|
|
41
|
+
naming_convention: `${args.invariantId.toLowerCase()}_${args.output.slug}`,
|
|
42
|
+
...(args.output.source_decision_ids && args.output.source_decision_ids.length > 0
|
|
43
|
+
? { source_decisions: args.output.source_decision_ids }
|
|
44
|
+
: {}),
|
|
45
|
+
};
|
|
46
|
+
const yaml = stringifyYaml(frontmatter);
|
|
47
|
+
const body = ensureTrailingNewline(args.output.body_markdown.trim());
|
|
48
|
+
const fileContent = `---\n${yaml}---\n\n# ${args.invariantId} — ${args.output.title}\n\n${body}\n\n## Enforcement\n\nThis invariant is enforced by [\`${sensorRel}\`](../../../${sensorRel}).\n`;
|
|
49
|
+
writeFileSync(abs, fileContent, "utf8");
|
|
50
|
+
return rel;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Compute what the sensor / E2E path WILL be, before writing it. Used by
|
|
54
|
+
* writeInvariantFile to embed the relative link inside the invariant
|
|
55
|
+
* markdown body.
|
|
56
|
+
*/
|
|
57
|
+
function predictSensorRelPath(args) {
|
|
58
|
+
const kind = args.output.enforcement.kind;
|
|
59
|
+
if (kind === "regex_sensor") {
|
|
60
|
+
const filename = `check-${args.invariantId.toLowerCase()}-${args.output.slug}.ts`;
|
|
61
|
+
return `harness/scripts/${filename}`;
|
|
62
|
+
}
|
|
63
|
+
if (kind === "named_e2e") {
|
|
64
|
+
const customPath = args.output.enforcement.e2e_path;
|
|
65
|
+
return isValidE2eRel(customPath)
|
|
66
|
+
? customPath
|
|
67
|
+
: `e2e/${args.invariantId}_${args.output.slug}.spec.ts`;
|
|
68
|
+
}
|
|
69
|
+
throw new Error(`unknown enforcement kind: ${kind}`);
|
|
70
|
+
}
|
|
71
|
+
function writeEnforcement(args) {
|
|
72
|
+
const kind = args.output.enforcement.kind;
|
|
73
|
+
if (kind === "regex_sensor")
|
|
74
|
+
return writeRegexSensor(args);
|
|
75
|
+
if (kind === "named_e2e")
|
|
76
|
+
return writeE2eStub(args);
|
|
77
|
+
// Defensive: schema-checked, but TS exhaustive switch guard.
|
|
78
|
+
throw new Error(`unknown enforcement kind: ${kind}`);
|
|
79
|
+
}
|
|
80
|
+
function writeRegexSensor(args) {
|
|
81
|
+
const { invariantId, output } = args;
|
|
82
|
+
const slug = output.slug;
|
|
83
|
+
const filename = `check-${invariantId.toLowerCase()}-${slug}.ts`;
|
|
84
|
+
const rel = `harness/scripts/${filename}`;
|
|
85
|
+
const abs = resolve(args.repoRoot, rel);
|
|
86
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
87
|
+
const regex = output.enforcement.regex ?? "(?!.*)"; // never matches
|
|
88
|
+
const targetGlobs = output.enforcement.target_globs ?? ["**/*.ts"];
|
|
89
|
+
const language = output.enforcement.language ?? "typescript";
|
|
90
|
+
const failureMessage = output.enforcement.failure_message ??
|
|
91
|
+
`${invariantId} violation — see .harness/ground/invariants/${invariantId}.md`;
|
|
92
|
+
const escapedRegex = JSON.stringify(regex);
|
|
93
|
+
const escapedGlobs = JSON.stringify(targetGlobs);
|
|
94
|
+
const escapedMessage = JSON.stringify(failureMessage);
|
|
95
|
+
const content = `#!/usr/bin/env tsx
|
|
96
|
+
/**
|
|
97
|
+
* Sensor for invariant ${invariantId} — ${output.title}.
|
|
98
|
+
*
|
|
99
|
+
* Generated by the backprop subagent during run ${args.runId}.
|
|
100
|
+
* Source: .harness/ground/invariants/${invariantId}.md
|
|
101
|
+
*
|
|
102
|
+
* Mechanically scans repo files matching the target globs for a regex that
|
|
103
|
+
* indicates an invariant violation. Exits 0 when no hits, 1 on any hit.
|
|
104
|
+
*
|
|
105
|
+
* Per PRIMER §13: "every fix introduces a permanent invariant" — touching
|
|
106
|
+
* this file requires either fixing the regression OR superseding the
|
|
107
|
+
* invariant via a new V-id.
|
|
108
|
+
*/
|
|
109
|
+
|
|
110
|
+
import { type Dirent, readdirSync, readFileSync, statSync } from "node:fs";
|
|
111
|
+
import { relative, resolve } from "node:path";
|
|
112
|
+
|
|
113
|
+
const REGEX = new RegExp(${escapedRegex}, "gm");
|
|
114
|
+
const TARGET_GLOBS = ${escapedGlobs} as const;
|
|
115
|
+
const LANGUAGE = ${JSON.stringify(language)};
|
|
116
|
+
const FAILURE_MESSAGE = ${escapedMessage};
|
|
117
|
+
|
|
118
|
+
const SKIP_DIRS = new Set([
|
|
119
|
+
".git",
|
|
120
|
+
"node_modules",
|
|
121
|
+
".pnpm-store",
|
|
122
|
+
"dist",
|
|
123
|
+
"build",
|
|
124
|
+
".next",
|
|
125
|
+
".turbo",
|
|
126
|
+
".cache",
|
|
127
|
+
".archive",
|
|
128
|
+
"coverage",
|
|
129
|
+
]);
|
|
130
|
+
|
|
131
|
+
const LANGUAGE_EXTS: Record<string, readonly string[]> = {
|
|
132
|
+
typescript: [".ts", ".tsx", ".cts", ".mts"],
|
|
133
|
+
javascript: [".js", ".jsx", ".cjs", ".mjs"],
|
|
134
|
+
python: [".py"],
|
|
135
|
+
ruby: [".rb"],
|
|
136
|
+
go: [".go"],
|
|
137
|
+
rust: [".rs"],
|
|
138
|
+
sql: [".sql"],
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
function compileGlob(glob: string): RegExp {
|
|
142
|
+
let re = "^";
|
|
143
|
+
for (let i = 0; i < glob.length; i++) {
|
|
144
|
+
const c = glob[i];
|
|
145
|
+
if (c === "*") {
|
|
146
|
+
if (glob[i + 1] === "*") {
|
|
147
|
+
i += 1;
|
|
148
|
+
if (glob[i + 1] === "/") {
|
|
149
|
+
i += 1;
|
|
150
|
+
re += "(?:.*/)?";
|
|
151
|
+
} else {
|
|
152
|
+
re += ".*";
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
re += "[^/]*";
|
|
156
|
+
}
|
|
157
|
+
} else if (c === "?") {
|
|
158
|
+
re += "[^/]";
|
|
159
|
+
} else if (c !== undefined && /[.+^\${}()|[\\]\\\\]/.test(c)) {
|
|
160
|
+
re += \`\\\\\${c}\`;
|
|
161
|
+
} else {
|
|
162
|
+
re += c ?? "";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
re += "$";
|
|
166
|
+
return new RegExp(re);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const GLOB_RE = TARGET_GLOBS.map(compileGlob);
|
|
170
|
+
|
|
171
|
+
function matchesGlobs(rel: string): boolean {
|
|
172
|
+
return GLOB_RE.some((g) => g.test(rel));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function lineOf(text: string, charIndex: number): number {
|
|
176
|
+
let line = 1;
|
|
177
|
+
for (let i = 0; i < charIndex && i < text.length; i++) {
|
|
178
|
+
if (text.charCodeAt(i) === 10) line += 1;
|
|
179
|
+
}
|
|
180
|
+
return line;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function walk(repoRoot: string): string[] {
|
|
184
|
+
const out: string[] = [];
|
|
185
|
+
const stack: string[] = [repoRoot];
|
|
186
|
+
while (stack.length > 0) {
|
|
187
|
+
const dir = stack.pop();
|
|
188
|
+
if (dir === undefined) break;
|
|
189
|
+
let entries: Dirent[];
|
|
190
|
+
try {
|
|
191
|
+
entries = readdirSync(dir, { withFileTypes: true, encoding: "utf8" });
|
|
192
|
+
} catch {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
for (const entry of entries) {
|
|
196
|
+
const abs = resolve(dir, entry.name);
|
|
197
|
+
if (entry.isDirectory()) {
|
|
198
|
+
if (SKIP_DIRS.has(entry.name)) continue;
|
|
199
|
+
stack.push(abs);
|
|
200
|
+
} else if (entry.isFile()) {
|
|
201
|
+
out.push(relative(repoRoot, abs).replace(/\\\\/g, "/"));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
out.sort();
|
|
206
|
+
return out;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function detectLanguage(rel: string): string | undefined {
|
|
210
|
+
const lower = rel.toLowerCase();
|
|
211
|
+
for (const [lang, exts] of Object.entries(LANGUAGE_EXTS)) {
|
|
212
|
+
if (exts.some((e) => lower.endsWith(e))) return lang;
|
|
213
|
+
}
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function main(): void {
|
|
218
|
+
const repoRoot = process.argv[2] ?? process.cwd();
|
|
219
|
+
void statSync(repoRoot); // throws if missing
|
|
220
|
+
const files = walk(repoRoot).filter((rel) => matchesGlobs(rel) && detectLanguage(rel) === LANGUAGE);
|
|
221
|
+
const hits: { path: string; line: number; matched: string }[] = [];
|
|
222
|
+
for (const rel of files) {
|
|
223
|
+
let content: string;
|
|
224
|
+
try {
|
|
225
|
+
content = readFileSync(resolve(repoRoot, rel), "utf8");
|
|
226
|
+
} catch {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
REGEX.lastIndex = 0;
|
|
230
|
+
let m: RegExpExecArray | null;
|
|
231
|
+
while ((m = REGEX.exec(content)) !== null) {
|
|
232
|
+
hits.push({
|
|
233
|
+
path: rel,
|
|
234
|
+
line: lineOf(content, m.index),
|
|
235
|
+
matched: m[0].slice(0, 200),
|
|
236
|
+
});
|
|
237
|
+
if (REGEX.lastIndex === m.index) REGEX.lastIndex += 1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (hits.length === 0) {
|
|
241
|
+
console.log(\`${invariantId}: ok — 0 hits across \${files.length} files\`);
|
|
242
|
+
process.exit(0);
|
|
243
|
+
}
|
|
244
|
+
console.error(\`${invariantId}: FAIL — \${hits.length} hit(s)\`);
|
|
245
|
+
console.error(\` \${FAILURE_MESSAGE}\`);
|
|
246
|
+
for (const h of hits) {
|
|
247
|
+
console.error(\` \${h.path}:\${h.line} → \${h.matched}\`);
|
|
248
|
+
}
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
main();
|
|
253
|
+
`;
|
|
254
|
+
writeFileSync(abs, content, "utf8");
|
|
255
|
+
return rel;
|
|
256
|
+
}
|
|
257
|
+
function writeE2eStub(args) {
|
|
258
|
+
const { invariantId, output } = args;
|
|
259
|
+
const customPath = output.enforcement.e2e_path;
|
|
260
|
+
// Default: e2e/V<N>_<slug>.spec.ts. Honor the agent-supplied path only if it
|
|
261
|
+
// is repo-relative and ends in .spec.ts; otherwise fall back to default.
|
|
262
|
+
const defaultRel = `e2e/${invariantId}_${output.slug}.spec.ts`;
|
|
263
|
+
const rel = isValidE2eRel(customPath) ? customPath : defaultRel;
|
|
264
|
+
const abs = resolve(args.repoRoot, rel);
|
|
265
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
266
|
+
const content = `/**
|
|
267
|
+
* E2E case for invariant ${invariantId} — ${output.title}.
|
|
268
|
+
*
|
|
269
|
+
* Generated by the backprop subagent during run ${args.runId}.
|
|
270
|
+
* Source: .harness/ground/invariants/${invariantId}.md
|
|
271
|
+
*
|
|
272
|
+
* STUB — flesh out with the project's E2E harness. The presence of this
|
|
273
|
+
* file is itself a contract: removing it without superseding ${invariantId}
|
|
274
|
+
* is an invariant violation.
|
|
275
|
+
*/
|
|
276
|
+
|
|
277
|
+
// TODO: import the project's E2E harness and write a case that asserts
|
|
278
|
+
// ${output.title.replace(/\*/g, "")}.
|
|
279
|
+
//
|
|
280
|
+
// The failure mode this guards: ${output.introduced_for_bug.replace(/\n/g, " ").slice(0, 200)}
|
|
281
|
+
//
|
|
282
|
+
// Naming convention: this file's path encodes the invariant id (${invariantId})
|
|
283
|
+
// per PRIMER §13.1. Cite the id in any commit that touches it.
|
|
284
|
+
export const ${invariantId.toLowerCase()}_invariant = ${JSON.stringify(invariantId)};
|
|
285
|
+
`;
|
|
286
|
+
writeFileSync(abs, content, "utf8");
|
|
287
|
+
return rel;
|
|
288
|
+
}
|
|
289
|
+
function isValidE2eRel(p) {
|
|
290
|
+
if (typeof p !== "string" || p.length === 0)
|
|
291
|
+
return false;
|
|
292
|
+
if (p.startsWith("/") || p.startsWith(".."))
|
|
293
|
+
return false;
|
|
294
|
+
if (!p.endsWith(".spec.ts") && !p.endsWith(".spec.tsx"))
|
|
295
|
+
return false;
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
function ensureTrailingNewline(s) {
|
|
299
|
+
return s.endsWith("\n") ? s : `${s}\n`;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/backprop/writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude subprocess error classification.
|
|
3
|
+
*
|
|
4
|
+
* The CLI surfaces rate-limit / overload / auth failures via stderr +
|
|
5
|
+
* non-zero exit. Classifying lets the orchestrator distinguish:
|
|
6
|
+
* - `rate_limit` / `overloaded` → pause dispatch after N consecutive,
|
|
7
|
+
* don't burn the operator's coding-plan quota on doomed retries
|
|
8
|
+
* - `auth` → stop trying immediately + page operator
|
|
9
|
+
* - `other` → ordinary failure, dispatch normally
|
|
10
|
+
*
|
|
11
|
+
* Used by both `claude/runner.ts` (one-shot calls) and
|
|
12
|
+
* `orchestrator/runner.ts` (stream-json implementer runs).
|
|
13
|
+
*/
|
|
14
|
+
export type ClaudeErrorKind = "rate_limit" | "overloaded" | "auth" | "other";
|
|
15
|
+
export declare class ClaudeError extends Error {
|
|
16
|
+
readonly kind: ClaudeErrorKind;
|
|
17
|
+
readonly exitCode: number | undefined;
|
|
18
|
+
readonly stderr: string | undefined;
|
|
19
|
+
constructor(args: {
|
|
20
|
+
message: string;
|
|
21
|
+
kind: ClaudeErrorKind;
|
|
22
|
+
exitCode?: number | null;
|
|
23
|
+
stderr?: string;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export declare function classifyClaudeError(args: {
|
|
27
|
+
message: string;
|
|
28
|
+
exitCode?: number | null;
|
|
29
|
+
stderr?: string;
|
|
30
|
+
}): ClaudeErrorKind;
|
|
31
|
+
/** True when the kind warrants a dispatch pause (vs a per-task fail). */
|
|
32
|
+
export declare function isQuotaKind(kind: ClaudeErrorKind): boolean;
|
|
33
|
+
export declare function asClaudeError(err: unknown, fallbackStderr?: string): ClaudeError;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude subprocess error classification.
|
|
3
|
+
*
|
|
4
|
+
* The CLI surfaces rate-limit / overload / auth failures via stderr +
|
|
5
|
+
* non-zero exit. Classifying lets the orchestrator distinguish:
|
|
6
|
+
* - `rate_limit` / `overloaded` → pause dispatch after N consecutive,
|
|
7
|
+
* don't burn the operator's coding-plan quota on doomed retries
|
|
8
|
+
* - `auth` → stop trying immediately + page operator
|
|
9
|
+
* - `other` → ordinary failure, dispatch normally
|
|
10
|
+
*
|
|
11
|
+
* Used by both `claude/runner.ts` (one-shot calls) and
|
|
12
|
+
* `orchestrator/runner.ts` (stream-json implementer runs).
|
|
13
|
+
*/
|
|
14
|
+
export class ClaudeError extends Error {
|
|
15
|
+
kind;
|
|
16
|
+
exitCode;
|
|
17
|
+
stderr;
|
|
18
|
+
constructor(args) {
|
|
19
|
+
super(args.message);
|
|
20
|
+
this.name = "ClaudeError";
|
|
21
|
+
this.kind = args.kind;
|
|
22
|
+
this.exitCode =
|
|
23
|
+
typeof args.exitCode === "number" ? args.exitCode : undefined;
|
|
24
|
+
this.stderr = args.stderr;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const RATE_LIMIT_RE = /rate[\s_-]?limit|\b429\b|too many requests|usage_limit/i;
|
|
28
|
+
const OVERLOADED_RE = /overloaded|\b529\b|temporarily unavailable|service.?unavailable|\b503\b/i;
|
|
29
|
+
const AUTH_RE = /unauthorized|forbidden|\b401\b|\b403\b|authentication|please[\s_-]+log[\s_-]?in|not[\s_-]+authenticated|invalid[\s_-]+api[\s_-]+key|api[\s_-]+key[\s_-]+expired|credit[\s_-]+balance[\s_-]+is[\s_-]+too[\s_-]+low/i;
|
|
30
|
+
export function classifyClaudeError(args) {
|
|
31
|
+
const text = `${args.message}\n${args.stderr ?? ""}`;
|
|
32
|
+
if (RATE_LIMIT_RE.test(text))
|
|
33
|
+
return "rate_limit";
|
|
34
|
+
if (OVERLOADED_RE.test(text))
|
|
35
|
+
return "overloaded";
|
|
36
|
+
if (AUTH_RE.test(text))
|
|
37
|
+
return "auth";
|
|
38
|
+
return "other";
|
|
39
|
+
}
|
|
40
|
+
/** True when the kind warrants a dispatch pause (vs a per-task fail). */
|
|
41
|
+
export function isQuotaKind(kind) {
|
|
42
|
+
return kind === "rate_limit" || kind === "overloaded";
|
|
43
|
+
}
|
|
44
|
+
export function asClaudeError(err, fallbackStderr) {
|
|
45
|
+
if (err instanceof ClaudeError)
|
|
46
|
+
return err;
|
|
47
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
48
|
+
const kind = classifyClaudeError({
|
|
49
|
+
message,
|
|
50
|
+
...(fallbackStderr !== undefined ? { stderr: fallbackStderr } : {}),
|
|
51
|
+
});
|
|
52
|
+
return new ClaudeError({
|
|
53
|
+
message,
|
|
54
|
+
kind,
|
|
55
|
+
...(fallbackStderr !== undefined ? { stderr: fallbackStderr } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/claude/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,QAAQ,CAAqB;IAC7B,MAAM,CAAqB;IAEpC,YAAY,IAKX;QACC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,aAAa,GAAG,yDAAyD,CAAC;AAChF,MAAM,aAAa,GAAG,0EAA0E,CAAC;AACjG,MAAM,OAAO,GACX,oNAAoN,CAAC;AAEvN,MAAM,UAAU,mBAAmB,CAAC,IAInC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACtC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,cAAuB;IACjE,IAAI,GAAG,YAAY,WAAW;QAAE,OAAO,GAAG,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,OAAO;QACP,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;IACH,OAAO,IAAI,WAAW,CAAC;QACrB,OAAO;QACP,IAAI;QACJ,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/claude/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAO3D,OAAO,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,WAAW,GAEZ,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RunClaudeOptions, RunClaudeResult } from "./types.js";
|
|
2
|
+
/** Returns true when `claude --version` succeeds. Used at startup + smoke. */
|
|
3
|
+
export declare function claudeIsAvailable(): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Run a single non-interactive Claude Code call via subprocess.
|
|
6
|
+
*
|
|
7
|
+
* Auth path: relies on the operator's existing Claude Code login (OAuth /
|
|
8
|
+
* keychain). No `--bare`, no `ANTHROPIC_API_KEY`. The whole point is to use
|
|
9
|
+
* the operator's coding-plan subscription quota per L42.
|
|
10
|
+
*/
|
|
11
|
+
export declare function runClaude(opts: RunClaudeOptions): Promise<RunClaudeResult>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
|
+
import { logger } from "../logger.js";
|
|
3
|
+
import { ClaudeError, classifyClaudeError } from "./error.js";
|
|
4
|
+
const log = logger("claude.runner");
|
|
5
|
+
/** Tier → model alias passed to `claude --model`. */
|
|
6
|
+
const TIER_MODEL = {
|
|
7
|
+
haiku: "haiku",
|
|
8
|
+
sonnet: "sonnet",
|
|
9
|
+
opus: "opus",
|
|
10
|
+
};
|
|
11
|
+
/** Returns true when `claude --version` succeeds. Used at startup + smoke. */
|
|
12
|
+
export function claudeIsAvailable() {
|
|
13
|
+
try {
|
|
14
|
+
const result = spawnSync("claude", ["--version"], { encoding: "utf8" });
|
|
15
|
+
return result.status === 0;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run a single non-interactive Claude Code call via subprocess.
|
|
23
|
+
*
|
|
24
|
+
* Auth path: relies on the operator's existing Claude Code login (OAuth /
|
|
25
|
+
* keychain). No `--bare`, no `ANTHROPIC_API_KEY`. The whole point is to use
|
|
26
|
+
* the operator's coding-plan subscription quota per L42.
|
|
27
|
+
*/
|
|
28
|
+
export async function runClaude(opts) {
|
|
29
|
+
const model = TIER_MODEL[opts.tier];
|
|
30
|
+
const args = [
|
|
31
|
+
"--print",
|
|
32
|
+
"--output-format",
|
|
33
|
+
"json",
|
|
34
|
+
"--no-session-persistence",
|
|
35
|
+
"--model",
|
|
36
|
+
model,
|
|
37
|
+
];
|
|
38
|
+
if (opts.system !== undefined) {
|
|
39
|
+
args.push("--system-prompt", opts.system);
|
|
40
|
+
}
|
|
41
|
+
if (opts.jsonSchema !== undefined) {
|
|
42
|
+
args.push("--json-schema", JSON.stringify(opts.jsonSchema));
|
|
43
|
+
}
|
|
44
|
+
if (opts.extraArgs && opts.extraArgs.length > 0) {
|
|
45
|
+
args.push(...opts.extraArgs);
|
|
46
|
+
}
|
|
47
|
+
const startedAt = Date.now();
|
|
48
|
+
const ctrl = new AbortController();
|
|
49
|
+
const timeoutMs = opts.timeoutMs ?? 120_000;
|
|
50
|
+
const timer = setTimeout(() => ctrl.abort(), timeoutMs);
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
const child = spawn("claude", args, {
|
|
53
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
54
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
55
|
+
signal: ctrl.signal,
|
|
56
|
+
});
|
|
57
|
+
const stdoutChunks = [];
|
|
58
|
+
const stderrChunks = [];
|
|
59
|
+
child.stdout.on("data", (chunk) => stdoutChunks.push(chunk));
|
|
60
|
+
child.stderr.on("data", (chunk) => stderrChunks.push(chunk));
|
|
61
|
+
child.on("error", (err) => {
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
reject(err);
|
|
64
|
+
});
|
|
65
|
+
child.on("close", (code) => {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
const stdout = Buffer.concat(stdoutChunks).toString("utf8");
|
|
68
|
+
const stderr = Buffer.concat(stderrChunks).toString("utf8");
|
|
69
|
+
if (code !== 0) {
|
|
70
|
+
const message = `claude exited ${code}${stderr ? `: ${stderr.trim()}` : ""}`;
|
|
71
|
+
const kind = classifyClaudeError({ message, exitCode: code, stderr });
|
|
72
|
+
reject(new ClaudeError({ message, kind, exitCode: code, stderr }));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
let envelope;
|
|
76
|
+
try {
|
|
77
|
+
envelope = JSON.parse(stdout);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
reject(new ClaudeError({
|
|
81
|
+
message: `claude output not JSON: ${stdout.slice(0, 200)}`,
|
|
82
|
+
kind: "other",
|
|
83
|
+
exitCode: code,
|
|
84
|
+
stderr,
|
|
85
|
+
}));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const text = typeof envelope["result"] === "string" ? envelope["result"] : "";
|
|
89
|
+
let parsed;
|
|
90
|
+
if (opts.jsonSchema !== undefined) {
|
|
91
|
+
// The CLI puts schema-validated payload in `structured_output`, not
|
|
92
|
+
// in `result` (which holds the conversational ack). Prefer that;
|
|
93
|
+
// fall back to parsing the result text in case future versions
|
|
94
|
+
// change the placement.
|
|
95
|
+
if (envelope["structured_output"] !== undefined) {
|
|
96
|
+
parsed = envelope["structured_output"];
|
|
97
|
+
}
|
|
98
|
+
else if (text.length > 0) {
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(text);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
log.warn({ err: String(err), preview: text.slice(0, 200) }, "claude json output parse failed despite --json-schema");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const usageRaw = envelope["usage"];
|
|
108
|
+
const usage = typeof usageRaw === "object" && usageRaw !== null
|
|
109
|
+
? usageRaw
|
|
110
|
+
: undefined;
|
|
111
|
+
const durationMs = Date.now() - startedAt;
|
|
112
|
+
log.info({
|
|
113
|
+
model,
|
|
114
|
+
durationMs,
|
|
115
|
+
input_tokens: usage?.["input_tokens"],
|
|
116
|
+
output_tokens: usage?.["output_tokens"],
|
|
117
|
+
}, "claude call complete");
|
|
118
|
+
resolve({
|
|
119
|
+
text,
|
|
120
|
+
...(parsed !== undefined ? { parsed } : {}),
|
|
121
|
+
durationMs,
|
|
122
|
+
tier: opts.tier,
|
|
123
|
+
model,
|
|
124
|
+
envelope,
|
|
125
|
+
...(usage !== undefined ? { usage } : {}),
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
child.stdin.write(opts.prompt);
|
|
129
|
+
child.stdin.end();
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/claude/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subprocess wrapper for the `claude` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Per L42 + operator answer T1: every Tier-1/2/3 LLM call goes through the
|
|
5
|
+
* operator's Claude Code coding-plan subscription via `claude --print
|
|
6
|
+
* --model <tier> --output-format json`. No direct Anthropic SDK calls.
|
|
7
|
+
*
|
|
8
|
+
* Tier mapping is hardcoded (no env vars per operator profile). The CLI's
|
|
9
|
+
* model alias resolution maps `haiku|sonnet|opus` to the latest model id
|
|
10
|
+
* for that family — we don't pin specific snapshots here so the wrapper
|
|
11
|
+
* keeps tracking newer models as Anthropic ships them.
|
|
12
|
+
*/
|
|
13
|
+
export type ClaudeTier = "haiku" | "sonnet" | "opus";
|
|
14
|
+
export interface RunClaudeOptions {
|
|
15
|
+
tier: ClaudeTier;
|
|
16
|
+
/** User prompt — sent on stdin so it can be arbitrary length. */
|
|
17
|
+
prompt: string;
|
|
18
|
+
/** Optional system prompt override (replaces default Claude Code system). */
|
|
19
|
+
system?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Optional JSON Schema for structured output. When provided, the CLI
|
|
22
|
+
* enforces the shape and the wrapper parses + returns under `parsed`.
|
|
23
|
+
*/
|
|
24
|
+
jsonSchema?: object;
|
|
25
|
+
/** Working directory for the subprocess. Default = process.cwd(). */
|
|
26
|
+
cwd?: string;
|
|
27
|
+
/** Hard timeout in ms. Default 120000. */
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Extra CLI flags. Useful for `--add-dir`, `--disable-slash-commands`,
|
|
31
|
+
* etc. when the caller knows what they want.
|
|
32
|
+
*/
|
|
33
|
+
extraArgs?: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface ClaudeUsage {
|
|
36
|
+
input_tokens?: number;
|
|
37
|
+
output_tokens?: number;
|
|
38
|
+
cache_creation_input_tokens?: number;
|
|
39
|
+
cache_read_input_tokens?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface RunClaudeResult {
|
|
42
|
+
text: string;
|
|
43
|
+
/** Parsed JSON when `jsonSchema` was set. */
|
|
44
|
+
parsed?: unknown;
|
|
45
|
+
durationMs: number;
|
|
46
|
+
tier: ClaudeTier;
|
|
47
|
+
model: string;
|
|
48
|
+
/** Raw JSON envelope from `--output-format json`. */
|
|
49
|
+
envelope?: Record<string, unknown>;
|
|
50
|
+
/** Usage stats lifted from the envelope when present. */
|
|
51
|
+
usage?: ClaudeUsage;
|
|
52
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subprocess wrapper for the `claude` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Per L42 + operator answer T1: every Tier-1/2/3 LLM call goes through the
|
|
5
|
+
* operator's Claude Code coding-plan subscription via `claude --print
|
|
6
|
+
* --model <tier> --output-format json`. No direct Anthropic SDK calls.
|
|
7
|
+
*
|
|
8
|
+
* Tier mapping is hardcoded (no env vars per operator profile). The CLI's
|
|
9
|
+
* model alias resolution maps `haiku|sonnet|opus` to the latest model id
|
|
10
|
+
* for that family — we don't pin specific snapshots here so the wrapper
|
|
11
|
+
* keeps tracking newer models as Anthropic ships them.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/claude/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cairn attention` — show pending operator review items.
|
|
3
|
+
*
|
|
4
|
+
* Reads two sources from the adopted project:
|
|
5
|
+
* 1. `.cairn/ground/decisions/_inbox/*.draft.md` — DEC drafts awaiting confirm
|
|
6
|
+
* 2. `.cairn/baseline/sensor-audit-*.yaml` (latest) — pre-Cairn sensor findings
|
|
7
|
+
*
|
|
8
|
+
* Prints a structured summary; exits 0 when there are no pending items, 2 when
|
|
9
|
+
* any are present (so scripts can branch on attention).
|
|
10
|
+
*/
|
|
11
|
+
export declare function attentionCli(argv: string[]): Promise<void>;
|