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.
Files changed (384) hide show
  1. package/CLAUDE.md +229 -1817
  2. package/README.md +68 -0
  3. package/bin/specweave.js +62 -6
  4. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  5. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
  6. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  7. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
  8. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
  9. package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
  10. package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
  11. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
  12. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
  13. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
  14. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
  15. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
  16. package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
  17. package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
  18. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
  19. package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  20. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +7 -0
  21. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -1
  22. package/dist/plugins/specweave-github/lib/epic-content-builder.js +42 -0
  23. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -1
  24. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
  25. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  26. package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
  27. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  28. package/dist/plugins/specweave-github/lib/github-epic-sync.js +1 -1
  29. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
  30. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
  31. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
  32. package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
  33. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
  34. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  35. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
  36. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  37. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
  38. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
  39. package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
  40. package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
  41. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
  42. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
  43. package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
  44. package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
  45. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
  46. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
  47. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
  48. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
  49. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +8 -6
  50. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -1
  51. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +78 -117
  52. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -1
  53. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
  54. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
  55. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
  56. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
  57. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
  58. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
  59. package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
  60. package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
  61. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
  62. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
  63. package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
  64. package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
  65. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
  66. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
  67. package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
  68. package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
  69. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
  70. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
  71. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
  72. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
  73. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
  74. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
  75. package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
  76. package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
  77. package/dist/src/cli/commands/import-docs.js +4 -4
  78. package/dist/src/cli/commands/import-docs.js.map +1 -1
  79. package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
  80. package/dist/src/cli/commands/init-multiproject.js +17 -18
  81. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  82. package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
  83. package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
  84. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  85. package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
  86. package/dist/src/cli/commands/switch-project.js +9 -26
  87. package/dist/src/cli/commands/switch-project.js.map +1 -1
  88. package/dist/src/cli/commands/sync-spec-content.js +3 -0
  89. package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
  90. package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
  91. package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
  92. package/dist/src/core/deduplication/command-deduplicator.js +254 -0
  93. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
  94. package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
  95. package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
  96. package/dist/src/core/increment/active-increment-manager.js +113 -46
  97. package/dist/src/core/increment/active-increment-manager.js.map +1 -1
  98. package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
  99. package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
  100. package/dist/src/core/increment/conflict-resolver.js +219 -0
  101. package/dist/src/core/increment/conflict-resolver.js.map +1 -0
  102. package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
  103. package/dist/src/core/increment/discipline-checker.js +7 -1
  104. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  105. package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
  106. package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
  107. package/dist/src/core/increment/duplicate-detector.js +276 -0
  108. package/dist/src/core/increment/duplicate-detector.js.map +1 -0
  109. package/dist/src/core/increment/increment-archiver.d.ts +90 -0
  110. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
  111. package/dist/src/core/increment/increment-archiver.js +368 -0
  112. package/dist/src/core/increment/increment-archiver.js.map +1 -0
  113. package/dist/src/core/increment/increment-reopener.d.ts +165 -0
  114. package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
  115. package/dist/src/core/increment/increment-reopener.js +390 -0
  116. package/dist/src/core/increment/increment-reopener.js.map +1 -0
  117. package/dist/src/core/increment/metadata-manager.d.ts +26 -1
  118. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  119. package/dist/src/core/increment/metadata-manager.js +143 -5
  120. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  121. package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
  122. package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
  123. package/dist/src/core/increment/recent-work-scanner.js +303 -0
  124. package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
  125. package/dist/src/core/increment/types.d.ts +1 -0
  126. package/dist/src/core/increment/types.d.ts.map +1 -1
  127. package/dist/src/core/increment-utils.d.ts +112 -0
  128. package/dist/src/core/increment-utils.d.ts.map +1 -0
  129. package/dist/src/core/increment-utils.js +210 -0
  130. package/dist/src/core/increment-utils.js.map +1 -0
  131. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
  132. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
  133. package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
  134. package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
  135. package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
  136. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
  137. package/dist/src/core/living-docs/feature-archiver.js +549 -0
  138. package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
  139. package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
  140. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
  141. package/dist/src/core/living-docs/feature-id-manager.js +339 -0
  142. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
  143. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
  144. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  145. package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
  146. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  147. package/dist/src/core/living-docs/index.d.ts +6 -0
  148. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  149. package/dist/src/core/living-docs/index.js +6 -0
  150. package/dist/src/core/living-docs/index.js.map +1 -1
  151. package/dist/src/core/living-docs/project-detector.d.ts +6 -0
  152. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
  153. package/dist/src/core/living-docs/project-detector.js +35 -1
  154. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  155. package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
  156. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
  157. package/dist/src/core/living-docs/spec-distributor.js +1275 -258
  158. package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
  159. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
  160. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
  161. package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
  162. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
  163. package/dist/src/core/living-docs/types.d.ts +143 -0
  164. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  165. package/dist/src/core/project-manager.d.ts +2 -17
  166. package/dist/src/core/project-manager.d.ts.map +1 -1
  167. package/dist/src/core/project-manager.js +68 -48
  168. package/dist/src/core/project-manager.js.map +1 -1
  169. package/dist/src/core/spec-content-sync.d.ts +1 -1
  170. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  171. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
  172. package/dist/src/core/sync/enhanced-content-builder.js +2 -1
  173. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
  174. package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
  175. package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
  176. package/dist/src/core/sync/performance-optimizer.js +220 -0
  177. package/dist/src/core/sync/performance-optimizer.js.map +1 -0
  178. package/dist/src/core/sync/retry-handler.d.ts +98 -0
  179. package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
  180. package/dist/src/core/sync/retry-handler.js +196 -0
  181. package/dist/src/core/sync/retry-handler.js.map +1 -0
  182. package/dist/src/core/types/config.d.ts +94 -0
  183. package/dist/src/core/types/config.d.ts.map +1 -1
  184. package/dist/src/core/types/config.js +16 -0
  185. package/dist/src/core/types/config.js.map +1 -1
  186. package/dist/src/core/types/increment-metadata.d.ts +6 -0
  187. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  188. package/dist/src/core/types/increment-metadata.js +10 -1
  189. package/dist/src/core/types/increment-metadata.js.map +1 -1
  190. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
  191. package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
  192. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  193. package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
  194. package/dist/src/integrations/jira/jira-mapper.js +4 -8
  195. package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
  196. package/package.json +1 -1
  197. package/plugins/specweave/COMMANDS.md +13 -4
  198. package/plugins/specweave/commands/specweave-abandon.md +22 -20
  199. package/plugins/specweave/commands/specweave-archive-features.md +121 -0
  200. package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
  201. package/plugins/specweave/commands/specweave-archive.md +363 -0
  202. package/plugins/specweave/commands/specweave-backlog.md +211 -0
  203. package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
  204. package/plugins/specweave/commands/specweave-increment.md +4 -3
  205. package/plugins/specweave/commands/specweave-progress.md +176 -27
  206. package/plugins/specweave/commands/specweave-reopen.md +391 -0
  207. package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
  208. package/plugins/specweave/commands/specweave-restore.md +309 -0
  209. package/plugins/specweave/commands/specweave-resume.md +51 -23
  210. package/plugins/specweave/commands/specweave-status.md +41 -7
  211. package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
  212. package/plugins/specweave/hooks/hooks.json +4 -0
  213. package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
  214. package/plugins/specweave/hooks/post-task-completion.sh +39 -0
  215. package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
  216. package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
  217. package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
  218. package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
  219. package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
  220. package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
  221. package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
  222. package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
  223. package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
  224. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
  225. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
  226. package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
  227. package/plugins/specweave-confluent/README.md +375 -0
  228. package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
  229. package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
  230. package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
  231. package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
  232. package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
  233. package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
  234. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
  235. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
  236. package/plugins/specweave-github/hooks/post-task-completion.sh +10 -9
  237. package/plugins/specweave-github/lib/completion-calculator.js +262 -0
  238. package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
  239. package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  240. package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
  241. package/plugins/specweave-github/lib/epic-content-builder.js +38 -0
  242. package/plugins/specweave-github/lib/epic-content-builder.ts +59 -0
  243. package/plugins/specweave-github/lib/github-client-v2.js +49 -0
  244. package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
  245. package/plugins/specweave-github/lib/github-epic-sync.ts +1 -1
  246. package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
  247. package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
  248. package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
  249. package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
  250. package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
  251. package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
  252. package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
  253. package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
  254. package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
  255. package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
  256. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
  257. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
  258. package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
  259. package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
  260. package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
  261. package/plugins/specweave-kafka/README.md +242 -0
  262. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
  263. package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
  264. package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
  265. package/plugins/specweave-kafka/commands/deploy.md +99 -0
  266. package/plugins/specweave-kafka/commands/dev-env.md +176 -0
  267. package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
  268. package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
  269. package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
  270. package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
  271. package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
  272. package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
  273. package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
  274. package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
  275. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
  276. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
  277. package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
  278. package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
  279. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
  280. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
  281. package/plugins/specweave-kafka/lib/cli/types.js +10 -0
  282. package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
  283. package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
  284. package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
  285. package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
  286. package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
  287. package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
  288. package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
  289. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
  290. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
  291. package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
  292. package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
  293. package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
  294. package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
  295. package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
  296. package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
  297. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
  298. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
  299. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
  300. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
  301. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
  302. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
  303. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
  304. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
  305. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
  306. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
  307. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
  308. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
  309. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
  310. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
  311. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
  312. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
  313. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
  314. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
  315. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
  316. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
  317. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
  318. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
  319. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
  320. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
  321. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
  322. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
  323. package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
  324. package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
  325. package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
  326. package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
  327. package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
  328. package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
  329. package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
  330. package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
  331. package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
  332. package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
  333. package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
  334. package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
  335. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
  336. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
  337. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
  338. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
  339. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
  340. package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
  341. package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
  342. package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
  343. package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
  344. package/plugins/specweave-kafka/package.json +41 -0
  345. package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
  346. package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
  347. package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
  348. package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
  349. package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
  350. package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
  351. package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
  352. package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
  353. package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
  354. package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
  355. package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
  356. package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
  357. package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
  358. package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
  359. package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
  360. package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
  361. package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
  362. package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
  363. package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
  364. package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
  365. package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
  366. package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
  367. package/plugins/specweave-kafka/tsconfig.json +21 -0
  368. package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
  369. package/plugins/specweave-kafka-streams/README.md +310 -0
  370. package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
  371. package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
  372. package/plugins/specweave-n8n/README.md +354 -0
  373. package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
  374. package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
  375. package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
  376. package/src/templates/AGENTS.md.template +601 -7
  377. package/src/templates/CLAUDE.md.template +188 -88
  378. package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
  379. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
  380. package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
  381. package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
  382. package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
  383. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
  384. package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
