specweave 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CLAUDE.md +229 -1817
  2. package/README.md +68 -0
  3. package/bin/specweave.js +62 -6
  4. package/dist/locales/de/.gitkeep +0 -0
  5. package/dist/locales/de/cli.json +108 -0
  6. package/dist/locales/en/cli.json +287 -0
  7. package/dist/locales/en/errors.json +7 -0
  8. package/dist/locales/en/templates.json +6 -0
  9. package/dist/locales/es/.gitkeep +0 -0
  10. package/dist/locales/es/cli.json +41 -0
  11. package/dist/locales/fr/.gitkeep +0 -0
  12. package/dist/locales/fr/cli.json +108 -0
  13. package/dist/locales/ja/.gitkeep +0 -0
  14. package/dist/locales/ja/cli.json +108 -0
  15. package/dist/locales/ko/.gitkeep +0 -0
  16. package/dist/locales/ko/cli.json +108 -0
  17. package/dist/locales/pt/.gitkeep +0 -0
  18. package/dist/locales/pt/cli.json +108 -0
  19. package/dist/locales/ru/.gitkeep +0 -0
  20. package/dist/locales/ru/cli.json +269 -0
  21. package/dist/locales/zh/.gitkeep +0 -0
  22. package/dist/locales/zh/cli.json +108 -0
  23. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  24. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +3 -0
  25. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  26. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts +21 -0
  27. package/dist/plugins/specweave/lib/hooks/update-ac-status.d.ts.map +1 -0
  28. package/dist/plugins/specweave/lib/hooks/update-ac-status.js +162 -0
  29. package/dist/plugins/specweave/lib/hooks/update-ac-status.js.map +1 -0
  30. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
  31. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
  32. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
  33. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
  34. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
  35. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
  36. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
  37. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts +112 -0
  38. package/dist/plugins/specweave-github/lib/completion-calculator.d.ts.map +1 -0
  39. package/dist/plugins/specweave-github/lib/completion-calculator.js +301 -0
  40. package/dist/plugins/specweave-github/lib/completion-calculator.js.map +1 -0
  41. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +3 -3
  42. package/dist/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  43. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +70 -0
  44. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
  45. package/dist/plugins/specweave-github/lib/epic-content-builder.js +258 -0
  46. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
  47. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +14 -0
  48. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  49. package/dist/plugins/specweave-github/lib/github-client-v2.js +51 -0
  50. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  51. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +2 -2
  52. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -1
  53. package/dist/plugins/specweave-github/lib/github-epic-sync.js +20 -5
  54. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -1
  55. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +87 -0
  56. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -0
  57. package/dist/plugins/specweave-github/lib/github-feature-sync.js +412 -0
  58. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -0
  59. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  60. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +64 -13
  61. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  62. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts +78 -0
  63. package/dist/plugins/specweave-github/lib/progress-comment-builder.d.ts.map +1 -0
  64. package/dist/plugins/specweave-github/lib/progress-comment-builder.js +237 -0
  65. package/dist/plugins/specweave-github/lib/progress-comment-builder.js.map +1 -0
  66. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts +97 -0
  67. package/dist/plugins/specweave-github/lib/user-story-content-builder.d.ts.map +1 -0
  68. package/dist/plugins/specweave-github/lib/user-story-content-builder.js +301 -0
  69. package/dist/plugins/specweave-github/lib/user-story-content-builder.js.map +1 -0
  70. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts +83 -0
  71. package/dist/plugins/specweave-github/lib/user-story-issue-builder.d.ts.map +1 -0
  72. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js +386 -0
  73. package/dist/plugins/specweave-github/lib/user-story-issue-builder.js.map +1 -0
  74. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
  75. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
  76. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
  77. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
  78. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts +57 -0
  79. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.d.ts.map +1 -0
  80. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +248 -0
  81. package/dist/plugins/specweave-kafka/lib/cli/kcat-wrapper.js.map +1 -0
  82. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts +82 -0
  83. package/dist/plugins/specweave-kafka/lib/cli/types.d.ts.map +1 -0
  84. package/dist/plugins/specweave-kafka/lib/cli/types.js +13 -0
  85. package/dist/plugins/specweave-kafka/lib/cli/types.js.map +1 -0
  86. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts +49 -0
  87. package/dist/plugins/specweave-kafka/lib/mcp/detector.d.ts.map +1 -0
  88. package/dist/plugins/specweave-kafka/lib/mcp/detector.js +316 -0
  89. package/dist/plugins/specweave-kafka/lib/mcp/detector.js.map +1 -0
  90. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts +70 -0
  91. package/dist/plugins/specweave-kafka/lib/mcp/types.d.ts.map +1 -0
  92. package/dist/plugins/specweave-kafka/lib/mcp/types.js +23 -0
  93. package/dist/plugins/specweave-kafka/lib/mcp/types.js.map +1 -0
  94. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts +85 -0
  95. package/dist/plugins/specweave-kafka/lib/utils/partitioning.d.ts.map +1 -0
  96. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js +281 -0
  97. package/dist/plugins/specweave-kafka/lib/utils/partitioning.js.map +1 -0
  98. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts +75 -0
  99. package/dist/plugins/specweave-kafka/lib/utils/sizing.d.ts.map +1 -0
  100. package/dist/plugins/specweave-kafka/lib/utils/sizing.js +238 -0
  101. package/dist/plugins/specweave-kafka/lib/utils/sizing.js.map +1 -0
  102. package/dist/spec-parser.js +629 -0
  103. package/dist/src/cli/commands/import-docs.js +4 -4
  104. package/dist/src/cli/commands/import-docs.js.map +1 -1
  105. package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -1
  106. package/dist/src/cli/commands/init-multiproject.js +17 -18
  107. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  108. package/dist/src/cli/commands/init.d.ts.map +1 -1
  109. package/dist/src/cli/commands/init.js +107 -3
  110. package/dist/src/cli/commands/init.js.map +1 -1
  111. package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -1
  112. package/dist/src/cli/commands/migrate-to-multiproject.js +8 -4
  113. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  114. package/dist/src/cli/commands/switch-project.d.ts.map +1 -1
  115. package/dist/src/cli/commands/switch-project.js +9 -26
  116. package/dist/src/cli/commands/switch-project.js.map +1 -1
  117. package/dist/src/cli/commands/sync-spec-content.js +3 -0
  118. package/dist/src/cli/commands/sync-spec-content.js.map +1 -1
  119. package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
  120. package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
  121. package/dist/src/core/deduplication/command-deduplicator.js +254 -0
  122. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
  123. package/dist/src/core/increment/active-increment-manager.d.ts +42 -15
  124. package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -1
  125. package/dist/src/core/increment/active-increment-manager.js +113 -46
  126. package/dist/src/core/increment/active-increment-manager.js.map +1 -1
  127. package/dist/src/core/increment/conflict-resolver.d.ts +40 -0
  128. package/dist/src/core/increment/conflict-resolver.d.ts.map +1 -0
  129. package/dist/src/core/increment/conflict-resolver.js +219 -0
  130. package/dist/src/core/increment/conflict-resolver.js.map +1 -0
  131. package/dist/src/core/increment/discipline-checker.d.ts.map +1 -1
  132. package/dist/src/core/increment/discipline-checker.js +7 -1
  133. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  134. package/dist/src/core/increment/duplicate-detector.d.ts +52 -0
  135. package/dist/src/core/increment/duplicate-detector.d.ts.map +1 -0
  136. package/dist/src/core/increment/duplicate-detector.js +276 -0
  137. package/dist/src/core/increment/duplicate-detector.js.map +1 -0
  138. package/dist/src/core/increment/increment-archiver.d.ts +90 -0
  139. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -0
  140. package/dist/src/core/increment/increment-archiver.js +368 -0
  141. package/dist/src/core/increment/increment-archiver.js.map +1 -0
  142. package/dist/src/core/increment/increment-reopener.d.ts +165 -0
  143. package/dist/src/core/increment/increment-reopener.d.ts.map +1 -0
  144. package/dist/src/core/increment/increment-reopener.js +390 -0
  145. package/dist/src/core/increment/increment-reopener.js.map +1 -0
  146. package/dist/src/core/increment/metadata-manager.d.ts +26 -1
  147. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -1
  148. package/dist/src/core/increment/metadata-manager.js +143 -5
  149. package/dist/src/core/increment/metadata-manager.js.map +1 -1
  150. package/dist/src/core/increment/recent-work-scanner.d.ts +121 -0
  151. package/dist/src/core/increment/recent-work-scanner.d.ts.map +1 -0
  152. package/dist/src/core/increment/recent-work-scanner.js +303 -0
  153. package/dist/src/core/increment/recent-work-scanner.js.map +1 -0
  154. package/dist/src/core/increment/types.d.ts +1 -0
  155. package/dist/src/core/increment/types.d.ts.map +1 -1
  156. package/dist/src/core/increment-utils.d.ts +112 -0
  157. package/dist/src/core/increment-utils.d.ts.map +1 -0
  158. package/dist/src/core/increment-utils.js +210 -0
  159. package/dist/src/core/increment-utils.js.map +1 -0
  160. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts +65 -0
  161. package/dist/src/core/living-docs/ac-project-specific-generator.d.ts.map +1 -0
  162. package/dist/src/core/living-docs/ac-project-specific-generator.js +175 -0
  163. package/dist/src/core/living-docs/ac-project-specific-generator.js.map +1 -0
  164. package/dist/src/core/living-docs/feature-archiver.d.ts +130 -0
  165. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -0
  166. package/dist/src/core/living-docs/feature-archiver.js +549 -0
  167. package/dist/src/core/living-docs/feature-archiver.js.map +1 -0
  168. package/dist/src/core/living-docs/feature-id-manager.d.ts +81 -0
  169. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -0
  170. package/dist/src/core/living-docs/feature-id-manager.js +339 -0
  171. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -0
  172. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +144 -83
  173. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -1
  174. package/dist/src/core/living-docs/hierarchy-mapper.js +488 -270
  175. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -1
  176. package/dist/src/core/living-docs/index.d.ts +6 -0
  177. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  178. package/dist/src/core/living-docs/index.js +6 -0
  179. package/dist/src/core/living-docs/index.js.map +1 -1
  180. package/dist/src/core/living-docs/project-detector.d.ts +6 -0
  181. package/dist/src/core/living-docs/project-detector.d.ts.map +1 -1
  182. package/dist/src/core/living-docs/project-detector.js +35 -1
  183. package/dist/src/core/living-docs/project-detector.js.map +1 -1
  184. package/dist/src/core/living-docs/spec-distributor.d.ts +100 -26
  185. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -1
  186. package/dist/src/core/living-docs/spec-distributor.js +1275 -258
  187. package/dist/src/core/living-docs/spec-distributor.js.map +1 -1
  188. package/dist/src/core/living-docs/task-project-specific-generator.d.ts +109 -0
  189. package/dist/src/core/living-docs/task-project-specific-generator.d.ts.map +1 -0
  190. package/dist/src/core/living-docs/task-project-specific-generator.js +221 -0
  191. package/dist/src/core/living-docs/task-project-specific-generator.js.map +1 -0
  192. package/dist/src/core/living-docs/types.d.ts +143 -0
  193. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  194. package/dist/src/core/project-manager.d.ts +2 -17
  195. package/dist/src/core/project-manager.d.ts.map +1 -1
  196. package/dist/src/core/project-manager.js +68 -48
  197. package/dist/src/core/project-manager.js.map +1 -1
  198. package/dist/src/core/spec-content-sync.d.ts +1 -1
  199. package/dist/src/core/spec-content-sync.d.ts.map +1 -1
  200. package/dist/src/core/sync/enhanced-content-builder.d.ts +32 -54
  201. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -1
  202. package/dist/src/core/sync/enhanced-content-builder.js +142 -138
  203. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -1
  204. package/dist/src/core/sync/performance-optimizer.d.ts +153 -0
  205. package/dist/src/core/sync/performance-optimizer.d.ts.map +1 -0
  206. package/dist/src/core/sync/performance-optimizer.js +220 -0
  207. package/dist/src/core/sync/performance-optimizer.js.map +1 -0
  208. package/dist/src/core/sync/retry-handler.d.ts +98 -0
  209. package/dist/src/core/sync/retry-handler.d.ts.map +1 -0
  210. package/dist/src/core/sync/retry-handler.js +196 -0
  211. package/dist/src/core/sync/retry-handler.js.map +1 -0
  212. package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
  213. package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
  214. package/dist/src/core/sync/spec-content-sync.js +5 -0
  215. package/dist/src/core/sync/spec-content-sync.js.map +1 -0
  216. package/dist/src/core/sync/types.d.ts +52 -0
  217. package/dist/src/core/sync/types.d.ts.map +1 -0
  218. package/dist/src/core/sync/types.js +5 -0
  219. package/dist/src/core/sync/types.js.map +1 -0
  220. package/dist/src/core/types/config.d.ts +125 -0
  221. package/dist/src/core/types/config.d.ts.map +1 -1
  222. package/dist/src/core/types/config.js +25 -0
  223. package/dist/src/core/types/config.js.map +1 -1
  224. package/dist/src/core/types/increment-metadata.d.ts +10 -0
  225. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  226. package/dist/src/core/types/increment-metadata.js +10 -1
  227. package/dist/src/core/types/increment-metadata.js.map +1 -1
  228. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -1
  229. package/dist/src/integrations/jira/jira-incremental-mapper.js +4 -8
  230. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  231. package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -1
  232. package/dist/src/integrations/jira/jira-mapper.js +4 -8
  233. package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
  234. package/dist/tsconfig.tsbuildinfo +1 -0
  235. package/package.json +1 -1
  236. package/plugins/specweave/COMMANDS.md +13 -4
  237. package/plugins/specweave/agents/pm/AGENT.md +159 -12
  238. package/plugins/specweave/commands/specweave-abandon.md +22 -20
  239. package/plugins/specweave/commands/specweave-archive-features.md +121 -0
  240. package/plugins/specweave/commands/specweave-archive-increments.md +82 -0
  241. package/plugins/specweave/commands/specweave-archive.md +363 -0
  242. package/plugins/specweave/commands/specweave-backlog.md +211 -0
  243. package/plugins/specweave/commands/specweave-fix-duplicates.md +517 -0
  244. package/plugins/specweave/commands/specweave-increment.md +4 -3
  245. package/plugins/specweave/commands/specweave-progress.md +176 -27
  246. package/plugins/specweave/commands/specweave-reopen.md +391 -0
  247. package/plugins/specweave/commands/specweave-restore-feature.md +90 -0
  248. package/plugins/specweave/commands/specweave-restore.md +309 -0
  249. package/plugins/specweave/commands/specweave-resume.md +51 -23
  250. package/plugins/specweave/commands/specweave-status.md +41 -7
  251. package/plugins/specweave/commands/specweave-sync-specs.md +425 -0
  252. package/plugins/specweave/commands/specweave.md +70 -405
  253. package/plugins/specweave/hooks/hooks.json +4 -0
  254. package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
  255. package/plugins/specweave/hooks/post-increment-planning.sh +26 -2
  256. package/plugins/specweave/hooks/post-task-completion.sh +39 -0
  257. package/plugins/specweave/hooks/pre-command-deduplication.sh +83 -0
  258. package/plugins/specweave/hooks/user-prompt-submit.sh +1 -1
  259. package/plugins/specweave/lib/hooks/sync-living-docs.js +2 -0
  260. package/plugins/specweave/lib/hooks/sync-living-docs.ts +4 -0
  261. package/plugins/specweave/lib/hooks/update-ac-status.js +102 -0
  262. package/plugins/specweave/lib/hooks/update-ac-status.ts +192 -0
  263. package/plugins/specweave/skills/archive-increments/SKILL.md +198 -0
  264. package/plugins/specweave/skills/increment-planner/scripts/feature-utils.js +14 -0
  265. package/plugins/specweave/skills/smart-reopen-detector/SKILL.md +244 -0
  266. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
  267. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
  268. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  269. package/plugins/specweave-confluent/.claude-plugin/plugin.json +23 -0
  270. package/plugins/specweave-confluent/README.md +375 -0
  271. package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +306 -0
  272. package/plugins/specweave-confluent/skills/confluent-kafka-connect/SKILL.md +453 -0
  273. package/plugins/specweave-confluent/skills/confluent-ksqldb/SKILL.md +470 -0
  274. package/plugins/specweave-confluent/skills/confluent-schema-registry/SKILL.md +316 -0
  275. package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +2 -2
  276. package/plugins/specweave-github/agents/user-story-updater/AGENT.md +148 -0
  277. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +1 -1
  278. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +156 -0
  279. package/plugins/specweave-github/hooks/post-task-completion.sh +42 -9
  280. package/plugins/specweave-github/lib/completion-calculator.js +262 -0
  281. package/plugins/specweave-github/lib/completion-calculator.ts +434 -0
  282. package/plugins/specweave-github/lib/duplicate-detector.js +3 -3
  283. package/plugins/specweave-github/lib/duplicate-detector.ts +4 -4
  284. package/plugins/specweave-github/lib/epic-content-builder.js +265 -0
  285. package/plugins/specweave-github/lib/epic-content-builder.ts +376 -0
  286. package/plugins/specweave-github/lib/github-client-v2.js +49 -0
  287. package/plugins/specweave-github/lib/github-client-v2.ts +59 -0
  288. package/plugins/specweave-github/lib/github-epic-sync.js +23 -24
  289. package/plugins/specweave-github/lib/github-epic-sync.ts +30 -5
  290. package/plugins/specweave-github/lib/github-feature-sync.js +381 -0
  291. package/plugins/specweave-github/lib/github-feature-sync.ts +568 -0
  292. package/plugins/specweave-github/lib/github-spec-content-sync.js +40 -10
  293. package/plugins/specweave-github/lib/github-spec-content-sync.ts +82 -14
  294. package/plugins/specweave-github/lib/progress-comment-builder.js +229 -0
  295. package/plugins/specweave-github/lib/progress-comment-builder.ts +324 -0
  296. package/plugins/specweave-github/lib/user-story-content-builder.js +299 -0
  297. package/plugins/specweave-github/lib/user-story-content-builder.ts +413 -0
  298. package/plugins/specweave-github/lib/user-story-issue-builder.js +344 -0
  299. package/plugins/specweave-github/lib/user-story-issue-builder.ts +543 -0
  300. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +189 -0
  301. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
  302. package/plugins/specweave-jira/lib/{enhanced-jira-sync.ts.disabled → enhanced-jira-sync.ts} +26 -52
  303. package/plugins/specweave-kafka/.claude-plugin/plugin.json +26 -0
  304. package/plugins/specweave-kafka/IMPLEMENTATION-COMPLETE.md +483 -0
  305. package/plugins/specweave-kafka/README.md +242 -0
  306. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +235 -0
  307. package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +209 -0
  308. package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +266 -0
  309. package/plugins/specweave-kafka/commands/deploy.md +99 -0
  310. package/plugins/specweave-kafka/commands/dev-env.md +176 -0
  311. package/plugins/specweave-kafka/commands/mcp-configure.md +101 -0
  312. package/plugins/specweave-kafka/commands/monitor-setup.md +96 -0
  313. package/plugins/specweave-kafka/docker/kafka-local/docker-compose.yml +187 -0
  314. package/plugins/specweave-kafka/docker/redpanda/docker-compose.yml +199 -0
  315. package/plugins/specweave-kafka/docker/templates/consumer-nodejs.js +225 -0
  316. package/plugins/specweave-kafka/docker/templates/consumer-python.py +220 -0
  317. package/plugins/specweave-kafka/docker/templates/producer-nodejs.js +168 -0
  318. package/plugins/specweave-kafka/docker/templates/producer-python.py +167 -0
  319. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.js +438 -0
  320. package/plugins/specweave-kafka/lib/adapters/apache-kafka-adapter.ts +541 -0
  321. package/plugins/specweave-kafka/lib/adapters/platform-adapter.js +47 -0
  322. package/plugins/specweave-kafka/lib/adapters/platform-adapter.ts +343 -0
  323. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.js +258 -0
  324. package/plugins/specweave-kafka/lib/cli/kcat-wrapper.ts +298 -0
  325. package/plugins/specweave-kafka/lib/cli/types.js +10 -0
  326. package/plugins/specweave-kafka/lib/cli/types.ts +92 -0
  327. package/plugins/specweave-kafka/lib/connectors/connector-catalog.js +305 -0
  328. package/plugins/specweave-kafka/lib/connectors/connector-catalog.ts +528 -0
  329. package/plugins/specweave-kafka/lib/documentation/diagram-generator.js +114 -0
  330. package/plugins/specweave-kafka/lib/documentation/diagram-generator.ts +195 -0
  331. package/plugins/specweave-kafka/lib/documentation/exporter.js +210 -0
  332. package/plugins/specweave-kafka/lib/documentation/exporter.ts +338 -0
  333. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.js +60 -0
  334. package/plugins/specweave-kafka/lib/documentation/schema-catalog-generator.ts +130 -0
  335. package/plugins/specweave-kafka/lib/documentation/topology-generator.js +143 -0
  336. package/plugins/specweave-kafka/lib/documentation/topology-generator.ts +290 -0
  337. package/plugins/specweave-kafka/lib/mcp/detector.js +298 -0
  338. package/plugins/specweave-kafka/lib/mcp/detector.ts +352 -0
  339. package/plugins/specweave-kafka/lib/mcp/types.js +21 -0
  340. package/plugins/specweave-kafka/lib/mcp/types.ts +77 -0
  341. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.js +193 -0
  342. package/plugins/specweave-kafka/lib/multi-cluster/cluster-config-manager.ts +362 -0
  343. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.js +188 -0
  344. package/plugins/specweave-kafka/lib/multi-cluster/cluster-switcher.ts +359 -0
  345. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.js +195 -0
  346. package/plugins/specweave-kafka/lib/multi-cluster/health-aggregator.ts +380 -0
  347. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.js +209 -0
  348. package/plugins/specweave-kafka/lib/observability/opentelemetry-kafka.ts +358 -0
  349. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.js +354 -0
  350. package/plugins/specweave-kafka/lib/patterns/advanced-ksqldb-patterns.ts +563 -0
  351. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.js +259 -0
  352. package/plugins/specweave-kafka/lib/patterns/circuit-breaker-resilience.ts +516 -0
  353. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.js +233 -0
  354. package/plugins/specweave-kafka/lib/patterns/dead-letter-queue.ts +423 -0
  355. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.js +266 -0
  356. package/plugins/specweave-kafka/lib/patterns/exactly-once-semantics.ts +445 -0
  357. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.js +312 -0
  358. package/plugins/specweave-kafka/lib/patterns/flink-kafka-integration.ts +561 -0
  359. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.js +289 -0
  360. package/plugins/specweave-kafka/lib/patterns/multi-dc-replication.ts +607 -0
  361. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.js +264 -0
  362. package/plugins/specweave-kafka/lib/patterns/rate-limiting-backpressure.ts +498 -0
  363. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.js +263 -0
  364. package/plugins/specweave-kafka/lib/patterns/stream-processing-optimization.ts +549 -0
  365. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.js +205 -0
  366. package/plugins/specweave-kafka/lib/patterns/tiered-storage-compaction.ts +399 -0
  367. package/plugins/specweave-kafka/lib/performance/performance-optimizer.js +249 -0
  368. package/plugins/specweave-kafka/lib/performance/performance-optimizer.ts +427 -0
  369. package/plugins/specweave-kafka/lib/security/kafka-security.js +252 -0
  370. package/plugins/specweave-kafka/lib/security/kafka-security.ts +494 -0
  371. package/plugins/specweave-kafka/lib/utils/capacity-planner.js +203 -0
  372. package/plugins/specweave-kafka/lib/utils/capacity-planner.ts +469 -0
  373. package/plugins/specweave-kafka/lib/utils/config-validator.js +419 -0
  374. package/plugins/specweave-kafka/lib/utils/config-validator.ts +564 -0
  375. package/plugins/specweave-kafka/lib/utils/partitioning.js +329 -0
  376. package/plugins/specweave-kafka/lib/utils/partitioning.ts +473 -0
  377. package/plugins/specweave-kafka/lib/utils/sizing.js +221 -0
  378. package/plugins/specweave-kafka/lib/utils/sizing.ts +374 -0
  379. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-broker-metrics.json +628 -0
  380. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-cluster-overview.json +564 -0
  381. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-consumer-lag.json +509 -0
  382. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-jvm-metrics.json +674 -0
  383. package/plugins/specweave-kafka/monitoring/grafana/dashboards/kafka-topic-metrics.json +578 -0
  384. package/plugins/specweave-kafka/monitoring/grafana/provisioning/dashboards/kafka.yml +17 -0
  385. package/plugins/specweave-kafka/monitoring/grafana/provisioning/datasources/prometheus.yml +17 -0
  386. package/plugins/specweave-kafka/monitoring/prometheus/kafka-alerts.yml +415 -0
  387. package/plugins/specweave-kafka/monitoring/prometheus/kafka-jmx-exporter.yml +256 -0
  388. package/plugins/specweave-kafka/package.json +41 -0
  389. package/plugins/specweave-kafka/skills/kafka-architecture/SKILL.md +647 -0
  390. package/plugins/specweave-kafka/skills/kafka-cli-tools/SKILL.md +433 -0
  391. package/plugins/specweave-kafka/skills/kafka-iac-deployment/SKILL.md +449 -0
  392. package/plugins/specweave-kafka/skills/kafka-kubernetes/SKILL.md +667 -0
  393. package/plugins/specweave-kafka/skills/kafka-mcp-integration/SKILL.md +273 -0
  394. package/plugins/specweave-kafka/skills/kafka-observability/SKILL.md +576 -0
  395. package/plugins/specweave-kafka/templates/config/broker-production.properties +254 -0
  396. package/plugins/specweave-kafka/templates/config/consumer-low-latency.properties +112 -0
  397. package/plugins/specweave-kafka/templates/config/producer-high-throughput.properties +120 -0
  398. package/plugins/specweave-kafka/templates/migration/mirrormaker2-config.properties +234 -0
  399. package/plugins/specweave-kafka/templates/monitoring/grafana/multi-cluster-dashboard.json +686 -0
  400. package/plugins/specweave-kafka/terraform/apache-kafka/main.tf +347 -0
  401. package/plugins/specweave-kafka/terraform/apache-kafka/outputs.tf +107 -0
  402. package/plugins/specweave-kafka/terraform/apache-kafka/templates/kafka-broker-init.sh.tpl +216 -0
  403. package/plugins/specweave-kafka/terraform/apache-kafka/variables.tf +156 -0
  404. package/plugins/specweave-kafka/terraform/aws-msk/main.tf +362 -0
  405. package/plugins/specweave-kafka/terraform/aws-msk/outputs.tf +93 -0
  406. package/plugins/specweave-kafka/terraform/aws-msk/templates/server.properties.tpl +32 -0
  407. package/plugins/specweave-kafka/terraform/aws-msk/variables.tf +235 -0
  408. package/plugins/specweave-kafka/terraform/azure-event-hubs/main.tf +281 -0
  409. package/plugins/specweave-kafka/terraform/azure-event-hubs/outputs.tf +118 -0
  410. package/plugins/specweave-kafka/terraform/azure-event-hubs/variables.tf +148 -0
  411. package/plugins/specweave-kafka/tsconfig.json +21 -0
  412. package/plugins/specweave-kafka-streams/.claude-plugin/plugin.json +23 -0
  413. package/plugins/specweave-kafka-streams/README.md +310 -0
  414. package/plugins/specweave-kafka-streams/skills/kafka-streams-topology/SKILL.md +539 -0
  415. package/plugins/specweave-n8n/.claude-plugin/plugin.json +22 -0
  416. package/plugins/specweave-n8n/README.md +354 -0
  417. package/plugins/specweave-n8n/skills/n8n-kafka-workflows/SKILL.md +504 -0
  418. package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
  419. package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
  420. package/src/templates/AGENTS.md.template +601 -7
  421. package/src/templates/CLAUDE.md.template +188 -88
  422. package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +0 -255
  423. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +0 -248
  424. package/plugins/specweave-github/commands/specweave-github-sync-from.md +0 -147
  425. package/plugins/specweave-github/commands/specweave-github-sync-spec.md +0 -208
  426. package/plugins/specweave-github/commands/specweave-github-sync-tasks.md +0 -530
  427. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +0 -267
  428. package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +0 -240
