specweave 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CLAUDE.md +229 -1817
  2. package/README.md +68 -0
  3. package/bin/specweave.js +62 -6
  4. package/dist/locales/de/.gitkeep +0 -0
  5. package/dist/locales/de/cli.json +108 -0
  6. package/dist/locales/en/cli.json +287 -0
  7. package/dist/locales/en/errors.json +7 -0
  8. package/dist/locales/en/templates.json +6 -0
  9. package/dist/locales/es/.gitkeep +0 -0
  10. package/dist/locales/es/cli.json +41 -0
  11. package/dist/locales/fr/.gitkeep +0 -0
  12. package/dist/locales/fr/cli.json +108 -0
  13. package/dist/locales/ja/.gitkeep +0 -0
  14. package/dist/locales/ja/cli.json +108 -0
  15. package/dist/locales/ko/.gitkeep +0 -0
  16. package/dist/locales/ko/cli.json +108 -0
  17. package/dist/locales/pt/.gitkeep +0 -0
  18. package/dist/locales/pt/cli.json +108 -0
  19. package/dist/locales/ru/.gitkeep +0 -0
  20. package/dist/locales/ru/cli.json +269 -0
  21. package/dist/locales/zh/.gitkeep +0 -0
  22. package/dist/locales/zh/cli.json +108 -0
  23. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  24. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
  25. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  26. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
  27. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
  28. package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
  29. package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
  30. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
  31. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
  32. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
  33. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
  34. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
  35. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
  36. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
  37. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
  38. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
  39. package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
  40. package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
  41. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
  42. package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  43. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
  44. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
  45. package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
  46. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
  47. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
  48. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  49. package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
  50. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  51. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
  52. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
  53. package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
  54. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
  55. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
  56. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
  57. package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
  58. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
  59. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  60. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
  61. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  62. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
  63. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
  64. package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
  65. package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
  66. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
  67. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
  68. package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
  69. package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
  70. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
  71. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
  72. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
  73. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
  74. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
  75. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
  76. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
  77. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
  78. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
  79. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
  80. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
  81. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
  82. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
  83. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
  84. package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
  85. package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
  86. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
  87. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
  88. package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
  89. package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
  90. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
  91. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
  92. package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
  93. package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
  94. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
  95. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
  96. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
  97. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
  98. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
  99. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
  100. package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
  101. package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
  102. package/dist/spec-parser.js +629 -0
  103. package/dist/src/cli/commands/import-docs.js +4 -4
  104. package/dist/src/cli/commands/import-docs.js.map +1 -1
  105. package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
  106. package/dist/src/cli/commands/init-multiproject.js +17 -18
  107. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  108. package/dist/src/cli/commands/init.d.ts.map +1 -1
  109. package/dist/src/cli/commands/init.js +107 -3
  110. package/dist/src/cli/commands/init.js.map +1 -1
  111. package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
  112. package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
  113. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  114. package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
  115. package/dist/src/cli/commands/switch-project.js +9 -26
  116. package/dist/src/cli/commands/switch-project.js.map +1 -1
  117. package/dist/src/cli/commands/sync-spec-content.js +3 -0
  118. package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
  119. package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
  120. package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
  121. package/dist/src/core/deduplication/command-deduplicator.js +254 -0
  122. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
  123. package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
  124. package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
  125. package/dist/src/core/increment/active-increment-manager.js +113 -46
  126. package/dist/src/core/increment/active-increment-manager.js.map +1 -1
  127. package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
  128. package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
  129. package/dist/src/core/increment/conflict-resolver.js +219 -0
  130. package/dist/src/core/increment/conflict-resolver.js.map +1 -0
  131. package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
  132. package/dist/src/core/increment/discipline-checker.js +7 -1
  133. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  134. package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
  135. package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
  136. package/dist/src/core/increment/duplicate-detector.js +276 -0
  137. package/dist/src/core/increment/duplicate-detector.js.map +1 -0
  138. package/dist/src/core/increment/increment-archiver.d.ts +90 -0
  139. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
  140. package/dist/src/core/increment/increment-archiver.js +368 -0
  141. package/dist/src/core/increment/increment-archiver.js.map +1 -0
  142. package/dist/src/core/increment/increment-reopener.d.ts +165 -0
  143. package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
  144. package/dist/src/core/increment/increment-reopener.js +390 -0
  145. package/dist/src/core/increment/increment-reopener.js.map +1 -0
  146. package/dist/src/core/increment/metadata-manager.d.ts +26 -1
  147. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  148. package/dist/src/core/increment/metadata-manager.js +143 -5
  149. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  150. package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
  151. package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
  152. package/dist/src/core/increment/recent-work-scanner.js +303 -0
  153. package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
  154. package/dist/src/core/increment/types.d.ts +1 -0
  155. package/dist/src/core/increment/types.d.ts.map +1 -1
  156. package/dist/src/core/increment-utils.d.ts +112 -0
  157. package/dist/src/core/increment-utils.d.ts.map +1 -0
  158. package/dist/src/core/increment-utils.js +210 -0
  159. package/dist/src/core/increment-utils.js.map +1 -0
  160. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
  161. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
  162. package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
  163. package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
  164. package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
  165. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
  166. package/dist/src/core/living-docs/feature-archiver.js +549 -0
  167. package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
  168. package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
  169. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
  170. package/dist/src/core/living-docs/feature-id-manager.js +339 -0
  171. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
  172. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
  173. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  174. package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
  175. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  176. package/dist/src/core/living-docs/index.d.ts +6 -0
  177. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  178. package/dist/src/core/living-docs/index.js +6 -0
  179. package/dist/src/core/living-docs/index.js.map +1 -1
  180. package/dist/src/core/living-docs/project-detector.d.ts +6 -0
  181. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
  182. package/dist/src/core/living-docs/project-detector.js +35 -1
  183. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  184. package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
  185. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
  186. package/dist/src/core/living-docs/spec-distributor.js +1275 -258
  187. package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
  188. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
  189. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
  190. package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
  191. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
  192. package/dist/src/core/living-docs/types.d.ts +143 -0
  193. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  194. package/dist/src/core/project-manager.d.ts +2 -17
  195. package/dist/src/core/project-manager.d.ts.map +1 -1
  196. package/dist/src/core/project-manager.js +68 -48
  197. package/dist/src/core/project-manager.js.map +1 -1
  198. package/dist/src/core/spec-content-sync.d.ts +1 -1
  199. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  200. package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
  201. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
  202. package/dist/src/core/sync/enhanced-content-builder.js +142 -138
  203. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
  204. package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
  205. package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
  206. package/dist/src/core/sync/performance-optimizer.js +220 -0
  207. package/dist/src/core/sync/performance-optimizer.js.map +1 -0
  208. package/dist/src/core/sync/retry-handler.d.ts +98 -0
  209. package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
  210. package/dist/src/core/sync/retry-handler.js +196 -0
  211. package/dist/src/core/sync/retry-handler.js.map +1 -0
  212. package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
  213. package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
  214. package/dist/src/core/sync/spec-content-sync.js +5 -0
  215. package/dist/src/core/sync/spec-content-sync.js.map +1 -0
  216. package/dist/src/core/sync/types.d.ts +52 -0
  217. package/dist/src/core/sync/types.d.ts.map +1 -0
  218. package/dist/src/core/sync/types.js +5 -0
  219. package/dist/src/core/sync/types.js.map +1 -0
  220. package/dist/src/core/types/config.d.ts +125 -0
  221. package/dist/src/core/types/config.d.ts.map +1 -1
  222. package/dist/src/core/types/config.js +25 -0
  223. package/dist/src/core/types/config.js.map +1 -1
  224. package/dist/src/core/types/increment-metadata.d.ts +10 -0
  225. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  226. package/dist/src/core/types/increment-metadata.js +10 -1
  227. package/dist/src/core/types/increment-metadata.js.map +1 -1
  228. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
  229. package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
  230. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  231. package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
  232. package/dist/src/integrations/jira/jira-mapper.js +4 -8
  233. package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
  234. package/dist/tsconfig.tsbuildinfo +1 -0
  235. package/package.json +1 -1
  236. package/plugins/specweave/COMMANDS.md +13 -4
  237. package/plugins/specweave/agents/pm/AGENT.md +159 -12
  238. package/plugins/specweave/commands/specweave-abandon.md +22 -20
  239. package/plugins/specweave/commands/specweave-archive-features.md +121 -0
  240. package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
  241. package/plugins/specweave/commands/specweave-archive.md +363 -0
  242. package/plugins/specweave/commands/specweave-backlog.md +211 -0
  243. package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
  244. package/plugins/specweave/commands/specweave-increment.md +4 -3
  245. package/plugins/specweave/commands/specweave-progress.md +176 -27
  246. package/plugins/specweave/commands/specweave-reopen.md +391 -0
  247. package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
  248. package/plugins/specweave/commands/specweave-restore.md +309 -0
  249. package/plugins/specweave/commands/specweave-resume.md +51 -23
  250. package/plugins/specweave/commands/specweave-status.md +41 -7
  251. package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
  252. package/plugins/specweave/commands/specweave.md +70 -405
  253. package/plugins/specweave/hooks/hooks.json +4 -0
  254. package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
  255. package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
  256. package/plugins/specweave/hooks/post-task-completion.sh +39 -0
  257. package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
  258. package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
  259. package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
  260. package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
  261. package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
  262. package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
  263. package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
  264. package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
  265. package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
  266. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
  267. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
  268. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  269. package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
  270. package/plugins/specweave-confluent/README.md +375 -0
  271. package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
  272. package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
  273. package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
  274. package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
  275. package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
  276. package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
  277. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
  278. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
  279. package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
  280. package/plugins/specweave-github/lib/completion-calculator.js +262 -0
  281. package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
  282. package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  283. package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
  284. package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
  285. package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
  286. package/plugins/specweave-github/lib/github-client-v2.js +49 -0
  287. package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
  288. package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
  289. package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
  290. package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
  291. package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
  292. package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
  293. package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
  294. package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
  295. package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
  296. package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
  297. package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
  298. package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
  299. package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
  300. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
  301. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
  302. package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
  303. package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
  304. package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
  305. package/plugins/specweave-kafka/README.md +242 -0
  306. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
  307. package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
  308. package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
  309. package/plugins/specweave-kafka/commands/deploy.md +99 -0
  310. package/plugins/specweave-kafka/commands/dev-env.md +176 -0
  311. package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
  312. package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
  313. package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
  314. package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
  315. package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
  316. package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
  317. package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
  318. package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
  319. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
  320. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
  321. package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
  322. package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
  323. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
  324. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
  325. package/plugins/specweave-kafka/lib/cli/types.js +10 -0
  326. package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
  327. package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
  328. package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
  329. package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
  330. package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
  331. package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
  332. package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
  333. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
  334. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
  335. package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
  336. package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
  337. package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
  338. package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
  339. package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
  340. package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
  341. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
  342. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
  343. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
  344. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
  345. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
  346. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
  347. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
  348. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
  349. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
  350. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
  351. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
  352. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
  353. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
  354. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
  355. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
  356. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
  357. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
  358. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
  359. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
  360. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
  361. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
  362. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
  363. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
  364. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
  365. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
  366. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
  367. package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
  368. package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
  369. package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
  370. package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
  371. package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
  372. package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
  373. package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
  374. package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
  375. package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
  376. package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
  377. package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
  378. package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
  379. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
  380. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
  381. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
  382. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
  383. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
  384. package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
  385. package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
  386. package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
  387. package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
  388. package/plugins/specweave-kafka/package.json +41 -0
  389. package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
  390. package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
  391. package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
  392. package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
  393. package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
  394. package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
  395. package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
  396. package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
  397. package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
  398. package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
  399. package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
  400. package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
  401. package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
  402. package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
  403. package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
  404. package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
  405. package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
  406. package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
  407. package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
  408. package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
  409. package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
  410. package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
  411. package/plugins/specweave-kafka/tsconfig.json +21 -0
  412. package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
  413. package/plugins/specweave-kafka-streams/README.md +310 -0
  414. package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
  415. package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
  416. package/plugins/specweave-n8n/README.md +354 -0
  417. package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
  418. package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
  419. package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
  420. package/src/templates/AGENTS.md.template +601 -7
  421. package/src/templates/CLAUDE.md.template +188 -88
  422. package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
  423. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
  424. package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
  425. package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
  426. package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
  427. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
  428. package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
