specweave 0.24.1 → 0.24.8

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 (173) hide show
  1. package/CLAUDE.md +106 -0
  2. package/README.md +34 -0
  3. package/dist/src/cli/commands/init.d.ts.map +1 -1
  4. package/dist/src/cli/commands/init.js +80 -41
  5. package/dist/src/cli/commands/init.js.map +1 -1
  6. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts +5 -2
  7. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.d.ts.map +1 -1
  8. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js +72 -6
  9. package/dist/src/cli/helpers/issue-tracker/github-multi-repo.js.map +1 -1
  10. package/dist/src/cli/helpers/issue-tracker/github.d.ts +2 -1
  11. package/dist/src/cli/helpers/issue-tracker/github.d.ts.map +1 -1
  12. package/dist/src/cli/helpers/issue-tracker/github.js +4 -3
  13. package/dist/src/cli/helpers/issue-tracker/github.js.map +1 -1
  14. package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
  15. package/dist/src/cli/helpers/issue-tracker/index.js +26 -9
  16. package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
  17. package/dist/src/cli/helpers/issue-tracker/types.d.ts +2 -1
  18. package/dist/src/cli/helpers/issue-tracker/types.d.ts.map +1 -1
  19. package/dist/src/cli/helpers/issue-tracker/types.js.map +1 -1
  20. package/dist/src/config/types.d.ts +24 -24
  21. package/dist/src/core/config/types.d.ts +25 -0
  22. package/dist/src/core/config/types.d.ts.map +1 -1
  23. package/dist/src/core/config/types.js +6 -0
  24. package/dist/src/core/config/types.js.map +1 -1
  25. package/dist/src/core/repo-structure/git-error-handler.d.ts +37 -0
  26. package/dist/src/core/repo-structure/git-error-handler.d.ts.map +1 -0
  27. package/dist/src/core/repo-structure/git-error-handler.js +214 -0
  28. package/dist/src/core/repo-structure/git-error-handler.js.map +1 -0
  29. package/dist/src/core/repo-structure/git-provider.d.ts +183 -0
  30. package/dist/src/core/repo-structure/git-provider.d.ts.map +1 -0
  31. package/dist/src/core/repo-structure/git-provider.js +57 -0
  32. package/dist/src/core/repo-structure/git-provider.js.map +1 -0
  33. package/dist/src/core/repo-structure/github-validator.d.ts +1 -0
  34. package/dist/src/core/repo-structure/github-validator.d.ts.map +1 -1
  35. package/dist/src/core/repo-structure/github-validator.js +35 -9
  36. package/dist/src/core/repo-structure/github-validator.js.map +1 -1
  37. package/dist/src/core/repo-structure/platform-registry.d.ts +114 -0
  38. package/dist/src/core/repo-structure/platform-registry.d.ts.map +1 -0
  39. package/dist/src/core/repo-structure/platform-registry.js +195 -0
  40. package/dist/src/core/repo-structure/platform-registry.js.map +1 -0
  41. package/dist/src/core/repo-structure/prompt-consolidator.d.ts +30 -0
  42. package/dist/src/core/repo-structure/prompt-consolidator.d.ts.map +1 -1
  43. package/dist/src/core/repo-structure/prompt-consolidator.js +69 -0
  44. package/dist/src/core/repo-structure/prompt-consolidator.js.map +1 -1
  45. package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts +54 -0
  46. package/dist/src/core/repo-structure/providers/bitbucket-provider.d.ts.map +1 -0
  47. package/dist/src/core/repo-structure/providers/bitbucket-provider.js +104 -0
  48. package/dist/src/core/repo-structure/providers/bitbucket-provider.js.map +1 -0
  49. package/dist/src/core/repo-structure/providers/github-provider.d.ts +53 -0
  50. package/dist/src/core/repo-structure/providers/github-provider.d.ts.map +1 -0
  51. package/dist/src/core/repo-structure/providers/github-provider.js +239 -0
  52. package/dist/src/core/repo-structure/providers/github-provider.js.map +1 -0
  53. package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts +50 -0
  54. package/dist/src/core/repo-structure/providers/gitlab-provider.d.ts.map +1 -0
  55. package/dist/src/core/repo-structure/providers/gitlab-provider.js +97 -0
  56. package/dist/src/core/repo-structure/providers/gitlab-provider.js.map +1 -0
  57. package/dist/src/core/repo-structure/providers/index.d.ts +33 -0
  58. package/dist/src/core/repo-structure/providers/index.d.ts.map +1 -0
  59. package/dist/src/core/repo-structure/providers/index.js +60 -0
  60. package/dist/src/core/repo-structure/providers/index.js.map +1 -0
  61. package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts +33 -0
  62. package/dist/src/core/repo-structure/repo-bulk-discovery.d.ts.map +1 -0
  63. package/dist/src/core/repo-structure/repo-bulk-discovery.js +275 -0
  64. package/dist/src/core/repo-structure/repo-bulk-discovery.js.map +1 -0
  65. package/dist/src/core/repo-structure/repo-structure-manager.d.ts +18 -2
  66. package/dist/src/core/repo-structure/repo-structure-manager.d.ts.map +1 -1
  67. package/dist/src/core/repo-structure/repo-structure-manager.js +303 -85
  68. package/dist/src/core/repo-structure/repo-structure-manager.js.map +1 -1
  69. package/dist/src/core/repo-structure/url-generator.d.ts +80 -0
  70. package/dist/src/core/repo-structure/url-generator.d.ts.map +1 -0
  71. package/dist/src/core/repo-structure/url-generator.js +110 -0
  72. package/dist/src/core/repo-structure/url-generator.js.map +1 -0
  73. package/dist/src/init/architecture/types.d.ts +6 -6
  74. package/dist/src/utils/plugin-validator.d.ts.map +1 -1
  75. package/dist/src/utils/plugin-validator.js +15 -14
  76. package/dist/src/utils/plugin-validator.js.map +1 -1
  77. package/package.json +4 -4
  78. package/plugins/specweave/.claude-plugin/plugin.json +4 -4
  79. package/plugins/specweave/agents/pm/AGENT.md +2 -0
  80. package/plugins/specweave/commands/specweave-do.md +0 -47
  81. package/plugins/specweave/commands/specweave-increment.md +0 -82
  82. package/plugins/specweave/commands/specweave-next.md +0 -47
  83. package/plugins/specweave/hooks/post-task-completion.sh +67 -6
  84. package/plugins/specweave/hooks/pre-edit-spec.sh +11 -0
  85. package/plugins/specweave/hooks/pre-task-completion.sh +69 -2
  86. package/plugins/specweave/hooks/pre-write-spec.sh +11 -0
  87. package/plugins/specweave/skills/increment-planner/SKILL.md +124 -4
  88. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  89. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  90. package/plugins/specweave/agents/pm/AGENT.md.bak +0 -1893
  91. package/plugins/specweave/hooks/docs-changed.sh.backup +0 -79
  92. package/plugins/specweave/hooks/human-input-required.sh.backup +0 -75
  93. package/plugins/specweave/hooks/lib/migrate-increment-work.sh.bak +0 -245
  94. package/plugins/specweave/hooks/lib/sync-spec-content.sh.bak +0 -149
  95. package/plugins/specweave/hooks/lib/validate-spec-status.sh.bak +0 -163
  96. package/plugins/specweave/hooks/post-first-increment.sh.backup +0 -61
  97. package/plugins/specweave/hooks/post-first-increment.sh.bak +0 -61
  98. package/plugins/specweave/hooks/post-increment-change.sh.backup +0 -98
  99. package/plugins/specweave/hooks/post-increment-completion.sh.backup +0 -231
  100. package/plugins/specweave/hooks/post-increment-planning.sh.backup +0 -1048
  101. package/plugins/specweave/hooks/post-increment-status-change.sh.backup +0 -147
  102. package/plugins/specweave/hooks/post-spec-update.sh.backup +0 -158
  103. package/plugins/specweave/hooks/post-spec-update.sh.bak +0 -158
  104. package/plugins/specweave/hooks/post-user-story-complete.sh.backup +0 -179
  105. package/plugins/specweave/hooks/post-user-story-complete.sh.bak +0 -179
  106. package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +0 -83
  107. package/plugins/specweave/hooks/pre-command-deduplication.sh.bak +0 -83
  108. package/plugins/specweave/hooks/pre-implementation.sh.backup +0 -67
  109. package/plugins/specweave/hooks/pre-task-completion.sh.backup +0 -194
  110. package/plugins/specweave/hooks/pre-tool-use.sh.backup +0 -133
  111. package/plugins/specweave/hooks/user-prompt-submit.sh.backup +0 -386
  112. package/plugins/specweave/hooks/user-prompt-submit.sh.bak +0 -386
  113. package/plugins/specweave/lib/hooks/auto-transition.js.bak +0 -50
  114. package/plugins/specweave/lib/hooks/auto-transition.ts.bak +0 -84
  115. package/plugins/specweave/lib/hooks/git-diff-analyzer.d.js.bak +0 -0
  116. package/plugins/specweave/lib/hooks/git-diff-analyzer.d.ts.bak +0 -89
  117. package/plugins/specweave/lib/hooks/git-diff-analyzer.js.bak +0 -142
  118. package/plugins/specweave/lib/hooks/git-diff-analyzer.ts.bak +0 -269
  119. package/plugins/specweave/lib/hooks/invoke-translator-skill.d.js.bak +0 -0
  120. package/plugins/specweave/lib/hooks/invoke-translator-skill.d.ts.bak +0 -60
  121. package/plugins/specweave/lib/hooks/invoke-translator-skill.js.bak +0 -155
  122. package/plugins/specweave/lib/hooks/invoke-translator-skill.ts.bak +0 -264
  123. package/plugins/specweave/lib/hooks/prepare-reflection-context.d.js.bak +0 -0
  124. package/plugins/specweave/lib/hooks/prepare-reflection-context.d.ts.bak +0 -42
  125. package/plugins/specweave/lib/hooks/prepare-reflection-context.js.bak +0 -110
  126. package/plugins/specweave/lib/hooks/prepare-reflection-context.ts.bak +0 -178
  127. package/plugins/specweave/lib/hooks/reflection-config-loader.d.js.bak +0 -0
  128. package/plugins/specweave/lib/hooks/reflection-config-loader.d.ts.bak +0 -45
  129. package/plugins/specweave/lib/hooks/reflection-config-loader.js.bak +0 -92
  130. package/plugins/specweave/lib/hooks/reflection-config-loader.ts.bak +0 -156
  131. package/plugins/specweave/lib/hooks/reflection-parser.d.js.bak +0 -0
  132. package/plugins/specweave/lib/hooks/reflection-parser.d.ts.bak +0 -33
  133. package/plugins/specweave/lib/hooks/reflection-parser.js.bak +0 -301
  134. package/plugins/specweave/lib/hooks/reflection-parser.ts.bak +0 -484
  135. package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.js.bak +0 -0
  136. package/plugins/specweave/lib/hooks/reflection-prompt-builder.d.ts.bak +0 -56
  137. package/plugins/specweave/lib/hooks/reflection-prompt-builder.js.bak +0 -182
  138. package/plugins/specweave/lib/hooks/reflection-prompt-builder.ts.bak +0 -306
  139. package/plugins/specweave/lib/hooks/reflection-storage.d.js.bak +0 -0
  140. package/plugins/specweave/lib/hooks/reflection-storage.d.ts.bak +0 -64
  141. package/plugins/specweave/lib/hooks/reflection-storage.js.bak +0 -231
  142. package/plugins/specweave/lib/hooks/reflection-storage.ts.bak +0 -369
  143. package/plugins/specweave/lib/hooks/run-self-reflection.d.js.bak +0 -0
  144. package/plugins/specweave/lib/hooks/run-self-reflection.d.ts.bak +0 -43
  145. package/plugins/specweave/lib/hooks/run-self-reflection.js.bak +0 -132
  146. package/plugins/specweave/lib/hooks/run-self-reflection.ts.bak +0 -258
  147. package/plugins/specweave/lib/hooks/sync-cache.js.bak +0 -294
  148. package/plugins/specweave/lib/hooks/sync-living-docs.d.js.bak +0 -1
  149. package/plugins/specweave/lib/hooks/sync-living-docs.d.ts.bak +0 -27
  150. package/plugins/specweave/lib/hooks/sync-living-docs.js.bak +0 -339
  151. package/plugins/specweave/lib/hooks/sync-us-tasks.js.bak +0 -476
  152. package/plugins/specweave/lib/hooks/translate-file.d.js.bak +0 -0
  153. package/plugins/specweave/lib/hooks/translate-file.d.ts.bak +0 -59
  154. package/plugins/specweave/lib/hooks/translate-file.js.bak +0 -289
  155. package/plugins/specweave/lib/hooks/translate-file.ts.bak +0 -428
  156. package/plugins/specweave/lib/hooks/translate-living-docs.d.js.bak +0 -0
  157. package/plugins/specweave/lib/hooks/translate-living-docs.d.ts.bak +0 -13
  158. package/plugins/specweave/lib/hooks/translate-living-docs.js.bak +0 -119
  159. package/plugins/specweave/lib/hooks/translate-living-docs.ts.bak +0 -224
  160. package/plugins/specweave/lib/hooks/update-ac-status.js.bak +0 -51
  161. package/plugins/specweave/lib/hooks/update-ac-status.ts.bak +0 -103
  162. package/plugins/specweave/lib/hooks/update-tasks-md.d.js.bak +0 -1
  163. package/plugins/specweave/lib/hooks/update-tasks-md.d.ts.bak +0 -29
  164. package/plugins/specweave/lib/hooks/update-tasks-md.js.bak +0 -296
  165. package/plugins/specweave/lib/hooks/update-tasks-md.ts.bak +0 -489
  166. package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +0 -353
  167. package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +0 -172
  168. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  169. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +0 -228
  170. package/plugins/specweave-github/hooks/post-task-completion.sh.backup +0 -258
  171. package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +0 -172
  172. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -444
  173. package/plugins/specweave-release/hooks/post-task-completion.sh.backup +0 -110