@@ -0,0 +1,83 @@
1
+ #!/bin/bash
2
+
3
+ # SpecWeave Pre-Command Deduplication Hook
4
+ # Fires BEFORE any command executes (UserPromptSubmit hook)
5
+ # Purpose: Prevent duplicate command invocations within configurable time window
6
+
7
+ set -euo pipefail
8
+
9
+ # ==============================================================================
10
+ # PROJECT ROOT DETECTION
11
+ # ==============================================================================
12
+
13
+ # Find project root by searching upward for .specweave/ directory
14
+ find_project_root() {
15
+ local dir="$1"
16
+ while [ "$dir" != "/" ]; do
17
+ if [ -d "$dir/.specweave" ]; then
18
+ echo "$dir"
19
+ return 0
20
+ fi
21
+ dir="$(dirname "$dir")"
22
+ done
23
+ # Fallback: try current directory
24
+ if [ -d "$(pwd)/.specweave" ]; then
25
+ pwd
26
+ else
27
+ echo "$(pwd)"
28
+ fi
29
+ }
30
+
31
+ PROJECT_ROOT="$(find_project_root "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")"
32
+ cd "$PROJECT_ROOT" 2>/dev/null || true
33
+
34
+ # Read input JSON from stdin
35
+ INPUT=$(cat)
36
+
37
+ # ==============================================================================
38
+ # DEDUPLICATION CHECK: Block duplicate commands within 1 second
39
+ # ==============================================================================
40
+
41
+ # Check if deduplication module is available
42
+ if command -v node >/dev/null 2>&1 && [[ -f "dist/src/core/deduplication/command-deduplicator.js" ]]; then
43
+ # Use dedicated wrapper script for ES module compatibility
44
+ DEDUP_RESULT=$(echo "$INPUT" | node scripts/check-deduplication.js 2>/dev/null || echo "OK")
45
+
46
+ # Parse result
47
+ STATUS=$(echo "$DEDUP_RESULT" | head -1)
48
+
49
+ if [[ "$STATUS" == "DUPLICATE" ]]; then
50
+ # Get stats
51
+ STATS=$(echo "$DEDUP_RESULT" | tail -1)
52
+
53
+ # Extract command and stats for readable message
54
+ COMMAND=$(echo "$STATS" | grep -o '"lastCommand":"[^"]*"' | cut -d'"' -f4 || echo "unknown")
55
+ TOTAL_BLOCKED=$(echo "$STATS" | grep -o '"totalDuplicatesBlocked":[0-9]*' | cut -d':' -f2 || echo "1")
56
+ CACHE_SIZE=$(echo "$STATS" | grep -o '"currentCacheSize":[0-9]*' | cut -d':' -f2 || echo "1")
57
+
58
+ # Build error message WITHOUT embedding JSON (avoid escaping issues)
59
+ MESSAGE=$(cat <<'EOF'
60
+ {
61
+ "decision": "block",
62
+ "reason": "🚫 DUPLICATE COMMAND DETECTED\n\nCommand: `COMMAND_PLACEHOLDER`\nTime window: 1 second\n\nThis command was just executed! To prevent unintended duplicates, this invocation has been blocked.\n\n💡 If you meant to run this command again:\n 1. Wait 1 second\n 2. Run the command again\n\nDeduplication Stats:\n- Total duplicates blocked: BLOCKED_PLACEHOLDER\n- Commands in cache: CACHE_PLACEHOLDER"
63
+ }
64
+ EOF
65
+ )
66
+ # Replace placeholders (avoids JSON escaping issues)
67
+ # Use | as sed delimiter to avoid conflicts with / in command names
68
+ echo "$MESSAGE" | sed "s|COMMAND_PLACEHOLDER|$COMMAND|g" | sed "s|BLOCKED_PLACEHOLDER|$TOTAL_BLOCKED|g" | sed "s|CACHE_PLACEHOLDER|$CACHE_SIZE|g"
69
+ exit 0
70
+ fi
71
+ fi
72
+
73
+ # ==============================================================================
74
+ # PASS THROUGH: No duplicate detected, proceed with command
75
+ # ==============================================================================
76
+
77
+ cat <<EOF
78
+ {
79
+ "decision": "approve"
80
+ }
81
+ EOF
82
+
83
+ exit 0
@@ -26,7 +26,7 @@ if echo "$PROMPT" | grep -q "/specweave:increment"; then
26
26
 