@@ -0,0 +1,220 @@
1
+ """
2
+ Kafka Consumer Example (Python)
3
+
4
+ Install: pip install kafka-python
5
+ """
6
+
7
+ from kafka import KafkaConsumer
8
+ from kafka.errors import KafkaError
9
+ import json
10
+ import signal
11
+ import sys
12
+
13
+ # ========================================
14
+ # Configuration
15
+ # ========================================
16
+
17
+ consumer = KafkaConsumer(
18
+ 'my-topic', # Can subscribe to multiple topics
19
+ bootstrap_servers=['localhost:9092'],
20
+ client_id='my-app',
21
+ group_id='my-consumer-group',
22
+
23
+ # Deserialization
24
+ key_deserializer=lambda k: k.decode('utf-8') if k else None,
25
+ value_deserializer=lambda v: json.loads(v.decode('utf-8')),
26
+
27
+ # Offset management
28
+ auto_offset_reset='earliest', # 'earliest', 'latest', 'none'
29
+ enable_auto_commit=True,
30
+ auto_commit_interval_ms=5000,
31
+
32
+ # Performance tuning
33
+ fetch_min_bytes=1, # Minimum data to fetch
34
+ fetch_max_wait_ms=500, # Max wait time
35
+ max_poll_records=500, # Messages per poll
36
+ max_poll_interval_ms=300000, # 5 minutes
37
+
38
+ # Session management
39
+ session_timeout_ms=30000,
40
+ heartbeat_interval_ms=3000,
41
+
42
+ # Optional: SASL/SSL (for production)
43
+ # security_protocol='SASL_SSL',
44
+ # sasl_mechanism='SCRAM-SHA-512',
45
+ # sasl_plain_username='user',
46
+ # sasl_plain_password='password'
47
+ )
48
+
49
+ # ========================================
50
+ # Consumer Functions
51
+ # ========================================
52
+
53
+ def process_message(message):
54
+ """Process a single message"""
55
+ try:
56
+ print(f"""
57
+ 📨 Message received:
58
+ Topic: {message.topic}
59
+ Partition: {message.partition}
60
+ Offset: {message.offset}
61
+ Key: {message.key}
62
+ Value: {message.value}
63
+ Timestamp: {message.timestamp}
64
+ Headers: {dict(message.headers) if message.headers else {}}
65
+ """)
66
+
67
+ # Your business logic here
68
+ event_type = message.value.get('event')
69
+
70
+ if event_type == 'user_login':
71
+ handle_user_login(message.value)
72
+ elif event_type == 'order_created':
73
+ handle_order_created(message.value)
74
+ else:
75
+ print(f"Unknown event type: {event_type}")
76
+
77
+ except Exception as e:
78
+ print(f"❌ Error processing message: {e}")
79
+ # Send to dead letter queue
80
+ send_to_dlq(message, e)
81
+
82
+ def handle_user_login(data):
83
+ """Handle user login event"""
84
+ print(f"👤 User login: {data.get('userId')}")
85
+ # Update user last login time
86
+ # Send welcome email
87
+ # etc.
88
+
89
+ def handle_order_created(data):
90
+ """Handle order created event"""
91
+ print(f"🛒 Order created: {data}")
92
+ # Process order
93
+ # Send confirmation email
94
+ # Update inventory
95
+
96
+ def send_to_dlq(message, error):
97
+ """Send failed message to dead letter queue"""
98
+ from kafka import KafkaProducer
99
+ import json
100
+
101
+ producer = KafkaProducer(
102
+ bootstrap_servers=['localhost:9092'],
103
+ value_serializer=lambda v: json.dumps(v).encode('utf-8')
104
+ )
105
+
106
+ dlq_message = {
107
+ 'original_topic': message.topic,
108
+ 'original_partition': message.partition,
109
+ 'original_offset': message.offset,
110
+ 'original_key': message.key,
111
+ 'original_value': message.value,
112
+ 'error_message': str(error),
113
+ 'failed_at': int(time.time() * 1000)
114
+ }
115
+
116
+ producer.send('my-topic-dlq', value=dlq_message)
117
+ producer.flush()
118
+ producer.close()
119
+
120
+ print("📮 Message sent to DLQ")
121
+
122
+ # ========================================
123
+ # Consume Methods
124
+ # ========================================
125
+
126
+ def consume_simple():
127
+ """Simple consume loop"""
128
+ print("📡 Consumer connected (simple mode)")
129
+
130
+ try:
131
+ for message in consumer:
132
+ process_message(message)
133
+ except KeyboardInterrupt:
134
+ pass
135
+ finally:
136
+ consumer.close()
137
+ print("👋 Consumer disconnected")
138
+
139
+ def consume_batch():
140
+ """Consume messages in batches"""
141
+ print("📡 Consumer connected (batch mode)")
142
+
143
+ try:
144
+ while True:
145
+ # Poll for messages (returns a dict of topic partition to records)
146
+ message_batch = consumer.poll(timeout_ms=1000, max_records=100)
147
+
148
+ if not message_batch:
149
+ continue
150
+
151
+ for topic_partition, messages in message_batch.items():
152
+ print(f"📦 Processing batch: {len(messages)} messages "
153
+ f"from {topic_partition.topic} partition {topic_partition.partition}")
154
+
155
+ for message in messages:
156
+ process_message(message)
157
+
158
+ # Commit offsets after processing batch
159
+ consumer.commit()
160
+
161
+ except KeyboardInterrupt:
162
+ pass
163
+ finally:
164
+ consumer.close()
165
+ print("👋 Consumer disconnected")
166
+
167
+ def consume_manual_commit():
168
+ """Consume with manual offset management"""
169
+ print("📡 Consumer connected (manual commit)")
170
+
171
+ # Disable auto-commit
172
+ consumer._config['enable_auto_commit'] = False
173
+
174
+ try:
175
+ for message in consumer:
176
+ try:
177
+ process_message(message)
178
+
179
+ # Manual commit after successful processing
180
+ consumer.commit()
181
+
182
+ except Exception as e:
183
+ print(f"❌ Error processing, skipping commit: {e}")
184
+ # Don't commit offset, message will be redelivered
185
+
186
+ except KeyboardInterrupt:
187
+ pass
188
+ finally:
189
+ consumer.close()
190
+ print("👋 Consumer disconnected")
191
+
192
+ # ========================================
193
+ # Main Function
194
+ # ========================================
195
+
196
+ def main():
197
+ # Choose consumption method
198
+ # consume_simple()
199
+ # consume_batch()
200
+ consume_simple()
201
+
202
+ # ========================================
203
+ # Graceful Shutdown
204
+ # ========================================
205
+
206
+ def signal_handler(sig, frame):
207
+ print('\n🛑 Shutting down consumer...')
208
+ consumer.close()
209
+ sys.exit(0)
210
+
211
+ signal.signal(signal.SIGINT, signal_handler)
212
+ signal.signal(signal.SIGTERM, signal_handler)
213
+
214
+ # ========================================
215
+ # Run
216
+ # ========================================
217
+
218
+ if __name__ == '__main__':
219
+ import time
220
+ main()
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Kafka Producer Example (Node.js)
3
+ *
4
+ * Install: npm install kafkajs
5
+ */
6
+
7
+ const { Kafka, CompressionTypes, logLevel } = require('kafkajs');
8
+
9
+ // ========================================
10
+ // Configuration
11
+ // ========================================
12
+
13
+ const kafka = new Kafka({
14
+ clientId: 'my-app',
15
+ brokers: ['localhost:9092'],
16
+
17
+ // Optional: Logging
18
+ logLevel: logLevel.INFO,
19
+
20
+ // Optional: SASL/SSL (for production)
21
+ // ssl: true,
22
+ // sasl: {
23
+ // mechanism: 'scram-sha-512',
24
+ // username: 'user',
25
+ // password: 'password'
26
+ // }
27
+ });
28
+
29
+ const producer = kafka.producer({
30
+ // Performance tuning
31
+ allowAutoTopicCreation: true,
32
+ transactionTimeout: 30000,
33
+
34
+ // Batching for throughput
35
+ compression: CompressionTypes.LZ4,
36
+ batch: {
37
+ size: 16384, // 16 KB
38
+ lingerMs: 10 // Wait 10ms to batch
39
+ },
40
+
41
+ // Idempotence (exactly-once semantics)
42
+ idempotent: true,
43
+ maxInFlightRequests: 5,
44
+
45
+ // Acknowledgment
46
+ acks: 1 // 0 = none, 1 = leader, -1/all = all replicas
47
+ });
48
+
49
+ // ========================================
50
+ // Producer Functions
51
+ // ========================================
52
+
53
+ async function produceMessage(topic, key, value) {
54
+ try {
55
+ const result = await producer.send({
56
+ topic,
57
+ messages: [
58
+ {
59
+ key,
60
+ value: JSON.stringify(value),
61
+ headers: {
62
+ 'source': 'my-app',
63
+ 'timestamp': Date.now().toString()
64
+ }
65
+ }
66
+ ]
67
+ });
68
+
69
+ console.log('✅ Message sent:', result);
70
+ return result;
71
+ } catch (error) {
72
+ console.error('❌ Error producing message:', error);
73
+ throw error;
74
+ }
75
+ }
76
+
77
+ async function produceBatch(topic, messages) {
78
+ try {
79
+ const kafkaMessages = messages.map(msg => ({
80
+ key: msg.key,
81
+ value: JSON.stringify(msg.value),
82
+ headers: {
83
+ 'source': 'my-app',
84
+ 'timestamp': Date.now().toString()
85
+ }
86
+ }));
87
+
88
+ const result = await producer.send({
89
+ topic,
90
+ messages: kafkaMessages
91
+ });
92
+
93
+ console.log(`✅ ${messages.length} messages sent:`, result);
94
+ return result;
95
+ } catch (error) {
96
+ console.error('❌ Error producing batch:', error);
97
+ throw error;
98
+ }
99
+ }
100
+
101
+ // Transactional producer (exactly-once semantics)
102
+ async function produceTransactional(topic, messages) {
103
+ const transaction = await producer.transaction();
104
+
105
+ try {
106
+ const kafkaMessages = messages.map(msg => ({
107
+ key: msg.key,
108
+ value: JSON.stringify(msg.value)
109
+ }));
110
+
111
+ await transaction.send({
112
+ topic,
113
+ messages: kafkaMessages
114
+ });
115
+
116
+ await transaction.commit();
117
+ console.log('✅ Transaction committed');
118
+ } catch (error) {
119
+ await transaction.abort();
120
+ console.error('❌ Transaction aborted:', error);
121
+ throw error;
122
+ }
123
+ }
124
+
125
+ // ========================================
126
+ // Main Function
127
+ // ========================================
128
+
129
+ async function main() {
130
+ await producer.connect();
131
+ console.log('📡 Producer connected');
132
+
133
+ // Example 1: Single message
134
+ await produceMessage('my-topic', 'user-123', {
135
+ event: 'user_login',
136
+ userId: 'user-123',
137
+ timestamp: Date.now()
138
+ });
139
+
140
+ // Example 2: Batch of messages
141
+ await produceBatch('my-topic', [
142
+ { key: 'user-123', value: { event: 'page_view', page: '/home' } },
143
+ { key: 'user-124', value: { event: 'page_view', page: '/products' } },
144
+ { key: 'user-125', value: { event: 'page_view', page: '/checkout' } }
145
+ ]);
146
+
147
+ // Example 3: Transactional send
148
+ await produceTransactional('my-topic', [
149
+ { key: 'order-1', value: { event: 'order_created', amount: 99.99 } },
150
+ { key: 'order-1', value: { event: 'payment_processed', amount: 99.99 } }
151
+ ]);
152
+
153
+ await producer.disconnect();
154
+ console.log('👋 Producer disconnected');
155
+ }
156
+
157
+ // ========================================
158
+ // Run
159
+ // ========================================
160
+
161
+ main().catch(console.error);
162
+
163
+ // Graceful shutdown
164
+ process.on('SIGINT', async () => {
165
+ console.log('\n🛑 Shutting down...');
166
+ await producer.disconnect();
167
+ process.exit(0);
168
+ });
@@ -0,0 +1,167 @@
1
+ """
2
+ Kafka Producer Example (Python)
3
+
4
+ Install: pip install kafka-python
5
+ """
6
+
7
+ from kafka import KafkaProducer
8
+ from kafka.errors import KafkaError
9
+ import json
10
+ import time
11
+ import signal
12
+ import sys
13
+
14
+ # ========================================
15
+ # Configuration
16
+ # ========================================
17
+
18
+ producer = KafkaProducer(
19
+ bootstrap_servers=['localhost:9092'],
20
+ client_id='my-app',
21
+
22
+ # Serialization
23
+ key_serializer=lambda k: k.encode('utf-8') if k else None,
24
+ value_serializer=lambda v: json.dumps(v).encode('utf-8'),
25
+
26
+ # Performance tuning
27
+ compression_type='lz4', # 'gzip', 'snappy', 'lz4', 'zstd'
28
+ batch_size=16384, # 16 KB
29
+ linger_ms=10, # Wait 10ms to batch
30
+ buffer_memory=33554432, # 32 MB
31
+
32
+ # Acknowledgment
33
+ acks=1, # 0=none, 1=leader, all=all replicas
34
+
35
+ # Retries
36
+ retries=3,
37
+ max_in_flight_requests_per_connection=5,
38
+
39
+ # Optional: SASL/SSL (for production)
40
+ # security_protocol='SASL_SSL',
41
+ # sasl_mechanism='SCRAM-SHA-512',
42
+ # sasl_plain_username='user',
43
+ # sasl_plain_password='password'
44
+ )
45
+
46
+ # ========================================
47
+ # Producer Functions
48
+ # ========================================
49
+
50
+ def produce_message(topic, key, value):
51
+ """Send a single message"""
52
+ try:
53
+ future = producer.send(
54
+ topic,
55
+ key=key,
56
+ value=value,
57
+ headers=[
58
+ ('source', b'my-app'),
59
+ ('timestamp', str(int(time.time() * 1000)).encode())
60
+ ]
61
+ )
62
+
63
+ # Block for 'synchronous' send
64
+ record_metadata = future.get(timeout=10)
65
+
66
+ print(f"✅ Message sent to {record_metadata.topic} "
67
+ f"partition {record_metadata.partition} "
68
+ f"offset {record_metadata.offset}")
69
+
70
+ return record_metadata
71
+
72
+ except KafkaError as e:
73
+ print(f"❌ Error producing message: {e}")
74
+ raise
75
+
76
+ def produce_message_async(topic, key, value):
77
+ """Send message asynchronously with callback"""
78
+ def on_send_success(record_metadata):
79
+ print(f"✅ Message sent: partition={record_metadata.partition}, "
80
+ f"offset={record_metadata.offset}")
81
+
82
+ def on_send_error(excp):
83
+ print(f"❌ Error sending message: {excp}")
84
+
85
+ producer.send(topic, key=key, value=value) \\
86
+ .add_callback(on_send_success) \\
87
+ .add_errback(on_send_error)
88
+
89
+ def produce_batch(topic, messages):
90
+ """Send multiple messages in a batch"""
91
+ try:
92
+ for msg in messages:
93
+ producer.send(
94
+ topic,
95
+ key=msg['key'],
96
+ value=msg['value'],
97
+ headers=[('source', b'my-app')]
98
+ )
99
+
100
+ # Flush to ensure all messages are sent
101
+ producer.flush()
102
+ print(f"✅ {len(messages)} messages sent")
103
+
104
+ except KafkaError as e:
105
+ print(f"❌ Error producing batch: {e}")
106
+ raise
107
+
108
+ # ========================================
109
+ # Main Function
110
+ # ========================================
111
+
112
+ def main():
113
+ print("📡 Producer connected")
114
+
115
+ # Example 1: Single message (synchronous)
116
+ produce_message(
117
+ 'my-topic',
118
+ 'user-123',
119
+ {
120
+ 'event': 'user_login',
121
+ 'userId': 'user-123',
122
+ 'timestamp': int(time.time() * 1000)
123
+ }
124
+ )
125
+
126
+ # Example 2: Async message
127
+ produce_message_async(
128
+ 'my-topic',
129
+ 'user-124',
130
+ {'event': 'page_view', 'page': '/home'}
131
+ )
132
+
133
+ # Example 3: Batch of messages
134
+ produce_batch('my-topic', [
135
+ {'key': 'user-123', 'value': {'event': 'page_view', 'page': '/home'}},
136
+ {'key': 'user-124', 'value': {'event': 'page_view', 'page': '/products'}},
137
+ {'key': 'user-125', 'value': {'event': 'page_view', 'page': '/checkout'}}
138
+ ])
139
+
140
+ # Ensure all messages are sent
141
+ producer.flush()
142
+
143
+ print("👋 Producer disconnected")
144
+
145
+ # ========================================
146
+ # Graceful Shutdown
147
+ # ========================================
148
+
149
+ def signal_handler(sig, frame):
150
+ print('\n🛑 Shutting down producer...')
151
+ producer.flush()
152
+ producer.close()
153
+ sys.exit(0)
154
+
155
+ signal.signal(signal.SIGINT, signal_handler)
156
+ signal.signal(signal.SIGTERM, signal_handler)
157
+
158
+ # ========================================
159
+ # Run
160
+ # ========================================
161
+
162
+ if __name__ == '__main__':
163
+ try:
164
+ main()
165
+ except Exception as e:
166
+ print(f"Error: {e}")
167
+ producer.close()