specweave 2.0.0 → 2.1.0
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-plugin/marketplace.json +3 -3
- package/README.md +15 -6
- package/dist/dashboard/assets/index-BeKUULf0.css +1 -0
- package/dist/dashboard/assets/index-Bf5TF0_l.js +13 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/src/cli/commands/sync.d.ts.map +1 -1
- package/dist/src/cli/commands/sync.js +23 -5
- package/dist/src/cli/commands/sync.js.map +1 -1
- package/dist/src/core/doctor/checkers/hooks-checker.d.ts +2 -2
- package/dist/src/core/doctor/checkers/hooks-checker.d.ts.map +1 -1
- package/dist/src/core/doctor/checkers/hooks-checker.js +6 -5
- package/dist/src/core/doctor/checkers/hooks-checker.js.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/session-start.js +20 -0
- package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
- package/dist/src/core/intent/portable-context.d.ts +4 -0
- package/dist/src/core/intent/portable-context.d.ts.map +1 -0
- package/dist/src/core/intent/portable-context.js +68 -0
- package/dist/src/core/intent/portable-context.js.map +1 -0
- package/dist/src/core/intent/types.d.ts +28 -0
- package/dist/src/core/intent/types.d.ts.map +1 -0
- package/dist/src/core/intent/types.js +3 -0
- package/dist/src/core/intent/types.js.map +1 -0
- package/dist/src/core/intent/validation.d.ts +5 -0
- package/dist/src/core/intent/validation.d.ts.map +1 -0
- package/dist/src/core/intent/validation.js +39 -0
- package/dist/src/core/intent/validation.js.map +1 -0
- package/dist/src/core/session/handoff-git-state.d.ts +3 -14
- package/dist/src/core/session/handoff-git-state.d.ts.map +1 -1
- package/dist/src/core/session/handoff-git-state.js +68 -124
- package/dist/src/core/session/handoff-git-state.js.map +1 -1
- package/dist/src/core/session/handoff-pointer.d.ts +4 -0
- package/dist/src/core/session/handoff-pointer.d.ts.map +1 -0
- package/dist/src/core/session/handoff-pointer.js +60 -0
- package/dist/src/core/session/handoff-pointer.js.map +1 -0
- package/dist/src/core/session/work-handoff.d.ts.map +1 -1
- package/dist/src/core/session/work-handoff.js +10 -3
- package/dist/src/core/session/work-handoff.js.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.d.ts +1 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +10 -90
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/dashboard/server/data/cost-aggregator.d.ts +10 -5
- package/dist/src/dashboard/server/data/cost-aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/cost-aggregator.js +31 -33
- package/dist/src/dashboard/server/data/cost-aggregator.js.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +0 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +14 -66
- package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
- package/dist/src/dashboard/server/data/dashboard-task-board.d.ts +4 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.js +56 -0
- package/dist/src/dashboard/server/data/dashboard-task-board.js.map +1 -0
- package/dist/src/dashboard/server/data/intent-store.d.ts +19 -0
- package/dist/src/dashboard/server/data/intent-store.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/intent-store.js +268 -0
- package/dist/src/dashboard/server/data/intent-store.js.map +1 -0
- package/dist/src/dashboard/server/data/local-sessions.d.ts +15 -0
- package/dist/src/dashboard/server/data/local-sessions.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/local-sessions.js +197 -0
- package/dist/src/dashboard/server/data/local-sessions.js.map +1 -0
- package/dist/src/dashboard/server/data/work-projection.d.ts +8 -0
- package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/work-projection.js +175 -0
- package/dist/src/dashboard/server/data/work-projection.js.map +1 -0
- package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -1
- package/dist/src/dashboard/server/file-watcher.js +2 -1
- package/dist/src/dashboard/server/file-watcher.js.map +1 -1
- package/dist/src/dashboard/server/local-request.d.ts +4 -0
- package/dist/src/dashboard/server/local-request.d.ts.map +1 -0
- package/dist/src/dashboard/server/local-request.js +29 -0
- package/dist/src/dashboard/server/local-request.js.map +1 -0
- package/dist/src/dashboard/server/routes/work-routes.d.ts +5 -0
- package/dist/src/dashboard/server/routes/work-routes.d.ts.map +1 -0
- package/dist/src/dashboard/server/routes/work-routes.js +37 -0
- package/dist/src/dashboard/server/routes/work-routes.js.map +1 -0
- package/dist/src/dashboard/types.d.ts +3 -3
- package/dist/src/dashboard/types.d.ts.map +1 -1
- package/dist/src/dashboard/work-types.d.ts +39 -0
- package/dist/src/dashboard/work-types.d.ts.map +1 -0
- package/dist/src/dashboard/work-types.js +3 -0
- package/dist/src/dashboard/work-types.js.map +1 -0
- package/dist/src/sync/external-change-puller.d.ts +19 -0
- package/dist/src/sync/external-change-puller.d.ts.map +1 -1
- package/dist/src/sync/external-change-puller.js +87 -77
- package/dist/src/sync/external-change-puller.js.map +1 -1
- package/package.json +3 -3
- package/plugins/specweave/.claude-plugin/plugin.json +2 -2
- package/plugins/specweave/hooks/hooks.json +3 -30
- package/plugins/specweave/hooks/run-worker.mjs +229 -0
- package/plugins/specweave/hooks/run.mjs +83 -217
- package/plugins/specweave/skills/increment/SKILL.md +7 -5
- package/src/templates/AGENTS.md.template +5 -5
- package/src/templates/CLAUDE.md.template +5 -5
- package/dist/dashboard/assets/index-BiJhGDZV.js +0 -13
- package/dist/dashboard/assets/index-heYRtWFf.css +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** Dashboard projections extend the portable core intent contract. */
|
|
2
|
+
export * from '../core/intent/types.js';
|
|
3
|
+
import type { WorkIntent, WorkState } from '../core/intent/types.js';
|
|
4
|
+
export interface WorkItem extends WorkIntent {
|
|
5
|
+
source: 'increment' | 'intent';
|
|
6
|
+
incrementStatus: string | null;
|
|
7
|
+
tasks: {
|
|
8
|
+
total: number;
|
|
9
|
+
done: number;
|
|
10
|
+
skipped: number;
|
|
11
|
+
claimed: number;
|
|
12
|
+
blocked: number;
|
|
13
|
+
stale: number;
|
|
14
|
+
open: number;
|
|
15
|
+
};
|
|
16
|
+
acs: {
|
|
17
|
+
total: number;
|
|
18
|
+
done: number;
|
|
19
|
+
};
|
|
20
|
+
verification: {
|
|
21
|
+
status: 'passed' | 'failed' | 'stale' | 'missing';
|
|
22
|
+
ranAt: string | null;
|
|
23
|
+
};
|
|
24
|
+
evidenceCount: number;
|
|
25
|
+
handoff: string | null;
|
|
26
|
+
}
|
|
27
|
+
export interface WorkBoardPayload {
|
|
28
|
+
items: WorkItem[];
|
|
29
|
+
counts: Record<WorkState, number>;
|
|
30
|
+
totals: {
|
|
31
|
+
tasks: number;
|
|
32
|
+
done: number;
|
|
33
|
+
verified: number;
|
|
34
|
+
handoffs: number;
|
|
35
|
+
};
|
|
36
|
+
generatedAt: string;
|
|
37
|
+
warnings: string[];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=work-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-types.d.ts","sourceRoot":"","sources":["../../../src/dashboard/work-types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,yBAAyB,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACrE,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC,YAAY,EAAE;QAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AACD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-types.js","sourceRoot":"","sources":["../../../src/dashboard/work-types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,cAAc,yBAAyB,CAAC"}
|
|
@@ -32,6 +32,17 @@ export interface ExternalChange {
|
|
|
32
32
|
assignee: string | null;
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
|
+
export interface ExternalPullFailure {
|
|
36
|
+
platform: ExternalChange['platform'];
|
|
37
|
+
message: string;
|
|
38
|
+
}
|
|
39
|
+
/** A rejected fetch must not be mistaken for a complete synchronization. */
|
|
40
|
+
export declare class ExternalPullError extends Error {
|
|
41
|
+
readonly changes: ExternalChange[];
|
|
42
|
+
readonly failures: ExternalPullFailure[];
|
|
43
|
+
readonly completedPlatforms: ExternalChange['platform'][];
|
|
44
|
+
constructor(changes: ExternalChange[], failures: ExternalPullFailure[], completedPlatforms: ExternalChange['platform'][]);
|
|
45
|
+
}
|
|
35
46
|
/**
|
|
36
47
|
* External change puller options
|
|
37
48
|
*/
|
|
@@ -48,6 +59,12 @@ export interface ExternalChangePullerOptions {
|
|
|
48
59
|
* Platforms to pull from
|
|
49
60
|
*/
|
|
50
61
|
platforms?: Array<'ado' | 'jira' | 'github'>;
|
|
62
|
+
/** Explicit tracker repository; takes precedence over the checkout remote. */
|
|
63
|
+
github?: {
|
|
64
|
+
owner: string;
|
|
65
|
+
repo: string;
|
|
66
|
+
token?: string;
|
|
67
|
+
};
|
|
51
68
|
}
|
|
52
69
|
/**
|
|
53
70
|
* ExternalChangePuller - Fetches changes from external tools
|
|
@@ -59,6 +76,7 @@ export declare class ExternalChangePuller {
|
|
|
59
76
|
private readonly projectRoot;
|
|
60
77
|
private readonly logger;
|
|
61
78
|
private readonly platforms;
|
|
79
|
+
private readonly github?;
|
|
62
80
|
constructor(options: ExternalChangePullerOptions);
|
|
63
81
|
/**
|
|
64
82
|
* Fetch recent changes from all configured platforms
|
|
@@ -66,6 +84,7 @@ export declare class ExternalChangePuller {
|
|
|
66
84
|
* @param since - Timestamp to query changes from
|
|
67
85
|
* @param linkedItems - Optional map of platform -> item IDs to filter
|
|
68
86
|
* @returns Array of external changes from all platforms
|
|
87
|
+
* @throws ExternalPullError with successful results when any provider fails
|
|
69
88
|
*/
|
|
70
89
|
fetchRecentChanges(since: Date, linkedItems?: {
|
|
71
90
|
ado?: number[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-change-puller.d.ts","sourceRoot":"","sources":["../../../src/sync/external-change-puller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"external-change-puller.d.ts","sourceRoot":"","sources":["../../../src/sync/external-change-puller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AAK3D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,KAAK,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4EAA4E;AAC5E,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,OAAO,EAAE,cAAc,EAAE;aACzB,QAAQ,EAAE,mBAAmB,EAAE;aAC/B,kBAAkB,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE;gBAFhD,OAAO,EAAE,cAAc,EAAE,EACzB,QAAQ,EAAE,mBAAmB,EAAE,EAC/B,kBAAkB,EAAE,cAAc,CAAC,UAAU,CAAC,EAAE;CAKnE;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IAC7C,8EAA8E;IAC9E,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAwC;gBAEpD,OAAO,EAAE,2BAA2B;IAOhD;;;;;;;OAOG;IACG,kBAAkB,CACtB,KAAK,EAAE,IAAI,EACX,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,GACA,OAAO,CAAC,cAAc,EAAE,CAAC;IAuD5B;;OAEG;YACW,eAAe;IAyB7B;;OAEG;YACW,gBAAgB;IAyB9B;;OAEG;YACW,kBAAkB;IAoChC;;;;OAIG;IACH,oBAAoB,CAClB,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EACnC,cAAc,EAAE,MAAM,GACrB,MAAM;CA0BV"}
|
|
@@ -12,6 +12,17 @@
|
|
|
12
12
|
* @module sync/external-change-puller
|
|
13
13
|
*/
|
|
14
14
|
import { consoleLogger } from '../utils/logger.js';
|
|
15
|
+
import { maskCredentials } from '../utils/credential-masker.js';
|
|
16
|
+
/** A rejected fetch must not be mistaken for a complete synchronization. */
|
|
17
|
+
export class ExternalPullError extends Error {
|
|
18
|
+
constructor(changes, failures, completedPlatforms) {
|
|
19
|
+
super(`External pull incomplete: ${failures.map(f => f.platform).join(', ')}.`);
|
|
20
|
+
this.changes = changes;
|
|
21
|
+
this.failures = failures;
|
|
22
|
+
this.completedPlatforms = completedPlatforms;
|
|
23
|
+
this.name = 'ExternalPullError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
15
26
|
/**
|
|
16
27
|
* ExternalChangePuller - Fetches changes from external tools
|
|
17
28
|
*
|
|
@@ -23,6 +34,7 @@ export class ExternalChangePuller {
|
|
|
23
34
|
this.projectRoot = options.projectRoot;
|
|
24
35
|
this.logger = options.logger ?? consoleLogger;
|
|
25
36
|
this.platforms = options.platforms ?? ['ado', 'jira', 'github'];
|
|
37
|
+
this.github = options.github;
|
|
26
38
|
}
|
|
27
39
|
/**
|
|
28
40
|
* Fetch recent changes from all configured platforms
|
|
@@ -30,30 +42,42 @@ export class ExternalChangePuller {
|
|
|
30
42
|
* @param since - Timestamp to query changes from
|
|
31
43
|
* @param linkedItems - Optional map of platform -> item IDs to filter
|
|
32
44
|
* @returns Array of external changes from all platforms
|
|
45
|
+
* @throws ExternalPullError with successful results when any provider fails
|
|
33
46
|
*/
|
|
34
47
|
async fetchRecentChanges(since, linkedItems) {
|
|
35
48
|
const allChanges = [];
|
|
49
|
+
const failures = [];
|
|
50
|
+
const recordFailure = (platform, error) => {
|
|
51
|
+
const message = maskCredentials(error instanceof Error ? error.message : String(error));
|
|
52
|
+
failures.push({ platform, message });
|
|
53
|
+
this.logger.warn(`${platform} fetch failed: ${message}`);
|
|
54
|
+
};
|
|
36
55
|
this.logger.log(`⬇️ Fetching changes since ${since.toISOString()}`);
|
|
37
56
|
// Fetch from each platform in parallel
|
|
38
57
|
const fetchPromises = [];
|
|
39
58
|
if (this.platforms.includes('ado')) {
|
|
40
59
|
fetchPromises.push(this.fetchAdoChanges(since, linkedItems?.ado)
|
|
41
60
|
.then(changes => { allChanges.push(...changes); })
|
|
42
|
-
.catch(err => {
|
|
61
|
+
.catch(err => { recordFailure('ado', err); }));
|
|
43
62
|
}
|
|
44
63
|
if (this.platforms.includes('jira')) {
|
|
45
64
|
fetchPromises.push(this.fetchJiraChanges(since, linkedItems?.jira)
|
|
46
65
|
.then(changes => { allChanges.push(...changes); })
|
|
47
|
-
.catch(err => {
|
|
66
|
+
.catch(err => { recordFailure('jira', err); }));
|
|
48
67
|
}
|
|
49
68
|
if (this.platforms.includes('github')) {
|
|
50
69
|
fetchPromises.push(this.fetchGitHubChanges(since, linkedItems?.github)
|
|
51
70
|
.then(changes => { allChanges.push(...changes); })
|
|
52
|
-
.catch(err => {
|
|
71
|
+
.catch(err => { recordFailure('github', err); }));
|
|
53
72
|
}
|
|
54
73
|
await Promise.all(fetchPromises);
|
|
55
74
|
// Sort by changedAt (most recent first)
|
|
56
75
|
allChanges.sort((a, b) => new Date(b.changedAt).getTime() - new Date(a.changedAt).getTime());
|
|
76
|
+
if (failures.length > 0) {
|
|
77
|
+
failures.sort((a, b) => a.platform.localeCompare(b.platform));
|
|
78
|
+
const completed = this.platforms.filter(platform => !failures.some(f => f.platform === platform));
|
|
79
|
+
throw new ExternalPullError(allChanges, failures, completed);
|
|
80
|
+
}
|
|
57
81
|
this.logger.log(`📥 Fetched ${allChanges.length} changes from external tools`);
|
|
58
82
|
return allChanges;
|
|
59
83
|
}
|
|
@@ -61,91 +85,77 @@ export class ExternalChangePuller {
|
|
|
61
85
|
* Fetch changes from Azure DevOps
|
|
62
86
|
*/
|
|
63
87
|
async fetchAdoChanges(since, linkedItemIds) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}));
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
this.logger.debug(`ADO not configured or error: ${err.message}`);
|
|
85
|
-
return [];
|
|
86
|
-
}
|
|
88
|
+
// Dynamic import to avoid initialization errors when ADO is not configured
|
|
89
|
+
const { AdoClient } = await import('../integrations/ado/ado-client.js');
|
|
90
|
+
const client = new AdoClient();
|
|
91
|
+
const adoChanges = await client.fetchRecentChanges(since, linkedItemIds);
|
|
92
|
+
// Map to unified format
|
|
93
|
+
return adoChanges.map(change => ({
|
|
94
|
+
platform: 'ado',
|
|
95
|
+
externalId: change.externalId,
|
|
96
|
+
changedAt: change.changedAt,
|
|
97
|
+
changedBy: change.changedBy,
|
|
98
|
+
changedFields: change.changedFields,
|
|
99
|
+
currentState: {
|
|
100
|
+
status: change.currentState.status,
|
|
101
|
+
priority: change.currentState.priority,
|
|
102
|
+
assignee: change.currentState.assignee,
|
|
103
|
+
},
|
|
104
|
+
}));
|
|
87
105
|
}
|
|
88
106
|
/**
|
|
89
107
|
* Fetch changes from JIRA
|
|
90
108
|
*/
|
|
91
109
|
async fetchJiraChanges(since, linkedIssueKeys) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
this.logger.debug(`JIRA not configured or error: ${err.message}`);
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
110
|
+
// Dynamic import to avoid initialization errors when JIRA is not configured
|
|
111
|
+
const { JiraClient } = await import('../integrations/jira/jira-client.js');
|
|
112
|
+
const client = new JiraClient();
|
|
113
|
+
const jiraChanges = await client.fetchRecentChanges(since, linkedIssueKeys);
|
|
114
|
+
// Map to unified format
|
|
115
|
+
return jiraChanges.map(change => ({
|
|
116
|
+
platform: 'jira',
|
|
117
|
+
externalId: change.externalId,
|
|
118
|
+
changedAt: change.changedAt,
|
|
119
|
+
changedBy: change.changedBy,
|
|
120
|
+
changedFields: change.changedFields,
|
|
121
|
+
currentState: {
|
|
122
|
+
status: change.currentState.status,
|
|
123
|
+
priority: change.currentState.priority,
|
|
124
|
+
assignee: change.currentState.assignee,
|
|
125
|
+
},
|
|
126
|
+
}));
|
|
115
127
|
}
|
|
116
128
|
/**
|
|
117
129
|
* Fetch changes from GitHub
|
|
118
130
|
*/
|
|
119
131
|
async fetchGitHubChanges(since, linkedIssueNumbers) {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
this.logger.debug('GitHub: No git remote detected');
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
129
|
-
const client = GitHubClientV2.fromRepo(detected.owner, detected.repo);
|
|
130
|
-
const githubChanges = await client.fetchRecentChanges(since, linkedIssueNumbers);
|
|
131
|
-
// Map to unified format (GitHub returns slightly different format)
|
|
132
|
-
return githubChanges.map(change => ({
|
|
133
|
-
platform: 'github',
|
|
134
|
-
externalId: change.externalId,
|
|
135
|
-
changedAt: change.changedAt,
|
|
136
|
-
changedBy: change.changedBy,
|
|
137
|
-
changedFields: change.changedFields,
|
|
138
|
-
currentState: {
|
|
139
|
-
status: change.currentState.status,
|
|
140
|
-
priority: null, // GitHub doesn't have priority
|
|
141
|
-
assignee: change.currentState.assignee,
|
|
142
|
-
},
|
|
143
|
-
}));
|
|
144
|
-
}
|
|
145
|
-
catch (err) {
|
|
146
|
-
this.logger.debug(`GitHub not configured or error: ${err.message}`);
|
|
147
|
-
return [];
|
|
132
|
+
// Dynamic import to avoid initialization errors when GitHub is not configured
|
|
133
|
+
const { GitHubClientV2 } = await import('../../plugins/specweave/lib/integrations/github/github-client-v2.js');
|
|
134
|
+
// Detect repo from git remote
|
|
135
|
+
const detected = this.github ?? await GitHubClientV2.detectRepo(this.projectRoot);
|
|
136
|
+
if (!detected) {
|
|
137
|
+
throw new Error('No GitHub repository configured and no GitHub remote detected. Run specweave sync setup.');
|
|
148
138
|
}
|
|
139
|
+
const client = new GitHubClientV2({
|
|
140
|
+
provider: 'github',
|
|
141
|
+
displayName: `${detected.owner}/${detected.repo}`,
|
|
142
|
+
config: { owner: detected.owner, repo: detected.repo, ...(this.github?.token ? { token: this.github.token } : {}) },
|
|
143
|
+
timeRange: { default: '1M', max: '6M' },
|
|
144
|
+
}, this.projectRoot);
|
|
145
|
+
const githubChanges = await client.fetchRecentChanges(since, linkedIssueNumbers);
|
|
146
|
+
// Map to unified format (GitHub returns slightly different format)
|
|
147
|
+
return githubChanges.map(change => ({
|
|
148
|
+
platform: 'github',
|
|
149
|
+
externalId: change.externalId,
|
|
150
|
+
changedAt: change.changedAt,
|
|
151
|
+
changedBy: change.changedBy,
|
|
152
|
+
changedFields: change.changedFields,
|
|
153
|
+
currentState: {
|
|
154
|
+
status: change.currentState.status,
|
|
155
|
+
priority: null, // GitHub doesn't have priority
|
|
156
|
+
assignee: change.currentState.assignee,
|
|
157
|
+
},
|
|
158
|
+
}));
|
|
149
159
|
}
|
|
150
160
|
/**
|
|
151
161
|
* Map external status to SpecWeave status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-change-puller.js","sourceRoot":"","sources":["../../../src/sync/external-change-puller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAU,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"external-change-puller.js","sourceRoot":"","sources":["../../../src/sync/external-change-puller.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specweave",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Keep intent, specifications, and verified progress portable across AI coding tools. A local live work board, append-only task evidence, explicit handoffs, and optional GitHub/Jira/Azure DevOps integrations.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"specweave": "./bin/specweave.js"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"preinstall": "node scripts/check-node-version.js || exit 0",
|
|
11
11
|
"preuninstall": "node scripts/preuninstall.cjs",
|
|
12
12
|
"version": "node scripts/build/auto-changelog.js && node scripts/build/stamp-plugin-version.cjs && git add CHANGELOG.md plugins/specweave/.claude-plugin/plugin.json .claude-plugin/marketplace.json",
|
|
13
|
-
"postversion": "echo '
|
|
13
|
+
"postversion": "echo '\u2705 Version bumped with CHANGELOG entry'",
|
|
14
14
|
"clean": "rm -rf dist/",
|
|
15
15
|
"build": "tsc && npm run build:dashboard && npm run copy:locales && npm run copy:plugins && npm run copy:hook-deps && npm run copy:adapters && npm run stamp:plugin-version",
|
|
16
16
|
"stamp:plugin-version": "node scripts/build/stamp-plugin-version.cjs",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sw",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "2.
|
|
3
|
+
"description": "Portable intent and verified progress across coding tools. Ten focused workflow skills, two default lifecycle hooks, and a deterministic CLI and live local dashboard.",
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SpecWeave Team",
|
|
7
7
|
"url": "https://spec-weave.com"
|
|
@@ -1,26 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"description": "
|
|
2
|
+
"description": "Minimal hooks: compact session context and an opt-in auto loop. Handoffs are explicit CLI actions.",
|
|
3
3
|
"hooks": {
|
|
4
4
|
"SessionStart": [
|
|
5
5
|
{
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
8
8
|
"type": "command",
|
|
9
|
-
"command": "node",
|
|
10
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs", "session-start"],
|
|
11
|
-
"timeout": 10
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
"PreToolUse": [
|
|
17
|
-
{
|
|
18
|
-
"matcher": "Write|Edit",
|
|
19
|
-
"hooks": [
|
|
20
|
-
{
|
|
21
|
-
"type": "command",
|
|
22
|
-
"command": "node",
|
|
23
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs", "pre-tool-use"],
|
|
9
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs\" session-start",
|
|
24
10
|
"timeout": 10
|
|
25
11
|
}
|
|
26
12
|
]
|
|
@@ -31,24 +17,11 @@
|
|
|
31
17
|
"hooks": [
|
|
32
18
|
{
|
|
33
19
|
"type": "command",
|
|
34
|
-
"command": "node",
|
|
35
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs", "stop"],
|
|
20
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs\" stop",
|
|
36
21
|
"timeout": 30
|
|
37
22
|
}
|
|
38
23
|
]
|
|
39
24
|
}
|
|
40
|
-
],
|
|
41
|
-
"PreCompact": [
|
|
42
|
-
{
|
|
43
|
-
"hooks": [
|
|
44
|
-
{
|
|
45
|
-
"type": "command",
|
|
46
|
-
"command": "node",
|
|
47
|
-
"args": ["${CLAUDE_PLUGIN_ROOT}/hooks/run.mjs", "pre-compact"],
|
|
48
|
-
"timeout": 10
|
|
49
|
-
}
|
|
50
|
-
]
|
|
51
|
-
}
|
|
52
25
|
]
|
|
53
26
|
}
|
|
54
27
|
}
|