specweave 2.0.3 → 2.2.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 (156) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +21 -11
  3. package/bin/specweave.js +28 -0
  4. package/dist/dashboard/assets/index-BeKUULf0.css +1 -0
  5. package/dist/dashboard/assets/index-Bf5TF0_l.js +13 -0
  6. package/dist/dashboard/index.html +2 -2
  7. package/dist/src/cli/commands/jev-helpers.d.ts +148 -0
  8. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -0
  9. package/dist/src/cli/commands/jev-helpers.js +582 -0
  10. package/dist/src/cli/commands/jev-helpers.js.map +1 -0
  11. package/dist/src/cli/commands/jev.d.ts +21 -0
  12. package/dist/src/cli/commands/jev.d.ts.map +1 -0
  13. package/dist/src/cli/commands/jev.js +350 -0
  14. package/dist/src/cli/commands/jev.js.map +1 -0
  15. package/dist/src/cli/commands/sync.d.ts.map +1 -1
  16. package/dist/src/cli/commands/sync.js +23 -5
  17. package/dist/src/cli/commands/sync.js.map +1 -1
  18. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts +4 -0
  19. package/dist/src/cli/helpers/init/instruction-file-writer.d.ts.map +1 -1
  20. package/dist/src/cli/helpers/init/instruction-file-writer.js +11 -6
  21. package/dist/src/cli/helpers/init/instruction-file-writer.js.map +1 -1
  22. package/dist/src/core/auto/completion-evaluator.d.ts +22 -1
  23. package/dist/src/core/auto/completion-evaluator.d.ts.map +1 -1
  24. package/dist/src/core/auto/completion-evaluator.js +99 -9
  25. package/dist/src/core/auto/completion-evaluator.js.map +1 -1
  26. package/dist/src/core/config/types.d.ts +39 -1
  27. package/dist/src/core/config/types.d.ts.map +1 -1
  28. package/dist/src/core/config/types.js +1 -0
  29. package/dist/src/core/config/types.js.map +1 -1
  30. package/dist/src/core/doctor/checkers/hooks-checker.d.ts +1 -1
  31. package/dist/src/core/doctor/checkers/hooks-checker.js +1 -1
  32. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +28 -5
  33. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
  34. package/dist/src/core/hooks/handlers/pre-tool-use.js +162 -7
  35. package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
  36. package/dist/src/core/hooks/handlers/session-start.d.ts.map +1 -1
  37. package/dist/src/core/hooks/handlers/session-start.js +20 -0
  38. package/dist/src/core/hooks/handlers/session-start.js.map +1 -1
  39. package/dist/src/core/intent/portable-context.d.ts +4 -0
  40. package/dist/src/core/intent/portable-context.d.ts.map +1 -0
  41. package/dist/src/core/intent/portable-context.js +68 -0
  42. package/dist/src/core/intent/portable-context.js.map +1 -0
  43. package/dist/src/core/intent/types.d.ts +28 -0
  44. package/dist/src/core/intent/types.d.ts.map +1 -0
  45. package/dist/src/core/intent/types.js +3 -0
  46. package/dist/src/core/intent/types.js.map +1 -0
  47. package/dist/src/core/intent/validation.d.ts +5 -0
  48. package/dist/src/core/intent/validation.d.ts.map +1 -0
  49. package/dist/src/core/intent/validation.js +39 -0
  50. package/dist/src/core/intent/validation.js.map +1 -0
  51. package/dist/src/core/jev/browse.d.ts +56 -0
  52. package/dist/src/core/jev/browse.d.ts.map +1 -0
  53. package/dist/src/core/jev/browse.js +721 -0
  54. package/dist/src/core/jev/browse.js.map +1 -0
  55. package/dist/src/core/jev/client.d.ts +134 -0
  56. package/dist/src/core/jev/client.d.ts.map +1 -0
  57. package/dist/src/core/jev/client.js +329 -0
  58. package/dist/src/core/jev/client.js.map +1 -0
  59. package/dist/src/core/jev/config.d.ts +69 -0
  60. package/dist/src/core/jev/config.d.ts.map +1 -0
  61. package/dist/src/core/jev/config.js +181 -0
  62. package/dist/src/core/jev/config.js.map +1 -0
  63. package/dist/src/core/jev/decide.d.ts +160 -0
  64. package/dist/src/core/jev/decide.d.ts.map +1 -0
  65. package/dist/src/core/jev/decide.js +325 -0
  66. package/dist/src/core/jev/decide.js.map +1 -0
  67. package/dist/src/core/jev/index.d.ts +20 -0
  68. package/dist/src/core/jev/index.d.ts.map +1 -0
  69. package/dist/src/core/jev/index.js +20 -0
  70. package/dist/src/core/jev/index.js.map +1 -0
  71. package/dist/src/core/jev/questions.d.ts +56 -0
  72. package/dist/src/core/jev/questions.d.ts.map +1 -0
  73. package/dist/src/core/jev/questions.js +159 -0
  74. package/dist/src/core/jev/questions.js.map +1 -0
  75. package/dist/src/core/jev/redact.d.ts +44 -0
  76. package/dist/src/core/jev/redact.d.ts.map +1 -0
  77. package/dist/src/core/jev/redact.js +102 -0
  78. package/dist/src/core/jev/redact.js.map +1 -0
  79. package/dist/src/core/jev/usage.d.ts +38 -0
  80. package/dist/src/core/jev/usage.d.ts.map +1 -0
  81. package/dist/src/core/jev/usage.js +70 -0
  82. package/dist/src/core/jev/usage.js.map +1 -0
  83. package/dist/src/core/session/handoff-pointer.d.ts +4 -0
  84. package/dist/src/core/session/handoff-pointer.d.ts.map +1 -0
  85. package/dist/src/core/session/handoff-pointer.js +60 -0
  86. package/dist/src/core/session/handoff-pointer.js.map +1 -0
  87. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  88. package/dist/src/core/session/work-handoff.js +10 -3
  89. package/dist/src/core/session/work-handoff.js.map +1 -1
  90. package/dist/src/dashboard/server/dashboard-server.d.ts +1 -0
  91. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
  92. package/dist/src/dashboard/server/dashboard-server.js +10 -90
  93. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  94. package/dist/src/dashboard/server/data/cost-aggregator.d.ts +10 -5
  95. package/dist/src/dashboard/server/data/cost-aggregator.d.ts.map +1 -1
  96. package/dist/src/dashboard/server/data/cost-aggregator.js +31 -33
  97. package/dist/src/dashboard/server/data/cost-aggregator.js.map +1 -1
  98. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts +0 -1
  99. package/dist/src/dashboard/server/data/dashboard-data-aggregator.d.ts.map +1 -1
  100. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js +14 -66
  101. package/dist/src/dashboard/server/data/dashboard-data-aggregator.js.map +1 -1
  102. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts +4 -0
  103. package/dist/src/dashboard/server/data/dashboard-task-board.d.ts.map +1 -0
  104. package/dist/src/dashboard/server/data/dashboard-task-board.js +56 -0
  105. package/dist/src/dashboard/server/data/dashboard-task-board.js.map +1 -0
  106. package/dist/src/dashboard/server/data/intent-store.d.ts +19 -0
  107. package/dist/src/dashboard/server/data/intent-store.d.ts.map +1 -0
  108. package/dist/src/dashboard/server/data/intent-store.js +268 -0
  109. package/dist/src/dashboard/server/data/intent-store.js.map +1 -0
  110. package/dist/src/dashboard/server/data/local-sessions.d.ts +15 -0
  111. package/dist/src/dashboard/server/data/local-sessions.d.ts.map +1 -0
  112. package/dist/src/dashboard/server/data/local-sessions.js +197 -0
  113. package/dist/src/dashboard/server/data/local-sessions.js.map +1 -0
  114. package/dist/src/dashboard/server/data/work-projection.d.ts +8 -0
  115. package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -0
  116. package/dist/src/dashboard/server/data/work-projection.js +175 -0
  117. package/dist/src/dashboard/server/data/work-projection.js.map +1 -0
  118. package/dist/src/dashboard/server/file-watcher.d.ts.map +1 -1
  119. package/dist/src/dashboard/server/file-watcher.js +2 -1
  120. package/dist/src/dashboard/server/file-watcher.js.map +1 -1
  121. package/dist/src/dashboard/server/local-request.d.ts +4 -0
  122. package/dist/src/dashboard/server/local-request.d.ts.map +1 -0
  123. package/dist/src/dashboard/server/local-request.js +29 -0
  124. package/dist/src/dashboard/server/local-request.js.map +1 -0
  125. package/dist/src/dashboard/server/routes/work-routes.d.ts +5 -0
  126. package/dist/src/dashboard/server/routes/work-routes.d.ts.map +1 -0
  127. package/dist/src/dashboard/server/routes/work-routes.js +37 -0
  128. package/dist/src/dashboard/server/routes/work-routes.js.map +1 -0
  129. package/dist/src/dashboard/types.d.ts +3 -3
  130. package/dist/src/dashboard/types.d.ts.map +1 -1
  131. package/dist/src/dashboard/work-types.d.ts +39 -0
  132. package/dist/src/dashboard/work-types.d.ts.map +1 -0
  133. package/dist/src/dashboard/work-types.js +3 -0
  134. package/dist/src/dashboard/work-types.js.map +1 -0
  135. package/dist/src/sync/external-change-puller.d.ts +19 -0
  136. package/dist/src/sync/external-change-puller.d.ts.map +1 -1
  137. package/dist/src/sync/external-change-puller.js +87 -77
  138. package/dist/src/sync/external-change-puller.js.map +1 -1
  139. package/dist/src/utils/model-selection.d.ts +49 -0
  140. package/dist/src/utils/model-selection.d.ts.map +1 -1
  141. package/dist/src/utils/model-selection.js +70 -0
  142. package/dist/src/utils/model-selection.js.map +1 -1
  143. package/package.json +3 -3
  144. package/plugins/PLUGINS-INDEX.md +14 -4
  145. package/plugins/specweave/.claude-plugin/plugin.json +5 -3
  146. package/plugins/specweave/PLUGIN.md +16 -4
  147. package/plugins/specweave/hooks/hooks.json +1 -24
  148. package/plugins/specweave/hooks/run-worker.mjs +37 -2
  149. package/plugins/specweave/hooks/run.mjs +54 -1
  150. package/plugins/specweave/marketplace.json +6 -0
  151. package/plugins/specweave/skills/increment/SKILL.md +7 -5
  152. package/plugins/specweave/skills/jev/SKILL.md +201 -0
  153. package/src/templates/AGENTS.md.template +27 -5
  154. package/src/templates/CLAUDE.md.template +27 -5
  155. package/dist/dashboard/assets/index-BiJhGDZV.js +0 -13
  156. 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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAU,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA6C3D;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IAK/B,YAAY,OAAoC;QAC9C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,kBAAkB,CACtB,KAAW,EACX,WAIC;QAED,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAErE,uCAAuC;QACvC,MAAM,aAAa,GAAoB,EAAE,CAAC;QAE1C,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC;iBAC1C,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjD,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3E,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC;iBAC5C,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjD,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5E,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC;iBAChD,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;iBACjD,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9E,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAEjC,wCAAwC;QACxC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,UAAU,CAAC,MAAM,8BAA8B,CAAC,CAAC;QAE/E,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,KAAW,EACX,aAAwB;QAExB,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAE/B,MAAM,UAAU,GAAwB,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAE9F,wBAAwB;YACxB,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/B,QAAQ,EAAE,KAAc;gBACxB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE;oBACZ,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;oBAClC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;oBACtC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;iBACvC;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAW,EACX,eAA0B;QAE1B,IAAI,CAAC;YACH,4EAA4E;YAC5E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAEhC,MAAM,WAAW,GAAyB,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAElG,wBAAwB;YACxB,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChC,QAAQ,EAAE,MAAe;gBACzB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE;oBACZ,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;oBAClC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;oBACtC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;iBACvC;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,KAAW,EACX,kBAA6B;QAE7B,IAAI,CAAC;YACH,8EAA8E;YAC9E,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,qEAAqE,CAAC,CAAC;YAE/G,8BAA8B;YAC9B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBACpD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;YAEjF,mEAAmE;YACnE,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClC,QAAQ,EAAE,QAAiB;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,YAAY,EAAE;oBACZ,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM;oBAClC,QAAQ,EAAE,IAA8B,EAAE,+BAA+B;oBACzE,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,QAAQ;iBACvC;aACF,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,oBAAoB,CAClB,QAAmC,EACnC,cAAsB;QAEtB,6BAA6B;QAC7B,MAAM,UAAU,GAA2C;YACzD,GAAG,EAAE;gBACH,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,aAAa;gBACvB,UAAU,EAAE,WAAW;gBACvB,QAAQ,EAAE,WAAW;gBACrB,SAAS,EAAE,WAAW;aACvB;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE,SAAS;gBAClB,aAAa,EAAE,aAAa;gBAC5B,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,WAAW;aACzB;YACD,MAAM,EAAE;gBACN,MAAM,EAAE,aAAa;gBACrB,QAAQ,EAAE,WAAW;aACtB;SACF,CAAC;QAEF,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvC,OAAO,GAAG,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClF,CAAC;CACF"}
