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,541 @@
1
+ // ==================================================
2
+ // Apache Kafka Platform Adapter
3
+ // ==================================================
4
+ // Implementation for self-hosted Apache Kafka clusters
5
+
6
+ import { Kafka, Admin, ITopicConfig, ResourceTypes, AclResourceTypes, AclOperationTypes, AclPermissionTypes } from 'kafkajs';
7
+ import {
8
+ PlatformAdapter,
9
+ KafkaPlatform,
10
+ ConnectionConfig,
11
+ ClusterInfo,
12
+ ClusterMetrics,
13
+ TopicConfig,
14
+ Topic,
15
+ TopicMetadata,
16
+ Partition,
17
+ ConsumerGroupDescription,
18
+ ConsumerGroupOffset,
19
+ AdminOperationResult,
20
+ } from './platform-adapter';
21
+
22
+ export class ApacheKafkaAdapter implements PlatformAdapter {
23
+ readonly platform = KafkaPlatform.APACHE_KAFKA;
24
+
25
+ private kafka: Kafka | null = null;
26
+ private admin: Admin | null = null;
27
+ private connected: boolean = false;
28
+ private config: ConnectionConfig | null = null;
29
+
30
+ // ==================================================
31
+ // Connection Management
32
+ // ==================================================
33
+
34
+ async connect(config: ConnectionConfig): Promise<void> {
35
+ if (this.connected) {
36
+ throw new Error('Already connected. Call disconnect() first.');
37
+ }
38
+
39
+ this.config = config;
40
+
41
+ const kafkaConfig: any = {
42
+ clientId: config.clientId || 'specweave-kafka-adapter',
43
+ brokers: config.brokers,
44
+ connectionTimeout: config.connectionTimeout || 30000,
45
+ requestTimeout: config.requestTimeout || 30000,
46
+ };
47
+
48
+ // SSL configuration
49
+ if (config.ssl?.enabled) {
50
+ kafkaConfig.ssl = {
51
+ rejectUnauthorized: true,
52
+ ca: config.ssl.truststore ? [config.ssl.truststore] : undefined,
53
+ key: config.ssl.keystore,
54
+ cert: config.ssl.keystore,
55
+ };
56
+ }
57
+
58
+ // SASL configuration
59
+ if (config.sasl) {
60
+ kafkaConfig.sasl = {
61
+ mechanism: config.sasl.mechanism.toLowerCase().replace('_', '-') as any,
62
+ username: config.sasl.username,
63
+ password: config.sasl.password,
64
+ };
65
+
66
+ // OAuth configuration for Confluent Cloud
67
+ if (config.sasl.mechanism === 'OAUTHBEARER' && config.sasl.oauthConfig) {
68
+ kafkaConfig.sasl.oauthBearer = async () => {
69
+ // Simplified OAuth token fetch (production should use proper OAuth flow)
70
+ const response = await fetch(config.sasl!.oauthConfig!.tokenUrl, {
71
+ method: 'POST',
72
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
73
+ body: new URLSearchParams({
74
+ grant_type: 'client_credentials',
75
+ client_id: config.sasl!.oauthConfig!.clientId,
76
+ client_secret: config.sasl!.oauthConfig!.clientSecret,
77
+ }),
78
+ });
79
+ const data = await response.json();
80
+ return { value: data.access_token };
81
+ };
82
+ }
83
+ }
84
+
85
+ try {
86
+ this.kafka = new Kafka(kafkaConfig);
87
+ this.admin = this.kafka.admin();
88
+ await this.admin.connect();
89
+ this.connected = true;
90
+ } catch (error: any) {
91
+ throw new Error(`Failed to connect to Kafka: ${error.message}`);
92
+ }
93
+ }
94
+
95
+ async disconnect(): Promise<void> {
96
+ if (!this.connected || !this.admin) {
97
+ return;
98
+ }
99
+
100
+ try {
101
+ await this.admin.disconnect();
102
+ this.connected = false;
103
+ this.admin = null;
104
+ this.kafka = null;
105
+ this.config = null;
106
+ } catch (error: any) {
107
+ throw new Error(`Failed to disconnect from Kafka: ${error.message}`);
108
+ }
109
+ }
110
+
111
+ private ensureConnected(): Admin {
112
+ if (!this.connected || !this.admin) {
113
+ throw new Error('Not connected to Kafka. Call connect() first.');
114
+ }
115
+ return this.admin;
116
+ }
117
+
118
+ // ==================================================
119
+ // Cluster Information
120
+ // ==================================================
121
+
122
+ async getClusterInfo(): Promise<ClusterInfo> {
123
+ const admin = this.ensureConnected();
124
+
125
+ try {
126
+ const cluster = await admin.describeCluster();
127
+
128
+ return {
129
+ clusterId: cluster.clusterId || 'unknown',
130
+ clusterName: 'apache-kafka', // Self-hosted Kafka doesn't have cluster names
131
+ platform: this.platform,
132
+ version: 'unknown', // kafkajs doesn't expose broker version directly
133
+ brokerCount: cluster.brokers.length,
134
+ bootstrapServers: this.config!.brokers,
135
+ endpoints: {
136
+ bootstrap: this.config!.brokers.join(','),
137
+ },
138
+ };
139
+ } catch (error: any) {
140
+ throw new Error(`Failed to get cluster info: ${error.message}`);
141
+ }
142
+ }
143
+
144
+ async getClusterMetrics(): Promise<ClusterMetrics> {
145
+ const admin = this.ensureConnected();
146
+
147
+ try {
148
+ const topics = await admin.listTopics();
149
+ const cluster = await admin.describeCluster();
150
+
151
+ let partitionCount = 0;
152
+ let underReplicatedPartitions = 0;
153
+ let offlinePartitions = 0;
154
+
155
+ // Fetch metadata for all topics
156
+ for (const topic of topics) {
157
+ const metadata = await admin.fetchTopicMetadata({ topics: [topic] });
158
+ const topicMetadata = metadata.topics[0];
159
+
160
+ partitionCount += topicMetadata.partitions.length;
161
+
162
+ for (const partition of topicMetadata.partitions) {
163
+ if (partition.isr.length < partition.replicas.length) {
164
+ underReplicatedPartitions++;
165
+ }
166
+ if (partition.isr.length === 0) {
167
+ offlinePartitions++;
168
+ }
169
+ }
170
+ }
171
+
172
+ return {
173
+ brokerCount: cluster.brokers.length,
174
+ topicCount: topics.length,
175
+ partitionCount,
176
+ underReplicatedPartitions,
177
+ offlinePartitions,
178
+ activeController: cluster.controller ? 1 : 0,
179
+ messagesInPerSec: 0, // Requires JMX metrics (not available via Admin API)
180
+ bytesInPerSec: 0, // Requires JMX metrics
181
+ bytesOutPerSec: 0, // Requires JMX metrics
182
+ };
183
+ } catch (error: any) {
184
+ throw new Error(`Failed to get cluster metrics: ${error.message}`);
185
+ }
186
+ }
187
+
188
+ // ==================================================
189
+ // Topic Operations
190
+ // ==================================================
191
+
192
+ async listTopics(): Promise<string[]> {
193
+ const admin = this.ensureConnected();
194
+
195
+ try {
196
+ const topics = await admin.listTopics();
197
+ return topics;
198
+ } catch (error: any) {
199
+ throw new Error(`Failed to list topics: ${error.message}`);
200
+ }
201
+ }
202
+
203
+ async getTopicMetadata(topic: string): Promise<TopicMetadata> {
204
+ const admin = this.ensureConnected();
205
+
206
+ try {
207
+ const metadata = await admin.fetchTopicMetadata({ topics: [topic] });
208
+ const topicMetadata = metadata.topics[0];
209
+
210
+ if (!topicMetadata) {
211
+ throw new Error(`Topic '${topic}' not found`);
212
+ }
213
+
214
+ const partitions: Partition[] = topicMetadata.partitions.map((p) => ({
215
+ partition: p.partitionId,
216
+ leader: p.leader,
217
+ replicas: p.replicas,
218
+ isr: p.isr,
219
+ offlineReplicas: p.offlineReplicas || [],
220
+ }));
221
+
222
+ return {
223
+ name: topic,
224
+ partitions,
225
+ };
226
+ } catch (error: any) {
227
+ throw new Error(`Failed to get topic metadata for '${topic}': ${error.message}`);
228
+ }
229
+ }
230
+
231
+ async createTopic(config: TopicConfig): Promise<AdminOperationResult> {
232
+ const admin = this.ensureConnected();
233
+
234
+ try {
235
+ const topicConfig: ITopicConfig = {
236
+ topic: config.name,
237
+ numPartitions: config.partitions,
238
+ replicationFactor: config.replicationFactor,
239
+ configEntries: config.config ? Object.entries(config.config).map(([name, value]) => ({ name, value: String(value) })) : [],
240
+ };
241
+
242
+ await admin.createTopics({
243
+ topics: [topicConfig],
244
+ waitForLeaders: true,
245
+ });
246
+
247
+ return {
248
+ success: true,
249
+ message: `Topic '${config.name}' created successfully`,
250
+ details: { partitions: config.partitions, replicationFactor: config.replicationFactor },
251
+ };
252
+ } catch (error: any) {
253
+ return {
254
+ success: false,
255
+ message: `Failed to create topic '${config.name}': ${error.message}`,
256
+ };
257
+ }
258
+ }
259
+
260
+ async deleteTopic(topic: string): Promise<AdminOperationResult> {
261
+ const admin = this.ensureConnected();
262
+
263
+ try {
264
+ await admin.deleteTopics({ topics: [topic] });
265
+
266
+ return {
267
+ success: true,
268
+ message: `Topic '${topic}' deleted successfully`,
269
+ };
270
+ } catch (error: any) {
271
+ return {
272
+ success: false,
273
+ message: `Failed to delete topic '${topic}': ${error.message}`,
274
+ };
275
+ }
276
+ }
277
+
278
+ async updateTopicConfig(topic: string, config: Record<string, string>): Promise<AdminOperationResult> {
279
+ const admin = this.ensureConnected();
280
+
281
+ try {
282
+ await admin.alterConfigs({
283
+ resources: [
284
+ {
285
+ type: ResourceTypes.TOPIC,
286
+ name: topic,
287
+ configEntries: Object.entries(config).map(([name, value]) => ({ name, value })),
288
+ },
289
+ ],
290
+ });
291
+
292
+ return {
293
+ success: true,
294
+ message: `Topic '${topic}' configuration updated`,
295
+ details: config,
296
+ };
297
+ } catch (error: any) {
298
+ return {
299
+ success: false,
300
+ message: `Failed to update topic '${topic}' config: ${error.message}`,
301
+ };
302
+ }
303
+ }
304
+
305
+ async getTopicConfig(topic: string): Promise<Record<string, string>> {
306
+ const admin = this.ensureConnected();
307
+
308
+ try {
309
+ const result = await admin.describeConfigs({
310
+ resources: [{ type: ResourceTypes.TOPIC, name: topic }],
311
+ });
312
+
313
+ const configs: Record<string, string> = {};
314
+ for (const entry of result.resources[0].configEntries) {
315
+ configs[entry.configName] = entry.configValue;
316
+ }
317
+
318
+ return configs;
319
+ } catch (error: any) {
320
+ throw new Error(`Failed to get topic config for '${topic}': ${error.message}`);
321
+ }
322
+ }
323
+
324
+ // ==================================================
325
+ // Consumer Group Operations
326
+ // ==================================================
327
+
328
+ async listConsumerGroups(): Promise<string[]> {
329
+ const admin = this.ensureConnected();
330
+
331
+ try {
332
+ const groups = await admin.listGroups();
333
+ return groups.groups.map((g) => g.groupId);
334
+ } catch (error: any) {
335
+ throw new Error(`Failed to list consumer groups: ${error.message}`);
336
+ }
337
+ }
338
+
339
+ async describeConsumerGroup(groupId: string): Promise<ConsumerGroupDescription> {
340
+ const admin = this.ensureConnected();
341
+
342
+ try {
343
+ const result = await admin.describeGroups([groupId]);
344
+ const group = result.groups[0];
345
+
346
+ if (!group) {
347
+ throw new Error(`Consumer group '${groupId}' not found`);
348
+ }
349
+
350
+ return {
351
+ groupId: group.groupId,
352
+ state: group.state as any,
353
+ protocolType: group.protocolType,
354
+ protocol: group.protocol,
355
+ members: group.members.map((m) => ({
356
+ memberId: m.memberId,
357
+ clientId: m.clientId,
358
+ clientHost: m.clientHost,
359
+ memberMetadata: m.memberMetadata,
360
+ memberAssignment: m.memberAssignment,
361
+ })),
362
+ coordinator: {
363
+ id: group.coordinator.nodeId,
364
+ host: group.coordinator.host,
365
+ port: group.coordinator.port,
366
+ },
367
+ };
368
+ } catch (error: any) {
369
+ throw new Error(`Failed to describe consumer group '${groupId}': ${error.message}`);
370
+ }
371
+ }
372
+
373
+ async getConsumerGroupOffsets(groupId: string): Promise<ConsumerGroupOffset[]> {
374
+ const admin = this.ensureConnected();
375
+
376
+ try {
377
+ const offsets = await admin.fetchOffsets({ groupId });
378
+
379
+ const result: ConsumerGroupOffset[] = [];
380
+
381
+ for (const topic of offsets) {
382
+ for (const partition of topic.partitions) {
383
+ result.push({
384
+ topic: topic.topic,
385
+ partition: partition.partition,
386
+ currentOffset: Number(partition.offset),
387
+ logEndOffset: 0, // Need to fetch from topic metadata
388
+ lag: 0, // Calculate after fetching logEndOffset
389
+ metadata: partition.metadata || '',
390
+ });
391
+ }
392
+ }
393
+
394
+ // Fetch log end offsets for lag calculation
395
+ for (const offset of result) {
396
+ const metadata = await admin.fetchTopicOffsets(offset.topic);
397
+ const partitionMetadata = metadata.find((p) => p.partition === offset.partition);
398
+ if (partitionMetadata) {
399
+ offset.logEndOffset = Number(partitionMetadata.high);
400
+ offset.lag = offset.logEndOffset - offset.currentOffset;
401
+ }
402
+ }
403
+
404
+ return result;
405
+ } catch (error: any) {
406
+ throw new Error(`Failed to get consumer group offsets for '${groupId}': ${error.message}`);
407
+ }
408
+ }
409
+
410
+ async deleteConsumerGroup(groupId: string): Promise<AdminOperationResult> {
411
+ const admin = this.ensureConnected();
412
+
413
+ try {
414
+ await admin.deleteGroups([groupId]);
415
+
416
+ return {
417
+ success: true,
418
+ message: `Consumer group '${groupId}' deleted successfully`,
419
+ };
420
+ } catch (error: any) {
421
+ return {
422
+ success: false,
423
+ message: `Failed to delete consumer group '${groupId}': ${error.message}`,
424
+ };
425
+ }
426
+ }
427
+
428
+ async resetConsumerGroupOffsets(
429
+ groupId: string,
430
+ topic: string,
431
+ options: {
432
+ toEarliest?: boolean;
433
+ toLatest?: boolean;
434
+ toDateTime?: Date;
435
+ toOffset?: number;
436
+ }
437
+ ): Promise<AdminOperationResult> {
438
+ const admin = this.ensureConnected();
439
+
440
+ try {
441
+ const topicPartitions = await admin.fetchTopicOffsets(topic);
442
+
443
+ const resetOffsets: { partition: number; offset: string }[] = [];
444
+
445
+ for (const partition of topicPartitions) {
446
+ let offset: string;
447
+
448
+ if (options.toEarliest) {
449
+ offset = partition.low;
450
+ } else if (options.toLatest) {
451
+ offset = partition.high;
452
+ } else if (options.toOffset !== undefined) {
453
+ offset = String(options.toOffset);
454
+ } else if (options.toDateTime) {
455
+ // kafkajs doesn't support timestamp-based offset search directly
456
+ // Would need to implement binary search with offsetsForTimes
457
+ throw new Error('toDateTime not implemented yet');
458
+ } else {
459
+ throw new Error('Must specify one of: toEarliest, toLatest, toOffset, toDateTime');
460
+ }
461
+
462
+ resetOffsets.push({ partition: partition.partition, offset });
463
+ }
464
+
465
+ await admin.setOffsets({
466
+ groupId,
467
+ topic,
468
+ partitions: resetOffsets,
469
+ });
470
+
471
+ return {
472
+ success: true,
473
+ message: `Consumer group '${groupId}' offsets reset for topic '${topic}'`,
474
+ details: { resetOffsets },
475
+ };
476
+ } catch (error: any) {
477
+ return {
478
+ success: false,
479
+ message: `Failed to reset consumer group offsets: ${error.message}`,
480
+ };
481
+ }
482
+ }
483
+
484
+ // ==================================================
485
+ // ACL Operations
486
+ // ==================================================
487
+
488
+ async createAcl(acl: {
489
+ resourceType: 'Topic' | 'Group' | 'Cluster';
490
+ resourceName: string;
491
+ principal: string;
492
+ operation: 'Read' | 'Write' | 'Create' | 'Delete' | 'Alter' | 'Describe' | 'All';
493
+ permissionType: 'Allow' | 'Deny';
494
+ }): Promise<AdminOperationResult> {
495
+ const admin = this.ensureConnected();
496
+
497
+ try {
498
+ await admin.createAcls({
499
+ acl: [
500
+ {
501
+ resourceType: AclResourceTypes[acl.resourceType.toUpperCase() as keyof typeof AclResourceTypes],
502
+ resourceName: acl.resourceName,
503
+ principal: acl.principal,
504
+ operation: AclOperationTypes[acl.operation.toUpperCase() as keyof typeof AclOperationTypes],
505
+ permissionType: AclPermissionTypes[acl.permissionType.toUpperCase() as keyof typeof AclPermissionTypes],
506
+ resourcePatternType: 2, // LITERAL
507
+ host: '*',
508
+ },
509
+ ],
510
+ });
511
+
512
+ return {
513
+ success: true,
514
+ message: `ACL created for '${acl.principal}' on ${acl.resourceType} '${acl.resourceName}'`,
515
+ };
516
+ } catch (error: any) {
517
+ return {
518
+ success: false,
519
+ message: `Failed to create ACL: ${error.message}`,
520
+ };
521
+ }
522
+ }
523
+
524
+ async listAcls(): Promise<any[]> {
525
+ const admin = this.ensureConnected();
526
+
527
+ try {
528
+ const result = await admin.describeAcls({
529
+ resourceType: AclResourceTypes.ANY,
530
+ resourceName: null,
531
+ principal: null,
532
+ operation: AclOperationTypes.ANY,
533
+ permissionType: AclPermissionTypes.ANY,
534
+ });
535
+
536
+ return result.resources;
537
+ } catch (error: any) {
538
+ throw new Error(`Failed to list ACLs: ${error.message}`);
539
+ }
540
+ }
541
+ }
@@ -0,0 +1,47 @@
1
+ var KafkaPlatform = /* @__PURE__ */ ((KafkaPlatform2) => {
2
+ KafkaPlatform2["APACHE_KAFKA"] = "apache-kafka";
3
+ KafkaPlatform2["AWS_MSK"] = "aws-msk";
4
+ KafkaPlatform2["AZURE_EVENT_HUBS"] = "azure-event-hubs";
5
+ KafkaPlatform2["CONFLUENT_CLOUD"] = "confluent-cloud";
6
+ return KafkaPlatform2;
7
+ })(KafkaPlatform || {});
8
+ class PlatformAdapterFactory {
9
+ static create(platform) {
10
+ switch (platform) {
11
+ case "apache-kafka" /* APACHE_KAFKA */:
12
+ const { ApacheKafkaAdapter } = require("./apache-kafka-adapter");
13
+ return new ApacheKafkaAdapter();
14
+ case "aws-msk" /* AWS_MSK */:
15
+ const { AwsMskAdapter } = require("./aws-msk-adapter");
16
+ return new AwsMskAdapter();
17
+ case "azure-event-hubs" /* AZURE_EVENT_HUBS */:
18
+ const { AzureEventHubsAdapter } = require("./azure-event-hubs-adapter");
19
+ return new AzureEventHubsAdapter();
20
+ case "confluent-cloud" /* CONFLUENT_CLOUD */:
21
+ const { ConfluentCloudAdapter } = require("./confluent-cloud-adapter");
22
+ return new ConfluentCloudAdapter();
23
+ default:
24
+ throw new Error(`Unsupported platform: ${platform}`);
25
+ }
26
+ }
27
+ /**
28
+ * Auto-detect platform based on connection config
29
+ */
30
+ static detectPlatform(config) {
31
+ const broker = config.brokers[0].toLowerCase();
32
+ if (broker.includes(".kafka.") && broker.includes(".amazonaws.com")) {
33
+ return "aws-msk" /* AWS_MSK */;
34
+ }
35
+ if (broker.includes(".servicebus.windows.net")) {
36
+ return "azure-event-hubs" /* AZURE_EVENT_HUBS */;
37
+ }
38
+ if (broker.includes(".confluent.cloud") || broker.includes(".gcp.confluent.cloud")) {
39
+ return "confluent-cloud" /* CONFLUENT_CLOUD */;
40
+ }
41
+ return "apache-kafka" /* APACHE_KAFKA */;
42
+ }
43
+ }
44
+ export {
45
+ KafkaPlatform,
46
+ PlatformAdapterFactory
47
+ };