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.
Files changed (389) 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/src/cli/commands/import-docs.js +4 -4
  54. package/dist/src/cli/commands/import-docs.js.map +1 -1
  55. package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
  56. package/dist/src/cli/commands/init-multiproject.js +17 -18
  57. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  58. package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
  59. package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
  60. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  61. package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
  62. package/dist/src/cli/commands/switch-project.js +9 -26
  63. package/dist/src/cli/commands/switch-project.js.map +1 -1
  64. package/dist/src/cli/commands/sync-spec-content.js +3 -0
  65. package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
  66. package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
  67. package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
  68. package/dist/src/core/deduplication/command-deduplicator.js +254 -0
  69. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
  70. package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
  71. package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
  72. package/dist/src/core/increment/active-increment-manager.js +113 -46
  73. package/dist/src/core/increment/active-increment-manager.js.map +1 -1
  74. package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
  75. package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
  76. package/dist/src/core/increment/conflict-resolver.js +219 -0
  77. package/dist/src/core/increment/conflict-resolver.js.map +1 -0
  78. package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
  79. package/dist/src/core/increment/discipline-checker.js +7 -1
  80. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  81. package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
  82. package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
  83. package/dist/src/core/increment/duplicate-detector.js +276 -0
  84. package/dist/src/core/increment/duplicate-detector.js.map +1 -0
  85. package/dist/src/core/increment/increment-archiver.d.ts +90 -0
  86. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
  87. package/dist/src/core/increment/increment-archiver.js +368 -0
  88. package/dist/src/core/increment/increment-archiver.js.map +1 -0
  89. package/dist/src/core/increment/increment-reopener.d.ts +165 -0
  90. package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
  91. package/dist/src/core/increment/increment-reopener.js +390 -0
  92. package/dist/src/core/increment/increment-reopener.js.map +1 -0
  93. package/dist/src/core/increment/metadata-manager.d.ts +26 -1
  94. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  95. package/dist/src/core/increment/metadata-manager.js +143 -5
  96. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  97. package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
  98. package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
  99. package/dist/src/core/increment/recent-work-scanner.js +303 -0
  100. package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
  101. package/dist/src/core/increment/types.d.ts +1 -0
  102. package/dist/src/core/increment/types.d.ts.map +1 -1
  103. package/dist/src/core/increment-utils.d.ts +112 -0
  104. package/dist/src/core/increment-utils.d.ts.map +1 -0
  105. package/dist/src/core/increment-utils.js +210 -0
  106. package/dist/src/core/increment-utils.js.map +1 -0
  107. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
  108. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
  109. package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
  110. package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
  111. package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
  112. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
  113. package/dist/src/core/living-docs/feature-archiver.js +549 -0
  114. package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
  115. package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
  116. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
  117. package/dist/src/core/living-docs/feature-id-manager.js +339 -0
  118. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
  119. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
  120. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  121. package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
  122. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  123. package/dist/src/core/living-docs/index.d.ts +6 -0
  124. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  125. package/dist/src/core/living-docs/index.js +6 -0
  126. package/dist/src/core/living-docs/index.js.map +1 -1
  127. package/dist/src/core/living-docs/project-detector.d.ts +6 -0
  128. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
  129. package/dist/src/core/living-docs/project-detector.js +35 -1
  130. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  131. package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
  132. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
  133. package/dist/src/core/living-docs/spec-distributor.js +1275 -258
  134. package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
  135. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
  136. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
  137. package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
  138. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
  139. package/dist/src/core/living-docs/types.d.ts +143 -0
  140. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  141. package/dist/src/core/project-manager.d.ts +2 -17
  142. package/dist/src/core/project-manager.d.ts.map +1 -1
  143. package/dist/src/core/project-manager.js +68 -48
  144. package/dist/src/core/project-manager.js.map +1 -1
  145. package/dist/src/core/spec-content-sync.d.ts +1 -1
  146. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  147. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
  148. package/dist/src/core/sync/enhanced-content-builder.js +2 -1
  149. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
  150. package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
  151. package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
  152. package/dist/src/core/sync/performance-optimizer.js +220 -0
  153. package/dist/src/core/sync/performance-optimizer.js.map +1 -0
  154. package/dist/src/core/sync/retry-handler.d.ts +98 -0
  155. package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
  156. package/dist/src/core/sync/retry-handler.js +196 -0
  157. package/dist/src/core/sync/retry-handler.js.map +1 -0
  158. package/dist/src/core/types/config.d.ts +94 -0
  159. package/dist/src/core/types/config.d.ts.map +1 -1
  160. package/dist/src/core/types/config.js +16 -0
  161. package/dist/src/core/types/config.js.map +1 -1
  162. package/dist/src/core/types/increment-metadata.d.ts +6 -0
  163. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  164. package/dist/src/core/types/increment-metadata.js +10 -1
  165. package/dist/src/core/types/increment-metadata.js.map +1 -1
  166. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
  167. package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
  168. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  169. package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
  170. package/dist/src/integrations/jira/jira-mapper.js +4 -8
  171. package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
  172. package/package.json +1 -1
  173. package/plugins/specweave/COMMANDS.md +13 -4
  174. package/plugins/specweave/commands/specweave-abandon.md +22 -20
  175. package/plugins/specweave/commands/specweave-archive-features.md +121 -0
  176. package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
  177. package/plugins/specweave/commands/specweave-archive.md +363 -0
  178. package/plugins/specweave/commands/specweave-backlog.md +211 -0
  179. package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
  180. package/plugins/specweave/commands/specweave-increment.md +4 -3
  181. package/plugins/specweave/commands/specweave-progress.md +176 -27
  182. package/plugins/specweave/commands/specweave-reopen.md +391 -0
  183. package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
  184. package/plugins/specweave/commands/specweave-restore.md +309 -0
  185. package/plugins/specweave/commands/specweave-resume.md +51 -23
  186. package/plugins/specweave/commands/specweave-status.md +41 -7
  187. package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
  188. package/plugins/specweave/hooks/hooks.json +4 -0
  189. package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
  190. package/plugins/specweave/hooks/post-task-completion.sh +39 -0
  191. package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
  192. package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
  193. package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
  194. package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
  195. package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
  196. package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
  197. package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
  198. package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
  199. package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
  200. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
  201. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
  202. package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
  203. package/plugins/specweave-confluent/README.md +375 -0
  204. package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
  205. package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
  206. package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
  207. package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
  208. package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
  209. package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
  210. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
  211. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
  212. package/plugins/specweave-github/hooks/post-task-completion.sh +10 -9
  213. package/plugins/specweave-github/lib/completion-calculator.js +262 -0
  214. package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
  215. package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  216. package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
  217. package/plugins/specweave-github/lib/epic-content-builder.js +38 -0
  218. package/plugins/specweave-github/lib/epic-content-builder.ts +59 -0
  219. package/plugins/specweave-github/lib/github-client-v2.js +49 -0
  220. package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
  221. package/plugins/specweave-github/lib/github-epic-sync.ts +1 -1
  222. package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
  223. package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
  224. package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
  225. package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
  226. package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
  227. package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
  228. package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
  229. package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
  230. package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
  231. package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
  232. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
  233. package/plugins/{specweave-ado/lib/enhanced-ado-sync.js → specweave-jira/lib/enhanced-jira-sync.js} +25 -61
  234. package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
  235. package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
  236. package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
  237. package/plugins/specweave-kafka/README.md +242 -0
  238. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
  239. package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
  240. package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
  241. package/plugins/specweave-kafka/commands/deploy.md +99 -0
  242. package/plugins/specweave-kafka/commands/dev-env.md +176 -0
  243. package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
  244. package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
  245. package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
  246. package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
  247. package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
  248. package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
  249. package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
  250. package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
  251. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
  252. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
  253. package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
  254. package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
  255. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
  256. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
  257. package/plugins/specweave-kafka/lib/cli/types.js +10 -0
  258. package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
  259. package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
  260. package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
  261. package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
  262. package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
  263. package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
  264. package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
  265. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
  266. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
  267. package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
  268. package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
  269. package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
  270. package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
  271. package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
  272. package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
  273. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
  274. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
  275. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
  276. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
  277. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
  278. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
  279. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
  280. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
  281. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
  282. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
  283. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
  284. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
  285. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
  286. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
  287. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
  288. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
  289. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
  290. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
  291. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
  292. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
  293. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
  294. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
  295. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
  296. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
  297. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
  298. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
  299. package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
  300. package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
  301. package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
  302. package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
  303. package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
  304. package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
  305. package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
  306. package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
  307. package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
  308. package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
  309. package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
  310. package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
  311. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
  312. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
  313. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
  314. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
  315. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
  316. package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
  317. package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
  318. package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
  319. package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
  320. package/plugins/specweave-kafka/package.json +41 -0
  321. package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
  322. package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
  323. package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
  324. package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
  325. package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
  326. package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
  327. package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
  328. package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
  329. package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
  330. package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
  331. package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
  332. package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
  333. package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
  334. package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
  335. package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
  336. package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
  337. package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
  338. package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
  339. package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
  340. package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
  341. package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
  342. package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
  343. package/plugins/specweave-kafka/tsconfig.json +21 -0
  344. package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
  345. package/plugins/specweave-kafka-streams/README.md +310 -0
  346. package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
  347. package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
  348. package/plugins/specweave-n8n/README.md +354 -0
  349. package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
  350. package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
  351. package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
  352. package/src/templates/AGENTS.md.template +601 -7
  353. package/src/templates/CLAUDE.md.template +188 -88
  354. package/dist/locales/de/.gitkeep +0 -0
  355. package/dist/locales/de/cli.json +0 -108
  356. package/dist/locales/en/cli.json +0 -287
  357. package/dist/locales/en/errors.json +0 -7
  358. package/dist/locales/en/templates.json +0 -6
  359. package/dist/locales/es/.gitkeep +0 -0
  360. package/dist/locales/es/cli.json +0 -41
  361. package/dist/locales/fr/.gitkeep +0 -0
  362. package/dist/locales/fr/cli.json +0 -108
  363. package/dist/locales/ja/.gitkeep +0 -0
  364. package/dist/locales/ja/cli.json +0 -108
  365. package/dist/locales/ko/.gitkeep +0 -0
  366. package/dist/locales/ko/cli.json +0 -108
  367. package/dist/locales/pt/.gitkeep +0 -0
  368. package/dist/locales/pt/cli.json +0 -108
  369. package/dist/locales/ru/.gitkeep +0 -0
  370. package/dist/locales/ru/cli.json +0 -269
  371. package/dist/locales/zh/.gitkeep +0 -0
  372. package/dist/locales/zh/cli.json +0 -108
  373. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +0 -25
  374. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +0 -1
  375. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -191
  376. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +0 -1
  377. package/dist/spec-parser.js +0 -629
  378. package/dist/src/core/sync/spec-content-sync.d.ts +0 -88
  379. package/dist/src/core/sync/spec-content-sync.d.ts.map +0 -1
  380. package/dist/src/core/sync/spec-content-sync.js +0 -5
  381. package/dist/src/core/sync/spec-content-sync.js.map +0 -1
  382. package/dist/tsconfig.tsbuildinfo +0 -1
  383. package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
  384. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
  385. package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
  386. package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
  387. package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
  388. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
  389. package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
