@planu/cli 0.89.0 → 0.90.1
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/dist/cli/commands/activate.d.ts +14 -0
- package/dist/cli/commands/activate.d.ts.map +1 -0
- package/dist/cli/commands/activate.js +174 -0
- package/dist/cli/commands/activate.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +16 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +162 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/install.d.ts +48 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +348 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +10 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +133 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/router.d.ts.map +1 -1
- package/dist/cli/router.js +9 -1
- package/dist/cli/router.js.map +1 -1
- package/dist/config/license-plans.json +2 -1
- package/dist/engine/agent-generator.test.d.ts +2 -0
- package/dist/engine/agent-generator.test.d.ts.map +1 -0
- package/dist/engine/agent-generator.test.js +556 -0
- package/dist/engine/agent-generator.test.js.map +1 -0
- package/dist/engine/analyzer.test.d.ts +2 -0
- package/dist/engine/analyzer.test.d.ts.map +1 -0
- package/dist/engine/analyzer.test.js +1461 -0
- package/dist/engine/analyzer.test.js.map +1 -0
- package/dist/engine/auditor.test.d.ts +2 -0
- package/dist/engine/auditor.test.d.ts.map +1 -0
- package/dist/engine/auditor.test.js +2075 -0
- package/dist/engine/auditor.test.js.map +1 -0
- package/dist/engine/doc-generator.test.d.ts +2 -0
- package/dist/engine/doc-generator.test.d.ts.map +1 -0
- package/dist/engine/doc-generator.test.js +961 -0
- package/dist/engine/doc-generator.test.js.map +1 -0
- package/dist/engine/estimator.test.d.ts +2 -0
- package/dist/engine/estimator.test.d.ts.map +1 -0
- package/dist/engine/estimator.test.js +334 -0
- package/dist/engine/estimator.test.js.map +1 -0
- package/dist/engine/skill-generator.test.d.ts +2 -0
- package/dist/engine/skill-generator.test.d.ts.map +1 -0
- package/dist/engine/skill-generator.test.js +742 -0
- package/dist/engine/skill-generator.test.js.map +1 -0
- package/dist/engine/spec-migrator/filesystem-import.d.ts +14 -0
- package/dist/engine/spec-migrator/filesystem-import.d.ts.map +1 -0
- package/dist/engine/spec-migrator/filesystem-import.js +96 -0
- package/dist/engine/spec-migrator/filesystem-import.js.map +1 -0
- package/dist/engine/spec-migrator/flatten-specs.d.ts +12 -0
- package/dist/engine/spec-migrator/flatten-specs.d.ts.map +1 -0
- package/dist/engine/spec-migrator/flatten-specs.js +111 -0
- package/dist/engine/spec-migrator/flatten-specs.js.map +1 -0
- package/dist/engine/spec-migrator/folder-operations.d.ts +9 -0
- package/dist/engine/spec-migrator/folder-operations.d.ts.map +1 -0
- package/dist/engine/spec-migrator/folder-operations.js +109 -0
- package/dist/engine/spec-migrator/folder-operations.js.map +1 -0
- package/dist/engine/spec-migrator/frontmatter-parser.d.ts +11 -0
- package/dist/engine/spec-migrator/frontmatter-parser.d.ts.map +1 -0
- package/dist/engine/spec-migrator/frontmatter-parser.js +92 -0
- package/dist/engine/spec-migrator/frontmatter-parser.js.map +1 -0
- package/dist/engine/spec-migrator/index.d.ts +9 -0
- package/dist/engine/spec-migrator/index.d.ts.map +1 -0
- package/dist/engine/spec-migrator/index.js +18 -0
- package/dist/engine/spec-migrator/index.js.map +1 -0
- package/dist/engine/spec-migrator/legacy-migration.d.ts +13 -0
- package/dist/engine/spec-migrator/legacy-migration.d.ts.map +1 -0
- package/dist/engine/spec-migrator/legacy-migration.js +75 -0
- package/dist/engine/spec-migrator/legacy-migration.js.map +1 -0
- package/dist/engine/spec-migrator/migration-validator.d.ts +20 -0
- package/dist/engine/spec-migrator/migration-validator.d.ts.map +1 -0
- package/dist/engine/spec-migrator/migration-validator.js +35 -0
- package/dist/engine/spec-migrator/migration-validator.js.map +1 -0
- package/dist/engine/spec-migrator/path-utils.d.ts +13 -0
- package/dist/engine/spec-migrator/path-utils.d.ts.map +1 -0
- package/dist/engine/spec-migrator/path-utils.js +40 -0
- package/dist/engine/spec-migrator/path-utils.js.map +1 -0
- package/dist/engine/spec-migrator/prefix-migration.d.ts +11 -0
- package/dist/engine/spec-migrator/prefix-migration.d.ts.map +1 -0
- package/dist/engine/spec-migrator/prefix-migration.js +73 -0
- package/dist/engine/spec-migrator/prefix-migration.js.map +1 -0
- package/dist/engine/spec-migrator/reconcile-paths.d.ts +12 -0
- package/dist/engine/spec-migrator/reconcile-paths.d.ts.map +1 -0
- package/dist/engine/spec-migrator/reconcile-paths.js +77 -0
- package/dist/engine/spec-migrator/reconcile-paths.js.map +1 -0
- package/dist/engine/spec-migrator/version-detection.d.ts +5 -0
- package/dist/engine/spec-migrator/version-detection.d.ts.map +1 -0
- package/dist/engine/spec-migrator/version-detection.js +19 -0
- package/dist/engine/spec-migrator/version-detection.js.map +1 -0
- package/dist/engine/spec-migrator.d.ts +1 -58
- package/dist/engine/spec-migrator.d.ts.map +1 -1
- package/dist/engine/spec-migrator.js +2 -658
- package/dist/engine/spec-migrator.js.map +1 -1
- package/dist/engine/spec-summary-html/dashboard-renderer.d.ts +6 -0
- package/dist/engine/spec-summary-html/dashboard-renderer.d.ts.map +1 -0
- package/dist/engine/spec-summary-html/dashboard-renderer.js +333 -0
- package/dist/engine/spec-summary-html/dashboard-renderer.js.map +1 -0
- package/dist/engine/spec-summary-html/hash-utils.d.ts +11 -0
- package/dist/engine/spec-summary-html/hash-utils.d.ts.map +1 -0
- package/dist/engine/spec-summary-html/hash-utils.js +39 -0
- package/dist/engine/spec-summary-html/hash-utils.js.map +1 -0
- package/dist/engine/spec-summary-html/index.d.ts +4 -0
- package/dist/engine/spec-summary-html/index.d.ts.map +1 -0
- package/dist/engine/spec-summary-html/index.js +6 -0
- package/dist/engine/spec-summary-html/index.js.map +1 -0
- package/dist/engine/spec-summary-html/report-renderer.d.ts +9 -0
- package/dist/engine/spec-summary-html/report-renderer.d.ts.map +1 -0
- package/dist/engine/spec-summary-html/report-renderer.js +139 -0
- package/dist/engine/spec-summary-html/report-renderer.js.map +1 -0
- package/dist/engine/spec-summary-html.d.ts +1 -0
- package/dist/engine/spec-summary-html.d.ts.map +1 -1
- package/dist/engine/spec-summary-html.js +19 -473
- package/dist/engine/spec-summary-html.js.map +1 -1
- package/dist/engine/update-notifier.d.ts +8 -0
- package/dist/engine/update-notifier.d.ts.map +1 -0
- package/dist/engine/update-notifier.js +130 -0
- package/dist/engine/update-notifier.js.map +1 -0
- package/dist/engine/validator/dor-dod.d.ts.map +1 -1
- package/dist/engine/validator/dor-dod.js +8 -5
- package/dist/engine/validator/dor-dod.js.map +1 -1
- package/dist/engine/validator.d.ts.map +1 -1
- package/dist/engine/validator.js +4 -3
- package/dist/engine/validator.js.map +1 -1
- package/dist/engine/validator.test.d.ts +2 -0
- package/dist/engine/validator.test.d.ts.map +1 -0
- package/dist/engine/validator.test.js +2371 -0
- package/dist/engine/validator.test.js.map +1 -0
- package/dist/engine/web-fetcher.test.d.ts +2 -0
- package/dist/engine/web-fetcher.test.d.ts.map +1 -0
- package/dist/engine/web-fetcher.test.js +360 -0
- package/dist/engine/web-fetcher.test.js.map +1 -0
- package/dist/i18n/index.test.d.ts +2 -0
- package/dist/i18n/index.test.d.ts.map +1 -0
- package/dist/i18n/index.test.js +375 -0
- package/dist/i18n/index.test.js.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +124 -0
- package/dist/index.test.js.map +1 -0
- package/dist/resources/patterns.test.d.ts +2 -0
- package/dist/resources/patterns.test.d.ts.map +1 -0
- package/dist/resources/patterns.test.js +142 -0
- package/dist/resources/patterns.test.js.map +1 -0
- package/dist/resources/process.test.d.ts +2 -0
- package/dist/resources/process.test.d.ts.map +1 -0
- package/dist/resources/process.test.js +48 -0
- package/dist/resources/process.test.js.map +1 -0
- package/dist/resources/registry.test.d.ts +2 -0
- package/dist/resources/registry.test.d.ts.map +1 -0
- package/dist/resources/registry.test.js +138 -0
- package/dist/resources/registry.test.js.map +1 -0
- package/dist/resources/specs.test.d.ts +2 -0
- package/dist/resources/specs.test.d.ts.map +1 -0
- package/dist/resources/specs.test.js +130 -0
- package/dist/resources/specs.test.js.map +1 -0
- package/dist/resources/templates.test.d.ts +2 -0
- package/dist/resources/templates.test.d.ts.map +1 -0
- package/dist/resources/templates.test.js +119 -0
- package/dist/resources/templates.test.js.map +1 -0
- package/dist/smoke.test.d.ts +2 -0
- package/dist/smoke.test.d.ts.map +1 -0
- package/dist/smoke.test.js +229 -0
- package/dist/smoke.test.js.map +1 -0
- package/dist/storage/base-store.test.d.ts +2 -0
- package/dist/storage/base-store.test.d.ts.map +1 -0
- package/dist/storage/base-store.test.js +180 -0
- package/dist/storage/base-store.test.js.map +1 -0
- package/dist/storage/global-store.test.d.ts +2 -0
- package/dist/storage/global-store.test.d.ts.map +1 -0
- package/dist/storage/global-store.test.js +327 -0
- package/dist/storage/global-store.test.js.map +1 -0
- package/dist/storage/index.test.d.ts +2 -0
- package/dist/storage/index.test.d.ts.map +1 -0
- package/dist/storage/index.test.js +56 -0
- package/dist/storage/index.test.js.map +1 -0
- package/dist/storage/knowledge-store.test.d.ts +2 -0
- package/dist/storage/knowledge-store.test.d.ts.map +1 -0
- package/dist/storage/knowledge-store.test.js +368 -0
- package/dist/storage/knowledge-store.test.js.map +1 -0
- package/dist/storage/metrics-store.test.d.ts +2 -0
- package/dist/storage/metrics-store.test.d.ts.map +1 -0
- package/dist/storage/metrics-store.test.js +212 -0
- package/dist/storage/metrics-store.test.js.map +1 -0
- package/dist/storage/pattern-store.test.d.ts +2 -0
- package/dist/storage/pattern-store.test.d.ts.map +1 -0
- package/dist/storage/pattern-store.test.js +224 -0
- package/dist/storage/pattern-store.test.js.map +1 -0
- package/dist/storage/spec-store.test.d.ts +2 -0
- package/dist/storage/spec-store.test.d.ts.map +1 -0
- package/dist/storage/spec-store.test.js +227 -0
- package/dist/storage/spec-store.test.js.map +1 -0
- package/dist/tools/audit.test.d.ts +2 -0
- package/dist/tools/audit.test.d.ts.map +1 -0
- package/dist/tools/audit.test.js +169 -0
- package/dist/tools/audit.test.js.map +1 -0
- package/dist/tools/challenge-spec.test.d.ts +2 -0
- package/dist/tools/challenge-spec.test.d.ts.map +1 -0
- package/dist/tools/challenge-spec.test.js +782 -0
- package/dist/tools/challenge-spec.test.js.map +1 -0
- package/dist/tools/check-versions.test.d.ts +2 -0
- package/dist/tools/check-versions.test.d.ts.map +1 -0
- package/dist/tools/check-versions.test.js +214 -0
- package/dist/tools/check-versions.test.js.map +1 -0
- package/dist/tools/clarify-requirements.test.d.ts +2 -0
- package/dist/tools/clarify-requirements.test.d.ts.map +1 -0
- package/dist/tools/clarify-requirements.test.js +161 -0
- package/dist/tools/clarify-requirements.test.js.map +1 -0
- package/dist/tools/consult-docs.test.d.ts +2 -0
- package/dist/tools/consult-docs.test.d.ts.map +1 -0
- package/dist/tools/consult-docs.test.js +140 -0
- package/dist/tools/consult-docs.test.js.map +1 -0
- package/dist/tools/create-spec.test.d.ts +2 -0
- package/dist/tools/create-spec.test.d.ts.map +1 -0
- package/dist/tools/create-spec.test.js +233 -0
- package/dist/tools/create-spec.test.js.map +1 -0
- package/dist/tools/define-ui-contract.test.d.ts +2 -0
- package/dist/tools/define-ui-contract.test.d.ts.map +1 -0
- package/dist/tools/define-ui-contract.test.js +479 -0
- package/dist/tools/define-ui-contract.test.js.map +1 -0
- package/dist/tools/design-schema.test.d.ts +2 -0
- package/dist/tools/design-schema.test.d.ts.map +1 -0
- package/dist/tools/design-schema.test.js +301 -0
- package/dist/tools/design-schema.test.js.map +1 -0
- package/dist/tools/detect-agent.test.d.ts +2 -0
- package/dist/tools/detect-agent.test.d.ts.map +1 -0
- package/dist/tools/detect-agent.test.js +133 -0
- package/dist/tools/detect-agent.test.js.map +1 -0
- package/dist/tools/detect-drift.test.d.ts +2 -0
- package/dist/tools/detect-drift.test.d.ts.map +1 -0
- package/dist/tools/detect-drift.test.js +312 -0
- package/dist/tools/detect-drift.test.js.map +1 -0
- package/dist/tools/discover-mcps.test.d.ts +2 -0
- package/dist/tools/discover-mcps.test.d.ts.map +1 -0
- package/dist/tools/discover-mcps.test.js +345 -0
- package/dist/tools/discover-mcps.test.js.map +1 -0
- package/dist/tools/estimate.test.d.ts +2 -0
- package/dist/tools/estimate.test.d.ts.map +1 -0
- package/dist/tools/estimate.test.js +137 -0
- package/dist/tools/estimate.test.js.map +1 -0
- package/dist/tools/generate-adr.test.d.ts +2 -0
- package/dist/tools/generate-adr.test.d.ts.map +1 -0
- package/dist/tools/generate-adr.test.js +206 -0
- package/dist/tools/generate-adr.test.js.map +1 -0
- package/dist/tools/generate-checklist.test.d.ts +2 -0
- package/dist/tools/generate-checklist.test.d.ts.map +1 -0
- package/dist/tools/generate-checklist.test.js +201 -0
- package/dist/tools/generate-checklist.test.js.map +1 -0
- package/dist/tools/generate-docs.test.d.ts +2 -0
- package/dist/tools/generate-docs.test.d.ts.map +1 -0
- package/dist/tools/generate-docs.test.js +183 -0
- package/dist/tools/generate-docs.test.js.map +1 -0
- package/dist/tools/generate-execution-plan.test.d.ts +2 -0
- package/dist/tools/generate-execution-plan.test.d.ts.map +1 -0
- package/dist/tools/generate-execution-plan.test.js +643 -0
- package/dist/tools/generate-execution-plan.test.js.map +1 -0
- package/dist/tools/generate-rules.test.d.ts +2 -0
- package/dist/tools/generate-rules.test.d.ts.map +1 -0
- package/dist/tools/generate-rules.test.js +148 -0
- package/dist/tools/generate-rules.test.js.map +1 -0
- package/dist/tools/generate-skill.test.d.ts +2 -0
- package/dist/tools/generate-skill.test.d.ts.map +1 -0
- package/dist/tools/generate-skill.test.js +138 -0
- package/dist/tools/generate-skill.test.js.map +1 -0
- package/dist/tools/generate-sub-agent.test.d.ts +2 -0
- package/dist/tools/generate-sub-agent.test.d.ts.map +1 -0
- package/dist/tools/generate-sub-agent.test.js +162 -0
- package/dist/tools/generate-sub-agent.test.js.map +1 -0
- package/dist/tools/generate-tests.test.d.ts +2 -0
- package/dist/tools/generate-tests.test.d.ts.map +1 -0
- package/dist/tools/generate-tests.test.js +222 -0
- package/dist/tools/generate-tests.test.js.map +1 -0
- package/dist/tools/init-constitution.test.d.ts +2 -0
- package/dist/tools/init-constitution.test.d.ts.map +1 -0
- package/dist/tools/init-constitution.test.js +398 -0
- package/dist/tools/init-constitution.test.js.map +1 -0
- package/dist/tools/init-project/config-builder.d.ts +12 -0
- package/dist/tools/init-project/config-builder.d.ts.map +1 -0
- package/dist/tools/init-project/config-builder.js +31 -0
- package/dist/tools/init-project/config-builder.js.map +1 -0
- package/dist/tools/init-project/git-setup.d.ts +8 -0
- package/dist/tools/init-project/git-setup.d.ts.map +1 -0
- package/dist/tools/init-project/git-setup.js +70 -0
- package/dist/tools/init-project/git-setup.js.map +1 -0
- package/dist/tools/init-project/handler.d.ts.map +1 -1
- package/dist/tools/init-project/handler.js +25 -371
- package/dist/tools/init-project/handler.js.map +1 -1
- package/dist/tools/init-project/lifecycle-helpers.d.ts +32 -0
- package/dist/tools/init-project/lifecycle-helpers.d.ts.map +1 -0
- package/dist/tools/init-project/lifecycle-helpers.js +153 -0
- package/dist/tools/init-project/lifecycle-helpers.js.map +1 -0
- package/dist/tools/init-project/migration-runner.d.ts +28 -0
- package/dist/tools/init-project/migration-runner.d.ts.map +1 -0
- package/dist/tools/init-project/migration-runner.js +57 -0
- package/dist/tools/init-project/migration-runner.js.map +1 -0
- package/dist/tools/init-project/rules-writer.d.ts +14 -0
- package/dist/tools/init-project/rules-writer.d.ts.map +1 -0
- package/dist/tools/init-project/rules-writer.js +43 -0
- package/dist/tools/init-project/rules-writer.js.map +1 -0
- package/dist/tools/init-project/scaffold-writer.d.ts +29 -0
- package/dist/tools/init-project/scaffold-writer.d.ts.map +1 -0
- package/dist/tools/init-project/scaffold-writer.js +76 -0
- package/dist/tools/init-project/scaffold-writer.js.map +1 -0
- package/dist/tools/init-project/stack-detector.d.ts +16 -0
- package/dist/tools/init-project/stack-detector.d.ts.map +1 -0
- package/dist/tools/init-project/stack-detector.js +19 -0
- package/dist/tools/init-project/stack-detector.js.map +1 -0
- package/dist/tools/init-project.test.d.ts +2 -0
- package/dist/tools/init-project.test.d.ts.map +1 -0
- package/dist/tools/init-project.test.js +158 -0
- package/dist/tools/init-project.test.js.map +1 -0
- package/dist/tools/integrate-pm.test.d.ts +2 -0
- package/dist/tools/integrate-pm.test.d.ts.map +1 -0
- package/dist/tools/integrate-pm.test.js +558 -0
- package/dist/tools/integrate-pm.test.js.map +1 -0
- package/dist/tools/learn.test.d.ts +2 -0
- package/dist/tools/learn.test.d.ts.map +1 -0
- package/dist/tools/learn.test.js +123 -0
- package/dist/tools/learn.test.js.map +1 -0
- package/dist/tools/list-specs.js +1 -1
- package/dist/tools/list-specs.js.map +1 -1
- package/dist/tools/list-specs.test.d.ts +2 -0
- package/dist/tools/list-specs.test.d.ts.map +1 -0
- package/dist/tools/list-specs.test.js +110 -0
- package/dist/tools/list-specs.test.js.map +1 -0
- package/dist/tools/manage-context.test.d.ts +2 -0
- package/dist/tools/manage-context.test.d.ts.map +1 -0
- package/dist/tools/manage-context.test.js +359 -0
- package/dist/tools/manage-context.test.js.map +1 -0
- package/dist/tools/manage-git.test.d.ts +2 -0
- package/dist/tools/manage-git.test.d.ts.map +1 -0
- package/dist/tools/manage-git.test.js +882 -0
- package/dist/tools/manage-git.test.js.map +1 -0
- package/dist/tools/orchestrate.test.d.ts +2 -0
- package/dist/tools/orchestrate.test.d.ts.map +1 -0
- package/dist/tools/orchestrate.test.js +1117 -0
- package/dist/tools/orchestrate.test.js.map +1 -0
- package/dist/tools/reconcile-spec.test.d.ts +2 -0
- package/dist/tools/reconcile-spec.test.d.ts.map +1 -0
- package/dist/tools/reconcile-spec.test.js +259 -0
- package/dist/tools/reconcile-spec.test.js.map +1 -0
- package/dist/tools/red-team.d.ts +3 -0
- package/dist/tools/red-team.d.ts.map +1 -0
- package/dist/tools/red-team.js +302 -0
- package/dist/tools/red-team.js.map +1 -0
- package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
- package/dist/tools/register-platform-tools/design-stack-tools.js +14 -0
- package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
- package/dist/tools/register-platform-tools.test.d.ts +2 -0
- package/dist/tools/register-platform-tools.test.d.ts.map +1 -0
- package/dist/tools/register-platform-tools.test.js +404 -0
- package/dist/tools/register-platform-tools.test.js.map +1 -0
- package/dist/tools/register-spec-tools.test.d.ts +2 -0
- package/dist/tools/register-spec-tools.test.d.ts.map +1 -0
- package/dist/tools/register-spec-tools.test.js +407 -0
- package/dist/tools/register-spec-tools.test.js.map +1 -0
- package/dist/tools/reverse-engineer.test.d.ts +2 -0
- package/dist/tools/reverse-engineer.test.d.ts.map +1 -0
- package/dist/tools/reverse-engineer.test.js +206 -0
- package/dist/tools/reverse-engineer.test.js.map +1 -0
- package/dist/tools/schemas.d.ts +20 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +133 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/schemas.test.d.ts +2 -0
- package/dist/tools/schemas.test.d.ts.map +1 -0
- package/dist/tools/schemas.test.js +245 -0
- package/dist/tools/schemas.test.js.map +1 -0
- package/dist/tools/set-locale.test.d.ts +2 -0
- package/dist/tools/set-locale.test.d.ts.map +1 -0
- package/dist/tools/set-locale.test.js +74 -0
- package/dist/tools/set-locale.test.js.map +1 -0
- package/dist/tools/suggest-mcps.test.d.ts +2 -0
- package/dist/tools/suggest-mcps.test.d.ts.map +1 -0
- package/dist/tools/suggest-mcps.test.js +198 -0
- package/dist/tools/suggest-mcps.test.js.map +1 -0
- package/dist/tools/suggest-stack.test.d.ts +2 -0
- package/dist/tools/suggest-stack.test.d.ts.map +1 -0
- package/dist/tools/suggest-stack.test.js +181 -0
- package/dist/tools/suggest-stack.test.js.map +1 -0
- package/dist/tools/suggest-tooling.test.d.ts +2 -0
- package/dist/tools/suggest-tooling.test.d.ts.map +1 -0
- package/dist/tools/suggest-tooling.test.js +213 -0
- package/dist/tools/suggest-tooling.test.js.map +1 -0
- package/dist/tools/summarize-spec.test.d.ts +2 -0
- package/dist/tools/summarize-spec.test.d.ts.map +1 -0
- package/dist/tools/summarize-spec.test.js +180 -0
- package/dist/tools/summarize-spec.test.js.map +1 -0
- package/dist/tools/update-status/dod-gates.d.ts +16 -0
- package/dist/tools/update-status/dod-gates.d.ts.map +1 -0
- package/dist/tools/update-status/dod-gates.js +117 -0
- package/dist/tools/update-status/dod-gates.js.map +1 -0
- package/dist/tools/update-status/file-sync.d.ts +6 -0
- package/dist/tools/update-status/file-sync.d.ts.map +1 -0
- package/dist/tools/update-status/file-sync.js +112 -0
- package/dist/tools/update-status/file-sync.js.map +1 -0
- package/dist/tools/update-status/index.d.ts +3 -0
- package/dist/tools/update-status/index.d.ts.map +1 -0
- package/dist/tools/update-status/index.js +181 -0
- package/dist/tools/update-status/index.js.map +1 -0
- package/dist/tools/update-status/response-builder.d.ts +4 -0
- package/dist/tools/update-status/response-builder.d.ts.map +1 -0
- package/dist/tools/update-status/response-builder.js +69 -0
- package/dist/tools/update-status/response-builder.js.map +1 -0
- package/dist/tools/update-status/side-effects.d.ts +15 -0
- package/dist/tools/update-status/side-effects.d.ts.map +1 -0
- package/dist/tools/update-status/side-effects.js +64 -0
- package/dist/tools/update-status/side-effects.js.map +1 -0
- package/dist/tools/update-status/transition-guard.d.ts +20 -0
- package/dist/tools/update-status/transition-guard.d.ts.map +1 -0
- package/dist/tools/update-status/transition-guard.js +75 -0
- package/dist/tools/update-status/transition-guard.js.map +1 -0
- package/dist/tools/update-status.d.ts +1 -2
- package/dist/tools/update-status.d.ts.map +1 -1
- package/dist/tools/update-status.js +2 -481
- package/dist/tools/update-status.js.map +1 -1
- package/dist/tools/update-status.test.d.ts +2 -0
- package/dist/tools/update-status.test.d.ts.map +1 -0
- package/dist/tools/update-status.test.js +142 -0
- package/dist/tools/update-status.test.js.map +1 -0
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js +6 -4
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/validate.test.d.ts +2 -0
- package/dist/tools/validate.test.d.ts.map +1 -0
- package/dist/tools/validate.test.js +137 -0
- package/dist/tools/validate.test.js.map +1 -0
- package/dist/types/analysis.d.ts +2 -1
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/red-team.d.ts +29 -0
- package/dist/types/red-team.d.ts.map +1 -0
- package/dist/types/red-team.js +3 -0
- package/dist/types/red-team.js.map +1 -0
- package/dist/types/update-notifier.d.ts +5 -0
- package/dist/types/update-notifier.d.ts.map +1 -0
- package/dist/types/update-notifier.js +3 -0
- package/dist/types/update-notifier.js.map +1 -0
- package/package.json +9 -2
- package/src/config/license-plans.json +2 -1
- package/src/i18n/messages/en.json +5 -0
- package/src/i18n/messages/es.json +5 -0
- package/src/i18n/messages/pt.json +5 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Spec, SpecMigrationResult, SpecMigrationDeps } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect specs stored under a legacy location (docs/sdd/specs/).
|
|
4
|
+
* Caller provides the list of specs (from storage layer).
|
|
5
|
+
*/
|
|
6
|
+
export declare function filterLegacySpecs(specs: Spec[]): Spec[];
|
|
7
|
+
/**
|
|
8
|
+
* Migrate legacy specs to planu/specs/ with modern file naming.
|
|
9
|
+
* Moves files on disk and calls the provided updateSpec for each migrated spec.
|
|
10
|
+
* Also rewrites planu.json.
|
|
11
|
+
*/
|
|
12
|
+
export declare function migrateSpecs(projectPath: string, legacySpecs: Spec[], deps: SpecMigrationDeps): Promise<SpecMigrationResult>;
|
|
13
|
+
//# sourceMappingURL=legacy-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-migration.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/legacy-migration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAWzF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAEvD;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,IAAI,EAAE,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAoB9B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// spec-migrator/legacy-migration.ts — Migrate legacy docs/sdd/specs → planu/specs
|
|
2
|
+
import { isLegacyLocation, createPlanuConfig, serializePlanuConfig, } from '../planu-config-writer.js';
|
|
3
|
+
import { mkdir, rename, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { rewritePath, flattenSpecPath, LEGACY_TO_MODERN_NAMES } from './path-utils.js';
|
|
6
|
+
import { safeReaddir, cleanupEmptyDirs } from './folder-operations.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect specs stored under a legacy location (docs/sdd/specs/).
|
|
9
|
+
* Caller provides the list of specs (from storage layer).
|
|
10
|
+
*/
|
|
11
|
+
export function filterLegacySpecs(specs) {
|
|
12
|
+
return specs.filter((s) => isLegacyLocation(s.specPath) || isLegacyLocation(s.technicalPath));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Migrate legacy specs to planu/specs/ with modern file naming.
|
|
16
|
+
* Moves files on disk and calls the provided updateSpec for each migrated spec.
|
|
17
|
+
* Also rewrites planu.json.
|
|
18
|
+
*/
|
|
19
|
+
export async function migrateSpecs(projectPath, legacySpecs, deps) {
|
|
20
|
+
const errors = [];
|
|
21
|
+
let migratedCount = 0;
|
|
22
|
+
for (const spec of legacySpecs) {
|
|
23
|
+
try {
|
|
24
|
+
await migrateSingleSpec(projectPath, spec, deps);
|
|
25
|
+
migratedCount++;
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
29
|
+
errors.push(`${spec.id}: ${msg}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Rewrite planu.json with modern config
|
|
33
|
+
const planuConfigPath = join(projectPath, 'planu.json');
|
|
34
|
+
const planuConfig = createPlanuConfig();
|
|
35
|
+
await writeFile(planuConfigPath, serializePlanuConfig(planuConfig), 'utf-8');
|
|
36
|
+
return { migratedCount, errors };
|
|
37
|
+
}
|
|
38
|
+
async function migrateSingleSpec(projectPath, spec, deps) {
|
|
39
|
+
const oldSpecDir = dirname(join(projectPath, spec.specPath));
|
|
40
|
+
// Flatten: remove any subcategory between planu/specs/ and the spec folder.
|
|
41
|
+
// Legacy: docs/sdd/specs/{category}/{slug}/spec.md -> planu/specs/{slug}/spec.md
|
|
42
|
+
const newRelDir = flattenSpecPath(spec.specPath.replace(/docs\/sdd\/specs/, 'planu/specs').replace(/\/[^/]+$/, ''));
|
|
43
|
+
const newAbsDir = join(projectPath, newRelDir);
|
|
44
|
+
// Create target directory
|
|
45
|
+
await mkdir(newAbsDir, { recursive: true });
|
|
46
|
+
// Move and rename known files
|
|
47
|
+
const dirEntries = await safeReaddir(oldSpecDir);
|
|
48
|
+
for (const entry of dirEntries) {
|
|
49
|
+
const modernName = LEGACY_TO_MODERN_NAMES[entry] ?? entry;
|
|
50
|
+
const src = join(oldSpecDir, entry);
|
|
51
|
+
const dest = join(newAbsDir, modernName);
|
|
52
|
+
await rename(src, dest);
|
|
53
|
+
}
|
|
54
|
+
// Update spec paths in storage
|
|
55
|
+
const updates = {
|
|
56
|
+
specPath: rewritePath(spec.specPath),
|
|
57
|
+
technicalPath: rewritePath(spec.technicalPath),
|
|
58
|
+
};
|
|
59
|
+
if (spec.progressPath) {
|
|
60
|
+
updates.progressPath = rewritePath(spec.progressPath);
|
|
61
|
+
}
|
|
62
|
+
if (spec.executiveReportPath) {
|
|
63
|
+
updates.executiveReportPath = rewritePath(spec.executiveReportPath);
|
|
64
|
+
}
|
|
65
|
+
if (spec.technicalReportPath) {
|
|
66
|
+
updates.technicalReportPath = rewritePath(spec.technicalReportPath);
|
|
67
|
+
}
|
|
68
|
+
if (spec.planPath) {
|
|
69
|
+
updates.planPath = rewritePath(spec.planPath);
|
|
70
|
+
}
|
|
71
|
+
await deps.updateSpec(spec.projectId, spec.id, updates);
|
|
72
|
+
// Cleanup empty legacy directories
|
|
73
|
+
await cleanupEmptyDirs(oldSpecDir);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=legacy-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-migration.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/legacy-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { SpecMigrationResult } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate a migration result, returning whether it succeeded
|
|
4
|
+
* and a human-readable summary.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateMigrationResult(result: SpecMigrationResult): {
|
|
7
|
+
success: boolean;
|
|
8
|
+
summary: string;
|
|
9
|
+
hasErrors: boolean;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Merge two migration results into one.
|
|
13
|
+
* Useful when running multiple migration passes.
|
|
14
|
+
*/
|
|
15
|
+
export declare function mergeMigrationResults(a: SpecMigrationResult, b: SpecMigrationResult): SpecMigrationResult;
|
|
16
|
+
/**
|
|
17
|
+
* Build an empty migration result (zero migrations, no errors).
|
|
18
|
+
*/
|
|
19
|
+
export declare function emptyMigrationResult(): SpecMigrationResult;
|
|
20
|
+
//# sourceMappingURL=migration-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-validator.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/migration-validator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,GAAG;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB,CAeA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,EAAE,mBAAmB,EACtB,CAAC,EAAE,mBAAmB,GACrB,mBAAmB,CAKrB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,mBAAmB,CAE1D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// spec-migrator/migration-validator.ts — Validation logic for migration results
|
|
2
|
+
/**
|
|
3
|
+
* Validate a migration result, returning whether it succeeded
|
|
4
|
+
* and a human-readable summary.
|
|
5
|
+
*/
|
|
6
|
+
export function validateMigrationResult(result) {
|
|
7
|
+
const hasErrors = result.errors.length > 0;
|
|
8
|
+
const success = result.migratedCount > 0 || !hasErrors;
|
|
9
|
+
const parts = [];
|
|
10
|
+
if (result.migratedCount > 0) {
|
|
11
|
+
parts.push(`${result.migratedCount} spec(s) migrated`);
|
|
12
|
+
}
|
|
13
|
+
if (hasErrors) {
|
|
14
|
+
parts.push(`${result.errors.length} error(s): ${result.errors.join('; ')}`);
|
|
15
|
+
}
|
|
16
|
+
const summary = parts.length > 0 ? parts.join(', ') : 'nothing to migrate';
|
|
17
|
+
return { success, summary, hasErrors };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Merge two migration results into one.
|
|
21
|
+
* Useful when running multiple migration passes.
|
|
22
|
+
*/
|
|
23
|
+
export function mergeMigrationResults(a, b) {
|
|
24
|
+
return {
|
|
25
|
+
migratedCount: a.migratedCount + b.migratedCount,
|
|
26
|
+
errors: [...a.errors, ...b.errors],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build an empty migration result (zero migrations, no errors).
|
|
31
|
+
*/
|
|
32
|
+
export function emptyMigrationResult() {
|
|
33
|
+
return { migratedCount: 0, errors: [] };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=migration-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration-validator.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/migration-validator.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAIhF;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA2B;IAKjE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;IAEvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,mBAAmB,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAE3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,CAAsB,EACtB,CAAsB;IAEtB,OAAO;QACL,aAAa,EAAE,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,aAAa;QAChD,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const LEGACY_TO_MODERN_NAMES: Record<string, string>;
|
|
2
|
+
/**
|
|
3
|
+
* Rewrite a legacy spec file path to its modern equivalent.
|
|
4
|
+
* Handles docs/sdd/specs → planu/specs, legacy filenames, and flattening.
|
|
5
|
+
*/
|
|
6
|
+
export declare function rewritePath(path: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Flatten nested spec paths to the new flat structure.
|
|
9
|
+
* Converts `planu/specs/{category}/{slug}/file.md` to `planu/specs/{slug}/file.md`.
|
|
10
|
+
* Already-flat paths are returned unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function flattenSpecPath(p: string): string;
|
|
13
|
+
//# sourceMappingURL=path-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/path-utils.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIzD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAejD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// spec-migrator/path-utils.ts — Path rewriting and flattening utilities
|
|
2
|
+
export const LEGACY_TO_MODERN_NAMES = {
|
|
3
|
+
'HU.md': 'spec.md',
|
|
4
|
+
'FICHA-TECNICA.md': 'technical.md',
|
|
5
|
+
'PROGRESS.md': 'progress.md',
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Rewrite a legacy spec file path to its modern equivalent.
|
|
9
|
+
* Handles docs/sdd/specs → planu/specs, legacy filenames, and flattening.
|
|
10
|
+
*/
|
|
11
|
+
export function rewritePath(path) {
|
|
12
|
+
const modernized = path
|
|
13
|
+
.replace(/docs\/sdd\/specs/, 'planu/specs')
|
|
14
|
+
.replace(/\/HU\.md$/, '/spec.md')
|
|
15
|
+
.replace(/\/FICHA-TECNICA\.md$/, '/technical.md')
|
|
16
|
+
.replace(/\/PROGRESS\.md$/, '/progress.md');
|
|
17
|
+
return flattenSpecPath(modernized);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Flatten nested spec paths to the new flat structure.
|
|
21
|
+
* Converts `planu/specs/{category}/{slug}/file.md` to `planu/specs/{slug}/file.md`.
|
|
22
|
+
* Already-flat paths are returned unchanged.
|
|
23
|
+
*/
|
|
24
|
+
export function flattenSpecPath(p) {
|
|
25
|
+
// Match: planu/specs/{category}/{specFolder}[/rest]
|
|
26
|
+
// A spec folder starts with SPEC- or is the direct slug folder.
|
|
27
|
+
// We detect nesting by counting segments after planu/specs/.
|
|
28
|
+
const match = /^(planu\/specs\/)([^/]+)\/([^/]+)(\/.*)?$/.exec(p);
|
|
29
|
+
if (!match) {
|
|
30
|
+
return p;
|
|
31
|
+
}
|
|
32
|
+
const [, prefix, segment1, segment2, rest] = match;
|
|
33
|
+
// If segment1 is already a spec folder (starts with SPEC-), it's flat — no change.
|
|
34
|
+
if (segment1?.startsWith('SPEC-')) {
|
|
35
|
+
return p;
|
|
36
|
+
}
|
|
37
|
+
// segment1 is a subcategory — remove it, promote segment2 to direct child.
|
|
38
|
+
return `${prefix}${segment2}${rest ?? ''}`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=path-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/path-utils.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC5D,OAAO,EAAE,SAAS;IAClB,kBAAkB,EAAE,cAAc;IAClC,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,UAAU,GAAG,IAAI;SACpB,OAAO,CAAC,kBAAkB,EAAE,aAAa,CAAC;SAC1C,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;SAChC,OAAO,CAAC,sBAAsB,EAAE,eAAe,CAAC;SAChD,OAAO,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;IAC9C,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,oDAAoD;IACpD,gEAAgE;IAChE,6DAA6D;IAC7D,MAAM,KAAK,GAAG,2CAA2C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IACnD,mFAAmF;IACnF,IAAI,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,2EAA2E;IAC3E,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Spec, SpecMigrationResult, SpecMigrationDeps } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect specs whose folder name lacks the SPEC-XXX- prefix.
|
|
4
|
+
* E.g., folder is `planu/specs/login-form/` but should be `planu/specs/SPEC-012-login-form/`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function filterUnprefixedSpecs(specs: Spec[]): Spec[];
|
|
7
|
+
/**
|
|
8
|
+
* Rename spec folders on disk and update storage paths to include the SPEC-XXX- prefix.
|
|
9
|
+
*/
|
|
10
|
+
export declare function migrateSpecFolderNames(projectPath: string, specs: Spec[], deps: SpecMigrationDeps): Promise<SpecMigrationResult>;
|
|
11
|
+
//# sourceMappingURL=prefix-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix-migration.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/prefix-migration.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAMzF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAU3D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAsD9B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// spec-migrator/prefix-migration.ts — Add SPEC-XXX- prefix to spec folder names
|
|
2
|
+
import { rename, access } from 'node:fs/promises';
|
|
3
|
+
import { join, dirname } from 'node:path';
|
|
4
|
+
const SPEC_ID_PREFIX_RE = /^SPEC-\d{3,}/;
|
|
5
|
+
/**
|
|
6
|
+
* Detect specs whose folder name lacks the SPEC-XXX- prefix.
|
|
7
|
+
* E.g., folder is `planu/specs/login-form/` but should be `planu/specs/SPEC-012-login-form/`.
|
|
8
|
+
*/
|
|
9
|
+
export function filterUnprefixedSpecs(specs) {
|
|
10
|
+
return specs.filter((s) => {
|
|
11
|
+
if (!s.specPath) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const parts = s.specPath.split('/');
|
|
15
|
+
// The folder is the second-to-last segment (before spec.md)
|
|
16
|
+
const folder = parts[parts.length - 2];
|
|
17
|
+
return folder !== undefined && !SPEC_ID_PREFIX_RE.test(folder);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Rename spec folders on disk and update storage paths to include the SPEC-XXX- prefix.
|
|
22
|
+
*/
|
|
23
|
+
export async function migrateSpecFolderNames(projectPath, specs, deps) {
|
|
24
|
+
const errors = [];
|
|
25
|
+
let migratedCount = 0;
|
|
26
|
+
for (const spec of specs) {
|
|
27
|
+
try {
|
|
28
|
+
const oldDir = dirname(join(projectPath, spec.specPath));
|
|
29
|
+
const parentDir = dirname(oldDir);
|
|
30
|
+
const oldFolderName = oldDir.split('/').pop() ?? '';
|
|
31
|
+
const newFolderName = `${spec.id}-${oldFolderName}`;
|
|
32
|
+
const newDir = join(parentDir, newFolderName);
|
|
33
|
+
// Skip if already correct or target exists
|
|
34
|
+
if (oldFolderName.startsWith(spec.id)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await access(newDir);
|
|
39
|
+
continue; // Target already exists — skip
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
/* target doesn't exist — proceed */
|
|
43
|
+
}
|
|
44
|
+
await rename(oldDir, newDir);
|
|
45
|
+
// Update all path fields in storage
|
|
46
|
+
const rewrite = (p) => p.replace(`/${oldFolderName}/`, `/${newFolderName}/`);
|
|
47
|
+
const updates = { specPath: rewrite(spec.specPath) };
|
|
48
|
+
if (spec.technicalPath) {
|
|
49
|
+
updates.technicalPath = rewrite(spec.technicalPath);
|
|
50
|
+
}
|
|
51
|
+
if (spec.progressPath) {
|
|
52
|
+
updates.progressPath = rewrite(spec.progressPath);
|
|
53
|
+
}
|
|
54
|
+
if (spec.executiveReportPath) {
|
|
55
|
+
updates.executiveReportPath = rewrite(spec.executiveReportPath);
|
|
56
|
+
}
|
|
57
|
+
if (spec.technicalReportPath) {
|
|
58
|
+
updates.technicalReportPath = rewrite(spec.technicalReportPath);
|
|
59
|
+
}
|
|
60
|
+
if (spec.planPath) {
|
|
61
|
+
updates.planPath = rewrite(spec.planPath);
|
|
62
|
+
}
|
|
63
|
+
await deps.updateSpec(spec.projectId, spec.id, updates);
|
|
64
|
+
migratedCount++;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
68
|
+
errors.push(`${spec.id}: ${msg}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { migratedCount, errors };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=prefix-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefix-migration.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/prefix-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SpecMigrationDeps } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reconcile specs.json paths with actual filesystem locations.
|
|
4
|
+
* After discoverAndFlattenSpecs() renames/moves folders, specs.json may still
|
|
5
|
+
* reference old paths. This function detects broken paths and fixes them by
|
|
6
|
+
* scanning planu/specs/ for the matching SPEC-XXX folder.
|
|
7
|
+
*/
|
|
8
|
+
export declare function reconcileSpecPaths(projectPath: string, deps: SpecMigrationDeps, projectId: string): Promise<{
|
|
9
|
+
reconciledCount: number;
|
|
10
|
+
errors: string[];
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=reconcile-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-paths.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/reconcile-paths.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKpE;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAuExD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// spec-migrator/reconcile-paths.ts — Reconcile specs.json paths with filesystem
|
|
2
|
+
import { readdir, access } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Reconcile specs.json paths with actual filesystem locations.
|
|
6
|
+
* After discoverAndFlattenSpecs() renames/moves folders, specs.json may still
|
|
7
|
+
* reference old paths. This function detects broken paths and fixes them by
|
|
8
|
+
* scanning planu/specs/ for the matching SPEC-XXX folder.
|
|
9
|
+
*/
|
|
10
|
+
export async function reconcileSpecPaths(projectPath, deps, projectId) {
|
|
11
|
+
const specs = await deps.listSpecs(projectId);
|
|
12
|
+
const specsRoot = join(projectPath, 'planu/specs');
|
|
13
|
+
const errors = [];
|
|
14
|
+
let reconciledCount = 0;
|
|
15
|
+
// Build a map of actual folder names on disk for fast lookup
|
|
16
|
+
let entries;
|
|
17
|
+
try {
|
|
18
|
+
entries = await readdir(specsRoot, { withFileTypes: true });
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { reconciledCount: 0, errors: [] };
|
|
22
|
+
}
|
|
23
|
+
const diskFolders = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
24
|
+
for (const spec of specs) {
|
|
25
|
+
if (!spec.specPath) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// Check if current specPath exists on disk
|
|
29
|
+
const fullSpecPath = join(projectPath, spec.specPath);
|
|
30
|
+
try {
|
|
31
|
+
await access(fullSpecPath);
|
|
32
|
+
continue; // Path is valid — skip
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
/* path broken — needs reconciliation */
|
|
36
|
+
}
|
|
37
|
+
// Find the matching folder by SPEC ID prefix (e.g., SPEC-001-)
|
|
38
|
+
const matchingFolder = diskFolders.find((f) => f.startsWith(`${spec.id}-`));
|
|
39
|
+
if (!matchingFolder) {
|
|
40
|
+
continue; // No matching folder found — can't fix
|
|
41
|
+
}
|
|
42
|
+
// Build updated paths
|
|
43
|
+
const newFolder = `planu/specs/${matchingFolder}`;
|
|
44
|
+
const rewrite = (p) => {
|
|
45
|
+
// Replace the entire folder path portion, preserving the filename
|
|
46
|
+
const filename = p.split('/').pop() ?? '';
|
|
47
|
+
return `${newFolder}/${filename}`;
|
|
48
|
+
};
|
|
49
|
+
try {
|
|
50
|
+
const updates = {
|
|
51
|
+
specPath: rewrite(spec.specPath),
|
|
52
|
+
};
|
|
53
|
+
if (spec.technicalPath) {
|
|
54
|
+
updates.technicalPath = rewrite(spec.technicalPath);
|
|
55
|
+
}
|
|
56
|
+
if (spec.progressPath) {
|
|
57
|
+
updates.progressPath = rewrite(spec.progressPath);
|
|
58
|
+
}
|
|
59
|
+
if (spec.executiveReportPath) {
|
|
60
|
+
updates.executiveReportPath = rewrite(spec.executiveReportPath);
|
|
61
|
+
}
|
|
62
|
+
if (spec.technicalReportPath) {
|
|
63
|
+
updates.technicalReportPath = rewrite(spec.technicalReportPath);
|
|
64
|
+
}
|
|
65
|
+
if (spec.planPath) {
|
|
66
|
+
updates.planPath = rewrite(spec.planPath);
|
|
67
|
+
}
|
|
68
|
+
await deps.updateSpec(projectId, spec.id, updates);
|
|
69
|
+
reconciledCount++;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
errors.push(`${spec.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { reconciledCount, errors };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=reconcile-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile-paths.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/reconcile-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-detection.d.ts","sourceRoot":"","sources":["../../../src/engine/spec-migrator/version-detection.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS3E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// spec-migrator/version-detection.ts — Detect legacy config versions
|
|
2
|
+
import { access, readFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { isLegacyLocation } from '../planu-config-writer.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if a project path has a planu.json with legacy specLocation.
|
|
7
|
+
*/
|
|
8
|
+
export async function hasLegacyConfig(projectPath) {
|
|
9
|
+
try {
|
|
10
|
+
await access(join(projectPath, 'planu.json'));
|
|
11
|
+
const content = await readFile(join(projectPath, 'planu.json'), 'utf-8');
|
|
12
|
+
const config = JSON.parse(content);
|
|
13
|
+
return config.specLocation ? isLegacyLocation(config.specLocation) : false;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=version-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-detection.js","sourceRoot":"","sources":["../../../src/engine/spec-migrator/version-detection.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8B,CAAC;QAChE,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,59 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* Detect specs stored under a legacy location (docs/sdd/specs/).
|
|
4
|
-
* Caller provides the list of specs (from storage layer).
|
|
5
|
-
*/
|
|
6
|
-
export declare function filterLegacySpecs(specs: Spec[]): Spec[];
|
|
7
|
-
/**
|
|
8
|
-
* Migrate legacy specs to planu/specs/ with modern file naming.
|
|
9
|
-
* Moves files on disk and calls the provided updateSpec for each migrated spec.
|
|
10
|
-
* Also rewrites planu.json.
|
|
11
|
-
*/
|
|
12
|
-
export declare function migrateSpecs(projectPath: string, legacySpecs: Spec[], deps: SpecMigrationDeps): Promise<SpecMigrationResult>;
|
|
13
|
-
/**
|
|
14
|
-
* Import specs that exist on disk (planu/specs/) but are missing from the store.
|
|
15
|
-
* Reads frontmatter from each spec.md and creates a minimal Spec record in the store.
|
|
16
|
-
* This ensures list_specs returns ALL specs, not just those created via create_spec.
|
|
17
|
-
*/
|
|
18
|
-
export declare function importFilesystemSpecs(projectPath: string, deps: {
|
|
19
|
-
listSpecs: (projectId: string) => Promise<Spec[]>;
|
|
20
|
-
createSpec: (projectId: string, spec: Spec) => Promise<Spec>;
|
|
21
|
-
}, projectId: string): Promise<{
|
|
22
|
-
importedCount: number;
|
|
23
|
-
errors: string[];
|
|
24
|
-
}>;
|
|
25
|
-
/**
|
|
26
|
-
* Detect specs whose folder name lacks the SPEC-XXX- prefix.
|
|
27
|
-
* E.g., folder is `planu/specs/login-form/` but should be `planu/specs/SPEC-012-login-form/`.
|
|
28
|
-
*/
|
|
29
|
-
export declare function filterUnprefixedSpecs(specs: Spec[]): Spec[];
|
|
30
|
-
/**
|
|
31
|
-
* Rename spec folders on disk and update storage paths to include the SPEC-XXX- prefix.
|
|
32
|
-
*/
|
|
33
|
-
export declare function migrateSpecFolderNames(projectPath: string, specs: Spec[], deps: SpecMigrationDeps): Promise<SpecMigrationResult>;
|
|
34
|
-
/**
|
|
35
|
-
* Discover specs buried in subcategory folders and flatten them to planu/specs/{slug}/.
|
|
36
|
-
* Also converts old blockquote metadata to YAML frontmatter.
|
|
37
|
-
* This runs on init_project to fix specs created by older Planu versions.
|
|
38
|
-
*/
|
|
39
|
-
export declare function discoverAndFlattenSpecs(projectPath: string): Promise<{
|
|
40
|
-
flattenedCount: number;
|
|
41
|
-
convertedCount: number;
|
|
42
|
-
renamedCount: number;
|
|
43
|
-
errors: string[];
|
|
44
|
-
}>;
|
|
45
|
-
/**
|
|
46
|
-
* Reconcile specs.json paths with actual filesystem locations.
|
|
47
|
-
* After discoverAndFlattenSpecs() renames/moves folders, specs.json may still
|
|
48
|
-
* reference old paths. This function detects broken paths and fixes them by
|
|
49
|
-
* scanning planu/specs/ for the matching SPEC-XXX folder.
|
|
50
|
-
*/
|
|
51
|
-
export declare function reconcileSpecPaths(projectPath: string, deps: SpecMigrationDeps, projectId: string): Promise<{
|
|
52
|
-
reconciledCount: number;
|
|
53
|
-
errors: string[];
|
|
54
|
-
}>;
|
|
55
|
-
/**
|
|
56
|
-
* Check if a project path has a planu.json with legacy specLocation.
|
|
57
|
-
*/
|
|
58
|
-
export declare function hasLegacyConfig(projectPath: string): Promise<boolean>;
|
|
1
|
+
export * from './spec-migrator/index.js';
|
|
59
2
|
//# sourceMappingURL=spec-migrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-migrator.d.ts","sourceRoot":"","sources":["../../src/engine/spec-migrator.ts"],"names":[],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"spec-migrator.d.ts","sourceRoot":"","sources":["../../src/engine/spec-migrator.ts"],"names":[],"mappings":"AACA,cAAc,0BAA0B,CAAC"}
|