1
+ {"version":3,"file":"external-change-puller.js","sourceRoot":"","sources":["../../../src/sync/external-change-puller.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@
8
8
  * - Haiku: Simple/cheap operations, translations, mechanical work
9
9
  * - Opus: Default for all complex work, architecture, creative problem-solving
10
10
  */
11
+ import type { JevClient } from '../core/jev/client.js';
12
+ import type { classifyTask } from '../core/jev/decide.js';
11
13
  export type ModelTier = 'haiku' | 'sonnet' | 'opus';
12
14
  export interface Task {
13
15
  id: string;
@@ -71,4 +73,51 @@ export declare function calculateCostSavings(tasksWithModels: Map<string, ModelT
71
73
  savings: number;
72
74
  savingsPercent: number;
73
75
  };
76
+ /**
77
+ * Where a tier recommendation came from.
78
+ * - `jev` — TypeSafe System One classified the task
79
+ * - `heuristic` — the keyword scorer in {@link detectModelForTask}
80
+ */
81
+ export type ModelTierSource = 'jev' | 'heuristic';
82
+ /** {@link DetectionResult} plus the decision's provenance. */
83
+ export interface TierSelection extends DetectionResult {
84
+ source: ModelTierSource;
85
+ /** Latency of the Jev call, when one happened. */
86
+ latencyMs?: number;
87
+ /** Cost of the Jev call in USD, when reported. */
88
+ cost?: number;
89
+ }
90
+ /**
91
+ * Injection points for tests and callers that already hold a client/config.
92
+ * Nothing here is required: the defaults read the project config.
93
+ */
94
+ export interface SelectModelTierDeps {
95
+ /** Project root used to load `.specweave/config.json`. */
96
+ projectRoot?: string;
97
+ /** Force the Jev path on/off (skips config loading when provided). */
98
+ enabled?: boolean;
99
+ /** Force modelRouting on/off (skips config loading when provided). */
100
+ modelRouting?: boolean;
101
+ /** Confidence floor below which the tier falls back to opus. */
102
+ routeThreshold?: number;
103
+ /** A ready client. `null` means "no client available" (heuristic path). */
104
+ client?: JevClient | null;
105
+ /** Override the classifier (tests). */
106
+ classify?: typeof classifyTask;
107
+ }
108
+ /**
109
+ * Pick a model tier for a task, preferring Jev when the project opted in.
110
+ *
111
+ * Behaviour (AC-07):
112
+ * - Jev off, no key, error, timeout → the keyword heuristic, `source: 'heuristic'`
113
+ * - Jev on → `{ model: tier, reasoning: 'jev:<complexity>', source: 'jev' }`
114
+ * - Jev on but confidence < `thresholds.route` → opus, `reasoning: 'jev:low-confidence'`
115
+ *
116
+ * Never throws: every failure path degrades to the heuristic.
117
+ */
118
+ export declare function selectModelTierForTask(task: Task, options?: {
119
+ specDetailLevel?: number;
120
+ hasDetailedPlan?: boolean;
121
+ isArchitectural?: boolean;
122
+ }, deps?: SelectModelTierDeps): Promise<TierSelection>;
74
123
  //# sourceMappingURL=model-selection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-selection.d.ts","sourceRoot":"","sources":["../../../src/utils/model-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,GACL,eAAe,CA6GjB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,GACL,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAS9B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAQxD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAU7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,eAAe,GAAE,MAAa,GAC7B,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACvC,oBAAoB,GAAE,MAAa,GAClC;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB,CAkBA"}
1
+ {"version":3,"file":"model-selection.d.ts","sourceRoot":"","sources":["../../../src/utils/model-selection.ts"],"names":[],"mappings":"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"}
@@ -205,4 +205,74 @@ export function calculateCostSavings(tasksWithModels, averageTokensPerTask = 200
205
205
  savingsPercent
206
206
  };
207
207
  }
208
+ /**
209
+ * Pick a model tier for a task, preferring Jev when the project opted in.
210
+ *
211
+ * Behaviour (AC-07):
212
+ * - Jev off, no key, error, timeout → the keyword heuristic, `source: 'heuristic'`
213
+ * - Jev on → `{ model: tier, reasoning: 'jev:<complexity>', source: 'jev' }`
214
+ * - Jev on but confidence < `thresholds.route` → opus, `reasoning: 'jev:low-confidence'`
215
+ *
216
+ * Never throws: every failure path degrades to the heuristic.
217
+ */
218
+ export async function selectModelTierForTask(task, options = {}, deps = {}) {
219
+ const heuristic = () => ({
220
+ ...detectModelForTask(task, options),
221
+ source: 'heuristic',
222
+ });
223
+ try {
224
+ const [cfgMod, clientMod, decideMod] = await Promise.all([
225
+ import('../core/jev/config.js'),
226
+ import('../core/jev/client.js'),
227
+ import('../core/jev/decide.js'),
228
+ ]);
229
+ let enabled = deps.enabled;
230
+ let modelRouting = deps.modelRouting;
231
+ let routeThreshold = deps.routeThreshold;
232
+ if (enabled === undefined || modelRouting === undefined || routeThreshold === undefined) {
233
+ const cfg = cfgMod.loadJevConfig(deps.projectRoot);
234
+ if (enabled === undefined)
235
+ enabled = cfg.enabled;
236
+ if (modelRouting === undefined)
237
+ modelRouting = cfg.modelRouting;
238
+ if (routeThreshold === undefined)
239
+ routeThreshold = cfg.thresholds.route;
240
+ }
241
+ if (!enabled || !modelRouting)
242
+ return heuristic();
243
+ const client = deps.client !== undefined ? deps.client : clientMod.createJevClient(deps.projectRoot);
244
+ if (!client)
245
+ return heuristic();
246
+ const classify = deps.classify ?? decideMod.classifyTask;
247
+ const decision = await classify(client, {
248
+ id: task.id,
249
+ title: task.content,
250
+ body: task.description ?? '',
251
+ acs: task.acceptanceCriteria ?? [],
252
+ });
253
+ if (!decision.available)
254
+ return heuristic();
255
+ if (decision.confidence < routeThreshold) {
256
+ return {
257
+ model: 'opus',
258
+ confidence: decision.confidence,
259
+ reasoning: 'jev:low-confidence',
260
+ source: 'jev',
261
+ latencyMs: decision.latencyMs,
262
+ cost: decision.cost,
263
+ };
264
+ }
265
+ return {
266
+ model: decision.tier,
267
+ confidence: decision.confidence,
268
+ reasoning: `jev:${decision.complexity}`,
269
+ source: 'jev',
270
+ latencyMs: decision.latencyMs,
271
+ cost: decision.cost,
272
+ };
273
+ }
274
+ catch {
275
+ return heuristic();
276
+ }
277
+ }
208
278
  //# sourceMappingURL=model-selection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/utils/model-selection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/utils/model-selection.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.3",
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.2.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,13 +1,13 @@
1
1
  # SpecWeave plugins index
2
2
 
3
- **Plugins**: 1 (`sw`) · **Skills**: 10 · **Commands**: 0 · **Hooks**: 4
3
+ **Plugins**: 1 (`sw`) · **Skills**: 11 · **Commands**: 0 · **Hooks**: 2 default
4
4
 
5
5
  The 1.x `commands/` namespace is gone: anything deterministic is a `specweave`
6
- CLI subcommand, and the model-judgement procedures are the 10 skills below.
6
+ CLI subcommand, and the model-judgement procedures are the 11 skills below.
7
7
 
8
8
  | Plugin | Triggers | Description |
9
9
  |---|---|---|
10
- | **specweave** (`sw`) | increment, spec, tasks, plan, implement, close, review, team, handoff, sync, GitHub, Jira, ADO, auto, brainstorm, qa | Increment lifecycle: plan → work the ledger → verify → review → complete, with cross-tool handoff and tracker sync |
10
+ | **specweave** (`sw`) | increment, spec, tasks, plan, implement, close, review, team, handoff, sync, GitHub, Jira, ADO, auto, brainstorm, qa, jev, system one | Increment lifecycle: plan → work the ledger → verify → review → complete, with cross-tool handoff, tracker sync and closed-set decisions delegated to Jev |
11
11
 
12
12
  ## Quick lookup
13
13
 
@@ -23,6 +23,16 @@ CLI subcommand, and the model-judgement procedures are the 10 skills below.
23
23
  | "Run until done" | `sw:auto` |
24
24
  | "What are our options" | `sw:brainstorm` |
25
25
  | "Quality check" / "risk assessment" | `sw:qa` |
26
+ | "Jev" / "system one" / a decision whose answers can all be enumerated first | `sw:jev` |
27
+
28
+ ## Hooks
29
+
30
+ Two by default, registered in `specweave/hooks/hooks.json` as exec-form
31
+ `node hooks/run.mjs <event>`: `SessionStart` and `Stop`. Each one fails open.
32
+ `PreToolUse` is not a default hook — the Jev Bash guard is turned on per project by
33
+ `specweave jev setup --guard-bash`, which writes `jev.guards.bash`, the marker
34
+ `.specweave/state/jev-guard.enabled`, and a `PreToolUse` entry (matcher `Bash`) in that
35
+ project's `.claude/settings.json`. `--no-guard-bash` removes all three.
26
36
 
27
37
  ## Not in the plugin
28
38
 
@@ -30,4 +40,4 @@ CLI subcommand, and the model-judgement procedures are the 10 skills below.
30
40
  and install per-project with vskill. See `skills-optional/README.md`.
31
41
 
32
42
  Deterministic operations are CLI: `specweave status | task | verify | complete | qa |
33
- handoff | sync | docs | doctor | gc`.
43
+ handoff | sync | docs | doctor | gc | jev`.
@@ -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.3",
3
+ "description": "Portable intent and verified progress across coding tools. Eleven focused workflow skills, two default lifecycle hooks, and a deterministic CLI and live local dashboard.",
4
+ "version": "2.2.0",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -20,6 +20,8 @@
20
20
  "handoff",
21
21
  "github",
22
22
  "jira",
23
- "azure-devops"
23
+ "azure-devops",
24
+ "jev",
25
+ "system-one"
24
26
  ]
25
27
  }