specweave 0.29.0 → 0.29.2

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 +18 -0
  3. package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +27 -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,347 +0,0 @@
1
- /**
2
- * Status Sync Engine
3
- *
4
- * Core orchestration logic for status synchronization between SpecWeave
5
- * increments and external tools (GitHub, JIRA, Azure DevOps).
6
- *
7
- * Responsibilities:
8
- * - Orchestrate bidirectional status sync
9
- * - Detect and resolve conflicts
10
- * - Map statuses between SpecWeave and external tools
11
- * - Respect user preferences (autoSync, promptUser, conflictResolution)
12
- */
13
- import { StatusMapper } from './status-mapper.js';
14
- import { ConflictResolver } from './conflict-resolver.js';
15
- export class StatusSyncEngine {
16
- constructor(config) {
17
- this.config = config;
18
- this.mapper = new StatusMapper(config);
19
- this.resolver = new ConflictResolver();
20
- }
21
- /**
22
- * Sync SpecWeave status to external tool (one-way: SpecWeave → External)
23
- *
24
- * @param input - Sync input with local/remote statuses
25
- * @returns Sync result with conflict resolution details
26
- */
27
- async syncToExternal(input) {
28
- this.validateSyncEnabled();
29
- const result = {
30
- success: false,
31
- direction: 'to-external',
32
- action: 'no-sync-needed',
33
- conflict: null,
34
- resolution: null,
35
- externalMapping: null
36
- };
37
- try {
38
- // Detect conflict
39
- const conflict = await this.resolver.detect({
40
- incrementId: input.incrementId,
41
- local: input.localStatus,
42
- remote: input.remoteStatus,
43
- tool: input.tool,
44
- localTimestamp: input.localTimestamp,
45
- remoteTimestamp: input.remoteTimestamp
46
- });
47
- result.conflict = conflict;
48
- // No conflict - statuses already match
49
- if (!conflict) {
50
- result.success = true;
51
- result.action = 'no-sync-needed';
52
- return result;
53
- }
54
- // Resolve conflict
55
- const strategy = this.config.sync.statusSync.conflictResolution || 'last-write-wins';
56
- const resolution = await this.resolver.resolve(conflict, strategy);
57
- result.resolution = resolution;
58
- // Determine action based on resolution
59
- if (resolution.action === 'use-local') {
60
- result.action = 'sync-to-external';
61
- result.externalMapping = this.mapper.mapToExternal(input.localStatus, input.tool);
62
- }
63
- else {
64
- // Resolution says use-remote, but we're syncing TO external
65
- // This means external is already correct, no sync needed
66
- result.action = 'no-sync-needed';
67
- }
68
- result.success = true;
69
- return result;
70
- }
71
- catch (error) {
72
- result.success = false;
73
- result.error = error instanceof Error ? error.message : 'Unknown error';
74
- throw error;
75
- }
76
- }
77
- /**
78
- * Sync external status to SpecWeave (one-way: External → SpecWeave)
79
- *
80
- * @param input - Sync input with local/remote statuses
81
- * @returns Sync result with conflict resolution details
82
- */
83
- async syncFromExternal(input) {
84
- this.validateSyncEnabled();
85
- const result = {
86
- success: false,
87
- direction: 'from-external',
88
- action: 'no-sync-needed',
89
- conflict: null,
90
- resolution: null,
91
- externalMapping: null
92
- };
93
- try {
94
- // Detect conflict
95
- const conflict = await this.resolver.detect({
96
- incrementId: input.incrementId,
97
- local: input.localStatus,
98
- remote: input.remoteStatus,
99
- tool: input.tool,
100
- localTimestamp: input.localTimestamp,
101
- remoteTimestamp: input.remoteTimestamp
102
- });
103
- result.conflict = conflict;
104
- // No conflict - statuses already match
105
- if (!conflict) {
106
- result.success = true;
107
- result.action = 'no-sync-needed';
108
- return result;
109
- }
110
- // Resolve conflict
111
- const strategy = this.config.sync.statusSync.conflictResolution || 'last-write-wins';
112
- const resolution = await this.resolver.resolve(conflict, strategy);
113
- result.resolution = resolution;
114
- // Determine action based on resolution
115
- if (resolution.action === 'use-remote') {
116
- result.action = 'sync-from-external';
117
- }
118
- else {
119
- // Resolution says use-local, but we're syncing FROM external
120
- // This means local is already correct, no sync needed
121
- result.action = 'no-sync-needed';
122
- }
123
- result.success = true;
124
- return result;
125
- }
126
- catch (error) {
127
- result.success = false;
128
- result.error = error instanceof Error ? error.message : 'Unknown error';
129
- throw error;
130
- }
131
- }
132
- /**
133
- * Three-permission sync (SpecWeave ↔ External)
134
- *
135
- * Detects conflict and resolves based on strategy.
136
- * Syncs in the direction indicated by resolution.
137
- *
138
- * @param input - Sync input with local/remote statuses
139
- * @returns Sync result with conflict resolution details
140
- */
141
- async bidirectionalSync(input) {
142
- this.validateSyncEnabled();
143
- const result = {
144
- success: false,
145
- direction: 'bidirectional',
146
- action: 'no-sync-needed',
147
- conflict: null,
148
- resolution: null,
149
- externalMapping: null
150
- };
151
- try {
152
- // Detect conflict
153
- const conflict = await this.resolver.detect({
154
- incrementId: input.incrementId,
155
- local: input.localStatus,
156
- remote: input.remoteStatus,
157
- tool: input.tool,
158
- localTimestamp: input.localTimestamp,
159
- remoteTimestamp: input.remoteTimestamp
160
- });
161
- result.conflict = conflict;
162
- // No conflict - statuses already match
163
- if (!conflict) {
164
- result.success = true;
165
- result.action = 'no-sync-needed';
166
- return result;
167
- }
168
- // Resolve conflict
169
- const strategy = this.config.sync.statusSync.conflictResolution || 'last-write-wins';
170
- const resolution = await this.resolver.resolve(conflict, strategy);
171
- result.resolution = resolution;
172
- // Determine action based on resolution
173
- if (resolution.action === 'use-local') {
174
- result.action = 'sync-to-external';
175
- result.externalMapping = this.mapper.mapToExternal(input.localStatus, input.tool);
176
- }
177
- else {
178
- result.action = 'sync-from-external';
179
- }
180
- result.success = true;
181
- return result;
182
- }
183
- catch (error) {
184
- result.success = false;
185
- result.error = error instanceof Error ? error.message : 'Unknown error';
186
- throw error;
187
- }
188
- }
189
- /**
190
- * Bulk sync multiple increments to external tools
191
- *
192
- * Batches requests to avoid rate limiting.
193
- * Adds delays between batches.
194
- * Returns aggregate results with success/failure counts.
195
- *
196
- * @param inputs - Array of sync inputs
197
- * @param options - Bulk sync options (batch size, delay)
198
- * @returns Bulk sync result
199
- */
200
- async bulkSyncToExternal(inputs, options) {
201
- const startTime = Date.now();
202
- const batchSize = options?.batchSize || 5;
203
- const delayMs = options?.delayMs || 1000;
204
- const results = [];
205
- let successCount = 0;
206
- let failureCount = 0;
207
- // Calculate batches
208
- const batches = this.calculateBatches(inputs, batchSize);
209
- // Process each batch
210
- for (let i = 0; i < batches.length; i++) {
211
- const batch = batches[i];
212
- // Process all items in batch concurrently
213
- const batchResults = await Promise.allSettled(batch.map(input => this.syncToExternal(input)));
214
- // Collect results
215
- for (let j = 0; j < batchResults.length; j++) {
216
- const result = batchResults[j];
217
- const input = batch[j];
218
- if (result.status === 'fulfilled') {
219
- results.push({
220
- ...result.value,
221
- incrementId: input.incrementId
222
- });
223
- if (result.value.success) {
224
- successCount++;
225
- }
226
- else {
227
- failureCount++;
228
- }
229
- }
230
- else {
231
- // Rejection
232
- results.push({
233
- incrementId: input.incrementId,
234
- success: false,
235
- direction: 'to-external',
236
- action: 'no-sync-needed',
237
- conflict: null,
238
- resolution: null,
239
- externalMapping: null,
240
- error: result.reason.message || 'Unknown error'
241
- });
242
- failureCount++;
243
- }
244
- }
245
- // Add delay between batches (except after last batch)
246
- if (i < batches.length - 1) {
247
- await this.delay(delayMs);
248
- }
249
- }
250
- const duration = `${Date.now() - startTime}ms`;
251
- return {
252
- totalItems: inputs.length,
253
- successCount,
254
- failureCount,
255
- results,
256
- duration
257
- };
258
- }
259
- /**
260
- * Check if auto-sync is enabled
261
- *
262
- * @returns True if auto-sync is enabled
263
- */
264
- isAutoSyncEnabled() {
265
- return this.config.sync.statusSync.autoSync === true;
266
- }
267
- /**
268
- * Check if user should be prompted
269
- *
270
- * @returns True if user should be prompted (default: true)
271
- */
272
- shouldPromptUser() {
273
- // Default to true if not specified
274
- return this.config.sync.statusSync.promptUser !== false;
275
- }
276
- /**
277
- * Execute automatic sync without prompting
278
- *
279
- * Validates that auto-sync is enabled.
280
- * Handles errors gracefully (doesn't throw, returns error in result).
281
- *
282
- * @param input - Sync input
283
- * @returns Sync result with wasAutomatic flag
284
- */
285
- async executeAutoSync(input) {
286
- // Validate auto-sync is enabled
287
- if (!this.isAutoSyncEnabled()) {
288
- throw new Error('Auto-sync is disabled');
289
- }
290
- try {
291
- const result = await this.syncToExternal(input);
292
- return {
293
- ...result,
294
- wasAutomatic: true,
295
- wasPrompted: false
296
- };
297
- }
298
- catch (error) {
299
- // Handle errors gracefully - return error in result
300
- // Don't throw to avoid blocking increment completion
301
- return {
302
- success: false,
303
- direction: 'to-external',
304
- action: 'no-sync-needed',
305
- conflict: null,
306
- resolution: null,
307
- externalMapping: null,
308
- error: error instanceof Error ? error.message : 'Unknown error',
309
- wasAutomatic: true,
310
- wasPrompted: false
311
- };
312
- }
313
- }
314
- /**
315
- * Calculate batches from input array
316
- *
317
- * @param inputs - Array of inputs
318
- * @param batchSize - Size of each batch
319
- * @returns Array of batches
320
- */
321
- calculateBatches(inputs, batchSize) {
322
- const batches = [];
323
- for (let i = 0; i < inputs.length; i += batchSize) {
324
- batches.push(inputs.slice(i, i + batchSize));
325
- }
326
- return batches;
327
- }
328
- /**
329
- * Delay execution for specified milliseconds
330
- *
331
- * @param ms - Milliseconds to delay
332
- */
333
- delay(ms) {
334
- return new Promise(resolve => setTimeout(resolve, ms));
335
- }
336
- /**
337
- * Validate that status synchronization is enabled
338
- *
339
- * @throws Error if sync is disabled
340
- */
341
- validateSyncEnabled() {
342
- if (!this.config.sync.statusSync.enabled) {
343
- throw new Error('Status synchronization is disabled');
344
- }
345
- }
346
- }
347
- //# sourceMappingURL=status-sync-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-sync-engine.js","sourceRoot":"","sources":["../../../../src/core/sync/status-sync-engine.ts"],"names":[],"mappings":"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"}
@@ -1,113 +0,0 @@
1
- /**
2
- * Sync Event Logger
3
- *
4
- * Logs status synchronization events and conflict resolutions.
5
- * Provides audit trail for all sync operations.
6
- *
7
- * Events are logged to .specweave/logs/sync-events.json
8
- *
9
- * @module sync-event-logger
10
- */
11
- /**
12
- * Sync event (successful or failed sync)
13
- */
14
- export interface SyncEvent {
15
- incrementId: string;
16
- tool: 'github' | 'jira' | 'ado';
17
- fromStatus: string;
18
- toStatus: string;
19
- timestamp: string;
20
- triggeredBy: 'user' | 'auto-sync' | 'hook';
21
- success: boolean;
22
- direction: 'to-external' | 'from-external' | 'bidirectional';
23
- error?: string;
24
- }
25
- /**
26
- * Conflict resolution event
27
- */
28
- export interface ConflictEvent {
29
- incrementId: string;
30
- tool: 'github' | 'jira' | 'ado';
31
- localStatus: string;
32
- remoteStatus: string;
33
- localTimestamp: string;
34
- remoteTimestamp: string;
35
- resolutionStrategy: 'prompt' | 'last-write-wins' | 'specweave-wins' | 'external-wins';
36
- resolvedTo: 'use-local' | 'use-remote';
37
- timestamp: string;
38
- triggeredBy: 'user' | 'auto-sync' | 'hook';
39
- userChoice?: string;
40
- }
41
- /**
42
- * Union type for all event types
43
- */
44
- export type AnyEvent = SyncEvent | ConflictEvent;
45
- /**
46
- * Filter options for loading history
47
- */
48
- export interface LoadHistoryOptions {
49
- incrementId?: string;
50
- tool?: 'github' | 'jira' | 'ado';
51
- success?: boolean;
52
- }
53
- /**
54
- * Sync Event Logger
55
- *
56
- * Logs and retrieves status synchronization events.
57
- */
58
- export declare class SyncEventLogger {
59
- private projectRoot;
60
- private logsDir;
61
- private eventsFile;
62
- private conflictsFile;
63
- constructor(projectRoot: string);
64
- /**
65
- * Log a sync event
66
- *
67
- * @param event - Sync event to log
68
- */
69
- logSyncEvent(event: SyncEvent): Promise<void>;
70
- /**
71
- * Log a conflict resolution event
72
- *
73
- * @param event - Conflict event to log
74
- * @param writeToConflictsLog - Whether to also write to dedicated conflicts log (default: true)
75
- */
76
- logConflictEvent(event: ConflictEvent, writeToConflictsLog?: boolean): Promise<void>;
77
- /**
78
- * Load conflict events from dedicated conflicts log
79
- *
80
- * @returns Array of conflict events
81
- */
82
- loadConflicts(): Promise<ConflictEvent[]>;
83
- /**
84
- * Write conflict event to dedicated log file (append mode)
85
- *
86
- * @param event - Conflict event to write
87
- */
88
- private writeConflictToLog;
89
- /**
90
- * Load sync history
91
- *
92
- * @param options - Filter options
93
- * @returns Array of events (filtered if options provided)
94
- */
95
- loadSyncHistory(options?: LoadHistoryOptions): Promise<AnyEvent[]>;
96
- /**
97
- * Ensure logs directory exists
98
- */
99
- private ensureLogsDir;
100
- /**
101
- * Load all events from file
102
- *
103
- * @returns Array of all events
104
- */
105
- private loadAllEvents;
106
- /**
107
- * Write events to file
108
- *
109
- * @param events - Array of events to write
110
- */
111
- private writeEvents;
112
- }
113
- //# sourceMappingURL=sync-event-logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-event-logger.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/sync-event-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,QAAQ,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,eAAe,CAAC;IACtF,UAAU,EAAE,WAAW,GAAG,YAAY,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,MAAM;IAO/B;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;;;;OAKG;IACG,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,mBAAmB,GAAE,OAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhG;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAmB/C;;;;OAIG;YACW,kBAAkB;IAMhC;;;;;OAKG;IACG,eAAe,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA8BxE;;OAEG;YACW,aAAa;IAI3B;;;;OAIG;YACW,aAAa;IAS3B;;;;OAIG;YACW,WAAW;CAG1B"}
@@ -1,141 +0,0 @@
1
- /**
2
- * Sync Event Logger
3
- *
4
- * Logs status synchronization events and conflict resolutions.
5
- * Provides audit trail for all sync operations.
6
- *
7
- * Events are logged to .specweave/logs/sync-events.json
8
- *
9
- * @module sync-event-logger
10
- */
11
- import * as fs from '../../utils/fs-native.js';
12
- import path from 'path';
13
- /**
14
- * Sync Event Logger
15
- *
16
- * Logs and retrieves status synchronization events.
17
- */
18
- export class SyncEventLogger {
19
- constructor(projectRoot) {
20
- this.projectRoot = projectRoot;
21
- this.logsDir = path.join(projectRoot, '.specweave', 'logs');
22
- this.eventsFile = path.join(this.logsDir, 'sync-events.json');
23
- this.conflictsFile = path.join(this.logsDir, 'sync-conflicts.log');
24
- }
25
- /**
26
- * Log a sync event
27
- *
28
- * @param event - Sync event to log
29
- */
30
- async logSyncEvent(event) {
31
- await this.ensureLogsDir();
32
- const events = await this.loadAllEvents();
33
- events.push(event);
34
- await this.writeEvents(events);
35
- }
36
- /**
37
- * Log a conflict resolution event
38
- *
39
- * @param event - Conflict event to log
40
- * @param writeToConflictsLog - Whether to also write to dedicated conflicts log (default: true)
41
- */
42
- async logConflictEvent(event, writeToConflictsLog = true) {
43
- await this.ensureLogsDir();
44
- const events = await this.loadAllEvents();
45
- events.push(event);
46
- await this.writeEvents(events);
47
- // Also write to dedicated conflicts log file (AC-US9-09)
48
- if (writeToConflictsLog) {
49
- await this.writeConflictToLog(event);
50
- }
51
- }
52
- /**
53
- * Load conflict events from dedicated conflicts log
54
- *
55
- * @returns Array of conflict events
56
- */
57
- async loadConflicts() {
58
- const exists = await fs.pathExists(this.conflictsFile);
59
- if (!exists) {
60
- return [];
61
- }
62
- const content = await fs.readFile(this.conflictsFile, 'utf-8');
63
- const lines = content.trim().split('\n').filter(l => l.trim());
64
- return lines.map(line => {
65
- try {
66
- return JSON.parse(line);
67
- }
68
- catch {
69
- // Skip malformed lines
70
- return null;
71
- }
72
- }).filter((e) => e !== null);
73
- }
74
- /**
75
- * Write conflict event to dedicated log file (append mode)
76
- *
77
- * @param event - Conflict event to write
78
- */
79
- async writeConflictToLog(event) {
80
- await this.ensureLogsDir();
81
- const logLine = JSON.stringify(event) + '\n';
82
- await fs.appendFile(this.conflictsFile, logLine, 'utf-8');
83
- }
84
- /**
85
- * Load sync history
86
- *
87
- * @param options - Filter options
88
- * @returns Array of events (filtered if options provided)
89
- */
90
- async loadSyncHistory(options) {
91
- const exists = await fs.pathExists(this.eventsFile);
92
- if (!exists) {
93
- return [];
94
- }
95
- let events = await fs.readJson(this.eventsFile);
96
- // Apply filters
97
- if (options?.incrementId) {
98
- events = events.filter(e => e.incrementId === options.incrementId);
99
- }
100
- if (options?.tool) {
101
- events = events.filter(e => e.tool === options.tool);
102
- }
103
- if (options?.success !== undefined) {
104
- events = events.filter(e => {
105
- // Only SyncEvent has 'success' field
106
- if ('success' in e) {
107
- return e.success === options.success;
108
- }
109
- return false;
110
- });
111
- }
112
- return events;
113
- }
114
- /**
115
- * Ensure logs directory exists
116
- */
117
- async ensureLogsDir() {
118
- await fs.ensureDir(this.logsDir);
119
- }
120
- /**
121
- * Load all events from file
122
- *
123
- * @returns Array of all events
124
- */
125
- async loadAllEvents() {
126
- const exists = await fs.pathExists(this.eventsFile);
127
- if (!exists) {
128
- return [];
129
- }
130
- return await fs.readJson(this.eventsFile);
131
- }
132
- /**
133
- * Write events to file
134
- *
135
- * @param events - Array of events to write
136
- */
137
- async writeEvents(events) {
138
- await fs.writeJson(this.eventsFile, events, { spaces: 2 });
139
- }
140
- }
141
- //# sourceMappingURL=sync-event-logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-event-logger.js","sourceRoot":"","sources":["../../../../src/core/sync/sync-event-logger.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Interactive Time Range Selector
3
- *
4
- * Rich CLI interface for selecting time ranges with:
5
- * - Real-time estimates (items, duration, API calls)
6
- * - Rate limit impact visualization
7
- * - Current rate limit status
8
- * - Warnings and recommendations
9
- */
10
- import { TimeRangePreset, TimeRangeEstimate, RateLimitStatus, SyncProvider } from '../types/sync-profile.js';
11
- export declare class TimeRangeSelector {
12
- private rateLimiter;
13
- private provider;
14
- constructor(provider: SyncProvider);
15
- /**
16
- * Display time range options with estimates
17
- *
18
- * @param rateLimitStatus Current rate limit status (optional)
19
- * @returns Object with selected range, estimate, and user confirmed
20
- */
21
- displayOptions(rateLimitStatus?: RateLimitStatus | null): {
22
- options: TimeRangeOption[];
23
- rateLimitInfo: string[];
24
- recommendation: string;
25
- };
26
- /**
27
- * Format option for display
28
- */
29
- formatOption(option: TimeRangeOption, index: number): string[];
30
- /**
31
- * Display preview after selection
32
- */
33
- displayPreview(selectedOption: TimeRangeOption, rateLimitStatus?: RateLimitStatus | null): string[];
34
- private getProviderDisplayName;
35
- private getImpactEmoji;
36
- private formatImpact;
37
- private formatDuration;
38
- private getImpactPercentage;
39
- private getDateRange;
40
- }
41
- export interface TimeRangeOption {
42
- preset: TimeRangePreset;
43
- label: string;
44
- estimate: TimeRangeEstimate;
45
- recommended?: boolean;
46
- warning?: string;
47
- }
48
- //# sourceMappingURL=time-range-selector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time-range-selector.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/time-range-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,YAAY,EACb,MAAM,0BAA0B,CAAC;AAMlC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAe;gBAEnB,QAAQ,EAAE,YAAY;IASlC;;;;;OAKG;IACH,cAAc,CACZ,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,GACvC;QACD,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB;IA0ED;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAwB9D;;OAEG;IACH,cAAc,CACZ,cAAc,EAAE,eAAe,EAC/B,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,GACvC,MAAM,EAAE;IAyEX,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,YAAY;CA6BrB;AAMD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}