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.
Files changed (150) hide show
  1. package/CLAUDE.md +178 -1
  2. package/dist/src/cli/commands/import-external.d.ts +22 -0
  3. package/dist/src/cli/commands/import-external.d.ts.map +1 -0
  4. package/dist/src/cli/commands/import-external.js +282 -0
  5. package/dist/src/cli/commands/import-external.js.map +1 -0
  6. package/dist/src/cli/commands/init.d.ts.map +1 -1
  7. package/dist/src/cli/commands/init.js +46 -0
  8. package/dist/src/cli/commands/init.js.map +1 -1
  9. package/dist/src/cli/helpers/github-repo-selector.d.ts +59 -0
  10. package/dist/src/cli/helpers/github-repo-selector.d.ts.map +1 -0
  11. package/dist/src/cli/helpers/github-repo-selector.js +265 -0
  12. package/dist/src/cli/helpers/github-repo-selector.js.map +1 -0
  13. package/dist/src/config/types.d.ts +16 -16
  14. package/dist/src/core/increment/ac-status-manager.d.ts.map +1 -1
  15. package/dist/src/core/increment/ac-status-manager.js +4 -2
  16. package/dist/src/core/increment/ac-status-manager.js.map +1 -1
  17. package/dist/src/core/increment/completion-validator.d.ts +30 -1
  18. package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
  19. package/dist/src/core/increment/completion-validator.js +151 -3
  20. package/dist/src/core/increment/completion-validator.js.map +1 -1
  21. package/dist/src/core/increment/increment-archiver.d.ts +25 -0
  22. package/dist/src/core/increment/increment-archiver.d.ts.map +1 -1
  23. package/dist/src/core/increment/increment-archiver.js +130 -3
  24. package/dist/src/core/increment/increment-archiver.js.map +1 -1
  25. package/dist/src/core/living-docs/feature-archiver.d.ts +37 -0
  26. package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
  27. package/dist/src/core/living-docs/feature-archiver.js +262 -18
  28. package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
  29. package/dist/src/core/living-docs/feature-id-manager.d.ts +17 -0
  30. package/dist/src/core/living-docs/feature-id-manager.d.ts.map +1 -1
  31. package/dist/src/core/living-docs/feature-id-manager.js +25 -0
  32. package/dist/src/core/living-docs/feature-id-manager.js.map +1 -1
  33. package/dist/src/core/living-docs/living-docs-sync.d.ts +14 -0
  34. package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
  35. package/dist/src/core/living-docs/living-docs-sync.js +46 -0
  36. package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
  37. package/dist/src/core/sync/sync-event-logger.d.ts +15 -1
  38. package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -1
  39. package/dist/src/core/sync/sync-event-logger.js +39 -1
  40. package/dist/src/core/sync/sync-event-logger.js.map +1 -1
  41. package/dist/src/core/types/sync-config-validator.d.ts +57 -0
  42. package/dist/src/core/types/sync-config-validator.d.ts.map +1 -0
  43. package/dist/src/core/types/sync-config-validator.js +116 -0
  44. package/dist/src/core/types/sync-config-validator.js.map +1 -0
  45. package/dist/src/importers/duplicate-detector.d.ts +107 -0
  46. package/dist/src/importers/duplicate-detector.d.ts.map +1 -0
  47. package/dist/src/importers/duplicate-detector.js +189 -0
  48. package/dist/src/importers/duplicate-detector.js.map +1 -0
  49. package/dist/src/importers/import-coordinator.d.ts +15 -0
  50. package/dist/src/importers/import-coordinator.d.ts.map +1 -1
  51. package/dist/src/importers/import-coordinator.js +43 -1
  52. package/dist/src/importers/import-coordinator.js.map +1 -1
  53. package/dist/src/importers/item-converter.d.ts +5 -0
  54. package/dist/src/importers/item-converter.d.ts.map +1 -1
  55. package/dist/src/importers/item-converter.js +27 -2
  56. package/dist/src/importers/item-converter.js.map +1 -1
  57. package/dist/src/importers/rate-limiter.d.ts +128 -0
  58. package/dist/src/importers/rate-limiter.d.ts.map +1 -0
  59. package/dist/src/importers/rate-limiter.js +200 -0
  60. package/dist/src/importers/rate-limiter.js.map +1 -0
  61. package/dist/src/init/compliance/types.d.ts +2 -2
  62. package/dist/src/integrations/ado/ado-client.d.ts +6 -0
  63. package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
  64. package/dist/src/integrations/ado/ado-client.js +23 -0
  65. package/dist/src/integrations/ado/ado-client.js.map +1 -1
  66. package/dist/src/integrations/jira/jira-client.d.ts +6 -0
  67. package/dist/src/integrations/jira/jira-client.d.ts.map +1 -1
  68. package/dist/src/integrations/jira/jira-client.js +38 -0
  69. package/dist/src/integrations/jira/jira-client.js.map +1 -1
  70. package/dist/src/sync/external-item-sync-service.d.ts +150 -0
  71. package/dist/src/sync/external-item-sync-service.d.ts.map +1 -0
  72. package/dist/src/sync/external-item-sync-service.js +241 -0
  73. package/dist/src/sync/external-item-sync-service.js.map +1 -0
  74. package/dist/src/sync/format-preservation-sync.d.ts +90 -0
  75. package/dist/src/sync/format-preservation-sync.d.ts.map +1 -0
  76. package/dist/src/sync/format-preservation-sync.js +173 -0
  77. package/dist/src/sync/format-preservation-sync.js.map +1 -0
  78. package/dist/src/sync/index.d.ts +8 -0
  79. package/dist/src/sync/index.d.ts.map +1 -0
  80. package/dist/src/sync/index.js +6 -0
  81. package/dist/src/sync/index.js.map +1 -0
  82. package/dist/src/sync/sync-coordinator.d.ts +49 -0
  83. package/dist/src/sync/sync-coordinator.d.ts.map +1 -0
  84. package/dist/src/sync/sync-coordinator.js +248 -0
  85. package/dist/src/sync/sync-coordinator.js.map +1 -0
  86. package/dist/src/sync/sync-metadata.d.ts +75 -0
  87. package/dist/src/sync/sync-metadata.d.ts.map +1 -0
  88. package/dist/src/sync/sync-metadata.js +100 -0
  89. package/dist/src/sync/sync-metadata.js.map +1 -0
  90. package/dist/src/types/living-docs-us-file.d.ts +63 -0
  91. package/dist/src/types/living-docs-us-file.d.ts.map +1 -0
  92. package/dist/src/types/living-docs-us-file.js +27 -0
  93. package/dist/src/types/living-docs-us-file.js.map +1 -0
  94. package/dist/src/validators/format-preservation-validator.d.ts +127 -0
  95. package/dist/src/validators/format-preservation-validator.d.ts.map +1 -0
  96. package/dist/src/validators/format-preservation-validator.js +187 -0
  97. package/dist/src/validators/format-preservation-validator.js.map +1 -0
  98. package/package.json +3 -2
  99. package/plugins/specweave/.claude-plugin/plugin.json +20 -0
  100. package/plugins/specweave/commands/specweave-archive-features.md +11 -1
  101. package/plugins/specweave/commands/specweave-import-docs.md +88 -278
  102. package/plugins/specweave/commands/specweave-import-external.md +407 -0
  103. package/plugins/specweave/hooks/post-edit-spec.sh +41 -0
  104. package/plugins/specweave/hooks/post-increment-completion.sh +0 -0
  105. package/plugins/specweave/hooks/post-spec-update.sh +0 -0
  106. package/plugins/specweave/hooks/post-task-completion.sh +13 -3
  107. package/plugins/specweave/hooks/post-write-spec.sh +37 -0
  108. package/plugins/specweave/lib/hooks/auto-transition.js +1 -1
  109. package/plugins/specweave/lib/hooks/auto-transition.ts +1 -1
  110. package/plugins/specweave/lib/hooks/invoke-translator-skill.js +1 -1
  111. package/plugins/specweave/lib/hooks/invoke-translator-skill.ts +1 -1
  112. package/plugins/specweave/lib/hooks/sync-living-docs.js +35 -1
  113. package/plugins/specweave/lib/hooks/sync-us-tasks.js +179 -3
  114. package/plugins/specweave/lib/hooks/translate-file.js +1 -1
  115. package/plugins/specweave/lib/hooks/translate-file.ts +1 -1
  116. package/plugins/specweave/lib/hooks/update-ac-status.js +1 -1
  117. package/plugins/specweave/lib/hooks/update-ac-status.ts +1 -1
  118. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
  119. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +345 -0
  120. package/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
  121. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +106 -0
  122. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +220 -0
  123. package/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
  124. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +60 -0
  125. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +192 -0
  126. package/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
  127. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
  128. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +276 -0
  129. package/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
  130. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +163 -0
  131. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +541 -0
  132. package/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
  133. package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +157 -0
  134. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js +191 -0
  135. package/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
  136. package/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
  137. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js +301 -0
  138. package/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
  139. package/plugins/specweave/lib/vendor/utils/logger.d.ts +48 -0
  140. package/plugins/specweave/lib/vendor/utils/logger.js +53 -0
  141. package/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
  142. package/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
  143. package/plugins/specweave/lib/vendor/utils/translation.js +414 -0
  144. package/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
  145. package/plugins/specweave-ado/lib/ado-multi-project-sync.js +0 -1
  146. package/plugins/specweave-github/commands/specweave-github-update-user-story.md +1 -1
  147. package/plugins/specweave-github/skills/github-issue-standard/SKILL.md +1 -1
  148. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +3 -3
  149. package/plugins/specweave-ado/lib/enhanced-ado-sync.js +0 -170
  150. 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 '../../../../dist/src/generators/spec/task-parser.js';
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 task list section
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
- // 2. Update AC checkboxes based on task completion
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 "../../../../dist/src/utils/translation.js";
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)) {
@@ -26,7 +26,7 @@ import {
26
26
  getLanguageName,
27
27
  formatCost,
28
28
  type SupportedLanguage,
29
- } from '../../../../dist/src/utils/translation.js';
29
+ } from '../vendor/utils/translation.js';
30
30
 
31
31
  /**
32
32
  * CLI options
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { ACStatusManager } from "../../../../dist/src/core/increment/ac-status-manager.js";
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 '../../../../dist/src/core/increment/ac-status-manager.js';
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