specweave 0.17.0 → 0.17.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 (1036) hide show
  1. package/.claude-plugin/marketplace.json +22 -0
  2. package/CLAUDE.md +56 -32
  3. package/bin/specweave.js +9 -0
  4. package/dist/cli/commands/revert-wip-limit.js +60 -0
  5. package/dist/cli/commands/sync-spec-commits.d.ts +9 -0
  6. package/dist/cli/commands/sync-spec-commits.d.ts.map +1 -0
  7. package/dist/cli/commands/sync-spec-commits.js +186 -0
  8. package/dist/cli/commands/sync-spec-commits.js.map +1 -0
  9. package/dist/core/agent-model-manager.d.ts +52 -0
  10. package/dist/core/agent-model-manager.d.ts.map +1 -0
  11. package/dist/core/agent-model-manager.js +120 -0
  12. package/dist/core/agent-model-manager.js.map +1 -0
  13. package/dist/core/comment-builder.d.ts +57 -0
  14. package/dist/core/comment-builder.d.ts.map +1 -0
  15. package/dist/core/comment-builder.js +239 -0
  16. package/dist/core/comment-builder.js.map +1 -0
  17. package/dist/core/model-selector.d.ts +57 -0
  18. package/dist/core/model-selector.d.ts.map +1 -0
  19. package/dist/core/model-selector.js +115 -0
  20. package/dist/core/model-selector.js.map +1 -0
  21. package/dist/core/phase-detector.d.ts +62 -0
  22. package/dist/core/phase-detector.d.ts.map +1 -0
  23. package/dist/core/phase-detector.js +229 -0
  24. package/dist/core/phase-detector.js.map +1 -0
  25. package/dist/core/spec-task-mapper.d.ts +71 -0
  26. package/dist/core/spec-task-mapper.d.ts.map +1 -0
  27. package/dist/core/spec-task-mapper.js +208 -0
  28. package/dist/core/spec-task-mapper.js.map +1 -0
  29. package/dist/hooks/lib/git-diff-analyzer.d.ts +89 -0
  30. package/dist/hooks/lib/git-diff-analyzer.d.ts.map +1 -0
  31. package/dist/hooks/lib/git-diff-analyzer.js +226 -0
  32. package/dist/hooks/lib/git-diff-analyzer.js.map +1 -0
  33. package/dist/hooks/lib/invoke-translator-skill.d.ts +60 -0
  34. package/dist/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
  35. package/dist/hooks/lib/invoke-translator-skill.js +201 -0
  36. package/dist/hooks/lib/invoke-translator-skill.js.map +1 -0
  37. package/dist/hooks/lib/prepare-reflection-context.d.ts +42 -0
  38. package/dist/hooks/lib/prepare-reflection-context.d.ts.map +1 -0
  39. package/dist/hooks/lib/prepare-reflection-context.js +123 -0
  40. package/dist/hooks/lib/prepare-reflection-context.js.map +1 -0
  41. package/dist/hooks/lib/reflection-config-loader.d.ts +45 -0
  42. package/dist/hooks/lib/reflection-config-loader.d.ts.map +1 -0
  43. package/dist/hooks/lib/reflection-config-loader.js +132 -0
  44. package/dist/hooks/lib/reflection-config-loader.js.map +1 -0
  45. package/dist/hooks/lib/reflection-parser.d.ts +33 -0
  46. package/dist/hooks/lib/reflection-parser.d.ts.map +1 -0
  47. package/dist/hooks/lib/reflection-parser.js +419 -0
  48. package/dist/hooks/lib/reflection-parser.js.map +1 -0
  49. package/dist/hooks/lib/reflection-prompt-builder.d.ts +56 -0
  50. package/dist/hooks/lib/reflection-prompt-builder.d.ts.map +1 -0
  51. package/dist/hooks/lib/reflection-prompt-builder.js +239 -0
  52. package/dist/hooks/lib/reflection-prompt-builder.js.map +1 -0
  53. package/dist/hooks/lib/reflection-storage.d.ts +64 -0
  54. package/dist/hooks/lib/reflection-storage.d.ts.map +1 -0
  55. package/dist/hooks/lib/reflection-storage.js +305 -0
  56. package/dist/hooks/lib/reflection-storage.js.map +1 -0
  57. package/dist/hooks/lib/run-self-reflection.d.ts +43 -0
  58. package/dist/hooks/lib/run-self-reflection.d.ts.map +1 -0
  59. package/dist/hooks/lib/run-self-reflection.js +203 -0
  60. package/dist/hooks/lib/run-self-reflection.js.map +1 -0
  61. package/dist/hooks/lib/sync-living-docs.d.ts +27 -0
  62. package/dist/hooks/lib/sync-living-docs.d.ts.map +1 -0
  63. package/dist/hooks/lib/sync-living-docs.js +116 -0
  64. package/dist/hooks/lib/sync-living-docs.js.map +1 -0
  65. package/dist/hooks/lib/translate-file.d.ts +59 -0
  66. package/dist/hooks/lib/translate-file.d.ts.map +1 -0
  67. package/dist/hooks/lib/translate-file.js +350 -0
  68. package/dist/hooks/lib/translate-file.js.map +1 -0
  69. package/dist/hooks/lib/translate-living-docs.d.ts +13 -0
  70. package/dist/hooks/lib/translate-living-docs.d.ts.map +1 -0
  71. package/dist/hooks/lib/translate-living-docs.js +175 -0
  72. package/dist/hooks/lib/translate-living-docs.js.map +1 -0
  73. package/dist/hooks/lib/types/reflection-types.d.ts +164 -0
  74. package/dist/hooks/lib/types/reflection-types.d.ts.map +1 -0
  75. package/dist/hooks/lib/types/reflection-types.js +73 -0
  76. package/dist/hooks/lib/types/reflection-types.js.map +1 -0
  77. package/dist/hooks/lib/update-tasks-md.d.ts +29 -0
  78. package/dist/hooks/lib/update-tasks-md.d.ts.map +1 -0
  79. package/dist/hooks/lib/update-tasks-md.js +203 -0
  80. package/dist/hooks/lib/update-tasks-md.js.map +1 -0
  81. package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts +89 -0
  82. package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.map +1 -0
  83. package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js +226 -0
  84. package/dist/plugins/specweave/lib/hooks/git-diff-analyzer.js.map +1 -0
  85. package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts +60 -0
  86. package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.map +1 -0
  87. package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js +201 -0
  88. package/dist/plugins/specweave/lib/hooks/invoke-translator-skill.js.map +1 -0
  89. package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts +42 -0
  90. package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.map +1 -0
  91. package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js +123 -0
  92. package/dist/plugins/specweave/lib/hooks/prepare-reflection-context.js.map +1 -0
  93. package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts +45 -0
  94. package/dist/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.map +1 -0
  95. package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js +132 -0
  96. package/dist/plugins/specweave/lib/hooks/reflection-config-loader.js.map +1 -0
  97. package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts +33 -0
  98. package/dist/plugins/specweave/lib/hooks/reflection-parser.d.ts.map +1 -0
  99. package/dist/plugins/specweave/lib/hooks/reflection-parser.js +419 -0
  100. package/dist/plugins/specweave/lib/hooks/reflection-parser.js.map +1 -0
  101. package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts +56 -0
  102. package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.map +1 -0
  103. package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js +239 -0
  104. package/dist/plugins/specweave/lib/hooks/reflection-prompt-builder.js.map +1 -0
  105. package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts +64 -0
  106. package/dist/plugins/specweave/lib/hooks/reflection-storage.d.ts.map +1 -0
  107. package/dist/plugins/specweave/lib/hooks/reflection-storage.js +305 -0
  108. package/dist/plugins/specweave/lib/hooks/reflection-storage.js.map +1 -0
  109. package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts +43 -0
  110. package/dist/plugins/specweave/lib/hooks/run-self-reflection.d.ts.map +1 -0
  111. package/dist/plugins/specweave/lib/hooks/run-self-reflection.js +203 -0
  112. package/dist/plugins/specweave/lib/hooks/run-self-reflection.js.map +1 -0
  113. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts +27 -0
  114. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -0
  115. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +180 -0
  116. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -0
  117. package/dist/plugins/specweave/lib/hooks/translate-file.d.ts +59 -0
  118. package/dist/plugins/specweave/lib/hooks/translate-file.d.ts.map +1 -0
  119. package/dist/plugins/specweave/lib/hooks/translate-file.js +350 -0
  120. package/dist/plugins/specweave/lib/hooks/translate-file.js.map +1 -0
  121. package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts +13 -0
  122. package/dist/plugins/specweave/lib/hooks/translate-living-docs.d.ts.map +1 -0
  123. package/dist/plugins/specweave/lib/hooks/translate-living-docs.js +175 -0
  124. package/dist/plugins/specweave/lib/hooks/translate-living-docs.js.map +1 -0
  125. package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts +164 -0
  126. package/dist/plugins/specweave/lib/hooks/types/reflection-types.d.ts.map +1 -0
  127. package/dist/plugins/specweave/lib/hooks/types/reflection-types.js +73 -0
  128. package/dist/plugins/specweave/lib/hooks/types/reflection-types.js.map +1 -0
  129. package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts +29 -0
  130. package/dist/plugins/specweave/lib/hooks/update-tasks-md.d.ts.map +1 -0
  131. package/dist/plugins/specweave/lib/hooks/update-tasks-md.js +203 -0
  132. package/dist/plugins/specweave/lib/hooks/update-tasks-md.js.map +1 -0
  133. package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts +94 -0
  134. package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts.map +1 -0
  135. package/dist/plugins/specweave-ado/lib/ado-board-resolver.js +219 -0
  136. package/dist/plugins/specweave-ado/lib/ado-board-resolver.js.map +1 -0
  137. package/dist/plugins/specweave-ado/lib/ado-client-v2.d.ts +134 -0
  138. package/dist/plugins/specweave-ado/lib/ado-client-v2.d.ts.map +1 -0
  139. package/dist/plugins/specweave-ado/lib/ado-client-v2.js +478 -0
  140. package/dist/plugins/specweave-ado/lib/ado-client-v2.js.map +1 -0
  141. package/dist/plugins/specweave-ado/lib/ado-client.d.ts +112 -0
  142. package/dist/plugins/specweave-ado/lib/ado-client.d.ts.map +1 -0
  143. package/dist/plugins/specweave-ado/lib/ado-client.js +272 -0
  144. package/dist/plugins/specweave-ado/lib/ado-client.js.map +1 -0
  145. package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.d.ts +40 -0
  146. package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.d.ts.map +1 -0
  147. package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.js +370 -0
  148. package/dist/plugins/specweave-ado/lib/ado-hierarchical-sync.js.map +1 -0
  149. package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.d.ts +149 -0
  150. package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.d.ts.map +1 -0
  151. package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.js +517 -0
  152. package/dist/plugins/specweave-ado/lib/ado-multi-project-sync.js.map +1 -0
  153. package/dist/plugins/specweave-ado/lib/ado-project-detector.d.ts +72 -0
  154. package/dist/plugins/specweave-ado/lib/ado-project-detector.d.ts.map +1 -0
  155. package/dist/plugins/specweave-ado/lib/ado-project-detector.js +416 -0
  156. package/dist/plugins/specweave-ado/lib/ado-project-detector.js.map +1 -0
  157. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +38 -0
  158. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts.map +1 -0
  159. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js +210 -0
  160. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js.map +1 -0
  161. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts +28 -0
  162. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -0
  163. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +241 -0
  164. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -0
  165. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +100 -0
  166. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -0
  167. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +471 -0
  168. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -0
  169. package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts +99 -0
  170. package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +1 -0
  171. package/dist/plugins/specweave-ado/lib/conflict-resolver.js +331 -0
  172. package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +1 -0
  173. package/dist/plugins/specweave-ado/lib/project-selector.d.ts +42 -0
  174. package/dist/plugins/specweave-ado/lib/project-selector.d.ts.map +1 -0
  175. package/dist/plugins/specweave-ado/lib/project-selector.js +211 -0
  176. package/dist/plugins/specweave-ado/lib/project-selector.js.map +1 -0
  177. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts +12 -0
  178. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.d.ts.map +1 -0
  179. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js +28 -0
  180. package/dist/plugins/specweave-github/lib/cli-sync-increment-changes.js.map +1 -0
  181. package/dist/plugins/specweave-github/lib/github-board-resolver.d.ts +54 -0
  182. package/dist/plugins/specweave-github/lib/github-board-resolver.d.ts.map +1 -0
  183. package/dist/plugins/specweave-github/lib/github-board-resolver.js +122 -0
  184. package/dist/plugins/specweave-github/lib/github-board-resolver.js.map +1 -0
  185. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +104 -0
  186. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -0
  187. package/dist/plugins/specweave-github/lib/github-client-v2.js +408 -0
  188. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -0
  189. package/dist/plugins/specweave-github/lib/github-client.d.ts +96 -0
  190. package/dist/plugins/specweave-github/lib/github-client.d.ts.map +1 -0
  191. package/dist/plugins/specweave-github/lib/github-client.js +299 -0
  192. package/dist/plugins/specweave-github/lib/github-client.js.map +1 -0
  193. package/dist/plugins/specweave-github/lib/github-hierarchical-sync.d.ts +29 -0
  194. package/dist/plugins/specweave-github/lib/github-hierarchical-sync.d.ts.map +1 -0
  195. package/dist/plugins/specweave-github/lib/github-hierarchical-sync.js +268 -0
  196. package/dist/plugins/specweave-github/lib/github-hierarchical-sync.js.map +1 -0
  197. package/dist/plugins/specweave-github/lib/github-issue-updater.d.ts +61 -0
  198. package/dist/plugins/specweave-github/lib/github-issue-updater.d.ts.map +1 -0
  199. package/dist/plugins/specweave-github/lib/github-issue-updater.js +327 -0
  200. package/dist/plugins/specweave-github/lib/github-issue-updater.js.map +1 -0
  201. package/dist/plugins/specweave-github/lib/github-multi-project-sync.d.ts +126 -0
  202. package/dist/plugins/specweave-github/lib/github-multi-project-sync.d.ts.map +1 -0
  203. package/dist/plugins/specweave-github/lib/github-multi-project-sync.js +420 -0
  204. package/dist/plugins/specweave-github/lib/github-multi-project-sync.js.map +1 -0
  205. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +37 -0
  206. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts.map +1 -0
  207. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js +209 -0
  208. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js.map +1 -0
  209. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +28 -0
  210. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -0
  211. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +195 -0
  212. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -0
  213. package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts +108 -0
  214. package/dist/plugins/specweave-github/lib/github-spec-sync.d.ts.map +1 -0
  215. package/dist/plugins/specweave-github/lib/github-spec-sync.js +505 -0
  216. package/dist/plugins/specweave-github/lib/github-spec-sync.js.map +1 -0
  217. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts +36 -0
  218. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.d.ts.map +1 -0
  219. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js +228 -0
  220. package/dist/plugins/specweave-github/lib/github-sync-bidirectional.js.map +1 -0
  221. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts +18 -0
  222. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.d.ts.map +1 -0
  223. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js +287 -0
  224. package/dist/plugins/specweave-github/lib/github-sync-increment-changes.js.map +1 -0
  225. package/dist/plugins/specweave-github/lib/index.d.ts +10 -0
  226. package/dist/plugins/specweave-github/lib/index.d.ts.map +1 -0
  227. package/dist/plugins/specweave-github/lib/index.js +10 -0
  228. package/dist/plugins/specweave-github/lib/index.js.map +1 -0
  229. package/dist/plugins/specweave-github/lib/repo-selector.d.ts +49 -0
  230. package/dist/plugins/specweave-github/lib/repo-selector.d.ts.map +1 -0
  231. package/dist/plugins/specweave-github/lib/repo-selector.js +216 -0
  232. package/dist/plugins/specweave-github/lib/repo-selector.js.map +1 -0
  233. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts +51 -0
  234. package/dist/plugins/specweave-github/lib/subtask-sync.d.ts.map +1 -0
  235. package/dist/plugins/specweave-github/lib/subtask-sync.js +147 -0
  236. package/dist/plugins/specweave-github/lib/subtask-sync.js.map +1 -0
  237. package/dist/plugins/specweave-github/lib/task-parser.d.ts +37 -0
  238. package/dist/plugins/specweave-github/lib/task-parser.d.ts.map +1 -0
  239. package/dist/plugins/specweave-github/lib/task-parser.js +211 -0
  240. package/dist/plugins/specweave-github/lib/task-parser.js.map +1 -0
  241. package/dist/plugins/specweave-github/lib/task-sync.d.ts +51 -0
  242. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -0
  243. package/dist/plugins/specweave-github/lib/task-sync.js +332 -0
  244. package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -0
  245. package/dist/plugins/specweave-github/lib/types.d.ts +80 -0
  246. package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -0
  247. package/dist/plugins/specweave-github/lib/types.js +5 -0
  248. package/dist/plugins/specweave-github/lib/types.js.map +1 -0
  249. package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts +50 -0
  250. package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts.map +1 -0
  251. package/dist/plugins/specweave-jira/lib/jira-board-resolver.js +84 -0
  252. package/dist/plugins/specweave-jira/lib/jira-board-resolver.js.map +1 -0
  253. package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.d.ts +33 -0
  254. package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.d.ts.map +1 -0
  255. package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.js +206 -0
  256. package/dist/plugins/specweave-jira/lib/jira-hierarchical-sync.js.map +1 -0
  257. package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.d.ts +95 -0
  258. package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.d.ts.map +1 -0
  259. package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.js +301 -0
  260. package/dist/plugins/specweave-jira/lib/jira-multi-project-sync.js.map +1 -0
  261. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +43 -0
  262. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -0
  263. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js +282 -0
  264. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -0
  265. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts +33 -0
  266. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts.map +1 -0
  267. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js +294 -0
  268. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js.map +1 -0
  269. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +105 -0
  270. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -0
  271. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +456 -0
  272. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -0
  273. package/dist/plugins/specweave-jira/lib/project-selector.d.ts +42 -0
  274. package/dist/plugins/specweave-jira/lib/project-selector.d.ts.map +1 -0
  275. package/dist/plugins/specweave-jira/lib/project-selector.js +216 -0
  276. package/dist/plugins/specweave-jira/lib/project-selector.js.map +1 -0
  277. package/dist/plugins/specweave-jira/lib/reorganization-detector.d.ts +67 -0
  278. package/dist/plugins/specweave-jira/lib/reorganization-detector.d.ts.map +1 -0
  279. package/dist/plugins/specweave-jira/lib/reorganization-detector.js +252 -0
  280. package/dist/plugins/specweave-jira/lib/reorganization-detector.js.map +1 -0
  281. package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts +29 -0
  282. package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts.map +1 -0
  283. package/dist/plugins/specweave-jira/lib/setup-wizard.js +219 -0
  284. package/dist/plugins/specweave-jira/lib/setup-wizard.js.map +1 -0
  285. package/dist/plugins/specweave-release/lib/dashboard-generator.d.ts +23 -0
  286. package/dist/plugins/specweave-release/lib/dashboard-generator.d.ts.map +1 -0
  287. package/dist/plugins/specweave-release/lib/dashboard-generator.js +258 -0
  288. package/dist/plugins/specweave-release/lib/dashboard-generator.js.map +1 -0
  289. package/dist/plugins/specweave-release/lib/dora-tracker.d.ts +82 -0
  290. package/dist/plugins/specweave-release/lib/dora-tracker.d.ts.map +1 -0
  291. package/dist/plugins/specweave-release/lib/dora-tracker.js +279 -0
  292. package/dist/plugins/specweave-release/lib/dora-tracker.js.map +1 -0
  293. package/dist/project-mapper.js +272 -0
  294. package/dist/scripts/split-spec-by-project.js +105 -0
  295. package/dist/spec-splitter.js +283 -0
  296. package/dist/src/adapters/adapter-base.d.ts +71 -0
  297. package/dist/src/adapters/adapter-base.d.ts.map +1 -0
  298. package/dist/src/adapters/adapter-base.js +139 -0
  299. package/dist/src/adapters/adapter-base.js.map +1 -0
  300. package/dist/src/adapters/adapter-interface.d.ts +149 -0
  301. package/dist/src/adapters/adapter-interface.d.ts.map +1 -0
  302. package/dist/src/adapters/adapter-interface.js +8 -0
  303. package/dist/src/adapters/adapter-interface.js.map +1 -0
  304. package/dist/src/adapters/adapter-loader.d.ts +91 -0
  305. package/dist/src/adapters/adapter-loader.d.ts.map +1 -0
  306. package/dist/src/adapters/adapter-loader.js +238 -0
  307. package/dist/src/adapters/adapter-loader.js.map +1 -0
  308. package/dist/src/adapters/agents-md-generator.d.ts +48 -0
  309. package/dist/src/adapters/agents-md-generator.d.ts.map +1 -0
  310. package/dist/src/adapters/agents-md-generator.js +193 -0
  311. package/dist/src/adapters/agents-md-generator.js.map +1 -0
  312. package/dist/src/adapters/claude/adapter.d.ts +128 -0
  313. package/dist/src/adapters/claude/adapter.d.ts.map +1 -0
  314. package/dist/src/adapters/claude/adapter.js +415 -0
  315. package/dist/src/adapters/claude/adapter.js.map +1 -0
  316. package/dist/src/adapters/claude-md-generator.d.ts +78 -0
  317. package/dist/src/adapters/claude-md-generator.d.ts.map +1 -0
  318. package/dist/src/adapters/claude-md-generator.js +307 -0
  319. package/dist/src/adapters/claude-md-generator.js.map +1 -0
  320. package/dist/src/adapters/codex/adapter.d.ts +50 -0
  321. package/dist/src/adapters/codex/adapter.d.ts.map +1 -0
  322. package/dist/src/adapters/codex/adapter.js +316 -0
  323. package/dist/src/adapters/codex/adapter.js.map +1 -0
  324. package/dist/src/adapters/cursor/adapter.d.ts +98 -0
  325. package/dist/src/adapters/cursor/adapter.d.ts.map +1 -0
  326. package/dist/src/adapters/cursor/adapter.js +406 -0
  327. package/dist/src/adapters/cursor/adapter.js.map +1 -0
  328. package/dist/src/adapters/doc-generator.d.ts +69 -0
  329. package/dist/src/adapters/doc-generator.d.ts.map +1 -0
  330. package/dist/src/adapters/doc-generator.js +247 -0
  331. package/dist/src/adapters/doc-generator.js.map +1 -0
  332. package/dist/src/adapters/gemini/adapter.d.ts +50 -0
  333. package/dist/src/adapters/gemini/adapter.d.ts.map +1 -0
  334. package/dist/src/adapters/gemini/adapter.js +281 -0
  335. package/dist/src/adapters/gemini/adapter.js.map +1 -0
  336. package/dist/src/adapters/generic/adapter.d.ts +86 -0
  337. package/dist/src/adapters/generic/adapter.d.ts.map +1 -0
  338. package/dist/src/adapters/generic/adapter.js +338 -0
  339. package/dist/src/adapters/generic/adapter.js.map +1 -0
  340. package/dist/src/cli/commands/abandon.d.ts +13 -0
  341. package/dist/src/cli/commands/abandon.d.ts.map +1 -0
  342. package/dist/src/cli/commands/abandon.js +15 -0
  343. package/dist/src/cli/commands/abandon.js.map +1 -0
  344. package/dist/src/cli/commands/check-discipline.d.ts +16 -0
  345. package/dist/src/cli/commands/check-discipline.d.ts.map +1 -0
  346. package/dist/src/cli/commands/check-discipline.js +79 -0
  347. package/dist/src/cli/commands/check-discipline.js.map +1 -0
  348. package/dist/src/cli/commands/import-docs.d.ts +21 -0
  349. package/dist/src/cli/commands/import-docs.d.ts.map +1 -0
  350. package/dist/src/cli/commands/import-docs.js +146 -0
  351. package/dist/src/cli/commands/import-docs.js.map +1 -0
  352. package/dist/src/cli/commands/init-multiproject.d.ts +11 -0
  353. package/dist/src/cli/commands/init-multiproject.d.ts.map +1 -0
  354. package/dist/src/cli/commands/init-multiproject.js +202 -0
  355. package/dist/src/cli/commands/init-multiproject.js.map +1 -0
  356. package/dist/src/cli/commands/init.d.ts +10 -0
  357. package/dist/src/cli/commands/init.d.ts.map +1 -0
  358. package/dist/src/cli/commands/init.js +1328 -0
  359. package/dist/src/cli/commands/init.js.map +1 -0
  360. package/dist/src/cli/commands/install.d.ts +9 -0
  361. package/dist/src/cli/commands/install.d.ts.map +1 -0
  362. package/dist/src/cli/commands/install.js +127 -0
  363. package/dist/src/cli/commands/install.js.map +1 -0
  364. package/dist/src/cli/commands/list.d.ts +8 -0
  365. package/dist/src/cli/commands/list.d.ts.map +1 -0
  366. package/dist/src/cli/commands/list.js +119 -0
  367. package/dist/src/cli/commands/list.js.map +1 -0
  368. package/dist/src/cli/commands/migrate-to-multiproject.d.ts +37 -0
  369. package/dist/src/cli/commands/migrate-to-multiproject.d.ts.map +1 -0
  370. package/dist/src/cli/commands/migrate-to-multiproject.js +189 -0
  371. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -0
  372. package/dist/src/cli/commands/migrate-to-profiles.d.ts +57 -0
  373. package/dist/src/cli/commands/migrate-to-profiles.d.ts.map +1 -0
  374. package/dist/src/cli/commands/migrate-to-profiles.js +350 -0
  375. package/dist/src/cli/commands/migrate-to-profiles.js.map +1 -0
  376. package/dist/src/cli/commands/pause.d.ts +13 -0
  377. package/dist/src/cli/commands/pause.d.ts.map +1 -0
  378. package/dist/src/cli/commands/pause.js +15 -0
  379. package/dist/src/cli/commands/pause.js.map +1 -0
  380. package/dist/src/cli/commands/qa.d.ts +54 -0
  381. package/dist/src/cli/commands/qa.d.ts.map +1 -0
  382. package/dist/src/cli/commands/qa.js +98 -0
  383. package/dist/src/cli/commands/qa.js.map +1 -0
  384. package/dist/src/cli/commands/resume.d.ts +12 -0
  385. package/dist/src/cli/commands/resume.d.ts.map +1 -0
  386. package/dist/src/cli/commands/resume.js +14 -0
  387. package/dist/src/cli/commands/resume.js.map +1 -0
  388. package/dist/src/cli/commands/revert-wip-limit.d.ts +8 -0
  389. package/dist/src/cli/commands/revert-wip-limit.d.ts.map +1 -0
  390. package/dist/src/cli/commands/revert-wip-limit.js +61 -0
  391. package/dist/src/cli/commands/revert-wip-limit.js.map +1 -0
  392. package/dist/src/cli/commands/status-line.d.ts +14 -0
  393. package/dist/src/cli/commands/status-line.d.ts.map +1 -0
  394. package/dist/src/cli/commands/status-line.js +75 -0
  395. package/dist/src/cli/commands/status-line.js.map +1 -0
  396. package/dist/src/cli/commands/status.d.ts +12 -0
  397. package/dist/src/cli/commands/status.d.ts.map +1 -0
  398. package/dist/src/cli/commands/status.js +23 -0
  399. package/dist/src/cli/commands/status.js.map +1 -0
  400. package/dist/src/cli/commands/switch-project.d.ts +13 -0
  401. package/dist/src/cli/commands/switch-project.d.ts.map +1 -0
  402. package/dist/src/cli/commands/switch-project.js +91 -0
  403. package/dist/src/cli/commands/switch-project.js.map +1 -0
  404. package/dist/src/cli/commands/sync-spec-commits.d.ts +9 -0
  405. package/dist/src/cli/commands/sync-spec-commits.d.ts.map +1 -0
  406. package/dist/src/cli/commands/sync-spec-commits.js +186 -0
  407. package/dist/src/cli/commands/sync-spec-commits.js.map +1 -0
  408. package/dist/src/cli/commands/sync-spec-content.d.ts +13 -0
  409. package/dist/src/cli/commands/sync-spec-content.d.ts.map +1 -0
  410. package/dist/src/cli/commands/sync-spec-content.js +223 -0
  411. package/dist/src/cli/commands/sync-spec-content.js.map +1 -0
  412. package/dist/src/cli/commands/validate-jira.d.ts +35 -0
  413. package/dist/src/cli/commands/validate-jira.d.ts.map +1 -0
  414. package/dist/src/cli/commands/validate-jira.js +112 -0
  415. package/dist/src/cli/commands/validate-jira.js.map +1 -0
  416. package/dist/src/cli/commands/validate-plugins.d.ts +41 -0
  417. package/dist/src/cli/commands/validate-plugins.d.ts.map +1 -0
  418. package/dist/src/cli/commands/validate-plugins.js +171 -0
  419. package/dist/src/cli/commands/validate-plugins.js.map +1 -0
  420. package/dist/src/cli/helpers/github/increment-profile-selector.d.ts +47 -0
  421. package/dist/src/cli/helpers/github/increment-profile-selector.d.ts.map +1 -0
  422. package/dist/src/cli/helpers/github/increment-profile-selector.js +186 -0
  423. package/dist/src/cli/helpers/github/increment-profile-selector.js.map +1 -0
  424. package/dist/src/cli/helpers/github/profile-manager.d.ts +119 -0
  425. package/dist/src/cli/helpers/github/profile-manager.d.ts.map +1 -0
  426. package/dist/src/cli/helpers/github/profile-manager.js +311 -0
  427. package/dist/src/cli/helpers/github/profile-manager.js.map +1 -0
  428. package/dist/src/cli/helpers/issue-tracker/ado.d.ts +57 -0
  429. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -0
  430. package/dist/src/cli/helpers/issue-tracker/ado.js +248 -0
  431. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -0
  432. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +86 -0
  433. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -0
  434. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +417 -0
  435. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -0
  436. package/dist/src/cli/helpers/issue-tracker/github.d.ts +80 -0
  437. package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -0
  438. package/dist/src/cli/helpers/issue-tracker/github.js +324 -0
  439. package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -0
  440. package/dist/src/cli/helpers/issue-tracker/index.d.ts +22 -0
  441. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -0
  442. package/dist/src/cli/helpers/issue-tracker/index.js +575 -0
  443. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -0
  444. package/dist/src/cli/helpers/issue-tracker/jira.d.ts +61 -0
  445. package/dist/src/cli/helpers/issue-tracker/jira.d.ts.map +1 -0
  446. package/dist/src/cli/helpers/issue-tracker/jira.js +409 -0
  447. package/dist/src/cli/helpers/issue-tracker/jira.js.map +1 -0
  448. package/dist/src/cli/helpers/issue-tracker/types.d.ts +108 -0
  449. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -0
  450. package/dist/src/cli/helpers/issue-tracker/types.js +16 -0
  451. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -0
  452. package/dist/src/cli/helpers/issue-tracker/utils.d.ts +120 -0
  453. package/dist/src/cli/helpers/issue-tracker/utils.d.ts.map +1 -0
  454. package/dist/src/cli/helpers/issue-tracker/utils.js +293 -0
  455. package/dist/src/cli/helpers/issue-tracker/utils.js.map +1 -0
  456. package/dist/src/core/agent-model-manager.d.ts +52 -0
  457. package/dist/src/core/agent-model-manager.d.ts.map +1 -0
  458. package/dist/src/core/agent-model-manager.js +120 -0
  459. package/dist/src/core/agent-model-manager.js.map +1 -0
  460. package/dist/src/core/brownfield/analyzer.d.ts +86 -0
  461. package/dist/src/core/brownfield/analyzer.d.ts.map +1 -0
  462. package/dist/src/core/brownfield/analyzer.js +365 -0
  463. package/dist/src/core/brownfield/analyzer.js.map +1 -0
  464. package/dist/src/core/brownfield/importer.d.ts +76 -0
  465. package/dist/src/core/brownfield/importer.d.ts.map +1 -0
  466. package/dist/src/core/brownfield/importer.js +287 -0
  467. package/dist/src/core/brownfield/importer.js.map +1 -0
  468. package/dist/src/core/comment-builder.d.ts +57 -0
  469. package/dist/src/core/comment-builder.d.ts.map +1 -0
  470. package/dist/src/core/comment-builder.js +239 -0
  471. package/dist/src/core/comment-builder.js.map +1 -0
  472. package/dist/src/core/config-manager.d.ts +47 -0
  473. package/dist/src/core/config-manager.d.ts.map +1 -0
  474. package/dist/src/core/config-manager.js +136 -0
  475. package/dist/src/core/config-manager.js.map +1 -0
  476. package/dist/src/core/cost-tracker.d.ts +108 -0
  477. package/dist/src/core/cost-tracker.d.ts.map +1 -0
  478. package/dist/src/core/cost-tracker.js +281 -0
  479. package/dist/src/core/cost-tracker.js.map +1 -0
  480. package/dist/src/core/credentials-manager.d.ts +107 -0
  481. package/dist/src/core/credentials-manager.d.ts.map +1 -0
  482. package/dist/src/core/credentials-manager.js +457 -0
  483. package/dist/src/core/credentials-manager.js.map +1 -0
  484. package/dist/src/core/i18n/language-detector.d.ts +29 -0
  485. package/dist/src/core/i18n/language-detector.d.ts.map +1 -0
  486. package/dist/src/core/i18n/language-detector.js +143 -0
  487. package/dist/src/core/i18n/language-detector.js.map +1 -0
  488. package/dist/src/core/i18n/language-manager.d.ts +101 -0
  489. package/dist/src/core/i18n/language-manager.d.ts.map +1 -0
  490. package/dist/src/core/i18n/language-manager.js +232 -0
  491. package/dist/src/core/i18n/language-manager.js.map +1 -0
  492. package/dist/src/core/i18n/language-registry.d.ts +44 -0
  493. package/dist/src/core/i18n/language-registry.d.ts.map +1 -0
  494. package/dist/src/core/i18n/language-registry.js +234 -0
  495. package/dist/src/core/i18n/language-registry.js.map +1 -0
  496. package/dist/src/core/i18n/locale-manager.d.ts +62 -0
  497. package/dist/src/core/i18n/locale-manager.d.ts.map +1 -0
  498. package/dist/src/core/i18n/locale-manager.js +137 -0
  499. package/dist/src/core/i18n/locale-manager.js.map +1 -0
  500. package/dist/src/core/i18n/system-prompt-injector.d.ts +33 -0
  501. package/dist/src/core/i18n/system-prompt-injector.d.ts.map +1 -0
  502. package/dist/src/core/i18n/system-prompt-injector.js +131 -0
  503. package/dist/src/core/i18n/system-prompt-injector.js.map +1 -0
  504. package/dist/src/core/i18n/types.d.ts +151 -0
  505. package/dist/src/core/i18n/types.d.ts.map +1 -0
  506. package/dist/src/core/i18n/types.js +11 -0
  507. package/dist/src/core/i18n/types.js.map +1 -0
  508. package/dist/src/core/increment/active-increment-manager.d.ts +79 -0
  509. package/dist/src/core/increment/active-increment-manager.d.ts.map +1 -0
  510. package/dist/src/core/increment/active-increment-manager.js +153 -0
  511. package/dist/src/core/increment/active-increment-manager.js.map +1 -0
  512. package/dist/src/core/increment/discipline-checker.d.ts +60 -0
  513. package/dist/src/core/increment/discipline-checker.d.ts.map +1 -0
  514. package/dist/src/core/increment/discipline-checker.js +274 -0
  515. package/dist/src/core/increment/discipline-checker.js.map +1 -0
  516. package/dist/src/core/increment/limits.d.ts +68 -0
  517. package/dist/src/core/increment/limits.d.ts.map +1 -0
  518. package/dist/src/core/increment/limits.js +224 -0
  519. package/dist/src/core/increment/limits.js.map +1 -0
  520. package/dist/src/core/increment/metadata-manager.d.ts +116 -0
  521. package/dist/src/core/increment/metadata-manager.d.ts.map +1 -0
  522. package/dist/{core → src/core}/increment/metadata-manager.js +6 -0
  523. package/dist/src/core/increment/metadata-manager.js.map +1 -0
  524. package/dist/src/core/increment/metadata-validator.d.ts +33 -0
  525. package/dist/src/core/increment/metadata-validator.d.ts.map +1 -0
  526. package/dist/src/core/increment/metadata-validator.js +147 -0
  527. package/dist/src/core/increment/metadata-validator.js.map +1 -0
  528. package/dist/src/core/increment/status-commands.d.ts +43 -0
  529. package/dist/src/core/increment/status-commands.d.ts.map +1 -0
  530. package/dist/src/core/increment/status-commands.js +277 -0
  531. package/dist/src/core/increment/status-commands.js.map +1 -0
  532. package/dist/src/core/increment/types.d.ts +88 -0
  533. package/dist/src/core/increment/types.d.ts.map +1 -0
  534. package/dist/src/core/increment/types.js +8 -0
  535. package/dist/src/core/increment/types.js.map +1 -0
  536. package/dist/src/core/increment-status.d.ts +72 -0
  537. package/dist/src/core/increment-status.d.ts.map +1 -0
  538. package/dist/src/core/increment-status.js +227 -0
  539. package/dist/src/core/increment-status.js.map +1 -0
  540. package/dist/src/core/model-selector.d.ts +57 -0
  541. package/dist/src/core/model-selector.d.ts.map +1 -0
  542. package/dist/src/core/model-selector.js +115 -0
  543. package/dist/src/core/model-selector.js.map +1 -0
  544. package/dist/src/core/phase-detector.d.ts +62 -0
  545. package/dist/src/core/phase-detector.d.ts.map +1 -0
  546. package/dist/src/core/phase-detector.js +229 -0
  547. package/dist/src/core/phase-detector.js.map +1 -0
  548. package/dist/src/core/plugin-loader.d.ts +131 -0
  549. package/dist/src/core/plugin-loader.d.ts.map +1 -0
  550. package/dist/src/core/plugin-loader.js +421 -0
  551. package/dist/src/core/plugin-loader.js.map +1 -0
  552. package/dist/src/core/project-manager.d.ts +122 -0
  553. package/dist/src/core/project-manager.d.ts.map +1 -0
  554. package/dist/src/core/project-manager.js +539 -0
  555. package/dist/src/core/project-manager.js.map +1 -0
  556. package/dist/src/core/project-structure-detector.d.ts +92 -0
  557. package/dist/src/core/project-structure-detector.d.ts.map +1 -0
  558. package/dist/src/core/project-structure-detector.js +289 -0
  559. package/dist/src/core/project-structure-detector.js.map +1 -0
  560. package/dist/src/core/qa/qa-runner.d.ts +16 -0
  561. package/dist/src/core/qa/qa-runner.d.ts.map +1 -0
  562. package/dist/src/core/qa/qa-runner.js +422 -0
  563. package/dist/src/core/qa/qa-runner.js.map +1 -0
  564. package/dist/src/core/qa/quality-gate-decider.d.ts +53 -0
  565. package/dist/src/core/qa/quality-gate-decider.d.ts.map +1 -0
  566. package/dist/src/core/qa/quality-gate-decider.js +268 -0
  567. package/dist/src/core/qa/quality-gate-decider.js.map +1 -0
  568. package/dist/src/core/qa/risk-calculator.d.ts +126 -0
  569. package/dist/src/core/qa/risk-calculator.d.ts.map +1 -0
  570. package/dist/src/core/qa/risk-calculator.js +247 -0
  571. package/dist/src/core/qa/risk-calculator.js.map +1 -0
  572. package/dist/src/core/qa/types.d.ts +315 -0
  573. package/dist/src/core/qa/types.d.ts.map +1 -0
  574. package/dist/src/core/qa/types.js +8 -0
  575. package/dist/src/core/qa/types.js.map +1 -0
  576. package/dist/src/core/repo-structure/github-validator.d.ts +75 -0
  577. package/dist/src/core/repo-structure/github-validator.d.ts.map +1 -0
  578. package/dist/src/core/repo-structure/github-validator.js +166 -0
  579. package/dist/src/core/repo-structure/github-validator.js.map +1 -0
  580. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +70 -0
  581. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -0
  582. package/dist/src/core/repo-structure/prompt-consolidator.js +180 -0
  583. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -0
  584. package/dist/src/core/repo-structure/repo-id-generator.d.ts +79 -0
  585. package/dist/src/core/repo-structure/repo-id-generator.d.ts.map +1 -0
  586. package/dist/src/core/repo-structure/repo-id-generator.js +135 -0
  587. package/dist/src/core/repo-structure/repo-id-generator.js.map +1 -0
  588. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +105 -0
  589. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -0
  590. package/dist/src/core/repo-structure/repo-structure-manager.js +878 -0
  591. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -0
  592. package/dist/src/core/repo-structure/setup-state-manager.d.ts +132 -0
  593. package/dist/src/core/repo-structure/setup-state-manager.d.ts.map +1 -0
  594. package/dist/src/core/repo-structure/setup-state-manager.js +259 -0
  595. package/dist/src/core/repo-structure/setup-state-manager.js.map +1 -0
  596. package/dist/src/core/repo-structure/setup-summary.d.ts +36 -0
  597. package/dist/src/core/repo-structure/setup-summary.d.ts.map +1 -0
  598. package/dist/src/core/repo-structure/setup-summary.js +190 -0
  599. package/dist/src/core/repo-structure/setup-summary.js.map +1 -0
  600. package/dist/src/core/rfc-generator-v2.d.ts +149 -0
  601. package/dist/src/core/rfc-generator-v2.d.ts.map +1 -0
  602. package/dist/src/core/rfc-generator-v2.js +399 -0
  603. package/dist/src/core/rfc-generator-v2.js.map +1 -0
  604. package/dist/src/core/spec-content-sync.d.ts +78 -0
  605. package/dist/src/core/spec-content-sync.d.ts.map +1 -0
  606. package/dist/src/core/spec-content-sync.js +222 -0
  607. package/dist/src/core/spec-content-sync.js.map +1 -0
  608. package/dist/src/core/spec-task-mapper.d.ts +71 -0
  609. package/dist/src/core/spec-task-mapper.d.ts.map +1 -0
  610. package/dist/src/core/spec-task-mapper.js +208 -0
  611. package/dist/src/core/spec-task-mapper.js.map +1 -0
  612. package/dist/src/core/specs/spec-metadata-manager.d.ts +72 -0
  613. package/dist/src/core/specs/spec-metadata-manager.d.ts.map +1 -0
  614. package/dist/src/core/specs/spec-metadata-manager.js +364 -0
  615. package/dist/src/core/specs/spec-metadata-manager.js.map +1 -0
  616. package/dist/src/core/specs/spec-parser.d.ts +66 -0
  617. package/dist/src/core/specs/spec-parser.d.ts.map +1 -0
  618. package/dist/src/core/specs/spec-parser.js +276 -0
  619. package/dist/src/core/specs/spec-parser.js.map +1 -0
  620. package/dist/src/core/status-line/status-line-manager.d.ts +62 -0
  621. package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -0
  622. package/dist/src/core/status-line/status-line-manager.js +169 -0
  623. package/dist/src/core/status-line/status-line-manager.js.map +1 -0
  624. package/dist/src/core/status-line/types.d.ts +50 -0
  625. package/dist/src/core/status-line/types.d.ts.map +1 -0
  626. package/dist/src/core/status-line/types.js +17 -0
  627. package/dist/src/core/status-line/types.js.map +1 -0
  628. package/dist/src/core/sync/bidirectional-engine.d.ts +110 -0
  629. package/dist/src/core/sync/bidirectional-engine.d.ts.map +1 -0
  630. package/dist/src/core/sync/bidirectional-engine.js +356 -0
  631. package/dist/src/core/sync/bidirectional-engine.js.map +1 -0
  632. package/dist/src/core/sync/folder-mapper.d.ts +71 -0
  633. package/dist/src/core/sync/folder-mapper.d.ts.map +1 -0
  634. package/dist/src/core/sync/folder-mapper.js +203 -0
  635. package/dist/src/core/sync/folder-mapper.js.map +1 -0
  636. package/dist/src/core/sync/profile-manager.d.ts +72 -0
  637. package/dist/src/core/sync/profile-manager.d.ts.map +1 -0
  638. package/dist/src/core/sync/profile-manager.js +338 -0
  639. package/dist/src/core/sync/profile-manager.js.map +1 -0
  640. package/dist/src/core/sync/profile-selector.d.ts +52 -0
  641. package/dist/src/core/sync/profile-selector.d.ts.map +1 -0
  642. package/dist/src/core/sync/profile-selector.js +179 -0
  643. package/dist/src/core/sync/profile-selector.js.map +1 -0
  644. package/dist/src/core/sync/profile-validator.d.ts +52 -0
  645. package/dist/src/core/sync/profile-validator.d.ts.map +1 -0
  646. package/dist/src/core/sync/profile-validator.js +170 -0
  647. package/dist/src/core/sync/profile-validator.js.map +1 -0
  648. package/dist/src/core/sync/project-context.d.ts +81 -0
  649. package/dist/src/core/sync/project-context.d.ts.map +1 -0
  650. package/dist/src/core/sync/project-context.js +354 -0
  651. package/dist/src/core/sync/project-context.js.map +1 -0
  652. package/dist/src/core/sync/rate-limiter.d.ts +116 -0
  653. package/dist/src/core/sync/rate-limiter.d.ts.map +1 -0
  654. package/dist/src/core/sync/rate-limiter.js +308 -0
  655. package/dist/src/core/sync/rate-limiter.js.map +1 -0
  656. package/dist/src/core/sync/time-range-selector.d.ts +48 -0
  657. package/dist/src/core/sync/time-range-selector.d.ts.map +1 -0
  658. package/dist/src/core/sync/time-range-selector.js +224 -0
  659. package/dist/src/core/sync/time-range-selector.js.map +1 -0
  660. package/dist/src/core/types/config.d.ts +90 -0
  661. package/dist/src/core/types/config.d.ts.map +1 -0
  662. package/dist/src/core/types/config.js +44 -0
  663. package/dist/src/core/types/config.js.map +1 -0
  664. package/dist/src/core/types/increment-metadata.d.ts +120 -0
  665. package/dist/src/core/types/increment-metadata.d.ts.map +1 -0
  666. package/dist/src/core/types/increment-metadata.js +138 -0
  667. package/dist/src/core/types/increment-metadata.js.map +1 -0
  668. package/dist/src/core/types/plugin.d.ts +283 -0
  669. package/dist/src/core/types/plugin.d.ts.map +1 -0
  670. package/dist/src/core/types/plugin.js +49 -0
  671. package/dist/src/core/types/plugin.js.map +1 -0
  672. package/dist/src/core/types/spec-metadata.d.ts +229 -0
  673. package/dist/src/core/types/spec-metadata.d.ts.map +1 -0
  674. package/dist/src/core/types/spec-metadata.js +14 -0
  675. package/dist/src/core/types/spec-metadata.js.map +1 -0
  676. package/dist/src/core/types/sync-profile.d.ts +349 -0
  677. package/dist/src/core/types/sync-profile.d.ts.map +1 -0
  678. package/dist/src/core/types/sync-profile.js +79 -0
  679. package/dist/src/core/types/sync-profile.js.map +1 -0
  680. package/dist/src/hooks/lib/git-diff-analyzer.d.ts +89 -0
  681. package/dist/src/hooks/lib/git-diff-analyzer.d.ts.map +1 -0
  682. package/dist/src/hooks/lib/git-diff-analyzer.js +226 -0
  683. package/dist/src/hooks/lib/git-diff-analyzer.js.map +1 -0
  684. package/dist/src/hooks/lib/invoke-translator-skill.d.ts +60 -0
  685. package/dist/src/hooks/lib/invoke-translator-skill.d.ts.map +1 -0
  686. package/dist/src/hooks/lib/invoke-translator-skill.js +201 -0
  687. package/dist/src/hooks/lib/invoke-translator-skill.js.map +1 -0
  688. package/dist/src/hooks/lib/prepare-reflection-context.d.ts +42 -0
  689. package/dist/src/hooks/lib/prepare-reflection-context.d.ts.map +1 -0
  690. package/dist/src/hooks/lib/prepare-reflection-context.js +123 -0
  691. package/dist/src/hooks/lib/prepare-reflection-context.js.map +1 -0
  692. package/dist/src/hooks/lib/reflection-config-loader.d.ts +45 -0
  693. package/dist/src/hooks/lib/reflection-config-loader.d.ts.map +1 -0
  694. package/dist/src/hooks/lib/reflection-config-loader.js +132 -0
  695. package/dist/src/hooks/lib/reflection-config-loader.js.map +1 -0
  696. package/dist/src/hooks/lib/reflection-parser.d.ts +33 -0
  697. package/dist/src/hooks/lib/reflection-parser.d.ts.map +1 -0
  698. package/dist/src/hooks/lib/reflection-parser.js +419 -0
  699. package/dist/src/hooks/lib/reflection-parser.js.map +1 -0
  700. package/dist/src/hooks/lib/reflection-prompt-builder.d.ts +56 -0
  701. package/dist/src/hooks/lib/reflection-prompt-builder.d.ts.map +1 -0
  702. package/dist/src/hooks/lib/reflection-prompt-builder.js +239 -0
  703. package/dist/src/hooks/lib/reflection-prompt-builder.js.map +1 -0
  704. package/dist/src/hooks/lib/reflection-storage.d.ts +64 -0
  705. package/dist/src/hooks/lib/reflection-storage.d.ts.map +1 -0
  706. package/dist/src/hooks/lib/reflection-storage.js +305 -0
  707. package/dist/src/hooks/lib/reflection-storage.js.map +1 -0
  708. package/dist/src/hooks/lib/run-self-reflection.d.ts +43 -0
  709. package/dist/src/hooks/lib/run-self-reflection.d.ts.map +1 -0
  710. package/dist/src/hooks/lib/run-self-reflection.js +203 -0
  711. package/dist/src/hooks/lib/run-self-reflection.js.map +1 -0
  712. package/dist/src/hooks/lib/sync-living-docs.d.ts +27 -0
  713. package/dist/src/hooks/lib/sync-living-docs.d.ts.map +1 -0
  714. package/dist/src/hooks/lib/sync-living-docs.js +116 -0
  715. package/dist/src/hooks/lib/sync-living-docs.js.map +1 -0
  716. package/dist/src/hooks/lib/translate-file.d.ts +59 -0
  717. package/dist/src/hooks/lib/translate-file.d.ts.map +1 -0
  718. package/dist/src/hooks/lib/translate-file.js +350 -0
  719. package/dist/src/hooks/lib/translate-file.js.map +1 -0
  720. package/dist/src/hooks/lib/translate-living-docs.d.ts +13 -0
  721. package/dist/src/hooks/lib/translate-living-docs.d.ts.map +1 -0
  722. package/dist/src/hooks/lib/translate-living-docs.js +175 -0
  723. package/dist/src/hooks/lib/translate-living-docs.js.map +1 -0
  724. package/dist/src/hooks/lib/types/reflection-types.d.ts +164 -0
  725. package/dist/src/hooks/lib/types/reflection-types.d.ts.map +1 -0
  726. package/dist/src/hooks/lib/types/reflection-types.js +73 -0
  727. package/dist/src/hooks/lib/types/reflection-types.js.map +1 -0
  728. package/dist/src/hooks/lib/update-tasks-md.d.ts +29 -0
  729. package/dist/src/hooks/lib/update-tasks-md.d.ts.map +1 -0
  730. package/dist/src/hooks/lib/update-tasks-md.js +203 -0
  731. package/dist/src/hooks/lib/update-tasks-md.js.map +1 -0
  732. package/dist/src/integrations/ado/ado-client.d.ts +127 -0
  733. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -0
  734. package/dist/src/integrations/ado/ado-client.js +416 -0
  735. package/dist/src/integrations/ado/ado-client.js.map +1 -0
  736. package/dist/src/integrations/jira/jira-client.d.ts +139 -0
  737. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -0
  738. package/dist/src/integrations/jira/jira-client.js +386 -0
  739. package/dist/src/integrations/jira/jira-client.js.map +1 -0
  740. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts +75 -0
  741. package/dist/src/integrations/jira/jira-incremental-mapper.d.ts.map +1 -0
  742. package/dist/src/integrations/jira/jira-incremental-mapper.js +474 -0
  743. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -0
  744. package/dist/src/integrations/jira/jira-mapper.d.ts +105 -0
  745. package/dist/src/integrations/jira/jira-mapper.d.ts.map +1 -0
  746. package/dist/src/integrations/jira/jira-mapper.js +494 -0
  747. package/dist/src/integrations/jira/jira-mapper.js.map +1 -0
  748. package/dist/src/metrics/calculators/change-failure-rate.d.ts +22 -0
  749. package/dist/src/metrics/calculators/change-failure-rate.d.ts.map +1 -0
  750. package/dist/src/metrics/calculators/change-failure-rate.js +70 -0
  751. package/dist/src/metrics/calculators/change-failure-rate.js.map +1 -0
  752. package/dist/src/metrics/calculators/deployment-frequency.d.ts +20 -0
  753. package/dist/src/metrics/calculators/deployment-frequency.d.ts.map +1 -0
  754. package/dist/src/metrics/calculators/deployment-frequency.js +61 -0
  755. package/dist/src/metrics/calculators/deployment-frequency.js.map +1 -0
  756. package/dist/src/metrics/calculators/lead-time.d.ts +22 -0
  757. package/dist/src/metrics/calculators/lead-time.d.ts.map +1 -0
  758. package/dist/src/metrics/calculators/lead-time.js +82 -0
  759. package/dist/src/metrics/calculators/lead-time.js.map +1 -0
  760. package/dist/src/metrics/calculators/mttr.d.ts +21 -0
  761. package/dist/src/metrics/calculators/mttr.d.ts.map +1 -0
  762. package/dist/src/metrics/calculators/mttr.js +60 -0
  763. package/dist/src/metrics/calculators/mttr.js.map +1 -0
  764. package/dist/src/metrics/dora-calculator.d.ts +28 -0
  765. package/dist/src/metrics/dora-calculator.d.ts.map +1 -0
  766. package/dist/src/metrics/dora-calculator.js +117 -0
  767. package/dist/src/metrics/dora-calculator.js.map +1 -0
  768. package/dist/src/metrics/github-client.d.ts +51 -0
  769. package/dist/src/metrics/github-client.d.ts.map +1 -0
  770. package/dist/src/metrics/github-client.js +133 -0
  771. package/dist/src/metrics/github-client.js.map +1 -0
  772. package/dist/src/metrics/report-generator.d.ts +17 -0
  773. package/dist/src/metrics/report-generator.d.ts.map +1 -0
  774. package/dist/src/metrics/report-generator.js +403 -0
  775. package/dist/src/metrics/report-generator.js.map +1 -0
  776. package/dist/src/metrics/types.d.ts +112 -0
  777. package/dist/src/metrics/types.d.ts.map +1 -0
  778. package/dist/src/metrics/types.js +10 -0
  779. package/dist/src/metrics/types.js.map +1 -0
  780. package/dist/src/metrics/utils/percentile.d.ts +25 -0
  781. package/dist/src/metrics/utils/percentile.d.ts.map +1 -0
  782. package/dist/src/metrics/utils/percentile.js +46 -0
  783. package/dist/src/metrics/utils/percentile.js.map +1 -0
  784. package/dist/src/metrics/utils/tier-classifier.d.ts +61 -0
  785. package/dist/src/metrics/utils/tier-classifier.d.ts.map +1 -0
  786. package/dist/src/metrics/utils/tier-classifier.js +100 -0
  787. package/dist/src/metrics/utils/tier-classifier.js.map +1 -0
  788. package/dist/src/testing/test-generator.d.ts +117 -0
  789. package/dist/src/testing/test-generator.d.ts.map +1 -0
  790. package/dist/src/testing/test-generator.js +370 -0
  791. package/dist/src/testing/test-generator.js.map +1 -0
  792. package/dist/src/types/cost-tracking.d.ts +43 -0
  793. package/dist/src/types/cost-tracking.d.ts.map +1 -0
  794. package/dist/src/types/cost-tracking.js +8 -0
  795. package/dist/src/types/cost-tracking.js.map +1 -0
  796. package/dist/src/types/model-selection.d.ts +53 -0
  797. package/dist/src/types/model-selection.d.ts.map +1 -0
  798. package/dist/src/types/model-selection.js +12 -0
  799. package/dist/src/types/model-selection.js.map +1 -0
  800. package/dist/src/utils/agents-md-compiler.d.ts +68 -0
  801. package/dist/src/utils/agents-md-compiler.d.ts.map +1 -0
  802. package/dist/src/utils/agents-md-compiler.js +420 -0
  803. package/dist/src/utils/agents-md-compiler.js.map +1 -0
  804. package/dist/src/utils/auth-helpers.d.ts +58 -0
  805. package/dist/src/utils/auth-helpers.d.ts.map +1 -0
  806. package/dist/src/utils/auth-helpers.js +108 -0
  807. package/dist/src/utils/auth-helpers.js.map +1 -0
  808. package/dist/src/utils/auto-install.d.ts +47 -0
  809. package/dist/src/utils/auto-install.d.ts.map +1 -0
  810. package/dist/src/utils/auto-install.js +211 -0
  811. package/dist/src/utils/auto-install.js.map +1 -0
  812. package/dist/src/utils/claude-cli-detector.d.ts +75 -0
  813. package/dist/src/utils/claude-cli-detector.d.ts.map +1 -0
  814. package/dist/src/utils/claude-cli-detector.js +285 -0
  815. package/dist/src/utils/claude-cli-detector.js.map +1 -0
  816. package/dist/src/utils/cost-reporter.d.ts +58 -0
  817. package/dist/src/utils/cost-reporter.d.ts.map +1 -0
  818. package/dist/src/utils/cost-reporter.js +224 -0
  819. package/dist/src/utils/cost-reporter.js.map +1 -0
  820. package/dist/src/utils/docs-preview/config-generator.d.ts +46 -0
  821. package/dist/src/utils/docs-preview/config-generator.d.ts.map +1 -0
  822. package/dist/src/utils/docs-preview/config-generator.js +377 -0
  823. package/dist/src/utils/docs-preview/config-generator.js.map +1 -0
  824. package/dist/src/utils/docs-preview/docusaurus-setup.d.ts +38 -0
  825. package/dist/src/utils/docs-preview/docusaurus-setup.d.ts.map +1 -0
  826. package/dist/src/utils/docs-preview/docusaurus-setup.js +177 -0
  827. package/dist/src/utils/docs-preview/docusaurus-setup.js.map +1 -0
  828. package/dist/src/utils/docs-preview/index.d.ts +7 -0
  829. package/dist/src/utils/docs-preview/index.d.ts.map +1 -0
  830. package/dist/src/utils/docs-preview/index.js +7 -0
  831. package/dist/src/utils/docs-preview/index.js.map +1 -0
  832. package/dist/src/utils/docs-preview/package-installer.d.ts +42 -0
  833. package/dist/src/utils/docs-preview/package-installer.d.ts.map +1 -0
  834. package/dist/src/utils/docs-preview/package-installer.js +182 -0
  835. package/dist/src/utils/docs-preview/package-installer.js.map +1 -0
  836. package/dist/src/utils/docs-preview/server-manager.d.ts +30 -0
  837. package/dist/src/utils/docs-preview/server-manager.d.ts.map +1 -0
  838. package/dist/src/utils/docs-preview/server-manager.js +212 -0
  839. package/dist/src/utils/docs-preview/server-manager.js.map +1 -0
  840. package/dist/src/utils/docs-preview/sidebar-builder.d.ts +32 -0
  841. package/dist/src/utils/docs-preview/sidebar-builder.d.ts.map +1 -0
  842. package/dist/src/utils/docs-preview/sidebar-builder.js +202 -0
  843. package/dist/src/utils/docs-preview/sidebar-builder.js.map +1 -0
  844. package/dist/src/utils/docs-preview/types.d.ts +57 -0
  845. package/dist/src/utils/docs-preview/types.d.ts.map +1 -0
  846. package/dist/src/utils/docs-preview/types.js +2 -0
  847. package/dist/src/utils/docs-preview/types.js.map +1 -0
  848. package/dist/src/utils/env-file-generator.d.ts +54 -0
  849. package/dist/src/utils/env-file-generator.d.ts.map +1 -0
  850. package/dist/src/utils/env-file-generator.js +196 -0
  851. package/dist/src/utils/env-file-generator.js.map +1 -0
  852. package/dist/src/utils/env-file.d.ts +88 -0
  853. package/dist/src/utils/env-file.d.ts.map +1 -0
  854. package/dist/src/utils/env-file.js +180 -0
  855. package/dist/src/utils/env-file.js.map +1 -0
  856. package/dist/src/utils/env-multi-project-parser.d.ts +220 -0
  857. package/dist/src/utils/env-multi-project-parser.d.ts.map +1 -0
  858. package/dist/src/utils/env-multi-project-parser.js +401 -0
  859. package/dist/src/utils/env-multi-project-parser.js.map +1 -0
  860. package/dist/src/utils/esm-helpers.d.ts +50 -0
  861. package/dist/src/utils/esm-helpers.d.ts.map +1 -0
  862. package/dist/src/utils/esm-helpers.js +57 -0
  863. package/dist/src/utils/esm-helpers.js.map +1 -0
  864. package/dist/src/utils/execFileNoThrow.d.ts +99 -0
  865. package/dist/src/utils/execFileNoThrow.d.ts.map +1 -0
  866. package/dist/src/utils/execFileNoThrow.js +137 -0
  867. package/dist/src/utils/execFileNoThrow.js.map +1 -0
  868. package/dist/src/utils/external-resource-validator.d.ts +200 -0
  869. package/dist/src/utils/external-resource-validator.d.ts.map +1 -0
  870. package/dist/src/utils/external-resource-validator.js +1194 -0
  871. package/dist/src/utils/external-resource-validator.js.map +1 -0
  872. package/dist/src/utils/generate-skills-index.d.ts +24 -0
  873. package/dist/src/utils/generate-skills-index.d.ts.map +1 -0
  874. package/dist/src/utils/generate-skills-index.js +410 -0
  875. package/dist/src/utils/generate-skills-index.js.map +1 -0
  876. package/dist/src/utils/git-detector.d.ts +84 -0
  877. package/dist/src/utils/git-detector.d.ts.map +1 -0
  878. package/dist/src/utils/git-detector.js +233 -0
  879. package/dist/src/utils/git-detector.js.map +1 -0
  880. package/dist/src/utils/git-utils.d.ts +74 -0
  881. package/dist/src/utils/git-utils.d.ts.map +1 -0
  882. package/dist/src/utils/git-utils.js +272 -0
  883. package/dist/src/utils/git-utils.js.map +1 -0
  884. package/dist/src/utils/model-selection.d.ts +75 -0
  885. package/dist/src/utils/model-selection.d.ts.map +1 -0
  886. package/dist/src/utils/model-selection.js +204 -0
  887. package/dist/src/utils/model-selection.js.map +1 -0
  888. package/dist/src/utils/plugin-validator.d.ts +161 -0
  889. package/dist/src/utils/plugin-validator.d.ts.map +1 -0
  890. package/dist/src/utils/plugin-validator.js +558 -0
  891. package/dist/src/utils/plugin-validator.js.map +1 -0
  892. package/dist/src/utils/pricing-constants.d.ts +70 -0
  893. package/dist/src/utils/pricing-constants.d.ts.map +1 -0
  894. package/dist/src/utils/pricing-constants.js +71 -0
  895. package/dist/src/utils/pricing-constants.js.map +1 -0
  896. package/dist/src/utils/project-detection.d.ts +141 -0
  897. package/dist/src/utils/project-detection.d.ts.map +1 -0
  898. package/dist/src/utils/project-detection.js +321 -0
  899. package/dist/src/utils/project-detection.js.map +1 -0
  900. package/dist/src/utils/project-mapper.d.ts +92 -0
  901. package/dist/src/utils/project-mapper.d.ts.map +1 -0
  902. package/dist/src/utils/project-mapper.js +276 -0
  903. package/dist/src/utils/project-mapper.js.map +1 -0
  904. package/dist/src/utils/spec-splitter.d.ts +75 -0
  905. package/dist/src/utils/spec-splitter.d.ts.map +1 -0
  906. package/dist/src/utils/spec-splitter.js +332 -0
  907. package/dist/src/utils/spec-splitter.js.map +1 -0
  908. package/dist/src/utils/string-utils.d.ts +40 -0
  909. package/dist/src/utils/string-utils.d.ts.map +1 -0
  910. package/dist/src/utils/string-utils.js +58 -0
  911. package/dist/src/utils/string-utils.js.map +1 -0
  912. package/dist/src/utils/translation.d.ts +187 -0
  913. package/dist/src/utils/translation.d.ts.map +1 -0
  914. package/dist/src/utils/translation.js +414 -0
  915. package/dist/src/utils/translation.js.map +1 -0
  916. package/dist/utils/git-utils.d.ts +74 -0
  917. package/dist/utils/git-utils.d.ts.map +1 -0
  918. package/dist/utils/git-utils.js +272 -0
  919. package/dist/utils/git-utils.js.map +1 -0
  920. package/package.json +2 -1
  921. package/plugins/specweave/.claude-plugin/plugin.json +2 -1
  922. package/plugins/specweave/commands/revert-wip-limit.md +82 -0
  923. package/plugins/specweave/hooks/hooks.json +10 -0
  924. package/plugins/specweave/hooks/lib/migrate-increment-work.sh +245 -0
  925. package/plugins/specweave/hooks/lib/sync-spec-content.sh +149 -0
  926. package/plugins/specweave/hooks/post-increment-planning.sh +51 -29
  927. package/plugins/specweave/hooks/user-prompt-submit.sh +119 -12
  928. package/plugins/specweave/lib/hooks/git-diff-analyzer.js +213 -129
  929. package/plugins/specweave/lib/hooks/invoke-translator-skill.js +192 -146
  930. package/plugins/specweave/lib/hooks/prepare-reflection-context.js +116 -103
  931. package/plugins/specweave/lib/hooks/reflection-config-loader.js +125 -85
  932. package/plugins/specweave/lib/hooks/reflection-parser.js +385 -267
  933. package/plugins/specweave/lib/hooks/reflection-prompt-builder.js +226 -169
  934. package/plugins/specweave/lib/hooks/reflection-storage.js +297 -223
  935. package/plugins/specweave/lib/hooks/run-self-reflection.js +191 -120
  936. package/plugins/specweave/lib/hooks/sync-living-docs.js +27 -1
  937. package/plugins/specweave/lib/hooks/sync-living-docs.ts +46 -2
  938. package/plugins/specweave/lib/hooks/translate-file.js +300 -239
  939. package/plugins/specweave/lib/hooks/translate-living-docs.js +144 -88
  940. package/plugins/specweave/lib/hooks/types/reflection-types.js +72 -57
  941. package/plugins/specweave/lib/hooks/update-tasks-md.js +179 -117
  942. package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -1
  943. package/plugins/specweave-ado/hooks/post-task-completion.sh +22 -0
  944. package/plugins/specweave-ado/lib/ado-board-resolver.js +205 -135
  945. package/plugins/specweave-ado/lib/ado-client-v2.d.ts +15 -5
  946. package/plugins/specweave-ado/lib/ado-client-v2.d.ts.map +1 -1
  947. package/plugins/specweave-ado/lib/ado-client-v2.js +449 -406
  948. package/plugins/specweave-ado/lib/ado-client-v2.js.map +1 -1
  949. package/plugins/specweave-ado/lib/ado-client-v2.ts +43 -51
  950. package/plugins/specweave-ado/lib/ado-hierarchical-sync.js +335 -223
  951. package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.js +0 -0
  952. package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +38 -0
  953. package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts.map +1 -0
  954. package/plugins/specweave-ado/lib/ado-spec-commit-sync.js +210 -0
  955. package/plugins/specweave-ado/lib/ado-spec-commit-sync.js.map +1 -0
  956. package/plugins/specweave-ado/lib/ado-spec-commit-sync.ts +288 -0
  957. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +205 -0
  958. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +313 -0
  959. package/plugins/specweave-ado/lib/ado-spec-sync.js +414 -380
  960. package/plugins/specweave-ado/lib/project-selector.js +196 -168
  961. package/plugins/specweave-ado/skills/ado-resource-validator/SKILL.md +199 -12
  962. package/plugins/specweave-github/.claude-plugin/plugin.json +2 -1
  963. package/plugins/specweave-github/hooks/post-task-completion.sh +22 -0
  964. package/plugins/specweave-github/lib/cli-sync-increment-changes.js +20 -9
  965. package/plugins/specweave-github/lib/github-board-resolver.js +115 -69
  966. package/plugins/specweave-github/lib/github-client-v2.js +389 -400
  967. package/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  968. package/plugins/specweave-github/lib/github-client-v2.ts +13 -13
  969. package/plugins/specweave-github/lib/github-client.js +280 -246
  970. package/plugins/specweave-github/lib/github-hierarchical-sync.js +251 -168
  971. package/plugins/specweave-github/lib/github-issue-updater.js +4 -4
  972. package/plugins/specweave-github/lib/github-issue-updater.ts +4 -4
  973. package/plugins/specweave-github/lib/github-spec-commit-sync.d.js +0 -0
  974. package/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +37 -0
  975. package/plugins/specweave-github/lib/github-spec-commit-sync.d.ts.map +1 -0
  976. package/plugins/specweave-github/lib/github-spec-commit-sync.js +209 -0
  977. package/plugins/specweave-github/lib/github-spec-commit-sync.js.map +1 -0
  978. package/plugins/specweave-github/lib/github-spec-commit-sync.ts +285 -0
  979. package/plugins/specweave-github/lib/github-spec-content-sync.js +169 -0
  980. package/plugins/specweave-github/lib/github-spec-content-sync.ts +255 -0
  981. package/plugins/specweave-github/lib/github-spec-sync.js +420 -379
  982. package/plugins/specweave-github/lib/github-sync-bidirectional.js +2 -2
  983. package/plugins/specweave-github/lib/github-sync-bidirectional.ts +2 -2
  984. package/plugins/specweave-github/lib/github-sync-increment-changes.js +4 -4
  985. package/plugins/specweave-github/lib/github-sync-increment-changes.ts +4 -4
  986. package/plugins/specweave-github/lib/index.js +10 -11
  987. package/plugins/specweave-github/lib/repo-selector.js +201 -174
  988. package/plugins/specweave-github/lib/subtask-sync.js +125 -132
  989. package/plugins/specweave-github/lib/task-parser.js +207 -191
  990. package/plugins/specweave-github/lib/task-sync.js +296 -344
  991. package/plugins/specweave-github/lib/types.js +5 -0
  992. package/plugins/specweave-jira/.claude-plugin/plugin.json +2 -1
  993. package/plugins/specweave-jira/hooks/post-task-completion.sh +22 -0
  994. package/plugins/specweave-jira/lib/jira-board-resolver.js +79 -50
  995. package/plugins/specweave-jira/lib/jira-hierarchical-sync.js +191 -119
  996. package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.js +0 -0
  997. package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +43 -0
  998. package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -0
  999. package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +282 -0
  1000. package/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -0
  1001. package/plugins/specweave-jira/lib/jira-spec-commit-sync.ts +368 -0
  1002. package/plugins/specweave-jira/lib/jira-spec-content-sync.js +260 -0
  1003. package/plugins/specweave-jira/lib/jira-spec-content-sync.ts +367 -0
  1004. package/plugins/specweave-jira/lib/jira-spec-sync.js +405 -366
  1005. package/plugins/specweave-jira/lib/project-selector.js +201 -172
  1006. package/plugins/specweave-jira/lib/reorganization-detector.js +237 -202
  1007. package/plugins/specweave-jira/lib/setup-wizard.js +204 -162
  1008. package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +31 -1
  1009. package/plugins/specweave-mobile/.claude-plugin/plugin.json +25 -0
  1010. package/plugins/specweave-mobile/README.md +337 -0
  1011. package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +642 -0
  1012. package/plugins/specweave-mobile/skills/device-testing/SKILL.md +609 -0
  1013. package/plugins/specweave-mobile/skills/expo-workflow/SKILL.md +440 -0
  1014. package/plugins/specweave-mobile/skills/metro-bundler/SKILL.md +614 -0
  1015. package/plugins/specweave-mobile/skills/mobile-debugging/SKILL.md +536 -0
  1016. package/plugins/specweave-mobile/skills/native-modules/SKILL.md +573 -0
  1017. package/plugins/specweave-mobile/skills/performance-optimization/SKILL.md +550 -0
  1018. package/plugins/specweave-mobile/skills/react-native-setup/SKILL.md +216 -0
  1019. package/plugins/specweave-release/.claude-plugin/plugin.json +42 -0
  1020. package/plugins/specweave-release/IMPLEMENTATION.md +449 -0
  1021. package/plugins/specweave-release/README.md +509 -0
  1022. package/plugins/specweave-release/agents/release-manager/AGENT.md +672 -0
  1023. package/plugins/specweave-release/commands/specweave-release-align.md +505 -0
  1024. package/plugins/specweave-release/commands/specweave-release-init.md +430 -0
  1025. package/plugins/specweave-release/commands/specweave-release-platform.md +439 -0
  1026. package/plugins/specweave-release/commands/specweave-release-rc.md +495 -0
  1027. package/plugins/specweave-release/hooks/hooks.json +15 -0
  1028. package/plugins/specweave-release/hooks/post-task-completion.sh +110 -0
  1029. package/plugins/specweave-release/lib/dashboard-generator.js +232 -0
  1030. package/plugins/specweave-release/lib/dashboard-generator.ts +294 -0
  1031. package/plugins/specweave-release/lib/dora-tracker.js +200 -0
  1032. package/plugins/specweave-release/lib/dora-tracker.ts +361 -0
  1033. package/plugins/specweave-release/skills/rc-manager/SKILL.md +660 -0
  1034. package/plugins/specweave-release/skills/release-coordinator/SKILL.md +535 -0
  1035. package/plugins/specweave-release/skills/release-strategy-advisor/SKILL.md +473 -0
  1036. package/plugins/specweave-release/skills/version-aligner/SKILL.md +579 -0
