@seanmars/tospec 0.19.0-beta.0 → 0.19.0-beta.13
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 +578 -0
- package/README.md +71 -77
- package/assets/dashboard/app.js +14 -3
- package/assets/dashboard/style.css +7 -0
- package/assets/metrics/app.js +22 -0
- package/assets/metrics/style.css +8 -0
- package/assets/rules/tospec/decision.md +3 -0
- package/assets/rules/tospec/single-source-of-truth.md +19 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +266 -82
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts +9 -17
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +374 -95
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +64 -81
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +350 -218
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/decision.d.ts +41 -19
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +400 -70
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/metrics.d.ts +34 -48
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +74 -84
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/shared-output.d.ts +24 -10
- package/dist/commands/shared-output.d.ts.map +1 -1
- package/dist/commands/shared-output.js +62 -11
- package/dist/commands/shared-output.js.map +1 -1
- package/dist/commands/show.d.ts +7 -0
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +39 -8
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/validate.d.ts +47 -30
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +282 -108
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/workflow/index.d.ts +6 -10
- package/dist/commands/workflow/index.d.ts.map +1 -1
- package/dist/commands/workflow/index.js +6 -10
- package/dist/commands/workflow/index.js.map +1 -1
- package/dist/commands/workflow/instructions.d.ts +21 -8
- package/dist/commands/workflow/instructions.d.ts.map +1 -1
- package/dist/commands/workflow/instructions.js +254 -95
- package/dist/commands/workflow/instructions.js.map +1 -1
- package/dist/commands/workflow/new-change.d.ts +4 -5
- package/dist/commands/workflow/new-change.d.ts.map +1 -1
- package/dist/commands/workflow/new-change.js +90 -25
- package/dist/commands/workflow/new-change.js.map +1 -1
- package/dist/commands/workflow/schemas.d.ts +3 -5
- package/dist/commands/workflow/schemas.d.ts.map +1 -1
- package/dist/commands/workflow/schemas.js +37 -11
- package/dist/commands/workflow/schemas.js.map +1 -1
- package/dist/commands/workflow/shared.d.ts +48 -21
- package/dist/commands/workflow/shared.d.ts.map +1 -1
- package/dist/commands/workflow/shared.js +36 -33
- package/dist/commands/workflow/shared.js.map +1 -1
- package/dist/commands/workflow/status.d.ts +10 -6
- package/dist/commands/workflow/status.d.ts.map +1 -1
- package/dist/commands/workflow/status.js +84 -42
- package/dist/commands/workflow/status.js.map +1 -1
- package/dist/commands/workflow/templates.d.ts +10 -3
- package/dist/commands/workflow/templates.d.ts.map +1 -1
- package/dist/commands/workflow/templates.js +39 -40
- package/dist/commands/workflow/templates.js.map +1 -1
- package/dist/core/archive.d.ts +26 -21
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +415 -201
- package/dist/core/archive.js.map +1 -1
- package/dist/core/artifact-graph/graph.d.ts +29 -36
- package/dist/core/artifact-graph/graph.d.ts.map +1 -1
- package/dist/core/artifact-graph/graph.js +50 -58
- package/dist/core/artifact-graph/graph.js.map +1 -1
- package/dist/core/artifact-graph/index.d.ts +2 -2
- package/dist/core/artifact-graph/index.d.ts.map +1 -1
- package/dist/core/artifact-graph/index.js +2 -2
- package/dist/core/artifact-graph/index.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +105 -100
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +176 -110
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/artifact-graph/outputs.d.ts +13 -6
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -1
- package/dist/core/artifact-graph/outputs.js +146 -8
- package/dist/core/artifact-graph/outputs.js.map +1 -1
- package/dist/core/artifact-graph/resolver.d.ts +44 -63
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
- package/dist/core/artifact-graph/resolver.js +85 -86
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/artifact-graph/schema.d.ts +0 -6
- package/dist/core/artifact-graph/schema.d.ts.map +1 -1
- package/dist/core/artifact-graph/schema.js +7 -32
- package/dist/core/artifact-graph/schema.js.map +1 -1
- package/dist/core/artifact-graph/state.d.ts +1 -8
- package/dist/core/artifact-graph/state.d.ts.map +1 -1
- package/dist/core/artifact-graph/state.js +2 -17
- package/dist/core/artifact-graph/state.js.map +1 -1
- package/dist/core/artifact-graph/stub-detection.d.ts +12 -0
- package/dist/core/artifact-graph/stub-detection.d.ts.map +1 -0
- package/dist/core/artifact-graph/stub-detection.js +39 -0
- package/dist/core/artifact-graph/stub-detection.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +4 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -1
- package/dist/core/artifact-graph/types.js +30 -10
- package/dist/core/artifact-graph/types.js.map +1 -1
- package/dist/core/available-tools.d.ts +3 -12
- package/dist/core/available-tools.d.ts.map +1 -1
- package/dist/core/available-tools.js +4 -13
- package/dist/core/available-tools.js.map +1 -1
- package/dist/core/change-metadata/schema.d.ts +1 -1
- package/dist/core/change-metadata/schema.d.ts.map +1 -1
- package/dist/core/change-metadata/schema.js +10 -7
- package/dist/core/change-metadata/schema.js.map +1 -1
- package/dist/core/change-presenter.d.ts +23 -18
- package/dist/core/change-presenter.d.ts.map +1 -1
- package/dist/core/change-presenter.js +102 -43
- package/dist/core/change-presenter.js.map +1 -1
- package/dist/core/change-status-policy.d.ts +8 -1
- package/dist/core/change-status-policy.d.ts.map +1 -1
- package/dist/core/change-status-policy.js +25 -1
- package/dist/core/change-status-policy.js.map +1 -1
- package/dist/core/codex-metrics.d.ts +25 -45
- package/dist/core/codex-metrics.d.ts.map +1 -1
- package/dist/core/codex-metrics.js +44 -88
- package/dist/core/codex-metrics.js.map +1 -1
- package/dist/core/codex-residue.d.ts +22 -0
- package/dist/core/codex-residue.d.ts.map +1 -0
- package/dist/core/codex-residue.js +61 -0
- package/dist/core/codex-residue.js.map +1 -0
- package/dist/core/command-generation/adapters/claude.d.ts +2 -9
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/claude.js +2 -12
- package/dist/core/command-generation/adapters/claude.js.map +1 -1
- package/dist/core/command-generation/adapters/index.d.ts +1 -9
- package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/index.js +1 -9
- package/dist/core/command-generation/adapters/index.js.map +1 -1
- package/dist/core/command-generation/generator.d.ts +0 -17
- package/dist/core/command-generation/generator.d.ts.map +1 -1
- package/dist/core/command-generation/generator.js +0 -17
- package/dist/core/command-generation/generator.js.map +1 -1
- package/dist/core/command-generation/index.d.ts +2 -5
- package/dist/core/command-generation/index.d.ts.map +1 -1
- package/dist/core/command-generation/index.js +0 -9
- package/dist/core/command-generation/index.js.map +1 -1
- package/dist/core/command-generation/types.d.ts +10 -36
- package/dist/core/command-generation/types.d.ts.map +1 -1
- package/dist/core/command-generation/types.js +0 -6
- package/dist/core/command-generation/types.js.map +1 -1
- package/dist/core/command-generation/yaml.d.ts +3 -18
- package/dist/core/command-generation/yaml.d.ts.map +1 -1
- package/dist/core/command-generation/yaml.js +5 -23
- package/dist/core/command-generation/yaml.js.map +1 -1
- package/dist/core/config-prompts.d.ts +2 -4
- package/dist/core/config-prompts.d.ts.map +1 -1
- package/dist/core/config-prompts.js +2 -7
- package/dist/core/config-prompts.js.map +1 -1
- package/dist/core/config-schema.d.ts +8 -53
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +49 -62
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/config.d.ts +56 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +73 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/converters/json-converter.d.ts.map +1 -1
- package/dist/core/dashboard-activity.d.ts +7 -9
- package/dist/core/dashboard-activity.d.ts.map +1 -1
- package/dist/core/dashboard-activity.js +26 -24
- package/dist/core/dashboard-activity.js.map +1 -1
- package/dist/core/dashboard-data.d.ts +40 -22
- package/dist/core/dashboard-data.d.ts.map +1 -1
- package/dist/core/dashboard-data.js +84 -68
- package/dist/core/dashboard-data.js.map +1 -1
- package/dist/core/global-config.d.ts +24 -53
- package/dist/core/global-config.d.ts.map +1 -1
- package/dist/core/global-config.js +43 -62
- package/dist/core/global-config.js.map +1 -1
- package/dist/core/init.d.ts +29 -11
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +232 -164
- package/dist/core/init.js.map +1 -1
- package/dist/core/list.d.ts +1 -1
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +121 -28
- package/dist/core/list.js.map +1 -1
- package/dist/core/local-server.d.ts +63 -39
- package/dist/core/local-server.d.ts.map +1 -1
- package/dist/core/local-server.js +99 -53
- package/dist/core/local-server.js.map +1 -1
- package/dist/core/markdown-render.d.ts +25 -0
- package/dist/core/markdown-render.d.ts.map +1 -0
- package/dist/core/markdown-render.js +94 -0
- package/dist/core/markdown-render.js.map +1 -0
- package/dist/core/migrate.d.ts +32 -15
- package/dist/core/migrate.d.ts.map +1 -1
- package/dist/core/migrate.js +220 -108
- package/dist/core/migrate.js.map +1 -1
- package/dist/core/parsers/change-parser.d.ts +7 -10
- package/dist/core/parsers/change-parser.d.ts.map +1 -1
- package/dist/core/parsers/change-parser.js +48 -56
- package/dist/core/parsers/change-parser.js.map +1 -1
- package/dist/core/parsers/markdown-parser.d.ts +8 -9
- package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
- package/dist/core/parsers/markdown-parser.js +31 -22
- package/dist/core/parsers/markdown-parser.js.map +1 -1
- package/dist/core/parsers/requirement-blocks.d.ts +53 -11
- package/dist/core/parsers/requirement-blocks.d.ts.map +1 -1
- package/dist/core/parsers/requirement-blocks.js +200 -60
- package/dist/core/parsers/requirement-blocks.js.map +1 -1
- package/dist/core/parsers/requirement-text.d.ts +73 -79
- package/dist/core/parsers/requirement-text.d.ts.map +1 -1
- package/dist/core/parsers/requirement-text.js +137 -79
- package/dist/core/parsers/requirement-text.js.map +1 -1
- package/dist/core/parsers/spec-structure.d.ts +1 -1
- package/dist/core/parsers/spec-structure.d.ts.map +1 -1
- package/dist/core/parsers/spec-structure.js +30 -3
- package/dist/core/parsers/spec-structure.js.map +1 -1
- package/dist/core/planning-home.js.map +1 -1
- package/dist/core/profiles.d.ts +3 -10
- package/dist/core/profiles.d.ts.map +1 -1
- package/dist/core/profiles.js +5 -12
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/project-config.d.ts +43 -44
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +107 -82
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/project-layout.d.ts +10 -18
- package/dist/core/project-layout.d.ts.map +1 -1
- package/dist/core/project-layout.js +16 -26
- package/dist/core/project-layout.js.map +1 -1
- package/dist/core/root-selection.d.ts +11 -7
- package/dist/core/root-selection.d.ts.map +1 -1
- package/dist/core/root-selection.js +7 -8
- package/dist/core/root-selection.js.map +1 -1
- package/dist/core/rules.d.ts +10 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +43 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/schema-names.d.ts +16 -0
- package/dist/core/schema-names.d.ts.map +1 -0
- package/dist/core/schema-names.js +16 -0
- package/dist/core/schema-names.js.map +1 -0
- package/dist/core/schemas/base.schema.d.ts +3 -0
- package/dist/core/schemas/base.schema.d.ts.map +1 -1
- package/dist/core/schemas/base.schema.js +22 -6
- package/dist/core/schemas/base.schema.js.map +1 -1
- package/dist/core/schemas/change.schema.d.ts +16 -0
- package/dist/core/schemas/change.schema.d.ts.map +1 -1
- package/dist/core/schemas/change.schema.js +41 -10
- package/dist/core/schemas/change.schema.js.map +1 -1
- package/dist/core/schemas/spec.schema.d.ts +2 -0
- package/dist/core/schemas/spec.schema.d.ts.map +1 -1
- package/dist/core/shared/index.d.ts +3 -8
- package/dist/core/shared/index.d.ts.map +1 -1
- package/dist/core/shared/index.js +3 -8
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/rules-generation.d.ts +27 -8
- package/dist/core/shared/rules-generation.d.ts.map +1 -1
- package/dist/core/shared/rules-generation.js +151 -16
- package/dist/core/shared/rules-generation.js.map +1 -1
- package/dist/core/shared/skill-generation.d.ts +38 -53
- package/dist/core/shared/skill-generation.d.ts.map +1 -1
- package/dist/core/shared/skill-generation.js +82 -51
- package/dist/core/shared/skill-generation.js.map +1 -1
- package/dist/core/shared/tool-detection.d.ts +40 -62
- package/dist/core/shared/tool-detection.d.ts.map +1 -1
- package/dist/core/shared/tool-detection.js +88 -80
- package/dist/core/shared/tool-detection.js.map +1 -1
- package/dist/core/skill-metrics.d.ts +36 -63
- package/dist/core/skill-metrics.d.ts.map +1 -1
- package/dist/core/skill-metrics.js +34 -73
- package/dist/core/skill-metrics.js.map +1 -1
- package/dist/core/spec-presenter.d.ts.map +1 -1
- package/dist/core/spec-presenter.js +6 -6
- package/dist/core/spec-presenter.js.map +1 -1
- package/dist/core/specs-apply.d.ts +24 -23
- package/dist/core/specs-apply.d.ts.map +1 -1
- package/dist/core/specs-apply.js +188 -173
- package/dist/core/specs-apply.js.map +1 -1
- package/dist/core/templates/fragments/interview.d.ts +2 -6
- package/dist/core/templates/fragments/interview.d.ts.map +1 -1
- package/dist/core/templates/fragments/interview.js +2 -6
- package/dist/core/templates/fragments/interview.js.map +1 -1
- package/dist/core/templates/fragments/next-step.d.ts +4 -8
- package/dist/core/templates/fragments/next-step.d.ts.map +1 -1
- package/dist/core/templates/fragments/next-step.js +4 -8
- package/dist/core/templates/fragments/next-step.js.map +1 -1
- package/dist/core/templates/fragments/verify.d.ts +9 -12
- package/dist/core/templates/fragments/verify.d.ts.map +1 -1
- package/dist/core/templates/fragments/verify.js +9 -12
- package/dist/core/templates/fragments/verify.js.map +1 -1
- package/dist/core/templates/index.d.ts +0 -6
- package/dist/core/templates/index.d.ts.map +1 -1
- package/dist/core/templates/index.js +0 -7
- package/dist/core/templates/index.js.map +1 -1
- package/dist/core/templates/skill-templates.d.ts +1 -5
- package/dist/core/templates/skill-templates.d.ts.map +1 -1
- package/dist/core/templates/skill-templates.js +0 -5
- package/dist/core/templates/skill-templates.js.map +1 -1
- package/dist/core/templates/types.d.ts +3 -7
- package/dist/core/templates/types.d.ts.map +1 -1
- package/dist/core/templates/types.js +0 -3
- package/dist/core/templates/types.js.map +1 -1
- package/dist/core/templates/workflows/apply.d.ts +3 -9
- package/dist/core/templates/workflows/apply.d.ts.map +1 -1
- package/dist/core/templates/workflows/apply.js +9 -12
- package/dist/core/templates/workflows/apply.js.map +1 -1
- package/dist/core/templates/workflows/archive.d.ts +0 -6
- package/dist/core/templates/workflows/archive.d.ts.map +1 -1
- package/dist/core/templates/workflows/archive.js +7 -5
- package/dist/core/templates/workflows/archive.js.map +1 -1
- package/dist/core/templates/workflows/decision.js +4 -4
- package/dist/core/templates/workflows/decision.js.map +1 -1
- package/dist/core/templates/workflows/explore.js +1 -1
- package/dist/core/templates/workflows/grill.d.ts.map +1 -1
- package/dist/core/templates/workflows/grill.js +0 -2
- package/dist/core/templates/workflows/grill.js.map +1 -1
- package/dist/core/templates/workflows/issue.d.ts +0 -6
- package/dist/core/templates/workflows/issue.d.ts.map +1 -1
- package/dist/core/templates/workflows/issue.js +3 -0
- package/dist/core/templates/workflows/issue.js.map +1 -1
- package/dist/core/templates/workflows/propose.d.ts +0 -6
- package/dist/core/templates/workflows/propose.d.ts.map +1 -1
- package/dist/core/templates/workflows/propose.js +0 -1
- package/dist/core/templates/workflows/propose.js.map +1 -1
- package/dist/core/templates/workflows/sync.d.ts +2 -8
- package/dist/core/templates/workflows/sync.d.ts.map +1 -1
- package/dist/core/templates/workflows/sync.js +2 -2
- package/dist/core/templates/workflows/sync.js.map +1 -1
- package/dist/core/templates/workflows/update.d.ts +0 -6
- package/dist/core/templates/workflows/update.d.ts.map +1 -1
- package/dist/core/templates/workflows/update.js.map +1 -1
- package/dist/core/update.d.ts +26 -21
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +165 -116
- package/dist/core/update.js.map +1 -1
- package/dist/core/user-state-migration.d.ts +13 -15
- package/dist/core/user-state-migration.d.ts.map +1 -1
- package/dist/core/user-state-migration.js +16 -20
- package/dist/core/user-state-migration.js.map +1 -1
- package/dist/core/validation/constants.d.ts +19 -25
- package/dist/core/validation/constants.d.ts.map +1 -1
- package/dist/core/validation/constants.js +25 -20
- package/dist/core/validation/constants.js.map +1 -1
- package/dist/core/validation/prose-length.d.ts +15 -0
- package/dist/core/validation/prose-length.d.ts.map +1 -0
- package/dist/core/validation/prose-length.js +29 -0
- package/dist/core/validation/prose-length.js.map +1 -0
- package/dist/core/validation/purpose-placeholder.d.ts +9 -16
- package/dist/core/validation/purpose-placeholder.d.ts.map +1 -1
- package/dist/core/validation/purpose-placeholder.js +30 -44
- package/dist/core/validation/purpose-placeholder.js.map +1 -1
- package/dist/core/validation/section-validator.d.ts +4 -4
- package/dist/core/validation/section-validator.d.ts.map +1 -1
- package/dist/core/validation/section-validator.js +43 -7
- package/dist/core/validation/section-validator.js.map +1 -1
- package/dist/core/validation/task-numbering.d.ts +6 -3
- package/dist/core/validation/task-numbering.d.ts.map +1 -1
- package/dist/core/validation/task-numbering.js +23 -11
- package/dist/core/validation/task-numbering.js.map +1 -1
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.d.ts.map +1 -1
- package/dist/core/validation/types.js +12 -1
- package/dist/core/validation/types.js.map +1 -1
- package/dist/core/validation/validator.d.ts +50 -51
- package/dist/core/validation/validator.d.ts.map +1 -1
- package/dist/core/validation/validator.js +486 -263
- package/dist/core/validation/validator.js.map +1 -1
- package/dist/prompts/searchable-multi-select.d.ts +3 -8
- package/dist/prompts/searchable-multi-select.d.ts.map +1 -1
- package/dist/prompts/searchable-multi-select.js +16 -39
- package/dist/prompts/searchable-multi-select.js.map +1 -1
- package/dist/utils/change-metadata.d.ts +11 -50
- package/dist/utils/change-metadata.d.ts.map +1 -1
- package/dist/utils/change-metadata.js +48 -67
- package/dist/utils/change-metadata.js.map +1 -1
- package/dist/utils/change-utils.d.ts +31 -54
- package/dist/utils/change-utils.d.ts.map +1 -1
- package/dist/utils/change-utils.js +143 -100
- package/dist/utils/change-utils.js.map +1 -1
- package/dist/utils/file-lock.d.ts +39 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +149 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/file-system.d.ts +12 -32
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +16 -40
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +7 -11
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +11 -11
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/interactive.d.ts +4 -9
- package/dist/utils/interactive.d.ts.map +1 -1
- package/dist/utils/interactive.js +2 -4
- package/dist/utils/interactive.js.map +1 -1
- package/dist/utils/item-discovery.d.ts +15 -10
- package/dist/utils/item-discovery.d.ts.map +1 -1
- package/dist/utils/item-discovery.js +42 -47
- package/dist/utils/item-discovery.js.map +1 -1
- package/dist/utils/link.d.ts +13 -4
- package/dist/utils/link.d.ts.map +1 -1
- package/dist/utils/link.js +13 -4
- package/dist/utils/link.js.map +1 -1
- package/dist/utils/match.js.map +1 -1
- package/dist/utils/requirement-diff.d.ts +13 -23
- package/dist/utils/requirement-diff.d.ts.map +1 -1
- package/dist/utils/requirement-diff.js +13 -23
- package/dist/utils/requirement-diff.js.map +1 -1
- package/dist/utils/spec-files.d.ts +10 -11
- package/dist/utils/spec-files.d.ts.map +1 -1
- package/dist/utils/spec-files.js +31 -22
- package/dist/utils/spec-files.js.map +1 -1
- package/dist/utils/task-progress.d.ts +11 -9
- package/dist/utils/task-progress.d.ts.map +1 -1
- package/dist/utils/task-progress.js +53 -32
- package/dist/utils/task-progress.js.map +1 -1
- package/dist/utils/timestamp.d.ts +5 -8
- package/dist/utils/timestamp.d.ts.map +1 -1
- package/dist/utils/timestamp.js +5 -8
- package/dist/utils/timestamp.js.map +1 -1
- package/package.json +9 -10
- package/schemas/decision/templates/decision.md +3 -1
- package/schemas/decision/templates/index.md +2 -2
- package/schemas/issue/schema.yaml +11 -2
- package/schemas/issue/templates/spec.md +37 -3
- package/schemas/sdd/schema.yaml +24 -1
- package/schemas/sdd/templates/spec.md +37 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MarkdownParser } from './markdown-parser.js';
|
|
2
|
-
import { parseDeltaSpec } from './requirement-blocks.js';
|
|
2
|
+
import { foldRequirementName, parseDeltaSpec } from './requirement-blocks.js';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { promises as fs } from 'fs';
|
|
5
5
|
export class ChangeParser extends MarkdownParser {
|
|
@@ -18,12 +18,9 @@ export class ChangeParser extends MarkdownParser {
|
|
|
18
18
|
if (!whatChanges) {
|
|
19
19
|
throw new Error('Change must have a What Changes section');
|
|
20
20
|
}
|
|
21
|
-
// Parse deltas from the What Changes section (simple format)
|
|
22
21
|
const simpleDeltas = this.parseDeltas(whatChanges);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const deltaDeltas = await this.parseDeltaSpecs(specsDir);
|
|
26
|
-
// Combine both types of deltas, preferring delta format if available
|
|
22
|
+
const deltaDeltas = await this.parseDeltaSpecs(path.join(this.changeDir, 'specs'));
|
|
23
|
+
// Delta spec files win over the What Changes prose whenever any exist.
|
|
27
24
|
const deltas = deltaDeltas.length > 0 ? deltaDeltas : simpleDeltas;
|
|
28
25
|
return {
|
|
29
26
|
name,
|
|
@@ -37,10 +34,9 @@ export class ChangeParser extends MarkdownParser {
|
|
|
37
34
|
};
|
|
38
35
|
}
|
|
39
36
|
/**
|
|
40
|
-
* Scans `specs/<capability>/spec.md`
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* proposal.md, so this is the primary delta source for both schemas.
|
|
37
|
+
* Scans `specs/<capability>/spec.md` directly, independent of a proposal.md's
|
|
38
|
+
* prose: deltas live in specs/ for both schemas, so this is the primary
|
|
39
|
+
* source.
|
|
44
40
|
*/
|
|
45
41
|
async parseDeltaSpecs(specsDir) {
|
|
46
42
|
const deltas = [];
|
|
@@ -53,58 +49,58 @@ export class ChangeParser extends MarkdownParser {
|
|
|
53
49
|
const specFile = path.join(specsDir, specName, 'spec.md');
|
|
54
50
|
try {
|
|
55
51
|
const content = await fs.readFile(specFile, 'utf-8');
|
|
56
|
-
|
|
57
|
-
deltas.push(...specDeltas);
|
|
52
|
+
deltas.push(...this.parseSpecDeltas(specName, content));
|
|
58
53
|
}
|
|
59
|
-
catch
|
|
60
|
-
//
|
|
61
|
-
continue;
|
|
54
|
+
catch {
|
|
55
|
+
continue; // a capability folder without a spec.md is fine
|
|
62
56
|
}
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
|
-
catch
|
|
66
|
-
|
|
67
|
-
return [];
|
|
59
|
+
catch {
|
|
60
|
+
return []; // no specs/ directory
|
|
68
61
|
}
|
|
69
62
|
return deltas;
|
|
70
63
|
}
|
|
71
64
|
parseSpecDeltas(specName, content) {
|
|
72
65
|
const deltas = [];
|
|
73
66
|
const sections = this.parseSectionsFromContent(content);
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
// Parse MODIFIED requirements
|
|
90
|
-
const modifiedSection = this.findSection(sections, 'MODIFIED Requirements');
|
|
91
|
-
if (modifiedSection) {
|
|
92
|
-
const requirements = this.parseRequirements(modifiedSection);
|
|
93
|
-
requirements.forEach(req => {
|
|
67
|
+
// The delta-grammar parser validation uses. REMOVED and RENAMED entries are
|
|
68
|
+
// read from it because both are written as bullets, which the Markdown
|
|
69
|
+
// section walker below does not model.
|
|
70
|
+
const plan = parseDeltaSpec(content);
|
|
71
|
+
for (const [operation, verb] of [
|
|
72
|
+
['ADDED', 'Add'],
|
|
73
|
+
['MODIFIED', 'Modify'],
|
|
74
|
+
]) {
|
|
75
|
+
const section = this.findSection(sections, `${operation} Requirements`);
|
|
76
|
+
if (!section)
|
|
77
|
+
continue;
|
|
78
|
+
for (const req of this.parseRequirements(section)) {
|
|
94
79
|
deltas.push({
|
|
95
80
|
spec: specName,
|
|
96
|
-
operation:
|
|
97
|
-
description:
|
|
81
|
+
operation: operation,
|
|
82
|
+
description: `${verb} requirement: ${req.text}`,
|
|
83
|
+
// Both the singular and plural spellings.
|
|
98
84
|
requirement: req,
|
|
99
85
|
requirements: [req],
|
|
100
86
|
});
|
|
101
|
-
}
|
|
87
|
+
}
|
|
102
88
|
}
|
|
103
|
-
//
|
|
89
|
+
// The canonical REMOVED form is a bullet list of names with
|
|
90
|
+
// Reason/Migration fields, carrying no `### Requirement:` header for the
|
|
91
|
+
// section walker to find, so `parseRequirements` reports no REMOVED delta
|
|
92
|
+
// at all. `plan.removedEntries` accepts both forms.
|
|
104
93
|
const removedSection = this.findSection(sections, 'REMOVED Requirements');
|
|
105
94
|
if (removedSection) {
|
|
106
|
-
|
|
107
|
-
|
|
95
|
+
// The header form also carries body text and scenarios; keep them rather
|
|
96
|
+
// than degrade to a bare name.
|
|
97
|
+
const blocks = new Map(this.parseRequirements(removedSection).map((req) => [foldRequirementName(req.name ?? req.text), req]));
|
|
98
|
+
plan.removedEntries.forEach((entry) => {
|
|
99
|
+
const req = blocks.get(foldRequirementName(entry.name)) ?? {
|
|
100
|
+
name: entry.name,
|
|
101
|
+
text: entry.name,
|
|
102
|
+
scenarios: [],
|
|
103
|
+
};
|
|
108
104
|
deltas.push({
|
|
109
105
|
spec: specName,
|
|
110
106
|
operation: 'REMOVED',
|
|
@@ -114,12 +110,10 @@ export class ChangeParser extends MarkdownParser {
|
|
|
114
110
|
});
|
|
115
111
|
});
|
|
116
112
|
}
|
|
117
|
-
//
|
|
118
|
-
// (requirement-blocks.ts), the same parser validation uses.
|
|
113
|
+
// Pairing logic lives in parseDeltaSpec, the same parser validation uses.
|
|
119
114
|
const renamedSection = this.findSection(sections, 'RENAMED Requirements');
|
|
120
115
|
if (renamedSection) {
|
|
121
|
-
|
|
122
|
-
renames.forEach(rename => {
|
|
116
|
+
plan.renamed.forEach(rename => {
|
|
123
117
|
deltas.push({
|
|
124
118
|
spec: specName,
|
|
125
119
|
operation: 'RENAMED',
|
|
@@ -131,12 +125,10 @@ export class ChangeParser extends MarkdownParser {
|
|
|
131
125
|
return deltas;
|
|
132
126
|
}
|
|
133
127
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
* does not exist (phantom delta in `show <change> --json`). Overriding here
|
|
139
|
-
* rather than in MarkdownParser keeps main spec parsing untouched.
|
|
128
|
+
* Ignores headers that are not `### Requirement: <name>`. A delta section
|
|
129
|
+
* often carries divider headers such as `### Documentation Requirements`, and
|
|
130
|
+
* the base parser treats every child header as a requirement. Overridden here
|
|
131
|
+
* rather than in MarkdownParser so main spec parsing is untouched.
|
|
140
132
|
*/
|
|
141
133
|
parseRequirements(section) {
|
|
142
134
|
return super.parseRequirements({
|
|
@@ -144,8 +136,8 @@ export class ChangeParser extends MarkdownParser {
|
|
|
144
136
|
children: section.children.filter((child) => /^Requirement:\s*\S/i.test(child.title.trim())),
|
|
145
137
|
});
|
|
146
138
|
}
|
|
147
|
-
//
|
|
148
|
-
//
|
|
139
|
+
// Delegates to MarkdownParser rather than a second section walker: the two
|
|
140
|
+
// had byte-identical logic and drifted.
|
|
149
141
|
parseSectionsFromContent(content) {
|
|
150
142
|
return new MarkdownParser(content).getSections();
|
|
151
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/change-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"change-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/change-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,9 +13,9 @@ export declare class MarkdownParser {
|
|
|
13
13
|
parseSpec(name: string): Spec;
|
|
14
14
|
parseChange(name: string): Change;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
16
|
+
* The heading tree (code-fenced headings excluded), for callers that inspect
|
|
17
|
+
* structure without the Spec/Change grammar — schema-declared
|
|
18
|
+
* `requiredSections` validation, for one.
|
|
19
19
|
*/
|
|
20
20
|
getSections(): Section[];
|
|
21
21
|
protected parseSections(): Section[];
|
|
@@ -26,14 +26,13 @@ export declare class MarkdownParser {
|
|
|
26
26
|
protected parseDeltas(content: string): Delta[];
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* `## Requirements` section.
|
|
29
|
+
* A section by title anywhere in the heading tree, case-insensitively. `level`
|
|
30
|
+
* requires a specific heading depth, which keeps a nested `### Requirements`
|
|
31
|
+
* from standing in for the real `## Requirements` section.
|
|
33
32
|
*
|
|
34
33
|
* The one matcher: schema-declared `requiredSections`, the spec/change parser
|
|
35
|
-
* and the decision reader all consume
|
|
36
|
-
*
|
|
34
|
+
* and the decision reader all consume `getSections()` trees and must agree on
|
|
35
|
+
* what counts as a match.
|
|
37
36
|
*/
|
|
38
37
|
export declare function findSection(sections: Section[], title: string, level?: number): Section | undefined;
|
|
39
38
|
//# sourceMappingURL=markdown-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAkB,MAAM,qBAAqB,CAAC;AAGjG,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"markdown-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAkB,MAAM,qBAAqB,CAAC;AAGjG,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAkBD,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,iBAAiB,CAAY;IAErC,YAAY,OAAO,EAAE,MAAM,EAI1B;IAED,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA2B5B;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyBhC;IAED;;;;OAIG;IACH,WAAW,IAAI,OAAO,EAAE,CAEvB;IAED,SAAS,CAAC,aAAa,IAAI,OAAO,EAAE,CAsCnC;IAED,SAAS,CAAC,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAenF;IAED,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE7F;IAED,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAY3D;IAED,SAAS,CAAC,cAAc,CAAC,kBAAkB,EAAE,OAAO,GAAG,QAAQ,EAAE,CAkBhE;IAGD,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CAiC9C;CACF;AAGD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,GAAG,SAAS,CAerB"}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { buildCodeFenceMask, extractRequirementText, normalizeDocument } from './requirement-text.js';
|
|
2
|
+
const HEADER_LABEL_REGEX = {
|
|
3
|
+
Requirement: /^Requirement:\s*(.*)$/i,
|
|
4
|
+
Scenario: /^Scenario:\s*(.*)$/i,
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* `Requirement: Sign out` → `Sign out`. Falls back to the trimmed title when
|
|
8
|
+
* the label is absent, so a section that reached here without the canonical
|
|
9
|
+
* prefix still reports a name rather than an empty string.
|
|
10
|
+
*/
|
|
11
|
+
function stripHeaderLabel(title, label) {
|
|
12
|
+
const trimmed = title.trim();
|
|
13
|
+
const match = HEADER_LABEL_REGEX[label].exec(trimmed);
|
|
14
|
+
return (match?.[1] ?? trimmed).trim();
|
|
15
|
+
}
|
|
2
16
|
export class MarkdownParser {
|
|
3
17
|
lines;
|
|
4
18
|
codeFenceLineMask;
|
|
@@ -56,9 +70,9 @@ export class MarkdownParser {
|
|
|
56
70
|
};
|
|
57
71
|
}
|
|
58
72
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
73
|
+
* The heading tree (code-fenced headings excluded), for callers that inspect
|
|
74
|
+
* structure without the Spec/Change grammar — schema-declared
|
|
75
|
+
* `requiredSections` validation, for one.
|
|
62
76
|
*/
|
|
63
77
|
getSections() {
|
|
64
78
|
return this.parseSections();
|
|
@@ -114,13 +128,10 @@ export class MarkdownParser {
|
|
|
114
128
|
parseRequirements(section) {
|
|
115
129
|
const requirements = [];
|
|
116
130
|
for (const child of section.children) {
|
|
117
|
-
// Read the requirement text via the shared reader (multi-line, fence- and
|
|
118
|
-
// metadata-aware, with the shared header-title fallback for empty bodies).
|
|
119
|
-
const text = extractRequirementText(child.title, child.content.split('\n'));
|
|
120
|
-
const scenarios = this.parseScenarios(child);
|
|
121
131
|
requirements.push({
|
|
122
|
-
|
|
123
|
-
|
|
132
|
+
name: stripHeaderLabel(child.title, 'Requirement'),
|
|
133
|
+
text: extractRequirementText(child.title, child.content.split('\n')),
|
|
134
|
+
scenarios: this.parseScenarios(child),
|
|
124
135
|
});
|
|
125
136
|
}
|
|
126
137
|
return requirements;
|
|
@@ -128,15 +139,14 @@ export class MarkdownParser {
|
|
|
128
139
|
parseScenarios(requirementSection) {
|
|
129
140
|
const scenarios = [];
|
|
130
141
|
for (const scenarioSection of requirementSection.children) {
|
|
131
|
-
// Only `#### Scenario:` children
|
|
132
|
-
//
|
|
133
|
-
// SCENARIO_HEADER in requirement-text.ts).
|
|
142
|
+
// Only `#### Scenario:` children count, matching the delta path's
|
|
143
|
+
// SCENARIO_HEADER.
|
|
134
144
|
if (!/^Scenario:/i.test(scenarioSection.title.trim())) {
|
|
135
145
|
continue;
|
|
136
146
|
}
|
|
137
|
-
// Store the raw text content of the scenario section
|
|
138
147
|
if (scenarioSection.content.trim()) {
|
|
139
148
|
scenarios.push({
|
|
149
|
+
name: stripHeaderLabel(scenarioSection.title, 'Scenario'),
|
|
140
150
|
rawText: scenarioSection.content
|
|
141
151
|
});
|
|
142
152
|
}
|
|
@@ -147,15 +157,15 @@ export class MarkdownParser {
|
|
|
147
157
|
const deltas = [];
|
|
148
158
|
const lines = content.split('\n');
|
|
149
159
|
for (const line of lines) {
|
|
150
|
-
//
|
|
160
|
+
// Both spellings: **spec:** and **spec**:
|
|
151
161
|
const deltaMatch = line.match(/^\s*-\s*\*\*([^*:]+)(?::\*\*|\*\*:)\s*(.+)$/);
|
|
152
162
|
if (deltaMatch) {
|
|
153
163
|
const specName = deltaMatch[1].trim();
|
|
154
164
|
const description = deltaMatch[2].trim();
|
|
155
165
|
let operation = 'MODIFIED';
|
|
156
166
|
const lowerDesc = description.toLowerCase();
|
|
157
|
-
//
|
|
158
|
-
//
|
|
167
|
+
// Word boundaries so "address" does not match "add"; RENAMED first
|
|
168
|
+
// because it is more specific than the patterns containing "new".
|
|
159
169
|
if (/\brename(s|d|ing)?\b/.test(lowerDesc) || /\brenamed\s+(to|from)\b/.test(lowerDesc)) {
|
|
160
170
|
operation = 'RENAMED';
|
|
161
171
|
}
|
|
@@ -176,14 +186,13 @@ export class MarkdownParser {
|
|
|
176
186
|
}
|
|
177
187
|
}
|
|
178
188
|
/**
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* `## Requirements` section.
|
|
189
|
+
* A section by title anywhere in the heading tree, case-insensitively. `level`
|
|
190
|
+
* requires a specific heading depth, which keeps a nested `### Requirements`
|
|
191
|
+
* from standing in for the real `## Requirements` section.
|
|
183
192
|
*
|
|
184
193
|
* The one matcher: schema-declared `requiredSections`, the spec/change parser
|
|
185
|
-
* and the decision reader all consume
|
|
186
|
-
*
|
|
194
|
+
* and the decision reader all consume `getSections()` trees and must agree on
|
|
195
|
+
* what counts as a match.
|
|
187
196
|
*/
|
|
188
197
|
export function findSection(sections, title, level) {
|
|
189
198
|
const target = title.trim().toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,36 @@
|
|
|
1
1
|
export interface RequirementBlock {
|
|
2
|
+
/** e.g. '### Requirement: Something'. */
|
|
2
3
|
headerLine: string;
|
|
3
4
|
name: string;
|
|
5
|
+
/** The whole block, headerLine included. */
|
|
4
6
|
raw: string;
|
|
5
7
|
/** 1-based line number of headerLine in the source document. */
|
|
6
8
|
startLine: number;
|
|
7
9
|
}
|
|
8
10
|
export interface RequirementsSectionParts {
|
|
9
11
|
before: string;
|
|
12
|
+
/** The '## Requirements' line. */
|
|
10
13
|
headerLine: string;
|
|
14
|
+
/** Content between headerLine and the first requirement block. */
|
|
11
15
|
preamble: string;
|
|
12
16
|
bodyBlocks: RequirementBlock[];
|
|
13
17
|
after: string;
|
|
14
18
|
}
|
|
15
19
|
export declare function normalizeRequirementName(name: string): string;
|
|
16
20
|
/**
|
|
17
|
-
* Case- and whitespace-insensitive fold
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* only in case or interior whitespace mean a mistake, never two requirements.
|
|
21
|
+
* Case- and whitespace-insensitive fold, for typo detection only: two spellings
|
|
22
|
+
* differing only in case or interior whitespace mean a mistake, never two
|
|
23
|
+
* requirements. Requirement matching itself stays case-sensitive
|
|
24
|
+
* (normalizeRequirementName).
|
|
22
25
|
*/
|
|
23
26
|
export declare function foldRequirementName(name: string): string;
|
|
24
27
|
/**
|
|
25
|
-
*
|
|
28
|
+
* The one spelling of a requirement header, shared with the main-spec structure
|
|
29
|
+
* guard and the merge. `\s*` on purpose: `###Requirement:` is accepted here (see
|
|
30
|
+
* the no-space regressions in requirement-blocks.test.ts), so a guard using a
|
|
31
|
+
* stricter `\s+` let a duplicate slip past and the merge's Map collapsed it.
|
|
26
32
|
*/
|
|
33
|
+
export declare const REQUIREMENT_HEADER_REGEX: RegExp;
|
|
27
34
|
export declare function extractRequirementsSection(content: string): RequirementsSectionParts;
|
|
28
35
|
export interface RemovedEntry {
|
|
29
36
|
name: string;
|
|
@@ -32,39 +39,74 @@ export interface RemovedEntry {
|
|
|
32
39
|
hasReason: boolean;
|
|
33
40
|
hasMigration: boolean;
|
|
34
41
|
}
|
|
42
|
+
/** One declared scenario removal from the `## REMOVED Scenarios` section. */
|
|
43
|
+
export interface RemovedScenarioEntry {
|
|
44
|
+
/** Requirement the scenario is being removed from, normalized. */
|
|
45
|
+
requirement: string;
|
|
46
|
+
/** Scenario name, as authored — it is matched against spec headers verbatim. */
|
|
47
|
+
scenario: string;
|
|
48
|
+
/** 1-based line number of the entry's first line in the source document. */
|
|
49
|
+
startLine: number;
|
|
50
|
+
hasReason: boolean;
|
|
51
|
+
}
|
|
35
52
|
export interface RenamedIssue {
|
|
36
53
|
kind: 'from-without-to' | 'to-without-from';
|
|
37
54
|
name: string;
|
|
38
55
|
/** 1-based line number of the orphaned FROM:/TO: line. */
|
|
39
56
|
line: number;
|
|
40
57
|
}
|
|
58
|
+
/** A delta section header that appears more than once in one file. */
|
|
59
|
+
export interface DuplicateSection {
|
|
60
|
+
/** The header as authored at its first occurrence, e.g. '## ADDED Requirements'. */
|
|
61
|
+
title: string;
|
|
62
|
+
/** 1-based line numbers of every occurrence, in document order. */
|
|
63
|
+
lines: number[];
|
|
64
|
+
}
|
|
41
65
|
export interface DeltaPlan {
|
|
42
66
|
added: RequirementBlock[];
|
|
43
67
|
modified: RequirementBlock[];
|
|
68
|
+
/** Requirement names. */
|
|
44
69
|
removed: string[];
|
|
45
|
-
/** REMOVED entries with per-entry Reason/Migration presence
|
|
70
|
+
/** REMOVED entries with per-entry Reason/Migration presence. */
|
|
46
71
|
removedEntries: RemovedEntry[];
|
|
47
72
|
/**
|
|
48
73
|
* Raw `### Requirement:` blocks from the REMOVED section, when the delta used
|
|
49
|
-
* the header form. Names alone drop the authored Reason/Migration text
|
|
50
|
-
*
|
|
74
|
+
* the header form. Names alone drop the authored Reason/Migration text. Empty
|
|
75
|
+
* for the bullet-list form, which has none.
|
|
51
76
|
*/
|
|
52
77
|
removedBlocks: RequirementBlock[];
|
|
78
|
+
/**
|
|
79
|
+
* Raw `### Requirement:` blocks written under the RENAMED section, for the
|
|
80
|
+
* same reason `removedBlocks` exists: the FROM:/TO: pairs say nothing about a
|
|
81
|
+
* block written there without a pair.
|
|
82
|
+
*/
|
|
83
|
+
renamedBlocks: RequirementBlock[];
|
|
53
84
|
renamed: Array<{
|
|
54
85
|
from: string;
|
|
55
86
|
to: string;
|
|
56
87
|
}>;
|
|
88
|
+
/** Scenario removals the author declared rather than performed silently. */
|
|
89
|
+
removedScenarios: RemovedScenarioEntry[];
|
|
57
90
|
/** Orphaned FROM:/TO: lines that would otherwise be silently dropped. */
|
|
58
91
|
renamedIssues: RenamedIssue[];
|
|
92
|
+
/**
|
|
93
|
+
* Delta section headers written more than once. Their content is parsed, but
|
|
94
|
+
* the validator rejects them rather than guess which the author meant.
|
|
95
|
+
*/
|
|
96
|
+
duplicateSections: DuplicateSection[];
|
|
59
97
|
sectionPresence: {
|
|
60
98
|
added: boolean;
|
|
61
99
|
modified: boolean;
|
|
62
100
|
removed: boolean;
|
|
63
101
|
renamed: boolean;
|
|
102
|
+
removedScenarios: boolean;
|
|
64
103
|
};
|
|
65
104
|
}
|
|
105
|
+
export declare function parseDeltaSpec(content: string): DeltaPlan;
|
|
66
106
|
/**
|
|
67
|
-
*
|
|
107
|
+
* Every `### Requirement:` block in a document, whichever section it sits in (or
|
|
108
|
+
* none). For a caller rebuilding a whole file rather than applying a delta: a
|
|
109
|
+
* block written outside every known section is still a requirement.
|
|
68
110
|
*/
|
|
69
|
-
export declare function
|
|
111
|
+
export declare function parseRequirementBlocks(content: string): RequirementBlock[];
|
|
70
112
|
//# sourceMappingURL=requirement-blocks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-blocks.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED
|
|
1
|
+
{"version":3,"file":"requirement-blocks.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAoC,CAAC;AAE1E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA4EpF;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,yBAAyB;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC;;;;OAIG;IACH,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,4EAA4E;IAC5E,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,yEAAyE;IACzE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B;;;OAGG;IACH,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,eAAe,EAAE;QACf,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAsCzD;AAwGD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAS1E"}
|