specweave 0.29.0 → 0.29.1

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 (87) hide show
  1. package/package.json +3 -1
  2. package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +12 -0
  3. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +18 -0
  4. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +0 -26
  5. package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +0 -1
  6. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +0 -249
  7. package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +0 -1
  8. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +0 -28
  9. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +0 -1
  10. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -156
  11. package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +0 -1
  12. package/dist/src/core/sync/bidirectional-engine.d.ts +0 -119
  13. package/dist/src/core/sync/bidirectional-engine.d.ts.map +0 -1
  14. package/dist/src/core/sync/bidirectional-engine.js +0 -359
  15. package/dist/src/core/sync/bidirectional-engine.js.map +0 -1
  16. package/dist/src/core/sync/conflict-resolver.d.ts +0 -66
  17. package/dist/src/core/sync/conflict-resolver.d.ts.map +0 -1
  18. package/dist/src/core/sync/conflict-resolver.js +0 -108
  19. package/dist/src/core/sync/conflict-resolver.js.map +0 -1
  20. package/dist/src/core/sync/enhanced-content-builder.d.ts +0 -55
  21. package/dist/src/core/sync/enhanced-content-builder.d.ts.map +0 -1
  22. package/dist/src/core/sync/enhanced-content-builder.js +0 -203
  23. package/dist/src/core/sync/enhanced-content-builder.js.map +0 -1
  24. package/dist/src/core/sync/folder-mapper.d.ts +0 -71
  25. package/dist/src/core/sync/folder-mapper.d.ts.map +0 -1
  26. package/dist/src/core/sync/folder-mapper.js +0 -203
  27. package/dist/src/core/sync/folder-mapper.js.map +0 -1
  28. package/dist/src/core/sync/label-detector.d.ts +0 -66
  29. package/dist/src/core/sync/label-detector.d.ts.map +0 -1
  30. package/dist/src/core/sync/label-detector.js +0 -224
  31. package/dist/src/core/sync/label-detector.js.map +0 -1
  32. package/dist/src/core/sync/performance-optimizer.d.ts +0 -153
  33. package/dist/src/core/sync/performance-optimizer.d.ts.map +0 -1
  34. package/dist/src/core/sync/performance-optimizer.js +0 -220
  35. package/dist/src/core/sync/performance-optimizer.js.map +0 -1
  36. package/dist/src/core/sync/profile-selector.d.ts +0 -52
  37. package/dist/src/core/sync/profile-selector.d.ts.map +0 -1
  38. package/dist/src/core/sync/profile-selector.js +0 -179
  39. package/dist/src/core/sync/profile-selector.js.map +0 -1
  40. package/dist/src/core/sync/profile-validator.d.ts +0 -52
  41. package/dist/src/core/sync/profile-validator.d.ts.map +0 -1
  42. package/dist/src/core/sync/profile-validator.js +0 -170
  43. package/dist/src/core/sync/profile-validator.js.map +0 -1
  44. package/dist/src/core/sync/rate-limiter.d.ts +0 -116
  45. package/dist/src/core/sync/rate-limiter.d.ts.map +0 -1
  46. package/dist/src/core/sync/rate-limiter.js +0 -308
  47. package/dist/src/core/sync/rate-limiter.js.map +0 -1
  48. package/dist/src/core/sync/retry-handler.d.ts +0 -98
  49. package/dist/src/core/sync/retry-handler.d.ts.map +0 -1
  50. package/dist/src/core/sync/retry-handler.js +0 -196
  51. package/dist/src/core/sync/retry-handler.js.map +0 -1
  52. package/dist/src/core/sync/retry-logic.d.ts +0 -64
  53. package/dist/src/core/sync/retry-logic.d.ts.map +0 -1
  54. package/dist/src/core/sync/retry-logic.js +0 -165
  55. package/dist/src/core/sync/retry-logic.js.map +0 -1
  56. package/dist/src/core/sync/status-cache.d.ts +0 -91
  57. package/dist/src/core/sync/status-cache.d.ts.map +0 -1
  58. package/dist/src/core/sync/status-cache.js +0 -140
  59. package/dist/src/core/sync/status-cache.js.map +0 -1
  60. package/dist/src/core/sync/status-mapper.d.ts +0 -69
  61. package/dist/src/core/sync/status-mapper.d.ts.map +0 -1
  62. package/dist/src/core/sync/status-mapper.js +0 -90
  63. package/dist/src/core/sync/status-mapper.js.map +0 -1
  64. package/dist/src/core/sync/status-sync-engine.d.ts +0 -162
  65. package/dist/src/core/sync/status-sync-engine.d.ts.map +0 -1
  66. package/dist/src/core/sync/status-sync-engine.js +0 -347
  67. package/dist/src/core/sync/status-sync-engine.js.map +0 -1
  68. package/dist/src/core/sync/sync-event-logger.d.ts +0 -113
  69. package/dist/src/core/sync/sync-event-logger.d.ts.map +0 -1
  70. package/dist/src/core/sync/sync-event-logger.js +0 -141
  71. package/dist/src/core/sync/sync-event-logger.js.map +0 -1
  72. package/dist/src/core/sync/time-range-selector.d.ts +0 -48
  73. package/dist/src/core/sync/time-range-selector.d.ts.map +0 -1
  74. package/dist/src/core/sync/time-range-selector.js +0 -224
  75. package/dist/src/core/sync/time-range-selector.js.map +0 -1
  76. package/dist/src/core/sync/types.d.ts +0 -52
  77. package/dist/src/core/sync/types.d.ts.map +0 -1
  78. package/dist/src/core/sync/types.js +0 -5
  79. package/dist/src/core/sync/types.js.map +0 -1
  80. package/dist/src/core/sync/workflow-detector.d.ts +0 -95
  81. package/dist/src/core/sync/workflow-detector.d.ts.map +0 -1
  82. package/dist/src/core/sync/workflow-detector.js +0 -175
  83. package/dist/src/core/sync/workflow-detector.js.map +0 -1
  84. package/plugins/specweave-github/lib/enhanced-github-sync.js +0 -220
  85. package/plugins/specweave-github/lib/enhanced-github-sync.ts +0 -322
  86. package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -134
  87. package/plugins/specweave-jira/lib/enhanced-jira-sync.ts +0 -196
