specweave 0.18.1 → 0.20.1
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/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-ado/lib/enhanced-ado-sync.js → specweave-jira/lib/enhanced-jira-sync.js} +25 -61
- 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/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +0 -25
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -191
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +0 -1
- package/dist/spec-parser.js +0 -629
- package/dist/src/core/sync/spec-content-sync.d.ts +0 -88
- package/dist/src/core/sync/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/sync/spec-content-sync.js +0 -5
- package/dist/src/core/sync/spec-content-sync.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- 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,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Increment Archiver - Smart archiving system for completed increments
|
|
3
|
+
*
|
|
4
|
+
* Keeps the increments folder clean by archiving old/completed increments
|
|
5
|
+
* while preserving active work and maintaining full history.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs-extra';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { glob } from 'glob';
|
|
10
|
+
import { ConfigManager } from '../config-manager.js';
|
|
11
|
+
import { detectDuplicatesByNumber } from './duplicate-detector.js';
|
|
12
|
+
// Simple logger implementation
|
|
13
|
+
class Logger {
|
|
14
|
+
info(message) { console.log(`ℹ️ ${message}`); }
|
|
15
|
+
success(message) { console.log(`✅ ${message}`); }
|
|
16
|
+
warn(message) { console.warn(`⚠️ ${message}`); }
|
|
17
|
+
error(message) { console.error(`❌ ${message}`); }
|
|
18
|
+
debug(message) { if (process.env.DEBUG)
|
|
19
|
+
console.log(`🔍 ${message}`); }
|
|
20
|
+
}
|
|
21
|
+
export class IncrementArchiver {
|
|
22
|
+
constructor(rootDir) {
|
|
23
|
+
this.rootDir = rootDir;
|
|
24
|
+
this.logger = new Logger();
|
|
25
|
+
this.config = new ConfigManager(rootDir);
|
|
26
|
+
this.incrementsDir = path.join(rootDir, '.specweave', 'increments');
|
|
27
|
+
this.archiveDir = path.join(this.incrementsDir, '_archive');
|
|
28
|
+
this.abandonedDir = path.join(this.incrementsDir, '_abandoned');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Archive increments based on options
|
|
32
|
+
*/
|
|
33
|
+
async archive(options = {}) {
|
|
34
|
+
const result = {
|
|
35
|
+
archived: [],
|
|
36
|
+
skipped: [],
|
|
37
|
+
errors: [],
|
|
38
|
+
totalSize: 0
|
|
39
|
+
};
|
|
40
|
+
// Ensure archive directory exists
|
|
41
|
+
if (!options.dryRun) {
|
|
42
|
+
await fs.ensureDir(this.archiveDir);
|
|
43
|
+
}
|
|
44
|
+
// Get all increments
|
|
45
|
+
const increments = await this.getIncrements();
|
|
46
|
+
// Filter increments based on options
|
|
47
|
+
const toArchive = await this.filterIncrements(increments, options);
|
|
48
|
+
// Process each increment
|
|
49
|
+
for (const increment of toArchive) {
|
|
50
|
+
try {
|
|
51
|
+
const shouldArchive = await this.shouldArchive(increment, options);
|
|
52
|
+
if (shouldArchive) {
|
|
53
|
+
if (options.dryRun) {
|
|
54
|
+
this.logger.info(`[DRY RUN] Would archive: ${increment}`);
|
|
55
|
+
result.archived.push(increment);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
await this.archiveIncrement(increment);
|
|
59
|
+
result.archived.push(increment);
|
|
60
|
+
this.logger.success(`Archived: ${increment}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
result.skipped.push(increment);
|
|
65
|
+
this.logger.debug(`Skipped: ${increment}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
result.errors.push(increment);
|
|
70
|
+
this.logger.error(`Failed to archive ${increment}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Calculate total size
|
|
74
|
+
if (!options.dryRun) {
|
|
75
|
+
result.totalSize = await this.calculateSize(result.archived);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get all increment directories (excluding _archive and _abandoned)
|
|
81
|
+
*/
|
|
82
|
+
async getIncrements() {
|
|
83
|
+
const pattern = path.join(this.incrementsDir, '[0-9]*-*');
|
|
84
|
+
const allPaths = await glob(pattern);
|
|
85
|
+
// Filter to only directories
|
|
86
|
+
const increments = [];
|
|
87
|
+
for (const p of allPaths) {
|
|
88
|
+
const stats = await fs.stat(p);
|
|
89
|
+
if (stats.isDirectory()) {
|
|
90
|
+
increments.push(p);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return increments
|
|
94
|
+
.map(p => path.basename(p))
|
|
95
|
+
.sort((a, b) => {
|
|
96
|
+
const numA = parseInt(a.split('-')[0]);
|
|
97
|
+
const numB = parseInt(b.split('-')[0]);
|
|
98
|
+
return numA - numB;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Filter increments based on archive options
|
|
103
|
+
*/
|
|
104
|
+
async filterIncrements(increments, options) {
|
|
105
|
+
let filtered = [...increments];
|
|
106
|
+
// If specific increments provided, use only those
|
|
107
|
+
if (options.increments && options.increments.length > 0) {
|
|
108
|
+
filtered = filtered.filter(inc => {
|
|
109
|
+
const incNumber = inc.split('-')[0];
|
|
110
|
+
return options.increments.some(target => {
|
|
111
|
+
return inc === target || incNumber === target.padStart(4, '0');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
return filtered;
|
|
115
|
+
}
|
|
116
|
+
// Apply pattern filter
|
|
117
|
+
if (options.pattern) {
|
|
118
|
+
const regex = new RegExp(options.pattern, 'i');
|
|
119
|
+
filtered = filtered.filter(inc => regex.test(inc));
|
|
120
|
+
}
|
|
121
|
+
// Keep last N increments
|
|
122
|
+
if (options.keepLast !== undefined) {
|
|
123
|
+
const toKeep = increments.slice(-options.keepLast);
|
|
124
|
+
filtered = filtered.filter(inc => !toKeep.includes(inc));
|
|
125
|
+
}
|
|
126
|
+
// Filter by age
|
|
127
|
+
if (options.olderThanDays !== undefined) {
|
|
128
|
+
const cutoffDate = new Date();
|
|
129
|
+
cutoffDate.setDate(cutoffDate.getDate() - options.olderThanDays);
|
|
130
|
+
filtered = await Promise.all(filtered.map(async (inc) => {
|
|
131
|
+
const metadata = await this.getMetadata(inc);
|
|
132
|
+
if (metadata?.lastActivity) {
|
|
133
|
+
const lastActivity = new Date(metadata.lastActivity);
|
|
134
|
+
return lastActivity < cutoffDate ? inc : null;
|
|
135
|
+
}
|
|
136
|
+
// Check directory modification time as fallback
|
|
137
|
+
const incPath = path.join(this.incrementsDir, inc);
|
|
138
|
+
const stats = await fs.stat(incPath);
|
|
139
|
+
return stats.mtime < cutoffDate ? inc : null;
|
|
140
|
+
})).then(results => results.filter(Boolean));
|
|
141
|
+
}
|
|
142
|
+
return filtered;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Determine if an increment should be archived
|
|
146
|
+
*/
|
|
147
|
+
async shouldArchive(increment, options) {
|
|
148
|
+
// Check if already in archive
|
|
149
|
+
const archivePath = path.join(this.archiveDir, increment);
|
|
150
|
+
if (await fs.pathExists(archivePath)) {
|
|
151
|
+
this.logger.debug(`${increment} already archived`);
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
// Get metadata
|
|
155
|
+
const metadata = await this.getMetadata(increment);
|
|
156
|
+
// Preserve active/paused increments by default
|
|
157
|
+
if (options.preserveActive !== false && metadata?.status) {
|
|
158
|
+
if (['active', 'paused'].includes(metadata.status)) {
|
|
159
|
+
this.logger.debug(`${increment} is ${metadata.status}, preserving`);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Check for active external sync (GitHub, JIRA, ADO) - MUST check before archiveCompleted
|
|
164
|
+
if (metadata) {
|
|
165
|
+
const hasActiveSync = (metadata.github && !metadata.github.closed) ||
|
|
166
|
+
(metadata.jira && metadata.jira.status !== 'Done') ||
|
|
167
|
+
(metadata.ado && metadata.ado.state !== 'Closed');
|
|
168
|
+
if (hasActiveSync) {
|
|
169
|
+
this.logger.warn(`${increment} has active external sync, skipping`);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Archive completed increments if requested
|
|
174
|
+
if (options.archiveCompleted && metadata?.status === 'completed') {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Check for uncommitted changes
|
|
178
|
+
const hasUncommittedChanges = await this.hasUncommittedChanges(increment);
|
|
179
|
+
if (hasUncommittedChanges) {
|
|
180
|
+
this.logger.warn(`${increment} has uncommitted changes, skipping`);
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Archive a single increment
|
|
187
|
+
*/
|
|
188
|
+
async archiveIncrement(increment) {
|
|
189
|
+
const sourcePath = path.join(this.incrementsDir, increment);
|
|
190
|
+
const targetPath = path.join(this.archiveDir, increment);
|
|
191
|
+
// CRITICAL: Check for duplicates before archiving
|
|
192
|
+
const numberMatch = increment.match(/^(\d+)/);
|
|
193
|
+
if (numberMatch) {
|
|
194
|
+
const incrementNumber = numberMatch[1];
|
|
195
|
+
const duplicates = await detectDuplicatesByNumber(incrementNumber, this.rootDir);
|
|
196
|
+
// Check if any duplicates exist in archive or abandoned
|
|
197
|
+
const archiveDuplicates = duplicates.filter(d => d.path.includes('_archive') || d.path.includes('_abandoned'));
|
|
198
|
+
if (archiveDuplicates.length > 0) {
|
|
199
|
+
const locations = archiveDuplicates.map(d => d.path).join('\n - ');
|
|
200
|
+
throw new Error(`Cannot archive ${increment}: Increment number ${incrementNumber} already exists in:\n - ${locations}\n\n` +
|
|
201
|
+
`Resolution options:\n` +
|
|
202
|
+
` 1. Delete the existing archive/abandoned version first\n` +
|
|
203
|
+
` 2. Use --force to overwrite (not recommended)\n` +
|
|
204
|
+
` 3. Run /specweave:fix-duplicates to resolve conflicts`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Move the directory
|
|
208
|
+
await fs.move(sourcePath, targetPath, { overwrite: false });
|
|
209
|
+
// Update any references in config or living docs
|
|
210
|
+
await this.updateReferences(increment);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get metadata for an increment
|
|
214
|
+
*/
|
|
215
|
+
async getMetadata(increment) {
|
|
216
|
+
const metadataPath = path.join(this.incrementsDir, increment, 'metadata.json');
|
|
217
|
+
if (await fs.pathExists(metadataPath)) {
|
|
218
|
+
try {
|
|
219
|
+
return await fs.readJson(metadataPath);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
this.logger.debug(`Failed to read metadata for ${increment}: ${error}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Check if increment has uncommitted changes
|
|
229
|
+
*/
|
|
230
|
+
async hasUncommittedChanges(increment) {
|
|
231
|
+
// This would integrate with git to check for uncommitted changes
|
|
232
|
+
// For now, return false to allow archiving
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Update references after archiving
|
|
237
|
+
*/
|
|
238
|
+
async updateReferences(increment) {
|
|
239
|
+
// Import and run feature archiving to maintain consistency
|
|
240
|
+
try {
|
|
241
|
+
const { FeatureArchiver } = await import('../living-docs/feature-archiver.js');
|
|
242
|
+
const featureArchiver = new FeatureArchiver(this.rootDir);
|
|
243
|
+
// Archive features that have all their increments archived
|
|
244
|
+
const result = await featureArchiver.archiveFeatures({
|
|
245
|
+
dryRun: false,
|
|
246
|
+
updateLinks: true,
|
|
247
|
+
preserveActiveFeatures: true,
|
|
248
|
+
archiveOrphanedFeatures: false,
|
|
249
|
+
archiveOrphanedEpics: false
|
|
250
|
+
});
|
|
251
|
+
if (result.archivedFeatures.length > 0) {
|
|
252
|
+
this.logger.success(`Archived ${result.archivedFeatures.length} features linked to increment ${increment}`);
|
|
253
|
+
}
|
|
254
|
+
if (result.archivedEpics.length > 0) {
|
|
255
|
+
this.logger.success(`Archived ${result.archivedEpics.length} epics`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
this.logger.warn(`Could not update feature archives: ${error}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Calculate total size of archived increments
|
|
264
|
+
*/
|
|
265
|
+
async calculateSize(increments) {
|
|
266
|
+
let totalSize = 0;
|
|
267
|
+
for (const increment of increments) {
|
|
268
|
+
const incPath = path.join(this.archiveDir, increment);
|
|
269
|
+
if (await fs.pathExists(incPath)) {
|
|
270
|
+
totalSize += await this.getDirectorySize(incPath);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return totalSize;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get directory size recursively
|
|
277
|
+
*/
|
|
278
|
+
async getDirectorySize(dirPath) {
|
|
279
|
+
let size = 0;
|
|
280
|
+
const files = await glob(path.join(dirPath, '**/*'));
|
|
281
|
+
for (const file of files) {
|
|
282
|
+
const stats = await fs.stat(file);
|
|
283
|
+
if (stats.isFile()) {
|
|
284
|
+
size += stats.size;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return size;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Restore an increment from archive
|
|
291
|
+
*/
|
|
292
|
+
async restore(increment) {
|
|
293
|
+
const sourcePath = path.join(this.archiveDir, increment);
|
|
294
|
+
const targetPath = path.join(this.incrementsDir, increment);
|
|
295
|
+
if (!await fs.pathExists(sourcePath)) {
|
|
296
|
+
throw new Error(`Increment ${increment} not found in archive`);
|
|
297
|
+
}
|
|
298
|
+
if (await fs.pathExists(targetPath)) {
|
|
299
|
+
throw new Error(`Increment ${increment} already exists in main folder`);
|
|
300
|
+
}
|
|
301
|
+
// CRITICAL: Check for duplicates before restoring
|
|
302
|
+
const numberMatch = increment.match(/^(\d+)/);
|
|
303
|
+
if (numberMatch) {
|
|
304
|
+
const incrementNumber = numberMatch[1];
|
|
305
|
+
const duplicates = await detectDuplicatesByNumber(incrementNumber, this.rootDir);
|
|
306
|
+
// Check if any duplicates exist in active increments
|
|
307
|
+
const activeDuplicates = duplicates.filter(d => !d.path.includes('_archive') && !d.path.includes('_abandoned'));
|
|
308
|
+
if (activeDuplicates.length > 0) {
|
|
309
|
+
const locations = activeDuplicates.map(d => d.path).join('\n - ');
|
|
310
|
+
throw new Error(`Cannot restore ${increment}: Increment number ${incrementNumber} already exists in active folder:\n - ${locations}\n\n` +
|
|
311
|
+
`Resolution options:\n` +
|
|
312
|
+
` 1. Delete/archive the existing active version first\n` +
|
|
313
|
+
` 2. Run /specweave:fix-duplicates to resolve conflicts`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
await fs.move(sourcePath, targetPath);
|
|
317
|
+
this.logger.success(`Restored ${increment} from archive`);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* List archived increments
|
|
321
|
+
*/
|
|
322
|
+
async listArchived() {
|
|
323
|
+
if (!await fs.pathExists(this.archiveDir)) {
|
|
324
|
+
return [];
|
|
325
|
+
}
|
|
326
|
+
const pattern = path.join(this.archiveDir, '[0-9]*-*');
|
|
327
|
+
const allPaths = await glob(pattern);
|
|
328
|
+
// Filter to only directories
|
|
329
|
+
const archived = [];
|
|
330
|
+
for (const p of allPaths) {
|
|
331
|
+
const stats = await fs.stat(p);
|
|
332
|
+
if (stats.isDirectory()) {
|
|
333
|
+
archived.push(p);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return archived
|
|
337
|
+
.map(p => path.basename(p))
|
|
338
|
+
.sort((a, b) => {
|
|
339
|
+
const numA = parseInt(a.split('-')[0]);
|
|
340
|
+
const numB = parseInt(b.split('-')[0]);
|
|
341
|
+
return numA - numB;
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get archive statistics
|
|
346
|
+
*/
|
|
347
|
+
async getStats() {
|
|
348
|
+
const active = await this.getIncrements();
|
|
349
|
+
const archived = await this.listArchived();
|
|
350
|
+
// Count abandoned
|
|
351
|
+
let abandoned = 0;
|
|
352
|
+
if (await fs.pathExists(this.abandonedDir)) {
|
|
353
|
+
const abandonedDirs = await glob(path.join(this.abandonedDir, '[0-9]*-*'));
|
|
354
|
+
abandoned = abandonedDirs.length;
|
|
355
|
+
}
|
|
356
|
+
// Calculate total archive size
|
|
357
|
+
const totalSize = await this.calculateSize(archived);
|
|
358
|
+
return {
|
|
359
|
+
active: active.length,
|
|
360
|
+
archived: archived.length,
|
|
361
|
+
abandoned,
|
|
362
|
+
totalSize,
|
|
363
|
+
oldestActive: active[0] || null,
|
|
364
|
+
newestArchived: archived[archived.length - 1] || null
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=increment-archiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment-archiver.js","sourceRoot":"","sources":["../../../../src/core/increment/increment-archiver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,+BAA+B;AAC/B,MAAM,MAAM;IACV,IAAI,CAAC,OAAe,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,OAAe,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,OAAe,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,OAAe,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,CAAC,OAAe,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;CAChF;AAmBD,MAAM,OAAO,iBAAiB;IAQ5B,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,UAA0B,EAAE;QACxC,MAAM,MAAM,GAAkB;YAC5B,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,CAAC;SACb,CAAC;QAEF,kCAAkC;QAClC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE9C,qCAAqC;QACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAEnE,yBAAyB;QACzB,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEnE,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;wBAC1D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAClC,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;wBACvC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QAErC,6BAA6B;QAC7B,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,UAAU;aACd,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,UAAoB,EACpB,OAAuB;QAEvB,IAAI,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QAE/B,kDAAkD;QAClD,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,OAAO,OAAO,CAAC,UAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;oBACvC,OAAO,GAAG,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC/C,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnD,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,gBAAgB;QAChB,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;YAEjE,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;gBACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,QAAQ,EAAE,YAAY,EAAE,CAAC;oBAC3B,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACrD,OAAO,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAChD,CAAC;gBACD,gDAAgD;gBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,OAAO,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CACzB,SAAiB,EACjB,OAAuB;QAEvB,8BAA8B;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,mBAAmB,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,eAAe;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAEnD,+CAA+C;QAC/C,IAAI,OAAO,CAAC,cAAc,KAAK,KAAK,IAAI,QAAQ,EAAE,MAAM,EAAE,CAAC;YACzD,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,OAAO,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,0FAA0F;QAC1F,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,aAAa,GACjB,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC5C,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;gBAClD,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YAEpD,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,qCAAqC,CAAC,CAAC;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,gBAAgB,IAAI,QAAQ,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gCAAgC;QAChC,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,oCAAoC,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEzD,kDAAkD;QAClD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjF,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7D,CAAC;YAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpE,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,sBAAsB,eAAe,4BAA4B,SAAS,MAAM;oBAC3G,uBAAuB;oBACvB,4DAA4D;oBAC5D,mDAAmD;oBACnD,yDAAyD,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,iDAAiD;QACjD,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,SAAiB;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAE/E,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QACnD,iEAAiE;QACjE,2CAA2C;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC9C,2DAA2D;QAC3D,IAAI,CAAC;YACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;YAC/E,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1D,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC;gBACnD,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,IAAI;gBACjB,sBAAsB,EAAE,IAAI;gBAC5B,uBAAuB,EAAE,KAAK;gBAC9B,oBAAoB,EAAE,KAAK;aAC5B,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,gBAAgB,CAAC,MAAM,iCAAiC,SAAS,EAAE,CAAC,CAAC;YAC9G,CAAC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,MAAM,CAAC,aAAa,CAAC,MAAM,QAAQ,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,UAAoB;QAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,SAAS,IAAI,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,OAAe;QAC5C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,SAAiB;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,uBAAuB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,gCAAgC,CAAC,CAAC;QAC1E,CAAC;QAED,kDAAkD;QAClD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAEjF,qDAAqD;YACrD,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7C,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC/D,CAAC;YAEF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,sBAAsB,eAAe,0CAA0C,SAAS,MAAM;oBACzH,uBAAuB;oBACvB,yDAAyD;oBACzD,yDAAyD,CAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,SAAS,eAAe,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QAErC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QAQZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAE3C,kBAAkB;QAClB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;YAC3E,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;QACnC,CAAC;QAED,+BAA+B;QAC/B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAErD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,SAAS;YACT,SAAS;YACT,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;YAC/B,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI;SACtD,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Increment Reopener
|
|
3
|
+
*
|
|
4
|
+
* Handles reopening of completed increments, tasks, and user stories
|
|
5
|
+
* when issues are discovered after completion.
|
|
6
|
+
*
|
|
7
|
+
* Part of smart reopen functionality (increment 0032)
|
|
8
|
+
*/
|
|
9
|
+
import { IncrementMetadata, IncrementStatus } from '../types/increment-metadata.js';
|
|
10
|
+
/**
|
|
11
|
+
* Reopen target types
|
|
12
|
+
*/
|
|
13
|
+
export declare enum ReopenTarget {
|
|
14
|
+
/** Reopen entire increment */
|
|
15
|
+
INCREMENT = "increment",
|
|
16
|
+
/** Reopen specific task(s) */
|
|
17
|
+
TASK = "task",
|
|
18
|
+
/** Reopen user story + related tasks */
|
|
19
|
+
USER_STORY = "user-story"
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Reopen context
|
|
23
|
+
*/
|
|
24
|
+
export interface ReopenContext {
|
|
25
|
+
/** What to reopen */
|
|
26
|
+
target: ReopenTarget;
|
|
27
|
+
/** Increment ID */
|
|
28
|
+
incrementId: string;
|
|
29
|
+
/** Task ID (if target = TASK) */
|
|
30
|
+
taskId?: string;
|
|
31
|
+
/** User story ID (if target = USER_STORY) */
|
|
32
|
+
userStoryId?: string;
|
|
33
|
+
/** Reason for reopening (required for audit trail) */
|
|
34
|
+
reason: string;
|
|
35
|
+
/** Force reopen (bypass WIP checks) */
|
|
36
|
+
force?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reopen result
|
|
40
|
+
*/
|
|
41
|
+
export interface ReopenResult {
|
|
42
|
+
/** Success flag */
|
|
43
|
+
success: boolean;
|
|
44
|
+
/** Items that were reopened */
|
|
45
|
+
itemsReopened: string[];
|
|
46
|
+
/** Warning messages */
|
|
47
|
+
warnings: string[];
|
|
48
|
+
/** Error messages */
|
|
49
|
+
errors: string[];
|
|
50
|
+
/** WIP limit exceeded? */
|
|
51
|
+
wipLimitExceeded?: boolean;
|
|
52
|
+
/** Increment metadata after reopen */
|
|
53
|
+
metadata?: IncrementMetadata;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* WIP validation result
|
|
57
|
+
*/
|
|
58
|
+
export interface WIPValidationResult {
|
|
59
|
+
/** Is reopen allowed? */
|
|
60
|
+
allowed: boolean;
|
|
61
|
+
/** Warning flag */
|
|
62
|
+
warning: boolean;
|
|
63
|
+
/** Message */
|
|
64
|
+
message?: string;
|
|
65
|
+
/** Current active count */
|
|
66
|
+
activeCount?: number;
|
|
67
|
+
/** Limit for increment type */
|
|
68
|
+
limit?: number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Reopen history entry (audit trail)
|
|
72
|
+
*/
|
|
73
|
+
export interface ReopenHistoryEntry {
|
|
74
|
+
/** When reopened */
|
|
75
|
+
date: string;
|
|
76
|
+
/** Why reopened */
|
|
77
|
+
reason: string;
|
|
78
|
+
/** Previous status */
|
|
79
|
+
previousStatus: IncrementStatus;
|
|
80
|
+
/** Who reopened (always 'user' for now) */
|
|
81
|
+
by: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extended metadata with reopen history
|
|
85
|
+
*/
|
|
86
|
+
export interface IncrementMetadataWithReopen extends IncrementMetadata {
|
|
87
|
+
/** Reopen tracking */
|
|
88
|
+
reopened?: {
|
|
89
|
+
/** Number of times reopened */
|
|
90
|
+
count: number;
|
|
91
|
+
/** Reopen history */
|
|
92
|
+
history: ReopenHistoryEntry[];
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Increment Reopener
|
|
97
|
+
*
|
|
98
|
+
* Provides smart reopen functionality for increments, tasks, and user stories
|
|
99
|
+
*/
|
|
100
|
+
export declare class IncrementReopener {
|
|
101
|
+
/**
|
|
102
|
+
* Reopen a completed increment
|
|
103
|
+
*
|
|
104
|
+
* @param context - Reopen context
|
|
105
|
+
* @returns Reopen result
|
|
106
|
+
*/
|
|
107
|
+
static reopenIncrement(context: ReopenContext): Promise<ReopenResult>;
|
|
108
|
+
/**
|
|
109
|
+
* Reopen specific task(s) in an increment
|
|
110
|
+
*
|
|
111
|
+
* @param context - Reopen context
|
|
112
|
+
* @returns Reopen result
|
|
113
|
+
*/
|
|
114
|
+
static reopenTask(context: ReopenContext): Promise<ReopenResult>;
|
|
115
|
+
/**
|
|
116
|
+
* Reopen user story + related tasks
|
|
117
|
+
*
|
|
118
|
+
* @param context - Reopen context
|
|
119
|
+
* @returns Reopen result
|
|
120
|
+
*/
|
|
121
|
+
static reopenUserStory(context: ReopenContext): Promise<ReopenResult>;
|
|
122
|
+
/**
|
|
123
|
+
* Validate WIP limits before reopening
|
|
124
|
+
*
|
|
125
|
+
* @param metadata - Increment metadata
|
|
126
|
+
* @param force - Force reopen?
|
|
127
|
+
* @returns Validation result
|
|
128
|
+
*/
|
|
129
|
+
private static validateWIPLimits;
|
|
130
|
+
/**
|
|
131
|
+
* Reopen uncompleted tasks in increment
|
|
132
|
+
*
|
|
133
|
+
* @param incrementId - Increment ID
|
|
134
|
+
* @param reason - Reason for reopening
|
|
135
|
+
* @returns List of reopened task IDs
|
|
136
|
+
*/
|
|
137
|
+
private static reopenUncompletedTasks;
|
|
138
|
+
/**
|
|
139
|
+
* Find tasks that implement a user story (by AC field)
|
|
140
|
+
*
|
|
141
|
+
* @param incrementId - Increment ID
|
|
142
|
+
* @param userStoryId - User story ID (e.g., "US-001")
|
|
143
|
+
* @returns List of task IDs
|
|
144
|
+
*/
|
|
145
|
+
private static findTasksForUserStory;
|
|
146
|
+
/**
|
|
147
|
+
* Update user story status in living docs
|
|
148
|
+
*
|
|
149
|
+
* @param incrementId - Increment ID
|
|
150
|
+
* @param userStoryId - User story ID
|
|
151
|
+
* @param status - New status
|
|
152
|
+
* @param reason - Reason
|
|
153
|
+
* @returns Success flag
|
|
154
|
+
*/
|
|
155
|
+
private static updateUserStoryStatus;
|
|
156
|
+
/**
|
|
157
|
+
* Find user story files in living docs
|
|
158
|
+
*
|
|
159
|
+
* @param basePath - Base search path
|
|
160
|
+
* @param userStoryId - User story ID (e.g., "US-001")
|
|
161
|
+
* @returns List of file paths
|
|
162
|
+
*/
|
|
163
|
+
private static findUserStoryFiles;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=increment-reopener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"increment-reopener.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/increment-reopener.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EACL,iBAAiB,EACjB,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AAExC;;GAEG;AACH,oBAAY,YAAY;IACtB,8BAA8B;IAC9B,SAAS,cAAc;IAEvB,8BAA8B;IAC9B,IAAI,SAAS;IAEb,wCAAwC;IACxC,UAAU,eAAe;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,MAAM,EAAE,YAAY,CAAC;IAErB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IAExB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,qBAAqB;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,0BAA0B;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yBAAyB;IACzB,OAAO,EAAE,OAAO,CAAC;IAEjB,mBAAmB;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,cAAc,EAAE,eAAe,CAAC;IAEhC,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,sBAAsB;IACtB,QAAQ,CAAC,EAAE;QACT,+BAA+B;QAC/B,KAAK,EAAE,MAAM,CAAC;QAEd,qBAAqB;QACrB,OAAO,EAAE,kBAAkB,EAAE,CAAC;KAC/B,CAAC;CACH;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B;;;;;OAKG;WACU,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwF3E;;;;;OAKG;WACU,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsFtE;;;;;OAKG;WACU,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAsE3E;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IA2ChC;;;;;;OAMG;mBACkB,sBAAsB;IAyC3C;;;;;;OAMG;mBACkB,qBAAqB;IAqC1C;;;;;;;;OAQG;mBACkB,qBAAqB;IAkD1C;;;;;;OAMG;mBACkB,kBAAkB;CA+BxC"}
|