specweave 0.18.1 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +229 -1817
- package/README.md +68 -0
- package/bin/specweave.js +62 -6
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
- package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
- package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +7 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +42 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
- package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
- package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
- package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
- package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
- package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +8 -6
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +78 -117
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
- package/dist/src/cli/commands/import-docs.js +4 -4
- package/dist/src/cli/commands/import-docs.js.map +1 -1
- package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/init-multiproject.js +17 -18
- package/dist/src/cli/commands/init-multiproject.js.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
- package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
- package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
- package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
- package/dist/src/cli/commands/switch-project.js +9 -26
- package/dist/src/cli/commands/switch-project.js.map +1 -1
- package/dist/src/cli/commands/sync-spec-content.js +3 -0
- package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
- package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
- package/dist/src/core/increment/active-increment-manager.js +113 -46
- package/dist/src/core/increment/active-increment-manager.js.map +1 -1
- package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
- package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/increment/conflict-resolver.js +219 -0
- package/dist/src/core/increment/conflict-resolver.js.map +1 -0
- package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
- package/dist/src/core/increment/discipline-checker.js +7 -1
- package/dist/src/core/increment/discipline-checker.js.map +1 -1
- package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
- package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
- package/dist/src/core/increment/duplicate-detector.js +276 -0
- package/dist/src/core/increment/duplicate-detector.js.map +1 -0
- package/dist/src/core/increment/increment-archiver.d.ts +90 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
- package/dist/src/core/increment/increment-archiver.js +368 -0
- package/dist/src/core/increment/increment-archiver.js.map +1 -0
- package/dist/src/core/increment/increment-reopener.d.ts +165 -0
- package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
- package/dist/src/core/increment/increment-reopener.js +390 -0
- package/dist/src/core/increment/increment-reopener.js.map +1 -0
- package/dist/src/core/increment/metadata-manager.d.ts +26 -1
- package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
- package/dist/src/core/increment/metadata-manager.js +143 -5
- package/dist/src/core/increment/metadata-manager.js.map +1 -1
- package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
- package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
- package/dist/src/core/increment/recent-work-scanner.js +303 -0
- package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
- package/dist/src/core/increment/types.d.ts +1 -0
- package/dist/src/core/increment/types.d.ts.map +1 -1
- package/dist/src/core/increment-utils.d.ts +112 -0
- package/dist/src/core/increment-utils.d.ts.map +1 -0
- package/dist/src/core/increment-utils.js +210 -0
- package/dist/src/core/increment-utils.js.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
- package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-archiver.js +549 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
- package/dist/src/core/living-docs/feature-id-manager.js +339 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
- package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
- package/dist/src/core/living-docs/index.d.ts +6 -0
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +6 -0
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/project-detector.d.ts +6 -0
- package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
- package/dist/src/core/living-docs/project-detector.js +35 -1
- package/dist/src/core/living-docs/project-detector.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.js +1275 -258
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
- package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
- package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +143 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -1
- package/dist/src/core/project-manager.d.ts +2 -17
- package/dist/src/core/project-manager.d.ts.map +1 -1
- package/dist/src/core/project-manager.js +68 -48
- package/dist/src/core/project-manager.js.map +1 -1
- package/dist/src/core/spec-content-sync.d.ts +1 -1
- package/dist/src/core/spec-content-sync.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
- package/dist/src/core/sync/enhanced-content-builder.js +2 -1
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
- package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
- package/dist/src/core/sync/performance-optimizer.js +220 -0
- package/dist/src/core/sync/performance-optimizer.js.map +1 -0
- package/dist/src/core/sync/retry-handler.d.ts +98 -0
- package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
- package/dist/src/core/sync/retry-handler.js +196 -0
- package/dist/src/core/sync/retry-handler.js.map +1 -0
- package/dist/src/core/types/config.d.ts +94 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +16 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +6 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js +10 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-mapper.js +4 -8
- package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/COMMANDS.md +13 -4
- package/plugins/specweave/commands/specweave-abandon.md +22 -20
- package/plugins/specweave/commands/specweave-archive-features.md +121 -0
- package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
- package/plugins/specweave/commands/specweave-archive.md +363 -0
- package/plugins/specweave/commands/specweave-backlog.md +211 -0
- package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
- package/plugins/specweave/commands/specweave-increment.md +4 -3
- package/plugins/specweave/commands/specweave-progress.md +176 -27
- package/plugins/specweave/commands/specweave-reopen.md +391 -0
- package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
- package/plugins/specweave/commands/specweave-restore.md +309 -0
- package/plugins/specweave/commands/specweave-resume.md +51 -23
- package/plugins/specweave/commands/specweave-status.md +41 -7
- package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/post-task-completion.sh +39 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
- package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
- package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
- package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
- package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
- package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-confluent/README.md +375 -0
- package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
- package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
- package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
- package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
- package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
- package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +10 -9
- package/plugins/specweave-github/lib/completion-calculator.js +262 -0
- package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
- package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
- package/plugins/specweave-github/lib/epic-content-builder.js +38 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +59 -0
- package/plugins/specweave-github/lib/github-client-v2.js +49 -0
- package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
- package/plugins/specweave-github/lib/github-epic-sync.ts +1 -1
- package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
- package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
- package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
- package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
- package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
- package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
- package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
- package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
- package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
- package/plugins/{specweave-ado/lib/enhanced-ado-sync.js → specweave-jira/lib/enhanced-jira-sync.js} +25 -61
- package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
- package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
- package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
- package/plugins/specweave-kafka/README.md +242 -0
- package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
- package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
- package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
- package/plugins/specweave-kafka/commands/deploy.md +99 -0
- package/plugins/specweave-kafka/commands/dev-env.md +176 -0
- package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
- package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
- package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
- package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
- package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
- package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
- package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
- package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
- package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
- package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
- package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
- package/plugins/specweave-kafka/lib/cli/types.js +10 -0
- package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
- package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
- package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
- package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
- package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
- package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
- package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
- package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
- package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
- package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
- package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
- package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
- package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
- package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
- package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
- package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
- package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
- package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
- package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
- package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
- package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
- package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
- package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
- package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
- package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
- package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
- package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
- package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
- package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
- package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
- package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
- package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
- package/plugins/specweave-kafka/package.json +41 -0
- package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
- package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
- package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
- package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
- package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
- package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
- package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
- package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
- package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
- package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
- package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
- package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
- package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
- package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
- package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
- package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
- package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
- package/plugins/specweave-kafka/tsconfig.json +21 -0
- package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
- package/plugins/specweave-kafka-streams/README.md +310 -0
- package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
- package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
- package/plugins/specweave-n8n/README.md +354 -0
- package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +601 -7
- package/src/templates/CLAUDE.md.template +188 -88
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +0 -108
- package/dist/locales/en/cli.json +0 -287
- package/dist/locales/en/errors.json +0 -7
- package/dist/locales/en/templates.json +0 -6
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +0 -41
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +0 -108
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +0 -108
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +0 -108
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +0 -108
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +0 -269
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +0 -108
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +0 -25
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -191
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +0 -1
- package/dist/spec-parser.js +0 -629
- package/dist/src/core/sync/spec-content-sync.d.ts +0 -88
- package/dist/src/core/sync/spec-content-sync.d.ts.map +0 -1
- package/dist/src/core/sync/spec-content-sync.js +0 -5
- package/dist/src/core/sync/spec-content-sync.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
- package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
- package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: n8n-kafka-workflows
|
|
3
|
+
description: n8n workflow automation with Kafka integration expert. Covers Kafka trigger node, producer node, event-driven workflows, error handling, retries, and no-code/low-code event processing patterns. Activates for n8n kafka, kafka trigger, kafka producer, n8n workflows, event-driven automation, no-code kafka, workflow patterns.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# n8n Kafka Workflows Skill
|
|
7
|
+
|
|
8
|
+
Expert knowledge of integrating Apache Kafka with n8n workflow automation platform for no-code/low-code event-driven processing.
|
|
9
|
+
|
|
10
|
+
## What I Know
|
|
11
|
+
|
|
12
|
+
### n8n Kafka Nodes
|
|
13
|
+
|
|
14
|
+
**Kafka Trigger Node** (Event Consumer):
|
|
15
|
+
- Triggers workflow on new Kafka messages
|
|
16
|
+
- Supports consumer groups
|
|
17
|
+
- Auto-commit or manual offset management
|
|
18
|
+
- Multiple topic subscription
|
|
19
|
+
- Message batching
|
|
20
|
+
|
|
21
|
+
**Kafka Producer Node** (Event Publisher):
|
|
22
|
+
- Sends messages to Kafka topics
|
|
23
|
+
- Supports key-based partitioning
|
|
24
|
+
- Header support
|
|
25
|
+
- Compression (gzip, snappy, lz4)
|
|
26
|
+
- Batch sending
|
|
27
|
+
|
|
28
|
+
**Configuration**:
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"credentials": {
|
|
32
|
+
"kafkaApi": {
|
|
33
|
+
"brokers": "localhost:9092",
|
|
34
|
+
"clientId": "n8n-workflow",
|
|
35
|
+
"ssl": false,
|
|
36
|
+
"sasl": {
|
|
37
|
+
"mechanism": "plain",
|
|
38
|
+
"username": "{{$env.KAFKA_USER}}",
|
|
39
|
+
"password": "{{$env.KAFKA_PASSWORD}}"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## When to Use This Skill
|
|
47
|
+
|
|
48
|
+
Activate me when you need help with:
|
|
49
|
+
- n8n Kafka setup ("Configure Kafka trigger in n8n")
|
|
50
|
+
- Workflow patterns ("Event-driven automation with n8n")
|
|
51
|
+
- Error handling ("Retry failed Kafka messages")
|
|
52
|
+
- Integration patterns ("Enrich Kafka events with HTTP API")
|
|
53
|
+
- Producer configuration ("Send messages to Kafka from n8n")
|
|
54
|
+
- Consumer groups ("Process Kafka events in parallel")
|
|
55
|
+
|
|
56
|
+
## Common Workflow Patterns
|
|
57
|
+
|
|
58
|
+
### Pattern 1: Event-Driven Processing
|
|
59
|
+
|
|
60
|
+
**Use Case**: Process Kafka events with HTTP API enrichment
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
[Kafka Trigger] → [HTTP Request] → [Transform] → [Database]
|
|
64
|
+
↓
|
|
65
|
+
orders topic
|
|
66
|
+
↓
|
|
67
|
+
Get customer data
|
|
68
|
+
↓
|
|
69
|
+
Merge order + customer
|
|
70
|
+
↓
|
|
71
|
+
Save to PostgreSQL
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**n8n Workflow**:
|
|
75
|
+
1. **Kafka Trigger**:
|
|
76
|
+
- Topic: `orders`
|
|
77
|
+
- Consumer Group: `order-processor`
|
|
78
|
+
- Offset: `latest`
|
|
79
|
+
|
|
80
|
+
2. **HTTP Request** (Enrich):
|
|
81
|
+
- URL: `https://api.example.com/customers/{{$json.customerId}}`
|
|
82
|
+
- Method: GET
|
|
83
|
+
- Headers: `Authorization: Bearer {{$env.API_TOKEN}}`
|
|
84
|
+
|
|
85
|
+
3. **Set Node** (Transform):
|
|
86
|
+
```javascript
|
|
87
|
+
return {
|
|
88
|
+
orderId: $json.order.id,
|
|
89
|
+
customerId: $json.order.customerId,
|
|
90
|
+
customerName: $json.customer.name,
|
|
91
|
+
customerEmail: $json.customer.email,
|
|
92
|
+
total: $json.order.total,
|
|
93
|
+
timestamp: new Date().toISOString()
|
|
94
|
+
};
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
4. **PostgreSQL** (Save):
|
|
98
|
+
- Operation: INSERT
|
|
99
|
+
- Table: `enriched_orders`
|
|
100
|
+
- Columns: Mapped from Set node
|
|
101
|
+
|
|
102
|
+
### Pattern 2: Fan-Out (Publish to Multiple Topics)
|
|
103
|
+
|
|
104
|
+
**Use Case**: Single event triggers multiple downstream workflows
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
[Kafka Trigger] → [Switch] → [Kafka Producer] (topic: high-value-orders)
|
|
108
|
+
↓ ↓
|
|
109
|
+
orders topic └─→ [Kafka Producer] (topic: all-orders)
|
|
110
|
+
└─→ [Kafka Producer] (topic: analytics)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**n8n Workflow**:
|
|
114
|
+
1. **Kafka Trigger**: Consume `orders`
|
|
115
|
+
2. **Switch Node**: Route by `total` value
|
|
116
|
+
- Route 1: `total > 1000` → `high-value-orders` topic
|
|
117
|
+
- Route 2: Always → `all-orders` topic
|
|
118
|
+
- Route 3: Always → `analytics` topic
|
|
119
|
+
3. **Kafka Producer** (x3): Send to respective topics
|
|
120
|
+
|
|
121
|
+
### Pattern 3: Retry with Dead Letter Queue (DLQ)
|
|
122
|
+
|
|
123
|
+
**Use Case**: Retry failed messages, send to DLQ after 3 attempts
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
[Kafka Trigger] → [Try/Catch] → [Success] → [Kafka Producer] (topic: processed)
|
|
127
|
+
↓ ↓
|
|
128
|
+
input topic [Catch Error]
|
|
129
|
+
↓
|
|
130
|
+
[Increment Retry Count]
|
|
131
|
+
↓
|
|
132
|
+
[If Retry < 3]
|
|
133
|
+
↓ Yes
|
|
134
|
+
[Kafka Producer] (topic: input-retry)
|
|
135
|
+
↓ No
|
|
136
|
+
[Kafka Producer] (topic: dlq)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**n8n Workflow**:
|
|
140
|
+
1. **Kafka Trigger**: `input` topic
|
|
141
|
+
2. **Try Node**: HTTP Request (may fail)
|
|
142
|
+
3. **Catch Node** (Error Handler):
|
|
143
|
+
- Get retry count from message headers
|
|
144
|
+
- Increment retry count
|
|
145
|
+
- If retry < 3: Send to `input-retry` topic
|
|
146
|
+
- Else: Send to `dlq` topic
|
|
147
|
+
|
|
148
|
+
### Pattern 4: Batch Processing with Aggregation
|
|
149
|
+
|
|
150
|
+
**Use Case**: Aggregate 100 events, send batch to API
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
[Kafka Trigger] → [Aggregate] → [HTTP Request] → [Kafka Producer]
|
|
154
|
+
↓ ↓
|
|
155
|
+
events topic Buffer 100 msgs
|
|
156
|
+
↓
|
|
157
|
+
Send batch to API
|
|
158
|
+
↓
|
|
159
|
+
Publish results
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**n8n Workflow**:
|
|
163
|
+
1. **Kafka Trigger**: Enable batching (100 messages)
|
|
164
|
+
2. **Aggregate Node**: Combine into array
|
|
165
|
+
3. **HTTP Request**: POST batch
|
|
166
|
+
4. **Kafka Producer**: Send results
|
|
167
|
+
|
|
168
|
+
### Pattern 5: Change Data Capture (CDC) to Kafka
|
|
169
|
+
|
|
170
|
+
**Use Case**: Stream database changes to Kafka
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
[Cron Trigger] → [PostgreSQL] → [Compare] → [Kafka Producer]
|
|
174
|
+
↓ ↓ ↓
|
|
175
|
+
Every 1 min Get new rows Find diffs
|
|
176
|
+
↓
|
|
177
|
+
Publish changes
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**n8n Workflow**:
|
|
181
|
+
1. **Cron**: Every 1 minute
|
|
182
|
+
2. **PostgreSQL**: SELECT new rows (WHERE updated_at > last_run)
|
|
183
|
+
3. **Function Node**: Detect changes (INSERT/UPDATE/DELETE)
|
|
184
|
+
4. **Kafka Producer**: Send CDC events
|
|
185
|
+
|
|
186
|
+
## Best Practices
|
|
187
|
+
|
|
188
|
+
### 1. Use Consumer Groups for Parallel Processing
|
|
189
|
+
|
|
190
|
+
✅ **DO**:
|
|
191
|
+
```
|
|
192
|
+
Workflow Instance 1:
|
|
193
|
+
Consumer Group: order-processor
|
|
194
|
+
Partition: 0, 1, 2
|
|
195
|
+
|
|
196
|
+
Workflow Instance 2:
|
|
197
|
+
Consumer Group: order-processor
|
|
198
|
+
Partition: 3, 4, 5
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
❌ **DON'T**:
|
|
202
|
+
```
|
|
203
|
+
// WRONG: No consumer group (all instances get all messages!)
|
|
204
|
+
Consumer Group: (empty)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 2. Handle Errors with Try/Catch
|
|
208
|
+
|
|
209
|
+
✅ **DO**:
|
|
210
|
+
```
|
|
211
|
+
[Kafka Trigger]
|
|
212
|
+
↓
|
|
213
|
+
[Try] → [HTTP Request] → [Success Handler]
|
|
214
|
+
↓
|
|
215
|
+
[Catch] → [Error Handler] → [Kafka DLQ]
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
❌ **DON'T**:
|
|
219
|
+
```
|
|
220
|
+
// WRONG: No error handling (workflow crashes on failure!)
|
|
221
|
+
[Kafka Trigger] → [HTTP Request] → [Database]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 3. Use Environment Variables for Credentials
|
|
225
|
+
|
|
226
|
+
✅ **DO**:
|
|
227
|
+
```
|
|
228
|
+
Kafka Brokers: {{$env.KAFKA_BROKERS}}
|
|
229
|
+
SASL Username: {{$env.KAFKA_USER}}
|
|
230
|
+
SASL Password: {{$env.KAFKA_PASSWORD}}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
❌ **DON'T**:
|
|
234
|
+
```
|
|
235
|
+
// WRONG: Hardcoded credentials in workflow!
|
|
236
|
+
Kafka Brokers: "localhost:9092"
|
|
237
|
+
SASL Username: "admin"
|
|
238
|
+
SASL Password: "admin-secret"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 4. Set Explicit Partitioning Keys
|
|
242
|
+
|
|
243
|
+
✅ **DO**:
|
|
244
|
+
```
|
|
245
|
+
Kafka Producer:
|
|
246
|
+
Topic: orders
|
|
247
|
+
Key: {{$json.customerId}} // Partition by customer
|
|
248
|
+
Message: {{$json}}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
❌ **DON'T**:
|
|
252
|
+
```
|
|
253
|
+
// WRONG: No key (random partitioning!)
|
|
254
|
+
Kafka Producer:
|
|
255
|
+
Topic: orders
|
|
256
|
+
Message: {{$json}}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### 5. Monitor Consumer Lag
|
|
260
|
+
|
|
261
|
+
**Setup Prometheus metrics export**:
|
|
262
|
+
```
|
|
263
|
+
[Cron Trigger] → [Kafka Admin] → [Get Consumer Lag] → [Prometheus]
|
|
264
|
+
↓ ↓ ↓
|
|
265
|
+
Every 30s List consumer groups Calculate lag
|
|
266
|
+
↓
|
|
267
|
+
Push to Pushgateway
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Error Handling Strategies
|
|
271
|
+
|
|
272
|
+
### Strategy 1: Exponential Backoff Retry
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
// Function Node (Calculate Backoff)
|
|
276
|
+
const retryCount = $json.headers?.['retry-count'] || 0;
|
|
277
|
+
const backoffMs = Math.min(1000 * Math.pow(2, retryCount), 60000); // Max 60 seconds
|
|
278
|
+
|
|
279
|
+
return {
|
|
280
|
+
retryCount: retryCount + 1,
|
|
281
|
+
backoffMs,
|
|
282
|
+
nextRetryAt: new Date(Date.now() + backoffMs).toISOString()
|
|
283
|
+
};
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Workflow**:
|
|
287
|
+
1. Try processing
|
|
288
|
+
2. On failure: Calculate backoff
|
|
289
|
+
3. Wait (using Wait node)
|
|
290
|
+
4. Retry (send to retry topic)
|
|
291
|
+
5. If max retries reached: Send to DLQ
|
|
292
|
+
|
|
293
|
+
### Strategy 2: Circuit Breaker
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
// Function Node (Check Failure Rate)
|
|
297
|
+
const failures = $json.metrics.failures || 0;
|
|
298
|
+
const total = $json.metrics.total || 1;
|
|
299
|
+
const failureRate = failures / total;
|
|
300
|
+
|
|
301
|
+
if (failureRate > 0.5) {
|
|
302
|
+
// Circuit open (too many failures)
|
|
303
|
+
return { circuitState: 'OPEN', skipProcessing: true };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return { circuitState: 'CLOSED', skipProcessing: false };
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Workflow**:
|
|
310
|
+
1. Track success/failure metrics
|
|
311
|
+
2. Calculate failure rate
|
|
312
|
+
3. If >50% failures: Open circuit (stop processing)
|
|
313
|
+
4. Wait 30 seconds
|
|
314
|
+
5. Try single request (half-open)
|
|
315
|
+
6. If success: Close circuit (resume)
|
|
316
|
+
|
|
317
|
+
### Strategy 3: Idempotent Processing
|
|
318
|
+
|
|
319
|
+
```javascript
|
|
320
|
+
// Function Node (Deduplication)
|
|
321
|
+
const messageId = $json.headers?.['message-id'];
|
|
322
|
+
const cache = $('Redis').get(messageId);
|
|
323
|
+
|
|
324
|
+
if (cache) {
|
|
325
|
+
// Already processed, skip
|
|
326
|
+
return { skip: true, reason: 'duplicate' };
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Process and cache
|
|
330
|
+
await $('Redis').set(messageId, 'processed', { ttl: 3600 });
|
|
331
|
+
return { skip: false };
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Workflow**:
|
|
335
|
+
1. Extract message ID
|
|
336
|
+
2. Check Redis cache
|
|
337
|
+
3. If exists: Skip processing
|
|
338
|
+
4. Process message
|
|
339
|
+
5. Store message ID in cache (1 hour TTL)
|
|
340
|
+
|
|
341
|
+
## Performance Optimization
|
|
342
|
+
|
|
343
|
+
### 1. Batch Processing
|
|
344
|
+
|
|
345
|
+
**Enable batching in Kafka Trigger**:
|
|
346
|
+
```
|
|
347
|
+
Kafka Trigger:
|
|
348
|
+
Batch Size: 100
|
|
349
|
+
Batch Timeout: 5000ms // Max wait 5 seconds
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Process batch**:
|
|
353
|
+
```javascript
|
|
354
|
+
// Function Node (Batch Transform)
|
|
355
|
+
const events = $input.all();
|
|
356
|
+
const transformed = events.map(event => ({
|
|
357
|
+
id: event.json.id,
|
|
358
|
+
timestamp: event.json.timestamp,
|
|
359
|
+
processed: true
|
|
360
|
+
}));
|
|
361
|
+
|
|
362
|
+
return transformed;
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### 2. Parallel Processing with Split in Batches
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
[Kafka Trigger] → [Split in Batches] → [HTTP Request] → [Aggregate]
|
|
369
|
+
↓ ↓ ↓
|
|
370
|
+
1000 events 100 at a time Parallel API calls
|
|
371
|
+
↓
|
|
372
|
+
Combine results
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### 3. Use Compression
|
|
376
|
+
|
|
377
|
+
**Kafka Producer**:
|
|
378
|
+
```
|
|
379
|
+
Compression: lz4 // Or gzip, snappy
|
|
380
|
+
Batch Size: 1000 // Larger batches = better compression
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Integration Patterns
|
|
384
|
+
|
|
385
|
+
### Pattern 1: Kafka + HTTP API Enrichment
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
[Kafka Trigger] → [HTTP Request] → [Transform] → [Kafka Producer]
|
|
389
|
+
↓ ↓ ↓
|
|
390
|
+
Raw events Enrich from API Combine data
|
|
391
|
+
↓
|
|
392
|
+
Publish enriched
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Pattern 2: Kafka + Database Sync
|
|
396
|
+
|
|
397
|
+
```
|
|
398
|
+
[Kafka Trigger] → [PostgreSQL Upsert] → [Kafka Producer]
|
|
399
|
+
↓ ↓ ↓
|
|
400
|
+
CDC events Update database Publish success/failure
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Pattern 3: Kafka + Email Notifications
|
|
404
|
+
|
|
405
|
+
```
|
|
406
|
+
[Kafka Trigger] → [If Critical] → [Send Email] → [Kafka Producer]
|
|
407
|
+
↓ ↓ ↓
|
|
408
|
+
Alerts severity=critical Notify admin
|
|
409
|
+
↓
|
|
410
|
+
Publish alert sent
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Pattern 4: Kafka + Slack Alerts
|
|
414
|
+
|
|
415
|
+
```
|
|
416
|
+
[Kafka Trigger] → [Transform] → [Slack] → [Kafka Producer]
|
|
417
|
+
↓ ↓ ↓
|
|
418
|
+
Errors Format message Send to #alerts
|
|
419
|
+
↓
|
|
420
|
+
Publish notification
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Testing n8n Workflows
|
|
424
|
+
|
|
425
|
+
### Manual Testing
|
|
426
|
+
|
|
427
|
+
1. **Test with Sample Data**:
|
|
428
|
+
- Right-click node → "Add Sample Data"
|
|
429
|
+
- Execute workflow
|
|
430
|
+
- Check outputs
|
|
431
|
+
|
|
432
|
+
2. **Test Kafka Producer**:
|
|
433
|
+
```bash
|
|
434
|
+
# Consume test topic
|
|
435
|
+
kcat -C -b localhost:9092 -t test-output -o beginning
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
3. **Test Kafka Trigger**:
|
|
439
|
+
```bash
|
|
440
|
+
# Produce test message
|
|
441
|
+
echo '{"test": "data"}' | kcat -P -b localhost:9092 -t test-input
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Automated Testing
|
|
445
|
+
|
|
446
|
+
**n8n CLI**:
|
|
447
|
+
```bash
|
|
448
|
+
# Execute workflow with input
|
|
449
|
+
n8n execute workflow --file workflow.json --input data.json
|
|
450
|
+
|
|
451
|
+
# Export workflow
|
|
452
|
+
n8n export:workflow --id=123 --output=workflow.json
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
## Common Issues & Solutions
|
|
456
|
+
|
|
457
|
+
### Issue 1: Consumer Lag Building Up
|
|
458
|
+
|
|
459
|
+
**Symptoms**: Processing slower than message arrival
|
|
460
|
+
|
|
461
|
+
**Solutions**:
|
|
462
|
+
1. Increase consumer group size (parallel processing)
|
|
463
|
+
2. Enable batching (process 100 messages at once)
|
|
464
|
+
3. Optimize HTTP requests (use connection pooling)
|
|
465
|
+
4. Use Split in Batches for parallel processing
|
|
466
|
+
|
|
467
|
+
### Issue 2: Duplicate Messages
|
|
468
|
+
|
|
469
|
+
**Cause**: At-least-once delivery, no deduplication
|
|
470
|
+
|
|
471
|
+
**Solution**: Add idempotency check:
|
|
472
|
+
```javascript
|
|
473
|
+
// Check if message already processed
|
|
474
|
+
const messageId = $json.headers?.['message-id'];
|
|
475
|
+
const exists = await $('Redis').exists(messageId);
|
|
476
|
+
|
|
477
|
+
if (exists) {
|
|
478
|
+
return { skip: true };
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### Issue 3: Workflow Execution Timeout
|
|
483
|
+
|
|
484
|
+
**Cause**: Long-running HTTP requests
|
|
485
|
+
|
|
486
|
+
**Solution**: Use async patterns:
|
|
487
|
+
```
|
|
488
|
+
[Kafka Trigger] → [Webhook] → [Wait for Webhook] → [Process Response]
|
|
489
|
+
↓ ↓
|
|
490
|
+
Trigger job Async callback
|
|
491
|
+
↓
|
|
492
|
+
Continue workflow
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
## References
|
|
496
|
+
|
|
497
|
+
- n8n Kafka Trigger: https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.kafkatrigger/
|
|
498
|
+
- n8n Kafka Producer: https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.kafka/
|
|
499
|
+
- n8n Best Practices: https://docs.n8n.io/hosting/scaling/best-practices/
|
|
500
|
+
- Workflow Examples: https://n8n.io/workflows
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
**Invoke me when you need n8n Kafka integration, workflow automation, or event-driven no-code patterns!**
|
|
@@ -13,7 +13,7 @@ SPECWEAVE_ROOT="${SPECWEAVE_ROOT:-$(pwd)}"
|
|
|
13
13
|
METRICS_DIR="${SPECWEAVE_ROOT}/.specweave/metrics"
|
|
14
14
|
HISTORY_FILE="${METRICS_DIR}/dora-history.jsonl"
|
|
15
15
|
DASHBOARD_FILE="${SPECWEAVE_ROOT}/.specweave/docs/internal/delivery/dora-dashboard.md"
|
|
16
|
-
DORA_CALCULATOR="${SPECWEAVE_ROOT}/dist/metrics/dora-calculator.js"
|
|
16
|
+
DORA_CALCULATOR="${SPECWEAVE_ROOT}/dist/src/metrics/dora-calculator.js"
|
|
17
17
|
LATEST_FILE="${METRICS_DIR}/dora-latest.json"
|
|
18
18
|
|
|
19
19
|
# Logging
|
|
@@ -60,7 +60,7 @@ fi
|
|
|
60
60
|
|
|
61
61
|
# Step 3: Update living docs dashboard
|
|
62
62
|
log "📝 Updating DORA dashboard..."
|
|
63
|
-
DASHBOARD_GENERATOR="${SPECWEAVE_ROOT}/dist/
|
|
63
|
+
DASHBOARD_GENERATOR="${SPECWEAVE_ROOT}/dist/plugins/specweave-release/lib/dashboard-generator.js"
|
|
64
64
|
|
|
65
65
|
if [[ -f "$DASHBOARD_GENERATOR" ]]; then
|
|
66
66
|
if node "$DASHBOARD_GENERATOR"; then
|