specweave 0.18.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +7 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +42 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +8 -6
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +78 -117
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
- package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
- package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
- package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
- package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
- package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
- package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +2 -1
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/types/config.d.ts +94 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +16 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +6 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +10 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +38 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +59 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "specweave-kafka",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Apache Kafka event streaming integration plugin for SpecWeave",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "jest",
|
|
10
|
+
"test:watch": "jest --watch",
|
|
11
|
+
"test:coverage": "jest --coverage",
|
|
12
|
+
"lint": "eslint lib/**/*.ts",
|
|
13
|
+
"format": "prettier --write lib/**/*.ts"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"kafka",
|
|
17
|
+
"specweave",
|
|
18
|
+
"event-streaming",
|
|
19
|
+
"mcp",
|
|
20
|
+
"terraform"
|
|
21
|
+
],
|
|
22
|
+
"author": "SpecWeave Team",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"kafkajs": "^2.2.4",
|
|
26
|
+
"@types/node": "^18.0.0"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@types/jest": "^29.5.0",
|
|
30
|
+
"jest": "^29.5.0",
|
|
31
|
+
"ts-jest": "^29.1.0",
|
|
32
|
+
"typescript": "^5.0.0",
|
|
33
|
+
"eslint": "^8.40.0",
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^5.59.0",
|
|
35
|
+
"@typescript-eslint/parser": "^5.59.0",
|
|
36
|
+
"prettier": "^2.8.8"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"specweave": ">=0.18.0"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,647 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kafka-architecture
|
|
3
|
+
description: Expert knowledge of Apache Kafka architecture, cluster design, capacity planning, partitioning strategies, replication, and high availability. Auto-activates on keywords kafka architecture, cluster sizing, partition strategy, replication factor, kafka ha, kafka scalability, broker count, topic design, kafka performance, kafka capacity planning.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Kafka Architecture & Design Expert
|
|
7
|
+
|
|
8
|
+
Comprehensive knowledge of Apache Kafka architecture patterns, cluster design principles, and production best practices for building resilient, scalable event streaming platforms.
|
|
9
|
+
|
|
10
|
+
## Core Architecture Concepts
|
|
11
|
+
|
|
12
|
+
### Kafka Cluster Components
|
|
13
|
+
|
|
14
|
+
**Brokers**:
|
|
15
|
+
- Individual Kafka servers that store and serve data
|
|
16
|
+
- Each broker handles thousands of partitions
|
|
17
|
+
- Typical: 3-10 brokers per cluster (small), 10-100+ (large enterprises)
|
|
18
|
+
|
|
19
|
+
**Controller**:
|
|
20
|
+
- One broker elected as controller (via KRaft or ZooKeeper)
|
|
21
|
+
- Manages partition leaders and replica assignments
|
|
22
|
+
- Failure triggers automatic re-election
|
|
23
|
+
|
|
24
|
+
**Topics**:
|
|
25
|
+
- Logical channels for message streams
|
|
26
|
+
- Divided into partitions for parallelism
|
|
27
|
+
- Can have different retention policies per topic
|
|
28
|
+
|
|
29
|
+
**Partitions**:
|
|
30
|
+
- Ordered, immutable sequence of records
|
|
31
|
+
- Unit of parallelism (1 partition = 1 consumer in a group)
|
|
32
|
+
- Distributed across brokers for load balancing
|
|
33
|
+
|
|
34
|
+
**Replicas**:
|
|
35
|
+
- Copies of partitions across multiple brokers
|
|
36
|
+
- 1 leader replica (serves reads/writes)
|
|
37
|
+
- N-1 follower replicas (replication only)
|
|
38
|
+
- In-Sync Replicas (ISR): Followers caught up with leader
|
|
39
|
+
|
|
40
|
+
### KRaft vs ZooKeeper Mode
|
|
41
|
+
|
|
42
|
+
**KRaft Mode** (Recommended, Kafka 3.3+):
|
|
43
|
+
```yaml
|
|
44
|
+
Cluster Metadata:
|
|
45
|
+
- Stored in Kafka itself (no external ZooKeeper)
|
|
46
|
+
- Metadata topic: __cluster_metadata
|
|
47
|
+
- Controller quorum (3 or 5 nodes)
|
|
48
|
+
- Faster failover (<1s vs 10-30s)
|
|
49
|
+
- Simplified operations
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**ZooKeeper Mode** (Legacy, deprecated in 4.0):
|
|
53
|
+
```yaml
|
|
54
|
+
External Coordination:
|
|
55
|
+
- Requires separate ZooKeeper ensemble (3-5 nodes)
|
|
56
|
+
- Stores cluster metadata, configs, ACLs
|
|
57
|
+
- Slower failover (10-30 seconds)
|
|
58
|
+
- More complex to operate
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Migration**: ZooKeeper → KRaft migration supported in Kafka 3.6+
|
|
62
|
+
|
|
63
|
+
## Cluster Sizing Guidelines
|
|
64
|
+
|
|
65
|
+
### Small Cluster (Development/Testing)
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
Configuration:
|
|
69
|
+
Brokers: 3
|
|
70
|
+
Partitions per broker: ~100-500
|
|
71
|
+
Total partitions: 300-1500
|
|
72
|
+
Replication factor: 3
|
|
73
|
+
Hardware:
|
|
74
|
+
- CPU: 4-8 cores
|
|
75
|
+
- RAM: 8-16 GB
|
|
76
|
+
- Disk: 500 GB - 1 TB SSD
|
|
77
|
+
- Network: 1 Gbps
|
|
78
|
+
|
|
79
|
+
Use Cases:
|
|
80
|
+
- Development environments
|
|
81
|
+
- Low-volume production (<10 MB/s)
|
|
82
|
+
- Proof of concepts
|
|
83
|
+
- Single datacenter
|
|
84
|
+
|
|
85
|
+
Example Workload:
|
|
86
|
+
- 50 topics
|
|
87
|
+
- 5-10 partitions per topic
|
|
88
|
+
- 1 million messages/day
|
|
89
|
+
- 7-day retention
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Medium Cluster (Standard Production)
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
Configuration:
|
|
96
|
+
Brokers: 6-12
|
|
97
|
+
Partitions per broker: 500-2000
|
|
98
|
+
Total partitions: 3K-24K
|
|
99
|
+
Replication factor: 3
|
|
100
|
+
Hardware:
|
|
101
|
+
- CPU: 16-32 cores
|
|
102
|
+
- RAM: 64-128 GB
|
|
103
|
+
- Disk: 2-8 TB NVMe SSD
|
|
104
|
+
- Network: 10 Gbps
|
|
105
|
+
|
|
106
|
+
Use Cases:
|
|
107
|
+
- Standard production workloads
|
|
108
|
+
- Multi-team environments
|
|
109
|
+
- Regional deployments
|
|
110
|
+
- Up to 500 MB/s throughput
|
|
111
|
+
|
|
112
|
+
Example Workload:
|
|
113
|
+
- 200-500 topics
|
|
114
|
+
- 10-50 partitions per topic
|
|
115
|
+
- 100 million messages/day
|
|
116
|
+
- 30-day retention
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Large Cluster (High-Scale Production)
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
Configuration:
|
|
123
|
+
Brokers: 20-100+
|
|
124
|
+
Partitions per broker: 2000-4000
|
|
125
|
+
Total partitions: 40K-400K+
|
|
126
|
+
Replication factor: 3
|
|
127
|
+
Hardware:
|
|
128
|
+
- CPU: 32-64 cores
|
|
129
|
+
- RAM: 128-256 GB
|
|
130
|
+
- Disk: 8-20 TB NVMe SSD
|
|
131
|
+
- Network: 25-100 Gbps
|
|
132
|
+
|
|
133
|
+
Use Cases:
|
|
134
|
+
- Large enterprises
|
|
135
|
+
- Multi-region deployments
|
|
136
|
+
- Event-driven architectures
|
|
137
|
+
- 1+ GB/s throughput
|
|
138
|
+
|
|
139
|
+
Example Workload:
|
|
140
|
+
- 1000+ topics
|
|
141
|
+
- 50-200 partitions per topic
|
|
142
|
+
- 1+ billion messages/day
|
|
143
|
+
- 90-365 day retention
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Kafka Streams / Exactly-Once Semantics (EOS) Clusters
|
|
147
|
+
|
|
148
|
+
```yaml
|
|
149
|
+
Configuration:
|
|
150
|
+
Brokers: 6-12+ (same as standard, but more control plane load)
|
|
151
|
+
Partitions per broker: 500-1500 (fewer due to transaction overhead)
|
|
152
|
+
Total partitions: 3K-18K
|
|
153
|
+
Replication factor: 3
|
|
154
|
+
Hardware:
|
|
155
|
+
- CPU: 16-32 cores (more CPU for transactions)
|
|
156
|
+
- RAM: 64-128 GB
|
|
157
|
+
- Disk: 4-12 TB NVMe SSD (more for transaction logs)
|
|
158
|
+
- Network: 10-25 Gbps
|
|
159
|
+
|
|
160
|
+
Special Considerations:
|
|
161
|
+
- More brokers due to transaction coordinator load
|
|
162
|
+
- Lower partition count per broker (transactions = more overhead)
|
|
163
|
+
- Higher disk IOPS for transaction logs
|
|
164
|
+
- min.insync.replicas=2 mandatory for EOS
|
|
165
|
+
- acks=all required for producers
|
|
166
|
+
|
|
167
|
+
Use Cases:
|
|
168
|
+
- Stream processing with exactly-once guarantees
|
|
169
|
+
- Financial transactions
|
|
170
|
+
- Event sourcing with strict ordering
|
|
171
|
+
- Multi-step workflows requiring atomicity
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Partitioning Strategy
|
|
175
|
+
|
|
176
|
+
### How Many Partitions?
|
|
177
|
+
|
|
178
|
+
**Formula**:
|
|
179
|
+
```
|
|
180
|
+
Partitions = max(
|
|
181
|
+
Target Throughput / Single Partition Throughput,
|
|
182
|
+
Number of Consumers (for parallelism),
|
|
183
|
+
Future Growth Factor (2-3x)
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
Single Partition Limits:
|
|
187
|
+
- Write throughput: ~10-50 MB/s
|
|
188
|
+
- Read throughput: ~30-100 MB/s
|
|
189
|
+
- Message rate: ~10K-100K msg/s
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**Examples**:
|
|
193
|
+
|
|
194
|
+
**High Throughput Topic** (Logs, Events):
|
|
195
|
+
```yaml
|
|
196
|
+
Requirements:
|
|
197
|
+
- Write: 200 MB/s
|
|
198
|
+
- Read: 500 MB/s (multiple consumers)
|
|
199
|
+
- Expected growth: 3x in 1 year
|
|
200
|
+
|
|
201
|
+
Calculation:
|
|
202
|
+
Write partitions: 200 MB/s ÷ 20 MB/s = 10
|
|
203
|
+
Read partitions: 500 MB/s ÷ 40 MB/s = 13
|
|
204
|
+
Growth factor: 13 × 3 = 39
|
|
205
|
+
|
|
206
|
+
Recommendation: 40-50 partitions
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Low-Latency Topic** (Commands, Requests):
|
|
210
|
+
```yaml
|
|
211
|
+
Requirements:
|
|
212
|
+
- Write: 5 MB/s
|
|
213
|
+
- Read: 10 MB/s
|
|
214
|
+
- Latency: <10ms p99
|
|
215
|
+
- Order preservation: By user ID
|
|
216
|
+
|
|
217
|
+
Calculation:
|
|
218
|
+
Throughput partitions: 5 MB/s ÷ 20 MB/s = 1
|
|
219
|
+
Parallelism: 4 (for redundancy)
|
|
220
|
+
|
|
221
|
+
Recommendation: 4-6 partitions (keyed by user ID)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Dead Letter Queue**:
|
|
225
|
+
```yaml
|
|
226
|
+
Recommendation: 1-3 partitions
|
|
227
|
+
Reason: Low volume, order less important
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Partition Key Selection
|
|
231
|
+
|
|
232
|
+
**Good Keys** (High Cardinality, Even Distribution):
|
|
233
|
+
```yaml
|
|
234
|
+
✅ User ID (UUIDs):
|
|
235
|
+
- Millions of unique values
|
|
236
|
+
- Even distribution
|
|
237
|
+
- Example: "user-123e4567-e89b-12d3-a456-426614174000"
|
|
238
|
+
|
|
239
|
+
✅ Device ID (IoT):
|
|
240
|
+
- Unique per device
|
|
241
|
+
- Natural sharding
|
|
242
|
+
- Example: "device-sensor-001-zone-a"
|
|
243
|
+
|
|
244
|
+
✅ Order ID (E-commerce):
|
|
245
|
+
- Unique per transaction
|
|
246
|
+
- Even temporal distribution
|
|
247
|
+
- Example: "order-2024-11-15-abc123"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Bad Keys** (Low Cardinality, Hotspots):
|
|
251
|
+
```yaml
|
|
252
|
+
❌ Country Code:
|
|
253
|
+
- Only ~200 values
|
|
254
|
+
- Uneven (US, CN >> others)
|
|
255
|
+
- Creates partition hotspots
|
|
256
|
+
|
|
257
|
+
❌ Boolean Flags:
|
|
258
|
+
- Only 2 values (true/false)
|
|
259
|
+
- Severe imbalance
|
|
260
|
+
|
|
261
|
+
❌ Date (YYYY-MM-DD):
|
|
262
|
+
- All today's traffic → 1 partition
|
|
263
|
+
- Temporal hotspot
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Compound Keys** (Best of Both):
|
|
267
|
+
```yaml
|
|
268
|
+
✅ Country + User ID:
|
|
269
|
+
- Partition by country for locality
|
|
270
|
+
- Sub-partition by user for distribution
|
|
271
|
+
- Example: "US:user-123" → hash("US:user-123")
|
|
272
|
+
|
|
273
|
+
✅ Tenant + Event Type + Timestamp:
|
|
274
|
+
- Multi-tenant isolation
|
|
275
|
+
- Event type grouping
|
|
276
|
+
- Temporal ordering
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Replication & High Availability
|
|
280
|
+
|
|
281
|
+
### Replication Factor Guidelines
|
|
282
|
+
|
|
283
|
+
```yaml
|
|
284
|
+
Development:
|
|
285
|
+
Replication Factor: 1
|
|
286
|
+
Reason: Fast, no durability needed
|
|
287
|
+
|
|
288
|
+
Production (Standard):
|
|
289
|
+
Replication Factor: 3
|
|
290
|
+
Reason: Balance durability vs cost
|
|
291
|
+
Tolerates: 2 broker failures (with min.insync.replicas=2)
|
|
292
|
+
|
|
293
|
+
Production (Critical):
|
|
294
|
+
Replication Factor: 5
|
|
295
|
+
Reason: Maximum durability
|
|
296
|
+
Tolerates: 4 broker failures (with min.insync.replicas=3)
|
|
297
|
+
Use Cases: Financial transactions, audit logs
|
|
298
|
+
|
|
299
|
+
Multi-Datacenter:
|
|
300
|
+
Replication Factor: 3 per DC (6 total)
|
|
301
|
+
Reason: DC-level fault tolerance
|
|
302
|
+
Requires: MirrorMaker 2 or Confluent Replicator
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### min.insync.replicas
|
|
306
|
+
|
|
307
|
+
**Configuration**:
|
|
308
|
+
```yaml
|
|
309
|
+
min.insync.replicas=2:
|
|
310
|
+
- At least 2 replicas must acknowledge writes
|
|
311
|
+
- Typical for replication.factor=3
|
|
312
|
+
- Prevents data loss if 1 broker fails
|
|
313
|
+
|
|
314
|
+
min.insync.replicas=1:
|
|
315
|
+
- Only leader must acknowledge (dangerous!)
|
|
316
|
+
- Use only for non-critical topics
|
|
317
|
+
|
|
318
|
+
min.insync.replicas=3:
|
|
319
|
+
- At least 3 replicas must acknowledge
|
|
320
|
+
- For replication.factor=5 (critical systems)
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Rule**: `min.insync.replicas ≤ replication.factor - 1` (to allow 1 replica failure)
|
|
324
|
+
|
|
325
|
+
### Rack Awareness
|
|
326
|
+
|
|
327
|
+
```yaml
|
|
328
|
+
Configuration:
|
|
329
|
+
broker.rack=rack1 # Broker 1
|
|
330
|
+
broker.rack=rack2 # Broker 2
|
|
331
|
+
broker.rack=rack3 # Broker 3
|
|
332
|
+
|
|
333
|
+
Benefit:
|
|
334
|
+
- Replicas spread across racks
|
|
335
|
+
- Survives rack-level failures (power, network)
|
|
336
|
+
- Example: Topic with RF=3 → 1 replica per rack
|
|
337
|
+
|
|
338
|
+
Placement:
|
|
339
|
+
Leader: rack1
|
|
340
|
+
Follower 1: rack2
|
|
341
|
+
Follower 2: rack3
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Retention Strategies
|
|
345
|
+
|
|
346
|
+
### Time-Based Retention
|
|
347
|
+
|
|
348
|
+
```yaml
|
|
349
|
+
Short-Term (Events, Logs):
|
|
350
|
+
retention.ms: 86400000 # 1 day
|
|
351
|
+
Use Cases: Real-time analytics, monitoring
|
|
352
|
+
|
|
353
|
+
Medium-Term (Transactions):
|
|
354
|
+
retention.ms: 604800000 # 7 days
|
|
355
|
+
Use Cases: Standard business events
|
|
356
|
+
|
|
357
|
+
Long-Term (Audit, Compliance):
|
|
358
|
+
retention.ms: 31536000000 # 365 days
|
|
359
|
+
Use Cases: Regulatory requirements, event sourcing
|
|
360
|
+
|
|
361
|
+
Infinite (Event Sourcing):
|
|
362
|
+
retention.ms: -1 # Forever
|
|
363
|
+
cleanup.policy: compact
|
|
364
|
+
Use Cases: Source of truth, state rebuilding
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Size-Based Retention
|
|
368
|
+
|
|
369
|
+
```yaml
|
|
370
|
+
retention.bytes: 10737418240 # 10 GB per partition
|
|
371
|
+
|
|
372
|
+
Combined (Time OR Size):
|
|
373
|
+
retention.ms: 604800000 # 7 days
|
|
374
|
+
retention.bytes: 107374182400 # 100 GB
|
|
375
|
+
# Whichever limit is reached first
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Compaction (Log Compaction)
|
|
379
|
+
|
|
380
|
+
```yaml
|
|
381
|
+
cleanup.policy: compact
|
|
382
|
+
|
|
383
|
+
How It Works:
|
|
384
|
+
- Keeps only latest value per key
|
|
385
|
+
- Deletes old versions
|
|
386
|
+
- Preserves full history initially, compacts later
|
|
387
|
+
|
|
388
|
+
Use Cases:
|
|
389
|
+
- Database changelogs (CDC)
|
|
390
|
+
- User profile updates
|
|
391
|
+
- Configuration management
|
|
392
|
+
- State stores
|
|
393
|
+
|
|
394
|
+
Example:
|
|
395
|
+
Before Compaction:
|
|
396
|
+
user:123 → {name: "Alice", v:1}
|
|
397
|
+
user:123 → {name: "Alice", v:2, email: "alice@ex.com"}
|
|
398
|
+
user:123 → {name: "Alice A.", v:3}
|
|
399
|
+
|
|
400
|
+
After Compaction:
|
|
401
|
+
user:123 → {name: "Alice A.", v:3} # Latest only
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Performance Optimization
|
|
405
|
+
|
|
406
|
+
### Broker Configuration
|
|
407
|
+
|
|
408
|
+
```yaml
|
|
409
|
+
# Network threads (handle client connections)
|
|
410
|
+
num.network.threads: 8 # Increase for high connection count
|
|
411
|
+
|
|
412
|
+
# I/O threads (disk operations)
|
|
413
|
+
num.io.threads: 16 # Set to number of disks × 2
|
|
414
|
+
|
|
415
|
+
# Replica fetcher threads
|
|
416
|
+
num.replica.fetchers: 4 # Increase for many partitions
|
|
417
|
+
|
|
418
|
+
# Socket buffer sizes
|
|
419
|
+
socket.send.buffer.bytes: 1048576 # 1 MB
|
|
420
|
+
socket.receive.buffer.bytes: 1048576 # 1 MB
|
|
421
|
+
|
|
422
|
+
# Log flush (default: OS handles flushing)
|
|
423
|
+
log.flush.interval.messages: 10000 # Flush every 10K messages
|
|
424
|
+
log.flush.interval.ms: 1000 # Or every 1 second
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Producer Optimization
|
|
428
|
+
|
|
429
|
+
```yaml
|
|
430
|
+
High Throughput:
|
|
431
|
+
batch.size: 65536 # 64 KB
|
|
432
|
+
linger.ms: 100 # Wait 100ms for batching
|
|
433
|
+
compression.type: lz4 # Fast compression
|
|
434
|
+
acks: 1 # Leader only
|
|
435
|
+
|
|
436
|
+
Low Latency:
|
|
437
|
+
batch.size: 16384 # 16 KB (default)
|
|
438
|
+
linger.ms: 0 # Send immediately
|
|
439
|
+
compression.type: none
|
|
440
|
+
acks: 1
|
|
441
|
+
|
|
442
|
+
Durability (Exactly-Once):
|
|
443
|
+
batch.size: 16384
|
|
444
|
+
linger.ms: 10
|
|
445
|
+
compression.type: lz4
|
|
446
|
+
acks: all
|
|
447
|
+
enable.idempotence: true
|
|
448
|
+
transactional.id: "producer-1"
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Consumer Optimization
|
|
452
|
+
|
|
453
|
+
```yaml
|
|
454
|
+
High Throughput:
|
|
455
|
+
fetch.min.bytes: 1048576 # 1 MB
|
|
456
|
+
fetch.max.wait.ms: 500 # Wait 500ms to accumulate
|
|
457
|
+
|
|
458
|
+
Low Latency:
|
|
459
|
+
fetch.min.bytes: 1 # Immediate fetch
|
|
460
|
+
fetch.max.wait.ms: 100 # Short wait
|
|
461
|
+
|
|
462
|
+
Max Parallelism:
|
|
463
|
+
# Deploy consumers = number of partitions
|
|
464
|
+
# More consumers than partitions = idle consumers
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
## Multi-Datacenter Patterns
|
|
468
|
+
|
|
469
|
+
### Active-Passive (Disaster Recovery)
|
|
470
|
+
|
|
471
|
+
```yaml
|
|
472
|
+
Architecture:
|
|
473
|
+
Primary DC: Full Kafka cluster
|
|
474
|
+
Secondary DC: Replica cluster (MirrorMaker 2)
|
|
475
|
+
|
|
476
|
+
Configuration:
|
|
477
|
+
- Producers → Primary only
|
|
478
|
+
- Consumers → Primary only
|
|
479
|
+
- MirrorMaker 2: Primary → Secondary (async replication)
|
|
480
|
+
|
|
481
|
+
Failover:
|
|
482
|
+
1. Detect primary failure
|
|
483
|
+
2. Switch producers/consumers to secondary
|
|
484
|
+
3. Promote secondary to primary
|
|
485
|
+
|
|
486
|
+
Recovery Time: 5-30 minutes (manual)
|
|
487
|
+
Data Loss: Potential (async replication lag)
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Active-Active (Geo-Replication)
|
|
491
|
+
|
|
492
|
+
```yaml
|
|
493
|
+
Architecture:
|
|
494
|
+
DC1: Kafka cluster (region A)
|
|
495
|
+
DC2: Kafka cluster (region B)
|
|
496
|
+
Bidirectional replication via MirrorMaker 2
|
|
497
|
+
|
|
498
|
+
Configuration:
|
|
499
|
+
- Producers → Nearest DC
|
|
500
|
+
- Consumers → Nearest DC or both
|
|
501
|
+
- Conflict resolution: Last-write-wins or custom
|
|
502
|
+
|
|
503
|
+
Challenges:
|
|
504
|
+
- Duplicate messages (at-least-once delivery)
|
|
505
|
+
- Ordering across DCs not guaranteed
|
|
506
|
+
- Circular replication prevention
|
|
507
|
+
|
|
508
|
+
Use Cases:
|
|
509
|
+
- Global applications
|
|
510
|
+
- Regional compliance (GDPR)
|
|
511
|
+
- Load distribution
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
### Stretch Cluster (Synchronous Replication)
|
|
515
|
+
|
|
516
|
+
```yaml
|
|
517
|
+
Architecture:
|
|
518
|
+
Single Kafka cluster spanning 2 DCs
|
|
519
|
+
Rack awareness: DC1 = rack1, DC2 = rack2
|
|
520
|
+
|
|
521
|
+
Configuration:
|
|
522
|
+
min.insync.replicas: 2
|
|
523
|
+
replication.factor: 4 (2 per DC)
|
|
524
|
+
acks: all
|
|
525
|
+
|
|
526
|
+
Requirements:
|
|
527
|
+
- Low latency between DCs (<10ms)
|
|
528
|
+
- High bandwidth link (10+ Gbps)
|
|
529
|
+
- Dedicated fiber
|
|
530
|
+
|
|
531
|
+
Trade-offs:
|
|
532
|
+
Pros: Synchronous replication, zero data loss
|
|
533
|
+
Cons: Latency penalty, network dependency
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
## Monitoring & Observability
|
|
537
|
+
|
|
538
|
+
### Key Metrics
|
|
539
|
+
|
|
540
|
+
**Broker Metrics**:
|
|
541
|
+
```yaml
|
|
542
|
+
UnderReplicatedPartitions:
|
|
543
|
+
Alert: > 0 for > 5 minutes
|
|
544
|
+
Indicates: Replica lag, broker failure
|
|
545
|
+
|
|
546
|
+
OfflinePartitionsCount:
|
|
547
|
+
Alert: > 0
|
|
548
|
+
Indicates: No leader elected (critical!)
|
|
549
|
+
|
|
550
|
+
ActiveControllerCount:
|
|
551
|
+
Alert: != 1 (should be exactly 1)
|
|
552
|
+
Indicates: Split brain or no controller
|
|
553
|
+
|
|
554
|
+
RequestHandlerAvgIdlePercent:
|
|
555
|
+
Alert: < 20%
|
|
556
|
+
Indicates: Broker CPU saturation
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
**Topic Metrics**:
|
|
560
|
+
```yaml
|
|
561
|
+
MessagesInPerSec:
|
|
562
|
+
Monitor: Throughput trends
|
|
563
|
+
Alert: Sudden drops (producer failure)
|
|
564
|
+
|
|
565
|
+
BytesInPerSec / BytesOutPerSec:
|
|
566
|
+
Monitor: Network utilization
|
|
567
|
+
Alert: Approaching NIC limits
|
|
568
|
+
|
|
569
|
+
RecordsLagMax (Consumer):
|
|
570
|
+
Alert: > 10000 or growing
|
|
571
|
+
Indicates: Consumer can't keep up
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
**Disk Metrics**:
|
|
575
|
+
```yaml
|
|
576
|
+
LogSegmentSize:
|
|
577
|
+
Monitor: Disk usage trends
|
|
578
|
+
Alert: > 80% capacity
|
|
579
|
+
|
|
580
|
+
LogFlushRateAndTimeMs:
|
|
581
|
+
Monitor: Disk write latency
|
|
582
|
+
Alert: > 100ms p99 (slow disk)
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
## Security Patterns
|
|
586
|
+
|
|
587
|
+
### Authentication & Authorization
|
|
588
|
+
|
|
589
|
+
```yaml
|
|
590
|
+
SASL/SCRAM-SHA-512:
|
|
591
|
+
- Industry standard
|
|
592
|
+
- User/password authentication
|
|
593
|
+
- Stored in ZooKeeper/KRaft
|
|
594
|
+
|
|
595
|
+
ACLs (Access Control Lists):
|
|
596
|
+
- Per-topic, per-group permissions
|
|
597
|
+
- Operations: READ, WRITE, CREATE, DELETE, ALTER
|
|
598
|
+
- Example:
|
|
599
|
+
bin/kafka-acls.sh --add \
|
|
600
|
+
--allow-principal User:alice \
|
|
601
|
+
--operation READ \
|
|
602
|
+
--topic orders
|
|
603
|
+
|
|
604
|
+
mTLS (Mutual TLS):
|
|
605
|
+
- Certificate-based auth
|
|
606
|
+
- Strong cryptographic identity
|
|
607
|
+
- Best for service-to-service
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
## Integration with SpecWeave
|
|
611
|
+
|
|
612
|
+
**Automatic Architecture Detection**:
|
|
613
|
+
```typescript
|
|
614
|
+
import { ClusterSizingCalculator } from './lib/utils/sizing';
|
|
615
|
+
|
|
616
|
+
const calculator = new ClusterSizingCalculator();
|
|
617
|
+
const recommendation = calculator.calculate({
|
|
618
|
+
throughputMBps: 200,
|
|
619
|
+
retentionDays: 30,
|
|
620
|
+
replicationFactor: 3,
|
|
621
|
+
topicCount: 100
|
|
622
|
+
});
|
|
623
|
+
|
|
624
|
+
console.log(recommendation);
|
|
625
|
+
// {
|
|
626
|
+
// brokers: 8,
|
|
627
|
+
// partitionsPerBroker: 1500,
|
|
628
|
+
// diskPerBroker: 6000 GB,
|
|
629
|
+
// ramPerBroker: 64 GB
|
|
630
|
+
// }
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
**SpecWeave Commands**:
|
|
634
|
+
- `/specweave-kafka:deploy` - Validates cluster sizing before deployment
|
|
635
|
+
- `/specweave-kafka:monitor-setup` - Configures metrics for key indicators
|
|
636
|
+
|
|
637
|
+
## Related Skills
|
|
638
|
+
|
|
639
|
+
- `/specweave-kafka:kafka-mcp-integration` - MCP server setup
|
|
640
|
+
- `/specweave-kafka:kafka-cli-tools` - CLI operations
|
|
641
|
+
|
|
642
|
+
## External Links
|
|
643
|
+
|
|
644
|
+
- [Kafka Documentation - Architecture](https://kafka.apache.org/documentation/#design)
|
|
645
|
+
- [Confluent - Kafka Sizing](https://www.confluent.io/blog/how-to-choose-the-number-of-topics-partitions-in-a-kafka-cluster/)
|
|
646
|
+
- [KRaft Mode Overview](https://kafka.apache.org/documentation/#kraft)
|
|
647
|
+
- [LinkedIn Engineering - Kafka at Scale](https://engineering.linkedin.com/kafka/running-kafka-scale)
|