@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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sqlite driver — lazy-loads `better-sqlite3`.
|
|
3
|
+
*
|
|
4
|
+
* v1 sqlite is the only fully-functional driver. Operator runs
|
|
5
|
+
* `harness setup:uat-sql` to install better-sqlite3; smoke skips
|
|
6
|
+
* gracefully if the package is missing.
|
|
7
|
+
*/
|
|
8
|
+
let cachedCtor;
|
|
9
|
+
async function loadDriver() {
|
|
10
|
+
if (cachedCtor !== undefined)
|
|
11
|
+
return cachedCtor;
|
|
12
|
+
try {
|
|
13
|
+
const mod = (await import(
|
|
14
|
+
/* @vite-ignore */ "better-sqlite3").catch(() => null));
|
|
15
|
+
if (!mod) {
|
|
16
|
+
cachedCtor = null;
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// better-sqlite3 may export as default or as the bare ctor depending on
|
|
20
|
+
// module interop. Cover both.
|
|
21
|
+
const ctor = typeof mod === "function"
|
|
22
|
+
? mod
|
|
23
|
+
: (mod.default ?? null);
|
|
24
|
+
cachedCtor = ctor;
|
|
25
|
+
return ctor;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
cachedCtor = null;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const sqliteDriver = {
|
|
33
|
+
kind: "sqlite",
|
|
34
|
+
async query(connection, sql) {
|
|
35
|
+
if (connection.driver !== "sqlite") {
|
|
36
|
+
throw new Error(`sqlite driver received non-sqlite connection: ${connection.driver}`);
|
|
37
|
+
}
|
|
38
|
+
const Ctor = await loadDriver();
|
|
39
|
+
if (!Ctor) {
|
|
40
|
+
throw new Error("better-sqlite3 not installed — run `harness setup:uat-sql` to enable sqlite probes");
|
|
41
|
+
}
|
|
42
|
+
const db = new Ctor(connection.file, { readonly: true });
|
|
43
|
+
try {
|
|
44
|
+
const stmt = db.prepare(sql);
|
|
45
|
+
// Reject mutating queries by inspecting the prepared statement's reader flag.
|
|
46
|
+
if (!stmt.reader) {
|
|
47
|
+
throw new Error("sql probe rejects non-SELECT queries (DDL/DML never run as a probe)");
|
|
48
|
+
}
|
|
49
|
+
const rows = stmt.all();
|
|
50
|
+
const result = { rowcount: rows.length, rows };
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
db.close();
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH,IAAI,UAAgD,CAAC;AAErD,KAAK,UAAU,UAAU;IACvB,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM;QACvB,kBAAkB,CAAC,gBAA0B,CAC9C,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAiD,CAAC;QACrE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,wEAAwE;QACxE,8BAA8B;QAC9B,MAAM,IAAI,GACR,OAAO,GAAG,KAAK,UAAU;YACvB,CAAC,CAAE,GAAyB;YAC5B,CAAC,CAAC,CAAE,GAAyB,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QACnD,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAc;IACrC,IAAI,EAAE,QAAQ;IACd,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG;QACzB,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAE,UAA+B,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,8EAA8E;YAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAA+B,CAAC;YACrD,MAAM,MAAM,GAAmB,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/D,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL probe driver types.
|
|
3
|
+
*
|
|
4
|
+
* Connection config loaded from `.harness/config/probes/sql.yaml`. v1
|
|
5
|
+
* supports `sqlite` (zero-server, via better-sqlite3); `postgres` and
|
|
6
|
+
* `mysql` are placeholders that return helpful errors until Phase 11.5b
|
|
7
|
+
* lands their drivers.
|
|
8
|
+
*/
|
|
9
|
+
export type SqlDriverKind = "sqlite" | "postgres" | "mysql";
|
|
10
|
+
export interface SqliteConnection {
|
|
11
|
+
driver: "sqlite";
|
|
12
|
+
/** Absolute path to the .db file. Use `:memory:` for an ephemeral DB. */
|
|
13
|
+
file: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PostgresConnection {
|
|
16
|
+
driver: "postgres";
|
|
17
|
+
host: string;
|
|
18
|
+
port?: number;
|
|
19
|
+
database: string;
|
|
20
|
+
/** ENV var names for credentials (operator's hardline against literal secrets in YAML). */
|
|
21
|
+
user_env?: string;
|
|
22
|
+
password_env?: string;
|
|
23
|
+
ssl?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface MysqlConnection {
|
|
26
|
+
driver: "mysql";
|
|
27
|
+
host: string;
|
|
28
|
+
port?: number;
|
|
29
|
+
database: string;
|
|
30
|
+
user_env?: string;
|
|
31
|
+
password_env?: string;
|
|
32
|
+
}
|
|
33
|
+
export type SqlConnection = SqliteConnection | PostgresConnection | MysqlConnection;
|
|
34
|
+
export interface SqlConnectionsConfig {
|
|
35
|
+
/** Mapping from connection key (the SqlProbe.connection field) → connection config. */
|
|
36
|
+
connections: Record<string, SqlConnection>;
|
|
37
|
+
}
|
|
38
|
+
export interface SqlQueryResult {
|
|
39
|
+
rowcount: number;
|
|
40
|
+
rows: Record<string, unknown>[];
|
|
41
|
+
}
|
|
42
|
+
export interface SqlDriver {
|
|
43
|
+
kind: SqlDriverKind;
|
|
44
|
+
/** Run a single SELECT/SHOW query. Mutating queries are rejected. */
|
|
45
|
+
query(connection: SqlConnection, sql: string): Promise<SqlQueryResult>;
|
|
46
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL probe driver types.
|
|
3
|
+
*
|
|
4
|
+
* Connection config loaded from `.harness/config/probes/sql.yaml`. v1
|
|
5
|
+
* supports `sqlite` (zero-server, via better-sqlite3); `postgres` and
|
|
6
|
+
* `mysql` are placeholders that return helpful errors until Phase 11.5b
|
|
7
|
+
* lands their drivers.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/uat/probes/sql/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sql probe — dispatches to the configured driver (v1 sqlite live; pg/mysql
|
|
3
|
+
* placeholders).
|
|
4
|
+
*/
|
|
5
|
+
import type { ProbeRunResult, SqlProbe } from "../types.js";
|
|
6
|
+
export declare function runSqlProbe(args: {
|
|
7
|
+
probe: SqlProbe;
|
|
8
|
+
repoRoot: string;
|
|
9
|
+
}): Promise<ProbeRunResult>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* sql probe — dispatches to the configured driver (v1 sqlite live; pg/mysql
|
|
3
|
+
* placeholders).
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from "../../logger.js";
|
|
6
|
+
import { resolveConnection, runQuery, SqlConnectionMissingError, } from "./sql/index.js";
|
|
7
|
+
const log = logger("uat.probe.sql");
|
|
8
|
+
export async function runSqlProbe(args) {
|
|
9
|
+
const startedAt = Date.now();
|
|
10
|
+
const probe = args.probe;
|
|
11
|
+
// Defense-in-depth: reject anything that isn't a SELECT/SHOW.
|
|
12
|
+
if (!/^\s*(SELECT|WITH|SHOW|EXPLAIN|PRAGMA)\b/i.test(probe.query)) {
|
|
13
|
+
return {
|
|
14
|
+
probe_id: probe.id,
|
|
15
|
+
probe_kind: "sql",
|
|
16
|
+
passed: false,
|
|
17
|
+
evidence: probe.query.slice(0, 200),
|
|
18
|
+
duration_ms: Date.now() - startedAt,
|
|
19
|
+
failure_reason: "sql probe rejects non-SELECT queries (DDL/DML must not run as a probe)",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const resolved = resolveConnection(args.repoRoot, probe.connection);
|
|
23
|
+
if (!resolved) {
|
|
24
|
+
return {
|
|
25
|
+
probe_id: probe.id,
|
|
26
|
+
probe_kind: "sql",
|
|
27
|
+
passed: false,
|
|
28
|
+
evidence: `connection "${probe.connection}" not configured`,
|
|
29
|
+
duration_ms: Date.now() - startedAt,
|
|
30
|
+
skipped_reason: `connection "${probe.connection}" missing from .harness/config/probes/sql.yaml — run \`harness setup:uat-sql\``,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
let queryResult;
|
|
34
|
+
try {
|
|
35
|
+
queryResult = await runQuery({
|
|
36
|
+
repoRoot: args.repoRoot,
|
|
37
|
+
connectionKey: probe.connection,
|
|
38
|
+
sql: probe.query,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (err instanceof SqlConnectionMissingError) {
|
|
43
|
+
return {
|
|
44
|
+
probe_id: probe.id,
|
|
45
|
+
probe_kind: "sql",
|
|
46
|
+
passed: false,
|
|
47
|
+
evidence: err.message,
|
|
48
|
+
duration_ms: Date.now() - startedAt,
|
|
49
|
+
skipped_reason: err.message,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const msg = String(err);
|
|
53
|
+
// Distinguish "driver not installed" (skipped) from query error (failed).
|
|
54
|
+
if (/not installed|not yet implemented/i.test(msg)) {
|
|
55
|
+
return {
|
|
56
|
+
probe_id: probe.id,
|
|
57
|
+
probe_kind: "sql",
|
|
58
|
+
passed: false,
|
|
59
|
+
evidence: msg.slice(0, 200),
|
|
60
|
+
duration_ms: Date.now() - startedAt,
|
|
61
|
+
skipped_reason: msg,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
probe_id: probe.id,
|
|
66
|
+
probe_kind: "sql",
|
|
67
|
+
passed: false,
|
|
68
|
+
evidence: msg.slice(0, 200),
|
|
69
|
+
duration_ms: Date.now() - startedAt,
|
|
70
|
+
failure_reason: msg,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const failures = evaluateExpectations(probe, queryResult);
|
|
74
|
+
const passed = failures.length === 0;
|
|
75
|
+
log.debug({
|
|
76
|
+
probe_id: probe.id,
|
|
77
|
+
driver: resolved.connection.driver,
|
|
78
|
+
rowcount: queryResult.rowcount,
|
|
79
|
+
passed,
|
|
80
|
+
failures: failures.length,
|
|
81
|
+
}, "sql probe complete");
|
|
82
|
+
return {
|
|
83
|
+
probe_id: probe.id,
|
|
84
|
+
probe_kind: "sql",
|
|
85
|
+
passed,
|
|
86
|
+
evidence: `${resolved.connection.driver}: ${queryResult.rowcount} rows; first=${queryResult.rows[0] ? JSON.stringify(queryResult.rows[0]).slice(0, 160) : "(none)"}`,
|
|
87
|
+
duration_ms: Date.now() - startedAt,
|
|
88
|
+
...(passed ? {} : { failure_reason: failures.join("; ") }),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function evaluateExpectations(probe, result) {
|
|
92
|
+
const failures = [];
|
|
93
|
+
const e = probe.expect;
|
|
94
|
+
if (e.rowcount !== undefined && result.rowcount !== e.rowcount) {
|
|
95
|
+
failures.push(`expected rowcount ${e.rowcount}; got ${result.rowcount}`);
|
|
96
|
+
}
|
|
97
|
+
if (e.rowcount_min !== undefined && result.rowcount < e.rowcount_min) {
|
|
98
|
+
failures.push(`expected rowcount >= ${e.rowcount_min}; got ${result.rowcount}`);
|
|
99
|
+
}
|
|
100
|
+
if (e.rowcount_max !== undefined && result.rowcount > e.rowcount_max) {
|
|
101
|
+
failures.push(`expected rowcount <= ${e.rowcount_max}; got ${result.rowcount}`);
|
|
102
|
+
}
|
|
103
|
+
if (e.first_row_includes) {
|
|
104
|
+
const first = result.rows[0];
|
|
105
|
+
if (!first) {
|
|
106
|
+
failures.push("first_row_includes set but result has no rows");
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
for (const [col, expected] of Object.entries(e.first_row_includes)) {
|
|
110
|
+
const actual = first[col];
|
|
111
|
+
if (JSON.stringify(actual) !== JSON.stringify(expected)) {
|
|
112
|
+
failures.push(`first row column ${col}: expected ${JSON.stringify(expected)}; got ${JSON.stringify(actual)}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return failures;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../../src/uat/probes/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ui probe — live Playwright runtime.
|
|
3
|
+
*
|
|
4
|
+
* Lazy-loads `playwright-core` so the harness package install stays fast.
|
|
5
|
+
* Browsers are downloaded separately via `harness setup:uat-browsers`
|
|
6
|
+
* (which wraps `npx playwright install chromium`). When playwright-core
|
|
7
|
+
* is missing OR no chromium binary is installed, the probe returns a
|
|
8
|
+
* structured `skipped_reason` and the UAT pipeline records the AC as
|
|
9
|
+
* `skipped` rather than failing.
|
|
10
|
+
*
|
|
11
|
+
* Captures per-step screenshots, video.webm (when supported), console
|
|
12
|
+
* lines, and network requests. All artifacts land under the run's
|
|
13
|
+
* `.harness/runs/active/<run_id>/uat/probes/<probe_id>/`.
|
|
14
|
+
*/
|
|
15
|
+
import type { ProbeRunResult, UiProbe } from "../types.js";
|
|
16
|
+
export declare function runUiProbe(args: {
|
|
17
|
+
probe: UiProbe;
|
|
18
|
+
outputDir: string;
|
|
19
|
+
}): Promise<ProbeRunResult>;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ui probe — live Playwright runtime.
|
|
3
|
+
*
|
|
4
|
+
* Lazy-loads `playwright-core` so the harness package install stays fast.
|
|
5
|
+
* Browsers are downloaded separately via `harness setup:uat-browsers`
|
|
6
|
+
* (which wraps `npx playwright install chromium`). When playwright-core
|
|
7
|
+
* is missing OR no chromium binary is installed, the probe returns a
|
|
8
|
+
* structured `skipped_reason` and the UAT pipeline records the AC as
|
|
9
|
+
* `skipped` rather than failing.
|
|
10
|
+
*
|
|
11
|
+
* Captures per-step screenshots, video.webm (when supported), console
|
|
12
|
+
* lines, and network requests. All artifacts land under the run's
|
|
13
|
+
* `.harness/runs/active/<run_id>/uat/probes/<probe_id>/`.
|
|
14
|
+
*/
|
|
15
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { logger } from "../../logger.js";
|
|
18
|
+
const log = logger("uat.probe.ui");
|
|
19
|
+
let cachedPlaywright;
|
|
20
|
+
async function loadPlaywright() {
|
|
21
|
+
if (cachedPlaywright !== undefined)
|
|
22
|
+
return cachedPlaywright;
|
|
23
|
+
try {
|
|
24
|
+
const mod = (await import(
|
|
25
|
+
/* @vite-ignore */ "playwright-core").catch(() => null));
|
|
26
|
+
cachedPlaywright = mod;
|
|
27
|
+
return mod;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
cachedPlaywright = null;
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function runUiProbe(args) {
|
|
35
|
+
const startedAt = Date.now();
|
|
36
|
+
const pw = await loadPlaywright();
|
|
37
|
+
if (!pw || !pw.chromium) {
|
|
38
|
+
return {
|
|
39
|
+
probe_id: args.probe.id,
|
|
40
|
+
probe_kind: "ui",
|
|
41
|
+
passed: false,
|
|
42
|
+
evidence: "playwright-core not installed",
|
|
43
|
+
duration_ms: Date.now() - startedAt,
|
|
44
|
+
skipped_reason: "ui probe needs `playwright-core` + chromium. Run `harness setup:uat-browsers` to install both.",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const probeDir = join(args.outputDir, "probes", args.probe.id);
|
|
48
|
+
await mkdir(probeDir, { recursive: true });
|
|
49
|
+
const screenshotsDir = join(probeDir, "screenshots");
|
|
50
|
+
await mkdir(screenshotsDir, { recursive: true });
|
|
51
|
+
const consoleLines = [];
|
|
52
|
+
const networkLines = [];
|
|
53
|
+
const artifacts = [];
|
|
54
|
+
let browser;
|
|
55
|
+
let page;
|
|
56
|
+
try {
|
|
57
|
+
browser = await pw.chromium.launch({ headless: true });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
return {
|
|
61
|
+
probe_id: args.probe.id,
|
|
62
|
+
probe_kind: "ui",
|
|
63
|
+
passed: false,
|
|
64
|
+
evidence: `chromium failed to launch: ${String(err).slice(0, 200)}`,
|
|
65
|
+
duration_ms: Date.now() - startedAt,
|
|
66
|
+
skipped_reason: "chromium binary missing — run `harness setup:uat-browsers`",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const failures = [];
|
|
70
|
+
try {
|
|
71
|
+
const ctx = await browser.newContext({
|
|
72
|
+
viewport: { width: 1280, height: 720 },
|
|
73
|
+
recordVideo: { dir: probeDir },
|
|
74
|
+
});
|
|
75
|
+
page = await ctx.newPage();
|
|
76
|
+
page.on("console", (msg) => {
|
|
77
|
+
consoleLines.push(`[${msg.type()}] ${msg.text()}`);
|
|
78
|
+
});
|
|
79
|
+
page.on("request", (req) => {
|
|
80
|
+
const entry = {
|
|
81
|
+
method: req.method(),
|
|
82
|
+
url: req.url(),
|
|
83
|
+
};
|
|
84
|
+
const rt = req.resourceType();
|
|
85
|
+
if (rt)
|
|
86
|
+
entry.resourceType = rt;
|
|
87
|
+
networkLines.push(entry);
|
|
88
|
+
});
|
|
89
|
+
page.on("response", (res) => {
|
|
90
|
+
const last = networkLines[networkLines.length - 1];
|
|
91
|
+
if (last && last.url === res.url())
|
|
92
|
+
last.status = res.status();
|
|
93
|
+
});
|
|
94
|
+
// Initial baseline screenshot.
|
|
95
|
+
const baseline = join(screenshotsDir, "00-baseline.png");
|
|
96
|
+
try {
|
|
97
|
+
await page.goto(args.probe.url, { timeout: args.probe.timeout_ms ?? 30_000 });
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
failures.push(`goto ${args.probe.url} failed: ${String(err).slice(0, 200)}`);
|
|
101
|
+
}
|
|
102
|
+
if (failures.length === 0) {
|
|
103
|
+
await page.screenshot({ path: baseline, fullPage: false });
|
|
104
|
+
artifacts.push(`probes/${args.probe.id}/screenshots/00-baseline.png`);
|
|
105
|
+
}
|
|
106
|
+
// Run steps.
|
|
107
|
+
let stepIdx = 1;
|
|
108
|
+
for (const step of args.probe.steps) {
|
|
109
|
+
try {
|
|
110
|
+
switch (step.action) {
|
|
111
|
+
case "goto":
|
|
112
|
+
if (step.value !== undefined) {
|
|
113
|
+
await page.goto(step.value, { timeout: step.timeout_ms ?? 30_000 });
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
failures.push(`step ${stepIdx} (goto) missing value`);
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
case "click":
|
|
120
|
+
if (step.selector !== undefined) {
|
|
121
|
+
await page.click(step.selector, { timeout: step.timeout_ms ?? 10_000 });
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
failures.push(`step ${stepIdx} (click) missing selector`);
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
case "fill":
|
|
128
|
+
if (step.selector !== undefined && step.value !== undefined) {
|
|
129
|
+
await page.fill(step.selector, step.value, { timeout: step.timeout_ms ?? 10_000 });
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
failures.push(`step ${stepIdx} (fill) missing selector or value`);
|
|
133
|
+
}
|
|
134
|
+
break;
|
|
135
|
+
case "wait_for_selector":
|
|
136
|
+
if (step.selector !== undefined) {
|
|
137
|
+
await page.waitForSelector(step.selector, { timeout: step.timeout_ms ?? 10_000 });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
failures.push(`step ${stepIdx} (wait_for_selector) missing selector`);
|
|
141
|
+
}
|
|
142
|
+
break;
|
|
143
|
+
case "wait_for_text":
|
|
144
|
+
if (step.text !== undefined) {
|
|
145
|
+
const predicate = `document.body && document.body.innerText.includes(${JSON.stringify(step.text)})`;
|
|
146
|
+
await page.waitForFunction(predicate, { timeout: step.timeout_ms ?? 10_000 });
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
failures.push(`step ${stepIdx} (wait_for_text) missing text`);
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case "screenshot": {
|
|
153
|
+
const name = step.path ?? `${String(stepIdx).padStart(2, "0")}-step.png`;
|
|
154
|
+
const path = join(screenshotsDir, name);
|
|
155
|
+
await page.screenshot({ path, fullPage: false });
|
|
156
|
+
artifacts.push(`probes/${args.probe.id}/screenshots/${name}`);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
failures.push(`step ${stepIdx} (${step.action}) failed: ${String(err).slice(0, 200)}`);
|
|
163
|
+
}
|
|
164
|
+
stepIdx += 1;
|
|
165
|
+
}
|
|
166
|
+
// Evaluate expectations after steps complete.
|
|
167
|
+
if (failures.length === 0) {
|
|
168
|
+
const html = await page.content();
|
|
169
|
+
if (args.probe.expect.text_present) {
|
|
170
|
+
for (const text of args.probe.expect.text_present) {
|
|
171
|
+
if (!html.includes(text)) {
|
|
172
|
+
failures.push(`expected text not present on page: ${text.slice(0, 60)}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (args.probe.expect.selector_visible) {
|
|
177
|
+
for (const sel of args.probe.expect.selector_visible) {
|
|
178
|
+
if (!(await page.isVisible(sel))) {
|
|
179
|
+
failures.push(`selector not visible: ${sel}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Final screenshot for evidence.
|
|
185
|
+
const final = join(screenshotsDir, "99-final.png");
|
|
186
|
+
try {
|
|
187
|
+
await page.screenshot({ path: final, fullPage: false });
|
|
188
|
+
artifacts.push(`probes/${args.probe.id}/screenshots/99-final.png`);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// best effort
|
|
192
|
+
}
|
|
193
|
+
// Save video if available.
|
|
194
|
+
const video = page.video?.();
|
|
195
|
+
if (video) {
|
|
196
|
+
const target = join(probeDir, "video.webm");
|
|
197
|
+
try {
|
|
198
|
+
await video.saveAs(target);
|
|
199
|
+
artifacts.push(`probes/${args.probe.id}/video.webm`);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// best effort
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
await ctx.close();
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
failures.push(`unexpected: ${String(err).slice(0, 200)}`);
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
if (browser) {
|
|
212
|
+
try {
|
|
213
|
+
await browser.close();
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// best effort
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Persist console + network logs.
|
|
221
|
+
const consolePath = join(probeDir, "console.log");
|
|
222
|
+
const networkPath = join(probeDir, "network.json");
|
|
223
|
+
await writeFile(consolePath, consoleLines.join("\n"), "utf8");
|
|
224
|
+
await writeFile(networkPath, JSON.stringify(networkLines, null, 2), "utf8");
|
|
225
|
+
artifacts.push(`probes/${args.probe.id}/console.log`, `probes/${args.probe.id}/network.json`);
|
|
226
|
+
const passed = failures.length === 0;
|
|
227
|
+
log.debug({
|
|
228
|
+
probe_id: args.probe.id,
|
|
229
|
+
passed,
|
|
230
|
+
failures: failures.length,
|
|
231
|
+
console_lines: consoleLines.length,
|
|
232
|
+
network_lines: networkLines.length,
|
|
233
|
+
}, "ui probe complete");
|
|
234
|
+
return {
|
|
235
|
+
probe_id: args.probe.id,
|
|
236
|
+
probe_kind: "ui",
|
|
237
|
+
passed,
|
|
238
|
+
evidence: `${args.probe.url} → ${artifacts.length} artifact(s); console=${consoleLines.length}; network=${networkLines.length}`,
|
|
239
|
+
duration_ms: Date.now() - startedAt,
|
|
240
|
+
artifacts,
|
|
241
|
+
...(passed ? {} : { failure_reason: failures.join("; ") }),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/uat/probes/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UAT-runner prompts.
|
|
3
|
+
*
|
|
4
|
+
* The UAT-runner picks the cheapest probe that can verify each acceptance
|
|
5
|
+
* criterion. Operator policy: do NOT spin up Chrome to test an API call;
|
|
6
|
+
* do NOT run a CLI to verify a database row.
|
|
7
|
+
*/
|
|
8
|
+
import type { UatRunnerInput } from "./types.js";
|
|
9
|
+
export declare const UAT_RUNNER_SYSTEM_PROMPT: string;
|
|
10
|
+
export declare function buildUatRunnerUserPrompt(input: UatRunnerInput): string;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UAT-runner prompts.
|
|
3
|
+
*
|
|
4
|
+
* The UAT-runner picks the cheapest probe that can verify each acceptance
|
|
5
|
+
* criterion. Operator policy: do NOT spin up Chrome to test an API call;
|
|
6
|
+
* do NOT run a CLI to verify a database row.
|
|
7
|
+
*/
|
|
8
|
+
export const UAT_RUNNER_SYSTEM_PROMPT = [
|
|
9
|
+
"You are the UAT-RUNNER subagent in a developer harness.",
|
|
10
|
+
"",
|
|
11
|
+
"Your job: read the tightened spec + acceptance criteria + diff and emit one acceptance-check per criterion. Each check selects ONE probe — the cheapest one that can mechanically verify that criterion.",
|
|
12
|
+
"",
|
|
13
|
+
"**Probe ladder — pick the FIRST kind that fits:**",
|
|
14
|
+
" 1. `http` — for any AC that asserts behavior of a network endpoint (status code, response body, JSON shape, headers). Never use `ui` for this.",
|
|
15
|
+
" 2. `cli` — for any AC that asserts CLI/process behavior (exit code, stdout, stderr).",
|
|
16
|
+
" 3. `sql` — for any AC that asserts database state (row exists, rowcount, column value). REQUIRES `hints.sql_available = true`. If unavailable, try to verify the same property via `http` against the API surface, OR set `ungenerable_reason`.",
|
|
17
|
+
" 4. `ui` — ONLY for ACs that genuinely require a browser (rendered text, click → navigation, visual layout). REQUIRES `hints.ui_available = true`.",
|
|
18
|
+
" 5. `integration` — for ACs that require multi-service orchestration (docker compose). REQUIRES `hints.integration_available = true`.",
|
|
19
|
+
"",
|
|
20
|
+
"Picking a heavier probe than necessary is a defect. If you find yourself reaching for `ui` because you 'want to be thorough,' stop and pick `http`.",
|
|
21
|
+
"",
|
|
22
|
+
"**Probe shape rules:**",
|
|
23
|
+
" - Every probe has a stable `id` (e.g. `AC1`) and a one-line `description`.",
|
|
24
|
+
" - http: include exact `status` (or `status_in`); add `body_contains` / `json_path_equals` when the AC asserts response shape. Use `hints.base_url` as URL prefix when the AC doesn't include a full URL.",
|
|
25
|
+
" - cli: split `command` and `args` so we don't shell-escape; use `hints.cli_cwd` as cwd; prepend `hints.cli_prefix` ONLY when the AC actually invokes the project's CLI (e.g. `pnpm` workspace prefix).",
|
|
26
|
+
" - ui: minimal `steps`. Always include a `screenshot` step at the start (baseline) and at every assertion checkpoint. Use `wait_for_selector` before `click` on async UI.",
|
|
27
|
+
"",
|
|
28
|
+
"**Cold-start smoke:**",
|
|
29
|
+
" Set `cold_start_smoke = true` when the diff touches startup files (entrypoints, migrations, env loaders, build configs, docker-compose). The orchestrator runs the project's start command before probes. Default false.",
|
|
30
|
+
"",
|
|
31
|
+
"**Backend-only:**",
|
|
32
|
+
" Set `backend_only = true` when ZERO acceptance checks use `ui`. Lets the adapter render with markdown tables instead of GIFs.",
|
|
33
|
+
"",
|
|
34
|
+
"**High-stakes (when `is_high_stakes = true` in the input):**",
|
|
35
|
+
" Per Codex audit Q1 / L43: at least one acceptance check MUST be a cross-tenant negative fixture — a request from user/org B against user/org A's resource that returns the spec's denial response (404 / 403 / scoped-empty). Mark it with `is_high_stakes_required = true`.",
|
|
36
|
+
"",
|
|
37
|
+
"**Ungenerable cases:**",
|
|
38
|
+
" If you genuinely cannot pick a probe for an AC (e.g. AC requires manual visual judgment, or asserts behavior with no probe surface available), set `ungenerable_reason` and emit an `acceptance_checks` array with whatever you CAN verify. The orchestrator will surface ungenerable-reason to the operator and fall back to manual UAT.",
|
|
39
|
+
"",
|
|
40
|
+
"Return ONLY the JSON object. No prose, no markdown wrapper.",
|
|
41
|
+
].join("\n");
|
|
42
|
+
export function buildUatRunnerUserPrompt(input) {
|
|
43
|
+
const parts = [];
|
|
44
|
+
parts.push("# Tightened spec");
|
|
45
|
+
parts.push("");
|
|
46
|
+
parts.push(input.tightened_spec.trim());
|
|
47
|
+
if (input.acceptance_criteria.length > 0) {
|
|
48
|
+
parts.push("");
|
|
49
|
+
parts.push("# Acceptance criteria");
|
|
50
|
+
parts.push("");
|
|
51
|
+
for (const a of input.acceptance_criteria)
|
|
52
|
+
parts.push(`- ${a}`);
|
|
53
|
+
}
|
|
54
|
+
if (input.changed_files.length > 0) {
|
|
55
|
+
parts.push("");
|
|
56
|
+
parts.push("# Files changed");
|
|
57
|
+
parts.push("");
|
|
58
|
+
for (const f of input.changed_files)
|
|
59
|
+
parts.push(`- ${f.path} (${f.status})`);
|
|
60
|
+
}
|
|
61
|
+
parts.push("");
|
|
62
|
+
parts.push("# Available probe surfaces (hints)");
|
|
63
|
+
parts.push("");
|
|
64
|
+
parts.push(`- http: ${input.hints.base_url ? `available; base_url=${input.hints.base_url}` : "available; base_url unset (specify full URL in each probe)"}`);
|
|
65
|
+
parts.push(`- cli: available${input.hints.cli_cwd ? `; cwd=${input.hints.cli_cwd}` : ""}${input.hints.cli_prefix ? `; prefix=${input.hints.cli_prefix}` : ""}`);
|
|
66
|
+
parts.push(`- ui: ${input.hints.ui_available ? "available (playwright installed)" : "UNAVAILABLE — DO NOT emit ui probes"}`);
|
|
67
|
+
parts.push(`- sql: ${input.hints.sql_available ? "available" : "UNAVAILABLE — DO NOT emit sql probes"}`);
|
|
68
|
+
parts.push(`- integration: ${input.hints.integration_available ? "available (docker compose)" : "UNAVAILABLE — DO NOT emit integration probes"}`);
|
|
69
|
+
if (input.is_high_stakes) {
|
|
70
|
+
parts.push("");
|
|
71
|
+
parts.push("# High-stakes augmentation (per Codex audit Q1 / L43)");
|
|
72
|
+
parts.push("");
|
|
73
|
+
parts.push("This diff touches paths classified as high-stakes. You MUST emit at least one acceptance check that is a cross-tenant negative fixture. Mark it `is_high_stakes_required = true`. Acceptable shapes:");
|
|
74
|
+
parts.push("");
|
|
75
|
+
parts.push(" - http: a request signed/authed as user/org B against user/org A's resource, expecting 404 / 403 / scoped-empty.");
|
|
76
|
+
parts.push(" - sql: an INSERT or SELECT that proves user/org A's data is invisible to user/org B's query.");
|
|
77
|
+
parts.push("If neither probe surface can express it, set `ungenerable_reason` so the operator knows manual cross-tenant verification is needed.");
|
|
78
|
+
}
|
|
79
|
+
parts.push("");
|
|
80
|
+
parts.push("---");
|
|
81
|
+
parts.push("");
|
|
82
|
+
parts.push("Emit one acceptance check per AC, picking the cheapest probe that fits. Return ONLY the JSON object.");
|
|
83
|
+
return parts.join("\n");
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/uat/prompt.ts"],"names":[],"mappings":"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"}
|