@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 @@
|
|
|
1
|
+
{"version":3,"file":"business-rules.d.ts","sourceRoot":"","sources":["../../../src/renderable/codecs/business-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,mBAAmB,EAEpB,MAAM,4CAA4C,CAAC;AAapD,OAAO,EAAE,KAAK,gBAAgB,EAAsC,MAAM,iBAAiB,CAAC;AAO5F;;;;;;;GAOG;AACH,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,oDAAoD;IACpD,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;IAEnD,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,gEAAgE;IAChE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,8FAA8F;IAC9F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,yBAAyB,CAa9E,CAAC;AACF,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAkDpE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,yBAAyB,GAClC,CAAC,CAAC,QAAQ,CAAC,OAAO,mBAAmB,EAAE,OAAO,8BAA8B,CAAC,CAY/E;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA6B,CAAC;AA6oB7D;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACxC,MAAM,EAAE,CAiBV"}
|
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @architect
|
|
3
|
+
* @architect-core
|
|
4
|
+
* @architect-pattern BusinessRulesCodec
|
|
5
|
+
* @architect-status completed
|
|
6
|
+
* @architect-unlock-reason:Progressive-disclosure-by-product-area
|
|
7
|
+
* @architect-convention codec-registry
|
|
8
|
+
* @architect-product-area:Generation
|
|
9
|
+
*
|
|
10
|
+
* ## BusinessRulesCodec
|
|
11
|
+
*
|
|
12
|
+
* Transforms MasterDataset into a RenderableDocument for business rules output.
|
|
13
|
+
* Generates BUSINESS-RULES.md organized by product area, phase, and feature.
|
|
14
|
+
*
|
|
15
|
+
* **Purpose:** Business rules documentation organized by product area, phase, and feature. Extracts domain constraints from Gherkin Rule: blocks.
|
|
16
|
+
*
|
|
17
|
+
* **Output Files:** `BUSINESS-RULES.md` (main index), `business-rules/<area-slug>.md` (area details)
|
|
18
|
+
*
|
|
19
|
+
* | Option | Type | Default | Description |
|
|
20
|
+
* | --- | --- | --- | --- |
|
|
21
|
+
* | groupBy | "domain" \| "phase" \| "domain-then-phase" | "domain-then-phase" | Primary grouping strategy |
|
|
22
|
+
* | includeCodeExamples | boolean | false | Include code examples from DocStrings |
|
|
23
|
+
* | includeTables | boolean | true | Include markdown tables from descriptions |
|
|
24
|
+
* | includeRationale | boolean | true | Include rationale section per rule |
|
|
25
|
+
* | filterDomains | string[] | [] | Filter by domain categories (empty = all) |
|
|
26
|
+
* | filterPhases | number[] | [] | Filter by phases (empty = all) |
|
|
27
|
+
* | onlyWithInvariants | boolean | false | Show only rules with explicit invariants |
|
|
28
|
+
* | includeSource | boolean | true | Include source feature file link |
|
|
29
|
+
* | includeVerifiedBy | boolean | true | Include Verified by scenario links |
|
|
30
|
+
* | maxDescriptionLength | number | 150 | Max description length in standard mode |
|
|
31
|
+
* | excludeSourcePaths | string[] | [] | Exclude patterns by source path prefix |
|
|
32
|
+
*
|
|
33
|
+
* ### When to Use
|
|
34
|
+
*
|
|
35
|
+
* - When generating business rules documentation for stakeholders
|
|
36
|
+
* - When extracting domain constraints without implementation details
|
|
37
|
+
* - When creating compliance or audit documentation from feature specs
|
|
38
|
+
*
|
|
39
|
+
* ### Information Architecture
|
|
40
|
+
*
|
|
41
|
+
* ```
|
|
42
|
+
* Product Area (Platform, DeliveryProcess)
|
|
43
|
+
* └── Phase (21, 15, etc.) or Release (v0.1.0 for DeliveryProcess)
|
|
44
|
+
* └── Feature (pattern name with description)
|
|
45
|
+
* └── Rules (inline with Invariant + Rationale)
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* ### Progressive Disclosure
|
|
49
|
+
*
|
|
50
|
+
* - **summary**: Statistics only (compact reference)
|
|
51
|
+
* - **standard**: Above + all features with rules inline
|
|
52
|
+
* - **detailed**: Full content including code examples and verification links
|
|
53
|
+
*
|
|
54
|
+
* ### Factory Pattern
|
|
55
|
+
*
|
|
56
|
+
* Use `createBusinessRulesCodec(options)` to create a configured codec:
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const codec = createBusinessRulesCodec({ detailLevel: "summary" });
|
|
59
|
+
* const doc = codec.decode(dataset);
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
import { z } from 'zod';
|
|
63
|
+
import { MasterDatasetSchema, } from '../../validation-schemas/master-dataset.js';
|
|
64
|
+
import { heading, paragraph, separator, table, linkOut, document, } from '../schema.js';
|
|
65
|
+
import { DEFAULT_BASE_OPTIONS, mergeOptions } from './types/base.js';
|
|
66
|
+
import { toKebabCase, camelCaseToTitleCase } from '../../utils/index.js';
|
|
67
|
+
/**
|
|
68
|
+
* Default options for BusinessRulesCodec
|
|
69
|
+
*/
|
|
70
|
+
export const DEFAULT_BUSINESS_RULES_OPTIONS = {
|
|
71
|
+
...DEFAULT_BASE_OPTIONS,
|
|
72
|
+
groupBy: 'domain-then-phase',
|
|
73
|
+
includeCodeExamples: false, // Only in detailed mode
|
|
74
|
+
includeTables: true,
|
|
75
|
+
includeRationale: true,
|
|
76
|
+
filterDomains: [],
|
|
77
|
+
filterPhases: [],
|
|
78
|
+
onlyWithInvariants: false,
|
|
79
|
+
includeSource: true,
|
|
80
|
+
includeVerifiedBy: true,
|
|
81
|
+
maxDescriptionLength: 150,
|
|
82
|
+
excludeSourcePaths: [],
|
|
83
|
+
};
|
|
84
|
+
import { RenderableDocumentOutputSchema } from './shared-schema.js';
|
|
85
|
+
import { parseBusinessRuleAnnotations, extractFirstSentence, } from './helpers.js';
|
|
86
|
+
import { extractTablesAsSectionBlocks } from './convention-extractor.js';
|
|
87
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
88
|
+
// Constants
|
|
89
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
90
|
+
const DEFAULT_PRODUCT_AREA = 'Platform';
|
|
91
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
92
|
+
// Business Rules Document Codec
|
|
93
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
94
|
+
/**
|
|
95
|
+
* Create a BusinessRulesCodec with custom options.
|
|
96
|
+
*
|
|
97
|
+
* @param options - Codec configuration options
|
|
98
|
+
* @returns Configured Zod codec
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* // Compact summary mode
|
|
103
|
+
* const codec = createBusinessRulesCodec({ detailLevel: "summary" });
|
|
104
|
+
*
|
|
105
|
+
* // Filter to specific domains
|
|
106
|
+
* const codec = createBusinessRulesCodec({ filterDomains: ["ddd", "event-sourcing"] });
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function createBusinessRulesCodec(options) {
|
|
110
|
+
const opts = mergeOptions(DEFAULT_BUSINESS_RULES_OPTIONS, options);
|
|
111
|
+
return z.codec(MasterDatasetSchema, RenderableDocumentOutputSchema, {
|
|
112
|
+
decode: (dataset) => {
|
|
113
|
+
return buildBusinessRulesDocument(dataset, opts);
|
|
114
|
+
},
|
|
115
|
+
/** @throws Always - this codec is decode-only. See zod-codecs.md */
|
|
116
|
+
encode: () => {
|
|
117
|
+
throw new Error('BusinessRulesCodec is decode-only. See zod-codecs.md');
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Default Business Rules Document Codec
|
|
123
|
+
*
|
|
124
|
+
* Transforms MasterDataset → RenderableDocument for business rules.
|
|
125
|
+
* Uses default options with standard detail level.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```typescript
|
|
129
|
+
* const doc = BusinessRulesCodec.decode(masterDataset);
|
|
130
|
+
* const markdown = renderToMarkdown(doc);
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export const BusinessRulesCodec = createBusinessRulesCodec();
|
|
134
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
135
|
+
// Document Builder
|
|
136
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
137
|
+
/**
|
|
138
|
+
* Build the business rules document from dataset
|
|
139
|
+
*/
|
|
140
|
+
function buildBusinessRulesDocument(dataset, options) {
|
|
141
|
+
const sections = [];
|
|
142
|
+
// 1. Collect all rules organized by product area → phase → feature
|
|
143
|
+
const productAreaGroups = collectRulesByProductArea(dataset, options);
|
|
144
|
+
// Calculate stats
|
|
145
|
+
const stats = calculateStats(productAreaGroups);
|
|
146
|
+
if (stats.totalRules === 0) {
|
|
147
|
+
sections.push(heading(2, 'No Business Rules Found'), paragraph('No business rules were found in the feature files. ' +
|
|
148
|
+
'Business rules are defined using the `Rule:` keyword in Gherkin feature files.'));
|
|
149
|
+
return document('Business Rules', sections, {
|
|
150
|
+
purpose: 'Domain constraints and invariants',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// 2. Build summary (single line with stats)
|
|
154
|
+
sections.push(...buildSummarySection(stats));
|
|
155
|
+
// 3. Progressive disclosure: split by product area when detail files enabled
|
|
156
|
+
if (options.generateDetailFiles && options.detailLevel !== 'summary') {
|
|
157
|
+
sections.push(...buildProductAreaIndexSection(productAreaGroups));
|
|
158
|
+
const additionalFiles = buildBusinessRulesDetailFiles(productAreaGroups, options);
|
|
159
|
+
const docOpts = {
|
|
160
|
+
purpose: 'Domain constraints and invariants extracted from feature files',
|
|
161
|
+
detailLevel: 'Overview with links to detailed business rules by product area',
|
|
162
|
+
};
|
|
163
|
+
if (Object.keys(additionalFiles).length > 0) {
|
|
164
|
+
docOpts.additionalFiles = additionalFiles;
|
|
165
|
+
}
|
|
166
|
+
return document('Business Rules', sections, docOpts);
|
|
167
|
+
}
|
|
168
|
+
// 4. Non-split mode: all content in single document
|
|
169
|
+
if (options.detailLevel !== 'summary') {
|
|
170
|
+
sections.push(...buildProductAreaSections(productAreaGroups, options));
|
|
171
|
+
}
|
|
172
|
+
return document('Business Rules', sections, {
|
|
173
|
+
purpose: 'Domain constraints and invariants extracted from feature files',
|
|
174
|
+
detailLevel: options.detailLevel,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
178
|
+
// Rule Collection
|
|
179
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
180
|
+
/**
|
|
181
|
+
* Collect rules organized by Product Area → Phase → Feature
|
|
182
|
+
*/
|
|
183
|
+
function collectRulesByProductArea(dataset, options) {
|
|
184
|
+
const groups = new Map();
|
|
185
|
+
for (const pattern of dataset.patterns) {
|
|
186
|
+
// Skip patterns without rules
|
|
187
|
+
if (!pattern.rules || pattern.rules.length === 0) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// Apply source path exclusion filter
|
|
191
|
+
if (options.excludeSourcePaths.length > 0 &&
|
|
192
|
+
options.excludeSourcePaths.some((prefix) => pattern.source.file.startsWith(prefix))) {
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
// Apply domain filter
|
|
196
|
+
if (options.filterDomains.length > 0 && !options.filterDomains.includes(pattern.category)) {
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
// Apply phase filter
|
|
200
|
+
if (options.filterPhases.length > 0 &&
|
|
201
|
+
pattern.phase !== undefined &&
|
|
202
|
+
!options.filterPhases.includes(pattern.phase)) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
const productArea = pattern.productArea ?? DEFAULT_PRODUCT_AREA;
|
|
206
|
+
const productAreaDisplay = formatProductAreaName(productArea);
|
|
207
|
+
// Determine phase key (use release for DeliveryProcess items without phase)
|
|
208
|
+
const phaseKey = getPhaseKey(pattern);
|
|
209
|
+
// Get or create product area group
|
|
210
|
+
let group = groups.get(productArea);
|
|
211
|
+
if (!group) {
|
|
212
|
+
group = {
|
|
213
|
+
productArea,
|
|
214
|
+
displayName: productAreaDisplay,
|
|
215
|
+
phases: new Map(),
|
|
216
|
+
};
|
|
217
|
+
groups.set(productArea, group);
|
|
218
|
+
}
|
|
219
|
+
// Get or create phase group
|
|
220
|
+
let phaseFeatures = group.phases.get(phaseKey);
|
|
221
|
+
if (!phaseFeatures) {
|
|
222
|
+
phaseFeatures = [];
|
|
223
|
+
group.phases.set(phaseKey, phaseFeatures);
|
|
224
|
+
}
|
|
225
|
+
// Build feature with rules
|
|
226
|
+
const featureWithRules = {
|
|
227
|
+
pattern,
|
|
228
|
+
featureName: pattern.name,
|
|
229
|
+
featureDescription: extractFeatureDescription(pattern),
|
|
230
|
+
rules: [],
|
|
231
|
+
};
|
|
232
|
+
// Process rules
|
|
233
|
+
for (const rule of pattern.rules) {
|
|
234
|
+
const annotations = parseBusinessRuleAnnotations(rule.description);
|
|
235
|
+
// Apply onlyWithInvariants filter
|
|
236
|
+
if (options.onlyWithInvariants && !annotations.invariant) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
featureWithRules.rules.push({
|
|
240
|
+
rule,
|
|
241
|
+
pattern,
|
|
242
|
+
annotations,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
// Only add feature if it has rules after filtering
|
|
246
|
+
if (featureWithRules.rules.length > 0) {
|
|
247
|
+
phaseFeatures.push(featureWithRules);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return groups;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get the phase key for grouping (e.g., "Phase 21" or "v0.1.0")
|
|
254
|
+
*/
|
|
255
|
+
function getPhaseKey(pattern) {
|
|
256
|
+
// If pattern has a phase, use it
|
|
257
|
+
if (pattern.phase !== undefined) {
|
|
258
|
+
return `Phase ${pattern.phase}`;
|
|
259
|
+
}
|
|
260
|
+
// For DeliveryProcess items without phase, use release
|
|
261
|
+
const release = pattern.release;
|
|
262
|
+
if (release) {
|
|
263
|
+
return release;
|
|
264
|
+
}
|
|
265
|
+
// Fallback
|
|
266
|
+
return 'Uncategorized';
|
|
267
|
+
}
|
|
268
|
+
const CONTENT_HEADER_PATTERNS = [
|
|
269
|
+
/\*\*Problem:\*\*\s*/,
|
|
270
|
+
/\*\*Business Value:\*\*\s*/,
|
|
271
|
+
/\*\*Solution:\*\*\s*/,
|
|
272
|
+
/\*\*Context:\*\*\s*/,
|
|
273
|
+
];
|
|
274
|
+
const NEXT_HEADER_PATTERN = /\n\s*(?:\*\*[A-Z]|\|)/m;
|
|
275
|
+
/**
|
|
276
|
+
* Extract a compact description from the feature
|
|
277
|
+
*
|
|
278
|
+
* Looks for content after header markers like **Problem:** or **Business Value:**
|
|
279
|
+
* and extracts the full first sentence/paragraph.
|
|
280
|
+
*/
|
|
281
|
+
function extractFeatureDescription(pattern) {
|
|
282
|
+
const desc = pattern.directive.description;
|
|
283
|
+
// Try to find content after a header
|
|
284
|
+
for (const headerPattern of CONTENT_HEADER_PATTERNS) {
|
|
285
|
+
const match = headerPattern.exec(desc);
|
|
286
|
+
if (match) {
|
|
287
|
+
// Get text after the header
|
|
288
|
+
const afterHeader = desc.slice(match.index + match[0].length);
|
|
289
|
+
// Get content up to the next header or table
|
|
290
|
+
const nextHeaderMatch = NEXT_HEADER_PATTERN.exec(afterHeader);
|
|
291
|
+
const content = nextHeaderMatch ? afterHeader.slice(0, nextHeaderMatch.index) : afterHeader;
|
|
292
|
+
// Clean up and extract first sentence
|
|
293
|
+
const cleaned = content.trim().split('\n')[0]?.trim() ?? '';
|
|
294
|
+
if (cleaned.length > 0) {
|
|
295
|
+
return extractFirstSentence(cleaned);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Fallback: Try to get the first meaningful line
|
|
300
|
+
const lines = desc.split('\n').filter((line) => {
|
|
301
|
+
const trimmed = line.trim();
|
|
302
|
+
return (trimmed.length > 0 &&
|
|
303
|
+
!trimmed.startsWith('**') && // Skip any header
|
|
304
|
+
!trimmed.startsWith('|') && // Skip table rows
|
|
305
|
+
!trimmed.startsWith('-') && // Skip list items
|
|
306
|
+
trimmed.length > 20 // Require substantial content
|
|
307
|
+
);
|
|
308
|
+
});
|
|
309
|
+
const firstLine = lines[0];
|
|
310
|
+
if (firstLine) {
|
|
311
|
+
return extractFirstSentence(firstLine);
|
|
312
|
+
}
|
|
313
|
+
return '';
|
|
314
|
+
}
|
|
315
|
+
function calculateStats(groups) {
|
|
316
|
+
let totalRules = 0;
|
|
317
|
+
let totalFeatures = 0;
|
|
318
|
+
let withInvariants = 0;
|
|
319
|
+
for (const group of groups.values()) {
|
|
320
|
+
for (const features of group.phases.values()) {
|
|
321
|
+
totalFeatures += features.length;
|
|
322
|
+
for (const feature of features) {
|
|
323
|
+
totalRules += feature.rules.length;
|
|
324
|
+
for (const ruleCtx of feature.rules) {
|
|
325
|
+
if (ruleCtx.annotations.invariant) {
|
|
326
|
+
withInvariants++;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
totalRules,
|
|
334
|
+
totalFeatures,
|
|
335
|
+
withInvariants,
|
|
336
|
+
productAreas: groups.size,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
340
|
+
// Summary Section
|
|
341
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
342
|
+
/**
|
|
343
|
+
* Build compact summary section
|
|
344
|
+
*/
|
|
345
|
+
function buildSummarySection(stats) {
|
|
346
|
+
const summary = `Domain constraints and invariants extracted from feature specifications. ${stats.totalRules} rules from ${stats.totalFeatures} features across ${stats.productAreas} product areas.`;
|
|
347
|
+
return [paragraph(`**${summary}**`), separator()];
|
|
348
|
+
}
|
|
349
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
350
|
+
// Product Area Sections
|
|
351
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
352
|
+
/**
|
|
353
|
+
* Build sections organized by Product Area → Phase → Feature → Rules
|
|
354
|
+
*/
|
|
355
|
+
function buildProductAreaSections(groups, options) {
|
|
356
|
+
const sections = [];
|
|
357
|
+
// Sort product areas alphabetically
|
|
358
|
+
const sortedGroups = [...groups.values()].sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
359
|
+
for (const group of sortedGroups) {
|
|
360
|
+
const sortedPhases = sortPhaseEntries([...group.phases.entries()]);
|
|
361
|
+
for (const [phaseKey, features] of sortedPhases) {
|
|
362
|
+
// Product Area / Phase heading
|
|
363
|
+
sections.push(heading(2, `${group.displayName} / ${phaseKey}`));
|
|
364
|
+
// Sort features by name
|
|
365
|
+
const sortedFeatures = [...features].sort((a, b) => a.featureName.localeCompare(b.featureName));
|
|
366
|
+
for (const feature of sortedFeatures) {
|
|
367
|
+
sections.push(...renderFeatureWithRules(feature, options));
|
|
368
|
+
}
|
|
369
|
+
sections.push(separator());
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return sections;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Calculate statistics for a single product area group
|
|
376
|
+
*/
|
|
377
|
+
function calculateAreaStats(group) {
|
|
378
|
+
let totalRules = 0;
|
|
379
|
+
let totalFeatures = 0;
|
|
380
|
+
let withInvariants = 0;
|
|
381
|
+
for (const features of group.phases.values()) {
|
|
382
|
+
totalFeatures += features.length;
|
|
383
|
+
for (const feature of features) {
|
|
384
|
+
totalRules += feature.rules.length;
|
|
385
|
+
for (const ruleCtx of feature.rules) {
|
|
386
|
+
if (ruleCtx.annotations.invariant) {
|
|
387
|
+
withInvariants++;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return { totalRules, totalFeatures, withInvariants };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Generate URL-safe slug from product area name
|
|
396
|
+
*/
|
|
397
|
+
function productAreaToSlug(productArea) {
|
|
398
|
+
return toKebabCase(productArea);
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Build the product area index section for the main document.
|
|
402
|
+
* Shows a summary table with links to each product area's detail file.
|
|
403
|
+
*/
|
|
404
|
+
function buildProductAreaIndexSection(groups) {
|
|
405
|
+
const sections = [];
|
|
406
|
+
sections.push(heading(2, 'Product Areas'));
|
|
407
|
+
const sortedGroups = [...groups.values()].sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
408
|
+
const rows = sortedGroups.map((group) => {
|
|
409
|
+
const areaStats = calculateAreaStats(group);
|
|
410
|
+
const slug = productAreaToSlug(group.productArea);
|
|
411
|
+
const link = `[${group.displayName}](business-rules/${slug}.md)`;
|
|
412
|
+
return [
|
|
413
|
+
link,
|
|
414
|
+
String(areaStats.totalFeatures),
|
|
415
|
+
String(areaStats.totalRules),
|
|
416
|
+
String(areaStats.withInvariants),
|
|
417
|
+
];
|
|
418
|
+
});
|
|
419
|
+
sections.push(table(['Product Area', 'Features', 'Rules', 'With Invariants'], rows));
|
|
420
|
+
sections.push(separator());
|
|
421
|
+
return sections;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Build one detail file per product area
|
|
425
|
+
*/
|
|
426
|
+
function buildBusinessRulesDetailFiles(groups, options) {
|
|
427
|
+
const files = {};
|
|
428
|
+
const sortedGroups = [...groups.values()].sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
429
|
+
for (const group of sortedGroups) {
|
|
430
|
+
const slug = productAreaToSlug(group.productArea);
|
|
431
|
+
files[`business-rules/${slug}.md`] = buildSingleProductAreaDocument(group, options);
|
|
432
|
+
}
|
|
433
|
+
return files;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Build a single product area detail document with rules organized by phase
|
|
437
|
+
*/
|
|
438
|
+
function buildSingleProductAreaDocument(group, options) {
|
|
439
|
+
const sections = [];
|
|
440
|
+
const areaStats = calculateAreaStats(group);
|
|
441
|
+
// Area stats
|
|
442
|
+
sections.push(paragraph(`**${areaStats.totalRules} rules** from ${areaStats.totalFeatures} features. ` +
|
|
443
|
+
`${areaStats.withInvariants} rules have explicit invariants.`));
|
|
444
|
+
sections.push(separator());
|
|
445
|
+
// Sort phases
|
|
446
|
+
const sortedPhases = sortPhaseEntries([...group.phases.entries()]);
|
|
447
|
+
for (const [phaseKey, features] of sortedPhases) {
|
|
448
|
+
const sortedFeatures = [...features].sort((a, b) => a.featureName.localeCompare(b.featureName));
|
|
449
|
+
// Render features for this phase
|
|
450
|
+
const phaseContent = [];
|
|
451
|
+
for (const feature of sortedFeatures) {
|
|
452
|
+
phaseContent.push(...renderFeatureWithRules(feature, options));
|
|
453
|
+
}
|
|
454
|
+
// Always render flat — file-level split by product area is sufficient disclosure
|
|
455
|
+
sections.push(heading(2, phaseKey));
|
|
456
|
+
sections.push(...phaseContent);
|
|
457
|
+
sections.push(separator());
|
|
458
|
+
}
|
|
459
|
+
// Back link
|
|
460
|
+
sections.push(linkOut('\u2190 Back to Business Rules', '../BUSINESS-RULES.md'));
|
|
461
|
+
return document(`${group.displayName} Business Rules`, sections, {
|
|
462
|
+
purpose: `Business rules for the ${group.displayName} product area`,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Sort phase entries: numeric phases first (ascending), then releases, then uncategorized
|
|
467
|
+
*/
|
|
468
|
+
function sortPhaseEntries(entries) {
|
|
469
|
+
return entries.sort(([a], [b]) => {
|
|
470
|
+
const aNum = extractPhaseNumber(a);
|
|
471
|
+
const bNum = extractPhaseNumber(b);
|
|
472
|
+
if (aNum !== null && bNum !== null) {
|
|
473
|
+
return aNum - bNum;
|
|
474
|
+
}
|
|
475
|
+
if (aNum !== null)
|
|
476
|
+
return -1;
|
|
477
|
+
if (bNum !== null)
|
|
478
|
+
return 1;
|
|
479
|
+
return a.localeCompare(b);
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Extract phase number from phase key (e.g., "Phase 21" → 21)
|
|
484
|
+
*/
|
|
485
|
+
function extractPhaseNumber(phaseKey) {
|
|
486
|
+
const pattern = /^Phase\s+(\d+)$/;
|
|
487
|
+
const match = pattern.exec(phaseKey);
|
|
488
|
+
if (match?.[1]) {
|
|
489
|
+
return parseInt(match[1], 10);
|
|
490
|
+
}
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
494
|
+
// Feature Rendering
|
|
495
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
496
|
+
/**
|
|
497
|
+
* Render a feature with its rules inline.
|
|
498
|
+
*
|
|
499
|
+
* All rules render flat — Rule title + Invariant + Rationale are essential
|
|
500
|
+
* business knowledge and must never be hidden behind collapsible blocks.
|
|
501
|
+
* Progressive disclosure happens at the file level (split by product area).
|
|
502
|
+
*/
|
|
503
|
+
function renderFeatureWithRules(feature, options) {
|
|
504
|
+
const sections = [];
|
|
505
|
+
const isDetailed = options.detailLevel === 'detailed';
|
|
506
|
+
// Feature heading (H3) — humanized from camelCase pattern name
|
|
507
|
+
sections.push(heading(3, humanizeFeatureName(feature.featureName)));
|
|
508
|
+
// Feature description
|
|
509
|
+
if (feature.featureDescription) {
|
|
510
|
+
sections.push(paragraph(`*${feature.featureDescription}*`));
|
|
511
|
+
}
|
|
512
|
+
// Render each rule flat — no collapsible wrapping
|
|
513
|
+
for (const ruleCtx of feature.rules) {
|
|
514
|
+
sections.push(...renderRuleInline(ruleCtx, options, isDetailed));
|
|
515
|
+
}
|
|
516
|
+
// Source file path as italic text (informational, not a link — paths are
|
|
517
|
+
// relative to the feature repo root and don't resolve from docs-generated/)
|
|
518
|
+
if (options.includeSource) {
|
|
519
|
+
const sourceFile = feature.pattern.source.file;
|
|
520
|
+
sections.push(paragraph(`*${extractSourceName(sourceFile)}*`));
|
|
521
|
+
}
|
|
522
|
+
return sections;
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Render a single rule inline with its annotations.
|
|
526
|
+
*
|
|
527
|
+
* Each rule is preceded by a separator. Invariant + Rationale are combined
|
|
528
|
+
* into a blockquote "constraint card" for visual emphasis. Verified-by is
|
|
529
|
+
* rendered as a checkbox list for scanability. Scenario names from the
|
|
530
|
+
* Rule block are deduplicated against explicit **Verified by:** annotations.
|
|
531
|
+
*/
|
|
532
|
+
function renderRuleInline(ruleCtx, options, isDetailed) {
|
|
533
|
+
const sections = [];
|
|
534
|
+
const { rule, annotations } = ruleCtx;
|
|
535
|
+
// Visual separator before each rule
|
|
536
|
+
sections.push(separator());
|
|
537
|
+
// Rule name as H4 heading
|
|
538
|
+
sections.push(heading(4, rule.name));
|
|
539
|
+
// Constraint card: blockquote combining Invariant + Rationale
|
|
540
|
+
const cardLines = [];
|
|
541
|
+
if (annotations.invariant) {
|
|
542
|
+
cardLines.push(`> **Invariant:** ${annotations.invariant}`);
|
|
543
|
+
}
|
|
544
|
+
if (options.includeRationale && annotations.rationale) {
|
|
545
|
+
cardLines.push(`> **Rationale:** ${annotations.rationale}`);
|
|
546
|
+
}
|
|
547
|
+
if (cardLines.length > 0) {
|
|
548
|
+
sections.push(paragraph(cardLines.join('\n>\n')));
|
|
549
|
+
}
|
|
550
|
+
else if (annotations.remainingContent) {
|
|
551
|
+
// Fallback first-line stays as plain paragraph (not blockquoted)
|
|
552
|
+
const firstLine = extractFirstSentence(annotations.remainingContent);
|
|
553
|
+
if (firstLine) {
|
|
554
|
+
sections.push(paragraph(firstLine));
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
// Tables from rule description
|
|
558
|
+
if (options.includeTables && rule.description) {
|
|
559
|
+
const tableBlocks = extractTablesAsSectionBlocks(rule.description);
|
|
560
|
+
for (const tableBlock of tableBlocks) {
|
|
561
|
+
sections.push(tableBlock);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
// Code examples (detailed mode only, or if explicitly enabled)
|
|
565
|
+
if ((isDetailed || options.includeCodeExamples) && annotations.codeExamples) {
|
|
566
|
+
for (const codeBlock of annotations.codeExamples) {
|
|
567
|
+
sections.push(codeBlock);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
// Verified-by as compact bullet list (label + items in one block, no blank line gap)
|
|
571
|
+
if (options.includeVerifiedBy) {
|
|
572
|
+
const names = deduplicateScenarioNames(rule.scenarioNames, annotations.verifiedBy);
|
|
573
|
+
if (names.length > 0) {
|
|
574
|
+
const bullets = names.map((name) => `- ${name}`).join('\n');
|
|
575
|
+
sections.push(paragraph(`**Verified by:**\n${bullets}`));
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
// API implementation references
|
|
579
|
+
if (annotations.apiRefs && annotations.apiRefs.length > 0) {
|
|
580
|
+
const refList = annotations.apiRefs.map((ref) => `\`${ref}\``).join(', ');
|
|
581
|
+
sections.push(paragraph(`**Implementation:** ${refList}`));
|
|
582
|
+
}
|
|
583
|
+
// Placeholder only when there is truly no content
|
|
584
|
+
if (!annotations.invariant &&
|
|
585
|
+
!annotations.remainingContent &&
|
|
586
|
+
!annotations.rationale &&
|
|
587
|
+
rule.scenarioNames.length === 0) {
|
|
588
|
+
sections.push(paragraph('*No invariant or description specified.*'));
|
|
589
|
+
}
|
|
590
|
+
return sections;
|
|
591
|
+
}
|
|
592
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
593
|
+
// Utilities
|
|
594
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
595
|
+
/**
|
|
596
|
+
* Humanize a camelCase/PascalCase feature name for display.
|
|
597
|
+
*
|
|
598
|
+
* Inserts spaces at camelCase boundaries and strips common suffixes
|
|
599
|
+
* like "Testing" that don't add value in business rules context.
|
|
600
|
+
*
|
|
601
|
+
* Examples:
|
|
602
|
+
* - ConfigResolution → Config Resolution
|
|
603
|
+
* - RichContentHelpersTesting → Rich Content Helpers
|
|
604
|
+
* - ProcessGuardTesting → Process Guard
|
|
605
|
+
* - ContextInference → Context Inference
|
|
606
|
+
*/
|
|
607
|
+
function humanizeFeatureName(name) {
|
|
608
|
+
return camelCaseToTitleCase(name).replace(/\s*Testing$/i, '');
|
|
609
|
+
}
|
|
610
|
+
/**
|
|
611
|
+
* Deduplicate scenario names from Rule block and **Verified by:** annotation.
|
|
612
|
+
*
|
|
613
|
+
* Uses case-insensitive comparison to catch near-duplicates like
|
|
614
|
+
* "Standard level includes source link-out" vs "Standard level includes source link-out".
|
|
615
|
+
*/
|
|
616
|
+
export function deduplicateScenarioNames(scenarioNames, verifiedBy) {
|
|
617
|
+
const seen = new Map(); // lowercase → original
|
|
618
|
+
for (const name of scenarioNames) {
|
|
619
|
+
const key = name.toLowerCase().trim();
|
|
620
|
+
if (!seen.has(key)) {
|
|
621
|
+
seen.set(key, name);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
if (verifiedBy) {
|
|
625
|
+
for (const name of verifiedBy) {
|
|
626
|
+
const key = name.toLowerCase().trim();
|
|
627
|
+
if (!seen.has(key)) {
|
|
628
|
+
seen.set(key, name);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return [...seen.values()];
|
|
633
|
+
}
|
|
634
|
+
function formatProductAreaName(productArea) {
|
|
635
|
+
return camelCaseToTitleCase(productArea);
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Extract a clean source name from file path
|
|
639
|
+
*/
|
|
640
|
+
function extractSourceName(filePath) {
|
|
641
|
+
const pattern = /([^/]+)\.feature$/;
|
|
642
|
+
const match = pattern.exec(filePath);
|
|
643
|
+
if (match?.[1]) {
|
|
644
|
+
return match[1] + '.feature';
|
|
645
|
+
}
|
|
646
|
+
return filePath;
|
|
647
|
+
}
|
|
648
|
+
//# sourceMappingURL=business-rules.js.map
|