specweave 0.22.14 → 0.23.0
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.
- package/CLAUDE.md +178 -1
- package/dist/src/cli/commands/import-external.d.ts +22 -0
- package/dist/src/cli/commands/import-external.d.ts.map +1 -0
- package/dist/src/cli/commands/import-external.js +282 -0
- package/dist/src/cli/commands/import-external.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +46 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
- package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
- package/dist/src/cli/helpers/github-repo-selector.js +265 -0
- package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
- package/dist/src/config/types.d.ts +16 -16
- package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
- package/dist/src/core/increment/ac-status-manager.js +4 -2
- package/dist/src/core/increment/ac-status-manager.js.map +1 -1
- package/dist/src/core/increment/completion-validator.d.ts +30 -1
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +151 -3
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/increment/increment-archiver.d.ts +25 -0
- package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
- package/dist/src/core/increment/increment-archiver.js +130 -3
- package/dist/src/core/increment/increment-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +262 -18
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
- package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-id-manager.js +25 -0
- package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +46 -0
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
- package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
- package/dist/src/core/sync/sync-event-logger.js +39 -1
- package/dist/src/core/sync/sync-event-logger.js.map +1 -1
- package/dist/src/core/types/sync-config-validator.d.ts +57 -0
- package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
- package/dist/src/core/types/sync-config-validator.js +116 -0
- package/dist/src/core/types/sync-config-validator.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +107 -0
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
- package/dist/src/importers/duplicate-detector.js +189 -0
- package/dist/src/importers/duplicate-detector.js.map +1 -0
- package/dist/src/importers/import-coordinator.d.ts +15 -0
- package/dist/src/importers/import-coordinator.d.ts.map +1 -1
- package/dist/src/importers/import-coordinator.js +43 -1
- package/dist/src/importers/import-coordinator.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +5 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +27 -2
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/importers/rate-limiter.d.ts +128 -0
- package/dist/src/importers/rate-limiter.d.ts.map +1 -0
- package/dist/src/importers/rate-limiter.js +200 -0
- package/dist/src/importers/rate-limiter.js.map +1 -0
- package/dist/src/init/compliance/types.d.ts +2 -2
- package/dist/src/integrations/ado/ado-client.d.ts +6 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +23 -0
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/integrations/jira/jira-client.d.ts +6 -0
- package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
- package/dist/src/integrations/jira/jira-client.js +38 -0
- package/dist/src/integrations/jira/jira-client.js.map +1 -1
- package/dist/src/sync/external-item-sync-service.d.ts +150 -0
- package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
- package/dist/src/sync/external-item-sync-service.js +241 -0
- package/dist/src/sync/external-item-sync-service.js.map +1 -0
- package/dist/src/sync/format-preservation-sync.d.ts +90 -0
- package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
- package/dist/src/sync/format-preservation-sync.js +173 -0
- package/dist/src/sync/format-preservation-sync.js.map +1 -0
- package/dist/src/sync/index.d.ts +8 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +6 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/sync-coordinator.d.ts +49 -0
- package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
- package/dist/src/sync/sync-coordinator.js +248 -0
- package/dist/src/sync/sync-coordinator.js.map +1 -0
- package/dist/src/sync/sync-metadata.d.ts +75 -0
- package/dist/src/sync/sync-metadata.d.ts.map +1 -0
- package/dist/src/sync/sync-metadata.js +100 -0
- package/dist/src/sync/sync-metadata.js.map +1 -0
- package/dist/src/types/living-docs-us-file.d.ts +63 -0
- package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
- package/dist/src/types/living-docs-us-file.js +27 -0
- package/dist/src/types/living-docs-us-file.js.map +1 -0
- package/dist/src/validators/format-preservation-validator.d.ts +127 -0
- package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
- package/dist/src/validators/format-preservation-validator.js +187 -0
- package/dist/src/validators/format-preservation-validator.js.map +1 -0
- package/package.json +3 -2
- package/plugins/specweave/.claude-plugin/plugin.json +20 -0
- package/plugins/specweave/commands/specweave-archive-features.md +11 -1
- package/plugins/specweave/commands/specweave-import-docs.md +88 -278
- package/plugins/specweave/commands/specweave-import-external.md +407 -0
- package/plugins/specweave/hooks/post-edit-spec.sh +41 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +0 -0
- package/plugins/specweave/hooks/post-spec-update.sh +0 -0
- package/plugins/specweave/hooks/post-task-completion.sh +13 -3
- package/plugins/specweave/hooks/post-write-spec.sh +37 -0
- package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
- package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
- package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
- package/plugins/specweave/lib/hooks/sync-living-docs.js +35 -1
- package/plugins/specweave/lib/hooks/sync-us-tasks.js +179 -3
- package/plugins/specweave/lib/hooks/translate-file.js +1 -1
- package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
- package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
- package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
- package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
- package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
- package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
- package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
- package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
- package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
- package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
- package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
- package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
- package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
- package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
- package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
- package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +0 -5694
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import fs from 'fs-extra';
|
|
14
14
|
import path from 'path';
|
|
15
|
-
import { parseTasksWithUSLinks, getAllTasks } from '
|
|
15
|
+
import { parseTasksWithUSLinks, getAllTasks } from '../vendor/generators/spec/task-parser.js';
|
|
16
16
|
import { glob } from 'glob';
|
|
17
17
|
import { getCachedTasks, needsSync, recordSync, batchFileUpdates } from './sync-cache.js';
|
|
18
18
|
|
|
@@ -165,7 +165,14 @@ async function updateUSFile(usFilePath, tasks, incrementId) {
|
|
|
165
165
|
let content = await fs.readFile(usFilePath, 'utf-8');
|
|
166
166
|
let updated = false;
|
|
167
167
|
|
|
168
|
-
// 1. Update
|
|
168
|
+
// 1. Update origin badge (NEW - T-034)
|
|
169
|
+
const updatedOrigin = updateOriginBadge(content, usFilePath);
|
|
170
|
+
if (updatedOrigin !== content) {
|
|
171
|
+
content = updatedOrigin;
|
|
172
|
+
updated = true;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 2. Update task list section
|
|
169
176
|
const taskList = generateTaskList(tasks, incrementId);
|
|
170
177
|
const newTasksSection = `## Tasks\n\n${taskList}`;
|
|
171
178
|
|
|
@@ -181,7 +188,7 @@ async function updateUSFile(usFilePath, tasks, incrementId) {
|
|
|
181
188
|
}
|
|
182
189
|
}
|
|
183
190
|
|
|
184
|
-
//
|
|
191
|
+
// 3. Update AC checkboxes based on task completion
|
|
185
192
|
const updatedACs = updateACCheckboxes(content, tasks);
|
|
186
193
|
if (updatedACs !== content) {
|
|
187
194
|
content = updatedACs;
|
|
@@ -191,6 +198,175 @@ async function updateUSFile(usFilePath, tasks, incrementId) {
|
|
|
191
198
|
return { updated, content };
|
|
192
199
|
}
|
|
193
200
|
|
|
201
|
+
/**
|
|
202
|
+
* Update origin badge in User Story file
|
|
203
|
+
* Detects origin from US ID (E suffix = external)
|
|
204
|
+
*
|
|
205
|
+
* @param {string} content - US file content
|
|
206
|
+
* @param {string} usFilePath - Path to US file
|
|
207
|
+
* @returns {string} Updated content with origin badge
|
|
208
|
+
*/
|
|
209
|
+
function updateOriginBadge(content, usFilePath) {
|
|
210
|
+
// Extract US ID from filename (e.g., us-001e-title.md -> US-001E)
|
|
211
|
+
const filename = path.basename(usFilePath);
|
|
212
|
+
const usIdMatch = filename.match(/^(us-\d{3}e?)-/i);
|
|
213
|
+
|
|
214
|
+
if (!usIdMatch) {
|
|
215
|
+
return content; // Can't determine US ID, skip
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const usId = usIdMatch[1].toUpperCase();
|
|
219
|
+
const isExternal = usId.endsWith('E');
|
|
220
|
+
|
|
221
|
+
// Validate origin immutability (prevent internal ↔ external changes)
|
|
222
|
+
const existingOrigin = extractExistingOrigin(content);
|
|
223
|
+
if (existingOrigin) {
|
|
224
|
+
const existingIsExternal = existingOrigin !== 'internal';
|
|
225
|
+
if (isExternal !== existingIsExternal) {
|
|
226
|
+
console.log(` ⚠️ Origin immutable: Cannot change ${usId} from ${existingOrigin} to ${isExternal ? 'external' : 'internal'}`);
|
|
227
|
+
return content; // Don't modify origin
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Determine origin badge
|
|
232
|
+
let originBadge;
|
|
233
|
+
if (isExternal) {
|
|
234
|
+
// Try to detect external source from metadata
|
|
235
|
+
const externalSource = detectExternalSource(content);
|
|
236
|
+
originBadge = getExternalOriginBadge(externalSource, content);
|
|
237
|
+
} else {
|
|
238
|
+
originBadge = '🏠 **Internal**';
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Check if origin badge already exists
|
|
242
|
+
const originPattern = /\*\*Origin\*\*:\s*.*/;
|
|
243
|
+
if (originPattern.test(content)) {
|
|
244
|
+
// Replace existing origin badge
|
|
245
|
+
return content.replace(originPattern, `**Origin**: ${originBadge}`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Add origin badge after frontmatter (if exists) or at beginning
|
|
249
|
+
const frontmatterEnd = content.match(/^---\n.*?\n---\n/s);
|
|
250
|
+
if (frontmatterEnd) {
|
|
251
|
+
const insertPos = frontmatterEnd[0].length;
|
|
252
|
+
return content.slice(0, insertPos) + `\n**Origin**: ${originBadge}\n\n` + content.slice(insertPos);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// No frontmatter, add at beginning after title
|
|
256
|
+
const titleMatch = content.match(/^#\s+.+\n/);
|
|
257
|
+
if (titleMatch) {
|
|
258
|
+
const insertPos = titleMatch[0].length;
|
|
259
|
+
return content.slice(0, insertPos) + `\n**Origin**: ${originBadge}\n\n` + content.slice(insertPos);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Fallback: add at very beginning
|
|
263
|
+
return `**Origin**: ${originBadge}\n\n` + content;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Extract existing origin from content (for immutability validation)
|
|
268
|
+
*
|
|
269
|
+
* @param {string} content - US file content
|
|
270
|
+
* @returns {string|null} Existing origin (internal, github, jira, ado) or null
|
|
271
|
+
*/
|
|
272
|
+
function extractExistingOrigin(content) {
|
|
273
|
+
const originMatch = content.match(/\*\*Origin\*\*:\s*(.+)/);
|
|
274
|
+
if (!originMatch) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const originText = originMatch[1].toLowerCase();
|
|
279
|
+
if (originText.includes('internal')) {
|
|
280
|
+
return 'internal';
|
|
281
|
+
}
|
|
282
|
+
if (originText.includes('github')) {
|
|
283
|
+
return 'github';
|
|
284
|
+
}
|
|
285
|
+
if (originText.includes('jira')) {
|
|
286
|
+
return 'jira';
|
|
287
|
+
}
|
|
288
|
+
if (originText.includes('ado') || originText.includes('azure')) {
|
|
289
|
+
return 'ado';
|
|
290
|
+
}
|
|
291
|
+
if (originText.includes('external')) {
|
|
292
|
+
return 'external'; // Generic external
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Detect external source from content metadata
|
|
300
|
+
*
|
|
301
|
+
* @param {string} content - US file content
|
|
302
|
+
* @returns {string} External source (github, jira, ado) or 'unknown'
|
|
303
|
+
*/
|
|
304
|
+
function detectExternalSource(content) {
|
|
305
|
+
// Check frontmatter for external_source or externalSource
|
|
306
|
+
const frontmatterMatch = content.match(/^---\n(.*?)\n---/s);
|
|
307
|
+
if (frontmatterMatch) {
|
|
308
|
+
const frontmatter = frontmatterMatch[1];
|
|
309
|
+
if (frontmatter.includes('external_source: github') || frontmatter.includes('externalSource: github')) {
|
|
310
|
+
return 'github';
|
|
311
|
+
}
|
|
312
|
+
if (frontmatter.includes('external_source: jira') || frontmatter.includes('externalSource: jira')) {
|
|
313
|
+
return 'jira';
|
|
314
|
+
}
|
|
315
|
+
if (frontmatter.includes('external_source: ado') || frontmatter.includes('externalSource: ado')) {
|
|
316
|
+
return 'ado';
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Check for external ID patterns
|
|
321
|
+
if (content.includes('externalId: GH-') || content.includes('external_id: GH-')) {
|
|
322
|
+
return 'github';
|
|
323
|
+
}
|
|
324
|
+
if (content.includes('externalId: JIRA-') || content.includes('external_id: JIRA-')) {
|
|
325
|
+
return 'jira';
|
|
326
|
+
}
|
|
327
|
+
if (content.includes('externalId: ADO-') || content.includes('external_id: ADO-')) {
|
|
328
|
+
return 'ado';
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return 'unknown';
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Get external origin badge with link if available
|
|
336
|
+
*
|
|
337
|
+
* @param {string} source - External source (github, jira, ado)
|
|
338
|
+
* @param {string} content - US file content
|
|
339
|
+
* @returns {string} Origin badge markdown
|
|
340
|
+
*/
|
|
341
|
+
function getExternalOriginBadge(source, content) {
|
|
342
|
+
// Extract external ID and URL from content
|
|
343
|
+
const externalIdMatch = content.match(/external_?[iI]d:\s*([^\n]+)/);
|
|
344
|
+
const externalUrlMatch = content.match(/external_?[uU]rl:\s*([^\n]+)/);
|
|
345
|
+
|
|
346
|
+
const externalId = externalIdMatch ? externalIdMatch[1].trim() : null;
|
|
347
|
+
const externalUrl = externalUrlMatch ? externalUrlMatch[1].trim() : null;
|
|
348
|
+
|
|
349
|
+
switch (source) {
|
|
350
|
+
case 'github':
|
|
351
|
+
if (externalId && externalUrl) {
|
|
352
|
+
return `🔗 [GitHub ${externalId}](${externalUrl})`;
|
|
353
|
+
}
|
|
354
|
+
return '🔗 **GitHub**';
|
|
355
|
+
case 'jira':
|
|
356
|
+
if (externalId && externalUrl) {
|
|
357
|
+
return `🎫 [JIRA ${externalId}](${externalUrl})`;
|
|
358
|
+
}
|
|
359
|
+
return '🎫 **JIRA**';
|
|
360
|
+
case 'ado':
|
|
361
|
+
if (externalId && externalUrl) {
|
|
362
|
+
return `📋 [ADO ${externalId}](${externalUrl})`;
|
|
363
|
+
}
|
|
364
|
+
return '📋 **Azure DevOps**';
|
|
365
|
+
default:
|
|
366
|
+
return '🔗 **External**';
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
194
370
|
/**
|
|
195
371
|
* Generate task list markdown
|
|
196
372
|
*
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
validateTranslation,
|
|
7
7
|
getLanguageName,
|
|
8
8
|
formatCost
|
|
9
|
-
} from "
|
|
9
|
+
} from "../vendor/utils/translation.js";
|
|
10
10
|
async function translateFile(options) {
|
|
11
11
|
const { filePath, targetLang, preview, verbose } = options;
|
|
12
12
|
if (!await fs.pathExists(filePath)) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { ACStatusManager } from "
|
|
2
|
+
import { ACStatusManager } from "../vendor/core/increment/ac-status-manager.js";
|
|
3
3
|
async function updateACStatus(incrementId) {
|
|
4
4
|
try {
|
|
5
5
|
const projectRoot = process.cwd();
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* - spec.md: - [ ] AC-US1-02 → NO CHANGE (partial completion)
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import { ACStatusManager } from '
|
|
29
|
+
import { ACStatusManager } from '../vendor/core/increment/ac-status-manager.js';
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* Main entry point - uses ACStatusManager for sophisticated sync
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the completion status of an Acceptance Criteria
|
|
3
|
+
*/
|
|
4
|
+
export interface ACCompletionStatus {
|
|
5
|
+
acId: string;
|
|
6
|
+
totalTasks: number;
|
|
7
|
+
completedTasks: number;
|
|
8
|
+
percentage: number;
|
|
9
|
+
isComplete: boolean;
|
|
10
|
+
tasks: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Represents an Acceptance Criteria definition in spec.md
|
|
14
|
+
*/
|
|
15
|
+
export interface ACDefinition {
|
|
16
|
+
acId: string;
|
|
17
|
+
description: string;
|
|
18
|
+
checked: boolean;
|
|
19
|
+
lineNumber: number;
|
|
20
|
+
fullLine: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of syncing AC status
|
|
24
|
+
*/
|
|
25
|
+
export interface ACSyncResult {
|
|
26
|
+
synced: boolean;
|
|
27
|
+
updated: string[];
|
|
28
|
+
conflicts: string[];
|
|
29
|
+
warnings: string[];
|
|
30
|
+
changes: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validation result for AC-task mapping
|
|
34
|
+
*/
|
|
35
|
+
export interface ValidationResult {
|
|
36
|
+
valid: boolean;
|
|
37
|
+
orphanedACs: string[];
|
|
38
|
+
invalidReferences: string[];
|
|
39
|
+
errors: string[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* AC sync event for metadata logging
|
|
43
|
+
*/
|
|
44
|
+
export interface ACSyncEvent {
|
|
45
|
+
timestamp: string;
|
|
46
|
+
updated: string[];
|
|
47
|
+
conflicts: string[];
|
|
48
|
+
warnings: string[];
|
|
49
|
+
changesCount: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* AC completion summary
|
|
53
|
+
*/
|
|
54
|
+
export interface ACCompletionSummary {
|
|
55
|
+
totalACs: number;
|
|
56
|
+
completeACs: number;
|
|
57
|
+
incompleteACs: number;
|
|
58
|
+
percentage: number;
|
|
59
|
+
acStatuses: Map<string, ACCompletionStatus>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* ACStatusManager: Automatically sync spec.md AC checkboxes with tasks.md completion status
|
|
63
|
+
*/
|
|
64
|
+
export declare class ACStatusManager {
|
|
65
|
+
private rootPath;
|
|
66
|
+
constructor(rootPath: string);
|
|
67
|
+
/**
|
|
68
|
+
* Parse tasks.md and extract AC completion status
|
|
69
|
+
*
|
|
70
|
+
* @param tasksContent - Content of tasks.md file
|
|
71
|
+
* @returns Map of AC-ID to ACCompletionStatus
|
|
72
|
+
*/
|
|
73
|
+
parseTasksForACStatus(tasksContent: string): Map<string, ACCompletionStatus>;
|
|
74
|
+
/**
|
|
75
|
+
* Helper method to add a task to the AC map
|
|
76
|
+
*/
|
|
77
|
+
private addTaskToACMap;
|
|
78
|
+
/**
|
|
79
|
+
* Parse spec.md and extract AC checkboxes
|
|
80
|
+
*
|
|
81
|
+
* @param specContent - Content of spec.md file
|
|
82
|
+
* @returns Map of AC-ID to ACDefinition
|
|
83
|
+
*/
|
|
84
|
+
parseSpecForACs(specContent: string): Map<string, ACDefinition>;
|
|
85
|
+
/**
|
|
86
|
+
* Sync AC status from tasks.md to spec.md
|
|
87
|
+
*
|
|
88
|
+
* @param incrementId - Increment ID (e.g., "0039")
|
|
89
|
+
* @returns Result of sync operation
|
|
90
|
+
*/
|
|
91
|
+
syncACStatus(incrementId: string): Promise<ACSyncResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Log AC sync event to metadata.json
|
|
94
|
+
* Keeps last 20 events for audit trail
|
|
95
|
+
*
|
|
96
|
+
* @param incrementId - Increment ID
|
|
97
|
+
* @param result - Sync result to log
|
|
98
|
+
*/
|
|
99
|
+
private logSyncEvent;
|
|
100
|
+
/**
|
|
101
|
+
* Validate AC-task mapping
|
|
102
|
+
*
|
|
103
|
+
* @param incrementId - Increment ID
|
|
104
|
+
* @returns Validation result
|
|
105
|
+
*/
|
|
106
|
+
validateACMapping(incrementId: string): ValidationResult;
|
|
107
|
+
/**
|
|
108
|
+
* Get AC completion summary
|
|
109
|
+
*
|
|
110
|
+
* @param incrementId - Increment ID
|
|
111
|
+
* @returns Summary of AC completion status
|
|
112
|
+
*/
|
|
113
|
+
getACCompletionSummary(incrementId: string): ACCompletionSummary;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=ac-status-manager.d.ts.map
|