specweave 0.17.16 → 0.17.19
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 +405 -2495
- package/README.md +92 -2
- package/dist/locales/de/.gitkeep +0 -0
- package/dist/locales/de/cli.json +108 -0
- package/dist/locales/en/cli.json +287 -0
- package/dist/locales/en/errors.json +7 -0
- package/dist/locales/en/templates.json +6 -0
- package/dist/locales/es/.gitkeep +0 -0
- package/dist/locales/es/cli.json +41 -0
- package/dist/locales/fr/.gitkeep +0 -0
- package/dist/locales/fr/cli.json +108 -0
- package/dist/locales/ja/.gitkeep +0 -0
- package/dist/locales/ja/cli.json +108 -0
- package/dist/locales/ko/.gitkeep +0 -0
- package/dist/locales/ko/cli.json +108 -0
- package/dist/locales/pt/.gitkeep +0 -0
- package/dist/locales/pt/cli.json +108 -0
- package/dist/locales/ru/.gitkeep +0 -0
- package/dist/locales/ru/cli.json +269 -0
- package/dist/locales/zh/.gitkeep +0 -0
- package/dist/locales/zh/cli.json +108 -0
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.d.ts.map +1 -1
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js +188 -36
- package/dist/plugins/specweave/lib/hooks/sync-living-docs.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js +65 -6
- package/dist/plugins/specweave-ado/lib/ado-spec-content-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +54 -0
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js +86 -0
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts +25 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js +191 -0
- package/dist/plugins/specweave-ado/lib/enhanced-ado-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts +139 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.js +389 -0
- package/dist/plugins/specweave-github/lib/duplicate-detector.js.map +1 -0
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts +26 -0
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js +249 -0
- package/dist/plugins/specweave-github/lib/enhanced-github-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts +63 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js +216 -0
- package/dist/plugins/specweave-github/lib/epic-content-builder.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-client.d.ts +1 -1
- package/dist/plugins/specweave-github/lib/github-client.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client.js +25 -13
- package/dist/plugins/specweave-github/lib/github-client.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts +83 -0
- package/dist/plugins/specweave-github/lib/github-epic-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-epic-sync.js +466 -0
- package/dist/plugins/specweave-github/lib/github-epic-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts +43 -0
- package/dist/plugins/specweave-github/lib/github-status-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-github/lib/github-status-sync.js +82 -0
- package/dist/plugins/specweave-github/lib/github-status-sync.js.map +1 -0
- package/dist/plugins/specweave-github/lib/task-sync.d.ts +5 -0
- package/dist/plugins/specweave-github/lib/task-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/task-sync.js +38 -2
- package/dist/plugins/specweave-github/lib/task-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts +28 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js +156 -0
- package/dist/plugins/specweave-jira/lib/enhanced-jira-sync.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts +66 -0
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js +274 -0
- package/dist/plugins/specweave-jira/lib/jira-epic-sync.js.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +56 -0
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js +93 -0
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -0
- package/dist/spec-parser.js +629 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +107 -3
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/issue-tracker/index.js +48 -3
- package/dist/src/cli/helpers/issue-tracker/index.js.map +1 -1
- package/dist/src/core/deduplication/command-deduplicator.d.ts +166 -0
- package/dist/src/core/deduplication/command-deduplicator.d.ts.map +1 -0
- package/dist/src/core/deduplication/command-deduplicator.js +254 -0
- package/dist/src/core/deduplication/command-deduplicator.js.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts +142 -0
- package/dist/src/core/living-docs/hierarchy-mapper.d.ts.map +1 -0
- package/dist/src/core/living-docs/hierarchy-mapper.js +453 -0
- package/dist/src/core/living-docs/hierarchy-mapper.js.map +1 -0
- package/dist/src/core/living-docs/index.d.ts +10 -84
- package/dist/src/core/living-docs/index.d.ts.map +1 -1
- package/dist/src/core/living-docs/index.js +10 -164
- package/dist/src/core/living-docs/index.js.map +1 -1
- package/dist/src/core/living-docs/spec-distributor.d.ts +106 -0
- package/dist/src/core/living-docs/spec-distributor.d.ts.map +1 -0
- package/dist/src/core/living-docs/spec-distributor.js +823 -0
- package/dist/src/core/living-docs/spec-distributor.js.map +1 -0
- package/dist/src/core/living-docs/types.d.ts +201 -0
- package/dist/src/core/living-docs/types.d.ts.map +1 -0
- package/dist/src/core/living-docs/types.js +15 -0
- package/dist/src/core/living-docs/types.js.map +1 -0
- package/dist/src/core/logging/prompt-logger.d.ts +70 -0
- package/dist/src/core/logging/prompt-logger.d.ts.map +1 -0
- package/dist/src/core/logging/prompt-logger.js +247 -0
- package/dist/src/core/logging/prompt-logger.js.map +1 -0
- package/dist/src/core/status-line/status-line-manager.d.ts +15 -24
- package/dist/src/core/status-line/status-line-manager.d.ts.map +1 -1
- package/dist/src/core/status-line/status-line-manager.js +33 -70
- package/dist/src/core/status-line/status-line-manager.js.map +1 -1
- package/dist/src/core/status-line/types.d.ts +19 -31
- package/dist/src/core/status-line/types.d.ts.map +1 -1
- package/dist/src/core/status-line/types.js +5 -9
- package/dist/src/core/status-line/types.js.map +1 -1
- package/dist/src/core/sync/conflict-resolver.d.ts +66 -0
- package/dist/src/core/sync/conflict-resolver.d.ts.map +1 -0
- package/dist/src/core/sync/conflict-resolver.js +108 -0
- package/dist/src/core/sync/conflict-resolver.js.map +1 -0
- package/dist/src/core/sync/enhanced-content-builder.d.ts +55 -0
- package/dist/src/core/sync/enhanced-content-builder.d.ts.map +1 -0
- package/dist/src/core/sync/enhanced-content-builder.js +202 -0
- package/dist/src/core/sync/enhanced-content-builder.js.map +1 -0
- package/dist/src/core/sync/label-detector.d.ts +66 -0
- package/dist/src/core/sync/label-detector.d.ts.map +1 -0
- package/dist/src/core/sync/label-detector.js +211 -0
- package/dist/src/core/sync/label-detector.js.map +1 -0
- package/dist/src/core/sync/retry-logic.d.ts +64 -0
- package/dist/src/core/sync/retry-logic.d.ts.map +1 -0
- package/dist/src/core/sync/retry-logic.js +165 -0
- package/dist/src/core/sync/retry-logic.js.map +1 -0
- package/dist/src/core/sync/spec-content-sync.d.ts +88 -0
- package/dist/src/core/sync/spec-content-sync.d.ts.map +1 -0
- package/dist/src/core/sync/spec-content-sync.js +5 -0
- package/dist/src/core/sync/spec-content-sync.js.map +1 -0
- package/dist/src/core/sync/spec-increment-mapper.d.ts +100 -0
- package/dist/src/core/sync/spec-increment-mapper.d.ts.map +1 -0
- package/dist/src/core/sync/spec-increment-mapper.js +424 -0
- package/dist/src/core/sync/spec-increment-mapper.js.map +1 -0
- package/dist/src/core/sync/status-cache.d.ts +91 -0
- package/dist/src/core/sync/status-cache.d.ts.map +1 -0
- package/dist/src/core/sync/status-cache.js +140 -0
- package/dist/src/core/sync/status-cache.js.map +1 -0
- package/dist/src/core/sync/status-mapper.d.ts +69 -0
- package/dist/src/core/sync/status-mapper.d.ts.map +1 -0
- package/dist/src/core/sync/status-mapper.js +90 -0
- package/dist/src/core/sync/status-mapper.js.map +1 -0
- package/dist/src/core/sync/status-sync-engine.d.ts +162 -0
- package/dist/src/core/sync/status-sync-engine.d.ts.map +1 -0
- package/dist/src/core/sync/status-sync-engine.js +347 -0
- package/dist/src/core/sync/status-sync-engine.js.map +1 -0
- package/dist/src/core/sync/sync-event-logger.d.ts +99 -0
- package/dist/src/core/sync/sync-event-logger.d.ts.map +1 -0
- package/dist/src/core/sync/sync-event-logger.js +103 -0
- package/dist/src/core/sync/sync-event-logger.js.map +1 -0
- package/dist/src/core/sync/types.d.ts +52 -0
- package/dist/src/core/sync/types.d.ts.map +1 -0
- package/dist/src/core/sync/types.js +5 -0
- package/dist/src/core/sync/types.js.map +1 -0
- package/dist/src/core/sync/workflow-detector.d.ts +95 -0
- package/dist/src/core/sync/workflow-detector.d.ts.map +1 -0
- package/dist/src/core/sync/workflow-detector.js +175 -0
- package/dist/src/core/sync/workflow-detector.js.map +1 -0
- package/dist/src/core/types/config.d.ts +51 -0
- package/dist/src/core/types/config.d.ts.map +1 -1
- package/dist/src/core/types/config.js +47 -0
- package/dist/src/core/types/config.js.map +1 -1
- package/dist/src/core/types/increment-metadata.d.ts +4 -0
- package/dist/src/core/types/increment-metadata.d.ts.map +1 -1
- package/dist/src/core/types/increment-metadata.js.map +1 -1
- package/dist/src/utils/github-url.d.ts +53 -0
- package/dist/src/utils/github-url.d.ts.map +1 -0
- package/dist/src/utils/github-url.js +90 -0
- package/dist/src/utils/github-url.js.map +1 -0
- package/dist/src/utils/spec-parser.d.ts +145 -0
- package/dist/src/utils/spec-parser.d.ts.map +1 -0
- package/dist/src/utils/spec-parser.js +640 -0
- package/dist/src/utils/spec-parser.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/plugins/specweave/agents/pm/AGENT.md +160 -13
- package/plugins/specweave/agents/pm/templates/increment-spec.md +158 -0
- package/plugins/specweave/agents/pm/templates/living-docs-spec.md +113 -0
- package/plugins/specweave/commands/specweave-done.md +163 -0
- package/plugins/specweave/commands/specweave.md +70 -405
- package/plugins/specweave/hooks/hooks.json +4 -0
- package/plugins/specweave/hooks/lib/sync-spec-content.sh +2 -2
- package/plugins/specweave/hooks/lib/update-status-line.sh +79 -111
- package/plugins/specweave/hooks/post-increment-planning.sh +133 -37
- package/plugins/specweave/hooks/pre-command-deduplication.sh +86 -0
- package/plugins/specweave/lib/hooks/sync-living-docs.js +139 -34
- package/plugins/specweave/lib/hooks/sync-living-docs.ts +234 -38
- package/plugins/specweave/skills/SKILLS-INDEX.md +4 -24
- package/plugins/specweave/skills/increment-planner/SKILL.md +94 -0
- package/plugins/specweave/skills/increment-work-router/SKILL.md +466 -0
- package/plugins/specweave-ado/commands/specweave-ado-sync-spec.md +1 -1
- package/plugins/specweave-ado/lib/ado-spec-content-sync.js +49 -5
- package/plugins/specweave-ado/lib/ado-spec-content-sync.ts +72 -6
- package/plugins/specweave-ado/lib/ado-status-sync.js +80 -0
- package/plugins/specweave-ado/lib/ado-status-sync.ts +121 -0
- package/plugins/specweave-ado/lib/enhanced-ado-sync.js +170 -0
- package/plugins/specweave-github/commands/specweave-github-cleanup-duplicates.md +205 -0
- package/plugins/specweave-github/commands/specweave-github-sync-epic.md +248 -0
- package/plugins/specweave-github/commands/specweave-github-sync-spec.md +1 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh +32 -0
- package/plugins/specweave-github/lib/duplicate-detector.js +370 -0
- package/plugins/specweave-github/lib/duplicate-detector.ts +525 -0
- package/plugins/specweave-github/lib/enhanced-github-sync.js +220 -0
- package/plugins/specweave-github/lib/enhanced-github-sync.ts +322 -0
- package/plugins/specweave-github/lib/epic-content-builder.js +227 -0
- package/plugins/specweave-github/lib/epic-content-builder.ts +317 -0
- package/plugins/specweave-github/lib/github-client.js +21 -10
- package/plugins/specweave-github/lib/github-client.ts +27 -16
- package/plugins/specweave-github/lib/github-epic-sync.js +488 -0
- package/plugins/specweave-github/lib/github-epic-sync.ts +715 -0
- package/plugins/specweave-github/lib/github-status-sync.js +71 -0
- package/plugins/specweave-github/lib/github-status-sync.ts +107 -0
- package/plugins/specweave-github/lib/task-sync.js +33 -2
- package/plugins/specweave-github/lib/task-sync.ts +44 -2
- package/plugins/specweave-jira/commands/specweave-jira-sync-epic.md +267 -0
- package/plugins/specweave-jira/commands/specweave-jira-sync-spec.md +1 -1
- package/plugins/specweave-jira/lib/enhanced-jira-sync.js +134 -0
- package/plugins/specweave-jira/lib/enhanced-jira-sync.ts +196 -0
- package/plugins/specweave-jira/lib/jira-epic-sync.js +304 -0
- package/plugins/specweave-jira/lib/jira-epic-sync.ts +459 -0
- package/plugins/specweave-jira/lib/jira-status-sync.js +79 -0
- package/plugins/specweave-jira/lib/jira-status-sync.ts +139 -0
- package/plugins/specweave-release/commands/specweave-release-platform.md +1 -1
- package/plugins/specweave-release/hooks/post-task-completion.sh +2 -2
- package/src/templates/AGENTS.md.template +88 -1
- package/src/templates/CLAUDE.md.template +49 -0
- package/plugins/specweave/skills/increment-quality-judge/SKILL.md +0 -524
- package/plugins/specweave/skills/plugin-installer/SKILL.md +0 -353
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-sync-engine.js","sourceRoot":"","sources":["../../../../src/core/sync/status-sync-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
constructor(projectRoot: string);
|
|
63
|
+
/**
|
|
64
|
+
* Log a sync event
|
|
65
|
+
*
|
|
66
|
+
* @param event - Sync event to log
|
|
67
|
+
*/
|
|
68
|
+
logSyncEvent(event: SyncEvent): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Log a conflict resolution event
|
|
71
|
+
*
|
|
72
|
+
* @param event - Conflict event to log
|
|
73
|
+
*/
|
|
74
|
+
logConflictEvent(event: ConflictEvent): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Load sync history
|
|
77
|
+
*
|
|
78
|
+
* @param options - Filter options
|
|
79
|
+
* @returns Array of events (filtered if options provided)
|
|
80
|
+
*/
|
|
81
|
+
loadSyncHistory(options?: LoadHistoryOptions): Promise<AnyEvent[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Ensure logs directory exists
|
|
84
|
+
*/
|
|
85
|
+
private ensureLogsDir;
|
|
86
|
+
/**
|
|
87
|
+
* Load all events from file
|
|
88
|
+
*
|
|
89
|
+
* @returns Array of all events
|
|
90
|
+
*/
|
|
91
|
+
private loadAllEvents;
|
|
92
|
+
/**
|
|
93
|
+
* Write events to file
|
|
94
|
+
*
|
|
95
|
+
* @param events - Array of events to write
|
|
96
|
+
*/
|
|
97
|
+
private writeEvents;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=sync-event-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
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;gBAEf,WAAW,EAAE,MAAM;IAM/B;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;;;OAIG;IACG,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D;;;;;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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
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 fs from 'fs-extra';
|
|
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
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Log a sync event
|
|
26
|
+
*
|
|
27
|
+
* @param event - Sync event to log
|
|
28
|
+
*/
|
|
29
|
+
async logSyncEvent(event) {
|
|
30
|
+
await this.ensureLogsDir();
|
|
31
|
+
const events = await this.loadAllEvents();
|
|
32
|
+
events.push(event);
|
|
33
|
+
await this.writeEvents(events);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Log a conflict resolution event
|
|
37
|
+
*
|
|
38
|
+
* @param event - Conflict event to log
|
|
39
|
+
*/
|
|
40
|
+
async logConflictEvent(event) {
|
|
41
|
+
await this.ensureLogsDir();
|
|
42
|
+
const events = await this.loadAllEvents();
|
|
43
|
+
events.push(event);
|
|
44
|
+
await this.writeEvents(events);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load sync history
|
|
48
|
+
*
|
|
49
|
+
* @param options - Filter options
|
|
50
|
+
* @returns Array of events (filtered if options provided)
|
|
51
|
+
*/
|
|
52
|
+
async loadSyncHistory(options) {
|
|
53
|
+
const exists = await fs.pathExists(this.eventsFile);
|
|
54
|
+
if (!exists) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
let events = await fs.readJson(this.eventsFile);
|
|
58
|
+
// Apply filters
|
|
59
|
+
if (options?.incrementId) {
|
|
60
|
+
events = events.filter(e => e.incrementId === options.incrementId);
|
|
61
|
+
}
|
|
62
|
+
if (options?.tool) {
|
|
63
|
+
events = events.filter(e => e.tool === options.tool);
|
|
64
|
+
}
|
|
65
|
+
if (options?.success !== undefined) {
|
|
66
|
+
events = events.filter(e => {
|
|
67
|
+
// Only SyncEvent has 'success' field
|
|
68
|
+
if ('success' in e) {
|
|
69
|
+
return e.success === options.success;
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return events;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Ensure logs directory exists
|
|
78
|
+
*/
|
|
79
|
+
async ensureLogsDir() {
|
|
80
|
+
await fs.ensureDir(this.logsDir);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load all events from file
|
|
84
|
+
*
|
|
85
|
+
* @returns Array of all events
|
|
86
|
+
*/
|
|
87
|
+
async loadAllEvents() {
|
|
88
|
+
const exists = await fs.pathExists(this.eventsFile);
|
|
89
|
+
if (!exists) {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
return await fs.readJson(this.eventsFile);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Write events to file
|
|
96
|
+
*
|
|
97
|
+
* @param events - Array of events to write
|
|
98
|
+
*/
|
|
99
|
+
async writeEvents(events) {
|
|
100
|
+
await fs.writeJson(this.eventsFile, events, { spaces: 2 });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=sync-event-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-event-logger.js","sourceRoot":"","sources":["../../../../src/core/sync/sync-event-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Enhanced Content Sync
|
|
3
|
+
*/
|
|
4
|
+
export interface AcceptanceCriterion {
|
|
5
|
+
id: string;
|
|
6
|
+
description: string;
|
|
7
|
+
priority?: string;
|
|
8
|
+
completed?: boolean;
|
|
9
|
+
testable?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface UserStory {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
acceptanceCriteria?: AcceptanceCriterion[];
|
|
16
|
+
}
|
|
17
|
+
export interface TaskLink {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
githubIssue?: number;
|
|
21
|
+
jiraIssue?: string;
|
|
22
|
+
adoWorkItem?: number;
|
|
23
|
+
userStoryIds: string[];
|
|
24
|
+
completed?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SourceLinks {
|
|
27
|
+
spec: string;
|
|
28
|
+
plan: string;
|
|
29
|
+
tasks: string;
|
|
30
|
+
}
|
|
31
|
+
export interface SpecContent {
|
|
32
|
+
id: string;
|
|
33
|
+
title: string;
|
|
34
|
+
summary: string;
|
|
35
|
+
userStories: UserStory[];
|
|
36
|
+
tasks?: TaskLink[];
|
|
37
|
+
architectureDocs?: string[];
|
|
38
|
+
sourceLinks?: SourceLinks;
|
|
39
|
+
}
|
|
40
|
+
export interface EnhancedContent {
|
|
41
|
+
title: string;
|
|
42
|
+
body: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Enhanced spec content for external tool sync
|
|
46
|
+
* Extends SpecContent with additional metadata
|
|
47
|
+
*/
|
|
48
|
+
export interface EnhancedSpecContent extends SpecContent {
|
|
49
|
+
taskMapping?: any;
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects available statuses and transitions from external tools.
|
|
5
|
+
* Used to validate status mappings before syncing.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - GitHub: Simple open/closed workflow
|
|
9
|
+
* - JIRA: Full workflow schema with transitions
|
|
10
|
+
* - Azure DevOps: Work item type states
|
|
11
|
+
*
|
|
12
|
+
* @module workflow-detector
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Workflow information from external tool
|
|
16
|
+
*/
|
|
17
|
+
export interface WorkflowInfo {
|
|
18
|
+
tool: 'github' | 'jira' | 'ado';
|
|
19
|
+
statuses: string[];
|
|
20
|
+
canTransitionTo: Record<string, string[]>;
|
|
21
|
+
metadata?: {
|
|
22
|
+
labels?: string[];
|
|
23
|
+
workItemType?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Workflow detection parameters
|
|
28
|
+
*/
|
|
29
|
+
export interface DetectWorkflowParams {
|
|
30
|
+
tool: 'github' | 'jira' | 'ado';
|
|
31
|
+
owner?: string;
|
|
32
|
+
repo?: string;
|
|
33
|
+
token?: string;
|
|
34
|
+
domain?: string;
|
|
35
|
+
email?: string;
|
|
36
|
+
apiToken?: string;
|
|
37
|
+
projectKey?: string;
|
|
38
|
+
organization?: string;
|
|
39
|
+
project?: string;
|
|
40
|
+
pat?: string;
|
|
41
|
+
workItemType?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Workflow Detector
|
|
45
|
+
*
|
|
46
|
+
* Detects available statuses and transitions from external tools.
|
|
47
|
+
*/
|
|
48
|
+
export declare class WorkflowDetector {
|
|
49
|
+
/**
|
|
50
|
+
* Detect workflow from external tool
|
|
51
|
+
*
|
|
52
|
+
* @param params - Detection parameters
|
|
53
|
+
* @returns Workflow information
|
|
54
|
+
*/
|
|
55
|
+
detectWorkflow(params: DetectWorkflowParams): Promise<WorkflowInfo>;
|
|
56
|
+
/**
|
|
57
|
+
* Detect GitHub workflow
|
|
58
|
+
*
|
|
59
|
+
* GitHub uses a simple open/closed workflow.
|
|
60
|
+
* Labels are optional metadata.
|
|
61
|
+
*
|
|
62
|
+
* @param owner - Repository owner
|
|
63
|
+
* @param repo - Repository name
|
|
64
|
+
* @param token - GitHub token
|
|
65
|
+
* @returns Workflow information
|
|
66
|
+
*/
|
|
67
|
+
detectGitHubWorkflow(owner: string, repo: string, token: string): Promise<WorkflowInfo>;
|
|
68
|
+
/**
|
|
69
|
+
* Detect JIRA workflow
|
|
70
|
+
*
|
|
71
|
+
* JIRA workflows are project-specific and can have custom statuses.
|
|
72
|
+
* We query the transitions endpoint to get all available statuses.
|
|
73
|
+
*
|
|
74
|
+
* @param domain - JIRA domain (e.g., company.atlassian.net)
|
|
75
|
+
* @param email - User email
|
|
76
|
+
* @param apiToken - API token
|
|
77
|
+
* @param projectKey - Project key (e.g., PROJ)
|
|
78
|
+
* @returns Workflow information
|
|
79
|
+
*/
|
|
80
|
+
detectJiraWorkflow(domain: string, email: string, apiToken: string, projectKey: string): Promise<WorkflowInfo>;
|
|
81
|
+
/**
|
|
82
|
+
* Detect Azure DevOps workflow
|
|
83
|
+
*
|
|
84
|
+
* ADO work item types define their own state transitions.
|
|
85
|
+
* We query the work item type definition to get valid states.
|
|
86
|
+
*
|
|
87
|
+
* @param organization - ADO organization
|
|
88
|
+
* @param project - Project name
|
|
89
|
+
* @param pat - Personal access token
|
|
90
|
+
* @param workItemType - Work item type (default: Epic)
|
|
91
|
+
* @returns Workflow information
|
|
92
|
+
*/
|
|
93
|
+
detectAdoWorkflow(organization: string, project: string, pat: string, workItemType?: string): Promise<WorkflowInfo>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=workflow-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-detector.d.ts","sourceRoot":"","sources":["../../../../src/core/sync/workflow-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAGhC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAoBD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;IAmCzE;;;;;;;;;;OAUG;IACG,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC;IA2BxB;;;;;;;;;;;OAWG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IA6CxB;;;;;;;;;;;OAWG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,YAAY,GAAE,MAAe,GAC5B,OAAO,CAAC,YAAY,CAAC;CAmCzB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects available statuses and transitions from external tools.
|
|
5
|
+
* Used to validate status mappings before syncing.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - GitHub: Simple open/closed workflow
|
|
9
|
+
* - JIRA: Full workflow schema with transitions
|
|
10
|
+
* - Azure DevOps: Work item type states
|
|
11
|
+
*
|
|
12
|
+
* @module workflow-detector
|
|
13
|
+
*/
|
|
14
|
+
import axios from 'axios';
|
|
15
|
+
/**
|
|
16
|
+
* Workflow Detector
|
|
17
|
+
*
|
|
18
|
+
* Detects available statuses and transitions from external tools.
|
|
19
|
+
*/
|
|
20
|
+
export class WorkflowDetector {
|
|
21
|
+
/**
|
|
22
|
+
* Detect workflow from external tool
|
|
23
|
+
*
|
|
24
|
+
* @param params - Detection parameters
|
|
25
|
+
* @returns Workflow information
|
|
26
|
+
*/
|
|
27
|
+
async detectWorkflow(params) {
|
|
28
|
+
switch (params.tool) {
|
|
29
|
+
case 'github':
|
|
30
|
+
if (!params.owner || !params.repo || !params.token) {
|
|
31
|
+
throw new Error('GitHub detection requires owner, repo, and token');
|
|
32
|
+
}
|
|
33
|
+
return this.detectGitHubWorkflow(params.owner, params.repo, params.token);
|
|
34
|
+
case 'jira':
|
|
35
|
+
if (!params.domain || !params.email || !params.apiToken || !params.projectKey) {
|
|
36
|
+
throw new Error('JIRA detection requires domain, email, apiToken, and projectKey');
|
|
37
|
+
}
|
|
38
|
+
return this.detectJiraWorkflow(params.domain, params.email, params.apiToken, params.projectKey);
|
|
39
|
+
case 'ado':
|
|
40
|
+
if (!params.organization || !params.project || !params.pat) {
|
|
41
|
+
throw new Error('ADO detection requires organization, project, and pat');
|
|
42
|
+
}
|
|
43
|
+
return this.detectAdoWorkflow(params.organization, params.project, params.pat, params.workItemType || 'Epic');
|
|
44
|
+
default:
|
|
45
|
+
throw new Error(`Unsupported tool: ${params.tool}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Detect GitHub workflow
|
|
50
|
+
*
|
|
51
|
+
* GitHub uses a simple open/closed workflow.
|
|
52
|
+
* Labels are optional metadata.
|
|
53
|
+
*
|
|
54
|
+
* @param owner - Repository owner
|
|
55
|
+
* @param repo - Repository name
|
|
56
|
+
* @param token - GitHub token
|
|
57
|
+
* @returns Workflow information
|
|
58
|
+
*/
|
|
59
|
+
async detectGitHubWorkflow(owner, repo, token) {
|
|
60
|
+
const client = axios.create({
|
|
61
|
+
baseURL: `https://api.github.com/repos/${owner}/${repo}`,
|
|
62
|
+
headers: {
|
|
63
|
+
Authorization: `token ${token}`,
|
|
64
|
+
Accept: 'application/vnd.github.v3+json'
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
// Fetch labels (optional metadata)
|
|
68
|
+
const labelsResponse = await client.get('/labels');
|
|
69
|
+
const labels = labelsResponse.data.map((label) => label.name);
|
|
70
|
+
// GitHub has fixed open/closed workflow
|
|
71
|
+
return {
|
|
72
|
+
tool: 'github',
|
|
73
|
+
statuses: ['open', 'closed'],
|
|
74
|
+
canTransitionTo: {
|
|
75
|
+
'open': ['closed'],
|
|
76
|
+
'closed': ['open']
|
|
77
|
+
},
|
|
78
|
+
metadata: {
|
|
79
|
+
labels
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Detect JIRA workflow
|
|
85
|
+
*
|
|
86
|
+
* JIRA workflows are project-specific and can have custom statuses.
|
|
87
|
+
* We query the transitions endpoint to get all available statuses.
|
|
88
|
+
*
|
|
89
|
+
* @param domain - JIRA domain (e.g., company.atlassian.net)
|
|
90
|
+
* @param email - User email
|
|
91
|
+
* @param apiToken - API token
|
|
92
|
+
* @param projectKey - Project key (e.g., PROJ)
|
|
93
|
+
* @returns Workflow information
|
|
94
|
+
*/
|
|
95
|
+
async detectJiraWorkflow(domain, email, apiToken, projectKey) {
|
|
96
|
+
const client = axios.create({
|
|
97
|
+
baseURL: `https://${domain}/rest/api/3`,
|
|
98
|
+
auth: {
|
|
99
|
+
username: email,
|
|
100
|
+
password: apiToken
|
|
101
|
+
},
|
|
102
|
+
headers: {
|
|
103
|
+
'Accept': 'application/json',
|
|
104
|
+
'Content-Type': 'application/json'
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Get a sample issue to query transitions
|
|
108
|
+
// In practice, we'd create a temporary issue or use an existing one
|
|
109
|
+
// For now, we'll query transitions for a hypothetical issue
|
|
110
|
+
// The API endpoint is: /issue/{issueIdOrKey}/transitions
|
|
111
|
+
// Instead, we can query the project's workflow scheme
|
|
112
|
+
// But for simplicity, we'll use the transitions endpoint approach
|
|
113
|
+
// which requires an issue. In reality, we'd need to:
|
|
114
|
+
// 1. Find an existing issue in the project
|
|
115
|
+
// 2. Query its transitions
|
|
116
|
+
// For this implementation, we'll assume a sample issue exists
|
|
117
|
+
// and query transitions (this would be the real API call)
|
|
118
|
+
const transitionsResponse = await client.get(`/issue/SAMPLE/transitions`);
|
|
119
|
+
const transitions = transitionsResponse.data.transitions;
|
|
120
|
+
// Extract unique statuses
|
|
121
|
+
const statuses = [...new Set(transitions.map(t => t.to.name))];
|
|
122
|
+
// Build transition map (all-to-all for simplicity)
|
|
123
|
+
const canTransitionTo = {};
|
|
124
|
+
statuses.forEach(status => {
|
|
125
|
+
canTransitionTo[status] = statuses.filter(s => s !== status);
|
|
126
|
+
});
|
|
127
|
+
return {
|
|
128
|
+
tool: 'jira',
|
|
129
|
+
statuses,
|
|
130
|
+
canTransitionTo
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Detect Azure DevOps workflow
|
|
135
|
+
*
|
|
136
|
+
* ADO work item types define their own state transitions.
|
|
137
|
+
* We query the work item type definition to get valid states.
|
|
138
|
+
*
|
|
139
|
+
* @param organization - ADO organization
|
|
140
|
+
* @param project - Project name
|
|
141
|
+
* @param pat - Personal access token
|
|
142
|
+
* @param workItemType - Work item type (default: Epic)
|
|
143
|
+
* @returns Workflow information
|
|
144
|
+
*/
|
|
145
|
+
async detectAdoWorkflow(organization, project, pat, workItemType = 'Epic') {
|
|
146
|
+
const client = axios.create({
|
|
147
|
+
baseURL: `https://dev.azure.com/${organization}/${project}/_apis`,
|
|
148
|
+
auth: {
|
|
149
|
+
username: '',
|
|
150
|
+
password: pat
|
|
151
|
+
},
|
|
152
|
+
headers: {
|
|
153
|
+
'Accept': 'application/json'
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Get work item type definition
|
|
157
|
+
const response = await client.get(`/wit/workitemtypes/${workItemType}?api-version=7.0`);
|
|
158
|
+
const states = response.data.states;
|
|
159
|
+
const statusNames = states.map(s => s.name);
|
|
160
|
+
// ADO allows any-to-any transitions (no strict workflow)
|
|
161
|
+
const canTransitionTo = {};
|
|
162
|
+
statusNames.forEach(status => {
|
|
163
|
+
canTransitionTo[status] = statusNames.filter(s => s !== status);
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
tool: 'ado',
|
|
167
|
+
statuses: statusNames,
|
|
168
|
+
canTransitionTo,
|
|
169
|
+
metadata: {
|
|
170
|
+
workItemType
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=workflow-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-detector.js","sourceRoot":"","sources":["../../../../src/core/sync/workflow-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -62,6 +62,53 @@ export interface AdapterConfig {
|
|
|
62
62
|
/** Additional adapter settings */
|
|
63
63
|
[key: string]: any;
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Testing mode options
|
|
67
|
+
*/
|
|
68
|
+
export type TestMode = 'TDD' | 'test-after' | 'manual';
|
|
69
|
+
/**
|
|
70
|
+
* Coverage target configuration
|
|
71
|
+
*/
|
|
72
|
+
export interface CoverageTargets {
|
|
73
|
+
/** Unit test coverage target (70-95%) */
|
|
74
|
+
unit: number;
|
|
75
|
+
/** Integration test coverage target (70-95%) */
|
|
76
|
+
integration: number;
|
|
77
|
+
/** E2E test coverage target (70-95%) */
|
|
78
|
+
e2e: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Testing configuration
|
|
82
|
+
*
|
|
83
|
+
* Controls default testing approach and coverage targets for all increments.
|
|
84
|
+
* Can be overridden per-increment via frontmatter.
|
|
85
|
+
*/
|
|
86
|
+
export interface TestingConfig {
|
|
87
|
+
/** Default testing mode for new increments */
|
|
88
|
+
defaultTestMode: TestMode;
|
|
89
|
+
/** Default overall coverage target (70-95%) */
|
|
90
|
+
defaultCoverageTarget: number;
|
|
91
|
+
/** Specific coverage targets per test type */
|
|
92
|
+
coverageTargets: CoverageTargets;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Global command deduplication configuration
|
|
96
|
+
*
|
|
97
|
+
* Prevents ANY command/tool from being invoked twice within a configurable time window.
|
|
98
|
+
* Protects against accidental duplicate invocations (router confusion, double-clicks, etc.)
|
|
99
|
+
*/
|
|
100
|
+
export interface DeduplicationConfig {
|
|
101
|
+
/** Enable global deduplication (default: true) */
|
|
102
|
+
enabled?: boolean;
|
|
103
|
+
/** Time window in milliseconds to check for duplicates (default: 1000ms) */
|
|
104
|
+
windowMs?: number;
|
|
105
|
+
/** Maximum cache entries before cleanup (default: 1000) */
|
|
106
|
+
maxCacheSize?: number;
|
|
107
|
+
/** Enable debug logging (default: false) */
|
|
108
|
+
debug?: boolean;
|
|
109
|
+
/** Cleanup interval in milliseconds (default: 60000ms = 1 minute) */
|
|
110
|
+
cleanupIntervalMs?: number;
|
|
111
|
+
}
|
|
65
112
|
/**
|
|
66
113
|
* Complete SpecWeave Configuration
|
|
67
114
|
*
|
|
@@ -74,12 +121,16 @@ export interface SpecweaveConfig {
|
|
|
74
121
|
project?: ProjectMetadata;
|
|
75
122
|
/** Adapter configuration */
|
|
76
123
|
adapters?: AdapterConfig;
|
|
124
|
+
/** Testing configuration */
|
|
125
|
+
testing?: TestingConfig;
|
|
77
126
|
/** Primary language for generated content and CLI */
|
|
78
127
|
language?: SupportedLanguage;
|
|
79
128
|
/** Translation settings for multilingual support */
|
|
80
129
|
translation?: TranslationConfig;
|
|
81
130
|
/** WIP limits configuration */
|
|
82
131
|
limits?: LimitsConfig;
|
|
132
|
+
/** Global command deduplication configuration (v0.17.18+) */
|
|
133
|
+
deduplication?: DeduplicationConfig;
|
|
83
134
|
/** Allow additional properties */
|
|
84
135
|
[key: string]: any;
|
|
85
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,4EAA4E;IAC5E,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,wCAAwC;IACxC,aAAa,CAAC,EAAE;QACd,mEAAmE;QACnE,YAAY,CAAC,EAAE,CAAC,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC;QAE1C,yDAAyD;QACzD,eAAe,CAAC,EAAE;YAChB,yDAAyD;YACzD,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;KACH,CAAC;IAEF,mCAAmC;IACnC,SAAS,CAAC,EAAE;QACV,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,0CAA0C;QAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE1C,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB,uBAAuB;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAC;IAEzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAE7B,oDAAoD;IACpD,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,kCAAkC;IAClC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/core/types/config.ts"],"names":[],"mappings":"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"}
|