specweave 0.17.16 → 0.17.19

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 (232) hide show
  1. package/CLAUDE.md +405 -2495
  2. package/README.md +92 -2
  3. package/dist/locales/de/.gitkeep +0 -0
  4. package/dist/locales/de/cli.json +108 -0
  5. package/dist/locales/en/cli.json +287 -0
  6. package/dist/locales/en/errors.json +7 -0
  7. package/dist/locales/en/templates.json +6 -0
  8. package/dist/locales/es/.gitkeep +0 -0
  9. package/dist/locales/es/cli.json +41 -0
  10. package/dist/locales/fr/.gitkeep +0 -0
  11. package/dist/locales/fr/cli.json +108 -0
  12. package/dist/locales/ja/.gitkeep +0 -0
  13. package/dist/locales/ja/cli.json +108 -0
  14. package/dist/locales/ko/.gitkeep +0 -0
  15. package/dist/locales/ko/cli.json +108 -0
  16. package/dist/locales/pt/.gitkeep +0 -0
  17. package/dist/locales/pt/cli.json +108 -0
  18. package/dist/locales/ru/.gitkeep +0 -0
  19. package/dist/locales/ru/cli.json +269 -0
  20. package/dist/locales/zh/.gitkeep +0 -0
  21. package/dist/locales/zh/cli.json +108 -0
  22. package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
  23. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +188 -36
  24. package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
  25. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
  26. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
  27. package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
  28. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +54 -0
  29. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -0
  30. package/dist/plugins/specweave-ado/lib/ado-status-sync.js +86 -0
  31. package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -0
  32. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
  33. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
  34. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
  35. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
  36. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +139 -0
  37. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts.map +1 -0
  38. package/dist/plugins/specweave-github/lib/duplicate-detector.js +389 -0
  39. package/dist/plugins/specweave-github/lib/duplicate-detector.js.map +1 -0
  40. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +26 -0
  41. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +1 -0
  42. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +249 -0
  43. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +1 -0
  44. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +63 -0
  45. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
  46. package/dist/plugins/specweave-github/lib/epic-content-builder.js +216 -0
  47. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
  48. package/dist/plugins/specweave-github/lib/github-client.d.ts +1 -1
  49. package/dist/plugins/specweave-github/lib/github-client.d.ts.map +1 -1
  50. package/dist/plugins/specweave-github/lib/github-client.js +25 -13
  51. package/dist/plugins/specweave-github/lib/github-client.js.map +1 -1
  52. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +83 -0
  53. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -0
  54. package/dist/plugins/specweave-github/lib/github-epic-sync.js +466 -0
  55. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -0
  56. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +43 -0
  57. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -0
  58. package/dist/plugins/specweave-github/lib/github-status-sync.js +82 -0
  59. package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -0
  60. package/dist/plugins/specweave-github/lib/task-sync.d.ts +5 -0
  61. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
  62. package/dist/plugins/specweave-github/lib/task-sync.js +38 -2
  63. package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
  64. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
  65. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
  66. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
  67. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
  68. package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts +66 -0
  69. package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts.map +1 -0
  70. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +274 -0
  71. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -0
  72. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +56 -0
  73. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -0
  74. package/dist/plugins/specweave-jira/lib/jira-status-sync.js +93 -0
  75. package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -0
  76. package/dist/spec-parser.js +629 -0
  77. package/dist/src/cli/commands/init.d.ts.map +1 -1
  78. package/dist/src/cli/commands/init.js +107 -3
  79. package/dist/src/cli/commands/init.js.map +1 -1
  80. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  81. package/dist/src/cli/helpers/issue-tracker/index.js +48 -3
  82. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  83. package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
  84. package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
  85. package/dist/src/core/deduplication/command-deduplicator.js +254 -0
  86. package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
  87. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +142 -0
  88. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -0
  89. package/dist/src/core/living-docs/hierarchy-mapper.js +453 -0
  90. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -0
  91. package/dist/src/core/living-docs/index.d.ts +10 -84
  92. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  93. package/dist/src/core/living-docs/index.js +10 -164
  94. package/dist/src/core/living-docs/index.js.map +1 -1
  95. package/dist/src/core/living-docs/spec-distributor.d.ts +106 -0
  96. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -0
  97. package/dist/src/core/living-docs/spec-distributor.js +823 -0
  98. package/dist/src/core/living-docs/spec-distributor.js.map +1 -0
  99. package/dist/src/core/living-docs/types.d.ts +201 -0
  100. package/dist/src/core/living-docs/types.d.ts.map +1 -0
  101. package/dist/src/core/living-docs/types.js +15 -0
  102. package/dist/src/core/living-docs/types.js.map +1 -0
  103. package/dist/src/core/logging/prompt-logger.d.ts +70 -0
  104. package/dist/src/core/logging/prompt-logger.d.ts.map +1 -0
  105. package/dist/src/core/logging/prompt-logger.js +247 -0
  106. package/dist/src/core/logging/prompt-logger.js.map +1 -0
  107. package/dist/src/core/status-line/status-line-manager.d.ts +15 -24
  108. package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
  109. package/dist/src/core/status-line/status-line-manager.js +33 -70
  110. package/dist/src/core/status-line/status-line-manager.js.map +1 -1
  111. package/dist/src/core/status-line/types.d.ts +19 -31
  112. package/dist/src/core/status-line/types.d.ts.map +1 -1
  113. package/dist/src/core/status-line/types.js +5 -9
  114. package/dist/src/core/status-line/types.js.map +1 -1
  115. package/dist/src/core/sync/conflict-resolver.d.ts +66 -0
  116. package/dist/src/core/sync/conflict-resolver.d.ts.map +1 -0
  117. package/dist/src/core/sync/conflict-resolver.js +108 -0
  118. package/dist/src/core/sync/conflict-resolver.js.map +1 -0
  119. package/dist/src/core/sync/enhanced-content-builder.d.ts +55 -0
  120. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -0
  121. package/dist/src/core/sync/enhanced-content-builder.js +202 -0
  122. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -0
  123. package/dist/src/core/sync/label-detector.d.ts +66 -0
  124. package/dist/src/core/sync/label-detector.d.ts.map +1 -0
  125. package/dist/src/core/sync/label-detector.js +211 -0
  126. package/dist/src/core/sync/label-detector.js.map +1 -0
  127. package/dist/src/core/sync/retry-logic.d.ts +64 -0
  128. package/dist/src/core/sync/retry-logic.d.ts.map +1 -0
  129. package/dist/src/core/sync/retry-logic.js +165 -0
  130. package/dist/src/core/sync/retry-logic.js.map +1 -0
  131. package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
  132. package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
  133. package/dist/src/core/sync/spec-content-sync.js +5 -0
  134. package/dist/src/core/sync/spec-content-sync.js.map +1 -0
  135. package/dist/src/core/sync/spec-increment-mapper.d.ts +100 -0
  136. package/dist/src/core/sync/spec-increment-mapper.d.ts.map +1 -0
  137. package/dist/src/core/sync/spec-increment-mapper.js +424 -0
  138. package/dist/src/core/sync/spec-increment-mapper.js.map +1 -0
  139. package/dist/src/core/sync/status-cache.d.ts +91 -0
  140. package/dist/src/core/sync/status-cache.d.ts.map +1 -0
  141. package/dist/src/core/sync/status-cache.js +140 -0
  142. package/dist/src/core/sync/status-cache.js.map +1 -0
  143. package/dist/src/core/sync/status-mapper.d.ts +69 -0
  144. package/dist/src/core/sync/status-mapper.d.ts.map +1 -0
  145. package/dist/src/core/sync/status-mapper.js +90 -0
  146. package/dist/src/core/sync/status-mapper.js.map +1 -0
  147. package/dist/src/core/sync/status-sync-engine.d.ts +162 -0
  148. package/dist/src/core/sync/status-sync-engine.d.ts.map +1 -0
  149. package/dist/src/core/sync/status-sync-engine.js +347 -0
  150. package/dist/src/core/sync/status-sync-engine.js.map +1 -0
  151. package/dist/src/core/sync/sync-event-logger.d.ts +99 -0
  152. package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -0
  153. package/dist/src/core/sync/sync-event-logger.js +103 -0
  154. package/dist/src/core/sync/sync-event-logger.js.map +1 -0
  155. package/dist/src/core/sync/types.d.ts +52 -0
  156. package/dist/src/core/sync/types.d.ts.map +1 -0
  157. package/dist/src/core/sync/types.js +5 -0
  158. package/dist/src/core/sync/types.js.map +1 -0
  159. package/dist/src/core/sync/workflow-detector.d.ts +95 -0
  160. package/dist/src/core/sync/workflow-detector.d.ts.map +1 -0
  161. package/dist/src/core/sync/workflow-detector.js +175 -0
  162. package/dist/src/core/sync/workflow-detector.js.map +1 -0
  163. package/dist/src/core/types/config.d.ts +51 -0
  164. package/dist/src/core/types/config.d.ts.map +1 -1
  165. package/dist/src/core/types/config.js +47 -0
  166. package/dist/src/core/types/config.js.map +1 -1
  167. package/dist/src/core/types/increment-metadata.d.ts +4 -0
  168. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  169. package/dist/src/core/types/increment-metadata.js.map +1 -1
  170. package/dist/src/utils/github-url.d.ts +53 -0
  171. package/dist/src/utils/github-url.d.ts.map +1 -0
  172. package/dist/src/utils/github-url.js +90 -0
  173. package/dist/src/utils/github-url.js.map +1 -0
  174. package/dist/src/utils/spec-parser.d.ts +145 -0
  175. package/dist/src/utils/spec-parser.d.ts.map +1 -0
  176. package/dist/src/utils/spec-parser.js +640 -0
  177. package/dist/src/utils/spec-parser.js.map +1 -0
  178. package/dist/tsconfig.tsbuildinfo +1 -0
  179. package/package.json +1 -1
  180. package/plugins/specweave/agents/pm/AGENT.md +160 -13
  181. package/plugins/specweave/agents/pm/templates/increment-spec.md +158 -0
  182. package/plugins/specweave/agents/pm/templates/living-docs-spec.md +113 -0
  183. package/plugins/specweave/commands/specweave-done.md +163 -0
  184. package/plugins/specweave/commands/specweave.md +70 -405
  185. package/plugins/specweave/hooks/hooks.json +4 -0
  186. package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
  187. package/plugins/specweave/hooks/lib/update-status-line.sh +79 -111
  188. package/plugins/specweave/hooks/post-increment-planning.sh +133 -37
  189. package/plugins/specweave/hooks/pre-command-deduplication.sh +86 -0
  190. package/plugins/specweave/lib/hooks/sync-living-docs.js +139 -34
  191. package/plugins/specweave/lib/hooks/sync-living-docs.ts +234 -38
  192. package/plugins/specweave/skills/SKILLS-INDEX.md +4 -24
  193. package/plugins/specweave/skills/increment-planner/SKILL.md +94 -0
  194. package/plugins/specweave/skills/increment-work-router/SKILL.md +466 -0
  195. package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +1 -1
  196. package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
  197. package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
  198. package/plugins/specweave-ado/lib/ado-status-sync.js +80 -0
  199. package/plugins/specweave-ado/lib/ado-status-sync.ts +121 -0
  200. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  201. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +205 -0
  202. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +248 -0
  203. package/plugins/specweave-github/commands/specweave-github-sync-spec.md +1 -1
  204. package/plugins/specweave-github/hooks/post-task-completion.sh +32 -0
  205. package/plugins/specweave-github/lib/duplicate-detector.js +370 -0
  206. package/plugins/specweave-github/lib/duplicate-detector.ts +525 -0
  207. package/plugins/specweave-github/lib/enhanced-github-sync.js +220 -0
  208. package/plugins/specweave-github/lib/enhanced-github-sync.ts +322 -0
  209. package/plugins/specweave-github/lib/epic-content-builder.js +227 -0
  210. package/plugins/specweave-github/lib/epic-content-builder.ts +317 -0
  211. package/plugins/specweave-github/lib/github-client.js +21 -10
  212. package/plugins/specweave-github/lib/github-client.ts +27 -16
  213. package/plugins/specweave-github/lib/github-epic-sync.js +488 -0
  214. package/plugins/specweave-github/lib/github-epic-sync.ts +715 -0
  215. package/plugins/specweave-github/lib/github-status-sync.js +71 -0
  216. package/plugins/specweave-github/lib/github-status-sync.ts +107 -0
  217. package/plugins/specweave-github/lib/task-sync.js +33 -2
  218. package/plugins/specweave-github/lib/task-sync.ts +44 -2
  219. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +267 -0
  220. package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +1 -1
  221. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
  222. package/plugins/specweave-jira/lib/enhanced-jira-sync.ts +196 -0
  223. package/plugins/specweave-jira/lib/jira-epic-sync.js +304 -0
  224. package/plugins/specweave-jira/lib/jira-epic-sync.ts +459 -0
  225. package/plugins/specweave-jira/lib/jira-status-sync.js +79 -0
  226. package/plugins/specweave-jira/lib/jira-status-sync.ts +139 -0
  227. package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
  228. package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
  229. package/src/templates/AGENTS.md.template +88 -1
  230. package/src/templates/CLAUDE.md.template +49 -0
  231. package/plugins/specweave/skills/increment-quality-judge/SKILL.md +0 -524
  232. package/plugins/specweave/skills/plugin-installer/SKILL.md +0 -353
