specweave 0.29.1 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/README.md +65 -16
  2. package/bin/specweave.js +16 -0
  3. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
  4. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts.map +1 -1
  5. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
  6. package/dist/plugins/specweave-ado/lib/ado-spec-commit-sync.js.map +1 -1
  7. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts +1 -1
  8. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
  9. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
  10. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
  11. package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts +134 -0
  12. package/dist/plugins/specweave-ado/lib/conflict-resolver.d.ts.map +1 -0
  13. package/dist/plugins/specweave-ado/lib/conflict-resolver.js +423 -0
  14. package/dist/plugins/specweave-ado/lib/conflict-resolver.js.map +1 -0
  15. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts +23 -1
  16. package/dist/plugins/specweave-github/lib/github-client-v2.d.ts.map +1 -1
  17. package/dist/plugins/specweave-github/lib/github-client-v2.js +95 -0
  18. package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
  19. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
  20. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.d.ts.map +1 -1
  21. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
  22. package/dist/plugins/specweave-github/lib/github-spec-commit-sync.js.map +1 -1
  23. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts +1 -1
  24. package/dist/plugins/specweave-github/lib/github-spec-content-sync.d.ts.map +1 -1
  25. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
  26. package/dist/plugins/specweave-github/lib/github-spec-content-sync.js.map +1 -1
  27. package/dist/plugins/specweave-github/lib/types.d.ts +20 -0
  28. package/dist/plugins/specweave-github/lib/types.d.ts.map +1 -1
  29. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
  30. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts.map +1 -1
  31. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
  32. package/dist/plugins/specweave-jira/lib/jira-spec-commit-sync.js.map +1 -1
  33. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts +1 -1
  34. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.d.ts.map +1 -1
  35. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
  36. package/dist/plugins/specweave-jira/lib/jira-spec-content-sync.js.map +1 -1
  37. package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts +2 -2
  38. package/dist/plugins/specweave-jira/lib/setup-wizard.d.ts.map +1 -1
  39. package/dist/plugins/specweave-jira/lib/setup-wizard.js +1 -1
  40. package/dist/plugins/specweave-jira/lib/setup-wizard.js.map +1 -1
  41. package/dist/src/adapters/claude/adapter.js +1 -1
  42. package/dist/src/adapters/claude/adapter.js.map +1 -1
  43. package/dist/src/cli/commands/detect-project.js +1 -1
  44. package/dist/src/cli/commands/detect-project.js.map +1 -1
  45. package/dist/src/cli/commands/detect-specs.js +1 -1
  46. package/dist/src/cli/commands/detect-specs.js.map +1 -1
  47. package/dist/src/cli/commands/import-docs.js +1 -1
  48. package/dist/src/cli/commands/import-docs.js.map +1 -1
  49. package/dist/src/cli/commands/init-multiproject.js +1 -1
  50. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  51. package/dist/src/cli/commands/init.d.ts.map +1 -1
  52. package/dist/src/cli/commands/init.js +31 -1
  53. package/dist/src/cli/commands/init.js.map +1 -1
  54. package/dist/src/cli/commands/jobs.js +15 -1
  55. package/dist/src/cli/commands/jobs.js.map +1 -1
  56. package/dist/src/cli/commands/migrate-to-multiproject.js +1 -1
  57. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  58. package/dist/src/cli/commands/switch-project.js +1 -1
  59. package/dist/src/cli/commands/switch-project.js.map +1 -1
  60. package/dist/src/cli/commands/sync-scheduled.d.ts +38 -0
  61. package/dist/src/cli/commands/sync-scheduled.d.ts.map +1 -0
  62. package/dist/src/cli/commands/sync-scheduled.js +170 -0
  63. package/dist/src/cli/commands/sync-scheduled.js.map +1 -0
  64. package/dist/src/cli/helpers/init/external-import-grouping.d.ts +53 -0
  65. package/dist/src/cli/helpers/init/external-import-grouping.d.ts.map +1 -0
  66. package/dist/src/cli/helpers/init/external-import-grouping.js +287 -0
  67. package/dist/src/cli/helpers/init/external-import-grouping.js.map +1 -0
  68. package/dist/src/cli/helpers/init/external-import.d.ts +1 -34
  69. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  70. package/dist/src/cli/helpers/init/external-import.js +15 -486
  71. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  72. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +58 -0
  73. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -0
  74. package/dist/src/cli/helpers/init/living-docs-preflight.js +290 -0
  75. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -0
  76. package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts +48 -0
  77. package/dist/src/cli/helpers/init/sync-profile-helpers.d.ts.map +1 -0
  78. package/dist/src/cli/helpers/init/sync-profile-helpers.js +238 -0
  79. package/dist/src/cli/helpers/init/sync-profile-helpers.js.map +1 -0
  80. package/dist/src/cli/helpers/init/types.d.ts +1 -0
  81. package/dist/src/cli/helpers/init/types.d.ts.map +1 -1
  82. package/dist/src/cli/helpers/issue-tracker/ado.d.ts.map +1 -1
  83. package/dist/src/cli/helpers/issue-tracker/ado.js +113 -3
  84. package/dist/src/cli/helpers/issue-tracker/ado.js.map +1 -1
  85. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  86. package/dist/src/cli/helpers/issue-tracker/index.js +2 -287
  87. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  88. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts +25 -0
  89. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.d.ts.map +1 -0
  90. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js +306 -0
  91. package/dist/src/cli/helpers/issue-tracker/sync-config-writer.js.map +1 -0
  92. package/dist/src/cli/helpers/issue-tracker/types.d.ts +27 -0
  93. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  94. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  95. package/dist/src/cli/workers/living-docs-worker.d.ts +16 -0
  96. package/dist/src/cli/workers/living-docs-worker.d.ts.map +1 -0
  97. package/dist/src/cli/workers/living-docs-worker.js +395 -0
  98. package/dist/src/cli/workers/living-docs-worker.js.map +1 -0
  99. package/dist/src/core/background/job-dependency.d.ts +45 -0
  100. package/dist/src/core/background/job-dependency.d.ts.map +1 -0
  101. package/dist/src/core/background/job-dependency.js +144 -0
  102. package/dist/src/core/background/job-dependency.js.map +1 -0
  103. package/dist/src/core/background/job-launcher.d.ts +21 -1
  104. package/dist/src/core/background/job-launcher.d.ts.map +1 -1
  105. package/dist/src/core/background/job-launcher.js +93 -0
  106. package/dist/src/core/background/job-launcher.js.map +1 -1
  107. package/dist/src/core/background/types.d.ts +73 -2
  108. package/dist/src/core/background/types.d.ts.map +1 -1
  109. package/dist/src/core/brownfield/importer.js +1 -1
  110. package/dist/src/core/brownfield/importer.js.map +1 -1
  111. package/dist/src/core/comment-builder.d.ts +1 -1
  112. package/dist/src/core/comment-builder.d.ts.map +1 -1
  113. package/dist/src/core/{cost-tracker.d.ts → cost/cost-tracker.d.ts} +2 -2
  114. package/dist/src/core/cost/cost-tracker.d.ts.map +1 -0
  115. package/dist/src/core/{cost-tracker.js → cost/cost-tracker.js} +2 -2
  116. package/dist/src/core/cost/cost-tracker.js.map +1 -0
  117. package/dist/src/core/credentials/credentials-manager.d.ts.map +1 -0
  118. package/dist/src/core/credentials/credentials-manager.js.map +1 -0
  119. package/dist/src/core/increment/discipline-checker.js +1 -1
  120. package/dist/src/core/increment/discipline-checker.js.map +1 -1
  121. package/dist/src/core/increment/increment-archiver.d.ts +9 -8
  122. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  123. package/dist/src/core/increment/increment-archiver.js +40 -42
  124. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  125. package/dist/src/core/increment/increment-status.d.ts.map +1 -0
  126. package/dist/src/core/{increment-status.js → increment/increment-status.js} +1 -1
  127. package/dist/src/core/increment/increment-status.js.map +1 -0
  128. package/dist/src/core/increment/increment-utils.d.ts.map +1 -0
  129. package/dist/src/core/increment/increment-utils.js.map +1 -0
  130. package/dist/src/core/increment/metadata-validator.js +1 -1
  131. package/dist/src/core/increment/metadata-validator.js.map +1 -1
  132. package/dist/src/core/living-docs/checkpoint-manager.d.ts +120 -0
  133. package/dist/src/core/living-docs/checkpoint-manager.d.ts.map +1 -0
  134. package/dist/src/core/living-docs/checkpoint-manager.js +231 -0
  135. package/dist/src/core/living-docs/checkpoint-manager.js.map +1 -0
  136. package/dist/src/core/living-docs/discovery.d.ts +91 -0
  137. package/dist/src/core/living-docs/discovery.d.ts.map +1 -0
  138. package/dist/src/core/living-docs/discovery.js +656 -0
  139. package/dist/src/core/living-docs/discovery.js.map +1 -0
  140. package/dist/src/core/living-docs/feature-archiver.d.ts +23 -4
  141. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  142. package/dist/src/core/living-docs/feature-archiver.js +133 -30
  143. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  144. package/dist/src/core/living-docs/foundation-builder.d.ts +37 -0
  145. package/dist/src/core/living-docs/foundation-builder.d.ts.map +1 -0
  146. package/dist/src/core/living-docs/foundation-builder.js +357 -0
  147. package/dist/src/core/living-docs/foundation-builder.js.map +1 -0
  148. package/dist/src/core/living-docs/living-docs-sync.d.ts +58 -0
  149. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  150. package/dist/src/core/living-docs/living-docs-sync.js +204 -7
  151. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  152. package/dist/src/core/living-docs/module-analyzer.d.ts +97 -0
  153. package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -0
  154. package/dist/src/core/living-docs/module-analyzer.js +427 -0
  155. package/dist/src/core/living-docs/module-analyzer.js.map +1 -0
  156. package/dist/src/core/living-docs/suggestions-generator.d.ts +112 -0
  157. package/dist/src/core/living-docs/suggestions-generator.d.ts.map +1 -0
  158. package/dist/src/core/living-docs/suggestions-generator.js +362 -0
  159. package/dist/src/core/living-docs/suggestions-generator.js.map +1 -0
  160. package/dist/src/core/living-docs/workitem-matcher.d.ts +116 -0
  161. package/dist/src/core/living-docs/workitem-matcher.d.ts.map +1 -0
  162. package/dist/src/core/living-docs/workitem-matcher.js +356 -0
  163. package/dist/src/core/living-docs/workitem-matcher.js.map +1 -0
  164. package/dist/src/core/{plugin-loader.d.ts → plugins/plugin-loader.d.ts} +1 -1
  165. package/dist/src/core/plugins/plugin-loader.d.ts.map +1 -0
  166. package/dist/src/core/{plugin-loader.js → plugins/plugin-loader.js} +2 -2
  167. package/dist/src/core/plugins/plugin-loader.js.map +1 -0
  168. package/dist/src/core/{project-manager.d.ts → project/project-manager.d.ts} +1 -1
  169. package/dist/src/core/project/project-manager.d.ts.map +1 -0
  170. package/dist/src/core/{project-manager.js → project/project-manager.js} +3 -3
  171. package/dist/src/core/project/project-manager.js.map +1 -0
  172. package/dist/src/core/project/project-structure-detector.d.ts.map +1 -0
  173. package/dist/src/core/project/project-structure-detector.js.map +1 -0
  174. package/dist/src/core/{rfc-generator-v2.d.ts → rfc/rfc-generator-v2.d.ts} +1 -1
  175. package/dist/src/core/rfc/rfc-generator-v2.d.ts.map +1 -0
  176. package/dist/src/core/{rfc-generator-v2.js → rfc/rfc-generator-v2.js} +1 -1
  177. package/dist/src/core/rfc/rfc-generator-v2.js.map +1 -0
  178. package/dist/src/core/scheduler/index.d.ts +1 -0
  179. package/dist/src/core/scheduler/index.d.ts.map +1 -1
  180. package/dist/src/core/scheduler/index.js +1 -0
  181. package/dist/src/core/scheduler/index.js.map +1 -1
  182. package/dist/src/core/scheduler/scheduled-job.d.ts +1 -1
  183. package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -1
  184. package/dist/src/core/scheduler/scheduled-job.js.map +1 -1
  185. package/dist/src/core/scheduler/session-sync-executor.d.ts +138 -0
  186. package/dist/src/core/scheduler/session-sync-executor.d.ts.map +1 -0
  187. package/dist/src/core/scheduler/session-sync-executor.js +333 -0
  188. package/dist/src/core/scheduler/session-sync-executor.js.map +1 -0
  189. package/dist/src/core/{spec-content-sync.d.ts → specs/spec-content-sync.d.ts} +2 -2
  190. package/dist/src/core/specs/spec-content-sync.d.ts.map +1 -0
  191. package/dist/src/core/{spec-content-sync.js → specs/spec-content-sync.js} +1 -1
  192. package/dist/src/core/specs/spec-content-sync.js.map +1 -0
  193. package/dist/src/core/{spec-detector.d.ts → specs/spec-detector.d.ts} +1 -1
  194. package/dist/src/core/specs/spec-detector.d.ts.map +1 -0
  195. package/dist/src/core/{spec-detector.js → specs/spec-detector.js} +1 -1
  196. package/dist/src/core/specs/spec-detector.js.map +1 -0
  197. package/dist/src/core/{spec-identifier-detector.d.ts → specs/spec-identifier-detector.d.ts} +2 -2
  198. package/dist/src/core/specs/spec-identifier-detector.d.ts.map +1 -0
  199. package/dist/src/core/{spec-identifier-detector.js → specs/spec-identifier-detector.js} +1 -1
  200. package/dist/src/core/specs/spec-identifier-detector.js.map +1 -0
  201. package/dist/src/core/specs/spec-metadata-manager.js +1 -1
  202. package/dist/src/core/specs/spec-metadata-manager.js.map +1 -1
  203. package/dist/src/core/specs/spec-task-mapper.d.ts.map +1 -0
  204. package/dist/src/core/specs/spec-task-mapper.js.map +1 -0
  205. package/dist/src/core/sync/sync-audit-logger.d.ts +62 -0
  206. package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -1
  207. package/dist/src/core/sync/sync-audit-logger.js +59 -0
  208. package/dist/src/core/sync/sync-audit-logger.js.map +1 -1
  209. package/dist/src/importers/item-converter.d.ts +51 -27
  210. package/dist/src/importers/item-converter.d.ts.map +1 -1
  211. package/dist/src/importers/item-converter.js +219 -179
  212. package/dist/src/importers/item-converter.js.map +1 -1
  213. package/dist/src/importers/markdown-generator.d.ts +75 -0
  214. package/dist/src/importers/markdown-generator.d.ts.map +1 -0
  215. package/dist/src/importers/markdown-generator.js +250 -0
  216. package/dist/src/importers/markdown-generator.js.map +1 -0
  217. package/dist/src/integrations/ado/ado-client.d.ts +93 -0
  218. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  219. package/dist/src/integrations/ado/ado-client.js +172 -1
  220. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  221. package/dist/src/integrations/jira/jira-client.d.ts +44 -0
  222. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  223. package/dist/src/integrations/jira/jira-client.js +119 -1
  224. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  225. package/dist/src/integrations/jira/jira-incremental-mapper.js +2 -2
  226. package/dist/src/integrations/jira/jira-incremental-mapper.js.map +1 -1
  227. package/dist/src/integrations/jira/jira-mapper.js +1 -1
  228. package/dist/src/integrations/jira/jira-mapper.js.map +1 -1
  229. package/dist/src/living-docs/epic-id-allocator.d.ts +177 -0
  230. package/dist/src/living-docs/epic-id-allocator.d.ts.map +1 -0
  231. package/dist/src/living-docs/epic-id-allocator.js +363 -0
  232. package/dist/src/living-docs/epic-id-allocator.js.map +1 -0
  233. package/dist/src/sync/external-change-puller.d.ts +94 -0
  234. package/dist/src/sync/external-change-puller.d.ts.map +1 -0
  235. package/dist/src/sync/external-change-puller.js +181 -0
  236. package/dist/src/sync/external-change-puller.js.map +1 -0
  237. package/dist/src/sync/index.d.ts +4 -0
  238. package/dist/src/sync/index.d.ts.map +1 -1
  239. package/dist/src/sync/index.js +2 -0
  240. package/dist/src/sync/index.js.map +1 -1
  241. package/dist/src/sync/living-docs-updater.d.ts +93 -0
  242. package/dist/src/sync/living-docs-updater.d.ts.map +1 -0
  243. package/dist/src/sync/living-docs-updater.js +218 -0
  244. package/dist/src/sync/living-docs-updater.js.map +1 -0
  245. package/dist/src/testing/test-generator.js +1 -1
  246. package/dist/src/testing/test-generator.js.map +1 -1
  247. package/dist/src/utils/cost-reporter.d.ts +1 -1
  248. package/dist/src/utils/cost-reporter.d.ts.map +1 -1
  249. package/dist/src/utils/model-selection.js +4 -4
  250. package/dist/src/utils/model-selection.js.map +1 -1
  251. package/dist/src/utils/pricing-constants.d.ts +2 -2
  252. package/dist/src/utils/pricing-constants.js +2 -2
  253. package/package.json +1 -1
  254. package/plugins/specweave/.claude-plugin/plugin.json +1 -28
  255. package/plugins/specweave/agents/code-standards-detective/AGENT.md +3 -3
  256. package/plugins/specweave/agents/infrastructure/AGENT.md +4 -0
  257. package/plugins/specweave/agents/performance/AGENT.md +2 -2
  258. package/plugins/specweave/agents/reflective-reviewer/AGENT.md +3 -3
  259. package/plugins/specweave/agents/translator/AGENT.md +2 -2
  260. package/plugins/specweave/commands/specweave-costs.md +2 -2
  261. package/plugins/specweave/commands/specweave-do.md +2 -2
  262. package/plugins/specweave/hooks/lib/scheduler-startup.sh +59 -8
  263. package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
  264. package/plugins/specweave/skills/role-orchestrator/README.md +1 -1
  265. package/plugins/specweave-ado/agents/ado-manager/AGENT.md +8 -2
  266. package/plugins/specweave-ado/agents/ado-multi-project-mapper/AGENT.md +2 -2
  267. package/plugins/specweave-ado/agents/ado-sync-judge/AGENT.md +2 -2
  268. package/plugins/specweave-ado/lib/ado-spec-commit-sync.d.ts +1 -1
  269. package/plugins/specweave-ado/lib/ado-spec-commit-sync.js +1 -1
  270. package/plugins/specweave-ado/lib/ado-spec-commit-sync.ts +1 -1
  271. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +1 -1
  272. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +1 -1
  273. package/plugins/specweave-ado/lib/conflict-resolver.js +87 -0
  274. package/plugins/specweave-ado/lib/conflict-resolver.ts +124 -0
  275. package/plugins/specweave-ado/skills/specweave-ado-mapper/SKILL.md +1 -1
  276. package/plugins/specweave-backend/agents/database-optimizer/AGENT.md +3 -3
  277. package/plugins/specweave-backend/skills/dotnet-backend/SKILL.md +1 -1
  278. package/plugins/specweave-backend/skills/nodejs-backend/SKILL.md +1 -1
  279. package/plugins/specweave-backend/skills/python-backend/SKILL.md +1 -1
  280. package/plugins/specweave-confluent/agents/confluent-architect/AGENT.md +6 -1
  281. package/plugins/specweave-diagrams/agents/diagrams-architect/AGENT.md +2 -2
  282. package/plugins/specweave-diagrams/skills/diagrams-architect/SKILL.md +1 -1
  283. package/plugins/specweave-frontend/agents/frontend-architect/AGENT.md +4 -0
  284. package/plugins/specweave-github/agents/github-manager/AGENT.md +1 -1
  285. package/plugins/specweave-github/agents/github-task-splitter/AGENT.md +11 -1
  286. package/plugins/specweave-github/agents/user-story-updater/AGENT.md +6 -1
  287. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +96 -0
  288. package/plugins/specweave-github/lib/github-client-v2.js +97 -0
  289. package/plugins/specweave-github/lib/github-client-v2.ts +115 -1
  290. package/plugins/specweave-github/lib/github-spec-commit-sync.d.ts +1 -1
  291. package/plugins/specweave-github/lib/github-spec-commit-sync.js +1 -1
  292. package/plugins/specweave-github/lib/github-spec-commit-sync.ts +1 -1
  293. package/plugins/specweave-github/lib/github-spec-content-sync.js +1 -1
  294. package/plugins/specweave-github/lib/github-spec-content-sync.ts +1 -1
  295. package/plugins/specweave-github/lib/types.ts +21 -0
  296. package/plugins/specweave-infrastructure/agents/devops/AGENT.md +1 -1
  297. package/plugins/specweave-infrastructure/agents/network-engineer/AGENT.md +3 -3
  298. package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +2 -2
  299. package/plugins/specweave-infrastructure/agents/performance-engineer/AGENT.md +3 -3
  300. package/plugins/specweave-infrastructure/agents/sre/AGENT.md +2 -2
  301. package/plugins/specweave-jira/agents/jira-manager/AGENT.md +11 -1
  302. package/plugins/specweave-jira/commands/import-projects.js +1 -1
  303. package/plugins/specweave-jira/commands/import-projects.ts +1 -1
  304. package/plugins/specweave-jira/lib/jira-spec-commit-sync.d.ts +1 -1
  305. package/plugins/specweave-jira/lib/jira-spec-commit-sync.js +1 -1
  306. package/plugins/specweave-jira/lib/jira-spec-commit-sync.ts +1 -1
  307. package/plugins/specweave-jira/lib/jira-spec-content-sync.js +1 -1
  308. package/plugins/specweave-jira/lib/jira-spec-content-sync.ts +1 -1
  309. package/plugins/specweave-jira/lib/setup-wizard.js +2 -2
  310. package/plugins/specweave-jira/lib/setup-wizard.ts +2 -2
  311. package/plugins/specweave-jira/skills/specweave-jira-mapper/SKILL.md +1 -1
  312. package/plugins/specweave-kafka/agents/kafka-architect/AGENT.md +5 -1
  313. package/plugins/specweave-kafka/agents/kafka-devops/AGENT.md +6 -1
  314. package/plugins/specweave-kafka/agents/kafka-observability/AGENT.md +6 -1
  315. package/plugins/specweave-kubernetes/agents/kubernetes-architect/AGENT.md +3 -3
  316. package/plugins/specweave-ml/agents/data-scientist/AGENT.md +2 -1
  317. package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +2 -1
  318. package/plugins/specweave-ml/agents/mlops-engineer/AGENT.md +3 -3
  319. package/plugins/specweave-mobile/agents/mobile-architect/AGENT.md +6 -1
  320. package/plugins/specweave-payments/agents/payment-integration/AGENT.md +3 -3
  321. package/plugins/specweave-release/agents/release-manager/AGENT.md +6 -1
  322. package/plugins/specweave-release/commands/specweave-release-npm.md +8 -0
  323. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +144 -0
  324. package/plugins/specweave-testing/agents/qa-engineer/AGENT.md +5 -0
  325. package/src/templates/AGENTS.md.template +97 -0
  326. package/dist/src/core/cost-tracker.d.ts.map +0 -1
  327. package/dist/src/core/cost-tracker.js.map +0 -1
  328. package/dist/src/core/credentials-manager.d.ts.map +0 -1
  329. package/dist/src/core/credentials-manager.js.map +0 -1
  330. package/dist/src/core/increment-status.d.ts.map +0 -1
  331. package/dist/src/core/increment-status.js.map +0 -1
  332. package/dist/src/core/increment-utils.d.ts.map +0 -1
  333. package/dist/src/core/increment-utils.js.map +0 -1
  334. package/dist/src/core/plugin-loader.d.ts.map +0 -1
  335. package/dist/src/core/plugin-loader.js.map +0 -1
  336. package/dist/src/core/project-manager.d.ts.map +0 -1
  337. package/dist/src/core/project-manager.js.map +0 -1
  338. package/dist/src/core/project-structure-detector.d.ts.map +0 -1
  339. package/dist/src/core/project-structure-detector.js.map +0 -1
  340. package/dist/src/core/rfc-generator-v2.d.ts.map +0 -1
  341. package/dist/src/core/rfc-generator-v2.js.map +0 -1
  342. package/dist/src/core/spec-content-sync.d.ts.map +0 -1
  343. package/dist/src/core/spec-content-sync.js.map +0 -1
  344. package/dist/src/core/spec-detector.d.ts.map +0 -1
  345. package/dist/src/core/spec-detector.js.map +0 -1
  346. package/dist/src/core/spec-identifier-detector.d.ts.map +0 -1
  347. package/dist/src/core/spec-identifier-detector.js.map +0 -1
  348. package/dist/src/core/spec-task-mapper.d.ts.map +0 -1
  349. package/dist/src/core/spec-task-mapper.js.map +0 -1
  350. package/dist/src/utils/spec-parser.d.ts +0 -145
  351. package/dist/src/utils/spec-parser.d.ts.map +0 -1
  352. package/dist/src/utils/spec-parser.js +0 -640
  353. package/dist/src/utils/spec-parser.js.map +0 -1
  354. package/plugins/specweave/agents/pm/AGENT.md.bak2 +0 -1754
  355. package/plugins/specweave/hooks/hooks.json.bak +0 -72
  356. package/plugins/specweave/hooks/hooks.json.v1-backup +0 -16
  357. package/plugins/specweave/hooks/v2/hooks.json +0 -16
  358. /package/dist/src/core/{credentials-manager.d.ts → credentials/credentials-manager.d.ts} +0 -0
  359. /package/dist/src/core/{credentials-manager.js → credentials/credentials-manager.js} +0 -0
  360. /package/dist/src/core/{increment-status.d.ts → increment/increment-status.d.ts} +0 -0
  361. /package/dist/src/core/{increment-utils.d.ts → increment/increment-utils.d.ts} +0 -0
  362. /package/dist/src/core/{increment-utils.js → increment/increment-utils.js} +0 -0
  363. /package/dist/src/core/{project-structure-detector.d.ts → project/project-structure-detector.d.ts} +0 -0
  364. /package/dist/src/core/{project-structure-detector.js → project/project-structure-detector.js} +0 -0
  365. /package/dist/src/core/{spec-task-mapper.d.ts → specs/spec-task-mapper.d.ts} +0 -0
  366. /package/dist/src/core/{spec-task-mapper.js → specs/spec-task-mapper.js} +0 -0
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Sync Scheduled Command
3
+ *
4
+ * Executes due scheduled sync jobs. Designed for:
5
+ * 1. Cron jobs (periodic execution)
6
+ * 2. Manual invocation
7
+ * 3. CI/CD pipelines
8
+ *
9
+ * Usage:
10
+ * specweave sync-scheduled # Execute due jobs
11
+ * specweave sync-scheduled --dry-run # Show what would run
12
+ * specweave sync-scheduled --force # Run all jobs (ignore schedule)
13
+ *
14
+ * Cron example (every 15 minutes):
15
+ * 0,15,30,45 * * * * cd /path/to/project && npx specweave sync-scheduled
16
+ *
17
+ * @module cli/commands/sync-scheduled
18
+ */
19
+ import { Command } from 'commander';
20
+ import path from 'path';
21
+ import { SessionSyncExecutor, } from '../../core/scheduler/session-sync-executor.js';
22
+ import { SchedulePersistence } from '../../core/scheduler/schedule-persistence.js';
23
+ import { consoleLogger } from '../../utils/logger.js';
24
+ /**
25
+ * Create the sync-scheduled command
26
+ */
27
+ export function createSyncScheduledCommand(options = {}) {
28
+ const logger = options.logger ?? consoleLogger;
29
+ const specweavePath = options.specweavePath ?? path.join(process.cwd(), '.specweave');
30
+ const projectRoot = path.dirname(specweavePath);
31
+ const command = new Command('sync-scheduled')
32
+ .description('Execute due scheduled sync jobs (for cron/CI use)')
33
+ .option('--dry-run', 'Show what would run without executing')
34
+ .option('--force', 'Run all sync jobs regardless of schedule')
35
+ .option('--json', 'Output as JSON')
36
+ .option('--silent', 'Suppress output (for cron)')
37
+ .action(async (opts) => {
38
+ try {
39
+ if (opts.force) {
40
+ await runForcedSync(projectRoot, opts, logger);
41
+ }
42
+ else {
43
+ await runScheduledSync(projectRoot, opts, logger);
44
+ }
45
+ }
46
+ catch (error) {
47
+ if (!opts.silent) {
48
+ logger.error(`Sync failed: ${error}`);
49
+ }
50
+ process.exit(1);
51
+ }
52
+ });
53
+ return command;
54
+ }
55
+ /**
56
+ * Run scheduled sync (only due jobs)
57
+ */
58
+ async function runScheduledSync(projectRoot, opts, logger) {
59
+ const executor = new SessionSyncExecutor({
60
+ projectRoot,
61
+ logger: opts.silent ? createSilentLogger() : logger,
62
+ dryRun: opts.dryRun,
63
+ maxJobsPerSession: 10, // Allow more jobs for cron
64
+ });
65
+ const result = await executor.executeDueJobs();
66
+ if (opts.json) {
67
+ console.log(JSON.stringify(result, null, 2));
68
+ return;
69
+ }
70
+ if (opts.silent) {
71
+ return;
72
+ }
73
+ // Human-readable output
74
+ printResult(result, opts.dryRun);
75
+ }
76
+ /**
77
+ * Run forced sync (all jobs regardless of schedule)
78
+ */
79
+ async function runForcedSync(projectRoot, opts, logger) {
80
+ const specweavePath = path.join(projectRoot, '.specweave');
81
+ const persistence = new SchedulePersistence({
82
+ specweavePath,
83
+ logger: opts.silent ? createSilentLogger() : logger,
84
+ });
85
+ // Load all jobs
86
+ const jobs = await persistence.loadSchedules();
87
+ if (jobs.length === 0) {
88
+ if (!opts.silent) {
89
+ logger.log('No scheduled jobs found');
90
+ }
91
+ return;
92
+ }
93
+ if (!opts.silent) {
94
+ logger.log(`\n🔄 Force sync: ${jobs.length} job(s) to execute\n`);
95
+ }
96
+ // Reset all jobs to be due immediately
97
+ for (const job of jobs) {
98
+ if (job.schedule.enabled) {
99
+ const updatedJob = {
100
+ ...job,
101
+ schedule: {
102
+ ...job.schedule,
103
+ nextRun: new Date().toISOString(),
104
+ },
105
+ };
106
+ await persistence.updateJob(job.id, updatedJob);
107
+ }
108
+ }
109
+ // Now run the executor
110
+ const executor = new SessionSyncExecutor({
111
+ projectRoot,
112
+ logger: opts.silent ? createSilentLogger() : logger,
113
+ dryRun: opts.dryRun,
114
+ maxJobsPerSession: 100, // No limit for forced sync
115
+ });
116
+ const result = await executor.executeDueJobs();
117
+ if (opts.json) {
118
+ console.log(JSON.stringify(result, null, 2));
119
+ return;
120
+ }
121
+ if (!opts.silent) {
122
+ printResult(result, opts.dryRun);
123
+ }
124
+ }
125
+ /**
126
+ * Print human-readable result
127
+ */
128
+ function printResult(result, dryRun) {
129
+ const mode = dryRun ? '[DRY RUN] ' : '';
130
+ console.log(`\n${mode}📅 Sync Scheduled Results`);
131
+ console.log('─'.repeat(40));
132
+ console.log(`Due jobs: ${result.dueJobCount}`);
133
+ console.log(`Executed: ${result.executedJobs.length}`);
134
+ console.log(`Skipped: ${result.skippedJobs.length}`);
135
+ console.log(`Duration: ${result.totalDurationMs}ms`);
136
+ if (result.executedJobs.length > 0) {
137
+ console.log('\nExecuted Jobs:');
138
+ for (const job of result.executedJobs) {
139
+ const status = job.success ? '✅' : '❌';
140
+ const duration = `(${job.durationMs}ms)`;
141
+ console.log(` ${status} ${job.jobId} ${duration}`);
142
+ if (job.error) {
143
+ console.log(` Error: ${job.error}`);
144
+ }
145
+ }
146
+ }
147
+ if (result.skippedJobs.length > 0) {
148
+ console.log('\nSkipped Jobs:');
149
+ for (const job of result.skippedJobs) {
150
+ console.log(` ⏭️ ${job.jobId}: ${job.skipReason || 'Unknown reason'}`);
151
+ }
152
+ }
153
+ console.log('─'.repeat(40));
154
+ console.log(result.success ? '✅ Sync completed successfully' : '⚠️ Some jobs failed');
155
+ console.log('');
156
+ }
157
+ /**
158
+ * Create a silent logger for cron mode
159
+ */
160
+ function createSilentLogger() {
161
+ return {
162
+ log: () => { },
163
+ debug: () => { },
164
+ warn: () => { },
165
+ error: () => { },
166
+ };
167
+ }
168
+ // Default export for CLI registration
169
+ export default createSyncScheduledCommand;
170
+ //# sourceMappingURL=sync-scheduled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-scheduled.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-scheduled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * External Import Grouping Logic
3
+ *
4
+ * Groups imported items by external container (JIRA project/board, ADO project/area path)
5
+ * for 2-level directory structure support.
6
+ *
7
+ * Extracted from external-import.ts to reduce file size and improve maintainability.
8
+ *
9
+ * @module cli/helpers/init/external-import-grouping
10
+ */
11
+ import type { ExternalItem } from '../../../importers/external-importer.js';
12
+ import type { ExternalContainerContext } from '../../../core/types/increment-metadata.js';
13
+ /**
14
+ * Container group for organizing imported items
15
+ */
16
+ export interface ContainerGroup {
17
+ containerId: string;
18
+ containerType: 'jira' | 'ado' | null;
19
+ projectId: string;
20
+ items: ExternalItem[];
21
+ externalContainer: ExternalContainerContext | undefined;
22
+ /** The parent Epic/Capability item for this group (if ADO hierarchy) */
23
+ parentItem?: ExternalItem;
24
+ }
25
+ /**
26
+ * Group items by their source repository
27
+ * Items without sourceRepo go into '_default' group
28
+ */
29
+ export declare function groupItemsBySourceRepo(items: ExternalItem[]): Map<string, ExternalItem[]>;
30
+ /**
31
+ * Group items by external container (JIRA project/board, ADO project/area path)
32
+ * Returns groups with container context for 2-level directory structure
33
+ *
34
+ * CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
35
+ * instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
36
+ *
37
+ * ADO Hierarchy: Capability → Epic → Feature → User Story → Task
38
+ * - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
39
+ * - Child User Stories/Tasks are grouped under their parent Epic
40
+ * - Items without parents get their own individual groups
41
+ */
42
+ export declare function groupItemsByExternalContainer(items: ExternalItem[]): ContainerGroup[];
43
+ /**
44
+ * Group ADO items by their parent Epic/Capability hierarchy
45
+ * Each top-level Epic/Capability becomes its own FS-XXX folder
46
+ */
47
+ export declare function groupAdoItemsByParentHierarchy(items: ExternalItem[]): ContainerGroup[];
48
+ /**
49
+ * Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
50
+ * Original grouping logic by project/board/repo
51
+ */
52
+ export declare function groupNonHierarchyItems(items: ExternalItem[]): ContainerGroup[];
53
+ //# sourceMappingURL=external-import-grouping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-import-grouping.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import-grouping.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAG1F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,iBAAiB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACxD,wEAAwE;IACxE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAiCzF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA8BrF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA4ItF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAiF9E"}
@@ -0,0 +1,287 @@
1
+ /**
2
+ * External Import Grouping Logic
3
+ *
4
+ * Groups imported items by external container (JIRA project/board, ADO project/area path)
5
+ * for 2-level directory structure support.
6
+ *
7
+ * Extracted from external-import.ts to reduce file size and improve maintainability.
8
+ *
9
+ * @module cli/helpers/init/external-import-grouping
10
+ */
11
+ import chalk from 'chalk';
12
+ import { normalizeToProjectId } from '../../../utils/project-id-generator.js';
13
+ /**
14
+ * Group items by their source repository
15
+ * Items without sourceRepo go into '_default' group
16
+ */
17
+ export function groupItemsBySourceRepo(items) {
18
+ const groups = new Map();
19
+ for (const item of items) {
20
+ // Extract repo name from sourceRepo (e.g., "owner/repo" -> "repo")
21
+ let repoKey = '_default';
22
+ if (item.sourceRepo) {
23
+ // sourceRepo is "owner/repo", we want just "repo"
24
+ const parts = item.sourceRepo.split('/');
25
+ const rawRepoName = parts.length > 1 ? parts[1] : item.sourceRepo;
26
+ // Sanitize repo name to prevent path injection:
27
+ // - Allow only alphanumeric, hyphens, underscores
28
+ // - Trim leading/trailing hyphens
29
+ // - Limit to 100 chars
30
+ repoKey = rawRepoName
31
+ .replace(/[^a-zA-Z0-9-_]/g, '-')
32
+ .replace(/^-+|-+$/g, '')
33
+ .slice(0, 100);
34
+ // Fall back to _default if sanitization results in empty string
35
+ if (!repoKey) {
36
+ repoKey = '_default';
37
+ }
38
+ }
39
+ if (!groups.has(repoKey)) {
40
+ groups.set(repoKey, []);
41
+ }
42
+ groups.get(repoKey).push(item);
43
+ }
44
+ return groups;
45
+ }
46
+ /**
47
+ * Group items by external container (JIRA project/board, ADO project/area path)
48
+ * Returns groups with container context for 2-level directory structure
49
+ *
50
+ * CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
51
+ * instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
52
+ *
53
+ * ADO Hierarchy: Capability → Epic → Feature → User Story → Task
54
+ * - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
55
+ * - Child User Stories/Tasks are grouped under their parent Epic
56
+ * - Items without parents get their own individual groups
57
+ */
58
+ export function groupItemsByExternalContainer(items) {
59
+ const groups = new Map();
60
+ // Check if we have ADO items with hierarchy
61
+ const adoItems = items.filter(item => item.platform === 'ado' && item.adoProjectName);
62
+ const hasAdoHierarchy = adoItems.some(item => item.parentId || item.type === 'epic');
63
+ // For ADO with hierarchy, use parent-based grouping
64
+ if (hasAdoHierarchy && adoItems.length > 0) {
65
+ const adoGroups = groupAdoItemsByParentHierarchy(adoItems);
66
+ for (const group of adoGroups) {
67
+ groups.set(group.projectId, group);
68
+ }
69
+ // Also process non-ADO items normally
70
+ const nonAdoItems = items.filter(item => item.platform !== 'ado' || !item.adoProjectName);
71
+ if (nonAdoItems.length > 0) {
72
+ const nonAdoGroups = groupNonHierarchyItems(nonAdoItems);
73
+ for (const group of nonAdoGroups) {
74
+ // Avoid key collisions with ADO groups
75
+ const uniqueKey = `other:${group.projectId}`;
76
+ groups.set(uniqueKey, group);
77
+ }
78
+ }
79
+ return Array.from(groups.values());
80
+ }
81
+ // No ADO hierarchy - use original grouping logic for all items
82
+ return groupNonHierarchyItems(items);
83
+ }
84
+ /**
85
+ * Group ADO items by their parent Epic/Capability hierarchy
86
+ * Each top-level Epic/Capability becomes its own FS-XXX folder
87
+ */
88
+ export function groupAdoItemsByParentHierarchy(items) {
89
+ const groups = new Map();
90
+ // Build item lookup map
91
+ const itemById = new Map();
92
+ for (const item of items) {
93
+ itemById.set(item.id, item);
94
+ }
95
+ // Find feature-level types (these become folder leaders)
96
+ const featureLevelTypes = new Set(['capability', 'epic', 'feature']);
97
+ // Find ALL top-level parents (Epics/Capabilities that are NOT children of other items in our dataset)
98
+ const topLevelParents = new Map();
99
+ for (const item of items) {
100
+ const witType = item.adoWorkItemType?.toLowerCase() || item.type;
101
+ if (featureLevelTypes.has(witType)) {
102
+ // Check if this item's parent is NOT in our dataset (making it a top-level parent)
103
+ const hasParentInDataset = item.parentId && itemById.has(item.parentId);
104
+ if (!hasParentInDataset) {
105
+ topLevelParents.set(item.id, item);
106
+ }
107
+ }
108
+ }
109
+ // Function to find the top-level parent for an item
110
+ function findTopLevelParent(item) {
111
+ // If this item IS a top-level parent, return it
112
+ if (topLevelParents.has(item.id)) {
113
+ return item;
114
+ }
115
+ // Walk up the parent chain
116
+ let current = item;
117
+ const visited = new Set();
118
+ while (current && current.parentId && !visited.has(current.id)) {
119
+ visited.add(current.id);
120
+ // Check if parent is a top-level parent
121
+ if (topLevelParents.has(current.parentId)) {
122
+ return topLevelParents.get(current.parentId);
123
+ }
124
+ // Move to parent
125
+ current = itemById.get(current.parentId);
126
+ }
127
+ // No top-level parent found
128
+ return undefined;
129
+ }
130
+ // Create groups for each top-level parent first
131
+ for (const [parentId, parentItem] of topLevelParents) {
132
+ const containerId = parentItem.adoProjectName || 'default';
133
+ const projectId = normalizeToProjectId(parentItem.title) || `ado-${parentId.replace('ADO-', '')}`;
134
+ const groupKey = `ado:parent:${parentId}`;
135
+ groups.set(groupKey, {
136
+ containerId,
137
+ containerType: 'ado',
138
+ projectId,
139
+ items: [parentItem], // Parent item goes first
140
+ externalContainer: {
141
+ type: 'ado-project',
142
+ containerId,
143
+ containerName: containerId,
144
+ areaPath: parentItem.adoAreaPath
145
+ },
146
+ parentItem
147
+ });
148
+ }
149
+ // Assign child items to their parent groups
150
+ for (const item of items) {
151
+ // Skip top-level parents (already added)
152
+ if (topLevelParents.has(item.id)) {
153
+ continue;
154
+ }
155
+ // Find the top-level parent
156
+ const topLevelParent = findTopLevelParent(item);
157
+ if (topLevelParent) {
158
+ // Add to parent's group
159
+ const groupKey = `ado:parent:${topLevelParent.id}`;
160
+ const group = groups.get(groupKey);
161
+ if (group) {
162
+ group.items.push(item);
163
+ }
164
+ }
165
+ else {
166
+ // No parent found - group by area path (2-level structure: project/areaPath)
167
+ // This handles orphan items (User Stories with parents outside our dataset)
168
+ // CRITICAL FIX (2025-12-01): Group by area path, NOT by User Story title
169
+ const containerId = item.adoProjectName || 'default';
170
+ // Extract area path leaf segment for grouping (e.g., "Project\Platform-Engineering" → "platform-engineering")
171
+ let areaFolder = '_default';
172
+ if (item.adoAreaPath) {
173
+ const segments = item.adoAreaPath.split('\\');
174
+ // Use leaf segment, or second segment if only project name
175
+ const leafSegment = segments.length > 1 ? segments[segments.length - 1] : segments[0];
176
+ areaFolder = normalizeToProjectId(leafSegment) || '_default';
177
+ }
178
+ // Group all items without parents by their area path
179
+ // This ensures siblings with same area path stay together
180
+ const groupKey = `ado:area:${containerId}:${areaFolder}`;
181
+ const projectId = areaFolder;
182
+ if (!groups.has(groupKey)) {
183
+ groups.set(groupKey, {
184
+ containerId,
185
+ containerType: 'ado',
186
+ projectId,
187
+ items: [],
188
+ externalContainer: {
189
+ type: 'ado-project',
190
+ containerId,
191
+ containerName: containerId,
192
+ areaPath: item.adoAreaPath
193
+ }
194
+ });
195
+ }
196
+ groups.get(groupKey).items.push(item);
197
+ }
198
+ }
199
+ // Log grouping results for diagnostics
200
+ console.log(chalk.cyan(` 📊 ADO Hierarchy Grouping:`));
201
+ console.log(chalk.gray(` → ${topLevelParents.size} top-level Epics/Capabilities found`));
202
+ for (const [key, group] of groups) {
203
+ const parentInfo = group.parentItem
204
+ ? ` (parent: ${group.parentItem.adoWorkItemType || 'Epic'} "${group.parentItem.title.slice(0, 30)}...")`
205
+ : '';
206
+ console.log(chalk.gray(` → ${group.projectId}: ${group.items.length} items${parentInfo}`));
207
+ }
208
+ return Array.from(groups.values());
209
+ }
210
+ /**
211
+ * Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
212
+ * Original grouping logic by project/board/repo
213
+ */
214
+ export function groupNonHierarchyItems(items) {
215
+ const groups = new Map();
216
+ for (const item of items) {
217
+ let groupKey;
218
+ let containerType = null;
219
+ let containerId;
220
+ let projectId;
221
+ let externalContainer;
222
+ // Check for JIRA container context
223
+ if (item.jiraProjectKey) {
224
+ containerType = 'jira';
225
+ containerId = item.jiraProjectKey;
226
+ // Project ID from board name (if available) or default
227
+ projectId = item.jiraBoardName
228
+ ? normalizeToProjectId(item.jiraBoardName) || 'default'
229
+ : 'default';
230
+ groupKey = `jira:${containerId}:${projectId}`;
231
+ externalContainer = {
232
+ type: 'jira-project',
233
+ containerId: containerId,
234
+ containerName: containerId,
235
+ boardId: item.jiraBoardId,
236
+ boardName: item.jiraBoardName
237
+ };
238
+ }
239
+ // Check for ADO container context (without hierarchy)
240
+ else if (item.adoProjectName) {
241
+ containerType = 'ado';
242
+ containerId = item.adoProjectName;
243
+ // Project ID from area path (extract last segment) or default
244
+ if (item.adoAreaPath) {
245
+ const areaSegments = item.adoAreaPath.split('\\');
246
+ const lastSegment = areaSegments[areaSegments.length - 1];
247
+ projectId = normalizeToProjectId(lastSegment) || 'default';
248
+ }
249
+ else {
250
+ projectId = 'default';
251
+ }
252
+ groupKey = `ado:${containerId}:${projectId}`;
253
+ externalContainer = {
254
+ type: 'ado-project',
255
+ containerId: containerId,
256
+ containerName: containerId,
257
+ areaPath: item.adoAreaPath
258
+ };
259
+ }
260
+ // GitHub or default (1-level structure)
261
+ else {
262
+ // Use sourceRepo if available, otherwise '_default'
263
+ if (item.sourceRepo) {
264
+ const parts = item.sourceRepo.split('/');
265
+ const rawRepoName = parts.length > 1 ? parts[1] : item.sourceRepo;
266
+ projectId = normalizeToProjectId(rawRepoName) || '_default';
267
+ }
268
+ else {
269
+ projectId = '_default';
270
+ }
271
+ groupKey = `gh:${projectId}`;
272
+ // No externalContainer for GitHub (1-level structure)
273
+ }
274
+ if (!groups.has(groupKey)) {
275
+ groups.set(groupKey, {
276
+ containerId: containerId || projectId,
277
+ containerType,
278
+ projectId,
279
+ items: [],
280
+ externalContainer
281
+ });
282
+ }
283
+ groups.get(groupKey).items.push(item);
284
+ }
285
+ return Array.from(groups.values());
286
+ }
287
+ //# sourceMappingURL=external-import-grouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-import-grouping.js","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import-grouping.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,8 @@
3
3
  * Imports work items from GitHub, JIRA, Azure DevOps
