@devtrack-solution/codesdd 1.2.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/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +2751 -0
- package/.sdd/skills/curated/devtrack-api/SKILL.md +137 -0
- package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -0
- package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +381 -0
- package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +219 -0
- package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +359 -0
- package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +127 -0
- package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +207 -0
- package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +167 -0
- package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +334 -0
- package/LICENSE +21 -0
- package/README.md +842 -0
- package/bin/codesdd.js +10 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +560 -0
- package/dist/commands/change.d.ts +35 -0
- package/dist/commands/change.js +296 -0
- package/dist/commands/completion.d.ts +72 -0
- package/dist/commands/completion.js +258 -0
- package/dist/commands/config.d.ts +36 -0
- package/dist/commands/config.js +552 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.js +184 -0
- package/dist/commands/schema.d.ts +6 -0
- package/dist/commands/schema.js +870 -0
- package/dist/commands/sdd/execution.d.ts +3 -0
- package/dist/commands/sdd/execution.js +409 -0
- package/dist/commands/sdd/shared.d.ts +9 -0
- package/dist/commands/sdd/shared.js +84 -0
- package/dist/commands/sdd/skills.d.ts +3 -0
- package/dist/commands/sdd/skills.js +154 -0
- package/dist/commands/sdd.d.ts +3 -0
- package/dist/commands/sdd.js +769 -0
- package/dist/commands/show.d.ts +14 -0
- package/dist/commands/show.js +133 -0
- package/dist/commands/spec.d.ts +15 -0
- package/dist/commands/spec.js +228 -0
- package/dist/commands/validate.d.ts +24 -0
- package/dist/commands/validate.js +295 -0
- package/dist/commands/workflow/index.d.ts +17 -0
- package/dist/commands/workflow/index.js +12 -0
- package/dist/commands/workflow/instructions.d.ts +29 -0
- package/dist/commands/workflow/instructions.js +383 -0
- package/dist/commands/workflow/new-change.d.ts +11 -0
- package/dist/commands/workflow/new-change.js +45 -0
- package/dist/commands/workflow/schemas.d.ts +10 -0
- package/dist/commands/workflow/schemas.js +34 -0
- package/dist/commands/workflow/shared.d.ts +57 -0
- package/dist/commands/workflow/shared.js +117 -0
- package/dist/commands/workflow/status.d.ts +14 -0
- package/dist/commands/workflow/status.js +76 -0
- package/dist/commands/workflow/templates.d.ts +16 -0
- package/dist/commands/workflow/templates.js +68 -0
- package/dist/core/archive.d.ts +16 -0
- package/dist/core/archive.js +487 -0
- package/dist/core/artifact-graph/graph.d.ts +56 -0
- package/dist/core/artifact-graph/graph.js +141 -0
- package/dist/core/artifact-graph/index.d.ts +7 -0
- package/dist/core/artifact-graph/index.js +13 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
- package/dist/core/artifact-graph/instruction-loader.js +215 -0
- package/dist/core/artifact-graph/resolver.d.ts +81 -0
- package/dist/core/artifact-graph/resolver.js +258 -0
- package/dist/core/artifact-graph/schema.d.ts +13 -0
- package/dist/core/artifact-graph/schema.js +108 -0
- package/dist/core/artifact-graph/state.d.ts +12 -0
- package/dist/core/artifact-graph/state.js +54 -0
- package/dist/core/artifact-graph/types.d.ts +45 -0
- package/dist/core/artifact-graph/types.js +43 -0
- package/dist/core/available-tools.d.ts +16 -0
- package/dist/core/available-tools.js +30 -0
- package/dist/core/branding.d.ts +8 -0
- package/dist/core/branding.js +12 -0
- package/dist/core/cli/command-matrix.d.ts +23 -0
- package/dist/core/cli/command-matrix.js +123 -0
- package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
- package/dist/core/command-generation/adapters/amazon-q.js +26 -0
- package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
- package/dist/core/command-generation/adapters/antigravity.js +26 -0
- package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
- package/dist/core/command-generation/adapters/auggie.js +27 -0
- package/dist/core/command-generation/adapters/claude.d.ts +13 -0
- package/dist/core/command-generation/adapters/claude.js +50 -0
- package/dist/core/command-generation/adapters/cline.d.ts +14 -0
- package/dist/core/command-generation/adapters/cline.js +27 -0
- package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
- package/dist/core/command-generation/adapters/codebuddy.js +28 -0
- package/dist/core/command-generation/adapters/codex.d.ts +16 -0
- package/dist/core/command-generation/adapters/codex.js +39 -0
- package/dist/core/command-generation/adapters/continue.d.ts +13 -0
- package/dist/core/command-generation/adapters/continue.js +28 -0
- package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
- package/dist/core/command-generation/adapters/costrict.js +27 -0
- package/dist/core/command-generation/adapters/crush.d.ts +13 -0
- package/dist/core/command-generation/adapters/crush.js +30 -0
- package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
- package/dist/core/command-generation/adapters/cursor.js +44 -0
- package/dist/core/command-generation/adapters/factory.d.ts +13 -0
- package/dist/core/command-generation/adapters/factory.js +27 -0
- package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
- package/dist/core/command-generation/adapters/gemini.js +26 -0
- package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
- package/dist/core/command-generation/adapters/github-copilot.js +26 -0
- package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
- package/dist/core/command-generation/adapters/iflow.js +29 -0
- package/dist/core/command-generation/adapters/index.d.ts +29 -0
- package/dist/core/command-generation/adapters/index.js +29 -0
- package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/kilocode.js +23 -0
- package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
- package/dist/core/command-generation/adapters/kiro.js +26 -0
- package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
- package/dist/core/command-generation/adapters/opencode.js +29 -0
- package/dist/core/command-generation/adapters/pi.d.ts +14 -0
- package/dist/core/command-generation/adapters/pi.js +41 -0
- package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
- package/dist/core/command-generation/adapters/qoder.js +30 -0
- package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
- package/dist/core/command-generation/adapters/qwen.js +26 -0
- package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
- package/dist/core/command-generation/adapters/roocode.js +27 -0
- package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
- package/dist/core/command-generation/adapters/windsurf.js +51 -0
- package/dist/core/command-generation/generator.d.ts +21 -0
- package/dist/core/command-generation/generator.js +27 -0
- package/dist/core/command-generation/index.d.ts +22 -0
- package/dist/core/command-generation/index.js +24 -0
- package/dist/core/command-generation/registry.d.ts +36 -0
- package/dist/core/command-generation/registry.js +92 -0
- package/dist/core/command-generation/types.d.ts +56 -0
- package/dist/core/command-generation/types.js +8 -0
- package/dist/core/completions/command-registry.d.ts +7 -0
- package/dist/core/completions/command-registry.js +461 -0
- package/dist/core/completions/completion-provider.d.ts +60 -0
- package/dist/core/completions/completion-provider.js +102 -0
- package/dist/core/completions/factory.d.ts +64 -0
- package/dist/core/completions/factory.js +75 -0
- package/dist/core/completions/generators/bash-generator.d.ts +32 -0
- package/dist/core/completions/generators/bash-generator.js +174 -0
- package/dist/core/completions/generators/fish-generator.d.ts +32 -0
- package/dist/core/completions/generators/fish-generator.js +157 -0
- package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
- package/dist/core/completions/generators/powershell-generator.js +207 -0
- package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
- package/dist/core/completions/generators/zsh-generator.js +250 -0
- package/dist/core/completions/installers/bash-installer.d.ts +87 -0
- package/dist/core/completions/installers/bash-installer.js +318 -0
- package/dist/core/completions/installers/fish-installer.d.ts +43 -0
- package/dist/core/completions/installers/fish-installer.js +143 -0
- package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
- package/dist/core/completions/installers/powershell-installer.js +327 -0
- package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
- package/dist/core/completions/installers/zsh-installer.js +452 -0
- package/dist/core/completions/templates/bash-templates.d.ts +6 -0
- package/dist/core/completions/templates/bash-templates.js +24 -0
- package/dist/core/completions/templates/fish-templates.d.ts +7 -0
- package/dist/core/completions/templates/fish-templates.js +39 -0
- package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
- package/dist/core/completions/templates/powershell-templates.js +25 -0
- package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
- package/dist/core/completions/templates/zsh-templates.js +36 -0
- package/dist/core/completions/types.d.ts +79 -0
- package/dist/core/completions/types.js +2 -0
- package/dist/core/config-prompts.d.ts +9 -0
- package/dist/core/config-prompts.js +34 -0
- package/dist/core/config-schema.d.ts +86 -0
- package/dist/core/config-schema.js +213 -0
- package/dist/core/config.d.ts +17 -0
- package/dist/core/config.js +33 -0
- package/dist/core/converters/json-converter.d.ts +6 -0
- package/dist/core/converters/json-converter.js +51 -0
- package/dist/core/global-config.d.ts +44 -0
- package/dist/core/global-config.js +125 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/init.d.ts +36 -0
- package/dist/core/init.js +576 -0
- package/dist/core/legacy-cleanup.d.ts +162 -0
- package/dist/core/legacy-cleanup.js +512 -0
- package/dist/core/list.d.ts +9 -0
- package/dist/core/list.js +173 -0
- package/dist/core/migration.d.ts +23 -0
- package/dist/core/migration.js +108 -0
- package/dist/core/parsers/change-parser.d.ts +13 -0
- package/dist/core/parsers/change-parser.js +193 -0
- package/dist/core/parsers/markdown-parser.d.ts +22 -0
- package/dist/core/parsers/markdown-parser.js +187 -0
- package/dist/core/parsers/requirement-blocks.d.ts +37 -0
- package/dist/core/parsers/requirement-blocks.js +201 -0
- package/dist/core/profile-sync-drift.d.ts +38 -0
- package/dist/core/profile-sync-drift.js +201 -0
- package/dist/core/profiles.d.ts +26 -0
- package/dist/core/profiles.js +41 -0
- package/dist/core/project-config.d.ts +64 -0
- package/dist/core/project-config.js +223 -0
- package/dist/core/schemas/base.schema.d.ts +13 -0
- package/dist/core/schemas/base.schema.js +13 -0
- package/dist/core/schemas/change.schema.d.ts +73 -0
- package/dist/core/schemas/change.schema.js +31 -0
- package/dist/core/schemas/index.d.ts +4 -0
- package/dist/core/schemas/index.js +4 -0
- package/dist/core/schemas/spec.schema.d.ts +18 -0
- package/dist/core/schemas/spec.schema.js +15 -0
- package/dist/core/sdd/adr-policy.d.ts +7 -0
- package/dist/core/sdd/adr-policy.js +47 -0
- package/dist/core/sdd/adr.d.ts +4 -0
- package/dist/core/sdd/adr.js +27 -0
- package/dist/core/sdd/bootstrap.d.ts +28 -0
- package/dist/core/sdd/bootstrap.js +353 -0
- package/dist/core/sdd/check.d.ts +51 -0
- package/dist/core/sdd/check.js +831 -0
- package/dist/core/sdd/coordination/coordination-adapters.d.ts +73 -0
- package/dist/core/sdd/coordination/coordination-adapters.js +87 -0
- package/dist/core/sdd/coordination/index.d.ts +2 -0
- package/dist/core/sdd/coordination/index.js +2 -0
- package/dist/core/sdd/dedup.d.ts +23 -0
- package/dist/core/sdd/dedup.js +62 -0
- package/dist/core/sdd/default-bootstrap-files.d.ts +23 -0
- package/dist/core/sdd/default-bootstrap-files.js +385 -0
- package/dist/core/sdd/default-skills.d.ts +16 -0
- package/dist/core/sdd/default-skills.js +427 -0
- package/dist/core/sdd/diagnose.d.ts +25 -0
- package/dist/core/sdd/diagnose.js +1312 -0
- package/dist/core/sdd/docs-sync.d.ts +21 -0
- package/dist/core/sdd/docs-sync.js +231 -0
- package/dist/core/sdd/domain/helpers.d.ts +6 -0
- package/dist/core/sdd/domain/helpers.js +37 -0
- package/dist/core/sdd/domain/lifecycle-guardrails.d.ts +22 -0
- package/dist/core/sdd/domain/lifecycle-guardrails.js +31 -0
- package/dist/core/sdd/domain/lifecycle-hooks.d.ts +16 -0
- package/dist/core/sdd/domain/lifecycle-hooks.js +27 -0
- package/dist/core/sdd/domain/post-active-validation.d.ts +15 -0
- package/dist/core/sdd/domain/post-active-validation.js +71 -0
- package/dist/core/sdd/domain/traceability.d.ts +8 -0
- package/dist/core/sdd/domain/traceability.js +83 -0
- package/dist/core/sdd/domain/transition-engine.d.ts +49 -0
- package/dist/core/sdd/domain/transition-engine.js +120 -0
- package/dist/core/sdd/fingerprint.d.ts +23 -0
- package/dist/core/sdd/fingerprint.js +146 -0
- package/dist/core/sdd/import-openspec.d.ts +31 -0
- package/dist/core/sdd/import-openspec.js +232 -0
- package/dist/core/sdd/init.d.ts +36 -0
- package/dist/core/sdd/init.js +65 -0
- package/dist/core/sdd/json-schema.d.ts +6 -0
- package/dist/core/sdd/json-schema.js +59 -0
- package/dist/core/sdd/legacy-operations.d.ts +286 -0
- package/dist/core/sdd/legacy-operations.js +2175 -0
- package/dist/core/sdd/lenses.d.ts +14 -0
- package/dist/core/sdd/lenses.js +97 -0
- package/dist/core/sdd/merge-catalog.d.ts +9 -0
- package/dist/core/sdd/merge-catalog.js +70 -0
- package/dist/core/sdd/migrate-workspace.d.ts +36 -0
- package/dist/core/sdd/migrate-workspace.js +344 -0
- package/dist/core/sdd/migrate.d.ts +24 -0
- package/dist/core/sdd/migrate.js +385 -0
- package/dist/core/sdd/resolve-project-root.d.ts +15 -0
- package/dist/core/sdd/resolve-project-root.js +46 -0
- package/dist/core/sdd/root-resolver.d.ts +16 -0
- package/dist/core/sdd/root-resolver.js +62 -0
- package/dist/core/sdd/sanitize.d.ts +35 -0
- package/dist/core/sdd/sanitize.js +750 -0
- package/dist/core/sdd/services/approve.service.d.ts +20 -0
- package/dist/core/sdd/services/approve.service.js +82 -0
- package/dist/core/sdd/services/audit.service.d.ts +53 -0
- package/dist/core/sdd/services/audit.service.js +136 -0
- package/dist/core/sdd/services/breakdown.service.d.ts +35 -0
- package/dist/core/sdd/services/breakdown.service.js +185 -0
- package/dist/core/sdd/services/context.service.d.ts +346 -0
- package/dist/core/sdd/services/context.service.js +278 -0
- package/dist/core/sdd/services/debate.service.d.ts +16 -0
- package/dist/core/sdd/services/debate.service.js +73 -0
- package/dist/core/sdd/services/decide.service.d.ts +23 -0
- package/dist/core/sdd/services/decide.service.js +81 -0
- package/dist/core/sdd/services/dedup-apply.service.d.ts +39 -0
- package/dist/core/sdd/services/dedup-apply.service.js +259 -0
- package/dist/core/sdd/services/feature-lint.service.d.ts +29 -0
- package/dist/core/sdd/services/feature-lint.service.js +146 -0
- package/dist/core/sdd/services/finalize.service.d.ts +33 -0
- package/dist/core/sdd/services/finalize.service.js +707 -0
- package/dist/core/sdd/services/frontend-gap.service.d.ts +23 -0
- package/dist/core/sdd/services/frontend-gap.service.js +117 -0
- package/dist/core/sdd/services/frontend-impact.service.d.ts +19 -0
- package/dist/core/sdd/services/frontend-impact.service.js +46 -0
- package/dist/core/sdd/services/ingest-deposito.service.d.ts +32 -0
- package/dist/core/sdd/services/ingest-deposito.service.js +231 -0
- package/dist/core/sdd/services/insight.service.d.ts +21 -0
- package/dist/core/sdd/services/insight.service.js +81 -0
- package/dist/core/sdd/services/legacy-capability.service.d.ts +24 -0
- package/dist/core/sdd/services/legacy-capability.service.js +59 -0
- package/dist/core/sdd/services/mcp-runtime.service.d.ts +42 -0
- package/dist/core/sdd/services/mcp-runtime.service.js +144 -0
- package/dist/core/sdd/services/metrics.service.d.ts +49 -0
- package/dist/core/sdd/services/metrics.service.js +181 -0
- package/dist/core/sdd/services/next.service.d.ts +35 -0
- package/dist/core/sdd/services/next.service.js +54 -0
- package/dist/core/sdd/services/onboard.service.d.ts +9 -0
- package/dist/core/sdd/services/onboard.service.js +165 -0
- package/dist/core/sdd/services/rebuild.service.d.ts +31 -0
- package/dist/core/sdd/services/rebuild.service.js +482 -0
- package/dist/core/sdd/services/scan-naming.service.d.ts +43 -0
- package/dist/core/sdd/services/scan-naming.service.js +246 -0
- package/dist/core/sdd/services/skills-invoke.service.d.ts +24 -0
- package/dist/core/sdd/services/skills-invoke.service.js +63 -0
- package/dist/core/sdd/services/skills-sync.service.d.ts +15 -0
- package/dist/core/sdd/services/skills-sync.service.js +117 -0
- package/dist/core/sdd/services/start.service.d.ts +26 -0
- package/dist/core/sdd/services/start.service.js +237 -0
- package/dist/core/sdd/skills.d.ts +15 -0
- package/dist/core/sdd/skills.js +46 -0
- package/dist/core/sdd/state-lock.d.ts +19 -0
- package/dist/core/sdd/state-lock.js +144 -0
- package/dist/core/sdd/state.d.ts +155 -0
- package/dist/core/sdd/state.js +1000 -0
- package/dist/core/sdd/store/in-memory-adapter.d.ts +12 -0
- package/dist/core/sdd/store/in-memory-adapter.js +27 -0
- package/dist/core/sdd/store/index.d.ts +5 -0
- package/dist/core/sdd/store/index.js +5 -0
- package/dist/core/sdd/store/sdd-stores.d.ts +25 -0
- package/dist/core/sdd/store/sdd-stores.js +59 -0
- package/dist/core/sdd/store/state-store.d.ts +32 -0
- package/dist/core/sdd/store/state-store.js +2 -0
- package/dist/core/sdd/store/yaml-file-adapter.d.ts +12 -0
- package/dist/core/sdd/store/yaml-file-adapter.js +43 -0
- package/dist/core/sdd/structural-health.d.ts +557 -0
- package/dist/core/sdd/structural-health.js +187 -0
- package/dist/core/sdd/transaction.d.ts +14 -0
- package/dist/core/sdd/transaction.js +100 -0
- package/dist/core/sdd/types.d.ts +1570 -0
- package/dist/core/sdd/types.js +617 -0
- package/dist/core/sdd/views.d.ts +3 -0
- package/dist/core/sdd/views.js +560 -0
- package/dist/core/sdd/workspace-schemas.d.ts +620 -0
- package/dist/core/sdd/workspace-schemas.js +254 -0
- package/dist/core/sdd/write-manifest.d.ts +25 -0
- package/dist/core/sdd/write-manifest.js +353 -0
- package/dist/core/shared/index.d.ts +8 -0
- package/dist/core/shared/index.js +8 -0
- package/dist/core/shared/skill-generation.d.ts +49 -0
- package/dist/core/shared/skill-generation.js +106 -0
- package/dist/core/shared/tool-detection.d.ts +71 -0
- package/dist/core/shared/tool-detection.js +158 -0
- package/dist/core/specs-apply.d.ts +73 -0
- package/dist/core/specs-apply.js +385 -0
- package/dist/core/styles/palette.d.ts +7 -0
- package/dist/core/styles/palette.js +8 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.js +9 -0
- package/dist/core/templates/skill-templates.d.ts +20 -0
- package/dist/core/templates/skill-templates.js +19 -0
- package/dist/core/templates/types.d.ts +19 -0
- package/dist/core/templates/types.js +5 -0
- package/dist/core/templates/workflows/apply-change.d.ts +10 -0
- package/dist/core/templates/workflows/apply-change.js +308 -0
- package/dist/core/templates/workflows/archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/archive-change.js +277 -0
- package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
- package/dist/core/templates/workflows/bulk-archive-change.js +502 -0
- package/dist/core/templates/workflows/continue-change.d.ts +10 -0
- package/dist/core/templates/workflows/continue-change.js +232 -0
- package/dist/core/templates/workflows/explore.d.ts +10 -0
- package/dist/core/templates/workflows/explore.js +475 -0
- package/dist/core/templates/workflows/feedback.d.ts +9 -0
- package/dist/core/templates/workflows/feedback.js +108 -0
- package/dist/core/templates/workflows/ff-change.d.ts +10 -0
- package/dist/core/templates/workflows/ff-change.js +206 -0
- package/dist/core/templates/workflows/new-change.d.ts +10 -0
- package/dist/core/templates/workflows/new-change.js +151 -0
- package/dist/core/templates/workflows/onboard.d.ts +10 -0
- package/dist/core/templates/workflows/onboard.js +573 -0
- package/dist/core/templates/workflows/propose.d.ts +10 -0
- package/dist/core/templates/workflows/propose.js +224 -0
- package/dist/core/templates/workflows/sdd.d.ts +10 -0
- package/dist/core/templates/workflows/sdd.js +107 -0
- package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
- package/dist/core/templates/workflows/sync-specs.js +286 -0
- package/dist/core/templates/workflows/verify-change.d.ts +10 -0
- package/dist/core/templates/workflows/verify-change.js +346 -0
- package/dist/core/update.d.ts +77 -0
- package/dist/core/update.js +538 -0
- package/dist/core/validation/constants.d.ts +34 -0
- package/dist/core/validation/constants.js +40 -0
- package/dist/core/validation/types.d.ts +18 -0
- package/dist/core/validation/types.js +2 -0
- package/dist/core/validation/validator.d.ts +33 -0
- package/dist/core/validation/validator.js +409 -0
- package/dist/core/view.d.ts +8 -0
- package/dist/core/view.js +170 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/prompts/searchable-multi-select.d.ts +28 -0
- package/dist/prompts/searchable-multi-select.js +159 -0
- package/dist/telemetry/config.d.ts +32 -0
- package/dist/telemetry/config.js +68 -0
- package/dist/telemetry/index.d.ts +44 -0
- package/dist/telemetry/index.js +207 -0
- package/dist/ui/ascii-patterns.d.ts +16 -0
- package/dist/ui/ascii-patterns.js +133 -0
- package/dist/ui/welcome-screen.d.ts +10 -0
- package/dist/ui/welcome-screen.js +146 -0
- package/dist/utils/change-metadata.d.ts +51 -0
- package/dist/utils/change-metadata.js +147 -0
- package/dist/utils/change-utils.d.ts +62 -0
- package/dist/utils/change-utils.js +121 -0
- package/dist/utils/command-references.d.ts +18 -0
- package/dist/utils/command-references.js +20 -0
- package/dist/utils/file-system.d.ts +36 -0
- package/dist/utils/file-system.js +281 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/interactive.d.ts +18 -0
- package/dist/utils/interactive.js +21 -0
- package/dist/utils/item-discovery.d.ts +4 -0
- package/dist/utils/item-discovery.js +73 -0
- package/dist/utils/match.d.ts +3 -0
- package/dist/utils/match.js +22 -0
- package/dist/utils/openspec-compat.d.ts +2 -0
- package/dist/utils/openspec-compat.js +2 -0
- package/dist/utils/shell-detection.d.ts +20 -0
- package/dist/utils/shell-detection.js +41 -0
- package/dist/utils/task-progress.d.ts +8 -0
- package/dist/utils/task-progress.js +36 -0
- package/package.json +111 -0
- package/schemas/sdd/1-spec.schema.json +221 -0
- package/schemas/sdd/2-plan.schema.json +199 -0
- package/schemas/sdd/3-tasks.schema.json +102 -0
- package/schemas/sdd/4-changelog.schema.json +55 -0
- package/schemas/sdd/5-quality.schema.json +427 -0
- package/schemas/sdd/workspace-catalog.schema.json +1012 -0
- package/schemas/spec-driven/schema.yaml +153 -0
- package/schemas/spec-driven/templates/design.md +19 -0
- package/schemas/spec-driven/templates/proposal.md +23 -0
- package/schemas/spec-driven/templates/spec.md +8 -0
- package/schemas/spec-driven/templates/tasks.md +9 -0
|
@@ -0,0 +1,769 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { SddInitCommand, SddInitContextCommand } from '../core/sdd/init.js';
|
|
5
|
+
import { SddCheckCommand } from '../core/sdd/check.js';
|
|
6
|
+
import { loadProjectSddConfig, resolveSddPaths, } from '../core/sdd/state.js';
|
|
7
|
+
import { assessSddMigration, SddMigrateCommand } from '../core/sdd/migrate.js';
|
|
8
|
+
import { MigrateWorkspaceCommand } from '../core/sdd/migrate-workspace.js';
|
|
9
|
+
import { SddImportOpenSpecCommand } from '../core/sdd/import-openspec.js';
|
|
10
|
+
import { isInteractive } from '../utils/interactive.js';
|
|
11
|
+
import { createSddStores } from "../core/sdd/store/sdd-stores.js";
|
|
12
|
+
import { InsightService } from "../core/sdd/services/insight.service.js";
|
|
13
|
+
import { IngestDepositoService } from "../core/sdd/services/ingest-deposito.service.js";
|
|
14
|
+
import { DebateService } from "../core/sdd/services/debate.service.js";
|
|
15
|
+
import { DecideService } from "../core/sdd/services/decide.service.js";
|
|
16
|
+
import { BreakdownService } from "../core/sdd/services/breakdown.service.js";
|
|
17
|
+
import { FrontendGapService } from "../core/sdd/services/frontend-gap.service.js";
|
|
18
|
+
import { SddDiagnoseCommand, formatDiagnosticText } from "../core/sdd/diagnose.js";
|
|
19
|
+
import { SddSanitizeCommand, formatSanitizerText } from "../core/sdd/sanitize.js";
|
|
20
|
+
import { ScanNamingService, formatScanNamingReport } from "../core/sdd/services/scan-naming.service.js";
|
|
21
|
+
import { SddRebuildService, formatSddRebuildReport } from "../core/sdd/services/rebuild.service.js";
|
|
22
|
+
import { SddMetricsService, formatSddMetricsReport } from "../core/sdd/services/metrics.service.js";
|
|
23
|
+
import { FeatureLintService, formatFeatureLintReport } from "../core/sdd/services/feature-lint.service.js";
|
|
24
|
+
import { SddDedupApplyService, formatSddDedupApplyReport } from "../core/sdd/services/dedup-apply.service.js";
|
|
25
|
+
import { captureFingerprintsForChange, writeMeta } from '../core/sdd/fingerprint.js';
|
|
26
|
+
import { ensureMandatorySddMigration, parseCsvOption, parseFlowModeOption, parseLangOption, parseLayoutOption, resolveRoot, } from './sdd/shared.js';
|
|
27
|
+
import { registerExecutionCommands } from './sdd/execution.js';
|
|
28
|
+
import { registerSkillsCommands } from './sdd/skills.js';
|
|
29
|
+
import { displayLegacyOpenSpecPath, resolveOpenSpecSubpath, } from '../core/sdd/services/legacy-capability.service.js';
|
|
30
|
+
export function registerSddCommand(program) {
|
|
31
|
+
const sddCmd = program.command('sdd').description('SDD memory operations');
|
|
32
|
+
sddCmd
|
|
33
|
+
.command('init [path]')
|
|
34
|
+
.description('Initializes the .sdd structure and base state files')
|
|
35
|
+
.alias('iniciar')
|
|
36
|
+
.option('--frontend', 'Enables frontend state files and generated views')
|
|
37
|
+
.option('--lang <lang>', 'SDD language: pt-BR|en-US')
|
|
38
|
+
.option('--layout <layout>', 'Folder layout: en-US|legacy|pt-BR')
|
|
39
|
+
.option('--no-render', 'Does not generate Markdown views after initialization')
|
|
40
|
+
.action(async (targetPath = '.', options) => {
|
|
41
|
+
const root = resolveRoot(targetPath);
|
|
42
|
+
const __config = await loadProjectSddConfig(root);
|
|
43
|
+
const __paths = resolveSddPaths(root, __config);
|
|
44
|
+
const stores = createSddStores(__paths);
|
|
45
|
+
const command = new SddInitCommand();
|
|
46
|
+
const result = await command.execute(root, {
|
|
47
|
+
frontendEnabled: options?.frontend,
|
|
48
|
+
language: parseLangOption(options?.lang),
|
|
49
|
+
layout: parseLayoutOption(options?.layout),
|
|
50
|
+
render: options?.render,
|
|
51
|
+
});
|
|
52
|
+
console.log(chalk.green('SDD initialized successfully.'));
|
|
53
|
+
console.log(`Memory directory: ${result.memoryDir}`);
|
|
54
|
+
if (options?.lang) {
|
|
55
|
+
console.log(`Language: ${options.lang}`);
|
|
56
|
+
}
|
|
57
|
+
if (options?.layout) {
|
|
58
|
+
console.log(`Layout: ${options.layout}`);
|
|
59
|
+
}
|
|
60
|
+
console.log(`Frontend module: ${result.frontendEnabled ? 'enabled' : 'disabled'}`);
|
|
61
|
+
console.log(`Views generated: ${result.rendered ? 'yes' : 'no'}`);
|
|
62
|
+
console.log(`Curated skills loaded: ${result.skillsSeeded}`);
|
|
63
|
+
console.log(`Local skills generated: ${result.localSkillsMaterialized}`);
|
|
64
|
+
console.log(`Tools synced: ${result.syncedTools.length > 0 ? result.syncedTools.join(', ') : 'none detected'}`);
|
|
65
|
+
});
|
|
66
|
+
sddCmd
|
|
67
|
+
.command('init-context [path]')
|
|
68
|
+
.description('Inspeciona repositorio existente e preenche contexto inicial canônico')
|
|
69
|
+
.alias('iniciar-contexto')
|
|
70
|
+
.option('--mode <mode>', 'Modo de escrita: merge|replace (padrao: merge)')
|
|
71
|
+
.option('--no-deep', 'Desativa inspecao profunda de estrutura de repositorio')
|
|
72
|
+
.option('--no-render', 'Nao gera views apos bootstrap de contexto')
|
|
73
|
+
.option('--json', 'Saida em JSON')
|
|
74
|
+
.action(async (targetPath = '.', options) => {
|
|
75
|
+
const root = resolveRoot(targetPath);
|
|
76
|
+
const __config = await loadProjectSddConfig(root);
|
|
77
|
+
const __paths = resolveSddPaths(root, __config);
|
|
78
|
+
const stores = createSddStores(__paths);
|
|
79
|
+
if (options?.mode && options.mode !== 'merge' && options.mode !== 'replace') {
|
|
80
|
+
throw new Error('Valor invalido em --mode. Use merge ou replace.');
|
|
81
|
+
}
|
|
82
|
+
const command = new SddInitContextCommand();
|
|
83
|
+
const result = await command.execute(root, {
|
|
84
|
+
mode: options?.mode,
|
|
85
|
+
deep: options?.deep,
|
|
86
|
+
render: options?.render,
|
|
87
|
+
});
|
|
88
|
+
if (options?.json) {
|
|
89
|
+
console.log(JSON.stringify(result, null, 2));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
console.log(chalk.green('Contexto inicial bootstrapado com sucesso.'));
|
|
93
|
+
console.log(`Diretorio de memoria: ${result.memoryDir}`);
|
|
94
|
+
console.log(`Views geradas: ${result.rendered ? 'sim' : 'nao'}`);
|
|
95
|
+
console.log(`Projeto detectado: ${result.sddBootstrap.detected.package_name}`);
|
|
96
|
+
console.log(`Detectado: stack=${result.sddBootstrap.detected.tech_stack_count}, repo-map=${result.sddBootstrap.detected.repo_map_count}, servicos=${result.sddBootstrap.detected.service_catalog_count}`);
|
|
97
|
+
console.log(`Atualizado: stack=${result.sddBootstrap.updated.tech_stack ? 'sim' : 'nao'}, repo-map=${result.sddBootstrap.updated.repo_map ? 'sim' : 'nao'}, arquitetura=${result.sddBootstrap.updated.architecture ? 'sim' : 'nao'}, servicos=${result.sddBootstrap.updated.service_catalog ? 'sim' : 'nao'}, contratos=${result.sddBootstrap.updated.integration_contracts ? 'sim' : 'nao'}`);
|
|
98
|
+
if (result.sddBootstrap.notes.length > 0) {
|
|
99
|
+
console.log(`Notas: ${result.sddBootstrap.notes.join(' | ')}`);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
sddCmd
|
|
103
|
+
.command('fingerprint')
|
|
104
|
+
.description('Gerencia fingerprints de requisitos de changes ativos')
|
|
105
|
+
.option('--backfill', 'Recalcula meta.json para changes ativos')
|
|
106
|
+
.option('--ref <changeId>', 'Executa o backfill apenas para um change específico')
|
|
107
|
+
.action(async (options) => {
|
|
108
|
+
const root = resolveRoot();
|
|
109
|
+
const __config = await loadProjectSddConfig(root);
|
|
110
|
+
const __paths = resolveSddPaths(root, __config);
|
|
111
|
+
void createSddStores(__paths);
|
|
112
|
+
await ensureMandatorySddMigration(root);
|
|
113
|
+
if (!options?.backfill) {
|
|
114
|
+
throw new Error('Use --backfill para executar esta operação.');
|
|
115
|
+
}
|
|
116
|
+
const changeRoot = resolveOpenSpecSubpath(root, 'changes');
|
|
117
|
+
const mainSpecsDir = resolveOpenSpecSubpath(root, 'specs');
|
|
118
|
+
await fs.access(changeRoot);
|
|
119
|
+
let changeIds;
|
|
120
|
+
if (options?.ref) {
|
|
121
|
+
if (!/^FEAT-\d{4,}$/i.test(options.ref)) {
|
|
122
|
+
throw new Error('Use o formato FEAT-#### em --ref.');
|
|
123
|
+
}
|
|
124
|
+
const requestedChangeDir = path.join(changeRoot, options.ref);
|
|
125
|
+
const stat = await fs.stat(requestedChangeDir);
|
|
126
|
+
if (!stat.isDirectory()) {
|
|
127
|
+
throw new Error(`Change '${options.ref}' nao encontrado em ${displayLegacyOpenSpecPath('changes')}`);
|
|
128
|
+
}
|
|
129
|
+
changeIds = [options.ref];
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const entries = await fs.readdir(changeRoot, { withFileTypes: true });
|
|
133
|
+
changeIds = entries
|
|
134
|
+
.filter((entry) => entry.isDirectory() && entry.name !== 'archive')
|
|
135
|
+
.map((entry) => entry.name)
|
|
136
|
+
.sort();
|
|
137
|
+
}
|
|
138
|
+
if (changeIds.length === 0) {
|
|
139
|
+
console.log('Nenhum change ativo encontrado para backfill.');
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
let processed = 0;
|
|
143
|
+
for (const changeId of changeIds) {
|
|
144
|
+
const changeDir = path.join(changeRoot, changeId);
|
|
145
|
+
const meta = await captureFingerprintsForChange(changeDir, mainSpecsDir, {
|
|
146
|
+
sourceChangeId: changeId,
|
|
147
|
+
});
|
|
148
|
+
await writeMeta(changeDir, meta);
|
|
149
|
+
processed += 1;
|
|
150
|
+
console.log(`Fingerprint backfill: ${changeId} (${meta.requirements.length} requirements)`);
|
|
151
|
+
}
|
|
152
|
+
if (processed > 0) {
|
|
153
|
+
console.log(`Fingerprint backfill concluido: ${processed} change(s) processado(s).`);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
sddCmd
|
|
157
|
+
.command('insight <texto>')
|
|
158
|
+
.description('Registra um insight no funil de descoberta do SDD')
|
|
159
|
+
.alias('ideia')
|
|
160
|
+
.option('--title <title>', 'Titulo curto do insight')
|
|
161
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
162
|
+
.action(async (texto, options) => {
|
|
163
|
+
const root = resolveRoot();
|
|
164
|
+
const __config = await loadProjectSddConfig(root);
|
|
165
|
+
const __paths = resolveSddPaths(root, __config);
|
|
166
|
+
const stores = createSddStores(__paths);
|
|
167
|
+
await ensureMandatorySddMigration(root);
|
|
168
|
+
const command = new InsightService(stores);
|
|
169
|
+
const result = await command.execute(root, texto, {
|
|
170
|
+
title: options?.title,
|
|
171
|
+
render: options?.render,
|
|
172
|
+
});
|
|
173
|
+
console.log(chalk.green(`${result.reused ? 'Insight existente' : 'Insight criado'}: ${result.id}`));
|
|
174
|
+
console.log(`Titulo: ${result.title}`);
|
|
175
|
+
console.log(`Arquivo: ${result.filePath}`);
|
|
176
|
+
for (const warning of result.warnings) {
|
|
177
|
+
console.log(chalk.yellow(`Aviso: ${warning.message}`));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
sddCmd
|
|
181
|
+
.command('ingest-deposito')
|
|
182
|
+
.description('Scans sources, indexes raw material, and generates the initial executable trail')
|
|
183
|
+
.alias('ingestao-deposito')
|
|
184
|
+
.alias('ingest')
|
|
185
|
+
.option('--source-dir <path>', 'Source directory (default: .sdd/sources in en-US layout)')
|
|
186
|
+
.option('--title <title>', 'Initial EPIC title when --epic/--radar is not provided')
|
|
187
|
+
.option('--epic <epicId>', 'Reuse an existing EPIC (EPIC-####)')
|
|
188
|
+
.option('--radar <radarId>', 'Reuse a legacy RAD alias (RAD-###)')
|
|
189
|
+
.option('--titles <list>', 'Comma-separated FEAT titles')
|
|
190
|
+
.option('--scale <scale>', 'Scale QUICK|STANDARD|LARGE')
|
|
191
|
+
.option('--flow-mode <flowMode>', 'Started FEAT flow: direct|standard|rigorous')
|
|
192
|
+
.option('--fluxo <flowMode>', 'Legacy Portuguese alias for --flow-mode')
|
|
193
|
+
.option('--no-start', 'Does not automatically start the first ready FEAT')
|
|
194
|
+
.option('--json', 'JSON output')
|
|
195
|
+
.option('--no-render', 'Does not generate views after updating state')
|
|
196
|
+
.action(async (options) => {
|
|
197
|
+
const root = resolveRoot();
|
|
198
|
+
const __config = await loadProjectSddConfig(root);
|
|
199
|
+
const __paths = resolveSddPaths(root, __config);
|
|
200
|
+
const stores = createSddStores(__paths);
|
|
201
|
+
await ensureMandatorySddMigration(root);
|
|
202
|
+
const flow = parseFlowModeOption(options?.flowMode || options?.fluxo);
|
|
203
|
+
const epicRef = options?.epic || options?.radar;
|
|
204
|
+
if (epicRef && !/^(?:RAD|EPIC)-\d{3,}$/.test(epicRef)) {
|
|
205
|
+
throw new Error('Invalid --epic/--radar value. Use EPIC-#### or RAD-###.');
|
|
206
|
+
}
|
|
207
|
+
const command = new IngestDepositoService(stores);
|
|
208
|
+
const result = await command.execute(root, {
|
|
209
|
+
sourceDir: options?.sourceDir,
|
|
210
|
+
title: options?.title,
|
|
211
|
+
radarId: epicRef,
|
|
212
|
+
titles: parseCsvOption(options?.titles),
|
|
213
|
+
scale: options?.scale,
|
|
214
|
+
flowMode: flow,
|
|
215
|
+
start: options?.start,
|
|
216
|
+
render: options?.render,
|
|
217
|
+
});
|
|
218
|
+
if (options?.json) {
|
|
219
|
+
console.log(JSON.stringify(result, null, 2));
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
console.log(chalk.green('Ingestao de deposito concluida.'));
|
|
223
|
+
console.log(`Diretorio varrido: ${result.source_dir}`);
|
|
224
|
+
console.log(`Arquivos lidos: ${result.scanned_files}`);
|
|
225
|
+
console.log(`Fontes criadas: ${result.indexed_created}`);
|
|
226
|
+
console.log(`Fontes atualizadas: ${result.indexed_updated}`);
|
|
227
|
+
console.log(`EPIC: ${result.radar_id}`);
|
|
228
|
+
console.log(`FEATs criadas: ${result.created_features.join(', ') || '-'}`);
|
|
229
|
+
console.log(`FEATs reaproveitadas: ${result.linked_existing.join(', ') || '-'}`);
|
|
230
|
+
console.log(`FEAT iniciada: ${result.started_feature_id || '-'}`);
|
|
231
|
+
if (result.active_path) {
|
|
232
|
+
console.log(`Workspace ativo: ${result.active_path}`);
|
|
233
|
+
}
|
|
234
|
+
if (result.generated_docs.length > 0) {
|
|
235
|
+
console.log(`Docs gerados: ${result.generated_docs.join(', ')}`);
|
|
236
|
+
}
|
|
237
|
+
if (result.start_warning) {
|
|
238
|
+
console.log(chalk.yellow(`Aviso: ${result.start_warning}`));
|
|
239
|
+
}
|
|
240
|
+
console.log(`Skills recomendadas no fluxo: ${result.used_skills.join(', ')}`);
|
|
241
|
+
console.log(`Prompt recomendado: ${result.recommended_prompt}`);
|
|
242
|
+
});
|
|
243
|
+
sddCmd
|
|
244
|
+
.command('debate <insightId>')
|
|
245
|
+
.description('Abre um debate a partir de um insight')
|
|
246
|
+
.alias('debater')
|
|
247
|
+
.option('--title <title>', 'Titulo do debate')
|
|
248
|
+
.option('--agent <name>', 'Nome do agente que iniciou o debate')
|
|
249
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
250
|
+
.action(async (insightId, options) => {
|
|
251
|
+
const root = resolveRoot();
|
|
252
|
+
const __config = await loadProjectSddConfig(root);
|
|
253
|
+
const __paths = resolveSddPaths(root, __config);
|
|
254
|
+
const stores = createSddStores(__paths);
|
|
255
|
+
await ensureMandatorySddMigration(root);
|
|
256
|
+
const command = new DebateService(stores);
|
|
257
|
+
const result = await command.execute(root, insightId, {
|
|
258
|
+
title: options?.title,
|
|
259
|
+
agent: options?.agent,
|
|
260
|
+
render: options?.render,
|
|
261
|
+
});
|
|
262
|
+
console.log(chalk.green(`${result.reused ? 'Debate existente' : 'Debate criado'}: ${result.id}`));
|
|
263
|
+
console.log(`Titulo: ${result.title}`);
|
|
264
|
+
console.log(`Arquivo: ${result.filePath}`);
|
|
265
|
+
});
|
|
266
|
+
sddCmd
|
|
267
|
+
.command('decide <debateId>')
|
|
268
|
+
.description('Decide o resultado de um debate: epic ou descarte')
|
|
269
|
+
.alias('decidir')
|
|
270
|
+
.requiredOption('--outcome <result>', 'Resultado: epic|discard (radar legado ainda aceito)')
|
|
271
|
+
.option('--title <title>', 'Titulo do epic (quando outcome=epic; radar legado ainda aceito)')
|
|
272
|
+
.option('--rationale <text>', 'Racional da decisao')
|
|
273
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
274
|
+
.action(async (debateId, options) => {
|
|
275
|
+
const root = resolveRoot();
|
|
276
|
+
const __config = await loadProjectSddConfig(root);
|
|
277
|
+
const __paths = resolveSddPaths(root, __config);
|
|
278
|
+
const stores = createSddStores(__paths);
|
|
279
|
+
await ensureMandatorySddMigration(root);
|
|
280
|
+
const outcome = options?.outcome;
|
|
281
|
+
if (outcome !== 'radar' && outcome !== 'epic' && outcome !== 'discard') {
|
|
282
|
+
throw new Error('Valor invalido em --outcome. Use epic, discard ou radar (legado).');
|
|
283
|
+
}
|
|
284
|
+
const normalizedOutcome = outcome === 'epic' ? 'radar' : outcome;
|
|
285
|
+
const command = new DecideService(stores);
|
|
286
|
+
const result = await command.execute(root, debateId, normalizedOutcome, {
|
|
287
|
+
title: options?.title,
|
|
288
|
+
rationale: options?.rationale,
|
|
289
|
+
render: options?.render,
|
|
290
|
+
});
|
|
291
|
+
if (result.outcome === 'radar') {
|
|
292
|
+
console.log(chalk.green(`Debate ${debateId} aprovado para EPIC ${result.radarId}`));
|
|
293
|
+
console.log(`Arquivo: ${result.radarPath}`);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
console.log(chalk.yellow(`Debate ${debateId} descartado.`));
|
|
297
|
+
console.log(`Arquivo: ${result.discardPath}`);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
sddCmd
|
|
301
|
+
.command('breakdown <radarId>')
|
|
302
|
+
.description('Quebra um EPIC em uma ou mais features FEAT (RAD legado ainda aceito)')
|
|
303
|
+
.alias('quebrar')
|
|
304
|
+
.alias('desdobrar')
|
|
305
|
+
.option('--titles <list>', 'Titulos separados por virgula para gerar varias FEAT')
|
|
306
|
+
.option('--scale <scale>', 'Escala QUICK|STANDARD|LARGE')
|
|
307
|
+
.option('--mode <mode>', 'Modo de quebra: graph|flat (padrao: graph)')
|
|
308
|
+
.option('--incremental', 'Integra novas FEATs ao grafo existente')
|
|
309
|
+
.option('--dedupe <mode>', 'Modo de dedupe: strict|normal|off (padrao: normal)')
|
|
310
|
+
.option('--json', 'Saida em JSON')
|
|
311
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
312
|
+
.action(async (radarId, options) => {
|
|
313
|
+
const root = resolveRoot();
|
|
314
|
+
const __config = await loadProjectSddConfig(root);
|
|
315
|
+
const __paths = resolveSddPaths(root, __config);
|
|
316
|
+
const stores = createSddStores(__paths);
|
|
317
|
+
await ensureMandatorySddMigration(root);
|
|
318
|
+
if (options?.mode && options.mode !== 'graph' && options.mode !== 'flat') {
|
|
319
|
+
throw new Error('Valor invalido em --mode. Use graph ou flat.');
|
|
320
|
+
}
|
|
321
|
+
if (options?.dedupe && !['strict', 'normal', 'off'].includes(options.dedupe)) {
|
|
322
|
+
throw new Error('Valor invalido em --dedupe. Use strict, normal ou off.');
|
|
323
|
+
}
|
|
324
|
+
const command = new BreakdownService(stores);
|
|
325
|
+
const result = await command.execute(root, radarId, {
|
|
326
|
+
titles: parseCsvOption(options?.titles),
|
|
327
|
+
scale: options?.scale,
|
|
328
|
+
mode: options?.mode,
|
|
329
|
+
incremental: options?.incremental,
|
|
330
|
+
dedupe: options?.dedupe,
|
|
331
|
+
render: options?.render,
|
|
332
|
+
});
|
|
333
|
+
if (options?.json) {
|
|
334
|
+
console.log(JSON.stringify(result, null, 2));
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
console.log(chalk.green(`Breakdown concluido para ${result.radarId}`));
|
|
338
|
+
console.log(`Features criadas: ${result.created.join(', ') || '-'}`);
|
|
339
|
+
console.log(`Links reaproveitados: ${result.linked_existing.join(', ') || '-'}`);
|
|
340
|
+
console.log(`Rewires: ${result.rewired_dependencies.length}`);
|
|
341
|
+
console.log(`Duplicatas puladas: ${result.skipped_duplicates.length}`);
|
|
342
|
+
});
|
|
343
|
+
registerExecutionCommands(sddCmd);
|
|
344
|
+
sddCmd
|
|
345
|
+
.command('check [path]')
|
|
346
|
+
.description('Valida arquivos de estado .sdd e opcionalmente gera views')
|
|
347
|
+
.alias('checar')
|
|
348
|
+
.option('--render', 'Gera views Markdown apos validacao bem-sucedida')
|
|
349
|
+
.option('--strict', 'Eleva avisos de integridade referencial a erros')
|
|
350
|
+
.option('--json', 'Retorna relatorio em JSON')
|
|
351
|
+
.action(async (targetPath = '.', options) => {
|
|
352
|
+
const root = resolveRoot(targetPath);
|
|
353
|
+
const __config = await loadProjectSddConfig(root);
|
|
354
|
+
const __paths = resolveSddPaths(root, __config);
|
|
355
|
+
const stores = createSddStores(__paths);
|
|
356
|
+
await ensureMandatorySddMigration(root);
|
|
357
|
+
const command = new SddCheckCommand();
|
|
358
|
+
const report = await command.execute(root, {
|
|
359
|
+
render: options?.render,
|
|
360
|
+
strict: options?.strict,
|
|
361
|
+
});
|
|
362
|
+
if (options?.json) {
|
|
363
|
+
console.log(JSON.stringify(report, null, 2));
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
console.log(`Valido: ${report.valid ? 'sim' : 'nao'}`);
|
|
367
|
+
console.log(`Registros de discovery: ${report.summary.discovery}`);
|
|
368
|
+
console.log(`Itens de backlog: ${report.summary.backlog}`);
|
|
369
|
+
console.log(`Itens de divida tecnica: ${report.summary.techDebt}`);
|
|
370
|
+
console.log(`Itens na fila de finalize: ${report.summary.finalizeQueue}`);
|
|
371
|
+
console.log(`Frontend ativado: ${report.summary.frontendEnabled ? 'sim' : 'nao'}`);
|
|
372
|
+
console.log(`Progresso global: ${report.summary.progress_global.percent}% (${report.summary.progress_global.done}/${report.summary.progress_global.total})`);
|
|
373
|
+
console.log(`Prontas para paralelo: ${report.summary.ready_for_parallel}`);
|
|
374
|
+
console.log(`Bloqueadas: ${report.summary.blocked}`);
|
|
375
|
+
console.log(`Em conflito de lock: ${report.summary.lock_conflicts}`);
|
|
376
|
+
console.log(`Documentacao sincronizada: ${report.summary.documentation_sync ? 'sim' : 'nao'}`);
|
|
377
|
+
console.log(`Views core desatualizadas: ${report.summary.core_views_stale ? 'sim' : 'nao'}`);
|
|
378
|
+
console.log(`Cobertura frontend sincronizada: ${report.summary.frontend_coverage_sync ? 'sim' : 'nao'}`);
|
|
379
|
+
console.log(`Quality contracts synchronized: ${report.summary.quality_contract_sync ? 'yes' : 'no'}`);
|
|
380
|
+
if (report.summary.missing_architecture_fields.length > 0) {
|
|
381
|
+
console.log(`Campos canônicos pendentes: ${report.summary.missing_architecture_fields.join(', ')}`);
|
|
382
|
+
}
|
|
383
|
+
if (report.summary.features_missing_frontend_declaration.length > 0) {
|
|
384
|
+
console.log(`Features sem declaracao frontend: ${report.summary.features_missing_frontend_declaration.join(', ')}`);
|
|
385
|
+
}
|
|
386
|
+
if (report.summary.features_with_frontend_conflict.length > 0) {
|
|
387
|
+
console.log(`Features com conflito frontend: ${report.summary.features_with_frontend_conflict.join(', ')}`);
|
|
388
|
+
}
|
|
389
|
+
if (report.summary.features_missing_fgap_link.length > 0) {
|
|
390
|
+
console.log(`Features required sem FGAP: ${report.summary.features_missing_fgap_link.join(', ')}`);
|
|
391
|
+
}
|
|
392
|
+
if (report.summary.features_missing_quality_contract.length > 0) {
|
|
393
|
+
console.log(`Features missing quality_contract: ${report.summary.features_missing_quality_contract.join(', ')}`);
|
|
394
|
+
}
|
|
395
|
+
if (report.summary.features_missing_quality_artifact.length > 0) {
|
|
396
|
+
console.log(`Features missing quality.md: ${report.summary.features_missing_quality_artifact.join(', ')}`);
|
|
397
|
+
}
|
|
398
|
+
if (report.summary.progress_by_radar.length > 0) {
|
|
399
|
+
console.log('Progresso por EPIC:');
|
|
400
|
+
for (const radar of report.summary.progress_by_radar) {
|
|
401
|
+
console.log(`- ${radar.radar_id}: ${radar.percent}% (${radar.done}/${radar.total})`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
if (report.summary.frontendEnabled) {
|
|
405
|
+
console.log(`Gaps de frontend: ${report.summary.frontendGaps}`);
|
|
406
|
+
console.log(`Rotas de frontend: ${report.summary.frontendRoutes}`);
|
|
407
|
+
}
|
|
408
|
+
if (report.warnings.length > 0) {
|
|
409
|
+
console.log(chalk.yellow('\nAvisos:'));
|
|
410
|
+
for (const warning of report.warnings) {
|
|
411
|
+
console.log(`- ${warning}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (report.errors.length > 0) {
|
|
415
|
+
console.log(chalk.red('\nErros:'));
|
|
416
|
+
for (const error of report.errors) {
|
|
417
|
+
console.log(`- ${error}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (!report.valid) {
|
|
422
|
+
throw new Error('Falha na validacao do SDD');
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
sddCmd
|
|
426
|
+
.command('rebuild [path]')
|
|
427
|
+
.description('Reconstroi state YAML canonico a partir de discovery e workspaces no disco')
|
|
428
|
+
.option('--from-disk', 'Reconcilia discovery-index.yaml e backlog.yaml a partir de discovery/planned/active/archived')
|
|
429
|
+
.option('--dry-run', 'Mostra o que seria reconstruido sem gravar estado')
|
|
430
|
+
.option('--no-render', 'Nao gera views Markdown apos aplicar o rebuild')
|
|
431
|
+
.option('--json', 'Saida em JSON')
|
|
432
|
+
.action(async (targetPath = '.', options) => {
|
|
433
|
+
const root = resolveRoot(targetPath);
|
|
434
|
+
const command = new SddRebuildService();
|
|
435
|
+
const report = await command.execute(root, {
|
|
436
|
+
fromDisk: options?.fromDisk,
|
|
437
|
+
dryRun: options?.dryRun,
|
|
438
|
+
render: options?.render,
|
|
439
|
+
});
|
|
440
|
+
if (options?.json) {
|
|
441
|
+
console.log(JSON.stringify(report, null, 2));
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
console.log(chalk.green('Rebuild SDD concluido.'));
|
|
445
|
+
console.log(formatSddRebuildReport(report));
|
|
446
|
+
});
|
|
447
|
+
sddCmd
|
|
448
|
+
.command('metrics [path]')
|
|
449
|
+
.description('Calcula lead time, aging e throughput a partir do transition-log')
|
|
450
|
+
.option('--since <window>', 'Janela relativa (7d, 24h, 2w) ou timestamp ISO')
|
|
451
|
+
.option('--json', 'Saida em JSON')
|
|
452
|
+
.action(async (targetPath = '.', options) => {
|
|
453
|
+
const root = resolveRoot(targetPath);
|
|
454
|
+
const service = new SddMetricsService();
|
|
455
|
+
const report = await service.execute(root, {
|
|
456
|
+
since: options?.since,
|
|
457
|
+
});
|
|
458
|
+
if (options?.json) {
|
|
459
|
+
console.log(JSON.stringify(report, null, 2));
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
console.log(chalk.green('Metricas SDD calculadas.'));
|
|
463
|
+
console.log(formatSddMetricsReport(report));
|
|
464
|
+
});
|
|
465
|
+
sddCmd
|
|
466
|
+
.command('dedup [path]')
|
|
467
|
+
.description('Reconcilia duplicatas historicas a partir de warning_links')
|
|
468
|
+
.option('--apply', 'Aplica a reconciliacao de warning_links historicos')
|
|
469
|
+
.option('--dry-run', 'Mostra reconciliacoes sem gravar estado')
|
|
470
|
+
.option('--no-render', 'Nao gera views Markdown apos aplicar dedup')
|
|
471
|
+
.option('--json', 'Saida em JSON')
|
|
472
|
+
.action(async (targetPath = '.', options) => {
|
|
473
|
+
const root = resolveRoot(targetPath);
|
|
474
|
+
const service = new SddDedupApplyService();
|
|
475
|
+
const report = await service.execute(root, {
|
|
476
|
+
apply: options?.apply,
|
|
477
|
+
dryRun: options?.dryRun,
|
|
478
|
+
render: options?.render,
|
|
479
|
+
});
|
|
480
|
+
if (options?.json) {
|
|
481
|
+
console.log(JSON.stringify(report, null, 2));
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
console.log(chalk.green('Dedup SDD concluido.'));
|
|
485
|
+
console.log(formatSddDedupApplyReport(report));
|
|
486
|
+
});
|
|
487
|
+
const lintCmd = sddCmd
|
|
488
|
+
.command('lint')
|
|
489
|
+
.description('Executa lints determinísticos sobre artefatos SDD');
|
|
490
|
+
lintCmd
|
|
491
|
+
.command('feature <featId>')
|
|
492
|
+
.description('Avalia heuristicas de escopo por tasks, lock domains e surfaces')
|
|
493
|
+
.option('--strict', 'Falha tambem quando houver warnings')
|
|
494
|
+
.option('--json', 'Saida em JSON')
|
|
495
|
+
.action(async (featId, options) => {
|
|
496
|
+
const root = resolveRoot();
|
|
497
|
+
const service = new FeatureLintService();
|
|
498
|
+
const report = await service.execute(root, featId, {
|
|
499
|
+
strict: options?.strict,
|
|
500
|
+
});
|
|
501
|
+
if (options?.json) {
|
|
502
|
+
console.log(JSON.stringify(report, null, 2));
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
console.log(formatFeatureLintReport(report));
|
|
506
|
+
}
|
|
507
|
+
if (!report.ok) {
|
|
508
|
+
process.exitCode = 1;
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
sddCmd
|
|
512
|
+
.command('migrate')
|
|
513
|
+
.description('Migra entidades legado para os novos formatos SDD')
|
|
514
|
+
.alias('migrar')
|
|
515
|
+
.option('--rad-to-epic', 'Migra instancias de RAD para EPIC (4-digitos)')
|
|
516
|
+
.option('--yes', 'Confirma migracao manual sem prompt interativo')
|
|
517
|
+
.option('--json', 'Saida em JSON')
|
|
518
|
+
.action(async (options) => {
|
|
519
|
+
const root = resolveRoot();
|
|
520
|
+
const __config = await loadProjectSddConfig(root);
|
|
521
|
+
const __paths = resolveSddPaths(root, __config);
|
|
522
|
+
const stores = createSddStores(__paths);
|
|
523
|
+
const assessment = await assessSddMigration(root);
|
|
524
|
+
if (assessment.needsMigration && !options?.yes) {
|
|
525
|
+
if (!isInteractive()) {
|
|
526
|
+
throw new Error('Migracao SDD manual exige confirmacao explicita. Reexecute com --yes.');
|
|
527
|
+
}
|
|
528
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
529
|
+
const approved = await confirm({
|
|
530
|
+
message: `Aplicar migracao SDD manual agora? ${assessment.reasons.join(' | ')}`,
|
|
531
|
+
default: false,
|
|
532
|
+
});
|
|
533
|
+
if (!approved) {
|
|
534
|
+
throw new Error('Migracao SDD cancelada pelo usuario.');
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
const command = new SddMigrateCommand();
|
|
538
|
+
const result = await command.execute(root, { radToEpic: options?.radToEpic });
|
|
539
|
+
if (options?.json) {
|
|
540
|
+
console.log(JSON.stringify(result, null, 2));
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
console.log(chalk.green(`Migracao concluida.`));
|
|
544
|
+
for (const msg of result.messages) {
|
|
545
|
+
console.log(`- ${msg}`);
|
|
546
|
+
}
|
|
547
|
+
});
|
|
548
|
+
sddCmd
|
|
549
|
+
.command('migrate-workspace')
|
|
550
|
+
.description('Migra workspaces SDD legados de Markdown para YAML validado')
|
|
551
|
+
.option('--dry-run', 'Mostra o que seria migrado sem escrever arquivos')
|
|
552
|
+
.option('--feat <featId>', 'Migra apenas uma FEAT especifica (ex: FEAT-0001)')
|
|
553
|
+
.option('--json', 'Saida em JSON')
|
|
554
|
+
.action(async (options) => {
|
|
555
|
+
const root = resolveRoot();
|
|
556
|
+
const __config = await loadProjectSddConfig(root);
|
|
557
|
+
const __paths = resolveSddPaths(root, __config);
|
|
558
|
+
const stores = createSddStores(__paths);
|
|
559
|
+
if (options?.feat && !/^FEAT-\d{4}$/.test(options.feat)) {
|
|
560
|
+
throw new Error('Invalid --feat value. Use FEAT-####.');
|
|
561
|
+
}
|
|
562
|
+
const command = new MigrateWorkspaceCommand();
|
|
563
|
+
const result = await command.execute(root, {
|
|
564
|
+
dryRun: options?.dryRun,
|
|
565
|
+
feat: options?.feat,
|
|
566
|
+
});
|
|
567
|
+
if (options?.json) {
|
|
568
|
+
console.log(JSON.stringify(result, null, 2));
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
console.log(chalk.green(options?.dryRun ? 'Dry-run de migracao de workspace concluido.' : 'Migracao de workspace concluida.'));
|
|
572
|
+
console.log(`Workspaces analisados: ${result.scanned}`);
|
|
573
|
+
console.log(`Arquivos migrados: ${result.migrated}`);
|
|
574
|
+
for (const feature of result.features) {
|
|
575
|
+
console.log(`- ${feature.featureId} (${feature.root}): ${feature.workspace}`);
|
|
576
|
+
for (const file of feature.files) {
|
|
577
|
+
const mode = file.written ? 'migrado' : 'dry-run';
|
|
578
|
+
console.log(` ${mode}: ${file.source} -> ${file.target}`);
|
|
579
|
+
if (file.missingFields.length > 0) {
|
|
580
|
+
console.log(chalk.yellow(` incompleto: ${file.missingFields.join(', ')}`));
|
|
581
|
+
}
|
|
582
|
+
if (file.validationErrors.length > 0) {
|
|
583
|
+
console.log(chalk.red(` validacao: ${file.validationErrors.join(' | ')}`));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
sddCmd
|
|
589
|
+
.command('import-openspec [path]')
|
|
590
|
+
.description('Imports legacy openspec/ state into .sdd sources and source-index')
|
|
591
|
+
.alias('importar-openspec')
|
|
592
|
+
.option('--dry-run', 'Preview import without writing files')
|
|
593
|
+
.option('--remove', 'Remove openspec/ after successful import verification')
|
|
594
|
+
.option('--yes', 'Confirm destructive removal when --remove is used')
|
|
595
|
+
.option('--json', 'JSON output')
|
|
596
|
+
.option('--no-render', 'Does not generate views after updating state')
|
|
597
|
+
.action(async (targetPath = '.', options) => {
|
|
598
|
+
const root = resolveRoot(targetPath);
|
|
599
|
+
const __config = await loadProjectSddConfig(root);
|
|
600
|
+
const __paths = resolveSddPaths(root, __config);
|
|
601
|
+
const stores = createSddStores(__paths);
|
|
602
|
+
await ensureMandatorySddMigration(root);
|
|
603
|
+
const command = new SddImportOpenSpecCommand();
|
|
604
|
+
const result = await command.execute(root, {
|
|
605
|
+
dryRun: options?.dryRun,
|
|
606
|
+
remove: options?.remove,
|
|
607
|
+
yes: options?.yes,
|
|
608
|
+
render: options?.render,
|
|
609
|
+
});
|
|
610
|
+
if (options?.json) {
|
|
611
|
+
console.log(JSON.stringify(result, null, 2));
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
console.log(chalk.green('OpenSpec import completed.'));
|
|
615
|
+
console.log(`Source root: ${result.source_root}`);
|
|
616
|
+
console.log(`Target root: ${result.target_root}`);
|
|
617
|
+
console.log(`Report: ${result.report_path}`);
|
|
618
|
+
console.log(`Dry run: ${result.dry_run ? 'yes' : 'no'}`);
|
|
619
|
+
console.log(`Files seen: ${result.files_seen}`);
|
|
620
|
+
console.log(`Files copied: ${result.files_copied}`);
|
|
621
|
+
console.log(`Sources indexed: ${result.sources_indexed}`);
|
|
622
|
+
console.log(`Removed openspec/: ${result.removed_source_root ? 'yes' : 'no'}`);
|
|
623
|
+
const categories = Object.entries(result.categories)
|
|
624
|
+
.map(([name, count]) => `${name}=${count}`)
|
|
625
|
+
.join(', ');
|
|
626
|
+
console.log(`Categories: ${categories || '-'}`);
|
|
627
|
+
});
|
|
628
|
+
registerSkillsCommands(sddCmd);
|
|
629
|
+
sddCmd
|
|
630
|
+
.command('diagnose')
|
|
631
|
+
.alias('diagnosticar')
|
|
632
|
+
.description('Executa o motor de diagnostico estrutural')
|
|
633
|
+
.option('--strict', 'Falha se houver inconsistencias criticas')
|
|
634
|
+
.option('--json', 'Saida em formato JSON')
|
|
635
|
+
.option('--output <path>', 'Caminho para salvar o relatorio JSON')
|
|
636
|
+
.action(async (options) => {
|
|
637
|
+
const root = resolveRoot();
|
|
638
|
+
const command = new SddDiagnoseCommand();
|
|
639
|
+
const result = await command.execute(root, {
|
|
640
|
+
strict: options.strict,
|
|
641
|
+
output: options.output,
|
|
642
|
+
});
|
|
643
|
+
if (options.json) {
|
|
644
|
+
console.log(JSON.stringify(result.report, null, 2));
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
647
|
+
console.log(formatDiagnosticText(result.report));
|
|
648
|
+
console.log(`\nHealth: ${result.health}`);
|
|
649
|
+
}
|
|
650
|
+
if (result.outputPath) {
|
|
651
|
+
console.log(`Report saved to: ${result.outputPath}`);
|
|
652
|
+
}
|
|
653
|
+
if (options.strict && result.exitCode !== 0)
|
|
654
|
+
process.exit(result.exitCode);
|
|
655
|
+
});
|
|
656
|
+
sddCmd
|
|
657
|
+
.command('scan-naming')
|
|
658
|
+
.alias('escanear-nomenclatura')
|
|
659
|
+
.description('Scans tracked files for forbidden naming-contract terms')
|
|
660
|
+
.option('--strict', 'Exit with code 1 if any warnings are found')
|
|
661
|
+
.option('--json', 'Emit the full report as JSON')
|
|
662
|
+
.option('--output <path>', 'Write the JSON report to the given path')
|
|
663
|
+
.action(async (options) => {
|
|
664
|
+
const root = resolveRoot();
|
|
665
|
+
const service = new ScanNamingService();
|
|
666
|
+
const report = await service.execute(root, { strict: options.strict, json: options.json });
|
|
667
|
+
if (options.output) {
|
|
668
|
+
await fs.mkdir(path.dirname(path.resolve(root, options.output)), { recursive: true });
|
|
669
|
+
await fs.writeFile(path.resolve(root, options.output), JSON.stringify(report, null, 2), 'utf-8');
|
|
670
|
+
}
|
|
671
|
+
if (options.json) {
|
|
672
|
+
console.log(JSON.stringify(report, null, 2));
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
console.log(formatScanNamingReport(report));
|
|
676
|
+
}
|
|
677
|
+
const fail = report.errorCount > 0 || (options.strict === true && report.warningCount > 0);
|
|
678
|
+
if (fail) {
|
|
679
|
+
process.exitCode = 1;
|
|
680
|
+
}
|
|
681
|
+
});
|
|
682
|
+
const sanitizeCmd = sddCmd
|
|
683
|
+
.command('sanitize')
|
|
684
|
+
.alias('sanitizar')
|
|
685
|
+
.description('Sanitiza o workspace SDD')
|
|
686
|
+
.option('--dry-run', 'Apenas planeja a sanitizacao')
|
|
687
|
+
.option('--apply', 'Aplica a sanitizacao')
|
|
688
|
+
.option('--yes', 'Pula confirmacao')
|
|
689
|
+
.option('--from-report <path>', 'Usa um relatorio de diagnostico salvo')
|
|
690
|
+
.option('--json', 'Saida em JSON')
|
|
691
|
+
.action(async (options) => {
|
|
692
|
+
const root = resolveRoot();
|
|
693
|
+
const command = new SddSanitizeCommand();
|
|
694
|
+
const result = await command.execute(root, {
|
|
695
|
+
apply: options.apply,
|
|
696
|
+
dryRun: !options.apply,
|
|
697
|
+
yes: options.yes,
|
|
698
|
+
fromReport: options.fromReport,
|
|
699
|
+
});
|
|
700
|
+
if (options.json) {
|
|
701
|
+
console.log(JSON.stringify(result.report, null, 2));
|
|
702
|
+
}
|
|
703
|
+
else {
|
|
704
|
+
console.log(formatSanitizerText(result.report));
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
sanitizeCmd.command('rollback <id>')
|
|
708
|
+
.description('Reverte uma operacao de sanitizacao')
|
|
709
|
+
.option('--reason <reason>', 'Motivo da reversao')
|
|
710
|
+
.action(async (id, options) => {
|
|
711
|
+
const root = resolveRoot();
|
|
712
|
+
const command = new SddSanitizeCommand();
|
|
713
|
+
const result = await command.rollback(root, id, {
|
|
714
|
+
reason: options.reason || 'Reversao manual',
|
|
715
|
+
});
|
|
716
|
+
console.log(`Rollback concluido: ${result.transactionId}`);
|
|
717
|
+
console.log(`Revertidos: ${result.rolledBack}, Pulados: ${result.skipped}`);
|
|
718
|
+
});
|
|
719
|
+
const gapCmd = sddCmd.command('fgap')
|
|
720
|
+
.description('Operacoes de gaps de frontend');
|
|
721
|
+
gapCmd.alias('lacunas-frontend');
|
|
722
|
+
gapCmd
|
|
723
|
+
.command('add <title>')
|
|
724
|
+
.description('Abre um novo FGAP')
|
|
725
|
+
.alias('abrir')
|
|
726
|
+
.option('--origin <featId>', 'Feature de origem (FEAT-0001)')
|
|
727
|
+
.option('--routes <list>', 'Rotas separadas por virgula')
|
|
728
|
+
.option('--menu <list>', 'Alvos de menu separados por virgula')
|
|
729
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
730
|
+
.action(async (title, options) => {
|
|
731
|
+
const root = resolveRoot();
|
|
732
|
+
const __config = await loadProjectSddConfig(root);
|
|
733
|
+
const __paths = resolveSddPaths(root, __config);
|
|
734
|
+
const stores = createSddStores(__paths);
|
|
735
|
+
await ensureMandatorySddMigration(root);
|
|
736
|
+
const command = new FrontendGapService(stores);
|
|
737
|
+
const result = await command.add(root, title, {
|
|
738
|
+
originFeature: options?.origin,
|
|
739
|
+
routes: parseCsvOption(options?.routes),
|
|
740
|
+
menu: parseCsvOption(options?.menu),
|
|
741
|
+
render: options?.render,
|
|
742
|
+
});
|
|
743
|
+
console.log(chalk.green(`Gap criado: ${result.id}`));
|
|
744
|
+
});
|
|
745
|
+
gapCmd
|
|
746
|
+
.command('done <gapId>')
|
|
747
|
+
.description('Marca um FGAP como resolvido')
|
|
748
|
+
.alias('resolver')
|
|
749
|
+
.option('--feature <featId>', 'Feature que resolveu o gap')
|
|
750
|
+
.option('--files <list>', 'Arquivos implementados separados por virgula')
|
|
751
|
+
.option('--routes <list>', 'Rotas atualizadas separadas por virgula')
|
|
752
|
+
.option('--no-render', 'Nao gera views apos atualizar estado')
|
|
753
|
+
.action(async (gapId, options) => {
|
|
754
|
+
const root = resolveRoot();
|
|
755
|
+
const __config = await loadProjectSddConfig(root);
|
|
756
|
+
const __paths = resolveSddPaths(root, __config);
|
|
757
|
+
const stores = createSddStores(__paths);
|
|
758
|
+
await ensureMandatorySddMigration(root);
|
|
759
|
+
const command = new FrontendGapService(stores);
|
|
760
|
+
const result = await command.resolve(root, gapId, {
|
|
761
|
+
feature: options?.feature,
|
|
762
|
+
files: parseCsvOption(options?.files),
|
|
763
|
+
routes: parseCsvOption(options?.routes),
|
|
764
|
+
render: options?.render,
|
|
765
|
+
});
|
|
766
|
+
console.log(chalk.green(`Gap ${result.id} atualizado para ${result.status}`));
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
//# sourceMappingURL=sdd.js.map
|