specweave 0.18.1 → 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/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-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 +7 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +42 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -1
- 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.js +1 -1
- 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 +8 -6
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +78 -117
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
- 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/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/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.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +2 -1
- 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/types/config.d.ts +94 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +16 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +6 -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/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- 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/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -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-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 +10 -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 +38 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +59 -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.ts +1 -1
- 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
|
@@ -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"}
|
|
@@ -60,7 +60,7 @@ export class DisciplineChecker {
|
|
|
60
60
|
const allIncrements = await this.getAllIncrements();
|
|
61
61
|
// Phase 2: Count by status and get status map
|
|
62
62
|
const { statusCounts, statusMap } = this.countByStatus(allIncrements);
|
|
63
|
-
// Phase 3: Find incomplete increments (active or paused, not completed/abandoned)
|
|
63
|
+
// Phase 3: Find incomplete increments (active or paused, not backlog/completed/abandoned)
|
|
64
64
|
const incomplete = allIncrements.filter((inc) => {
|
|
65
65
|
const status = statusMap.get(inc.id) || 'active';
|
|
66
66
|
return inc.exists && (status === 'active' || status === 'paused');
|
|
@@ -100,6 +100,7 @@ export class DisciplineChecker {
|
|
|
100
100
|
increments: {
|
|
101
101
|
total: 0,
|
|
102
102
|
active: 0,
|
|
103
|
+
backlog: 0,
|
|
103
104
|
paused: 0,
|
|
104
105
|
completed: 0,
|
|
105
106
|
abandoned: 0,
|
|
@@ -149,6 +150,7 @@ export class DisciplineChecker {
|
|
|
149
150
|
*/
|
|
150
151
|
countByStatus(increments) {
|
|
151
152
|
let active = 0;
|
|
153
|
+
let backlog = 0;
|
|
152
154
|
let paused = 0;
|
|
153
155
|
let completed = 0;
|
|
154
156
|
let abandoned = 0;
|
|
@@ -178,6 +180,9 @@ export class DisciplineChecker {
|
|
|
178
180
|
case 'active':
|
|
179
181
|
active++;
|
|
180
182
|
break;
|
|
183
|
+
case 'backlog':
|
|
184
|
+
backlog++;
|
|
185
|
+
break;
|
|
181
186
|
case 'paused':
|
|
182
187
|
paused++;
|
|
183
188
|
break;
|
|
@@ -195,6 +200,7 @@ export class DisciplineChecker {
|
|
|
195
200
|
statusCounts: {
|
|
196
201
|
total: increments.length,
|
|
197
202
|
active,
|
|
203
|
+
backlog,
|
|
198
204
|
paused,
|
|
199
205
|
completed,
|
|
200
206
|
abandoned,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discipline-checker.js","sourceRoot":"","sources":["../../../../src/core/increment/discipline-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,uBAAuB,EAAmB,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAOrD,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAK5B;;;;;OAKG;IACH,YAAY,cAAsB,OAAO,CAAC,GAAG,EAAE,EAAE,YAA+B;QAC9E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAEzD,0CAA0C;QAC1C,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,GAAI,MAAM,CAAC,MAAc,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,OAAO;YACL,mBAAmB,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;YACV,uBAAuB,EAAE,IAAI;YAC7B,aAAa,EAAE;gBACb,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAC/B,eAAe,EAAE;oBACf,UAAU,EAAE,EAAE;iBACf;aACF;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAgC;QAC7C,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAEpD,8CAA8C;YAC9C,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAEtE,
|
|
1
|
+
{"version":3,"file":"discipline-checker.js","sourceRoot":"","sources":["../../../../src/core/increment/discipline-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate Detector - Scan filesystem and detect duplicate increments
|
|
3
|
+
*
|
|
4
|
+
* Detects increments that exist in multiple locations (active, archive, abandoned)
|
|
5
|
+
* or have the same increment number with different names.
|
|
6
|
+
*
|
|
7
|
+
* Part of increment 0033: Duplicate Increment Prevention System
|
|
8
|
+
*/
|
|
9
|
+
import { IncrementStatus } from '../types/increment-metadata.js';
|
|
10
|
+
/**
|
|
11
|
+
* Report of all duplicates found
|
|
12
|
+
*/
|
|
13
|
+
export interface DuplicateReport {
|
|
14
|
+
duplicates: Duplicate[];
|
|
15
|
+
totalChecked: number;
|
|
16
|
+
duplicateCount: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A duplicate increment (same number in multiple locations or with different names)
|
|
20
|
+
*/
|
|
21
|
+
export interface Duplicate {
|
|
22
|
+
incrementNumber: string;
|
|
23
|
+
locations: IncrementLocation[];
|
|
24
|
+
recommendedWinner: IncrementLocation;
|
|
25
|
+
losingVersions: IncrementLocation[];
|
|
26
|
+
resolutionReason: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Information about an increment location
|
|
30
|
+
*/
|
|
31
|
+
export interface IncrementLocation {
|
|
32
|
+
path: string;
|
|
33
|
+
name: string;
|
|
34
|
+
status: IncrementStatus;
|
|
35
|
+
lastActivity: string;
|
|
36
|
+
fileCount: number;
|
|
37
|
+
totalSize: number;
|
|
38
|
+
hasReports: boolean;
|
|
39
|
+
hasGitHubLink: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scan all increment folders and detect duplicates
|
|
43
|
+
*/
|
|
44
|
+
export declare function detectAllDuplicates(rootDir: string): Promise<DuplicateReport>;
|
|
45
|
+
/**
|
|
46
|
+
* Detect duplicates for a specific increment number
|
|
47
|
+
*
|
|
48
|
+
* Returns ALL increments that have the given number, even if there's only one.
|
|
49
|
+
* This is used for validation before creating a new increment.
|
|
50
|
+
*/
|
|
51
|
+
export declare function detectDuplicatesByNumber(incrementNumber: string, rootDir: string): Promise<IncrementLocation[]>;
|
|
52
|
+
//# sourceMappingURL=duplicate-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-detector.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/duplicate-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,cAAc,EAAE,iBAAiB,EAAE,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC,CAsD1B;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0B9B"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate Detector - Scan filesystem and detect duplicate increments
|
|
3
|
+
*
|
|
4
|
+
* Detects increments that exist in multiple locations (active, archive, abandoned)
|
|
5
|
+
* or have the same increment number with different names.
|
|
6
|
+
*
|
|
7
|
+
* Part of increment 0033: Duplicate Increment Prevention System
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
/**
|
|
13
|
+
* Scan all increment folders and detect duplicates
|
|
14
|
+
*/
|
|
15
|
+
export async function detectAllDuplicates(rootDir) {
|
|
16
|
+
const incrementsDir = path.join(rootDir, '.specweave', 'increments');
|
|
17
|
+
// Check if increments directory exists
|
|
18
|
+
if (!await fs.pathExists(incrementsDir)) {
|
|
19
|
+
return {
|
|
20
|
+
duplicates: [],
|
|
21
|
+
totalChecked: 0,
|
|
22
|
+
duplicateCount: 0
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Scan all locations in parallel
|
|
26
|
+
const [active, archived, abandoned] = await Promise.all([
|
|
27
|
+
scanDirectory(incrementsDir, false),
|
|
28
|
+
scanDirectory(path.join(incrementsDir, '_archive'), false),
|
|
29
|
+
scanDirectory(path.join(incrementsDir, '_abandoned'), false)
|
|
30
|
+
]);
|
|
31
|
+
// Group by increment number
|
|
32
|
+
const byNumber = new Map();
|
|
33
|
+
const allIncrements = [...active, ...archived, ...abandoned];
|
|
34
|
+
for (const inc of allIncrements) {
|
|
35
|
+
const number = extractIncrementNumber(inc.name);
|
|
36
|
+
if (!number)
|
|
37
|
+
continue; // Skip non-increment folders
|
|
38
|
+
if (!byNumber.has(number)) {
|
|
39
|
+
byNumber.set(number, []);
|
|
40
|
+
}
|
|
41
|
+
byNumber.get(number).push(inc);
|
|
42
|
+
}
|
|
43
|
+
// Find duplicates (increment number exists in >1 location or >1 name)
|
|
44
|
+
const duplicates = [];
|
|
45
|
+
byNumber.forEach((locations, number) => {
|
|
46
|
+
if (locations.length > 1) {
|
|
47
|
+
// Duplicate found!
|
|
48
|
+
const winner = selectWinner(locations);
|
|
49
|
+
duplicates.push({
|
|
50
|
+
incrementNumber: number,
|
|
51
|
+
locations,
|
|
52
|
+
recommendedWinner: winner,
|
|
53
|
+
losingVersions: locations.filter(l => l !== winner),
|
|
54
|
+
resolutionReason: explainWinner(winner, locations)
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
duplicates,
|
|
60
|
+
totalChecked: allIncrements.length,
|
|
61
|
+
duplicateCount: duplicates.length
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Detect duplicates for a specific increment number
|
|
66
|
+
*
|
|
67
|
+
* Returns ALL increments that have the given number, even if there's only one.
|
|
68
|
+
* This is used for validation before creating a new increment.
|
|
69
|
+
*/
|
|
70
|
+
export async function detectDuplicatesByNumber(incrementNumber, rootDir) {
|
|
71
|
+
const incrementsDir = path.join(rootDir, '.specweave', 'increments');
|
|
72
|
+
// Check if increments directory exists
|
|
73
|
+
if (!await fs.pathExists(incrementsDir)) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
// Normalize increment number (pad to 4 digits)
|
|
77
|
+
const normalizedNumber = incrementNumber.padStart(4, '0');
|
|
78
|
+
// Scan all locations in parallel
|
|
79
|
+
const [active, archived, abandoned] = await Promise.all([
|
|
80
|
+
scanDirectory(incrementsDir, false),
|
|
81
|
+
scanDirectory(path.join(incrementsDir, '_archive'), false),
|
|
82
|
+
scanDirectory(path.join(incrementsDir, '_abandoned'), false)
|
|
83
|
+
]);
|
|
84
|
+
// Combine all increments and filter by number
|
|
85
|
+
const allIncrements = [...active, ...archived, ...abandoned];
|
|
86
|
+
const matchingIncrements = allIncrements.filter(inc => {
|
|
87
|
+
const number = extractIncrementNumber(inc.name);
|
|
88
|
+
return number === normalizedNumber;
|
|
89
|
+
});
|
|
90
|
+
return matchingIncrements;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Scan a directory for increment folders
|
|
94
|
+
*/
|
|
95
|
+
async function scanDirectory(dir, throwOnError = false) {
|
|
96
|
+
try {
|
|
97
|
+
// Check if directory exists
|
|
98
|
+
if (!await fs.pathExists(dir)) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
// Find all directories matching increment pattern (####-*)
|
|
102
|
+
const pattern = path.join(dir, '[0-9][0-9][0-9][0-9]-*');
|
|
103
|
+
const allPaths = await glob(pattern);
|
|
104
|
+
const locations = [];
|
|
105
|
+
for (const incPath of allPaths) {
|
|
106
|
+
try {
|
|
107
|
+
const stats = await fs.stat(incPath);
|
|
108
|
+
if (!stats.isDirectory())
|
|
109
|
+
continue;
|
|
110
|
+
const name = path.basename(incPath);
|
|
111
|
+
// Skip nested .specweave folders
|
|
112
|
+
if (incPath.includes('.specweave/increments/.specweave')) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Read metadata
|
|
116
|
+
const metadataPath = path.join(incPath, 'metadata.json');
|
|
117
|
+
let metadata = {
|
|
118
|
+
status: 'unknown',
|
|
119
|
+
lastActivity: new Date(stats.mtime).toISOString()
|
|
120
|
+
};
|
|
121
|
+
if (await fs.pathExists(metadataPath)) {
|
|
122
|
+
try {
|
|
123
|
+
metadata = await fs.readJson(metadataPath);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// Skip corrupted metadata (will be caught by validation)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Count files recursively
|
|
130
|
+
const allFiles = await glob(path.join(incPath, '**/*'));
|
|
131
|
+
const fileCount = allFiles.filter(async (f) => {
|
|
132
|
+
try {
|
|
133
|
+
const fstats = await fs.stat(f);
|
|
134
|
+
return fstats.isFile();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}).length;
|
|
140
|
+
// Calculate total size
|
|
141
|
+
let totalSize = 0;
|
|
142
|
+
for (const file of allFiles) {
|
|
143
|
+
try {
|
|
144
|
+
const fstats = await fs.stat(file);
|
|
145
|
+
if (fstats.isFile()) {
|
|
146
|
+
totalSize += fstats.size;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Skip files we can't read
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Check for reports folder
|
|
154
|
+
const reportsDir = path.join(incPath, 'reports');
|
|
155
|
+
const hasReports = await fs.pathExists(reportsDir);
|
|
156
|
+
// Check for GitHub link in metadata
|
|
157
|
+
const hasGitHubLink = metadata.github && metadata.github.issue;
|
|
158
|
+
locations.push({
|
|
159
|
+
path: incPath,
|
|
160
|
+
name,
|
|
161
|
+
status: metadata.status || 'unknown',
|
|
162
|
+
lastActivity: metadata.lastActivity || new Date(stats.mtime).toISOString(),
|
|
163
|
+
fileCount,
|
|
164
|
+
totalSize,
|
|
165
|
+
hasReports,
|
|
166
|
+
hasGitHubLink
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
// Skip increments we can't read
|
|
171
|
+
if (throwOnError)
|
|
172
|
+
throw error;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return locations;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
if (throwOnError)
|
|
179
|
+
throw error;
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Extract increment number from increment name (e.g., "0001-feature" → "0001")
|
|
185
|
+
*/
|
|
186
|
+
function extractIncrementNumber(name) {
|
|
187
|
+
const match = name.match(/^(\d{4})-/);
|
|
188
|
+
return match ? match[1] : null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Select winning version based on priority rules
|
|
192
|
+
*/
|
|
193
|
+
function selectWinner(locations) {
|
|
194
|
+
// Priority 1: Active status > Completed > Paused > Backlog > Abandoned
|
|
195
|
+
const statusPriority = {
|
|
196
|
+
active: 5,
|
|
197
|
+
completed: 4,
|
|
198
|
+
paused: 3,
|
|
199
|
+
backlog: 2,
|
|
200
|
+
abandoned: 1,
|
|
201
|
+
unknown: 0
|
|
202
|
+
};
|
|
203
|
+
// Sort by priority
|
|
204
|
+
const sorted = [...locations].sort((a, b) => {
|
|
205
|
+
// 1. Status priority
|
|
206
|
+
const aPriority = statusPriority[a.status] || 0;
|
|
207
|
+
const bPriority = statusPriority[b.status] || 0;
|
|
208
|
+
if (bPriority !== aPriority)
|
|
209
|
+
return bPriority - aPriority;
|
|
210
|
+
// 2. Most recent activity
|
|
211
|
+
const aTime = new Date(a.lastActivity).getTime();
|
|
212
|
+
const bTime = new Date(b.lastActivity).getTime();
|
|
213
|
+
if (bTime !== aTime)
|
|
214
|
+
return bTime - aTime;
|
|
215
|
+
// 3. Most complete (more files)
|
|
216
|
+
if (b.fileCount !== a.fileCount)
|
|
217
|
+
return b.fileCount - a.fileCount;
|
|
218
|
+
// 4. Location preference (active > _archive > _abandoned)
|
|
219
|
+
const locationScore = (loc) => {
|
|
220
|
+
if (loc.path.includes('_abandoned'))
|
|
221
|
+
return 1;
|
|
222
|
+
if (loc.path.includes('_archive'))
|
|
223
|
+
return 2;
|
|
224
|
+
return 3; // active
|
|
225
|
+
};
|
|
226
|
+
return locationScore(b) - locationScore(a);
|
|
227
|
+
});
|
|
228
|
+
return sorted[0];
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Explain why this version won
|
|
232
|
+
*/
|
|
233
|
+
function explainWinner(winner, all) {
|
|
234
|
+
const reasons = [];
|
|
235
|
+
const statusPriority = {
|
|
236
|
+
active: 5,
|
|
237
|
+
completed: 4,
|
|
238
|
+
paused: 3,
|
|
239
|
+
backlog: 2,
|
|
240
|
+
abandoned: 1,
|
|
241
|
+
unknown: 0
|
|
242
|
+
};
|
|
243
|
+
// Check status
|
|
244
|
+
const winnerStatusPriority = statusPriority[winner.status] || 0;
|
|
245
|
+
const hasLowerStatus = all.some(loc => loc !== winner && (statusPriority[loc.status] || 0) < winnerStatusPriority);
|
|
246
|
+
if (hasLowerStatus) {
|
|
247
|
+
reasons.push(`Higher status (${winner.status})`);
|
|
248
|
+
}
|
|
249
|
+
// Check recency
|
|
250
|
+
const winnerTime = new Date(winner.lastActivity).getTime();
|
|
251
|
+
const hasOlderActivity = all.some(loc => loc !== winner && new Date(loc.lastActivity).getTime() < winnerTime);
|
|
252
|
+
if (hasOlderActivity) {
|
|
253
|
+
const date = new Date(winner.lastActivity).toISOString().split('T')[0];
|
|
254
|
+
reasons.push(`Most recent activity (${date})`);
|
|
255
|
+
}
|
|
256
|
+
// Check completeness
|
|
257
|
+
const hasFewerFiles = all.some(loc => loc !== winner && loc.fileCount < winner.fileCount);
|
|
258
|
+
if (hasFewerFiles) {
|
|
259
|
+
reasons.push(`Most complete (${winner.fileCount} files)`);
|
|
260
|
+
}
|
|
261
|
+
// Check location
|
|
262
|
+
const winnerLocation = winner.path.includes('_abandoned') ? 'abandoned' :
|
|
263
|
+
winner.path.includes('_archive') ? 'archive' : 'active';
|
|
264
|
+
const hasWorseLocation = all.some(loc => {
|
|
265
|
+
const locLocation = loc.path.includes('_abandoned') ? 'abandoned' :
|
|
266
|
+
loc.path.includes('_archive') ? 'archive' : 'active';
|
|
267
|
+
const locationPriority = { active: 3, archive: 2, abandoned: 1 };
|
|
268
|
+
return locationPriority[locLocation] <
|
|
269
|
+
locationPriority[winnerLocation];
|
|
270
|
+
});
|
|
271
|
+
if (hasWorseLocation) {
|
|
272
|
+
reasons.push(`In ${winnerLocation} location`);
|
|
273
|
+
}
|
|
274
|
+
return reasons.length > 0 ? reasons.join(', ') : 'Default selection';
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=duplicate-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate-detector.js","sourceRoot":"","sources":["../../../../src/core/increment/duplicate-detector.ts"],"names":[],"mappings":"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"}
|