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,205 @@
|
|
|
1
|
+
var CompactionStrategy = /* @__PURE__ */ ((CompactionStrategy2) => {
|
|
2
|
+
CompactionStrategy2["DELETE"] = "delete";
|
|
3
|
+
CompactionStrategy2["COMPACT"] = "compact";
|
|
4
|
+
CompactionStrategy2["COMPACT_DELETE"] = "compact,delete";
|
|
5
|
+
return CompactionStrategy2;
|
|
6
|
+
})(CompactionStrategy || {});
|
|
7
|
+
class TieredStorageManager {
|
|
8
|
+
/**
|
|
9
|
+
* Generate tiered storage broker configuration
|
|
10
|
+
*/
|
|
11
|
+
static generateBrokerConfig(config) {
|
|
12
|
+
const brokerConfig = {
|
|
13
|
+
// Enable tiered storage
|
|
14
|
+
"remote.log.storage.system.enable": config.enabled,
|
|
15
|
+
// Local tier retention (hot data)
|
|
16
|
+
"log.local.retention.ms": config.localRetentionMs,
|
|
17
|
+
"log.local.retention.bytes": -1,
|
|
18
|
+
// Unlimited by size
|
|
19
|
+
// Remote storage system
|
|
20
|
+
"remote.log.storage.manager.class.name": this.getRemoteStorageManagerClass(
|
|
21
|
+
config.remoteStorageSystem
|
|
22
|
+
),
|
|
23
|
+
// S3-specific configuration (if S3)
|
|
24
|
+
...config.remoteStorageSystem === "S3" && {
|
|
25
|
+
"rsm.config.remote.log.storage.s3.bucket.name": config.remoteStoragePath,
|
|
26
|
+
"rsm.config.remote.log.storage.s3.region": "us-east-1"
|
|
27
|
+
},
|
|
28
|
+
// Upload configuration
|
|
29
|
+
"remote.log.manager.task.interval.ms": config.uploadIntervalMs || 6e4,
|
|
30
|
+
// Compression
|
|
31
|
+
"remote.log.storage.manager.class.path": "/usr/share/kafka/plugins/tiered-storage"
|
|
32
|
+
};
|
|
33
|
+
if (config.compressionType && config.compressionType !== "none") {
|
|
34
|
+
brokerConfig["compression.type"] = config.compressionType;
|
|
35
|
+
}
|
|
36
|
+
return brokerConfig;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate tiered storage topic configuration
|
|
40
|
+
*/
|
|
41
|
+
static generateTopicConfig(config) {
|
|
42
|
+
return {
|
|
43
|
+
// Enable tiered storage for this topic
|
|
44
|
+
"remote.storage.enable": config.enabled ? "true" : "false",
|
|
45
|
+
// Local retention (hot tier)
|
|
46
|
+
"local.retention.ms": config.localRetentionMs.toString(),
|
|
47
|
+
"local.retention.bytes": "-1",
|
|
48
|
+
// Unlimited
|
|
49
|
+
// Total retention (hot + cold tier)
|
|
50
|
+
"retention.ms": config.remoteRetentionMs.toString(),
|
|
51
|
+
// Segment configuration
|
|
52
|
+
"segment.bytes": "1073741824",
|
|
53
|
+
// 1GB segments
|
|
54
|
+
"segment.ms": "604800000"
|
|
55
|
+
// 7 days
|
|
56
|
+
// Note: Remote data deleted when retention.ms expires
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate storage savings
|
|
61
|
+
*/
|
|
62
|
+
static calculateStorageSavings(totalDataGB, localRetentionDays, totalRetentionDays, replicationFactor) {
|
|
63
|
+
const dailyDataGB = totalDataGB / totalRetentionDays;
|
|
64
|
+
const localStorageGB = dailyDataGB * localRetentionDays * replicationFactor;
|
|
65
|
+
const remoteStorageGB = dailyDataGB * (totalRetentionDays - localRetentionDays);
|
|
66
|
+
const nonTieredStorageGB = totalDataGB * replicationFactor;
|
|
67
|
+
const totalStorageGB = localStorageGB + remoteStorageGB;
|
|
68
|
+
const savingsPercent = (nonTieredStorageGB - totalStorageGB) / nonTieredStorageGB * 100;
|
|
69
|
+
return {
|
|
70
|
+
localStorageGB: Math.round(localStorageGB * 10) / 10,
|
|
71
|
+
remoteStorageGB: Math.round(remoteStorageGB * 10) / 10,
|
|
72
|
+
totalStorageGB: Math.round(totalStorageGB * 10) / 10,
|
|
73
|
+
savingsPercent: Math.round(savingsPercent * 10) / 10
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
static getRemoteStorageManagerClass(system) {
|
|
77
|
+
const classMap = {
|
|
78
|
+
"S3": "org.apache.kafka.server.log.remote.storage.RemoteLogStorageManager",
|
|
79
|
+
"Azure Blob": "org.apache.kafka.server.log.remote.storage.AzureBlobRemoteStorageManager",
|
|
80
|
+
"Google Cloud Storage": "org.apache.kafka.server.log.remote.storage.GCSRemoteStorageManager",
|
|
81
|
+
"MinIO": "org.apache.kafka.server.log.remote.storage.MinIORemoteStorageManager"
|
|
82
|
+
};
|
|
83
|
+
return classMap[system];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
class LogCompactionManager {
|
|
87
|
+
/**
|
|
88
|
+
* Generate compaction topic configuration
|
|
89
|
+
*/
|
|
90
|
+
static generateCompactionConfig(config) {
|
|
91
|
+
const topicConfig = {
|
|
92
|
+
// Cleanup policy
|
|
93
|
+
"cleanup.policy": config.cleanupPolicy,
|
|
94
|
+
// Segment configuration
|
|
95
|
+
"segment.bytes": (config.segmentBytes || 1073741824).toString(),
|
|
96
|
+
// 1GB default
|
|
97
|
+
"segment.ms": (config.segmentMs || 6048e5).toString(),
|
|
98
|
+
// 7 days default
|
|
99
|
+
// Compaction lag
|
|
100
|
+
"min.compaction.lag.ms": (config.minCompactionLagMs || 0).toString(),
|
|
101
|
+
"max.compaction.lag.ms": (config.maxCompactionLagMs || 9223372036854776e3).toString(),
|
|
102
|
+
// Max long
|
|
103
|
+
// Delete retention (tombstone retention)
|
|
104
|
+
"delete.retention.ms": (config.deleteRetentionMs || 864e5).toString(),
|
|
105
|
+
// 24 hours default
|
|
106
|
+
// Min cleanable ratio (% of log that must be dirty)
|
|
107
|
+
"min.cleanable.dirty.ratio": (config.minCleanableRatio || 0.5).toString()
|
|
108
|
+
// 50% default
|
|
109
|
+
};
|
|
110
|
+
return topicConfig;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Choose compaction strategy based on use case
|
|
114
|
+
*/
|
|
115
|
+
static chooseStrategy(useCase) {
|
|
116
|
+
const strategies = {
|
|
117
|
+
"event-log": {
|
|
118
|
+
strategy: "delete" /* DELETE */,
|
|
119
|
+
reasoning: "Event logs are immutable and time-based. Keep all events for retention period.",
|
|
120
|
+
exampleConfig: {
|
|
121
|
+
cleanupPolicy: "delete" /* DELETE */,
|
|
122
|
+
segmentMs: 864e5
|
|
123
|
+
// 1 day segments
|
|
124
|
+
// retention.ms set separately (e.g., 30 days)
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"changelog": {
|
|
128
|
+
strategy: "compact" /* COMPACT */,
|
|
129
|
+
reasoning: "Changelog topics should keep latest state per key. Compaction removes old values.",
|
|
130
|
+
exampleConfig: {
|
|
131
|
+
cleanupPolicy: "compact" /* COMPACT */,
|
|
132
|
+
segmentMs: 6048e5,
|
|
133
|
+
// 7 days
|
|
134
|
+
minCompactionLagMs: 36e5,
|
|
135
|
+
// 1 hour delay
|
|
136
|
+
deleteRetentionMs: 864e5
|
|
137
|
+
// 24 hours
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
"kv-store": {
|
|
141
|
+
strategy: "compact" /* COMPACT */,
|
|
142
|
+
reasoning: "Key-value store topics need latest value per key (compacted log).",
|
|
143
|
+
exampleConfig: {
|
|
144
|
+
cleanupPolicy: "compact" /* COMPACT */,
|
|
145
|
+
segmentBytes: 1073741824,
|
|
146
|
+
// 1GB
|
|
147
|
+
minCleanableRatio: 0.5
|
|
148
|
+
// Compact when 50% dirty
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"user-profile": {
|
|
152
|
+
strategy: "compact,delete" /* COMPACT_DELETE */,
|
|
153
|
+
reasoning: "User profiles need latest state (compact) + eventual deletion (time-based).",
|
|
154
|
+
exampleConfig: {
|
|
155
|
+
cleanupPolicy: "compact,delete" /* COMPACT_DELETE */,
|
|
156
|
+
segmentMs: 2592e6,
|
|
157
|
+
// 30 days
|
|
158
|
+
minCompactionLagMs: 864e5,
|
|
159
|
+
// 1 day delay
|
|
160
|
+
deleteRetentionMs: 6048e5
|
|
161
|
+
// 7 days tombstone retention
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
"analytics": {
|
|
165
|
+
strategy: "delete" /* DELETE */,
|
|
166
|
+
reasoning: "Analytics data is time-series. Retention based on analysis window.",
|
|
167
|
+
exampleConfig: {
|
|
168
|
+
cleanupPolicy: "delete" /* DELETE */,
|
|
169
|
+
segmentMs: 36e5
|
|
170
|
+
// 1 hour segments
|
|
171
|
+
// retention.ms = 90 days typical
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const match = strategies[useCase.toLowerCase()];
|
|
176
|
+
if (!match) {
|
|
177
|
+
throw new Error(`Unknown use case: ${useCase}. Valid options: ${Object.keys(strategies).join(", ")}`);
|
|
178
|
+
}
|
|
179
|
+
return match;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Estimate compaction savings
|
|
183
|
+
*/
|
|
184
|
+
static estimateCompactionSavings(recordsPerDay, uniqueKeys, retentionDays) {
|
|
185
|
+
const uncompactedRecords = recordsPerDay * retentionDays;
|
|
186
|
+
const compactedRecords = uniqueKeys;
|
|
187
|
+
const savingsPercent = (uncompactedRecords - compactedRecords) / uncompactedRecords * 100;
|
|
188
|
+
return {
|
|
189
|
+
uncompactedRecords,
|
|
190
|
+
compactedRecords,
|
|
191
|
+
savingsPercent: Math.round(savingsPercent * 10) / 10
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
var tiered_storage_compaction_default = {
|
|
196
|
+
TieredStorageManager,
|
|
197
|
+
LogCompactionManager,
|
|
198
|
+
CompactionStrategy
|
|
199
|
+
};
|
|
200
|
+
export {
|
|
201
|
+
CompactionStrategy,
|
|
202
|
+
LogCompactionManager,
|
|
203
|
+
TieredStorageManager,
|
|
204
|
+
tiered_storage_compaction_default as default
|
|
205
|
+
};
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiered Storage and Log Compaction Strategies
|
|
3
|
+
*
|
|
4
|
+
* Kafka Tiered Storage (KIP-405), log compaction patterns, and retention policies
|
|
5
|
+
*
|
|
6
|
+
* @module tiered-storage-compaction
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Tiered Storage Configuration (Kafka 3.6+)
|
|
11
|
+
*/
|
|
12
|
+
export interface TieredStorageConfig {
|
|
13
|
+
/** Enable tiered storage */
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
/** Remote storage system */
|
|
16
|
+
remoteStorageSystem: 'S3' | 'Azure Blob' | 'Google Cloud Storage' | 'MinIO';
|
|
17
|
+
/** Remote storage path/bucket */
|
|
18
|
+
remoteStoragePath: string;
|
|
19
|
+
/** Local retention (hot tier) */
|
|
20
|
+
localRetentionMs: number;
|
|
21
|
+
/** Remote retention (cold tier) */
|
|
22
|
+
remoteRetentionMs: number;
|
|
23
|
+
/** Segment upload interval */
|
|
24
|
+
uploadIntervalMs?: number;
|
|
25
|
+
/** Compression codec */
|
|
26
|
+
compressionType?: 'none' | 'gzip' | 'snappy' | 'lz4' | 'zstd';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Log Compaction Strategy
|
|
31
|
+
*/
|
|
32
|
+
export enum CompactionStrategy {
|
|
33
|
+
/** Delete old records (time-based retention) */
|
|
34
|
+
DELETE = 'delete',
|
|
35
|
+
/** Compact: Keep latest value per key */
|
|
36
|
+
COMPACT = 'compact',
|
|
37
|
+
/** Compact + Delete: Compact AND time-based deletion */
|
|
38
|
+
COMPACT_DELETE = 'compact,delete',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Compaction Configuration
|
|
43
|
+
*/
|
|
44
|
+
export interface CompactionConfig {
|
|
45
|
+
/** Cleanup policy */
|
|
46
|
+
cleanupPolicy: CompactionStrategy;
|
|
47
|
+
/** Segment size before compaction (bytes) */
|
|
48
|
+
segmentBytes?: number;
|
|
49
|
+
/** Segment time before compaction (ms) */
|
|
50
|
+
segmentMs?: number;
|
|
51
|
+
/** Min compaction lag (ms) - delay before compaction */
|
|
52
|
+
minCompactionLagMs?: number;
|
|
53
|
+
/** Max compaction lag (ms) - force compaction */
|
|
54
|
+
maxCompactionLagMs?: number;
|
|
55
|
+
/** Delete retention (tombstone retention) */
|
|
56
|
+
deleteRetentionMs?: number;
|
|
57
|
+
/** Min cleanable dirty ratio */
|
|
58
|
+
minCleanableRatio?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Tiered Storage Manager
|
|
63
|
+
*
|
|
64
|
+
* Manages Kafka tiered storage configuration
|
|
65
|
+
*/
|
|
66
|
+
export class TieredStorageManager {
|
|
67
|
+
/**
|
|
68
|
+
* Generate tiered storage broker configuration
|
|
69
|
+
*/
|
|
70
|
+
static generateBrokerConfig(config: TieredStorageConfig): Record<string, any> {
|
|
71
|
+
const brokerConfig: Record<string, any> = {
|
|
72
|
+
// Enable tiered storage
|
|
73
|
+
'remote.log.storage.system.enable': config.enabled,
|
|
74
|
+
|
|
75
|
+
// Local tier retention (hot data)
|
|
76
|
+
'log.local.retention.ms': config.localRetentionMs,
|
|
77
|
+
'log.local.retention.bytes': -1, // Unlimited by size
|
|
78
|
+
|
|
79
|
+
// Remote storage system
|
|
80
|
+
'remote.log.storage.manager.class.name': this.getRemoteStorageManagerClass(
|
|
81
|
+
config.remoteStorageSystem
|
|
82
|
+
),
|
|
83
|
+
|
|
84
|
+
// S3-specific configuration (if S3)
|
|
85
|
+
...(config.remoteStorageSystem === 'S3' && {
|
|
86
|
+
'rsm.config.remote.log.storage.s3.bucket.name': config.remoteStoragePath,
|
|
87
|
+
'rsm.config.remote.log.storage.s3.region': 'us-east-1',
|
|
88
|
+
}),
|
|
89
|
+
|
|
90
|
+
// Upload configuration
|
|
91
|
+
'remote.log.manager.task.interval.ms': config.uploadIntervalMs || 60000,
|
|
92
|
+
|
|
93
|
+
// Compression
|
|
94
|
+
'remote.log.storage.manager.class.path': '/usr/share/kafka/plugins/tiered-storage',
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
if (config.compressionType && config.compressionType !== 'none') {
|
|
98
|
+
brokerConfig['compression.type'] = config.compressionType;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return brokerConfig;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Generate tiered storage topic configuration
|
|
106
|
+
*/
|
|
107
|
+
static generateTopicConfig(config: TieredStorageConfig): Record<string, string> {
|
|
108
|
+
return {
|
|
109
|
+
// Enable tiered storage for this topic
|
|
110
|
+
'remote.storage.enable': config.enabled ? 'true' : 'false',
|
|
111
|
+
|
|
112
|
+
// Local retention (hot tier)
|
|
113
|
+
'local.retention.ms': config.localRetentionMs.toString(),
|
|
114
|
+
'local.retention.bytes': '-1', // Unlimited
|
|
115
|
+
|
|
116
|
+
// Total retention (hot + cold tier)
|
|
117
|
+
'retention.ms': config.remoteRetentionMs.toString(),
|
|
118
|
+
|
|
119
|
+
// Segment configuration
|
|
120
|
+
'segment.bytes': '1073741824', // 1GB segments
|
|
121
|
+
'segment.ms': '604800000', // 7 days
|
|
122
|
+
|
|
123
|
+
// Note: Remote data deleted when retention.ms expires
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Calculate storage savings
|
|
129
|
+
*/
|
|
130
|
+
static calculateStorageSavings(
|
|
131
|
+
totalDataGB: number,
|
|
132
|
+
localRetentionDays: number,
|
|
133
|
+
totalRetentionDays: number,
|
|
134
|
+
replicationFactor: number
|
|
135
|
+
): {
|
|
136
|
+
localStorageGB: number;
|
|
137
|
+
remoteStorageGB: number;
|
|
138
|
+
totalStorageGB: number;
|
|
139
|
+
savingsPercent: number;
|
|
140
|
+
} {
|
|
141
|
+
// Assume uniform write rate
|
|
142
|
+
const dailyDataGB = totalDataGB / totalRetentionDays;
|
|
143
|
+
|
|
144
|
+
// Local storage (hot tier): recent data + replication
|
|
145
|
+
const localStorageGB = dailyDataGB * localRetentionDays * replicationFactor;
|
|
146
|
+
|
|
147
|
+
// Remote storage (cold tier): archived data (single copy)
|
|
148
|
+
const remoteStorageGB = dailyDataGB * (totalRetentionDays - localRetentionDays);
|
|
149
|
+
|
|
150
|
+
// Without tiered storage: all data replicated locally
|
|
151
|
+
const nonTieredStorageGB = totalDataGB * replicationFactor;
|
|
152
|
+
|
|
153
|
+
const totalStorageGB = localStorageGB + remoteStorageGB;
|
|
154
|
+
const savingsPercent = ((nonTieredStorageGB - totalStorageGB) / nonTieredStorageGB) * 100;
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
localStorageGB: Math.round(localStorageGB * 10) / 10,
|
|
158
|
+
remoteStorageGB: Math.round(remoteStorageGB * 10) / 10,
|
|
159
|
+
totalStorageGB: Math.round(totalStorageGB * 10) / 10,
|
|
160
|
+
savingsPercent: Math.round(savingsPercent * 10) / 10,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private static getRemoteStorageManagerClass(system: TieredStorageConfig['remoteStorageSystem']): string {
|
|
165
|
+
const classMap = {
|
|
166
|
+
'S3': 'org.apache.kafka.server.log.remote.storage.RemoteLogStorageManager',
|
|
167
|
+
'Azure Blob': 'org.apache.kafka.server.log.remote.storage.AzureBlobRemoteStorageManager',
|
|
168
|
+
'Google Cloud Storage': 'org.apache.kafka.server.log.remote.storage.GCSRemoteStorageManager',
|
|
169
|
+
'MinIO': 'org.apache.kafka.server.log.remote.storage.MinIORemoteStorageManager',
|
|
170
|
+
};
|
|
171
|
+
return classMap[system];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Log Compaction Manager
|
|
177
|
+
*
|
|
178
|
+
* Manages log compaction strategies and configuration
|
|
179
|
+
*/
|
|
180
|
+
export class LogCompactionManager {
|
|
181
|
+
/**
|
|
182
|
+
* Generate compaction topic configuration
|
|
183
|
+
*/
|
|
184
|
+
static generateCompactionConfig(config: CompactionConfig): Record<string, string> {
|
|
185
|
+
const topicConfig: Record<string, string> = {
|
|
186
|
+
// Cleanup policy
|
|
187
|
+
'cleanup.policy': config.cleanupPolicy,
|
|
188
|
+
|
|
189
|
+
// Segment configuration
|
|
190
|
+
'segment.bytes': (config.segmentBytes || 1073741824).toString(), // 1GB default
|
|
191
|
+
'segment.ms': (config.segmentMs || 604800000).toString(), // 7 days default
|
|
192
|
+
|
|
193
|
+
// Compaction lag
|
|
194
|
+
'min.compaction.lag.ms': (config.minCompactionLagMs || 0).toString(),
|
|
195
|
+
'max.compaction.lag.ms': (config.maxCompactionLagMs || 9223372036854775807).toString(), // Max long
|
|
196
|
+
|
|
197
|
+
// Delete retention (tombstone retention)
|
|
198
|
+
'delete.retention.ms': (config.deleteRetentionMs || 86400000).toString(), // 24 hours default
|
|
199
|
+
|
|
200
|
+
// Min cleanable ratio (% of log that must be dirty)
|
|
201
|
+
'min.cleanable.dirty.ratio': (config.minCleanableRatio || 0.5).toString(), // 50% default
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
return topicConfig;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Choose compaction strategy based on use case
|
|
209
|
+
*/
|
|
210
|
+
static chooseStrategy(useCase: string): {
|
|
211
|
+
strategy: CompactionStrategy;
|
|
212
|
+
reasoning: string;
|
|
213
|
+
exampleConfig: CompactionConfig;
|
|
214
|
+
} {
|
|
215
|
+
const strategies = {
|
|
216
|
+
'event-log': {
|
|
217
|
+
strategy: CompactionStrategy.DELETE,
|
|
218
|
+
reasoning: 'Event logs are immutable and time-based. Keep all events for retention period.',
|
|
219
|
+
exampleConfig: {
|
|
220
|
+
cleanupPolicy: CompactionStrategy.DELETE,
|
|
221
|
+
segmentMs: 86400000, // 1 day segments
|
|
222
|
+
// retention.ms set separately (e.g., 30 days)
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
'changelog': {
|
|
226
|
+
strategy: CompactionStrategy.COMPACT,
|
|
227
|
+
reasoning: 'Changelog topics should keep latest state per key. Compaction removes old values.',
|
|
228
|
+
exampleConfig: {
|
|
229
|
+
cleanupPolicy: CompactionStrategy.COMPACT,
|
|
230
|
+
segmentMs: 604800000, // 7 days
|
|
231
|
+
minCompactionLagMs: 3600000, // 1 hour delay
|
|
232
|
+
deleteRetentionMs: 86400000, // 24 hours
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
'kv-store': {
|
|
236
|
+
strategy: CompactionStrategy.COMPACT,
|
|
237
|
+
reasoning: 'Key-value store topics need latest value per key (compacted log).',
|
|
238
|
+
exampleConfig: {
|
|
239
|
+
cleanupPolicy: CompactionStrategy.COMPACT,
|
|
240
|
+
segmentBytes: 1073741824, // 1GB
|
|
241
|
+
minCleanableRatio: 0.5, // Compact when 50% dirty
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
'user-profile': {
|
|
245
|
+
strategy: CompactionStrategy.COMPACT_DELETE,
|
|
246
|
+
reasoning: 'User profiles need latest state (compact) + eventual deletion (time-based).',
|
|
247
|
+
exampleConfig: {
|
|
248
|
+
cleanupPolicy: CompactionStrategy.COMPACT_DELETE,
|
|
249
|
+
segmentMs: 2592000000, // 30 days
|
|
250
|
+
minCompactionLagMs: 86400000, // 1 day delay
|
|
251
|
+
deleteRetentionMs: 604800000, // 7 days tombstone retention
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
'analytics': {
|
|
255
|
+
strategy: CompactionStrategy.DELETE,
|
|
256
|
+
reasoning: 'Analytics data is time-series. Retention based on analysis window.',
|
|
257
|
+
exampleConfig: {
|
|
258
|
+
cleanupPolicy: CompactionStrategy.DELETE,
|
|
259
|
+
segmentMs: 3600000, // 1 hour segments
|
|
260
|
+
// retention.ms = 90 days typical
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
const match = strategies[useCase.toLowerCase()];
|
|
266
|
+
if (!match) {
|
|
267
|
+
throw new Error(`Unknown use case: ${useCase}. Valid options: ${Object.keys(strategies).join(', ')}`);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return match;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Estimate compaction savings
|
|
275
|
+
*/
|
|
276
|
+
static estimateCompactionSavings(
|
|
277
|
+
recordsPerDay: number,
|
|
278
|
+
uniqueKeys: number,
|
|
279
|
+
retentionDays: number
|
|
280
|
+
): {
|
|
281
|
+
uncompactedRecords: number;
|
|
282
|
+
compactedRecords: number;
|
|
283
|
+
savingsPercent: number;
|
|
284
|
+
} {
|
|
285
|
+
// Without compaction: all records retained
|
|
286
|
+
const uncompactedRecords = recordsPerDay * retentionDays;
|
|
287
|
+
|
|
288
|
+
// With compaction: only latest value per key
|
|
289
|
+
const compactedRecords = uniqueKeys;
|
|
290
|
+
|
|
291
|
+
const savingsPercent = ((uncompactedRecords - compactedRecords) / uncompactedRecords) * 100;
|
|
292
|
+
|
|
293
|
+
return {
|
|
294
|
+
uncompactedRecords,
|
|
295
|
+
compactedRecords,
|
|
296
|
+
savingsPercent: Math.round(savingsPercent * 10) / 10,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Example Usage: Tiered Storage
|
|
303
|
+
*
|
|
304
|
+
* ```typescript
|
|
305
|
+
* const tieredConfig: TieredStorageConfig = {
|
|
306
|
+
* enabled: true,
|
|
307
|
+
* remoteStorageSystem: 'S3',
|
|
308
|
+
* remoteStoragePath: 'my-kafka-bucket',
|
|
309
|
+
* localRetentionMs: 7 * 24 * 60 * 60 * 1000, // 7 days hot (local)
|
|
310
|
+
* remoteRetentionMs: 365 * 24 * 60 * 60 * 1000, // 1 year total (hot + cold)
|
|
311
|
+
* compressionType: 'zstd',
|
|
312
|
+
* };
|
|
313
|
+
*
|
|
314
|
+
* const brokerConfig = TieredStorageManager.generateBrokerConfig(tieredConfig);
|
|
315
|
+
* const topicConfig = TieredStorageManager.generateTopicConfig(tieredConfig);
|
|
316
|
+
*
|
|
317
|
+
* // Calculate savings
|
|
318
|
+
* const savings = TieredStorageManager.calculateStorageSavings(
|
|
319
|
+
* 10000, // 10TB total data
|
|
320
|
+
* 7, // 7 days local retention
|
|
321
|
+
* 365, // 365 days total retention
|
|
322
|
+
* 3 // Replication factor 3
|
|
323
|
+
* );
|
|
324
|
+
* console.log(`Storage savings: ${savings.savingsPercent}%`);
|
|
325
|
+
* // Typical result: 85-90% storage cost reduction!
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Example Usage: Log Compaction
|
|
331
|
+
*
|
|
332
|
+
* ```typescript
|
|
333
|
+
* // Choose strategy based on use case
|
|
334
|
+
* const { strategy, exampleConfig } = LogCompactionManager.chooseStrategy('changelog');
|
|
335
|
+
*
|
|
336
|
+
* const compactionConfig = LogCompactionManager.generateCompactionConfig(exampleConfig);
|
|
337
|
+
*
|
|
338
|
+
* // Apply to topic
|
|
339
|
+
* // kafka-topics.sh --alter --topic user-profiles --config cleanup.policy=compact
|
|
340
|
+
*
|
|
341
|
+
* // Estimate savings
|
|
342
|
+
* const savings = LogCompactionManager.estimateCompactionSavings(
|
|
343
|
+
* 10000000, // 10M records/day
|
|
344
|
+
* 1000000, // 1M unique keys
|
|
345
|
+
* 30 // 30 days retention
|
|
346
|
+
* );
|
|
347
|
+
* console.log(`Compaction savings: ${savings.savingsPercent}%`);
|
|
348
|
+
* // Result: 99.7% space savings!
|
|
349
|
+
* ```
|
|
350
|
+
*/
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Tiered Storage & Compaction Best Practices:
|
|
354
|
+
*
|
|
355
|
+
* **Tiered Storage Benefits**:
|
|
356
|
+
* - 80-90% storage cost reduction
|
|
357
|
+
* - Longer retention (years instead of weeks)
|
|
358
|
+
* - Single-copy remote storage (vs replicated local)
|
|
359
|
+
* - Automatic lifecycle management
|
|
360
|
+
*
|
|
361
|
+
* **When to Use Tiered Storage**:
|
|
362
|
+
* - Long retention requirements (> 30 days)
|
|
363
|
+
* - High data volume (> 1TB/day)
|
|
364
|
+
* - Compliance/audit requirements
|
|
365
|
+
* - Cost-sensitive workloads
|
|
366
|
+
*
|
|
367
|
+
* **Tiered Storage Configuration**:
|
|
368
|
+
* - Local retention: 7-30 days (hot data, low latency)
|
|
369
|
+
* - Remote retention: 90-365 days (cold data, higher latency)
|
|
370
|
+
* - Segment size: 1GB (balance between overhead and flexibility)
|
|
371
|
+
* - Upload interval: 60 seconds (balance between lag and efficiency)
|
|
372
|
+
*
|
|
373
|
+
* **Log Compaction Use Cases**:
|
|
374
|
+
* - DELETE: Event logs, analytics, time-series data
|
|
375
|
+
* - COMPACT: Changelogs, key-value stores, state snapshots
|
|
376
|
+
* - COMPACT+DELETE: User profiles, entity updates with TTL
|
|
377
|
+
*
|
|
378
|
+
* **Compaction Configuration**:
|
|
379
|
+
* - min.compaction.lag.ms: 1 hour (allow consumers to catch up)
|
|
380
|
+
* - max.compaction.lag.ms: 7 days (force compaction)
|
|
381
|
+
* - delete.retention.ms: 24 hours (tombstone retention)
|
|
382
|
+
* - min.cleanable.dirty.ratio: 0.5 (compact when 50% dirty)
|
|
383
|
+
*
|
|
384
|
+
* **Tombstone (null value) Handling**:
|
|
385
|
+
* - Compact + Delete: Tombstones deleted after delete.retention.ms
|
|
386
|
+
* - Allows consumers to see deletion events
|
|
387
|
+
* - Typical retention: 24 hours (balance between visibility and storage)
|
|
388
|
+
*
|
|
389
|
+
* **Monitoring**:
|
|
390
|
+
* - Tiered storage: Upload lag, remote storage size, read latency
|
|
391
|
+
* - Compaction: Compaction rate, cleaner IO, dirty log ratio
|
|
392
|
+
* - Alerts: High compaction lag, failed uploads, remote storage quota
|
|
393
|
+
*/
|
|
394
|
+
|
|
395
|
+
export default {
|
|
396
|
+
TieredStorageManager,
|
|
397
|
+
LogCompactionManager,
|
|
398
|
+
CompactionStrategy,
|
|
399
|
+
};
|