@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,95 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { runChecks } from './runner.js';
|
|
3
|
+
const stubGraph = {
|
|
4
|
+
cwd: '',
|
|
5
|
+
features: [], stories: [], acceptance_criteria: [], plan_tasks: [], playbook_tasks: [], tests: [],
|
|
6
|
+
pull_requests: [], files: [], rules: [], components: [], tokens: [], decisions: [],
|
|
7
|
+
edges: [], provenance: {}, unresolved_globs: [],
|
|
8
|
+
};
|
|
9
|
+
const stubAvailability = {
|
|
10
|
+
git: { status: 'available' }, gh: { status: 'unavailable', reason: 'no gh' },
|
|
11
|
+
pipeline_docs: { status: 'available' }, tests: { status: 'available' },
|
|
12
|
+
state: { status: 'available' }, beads: { status: 'unavailable' },
|
|
13
|
+
mmr: { status: 'available' }, audit_history: { status: 'unavailable' },
|
|
14
|
+
ledger: { events_read: 0, malformed_lines: 0, sources: [] },
|
|
15
|
+
};
|
|
16
|
+
describe('runChecks', () => {
|
|
17
|
+
it('runs lenses in topological order based on depends_on', async () => {
|
|
18
|
+
const order = [];
|
|
19
|
+
const registry = [
|
|
20
|
+
{ id: 'X', name: 'X', profiles: ['fast'], required: ['pipeline_docs'], optional: [], depends_on: ['Y'] },
|
|
21
|
+
{ id: 'Y', name: 'Y', profiles: ['fast'], required: ['pipeline_docs'], optional: [] },
|
|
22
|
+
];
|
|
23
|
+
const lenses = {
|
|
24
|
+
X: async () => { order.push('X'); return []; },
|
|
25
|
+
Y: async () => { order.push('Y'); return []; },
|
|
26
|
+
};
|
|
27
|
+
await runChecks({
|
|
28
|
+
registry, lenses, graph: stubGraph, ledger: { events: [] }, availability: stubAvailability, profile: 'fast',
|
|
29
|
+
});
|
|
30
|
+
expect(order).toEqual(['Y', 'X']);
|
|
31
|
+
});
|
|
32
|
+
it('emits a lens_skipped finding (P3) when a required adapter is unavailable', async () => {
|
|
33
|
+
const registry = [
|
|
34
|
+
{ id: 'NeedsGh', name: 'NG', profiles: ['fast'], required: ['gh'], optional: [] },
|
|
35
|
+
];
|
|
36
|
+
const lenses = { NeedsGh: async () => [{ id: 'should-not-be-called' }] };
|
|
37
|
+
const findings = await runChecks({
|
|
38
|
+
registry, lenses, graph: stubGraph, ledger: { events: [] }, availability: stubAvailability, profile: 'fast',
|
|
39
|
+
});
|
|
40
|
+
expect(findings).toHaveLength(1);
|
|
41
|
+
expect(findings[0].lens_id).toBe('NeedsGh');
|
|
42
|
+
expect(findings[0].severity).toBe('P3');
|
|
43
|
+
expect(findings[0].evidence.kind).toBe('lens_skipped');
|
|
44
|
+
});
|
|
45
|
+
it('passes upstream findings to downstream via the shared buffer', async () => {
|
|
46
|
+
const registry = [
|
|
47
|
+
{ id: 'D-stack', name: 'D', profiles: ['fast'], required: ['pipeline_docs'], optional: [] },
|
|
48
|
+
{
|
|
49
|
+
id: 'G-decisions', name: 'G', profiles: ['fast'],
|
|
50
|
+
required: ['pipeline_docs'], optional: [], depends_on: ['D-stack'],
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
const seen = [];
|
|
54
|
+
const lenses = {
|
|
55
|
+
'D-stack': async () => [{ id: 'fake-d', lens_id: 'D-stack', severity: 'P1' }],
|
|
56
|
+
'G-decisions': async (_g, _l, _a, upstream) => {
|
|
57
|
+
seen.push(upstream);
|
|
58
|
+
return [];
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
await runChecks({
|
|
62
|
+
registry, lenses, graph: stubGraph, ledger: { events: [] }, availability: stubAvailability, profile: 'fast',
|
|
63
|
+
});
|
|
64
|
+
expect(seen).toHaveLength(1);
|
|
65
|
+
expect(seen[0]).toHaveLength(1);
|
|
66
|
+
expect(seen[0][0].lens_id).toBe('D-stack');
|
|
67
|
+
});
|
|
68
|
+
it('rejects lens-dependency cycles at startup', async () => {
|
|
69
|
+
const registry = [
|
|
70
|
+
{ id: 'A', name: 'A', profiles: ['fast'], required: ['pipeline_docs'], optional: [], depends_on: ['B'] },
|
|
71
|
+
{ id: 'B', name: 'B', profiles: ['fast'], required: ['pipeline_docs'], optional: [], depends_on: ['A'] },
|
|
72
|
+
];
|
|
73
|
+
await expect(runChecks({
|
|
74
|
+
registry, lenses: {}, graph: stubGraph, ledger: { events: [] }, availability: stubAvailability, profile: 'fast',
|
|
75
|
+
})).rejects.toThrow(/cycle/i);
|
|
76
|
+
});
|
|
77
|
+
it('passes the profile to each lens function via LensContext', async () => {
|
|
78
|
+
const captured = [];
|
|
79
|
+
const registry = [
|
|
80
|
+
{ id: 'P', name: 'P', profiles: ['fast', 'full'], required: ['pipeline_docs'], optional: [] },
|
|
81
|
+
];
|
|
82
|
+
const lenses = {
|
|
83
|
+
P: async (_g, _l, _a, _u, _e, ctx) => {
|
|
84
|
+
captured.push(ctx?.profile ?? '(missing)');
|
|
85
|
+
return [];
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
await runChecks({
|
|
89
|
+
registry, lenses, graph: stubGraph, ledger: { events: [] },
|
|
90
|
+
availability: stubAvailability, profile: 'full',
|
|
91
|
+
});
|
|
92
|
+
expect(captured).toEqual(['full']);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=runner.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/checks/runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAIvC,MAAM,SAAS,GAAG;IAChB,GAAG,EAAE,EAAE;IACP,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;IACjG,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;IAClF,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE;CAChD,CAAA;AACD,MAAM,gBAAgB,GAAG;IACvB,GAAG,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,aAAsB,EAAE,MAAM,EAAE,OAAO,EAAE;IAC9F,aAAa,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE;IACxF,KAAK,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,aAAsB,EAAE;IAClF,GAAG,EAAE,EAAE,MAAM,EAAE,WAAoB,EAAE,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,aAAsB,EAAE;IACxF,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;CAC5D,CAAA;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE;YACxG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;SACtF,CAAA;QACD,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAe,CAAA,CAAC,CAAC;YAC1D,CAAC,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAe,CAAA,CAAC,CAAC;SAC3D,CAAA;QACD,MAAM,SAAS,CAAC;YACd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;SAC5G,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;SAClF,CAAA;QACD,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAsB,CAAC,EAAE,CAAA;QAC5F,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC;YAC/B,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;SAC5G,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC3F;gBACE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC;gBAChD,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC;aACnE;SACF,CAAA;QACD,MAAM,IAAI,GAAgB,EAAE,CAAA;QAC5B,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAa,CAAC;YACxF,aAAa,EAAE,KAAK,EAAE,EAAW,EAAE,EAAW,EAAE,EAAW,EAAE,QAAmB,EAAE,EAAE;gBAClF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACnB,OAAO,EAAe,CAAA;YACxB,CAAC;SACF,CAAA;QACD,MAAM,SAAS,CAAC;YACd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;SAC5G,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE;YACxG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE;SACzG,CAAA;QACD,MAAM,MAAM,CAAC,SAAS,CAAC;YACrB,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;SAChH,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC9F,CAAA;QACD,MAAM,MAAM,GAAG;YACb,CAAC,EAAE,KAAK,EACN,EAAW,EAAE,EAAW,EAAE,EAAW,EAAE,EAAW,EAAE,EAAW,EAC/D,GAA0B,EAC1B,EAAE;gBACF,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,WAAW,CAAC,CAAA;gBAC1C,OAAO,EAAa,CAAA;YACtB,CAAC;SACF,CAAA;QACD,MAAM,SAAS,CAAC;YACd,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC1D,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM;SAChD,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAgBtD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,SAAuB,GAAG,mBAAmB,EAAE,CA0B9G"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { parseMarkdown, headingsAtDepth, sectionRawText, slugify } from './parse-markdown.js';
|
|
2
|
+
function parseFields(body) {
|
|
3
|
+
const out = {};
|
|
4
|
+
const fieldRe = /^\s*([a-z][\w-]*)\s*:\s*(.+?)\s*$/gim;
|
|
5
|
+
let m;
|
|
6
|
+
while ((m = fieldRe.exec(body)) !== null) {
|
|
7
|
+
const key = m[1].replace(/-/g, '_').toLowerCase();
|
|
8
|
+
const raw = m[2].trim();
|
|
9
|
+
if (key === 'package_or_url')
|
|
10
|
+
out.package_or_url = raw;
|
|
11
|
+
if (key === 'layer')
|
|
12
|
+
out.layer = raw.toLowerCase();
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
export function parseSanctionedComponents(md, sourcePath = 'docs/tech-stack.md') {
|
|
17
|
+
const root = parseMarkdown(md);
|
|
18
|
+
const h2s = headingsAtDepth(root, 2);
|
|
19
|
+
const h3s = headingsAtDepth(root, 3);
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const h3 of h3s) {
|
|
22
|
+
const body = sectionRawText(root, h3);
|
|
23
|
+
const fields = parseFields(body);
|
|
24
|
+
if (!fields.package_or_url)
|
|
25
|
+
continue;
|
|
26
|
+
let layer = fields.layer;
|
|
27
|
+
if (!layer) {
|
|
28
|
+
const ancestor = [...h2s].reverse().find((h) => h.startIndex < h3.startIndex);
|
|
29
|
+
if (ancestor)
|
|
30
|
+
layer = ancestor.textContent.replace(/\[[^\]]*\]/g, '').trim().toLowerCase();
|
|
31
|
+
}
|
|
32
|
+
const slug = slugify(h3.textContent);
|
|
33
|
+
out.push({
|
|
34
|
+
id: `component:${slug}`,
|
|
35
|
+
package_or_url: fields.package_or_url,
|
|
36
|
+
layer,
|
|
37
|
+
source_anchor: `${sourcePath}#${slug}`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=component-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-parser.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7F,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAgD,EAAE,CAAA;IAC3D,MAAM,OAAO,GAAG,sCAAsC,CAAA;IACtD,IAAI,CAAyB,CAAA;IAC7B,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;QACjD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACvB,IAAI,GAAG,KAAK,gBAAgB;YAAE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAA;QACtD,IAAI,GAAG,KAAK,OAAO;YAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACpD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,EAAU,EAAE,UAAU,GAAG,oBAAoB;IACrF,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACpC,MAAM,GAAG,GAA0B,EAAE,CAAA;IAErC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,CAAC,cAAc;YAAE,SAAQ;QAEpC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;YAC7E,IAAI,QAAQ;gBAAE,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC5F,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QACpC,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,aAAa,IAAI,EAAE;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,KAAK;YACL,aAAa,EAAE,GAAG,UAAU,IAAI,IAAI,EAAE;SACvC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseSanctionedComponents } from './component-parser.js';
|
|
3
|
+
describe('parseSanctionedComponents', () => {
|
|
4
|
+
it('extracts components grouped by H2 layer when layer field is omitted', () => {
|
|
5
|
+
const md = `# Tech Stack
|
|
6
|
+
|
|
7
|
+
## Frontend
|
|
8
|
+
|
|
9
|
+
### React
|
|
10
|
+
|
|
11
|
+
- package_or_url: react@18
|
|
12
|
+
|
|
13
|
+
### Tailwind CSS
|
|
14
|
+
|
|
15
|
+
- package_or_url: tailwindcss@3
|
|
16
|
+
|
|
17
|
+
## Backend
|
|
18
|
+
|
|
19
|
+
### PostgreSQL
|
|
20
|
+
|
|
21
|
+
- package_or_url: postgres@16
|
|
22
|
+
- layer: data
|
|
23
|
+
`;
|
|
24
|
+
const cs = parseSanctionedComponents(md);
|
|
25
|
+
expect(cs).toHaveLength(3);
|
|
26
|
+
expect(cs[0]).toMatchObject({
|
|
27
|
+
id: 'component:react',
|
|
28
|
+
package_or_url: 'react@18',
|
|
29
|
+
layer: 'frontend',
|
|
30
|
+
source_anchor: 'docs/tech-stack.md#react',
|
|
31
|
+
});
|
|
32
|
+
expect(cs[1].layer).toBe('frontend');
|
|
33
|
+
expect(cs[2].layer).toBe('data');
|
|
34
|
+
});
|
|
35
|
+
it('skips H3 entries without package_or_url field', () => {
|
|
36
|
+
const md = '## Frontend\n\n### Some Section Without Package\n\nProse only.\n';
|
|
37
|
+
expect(parseSanctionedComponents(md)).toEqual([]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=component-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-parser.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;CAkBd,CAAA;QACG,MAAM,EAAE,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAA;QACxC,MAAM,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC1B,EAAE,EAAE,iBAAiB;YACrB,cAAc,EAAE,UAAU;YAC1B,KAAK,EAAE,UAAU;YACjB,aAAa,EAAE,0BAA0B;SAC1C,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,GAAG,kEAAkE,CAAA;QAC7E,MAAM,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SanctionedComponent } from '../types.js';
|
|
2
|
+
export interface ComponentUse {
|
|
3
|
+
file: string;
|
|
4
|
+
specifier: string;
|
|
5
|
+
component_id: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function detectComponentUses(source: string, components: SanctionedComponent[], filePath: string): ComponentUse[];
|
|
8
|
+
//# sourceMappingURL=component-use-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-use-detector.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-use-detector.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAQtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AA2BD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,mBAAmB,EAAE,EACjC,QAAQ,EAAE,MAAM,GACf,YAAY,EAAE,CA4BhB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { builtinModules } from 'node:module';
|
|
2
|
+
import { parse as babelParse } from '@babel/parser';
|
|
3
|
+
import traverseDefault from '@babel/traverse';
|
|
4
|
+
const traverse = (traverseDefault.default ?? traverseDefault);
|
|
5
|
+
function packageNameOf(component) {
|
|
6
|
+
const s = component.package_or_url;
|
|
7
|
+
if (s.startsWith('@')) {
|
|
8
|
+
const parts = s.split('/');
|
|
9
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1].split('@')[0]}` : s;
|
|
10
|
+
}
|
|
11
|
+
return s.split('/')[0].split('@')[0] || s;
|
|
12
|
+
}
|
|
13
|
+
function isRelative(specifier) {
|
|
14
|
+
return specifier.startsWith('.') || specifier.startsWith('/');
|
|
15
|
+
}
|
|
16
|
+
function isBuiltin(specifier) {
|
|
17
|
+
return specifier.startsWith('node:') || builtinModules.includes(specifier);
|
|
18
|
+
}
|
|
19
|
+
function normalizeSpecifier(specifier) {
|
|
20
|
+
if (specifier.startsWith('@')) {
|
|
21
|
+
const parts = specifier.split('/');
|
|
22
|
+
return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : specifier;
|
|
23
|
+
}
|
|
24
|
+
return specifier.split('/')[0];
|
|
25
|
+
}
|
|
26
|
+
export function detectComponentUses(source, components, filePath) {
|
|
27
|
+
const out = [];
|
|
28
|
+
let ast;
|
|
29
|
+
try {
|
|
30
|
+
ast = babelParse(source, { sourceType: 'module', plugins: ['typescript', 'jsx'] });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
try {
|
|
34
|
+
ast = babelParse(source, { sourceType: 'script', plugins: ['typescript', 'jsx'] });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function pushUse(specifier) {
|
|
41
|
+
if (isRelative(specifier) || isBuiltin(specifier))
|
|
42
|
+
return;
|
|
43
|
+
const normalized = normalizeSpecifier(specifier);
|
|
44
|
+
const match = components.find((c) => packageNameOf(c) === normalized);
|
|
45
|
+
out.push({ file: filePath, specifier, component_id: match ? match.id : 'unsanctioned' });
|
|
46
|
+
}
|
|
47
|
+
traverse(ast, {
|
|
48
|
+
ImportDeclaration(path) {
|
|
49
|
+
pushUse(path.node.source.value);
|
|
50
|
+
},
|
|
51
|
+
CallExpression(path) {
|
|
52
|
+
const node = path.node;
|
|
53
|
+
if (node.callee.type !== 'Identifier' || node.callee.name !== 'require')
|
|
54
|
+
return;
|
|
55
|
+
if (node.arguments.length === 0 || node.arguments[0].type !== 'StringLiteral')
|
|
56
|
+
return;
|
|
57
|
+
pushUse(node.arguments[0].value);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=component-use-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-use-detector.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-use-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-use-detector.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-use-detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { detectComponentUses } from './component-use-detector.js';
|
|
3
|
+
const components = [
|
|
4
|
+
{ id: 'component:react', package_or_url: 'react@18', layer: 'frontend', source_anchor: '' },
|
|
5
|
+
{ id: 'component:tailwindcss', package_or_url: 'tailwindcss@3', layer: 'frontend', source_anchor: '' },
|
|
6
|
+
{ id: 'component:postgres', package_or_url: 'postgres@16', layer: 'data', source_anchor: '' },
|
|
7
|
+
];
|
|
8
|
+
describe('detectComponentUses', () => {
|
|
9
|
+
it('matches imports by package name (ignoring version suffix)', () => {
|
|
10
|
+
const ts = `
|
|
11
|
+
import React from 'react'
|
|
12
|
+
import { sql } from 'postgres'
|
|
13
|
+
import { isDeprecated } from 'lodash'
|
|
14
|
+
`;
|
|
15
|
+
const uses = detectComponentUses(ts, components, 'src/x.ts');
|
|
16
|
+
expect(uses).toEqual([
|
|
17
|
+
{ file: 'src/x.ts', specifier: 'react', component_id: 'component:react' },
|
|
18
|
+
{ file: 'src/x.ts', specifier: 'postgres', component_id: 'component:postgres' },
|
|
19
|
+
{ file: 'src/x.ts', specifier: 'lodash', component_id: 'unsanctioned' },
|
|
20
|
+
]);
|
|
21
|
+
});
|
|
22
|
+
it('treats relative imports as in-repo (skipped, not unsanctioned)', () => {
|
|
23
|
+
const ts = 'import { foo } from \'./foo\'\nimport bar from \'../bar\'';
|
|
24
|
+
expect(detectComponentUses(ts, components, 'src/x.ts')).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
it('handles scoped packages like @org/pkg', () => {
|
|
27
|
+
const local = [
|
|
28
|
+
{ id: 'component:trpc', package_or_url: '@trpc/server@10', layer: 'backend', source_anchor: '' },
|
|
29
|
+
];
|
|
30
|
+
const ts = 'import { router } from \'@trpc/server\'';
|
|
31
|
+
const uses = detectComponentUses(ts, local, 'src/x.ts');
|
|
32
|
+
expect(uses[0]).toMatchObject({ specifier: '@trpc/server', component_id: 'component:trpc' });
|
|
33
|
+
});
|
|
34
|
+
it('returns [] when source has no imports', () => {
|
|
35
|
+
expect(detectComponentUses('export const x = 1', components, 'src/x.ts')).toEqual([]);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=component-use-detector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-use-detector.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/component-use-detector.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAGjE,MAAM,UAAU,GAA0B;IACxC,EAAE,EAAE,EAAE,iBAAiB,EAAQ,cAAc,EAAE,UAAU,EAAQ,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;IACvG,EAAE,EAAE,EAAE,uBAAuB,EAAE,cAAc,EAAE,eAAe,EAAG,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;IACvG,EAAE,EAAE,EAAE,oBAAoB,EAAK,cAAc,EAAE,aAAa,EAAK,KAAK,EAAE,MAAM,EAAM,aAAa,EAAE,EAAE,EAAE;CACxG,CAAA;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG;;;;KAIV,CAAA;QACD,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAK,YAAY,EAAE,iBAAiB,EAAE;YAC5E,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE;YAC/E,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAI,YAAY,EAAE,cAAc,EAAE;SAC1E,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,GAAG,2DAA2D,CAAA;QACtE,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAA0B;YACnC,EAAE,EAAE,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,EAAE;SACjG,CAAA;QACD,MAAM,EAAE,GAAG,yCAAyC,CAAA;QACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,mBAAmB,CAAC,oBAAoB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/decision-parser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAkC3C,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6BrE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import yaml from 'js-yaml';
|
|
4
|
+
function toDecision(raw, sourceAnchor) {
|
|
5
|
+
return {
|
|
6
|
+
id: `decision:${raw.key}`,
|
|
7
|
+
key: raw.key,
|
|
8
|
+
summary: raw.summary,
|
|
9
|
+
affects: raw.affects ?? [],
|
|
10
|
+
superseded_by: raw.superseded_by ? `decision:${raw.superseded_by}` : undefined,
|
|
11
|
+
source_anchor: sourceAnchor,
|
|
12
|
+
recorded_at: raw.recorded_at ?? new Date(0).toISOString(),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function parseFrontmatter(text) {
|
|
16
|
+
const m = text.match(/^---\n([\s\S]*?)\n---/);
|
|
17
|
+
if (!m)
|
|
18
|
+
return null;
|
|
19
|
+
try {
|
|
20
|
+
const parsed = yaml.load(m[1]);
|
|
21
|
+
if (!parsed || typeof parsed.key !== 'string' || typeof parsed.summary !== 'string')
|
|
22
|
+
return null;
|
|
23
|
+
return parsed;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function parseDecisions(cwd) {
|
|
30
|
+
const out = [];
|
|
31
|
+
const jsonlPath = join(cwd, 'decisions.jsonl');
|
|
32
|
+
if (existsSync(jsonlPath)) {
|
|
33
|
+
for (const line of readFileSync(jsonlPath, 'utf8').split('\n')) {
|
|
34
|
+
if (!line.trim())
|
|
35
|
+
continue;
|
|
36
|
+
try {
|
|
37
|
+
const raw = JSON.parse(line);
|
|
38
|
+
if (typeof raw.key === 'string' && typeof raw.summary === 'string') {
|
|
39
|
+
out.push(toDecision(raw, 'decisions.jsonl'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// skip malformed lines
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const decisionsDir = join(cwd, 'docs', 'decisions');
|
|
48
|
+
if (existsSync(decisionsDir)) {
|
|
49
|
+
for (const file of readdirSync(decisionsDir)) {
|
|
50
|
+
if (!file.endsWith('.md'))
|
|
51
|
+
continue;
|
|
52
|
+
const text = readFileSync(join(decisionsDir, file), 'utf8');
|
|
53
|
+
const fm = parseFrontmatter(text);
|
|
54
|
+
if (fm)
|
|
55
|
+
out.push(toDecision(fm, `docs/decisions/${file}`));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=decision-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-parser.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/decision-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/decision-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } 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 { parseDecisions } from './decision-parser.js';
|
|
6
|
+
describe('parseDecisions', () => {
|
|
7
|
+
let dir;
|
|
8
|
+
beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'observe-dec-')); });
|
|
9
|
+
afterEach(() => { rmSync(dir, { recursive: true, force: true }); });
|
|
10
|
+
it('reads decisions.jsonl entries', async () => {
|
|
11
|
+
const line1 = JSON.stringify({
|
|
12
|
+
key: 'use-postgres', summary: 'Use Postgres for primary store',
|
|
13
|
+
affects: ['src/db/**'], recorded_at: '2026-04-29T00:00:00Z',
|
|
14
|
+
});
|
|
15
|
+
const line2 = JSON.stringify({
|
|
16
|
+
key: 'caching-strategy', summary: 'TTL=60s', affects: ['src/cache/**'],
|
|
17
|
+
superseded_by: 'caching-strategy-v2', recorded_at: '2026-04-29T01:00:00Z',
|
|
18
|
+
});
|
|
19
|
+
writeFileSync(join(dir, 'decisions.jsonl'), `${line1}\n${line2}\n`);
|
|
20
|
+
const decs = await parseDecisions(dir);
|
|
21
|
+
expect(decs).toHaveLength(2);
|
|
22
|
+
expect(decs[0]).toMatchObject({
|
|
23
|
+
id: 'decision:use-postgres',
|
|
24
|
+
key: 'use-postgres',
|
|
25
|
+
summary: 'Use Postgres for primary store',
|
|
26
|
+
affects: ['src/db/**'],
|
|
27
|
+
source_anchor: 'decisions.jsonl',
|
|
28
|
+
});
|
|
29
|
+
expect(decs[1].superseded_by).toBe('decision:caching-strategy-v2');
|
|
30
|
+
});
|
|
31
|
+
it('reads decisions from docs/decisions/*.md frontmatter', async () => {
|
|
32
|
+
mkdirSync(join(dir, 'docs/decisions'), { recursive: true });
|
|
33
|
+
writeFileSync(join(dir, 'docs/decisions/use-redis.md'), [
|
|
34
|
+
'---',
|
|
35
|
+
'key: use-redis',
|
|
36
|
+
'summary: Add Redis for hot-path caching',
|
|
37
|
+
'affects: ["src/cache/**", "src/api/handler.ts"]',
|
|
38
|
+
'recorded_at: 2026-04-30T00:00:00Z',
|
|
39
|
+
'---',
|
|
40
|
+
'',
|
|
41
|
+
'## Context',
|
|
42
|
+
'We need a cache.',
|
|
43
|
+
'',
|
|
44
|
+
].join('\n'));
|
|
45
|
+
const decs = await parseDecisions(dir);
|
|
46
|
+
expect(decs).toHaveLength(1);
|
|
47
|
+
expect(decs[0]).toMatchObject({
|
|
48
|
+
id: 'decision:use-redis',
|
|
49
|
+
summary: 'Add Redis for hot-path caching',
|
|
50
|
+
affects: ['src/cache/**', 'src/api/handler.ts'],
|
|
51
|
+
source_anchor: 'docs/decisions/use-redis.md',
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it('returns empty array when no decision sources exist', async () => {
|
|
55
|
+
expect(await parseDecisions(dir)).toEqual([]);
|
|
56
|
+
});
|
|
57
|
+
it('skips malformed JSONL lines without throwing', async () => {
|
|
58
|
+
writeFileSync(join(dir, 'decisions.jsonl'), '{"key":"good","summary":"ok","affects":[],"recorded_at":"2026-04-30T00:00:00Z"}\n' +
|
|
59
|
+
'not-json\n' +
|
|
60
|
+
'{"key":"good2","summary":"ok2","affects":[],"recorded_at":"2026-04-30T00:01:00Z"}\n');
|
|
61
|
+
const decs = await parseDecisions(dir);
|
|
62
|
+
expect(decs.map((d) => d.key)).toEqual(['good', 'good2']);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=decision-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-parser.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/decision-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const COLOR_PROPS: Set<string>;
|
|
2
|
+
export declare const SPACING_PROPS: Set<string>;
|
|
3
|
+
export declare const TYPOGRAPHY_PROPS: Set<string>;
|
|
4
|
+
export declare const SHADOW_PROPS: Set<string>;
|
|
5
|
+
export declare const RADIUS_PROPS: Set<string>;
|
|
6
|
+
export declare const MOTION_PROPS: Set<string>;
|
|
7
|
+
export type DesignCategory = 'color' | 'spacing' | 'typography' | 'shadow' | 'radius' | 'motion';
|
|
8
|
+
export declare function categoryOfProp(prop: string | undefined): DesignCategory | null;
|
|
9
|
+
//# sourceMappingURL=design-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-props.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/design-props.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,aAMtB,CAAA;AAEF,eAAO,MAAM,aAAa,aAMxB,CAAA;AAEF,eAAO,MAAM,gBAAgB,aAI3B,CAAA;AAEF,eAAO,MAAM,YAAY,aAEvB,CAAA;AAEF,eAAO,MAAM,YAAY,aAGvB,CAAA;AAEF,eAAO,MAAM,YAAY,aAIvB,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAEhG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAU9E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export const COLOR_PROPS = new Set([
|
|
2
|
+
'color', 'background', 'background-color', 'border-color', 'border-top-color',
|
|
3
|
+
'border-right-color', 'border-bottom-color', 'border-left-color',
|
|
4
|
+
'border', 'border-top', 'border-right', 'border-bottom', 'border-left',
|
|
5
|
+
'outline-color', 'text-decoration-color', 'fill', 'stroke', 'caret-color',
|
|
6
|
+
'column-rule-color', 'accent-color',
|
|
7
|
+
]);
|
|
8
|
+
export const SPACING_PROPS = new Set([
|
|
9
|
+
'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',
|
|
10
|
+
'padding', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left',
|
|
11
|
+
'gap', 'row-gap', 'column-gap', 'top', 'right', 'bottom', 'left',
|
|
12
|
+
'border-width', 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width',
|
|
13
|
+
'outline-width', 'outline-offset', 'inset', 'flex-basis', 'border-spacing',
|
|
14
|
+
]);
|
|
15
|
+
export const TYPOGRAPHY_PROPS = new Set([
|
|
16
|
+
'font', 'font-size', 'font-family', 'font-weight', 'font-style', 'font-variant',
|
|
17
|
+
'line-height', 'letter-spacing', 'word-spacing', 'text-indent',
|
|
18
|
+
'text-decoration', 'text-transform', 'vertical-align',
|
|
19
|
+
]);
|
|
20
|
+
export const SHADOW_PROPS = new Set([
|
|
21
|
+
'box-shadow', 'text-shadow',
|
|
22
|
+
]);
|
|
23
|
+
export const RADIUS_PROPS = new Set([
|
|
24
|
+
'border-radius', 'border-top-left-radius', 'border-top-right-radius',
|
|
25
|
+
'border-bottom-left-radius', 'border-bottom-right-radius',
|
|
26
|
+
]);
|
|
27
|
+
export const MOTION_PROPS = new Set([
|
|
28
|
+
'transition', 'transition-duration', 'transition-property', 'transition-timing-function',
|
|
29
|
+
'transition-delay', 'animation', 'animation-duration', 'animation-name',
|
|
30
|
+
'animation-timing-function', 'animation-delay', 'transform',
|
|
31
|
+
]);
|
|
32
|
+
export function categoryOfProp(prop) {
|
|
33
|
+
if (!prop)
|
|
34
|
+
return null;
|
|
35
|
+
const p = prop.toLowerCase();
|
|
36
|
+
if (COLOR_PROPS.has(p))
|
|
37
|
+
return 'color';
|
|
38
|
+
if (SPACING_PROPS.has(p))
|
|
39
|
+
return 'spacing';
|
|
40
|
+
if (TYPOGRAPHY_PROPS.has(p))
|
|
41
|
+
return 'typography';
|
|
42
|
+
if (SHADOW_PROPS.has(p))
|
|
43
|
+
return 'shadow';
|
|
44
|
+
if (RADIUS_PROPS.has(p))
|
|
45
|
+
return 'radius';
|
|
46
|
+
if (MOTION_PROPS.has(p))
|
|
47
|
+
return 'motion';
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=design-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-props.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/design-props.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB;IAC7E,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB;IAChE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa;IACtE,eAAe,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IACzE,mBAAmB,EAAE,cAAc;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa;IACtE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc;IAC3E,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;IAChE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,mBAAmB;IACpG,eAAe,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB;CAC3E,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc;IAC/E,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa;IAC9D,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB;CACtD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY,EAAE,aAAa;CAC5B,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,eAAe,EAAE,wBAAwB,EAAE,yBAAyB;IACpE,2BAA2B,EAAE,4BAA4B;CAC1D,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,4BAA4B;IACxF,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB;IACvE,2BAA2B,EAAE,iBAAiB,EAAE,WAAW;CAC5D,CAAC,CAAA;AAIF,MAAM,UAAU,cAAc,CAAC,IAAwB;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAC5B,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA;IACtC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAA;IAChD,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAA;IACxC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAA;IACxC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAA;IACxC,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Feature, Story, AcceptanceCriterion, PlanTask, PlaybookTask, Test, FileNode, Decision, PullRequest, Edge } from '../types.js';
|
|
2
|
+
import type { TokenUse } from './token-use-detector.js';
|
|
3
|
+
import type { ComponentUse } from './component-use-detector.js';
|
|
4
|
+
export interface BuildEdgesInput {
|
|
5
|
+
features: Feature[];
|
|
6
|
+
stories: Story[];
|
|
7
|
+
acs: AcceptanceCriterion[];
|
|
8
|
+
plan_tasks: PlanTask[];
|
|
9
|
+
playbook_tasks: PlaybookTask[];
|
|
10
|
+
tests: Test[];
|
|
11
|
+
files: FileNode[];
|
|
12
|
+
decisions: Decision[];
|
|
13
|
+
pull_requests?: PullRequest[];
|
|
14
|
+
ac_to_test_overrides?: Record<string, string[]>;
|
|
15
|
+
pr_to_files?: Record<number, string[]>;
|
|
16
|
+
playbook_task_to_pr?: Record<string, number[]>;
|
|
17
|
+
token_uses?: TokenUse[];
|
|
18
|
+
component_uses?: ComponentUse[];
|
|
19
|
+
}
|
|
20
|
+
export interface BuildEdgesResult {
|
|
21
|
+
edges: Edge[];
|
|
22
|
+
unresolved_globs: Array<{
|
|
23
|
+
decision_id: string;
|
|
24
|
+
glob: string;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
export declare function buildEdges(input: BuildEdgesInput): BuildEdgesResult;
|
|
28
|
+
//# sourceMappingURL=edge-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-builder.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/edge-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EACzG,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,GAAG,EAAE,mBAAmB,EAAE,CAAA;IAC1B,UAAU,EAAE,QAAQ,EAAE,CAAA;IACtB,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,WAAW,EAAE,CAAA;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACtC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAA;IACvB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAA;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,gBAAgB,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA2EnE"}
|