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,347 @@
1
+ # Apache Kafka Cluster (KRaft Mode) - Terraform Module
2
+ #
3
+ # Provisions a production-ready Apache Kafka cluster using KRaft (no ZooKeeper).
4
+ # Supports AWS, Azure, GCP with auto-scaling, monitoring, and security.
5
+
6
+ terraform {
7
+ required_version = ">= 1.5.0"
8
+
9
+ required_providers {
10
+ aws = {
11
+ source = "hashicorp/aws"
12
+ version = "~> 5.0"
13
+ configuration_aliases = [aws]
14
+ }
15
+ }
16
+ }
17
+
18
+ locals {
19
+ cluster_name = "${var.environment}-${var.cluster_name}"
20
+
21
+ # Calculate broker count (min 3 for KRaft quorum)
22
+ broker_count = max(3, var.broker_count)
23
+
24
+ # Determine instance type based on workload
25
+ instance_type = var.instance_type != null ? var.instance_type : (
26
+ var.workload_profile == "high-throughput" ? "r6i.4xlarge" :
27
+ var.workload_profile == "balanced" ? "r6i.2xlarge" :
28
+ "r6i.xlarge" # low-latency
29
+ )
30
+
31
+ # Tags for all resources
32
+ common_tags = merge(var.tags, {
33
+ Environment = var.environment
34
+ ManagedBy = "Terraform"
35
+ ClusterName = local.cluster_name
36
+ KafkaVersion = var.kafka_version
37
+ })
38
+ }
39
+
40
+ # ========================================
41
+ # EC2 Instances for Kafka Brokers
42
+ # ========================================
43
+
44
+ resource "aws_instance" "kafka_broker" {
45
+ count = local.broker_count
46
+
47
+ ami = var.ami_id != null ? var.ami_id : data.aws_ami.amazon_linux_2.id
48
+ instance_type = local.instance_type
49
+ key_name = var.key_name
50
+
51
+ subnet_id = var.subnet_ids[count.index % length(var.subnet_ids)]
52
+ vpc_security_group_ids = [aws_security_group.kafka_broker.id]
53
+
54
+ iam_instance_profile = aws_iam_instance_profile.kafka_broker.name
55
+
56
+ root_block_device {
57
+ volume_type = "gp3"
58
+ volume_size = 100 # OS disk
59
+ delete_on_termination = true
60
+ encrypted = true
61
+ kms_key_id = var.kms_key_id
62
+ }
63
+
64
+ # Data disks for Kafka logs
65
+ dynamic "ebs_block_device" {
66
+ for_each = range(var.data_disk_count)
67
+ content {
68
+ device_name = "/dev/sd${substr("fghijklmnop", ebs_block_device.key, 1)}"
69
+ volume_type = var.disk_type # "gp3" or "io2"
70
+ volume_size = var.disk_size_gb
71
+ iops = var.disk_type == "io2" ? var.disk_iops : null
72
+ throughput = var.disk_type == "gp3" ? var.disk_throughput : null
73
+ delete_on_termination = false
74
+ encrypted = true
75
+ kms_key_id = var.kms_key_id
76
+ }
77
+ }
78
+
79
+ user_data = templatefile("${path.module}/templates/kafka-broker-init.sh.tpl", {
80
+ broker_id = count.index
81
+ cluster_name = local.cluster_name
82
+ kafka_version = var.kafka_version
83
+ broker_count = local.broker_count
84
+ data_disk_count = var.data_disk_count
85
+ heap_size_gb = var.heap_size_gb
86
+ kraft_cluster_id = random_uuid.kraft_cluster_id.result
87
+ controller_quorum = join(",", [for i in range(local.broker_count) : "${i}@kafka-broker-${i}.${var.domain}:9093"])
88
+ log_dirs = join(",", [for i in range(var.data_disk_count) : "/data/kafka-logs-${i}"])
89
+ s3_bucket_backups = aws_s3_bucket.kafka_backups.bucket
90
+ cloudwatch_namespace = "Kafka/${local.cluster_name}"
91
+ })
92
+
93
+ metadata_options {
94
+ http_endpoint = "enabled"
95
+ http_tokens = "required" # IMDSv2 only
96
+ }
97
+
98
+ tags = merge(local.common_tags, {
99
+ Name = "${local.cluster_name}-broker-${count.index}"
100
+ Role = "KafkaBroker"
101
+ BrokerId = count.index
102
+ })
103
+ }
104
+
105
+ # ========================================
106
+ # Security Group
107
+ # ========================================
108
+
109
+ resource "aws_security_group" "kafka_broker" {
110
+ name_prefix = "${local.cluster_name}-broker-"
111
+ description = "Security group for Kafka brokers"
112
+ vpc_id = var.vpc_id
113
+
114
+ # Kafka client connections (SASL_SSL)
115
+ ingress {
116
+ description = "Kafka client connections (SASL_SSL)"
117
+ from_port = 9092
118
+ to_port = 9092
119
+ protocol = "tcp"
120
+ cidr_blocks = var.allowed_cidr_blocks
121
+ }
122
+
123
+ # KRaft controller (internal)
124
+ ingress {
125
+ description = "KRaft controller (broker-to-broker)"
126
+ from_port = 9093
127
+ to_port = 9093
128
+ protocol = "tcp"
129
+ self = true
130
+ }
131
+
132
+ # JMX metrics
133
+ ingress {
134
+ description = "JMX metrics"
135
+ from_port = 9999
136
+ to_port = 9999
137
+ protocol = "tcp"
138
+ cidr_blocks = var.monitoring_cidr_blocks
139
+ }
140
+
141
+ # Prometheus exporter
142
+ ingress {
143
+ description = "Prometheus JMX exporter"
144
+ from_port = 7071
145
+ to_port = 7071
146
+ protocol = "tcp"
147
+ cidr_blocks = var.monitoring_cidr_blocks
148
+ }
149
+
150
+ # Allow all outbound
151
+ egress {
152
+ description = "Allow all outbound"
153
+ from_port = 0
154
+ to_port = 0
155
+ protocol = "-1"
156
+ cidr_blocks = ["0.0.0.0/0"]
157
+ }
158
+
159
+ tags = merge(local.common_tags, {
160
+ Name = "${local.cluster_name}-broker-sg"
161
+ })
162
+ }
163
+
164
+ # ========================================
165
+ # IAM Role for Brokers
166
+ # ========================================
167
+
168
+ resource "aws_iam_role" "kafka_broker" {
169
+ name_prefix = "${local.cluster_name}-broker-"
170
+
171
+ assume_role_policy = jsonencode({
172
+ Version = "2012-10-17"
173
+ Statement = [{
174
+ Action = "sts:AssumeRole"
175
+ Effect = "Allow"
176
+ Principal = {
177
+ Service = "ec2.amazonaws.com"
178
+ }
179
+ }]
180
+ })
181
+
182
+ tags = local.common_tags
183
+ }
184
+
185
+ resource "aws_iam_instance_profile" "kafka_broker" {
186
+ name_prefix = "${local.cluster_name}-broker-"
187
+ role = aws_iam_role.kafka_broker.name
188
+ }
189
+
190
+ # CloudWatch Logs permissions
191
+ resource "aws_iam_role_policy_attachment" "cloudwatch_logs" {
192
+ role = aws_iam_role.kafka_broker.name
193
+ policy_arn = "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"
194
+ }
195
+
196
+ # S3 backup permissions
197
+ resource "aws_iam_role_policy" "s3_backups" {
198
+ name_prefix = "s3-backups-"
199
+ role = aws_iam_role.kafka_broker.name
200
+
201
+ policy = jsonencode({
202
+ Version = "2012-10-17"
203
+ Statement = [{
204
+ Effect = "Allow"
205
+ Action = [
206
+ "s3:PutObject",
207
+ "s3:GetObject",
208
+ "s3:ListBucket"
209
+ ]
210
+ Resource = [
211
+ aws_s3_bucket.kafka_backups.arn,
212
+ "${aws_s3_bucket.kafka_backups.arn}/*"
213
+ ]
214
+ }]
215
+ })
216
+ }
217
+
218
+ # ========================================
219
+ # S3 Bucket for Backups
220
+ # ========================================
221
+
222
+ resource "aws_s3_bucket" "kafka_backups" {
223
+ bucket_prefix = "${local.cluster_name}-backups-"
224
+
225
+ tags = merge(local.common_tags, {
226
+ Name = "${local.cluster_name}-backups"
227
+ })
228
+ }
229
+
230
+ resource "aws_s3_bucket_versioning" "kafka_backups" {
231
+ bucket = aws_s3_bucket.kafka_backups.id
232
+
233
+ versioning_configuration {
234
+ status = "Enabled"
235
+ }
236
+ }
237
+
238
+ resource "aws_s3_bucket_server_side_encryption_configuration" "kafka_backups" {
239
+ bucket = aws_s3_bucket.kafka_backups.id
240
+
241
+ rule {
242
+ apply_server_side_encryption_by_default {
243
+ sse_algorithm = "aws:kms"
244
+ kms_master_key_id = var.kms_key_id
245
+ }
246
+ }
247
+ }
248
+
249
+ resource "aws_s3_bucket_lifecycle_configuration" "kafka_backups" {
250
+ bucket = aws_s3_bucket.kafka_backups.id
251
+
252
+ rule {
253
+ id = "archive-old-backups"
254
+ status = "Enabled"
255
+
256
+ transition {
257
+ days = 30
258
+ storage_class = "GLACIER"
259
+ }
260
+
261
+ expiration {
262
+ days = 90
263
+ }
264
+ }
265
+ }
266
+
267
+ # ========================================
268
+ # Route53 DNS Records
269
+ # ========================================
270
+
271
+ resource "aws_route53_record" "kafka_broker" {
272
+ count = local.broker_count
273
+
274
+ zone_id = var.route53_zone_id
275
+ name = "kafka-broker-${count.index}.${var.domain}"
276
+ type = "A"
277
+ ttl = 60
278
+
279
+ records = [aws_instance.kafka_broker[count.index].private_ip]
280
+ }
281
+
282
+ # ========================================
283
+ # CloudWatch Alarms
284
+ # ========================================
285
+
286
+ resource "aws_cloudwatch_metric_alarm" "under_replicated_partitions" {
287
+ count = local.broker_count
288
+
289
+ alarm_name = "${local.cluster_name}-broker-${count.index}-under-replicated"
290
+ comparison_operator = "GreaterThanThreshold"
291
+ evaluation_periods = 2
292
+ metric_name = "UnderReplicatedPartitions"
293
+ namespace = "Kafka/${local.cluster_name}"
294
+ period = 60
295
+ statistic = "Maximum"
296
+ threshold = 0
297
+ alarm_description = "Broker ${count.index} has under-replicated partitions"
298
+ alarm_actions = var.sns_alarm_topic_arn != null ? [var.sns_alarm_topic_arn] : []
299
+
300
+ dimensions = {
301
+ BrokerId = count.index
302
+ }
303
+
304
+ tags = local.common_tags
305
+ }
306
+
307
+ resource "aws_cloudwatch_metric_alarm" "offline_partitions" {
308
+ alarm_name = "${local.cluster_name}-offline-partitions"
309
+ comparison_operator = "GreaterThanThreshold"
310
+ evaluation_periods = 1
311
+ metric_name = "OfflinePartitionsCount"
312
+ namespace = "Kafka/${local.cluster_name}"
313
+ period = 60
314
+ statistic = "Maximum"
315
+ threshold = 0
316
+ alarm_description = "Cluster has offline partitions (CRITICAL)"
317
+ alarm_actions = var.sns_alarm_topic_arn != null ? [var.sns_alarm_topic_arn] : []
318
+
319
+ tags = local.common_tags
320
+ }
321
+
322
+ # ========================================
323
+ # Data Sources
324
+ # ========================================
325
+
326
+ data "aws_ami" "amazon_linux_2" {
327
+ most_recent = true
328
+ owners = ["amazon"]
329
+
330
+ filter {
331
+ name = "name"
332
+ values = ["amzn2-ami-hvm-*-x86_64-gp2"]
333
+ }
334
+
335
+ filter {
336
+ name = "virtualization-type"
337
+ values = ["hvm"]
338
+ }
339
+ }
340
+
341
+ # ========================================
342
+ # Random Resources
343
+ # ========================================
344
+
345
+ resource "random_uuid" "kraft_cluster_id" {
346
+ # KRaft cluster ID (generated once, stored in state)
347
+ }
@@ -0,0 +1,107 @@
1
+ # Apache Kafka Terraform Module - Outputs
2
+
3
+ output "cluster_name" {
4
+ description = "Full Kafka cluster name"
5
+ value = local.cluster_name
6
+ }
7
+
8
+ output "broker_ids" {
9
+ description = "List of Kafka broker IDs"
10
+ value = [for i in range(local.broker_count) : i]
11
+ }
12
+
13
+ output "broker_instance_ids" {
14
+ description = "List of EC2 instance IDs for Kafka brokers"
15
+ value = aws_instance.kafka_broker[*].id
16
+ }
17
+
18
+ output "broker_private_ips" {
19
+ description = "List of private IPs for Kafka brokers"
20
+ value = aws_instance.kafka_broker[*].private_ip
21
+ }
22
+
23
+ output "broker_dns_names" {
24
+ description = "List of DNS names for Kafka brokers"
25
+ value = [for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}"]
26
+ }
27
+
28
+ output "bootstrap_servers" {
29
+ description = "Kafka bootstrap servers connection string"
30
+ value = join(",", [for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}:9092"])
31
+ }
32
+
33
+ output "bootstrap_servers_sasl_ssl" {
34
+ description = "Kafka bootstrap servers (SASL_SSL)"
35
+ value = join(",", [for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}:9092"])
36
+ }
37
+
38
+ output "controller_quorum" {
39
+ description = "KRaft controller quorum endpoints"
40
+ value = join(",", [for i in range(local.broker_count) : "${i}@kafka-broker-${i}.${var.domain}:9093"])
41
+ }
42
+
43
+ output "kraft_cluster_id" {
44
+ description = "KRaft cluster ID (UUID)"
45
+ value = random_uuid.kraft_cluster_id.result
46
+ sensitive = true
47
+ }
48
+
49
+ output "security_group_id" {
50
+ description = "Security group ID for Kafka brokers"
51
+ value = aws_security_group.kafka_broker.id
52
+ }
53
+
54
+ output "iam_role_arn" {
55
+ description = "IAM role ARN for Kafka brokers"
56
+ value = aws_iam_role.kafka_broker.arn
57
+ }
58
+
59
+ output "backup_s3_bucket" {
60
+ description = "S3 bucket name for Kafka backups"
61
+ value = aws_s3_bucket.kafka_backups.bucket
62
+ }
63
+
64
+ output "cloudwatch_namespace" {
65
+ description = "CloudWatch namespace for Kafka metrics"
66
+ value = "Kafka/${local.cluster_name}"
67
+ }
68
+
69
+ output "connection_examples" {
70
+ description = "Example connection configurations"
71
+ value = {
72
+ java = <<-EOT
73
+ Properties props = new Properties();
74
+ props.put("bootstrap.servers", "${join(",", [for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}:9092"])}");
75
+ props.put("security.protocol", "SASL_SSL");
76
+ props.put("sasl.mechanism", "SCRAM-SHA-512");
77
+ props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"user\" password=\"password\";");
78
+ EOT
79
+
80
+ nodejs = <<-EOT
81
+ const kafka = new Kafka({
82
+ clientId: 'my-app',
83
+ brokers: ${jsonencode([for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}:9092"])},
84
+ ssl: true,
85
+ sasl: {
86
+ mechanism: 'scram-sha-512',
87
+ username: 'user',
88
+ password: 'password'
89
+ }
90
+ });
91
+ EOT
92
+
93
+ cli = <<-EOT
94
+ kcat -b ${join(",", [for i in range(local.broker_count) : "kafka-broker-${i}.${var.domain}:9092"])} \\
95
+ -X security.protocol=SASL_SSL \\
96
+ -X sasl.mechanism=SCRAM-SHA-512 \\
97
+ -X sasl.username=user \\
98
+ -X sasl.password=password \\
99
+ -L
100
+ EOT
101
+ }
102
+ }
103
+
104
+ output "kafka_version" {
105
+ description = "Apache Kafka version deployed"
106
+ value = var.kafka_version
107
+ }
@@ -0,0 +1,216 @@
1
+ #!/bin/bash
2
+ # Kafka Broker Initialization Script (KRaft Mode)
3
+ #
4
+ # This script runs on first boot to set up a Kafka broker.
5
+
6
+ set -e
7
+
8
+ # ========================================
9
+ # Variables from Terraform
10
+ # ========================================
11
+
12
+ BROKER_ID="${broker_id}"
13
+ CLUSTER_NAME="${cluster_name}"
14
+ KAFKA_VERSION="${kafka_version}"
15
+ BROKER_COUNT="${broker_count}"
16
+ DATA_DISK_COUNT="${data_disk_count}"
17
+ HEAP_SIZE_GB="${heap_size_gb}"
18
+ KRAFT_CLUSTER_ID="${kraft_cluster_id}"
19
+ CONTROLLER_QUORUM="${controller_quorum}"
20
+ LOG_DIRS="${log_dirs}"
21
+ S3_BUCKET_BACKUPS="${s3_bucket_backups}"
22
+ CLOUDWATCH_NAMESPACE="${cloudwatch_namespace}"
23
+
24
+ # ========================================
25
+ # System Setup
26
+ # ========================================
27
+
28
+ echo "==> Starting Kafka broker initialization (ID: $BROKER_ID)"
29
+
30
+ # Update system
31
+ yum update -y
32
+
33
+ # Install required packages
34
+ yum install -y java-17-amazon-corretto-headless wget unzip jq awscli
35
+
36
+ # Install CloudWatch agent
37
+ wget -q https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
38
+ rpm -U ./amazon-cloudwatch-agent.rpm
39
+ rm -f ./amazon-cloudwatch-agent.rpm
40
+
41
+ # ========================================
42
+ # Disk Setup (RAID 0 for data disks)
43
+ # ========================================
44
+
45
+ echo "==> Setting up data disks"
46
+
47
+ # Wait for disks to be attached
48
+ for i in $(seq 1 $DATA_DISK_COUNT); do
49
+ DEVICE="/dev/nvme$((i))n1"
50
+ while [ ! -b "$DEVICE" ]; do
51
+ echo "Waiting for $DEVICE..."
52
+ sleep 5
53
+ done
54
+ done
55
+
56
+ # Format disks
57
+ for i in $(seq 1 $DATA_DISK_COUNT); do
58
+ DEVICE="/dev/nvme$((i))n1"
59
+ MOUNT_POINT="/data/kafka-logs-$((i-1))"
60
+
61
+ # Format if not already formatted
62
+ if ! blkid "$DEVICE"; then
63
+ mkfs.xfs -f "$DEVICE"
64
+ fi
65
+
66
+ # Create mount point
67
+ mkdir -p "$MOUNT_POINT"
68
+
69
+ # Mount disk
70
+ UUID=$(blkid -s UUID -o value "$DEVICE")
71
+ echo "UUID=$UUID $MOUNT_POINT xfs defaults,noatime,nodiratime 0 2" >> /etc/fstab
72
+ mount "$MOUNT_POINT"
73
+
74
+ # Set ownership
75
+ chown -R kafka:kafka "$MOUNT_POINT"
76
+ done
77
+
78
+ # ========================================
79
+ # Kafka Installation
80
+ # ========================================
81
+
82
+ echo "==> Installing Apache Kafka $KAFKA_VERSION"
83
+
84
+ # Download Kafka
85
+ cd /opt
86
+ wget -q "https://archive.apache.org/dist/kafka/$KAFKA_VERSION/kafka_2.13-$KAFKA_VERSION.tgz"
87
+ tar -xzf "kafka_2.13-$KAFKA_VERSION.tgz"
88
+ ln -s "kafka_2.13-$KAFKA_VERSION" kafka
89
+ rm -f "kafka_2.13-$KAFKA_VERSION.tgz"
90
+
91
+ # Create kafka user
92
+ useradd -r -s /bin/false kafka || true
93
+ chown -R kafka:kafka /opt/kafka*
94
+
95
+ # ========================================
96
+ # Kafka Configuration
97
+ # ========================================
98
+
99
+ echo "==> Configuring Kafka broker"
100
+
101
+ # Calculate heap size if not provided
102
+ if [ -z "$HEAP_SIZE_GB" ]; then
103
+ TOTAL_MEM_GB=$(free -g | awk '/^Mem:/{print $2}')
104
+ HEAP_SIZE_GB=$((TOTAL_MEM_GB * 60 / 100)) # 60% of total RAM
105
+ fi
106
+
107
+ # KRaft configuration
108
+ cat > /opt/kafka/config/kraft/server.properties <<EOF
109
+ # Broker ID
110
+ node.id=$BROKER_ID
111
+ process.roles=broker,controller
112
+ controller.quorum.voters=$CONTROLLER_QUORUM
113
+
114
+ # Socket server settings
115
+ listeners=SASL_SSL://:9092,CONTROLLER://:9093
116
+ advertised.listeners=SASL_SSL://$(hostname -f):9092
117
+ controller.listener.names=CONTROLLER
118
+ listener.security.protocol.map=SASL_SSL:SASL_SSL,CONTROLLER:PLAINTEXT
119
+ inter.broker.listener.name=SASL_SSL
120
+
121
+ # Log directories
122
+ log.dirs=$LOG_DIRS
123
+
124
+ # Replication
125
+ default.replication.factor=3
126
+ min.insync.replicas=2
127
+ offsets.topic.replication.factor=3
128
+ transaction.state.log.replication.factor=3
129
+ transaction.state.log.min.isr=2
130
+
131
+ # Log retention
132
+ log.retention.hours=168
133
+ log.segment.bytes=1073741824
134
+ log.retention.check.interval.ms=300000
135
+
136
+ # Performance tuning
137
+ num.network.threads=8
138
+ num.io.threads=16
139
+ socket.send.buffer.bytes=1048576
140
+ socket.receive.buffer.bytes=1048576
141
+ socket.request.max.bytes=104857600
142
+ num.replica.fetchers=4
143
+
144
+ # Compression
145
+ compression.type=lz4
146
+
147
+ # Group coordinator
148
+ group.coordinator.rebalance.protocols=classic,cooperative
149
+ group.coordinator.num.threads=4
150
+
151
+ # SSL/TLS configuration
152
+ ssl.keystore.location=/opt/kafka/config/kafka.keystore.jks
153
+ ssl.keystore.password=changeme
154
+ ssl.key.password=changeme
155
+ ssl.truststore.location=/opt/kafka/config/kafka.truststore.jks
156
+ ssl.truststore.password=changeme
157
+
158
+ # SASL configuration
159
+ sasl.enabled.mechanisms=SCRAM-SHA-512
160
+ sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
161
+ EOF
162
+
163
+ # JVM settings
164
+ cat > /opt/kafka/bin/kafka-server-start-jvm.sh <<EOF
165
+ #!/bin/bash
166
+ export KAFKA_HEAP_OPTS="-Xms${HEAP_SIZE_GB}g -Xmx${HEAP_SIZE_GB}g"
167
+ export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceSize=96m -XX:MaxMetaspaceSize=512m -XX:+ExplicitGCInvokesConcurrent"
168
+ export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999"
169
+ exec /opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/kraft/server.properties
170
+ EOF
171
+ chmod +x /opt/kafka/bin/kafka-server-start-jvm.sh
172
+
173
+ # ========================================
174
+ # KRaft Cluster ID
175
+ # ========================================
176
+
177
+ echo "==> Formatting KRaft metadata directory"
178
+
179
+ /opt/kafka/bin/kafka-storage.sh format \
180
+ -t "$KRAFT_CLUSTER_ID" \
181
+ -c /opt/kafka/config/kraft/server.properties
182
+
183
+ # ========================================
184
+ # Systemd Service
185
+ # ========================================
186
+
187
+ echo "==> Creating systemd service"
188
+
189
+ cat > /etc/systemd/system/kafka.service <<EOF
190
+ [Unit]
191
+ Description=Apache Kafka (KRaft Mode)
192
+ After=network.target
193
+
194
+ [Service]
195
+ Type=simple
196
+ User=kafka
197
+ ExecStart=/opt/kafka/bin/kafka-server-start-jvm.sh
198
+ Restart=on-failure
199
+ RestartSec=10s
200
+ LimitNOFILE=100000
201
+
202
+ [Install]
203
+ WantedBy=multi-user.target
204
+ EOF
205
+
206
+ # ========================================
207
+ # Start Kafka
208
+ # ========================================
209
+
210
+ systemctl daemon-reload
211
+ systemctl enable kafka
212
+ systemctl start kafka
213
+
214
+ echo "==> Kafka broker started successfully (ID: $BROKER_ID)"
215
+ echo "==> Cluster: $CLUSTER_NAME"
216
+ echo "==> Version: $KAFKA_VERSION"