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.
Files changed (97) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +15 -6
  3. package/dist/dashboard/assets/index-BeKUULf0.css +1 -0
  4. package/dist/dashboard/assets/index-Bf5TF0_l.js +13 -0
  5. package/dist/dashboard/index.html +2 -2
  6. package/dist/src/cli/commands/sync.d.ts.map +1 -1
  7. package/dist/src/cli/commands/sync.js +23 -5
  8. package/dist/src/cli/commands/sync.js.map +1 -1
  9. package/dist/src/core/doctor/checkers/hooks-checker.d.ts +2 -2
  10. package/dist/src/core/doctor/checkers/hooks-checker.d.ts.map +1 -1
  11. package/dist/src/core/doctor/checkers/hooks-checker.js +6 -5
  12. package/dist/src/core/doctor/checkers/hooks-checker.js.map +1 -1
  13. package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
  14. package/dist/src/core/hooks/handlers/session-start.js +20 -0
  15. package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
  16. package/dist/src/core/intent/portable-context.d.ts +4 -0
  17. package/dist/src/core/intent/portable-context.d.ts.map +1 -0
  18. package/dist/src/core/intent/portable-context.js +68 -0
  19. package/dist/src/core/intent/portable-context.js.map +1 -0
  20. package/dist/src/core/intent/types.d.ts +28 -0
  21. package/dist/src/core/intent/types.d.ts.map +1 -0
  22. package/dist/src/core/intent/types.js +3 -0
  23. package/dist/src/core/intent/types.js.map +1 -0
  24. package/dist/src/core/intent/validation.d.ts +5 -0
  25. package/dist/src/core/intent/validation.d.ts.map +1 -0
  26. package/dist/src/core/intent/validation.js +39 -0
  27. package/dist/src/core/intent/validation.js.map +1 -0
  28. package/dist/src/core/session/handoff-git-state.d.ts +3 -14
  29. package/dist/src/core/session/handoff-git-state.d.ts.map +1 -1
  30. package/dist/src/core/session/handoff-git-state.js +68 -124
  31. package/dist/src/core/session/handoff-git-state.js.map +1 -1
  32. package/dist/src/core/session/handoff-pointer.d.ts +4 -0
  33. package/dist/src/core/session/handoff-pointer.d.ts.map +1 -0
  34. package/dist/src/core/session/handoff-pointer.js +60 -0
  35. package/dist/src/core/session/handoff-pointer.js.map +1 -0
  36. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  37. package/dist/src/core/session/work-handoff.js +10 -3
  38. package/dist/src/core/session/work-handoff.js.map +1 -1
  39. package/dist/src/dashboard/server/dashboard-server.d.ts +1 -0
  40. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
  41. package/dist/src/dashboard/server/dashboard-server.js +10 -90
  42. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  43. package/dist/src/dashboard/server/data/cost-aggregator.d.ts +10 -5
  44. package/dist/src/dashboard/server/data/cost-aggregator.d.ts.map +1 -1
  45. package/dist/src/dashboard/server/data/cost-aggregator.js +31 -33
  46. package/dist/src/dashboard/server/data/cost-aggregator.js.map +1 -1
  47. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +0 -1
  48. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
  49. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +14 -66
  50. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
  51. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts +4 -0
  52. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts.map +1 -0
  53. package/dist/src/dashboard/server/data/dashboard-task-board.js +56 -0
  54. package/dist/src/dashboard/server/data/dashboard-task-board.js.map +1 -0
  55. package/dist/src/dashboard/server/data/intent-store.d.ts +19 -0
  56. package/dist/src/dashboard/server/data/intent-store.d.ts.map +1 -0
  57. package/dist/src/dashboard/server/data/intent-store.js +268 -0
  58. package/dist/src/dashboard/server/data/intent-store.js.map +1 -0
  59. package/dist/src/dashboard/server/data/local-sessions.d.ts +15 -0
  60. package/dist/src/dashboard/server/data/local-sessions.d.ts.map +1 -0
  61. package/dist/src/dashboard/server/data/local-sessions.js +197 -0
  62. package/dist/src/dashboard/server/data/local-sessions.js.map +1 -0
  63. package/dist/src/dashboard/server/data/work-projection.d.ts +8 -0
  64. package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -0
  65. package/dist/src/dashboard/server/data/work-projection.js +175 -0
  66. package/dist/src/dashboard/server/data/work-projection.js.map +1 -0
  67. package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -1
  68. package/dist/src/dashboard/server/file-watcher.js +2 -1
  69. package/dist/src/dashboard/server/file-watcher.js.map +1 -1
  70. package/dist/src/dashboard/server/local-request.d.ts +4 -0
  71. package/dist/src/dashboard/server/local-request.d.ts.map +1 -0
  72. package/dist/src/dashboard/server/local-request.js +29 -0
  73. package/dist/src/dashboard/server/local-request.js.map +1 -0
  74. package/dist/src/dashboard/server/routes/work-routes.d.ts +5 -0
  75. package/dist/src/dashboard/server/routes/work-routes.d.ts.map +1 -0
  76. package/dist/src/dashboard/server/routes/work-routes.js +37 -0
  77. package/dist/src/dashboard/server/routes/work-routes.js.map +1 -0
  78. package/dist/src/dashboard/types.d.ts +3 -3
  79. package/dist/src/dashboard/types.d.ts.map +1 -1
  80. package/dist/src/dashboard/work-types.d.ts +39 -0
  81. package/dist/src/dashboard/work-types.d.ts.map +1 -0
  82. package/dist/src/dashboard/work-types.js +3 -0
  83. package/dist/src/dashboard/work-types.js.map +1 -0
  84. package/dist/src/sync/external-change-puller.d.ts +19 -0
  85. package/dist/src/sync/external-change-puller.d.ts.map +1 -1
  86. package/dist/src/sync/external-change-puller.js +87 -77
  87. package/dist/src/sync/external-change-puller.js.map +1 -1
  88. package/package.json +3 -3
  89. package/plugins/specweave/.claude-plugin/plugin.json +2 -2
  90. package/plugins/specweave/hooks/hooks.json +3 -30
  91. package/plugins/specweave/hooks/run-worker.mjs +229 -0
  92. package/plugins/specweave/hooks/run.mjs +83 -217
  93. package/plugins/specweave/skills/increment/SKILL.md +7 -5
  94. package/src/templates/AGENTS.md.template +5 -5
  95. package/src/templates/CLAUDE.md.template +5 -5
  96. package/dist/dashboard/assets/index-BiJhGDZV.js +0 -13
  97. 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,3 @@
