specweave 0.32.0 → 0.32.3
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/CLAUDE.md +215 -2
- package/README.md +22 -0
- package/bin/specweave.js +52 -1
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.d.ts +100 -0
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js +291 -0
- package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.d.ts +103 -0
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js +310 -0
- package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-permission-gate.d.ts +126 -0
- package/dist/plugins/specweave-jira/lib/jira-permission-gate.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-permission-gate.js +207 -0
- package/dist/plugins/specweave-jira/lib/jira-permission-gate.js.map +1 -0
- package/dist/src/adapters/codex/README.md +1 -1
- package/dist/src/adapters/codex/adapter.js +1 -1
- package/dist/src/cli/commands/archive.d.ts +2 -0
- package/dist/src/cli/commands/archive.d.ts.map +1 -1
- package/dist/src/cli/commands/archive.js +33 -0
- package/dist/src/cli/commands/archive.js.map +1 -1
- package/dist/src/cli/commands/cache.d.ts +17 -0
- package/dist/src/cli/commands/cache.d.ts.map +1 -0
- package/dist/src/cli/commands/cache.js +126 -0
- package/dist/src/cli/commands/cache.js.map +1 -0
- package/dist/src/cli/commands/context.d.ts +92 -0
- package/dist/src/cli/commands/context.d.ts.map +1 -0
- package/dist/src/cli/commands/context.js +205 -0
- package/dist/src/cli/commands/context.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +112 -70
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/plan/increment-detector.js +2 -2
- package/dist/src/cli/commands/plan/increment-detector.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-commits.js +1 -1
- package/dist/src/cli/commands/sync-spec-commits.js.map +1 -1
- package/dist/src/cli/commands/sync-specs.js +2 -2
- package/dist/src/cli/commands/sync-specs.js.map +1 -1
- package/dist/src/cli/helpers/github/increment-profile-selector.js +1 -1
- package/dist/src/cli/helpers/github/increment-profile-selector.js.map +1 -1
- package/dist/src/cli/helpers/init/external-import.d.ts +3 -0
- package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/external-import.js +17 -4
- package/dist/src/cli/helpers/init/external-import.js.map +1 -1
- package/dist/src/cli/helpers/init/index.d.ts +1 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +2 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts +70 -0
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.js +214 -4
- package/dist/src/cli/helpers/init/jira-ado-auto-detect.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +4 -0
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.js +34 -3
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
- package/dist/src/cli/helpers/init/testing-config.d.ts +3 -0
- package/dist/src/cli/helpers/init/testing-config.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/testing-config.js +9 -2
- package/dist/src/cli/helpers/init/testing-config.js.map +1 -1
- package/dist/src/cli/helpers/init/translation-config.d.ts +3 -0
- package/dist/src/cli/helpers/init/translation-config.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/translation-config.js +21 -4
- package/dist/src/cli/helpers/init/translation-config.js.map +1 -1
- package/dist/src/cli/helpers/init/wizard-navigation.d.ts +45 -0
- package/dist/src/cli/helpers/init/wizard-navigation.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/wizard-navigation.js +97 -0
- package/dist/src/cli/helpers/init/wizard-navigation.js.map +1 -0
- package/dist/src/cli/workers/living-docs-worker.js +66 -1
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
- package/dist/src/config/types.d.ts +203 -1208
- package/dist/src/config/types.d.ts.map +1 -1
- package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -1
- package/dist/src/core/discrepancy/increment-generator.js +5 -2
- package/dist/src/core/discrepancy/increment-generator.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.js +2 -2
- package/dist/src/core/increment/duplicate-detector.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +49 -4
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +123 -22
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/increment/increment-status.js +2 -2
- package/dist/src/core/increment/increment-status.js.map +1 -1
- package/dist/src/core/increment/increment-utils.d.ts +150 -0
- package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
- package/dist/src/core/increment/increment-utils.js +216 -4
- package/dist/src/core/increment/increment-utils.js.map +1 -1
- package/dist/src/core/increment/metadata-validator.js +1 -1
- package/dist/src/core/increment/metadata-validator.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +4 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +32 -10
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +8 -4
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/governance/ecosystem-detector.d.ts +38 -0
- package/dist/src/core/living-docs/governance/ecosystem-detector.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/ecosystem-detector.js +325 -0
- package/dist/src/core/living-docs/governance/ecosystem-detector.js.map +1 -0
- package/dist/src/core/living-docs/governance/frontend-standards-parser.d.ts +74 -0
- package/dist/src/core/living-docs/governance/frontend-standards-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/frontend-standards-parser.js +366 -0
- package/dist/src/core/living-docs/governance/frontend-standards-parser.js.map +1 -0
- package/dist/src/core/living-docs/governance/go-standards-parser.d.ts +64 -0
- package/dist/src/core/living-docs/governance/go-standards-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/go-standards-parser.js +229 -0
- package/dist/src/core/living-docs/governance/go-standards-parser.js.map +1 -0
- package/dist/src/core/living-docs/governance/index.d.ts +50 -0
- package/dist/src/core/living-docs/governance/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/index.js +56 -0
- package/dist/src/core/living-docs/governance/index.js.map +1 -0
- package/dist/src/core/living-docs/governance/java-standards-parser.d.ts +89 -0
- package/dist/src/core/living-docs/governance/java-standards-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/java-standards-parser.js +356 -0
- package/dist/src/core/living-docs/governance/java-standards-parser.js.map +1 -0
- package/dist/src/core/living-docs/governance/python-standards-parser.d.ts +83 -0
- package/dist/src/core/living-docs/governance/python-standards-parser.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/python-standards-parser.js +347 -0
- package/dist/src/core/living-docs/governance/python-standards-parser.js.map +1 -0
- package/dist/src/core/living-docs/governance/standards-generator.d.ts +38 -0
- package/dist/src/core/living-docs/governance/standards-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/governance/standards-generator.js +476 -0
- package/dist/src/core/living-docs/governance/standards-generator.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.js +3 -3
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts +18 -0
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +299 -0
- package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts +15 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js +138 -0
- package/dist/src/core/living-docs/intelligent-analyzer/deep-repo-analyzer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.d.ts +24 -0
- package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.js +198 -0
- package/dist/src/core/living-docs/intelligent-analyzer/file-sampler.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts +17 -0
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js +241 -0
- package/dist/src/core/living-docs/intelligent-analyzer/inconsistency-detector.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts +28 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.js +197 -0
- package/dist/src/core/living-docs/intelligent-analyzer/index.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts +22 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +482 -0
- package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.d.ts +42 -0
- package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.js +343 -0
- package/dist/src/core/living-docs/intelligent-analyzer/strategy-generator.js.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +190 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.js +7 -0
- package/dist/src/core/living-docs/intelligent-analyzer/types.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +11 -3
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +53 -10
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.d.ts +22 -0
- package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -1
- package/dist/src/core/living-docs/module-analyzer.js +123 -19
- package/dist/src/core/living-docs/module-analyzer.js.map +1 -1
- package/dist/src/core/llm/provider-factory.js +2 -2
- package/dist/src/core/llm/provider-factory.js.map +1 -1
- package/dist/src/core/llm/providers/anthropic-provider.js +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
- package/dist/src/core/llm/providers/bedrock-provider.js +8 -4
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
- package/dist/src/core/sync/spec-increment-mapper.js +3 -3
- package/dist/src/core/sync/spec-increment-mapper.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +25 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +135 -5
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/jira-importer.d.ts +14 -0
- package/dist/src/importers/jira-importer.d.ts.map +1 -1
- package/dist/src/importers/jira-importer.js +75 -0
- package/dist/src/importers/jira-importer.js.map +1 -1
- package/dist/src/init/architecture/types.d.ts +33 -140
- package/dist/src/init/architecture/types.d.ts.map +1 -1
- package/dist/src/init/compliance/types.d.ts +30 -27
- package/dist/src/init/compliance/types.d.ts.map +1 -1
- package/dist/src/init/repo/types.d.ts +11 -34
- package/dist/src/init/repo/types.d.ts.map +1 -1
- package/dist/src/init/research/src/config/types.d.ts +15 -82
- package/dist/src/init/research/src/config/types.d.ts.map +1 -1
- package/dist/src/init/research/types.d.ts +38 -93
- package/dist/src/init/research/types.d.ts.map +1 -1
- package/dist/src/init/team/types.d.ts +4 -42
- package/dist/src/init/team/types.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-token-provider.d.ts +93 -0
- package/dist/src/integrations/jira/jira-token-provider.d.ts.map +1 -0
- package/dist/src/integrations/jira/jira-token-provider.js +160 -0
- package/dist/src/integrations/jira/jira-token-provider.js.map +1 -0
- package/dist/src/sync/ado-reconciler.d.ts +92 -0
- package/dist/src/sync/ado-reconciler.d.ts.map +1 -0
- package/dist/src/sync/ado-reconciler.js +335 -0
- package/dist/src/sync/ado-reconciler.js.map +1 -0
- package/dist/src/sync/jira-reconciler.d.ts +106 -0
- package/dist/src/sync/jira-reconciler.d.ts.map +1 -0
- package/dist/src/sync/jira-reconciler.js +405 -0
- package/dist/src/sync/jira-reconciler.js.map +1 -0
- package/dist/src/types/dashboard-cache.d.ts +181 -0
- package/dist/src/types/dashboard-cache.d.ts.map +1 -0
- package/dist/src/types/dashboard-cache.js +65 -0
- package/dist/src/types/dashboard-cache.js.map +1 -0
- package/dist/src/types/model-selection.d.ts +6 -4
- package/dist/src/types/model-selection.d.ts.map +1 -1
- package/dist/src/types/model-selection.js +3 -1
- package/dist/src/types/model-selection.js.map +1 -1
- package/dist/src/utils/docs-validator.d.ts +131 -0
- package/dist/src/utils/docs-validator.d.ts.map +1 -0
- package/dist/src/utils/docs-validator.js +529 -0
- package/dist/src/utils/docs-validator.js.map +1 -0
- package/dist/src/utils/external-tool-drift-detector.d.ts +1 -1
- package/dist/src/utils/external-tool-drift-detector.d.ts.map +1 -1
- package/dist/src/utils/external-tool-drift-detector.js +5 -4
- package/dist/src/utils/external-tool-drift-detector.js.map +1 -1
- package/dist/src/utils/feature-id-collision.js +1 -1
- package/dist/src/utils/feature-id-collision.js.map +1 -1
- package/dist/src/utils/feature-id-derivation.d.ts +8 -3
- package/dist/src/utils/feature-id-derivation.d.ts.map +1 -1
- package/dist/src/utils/feature-id-derivation.js +14 -6
- package/dist/src/utils/feature-id-derivation.js.map +1 -1
- package/dist/src/utils/html-to-mdx.d.ts +1 -0
- package/dist/src/utils/html-to-mdx.d.ts.map +1 -1
- package/dist/src/utils/html-to-mdx.js +43 -5
- package/dist/src/utils/html-to-mdx.js.map +1 -1
- package/dist/src/utils/model-selection.d.ts +3 -4
- package/dist/src/utils/model-selection.d.ts.map +1 -1
- package/dist/src/utils/model-selection.js +3 -4
- package/dist/src/utils/model-selection.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/agents/code-standards-detective/AGENT.md +48 -0
- package/plugins/specweave/agents/pm/AGENT.md +10 -7
- package/plugins/specweave/commands/specweave-archive-features.md +5 -7
- package/plugins/specweave/commands/specweave-archive.md +2 -1
- package/plugins/specweave/commands/specweave-costs.md +4 -4
- package/plugins/specweave/commands/specweave-do.md +44 -10
- package/plugins/specweave/commands/specweave-done.md +109 -0
- package/plugins/specweave/commands/specweave-import-external.md +45 -18
- package/plugins/specweave/commands/specweave-increment.md +331 -33
- package/plugins/specweave/commands/specweave-jobs.md +2 -2
- package/plugins/specweave/commands/specweave-progress.md +4 -4
- package/plugins/specweave/commands/specweave-restore-feature.md +5 -4
- package/plugins/specweave/commands/specweave-sync-docs.md +1 -1
- package/plugins/specweave/commands/specweave-sync-specs.md +216 -322
- package/plugins/specweave/commands/specweave-validate-features.md +13 -8
- package/plugins/specweave/commands/specweave-validate.md +27 -1
- package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
- package/plugins/specweave/hooks/hooks.json +43 -4
- package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
- package/plugins/specweave/hooks/lib/common-setup.sh +375 -0
- package/plugins/specweave/hooks/lib/crash-prevention.sh +336 -0
- package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
- package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
- package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
- package/plugins/specweave/hooks/post-task-completion.sh +4 -23
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +1 -6
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
- package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +8 -37
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
- package/plugins/specweave/hooks/pre-tool-use.sh +2 -11
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
- package/plugins/specweave/hooks/spec-project-validator.sh +80 -25
- package/plugins/specweave/hooks/universal/dispatcher.mjs +135 -42
- package/plugins/specweave/hooks/universal/fail-fast-wrapper.sh +183 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +140 -38
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
- package/plugins/specweave/hooks/v2/dispatchers/post-tool-use.sh +12 -0
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +89 -0
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.sh +211 -0
- package/plugins/specweave/hooks/v2/guards/bash-file-guard.test.sh +163 -0
- package/plugins/specweave/hooks/v2/guards/completion-guard.sh +26 -28
- package/plugins/specweave/hooks/v2/guards/features-folder-guard.sh +50 -0
- package/plugins/specweave/hooks/v2/guards/increment-duplicate-guard.sh +135 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +2 -2
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -1
- package/plugins/specweave/scripts/README.md +166 -0
- package/plugins/specweave/scripts/cleanup-state.sh +142 -0
- package/plugins/specweave/scripts/force-kill.sh +142 -0
- package/plugins/specweave/scripts/jobs.js +171 -0
- package/plugins/specweave/scripts/progress.js +170 -0
- package/plugins/specweave/scripts/read-costs.sh +132 -0
- package/plugins/specweave/scripts/read-jobs.sh +324 -0
- package/plugins/specweave/scripts/read-progress.sh +185 -0
- package/plugins/specweave/scripts/read-status.sh +146 -0
- package/plugins/specweave/scripts/read-workflow.sh +173 -0
- package/plugins/specweave/scripts/rebuild-dashboard-cache.sh +327 -0
- package/plugins/specweave/scripts/session-watchdog.sh +192 -0
- package/plugins/specweave/scripts/status.js +154 -0
- package/plugins/specweave/scripts/update-dashboard-cache.sh +281 -0
- package/plugins/specweave/skills/code-standards-analyzer/SKILL.md +58 -6
- package/plugins/specweave/skills/increment-planner/SKILL.md +388 -48
- package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +17 -7
- package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +6 -1
- package/plugins/specweave/skills/increment-planner/templates/tasks-multi-project.md +1 -1
- package/plugins/specweave/skills/increment-planner/templates/tasks-single-project.md +1 -1
- package/plugins/specweave/skills/instant-status/SKILL.md +70 -0
- package/plugins/specweave-ado/commands/cleanup-duplicates.md +212 -0
- package/plugins/specweave-ado/commands/reconcile.md +120 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-ado/lib/ado-duplicate-detector.js +279 -0
- package/plugins/specweave-ado/lib/ado-duplicate-detector.ts +407 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-docs/commands/build.md +32 -4
- package/plugins/specweave-docs/commands/preview.md +43 -1
- package/plugins/specweave-docs/commands/validate.md +250 -0
- package/plugins/specweave-github/agents/github-manager/AGENT.md +2 -2
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +1262 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
- package/plugins/specweave-github/lib/enhanced-github-sync.js +220 -0
- package/plugins/specweave-infrastructure/skills/hetzner-provisioner/README.md +1 -1
- package/plugins/specweave-jira/agents/jira-manager/AGENT.md +1 -1
- package/plugins/specweave-jira/agents/jira-multi-project-mapper/AGENT.md +530 -0
- package/plugins/specweave-jira/agents/jira-sync-judge/AGENT.md +438 -0
- package/plugins/specweave-jira/commands/cleanup-duplicates.md +219 -0
- package/plugins/specweave-jira/commands/close.md +297 -0
- package/plugins/specweave-jira/commands/create.md +198 -0
- package/plugins/specweave-jira/commands/reconcile.md +123 -0
- package/plugins/specweave-jira/commands/status.md +215 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/jira-duplicate-detector.js +296 -0
- package/plugins/specweave-jira/lib/jira-duplicate-detector.ts +434 -0
- package/plugins/specweave-jira/lib/jira-permission-gate.js +160 -0
- package/plugins/specweave-jira/lib/jira-permission-gate.ts +276 -0
- package/plugins/specweave-jira/lib/jira-profile-resolver.js +222 -0
- package/plugins/specweave-jira/lib/jira-profile-resolver.ts +427 -0
- package/plugins/specweave-jira/reference/jira-specweave-mapping.md +16 -11
- package/plugins/specweave-release/commands/specweave-release-npm.md +140 -14
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +1254 -0
- package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +0 -265
- package/plugins/specweave/hooks/post-write-spec.sh +0 -267
- package/plugins/specweave/hooks/pre-edit-spec.sh +0 -151
- package/plugins/specweave/hooks/pre-write-spec.sh +0 -151
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* The cache was premature optimization that caused bugs. Scanning 4 directories
|
|
11
11
|
* is fast enough (~5ms) and doesn't need caching.
|
|
12
12
|
*
|
|
13
|
+
* E-SUFFIX CONVENTION (v0.32.0):
|
|
14
|
+
* Increments working on external items (imported from GitHub/JIRA/ADO) use
|
|
15
|
+
* E suffix: 0111E-feature-name instead of 0111-feature-name.
|
|
16
|
+
* This maintains consistency with FS-XXXE feature IDs and US-XXXE user stories.
|
|
17
|
+
*
|
|
13
18
|
* @module increment-utils
|
|
14
19
|
* @since 0.18.3
|
|
15
20
|
*/
|
|
@@ -84,5 +89,150 @@ export declare class IncrementNumberManager {
|
|
|
84
89
|
* @private
|
|
85
90
|
*/
|
|
86
91
|
private static scanAllIncrementDirectories;
|
|
92
|
+
/**
|
|
93
|
+
* Generate an increment ID for external items.
|
|
94
|
+
*
|
|
95
|
+
* External increments (those working on imported GitHub/JIRA/ADO items)
|
|
96
|
+
* use E suffix to maintain consistency with FS-XXXE and US-XXXE conventions.
|
|
97
|
+
*
|
|
98
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
99
|
+
* @returns Next increment ID with E suffix (e.g., "0033E")
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* const id = IncrementNumberManager.getNextExternalIncrementNumber();
|
|
104
|
+
* // "0033E" - for use as "0033E-feature-name"
|
|
105
|
+
* ```
|
|
106
|
+
*
|
|
107
|
+
* @since 0.32.0
|
|
108
|
+
*/
|
|
109
|
+
static getNextExternalIncrementNumber(projectRoot?: string): string;
|
|
110
|
+
/**
|
|
111
|
+
* Generate a full increment folder name.
|
|
112
|
+
*
|
|
113
|
+
* @param name - Kebab-case increment name (e.g., "dora-metrics-fix")
|
|
114
|
+
* @param options - Options for ID generation
|
|
115
|
+
* @param options.isExternal - If true, adds E suffix for external items
|
|
116
|
+
* @param options.projectRoot - Project root directory
|
|
117
|
+
* @returns Full increment folder name (e.g., "0033E-dora-metrics-fix")
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* // Internal increment
|
|
122
|
+
* const id = IncrementNumberManager.generateIncrementId('feature-name');
|
|
123
|
+
* // "0033-feature-name"
|
|
124
|
+
*
|
|
125
|
+
* // External increment (GitHub/JIRA/ADO item)
|
|
126
|
+
* const extId = IncrementNumberManager.generateIncrementId('dora-fix', { isExternal: true });
|
|
127
|
+
* // "0033E-dora-fix"
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @since 0.32.0
|
|
131
|
+
*/
|
|
132
|
+
static generateIncrementId(name: string, options?: {
|
|
133
|
+
isExternal?: boolean;
|
|
134
|
+
projectRoot?: string;
|
|
135
|
+
}): string;
|
|
136
|
+
/**
|
|
137
|
+
* Check if an increment ID represents an external item.
|
|
138
|
+
*
|
|
139
|
+
* External increments have E suffix: 0033E-name
|
|
140
|
+
* Internal increments do not: 0033-name
|
|
141
|
+
*
|
|
142
|
+
* @param incrementId - Increment ID or folder name
|
|
143
|
+
* @returns true if increment is external (has E suffix)
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* IncrementNumberManager.isExternalIncrement('0033E-dora-fix'); // true
|
|
148
|
+
* IncrementNumberManager.isExternalIncrement('0033-feature'); // false
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* @since 0.32.0
|
|
152
|
+
*/
|
|
153
|
+
static isExternalIncrement(incrementId: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Extract the numeric part from an increment ID.
|
|
156
|
+
*
|
|
157
|
+
* Works with both internal and external increments.
|
|
158
|
+
*
|
|
159
|
+
* @param incrementId - Increment ID or folder name
|
|
160
|
+
* @returns Numeric part as 4-digit string, or null if invalid
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* IncrementNumberManager.extractNumber('0033E-dora-fix'); // "0033"
|
|
165
|
+
* IncrementNumberManager.extractNumber('0033-feature'); // "0033"
|
|
166
|
+
* IncrementNumberManager.extractNumber('invalid'); // null
|
|
167
|
+
* ```
|
|
168
|
+
*
|
|
169
|
+
* @since 0.32.0
|
|
170
|
+
*/
|
|
171
|
+
static extractNumber(incrementId: string): string | null;
|
|
172
|
+
/**
|
|
173
|
+
* Find all existing increments with a given number (detects duplicates).
|
|
174
|
+
*
|
|
175
|
+
* Returns all folder names that share the same base number.
|
|
176
|
+
* E.g., for "0121" returns both "0121-feature-a" and "0121E-feature-b".
|
|
177
|
+
*
|
|
178
|
+
* IMPORTANT: 0001 and 0001E are considered the SAME base number!
|
|
179
|
+
*
|
|
180
|
+
* @param incrementNumber - Increment number to search for (string or number)
|
|
181
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
182
|
+
* @returns Array of folder names with the same base number
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const duplicates = IncrementNumberManager.findDuplicates("0121");
|
|
187
|
+
* // ["0121-ado-jira-feature", "0121-intelligent-living-docs"]
|
|
188
|
+
* ```
|
|
189
|
+
*
|
|
190
|
+
* @since 0.33.0
|
|
191
|
+
*/
|
|
192
|
+
static findDuplicates(incrementNumber: string | number, projectRoot?: string): string[];
|
|
193
|
+
/**
|
|
194
|
+
* Validate that an increment ID is unique before creation.
|
|
195
|
+
*
|
|
196
|
+
* Throws an error if the number already exists (including E-suffix variants).
|
|
197
|
+
* Use this method to validate BEFORE creating increment directories.
|
|
198
|
+
*
|
|
199
|
+
* @param incrementId - Full increment ID to validate (e.g., "0121-feature-name")
|
|
200
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
201
|
+
* @throws Error if increment number already exists
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* // Safe increment creation
|
|
206
|
+
* const id = IncrementNumberManager.generateIncrementId('my-feature');
|
|
207
|
+
* IncrementNumberManager.validateUnique(id); // throws if duplicate
|
|
208
|
+
* fs.mkdirSync(path.join(incrementsDir, id));
|
|
209
|
+
* ```
|
|
210
|
+
*
|
|
211
|
+
* @since 0.33.0
|
|
212
|
+
*/
|
|
213
|
+
static validateUnique(incrementId: string, projectRoot?: string): void;
|
|
214
|
+
/**
|
|
215
|
+
* Generate a guaranteed-unique increment ID with validation.
|
|
216
|
+
*
|
|
217
|
+
* Unlike generateIncrementId(), this method validates that the generated
|
|
218
|
+
* ID doesn't conflict with existing increments before returning.
|
|
219
|
+
*
|
|
220
|
+
* @param name - Kebab-case increment name
|
|
221
|
+
* @param options - Generation options
|
|
222
|
+
* @returns Validated unique increment ID
|
|
223
|
+
* @throws Error if validation fails (should never happen with fresh scan)
|
|
224
|
+
*
|
|
225
|
+
* @example
|
|
226
|
+
* ```typescript
|
|
227
|
+
* const id = IncrementNumberManager.generateUniqueIncrementId('my-feature');
|
|
228
|
+
* // Guaranteed unique, safe to create directory
|
|
229
|
+
* ```
|
|
230
|
+
*
|
|
231
|
+
* @since 0.33.0
|
|
232
|
+
*/
|
|
233
|
+
static generateUniqueIncrementId(name: string, options?: {
|
|
234
|
+
isExternal?: boolean;
|
|
235
|
+
projectRoot?: string;
|
|
236
|
+
}): string;
|
|
87
237
|
}
|
|
88
238
|
//# sourceMappingURL=increment-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"increment-utils.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"increment-utils.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IACjC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,sBAAsB,CAC3B,WAAW,GAAE,MAAsB,EACnC,SAAS,GAAE,OAAc,GACxB,MAAM;IAUT;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;IAIzB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,qBAAqB,CAC1B,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,WAAW,GAAE,MAAsB,GAClC,OAAO;IA2CV;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAqD1C;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,8BAA8B,CACnC,WAAW,GAAE,MAAsB,GAClC,MAAM;IAKT;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,mBAAmB,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,MAAM;IAOT;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAIxD;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQxD;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,cAAc,CACnB,eAAe,EAAE,MAAM,GAAG,MAAM,EAChC,WAAW,GAAE,MAAsB,GAClC,MAAM,EAAE;IAqCX;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,cAAc,CACnB,WAAW,EAAE,MAAM,EACnB,WAAW,GAAE,MAAsB,GAClC,IAAI;IAqBP;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,yBAAyB,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3D,MAAM;CASV"}
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
* The cache was premature optimization that caused bugs. Scanning 4 directories
|
|
11
11
|
* is fast enough (~5ms) and doesn't need caching.
|
|
12
12
|
*
|
|
13
|
+
* E-SUFFIX CONVENTION (v0.32.0):
|
|
14
|
+
* Increments working on external items (imported from GitHub/JIRA/ADO) use
|
|
15
|
+
* E suffix: 0111E-feature-name instead of 0111-feature-name.
|
|
16
|
+
* This maintains consistency with FS-XXXE feature IDs and US-XXXE user stories.
|
|
17
|
+
*
|
|
13
18
|
* @module increment-utils
|
|
14
19
|
* @since 0.18.3
|
|
15
20
|
*/
|
|
@@ -100,8 +105,8 @@ export class IncrementNumberManager {
|
|
|
100
105
|
for (const entry of entries) {
|
|
101
106
|
if (!entry.isDirectory())
|
|
102
107
|
continue;
|
|
103
|
-
// Match pattern: 0032-name or
|
|
104
|
-
const match = entry.name.match(/^(\d{3,4})
|
|
108
|
+
// Match pattern: 0032-name, 032-name, or 0032E-name (external)
|
|
109
|
+
const match = entry.name.match(/^(\d{3,4})E?-/);
|
|
105
110
|
if (match) {
|
|
106
111
|
const entryNumber = match[1].padStart(4, '0');
|
|
107
112
|
if (entryNumber === normalizedNumber) {
|
|
@@ -151,8 +156,8 @@ export class IncrementNumberManager {
|
|
|
151
156
|
for (const entry of entries) {
|
|
152
157
|
if (!entry.isDirectory())
|
|
153
158
|
continue;
|
|
154
|
-
// Match pattern: 0032-name or
|
|
155
|
-
const match = entry.name.match(/^(\d{3,4})
|
|
159
|
+
// Match pattern: 0032-name, 032-name, or 0032E-name (external)
|
|
160
|
+
const match = entry.name.match(/^(\d{3,4})E?-/);
|
|
156
161
|
if (match) {
|
|
157
162
|
totalIncrements++;
|
|
158
163
|
const number = parseInt(match[1], 10);
|
|
@@ -176,5 +181,212 @@ export class IncrementNumberManager {
|
|
|
176
181
|
}
|
|
177
182
|
return highestNumber;
|
|
178
183
|
}
|
|
184
|
+
/**
|
|
185
|
+
* Generate an increment ID for external items.
|
|
186
|
+
*
|
|
187
|
+
* External increments (those working on imported GitHub/JIRA/ADO items)
|
|
188
|
+
* use E suffix to maintain consistency with FS-XXXE and US-XXXE conventions.
|
|
189
|
+
*
|
|
190
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
191
|
+
* @returns Next increment ID with E suffix (e.g., "0033E")
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const id = IncrementNumberManager.getNextExternalIncrementNumber();
|
|
196
|
+
* // "0033E" - for use as "0033E-feature-name"
|
|
197
|
+
* ```
|
|
198
|
+
*
|
|
199
|
+
* @since 0.32.0
|
|
200
|
+
*/
|
|
201
|
+
static getNextExternalIncrementNumber(projectRoot = process.cwd()) {
|
|
202
|
+
const baseNumber = this.getNextIncrementNumber(projectRoot);
|
|
203
|
+
return `${baseNumber}E`;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate a full increment folder name.
|
|
207
|
+
*
|
|
208
|
+
* @param name - Kebab-case increment name (e.g., "dora-metrics-fix")
|
|
209
|
+
* @param options - Options for ID generation
|
|
210
|
+
* @param options.isExternal - If true, adds E suffix for external items
|
|
211
|
+
* @param options.projectRoot - Project root directory
|
|
212
|
+
* @returns Full increment folder name (e.g., "0033E-dora-metrics-fix")
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```typescript
|
|
216
|
+
* // Internal increment
|
|
217
|
+
* const id = IncrementNumberManager.generateIncrementId('feature-name');
|
|
218
|
+
* // "0033-feature-name"
|
|
219
|
+
*
|
|
220
|
+
* // External increment (GitHub/JIRA/ADO item)
|
|
221
|
+
* const extId = IncrementNumberManager.generateIncrementId('dora-fix', { isExternal: true });
|
|
222
|
+
* // "0033E-dora-fix"
|
|
223
|
+
* ```
|
|
224
|
+
*
|
|
225
|
+
* @since 0.32.0
|
|
226
|
+
*/
|
|
227
|
+
static generateIncrementId(name, options = {}) {
|
|
228
|
+
const { isExternal = false, projectRoot = process.cwd() } = options;
|
|
229
|
+
const number = this.getNextIncrementNumber(projectRoot);
|
|
230
|
+
const suffix = isExternal ? 'E' : '';
|
|
231
|
+
return `${number}${suffix}-${name}`;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if an increment ID represents an external item.
|
|
235
|
+
*
|
|
236
|
+
* External increments have E suffix: 0033E-name
|
|
237
|
+
* Internal increments do not: 0033-name
|
|
238
|
+
*
|
|
239
|
+
* @param incrementId - Increment ID or folder name
|
|
240
|
+
* @returns true if increment is external (has E suffix)
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* IncrementNumberManager.isExternalIncrement('0033E-dora-fix'); // true
|
|
245
|
+
* IncrementNumberManager.isExternalIncrement('0033-feature'); // false
|
|
246
|
+
* ```
|
|
247
|
+
*
|
|
248
|
+
* @since 0.32.0
|
|
249
|
+
*/
|
|
250
|
+
static isExternalIncrement(incrementId) {
|
|
251
|
+
return /^\d{3,4}E-/.test(incrementId);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Extract the numeric part from an increment ID.
|
|
255
|
+
*
|
|
256
|
+
* Works with both internal and external increments.
|
|
257
|
+
*
|
|
258
|
+
* @param incrementId - Increment ID or folder name
|
|
259
|
+
* @returns Numeric part as 4-digit string, or null if invalid
|
|
260
|
+
*
|
|
261
|
+
* @example
|
|
262
|
+
* ```typescript
|
|
263
|
+
* IncrementNumberManager.extractNumber('0033E-dora-fix'); // "0033"
|
|
264
|
+
* IncrementNumberManager.extractNumber('0033-feature'); // "0033"
|
|
265
|
+
* IncrementNumberManager.extractNumber('invalid'); // null
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* @since 0.32.0
|
|
269
|
+
*/
|
|
270
|
+
static extractNumber(incrementId) {
|
|
271
|
+
const match = incrementId.match(/^(\d{3,4})E?-/);
|
|
272
|
+
if (match) {
|
|
273
|
+
return match[1].padStart(4, '0');
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Find all existing increments with a given number (detects duplicates).
|
|
279
|
+
*
|
|
280
|
+
* Returns all folder names that share the same base number.
|
|
281
|
+
* E.g., for "0121" returns both "0121-feature-a" and "0121E-feature-b".
|
|
282
|
+
*
|
|
283
|
+
* IMPORTANT: 0001 and 0001E are considered the SAME base number!
|
|
284
|
+
*
|
|
285
|
+
* @param incrementNumber - Increment number to search for (string or number)
|
|
286
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
287
|
+
* @returns Array of folder names with the same base number
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```typescript
|
|
291
|
+
* const duplicates = IncrementNumberManager.findDuplicates("0121");
|
|
292
|
+
* // ["0121-ado-jira-feature", "0121-intelligent-living-docs"]
|
|
293
|
+
* ```
|
|
294
|
+
*
|
|
295
|
+
* @since 0.33.0
|
|
296
|
+
*/
|
|
297
|
+
static findDuplicates(incrementNumber, projectRoot = process.cwd()) {
|
|
298
|
+
const incrementsDir = path.join(projectRoot, '.specweave', 'increments');
|
|
299
|
+
const normalizedNumber = String(incrementNumber).padStart(4, '0');
|
|
300
|
+
const duplicates = [];
|
|
301
|
+
const dirsToCheck = [
|
|
302
|
+
{ path: incrementsDir, label: 'active' },
|
|
303
|
+
{ path: path.join(incrementsDir, '_archive'), label: '_archive' },
|
|
304
|
+
{ path: path.join(incrementsDir, '_abandoned'), label: '_abandoned' },
|
|
305
|
+
{ path: path.join(incrementsDir, '_paused'), label: '_paused' }
|
|
306
|
+
];
|
|
307
|
+
for (const { path: dirPath, label } of dirsToCheck) {
|
|
308
|
+
if (!fs.existsSync(dirPath))
|
|
309
|
+
continue;
|
|
310
|
+
try {
|
|
311
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
312
|
+
for (const entry of entries) {
|
|
313
|
+
if (!entry.isDirectory())
|
|
314
|
+
continue;
|
|
315
|
+
const match = entry.name.match(/^(\d{3,4})E?-/);
|
|
316
|
+
if (match) {
|
|
317
|
+
const entryNumber = match[1].padStart(4, '0');
|
|
318
|
+
if (entryNumber === normalizedNumber) {
|
|
319
|
+
duplicates.push(`${entry.name} (${label})`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return duplicates;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Validate that an increment ID is unique before creation.
|
|
332
|
+
*
|
|
333
|
+
* Throws an error if the number already exists (including E-suffix variants).
|
|
334
|
+
* Use this method to validate BEFORE creating increment directories.
|
|
335
|
+
*
|
|
336
|
+
* @param incrementId - Full increment ID to validate (e.g., "0121-feature-name")
|
|
337
|
+
* @param projectRoot - Project root directory (defaults to process.cwd())
|
|
338
|
+
* @throws Error if increment number already exists
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* ```typescript
|
|
342
|
+
* // Safe increment creation
|
|
343
|
+
* const id = IncrementNumberManager.generateIncrementId('my-feature');
|
|
344
|
+
* IncrementNumberManager.validateUnique(id); // throws if duplicate
|
|
345
|
+
* fs.mkdirSync(path.join(incrementsDir, id));
|
|
346
|
+
* ```
|
|
347
|
+
*
|
|
348
|
+
* @since 0.33.0
|
|
349
|
+
*/
|
|
350
|
+
static validateUnique(incrementId, projectRoot = process.cwd()) {
|
|
351
|
+
const number = this.extractNumber(incrementId);
|
|
352
|
+
if (!number) {
|
|
353
|
+
throw new Error(`Invalid increment ID format: ${incrementId}`);
|
|
354
|
+
}
|
|
355
|
+
const duplicates = this.findDuplicates(number, projectRoot);
|
|
356
|
+
// Filter out the exact same ID (it's okay to exist if we're just checking)
|
|
357
|
+
const otherDuplicates = duplicates.filter(d => !d.startsWith(incrementId));
|
|
358
|
+
if (otherDuplicates.length > 0) {
|
|
359
|
+
throw new Error(`Duplicate increment number detected! Number ${number} already exists:\n` +
|
|
360
|
+
otherDuplicates.map(d => ` - ${d}`).join('\n') +
|
|
361
|
+
`\n\nIMPORTANT: 0001 and 0001E share the SAME base number and cannot coexist.\n` +
|
|
362
|
+
`Use getNextIncrementNumber() to get a unique number.`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Generate a guaranteed-unique increment ID with validation.
|
|
367
|
+
*
|
|
368
|
+
* Unlike generateIncrementId(), this method validates that the generated
|
|
369
|
+
* ID doesn't conflict with existing increments before returning.
|
|
370
|
+
*
|
|
371
|
+
* @param name - Kebab-case increment name
|
|
372
|
+
* @param options - Generation options
|
|
373
|
+
* @returns Validated unique increment ID
|
|
374
|
+
* @throws Error if validation fails (should never happen with fresh scan)
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* ```typescript
|
|
378
|
+
* const id = IncrementNumberManager.generateUniqueIncrementId('my-feature');
|
|
379
|
+
* // Guaranteed unique, safe to create directory
|
|
380
|
+
* ```
|
|
381
|
+
*
|
|
382
|
+
* @since 0.33.0
|
|
383
|
+
*/
|
|
384
|
+
static generateUniqueIncrementId(name, options = {}) {
|
|
385
|
+
const { projectRoot = process.cwd() } = options;
|
|
386
|
+
const id = this.generateIncrementId(name, options);
|
|
387
|
+
// Double-check uniqueness (defends against race conditions)
|
|
388
|
+
this.validateUnique(id, projectRoot);
|
|
389
|
+
return id;
|
|
390
|
+
}
|
|
179
391
|
}
|
|
180
392
|
//# sourceMappingURL=increment-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"increment-utils.js","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"increment-utils.js","sourceRoot":"","sources":["../../../../src/core/increment/increment-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,sBAAsB;IACjC;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,sBAAsB,CAC3B,cAAsB,OAAO,CAAC,GAAG,EAAE,EACnC,YAAqB,IAAI,CAAC,8BAA8B;;QAExD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAEzE,8DAA8D;QAC9D,MAAM,aAAa,GAAG,IAAI,CAAC,2BAA2B,CAAC,aAAa,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,aAAa,GAAG,CAAC,CAAC;QAErC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,wBAAwB;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,qBAAqB,CAC1B,eAAgC,EAChC,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAEzE,8BAA8B;QAC9B,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAElE,uBAAuB;QACvB,MAAM,WAAW,GAAG;YAClB,aAAa;YACb,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;SACpC,CAAC;QAEF,uBAAuB;QACvB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAElC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,SAAS;oBAEnC,+DAA+D;oBAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAC9C,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;4BACrC,OAAO,IAAI,CAAC;wBACd,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8CAA8C;gBAC9C,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAGD;;;;;;;;;;;;OAYG;IACK,MAAM,CAAC,2BAA2B,CAAC,aAAqB;QAC9D,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,sBAAsB;QACtB,MAAM,UAAU,GAAG;YACjB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE;YACtC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;YACjE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;YACrE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;SAChE,CAAC;QAEF,sBAAsB;QACtB,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,WAAW,EAAE,CAAC;gBAEd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,SAAS;oBAEnC,+DAA+D;oBAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACV,eAAe,EAAE,CAAC;wBAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACtC,IAAI,MAAM,GAAG,aAAa,EAAE,CAAC;4BAC3B,aAAa,GAAG,MAAM,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8DAA8D;gBAC9D,OAAO,CAAC,IAAI,CAAC,qCAAqC,OAAO,GAAG,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;gBACxF,SAAS;YACX,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,aAAa,KAAK,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAClE,+DAA+D;YAC/D,MAAM,IAAI,KAAK,CACb,gCAAgC,eAAe,uCAAuC;gBACtF,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,8BAA8B,CACnC,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAC5D,OAAO,GAAG,UAAU,GAAG,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,mBAAmB,CACxB,IAAY,EACZ,UAA0D,EAAE;QAE5D,MAAM,EAAE,UAAU,GAAG,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,MAAM,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAmB;QAC5C,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,aAAa,CAAC,WAAmB;QACtC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,cAAc,CACnB,eAAgC,EAChC,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACzE,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClE,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG;YAClB,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;YACxC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;YACjE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;YACrE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;SAChE,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAS;YAEtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;wBAAE,SAAS;oBAEnC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;wBAC9C,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;4BACrC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,cAAc,CACnB,WAAmB,EACnB,cAAsB,OAAO,CAAC,GAAG,EAAE;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE5D,2EAA2E;QAC3E,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAE3E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,+CAA+C,MAAM,oBAAoB;gBACzE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/C,gFAAgF;gBAChF,sDAAsD,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,yBAAyB,CAC9B,IAAY,EACZ,UAA0D,EAAE;QAE5D,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEnD,4DAA4D;QAC5D,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAErC,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -136,7 +136,7 @@ export class MetadataValidator {
|
|
|
136
136
|
const entries = await fs.readdir(incrementsDir, { withFileTypes: true });
|
|
137
137
|
const incrementDirs = entries
|
|
138
138
|
.filter(entry => entry.isDirectory())
|
|
139
|
-
.filter(entry => /^\d{4}
|
|
139
|
+
.filter(entry => /^\d{3,4}E?-/.test(entry.name));
|
|
140
140
|
for (const dir of incrementDirs) {
|
|
141
141
|
const result = await this.validate(dir.name);
|
|
142
142
|
results.set(dir.name, result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/metadata-validator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"metadata-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/metadata-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -106,7 +106,11 @@ export declare class FeatureArchiver {
|
|
|
106
106
|
* Examples:
|
|
107
107
|
* - "0041-living-docs-test-fixes" → "FS-041"
|
|
108
108
|
* - "0123-my-feature" → "FS-123"
|
|
109
|
+
* - "0111E-external-issue" → "FS-111E" (external increment → external feature)
|
|
109
110
|
* - "temp-experiment" → null (no number)
|
|
111
|
+
*
|
|
112
|
+
* CRITICAL (v0.33.0): External increments (with E suffix like 0111E-...)
|
|
113
|
+
* MUST map to external features (FS-111E), not internal ones (FS-111).
|
|
110
114
|
*/
|
|
111
115
|
private inferFeatureIdFromIncrement;
|
|
112
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-archiver.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-archiver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkBH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,EAAE,MAAM;IAU3B;;OAEG;IACG,eAAe,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0DzF;;;OAGG;YACW,yBAAyB;
|
|
1
|
+
{"version":3,"file":"feature-archiver.d.ts","sourceRoot":"","sources":["../../../../src/core/living-docs/feature-archiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -100,6 +100,14 @@ export class FeatureArchiver {
|
|
|
100
100
|
// Empty array .every() returns true, so we must explicitly check length
|
|
101
101
|
// Archive orphaned features ONLY if option is set
|
|
102
102
|
const isOrphaned = linkedIncrements.length === 0 && options.archiveOrphanedFeatures;
|
|
103
|
+
// v0.33.0: External features (FS-XXXE) are NOT orphaned - they're imported from
|
|
104
|
+
// external tools and should be handled by archiveExternalFeatures() separately!
|
|
105
|
+
// Skip external features in the normal archiving flow.
|
|
106
|
+
const isExternalFeature = featureId.endsWith('E');
|
|
107
|
+
if (isExternalFeature && linkedIncrements.length === 0) {
|
|
108
|
+
console.log(`⏭️ Skipping ${featureId}: external feature (use --external flag to archive)`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
103
111
|
// Check if all linked increments are archived (EXACT MATCH, not partial)
|
|
104
112
|
// CRITICAL: Use exact match (===) not .includes() to avoid false positives
|
|
105
113
|
// SAFETY: If no linked increments and archiveOrphanedFeatures is false, skip
|
|
@@ -557,17 +565,24 @@ export class FeatureArchiver {
|
|
|
557
565
|
* Examples:
|
|
558
566
|
* - "0041-living-docs-test-fixes" → "FS-041"
|
|
559
567
|
* - "0123-my-feature" → "FS-123"
|
|
568
|
+
* - "0111E-external-issue" → "FS-111E" (external increment → external feature)
|
|
560
569
|
* - "temp-experiment" → null (no number)
|
|
570
|
+
*
|
|
571
|
+
* CRITICAL (v0.33.0): External increments (with E suffix like 0111E-...)
|
|
572
|
+
* MUST map to external features (FS-111E), not internal ones (FS-111).
|
|
561
573
|
*/
|
|
562
574
|
inferFeatureIdFromIncrement(increment) {
|
|
563
|
-
// Extract 4-digit number prefix
|
|
564
|
-
|
|
575
|
+
// Extract 4-digit number prefix and optional E suffix
|
|
576
|
+
// Pattern: NNNN or NNNNE (e.g., 0041, 0111E)
|
|
577
|
+
const match = increment.match(/^(\d{4})(E)?/);
|
|
565
578
|
if (!match) {
|
|
566
579
|
return null; // Can't infer (no number prefix)
|
|
567
580
|
}
|
|
568
581
|
const number = parseInt(match[1], 10);
|
|
569
|
-
|
|
570
|
-
|
|
582
|
+
const isExternal = match[2] === 'E';
|
|
583
|
+
// Convert to feature ID format: 41 → "FS-041", 111E → "FS-111E"
|
|
584
|
+
const featureId = `FS-${number.toString().padStart(3, '0')}`;
|
|
585
|
+
return isExternal ? `${featureId}E` : featureId;
|
|
571
586
|
}
|
|
572
587
|
/**
|
|
573
588
|
* Get features linked to an epic
|
|
@@ -687,16 +702,23 @@ export class FeatureArchiver {
|
|
|
687
702
|
}
|
|
688
703
|
try {
|
|
689
704
|
const content = await fs.readFile(featureMdPath, 'utf-8');
|
|
690
|
-
// Extract increment number from Implementation History
|
|
691
|
-
|
|
705
|
+
// Extract increment number and optional E suffix from Implementation History
|
|
706
|
+
// CRITICAL (v0.33.0): Handle external increments like [0111E-name](...)
|
|
707
|
+
const match = content.match(/\[(\d{4})(E)?-[^\]]+\]\([^)]*increments/);
|
|
692
708
|
if (!match) {
|
|
693
709
|
continue; // No increment reference found
|
|
694
710
|
}
|
|
695
711
|
const referencedIncrementNum = parseInt(match[1]);
|
|
696
|
-
const
|
|
697
|
-
//
|
|
698
|
-
|
|
699
|
-
|
|
712
|
+
const isExternalIncrement = match[2] === 'E';
|
|
713
|
+
// Parse current feature ID - handle both FS-111 and FS-111E
|
|
714
|
+
const currentFeatureNum = parseInt(featureId.replace('FS-', '').replace('E', ''));
|
|
715
|
+
const isCurrentExternal = featureId.endsWith('E');
|
|
716
|
+
// Check if feature ID matches referenced increment (both number AND external status)
|
|
717
|
+
const numberMismatch = referencedIncrementNum !== currentFeatureNum;
|
|
718
|
+
const externalMismatch = isExternalIncrement !== isCurrentExternal;
|
|
719
|
+
if (numberMismatch || externalMismatch) {
|
|
720
|
+
const baseId = `FS-${referencedIncrementNum.toString().padStart(3, '0')}`;
|
|
721
|
+
const expectedFeatureId = isExternalIncrement ? `${baseId}E` : baseId;
|
|
700
722
|
console.log(` ⚠️ Mismatch: ${featureId} references increment ${match[1]}`);
|
|
701
723
|
console.log(` Renaming ${featureId} → ${expectedFeatureId}`);
|
|
702
724
|
// Rename the feature folder
|