specweave 0.32.2 → 0.32.5

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 (244) hide show
  1. package/CLAUDE.md +51 -9
  2. package/bin/specweave.js +34 -0
  3. package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.d.ts +100 -0
  4. package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.d.ts.map +1 -0
  5. package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js +291 -0
  6. package/dist/plugins/specweave-ado/lib/ado-duplicate-detector.js.map +1 -0
  7. package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.d.ts +103 -0
  8. package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.d.ts.map +1 -0
  9. package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js +310 -0
  10. package/dist/plugins/specweave-jira/lib/jira-duplicate-detector.js.map +1 -0
  11. package/dist/plugins/specweave-jira/lib/jira-permission-gate.d.ts +126 -0
  12. package/dist/plugins/specweave-jira/lib/jira-permission-gate.d.ts.map +1 -0
  13. package/dist/plugins/specweave-jira/lib/jira-permission-gate.js +207 -0
  14. package/dist/plugins/specweave-jira/lib/jira-permission-gate.js.map +1 -0
  15. package/dist/src/adapters/codex/README.md +1 -1
  16. package/dist/src/adapters/codex/adapter.js +1 -1
  17. package/dist/src/cli/commands/archive.d.ts +2 -0
  18. package/dist/src/cli/commands/archive.d.ts.map +1 -1
  19. package/dist/src/cli/commands/archive.js +33 -0
  20. package/dist/src/cli/commands/archive.js.map +1 -1
  21. package/dist/src/cli/commands/context.d.ts +92 -0
  22. package/dist/src/cli/commands/context.d.ts.map +1 -0
  23. package/dist/src/cli/commands/context.js +205 -0
  24. package/dist/src/cli/commands/context.js.map +1 -0
  25. package/dist/src/cli/commands/init-multiproject.js +1 -1
  26. package/dist/src/cli/commands/init-multiproject.js.map +1 -1
  27. package/dist/src/cli/commands/init.d.ts.map +1 -1
  28. package/dist/src/cli/commands/init.js +111 -69
  29. package/dist/src/cli/commands/init.js.map +1 -1
  30. package/dist/src/cli/commands/migrate-to-multiproject.js +2 -2
  31. package/dist/src/cli/commands/migrate-to-multiproject.js.map +1 -1
  32. package/dist/src/cli/helpers/init/external-import.d.ts +3 -0
  33. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  34. package/dist/src/cli/helpers/init/external-import.js +17 -4
  35. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  36. package/dist/src/cli/helpers/init/index.d.ts +1 -0
  37. package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
  38. package/dist/src/cli/helpers/init/index.js +2 -0
  39. package/dist/src/cli/helpers/init/index.js.map +1 -1
  40. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts +70 -0
  41. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts.map +1 -1
  42. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js +214 -4
  43. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js.map +1 -1
  44. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +4 -0
  45. package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
  46. package/dist/src/cli/helpers/init/living-docs-preflight.js +34 -3
  47. package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
  48. package/dist/src/cli/helpers/init/testing-config.d.ts +3 -0
  49. package/dist/src/cli/helpers/init/testing-config.d.ts.map +1 -1
  50. package/dist/src/cli/helpers/init/testing-config.js +9 -2
  51. package/dist/src/cli/helpers/init/testing-config.js.map +1 -1
  52. package/dist/src/cli/helpers/init/translation-config.d.ts +3 -0
  53. package/dist/src/cli/helpers/init/translation-config.d.ts.map +1 -1
  54. package/dist/src/cli/helpers/init/translation-config.js +21 -4
  55. package/dist/src/cli/helpers/init/translation-config.js.map +1 -1
  56. package/dist/src/cli/helpers/init/wizard-navigation.d.ts +45 -0
  57. package/dist/src/cli/helpers/init/wizard-navigation.d.ts.map +1 -0
  58. package/dist/src/cli/helpers/init/wizard-navigation.js +97 -0
  59. package/dist/src/cli/helpers/init/wizard-navigation.js.map +1 -0
  60. package/dist/src/core/increment/increment-archiver.d.ts +25 -4
  61. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  62. package/dist/src/core/increment/increment-archiver.js +64 -20
  63. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  64. package/dist/src/core/increment/increment-utils.d.ts +65 -0
  65. package/dist/src/core/increment/increment-utils.d.ts.map +1 -1
  66. package/dist/src/core/increment/increment-utils.js +114 -0
  67. package/dist/src/core/increment/increment-utils.js.map +1 -1
  68. package/dist/src/core/living-docs/cross-project-sync.d.ts +97 -0
  69. package/dist/src/core/living-docs/cross-project-sync.d.ts.map +1 -0
  70. package/dist/src/core/living-docs/cross-project-sync.js +135 -0
  71. package/dist/src/core/living-docs/cross-project-sync.js.map +1 -0
  72. package/dist/src/core/living-docs/external-sync-orchestrator.d.ts +106 -0
  73. package/dist/src/core/living-docs/external-sync-orchestrator.d.ts.map +1 -0
  74. package/dist/src/core/living-docs/external-sync-orchestrator.js +146 -0
  75. package/dist/src/core/living-docs/external-sync-orchestrator.js.map +1 -0
  76. package/dist/src/core/living-docs/feature-archiver.d.ts +4 -0
  77. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  78. package/dist/src/core/living-docs/feature-archiver.js +32 -10
  79. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  80. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  81. package/dist/src/core/living-docs/feature-id-manager.js +7 -3
  82. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  83. package/dist/src/core/living-docs/governance/ecosystem-detector.d.ts +38 -0
  84. package/dist/src/core/living-docs/governance/ecosystem-detector.d.ts.map +1 -0
  85. package/dist/src/core/living-docs/governance/ecosystem-detector.js +325 -0
  86. package/dist/src/core/living-docs/governance/ecosystem-detector.js.map +1 -0
  87. package/dist/src/core/living-docs/governance/frontend-standards-parser.d.ts +74 -0
  88. package/dist/src/core/living-docs/governance/frontend-standards-parser.d.ts.map +1 -0
  89. package/dist/src/core/living-docs/governance/frontend-standards-parser.js +366 -0
  90. package/dist/src/core/living-docs/governance/frontend-standards-parser.js.map +1 -0
  91. package/dist/src/core/living-docs/governance/go-standards-parser.d.ts +64 -0
  92. package/dist/src/core/living-docs/governance/go-standards-parser.d.ts.map +1 -0
  93. package/dist/src/core/living-docs/governance/go-standards-parser.js +229 -0
  94. package/dist/src/core/living-docs/governance/go-standards-parser.js.map +1 -0
  95. package/dist/src/core/living-docs/governance/index.d.ts +50 -0
  96. package/dist/src/core/living-docs/governance/index.d.ts.map +1 -0
  97. package/dist/src/core/living-docs/governance/index.js +56 -0
  98. package/dist/src/core/living-docs/governance/index.js.map +1 -0
  99. package/dist/src/core/living-docs/governance/java-standards-parser.d.ts +89 -0
  100. package/dist/src/core/living-docs/governance/java-standards-parser.d.ts.map +1 -0
  101. package/dist/src/core/living-docs/governance/java-standards-parser.js +356 -0
  102. package/dist/src/core/living-docs/governance/java-standards-parser.js.map +1 -0
  103. package/dist/src/core/living-docs/governance/python-standards-parser.d.ts +83 -0
  104. package/dist/src/core/living-docs/governance/python-standards-parser.d.ts.map +1 -0
  105. package/dist/src/core/living-docs/governance/python-standards-parser.js +347 -0
  106. package/dist/src/core/living-docs/governance/python-standards-parser.js.map +1 -0
  107. package/dist/src/core/living-docs/governance/standards-generator.d.ts +38 -0
  108. package/dist/src/core/living-docs/governance/standards-generator.d.ts.map +1 -0
  109. package/dist/src/core/living-docs/governance/standards-generator.js +476 -0
  110. package/dist/src/core/living-docs/governance/standards-generator.js.map +1 -0
  111. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.d.ts.map +1 -1
  112. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js +54 -2
  113. package/dist/src/core/living-docs/intelligent-analyzer/architecture-generator.js.map +1 -1
  114. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts +5 -1
  115. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.d.ts.map +1 -1
  116. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js +358 -30
  117. package/dist/src/core/living-docs/intelligent-analyzer/organization-synthesizer.js.map +1 -1
  118. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts +44 -0
  119. package/dist/src/core/living-docs/intelligent-analyzer/types.d.ts.map +1 -1
  120. package/dist/src/core/living-docs/living-docs-sync.d.ts +7 -3
  121. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  122. package/dist/src/core/living-docs/living-docs-sync.js +94 -10
  123. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  124. package/dist/src/core/living-docs/module-analyzer.d.ts +22 -0
  125. package/dist/src/core/living-docs/module-analyzer.d.ts.map +1 -1
  126. package/dist/src/core/living-docs/module-analyzer.js +123 -19
  127. package/dist/src/core/living-docs/module-analyzer.js.map +1 -1
  128. package/dist/src/core/living-docs/sync-helpers/generators.d.ts +8 -1
  129. package/dist/src/core/living-docs/sync-helpers/generators.d.ts.map +1 -1
  130. package/dist/src/core/living-docs/sync-helpers/generators.js +18 -1
  131. package/dist/src/core/living-docs/sync-helpers/generators.js.map +1 -1
  132. package/dist/src/core/living-docs/sync-helpers/index.d.ts +1 -1
  133. package/dist/src/core/living-docs/sync-helpers/index.d.ts.map +1 -1
  134. package/dist/src/core/living-docs/sync-helpers/index.js.map +1 -1
  135. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts +3 -1
  136. package/dist/src/core/living-docs/sync-helpers/parsers.d.ts.map +1 -1
  137. package/dist/src/core/living-docs/sync-helpers/parsers.js +24 -2
  138. package/dist/src/core/living-docs/sync-helpers/parsers.js.map +1 -1
  139. package/dist/src/core/living-docs/types.d.ts +6 -0
  140. package/dist/src/core/living-docs/types.d.ts.map +1 -1
  141. package/dist/src/core/living-docs/validators/index.d.ts +7 -0
  142. package/dist/src/core/living-docs/validators/index.d.ts.map +1 -0
  143. package/dist/src/core/living-docs/validators/index.js +7 -0
  144. package/dist/src/core/living-docs/validators/index.js.map +1 -0
  145. package/dist/src/core/living-docs/validators/project-validator.d.ts +92 -0
  146. package/dist/src/core/living-docs/validators/project-validator.d.ts.map +1 -0
  147. package/dist/src/core/living-docs/validators/project-validator.js +142 -0
  148. package/dist/src/core/living-docs/validators/project-validator.js.map +1 -0
  149. package/dist/src/core/llm/provider-factory.js +2 -2
  150. package/dist/src/core/llm/provider-factory.js.map +1 -1
  151. package/dist/src/core/llm/providers/anthropic-provider.js +1 -1
  152. package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -1
  153. package/dist/src/core/llm/providers/bedrock-provider.js +8 -4
  154. package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -1
  155. package/dist/src/core/project/project-manager.d.ts.map +1 -1
  156. package/dist/src/core/project/project-manager.js +19 -17
  157. package/dist/src/core/project/project-manager.js.map +1 -1
  158. package/dist/src/core/types/config.d.ts +4 -2
  159. package/dist/src/core/types/config.d.ts.map +1 -1
  160. package/dist/src/core/types/config.js.map +1 -1
  161. package/dist/src/core/types/increment-metadata.d.ts +34 -0
  162. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  163. package/dist/src/importers/jira-importer.d.ts +14 -0
  164. package/dist/src/importers/jira-importer.d.ts.map +1 -1
  165. package/dist/src/importers/jira-importer.js +75 -0
  166. package/dist/src/importers/jira-importer.js.map +1 -1
  167. package/dist/src/integrations/jira/jira-token-provider.d.ts +93 -0
  168. package/dist/src/integrations/jira/jira-token-provider.d.ts.map +1 -0
  169. package/dist/src/integrations/jira/jira-token-provider.js +160 -0
  170. package/dist/src/integrations/jira/jira-token-provider.js.map +1 -0
  171. package/dist/src/sync/ado-reconciler.d.ts +92 -0
  172. package/dist/src/sync/ado-reconciler.d.ts.map +1 -0
  173. package/dist/src/sync/ado-reconciler.js +335 -0
  174. package/dist/src/sync/ado-reconciler.js.map +1 -0
  175. package/dist/src/sync/jira-reconciler.d.ts +106 -0
  176. package/dist/src/sync/jira-reconciler.d.ts.map +1 -0
  177. package/dist/src/sync/jira-reconciler.js +405 -0
  178. package/dist/src/sync/jira-reconciler.js.map +1 -0
  179. package/dist/src/types/model-selection.d.ts +6 -4
  180. package/dist/src/types/model-selection.d.ts.map +1 -1
  181. package/dist/src/types/model-selection.js +3 -1
  182. package/dist/src/types/model-selection.js.map +1 -1
  183. package/dist/src/utils/cross-cutting-detector.d.ts +66 -0
  184. package/dist/src/utils/cross-cutting-detector.d.ts.map +1 -0
  185. package/dist/src/utils/cross-cutting-detector.js +179 -0
  186. package/dist/src/utils/cross-cutting-detector.js.map +1 -0
  187. package/dist/src/utils/external-tool-drift-detector.d.ts +1 -1
  188. package/dist/src/utils/external-tool-drift-detector.d.ts.map +1 -1
  189. package/dist/src/utils/external-tool-drift-detector.js +5 -4
  190. package/dist/src/utils/external-tool-drift-detector.js.map +1 -1
  191. package/dist/src/utils/feature-id-derivation.d.ts +8 -3
  192. package/dist/src/utils/feature-id-derivation.d.ts.map +1 -1
  193. package/dist/src/utils/feature-id-derivation.js +14 -6
  194. package/dist/src/utils/feature-id-derivation.js.map +1 -1
  195. package/dist/src/utils/model-selection.d.ts +3 -4
  196. package/dist/src/utils/model-selection.d.ts.map +1 -1
  197. package/dist/src/utils/model-selection.js +3 -4
  198. package/dist/src/utils/model-selection.js.map +1 -1
  199. package/dist/src/utils/project-detection.d.ts +12 -8
  200. package/dist/src/utils/project-detection.d.ts.map +1 -1
  201. package/dist/src/utils/project-detection.js +13 -19
  202. package/dist/src/utils/project-detection.js.map +1 -1
  203. package/package.json +1 -1
  204. package/plugins/specweave/agents/code-standards-detective/AGENT.md +48 -0
  205. package/plugins/specweave/commands/specweave-costs.md +4 -4
  206. package/plugins/specweave/commands/specweave-do.md +9 -9
  207. package/plugins/specweave/commands/specweave-done.md +13 -0
  208. package/plugins/specweave/commands/specweave-status.md +64 -0
  209. package/plugins/specweave/commands/specweave-validate.md +27 -1
  210. package/plugins/specweave/hooks/hooks.json +11 -1
  211. package/plugins/specweave/hooks/spec-project-validator.sh +81 -25
  212. package/plugins/specweave/hooks/v2/guards/increment-duplicate-guard.sh +135 -0
  213. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +34 -0
  214. package/plugins/specweave/scripts/read-costs.sh +3 -3
  215. package/plugins/specweave/skills/code-standards-analyzer/SKILL.md +58 -6
  216. package/plugins/specweave/skills/increment-planner/SKILL.md +135 -29
  217. package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +4 -2
  218. package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +2 -1
  219. package/plugins/specweave/skills/increment-planner/templates/tasks-multi-project.md +1 -1
  220. package/plugins/specweave/skills/increment-planner/templates/tasks-single-project.md +1 -1
  221. package/plugins/specweave/skills/spec-generator/SKILL.md +78 -7
  222. package/plugins/specweave-ado/commands/cleanup-duplicates.md +212 -0
  223. package/plugins/specweave-ado/commands/reconcile.md +120 -0
  224. package/plugins/specweave-ado/lib/ado-duplicate-detector.js +279 -0
  225. package/plugins/specweave-ado/lib/ado-duplicate-detector.ts +407 -0
  226. package/plugins/specweave-github/agents/github-manager/AGENT.md +2 -2
  227. package/plugins/specweave-infrastructure/skills/hetzner-provisioner/README.md +1 -1
  228. package/plugins/specweave-jira/agents/jira-manager/AGENT.md +1 -1
  229. package/plugins/specweave-jira/agents/jira-multi-project-mapper/AGENT.md +530 -0
  230. package/plugins/specweave-jira/agents/jira-sync-judge/AGENT.md +438 -0
  231. package/plugins/specweave-jira/commands/cleanup-duplicates.md +219 -0
  232. package/plugins/specweave-jira/commands/close.md +297 -0
  233. package/plugins/specweave-jira/commands/create.md +198 -0
  234. package/plugins/specweave-jira/commands/reconcile.md +123 -0
  235. package/plugins/specweave-jira/commands/status.md +215 -0
  236. package/plugins/specweave-jira/lib/jira-duplicate-detector.js +296 -0
  237. package/plugins/specweave-jira/lib/jira-duplicate-detector.ts +434 -0
  238. package/plugins/specweave-jira/lib/jira-permission-gate.js +160 -0
  239. package/plugins/specweave-jira/lib/jira-permission-gate.ts +276 -0
  240. package/plugins/specweave-jira/lib/jira-profile-resolver.js +222 -0
  241. package/plugins/specweave-jira/lib/jira-profile-resolver.ts +427 -0
  242. package/plugins/specweave-jira/reference/jira-specweave-mapping.md +16 -11
  243. package/plugins/specweave-release/commands/specweave-release-npm.md +140 -14
  244. package/plugins/specweave/commands/specweave-switch-project.md +0 -168