1
+ /** Dashboard projections extend the portable core intent contract. */
2
+ export * from '../core/intent/types.js';
3
+ //# sourceMappingURL=work-types.js.map
@@ -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;AAI3D;;;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;;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;CAC9C;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;gBAEjD,OAAO,EAAE,2BAA2B;IAMhD;;;;;;OAMG;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;IA4C5B;;OAEG;YACW,eAAe;IA8B7B;;OAEG;YACW,gBAAgB;IA8B9B;;OAEG;YACW,kBAAkB;IAqChC;;;;OAIG;IACH,oBAAoB,CAClB,QAAQ,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,EACnC,cAAc,EAAE,MAAM,GACrB,MAAM;CA0BV"}
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 => { this.logger.warn(`ADO fetch failed: ${err.message}`); }));
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 => { this.logger.warn(`JIRA fetch failed: ${err.message}`); }));
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 => { this.logger.warn(`GitHub fetch failed: ${err.message}`); }));
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
- try {
65
- // Dynamic import to avoid initialization errors when ADO is not configured
66
- const { AdoClient } = await import('../integrations/ado/ado-client.js');
67
- const client = new AdoClient();
68
- const adoChanges = await client.fetchRecentChanges(since, linkedItemIds);
69
- // Map to unified format
70
- return adoChanges.map(change => ({
71
- platform: 'ado',
72
- externalId: change.externalId,
73
- changedAt: change.changedAt,
74
- changedBy: change.changedBy,
75
- changedFields: change.changedFields,
76
- currentState: {
77
- status: change.currentState.status,
78
- priority: change.currentState.priority,
79
- assignee: change.currentState.assignee,
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
- try {
93
- // Dynamic import to avoid initialization errors when JIRA is not configured
94
- const { JiraClient } = await import('../integrations/jira/jira-client.js');
95
- const client = new JiraClient();
96
- const jiraChanges = await client.fetchRecentChanges(since, linkedIssueKeys);
97
- // Map to unified format
98
- return jiraChanges.map(change => ({
99
- platform: 'jira',
100
- externalId: change.externalId,
101
- changedAt: change.changedAt,
102
- changedBy: change.changedBy,
103
- changedFields: change.changedFields,
104
- currentState: {
105
- status: change.currentState.status,
106
- priority: change.currentState.priority,
107
- assignee: change.currentState.assignee,
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
- try {
121
- // Dynamic import to avoid initialization errors when GitHub is not configured
122
- const { GitHubClientV2 } = await import('../../plugins/specweave/lib/integrations/github/github-client-v2.js');
123
- // Detect repo from git remote
124
- const detected = await GitHubClientV2.detectRepo(this.projectRoot);
125
- if (!detected) {
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":"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"}
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.0.0",
4
- "description": "100+ domain-expert AI skills — PM, Architect, Frontend, QA, Security and more. Skills learn your team's patterns permanently. Spec-first planning, autonomous execution, multi-agent teams, synced to GitHub/JIRA. Claude Code, Cursor, Copilot & more.",
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 '✅ Version bumped with CHANGELOG entry'",
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": "SpecWeave: increment lifecycle for any AI tool. 10 skills (increment, do, done, review, team, handoff, sync, auto, brainstorm, qa), 4 exec-form hooks, and the specweave CLI for everything deterministic.",
4
- "version": "2.0.0",
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": "SpecWeave 2.0 hooks: session context, status-completion guard, auto-loop driver, compaction handoff. Exec-form node launcher (no shell), Windows-safe.",
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
  }