@seanmars/tospec 0.19.0-beta.7 → 0.20.0
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 +60 -231
- package/README.md +69 -82
- package/assets/dashboard/app.js +14 -3
- package/assets/dashboard/style.css +7 -0
- package/assets/rules/tospec/decision.md +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +227 -86
- 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 +366 -107
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +57 -99
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +224 -282
- 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 +385 -79
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/metrics.d.ts +28 -51
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +62 -93
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/shared-output.d.ts +18 -21
- package/dist/commands/shared-output.d.ts.map +1 -1
- package/dist/commands/shared-output.js +49 -23
- 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 +29 -7
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/validate.d.ts +43 -45
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +262 -129
- 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 +81 -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 +378 -235
- package/dist/core/archive.js.map +1 -1
- package/dist/core/artifact-graph/graph.d.ts +25 -42
- package/dist/core/artifact-graph/graph.d.ts.map +1 -1
- package/dist/core/artifact-graph/graph.js +45 -63
- package/dist/core/artifact-graph/graph.js.map +1 -1
- package/dist/core/artifact-graph/index.d.ts +1 -1
- package/dist/core/artifact-graph/index.d.ts.map +1 -1
- package/dist/core/artifact-graph/index.js +1 -1
- package/dist/core/artifact-graph/index.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +97 -103
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +146 -119
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/artifact-graph/outputs.d.ts +9 -23
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -1
- package/dist/core/artifact-graph/outputs.js +45 -38
- 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 +14 -15
- package/dist/core/codex-residue.d.ts.map +1 -1
- package/dist/core/codex-residue.js +18 -22
- package/dist/core/codex-residue.js.map +1 -1
- 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 +39 -26
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +36 -22
- package/dist/core/config.js.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 +62 -70
- 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 +38 -67
- package/dist/core/global-config.js.map +1 -1
- package/dist/core/init.d.ts +25 -19
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +168 -181
- 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 +41 -83
- package/dist/core/local-server.d.ts.map +1 -1
- package/dist/core/local-server.js +53 -98
- 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 +29 -14
- package/dist/core/migrate.d.ts.map +1 -1
- package/dist/core/migrate.js +184 -122
- 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 +43 -15
- package/dist/core/parsers/requirement-blocks.d.ts.map +1 -1
- package/dist/core/parsers/requirement-blocks.js +142 -70
- 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.map +1 -1
- package/dist/core/parsers/spec-structure.js +10 -6
- package/dist/core/parsers/spec-structure.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 +9 -17
- 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 +6 -1
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js +23 -2
- package/dist/core/rules.js.map +1 -1
- 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 +19 -8
- package/dist/core/shared/rules-generation.d.ts.map +1 -1
- package/dist/core/shared/rules-generation.js +117 -50
- package/dist/core/shared/rules-generation.js.map +1 -1
- package/dist/core/shared/skill-generation.d.ts +28 -43
- 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 +39 -61
- 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.js +6 -6
- package/dist/core/spec-presenter.js.map +1 -1
- package/dist/core/specs-apply.d.ts +22 -23
- package/dist/core/specs-apply.d.ts.map +1 -1
- package/dist/core/specs-apply.js +166 -193
- 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/validate.d.ts +13 -0
- package/dist/core/templates/fragments/validate.d.ts.map +1 -0
- package/dist/core/templates/fragments/validate.js +13 -0
- package/dist/core/templates/fragments/validate.js.map +1 -0
- 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 +11 -13
- 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 +19 -6
- 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 -2
- 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 +2 -2
- 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 +4 -3
- 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 +9 -2
- package/dist/core/templates/workflows/update.js.map +1 -1
- package/dist/core/update.d.ts +23 -23
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +139 -118
- 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 +4 -10
- 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 +43 -63
- package/dist/core/validation/validator.d.ts.map +1 -1
- package/dist/core/validation/validator.js +500 -267
- 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 +30 -54
- package/dist/utils/change-utils.d.ts.map +1 -1
- package/dist/utils/change-utils.js +133 -91
- 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 +9 -18
- package/dist/utils/link.d.ts.map +1 -1
- package/dist/utils/link.js +9 -18
- package/dist/utils/link.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 +7 -20
- package/dist/utils/spec-files.d.ts.map +1 -1
- package/dist/utils/spec-files.js +26 -51
- 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 +2 -3
- package/schemas/decision/templates/decision.md +3 -1
- package/schemas/decision/templates/index.md +2 -2
- package/schemas/issue/schema.yaml +8 -1
- package/schemas/issue/templates/spec.md +27 -2
- package/schemas/sdd/schema.yaml +20 -1
- package/schemas/sdd/templates/spec.md +27 -2
- /package/assets/rules/tospec/{single-sourc-of-truth.md → single-source-of-truth.md} +0 -0
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Creates a new change directory with optional description and schema in the
|
|
5
|
-
* resolved Tospec root. Initiative linking and workspace affected areas are
|
|
6
|
-
* no longer part of this command.
|
|
2
|
+
* `tospec new change` — creates a change directory with an optional description
|
|
3
|
+
* and schema in the resolved Tospec root.
|
|
7
4
|
*/
|
|
8
5
|
export interface NewChangeOptions {
|
|
9
6
|
description?: string;
|
|
@@ -15,5 +12,7 @@ export interface NewChangeOptions {
|
|
|
15
12
|
areas?: string;
|
|
16
13
|
json?: boolean;
|
|
17
14
|
}
|
|
15
|
+
/** The `--json` null-shape; shared by the commander table and both catch sites. */
|
|
16
|
+
export declare const NEW_CHANGE_FAILURE_PAYLOAD: Record<string, unknown>;
|
|
18
17
|
export declare function newChangeCommand(name: string | undefined, options: NewChangeOptions): Promise<void>;
|
|
19
18
|
//# sourceMappingURL=new-change.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-change.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"new-change.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyFD,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAgC,CAAC;AAEhG,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHzG"}
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Creates a new change directory with optional description and schema in the
|
|
5
|
-
* resolved Tospec root. Initiative linking and workspace affected areas are
|
|
6
|
-
* no longer part of this command.
|
|
2
|
+
* `tospec new change` — creates a change directory with an optional description
|
|
3
|
+
* and schema in the resolved Tospec root.
|
|
7
4
|
*/
|
|
8
5
|
import path from 'path';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
9
7
|
import { createChange, validateChangeName } from '../../utils/change-utils.js';
|
|
10
8
|
import { formatChangeLocation } from '../../core/planning-home.js';
|
|
11
9
|
import { resolveRootForCommand, RootSelectionError, toPlanningHome, toRootOutput, } from '../../core/root-selection.js';
|
|
12
|
-
import { validateSchemaExists } from './shared.js';
|
|
10
|
+
import { validateSchemaExists, assertChangeSchema } from './shared.js';
|
|
13
11
|
import { emitSuccess, emitFailure } from '../shared-output.js';
|
|
14
|
-
// -----------------------------------------------------------------------------
|
|
15
|
-
// Command Implementation
|
|
16
|
-
// -----------------------------------------------------------------------------
|
|
17
12
|
function assertRemovedOptionsAbsent(options) {
|
|
18
13
|
if (options.initiative !== undefined) {
|
|
19
14
|
throw new RootSelectionError('--initiative is no longer supported. Tospec changes are always repo-local.', 'initiative_option_removed', { target: 'change.options' });
|
|
@@ -32,18 +27,68 @@ function parseDecisionsOption(value) {
|
|
|
32
27
|
.filter(Boolean);
|
|
33
28
|
return decisions.length > 0 ? { decisions } : undefined;
|
|
34
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Refuses a `--decisions` entry that names no existing ADR. Checked at creation
|
|
32
|
+
* because nothing downstream does: validate ignores the field, and archive only
|
|
33
|
+
* follows it into the ticket's Related Decisions links, where a typo becomes a
|
|
34
|
+
* dead link.
|
|
35
|
+
*/
|
|
36
|
+
function assertDecisionsExist(projectRoot, decisions) {
|
|
37
|
+
const decisionsDir = path.join(projectRoot, 'tospec', 'decisions');
|
|
38
|
+
const missing = decisions.filter((file) => !existsSync(path.join(decisionsDir, file)));
|
|
39
|
+
if (missing.length === 0)
|
|
40
|
+
return;
|
|
41
|
+
throw new Error(`No such decision record(s) in tospec/decisions/: ${missing.join(', ')}. ` +
|
|
42
|
+
'Pass the filename as tospec decision new reported it, or run tospec decision list.');
|
|
43
|
+
}
|
|
35
44
|
function printCreatedChangeHuman(payload, root) {
|
|
36
|
-
// A relative path is only honest when the root is where the user
|
|
37
|
-
//
|
|
38
|
-
|
|
45
|
+
// A relative path is only honest when the root is where the user stands.
|
|
46
|
+
// Forward slashes on every platform: the message is read as a POSIX-style
|
|
47
|
+
// project path, and mixing `\` with the trailing `/` looked like a typo.
|
|
48
|
+
const location = toPosixPath(root.path === process.cwd()
|
|
39
49
|
? formatChangeLocation(toPlanningHome(root), payload.change.id)
|
|
40
|
-
: payload.change.path;
|
|
50
|
+
: payload.change.path);
|
|
41
51
|
console.log(`Created change '${payload.change.id}' at ${location}/`);
|
|
42
52
|
console.log(`Schema: ${payload.change.schema}`);
|
|
53
|
+
// The CLI owns the ticket's timestamped filename, so this is the only place a
|
|
54
|
+
// human learns which file to open.
|
|
55
|
+
if (payload.change.ticketPath) {
|
|
56
|
+
console.log(`Ticket: ${toDisplayPath(root, payload.change.ticketPath)}`);
|
|
57
|
+
}
|
|
43
58
|
console.log(`Next: ${`tospec status --change ${payload.change.id}`}`);
|
|
44
59
|
}
|
|
60
|
+
/** Root-relative while the user stands in the root; absolute otherwise. */
|
|
61
|
+
function toDisplayPath(root, absolutePath) {
|
|
62
|
+
return toPosixPath(root.path === process.cwd() ? path.relative(root.path, absolutePath) : absolutePath);
|
|
63
|
+
}
|
|
64
|
+
function toPosixPath(p) {
|
|
65
|
+
return p.replace(/\\/g, '/');
|
|
66
|
+
}
|
|
67
|
+
/** The `--json` null-shape; shared by the commander table and both catch sites. */
|
|
68
|
+
export const NEW_CHANGE_FAILURE_PAYLOAD = { change: null, root: null };
|
|
45
69
|
export async function newChangeCommand(name, options) {
|
|
70
|
+
// Root resolution first: validating arguments before it makes a rejected name
|
|
71
|
+
// report `root: null`, while `list --type bogus` and `templates --schema
|
|
72
|
+
// nosuch` — argument failures of the same kind — both report the root.
|
|
73
|
+
let resolvedRoot = null;
|
|
74
|
+
const failurePayload = () => ({
|
|
75
|
+
change: null,
|
|
76
|
+
root: resolvedRoot ? toRootOutput(resolvedRoot) : null,
|
|
77
|
+
});
|
|
46
78
|
try {
|
|
79
|
+
// Writes must not scaffold a tree: the implicit fallback would silently
|
|
80
|
+
// create `tospec/` in whatever directory the user happened to be in,
|
|
81
|
+
// while `list` and `status` refuse there. `tospec init` is the only
|
|
82
|
+
// command that creates a root.
|
|
83
|
+
resolvedRoot = await resolveRootForCommand(options, {
|
|
84
|
+
json: options.json,
|
|
85
|
+
allowImplicitRoot: false,
|
|
86
|
+
failurePayload: failurePayload(),
|
|
87
|
+
});
|
|
88
|
+
if (!resolvedRoot) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const root = resolvedRoot;
|
|
47
92
|
if (!name) {
|
|
48
93
|
throw new Error('Missing required argument <name>');
|
|
49
94
|
}
|
|
@@ -52,17 +97,14 @@ export async function newChangeCommand(name, options) {
|
|
|
52
97
|
throw new Error(validation.error);
|
|
53
98
|
}
|
|
54
99
|
assertRemovedOptionsAbsent(options);
|
|
55
|
-
const root = await resolveRootForCommand(options, {
|
|
56
|
-
json: options.json,
|
|
57
|
-
failurePayload: { change: null },
|
|
58
|
-
});
|
|
59
|
-
if (!root) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
100
|
const projectRoot = root.path;
|
|
63
|
-
// Validate schema if provided
|
|
64
101
|
if (options.schema) {
|
|
65
102
|
validateSchemaExists(options.schema, projectRoot);
|
|
103
|
+
assertChangeSchema(options.schema);
|
|
104
|
+
}
|
|
105
|
+
const parsedDecisions = parseDecisionsOption(options.decisions);
|
|
106
|
+
if (parsedDecisions) {
|
|
107
|
+
assertDecisionsExist(projectRoot, parsedDecisions.decisions);
|
|
66
108
|
}
|
|
67
109
|
const resolvedSchema = options.schema ?? root.defaultSchema;
|
|
68
110
|
if (!options.json) {
|
|
@@ -72,11 +114,11 @@ export async function newChangeCommand(name, options) {
|
|
|
72
114
|
schema: options.schema,
|
|
73
115
|
defaultSchema: root.defaultSchema,
|
|
74
116
|
changesDir: root.changesDir,
|
|
75
|
-
// --description fills the ticket stub's `## Summary
|
|
117
|
+
// --description fills the ticket stub's `## Summary`.
|
|
76
118
|
...(options.description ? { description: options.description } : {}),
|
|
77
119
|
metadata: {
|
|
78
120
|
...(options.goal ? { goal: options.goal } : {}),
|
|
79
|
-
...(
|
|
121
|
+
...(parsedDecisions ?? {}),
|
|
80
122
|
},
|
|
81
123
|
});
|
|
82
124
|
const payload = {
|
|
@@ -85,18 +127,41 @@ export async function newChangeCommand(name, options) {
|
|
|
85
127
|
path: result.changeDir,
|
|
86
128
|
metadataPath: path.join(result.changeDir, '.tospec.yaml'),
|
|
87
129
|
schema: result.schema,
|
|
130
|
+
// The CLI owns the ticket's timestamped filename, so reporting it is
|
|
131
|
+
// the only way a caller can open the stub it must fill in.
|
|
132
|
+
...(result.ticketPath ? { ticketPath: result.ticketPath } : {}),
|
|
88
133
|
},
|
|
89
134
|
root: toRootOutput(root),
|
|
90
135
|
};
|
|
136
|
+
// A `--description` that could not be applied is reported, never dropped.
|
|
137
|
+
const diagnostics = [];
|
|
138
|
+
if (result.ticketSummaryKept) {
|
|
139
|
+
diagnostics.push({
|
|
140
|
+
severity: 'warning',
|
|
141
|
+
code: 'ticket_summary_kept',
|
|
142
|
+
message: `--description was not applied: ticket ${path.basename(result.ticketPath ?? '')} already has a Summary. Edit it directly to change the summary.`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
if (result.ticketsUnsupported) {
|
|
146
|
+
// No ticket.md in the schema, and nothing else stores a one-line summary,
|
|
147
|
+
// so the text is gone; naming where it can live is all that remains.
|
|
148
|
+
diagnostics.push({
|
|
149
|
+
severity: 'warning',
|
|
150
|
+
code: 'ticket_unsupported',
|
|
151
|
+
message: `--description was not applied: schema '${result.schema}' ships no ticket.md, so this change has no ticket to summarize. Put the summary in the change's own artifact instead.`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
91
154
|
if (options.json) {
|
|
92
|
-
emitSuccess({ change: payload.change }, payload.root);
|
|
155
|
+
emitSuccess({ change: payload.change, ...(diagnostics.length ? { status: diagnostics } : {}) }, payload.root);
|
|
93
156
|
return;
|
|
94
157
|
}
|
|
158
|
+
for (const diagnostic of diagnostics)
|
|
159
|
+
console.error(`Warning: ${diagnostic.message}`);
|
|
95
160
|
printCreatedChangeHuman(payload, root);
|
|
96
161
|
}
|
|
97
162
|
catch (error) {
|
|
98
163
|
if (options.json) {
|
|
99
|
-
emitFailure(true,
|
|
164
|
+
emitFailure(true, failurePayload(), error, 'change_error');
|
|
100
165
|
return;
|
|
101
166
|
}
|
|
102
167
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new-change.js","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"new-change.js","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Lists available workflow schemas with descriptions.
|
|
5
|
-
*/
|
|
1
|
+
/** `tospec schemas` — the available workflow schemas, with descriptions. */
|
|
2
|
+
/** The `--json` null-shape; shared by the commander table and the catch block. */
|
|
3
|
+
export declare const SCHEMAS_FAILURE_PAYLOAD: Record<string, unknown>;
|
|
6
4
|
export interface SchemasOptions {
|
|
7
5
|
json?: boolean;
|
|
8
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAM5E,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAG3D,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D3E"}
|
|
@@ -1,26 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schemas Command
|
|
3
|
-
*
|
|
4
|
-
* Lists available workflow schemas with descriptions.
|
|
5
|
-
*/
|
|
1
|
+
/** `tospec schemas` — the available workflow schemas, with descriptions. */
|
|
6
2
|
import { listSchemasWithInfo } from '../../core/artifact-graph/index.js';
|
|
7
3
|
import { emitSuccess } from '../shared-output.js';
|
|
8
4
|
import { resolveRootForCommand, toRootOutput } from '../../core/root-selection.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
/** The `--json` null-shape; shared by the commander table and the catch block. */
|
|
6
|
+
export const SCHEMAS_FAILURE_PAYLOAD = {
|
|
7
|
+
schemas: null,
|
|
8
|
+
root: null,
|
|
9
|
+
};
|
|
12
10
|
export async function schemasCommand(options) {
|
|
13
|
-
// Same root resolution as every other command (report 4.3).
|
|
14
11
|
const root = await resolveRootForCommand(options, {
|
|
15
12
|
json: options.json,
|
|
16
|
-
failurePayload:
|
|
13
|
+
failurePayload: SCHEMAS_FAILURE_PAYLOAD,
|
|
17
14
|
});
|
|
18
15
|
if (!root) {
|
|
19
16
|
return;
|
|
20
17
|
}
|
|
21
18
|
const schemas = listSchemasWithInfo(root.path);
|
|
19
|
+
// A schema that failed to load stays in the list carrying its reason rather
|
|
20
|
+
// than vanishing: the author most likely to hit this just wrote it, and an
|
|
21
|
+
// absent row answers none of their questions. Same rule `list` applies to an
|
|
22
|
+
// unreadable change — see
|
|
23
|
+
// tospec/decisions/20260917_234821-batch-commands-degrade-per-item.md.
|
|
24
|
+
const status = schemas
|
|
25
|
+
.filter((schema) => schema.error !== undefined)
|
|
26
|
+
.map((schema) => ({
|
|
27
|
+
severity: 'error',
|
|
28
|
+
code: 'schema_unreadable',
|
|
29
|
+
message: `Schema '${schema.name}' could not be loaded: ${schema.error}`,
|
|
30
|
+
target: schema.path,
|
|
31
|
+
fix: `Fix ${schema.name}'s schema.yaml, or remove the directory.`,
|
|
32
|
+
}));
|
|
22
33
|
if (options.json) {
|
|
23
|
-
emitSuccess({ schemas }, toRootOutput(root));
|
|
34
|
+
emitSuccess({ schemas, ...(status.length ? { status } : {}) }, toRootOutput(root));
|
|
35
|
+
if (status.length)
|
|
36
|
+
process.exitCode = 1;
|
|
24
37
|
return;
|
|
25
38
|
}
|
|
26
39
|
console.log('Available schemas:');
|
|
@@ -34,9 +47,22 @@ export async function schemasCommand(options) {
|
|
|
34
47
|
sourceLabel = ' (user override)';
|
|
35
48
|
}
|
|
36
49
|
console.log(` ${schema.name}${sourceLabel}`);
|
|
50
|
+
if (schema.error !== undefined) {
|
|
51
|
+
console.log(` unreadable: ${schema.error}`);
|
|
52
|
+
console.log();
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
37
55
|
console.log(` ${schema.description}`);
|
|
38
56
|
console.log(` Artifacts: ${schema.artifacts.join(' → ')}`);
|
|
39
57
|
console.log();
|
|
40
58
|
}
|
|
59
|
+
if (status.length) {
|
|
60
|
+
for (const entry of status) {
|
|
61
|
+
console.error(`Error: ${entry.message}`);
|
|
62
|
+
if (entry.fix)
|
|
63
|
+
console.error(`Fix: ${entry.fix}`);
|
|
64
|
+
}
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
}
|
|
41
67
|
}
|
|
42
68
|
//# sourceMappingURL=schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* multiple artifact workflow commands.
|
|
6
|
-
*/
|
|
1
|
+
/** Types, constants and validation helpers shared by the workflow commands. */
|
|
2
|
+
import { DEFAULT_SCHEMA } from '../../core/schema-names.js';
|
|
3
|
+
import type { ArtifactStatusValue } from '../../core/change-status-policy.js';
|
|
4
|
+
import type { ProjectConfigDiagnostic } from '../../core/project-config.js';
|
|
7
5
|
export interface ChangeCommandStatus {
|
|
8
6
|
severity: 'error' | 'warning';
|
|
9
7
|
code: string;
|
|
@@ -12,7 +10,12 @@ export interface ChangeCommandStatus {
|
|
|
12
10
|
fix?: string;
|
|
13
11
|
}
|
|
14
12
|
export interface TaskItem {
|
|
13
|
+
/**
|
|
14
|
+
* The task's own number from the file ("1.2"), not its position in the list;
|
|
15
|
+
* the ordinal only when the file numbers nothing.
|
|
16
|
+
*/
|
|
15
17
|
id: string;
|
|
18
|
+
/** The task text with that number stripped — `id` + `description` is the line. */
|
|
16
19
|
description: string;
|
|
17
20
|
done: boolean;
|
|
18
21
|
}
|
|
@@ -28,31 +31,55 @@ export interface ApplyInstructions {
|
|
|
28
31
|
};
|
|
29
32
|
tasks: TaskItem[];
|
|
30
33
|
state: 'blocked' | 'all_done' | 'ready';
|
|
34
|
+
/** Artifacts `apply.requires` insists on that do not exist; these block. */
|
|
31
35
|
missingArtifacts?: string[];
|
|
36
|
+
/**
|
|
37
|
+
* Schema artifacts absent from the change that `apply.requires` does not
|
|
38
|
+
* insist on. The state stays `ready`, but the instruction may refer to them,
|
|
39
|
+
* so the caller is told which references have no file behind them.
|
|
40
|
+
*/
|
|
41
|
+
missingContext?: string[];
|
|
32
42
|
instruction: string;
|
|
43
|
+
/**
|
|
44
|
+
* Project context from `tospec/config.yaml`, as every artifact's instructions
|
|
45
|
+
* carry it. The apply skill makes a single `tospec instructions apply` call
|
|
46
|
+
* and treats it as the whole briefing, so what is missing here is missing for
|
|
47
|
+
* good.
|
|
48
|
+
*/
|
|
49
|
+
context?: string;
|
|
50
|
+
/** Rules configured under the `apply` key of `rules:`, if any. */
|
|
51
|
+
rules?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Problems with the project's config, in the same shape the artifact
|
|
54
|
+
* instructions report them.
|
|
55
|
+
*/
|
|
56
|
+
configWarnings?: ProjectConfigDiagnostic[];
|
|
33
57
|
}
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*/
|
|
38
|
-
export declare function getStatusIndicator(status: 'done' | 'ready' | 'blocked' | 'skipped' | 'stub'): string;
|
|
39
|
-
/**
|
|
40
|
-
* Returns the list of available change directory names under tospec/changes/.
|
|
41
|
-
* Excludes the archive directory and hidden directories.
|
|
42
|
-
*/
|
|
58
|
+
export { DEFAULT_SCHEMA };
|
|
59
|
+
export declare function getStatusIndicator(status: ArtifactStatusValue): string;
|
|
60
|
+
/** Change directory names under `tospec/changes/`, minus `archive` and dotdirs. */
|
|
43
61
|
export declare function getAvailableChanges(projectRoot: string, changesDir?: string): Promise<string[]>;
|
|
44
62
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
63
|
+
* Resolves a change name, listing what is available when it does not exist.
|
|
64
|
+
* Tests the directory rather than an artifact, so a scaffolded change (no
|
|
65
|
+
* proposal.md yet) still counts.
|
|
47
66
|
*/
|
|
48
67
|
export declare function validateChangeExists(changeName: string | undefined, projectRoot: string, changesDir?: string, hints?: {
|
|
49
68
|
newChangeHint?: string;
|
|
50
69
|
}): Promise<string>;
|
|
51
70
|
/**
|
|
52
|
-
* Validates that a schema
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @param projectRoot - Optional project root for project-local schema resolution
|
|
71
|
+
* Validates that a schema is usable, not merely present on disk. A directory
|
|
72
|
+
* check alone lets `new change --schema <name>` succeed against a schema.yaml
|
|
73
|
+
* that does not parse, leaving a change nothing can read.
|
|
56
74
|
*/
|
|
57
75
|
export declare function validateSchemaExists(schemaName: string, projectRoot?: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Refuses the decision schema for commands that operate on a change: its
|
|
78
|
+
* artifact belongs in `tospec/decisions/`, so pointed at a change it produces a
|
|
79
|
+
* directory `decision list` never sees and a `decision.md` archive never merges.
|
|
80
|
+
*
|
|
81
|
+
* `templates --schema decision` does not call this — listing that schema's
|
|
82
|
+
* templates is what `decision new` itself needs.
|
|
83
|
+
*/
|
|
84
|
+
export declare function assertChangeSchema(schemaName: string): void;
|
|
58
85
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAM/E,OAAO,EAAwB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,cAAc,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC5C;AAID,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAgBtE;AAED,mFAAmF;AACnF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,GACvD,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,EACxD,KAAK,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAWrF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAO3D"}
|
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared Types and Utilities for Artifact Workflow Commands
|
|
3
|
-
*
|
|
4
|
-
* This module contains types, constants, and validation helpers used across
|
|
5
|
-
* multiple artifact workflow commands.
|
|
6
|
-
*/
|
|
1
|
+
/** Types, constants and validation helpers shared by the workflow commands. */
|
|
7
2
|
import path from 'path';
|
|
8
3
|
import * as fs from 'fs';
|
|
9
|
-
import { getSchemaDir,
|
|
4
|
+
import { getSchemaDir, listLoadableSchemas, resolveSchema } from '../../core/artifact-graph/index.js';
|
|
10
5
|
import { validateChangeName } from '../../utils/change-utils.js';
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
export
|
|
15
|
-
// -----------------------------------------------------------------------------
|
|
16
|
-
// Utility Functions
|
|
17
|
-
// -----------------------------------------------------------------------------
|
|
18
|
-
/**
|
|
19
|
-
* Gets the status indicator for an artifact.
|
|
20
|
-
*/
|
|
6
|
+
import { DECISION_SCHEMA_NAME, DEFAULT_SCHEMA } from '../../core/schema-names.js';
|
|
7
|
+
// Defined in core/schema-names so this module and decision.ts share it without
|
|
8
|
+
// importing each other; re-exported because the workflow barrel publishes it.
|
|
9
|
+
export { DEFAULT_SCHEMA };
|
|
21
10
|
export function getStatusIndicator(status) {
|
|
22
11
|
switch (status) {
|
|
23
12
|
case 'done':
|
|
@@ -26,20 +15,19 @@ export function getStatusIndicator(status) {
|
|
|
26
15
|
return '[ ]';
|
|
27
16
|
case 'blocked':
|
|
28
17
|
return '[-]';
|
|
18
|
+
// Both mean "not written and not required" and call for the same next move,
|
|
19
|
+
// so they share a marker; the label beside it says which.
|
|
29
20
|
case 'skipped':
|
|
21
|
+
case 'optional':
|
|
30
22
|
return '[~]';
|
|
31
23
|
case 'stub':
|
|
32
24
|
return '[!]';
|
|
33
25
|
}
|
|
34
26
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Returns the list of available change directory names under tospec/changes/.
|
|
37
|
-
* Excludes the archive directory and hidden directories.
|
|
38
|
-
*/
|
|
27
|
+
/** Change directory names under `tospec/changes/`, minus `archive` and dotdirs. */
|
|
39
28
|
export async function getAvailableChanges(projectRoot, changesDir = path.join(projectRoot, 'tospec', 'changes')) {
|
|
40
|
-
const changesPath = changesDir;
|
|
41
29
|
try {
|
|
42
|
-
const entries = await fs.promises.readdir(
|
|
30
|
+
const entries = await fs.promises.readdir(changesDir, { withFileTypes: true });
|
|
43
31
|
return entries
|
|
44
32
|
.filter((e) => e.isDirectory() && e.name !== 'archive' && !e.name.startsWith('.'))
|
|
45
33
|
.map((e) => e.name);
|
|
@@ -51,11 +39,12 @@ export async function getAvailableChanges(projectRoot, changesDir = path.join(pr
|
|
|
51
39
|
}
|
|
52
40
|
}
|
|
53
41
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
42
|
+
* Resolves a change name, listing what is available when it does not exist.
|
|
43
|
+
* Tests the directory rather than an artifact, so a scaffolded change (no
|
|
44
|
+
* proposal.md yet) still counts.
|
|
56
45
|
*/
|
|
57
46
|
export async function validateChangeExists(changeName, projectRoot, changesDir = path.join(projectRoot, 'tospec', 'changes'), hints = {}) {
|
|
58
|
-
// Hints must stay pasteable:
|
|
47
|
+
// Hints must stay pasteable: a caller with a selected store passes a
|
|
59
48
|
// store-carrying hint so following it lands in the same root.
|
|
60
49
|
const newChangeHint = hints.newChangeHint ?? 'tospec new change <name>';
|
|
61
50
|
if (!changeName) {
|
|
@@ -65,12 +54,11 @@ export async function validateChangeExists(changeName, projectRoot, changesDir =
|
|
|
65
54
|
}
|
|
66
55
|
throw new Error(`Missing required option --change. Available changes:\n ${available.join('\n ')}`);
|
|
67
56
|
}
|
|
68
|
-
//
|
|
57
|
+
// Name format first: this value is about to be joined onto a directory.
|
|
69
58
|
const nameValidation = validateChangeName(changeName);
|
|
70
59
|
if (!nameValidation.valid) {
|
|
71
60
|
throw new Error(`Invalid change name '${changeName}': ${nameValidation.error}`);
|
|
72
61
|
}
|
|
73
|
-
// Check directory existence directly
|
|
74
62
|
const changePath = path.join(changesDir, changeName);
|
|
75
63
|
const exists = fs.existsSync(changePath) && fs.statSync(changePath).isDirectory();
|
|
76
64
|
if (!exists) {
|
|
@@ -83,17 +71,32 @@ export async function validateChangeExists(changeName, projectRoot, changesDir =
|
|
|
83
71
|
return changeName;
|
|
84
72
|
}
|
|
85
73
|
/**
|
|
86
|
-
* Validates that a schema
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* @param projectRoot - Optional project root for project-local schema resolution
|
|
74
|
+
* Validates that a schema is usable, not merely present on disk. A directory
|
|
75
|
+
* check alone lets `new change --schema <name>` succeed against a schema.yaml
|
|
76
|
+
* that does not parse, leaving a change nothing can read.
|
|
90
77
|
*/
|
|
91
78
|
export function validateSchemaExists(schemaName, projectRoot) {
|
|
92
79
|
const schemaDir = getSchemaDir(schemaName, projectRoot);
|
|
93
80
|
if (!schemaDir) {
|
|
94
|
-
|
|
81
|
+
// Loadable, not merely present, so the list is advice that works.
|
|
82
|
+
const availableSchemas = listLoadableSchemas(projectRoot);
|
|
95
83
|
throw new Error(`Schema '${schemaName}' not found. Available schemas:\n ${availableSchemas.join('\n ')}`);
|
|
96
84
|
}
|
|
85
|
+
resolveSchema(schemaName, projectRoot);
|
|
97
86
|
return schemaName;
|
|
98
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Refuses the decision schema for commands that operate on a change: its
|
|
90
|
+
* artifact belongs in `tospec/decisions/`, so pointed at a change it produces a
|
|
91
|
+
* directory `decision list` never sees and a `decision.md` archive never merges.
|
|
92
|
+
*
|
|
93
|
+
* `templates --schema decision` does not call this — listing that schema's
|
|
94
|
+
* templates is what `decision new` itself needs.
|
|
95
|
+
*/
|
|
96
|
+
export function assertChangeSchema(schemaName) {
|
|
97
|
+
if (schemaName === DECISION_SCHEMA_NAME) {
|
|
98
|
+
throw new Error(`Schema '${DECISION_SCHEMA_NAME}' records an architecture decision, not a change. ` +
|
|
99
|
+
'Use: tospec decision new <topic>');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
99
102
|
//# sourceMappingURL=shared.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Status Command
|
|
3
|
-
*
|
|
4
|
-
* Displays artifact completion status for a change.
|
|
5
|
-
*/
|
|
1
|
+
/** `tospec status` — artifact completion for one change, or for every change. */
|
|
6
2
|
import { type ChangeStatus } from '../../core/artifact-graph/index.js';
|
|
7
3
|
export interface StatusOptions {
|
|
8
4
|
change?: string;
|
|
@@ -13,9 +9,17 @@ export interface StatusOptions {
|
|
|
13
9
|
/**
|
|
14
10
|
* The `--all --json` failure null-shape. Root selection resolves inside this
|
|
15
11
|
* module while thrown errors are caught by the CLI wrapper, so both call sites
|
|
16
|
-
* reference this one constant
|
|
12
|
+
* reference this one constant.
|
|
17
13
|
*/
|
|
18
14
|
export declare const BATCH_STATUS_FAILURE_PAYLOAD: Record<string, unknown>;
|
|
15
|
+
/**
|
|
16
|
+
* The single-change `--json` failure null-shape. Flat payload, like
|
|
17
|
+
* `instructions` and `show`, so it nulls a key its success output really carries
|
|
18
|
+
* (`changeName`) — otherwise a caller cannot tell this envelope from an
|
|
19
|
+
* unrelated error document.
|
|
20
|
+
* decisions/20260917_155623-flat-json-payloads-null-a-real-success-key.md
|
|
21
|
+
*/
|
|
22
|
+
export declare const STATUS_FAILURE_PAYLOAD: Record<string, unknown>;
|
|
19
23
|
export declare function statusCommand(options: StatusOptions): Promise<void>;
|
|
20
24
|
export declare function printStatusText(status: ChangeStatus): void;
|
|
21
25
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/status.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/status.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAQjF,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAY5C,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AASD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAiC,CAAC;AAEnG;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAoC,CAAC;AAEhG,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IzE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAmD1D"}
|