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,374 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cluster Sizing Calculator
|
|
3
|
+
*
|
|
4
|
+
* Calculates optimal Kafka cluster size based on workload requirements.
|
|
5
|
+
* Considers throughput, retention, replication, and growth factors.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export interface SizingRequirements {
|
|
9
|
+
// Throughput requirements
|
|
10
|
+
writeThroughputMBps: number;
|
|
11
|
+
readThroughputMBps: number;
|
|
12
|
+
|
|
13
|
+
// Data retention
|
|
14
|
+
retentionDays: number;
|
|
15
|
+
avgMessageSizeKB: number;
|
|
16
|
+
messagesPerDay: number;
|
|
17
|
+
|
|
18
|
+
// Replication & availability
|
|
19
|
+
replicationFactor: number;
|
|
20
|
+
minInsyncReplicas?: number;
|
|
21
|
+
|
|
22
|
+
// Topic configuration
|
|
23
|
+
topicCount: number;
|
|
24
|
+
avgPartitionsPerTopic: number;
|
|
25
|
+
|
|
26
|
+
// Growth & headroom
|
|
27
|
+
growthFactor?: number; // Default: 2.0 (100% growth buffer)
|
|
28
|
+
targetCPUUtilization?: number; // Default: 0.6 (60%)
|
|
29
|
+
targetDiskUtilization?: number; // Default: 0.7 (70%)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ClusterSizingRecommendation {
|
|
33
|
+
// Cluster size
|
|
34
|
+
brokerCount: number;
|
|
35
|
+
totalPartitions: number;
|
|
36
|
+
partitionsPerBroker: number;
|
|
37
|
+
|
|
38
|
+
// Hardware per broker
|
|
39
|
+
cpuCores: number;
|
|
40
|
+
ramGB: number;
|
|
41
|
+
diskGB: number;
|
|
42
|
+
networkGbps: number;
|
|
43
|
+
|
|
44
|
+
// Performance estimates
|
|
45
|
+
estimatedWriteThroughputMBps: number;
|
|
46
|
+
estimatedReadThroughputMBps: number;
|
|
47
|
+
estimatedLatencyP99Ms: number;
|
|
48
|
+
|
|
49
|
+
// Capacity metrics
|
|
50
|
+
dailyDataVolumeMB: number;
|
|
51
|
+
totalStorageRequiredGB: number;
|
|
52
|
+
storageWithReplicationGB: number;
|
|
53
|
+
|
|
54
|
+
// Warnings & recommendations
|
|
55
|
+
warnings: string[];
|
|
56
|
+
recommendations: string[];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class ClusterSizingCalculator {
|
|
60
|
+
// Constants (empirical limits from production deployments)
|
|
61
|
+
private readonly MAX_PARTITIONS_PER_BROKER = 4000;
|
|
62
|
+
private readonly SINGLE_PARTITION_WRITE_MBPS = 20; // Conservative estimate
|
|
63
|
+
private readonly SINGLE_PARTITION_READ_MBPS = 40;
|
|
64
|
+
private readonly NETWORK_OVERHEAD = 1.3; // 30% overhead for protocol, replication
|
|
65
|
+
|
|
66
|
+
private readonly BASE_RAM_GB = 8; // Minimum OS + Kafka overhead
|
|
67
|
+
private readonly RAM_PER_PARTITION_MB = 1; // Page cache per partition
|
|
68
|
+
private readonly RAM_PER_REPLICATION_MB = 2; // Replica fetcher overhead
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Calculate recommended cluster size
|
|
72
|
+
*/
|
|
73
|
+
calculate(req: SizingRequirements): ClusterSizingRecommendation {
|
|
74
|
+
const growthFactor = req.growthFactor ?? 2.0;
|
|
75
|
+
const targetCPU = req.targetCPUUtilization ?? 0.6;
|
|
76
|
+
const targetDisk = req.targetDiskUtilization ?? 0.7;
|
|
77
|
+
|
|
78
|
+
// Apply growth factor to throughput
|
|
79
|
+
const writeThru = req.writeThroughputMBps * growthFactor;
|
|
80
|
+
const readThru = req.readThroughputMBps * growthFactor;
|
|
81
|
+
|
|
82
|
+
// Calculate total partitions needed
|
|
83
|
+
const totalPartitions = req.topicCount * req.avgPartitionsPerTopic;
|
|
84
|
+
|
|
85
|
+
// Calculate brokers needed based on throughput
|
|
86
|
+
const brokersForWrite = Math.ceil(
|
|
87
|
+
(writeThru * this.NETWORK_OVERHEAD) / (this.SINGLE_PARTITION_WRITE_MBPS * this.MAX_PARTITIONS_PER_BROKER / 10)
|
|
88
|
+
);
|
|
89
|
+
const brokersForRead = Math.ceil(
|
|
90
|
+
(readThru * this.NETWORK_OVERHEAD) / (this.SINGLE_PARTITION_READ_MBPS * this.MAX_PARTITIONS_PER_BROKER / 10)
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Calculate brokers needed based on partition count
|
|
94
|
+
const brokersForPartitions = Math.ceil(totalPartitions / this.MAX_PARTITIONS_PER_BROKER);
|
|
95
|
+
|
|
96
|
+
// Take maximum (most constraining factor)
|
|
97
|
+
let brokerCount = Math.max(brokersForWrite, brokersForRead, brokersForPartitions);
|
|
98
|
+
|
|
99
|
+
// Ensure minimum for replication factor
|
|
100
|
+
brokerCount = Math.max(brokerCount, req.replicationFactor);
|
|
101
|
+
|
|
102
|
+
// Ensure broker count allows for rack awareness (multiples of 3)
|
|
103
|
+
if (brokerCount > 3 && brokerCount % 3 !== 0) {
|
|
104
|
+
brokerCount = Math.ceil(brokerCount / 3) * 3;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Calculate partitions per broker
|
|
108
|
+
const partitionsPerBroker = Math.ceil(totalPartitions / brokerCount);
|
|
109
|
+
|
|
110
|
+
// Calculate daily data volume
|
|
111
|
+
const dailyDataVolumeMB = (req.messagesPerDay * req.avgMessageSizeKB) / 1024;
|
|
112
|
+
|
|
113
|
+
// Calculate total storage needed
|
|
114
|
+
const totalStorageGB = (dailyDataVolumeMB * req.retentionDays) / 1024;
|
|
115
|
+
const storageWithReplicationGB = totalStorageGB * req.replicationFactor;
|
|
116
|
+
|
|
117
|
+
// Calculate disk per broker (with headroom)
|
|
118
|
+
const diskPerBrokerGB = Math.ceil(
|
|
119
|
+
(storageWithReplicationGB / brokerCount) / targetDisk
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// Calculate RAM per broker
|
|
123
|
+
const ramForPartitionsGB = (partitionsPerBroker * this.RAM_PER_PARTITION_MB) / 1024;
|
|
124
|
+
const ramForReplicationGB = (partitionsPerBroker * req.replicationFactor * this.RAM_PER_REPLICATION_MB) / 1024;
|
|
125
|
+
const ramGB = Math.ceil(this.BASE_RAM_GB + ramForPartitionsGB + ramForReplicationGB);
|
|
126
|
+
|
|
127
|
+
// Calculate CPU cores (rule: 1 core per 500 partitions + 8 base cores)
|
|
128
|
+
const cpuCores = Math.ceil(partitionsPerBroker / 500) + 8;
|
|
129
|
+
|
|
130
|
+
// Calculate network bandwidth needed
|
|
131
|
+
const networkGbps = this.calculateNetworkBandwidth(writeThru, readThru, brokerCount);
|
|
132
|
+
|
|
133
|
+
// Estimate performance
|
|
134
|
+
const estimatedWriteThroughputMBps = brokerCount * this.SINGLE_PARTITION_WRITE_MBPS * (partitionsPerBroker / 10);
|
|
135
|
+
const estimatedReadThroughputMBps = brokerCount * this.SINGLE_PARTITION_READ_MBPS * (partitionsPerBroker / 10);
|
|
136
|
+
const estimatedLatencyP99Ms = this.estimateLatency(partitionsPerBroker, diskPerBrokerGB);
|
|
137
|
+
|
|
138
|
+
// Generate warnings
|
|
139
|
+
const warnings = this.generateWarnings({
|
|
140
|
+
partitionsPerBroker,
|
|
141
|
+
brokerCount,
|
|
142
|
+
req,
|
|
143
|
+
diskPerBrokerGB
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Generate recommendations
|
|
147
|
+
const recommendations = this.generateRecommendations({
|
|
148
|
+
partitionsPerBroker,
|
|
149
|
+
brokerCount,
|
|
150
|
+
req,
|
|
151
|
+
ramGB,
|
|
152
|
+
diskPerBrokerGB
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
brokerCount,
|
|
157
|
+
totalPartitions,
|
|
158
|
+
partitionsPerBroker,
|
|
159
|
+
cpuCores,
|
|
160
|
+
ramGB,
|
|
161
|
+
diskGB: diskPerBrokerGB,
|
|
162
|
+
networkGbps,
|
|
163
|
+
estimatedWriteThroughputMBps,
|
|
164
|
+
estimatedReadThroughputMBps,
|
|
165
|
+
estimatedLatencyP99Ms,
|
|
166
|
+
dailyDataVolumeMB,
|
|
167
|
+
totalStorageRequiredGB: totalStorageGB,
|
|
168
|
+
storageWithReplicationGB,
|
|
169
|
+
warnings,
|
|
170
|
+
recommendations
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Calculate network bandwidth requirements
|
|
176
|
+
*/
|
|
177
|
+
private calculateNetworkBandwidth(writeMBps: number, readMBps: number, brokerCount: number): number {
|
|
178
|
+
// Each broker handles replication traffic
|
|
179
|
+
const replicationTrafficMBps = writeMBps * 2; // Leader + follower writes
|
|
180
|
+
const totalTrafficMBps = writeMBps + readMBps + replicationTrafficMBps;
|
|
181
|
+
const perBrokerMBps = totalTrafficMBps / brokerCount;
|
|
182
|
+
|
|
183
|
+
// Convert to Gbps and round up
|
|
184
|
+
const gbps = Math.ceil((perBrokerMBps * 8) / 1000);
|
|
185
|
+
|
|
186
|
+
// Recommend common NIC sizes: 1, 10, 25, 40, 100 Gbps
|
|
187
|
+
if (gbps <= 1) return 1;
|
|
188
|
+
if (gbps <= 10) return 10;
|
|
189
|
+
if (gbps <= 25) return 25;
|
|
190
|
+
if (gbps <= 40) return 40;
|
|
191
|
+
return 100;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Estimate p99 latency based on partition count and disk size
|
|
196
|
+
*/
|
|
197
|
+
private estimateLatency(partitionsPerBroker: number, diskGB: number): number {
|
|
198
|
+
let latencyMs = 5; // Base latency (network + CPU)
|
|
199
|
+
|
|
200
|
+
// Add latency for partition count (more partitions = more overhead)
|
|
201
|
+
if (partitionsPerBroker > 2000) {
|
|
202
|
+
latencyMs += 5;
|
|
203
|
+
} else if (partitionsPerBroker > 1000) {
|
|
204
|
+
latencyMs += 2;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Add latency for disk size (larger disks = potential seek time)
|
|
208
|
+
if (diskGB > 10000) {
|
|
209
|
+
latencyMs += 10; // HDD territory
|
|
210
|
+
} else if (diskGB > 5000) {
|
|
211
|
+
latencyMs += 5; // Large SSD
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return latencyMs;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Generate warnings for potential issues
|
|
219
|
+
*/
|
|
220
|
+
private generateWarnings(params: {
|
|
221
|
+
partitionsPerBroker: number;
|
|
222
|
+
brokerCount: number;
|
|
223
|
+
req: SizingRequirements;
|
|
224
|
+
diskPerBrokerGB: number;
|
|
225
|
+
}): string[] {
|
|
226
|
+
const warnings: string[] = [];
|
|
227
|
+
|
|
228
|
+
// Partition count warnings
|
|
229
|
+
if (params.partitionsPerBroker > 4000) {
|
|
230
|
+
warnings.push(
|
|
231
|
+
`⚠️ ${params.partitionsPerBroker} partitions per broker exceeds recommended limit (4000). ` +
|
|
232
|
+
`Consider increasing broker count to ${Math.ceil(params.req.topicCount * params.req.avgPartitionsPerTopic / 4000)}.`
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (params.partitionsPerBroker < 100) {
|
|
237
|
+
warnings.push(
|
|
238
|
+
`⚠️ ${params.partitionsPerBroker} partitions per broker is very low. ` +
|
|
239
|
+
`You may be over-provisioned. Consider reducing to ${Math.max(3, Math.ceil(params.brokerCount / 2))} brokers.`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Broker count warnings
|
|
244
|
+
if (params.brokerCount < params.req.replicationFactor) {
|
|
245
|
+
warnings.push(
|
|
246
|
+
`🚨 CRITICAL: ${params.brokerCount} brokers < replication factor (${params.req.replicationFactor}). ` +
|
|
247
|
+
`Minimum required: ${params.req.replicationFactor} brokers.`
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (params.brokerCount === params.req.replicationFactor) {
|
|
252
|
+
warnings.push(
|
|
253
|
+
`⚠️ Broker count equals replication factor. No fault tolerance! ` +
|
|
254
|
+
`Increase to at least ${params.req.replicationFactor + 1} brokers.`
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Disk size warnings
|
|
259
|
+
if (params.diskPerBrokerGB > 10000) {
|
|
260
|
+
warnings.push(
|
|
261
|
+
`⚠️ ${params.diskPerBrokerGB} GB per broker is very large. ` +
|
|
262
|
+
`Consider using HDD for cost savings or increasing broker count to reduce disk per broker.`
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Replication warnings
|
|
267
|
+
if (params.req.minInsyncReplicas && params.req.minInsyncReplicas >= params.req.replicationFactor) {
|
|
268
|
+
warnings.push(
|
|
269
|
+
`🚨 CRITICAL: min.insync.replicas (${params.req.minInsyncReplicas}) >= replication.factor (${params.req.replicationFactor}). ` +
|
|
270
|
+
`This will cause writes to fail! Set min.insync.replicas to ${params.req.replicationFactor - 1}.`
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return warnings;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Generate optimization recommendations
|
|
279
|
+
*/
|
|
280
|
+
private generateRecommendations(params: {
|
|
281
|
+
partitionsPerBroker: number;
|
|
282
|
+
brokerCount: number;
|
|
283
|
+
req: SizingRequirements;
|
|
284
|
+
ramGB: number;
|
|
285
|
+
diskPerBrokerGB: number;
|
|
286
|
+
}): string[] {
|
|
287
|
+
const recommendations: string[] = [];
|
|
288
|
+
|
|
289
|
+
// Partition strategy
|
|
290
|
+
if (params.req.avgPartitionsPerTopic < 10) {
|
|
291
|
+
recommendations.push(
|
|
292
|
+
`💡 Consider increasing partitions per topic to 12-24 for better parallelism and future growth.`
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (params.req.avgPartitionsPerTopic > 100) {
|
|
297
|
+
recommendations.push(
|
|
298
|
+
`💡 ${params.req.avgPartitionsPerTopic} partitions per topic is high. ` +
|
|
299
|
+
`Consider splitting into multiple topics or reducing partition count unless you need extreme parallelism.`
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Hardware recommendations
|
|
304
|
+
if (params.diskPerBrokerGB > 5000) {
|
|
305
|
+
recommendations.push(
|
|
306
|
+
`💡 Large disk requirement (${params.diskPerBrokerGB} GB). Consider using tiered storage (Kafka 2.8+) ` +
|
|
307
|
+
`to offload old data to S3/Azure Blob/GCS.`
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (params.ramGB > 128) {
|
|
312
|
+
recommendations.push(
|
|
313
|
+
`💡 High RAM requirement (${params.ramGB} GB). Ensure your infrastructure supports this. ` +
|
|
314
|
+
`Consider AWS i3en/i4i instances or equivalent.`
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Replication recommendations
|
|
319
|
+
if (!params.req.minInsyncReplicas) {
|
|
320
|
+
recommendations.push(
|
|
321
|
+
`💡 Set min.insync.replicas=2 for production (currently not configured). ` +
|
|
322
|
+
`This prevents data loss if a broker fails.`
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (params.req.replicationFactor < 3) {
|
|
327
|
+
recommendations.push(
|
|
328
|
+
`💡 Increase replication factor to 3 for production durability (currently ${params.req.replicationFactor}).`
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Broker count recommendations
|
|
333
|
+
if (params.brokerCount % 3 !== 0 && params.brokerCount > 3) {
|
|
334
|
+
recommendations.push(
|
|
335
|
+
`💡 Broker count (${params.brokerCount}) is not a multiple of 3. ` +
|
|
336
|
+
`Consider using ${Math.ceil(params.brokerCount / 3) * 3} brokers for better rack awareness.`
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return recommendations;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Calculate disk IOPS requirements
|
|
345
|
+
*/
|
|
346
|
+
calculateDiskIOPS(writeThroughputMBps: number, replicationFactor: number): {
|
|
347
|
+
readIOPS: number;
|
|
348
|
+
writeIOPS: number;
|
|
349
|
+
recommendation: string;
|
|
350
|
+
} {
|
|
351
|
+
// Assume 4KB blocks
|
|
352
|
+
const writeIOPS = (writeThroughputMBps * 1024) / 4;
|
|
353
|
+
const replicationWriteIOPS = writeIOPS * (replicationFactor - 1); // Follower writes
|
|
354
|
+
const readIOPS = writeIOPS * 0.5; // Conservative (depends on consumer lag)
|
|
355
|
+
|
|
356
|
+
const totalWriteIOPS = writeIOPS + replicationWriteIOPS;
|
|
357
|
+
const totalReadIOPS = readIOPS;
|
|
358
|
+
|
|
359
|
+
let recommendation = '';
|
|
360
|
+
if (totalWriteIOPS > 50000) {
|
|
361
|
+
recommendation = 'Use NVMe SSDs (500K+ IOPS)';
|
|
362
|
+
} else if (totalWriteIOPS > 10000) {
|
|
363
|
+
recommendation = 'Use Premium SSD (20K-64K IOPS)';
|
|
364
|
+
} else {
|
|
365
|
+
recommendation = 'Standard SSD (3K-6K IOPS) sufficient';
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
readIOPS: Math.ceil(totalReadIOPS),
|
|
370
|
+
writeIOPS: Math.ceil(totalWriteIOPS),
|
|
371
|
+
recommendation
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
}
|