@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,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @architect
|
|
3
|
+
* @architect-lint
|
|
4
|
+
* @architect-pattern LintRules
|
|
5
|
+
* @architect-status completed
|
|
6
|
+
* @architect-arch-role service
|
|
7
|
+
* @architect-arch-context lint
|
|
8
|
+
* @architect-arch-layer application
|
|
9
|
+
* @architect-implements PatternRelationshipModel
|
|
10
|
+
* @architect-used-by LintEngine
|
|
11
|
+
* @architect-extract-shapes LintRule, LintContext, defaultRules, severityOrder, filterRulesBySeverity, missingPatternName, missingStatus, invalidStatus, missingWhenToUse, tautologicalDescription, missingRelationships, patternConflictInImplements, missingRelationshipTarget
|
|
12
|
+
*
|
|
13
|
+
* ## LintRules - Annotation Quality Rules
|
|
14
|
+
*
|
|
15
|
+
* Defines lint rules that check @architect-* directives for completeness
|
|
16
|
+
* and quality. Rules include: missing-pattern-name, missing-status,
|
|
17
|
+
* missing-when-to-use, tautological-description, and missing-relationships.
|
|
18
|
+
*
|
|
19
|
+
* ### When to Use
|
|
20
|
+
*
|
|
21
|
+
* - Use `defaultRules` for standard quality checks
|
|
22
|
+
* - Use `filterRulesBySeverity()` to customize which rules apply
|
|
23
|
+
* - Use individual rules for targeted validation
|
|
24
|
+
*/
|
|
25
|
+
import { PROCESS_STATUS_VALUES, VALID_PROCESS_STATUS_SET } from '../taxonomy/index.js';
|
|
26
|
+
import { DEFAULT_TAG_PREFIX } from '../config/defaults.js';
|
|
27
|
+
/**
|
|
28
|
+
* Multiplier for determining if description has "substantial content" beyond the pattern name.
|
|
29
|
+
* If description length > name length * this multiplier, it's considered substantial.
|
|
30
|
+
*/
|
|
31
|
+
const SUBSTANTIAL_CONTENT_MULTIPLIER = 2;
|
|
32
|
+
/**
|
|
33
|
+
* Create a lint violation
|
|
34
|
+
*/
|
|
35
|
+
function violation(rule, severity, message, file, line) {
|
|
36
|
+
return { rule, severity, message, file, line };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the tag prefix from context or use default.
|
|
40
|
+
*/
|
|
41
|
+
function getTagPrefix(context) {
|
|
42
|
+
return context?.registry?.tagPrefix ?? DEFAULT_TAG_PREFIX;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Rule: missing-pattern-name
|
|
46
|
+
*
|
|
47
|
+
* Patterns must have an explicit name via the pattern tag.
|
|
48
|
+
* Without a name, the pattern can't be referenced in relationships
|
|
49
|
+
* or indexed properly.
|
|
50
|
+
*/
|
|
51
|
+
export const missingPatternName = {
|
|
52
|
+
id: 'missing-pattern-name',
|
|
53
|
+
severity: 'error',
|
|
54
|
+
description: 'Pattern must have explicit pattern name tag',
|
|
55
|
+
check: (directive, file, line, context) => {
|
|
56
|
+
// Skip if this is an implementation-only file (has implements tag)
|
|
57
|
+
// Implementation files realize patterns defined elsewhere and don't need their own name
|
|
58
|
+
const hasImplements = (directive.implements?.length ?? 0) > 0;
|
|
59
|
+
if (hasImplements) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (!directive.patternName || directive.patternName.trim() === '') {
|
|
63
|
+
const tagPrefix = getTagPrefix(context);
|
|
64
|
+
return violation('missing-pattern-name', 'error', `Pattern missing explicit name. Add ${tagPrefix}pattern YourPatternName`, file, line);
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Rule: missing-status
|
|
71
|
+
*
|
|
72
|
+
* Patterns should have an explicit status (completed, active, roadmap, deferred).
|
|
73
|
+
* This helps readers understand if the pattern is ready for use.
|
|
74
|
+
*/
|
|
75
|
+
export const missingStatus = {
|
|
76
|
+
id: 'missing-status',
|
|
77
|
+
severity: 'warning',
|
|
78
|
+
description: 'Pattern should have status tag (roadmap|active|completed|deferred)',
|
|
79
|
+
check: (directive, file, line, context) => {
|
|
80
|
+
if (!directive.status) {
|
|
81
|
+
const tagPrefix = getTagPrefix(context);
|
|
82
|
+
return violation('missing-status', 'warning', `No ${tagPrefix}status found. Add: ${tagPrefix}status roadmap|active|completed|deferred`, file, line);
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Rule: invalid-status
|
|
89
|
+
*
|
|
90
|
+
* Status values must be valid PDR-005 FSM states.
|
|
91
|
+
*/
|
|
92
|
+
export const invalidStatus = {
|
|
93
|
+
id: 'invalid-status',
|
|
94
|
+
severity: 'error',
|
|
95
|
+
description: 'Status must be a valid FSM state (roadmap, active, completed, deferred)',
|
|
96
|
+
check: (directive, file, line) => {
|
|
97
|
+
// Skip if no status (handled by missing-status rule)
|
|
98
|
+
if (!directive.status) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
if (!VALID_PROCESS_STATUS_SET.has(directive.status.toLowerCase())) {
|
|
102
|
+
return violation('invalid-status', 'error', `Invalid status '${directive.status}'. Valid values: ${PROCESS_STATUS_VALUES.join(', ')}.`, file, line);
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Rule: missing-when-to-use
|
|
109
|
+
*
|
|
110
|
+
* Patterns should have a "When to Use" section for LLM-friendly guidance.
|
|
111
|
+
* This helps developers understand when the pattern applies.
|
|
112
|
+
*/
|
|
113
|
+
export const missingWhenToUse = {
|
|
114
|
+
id: 'missing-when-to-use',
|
|
115
|
+
severity: 'warning',
|
|
116
|
+
description: 'Pattern should have "When to Use" section in description',
|
|
117
|
+
check: (directive, file, line) => {
|
|
118
|
+
// whenToUse is now an array of bullet points
|
|
119
|
+
if (!directive.whenToUse || directive.whenToUse.length === 0) {
|
|
120
|
+
return violation('missing-when-to-use', 'warning', 'No "When to Use" section found. Add ### When to Use or **When to use:** in description', file, line);
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
/**
|
|
126
|
+
* Rule: tautological-description
|
|
127
|
+
*
|
|
128
|
+
* The description should not simply repeat the pattern name.
|
|
129
|
+
* A tautological description provides no useful information.
|
|
130
|
+
*/
|
|
131
|
+
export const tautologicalDescription = {
|
|
132
|
+
id: 'tautological-description',
|
|
133
|
+
severity: 'error',
|
|
134
|
+
description: 'Description should not simply repeat the pattern name',
|
|
135
|
+
check: (directive, file, line) => {
|
|
136
|
+
if (!directive.patternName || !directive.description) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
// Get first meaningful line of description (skip empty lines and headings)
|
|
140
|
+
const lines = directive.description.split('\n');
|
|
141
|
+
const firstLine = lines
|
|
142
|
+
.map((l) => l.trim())
|
|
143
|
+
.find((l) => l.length > 0 && !l.startsWith('#') && !l.startsWith('**When'));
|
|
144
|
+
if (!firstLine) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
// Normalize for comparison (lowercase, remove punctuation)
|
|
148
|
+
const normalizedName = directive.patternName.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
149
|
+
const normalizedDesc = firstLine.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
150
|
+
// Check if description starts with or equals the pattern name
|
|
151
|
+
if (normalizedDesc === normalizedName || normalizedDesc.startsWith(normalizedName)) {
|
|
152
|
+
// Allow if there's substantial content after the name
|
|
153
|
+
if (normalizedDesc.length > normalizedName.length * SUBSTANTIAL_CONTENT_MULTIPLIER) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return violation('tautological-description', 'error', `Description repeats pattern name "${directive.patternName}". Provide meaningful context.`, file, line);
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
/**
|
|
162
|
+
* Rule: missing-relationships
|
|
163
|
+
*
|
|
164
|
+
* Patterns should declare their relationships (uses/usedBy) for
|
|
165
|
+
* dependency tracking. This is informational only.
|
|
166
|
+
*/
|
|
167
|
+
export const missingRelationships = {
|
|
168
|
+
id: 'missing-relationships',
|
|
169
|
+
severity: 'info',
|
|
170
|
+
description: 'Consider adding uses and used-by tags',
|
|
171
|
+
check: (directive, file, line, context) => {
|
|
172
|
+
const hasUses = (directive.uses?.length ?? 0) > 0;
|
|
173
|
+
const hasUsedBy = (directive.usedBy?.length ?? 0) > 0;
|
|
174
|
+
if (!hasUses && !hasUsedBy) {
|
|
175
|
+
const tagPrefix = getTagPrefix(context);
|
|
176
|
+
return violation('missing-relationships', 'info', `Consider adding relationship tags: ${tagPrefix}uses and/or ${tagPrefix}used-by`, file, line);
|
|
177
|
+
}
|
|
178
|
+
return null;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
182
|
+
// Relationship Validation Rules (PatternRelationshipModel)
|
|
183
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
184
|
+
/**
|
|
185
|
+
* Rule: pattern-conflict-in-implements
|
|
186
|
+
*
|
|
187
|
+
* Validates that a file doesn't create a circular reference by defining
|
|
188
|
+
* a pattern that it also implements. Having both @architect-pattern X
|
|
189
|
+
* AND @architect-implements X on the same file is a conflict.
|
|
190
|
+
*
|
|
191
|
+
* However, a file CAN have both tags when they reference DIFFERENT patterns:
|
|
192
|
+
* - @architect-pattern SubPattern (defines its own identity)
|
|
193
|
+
* - @architect-implements ParentSpec (links to parent spec)
|
|
194
|
+
*
|
|
195
|
+
* This supports the sub-pattern hierarchy where implementation files can be
|
|
196
|
+
* named patterns that also implement a larger spec (e.g., MockPaymentActions
|
|
197
|
+
* implementing DurableEventsIntegration).
|
|
198
|
+
*/
|
|
199
|
+
export const patternConflictInImplements = {
|
|
200
|
+
id: 'pattern-conflict-in-implements',
|
|
201
|
+
severity: 'error',
|
|
202
|
+
description: 'Pattern cannot implement itself (circular reference)',
|
|
203
|
+
check: (directive, file, line, context) => {
|
|
204
|
+
const hasImplements = (directive.implements?.length ?? 0) > 0;
|
|
205
|
+
const patternName = directive.patternName;
|
|
206
|
+
if (hasImplements && patternName !== undefined) {
|
|
207
|
+
// Only error if pattern name matches any implements target (circular reference)
|
|
208
|
+
const patternNameLower = patternName.toLowerCase();
|
|
209
|
+
const implementsTargets = directive.implements?.map((i) => i.toLowerCase()) ?? [];
|
|
210
|
+
if (implementsTargets.includes(patternNameLower)) {
|
|
211
|
+
const tagPrefix = getTagPrefix(context);
|
|
212
|
+
return violation('pattern-conflict-in-implements', 'error', `Pattern '${patternName}' cannot implement itself. ` +
|
|
213
|
+
`Remove either ${tagPrefix}pattern or ${tagPrefix}implements for this pattern.`, file, line);
|
|
214
|
+
}
|
|
215
|
+
// Different patterns: OK - this is a sub-pattern implementing a parent spec
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Rule: missing-relationship-target
|
|
222
|
+
*
|
|
223
|
+
* Validates that relationship targets (uses, implements) reference
|
|
224
|
+
* patterns that actually exist. Only triggers when a LintContext with
|
|
225
|
+
* knownPatterns is provided (strict mode).
|
|
226
|
+
*
|
|
227
|
+
* This is a context-aware rule that requires access to the pattern registry.
|
|
228
|
+
*/
|
|
229
|
+
export const missingRelationshipTarget = {
|
|
230
|
+
id: 'missing-relationship-target',
|
|
231
|
+
severity: 'warning',
|
|
232
|
+
description: 'Relationship targets must reference existing patterns',
|
|
233
|
+
check: (directive, file, line, context) => {
|
|
234
|
+
// Skip if no context provided (non-strict mode)
|
|
235
|
+
if (!context?.knownPatterns) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
const violations = [];
|
|
239
|
+
// Check uses targets
|
|
240
|
+
for (const target of directive.uses ?? []) {
|
|
241
|
+
if (!context.knownPatterns.has(target)) {
|
|
242
|
+
violations.push(violation('missing-relationship-target', 'warning', `Relationship target '${target}' not found in known patterns`, file, line));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Check implements targets
|
|
246
|
+
for (const target of directive.implements ?? []) {
|
|
247
|
+
if (!context.knownPatterns.has(target)) {
|
|
248
|
+
violations.push(violation('missing-relationship-target', 'warning', `Implementation target '${target}' not found in known patterns`, file, line));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return violations.length > 0 ? violations : null;
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* All default lint rules
|
|
256
|
+
*
|
|
257
|
+
* Order matters for output - errors first, then warnings, then info.
|
|
258
|
+
*/
|
|
259
|
+
export const defaultRules = [
|
|
260
|
+
missingPatternName,
|
|
261
|
+
tautologicalDescription,
|
|
262
|
+
invalidStatus,
|
|
263
|
+
patternConflictInImplements, // PatternRelationshipModel rule
|
|
264
|
+
missingRelationshipTarget, // Context-aware relationship validation
|
|
265
|
+
missingStatus,
|
|
266
|
+
missingWhenToUse,
|
|
267
|
+
missingRelationships,
|
|
268
|
+
];
|
|
269
|
+
/**
|
|
270
|
+
* Severity ordering for sorting and filtering
|
|
271
|
+
* Exported for use by lint engine to avoid duplication
|
|
272
|
+
*/
|
|
273
|
+
export const severityOrder = {
|
|
274
|
+
error: 0,
|
|
275
|
+
warning: 1,
|
|
276
|
+
info: 2,
|
|
277
|
+
};
|
|
278
|
+
/**
|
|
279
|
+
* Get rules filtered by minimum severity
|
|
280
|
+
*
|
|
281
|
+
* @param rules - Rules to filter
|
|
282
|
+
* @param minSeverity - Minimum severity to include
|
|
283
|
+
* @returns Filtered rules
|
|
284
|
+
*/
|
|
285
|
+
export function filterRulesBySeverity(rules, minSeverity) {
|
|
286
|
+
const minLevel = severityOrder[minSeverity];
|
|
287
|
+
return rules.filter((rule) => severityOrder[rule.severity] <= minLevel);
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lint/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-file lint checks for vitest-cucumber compatibility.
|
|
3
|
+
*
|
|
4
|
+
* These checks compare a .feature file with its corresponding .steps.ts
|
|
5
|
+
* file to detect mismatches in structure (Rule/And/ScenarioOutline patterns).
|
|
6
|
+
*/
|
|
7
|
+
import type { LintViolation } from '../../validation-schemas/lint.js';
|
|
8
|
+
/**
|
|
9
|
+
* Check 1: Detect function params used inside ScenarioOutline blocks.
|
|
10
|
+
*
|
|
11
|
+
* In vitest-cucumber, ScenarioOutline step callbacks receive values via a
|
|
12
|
+
* `variables` object — NOT via function parameters. Using (_ctx, value: string)
|
|
13
|
+
* as callback args is the #1 trap: the value will be undefined at runtime.
|
|
14
|
+
*
|
|
15
|
+
* Detection: Find ScenarioOutline/RuleScenarioOutline blocks in step files,
|
|
16
|
+
* then within those blocks look for step callbacks with a second positional
|
|
17
|
+
* parameter after _ctx.
|
|
18
|
+
*
|
|
19
|
+
* The heuristic is conservative: we only flag when we see an explicit second
|
|
20
|
+
* positional parameter pattern. False negatives are acceptable; false positives
|
|
21
|
+
* are not.
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkScenarioOutlineFunctionParams(featureContent: string, stepContent: string, stepFilePath: string): readonly LintViolation[];
|
|
24
|
+
/**
|
|
25
|
+
* Check 2: Detect missing And destructuring.
|
|
26
|
+
*
|
|
27
|
+
* If a feature file has And steps, the step definition must destructure And
|
|
28
|
+
* from the scenario callback. Using Then(...) for And steps causes
|
|
29
|
+
* StepAbleUnknowStepError at runtime.
|
|
30
|
+
*/
|
|
31
|
+
export declare function checkMissingAndDestructuring(featureContent: string, stepContent: string, stepFilePath: string): readonly LintViolation[];
|
|
32
|
+
/**
|
|
33
|
+
* Check 3: Detect missing Rule() wrapper.
|
|
34
|
+
*
|
|
35
|
+
* If a feature file has Rule: blocks, the step definition must destructure
|
|
36
|
+
* Rule from describeFeature and wrap scenarios with Rule('name', ...).
|
|
37
|
+
* Using top-level Scenario() instead of RuleScenario() causes step
|
|
38
|
+
* matching failures.
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkMissingRuleWrapper(featureContent: string, stepContent: string, stepFilePath: string): readonly LintViolation[];
|
|
41
|
+
/**
|
|
42
|
+
* Check 12: Detect quoted values in Scenario Outline steps (feature-file side).
|
|
43
|
+
*
|
|
44
|
+
* When a Scenario Outline's steps use quoted values (e.g., "foo") instead of
|
|
45
|
+
* angle-bracket placeholders (e.g., <column>), this suggests the author is
|
|
46
|
+
* using the Scenario pattern (Cucumber expression matching) instead of the
|
|
47
|
+
* ScenarioOutline pattern (variable substitution). This is the feature-file
|
|
48
|
+
* side of the Two-Pattern Problem — the step-file side is caught by
|
|
49
|
+
* scenario-outline-function-params.
|
|
50
|
+
*
|
|
51
|
+
* Detection: Find Scenario Outline sections in the feature file, extract the
|
|
52
|
+
* Examples table column names, then check if step lines within those sections
|
|
53
|
+
* contain quoted values whose content matches a column name. Only those are
|
|
54
|
+
* flagged — constant quoted values (e.g., "error") that don't correspond to
|
|
55
|
+
* any Examples column are intentionally literal and should not be placeholders.
|
|
56
|
+
*
|
|
57
|
+
* This is a cross-file check because it's only meaningful when a paired step
|
|
58
|
+
* file exists (roadmap specs without implementations shouldn't be flagged).
|
|
59
|
+
* The _stepContent parameter is unused but maintains the cross-check signature.
|
|
60
|
+
*/
|
|
61
|
+
export declare function checkOutlineQuotedValues(featureContent: string, _stepContent: string, stepFilePath: string, featurePath?: string): readonly LintViolation[];
|
|
62
|
+
/**
|
|
63
|
+
* Run all cross-file checks on a paired feature + step file.
|
|
64
|
+
*/
|
|
65
|
+
export declare function runCrossChecks(featureContent: string, stepContent: string, stepFilePath: string, featurePath?: string): readonly LintViolation[];
|
|
66
|
+
//# sourceMappingURL=cross-checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-checks.d.ts","sourceRoot":"","sources":["../../../src/lint/steps/cross-checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAItE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kCAAkC,CAChD,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,SAAS,aAAa,EAAE,CAwD1B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,SAAS,aAAa,EAAE,CAqC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,SAAS,aAAa,EAAE,CAqC1B;AAwDD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,aAAa,EAAE,CAmE1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,SAAS,aAAa,EAAE,CAO1B"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-file lint checks for vitest-cucumber compatibility.
|
|
3
|
+
*
|
|
4
|
+
* These checks compare a .feature file with its corresponding .steps.ts
|
|
5
|
+
* file to detect mismatches in structure (Rule/And/ScenarioOutline patterns).
|
|
6
|
+
*/
|
|
7
|
+
import { STEP_LINT_RULES } from './types.js';
|
|
8
|
+
import { countBraceBalance } from './utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Check 1: Detect function params used inside ScenarioOutline blocks.
|
|
11
|
+
*
|
|
12
|
+
* In vitest-cucumber, ScenarioOutline step callbacks receive values via a
|
|
13
|
+
* `variables` object — NOT via function parameters. Using (_ctx, value: string)
|
|
14
|
+
* as callback args is the #1 trap: the value will be undefined at runtime.
|
|
15
|
+
*
|
|
16
|
+
* Detection: Find ScenarioOutline/RuleScenarioOutline blocks in step files,
|
|
17
|
+
* then within those blocks look for step callbacks with a second positional
|
|
18
|
+
* parameter after _ctx.
|
|
19
|
+
*
|
|
20
|
+
* The heuristic is conservative: we only flag when we see an explicit second
|
|
21
|
+
* positional parameter pattern. False negatives are acceptable; false positives
|
|
22
|
+
* are not.
|
|
23
|
+
*/
|
|
24
|
+
export function checkScenarioOutlineFunctionParams(featureContent, stepContent, stepFilePath) {
|
|
25
|
+
// Only check if the feature actually has Scenario Outline
|
|
26
|
+
if (!/^\s*(Scenario Outline|Scenario Template):/m.test(featureContent)) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const violations = [];
|
|
30
|
+
const lines = stepContent.split('\n');
|
|
31
|
+
// Track whether we're inside a ScenarioOutline block using brace depth
|
|
32
|
+
let inOutlineBlock = false;
|
|
33
|
+
let braceDepth = 0;
|
|
34
|
+
let outlineStartLine = 0;
|
|
35
|
+
for (let i = 0; i < lines.length; i++) {
|
|
36
|
+
const line = lines[i];
|
|
37
|
+
if (line === undefined)
|
|
38
|
+
continue;
|
|
39
|
+
// Detect ScenarioOutline( or RuleScenarioOutline( call
|
|
40
|
+
if (!inOutlineBlock && /(?:Scenario|RuleScenario)Outline\s*\(/.test(line)) {
|
|
41
|
+
inOutlineBlock = true;
|
|
42
|
+
outlineStartLine = i + 1;
|
|
43
|
+
// Count opening braces on this line to start depth tracking
|
|
44
|
+
braceDepth = countBraceBalance(line);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (inOutlineBlock) {
|
|
48
|
+
braceDepth += countBraceBalance(line);
|
|
49
|
+
// Check for step callbacks with function params: Given('text', (_ctx, value: type) =>
|
|
50
|
+
// The pattern: a step keyword, string arg, then a callback with 2+ params
|
|
51
|
+
const paramMatch = /(?:Given|When|Then|And|But)\s*\(\s*['"][^'"]*['"]\s*,\s*\(\s*_?ctx\s*(?::\s*\w+)?\s*,\s*(\w+)/.exec(line);
|
|
52
|
+
if (paramMatch !== null) {
|
|
53
|
+
const paramName = paramMatch[1] ?? 'unknown';
|
|
54
|
+
violations.push({
|
|
55
|
+
rule: STEP_LINT_RULES.scenarioOutlineFunctionParams.id,
|
|
56
|
+
severity: STEP_LINT_RULES.scenarioOutlineFunctionParams.severity,
|
|
57
|
+
message: `Step callback inside ScenarioOutline uses function param "${paramName}" — use variables object instead (ScenarioOutline started at line ${outlineStartLine})`,
|
|
58
|
+
file: stepFilePath,
|
|
59
|
+
line: i + 1,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// End of ScenarioOutline block
|
|
63
|
+
if (braceDepth <= 0) {
|
|
64
|
+
inOutlineBlock = false;
|
|
65
|
+
braceDepth = 0;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return violations;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check 2: Detect missing And destructuring.
|
|
73
|
+
*
|
|
74
|
+
* If a feature file has And steps, the step definition must destructure And
|
|
75
|
+
* from the scenario callback. Using Then(...) for And steps causes
|
|
76
|
+
* StepAbleUnknowStepError at runtime.
|
|
77
|
+
*/
|
|
78
|
+
export function checkMissingAndDestructuring(featureContent, stepContent, stepFilePath) {
|
|
79
|
+
// Check if feature has any And steps
|
|
80
|
+
const hasAndSteps = /^\s+And\s+/m.test(featureContent);
|
|
81
|
+
if (!hasAndSteps) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
// Check if step file destructures And anywhere.
|
|
85
|
+
// NOTE: This regex matches And inside ANY curly brace pair, including object
|
|
86
|
+
// literals with an `And` property. This is a theoretical false negative (would
|
|
87
|
+
// pass when it should flag), which is the safe direction. In practice, step
|
|
88
|
+
// files don't have object literals with `And` keys.
|
|
89
|
+
const destructuresAnd = /\{\s*[^}]*\bAnd\b[^}]*\}/.test(stepContent);
|
|
90
|
+
if (destructuresAnd) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
// Find the line of the describeFeature call for context
|
|
94
|
+
const lines = stepContent.split('\n');
|
|
95
|
+
let describeLine = 1;
|
|
96
|
+
for (let i = 0; i < lines.length; i++) {
|
|
97
|
+
const ln = lines[i];
|
|
98
|
+
if (ln !== undefined && /describeFeature\s*\(/.test(ln)) {
|
|
99
|
+
describeLine = i + 1;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return [
|
|
104
|
+
{
|
|
105
|
+
rule: STEP_LINT_RULES.missingAndDestructuring.id,
|
|
106
|
+
severity: STEP_LINT_RULES.missingAndDestructuring.severity,
|
|
107
|
+
message: `Feature has And steps but step definition does not destructure And — add And to the destructuring pattern ({ Given, When, Then, And })`,
|
|
108
|
+
file: stepFilePath,
|
|
109
|
+
line: describeLine,
|
|
110
|
+
},
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check 3: Detect missing Rule() wrapper.
|
|
115
|
+
*
|
|
116
|
+
* If a feature file has Rule: blocks, the step definition must destructure
|
|
117
|
+
* Rule from describeFeature and wrap scenarios with Rule('name', ...).
|
|
118
|
+
* Using top-level Scenario() instead of RuleScenario() causes step
|
|
119
|
+
* matching failures.
|
|
120
|
+
*/
|
|
121
|
+
export function checkMissingRuleWrapper(featureContent, stepContent, stepFilePath) {
|
|
122
|
+
// Check if feature has any Rule: blocks
|
|
123
|
+
const hasRuleBlocks = /^\s*Rule:\s/m.test(featureContent);
|
|
124
|
+
if (!hasRuleBlocks) {
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
// Check if step file destructures Rule from describeFeature
|
|
128
|
+
// Pattern: describeFeature(feature, ({ ... Rule ... }) =>
|
|
129
|
+
// We look for Rule in any destructuring pattern, since it could appear anywhere
|
|
130
|
+
const destructuresRule = /describeFeature\s*\([^,]*,\s*\(\s*\{[^}]*\bRule\b[^}]*\}/.test(stepContent);
|
|
131
|
+
if (destructuresRule) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
// Find the line of the describeFeature call for context
|
|
135
|
+
const lines = stepContent.split('\n');
|
|
136
|
+
let describeLine = 1;
|
|
137
|
+
for (let i = 0; i < lines.length; i++) {
|
|
138
|
+
const ln = lines[i];
|
|
139
|
+
if (ln !== undefined && /describeFeature\s*\(/.test(ln)) {
|
|
140
|
+
describeLine = i + 1;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return [
|
|
145
|
+
{
|
|
146
|
+
rule: STEP_LINT_RULES.missingRuleWrapper.id,
|
|
147
|
+
severity: STEP_LINT_RULES.missingRuleWrapper.severity,
|
|
148
|
+
message: `Feature has Rule: blocks but step definition does not destructure Rule from describeFeature — use Rule('name', ({ RuleScenario }) => { ... })`,
|
|
149
|
+
file: stepFilePath,
|
|
150
|
+
line: describeLine,
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Step keyword pattern for matching step lines in feature files.
|
|
156
|
+
*/
|
|
157
|
+
const FEATURE_STEP_LINE = /^\s+(Given|When|Then|And|But)\s+(.+)$/;
|
|
158
|
+
/**
|
|
159
|
+
* Extract column names from Examples tables belonging to a Scenario Outline.
|
|
160
|
+
*
|
|
161
|
+
* Scans forward from the given start index (the Scenario Outline line) until
|
|
162
|
+
* the next section boundary. Collects column names from every Examples table
|
|
163
|
+
* header row found within that range.
|
|
164
|
+
*/
|
|
165
|
+
function extractOutlineExamplesColumns(lines, outlineStartIndex) {
|
|
166
|
+
const columns = new Set();
|
|
167
|
+
let inExamples = false;
|
|
168
|
+
let seenExamplesHeader = false;
|
|
169
|
+
for (let i = outlineStartIndex + 1; i < lines.length; i++) {
|
|
170
|
+
const line = lines[i];
|
|
171
|
+
if (line === undefined)
|
|
172
|
+
continue;
|
|
173
|
+
// Stop at next section boundary (another Scenario, Rule, Feature, Background)
|
|
174
|
+
if (/^\s*(Scenario Outline|Scenario Template|Scenario:|Feature:|Rule:|Background:)/.test(line)) {
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
// Enter Examples block
|
|
178
|
+
if (/^\s*Examples:/.test(line)) {
|
|
179
|
+
inExamples = true;
|
|
180
|
+
seenExamplesHeader = false;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
// Inside Examples: first table row is the header with column names
|
|
184
|
+
if (inExamples && !seenExamplesHeader && /^\s*\|/.test(line)) {
|
|
185
|
+
seenExamplesHeader = true;
|
|
186
|
+
const cells = line
|
|
187
|
+
.split('|')
|
|
188
|
+
.map((cell) => cell.trim())
|
|
189
|
+
.filter((cell) => cell.length > 0);
|
|
190
|
+
for (const cell of cells) {
|
|
191
|
+
columns.add(cell);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return columns;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Check 12: Detect quoted values in Scenario Outline steps (feature-file side).
|
|
199
|
+
*
|
|
200
|
+
* When a Scenario Outline's steps use quoted values (e.g., "foo") instead of
|
|
201
|
+
* angle-bracket placeholders (e.g., <column>), this suggests the author is
|
|
202
|
+
* using the Scenario pattern (Cucumber expression matching) instead of the
|
|
203
|
+
* ScenarioOutline pattern (variable substitution). This is the feature-file
|
|
204
|
+
* side of the Two-Pattern Problem — the step-file side is caught by
|
|
205
|
+
* scenario-outline-function-params.
|
|
206
|
+
*
|
|
207
|
+
* Detection: Find Scenario Outline sections in the feature file, extract the
|
|
208
|
+
* Examples table column names, then check if step lines within those sections
|
|
209
|
+
* contain quoted values whose content matches a column name. Only those are
|
|
210
|
+
* flagged — constant quoted values (e.g., "error") that don't correspond to
|
|
211
|
+
* any Examples column are intentionally literal and should not be placeholders.
|
|
212
|
+
*
|
|
213
|
+
* This is a cross-file check because it's only meaningful when a paired step
|
|
214
|
+
* file exists (roadmap specs without implementations shouldn't be flagged).
|
|
215
|
+
* The _stepContent parameter is unused but maintains the cross-check signature.
|
|
216
|
+
*/
|
|
217
|
+
export function checkOutlineQuotedValues(featureContent, _stepContent, stepFilePath, featurePath) {
|
|
218
|
+
// Only check if the feature actually has Scenario Outline
|
|
219
|
+
if (!/^\s*(Scenario Outline|Scenario Template):/m.test(featureContent)) {
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
const violations = [];
|
|
223
|
+
const lines = featureContent.split('\n');
|
|
224
|
+
let inOutlineSection = false;
|
|
225
|
+
let currentOutlineColumns = new Set();
|
|
226
|
+
for (let i = 0; i < lines.length; i++) {
|
|
227
|
+
const line = lines[i];
|
|
228
|
+
if (line === undefined)
|
|
229
|
+
continue;
|
|
230
|
+
// Enter Scenario Outline section
|
|
231
|
+
if (/^\s*(Scenario Outline|Scenario Template):/.test(line)) {
|
|
232
|
+
inOutlineSection = true;
|
|
233
|
+
currentOutlineColumns = extractOutlineExamplesColumns(lines, i);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
// Exit on new section boundary (but not Examples, which is part of Outline)
|
|
237
|
+
if (/^\s*(Scenario:|Feature:|Rule:|Background:)/.test(line)) {
|
|
238
|
+
inOutlineSection = false;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (!inOutlineSection)
|
|
242
|
+
continue;
|
|
243
|
+
// Check step lines within the Outline section
|
|
244
|
+
const stepMatch = FEATURE_STEP_LINE.exec(line);
|
|
245
|
+
if (stepMatch !== null) {
|
|
246
|
+
const stepText = stepMatch[2] ?? '';
|
|
247
|
+
// Skip steps that already use placeholders — the author clearly knows
|
|
248
|
+
// about the ScenarioOutline pattern and chose to keep quoted values literal
|
|
249
|
+
const hasPlaceholders = /<\w+>/.test(stepText);
|
|
250
|
+
if (hasPlaceholders)
|
|
251
|
+
continue;
|
|
252
|
+
// Extract all quoted values from the step
|
|
253
|
+
const quotedValues = [];
|
|
254
|
+
const doubleQuoteMatches = stepText.matchAll(/"([^"]*)"/g);
|
|
255
|
+
for (const m of doubleQuoteMatches) {
|
|
256
|
+
if (m[1] !== undefined)
|
|
257
|
+
quotedValues.push(m[1]);
|
|
258
|
+
}
|
|
259
|
+
const singleQuoteMatches = stepText.matchAll(/'([^']*)'/g);
|
|
260
|
+
for (const m of singleQuoteMatches) {
|
|
261
|
+
if (m[1] !== undefined)
|
|
262
|
+
quotedValues.push(m[1]);
|
|
263
|
+
}
|
|
264
|
+
// Only flag if at least one quoted value matches an Examples column name
|
|
265
|
+
const matchesColumn = quotedValues.some((val) => currentOutlineColumns.has(val));
|
|
266
|
+
if (matchesColumn) {
|
|
267
|
+
violations.push({
|
|
268
|
+
rule: STEP_LINT_RULES.outlineQuotedValues.id,
|
|
269
|
+
severity: STEP_LINT_RULES.outlineQuotedValues.severity,
|
|
270
|
+
message: `Scenario Outline step uses quoted values instead of <placeholder> syntax — this suggests the Scenario pattern (Cucumber expressions) rather than ScenarioOutline pattern (variable substitution)`,
|
|
271
|
+
file: featurePath ?? stepFilePath,
|
|
272
|
+
line: i + 1,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return violations;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Run all cross-file checks on a paired feature + step file.
|
|
281
|
+
*/
|
|
282
|
+
export function runCrossChecks(featureContent, stepContent, stepFilePath, featurePath) {
|
|
283
|
+
return [
|
|
284
|
+
...checkScenarioOutlineFunctionParams(featureContent, stepContent, stepFilePath),
|
|
285
|
+
...checkMissingAndDestructuring(featureContent, stepContent, stepFilePath),
|
|
286
|
+
...checkMissingRuleWrapper(featureContent, stepContent, stepFilePath),
|
|
287
|
+
...checkOutlineQuotedValues(featureContent, stepContent, stepFilePath, featurePath),
|
|
288
|
+
];
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=cross-checks.js.map
|