@@ -1,119 +0,0 @@
1
- /**
2
- * Bidirectional Sync Engine
3
- *
4
- * @deprecated This module is deprecated as of v0.24.0 (Three-Permission Architecture).
5
- * The "bidirectional" and "three-permission sync" terminology has been replaced with granular permission controls:
6
- * - canUpsertInternalItems: CREATE + UPDATE internal items
7
- * - canUpdateExternalItems: UPDATE external items (full content)
8
- * - canUpdateStatus: UPDATE status (both types)
9
- *
10
- * This file is kept for backward compatibility but is no longer actively maintained.
11
- * See: .specweave/increments/0047-us-task-linkage/reports/THREE-PERMISSION-ARCHITECTURE-CHANGES.md
12
- *
13
- * Handles synchronization between SpecWeave increments and external systems
14
- * (GitHub, Jira, ADO) in both directions with conflict detection and resolution.
15
- *
16
- * Features:
17
- * - Three-permission sync (to-external, from-external, both)
18
- * - Conflict detection (field-level granularity)
19
- * - Interactive conflict resolution
20
- * - Change tracking (detect what changed since last sync)
21
- * - Reorganization detection (moved issues, split/merged stories)
22
- */
23
- import { SyncProvider } from '../types/sync-profile.js';
24
- export type SyncDirection = 'to-external' | 'from-external' | 'bidirectional';
25
- export type ConflictResolution = 'prefer-local' | 'prefer-external' | 'manual' | 'prompt';
26
- export interface SyncState {
27
- /** Increment metadata */
28
- incrementId: string;
29
- title: string;
30
- status: string;
31
- /** External metadata */
32
- externalId?: string;
33
- externalKey?: string;
34
- externalUrl?: string;
35
- /** Sync state */
36
- lastSyncAt?: string;
37
- lastLocalChange?: string;
38
- lastExternalChange?: string;
39
- /** Content hashes (for change detection) */
40
- localHash?: string;
41
- externalHash?: string;
42
- /** Linked items (user stories, tasks, etc.) */
43
- linkedItems?: Record<string, string>;
44
- }
45
- export interface FieldChange {
46
- field: string;
47
- localValue: any;
48
- externalValue: any;
49
- lastSyncValue?: any;
50
- }
51
- export interface Conflict extends FieldChange {
52
- resolution?: 'local' | 'external' | 'merged';
53
- mergedValue?: any;
54
- }
55
- export interface ChangeSet {
56
- /** Changes to sync to external */
57
- toExternal: FieldChange[];
58
- /** Changes to sync from external */
59
- fromExternal: FieldChange[];
60
- /** Conflicts (both sides changed) */
61
- conflicts: Conflict[];
62
- }
63
- export interface SyncResult {
64
- success: boolean;
65
- direction: SyncDirection;
66
- changes: ChangeSet;
67
- conflictsResolved: number;
68
- errors: string[];
69
- }
70
- export declare class BidirectionalSyncEngine {
71
- private provider;
72
- private projectRoot;
73
- constructor(provider: SyncProvider, projectRoot?: string);
74
- /**
75
- * Main sync orchestrator
76
- */
77
- sync(incrementId: string, direction: SyncDirection, conflictResolution?: ConflictResolution): Promise<SyncResult>;
78
- /**
79
- * Detect changes in both local and external state
80
- */
81
- private detectChanges;
82
- /**
83
- * Fetch local state from increment files
84
- */
85
- private fetchLocalState;
86
- /**
87
- * Fetch external state from Jira/GitHub/ADO
88
- */
89
- private fetchExternalState;
90
- /**
91
- * Resolve conflicts interactively or automatically
92
- */
93
- private resolveConflicts;
94
- /**
95
- * Interactive conflict resolution prompt
96
- */
97
- private promptConflictResolution;
98
- /**
99
- * Apply changes to external system
100
- */
101
- private applyToExternal;
102
- /**
103
- * Apply changes to local increment
104
- */
105
- private applyToLocal;
106
- /**
107
- * Load sync state from metadata
108
- */
109
- private loadSyncState;
110
- /**
111
- * Update sync state in metadata
112
- */
113
- private updateSyncState;
114
- /**
115
- * Print sync summary
116
- */
117
- private printSyncSummary;
118
- }
119
- //# sourceMappingURL=bidirectional-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bidirectional-engine.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/bidirectional-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1F,MAAM,WAAW,SAAS;IACxB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAEf,wBAAwB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,iBAAiB;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,GAAG,CAAC;IAChB,aAAa,EAAE,GAAG,CAAC;IACnB,aAAa,CAAC,EAAE,GAAG,CAAC;CACrB;AAED,MAAM,WAAW,QAAS,SAAQ,WAAW;IAC3C,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC7C,WAAW,CAAC,EAAE,GAAG,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,kCAAkC;IAClC,UAAU,EAAE,WAAW,EAAE,CAAC;IAE1B,oCAAoC;IACpC,YAAY,EAAE,WAAW,EAAE,CAAC;IAE5B,qCAAqC;IACrC,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,SAAS,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;gBADX,QAAQ,EAAE,YAAY,EACtB,WAAW,GAAE,MAAsB;IAG7C;;OAEG;IACG,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,aAAa,EACxB,kBAAkB,GAAE,kBAA6B,GAChD,OAAO,CAAC,UAAU,CAAC;IA2FtB;;OAEG;YACW,aAAa;IAuD3B;;OAEG;YACW,eAAe;IA0B7B;;OAEG;YACW,kBAAkB;IAuBhC;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;YACW,wBAAwB;IAyCtC;;OAEG;YACW,eAAe;IAW7B;;OAEG;YACW,YAAY;IA2C1B;;OAEG;YACW,aAAa;IA6B3B;;OAEG;YACW,eAAe;IAmC7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB"}
@@ -1,359 +0,0 @@
1
- /**
2
- * Bidirectional Sync Engine
3
- *
4
- * @deprecated This module is deprecated as of v0.24.0 (Three-Permission Architecture).
5
- * The "bidirectional" and "three-permission sync" terminology has been replaced with granular permission controls:
6
- * - canUpsertInternalItems: CREATE + UPDATE internal items
7
- * - canUpdateExternalItems: UPDATE external items (full content)
8
- * - canUpdateStatus: UPDATE status (both types)
9
- *
10
- * This file is kept for backward compatibility but is no longer actively maintained.
11
- * See: .specweave/increments/0047-us-task-linkage/reports/THREE-PERMISSION-ARCHITECTURE-CHANGES.md
12
- *
13
- * Handles synchronization between SpecWeave increments and external systems
14
- * (GitHub, Jira, ADO) in both directions with conflict detection and resolution.
15
- *
16
- * Features:
17
- * - Three-permission sync (to-external, from-external, both)
18
- * - Conflict detection (field-level granularity)
19
- * - Interactive conflict resolution
20
- * - Change tracking (detect what changed since last sync)
21
- * - Reorganization detection (moved issues, split/merged stories)
22
- */
23
- import * as fs from '../../utils/fs-native.js';
24
- import * as path from 'path';
25
- import { select, input } from '@inquirer/prompts';
26
- // ============================================================================
27
- // Bidirectional Sync Engine
28
- // ============================================================================
29
- export class BidirectionalSyncEngine {
30
- constructor(provider, projectRoot = process.cwd()) {
31
- this.provider = provider;
32
- this.projectRoot = projectRoot;
33
- }
34
- /**
35
- * Main sync orchestrator
36
- */
37
- async sync(incrementId, direction, conflictResolution = 'prompt') {
38
- console.log(`\n🔄 Starting ${direction} sync for increment ${incrementId}...\n`);
39
- const result = {
40
- success: false,
41
- direction,
42
- changes: { toExternal: [], fromExternal: [], conflicts: [] },
43
- conflictsResolved: 0,
44
- errors: [],
45
- };
46
- try {
47
- // Step 1: Load current state
48
- const currentState = await this.loadSyncState(incrementId);
49
- // Step 2: Detect changes
50
- const changes = await this.detectChanges(incrementId, currentState);
51
- result.changes = changes;
52
- // Step 3: Handle conflicts (if bidirectional)
53
- if (direction === 'bidirectional' && changes.conflicts.length > 0) {
54
- console.log(`\n⚠️ Detected ${changes.conflicts.length} conflicts\n`);
55
- const resolved = await this.resolveConflicts(changes.conflicts, conflictResolution);
56
- result.conflictsResolved = resolved.length;
57
- // Apply resolutions
58
- for (const conflict of resolved) {
59
- if (conflict.resolution === 'local') {
60
- changes.toExternal.push(conflict);
61
- }
62
- else if (conflict.resolution === 'external') {
63
- changes.fromExternal.push(conflict);
64
- }
65
- else if (conflict.resolution === 'merged' && conflict.mergedValue !== undefined) {
66
- // Apply merged value to both sides
67
- changes.toExternal.push({
68
- ...conflict,
69
- localValue: conflict.mergedValue,
70
- });
71
- changes.fromExternal.push({
72
- ...conflict,
73
- externalValue: conflict.mergedValue,
74
- });
75
- }
76
- }
77
- }
78
- // Step 4: Apply changes based on direction
79
- if (direction === 'to-external' || direction === 'bidirectional') {
80
- if (changes.toExternal.length > 0) {
81
- console.log(`\n📤 Syncing ${changes.toExternal.length} changes to ${this.provider}...`);
82
- await this.applyToExternal(incrementId, changes.toExternal);
83
- }
84
- }
85
- if (direction === 'from-external' || direction === 'bidirectional') {
86
- if (changes.fromExternal.length > 0) {
87
- console.log(`\n📥 Syncing ${changes.fromExternal.length} changes from ${this.provider}...`);
88
- await this.applyToLocal(incrementId, changes.fromExternal);
89
- }
90
- }
91
- // Step 5: Update sync state
92
- await this.updateSyncState(incrementId, {
93
- ...currentState,
94
- lastSyncAt: new Date().toISOString(),
95
- lastLocalChange: new Date().toISOString(),
96
- lastExternalChange: new Date().toISOString(),
97
- });
98
- result.success = true;
99
- console.log(`\n✅ Sync complete!\n`);
100
- this.printSyncSummary(result);
101
- return result;
102
- }
103
- catch (error) {
104
- result.success = false;
105
- result.errors.push(error.message);
106
- console.error(`\n❌ Sync failed:`, error.message);
107
- return result;
108
- }
109
- }
110
- // ==========================================================================
111
- // Change Detection
112
- // ==========================================================================
113
- /**
114
- * Detect changes in both local and external state
115
- */
116
- async detectChanges(incrementId, currentState) {
117
- const localState = await this.fetchLocalState(incrementId);
118
- const externalState = await this.fetchExternalState(incrementId, currentState);
119
- const toExternal = [];
120
- const fromExternal = [];
121
- const conflicts = [];
122
- // Compare common fields
123
- const fields = ['title', 'description', 'status', 'priority', 'assignee'];
124
- for (const field of fields) {
125
- const localValue = localState[field];
126
- const externalValue = externalState[field];
127
- const lastSyncValue = currentState.lastSyncAt
128
- ? currentState[field]
129
- : undefined;
130
- // Detect changes
131
- const localChanged = localValue !== lastSyncValue;
132
- const externalChanged = externalValue !== lastSyncValue;
133
- if (localChanged && externalChanged && localValue !== externalValue) {
134
- // CONFLICT: Both changed to different values
135
- conflicts.push({
136
- field,
137
- localValue,
138
- externalValue,
139
- lastSyncValue,
140
- });
141
- }
142
- else if (localChanged) {
143
- // Local changed, external didn't
144
- toExternal.push({
145
- field,
146
- localValue,
147
- externalValue,
148
- lastSyncValue,
149
- });
150
- }
151
- else if (externalChanged) {
152
- // External changed, local didn't
153
- fromExternal.push({
154
- field,
155
- localValue,
156
- externalValue,
157
- lastSyncValue,
158
- });
159
- }
160
- }
161
- return { toExternal, fromExternal, conflicts };
162
- }
163
- /**
164
- * Fetch local state from increment files
165
- */
166
- async fetchLocalState(incrementId) {
167
- const incrementPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
168
- // Read spec.md
169
- const specPath = path.join(incrementPath, 'spec.md');
170
- const specContent = await fs.readFile(specPath, 'utf-8');
171
- // Parse frontmatter and content
172
- const titleMatch = specContent.match(/^#\s+(.+)$/m);
173
- const statusMatch = specContent.match(/Status:\s*(.+)$/m);
174
- const priorityMatch = specContent.match(/Priority:\s*(.+)$/m);
175
- return {
176
- title: titleMatch ? titleMatch[1] : '',
177
- description: specContent.substring(0, 500), // First 500 chars
178
- status: statusMatch ? statusMatch[1].trim() : 'in-progress',
179
- priority: priorityMatch ? priorityMatch[1].trim() : 'medium',
180
- assignee: null,
181
- };
182
- }
183
- /**
184
- * Fetch external state from Jira/GitHub/ADO
185
- */
186
- async fetchExternalState(incrementId, currentState) {
187
- if (!currentState.externalKey) {
188
- return {}; // No external issue yet
189
- }
190
- // This will be implemented by provider-specific adapters
191
- // For now, return placeholder
192
- return {
193
- title: '',
194
- description: '',
195
- status: '',
196
- priority: '',
197
- assignee: null,
198
- };
199
- }
200
- // ==========================================================================
201
- // Conflict Resolution
202
- // ==========================================================================
203
- /**
204
- * Resolve conflicts interactively or automatically
205
- */
206
- async resolveConflicts(conflicts, strategy) {
207
- const resolved = [];
208
- for (const conflict of conflicts) {
209
- if (strategy === 'prefer-local') {
210
- conflict.resolution = 'local';
211
- }
212
- else if (strategy === 'prefer-external') {
213
- conflict.resolution = 'external';
214
- }
215
- else if (strategy === 'manual' || strategy === 'prompt') {
216
- await this.promptConflictResolution(conflict);
217
- }
218
- resolved.push(conflict);
219
- }
220
- return resolved;
221
- }
222
- /**
223
- * Interactive conflict resolution prompt
224
- */
225
- async promptConflictResolution(conflict) {
226
- console.log(`\n⚠️ Conflict in field: ${conflict.field}`);
227
- console.log(` Local value: ${conflict.localValue}`);
228
- console.log(` ${this.provider} value: ${conflict.externalValue}`);
229
- console.log(` Last sync value: ${conflict.lastSyncValue || '(unknown)'}\n`);
230
- const resolution = await select({
231
- message: `How should this conflict be resolved?`,
232
- choices: [
233
- {
234
- name: `Use local value: "${conflict.localValue}"`,
235
- value: 'local',
236
- },
237
- {
238
- name: `Use ${this.provider} value: "${conflict.externalValue}"`,
239
- value: 'external',
240
- },
241
- {
242
- name: 'Enter custom value (merge)',
243
- value: 'merge',
244
- },
245
- ],
246
- });
247
- if (resolution === 'merge') {
248
- const mergedValue = await input({
249
- message: `Enter merged value for ${conflict.field}:`,
250
- default: conflict.localValue,
251
- });
252
- conflict.resolution = 'merged';
253
- conflict.mergedValue = mergedValue;
254
- }
255
- else {
256
- conflict.resolution = resolution;
257
- }
258
- }
259
- // ==========================================================================
260
- // Apply Changes
261
- // ==========================================================================
262
- /**
263
- * Apply changes to external system
264
- */
265
- async applyToExternal(incrementId, changes) {
266
- // Implementation will be provider-specific
267
- // This is a placeholder
268
- for (const change of changes) {
269
- console.log(` ✓ ${change.field}: ${change.localValue}`);
270
- }
271
- }
272
- /**
273
- * Apply changes to local increment
274
- */
275
- async applyToLocal(incrementId, changes) {
276
- const incrementPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId);
277
- const specPath = path.join(incrementPath, 'spec.md');
278
- let specContent = await fs.readFile(specPath, 'utf-8');
279
- // Apply changes to spec.md
280
- for (const change of changes) {
281
- if (change.field === 'title') {
282
- specContent = specContent.replace(/^#\s+.+$/m, `# ${change.externalValue}`);
283
- }
284
- else if (change.field === 'status') {
285
- specContent = specContent.replace(/Status:\s*.+$/m, `Status: ${change.externalValue}`);
286
- }
287
- else if (change.field === 'priority') {
288
- specContent = specContent.replace(/Priority:\s*.+$/m, `Priority: ${change.externalValue}`);
289
- }
290
- console.log(` ✓ ${change.field}: ${change.externalValue}`);
291
- }
292
- await fs.writeFile(specPath, specContent, 'utf-8');
293
- }
294
- // ==========================================================================
295
- // Sync State Management
296
- // ==========================================================================
297
- /**
298
- * Load sync state from metadata
299
- */
300
- async loadSyncState(incrementId) {
301
- const metadataPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId, 'metadata.json');
302
- if (!fs.existsSync(metadataPath)) {
303
- return { incrementId, title: '', status: '' };
304
- }
305
- const metadata = await fs.readJSON(metadataPath);
306
- return {
307
- incrementId,
308
- title: metadata.title || '',
309
- status: metadata.status || '',
310
- externalId: metadata.sync?.externalId,
311
- externalKey: metadata.sync?.externalKey,
312
- externalUrl: metadata.sync?.externalUrl,
313
- lastSyncAt: metadata.sync?.lastSyncAt,
314
- lastLocalChange: metadata.sync?.lastLocalChange,
315
- lastExternalChange: metadata.sync?.lastExternalChange,
316
- linkedItems: metadata.sync?.linkedItems || {},
317
- };
318
- }
319
- /**
320
- * Update sync state in metadata
321
- */
322
- async updateSyncState(incrementId, state) {
323
- const metadataPath = path.join(this.projectRoot, '.specweave', 'increments', incrementId, 'metadata.json');
324
- let metadata = {};
325
- if (fs.existsSync(metadataPath)) {
326
- metadata = await fs.readJSON(metadataPath);
327
- }
328
- metadata.sync = {
329
- ...metadata.sync,
330
- externalId: state.externalId,
331
- externalKey: state.externalKey,
332
- externalUrl: state.externalUrl,
333
- lastSyncAt: state.lastSyncAt,
334
- lastLocalChange: state.lastLocalChange,
335
- lastExternalChange: state.lastExternalChange,
336
- linkedItems: state.linkedItems,
337
- };
338
- await fs.writeJSON(metadataPath, metadata, { spaces: 2 });
339
- }
340
- // ==========================================================================
341
- // Helpers
342
- // ==========================================================================
343
- /**
344
- * Print sync summary
345
- */
346
- printSyncSummary(result) {
347
- console.log('📊 Sync Summary:\n');
348
- // Display user-friendly direction label
349
- const directionLabel = result.direction === 'bidirectional' ? 'Two-way' : result.direction;
350
- console.log(` Direction: ${directionLabel}`);
351
- console.log(` Changes to external: ${result.changes.toExternal.length}`);
352
- console.log(` Changes from external: ${result.changes.fromExternal.length}`);
353
- console.log(` Conflicts detected: ${result.changes.conflicts.length}`);
354
- console.log(` Conflicts resolved: ${result.conflictsResolved}`);
355
- console.log(` Errors: ${result.errors.length}`);
356
- console.log('');
357
- }
358
- }
359
- //# sourceMappingURL=bidirectional-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bidirectional-engine.js","sourceRoot":"","sources":["../../../../src/core/sync/bidirectional-engine.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- /**
2
- * Conflict Resolver
3
- *
4
- * Detects and resolves status conflicts between SpecWeave increments
5
- * and external tools (GitHub, JIRA, Azure DevOps).
6
- *
7
- * Supports four resolution strategies:
8
- * - prompt: Requires user interaction (UI)
9
- * - last-write-wins: Uses most recent timestamp
10
- * - specweave-wins: Always uses local SpecWeave status
11
- * - external-wins: Always uses external tool status
12
- */
13
- export type ConflictResolutionStrategy = 'prompt' | 'last-write-wins' | 'specweave-wins' | 'external-wins';
14
- export interface StatusConflict {
15
- incrementId: string;
16
- tool: string;
17
- localStatus: string;
18
- remoteStatus: string;
19
- localTimestamp: string;
20
- remoteTimestamp: string;
21
- }
22
- export interface ConflictResolution {
23
- action: 'use-local' | 'use-remote';
24
- resolvedStatus: string;
25
- }
26
- export interface ConflictDetectionInput {
27
- incrementId: string;
28
- local: string;
29
- remote: string;
30
- tool: string;
31
- localTimestamp: string;
32
- remoteTimestamp: string;
33
- }
34
- export declare class ConflictResolver {
35
- /**
36
- * Detect status conflicts between local and remote
37
- *
38
- * @param input - Detection input with local/remote statuses and timestamps
39
- * @returns StatusConflict if conflict exists, null if statuses match
40
- */
41
- detect(input: ConflictDetectionInput): Promise<StatusConflict | null>;
42
- /**
43
- * Resolve status conflict using specified strategy
44
- *
45
- * @param conflict - The status conflict to resolve
46
- * @param strategy - Resolution strategy to use
47
- * @returns Resolution with action and resolved status
48
- * @throws Error if strategy is unknown or requires user interaction
49
- */
50
- resolve(conflict: StatusConflict, strategy: ConflictResolutionStrategy): Promise<ConflictResolution>;
51
- /**
52
- * Resolve conflict by comparing timestamps (last-write-wins)
53
- *
54
- * @param conflict - The status conflict to resolve
55
- * @returns Resolution based on most recent timestamp
56
- */
57
- private resolveByTimestamp;
58
- /**
59
- * Format conflict details for display to user
60
- *
61
- * @param conflict - The status conflict to format
62
- * @returns Human-readable conflict message
63
- */
64
- formatConflictMessage(conflict: StatusConflict): string;
65
- }
66
- //# sourceMappingURL=conflict-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conflict-resolver.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/conflict-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AAEpB,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACU,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAiBlF;;;;;;;OAOG;IACU,OAAO,CAClB,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,0BAA0B,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAyB9B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;;;;OAKG;IACI,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM;CAiB/D"}