@libar-dev/architect 1.0.0-pre.3
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/CHANGELOG.md +50 -0
- package/LICENSE +25 -0
- package/LICENSE-MCP +62 -0
- package/README.md +147 -0
- package/dist/api/arch-queries.d.ts +95 -0
- package/dist/api/arch-queries.d.ts.map +1 -0
- package/dist/api/arch-queries.js +310 -0
- package/dist/api/arch-queries.js.map +1 -0
- package/dist/api/context-assembler.d.ts +124 -0
- package/dist/api/context-assembler.d.ts.map +1 -0
- package/dist/api/context-assembler.js +472 -0
- package/dist/api/context-assembler.js.map +1 -0
- package/dist/api/context-formatter.d.ts +26 -0
- package/dist/api/context-formatter.d.ts.map +1 -0
- package/dist/api/context-formatter.js +183 -0
- package/dist/api/context-formatter.js.map +1 -0
- package/dist/api/coverage-analyzer.d.ts +38 -0
- package/dist/api/coverage-analyzer.d.ts.map +1 -0
- package/dist/api/coverage-analyzer.js +117 -0
- package/dist/api/coverage-analyzer.js.map +1 -0
- package/dist/api/fuzzy-match.d.ts +75 -0
- package/dist/api/fuzzy-match.d.ts.map +1 -0
- package/dist/api/fuzzy-match.js +150 -0
- package/dist/api/fuzzy-match.js.map +1 -0
- package/dist/api/handoff-generator.d.ts +45 -0
- package/dist/api/handoff-generator.d.ts.map +1 -0
- package/dist/api/handoff-generator.js +139 -0
- package/dist/api/handoff-generator.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +54 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/pattern-helpers.d.ts +51 -0
- package/dist/api/pattern-helpers.d.ts.map +1 -0
- package/dist/api/pattern-helpers.js +84 -0
- package/dist/api/pattern-helpers.js.map +1 -0
- package/dist/api/process-state.d.ts +224 -0
- package/dist/api/process-state.d.ts.map +1 -0
- package/dist/api/process-state.js +308 -0
- package/dist/api/process-state.js.map +1 -0
- package/dist/api/rules-query.d.ts +60 -0
- package/dist/api/rules-query.d.ts.map +1 -0
- package/dist/api/rules-query.js +154 -0
- package/dist/api/rules-query.js.map +1 -0
- package/dist/api/scope-validator.d.ts +56 -0
- package/dist/api/scope-validator.d.ts.map +1 -0
- package/dist/api/scope-validator.js +293 -0
- package/dist/api/scope-validator.js.map +1 -0
- package/dist/api/stub-resolver.d.ts +117 -0
- package/dist/api/stub-resolver.d.ts.map +1 -0
- package/dist/api/stub-resolver.js +154 -0
- package/dist/api/stub-resolver.js.map +1 -0
- package/dist/api/summarize.d.ts +75 -0
- package/dist/api/summarize.d.ts.map +1 -0
- package/dist/api/summarize.js +97 -0
- package/dist/api/summarize.js.map +1 -0
- package/dist/api/types.d.ts +221 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +57 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cache/file-cache.d.ts +72 -0
- package/dist/cache/file-cache.d.ts.map +1 -0
- package/dist/cache/file-cache.js +80 -0
- package/dist/cache/file-cache.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +5 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cli/cli-schema.d.ts +83 -0
- package/dist/cli/cli-schema.d.ts.map +1 -0
- package/dist/cli/cli-schema.js +505 -0
- package/dist/cli/cli-schema.js.map +1 -0
- package/dist/cli/dataset-cache.d.ts +66 -0
- package/dist/cli/dataset-cache.d.ts.map +1 -0
- package/dist/cli/dataset-cache.js +179 -0
- package/dist/cli/dataset-cache.js.map +1 -0
- package/dist/cli/error-handler.d.ts +84 -0
- package/dist/cli/error-handler.d.ts.map +1 -0
- package/dist/cli/error-handler.js +197 -0
- package/dist/cli/error-handler.js.map +1 -0
- package/dist/cli/generate-docs.d.ts +30 -0
- package/dist/cli/generate-docs.d.ts.map +1 -0
- package/dist/cli/generate-docs.js +370 -0
- package/dist/cli/generate-docs.js.map +1 -0
- package/dist/cli/lint-patterns.d.ts +57 -0
- package/dist/cli/lint-patterns.d.ts.map +1 -0
- package/dist/cli/lint-patterns.js +257 -0
- package/dist/cli/lint-patterns.js.map +1 -0
- package/dist/cli/lint-process.d.ts +54 -0
- package/dist/cli/lint-process.d.ts.map +1 -0
- package/dist/cli/lint-process.js +319 -0
- package/dist/cli/lint-process.js.map +1 -0
- package/dist/cli/lint-steps.d.ts +32 -0
- package/dist/cli/lint-steps.d.ts.map +1 -0
- package/dist/cli/lint-steps.js +172 -0
- package/dist/cli/lint-steps.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +22 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +57 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/output-pipeline.d.ts +130 -0
- package/dist/cli/output-pipeline.d.ts.map +1 -0
- package/dist/cli/output-pipeline.js +234 -0
- package/dist/cli/output-pipeline.js.map +1 -0
- package/dist/cli/process-api.d.ts +37 -0
- package/dist/cli/process-api.d.ts.map +1 -0
- package/dist/cli/process-api.js +1550 -0
- package/dist/cli/process-api.js.map +1 -0
- package/dist/cli/repl.d.ts +38 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +239 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/validate-patterns.d.ts +115 -0
- package/dist/cli/validate-patterns.d.ts.map +1 -0
- package/dist/cli/validate-patterns.js +707 -0
- package/dist/cli/validate-patterns.js.map +1 -0
- package/dist/cli/version.d.ts +35 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +64 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/config/config-loader.d.ts +167 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +294 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/defaults.d.ts +92 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +103 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/define-config.d.ts +37 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +38 -0
- package/dist/config/define-config.js.map +1 -0
- package/dist/config/factory.d.ts +79 -0
- package/dist/config/factory.d.ts.map +1 -0
- package/dist/config/factory.js +116 -0
- package/dist/config/factory.js.map +1 -0
- package/dist/config/index.d.ts +45 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +48 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge-sources.d.ts +47 -0
- package/dist/config/merge-sources.d.ts.map +1 -0
- package/dist/config/merge-sources.js +61 -0
- package/dist/config/merge-sources.js.map +1 -0
- package/dist/config/presets.d.ts +115 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/presets.js +119 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/project-config-schema.d.ts +192 -0
- package/dist/config/project-config-schema.d.ts.map +1 -0
- package/dist/config/project-config-schema.js +231 -0
- package/dist/config/project-config-schema.js.map +1 -0
- package/dist/config/project-config.d.ts +229 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +37 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/config/regex-builders.d.ts +49 -0
- package/dist/config/regex-builders.d.ts.map +1 -0
- package/dist/config/regex-builders.js +85 -0
- package/dist/config/regex-builders.js.map +1 -0
- package/dist/config/resolve-config.d.ts +65 -0
- package/dist/config/resolve-config.d.ts.map +1 -0
- package/dist/config/resolve-config.js +150 -0
- package/dist/config/resolve-config.js.map +1 -0
- package/dist/config/types.d.ts +81 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +22 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/workflow-loader.d.ts +90 -0
- package/dist/config/workflow-loader.d.ts.map +1 -0
- package/dist/config/workflow-loader.js +167 -0
- package/dist/config/workflow-loader.js.map +1 -0
- package/dist/extractor/doc-extractor.d.ts +233 -0
- package/dist/extractor/doc-extractor.d.ts.map +1 -0
- package/dist/extractor/doc-extractor.js +481 -0
- package/dist/extractor/doc-extractor.js.map +1 -0
- package/dist/extractor/dual-source-extractor.d.ts +161 -0
- package/dist/extractor/dual-source-extractor.d.ts.map +1 -0
- package/dist/extractor/dual-source-extractor.js +407 -0
- package/dist/extractor/dual-source-extractor.js.map +1 -0
- package/dist/extractor/gherkin-extractor.d.ts +170 -0
- package/dist/extractor/gherkin-extractor.d.ts.map +1 -0
- package/dist/extractor/gherkin-extractor.js +543 -0
- package/dist/extractor/gherkin-extractor.js.map +1 -0
- package/dist/extractor/index.d.ts +7 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +11 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/layer-inference.d.ts +66 -0
- package/dist/extractor/layer-inference.d.ts.map +1 -0
- package/dist/extractor/layer-inference.js +93 -0
- package/dist/extractor/layer-inference.js.map +1 -0
- package/dist/extractor/shape-extractor.d.ts +79 -0
- package/dist/extractor/shape-extractor.d.ts.map +1 -0
- package/dist/extractor/shape-extractor.js +966 -0
- package/dist/extractor/shape-extractor.js.map +1 -0
- package/dist/generators/built-in/cli-recipe-generator.d.ts +30 -0
- package/dist/generators/built-in/cli-recipe-generator.d.ts.map +1 -0
- package/dist/generators/built-in/cli-recipe-generator.js +155 -0
- package/dist/generators/built-in/cli-recipe-generator.js.map +1 -0
- package/dist/generators/built-in/codec-generators.d.ts +29 -0
- package/dist/generators/built-in/codec-generators.d.ts.map +1 -0
- package/dist/generators/built-in/codec-generators.js +195 -0
- package/dist/generators/built-in/codec-generators.js.map +1 -0
- package/dist/generators/built-in/decision-doc-generator.d.ts +204 -0
- package/dist/generators/built-in/decision-doc-generator.d.ts.map +1 -0
- package/dist/generators/built-in/decision-doc-generator.js +654 -0
- package/dist/generators/built-in/decision-doc-generator.js.map +1 -0
- package/dist/generators/built-in/design-review-generator.d.ts +26 -0
- package/dist/generators/built-in/design-review-generator.d.ts.map +1 -0
- package/dist/generators/built-in/design-review-generator.js +94 -0
- package/dist/generators/built-in/design-review-generator.js.map +1 -0
- package/dist/generators/built-in/index.d.ts +22 -0
- package/dist/generators/built-in/index.d.ts.map +1 -0
- package/dist/generators/built-in/index.js +23 -0
- package/dist/generators/built-in/index.js.map +1 -0
- package/dist/generators/built-in/process-api-reference-generator.d.ts +18 -0
- package/dist/generators/built-in/process-api-reference-generator.d.ts.map +1 -0
- package/dist/generators/built-in/process-api-reference-generator.js +85 -0
- package/dist/generators/built-in/process-api-reference-generator.js.map +1 -0
- package/dist/generators/built-in/reference-generators.d.ts +51 -0
- package/dist/generators/built-in/reference-generators.d.ts.map +1 -0
- package/dist/generators/built-in/reference-generators.js +320 -0
- package/dist/generators/built-in/reference-generators.js.map +1 -0
- package/dist/generators/codec-based.d.ts +63 -0
- package/dist/generators/codec-based.d.ts.map +1 -0
- package/dist/generators/codec-based.js +88 -0
- package/dist/generators/codec-based.js.map +1 -0
- package/dist/generators/content-deduplicator.d.ts +114 -0
- package/dist/generators/content-deduplicator.d.ts.map +1 -0
- package/dist/generators/content-deduplicator.js +356 -0
- package/dist/generators/content-deduplicator.js.map +1 -0
- package/dist/generators/index.d.ts +50 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +54 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/orchestrator.d.ts +265 -0
- package/dist/generators/orchestrator.d.ts.map +1 -0
- package/dist/generators/orchestrator.js +570 -0
- package/dist/generators/orchestrator.js.map +1 -0
- package/dist/generators/pipeline/build-pipeline.d.ts +131 -0
- package/dist/generators/pipeline/build-pipeline.d.ts.map +1 -0
- package/dist/generators/pipeline/build-pipeline.js +248 -0
- package/dist/generators/pipeline/build-pipeline.js.map +1 -0
- package/dist/generators/pipeline/context-inference.d.ts +55 -0
- package/dist/generators/pipeline/context-inference.d.ts.map +1 -0
- package/dist/generators/pipeline/context-inference.js +76 -0
- package/dist/generators/pipeline/context-inference.js.map +1 -0
- package/dist/generators/pipeline/index.d.ts +27 -0
- package/dist/generators/pipeline/index.d.ts.map +1 -0
- package/dist/generators/pipeline/index.js +34 -0
- package/dist/generators/pipeline/index.js.map +1 -0
- package/dist/generators/pipeline/merge-patterns.d.ts +33 -0
- package/dist/generators/pipeline/merge-patterns.d.ts.map +1 -0
- package/dist/generators/pipeline/merge-patterns.js +50 -0
- package/dist/generators/pipeline/merge-patterns.js.map +1 -0
- package/dist/generators/pipeline/relationship-resolver.d.ts +47 -0
- package/dist/generators/pipeline/relationship-resolver.d.ts.map +1 -0
- package/dist/generators/pipeline/relationship-resolver.js +132 -0
- package/dist/generators/pipeline/relationship-resolver.js.map +1 -0
- package/dist/generators/pipeline/sequence-utils.d.ts +49 -0
- package/dist/generators/pipeline/sequence-utils.d.ts.map +1 -0
- package/dist/generators/pipeline/sequence-utils.js +235 -0
- package/dist/generators/pipeline/sequence-utils.js.map +1 -0
- package/dist/generators/pipeline/transform-dataset.d.ts +82 -0
- package/dist/generators/pipeline/transform-dataset.d.ts.map +1 -0
- package/dist/generators/pipeline/transform-dataset.js +355 -0
- package/dist/generators/pipeline/transform-dataset.js.map +1 -0
- package/dist/generators/pipeline/transform-types.d.ts +96 -0
- package/dist/generators/pipeline/transform-types.d.ts.map +1 -0
- package/dist/generators/pipeline/transform-types.js +18 -0
- package/dist/generators/pipeline/transform-types.js.map +1 -0
- package/dist/generators/registry.d.ts +64 -0
- package/dist/generators/registry.d.ts.map +1 -0
- package/dist/generators/registry.js +77 -0
- package/dist/generators/registry.js.map +1 -0
- package/dist/generators/source-mapper.d.ts +143 -0
- package/dist/generators/source-mapper.d.ts.map +1 -0
- package/dist/generators/source-mapper.js +602 -0
- package/dist/generators/source-mapper.js.map +1 -0
- package/dist/generators/source-mapping-validator.d.ts +118 -0
- package/dist/generators/source-mapping-validator.d.ts.map +1 -0
- package/dist/generators/source-mapping-validator.js +334 -0
- package/dist/generators/source-mapping-validator.js.map +1 -0
- package/dist/generators/types.d.ts +104 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +5 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/generators/warning-collector.d.ts +144 -0
- package/dist/generators/warning-collector.d.ts.map +1 -0
- package/dist/generators/warning-collector.js +166 -0
- package/dist/generators/warning-collector.js.map +1 -0
- package/dist/git/branch-diff.d.ts +44 -0
- package/dist/git/branch-diff.d.ts.map +1 -0
- package/dist/git/branch-diff.js +57 -0
- package/dist/git/branch-diff.js.map +1 -0
- package/dist/git/helpers.d.ts +46 -0
- package/dist/git/helpers.d.ts.map +1 -0
- package/dist/git/helpers.js +67 -0
- package/dist/git/helpers.js.map +1 -0
- package/dist/git/index.d.ts +18 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +18 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/name-status.d.ts +32 -0
- package/dist/git/name-status.d.ts.map +1 -0
- package/dist/git/name-status.js +66 -0
- package/dist/git/name-status.js.map +1 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/engine.d.ts +113 -0
- package/dist/lint/engine.d.ts.map +1 -0
- package/dist/lint/engine.js +228 -0
- package/dist/lint/engine.js.map +1 -0
- package/dist/lint/index.d.ts +26 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +24 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/lint/process-guard/decider.d.ts +166 -0
- package/dist/lint/process-guard/decider.d.ts.map +1 -0
- package/dist/lint/process-guard/decider.js +412 -0
- package/dist/lint/process-guard/decider.js.map +1 -0
- package/dist/lint/process-guard/derive-state.d.ts +96 -0
- package/dist/lint/process-guard/derive-state.d.ts.map +1 -0
- package/dist/lint/process-guard/derive-state.js +368 -0
- package/dist/lint/process-guard/derive-state.js.map +1 -0
- package/dist/lint/process-guard/detect-changes.d.ts +109 -0
- package/dist/lint/process-guard/detect-changes.d.ts.map +1 -0
- package/dist/lint/process-guard/detect-changes.js +487 -0
- package/dist/lint/process-guard/detect-changes.js.map +1 -0
- package/dist/lint/process-guard/index.d.ts +35 -0
- package/dist/lint/process-guard/index.d.ts.map +1 -0
- package/dist/lint/process-guard/index.js +39 -0
- package/dist/lint/process-guard/index.js.map +1 -0
- package/dist/lint/process-guard/types.d.ts +255 -0
- package/dist/lint/process-guard/types.d.ts.map +1 -0
- package/dist/lint/process-guard/types.js +31 -0
- package/dist/lint/process-guard/types.js.map +1 -0
- package/dist/lint/rules.d.ts +147 -0
- package/dist/lint/rules.d.ts.map +1 -0
- package/dist/lint/rules.js +289 -0
- package/dist/lint/rules.js.map +1 -0
- package/dist/lint/steps/cross-checks.d.ts +66 -0
- package/dist/lint/steps/cross-checks.d.ts.map +1 -0
- package/dist/lint/steps/cross-checks.js +290 -0
- package/dist/lint/steps/cross-checks.js.map +1 -0
- package/dist/lint/steps/feature-checks.d.ts +78 -0
- package/dist/lint/steps/feature-checks.d.ts.map +1 -0
- package/dist/lint/steps/feature-checks.js +279 -0
- package/dist/lint/steps/feature-checks.js.map +1 -0
- package/dist/lint/steps/index.d.ts +22 -0
- package/dist/lint/steps/index.d.ts.map +1 -0
- package/dist/lint/steps/index.js +26 -0
- package/dist/lint/steps/index.js.map +1 -0
- package/dist/lint/steps/pair-resolver.d.ts +29 -0
- package/dist/lint/steps/pair-resolver.d.ts.map +1 -0
- package/dist/lint/steps/pair-resolver.js +76 -0
- package/dist/lint/steps/pair-resolver.js.map +1 -0
- package/dist/lint/steps/runner.d.ts +28 -0
- package/dist/lint/steps/runner.d.ts.map +1 -0
- package/dist/lint/steps/runner.js +143 -0
- package/dist/lint/steps/runner.js.map +1 -0
- package/dist/lint/steps/step-checks.d.ts +41 -0
- package/dist/lint/steps/step-checks.d.ts.map +1 -0
- package/dist/lint/steps/step-checks.js +164 -0
- package/dist/lint/steps/step-checks.js.map +1 -0
- package/dist/lint/steps/types.d.ts +95 -0
- package/dist/lint/steps/types.d.ts.map +1 -0
- package/dist/lint/steps/types.js +79 -0
- package/dist/lint/steps/types.js.map +1 -0
- package/dist/lint/steps/utils.d.ts +22 -0
- package/dist/lint/steps/utils.d.ts.map +1 -0
- package/dist/lint/steps/utils.js +57 -0
- package/dist/lint/steps/utils.js.map +1 -0
- package/dist/mcp/file-watcher.d.ts +24 -0
- package/dist/mcp/file-watcher.d.ts.map +1 -0
- package/dist/mcp/file-watcher.js +75 -0
- package/dist/mcp/file-watcher.js.map +1 -0
- package/dist/mcp/index.d.ts +19 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/pipeline-session.d.ts +33 -0
- package/dist/mcp/pipeline-session.d.ts.map +1 -0
- package/dist/mcp/pipeline-session.js +149 -0
- package/dist/mcp/pipeline-session.js.map +1 -0
- package/dist/mcp/server.d.ts +28 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +197 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tool-registry.d.ts +4 -0
- package/dist/mcp/tool-registry.d.ts.map +1 -0
- package/dist/mcp/tool-registry.js +525 -0
- package/dist/mcp/tool-registry.js.map +1 -0
- package/dist/renderable/codecs/adr.d.ts +4730 -0
- package/dist/renderable/codecs/adr.d.ts.map +1 -0
- package/dist/renderable/codecs/adr.js +590 -0
- package/dist/renderable/codecs/adr.js.map +1 -0
- package/dist/renderable/codecs/architecture.d.ts +4760 -0
- package/dist/renderable/codecs/architecture.d.ts.map +1 -0
- package/dist/renderable/codecs/architecture.js +524 -0
- package/dist/renderable/codecs/architecture.js.map +1 -0
- package/dist/renderable/codecs/business-rules.d.ts +4777 -0
- package/dist/renderable/codecs/business-rules.d.ts.map +1 -0
- package/dist/renderable/codecs/business-rules.js +648 -0
- package/dist/renderable/codecs/business-rules.js.map +1 -0
- package/dist/renderable/codecs/claude-module.d.ts +4710 -0
- package/dist/renderable/codecs/claude-module.d.ts.map +1 -0
- package/dist/renderable/codecs/claude-module.js +214 -0
- package/dist/renderable/codecs/claude-module.js.map +1 -0
- package/dist/renderable/codecs/composite.d.ts +84 -0
- package/dist/renderable/codecs/composite.d.ts.map +1 -0
- package/dist/renderable/codecs/composite.js +124 -0
- package/dist/renderable/codecs/composite.js.map +1 -0
- package/dist/renderable/codecs/convention-extractor.d.ts +105 -0
- package/dist/renderable/codecs/convention-extractor.d.ts.map +1 -0
- package/dist/renderable/codecs/convention-extractor.js +353 -0
- package/dist/renderable/codecs/convention-extractor.js.map +1 -0
- package/dist/renderable/codecs/decision-doc.d.ts +308 -0
- package/dist/renderable/codecs/decision-doc.d.ts.map +1 -0
- package/dist/renderable/codecs/decision-doc.js +485 -0
- package/dist/renderable/codecs/decision-doc.js.map +1 -0
- package/dist/renderable/codecs/design-review.d.ts +55 -0
- package/dist/renderable/codecs/design-review.d.ts.map +1 -0
- package/dist/renderable/codecs/design-review.js +532 -0
- package/dist/renderable/codecs/design-review.js.map +1 -0
- package/dist/renderable/codecs/diagram-utils.d.ts +62 -0
- package/dist/renderable/codecs/diagram-utils.d.ts.map +1 -0
- package/dist/renderable/codecs/diagram-utils.js +70 -0
- package/dist/renderable/codecs/diagram-utils.js.map +1 -0
- package/dist/renderable/codecs/helpers.d.ts +553 -0
- package/dist/renderable/codecs/helpers.d.ts.map +1 -0
- package/dist/renderable/codecs/helpers.js +913 -0
- package/dist/renderable/codecs/helpers.js.map +1 -0
- package/dist/renderable/codecs/index-codec.d.ts +4714 -0
- package/dist/renderable/codecs/index-codec.d.ts.map +1 -0
- package/dist/renderable/codecs/index-codec.js +250 -0
- package/dist/renderable/codecs/index-codec.js.map +1 -0
- package/dist/renderable/codecs/index.d.ts +46 -0
- package/dist/renderable/codecs/index.d.ts.map +1 -0
- package/dist/renderable/codecs/index.js +70 -0
- package/dist/renderable/codecs/index.js.map +1 -0
- package/dist/renderable/codecs/patterns.d.ts +4757 -0
- package/dist/renderable/codecs/patterns.d.ts.map +1 -0
- package/dist/renderable/codecs/patterns.js +462 -0
- package/dist/renderable/codecs/patterns.js.map +1 -0
- package/dist/renderable/codecs/planning.d.ts +14055 -0
- package/dist/renderable/codecs/planning.d.ts.map +1 -0
- package/dist/renderable/codecs/planning.js +449 -0
- package/dist/renderable/codecs/planning.js.map +1 -0
- package/dist/renderable/codecs/pr-changes.d.ts +4742 -0
- package/dist/renderable/codecs/pr-changes.d.ts.map +1 -0
- package/dist/renderable/codecs/pr-changes.js +425 -0
- package/dist/renderable/codecs/pr-changes.js.map +1 -0
- package/dist/renderable/codecs/reference.d.ts +215 -0
- package/dist/renderable/codecs/reference.d.ts.map +1 -0
- package/dist/renderable/codecs/reference.js +1578 -0
- package/dist/renderable/codecs/reference.js.map +1 -0
- package/dist/renderable/codecs/reporting.d.ts +14026 -0
- package/dist/renderable/codecs/reporting.d.ts.map +1 -0
- package/dist/renderable/codecs/reporting.js +365 -0
- package/dist/renderable/codecs/reporting.js.map +1 -0
- package/dist/renderable/codecs/requirements.d.ts +4743 -0
- package/dist/renderable/codecs/requirements.d.ts.map +1 -0
- package/dist/renderable/codecs/requirements.js +428 -0
- package/dist/renderable/codecs/requirements.js.map +1 -0
- package/dist/renderable/codecs/session.d.ts +9410 -0
- package/dist/renderable/codecs/session.d.ts.map +1 -0
- package/dist/renderable/codecs/session.js +848 -0
- package/dist/renderable/codecs/session.js.map +1 -0
- package/dist/renderable/codecs/shape-matcher.d.ts +54 -0
- package/dist/renderable/codecs/shape-matcher.d.ts.map +1 -0
- package/dist/renderable/codecs/shape-matcher.js +106 -0
- package/dist/renderable/codecs/shape-matcher.js.map +1 -0
- package/dist/renderable/codecs/shared-schema.d.ts +44 -0
- package/dist/renderable/codecs/shared-schema.d.ts.map +1 -0
- package/dist/renderable/codecs/shared-schema.js +43 -0
- package/dist/renderable/codecs/shared-schema.js.map +1 -0
- package/dist/renderable/codecs/taxonomy.d.ts +4733 -0
- package/dist/renderable/codecs/taxonomy.d.ts.map +1 -0
- package/dist/renderable/codecs/taxonomy.js +570 -0
- package/dist/renderable/codecs/taxonomy.js.map +1 -0
- package/dist/renderable/codecs/timeline.d.ts +14094 -0
- package/dist/renderable/codecs/timeline.d.ts.map +1 -0
- package/dist/renderable/codecs/timeline.js +906 -0
- package/dist/renderable/codecs/timeline.js.map +1 -0
- package/dist/renderable/codecs/types/base.d.ts +81 -0
- package/dist/renderable/codecs/types/base.d.ts.map +1 -0
- package/dist/renderable/codecs/types/base.js +56 -0
- package/dist/renderable/codecs/types/base.js.map +1 -0
- package/dist/renderable/codecs/types/index.d.ts +5 -0
- package/dist/renderable/codecs/types/index.d.ts.map +1 -0
- package/dist/renderable/codecs/types/index.js +5 -0
- package/dist/renderable/codecs/types/index.js.map +1 -0
- package/dist/renderable/codecs/validation-rules.d.ts +4773 -0
- package/dist/renderable/codecs/validation-rules.d.ts.map +1 -0
- package/dist/renderable/codecs/validation-rules.js +537 -0
- package/dist/renderable/codecs/validation-rules.js.map +1 -0
- package/dist/renderable/generate.d.ts +338 -0
- package/dist/renderable/generate.d.ts.map +1 -0
- package/dist/renderable/generate.js +437 -0
- package/dist/renderable/generate.js.map +1 -0
- package/dist/renderable/index.d.ts +36 -0
- package/dist/renderable/index.d.ts.map +1 -0
- package/dist/renderable/index.js +58 -0
- package/dist/renderable/index.js.map +1 -0
- package/dist/renderable/load-preamble.d.ts +56 -0
- package/dist/renderable/load-preamble.d.ts.map +1 -0
- package/dist/renderable/load-preamble.js +298 -0
- package/dist/renderable/load-preamble.js.map +1 -0
- package/dist/renderable/render.d.ts +61 -0
- package/dist/renderable/render.d.ts.map +1 -0
- package/dist/renderable/render.js +346 -0
- package/dist/renderable/render.js.map +1 -0
- package/dist/renderable/schema.d.ts +194 -0
- package/dist/renderable/schema.d.ts.map +1 -0
- package/dist/renderable/schema.js +197 -0
- package/dist/renderable/schema.js.map +1 -0
- package/dist/renderable/utils.d.ts +146 -0
- package/dist/renderable/utils.d.ts.map +1 -0
- package/dist/renderable/utils.js +362 -0
- package/dist/renderable/utils.js.map +1 -0
- package/dist/scanner/ast-parser.d.ts +75 -0
- package/dist/scanner/ast-parser.d.ts.map +1 -0
- package/dist/scanner/ast-parser.js +835 -0
- package/dist/scanner/ast-parser.js.map +1 -0
- package/dist/scanner/gherkin-ast-parser.d.ts +166 -0
- package/dist/scanner/gherkin-ast-parser.d.ts.map +1 -0
- package/dist/scanner/gherkin-ast-parser.js +507 -0
- package/dist/scanner/gherkin-ast-parser.js.map +1 -0
- package/dist/scanner/gherkin-scanner.d.ts +106 -0
- package/dist/scanner/gherkin-scanner.d.ts.map +1 -0
- package/dist/scanner/gherkin-scanner.js +149 -0
- package/dist/scanner/gherkin-scanner.js.map +1 -0
- package/dist/scanner/index.d.ts +85 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +102 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/pattern-scanner.d.ts +83 -0
- package/dist/scanner/pattern-scanner.d.ts.map +1 -0
- package/dist/scanner/pattern-scanner.js +110 -0
- package/dist/scanner/pattern-scanner.js.map +1 -0
- package/dist/taxonomy/categories.d.ts +47 -0
- package/dist/taxonomy/categories.d.ts.map +1 -0
- package/dist/taxonomy/categories.js +175 -0
- package/dist/taxonomy/categories.js.map +1 -0
- package/dist/taxonomy/claude-section-values.d.ts +12 -0
- package/dist/taxonomy/claude-section-values.d.ts.map +1 -0
- package/dist/taxonomy/claude-section-values.js +17 -0
- package/dist/taxonomy/claude-section-values.js.map +1 -0
- package/dist/taxonomy/conventions.d.ts +13 -0
- package/dist/taxonomy/conventions.d.ts.map +1 -0
- package/dist/taxonomy/conventions.js +27 -0
- package/dist/taxonomy/conventions.js.map +1 -0
- package/dist/taxonomy/deliverable-status.d.ts +99 -0
- package/dist/taxonomy/deliverable-status.d.ts.map +1 -0
- package/dist/taxonomy/deliverable-status.js +131 -0
- package/dist/taxonomy/deliverable-status.js.map +1 -0
- package/dist/taxonomy/format-types.d.ts +17 -0
- package/dist/taxonomy/format-types.d.ts.map +1 -0
- package/dist/taxonomy/format-types.js +23 -0
- package/dist/taxonomy/format-types.js.map +1 -0
- package/dist/taxonomy/generator-options.d.ts +67 -0
- package/dist/taxonomy/generator-options.d.ts.map +1 -0
- package/dist/taxonomy/generator-options.js +75 -0
- package/dist/taxonomy/generator-options.js.map +1 -0
- package/dist/taxonomy/hierarchy-levels.d.ts +23 -0
- package/dist/taxonomy/hierarchy-levels.d.ts.map +1 -0
- package/dist/taxonomy/hierarchy-levels.js +22 -0
- package/dist/taxonomy/hierarchy-levels.js.map +1 -0
- package/dist/taxonomy/index.d.ts +35 -0
- package/dist/taxonomy/index.d.ts.map +1 -0
- package/dist/taxonomy/index.js +56 -0
- package/dist/taxonomy/index.js.map +1 -0
- package/dist/taxonomy/layer-types.d.ts +22 -0
- package/dist/taxonomy/layer-types.d.ts.map +1 -0
- package/dist/taxonomy/layer-types.js +28 -0
- package/dist/taxonomy/layer-types.js.map +1 -0
- package/dist/taxonomy/normalized-status.d.ts +99 -0
- package/dist/taxonomy/normalized-status.d.ts.map +1 -0
- package/dist/taxonomy/normalized-status.js +113 -0
- package/dist/taxonomy/normalized-status.js.map +1 -0
- package/dist/taxonomy/registry-builder.d.ts +104 -0
- package/dist/taxonomy/registry-builder.d.ts.map +1 -0
- package/dist/taxonomy/registry-builder.js +561 -0
- package/dist/taxonomy/registry-builder.js.map +1 -0
- package/dist/taxonomy/risk-levels.d.ts +16 -0
- package/dist/taxonomy/risk-levels.d.ts.map +1 -0
- package/dist/taxonomy/risk-levels.js +15 -0
- package/dist/taxonomy/risk-levels.js.map +1 -0
- package/dist/taxonomy/severity-types.d.ts +6 -0
- package/dist/taxonomy/severity-types.d.ts.map +1 -0
- package/dist/taxonomy/severity-types.js +5 -0
- package/dist/taxonomy/severity-types.js.map +1 -0
- package/dist/taxonomy/status-values.d.ts +39 -0
- package/dist/taxonomy/status-values.d.ts.map +1 -0
- package/dist/taxonomy/status-values.js +42 -0
- package/dist/taxonomy/status-values.js.map +1 -0
- package/dist/types/branded.d.ts +89 -0
- package/dist/types/branded.d.ts.map +1 -0
- package/dist/types/branded.js +57 -0
- package/dist/types/branded.js.map +1 -0
- package/dist/types/errors.d.ts +342 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +251 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +41 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/result.d.ts +78 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +78 -0
- package/dist/types/result.js.map +1 -0
- package/dist/utils/collection-utils.d.ts +49 -0
- package/dist/utils/collection-utils.d.ts.map +1 -0
- package/dist/utils/collection-utils.js +58 -0
- package/dist/utils/collection-utils.js.map +1 -0
- package/dist/utils/id-utils.d.ts +46 -0
- package/dist/utils/id-utils.d.ts.map +1 -0
- package/dist/utils/id-utils.js +51 -0
- package/dist/utils/id-utils.js.map +1 -0
- package/dist/utils/index.d.ts +21 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/string-utils.d.ts +150 -0
- package/dist/utils/string-utils.d.ts.map +1 -0
- package/dist/utils/string-utils.js +281 -0
- package/dist/utils/string-utils.js.map +1 -0
- package/dist/validation/anti-patterns.d.ts +134 -0
- package/dist/validation/anti-patterns.d.ts.map +1 -0
- package/dist/validation/anti-patterns.js +307 -0
- package/dist/validation/anti-patterns.js.map +1 -0
- package/dist/validation/dod-validator.d.ts +94 -0
- package/dist/validation/dod-validator.d.ts.map +1 -0
- package/dist/validation/dod-validator.js +198 -0
- package/dist/validation/dod-validator.js.map +1 -0
- package/dist/validation/fsm/index.d.ts +59 -0
- package/dist/validation/fsm/index.d.ts.map +1 -0
- package/dist/validation/fsm/index.js +64 -0
- package/dist/validation/fsm/index.js.map +1 -0
- package/dist/validation/fsm/states.d.ts +93 -0
- package/dist/validation/fsm/states.d.ts.map +1 -0
- package/dist/validation/fsm/states.js +98 -0
- package/dist/validation/fsm/states.js.map +1 -0
- package/dist/validation/fsm/transitions.d.ts +100 -0
- package/dist/validation/fsm/transitions.d.ts.map +1 -0
- package/dist/validation/fsm/transitions.js +122 -0
- package/dist/validation/fsm/transitions.js.map +1 -0
- package/dist/validation/fsm/validator.d.ts +163 -0
- package/dist/validation/fsm/validator.d.ts.map +1 -0
- package/dist/validation/fsm/validator.js +205 -0
- package/dist/validation/fsm/validator.js.map +1 -0
- package/dist/validation/index.d.ts +23 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +25 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/types.d.ts +136 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +56 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation-schemas/codec-utils.d.ts +188 -0
- package/dist/validation-schemas/codec-utils.d.ts.map +1 -0
- package/dist/validation-schemas/codec-utils.js +258 -0
- package/dist/validation-schemas/codec-utils.js.map +1 -0
- package/dist/validation-schemas/config.d.ts +99 -0
- package/dist/validation-schemas/config.d.ts.map +1 -0
- package/dist/validation-schemas/config.js +178 -0
- package/dist/validation-schemas/config.js.map +1 -0
- package/dist/validation-schemas/doc-directive.d.ts +195 -0
- package/dist/validation-schemas/doc-directive.d.ts.map +1 -0
- package/dist/validation-schemas/doc-directive.js +239 -0
- package/dist/validation-schemas/doc-directive.js.map +1 -0
- package/dist/validation-schemas/dual-source.d.ts +167 -0
- package/dist/validation-schemas/dual-source.d.ts.map +1 -0
- package/dist/validation-schemas/dual-source.js +168 -0
- package/dist/validation-schemas/dual-source.js.map +1 -0
- package/dist/validation-schemas/export-info.d.ts +53 -0
- package/dist/validation-schemas/export-info.d.ts.map +1 -0
- package/dist/validation-schemas/export-info.js +101 -0
- package/dist/validation-schemas/export-info.js.map +1 -0
- package/dist/validation-schemas/extracted-pattern.d.ts +351 -0
- package/dist/validation-schemas/extracted-pattern.d.ts.map +1 -0
- package/dist/validation-schemas/extracted-pattern.js +459 -0
- package/dist/validation-schemas/extracted-pattern.js.map +1 -0
- package/dist/validation-schemas/extracted-shape.d.ts +200 -0
- package/dist/validation-schemas/extracted-shape.d.ts.map +1 -0
- package/dist/validation-schemas/extracted-shape.js +182 -0
- package/dist/validation-schemas/extracted-shape.js.map +1 -0
- package/dist/validation-schemas/feature.d.ts +554 -0
- package/dist/validation-schemas/feature.d.ts.map +1 -0
- package/dist/validation-schemas/feature.js +262 -0
- package/dist/validation-schemas/feature.js.map +1 -0
- package/dist/validation-schemas/index.d.ts +15 -0
- package/dist/validation-schemas/index.d.ts.map +1 -0
- package/dist/validation-schemas/index.js +32 -0
- package/dist/validation-schemas/index.js.map +1 -0
- package/dist/validation-schemas/lint.d.ts +46 -0
- package/dist/validation-schemas/lint.d.ts.map +1 -0
- package/dist/validation-schemas/lint.js +45 -0
- package/dist/validation-schemas/lint.js.map +1 -0
- package/dist/validation-schemas/master-dataset.d.ts +8299 -0
- package/dist/validation-schemas/master-dataset.d.ts.map +1 -0
- package/dist/validation-schemas/master-dataset.js +275 -0
- package/dist/validation-schemas/master-dataset.js.map +1 -0
- package/dist/validation-schemas/output-schemas.d.ts +183 -0
- package/dist/validation-schemas/output-schemas.d.ts.map +1 -0
- package/dist/validation-schemas/output-schemas.js +149 -0
- package/dist/validation-schemas/output-schemas.js.map +1 -0
- package/dist/validation-schemas/scenario-ref.d.ts +80 -0
- package/dist/validation-schemas/scenario-ref.d.ts.map +1 -0
- package/dist/validation-schemas/scenario-ref.js +73 -0
- package/dist/validation-schemas/scenario-ref.js.map +1 -0
- package/dist/validation-schemas/tag-registry.d.ts +210 -0
- package/dist/validation-schemas/tag-registry.d.ts.map +1 -0
- package/dist/validation-schemas/tag-registry.js +248 -0
- package/dist/validation-schemas/tag-registry.js.map +1 -0
- package/dist/validation-schemas/workflow-config.d.ts +125 -0
- package/dist/validation-schemas/workflow-config.d.ts.map +1 -0
- package/dist/validation-schemas/workflow-config.js +138 -0
- package/dist/validation-schemas/workflow-config.js.map +1 -0
- package/docs/ANNOTATION-GUIDE.md +271 -0
- package/docs/ARCHITECTURE.md +1636 -0
- package/docs/CONFIGURATION.md +337 -0
- package/docs/DOCS-GAP-ANALYSIS.md +811 -0
- package/docs/GHERKIN-PATTERNS.md +366 -0
- package/docs/INDEX.md +345 -0
- package/docs/MCP-SETUP.md +140 -0
- package/docs/METHODOLOGY.md +240 -0
- package/docs/PROCESS-API.md +65 -0
- package/docs/PROCESS-GUARD.md +341 -0
- package/docs/SESSION-GUIDES.md +391 -0
- package/docs/TAXONOMY.md +106 -0
- package/docs/VALIDATION.md +418 -0
- package/docs-live/ARCHITECTURE.md +362 -0
- package/docs-live/BUSINESS-RULES.md +24 -0
- package/docs-live/CHANGELOG-GENERATED.md +375 -0
- package/docs-live/DECISIONS.md +78 -0
- package/docs-live/INDEX.md +231 -0
- package/docs-live/PRODUCT-AREAS.md +255 -0
- package/docs-live/TAXONOMY.md +202 -0
- package/docs-live/VALIDATION-RULES.md +119 -0
- package/docs-live/_claude-md/annotation/annotation-overview.md +26 -0
- package/docs-live/_claude-md/annotation/annotation-reference.md +213 -0
- package/docs-live/_claude-md/architecture/architecture-codecs.md +160 -0
- package/docs-live/_claude-md/architecture/architecture-types.md +32 -0
- package/docs-live/_claude-md/architecture/reference-sample.md +162 -0
- package/docs-live/_claude-md/authoring/gherkin-authoring-guide.md +245 -0
- package/docs-live/_claude-md/configuration/configuration-guide.md +216 -0
- package/docs-live/_claude-md/configuration/configuration-overview.md +37 -0
- package/docs-live/_claude-md/core-types/core-types-overview.md +20 -0
- package/docs-live/_claude-md/data-api/data-api-overview.md +39 -0
- package/docs-live/_claude-md/generation/generation-overview.md +30 -0
- package/docs-live/_claude-md/process/process-overview.md +127 -0
- package/docs-live/_claude-md/validation/process-guard.md +185 -0
- package/docs-live/_claude-md/validation/validation-overview.md +37 -0
- package/docs-live/_claude-md/validation/validation-tools-guide.md +242 -0
- package/docs-live/_claude-md/workflow/session-workflow-guide.md +141 -0
- package/docs-live/business-rules/annotation.md +1462 -0
- package/docs-live/business-rules/configuration.md +465 -0
- package/docs-live/business-rules/core-types.md +531 -0
- package/docs-live/business-rules/data-api.md +1403 -0
- package/docs-live/business-rules/generation.md +4726 -0
- package/docs-live/business-rules/process.md +122 -0
- package/docs-live/business-rules/validation.md +998 -0
- package/docs-live/decisions/adr-001-taxonomy-canonical-values.md +197 -0
- package/docs-live/decisions/adr-002-gherkin-only-testing.md +57 -0
- package/docs-live/decisions/adr-003-source-first-pattern-architecture.md +147 -0
- package/docs-live/decisions/adr-004-session-workflow-commands.md +137 -0
- package/docs-live/decisions/adr-005-codec-based-markdown-rendering.md +150 -0
- package/docs-live/decisions/adr-006-single-read-model-architecture.md +136 -0
- package/docs-live/decisions/adr-021-doc-generation-proof-of-concept.md +489 -0
- package/docs-live/product-areas/ANNOTATION.md +591 -0
- package/docs-live/product-areas/CONFIGURATION.md +1048 -0
- package/docs-live/product-areas/CORE-TYPES.md +221 -0
- package/docs-live/product-areas/DATA-API.md +850 -0
- package/docs-live/product-areas/GENERATION.md +1200 -0
- package/docs-live/product-areas/PROCESS.md +351 -0
- package/docs-live/product-areas/VALIDATION.md +1135 -0
- package/docs-live/reference/ANNOTATION-REFERENCE.md +232 -0
- package/docs-live/reference/ARCHITECTURE-CODECS.md +675 -0
- package/docs-live/reference/ARCHITECTURE-TYPES.md +436 -0
- package/docs-live/reference/CONFIGURATION-GUIDE.md +235 -0
- package/docs-live/reference/GHERKIN-AUTHORING-GUIDE.md +270 -0
- package/docs-live/reference/PROCESS-API-RECIPES.md +476 -0
- package/docs-live/reference/PROCESS-API-REFERENCE.md +63 -0
- package/docs-live/reference/PROCESS-GUARD-REFERENCE.md +258 -0
- package/docs-live/reference/REFERENCE-SAMPLE.md +1135 -0
- package/docs-live/reference/SESSION-WORKFLOW-GUIDE.md +384 -0
- package/docs-live/reference/VALIDATION-TOOLS-GUIDE.md +263 -0
- package/docs-live/taxonomy/categories.md +33 -0
- package/docs-live/taxonomy/format-types.md +67 -0
- package/docs-live/taxonomy/metadata-tags.md +693 -0
- package/docs-live/validation/error-catalog.md +78 -0
- package/docs-live/validation/fsm-transitions.md +50 -0
- package/docs-live/validation/protection-levels.md +51 -0
- package/package.json +233 -0
|
@@ -0,0 +1,835 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @architect
|
|
3
|
+
* @architect-core @architect-scanner
|
|
4
|
+
* @architect-pattern TypeScript AST Parser
|
|
5
|
+
* @architect-status completed
|
|
6
|
+
* @architect-arch-role infrastructure
|
|
7
|
+
* @architect-arch-context scanner
|
|
8
|
+
* @architect-arch-layer infrastructure
|
|
9
|
+
* @architect-uses TagRegistry, DocDirectiveSchema, typescript-estree
|
|
10
|
+
* @architect-used-by Pattern Scanner, Doc Extractor
|
|
11
|
+
* @architect-usecase "When parsing JSDoc comments for @architect-* directives"
|
|
12
|
+
* @architect-usecase "When extracting code blocks following documentation comments"
|
|
13
|
+
*
|
|
14
|
+
* ## TypeScript AST Parser - JSDoc Directive Extraction
|
|
15
|
+
*
|
|
16
|
+
* Parses TypeScript source files using @typescript-eslint/typescript-estree
|
|
17
|
+
* to extract @architect-* directives with their associated code blocks.
|
|
18
|
+
* First stage of the three-stage pipeline: Scanner → Extractor → Generator.
|
|
19
|
+
*
|
|
20
|
+
* ### When to Use
|
|
21
|
+
*
|
|
22
|
+
* - Scanning TypeScript files for documentation directives
|
|
23
|
+
* - Extracting code snippets following JSDoc comments
|
|
24
|
+
* - Building pattern metadata from JSDoc tags
|
|
25
|
+
*
|
|
26
|
+
* ### Key Concepts
|
|
27
|
+
*
|
|
28
|
+
* - **Data-Driven Extraction**: Tag formats defined in registry, not hardcoded
|
|
29
|
+
* - **Schema-First Validation**: All directives validated against Zod schemas
|
|
30
|
+
* - **Result Monad**: Returns Result<T, E> for explicit error handling
|
|
31
|
+
*/
|
|
32
|
+
import { Result } from '../types/index.js';
|
|
33
|
+
import { parse } from '@typescript-eslint/typescript-estree';
|
|
34
|
+
import { asDirectiveTag, createDirectiveValidationError, createFileParseError, } from '../types/index.js';
|
|
35
|
+
import { DocDirectiveSchema, createDefaultTagRegistry, } from '../validation-schemas/index.js';
|
|
36
|
+
import { createRegexBuilders } from '../config/regex-builders.js';
|
|
37
|
+
/**
|
|
38
|
+
* Module-level regex cache for performance optimization.
|
|
39
|
+
*
|
|
40
|
+
* Regex compilation is expensive (~50μs per pattern). In hot paths where
|
|
41
|
+
* the same patterns are used repeatedly (e.g., extracting metadata tags),
|
|
42
|
+
* caching provides ~80x fewer RegExp instantiations.
|
|
43
|
+
*
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
const REGEX_CACHE = new Map();
|
|
47
|
+
/**
|
|
48
|
+
* Get or create a cached RegExp instance.
|
|
49
|
+
*
|
|
50
|
+
* @param pattern - Regex pattern string
|
|
51
|
+
* @param flags - Optional regex flags (g, i, m, etc.)
|
|
52
|
+
* @returns Cached or newly created RegExp
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
function getCachedRegex(pattern, flags) {
|
|
57
|
+
const key = flags ? `${pattern}|${flags}` : pattern;
|
|
58
|
+
let regex = REGEX_CACHE.get(key);
|
|
59
|
+
if (!regex) {
|
|
60
|
+
regex = new RegExp(pattern, flags);
|
|
61
|
+
REGEX_CACHE.set(key, regex);
|
|
62
|
+
}
|
|
63
|
+
// Reset lastIndex for stateful regexes (those with 'g' flag)
|
|
64
|
+
if (regex.global) {
|
|
65
|
+
regex.lastIndex = 0;
|
|
66
|
+
}
|
|
67
|
+
return regex;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract single value from comment text for format="value"
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```
|
|
74
|
+
* @architect-pattern MyPattern
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
function extractSingleValue(commentText, fullTag) {
|
|
78
|
+
const regex = getCachedRegex(`(?:^|\\n)\\s*\\*?\\s*${escapeRegex(fullTag)}\\s+(.+?)(?:\\n|\\*|$)`);
|
|
79
|
+
const match = regex.exec(commentText);
|
|
80
|
+
return match?.[1]?.trim();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Extract enum value from comment text for format="enum"
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```
|
|
87
|
+
* @architect-status completed
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
function extractEnumValue(commentText, fullTag, validValues) {
|
|
91
|
+
const valuesPattern = validValues.join('|');
|
|
92
|
+
const regex = getCachedRegex(`${escapeRegex(fullTag)}\\s+(${valuesPattern})`);
|
|
93
|
+
const match = regex.exec(commentText);
|
|
94
|
+
return match?.[1];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract quoted value from comment text for format="quoted-value"
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```
|
|
101
|
+
* @architect-usecase "When implementing a new command"
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
function extractQuotedValue(commentText, fullTag) {
|
|
105
|
+
const regex = getCachedRegex(`${escapeRegex(fullTag)}\\s+(?:"([^"]+)"|([^\\n*]+?)(?:\\n|\\*|$))`, 'g');
|
|
106
|
+
const values = [];
|
|
107
|
+
let match;
|
|
108
|
+
while ((match = regex.exec(commentText)) !== null) {
|
|
109
|
+
const value = (match[1] ?? match[2])?.trim();
|
|
110
|
+
if (value) {
|
|
111
|
+
values.push(value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return values;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extract comma-separated values from comment text for format="csv"
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```
|
|
121
|
+
* @architect-uses PatternA, PatternB, PatternC
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
function extractCsvValue(commentText, fullTag) {
|
|
125
|
+
const regex = getCachedRegex(`${escapeRegex(fullTag)}\\s+([^\\n@*]+)`);
|
|
126
|
+
const match = regex.exec(commentText);
|
|
127
|
+
if (!match?.[1])
|
|
128
|
+
return undefined;
|
|
129
|
+
return match[1]
|
|
130
|
+
.split(',')
|
|
131
|
+
.map((s) => s.trim())
|
|
132
|
+
.filter(Boolean);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Extract number value from comment text for format="number"
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```
|
|
139
|
+
* @architect-phase 14
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
function extractNumberValue(commentText, fullTag) {
|
|
143
|
+
const regex = getCachedRegex(`${escapeRegex(fullTag)}\\s+(\\d+)`);
|
|
144
|
+
const match = regex.exec(commentText);
|
|
145
|
+
return match?.[1] ? parseInt(match[1], 10) : undefined;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if flag is present in comment text for format="flag"
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```
|
|
152
|
+
* @architect-core
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
function checkFlagPresent(commentText, fullTag) {
|
|
156
|
+
const regex = getCachedRegex(`${escapeRegex(fullTag)}(?:\\s|$|\\*)`);
|
|
157
|
+
return regex.test(commentText);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Escape special regex characters
|
|
161
|
+
*/
|
|
162
|
+
function escapeRegex(str) {
|
|
163
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Build regex patterns for directive parsing from registry configuration.
|
|
167
|
+
*
|
|
168
|
+
* @param registry - Tag registry with prefix and opt-in tag configuration
|
|
169
|
+
* @returns Object with compiled regex patterns for directive parsing
|
|
170
|
+
*
|
|
171
|
+
* @internal
|
|
172
|
+
*/
|
|
173
|
+
function buildDirectivePatterns(registry) {
|
|
174
|
+
// Extract prefix without @ for pattern construction
|
|
175
|
+
const prefixWithoutAt = registry.tagPrefix.startsWith('@')
|
|
176
|
+
? registry.tagPrefix.substring(1)
|
|
177
|
+
: registry.tagPrefix;
|
|
178
|
+
const escapedPrefixWithoutAt = escapeRegex(prefixWithoutAt);
|
|
179
|
+
// Extract opt-in tag without @ for pattern construction
|
|
180
|
+
const optInWithoutAt = registry.fileOptInTag.startsWith('@')
|
|
181
|
+
? registry.fileOptInTag.substring(1)
|
|
182
|
+
: registry.fileOptInTag;
|
|
183
|
+
const escapedOptInWithoutAt = escapeRegex(optInWithoutAt);
|
|
184
|
+
return {
|
|
185
|
+
// Match directive tags: @prefix-pattern, @prefix-core, etc. (prefix includes trailing -)
|
|
186
|
+
tagRegex: new RegExp(`@${escapedPrefixWithoutAt}[\\w-]+`, 'g'),
|
|
187
|
+
// Check if line starts with opt-in or directive
|
|
188
|
+
// e.g., ^@architect or ^@architect-pattern
|
|
189
|
+
startsWithOptInOrDirective: new RegExp(`^@${escapedOptInWithoutAt}(?:-[\\w-]+)?`),
|
|
190
|
+
// Match opt-in tag for removal (not followed by -)
|
|
191
|
+
// e.g., @architect followed by whitespace or end
|
|
192
|
+
optInTagPattern: new RegExp(`@${escapedOptInWithoutAt}(?!-)(\\s|$)?`, 'g'),
|
|
193
|
+
// Match any @ tag that is NOT our prefix
|
|
194
|
+
// e.g., @param, @returns, @example (not @architect)
|
|
195
|
+
nonOptInAtTagPattern: new RegExp(`^@(?!${escapedOptInWithoutAt})`),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Build regex pattern for value-taking tags from registry.
|
|
200
|
+
*
|
|
201
|
+
* Value-taking tags are all metadata tags except those with format="flag".
|
|
202
|
+
* This pattern detects when a line contains a metadata directive whose
|
|
203
|
+
* value should NOT be captured as inline description text.
|
|
204
|
+
*
|
|
205
|
+
* @param registry - Tag registry to extract metadata tags from
|
|
206
|
+
* @returns RegExp pattern string (without surrounding slashes)
|
|
207
|
+
*
|
|
208
|
+
* @internal
|
|
209
|
+
*/
|
|
210
|
+
function buildValueTakingTagsPattern(registry) {
|
|
211
|
+
const valueTakingTags = registry.metadataTags
|
|
212
|
+
.filter((tag) => tag.format !== 'flag')
|
|
213
|
+
.map((tag) => escapeRegex(tag.tag));
|
|
214
|
+
const tagPrefix = escapeRegex(registry.tagPrefix);
|
|
215
|
+
return `${tagPrefix}(?:${valueTakingTags.join('|')})\\s`;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Pre-compiled regex for detecting value-taking metadata directives.
|
|
219
|
+
*
|
|
220
|
+
* Built at module load time from the default registry to:
|
|
221
|
+
* 1. Avoid regex compilation on every parse call
|
|
222
|
+
* 2. Eliminate hardcoded tag lists that fall out of sync with registry
|
|
223
|
+
*
|
|
224
|
+
* Matches lines containing tags like @architect-pattern, @architect-status, etc.
|
|
225
|
+
* Does NOT match flag-only tags like @architect-core.
|
|
226
|
+
*
|
|
227
|
+
* @internal
|
|
228
|
+
*/
|
|
229
|
+
const _VALUE_TAKING_TAGS_REGEX = (() => {
|
|
230
|
+
const defaultRegistry = createDefaultTagRegistry();
|
|
231
|
+
return new RegExp(buildValueTakingTagsPattern(defaultRegistry));
|
|
232
|
+
})();
|
|
233
|
+
/**
|
|
234
|
+
* Extract metadata tag value based on format type
|
|
235
|
+
*
|
|
236
|
+
* Dispatches to the appropriate extraction function based on the tag's format.
|
|
237
|
+
* This enables data-driven metadata extraction without hardcoded patterns.
|
|
238
|
+
*
|
|
239
|
+
* @param commentText - Full JSDoc comment text
|
|
240
|
+
* @param tagDef - Metadata tag definition from registry
|
|
241
|
+
* @param prefix - Tag prefix (e.g., "@architect-")
|
|
242
|
+
* @returns Extracted value in appropriate format, or undefined if not found
|
|
243
|
+
*/
|
|
244
|
+
function extractMetadataTag(commentText, tagDef, prefix) {
|
|
245
|
+
const fullTag = `${prefix}${tagDef.tag}`;
|
|
246
|
+
switch (tagDef.format) {
|
|
247
|
+
case 'value':
|
|
248
|
+
return extractSingleValue(commentText, fullTag);
|
|
249
|
+
case 'enum':
|
|
250
|
+
return extractEnumValue(commentText, fullTag, tagDef.values ?? []);
|
|
251
|
+
case 'quoted-value':
|
|
252
|
+
// For repeatable tags, return array; otherwise return single value
|
|
253
|
+
if (tagDef.repeatable) {
|
|
254
|
+
const values = extractQuotedValue(commentText, fullTag);
|
|
255
|
+
return values.length > 0 ? values : undefined;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const values = extractQuotedValue(commentText, fullTag);
|
|
259
|
+
return values[0];
|
|
260
|
+
}
|
|
261
|
+
case 'csv':
|
|
262
|
+
return extractCsvValue(commentText, fullTag);
|
|
263
|
+
case 'number':
|
|
264
|
+
return extractNumberValue(commentText, fullTag);
|
|
265
|
+
case 'flag':
|
|
266
|
+
return checkFlagPresent(commentText, fullTag);
|
|
267
|
+
default:
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Parses TypeScript content and extracts all @architect-* directives
|
|
273
|
+
* with their associated code blocks and exports.
|
|
274
|
+
*
|
|
275
|
+
* **Error Handling**: Returns Result type to surface parse errors:
|
|
276
|
+
* - Ok: Contains successfully parsed directives and any skipped directive errors
|
|
277
|
+
* - Err: Contains FileParseError when the entire file fails to parse
|
|
278
|
+
*
|
|
279
|
+
* @param content - TypeScript file content
|
|
280
|
+
* @param filePath - Path to TypeScript file (for error messages)
|
|
281
|
+
* @param registry - Tag registry for metadata extraction (optional, defaults to generic registry)
|
|
282
|
+
* @returns Result with parsed directives or parse error
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* const content = await fs.readFile(filePath, "utf-8");
|
|
287
|
+
* const result = parseFileDirectives(content, filePath, registry);
|
|
288
|
+
*
|
|
289
|
+
* if (Result.isOk(result)) {
|
|
290
|
+
* const { directives, skippedDirectives } = result.value;
|
|
291
|
+
* console.log(`Parsed ${directives.length} directives`);
|
|
292
|
+
* console.log(`Skipped ${skippedDirectives.length} invalid directives`);
|
|
293
|
+
* } else {
|
|
294
|
+
* console.error(`Parse error: ${result.error.message}`);
|
|
295
|
+
* }
|
|
296
|
+
* ```
|
|
297
|
+
*/
|
|
298
|
+
export function parseFileDirectives(content, filePath, registry) {
|
|
299
|
+
const effectiveRegistry = registry ?? createDefaultTagRegistry();
|
|
300
|
+
let ast;
|
|
301
|
+
try {
|
|
302
|
+
ast = parse(content, {
|
|
303
|
+
loc: true,
|
|
304
|
+
range: true,
|
|
305
|
+
comment: true,
|
|
306
|
+
tokens: false,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
// Surface parse errors instead of silently returning empty
|
|
311
|
+
const tsError = error;
|
|
312
|
+
const location = 'lineNumber' in tsError && 'column' in tsError
|
|
313
|
+
? { line: tsError.lineNumber, column: tsError.column }
|
|
314
|
+
: undefined;
|
|
315
|
+
return Result.err(createFileParseError(filePath, tsError.message || 'Unknown parse error', location, error));
|
|
316
|
+
}
|
|
317
|
+
const results = [];
|
|
318
|
+
const skippedDirectives = [];
|
|
319
|
+
const comments = ast.comments ?? [];
|
|
320
|
+
// Create regex builders for directive detection using registry configuration
|
|
321
|
+
const builders = createRegexBuilders(effectiveRegistry.tagPrefix, effectiveRegistry.fileOptInTag);
|
|
322
|
+
for (const comment of comments) {
|
|
323
|
+
if (comment.type !== 'Block')
|
|
324
|
+
continue;
|
|
325
|
+
const commentText = comment.value;
|
|
326
|
+
if (!builders.hasDocDirectives(commentText))
|
|
327
|
+
continue;
|
|
328
|
+
// Extract directive information (with schema validation)
|
|
329
|
+
if (!comment.loc)
|
|
330
|
+
continue; // Skip if no location info
|
|
331
|
+
const directiveResult = parseDirective(commentText, comment.loc, filePath, effectiveRegistry);
|
|
332
|
+
if (Result.isErr(directiveResult)) {
|
|
333
|
+
// Collect directive validation errors instead of silently skipping
|
|
334
|
+
skippedDirectives.push(directiveResult.error);
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
const directive = directiveResult.value;
|
|
338
|
+
if (directive.tags.length === 0)
|
|
339
|
+
continue;
|
|
340
|
+
// Find the code block following this comment
|
|
341
|
+
const codeBlock = extractCodeBlockAfterComment(content, ast, comment);
|
|
342
|
+
if (!codeBlock)
|
|
343
|
+
continue;
|
|
344
|
+
// Extract exports from the code block (DD-1: thread content for signature slicing)
|
|
345
|
+
const exports = extractExportsFromBlock(ast, codeBlock, content);
|
|
346
|
+
results.push({
|
|
347
|
+
directive,
|
|
348
|
+
code: codeBlock.code,
|
|
349
|
+
exports,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
return Result.ok({ directives: results, skippedDirectives });
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Parse JSDoc comment to extract directive information
|
|
356
|
+
*
|
|
357
|
+
* **Schema-First Enforcement**: Validates constructed directive against schema
|
|
358
|
+
* to ensure data integrity at the boundary.
|
|
359
|
+
*
|
|
360
|
+
* **Directive-Level Tag Extraction**: Only extracts `@architect-*` tags from
|
|
361
|
+
* the directive section (first lines before description content). Tags mentioned
|
|
362
|
+
* in descriptions, examples, or other sections are NOT extracted.
|
|
363
|
+
*
|
|
364
|
+
* JSDoc structure:
|
|
365
|
+
* ```
|
|
366
|
+
* /**
|
|
367
|
+
* * @architect-core @architect-api <- Directive tags (extracted)
|
|
368
|
+
* *
|
|
369
|
+
* * Description mentioning @architect-x <- NOT extracted
|
|
370
|
+
* * @example
|
|
371
|
+
* * hasTag('@architect-y'); <- NOT extracted
|
|
372
|
+
* *\/
|
|
373
|
+
* ```
|
|
374
|
+
*/
|
|
375
|
+
function parseDirective(commentText, loc, filePath, registry) {
|
|
376
|
+
const lines = commentText.split('\n').map((l) => l.trim().replace(/^\*\s?/, ''));
|
|
377
|
+
// Build registry-based regex patterns for directive parsing
|
|
378
|
+
const patterns = buildDirectivePatterns(registry);
|
|
379
|
+
const valueTakingTagsRegex = new RegExp(buildValueTakingTagsPattern(registry));
|
|
380
|
+
// Extract directive tags ONLY from directive section
|
|
381
|
+
// Directive section = lines where tags appear at the START (not mentioned in text)
|
|
382
|
+
// A directive tag line: "@architect-core @architect-api Some brief description"
|
|
383
|
+
// A description line: "This works with @architect-api patterns" (tag not at start)
|
|
384
|
+
const tags = [];
|
|
385
|
+
let inlineDescription = ''; // Capture description on same line as tags
|
|
386
|
+
for (const line of lines) {
|
|
387
|
+
const trimmedLine = line.trim();
|
|
388
|
+
// Skip empty lines at the start (before we've found any tags)
|
|
389
|
+
if (trimmedLine === '' && tags.length === 0)
|
|
390
|
+
continue;
|
|
391
|
+
// Stop at empty lines after we've found tags (description section started)
|
|
392
|
+
if (trimmedLine === '' && tags.length > 0)
|
|
393
|
+
break;
|
|
394
|
+
// Check if line starts with a standard JSDoc tag (@param, @returns, @example, etc.)
|
|
395
|
+
// but NOT our doc directives
|
|
396
|
+
if (patterns.nonOptInAtTagPattern.exec(trimmedLine)) {
|
|
397
|
+
break; // Stop at other @ tags
|
|
398
|
+
}
|
|
399
|
+
// Check if line STARTS with opt-in or directive tag
|
|
400
|
+
// e.g., @architect (no suffix) = file opt-in tag
|
|
401
|
+
// e.g., @architect-* (with suffix) = section tag to extract
|
|
402
|
+
const startsWithDocTag = patterns.startsWithOptInOrDirective.exec(trimmedLine);
|
|
403
|
+
if (startsWithDocTag) {
|
|
404
|
+
// This is a directive line - extract only directive tags (with suffix)
|
|
405
|
+
// Skip opt-in tag (no suffix) which is just the opt-in marker
|
|
406
|
+
// e.g., "@architect @architect-core Brief description" extracts only @architect-core
|
|
407
|
+
let match;
|
|
408
|
+
let lastTagEnd = 0;
|
|
409
|
+
patterns.tagRegex.lastIndex = 0;
|
|
410
|
+
while ((match = patterns.tagRegex.exec(trimmedLine)) !== null) {
|
|
411
|
+
// Only extract tags that are at the start (consecutive, separated by whitespace or opt-in)
|
|
412
|
+
const textBefore = trimmedLine.slice(lastTagEnd, match.index).trim();
|
|
413
|
+
// Allow opt-in tag and whitespace between directive tags
|
|
414
|
+
const cleanedBefore = textBefore.replace(patterns.optInTagPattern, '').trim();
|
|
415
|
+
if (lastTagEnd > 0 && cleanedBefore !== '') {
|
|
416
|
+
// There's non-whitespace content between tags - this tag is in description
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
tags.push(match[0]);
|
|
420
|
+
lastTagEnd = match.index + match[0].length;
|
|
421
|
+
}
|
|
422
|
+
// Capture any description text after the tags on the same line
|
|
423
|
+
// e.g., "@architect-core Brief description on same line" -> "Brief description on same line"
|
|
424
|
+
// But skip lines with metadata directives that take values (all non-flag tags)
|
|
425
|
+
// to prevent their values from leaking into the description
|
|
426
|
+
// (e.g., "@architect-phase 01" would incorrectly capture "01")
|
|
427
|
+
const hasMetadataDirective = valueTakingTagsRegex.test(trimmedLine);
|
|
428
|
+
if (!hasMetadataDirective) {
|
|
429
|
+
const textAfterTags = trimmedLine
|
|
430
|
+
.slice(lastTagEnd)
|
|
431
|
+
.replace(patterns.optInTagPattern, '') // Remove any opt-in markers
|
|
432
|
+
.trim();
|
|
433
|
+
if (textAfterTags) {
|
|
434
|
+
inlineDescription = textAfterTags;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// Continue to next line - there might be more directive tags
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
// Line doesn't start with doc tag - it's description content
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
// Data-driven metadata extraction using registry
|
|
445
|
+
// Build map of metadata tag results: tagName -> extracted value
|
|
446
|
+
const metadataResults = new Map();
|
|
447
|
+
for (const tagDef of registry.metadataTags) {
|
|
448
|
+
const result = extractMetadataTag(commentText, tagDef, registry.tagPrefix);
|
|
449
|
+
if (result !== undefined) {
|
|
450
|
+
metadataResults.set(tagDef.tag, result);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// Map extracted metadata to directive fields
|
|
454
|
+
// This mapping translates registry tag names to DocDirective field names
|
|
455
|
+
const patternName = metadataResults.get('pattern');
|
|
456
|
+
const status = metadataResults.get('status');
|
|
457
|
+
const isCore = metadataResults.get('core');
|
|
458
|
+
const useCases = metadataResults.get('usecase');
|
|
459
|
+
const uses = metadataResults.get('uses');
|
|
460
|
+
const usedBy = metadataResults.get('used-by');
|
|
461
|
+
const phase = metadataResults.get('phase');
|
|
462
|
+
const brief = metadataResults.get('brief');
|
|
463
|
+
const dependsOn = metadataResults.get('depends-on');
|
|
464
|
+
const enables = metadataResults.get('enables');
|
|
465
|
+
// UML-inspired relationship tags (PatternRelationshipModel)
|
|
466
|
+
const implementsPatterns = metadataResults.get('implements');
|
|
467
|
+
const extendsPattern = metadataResults.get('extends');
|
|
468
|
+
// Cross-reference and API navigation tags (PatternRelationshipModel enhancement)
|
|
469
|
+
const seeAlso = metadataResults.get('see-also');
|
|
470
|
+
const apiRef = metadataResults.get('api-ref');
|
|
471
|
+
// Architecture diagram generation tags
|
|
472
|
+
const archRole = metadataResults.get('arch-role');
|
|
473
|
+
const archContext = metadataResults.get('arch-context');
|
|
474
|
+
const archLayer = metadataResults.get('arch-layer');
|
|
475
|
+
const includeRaw = metadataResults.get('include');
|
|
476
|
+
const include = Array.isArray(includeRaw) ? includeRaw : undefined;
|
|
477
|
+
// Design session stub metadata tags
|
|
478
|
+
const target = metadataResults.get('target');
|
|
479
|
+
const since = metadataResults.get('since');
|
|
480
|
+
// Shape extraction tags
|
|
481
|
+
const extractShapes = metadataResults.get('extract-shapes');
|
|
482
|
+
// PRD metadata tags (product area, user role, business value)
|
|
483
|
+
const productArea = metadataResults.get('product-area');
|
|
484
|
+
// Convention tags for reference document generation
|
|
485
|
+
const convention = metadataResults.get('convention');
|
|
486
|
+
// Claude module generation tags
|
|
487
|
+
const claudeModule = metadataResults.get('claude-module');
|
|
488
|
+
const claudeSection = metadataResults.get('claude-section');
|
|
489
|
+
const claudeTags = metadataResults.get('claude-tags');
|
|
490
|
+
// Extract "### When to Use" section or "**When to use:**" inline format
|
|
491
|
+
// Returns array of bullet points, stopping at section boundaries
|
|
492
|
+
// This is a special format that extracts from description, not a metadata tag
|
|
493
|
+
const whenToUse = extractWhenToUse(commentText, registry.fileOptInTag);
|
|
494
|
+
// Extract description and examples
|
|
495
|
+
const descriptionLines = [];
|
|
496
|
+
const examples = [];
|
|
497
|
+
let inExample = false;
|
|
498
|
+
let exampleBuffer = [];
|
|
499
|
+
for (const line of lines) {
|
|
500
|
+
if (line.startsWith('@example')) {
|
|
501
|
+
inExample = true;
|
|
502
|
+
if (exampleBuffer.length > 0) {
|
|
503
|
+
examples.push(exampleBuffer.join('\n'));
|
|
504
|
+
exampleBuffer = [];
|
|
505
|
+
}
|
|
506
|
+
continue;
|
|
507
|
+
}
|
|
508
|
+
if (line.startsWith('@param') || line.startsWith('@returns') || line.startsWith('@')) {
|
|
509
|
+
if (inExample && exampleBuffer.length > 0) {
|
|
510
|
+
examples.push(exampleBuffer.join('\n'));
|
|
511
|
+
exampleBuffer = [];
|
|
512
|
+
}
|
|
513
|
+
inExample = false;
|
|
514
|
+
continue;
|
|
515
|
+
}
|
|
516
|
+
if (inExample) {
|
|
517
|
+
// Remove code fence markers
|
|
518
|
+
if (!line.startsWith('```')) {
|
|
519
|
+
exampleBuffer.push(line);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
else if (!line.startsWith('@')) {
|
|
523
|
+
descriptionLines.push(line);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
if (exampleBuffer.length > 0) {
|
|
527
|
+
examples.push(exampleBuffer.join('\n'));
|
|
528
|
+
}
|
|
529
|
+
// Build directive object
|
|
530
|
+
// Combine inline description (from same line as tags) with multi-line description
|
|
531
|
+
const fullDescription = inlineDescription
|
|
532
|
+
? [inlineDescription, ...descriptionLines].join('\n').trim()
|
|
533
|
+
: descriptionLines.join('\n').trim();
|
|
534
|
+
const directive = {
|
|
535
|
+
tags: tags.map((tag) => asDirectiveTag(tag)),
|
|
536
|
+
description: fullDescription,
|
|
537
|
+
examples,
|
|
538
|
+
position: {
|
|
539
|
+
startLine: loc.start.line,
|
|
540
|
+
endLine: loc.end.line,
|
|
541
|
+
},
|
|
542
|
+
// Include optional fields only if present
|
|
543
|
+
...(patternName && { patternName }),
|
|
544
|
+
...(status && { status }),
|
|
545
|
+
...(isCore && { isCore }),
|
|
546
|
+
...(useCases && useCases.length > 0 && { useCases }),
|
|
547
|
+
...(whenToUse && { whenToUse }),
|
|
548
|
+
...(uses && uses.length > 0 && { uses }),
|
|
549
|
+
...(usedBy && usedBy.length > 0 && { usedBy }),
|
|
550
|
+
...(phase !== undefined && { phase }),
|
|
551
|
+
...(brief && { brief }),
|
|
552
|
+
...(dependsOn && dependsOn.length > 0 && { dependsOn }),
|
|
553
|
+
...(enables && enables.length > 0 && { enables }),
|
|
554
|
+
// UML-inspired relationship fields (PatternRelationshipModel)
|
|
555
|
+
...(implementsPatterns && implementsPatterns.length > 0 && { implements: implementsPatterns }),
|
|
556
|
+
...(extendsPattern && { extends: extendsPattern }),
|
|
557
|
+
// Cross-reference and API navigation fields (PatternRelationshipModel enhancement)
|
|
558
|
+
...(seeAlso && seeAlso.length > 0 && { seeAlso }),
|
|
559
|
+
...(apiRef && apiRef.length > 0 && { apiRef }),
|
|
560
|
+
// Design session stub metadata fields
|
|
561
|
+
...(target && { target }),
|
|
562
|
+
...(since && { since }),
|
|
563
|
+
// Architecture diagram generation fields
|
|
564
|
+
...(archRole && { archRole }),
|
|
565
|
+
...(archContext && { archContext }),
|
|
566
|
+
...(archLayer && { archLayer }),
|
|
567
|
+
...(include && include.length > 0 && { include }),
|
|
568
|
+
...(claudeModule && { claudeModule }),
|
|
569
|
+
...(claudeSection && { claudeSection }),
|
|
570
|
+
...(claudeTags && claudeTags.length > 0 && { claudeTags }),
|
|
571
|
+
// Shape extraction fields
|
|
572
|
+
...(extractShapes && extractShapes.length > 0 && { extractShapes }),
|
|
573
|
+
// PRD metadata fields
|
|
574
|
+
...(productArea && { productArea }),
|
|
575
|
+
// Convention tags for reference document generation
|
|
576
|
+
...(convention && convention.length > 0 && { convention }),
|
|
577
|
+
};
|
|
578
|
+
// Validate against schema (schema-first enforcement)
|
|
579
|
+
const validation = DocDirectiveSchema.safeParse(directive);
|
|
580
|
+
if (!validation.success) {
|
|
581
|
+
const error = createDirectiveValidationError(filePath, loc.start.line, 'Invalid directive structure', commentText.substring(0, 100));
|
|
582
|
+
return Result.err(error);
|
|
583
|
+
}
|
|
584
|
+
return Result.ok(validation.data);
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Extract code block immediately following a comment
|
|
588
|
+
*/
|
|
589
|
+
function extractCodeBlockAfterComment(content, ast, comment) {
|
|
590
|
+
if (!comment.range)
|
|
591
|
+
return null;
|
|
592
|
+
const commentEnd = comment.range[1];
|
|
593
|
+
// Find the first meaningful AST node after this comment
|
|
594
|
+
const nextNode = findNextNodeAfterPosition(ast, commentEnd);
|
|
595
|
+
if (!nextNode?.range || !nextNode.loc)
|
|
596
|
+
return null;
|
|
597
|
+
const lines = content.split('\n');
|
|
598
|
+
const startLine = nextNode.loc.start.line;
|
|
599
|
+
const endLine = nextNode.loc.end.line;
|
|
600
|
+
// Extract the code block
|
|
601
|
+
const codeLines = lines.slice(startLine - 1, endLine);
|
|
602
|
+
return {
|
|
603
|
+
code: codeLines.join('\n'),
|
|
604
|
+
startLine,
|
|
605
|
+
endLine,
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Find the first AST node after a given position
|
|
610
|
+
*/
|
|
611
|
+
function findNextNodeAfterPosition(ast, position) {
|
|
612
|
+
for (const node of ast.body) {
|
|
613
|
+
if (node.range && node.range[0] > position) {
|
|
614
|
+
return node;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return null;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Extract export information from a code block
|
|
621
|
+
*/
|
|
622
|
+
function extractExportsFromBlock(ast, block, sourceCode) {
|
|
623
|
+
const exports = [];
|
|
624
|
+
for (const node of ast.body) {
|
|
625
|
+
if (!node.loc)
|
|
626
|
+
continue;
|
|
627
|
+
if (node.loc.start.line < block.startLine || node.loc.end.line > block.endLine)
|
|
628
|
+
continue;
|
|
629
|
+
if (node.type === 'ExportNamedDeclaration') {
|
|
630
|
+
if (node.declaration) {
|
|
631
|
+
exports.push(...extractFromDeclaration(node.declaration, sourceCode));
|
|
632
|
+
}
|
|
633
|
+
// Handle re-exports like: export { foo, bar } from './module'
|
|
634
|
+
// or type exports: export type { Foo } from './module'
|
|
635
|
+
if (node.specifiers) {
|
|
636
|
+
// Check if parent ExportNamedDeclaration is type-only
|
|
637
|
+
const isTypeExport = node.exportKind === 'type';
|
|
638
|
+
for (const spec of node.specifiers) {
|
|
639
|
+
if (spec.type === 'ExportSpecifier') {
|
|
640
|
+
// TypeScript 5.9.0+: exported can be Identifier or Literal (StringLiteral)
|
|
641
|
+
// Handles cases like: export { "foo-bar" as baz } from './module'
|
|
642
|
+
// Type union exhaustion: only Identifier and Literal are valid types here
|
|
643
|
+
const exportedName = spec.exported.type === 'Identifier'
|
|
644
|
+
? spec.exported.name
|
|
645
|
+
: spec.exported.value; // Literal type - extract value
|
|
646
|
+
exports.push({
|
|
647
|
+
name: exportedName,
|
|
648
|
+
type: isTypeExport ? 'type' : 'const',
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
else if (node.type === 'ExportDefaultDeclaration') {
|
|
655
|
+
exports.push({
|
|
656
|
+
name: 'default',
|
|
657
|
+
type: getExportType(node.declaration),
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
return exports;
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Build a clean function signature from AST node and source code.
|
|
665
|
+
*
|
|
666
|
+
* DD-1: Uses AST body range to precisely locate the function body start,
|
|
667
|
+
* then slices everything before it as the signature. This avoids flawed
|
|
668
|
+
* brace-matching that fails on object parameter types like `{ timeout: number }`.
|
|
669
|
+
* Strips `export ` prefix but keeps `async` (semantically meaningful).
|
|
670
|
+
*/
|
|
671
|
+
function buildFunctionSignature(declaration, sourceCode) {
|
|
672
|
+
// Use AST body range for precise body location (no brace-matching needed)
|
|
673
|
+
if (declaration.body) {
|
|
674
|
+
const bodyStart = declaration.body.range[0];
|
|
675
|
+
const declStart = declaration.range[0];
|
|
676
|
+
const beforeBody = sourceCode.slice(declStart, bodyStart);
|
|
677
|
+
// Strip 'export ' prefix for clean display
|
|
678
|
+
const withoutExport = beforeBody.startsWith('export ')
|
|
679
|
+
? beforeBody.slice('export '.length)
|
|
680
|
+
: beforeBody;
|
|
681
|
+
return withoutExport.trim() + ';';
|
|
682
|
+
}
|
|
683
|
+
// Fallback for declarations without body (ambient/abstract)
|
|
684
|
+
const fullText = sourceCode.slice(declaration.range[0], declaration.range[1]);
|
|
685
|
+
return fullText.startsWith('export ') ? fullText.slice('export '.length).trim() : fullText.trim();
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* Extract exports from a declaration node
|
|
689
|
+
*/
|
|
690
|
+
function extractFromDeclaration(declaration, sourceCode) {
|
|
691
|
+
const exports = [];
|
|
692
|
+
switch (declaration.type) {
|
|
693
|
+
case 'FunctionDeclaration':
|
|
694
|
+
if (declaration.id) {
|
|
695
|
+
exports.push({
|
|
696
|
+
name: declaration.id.name,
|
|
697
|
+
type: 'function',
|
|
698
|
+
signature: buildFunctionSignature(declaration, sourceCode),
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
break;
|
|
702
|
+
case 'VariableDeclaration':
|
|
703
|
+
for (const declarator of declaration.declarations) {
|
|
704
|
+
if (declarator.id.type === 'Identifier') {
|
|
705
|
+
exports.push({
|
|
706
|
+
name: declarator.id.name,
|
|
707
|
+
type: 'const',
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
break;
|
|
712
|
+
case 'TSTypeAliasDeclaration':
|
|
713
|
+
exports.push({
|
|
714
|
+
name: declaration.id.name,
|
|
715
|
+
type: 'type',
|
|
716
|
+
});
|
|
717
|
+
break;
|
|
718
|
+
case 'TSInterfaceDeclaration':
|
|
719
|
+
exports.push({
|
|
720
|
+
name: declaration.id.name,
|
|
721
|
+
type: 'interface',
|
|
722
|
+
});
|
|
723
|
+
break;
|
|
724
|
+
case 'ClassDeclaration':
|
|
725
|
+
if (declaration.id) {
|
|
726
|
+
exports.push({
|
|
727
|
+
name: declaration.id.name,
|
|
728
|
+
type: 'class',
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
break;
|
|
732
|
+
case 'TSEnumDeclaration':
|
|
733
|
+
if (declaration.id) {
|
|
734
|
+
exports.push({
|
|
735
|
+
name: declaration.id.name,
|
|
736
|
+
type: 'enum',
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
return exports;
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* Get export type from declaration
|
|
745
|
+
*/
|
|
746
|
+
function getExportType(declaration) {
|
|
747
|
+
switch (declaration.type) {
|
|
748
|
+
case 'FunctionDeclaration':
|
|
749
|
+
return 'function';
|
|
750
|
+
case 'ClassDeclaration':
|
|
751
|
+
return 'class';
|
|
752
|
+
case 'TSInterfaceDeclaration':
|
|
753
|
+
return 'interface';
|
|
754
|
+
case 'TSTypeAliasDeclaration':
|
|
755
|
+
return 'type';
|
|
756
|
+
default:
|
|
757
|
+
return 'const';
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
/**
|
|
761
|
+
* Extract "When to Use" bullet points from JSDoc comment
|
|
762
|
+
*
|
|
763
|
+
* Handles two formats:
|
|
764
|
+
* - Heading format: `### When to Use\n- bullet 1\n- bullet 2`
|
|
765
|
+
* - Inline format: `**When to use:** Single line description`
|
|
766
|
+
*
|
|
767
|
+
* Key improvements over naive regex:
|
|
768
|
+
* - Strips JSDoc `* ` markers before matching
|
|
769
|
+
* - Only captures actual bullet points (lines starting with `- ` or `* `)
|
|
770
|
+
* - Stops at section boundaries (empty lines, headings, tables, JSDoc tags)
|
|
771
|
+
*
|
|
772
|
+
* **Limitation:** Multi-line bullets (continuation lines) are not supported.
|
|
773
|
+
* Each bullet must be a single line. For example:
|
|
774
|
+
* ```
|
|
775
|
+
* ### When to Use
|
|
776
|
+
* - This works (single line)
|
|
777
|
+
* - This is broken because it
|
|
778
|
+
* continues on the next line // <-- Not captured
|
|
779
|
+
* ```
|
|
780
|
+
* Recommendation: Keep all bullet points as single lines.
|
|
781
|
+
*
|
|
782
|
+
* @param commentText - Raw JSDoc comment content
|
|
783
|
+
* @param fileOptInTag - The file opt-in tag (e.g., "@docs" or "@architect")
|
|
784
|
+
* @returns Array of bullet point strings, or undefined if no "When to Use" section
|
|
785
|
+
*/
|
|
786
|
+
function extractWhenToUse(commentText, fileOptInTag) {
|
|
787
|
+
// Strip JSDoc markers and normalize lines
|
|
788
|
+
const cleanedLines = commentText.split('\n').map((line) => line
|
|
789
|
+
.trim()
|
|
790
|
+
.replace(/^\*\s?/, '')
|
|
791
|
+
.trim());
|
|
792
|
+
const cleanedText = cleanedLines.join('\n');
|
|
793
|
+
// Try heading format first: ### When to Use
|
|
794
|
+
const headingMatch = /###\s*When to Use\s*\n/i.exec(cleanedText);
|
|
795
|
+
if (headingMatch) {
|
|
796
|
+
const startIndex = headingMatch.index + headingMatch[0].length;
|
|
797
|
+
const afterHeading = cleanedText.slice(startIndex);
|
|
798
|
+
const lines = afterHeading.split('\n');
|
|
799
|
+
const bullets = [];
|
|
800
|
+
for (const line of lines) {
|
|
801
|
+
const trimmed = line.trim();
|
|
802
|
+
// Stop conditions: empty line, new heading, table, JSDoc tag (but not doc directives)
|
|
803
|
+
if (trimmed === '')
|
|
804
|
+
break;
|
|
805
|
+
if (trimmed.startsWith('#'))
|
|
806
|
+
break;
|
|
807
|
+
if (trimmed.startsWith('|'))
|
|
808
|
+
break;
|
|
809
|
+
if (trimmed.startsWith('@') && !trimmed.startsWith(fileOptInTag))
|
|
810
|
+
break;
|
|
811
|
+
// Extract bullet point content (must start with - or * followed by space)
|
|
812
|
+
const bulletMatch = /^[-*]\s+(.+)$/.exec(trimmed);
|
|
813
|
+
if (bulletMatch?.[1]) {
|
|
814
|
+
bullets.push(bulletMatch[1].trim());
|
|
815
|
+
}
|
|
816
|
+
else {
|
|
817
|
+
// Line doesn't start with bullet - stop extraction
|
|
818
|
+
break;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
if (bullets.length > 0) {
|
|
822
|
+
return bullets;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
// Try inline format: **When to use:** description
|
|
826
|
+
const inlineMatch = /\*\*When to use:\*\*\s*([^\n]+)/i.exec(cleanedText);
|
|
827
|
+
if (inlineMatch?.[1]) {
|
|
828
|
+
const description = inlineMatch[1].trim();
|
|
829
|
+
if (description) {
|
|
830
|
+
return [description];
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
return undefined;
|
|
834
|
+
}
|
|
835
|
+
//# sourceMappingURL=ast-parser.js.map
|