@@ -0,0 +1,274 @@
1
+ /**
2
+ * JIRA Epic Sync - Hierarchical synchronization for Epic folder structure
3
+ *
4
+ * Architecture:
5
+ * - Epic (FS-001) → JIRA Epic
6
+ * - Increment (0001-core-framework) → JIRA Story (with Epic Link field)
7
+ *
8
+ * This implements the Universal Hierarchy architecture for JIRA.
9
+ */
10
+ import * as fs from 'fs-extra';
11
+ import * as path from 'path';
12
+ import * as yaml from 'yaml';
13
+ export class JiraEpicSync {
14
+ constructor(client, specsDir, projectKey) {
15
+ this.client = client;
16
+ this.specsDir = specsDir;
17
+ this.projectKey = projectKey;
18
+ }
19
+ /**
20
+ * Sync Epic folder to JIRA (Epic + Stories)
21
+ */
22
+ async syncEpicToJira(epicId) {
23
+ console.log(`\n🔄 Syncing Epic ${epicId} to JIRA...`);
24
+ // 1. Load Epic README.md
25
+ const epicFolder = await this.findEpicFolder(epicId);
26
+ if (!epicFolder) {
27
+ throw new Error(`Epic ${epicId} not found in ${this.specsDir}`);
28
+ }
29
+ const readmePath = path.join(epicFolder, 'README.md');
30
+ const epicData = await this.parseEpicReadme(readmePath);
31
+ console.log(` 📦 Epic: ${epicData.title}`);
32
+ console.log(` 📊 Increments: ${epicData.total_increments}`);
33
+ // 2. Create or update JIRA Epic
34
+ let epicKey = epicData.external_tools.jira.key;
35
+ let epicUrl = epicData.external_tools.jira.url;
36
+ if (!epicKey) {
37
+ console.log(` 🚀 Creating JIRA Epic...`);
38
+ const epic = await this.createEpic(epicData);
39
+ epicKey = epic.key;
40
+ epicUrl = epic.url;
41
+ console.log(` ✅ Created Epic ${epicKey}`);
42
+ // Update Epic README with JIRA key
43
+ await this.updateEpicReadme(readmePath, {
44
+ type: 'epic',
45
+ key: epicKey,
46
+ url: epicUrl,
47
+ });
48
+ }
49
+ else {
50
+ console.log(` ♻️ Updating existing Epic ${epicKey}...`);
51
+ await this.updateEpic(epicKey, epicData);
52
+ console.log(` ✅ Updated Epic ${epicKey}`);
53
+ }
54
+ // 3. Sync each increment as JIRA Story
55
+ let storiesCreated = 0;
56
+ let storiesUpdated = 0;
57
+ console.log(`\n 📝 Syncing ${epicData.increments.length} increments...`);
58
+ for (const increment of epicData.increments) {
59
+ const incrementFile = path.join(epicFolder, `${increment.id}.md`);
60
+ if (!(await fs.pathExists(incrementFile))) {
61
+ console.log(` ⚠️ Increment file not found: ${increment.id}.md`);
62
+ continue;
63
+ }
64
+ const incrementData = await this.parseIncrementFile(incrementFile);
65
+ const existingStory = increment.external.jira;
66
+ if (!existingStory) {
67
+ // Create new Story
68
+ const storyKey = await this.createStory(epicData.id, incrementData, epicKey);
69
+ storiesCreated++;
70
+ console.log(` ✅ Created Story ${storyKey} for ${increment.id}`);
71
+ // Update Epic README and Increment file
72
+ await this.updateIncrementExternalLink(readmePath, incrementFile, increment.id, storyKey);
73
+ }
74
+ else {
75
+ // Update existing Story
76
+ await this.updateStory(epicData.id, existingStory, incrementData, epicKey);
77
+ storiesUpdated++;
78
+ console.log(` ♻️ Updated Story ${existingStory} for ${increment.id}`);
79
+ }
80
+ }
81
+ console.log(`\n✅ Epic sync complete!`);
82
+ console.log(` Epic: ${epicUrl}`);
83
+ console.log(` Stories created: ${storiesCreated}`);
84
+ console.log(` Stories updated: ${storiesUpdated}`);
85
+ return {
86
+ epicKey: epicKey,
87
+ epicUrl: epicUrl,
88
+ storiesCreated,
89
+ storiesUpdated,
90
+ };
91
+ }
92
+ /**
93
+ * Find Epic folder by ID (FS-001 or just 001)
94
+ */
95
+ async findEpicFolder(epicId) {
96
+ const normalizedId = epicId.startsWith('FS-')
97
+ ? epicId
98
+ : `FS-${epicId.padStart(3, '0')}`;
99
+ const folders = await fs.readdir(this.specsDir);
100
+ for (const folder of folders) {
101
+ if (folder.startsWith(normalizedId)) {
102
+ return path.join(this.specsDir, folder);
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Parse Epic README.md to extract frontmatter
109
+ */
110
+ async parseEpicReadme(readmePath) {
111
+ const content = await fs.readFile(readmePath, 'utf-8');
112
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
113
+ if (!match) {
114
+ throw new Error('Epic README.md missing YAML frontmatter');
115
+ }
116
+ const frontmatter = yaml.parse(match[1]);
117
+ return frontmatter;
118
+ }
119
+ /**
120
+ * Parse increment file to extract title and overview
121
+ */
122
+ async parseIncrementFile(filePath) {
123
+ const content = await fs.readFile(filePath, 'utf-8');
124
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
125
+ let frontmatter = { id: '', epic: '' };
126
+ let bodyContent = content;
127
+ if (match) {
128
+ frontmatter = yaml.parse(match[1]);
129
+ bodyContent = content.slice(match[0].length).trim();
130
+ }
131
+ // Extract title
132
+ const titleMatch = bodyContent.match(/^#\s+(.+)$/m);
133
+ const title = titleMatch
134
+ ? titleMatch[1].trim()
135
+ : frontmatter.id || path.basename(filePath, '.md');
136
+ // Extract overview (first paragraph after title)
137
+ const overviewMatch = bodyContent.match(/^#[^\n]+\n+([^\n]+)/);
138
+ const overview = overviewMatch
139
+ ? overviewMatch[1].trim()
140
+ : 'No overview available';
141
+ return {
142
+ id: frontmatter.id,
143
+ title,
144
+ overview,
145
+ content: bodyContent,
146
+ frontmatter,
147
+ };
148
+ }
149
+ /**
150
+ * Create JIRA Epic
151
+ */
152
+ async createEpic(epic) {
153
+ const summary = `[${epic.id}] ${epic.title}`;
154
+ const description = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
155
+ const issueData = {
156
+ issueType: 'Epic',
157
+ summary,
158
+ description,
159
+ priority: this.mapPriorityToJira(epic.priority),
160
+ labels: ['epic-sync', epic.id.toLowerCase()],
161
+ };
162
+ const issue = await this.client.createIssue(issueData, this.projectKey);
163
+ return {
164
+ key: issue.key,
165
+ url: issue.self.replace('/rest/api/3/issue/', '/browse/'),
166
+ };
167
+ }
168
+ /**
169
+ * Update JIRA Epic
170
+ */
171
+ async updateEpic(epicKey, epic) {
172
+ const summary = `[${epic.id}] ${epic.title}`;
173
+ const description = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
174
+ await this.client.updateIssue({
175
+ key: epicKey,
176
+ summary,
177
+ description,
178
+ priority: this.mapPriorityToJira(epic.priority),
179
+ labels: ['epic-sync', epic.id.toLowerCase()],
180
+ });
181
+ }
182
+ /**
183
+ * Create JIRA Story for increment
184
+ */
185
+ async createStory(epicId, increment, epicKey) {
186
+ const summary = `[${epicId}] ${increment.title}`;
187
+ const description = `${increment.overview}\n\n---\n\n**Increment**: ${increment.id}\n**Epic**: ${epicId} (${epicKey})\n\n🤖 Auto-created by SpecWeave Epic Sync`;
188
+ const issueData = {
189
+ issueType: 'Story',
190
+ summary,
191
+ description,
192
+ epicKey, // Link to Epic via Epic Link field
193
+ labels: ['increment', 'epic-sync'],
194
+ };
195
+ const issue = await this.client.createIssue(issueData, this.projectKey);
196
+ return issue.key;
197
+ }
198
+ /**
199
+ * Update JIRA Story for increment
200
+ */
201
+ async updateStory(epicId, storyKey, increment, epicKey) {
202
+ const summary = `[${epicId}] ${increment.title}`;
203
+ const description = `${increment.overview}\n\n---\n\n**Increment**: ${increment.id}\n**Epic**: ${epicId} (${epicKey})\n\n🤖 Auto-updated by SpecWeave Epic Sync`;
204
+ await this.client.updateIssue({
205
+ key: storyKey,
206
+ summary,
207
+ description,
208
+ labels: ['increment', 'epic-sync'],
209
+ });
210
+ }
211
+ /**
212
+ * Map SpecWeave priority to JIRA priority
213
+ */
214
+ mapPriorityToJira(priority) {
215
+ const map = {
216
+ P0: 'Highest',
217
+ P1: 'High',
218
+ P2: 'Medium',
219
+ P3: 'Low',
220
+ };
221
+ return map[priority] || 'Medium';
222
+ }
223
+ /**
224
+ * Update Epic README.md with JIRA Epic key
225
+ */
226
+ async updateEpicReadme(readmePath, jira) {
227
+ const content = await fs.readFile(readmePath, 'utf-8');
228
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
229
+ if (!match) {
230
+ throw new Error('Epic README.md missing YAML frontmatter');
231
+ }
232
+ const frontmatter = yaml.parse(match[1]);
233
+ frontmatter.external_tools.jira = jira;
234
+ const newFrontmatter = yaml.stringify(frontmatter);
235
+ const newContent = content.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
236
+ await fs.writeFile(readmePath, newContent, 'utf-8');
237
+ }
238
+ /**
239
+ * Update increment external link in both Epic README and increment file
240
+ */
241
+ async updateIncrementExternalLink(readmePath, incrementFile, incrementId, storyKey) {
242
+ const storyUrl = `https://${this.client['credentials'].domain}/browse/${storyKey}`;
243
+ // 1. Update Epic README.md
244
+ const readmeContent = await fs.readFile(readmePath, 'utf-8');
245
+ const readmeMatch = readmeContent.match(/^---\n([\s\S]*?)\n---/);
246
+ if (readmeMatch) {
247
+ const frontmatter = yaml.parse(readmeMatch[1]);
248
+ const increment = frontmatter.increments.find((inc) => inc.id === incrementId);
249
+ if (increment) {
250
+ increment.external.jira = storyKey;
251
+ const newFrontmatter = yaml.stringify(frontmatter);
252
+ const newContent = readmeContent.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
253
+ await fs.writeFile(readmePath, newContent, 'utf-8');
254
+ }
255
+ }
256
+ // 2. Update increment file frontmatter
257
+ const incrementContent = await fs.readFile(incrementFile, 'utf-8');
258
+ const incrementMatch = incrementContent.match(/^---\n([\s\S]*?)\n---/);
259
+ if (incrementMatch) {
260
+ const frontmatter = yaml.parse(incrementMatch[1]);
261
+ if (!frontmatter.external) {
262
+ frontmatter.external = {};
263
+ }
264
+ frontmatter.external.jira = {
265
+ story: storyKey,
266
+ url: storyUrl,
267
+ };
268
+ const newFrontmatter = yaml.stringify(frontmatter);
269
+ const newContent = incrementContent.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
270
+ await fs.writeFile(incrementFile, newContent, 'utf-8');
271
+ }
272
+ }
273
+ }
274
+ //# sourceMappingURL=jira-epic-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-epic-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-epic-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * JIRA Status Sync
3
+ *
4
+ * Synchronizes SpecWeave increment statuses with JIRA issue statuses.
5
+ *
6
+ * JIRA Status Transitions:
7
+ * - Uses JIRA transitions API to change issue status
8
+ * - Available transitions depend on workflow configuration
9
+ * - Must fetch available transitions before applying
10
+ *
11
+ * @module jira-status-sync
12
+ */
13
+ /**
14
+ * External status representation (JIRA-specific)
15
+ */
16
+ export interface ExternalStatus {
17
+ state: string;
18
+ labels?: string[];
19
+ }
20
+ /**
21
+ * JIRA Status Sync
22
+ *
23
+ * Handles status synchronization with JIRA issues.
24
+ */
25
+ export declare class JiraStatusSync {
26
+ private client;
27
+ private domain;
28
+ private projectKey;
29
+ constructor(domain: string, email: string, apiToken: string, projectKey: string);
30
+ /**
31
+ * Get current status from JIRA issue
32
+ *
33
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
34
+ * @returns Current issue status
35
+ */
36
+ getStatus(issueKey: string): Promise<ExternalStatus>;
37
+ /**
38
+ * Update JIRA issue status via transitions
39
+ *
40
+ * JIRA requires using transitions to change status.
41
+ * Cannot directly set status field.
42
+ *
43
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
44
+ * @param status - Desired status
45
+ */
46
+ updateStatus(issueKey: string, status: ExternalStatus): Promise<void>;
47
+ /**
48
+ * Post comment about status change to JIRA issue
49
+ *
50
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
51
+ * @param oldStatus - Previous SpecWeave status
52
+ * @param newStatus - New SpecWeave status
53
+ */
54
+ postStatusComment(issueKey: string, oldStatus: string, newStatus: string): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=jira-status-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-status-sync.d.ts","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-status-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAaD;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;gBAGzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;IAmBpB;;;;;OAKG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQ1D;;;;;;;;OAQG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB3E;;;;;;OAMG;IACG,iBAAiB,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;CAYjB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * JIRA Status Sync
3
+ *
4
+ * Synchronizes SpecWeave increment statuses with JIRA issue statuses.
5
+ *
6
+ * JIRA Status Transitions:
7
+ * - Uses JIRA transitions API to change issue status
8
+ * - Available transitions depend on workflow configuration
9
+ * - Must fetch available transitions before applying
10
+ *
11
+ * @module jira-status-sync
12
+ */
13
+ import axios from 'axios';
14
+ /**
15
+ * JIRA Status Sync
16
+ *
17
+ * Handles status synchronization with JIRA issues.
18
+ */
19
+ export class JiraStatusSync {
20
+ constructor(domain, email, apiToken, projectKey) {
21
+ this.domain = domain;
22
+ this.projectKey = projectKey;
23
+ // Create JIRA API client
24
+ this.client = axios.create({
25
+ baseURL: `https://${domain}/rest/api/3`,
26
+ auth: {
27
+ username: email,
28
+ password: apiToken
29
+ },
30
+ headers: {
31
+ 'Accept': 'application/json',
32
+ 'Content-Type': 'application/json'
33
+ }
34
+ });
35
+ }
36
+ /**
37
+ * Get current status from JIRA issue
38
+ *
39
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
40
+ * @returns Current issue status
41
+ */
42
+ async getStatus(issueKey) {
43
+ const response = await this.client.get(`/issue/${issueKey}`);
44
+ return {
45
+ state: response.data.fields.status.name
46
+ };
47
+ }
48
+ /**
49
+ * Update JIRA issue status via transitions
50
+ *
51
+ * JIRA requires using transitions to change status.
52
+ * Cannot directly set status field.
53
+ *
54
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
55
+ * @param status - Desired status
56
+ */
57
+ async updateStatus(issueKey, status) {
58
+ // 1. Get available transitions for this issue
59
+ const transitionsResponse = await this.client.get(`/issue/${issueKey}/transitions`);
60
+ const transitions = transitionsResponse.data.transitions;
61
+ // 2. Find transition that leads to desired status
62
+ const targetTransition = transitions.find((t) => t.to.name === status.state);
63
+ if (!targetTransition) {
64
+ throw new Error(`Transition to ${status.state} not available for ${issueKey}. ` +
65
+ `Available transitions: ${transitions.map(t => t.to.name).join(', ')}`);
66
+ }
67
+ // 3. Execute transition
68
+ await this.client.post(`/issue/${issueKey}/transitions`, {
69
+ transition: {
70
+ id: targetTransition.id
71
+ }
72
+ });
73
+ }
74
+ /**
75
+ * Post comment about status change to JIRA issue
76
+ *
77
+ * @param issueKey - JIRA issue key (e.g., PROJ-123)
78
+ * @param oldStatus - Previous SpecWeave status
79
+ * @param newStatus - New SpecWeave status
80
+ */
81
+ async postStatusComment(issueKey, oldStatus, newStatus) {
82
+ const body = `🔄 *Status Update*\n\n` +
83
+ `SpecWeave status changed:\n` +
84
+ `• *From*: ${oldStatus}\n` +
85
+ `• *To*: ${newStatus}\n` +
86
+ `• *When*: ${new Date().toISOString()}\n\n` +
87
+ `_Synced from SpecWeave_`;
88
+ await this.client.post(`/issue/${issueKey}/comment`, {
89
+ body
90
+ });
91
+ }
92
+ }
93
+ //# sourceMappingURL=jira-status-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-status-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/jira-status-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAwB,MAAM,OAAO,CAAC;AAqB7C;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAKzB,YACE,MAAc,EACd,KAAa,EACb,QAAgB,EAChB,UAAkB;QAElB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,yBAAyB;QACzB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,WAAW,MAAM,aAAa;YACvC,IAAI,EAAE;gBACJ,QAAQ,EAAE,KAAK;gBACf,QAAQ,EAAE,QAAQ;aACnB;YACD,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;SACxC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,MAAsB;QACzD,8CAA8C;QAC9C,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,QAAQ,cAAc,CAAC,CAAC;QACpF,MAAM,WAAW,GAAqB,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC;QAE3E,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAClC,CAAC;QAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,CAAC,KAAK,sBAAsB,QAAQ,IAAI;gBAC/D,0BAA0B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,cAAc,EAAE;YACvD,UAAU,EAAE;gBACV,EAAE,EAAE,gBAAgB,CAAC,EAAE;aACxB;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,SAAiB,EACjB,SAAiB;QAEjB,MAAM,IAAI,GAAG,wBAAwB;YACnC,6BAA6B;YAC7B,aAAa,SAAS,IAAI;YAC1B,WAAW,SAAS,IAAI;YACxB,aAAa,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM;YAC3C,yBAAyB,CAAC;QAE5B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,UAAU,EAAE;YACnD,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF"}