@@ -1,296 +0,0 @@
1
- #!/usr/bin/env node
2
- import fs from "fs-extra";
3
- import path from "path";
4
- async function updateTasksMd(incrementId) {
5
- try {
6
- console.log(`
7
- \u{1F504} Updating tasks.md for increment: ${incrementId}`);
8
- const incrementDir = path.join(process.cwd(), ".specweave", "increments", incrementId);
9
- if (!fs.existsSync(incrementDir)) {
10
- console.error(`\u274C Increment directory not found: ${incrementDir}`);
11
- process.exit(1);
12
- }
13
- const tasksPath = path.join(incrementDir, "tasks.md");
14
- if (!fs.existsSync(tasksPath)) {
15
- console.error(`\u274C tasks.md not found: ${tasksPath}`);
16
- process.exit(1);
17
- }
18
- const originalContent = await fs.readFile(tasksPath, "utf-8");
19
- const lines = originalContent.split("\n");
20
- console.log(`\u{1F4D6} Read tasks.md (${lines.length} lines)`);
21
- const tasks = parseTaskStatus(lines);
22
- console.log(`\u{1F4CB} Found ${tasks.length} tasks`);
23
- const { completedTasks, fixes } = detectCompletedTasks(lines);
24
- let updatedContent = originalContent;
25
- let autoFixedCount = 0;
26
- if (fixes.length > 0) {
27
- console.log(`\u{1F527} Auto-fixing ${fixes.length} task consistency issue(s)...`);
28
- updatedContent = applyConsistencyFixes(originalContent, fixes);
29
- autoFixedCount = fixes.length;
30
- console.log("\u2705 Task consistency auto-fixed");
31
- }
32
- if (completedTasks.length === 0 && fixes.length === 0) {
33
- console.log("\u2705 No new task completions or consistency fixes needed");
34
- return;
35
- }
36
- if (completedTasks.length > 0) {
37
- console.log(`\u{1F3AF} Detected ${completedTasks.length} completed task(s):`, completedTasks);
38
- }
39
- for (const taskId of completedTasks) {
40
- updatedContent = markTaskComplete(updatedContent, taskId);
41
- }
42
- const updatedLines = updatedContent.split("\n");
43
- const totalTasks = countTotalTasks(updatedLines);
44
- const completedCount = countCompletedTasks(updatedLines);
45
- const progress = Math.round(completedCount / totalTasks * 100);
46
- console.log(`\u{1F4CA} Progress: ${completedCount}/${totalTasks} (${progress}%)`);
47
- updatedContent = updateProgressHeader(updatedContent, completedCount, totalTasks, progress);
48
- await fs.writeFile(tasksPath, updatedContent, "utf-8");
49
- console.log(`\u2705 Updated ${tasksPath}`);
50
- if (autoFixedCount > 0) {
51
- console.log(`\u{1F527} Auto-fixed ${autoFixedCount} consistency issue(s)`);
52
- }
53
- console.log(` Completed: ${completedCount}/${totalTasks}`);
54
- console.log(` Progress: ${progress}%
55
- `);
56
- } catch (error) {
57
- console.error("\u274C Error updating tasks.md:", error);
58
- process.exit(1);
59
- }
60
- }
61
- function parseTaskStatus(lines) {
62
- const tasks = [];
63
- const taskPattern = /^###\s+(T-?\d+[-A-Z]*):?\s+(.+)/;
64
- lines.forEach((line, index) => {
65
- const match = line.match(taskPattern);
66
- if (match) {
67
- const taskId = match[1];
68
- let status = "pending";
69
- for (let i = index + 1; i < Math.min(index + 5, lines.length); i++) {
70
- const nextLine = lines[i];
71
- if (nextLine.includes("**Status**:")) {
72
- if (nextLine.includes("[x] Completed")) {
73
- status = "completed";
74
- } else if (nextLine.includes("\u23F3 Pending") || nextLine.includes("[ ] Pending")) {
75
- status = "pending";
76
- } else if (nextLine.includes("\u{1F504} In Progress") || nextLine.includes("in_progress")) {
77
- status = "in_progress";
78
- }
79
- break;
80
- }
81
- }
82
- tasks.push({
83
- taskId,
84
- lineNumber: index,
85
- currentStatus: status
86
- });
87
- }
88
- });
89
- return tasks;
90
- }
91
- function detectCompletedTasks(lines) {
92
- const completedTasks = [];
93
- const fixes = [];
94
- const warnings = [];
95
- const taskPattern = /^###\s+(T-\d+[-A-Z]*):?\s+(.+)/;
96
- for (let i = 0; i < lines.length; i++) {
97
- const line = lines[i];
98
- const taskMatch = line.match(taskPattern);
99
- if (!taskMatch) continue;
100
- const taskId = taskMatch[1];
101
- const taskTitle = taskMatch[2];
102
- const hasCompleteMarker = taskTitle.includes("\u2705 COMPLETE");
103
- const taskEndIndex = findNextTaskStart(lines, i + 1);
104
- const implementationSection = findImplementationSection(lines, i, taskEndIndex);
105
- let allCheckboxesComplete = false;
106
- if (implementationSection) {
107
- allCheckboxesComplete = checkAllCheckboxesComplete(implementationSection);
108
- }
109
- if (hasCompleteMarker && implementationSection) {
110
- if (allCheckboxesComplete) {
111
- if (!completedTasks.includes(taskId)) {
112
- completedTasks.push(taskId);
113
- }
114
- } else {
115
- fixes.push({
116
- taskId,
117
- lineNumber: i,
118
- action: "remove-complete-marker",
119
- currentLine: line
120
- });
121
- warnings.push(`${taskId}: Header has \u2705 COMPLETE but not all checkboxes checked`);
122
- }
123
- continue;
124
- }
125
- if (hasCompleteMarker && !implementationSection) {
126
- fixes.push({
127
- taskId,
128
- lineNumber: i,
129
- action: "remove-complete-marker",
130
- currentLine: line
131
- });
132
- warnings.push(`${taskId}: Header has \u2705 COMPLETE but no implementation section to verify`);
133
- continue;
134
- }
135
- if (!hasCompleteMarker && implementationSection && allCheckboxesComplete) {
136
- fixes.push({
137
- taskId,
138
- lineNumber: i,
139
- action: "add-complete-marker",
140
- currentLine: line
141
- });
142
- warnings.push(`${taskId}: All checkboxes checked but header missing \u2705 COMPLETE`);
143
- if (!completedTasks.includes(taskId)) {
144
- completedTasks.push(taskId);
145
- }
146
- continue;
147
- }
148
- for (let j = i + 1; j < Math.min(i + 10, taskEndIndex); j++) {
149
- const statusLine = lines[j];
150
- if (statusLine.includes("**Status**:") && statusLine.includes("[x] Completed")) {
151
- if (!completedTasks.includes(taskId)) {
152
- completedTasks.push(taskId);
153
- }
154
- break;
155
- }
156
- }
157
- }
158
- if (warnings.length > 0) {
159
- console.warn("\n\u26A0\uFE0F Task Consistency Warnings:");
160
- warnings.forEach((w) => console.warn(` ${w}`));
161
- console.warn("");
162
- }
163
- return { completedTasks, fixes };
164
- }
165
- function applyConsistencyFixes(content, fixes) {
166
- const lines = content.split("\n");
167
- for (const fix of fixes.reverse()) {
168
- const line = lines[fix.lineNumber];
169
- if (fix.action === "remove-complete-marker") {
170
- const fixed = line.replace(/\s*✅\s*COMPLETE\s*/g, "");
171
- lines[fix.lineNumber] = fixed;
172
- } else if (fix.action === "add-complete-marker") {
173
- const fixed = line.trim() + " \u2705 COMPLETE";
174
- lines[fix.lineNumber] = fixed;
175
- }
176
- }
177
- return lines.join("\n");
178
- }
179
- function findNextTaskStart(lines, startIndex) {
180
- const taskPattern = /^###\s+T-\d+/;
181
- for (let i = startIndex; i < lines.length; i++) {
182
- if (taskPattern.test(lines[i])) {
183
- return i;
184
- }
185
- }
186
- return lines.length;
187
- }
188
- function findImplementationSection(lines, taskStartIndex, taskEndIndex) {
189
- let inImplementation = false;
190
- const implementationLines = [];
191
- for (let i = taskStartIndex; i < taskEndIndex; i++) {
192
- const line = lines[i];
193
- if (line.includes("**Implementation**:")) {
194
- inImplementation = true;
195
- continue;
196
- }
197
- if (inImplementation) {
198
- if (line.trim().startsWith("**") && !line.startsWith("- [")) {
199
- break;
200
- }
201
- if (line.trim().startsWith("---")) {
202
- break;
203
- }
204
- if (line.trim().startsWith("###")) {
205
- break;
206
- }
207
- implementationLines.push(line);
208
- }
209
- }
210
- return implementationLines.length > 0 ? implementationLines : null;
211
- }
212
- function checkAllCheckboxesComplete(implementationLines) {
213
- const checkboxes = implementationLines.filter((line) => line.includes("- ["));
214
- if (checkboxes.length === 0) {
215
- return false;
216
- }
217
- const allComplete = checkboxes.every((line) => line.includes("- [x]"));
218
- const noneIncomplete = checkboxes.every((line) => !line.includes("- [ ]"));
219
- return allComplete && noneIncomplete;
220
- }
221
- function markTaskComplete(content, taskId) {
222
- let updated = content;
223
- const statusPattern = new RegExp(
224
- `(###\\s+${taskId.replace(/[-]/g, "\\-")}[^\\n]*[\\s\\S]*?\\*\\*Status\\*\\*:)\\s*\\[?\\s*\\]?\\s*\u23F3?\\s*Pending`,
225
- "i"
226
- );
227
- updated = updated.replace(statusPattern, "$1 [x] Completed");
228
- return updated;
229
- }
230
- function countTotalTasks(lines) {
231
- let count = 0;
232
- const taskPattern = /^###\s+(T-?\d+[-A-Z]*):?\s+/;
233
- for (const line of lines) {
234
- if (taskPattern.test(line)) {
235
- count++;
236
- }
237
- }
238
- return count;
239
- }
240
- function countCompletedTasks(lines) {
241
- let count = 0;
242
- const taskPattern = /^###\s+(T-?\d+[-A-Z]*):?\s+(.+)/;
243
- for (let i = 0; i < lines.length; i++) {
244
- const line = lines[i];
245
- const taskMatch = line.match(taskPattern);
246
- if (taskMatch) {
247
- const taskTitle = taskMatch[2];
248
- if (taskTitle.includes("\u2705 COMPLETE")) {
249
- count++;
250
- continue;
251
- }
252
- let found = false;
253
- for (let j = i + 1; j < Math.min(i + 10, lines.length); j++) {
254
- const nextLine = lines[j];
255
- if (nextLine.includes("**Status**:") && nextLine.includes("[x] Completed")) {
256
- count++;
257
- found = true;
258
- break;
259
- }
260
- }
261
- if (found) continue;
262
- const taskEndIndex = findNextTaskStart(lines, i + 1);
263
- const implementationSection = findImplementationSection(lines, i, taskEndIndex);
264
- if (implementationSection) {
265
- const allCheckboxesComplete = checkAllCheckboxesComplete(implementationSection);
266
- if (allCheckboxesComplete) {
267
- count++;
268
- }
269
- }
270
- }
271
- }
272
- return count;
273
- }
274
- function updateProgressHeader(content, completed, total, progress) {
275
- let updated = content;
276
- updated = updated.replace(/\*\*Completed\*\*:\s*\d+/, `**Completed**: ${completed}`);
277
- updated = updated.replace(/\*\*Progress\*\*:\s*\d+%/, `**Progress**: ${progress}%`);
278
- updated = updated.replace(/\*\*Total Tasks\*\*:\s*\d+/, `**Total Tasks**: ${total}`);
279
- return updated;
280
- }
281
- const isMainModule = import.meta.url === `file://${process.argv[1]}`;
282
- if (isMainModule) {
283
- const incrementId = process.argv[2];
284
- if (!incrementId) {
285
- console.error("\u274C Usage: update-tasks-md <incrementId>");
286
- console.error(" Example: update-tasks-md 0006-llm-native-i18n");
287
- process.exit(1);
288
- }
289
- updateTasksMd(incrementId).catch((error) => {
290
- console.error("\u274C Fatal error:", error);
291
- process.exit(1);
292
- });
293
- }
294
- export {
295
- updateTasksMd
296
- };