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,381 @@
1
+ import { readdir, readFile, writeFile } from "fs/promises";
2
+ import { existsSync } from "fs";
3
+ import * as path from "path";
4
+ import * as yaml from "yaml";
5
+ import { UserStoryIssueBuilder } from "./user-story-issue-builder.js";
6
+ import { CompletionCalculator } from "./completion-calculator.js";
7
+ import { execFileNoThrow } from "../../../src/utils/execFileNoThrow.js";
8
+ class GitHubFeatureSync {
9
+ constructor(client, specsDir, projectRoot) {
10
+ this.client = client;
11
+ this.specsDir = specsDir;
12
+ this.projectRoot = projectRoot;
13
+ this.calculator = new CompletionCalculator(projectRoot);
14
+ }
15
+ /**
16
+ * Sync Feature folder to GitHub (Milestone + User Story Issues)
17
+ *
18
+ * Process:
19
+ * 1. Create/update GitHub Milestone for Feature
20
+ * 2. Find all us-*.md files across all projects
21
+ * 3. Create/update GitHub Issue for EACH user story
22
+ * 4. Update frontmatter with GitHub issue links
23
+ */
24
+ async syncFeatureToGitHub(featureId) {
25
+ console.log(`
26
+ \u{1F504} Syncing Feature ${featureId} to GitHub...`);
27
+ const featureFolder = await this.findFeatureFolder(featureId);
28
+ if (!featureFolder) {
29
+ throw new Error(`Feature ${featureId} not found in ${this.specsDir}`);
30
+ }
31
+ const featurePath = path.join(featureFolder, "FEATURE.md");
32
+ const featureData = await this.parseFeatureMd(featurePath);
33
+ console.log(` \u{1F4E6} Feature: ${featureData.title}`);
34
+ console.log(` \u{1F4CA} Status: ${featureData.status}`);
35
+ let milestoneNumber = featureData.external_tools?.github?.id;
36
+ let milestoneUrl = featureData.external_tools?.github?.url;
37
+ if (!milestoneNumber) {
38
+ console.log(` \u{1F680} Creating GitHub Milestone...`);
39
+ const milestone = await this.createMilestone(featureData);
40
+ milestoneNumber = milestone.number;
41
+ milestoneUrl = milestone.url;
42
+ console.log(` \u2705 Created Milestone #${milestoneNumber}`);
43
+ await this.updateFeatureMd(featurePath, {
44
+ type: "milestone",
45
+ id: milestoneNumber,
46
+ url: milestoneUrl
47
+ });
48
+ } else {
49
+ console.log(` \u267B\uFE0F Using existing Milestone #${milestoneNumber}`);
50
+ milestoneUrl = featureData.external_tools?.github?.url || milestoneUrl;
51
+ }
52
+ const userStories = await this.findUserStories(featureId);
53
+ console.log(`
54
+ \u{1F4DD} Found ${userStories.length} User Stories to sync...`);
55
+ let issuesCreated = 0;
56
+ let issuesUpdated = 0;
57
+ for (const userStory of userStories) {
58
+ console.log(`
59
+ \u{1F539} Processing ${userStory.id}: ${userStory.title}`);
60
+ const repoInfo = {
61
+ owner: this.client.getOwner(),
62
+ repo: this.client.getRepo(),
63
+ branch: "develop"
64
+ // TODO: detect from git
65
+ };
66
+ const builder = new UserStoryIssueBuilder(
67
+ userStory.filePath,
68
+ this.projectRoot,
69
+ featureId,
70
+ repoInfo
71
+ );
72
+ const issueContent = await builder.buildIssueBody();
73
+ issueContent.status = userStory.status;
74
+ if (userStory.existingIssue) {
75
+ console.log(` \u267B\uFE0F Issue #${userStory.existingIssue} exists in frontmatter`);
76
+ try {
77
+ await this.client.getIssue(userStory.existingIssue);
78
+ await this.updateUserStoryIssue(userStory.existingIssue, issueContent, userStory.filePath);
79
+ issuesUpdated++;
80
+ console.log(` \u2705 Updated Issue #${userStory.existingIssue}`);
81
+ continue;
82
+ } catch (err) {
83
+ console.log(` \u26A0\uFE0F Issue #${userStory.existingIssue} deleted on GitHub, creating new`);
84
+ }
85
+ }
86
+ const existingByTitle = await this.client.searchIssueByTitle(issueContent.title);
87
+ if (existingByTitle) {
88
+ console.log(` \u267B\uFE0F Found existing issue by title: #${existingByTitle.number}`);
89
+ await this.updateUserStoryFrontmatter(userStory.filePath, existingByTitle.number);
90
+ await this.updateUserStoryIssue(existingByTitle.number, issueContent, userStory.filePath);
91
+ issuesUpdated++;
92
+ console.log(` \u2705 Linked and updated Issue #${existingByTitle.number}`);
93
+ continue;
94
+ }
95
+ console.log(` \u{1F680} Creating new issue: ${issueContent.title}`);
96
+ const milestoneTitle = `${featureData.id}: ${featureData.title}`;
97
+ const issueNumber = await this.createUserStoryIssue(
98
+ issueContent,
99
+ milestoneTitle,
100
+ userStory.filePath
101
+ );
102
+ issuesCreated++;
103
+ console.log(` \u2705 Created Issue #${issueNumber}`);
104
+ await this.updateUserStoryFrontmatter(userStory.filePath, issueNumber);
105
+ }
106
+ console.log(`
107
+ \u2705 Feature sync complete!`);
108
+ console.log(` Milestone: ${milestoneUrl}`);
109
+ console.log(` User Stories: ${userStories.length}`);
110
+ console.log(` Issues created: ${issuesCreated}`);
111
+ console.log(` Issues updated: ${issuesUpdated}`);
112
+ return {
113
+ milestoneNumber,
114
+ milestoneUrl,
115
+ issuesCreated,
116
+ issuesUpdated,
117
+ userStoriesProcessed: userStories.length
118
+ };
119
+ }
120
+ /**
121
+ * Find Feature folder in specs directory
122
+ */
123
+ async findFeatureFolder(featureId) {
124
+ const featuresFolder = path.join(this.specsDir, "_features", featureId);
125
+ if (existsSync(featuresFolder)) {
126
+ return featuresFolder;
127
+ }
128
+ return null;
129
+ }
130
+ /**
131
+ * Parse FEATURE.md frontmatter
132
+ */
133
+ async parseFeatureMd(featurePath) {
134
+ const content = await readFile(featurePath, "utf-8");
135
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
136
+ if (!match) {
137
+ throw new Error(`${featurePath}: Missing YAML frontmatter`);
138
+ }
139
+ return yaml.parse(match[1]);
140
+ }
141
+ /**
142
+ * Find all User Story files for this feature across all projects
143
+ */
144
+ async findUserStories(featureId) {
145
+ const userStories = [];
146
+ const projectFolders = await this.findProjectFolders();
147
+ for (const projectFolder of projectFolders) {
148
+ const featureSpecsFolder = path.join(projectFolder, featureId);
149
+ if (!existsSync(featureSpecsFolder)) {
150
+ continue;
151
+ }
152
+ const files = await readdir(featureSpecsFolder);
153
+ const usFiles = files.filter((f) => f.startsWith("us-") && f.endsWith(".md"));
154
+ for (const file of usFiles.sort()) {
155
+ const filePath = path.join(featureSpecsFolder, file);
156
+ const content = await readFile(filePath, "utf-8");
157
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
158
+ if (!match) {
159
+ console.warn(` \u26A0\uFE0F ${file}: Missing frontmatter, skipping`);
160
+ continue;
161
+ }
162
+ const frontmatter = yaml.parse(match[1]);
163
+ const projectName = path.basename(projectFolder);
164
+ userStories.push({
165
+ id: frontmatter.id || file.match(/us-(\d+)/)?.[0]?.toUpperCase() || "UNKNOWN",
166
+ title: frontmatter.title || "Untitled User Story",
167
+ filePath,
168
+ project: projectName,
169
+ status: frontmatter.status || "not-started",
170
+ existingIssue: frontmatter.external?.github?.issue || null
171
+ });
172
+ }
173
+ }
174
+ return userStories;
175
+ }
176
+ /**
177
+ * Find all project folders (default, backend, frontend, etc.)
178
+ */
179
+ async findProjectFolders() {
180
+ const folders = [];
181
+ const specsRoot = this.specsDir;
182
+ const entries = await readdir(specsRoot, { withFileTypes: true });
183
+ for (const entry of entries) {
184
+ if (entry.isDirectory() && !entry.name.startsWith("_")) {
185
+ folders.push(path.join(specsRoot, entry.name));
186
+ }
187
+ }
188
+ return folders;
189
+ }
190
+ /**
191
+ * Create GitHub Milestone for Feature
192
+ */
193
+ async createMilestone(featureData) {
194
+ const title = `${featureData.id}: ${featureData.title}`;
195
+ const description = `Feature ${featureData.id}
196
+
197
+ Status: ${featureData.status}
198
+ Created: ${featureData.created}`;
199
+ const result = await execFileNoThrow("gh", [
200
+ "api",
201
+ "repos/:owner/:repo/milestones",
202
+ "-X",
203
+ "POST",
204
+ "-f",
205
+ `title=${title}`,
206
+ "-f",
207
+ `description=${description}`,
208
+ "-f",
209
+ "state=open"
210
+ ]);
211
+ if (result.exitCode !== 0) {
212
+ throw new Error(`Failed to create Milestone: ${result.stderr || result.stdout}`);
213
+ }
214
+ const milestone = JSON.parse(result.stdout);
215
+ return {
216
+ number: milestone.number,
217
+ url: milestone.html_url
218
+ };
219
+ }
220
+ /**
221
+ * Create GitHub Issue for User Story with AC/Task Verification
222
+ *
223
+ * ✅ VERIFICATION GATE FIX:
224
+ * - Verifies actual completion before closing
225
+ * - Prevents premature closure on creation
226
+ */
227
+ async createUserStoryIssue(issueContent, milestoneTitle, userStoryPath) {
228
+ const result = await execFileNoThrow("gh", [
229
+ "issue",
230
+ "create",
231
+ "--title",
232
+ issueContent.title,
233
+ "--body",
234
+ issueContent.body,
235
+ "--milestone",
236
+ milestoneTitle,
237
+ ...issueContent.labels.flatMap((label) => ["--label", label])
238
+ ]);
239
+ if (result.exitCode !== 0) {
240
+ throw new Error(`Failed to create GitHub Issue: ${result.stderr || result.stdout}`);
241
+ }
242
+ const match = result.stdout.match(/issues\/(\d+)/);
243
+ if (!match) {
244
+ throw new Error(`Failed to parse issue number from: ${result.stdout}`);
245
+ }
246
+ const issueNumber = parseInt(match[1], 10);
247
+ const completion = await this.calculator.calculateCompletion(userStoryPath);
248
+ if (completion.overallComplete) {
249
+ await execFileNoThrow("gh", [
250
+ "issue",
251
+ "close",
252
+ issueNumber.toString(),
253
+ "--comment",
254
+ this.calculator.buildCompletionComment(completion)
255
+ ]);
256
+ console.log(
257
+ ` \u2705 Created and verified complete: ${completion.acsCompleted}/${completion.acsTotal} ACs, ${completion.tasksCompleted}/${completion.tasksTotal} tasks`
258
+ );
259
+ } else {
260
+ await execFileNoThrow("gh", [
261
+ "issue",
262
+ "comment",
263
+ issueNumber.toString(),
264
+ "--body",
265
+ this.calculator.buildProgressComment(completion)
266
+ ]);
267
+ console.log(
268
+ ` \u{1F4CA} Created: ${completion.acsPercentage.toFixed(0)}% ACs, ${completion.tasksPercentage.toFixed(0)}% tasks`
269
+ );
270
+ }
271
+ return issueNumber;
272
+ }
273
+ /**
274
+ * Update existing GitHub Issue for User Story with AC/Task Verification
275
+ *
276
+ * ✅ VERIFICATION GATE FIX:
277
+ * - OLD: Closed based on frontmatter `status: complete`
278
+ * - NEW: Closes ONLY if all ACs and tasks are [x]
279
+ *
280
+ * This prevents Issue #574 type bugs (premature closure)
281
+ */
282
+ async updateUserStoryIssue(issueNumber, issueContent, userStoryPath) {
283
+ await execFileNoThrow("gh", [
284
+ "issue",
285
+ "edit",
286
+ issueNumber.toString(),
287
+ "--title",
288
+ issueContent.title,
289
+ "--body",
290
+ issueContent.body
291
+ ]);
292
+ const completion = await this.calculator.calculateCompletion(userStoryPath);
293
+ const issueData = await this.client.getIssue(issueNumber);
294
+ const currentlyClosed = issueData.state === "closed";
295
+ if (completion.overallComplete) {
296
+ if (!currentlyClosed) {
297
+ await execFileNoThrow("gh", [
298
+ "issue",
299
+ "close",
300
+ issueNumber.toString(),
301
+ "--comment",
302
+ this.calculator.buildCompletionComment(completion)
303
+ ]);
304
+ console.log(
305
+ ` \u2705 Verified complete: ${completion.acsCompleted}/${completion.acsTotal} ACs, ${completion.tasksCompleted}/${completion.tasksTotal} tasks`
306
+ );
307
+ }
308
+ } else {
309
+ if (currentlyClosed) {
310
+ await execFileNoThrow("gh", [
311
+ "issue",
312
+ "reopen",
313
+ issueNumber.toString(),
314
+ "--comment",
315
+ this.calculator.buildReopenComment(completion, "Work verification failed")
316
+ ]);
317
+ console.log(
318
+ ` \u26A0\uFE0F Reopened: ${completion.blockingAcs.length + completion.blockingTasks.length} items incomplete`
319
+ );
320
+ } else {
321
+ await execFileNoThrow("gh", [
322
+ "issue",
323
+ "comment",
324
+ issueNumber.toString(),
325
+ "--body",
326
+ this.calculator.buildProgressComment(completion)
327
+ ]);
328
+ console.log(
329
+ ` \u{1F4CA} Progress: ${completion.acsPercentage.toFixed(0)}% ACs, ${completion.tasksPercentage.toFixed(0)}% tasks`
330
+ );
331
+ }
332
+ }
333
+ }
334
+ /**
335
+ * Update FEATURE.md with GitHub Milestone link
336
+ */
337
+ async updateFeatureMd(featurePath, milestone) {
338
+ const content = await readFile(featurePath, "utf-8");
339
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
340
+ if (!match) {
341
+ throw new Error(`${featurePath}: Missing YAML frontmatter`);
342
+ }
343
+ const frontmatter = yaml.parse(match[1]);
344
+ if (!frontmatter.external_tools) {
345
+ frontmatter.external_tools = {};
346
+ }
347
+ frontmatter.external_tools.github = milestone;
348
+ const newFrontmatter = yaml.stringify(frontmatter);
349
+ const bodyContent = content.slice(match[0].length);
350
+ const newContent = `---
351
+ ${newFrontmatter}---${bodyContent}`;
352
+ await writeFile(featurePath, newContent, "utf-8");
353
+ }
354
+ /**
355
+ * Update User Story frontmatter with GitHub issue link
356
+ */
357
+ async updateUserStoryFrontmatter(userStoryPath, issueNumber) {
358
+ const content = await readFile(userStoryPath, "utf-8");
359
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
360
+ if (!match) {
361
+ throw new Error(`${userStoryPath}: Missing YAML frontmatter`);
362
+ }
363
+ const frontmatter = yaml.parse(match[1]);
364
+ if (!frontmatter.external) {
365
+ frontmatter.external = {};
366
+ }
367
+ if (!frontmatter.external.github) {
368
+ frontmatter.external.github = {};
369
+ }
370
+ frontmatter.external.github.issue = issueNumber;
371
+ frontmatter.external.github.url = `https://github.com/anton-abyzov/specweave/issues/${issueNumber}`;
372
+ const newFrontmatter = yaml.stringify(frontmatter);
373
+ const bodyContent = content.slice(match[0].length);
374
+ const newContent = `---
375
+ ${newFrontmatter}---${bodyContent}`;
376
+ await writeFile(userStoryPath, newContent, "utf-8");
377
+ }
378
+ }
379
+ export {
380
+ GitHubFeatureSync
381
+ };