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,205 @@
1
+ var CompactionStrategy = /* @__PURE__ */ ((CompactionStrategy2) => {
2
+ CompactionStrategy2["DELETE"] = "delete";
3
+ CompactionStrategy2["COMPACT"] = "compact";
4
+ CompactionStrategy2["COMPACT_DELETE"] = "compact,delete";
5
+ return CompactionStrategy2;
6
+ })(CompactionStrategy || {});
7
+ class TieredStorageManager {
8
+ /**
9
+ * Generate tiered storage broker configuration
10
+ */
11
+ static generateBrokerConfig(config) {
12
+ const brokerConfig = {
13
+ // Enable tiered storage
14
+ "remote.log.storage.system.enable": config.enabled,
15
+ // Local tier retention (hot data)
16
+ "log.local.retention.ms": config.localRetentionMs,
17
+ "log.local.retention.bytes": -1,
18
+ // Unlimited by size
19
+ // Remote storage system
20
+ "remote.log.storage.manager.class.name": this.getRemoteStorageManagerClass(
21
+ config.remoteStorageSystem
22
+ ),
23
+ // S3-specific configuration (if S3)
24
+ ...config.remoteStorageSystem === "S3" && {
25
+ "rsm.config.remote.log.storage.s3.bucket.name": config.remoteStoragePath,
26
+ "rsm.config.remote.log.storage.s3.region": "us-east-1"
27
+ },
28
+ // Upload configuration
29
+ "remote.log.manager.task.interval.ms": config.uploadIntervalMs || 6e4,
30
+ // Compression
31
+ "remote.log.storage.manager.class.path": "/usr/share/kafka/plugins/tiered-storage"
32
+ };
33
+ if (config.compressionType && config.compressionType !== "none") {
34
+ brokerConfig["compression.type"] = config.compressionType;
35
+ }
36
+ return brokerConfig;
37
+ }
38
+ /**
39
+ * Generate tiered storage topic configuration
40
+ */
41
+ static generateTopicConfig(config) {
42
+ return {
43
+ // Enable tiered storage for this topic
44
+ "remote.storage.enable": config.enabled ? "true" : "false",
45
+ // Local retention (hot tier)
46
+ "local.retention.ms": config.localRetentionMs.toString(),
47
+ "local.retention.bytes": "-1",
48
+ // Unlimited
49
+ // Total retention (hot + cold tier)
50
+ "retention.ms": config.remoteRetentionMs.toString(),
51
+ // Segment configuration
52
+ "segment.bytes": "1073741824",
53
+ // 1GB segments
54
+ "segment.ms": "604800000"
55
+ // 7 days
56
+ // Note: Remote data deleted when retention.ms expires
57
+ };
58
+ }
59
+ /**
60
+ * Calculate storage savings
61
+ */
62
+ static calculateStorageSavings(totalDataGB, localRetentionDays, totalRetentionDays, replicationFactor) {
63
+ const dailyDataGB = totalDataGB / totalRetentionDays;
64
+ const localStorageGB = dailyDataGB * localRetentionDays * replicationFactor;
65
+ const remoteStorageGB = dailyDataGB * (totalRetentionDays - localRetentionDays);
66
+ const nonTieredStorageGB = totalDataGB * replicationFactor;
67
+ const totalStorageGB = localStorageGB + remoteStorageGB;
68
+ const savingsPercent = (nonTieredStorageGB - totalStorageGB) / nonTieredStorageGB * 100;
69
+ return {
70
+ localStorageGB: Math.round(localStorageGB * 10) / 10,
71
+ remoteStorageGB: Math.round(remoteStorageGB * 10) / 10,
72
+ totalStorageGB: Math.round(totalStorageGB * 10) / 10,
73
+ savingsPercent: Math.round(savingsPercent * 10) / 10
74
+ };
75
+ }
76
+ static getRemoteStorageManagerClass(system) {
77
+ const classMap = {
78
+ "S3": "org.apache.kafka.server.log.remote.storage.RemoteLogStorageManager",
79
+ "Azure Blob": "org.apache.kafka.server.log.remote.storage.AzureBlobRemoteStorageManager",
80
+ "Google Cloud Storage": "org.apache.kafka.server.log.remote.storage.GCSRemoteStorageManager",
81
+ "MinIO": "org.apache.kafka.server.log.remote.storage.MinIORemoteStorageManager"
82
+ };
83
+ return classMap[system];
84
+ }
85
+ }
86
+ class LogCompactionManager {
87
+ /**
88
+ * Generate compaction topic configuration
89
+ */
90
+ static generateCompactionConfig(config) {
91
+ const topicConfig = {
92
+ // Cleanup policy
93
+ "cleanup.policy": config.cleanupPolicy,
94
+ // Segment configuration
95
+ "segment.bytes": (config.segmentBytes || 1073741824).toString(),
96
+ // 1GB default
97
+ "segment.ms": (config.segmentMs || 6048e5).toString(),
98
+ // 7 days default
99
+ // Compaction lag
100
+ "min.compaction.lag.ms": (config.minCompactionLagMs || 0).toString(),
101
+ "max.compaction.lag.ms": (config.maxCompactionLagMs || 9223372036854776e3).toString(),
102
+ // Max long
103
+ // Delete retention (tombstone retention)
104
+ "delete.retention.ms": (config.deleteRetentionMs || 864e5).toString(),
105
+ // 24 hours default
106
+ // Min cleanable ratio (% of log that must be dirty)
107
+ "min.cleanable.dirty.ratio": (config.minCleanableRatio || 0.5).toString()
108
+ // 50% default
109
+ };
110
+ return topicConfig;
111
+ }
112
+ /**
113
+ * Choose compaction strategy based on use case
114
+ */
115
+ static chooseStrategy(useCase) {
116
+ const strategies = {
117
+ "event-log": {
118
+ strategy: "delete" /* DELETE */,
119
+ reasoning: "Event logs are immutable and time-based. Keep all events for retention period.",
120
+ exampleConfig: {
121
+ cleanupPolicy: "delete" /* DELETE */,
122
+ segmentMs: 864e5
123
+ // 1 day segments
124
+ // retention.ms set separately (e.g., 30 days)
125
+ }
126
+ },
127
+ "changelog": {
128
+ strategy: "compact" /* COMPACT */,
129
+ reasoning: "Changelog topics should keep latest state per key. Compaction removes old values.",
130
+ exampleConfig: {
131
+ cleanupPolicy: "compact" /* COMPACT */,
132
+ segmentMs: 6048e5,
133
+ // 7 days
134
+ minCompactionLagMs: 36e5,
135
+ // 1 hour delay
136
+ deleteRetentionMs: 864e5
137
+ // 24 hours
138
+ }
139
+ },
140
+ "kv-store": {
141
+ strategy: "compact" /* COMPACT */,
142
+ reasoning: "Key-value store topics need latest value per key (compacted log).",
143
+ exampleConfig: {
144
+ cleanupPolicy: "compact" /* COMPACT */,
145
+ segmentBytes: 1073741824,
146
+ // 1GB
147
+ minCleanableRatio: 0.5
148
+ // Compact when 50% dirty
149
+ }
150
+ },
151
+ "user-profile": {
152
+ strategy: "compact,delete" /* COMPACT_DELETE */,
153
+ reasoning: "User profiles need latest state (compact) + eventual deletion (time-based).",
154
+ exampleConfig: {
155
+ cleanupPolicy: "compact,delete" /* COMPACT_DELETE */,
156
+ segmentMs: 2592e6,
157
+ // 30 days
158
+ minCompactionLagMs: 864e5,
159
+ // 1 day delay
160
+ deleteRetentionMs: 6048e5
161
+ // 7 days tombstone retention
162
+ }
163
+ },
164
+ "analytics": {
165
+ strategy: "delete" /* DELETE */,
166
+ reasoning: "Analytics data is time-series. Retention based on analysis window.",
167
+ exampleConfig: {
168
+ cleanupPolicy: "delete" /* DELETE */,
169
+ segmentMs: 36e5
170
+ // 1 hour segments
171
+ // retention.ms = 90 days typical
172
+ }
173
+ }
174
+ };
175
+ const match = strategies[useCase.toLowerCase()];
176
+ if (!match) {
177
+ throw new Error(`Unknown use case: ${useCase}. Valid options: ${Object.keys(strategies).join(", ")}`);
178
+ }
179
+ return match;
180
+ }
181
+ /**
182
+ * Estimate compaction savings
183
+ */
184
+ static estimateCompactionSavings(recordsPerDay, uniqueKeys, retentionDays) {
185
+ const uncompactedRecords = recordsPerDay * retentionDays;
186
+ const compactedRecords = uniqueKeys;
187
+ const savingsPercent = (uncompactedRecords - compactedRecords) / uncompactedRecords * 100;
188
+ return {
189
+ uncompactedRecords,
190
+ compactedRecords,
191
+ savingsPercent: Math.round(savingsPercent * 10) / 10
192
+ };
193
+ }
194
+ }
195
+ var tiered_storage_compaction_default = {
196
+ TieredStorageManager,
197
+ LogCompactionManager,
198
+ CompactionStrategy
199
+ };
200
+ export {
201
+ CompactionStrategy,
202
+ LogCompactionManager,
203
+ TieredStorageManager,
204
+ tiered_storage_compaction_default as default
205
+ };
@@ -0,0 +1,399 @@
1
+ /**
2
+ * Tiered Storage and Log Compaction Strategies
3
+ *
4
+ * Kafka Tiered Storage (KIP-405), log compaction patterns, and retention policies
5
+ *
6
+ * @module tiered-storage-compaction
7
+ */
8
+
9
+ /**
10
+ * Tiered Storage Configuration (Kafka 3.6+)
11
+ */
12
+ export interface TieredStorageConfig {
13
+ /** Enable tiered storage */
14
+ enabled: boolean;
15
+ /** Remote storage system */
16
+ remoteStorageSystem: 'S3' | 'Azure Blob' | 'Google Cloud Storage' | 'MinIO';
17
+ /** Remote storage path/bucket */
18
+ remoteStoragePath: string;
19
+ /** Local retention (hot tier) */
20
+ localRetentionMs: number;
21
+ /** Remote retention (cold tier) */
22
+ remoteRetentionMs: number;
23
+ /** Segment upload interval */
24
+ uploadIntervalMs?: number;
25
+ /** Compression codec */
26
+ compressionType?: 'none' | 'gzip' | 'snappy' | 'lz4' | 'zstd';
27
+ }
28
+
29
+ /**
30
+ * Log Compaction Strategy
31
+ */
32
+ export enum CompactionStrategy {
33
+ /** Delete old records (time-based retention) */
34
+ DELETE = 'delete',
35
+ /** Compact: Keep latest value per key */
36
+ COMPACT = 'compact',
37
+ /** Compact + Delete: Compact AND time-based deletion */
38
+ COMPACT_DELETE = 'compact,delete',
39
+ }
40
+
41
+ /**
42
+ * Compaction Configuration
43
+ */
44
+ export interface CompactionConfig {
45
+ /** Cleanup policy */
46
+ cleanupPolicy: CompactionStrategy;
47
+ /** Segment size before compaction (bytes) */
48
+ segmentBytes?: number;
49
+ /** Segment time before compaction (ms) */
50
+ segmentMs?: number;
51
+ /** Min compaction lag (ms) - delay before compaction */
52
+ minCompactionLagMs?: number;
53
+ /** Max compaction lag (ms) - force compaction */
54
+ maxCompactionLagMs?: number;
55
+ /** Delete retention (tombstone retention) */
56
+ deleteRetentionMs?: number;
57
+ /** Min cleanable dirty ratio */
58
+ minCleanableRatio?: number;
59
+ }
60
+
61
+ /**
62
+ * Tiered Storage Manager
63
+ *
64
+ * Manages Kafka tiered storage configuration
65
+ */
66
+ export class TieredStorageManager {
67
+ /**
68
+ * Generate tiered storage broker configuration
69
+ */
70
+ static generateBrokerConfig(config: TieredStorageConfig): Record<string, any> {
71
+ const brokerConfig: Record<string, any> = {
72
+ // Enable tiered storage
73
+ 'remote.log.storage.system.enable': config.enabled,
74
+
75
+ // Local tier retention (hot data)
76
+ 'log.local.retention.ms': config.localRetentionMs,
77
+ 'log.local.retention.bytes': -1, // Unlimited by size
78
+
79
+ // Remote storage system
80
+ 'remote.log.storage.manager.class.name': this.getRemoteStorageManagerClass(
81
+ config.remoteStorageSystem
82
+ ),
83
+
84
+ // S3-specific configuration (if S3)
85
+ ...(config.remoteStorageSystem === 'S3' && {
86
+ 'rsm.config.remote.log.storage.s3.bucket.name': config.remoteStoragePath,
87
+ 'rsm.config.remote.log.storage.s3.region': 'us-east-1',
88
+ }),
89
+
90
+ // Upload configuration
91
+ 'remote.log.manager.task.interval.ms': config.uploadIntervalMs || 60000,
92
+
93
+ // Compression
94
+ 'remote.log.storage.manager.class.path': '/usr/share/kafka/plugins/tiered-storage',
95
+ };
96
+
97
+ if (config.compressionType && config.compressionType !== 'none') {
98
+ brokerConfig['compression.type'] = config.compressionType;
99
+ }
100
+
101
+ return brokerConfig;
102
+ }
103
+
104
+ /**
105
+ * Generate tiered storage topic configuration
106
+ */
107
+ static generateTopicConfig(config: TieredStorageConfig): Record<string, string> {
108
+ return {
109
+ // Enable tiered storage for this topic
110
+ 'remote.storage.enable': config.enabled ? 'true' : 'false',
111
+
112
+ // Local retention (hot tier)
113
+ 'local.retention.ms': config.localRetentionMs.toString(),
114
+ 'local.retention.bytes': '-1', // Unlimited
115
+
116
+ // Total retention (hot + cold tier)
117
+ 'retention.ms': config.remoteRetentionMs.toString(),
118
+
119
+ // Segment configuration
120
+ 'segment.bytes': '1073741824', // 1GB segments
121
+ 'segment.ms': '604800000', // 7 days
122
+
123
+ // Note: Remote data deleted when retention.ms expires
124
+ };
125
+ }
126
+
127
+ /**
128
+ * Calculate storage savings
129
+ */
130
+ static calculateStorageSavings(
131
+ totalDataGB: number,
132
+ localRetentionDays: number,
133
+ totalRetentionDays: number,
134
+ replicationFactor: number
135
+ ): {
136
+ localStorageGB: number;
137
+ remoteStorageGB: number;
138
+ totalStorageGB: number;
139
+ savingsPercent: number;
140
+ } {
141
+ // Assume uniform write rate
142
+ const dailyDataGB = totalDataGB / totalRetentionDays;
143
+
144
+ // Local storage (hot tier): recent data + replication
145
+ const localStorageGB = dailyDataGB * localRetentionDays * replicationFactor;
146
+
147
+ // Remote storage (cold tier): archived data (single copy)
148
+ const remoteStorageGB = dailyDataGB * (totalRetentionDays - localRetentionDays);
149
+
150
+ // Without tiered storage: all data replicated locally
151
+ const nonTieredStorageGB = totalDataGB * replicationFactor;
152
+
153
+ const totalStorageGB = localStorageGB + remoteStorageGB;
154
+ const savingsPercent = ((nonTieredStorageGB - totalStorageGB) / nonTieredStorageGB) * 100;
155
+
156
+ return {
157
+ localStorageGB: Math.round(localStorageGB * 10) / 10,
158
+ remoteStorageGB: Math.round(remoteStorageGB * 10) / 10,
159
+ totalStorageGB: Math.round(totalStorageGB * 10) / 10,
160
+ savingsPercent: Math.round(savingsPercent * 10) / 10,
161
+ };
162
+ }
163
+
164
+ private static getRemoteStorageManagerClass(system: TieredStorageConfig['remoteStorageSystem']): string {
165
+ const classMap = {
166
+ 'S3': 'org.apache.kafka.server.log.remote.storage.RemoteLogStorageManager',
167
+ 'Azure Blob': 'org.apache.kafka.server.log.remote.storage.AzureBlobRemoteStorageManager',
168
+ 'Google Cloud Storage': 'org.apache.kafka.server.log.remote.storage.GCSRemoteStorageManager',
169
+ 'MinIO': 'org.apache.kafka.server.log.remote.storage.MinIORemoteStorageManager',
170
+ };
171
+ return classMap[system];
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Log Compaction Manager
177
+ *
178
+ * Manages log compaction strategies and configuration
179
+ */
180
+ export class LogCompactionManager {
181
+ /**
182
+ * Generate compaction topic configuration
183
+ */
184
+ static generateCompactionConfig(config: CompactionConfig): Record<string, string> {
185
+ const topicConfig: Record<string, string> = {
186
+ // Cleanup policy
187
+ 'cleanup.policy': config.cleanupPolicy,
188
+
189
+ // Segment configuration
190
+ 'segment.bytes': (config.segmentBytes || 1073741824).toString(), // 1GB default
191
+ 'segment.ms': (config.segmentMs || 604800000).toString(), // 7 days default
192
+
193
+ // Compaction lag
194
+ 'min.compaction.lag.ms': (config.minCompactionLagMs || 0).toString(),
195
+ 'max.compaction.lag.ms': (config.maxCompactionLagMs || 9223372036854775807).toString(), // Max long
196
+
197
+ // Delete retention (tombstone retention)
198
+ 'delete.retention.ms': (config.deleteRetentionMs || 86400000).toString(), // 24 hours default
199
+
200
+ // Min cleanable ratio (% of log that must be dirty)
201
+ 'min.cleanable.dirty.ratio': (config.minCleanableRatio || 0.5).toString(), // 50% default
202
+ };
203
+
204
+ return topicConfig;
205
+ }
206
+
207
+ /**
208
+ * Choose compaction strategy based on use case
209
+ */
210
+ static chooseStrategy(useCase: string): {
211
+ strategy: CompactionStrategy;
212
+ reasoning: string;
213
+ exampleConfig: CompactionConfig;
214
+ } {
215
+ const strategies = {
216
+ 'event-log': {
217
+ strategy: CompactionStrategy.DELETE,
218
+ reasoning: 'Event logs are immutable and time-based. Keep all events for retention period.',
219
+ exampleConfig: {
220
+ cleanupPolicy: CompactionStrategy.DELETE,
221
+ segmentMs: 86400000, // 1 day segments
222
+ // retention.ms set separately (e.g., 30 days)
223
+ },
224
+ },
225
+ 'changelog': {
226
+ strategy: CompactionStrategy.COMPACT,
227
+ reasoning: 'Changelog topics should keep latest state per key. Compaction removes old values.',
228
+ exampleConfig: {
229
+ cleanupPolicy: CompactionStrategy.COMPACT,
230
+ segmentMs: 604800000, // 7 days
231
+ minCompactionLagMs: 3600000, // 1 hour delay
232
+ deleteRetentionMs: 86400000, // 24 hours
233
+ },
234
+ },
235
+ 'kv-store': {
236
+ strategy: CompactionStrategy.COMPACT,
237
+ reasoning: 'Key-value store topics need latest value per key (compacted log).',
238
+ exampleConfig: {
239
+ cleanupPolicy: CompactionStrategy.COMPACT,
240
+ segmentBytes: 1073741824, // 1GB
241
+ minCleanableRatio: 0.5, // Compact when 50% dirty
242
+ },
243
+ },
244
+ 'user-profile': {
245
+ strategy: CompactionStrategy.COMPACT_DELETE,
246
+ reasoning: 'User profiles need latest state (compact) + eventual deletion (time-based).',
247
+ exampleConfig: {
248
+ cleanupPolicy: CompactionStrategy.COMPACT_DELETE,
249
+ segmentMs: 2592000000, // 30 days
250
+ minCompactionLagMs: 86400000, // 1 day delay
251
+ deleteRetentionMs: 604800000, // 7 days tombstone retention
252
+ },
253
+ },
254
+ 'analytics': {
255
+ strategy: CompactionStrategy.DELETE,
256
+ reasoning: 'Analytics data is time-series. Retention based on analysis window.',
257
+ exampleConfig: {
258
+ cleanupPolicy: CompactionStrategy.DELETE,
259
+ segmentMs: 3600000, // 1 hour segments
260
+ // retention.ms = 90 days typical
261
+ },
262
+ },
263
+ };
264
+
265
+ const match = strategies[useCase.toLowerCase()];
266
+ if (!match) {
267
+ throw new Error(`Unknown use case: ${useCase}. Valid options: ${Object.keys(strategies).join(', ')}`);
268
+ }
269
+
270
+ return match;
271
+ }
272
+
273
+ /**
274
+ * Estimate compaction savings
275
+ */
276
+ static estimateCompactionSavings(
277
+ recordsPerDay: number,
278
+ uniqueKeys: number,
279
+ retentionDays: number
280
+ ): {
281
+ uncompactedRecords: number;
282
+ compactedRecords: number;
283
+ savingsPercent: number;
284
+ } {
285
+ // Without compaction: all records retained
286
+ const uncompactedRecords = recordsPerDay * retentionDays;
287
+
288
+ // With compaction: only latest value per key
289
+ const compactedRecords = uniqueKeys;
290
+
291
+ const savingsPercent = ((uncompactedRecords - compactedRecords) / uncompactedRecords) * 100;
292
+
293
+ return {
294
+ uncompactedRecords,
295
+ compactedRecords,
296
+ savingsPercent: Math.round(savingsPercent * 10) / 10,
297
+ };
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Example Usage: Tiered Storage
303
+ *
304
+ * ```typescript
305
+ * const tieredConfig: TieredStorageConfig = {
306
+ * enabled: true,
307
+ * remoteStorageSystem: 'S3',
308
+ * remoteStoragePath: 'my-kafka-bucket',
309
+ * localRetentionMs: 7 * 24 * 60 * 60 * 1000, // 7 days hot (local)
310
+ * remoteRetentionMs: 365 * 24 * 60 * 60 * 1000, // 1 year total (hot + cold)
311
+ * compressionType: 'zstd',
312
+ * };
313
+ *
314
+ * const brokerConfig = TieredStorageManager.generateBrokerConfig(tieredConfig);
315
+ * const topicConfig = TieredStorageManager.generateTopicConfig(tieredConfig);
316
+ *
317
+ * // Calculate savings
318
+ * const savings = TieredStorageManager.calculateStorageSavings(
319
+ * 10000, // 10TB total data
320
+ * 7, // 7 days local retention
321
+ * 365, // 365 days total retention
322
+ * 3 // Replication factor 3
323
+ * );
324
+ * console.log(`Storage savings: ${savings.savingsPercent}%`);
325
+ * // Typical result: 85-90% storage cost reduction!
326
+ * ```
327
+ */
328
+
329
+ /**
330
+ * Example Usage: Log Compaction
331
+ *
332
+ * ```typescript
333
+ * // Choose strategy based on use case
334
+ * const { strategy, exampleConfig } = LogCompactionManager.chooseStrategy('changelog');
335
+ *
336
+ * const compactionConfig = LogCompactionManager.generateCompactionConfig(exampleConfig);
337
+ *
338
+ * // Apply to topic
339
+ * // kafka-topics.sh --alter --topic user-profiles --config cleanup.policy=compact
340
+ *
341
+ * // Estimate savings
342
+ * const savings = LogCompactionManager.estimateCompactionSavings(
343
+ * 10000000, // 10M records/day
344
+ * 1000000, // 1M unique keys
345
+ * 30 // 30 days retention
346
+ * );
347
+ * console.log(`Compaction savings: ${savings.savingsPercent}%`);
348
+ * // Result: 99.7% space savings!
349
+ * ```
350
+ */
351
+
352
+ /**
353
+ * Tiered Storage & Compaction Best Practices:
354
+ *
355
+ * **Tiered Storage Benefits**:
356
+ * - 80-90% storage cost reduction
357
+ * - Longer retention (years instead of weeks)
358
+ * - Single-copy remote storage (vs replicated local)
359
+ * - Automatic lifecycle management
360
+ *
361
+ * **When to Use Tiered Storage**:
362
+ * - Long retention requirements (> 30 days)
363
+ * - High data volume (> 1TB/day)
364
+ * - Compliance/audit requirements
365
+ * - Cost-sensitive workloads
366
+ *
367
+ * **Tiered Storage Configuration**:
368
+ * - Local retention: 7-30 days (hot data, low latency)
369
+ * - Remote retention: 90-365 days (cold data, higher latency)
370
+ * - Segment size: 1GB (balance between overhead and flexibility)
371
+ * - Upload interval: 60 seconds (balance between lag and efficiency)
372
+ *
373
+ * **Log Compaction Use Cases**:
374
+ * - DELETE: Event logs, analytics, time-series data
375
+ * - COMPACT: Changelogs, key-value stores, state snapshots
376
+ * - COMPACT+DELETE: User profiles, entity updates with TTL
377
+ *
378
+ * **Compaction Configuration**:
379
+ * - min.compaction.lag.ms: 1 hour (allow consumers to catch up)
380
+ * - max.compaction.lag.ms: 7 days (force compaction)
381
+ * - delete.retention.ms: 24 hours (tombstone retention)
382
+ * - min.cleanable.dirty.ratio: 0.5 (compact when 50% dirty)
383
+ *
384
+ * **Tombstone (null value) Handling**:
385
+ * - Compact + Delete: Tombstones deleted after delete.retention.ms
386
+ * - Allows consumers to see deletion events
387
+ * - Typical retention: 24 hours (balance between visibility and storage)
388
+ *
389
+ * **Monitoring**:
390
+ * - Tiered storage: Upload lag, remote storage size, read latency
391
+ * - Compaction: Compaction rate, cleaner IO, dirty log ratio
392
+ * - Alerts: High compaction lag, failed uploads, remote storage quota
393
+ */
394
+
395
+ export default {
396
+ TieredStorageManager,
397
+ LogCompactionManager,
398
+ CompactionStrategy,
399
+ };