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,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from "fs/promises";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
async function updateACStatus(incrementId) {
|
|
5
|
+
try {
|
|
6
|
+
const projectRoot = process.cwd();
|
|
7
|
+
const incrementPath = path.join(projectRoot, ".specweave/increments", incrementId);
|
|
8
|
+
try {
|
|
9
|
+
await fs.access(incrementPath);
|
|
10
|
+
} catch {
|
|
11
|
+
console.error(`\u274C Increment ${incrementId} not found at ${incrementPath}`);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
console.log(`\u{1F504} Updating AC status for increment ${incrementId}...`);
|
|
15
|
+
const completedACs = await extractCompletedACsFromTasks(incrementPath);
|
|
16
|
+
if (completedACs.size === 0) {
|
|
17
|
+
console.log(`\u2139\uFE0F No completed tasks with AC-IDs found in tasks.md`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
console.log(`\u2713 Found ${completedACs.size} completed AC-IDs from tasks.md`);
|
|
21
|
+
const updatedCount = await updateSpecACCheckboxes(incrementPath, completedACs);
|
|
22
|
+
if (updatedCount > 0) {
|
|
23
|
+
console.log(`\u2705 Updated ${updatedCount} AC checkbox(es) in spec.md`);
|
|
24
|
+
} else {
|
|
25
|
+
console.log(`\u2139\uFE0F No AC checkboxes needed updating in spec.md`);
|
|
26
|
+
}
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.error("\u274C Error updating AC status:", error);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function extractCompletedACsFromTasks(incrementPath) {
|
|
32
|
+
const tasksPath = path.join(incrementPath, "tasks.md");
|
|
33
|
+
const completedACs = /* @__PURE__ */ new Set();
|
|
34
|
+
try {
|
|
35
|
+
const tasksContent = await fs.readFile(tasksPath, "utf-8");
|
|
36
|
+
const taskSections = tasksContent.split(/^(###+)\s+T-\d+:/gm);
|
|
37
|
+
for (let i = 1; i < taskSections.length; i += 2) {
|
|
38
|
+
const taskContent = taskSections[i + 1];
|
|
39
|
+
const statusMatch = taskContent.match(/\*\*Status\*\*:\s*\[x\]/i);
|
|
40
|
+
if (!statusMatch) continue;
|
|
41
|
+
const acMatch = taskContent.match(/\*\*AC\*\*:\s*([^\n]+)/);
|
|
42
|
+
if (!acMatch) continue;
|
|
43
|
+
const acField = acMatch[1];
|
|
44
|
+
const acIds = acField.split(",").map((id) => id.trim()).filter((id) => /^AC-[A-Z0-9]+-\d+$/.test(id));
|
|
45
|
+
acIds.forEach((acId) => completedACs.add(acId));
|
|
46
|
+
}
|
|
47
|
+
return completedACs;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (error.code === "ENOENT") {
|
|
50
|
+
console.log(`\u2139\uFE0F tasks.md not found, skipping AC update`);
|
|
51
|
+
} else {
|
|
52
|
+
console.error("Error reading tasks.md:", error);
|
|
53
|
+
}
|
|
54
|
+
return completedACs;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function updateSpecACCheckboxes(incrementPath, completedACs) {
|
|
58
|
+
const specPath = path.join(incrementPath, "spec.md");
|
|
59
|
+
try {
|
|
60
|
+
let specContent = await fs.readFile(specPath, "utf-8");
|
|
61
|
+
let updatedCount = 0;
|
|
62
|
+
const acPattern = /^(\s*)-\s+\[([ x])\]\s+\*\*([A-Z]+-[A-Z0-9]+-\d+)\*\*:(.*)$/gm;
|
|
63
|
+
specContent = specContent.replace(acPattern, (match, indent, currentState, acId, description) => {
|
|
64
|
+
const shouldBeChecked = completedACs.has(acId);
|
|
65
|
+
const isCurrentlyChecked = currentState === "x";
|
|
66
|
+
if (shouldBeChecked && !isCurrentlyChecked) {
|
|
67
|
+
updatedCount++;
|
|
68
|
+
return `${indent}- [x] **${acId}**:${description}`;
|
|
69
|
+
} else if (!shouldBeChecked && isCurrentlyChecked) {
|
|
70
|
+
updatedCount++;
|
|
71
|
+
return `${indent}- [ ] **${acId}**:${description}`;
|
|
72
|
+
}
|
|
73
|
+
return match;
|
|
74
|
+
});
|
|
75
|
+
if (updatedCount > 0) {
|
|
76
|
+
await fs.writeFile(specPath, specContent, "utf-8");
|
|
77
|
+
}
|
|
78
|
+
return updatedCount;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
if (error.code === "ENOENT") {
|
|
81
|
+
console.log(`\u2139\uFE0F spec.md not found, skipping AC update`);
|
|
82
|
+
} else {
|
|
83
|
+
console.error("Error updating spec.md:", error);
|
|
84
|
+
}
|
|
85
|
+
return 0;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const isMainModule = import.meta.url === `file://${process.argv[1]}`;
|
|
89
|
+
if (isMainModule) {
|
|
90
|
+
const incrementId = process.argv[2];
|
|
91
|
+
if (!incrementId) {
|
|
92
|
+
console.error("Usage: node update-ac-status.js <increment-id>");
|
|
93
|
+
console.error("Example: node update-ac-status.js 0031-external-tool-status-sync");
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
updateACStatus(incrementId).then(() => {
|
|
97
|
+
process.exit(0);
|
|
98
|
+
}).catch((error) => {
|
|
99
|
+
console.error("Fatal error:", error);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AC Status Update Hook
|
|
5
|
+
*
|
|
6
|
+
* Updates acceptance criteria checkboxes in spec.md based on completed tasks.
|
|
7
|
+
*
|
|
8
|
+
* Flow:
|
|
9
|
+
* 1. Read tasks.md → Extract completed tasks
|
|
10
|
+
* 2. Extract AC-IDs from **AC**: field (e.g., AC-US1-01, AC-US1-02)
|
|
11
|
+
* 3. Read spec.md → Find all AC checkboxes
|
|
12
|
+
* 4. Check off AC if task implementing it is complete
|
|
13
|
+
* 5. Write updated spec.md
|
|
14
|
+
*
|
|
15
|
+
* Called by: plugins/specweave/hooks/post-task-completion.sh
|
|
16
|
+
*
|
|
17
|
+
* Example:
|
|
18
|
+
* - Task T-001: [x] Completed, **AC**: AC-US1-01, AC-US1-02
|
|
19
|
+
* - spec.md: - [ ] **AC-US1-01**: ... → - [x] **AC-US1-01**: ... ✅
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import * as fs from 'fs/promises';
|
|
23
|
+
import * as path from 'path';
|
|
24
|
+
|
|
25
|
+
interface ACStatus {
|
|
26
|
+
acId: string;
|
|
27
|
+
isComplete: boolean;
|
|
28
|
+
completedByTasks: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Main entry point
|
|
33
|
+
*/
|
|
34
|
+
async function updateACStatus(incrementId: string): Promise<void> {
|
|
35
|
+
try {
|
|
36
|
+
const projectRoot = process.cwd();
|
|
37
|
+
const incrementPath = path.join(projectRoot, '.specweave/increments', incrementId);
|
|
38
|
+
|
|
39
|
+
// Verify increment exists
|
|
40
|
+
try {
|
|
41
|
+
await fs.access(incrementPath);
|
|
42
|
+
} catch {
|
|
43
|
+
console.error(`❌ Increment ${incrementId} not found at ${incrementPath}`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
console.log(`🔄 Updating AC status for increment ${incrementId}...`);
|
|
48
|
+
|
|
49
|
+
// Step 1: Extract completed ACs from tasks.md
|
|
50
|
+
const completedACs = await extractCompletedACsFromTasks(incrementPath);
|
|
51
|
+
|
|
52
|
+
if (completedACs.size === 0) {
|
|
53
|
+
console.log(`ℹ️ No completed tasks with AC-IDs found in tasks.md`);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
console.log(`✓ Found ${completedACs.size} completed AC-IDs from tasks.md`);
|
|
58
|
+
|
|
59
|
+
// Step 2: Update spec.md checkboxes
|
|
60
|
+
const updatedCount = await updateSpecACCheckboxes(incrementPath, completedACs);
|
|
61
|
+
|
|
62
|
+
if (updatedCount > 0) {
|
|
63
|
+
console.log(`✅ Updated ${updatedCount} AC checkbox(es) in spec.md`);
|
|
64
|
+
} else {
|
|
65
|
+
console.log(`ℹ️ No AC checkboxes needed updating in spec.md`);
|
|
66
|
+
}
|
|
67
|
+
} catch (error) {
|
|
68
|
+
console.error('❌ Error updating AC status:', error);
|
|
69
|
+
// Non-blocking: Don't throw, just log
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Extract AC-IDs from completed tasks in tasks.md
|
|
75
|
+
*/
|
|
76
|
+
async function extractCompletedACsFromTasks(incrementPath: string): Promise<Set<string>> {
|
|
77
|
+
const tasksPath = path.join(incrementPath, 'tasks.md');
|
|
78
|
+
const completedACs = new Set<string>();
|
|
79
|
+
|
|
80
|
+
try {
|
|
81
|
+
const tasksContent = await fs.readFile(tasksPath, 'utf-8');
|
|
82
|
+
|
|
83
|
+
// Pattern: Match tasks with completed status and AC field
|
|
84
|
+
// Example:
|
|
85
|
+
// ### T-001: Task Title
|
|
86
|
+
// **Status**: [x] (100% - Completed)
|
|
87
|
+
// **AC**: AC-US1-01, AC-US1-02, AC-US1-03
|
|
88
|
+
|
|
89
|
+
// Split by task headings (## or ###)
|
|
90
|
+
const taskSections = tasksContent.split(/^(###+)\s+T-\d+:/gm);
|
|
91
|
+
|
|
92
|
+
for (let i = 1; i < taskSections.length; i += 2) {
|
|
93
|
+
const taskContent = taskSections[i + 1];
|
|
94
|
+
|
|
95
|
+
// Check if task is completed
|
|
96
|
+
const statusMatch = taskContent.match(/\*\*Status\*\*:\s*\[x\]/i);
|
|
97
|
+
if (!statusMatch) continue;
|
|
98
|
+
|
|
99
|
+
// Extract AC-IDs from **AC**: field
|
|
100
|
+
const acMatch = taskContent.match(/\*\*AC\*\*:\s*([^\n]+)/);
|
|
101
|
+
if (!acMatch) continue;
|
|
102
|
+
|
|
103
|
+
const acField = acMatch[1]; // "AC-US1-01, AC-US1-02, AC-US1-03"
|
|
104
|
+
const acIds = acField
|
|
105
|
+
.split(',')
|
|
106
|
+
.map(id => id.trim())
|
|
107
|
+
.filter(id => /^AC-[A-Z0-9]+-\d+$/.test(id)); // Validate format
|
|
108
|
+
|
|
109
|
+
acIds.forEach(acId => completedACs.add(acId));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return completedACs;
|
|
113
|
+
} catch (error) {
|
|
114
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
115
|
+
console.log(`ℹ️ tasks.md not found, skipping AC update`);
|
|
116
|
+
} else {
|
|
117
|
+
console.error('Error reading tasks.md:', error);
|
|
118
|
+
}
|
|
119
|
+
return completedACs;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Update AC checkboxes in spec.md
|
|
125
|
+
*/
|
|
126
|
+
async function updateSpecACCheckboxes(
|
|
127
|
+
incrementPath: string,
|
|
128
|
+
completedACs: Set<string>
|
|
129
|
+
): Promise<number> {
|
|
130
|
+
const specPath = path.join(incrementPath, 'spec.md');
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
let specContent = await fs.readFile(specPath, 'utf-8');
|
|
134
|
+
let updatedCount = 0;
|
|
135
|
+
|
|
136
|
+
// Pattern: - [ ] **AC-US1-01**: Description
|
|
137
|
+
// Captures: indent, checkbox state, AC-ID, rest of line
|
|
138
|
+
const acPattern = /^(\s*)-\s+\[([ x])\]\s+\*\*([A-Z]+-[A-Z0-9]+-\d+)\*\*:(.*)$/gm;
|
|
139
|
+
|
|
140
|
+
specContent = specContent.replace(acPattern, (match, indent, currentState, acId, description) => {
|
|
141
|
+
const shouldBeChecked = completedACs.has(acId);
|
|
142
|
+
const isCurrentlyChecked = currentState === 'x';
|
|
143
|
+
|
|
144
|
+
if (shouldBeChecked && !isCurrentlyChecked) {
|
|
145
|
+
// Check off this AC
|
|
146
|
+
updatedCount++;
|
|
147
|
+
return `${indent}- [x] **${acId}**:${description}`;
|
|
148
|
+
} else if (!shouldBeChecked && isCurrentlyChecked) {
|
|
149
|
+
// Uncheck this AC (task was un-completed?)
|
|
150
|
+
updatedCount++;
|
|
151
|
+
return `${indent}- [ ] **${acId}**:${description}`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return match; // No change needed
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
if (updatedCount > 0) {
|
|
158
|
+
await fs.writeFile(specPath, specContent, 'utf-8');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return updatedCount;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
|
|
164
|
+
console.log(`ℹ️ spec.md not found, skipping AC update`);
|
|
165
|
+
} else {
|
|
166
|
+
console.error('Error updating spec.md:', error);
|
|
167
|
+
}
|
|
168
|
+
return 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// CLI Entry Point (ES Module)
|
|
173
|
+
const isMainModule = import.meta.url === `file://${process.argv[1]}`;
|
|
174
|
+
|
|
175
|
+
if (isMainModule) {
|
|
176
|
+
const incrementId = process.argv[2];
|
|
177
|
+
|
|
178
|
+
if (!incrementId) {
|
|
179
|
+
console.error('Usage: node update-ac-status.js <increment-id>');
|
|
180
|
+
console.error('Example: node update-ac-status.js 0031-external-tool-status-sync');
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
updateACStatus(incrementId)
|
|
185
|
+
.then(() => {
|
|
186
|
+
process.exit(0);
|
|
187
|
+
})
|
|
188
|
+
.catch((error) => {
|
|
189
|
+
console.error('Fatal error:', error);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: archive-increments
|
|
3
|
+
description: Intelligent increment archiving expert. Analyzes increment age, status, and activity to recommend archiving strategy. Keeps workspace clean while preserving history. Activates for archive increments, clean workspace, too many increments, archive old, archive completed, preserve history, _archive folder.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Increment Archive Manager
|
|
7
|
+
|
|
8
|
+
Expert at keeping the `.specweave/increments/` folder clean and organized through intelligent archiving.
|
|
9
|
+
|
|
10
|
+
## Core Knowledge
|
|
11
|
+
|
|
12
|
+
### Archiving Philosophy
|
|
13
|
+
|
|
14
|
+
**The 10-10-10 Rule**:
|
|
15
|
+
- **10 Active**: Keep last 10 increments readily accessible
|
|
16
|
+
- **10 Days**: Archive increments inactive for >10 days
|
|
17
|
+
- **10 Seconds**: Archive operation should take <10 seconds
|
|
18
|
+
|
|
19
|
+
### Archive Structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
.specweave/increments/
|
|
23
|
+
├── 0023-0032 (Active) ← Last 10 increments
|
|
24
|
+
├── _archive/ ← Completed/old increments
|
|
25
|
+
│ ├── 0001-0022 ← Historical increments
|
|
26
|
+
│ └── 0029 ← Abandoned experiments
|
|
27
|
+
└── _abandoned/ ← Failed/obsolete increments
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Smart Detection Rules
|
|
31
|
+
|
|
32
|
+
#### Never Archive
|
|
33
|
+
- **Active increments** (status: active)
|
|
34
|
+
- **Paused increments** (status: paused) - may resume
|
|
35
|
+
- **Recent increments** (last 10 by default)
|
|
36
|
+
- **Increments with open GitHub/JIRA/ADO issues**
|
|
37
|
+
- **Increments with uncommitted changes**
|
|
38
|
+
|
|
39
|
+
#### Always Archive
|
|
40
|
+
- **Completed >60 days ago**
|
|
41
|
+
- **No activity >30 days** (and status: completed)
|
|
42
|
+
- **Superseded increments** (replaced by newer version)
|
|
43
|
+
- **Failed experiments** (after confirmation)
|
|
44
|
+
|
|
45
|
+
#### Smart Grouping
|
|
46
|
+
- **Release groups**: Archive all v0.7.x after v0.8.0 ships
|
|
47
|
+
- **Feature groups**: Archive related increments together
|
|
48
|
+
- **Time-based**: Quarter/month-based archiving
|
|
49
|
+
|
|
50
|
+
## Usage Patterns
|
|
51
|
+
|
|
52
|
+
### Keep Workspace Clean
|
|
53
|
+
```bash
|
|
54
|
+
# Interactive archiving - prompts for confirmation
|
|
55
|
+
/specweave:archive-increments
|
|
56
|
+
|
|
57
|
+
# Keep only last 5 increments
|
|
58
|
+
/specweave:archive-increments --keep-last 5
|
|
59
|
+
|
|
60
|
+
# Archive all completed increments
|
|
61
|
+
/specweave:archive-increments --archive-completed
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Prepare for Release
|
|
65
|
+
```bash
|
|
66
|
+
# Archive all pre-release increments
|
|
67
|
+
/specweave:archive-increments --pattern "v0.7"
|
|
68
|
+
|
|
69
|
+
# Archive by date range
|
|
70
|
+
/specweave:archive-increments --older-than 30d
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Restore from Archive
|
|
74
|
+
```bash
|
|
75
|
+
# List archived increments
|
|
76
|
+
/specweave:archive-increments --list-archived
|
|
77
|
+
|
|
78
|
+
# Restore specific increment
|
|
79
|
+
/specweave:archive-increments --restore 0015
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Configuration
|
|
83
|
+
|
|
84
|
+
### Default Settings
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"archiving": {
|
|
88
|
+
"keepLast": 10, // Keep last 10 increments
|
|
89
|
+
"autoArchive": false, // Manual by default
|
|
90
|
+
"archiveAfterDays": 60, // Archive after 60 days
|
|
91
|
+
"preserveActive": true, // Never archive active
|
|
92
|
+
"archiveCompleted": false // Manual control
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Aggressive Cleanup
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"archiving": {
|
|
101
|
+
"keepLast": 5, // Minimal workspace
|
|
102
|
+
"autoArchive": true, // Auto-archive on completion
|
|
103
|
+
"archiveAfterDays": 14, // Archive after 2 weeks
|
|
104
|
+
"archiveCompleted": true // Auto-archive completed
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Archive Statistics
|
|
110
|
+
|
|
111
|
+
### Current State Analysis
|
|
112
|
+
When asked about archiving, I analyze:
|
|
113
|
+
- Number of active increments
|
|
114
|
+
- Age of oldest active increment
|
|
115
|
+
- Total size of increments folder
|
|
116
|
+
- Number of completed increments
|
|
117
|
+
- External sync status
|
|
118
|
+
|
|
119
|
+
### Recommendations
|
|
120
|
+
Based on analysis, I suggest:
|
|
121
|
+
- **Overcrowded** (>20 active): Archive all but last 10
|
|
122
|
+
- **Stale** (many >30 days old): Archive by age
|
|
123
|
+
- **Post-release**: Archive previous version increments
|
|
124
|
+
- **Large size** (>100MB): Archive largest completed increments
|
|
125
|
+
|
|
126
|
+
## Safety Features
|
|
127
|
+
|
|
128
|
+
### Pre-Archive Checks
|
|
129
|
+
1. **Metadata validation**: Check increment status
|
|
130
|
+
2. **External sync**: Verify no open issues
|
|
131
|
+
3. **Git status**: Check for uncommitted changes
|
|
132
|
+
4. **Dependencies**: Check if referenced by active increments
|
|
133
|
+
5. **User confirmation**: Show what will be archived
|
|
134
|
+
|
|
135
|
+
### Archive Operations
|
|
136
|
+
- **Atomic moves**: Use fs.move with overwrite protection
|
|
137
|
+
- **Preserve structure**: Maintain full increment structure
|
|
138
|
+
- **Update references**: Fix links in living docs
|
|
139
|
+
- **Reversible**: Easy restore from archive
|
|
140
|
+
- **Audit trail**: Log all archive operations
|
|
141
|
+
|
|
142
|
+
## Smart Suggestions
|
|
143
|
+
|
|
144
|
+
### When to Archive
|
|
145
|
+
- **After major release**: Archive all pre-release increments
|
|
146
|
+
- **Quarterly cleanup**: Archive increments >3 months old
|
|
147
|
+
- **Before new project phase**: Archive previous phase work
|
|
148
|
+
- **Low disk space**: Archive largest completed increments
|
|
149
|
+
|
|
150
|
+
### Archive Patterns
|
|
151
|
+
- **By version**: `--pattern "v0.7"` (all v0.7.x increments)
|
|
152
|
+
- **By feature**: `--pattern "auth|login"` (auth-related)
|
|
153
|
+
- **By date**: `--older-than 30d` (time-based)
|
|
154
|
+
- **By status**: `--archive-completed` (all completed)
|
|
155
|
+
|
|
156
|
+
## Integration Points
|
|
157
|
+
|
|
158
|
+
### Status Line
|
|
159
|
+
- Shows "23-32 (10 active, 22 archived)" format
|
|
160
|
+
- Warns when >15 active increments
|
|
161
|
+
- Suggests archiving when appropriate
|
|
162
|
+
|
|
163
|
+
### Increment Commands
|
|
164
|
+
- `/specweave:done` can trigger auto-archive
|
|
165
|
+
- `/specweave:status` shows archive statistics
|
|
166
|
+
- `/specweave:next` considers archived increments
|
|
167
|
+
|
|
168
|
+
### Living Docs
|
|
169
|
+
- Archive preserves living docs references
|
|
170
|
+
- Restore updates living docs links
|
|
171
|
+
- Archive included in docs statistics
|
|
172
|
+
|
|
173
|
+
## Best Practices
|
|
174
|
+
|
|
175
|
+
1. **Regular Cleanup**: Archive monthly or after releases
|
|
176
|
+
2. **Keep Recent**: Always keep last 5-10 increments
|
|
177
|
+
3. **Preserve Active**: Never force-archive active work
|
|
178
|
+
4. **Group Related**: Archive feature groups together
|
|
179
|
+
5. **Document Reasons**: Add archive notes for context
|
|
180
|
+
|
|
181
|
+
## Quick Reference
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Archive old increments
|
|
185
|
+
/specweave:archive-increments --older-than 30d
|
|
186
|
+
|
|
187
|
+
# Keep workspace minimal
|
|
188
|
+
/specweave:archive-increments --keep-last 5
|
|
189
|
+
|
|
190
|
+
# Archive after release
|
|
191
|
+
/specweave:archive-increments --pattern "pre-release"
|
|
192
|
+
|
|
193
|
+
# Restore for reference
|
|
194
|
+
/specweave:archive-increments --restore 0015
|
|
195
|
+
|
|
196
|
+
# Check archive stats
|
|
197
|
+
/specweave:archive-increments --stats
|
|
198
|
+
```
|
|
@@ -59,8 +59,15 @@ function generateShortName(description) {
|
|
|
59
59
|
* Get the next available feature number
|
|
60
60
|
* @param {string} featuresDir - Path to features directory (default: '.specweave/increments')
|
|
61
61
|
* @returns {string} Next feature number (zero-padded to 4 digits: 0001-9999)
|
|
62
|
+
*
|
|
63
|
+
* NOTE: This function is DEPRECATED. Use IncrementNumberManager from src/core/increment-utils.ts instead.
|
|
64
|
+
* Kept for backward compatibility with existing scripts.
|
|
62
65
|
*/
|
|
63
66
|
function getNextFeatureNumber(featuresDir = '.specweave/increments') {
|
|
67
|
+
// DEPRECATED: For backward compatibility only
|
|
68
|
+
// The NEW implementation scans ALL directories (_archive, _abandoned, _paused)
|
|
69
|
+
// To use the new implementation, import IncrementNumberManager from src/core/increment-utils.ts
|
|
70
|
+
|
|
64
71
|
let highest = 0;
|
|
65
72
|
|
|
66
73
|
if (fs.existsSync(featuresDir)) {
|
|
@@ -104,8 +111,15 @@ function featureExists(shortName, featuresDir = '.specweave/increments') {
|
|
|
104
111
|
* @param {string} incrementNumber - Increment number to check (e.g., '0001')
|
|
105
112
|
* @param {string} featuresDir - Path to features directory
|
|
106
113
|
* @returns {boolean} True if number already exists
|
|
114
|
+
*
|
|
115
|
+
* NOTE: This function is DEPRECATED. Use IncrementNumberManager.incrementNumberExists() instead.
|
|
116
|
+
* Kept for backward compatibility with existing scripts.
|
|
107
117
|
*/
|
|
108
118
|
function incrementNumberExists(incrementNumber, featuresDir = '.specweave/increments') {
|
|
119
|
+
// DEPRECATED: For backward compatibility only
|
|
120
|
+
// The NEW implementation scans ALL directories (_archive, _abandoned, _paused)
|
|
121
|
+
// To use the new implementation, import IncrementNumberManager from src/core/increment-utils.ts
|
|
122
|
+
|
|
109
123
|
if (!fs.existsSync(featuresDir)) {
|
|
110
124
|
return false;
|
|
111
125
|
}
|