specweave 0.18.0 → 0.20.0
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 +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
- package/dist/spec-parser.js +629 -0
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +107 -3
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +142 -138
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
- package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/sync/spec-content-sync.js +5 -0
- package/dist/src/core/sync/spec-content-sync.js.map +1 -0
- package/dist/src/core/sync/types.d.ts +52 -0
- package/dist/src/core/sync/types.d.ts.map +1 -0
- package/dist/src/core/sync/types.js +5 -0
- package/dist/src/core/sync/types.js.map +1 -0
- package/dist/src/core/types/config.d.ts +125 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +25 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +10 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/agents/pm/AGENT.md +159 -12
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/commands/specweave.md +70 -405
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
- package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -14,9 +14,15 @@
|
|
|
14
14
|
*/
|
|
15
15
|
/**
|
|
16
16
|
* Active increment state stored in .specweave/state/active-increment.json
|
|
17
|
+
*
|
|
18
|
+
* **UPGRADED**: Now supports MULTIPLE active increments (up to 2)
|
|
19
|
+
* - One regular feature increment
|
|
20
|
+
* - One hotfix/bug increment (optional)
|
|
17
21
|
*/
|
|
18
22
|
export interface ActiveIncrementState {
|
|
19
|
-
|
|
23
|
+
ids: string[];
|
|
24
|
+
id?: string | null;
|
|
25
|
+
lastUpdated: string;
|
|
20
26
|
}
|
|
21
27
|
/**
|
|
22
28
|
* Active Increment Manager
|
|
@@ -28,22 +34,43 @@ export declare class ActiveIncrementManager {
|
|
|
28
34
|
private stateFile;
|
|
29
35
|
constructor(rootDir?: string);
|
|
30
36
|
/**
|
|
31
|
-
* Get
|
|
32
|
-
* Returns
|
|
37
|
+
* Get all currently active increment IDs
|
|
38
|
+
* Returns empty array if no increments are active
|
|
39
|
+
*
|
|
40
|
+
* **NEW**: Returns array of ALL active increments (max 2)
|
|
41
|
+
*/
|
|
42
|
+
getActive(): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Get the primary active increment (first in list)
|
|
45
|
+
* Returns null if no increments are active
|
|
46
|
+
*
|
|
47
|
+
* This maintains backwards compatibility with code expecting a single ID
|
|
33
48
|
*/
|
|
34
|
-
|
|
49
|
+
getPrimary(): string | null;
|
|
35
50
|
/**
|
|
36
|
-
*
|
|
51
|
+
* Add an increment to the active list
|
|
37
52
|
* Validates that the increment exists and is actually active
|
|
53
|
+
*
|
|
54
|
+
* **NEW**: Adds to list instead of replacing (max 2)
|
|
55
|
+
* @param skipValidation - Skip validation (used during lazy initialization to prevent circular dependency)
|
|
56
|
+
*/
|
|
57
|
+
addActive(incrementId: string, skipValidation?: boolean): void;
|
|
58
|
+
/**
|
|
59
|
+
* Remove an increment from the active list
|
|
60
|
+
*/
|
|
61
|
+
removeActive(incrementId: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Set the active increment (legacy method for backwards compatibility)
|
|
64
|
+
* Now delegates to addActive()
|
|
65
|
+
* @param skipValidation - Skip validation (used during lazy initialization to prevent circular dependency)
|
|
38
66
|
*/
|
|
39
|
-
setActive(incrementId: string): void;
|
|
67
|
+
setActive(incrementId: string, skipValidation?: boolean): void;
|
|
40
68
|
/**
|
|
41
|
-
* Clear
|
|
69
|
+
* Clear all active increments
|
|
42
70
|
*/
|
|
43
71
|
clearActive(): void;
|
|
44
72
|
/**
|
|
45
|
-
* Smart update:
|
|
46
|
-
* or clear if none are active.
|
|
73
|
+
* Smart update: Rebuild active list from metadata
|
|
47
74
|
*
|
|
48
75
|
* This is called when:
|
|
49
76
|
* - An increment is completed
|
|
@@ -51,16 +78,16 @@ export declare class ActiveIncrementManager {
|
|
|
51
78
|
* - An increment is abandoned
|
|
52
79
|
*
|
|
53
80
|
* Logic:
|
|
54
|
-
* 1.
|
|
55
|
-
* 2.
|
|
56
|
-
* 3.
|
|
81
|
+
* 1. Scan all increments for status=active
|
|
82
|
+
* 2. Update cache to match reality
|
|
83
|
+
* 3. Max 2 increments (sorted by lastActivity)
|
|
57
84
|
*/
|
|
58
85
|
smartUpdate(): void;
|
|
59
86
|
/**
|
|
60
|
-
* Validate that
|
|
61
|
-
*
|
|
87
|
+
* Validate that all active increment pointers are correct
|
|
88
|
+
* Does NOT fix stale pointers - caller should call smartUpdate() if needed
|
|
62
89
|
*
|
|
63
|
-
* Returns true if valid
|
|
90
|
+
* Returns true if all valid, false if any invalid
|
|
64
91
|
*/
|
|
65
92
|
validate(): boolean;
|
|
66
93
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-increment-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/active-increment-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH
|
|
1
|
+
{"version":3,"file":"active-increment-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/active-increment-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IAEnC,GAAG,EAAE,MAAM,EAAE,CAAC;IAGd,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;IAGrB,OAAO,CAAC,OAAO;IAF3B,OAAO,CAAC,SAAS,CAAS;gBAEN,OAAO,GAAE,MAAsB;IAInD;;;;;OAKG;IACH,SAAS,IAAI,MAAM,EAAE;IAqBrB;;;;;OAKG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAK3B;;;;;;OAMG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI;IAgCrE;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAWvC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI;IAIrE;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;;;;;;;;;;;OAYG;IACH,WAAW,IAAI,IAAI;IAyBnB;;;;;OAKG;IACH,QAAQ,IAAI,OAAO;IAmCnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,MAAM,IAAI,OAAO;CAGlB"}
|
|
@@ -27,48 +27,102 @@ export class ActiveIncrementManager {
|
|
|
27
27
|
this.stateFile = path.join(rootDir, '.specweave/state/active-increment.json');
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Get
|
|
31
|
-
* Returns
|
|
30
|
+
* Get all currently active increment IDs
|
|
31
|
+
* Returns empty array if no increments are active
|
|
32
|
+
*
|
|
33
|
+
* **NEW**: Returns array of ALL active increments (max 2)
|
|
32
34
|
*/
|
|
33
35
|
getActive() {
|
|
34
36
|
try {
|
|
35
37
|
if (!fs.existsSync(this.stateFile)) {
|
|
36
|
-
return
|
|
38
|
+
return [];
|
|
37
39
|
}
|
|
38
40
|
const content = fs.readFileSync(this.stateFile, 'utf-8');
|
|
39
41
|
const state = JSON.parse(content);
|
|
40
|
-
|
|
42
|
+
// Backwards compatibility: Support old format
|
|
43
|
+
if (state.id && !state.ids) {
|
|
44
|
+
return [state.id];
|
|
45
|
+
}
|
|
46
|
+
return state.ids || [];
|
|
41
47
|
}
|
|
42
48
|
catch (error) {
|
|
43
|
-
// File read/parse error = no active
|
|
44
|
-
return
|
|
49
|
+
// File read/parse error = no active increments
|
|
50
|
+
return [];
|
|
45
51
|
}
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
48
|
-
*
|
|
54
|
+
* Get the primary active increment (first in list)
|
|
55
|
+
* Returns null if no increments are active
|
|
56
|
+
*
|
|
57
|
+
* This maintains backwards compatibility with code expecting a single ID
|
|
58
|
+
*/
|
|
59
|
+
getPrimary() {
|
|
60
|
+
const active = this.getActive();
|
|
61
|
+
return active.length > 0 ? active[0] : null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add an increment to the active list
|
|
49
65
|
* Validates that the increment exists and is actually active
|
|
66
|
+
*
|
|
67
|
+
* **NEW**: Adds to list instead of replacing (max 2)
|
|
68
|
+
* @param skipValidation - Skip validation (used during lazy initialization to prevent circular dependency)
|
|
50
69
|
*/
|
|
51
|
-
|
|
52
|
-
// Validate increment exists
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
70
|
+
addActive(incrementId, skipValidation = false) {
|
|
71
|
+
// Validate increment exists and is active (unless skipValidation is true)
|
|
72
|
+
if (!skipValidation) {
|
|
73
|
+
const metadata = MetadataManager.read(incrementId);
|
|
74
|
+
// Validate increment is actually active
|
|
75
|
+
if (metadata.status !== IncrementStatus.ACTIVE) {
|
|
76
|
+
throw new Error(`Cannot add ${incrementId} as active: status is ${metadata.status}, not active`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Get current active list
|
|
80
|
+
const currentActive = this.getActive();
|
|
81
|
+
// Don't add if already in list
|
|
82
|
+
if (currentActive.includes(incrementId)) {
|
|
83
|
+
return;
|
|
57
84
|
}
|
|
58
|
-
//
|
|
59
|
-
const
|
|
85
|
+
// Add to list (max 2)
|
|
86
|
+
const newActive = [...currentActive, incrementId].slice(0, 2);
|
|
87
|
+
// Write state
|
|
88
|
+
const state = {
|
|
89
|
+
ids: newActive,
|
|
90
|
+
lastUpdated: new Date().toISOString()
|
|
91
|
+
};
|
|
60
92
|
this.writeState(state);
|
|
61
93
|
}
|
|
62
94
|
/**
|
|
63
|
-
*
|
|
95
|
+
* Remove an increment from the active list
|
|
96
|
+
*/
|
|
97
|
+
removeActive(incrementId) {
|
|
98
|
+
const currentActive = this.getActive();
|
|
99
|
+
const newActive = currentActive.filter(id => id !== incrementId);
|
|
100
|
+
const state = {
|
|
101
|
+
ids: newActive,
|
|
102
|
+
lastUpdated: new Date().toISOString()
|
|
103
|
+
};
|
|
104
|
+
this.writeState(state);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Set the active increment (legacy method for backwards compatibility)
|
|
108
|
+
* Now delegates to addActive()
|
|
109
|
+
* @param skipValidation - Skip validation (used during lazy initialization to prevent circular dependency)
|
|
110
|
+
*/
|
|
111
|
+
setActive(incrementId, skipValidation = false) {
|
|
112
|
+
this.addActive(incrementId, skipValidation);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Clear all active increments
|
|
64
116
|
*/
|
|
65
117
|
clearActive() {
|
|
66
|
-
const state = {
|
|
118
|
+
const state = {
|
|
119
|
+
ids: [],
|
|
120
|
+
lastUpdated: new Date().toISOString()
|
|
121
|
+
};
|
|
67
122
|
this.writeState(state);
|
|
68
123
|
}
|
|
69
124
|
/**
|
|
70
|
-
* Smart update:
|
|
71
|
-
* or clear if none are active.
|
|
125
|
+
* Smart update: Rebuild active list from metadata
|
|
72
126
|
*
|
|
73
127
|
* This is called when:
|
|
74
128
|
* - An increment is completed
|
|
@@ -76,16 +130,26 @@ export class ActiveIncrementManager {
|
|
|
76
130
|
* - An increment is abandoned
|
|
77
131
|
*
|
|
78
132
|
* Logic:
|
|
79
|
-
* 1.
|
|
80
|
-
* 2.
|
|
81
|
-
* 3.
|
|
133
|
+
* 1. Scan all increments for status=active
|
|
134
|
+
* 2. Update cache to match reality
|
|
135
|
+
* 3. Max 2 increments (sorted by lastActivity)
|
|
82
136
|
*/
|
|
83
137
|
smartUpdate() {
|
|
84
138
|
const activeIncrements = MetadataManager.getActive();
|
|
85
139
|
if (activeIncrements.length > 0) {
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
140
|
+
// Sort by lastActivity (most recent first)
|
|
141
|
+
const sorted = activeIncrements.sort((a, b) => {
|
|
142
|
+
const aTime = new Date(a.lastActivity).getTime();
|
|
143
|
+
const bTime = new Date(b.lastActivity).getTime();
|
|
144
|
+
return bTime - aTime; // Descending
|
|
145
|
+
});
|
|
146
|
+
// Take max 2
|
|
147
|
+
const activeIds = sorted.slice(0, 2).map(m => m.id);
|
|
148
|
+
const state = {
|
|
149
|
+
ids: activeIds,
|
|
150
|
+
lastUpdated: new Date().toISOString()
|
|
151
|
+
};
|
|
152
|
+
this.writeState(state);
|
|
89
153
|
}
|
|
90
154
|
else {
|
|
91
155
|
// No active increments
|
|
@@ -93,35 +157,38 @@ export class ActiveIncrementManager {
|
|
|
93
157
|
}
|
|
94
158
|
}
|
|
95
159
|
/**
|
|
96
|
-
* Validate that
|
|
97
|
-
*
|
|
160
|
+
* Validate that all active increment pointers are correct
|
|
161
|
+
* Does NOT fix stale pointers - caller should call smartUpdate() if needed
|
|
98
162
|
*
|
|
99
|
-
* Returns true if valid
|
|
163
|
+
* Returns true if all valid, false if any invalid
|
|
100
164
|
*/
|
|
101
165
|
validate() {
|
|
102
166
|
const currentActive = this.getActive();
|
|
103
|
-
// No active
|
|
104
|
-
if (currentActive ===
|
|
167
|
+
// No active increments = valid (nothing to validate)
|
|
168
|
+
if (currentActive.length === 0) {
|
|
105
169
|
return true;
|
|
106
170
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
171
|
+
let hasStale = false;
|
|
172
|
+
for (const incrementId of currentActive) {
|
|
173
|
+
try {
|
|
174
|
+
// Check if increment still exists
|
|
175
|
+
const metadata = MetadataManager.read(incrementId);
|
|
176
|
+
// Check if increment is actually active
|
|
177
|
+
if (metadata.status !== IncrementStatus.ACTIVE) {
|
|
178
|
+
// Stale pointer! Mark for fix
|
|
179
|
+
console.warn(`⚠️ Active increment pointer is stale: ${incrementId} is ${metadata.status}`);
|
|
180
|
+
hasStale = true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
// Increment doesn't exist = stale pointer
|
|
185
|
+
console.warn(`⚠️ Active increment pointer is invalid: ${incrementId} not found`);
|
|
186
|
+
hasStale = true;
|
|
116
187
|
}
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
// Increment doesn't exist = stale pointer
|
|
121
|
-
console.warn(`⚠️ Active increment pointer is invalid: ${currentActive} not found`);
|
|
122
|
-
this.smartUpdate();
|
|
123
|
-
return false;
|
|
124
188
|
}
|
|
189
|
+
// Return false if stale found, but DON'T auto-fix (prevents circular dependency)
|
|
190
|
+
// Caller should call smartUpdate() if needed
|
|
191
|
+
return !hasStale;
|
|
125
192
|
}
|
|
126
193
|
/**
|
|
127
194
|
* Write state file atomically (temp file → rename)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-increment-manager.js","sourceRoot":"","sources":["../../../../src/core/increment/active-increment-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"active-increment-manager.js","sourceRoot":"","sources":["../../../../src/core/increment/active-increment-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolver - Merge content and resolve duplicate conflicts
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities to merge valuable content from losing versions to winning version,
|
|
5
|
+
* and delete losing versions with user confirmation.
|
|
6
|
+
*
|
|
7
|
+
* Part of increment 0033: Duplicate Increment Prevention System
|
|
8
|
+
*/
|
|
9
|
+
import type { Duplicate, IncrementLocation } from './duplicate-detector.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for conflict resolution
|
|
12
|
+
*/
|
|
13
|
+
export interface ResolveOptions {
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
force?: boolean;
|
|
16
|
+
merge?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Result of conflict resolution
|
|
20
|
+
*/
|
|
21
|
+
export interface ResolutionResult {
|
|
22
|
+
winner: string;
|
|
23
|
+
merged: string[];
|
|
24
|
+
deleted: string[];
|
|
25
|
+
reportPath: string;
|
|
26
|
+
dryRun: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve conflict by merging winner + losers
|
|
30
|
+
*/
|
|
31
|
+
export declare function resolveConflict(duplicate: Duplicate, options?: ResolveOptions): Promise<ResolutionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Merge content from losing versions into winner
|
|
34
|
+
*/
|
|
35
|
+
export declare function mergeContent(winner: IncrementLocation, losers: IncrementLocation[], options?: ResolveOptions): Promise<string[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve multiple duplicates in batch
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveAllDuplicates(duplicates: Duplicate[], options?: ResolveOptions): Promise<ResolutionResult[]>;
|
|
40
|
+
//# sourceMappingURL=conflict-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/conflict-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAmC3B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAiEnB;AAgHD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAa7B"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolver - Merge content and resolve duplicate conflicts
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities to merge valuable content from losing versions to winning version,
|
|
5
|
+
* and delete losing versions with user confirmation.
|
|
6
|
+
*
|
|
7
|
+
* Part of increment 0033: Duplicate Increment Prevention System
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
/**
|
|
12
|
+
* Resolve conflict by merging winner + losers
|
|
13
|
+
*/
|
|
14
|
+
export async function resolveConflict(duplicate, options = {}) {
|
|
15
|
+
const winner = duplicate.recommendedWinner;
|
|
16
|
+
const losers = duplicate.losingVersions;
|
|
17
|
+
// Step 1: Merge valuable content from losers → winner (if merge enabled)
|
|
18
|
+
const mergedFiles = [];
|
|
19
|
+
if (options.merge) {
|
|
20
|
+
const merged = await mergeContent(winner, losers, options);
|
|
21
|
+
mergedFiles.push(...merged);
|
|
22
|
+
}
|
|
23
|
+
// Step 2: Create resolution report
|
|
24
|
+
const reportPath = await createResolutionReport(duplicate, mergedFiles, options);
|
|
25
|
+
// Step 3: Delete losing versions (if not dry-run)
|
|
26
|
+
const deletedPaths = [];
|
|
27
|
+
if (!options.dryRun) {
|
|
28
|
+
for (const loser of losers) {
|
|
29
|
+
if (options.force || await confirmDeletion(loser)) {
|
|
30
|
+
await fs.remove(loser.path);
|
|
31
|
+
deletedPaths.push(loser.path);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Dry-run: just record what would be deleted
|
|
37
|
+
deletedPaths.push(...losers.map(l => l.path));
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
winner: winner.path,
|
|
41
|
+
merged: mergedFiles,
|
|
42
|
+
deleted: deletedPaths,
|
|
43
|
+
reportPath,
|
|
44
|
+
dryRun: options.dryRun || false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Merge content from losing versions into winner
|
|
49
|
+
*/
|
|
50
|
+
export async function mergeContent(winner, losers, options = {}) {
|
|
51
|
+
const mergedFiles = [];
|
|
52
|
+
for (const loser of losers) {
|
|
53
|
+
// Merge reports/ folder (preserve all reports)
|
|
54
|
+
const loserReportsDir = path.join(loser.path, 'reports');
|
|
55
|
+
if (await fs.pathExists(loserReportsDir)) {
|
|
56
|
+
const winnerReportsDir = path.join(winner.path, 'reports');
|
|
57
|
+
await fs.ensureDir(winnerReportsDir);
|
|
58
|
+
const reportFiles = await fs.readdir(loserReportsDir);
|
|
59
|
+
for (const file of reportFiles) {
|
|
60
|
+
const sourcePath = path.join(loserReportsDir, file);
|
|
61
|
+
const targetPath = path.join(winnerReportsDir, file);
|
|
62
|
+
// Skip if not a file
|
|
63
|
+
const stats = await fs.stat(sourcePath);
|
|
64
|
+
if (!stats.isFile())
|
|
65
|
+
continue;
|
|
66
|
+
// Rename if file exists (add timestamp)
|
|
67
|
+
let finalPath = targetPath;
|
|
68
|
+
if (await fs.pathExists(targetPath)) {
|
|
69
|
+
const ext = path.extname(file);
|
|
70
|
+
const base = path.basename(file, ext);
|
|
71
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T')[0];
|
|
72
|
+
finalPath = path.join(winnerReportsDir, `${base}-MERGED-${timestamp}${ext}`);
|
|
73
|
+
}
|
|
74
|
+
if (!options.dryRun) {
|
|
75
|
+
await fs.copy(sourcePath, finalPath);
|
|
76
|
+
}
|
|
77
|
+
mergedFiles.push(finalPath);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Merge metadata (union of GitHub/JIRA/ADO links)
|
|
81
|
+
const loserMetadataPath = path.join(loser.path, 'metadata.json');
|
|
82
|
+
if (await fs.pathExists(loserMetadataPath)) {
|
|
83
|
+
const winnerMetadataPath = path.join(winner.path, 'metadata.json');
|
|
84
|
+
if (await fs.pathExists(winnerMetadataPath)) {
|
|
85
|
+
try {
|
|
86
|
+
const loserMetadata = await fs.readJson(loserMetadataPath);
|
|
87
|
+
const winnerMetadata = await fs.readJson(winnerMetadataPath);
|
|
88
|
+
// Merge external links (take non-null values)
|
|
89
|
+
const merged = {
|
|
90
|
+
...winnerMetadata,
|
|
91
|
+
github: winnerMetadata.github || loserMetadata.github,
|
|
92
|
+
jira: winnerMetadata.jira || loserMetadata.jira,
|
|
93
|
+
ado: winnerMetadata.ado || loserMetadata.ado
|
|
94
|
+
};
|
|
95
|
+
if (!options.dryRun) {
|
|
96
|
+
await fs.writeJson(winnerMetadataPath, merged, { spaces: 2 });
|
|
97
|
+
}
|
|
98
|
+
mergedFiles.push(winnerMetadataPath);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Skip corrupted metadata
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return mergedFiles;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create resolution report in winner's reports/ folder
|
|
110
|
+
*/
|
|
111
|
+
async function createResolutionReport(duplicate, mergedFiles, options) {
|
|
112
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
113
|
+
const reportName = `DUPLICATE-RESOLUTION-${timestamp}.md`;
|
|
114
|
+
const reportPath = path.join(duplicate.recommendedWinner.path, 'reports', reportName);
|
|
115
|
+
const content = generateReportContent(duplicate, mergedFiles, options);
|
|
116
|
+
if (!options.dryRun) {
|
|
117
|
+
await fs.ensureDir(path.dirname(reportPath));
|
|
118
|
+
await fs.writeFile(reportPath, content, 'utf-8');
|
|
119
|
+
}
|
|
120
|
+
return reportPath;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Generate resolution report content
|
|
124
|
+
*/
|
|
125
|
+
function generateReportContent(duplicate, mergedFiles, options) {
|
|
126
|
+
const winner = duplicate.recommendedWinner;
|
|
127
|
+
const losers = duplicate.losingVersions;
|
|
128
|
+
const timestamp = new Date().toISOString();
|
|
129
|
+
return `# Duplicate Resolution Report
|
|
130
|
+
|
|
131
|
+
**Generated**: ${timestamp}
|
|
132
|
+
**Increment Number**: ${duplicate.incrementNumber}
|
|
133
|
+
**Resolution Strategy**: ${options.merge ? 'Merge + Delete' : 'Delete Only'}
|
|
134
|
+
|
|
135
|
+
## Conflict Summary
|
|
136
|
+
|
|
137
|
+
**Total Locations Found**: ${duplicate.locations.length}
|
|
138
|
+
|
|
139
|
+
### Winner: ${winner.name}
|
|
140
|
+
- **Path**: \`${winner.path}\`
|
|
141
|
+
- **Status**: ${winner.status}
|
|
142
|
+
- **Last Activity**: ${winner.lastActivity}
|
|
143
|
+
- **File Count**: ${winner.fileCount}
|
|
144
|
+
- **Has Reports**: ${winner.hasReports ? 'Yes' : 'No'}
|
|
145
|
+
- **Has GitHub Link**: ${winner.hasGitHubLink ? 'Yes' : 'No'}
|
|
146
|
+
|
|
147
|
+
**Reason Selected**: ${duplicate.resolutionReason}
|
|
148
|
+
|
|
149
|
+
## Losing Versions
|
|
150
|
+
|
|
151
|
+
${losers.map((loser, idx) => `
|
|
152
|
+
### ${idx + 1}. ${loser.name}
|
|
153
|
+
- **Path**: \`${loser.path}\`
|
|
154
|
+
- **Status**: ${loser.status}
|
|
155
|
+
- **Last Activity**: ${loser.lastActivity}
|
|
156
|
+
- **File Count**: ${loser.fileCount}
|
|
157
|
+
- **Action**: ${options.dryRun ? 'Would be deleted' : 'Deleted'}
|
|
158
|
+
`).join('\n')}
|
|
159
|
+
|
|
160
|
+
## Merged Content
|
|
161
|
+
|
|
162
|
+
${options.merge ? `
|
|
163
|
+
**Total Files Merged**: ${mergedFiles.length}
|
|
164
|
+
|
|
165
|
+
${mergedFiles.length > 0 ? mergedFiles.map(f => `- \`${path.basename(f)}\``).join('\n') : 'No files merged'}
|
|
166
|
+
` : 'Content merge was not enabled (--merge flag not used)'}
|
|
167
|
+
|
|
168
|
+
## Command Used
|
|
169
|
+
|
|
170
|
+
\`\`\`bash
|
|
171
|
+
/specweave:fix-duplicates ${options.merge ? '--merge ' : ''}${options.force ? '--force ' : ''}${options.dryRun ? '--dry-run' : ''}
|
|
172
|
+
\`\`\`
|
|
173
|
+
|
|
174
|
+
## Next Steps
|
|
175
|
+
|
|
176
|
+
${options.dryRun ? `
|
|
177
|
+
This was a dry-run. To apply these changes:
|
|
178
|
+
1. Review this report
|
|
179
|
+
2. Run: \`/specweave:fix-duplicates --merge\` (without --dry-run)
|
|
180
|
+
` : `
|
|
181
|
+
✅ Duplicate resolved successfully!
|
|
182
|
+
|
|
183
|
+
- Winner preserved at: \`${winner.path}\`
|
|
184
|
+
- ${losers.length} losing version(s) deleted
|
|
185
|
+
- ${mergedFiles.length} file(s) merged
|
|
186
|
+
`}
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
🤖 Generated by SpecWeave Duplicate Prevention System
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Confirm deletion with user (interactive)
|
|
195
|
+
*/
|
|
196
|
+
async function confirmDeletion(loser) {
|
|
197
|
+
// In a real CLI, this would prompt the user
|
|
198
|
+
// For now, we'll just return true (force mode)
|
|
199
|
+
// This will be implemented properly in the CLI command
|
|
200
|
+
console.log(`⚠️ Delete ${loser.path}? (Use --force to skip this prompt)`);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Resolve multiple duplicates in batch
|
|
205
|
+
*/
|
|
206
|
+
export async function resolveAllDuplicates(duplicates, options = {}) {
|
|
207
|
+
const results = [];
|
|
208
|
+
for (const duplicate of duplicates) {
|
|
209
|
+
try {
|
|
210
|
+
const result = await resolveConflict(duplicate, options);
|
|
211
|
+
results.push(result);
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
console.error(`Failed to resolve duplicate ${duplicate.incrementNumber}:`, error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return results;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=conflict-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolver.js","sourceRoot":"","sources":["../../../../src/core/increment/conflict-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discipline-checker.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/discipline-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,gBAAgB,EAEhB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAA0B;IAE1C;;;;;OAKG;gBACS,WAAW,GAAE,MAAsB,EAAE,YAAY,CAAC,EAAE,gBAAgB;IAchF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;OAKG;IACG,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"discipline-checker.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/discipline-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,gBAAgB,EAEhB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAA0B;IAE1C;;;;;OAKG;gBACS,WAAW,GAAE,MAAsB,EAAE,YAAY,CAAC,EAAE,gBAAgB;IAchF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;OAKG;IACG,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwE3E;;OAEG;YACW,gBAAgB;IAgC9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgFrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;CAW/B"}
|