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
package/CLAUDE.md
CHANGED
|
@@ -111,6 +111,63 @@ const config = detectStructureLevel(projectRoot);
|
|
|
111
111
|
|
|
112
112
|
**Pre-tool-use hook `spec-project-validator.sh` BLOCKS spec.md without required fields (2-level).**
|
|
113
113
|
|
|
114
|
+
### 2d. NEVER Create Files in _features/ Folder (OBSOLETE v5.0.0+)
|
|
115
|
+
|
|
116
|
+
**The `_features/` folder is OBSOLETE!** Features MUST live in project folders:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
❌ FORBIDDEN (Bug pattern from 2025-12-06):
|
|
120
|
+
.specweave/docs/internal/specs/_features/FS-116/FEATURE.md
|
|
121
|
+
|
|
122
|
+
✅ CORRECT:
|
|
123
|
+
.specweave/docs/internal/specs/{project}/FS-116/FEATURE.md
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Where `{project}` comes from:**
|
|
127
|
+
1. spec.md YAML frontmatter `project:` field (MANDATORY)
|
|
128
|
+
2. Example: `project: specweave` → `.specweave/docs/internal/specs/specweave/FS-116/`
|
|
129
|
+
|
|
130
|
+
**Pre-tool-use hook `features-folder-guard.sh` BLOCKS writes to `_features/` (v0.33.0+).**
|
|
131
|
+
|
|
132
|
+
### 2e. NEVER Create Duplicate Increment IDs (v0.33.0+)
|
|
133
|
+
|
|
134
|
+
**Increment numbers MUST be unique across ALL directories!**
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
❌ FORBIDDEN (Bug pattern from 2025-12-07):
|
|
138
|
+
0121-ado-jira-feature-parity-p2-p3/ ← exists
|
|
139
|
+
0121-intelligent-living-docs-content/ ← DUPLICATE!
|
|
140
|
+
|
|
141
|
+
❌ ALSO FORBIDDEN (0001 and 0001E share SAME base number):
|
|
142
|
+
0001-internal-feature/
|
|
143
|
+
0001E-external-fix/ ← COLLISION! Same base number!
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**VALIDATION RULES:**
|
|
147
|
+
```
|
|
148
|
+
✅ ALWAYS use IncrementNumberManager.generateUniqueIncrementId()
|
|
149
|
+
✅ ALWAYS use IncrementNumberManager.validateUnique() before creating
|
|
150
|
+
✅ Check ALL directories: active, _archive, _abandoned, _paused
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**API (v0.33.0+):**
|
|
154
|
+
```typescript
|
|
155
|
+
import { IncrementNumberManager } from './core/increment/increment-utils.js';
|
|
156
|
+
|
|
157
|
+
// Safe generation with validation:
|
|
158
|
+
const id = IncrementNumberManager.generateUniqueIncrementId('feature-name');
|
|
159
|
+
// → "0122-feature-name" (guaranteed unique)
|
|
160
|
+
|
|
161
|
+
// Manual validation:
|
|
162
|
+
IncrementNumberManager.validateUnique('0121-new-name'); // throws if duplicate!
|
|
163
|
+
|
|
164
|
+
// Find duplicates:
|
|
165
|
+
IncrementNumberManager.findDuplicates('0121');
|
|
166
|
+
// → ["0121-ado-jira-feature (active)", "0121-intelligent-living-docs (active)"]
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Pre-tool-use hook `increment-duplicate-guard.sh` BLOCKS duplicate increment creation (v0.33.0+).**
|
|
170
|
+
|
|
114
171
|
### 3. Protected Directories
|
|
115
172
|
|
|
116
173
|
**NEVER delete**: `.specweave/docs/`, `.specweave/increments/`
|
|
@@ -188,6 +245,79 @@ find .specweave/docs -name "*.md" -exec sed -i '' 's/target=_blank/target="_blan
|
|
|
188
245
|
find .specweave/docs -name "*.md" -exec sed -i '' 's/dir=auto/dir="auto"/g' {} \;
|
|
189
246
|
```
|
|
190
247
|
|
|
248
|
+
### 9. NEVER Use Bash for File Creation (INFINITE HANG PREVENTION!)
|
|
249
|
+
|
|
250
|
+
**Bash + heredoc/echo for files = SESSION FREEZE** (shell waits forever for EOF)
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
❌ FORBIDDEN (Crash pattern from 2025-12-06 - 2 HOUR HANG!):
|
|
254
|
+
Bash("cat > file.md << 'EOF'\nContent here\nEOF")
|
|
255
|
+
Bash("echo 'content' > file.md")
|
|
256
|
+
Bash("printf 'content' > file.md")
|
|
257
|
+
|
|
258
|
+
→ If heredoc is truncated mid-content, shell waits FOREVER for EOF terminator!
|
|
259
|
+
→ Claude Code session stuck "Marinating..." for hours with no recovery!
|
|
260
|
+
|
|
261
|
+
✅ MANDATORY - Use Write tool:
|
|
262
|
+
Write({ file_path: "/path/to/file.md", content: "Content here" })
|
|
263
|
+
|
|
264
|
+
✅ MANDATORY - Use Edit tool for modifications:
|
|
265
|
+
Edit({ file_path: "/path/to/file.md", old_string: "old", new_string: "new" })
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Why heredocs are catastrophically dangerous:**
|
|
269
|
+
1. **Truncation = infinite wait**: Token limits can cut off EOF terminator
|
|
270
|
+
2. **No timeout**: Shell waits forever, bypasses Claude Code's 2-min limit
|
|
271
|
+
3. **No recovery**: Session becomes completely unresponsive
|
|
272
|
+
4. **Silent failure**: No error message, just endless "Waiting..."
|
|
273
|
+
|
|
274
|
+
**Tool selection rules:**
|
|
275
|
+
| Operation | CORRECT Tool | FORBIDDEN |
|
|
276
|
+
|-----------|--------------|-----------|
|
|
277
|
+
| Create file | `Write` | `Bash cat/echo/printf >` |
|
|
278
|
+
| Edit file | `Edit` | `Bash sed/awk` |
|
|
279
|
+
| Append to file | `Read` + `Write` | `Bash echo >>` |
|
|
280
|
+
| Create directory | `Bash mkdir -p` | ✅ OK |
|
|
281
|
+
|
|
282
|
+
**Pre-tool-use hook `bash-file-guard.sh` BLOCKS dangerous Bash file patterns (v0.32.1+).**
|
|
283
|
+
This hook automatically blocks: heredoc, echo >, printf >, cat > patterns.
|
|
284
|
+
|
|
285
|
+
**If session gets stuck ("Marinating..." / "Waiting..."):**
|
|
286
|
+
```bash
|
|
287
|
+
# 1. Kill Claude Code (Ctrl+C or close terminal)
|
|
288
|
+
# 2. Kill zombie shell processes:
|
|
289
|
+
pkill -f "cat.*EOF"
|
|
290
|
+
pkill -f "bash.*heredoc"
|
|
291
|
+
# 3. Clean state:
|
|
292
|
+
rm -f .specweave/state/.processor.lock
|
|
293
|
+
rm -f .specweave/state/.dedup-cache/*.lock
|
|
294
|
+
# 4. Restart Claude Code
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### 10. Bash Tool - Terminal Operations ONLY
|
|
298
|
+
|
|
299
|
+
**Bash is for system commands, NOT file manipulation:**
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
✅ ALLOWED Bash operations:
|
|
303
|
+
- git commands (status, add, commit, push, diff)
|
|
304
|
+
- npm/pnpm/yarn commands (install, build, test)
|
|
305
|
+
- Directory operations (mkdir, ls, pwd)
|
|
306
|
+
- Process management (ps, kill, pkill)
|
|
307
|
+
- Network tools (curl, wget for APIs)
|
|
308
|
+
- Build tools (make, cmake, cargo)
|
|
309
|
+
|
|
310
|
+
❌ FORBIDDEN - Use dedicated tools instead:
|
|
311
|
+
- File reading → Read tool
|
|
312
|
+
- File writing → Write tool
|
|
313
|
+
- File editing → Edit tool
|
|
314
|
+
- File searching → Glob tool
|
|
315
|
+
- Content searching → Grep tool
|
|
316
|
+
- Communication → Direct text output
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Mental model**: Bash = "run a program". Write/Edit/Read = "modify files".
|
|
320
|
+
|
|
191
321
|
---
|
|
192
322
|
|
|
193
323
|
## Development Setup
|
|
@@ -227,11 +357,37 @@ git add . && git commit -m "feat: feature" && git push origin develop
|
|
|
227
357
|
|
|
228
358
|
## Folder Structure
|
|
229
359
|
|
|
230
|
-
**At `.specweave/increments/` root - ONLY**: `####-name/` folders, `_archive/`, `README.md`
|
|
360
|
+
**At `.specweave/increments/` root - ONLY**: `####-name/` or `####E-name/` folders, `_archive/`, `README.md`
|
|
231
361
|
|
|
232
362
|
**Inside increment folders - ONLY at root**: `spec.md`, `plan.md`, `tasks.md`, `metadata.json`
|
|
233
363
|
**Everything else → subfolders**: `reports/`, `scripts/`, `logs/`, `backups/`, `docs/`
|
|
234
364
|
|
|
365
|
+
### External Increment E-Suffix (v0.32.0+)
|
|
366
|
+
|
|
367
|
+
**Increments for external items MUST use E suffix** to match FS-XXXE, US-XXXE conventions:
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
✅ CORRECT: 0111E-dora-metrics-fix (external GitHub issue #779)
|
|
371
|
+
❌ WRONG: 0111-dora-metrics-fix (missing E suffix)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**When to use E suffix:**
|
|
375
|
+
- Increment works on imported GitHub/JIRA/ADO issue
|
|
376
|
+
- spec.md has `origin: external` or `external_ref:`
|
|
377
|
+
- Feature folder is FS-XXXE (ends with E)
|
|
378
|
+
|
|
379
|
+
**API (v0.32.0+):**
|
|
380
|
+
```typescript
|
|
381
|
+
import { IncrementNumberManager } from './core/increment/increment-utils.js';
|
|
382
|
+
|
|
383
|
+
// For external items:
|
|
384
|
+
const id = IncrementNumberManager.generateIncrementId('fix-name', { isExternal: true });
|
|
385
|
+
// → "0112E-fix-name"
|
|
386
|
+
|
|
387
|
+
// Check if external:
|
|
388
|
+
IncrementNumberManager.isExternalIncrement('0111E-fix'); // true
|
|
389
|
+
```
|
|
390
|
+
|
|
235
391
|
### CLI Command Structure (ADR-0138)
|
|
236
392
|
|
|
237
393
|
**Init command** is modular - DO NOT add logic to main file:
|
|
@@ -345,7 +501,60 @@ npm run test:all # All tests (80%+ coverage required)
|
|
|
345
501
|
|
|
346
502
|
## Emergency
|
|
347
503
|
|
|
348
|
-
|
|
504
|
+
### Session Stuck ("Marinating..." for hours)
|
|
505
|
+
|
|
506
|
+
**Cause**: Heredoc command truncated, shell waiting forever for EOF.
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
# 1. Force quit Claude Code (Ctrl+C multiple times, or close terminal)
|
|
510
|
+
|
|
511
|
+
# 2. Kill zombie processes:
|
|
512
|
+
pkill -f "cat.*EOF"
|
|
513
|
+
pkill -9 -f "bash.*specweave"
|
|
514
|
+
|
|
515
|
+
# 3. Clean locks:
|
|
516
|
+
rm -f .specweave/state/.processor.lock
|
|
517
|
+
rm -f .specweave/state/*.lock
|
|
518
|
+
rm -rf .specweave/state/.dedup-cache/*.lock
|
|
519
|
+
|
|
520
|
+
# 4. Restart Claude Code
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**Prevention**: NEVER use `Bash("cat > file << EOF")` - use `Write` tool instead!
|
|
524
|
+
|
|
525
|
+
### MCP IDE Connection Drops (v0.32.1+)
|
|
526
|
+
|
|
527
|
+
**Symptoms**: Session hangs, commands not responding, "Waiting..." forever, UI frozen
|
|
528
|
+
**Root Cause**: VSCode MCP server WebSocket connection drops after ~2 seconds
|
|
529
|
+
|
|
530
|
+
**Detection** (check `~/.claude/debug/latest`):
|
|
531
|
+
```
|
|
532
|
+
MCP server "ide": WS-IDE connection dropped after 2s uptime
|
|
533
|
+
MCP server "ide": Connection error: Received a response for an unknown message ID
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
**Quick Fix:**
|
|
537
|
+
```bash
|
|
538
|
+
# 1. Restart VS Code Extension Host:
|
|
539
|
+
# Cmd+Shift+P → "Developer: Restart Extension Host"
|
|
540
|
+
|
|
541
|
+
# 2. Reduce diagnostics payload (close extra tabs/files in VS Code)
|
|
542
|
+
|
|
543
|
+
# 3. If persists, run Claude Code in plain terminal (not VS Code integrated):
|
|
544
|
+
cd /path/to/project && claude
|
|
545
|
+
|
|
546
|
+
# 4. Run cleanup script:
|
|
547
|
+
bash plugins/specweave/scripts/cleanup-state.sh
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**Prevention:**
|
|
551
|
+
- Keep VS Code file count low (large diagnostics payloads cause drops)
|
|
552
|
+
- Update Claude Code VS Code extension regularly
|
|
553
|
+
- Use terminal mode for long-running sessions
|
|
554
|
+
|
|
555
|
+
### Crash loop / prompt duplication
|
|
556
|
+
|
|
557
|
+
**Disable hooks FIRST:**
|
|
349
558
|
```bash
|
|
350
559
|
export SPECWEAVE_DISABLE_HOOKS=1 # In terminal before starting Claude
|
|
351
560
|
# OR rename hooks.json:
|
|
@@ -367,10 +576,14 @@ npm run rebuild
|
|
|
367
576
|
|
|
368
577
|
| Aspect | Rule |
|
|
369
578
|
|--------|------|
|
|
579
|
+
| **File ops** | Write/Edit/Read tools ONLY. NEVER Bash heredoc/echo! |
|
|
580
|
+
| **Bash guard** | Hook `bash-file-guard.sh` BLOCKS dangerous patterns (v0.32.1+) |
|
|
370
581
|
| Skills vs Agents | Skills = auto-activate (keywords), Agents = explicit `Task()` |
|
|
371
582
|
| Hook events | PostToolUse, PreToolUse, UserPromptSubmit, Stop, SessionStart/End, etc. |
|
|
372
583
|
| Cache location | `.specweave/cache/` (24h TTL) |
|
|
373
584
|
| Pre-commit | Blocks 50+ deletions, `rm -rf` on protected dirs |
|
|
585
|
+
| Stuck session | Kill + `pkill -f "cat.*EOF"` + clean locks + restart |
|
|
586
|
+
| MCP drops | Restart Extension Host OR use terminal mode |
|
|
374
587
|
|
|
375
588
|
---
|
|
376
589
|
|
package/README.md
CHANGED
|
@@ -217,6 +217,28 @@ As a user, I want to toggle dark mode so that I can reduce eye strain at night.
|
|
|
217
217
|
|
|
218
218
|
---
|
|
219
219
|
|
|
220
|
+
## When to Use Increments
|
|
221
|
+
|
|
222
|
+
Not every change needs an increment. **The rule of thumb:**
|
|
223
|
+
|
|
224
|
+
| Change Type | Use Increment? | Why |
|
|
225
|
+
|-------------|----------------|-----|
|
|
226
|
+
| **Typo fix, version bump** | No | Zero learning, purely mechanical |
|
|
227
|
+
| **Bug fix that taught you something** | **Yes** | Capture the knowledge for future devs |
|
|
228
|
+
| **Any user-facing change** | **Yes** | Track delivery, enable DORA metrics |
|
|
229
|
+
| **Architecture decision** | **Yes** | Needs ADR for future understanding |
|
|
230
|
+
|
|
231
|
+
**The principle**: *If you'd explain this change to a colleague, document it in an increment.*
|
|
232
|
+
|
|
233
|
+
Increments capture **knowledge**. Ad-hoc work is **ephemeral**. When teams routinely do meaningful work without increments, they lose:
|
|
234
|
+
- **Traceability** — Why was this decision made?
|
|
235
|
+
- **Knowledge transfer** — How does this system work?
|
|
236
|
+
- **Metrics accuracy** — DORA metrics reflect reality
|
|
237
|
+
|
|
238
|
+
**Quick check before ad-hoc work**: "Will I remember why I made this change in 6 months?" If no → increment.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
220
242
|
## Key Features
|
|
221
243
|
|
|
222
244
|
### Works With ANY AI Tool
|
package/bin/specweave.js
CHANGED
|
@@ -108,13 +108,14 @@ program
|
|
|
108
108
|
// Archive command - Archive completed increments and sync living docs
|
|
109
109
|
program
|
|
110
110
|
.command('archive [increments...]')
|
|
111
|
-
.description('Archive completed increments and sync living docs (
|
|
111
|
+
.description('Archive completed increments and sync living docs (project-specific folders)')
|
|
112
112
|
.option('--keep-last <n>', 'Keep last N increments, archive the rest', '5')
|
|
113
113
|
.option('--last <n>', 'STRICT: Keep exactly last N increments by number, ignoring all protections')
|
|
114
114
|
.option('--older-than <days>', 'Archive increments older than N days')
|
|
115
115
|
.option('--pattern <pattern>', 'Archive increments matching pattern (regex)')
|
|
116
116
|
.option('--archive-completed', 'Archive all completed increments')
|
|
117
117
|
.option('--no-preserve-active', 'Allow archiving active/paused increments (dangerous!)')
|
|
118
|
+
.option('--external', 'Archive external living docs (FS-XXXE features imported from ADO/JIRA/GitHub)')
|
|
118
119
|
.option('--dry-run', 'Preview what would be archived without moving files')
|
|
119
120
|
.action(async (incrementIds, options) => {
|
|
120
121
|
const { archiveCommand } = await import('../dist/src/cli/commands/archive.js');
|
|
@@ -321,6 +322,20 @@ program
|
|
|
321
322
|
await livingDocsCommand(options);
|
|
322
323
|
});
|
|
323
324
|
|
|
325
|
+
// Cache command - Dashboard cache management
|
|
326
|
+
program
|
|
327
|
+
.command('cache')
|
|
328
|
+
.description('Manage dashboard cache for instant status commands')
|
|
329
|
+
.option('--rebuild', 'Rebuild cache from increments')
|
|
330
|
+
.option('--status', 'Show cache status (default)')
|
|
331
|
+
.option('--clear', 'Clear cache')
|
|
332
|
+
.option('--quiet', 'Minimal output')
|
|
333
|
+
.option('--debug', 'Show debug information')
|
|
334
|
+
.action(async (options) => {
|
|
335
|
+
const { cacheCommand } = await import('../dist/src/cli/commands/cache.js');
|
|
336
|
+
await cacheCommand(options);
|
|
337
|
+
});
|
|
338
|
+
|
|
324
339
|
// Commits command - Display last 2 git commits
|
|
325
340
|
program
|
|
326
341
|
.command('commits')
|
|
@@ -344,6 +359,36 @@ program
|
|
|
344
359
|
await syncCmd.parseAsync(['node', 'sync-scheduled', ...process.argv.slice(3)], { from: 'user' });
|
|
345
360
|
});
|
|
346
361
|
|
|
362
|
+
// Context command - Get project/board context for increment planning
|
|
363
|
+
const contextCmd = program
|
|
364
|
+
.command('context')
|
|
365
|
+
.description('Get project/board context for increment planning');
|
|
366
|
+
|
|
367
|
+
contextCmd
|
|
368
|
+
.command('projects')
|
|
369
|
+
.description('List available projects and structure level')
|
|
370
|
+
.action(async () => {
|
|
371
|
+
const { contextProjectsCommand } = await import('../dist/src/cli/commands/context.js');
|
|
372
|
+
await contextProjectsCommand();
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
contextCmd
|
|
376
|
+
.command('boards')
|
|
377
|
+
.description('List available boards for a project (2-level structures)')
|
|
378
|
+
.option('-p, --project <id>', 'Project ID to filter boards')
|
|
379
|
+
.action(async (options) => {
|
|
380
|
+
const { contextBoardsCommand } = await import('../dist/src/cli/commands/context.js');
|
|
381
|
+
await contextBoardsCommand(options);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
contextCmd
|
|
385
|
+
.command('select')
|
|
386
|
+
.description('Interactive project/board selection (auto-selects if single option)')
|
|
387
|
+
.action(async () => {
|
|
388
|
+
const { contextSelectCommand } = await import('../dist/src/cli/commands/context.js');
|
|
389
|
+
await contextSelectCommand();
|
|
390
|
+
});
|
|
391
|
+
|
|
347
392
|
// Help text
|
|
348
393
|
program.on('--help', () => {
|
|
349
394
|
console.log('');
|
|
@@ -378,7 +423,13 @@ program.on('--help', () => {
|
|
|
378
423
|
console.log(' $ specweave living-docs --resume <jobId> # Resume orphaned job');
|
|
379
424
|
console.log(' $ specweave sync-scheduled # Execute due sync jobs');
|
|
380
425
|
console.log(' $ specweave sync-scheduled --force # Force sync all jobs');
|
|
426
|
+
console.log(' $ specweave cache # Show cache status');
|
|
427
|
+
console.log(' $ specweave cache --rebuild # Rebuild dashboard cache');
|
|
428
|
+
console.log(' $ specweave cache --debug # Show cache debug info');
|
|
381
429
|
console.log(' $ specweave validate-jira --env .env.prod # Validate with custom .env file');
|
|
430
|
+
console.log(' $ specweave context projects # Get available projects as JSON');
|
|
431
|
+
console.log(' $ specweave context boards --project myapp # Get boards for a project');
|
|
432
|
+
console.log(' $ specweave context select # Interactive project/board selection');
|
|
382
433
|
console.log('');
|
|
383
434
|
console.log('Supported AI Tools:');
|
|
384
435
|
console.log(' - Claude Code (full automation) - Native skills, agents, hooks');
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure DevOps Duplicate Detector (v0.33.0)
|
|
3
|
+
*
|
|
4
|
+
* Implements 3-phase duplicate protection for ADO work items:
|
|
5
|
+
* 1. Detection: Check before create
|
|
6
|
+
* 2. Verification: Count check after create
|
|
7
|
+
* 3. Reflection: Auto-close duplicates
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the GitHub DuplicateDetector pattern for consistency.
|
|
10
|
+
*/
|
|
11
|
+
import { Logger } from '../../../src/utils/logger.js';
|
|
12
|
+
export interface AdoWorkItem {
|
|
13
|
+
id: number;
|
|
14
|
+
title: string;
|
|
15
|
+
state: string;
|
|
16
|
+
createdDate: string;
|
|
17
|
+
url?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DuplicateGroup {
|
|
20
|
+
title: string;
|
|
21
|
+
items: AdoWorkItem[];
|
|
22
|
+
keepItem: AdoWorkItem;
|
|
23
|
+
duplicates: AdoWorkItem[];
|
|
24
|
+
}
|
|
25
|
+
export interface DetectionResult {
|
|
26
|
+
found: boolean;
|
|
27
|
+
existingItem?: AdoWorkItem;
|
|
28
|
+
count: number;
|
|
29
|
+
}
|
|
30
|
+
export interface VerificationResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
expectedCount: number;
|
|
33
|
+
actualCount: number;
|
|
34
|
+
duplicates: AdoWorkItem[];
|
|
35
|
+
}
|
|
36
|
+
export interface CleanupResult {
|
|
37
|
+
closedCount: number;
|
|
38
|
+
keptCount: number;
|
|
39
|
+
errors: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare class AdoDuplicateDetector {
|
|
42
|
+
private org;
|
|
43
|
+
private project;
|
|
44
|
+
private pat;
|
|
45
|
+
private logger;
|
|
46
|
+
constructor(options?: {
|
|
47
|
+
org?: string;
|
|
48
|
+
project?: string;
|
|
49
|
+
pat?: string;
|
|
50
|
+
logger?: Logger;
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Phase 1: Check if work item exists before creating
|
|
54
|
+
*/
|
|
55
|
+
checkBeforeCreate(titlePattern: string, incrementId?: string): Promise<DetectionResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Phase 2: Verify count after creation
|
|
58
|
+
*/
|
|
59
|
+
verifyAfterCreate(titlePattern: string, expectedCount?: number): Promise<VerificationResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Phase 3: Auto-close duplicates
|
|
62
|
+
*/
|
|
63
|
+
closeDuplicates(duplicates: AdoWorkItem[], keepItemId: number): Promise<CleanupResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Full cleanup: Find and close all duplicates for a feature
|
|
66
|
+
*/
|
|
67
|
+
cleanupFeatureDuplicates(featureId: string, dryRun?: boolean): Promise<{
|
|
68
|
+
groups: DuplicateGroup[];
|
|
69
|
+
totalItems: number;
|
|
70
|
+
duplicateCount: number;
|
|
71
|
+
closedCount: number;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Group work items by title
|
|
75
|
+
*/
|
|
76
|
+
private groupByTitle;
|
|
77
|
+
/**
|
|
78
|
+
* Search for work items using WIQL
|
|
79
|
+
*/
|
|
80
|
+
private searchWorkItems;
|
|
81
|
+
/**
|
|
82
|
+
* Get work item details by IDs
|
|
83
|
+
*/
|
|
84
|
+
private getWorkItemDetails;
|
|
85
|
+
/**
|
|
86
|
+
* Close a work item with duplicate comment
|
|
87
|
+
*/
|
|
88
|
+
private closeWorkItem;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Convenience function for quick duplicate cleanup
|
|
92
|
+
*/
|
|
93
|
+
export declare function cleanupAdoDuplicates(featureId: string, dryRun?: boolean): Promise<{
|
|
94
|
+
groups: DuplicateGroup[];
|
|
95
|
+
totalItems: number;
|
|
96
|
+
duplicateCount: number;
|
|
97
|
+
closedCount: number;
|
|
98
|
+
}>;
|
|
99
|
+
export default AdoDuplicateDetector;
|
|
100
|
+
//# sourceMappingURL=ado-duplicate-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-duplicate-detector.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-ado/lib/ado-duplicate-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,8BAA8B,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ;IAON;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,CAAC;IAoB3B;;OAEG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAmC9B;;OAEG;IACG,eAAe,CACnB,UAAU,EAAE,WAAW,EAAE,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAqBzB;;OAEG;IACG,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC;QACT,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IAyEF;;OAEG;IACH,OAAO,CAAC,YAAY;IA0BpB;;OAEG;YACW,eAAe;IAwC7B;;OAEG;YACW,kBAAkB;IA2BhC;;OAEG;YACW,aAAa;CAwC5B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC;IACT,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAGD;AAED,eAAe,oBAAoB,CAAC"}
|