@@ -0,0 +1,530 @@
1
+ ---
2
+ name: jira-multi-project-mapper
3
+ description: Expert in mapping SpecWeave specs to multiple JIRA projects with intelligent project detection and cross-project coordination. Handles project-per-team, component-based, and epic-based strategies. Manages bidirectional sync across multiple projects.
4
+ tools: Read, Write, Edit, Bash, Glob
5
+ model: claude-opus-4-5-20251101
6
+ ---
7
+
8
+ ## How to Invoke This Agent
9
+
10
+ **Subagent Type**: `specweave-jira:jira-multi-project-mapper:jira-multi-project-mapper`
11
+
12
+ **Usage Example**:
13
+
14
+ ```typescript
15
+ Task({
16
+ subagent_type: "specweave-jira:jira-multi-project-mapper:jira-multi-project-mapper",
17
+ prompt: "Map spec-002-checkout to appropriate JIRA projects",
18
+ model: "opus"
19
+ });
20
+ ```
21
+
22
+ **When to Use**:
23
+ - Mapping specs to multi-project JIRA environments
24
+ - Detecting correct project from spec content
25
+ - Handling cross-project dependencies
26
+ - Managing bidirectional sync across projects
27
+
28
+ # JIRA Multi-Project Mapper Agent
29
+
30
+ You are an expert in mapping SpecWeave specifications to multiple JIRA projects with intelligent detection and coordination.
31
+
32
+ ## Core Responsibilities
33
+
34
+ 1. **Detect correct JIRA project** from spec content
35
+ 2. **Map specs to project-specific issues** based on strategy
36
+ 3. **Handle cross-project dependencies** when specs span multiple projects
37
+ 4. **Maintain bidirectional sync** across all projects
38
+ 5. **Create appropriate folder structures** in `.specweave/docs/internal/specs/`
39
+
40
+ ## Supported Strategies
41
+
42
+ ### 1. Project-per-team Strategy
43
+
44
+ **Configuration**:
45
+ ```bash
46
+ JIRA_STRATEGY=project-per-team
47
+ JIRA_PROJECTS=AUTH,USER,PAY
48
+ ```
49
+
50
+ **Mapping Rules**:
51
+ - Each JIRA project is completely independent
52
+ - Specs are mapped 1:1 to projects
53
+ - Cross-project dependencies use JIRA links
54
+
55
+ **Folder Structure**:
56
+ ```
57
+ .specweave/docs/internal/specs/
58
+ ├── AUTH/
59
+ │ └── spec-001-oauth.md → JIRA Project: AUTH
60
+ ├── USER/
61
+ │ └── spec-001-profiles.md → JIRA Project: USER
62
+ └── PAY/
63
+ └── spec-001-stripe.md → JIRA Project: PAY
64
+ ```
65
+
66
+ ### 2. Component-based Strategy
67
+
68
+ **Configuration**:
69
+ ```bash
70
+ JIRA_STRATEGY=component-based
71
+ JIRA_PROJECT=MAIN
72
+ JIRA_COMPONENTS=Frontend,Backend,Mobile
73
+ ```
74
+
75
+ **Mapping Rules**:
76
+ - Single project with components
77
+ - Specs mapped to components within project
78
+ - Issues organized by component
79
+
80
+ **Folder Structure**:
81
+ ```
82
+ .specweave/docs/internal/specs/MAIN/
83
+ ├── Frontend/
84
+ │ └── spec-001-ui.md → Component: Frontend
85
+ ├── Backend/
86
+ │ └── spec-001-api.md → Component: Backend
87
+ └── Mobile/
88
+ └── spec-001-app.md → Component: Mobile
89
+ ```
90
+
91
+ ### 3. Epic-based Strategy
92
+
93
+ **Configuration**:
94
+ ```bash
95
+ JIRA_STRATEGY=epic-based
96
+ JIRA_PROJECT=PLATFORM
97
+ JIRA_BOARDS=Alpha,Beta,Gamma
98
+ ```
99
+
100
+ **Mapping Rules**:
101
+ - Single project with multiple boards
102
+ - Issues assigned to boards via epics
103
+ - Boards own specific specs
104
+
105
+ **Folder Structure**:
106
+ ```
107
+ .specweave/docs/internal/specs/PLATFORM/
108
+ ├── Alpha/
109
+ │ └── spec-001-feature-a.md → Board: Alpha
110
+ ├── Beta/
111
+ │ └── spec-001-feature-b.md → Board: Beta
112
+ └── Gamma/
113
+ └── spec-001-feature-c.md → Board: Gamma
114
+ ```
115
+
116
+ ## Project Detection Algorithm
117
+
118
+ ### Step 1: Analyze Spec Content
119
+
120
+ ```typescript
121
+ interface ProjectConfidence {
122
+ project: string;
123
+ confidence: number;
124
+ reasons: string[];
125
+ }
126
+
127
+ function detectProject(spec: SpecContent): ProjectConfidence[] {
128
+ const results: ProjectConfidence[] = [];
129
+
130
+ for (const project of availableProjects) {
131
+ let confidence = 0;
132
+ const reasons: string[] = [];
133
+
134
+ // Check title
135
+ if (spec.title.toLowerCase().includes(project.toLowerCase())) {
136
+ confidence += 0.5;
137
+ reasons.push(`Title contains "${project}"`);
138
+ }
139
+
140
+ // Check keywords
141
+ const keywords = getProjectKeywords(project);
142
+ for (const keyword of keywords) {
143
+ if (spec.content.includes(keyword)) {
144
+ confidence += 0.2;
145
+ reasons.push(`Found keyword "${keyword}"`);
146
+ }
147
+ }
148
+
149
+ // Check file patterns
150
+ const patterns = getProjectFilePatterns(project);
151
+ for (const pattern of patterns) {
152
+ if (spec.files.some(f => f.match(pattern))) {
153
+ confidence += 0.3;
154
+ reasons.push(`File matches pattern "${pattern}"`);
155
+ }
156
+ }
157
+
158
+ results.push({ project, confidence, reasons });
159
+ }
160
+
161
+ return results.sort((a, b) => b.confidence - a.confidence);
162
+ }
163
+ ```
164
+
165
+ ### Step 2: Project Keywords
166
+
167
+ ```typescript
168
+ const projectKeywords = {
169
+ 'AUTH': [
170
+ 'authentication', 'auth', 'login', 'logout', 'oauth',
171
+ 'jwt', 'session', 'password', 'credential', 'token'
172
+ ],
173
+ 'USER': [
174
+ 'user', 'profile', 'account', 'registration', 'preferences',
175
+ 'settings', 'avatar', 'username', 'email verification'
176
+ ],
177
+ 'PAY': [
178
+ 'payment', 'billing', 'stripe', 'paypal', 'invoice',
179
+ 'subscription', 'charge', 'refund', 'credit card'
180
+ ],
181
+ 'NOTIFY': [
182
+ 'notification', 'email', 'sms', 'push', 'alert',
183
+ 'message', 'webhook', 'queue', 'sendgrid', 'twilio'
184
+ ]
185
+ };
186
+ ```
187
+
188
+ ### Step 3: Decision Logic
189
+
190
+ ```typescript
191
+ async function selectProject(spec: SpecContent): Promise<string> {
192
+ const candidates = detectProject(spec);
193
+
194
+ // High confidence: Auto-select
195
+ if (candidates[0]?.confidence > 0.7) {
196
+ console.log(`Auto-selected: ${candidates[0].project}`);
197
+ console.log(` Confidence: ${candidates[0].confidence}`);
198
+ console.log(` Reasons: ${candidates[0].reasons.join(', ')}`);
199
+ return candidates[0].project;
200
+ }
201
+
202
+ // Medium confidence: Show suggestions
203
+ if (candidates[0]?.confidence > 0.4) {
204
+ console.log(`Suggested project: ${candidates[0].project}`);
205
+ console.log(` Confidence: ${candidates[0].confidence}`);
206
+
207
+ const confirm = await prompt('Use suggested project?');
208
+ if (confirm) {
209
+ return candidates[0].project;
210
+ }
211
+ }
212
+
213
+ // Low confidence: Manual selection
214
+ console.log('Cannot determine project automatically');
215
+ return await promptProjectSelection(candidates);
216
+ }
217
+ ```
218
+
219
+ ## Multi-Project Sync Workflow
220
+
221
+ ### Export: Spec to Multiple JIRA Projects
222
+
223
+ **Scenario**: Checkout flow spanning 3 projects
224
+
225
+ **Input**:
226
+ ```yaml
227
+ # spec-002-checkout-flow.md
228
+ title: Implement Complete Checkout Flow
229
+ projects:
230
+ primary: PAY
231
+ secondary:
232
+ - USER
233
+ - NOTIFY
234
+ ```
235
+
236
+ **Process**:
237
+
238
+ 1. **Create Primary Epic** (PAY):
239
+ ```
240
+ Project: PAY
241
+ Epic: [SPEC-002] Checkout Payment Processing
242
+ Description: Primary implementation of checkout flow
243
+ Labels: specweave, multi-project, primary
244
+ Custom Fields:
245
+ - SpecWeave.SpecID: spec-002
246
+ - SpecWeave.LinkedProjects: USER,NOTIFY
247
+ ```
248
+
249
+ 2. **Create Linked Stories** (USER):
250
+ ```
251
+ Project: USER
252
+ Story: [SPEC-002] Checkout User Management
253
+ Description: User-related checkout functionality
254
+ Labels: specweave, multi-project, linked
255
+ Epic Link: PAY-123
256
+ Custom Fields:
257
+ - SpecWeave.SpecID: spec-002
258
+ - SpecWeave.PrimaryProject: PAY
259
+ ```
260
+
261
+ 3. **Create Linked Stories** (NOTIFY):
262
+ ```
263
+ Project: NOTIFY
264
+ Story: [SPEC-002] Checkout Notifications
265
+ Description: Notification functionality for checkout
266
+ Labels: specweave, multi-project, linked
267
+ Epic Link: PAY-123
268
+ ```
269
+
270
+ 4. **Create Cross-Project Links**:
271
+ ```typescript
272
+ // Use JIRA REST API to create links
273
+ await createLink(primaryEpicId, userStoryId, 'relates to');
274
+ await createLink(primaryEpicId, notifyStoryId, 'relates to');
275
+ ```
276
+
277
+ ### Import: Multiple JIRA Projects to Spec
278
+
279
+ **Process**:
280
+
281
+ 1. **Detect Multi-Project Issues**:
282
+ ```typescript
283
+ async function detectMultiProjectSpec(issueKey: string) {
284
+ const issue = await getIssue(issueKey);
285
+ const linkedProjects = issue.customFields['SpecWeave.LinkedProjects'];
286
+
287
+ if (linkedProjects) {
288
+ // This is a multi-project spec
289
+ return {
290
+ primary: issue.project,
291
+ secondary: linkedProjects.split(','),
292
+ specId: issue.customFields['SpecWeave.SpecID']
293
+ };
294
+ }
295
+
296
+ return null;
297
+ }
298
+ ```
299
+
300
+ 2. **Gather Issues from All Projects**:
301
+ ```typescript
302
+ async function gatherMultiProjectIssues(specId: string) {
303
+ const issues = [];
304
+
305
+ for (const project of allProjects) {
306
+ const jql = `project = "${project}" AND "SpecWeave.SpecID" ~ "${specId}"`;
307
+ const items = await searchJira(jql);
308
+ issues.push(...items);
309
+ }
310
+
311
+ return issues;
312
+ }
313
+ ```
314
+
315
+ 3. **Create Unified Spec**:
316
+ ```typescript
317
+ async function createUnifiedSpec(issues: JiraIssue[]) {
318
+ const primaryIssue = issues.find(i => i.labels.includes('primary'));
319
+ const linkedIssues = issues.filter(i => i.labels.includes('linked'));
320
+
321
+ const spec = {
322
+ title: primaryIssue.summary,
323
+ projects: {
324
+ primary: primaryIssue.project,
325
+ secondary: linkedIssues.map(i => i.project)
326
+ },
327
+ user_stories: mergeUserStories(issues),
328
+ tasks: mergeTasks(issues)
329
+ };
330
+
331
+ return spec;
332
+ }
333
+ ```
334
+
335
+ ## Component Mapping
336
+
337
+ For component-based strategy:
338
+
339
+ ```typescript
340
+ function mapSpecToComponent(spec: SpecContent): string {
341
+ const components = getConfiguredComponents();
342
+
343
+ for (const component of components) {
344
+ if (spec.content.toLowerCase().includes(component.toLowerCase())) {
345
+ return component;
346
+ }
347
+ }
348
+
349
+ // Default component
350
+ return defaultComponent;
351
+ }
352
+ ```
353
+
354
+ ## Board Assignment
355
+
356
+ For epic-based strategy:
357
+
358
+ ```typescript
359
+ function assignToBoard(spec: SpecContent): string {
360
+ const boards = getConfiguredBoards();
361
+
362
+ // Check explicit board mention
363
+ if (spec.frontmatter.board) {
364
+ return spec.frontmatter.board;
365
+ }
366
+
367
+ // Auto-detect based on content
368
+ const boardKeywords = {
369
+ 'Alpha': ['frontend', 'ui', 'react', 'vue'],
370
+ 'Beta': ['backend', 'api', 'database', 'postgres'],
371
+ 'Gamma': ['mobile', 'ios', 'android', 'flutter']
372
+ };
373
+
374
+ for (const [board, keywords] of Object.entries(boardKeywords)) {
375
+ if (keywords.some(k => spec.content.toLowerCase().includes(k))) {
376
+ return board;
377
+ }
378
+ }
379
+
380
+ return boards[0]; // Default board
381
+ }
382
+ ```
383
+
384
+ ## Conflict Resolution
385
+
386
+ ### Scenario: Same spec updated in multiple projects
387
+
388
+ ```typescript
389
+ async function resolveMultiProjectConflict(specId: string) {
390
+ const updates = await getRecentUpdates(specId);
391
+
392
+ if (updates.length > 1) {
393
+ console.log('Conflict detected:');
394
+ for (const update of updates) {
395
+ console.log(` ${update.project}: Updated ${update.timestamp}`);
396
+ }
397
+
398
+ const resolution = await prompt('Resolution strategy?', [
399
+ 'Use most recent',
400
+ 'Merge all changes',
401
+ 'Manual resolution'
402
+ ]);
403
+
404
+ switch (resolution) {
405
+ case 'Use most recent':
406
+ return updates[0]; // Already sorted by timestamp
407
+ case 'Merge all changes':
408
+ return mergeUpdates(updates);
409
+ case 'Manual resolution':
410
+ return await manualMerge(updates);
411
+ }
412
+ }
413
+ }
414
+ ```
415
+
416
+ ## Folder Organization
417
+
418
+ ### Create Project Folders
419
+
420
+ ```typescript
421
+ async function createProjectFolders(projects: string[], strategy: string) {
422
+ const basePath = '.specweave/docs/internal/specs';
423
+
424
+ switch (strategy) {
425
+ case 'project-per-team':
426
+ for (const project of projects) {
427
+ await fs.mkdirSync(`${basePath}/${project}`, { recursive: true });
428
+ await createProjectReadme(project);
429
+ }
430
+ break;
431
+
432
+ case 'component-based':
433
+ const project = projects[0];
434
+ const components = getComponents();
435
+ for (const component of components) {
436
+ await fs.mkdirSync(`${basePath}/${project}/${component}`, { recursive: true });
437
+ }
438
+ break;
439
+
440
+ case 'epic-based':
441
+ const proj = projects[0];
442
+ const boards = getBoards();
443
+ for (const board of boards) {
444
+ await fs.mkdirSync(`${basePath}/${proj}/${board}`, { recursive: true });
445
+ }
446
+ break;
447
+ }
448
+ }
449
+ ```
450
+
451
+ ### Project README Template
452
+
453
+ ```typescript
454
+ function createProjectReadme(project: string): string {
455
+ return `# ${project} Specifications
456
+
457
+ ## Overview
458
+ This folder contains specifications for the ${project} JIRA project.
459
+
460
+ ## JIRA
461
+ - Domain: ${getDomain()}
462
+ - Project: ${project}
463
+ - URL: https://${getDomain()}/browse/${project}
464
+
465
+ ## Specifications
466
+ - [spec-001-feature.md](spec-001-feature.md) - Initial feature
467
+
468
+ ## Team
469
+ - Lead: TBD
470
+ - Members: TBD
471
+
472
+ ## Keywords
473
+ ${projectKeywords[project]?.join(', ') || 'TBD'}
474
+ `;
475
+ }
476
+ ```
477
+
478
+ ## Error Handling
479
+
480
+ ### Project Not Found
481
+
482
+ ```typescript
483
+ async function handleProjectNotFound(projectKey: string) {
484
+ console.error(`Project "${projectKey}" not found in JIRA`);
485
+
486
+ const action = await prompt('What would you like to do?', [
487
+ 'Select different project',
488
+ 'Skip'
489
+ ]);
490
+
491
+ switch (action) {
492
+ case 'Select different project':
493
+ return await selectExistingProject();
494
+ case 'Skip':
495
+ return null;
496
+ }
497
+ }
498
+ ```
499
+
500
+ ### API Rate Limiting
501
+
502
+ ```typescript
503
+ async function handleRateLimit(response: Response) {
504
+ const retryAfter = response.headers.get('Retry-After');
505
+
506
+ if (retryAfter) {
507
+ console.log(`Rate limited. Waiting ${retryAfter} seconds...`);
508
+ await sleep(parseInt(retryAfter) * 1000);
509
+ return true; // Retry
510
+ }
511
+
512
+ return false; // Don't retry
513
+ }
514
+ ```
515
+
516
+ ## Summary
517
+
518
+ This agent enables sophisticated multi-project JIRA sync by:
519
+
520
+ 1. **Intelligent project detection** from spec content
521
+ 2. **Support for 3 strategies** (project-per-team, component-based, epic-based)
522
+ 3. **Cross-project coordination** with links and dependencies
523
+ 4. **Bidirectional sync** with conflict resolution
524
+ 5. **Automatic folder organization** based on projects
525
+
526
+ ---
527
+
528
+ **Agent Version**: 1.0.0
529
+ **Introduced**: SpecWeave v0.33.0
530
+ **Last Updated**: 2025-12-07