spexcode 0.6.1 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -149
- package/bin/spex.mjs +4 -0
- package/node_modules/@spexcode/spec-cli/bin/spex.mjs +76 -0
- package/node_modules/@spexcode/spec-cli/dist/attach.d.ts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/attach.js +48 -0
- package/node_modules/@spexcode/spec-cli/dist/claude-headless.d.ts +33 -0
- package/node_modules/@spexcode/spec-cli/dist/claude-headless.js +307 -0
- package/node_modules/@spexcode/spec-cli/dist/cli.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/cli.js +1859 -0
- package/node_modules/@spexcode/spec-cli/dist/client.d.ts +111 -0
- package/node_modules/@spexcode/spec-cli/dist/client.js +476 -0
- package/node_modules/@spexcode/spec-cli/dist/cockpit.d.ts +7 -0
- package/node_modules/@spexcode/spec-cli/dist/cockpit.js +26 -0
- package/node_modules/@spexcode/spec-cli/dist/codex-headless.d.ts +1 -0
- package/{spec-cli/src/codex-headless.ts → node_modules/@spexcode/spec-cli/dist/codex-headless.js} +3 -9
- package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.d.ts +53 -0
- package/node_modules/@spexcode/spec-cli/dist/codex-runtime-generations.js +686 -0
- package/node_modules/@spexcode/spec-cli/dist/commit-surgery.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/commit-surgery.js +90 -0
- package/node_modules/@spexcode/spec-cli/dist/contract-filter.d.ts +14 -0
- package/node_modules/@spexcode/spec-cli/dist/contract-filter.js +219 -0
- package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.d.ts +6 -0
- package/node_modules/@spexcode/spec-cli/dist/dashboard-assets.js +50 -0
- package/node_modules/@spexcode/spec-cli/dist/delivery-queue.d.ts +23 -0
- package/node_modules/@spexcode/spec-cli/dist/delivery-queue.js +179 -0
- package/node_modules/@spexcode/spec-cli/dist/doctor.d.ts +9 -0
- package/node_modules/@spexcode/spec-cli/dist/doctor.js +547 -0
- package/node_modules/@spexcode/spec-cli/dist/eval-host.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/eval-host.js +19 -0
- package/node_modules/@spexcode/spec-cli/dist/execution-trace.d.ts +26 -0
- package/node_modules/@spexcode/spec-cli/dist/execution-trace.js +475 -0
- package/node_modules/@spexcode/spec-cli/dist/file-write.d.ts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/file-write.js +26 -0
- package/node_modules/@spexcode/spec-cli/dist/flat.d.ts +89 -0
- package/node_modules/@spexcode/spec-cli/dist/flat.js +1076 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway-auth.d.ts +56 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway-auth.js +168 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway-hub.d.ts +28 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway-hub.js +361 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway.d.ts +37 -0
- package/node_modules/@spexcode/spec-cli/dist/gateway.js +503 -0
- package/node_modules/@spexcode/spec-cli/dist/graphCache.d.ts +27 -0
- package/node_modules/@spexcode/spec-cli/dist/graphCache.js +716 -0
- package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.d.ts +14 -0
- package/node_modules/@spexcode/spec-cli/dist/graphSnapshot.js +35 -0
- package/node_modules/@spexcode/spec-cli/dist/graphStream.d.ts +85 -0
- package/node_modules/@spexcode/spec-cli/dist/graphStream.js +1195 -0
- package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.d.ts +64 -0
- package/node_modules/@spexcode/spec-cli/dist/guidance-catalog.js +166 -0
- package/node_modules/@spexcode/spec-cli/dist/guide.d.ts +8 -0
- package/{spec-cli/src/guide.ts → node_modules/@spexcode/spec-cli/dist/guide.js} +115 -22
- package/node_modules/@spexcode/spec-cli/dist/harness-select.d.ts +18 -0
- package/node_modules/@spexcode/spec-cli/dist/harness-select.js +62 -0
- package/node_modules/@spexcode/spec-cli/dist/harness.d.ts +325 -0
- package/node_modules/@spexcode/spec-cli/dist/harness.js +3026 -0
- package/node_modules/@spexcode/spec-cli/dist/headless-controller.d.ts +9 -0
- package/node_modules/@spexcode/spec-cli/dist/headless-controller.js +47 -0
- package/node_modules/@spexcode/spec-cli/dist/help.d.ts +10 -0
- package/node_modules/@spexcode/spec-cli/dist/help.js +574 -0
- package/node_modules/@spexcode/spec-cli/dist/hook-prompts.d.ts +18 -0
- package/node_modules/@spexcode/spec-cli/dist/hook-prompts.js +122 -0
- package/node_modules/@spexcode/spec-cli/dist/hooks.d.ts +1 -0
- package/{spec-cli/src/hooks.ts → node_modules/@spexcode/spec-cli/dist/hooks.js} +15 -15
- package/node_modules/@spexcode/spec-cli/dist/host-resources.d.ts +97 -0
- package/node_modules/@spexcode/spec-cli/dist/host-resources.js +795 -0
- package/node_modules/@spexcode/spec-cli/dist/host.d.ts +88 -0
- package/node_modules/@spexcode/spec-cli/dist/host.js +663 -0
- package/node_modules/@spexcode/spec-cli/dist/index.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/index.js +899 -0
- package/node_modules/@spexcode/spec-cli/dist/init.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/init.js +284 -0
- package/node_modules/@spexcode/spec-cli/dist/issues-cli.d.ts +6 -0
- package/node_modules/@spexcode/spec-cli/dist/issues-cli.js +334 -0
- package/node_modules/@spexcode/spec-cli/dist/issues.d.ts +69 -0
- package/node_modules/@spexcode/spec-cli/dist/issues.js +189 -0
- package/node_modules/@spexcode/spec-cli/dist/lint.d.ts +34 -0
- package/node_modules/@spexcode/spec-cli/dist/lint.js +476 -0
- package/node_modules/@spexcode/spec-cli/dist/listen.d.ts +7 -0
- package/{spec-cli/src/listen.ts → node_modules/@spexcode/spec-cli/dist/listen.js} +13 -17
- package/node_modules/@spexcode/spec-cli/dist/localIssues.d.ts +65 -0
- package/node_modules/@spexcode/spec-cli/dist/localIssues.js +582 -0
- package/node_modules/@spexcode/spec-cli/dist/login-page.d.ts +5 -0
- package/{spec-cli/src/login-page.ts → node_modules/@spexcode/spec-cli/dist/login-page.js} +7 -7
- package/node_modules/@spexcode/spec-cli/dist/loop-in.d.ts +23 -0
- package/{spec-cli/src/loop-in.ts → node_modules/@spexcode/spec-cli/dist/loop-in.js} +35 -45
- package/node_modules/@spexcode/spec-cli/dist/machine-peer.d.ts +69 -0
- package/node_modules/@spexcode/spec-cli/dist/machine-peer.js +603 -0
- package/node_modules/@spexcode/spec-cli/dist/materialize.d.ts +18 -0
- package/node_modules/@spexcode/spec-cli/dist/materialize.js +468 -0
- package/node_modules/@spexcode/spec-cli/dist/mentions.d.ts +50 -0
- package/node_modules/@spexcode/spec-cli/dist/mentions.js +117 -0
- package/node_modules/@spexcode/spec-cli/dist/opencode-headless.d.ts +4 -0
- package/node_modules/@spexcode/spec-cli/dist/opencode-headless.js +208 -0
- package/node_modules/@spexcode/spec-cli/dist/opencode.d.ts +3 -0
- package/{spec-cli/src/opencode.ts → node_modules/@spexcode/spec-cli/dist/opencode.js} +9 -13
- package/node_modules/@spexcode/spec-cli/dist/pi-harness.d.ts +3 -0
- package/{spec-cli/src/pi-harness.ts → node_modules/@spexcode/spec-cli/dist/pi-harness.js} +45 -40
- package/node_modules/@spexcode/spec-cli/dist/pi-headless.d.ts +25 -0
- package/node_modules/@spexcode/spec-cli/dist/pi-headless.js +196 -0
- package/node_modules/@spexcode/spec-cli/dist/plugin-harness.d.ts +21 -0
- package/node_modules/@spexcode/spec-cli/dist/plugin-harness.js +146 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-bridge.d.ts +10 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-bridge.js +404 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-helper.d.mts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-helper.mjs +101 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.d.mts +2 -0
- package/node_modules/@spexcode/spec-cli/dist/pty-native-helper.mjs +23 -0
- package/node_modules/@spexcode/spec-cli/dist/public-graph.d.ts +46 -0
- package/node_modules/@spexcode/spec-cli/dist/public-graph.js +56 -0
- package/node_modules/@spexcode/spec-cli/dist/ranker.d.ts +15 -0
- package/node_modules/@spexcode/spec-cli/dist/ranker.js +188 -0
- package/node_modules/@spexcode/spec-cli/dist/reaper.d.ts +6 -0
- package/node_modules/@spexcode/spec-cli/dist/reaper.js +81 -0
- package/node_modules/@spexcode/spec-cli/dist/reviews.d.ts +189 -0
- package/node_modules/@spexcode/spec-cli/dist/reviews.js +350 -0
- package/node_modules/@spexcode/spec-cli/dist/runtime-guard.d.ts +6 -0
- package/node_modules/@spexcode/spec-cli/dist/runtime-guard.js +37 -0
- package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.d.ts +21 -0
- package/node_modules/@spexcode/spec-cli/dist/runtime-ownership.js +84 -0
- package/node_modules/@spexcode/spec-cli/dist/search.bench.d.mts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/search.bench.mjs +75 -0
- package/node_modules/@spexcode/spec-cli/dist/search.d.ts +20 -0
- package/node_modules/@spexcode/spec-cli/dist/search.js +61 -0
- package/node_modules/@spexcode/spec-cli/dist/session-cursors.d.ts +14 -0
- package/node_modules/@spexcode/spec-cli/dist/session-cursors.js +82 -0
- package/node_modules/@spexcode/spec-cli/dist/session-declarations.d.ts +13 -0
- package/node_modules/@spexcode/spec-cli/dist/session-declarations.js +126 -0
- package/node_modules/@spexcode/spec-cli/dist/session-execution.d.ts +10 -0
- package/node_modules/@spexcode/spec-cli/dist/session-execution.js +70 -0
- package/node_modules/@spexcode/spec-cli/dist/session-files.d.ts +28 -0
- package/node_modules/@spexcode/spec-cli/dist/session-files.js +130 -0
- package/node_modules/@spexcode/spec-cli/dist/session-follow.d.ts +31 -0
- package/node_modules/@spexcode/spec-cli/dist/session-follow.js +179 -0
- package/node_modules/@spexcode/spec-cli/dist/session-reparent.d.ts +10 -0
- package/node_modules/@spexcode/spec-cli/dist/session-reparent.js +33 -0
- package/node_modules/@spexcode/spec-cli/dist/session-timeline.d.ts +51 -0
- package/node_modules/@spexcode/spec-cli/dist/session-timeline.js +233 -0
- package/node_modules/@spexcode/spec-cli/dist/session-web.d.ts +24 -0
- package/node_modules/@spexcode/spec-cli/dist/session-web.js +141 -0
- package/node_modules/@spexcode/spec-cli/dist/sessions.d.ts +412 -0
- package/node_modules/@spexcode/spec-cli/dist/sessions.js +4239 -0
- package/node_modules/@spexcode/spec-cli/dist/sh.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/sh.js +3 -0
- package/node_modules/@spexcode/spec-cli/dist/shim-runtime.d.ts +1 -0
- package/{spec-cli/src/shim-runtime.ts → node_modules/@spexcode/spec-cli/dist/shim-runtime.js} +3 -4
- package/node_modules/@spexcode/spec-cli/dist/slash-commands.d.ts +9 -0
- package/node_modules/@spexcode/spec-cli/dist/slash-commands.js +307 -0
- package/node_modules/@spexcode/spec-cli/dist/source-files.d.ts +9 -0
- package/node_modules/@spexcode/spec-cli/dist/source-files.js +113 -0
- package/node_modules/@spexcode/spec-cli/dist/supervise.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/supervise.js +308 -0
- package/node_modules/@spexcode/spec-cli/dist/tree.d.ts +25 -0
- package/node_modules/@spexcode/spec-cli/dist/tree.js +98 -0
- package/node_modules/@spexcode/spec-cli/dist/tsx-bin.d.ts +3 -0
- package/node_modules/@spexcode/spec-cli/dist/tsx-bin.js +41 -0
- package/node_modules/@spexcode/spec-cli/dist/uninstall.d.ts +3 -0
- package/node_modules/@spexcode/spec-cli/dist/uninstall.js +177 -0
- package/node_modules/@spexcode/spec-cli/dist/uploads.d.ts +36 -0
- package/node_modules/@spexcode/spec-cli/dist/uploads.js +243 -0
- package/node_modules/@spexcode/spec-cli/dist/worktree-sources.d.ts +1 -0
- package/node_modules/@spexcode/spec-cli/dist/worktree-sources.js +47 -0
- package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/dispatch.sh +5 -5
- package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/harness.sh +27 -7
- package/node_modules/@spexcode/spec-cli/package.json +47 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +8 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +9 -0
- package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec-first.sh +1 -1
- package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec-of-file.sh +1 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/core/spec.md +22 -0
- package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/spec.md +2 -2
- package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/stop-gate/stop-gate.sh +31 -29
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +15 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +10 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +13 -0
- package/node_modules/@spexcode/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +12 -0
- package/node_modules/@spexcode/spec-core/dist/anchors.d.ts +94 -0
- package/node_modules/@spexcode/spec-core/dist/anchors.js +730 -0
- package/node_modules/@spexcode/spec-core/dist/git.d.ts +166 -0
- package/node_modules/@spexcode/spec-core/dist/git.js +2736 -0
- package/node_modules/@spexcode/spec-core/dist/graph-delta.d.ts +44 -0
- package/node_modules/@spexcode/spec-core/dist/graph-delta.js +72 -0
- package/node_modules/@spexcode/spec-core/dist/graph.d.ts +34 -0
- package/node_modules/@spexcode/spec-core/dist/graph.js +237 -0
- package/node_modules/@spexcode/spec-core/dist/graphDelta.d.ts +3 -0
- package/node_modules/@spexcode/spec-core/dist/graphDelta.js +13 -0
- package/node_modules/@spexcode/spec-core/dist/harness-identity.d.ts +31 -0
- package/node_modules/@spexcode/spec-core/dist/harness-identity.js +20 -0
- package/node_modules/@spexcode/spec-core/dist/identity-presets.d.ts +152 -0
- package/node_modules/@spexcode/spec-core/dist/identity-presets.js +132 -0
- package/node_modules/@spexcode/spec-core/dist/index.d.ts +45 -0
- package/node_modules/@spexcode/spec-core/dist/index.js +19 -0
- package/node_modules/@spexcode/spec-core/dist/layout.d.ts +183 -0
- package/node_modules/@spexcode/spec-core/dist/layout.js +548 -0
- package/node_modules/@spexcode/spec-core/dist/process-identity.d.ts +37 -0
- package/node_modules/@spexcode/spec-core/dist/process-identity.js +214 -0
- package/node_modules/@spexcode/spec-core/dist/project-identity.d.ts +12 -0
- package/node_modules/@spexcode/spec-core/dist/project-identity.js +71 -0
- package/node_modules/@spexcode/spec-core/dist/project-store.d.ts +3 -0
- package/node_modules/@spexcode/spec-core/dist/project-store.js +14 -0
- package/node_modules/@spexcode/spec-core/dist/resilience.d.ts +2 -0
- package/node_modules/@spexcode/spec-core/dist/resilience.js +40 -0
- package/node_modules/@spexcode/spec-core/dist/review/index.d.ts +3 -0
- package/node_modules/@spexcode/spec-core/dist/review/index.js +5 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.d.ts +77 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewFilters.js +308 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.d.ts +66 -0
- package/node_modules/@spexcode/spec-core/dist/review/reviewQuery.js +180 -0
- package/node_modules/@spexcode/spec-core/dist/review/session.d.ts +4 -0
- package/node_modules/@spexcode/spec-core/dist/review/session.js +8 -0
- package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.d.ts +15 -0
- package/node_modules/@spexcode/spec-core/dist/reviewSnapshot.js +12 -0
- package/node_modules/@spexcode/spec-core/dist/root-lru.d.ts +4 -0
- package/{spec-cli/src/root-lru.ts → node_modules/@spexcode/spec-core/dist/root-lru.js} +26 -30
- package/node_modules/@spexcode/spec-core/dist/specs.d.ts +117 -0
- package/node_modules/@spexcode/spec-core/dist/specs.js +489 -0
- package/node_modules/@spexcode/spec-core/package.json +28 -0
- package/node_modules/@spexcode/spec-eval/dist/cache.d.ts +10 -0
- package/node_modules/@spexcode/spec-eval/dist/cache.js +50 -0
- package/node_modules/@spexcode/spec-eval/dist/cli.d.ts +22 -0
- package/node_modules/@spexcode/spec-eval/dist/cli.js +981 -0
- package/node_modules/@spexcode/spec-eval/dist/evaltab.d.ts +98 -0
- package/node_modules/@spexcode/spec-eval/dist/evaltab.js +176 -0
- package/node_modules/@spexcode/spec-eval/dist/filing.d.ts +16 -0
- package/node_modules/@spexcode/spec-eval/dist/filing.js +36 -0
- package/node_modules/@spexcode/spec-eval/dist/freshness.d.ts +48 -0
- package/node_modules/@spexcode/spec-eval/dist/freshness.js +799 -0
- package/node_modules/@spexcode/spec-eval/dist/host.d.ts +46 -0
- package/node_modules/@spexcode/spec-eval/dist/host.js +53 -0
- package/node_modules/@spexcode/spec-eval/dist/humanok.d.ts +11 -0
- package/node_modules/@spexcode/spec-eval/dist/humanok.js +27 -0
- package/node_modules/@spexcode/spec-eval/dist/index.d.ts +4 -0
- package/node_modules/@spexcode/spec-eval/dist/index.js +4 -0
- package/node_modules/@spexcode/spec-eval/dist/remarks.d.ts +31 -0
- package/node_modules/@spexcode/spec-eval/dist/remarks.js +1 -0
- package/node_modules/@spexcode/spec-eval/dist/scenariofresh.d.ts +13 -0
- package/node_modules/@spexcode/spec-eval/dist/scenariofresh.js +303 -0
- package/node_modules/@spexcode/spec-eval/dist/scenarios.d.ts +99 -0
- package/node_modules/@spexcode/spec-eval/dist/scenarios.js +650 -0
- package/node_modules/@spexcode/spec-eval/dist/sessioneval.d.ts +307 -0
- package/node_modules/@spexcode/spec-eval/dist/sessioneval.js +1883 -0
- package/node_modules/@spexcode/spec-eval/dist/sidecar.d.ts +55 -0
- package/node_modules/@spexcode/spec-eval/dist/sidecar.js +82 -0
- package/node_modules/@spexcode/spec-eval/dist/timeline.d.ts +25 -0
- package/node_modules/@spexcode/spec-eval/dist/timeline.js +65 -0
- package/node_modules/@spexcode/spec-eval/dist/ui-path.d.ts +1 -0
- package/node_modules/@spexcode/spec-eval/dist/ui-path.js +2 -0
- package/node_modules/@spexcode/spec-eval/package.json +36 -0
- package/node_modules/@spexcode/spec-forge/dist/cache.d.ts +29 -0
- package/node_modules/@spexcode/spec-forge/dist/cache.js +59 -0
- package/node_modules/@spexcode/spec-forge/dist/cli.d.ts +1 -0
- package/node_modules/@spexcode/spec-forge/dist/cli.js +100 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers/github.d.ts +2 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers/github.js +116 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.d.ts +7 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers/gitlab.js +144 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers.d.ts +10 -0
- package/node_modules/@spexcode/spec-forge/dist/drivers.js +83 -0
- package/node_modules/@spexcode/spec-forge/dist/index.d.ts +4 -0
- package/node_modules/@spexcode/spec-forge/dist/index.js +4 -0
- package/node_modules/@spexcode/spec-forge/dist/links.d.ts +15 -0
- package/node_modules/@spexcode/spec-forge/dist/links.js +65 -0
- package/node_modules/@spexcode/spec-forge/dist/needs-eval.d.ts +10 -0
- package/node_modules/@spexcode/spec-forge/dist/needs-eval.js +20 -0
- package/node_modules/@spexcode/spec-forge/dist/port.d.ts +53 -0
- package/node_modules/@spexcode/spec-forge/dist/port.js +1 -0
- package/node_modules/@spexcode/spec-forge/dist/resident.d.ts +7 -0
- package/node_modules/@spexcode/spec-forge/dist/resident.js +43 -0
- package/node_modules/@spexcode/spec-forge/package.json +32 -0
- package/package.json +33 -19
- package/spec-cli/bin/spex.mjs +0 -69
- package/spec-cli/src/anchors.ts +0 -706
- package/spec-cli/src/attach.ts +0 -43
- package/spec-cli/src/claude-headless.ts +0 -321
- package/spec-cli/src/cli.ts +0 -1115
- package/spec-cli/src/client.ts +0 -315
- package/spec-cli/src/cockpit.ts +0 -43
- package/spec-cli/src/codex-runtime-generations.ts +0 -646
- package/spec-cli/src/commit-surgery.ts +0 -68
- package/spec-cli/src/contract-filter.ts +0 -202
- package/spec-cli/src/delivery-queue.ts +0 -107
- package/spec-cli/src/doctor.ts +0 -516
- package/spec-cli/src/file-write.ts +0 -22
- package/spec-cli/src/gateway-auth.ts +0 -181
- package/spec-cli/src/gateway-hub.ts +0 -356
- package/spec-cli/src/gateway.ts +0 -368
- package/spec-cli/src/git.ts +0 -2180
- package/spec-cli/src/graph.ts +0 -221
- package/spec-cli/src/graphCache.ts +0 -641
- package/spec-cli/src/graphDelta.ts +0 -77
- package/spec-cli/src/graphStream.ts +0 -1019
- package/spec-cli/src/harness-select.ts +0 -77
- package/spec-cli/src/harness.ts +0 -2747
- package/spec-cli/src/headless-controller.ts +0 -63
- package/spec-cli/src/help.ts +0 -480
- package/spec-cli/src/host-resources.ts +0 -707
- package/spec-cli/src/host.ts +0 -611
- package/spec-cli/src/identity-presets.d.ts +0 -13
- package/spec-cli/src/identity-presets.js +0 -128
- package/spec-cli/src/index.ts +0 -730
- package/spec-cli/src/init.ts +0 -258
- package/spec-cli/src/issues-cli.ts +0 -276
- package/spec-cli/src/issues.ts +0 -237
- package/spec-cli/src/layout.ts +0 -557
- package/spec-cli/src/lint.ts +0 -458
- package/spec-cli/src/localIssues.ts +0 -538
- package/spec-cli/src/materialize.ts +0 -412
- package/spec-cli/src/mentions.ts +0 -81
- package/spec-cli/src/opencode-headless.ts +0 -205
- package/spec-cli/src/pi-headless.ts +0 -153
- package/spec-cli/src/plugin-harness.ts +0 -157
- package/spec-cli/src/process-identity.ts +0 -207
- package/spec-cli/src/project-identity.ts +0 -73
- package/spec-cli/src/project-store.ts +0 -17
- package/spec-cli/src/pty-bridge.ts +0 -396
- package/spec-cli/src/pty-helper.mjs +0 -96
- package/spec-cli/src/pty-native-helper.mjs +0 -22
- package/spec-cli/src/ranker.ts +0 -191
- package/spec-cli/src/reaper.ts +0 -125
- package/spec-cli/src/resilience.ts +0 -41
- package/spec-cli/src/reviewSnapshot.ts +0 -28
- package/spec-cli/src/reviews.ts +0 -405
- package/spec-cli/src/runtime-guard.ts +0 -35
- package/spec-cli/src/runtime-ownership.ts +0 -88
- package/spec-cli/src/search.bench.mjs +0 -80
- package/spec-cli/src/search.ts +0 -63
- package/spec-cli/src/session-cursors.ts +0 -91
- package/spec-cli/src/session-follow.ts +0 -182
- package/spec-cli/src/session-timeline.ts +0 -98
- package/spec-cli/src/sessions.ts +0 -3403
- package/spec-cli/src/sh.ts +0 -3
- package/spec-cli/src/slash-commands.ts +0 -318
- package/spec-cli/src/source-files.ts +0 -104
- package/spec-cli/src/specs.ts +0 -498
- package/spec-cli/src/supervise.ts +0 -245
- package/spec-cli/src/tree.ts +0 -118
- package/spec-cli/src/tsx-bin.ts +0 -18
- package/spec-cli/src/uninstall.ts +0 -171
- package/spec-cli/src/uploads.ts +0 -253
- package/spec-cli/src/worktree-sources.ts +0 -42
- package/spec-cli/templates/spec/project/.plugins/commands/supervisor/spec.md +0 -8
- package/spec-cli/templates/spec/project/.plugins/core/comment-altitude/spec.md +0 -28
- package/spec-cli/templates/spec/project/.plugins/core/spec.md +0 -23
- package/spec-cli/templates/spec/project/.plugins/prompts/atomic-landing/spec.md +0 -32
- package/spec-cli/templates/spec/project/.plugins/prompts/forge-link/spec.md +0 -9
- package/spec-cli/templates/spec/project/.plugins/prompts/memory-hygiene/spec.md +0 -15
- package/spec-cli/templates/spec/project/.plugins/prompts/reproduce-before-fix/spec.md +0 -18
- package/spec-dashboard/dist/assets/App-F9uaAVcH.js +0 -2
- package/spec-dashboard/dist/assets/Dashboard-Ba_jhxp1.js +0 -27
- package/spec-dashboard/dist/assets/Dashboard-C5ap-Sga.css +0 -1
- package/spec-dashboard/dist/assets/EvalsPage-FixoOg_n.js +0 -2
- package/spec-dashboard/dist/assets/IssuesPage-CuKLFhH3.js +0 -1
- package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/spec-dashboard/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/spec-dashboard/dist/assets/MobileApp-CHgEHORJ.js +0 -2
- package/spec-dashboard/dist/assets/Modal-CQgYymmr.js +0 -1
- package/spec-dashboard/dist/assets/PageScroll-hT7UTLvD.js +0 -1
- package/spec-dashboard/dist/assets/ProjectsPage-CtXxakF9.js +0 -1
- package/spec-dashboard/dist/assets/SessionInterface-6GBZ9nXN.css +0 -32
- package/spec-dashboard/dist/assets/SessionInterface-Bpie-9fs.js +0 -39
- package/spec-dashboard/dist/assets/SessionWindow-CixDi4PI.js +0 -1
- package/spec-dashboard/dist/assets/Settings-C2MsucfE.js +0 -1
- package/spec-dashboard/dist/assets/Thread-C6Go8HRh.js +0 -13
- package/spec-dashboard/dist/assets/bindings-BC9vqpYU.js +0 -1
- package/spec-dashboard/dist/assets/data-B-RQmit6.js +0 -1
- package/spec-dashboard/dist/assets/index-CsI8DElI.css +0 -1
- package/spec-dashboard/dist/assets/index-DrVao0Ep.js +0 -41
- package/spec-dashboard/dist/assets/launch-BBH02b1v.js +0 -276
- package/spec-dashboard/dist/assets/launch-Cp579UoJ.css +0 -1
- package/spec-dashboard/dist/assets/terminalFont-C6oGNKrf.js +0 -1
- package/spec-dashboard/dist/index.html +0 -29
- package/spec-dashboard/src/reviewFilters.js +0 -322
- package/spec-dashboard/src/reviewQuery.js +0 -174
- package/spec-dashboard/src/session.js +0 -199
- package/spec-eval/src/cache.ts +0 -57
- package/spec-eval/src/cli.ts +0 -889
- package/spec-eval/src/evaltab.ts +0 -262
- package/spec-eval/src/filing.ts +0 -39
- package/spec-eval/src/freshness.ts +0 -557
- package/spec-eval/src/humanok.ts +0 -28
- package/spec-eval/src/scenariofresh.ts +0 -244
- package/spec-eval/src/scenarios.ts +0 -672
- package/spec-eval/src/sessioneval.ts +0 -2226
- package/spec-eval/src/sidecar.ts +0 -93
- package/spec-eval/src/timeline.ts +0 -54
- package/spec-forge/src/__fixtures__/github-forge.json +0 -63
- package/spec-forge/src/cache.ts +0 -66
- package/spec-forge/src/cli.ts +0 -99
- package/spec-forge/src/drivers/github.ts +0 -132
- package/spec-forge/src/drivers/gitlab.ts +0 -153
- package/spec-forge/src/drivers.ts +0 -73
- package/spec-forge/src/links.ts +0 -72
- package/spec-forge/src/needs-eval.ts +0 -29
- package/spec-forge/src/port.ts +0 -36
- package/spec-forge/src/resident.ts +0 -46
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/README.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-0.5.2-eef1.fixture +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/hooks/compat/mark-active-sed-v0.fixture +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/commit-msg +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-checkout +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/post-merge +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/pre-commit +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/prepare-commit-msg +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/hooks/reference-transaction +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/extract/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/regroup/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/rename/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/commands/tidy/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/idle.sh +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/idle/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/mark-active.sh +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/mark-active/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/fail.sh +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/session-fail/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-first/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/core/spec-of-file/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/prompts/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/digest.mjs +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/distill/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/skills/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/.plugins/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-cli}/templates/spec/project/spec.md +0 -0
- /package/{spec-cli → node_modules/@spexcode/spec-core}/templates/spexcode.json +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type DriftIndex, type HistoryIndex } from '@spexcode/spec-core';
|
|
2
|
+
import { loadSpecs } from '@spexcode/spec-core';
|
|
3
|
+
import type { RemarkTrack, Issue } from './remarks.js';
|
|
4
|
+
export type { RemarkTrack, Issue, Reply } from './remarks.js';
|
|
5
|
+
import { type EvalNode, type ScenarioTestReference } from './scenarios.js';
|
|
6
|
+
import { type Verdict, type EvidenceKind, type Retraction } from './sidecar.js';
|
|
7
|
+
import { type StaleAxis } from './freshness.js';
|
|
8
|
+
import { type ScenarioIndex } from './scenariofresh.js';
|
|
9
|
+
export type EvidenceView = {
|
|
10
|
+
hash: string;
|
|
11
|
+
kind: EvidenceKind;
|
|
12
|
+
state: 'present' | 'miss';
|
|
13
|
+
};
|
|
14
|
+
export type RemarkView = {
|
|
15
|
+
rid: string;
|
|
16
|
+
ref: string;
|
|
17
|
+
by: string;
|
|
18
|
+
at: string;
|
|
19
|
+
body: string;
|
|
20
|
+
targetCodeSha: string;
|
|
21
|
+
resolved: boolean;
|
|
22
|
+
resolvedAt?: string;
|
|
23
|
+
resolvedBy?: string;
|
|
24
|
+
dangling: boolean;
|
|
25
|
+
};
|
|
26
|
+
export type EvalEntry = {
|
|
27
|
+
scenario: string;
|
|
28
|
+
expected: string;
|
|
29
|
+
codeSha: string;
|
|
30
|
+
evidence?: EvidenceView[];
|
|
31
|
+
blob: string | null;
|
|
32
|
+
blobKind?: EvidenceKind;
|
|
33
|
+
timelineBlob?: string;
|
|
34
|
+
evaluator?: string;
|
|
35
|
+
by?: string;
|
|
36
|
+
verdict?: Verdict;
|
|
37
|
+
ts: string;
|
|
38
|
+
fresh: boolean;
|
|
39
|
+
staleAxes: StaleAxis[];
|
|
40
|
+
freshnessDeferred?: true;
|
|
41
|
+
blobState: 'present' | 'miss' | 'none';
|
|
42
|
+
codeDrift?: {
|
|
43
|
+
file: string;
|
|
44
|
+
behind: number;
|
|
45
|
+
}[];
|
|
46
|
+
remarks?: RemarkView[];
|
|
47
|
+
thread?: Issue;
|
|
48
|
+
humanOk?: {
|
|
49
|
+
by: string;
|
|
50
|
+
ts: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type DanglingTrack = {
|
|
54
|
+
scenario: string;
|
|
55
|
+
threadId: string;
|
|
56
|
+
thread: Issue;
|
|
57
|
+
remarks: RemarkView[];
|
|
58
|
+
};
|
|
59
|
+
export type ScenarioInfo = {
|
|
60
|
+
name: string;
|
|
61
|
+
expected: string;
|
|
62
|
+
tags?: string[];
|
|
63
|
+
test?: ScenarioTestReference;
|
|
64
|
+
code?: string[];
|
|
65
|
+
};
|
|
66
|
+
export type EvalTimeline = {
|
|
67
|
+
node: string;
|
|
68
|
+
hasEvalFile: boolean;
|
|
69
|
+
scenarios: ScenarioInfo[];
|
|
70
|
+
readings: EvalEntry[];
|
|
71
|
+
retractions: Retraction[];
|
|
72
|
+
dangling: DanglingTrack[];
|
|
73
|
+
};
|
|
74
|
+
export type EvalContext = {
|
|
75
|
+
root: string;
|
|
76
|
+
specs: Awaited<ReturnType<typeof loadSpecs>>;
|
|
77
|
+
idx: DriftIndex;
|
|
78
|
+
hidx: HistoryIndex;
|
|
79
|
+
scidx: ScenarioIndex;
|
|
80
|
+
ynodes: EvalNode[];
|
|
81
|
+
remarks: Map<string, RemarkTrack>;
|
|
82
|
+
};
|
|
83
|
+
export declare function evalContext(root: string, specs: Awaited<ReturnType<typeof loadSpecs>>, idx: DriftIndex, hidx: HistoryIndex, remarks?: Map<string, RemarkTrack>, ynodes?: EvalNode[]): Promise<EvalContext>;
|
|
84
|
+
export declare function evalTimelines(ids: readonly string[], ctx?: EvalContext, opts?: {
|
|
85
|
+
order?: boolean;
|
|
86
|
+
}): Promise<EvalTimeline[]>;
|
|
87
|
+
export declare function evalTimeline(id: string, ctx?: EvalContext): Promise<EvalTimeline>;
|
|
88
|
+
export type BlobResult = {
|
|
89
|
+
ok: true;
|
|
90
|
+
bytes: Buffer;
|
|
91
|
+
mime: string;
|
|
92
|
+
} | {
|
|
93
|
+
ok: false;
|
|
94
|
+
reason: 'invalid' | 'miss';
|
|
95
|
+
message: string;
|
|
96
|
+
};
|
|
97
|
+
export declare function readBlobByHash(hash: string, dir?: string): BlobResult;
|
|
98
|
+
export declare function sniffBlobMime(b: Buffer): string;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { relative, dirname } from 'node:path';
|
|
2
|
+
import { repoRoot, driftIndex, historyIndex, commitReachable } from '@spexcode/spec-core';
|
|
3
|
+
import { loadSpecs } from '@spexcode/spec-core';
|
|
4
|
+
import { evalRemarkTracks, trackKey } from './host.js';
|
|
5
|
+
import { evalNodes, scenarioCodeAxis } from './scenarios.js';
|
|
6
|
+
import { readSidecar, applyRetractions, evidenceOf, isJsonBlob, humanOkFor } from './sidecar.js';
|
|
7
|
+
import { staleAxes, codeDrift, contentProbeFor, anchorProbeFor } from './freshness.js';
|
|
8
|
+
import { scenarioIndex } from './scenariofresh.js';
|
|
9
|
+
import { hasBlob, getBlob, MISS_BLOB } from './cache.js';
|
|
10
|
+
function toRemarkView(rm, threadId, dangling) {
|
|
11
|
+
return {
|
|
12
|
+
rid: rm.rid,
|
|
13
|
+
ref: `${threadId}#${rm.rid}`,
|
|
14
|
+
by: rm.by, at: rm.at, body: rm.body,
|
|
15
|
+
targetCodeSha: rm.targetCodeSha ?? '',
|
|
16
|
+
resolved: !!rm.resolved,
|
|
17
|
+
...(rm.resolvedAt ? { resolvedAt: rm.resolvedAt } : {}),
|
|
18
|
+
...(rm.resolvedBy ? { resolvedBy: rm.resolvedBy } : {}),
|
|
19
|
+
dangling,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function evalContext(root, specs, idx, hidx, remarks, ynodes) {
|
|
23
|
+
const nodes = ynodes ?? evalNodes(root);
|
|
24
|
+
const scidx = await scenarioIndex(root, nodes.map((n) => n.evalPath));
|
|
25
|
+
return { root, specs, idx, hidx, scidx, ynodes: nodes, remarks: remarks ?? evalRemarkTracks() };
|
|
26
|
+
}
|
|
27
|
+
// @@@ one read, one batch - the freshness engine's Git work is immutable-object work, so it is owned ONCE
|
|
28
|
+
// per read rather than once per reading. evalTimelines is the plural the graph build actually wants: it
|
|
29
|
+
// plans every node's rows first (pure fs + in-memory projection), primes the content and anchor probes with
|
|
30
|
+
// the WHOLE demand set, then assembles. Singular evalTimeline is the one-id case of the same path.
|
|
31
|
+
// @@@ `order` skips the FRESHNESS pass, not the rows - a caller that only needs to know WHICH scenarios are
|
|
32
|
+
// in play and in what sequence (identity, filed time, measured-or-blind) pays for none of the probes: on a
|
|
33
|
+
// 415-node scope the freshness pass is 25s and 1476 git children, the rows themselves are milliseconds.
|
|
34
|
+
// Rows returned this way carry `freshnessDeferred` INSTEAD of `fresh`/`staleAxes`, and evalReviewState
|
|
35
|
+
// refuses them loudly — an order row can never be mistaken for a measured verdict.
|
|
36
|
+
export async function evalTimelines(ids, ctx, opts = {}) {
|
|
37
|
+
const root = ctx?.root ?? repoRoot();
|
|
38
|
+
const ynodes = ctx?.ynodes ?? evalNodes(root);
|
|
39
|
+
const specs = ctx?.specs ?? await loadSpecs();
|
|
40
|
+
const idx = ctx?.idx ?? await driftIndex(root);
|
|
41
|
+
const hidx = ctx?.hidx ?? await historyIndex(root);
|
|
42
|
+
const scidx = ctx?.scidx ?? await scenarioIndex(root, ynodes.map((n) => n.evalPath));
|
|
43
|
+
const tracks = ctx?.remarks ?? evalRemarkTracks();
|
|
44
|
+
const probe = contentProbeFor(root);
|
|
45
|
+
const anchors = anchorProbeFor(root, idx);
|
|
46
|
+
const plans = ids.map((id) => {
|
|
47
|
+
const ynode = ynodes.find((n) => n.id === id);
|
|
48
|
+
if (!ynode)
|
|
49
|
+
return { id, codeEntries: [], rows: [], retractions: [], oks: [] };
|
|
50
|
+
const codeEntries = specs.find((s) => dirname(s.path) === relative(root, ynode.dir))?.codeEntries ?? [];
|
|
51
|
+
const byName = new Map(ynode.scenarios.map((s) => [s.name, s]));
|
|
52
|
+
const { readings, retractions, oks } = readSidecar(ynode.sidecarPath);
|
|
53
|
+
const rows = applyRetractions(readings, retractions).map((reading) => ({
|
|
54
|
+
reading, axis: scenarioCodeAxis(byName.get(reading.scenario)?.code, codeEntries),
|
|
55
|
+
}));
|
|
56
|
+
return { id, ynode, codeEntries, rows, retractions, oks };
|
|
57
|
+
});
|
|
58
|
+
// an order-only read stops HERE, before a single probe: the rows above are already the whole answer.
|
|
59
|
+
if (opts.order)
|
|
60
|
+
return plans.map((plan) => assembleTimeline(plan.id, plan.ynode, plan.rows, plan.retractions, plan.oks, {
|
|
61
|
+
idx, scidx, tracks, probe, anchors, order: true,
|
|
62
|
+
}));
|
|
63
|
+
// An off-history anchor is the only reading that needs a content verdict. Plan the population first so the
|
|
64
|
+
// probe can answer many anchor/HEAD pairs through bounded plural children instead of one child per anchor.
|
|
65
|
+
const contentDemands = plans.flatMap((plan) => plan.ynode
|
|
66
|
+
? plan.rows.filter((row) => !commitReachable(idx, row.reading.codeSha))
|
|
67
|
+
.map((row) => ({ anchorSha: row.reading.codeSha, paths: row.axis.paths, evalPath: plan.ynode.evalPath }))
|
|
68
|
+
: []);
|
|
69
|
+
if (probe.primeMany)
|
|
70
|
+
await probe.primeMany(contentDemands);
|
|
71
|
+
else
|
|
72
|
+
await Promise.all(contentDemands.map((row) => probe.prime?.(row.anchorSha, [...row.paths], row.evalPath)));
|
|
73
|
+
await anchors.prime?.(plans.flatMap((plan) => plan.rows.map((row) => ({ sinceSha: row.reading.codeSha, entries: row.axis.entries }))));
|
|
74
|
+
// the primes above only RECORDED which eval.md blocks the assemble step will compare; one batched pair of
|
|
75
|
+
// children answers the whole read's worth, the same shape the anchor prime above already has.
|
|
76
|
+
await probe.primeBlocks?.();
|
|
77
|
+
return plans.map((plan) => assembleTimeline(plan.id, plan.ynode, plan.rows, plan.retractions, plan.oks, {
|
|
78
|
+
idx, scidx, tracks, probe, anchors,
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
export async function evalTimeline(id, ctx) {
|
|
82
|
+
return (await evalTimelines([id], ctx))[0];
|
|
83
|
+
}
|
|
84
|
+
function assembleTimeline(id, ynode, rows, retractions, oks, { idx, scidx, tracks, probe, anchors, order }) {
|
|
85
|
+
if (!ynode)
|
|
86
|
+
return { node: id, hasEvalFile: false, scenarios: [], readings: [], retractions: [], dangling: [] };
|
|
87
|
+
const byName = new Map(ynode.scenarios.map((s) => [s.name, s]));
|
|
88
|
+
const remarksFor = (scenario) => tracks.get(trackKey(id, scenario))?.remarks ?? [];
|
|
89
|
+
const threadFor = (scenario) => tracks.get(trackKey(id, scenario))?.thread;
|
|
90
|
+
const scenarios = ynode.scenarios.map((s) => ({
|
|
91
|
+
name: s.name, expected: s.expected,
|
|
92
|
+
...(s.tags?.length ? { tags: s.tags } : {}), ...(s.test ? { test: s.test } : {}),
|
|
93
|
+
...(s.code?.length ? { code: s.code } : {}),
|
|
94
|
+
}));
|
|
95
|
+
const readings = [];
|
|
96
|
+
for (const { reading: r, axis } of rows) {
|
|
97
|
+
const sc = byName.get(r.scenario);
|
|
98
|
+
const axes = order ? [] : staleAxes(r, axis.entries, ynode.evalPath, idx, scidx, remarksFor(r.scenario).map((rm) => ({ resolved: !!rm.resolved, resolvedAt: rm.resolvedAt })), probe, sc, anchors);
|
|
99
|
+
const drift = !order && axes.includes('code') ? codeDrift(idx, r.codeSha, axis.entries, probe) : [];
|
|
100
|
+
const evidence = evidenceOf(r).map((e) => ({ hash: e.hash, kind: e.kind, state: hasBlob(e.hash) ? 'present' : 'miss' }));
|
|
101
|
+
const primary = evidence.find((e) => e.kind === 'video') ?? evidence[0];
|
|
102
|
+
const okRow = humanOkFor(oks, r.scenario, r.ts);
|
|
103
|
+
readings.push({
|
|
104
|
+
scenario: r.scenario,
|
|
105
|
+
expected: byName.get(r.scenario)?.expected ?? '',
|
|
106
|
+
codeSha: r.codeSha,
|
|
107
|
+
...(evidence.length ? { evidence } : {}),
|
|
108
|
+
blob: primary?.hash ?? null,
|
|
109
|
+
...(primary ? { blobKind: primary.kind } : {}),
|
|
110
|
+
...(r.timelineBlob ? { timelineBlob: r.timelineBlob } : {}),
|
|
111
|
+
...(r.evaluator ? { evaluator: r.evaluator } : {}),
|
|
112
|
+
...(r.by ? { by: r.by } : {}),
|
|
113
|
+
...(r.verdict ? { verdict: r.verdict } : {}),
|
|
114
|
+
ts: r.ts,
|
|
115
|
+
fresh: !order && axes.length === 0,
|
|
116
|
+
staleAxes: axes,
|
|
117
|
+
...(order ? { freshnessDeferred: true } : {}),
|
|
118
|
+
...(drift.length ? { codeDrift: drift } : {}),
|
|
119
|
+
blobState: primary ? primary.state : 'none',
|
|
120
|
+
...(threadFor(r.scenario) ? { thread: threadFor(r.scenario) } : {}),
|
|
121
|
+
...(okRow ? { humanOk: { by: okRow.by, ts: okRow.ts } } : {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
readings.reverse();
|
|
125
|
+
const declared = new Set(ynode.scenarios.map((s) => s.name));
|
|
126
|
+
const dangling = [];
|
|
127
|
+
for (const [, track] of tracks) {
|
|
128
|
+
if (track.node !== id || !track.remarks.length)
|
|
129
|
+
continue;
|
|
130
|
+
const hosts = readings.filter((r) => r.scenario === track.scenario);
|
|
131
|
+
if (!hosts.length) {
|
|
132
|
+
if (!declared.has(track.scenario)) {
|
|
133
|
+
dangling.push({
|
|
134
|
+
scenario: track.scenario, threadId: track.threadId, thread: track.thread,
|
|
135
|
+
remarks: track.remarks.map((rm) => toRemarkView(rm, track.threadId, true)),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const latest = hosts[0];
|
|
141
|
+
for (const rm of track.remarks) {
|
|
142
|
+
const target = hosts.find((r) => r.codeSha === rm.targetCodeSha);
|
|
143
|
+
const host = target ?? latest;
|
|
144
|
+
(host.remarks ??= []).push(toRemarkView(rm, track.threadId, !target));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { node: id, hasEvalFile: true, scenarios, readings, retractions: [...retractions].reverse(), dangling };
|
|
148
|
+
}
|
|
149
|
+
const HEX64 = /^[0-9a-f]{64}$/;
|
|
150
|
+
export function readBlobByHash(hash, dir) {
|
|
151
|
+
if (!HEX64.test(hash))
|
|
152
|
+
return { ok: false, reason: 'invalid', message: 'bad evidence hash' };
|
|
153
|
+
const bytes = getBlob(hash, dir); // undefined dir → the live cache (cache.ts default); a temp dir in tests
|
|
154
|
+
if (!bytes)
|
|
155
|
+
return { ok: false, reason: 'miss', message: MISS_BLOB };
|
|
156
|
+
return { ok: true, bytes, mime: sniffBlobMime(bytes) };
|
|
157
|
+
}
|
|
158
|
+
export function sniffBlobMime(b) {
|
|
159
|
+
if (b.length >= 4 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
|
|
160
|
+
return 'image/png';
|
|
161
|
+
if (b.length >= 3 && b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff)
|
|
162
|
+
return 'image/jpeg';
|
|
163
|
+
if (b.length >= 4 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46)
|
|
164
|
+
return 'image/gif';
|
|
165
|
+
// WebM/Matroska begin with the EBML magic 1A 45 DF A3; disambiguate from a RIFF/WEBP image above.
|
|
166
|
+
if (b.length >= 4 && b[0] === 0x1a && b[1] === 0x45 && b[2] === 0xdf && b[3] === 0xa3)
|
|
167
|
+
return 'video/webm';
|
|
168
|
+
// ISO-BMFF (MP4/MOV): a `ftyp` box type at bytes 4..8, after its 4-byte size.
|
|
169
|
+
if (b.length >= 12 && b.toString('ascii', 4, 8) === 'ftyp')
|
|
170
|
+
return 'video/mp4';
|
|
171
|
+
if (b.length >= 12 && b.toString('ascii', 0, 4) === 'RIFF' && b.toString('ascii', 8, 12) === 'WEBP')
|
|
172
|
+
return 'image/webp';
|
|
173
|
+
if (b.length && !b.includes(0))
|
|
174
|
+
return isJsonBlob(b) ? 'application/json' : 'text/plain; charset=utf-8';
|
|
175
|
+
return 'application/octet-stream';
|
|
176
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Reading } from './sidecar.js';
|
|
2
|
+
export type FileResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
reading: Reading;
|
|
5
|
+
} | {
|
|
6
|
+
ok: false;
|
|
7
|
+
error: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function fileHumanReading(nodeId: string, input: {
|
|
10
|
+
scenario: string;
|
|
11
|
+
status: 'pass' | 'fail';
|
|
12
|
+
note?: string;
|
|
13
|
+
transcript?: string;
|
|
14
|
+
by?: string;
|
|
15
|
+
}): FileResult;
|
|
16
|
+
export declare function evalReadingFiler(nodeId: string, scenario: string, root?: string): string | null;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { repoRoot, headSha } from '@spexcode/spec-core';
|
|
2
|
+
import { evalNodes, resolveEvalNode, scenarioHash } from './scenarios.js';
|
|
3
|
+
import { appendReading, readReadings, isJsonBlob } from './sidecar.js';
|
|
4
|
+
import { putBlob } from './cache.js';
|
|
5
|
+
export function fileHumanReading(nodeId, input) {
|
|
6
|
+
const root = repoRoot();
|
|
7
|
+
const res = resolveEvalNode(evalNodes(root), nodeId);
|
|
8
|
+
if (!res.ok)
|
|
9
|
+
return { ok: false, error: res.error };
|
|
10
|
+
const node = res.node;
|
|
11
|
+
const sc = node.scenarios.find((s) => s.name === input.scenario);
|
|
12
|
+
if (!sc)
|
|
13
|
+
return { ok: false, error: `'${nodeId}' has no scenario '${input.scenario}'` };
|
|
14
|
+
if (input.status !== 'pass' && input.status !== 'fail')
|
|
15
|
+
return { ok: false, error: 'status must be pass or fail' };
|
|
16
|
+
const buf = input.transcript ? Buffer.from(input.transcript) : null;
|
|
17
|
+
const blob = buf ? putBlob(buf) : null;
|
|
18
|
+
const reading = {
|
|
19
|
+
scenario: sc.name,
|
|
20
|
+
codeSha: headSha(root),
|
|
21
|
+
scenarioHash: scenarioHash(sc),
|
|
22
|
+
...(blob ? { evidence: [{ hash: blob, kind: (buf && isJsonBlob(buf) ? 'data' : 'transcript') }] } : {}),
|
|
23
|
+
...(input.by ? { by: input.by } : {}),
|
|
24
|
+
verdict: { status: input.status, ...(input.note ? { note: input.note } : {}) },
|
|
25
|
+
ts: new Date().toISOString(),
|
|
26
|
+
};
|
|
27
|
+
appendReading(node.sidecarPath, reading);
|
|
28
|
+
return { ok: true, reading };
|
|
29
|
+
}
|
|
30
|
+
export function evalReadingFiler(nodeId, scenario, root = repoRoot()) {
|
|
31
|
+
const res = resolveEvalNode(evalNodes(root), nodeId);
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
return null;
|
|
34
|
+
const forScenario = readReadings(res.node.sidecarPath).filter((r) => r.scenario === scenario);
|
|
35
|
+
return forScenario.length ? forScenario[forScenario.length - 1].by ?? null : null;
|
|
36
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type DriftIndex } from '@spexcode/spec-core';
|
|
2
|
+
import { type RelationEntry } from '@spexcode/spec-core';
|
|
3
|
+
import type { Reading } from './sidecar.js';
|
|
4
|
+
import { type Scenario, type ScenarioCodeAxisSource } from './scenarios.js';
|
|
5
|
+
import { type ScenarioIndex } from './scenariofresh.js';
|
|
6
|
+
export type StaleAxis = 'code' | 'scenario' | 'remark' | 'anchor';
|
|
7
|
+
export type ContentProbeDemand = {
|
|
8
|
+
anchorSha: string;
|
|
9
|
+
paths: readonly string[];
|
|
10
|
+
evalPath: string;
|
|
11
|
+
};
|
|
12
|
+
export type ContentProbe = {
|
|
13
|
+
changed(anchorSha: string, path: string): boolean | null;
|
|
14
|
+
canTestify(anchorSha: string): boolean;
|
|
15
|
+
scenarioDiffers(anchorSha: string, evalPath: string, scenario: string): boolean;
|
|
16
|
+
inAnchorPast(anchorSha: string, commit: string): boolean;
|
|
17
|
+
prime?(anchorSha: string, paths: string[], evalPath: string): Promise<void>;
|
|
18
|
+
primeMany?(demands: readonly ContentProbeDemand[]): Promise<void>;
|
|
19
|
+
primeBlocks?(): Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
export declare function freshnessCacheSize(root?: string): number;
|
|
22
|
+
export declare function anchorVerdictCacheSize(root?: string): number;
|
|
23
|
+
export declare function contentProbeFor(root: string): ContentProbe;
|
|
24
|
+
export type AnchorProbe = {
|
|
25
|
+
hit(sinceSha: string, path: string, selectors: readonly string[]): boolean | null;
|
|
26
|
+
prime?(demands: readonly AnchorDemand[]): Promise<void>;
|
|
27
|
+
};
|
|
28
|
+
export type AnchorDemand = {
|
|
29
|
+
sinceSha: string;
|
|
30
|
+
entries: readonly RelationEntry[];
|
|
31
|
+
};
|
|
32
|
+
export declare function anchorProbeFor(root: string, idx: DriftIndex): AnchorProbe;
|
|
33
|
+
export declare function anchorProblems(root: string, entries: readonly RelationEntry[]): string[];
|
|
34
|
+
export type RemarkSignal = {
|
|
35
|
+
resolved: boolean;
|
|
36
|
+
resolvedAt?: string;
|
|
37
|
+
};
|
|
38
|
+
export declare function remarkStale(reading: {
|
|
39
|
+
ts: string;
|
|
40
|
+
}, remarks: RemarkSignal[]): boolean;
|
|
41
|
+
export declare function changedSince(idx: DriftIndex, sinceSha: string, path: string, probe?: ContentProbe): boolean;
|
|
42
|
+
export declare function codeDrift(idx: DriftIndex, sinceSha: string, codeAxis: ScenarioCodeAxisSource, probe?: ContentProbe): {
|
|
43
|
+
file: string;
|
|
44
|
+
behind: number;
|
|
45
|
+
}[];
|
|
46
|
+
export declare function staleAxes(reading: Reading, codeAxis: ScenarioCodeAxisSource, evalPath: string, didx: DriftIndex, scIdx: ScenarioIndex, remarks?: RemarkSignal[], probe?: ContentProbe, current?: Scenario, // the scenario's CURRENT declaration (undefined = gone from eval.md) — the hash compare's other side
|
|
47
|
+
anchors?: AnchorProbe): StaleAxis[];
|
|
48
|
+
export declare function isStale(reading: Reading, codeAxis: ScenarioCodeAxisSource, evalPath: string, didx: DriftIndex, scIdx: ScenarioIndex, remarks?: RemarkSignal[], probe?: ContentProbe, current?: Scenario, anchors?: AnchorProbe): boolean;
|