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,470 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confluent-ksqldb
|
|
3
|
+
description: ksqlDB stream processing expert. Covers SQL-like queries on Kafka topics, stream and table concepts, joins, aggregations, windowing, materialized views, and real-time data transformations. Activates for ksqldb, ksql, stream processing, kafka sql, real-time analytics, windowing, stream joins, table joins, materialized views.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Confluent ksqlDB Skill
|
|
7
|
+
|
|
8
|
+
Expert knowledge of ksqlDB - Confluent's event streaming database for building real-time applications with SQL-like queries on Kafka topics.
|
|
9
|
+
|
|
10
|
+
## What I Know
|
|
11
|
+
|
|
12
|
+
### Core Concepts
|
|
13
|
+
|
|
14
|
+
**Streams** (Unbounded, Append-Only):
|
|
15
|
+
- Represents immutable event sequences
|
|
16
|
+
- Every row is a new event
|
|
17
|
+
- Cannot be updated or deleted
|
|
18
|
+
- Example: Click events, sensor readings, transactions
|
|
19
|
+
|
|
20
|
+
**Tables** (Mutable, Latest State):
|
|
21
|
+
- Represents current state
|
|
22
|
+
- Updates override previous values (by key)
|
|
23
|
+
- Compacted topic under the hood
|
|
24
|
+
- Example: User profiles, product inventory, account balances
|
|
25
|
+
|
|
26
|
+
**Key Difference**:
|
|
27
|
+
```sql
|
|
28
|
+
-- STREAM: Every event is independent
|
|
29
|
+
INSERT INTO clicks_stream (user_id, page, timestamp)
|
|
30
|
+
VALUES (1, 'homepage', CURRENT_TIMESTAMP());
|
|
31
|
+
-- Creates NEW row
|
|
32
|
+
|
|
33
|
+
-- TABLE: Latest value wins (by key)
|
|
34
|
+
INSERT INTO users_table (user_id, name, email)
|
|
35
|
+
VALUES (1, 'John', 'john@example.com');
|
|
36
|
+
-- UPDATES existing row with user_id=1
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Query Types
|
|
40
|
+
|
|
41
|
+
**1. Streaming Queries** (Continuous, Real-Time):
|
|
42
|
+
```sql
|
|
43
|
+
-- Filter events in real-time
|
|
44
|
+
SELECT user_id, page, timestamp
|
|
45
|
+
FROM clicks_stream
|
|
46
|
+
WHERE page = 'checkout'
|
|
47
|
+
EMIT CHANGES;
|
|
48
|
+
|
|
49
|
+
-- Transform on the fly
|
|
50
|
+
SELECT
|
|
51
|
+
user_id,
|
|
52
|
+
UPPER(page) AS page_upper,
|
|
53
|
+
TIMESTAMPTOSTRING(timestamp, 'yyyy-MM-dd') AS date
|
|
54
|
+
FROM clicks_stream
|
|
55
|
+
EMIT CHANGES;
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**2. Materialized Views** (Pre-Computed Tables):
|
|
59
|
+
```sql
|
|
60
|
+
-- Aggregate clicks per user (updates continuously)
|
|
61
|
+
CREATE TABLE user_click_counts AS
|
|
62
|
+
SELECT
|
|
63
|
+
user_id,
|
|
64
|
+
COUNT(*) AS click_count
|
|
65
|
+
FROM clicks_stream
|
|
66
|
+
GROUP BY user_id
|
|
67
|
+
EMIT CHANGES;
|
|
68
|
+
|
|
69
|
+
-- Query the table (instant results!)
|
|
70
|
+
SELECT * FROM user_click_counts WHERE user_id = 123;
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**3. Pull Queries** (Point-in-Time Reads):
|
|
74
|
+
```sql
|
|
75
|
+
-- Query current state (like traditional SQL)
|
|
76
|
+
SELECT * FROM users_table WHERE user_id = 123;
|
|
77
|
+
|
|
78
|
+
-- No EMIT CHANGES = pull query (returns once)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## When to Use This Skill
|
|
82
|
+
|
|
83
|
+
Activate me when you need help with:
|
|
84
|
+
- ksqlDB syntax ("How to create ksqlDB stream?")
|
|
85
|
+
- Stream vs table concepts ("When to use stream vs table?")
|
|
86
|
+
- Joins ("Join stream with table")
|
|
87
|
+
- Aggregations ("Count events per user")
|
|
88
|
+
- Windowing ("Tumbling window aggregation")
|
|
89
|
+
- Real-time transformations ("Filter and enrich events")
|
|
90
|
+
- Materialized views ("Create pre-computed aggregates")
|
|
91
|
+
|
|
92
|
+
## Common Patterns
|
|
93
|
+
|
|
94
|
+
### Pattern 1: Filter Events
|
|
95
|
+
|
|
96
|
+
**Use Case**: Drop irrelevant events early
|
|
97
|
+
|
|
98
|
+
```sql
|
|
99
|
+
-- Create filtered stream
|
|
100
|
+
CREATE STREAM important_clicks AS
|
|
101
|
+
SELECT *
|
|
102
|
+
FROM clicks_stream
|
|
103
|
+
WHERE page IN ('checkout', 'payment', 'confirmation')
|
|
104
|
+
EMIT CHANGES;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Pattern 2: Enrich Events (Stream-Table Join)
|
|
108
|
+
|
|
109
|
+
**Use Case**: Add user details to click events
|
|
110
|
+
|
|
111
|
+
```sql
|
|
112
|
+
-- Users table (current state)
|
|
113
|
+
CREATE TABLE users (
|
|
114
|
+
user_id BIGINT PRIMARY KEY,
|
|
115
|
+
name VARCHAR,
|
|
116
|
+
email VARCHAR
|
|
117
|
+
) WITH (
|
|
118
|
+
kafka_topic='users',
|
|
119
|
+
value_format='AVRO'
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
-- Enrich clicks with user data
|
|
123
|
+
CREATE STREAM enriched_clicks AS
|
|
124
|
+
SELECT
|
|
125
|
+
c.user_id,
|
|
126
|
+
c.page,
|
|
127
|
+
c.timestamp,
|
|
128
|
+
u.name,
|
|
129
|
+
u.email
|
|
130
|
+
FROM clicks_stream c
|
|
131
|
+
LEFT JOIN users u ON c.user_id = u.user_id
|
|
132
|
+
EMIT CHANGES;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Pattern 3: Real-Time Aggregation
|
|
136
|
+
|
|
137
|
+
**Use Case**: Count events per user, per 5-minute window
|
|
138
|
+
|
|
139
|
+
```sql
|
|
140
|
+
CREATE TABLE user_clicks_per_5min AS
|
|
141
|
+
SELECT
|
|
142
|
+
user_id,
|
|
143
|
+
WINDOWSTART AS window_start,
|
|
144
|
+
WINDOWEND AS window_end,
|
|
145
|
+
COUNT(*) AS click_count
|
|
146
|
+
FROM clicks_stream
|
|
147
|
+
WINDOW TUMBLING (SIZE 5 MINUTES)
|
|
148
|
+
GROUP BY user_id
|
|
149
|
+
EMIT CHANGES;
|
|
150
|
+
|
|
151
|
+
-- Query current window
|
|
152
|
+
SELECT * FROM user_clicks_per_5min
|
|
153
|
+
WHERE user_id = 123
|
|
154
|
+
AND window_start >= NOW() - INTERVAL 5 MINUTES;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Pattern 4: Detect Anomalies
|
|
158
|
+
|
|
159
|
+
**Use Case**: Alert when user clicks >100 times in 1 minute
|
|
160
|
+
|
|
161
|
+
```sql
|
|
162
|
+
CREATE STREAM high_click_alerts AS
|
|
163
|
+
SELECT
|
|
164
|
+
user_id,
|
|
165
|
+
COUNT(*) AS click_count
|
|
166
|
+
FROM clicks_stream
|
|
167
|
+
WINDOW TUMBLING (SIZE 1 MINUTE)
|
|
168
|
+
GROUP BY user_id
|
|
169
|
+
HAVING COUNT(*) > 100
|
|
170
|
+
EMIT CHANGES;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Pattern 5: Change Data Capture (CDC)
|
|
174
|
+
|
|
175
|
+
**Use Case**: Track changes to user table
|
|
176
|
+
|
|
177
|
+
```sql
|
|
178
|
+
-- Create table from CDC topic (Debezium)
|
|
179
|
+
CREATE TABLE users_cdc (
|
|
180
|
+
user_id BIGINT PRIMARY KEY,
|
|
181
|
+
name VARCHAR,
|
|
182
|
+
email VARCHAR,
|
|
183
|
+
op VARCHAR -- INSERT, UPDATE, DELETE
|
|
184
|
+
) WITH (
|
|
185
|
+
kafka_topic='mysql.users.cdc',
|
|
186
|
+
value_format='AVRO'
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
-- Stream of changes only
|
|
190
|
+
CREATE STREAM user_changes AS
|
|
191
|
+
SELECT * FROM users_cdc
|
|
192
|
+
WHERE op IN ('UPDATE', 'DELETE')
|
|
193
|
+
EMIT CHANGES;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Join Types
|
|
197
|
+
|
|
198
|
+
### 1. Stream-Stream Join
|
|
199
|
+
|
|
200
|
+
**Use Case**: Correlate related events within time window
|
|
201
|
+
|
|
202
|
+
```sql
|
|
203
|
+
-- Join page views with clicks within 10 minutes
|
|
204
|
+
CREATE STREAM page_view_with_clicks AS
|
|
205
|
+
SELECT
|
|
206
|
+
v.user_id,
|
|
207
|
+
v.page AS viewed_page,
|
|
208
|
+
c.page AS clicked_page
|
|
209
|
+
FROM page_views v
|
|
210
|
+
INNER JOIN clicks c WITHIN 10 MINUTES
|
|
211
|
+
ON v.user_id = c.user_id
|
|
212
|
+
EMIT CHANGES;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Window Types**:
|
|
216
|
+
- `WITHIN 10 MINUTES` - Events must be within 10 minutes of each other
|
|
217
|
+
- `GRACE PERIOD 5 MINUTES` - Late-arriving events accepted for 5 more minutes
|
|
218
|
+
|
|
219
|
+
### 2. Stream-Table Join
|
|
220
|
+
|
|
221
|
+
**Use Case**: Enrich events with current state
|
|
222
|
+
|
|
223
|
+
```sql
|
|
224
|
+
-- Add product details to order events
|
|
225
|
+
CREATE STREAM enriched_orders AS
|
|
226
|
+
SELECT
|
|
227
|
+
o.order_id,
|
|
228
|
+
o.product_id,
|
|
229
|
+
p.product_name,
|
|
230
|
+
p.price
|
|
231
|
+
FROM orders_stream o
|
|
232
|
+
LEFT JOIN products_table p ON o.product_id = p.product_id
|
|
233
|
+
EMIT CHANGES;
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 3. Table-Table Join
|
|
237
|
+
|
|
238
|
+
**Use Case**: Combine two tables (latest state)
|
|
239
|
+
|
|
240
|
+
```sql
|
|
241
|
+
-- Join users with their current cart
|
|
242
|
+
CREATE TABLE user_with_cart AS
|
|
243
|
+
SELECT
|
|
244
|
+
u.user_id,
|
|
245
|
+
u.name,
|
|
246
|
+
c.cart_total
|
|
247
|
+
FROM users u
|
|
248
|
+
LEFT JOIN shopping_carts c ON u.user_id = c.user_id
|
|
249
|
+
EMIT CHANGES;
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Windowing Types
|
|
253
|
+
|
|
254
|
+
### Tumbling Window (Non-Overlapping)
|
|
255
|
+
|
|
256
|
+
**Use Case**: Aggregate per fixed time period
|
|
257
|
+
|
|
258
|
+
```sql
|
|
259
|
+
-- Count events every 5 minutes
|
|
260
|
+
SELECT
|
|
261
|
+
user_id,
|
|
262
|
+
COUNT(*) AS event_count
|
|
263
|
+
FROM events
|
|
264
|
+
WINDOW TUMBLING (SIZE 5 MINUTES)
|
|
265
|
+
GROUP BY user_id;
|
|
266
|
+
|
|
267
|
+
-- Windows: [0:00-0:05), [0:05-0:10), [0:10-0:15)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Hopping Window (Overlapping)
|
|
271
|
+
|
|
272
|
+
**Use Case**: Moving average over time
|
|
273
|
+
|
|
274
|
+
```sql
|
|
275
|
+
-- Count events in 10-minute windows, advancing every 5 minutes
|
|
276
|
+
SELECT
|
|
277
|
+
user_id,
|
|
278
|
+
COUNT(*) AS event_count
|
|
279
|
+
FROM events
|
|
280
|
+
WINDOW HOPPING (SIZE 10 MINUTES, ADVANCE BY 5 MINUTES)
|
|
281
|
+
GROUP BY user_id;
|
|
282
|
+
|
|
283
|
+
-- Windows: [0:00-0:10), [0:05-0:15), [0:10-0:20)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Session Window (Event-Based)
|
|
287
|
+
|
|
288
|
+
**Use Case**: Group events by user session (gap-based)
|
|
289
|
+
|
|
290
|
+
```sql
|
|
291
|
+
-- Session ends after 30 minutes of inactivity
|
|
292
|
+
SELECT
|
|
293
|
+
user_id,
|
|
294
|
+
COUNT(*) AS session_events
|
|
295
|
+
FROM events
|
|
296
|
+
WINDOW SESSION (30 MINUTES)
|
|
297
|
+
GROUP BY user_id;
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Best Practices
|
|
301
|
+
|
|
302
|
+
### 1. Use Appropriate Data Types
|
|
303
|
+
|
|
304
|
+
✅ **DO**:
|
|
305
|
+
```sql
|
|
306
|
+
CREATE STREAM orders (
|
|
307
|
+
order_id BIGINT,
|
|
308
|
+
user_id BIGINT,
|
|
309
|
+
total DECIMAL(10, 2), -- Precise currency
|
|
310
|
+
timestamp TIMESTAMP
|
|
311
|
+
);
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
❌ **DON'T**:
|
|
315
|
+
```sql
|
|
316
|
+
-- WRONG: Using DOUBLE for currency (precision loss!)
|
|
317
|
+
total DOUBLE
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 2. Always Specify Keys
|
|
321
|
+
|
|
322
|
+
✅ **DO**:
|
|
323
|
+
```sql
|
|
324
|
+
CREATE TABLE users (
|
|
325
|
+
user_id BIGINT PRIMARY KEY, -- Explicit key
|
|
326
|
+
name VARCHAR
|
|
327
|
+
) WITH (kafka_topic='users');
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
❌ **DON'T**:
|
|
331
|
+
```sql
|
|
332
|
+
-- WRONG: No key specified (can't join!)
|
|
333
|
+
CREATE TABLE users (
|
|
334
|
+
user_id BIGINT,
|
|
335
|
+
name VARCHAR
|
|
336
|
+
);
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### 3. Use Windowing for Aggregations
|
|
340
|
+
|
|
341
|
+
✅ **DO**:
|
|
342
|
+
```sql
|
|
343
|
+
-- Windowed aggregation (bounded memory)
|
|
344
|
+
SELECT COUNT(*) FROM events
|
|
345
|
+
WINDOW TUMBLING (SIZE 1 HOUR)
|
|
346
|
+
GROUP BY user_id;
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
❌ **DON'T**:
|
|
350
|
+
```sql
|
|
351
|
+
-- WRONG: Non-windowed aggregation (unbounded memory!)
|
|
352
|
+
SELECT COUNT(*) FROM events GROUP BY user_id;
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### 4. Set Retention Policies
|
|
356
|
+
|
|
357
|
+
```sql
|
|
358
|
+
-- Limit table size (keep last 7 days)
|
|
359
|
+
CREATE TABLE user_stats (
|
|
360
|
+
user_id BIGINT PRIMARY KEY,
|
|
361
|
+
click_count BIGINT
|
|
362
|
+
) WITH (
|
|
363
|
+
kafka_topic='user_stats',
|
|
364
|
+
retention_ms=604800000 -- 7 days
|
|
365
|
+
);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Performance Optimization
|
|
369
|
+
|
|
370
|
+
### 1. Partition Alignment
|
|
371
|
+
|
|
372
|
+
**Ensure joined streams/tables have same partition key**:
|
|
373
|
+
|
|
374
|
+
```sql
|
|
375
|
+
-- GOOD: Both keyed by user_id (co-partitioned)
|
|
376
|
+
CREATE STREAM clicks (user_id BIGINT KEY, ...)
|
|
377
|
+
CREATE TABLE users (user_id BIGINT PRIMARY KEY, ...)
|
|
378
|
+
|
|
379
|
+
-- Join works efficiently (no repartitioning)
|
|
380
|
+
SELECT * FROM clicks c
|
|
381
|
+
JOIN users u ON c.user_id = u.user_id;
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 2. Use Materialized Views
|
|
385
|
+
|
|
386
|
+
**Pre-compute expensive queries**:
|
|
387
|
+
|
|
388
|
+
```sql
|
|
389
|
+
-- BAD: Compute on every request
|
|
390
|
+
SELECT COUNT(*) FROM orders WHERE user_id = 123;
|
|
391
|
+
|
|
392
|
+
-- GOOD: Materialized table (instant lookup)
|
|
393
|
+
CREATE TABLE user_order_counts AS
|
|
394
|
+
SELECT user_id, COUNT(*) AS order_count
|
|
395
|
+
FROM orders GROUP BY user_id;
|
|
396
|
+
|
|
397
|
+
-- Query is now instant
|
|
398
|
+
SELECT order_count FROM user_order_counts WHERE user_id = 123;
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 3. Filter Early
|
|
402
|
+
|
|
403
|
+
```sql
|
|
404
|
+
-- GOOD: Filter before join
|
|
405
|
+
CREATE STREAM important_events AS
|
|
406
|
+
SELECT * FROM events WHERE event_type = 'purchase';
|
|
407
|
+
|
|
408
|
+
SELECT * FROM important_events e
|
|
409
|
+
JOIN users u ON e.user_id = u.user_id;
|
|
410
|
+
|
|
411
|
+
-- BAD: Join first, filter later (processes all events!)
|
|
412
|
+
SELECT * FROM events e
|
|
413
|
+
JOIN users u ON e.user_id = u.user_id
|
|
414
|
+
WHERE e.event_type = 'purchase';
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
## Common Issues & Solutions
|
|
418
|
+
|
|
419
|
+
### Issue 1: Query Timing Out
|
|
420
|
+
|
|
421
|
+
**Error**: Query timed out
|
|
422
|
+
|
|
423
|
+
**Root Cause**: Non-windowed aggregation on large stream
|
|
424
|
+
|
|
425
|
+
**Solution**: Add time window:
|
|
426
|
+
```sql
|
|
427
|
+
-- WRONG
|
|
428
|
+
SELECT COUNT(*) FROM events GROUP BY user_id;
|
|
429
|
+
|
|
430
|
+
-- RIGHT
|
|
431
|
+
SELECT COUNT(*) FROM events
|
|
432
|
+
WINDOW TUMBLING (SIZE 1 HOUR)
|
|
433
|
+
GROUP BY user_id;
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
### Issue 2: Partition Mismatch
|
|
437
|
+
|
|
438
|
+
**Error**: Cannot join streams (different partition keys)
|
|
439
|
+
|
|
440
|
+
**Solution**: Repartition stream:
|
|
441
|
+
```sql
|
|
442
|
+
-- Repartition stream by user_id
|
|
443
|
+
CREATE STREAM clicks_by_user AS
|
|
444
|
+
SELECT * FROM clicks PARTITION BY user_id;
|
|
445
|
+
|
|
446
|
+
-- Now join works
|
|
447
|
+
SELECT * FROM clicks_by_user c
|
|
448
|
+
JOIN users u ON c.user_id = u.user_id;
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Issue 3: Late-Arriving Events
|
|
452
|
+
|
|
453
|
+
**Solution**: Use grace period:
|
|
454
|
+
```sql
|
|
455
|
+
SELECT COUNT(*) FROM events
|
|
456
|
+
WINDOW TUMBLING (SIZE 5 MINUTES, GRACE PERIOD 1 MINUTE)
|
|
457
|
+
GROUP BY user_id;
|
|
458
|
+
-- Accepts events up to 1 minute late
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
## References
|
|
462
|
+
|
|
463
|
+
- ksqlDB Documentation: https://docs.ksqldb.io/
|
|
464
|
+
- ksqlDB Tutorials: https://kafka-tutorials.confluent.io/
|
|
465
|
+
- Windowing Guide: https://docs.ksqldb.io/en/latest/concepts/time-and-windows-in-ksqldb-queries/
|
|
466
|
+
- Join Types: https://docs.ksqldb.io/en/latest/developer-guide/joins/
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
**Invoke me when you need stream processing, real-time analytics, or SQL-like queries on Kafka!**
|