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,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced JIRA Spec Content Sync
|
|
3
|
-
*
|
|
4
|
-
* Uses EnhancedContentBuilder and SpecIncrementMapper for rich epic descriptions.
|
|
5
|
-
*
|
|
6
|
-
* NOTE: This version focuses on enhanced content building.
|
|
7
|
-
* Actual JIRA API integration requires jira-spec-sync.ts
|
|
8
|
-
*/
|
|
9
|
-
import { EnhancedContentBuilder } from '../../../src/core/sync/enhanced-content-builder.js';
|
|
10
|
-
import { SpecIncrementMapper } from '../../../src/core/sync/spec-increment-mapper.js';
|
|
11
|
-
import { parseSpecContent } from '../../../src/core/spec-content-sync.js';
|
|
12
|
-
import * as path from 'path';
|
|
13
|
-
import * as fs from 'fs/promises';
|
|
14
|
-
/**
|
|
15
|
-
* Enhanced sync with rich content including task mappings
|
|
16
|
-
*/
|
|
17
|
-
export async function syncSpecToJiraWithEnhancedContent(options) {
|
|
18
|
-
const { specPath, domain, project, dryRun = false, verbose = false } = options;
|
|
19
|
-
try {
|
|
20
|
-
// 1. Parse spec content
|
|
21
|
-
const baseSpec = await parseSpecContent(specPath);
|
|
22
|
-
if (!baseSpec) {
|
|
23
|
-
return {
|
|
24
|
-
success: false,
|
|
25
|
-
action: 'error',
|
|
26
|
-
error: 'Failed to parse spec content',
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
if (verbose) {
|
|
30
|
-
console.log(`📄 Parsed spec: ${baseSpec.identifier.compact}`);
|
|
31
|
-
}
|
|
32
|
-
// 2. Build enhanced spec with task mappings
|
|
33
|
-
const specId = baseSpec.identifier.full || baseSpec.identifier.compact;
|
|
34
|
-
const rootDir = await findSpecWeaveRoot(specPath);
|
|
35
|
-
const mapper = new SpecIncrementMapper(rootDir);
|
|
36
|
-
const mapping = await mapper.mapSpecToIncrements(specId);
|
|
37
|
-
if (verbose) {
|
|
38
|
-
console.log(`🔗 Found ${mapping.increments.length} related increments`);
|
|
39
|
-
}
|
|
40
|
-
// 3. Build enhanced spec content
|
|
41
|
-
const taskMapping = buildTaskMapping(mapping.increments);
|
|
42
|
-
const architectureDocs = await findArchitectureDocs(rootDir, specId);
|
|
43
|
-
const enhancedSpec = {
|
|
44
|
-
...baseSpec,
|
|
45
|
-
summary: baseSpec.description,
|
|
46
|
-
taskMapping,
|
|
47
|
-
architectureDocs
|
|
48
|
-
};
|
|
49
|
-
// 4. Build external description
|
|
50
|
-
const builder = new EnhancedContentBuilder();
|
|
51
|
-
const description = builder.buildExternalDescription(enhancedSpec);
|
|
52
|
-
if (verbose) {
|
|
53
|
-
console.log(`📝 Generated description: ${description.length} characters`);
|
|
54
|
-
}
|
|
55
|
-
if (dryRun) {
|
|
56
|
-
console.log('🔍 DRY RUN - Would create/update epic with:');
|
|
57
|
-
console.log(` Summary: ${baseSpec.title}`);
|
|
58
|
-
console.log(` Description length: ${description.length}`);
|
|
59
|
-
return {
|
|
60
|
-
success: true,
|
|
61
|
-
action: 'no-change',
|
|
62
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
// 5. Validate domain/project (if not dry run)
|
|
66
|
-
if (!dryRun && (!domain || !project)) {
|
|
67
|
-
return {
|
|
68
|
-
success: false,
|
|
69
|
-
action: 'error',
|
|
70
|
-
error: 'JIRA domain/project not specified (required for actual sync)',
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
// For now, we focus on content building
|
|
74
|
-
// Actual JIRA API integration is in jira-spec-sync.ts
|
|
75
|
-
const result = {
|
|
76
|
-
success: true,
|
|
77
|
-
action: dryRun ? 'no-change' : 'created', // Assume create if not dry run
|
|
78
|
-
tasksLinked: taskMapping?.tasks.length || 0
|
|
79
|
-
};
|
|
80
|
-
if (domain && project && !dryRun) {
|
|
81
|
-
// In a real implementation, this would use JIRA API
|
|
82
|
-
// For now, just simulate success
|
|
83
|
-
result.epicKey = `SPEC-001`; // Placeholder
|
|
84
|
-
result.epicUrl = `https://${domain}/browse/SPEC-001`;
|
|
85
|
-
if (verbose) {
|
|
86
|
-
console.log(`⚠️ JIRA API integration not implemented in this file`);
|
|
87
|
-
console.log(` Use jira-spec-sync.ts for actual JIRA synchronization`);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return result;
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
return {
|
|
94
|
-
success: false,
|
|
95
|
-
action: 'error',
|
|
96
|
-
error: error.message
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Helper functions (similar to GitHub sync)
|
|
101
|
-
async function findSpecWeaveRoot(specPath) {
|
|
102
|
-
let currentDir = path.dirname(specPath);
|
|
103
|
-
while (true) {
|
|
104
|
-
const specweaveDir = path.join(currentDir, '.specweave');
|
|
105
|
-
try {
|
|
106
|
-
await fs.access(specweaveDir);
|
|
107
|
-
return currentDir;
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
const parentDir = path.dirname(currentDir);
|
|
111
|
-
if (parentDir === currentDir) {
|
|
112
|
-
throw new Error('.specweave directory not found');
|
|
113
|
-
}
|
|
114
|
-
currentDir = parentDir;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
function buildTaskMapping(increments) {
|
|
119
|
-
if (increments.length === 0)
|
|
120
|
-
return undefined;
|
|
121
|
-
const firstIncrement = increments[0];
|
|
122
|
-
const tasks = firstIncrement.tasks.map((task) => ({
|
|
123
|
-
id: task.id,
|
|
124
|
-
title: task.title,
|
|
125
|
-
userStories: task.userStories
|
|
126
|
-
}));
|
|
127
|
-
return {
|
|
128
|
-
incrementId: firstIncrement.id,
|
|
129
|
-
tasks,
|
|
130
|
-
tasksUrl: `tasks.md` // JIRA doesn't support external links in same way
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
async function findArchitectureDocs(rootDir, specId) {
|
|
134
|
-
const docs = [];
|
|
135
|
-
const archDir = path.join(rootDir, '.specweave/docs/internal/architecture');
|
|
136
|
-
try {
|
|
137
|
-
const adrDir = path.join(archDir, 'adr');
|
|
138
|
-
try {
|
|
139
|
-
const adrs = await fs.readdir(adrDir);
|
|
140
|
-
const relatedAdrs = adrs.filter(file => file.includes(specId.replace('spec-', '')));
|
|
141
|
-
for (const adr of relatedAdrs) {
|
|
142
|
-
docs.push({
|
|
143
|
-
type: 'adr',
|
|
144
|
-
path: path.join(adrDir, adr),
|
|
145
|
-
title: adr.replace('.md', '').replace(/-/g, ' ')
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
catch { }
|
|
150
|
-
}
|
|
151
|
-
catch { }
|
|
152
|
-
return docs;
|
|
153
|
-
}
|
|
154
|
-
// NOTE: findExistingEpic not needed in this simplified version
|
|
155
|
-
// Real JIRA API integration is in jira-spec-sync.ts
|
|
156
|
-
//# sourceMappingURL=enhanced-jira-sync.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enhanced-jira-sync.js","sourceRoot":"","sources":["../../../../plugins/specweave-jira/lib/enhanced-jira-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|