@@ -0,0 +1,249 @@
1
+ import { CompressionTypes, PartitionAssigners } from "kafkajs";
2
+ class HighPerformanceProducer {
3
+ constructor(kafka, config = {}) {
4
+ this.config = {
5
+ batchSize: config.batchSize || 65536,
6
+ // 64KB batches for high throughput
7
+ lingerMs: config.lingerMs || 100,
8
+ // Wait 100ms to batch messages
9
+ compressionType: config.compressionType || CompressionTypes.LZ4,
10
+ maxInFlightRequests: config.maxInFlightRequests || 5,
11
+ idempotent: config.idempotent !== false,
12
+ requestTimeout: config.requestTimeout || 3e4,
13
+ retry: {
14
+ retries: config.retry?.retries || 8,
15
+ initialRetryTime: config.retry?.initialRetryTime || 100,
16
+ maxRetryTime: config.retry?.maxRetryTime || 3e4,
17
+ multiplier: config.retry?.multiplier || 2
18
+ }
19
+ };
20
+ this.producer = kafka.producer({
21
+ idempotent: this.config.idempotent,
22
+ maxInFlightRequests: this.config.maxInFlightRequests,
23
+ retry: this.config.retry
24
+ });
25
+ }
26
+ async connect() {
27
+ await this.producer.connect();
28
+ }
29
+ async disconnect() {
30
+ await this.producer.disconnect();
31
+ }
32
+ /**
33
+ * Send messages with optimized batching and compression
34
+ */
35
+ async send(topic, messages) {
36
+ return this.producer.send({
37
+ topic,
38
+ messages,
39
+ compression: this.config.compressionType,
40
+ // @ts-ignore - kafkajs typing issue
41
+ batchSize: this.config.batchSize,
42
+ timeout: this.config.requestTimeout
43
+ });
44
+ }
45
+ /**
46
+ * Batch send with explicit flush control
47
+ */
48
+ async sendBatch(batches) {
49
+ return Promise.all(
50
+ batches.map(
51
+ (batch) => this.send(batch.topic, batch.messages)
52
+ )
53
+ );
54
+ }
55
+ }
56
+ class HighPerformanceConsumer {
57
+ constructor(kafka, groupId, config = {}) {
58
+ this.config = {
59
+ maxBytesPerPartition: config.maxBytesPerPartition || 1048576,
60
+ // 1MB per partition
61
+ maxWaitTimeInMs: config.maxWaitTimeInMs || 500,
62
+ // Fetch more frequently
63
+ minBytes: config.minBytes || 1024,
64
+ // Minimum 1KB to reduce overhead
65
+ sessionTimeout: config.sessionTimeout || 3e4,
66
+ heartbeatInterval: config.heartbeatInterval || 3e3,
67
+ partitionAssigners: config.partitionAssigners || [PartitionAssigners.roundRobin],
68
+ maxPollRecords: config.maxPollRecords || 500
69
+ };
70
+ this.consumer = kafka.consumer({
71
+ groupId,
72
+ sessionTimeout: this.config.sessionTimeout,
73
+ heartbeatInterval: this.config.heartbeatInterval,
74
+ maxBytesPerPartition: this.config.maxBytesPerPartition,
75
+ maxWaitTimeInMs: this.config.maxWaitTimeInMs,
76
+ minBytes: this.config.minBytes,
77
+ partitionAssigners: this.config.partitionAssigners
78
+ });
79
+ }
80
+ async connect() {
81
+ await this.consumer.connect();
82
+ }
83
+ async disconnect() {
84
+ await this.consumer.disconnect();
85
+ }
86
+ async subscribe(topics) {
87
+ await this.consumer.subscribe({ topics, fromBeginning: false });
88
+ }
89
+ /**
90
+ * Run consumer with batch processing
91
+ */
92
+ async runBatched(batchSize, handler) {
93
+ let messageBatch = [];
94
+ await this.consumer.run({
95
+ eachMessage: async ({ topic, partition, message }) => {
96
+ messageBatch.push({ topic, partition, message });
97
+ if (messageBatch.length >= batchSize) {
98
+ await handler(messageBatch);
99
+ messageBatch = [];
100
+ }
101
+ }
102
+ });
103
+ }
104
+ }
105
+ class KafkaConnectionPool {
106
+ constructor(kafka) {
107
+ this.producers = /* @__PURE__ */ new Map();
108
+ this.consumers = /* @__PURE__ */ new Map();
109
+ this.kafka = kafka;
110
+ }
111
+ /**
112
+ * Get or create producer
113
+ */
114
+ getProducer(id = "default") {
115
+ if (!this.producers.has(id)) {
116
+ const producer = this.kafka.producer({
117
+ idempotent: true,
118
+ maxInFlightRequests: 5
119
+ });
120
+ this.producers.set(id, producer);
121
+ }
122
+ return this.producers.get(id);
123
+ }
124
+ /**
125
+ * Get or create consumer
126
+ */
127
+ getConsumer(groupId) {
128
+ if (!this.consumers.has(groupId)) {
129
+ const consumer = this.kafka.consumer({ groupId });
130
+ this.consumers.set(groupId, consumer);
131
+ }
132
+ return this.consumers.get(groupId);
133
+ }
134
+ /**
135
+ * Connect all clients
136
+ */
137
+ async connectAll() {
138
+ const producers = Array.from(this.producers.values());
139
+ const consumers = Array.from(this.consumers.values());
140
+ await Promise.all([
141
+ ...producers.map((p) => p.connect()),
142
+ ...consumers.map((c) => c.connect())
143
+ ]);
144
+ }
145
+ /**
146
+ * Disconnect all clients
147
+ */
148
+ async disconnectAll() {
149
+ const producers = Array.from(this.producers.values());
150
+ const consumers = Array.from(this.consumers.values());
151
+ await Promise.all([
152
+ ...producers.map((p) => p.disconnect()),
153
+ ...consumers.map((c) => c.disconnect())
154
+ ]);
155
+ this.producers.clear();
156
+ this.consumers.clear();
157
+ }
158
+ }
159
+ class KafkaPerformanceMetrics {
160
+ constructor() {
161
+ this.metrics = {
162
+ messagesProduced: 0,
163
+ messagesFailed: 0,
164
+ messagesConsumed: 0,
165
+ totalBytesProduced: 0,
166
+ totalBytesConsumed: 0,
167
+ averageProduceLatency: 0,
168
+ averageConsumeLatency: 0,
169
+ produceLatencies: [],
170
+ consumeLatencies: []
171
+ };
172
+ }
173
+ /**
174
+ * Record produce event
175
+ */
176
+ recordProduce(bytes, latencyMs, success) {
177
+ if (success) {
178
+ this.metrics.messagesProduced++;
179
+ this.metrics.totalBytesProduced += bytes;
180
+ this.metrics.produceLatencies.push(latencyMs);
181
+ this.metrics.averageProduceLatency = this.calculateAverage(this.metrics.produceLatencies);
182
+ } else {
183
+ this.metrics.messagesFailed++;
184
+ }
185
+ }
186
+ /**
187
+ * Record consume event
188
+ */
189
+ recordConsume(bytes, latencyMs) {
190
+ this.metrics.messagesConsumed++;
191
+ this.metrics.totalBytesConsumed += bytes;
192
+ this.metrics.consumeLatencies.push(latencyMs);
193
+ this.metrics.averageConsumeLatency = this.calculateAverage(this.metrics.consumeLatencies);
194
+ }
195
+ /**
196
+ * Get current metrics
197
+ */
198
+ getMetrics() {
199
+ return {
200
+ ...this.metrics,
201
+ p50ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.5),
202
+ p95ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.95),
203
+ p99ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.99),
204
+ p50ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.5),
205
+ p95ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.95),
206
+ p99ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.99),
207
+ throughputMBps: (this.metrics.totalBytesProduced + this.metrics.totalBytesConsumed) / 1024 / 1024
208
+ };
209
+ }
210
+ /**
211
+ * Reset metrics
212
+ */
213
+ reset() {
214
+ this.metrics = {
215
+ messagesProduced: 0,
216
+ messagesFailed: 0,
217
+ messagesConsumed: 0,
218
+ totalBytesProduced: 0,
219
+ totalBytesConsumed: 0,
220
+ averageProduceLatency: 0,
221
+ averageConsumeLatency: 0,
222
+ produceLatencies: [],
223
+ consumeLatencies: []
224
+ };
225
+ }
226
+ calculateAverage(values) {
227
+ if (values.length === 0) return 0;
228
+ return values.reduce((a, b) => a + b, 0) / values.length;
229
+ }
230
+ calculatePercentile(values, percentile) {
231
+ if (values.length === 0) return 0;
232
+ const sorted = [...values].sort((a, b) => a - b);
233
+ const index = Math.ceil(sorted.length * percentile) - 1;
234
+ return sorted[index];
235
+ }
236
+ }
237
+ var performance_optimizer_default = {
238
+ HighPerformanceProducer,
239
+ HighPerformanceConsumer,
240
+ KafkaConnectionPool,
241
+ KafkaPerformanceMetrics
242
+ };
243
+ export {
244
+ HighPerformanceConsumer,
245
+ HighPerformanceProducer,
246
+ KafkaConnectionPool,
247
+ KafkaPerformanceMetrics,
248
+ performance_optimizer_default as default
249
+ };
@@ -0,0 +1,427 @@
1
+ /**
2
+ * Kafka Performance Optimization Patterns
3
+ *
4
+ * Producer and consumer optimization, batching, compression, connection pooling
5
+ *
6
+ * @module performance-optimizer
7
+ */
8
+
9
+ import { Kafka, Producer, Consumer, CompressionTypes, PartitionAssigners } from 'kafkajs';
10
+
11
+ /**
12
+ * Performance Configuration for Producer
13
+ */
14
+ export interface ProducerPerformanceConfig {
15
+ /** Batch size in bytes (default: 16384 = 16KB) */
16
+ batchSize?: number;
17
+ /** Linger time in ms (wait before sending batch, default: 0) */
18
+ lingerMs?: number;
19
+ /** Compression type */
20
+ compressionType?: CompressionTypes;
21
+ /** Max concurrent requests (default: 5) */
22
+ maxInFlightRequests?: number;
23
+ /** Enable idempotence (default: true) */
24
+ idempotent?: boolean;
25
+ /** Request timeout in ms (default: 30000) */
26
+ requestTimeout?: number;
27
+ /** Retry configuration */
28
+ retry?: {
29
+ /** Max retry attempts (default: 8) */
30
+ retries?: number;
31
+ /** Initial retry delay in ms (default: 100) */
32
+ initialRetryTime?: number;
33
+ /** Max retry delay in ms (default: 30000) */
34
+ maxRetryTime?: number;
35
+ /** Retry multiplier (default: 2) */
36
+ multiplier?: number;
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Performance Configuration for Consumer
42
+ */
43
+ export interface ConsumerPerformanceConfig {
44
+ /** Max records per poll (default: 500) */
45
+ maxBytesPerPartition?: number;
46
+ /** Max wait time for fetch in ms (default: 5000) */
47
+ maxWaitTimeInMs?: number;
48
+ /** Min bytes to fetch (default: 1) */
49
+ minBytes?: number;
50
+ /** Session timeout in ms (default: 30000) */
51
+ sessionTimeout?: number;
52
+ /** Heartbeat interval in ms (default: 3000) */
53
+ heartbeatInterval?: number;
54
+ /** Partition assignment strategy */
55
+ partitionAssigners?: typeof PartitionAssigners.roundRobin[];
56
+ /** Max poll records */
57
+ maxPollRecords?: number;
58
+ }
59
+
60
+ /**
61
+ * High-Performance Producer
62
+ */
63
+ export class HighPerformanceProducer {
64
+ private producer: Producer;
65
+ private config: Required<ProducerPerformanceConfig>;
66
+
67
+ constructor(kafka: Kafka, config: ProducerPerformanceConfig = {}) {
68
+ this.config = {
69
+ batchSize: config.batchSize || 65536, // 64KB batches for high throughput
70
+ lingerMs: config.lingerMs || 100, // Wait 100ms to batch messages
71
+ compressionType: config.compressionType || CompressionTypes.LZ4,
72
+ maxInFlightRequests: config.maxInFlightRequests || 5,
73
+ idempotent: config.idempotent !== false,
74
+ requestTimeout: config.requestTimeout || 30000,
75
+ retry: {
76
+ retries: config.retry?.retries || 8,
77
+ initialRetryTime: config.retry?.initialRetryTime || 100,
78
+ maxRetryTime: config.retry?.maxRetryTime || 30000,
79
+ multiplier: config.retry?.multiplier || 2,
80
+ },
81
+ };
82
+
83
+ this.producer = kafka.producer({
84
+ idempotent: this.config.idempotent,
85
+ maxInFlightRequests: this.config.maxInFlightRequests,
86
+ retry: this.config.retry,
87
+ });
88
+ }
89
+
90
+ async connect(): Promise<void> {
91
+ await this.producer.connect();
92
+ }
93
+
94
+ async disconnect(): Promise<void> {
95
+ await this.producer.disconnect();
96
+ }
97
+
98
+ /**
99
+ * Send messages with optimized batching and compression
100
+ */
101
+ async send(topic: string, messages: Array<{ key?: string; value: string }>) {
102
+ return this.producer.send({
103
+ topic,
104
+ messages,
105
+ compression: this.config.compressionType,
106
+ // @ts-ignore - kafkajs typing issue
107
+ batchSize: this.config.batchSize,
108
+ timeout: this.config.requestTimeout,
109
+ });
110
+ }
111
+
112
+ /**
113
+ * Batch send with explicit flush control
114
+ */
115
+ async sendBatch(batches: Array<{ topic: string; messages: Array<{ key?: string; value: string }> }>) {
116
+ // Send all batches in parallel
117
+ return Promise.all(
118
+ batches.map((batch) =>
119
+ this.send(batch.topic, batch.messages)
120
+ )
121
+ );
122
+ }
123
+ }
124
+
125
+ /**
126
+ * High-Performance Consumer
127
+ */
128
+ export class HighPerformanceConsumer {
129
+ private consumer: Consumer;
130
+ private config: Required<ConsumerPerformanceConfig>;
131
+
132
+ constructor(kafka: Kafka, groupId: string, config: ConsumerPerformanceConfig = {}) {
133
+ this.config = {
134
+ maxBytesPerPartition: config.maxBytesPerPartition || 1048576, // 1MB per partition
135
+ maxWaitTimeInMs: config.maxWaitTimeInMs || 500, // Fetch more frequently
136
+ minBytes: config.minBytes || 1024, // Minimum 1KB to reduce overhead
137
+ sessionTimeout: config.sessionTimeout || 30000,
138
+ heartbeatInterval: config.heartbeatInterval || 3000,
139
+ partitionAssigners: config.partitionAssigners || [PartitionAssigners.roundRobin],
140
+ maxPollRecords: config.maxPollRecords || 500,
141
+ };
142
+
143
+ this.consumer = kafka.consumer({
144
+ groupId,
145
+ sessionTimeout: this.config.sessionTimeout,
146
+ heartbeatInterval: this.config.heartbeatInterval,
147
+ maxBytesPerPartition: this.config.maxBytesPerPartition,
148
+ maxWaitTimeInMs: this.config.maxWaitTimeInMs,
149
+ minBytes: this.config.minBytes,
150
+ partitionAssigners: this.config.partitionAssigners,
151
+ });
152
+ }
153
+
154
+ async connect(): Promise<void> {
155
+ await this.consumer.connect();
156
+ }
157
+
158
+ async disconnect(): Promise<void> {
159
+ await this.consumer.disconnect();
160
+ }
161
+
162
+ async subscribe(topics: string[]): Promise<void> {
163
+ await this.consumer.subscribe({ topics, fromBeginning: false });
164
+ }
165
+
166
+ /**
167
+ * Run consumer with batch processing
168
+ */
169
+ async runBatched(
170
+ batchSize: number,
171
+ handler: (messages: Array<any>) => Promise<void>
172
+ ): Promise<void> {
173
+ let messageBatch: Array<any> = [];
174
+
175
+ await this.consumer.run({
176
+ eachMessage: async ({ topic, partition, message }) => {
177
+ messageBatch.push({ topic, partition, message });
178
+
179
+ // Process batch when full
180
+ if (messageBatch.length >= batchSize) {
181
+ await handler(messageBatch);
182
+ messageBatch = [];
183
+ }
184
+ },
185
+ });
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Connection Pooling for Kafka Clients
191
+ */
192
+ export class KafkaConnectionPool {
193
+ private producers: Map<string, Producer> = new Map();
194
+ private consumers: Map<string, Consumer> = new Map();
195
+ private kafka: Kafka;
196
+
197
+ constructor(kafka: Kafka) {
198
+ this.kafka = kafka;
199
+ }
200
+
201
+ /**
202
+ * Get or create producer
203
+ */
204
+ getProducer(id: string = 'default'): Producer {
205
+ if (!this.producers.has(id)) {
206
+ const producer = this.kafka.producer({
207
+ idempotent: true,
208
+ maxInFlightRequests: 5,
209
+ });
210
+ this.producers.set(id, producer);
211
+ }
212
+ return this.producers.get(id)!;
213
+ }
214
+
215
+ /**
216
+ * Get or create consumer
217
+ */
218
+ getConsumer(groupId: string): Consumer {
219
+ if (!this.consumers.has(groupId)) {
220
+ const consumer = this.kafka.consumer({ groupId });
221
+ this.consumers.set(groupId, consumer);
222
+ }
223
+ return this.consumers.get(groupId)!;
224
+ }
225
+
226
+ /**
227
+ * Connect all clients
228
+ */
229
+ async connectAll(): Promise<void> {
230
+ const producers = Array.from(this.producers.values());
231
+ const consumers = Array.from(this.consumers.values());
232
+
233
+ await Promise.all([
234
+ ...producers.map((p) => p.connect()),
235
+ ...consumers.map((c) => c.connect()),
236
+ ]);
237
+ }
238
+
239
+ /**
240
+ * Disconnect all clients
241
+ */
242
+ async disconnectAll(): Promise<void> {
243
+ const producers = Array.from(this.producers.values());
244
+ const consumers = Array.from(this.consumers.values());
245
+
246
+ await Promise.all([
247
+ ...producers.map((p) => p.disconnect()),
248
+ ...consumers.map((c) => c.disconnect()),
249
+ ]);
250
+
251
+ this.producers.clear();
252
+ this.consumers.clear();
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Performance Metrics Collector
258
+ */
259
+ export class KafkaPerformanceMetrics {
260
+ private metrics: {
261
+ messagesProduced: number;
262
+ messagesFailed: number;
263
+ messagesConsumed: number;
264
+ totalBytesProduced: number;
265
+ totalBytesConsumed: number;
266
+ averageProduceLatency: number;
267
+ averageConsumeLatency: number;
268
+ produceLatencies: number[];
269
+ consumeLatencies: number[];
270
+ } = {
271
+ messagesProduced: 0,
272
+ messagesFailed: 0,
273
+ messagesConsumed: 0,
274
+ totalBytesProduced: 0,
275
+ totalBytesConsumed: 0,
276
+ averageProduceLatency: 0,
277
+ averageConsumeLatency: 0,
278
+ produceLatencies: [],
279
+ consumeLatencies: [],
280
+ };
281
+
282
+ /**
283
+ * Record produce event
284
+ */
285
+ recordProduce(bytes: number, latencyMs: number, success: boolean): void {
286
+ if (success) {
287
+ this.metrics.messagesProduced++;
288
+ this.metrics.totalBytesProduced += bytes;
289
+ this.metrics.produceLatencies.push(latencyMs);
290
+ this.metrics.averageProduceLatency = this.calculateAverage(this.metrics.produceLatencies);
291
+ } else {
292
+ this.metrics.messagesFailed++;
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Record consume event
298
+ */
299
+ recordConsume(bytes: number, latencyMs: number): void {
300
+ this.metrics.messagesConsumed++;
301
+ this.metrics.totalBytesConsumed += bytes;
302
+ this.metrics.consumeLatencies.push(latencyMs);
303
+ this.metrics.averageConsumeLatency = this.calculateAverage(this.metrics.consumeLatencies);
304
+ }
305
+
306
+ /**
307
+ * Get current metrics
308
+ */
309
+ getMetrics() {
310
+ return {
311
+ ...this.metrics,
312
+ p50ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.5),
313
+ p95ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.95),
314
+ p99ProduceLatency: this.calculatePercentile(this.metrics.produceLatencies, 0.99),
315
+ p50ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.5),
316
+ p95ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.95),
317
+ p99ConsumeLatency: this.calculatePercentile(this.metrics.consumeLatencies, 0.99),
318
+ throughputMBps: (this.metrics.totalBytesProduced + this.metrics.totalBytesConsumed) / 1024 / 1024,
319
+ };
320
+ }
321
+
322
+ /**
323
+ * Reset metrics
324
+ */
325
+ reset(): void {
326
+ this.metrics = {
327
+ messagesProduced: 0,
328
+ messagesFailed: 0,
329
+ messagesConsumed: 0,
330
+ totalBytesProduced: 0,
331
+ totalBytesConsumed: 0,
332
+ averageProduceLatency: 0,
333
+ averageConsumeLatency: 0,
334
+ produceLatencies: [],
335
+ consumeLatencies: [],
336
+ };
337
+ }
338
+
339
+ private calculateAverage(values: number[]): number {
340
+ if (values.length === 0) return 0;
341
+ return values.reduce((a, b) => a + b, 0) / values.length;
342
+ }
343
+
344
+ private calculatePercentile(values: number[], percentile: number): number {
345
+ if (values.length === 0) return 0;
346
+ const sorted = [...values].sort((a, b) => a - b);
347
+ const index = Math.ceil(sorted.length * percentile) - 1;
348
+ return sorted[index];
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Example Usage: High-Performance Producer
354
+ *
355
+ * ```typescript
356
+ * const kafka = new Kafka({ brokers: ['localhost:9092'] });
357
+ * const producer = new HighPerformanceProducer(kafka, {
358
+ * batchSize: 65536, // 64KB batches
359
+ * lingerMs: 100, // Wait 100ms for batching
360
+ * compressionType: CompressionTypes.LZ4, // Fast compression
361
+ * });
362
+ *
363
+ * await producer.connect();
364
+ *
365
+ * // Send with optimized batching
366
+ * await producer.send('high-throughput-topic', [
367
+ * { key: 'key1', value: 'value1' },
368
+ * { key: 'key2', value: 'value2' },
369
+ * // ... thousands of messages batched efficiently
370
+ * ]);
371
+ * ```
372
+ */
373
+
374
+ /**
375
+ * Example Usage: High-Performance Consumer with Batching
376
+ *
377
+ * ```typescript
378
+ * const consumer = new HighPerformanceConsumer(kafka, 'high-perf-group', {
379
+ * maxBytesPerPartition: 2097152, // 2MB per partition
380
+ * maxWaitTimeInMs: 500, // Fetch every 500ms
381
+ * });
382
+ *
383
+ * await consumer.connect();
384
+ * await consumer.subscribe(['high-throughput-topic']);
385
+ *
386
+ * // Process 100 messages at a time
387
+ * await consumer.runBatched(100, async (messages) => {
388
+ * // Batch database insert
389
+ * await db.batchInsert(messages.map(m => JSON.parse(m.message.value.toString())));
390
+ * });
391
+ * ```
392
+ */
393
+
394
+ /**
395
+ * Performance Tips:
396
+ *
397
+ * **Producer Optimization**:
398
+ * - Increase batch size (64KB-1MB)
399
+ * - Use linger.ms (10-100ms) for better batching
400
+ * - Enable compression (lz4 for speed, gzip for ratio)
401
+ * - Use connection pooling
402
+ * - Send in parallel (Promise.all)
403
+ *
404
+ * **Consumer Optimization**:
405
+ * - Increase max.poll.records (500-1000)
406
+ * - Process messages in batches
407
+ * - Use multiple consumer instances (scale horizontally)
408
+ * - Parallelize processing within handler
409
+ * - Commit offsets in batches
410
+ *
411
+ * **Network Optimization**:
412
+ * - Increase socket.send.buffer.bytes (128KB-256KB)
413
+ * - Increase socket.receive.buffer.bytes (128KB-256KB)
414
+ * - Use compression to reduce network I/O
415
+ *
416
+ * **Benchmarking**:
417
+ * - Producer: kafka-producer-perf-test.sh
418
+ * - Consumer: kafka-consumer-perf-test.sh
419
+ * - Target: >100K msg/sec per producer, >50K msg/sec per consumer
420
+ */
421
+
422
+ export default {
423
+ HighPerformanceProducer,
424
+ HighPerformanceConsumer,
425
+ KafkaConnectionPool,
426
+ KafkaPerformanceMetrics,
427
+ };