4
4
  */
5
5
  import { CoordinatorResult } from '../../../importers/import-coordinator.js';
6
- import type { ExternalItem } from '../../../importers/external-importer.js';
7
- import type { ExternalContainerContext } from '../../../core/types/increment-metadata.js';
8
6
  import type { SupportedLanguage } from '../../../core/i18n/types.js';
7
+ import { groupItemsByExternalContainer, groupAdoItemsByParentHierarchy, groupNonHierarchyItems, type ContainerGroup } from './external-import-grouping.js';
9
8
  /**
10
9
  * Prompt user and run external tool import
11
10
  * Detects GitHub/JIRA/ADO configuration and imports work items
@@ -33,38 +32,6 @@ export interface BackgroundImportResult {
33
32
  pid?: number;
34
33
  message: string;
35
34
  }
36
- /**
37
- * Group items by external container (JIRA project/board, ADO project/area path)
38
- * Returns groups with container context for 2-level directory structure
39
- *
40
- * CRITICAL FIX (2025-12-01): For ADO items with hierarchy, group by parent Epic/Capability
41
- * instead of by area path. This ensures each Epic becomes a separate FS-XXX folder.
42
- *
43
- * ADO Hierarchy: Capability → Epic → Feature → User Story → Task
44
- * - Each top-level Epic/Capability becomes its own group (→ FS-XXX folder)
45
- * - Child User Stories/Tasks are grouped under their parent Epic
46
- * - Items without parents get their own individual groups
47
- */
48
- interface ContainerGroup {
49
- containerId: string;
50
- containerType: 'jira' | 'ado' | null;
51
- projectId: string;
52
- items: ExternalItem[];
53
- externalContainer: ExternalContainerContext | undefined;
54
- /** The parent Epic/Capability item for this group (if ADO hierarchy) */
55
- parentItem?: ExternalItem;
56
- }
57
- declare function groupItemsByExternalContainer(items: ExternalItem[]): ContainerGroup[];
58
- /**
59
- * Group ADO items by their parent Epic/Capability hierarchy
60
- * Each top-level Epic/Capability becomes its own FS-XXX folder
61
- */
62
- declare function groupAdoItemsByParentHierarchy(items: ExternalItem[]): ContainerGroup[];
63
- /**
64
- * Group non-hierarchy items (JIRA, GitHub, or ADO without hierarchy)
65
- * Original grouping logic by project/board/repo
66
- */
67
- declare function groupNonHierarchyItems(items: ExternalItem[]): ContainerGroup[];
68
35
  export declare const __test__: {
69
36
  groupAdoItemsByParentHierarchy: typeof groupAdoItemsByParentHierarchy;
70
37
  groupItemsByExternalContainer: typeof groupItemsByExternalContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"external-import.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAwC,iBAAiB,EAAgB,MAAM,0CAA0C,CAAC;AAEjI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAK1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAmVrE;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,iBAAwB,EAClC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,CAAC,CAiTrD;AA2TD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AA0bD;;;;;;;;;;;GAWG;AACH,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,iBAAiB,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACxD,wEAAwE;IACxE,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED,iBAAS,6BAA6B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA8B9E;AAED;;;GAGG;AACH,iBAAS,8BAA8B,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA4I/E;AAED;;;GAGG;AACH,iBAAS,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAiFvE;AAkBD,eAAO,MAAM,QAAQ;;;;CAIpB,CAAC;AAEF,YAAY,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"external-import.d.ts","sourceRoot":"","sources":["../../../../../src/cli/helpers/init/external-import.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAwC,iBAAiB,EAAgB,MAAM,0CAA0C,CAAC;AAQjI,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAwBrE,OAAO,EACL,6BAA6B,EAE7B,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAoUvC;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,iBAAwB,EAClC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,iBAAiB,GAAG,sBAAsB,CAAC,CAiTrD;AAyED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,IAAI,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AA4aD,eAAO,MAAM,QAAQ;;;;CAIpB,CAAC;AAGF,YAAY,EAAE,cAAc,EAAE,CAAC"}