specweave 0.28.68 → 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.
- package/CLAUDE.md +3 -2
- package/README.md +19 -2
- package/dist/src/cli/commands/discrepancies.d.ts +89 -0
- package/dist/src/cli/commands/discrepancies.d.ts.map +1 -0
- package/dist/src/cli/commands/discrepancies.js +385 -0
- package/dist/src/cli/commands/discrepancies.js.map +1 -0
- package/dist/src/cli/commands/notifications.d.ts +70 -0
- package/dist/src/cli/commands/notifications.d.ts.map +1 -0
- package/dist/src/cli/commands/notifications.js +236 -0
- package/dist/src/cli/commands/notifications.js.map +1 -0
- package/dist/src/cli/commands/sync-logs.d.ts +54 -0
- package/dist/src/cli/commands/sync-logs.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-logs.js +240 -0
- package/dist/src/cli/commands/sync-logs.js.map +1 -0
- package/dist/src/cli/commands/sync-monitor.d.ts +42 -0
- package/dist/src/cli/commands/sync-monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/sync-monitor.js +191 -0
- package/dist/src/cli/commands/sync-monitor.js.map +1 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.d.ts +45 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.js +431 -0
- package/dist/src/cli/helpers/init/brownfield-analysis.js.map +1 -0
- package/dist/src/cli/helpers/init/index.d.ts +1 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +2 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.d.ts +66 -0
- package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -0
- package/dist/src/cli/workers/brownfield-worker.js +417 -0
- package/dist/src/cli/workers/brownfield-worker.js.map +1 -0
- package/dist/src/core/background/brownfield-launcher.d.ts +86 -0
- package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -0
- package/dist/src/core/background/brownfield-launcher.js +295 -0
- package/dist/src/core/background/brownfield-launcher.js.map +1 -0
- package/dist/src/core/background/index.d.ts +2 -0
- package/dist/src/core/background/index.d.ts.map +1 -1
- package/dist/src/core/background/index.js +2 -0
- package/dist/src/core/background/index.js.map +1 -1
- package/dist/src/core/background/types.d.ts +23 -2
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/config/index.d.ts +1 -0
- package/dist/src/core/config/index.d.ts.map +1 -1
- package/dist/src/core/config/index.js +1 -0
- package/dist/src/core/config/index.js.map +1 -1
- package/dist/src/core/config/types.d.ts +6 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/dashboard/dashboard-data.d.ts +156 -0
- package/dist/src/core/dashboard/dashboard-data.d.ts.map +1 -0
- package/dist/src/core/dashboard/dashboard-data.js +191 -0
- package/dist/src/core/dashboard/dashboard-data.js.map +1 -0
- package/dist/src/core/dashboard/index.d.ts +9 -0
- package/dist/src/core/dashboard/index.d.ts.map +1 -0
- package/dist/src/core/dashboard/index.js +9 -0
- package/dist/src/core/dashboard/index.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts +77 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js +286 -0
- package/dist/src/core/discrepancy/analyzers/api-route-analyzer.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/index.d.ts +8 -0
- package/dist/src/core/discrepancy/analyzers/index.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/index.js +8 -0
- package/dist/src/core/discrepancy/analyzers/index.js.map +1 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts +96 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js +247 -0
- package/dist/src/core/discrepancy/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/src/core/discrepancy/brownfield-manager.d.ts +88 -0
- package/dist/src/core/discrepancy/brownfield-manager.d.ts.map +1 -0
- package/dist/src/core/discrepancy/brownfield-manager.js +520 -0
- package/dist/src/core/discrepancy/brownfield-manager.js.map +1 -0
- package/dist/src/core/discrepancy/brownfield-types.d.ts +174 -0
- package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -0
- package/dist/src/core/discrepancy/brownfield-types.js +11 -0
- package/dist/src/core/discrepancy/brownfield-types.js.map +1 -0
- package/dist/src/core/discrepancy/detector.d.ts +92 -0
- package/dist/src/core/discrepancy/detector.d.ts.map +1 -0
- package/dist/src/core/discrepancy/detector.js +346 -0
- package/dist/src/core/discrepancy/detector.js.map +1 -0
- package/dist/src/core/discrepancy/increment-generator.d.ts +51 -0
- package/dist/src/core/discrepancy/increment-generator.d.ts.map +1 -0
- package/dist/src/core/discrepancy/increment-generator.js +234 -0
- package/dist/src/core/discrepancy/increment-generator.js.map +1 -0
- package/dist/src/core/discrepancy/index.d.ts +18 -0
- package/dist/src/core/discrepancy/index.d.ts.map +1 -0
- package/dist/src/core/discrepancy/index.js +24 -0
- package/dist/src/core/discrepancy/index.js.map +1 -0
- package/dist/src/core/discrepancy/severity-classifier.d.ts +81 -0
- package/dist/src/core/discrepancy/severity-classifier.d.ts.map +1 -0
- package/dist/src/core/discrepancy/severity-classifier.js +289 -0
- package/dist/src/core/discrepancy/severity-classifier.js.map +1 -0
- package/dist/src/core/discrepancy/spec-parser.d.ts +74 -0
- package/dist/src/core/discrepancy/spec-parser.d.ts.map +1 -0
- package/dist/src/core/discrepancy/spec-parser.js +213 -0
- package/dist/src/core/discrepancy/spec-parser.js.map +1 -0
- package/dist/src/core/discrepancy/update-recommender.d.ts +77 -0
- package/dist/src/core/discrepancy/update-recommender.d.ts.map +1 -0
- package/dist/src/core/discrepancy/update-recommender.js +323 -0
- package/dist/src/core/discrepancy/update-recommender.js.map +1 -0
- package/dist/src/core/living-docs/living-docs-sync.d.ts +13 -16
- package/dist/src/core/living-docs/living-docs-sync.d.ts.map +1 -1
- package/dist/src/core/living-docs/living-docs-sync.js +31 -112
- package/dist/src/core/living-docs/living-docs-sync.js.map +1 -1
- package/dist/src/core/logs/index.d.ts +10 -0
- package/dist/src/core/logs/index.d.ts.map +1 -0
- package/dist/src/core/logs/index.js +10 -0
- package/dist/src/core/logs/index.js.map +1 -0
- package/dist/src/core/logs/log-aggregator.d.ts +130 -0
- package/dist/src/core/logs/log-aggregator.d.ts.map +1 -0
- package/dist/src/core/logs/log-aggregator.js +206 -0
- package/dist/src/core/logs/log-aggregator.js.map +1 -0
- package/dist/src/core/logs/log-exporter.d.ts +81 -0
- package/dist/src/core/logs/log-exporter.d.ts.map +1 -0
- package/dist/src/core/logs/log-exporter.js +141 -0
- package/dist/src/core/logs/log-exporter.js.map +1 -0
- package/dist/src/core/notifications/command-integration.d.ts +82 -0
- package/dist/src/core/notifications/command-integration.d.ts.map +1 -0
- package/dist/src/core/notifications/command-integration.js +80 -0
- package/dist/src/core/notifications/command-integration.js.map +1 -0
- package/dist/src/core/notifications/index.d.ts +12 -0
- package/dist/src/core/notifications/index.d.ts.map +1 -0
- package/dist/src/core/notifications/index.js +12 -0
- package/dist/src/core/notifications/index.js.map +1 -0
- package/dist/src/core/notifications/notification-display.d.ts +70 -0
- package/dist/src/core/notifications/notification-display.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-display.js +177 -0
- package/dist/src/core/notifications/notification-display.js.map +1 -0
- package/dist/src/core/notifications/notification-manager.d.ts +126 -0
- package/dist/src/core/notifications/notification-manager.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-manager.js +287 -0
- package/dist/src/core/notifications/notification-manager.js.map +1 -0
- package/dist/src/core/notifications/notification-types.d.ts +159 -0
- package/dist/src/core/notifications/notification-types.d.ts.map +1 -0
- package/dist/src/core/notifications/notification-types.js +93 -0
- package/dist/src/core/notifications/notification-types.js.map +1 -0
- package/dist/src/core/scheduler/index.d.ts +11 -0
- package/dist/src/core/scheduler/index.d.ts.map +1 -0
- package/dist/src/core/scheduler/index.js +11 -0
- package/dist/src/core/scheduler/index.js.map +1 -0
- package/dist/src/core/scheduler/job-scheduler.d.ts +179 -0
- package/dist/src/core/scheduler/job-scheduler.d.ts.map +1 -0
- package/dist/src/core/scheduler/job-scheduler.js +282 -0
- package/dist/src/core/scheduler/job-scheduler.js.map +1 -0
- package/dist/src/core/scheduler/schedule-persistence.d.ts +83 -0
- package/dist/src/core/scheduler/schedule-persistence.d.ts.map +1 -0
- package/dist/src/core/scheduler/schedule-persistence.js +180 -0
- package/dist/src/core/scheduler/schedule-persistence.js.map +1 -0
- package/dist/src/core/scheduler/scheduled-job.d.ts +188 -0
- package/dist/src/core/scheduler/scheduled-job.d.ts.map +1 -0
- package/dist/src/core/scheduler/scheduled-job.js +182 -0
- package/dist/src/core/scheduler/scheduled-job.js.map +1 -0
- package/dist/src/core/sync/permission-enforcer.d.ts +206 -0
- package/dist/src/core/sync/permission-enforcer.d.ts.map +1 -0
- package/dist/src/core/sync/permission-enforcer.js +268 -0
- package/dist/src/core/sync/permission-enforcer.js.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts +217 -0
- package/dist/src/core/sync/sync-audit-logger.d.ts.map +1 -0
- package/dist/src/core/sync/sync-audit-logger.js +327 -0
- package/dist/src/core/sync/sync-audit-logger.js.map +1 -0
- package/dist/src/core/sync/sync-interceptor.d.ts +190 -0
- package/dist/src/core/sync/sync-interceptor.d.ts.map +1 -0
- package/dist/src/core/sync/sync-interceptor.js +224 -0
- package/dist/src/core/sync/sync-interceptor.js.map +1 -0
- package/dist/src/core/types/increment-metadata.d.ts +5 -2
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/sync-config.d.ts +267 -0
- package/dist/src/core/types/sync-config.d.ts.map +1 -0
- package/dist/src/core/types/sync-config.js +304 -0
- package/dist/src/core/types/sync-config.js.map +1 -0
- package/dist/src/hooks/index.d.ts +11 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +11 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/platform.d.ts +125 -0
- package/dist/src/hooks/platform.d.ts.map +1 -0
- package/dist/src/hooks/platform.js +325 -0
- package/dist/src/hooks/platform.js.map +1 -0
- package/dist/src/hooks/processor.d.ts +20 -0
- package/dist/src/hooks/processor.d.ts.map +1 -0
- package/dist/src/hooks/processor.js +317 -0
- package/dist/src/hooks/processor.js.map +1 -0
- package/dist/src/hooks/scheduler-startup.d.ts +19 -0
- package/dist/src/hooks/scheduler-startup.d.ts.map +1 -0
- package/dist/src/hooks/scheduler-startup.js +92 -0
- package/dist/src/hooks/scheduler-startup.js.map +1 -0
- package/dist/src/hooks/session-start.d.ts +16 -0
- package/dist/src/hooks/session-start.d.ts.map +1 -0
- package/dist/src/hooks/session-start.js +92 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/importers/duplicate-detector.d.ts +13 -2
- package/dist/src/importers/duplicate-detector.d.ts.map +1 -1
- package/dist/src/importers/duplicate-detector.js +21 -2
- package/dist/src/importers/duplicate-detector.js.map +1 -1
- package/dist/src/importers/item-converter.d.ts +41 -2
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +225 -38
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.d.ts +7 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +30 -4
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/dist/src/sync/ado-sync-wrapper.d.ts +137 -0
- package/dist/src/sync/ado-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/ado-sync-wrapper.js +148 -0
- package/dist/src/sync/ado-sync-wrapper.js.map +1 -0
- package/dist/src/sync/github-sync-wrapper.d.ts +195 -0
- package/dist/src/sync/github-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/github-sync-wrapper.js +220 -0
- package/dist/src/sync/github-sync-wrapper.js.map +1 -0
- package/dist/src/sync/jira-sync-wrapper.d.ts +155 -0
- package/dist/src/sync/jira-sync-wrapper.d.ts.map +1 -0
- package/dist/src/sync/jira-sync-wrapper.js +175 -0
- package/dist/src/sync/jira-sync-wrapper.js.map +1 -0
- package/dist/src/utils/feature-id-derivation.d.ts +58 -0
- package/dist/src/utils/feature-id-derivation.d.ts.map +1 -0
- package/dist/src/utils/feature-id-derivation.js +77 -0
- package/dist/src/utils/feature-id-derivation.js.map +1 -0
- package/package.json +3 -1
- package/plugins/specweave/commands/specweave-discrepancies.md +141 -0
- package/plugins/specweave/commands/specweave-discrepancy-to-increment.md +160 -0
- package/plugins/specweave/commands/specweave-jobs.md +45 -2
- package/plugins/specweave/commands/specweave-notifications.md +92 -0
- package/plugins/specweave/commands/specweave-sync-logs.md +131 -0
- package/plugins/specweave/commands/specweave-sync-monitor.md +57 -0
- package/plugins/specweave/hooks/hooks.json +3 -3
- package/plugins/specweave/hooks/lib/scheduler-startup.sh +72 -0
- package/plugins/specweave/hooks/universal/dispatcher.mjs +246 -0
- package/plugins/specweave/hooks/universal/session-start.cmd +16 -0
- package/plugins/specweave/hooks/universal/session-start.ps1 +16 -0
- package/plugins/specweave/hooks/v2/dispatchers/session-start.sh +14 -5
- package/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +5 -2
- package/plugins/specweave/skills/discrepancy-viewer.md +154 -0
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +46 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +69 -0
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +0 -26
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +0 -249
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +0 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +0 -28
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +0 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -156
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +0 -1
- package/dist/src/core/sync/bidirectional-engine.d.ts +0 -119
- package/dist/src/core/sync/bidirectional-engine.d.ts.map +0 -1
- package/dist/src/core/sync/bidirectional-engine.js +0 -359
- package/dist/src/core/sync/bidirectional-engine.js.map +0 -1
- package/dist/src/core/sync/conflict-resolver.d.ts +0 -66
- package/dist/src/core/sync/conflict-resolver.d.ts.map +0 -1
- package/dist/src/core/sync/conflict-resolver.js +0 -108
- package/dist/src/core/sync/conflict-resolver.js.map +0 -1
- package/dist/src/core/sync/enhanced-content-builder.d.ts +0 -55
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +0 -1
- package/dist/src/core/sync/enhanced-content-builder.js +0 -203
- package/dist/src/core/sync/enhanced-content-builder.js.map +0 -1
- package/dist/src/core/sync/folder-mapper.d.ts +0 -71
- package/dist/src/core/sync/folder-mapper.d.ts.map +0 -1
- package/dist/src/core/sync/folder-mapper.js +0 -203
- package/dist/src/core/sync/folder-mapper.js.map +0 -1
- package/dist/src/core/sync/label-detector.d.ts +0 -66
- package/dist/src/core/sync/label-detector.d.ts.map +0 -1
- package/dist/src/core/sync/label-detector.js +0 -224
- package/dist/src/core/sync/label-detector.js.map +0 -1
- package/dist/src/core/sync/performance-optimizer.d.ts +0 -153
- package/dist/src/core/sync/performance-optimizer.d.ts.map +0 -1
- package/dist/src/core/sync/performance-optimizer.js +0 -220
- package/dist/src/core/sync/performance-optimizer.js.map +0 -1
- package/dist/src/core/sync/profile-selector.d.ts +0 -52
- package/dist/src/core/sync/profile-selector.d.ts.map +0 -1
- package/dist/src/core/sync/profile-selector.js +0 -179
- package/dist/src/core/sync/profile-selector.js.map +0 -1
- package/dist/src/core/sync/profile-validator.d.ts +0 -52
- package/dist/src/core/sync/profile-validator.d.ts.map +0 -1
- package/dist/src/core/sync/profile-validator.js +0 -170
- package/dist/src/core/sync/profile-validator.js.map +0 -1
- package/dist/src/core/sync/rate-limiter.d.ts +0 -116
- package/dist/src/core/sync/rate-limiter.d.ts.map +0 -1
- package/dist/src/core/sync/rate-limiter.js +0 -308
- package/dist/src/core/sync/rate-limiter.js.map +0 -1
- package/dist/src/core/sync/retry-handler.d.ts +0 -98
- package/dist/src/core/sync/retry-handler.d.ts.map +0 -1
- package/dist/src/core/sync/retry-handler.js +0 -196
- package/dist/src/core/sync/retry-handler.js.map +0 -1
- package/dist/src/core/sync/retry-logic.d.ts +0 -64
- package/dist/src/core/sync/retry-logic.d.ts.map +0 -1
- package/dist/src/core/sync/retry-logic.js +0 -165
- package/dist/src/core/sync/retry-logic.js.map +0 -1
- package/dist/src/core/sync/status-cache.d.ts +0 -91
- package/dist/src/core/sync/status-cache.d.ts.map +0 -1
- package/dist/src/core/sync/status-cache.js +0 -140
- package/dist/src/core/sync/status-cache.js.map +0 -1
- package/dist/src/core/sync/status-mapper.d.ts +0 -69
- package/dist/src/core/sync/status-mapper.d.ts.map +0 -1
- package/dist/src/core/sync/status-mapper.js +0 -90
- package/dist/src/core/sync/status-mapper.js.map +0 -1
- package/dist/src/core/sync/status-sync-engine.d.ts +0 -162
- package/dist/src/core/sync/status-sync-engine.d.ts.map +0 -1
- package/dist/src/core/sync/status-sync-engine.js +0 -347
- package/dist/src/core/sync/status-sync-engine.js.map +0 -1
- package/dist/src/core/sync/sync-event-logger.d.ts +0 -113
- package/dist/src/core/sync/sync-event-logger.d.ts.map +0 -1
- package/dist/src/core/sync/sync-event-logger.js +0 -141
- package/dist/src/core/sync/sync-event-logger.js.map +0 -1
- package/dist/src/core/sync/time-range-selector.d.ts +0 -48
- package/dist/src/core/sync/time-range-selector.d.ts.map +0 -1
- package/dist/src/core/sync/time-range-selector.js +0 -224
- package/dist/src/core/sync/time-range-selector.js.map +0 -1
- package/dist/src/core/sync/types.d.ts +0 -52
- package/dist/src/core/sync/types.d.ts.map +0 -1
- package/dist/src/core/sync/types.js +0 -5
- package/dist/src/core/sync/types.js.map +0 -1
- package/dist/src/core/sync/workflow-detector.d.ts +0 -95
- package/dist/src/core/sync/workflow-detector.d.ts.map +0 -1
- package/dist/src/core/sync/workflow-detector.js +0 -175
- package/dist/src/core/sync/workflow-detector.js.map +0 -1
- package/plugins/specweave-github/lib/enhanced-github-sync.js +0 -220
- package/plugins/specweave-github/lib/enhanced-github-sync.ts +0 -322
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +0 -134
- 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"}
|