@@ -0,0 +1,469 @@
1
+ /**
2
+ * Kafka Capacity Planning and Sizing
3
+ *
4
+ * Intelligent calculators for broker count, partition optimization, and storage estimation
5
+ *
6
+ * @module capacity-planner
7
+ */
8
+
9
+ /**
10
+ * Throughput Requirements
11
+ */
12
+ export interface ThroughputRequirements {
13
+ /** Peak producer throughput in MB/sec */
14
+ producerThroughputMBps: number;
15
+ /** Peak consumer throughput in MB/sec */
16
+ consumerThroughputMBps: number;
17
+ /** Average message size in bytes */
18
+ avgMessageSizeBytes: number;
19
+ /** Peak messages per second */
20
+ peakMessagesPerSec?: number;
21
+ }
22
+
23
+ /**
24
+ * Storage Requirements
25
+ */
26
+ export interface StorageRequirements {
27
+ /** Retention period in hours */
28
+ retentionHours: number;
29
+ /** Replication factor (default: 3) */
30
+ replicationFactor: number;
31
+ /** Compression ratio (default: 0.3 for 70% compression) */
32
+ compressionRatio?: number;
33
+ /** Growth buffer multiplier (default: 1.5 for 50% buffer) */
34
+ growthBuffer?: number;
35
+ }
36
+
37
+ /**
38
+ * Cluster Constraints
39
+ */
40
+ export interface ClusterConstraints {
41
+ /** Max partitions per broker (default: 4000) */
42
+ maxPartitionsPerBroker?: number;
43
+ /** Max disk utilization % (default: 70) */
44
+ maxDiskUtilization?: number;
45
+ /** Network bandwidth per broker in MB/s (default: 125 = 1Gbps) */
46
+ networkBandwidthMBps?: number;
47
+ /** CPU cores per broker (default: 8) */
48
+ cpuCoresPerBroker?: number;
49
+ /** RAM per broker in GB (default: 32) */
50
+ ramPerBrokerGB?: number;
51
+ }
52
+
53
+ /**
54
+ * Sizing Result
55
+ */
56
+ export interface SizingResult {
57
+ /** Recommended broker count */
58
+ brokerCount: number;
59
+ /** Recommended partition count */
60
+ partitionCount: number;
61
+ /** Storage per broker in GB */
62
+ storagePerBrokerGB: number;
63
+ /** Total cluster storage in GB */
64
+ totalStorageGB: number;
65
+ /** Actual throughput headroom % */
66
+ throughputHeadroom: number;
67
+ /** Resource utilization breakdown */
68
+ utilization: {
69
+ cpu: number;
70
+ memory: number;
71
+ disk: number;
72
+ network: number;
73
+ partitions: number;
74
+ };
75
+ /** Warnings and recommendations */
76
+ warnings: string[];
77
+ }
78
+
79
+ /**
80
+ * Partition Sizing Recommendation
81
+ */
82
+ export interface PartitionSizingResult {
83
+ /** Recommended partition count */
84
+ partitionCount: number;
85
+ /** Max throughput per partition in MB/s */
86
+ maxThroughputPerPartition: number;
87
+ /** Consumer parallelism level */
88
+ consumerParallelism: number;
89
+ /** Partition size in GB */
90
+ partitionSizeGB: number;
91
+ /** Reasoning */
92
+ reasoning: string[];
93
+ }
94
+
95
+ /**
96
+ * Capacity Planner
97
+ *
98
+ * Intelligent sizing calculator for Kafka clusters
99
+ */
100
+ export class KafkaCapacityPlanner {
101
+ private constraints: Required<ClusterConstraints>;
102
+
103
+ constructor(constraints: ClusterConstraints = {}) {
104
+ this.constraints = {
105
+ maxPartitionsPerBroker: constraints.maxPartitionsPerBroker || 4000,
106
+ maxDiskUtilization: constraints.maxDiskUtilization || 70,
107
+ networkBandwidthMBps: constraints.networkBandwidthMBps || 125, // 1Gbps
108
+ cpuCoresPerBroker: constraints.cpuCoresPerBroker || 8,
109
+ ramPerBrokerGB: constraints.ramPerBrokerGB || 32,
110
+ };
111
+ }
112
+
113
+ /**
114
+ * Calculate optimal cluster sizing
115
+ */
116
+ calculateClusterSize(
117
+ throughput: ThroughputRequirements,
118
+ storage: StorageRequirements,
119
+ topicCount: number = 1
120
+ ): SizingResult {
121
+ // Calculate partition count first
122
+ const partitioning = this.calculatePartitionCount(throughput);
123
+
124
+ // Calculate storage requirements
125
+ const storageCalc = this.calculateStorageRequirements(
126
+ throughput,
127
+ storage,
128
+ partitioning.partitionCount
129
+ );
130
+
131
+ // Calculate broker count based on multiple constraints
132
+ const brokerCountOptions = {
133
+ throughput: this.calculateBrokersForThroughput(throughput),
134
+ storage: this.calculateBrokersForStorage(storageCalc.totalStorageGB),
135
+ partitions: this.calculateBrokersForPartitions(partitioning.partitionCount),
136
+ network: this.calculateBrokersForNetwork(throughput),
137
+ };
138
+
139
+ // Take the maximum to satisfy all constraints
140
+ const brokerCount = Math.max(
141
+ brokerCountOptions.throughput,
142
+ brokerCountOptions.storage,
143
+ brokerCountOptions.partitions,
144
+ brokerCountOptions.network,
145
+ 3 // Minimum for production (quorum)
146
+ );
147
+
148
+ // Calculate utilization
149
+ const utilization = this.calculateUtilization(
150
+ brokerCount,
151
+ partitioning.partitionCount,
152
+ throughput,
153
+ storageCalc.totalStorageGB
154
+ );
155
+
156
+ // Generate warnings
157
+ const warnings: string[] = [];
158
+ if (utilization.cpu > 80) {
159
+ warnings.push(`High CPU utilization (${utilization.cpu.toFixed(1)}%) - consider more brokers`);
160
+ }
161
+ if (utilization.disk > this.constraints.maxDiskUtilization) {
162
+ warnings.push(`Disk utilization (${utilization.disk.toFixed(1)}%) exceeds ${this.constraints.maxDiskUtilization}% threshold`);
163
+ }
164
+ if (utilization.network > 70) {
165
+ warnings.push(`Network utilization (${utilization.network.toFixed(1)}%) is high - risk of bottleneck`);
166
+ }
167
+ if (utilization.partitions > 80) {
168
+ warnings.push(`Partition count (${partitioning.partitionCount}) is ${utilization.partitions.toFixed(1)}% of broker capacity`);
169
+ }
170
+ if (brokerCount < 3) {
171
+ warnings.push('Less than 3 brokers - not suitable for production (no fault tolerance)');
172
+ }
173
+ if (partitioning.partitionCount < brokerCount) {
174
+ warnings.push(`Partition count (${partitioning.partitionCount}) < broker count (${brokerCount}) - underutilized`);
175
+ }
176
+
177
+ return {
178
+ brokerCount,
179
+ partitionCount: partitioning.partitionCount,
180
+ storagePerBrokerGB: storageCalc.totalStorageGB / brokerCount,
181
+ totalStorageGB: storageCalc.totalStorageGB,
182
+ throughputHeadroom: this.calculateThroughputHeadroom(brokerCount, throughput),
183
+ utilization,
184
+ warnings,
185
+ };
186
+ }
187
+
188
+ /**
189
+ * Calculate optimal partition count
190
+ */
191
+ calculatePartitionCount(throughput: ThroughputRequirements): PartitionSizingResult {
192
+ const reasoning: string[] = [];
193
+
194
+ // Rule 1: Throughput-based sizing
195
+ // Kafka can handle ~50 MB/s per partition (producer side)
196
+ const maxThroughputPerPartition = 50; // MB/s
197
+ const partitionsForProducerThroughput = Math.ceil(
198
+ throughput.producerThroughputMBps / maxThroughputPerPartition
199
+ );
200
+ reasoning.push(
201
+ `Producer throughput: ${throughput.producerThroughputMBps} MB/s ÷ ${maxThroughputPerPartition} MB/s/partition = ${partitionsForProducerThroughput} partitions`
202
+ );
203
+
204
+ // Rule 2: Consumer parallelism
205
+ // Each consumer in a group processes one partition
206
+ const partitionsForConsumerThroughput = Math.ceil(
207
+ throughput.consumerThroughputMBps / maxThroughputPerPartition
208
+ );
209
+ reasoning.push(
210
+ `Consumer throughput: ${throughput.consumerThroughputMBps} MB/s ÷ ${maxThroughputPerPartition} MB/s/partition = ${partitionsForConsumerThroughput} partitions`
211
+ );
212
+
213
+ // Rule 3: Target partition size (max 10GB per partition for fast recovery)
214
+ const targetPartitionSizeGB = 10;
215
+
216
+ // Take the maximum
217
+ const minPartitions = Math.max(
218
+ partitionsForProducerThroughput,
219
+ partitionsForConsumerThroughput,
220
+ 1 // At least 1 partition
221
+ );
222
+
223
+ // Round up to next power of 2 for better distribution
224
+ const partitionCount = this.nextPowerOfTwo(minPartitions);
225
+ reasoning.push(`Rounded to power of 2: ${partitionCount} partitions (for even distribution)`);
226
+
227
+ return {
228
+ partitionCount,
229
+ maxThroughputPerPartition,
230
+ consumerParallelism: partitionCount,
231
+ partitionSizeGB: targetPartitionSizeGB,
232
+ reasoning,
233
+ };
234
+ }
235
+
236
+ /**
237
+ * Calculate storage requirements
238
+ */
239
+ calculateStorageRequirements(
240
+ throughput: ThroughputRequirements,
241
+ storage: StorageRequirements,
242
+ partitionCount: number
243
+ ): {
244
+ totalStorageGB: number;
245
+ storagePerPartitionGB: number;
246
+ rawStorageGB: number;
247
+ compressedStorageGB: number;
248
+ } {
249
+ const compressionRatio = storage.compressionRatio || 0.3; // 70% compression
250
+ const growthBuffer = storage.growthBuffer || 1.5; // 50% growth buffer
251
+
252
+ // Calculate data rate
253
+ const dataRateMBps = throughput.producerThroughputMBps;
254
+ const dataRateGBperHour = dataRateMBps * 3.6; // MB/s * 3600s/h / 1024 MB/GB ≈ 3.6
255
+
256
+ // Raw storage (uncompressed, unreplicated)
257
+ const rawStorageGB = dataRateGBperHour * storage.retentionHours;
258
+
259
+ // Apply compression
260
+ const compressedStorageGB = rawStorageGB * compressionRatio;
261
+
262
+ // Apply replication
263
+ const replicatedStorageGB = compressedStorageGB * storage.replicationFactor;
264
+
265
+ // Apply growth buffer
266
+ const totalStorageGB = replicatedStorageGB * growthBuffer;
267
+
268
+ // Per partition
269
+ const storagePerPartitionGB = totalStorageGB / partitionCount;
270
+
271
+ return {
272
+ totalStorageGB,
273
+ storagePerPartitionGB,
274
+ rawStorageGB,
275
+ compressedStorageGB,
276
+ };
277
+ }
278
+
279
+ /**
280
+ * Calculate brokers needed for throughput
281
+ */
282
+ private calculateBrokersForThroughput(throughput: ThroughputRequirements): number {
283
+ // Each broker can handle ~200 MB/s total (100 MB/s in + 100 MB/s out)
284
+ const maxBrokerThroughputMBps = 100;
285
+ const totalThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
286
+ return Math.ceil(totalThroughput / maxBrokerThroughputMBps);
287
+ }
288
+
289
+ /**
290
+ * Calculate brokers needed for storage
291
+ */
292
+ private calculateBrokersForStorage(totalStorageGB: number): number {
293
+ // Assume 2TB disks per broker (usable storage after RAID, OS overhead)
294
+ const usableStoragePerBrokerGB = 2000;
295
+ const maxUtilization = this.constraints.maxDiskUtilization / 100;
296
+ const effectiveStoragePerBroker = usableStoragePerBrokerGB * maxUtilization;
297
+ return Math.ceil(totalStorageGB / effectiveStoragePerBroker);
298
+ }
299
+
300
+ /**
301
+ * Calculate brokers needed for partition count
302
+ */
303
+ private calculateBrokersForPartitions(partitionCount: number): number {
304
+ return Math.ceil(partitionCount / this.constraints.maxPartitionsPerBroker);
305
+ }
306
+
307
+ /**
308
+ * Calculate brokers needed for network bandwidth
309
+ */
310
+ private calculateBrokersForNetwork(throughput: ThroughputRequirements): number {
311
+ const totalNetworkMBps = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
312
+ const maxNetworkUtilization = 0.7; // 70% max utilization
313
+ const effectiveBandwidth = this.constraints.networkBandwidthMBps * maxNetworkUtilization;
314
+ return Math.ceil(totalNetworkMBps / effectiveBandwidth);
315
+ }
316
+
317
+ /**
318
+ * Calculate resource utilization
319
+ */
320
+ private calculateUtilization(
321
+ brokerCount: number,
322
+ partitionCount: number,
323
+ throughput: ThroughputRequirements,
324
+ totalStorageGB: number
325
+ ): {
326
+ cpu: number;
327
+ memory: number;
328
+ disk: number;
329
+ network: number;
330
+ partitions: number;
331
+ } {
332
+ // CPU: ~5% per 10 MB/s throughput
333
+ const totalThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
334
+ const cpuPerBroker = (totalThroughput / brokerCount / 10) * 5;
335
+ const cpu = Math.min(cpuPerBroker, 100);
336
+
337
+ // Memory: ~2GB base + 1MB per partition
338
+ const memoryPerBroker = (2 + (partitionCount / brokerCount) * 0.001) / this.constraints.ramPerBrokerGB * 100;
339
+ const memory = Math.min(memoryPerBroker, 100);
340
+
341
+ // Disk: actual usage vs capacity
342
+ const storagePerBroker = totalStorageGB / brokerCount;
343
+ const disk = (storagePerBroker / 2000) * 100; // Assuming 2TB disks
344
+
345
+ // Network: actual throughput vs bandwidth
346
+ const networkPerBroker = totalThroughput / brokerCount;
347
+ const network = (networkPerBroker / this.constraints.networkBandwidthMBps) * 100;
348
+
349
+ // Partitions: actual count vs max
350
+ const partitionsPerBroker = partitionCount / brokerCount;
351
+ const partitions = (partitionsPerBroker / this.constraints.maxPartitionsPerBroker) * 100;
352
+
353
+ return {
354
+ cpu: Math.round(cpu * 10) / 10,
355
+ memory: Math.round(memory * 10) / 10,
356
+ disk: Math.round(disk * 10) / 10,
357
+ network: Math.round(network * 10) / 10,
358
+ partitions: Math.round(partitions * 10) / 10,
359
+ };
360
+ }
361
+
362
+ /**
363
+ * Calculate throughput headroom
364
+ */
365
+ private calculateThroughputHeadroom(
366
+ brokerCount: number,
367
+ throughput: ThroughputRequirements
368
+ ): number {
369
+ const maxClusterThroughput = brokerCount * 100; // 100 MB/s per broker
370
+ const actualThroughput = throughput.producerThroughputMBps + throughput.consumerThroughputMBps;
371
+ return Math.round(((maxClusterThroughput - actualThroughput) / maxClusterThroughput) * 100);
372
+ }
373
+
374
+ /**
375
+ * Round up to next power of 2
376
+ */
377
+ private nextPowerOfTwo(n: number): number {
378
+ if (n <= 1) return 1;
379
+ return Math.pow(2, Math.ceil(Math.log2(n)));
380
+ }
381
+ }
382
+
383
+ /**
384
+ * Example Usage: Basic Capacity Planning
385
+ *
386
+ * ```typescript
387
+ * const planner = new KafkaCapacityPlanner();
388
+ *
389
+ * const sizing = planner.calculateClusterSize(
390
+ * {
391
+ * producerThroughputMBps: 100, // 100 MB/s producer throughput
392
+ * consumerThroughputMBps: 200, // 200 MB/s consumer throughput (2x fanout)
393
+ * avgMessageSizeBytes: 1024, // 1KB messages
394
+ * },
395
+ * {
396
+ * retentionHours: 168, // 7 days retention
397
+ * replicationFactor: 3, // Triple replication
398
+ * compressionRatio: 0.3, // 70% compression
399
+ * growthBuffer: 1.5, // 50% growth buffer
400
+ * },
401
+ * 10 // 10 topics
402
+ * );
403
+ *
404
+ * console.log(`Recommended: ${sizing.brokerCount} brokers`);
405
+ * console.log(`Partitions: ${sizing.partitionCount}`);
406
+ * console.log(`Storage per broker: ${sizing.storagePerBrokerGB.toFixed(1)} GB`);
407
+ * console.log(`Throughput headroom: ${sizing.throughputHeadroom}%`);
408
+ *
409
+ * if (sizing.warnings.length > 0) {
410
+ * console.warn('Warnings:', sizing.warnings);
411
+ * }
412
+ * ```
413
+ */
414
+
415
+ /**
416
+ * Example Usage: Partition Optimization
417
+ *
418
+ * ```typescript
419
+ * const planner = new KafkaCapacityPlanner();
420
+ *
421
+ * const partitioning = planner.calculatePartitionCount({
422
+ * producerThroughputMBps: 500, // 500 MB/s peak
423
+ * consumerThroughputMBps: 500,
424
+ * avgMessageSizeBytes: 2048,
425
+ * });
426
+ *
427
+ * console.log(`Recommended partitions: ${partitioning.partitionCount}`);
428
+ * console.log(`Consumer parallelism: ${partitioning.consumerParallelism}`);
429
+ * console.log('Reasoning:', partitioning.reasoning);
430
+ * ```
431
+ */
432
+
433
+ /**
434
+ * Capacity Planning Best Practices:
435
+ *
436
+ * **Sizing Guidelines**:
437
+ * - Start with 3 brokers minimum (fault tolerance)
438
+ * - Target 70% resource utilization (headroom for spikes)
439
+ * - Power-of-2 partition counts (even key distribution)
440
+ * - Max 4000 partitions per broker (metadata overhead)
441
+ * - Max 10GB per partition (fast recovery)
442
+ *
443
+ * **Throughput Estimates**:
444
+ * - Producer: ~50 MB/s per partition
445
+ * - Consumer: ~50 MB/s per partition
446
+ * - Broker total: ~100 MB/s (in + out combined)
447
+ *
448
+ * **Storage Estimation**:
449
+ * - Compression: 50-70% (Snappy/LZ4)
450
+ * - Growth buffer: 50% (1.5x multiplier)
451
+ * - Replication: 3x for production
452
+ * - Disk utilization: Max 70%
453
+ *
454
+ * **Scaling Rules**:
455
+ * - Add brokers when CPU > 80%
456
+ * - Add brokers when network > 70%
457
+ * - Add partitions when lag increases
458
+ * - Rebalance when utilization uneven
459
+ *
460
+ * **Common Sizing Patterns**:
461
+ * - **Small** (< 100 MB/s): 3 brokers, 8-16 partitions
462
+ * - **Medium** (100-500 MB/s): 5-10 brokers, 32-64 partitions
463
+ * - **Large** (500-1000 MB/s): 10-20 brokers, 128-256 partitions
464
+ * - **XLarge** (> 1000 MB/s): 20+ brokers, 512+ partitions
465
+ */
466
+
467
+ export default {
468
+ KafkaCapacityPlanner,
469
+ };