27
27
  if [[ -d "$SPECWEAVE_DIR/increments" ]]; then
28
28
  # Run discipline check (exit code: 0=pass, 1=violations, 2=error)
29
- if command -v node >/dev/null 2>&1 && [[ -f "dist/cli/index.js" ]]; then
29
+ if command -v node >/dev/null 2>&1 && [[ -f "dist/src/core/increment/metadata-manager.js" ]]; then
30
30
  # Check active increments using MetadataManager
31
31
  ACTIVE_COUNT=$(node -e "
32
32
  try {
@@ -77,6 +77,8 @@ async function hierarchicalDistribution(incrementId) {
77
77
  console.log(` - ${warning}`);
78
78
  }
79
79
  }
80
+ console.log(" \u{1F4CA} Updating acceptance criteria status from completed tasks...");
81
+ await distributor.updateAcceptanceCriteriaStatus(incrementId);
80
82
  const changedFiles = [result.epicPath, ...result.userStoryPaths];
81
83
  return {
82
84
  success: true,
@@ -176,6 +176,10 @@ async function hierarchicalDistribution(
176
176
  }
177
177
  }
178
178
 
179
+ // Update acceptance criteria status based on completed tasks
180
+ console.log(' 📊 Updating acceptance criteria status from completed tasks...');
181
+ await distributor.updateAcceptanceCriteriaStatus(incrementId);
182
+
179
183
  // Collect changed file paths
180
184
  const changedFiles = [result.epicPath, ...result.userStoryPaths];
181
185
 
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "fs/promises";
3
+ import * as path from "path";
4
+ async function updateACStatus(incrementId) {
5
+ try {
6
+ const projectRoot = process.cwd();
7
+ const incrementPath = path.join(projectRoot, ".specweave/increments", incrementId);
8
+ try {
9
+ await fs.access(incrementPath);
10
+ } catch {
11
+ console.error(`\u274C Increment ${incrementId} not found at ${incrementPath}`);
12
+ return;
13
+ }
14
+ console.log(`\u{1F504} Updating AC status for increment ${incrementId}...`);
15
+ const completedACs = await extractCompletedACsFromTasks(incrementPath);
16
+ if (completedACs.size === 0) {
17
+ console.log(`\u2139\uFE0F No completed tasks with AC-IDs found in tasks.md`);
18
+ return;
19
+ }
20
+ console.log(`\u2713 Found ${completedACs.size} completed AC-IDs from tasks.md`);
21
+ const updatedCount = await updateSpecACCheckboxes(incrementPath, completedACs);
22
+ if (updatedCount > 0) {
23
+ console.log(`\u2705 Updated ${updatedCount} AC checkbox(es) in spec.md`);
24
+ } else {
25
+ console.log(`\u2139\uFE0F No AC checkboxes needed updating in spec.md`);
26
+ }
27
+ } catch (error) {
28
+ console.error("\u274C Error updating AC status:", error);
29
+ }
30
+ }
31
+ async function extractCompletedACsFromTasks(incrementPath) {
32
+ const tasksPath = path.join(incrementPath, "tasks.md");
33
+ const completedACs = /* @__PURE__ */ new Set();
34
+ try {
35
+ const tasksContent = await fs.readFile(tasksPath, "utf-8");
36
+ const taskSections = tasksContent.split(/^(###+)\s+T-\d+:/gm);
37
+ for (let i = 1; i < taskSections.length; i += 2) {
38
+ const taskContent = taskSections[i + 1];
39
+ const statusMatch = taskContent.match(/\*\*Status\*\*:\s*\[x\]/i);
40
+ if (!statusMatch) continue;
41
+ const acMatch = taskContent.match(/\*\*AC\*\*:\s*([^\n]+)/);
42
+ if (!acMatch) continue;
43
+ const acField = acMatch[1];
44
+ const acIds = acField.split(",").map((id) => id.trim()).filter((id) => /^AC-[A-Z0-9]+-\d+$/.test(id));
45
+ acIds.forEach((acId) => completedACs.add(acId));
46
+ }
47
+ return completedACs;
48
+ } catch (error) {
49
+ if (error.code === "ENOENT") {
50
+ console.log(`\u2139\uFE0F tasks.md not found, skipping AC update`);
51
+ } else {
52
+ console.error("Error reading tasks.md:", error);
53
+ }
54
+ return completedACs;
55
+ }
56
+ }
57
+ async function updateSpecACCheckboxes(incrementPath, completedACs) {
58
+ const specPath = path.join(incrementPath, "spec.md");
59
+ try {
60
+ let specContent = await fs.readFile(specPath, "utf-8");
61
+ let updatedCount = 0;
62
+ const acPattern = /^(\s*)-\s+\[([ x])\]\s+\*\*([A-Z]+-[A-Z0-9]+-\d+)\*\*:(.*)$/gm;
63
+ specContent = specContent.replace(acPattern, (match, indent, currentState, acId, description) => {
64
+ const shouldBeChecked = completedACs.has(acId);
65
+ const isCurrentlyChecked = currentState === "x";
66
+ if (shouldBeChecked && !isCurrentlyChecked) {
67
+ updatedCount++;
68
+ return `${indent}- [x] **${acId}**:${description}`;
69
+ } else if (!shouldBeChecked && isCurrentlyChecked) {
70
+ updatedCount++;
71
+ return `${indent}- [ ] **${acId}**:${description}`;
72
+ }
73
+ return match;
74
+ });
75
+ if (updatedCount > 0) {
76
+ await fs.writeFile(specPath, specContent, "utf-8");
77
+ }
78
+ return updatedCount;
79
+ } catch (error) {
80
+ if (error.code === "ENOENT") {
81
+ console.log(`\u2139\uFE0F spec.md not found, skipping AC update`);
82
+ } else {
83
+ console.error("Error updating spec.md:", error);
84
+ }
85
+ return 0;
86
+ }
87
+ }
88
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
89
+ if (isMainModule) {
90
+ const incrementId = process.argv[2];
91
+ if (!incrementId) {
92
+ console.error("Usage: node update-ac-status.js <increment-id>");
93
+ console.error("Example: node update-ac-status.js 0031-external-tool-status-sync");
94
+ process.exit(1);
95
+ }
96
+ updateACStatus(incrementId).then(() => {
97
+ process.exit(0);
98
+ }).catch((error) => {
99
+ console.error("Fatal error:", error);
100
+ process.exit(1);
101
+ });
102
+ }
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AC Status Update Hook
5
+ *
6
+ * Updates acceptance criteria checkboxes in spec.md based on completed tasks.
7
+ *
8
+ * Flow:
9
+ * 1. Read tasks.md → Extract completed tasks
10
+ * 2. Extract AC-IDs from **AC**: field (e.g., AC-US1-01, AC-US1-02)
11
+ * 3. Read spec.md → Find all AC checkboxes
12
+ * 4. Check off AC if task implementing it is complete
13
+ * 5. Write updated spec.md
14
+ *
15
+ * Called by: plugins/specweave/hooks/post-task-completion.sh
16
+ *
17
+ * Example:
18
+ * - Task T-001: [x] Completed, **AC**: AC-US1-01, AC-US1-02
19
+ * - spec.md: - [ ] **AC-US1-01**: ... → - [x] **AC-US1-01**: ... ✅
20
+ */
21
+
22
+ import * as fs from 'fs/promises';
23
+ import * as path from 'path';
24
+
25
+ interface ACStatus {
26
+ acId: string;
27
+ isComplete: boolean;
28
+ completedByTasks: string[];
29
+ }
30
+
31
+ /**
32
+ * Main entry point
33
+ */
34
+ async function updateACStatus(incrementId: string): Promise<void> {
35
+ try {
36
+ const projectRoot = process.cwd();
37
+ const incrementPath = path.join(projectRoot, '.specweave/increments', incrementId);
38
+
39
+ // Verify increment exists
40
+ try {
41
+ await fs.access(incrementPath);
42
+ } catch {
43
+ console.error(`❌ Increment ${incrementId} not found at ${incrementPath}`);
44
+ return;
45
+ }
46
+
47
+ console.log(`🔄 Updating AC status for increment ${incrementId}...`);
48
+
49
+ // Step 1: Extract completed ACs from tasks.md
50
+ const completedACs = await extractCompletedACsFromTasks(incrementPath);
51
+
52
+ if (completedACs.size === 0) {
53
+ console.log(`ℹ️ No completed tasks with AC-IDs found in tasks.md`);
54
+ return;
55
+ }
56
+
57
+ console.log(`✓ Found ${completedACs.size} completed AC-IDs from tasks.md`);
58
+
59
+ // Step 2: Update spec.md checkboxes
60
+ const updatedCount = await updateSpecACCheckboxes(incrementPath, completedACs);
61
+
62
+ if (updatedCount > 0) {
63
+ console.log(`✅ Updated ${updatedCount} AC checkbox(es) in spec.md`);
64
+ } else {
65
+ console.log(`ℹ️ No AC checkboxes needed updating in spec.md`);
66
+ }
67
+ } catch (error) {
68
+ console.error('❌ Error updating AC status:', error);
69
+ // Non-blocking: Don't throw, just log
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Extract AC-IDs from completed tasks in tasks.md
75
+ */
76
+ async function extractCompletedACsFromTasks(incrementPath: string): Promise<Set<string>> {
77
+ const tasksPath = path.join(incrementPath, 'tasks.md');
78
+ const completedACs = new Set<string>();
79
+
80
+ try {
81
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
82
+
83
+ // Pattern: Match tasks with completed status and AC field
84
+ // Example:
85
+ // ### T-001: Task Title
86
+ // **Status**: [x] (100% - Completed)
87
+ // **AC**: AC-US1-01, AC-US1-02, AC-US1-03
88
+
89
+ // Split by task headings (## or ###)
90
+ const taskSections = tasksContent.split(/^(###+)\s+T-\d+:/gm);
91
+
92
+ for (let i = 1; i < taskSections.length; i += 2) {
93
+ const taskContent = taskSections[i + 1];
94
+
95
+ // Check if task is completed
96
+ const statusMatch = taskContent.match(/\*\*Status\*\*:\s*\[x\]/i);
97
+ if (!statusMatch) continue;
98
+
99
+ // Extract AC-IDs from **AC**: field
100
+ const acMatch = taskContent.match(/\*\*AC\*\*:\s*([^\n]+)/);
101
+ if (!acMatch) continue;
102
+
103
+ const acField = acMatch[1]; // "AC-US1-01, AC-US1-02, AC-US1-03"
104
+ const acIds = acField
105
+ .split(',')
106
+ .map(id => id.trim())
107
+ .filter(id => /^AC-[A-Z0-9]+-\d+$/.test(id)); // Validate format
108
+
109
+ acIds.forEach(acId => completedACs.add(acId));
110
+ }
111
+
112
+ return completedACs;
113
+ } catch (error) {
114
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
115
+ console.log(`ℹ️ tasks.md not found, skipping AC update`);
116
+ } else {
117
+ console.error('Error reading tasks.md:', error);
118
+ }
119
+ return completedACs;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Update AC checkboxes in spec.md
125
+ */
126
+ async function updateSpecACCheckboxes(
127
+ incrementPath: string,
128
+ completedACs: Set<string>
129
+ ): Promise<number> {
130
+ const specPath = path.join(incrementPath, 'spec.md');
131
+
132
+ try {
133
+ let specContent = await fs.readFile(specPath, 'utf-8');
134
+ let updatedCount = 0;
135
+
136
+ // Pattern: - [ ] **AC-US1-01**: Description
137
+ // Captures: indent, checkbox state, AC-ID, rest of line
138
+ const acPattern = /^(\s*)-\s+\[([ x])\]\s+\*\*([A-Z]+-[A-Z0-9]+-\d+)\*\*:(.*)$/gm;
139
+
140
+ specContent = specContent.replace(acPattern, (match, indent, currentState, acId, description) => {
141
+ const shouldBeChecked = completedACs.has(acId);
142
+ const isCurrentlyChecked = currentState === 'x';
143
+
144
+ if (shouldBeChecked && !isCurrentlyChecked) {
145
+ // Check off this AC
146
+ updatedCount++;
147
+ return `${indent}- [x] **${acId}**:${description}`;
148
+ } else if (!shouldBeChecked && isCurrentlyChecked) {
149
+ // Uncheck this AC (task was un-completed?)
150
+ updatedCount++;
151
+ return `${indent}- [ ] **${acId}**:${description}`;
152
+ }
153
+
154
+ return match; // No change needed
155
+ });
156
+
157
+ if (updatedCount > 0) {
158
+ await fs.writeFile(specPath, specContent, 'utf-8');
159
+ }
160
+
161
+ return updatedCount;
162
+ } catch (error) {
163
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
164
+ console.log(`ℹ️ spec.md not found, skipping AC update`);
165
+ } else {
166
+ console.error('Error updating spec.md:', error);
167
+ }
168
+ return 0;
169
+ }
170
+ }
171
+
172
+ // CLI Entry Point (ES Module)
173
+ const isMainModule = import.meta.url === `file://${process.argv[1]}`;
174
+
175
+ if (isMainModule) {
176
+ const incrementId = process.argv[2];
177
+
178
+ if (!incrementId) {
179
+ console.error('Usage: node update-ac-status.js <increment-id>');
180
+ console.error('Example: node update-ac-status.js 0031-external-tool-status-sync');
181
+ process.exit(1);
182
+ }
183
+
184
+ updateACStatus(incrementId)
185
+ .then(() => {
186
+ process.exit(0);
187
+ })
188
+ .catch((error) => {
189
+ console.error('Fatal error:', error);
190
+ process.exit(1);
191
+ });
192
+ }
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: archive-increments
3
+ description: Intelligent increment archiving expert. Analyzes increment age, status, and activity to recommend archiving strategy. Keeps workspace clean while preserving history. Activates for archive increments, clean workspace, too many increments, archive old, archive completed, preserve history, _archive folder.
4
+ ---
5
+
6
+ # Increment Archive Manager
7
+
8
+ Expert at keeping the `.specweave/increments/` folder clean and organized through intelligent archiving.
9
+
10
+ ## Core Knowledge
11
+
12
+ ### Archiving Philosophy
13
+
14
+ **The 10-10-10 Rule**:
15
+ - **10 Active**: Keep last 10 increments readily accessible
16
+ - **10 Days**: Archive increments inactive for >10 days
17
+ - **10 Seconds**: Archive operation should take <10 seconds
18
+
19
+ ### Archive Structure
20
+
21
+ ```
22
+ .specweave/increments/
23
+ ├── 0023-0032 (Active) ← Last 10 increments
24
+ ├── _archive/ ← Completed/old increments
25
+ │ ├── 0001-0022 ← Historical increments
26
+ │ └── 0029 ← Abandoned experiments
27
+ └── _abandoned/ ← Failed/obsolete increments
28
+ ```
29
+
30
+ ### Smart Detection Rules
31
+
32
+ #### Never Archive
33
+ - **Active increments** (status: active)
34
+ - **Paused increments** (status: paused) - may resume
35
+ - **Recent increments** (last 10 by default)
36
+ - **Increments with open GitHub/JIRA/ADO issues**
37
+ - **Increments with uncommitted changes**
38
+
39
+ #### Always Archive
40
+ - **Completed >60 days ago**
41
+ - **No activity >30 days** (and status: completed)
42
+ - **Superseded increments** (replaced by newer version)
43
+ - **Failed experiments** (after confirmation)
44
+
45
+ #### Smart Grouping
46
+ - **Release groups**: Archive all v0.7.x after v0.8.0 ships
47
+ - **Feature groups**: Archive related increments together
48
+ - **Time-based**: Quarter/month-based archiving
49
+
50
+ ## Usage Patterns
51
+
52
+ ### Keep Workspace Clean
53
+ ```bash
54
+ # Interactive archiving - prompts for confirmation
55
+ /specweave:archive-increments
56
+
57
+ # Keep only last 5 increments
58
+ /specweave:archive-increments --keep-last 5
59
+
60
+ # Archive all completed increments
61
+ /specweave:archive-increments --archive-completed
62
+ ```
63
+
64
+ ### Prepare for Release
65
+ ```bash
66
+ # Archive all pre-release increments
67
+ /specweave:archive-increments --pattern "v0.7"
68
+
69
+ # Archive by date range
70
+ /specweave:archive-increments --older-than 30d
71
+ ```
72
+
73
+ ### Restore from Archive
74
+ ```bash
75
+ # List archived increments
76
+ /specweave:archive-increments --list-archived
77
+
78
+ # Restore specific increment
79
+ /specweave:archive-increments --restore 0015
80
+ ```
81
+
82
+ ## Configuration
83
+
84
+ ### Default Settings
85
+ ```json
86
+ {
87
+ "archiving": {
88
+ "keepLast": 10, // Keep last 10 increments
89
+ "autoArchive": false, // Manual by default
90
+ "archiveAfterDays": 60, // Archive after 60 days
91
+ "preserveActive": true, // Never archive active
92
+ "archiveCompleted": false // Manual control
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### Aggressive Cleanup
98
+ ```json
99
+ {
100
+ "archiving": {
101
+ "keepLast": 5, // Minimal workspace
102
+ "autoArchive": true, // Auto-archive on completion
103
+ "archiveAfterDays": 14, // Archive after 2 weeks
104
+ "archiveCompleted": true // Auto-archive completed
105
+ }
106
+ }
107
+ ```
108
+
109
+ ## Archive Statistics
110
+
111
+ ### Current State Analysis
112
+ When asked about archiving, I analyze:
113
+ - Number of active increments
114
+ - Age of oldest active increment
115
+ - Total size of increments folder
116
+ - Number of completed increments
117
+ - External sync status
118
+
119
+ ### Recommendations
120
+ Based on analysis, I suggest:
121
+ - **Overcrowded** (>20 active): Archive all but last 10
122
+ - **Stale** (many >30 days old): Archive by age
123
+ - **Post-release**: Archive previous version increments
124
+ - **Large size** (>100MB): Archive largest completed increments
125
+
126
+ ## Safety Features
127
+
128
+ ### Pre-Archive Checks
129
+ 1. **Metadata validation**: Check increment status
130
+ 2. **External sync**: Verify no open issues
131
+ 3. **Git status**: Check for uncommitted changes
132
+ 4. **Dependencies**: Check if referenced by active increments
133
+ 5. **User confirmation**: Show what will be archived
134
+
135
+ ### Archive Operations
136
+ - **Atomic moves**: Use fs.move with overwrite protection
137
+ - **Preserve structure**: Maintain full increment structure
138
+ - **Update references**: Fix links in living docs
139
+ - **Reversible**: Easy restore from archive
140
+ - **Audit trail**: Log all archive operations
141
+
142
+ ## Smart Suggestions
143
+
144
+ ### When to Archive
145
+ - **After major release**: Archive all pre-release increments
146
+ - **Quarterly cleanup**: Archive increments >3 months old
147
+ - **Before new project phase**: Archive previous phase work
148
+ - **Low disk space**: Archive largest completed increments
149
+
150
+ ### Archive Patterns
151
+ - **By version**: `--pattern "v0.7"` (all v0.7.x increments)
152
+ - **By feature**: `--pattern "auth|login"` (auth-related)
153
+ - **By date**: `--older-than 30d` (time-based)
154
+ - **By status**: `--archive-completed` (all completed)
155
+
156
+ ## Integration Points
157
+
158
+ ### Status Line
159
+ - Shows "23-32 (10 active, 22 archived)" format
160
+ - Warns when >15 active increments
161
+ - Suggests archiving when appropriate
162
+
163
+ ### Increment Commands
164
+ - `/specweave:done` can trigger auto-archive
165
+ - `/specweave:status` shows archive statistics
166
+ - `/specweave:next` considers archived increments
167
+
168
+ ### Living Docs
169
+ - Archive preserves living docs references
170
+ - Restore updates living docs links
171
+ - Archive included in docs statistics
172
+
173
+ ## Best Practices
174
+
175
+ 1. **Regular Cleanup**: Archive monthly or after releases
176
+ 2. **Keep Recent**: Always keep last 5-10 increments
177
+ 3. **Preserve Active**: Never force-archive active work
178
+ 4. **Group Related**: Archive feature groups together
179
+ 5. **Document Reasons**: Add archive notes for context
180
+
181
+ ## Quick Reference
182
+
183
+ ```bash
184
+ # Archive old increments
185
+ /specweave:archive-increments --older-than 30d
186
+
187
+ # Keep workspace minimal
188
+ /specweave:archive-increments --keep-last 5
189
+
190
+ # Archive after release
191
+ /specweave:archive-increments --pattern "pre-release"
192
+
193
+ # Restore for reference
194
+ /specweave:archive-increments --restore 0015
195
+
196
+ # Check archive stats
197
+ /specweave:archive-increments --stats
198
+ ```
@@ -59,8 +59,15 @@ function generateShortName(description) {
59
59
  * Get the next available feature number
60
60
  * @param {string} featuresDir - Path to features directory (default: '.specweave/increments')
61
61
  * @returns {string} Next feature number (zero-padded to 4 digits: 0001-9999)
62
+ *
63
+ * NOTE: This function is DEPRECATED. Use IncrementNumberManager from src/core/increment-utils.ts instead.
64
+ * Kept for backward compatibility with existing scripts.
62
65
  */
63
66
  function getNextFeatureNumber(featuresDir = '.specweave/increments') {
67
+ // DEPRECATED: For backward compatibility only
68
+ // The NEW implementation scans ALL directories (_archive, _abandoned, _paused)
69
+ // To use the new implementation, import IncrementNumberManager from src/core/increment-utils.ts
70
+
64
71
  let highest = 0;
65
72
 
66
73
  if (fs.existsSync(featuresDir)) {
@@ -104,8 +111,15 @@ function featureExists(shortName, featuresDir = '.specweave/increments') {
104
111
  * @param {string} incrementNumber - Increment number to check (e.g., '0001')
105
112
  * @param {string} featuresDir - Path to features directory
106
113
  * @returns {boolean} True if number already exists
114
+ *
115
+ * NOTE: This function is DEPRECATED. Use IncrementNumberManager.incrementNumberExists() instead.
116
+ * Kept for backward compatibility with existing scripts.
107
117
  */
108
118
  function incrementNumberExists(incrementNumber, featuresDir = '.specweave/increments') {
119
+ // DEPRECATED: For backward compatibility only
120
+ // The NEW implementation scans ALL directories (_archive, _abandoned, _paused)
121
+ // To use the new implementation, import IncrementNumberManager from src/core/increment-utils.ts
122
+
109
123
  if (!fs.existsSync(featuresDir)) {
110
124
  return false;
111
125
  }