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,202 @@
1
+ /**
2
+ * Enhanced Content Builder
3
+ *
4
+ * Builds rich external issue descriptions with full spec content
5
+ * for GitHub, JIRA, and Azure DevOps integrations.
6
+ */
7
+ export class EnhancedContentBuilder {
8
+ /**
9
+ * Build complete external description from spec
10
+ */
11
+ buildExternalDescription(spec) {
12
+ const sections = [];
13
+ // 1. Executive Summary
14
+ sections.push(this.buildSummarySection(spec));
15
+ // 2. User Stories (collapsible in GitHub)
16
+ sections.push(this.buildUserStoriesSection(spec.userStories));
17
+ // 3. Linked Tasks (if available)
18
+ if (spec.tasks && spec.tasks.length > 0) {
19
+ sections.push(this.buildTasksSection(spec.tasks));
20
+ }
21
+ // 4. Architecture References (if available)
22
+ if (spec.architectureDocs && spec.architectureDocs.length > 0) {
23
+ sections.push(this.buildArchitectureSection(spec.architectureDocs));
24
+ }
25
+ // 5. Source Links (if available)
26
+ if (spec.sourceLinks) {
27
+ sections.push(this.buildSourceLinksSection(spec.sourceLinks));
28
+ }
29
+ return sections.join('\n\n');
30
+ }
31
+ /**
32
+ * Build summary section
33
+ */
34
+ buildSummarySection(spec) {
35
+ return `## Summary\n\n${spec.summary}`;
36
+ }
37
+ /**
38
+ * Build user stories section with collapsible details
39
+ */
40
+ buildUserStoriesSection(userStories) {
41
+ if (!userStories || userStories.length === 0) {
42
+ return `## User Stories\n\nNo user stories defined.`;
43
+ }
44
+ const sections = ['## User Stories'];
45
+ for (const story of userStories) {
46
+ const storySection = this.buildUserStoryDetails(story);
47
+ sections.push(storySection);
48
+ }
49
+ return sections.join('\n\n');
50
+ }
51
+ /**
52
+ * Build individual user story with collapsible details
53
+ */
54
+ buildUserStoryDetails(story) {
55
+ const lines = [];
56
+ // Use GitHub collapsible format
57
+ lines.push(`<details>`);
58
+ lines.push(`<summary><strong>${story.id}: ${story.title}</strong></summary>`);
59
+ lines.push('');
60
+ // Add description if available
61
+ if (story.description) {
62
+ lines.push(`**Description**: ${story.description}`);
63
+ lines.push('');
64
+ }
65
+ // Acceptance Criteria
66
+ if (story.acceptanceCriteria && story.acceptanceCriteria.length > 0) {
67
+ lines.push('**Acceptance Criteria**:');
68
+ lines.push('');
69
+ // Group by priority
70
+ const byPriority = this.groupAcceptanceCriteriaByPriority(story.acceptanceCriteria);
71
+ for (const priority of ['P1', 'P2', 'P3', 'OTHER']) {
72
+ const criteria = byPriority[priority];
73
+ if (criteria && criteria.length > 0) {
74
+ for (const ac of criteria) {
75
+ const priorityLabel = ac.priority ? ` (${ac.priority})` : '';
76
+ lines.push(`- **${ac.id}**${priorityLabel}: ${ac.description}`);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ else {
82
+ lines.push('**Acceptance Criteria**: No acceptance criteria defined.');
83
+ }
84
+ lines.push('');
85
+ lines.push('</details>');
86
+ return lines.join('\n');
87
+ }
88
+ /**
89
+ * Group acceptance criteria by priority
90
+ */
91
+ groupAcceptanceCriteriaByPriority(criteria) {
92
+ const grouped = {
93
+ P1: [],
94
+ P2: [],
95
+ P3: [],
96
+ OTHER: [] // For criteria without priority or with other priorities
97
+ };
98
+ for (const ac of criteria) {
99
+ const priority = ac.priority || 'OTHER';
100
+ if (priority in grouped) {
101
+ grouped[priority].push(ac);
102
+ }
103
+ else {
104
+ grouped.OTHER.push(ac);
105
+ }
106
+ }
107
+ return grouped;
108
+ }
109
+ /**
110
+ * Build tasks section with GitHub issue links
111
+ * Supports both simple array and options object for backward compatibility
112
+ */
113
+ buildTasksSection(tasks, ownerOrOptions, repo) {
114
+ // Handle both old and new signatures
115
+ let taskList;
116
+ let owner;
117
+ let options = {};
118
+ if (Array.isArray(tasks)) {
119
+ taskList = tasks;
120
+ if (typeof ownerOrOptions === 'string') {
121
+ owner = ownerOrOptions;
122
+ }
123
+ else if (typeof ownerOrOptions === 'object') {
124
+ options = ownerOrOptions;
125
+ }
126
+ }
127
+ else {
128
+ // tasks is actually taskMapping object
129
+ taskList = tasks?.tasks || [];
130
+ if (typeof ownerOrOptions === 'object') {
131
+ options = ownerOrOptions;
132
+ owner = tasks?.owner;
133
+ repo = tasks?.repo;
134
+ }
135
+ }
136
+ if (!taskList || taskList.length === 0) {
137
+ return `## Tasks\n\nNo tasks defined.`;
138
+ }
139
+ const lines = ['## Tasks'];
140
+ lines.push('');
141
+ // Add progress bar if requested
142
+ if (options.showProgressBar && taskList.length > 0) {
143
+ const completed = taskList.filter(t => t.completed).length;
144
+ const total = taskList.length;
145
+ const percentage = Math.round((completed / total) * 100);
146
+ lines.push(`**Progress**: ${completed}/${total} tasks (${percentage}%)`);
147
+ lines.push('');
148
+ }
149
+ for (const task of taskList) {
150
+ let taskLine = '';
151
+ // Add checkbox if requested
152
+ if (options.showCheckboxes) {
153
+ taskLine += task.completed ? '- [x] ' : '- [ ] ';
154
+ }
155
+ else {
156
+ taskLine += '- ';
157
+ }
158
+ taskLine += `**${task.id}**: ${task.title}`;
159
+ // Add GitHub issue link if available
160
+ if (task.githubIssue && owner && repo) {
161
+ const issueUrl = `https://github.com/${owner}/${repo}/issues/${task.githubIssue}`;
162
+ taskLine += ` ([#${task.githubIssue}](${issueUrl}))`;
163
+ }
164
+ // Add user story references
165
+ if (task.userStoryIds && task.userStoryIds.length > 0) {
166
+ taskLine += ` → Implements: ${task.userStoryIds.join(', ')}`;
167
+ }
168
+ // Add completion status if requested
169
+ if (options.showCompletionStatus && task.completed) {
170
+ taskLine += ' ✅';
171
+ }
172
+ lines.push(taskLine);
173
+ }
174
+ return lines.join('\n');
175
+ }
176
+ /**
177
+ * Build architecture section
178
+ */
179
+ buildArchitectureSection(docs) {
180
+ const lines = ['## Architecture'];
181
+ lines.push('');
182
+ lines.push('Related architecture documentation:');
183
+ lines.push('');
184
+ for (const doc of docs) {
185
+ const fileName = doc.split('/').pop() || doc;
186
+ lines.push(`- [${fileName}](${doc})`);
187
+ }
188
+ return lines.join('\n');
189
+ }
190
+ /**
191
+ * Build source links section
192
+ */
193
+ buildSourceLinksSection(sourceLinks) {
194
+ const lines = ['## Source Files'];
195
+ lines.push('');
196
+ lines.push(`- **Specification**: [spec.md](${sourceLinks.spec})`);
197
+ lines.push(`- **Technical Plan**: [plan.md](${sourceLinks.plan})`);
198
+ lines.push(`- **Task List**: [tasks.md](${sourceLinks.tasks})`);
199
+ return lines.join('\n');
200
+ }
201
+ }
202
+ //# 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"}