@seanmars/tospec 0.4.2
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/LICENSE +21 -0
- package/README.md +114 -0
- package/assets/dashboard/app.js +1032 -0
- package/assets/dashboard/chart.umd.js +14 -0
- package/assets/dashboard/index.html +30 -0
- package/assets/dashboard/style.css +675 -0
- package/bin/tospec.js +5 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +330 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +486 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +40 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +385 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/shared-output.d.ts +24 -0
- package/dist/commands/shared-output.d.ts.map +1 -0
- package/dist/commands/shared-output.js +51 -0
- package/dist/commands/shared-output.js.map +1 -0
- package/dist/commands/show.d.ts +17 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +164 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/validate.d.ts +51 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +416 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/workflow/index.d.ts +17 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/commands/workflow/instructions.d.ts +35 -0
- package/dist/commands/workflow/instructions.d.ts.map +1 -0
- package/dist/commands/workflow/instructions.js +359 -0
- package/dist/commands/workflow/instructions.js.map +1 -0
- package/dist/commands/workflow/new-change.d.ts +17 -0
- package/dist/commands/workflow/new-change.d.ts.map +1 -0
- package/dist/commands/workflow/new-change.js +97 -0
- package/dist/commands/workflow/new-change.js.map +1 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.d.ts.map +1 -0
- package/dist/commands/workflow/schemas.js +33 -0
- package/dist/commands/workflow/schemas.js.map +1 -0
- package/dist/commands/workflow/shared.d.ts +63 -0
- package/dist/commands/workflow/shared.d.ts.map +1 -0
- package/dist/commands/workflow/shared.js +111 -0
- package/dist/commands/workflow/shared.js.map +1 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.d.ts.map +1 -0
- package/dist/commands/workflow/status.js +77 -0
- package/dist/commands/workflow/status.js.map +1 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.d.ts.map +1 -0
- package/dist/commands/workflow/templates.js +60 -0
- package/dist/commands/workflow/templates.js.map +1 -0
- package/dist/core/archive.d.ts +33 -0
- package/dist/core/archive.d.ts.map +1 -0
- package/dist/core/archive.js +585 -0
- package/dist/core/archive.js.map +1 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.d.ts.map +1 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/graph.js.map +1 -0
- package/dist/core/artifact-graph/index.d.ts +9 -0
- package/dist/core/artifact-graph/index.d.ts.map +1 -0
- package/dist/core/artifact-graph/index.js +14 -0
- package/dist/core/artifact-graph/index.js.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +188 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.js +243 -0
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
- package/dist/core/artifact-graph/outputs.d.ts +14 -0
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
- package/dist/core/artifact-graph/outputs.js +39 -0
- package/dist/core/artifact-graph/outputs.js.map +1 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
- package/dist/core/artifact-graph/resolver.js +257 -0
- package/dist/core/artifact-graph/resolver.js.map +1 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.d.ts.map +1 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/schema.js.map +1 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.d.ts.map +1 -0
- package/dist/core/artifact-graph/state.js +31 -0
- package/dist/core/artifact-graph/state.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +55 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -0
- package/dist/core/artifact-graph/types.js +38 -0
- package/dist/core/artifact-graph/types.js.map +1 -0
- package/dist/core/available-tools.d.ts +17 -0
- package/dist/core/available-tools.d.ts.map +1 -0
- package/dist/core/available-tools.js +43 -0
- package/dist/core/available-tools.js.map +1 -0
- package/dist/core/change-metadata/index.d.ts +2 -0
- package/dist/core/change-metadata/index.d.ts.map +1 -0
- package/dist/core/change-metadata/index.js +2 -0
- package/dist/core/change-metadata/index.js.map +1 -0
- package/dist/core/change-metadata/schema.d.ts +12 -0
- package/dist/core/change-metadata/schema.d.ts.map +1 -0
- package/dist/core/change-metadata/schema.js +15 -0
- package/dist/core/change-metadata/schema.js.map +1 -0
- package/dist/core/change-presenter.d.ts +24 -0
- package/dist/core/change-presenter.d.ts.map +1 -0
- package/dist/core/change-presenter.js +135 -0
- package/dist/core/change-presenter.js.map +1 -0
- package/dist/core/change-status-policy.d.ts +35 -0
- package/dist/core/change-status-policy.d.ts.map +1 -0
- package/dist/core/change-status-policy.js +34 -0
- package/dist/core/change-status-policy.js.map +1 -0
- package/dist/core/command-generation/adapters/claude.d.ts +14 -0
- package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/claude.js +38 -0
- package/dist/core/command-generation/adapters/claude.js.map +1 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/cursor.js +31 -0
- package/dist/core/command-generation/adapters/cursor.js.map +1 -0
- package/dist/core/command-generation/adapters/index.d.ts +8 -0
- package/dist/core/command-generation/adapters/index.d.ts.map +1 -0
- package/dist/core/command-generation/adapters/index.js +8 -0
- package/dist/core/command-generation/adapters/index.js.map +1 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.d.ts.map +1 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/generator.js.map +1 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.d.ts.map +1 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/index.js.map +1 -0
- package/dist/core/command-generation/registry.d.ts +24 -0
- package/dist/core/command-generation/registry.d.ts.map +1 -0
- package/dist/core/command-generation/registry.js +38 -0
- package/dist/core/command-generation/registry.js.map +1 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.d.ts.map +1 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/command-generation/types.js.map +1 -0
- package/dist/core/command-generation/yaml.d.ts +22 -0
- package/dist/core/command-generation/yaml.d.ts.map +1 -0
- package/dist/core/command-generation/yaml.js +38 -0
- package/dist/core/command-generation/yaml.js.map +1 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.d.ts.map +1 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-prompts.js.map +1 -0
- package/dist/core/config-schema.d.ts +87 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +239 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +14 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.d.ts.map +1 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/converters/json-converter.js.map +1 -0
- package/dist/core/dashboard-activity.d.ts +50 -0
- package/dist/core/dashboard-activity.d.ts.map +1 -0
- package/dist/core/dashboard-activity.js +147 -0
- package/dist/core/dashboard-activity.js.map +1 -0
- package/dist/core/dashboard-data.d.ts +100 -0
- package/dist/core/dashboard-data.d.ts.map +1 -0
- package/dist/core/dashboard-data.js +368 -0
- package/dist/core/dashboard-data.js.map +1 -0
- package/dist/core/global-config.d.ts +51 -0
- package/dist/core/global-config.d.ts.map +1 -0
- package/dist/core/global-config.js +124 -0
- package/dist/core/global-config.js.map +1 -0
- package/dist/core/id.d.ts +17 -0
- package/dist/core/id.d.ts.map +1 -0
- package/dist/core/id.js +30 -0
- package/dist/core/id.js.map +1 -0
- package/dist/core/init.d.ts +34 -0
- package/dist/core/init.d.ts.map +1 -0
- package/dist/core/init.js +495 -0
- package/dist/core/init.js.map +1 -0
- package/dist/core/list.d.ts +12 -0
- package/dist/core/list.d.ts.map +1 -0
- package/dist/core/list.js +192 -0
- package/dist/core/list.js.map +1 -0
- package/dist/core/migrate.d.ts +52 -0
- package/dist/core/migrate.d.ts.map +1 -0
- package/dist/core/migrate.js +300 -0
- package/dist/core/migrate.js.map +1 -0
- package/dist/core/parsers/change-parser.d.ts +19 -0
- package/dist/core/parsers/change-parser.d.ts.map +1 -0
- package/dist/core/parsers/change-parser.js +204 -0
- package/dist/core/parsers/change-parser.js.map +1 -0
- package/dist/core/parsers/markdown-parser.d.ts +29 -0
- package/dist/core/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/core/parsers/markdown-parser.js +181 -0
- package/dist/core/parsers/markdown-parser.js.map +1 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.d.ts.map +1 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/parsers/requirement-blocks.js.map +1 -0
- package/dist/core/parsers/requirement-text.d.ts +55 -0
- package/dist/core/parsers/requirement-text.d.ts.map +1 -0
- package/dist/core/parsers/requirement-text.js +136 -0
- package/dist/core/parsers/requirement-text.js.map +1 -0
- package/dist/core/parsers/spec-structure.d.ts +9 -0
- package/dist/core/parsers/spec-structure.d.ts.map +1 -0
- package/dist/core/parsers/spec-structure.js +88 -0
- package/dist/core/parsers/spec-structure.js.map +1 -0
- package/dist/core/planning-home.d.ts +16 -0
- package/dist/core/planning-home.d.ts.map +1 -0
- package/dist/core/planning-home.js +67 -0
- package/dist/core/planning-home.js.map +1 -0
- package/dist/core/profiles.d.ts +24 -0
- package/dist/core/profiles.d.ts.map +1 -0
- package/dist/core/profiles.js +27 -0
- package/dist/core/profiles.js.map +1 -0
- package/dist/core/project-config.d.ts +100 -0
- package/dist/core/project-config.d.ts.map +1 -0
- package/dist/core/project-config.js +389 -0
- package/dist/core/project-config.js.map +1 -0
- package/dist/core/references.d.ts +40 -0
- package/dist/core/references.d.ts.map +1 -0
- package/dist/core/references.js +11 -0
- package/dist/core/references.js.map +1 -0
- package/dist/core/root-selection.d.ts +57 -0
- package/dist/core/root-selection.d.ts.map +1 -0
- package/dist/core/root-selection.js +98 -0
- package/dist/core/root-selection.js.map +1 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.d.ts.map +1 -0
- package/dist/core/schemas/base.schema.js +18 -0
- package/dist/core/schemas/base.schema.js.map +1 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.d.ts.map +1 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/change.schema.js.map +1 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.d.ts.map +1 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/index.js.map +1 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.d.ts.map +1 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/schemas/spec.schema.js.map +1 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.d.ts.map +1 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/index.js.map +1 -0
- package/dist/core/shared/skill-generation.d.ts +63 -0
- package/dist/core/shared/skill-generation.d.ts.map +1 -0
- package/dist/core/shared/skill-generation.js +125 -0
- package/dist/core/shared/skill-generation.js.map +1 -0
- package/dist/core/shared/tool-detection.d.ts +96 -0
- package/dist/core/shared/tool-detection.d.ts.map +1 -0
- package/dist/core/shared/tool-detection.js +207 -0
- package/dist/core/shared/tool-detection.js.map +1 -0
- package/dist/core/spec-presenter.d.ts +17 -0
- package/dist/core/spec-presenter.d.ts.map +1 -0
- package/dist/core/spec-presenter.js +98 -0
- package/dist/core/spec-presenter.js.map +1 -0
- package/dist/core/specs-apply.d.ts +78 -0
- package/dist/core/specs-apply.d.ts.map +1 -0
- package/dist/core/specs-apply.js +429 -0
- package/dist/core/specs-apply.js.map +1 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.d.ts.map +1 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/index.js.map +1 -0
- package/dist/core/templates/skill-templates.d.ts +14 -0
- package/dist/core/templates/skill-templates.d.ts.map +1 -0
- package/dist/core/templates/skill-templates.js +13 -0
- package/dist/core/templates/skill-templates.js.map +1 -0
- package/dist/core/templates/types.d.ts +20 -0
- package/dist/core/templates/types.d.ts.map +1 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/types.js.map +1 -0
- package/dist/core/templates/workflows/apply.d.ts +10 -0
- package/dist/core/templates/workflows/apply.d.ts.map +1 -0
- package/dist/core/templates/workflows/apply.js +81 -0
- package/dist/core/templates/workflows/apply.js.map +1 -0
- package/dist/core/templates/workflows/archive.d.ts +10 -0
- package/dist/core/templates/workflows/archive.d.ts.map +1 -0
- package/dist/core/templates/workflows/archive.js +75 -0
- package/dist/core/templates/workflows/archive.js.map +1 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.d.ts.map +1 -0
- package/dist/core/templates/workflows/explore.js +75 -0
- package/dist/core/templates/workflows/explore.js.map +1 -0
- package/dist/core/templates/workflows/issue.d.ts +10 -0
- package/dist/core/templates/workflows/issue.d.ts.map +1 -0
- package/dist/core/templates/workflows/issue.js +89 -0
- package/dist/core/templates/workflows/issue.js.map +1 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.d.ts.map +1 -0
- package/dist/core/templates/workflows/propose.js +77 -0
- package/dist/core/templates/workflows/propose.js.map +1 -0
- package/dist/core/templates/workflows/sync.d.ts +14 -0
- package/dist/core/templates/workflows/sync.d.ts.map +1 -0
- package/dist/core/templates/workflows/sync.js +86 -0
- package/dist/core/templates/workflows/sync.js.map +1 -0
- package/dist/core/templates/workflows/update.d.ts +10 -0
- package/dist/core/templates/workflows/update.d.ts.map +1 -0
- package/dist/core/templates/workflows/update.js +99 -0
- package/dist/core/templates/workflows/update.js.map +1 -0
- package/dist/core/templates/workflows/verify.d.ts +9 -0
- package/dist/core/templates/workflows/verify.d.ts.map +1 -0
- package/dist/core/templates/workflows/verify.js +44 -0
- package/dist/core/templates/workflows/verify.js.map +1 -0
- package/dist/core/update.d.ts +46 -0
- package/dist/core/update.d.ts.map +1 -0
- package/dist/core/update.js +296 -0
- package/dist/core/update.js.map +1 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.d.ts.map +1 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/constants.js.map +1 -0
- package/dist/core/validation/section-validator.d.ts +19 -0
- package/dist/core/validation/section-validator.d.ts.map +1 -0
- package/dist/core/validation/section-validator.js +59 -0
- package/dist/core/validation/section-validator.js.map +1 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.d.ts.map +1 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/types.js.map +1 -0
- package/dist/core/validation/validator.d.ts +51 -0
- package/dist/core/validation/validator.d.ts.map +1 -0
- package/dist/core/validation/validator.js +469 -0
- package/dist/core/validation/validator.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/searchable-multi-select.d.ts +28 -0
- package/dist/prompts/searchable-multi-select.d.ts.map +1 -0
- package/dist/prompts/searchable-multi-select.js +158 -0
- package/dist/prompts/searchable-multi-select.js.map +1 -0
- package/dist/ui/welcome-screen.d.ts +5 -0
- package/dist/ui/welcome-screen.d.ts.map +1 -0
- package/dist/ui/welcome-screen.js +22 -0
- package/dist/ui/welcome-screen.js.map +1 -0
- package/dist/utils/change-metadata.d.ts +55 -0
- package/dist/utils/change-metadata.d.ts.map +1 -0
- package/dist/utils/change-metadata.js +141 -0
- package/dist/utils/change-metadata.js.map +1 -0
- package/dist/utils/change-utils.d.ts +73 -0
- package/dist/utils/change-utils.d.ts.map +1 -0
- package/dist/utils/change-utils.js +194 -0
- package/dist/utils/change-utils.js.map +1 -0
- package/dist/utils/command-references.d.ts +18 -0
- package/dist/utils/command-references.d.ts.map +1 -0
- package/dist/utils/command-references.js +20 -0
- package/dist/utils/command-references.js.map +1 -0
- package/dist/utils/file-system.d.ts +41 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +320 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.d.ts.map +1 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/interactive.js.map +1 -0
- package/dist/utils/item-discovery.d.ts +14 -0
- package/dist/utils/item-discovery.d.ts.map +1 -0
- package/dist/utils/item-discovery.js +104 -0
- package/dist/utils/item-discovery.js.map +1 -0
- package/dist/utils/link.d.ts +22 -0
- package/dist/utils/link.d.ts.map +1 -0
- package/dist/utils/link.js +85 -0
- package/dist/utils/link.js.map +1 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.d.ts.map +1 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/match.js.map +1 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.d.ts.map +1 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/shell-detection.js.map +1 -0
- package/dist/utils/task-progress.d.ts +32 -0
- package/dist/utils/task-progress.d.ts.map +1 -0
- package/dist/utils/task-progress.js +129 -0
- package/dist/utils/task-progress.js.map +1 -0
- package/dist/utils/timestamp.d.ts +9 -0
- package/dist/utils/timestamp.d.ts.map +1 -0
- package/dist/utils/timestamp.js +18 -0
- package/dist/utils/timestamp.js.map +1 -0
- package/package.json +55 -0
- package/schemas/issue/schema.yaml +34 -0
- package/schemas/issue/templates/spec.md +13 -0
- package/schemas/issue/templates/task.md +21 -0
- package/schemas/issue/templates/ticket.md +2 -0
- package/schemas/sdd/schema.yaml +55 -0
- package/schemas/sdd/templates/design.md +15 -0
- package/schemas/sdd/templates/proposal.md +15 -0
- package/schemas/sdd/templates/spec.md +13 -0
- package/schemas/sdd/templates/tasks.md +11 -0
- package/schemas/sdd/templates/ticket.md +2 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { getTaskProgressForChange, formatTaskStatus } from '../utils/task-progress.js';
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { MarkdownParser } from './parsers/markdown-parser.js';
|
|
7
|
+
import { readChangeMetadata } from '../utils/change-metadata.js';
|
|
8
|
+
/**
|
|
9
|
+
* Get the most recent modification time of any file in a directory (recursive).
|
|
10
|
+
* Falls back to the directory's own mtime if no files are found.
|
|
11
|
+
*/
|
|
12
|
+
async function getLastModified(dirPath) {
|
|
13
|
+
let latest = null;
|
|
14
|
+
async function walk(dir) {
|
|
15
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const fullPath = path.join(dir, entry.name);
|
|
18
|
+
if (entry.isDirectory()) {
|
|
19
|
+
await walk(fullPath);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const stat = await fs.stat(fullPath);
|
|
23
|
+
if (latest === null || stat.mtime > latest) {
|
|
24
|
+
latest = stat.mtime;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
await walk(dirPath);
|
|
30
|
+
// If no files found, use the directory's own modification time
|
|
31
|
+
if (latest === null) {
|
|
32
|
+
const dirStat = await fs.stat(dirPath);
|
|
33
|
+
return dirStat.mtime;
|
|
34
|
+
}
|
|
35
|
+
return latest;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Format a date as relative time (e.g., "2 hours ago", "3 days ago")
|
|
39
|
+
*/
|
|
40
|
+
function formatRelativeTime(date) {
|
|
41
|
+
const now = new Date();
|
|
42
|
+
const diffMs = now.getTime() - date.getTime();
|
|
43
|
+
const diffSecs = Math.floor(diffMs / 1000);
|
|
44
|
+
const diffMins = Math.floor(diffSecs / 60);
|
|
45
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
46
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
47
|
+
if (diffDays > 30) {
|
|
48
|
+
return date.toLocaleDateString();
|
|
49
|
+
}
|
|
50
|
+
else if (diffDays > 0) {
|
|
51
|
+
return `${diffDays}d ago`;
|
|
52
|
+
}
|
|
53
|
+
else if (diffHours > 0) {
|
|
54
|
+
return `${diffHours}h ago`;
|
|
55
|
+
}
|
|
56
|
+
else if (diffMins > 0) {
|
|
57
|
+
return `${diffMins}m ago`;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
return 'just now';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class ListCommand {
|
|
64
|
+
async execute(targetPath = '.', mode = 'changes', options = {}) {
|
|
65
|
+
const { sort = 'recent', json = false, root, type } = options;
|
|
66
|
+
if (mode === 'changes') {
|
|
67
|
+
const changesDir = path.join(targetPath, 'tospec', 'changes');
|
|
68
|
+
// Check if changes directory exists
|
|
69
|
+
try {
|
|
70
|
+
await fs.access(changesDir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
throw new Error("No Tospec changes directory found. Run 'tospec init' first.");
|
|
74
|
+
}
|
|
75
|
+
// Get all directories in changes (excluding archive)
|
|
76
|
+
const entries = await fs.readdir(changesDir, { withFileTypes: true });
|
|
77
|
+
const changeDirs = entries
|
|
78
|
+
.filter(entry => entry.isDirectory() && entry.name !== 'archive')
|
|
79
|
+
.map(entry => entry.name);
|
|
80
|
+
if (changeDirs.length === 0) {
|
|
81
|
+
if (json) {
|
|
82
|
+
console.log(JSON.stringify({ changes: [], ...(root ? { root } : {}) }, null, 2));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log('No active changes found.');
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Collect information about each change
|
|
90
|
+
const changes = [];
|
|
91
|
+
for (const changeDir of changeDirs) {
|
|
92
|
+
const progress = await getTaskProgressForChange(changesDir, changeDir, targetPath);
|
|
93
|
+
const changePath = path.join(changesDir, changeDir);
|
|
94
|
+
const lastModified = await getLastModified(changePath);
|
|
95
|
+
const metadata = readChangeMetadata(changePath, targetPath);
|
|
96
|
+
if (type && metadata?.type !== type) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
changes.push({
|
|
100
|
+
name: changeDir,
|
|
101
|
+
completedTasks: progress.completed,
|
|
102
|
+
totalTasks: progress.total,
|
|
103
|
+
lastModified,
|
|
104
|
+
type: metadata?.type
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Sort by preference (default: recent first)
|
|
108
|
+
if (sort === 'recent') {
|
|
109
|
+
changes.sort((a, b) => b.lastModified.getTime() - a.lastModified.getTime());
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
changes.sort((a, b) => a.name.localeCompare(b.name));
|
|
113
|
+
}
|
|
114
|
+
// JSON output for programmatic use
|
|
115
|
+
if (json) {
|
|
116
|
+
const jsonOutput = changes.map(c => ({
|
|
117
|
+
name: c.name,
|
|
118
|
+
type: c.type,
|
|
119
|
+
completedTasks: c.completedTasks,
|
|
120
|
+
totalTasks: c.totalTasks,
|
|
121
|
+
lastModified: c.lastModified.toISOString(),
|
|
122
|
+
status: c.totalTasks === 0 ? 'no-tasks' : c.completedTasks === c.totalTasks ? 'complete' : 'in-progress'
|
|
123
|
+
}));
|
|
124
|
+
console.log(JSON.stringify({ changes: jsonOutput, ...(root ? { root } : {}) }, null, 2));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// Display results
|
|
128
|
+
console.log('Changes:');
|
|
129
|
+
const padding = ' ';
|
|
130
|
+
const nameWidth = Math.max(...changes.map(c => c.name.length));
|
|
131
|
+
for (const change of changes) {
|
|
132
|
+
const paddedName = change.name.padEnd(nameWidth);
|
|
133
|
+
const status = formatTaskStatus({ total: change.totalTasks, completed: change.completedTasks });
|
|
134
|
+
const timeAgo = formatRelativeTime(change.lastModified);
|
|
135
|
+
console.log(`${padding}${paddedName} ${status.padEnd(12)} ${timeAgo}`);
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
// specs mode
|
|
140
|
+
const specsDir = path.join(targetPath, 'tospec', 'specs');
|
|
141
|
+
try {
|
|
142
|
+
await fs.access(specsDir);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
if (json) {
|
|
146
|
+
console.log(JSON.stringify({ specs: [], ...(root ? { root } : {}) }, null, 2));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log('No specs found.');
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const entries = await fs.readdir(specsDir, { withFileTypes: true });
|
|
154
|
+
const specDirs = entries.filter(e => e.isDirectory()).map(e => e.name);
|
|
155
|
+
if (specDirs.length === 0) {
|
|
156
|
+
if (json) {
|
|
157
|
+
console.log(JSON.stringify({ specs: [], ...(root ? { root } : {}) }, null, 2));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
console.log('No specs found.');
|
|
161
|
+
}
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const specs = [];
|
|
165
|
+
for (const id of specDirs) {
|
|
166
|
+
const specPath = join(specsDir, id, 'spec.md');
|
|
167
|
+
try {
|
|
168
|
+
const content = readFileSync(specPath, 'utf-8');
|
|
169
|
+
const parser = new MarkdownParser(content);
|
|
170
|
+
const spec = parser.parseSpec(id);
|
|
171
|
+
specs.push({ id, requirementCount: spec.requirements.length });
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// If spec cannot be read or parsed, include with 0 count
|
|
175
|
+
specs.push({ id, requirementCount: 0 });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
specs.sort((a, b) => a.id.localeCompare(b.id));
|
|
179
|
+
if (json) {
|
|
180
|
+
console.log(JSON.stringify({ specs, ...(root ? { root } : {}) }, null, 2));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
console.log('Specs:');
|
|
184
|
+
const padding = ' ';
|
|
185
|
+
const nameWidth = Math.max(...specs.map(s => s.id.length));
|
|
186
|
+
for (const spec of specs) {
|
|
187
|
+
const padded = spec.id.padEnd(nameWidth);
|
|
188
|
+
console.log(`${padding}${padded} requirements ${spec.requirementCount}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/core/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface MigrateOptions {
|
|
2
|
+
force?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export interface MigrateSummary {
|
|
5
|
+
specs: {
|
|
6
|
+
copied: number;
|
|
7
|
+
normalizedDelta: number;
|
|
8
|
+
normalizedHeaderless: number;
|
|
9
|
+
skippedEmpty: number;
|
|
10
|
+
};
|
|
11
|
+
changes: {
|
|
12
|
+
active: number;
|
|
13
|
+
archived: number;
|
|
14
|
+
metadataCreated: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare class MigrateError extends Error {
|
|
18
|
+
diagnostic?: {
|
|
19
|
+
fix?: string;
|
|
20
|
+
} | undefined;
|
|
21
|
+
constructor(message: string, diagnostic?: {
|
|
22
|
+
fix?: string;
|
|
23
|
+
} | undefined);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Converts an OpenSpec archive dir name (`YYYY-MM-DD-<name>`) to the tospec
|
|
27
|
+
* stamp form (`YYYYMMDD_000000-<name>`). OpenSpec only recorded the date, so
|
|
28
|
+
* the time part is zero-filled. Names without the date prefix pass through
|
|
29
|
+
* unchanged (they already parse as `<stamp>-<name>` no worse than before).
|
|
30
|
+
*/
|
|
31
|
+
export declare function convertArchiveDirName(dirName: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Rebuilds a main spec that is in delta form or headerless into the shape
|
|
34
|
+
* tospec's validator expects. Returns null when the content is already a
|
|
35
|
+
* well-formed main spec (has `## Purpose` and no top-level delta headers).
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalizeMainSpec(content: string, capabilityName: string): {
|
|
38
|
+
content: string;
|
|
39
|
+
fixed: 'delta' | 'headerless';
|
|
40
|
+
} | null;
|
|
41
|
+
export declare class MigrateCommand {
|
|
42
|
+
execute(sourceDir?: string, options?: MigrateOptions): Promise<void>;
|
|
43
|
+
/** Copies config.yaml with the schema value rewritten; creates a minimal one when absent. */
|
|
44
|
+
private migrateConfig;
|
|
45
|
+
/**
|
|
46
|
+
* Replaces `.openspec.yaml` with `.tospec.yaml` (schema rewritten to sdd)
|
|
47
|
+
* inside an already-copied change directory. Returns true when the source
|
|
48
|
+
* had no metadata file and one was created.
|
|
49
|
+
*/
|
|
50
|
+
private migrateMetadata;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,oBAAoB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAED,qBAAa,YAAa,SAAQ,KAAK;IAG5B,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;gBADpC,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,YAAA;CAKvC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GACrB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAAA;CAAE,GAAG,IAAI,CAmG3D;AASD,qBAAa,cAAc;IACnB,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAkG1E,6FAA6F;YAC/E,aAAa;IAc3B;;;;OAIG;YACW,eAAe;CAU9B"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
4
|
+
/**
|
|
5
|
+
* `tospec migrate [openspec-dir]` — one-shot conversion of an OpenSpec project
|
|
6
|
+
* layout into the tospec layout, written to `<cwd>/tospec`.
|
|
7
|
+
*
|
|
8
|
+
* Differences handled:
|
|
9
|
+
* - config.yaml / change metadata: `schema: spec-driven` → `schema: sdd`,
|
|
10
|
+
* metadata filename `.openspec.yaml` → `.tospec.yaml`.
|
|
11
|
+
* - archive dir names: `YYYY-MM-DD-<name>` → `YYYYMMDD_000000-<name>`
|
|
12
|
+
* (tospec splits stamp/name on the first hyphen, so the OpenSpec date
|
|
13
|
+
* prefix would parse wrong if left as-is).
|
|
14
|
+
* - main specs OpenSpec left in delta form (`## ADDED Requirements` at top
|
|
15
|
+
* level) or headerless (bare `### Requirement:` list) are rebuilt into the
|
|
16
|
+
* `# <name> Specification / ## Purpose / ## Requirements` shape tospec
|
|
17
|
+
* validates. MODIFIED blocks are kept (they carry the full updated text),
|
|
18
|
+
* REMOVED/RENAMED blocks are dropped.
|
|
19
|
+
*
|
|
20
|
+
* The source directory is never modified.
|
|
21
|
+
*/
|
|
22
|
+
const METADATA_SOURCE = '.openspec.yaml';
|
|
23
|
+
const METADATA_TARGET = '.tospec.yaml';
|
|
24
|
+
const TARGET_SCHEMA = 'sdd';
|
|
25
|
+
const PURPOSE_STUB = 'TBD - migrated from OpenSpec; refine this purpose statement.';
|
|
26
|
+
const DELTA_HEADER = /^## (ADDED|MODIFIED|REMOVED|RENAMED) Requirements\s*$/;
|
|
27
|
+
const REQUIREMENT_HEADER = /^### Requirement:\s*(.+?)\s*$/;
|
|
28
|
+
const ARCHIVE_DATE_PREFIX = /^(\d{4})-(\d{2})-(\d{2})-(.+)$/;
|
|
29
|
+
export class MigrateError extends Error {
|
|
30
|
+
diagnostic;
|
|
31
|
+
constructor(message, diagnostic) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.diagnostic = diagnostic;
|
|
34
|
+
this.name = 'MigrateError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Converts an OpenSpec archive dir name (`YYYY-MM-DD-<name>`) to the tospec
|
|
39
|
+
* stamp form (`YYYYMMDD_000000-<name>`). OpenSpec only recorded the date, so
|
|
40
|
+
* the time part is zero-filled. Names without the date prefix pass through
|
|
41
|
+
* unchanged (they already parse as `<stamp>-<name>` no worse than before).
|
|
42
|
+
*/
|
|
43
|
+
export function convertArchiveDirName(dirName) {
|
|
44
|
+
const match = dirName.match(ARCHIVE_DATE_PREFIX);
|
|
45
|
+
if (!match) {
|
|
46
|
+
return dirName;
|
|
47
|
+
}
|
|
48
|
+
const [, year, month, day, name] = match;
|
|
49
|
+
return `${year}${month}${day}_000000-${name}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Rebuilds a main spec that is in delta form or headerless into the shape
|
|
53
|
+
* tospec's validator expects. Returns null when the content is already a
|
|
54
|
+
* well-formed main spec (has `## Purpose` and no top-level delta headers).
|
|
55
|
+
*/
|
|
56
|
+
export function normalizeMainSpec(content, capabilityName) {
|
|
57
|
+
const lines = content.replace(/\r\n/g, '\n').split('\n');
|
|
58
|
+
let hasDelta = false;
|
|
59
|
+
let hasPurpose = false;
|
|
60
|
+
let inFence = false;
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
if (/^\s*(```|~~~)/.test(line)) {
|
|
63
|
+
inFence = !inFence;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (inFence)
|
|
67
|
+
continue;
|
|
68
|
+
if (DELTA_HEADER.test(line))
|
|
69
|
+
hasDelta = true;
|
|
70
|
+
if (/^## Purpose\s*$/.test(line))
|
|
71
|
+
hasPurpose = true;
|
|
72
|
+
}
|
|
73
|
+
if (!hasDelta && hasPurpose) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// Collect requirement blocks keyed by name so a MODIFIED block replaces an
|
|
77
|
+
// earlier ADDED one; REMOVED/RENAMED delete. Headerless files start in
|
|
78
|
+
// ADDED mode (they are plain requirement lists).
|
|
79
|
+
const blocks = new Map();
|
|
80
|
+
let purpose = [];
|
|
81
|
+
let mode = 'ADDED';
|
|
82
|
+
let section = 'none';
|
|
83
|
+
let current = null;
|
|
84
|
+
let currentName = null;
|
|
85
|
+
const flush = () => {
|
|
86
|
+
if (current && currentName !== null) {
|
|
87
|
+
if (mode === 'ADDED' || mode === 'MODIFIED') {
|
|
88
|
+
blocks.set(currentName, current.join('\n').trim());
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
blocks.delete(currentName);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
current = null;
|
|
95
|
+
currentName = null;
|
|
96
|
+
};
|
|
97
|
+
inFence = false;
|
|
98
|
+
for (const line of lines) {
|
|
99
|
+
if (/^\s*(```|~~~)/.test(line))
|
|
100
|
+
inFence = !inFence;
|
|
101
|
+
if (!inFence) {
|
|
102
|
+
const delta = line.match(DELTA_HEADER);
|
|
103
|
+
if (delta) {
|
|
104
|
+
flush();
|
|
105
|
+
mode = delta[1];
|
|
106
|
+
section = 'none';
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const requirement = line.match(REQUIREMENT_HEADER);
|
|
110
|
+
if (requirement) {
|
|
111
|
+
flush();
|
|
112
|
+
section = 'none';
|
|
113
|
+
currentName = requirement[1];
|
|
114
|
+
current = [line];
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (/^## Purpose\s*$/.test(line)) {
|
|
118
|
+
flush();
|
|
119
|
+
section = 'purpose';
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (/^##? /.test(line)) {
|
|
123
|
+
flush();
|
|
124
|
+
section = 'none';
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (current) {
|
|
129
|
+
current.push(line);
|
|
130
|
+
}
|
|
131
|
+
else if (section === 'purpose') {
|
|
132
|
+
purpose.push(line);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
flush();
|
|
136
|
+
if (blocks.size === 0) {
|
|
137
|
+
// Nothing recognizable to rebuild; leave the file as-is rather than
|
|
138
|
+
// replacing it with an empty shell.
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const purposeText = purpose.join('\n').trim() || PURPOSE_STUB;
|
|
142
|
+
const rebuilt = [
|
|
143
|
+
`# ${capabilityName} Specification`,
|
|
144
|
+
'',
|
|
145
|
+
'## Purpose',
|
|
146
|
+
purposeText,
|
|
147
|
+
'',
|
|
148
|
+
'## Requirements',
|
|
149
|
+
'',
|
|
150
|
+
[...blocks.values()].join('\n\n'),
|
|
151
|
+
'',
|
|
152
|
+
].join('\n');
|
|
153
|
+
return { content: rebuilt, fixed: hasDelta ? 'delta' : 'headerless' };
|
|
154
|
+
}
|
|
155
|
+
/** Rewrites the schema value in change metadata, preserving other fields. */
|
|
156
|
+
function convertMetadata(raw) {
|
|
157
|
+
const parsed = raw ? (parseYaml(raw) ?? {}) : {};
|
|
158
|
+
parsed.schema = TARGET_SCHEMA;
|
|
159
|
+
return stringifyYaml(parsed);
|
|
160
|
+
}
|
|
161
|
+
export class MigrateCommand {
|
|
162
|
+
async execute(sourceDir, options) {
|
|
163
|
+
const projectRoot = process.cwd();
|
|
164
|
+
const source = path.resolve(projectRoot, sourceDir ?? 'openspec');
|
|
165
|
+
const target = path.join(projectRoot, 'tospec');
|
|
166
|
+
const sourceStat = await fs.stat(source).catch(() => null);
|
|
167
|
+
if (!sourceStat?.isDirectory()) {
|
|
168
|
+
throw new MigrateError(`OpenSpec directory not found: ${source}`, {
|
|
169
|
+
fix: 'Pass the directory explicitly: tospec migrate <openspec-dir>',
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// An empty tospec/ is fine to migrate into — `tospec init` creates one with
|
|
173
|
+
// bare specs/changes dirs and a default config.yaml, and requiring the user
|
|
174
|
+
// to delete it would undo the init. Only real content blocks the migration.
|
|
175
|
+
const targetContent = [
|
|
176
|
+
...(await listSpecDirs(path.join(target, 'specs'))),
|
|
177
|
+
...(await listChangeDirs(path.join(target, 'changes'))),
|
|
178
|
+
...(await listChangeDirs(path.join(target, 'changes', 'archive'))),
|
|
179
|
+
];
|
|
180
|
+
if (targetContent.length > 0) {
|
|
181
|
+
throw new MigrateError(`Target already has specs or changes: ${target}`, {
|
|
182
|
+
fix: 'Remove or rename the existing tospec/ directory first.',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const activeChanges = await listChangeDirs(path.join(source, 'changes'));
|
|
186
|
+
const archivedChanges = await listChangeDirs(path.join(source, 'changes', 'archive'));
|
|
187
|
+
const specDirs = await listSpecDirs(path.join(source, 'specs'));
|
|
188
|
+
if (!options?.force) {
|
|
189
|
+
console.log(`Migrate OpenSpec project to tospec format:`);
|
|
190
|
+
console.log(` Source: ${source} (read-only)`);
|
|
191
|
+
console.log(` Target: ${target}`);
|
|
192
|
+
console.log(` Specs: ${specDirs.length}`);
|
|
193
|
+
console.log(` Changes: ${activeChanges.length} active, ${archivedChanges.length} archived`);
|
|
194
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
195
|
+
const proceed = await confirm({ message: 'Proceed with migration?', default: false });
|
|
196
|
+
if (!proceed) {
|
|
197
|
+
console.log('Migration cancelled.');
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const summary = {
|
|
202
|
+
specs: { copied: 0, normalizedDelta: 0, normalizedHeaderless: 0, skippedEmpty: 0 },
|
|
203
|
+
changes: { active: 0, archived: 0, metadataCreated: 0 },
|
|
204
|
+
};
|
|
205
|
+
await fs.mkdir(path.join(target, 'specs'), { recursive: true });
|
|
206
|
+
await fs.mkdir(path.join(target, 'changes', 'archive'), { recursive: true });
|
|
207
|
+
await fs.mkdir(path.join(target, 'tickets', 'archive'), { recursive: true });
|
|
208
|
+
await this.migrateConfig(source, target);
|
|
209
|
+
for (const dir of specDirs) {
|
|
210
|
+
const specFile = path.join(source, 'specs', dir, 'spec.md');
|
|
211
|
+
if (!(await exists(specFile))) {
|
|
212
|
+
summary.specs.skippedEmpty++;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
await fs.cp(path.join(source, 'specs', dir), path.join(target, 'specs', dir), { recursive: true });
|
|
216
|
+
const content = await fs.readFile(specFile, 'utf-8');
|
|
217
|
+
const normalized = normalizeMainSpec(content, dir);
|
|
218
|
+
if (normalized) {
|
|
219
|
+
await fs.writeFile(path.join(target, 'specs', dir, 'spec.md'), normalized.content);
|
|
220
|
+
if (normalized.fixed === 'delta')
|
|
221
|
+
summary.specs.normalizedDelta++;
|
|
222
|
+
else
|
|
223
|
+
summary.specs.normalizedHeaderless++;
|
|
224
|
+
}
|
|
225
|
+
summary.specs.copied++;
|
|
226
|
+
}
|
|
227
|
+
for (const dir of activeChanges) {
|
|
228
|
+
const dest = path.join(target, 'changes', dir);
|
|
229
|
+
await fs.cp(path.join(source, 'changes', dir), dest, { recursive: true });
|
|
230
|
+
if (await this.migrateMetadata(dest))
|
|
231
|
+
summary.changes.metadataCreated++;
|
|
232
|
+
summary.changes.active++;
|
|
233
|
+
}
|
|
234
|
+
for (const dir of archivedChanges) {
|
|
235
|
+
const dest = path.join(target, 'changes', 'archive', convertArchiveDirName(dir));
|
|
236
|
+
await fs.cp(path.join(source, 'changes', 'archive', dir), dest, { recursive: true });
|
|
237
|
+
if (await this.migrateMetadata(dest))
|
|
238
|
+
summary.changes.metadataCreated++;
|
|
239
|
+
summary.changes.archived++;
|
|
240
|
+
}
|
|
241
|
+
console.log(`✓ Migration complete: ${target}`);
|
|
242
|
+
console.log(` Specs: ${summary.specs.copied} copied` +
|
|
243
|
+
` (${summary.specs.normalizedDelta} delta-form + ${summary.specs.normalizedHeaderless} headerless normalized` +
|
|
244
|
+
`, ${summary.specs.skippedEmpty} empty skipped)`);
|
|
245
|
+
console.log(` Changes: ${summary.changes.active} active, ${summary.changes.archived} archived` +
|
|
246
|
+
` (${summary.changes.metadataCreated} metadata files created)`);
|
|
247
|
+
console.log(` Run 'tospec validate --all' to verify, then 'tospec init' to set up skills.`);
|
|
248
|
+
}
|
|
249
|
+
/** Copies config.yaml with the schema value rewritten; creates a minimal one when absent. */
|
|
250
|
+
async migrateConfig(source, target) {
|
|
251
|
+
const sourceConfig = path.join(source, 'config.yaml');
|
|
252
|
+
const targetConfig = path.join(target, 'config.yaml');
|
|
253
|
+
if (await exists(sourceConfig)) {
|
|
254
|
+
const raw = await fs.readFile(sourceConfig, 'utf-8');
|
|
255
|
+
// Line-level replace to preserve the file's comments and formatting.
|
|
256
|
+
const rewritten = raw.replace(/^schema:.*$/m, `schema: ${TARGET_SCHEMA}`);
|
|
257
|
+
const content = /^schema:/m.test(rewritten) ? rewritten : `schema: ${TARGET_SCHEMA}\n${rewritten}`;
|
|
258
|
+
await fs.writeFile(targetConfig, content);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
await fs.writeFile(targetConfig, `schema: ${TARGET_SCHEMA}\n`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Replaces `.openspec.yaml` with `.tospec.yaml` (schema rewritten to sdd)
|
|
266
|
+
* inside an already-copied change directory. Returns true when the source
|
|
267
|
+
* had no metadata file and one was created.
|
|
268
|
+
*/
|
|
269
|
+
async migrateMetadata(changeDir) {
|
|
270
|
+
const sourcePath = path.join(changeDir, METADATA_SOURCE);
|
|
271
|
+
const raw = (await exists(sourcePath)) ? await fs.readFile(sourcePath, 'utf-8') : null;
|
|
272
|
+
await fs.writeFile(path.join(changeDir, METADATA_TARGET), convertMetadata(raw));
|
|
273
|
+
if (raw !== null) {
|
|
274
|
+
await fs.rm(sourcePath);
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
async function exists(p) {
|
|
281
|
+
return fs
|
|
282
|
+
.access(p)
|
|
283
|
+
.then(() => true)
|
|
284
|
+
.catch(() => false);
|
|
285
|
+
}
|
|
286
|
+
async function listChangeDirs(dir) {
|
|
287
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
288
|
+
return entries
|
|
289
|
+
.filter((entry) => entry.isDirectory() && entry.name !== 'archive')
|
|
290
|
+
.map((entry) => entry.name)
|
|
291
|
+
.sort();
|
|
292
|
+
}
|
|
293
|
+
async function listSpecDirs(dir) {
|
|
294
|
+
const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
295
|
+
return entries
|
|
296
|
+
.filter((entry) => entry.isDirectory())
|
|
297
|
+
.map((entry) => entry.name)
|
|
298
|
+
.sort();
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MarkdownParser } from './markdown-parser.js';
|
|
2
|
+
import { Change, Delta } from '../schemas/index.js';
|
|
3
|
+
export declare class ChangeParser extends MarkdownParser {
|
|
4
|
+
private changeDir;
|
|
5
|
+
constructor(content: string, changeDir: string);
|
|
6
|
+
parseChangeWithDeltas(name: string): Promise<Change>;
|
|
7
|
+
/**
|
|
8
|
+
* Scans `specs/<capability>/spec.md` delta files directly, independent of
|
|
9
|
+
* a proposal.md's Why/What-Changes prose. Deltas for sdd/issue changes live
|
|
10
|
+
* in specs/ regardless of the global ticket stub (tospec/tickets/) or
|
|
11
|
+
* proposal.md, so this is the primary delta source for both schemas.
|
|
12
|
+
*/
|
|
13
|
+
parseDeltaSpecs(specsDir: string): Promise<Delta[]>;
|
|
14
|
+
private parseSpecDeltas;
|
|
15
|
+
private parseRenames;
|
|
16
|
+
private parseSectionsFromContent;
|
|
17
|
+
private getContentUntilNextHeaderFromLines;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=change-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-parser.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/change-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAW,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,MAAM,EAAE,KAAK,EAA+B,MAAM,qBAAqB,CAAC;AAUjF,qBAAa,YAAa,SAAQ,cAAc;IAC9C,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAKxC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmC1D;;;;;OAKG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IA6BzD,OAAO,CAAC,eAAe;IAmEvB,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,wBAAwB;IA2ChC,OAAO,CAAC,kCAAkC;CAqB3C"}
|