@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,848 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @architect
|
|
3
|
+
* @architect-core
|
|
4
|
+
* @architect-pattern SessionCodec
|
|
5
|
+
* @architect-status completed
|
|
6
|
+
* @architect-arch-role projection
|
|
7
|
+
* @architect-arch-context renderer
|
|
8
|
+
* @architect-arch-layer application
|
|
9
|
+
* @architect-include codec-transformation
|
|
10
|
+
* @architect-convention codec-registry
|
|
11
|
+
* @architect-product-area:Generation
|
|
12
|
+
*
|
|
13
|
+
* ## SessionContextCodec
|
|
14
|
+
*
|
|
15
|
+
* **Purpose:** Current session context for AI agents and developers.
|
|
16
|
+
*
|
|
17
|
+
* **Output Files:** `SESSION-CONTEXT.md` (session status), `sessions/phase-<N>-<name>.md` (incomplete phase details)
|
|
18
|
+
*
|
|
19
|
+
* ### When to Use
|
|
20
|
+
*
|
|
21
|
+
* - When starting a new implementation session and need to see active work status
|
|
22
|
+
* - When generating compact context for AI agent consumption (_claude-md/ output)
|
|
23
|
+
* - When checking incomplete phases and their deliverable progress
|
|
24
|
+
*
|
|
25
|
+
* ## RemainingWorkCodec
|
|
26
|
+
*
|
|
27
|
+
* **Purpose:** Aggregate view of all incomplete work across phases.
|
|
28
|
+
*
|
|
29
|
+
* **Output Files:** `REMAINING-WORK.md` (summary), `remaining/phase-<N>-<name>.md` (phase details)
|
|
30
|
+
*
|
|
31
|
+
* | Option | Type | Default | Description |
|
|
32
|
+
* | --- | --- | --- | --- |
|
|
33
|
+
* | includeIncomplete | boolean | true | Include planned items |
|
|
34
|
+
* | includeBlocked | boolean | true | Show blocked items analysis |
|
|
35
|
+
* | includeNextActionable | boolean | true | Next actionable items section |
|
|
36
|
+
* | maxNextActionable | number | 5 | Max items in next actionable |
|
|
37
|
+
* | sortBy | "phase" \| "priority" \| "effort" \| "quarter" | "phase" | Sort order |
|
|
38
|
+
* | groupPlannedBy | "quarter" \| "priority" \| "level" \| "none" | "none" | Group planned items |
|
|
39
|
+
*/
|
|
40
|
+
import { z } from 'zod';
|
|
41
|
+
import { MasterDatasetSchema, } from '../../validation-schemas/master-dataset.js';
|
|
42
|
+
import { heading, paragraph, separator, table, list, collapsible, linkOut, document, } from '../schema.js';
|
|
43
|
+
import { normalizeStatus, isPatternComplete, isPatternActive, isPatternPlanned, } from '../../taxonomy/index.js';
|
|
44
|
+
import { getPhaseStatusEmoji } from '../../validation/types.js';
|
|
45
|
+
import { getStatusEmoji, getDisplayName, extractSummary, completionPercentage, renderProgressBar, sortByPhaseAndName, formatBusinessValue, } from '../utils.js';
|
|
46
|
+
import { DEFAULT_BASE_OPTIONS, mergeOptions } from './types/base.js';
|
|
47
|
+
/**
|
|
48
|
+
* Default options for SessionContextCodec
|
|
49
|
+
*/
|
|
50
|
+
export const DEFAULT_SESSION_OPTIONS = {
|
|
51
|
+
...DEFAULT_BASE_OPTIONS,
|
|
52
|
+
includeAcceptanceCriteria: true,
|
|
53
|
+
includeDependencies: true,
|
|
54
|
+
includeDeliverables: true,
|
|
55
|
+
includeRelatedPatterns: false,
|
|
56
|
+
includeHandoffContext: true,
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Default options for RemainingWorkCodec
|
|
60
|
+
*/
|
|
61
|
+
export const DEFAULT_REMAINING_WORK_OPTIONS = {
|
|
62
|
+
...DEFAULT_BASE_OPTIONS,
|
|
63
|
+
includeIncomplete: true,
|
|
64
|
+
includeBlocked: true,
|
|
65
|
+
includeNextActionable: true,
|
|
66
|
+
maxNextActionable: 5,
|
|
67
|
+
includeStats: true,
|
|
68
|
+
sortBy: 'phase',
|
|
69
|
+
groupPlannedBy: 'none',
|
|
70
|
+
};
|
|
71
|
+
import { RenderableDocumentOutputSchema } from './shared-schema.js';
|
|
72
|
+
import { renderAcceptanceCriteria, renderBusinessRulesSection } from './helpers.js';
|
|
73
|
+
import { toKebabCase } from '../../utils/index.js';
|
|
74
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
75
|
+
// Session Context Document Codec
|
|
76
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
77
|
+
/**
|
|
78
|
+
* Create a SessionContextCodec with custom options.
|
|
79
|
+
*
|
|
80
|
+
* @param options - Codec configuration options
|
|
81
|
+
* @returns Configured Zod codec
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* // Include related patterns
|
|
86
|
+
* const codec = createSessionContextCodec({ includeRelatedPatterns: true });
|
|
87
|
+
*
|
|
88
|
+
* // Disable detail files for compact output
|
|
89
|
+
* const codec = createSessionContextCodec({ generateDetailFiles: false });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function createSessionContextCodec(options) {
|
|
93
|
+
const opts = mergeOptions(DEFAULT_SESSION_OPTIONS, options);
|
|
94
|
+
return z.codec(MasterDatasetSchema, RenderableDocumentOutputSchema, {
|
|
95
|
+
decode: (dataset) => {
|
|
96
|
+
return buildSessionContextDocument(dataset, opts);
|
|
97
|
+
},
|
|
98
|
+
/** @throws Always - this codec is decode-only. See zod-codecs.md */
|
|
99
|
+
encode: () => {
|
|
100
|
+
throw new Error('SessionContextCodec is decode-only. See zod-codecs.md');
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Default Session Context Document Codec
|
|
106
|
+
*
|
|
107
|
+
* Transforms MasterDataset → RenderableDocument for session context.
|
|
108
|
+
* Shows current phase focus, active work, and planning context.
|
|
109
|
+
*/
|
|
110
|
+
export const SessionContextCodec = createSessionContextCodec();
|
|
111
|
+
/**
|
|
112
|
+
* Create a RemainingWorkCodec with custom options.
|
|
113
|
+
*
|
|
114
|
+
* @param options - Codec configuration options
|
|
115
|
+
* @returns Configured Zod codec
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* // Sort by priority instead of phase
|
|
120
|
+
* const codec = createRemainingWorkCodec({ sortBy: "priority" });
|
|
121
|
+
*
|
|
122
|
+
* // Group planned items by quarter
|
|
123
|
+
* const codec = createRemainingWorkCodec({ groupPlannedBy: "quarter" });
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export function createRemainingWorkCodec(options) {
|
|
127
|
+
const opts = mergeOptions(DEFAULT_REMAINING_WORK_OPTIONS, options);
|
|
128
|
+
return z.codec(MasterDatasetSchema, RenderableDocumentOutputSchema, {
|
|
129
|
+
decode: (dataset) => {
|
|
130
|
+
return buildRemainingWorkDocument(dataset, opts);
|
|
131
|
+
},
|
|
132
|
+
/** @throws Always - this codec is decode-only. See zod-codecs.md */
|
|
133
|
+
encode: () => {
|
|
134
|
+
throw new Error('RemainingWorkCodec is decode-only. See zod-codecs.md');
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Default Remaining Work Document Codec
|
|
140
|
+
*
|
|
141
|
+
* Transforms MasterDataset → RenderableDocument for remaining work.
|
|
142
|
+
* Aggregates all incomplete work across phases.
|
|
143
|
+
*/
|
|
144
|
+
export const RemainingWorkCodec = createRemainingWorkCodec();
|
|
145
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
146
|
+
// Session Context Document Builder
|
|
147
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
148
|
+
/**
|
|
149
|
+
* Build session context document
|
|
150
|
+
*/
|
|
151
|
+
function buildSessionContextDocument(dataset, options) {
|
|
152
|
+
const sections = [];
|
|
153
|
+
// 1. Overall status
|
|
154
|
+
sections.push(...buildSessionStatus(dataset));
|
|
155
|
+
// 2. Phase navigation table (links to detail files)
|
|
156
|
+
sections.push(...buildSessionPhaseNavigation(dataset, options));
|
|
157
|
+
// 3. Active work (current focus)
|
|
158
|
+
sections.push(...buildActiveWork(dataset, options));
|
|
159
|
+
// 4. Current phase context (summary only)
|
|
160
|
+
sections.push(...buildCurrentPhaseContextSummary(dataset, options));
|
|
161
|
+
// 5. Blocked items (if any - controlled by includeDependencies)
|
|
162
|
+
if (options.includeDependencies) {
|
|
163
|
+
sections.push(...buildBlockedItems(dataset));
|
|
164
|
+
}
|
|
165
|
+
// 6. Recent completions
|
|
166
|
+
sections.push(...buildSessionRecentCompletions(dataset, options));
|
|
167
|
+
// Build phase detail files (if enabled)
|
|
168
|
+
const additionalFiles = options.generateDetailFiles
|
|
169
|
+
? buildSessionPhaseFiles(dataset, options)
|
|
170
|
+
: {};
|
|
171
|
+
const docOpts = {
|
|
172
|
+
purpose: 'Current session context and focus areas',
|
|
173
|
+
detailLevel: options.generateDetailFiles
|
|
174
|
+
? 'Summary with links to phase details'
|
|
175
|
+
: 'Compact summary',
|
|
176
|
+
};
|
|
177
|
+
if (Object.keys(additionalFiles).length > 0) {
|
|
178
|
+
docOpts.additionalFiles = additionalFiles;
|
|
179
|
+
}
|
|
180
|
+
return document('Session Context', sections, docOpts);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Build session status section
|
|
184
|
+
*/
|
|
185
|
+
function buildSessionStatus(dataset) {
|
|
186
|
+
const { counts } = dataset;
|
|
187
|
+
const progress = completionPercentage(counts);
|
|
188
|
+
const progressBar = renderProgressBar(counts.completed, counts.total, 20);
|
|
189
|
+
// Find current phase (first incomplete phase)
|
|
190
|
+
const currentPhase = dataset.byPhase.find((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
191
|
+
const currentPhaseInfo = currentPhase
|
|
192
|
+
? `Phase ${currentPhase.phaseNumber}: ${currentPhase.phaseName ?? 'Unnamed'}`
|
|
193
|
+
: 'All phases complete';
|
|
194
|
+
return [
|
|
195
|
+
heading(2, 'Session Status'),
|
|
196
|
+
paragraph(`**Overall Progress:** ${progressBar} (${progress}%)`),
|
|
197
|
+
paragraph(`**Current Focus:** ${currentPhaseInfo}`),
|
|
198
|
+
table(['Metric', 'Value'], [
|
|
199
|
+
['Active Patterns', String(counts.active)],
|
|
200
|
+
['Completed', String(counts.completed)],
|
|
201
|
+
['Remaining', String(counts.planned + counts.active)],
|
|
202
|
+
]),
|
|
203
|
+
separator(),
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Build active work section
|
|
208
|
+
*/
|
|
209
|
+
function buildActiveWork(dataset, _options) {
|
|
210
|
+
const sections = [];
|
|
211
|
+
const activePatterns = dataset.byStatus.active;
|
|
212
|
+
if (activePatterns.length === 0) {
|
|
213
|
+
sections.push(heading(2, 'Active Work'), paragraph('No patterns are currently active.'), separator());
|
|
214
|
+
return sections;
|
|
215
|
+
}
|
|
216
|
+
sections.push(heading(2, 'Active Work'));
|
|
217
|
+
sections.push(paragraph(`${activePatterns.length} patterns in progress:`));
|
|
218
|
+
// Group by phase
|
|
219
|
+
const byPhase = new Map();
|
|
220
|
+
for (const p of activePatterns) {
|
|
221
|
+
const phase = p.phase ?? 0;
|
|
222
|
+
const existing = byPhase.get(phase) ?? [];
|
|
223
|
+
existing.push(p);
|
|
224
|
+
byPhase.set(phase, existing);
|
|
225
|
+
}
|
|
226
|
+
// Sort by phase
|
|
227
|
+
const sortedPhases = [...byPhase.keys()].sort((a, b) => a - b);
|
|
228
|
+
for (const phase of sortedPhases) {
|
|
229
|
+
const patterns = byPhase.get(phase) ?? [];
|
|
230
|
+
const phaseLabel = phase === 0 ? 'Unphased' : `Phase ${phase}`;
|
|
231
|
+
sections.push(heading(3, `🚧 ${phaseLabel}`));
|
|
232
|
+
const rows = patterns.map((p) => {
|
|
233
|
+
const name = getDisplayName(p);
|
|
234
|
+
const summary = extractSummary(p.directive.description, p.patternName);
|
|
235
|
+
const effort = p.effort ?? '-';
|
|
236
|
+
return [name, summary || '-', effort];
|
|
237
|
+
});
|
|
238
|
+
sections.push(table(['Pattern', 'Description', 'Effort'], rows));
|
|
239
|
+
}
|
|
240
|
+
sections.push(separator());
|
|
241
|
+
return sections;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Build current phase context summary (links to detail file)
|
|
245
|
+
*/
|
|
246
|
+
function buildCurrentPhaseContextSummary(dataset, options) {
|
|
247
|
+
const sections = [];
|
|
248
|
+
// Find current phase (first incomplete)
|
|
249
|
+
const currentPhase = dataset.byPhase.find((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
250
|
+
if (!currentPhase) {
|
|
251
|
+
return [];
|
|
252
|
+
}
|
|
253
|
+
const { phaseNumber, phaseName, counts } = currentPhase;
|
|
254
|
+
const displayName = phaseName ?? `Phase ${phaseNumber}`;
|
|
255
|
+
const progress = completionPercentage(counts);
|
|
256
|
+
const progressBar = renderProgressBar(counts.completed, counts.total, 15);
|
|
257
|
+
const slug = getSessionPhaseSlug(phaseNumber, phaseName);
|
|
258
|
+
sections.push(heading(2, 'Current Phase Focus'));
|
|
259
|
+
sections.push(paragraph(`**${displayName}:** ${progressBar} ${progress}% complete`), paragraph(`${counts.active} active, ${counts.planned} planned, ${counts.completed} completed`));
|
|
260
|
+
// Only show link if generating detail files
|
|
261
|
+
if (options.generateDetailFiles) {
|
|
262
|
+
sections.push(linkOut(`View ${displayName} details →`, `sessions/${slug}.md`));
|
|
263
|
+
}
|
|
264
|
+
sections.push(separator());
|
|
265
|
+
return sections;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Build recent completions section
|
|
269
|
+
*/
|
|
270
|
+
function buildSessionRecentCompletions(dataset, options) {
|
|
271
|
+
const sections = [];
|
|
272
|
+
const completed = dataset.byStatus.completed;
|
|
273
|
+
if (completed.length === 0) {
|
|
274
|
+
return [];
|
|
275
|
+
}
|
|
276
|
+
// Show most recent completions (use limits from options with safe default)
|
|
277
|
+
const recentLimit = options.limits.recentItems ?? 10;
|
|
278
|
+
const recent = completed.slice(-recentLimit).reverse();
|
|
279
|
+
const completedContent = [];
|
|
280
|
+
const items = recent.map((p) => {
|
|
281
|
+
const name = getDisplayName(p);
|
|
282
|
+
const phase = p.phase !== undefined ? ` (Phase ${p.phase})` : '';
|
|
283
|
+
return `✅ ${name}${phase}`;
|
|
284
|
+
});
|
|
285
|
+
completedContent.push(list(items));
|
|
286
|
+
if (completed.length > recentLimit) {
|
|
287
|
+
completedContent.push(paragraph(`...and ${completed.length - recentLimit} more.`));
|
|
288
|
+
}
|
|
289
|
+
sections.push(collapsible(`Recent Completions (${completed.length} total)`, completedContent));
|
|
290
|
+
return sections;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Build blocked items section
|
|
294
|
+
*/
|
|
295
|
+
function buildBlockedItems(dataset) {
|
|
296
|
+
const sections = [];
|
|
297
|
+
// Find patterns that are blocked (have unmet dependencies)
|
|
298
|
+
const blocked = [];
|
|
299
|
+
for (const pattern of dataset.patterns) {
|
|
300
|
+
if (!pattern.dependsOn || pattern.dependsOn.length === 0)
|
|
301
|
+
continue;
|
|
302
|
+
if (isPatternComplete(pattern.status))
|
|
303
|
+
continue;
|
|
304
|
+
// Check if any dependency is not completed
|
|
305
|
+
const hasUnmetDep = pattern.dependsOn.some((depName) => {
|
|
306
|
+
const dep = dataset.patterns.find((p) => p.patternName === depName || p.name === depName);
|
|
307
|
+
return dep !== undefined && !isPatternComplete(dep.status);
|
|
308
|
+
});
|
|
309
|
+
if (hasUnmetDep) {
|
|
310
|
+
blocked.push(pattern);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (blocked.length === 0) {
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
sections.push(heading(2, '⚠️ Blocked Items'));
|
|
317
|
+
sections.push(paragraph(`${blocked.length} patterns are blocked by incomplete dependencies:`));
|
|
318
|
+
const rows = blocked.map((p) => {
|
|
319
|
+
const name = getDisplayName(p);
|
|
320
|
+
const deps = (p.dependsOn ?? []).join(', ');
|
|
321
|
+
return [name, deps];
|
|
322
|
+
});
|
|
323
|
+
sections.push(table(['Pattern', 'Blocked By'], rows));
|
|
324
|
+
sections.push(separator());
|
|
325
|
+
return sections;
|
|
326
|
+
}
|
|
327
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
328
|
+
// Session Context Progressive Disclosure
|
|
329
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
330
|
+
/**
|
|
331
|
+
* Generate slug for session phase detail file
|
|
332
|
+
*/
|
|
333
|
+
function getSessionPhaseSlug(phaseNumber, phaseName) {
|
|
334
|
+
const paddedPhase = String(phaseNumber).padStart(2, '0');
|
|
335
|
+
const namePart = phaseName ? toKebabCase(phaseName) : 'unnamed';
|
|
336
|
+
return `phase-${paddedPhase}-${namePart}`;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Build session phase navigation table
|
|
340
|
+
*/
|
|
341
|
+
function buildSessionPhaseNavigation(dataset, options) {
|
|
342
|
+
const sections = [];
|
|
343
|
+
// Get incomplete phases (the ones relevant for session context)
|
|
344
|
+
const incompletePhases = dataset.byPhase.filter((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
345
|
+
if (incompletePhases.length === 0) {
|
|
346
|
+
return [];
|
|
347
|
+
}
|
|
348
|
+
sections.push(heading(2, 'Phase Navigation'));
|
|
349
|
+
const rows = incompletePhases
|
|
350
|
+
.sort((a, b) => a.phaseNumber - b.phaseNumber)
|
|
351
|
+
.map((phase) => {
|
|
352
|
+
const { phaseNumber, phaseName, counts } = phase;
|
|
353
|
+
const displayName = phaseName ?? `Phase ${phaseNumber}`;
|
|
354
|
+
const progress = completionPercentage(counts);
|
|
355
|
+
const remaining = counts.total - counts.completed;
|
|
356
|
+
const slug = getSessionPhaseSlug(phaseNumber, phaseName);
|
|
357
|
+
const statusEmoji = getPhaseStatusEmoji(false, counts.active > 0);
|
|
358
|
+
// Link to detail file only if generating detail files
|
|
359
|
+
const nameCell = options.generateDetailFiles
|
|
360
|
+
? `${statusEmoji} [${displayName}](sessions/${slug}.md)`
|
|
361
|
+
: `${statusEmoji} ${displayName}`;
|
|
362
|
+
return [nameCell, `${remaining} remaining`, `${progress}%`];
|
|
363
|
+
});
|
|
364
|
+
sections.push(table(['Phase', 'Remaining', 'Complete'], rows), separator());
|
|
365
|
+
return sections;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Build session phase detail files (progressive disclosure)
|
|
369
|
+
*/
|
|
370
|
+
function buildSessionPhaseFiles(dataset, options) {
|
|
371
|
+
const files = {};
|
|
372
|
+
// Get incomplete phases
|
|
373
|
+
const incompletePhases = dataset.byPhase.filter((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
374
|
+
for (const phase of incompletePhases) {
|
|
375
|
+
const slug = getSessionPhaseSlug(phase.phaseNumber, phase.phaseName);
|
|
376
|
+
files[`sessions/${slug}.md`] = buildSessionPhaseDetailDocument(phase, dataset, options);
|
|
377
|
+
}
|
|
378
|
+
return files;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Build a single session phase detail document
|
|
382
|
+
*/
|
|
383
|
+
function buildSessionPhaseDetailDocument(phase, dataset, options) {
|
|
384
|
+
const sections = [];
|
|
385
|
+
const { phaseNumber, phaseName, patterns, counts } = phase;
|
|
386
|
+
const displayName = phaseName ?? `Phase ${phaseNumber}`;
|
|
387
|
+
// Summary
|
|
388
|
+
const progress = completionPercentage(counts);
|
|
389
|
+
const progressBar = renderProgressBar(counts.completed, counts.total, 20);
|
|
390
|
+
sections.push(heading(2, 'Summary'), paragraph(`**Progress:** ${progressBar} (${progress}%)`), table(['Status', 'Count'], [
|
|
391
|
+
['🚧 Active', String(counts.active)],
|
|
392
|
+
['📋 Planned', String(counts.planned)],
|
|
393
|
+
['✅ Completed', String(counts.completed)],
|
|
394
|
+
['**Total**', String(counts.total)],
|
|
395
|
+
]), separator());
|
|
396
|
+
// Active patterns (priority)
|
|
397
|
+
const active = patterns.filter((p) => isPatternActive(p.status));
|
|
398
|
+
if (active.length > 0) {
|
|
399
|
+
sections.push(heading(2, '🚧 Active Work'));
|
|
400
|
+
sections.push(...buildSessionPatternList(active, true));
|
|
401
|
+
}
|
|
402
|
+
// Planned patterns
|
|
403
|
+
const planned = patterns.filter((p) => isPatternPlanned(p.status));
|
|
404
|
+
if (planned.length > 0) {
|
|
405
|
+
sections.push(heading(2, '📋 Planned Work'));
|
|
406
|
+
// Separate blocked from ready (only if includeDependencies is enabled)
|
|
407
|
+
if (options.includeDependencies) {
|
|
408
|
+
const blocked = [];
|
|
409
|
+
const ready = [];
|
|
410
|
+
for (const pattern of planned) {
|
|
411
|
+
if (!pattern.dependsOn || pattern.dependsOn.length === 0) {
|
|
412
|
+
ready.push(pattern);
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
const hasUnmetDep = pattern.dependsOn.some((depName) => {
|
|
416
|
+
const dep = dataset.patterns.find((p) => p.patternName === depName || p.name === depName);
|
|
417
|
+
return dep !== undefined && !isPatternComplete(dep.status);
|
|
418
|
+
});
|
|
419
|
+
if (hasUnmetDep) {
|
|
420
|
+
blocked.push(pattern);
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
ready.push(pattern);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
if (ready.length > 0) {
|
|
427
|
+
sections.push(heading(3, '✅ Ready to Start'));
|
|
428
|
+
sections.push(...buildSessionPatternList(ready, false));
|
|
429
|
+
}
|
|
430
|
+
if (blocked.length > 0) {
|
|
431
|
+
sections.push(heading(3, '⚠️ Blocked'));
|
|
432
|
+
sections.push(...buildBlockedPatternList(blocked));
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
// Without dependency checking, show all planned items together
|
|
437
|
+
sections.push(...buildSessionPatternList(planned, false));
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// Completed patterns (collapsible)
|
|
441
|
+
const completed = patterns.filter((p) => isPatternComplete(p.status));
|
|
442
|
+
if (completed.length > 0) {
|
|
443
|
+
const completedContent = [];
|
|
444
|
+
const items = completed.map((p) => `✅ ${getDisplayName(p)}`);
|
|
445
|
+
completedContent.push(list(items));
|
|
446
|
+
sections.push(collapsible(`Completed in this phase (${completed.length})`, completedContent));
|
|
447
|
+
}
|
|
448
|
+
// Back link
|
|
449
|
+
sections.push(linkOut('← Back to Session Context', '../SESSION-CONTEXT.md'));
|
|
450
|
+
return document(`${displayName} - Session Focus`, sections, {
|
|
451
|
+
purpose: `Detailed session context for ${displayName}`,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Build session pattern list with details
|
|
456
|
+
*/
|
|
457
|
+
function buildSessionPatternList(patterns, showEffort) {
|
|
458
|
+
const sections = [];
|
|
459
|
+
for (const pattern of sortByPhaseAndName([...patterns])) {
|
|
460
|
+
const emoji = getStatusEmoji(pattern.status);
|
|
461
|
+
const name = getDisplayName(pattern);
|
|
462
|
+
sections.push(heading(3, `${emoji} ${name}`));
|
|
463
|
+
// Metadata table
|
|
464
|
+
const metaRows = [['Status', normalizeStatus(pattern.status)]];
|
|
465
|
+
if (showEffort && pattern.effort) {
|
|
466
|
+
metaRows.push(['Effort', pattern.effort]);
|
|
467
|
+
}
|
|
468
|
+
const businessValue = formatBusinessValue(pattern.businessValue);
|
|
469
|
+
if (businessValue) {
|
|
470
|
+
metaRows.push(['Business Value', businessValue]);
|
|
471
|
+
}
|
|
472
|
+
sections.push(table(['Property', 'Value'], metaRows));
|
|
473
|
+
// Description
|
|
474
|
+
if (pattern.directive.description) {
|
|
475
|
+
sections.push(paragraph(pattern.directive.description));
|
|
476
|
+
}
|
|
477
|
+
// Use cases
|
|
478
|
+
if (pattern.useCases && pattern.useCases.length > 0) {
|
|
479
|
+
sections.push(heading(4, 'Use Cases'), list([...pattern.useCases]));
|
|
480
|
+
}
|
|
481
|
+
// Acceptance Criteria (scenarios with steps, DataTables, DocStrings)
|
|
482
|
+
sections.push(...renderAcceptanceCriteria(pattern.scenarios));
|
|
483
|
+
// Business Rules (from Gherkin Rule: keyword)
|
|
484
|
+
sections.push(...renderBusinessRulesSection(pattern.rules));
|
|
485
|
+
}
|
|
486
|
+
sections.push(separator());
|
|
487
|
+
return sections;
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Build blocked pattern list with dependencies
|
|
491
|
+
*/
|
|
492
|
+
function buildBlockedPatternList(patterns) {
|
|
493
|
+
const rows = sortByPhaseAndName([...patterns]).map((p) => {
|
|
494
|
+
const name = getDisplayName(p);
|
|
495
|
+
const deps = (p.dependsOn ?? []).join(', ');
|
|
496
|
+
const effort = p.effort ?? '-';
|
|
497
|
+
return [name, deps, effort];
|
|
498
|
+
});
|
|
499
|
+
return [table(['Pattern', 'Blocked By', 'Effort'], rows), separator()];
|
|
500
|
+
}
|
|
501
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
502
|
+
// Remaining Work Document Builder
|
|
503
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
504
|
+
/**
|
|
505
|
+
* Build remaining work document
|
|
506
|
+
*/
|
|
507
|
+
function buildRemainingWorkDocument(dataset, options) {
|
|
508
|
+
const sections = [];
|
|
509
|
+
// Get all incomplete patterns based on options
|
|
510
|
+
let incomplete = [];
|
|
511
|
+
if (options.includeIncomplete) {
|
|
512
|
+
incomplete = [...dataset.byStatus.active, ...dataset.byStatus.planned];
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
incomplete = [...dataset.byStatus.active]; // Only active
|
|
516
|
+
}
|
|
517
|
+
if (incomplete.length === 0) {
|
|
518
|
+
sections.push(heading(2, 'All Work Complete'), paragraph('All patterns have been completed. 🎉'));
|
|
519
|
+
return document('Remaining Work', sections, {
|
|
520
|
+
purpose: 'Track incomplete work',
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
// 1. Summary (if enabled)
|
|
524
|
+
if (options.includeStats) {
|
|
525
|
+
sections.push(...buildRemainingWorkSummary(dataset, incomplete));
|
|
526
|
+
}
|
|
527
|
+
// 2. Phase navigation table (links to detail files)
|
|
528
|
+
sections.push(...buildRemainingPhaseNavigation(dataset, options));
|
|
529
|
+
// 3. By priority (blocked vs not blocked) - summary only (if blocked items enabled)
|
|
530
|
+
if (options.includeBlocked) {
|
|
531
|
+
sections.push(...buildRemainingByPrioritySummary(dataset, incomplete, options));
|
|
532
|
+
}
|
|
533
|
+
// 4. Next actionable items (if enabled)
|
|
534
|
+
if (options.includeNextActionable) {
|
|
535
|
+
sections.push(...buildNextActionableItems(dataset, incomplete, options));
|
|
536
|
+
}
|
|
537
|
+
// Build phase detail files (if enabled)
|
|
538
|
+
const additionalFiles = options.generateDetailFiles
|
|
539
|
+
? buildRemainingPhaseFiles(dataset, options)
|
|
540
|
+
: {};
|
|
541
|
+
const docOpts = {
|
|
542
|
+
purpose: 'Aggregate view of all incomplete work',
|
|
543
|
+
detailLevel: options.generateDetailFiles
|
|
544
|
+
? 'Summary with links to phase details'
|
|
545
|
+
: 'Compact summary',
|
|
546
|
+
};
|
|
547
|
+
if (Object.keys(additionalFiles).length > 0) {
|
|
548
|
+
docOpts.additionalFiles = additionalFiles;
|
|
549
|
+
}
|
|
550
|
+
return document('Remaining Work', sections, docOpts);
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Build next actionable items section
|
|
554
|
+
*/
|
|
555
|
+
function buildNextActionableItems(dataset, incomplete, options) {
|
|
556
|
+
const sections = [];
|
|
557
|
+
// Find patterns that are not blocked
|
|
558
|
+
const actionable = incomplete.filter((pattern) => {
|
|
559
|
+
if (!isPatternPlanned(pattern.status)) {
|
|
560
|
+
return false; // Active items are already being worked on
|
|
561
|
+
}
|
|
562
|
+
if (!pattern.dependsOn || pattern.dependsOn.length === 0) {
|
|
563
|
+
return true; // No dependencies = actionable
|
|
564
|
+
}
|
|
565
|
+
// Check if all dependencies are completed
|
|
566
|
+
const allDepsComplete = pattern.dependsOn.every((depName) => {
|
|
567
|
+
const dep = dataset.patterns.find((p) => p.patternName === depName || p.name === depName);
|
|
568
|
+
return dep === undefined || isPatternComplete(dep.status);
|
|
569
|
+
});
|
|
570
|
+
return allDepsComplete;
|
|
571
|
+
});
|
|
572
|
+
if (actionable.length === 0) {
|
|
573
|
+
return [];
|
|
574
|
+
}
|
|
575
|
+
sections.push(heading(2, 'Next Actionable Items'));
|
|
576
|
+
sections.push(paragraph('Items ready to start (no blocking dependencies):'));
|
|
577
|
+
const limit = options.maxNextActionable;
|
|
578
|
+
const items = sortByPhaseAndName(actionable)
|
|
579
|
+
.slice(0, limit)
|
|
580
|
+
.map((p) => {
|
|
581
|
+
const name = getDisplayName(p);
|
|
582
|
+
const phase = p.phase !== undefined ? ` (Phase ${p.phase})` : '';
|
|
583
|
+
const effort = p.effort ? ` - ${p.effort}` : '';
|
|
584
|
+
return `📋 ${name}${phase}${effort}`;
|
|
585
|
+
});
|
|
586
|
+
sections.push(list(items));
|
|
587
|
+
if (actionable.length > limit) {
|
|
588
|
+
sections.push(paragraph(`Showing ${limit} of ${actionable.length} actionable items.`));
|
|
589
|
+
}
|
|
590
|
+
sections.push(separator());
|
|
591
|
+
return sections;
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Build remaining work summary
|
|
595
|
+
*/
|
|
596
|
+
function buildRemainingWorkSummary(dataset, incomplete) {
|
|
597
|
+
const active = incomplete.filter((p) => isPatternActive(p.status));
|
|
598
|
+
const planned = incomplete.filter((p) => isPatternPlanned(p.status));
|
|
599
|
+
const progress = completionPercentage(dataset.counts);
|
|
600
|
+
const progressBar = renderProgressBar(dataset.counts.completed, dataset.counts.total, 20);
|
|
601
|
+
return [
|
|
602
|
+
heading(2, 'Summary'),
|
|
603
|
+
paragraph(`**Overall Progress:** ${progressBar} (${progress}%)`),
|
|
604
|
+
table(['Status', 'Count'], [
|
|
605
|
+
['🚧 Active', String(active.length)],
|
|
606
|
+
['📋 Planned', String(planned.length)],
|
|
607
|
+
['**Total Remaining**', String(incomplete.length)],
|
|
608
|
+
]),
|
|
609
|
+
separator(),
|
|
610
|
+
];
|
|
611
|
+
}
|
|
612
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
613
|
+
// Remaining Work Progressive Disclosure
|
|
614
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
615
|
+
/**
|
|
616
|
+
* Generate slug for remaining work phase detail file
|
|
617
|
+
*/
|
|
618
|
+
function getRemainingPhaseSlug(phaseNumber, phaseName) {
|
|
619
|
+
const paddedPhase = String(phaseNumber).padStart(2, '0');
|
|
620
|
+
const namePart = phaseName ? toKebabCase(phaseName) : 'unnamed';
|
|
621
|
+
return `phase-${paddedPhase}-${namePart}`;
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Build remaining work phase navigation table
|
|
625
|
+
*/
|
|
626
|
+
function buildRemainingPhaseNavigation(dataset, options) {
|
|
627
|
+
const sections = [];
|
|
628
|
+
// Get incomplete phases
|
|
629
|
+
const incompletePhases = dataset.byPhase.filter((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
630
|
+
if (incompletePhases.length === 0) {
|
|
631
|
+
return [];
|
|
632
|
+
}
|
|
633
|
+
sections.push(heading(2, 'By Phase'));
|
|
634
|
+
const rows = incompletePhases
|
|
635
|
+
.sort((a, b) => a.phaseNumber - b.phaseNumber)
|
|
636
|
+
.map((phase) => {
|
|
637
|
+
const { phaseNumber, phaseName, counts } = phase;
|
|
638
|
+
const displayName = phaseName ?? `Phase ${phaseNumber}`;
|
|
639
|
+
const remaining = counts.total - counts.completed;
|
|
640
|
+
const progress = completionPercentage(counts);
|
|
641
|
+
const slug = getRemainingPhaseSlug(phaseNumber, phaseName);
|
|
642
|
+
const statusEmoji = getPhaseStatusEmoji(false, counts.active > 0);
|
|
643
|
+
// Link to detail file only if generating detail files
|
|
644
|
+
const nameCell = options.generateDetailFiles
|
|
645
|
+
? `${statusEmoji} [${displayName}](remaining/${slug}.md)`
|
|
646
|
+
: `${statusEmoji} ${displayName}`;
|
|
647
|
+
return [nameCell, String(remaining), String(counts.active), `${progress}%`];
|
|
648
|
+
});
|
|
649
|
+
// Add backlog row for patterns without a phase assignment
|
|
650
|
+
// Use pattern.id (always defined) instead of patternName (can be undefined)
|
|
651
|
+
// to avoid incorrect filtering when undefined values are added to the Set
|
|
652
|
+
const patternsWithPhase = new Set(dataset.byPhase.flatMap((p) => p.patterns.map((pat) => pat.id)));
|
|
653
|
+
const incomplete = [...dataset.byStatus.active, ...dataset.byStatus.planned];
|
|
654
|
+
const backlogPatterns = incomplete.filter((p) => !patternsWithPhase.has(p.id));
|
|
655
|
+
if (backlogPatterns.length > 0) {
|
|
656
|
+
const backlogActive = backlogPatterns.filter((p) => isPatternActive(p.status)).length;
|
|
657
|
+
const statusEmoji = getPhaseStatusEmoji(false, backlogActive > 0);
|
|
658
|
+
rows.push([
|
|
659
|
+
`${statusEmoji} Backlog (No Phase)`,
|
|
660
|
+
String(backlogPatterns.length),
|
|
661
|
+
String(backlogActive),
|
|
662
|
+
'0%',
|
|
663
|
+
]);
|
|
664
|
+
}
|
|
665
|
+
sections.push(table(['Phase', 'Remaining', 'Active', 'Complete'], rows), separator());
|
|
666
|
+
return sections;
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Build remaining work by priority (summary only for index)
|
|
670
|
+
*/
|
|
671
|
+
function buildRemainingByPrioritySummary(dataset, incomplete, options) {
|
|
672
|
+
const sections = [];
|
|
673
|
+
// Categorize by priority
|
|
674
|
+
const unblocked = [];
|
|
675
|
+
const blocked = [];
|
|
676
|
+
for (const pattern of incomplete) {
|
|
677
|
+
if (!pattern.dependsOn || pattern.dependsOn.length === 0) {
|
|
678
|
+
unblocked.push(pattern);
|
|
679
|
+
continue;
|
|
680
|
+
}
|
|
681
|
+
const hasUnmetDep = pattern.dependsOn.some((depName) => {
|
|
682
|
+
const dep = dataset.patterns.find((p) => p.patternName === depName || p.name === depName);
|
|
683
|
+
return dep !== undefined && !isPatternComplete(dep.status);
|
|
684
|
+
});
|
|
685
|
+
if (hasUnmetDep) {
|
|
686
|
+
blocked.push(pattern);
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
unblocked.push(pattern);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
sections.push(heading(2, 'By Priority'));
|
|
693
|
+
// Summary table
|
|
694
|
+
const readyCount = unblocked.filter((p) => isPatternPlanned(p.status)).length;
|
|
695
|
+
const activeCount = incomplete.filter((p) => isPatternActive(p.status)).length;
|
|
696
|
+
sections.push(table(['Priority', 'Count'], [
|
|
697
|
+
['🚧 In Progress', String(activeCount)],
|
|
698
|
+
['✅ Ready to Start', String(readyCount)],
|
|
699
|
+
['⚠️ Blocked', String(blocked.length)],
|
|
700
|
+
]));
|
|
701
|
+
// Show top ready to start (use limits from options with safe default)
|
|
702
|
+
const limit = options.limits.recentItems ?? 10;
|
|
703
|
+
const readyToStart = unblocked.filter((p) => isPatternPlanned(p.status));
|
|
704
|
+
if (readyToStart.length > 0) {
|
|
705
|
+
sections.push(heading(3, 'Top Ready to Start'));
|
|
706
|
+
const items = sortByPhaseAndName(readyToStart)
|
|
707
|
+
.slice(0, limit)
|
|
708
|
+
.map((p) => {
|
|
709
|
+
const name = getDisplayName(p);
|
|
710
|
+
const phase = p.phase !== undefined ? ` (Phase ${p.phase})` : '';
|
|
711
|
+
return `${name}${phase}`;
|
|
712
|
+
});
|
|
713
|
+
sections.push(list(items));
|
|
714
|
+
if (readyToStart.length > limit) {
|
|
715
|
+
sections.push(paragraph(`See phase detail files for full list.`));
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
sections.push(separator());
|
|
719
|
+
return sections;
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Build remaining work phase detail files (progressive disclosure)
|
|
723
|
+
*/
|
|
724
|
+
function buildRemainingPhaseFiles(dataset, options) {
|
|
725
|
+
const files = {};
|
|
726
|
+
// Get incomplete phases
|
|
727
|
+
const incompletePhases = dataset.byPhase.filter((p) => p.counts.total > 0 && p.counts.completed < p.counts.total);
|
|
728
|
+
for (const phase of incompletePhases) {
|
|
729
|
+
const slug = getRemainingPhaseSlug(phase.phaseNumber, phase.phaseName);
|
|
730
|
+
files[`remaining/${slug}.md`] = buildRemainingPhaseDetailDocument(phase, dataset, options);
|
|
731
|
+
}
|
|
732
|
+
return files;
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Build a single remaining work phase detail document
|
|
736
|
+
*/
|
|
737
|
+
function buildRemainingPhaseDetailDocument(phase, dataset, _options) {
|
|
738
|
+
const sections = [];
|
|
739
|
+
const { phaseNumber, phaseName, patterns, counts } = phase;
|
|
740
|
+
const displayName = phaseName ?? `Phase ${phaseNumber}`;
|
|
741
|
+
// Summary
|
|
742
|
+
const progress = completionPercentage(counts);
|
|
743
|
+
const progressBar = renderProgressBar(counts.completed, counts.total, 20);
|
|
744
|
+
const remaining = counts.total - counts.completed;
|
|
745
|
+
sections.push(heading(2, 'Summary'), paragraph(`**Progress:** ${progressBar} (${progress}%)`), paragraph(`**Remaining:** ${remaining} patterns (${counts.active} active, ${counts.planned} planned)`), separator());
|
|
746
|
+
// Get incomplete patterns
|
|
747
|
+
const incompletePatterns = patterns.filter((p) => !isPatternComplete(p.status));
|
|
748
|
+
// Categorize by priority
|
|
749
|
+
const active = [];
|
|
750
|
+
const ready = [];
|
|
751
|
+
const blocked = [];
|
|
752
|
+
for (const pattern of incompletePatterns) {
|
|
753
|
+
if (isPatternActive(pattern.status)) {
|
|
754
|
+
active.push(pattern);
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
757
|
+
if (!pattern.dependsOn || pattern.dependsOn.length === 0) {
|
|
758
|
+
ready.push(pattern);
|
|
759
|
+
continue;
|
|
760
|
+
}
|
|
761
|
+
const hasUnmetDep = pattern.dependsOn.some((depName) => {
|
|
762
|
+
const dep = dataset.patterns.find((p) => p.patternName === depName || p.name === depName);
|
|
763
|
+
return dep !== undefined && !isPatternComplete(dep.status);
|
|
764
|
+
});
|
|
765
|
+
if (hasUnmetDep) {
|
|
766
|
+
blocked.push(pattern);
|
|
767
|
+
}
|
|
768
|
+
else {
|
|
769
|
+
ready.push(pattern);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
// Active patterns
|
|
773
|
+
if (active.length > 0) {
|
|
774
|
+
sections.push(heading(2, '🚧 In Progress'));
|
|
775
|
+
sections.push(...buildRemainingPatternTable(active));
|
|
776
|
+
}
|
|
777
|
+
// Ready to start
|
|
778
|
+
if (ready.length > 0) {
|
|
779
|
+
sections.push(heading(2, '✅ Ready to Start'));
|
|
780
|
+
sections.push(paragraph('These patterns can be started immediately:'));
|
|
781
|
+
sections.push(...buildRemainingPatternTable(ready));
|
|
782
|
+
}
|
|
783
|
+
// Blocked
|
|
784
|
+
if (blocked.length > 0) {
|
|
785
|
+
sections.push(heading(2, '⚠️ Blocked'));
|
|
786
|
+
sections.push(paragraph('These patterns are waiting on dependencies:'));
|
|
787
|
+
const rows = sortByPhaseAndName([...blocked]).map((p) => {
|
|
788
|
+
const name = getDisplayName(p);
|
|
789
|
+
const deps = (p.dependsOn ?? []).join(', ');
|
|
790
|
+
const effort = p.effort ?? '-';
|
|
791
|
+
return [name, deps, effort];
|
|
792
|
+
});
|
|
793
|
+
sections.push(table(['Pattern', 'Blocked By', 'Effort'], rows));
|
|
794
|
+
sections.push(separator());
|
|
795
|
+
}
|
|
796
|
+
// All remaining patterns (detailed)
|
|
797
|
+
sections.push(heading(2, 'All Remaining Patterns'));
|
|
798
|
+
for (const pattern of sortByPhaseAndName([...incompletePatterns])) {
|
|
799
|
+
const emoji = getStatusEmoji(pattern.status);
|
|
800
|
+
const name = getDisplayName(pattern);
|
|
801
|
+
sections.push(heading(3, `${emoji} ${name}`));
|
|
802
|
+
// Metadata table
|
|
803
|
+
const metaRows = [['Status', normalizeStatus(pattern.status)]];
|
|
804
|
+
if (pattern.effort) {
|
|
805
|
+
metaRows.push(['Effort', pattern.effort]);
|
|
806
|
+
}
|
|
807
|
+
const businessValue = formatBusinessValue(pattern.businessValue);
|
|
808
|
+
if (businessValue) {
|
|
809
|
+
metaRows.push(['Business Value', businessValue]);
|
|
810
|
+
}
|
|
811
|
+
if (pattern.dependsOn && pattern.dependsOn.length > 0) {
|
|
812
|
+
metaRows.push(['Dependencies', pattern.dependsOn.join(', ')]);
|
|
813
|
+
}
|
|
814
|
+
sections.push(table(['Property', 'Value'], metaRows));
|
|
815
|
+
// Description
|
|
816
|
+
if (pattern.directive.description) {
|
|
817
|
+
sections.push(paragraph(pattern.directive.description));
|
|
818
|
+
}
|
|
819
|
+
// Use cases
|
|
820
|
+
if (pattern.useCases && pattern.useCases.length > 0) {
|
|
821
|
+
sections.push(heading(4, 'Use Cases'), list([...pattern.useCases]));
|
|
822
|
+
}
|
|
823
|
+
// Acceptance Criteria (scenarios with steps, DataTables, DocStrings)
|
|
824
|
+
sections.push(...renderAcceptanceCriteria(pattern.scenarios));
|
|
825
|
+
// Business Rules (from Gherkin Rule: keyword)
|
|
826
|
+
sections.push(...renderBusinessRulesSection(pattern.rules));
|
|
827
|
+
}
|
|
828
|
+
sections.push(separator());
|
|
829
|
+
// Back link
|
|
830
|
+
sections.push(linkOut('← Back to Remaining Work', '../REMAINING-WORK.md'));
|
|
831
|
+
return document(`${displayName} - Remaining Work`, sections, {
|
|
832
|
+
purpose: `Detailed remaining work for ${displayName}`,
|
|
833
|
+
});
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Build remaining pattern table
|
|
837
|
+
*/
|
|
838
|
+
function buildRemainingPatternTable(patterns) {
|
|
839
|
+
const rows = sortByPhaseAndName([...patterns]).map((p) => {
|
|
840
|
+
const emoji = getStatusEmoji(p.status);
|
|
841
|
+
const name = getDisplayName(p);
|
|
842
|
+
const effort = p.effort ?? '-';
|
|
843
|
+
const businessValue = formatBusinessValue(p.businessValue) || '-';
|
|
844
|
+
return [`${emoji} ${name}`, effort, businessValue];
|
|
845
|
+
});
|
|
846
|
+
return [table(['Pattern', 'Effort', 'Business Value'], rows), separator()];
|
|
847
|
+
}
|
|
848
|
+
//# sourceMappingURL=session.js.map
|