specweave 0.17.15 → 0.17.17

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 (200) 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-status-sync.d.ts +54 -0
  26. package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -0
  27. package/dist/plugins/specweave-ado/lib/ado-status-sync.js +86 -0
  28. package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -0
  29. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
  30. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
  31. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
  32. package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
  33. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +139 -0
  34. package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts.map +1 -0
  35. package/dist/plugins/specweave-github/lib/duplicate-detector.js +389 -0
  36. package/dist/plugins/specweave-github/lib/duplicate-detector.js.map +1 -0
  37. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +26 -0
  38. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +1 -0
  39. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +249 -0
  40. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +1 -0
  41. package/dist/plugins/specweave-github/lib/github-client.d.ts +1 -1
  42. package/dist/plugins/specweave-github/lib/github-client.d.ts.map +1 -1
  43. package/dist/plugins/specweave-github/lib/github-client.js +25 -13
  44. package/dist/plugins/specweave-github/lib/github-client.js.map +1 -1
  45. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +83 -0
  46. package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -0
  47. package/dist/plugins/specweave-github/lib/github-epic-sync.js +451 -0
  48. package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -0
  49. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +43 -0
  50. package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -0
  51. package/dist/plugins/specweave-github/lib/github-status-sync.js +82 -0
  52. package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -0
  53. package/dist/plugins/specweave-github/lib/task-sync.d.ts +5 -0
  54. package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
  55. package/dist/plugins/specweave-github/lib/task-sync.js +38 -2
  56. package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
  57. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +26 -0
  58. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
  59. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +195 -0
  60. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
  61. package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts +66 -0
  62. package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts.map +1 -0
  63. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +274 -0
  64. package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -0
  65. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +56 -0
  66. package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -0
  67. package/dist/plugins/specweave-jira/lib/jira-status-sync.js +93 -0
  68. package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -0
  69. package/dist/spec-parser.js +629 -0
  70. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  71. package/dist/src/cli/helpers/issue-tracker/index.js +48 -3
  72. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  73. package/dist/src/core/living-docs/hierarchy-mapper.d.ts +142 -0
  74. package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -0
  75. package/dist/src/core/living-docs/hierarchy-mapper.js +453 -0
  76. package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -0
  77. package/dist/src/core/living-docs/index.d.ts +10 -84
  78. package/dist/src/core/living-docs/index.d.ts.map +1 -1
  79. package/dist/src/core/living-docs/index.js +10 -164
  80. package/dist/src/core/living-docs/index.js.map +1 -1
  81. package/dist/src/core/living-docs/spec-distributor.d.ts +106 -0
  82. package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -0
  83. package/dist/src/core/living-docs/spec-distributor.js +823 -0
  84. package/dist/src/core/living-docs/spec-distributor.js.map +1 -0
  85. package/dist/src/core/living-docs/types.d.ts +201 -0
  86. package/dist/src/core/living-docs/types.d.ts.map +1 -0
  87. package/dist/src/core/living-docs/types.js +15 -0
  88. package/dist/src/core/living-docs/types.js.map +1 -0
  89. package/dist/src/core/logging/prompt-logger.d.ts +70 -0
  90. package/dist/src/core/logging/prompt-logger.d.ts.map +1 -0
  91. package/dist/src/core/logging/prompt-logger.js +247 -0
  92. package/dist/src/core/logging/prompt-logger.js.map +1 -0
  93. package/dist/src/core/status-line/status-line-manager.d.ts +15 -24
  94. package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
  95. package/dist/src/core/status-line/status-line-manager.js +33 -70
  96. package/dist/src/core/status-line/status-line-manager.js.map +1 -1
  97. package/dist/src/core/status-line/types.d.ts +19 -31
  98. package/dist/src/core/status-line/types.d.ts.map +1 -1
  99. package/dist/src/core/status-line/types.js +5 -9
  100. package/dist/src/core/status-line/types.js.map +1 -1
  101. package/dist/src/core/sync/conflict-resolver.d.ts +66 -0
  102. package/dist/src/core/sync/conflict-resolver.d.ts.map +1 -0
  103. package/dist/src/core/sync/conflict-resolver.js +108 -0
  104. package/dist/src/core/sync/conflict-resolver.js.map +1 -0
  105. package/dist/src/core/sync/enhanced-content-builder.d.ts +77 -0
  106. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -0
  107. package/dist/src/core/sync/enhanced-content-builder.js +199 -0
  108. package/dist/src/core/sync/enhanced-content-builder.js.map +1 -0
  109. package/dist/src/core/sync/label-detector.d.ts +66 -0
  110. package/dist/src/core/sync/label-detector.d.ts.map +1 -0
  111. package/dist/src/core/sync/label-detector.js +211 -0
  112. package/dist/src/core/sync/label-detector.js.map +1 -0
  113. package/dist/src/core/sync/retry-logic.d.ts +64 -0
  114. package/dist/src/core/sync/retry-logic.d.ts.map +1 -0
  115. package/dist/src/core/sync/retry-logic.js +165 -0
  116. package/dist/src/core/sync/retry-logic.js.map +1 -0
  117. package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
  118. package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
  119. package/dist/src/core/sync/spec-content-sync.js +5 -0
  120. package/dist/src/core/sync/spec-content-sync.js.map +1 -0
  121. package/dist/src/core/sync/spec-increment-mapper.d.ts +100 -0
  122. package/dist/src/core/sync/spec-increment-mapper.d.ts.map +1 -0
  123. package/dist/src/core/sync/spec-increment-mapper.js +424 -0
  124. package/dist/src/core/sync/spec-increment-mapper.js.map +1 -0
  125. package/dist/src/core/sync/status-cache.d.ts +91 -0
  126. package/dist/src/core/sync/status-cache.d.ts.map +1 -0
  127. package/dist/src/core/sync/status-cache.js +140 -0
  128. package/dist/src/core/sync/status-cache.js.map +1 -0
  129. package/dist/src/core/sync/status-mapper.d.ts +69 -0
  130. package/dist/src/core/sync/status-mapper.d.ts.map +1 -0
  131. package/dist/src/core/sync/status-mapper.js +90 -0
  132. package/dist/src/core/sync/status-mapper.js.map +1 -0
  133. package/dist/src/core/sync/status-sync-engine.d.ts +162 -0
  134. package/dist/src/core/sync/status-sync-engine.d.ts.map +1 -0
  135. package/dist/src/core/sync/status-sync-engine.js +347 -0
  136. package/dist/src/core/sync/status-sync-engine.js.map +1 -0
  137. package/dist/src/core/sync/sync-event-logger.d.ts +99 -0
  138. package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -0
  139. package/dist/src/core/sync/sync-event-logger.js +103 -0
  140. package/dist/src/core/sync/sync-event-logger.js.map +1 -0
  141. package/dist/src/core/sync/workflow-detector.d.ts +95 -0
  142. package/dist/src/core/sync/workflow-detector.d.ts.map +1 -0
  143. package/dist/src/core/sync/workflow-detector.js +175 -0
  144. package/dist/src/core/sync/workflow-detector.js.map +1 -0
  145. package/dist/src/core/types/config.d.ts.map +1 -1
  146. package/dist/src/core/types/config.js +31 -0
  147. package/dist/src/core/types/config.js.map +1 -1
  148. package/dist/src/utils/github-url.d.ts +53 -0
  149. package/dist/src/utils/github-url.d.ts.map +1 -0
  150. package/dist/src/utils/github-url.js +90 -0
  151. package/dist/src/utils/github-url.js.map +1 -0
  152. package/dist/src/utils/plugin-validator.d.ts +9 -0
  153. package/dist/src/utils/plugin-validator.d.ts.map +1 -1
  154. package/dist/src/utils/plugin-validator.js +86 -19
  155. package/dist/src/utils/plugin-validator.js.map +1 -1
  156. package/dist/src/utils/spec-parser.d.ts +145 -0
  157. package/dist/src/utils/spec-parser.d.ts.map +1 -0
  158. package/dist/src/utils/spec-parser.js +640 -0
  159. package/dist/src/utils/spec-parser.js.map +1 -0
  160. package/dist/tsconfig.tsbuildinfo +1 -0
  161. package/package.json +1 -1
  162. package/plugins/specweave/agents/pm/AGENT.md +1 -1
  163. package/plugins/specweave/agents/pm/templates/increment-spec.md +158 -0
  164. package/plugins/specweave/agents/pm/templates/living-docs-spec.md +113 -0
  165. package/plugins/specweave/commands/specweave-done.md +163 -0
  166. package/plugins/specweave/hooks/lib/update-status-line.sh +79 -111
  167. package/plugins/specweave/hooks/post-increment-planning.sh +107 -35
  168. package/plugins/specweave/lib/hooks/sync-living-docs.js +139 -34
  169. package/plugins/specweave/lib/hooks/sync-living-docs.ts +234 -38
  170. package/plugins/specweave/skills/SKILLS-INDEX.md +4 -24
  171. package/plugins/specweave/skills/increment-planner/SKILL.md +94 -0
  172. package/plugins/specweave/skills/increment-work-router/SKILL.md +466 -0
  173. package/plugins/specweave/skills/plugin-validator/SKILL.md +16 -13
  174. package/plugins/specweave-ado/lib/ado-status-sync.js +80 -0
  175. package/plugins/specweave-ado/lib/ado-status-sync.ts +121 -0
  176. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
  177. package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +205 -0
  178. package/plugins/specweave-github/commands/specweave-github-sync-epic.md +248 -0
  179. package/plugins/specweave-github/lib/duplicate-detector.js +370 -0
  180. package/plugins/specweave-github/lib/duplicate-detector.ts +525 -0
  181. package/plugins/specweave-github/lib/enhanced-github-sync.js +220 -0
  182. package/plugins/specweave-github/lib/enhanced-github-sync.ts +322 -0
  183. package/plugins/specweave-github/lib/github-client.js +21 -10
  184. package/plugins/specweave-github/lib/github-client.ts +27 -16
  185. package/plugins/specweave-github/lib/github-epic-sync.js +489 -0
  186. package/plugins/specweave-github/lib/github-epic-sync.ts +690 -0
  187. package/plugins/specweave-github/lib/github-status-sync.js +71 -0
  188. package/plugins/specweave-github/lib/github-status-sync.ts +107 -0
  189. package/plugins/specweave-github/lib/task-sync.js +33 -2
  190. package/plugins/specweave-github/lib/task-sync.ts +44 -2
  191. package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +267 -0
  192. package/plugins/specweave-jira/lib/enhanced-jira-sync.ts.disabled +222 -0
  193. package/plugins/specweave-jira/lib/jira-epic-sync.js +304 -0
  194. package/plugins/specweave-jira/lib/jira-epic-sync.ts +459 -0
  195. package/plugins/specweave-jira/lib/jira-status-sync.js +79 -0
  196. package/plugins/specweave-jira/lib/jira-status-sync.ts +139 -0
  197. package/src/templates/AGENTS.md.template +88 -1
  198. package/src/templates/CLAUDE.md.template +49 -0
  199. package/plugins/specweave/skills/increment-quality-judge/SKILL.md +0 -524
  200. package/plugins/specweave/skills/plugin-installer/SKILL.md +0 -353
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Enhanced Content Builder
3
+ *
4
+ * Builds rich external issue descriptions with full spec content including:
5
+ * - Executive summary
6
+ * - User stories with collapsible sections
7
+ * - Acceptance criteria
8
+ * - Task links with GitHub issue numbers
9
+ * - Architecture references
10
+ * - Source links
11
+ */
12
+ export class EnhancedContentBuilder {
13
+ /**
14
+ * Build complete external issue description with all spec content
15
+ */
16
+ buildExternalDescription(spec) {
17
+ const sections = [];
18
+ // Summary section
19
+ sections.push(this.buildSummarySection(spec));
20
+ // User stories section
21
+ if (spec.userStories && spec.userStories.length > 0) {
22
+ sections.push(this.buildUserStoriesSection(spec.userStories));
23
+ }
24
+ // Tasks section
25
+ if (spec.taskMapping) {
26
+ sections.push(this.buildTasksSection(spec.taskMapping));
27
+ }
28
+ // Architecture section
29
+ if (spec.architectureDocs && spec.architectureDocs.length > 0) {
30
+ sections.push(this.buildArchitectureSection(spec.architectureDocs));
31
+ }
32
+ // Source links section
33
+ if (spec.sourceLinks) {
34
+ sections.push(this.buildSourceLinksSection(spec.sourceLinks));
35
+ }
36
+ return sections.filter(s => s.length > 0).join('\n\n---\n\n');
37
+ }
38
+ /**
39
+ * Build summary section with executive overview
40
+ */
41
+ buildSummarySection(spec) {
42
+ return `## Summary\n\n${spec.summary || spec.description}`;
43
+ }
44
+ /**
45
+ * Build user stories section with collapsible GitHub sections
46
+ */
47
+ buildUserStoriesSection(userStories) {
48
+ const lines = ['## User Stories'];
49
+ for (const story of userStories) {
50
+ lines.push('');
51
+ lines.push(`<details>`);
52
+ lines.push(`<summary><strong>${story.id}: ${story.title}</strong></summary>`);
53
+ lines.push('');
54
+ if (story.acceptanceCriteria && story.acceptanceCriteria.length > 0) {
55
+ lines.push('**Acceptance Criteria**:');
56
+ for (const ac of story.acceptanceCriteria) {
57
+ const priority = ac.priority ? ` (${ac.priority}` : '';
58
+ const testable = ac.testable ? ', testable)' : ')';
59
+ const suffix = priority || ac.testable ? `${priority}${testable}` : '';
60
+ const checkbox = ac.completed ? '[x]' : '[ ]';
61
+ lines.push(`- ${checkbox} **${ac.id}**: ${ac.description}${suffix}`);
62
+ }
63
+ lines.push('');
64
+ }
65
+ lines.push('</details>');
66
+ }
67
+ return lines.join('\n');
68
+ }
69
+ /**
70
+ * Build tasks section with checkboxes (GitHub/Jira/ADO compatible)
71
+ *
72
+ * NEW: Shows tasks as checkboxes with completion status
73
+ */
74
+ buildTasksSection(taskMapping, options) {
75
+ const { showCheckboxes = true, showProgressBar = true, showCompletionStatus = true, provider = 'github' } = options || {};
76
+ const lines = ['## Tasks'];
77
+ lines.push('');
78
+ // Calculate progress
79
+ const total = taskMapping.tasks.length;
80
+ const completed = taskMapping.tasks.filter(t => t.completed || t.status === 'completed').length;
81
+ const percent = total > 0 ? Math.round((completed / total) * 100) : 0;
82
+ // Progress header with count
83
+ lines.push(`**Progress**: ${completed}/${total} tasks completed (${percent}%)`);
84
+ lines.push('');
85
+ // Progress bar (visual)
86
+ if (showProgressBar && total > 0) {
87
+ const barWidth = 12;
88
+ const filled = Math.round((completed / total) * barWidth);
89
+ const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);
90
+ lines.push(`\`${bar}\` ${percent}%`);
91
+ lines.push('');
92
+ }
93
+ // Tasks list
94
+ if (showCheckboxes) {
95
+ // Show tasks as checkboxes (provider-specific format)
96
+ for (const task of taskMapping.tasks) {
97
+ const isCompleted = task.completed || task.status === 'completed';
98
+ // Provider-specific checkbox format
99
+ let checkbox;
100
+ if (provider === 'jira') {
101
+ // Jira uses (x) for checked, ( ) for unchecked
102
+ checkbox = isCompleted ? '(x)' : '( )';
103
+ }
104
+ else if (provider === 'ado') {
105
+ // ADO uses HTML checkboxes (rendered in description)
106
+ checkbox = isCompleted ? '[x]' : '[ ]';
107
+ }
108
+ else {
109
+ // GitHub uses markdown checkboxes
110
+ checkbox = isCompleted ? '[x]' : '[ ]';
111
+ }
112
+ const statusEmoji = isCompleted && showCompletionStatus && provider === 'github' ? ' ✅' : '';
113
+ // Issue link (provider-specific)
114
+ let issueLink = '';
115
+ if (provider === 'github' && task.githubIssue) {
116
+ issueLink = ` [#${task.githubIssue}](https://github.com/issue/${task.githubIssue})`;
117
+ }
118
+ else if (provider === 'jira' && task.jiraIssue) {
119
+ issueLink = ` [${task.jiraIssue}]`;
120
+ }
121
+ else if (provider === 'ado' && task.adoWorkItem) {
122
+ issueLink = ` [#${task.adoWorkItem}]`;
123
+ }
124
+ // User stories
125
+ const userStories = task.userStories && task.userStories.length > 0
126
+ ? ` (implements ${task.userStories.join(', ')})`
127
+ : '';
128
+ lines.push(`- ${checkbox} **${task.id}**: ${task.title}${userStories}${issueLink}${statusEmoji}`);
129
+ }
130
+ }
131
+ else {
132
+ // Fallback: show as bullet list (backward compatibility)
133
+ for (const task of taskMapping.tasks) {
134
+ const issueLink = task.githubIssue ? ` (#${task.githubIssue})` : '';
135
+ lines.push(`- **${task.id}**: ${task.title}${issueLink}`);
136
+ if (task.userStories && task.userStories.length > 0) {
137
+ lines.push(` - Implements: ${task.userStories.join(', ')}`);
138
+ }
139
+ }
140
+ }
141
+ lines.push('');
142
+ lines.push(`**Full task list**: [tasks.md](${taskMapping.tasksUrl})`);
143
+ return lines.join('\n');
144
+ }
145
+ /**
146
+ * Build architecture references section
147
+ */
148
+ buildArchitectureSection(architectureDocs) {
149
+ if (architectureDocs.length === 0) {
150
+ return '';
151
+ }
152
+ const lines = ['## Architecture'];
153
+ lines.push('');
154
+ // Group by type
155
+ const adrs = architectureDocs.filter(doc => doc.type === 'adr');
156
+ const hlds = architectureDocs.filter(doc => doc.type === 'hld');
157
+ const diagrams = architectureDocs.filter(doc => doc.type === 'diagram');
158
+ if (adrs.length > 0) {
159
+ lines.push('**Architecture Decision Records (ADRs)**:');
160
+ for (const adr of adrs) {
161
+ lines.push(`- [${adr.title}](${adr.path})`);
162
+ }
163
+ lines.push('');
164
+ }
165
+ if (hlds.length > 0) {
166
+ lines.push('**High-Level Design (HLD)**:');
167
+ for (const hld of hlds) {
168
+ lines.push(`- [${hld.title}](${hld.path})`);
169
+ }
170
+ lines.push('');
171
+ }
172
+ if (diagrams.length > 0) {
173
+ lines.push('**Diagrams**:');
174
+ for (const diagram of diagrams) {
175
+ lines.push(`- [${diagram.title}](${diagram.path})`);
176
+ }
177
+ lines.push('');
178
+ }
179
+ return lines.join('\n').trim();
180
+ }
181
+ /**
182
+ * Build source links section
183
+ */
184
+ buildSourceLinksSection(sourceLinks) {
185
+ const lines = ['## Source'];
186
+ lines.push('');
187
+ if (sourceLinks.spec) {
188
+ lines.push(`- [spec.md](${sourceLinks.spec})`);
189
+ }
190
+ if (sourceLinks.plan) {
191
+ lines.push(`- [plan.md](${sourceLinks.plan})`);
192
+ }
193
+ if (sourceLinks.tasks) {
194
+ lines.push(`- [tasks.md](${sourceLinks.tasks})`);
195
+ }
196
+ return lines.join('\n');
197
+ }
198
+ }
199
+ //# sourceMappingURL=enhanced-content-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhanced-content-builder.js","sourceRoot":"","sources":["../../../../src/core/sync/enhanced-content-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Label Detector
3
+ *
4
+ * Detects increment type and applies appropriate labels for external tools.
5
+ * Supports GitHub labels, Jira labels, and ADO tags.
6
+ *
7
+ * @author SpecWeave Team
8
+ * @version 1.0.0
9
+ */
10
+ export type IncrementType = 'bug' | 'feature' | 'docs' | 'hotfix' | 'refactor' | 'chore' | 'experiment';
11
+ export interface LabelConfig {
12
+ bug: string;
13
+ feature: string;
14
+ docs: string;
15
+ hotfix?: string;
16
+ refactor?: string;
17
+ chore?: string;
18
+ experiment?: string;
19
+ }
20
+ export interface DetectionResult {
21
+ type: IncrementType;
22
+ confidence: number;
23
+ labels: string[];
24
+ detectionMethod: 'frontmatter' | 'title' | 'content' | 'filename';
25
+ }
26
+ export declare class LabelDetector {
27
+ private labelConfig;
28
+ constructor(labelConfig?: Partial<LabelConfig>, useUserFormat?: boolean);
29
+ /**
30
+ * Detect increment type from spec content
31
+ */
32
+ detectType(specContent: string, incrementId?: string): DetectionResult;
33
+ /**
34
+ * Detect from YAML frontmatter (type: bug, type: feature, etc.)
35
+ */
36
+ private detectFromFrontmatter;
37
+ /**
38
+ * Detect from title/heading (# Fix: Bug Title, # Feature: New Feature, etc.)
39
+ */
40
+ private detectFromTitle;
41
+ /**
42
+ * Detect from increment filename (0001-bugfix-auth, 0002-feature-dashboard, etc.)
43
+ */
44
+ private detectFromFilename;
45
+ /**
46
+ * Detect from content keywords
47
+ */
48
+ private detectFromContent;
49
+ /**
50
+ * Get labels for GitHub (standard format)
51
+ */
52
+ getGitHubLabels(type: IncrementType): string[];
53
+ /**
54
+ * Get labels for Jira (supports labels)
55
+ */
56
+ getJiraLabels(type: IncrementType): string[];
57
+ /**
58
+ * Get tags for Azure DevOps (supports tags)
59
+ */
60
+ getAdoTags(type: IncrementType): string[];
61
+ /**
62
+ * Get user-friendly labels (with brackets: [Bug], [Feature], etc.)
63
+ */
64
+ getUserLabels(type: IncrementType): string[];
65
+ }
66
+ //# sourceMappingURL=label-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-detector.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/label-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAExG,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;CACnE;AAsBD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,aAAa,GAAE,OAAc;IAK7E;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe;IAyBtE;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAc9C;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAI5C;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;IAIzC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE;CAG7C"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Label Detector
3
+ *
4
+ * Detects increment type and applies appropriate labels for external tools.
5
+ * Supports GitHub labels, Jira labels, and ADO tags.
6
+ *
7
+ * @author SpecWeave Team
8
+ * @version 1.0.0
9
+ */
10
+ const DEFAULT_GITHUB_LABELS = {
11
+ bug: 'bug',
12
+ feature: 'enhancement',
13
+ docs: 'documentation',
14
+ hotfix: 'hotfix',
15
+ refactor: 'refactor',
16
+ chore: 'chore',
17
+ experiment: 'experiment'
18
+ };
19
+ const DEFAULT_USER_LABELS = {
20
+ bug: '[Bug]',
21
+ feature: '[Feature]',
22
+ docs: '[Docs]',
23
+ hotfix: '[Hotfix]',
24
+ refactor: '[Refactor]',
25
+ chore: '[Chore]',
26
+ experiment: '[Experiment]'
27
+ };
28
+ export class LabelDetector {
29
+ constructor(labelConfig, useUserFormat = true) {
30
+ const defaults = useUserFormat ? DEFAULT_USER_LABELS : DEFAULT_GITHUB_LABELS;
31
+ this.labelConfig = { ...defaults, ...labelConfig };
32
+ }
33
+ /**
34
+ * Detect increment type from spec content
35
+ */
36
+ detectType(specContent, incrementId) {
37
+ // Try detection methods in order of confidence
38
+ const methods = [
39
+ () => this.detectFromFrontmatter(specContent),
40
+ () => this.detectFromTitle(specContent),
41
+ () => this.detectFromFilename(incrementId),
42
+ () => this.detectFromContent(specContent)
43
+ ];
44
+ for (const method of methods) {
45
+ const result = method();
46
+ if (result && result.confidence >= 70) {
47
+ return result;
48
+ }
49
+ }
50
+ // Fallback: default to feature with low confidence
51
+ return {
52
+ type: 'feature',
53
+ confidence: 30,
54
+ labels: [this.labelConfig.feature],
55
+ detectionMethod: 'content'
56
+ };
57
+ }
58
+ /**
59
+ * Detect from YAML frontmatter (type: bug, type: feature, etc.)
60
+ */
61
+ detectFromFrontmatter(content) {
62
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
63
+ if (!frontmatterMatch)
64
+ return null;
65
+ const frontmatter = frontmatterMatch[1];
66
+ // Look for "type: bug" or "type: feature"
67
+ const typeMatch = frontmatter.match(/^type:\s*(.+)$/m);
68
+ if (!typeMatch)
69
+ return null;
70
+ const type = typeMatch[1].trim().toLowerCase();
71
+ const label = this.labelConfig[type];
72
+ if (!label)
73
+ return null;
74
+ return {
75
+ type,
76
+ confidence: 100,
77
+ labels: [label],
78
+ detectionMethod: 'frontmatter'
79
+ };
80
+ }
81
+ /**
82
+ * Detect from title/heading (# Fix: Bug Title, # Feature: New Feature, etc.)
83
+ */
84
+ detectFromTitle(content) {
85
+ const titleMatch = content.match(/^#\s+(?:Increment\s+\d+:\s+)?(.+)$/m);
86
+ if (!titleMatch)
87
+ return null;
88
+ const title = titleMatch[1].toLowerCase();
89
+ // Check for explicit markers
90
+ const markers = {
91
+ bug: ['fix:', 'bug:', 'bugfix:', 'hotfix:'],
92
+ feature: ['feature:', 'feat:', 'add:', 'implement:'],
93
+ docs: ['docs:', 'doc:', 'documentation:'],
94
+ hotfix: ['hotfix:', 'emergency:', 'critical:'],
95
+ refactor: ['refactor:', 'refactoring:', 'cleanup:'],
96
+ chore: ['chore:', 'maintenance:']
97
+ };
98
+ for (const [type, patterns] of Object.entries(markers)) {
99
+ if (patterns.some(p => title.startsWith(p))) {
100
+ return {
101
+ type: type,
102
+ confidence: 90,
103
+ labels: [this.labelConfig[type]],
104
+ detectionMethod: 'title'
105
+ };
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Detect from increment filename (0001-bugfix-auth, 0002-feature-dashboard, etc.)
112
+ */
113
+ detectFromFilename(incrementId) {
114
+ if (!incrementId)
115
+ return null;
116
+ const filename = incrementId.toLowerCase();
117
+ const patterns = {
118
+ bug: /\b(bug|bugfix|fix)\b/,
119
+ feature: /\b(feature|feat)\b/,
120
+ docs: /\b(docs?|documentation)\b/,
121
+ hotfix: /\b(hotfix|emergency)\b/,
122
+ refactor: /\b(refactor|cleanup)\b/,
123
+ chore: /\b(chore|maintenance)\b/,
124
+ experiment: /\b(experiment|poc|spike)\b/
125
+ };
126
+ for (const [type, pattern] of Object.entries(patterns)) {
127
+ if (pattern.test(filename)) {
128
+ return {
129
+ type: type,
130
+ confidence: 80,
131
+ labels: [this.labelConfig[type]],
132
+ detectionMethod: 'filename'
133
+ };
134
+ }
135
+ }
136
+ return null;
137
+ }
138
+ /**
139
+ * Detect from content keywords
140
+ */
141
+ detectFromContent(content) {
142
+ const lower = content.toLowerCase();
143
+ // Bug indicators
144
+ const bugKeywords = ['error', 'crash', 'issue', 'problem', 'broken', 'not working'];
145
+ const bugCount = bugKeywords.filter(k => lower.includes(k)).length;
146
+ // Feature indicators
147
+ const featureKeywords = ['implement', 'add', 'create', 'new feature', 'enhancement'];
148
+ const featureCount = featureKeywords.filter(k => lower.includes(k)).length;
149
+ // Docs indicators
150
+ const docsKeywords = ['documentation', 'readme', 'guide', 'tutorial', 'docs'];
151
+ const docsCount = docsKeywords.filter(k => lower.includes(k)).length;
152
+ // Determine type by keyword frequency
153
+ const max = Math.max(bugCount, featureCount, docsCount);
154
+ if (max === 0)
155
+ return null;
156
+ let type;
157
+ let confidence;
158
+ if (bugCount === max) {
159
+ type = 'bug';
160
+ confidence = Math.min(50 + bugCount * 10, 100);
161
+ }
162
+ else if (featureCount === max) {
163
+ type = 'feature';
164
+ confidence = Math.min(50 + featureCount * 10, 100);
165
+ }
166
+ else {
167
+ type = 'docs';
168
+ confidence = Math.min(50 + docsCount * 10, 100);
169
+ }
170
+ return {
171
+ type,
172
+ confidence,
173
+ labels: [this.labelConfig[type]],
174
+ detectionMethod: 'content'
175
+ };
176
+ }
177
+ /**
178
+ * Get labels for GitHub (standard format)
179
+ */
180
+ getGitHubLabels(type) {
181
+ const githubLabels = {
182
+ bug: 'bug',
183
+ feature: 'enhancement',
184
+ docs: 'documentation',
185
+ hotfix: 'hotfix',
186
+ refactor: 'refactor',
187
+ chore: 'chore',
188
+ experiment: 'experiment'
189
+ };
190
+ return [githubLabels[type]];
191
+ }
192
+ /**
193
+ * Get labels for Jira (supports labels)
194
+ */
195
+ getJiraLabels(type) {
196
+ return [type]; // Jira labels are just lowercase type names
197
+ }
198
+ /**
199
+ * Get tags for Azure DevOps (supports tags)
200
+ */
201
+ getAdoTags(type) {
202
+ return [type]; // ADO tags are also lowercase type names
203
+ }
204
+ /**
205
+ * Get user-friendly labels (with brackets: [Bug], [Feature], etc.)
206
+ */
207
+ getUserLabels(type) {
208
+ return [this.labelConfig[type]];
209
+ }
210
+ }
211
+ //# sourceMappingURL=label-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label-detector.js","sourceRoot":"","sources":["../../../../src/core/sync/label-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Retry Logic
3
+ *
4
+ * Provides retry functionality with exponential backoff.
5
+ * Handles transient errors (network, rate limits, timeouts).
6
+ *
7
+ * Retry Strategy:
8
+ * - Max 3 retries
9
+ * - Exponential backoff: 1s, 2s, 4s
10
+ * - Special handling for rate limits (wait and retry)
11
+ *
12
+ * @module retry-logic
13
+ */
14
+ export interface RetryOptions {
15
+ maxRetries?: number;
16
+ initialDelayMs?: number;
17
+ maxDelayMs?: number;
18
+ retryableErrors?: string[];
19
+ }
20
+ export interface RetryResult<T> {
21
+ success: boolean;
22
+ result?: T;
23
+ error?: Error;
24
+ attempts: number;
25
+ totalDelayMs: number;
26
+ }
27
+ /**
28
+ * Check if error is retryable
29
+ *
30
+ * @param error - Error to check
31
+ * @returns True if error is retryable
32
+ */
33
+ export declare function isRetryableError(error: Error): boolean;
34
+ /**
35
+ * Extract rate limit wait time from error
36
+ *
37
+ * @param error - Error that may contain rate limit info
38
+ * @returns Wait time in milliseconds, or null if not rate limit error
39
+ */
40
+ export declare function extractRateLimitWaitTime(error: Error): number | null;
41
+ /**
42
+ * Retry function with exponential backoff
43
+ *
44
+ * @param fn - Function to retry
45
+ * @param options - Retry options
46
+ * @returns Retry result
47
+ */
48
+ export declare function retryWithBackoff<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<RetryResult<T>>;
49
+ /**
50
+ * Create error message with retry information
51
+ *
52
+ * @param error - Original error
53
+ * @param attempts - Number of attempts made
54
+ * @returns Enhanced error message
55
+ */
56
+ export declare function createRetryErrorMessage(error: Error, attempts: number): string;
57
+ /**
58
+ * Check if error is permanent (not worth retrying)
59
+ *
60
+ * @param error - Error to check
61
+ * @returns True if error is permanent
62
+ */
63
+ export declare function isPermanentError(error: Error): boolean;
64
+ //# sourceMappingURL=retry-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-logic.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/retry-logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAkCtD;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAqBpE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA4DzB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAwBtD"}