specweave 0.28.17 → 0.28.20

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 (204) hide show
  1. package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts +94 -0
  2. package/dist/plugins/specweave-ado/lib/ado-board-resolver.d.ts.map +1 -0
  3. package/dist/plugins/specweave-ado/lib/ado-board-resolver.js +219 -0
  4. package/dist/plugins/specweave-ado/lib/ado-board-resolver.js.map +1 -0
  5. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +16 -0
  6. package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -1
  7. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +63 -3
  8. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
  9. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +12 -3
  10. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -1
  11. package/dist/plugins/specweave-ado/lib/ado-status-sync.js +37 -3
  12. package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -1
  13. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts +6 -11
  14. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
  15. package/dist/plugins/specweave-github/lib/github-feature-sync.js +6 -11
  16. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
  17. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts +21 -0
  18. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.d.ts.map +1 -0
  19. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js +445 -0
  20. package/dist/plugins/specweave-github/lib/github-increment-sync-cli.js.map +1 -0
  21. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +10 -0
  22. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -1
  23. package/dist/plugins/specweave-github/lib/github-status-sync.js +40 -2
  24. package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -1
  25. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts +94 -0
  26. package/dist/plugins/specweave-github/lib/increment-issue-builder.d.ts.map +1 -0
  27. package/dist/plugins/specweave-github/lib/increment-issue-builder.js +369 -0
  28. package/dist/plugins/specweave-github/lib/increment-issue-builder.js.map +1 -0
  29. package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts +50 -0
  30. package/dist/plugins/specweave-jira/lib/jira-board-resolver.d.ts.map +1 -0
  31. package/dist/plugins/specweave-jira/lib/jira-board-resolver.js +84 -0
  32. package/dist/plugins/specweave-jira/lib/jira-board-resolver.js.map +1 -0
  33. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +12 -0
  34. package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -1
  35. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +57 -5
  36. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
  37. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +5 -1
  38. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -1
  39. package/dist/plugins/specweave-jira/lib/jira-status-sync.js +12 -4
  40. package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -1
  41. package/dist/src/cli/commands/import-external.d.ts.map +1 -1
  42. package/dist/src/cli/commands/import-external.js +12 -7
  43. package/dist/src/cli/commands/import-external.js.map +1 -1
  44. package/dist/src/cli/helpers/init/external-import.d.ts.map +1 -1
  45. package/dist/src/cli/helpers/init/external-import.js +308 -36
  46. package/dist/src/cli/helpers/init/external-import.js.map +1 -1
  47. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts +115 -0
  48. package/dist/src/cli/helpers/init/jira-ado-auto-detect.d.ts.map +1 -0
  49. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js +590 -0
  50. package/dist/src/cli/helpers/init/jira-ado-auto-detect.js.map +1 -0
  51. package/dist/src/cli/helpers/issue-tracker/ado-area-selection.d.ts +65 -0
  52. package/dist/src/cli/helpers/issue-tracker/ado-area-selection.d.ts.map +1 -0
  53. package/dist/src/cli/helpers/issue-tracker/ado-area-selection.js +278 -0
  54. package/dist/src/cli/helpers/issue-tracker/ado-area-selection.js.map +1 -0
  55. package/dist/src/cli/helpers/issue-tracker/jira-board-selection.d.ts +64 -0
  56. package/dist/src/cli/helpers/issue-tracker/jira-board-selection.d.ts.map +1 -0
  57. package/dist/src/cli/helpers/issue-tracker/jira-board-selection.js +251 -0
  58. package/dist/src/cli/helpers/issue-tracker/jira-board-selection.js.map +1 -0
  59. package/dist/src/config/types.d.ts +6 -6
  60. package/dist/src/core/ac-test-validator-cli.js +4 -1
  61. package/dist/src/core/ac-test-validator-cli.js.map +1 -1
  62. package/dist/src/core/ac-test-validator.d.ts.map +1 -1
  63. package/dist/src/core/ac-test-validator.js +4 -1
  64. package/dist/src/core/ac-test-validator.js.map +1 -1
  65. package/dist/src/core/background/index.d.ts +11 -0
  66. package/dist/src/core/background/index.d.ts.map +1 -0
  67. package/dist/src/core/background/index.js +11 -0
  68. package/dist/src/core/background/index.js.map +1 -0
  69. package/dist/src/core/background/job-manager.d.ts +65 -0
  70. package/dist/src/core/background/job-manager.d.ts.map +1 -0
  71. package/dist/src/core/background/job-manager.js +192 -0
  72. package/dist/src/core/background/job-manager.js.map +1 -0
  73. package/dist/src/core/background/types.d.ts +59 -0
  74. package/dist/src/core/background/types.d.ts.map +1 -0
  75. package/dist/src/core/background/types.js +8 -0
  76. package/dist/src/core/background/types.js.map +1 -0
  77. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts +25 -0
  78. package/dist/src/core/repo-structure/multi-repo-configurator.d.ts.map +1 -0
  79. package/dist/src/core/repo-structure/multi-repo-configurator.js +614 -0
  80. package/dist/src/core/repo-structure/multi-repo-configurator.js.map +1 -0
  81. package/dist/src/core/repo-structure/repo-initializer.d.ts +40 -0
  82. package/dist/src/core/repo-structure/repo-initializer.d.ts.map +1 -0
  83. package/dist/src/core/repo-structure/repo-initializer.js +252 -0
  84. package/dist/src/core/repo-structure/repo-initializer.js.map +1 -0
  85. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +3 -37
  86. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  87. package/dist/src/core/repo-structure/repo-structure-manager.js +23 -803
  88. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  89. package/dist/src/core/types/increment-metadata.d.ts +75 -0
  90. package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
  91. package/dist/src/core/types/spec-metadata.d.ts +2 -0
  92. package/dist/src/core/types/spec-metadata.d.ts.map +1 -1
  93. package/dist/src/core/types/sync-profile.d.ts +137 -5
  94. package/dist/src/core/types/sync-profile.d.ts.map +1 -1
  95. package/dist/src/core/types/sync-profile.js +63 -0
  96. package/dist/src/core/types/sync-profile.js.map +1 -1
  97. package/dist/src/importers/external-importer.d.ts +25 -0
  98. package/dist/src/importers/external-importer.d.ts.map +1 -1
  99. package/dist/src/importers/github-importer.d.ts.map +1 -1
  100. package/dist/src/importers/github-importer.js +5 -3
  101. package/dist/src/importers/github-importer.js.map +1 -1
  102. package/dist/src/importers/import-coordinator.d.ts +20 -0
  103. package/dist/src/importers/import-coordinator.d.ts.map +1 -1
  104. package/dist/src/importers/import-coordinator.js.map +1 -1
  105. package/dist/src/importers/item-converter.d.ts +51 -0
  106. package/dist/src/importers/item-converter.d.ts.map +1 -1
  107. package/dist/src/importers/item-converter.js +39 -12
  108. package/dist/src/importers/item-converter.js.map +1 -1
  109. package/dist/src/init/architecture/types.d.ts +2 -2
  110. package/dist/src/init/compliance/types.d.ts +1 -1
  111. package/dist/src/init/repo/types.d.ts +1 -1
  112. package/dist/src/living-docs/fs-id-allocator.d.ts +72 -3
  113. package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
  114. package/dist/src/living-docs/fs-id-allocator.js +142 -16
  115. package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
  116. package/dist/src/locales/de/cli.json +14 -0
  117. package/dist/src/locales/es/cli.json +14 -0
  118. package/dist/src/locales/fr/cli.json +14 -0
  119. package/dist/src/locales/ja/cli.json +14 -0
  120. package/dist/src/locales/ko/cli.json +14 -0
  121. package/dist/src/locales/pt/cli.json +14 -0
  122. package/dist/src/locales/ru/cli.json +14 -0
  123. package/dist/src/locales/zh/cli.json +14 -0
  124. package/dist/src/utils/chalk-fallback.d.ts +38 -0
  125. package/dist/src/utils/chalk-fallback.d.ts.map +1 -0
  126. package/dist/src/utils/chalk-fallback.js +118 -0
  127. package/dist/src/utils/chalk-fallback.js.map +1 -0
  128. package/dist/src/utils/project-id-generator.d.ts +127 -0
  129. package/dist/src/utils/project-id-generator.d.ts.map +1 -0
  130. package/dist/src/utils/project-id-generator.js +228 -0
  131. package/dist/src/utils/project-id-generator.js.map +1 -0
  132. package/package.json +1 -1
  133. package/plugins/specweave/agents/pm/AGENT.md +202 -0
  134. package/plugins/specweave/commands/specweave-import-external.md +5 -3
  135. package/plugins/specweave/commands/specweave-jobs.md +160 -0
  136. package/plugins/specweave/commands/specweave-sync-docs.md +6 -2
  137. package/plugins/specweave/hooks/pre-task-completion.sh +35 -17
  138. package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.d.ts +16 -0
  139. package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js +121 -0
  140. package/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js.map +1 -0
  141. package/plugins/specweave/lib/vendor/core/ac-test-validator.d.ts +111 -0
  142. package/plugins/specweave/lib/vendor/core/ac-test-validator.js +295 -0
  143. package/plugins/specweave/lib/vendor/core/ac-test-validator.js.map +1 -0
  144. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +75 -0
  145. package/plugins/specweave/lib/vendor/utils/chalk-fallback.d.ts +38 -0
  146. package/plugins/specweave/lib/vendor/utils/chalk-fallback.js +118 -0
  147. package/plugins/specweave/lib/vendor/utils/chalk-fallback.js.map +1 -0
  148. package/plugins/specweave/lib/vendor/utils/fs-native.d.ts +179 -0
  149. package/plugins/specweave/lib/vendor/utils/fs-native.js +319 -0
  150. package/plugins/specweave/lib/vendor/utils/fs-native.js.map +1 -0
  151. package/plugins/specweave/skills/code-reviewer/SKILL.md +1 -1
  152. package/plugins/specweave/skills/docs-updater/SKILL.md +61 -0
  153. package/plugins/specweave/skills/increment-planner/SKILL.md +10 -335
  154. package/plugins/specweave/skills/increment-planner/templates/metadata.json +13 -0
  155. package/plugins/specweave/skills/increment-planner/templates/plan.md +50 -0
  156. package/plugins/specweave/skills/increment-planner/templates/spec-multi-project.md +86 -0
  157. package/plugins/specweave/skills/increment-planner/templates/spec-single-project.md +50 -0
  158. package/plugins/specweave/skills/increment-planner/templates/tasks-multi-project.md +86 -0
  159. package/plugins/specweave/skills/increment-planner/templates/tasks-single-project.md +48 -0
  160. package/plugins/specweave-ado/commands/specweave-ado-import-areas.md +358 -0
  161. package/plugins/specweave-ado/lib/ado-spec-sync.js +59 -3
  162. package/plugins/specweave-ado/lib/ado-spec-sync.ts +72 -3
  163. package/plugins/specweave-ado/lib/ado-status-sync.js +35 -3
  164. package/plugins/specweave-ado/lib/ado-status-sync.ts +48 -4
  165. package/plugins/specweave-alternatives/skills/architecture-alternatives/SKILL.md +1 -0
  166. package/plugins/specweave-alternatives/skills/bmad-method/SKILL.md +1 -0
  167. package/plugins/specweave-core/skills/code-quality/SKILL.md +1 -0
  168. package/plugins/specweave-core/skills/design-patterns/SKILL.md +1 -0
  169. package/plugins/specweave-core/skills/software-architecture/SKILL.md +1 -0
  170. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +14 -10
  171. package/plugins/specweave-github/commands/specweave-github-sync.md +57 -0
  172. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +74 -0
  173. package/plugins/specweave-github/lib/github-feature-sync.ts +6 -11
  174. package/plugins/specweave-github/lib/github-increment-sync-cli.js +456 -0
  175. package/plugins/specweave-github/lib/github-increment-sync-cli.ts +588 -0
  176. package/plugins/specweave-github/lib/github-status-sync.js +37 -1
  177. package/plugins/specweave-github/lib/github-status-sync.ts +60 -4
  178. package/plugins/specweave-github/lib/increment-issue-builder.js +389 -0
  179. package/plugins/specweave-github/lib/increment-issue-builder.ts +502 -0
  180. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +19 -24
  181. package/plugins/specweave-infrastructure/agents/observability-engineer/AGENT.md +15 -23
  182. package/plugins/specweave-jira/commands/specweave-jira-import-boards.md +331 -0
  183. package/plugins/specweave-jira/lib/jira-spec-sync.js +53 -5
  184. package/plugins/specweave-jira/lib/jira-spec-sync.ts +87 -7
  185. package/plugins/specweave-jira/lib/jira-status-sync.js +9 -3
  186. package/plugins/specweave-jira/lib/jira-status-sync.ts +15 -6
  187. package/plugins/specweave-ml/agents/data-scientist/AGENT.md +16 -20
  188. package/plugins/specweave-ml/agents/ml-engineer/AGENT.md +18 -19
  189. package/plugins/specweave-ml/skills/{ml-pipeline-workflow → mlops-dag-builder}/SKILL.md +18 -14
  190. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +111 -0
  191. package/plugins/specweave-ui/skills/browser-automation/SKILL.md +1 -1
  192. package/plugins/specweave-ui/skills/ui-testing/SKILL.md +10 -122
  193. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +0 -70
  194. package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +0 -1
  195. package/dist/plugins/specweave-github/lib/epic-content-builder.js +0 -258
  196. package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +0 -1
  197. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +0 -83
  198. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +0 -1
  199. package/dist/plugins/specweave-github/lib/github-epic-sync.js +0 -466
  200. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +0 -1
  201. package/plugins/specweave-github/lib/epic-content-builder.js +0 -265
  202. package/plugins/specweave-github/lib/epic-content-builder.ts +0 -376
  203. package/plugins/specweave-github/lib/github-epic-sync.js +0 -488
  204. package/plugins/specweave-github/lib/github-epic-sync.ts +0 -715
