@zigrivers/scaffold 3.25.1 → 3.27.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 +139 -7
- package/content/knowledge/web3/web3-access-control.md +189 -0
- package/content/knowledge/web3/web3-architecture.md +162 -0
- package/content/knowledge/web3/web3-audit-workflow.md +151 -0
- package/content/knowledge/web3/web3-common-vulnerabilities.md +171 -0
- package/content/knowledge/web3/web3-conventions.md +162 -0
- package/content/knowledge/web3/web3-deployment-and-verification.md +216 -0
- package/content/knowledge/web3/web3-dev-environment.md +150 -0
- package/content/knowledge/web3/web3-gas-optimization.md +165 -0
- package/content/knowledge/web3/web3-oracles-and-external-data.md +155 -0
- package/content/knowledge/web3/web3-project-structure.md +212 -0
- package/content/knowledge/web3/web3-requirements.md +152 -0
- package/content/knowledge/web3/web3-security.md +163 -0
- package/content/knowledge/web3/web3-testing.md +180 -0
- package/content/knowledge/web3/web3-upgradeability.md +189 -0
- package/content/methodology/web3-overlay.yml +40 -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/config/schema.d.ts +672 -126
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +8 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +2 -2
- package/dist/config/schema.test.js.map +1 -1
- package/dist/config/validators/index.d.ts.map +1 -1
- package/dist/config/validators/index.js +2 -0
- package/dist/config/validators/index.js.map +1 -1
- package/dist/config/validators/web3.d.ts +4 -0
- package/dist/config/validators/web3.d.ts.map +1 -0
- package/dist/config/validators/web3.js +15 -0
- package/dist/config/validators/web3.js.map +1 -0
- package/dist/e2e/project-type-overlays.test.js +76 -0
- package/dist/e2e/project-type-overlays.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/project/adopt.d.ts.map +1 -1
- package/dist/project/adopt.js +3 -1
- package/dist/project/adopt.js.map +1 -1
- package/dist/project/detectors/coverage.test.js +3 -2
- package/dist/project/detectors/coverage.test.js.map +1 -1
- package/dist/project/detectors/disambiguate.js +1 -1
- package/dist/project/detectors/disambiguate.js.map +1 -1
- package/dist/project/detectors/index.d.ts.map +1 -1
- package/dist/project/detectors/index.js +2 -0
- package/dist/project/detectors/index.js.map +1 -1
- package/dist/project/detectors/resolve-detection.test.js +57 -0
- package/dist/project/detectors/resolve-detection.test.js.map +1 -1
- package/dist/project/detectors/types.d.ts +6 -2
- package/dist/project/detectors/types.d.ts.map +1 -1
- package/dist/project/detectors/types.js.map +1 -1
- package/dist/project/detectors/web3.d.ts +4 -0
- package/dist/project/detectors/web3.d.ts.map +1 -0
- package/dist/project/detectors/web3.js +37 -0
- package/dist/project/detectors/web3.js.map +1 -0
- package/dist/project/detectors/web3.test.d.ts +2 -0
- package/dist/project/detectors/web3.test.d.ts.map +1 -0
- package/dist/project/detectors/web3.test.js +75 -0
- package/dist/project/detectors/web3.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/config.d.ts +8 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/state.d.ts +2 -0
- package/dist/types/state.d.ts.map +1 -1
- package/dist/wizard/copy/core.d.ts.map +1 -1
- package/dist/wizard/copy/core.js +4 -0
- package/dist/wizard/copy/core.js.map +1 -1
- package/dist/wizard/copy/index.d.ts.map +1 -1
- package/dist/wizard/copy/index.js +2 -0
- package/dist/wizard/copy/index.js.map +1 -1
- package/dist/wizard/copy/types.d.ts +5 -1
- package/dist/wizard/copy/types.d.ts.map +1 -1
- package/dist/wizard/copy/types.test-d.js +7 -0
- package/dist/wizard/copy/types.test-d.js.map +1 -1
- package/dist/wizard/copy/web3.d.ts +3 -0
- package/dist/wizard/copy/web3.d.ts.map +1 -0
- package/dist/wizard/copy/web3.js +15 -0
- package/dist/wizard/copy/web3.js.map +1 -0
- package/dist/wizard/questions.d.ts +2 -1
- package/dist/wizard/questions.d.ts.map +1 -1
- package/dist/wizard/questions.js +8 -1
- package/dist/wizard/questions.js.map +1 -1
- package/dist/wizard/questions.test.js +14 -0
- package/dist/wizard/questions.test.js.map +1 -1
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +1 -0
- package/dist/wizard/wizard.js.map +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1,82 @@
|
|
|
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 { buildDocGraph } from './index.js';
|
|
6
|
+
describe('buildDocGraph', () => {
|
|
7
|
+
let dir;
|
|
8
|
+
beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'observe-graph-')); });
|
|
9
|
+
afterEach(() => { rmSync(dir, { recursive: true, force: true }); });
|
|
10
|
+
it('produces a complete graph from a small project fixture', async () => {
|
|
11
|
+
mkdirSync(join(dir, 'docs'), { recursive: true });
|
|
12
|
+
mkdirSync(join(dir, 'src/auth'), { recursive: true });
|
|
13
|
+
writeFileSync(join(dir, 'package.json'), JSON.stringify({ scripts: { test: 'vitest run' } }));
|
|
14
|
+
writeFileSync(join(dir, 'docs/plan.md'), '# PRD\n\n## Features\n\n### User Auth [priority: must]\n\nUsers sign in.\n');
|
|
15
|
+
writeFileSync(join(dir, 'docs/user-stories.md'), '# Stories\n\n## Story user-auth-1: Sign in [priority: must]\n\n' +
|
|
16
|
+
'### AC 1: signs in\nGiven valid credentials, the user signs in.\n');
|
|
17
|
+
writeFileSync(join(dir, 'docs/implementation-plan.md'), '# Plan\n\n## Task T-001: Login form [story: user-auth-1] [status: done]\n');
|
|
18
|
+
writeFileSync(join(dir, 'src/auth/login.test.ts'), 'import { it, expect } from \'vitest\'\nit(\'AC 1: signs in\', () => { expect(1).toBe(1) })\n');
|
|
19
|
+
const graph = await buildDocGraph(dir);
|
|
20
|
+
expect(graph.features).toHaveLength(1);
|
|
21
|
+
expect(graph.stories).toHaveLength(1);
|
|
22
|
+
expect(graph.acceptance_criteria).toHaveLength(1);
|
|
23
|
+
expect(graph.plan_tasks).toHaveLength(1);
|
|
24
|
+
expect(graph.tests.length).toBeGreaterThanOrEqual(1);
|
|
25
|
+
expect(graph.edges.find((e) => e.kind === 'story_to_ac')).toBeDefined();
|
|
26
|
+
expect(graph.edges.find((e) => e.kind === 'story_to_plan_task')).toBeDefined();
|
|
27
|
+
expect(graph.edges.find((e) => e.kind === 'test_to_file')).toBeDefined();
|
|
28
|
+
expect(graph.provenance['feature:user-auth']).toBe('pipeline_docs');
|
|
29
|
+
expect(graph.provenance[graph.tests[0].id]).toBe('git');
|
|
30
|
+
});
|
|
31
|
+
it('returns an empty graph when no docs exist', async () => {
|
|
32
|
+
writeFileSync(join(dir, 'package.json'), '{}');
|
|
33
|
+
const graph = await buildDocGraph(dir);
|
|
34
|
+
expect(graph.features).toEqual([]);
|
|
35
|
+
expect(graph.stories).toEqual([]);
|
|
36
|
+
expect(graph.edges).toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
it('emits file_to_token_use and file_to_component_use edges when detectors match', async () => {
|
|
39
|
+
mkdirSync(join(dir, 'docs'), { recursive: true });
|
|
40
|
+
mkdirSync(join(dir, 'src/styles'), { recursive: true });
|
|
41
|
+
mkdirSync(join(dir, 'src/lib'), { recursive: true });
|
|
42
|
+
mkdirSync(join(dir, '.scaffold'), { recursive: true });
|
|
43
|
+
writeFileSync(join(dir, 'package.json'), '{}');
|
|
44
|
+
writeFileSync(join(dir, 'docs/design-system.md'), [
|
|
45
|
+
'# Design System',
|
|
46
|
+
'',
|
|
47
|
+
'## Color',
|
|
48
|
+
'',
|
|
49
|
+
'| Token | Value | Priority |',
|
|
50
|
+
'|-------|-------|----------|',
|
|
51
|
+
'| --color-primary | #4f46e5 | must |',
|
|
52
|
+
'',
|
|
53
|
+
].join('\n'));
|
|
54
|
+
writeFileSync(join(dir, 'docs/tech-stack.md'), [
|
|
55
|
+
'# Tech Stack',
|
|
56
|
+
'',
|
|
57
|
+
'## Frontend',
|
|
58
|
+
'',
|
|
59
|
+
'### React',
|
|
60
|
+
'',
|
|
61
|
+
'package_or_url: react@18',
|
|
62
|
+
'layer: frontend',
|
|
63
|
+
'',
|
|
64
|
+
].join('\n'));
|
|
65
|
+
writeFileSync(join(dir, 'src/styles/btn.css'), '.btn { color: #4f46e5; background: #abcdef; }\n');
|
|
66
|
+
writeFileSync(join(dir, 'src/lib/auth.ts'), 'import React from \'react\'\nimport { something } from \'unknown-pkg\'\n');
|
|
67
|
+
writeFileSync(join(dir, '.scaffold/observability.yaml'), [
|
|
68
|
+
'lenses:',
|
|
69
|
+
' E-design:',
|
|
70
|
+
' ui_glob: "src/styles/**/*.css,src/styles/**/*.scss"',
|
|
71
|
+
].join('\n'));
|
|
72
|
+
const graph = await buildDocGraph(dir);
|
|
73
|
+
const tokenEdge = graph.edges.find((e) => e.kind === 'file_to_token_use');
|
|
74
|
+
expect(tokenEdge).toBeDefined();
|
|
75
|
+
expect(tokenEdge?.from).toBe('file:src/styles/btn.css');
|
|
76
|
+
const componentEdges = graph.edges.filter((e) => e.kind === 'file_to_component_use');
|
|
77
|
+
expect(componentEdges.length).toBeGreaterThanOrEqual(2);
|
|
78
|
+
expect(componentEdges.find((e) => e.to === 'component:react')).toBeDefined();
|
|
79
|
+
expect(componentEdges.find((e) => e.to.startsWith('unsanctioned'))).toBeDefined();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Root, Heading, RootContent } from 'mdast';
|
|
2
|
+
export interface AnnotatedHeading {
|
|
3
|
+
node: Heading;
|
|
4
|
+
textContent: string;
|
|
5
|
+
depth: number;
|
|
6
|
+
startIndex: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseMarkdown(input: string): Root;
|
|
9
|
+
export declare function headingsAtDepth(root: Root, depth: number): AnnotatedHeading[];
|
|
10
|
+
export declare function sectionAfterHeading(root: Root, heading: AnnotatedHeading): string;
|
|
11
|
+
export declare function sectionRawText(root: Root, heading: AnnotatedHeading): string;
|
|
12
|
+
export declare function sectionNodes(root: Root, heading: AnnotatedHeading): RootContent[];
|
|
13
|
+
export declare function extractInlineTags(text: string): Record<string, string>;
|
|
14
|
+
export declare function slugify(text: string): string;
|
|
15
|
+
//# sourceMappingURL=parse-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-markdown.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/parse-markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjD;AAiBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAS7E;AAeD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAIjF;AAID,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAG5E;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,WAAW,EAAE,CAGjF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS5C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { unified } from 'unified';
|
|
2
|
+
import remarkParse from 'remark-parse';
|
|
3
|
+
import remarkGfm from 'remark-gfm';
|
|
4
|
+
import remarkStringify from 'remark-stringify';
|
|
5
|
+
const parser = unified().use(remarkParse).use(remarkGfm).use(remarkStringify, { bullet: '-' });
|
|
6
|
+
export function parseMarkdown(input) {
|
|
7
|
+
return parser.parse(input);
|
|
8
|
+
}
|
|
9
|
+
function nodeText(node) {
|
|
10
|
+
if (node.type === 'text' || node.type === 'inlineCode')
|
|
11
|
+
return node.value;
|
|
12
|
+
// Put each list item on its own line so field-extraction regexes work.
|
|
13
|
+
if (node.type === 'listItem') {
|
|
14
|
+
return (node.children).map(nodeText).join('').trim();
|
|
15
|
+
}
|
|
16
|
+
if (node.type === 'list') {
|
|
17
|
+
return (node.children).map(nodeText).join('\n').trim();
|
|
18
|
+
}
|
|
19
|
+
if ('children' in node && Array.isArray(node.children)) {
|
|
20
|
+
return (node.children).map(nodeText).join('');
|
|
21
|
+
}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
export function headingsAtDepth(root, depth) {
|
|
25
|
+
const out = [];
|
|
26
|
+
for (let i = 0; i < root.children.length; i++) {
|
|
27
|
+
const c = root.children[i];
|
|
28
|
+
if (c.type === 'heading' && c.depth === depth) {
|
|
29
|
+
out.push({ node: c, textContent: nodeText(c).trim(), depth, startIndex: i });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function sectionRange(root, heading) {
|
|
35
|
+
const start = heading.startIndex + 1;
|
|
36
|
+
let end = root.children.length;
|
|
37
|
+
for (let i = start; i < root.children.length; i++) {
|
|
38
|
+
const c = root.children[i];
|
|
39
|
+
if (c.type === 'heading' && c.depth <= heading.depth) {
|
|
40
|
+
end = i;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return [start, end];
|
|
45
|
+
}
|
|
46
|
+
export function sectionAfterHeading(root, heading) {
|
|
47
|
+
const [start, end] = sectionRange(root, heading);
|
|
48
|
+
const slice = { type: 'root', children: root.children.slice(start, end) };
|
|
49
|
+
return parser.stringify(slice).trim();
|
|
50
|
+
}
|
|
51
|
+
// Returns raw text content of the section using AST-level text extraction
|
|
52
|
+
// (avoids remark-stringify escaping, preserves inline code verbatim).
|
|
53
|
+
export function sectionRawText(root, heading) {
|
|
54
|
+
const [start, end] = sectionRange(root, heading);
|
|
55
|
+
return root.children.slice(start, end).map((n) => nodeText(n)).join('\n\n').trim();
|
|
56
|
+
}
|
|
57
|
+
// Returns raw AST nodes in the section.
|
|
58
|
+
export function sectionNodes(root, heading) {
|
|
59
|
+
const [start, end] = sectionRange(root, heading);
|
|
60
|
+
return root.children.slice(start, end);
|
|
61
|
+
}
|
|
62
|
+
export function extractInlineTags(text) {
|
|
63
|
+
const tags = {};
|
|
64
|
+
for (const match of text.matchAll(/\[([a-z_][a-z0-9_-]*)\s*:\s*([^\]]+?)\s*\]/gi)) {
|
|
65
|
+
tags[match[1]] = match[2].trim();
|
|
66
|
+
}
|
|
67
|
+
return tags;
|
|
68
|
+
}
|
|
69
|
+
export function slugify(text) {
|
|
70
|
+
return text
|
|
71
|
+
.toLowerCase()
|
|
72
|
+
.replace(/\[[^\]]*\]/g, '') // strip inline tags
|
|
73
|
+
.replace(/[^\w\s-]+/g, ' ') // remove non-word chars including em-dash
|
|
74
|
+
.trim()
|
|
75
|
+
.replace(/\s+/g, '-')
|
|
76
|
+
.replace(/-+/g, '-')
|
|
77
|
+
.replace(/^-+|-+$/g, '');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=parse-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-markdown.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/parse-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-markdown.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/parse-markdown.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseMarkdown, headingsAtDepth, sectionAfterHeading, slugify, extractInlineTags } from './parse-markdown.js';
|
|
3
|
+
describe('parse-markdown', () => {
|
|
4
|
+
const sample = `# Title
|
|
5
|
+
|
|
6
|
+
Some intro text.
|
|
7
|
+
|
|
8
|
+
## First Heading [priority: must]
|
|
9
|
+
|
|
10
|
+
Body of first section.
|
|
11
|
+
|
|
12
|
+
### Sub heading
|
|
13
|
+
|
|
14
|
+
More content.
|
|
15
|
+
|
|
16
|
+
## Second Heading [priority: should]
|
|
17
|
+
|
|
18
|
+
Final section.
|
|
19
|
+
`;
|
|
20
|
+
it('parseMarkdown returns a remark AST root', () => {
|
|
21
|
+
const root = parseMarkdown(sample);
|
|
22
|
+
expect(root.type).toBe('root');
|
|
23
|
+
expect(root.children.length).toBeGreaterThan(0);
|
|
24
|
+
});
|
|
25
|
+
it('headingsAtDepth(2) returns the two ## headings with their text', () => {
|
|
26
|
+
const root = parseMarkdown(sample);
|
|
27
|
+
const h2s = headingsAtDepth(root, 2);
|
|
28
|
+
expect(h2s.map((h) => h.textContent)).toEqual([
|
|
29
|
+
'First Heading [priority: must]',
|
|
30
|
+
'Second Heading [priority: should]',
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
it('sectionAfterHeading returns markdown text until the next same-or-higher heading', () => {
|
|
34
|
+
const root = parseMarkdown(sample);
|
|
35
|
+
const h2s = headingsAtDepth(root, 2);
|
|
36
|
+
const body = sectionAfterHeading(root, h2s[0]);
|
|
37
|
+
expect(body).toContain('Body of first section.');
|
|
38
|
+
expect(body).toContain('Sub heading');
|
|
39
|
+
expect(body).not.toContain('Final section.');
|
|
40
|
+
});
|
|
41
|
+
it('extractInlineTags pulls [key: value] tags from a heading text', () => {
|
|
42
|
+
const tags = extractInlineTags('First Heading [priority: must] [kind: ui]');
|
|
43
|
+
expect(tags).toEqual({ priority: 'must', kind: 'ui' });
|
|
44
|
+
});
|
|
45
|
+
it('slugify produces stable kebab-case ids', () => {
|
|
46
|
+
expect(slugify('First Heading [priority: must]')).toBe('first-heading');
|
|
47
|
+
expect(slugify('User Auth — Login & Signup')).toBe('user-auth-login-signup');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=parse-markdown.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-markdown.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/parse-markdown.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAErH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;CAehB,CAAA;IAEC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YAC5C,gCAAgC;YAChC,mCAAmC;SACpC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACpC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GAAG,iBAAiB,CAAC,2CAA2C,CAAC,CAAA;QAC3E,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvE,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-task-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/plan-task-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAU3C,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,SAAgC,GAAG,QAAQ,EAAE,CA6BjG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { parseMarkdown, extractInlineTags } from './parse-markdown.js';
|
|
2
|
+
const VALID_STATUS = ['todo', 'in_flight', 'done', 'skipped'];
|
|
3
|
+
function headingText(h) {
|
|
4
|
+
return h.children.map((c) => ('value' in c ? c.value : '')).join('').trim();
|
|
5
|
+
}
|
|
6
|
+
export function parsePlanTasks(md, sourcePath = 'docs/implementation-plan.md') {
|
|
7
|
+
const root = parseMarkdown(md);
|
|
8
|
+
const tasks = [];
|
|
9
|
+
for (const node of root.children) {
|
|
10
|
+
if (node.type !== 'heading')
|
|
11
|
+
continue;
|
|
12
|
+
const h = node;
|
|
13
|
+
if (h.depth !== 2 && h.depth !== 3)
|
|
14
|
+
continue;
|
|
15
|
+
const text = headingText(h);
|
|
16
|
+
const m = text.match(/^Task\s+([A-Za-z0-9][\w-]+):\s*(.+?)(?:\s*\[.*)?$/);
|
|
17
|
+
if (!m)
|
|
18
|
+
continue;
|
|
19
|
+
const [, key, rawTitle] = m;
|
|
20
|
+
const title = rawTitle.replace(/\s*\[[^\]]*\]\s*$/g, '').trim();
|
|
21
|
+
const tags = extractInlineTags(text);
|
|
22
|
+
const status = VALID_STATUS.includes(tags.status)
|
|
23
|
+
? tags.status
|
|
24
|
+
: 'todo';
|
|
25
|
+
tasks.push({
|
|
26
|
+
id: `plan_task:${key}`,
|
|
27
|
+
title,
|
|
28
|
+
status,
|
|
29
|
+
story_id: tags.story
|
|
30
|
+
? (tags.story.startsWith('story:') ? tags.story : `story:${tags.story}`)
|
|
31
|
+
: undefined,
|
|
32
|
+
wave: tags.wave,
|
|
33
|
+
source_anchor: `${sourcePath}#task-${key.toLowerCase()}`,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return tasks;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=plan-task-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-task-parser.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/plan-task-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGtE,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAU,CAAA;AAEtE,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAQ,CAAC,CAAC,QAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAE,CAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AACvH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,UAAU,GAAG,6BAA6B;IACnF,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAe,EAAE,CAAA;IAE5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAQ;QACrC,MAAM,CAAC,GAAG,IAAe,CAAA;QACzB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;YAAE,SAAQ;QAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;QACzE,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,MAAM,GAAI,YAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACtE,CAAC,CAAE,IAAI,CAAC,MAA6B;YACrC,CAAC,CAAC,MAAM,CAAA;QACV,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,aAAa,GAAG,EAAE;YACtB,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,KAAK;gBAClB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxE,CAAC,CAAC,SAAS;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,GAAG,UAAU,SAAS,GAAG,CAAC,WAAW,EAAE,EAAE;SACzD,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-task-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/plan-task-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parsePlanTasks } from './plan-task-parser.js';
|
|
3
|
+
describe('parsePlanTasks', () => {
|
|
4
|
+
it('extracts tasks from H2 with story/wave/status tags', () => {
|
|
5
|
+
const md = `# Implementation Plan
|
|
6
|
+
|
|
7
|
+
## Task T-001: Build login form [story: user-auth-1] [wave: wave-1] [status: done]
|
|
8
|
+
|
|
9
|
+
Files: src/auth/login.tsx
|
|
10
|
+
ACs: 1.1, 1.2
|
|
11
|
+
|
|
12
|
+
## Task T-002: Server-side validation [story: user-auth-1] [wave: wave-1]
|
|
13
|
+
|
|
14
|
+
(no status tag → todo)
|
|
15
|
+
|
|
16
|
+
## Task T-003: Password reset [story: user-auth-2] [wave: wave-2] [status: in_flight]
|
|
17
|
+
`;
|
|
18
|
+
const tasks = parsePlanTasks(md);
|
|
19
|
+
expect(tasks).toHaveLength(3);
|
|
20
|
+
expect(tasks[0]).toMatchObject({
|
|
21
|
+
id: 'plan_task:T-001',
|
|
22
|
+
title: 'Build login form',
|
|
23
|
+
status: 'done',
|
|
24
|
+
story_id: 'story:user-auth-1',
|
|
25
|
+
wave: 'wave-1',
|
|
26
|
+
source_anchor: 'docs/implementation-plan.md#task-t-001',
|
|
27
|
+
});
|
|
28
|
+
expect(tasks[1].status).toBe('todo');
|
|
29
|
+
expect(tasks[2].status).toBe('in_flight');
|
|
30
|
+
});
|
|
31
|
+
it('also accepts H3 task headings (deep methodology format)', () => {
|
|
32
|
+
const md = '# Implementation Plan\n\n## Wave 1\n\n### Task T-001: Foo [story: s-1]\nBody.\n';
|
|
33
|
+
const tasks = parsePlanTasks(md);
|
|
34
|
+
expect(tasks).toHaveLength(1);
|
|
35
|
+
expect(tasks[0].id).toBe('plan_task:T-001');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=plan-task-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-task-parser.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/plan-task-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,GAAG;;;;;;;;;;;;CAYd,CAAA;QACG,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,EAAE,EAAE,iBAAiB;YACrB,KAAK,EAAE,kBAAkB;YACzB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,mBAAmB;YAC7B,IAAI,EAAE,QAAQ;YACd,aAAa,EAAE,wCAAwC;SACxD,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,GAAG,iFAAiF,CAAA;QAC5F,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-task-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/playbook-task-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU/C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,SAAoC,GAAG,YAAY,EAAE,CA+B7G"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { parseMarkdown, extractInlineTags } from './parse-markdown.js';
|
|
2
|
+
const VALID_STATUS = ['todo', 'in_flight', 'done', 'skipped'];
|
|
3
|
+
function headingText(h) {
|
|
4
|
+
return h.children.map((c) => ('value' in c ? c.value : '')).join('').trim();
|
|
5
|
+
}
|
|
6
|
+
export function parsePlaybookTasks(md, sourcePath = 'docs/implementation-playbook.md') {
|
|
7
|
+
const root = parseMarkdown(md);
|
|
8
|
+
const out = [];
|
|
9
|
+
for (const node of root.children) {
|
|
10
|
+
if (node.type !== 'heading')
|
|
11
|
+
continue;
|
|
12
|
+
const h = node;
|
|
13
|
+
if (h.depth !== 2 && h.depth !== 3)
|
|
14
|
+
continue;
|
|
15
|
+
const text = headingText(h);
|
|
16
|
+
const m = text.match(/^Task\s+([A-Za-z0-9][\w-]+):\s*(.+?)(?:\s*\[.*)?$/);
|
|
17
|
+
if (!m)
|
|
18
|
+
continue;
|
|
19
|
+
const [, key, rawTitle] = m;
|
|
20
|
+
const title = rawTitle.replace(/\s*\[[^\]]*\]\s*$/g, '').trim();
|
|
21
|
+
const tags = extractInlineTags(text);
|
|
22
|
+
const status = VALID_STATUS.includes(tags.status)
|
|
23
|
+
? tags.status
|
|
24
|
+
: 'todo';
|
|
25
|
+
out.push({
|
|
26
|
+
id: `playbook_task:${key}`,
|
|
27
|
+
title,
|
|
28
|
+
status,
|
|
29
|
+
story_id: tags.story
|
|
30
|
+
? (tags.story.startsWith('story:') ? tags.story : `story:${tags.story}`)
|
|
31
|
+
: undefined,
|
|
32
|
+
plan_task_id: tags.plan_task
|
|
33
|
+
? (tags.plan_task.startsWith('plan_task:') ? tags.plan_task : `plan_task:${tags.plan_task}`)
|
|
34
|
+
: undefined,
|
|
35
|
+
source_anchor: `${sourcePath}#task-${key.toLowerCase()}`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=playbook-task-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-task-parser.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/playbook-task-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGtE,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAU,CAAA;AAEtE,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAQ,CAAC,CAAC,QAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAE,CAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AACvH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,UAAU,GAAG,iCAAiC;IAC3F,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,GAAG,GAAmB,EAAE,CAAA;IAE9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,SAAQ;QACrC,MAAM,CAAC,GAAG,IAAe,CAAA;QACzB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;YAAE,SAAQ;QAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;QACzE,IAAI,CAAC,CAAC;YAAE,SAAQ;QAChB,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,MAAM,GAAI,YAAkC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACtE,CAAC,CAAE,IAAI,CAAC,MAAiC;YACzC,CAAC,CAAC,MAAM,CAAA;QACV,GAAG,CAAC,IAAI,CAAC;YACP,EAAE,EAAE,iBAAiB,GAAG,EAAE;YAC1B,KAAK;YACL,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,KAAK;gBAClB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;gBACxE,CAAC,CAAC,SAAS;YACb,YAAY,EAAE,IAAI,CAAC,SAAS;gBAC1B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5F,CAAC,CAAC,SAAS;YACb,aAAa,EAAE,GAAG,UAAU,SAAS,GAAG,CAAC,WAAW,EAAE,EAAE;SACzD,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-task-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/playbook-task-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parsePlaybookTasks } from './playbook-task-parser.js';
|
|
3
|
+
describe('parsePlaybookTasks', () => {
|
|
4
|
+
it('extracts playbook tasks linking back to plan tasks via [plan_task: ID]', () => {
|
|
5
|
+
const md = `# Playbook
|
|
6
|
+
|
|
7
|
+
## Task T-001: Build login form [plan_task: T-001] [story: user-auth-1] [status: done]
|
|
8
|
+
|
|
9
|
+
Files modified: src/auth/login.tsx
|
|
10
|
+
|
|
11
|
+
## Task TB-001: Hotfix for login crash [story: user-auth-1] [status: done] [unplanned: true]
|
|
12
|
+
|
|
13
|
+
Triaged from prod incident.
|
|
14
|
+
`;
|
|
15
|
+
const tasks = parsePlaybookTasks(md);
|
|
16
|
+
expect(tasks).toHaveLength(2);
|
|
17
|
+
expect(tasks[0]).toMatchObject({
|
|
18
|
+
id: 'playbook_task:T-001',
|
|
19
|
+
title: 'Build login form',
|
|
20
|
+
status: 'done',
|
|
21
|
+
story_id: 'story:user-auth-1',
|
|
22
|
+
plan_task_id: 'plan_task:T-001',
|
|
23
|
+
});
|
|
24
|
+
expect(tasks[1]).toMatchObject({
|
|
25
|
+
id: 'playbook_task:TB-001',
|
|
26
|
+
plan_task_id: undefined,
|
|
27
|
+
story_id: 'story:user-auth-1',
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=playbook-task-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-task-parser.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/playbook-task-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,EAAE,GAAG;;;;;;;;;CASd,CAAA;QACG,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,EAAE,EAAE,qBAAqB;YACzB,KAAK,EAAE,kBAAkB;YACzB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,mBAAmB;YAC7B,YAAY,EAAE,iBAAiB;SAChC,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,EAAE,EAAE,sBAAsB;YAC1B,YAAY,EAAE,SAAS;YACvB,QAAQ,EAAE,mBAAmB;SAC9B,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/rule-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAgCvC,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,CAyBjE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { parseMarkdown, headingsAtDepth, sectionRawText, slugify } from './parse-markdown.js';
|
|
2
|
+
const VALID_SEVERITY = ['P0', 'P1', 'P2', 'P3'];
|
|
3
|
+
const VALID_ENFORCE = ['linter', 'engine', 'llm'];
|
|
4
|
+
function parseRuleSection(body) {
|
|
5
|
+
const out = {};
|
|
6
|
+
const descMatch = body.match(/^Description:\s*(.+?)(?=\n|$)/im);
|
|
7
|
+
if (descMatch)
|
|
8
|
+
out.description = descMatch[1].trim();
|
|
9
|
+
const fieldRe = /^\s*([a-z][\w-]*)\s*:\s*(.+?)\s*$/gim;
|
|
10
|
+
let m;
|
|
11
|
+
while ((m = fieldRe.exec(body)) !== null) {
|
|
12
|
+
const key = m[1].replace(/-/g, '_').toLowerCase();
|
|
13
|
+
const raw = m[2].trim();
|
|
14
|
+
switch (key) {
|
|
15
|
+
case 'pattern':
|
|
16
|
+
out.pattern = raw;
|
|
17
|
+
break;
|
|
18
|
+
case 'forbidden':
|
|
19
|
+
out.forbidden = raw.split(',').map((s) => s.trim()).filter(Boolean);
|
|
20
|
+
break;
|
|
21
|
+
case 'match':
|
|
22
|
+
out.match = raw;
|
|
23
|
+
break;
|
|
24
|
+
case 'language':
|
|
25
|
+
out.language = raw;
|
|
26
|
+
break;
|
|
27
|
+
case 'severity':
|
|
28
|
+
if (VALID_SEVERITY.includes(raw))
|
|
29
|
+
out.severity = raw;
|
|
30
|
+
break;
|
|
31
|
+
case 'enforce_via':
|
|
32
|
+
if (VALID_ENFORCE.includes(raw))
|
|
33
|
+
out.enforce_via = raw;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
export function parseRules(md, sourcePath) {
|
|
40
|
+
const root = parseMarkdown(md);
|
|
41
|
+
const rules = [];
|
|
42
|
+
for (const depth of [2, 3]) {
|
|
43
|
+
for (const head of headingsAtDepth(root, depth)) {
|
|
44
|
+
const m = head.textContent.match(/^Rule:\s*(.+?)\s*$/i);
|
|
45
|
+
if (!m)
|
|
46
|
+
continue;
|
|
47
|
+
const id = `rule:${slugify(m[1])}`;
|
|
48
|
+
const body = sectionRawText(root, head);
|
|
49
|
+
const parsed = parseRuleSection(body);
|
|
50
|
+
rules.push({
|
|
51
|
+
id,
|
|
52
|
+
description: parsed.description ?? m[1],
|
|
53
|
+
pattern: parsed.pattern,
|
|
54
|
+
forbidden: parsed.forbidden,
|
|
55
|
+
match: parsed.match,
|
|
56
|
+
language: parsed.language,
|
|
57
|
+
severity: parsed.severity,
|
|
58
|
+
enforce_via: parsed.enforce_via,
|
|
59
|
+
source_anchor: `${sourcePath}#${slugify(m[1])}`,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return rules;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=rule-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-parser.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/rule-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/rule-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseRules } from './rule-parser.js';
|
|
3
|
+
describe('parseRules', () => {
|
|
4
|
+
it('extracts H3 Rule blocks with structured fields', () => {
|
|
5
|
+
const md = `# Coding Standards
|
|
6
|
+
|
|
7
|
+
## TypeScript
|
|
8
|
+
|
|
9
|
+
### Rule: no-console
|
|
10
|
+
|
|
11
|
+
Description: Avoid \`console.log\` in production source.
|
|
12
|
+
|
|
13
|
+
- pattern: \`console\\.log\\(\`
|
|
14
|
+
- match: src/**/*.ts
|
|
15
|
+
- language: typescript
|
|
16
|
+
- severity: P1
|
|
17
|
+
- enforce-via: linter
|
|
18
|
+
|
|
19
|
+
### Rule: prefer-const
|
|
20
|
+
|
|
21
|
+
Description: Use \`const\` for never-reassigned bindings.
|
|
22
|
+
|
|
23
|
+
- forbidden: let immutable, var
|
|
24
|
+
- language: typescript
|
|
25
|
+
`;
|
|
26
|
+
const rules = parseRules(md, 'docs/coding-standards.md');
|
|
27
|
+
expect(rules).toHaveLength(2);
|
|
28
|
+
expect(rules[0]).toMatchObject({
|
|
29
|
+
id: 'rule:no-console',
|
|
30
|
+
pattern: 'console\\.log\\(',
|
|
31
|
+
match: 'src/**/*.ts',
|
|
32
|
+
language: 'typescript',
|
|
33
|
+
severity: 'P1',
|
|
34
|
+
enforce_via: 'linter',
|
|
35
|
+
});
|
|
36
|
+
expect(rules[0].description).toContain('console.log');
|
|
37
|
+
expect(rules[1].forbidden).toEqual(['let immutable', 'var']);
|
|
38
|
+
});
|
|
39
|
+
it('returns [] when no Rule headings exist', () => {
|
|
40
|
+
const md = '# Coding Standards\n\n## TypeScript\n\nUse TypeScript everywhere.\n';
|
|
41
|
+
expect(parseRules(md, 'docs/coding-standards.md')).toEqual([]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=rule-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-parser.test.js","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/rule-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;CAoBd,CAAA;QACG,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAA;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7B,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE,kBAAkB;YAC3B,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,qEAAqE,CAAA;QAChF,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Story, AcceptanceCriterion } from '../types.js';
|
|
2
|
+
interface ParsedStories {
|
|
3
|
+
stories: Story[];
|
|
4
|
+
acs: AcceptanceCriterion[];
|
|
5
|
+
}
|
|
6
|
+
export declare function parseStories(md: string): ParsedStories;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=story-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-parser.d.ts","sourceRoot":"","sources":["../../../../src/observability/engine/doc-graph/story-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAI7D,UAAU,aAAa;IAAG,OAAO,EAAE,KAAK,EAAE,CAAC;IAAC,GAAG,EAAE,mBAAmB,EAAE,CAAA;CAAE;AA2ExE,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,CAgCtD"}
|