@zigrivers/scaffold 3.25.0 → 3.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -0
- package/dist/cli/commands/complete.d.ts.map +1 -1
- package/dist/cli/commands/complete.js +6 -13
- package/dist/cli/commands/complete.js.map +1 -1
- package/dist/cli/commands/complete.test.js +18 -0
- package/dist/cli/commands/complete.test.js.map +1 -1
- package/dist/cli/commands/knowledge.test.js +4 -4
- package/dist/cli/commands/knowledge.test.js.map +1 -1
- package/dist/cli/commands/observe.d.ts +58 -0
- package/dist/cli/commands/observe.d.ts.map +1 -0
- package/dist/cli/commands/observe.js +430 -0
- package/dist/cli/commands/observe.js.map +1 -0
- package/dist/cli/commands/observe.test.d.ts +2 -0
- package/dist/cli/commands/observe.test.d.ts.map +1 -0
- package/dist/cli/commands/observe.test.js +452 -0
- package/dist/cli/commands/observe.test.js.map +1 -0
- package/dist/cli/commands/run.js +3 -3
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +1 -1
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapters/codex.d.ts.map +1 -1
- package/dist/core/adapters/codex.js +105 -2
- package/dist/core/adapters/codex.js.map +1 -1
- package/dist/core/adapters/codex.test.js +82 -0
- package/dist/core/adapters/codex.test.js.map +1 -1
- package/dist/observability/adapters/audit-history.d.ts +17 -0
- package/dist/observability/adapters/audit-history.d.ts.map +1 -0
- package/dist/observability/adapters/audit-history.js +113 -0
- package/dist/observability/adapters/audit-history.js.map +1 -0
- package/dist/observability/adapters/audit-history.test.d.ts +2 -0
- package/dist/observability/adapters/audit-history.test.d.ts.map +1 -0
- package/dist/observability/adapters/audit-history.test.js +137 -0
- package/dist/observability/adapters/audit-history.test.js.map +1 -0
- package/dist/observability/adapters/beads.d.ts +9 -0
- package/dist/observability/adapters/beads.d.ts.map +1 -0
- package/dist/observability/adapters/beads.js +40 -0
- package/dist/observability/adapters/beads.js.map +1 -0
- package/dist/observability/adapters/beads.test.d.ts +2 -0
- package/dist/observability/adapters/beads.test.d.ts.map +1 -0
- package/dist/observability/adapters/beads.test.js +25 -0
- package/dist/observability/adapters/beads.test.js.map +1 -0
- package/dist/observability/adapters/gh.d.ts +27 -0
- package/dist/observability/adapters/gh.d.ts.map +1 -0
- package/dist/observability/adapters/gh.js +118 -0
- package/dist/observability/adapters/gh.js.map +1 -0
- package/dist/observability/adapters/gh.test.d.ts +2 -0
- package/dist/observability/adapters/gh.test.d.ts.map +1 -0
- package/dist/observability/adapters/gh.test.js +79 -0
- package/dist/observability/adapters/gh.test.js.map +1 -0
- package/dist/observability/adapters/git.d.ts +24 -0
- package/dist/observability/adapters/git.d.ts.map +1 -0
- package/dist/observability/adapters/git.js +110 -0
- package/dist/observability/adapters/git.js.map +1 -0
- package/dist/observability/adapters/git.test.d.ts +2 -0
- package/dist/observability/adapters/git.test.d.ts.map +1 -0
- package/dist/observability/adapters/git.test.js +66 -0
- package/dist/observability/adapters/git.test.js.map +1 -0
- package/dist/observability/adapters/mmr.d.ts +15 -0
- package/dist/observability/adapters/mmr.d.ts.map +1 -0
- package/dist/observability/adapters/mmr.js +85 -0
- package/dist/observability/adapters/mmr.js.map +1 -0
- package/dist/observability/adapters/mmr.test.d.ts +2 -0
- package/dist/observability/adapters/mmr.test.d.ts.map +1 -0
- package/dist/observability/adapters/mmr.test.js +55 -0
- package/dist/observability/adapters/mmr.test.js.map +1 -0
- package/dist/observability/adapters/pipeline-docs.d.ts +8 -0
- package/dist/observability/adapters/pipeline-docs.d.ts.map +1 -0
- package/dist/observability/adapters/pipeline-docs.js +68 -0
- package/dist/observability/adapters/pipeline-docs.js.map +1 -0
- package/dist/observability/adapters/pipeline-docs.test.d.ts +2 -0
- package/dist/observability/adapters/pipeline-docs.test.d.ts.map +1 -0
- package/dist/observability/adapters/pipeline-docs.test.js +58 -0
- package/dist/observability/adapters/pipeline-docs.test.js.map +1 -0
- package/dist/observability/adapters/state.d.ts +21 -0
- package/dist/observability/adapters/state.d.ts.map +1 -0
- package/dist/observability/adapters/state.js +87 -0
- package/dist/observability/adapters/state.js.map +1 -0
- package/dist/observability/adapters/state.test.d.ts +2 -0
- package/dist/observability/adapters/state.test.d.ts.map +1 -0
- package/dist/observability/adapters/state.test.js +92 -0
- package/dist/observability/adapters/state.test.js.map +1 -0
- package/dist/observability/adapters/tests.d.ts +20 -0
- package/dist/observability/adapters/tests.d.ts.map +1 -0
- package/dist/observability/adapters/tests.js +52 -0
- package/dist/observability/adapters/tests.js.map +1 -0
- package/dist/observability/adapters/tests.test.d.ts +2 -0
- package/dist/observability/adapters/tests.test.d.ts.map +1 -0
- package/dist/observability/adapters/tests.test.js +66 -0
- package/dist/observability/adapters/tests.test.js.map +1 -0
- package/dist/observability/adapters/types.d.ts +7 -0
- package/dist/observability/adapters/types.d.ts.map +1 -0
- package/dist/observability/adapters/types.js +2 -0
- package/dist/observability/adapters/types.js.map +1 -0
- package/dist/observability/checks/lens-a-tdd.d.ts +3 -0
- package/dist/observability/checks/lens-a-tdd.d.ts.map +1 -0
- package/dist/observability/checks/lens-a-tdd.js +34 -0
- package/dist/observability/checks/lens-a-tdd.js.map +1 -0
- package/dist/observability/checks/lens-a-tdd.test.d.ts +2 -0
- package/dist/observability/checks/lens-a-tdd.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-a-tdd.test.js +62 -0
- package/dist/observability/checks/lens-a-tdd.test.js.map +1 -0
- package/dist/observability/checks/lens-b-ac-coverage.d.ts +3 -0
- package/dist/observability/checks/lens-b-ac-coverage.d.ts.map +1 -0
- package/dist/observability/checks/lens-b-ac-coverage.js +63 -0
- package/dist/observability/checks/lens-b-ac-coverage.js.map +1 -0
- package/dist/observability/checks/lens-b-ac-coverage.test.d.ts +2 -0
- package/dist/observability/checks/lens-b-ac-coverage.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-b-ac-coverage.test.js +59 -0
- package/dist/observability/checks/lens-b-ac-coverage.test.js.map +1 -0
- package/dist/observability/checks/lens-c-standards.d.ts +3 -0
- package/dist/observability/checks/lens-c-standards.d.ts.map +1 -0
- package/dist/observability/checks/lens-c-standards.js +104 -0
- package/dist/observability/checks/lens-c-standards.js.map +1 -0
- package/dist/observability/checks/lens-c-standards.test.d.ts +2 -0
- package/dist/observability/checks/lens-c-standards.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-c-standards.test.js +79 -0
- package/dist/observability/checks/lens-c-standards.test.js.map +1 -0
- package/dist/observability/checks/lens-d-stack.d.ts +3 -0
- package/dist/observability/checks/lens-d-stack.d.ts.map +1 -0
- package/dist/observability/checks/lens-d-stack.js +108 -0
- package/dist/observability/checks/lens-d-stack.js.map +1 -0
- package/dist/observability/checks/lens-d-stack.test.d.ts +2 -0
- package/dist/observability/checks/lens-d-stack.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-d-stack.test.js +60 -0
- package/dist/observability/checks/lens-d-stack.test.js.map +1 -0
- package/dist/observability/checks/lens-e-design.d.ts +3 -0
- package/dist/observability/checks/lens-e-design.d.ts.map +1 -0
- package/dist/observability/checks/lens-e-design.js +76 -0
- package/dist/observability/checks/lens-e-design.js.map +1 -0
- package/dist/observability/checks/lens-e-design.test.d.ts +2 -0
- package/dist/observability/checks/lens-e-design.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-e-design.test.js +85 -0
- package/dist/observability/checks/lens-e-design.test.js.map +1 -0
- package/dist/observability/checks/lens-f-scope.d.ts +3 -0
- package/dist/observability/checks/lens-f-scope.d.ts.map +1 -0
- package/dist/observability/checks/lens-f-scope.js +92 -0
- package/dist/observability/checks/lens-f-scope.js.map +1 -0
- package/dist/observability/checks/lens-f-scope.test.d.ts +2 -0
- package/dist/observability/checks/lens-f-scope.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-f-scope.test.js +63 -0
- package/dist/observability/checks/lens-f-scope.test.js.map +1 -0
- package/dist/observability/checks/lens-g-decisions.d.ts +3 -0
- package/dist/observability/checks/lens-g-decisions.d.ts.map +1 -0
- package/dist/observability/checks/lens-g-decisions.js +139 -0
- package/dist/observability/checks/lens-g-decisions.js.map +1 -0
- package/dist/observability/checks/lens-g-decisions.test.d.ts +2 -0
- package/dist/observability/checks/lens-g-decisions.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-g-decisions.test.js +118 -0
- package/dist/observability/checks/lens-g-decisions.test.js.map +1 -0
- package/dist/observability/checks/lens-h-cross-doc.d.ts +3 -0
- package/dist/observability/checks/lens-h-cross-doc.d.ts.map +1 -0
- package/dist/observability/checks/lens-h-cross-doc.js +322 -0
- package/dist/observability/checks/lens-h-cross-doc.js.map +1 -0
- package/dist/observability/checks/lens-h-cross-doc.test.d.ts +2 -0
- package/dist/observability/checks/lens-h-cross-doc.test.d.ts.map +1 -0
- package/dist/observability/checks/lens-h-cross-doc.test.js +174 -0
- package/dist/observability/checks/lens-h-cross-doc.test.js.map +1 -0
- package/dist/observability/engine/abort-snapshot.d.ts +10 -0
- package/dist/observability/engine/abort-snapshot.d.ts.map +1 -0
- package/dist/observability/engine/abort-snapshot.js +36 -0
- package/dist/observability/engine/abort-snapshot.js.map +1 -0
- package/dist/observability/engine/abort-snapshot.test.d.ts +2 -0
- package/dist/observability/engine/abort-snapshot.test.d.ts.map +1 -0
- package/dist/observability/engine/abort-snapshot.test.js +66 -0
- package/dist/observability/engine/abort-snapshot.test.js.map +1 -0
- package/dist/observability/engine/api.d.ts +24 -0
- package/dist/observability/engine/api.d.ts.map +1 -0
- package/dist/observability/engine/api.js +203 -0
- package/dist/observability/engine/api.js.map +1 -0
- package/dist/observability/engine/api.test.d.ts +2 -0
- package/dist/observability/engine/api.test.d.ts.map +1 -0
- package/dist/observability/engine/api.test.js +174 -0
- package/dist/observability/engine/api.test.js.map +1 -0
- package/dist/observability/engine/checks/findings-aggregator.d.ts +6 -0
- package/dist/observability/engine/checks/findings-aggregator.d.ts.map +1 -0
- package/dist/observability/engine/checks/findings-aggregator.js +56 -0
- package/dist/observability/engine/checks/findings-aggregator.js.map +1 -0
- package/dist/observability/engine/checks/findings-aggregator.test.d.ts +2 -0
- package/dist/observability/engine/checks/findings-aggregator.test.d.ts.map +1 -0
- package/dist/observability/engine/checks/findings-aggregator.test.js +63 -0
- package/dist/observability/engine/checks/findings-aggregator.test.js.map +1 -0
- package/dist/observability/engine/checks/fix-threshold.d.ts +3 -0
- package/dist/observability/engine/checks/fix-threshold.d.ts.map +1 -0
- package/dist/observability/engine/checks/fix-threshold.js +24 -0
- package/dist/observability/engine/checks/fix-threshold.js.map +1 -0
- package/dist/observability/engine/checks/fix-threshold.test.d.ts +2 -0
- package/dist/observability/engine/checks/fix-threshold.test.d.ts.map +1 -0
- package/dist/observability/engine/checks/fix-threshold.test.js +29 -0
- package/dist/observability/engine/checks/fix-threshold.test.js.map +1 -0
- package/dist/observability/engine/checks/observability-config.d.ts +64 -0
- package/dist/observability/engine/checks/observability-config.d.ts.map +1 -0
- package/dist/observability/engine/checks/observability-config.js +56 -0
- package/dist/observability/engine/checks/observability-config.js.map +1 -0
- package/dist/observability/engine/checks/observability-config.test.d.ts +2 -0
- package/dist/observability/engine/checks/observability-config.test.d.ts.map +1 -0
- package/dist/observability/engine/checks/observability-config.test.js +39 -0
- package/dist/observability/engine/checks/observability-config.test.js.map +1 -0
- package/dist/observability/engine/checks/registry.d.ts +19 -0
- package/dist/observability/engine/checks/registry.d.ts.map +1 -0
- package/dist/observability/engine/checks/registry.js +44 -0
- package/dist/observability/engine/checks/registry.js.map +1 -0
- package/dist/observability/engine/checks/registry.test.d.ts +2 -0
- package/dist/observability/engine/checks/registry.test.d.ts.map +1 -0
- package/dist/observability/engine/checks/registry.test.js +23 -0
- package/dist/observability/engine/checks/registry.test.js.map +1 -0
- package/dist/observability/engine/checks/runner.d.ts +23 -0
- package/dist/observability/engine/checks/runner.d.ts.map +1 -0
- package/dist/observability/engine/checks/runner.js +66 -0
- package/dist/observability/engine/checks/runner.js.map +1 -0
- package/dist/observability/engine/checks/runner.test.d.ts +2 -0
- package/dist/observability/engine/checks/runner.test.d.ts.map +1 -0
- package/dist/observability/engine/checks/runner.test.js +95 -0
- package/dist/observability/engine/checks/runner.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/component-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/component-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/component-parser.js +42 -0
- package/dist/observability/engine/doc-graph/component-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/component-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/component-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/component-parser.test.js +40 -0
- package/dist/observability/engine/doc-graph/component-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/component-use-detector.d.ts +8 -0
- package/dist/observability/engine/doc-graph/component-use-detector.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/component-use-detector.js +62 -0
- package/dist/observability/engine/doc-graph/component-use-detector.js.map +1 -0
- package/dist/observability/engine/doc-graph/component-use-detector.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/component-use-detector.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/component-use-detector.test.js +38 -0
- package/dist/observability/engine/doc-graph/component-use-detector.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/decision-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/decision-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/decision-parser.js +60 -0
- package/dist/observability/engine/doc-graph/decision-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/decision-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/decision-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/decision-parser.test.js +65 -0
- package/dist/observability/engine/doc-graph/decision-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/design-props.d.ts +9 -0
- package/dist/observability/engine/doc-graph/design-props.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/design-props.js +50 -0
- package/dist/observability/engine/doc-graph/design-props.js.map +1 -0
- package/dist/observability/engine/doc-graph/edge-builder.d.ts +28 -0
- package/dist/observability/engine/doc-graph/edge-builder.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/edge-builder.js +75 -0
- package/dist/observability/engine/doc-graph/edge-builder.js.map +1 -0
- package/dist/observability/engine/doc-graph/edge-builder.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/edge-builder.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/edge-builder.test.js +124 -0
- package/dist/observability/engine/doc-graph/edge-builder.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/feature-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/feature-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/feature-parser.js +78 -0
- package/dist/observability/engine/doc-graph/feature-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/feature-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/feature-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/feature-parser.test.js +51 -0
- package/dist/observability/engine/doc-graph/feature-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/index.d.ts +3 -0
- package/dist/observability/engine/doc-graph/index.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/index.js +138 -0
- package/dist/observability/engine/doc-graph/index.js.map +1 -0
- package/dist/observability/engine/doc-graph/index.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/index.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/index.test.js +82 -0
- package/dist/observability/engine/doc-graph/index.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/parse-markdown.d.ts +15 -0
- package/dist/observability/engine/doc-graph/parse-markdown.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/parse-markdown.js +79 -0
- package/dist/observability/engine/doc-graph/parse-markdown.js.map +1 -0
- package/dist/observability/engine/doc-graph/parse-markdown.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/parse-markdown.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/parse-markdown.test.js +50 -0
- package/dist/observability/engine/doc-graph/parse-markdown.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.js +38 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.test.js +38 -0
- package/dist/observability/engine/doc-graph/plan-task-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.js +40 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.test.js +31 -0
- package/dist/observability/engine/doc-graph/playbook-task-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/rule-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/rule-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/rule-parser.js +65 -0
- package/dist/observability/engine/doc-graph/rule-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/rule-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/rule-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/rule-parser.test.js +44 -0
- package/dist/observability/engine/doc-graph/rule-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/story-parser.d.ts +8 -0
- package/dist/observability/engine/doc-graph/story-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/story-parser.js +109 -0
- package/dist/observability/engine/doc-graph/story-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/story-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/story-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/story-parser.test.js +66 -0
- package/dist/observability/engine/doc-graph/story-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/test-discovery.d.ts +3 -0
- package/dist/observability/engine/doc-graph/test-discovery.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/test-discovery.js +122 -0
- package/dist/observability/engine/doc-graph/test-discovery.js.map +1 -0
- package/dist/observability/engine/doc-graph/test-discovery.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/test-discovery.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/test-discovery.test.js +39 -0
- package/dist/observability/engine/doc-graph/test-discovery.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/token-parser.d.ts +3 -0
- package/dist/observability/engine/doc-graph/token-parser.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/token-parser.js +67 -0
- package/dist/observability/engine/doc-graph/token-parser.js.map +1 -0
- package/dist/observability/engine/doc-graph/token-parser.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/token-parser.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/token-parser.test.js +39 -0
- package/dist/observability/engine/doc-graph/token-parser.test.js.map +1 -0
- package/dist/observability/engine/doc-graph/token-use-detector.d.ts +10 -0
- package/dist/observability/engine/doc-graph/token-use-detector.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/token-use-detector.js +105 -0
- package/dist/observability/engine/doc-graph/token-use-detector.js.map +1 -0
- package/dist/observability/engine/doc-graph/token-use-detector.test.d.ts +2 -0
- package/dist/observability/engine/doc-graph/token-use-detector.test.d.ts.map +1 -0
- package/dist/observability/engine/doc-graph/token-use-detector.test.js +60 -0
- package/dist/observability/engine/doc-graph/token-use-detector.test.js.map +1 -0
- package/dist/observability/engine/event-schemas.d.ts +12 -0
- package/dist/observability/engine/event-schemas.d.ts.map +1 -0
- package/dist/observability/engine/event-schemas.js +182 -0
- package/dist/observability/engine/event-schemas.js.map +1 -0
- package/dist/observability/engine/event-schemas.test.d.ts +2 -0
- package/dist/observability/engine/event-schemas.test.d.ts.map +1 -0
- package/dist/observability/engine/event-schemas.test.js +200 -0
- package/dist/observability/engine/event-schemas.test.js.map +1 -0
- package/dist/observability/engine/fix-agent-dispatcher.d.ts +19 -0
- package/dist/observability/engine/fix-agent-dispatcher.d.ts.map +1 -0
- package/dist/observability/engine/fix-agent-dispatcher.js +88 -0
- package/dist/observability/engine/fix-agent-dispatcher.js.map +1 -0
- package/dist/observability/engine/fix-agent-dispatcher.test.d.ts +2 -0
- package/dist/observability/engine/fix-agent-dispatcher.test.d.ts.map +1 -0
- package/dist/observability/engine/fix-agent-dispatcher.test.js +54 -0
- package/dist/observability/engine/fix-agent-dispatcher.test.js.map +1 -0
- package/dist/observability/engine/fix-flow.d.ts +30 -0
- package/dist/observability/engine/fix-flow.d.ts.map +1 -0
- package/dist/observability/engine/fix-flow.js +105 -0
- package/dist/observability/engine/fix-flow.js.map +1 -0
- package/dist/observability/engine/fix-flow.test.d.ts +2 -0
- package/dist/observability/engine/fix-flow.test.d.ts.map +1 -0
- package/dist/observability/engine/fix-flow.test.js +127 -0
- package/dist/observability/engine/fix-flow.test.js.map +1 -0
- package/dist/observability/engine/fix-plan.d.ts +3 -0
- package/dist/observability/engine/fix-plan.d.ts.map +1 -0
- package/dist/observability/engine/fix-plan.js +13 -0
- package/dist/observability/engine/fix-plan.js.map +1 -0
- package/dist/observability/engine/fix-plan.test.d.ts +2 -0
- package/dist/observability/engine/fix-plan.test.d.ts.map +1 -0
- package/dist/observability/engine/fix-plan.test.js +44 -0
- package/dist/observability/engine/fix-plan.test.js.map +1 -0
- package/dist/observability/engine/harvester.d.ts +16 -0
- package/dist/observability/engine/harvester.d.ts.map +1 -0
- package/dist/observability/engine/harvester.js +106 -0
- package/dist/observability/engine/harvester.js.map +1 -0
- package/dist/observability/engine/harvester.test.d.ts +2 -0
- package/dist/observability/engine/harvester.test.d.ts.map +1 -0
- package/dist/observability/engine/harvester.test.js +99 -0
- package/dist/observability/engine/harvester.test.js.map +1 -0
- package/dist/observability/engine/identity.d.ts +6 -0
- package/dist/observability/engine/identity.d.ts.map +1 -0
- package/dist/observability/engine/identity.js +50 -0
- package/dist/observability/engine/identity.js.map +1 -0
- package/dist/observability/engine/identity.test.d.ts +2 -0
- package/dist/observability/engine/identity.test.d.ts.map +1 -0
- package/dist/observability/engine/identity.test.js +29 -0
- package/dist/observability/engine/identity.test.js.map +1 -0
- package/dist/observability/engine/ledger-writer.d.ts +10 -0
- package/dist/observability/engine/ledger-writer.d.ts.map +1 -0
- package/dist/observability/engine/ledger-writer.js +50 -0
- package/dist/observability/engine/ledger-writer.js.map +1 -0
- package/dist/observability/engine/ledger-writer.test.d.ts +2 -0
- package/dist/observability/engine/ledger-writer.test.d.ts.map +1 -0
- package/dist/observability/engine/ledger-writer.test.js +72 -0
- package/dist/observability/engine/ledger-writer.test.js.map +1 -0
- package/dist/observability/engine/llm-dispatcher.d.ts +16 -0
- package/dist/observability/engine/llm-dispatcher.d.ts.map +1 -0
- package/dist/observability/engine/llm-dispatcher.js +183 -0
- package/dist/observability/engine/llm-dispatcher.js.map +1 -0
- package/dist/observability/engine/llm-dispatcher.test.d.ts +2 -0
- package/dist/observability/engine/llm-dispatcher.test.d.ts.map +1 -0
- package/dist/observability/engine/llm-dispatcher.test.js +109 -0
- package/dist/observability/engine/llm-dispatcher.test.js.map +1 -0
- package/dist/observability/engine/phase-audit.d.ts +22 -0
- package/dist/observability/engine/phase-audit.d.ts.map +1 -0
- package/dist/observability/engine/phase-audit.js +98 -0
- package/dist/observability/engine/phase-audit.js.map +1 -0
- package/dist/observability/engine/phase-audit.test.d.ts +2 -0
- package/dist/observability/engine/phase-audit.test.d.ts.map +1 -0
- package/dist/observability/engine/phase-audit.test.js +82 -0
- package/dist/observability/engine/phase-audit.test.js.map +1 -0
- package/dist/observability/engine/phase-subsets.d.ts +5 -0
- package/dist/observability/engine/phase-subsets.d.ts.map +1 -0
- package/dist/observability/engine/phase-subsets.js +23 -0
- package/dist/observability/engine/phase-subsets.js.map +1 -0
- package/dist/observability/engine/phase-subsets.test.d.ts +2 -0
- package/dist/observability/engine/phase-subsets.test.d.ts.map +1 -0
- package/dist/observability/engine/phase-subsets.test.js +24 -0
- package/dist/observability/engine/phase-subsets.test.js.map +1 -0
- package/dist/observability/engine/redact.d.ts +9 -0
- package/dist/observability/engine/redact.d.ts.map +1 -0
- package/dist/observability/engine/redact.js +134 -0
- package/dist/observability/engine/redact.js.map +1 -0
- package/dist/observability/engine/redact.test.d.ts +2 -0
- package/dist/observability/engine/redact.test.d.ts.map +1 -0
- package/dist/observability/engine/redact.test.js +244 -0
- package/dist/observability/engine/redact.test.js.map +1 -0
- package/dist/observability/engine/stall.d.ts +13 -0
- package/dist/observability/engine/stall.d.ts.map +1 -0
- package/dist/observability/engine/stall.js +167 -0
- package/dist/observability/engine/stall.js.map +1 -0
- package/dist/observability/engine/stall.test.d.ts +2 -0
- package/dist/observability/engine/stall.test.d.ts.map +1 -0
- package/dist/observability/engine/stall.test.js +148 -0
- package/dist/observability/engine/stall.test.js.map +1 -0
- package/dist/observability/engine/synthesizer.d.ts +35 -0
- package/dist/observability/engine/synthesizer.d.ts.map +1 -0
- package/dist/observability/engine/synthesizer.js +298 -0
- package/dist/observability/engine/synthesizer.js.map +1 -0
- package/dist/observability/engine/synthesizer.test.d.ts +2 -0
- package/dist/observability/engine/synthesizer.test.d.ts.map +1 -0
- package/dist/observability/engine/synthesizer.test.js +183 -0
- package/dist/observability/engine/synthesizer.test.js.map +1 -0
- package/dist/observability/engine/types.d.ts +422 -0
- package/dist/observability/engine/types.d.ts.map +1 -0
- package/dist/observability/engine/types.js +3 -0
- package/dist/observability/engine/types.js.map +1 -0
- package/dist/observability/engine/types.test.d.ts +2 -0
- package/dist/observability/engine/types.test.d.ts.map +1 -0
- package/dist/observability/engine/types.test.js +16 -0
- package/dist/observability/engine/types.test.js.map +1 -0
- package/dist/observability/renderers/_lib.d.ts +7 -0
- package/dist/observability/renderers/_lib.d.ts.map +1 -0
- package/dist/observability/renderers/_lib.js +28 -0
- package/dist/observability/renderers/_lib.js.map +1 -0
- package/dist/observability/renderers/dashboard.d.ts +5 -0
- package/dist/observability/renderers/dashboard.d.ts.map +1 -0
- package/dist/observability/renderers/dashboard.js +100 -0
- package/dist/observability/renderers/dashboard.js.map +1 -0
- package/dist/observability/renderers/dashboard.test.d.ts +2 -0
- package/dist/observability/renderers/dashboard.test.d.ts.map +1 -0
- package/dist/observability/renderers/dashboard.test.js +142 -0
- package/dist/observability/renderers/dashboard.test.js.map +1 -0
- package/dist/observability/renderers/markdown.d.ts +4 -0
- package/dist/observability/renderers/markdown.d.ts.map +1 -0
- package/dist/observability/renderers/markdown.js +225 -0
- package/dist/observability/renderers/markdown.js.map +1 -0
- package/dist/observability/renderers/markdown.test.d.ts +2 -0
- package/dist/observability/renderers/markdown.test.d.ts.map +1 -0
- package/dist/observability/renderers/markdown.test.js +169 -0
- package/dist/observability/renderers/markdown.test.js.map +1 -0
- package/dist/observability/renderers/mmr-findings.d.ts +10 -0
- package/dist/observability/renderers/mmr-findings.d.ts.map +1 -0
- package/dist/observability/renderers/mmr-findings.js +21 -0
- package/dist/observability/renderers/mmr-findings.js.map +1 -0
- package/dist/observability/renderers/mmr-findings.test.d.ts +2 -0
- package/dist/observability/renderers/mmr-findings.test.d.ts.map +1 -0
- package/dist/observability/renderers/mmr-findings.test.js +86 -0
- package/dist/observability/renderers/mmr-findings.test.js.map +1 -0
- package/dist/observability/renderers/sidecar.d.ts +5 -0
- package/dist/observability/renderers/sidecar.d.ts.map +1 -0
- package/dist/observability/renderers/sidecar.js +51 -0
- package/dist/observability/renderers/sidecar.js.map +1 -0
- package/dist/observability/renderers/sidecar.test.d.ts +2 -0
- package/dist/observability/renderers/sidecar.test.d.ts.map +1 -0
- package/dist/observability/renderers/sidecar.test.js +77 -0
- package/dist/observability/renderers/sidecar.test.js.map +1 -0
- package/dist/observability/renderers/terminal.d.ts +7 -0
- package/dist/observability/renderers/terminal.d.ts.map +1 -0
- package/dist/observability/renderers/terminal.js +96 -0
- package/dist/observability/renderers/terminal.js.map +1 -0
- package/dist/observability/renderers/terminal.test.d.ts +2 -0
- package/dist/observability/renderers/terminal.test.d.ts.map +1 -0
- package/dist/observability/renderers/terminal.test.js +163 -0
- package/dist/observability/renderers/terminal.test.js.map +1 -0
- package/dist/state/state-manager.d.ts +7 -2
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +31 -2
- package/dist/state/state-manager.js.map +1 -1
- package/dist/state/state-manager.test.js +88 -3
- package/dist/state/state-manager.test.js.map +1 -1
- package/dist/types/state.d.ts +2 -0
- package/dist/types/state.d.ts.map +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface DispatchFixInput {
|
|
2
|
+
prompt: string;
|
|
3
|
+
command: string;
|
|
4
|
+
timeoutMs: number;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
export type DispatchFixResult = {
|
|
8
|
+
ok: true;
|
|
9
|
+
exit_code: 0;
|
|
10
|
+
elapsed_ms: number;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
reason: string;
|
|
14
|
+
exit_code?: number;
|
|
15
|
+
timed_out?: boolean;
|
|
16
|
+
elapsed_ms?: number;
|
|
17
|
+
};
|
|
18
|
+
export declare function dispatchFixAgent(input: DispatchFixInput): Promise<DispatchFixResult>;
|
|
19
|
+
//# sourceMappingURL=fix-agent-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-agent-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-agent-dispatcher.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAqB/F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiDpF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
function parseShell(cmd) {
|
|
3
|
+
const args = [];
|
|
4
|
+
let current = '';
|
|
5
|
+
let inSingle = false;
|
|
6
|
+
let inDouble = false;
|
|
7
|
+
for (let i = 0; i < cmd.length; i++) {
|
|
8
|
+
const ch = cmd[i];
|
|
9
|
+
if (ch === '\'' && !inDouble) {
|
|
10
|
+
inSingle = !inSingle;
|
|
11
|
+
}
|
|
12
|
+
else if (ch === '"' && !inSingle) {
|
|
13
|
+
inDouble = !inDouble;
|
|
14
|
+
}
|
|
15
|
+
else if (ch === ' ' && !inSingle && !inDouble) {
|
|
16
|
+
if (current) {
|
|
17
|
+
args.push(current);
|
|
18
|
+
current = '';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
current += ch;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (current)
|
|
26
|
+
args.push(current);
|
|
27
|
+
return args;
|
|
28
|
+
}
|
|
29
|
+
// dispatcher_command is maintainer-controlled (.scaffold/observability.yaml in the user's own repo).
|
|
30
|
+
// spawn() without shell:true limits injection to the argv array, but `sh -c "..."` is a valid config.
|
|
31
|
+
// This is intentional: the fix dispatcher is project-local, not run against untrusted third-party repos.
|
|
32
|
+
export function dispatchFixAgent(input) {
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
const started = Date.now();
|
|
35
|
+
const [bin, ...args] = parseShell(input.command);
|
|
36
|
+
let child;
|
|
37
|
+
try {
|
|
38
|
+
child = spawn(bin, args, { stdio: ['pipe', 'inherit', 'inherit'], cwd: input.cwd });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
resolve({ ok: false, reason: `spawn failed: ${err.message}` });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let resolved = false;
|
|
45
|
+
const timer = setTimeout(() => {
|
|
46
|
+
if (resolved)
|
|
47
|
+
return;
|
|
48
|
+
resolved = true;
|
|
49
|
+
try {
|
|
50
|
+
child.kill('SIGTERM');
|
|
51
|
+
}
|
|
52
|
+
catch { /* ignore */ }
|
|
53
|
+
resolve({
|
|
54
|
+
ok: false, reason: `timed out after ${input.timeoutMs}ms`,
|
|
55
|
+
timed_out: true, elapsed_ms: Date.now() - started,
|
|
56
|
+
});
|
|
57
|
+
}, input.timeoutMs);
|
|
58
|
+
child.on('error', (err) => {
|
|
59
|
+
if (resolved)
|
|
60
|
+
return;
|
|
61
|
+
resolved = true;
|
|
62
|
+
clearTimeout(timer);
|
|
63
|
+
const code = err.code ?? 'unknown';
|
|
64
|
+
resolve({ ok: false, reason: `subprocess error (${code}): ${err.message}`, elapsed_ms: Date.now() - started });
|
|
65
|
+
});
|
|
66
|
+
child.on('close', (code) => {
|
|
67
|
+
if (resolved)
|
|
68
|
+
return;
|
|
69
|
+
resolved = true;
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
const elapsed = Date.now() - started;
|
|
72
|
+
if (code === 0)
|
|
73
|
+
resolve({ ok: true, exit_code: 0, elapsed_ms: elapsed });
|
|
74
|
+
else
|
|
75
|
+
resolve({ ok: false, reason: `subprocess exit ${code}`, exit_code: code ?? -1, elapsed_ms: elapsed });
|
|
76
|
+
});
|
|
77
|
+
try {
|
|
78
|
+
child.stdin?.write(input.prompt);
|
|
79
|
+
child.stdin?.end();
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
resolved = true;
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
resolve({ ok: false, reason: `stdin write failed: ${err.message}` });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=fix-agent-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-agent-dispatcher.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-agent-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAa1C,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,QAAQ,GAAG,CAAC,QAAQ,CAAA;QAAC,CAAC;aACjD,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,QAAQ,GAAG,CAAC,QAAQ,CAAA;QAAC,CAAC;aACrD,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,IAAI,OAAO,EAAE,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAA;YAAC,CAAC;QAAC,CAAC;aAC/F,CAAC;YAAC,OAAO,IAAI,EAAE,CAAA;QAAC,CAAC;IACxB,CAAC;IACD,IAAI,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,IAAI,CAAA;AACb,CAAC;AAED,qGAAqG;AACrG,sGAAsG;AACtG,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,KAAK,CAAA;QACT,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;YACzE,OAAM;QACR,CAAC;QAED,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,IAAI,CAAC;gBAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO,CAAC;gBACN,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,KAAK,CAAC,SAAS,IAAI;gBACzD,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aAClD,CAAC,CAAA;QACJ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;QAEnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC/C,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,SAAS,CAAA;YAClC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAChH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAA;YACpC,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;;gBACnE,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QAC5G,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAChC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAA;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,GAAG,IAAI,CAAA;YACf,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAwB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACjF,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-agent-dispatcher.test.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-agent-dispatcher.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { dispatchFixAgent } from './fix-agent-dispatcher.js';
|
|
3
|
+
describe('dispatchFixAgent', () => {
|
|
4
|
+
it('returns ok=true when subprocess exits 0', async () => {
|
|
5
|
+
const result = await dispatchFixAgent({
|
|
6
|
+
prompt: 'edit something',
|
|
7
|
+
command: 'sh -c "cat >/dev/null; exit 0"',
|
|
8
|
+
timeoutMs: 5000,
|
|
9
|
+
});
|
|
10
|
+
expect(result.ok).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
it('returns ok=false when subprocess exits non-zero', async () => {
|
|
13
|
+
const result = await dispatchFixAgent({
|
|
14
|
+
prompt: 'edit something',
|
|
15
|
+
command: 'sh -c "cat >/dev/null; exit 1"',
|
|
16
|
+
timeoutMs: 5000,
|
|
17
|
+
});
|
|
18
|
+
expect(result.ok).toBe(false);
|
|
19
|
+
if (!result.ok) {
|
|
20
|
+
expect(result.exit_code).toBe(1);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('returns ok=false with timeout when subprocess exceeds timeoutMs', async () => {
|
|
24
|
+
const result = await dispatchFixAgent({
|
|
25
|
+
prompt: 'long task',
|
|
26
|
+
command: 'sh -c "sleep 5"',
|
|
27
|
+
timeoutMs: 100,
|
|
28
|
+
});
|
|
29
|
+
expect(result.ok).toBe(false);
|
|
30
|
+
if (!result.ok)
|
|
31
|
+
expect(result.timed_out).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
it('passes the prompt to subprocess stdin', async () => {
|
|
34
|
+
const tmpfile = '/tmp/observe-fix-test-' + Date.now();
|
|
35
|
+
const result = await dispatchFixAgent({
|
|
36
|
+
prompt: 'EXPECTED-PROMPT',
|
|
37
|
+
command: `sh -c "cat > ${tmpfile}"`,
|
|
38
|
+
timeoutMs: 5000,
|
|
39
|
+
});
|
|
40
|
+
expect(result.ok).toBe(true);
|
|
41
|
+
const { readFileSync, unlinkSync } = await import('node:fs');
|
|
42
|
+
expect(readFileSync(tmpfile, 'utf8')).toBe('EXPECTED-PROMPT');
|
|
43
|
+
unlinkSync(tmpfile);
|
|
44
|
+
});
|
|
45
|
+
it('returns ok=false with reason ENOENT when binary is missing', async () => {
|
|
46
|
+
const result = await dispatchFixAgent({
|
|
47
|
+
prompt: '', command: '/no/such/binary', timeoutMs: 5000,
|
|
48
|
+
});
|
|
49
|
+
expect(result.ok).toBe(false);
|
|
50
|
+
if (!result.ok)
|
|
51
|
+
expect(result.reason).toMatch(/ENOENT|not found|spawn/i);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=fix-agent-dispatcher.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-agent-dispatcher.test.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-agent-dispatcher.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAE5D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,gCAAgC;YACzC,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,gCAAgC;YACzC,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,iBAAiB;YAC1B,SAAS,EAAE,GAAG;SACf,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,wBAAwB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACrD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,gBAAgB,OAAO,GAAG;YACnC,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC7D,UAAU,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;YACpC,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI;SACxD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { EngineOutput, Finding } from './types.js';
|
|
2
|
+
import { type DispatchFixResult } from './fix-agent-dispatcher.js';
|
|
3
|
+
import { type AbortSnapshot } from './abort-snapshot.js';
|
|
4
|
+
export type FixDispatcher = (input: {
|
|
5
|
+
prompt: string;
|
|
6
|
+
command: string;
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
cwd: string;
|
|
9
|
+
}) => Promise<DispatchFixResult>;
|
|
10
|
+
export type FixVerifier = (cwd: string, finding: Finding) => Promise<{
|
|
11
|
+
stillPresent: boolean;
|
|
12
|
+
}>;
|
|
13
|
+
export interface RunFixFlowInput {
|
|
14
|
+
primaryRoot: string;
|
|
15
|
+
initial: EngineOutput;
|
|
16
|
+
dispatcher?: FixDispatcher;
|
|
17
|
+
verifier?: FixVerifier;
|
|
18
|
+
ghBin?: string;
|
|
19
|
+
bdBin?: string;
|
|
20
|
+
abortSnapshot?: AbortSnapshot;
|
|
21
|
+
}
|
|
22
|
+
export interface FixFlowResult {
|
|
23
|
+
fixed: string[];
|
|
24
|
+
failed: string[];
|
|
25
|
+
postfix_markdown_path?: string;
|
|
26
|
+
postfix_sidecar_path?: string;
|
|
27
|
+
aborted?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function runFixFlow(input: RunFixFlowInput): Promise<FixFlowResult>;
|
|
30
|
+
//# sourceMappingURL=fix-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-flow.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-flow.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIpF,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGvF,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KACvE,OAAO,CAAC,iBAAiB,CAAC,CAAA;AAE/B,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;IAAE,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAE/F,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,YAAY,CAAA;IACrB,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAsED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CA0C/E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { buildFixPlan } from './fix-plan.js';
|
|
5
|
+
import { dispatchFixAgent } from './fix-agent-dispatcher.js';
|
|
6
|
+
import { runAudit } from './api.js';
|
|
7
|
+
import { renderAuditMarkdown } from '../renderers/markdown.js';
|
|
8
|
+
import { writeSidecar, deriveReportId } from '../renderers/sidecar.js';
|
|
9
|
+
import { captureSnapshot, recordStaged } from './abort-snapshot.js';
|
|
10
|
+
import { loadObservabilityConfig } from './checks/observability-config.js';
|
|
11
|
+
function buildFindingPrompt(finding) {
|
|
12
|
+
return [
|
|
13
|
+
`# Fix request for finding ${finding.id.slice(0, 8)}`,
|
|
14
|
+
'',
|
|
15
|
+
`Lens: ${finding.lens_id}`,
|
|
16
|
+
`Severity: ${finding.severity}`,
|
|
17
|
+
`Title: ${finding.title}`,
|
|
18
|
+
`Source doc: ${finding.source_doc || '(none)'}`,
|
|
19
|
+
'',
|
|
20
|
+
'## Description',
|
|
21
|
+
finding.description,
|
|
22
|
+
'',
|
|
23
|
+
'## Evidence',
|
|
24
|
+
'```json',
|
|
25
|
+
JSON.stringify(finding.evidence, null, 2),
|
|
26
|
+
'```',
|
|
27
|
+
'',
|
|
28
|
+
finding.fix_hint
|
|
29
|
+
? `## Fix hint\n${finding.fix_hint.prompt ?? '(target only)'}\nTarget: ${finding.fix_hint.target ?? '(none)'}\n`
|
|
30
|
+
: '',
|
|
31
|
+
'## Instructions',
|
|
32
|
+
'',
|
|
33
|
+
'Fix this specific finding only. Do not do unrelated work.',
|
|
34
|
+
'Stage your changes with `git add` when finished. Exit when done.',
|
|
35
|
+
].filter(Boolean).join('\n');
|
|
36
|
+
}
|
|
37
|
+
function defaultVerifier(cwd, finding) {
|
|
38
|
+
return runAudit({
|
|
39
|
+
primaryRoot: cwd, profile: 'fast', scope: 'all',
|
|
40
|
+
sinceHours: 24, lensIds: [finding.lens_id],
|
|
41
|
+
args: { profile: 'fast', scope: 'all', lensIds: [finding.lens_id], verifying: finding.id },
|
|
42
|
+
}).then((out) => ({ stillPresent: out.findings.some((f) => f.id === finding.id) }));
|
|
43
|
+
}
|
|
44
|
+
function listStagedSince(cwd, baselineStaged) {
|
|
45
|
+
try {
|
|
46
|
+
const current = new Set(execFileSync('git', ['diff', '--cached', '--name-only'], { cwd, encoding: 'utf8' })
|
|
47
|
+
.trim().split('\n').filter(Boolean));
|
|
48
|
+
return [...current].filter((p) => !baselineStaged.has(p));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function tryFixFinding(finding, cwd, dispatcher, verifier, command, timeoutMs, maxAttempts, snapshot) {
|
|
55
|
+
const prompt = buildFindingPrompt(finding);
|
|
56
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
57
|
+
const baselineStaged = new Set([...snapshot.pre_existing_staged, ...snapshot.staged_paths]);
|
|
58
|
+
const result = await dispatcher({ prompt, command, timeoutMs, cwd });
|
|
59
|
+
if (!result.ok)
|
|
60
|
+
continue;
|
|
61
|
+
const newlyStaged = listStagedSince(cwd, baselineStaged);
|
|
62
|
+
recordStaged(snapshot, newlyStaged);
|
|
63
|
+
const { stillPresent } = await verifier(cwd, finding);
|
|
64
|
+
if (!stillPresent)
|
|
65
|
+
return { fixed: true, attempts: attempt };
|
|
66
|
+
}
|
|
67
|
+
return { fixed: false, attempts: maxAttempts };
|
|
68
|
+
}
|
|
69
|
+
export async function runFixFlow(input) {
|
|
70
|
+
const config = loadObservabilityConfig(input.primaryRoot);
|
|
71
|
+
const command = config.fix.dispatcher_command ?? 'claude -p';
|
|
72
|
+
const timeoutMs = (config.fix.timeout_s ?? 300) * 1000;
|
|
73
|
+
const maxAttempts = config.fix.per_finding_max_attempts ?? 3;
|
|
74
|
+
const dispatcher = input.dispatcher ?? dispatchFixAgent;
|
|
75
|
+
const verifier = input.verifier ?? defaultVerifier;
|
|
76
|
+
const snapshot = input.abortSnapshot ?? captureSnapshot(input.primaryRoot);
|
|
77
|
+
const plan = buildFixPlan(input.initial.findings, input.initial.fix_threshold);
|
|
78
|
+
const fixed = [];
|
|
79
|
+
const failed = [];
|
|
80
|
+
for (const finding of plan) {
|
|
81
|
+
const res = await tryFixFinding(finding, input.primaryRoot, dispatcher, verifier, command, timeoutMs, maxAttempts, snapshot);
|
|
82
|
+
if (res.fixed)
|
|
83
|
+
fixed.push(finding.id);
|
|
84
|
+
else
|
|
85
|
+
failed.push(finding.id);
|
|
86
|
+
}
|
|
87
|
+
const postfix = await runAudit({
|
|
88
|
+
primaryRoot: input.primaryRoot,
|
|
89
|
+
profile: 'fast', scope: 'all', sinceHours: 24,
|
|
90
|
+
ghBin: input.ghBin, bdBin: input.bdBin,
|
|
91
|
+
args: { profile: 'fast', scope: 'all', postfix: true },
|
|
92
|
+
});
|
|
93
|
+
const postfixId = `${deriveReportId(postfix)}-postfix`;
|
|
94
|
+
const postfixSidecarAbs = await writeSidecar(input.primaryRoot, postfix, `docs/audits/${postfixId}.json`);
|
|
95
|
+
const postfixMd = renderAuditMarkdown(postfix);
|
|
96
|
+
const postfixMdAbs = join(input.primaryRoot, `docs/audits/${postfixId}.md`);
|
|
97
|
+
mkdirSync(dirname(postfixMdAbs), { recursive: true });
|
|
98
|
+
writeFileSync(postfixMdAbs, postfixMd, { mode: 0o644 });
|
|
99
|
+
return {
|
|
100
|
+
fixed, failed,
|
|
101
|
+
postfix_markdown_path: `docs/audits/${postfixId}.md`,
|
|
102
|
+
postfix_sidecar_path: postfixSidecarAbs.replace(`${input.primaryRoot}/`, ''),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=fix-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-flow.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-flow.test.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-flow.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { runFixFlow } from './fix-flow.js';
|
|
7
|
+
function f(id, severity, lens_id) {
|
|
8
|
+
return {
|
|
9
|
+
id, lens_id, severity,
|
|
10
|
+
title: `${lens_id} finding`, description: 'd', source_doc: '',
|
|
11
|
+
evidence: { kind: 'orphan_node', graph_query: '', node_id: 'x' },
|
|
12
|
+
confidence: 'high', first_seen: '', last_seen: '', status: 'open',
|
|
13
|
+
fix_hint: { kind: 'edit_doc', target: 'docs/x.md', prompt: 'fix it' },
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function makeFixtureWithFindings(findings) {
|
|
17
|
+
return {
|
|
18
|
+
schema_version: '1.0',
|
|
19
|
+
invocation: {
|
|
20
|
+
command: 'audit',
|
|
21
|
+
args: { profile: 'fast', scope: 'all' },
|
|
22
|
+
started_at: '2026-05-04T14:00:00Z',
|
|
23
|
+
completed_at: '2026-05-04T14:00:01Z',
|
|
24
|
+
scaffold_version: '3.25.1',
|
|
25
|
+
},
|
|
26
|
+
availability: {
|
|
27
|
+
git: { status: 'available' }, gh: { status: 'unavailable' },
|
|
28
|
+
pipeline_docs: { status: 'available' }, tests: { status: 'available' },
|
|
29
|
+
state: { status: 'available' }, beads: { status: 'unavailable' },
|
|
30
|
+
mmr: { status: 'available' }, audit_history: { status: 'unavailable' },
|
|
31
|
+
ledger: { events_read: 0, malformed_lines: 0, sources: [] },
|
|
32
|
+
},
|
|
33
|
+
snapshot: null, replay: null, findings, needs_attention: [],
|
|
34
|
+
graph_stats: {
|
|
35
|
+
nodes_by_kind: {}, edges_by_kind: {}, orphans_by_kind: {},
|
|
36
|
+
unsanctioned_uses: 0, ad_hoc_token_uses: 0,
|
|
37
|
+
},
|
|
38
|
+
fix_threshold: 'P2', verdict: 'blocked',
|
|
39
|
+
summary: {
|
|
40
|
+
total: findings.length,
|
|
41
|
+
by_severity: { P0: 0, P1: 0, P2: 0, P3: 0 },
|
|
42
|
+
by_severity_status: {
|
|
43
|
+
P0: { open: 0, acknowledged: 0, skipped: 0 },
|
|
44
|
+
P1: { open: 0, acknowledged: 0, skipped: 0 },
|
|
45
|
+
P2: { open: 0, acknowledged: 0, skipped: 0 },
|
|
46
|
+
P3: { open: 0, acknowledged: 0, skipped: 0 },
|
|
47
|
+
},
|
|
48
|
+
blocking: findings.length, acknowledged: 0, skipped_lenses: 0,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
describe('runFixFlow', () => {
|
|
53
|
+
let proj;
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
proj = mkdtempSync(join(tmpdir(), 'observe-fix-'));
|
|
56
|
+
execSync('git init -q', { cwd: proj });
|
|
57
|
+
execSync('git config user.email t@e.com && git config user.name T', { cwd: proj, shell: '/bin/sh' });
|
|
58
|
+
mkdirSync(join(proj, 'docs'), { recursive: true });
|
|
59
|
+
writeFileSync(join(proj, 'package.json'), '{}');
|
|
60
|
+
writeFileSync(join(proj, 'docs/plan.md'), '# PRD\n## Features\n### F [priority: must]\n');
|
|
61
|
+
writeFileSync(join(proj, 'docs/user-stories.md'), '## Story s-1: T [priority: must]\n');
|
|
62
|
+
writeFileSync(join(proj, 'docs/tdd-standards.md'), '# TDD\n');
|
|
63
|
+
execSync('git add . && git commit -q -m initial', { cwd: proj, shell: '/bin/sh' });
|
|
64
|
+
});
|
|
65
|
+
afterEach(() => { rmSync(proj, { recursive: true, force: true }); });
|
|
66
|
+
it('fixes a finding when the agent succeeds and verification passes', async () => {
|
|
67
|
+
const attemptedFor = [];
|
|
68
|
+
const stubDispatcher = vi.fn(async () => ({ ok: true, exit_code: 0, elapsed_ms: 50 }));
|
|
69
|
+
const stubVerify = vi.fn(async (_proj, finding) => {
|
|
70
|
+
attemptedFor.push(finding.id);
|
|
71
|
+
return { stillPresent: false };
|
|
72
|
+
});
|
|
73
|
+
const initial = makeFixtureWithFindings([f('a', 'P0', 'A-tdd')]);
|
|
74
|
+
const result = await runFixFlow({
|
|
75
|
+
primaryRoot: proj, initial,
|
|
76
|
+
dispatcher: stubDispatcher,
|
|
77
|
+
verifier: stubVerify,
|
|
78
|
+
});
|
|
79
|
+
expect(result.fixed).toEqual(['a']);
|
|
80
|
+
expect(result.failed).toEqual([]);
|
|
81
|
+
expect(stubDispatcher).toHaveBeenCalledTimes(1);
|
|
82
|
+
expect(attemptedFor).toEqual(['a']);
|
|
83
|
+
});
|
|
84
|
+
it('retries up to 3 times per finding before declaring failure', async () => {
|
|
85
|
+
const stubDispatcher = vi.fn(async () => ({ ok: true, exit_code: 0, elapsed_ms: 50 }));
|
|
86
|
+
let verifyCalls = 0;
|
|
87
|
+
const stubVerify = vi.fn(async () => {
|
|
88
|
+
verifyCalls++;
|
|
89
|
+
return { stillPresent: true };
|
|
90
|
+
});
|
|
91
|
+
const initial = makeFixtureWithFindings([f('a', 'P0', 'A-tdd')]);
|
|
92
|
+
const result = await runFixFlow({
|
|
93
|
+
primaryRoot: proj, initial,
|
|
94
|
+
dispatcher: stubDispatcher,
|
|
95
|
+
verifier: stubVerify,
|
|
96
|
+
});
|
|
97
|
+
expect(result.fixed).toEqual([]);
|
|
98
|
+
expect(result.failed).toEqual(['a']);
|
|
99
|
+
expect(stubDispatcher).toHaveBeenCalledTimes(3);
|
|
100
|
+
expect(verifyCalls).toBe(3);
|
|
101
|
+
});
|
|
102
|
+
it('continues to the next finding after a per-finding failure', async () => {
|
|
103
|
+
const stubDispatcher = vi.fn(async () => ({ ok: true, exit_code: 0, elapsed_ms: 50 }));
|
|
104
|
+
const stubVerify = vi.fn(async (_p, fnd) => ({ stillPresent: fnd.id === 'a' }));
|
|
105
|
+
const initial = makeFixtureWithFindings([f('a', 'P0', 'A-tdd'), f('b', 'P1', 'B-ac-coverage')]);
|
|
106
|
+
const result = await runFixFlow({
|
|
107
|
+
primaryRoot: proj, initial,
|
|
108
|
+
dispatcher: stubDispatcher,
|
|
109
|
+
verifier: stubVerify,
|
|
110
|
+
});
|
|
111
|
+
expect(result.failed).toEqual(['a']);
|
|
112
|
+
expect(result.fixed).toEqual(['b']);
|
|
113
|
+
});
|
|
114
|
+
it('writes a post-fix report at docs/audits/<id>-postfix.md after the run', async () => {
|
|
115
|
+
const stubDispatcher = vi.fn(async () => ({ ok: true, exit_code: 0, elapsed_ms: 50 }));
|
|
116
|
+
const stubVerify = vi.fn(async () => ({ stillPresent: false }));
|
|
117
|
+
const initial = makeFixtureWithFindings([f('a', 'P0', 'A-tdd')]);
|
|
118
|
+
const result = await runFixFlow({
|
|
119
|
+
primaryRoot: proj, initial,
|
|
120
|
+
dispatcher: stubDispatcher,
|
|
121
|
+
verifier: stubVerify,
|
|
122
|
+
});
|
|
123
|
+
expect(result.postfix_markdown_path).toMatch(/-postfix\.md$/);
|
|
124
|
+
expect(result.postfix_sidecar_path).toMatch(/-postfix\.json$/);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=fix-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-flow.test.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-plan.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGnD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,QAAQ,GAAG,OAAO,EAAE,CASnF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { severityRank } from './types.js';
|
|
2
|
+
export function buildFixPlan(findings, fixThreshold) {
|
|
3
|
+
const thresholdRank = severityRank(fixThreshold);
|
|
4
|
+
return findings
|
|
5
|
+
.filter((f) => f.status === 'open' && severityRank(f.severity) <= thresholdRank)
|
|
6
|
+
.sort((a, b) => {
|
|
7
|
+
const sevDiff = severityRank(a.severity) - severityRank(b.severity);
|
|
8
|
+
if (sevDiff !== 0)
|
|
9
|
+
return sevDiff;
|
|
10
|
+
return a.lens_id < b.lens_id ? -1 : a.lens_id > b.lens_id ? 1 : 0;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=fix-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-plan.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-plan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,UAAU,YAAY,CAAC,QAAmB,EAAE,YAAsB;IACtE,MAAM,aAAa,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAChD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC;SAC/E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACnE,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,OAAO,CAAA;QACjC,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-plan.test.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/fix-plan.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildFixPlan } from './fix-plan.js';
|
|
3
|
+
function f(id, severity, lens_id, status = 'open') {
|
|
4
|
+
return {
|
|
5
|
+
id, lens_id, severity,
|
|
6
|
+
title: '', description: '', source_doc: '',
|
|
7
|
+
evidence: { kind: 'orphan_node', graph_query: '', node_id: 'x' },
|
|
8
|
+
confidence: 'high', first_seen: '', last_seen: '', status,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
describe('buildFixPlan', () => {
|
|
12
|
+
it('includes blocking open findings (severityRank <= threshold)', () => {
|
|
13
|
+
const findings = [
|
|
14
|
+
f('a', 'P0', 'A-tdd'),
|
|
15
|
+
f('b', 'P1', 'B-ac-coverage'),
|
|
16
|
+
f('c', 'P2', 'C-standards'),
|
|
17
|
+
f('d', 'P3', 'D-stack'),
|
|
18
|
+
];
|
|
19
|
+
const plan = buildFixPlan(findings, 'P2');
|
|
20
|
+
expect(plan.map((fnd) => fnd.id)).toEqual(['a', 'b', 'c']);
|
|
21
|
+
});
|
|
22
|
+
it('orders by severity (P0 first), tiebreak by lens_id', () => {
|
|
23
|
+
const findings = [
|
|
24
|
+
f('z-p1', 'P1', 'Z-zzz'),
|
|
25
|
+
f('a-p1', 'P1', 'A-tdd'),
|
|
26
|
+
f('a-p0', 'P0', 'A-tdd'),
|
|
27
|
+
];
|
|
28
|
+
const plan = buildFixPlan(findings, 'P2');
|
|
29
|
+
expect(plan.map((fnd) => fnd.id)).toEqual(['a-p0', 'a-p1', 'z-p1']);
|
|
30
|
+
});
|
|
31
|
+
it('excludes acknowledged + skipped findings', () => {
|
|
32
|
+
const findings = [
|
|
33
|
+
f('a', 'P0', 'A-tdd', 'acknowledged'),
|
|
34
|
+
f('b', 'P1', 'B-ac-coverage', 'skipped'),
|
|
35
|
+
f('c', 'P2', 'C-standards', 'open'),
|
|
36
|
+
];
|
|
37
|
+
const plan = buildFixPlan(findings, 'P2');
|
|
38
|
+
expect(plan.map((fnd) => fnd.id)).toEqual(['c']);
|
|
39
|
+
});
|
|
40
|
+
it('returns [] when no blocking findings exist', () => {
|
|
41
|
+
expect(buildFixPlan([f('x', 'P3', 'X')], 'P2')).toEqual([]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=fix-plan.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-plan.test.js","sourceRoot":"","sources":["../../../src/observability/engine/fix-plan.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface HarvestInput {
|
|
2
|
+
primaryRoot: string;
|
|
3
|
+
worktreeRoot: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function archiveDir(primaryRoot: string): string;
|
|
6
|
+
export declare function activeArchiveFile(primaryRoot: string, worktreeId: string): string;
|
|
7
|
+
export declare function harvestWorktree(input: HarvestInput): Promise<void>;
|
|
8
|
+
export interface RecoverInput {
|
|
9
|
+
primaryRoot: string;
|
|
10
|
+
listWorktrees?: () => string[];
|
|
11
|
+
}
|
|
12
|
+
export interface RecoverResult {
|
|
13
|
+
rotated: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function recoverStaleArchives(input: RecoverInput): Promise<RecoverResult>;
|
|
16
|
+
//# sourceMappingURL=harvester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harvester.d.ts","sourceRoot":"","sources":["../../../src/observability/engine/harvester.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCxE;AAID,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,MAAM,EAAE,CAAA;CAC/B;AACD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAkBD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA2BtF"}
|