@@ -1,466 +0,0 @@
1
- /**
2
- * GitHub Epic Sync - Hierarchical synchronization for Epic folder structure
3
- *
4
- * Architecture:
5
- * - Epic (FS-001) → GitHub Milestone
6
- * - Increment (0001-core-framework) → GitHub Issue (linked to Milestone)
7
- *
8
- * This implements the Universal Hierarchy architecture for GitHub.
9
- */
10
- import { readdir, readFile, writeFile } from 'fs/promises';
11
- import { existsSync } from 'fs';
12
- import * as path from 'path';
13
- import * as yaml from 'yaml';
14
- import { execFileNoThrow } from '../../../src/utils/execFileNoThrow.js';
15
- import { DuplicateDetector } from './duplicate-detector.js';
16
- import { EpicContentBuilder } from './epic-content-builder.js';
17
- export class GitHubEpicSync {
18
- constructor(client, specsDir) {
19
- this.client = client;
20
- this.specsDir = specsDir;
21
- }
22
- /**
23
- * Sync Epic folder to GitHub (Milestone + Issues)
24
- */
25
- async syncEpicToGitHub(epicId) {
26
- console.log(`\n🔄 Syncing Epic ${epicId} to GitHub...`);
27
- // 1. Load Epic FEATURE.md
28
- const epicFolder = await this.findEpicFolder(epicId);
29
- if (!epicFolder) {
30
- throw new Error(`Epic ${epicId} not found in ${this.specsDir}`);
31
- }
32
- const readmePath = path.join(epicFolder, 'FEATURE.md');
33
- const epicData = await this.parseEpicReadme(readmePath);
34
- console.log(` 📦 Epic: ${epicData.title}`);
35
- console.log(` 📊 Increments: ${epicData.total_increments}`);
36
- // 2. Create or update GitHub Milestone
37
- let milestoneNumber = epicData.external_tools.github.id;
38
- let milestoneUrl = epicData.external_tools.github.url;
39
- if (!milestoneNumber) {
40
- console.log(` 🚀 Creating GitHub Milestone...`);
41
- const milestone = await this.createMilestone(epicData);
42
- milestoneNumber = milestone.number;
43
- milestoneUrl = milestone.url;
44
- console.log(` ✅ Created Milestone #${milestoneNumber}`);
45
- // Update Epic README with Milestone ID
46
- await this.updateEpicReadme(readmePath, {
47
- type: 'milestone',
48
- id: milestoneNumber,
49
- url: milestoneUrl,
50
- });
51
- }
52
- else {
53
- console.log(` ♻️ Updating existing Milestone #${milestoneNumber}...`);
54
- await this.updateMilestone(milestoneNumber, epicData);
55
- console.log(` ✅ Updated Milestone #${milestoneNumber}`);
56
- }
57
- // 3. Sync each increment as GitHub Issue (WITH DUPLICATE DETECTION!)
58
- let issuesCreated = 0;
59
- let issuesUpdated = 0;
60
- let duplicatesDetected = 0;
61
- console.log(`\n 📝 Syncing ${epicData.increments.length} increments...`);
62
- for (const increment of epicData.increments) {
63
- const incrementFile = path.join(epicFolder, `${increment.id}.md`);
64
- if (!existsSync(incrementFile)) {
65
- console.log(` ⚠️ Increment file not found: ${increment.id}.md`);
66
- continue;
67
- }
68
- const incrementData = await this.parseIncrementFile(incrementFile);
69
- const existingIssue = increment.external.github;
70
- if (!existingIssue) {
71
- // NEW: Check GitHub FIRST before creating (duplicate detection!)
72
- console.log(` 🔍 Checking GitHub for existing issue: ${increment.id}...`);
73
- const githubIssue = await this.findExistingIssue(epicData.id, increment.id);
74
- if (githubIssue) {
75
- // Found existing issue! Re-link it instead of creating duplicate
76
- console.log(` ♻️ Found existing Issue #${githubIssue} for ${increment.id} (self-healing)`);
77
- await this.updateIncrementExternalLink(readmePath, incrementFile, increment.id, githubIssue);
78
- issuesUpdated++;
79
- duplicatesDetected++;
80
- }
81
- else {
82
- // Truly new issue - create it
83
- const issueNumber = await this.createIssue(epicData.id, incrementData, milestoneNumber);
84
- issuesCreated++;
85
- console.log(` ✅ Created Issue #${issueNumber} for ${increment.id}`);
86
- // Update Epic README and Increment file
87
- await this.updateIncrementExternalLink(readmePath, incrementFile, increment.id, issueNumber);
88
- }
89
- }
90
- else {
91
- // Update existing issue
92
- await this.updateIssue(epicData.id, existingIssue, incrementData, milestoneNumber);
93
- issuesUpdated++;
94
- console.log(` ♻️ Updated Issue #${existingIssue} for ${increment.id}`);
95
- }
96
- }
97
- console.log(`\n✅ Epic sync complete!`);
98
- console.log(` Milestone: ${milestoneUrl}`);
99
- console.log(` Issues created: ${issuesCreated}`);
100
- console.log(` Issues updated: ${issuesUpdated}`);
101
- if (duplicatesDetected > 0) {
102
- console.log(` 🔗 Self-healed: ${duplicatesDetected} (found existing issues)`);
103
- }
104
- // 4. Post-sync validation: Check for duplicates
105
- console.log(`\n🔍 Post-sync validation...`);
106
- const validation = await this.validateSync(epicData.id);
107
- if (validation.duplicatesFound > 0) {
108
- console.warn(`\n⚠️ WARNING: ${validation.duplicatesFound} duplicate(s) detected!`);
109
- console.warn(` This may indicate a previous sync created duplicates.`);
110
- console.warn(` Run cleanup command to resolve:`);
111
- console.warn(` /specweave-github:cleanup-duplicates ${epicData.id}`);
112
- console.warn(`\n Duplicate groups:`);
113
- for (const [title, numbers] of validation.duplicateGroups) {
114
- console.warn(` - "${title}": Issues #${numbers.join(', #')}`);
115
- }
116
- }
117
- else {
118
- console.log(` ✅ No duplicates found`);
119
- }
120
- return {
121
- milestoneNumber: milestoneNumber,
122
- milestoneUrl: milestoneUrl,
123
- issuesCreated,
124
- issuesUpdated,
125
- duplicatesDetected,
126
- };
127
- }
128
- /**
129
- * Validate sync results - check for duplicate issues
130
- *
131
- * Searches GitHub for all issues with the Epic ID and detects duplicates
132
- * (multiple issues with the same title).
133
- *
134
- * @param epicId - Epic ID (e.g., FS-031)
135
- * @returns Validation result with duplicate count and groups
136
- */
137
- async validateSync(epicId) {
138
- try {
139
- // Search for all issues with Epic ID in title
140
- const titlePattern = `[${epicId}]`;
141
- const result = await execFileNoThrow('gh', [
142
- 'issue',
143
- 'list',
144
- '--search',
145
- `"${titlePattern}" in:title`,
146
- '--json',
147
- 'number,title,state',
148
- '--limit',
149
- '100', // Check up to 100 issues
150
- '--state',
151
- 'all', // Include both open and closed
152
- ]);
153
- if (result.exitCode !== 0 || !result.stdout) {
154
- console.warn(` ⚠️ Validation failed: ${result.stderr || 'unknown error'}`);
155
- return { totalIssues: 0, duplicatesFound: 0, duplicateGroups: [] };
156
- }
157
- const issues = JSON.parse(result.stdout);
158
- // Group issues by title
159
- const titleGroups = new Map();
160
- for (const issue of issues) {
161
- const title = issue.title;
162
- if (!titleGroups.has(title)) {
163
- titleGroups.set(title, []);
164
- }
165
- titleGroups.get(title).push(issue.number);
166
- }
167
- // Find duplicates (titles with more than one issue)
168
- const duplicateGroups = [];
169
- for (const [title, numbers] of titleGroups.entries()) {
170
- if (numbers.length > 1) {
171
- duplicateGroups.push([title, numbers]);
172
- }
173
- }
174
- return {
175
- totalIssues: issues.length,
176
- duplicatesFound: duplicateGroups.length,
177
- duplicateGroups,
178
- };
179
- }
180
- catch (error) {
181
- console.warn(` ⚠️ Validation error: ${error}`);
182
- return { totalIssues: 0, duplicatesFound: 0, duplicateGroups: [] };
183
- }
184
- }
185
- /**
186
- * Find existing GitHub issue for increment (duplicate detection!)
187
- *
188
- * Searches GitHub for issues matching the Epic ID and Increment ID.
189
- * This prevents creating duplicates when frontmatter is lost/corrupted.
190
- *
191
- * @param epicId - Epic ID (e.g., FS-031)
192
- * @param incrementId - Increment ID (e.g., 0031-feature-name)
193
- * @returns GitHub issue number if found, null otherwise
194
- */
195
- async findExistingIssue(epicId, incrementId) {
196
- try {
197
- // Search GitHub for issues with Epic ID in title
198
- // Pattern: "[FS-031] Title" (new) or "[INC-0031] Title" (deprecated, legacy support only)
199
- const titlePattern = `[${epicId}]`;
200
- const result = await execFileNoThrow('gh', [
201
- 'issue',
202
- 'list',
203
- '--search',
204
- `"${titlePattern}" in:title`,
205
- '--json',
206
- 'number,title,body',
207
- '--limit',
208
- '50', // Check up to 50 issues (should cover most Epics)
209
- ]);
210
- if (result.exitCode !== 0 || !result.stdout) {
211
- console.warn(` ⚠️ GitHub search failed: ${result.stderr || 'unknown error'}`);
212
- return null;
213
- }
214
- const issues = JSON.parse(result.stdout);
215
- if (issues.length === 0) {
216
- return null; // No issues found for this Epic
217
- }
218
- // Find issue that mentions this increment ID in body
219
- // Look for patterns like "**Increment**: 0031-feature-name"
220
- for (const issue of issues) {
221
- if (issue.body && issue.body.includes(`**Increment**: ${incrementId}`)) {
222
- console.log(` 🔗 Found existing issue #${issue.number} for ${incrementId}`);
223
- return issue.number;
224
- }
225
- }
226
- // Fallback: Check if increment ID is in title
227
- // Pattern: "[INC-0031-feature-name] Title"
228
- for (const issue of issues) {
229
- if (issue.title.toLowerCase().includes(incrementId.toLowerCase())) {
230
- console.log(` 🔗 Found existing issue #${issue.number} for ${incrementId} (title match)`);
231
- return issue.number;
232
- }
233
- }
234
- return null; // No matching issue found
235
- }
236
- catch (error) {
237
- console.warn(` ⚠️ Error searching for existing issue: ${error}`);
238
- return null; // Fail gracefully - continue with sync
239
- }
240
- }
241
- /**
242
- * Find Epic folder by ID (FS-001 or just 001)
243
- */
244
- async findEpicFolder(epicId) {
245
- const normalizedId = epicId.startsWith('FS-')
246
- ? epicId
247
- : `FS-${epicId.padStart(3, '0')}`;
248
- const folders = await readdir(this.specsDir);
249
- for (const folder of folders) {
250
- if (folder.startsWith(normalizedId)) {
251
- return path.join(this.specsDir, folder);
252
- }
253
- }
254
- return null;
255
- }
256
- /**
257
- * Parse Epic FEATURE.md to extract frontmatter
258
- */
259
- async parseEpicReadme(readmePath) {
260
- const content = await readFile(readmePath, 'utf-8');
261
- const match = content.match(/^---\n([\s\S]*?)\n---/);
262
- if (!match) {
263
- throw new Error('Epic FEATURE.md missing YAML frontmatter');
264
- }
265
- const frontmatter = yaml.parse(match[1]);
266
- return frontmatter;
267
- }
268
- /**
269
- * Parse increment file to extract title and overview
270
- */
271
- async parseIncrementFile(filePath) {
272
- const content = await readFile(filePath, 'utf-8');
273
- const match = content.match(/^---\n([\s\S]*?)\n---/);
274
- let frontmatter = { id: '', epic: '' };
275
- let bodyContent = content;
276
- if (match) {
277
- frontmatter = yaml.parse(match[1]);
278
- bodyContent = content.slice(match[0].length).trim();
279
- }
280
- // Extract title
281
- const titleMatch = bodyContent.match(/^#\s+(.+)$/m);
282
- const title = titleMatch
283
- ? titleMatch[1].trim()
284
- : frontmatter.id || path.basename(filePath, '.md');
285
- // Extract overview (first paragraph after title)
286
- const overviewMatch = bodyContent.match(/^#[^\n]+\n+([^\n]+)/);
287
- const overview = overviewMatch
288
- ? overviewMatch[1].trim()
289
- : 'No overview available';
290
- return {
291
- id: frontmatter.id,
292
- title,
293
- overview,
294
- content: bodyContent,
295
- frontmatter,
296
- };
297
- }
298
- /**
299
- * Create GitHub Milestone
300
- */
301
- async createMilestone(epic) {
302
- const title = `[${epic.id}] ${epic.title}`;
303
- const description = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
304
- // Determine milestone state
305
- const state = epic.status === 'complete' ? 'closed' : 'open';
306
- // Use GitHub CLI to create milestone
307
- const result = await execFileNoThrow('gh', [
308
- 'api',
309
- '/repos/{owner}/{repo}/milestones',
310
- '-X',
311
- 'POST',
312
- '-f',
313
- `title=${title}`,
314
- '-f',
315
- `description=${description}`,
316
- '-f',
317
- `state=${state}`,
318
- ]);
319
- if (result.exitCode !== 0) {
320
- throw new Error(`Failed to create GitHub Milestone: ${result.stderr || result.stdout}`);
321
- }
322
- const milestone = JSON.parse(result.stdout);
323
- return {
324
- number: milestone.number,
325
- url: milestone.html_url,
326
- };
327
- }
328
- /**
329
- * Update GitHub Milestone
330
- */
331
- async updateMilestone(milestoneNumber, epic) {
332
- const title = `[${epic.id}] ${epic.title}`;
333
- const description = `Epic: ${epic.title}\n\nProgress: ${epic.completed_increments}/${epic.total_increments} increments (${epic.progress})\n\nPriority: ${epic.priority}\nStatus: ${epic.status}`;
334
- const state = epic.status === 'complete' ? 'closed' : 'open';
335
- const result = await execFileNoThrow('gh', [
336
- 'api',
337
- `/repos/{owner}/{repo}/milestones/${milestoneNumber}`,
338
- '-X',
339
- 'PATCH',
340
- '-f',
341
- `title=${title}`,
342
- '-f',
343
- `description=${description}`,
344
- '-f',
345
- `state=${state}`,
346
- ]);
347
- if (result.exitCode !== 0) {
348
- throw new Error(`Failed to update GitHub Milestone: ${result.stderr || result.stdout}`);
349
- }
350
- }
351
- /**
352
- * Create GitHub Issue for Epic with hierarchical content (US → Tasks)
353
- */
354
- async createIssue(epicId, increment, milestoneNumber) {
355
- const title = `[${epicId}] ${increment.title}`;
356
- // Build hierarchical issue body using EpicContentBuilder
357
- const epicFolder = await this.findEpicFolder(epicId);
358
- if (!epicFolder) {
359
- throw new Error(`Epic folder not found for ${epicId}`);
360
- }
361
- const contentBuilder = new EpicContentBuilder(epicFolder, path.dirname(this.specsDir) // Project root
362
- );
363
- const body = await contentBuilder.buildIssueBody();
364
- try {
365
- // Use DuplicateDetector for full 3-phase protection
366
- const result = await DuplicateDetector.createWithProtection({
367
- title,
368
- body,
369
- titlePattern: `[${epicId}]`,
370
- incrementId: increment.id, // For body matching
371
- labels: ['increment', 'epic-sync'],
372
- milestone: milestoneNumber.toString()
373
- });
374
- // Log duplicate detection results
375
- if (result.wasReused) {
376
- console.log(` ♻️ Reused existing issue #${result.issue.number} (duplicate prevention)`);
377
- }
378
- if (result.duplicatesFound > 0) {
379
- console.log(` 🛡️ Duplicates: ${result.duplicatesFound} found, ${result.duplicatesClosed} closed`);
380
- }
381
- return result.issue.number;
382
- }
383
- catch (error) {
384
- throw new Error(`Failed to create GitHub Issue: ${error.message}`);
385
- }
386
- }
387
- /**
388
- * Update GitHub Issue for Epic with hierarchical content (US → Tasks)
389
- */
390
- async updateIssue(epicId, issueNumber, increment, milestoneNumber) {
391
- const title = `[${epicId}] ${increment.title}`;
392
- // Build hierarchical issue body using EpicContentBuilder
393
- const epicFolder = await this.findEpicFolder(epicId);
394
- if (!epicFolder) {
395
- throw new Error(`Epic folder not found for ${epicId}`);
396
- }
397
- const contentBuilder = new EpicContentBuilder(epicFolder, path.dirname(this.specsDir) // Project root
398
- );
399
- const body = await contentBuilder.buildIssueBody();
400
- const result = await execFileNoThrow('gh', [
401
- 'issue',
402
- 'edit',
403
- issueNumber.toString(),
404
- '--title',
405
- title,
406
- '--body',
407
- body,
408
- '--milestone',
409
- milestoneNumber.toString(),
410
- ]);
411
- if (result.exitCode !== 0) {
412
- throw new Error(`Failed to update GitHub Issue: ${result.stderr || result.stdout}`);
413
- }
414
- }
415
- /**
416
- * Update Epic FEATURE.md with GitHub Milestone ID
417
- */
418
- async updateEpicReadme(readmePath, github) {
419
- const content = await readFile(readmePath, 'utf-8');
420
- const match = content.match(/^---\n([\s\S]*?)\n---/);
421
- if (!match) {
422
- throw new Error('Epic FEATURE.md missing YAML frontmatter');
423
- }
424
- const frontmatter = yaml.parse(match[1]);
425
- frontmatter.external_tools.github = github;
426
- const newFrontmatter = yaml.stringify(frontmatter);
427
- const newContent = content.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
428
- await writeFile(readmePath, newContent, 'utf-8');
429
- }
430
- /**
431
- * Update increment external link in both Epic README and increment file
432
- */
433
- async updateIncrementExternalLink(readmePath, incrementFile, incrementId, issueNumber) {
434
- const issueUrl = `https://github.com/{owner}/{repo}/issues/${issueNumber}`;
435
- // 1. Update Epic FEATURE.md
436
- const readmeContent = await readFile(readmePath, 'utf-8');
437
- const readmeMatch = readmeContent.match(/^---\n([\s\S]*?)\n---/);
438
- if (readmeMatch) {
439
- const frontmatter = yaml.parse(readmeMatch[1]);
440
- const increment = frontmatter.increments.find((inc) => inc.id === incrementId);
441
- if (increment) {
442
- increment.external.github = issueNumber;
443
- const newFrontmatter = yaml.stringify(frontmatter);
444
- const newContent = readmeContent.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
445
- await writeFile(readmePath, newContent, 'utf-8');
446
- }
447
- }
448
- // 2. Update increment file frontmatter
449
- const incrementContent = await readFile(incrementFile, 'utf-8');
450
- const incrementMatch = incrementContent.match(/^---\n([\s\S]*?)\n---/);
451
- if (incrementMatch) {
452
- const frontmatter = yaml.parse(incrementMatch[1]);
453
- if (!frontmatter.external) {
454
- frontmatter.external = {};
455
- }
456
- frontmatter.external.github = {
457
- issue: issueNumber,
458
- url: issueUrl,
459
- };
460
- const newFrontmatter = yaml.stringify(frontmatter);
461
- const newContent = incrementContent.replace(/^---\n[\s\S]*?\n---/, `---\n${newFrontmatter}---`);
462
- await writeFile(incrementFile, newContent, 'utf-8');
463
- }
464
- }
465
- }
466
- //# sourceMappingURL=github-epic-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github-epic-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-github/lib/github-epic-sync.ts"],"names":[],"mappings":"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"}