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,469 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kafka Capacity Planning and Sizing
|
|
3
|
+
*
|
|
4
|
+
* Intelligent calculators for broker count, partition optimization, and storage estimation
|
|
5
|
+
*
|
|
6
|
+
* @module capacity-planner
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Throughput Requirements
|
|
11
|
+
*/
|
|
12
|
+
export interface ThroughputRequirements {
|
|
13
|
+
/** Peak producer throughput in MB/sec */
|
|
14
|
+
producerThroughputMBps: number;
|
|
15
|
+
/** Peak consumer throughput in MB/sec */
|
|
16
|
+
consumerThroughputMBps: number;
|
|
17
|
+
/** Average message size in bytes */
|
|
18
|
+
avgMessageSizeBytes: number;
|
|
19
|
+
/** Peak messages per second */
|
|
20
|
+
peakMessagesPerSec?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Storage Requirements
|
|
25
|
+
*/
|
|
26
|
+
export interface StorageRequirements {
|
|
27
|
+
/** Retention period in hours */
|
|
28
|
+
retentionHours: number;
|
|
29
|
+
/** Replication factor (default: 3) */
|
|
30
|
+
replicationFactor: number;
|
|
31
|
+
/** Compression ratio (default: 0.3 for 70% compression) */
|
|
32
|
+
compressionRatio?: number;
|
|
33
|
+
/** Growth buffer multiplier (default: 1.5 for 50% buffer) */
|
|
34
|
+
growthBuffer?: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Cluster Constraints
|
|
39
|
+
*/
|
|
40
|
+
export interface ClusterConstraints {
|
|
41
|
+
/** Max partitions per broker (default: 4000) */
|
|
42
|
+
maxPartitionsPerBroker?: number;
|
|
43
|
+
/** Max disk utilization % (default: 70) */
|
|
44
|
+
maxDiskUtilization?: number;
|
|
45
|
+
/** Network bandwidth per broker in MB/s (default: 125 = 1Gbps) */
|
|
46
|
+
networkBandwidthMBps?: number;
|
|
47
|
+
/** CPU cores per broker (default: 8) */
|
|
48
|
+
cpuCoresPerBroker?: number;
|
|
49
|
+
/** RAM per broker in GB (default: 32) */
|
|
50
|
+
ramPerBrokerGB?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Sizing Result
|
|
55
|
+
*/
|
|
56
|
+
export interface SizingResult {
|
|
57
|
+
/** Recommended broker count */
|
|
58
|
+
brokerCount: number;
|
|
59
|
+
/** Recommended partition count */
|
|
60
|
+
partitionCount: number;
|
|
61
|
+
/** Storage per broker in GB */
|
|
62
|
+
storagePerBrokerGB: number;
|
|
63
|
+
/** Total cluster storage in GB */
|
|
64
|
+
totalStorageGB: number;
|
|
65
|
+
/** Actual throughput headroom % */
|
|
66
|
+
throughputHeadroom: number;
|
|
67
|
+
/** Resource utilization breakdown */
|
|
68
|
+
utilization: {
|
|
69
|
+
cpu: number;
|
|
70
|
+
memory: number;
|
|
71
|
+
disk: number;
|
|
72
|
+
network: number;
|
|
73
|
+
partitions: number;
|
|
74
|
+
};
|
|
75
|
+
/** Warnings and recommendations */
|
|
76
|
+
warnings: string[];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Partition Sizing Recommendation
|
|
81
|
+
*/
|
|
82
|
+
export interface PartitionSizingResult {
|
|
83
|
+
/** Recommended partition count */
|
|
84
|
+
partitionCount: number;
|
|
85
|
+
/** Max throughput per partition in MB/s */
|
|
86
|
+
maxThroughputPerPartition: number;
|
|
87
|
+
/** Consumer parallelism level */
|
|
88
|
+
consumerParallelism: number;
|
|
89
|
+
/** Partition size in GB */
|
|
90
|
+
partitionSizeGB: number;
|
|
91
|
+
/** Reasoning */
|
|
92
|
+
reasoning: string[];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Capacity Planner
|
|
97
|
+
*
|
|
98
|
+
* Intelligent sizing calculator for Kafka clusters
|
|
99
|
+
*/
|
|
100
|
+
export class KafkaCapacityPlanner {
|
|
101
|
+
private constraints: Required<ClusterConstraints>;
|
|
102
|
+
|
|
103
|
+
constructor(constraints: ClusterConstraints = {}) {
|
|
104
|
+
this.constraints = {
|
|
105
|
+
maxPartitionsPerBroker: constraints.maxPartitionsPerBroker || 4000,
|
|
106
|
+
maxDiskUtilization: constraints.maxDiskUtilization || 70,
|
|
107
|
+
networkBandwidthMBps: constraints.networkBandwidthMBps || 125, // 1Gbps
|
|
108
|
+
cpuCoresPerBroker: constraints.cpuCoresPerBroker || 8,
|
|
109
|
+
ramPerBrokerGB: constraints.ramPerBrokerGB || 32,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Calculate optimal cluster sizing
|
|
115
|
+
*/
|
|
116
|
+
calculateClusterSize(
|
|
117
|
+
throughput: ThroughputRequirements,
|
|
118
|
+
storage: StorageRequirements,
|
|
119
|
+
topicCount: number = 1
|
|
120
|
+
): SizingResult {
|
|
121
|
+
// Calculate partition count first
|
|
122
|
+
const partitioning = this.calculatePartitionCount(throughput);
|
|
123
|
+
|
|
124
|
+
// Calculate storage requirements
|
|
125
|
+
const storageCalc = this.calculateStorageRequirements(
|
|
126
|
+
throughput,
|
|
127
|
+
storage,
|
|
128
|
+
partitioning.partitionCount
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
// Calculate broker count based on multiple constraints
|
|
132
|
+
const brokerCountOptions = {
|
|
133
|
+
throughput: this.calculateBrokersForThroughput(throughput),
|
|
134
|
+
storage: this.calculateBrokersForStorage(storageCalc.totalStorageGB),
|
|
135
|
+
partitions: this.calculateBrokersForPartitions(partitioning.partitionCount),
|
|
136
|
+
network: this.calculateBrokersForNetwork(throughput),
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// Take the maximum to satisfy all constraints
|
|
140
|
+
const brokerCount = Math.max(
|
|
141
|
+
brokerCountOptions.throughput,
|
|
142
|
+
brokerCountOptions.storage,
|
|
143
|
+
brokerCountOptions.partitions,
|
|
144
|
+
brokerCountOptions.network,
|
|
145
|
+
3 // Minimum for production (quorum)
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
// Calculate utilization
|
|
149
|
+
const utilization = this.calculateUtilization(
|
|
150
|
+
brokerCount,
|
|
151
|
+
partitioning.partitionCount,
|
|
152
|
+
throughput,
|
|
153
|
+
storageCalc.totalStorageGB
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Generate warnings
|
|
157
|
+
const warnings: string[] = [];
|
|
158
|
+
if (utilization.cpu > 80) {
|
|
159
|
+
warnings.push(`High CPU utilization (${utilization.cpu.toFixed(1)}%) - consider more brokers`);
|
|
160
|
+
}
|
|
161
|
+
if (utilization.disk > this.constraints.maxDiskUtilization) {
|
|
162
|
+
warnings.push(`Disk utilization (${utilization.disk.toFixed(1)}%) exceeds ${this.constraints.maxDiskUtilization}% threshold`);
|
|
163
|
+
}
|
|
164
|
+
if (utilization.network > 70) {
|
|
165
|
+
warnings.push(`Network utilization (${utilization.network.toFixed(1)}%) is high - risk of bottleneck`);
|
|
166
|
+
}
|
|
167
|
+
if (utilization.partitions > 80) {
|
|
168
|
+
warnings.push(`Partition count (${partitioning.partitionCount}) is ${utilization.partitions.toFixed(1)}% of broker capacity`);
|
|
169
|
+
}
|
|
170
|
+
if (brokerCount < 3) {
|
|
171
|
+
warnings.push('Less than 3 brokers - not suitable for production (no fault tolerance)');
|
|
172
|
+
}
|
|
173
|
+
if (partitioning.partitionCount < brokerCount) {
|
|
174
|
+
warnings.push(`Partition count (${partitioning.partitionCount}) < broker count (${brokerCount}) - underutilized`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
brokerCount,
|
|
179
|
+
partitionCount: partitioning.partitionCount,
|
|
180
|
+
storagePerBrokerGB: storageCalc.totalStorageGB / brokerCount,
|
|
181
|
+
totalStorageGB: storageCalc.totalStorageGB,
|
|
182
|
+
throughputHeadroom: this.calculateThroughputHeadroom(brokerCount, throughput),
|
|
183
|
+
utilization,
|
|
184
|
+
warnings,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Calculate optimal partition count
|
|
190
|
+
*/
|
|
191
|
+
calculatePartitionCount(throughput: ThroughputRequirements): PartitionSizingResult {
|
|
192
|
+
const reasoning: string[] = [];
|
|
193
|
+
|
|
194
|
+
// Rule 1: Throughput-based sizing
|
|
195
|
+
// Kafka can handle ~50 MB/s per partition (producer side)
|
|
196
|
+
const maxThroughputPerPartition = 50; // MB/s
|
|
197
|
+
const partitionsForProducerThroughput = Math.ceil(
|
|
198
|
+
throughput.producerThroughputMBps / maxThroughputPerPartition
|
|
199
|
+
);
|
|
200
|
+
reasoning.push(
|
|
201
|
+
`Producer throughput: ${throughput.producerThroughputMBps} MB/s ÷ ${maxThroughputPerPartition} MB/s/partition = ${partitionsForProducerThroughput} partitions`
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
// Rule 2: Consumer parallelism
|
|
205
|
+
// Each consumer in a group processes one partition
|
|
206
|
+
const partitionsForConsumerThroughput = Math.ceil(
|
|
207
|
+
throughput.consumerThroughputMBps / maxThroughputPerPartition
|
|
208
|
+
);
|
|
209
|
+
reasoning.push(
|
|
210
|
+
`Consumer throughput: ${throughput.consumerThroughputMBps} MB/s ÷ ${maxThroughputPerPartition} MB/s/partition = ${partitionsForConsumerThroughput} partitions`
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
// Rule 3: Target partition size (max 10GB per partition for fast recovery)
|
|
214
|
+
const targetPartitionSizeGB = 10;
|
|
215
|
+
|
|
216
|
+
// Take the maximum
|
|
217
|
+
const minPartitions = Math.max(
|
|
218
|
+
partitionsForProducerThroughput,
|
|
219
|
+
partitionsForConsumerThroughput,
|
|
220
|
+
1 // At least 1 partition
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
// Round up to next power of 2 for better distribution
|
|
224
|
+
const partitionCount = this.nextPowerOfTwo(minPartitions);
|
|
225
|
+
reasoning.push(`Rounded to power of 2: ${partitionCount} partitions (for even distribution)`);
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
partitionCount,
|
|
229
|
+
maxThroughputPerPartition,
|
|
230
|
+
consumerParallelism: partitionCount,
|
|
231
|
+
partitionSizeGB: targetPartitionSizeGB,
|
|
232
|
+
reasoning,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Calculate storage requirements
|
|
238
|
+
*/
|
|
239
|
+
calculateStorageRequirements(
|
|
240
|
+
throughput: ThroughputRequirements,
|
|
241
|
+
storage: StorageRequirements,
|
|
242
|
+
partitionCount: number
|
|
243
|
+
): {
|
|
244
|
+
totalStorageGB: number;
|
|
245
|
+
storagePerPartitionGB: number;
|
|
246
|
+
rawStorageGB: number;
|
|
247
|
+
compressedStorageGB: number;
|
|
248
|
+
} {
|
|
249
|
+
const compressionRatio = storage.compressionRatio || 0.3; // 70% compression
|
|
250
|
+
const growthBuffer = storage.growthBuffer || 1.5; // 50% growth buffer
|
|
251
|
+
|
|
252
|
+
// Calculate data rate
|
|
253
|
+
const dataRateMBps = throughput.producerThroughputMBps;
|
|
254
|
+
const dataRateGBperHour = dataRateMBps * 3.6; // MB/s * 3600s/h / 1024 MB/GB ≈ 3.6
|
|
255
|
+
|
|
256
|
+
// Raw storage (uncompressed, unreplicated)
|
|
257
|
+
const rawStorageGB = dataRateGBperHour * storage.retentionHours;
|
|
258
|
+
|
|
259
|
+
// Apply compression
|
|
260
|
+
const compressedStorageGB = rawStorageGB * compressionRatio;
|
|
261
|
+
|
|
262
|
+
// Apply replication
|
|
263
|
+
const replicatedStorageGB = compressedStorageGB * storage.replicationFactor;
|
|
264
|
+
|
|
265
|
+
// Apply growth buffer
|
|
266
|
+
const totalStorageGB = replicatedStorageGB * growthBuffer;
|
|
267
|
+
|
|
268
|
+
// Per partition
|
|
269
|
+
const storagePerPartitionGB = totalStorageGB / partitionCount;
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
totalStorageGB,
|
|
273
|
+
storagePerPartitionGB,
|
|
274
|
+
rawStorageGB,
|
|
275
|
+
compressedStorageGB,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Calculate brokers needed for throughput
|
|
281
|
+
*/
|
|
282
|
+
private calculateBrokersForThroughput(throughput: ThroughputRequirements): number {
|
|
283
|
+
// Each broker can handle ~200 MB/s total (100 MB/s in + 100 MB/s out)
|
|
284
|
+
const maxBrokerThroughputMBps = 100;
|
|
285
|
+
const totalThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
|
|
286
|
+
return Math.ceil(totalThroughput / maxBrokerThroughputMBps);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Calculate brokers needed for storage
|
|
291
|
+
*/
|
|
292
|
+
private calculateBrokersForStorage(totalStorageGB: number): number {
|
|
293
|
+
// Assume 2TB disks per broker (usable storage after RAID, OS overhead)
|
|
294
|
+
const usableStoragePerBrokerGB = 2000;
|
|
295
|
+
const maxUtilization = this.constraints.maxDiskUtilization / 100;
|
|
296
|
+
const effectiveStoragePerBroker = usableStoragePerBrokerGB * maxUtilization;
|
|
297
|
+
return Math.ceil(totalStorageGB / effectiveStoragePerBroker);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Calculate brokers needed for partition count
|
|
302
|
+
*/
|
|
303
|
+
private calculateBrokersForPartitions(partitionCount: number): number {
|
|
304
|
+
return Math.ceil(partitionCount / this.constraints.maxPartitionsPerBroker);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Calculate brokers needed for network bandwidth
|
|
309
|
+
*/
|
|
310
|
+
private calculateBrokersForNetwork(throughput: ThroughputRequirements): number {
|
|
311
|
+
const totalNetworkMBps = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
|
|
312
|
+
const maxNetworkUtilization = 0.7; // 70% max utilization
|
|
313
|
+
const effectiveBandwidth = this.constraints.networkBandwidthMBps * maxNetworkUtilization;
|
|
314
|
+
return Math.ceil(totalNetworkMBps / effectiveBandwidth);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Calculate resource utilization
|
|
319
|
+
*/
|
|
320
|
+
private calculateUtilization(
|
|
321
|
+
brokerCount: number,
|
|
322
|
+
partitionCount: number,
|
|
323
|
+
throughput: ThroughputRequirements,
|
|
324
|
+
totalStorageGB: number
|
|
325
|
+
): {
|
|
326
|
+
cpu: number;
|
|
327
|
+
memory: number;
|
|
328
|
+
disk: number;
|
|
329
|
+
network: number;
|
|
330
|
+
partitions: number;
|
|
331
|
+
} {
|
|
332
|
+
// CPU: ~5% per 10 MB/s throughput
|
|
333
|
+
const totalThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
|
|
334
|
+
const cpuPerBroker = (totalThroughput / brokerCount / 10) * 5;
|
|
335
|
+
const cpu = Math.min(cpuPerBroker, 100);
|
|
336
|
+
|
|
337
|
+
// Memory: ~2GB base + 1MB per partition
|
|
338
|
+
const memoryPerBroker = (2 + (partitionCount / brokerCount) * 0.001) / this.constraints.ramPerBrokerGB * 100;
|
|
339
|
+
const memory = Math.min(memoryPerBroker, 100);
|
|
340
|
+
|
|
341
|
+
// Disk: actual usage vs capacity
|
|
342
|
+
const storagePerBroker = totalStorageGB / brokerCount;
|
|
343
|
+
const disk = (storagePerBroker / 2000) * 100; // Assuming 2TB disks
|
|
344
|
+
|
|
345
|
+
// Network: actual throughput vs bandwidth
|
|
346
|
+
const networkPerBroker = totalThroughput / brokerCount;
|
|
347
|
+
const network = (networkPerBroker / this.constraints.networkBandwidthMBps) * 100;
|
|
348
|
+
|
|
349
|
+
// Partitions: actual count vs max
|
|
350
|
+
const partitionsPerBroker = partitionCount / brokerCount;
|
|
351
|
+
const partitions = (partitionsPerBroker / this.constraints.maxPartitionsPerBroker) * 100;
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
cpu: Math.round(cpu * 10) / 10,
|
|
355
|
+
memory: Math.round(memory * 10) / 10,
|
|
356
|
+
disk: Math.round(disk * 10) / 10,
|
|
357
|
+
network: Math.round(network * 10) / 10,
|
|
358
|
+
partitions: Math.round(partitions * 10) / 10,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* Calculate throughput headroom
|
|
364
|
+
*/
|
|
365
|
+
private calculateThroughputHeadroom(
|
|
366
|
+
brokerCount: number,
|
|
367
|
+
throughput: ThroughputRequirements
|
|
368
|
+
): number {
|
|
369
|
+
const maxClusterThroughput = brokerCount * 100; // 100 MB/s per broker
|
|
370
|
+
const actualThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
|
|
371
|
+
return Math.round(((maxClusterThroughput - actualThroughput) / maxClusterThroughput) * 100);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Round up to next power of 2
|
|
376
|
+
*/
|
|
377
|
+
private nextPowerOfTwo(n: number): number {
|
|
378
|
+
if (n <= 1) return 1;
|
|
379
|
+
return Math.pow(2, Math.ceil(Math.log2(n)));
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Example Usage: Basic Capacity Planning
|
|
385
|
+
*
|
|
386
|
+
* ```typescript
|
|
387
|
+
* const planner = new KafkaCapacityPlanner();
|
|
388
|
+
*
|
|
389
|
+
* const sizing = planner.calculateClusterSize(
|
|
390
|
+
* {
|
|
391
|
+
* producerThroughputMBps: 100, // 100 MB/s producer throughput
|
|
392
|
+
* consumerThroughputMBps: 200, // 200 MB/s consumer throughput (2x fanout)
|
|
393
|
+
* avgMessageSizeBytes: 1024, // 1KB messages
|
|
394
|
+
* },
|
|
395
|
+
* {
|
|
396
|
+
* retentionHours: 168, // 7 days retention
|
|
397
|
+
* replicationFactor: 3, // Triple replication
|
|
398
|
+
* compressionRatio: 0.3, // 70% compression
|
|
399
|
+
* growthBuffer: 1.5, // 50% growth buffer
|
|
400
|
+
* },
|
|
401
|
+
* 10 // 10 topics
|
|
402
|
+
* );
|
|
403
|
+
*
|
|
404
|
+
* console.log(`Recommended: ${sizing.brokerCount} brokers`);
|
|
405
|
+
* console.log(`Partitions: ${sizing.partitionCount}`);
|
|
406
|
+
* console.log(`Storage per broker: ${sizing.storagePerBrokerGB.toFixed(1)} GB`);
|
|
407
|
+
* console.log(`Throughput headroom: ${sizing.throughputHeadroom}%`);
|
|
408
|
+
*
|
|
409
|
+
* if (sizing.warnings.length > 0) {
|
|
410
|
+
* console.warn('Warnings:', sizing.warnings);
|
|
411
|
+
* }
|
|
412
|
+
* ```
|
|
413
|
+
*/
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Example Usage: Partition Optimization
|
|
417
|
+
*
|
|
418
|
+
* ```typescript
|
|
419
|
+
* const planner = new KafkaCapacityPlanner();
|
|
420
|
+
*
|
|
421
|
+
* const partitioning = planner.calculatePartitionCount({
|
|
422
|
+
* producerThroughputMBps: 500, // 500 MB/s peak
|
|
423
|
+
* consumerThroughputMBps: 500,
|
|
424
|
+
* avgMessageSizeBytes: 2048,
|
|
425
|
+
* });
|
|
426
|
+
*
|
|
427
|
+
* console.log(`Recommended partitions: ${partitioning.partitionCount}`);
|
|
428
|
+
* console.log(`Consumer parallelism: ${partitioning.consumerParallelism}`);
|
|
429
|
+
* console.log('Reasoning:', partitioning.reasoning);
|
|
430
|
+
* ```
|
|
431
|
+
*/
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Capacity Planning Best Practices:
|
|
435
|
+
*
|
|
436
|
+
* **Sizing Guidelines**:
|
|
437
|
+
* - Start with 3 brokers minimum (fault tolerance)
|
|
438
|
+
* - Target 70% resource utilization (headroom for spikes)
|
|
439
|
+
* - Power-of-2 partition counts (even key distribution)
|
|
440
|
+
* - Max 4000 partitions per broker (metadata overhead)
|
|
441
|
+
* - Max 10GB per partition (fast recovery)
|
|
442
|
+
*
|
|
443
|
+
* **Throughput Estimates**:
|
|
444
|
+
* - Producer: ~50 MB/s per partition
|
|
445
|
+
* - Consumer: ~50 MB/s per partition
|
|
446
|
+
* - Broker total: ~100 MB/s (in + out combined)
|
|
447
|
+
*
|
|
448
|
+
* **Storage Estimation**:
|
|
449
|
+
* - Compression: 50-70% (Snappy/LZ4)
|
|
450
|
+
* - Growth buffer: 50% (1.5x multiplier)
|
|
451
|
+
* - Replication: 3x for production
|
|
452
|
+
* - Disk utilization: Max 70%
|
|
453
|
+
*
|
|
454
|
+
* **Scaling Rules**:
|
|
455
|
+
* - Add brokers when CPU > 80%
|
|
456
|
+
* - Add brokers when network > 70%
|
|
457
|
+
* - Add partitions when lag increases
|
|
458
|
+
* - Rebalance when utilization uneven
|
|
459
|
+
*
|
|
460
|
+
* **Common Sizing Patterns**:
|
|
461
|
+
* - **Small** (< 100 MB/s): 3 brokers, 8-16 partitions
|
|
462
|
+
* - **Medium** (100-500 MB/s): 5-10 brokers, 32-64 partitions
|
|
463
|
+
* - **Large** (500-1000 MB/s): 10-20 brokers, 128-256 partitions
|
|
464
|
+
* - **XLarge** (> 1000 MB/s): 20+ brokers, 512+ partitions
|
|
465
|
+
*/
|
|
466
|
+
|
|
467
|
+
export default {
|
|
468
|
+
KafkaCapacityPlanner,
|
|
469
|
+
};
|