@@ -0,0 +1,1194 @@
1
+ /**
2
+ * External Resource Validator
3
+ *
4
+ * Validates and creates external resources (Jira projects, boards, etc.)
5
+ * Smart enough to:
6
+ * - Check if resources exist
7
+ * - Prompt user to select existing or create new
8
+ * - Create missing resources automatically
9
+ * - Update .env with actual IDs after creation
10
+ *
11
+ * @module utils/external-resource-validator
12
+ * @since 0.9.5
13
+ */
14
+ import fs from 'fs-extra';
15
+ import inquirer from 'inquirer';
16
+ import chalk from 'chalk';
17
+ import { exec } from 'child_process';
18
+ import { promisify } from 'util';
19
+ const execAsync = promisify(exec);
20
+ // ============================================================================
21
+ // Jira Resource Validator
22
+ // ============================================================================
23
+ export class JiraResourceValidator {
24
+ constructor(envPath = '.env') {
25
+ this.envPath = envPath;
26
+ // Load from .env
27
+ const env = this.loadEnv();
28
+ this.apiToken = env.JIRA_API_TOKEN || '';
29
+ this.email = env.JIRA_EMAIL || '';
30
+ this.domain = env.JIRA_DOMAIN || '';
31
+ }
32
+ /**
33
+ * Load .env file
34
+ */
35
+ loadEnv() {
36
+ try {
37
+ if (!fs.existsSync(this.envPath)) {
38
+ return {};
39
+ }
40
+ const content = fs.readFileSync(this.envPath, 'utf-8');
41
+ const env = {};
42
+ content.split('\n').forEach((line) => {
43
+ const match = line.match(/^([^=:#]+)=(.*)$/);
44
+ if (match) {
45
+ const key = match[1].trim();
46
+ const value = match[2].trim();
47
+ env[key] = value;
48
+ }
49
+ });
50
+ return env;
51
+ }
52
+ catch (error) {
53
+ return {};
54
+ }
55
+ }
56
+ /**
57
+ * Update .env file with new values
58
+ */
59
+ async updateEnv(updates) {
60
+ try {
61
+ let content = '';
62
+ if (fs.existsSync(this.envPath)) {
63
+ content = fs.readFileSync(this.envPath, 'utf-8');
64
+ }
65
+ // Update existing or append new
66
+ Object.entries(updates).forEach(([key, value]) => {
67
+ const regex = new RegExp(`^${key}=.*$`, 'm');
68
+ if (regex.test(content)) {
69
+ content = content.replace(regex, `${key}=${value}`);
70
+ }
71
+ else {
72
+ content += `\n${key}=${value}`;
73
+ }
74
+ });
75
+ fs.writeFileSync(this.envPath, content.trim() + '\n');
76
+ console.log(chalk.green(`✅ Updated ${this.envPath}`));
77
+ }
78
+ catch (error) {
79
+ console.error(chalk.red(`❌ Failed to update ${this.envPath}: ${error.message}`));
80
+ throw error;
81
+ }
82
+ }
83
+ /**
84
+ * Call Jira API
85
+ */
86
+ async callJiraApi(endpoint, method = 'GET', body) {
87
+ const url = `https://${this.domain}/rest/api/3/${endpoint}`;
88
+ const auth = Buffer.from(`${this.email}:${this.apiToken}`).toString('base64');
89
+ const curlCommand = `curl -s -f -X ${method} \
90
+ -H "Authorization: Basic ${auth}" \
91
+ -H "Content-Type: application/json" \
92
+ ${body ? `-d '${JSON.stringify(body)}'` : ''} \
93
+ "${url}"`;
94
+ try {
95
+ const { stdout } = await execAsync(curlCommand);
96
+ const response = JSON.parse(stdout);
97
+ // Double-check for error response (defense in depth)
98
+ if (response.errorMessages || response.errors) {
99
+ const errorMsg = response.errorMessages?.join(', ') || JSON.stringify(response.errors);
100
+ throw new Error(errorMsg);
101
+ }
102
+ return response;
103
+ }
104
+ catch (error) {
105
+ // Improve error message for common cases
106
+ if (error.message.includes('curl: (22)')) {
107
+ throw new Error('Resource not found (HTTP 404)');
108
+ }
109
+ throw error;
110
+ }
111
+ }
112
+ /**
113
+ * Fetch all Jira projects
114
+ */
115
+ async fetchProjects() {
116
+ try {
117
+ const response = await this.callJiraApi('project');
118
+ return response.map((p) => ({
119
+ id: p.id,
120
+ key: p.key,
121
+ name: p.name,
122
+ }));
123
+ }
124
+ catch (error) {
125
+ return [];
126
+ }
127
+ }
128
+ /**
129
+ * Check if project exists
130
+ */
131
+ async checkProject(projectKey) {
132
+ try {
133
+ const project = await this.callJiraApi(`project/${projectKey}`);
134
+ return {
135
+ id: project.id,
136
+ key: project.key,
137
+ name: project.name,
138
+ };
139
+ }
140
+ catch (error) {
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Create new Jira project
146
+ */
147
+ async createProject(projectKey, projectName) {
148
+ console.log(chalk.blue(`📦 Creating Jira project: ${projectKey} (${projectName})...`));
149
+ const body = {
150
+ key: projectKey,
151
+ name: projectName,
152
+ projectTypeKey: 'software',
153
+ leadAccountId: await this.getCurrentUserId(),
154
+ };
155
+ try {
156
+ const project = await this.callJiraApi('project', 'POST', body);
157
+ console.log(chalk.green(`✅ Project created: ${projectKey}`));
158
+ return {
159
+ id: project.id,
160
+ key: project.key,
161
+ name: project.name,
162
+ };
163
+ }
164
+ catch (error) {
165
+ console.error(chalk.red(`❌ Failed to create project: ${error.message}`));
166
+ throw error;
167
+ }
168
+ }
169
+ /**
170
+ * Get current user ID (for project lead)
171
+ */
172
+ async getCurrentUserId() {
173
+ try {
174
+ const user = await this.callJiraApi('myself');
175
+ return user.accountId;
176
+ }
177
+ catch (error) {
178
+ throw new Error('Failed to get current user ID');
179
+ }
180
+ }
181
+ /**
182
+ * Fetch all boards for a project
183
+ */
184
+ async fetchBoards(projectKey) {
185
+ try {
186
+ const response = await this.callJiraApi(`board?projectKeyOrId=${projectKey}`);
187
+ return response.values.map((b) => ({
188
+ id: b.id,
189
+ name: b.name,
190
+ type: b.type,
191
+ }));
192
+ }
193
+ catch (error) {
194
+ return [];
195
+ }
196
+ }
197
+ /**
198
+ * Check if board exists by ID
199
+ */
200
+ async checkBoard(boardId) {
201
+ try {
202
+ const board = await this.callJiraApi(`board/${boardId}`);
203
+ // Fetch board configuration to get project information
204
+ let location;
205
+ try {
206
+ const config = await this.callJiraApi(`board/${boardId}/configuration`);
207
+ if (config.location) {
208
+ location = {
209
+ projectKey: config.location.projectKey,
210
+ projectId: config.location.projectId,
211
+ };
212
+ }
213
+ }
214
+ catch (error) {
215
+ // Configuration fetch failed, board exists but we don't know which project
216
+ // This is OK for backward compatibility
217
+ }
218
+ return {
219
+ id: board.id,
220
+ name: board.name,
221
+ type: board.type,
222
+ location,
223
+ };
224
+ }
225
+ catch (error) {
226
+ return null;
227
+ }
228
+ }
229
+ /**
230
+ * Create new Jira board
231
+ */
232
+ async createBoard(boardName, projectKey) {
233
+ console.log(chalk.blue(`📦 Creating Jira board: ${boardName} in project ${projectKey}...`));
234
+ const body = {
235
+ name: boardName,
236
+ type: 'scrum',
237
+ filterId: await this.getOrCreateFilter(projectKey),
238
+ location: {
239
+ type: 'project',
240
+ projectKeyOrId: projectKey,
241
+ },
242
+ };
243
+ try {
244
+ const board = await this.callJiraApi('board', 'POST', body);
245
+ console.log(chalk.green(`✅ Board created: ${boardName} (ID: ${board.id})`));
246
+ return {
247
+ id: board.id,
248
+ name: board.name,
249
+ type: board.type,
250
+ };
251
+ }
252
+ catch (error) {
253
+ console.error(chalk.red(`❌ Failed to create board: ${error.message}`));
254
+ throw error;
255
+ }
256
+ }
257
+ /**
258
+ * Get or create filter for board
259
+ */
260
+ async getOrCreateFilter(projectKey) {
261
+ // For simplicity, create a basic filter
262
+ // In production, you might want to check for existing filters first
263
+ const body = {
264
+ name: `${projectKey} Issues`,
265
+ jql: `project = ${projectKey}`,
266
+ };
267
+ try {
268
+ const filter = await this.callJiraApi('filter', 'POST', body);
269
+ return filter.id;
270
+ }
271
+ catch (error) {
272
+ throw new Error(`Failed to create filter: ${error.message}`);
273
+ }
274
+ }
275
+ /**
276
+ * Validate and fix Jira configuration
277
+ */
278
+ async validate() {
279
+ console.log(chalk.blue('\n🔍 Validating Jira configuration...\n'));
280
+ const result = {
281
+ valid: true,
282
+ project: { exists: false },
283
+ boards: { valid: true, existing: [], missing: [], created: [] },
284
+ envUpdated: false,
285
+ };
286
+ const env = this.loadEnv();
287
+ const strategy = env.JIRA_STRATEGY || 'project-per-team';
288
+ // Determine project key(s) based on strategy
289
+ let projectKeys = [];
290
+ if (strategy === 'project-per-team') {
291
+ // Multiple projects (JIRA_PROJECTS is comma-separated)
292
+ const projectsEnv = env.JIRA_PROJECTS || '';
293
+ if (!projectsEnv) {
294
+ console.log(chalk.red('❌ JIRA_PROJECTS not found in .env'));
295
+ result.valid = false;
296
+ return result;
297
+ }
298
+ projectKeys = projectsEnv.split(',').map(p => p.trim()).filter(p => p);
299
+ }
300
+ else {
301
+ // Single project (component-based or board-based)
302
+ const projectKey = env.JIRA_PROJECT;
303
+ if (!projectKey) {
304
+ console.log(chalk.red('❌ JIRA_PROJECT not found in .env'));
305
+ result.valid = false;
306
+ return result;
307
+ }
308
+ projectKeys = [projectKey];
309
+ }
310
+ // 1. Validate project(s)
311
+ console.log(chalk.gray(`Strategy: ${strategy}`));
312
+ console.log(chalk.gray(`Checking project(s): ${projectKeys.join(', ')}...\n`));
313
+ // NEW: Validate per-project var naming (detect orphaned configs)
314
+ const perProjectBoardVars = Object.keys(env).filter(key => key.startsWith('JIRA_BOARDS_'));
315
+ for (const varName of perProjectBoardVars) {
316
+ const projectFromVar = varName.split('JIRA_BOARDS_')[1];
317
+ if (!projectKeys.includes(projectFromVar)) {
318
+ console.log(chalk.yellow(`⚠️ Configuration warning: ${varName}`));
319
+ console.log(chalk.gray(` Project "${projectFromVar}" not found in JIRA_PROJECTS`));
320
+ console.log(chalk.gray(` Expected projects: ${projectKeys.join(', ')}`));
321
+ console.log(chalk.gray(` This configuration will be ignored.\n`));
322
+ }
323
+ }
324
+ // Track all validated/created projects (for multi-project IDs)
325
+ const allProjects = [];
326
+ for (const projectKey of projectKeys) {
327
+ const project = await this.checkProject(projectKey);
328
+ if (!project) {
329
+ console.log(chalk.yellow(`⚠️ Project "${projectKey}" not found\n`));
330
+ // Fetch existing projects
331
+ const existingProjects = await this.fetchProjects();
332
+ // Prompt user
333
+ const { action } = await inquirer.prompt([
334
+ {
335
+ type: 'list',
336
+ name: 'action',
337
+ message: `What would you like to do for project "${projectKey}"?`,
338
+ choices: [
339
+ { name: 'Select an existing project', value: 'select' },
340
+ { name: 'Create a new project', value: 'create' },
341
+ { name: 'Skip this project', value: 'skip' },
342
+ { name: 'Cancel validation', value: 'cancel' },
343
+ ],
344
+ },
345
+ ]);
346
+ if (action === 'cancel') {
347
+ result.valid = false;
348
+ return result;
349
+ }
350
+ if (action === 'skip') {
351
+ console.log(chalk.yellow(`⏭️ Skipped project "${projectKey}"\n`));
352
+ continue;
353
+ }
354
+ if (action === 'select') {
355
+ const { selectedProject } = await inquirer.prompt([
356
+ {
357
+ type: 'list',
358
+ name: 'selectedProject',
359
+ message: 'Select a project:',
360
+ choices: existingProjects.map((p) => ({
361
+ name: `${p.key} - ${p.name}`,
362
+ value: p.key,
363
+ })),
364
+ },
365
+ ]);
366
+ // Fetch full project details to get ID
367
+ const selectedProjectDetails = await this.checkProject(selectedProject);
368
+ if (!selectedProjectDetails) {
369
+ console.log(chalk.red(`❌ Failed to fetch details for project "${selectedProject}"\n`));
370
+ continue;
371
+ }
372
+ // Update .env (handle both single and multiple projects)
373
+ if (strategy === 'project-per-team') {
374
+ // Replace this project key in JIRA_PROJECTS
375
+ const updatedKeys = projectKeys.map(k => k === projectKey ? selectedProject : k);
376
+ await this.updateEnv({ JIRA_PROJECTS: updatedKeys.join(',') });
377
+ }
378
+ else {
379
+ await this.updateEnv({ JIRA_PROJECT: selectedProject });
380
+ }
381
+ // Print link to selected project
382
+ const projectUrl = `https://${this.domain}/jira/software/c/projects/${selectedProject}`;
383
+ console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}`));
384
+ result.project = {
385
+ exists: true,
386
+ key: selectedProject,
387
+ id: selectedProjectDetails.id,
388
+ name: selectedProjectDetails.name,
389
+ };
390
+ result.envUpdated = true;
391
+ console.log(chalk.green(`✅ Project "${selectedProject}" selected\n`));
392
+ // Track for multi-project ID collection
393
+ allProjects.push({
394
+ key: selectedProject,
395
+ id: selectedProjectDetails.id,
396
+ name: selectedProjectDetails.name,
397
+ });
398
+ }
399
+ else if (action === 'create') {
400
+ const { projectName } = await inquirer.prompt([
401
+ {
402
+ type: 'input',
403
+ name: 'projectName',
404
+ message: 'Enter project name:',
405
+ default: projectKey,
406
+ },
407
+ ]);
408
+ const newProject = await this.createProject(projectKey, projectName);
409
+ // Print link to created project
410
+ const projectUrl = `https://${this.domain}/jira/software/c/projects/${newProject.key}`;
411
+ console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}\n`));
412
+ result.project = {
413
+ exists: true,
414
+ key: newProject.key,
415
+ id: newProject.id,
416
+ name: newProject.name,
417
+ };
418
+ // Track for multi-project ID collection
419
+ allProjects.push({
420
+ key: newProject.key,
421
+ id: newProject.id,
422
+ name: newProject.name,
423
+ });
424
+ }
425
+ }
426
+ else {
427
+ console.log(chalk.green(`✅ Validated: Project "${projectKey}" exists in Jira`));
428
+ // Print link to validated project
429
+ const projectUrl = `https://${this.domain}/jira/software/c/projects/${project.key}`;
430
+ console.log(chalk.cyan(`🔗 View in Jira: ${projectUrl}`));
431
+ result.project = {
432
+ exists: true,
433
+ key: project.key,
434
+ id: project.id,
435
+ name: project.name,
436
+ };
437
+ // Track for multi-project ID collection
438
+ allProjects.push({
439
+ key: project.key,
440
+ id: project.id,
441
+ name: project.name,
442
+ });
443
+ }
444
+ }
445
+ console.log(); // Empty line after project validation
446
+ // Update .env with project IDs (for multi-project strategy)
447
+ if (strategy === 'project-per-team' && allProjects.length > 0) {
448
+ const projectIds = allProjects.map(p => p.id).join(',');
449
+ await this.updateEnv({ JIRA_PROJECT_IDS: projectIds });
450
+ result.envUpdated = true;
451
+ console.log(chalk.green(`✅ Updated .env with project IDs: ${projectIds}\n`));
452
+ }
453
+ else if (allProjects.length === 1) {
454
+ // Single project - store both key and ID
455
+ await this.updateEnv({ JIRA_PROJECT_ID: allProjects[0].id });
456
+ result.envUpdated = true;
457
+ console.log(chalk.green(`✅ Updated .env with project ID: ${allProjects[0].id}\n`));
458
+ }
459
+ // 2. Validate boards (per-project OR legacy board-based strategy)
460
+ result.boards = { valid: true, existing: [], missing: [], created: [] };
461
+ // NEW: Check for per-project boards (JIRA_BOARDS_{ProjectKey})
462
+ let hasPerProjectBoards = false;
463
+ for (const projectKey of projectKeys) {
464
+ const perProjectKey = `JIRA_BOARDS_${projectKey}`;
465
+ if (env[perProjectKey]) {
466
+ hasPerProjectBoards = true;
467
+ break;
468
+ }
469
+ }
470
+ if (hasPerProjectBoards) {
471
+ // Per-project boards (NEW!)
472
+ console.log(chalk.gray(`Checking per-project boards...\n`));
473
+ // Track board names to detect conflicts across projects
474
+ const boardNamesSeen = new Map(); // name -> project
475
+ for (const projectKey of projectKeys) {
476
+ const perProjectKey = `JIRA_BOARDS_${projectKey}`;
477
+ const boardsConfig = env[perProjectKey];
478
+ if (boardsConfig) {
479
+ const boardEntries = boardsConfig.split(',').map((b) => b.trim()).filter(b => b);
480
+ if (boardEntries.length > 0) {
481
+ console.log(chalk.gray(` Project: ${projectKey} (${boardEntries.length} boards)`));
482
+ const finalBoardIds = [];
483
+ for (const entry of boardEntries) {
484
+ const isNumeric = /^\d+$/.test(entry);
485
+ if (isNumeric) {
486
+ // Entry is a board ID - validate it exists AND belongs to this project
487
+ const boardId = parseInt(entry, 10);
488
+ const board = await this.checkBoard(boardId);
489
+ if (board) {
490
+ // NEW: Validate board belongs to the correct project
491
+ if (board.location?.projectKey && board.location.projectKey !== projectKey) {
492
+ console.log(chalk.yellow(` ⚠️ Board ${boardId}: ${board.name} belongs to project ${board.location.projectKey}, not ${projectKey}`));
493
+ console.log(chalk.gray(` Expected: ${projectKey}, Found: ${board.location.projectKey}`));
494
+ result.boards.missing.push(entry);
495
+ result.boards.valid = false;
496
+ }
497
+ else {
498
+ // Board exists and belongs to correct project (or project unknown - backward compat)
499
+ if (board.location?.projectKey) {
500
+ console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (project: ${board.location.projectKey})`));
501
+ }
502
+ else {
503
+ console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (project verification skipped)`));
504
+ }
505
+ result.boards.existing.push(board.id);
506
+ finalBoardIds.push(board.id);
507
+ }
508
+ }
509
+ else {
510
+ console.log(chalk.yellow(` ⚠️ Board ${boardId}: Not found`));
511
+ result.boards.missing.push(entry);
512
+ result.boards.valid = false;
513
+ }
514
+ }
515
+ else {
516
+ // Entry is a board name - check for conflicts, then create it
517
+ // NEW: Detect board name conflicts across projects
518
+ if (boardNamesSeen.has(entry)) {
519
+ const existingProject = boardNamesSeen.get(entry);
520
+ console.log(chalk.yellow(` ⚠️ Board name conflict: "${entry}" already used in project ${existingProject}`));
521
+ console.log(chalk.gray(` Tip: Use unique board names or append project suffix (e.g., "${entry}-${projectKey}")`));
522
+ result.boards.missing.push(entry);
523
+ result.boards.valid = false;
524
+ }
525
+ else {
526
+ console.log(chalk.blue(` 📦 Creating board: ${entry}...`));
527
+ try {
528
+ const board = await this.createBoard(entry, projectKey);
529
+ console.log(chalk.green(` ✅ Created: ${entry} (ID: ${board.id})`));
530
+ result.boards.created.push({ name: entry, id: board.id });
531
+ finalBoardIds.push(board.id);
532
+ boardNamesSeen.set(entry, projectKey); // Track this board name
533
+ }
534
+ catch (error) {
535
+ console.log(chalk.red(` ❌ Failed to create ${entry}: ${error.message}`));
536
+ result.boards.missing.push(entry);
537
+ result.boards.valid = false;
538
+ }
539
+ }
540
+ }
541
+ }
542
+ // Update .env with final board IDs for this project
543
+ if (finalBoardIds.length > 0) {
544
+ await this.updateEnv({ [perProjectKey]: finalBoardIds.join(',') });
545
+ result.envUpdated = true;
546
+ console.log(chalk.green(` ✅ Updated ${perProjectKey}: ${finalBoardIds.join(',')}`));
547
+ }
548
+ }
549
+ }
550
+ }
551
+ console.log();
552
+ }
553
+ else {
554
+ // Legacy: Global boards (backward compatibility)
555
+ const boardsConfig = env.JIRA_BOARDS || '';
556
+ if (boardsConfig && strategy === 'board-based') {
557
+ console.log(chalk.gray(`Checking boards: ${boardsConfig}...`));
558
+ // For board-based strategy, use the single project key
559
+ const projectKeyForBoards = projectKeys[0];
560
+ const boardEntries = boardsConfig.split(',').map((b) => b.trim());
561
+ const finalBoardIds = [];
562
+ for (const entry of boardEntries) {
563
+ const isNumeric = /^\d+$/.test(entry);
564
+ if (isNumeric) {
565
+ // Entry is a board ID - validate it exists
566
+ const boardId = parseInt(entry, 10);
567
+ const board = await this.checkBoard(boardId);
568
+ if (board) {
569
+ console.log(chalk.green(` ✅ Board ${boardId}: ${board.name} (exists)`));
570
+ result.boards.existing.push(board.id);
571
+ finalBoardIds.push(board.id);
572
+ }
573
+ else {
574
+ console.log(chalk.yellow(` ⚠️ Board ${boardId}: Not found`));
575
+ result.boards.missing.push(entry);
576
+ result.boards.valid = false;
577
+ }
578
+ }
579
+ else {
580
+ // Entry is a board name - create it
581
+ console.log(chalk.blue(` 📦 Creating board: ${entry}...`));
582
+ try {
583
+ const board = await this.createBoard(entry, projectKeyForBoards);
584
+ console.log(chalk.green(` ✅ Created: ${entry} (ID: ${board.id})`));
585
+ result.boards.created.push({ name: entry, id: board.id });
586
+ finalBoardIds.push(board.id);
587
+ }
588
+ catch (error) {
589
+ console.log(chalk.red(` ❌ Failed to create ${entry}: ${error.message}`));
590
+ result.boards.missing.push(entry);
591
+ result.boards.valid = false;
592
+ }
593
+ }
594
+ }
595
+ // Update .env if any boards were created
596
+ if (result.boards.created.length > 0) {
597
+ console.log(chalk.blue('\n📝 Updating .env with board IDs...'));
598
+ await this.updateEnv({ JIRA_BOARDS: finalBoardIds.join(',') });
599
+ result.boards.existing = finalBoardIds;
600
+ result.envUpdated = true;
601
+ console.log(chalk.green(`✅ Updated JIRA_BOARDS: ${finalBoardIds.join(',')}`));
602
+ }
603
+ // Summary
604
+ console.log();
605
+ if (result.boards.missing.length > 0) {
606
+ console.log(chalk.yellow(`⚠️ Issues found: ${result.boards.missing.length} board(s)\n`));
607
+ }
608
+ else {
609
+ console.log(chalk.green(`✅ All boards validated/created successfully\n`));
610
+ }
611
+ }
612
+ }
613
+ return result;
614
+ }
615
+ }
616
+ export class AzureDevOpsResourceValidator {
617
+ constructor(envPath = '.env') {
618
+ this.envPath = envPath;
619
+ // Load from .env
620
+ const env = this.loadEnv();
621
+ this.pat = env.AZURE_DEVOPS_PAT || '';
622
+ this.organization = env.AZURE_DEVOPS_ORG || '';
623
+ }
624
+ /**
625
+ * Load .env file
626
+ */
627
+ loadEnv() {
628
+ try {
629
+ if (!fs.existsSync(this.envPath)) {
630
+ return {};
631
+ }
632
+ const content = fs.readFileSync(this.envPath, 'utf-8');
633
+ const env = {};
634
+ content.split('\n').forEach((line) => {
635
+ const match = line.match(/^([^=:#]+)=(.*)$/);
636
+ if (match) {
637
+ const key = match[1].trim();
638
+ const value = match[2].trim();
639
+ env[key] = value;
640
+ }
641
+ });
642
+ return env;
643
+ }
644
+ catch (error) {
645
+ return {};
646
+ }
647
+ }
648
+ /**
649
+ * Update .env file with new values
650
+ */
651
+ async updateEnv(updates) {
652
+ try {
653
+ let content = '';
654
+ if (fs.existsSync(this.envPath)) {
655
+ content = fs.readFileSync(this.envPath, 'utf-8');
656
+ }
657
+ // Update existing or append new
658
+ Object.entries(updates).forEach(([key, value]) => {
659
+ const regex = new RegExp(`^${key}=.*$`, 'm');
660
+ if (regex.test(content)) {
661
+ content = content.replace(regex, `${key}=${value}`);
662
+ }
663
+ else {
664
+ content += `\n${key}=${value}`;
665
+ }
666
+ });
667
+ fs.writeFileSync(this.envPath, content.trim() + '\n');
668
+ console.log(chalk.green(`✅ Updated ${this.envPath}`));
669
+ }
670
+ catch (error) {
671
+ console.error(chalk.red(`❌ Failed to update ${this.envPath}: ${error.message}`));
672
+ throw error;
673
+ }
674
+ }
675
+ /**
676
+ * Call Azure DevOps API
677
+ */
678
+ async callAzureDevOpsApi(endpoint, method = 'GET', body) {
679
+ const url = `https://dev.azure.com/${this.organization}/_apis/${endpoint}`;
680
+ const auth = Buffer.from(`:${this.pat}`).toString('base64');
681
+ const curlCommand = `curl -s -f -X ${method} \
682
+ -H "Authorization: Basic ${auth}" \
683
+ -H "Content-Type: application/json" \
684
+ ${body ? `-d '${JSON.stringify(body)}'` : ''} \
685
+ "${url}"`;
686
+ try {
687
+ const { stdout } = await execAsync(curlCommand);
688
+ const response = JSON.parse(stdout);
689
+ // Check for error response
690
+ if (response.message || response.errorMessage) {
691
+ throw new Error(response.message || response.errorMessage);
692
+ }
693
+ return response;
694
+ }
695
+ catch (error) {
696
+ // Improve error message for common cases
697
+ if (error.message.includes('curl: (22)')) {
698
+ throw new Error('Resource not found (HTTP 404)');
699
+ }
700
+ throw error;
701
+ }
702
+ }
703
+ /**
704
+ * Fetch all Azure DevOps projects
705
+ */
706
+ async fetchProjects() {
707
+ try {
708
+ const response = await this.callAzureDevOpsApi('projects?api-version=7.0');
709
+ return response.value.map((p) => ({
710
+ id: p.id,
711
+ name: p.name,
712
+ description: p.description || '',
713
+ }));
714
+ }
715
+ catch (error) {
716
+ return [];
717
+ }
718
+ }
719
+ /**
720
+ * Check if project exists
721
+ */
722
+ async checkProject(projectName) {
723
+ try {
724
+ const project = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}?api-version=7.0`);
725
+ return {
726
+ id: project.id,
727
+ name: project.name,
728
+ description: project.description || '',
729
+ };
730
+ }
731
+ catch (error) {
732
+ return null;
733
+ }
734
+ }
735
+ /**
736
+ * Create new Azure DevOps project
737
+ */
738
+ async createProject(projectName, description = '') {
739
+ console.log(chalk.blue(`📦 Creating Azure DevOps project: ${projectName}...`));
740
+ const body = {
741
+ name: projectName,
742
+ description: description || `${projectName} project`,
743
+ capabilities: {
744
+ versioncontrol: {
745
+ sourceControlType: 'Git'
746
+ },
747
+ processTemplate: {
748
+ templateTypeId: 'adcc42ab-9882-485e-a3ed-7678f01f66bc' // Agile process template
749
+ }
750
+ }
751
+ };
752
+ try {
753
+ const project = await this.callAzureDevOpsApi('projects?api-version=7.0', 'POST', body);
754
+ // Wait for project creation to complete (ADO creates projects asynchronously)
755
+ await this.waitForProjectCreation(project.id);
756
+ console.log(chalk.green(`✅ Project created: ${projectName} (ID: ${project.id})`));
757
+ return {
758
+ id: project.id,
759
+ name: projectName,
760
+ description: description,
761
+ };
762
+ }
763
+ catch (error) {
764
+ console.error(chalk.red(`❌ Failed to create project: ${error.message}`));
765
+ throw error;
766
+ }
767
+ }
768
+ /**
769
+ * Wait for project creation to complete
770
+ */
771
+ async waitForProjectCreation(projectId, maxAttempts = 10) {
772
+ for (let i = 0; i < maxAttempts; i++) {
773
+ try {
774
+ const operation = await this.callAzureDevOpsApi(`operations/${projectId}?api-version=7.0`);
775
+ if (operation.status === 'succeeded') {
776
+ return;
777
+ }
778
+ if (operation.status === 'failed') {
779
+ throw new Error('Project creation failed');
780
+ }
781
+ // Wait 2 seconds before next check
782
+ await new Promise(resolve => setTimeout(resolve, 2000));
783
+ }
784
+ catch (error) {
785
+ // Operation might not exist yet, continue waiting
786
+ await new Promise(resolve => setTimeout(resolve, 2000));
787
+ }
788
+ }
789
+ // Project creation timeout is not fatal - it might still succeed
790
+ console.log(chalk.yellow('⚠️ Project creation may still be in progress'));
791
+ }
792
+ /**
793
+ * Create area path in project
794
+ */
795
+ async createAreaPath(projectName, areaName) {
796
+ console.log(chalk.blue(` 📦 Creating area path: ${projectName}\\${areaName}...`));
797
+ const body = {
798
+ name: areaName
799
+ };
800
+ try {
801
+ const area = await this.callAzureDevOpsApi(`wit/classificationnodes/areas?projectId=${encodeURIComponent(projectName)}&api-version=7.0`, 'POST', body);
802
+ console.log(chalk.green(` ✅ Area path created: ${projectName}\\${areaName}`));
803
+ return {
804
+ id: area.id,
805
+ name: area.name,
806
+ path: area.path,
807
+ };
808
+ }
809
+ catch (error) {
810
+ console.error(chalk.red(` ❌ Failed to create area path: ${error.message}`));
811
+ throw error;
812
+ }
813
+ }
814
+ /**
815
+ * Fetch teams in project
816
+ */
817
+ async fetchTeams(projectName) {
818
+ try {
819
+ const response = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`);
820
+ return response.value.map((t) => ({
821
+ id: t.id,
822
+ name: t.name,
823
+ description: t.description || '',
824
+ }));
825
+ }
826
+ catch (error) {
827
+ return [];
828
+ }
829
+ }
830
+ /**
831
+ * Create team in project
832
+ */
833
+ async createTeam(projectName, teamName) {
834
+ console.log(chalk.blue(` 📦 Creating team: ${teamName}...`));
835
+ const body = {
836
+ name: teamName,
837
+ description: `${teamName} development team`
838
+ };
839
+ try {
840
+ const team = await this.callAzureDevOpsApi(`projects/${encodeURIComponent(projectName)}/teams?api-version=7.0`, 'POST', body);
841
+ console.log(chalk.green(` ✅ Team created: ${teamName}`));
842
+ return {
843
+ id: team.id,
844
+ name: team.name,
845
+ description: team.description || '',
846
+ };
847
+ }
848
+ catch (error) {
849
+ console.error(chalk.red(` ❌ Failed to create team: ${error.message}`));
850
+ throw error;
851
+ }
852
+ }
853
+ /**
854
+ * Validate and fix Azure DevOps configuration
855
+ */
856
+ async validate() {
857
+ console.log(chalk.blue('\n🔍 Validating Azure DevOps configuration...\n'));
858
+ const env = this.loadEnv();
859
+ const strategy = (env.AZURE_DEVOPS_STRATEGY || 'project-per-team');
860
+ const result = {
861
+ valid: true,
862
+ strategy,
863
+ projects: [],
864
+ envUpdated: false,
865
+ };
866
+ // Determine project names based on strategy
867
+ let projectNames = [];
868
+ if (strategy === 'project-per-team') {
869
+ // Multiple projects
870
+ const projectsEnv = env.AZURE_DEVOPS_PROJECTS || '';
871
+ if (!projectsEnv) {
872
+ console.log(chalk.red('❌ AZURE_DEVOPS_PROJECTS not found in .env'));
873
+ result.valid = false;
874
+ return result;
875
+ }
876
+ projectNames = projectsEnv.split(',').map(p => p.trim()).filter(p => p);
877
+ }
878
+ else {
879
+ // Single project (area-path-based or team-based)
880
+ const projectName = env.AZURE_DEVOPS_PROJECT;
881
+ if (!projectName) {
882
+ console.log(chalk.red('❌ AZURE_DEVOPS_PROJECT not found in .env'));
883
+ result.valid = false;
884
+ return result;
885
+ }
886
+ projectNames = [projectName];
887
+ }
888
+ console.log(chalk.gray(`Strategy: ${strategy}`));
889
+ console.log(chalk.gray(`Checking project(s): ${projectNames.join(', ')}...\n`));
890
+ // NEW: Validate per-project var naming (detect orphaned configs)
891
+ const perProjectVars = Object.keys(env).filter(key => key.startsWith('AZURE_DEVOPS_AREA_PATHS_') || key.startsWith('AZURE_DEVOPS_TEAMS_'));
892
+ for (const varName of perProjectVars) {
893
+ const projectFromVar = varName.includes('_AREA_PATHS_')
894
+ ? varName.split('_AREA_PATHS_')[1]
895
+ : varName.split('_TEAMS_')[1];
896
+ if (!projectNames.includes(projectFromVar)) {
897
+ console.log(chalk.yellow(`⚠️ Configuration warning: ${varName}`));
898
+ console.log(chalk.gray(` Project "${projectFromVar}" not found in AZURE_DEVOPS_PROJECTS`));
899
+ console.log(chalk.gray(` Expected projects: ${projectNames.join(', ')}`));
900
+ console.log(chalk.gray(` This configuration will be ignored.\n`));
901
+ }
902
+ }
903
+ // 1. Validate projects
904
+ for (const projectName of projectNames) {
905
+ const project = await this.checkProject(projectName);
906
+ if (!project) {
907
+ console.log(chalk.yellow(`⚠️ Project "${projectName}" not found\n`));
908
+ // Fetch existing projects
909
+ const existingProjects = await this.fetchProjects();
910
+ // Prompt user
911
+ const { action } = await inquirer.prompt([
912
+ {
913
+ type: 'list',
914
+ name: 'action',
915
+ message: `What would you like to do for project "${projectName}"?`,
916
+ choices: [
917
+ { name: 'Select an existing project', value: 'select' },
918
+ { name: 'Create a new project', value: 'create' },
919
+ { name: 'Skip this project', value: 'skip' },
920
+ { name: 'Cancel validation', value: 'cancel' },
921
+ ],
922
+ },
923
+ ]);
924
+ if (action === 'cancel') {
925
+ result.valid = false;
926
+ return result;
927
+ }
928
+ if (action === 'skip') {
929
+ console.log(chalk.yellow(`⏭️ Skipped project "${projectName}"\n`));
930
+ result.projects.push({ name: projectName, exists: false, created: false });
931
+ continue;
932
+ }
933
+ if (action === 'select') {
934
+ const { selectedProject } = await inquirer.prompt([
935
+ {
936
+ type: 'list',
937
+ name: 'selectedProject',
938
+ message: 'Select a project:',
939
+ choices: existingProjects.map((p) => ({
940
+ name: `${p.name}${p.description ? ` - ${p.description}` : ''}`,
941
+ value: p.name,
942
+ })),
943
+ },
944
+ ]);
945
+ // Fetch full project details
946
+ const selectedProjectDetails = await this.checkProject(selectedProject);
947
+ if (!selectedProjectDetails) {
948
+ console.log(chalk.red(`❌ Failed to fetch details for project "${selectedProject}"\n`));
949
+ continue;
950
+ }
951
+ // Update .env
952
+ if (strategy === 'project-per-team') {
953
+ const updatedNames = projectNames.map(n => n === projectName ? selectedProject : n);
954
+ await this.updateEnv({ AZURE_DEVOPS_PROJECTS: updatedNames.join(',') });
955
+ }
956
+ else {
957
+ await this.updateEnv({ AZURE_DEVOPS_PROJECT: selectedProject });
958
+ }
959
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(selectedProject)}`;
960
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
961
+ console.log(chalk.green(`✅ Project "${selectedProject}" selected\n`));
962
+ result.projects.push({
963
+ name: selectedProject,
964
+ id: selectedProjectDetails.id,
965
+ exists: true,
966
+ created: false,
967
+ });
968
+ result.envUpdated = true;
969
+ }
970
+ else if (action === 'create') {
971
+ const { description } = await inquirer.prompt([
972
+ {
973
+ type: 'input',
974
+ name: 'description',
975
+ message: 'Enter project description (optional):',
976
+ default: `${projectName} project`,
977
+ },
978
+ ]);
979
+ const newProject = await this.createProject(projectName, description);
980
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(newProject.name)}`;
981
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}\n`));
982
+ result.projects.push({
983
+ name: newProject.name,
984
+ id: newProject.id,
985
+ exists: true,
986
+ created: true,
987
+ });
988
+ }
989
+ }
990
+ else {
991
+ console.log(chalk.green(`✅ Validated: Project "${projectName}" exists`));
992
+ const projectUrl = `https://dev.azure.com/${this.organization}/${encodeURIComponent(project.name)}`;
993
+ console.log(chalk.cyan(`🔗 View in Azure DevOps: ${projectUrl}`));
994
+ result.projects.push({
995
+ name: project.name,
996
+ id: project.id,
997
+ exists: true,
998
+ created: false,
999
+ });
1000
+ }
1001
+ }
1002
+ console.log(); // Empty line after project validation
1003
+ // 2. Validate area paths (per-project OR legacy area-path-based strategy)
1004
+ result.areaPaths = [];
1005
+ // NEW: Check for per-project area paths (AZURE_DEVOPS_AREA_PATHS_{ProjectName})
1006
+ let hasPerProjectAreaPaths = false;
1007
+ for (const projectName of projectNames) {
1008
+ const perProjectKey = `AZURE_DEVOPS_AREA_PATHS_${projectName}`;
1009
+ if (env[perProjectKey]) {
1010
+ hasPerProjectAreaPaths = true;
1011
+ break;
1012
+ }
1013
+ }
1014
+ if (hasPerProjectAreaPaths) {
1015
+ // Per-project area paths (NEW!)
1016
+ console.log(chalk.gray(`Checking per-project area paths...\n`));
1017
+ for (const projectName of projectNames) {
1018
+ const perProjectKey = `AZURE_DEVOPS_AREA_PATHS_${projectName}`;
1019
+ const areaPathsConfig = env[perProjectKey];
1020
+ if (areaPathsConfig) {
1021
+ const areaNames = areaPathsConfig.split(',').map(a => a.trim()).filter(a => a);
1022
+ if (areaNames.length > 0) {
1023
+ console.log(chalk.gray(` Project: ${projectName} (${areaNames.length} area paths)`));
1024
+ for (const areaName of areaNames) {
1025
+ try {
1026
+ await this.createAreaPath(projectName, areaName);
1027
+ result.areaPaths.push({
1028
+ name: areaName,
1029
+ project: projectName,
1030
+ exists: false,
1031
+ created: true
1032
+ });
1033
+ }
1034
+ catch (error) {
1035
+ if (error.message.includes('already exists')) {
1036
+ console.log(chalk.green(` ✅ Area path exists: ${projectName}\\${areaName}`));
1037
+ result.areaPaths.push({
1038
+ name: areaName,
1039
+ project: projectName,
1040
+ exists: true,
1041
+ created: false
1042
+ });
1043
+ }
1044
+ else {
1045
+ console.log(chalk.red(` ❌ Failed to create/validate area path: ${areaName}`));
1046
+ result.valid = false;
1047
+ }
1048
+ }
1049
+ }
1050
+ }
1051
+ }
1052
+ }
1053
+ console.log();
1054
+ }
1055
+ else if (strategy === 'area-path-based') {
1056
+ // Legacy: Global area paths (backward compatibility)
1057
+ const areaPathsConfig = env.AZURE_DEVOPS_AREA_PATHS || '';
1058
+ if (areaPathsConfig) {
1059
+ console.log(chalk.gray(`Checking area paths...`));
1060
+ const projectName = projectNames[0]; // Single project for area-path-based
1061
+ const areaNames = areaPathsConfig.split(',').map(a => a.trim());
1062
+ for (const areaName of areaNames) {
1063
+ // Check if area path exists (simplified - would need proper API call)
1064
+ // For now, we'll create them if they don't exist
1065
+ try {
1066
+ await this.createAreaPath(projectName, areaName);
1067
+ result.areaPaths.push({ name: areaName, exists: false, created: true });
1068
+ }
1069
+ catch (error) {
1070
+ if (error.message.includes('already exists')) {
1071
+ console.log(chalk.green(` ✅ Area path exists: ${projectName}\\${areaName}`));
1072
+ result.areaPaths.push({ name: areaName, exists: true, created: false });
1073
+ }
1074
+ else {
1075
+ console.log(chalk.red(` ❌ Failed to create/validate area path: ${areaName}`));
1076
+ result.valid = false;
1077
+ }
1078
+ }
1079
+ }
1080
+ console.log();
1081
+ }
1082
+ }
1083
+ // 3. Validate teams (per-project OR legacy team-based strategy)
1084
+ result.teams = [];
1085
+ // NEW: Check for per-project teams (AZURE_DEVOPS_TEAMS_{ProjectName})
1086
+ let hasPerProjectTeams = false;
1087
+ for (const projectName of projectNames) {
1088
+ const perProjectKey = `AZURE_DEVOPS_TEAMS_${projectName}`;
1089
+ if (env[perProjectKey]) {
1090
+ hasPerProjectTeams = true;
1091
+ break;
1092
+ }
1093
+ }
1094
+ if (hasPerProjectTeams) {
1095
+ // Per-project teams (NEW!)
1096
+ console.log(chalk.gray(`Checking per-project teams...\n`));
1097
+ for (const projectName of projectNames) {
1098
+ const perProjectKey = `AZURE_DEVOPS_TEAMS_${projectName}`;
1099
+ const teamsConfig = env[perProjectKey];
1100
+ if (teamsConfig) {
1101
+ const teamNames = teamsConfig.split(',').map(t => t.trim()).filter(t => t);
1102
+ if (teamNames.length > 0) {
1103
+ console.log(chalk.gray(` Project: ${projectName} (${teamNames.length} teams)`));
1104
+ const existingTeams = await this.fetchTeams(projectName);
1105
+ for (const teamName of teamNames) {
1106
+ const team = existingTeams.find(t => t.name === teamName);
1107
+ if (team) {
1108
+ console.log(chalk.green(` ✅ Team exists: ${teamName}`));
1109
+ result.teams.push({
1110
+ name: teamName,
1111
+ id: team.id,
1112
+ project: projectName,
1113
+ exists: true,
1114
+ created: false
1115
+ });
1116
+ }
1117
+ else {
1118
+ try {
1119
+ const newTeam = await this.createTeam(projectName, teamName);
1120
+ result.teams.push({
1121
+ name: teamName,
1122
+ id: newTeam.id,
1123
+ project: projectName,
1124
+ exists: false,
1125
+ created: true
1126
+ });
1127
+ }
1128
+ catch (error) {
1129
+ console.log(chalk.red(` ❌ Failed to create team: ${teamName}`));
1130
+ result.valid = false;
1131
+ }
1132
+ }
1133
+ }
1134
+ }
1135
+ }
1136
+ }
1137
+ console.log();
1138
+ }
1139
+ else if (strategy === 'team-based') {
1140
+ // Legacy: Global teams (backward compatibility)
1141
+ const teamsConfig = env.AZURE_DEVOPS_TEAMS || '';
1142
+ if (teamsConfig) {
1143
+ console.log(chalk.gray(`Checking teams...`));
1144
+ const projectName = projectNames[0]; // Single project for team-based
1145
+ const teamNames = teamsConfig.split(',').map(t => t.trim());
1146
+ const existingTeams = await this.fetchTeams(projectName);
1147
+ for (const teamName of teamNames) {
1148
+ const team = existingTeams.find(t => t.name === teamName);
1149
+ if (team) {
1150
+ console.log(chalk.green(` ✅ Team exists: ${teamName}`));
1151
+ result.teams.push({ name: teamName, id: team.id, exists: true, created: false });
1152
+ }
1153
+ else {
1154
+ try {
1155
+ const newTeam = await this.createTeam(projectName, teamName);
1156
+ result.teams.push({ name: teamName, id: newTeam.id, exists: false, created: true });
1157
+ }
1158
+ catch (error) {
1159
+ console.log(chalk.red(` ❌ Failed to create team: ${teamName}`));
1160
+ result.valid = false;
1161
+ }
1162
+ }
1163
+ }
1164
+ console.log();
1165
+ }
1166
+ }
1167
+ // Summary
1168
+ if (result.valid) {
1169
+ console.log(chalk.green(`✅ Azure DevOps configuration validated successfully\n`));
1170
+ }
1171
+ else {
1172
+ console.log(chalk.yellow(`⚠️ Some resources could not be validated\n`));
1173
+ }
1174
+ return result;
1175
+ }
1176
+ }
1177
+ // ============================================================================
1178
+ // Utility Functions
1179
+ // ============================================================================
1180
+ /**
1181
+ * Validate Jira resources
1182
+ */
1183
+ export async function validateJiraResources(envPath = '.env') {
1184
+ const validator = new JiraResourceValidator(envPath);
1185
+ return validator.validate();
1186
+ }
1187
+ /**
1188
+ * Validate Azure DevOps resources
1189
+ */
1190
+ export async function validateAzureDevOpsResources(envPath = '.env') {
1191
+ const validator = new AzureDevOpsResourceValidator(envPath);
1192
+ return validator.validate();
1193
+ }
1194
+ //# sourceMappingURL=external-resource-validator.js.map