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,362 @@
1
+ /**
2
+ * Multi-Cluster Configuration Manager
3
+ *
4
+ * Manages Kafka cluster configurations for dev, staging, prod environments
5
+ *
6
+ * @module cluster-config-manager
7
+ */
8
+
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+
12
+ /**
13
+ * Cluster Configuration
14
+ */
15
+ export interface ClusterConfig {
16
+ /** Unique cluster ID */
17
+ id: string;
18
+ /** Human-readable name */
19
+ name: string;
20
+ /** Environment (dev, staging, prod) */
21
+ environment: 'dev' | 'staging' | 'prod';
22
+ /** Bootstrap servers */
23
+ bootstrapServers: string[];
24
+ /** Security protocol */
25
+ securityProtocol: 'PLAINTEXT' | 'SASL_PLAINTEXT' | 'SASL_SSL' | 'SSL';
26
+ /** SASL mechanism (optional) */
27
+ saslMechanism?: 'PLAIN' | 'SCRAM-SHA-256' | 'SCRAM-SHA-512' | 'GSSAPI';
28
+ /** SASL username (optional) */
29
+ saslUsername?: string;
30
+ /** SASL password (optional) */
31
+ saslPassword?: string;
32
+ /** SSL CA certificate path (optional) */
33
+ sslCaPath?: string;
34
+ /** SSL client certificate path (optional) */
35
+ sslCertPath?: string;
36
+ /** SSL client key path (optional) */
37
+ sslKeyPath?: string;
38
+ /** Schema Registry URL (optional) */
39
+ schemaRegistryUrl?: string;
40
+ /** Cloud provider (optional) */
41
+ cloudProvider?: 'AWS' | 'Azure' | 'GCP' | 'Confluent' | 'Self-Hosted';
42
+ /** Region (optional) */
43
+ region?: string;
44
+ /** Tags (optional) */
45
+ tags?: Record<string, string>;
46
+ }
47
+
48
+ /**
49
+ * Multi-Cluster Configuration
50
+ */
51
+ export interface MultiClusterConfig {
52
+ /** Active cluster ID */
53
+ activeClusterId: string;
54
+ /** All cluster configurations */
55
+ clusters: ClusterConfig[];
56
+ }
57
+
58
+ /**
59
+ * Cluster Config Manager
60
+ *
61
+ * Manages multiple Kafka cluster configurations with persistence
62
+ */
63
+ export class ClusterConfigManager {
64
+ private config: MultiClusterConfig;
65
+ private configFilePath: string;
66
+
67
+ constructor(configFilePath: string = path.join(process.cwd(), '.kafka-clusters.json')) {
68
+ this.configFilePath = configFilePath;
69
+ this.config = this.loadConfig();
70
+ }
71
+
72
+ /**
73
+ * Load configuration from file
74
+ */
75
+ private loadConfig(): MultiClusterConfig {
76
+ if (fs.existsSync(this.configFilePath)) {
77
+ const data = fs.readFileSync(this.configFilePath, 'utf-8');
78
+ return JSON.parse(data);
79
+ }
80
+
81
+ // Default config with dev cluster
82
+ return {
83
+ activeClusterId: 'dev',
84
+ clusters: [
85
+ {
86
+ id: 'dev',
87
+ name: 'Development',
88
+ environment: 'dev',
89
+ bootstrapServers: ['localhost:9092'],
90
+ securityProtocol: 'PLAINTEXT',
91
+ cloudProvider: 'Self-Hosted',
92
+ },
93
+ ],
94
+ };
95
+ }
96
+
97
+ /**
98
+ * Save configuration to file
99
+ */
100
+ private saveConfig(): void {
101
+ fs.writeFileSync(
102
+ this.configFilePath,
103
+ JSON.stringify(this.config, null, 2),
104
+ 'utf-8'
105
+ );
106
+ }
107
+
108
+ /**
109
+ * Add cluster configuration
110
+ */
111
+ addCluster(cluster: ClusterConfig): void {
112
+ // Check for duplicate ID
113
+ if (this.config.clusters.some((c) => c.id === cluster.id)) {
114
+ throw new Error(`Cluster with ID "${cluster.id}" already exists`);
115
+ }
116
+
117
+ this.config.clusters.push(cluster);
118
+ this.saveConfig();
119
+ }
120
+
121
+ /**
122
+ * Update cluster configuration
123
+ */
124
+ updateCluster(clusterId: string, updates: Partial<ClusterConfig>): void {
125
+ const index = this.config.clusters.findIndex((c) => c.id === clusterId);
126
+ if (index === -1) {
127
+ throw new Error(`Cluster "${clusterId}" not found`);
128
+ }
129
+
130
+ this.config.clusters[index] = {
131
+ ...this.config.clusters[index],
132
+ ...updates,
133
+ id: clusterId, // Prevent ID change
134
+ };
135
+ this.saveConfig();
136
+ }
137
+
138
+ /**
139
+ * Remove cluster configuration
140
+ */
141
+ removeCluster(clusterId: string): void {
142
+ if (clusterId === this.config.activeClusterId) {
143
+ throw new Error(`Cannot remove active cluster "${clusterId}". Switch to another cluster first.`);
144
+ }
145
+
146
+ const index = this.config.clusters.findIndex((c) => c.id === clusterId);
147
+ if (index === -1) {
148
+ throw new Error(`Cluster "${clusterId}" not found`);
149
+ }
150
+
151
+ this.config.clusters.splice(index, 1);
152
+ this.saveConfig();
153
+ }
154
+
155
+ /**
156
+ * Get cluster configuration
157
+ */
158
+ getCluster(clusterId: string): ClusterConfig | undefined {
159
+ return this.config.clusters.find((c) => c.id === clusterId);
160
+ }
161
+
162
+ /**
163
+ * Get all clusters
164
+ */
165
+ getAllClusters(): ClusterConfig[] {
166
+ return [...this.config.clusters];
167
+ }
168
+
169
+ /**
170
+ * Get clusters by environment
171
+ */
172
+ getClustersByEnvironment(environment: 'dev' | 'staging' | 'prod'): ClusterConfig[] {
173
+ return this.config.clusters.filter((c) => c.environment === environment);
174
+ }
175
+
176
+ /**
177
+ * Get active cluster ID
178
+ */
179
+ getActiveClusterId(): string {
180
+ return this.config.activeClusterId;
181
+ }
182
+
183
+ /**
184
+ * Get active cluster configuration
185
+ */
186
+ getActiveCluster(): ClusterConfig {
187
+ const cluster = this.getCluster(this.config.activeClusterId);
188
+ if (!cluster) {
189
+ throw new Error(`Active cluster "${this.config.activeClusterId}" not found`);
190
+ }
191
+ return cluster;
192
+ }
193
+
194
+ /**
195
+ * Set active cluster
196
+ */
197
+ setActiveCluster(clusterId: string): void {
198
+ const cluster = this.getCluster(clusterId);
199
+ if (!cluster) {
200
+ throw new Error(`Cluster "${clusterId}" not found`);
201
+ }
202
+
203
+ this.config.activeClusterId = clusterId;
204
+ this.saveConfig();
205
+ }
206
+
207
+ /**
208
+ * Export configuration as JSON
209
+ */
210
+ exportConfig(): string {
211
+ return JSON.stringify(this.config, null, 2);
212
+ }
213
+
214
+ /**
215
+ * Import configuration from JSON
216
+ */
217
+ importConfig(jsonConfig: string): void {
218
+ const imported = JSON.parse(jsonConfig) as MultiClusterConfig;
219
+
220
+ // Validate imported config
221
+ if (!imported.activeClusterId || !Array.isArray(imported.clusters)) {
222
+ throw new Error('Invalid configuration format');
223
+ }
224
+
225
+ // Verify active cluster exists
226
+ if (!imported.clusters.some((c) => c.id === imported.activeClusterId)) {
227
+ throw new Error(`Active cluster "${imported.activeClusterId}" not found in imported clusters`);
228
+ }
229
+
230
+ this.config = imported;
231
+ this.saveConfig();
232
+ }
233
+
234
+ /**
235
+ * Generate kafkajs client config for active cluster
236
+ */
237
+ getKafkaJSConfig(): Record<string, any> {
238
+ const cluster = this.getActiveCluster();
239
+
240
+ const config: Record<string, any> = {
241
+ clientId: `kafka-client-${cluster.id}`,
242
+ brokers: cluster.bootstrapServers,
243
+ };
244
+
245
+ // Security configuration
246
+ if (cluster.securityProtocol !== 'PLAINTEXT') {
247
+ config.ssl =
248
+ cluster.securityProtocol === 'SSL' || cluster.securityProtocol === 'SASL_SSL'
249
+ ? {
250
+ rejectUnauthorized: true,
251
+ ...(cluster.sslCaPath && { ca: [fs.readFileSync(cluster.sslCaPath)] }),
252
+ ...(cluster.sslCertPath && { cert: [fs.readFileSync(cluster.sslCertPath)] }),
253
+ ...(cluster.sslKeyPath && { key: [fs.readFileSync(cluster.sslKeyPath)] }),
254
+ }
255
+ : undefined;
256
+
257
+ if (cluster.securityProtocol.startsWith('SASL')) {
258
+ config.sasl = {
259
+ mechanism: cluster.saslMechanism || 'PLAIN',
260
+ username: cluster.saslUsername || '',
261
+ password: cluster.saslPassword || '',
262
+ };
263
+ }
264
+ }
265
+
266
+ return config;
267
+ }
268
+
269
+ /**
270
+ * Validate cluster connectivity
271
+ */
272
+ async validateCluster(clusterId: string): Promise<{ valid: boolean; error?: string }> {
273
+ const cluster = this.getCluster(clusterId);
274
+ if (!cluster) {
275
+ return { valid: false, error: `Cluster "${clusterId}" not found` };
276
+ }
277
+
278
+ try {
279
+ // Simple connectivity check (would use kafkajs in real implementation)
280
+ // For now, just validate configuration format
281
+ if (!cluster.bootstrapServers || cluster.bootstrapServers.length === 0) {
282
+ return { valid: false, error: 'No bootstrap servers configured' };
283
+ }
284
+
285
+ return { valid: true };
286
+ } catch (error) {
287
+ return { valid: false, error: (error as Error).message };
288
+ }
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Example Usage: Basic Cluster Management
294
+ *
295
+ * ```typescript
296
+ * const manager = new ClusterConfigManager();
297
+ *
298
+ * // Add production cluster
299
+ * manager.addCluster({
300
+ * id: 'prod',
301
+ * name: 'Production',
302
+ * environment: 'prod',
303
+ * bootstrapServers: ['kafka-1.prod:9092', 'kafka-2.prod:9092'],
304
+ * securityProtocol: 'SASL_SSL',
305
+ * saslMechanism: 'SCRAM-SHA-512',
306
+ * saslUsername: 'prod-user',
307
+ * saslPassword: process.env.KAFKA_PROD_PASSWORD,
308
+ * cloudProvider: 'AWS',
309
+ * region: 'us-east-1',
310
+ * });
311
+ *
312
+ * // Switch to production
313
+ * manager.setActiveCluster('prod');
314
+ *
315
+ * // Get kafkajs config for active cluster
316
+ * const kafkaConfig = manager.getKafkaJSConfig();
317
+ * const kafka = new Kafka(kafkaConfig);
318
+ * ```
319
+ */
320
+
321
+ /**
322
+ * Example Usage: Multi-Environment Setup
323
+ *
324
+ * ```typescript
325
+ * const manager = new ClusterConfigManager();
326
+ *
327
+ * // Development cluster
328
+ * manager.addCluster({
329
+ * id: 'dev',
330
+ * name: 'Development',
331
+ * environment: 'dev',
332
+ * bootstrapServers: ['localhost:9092'],
333
+ * securityProtocol: 'PLAINTEXT',
334
+ * });
335
+ *
336
+ * // Staging cluster
337
+ * manager.addCluster({
338
+ * id: 'staging',
339
+ * name: 'Staging',
340
+ * environment: 'staging',
341
+ * bootstrapServers: ['kafka.staging:9092'],
342
+ * securityProtocol: 'SASL_SSL',
343
+ * saslMechanism: 'SCRAM-SHA-256',
344
+ * });
345
+ *
346
+ * // Production cluster
347
+ * manager.addCluster({
348
+ * id: 'prod',
349
+ * name: 'Production',
350
+ * environment: 'prod',
351
+ * bootstrapServers: ['kafka-1.prod:9092', 'kafka-2.prod:9092'],
352
+ * securityProtocol: 'SASL_SSL',
353
+ * saslMechanism: 'SCRAM-SHA-512',
354
+ * });
355
+ *
356
+ * // List all production clusters
357
+ * const prodClusters = manager.getClustersByEnvironment('prod');
358
+ * console.log(`Production clusters: ${prodClusters.map(c => c.name).join(', ')}`);
359
+ * ```
360
+ */
361
+
362
+ export default ClusterConfigManager;
@@ -0,0 +1,188 @@
1
+ import { Kafka } from "kafkajs";
2
+ import { ClusterConfigManager } from "./cluster-config-manager";
3
+ class ClusterSwitcher {
4
+ constructor(configManager) {
5
+ this.contexts = /* @__PURE__ */ new Map();
6
+ this.activeContext = null;
7
+ this.configManager = configManager || new ClusterConfigManager();
8
+ }
9
+ /**
10
+ * Get or create cluster context
11
+ */
12
+ async getContext(clusterId) {
13
+ if (this.contexts.has(clusterId)) {
14
+ return this.contexts.get(clusterId);
15
+ }
16
+ const config = this.configManager.getCluster(clusterId);
17
+ if (!config) {
18
+ throw new Error(`Cluster "${clusterId}" not found`);
19
+ }
20
+ const kafkaConfig = this.buildKafkaConfig(config);
21
+ const kafka = new Kafka(kafkaConfig);
22
+ const context = {
23
+ clusterId,
24
+ config,
25
+ kafka,
26
+ consumers: /* @__PURE__ */ new Map()
27
+ };
28
+ this.contexts.set(clusterId, context);
29
+ return context;
30
+ }
31
+ /**
32
+ * Build kafkajs configuration from cluster config
33
+ */
34
+ buildKafkaConfig(config) {
35
+ const kafkaConfig = {
36
+ clientId: `kafka-client-${config.id}`,
37
+ brokers: config.bootstrapServers
38
+ };
39
+ if (config.securityProtocol !== "PLAINTEXT") {
40
+ if (config.securityProtocol === "SSL" || config.securityProtocol === "SASL_SSL") {
41
+ kafkaConfig.ssl = { rejectUnauthorized: true };
42
+ }
43
+ if (config.securityProtocol.startsWith("SASL")) {
44
+ kafkaConfig.sasl = {
45
+ mechanism: config.saslMechanism || "PLAIN",
46
+ username: config.saslUsername || "",
47
+ password: config.saslPassword || ""
48
+ };
49
+ }
50
+ }
51
+ return kafkaConfig;
52
+ }
53
+ /**
54
+ * Switch to a different cluster
55
+ */
56
+ async switch(clusterId) {
57
+ console.log(`Switching to cluster: ${clusterId}`);
58
+ const context = await this.getContext(clusterId);
59
+ this.activeContext = context;
60
+ this.configManager.setActiveCluster(clusterId);
61
+ console.log(`Now connected to cluster: ${context.config.name} (${context.config.environment})`);
62
+ }
63
+ /**
64
+ * Get active cluster ID
65
+ */
66
+ getActiveClusterId() {
67
+ return this.activeContext?.clusterId || null;
68
+ }
69
+ /**
70
+ * Get active cluster configuration
71
+ */
72
+ getActiveCluster() {
73
+ return this.activeContext?.config || null;
74
+ }
75
+ /**
76
+ * Get Admin client for active cluster
77
+ */
78
+ async getAdmin() {
79
+ if (!this.activeContext) {
80
+ throw new Error("No active cluster. Use switch() first.");
81
+ }
82
+ if (!this.activeContext.admin) {
83
+ this.activeContext.admin = this.activeContext.kafka.admin();
84
+ await this.activeContext.admin.connect();
85
+ }
86
+ return this.activeContext.admin;
87
+ }
88
+ /**
89
+ * Get Producer for active cluster
90
+ */
91
+ async getProducer() {
92
+ if (!this.activeContext) {
93
+ throw new Error("No active cluster. Use switch() first.");
94
+ }
95
+ if (!this.activeContext.producer) {
96
+ this.activeContext.producer = this.activeContext.kafka.producer();
97
+ await this.activeContext.producer.connect();
98
+ }
99
+ return this.activeContext.producer;
100
+ }
101
+ /**
102
+ * Get or create Consumer for active cluster
103
+ */
104
+ async getConsumer(groupId) {
105
+ if (!this.activeContext) {
106
+ throw new Error("No active cluster. Use switch() first.");
107
+ }
108
+ if (this.activeContext.consumers.has(groupId)) {
109
+ return this.activeContext.consumers.get(groupId);
110
+ }
111
+ const consumer = this.activeContext.kafka.consumer({ groupId });
112
+ await consumer.connect();
113
+ this.activeContext.consumers.set(groupId, consumer);
114
+ return consumer;
115
+ }
116
+ /**
117
+ * Disconnect all connections for a specific cluster
118
+ */
119
+ async disconnectContext(context) {
120
+ console.log(`Disconnecting cluster: ${context.clusterId}`);
121
+ if (context.admin) {
122
+ await context.admin.disconnect();
123
+ context.admin = void 0;
124
+ }
125
+ if (context.producer) {
126
+ await context.producer.disconnect();
127
+ context.producer = void 0;
128
+ }
129
+ for (const [groupId, consumer] of context.consumers.entries()) {
130
+ await consumer.disconnect();
131
+ }
132
+ context.consumers.clear();
133
+ }
134
+ /**
135
+ * Disconnect all clusters
136
+ */
137
+ async disconnectAll() {
138
+ for (const context of this.contexts.values()) {
139
+ await this.disconnectContext(context);
140
+ }
141
+ this.contexts.clear();
142
+ this.activeContext = null;
143
+ }
144
+ /**
145
+ * List all available clusters
146
+ */
147
+ listClusters() {
148
+ return this.configManager.getAllClusters();
149
+ }
150
+ /**
151
+ * Get cluster health status
152
+ */
153
+ async getClusterHealth(clusterId) {
154
+ const targetClusterId = clusterId || this.activeContext?.clusterId;
155
+ if (!targetClusterId) {
156
+ throw new Error("No cluster specified and no active cluster");
157
+ }
158
+ try {
159
+ const context = await this.getContext(targetClusterId);
160
+ const admin = context.kafka.admin();
161
+ await admin.connect();
162
+ await admin.listTopics();
163
+ await admin.disconnect();
164
+ return {
165
+ clusterId: targetClusterId,
166
+ healthy: true
167
+ };
168
+ } catch (error) {
169
+ return {
170
+ clusterId: targetClusterId,
171
+ healthy: false,
172
+ error: error.message
173
+ };
174
+ }
175
+ }
176
+ /**
177
+ * Execute operation on specific cluster (without switching context)
178
+ */
179
+ async executeOn(clusterId, operation) {
180
+ const context = await this.getContext(clusterId);
181
+ return operation(context.kafka);
182
+ }
183
+ }
184
+ var cluster_switcher_default = ClusterSwitcher;
185
+ export {
186
+ ClusterSwitcher,
187
+ cluster_switcher_default as default
188
+ };