specrails-desktop 2.30.1 → 2.30.2

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 (28) hide show
  1. package/client/dist/assets/{ActivityFeedPage-AQgpr9qG.js → ActivityFeedPage-9DZOvIcY.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-I7a0usG7.js → AgentBrowserCapture-DqyHbzk7.js} +1 -1
  3. package/client/dist/assets/{AgentModeCodePane-BqOVg15n.js → AgentModeCodePane-BAYyFRmY.js} +2 -2
  4. package/client/dist/assets/{AgentModeJobsPane-4SG6FF27.js → AgentModeJobsPane-CTIHMUKN.js} +1 -1
  5. package/client/dist/assets/{AgentsPage-C3FgYlEi.js → AgentsPage-DuyJuaFs.js} +1 -1
  6. package/client/dist/assets/{AnalyticsPage-BcMNByW5.js → AnalyticsPage-BY7gtCx6.js} +1 -1
  7. package/client/dist/assets/{CodePage-CgdDkXp-.js → CodePage-vyQr40Vl.js} +1 -1
  8. package/client/dist/assets/{DesktopAnalyticsPage-DPMcS88n.js → DesktopAnalyticsPage-CkXUFj3F.js} +1 -1
  9. package/client/dist/assets/{DocsDialog-BC7574Zi.js → DocsDialog-PhdCJNVj.js} +1 -1
  10. package/client/dist/assets/{DocsPage-Dd9yilUg.js → DocsPage-BY-wDthx.js} +1 -1
  11. package/client/dist/assets/{InteractiveJobComposer-CqC_0VQL.js → InteractiveJobComposer-C9I0A4KR.js} +1 -1
  12. package/client/dist/assets/{JobDetailModal-BFNXOhk1.js → JobDetailModal-I_RoQJV4.js} +1 -1
  13. package/client/dist/assets/{JobDetailPage-DM-6zYpA.js → JobDetailPage-CU4FEnUC.js} +1 -1
  14. package/client/dist/assets/{JobsPage-1dkjPk1k.js → JobsPage-DcllM4Ip.js} +1 -1
  15. package/client/dist/assets/{LoopBuilderPage-BPeqz6cG.js → LoopBuilderPage-DGm_iuff.js} +1 -1
  16. package/client/dist/assets/{LoopPreviewModal-EdkyYaGN.js → LoopPreviewModal-BC-TeFdD.js} +1 -1
  17. package/client/dist/assets/{LoopsPage-nZfgiaK8.js → LoopsPage-SqglnXlp.js} +1 -1
  18. package/client/dist/assets/{PluginsPage-CwFfFBzW.js → PluginsPage-B89S8o1a.js} +1 -1
  19. package/client/dist/assets/{ProjectSettingsDialog-DHsxLFMT.js → ProjectSettingsDialog-nEs-ENrE.js} +1 -1
  20. package/client/dist/assets/{TemplatePreviewModal-wcI3nGNr.js → TemplatePreviewModal-D4qW-J9B.js} +1 -1
  21. package/client/dist/assets/{TicketDetailModal-7EloKP1C.js → TicketDetailModal-CI47Dq9E.js} +2 -2
  22. package/client/dist/assets/{dist-js-zvt5ap3o.js → dist-js-Dj72W6qo.js} +1 -1
  23. package/client/dist/assets/{dist-js-Bt2zW2YG.js → dist-js-jwoXo0YD.js} +1 -1
  24. package/client/dist/assets/{index-xkzK3E5i.js → index-F9r8mWP_.js} +5 -5
  25. package/client/dist/index.html +2 -2
  26. package/package.json +1 -1
  27. package/server/dist/core-update-manager.js +10 -3
  28. package/server/dist/framework-manager.js +22 -8
@@ -204,7 +204,7 @@
204
204
  .specrails-splash__mark .pill { opacity: 1; }
205
205
  }
206
206
  </style>
207
- <script type="module" crossorigin src="/assets/index-xkzK3E5i.js"></script>
207
+ <script type="module" crossorigin src="/assets/index-F9r8mWP_.js"></script>
208
208
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CNC7AqOf.js">
209
209
  <link rel="modulepreload" crossorigin href="/assets/jsx-runtime-zu2_FqZY.js">
210
210
  <link rel="modulepreload" crossorigin href="/assets/react-dom-DiWzBDP9.js">
@@ -276,7 +276,7 @@
276
276
  <link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-qrcBaLW1.js">
277
277
  <link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-ByKli7Q_.js">
278
278
  <link rel="modulepreload" crossorigin href="/assets/spending-DMnCXy84.js">
279
- <link rel="modulepreload" crossorigin href="/assets/TicketDetailModal-7EloKP1C.js">
279
+ <link rel="modulepreload" crossorigin href="/assets/TicketDetailModal-CI47Dq9E.js">
280
280
  <link rel="stylesheet" crossorigin href="/assets/index-Dh9i4CnN.css">
281
281
  </head>
282
282
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.30.1",
3
+ "version": "2.30.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -136,9 +136,16 @@ class CoreUpdateManager {
136
136
  if (mat.errors.length > 0) {
137
137
  throw new Error(`framework materialize failed: ${mat.errors.map((e) => `${e.provider}: ${e.message}`).join('; ')}`);
138
138
  }
139
- const swapped = fm.swapCurrent(installed);
140
- if (!swapped) {
141
- throw new Error('framework swap-current failed');
139
+ // A materialize that reports no errors but ALSO no materialized providers
140
+ // wrote nothing — swapping `current` at a nonexistent version dir would
141
+ // fail downstream with a misleading "swap-current failed". Surface the
142
+ // real condition instead (mirrors FrameworkManager.versionCheck's guard).
143
+ if (mat.providers.length === 0) {
144
+ throw new Error(`framework materialize completed without materializing any provider (requested: ${providers.join(', ') || 'none'})`);
145
+ }
146
+ const swapped = fm.swapCurrentDetailed(installed);
147
+ if (!swapped.ok) {
148
+ throw new Error(`framework swap-current failed${swapped.detail ? `: ${swapped.detail}` : ''}`);
142
149
  }
143
150
  this.latestVersion = installed;
144
151
  this.lastCheckedAt = Date.now();
@@ -204,16 +204,30 @@ class FrameworkManager {
204
204
  * `swap-current` only moves the version pointer (provider-invariant).
205
205
  */
206
206
  swapCurrent(version, _provider = 'claude') {
207
+ return this.swapCurrentDetailed(version).ok;
208
+ }
209
+ /**
210
+ * Like `swapCurrent`, but on failure carries WHY it failed (`detail`) — the
211
+ * subprocess stderr/exit or the missing-CLI/verify-mismatch case — so callers
212
+ * (the core update channel) can surface an actionable error instead of the
213
+ * bare "swap-current failed".
214
+ */
215
+ swapCurrentDetailed(version) {
207
216
  const cli = this.resolveCli();
208
217
  if (!cli)
209
- return false;
218
+ return { ok: false, detail: 'no usable core CLI to run swap-current with' };
210
219
  if (readCurrentFrameworkVersion(this.home) === version)
211
- return true;
220
+ return { ok: true, detail: null };
212
221
  const fwDir = frameworkRoot(this.home);
213
222
  const res = (0, child_process_1.spawnSync)(nodeInterpreter(), [cli, 'swap-current', '--framework-dir', fwDir, '--version', version], { env: this.childEnv(), encoding: 'utf-8', timeout: 120_000 });
214
- if (res.error || (res.status ?? 1) !== 0)
215
- return false;
216
- return readCurrentFrameworkVersion(this.home) === version;
223
+ if (res.error || (res.status ?? 1) !== 0) {
224
+ const detail = (res.error?.message ?? `${res.stderr || res.stdout || ''}`.trim()) || `exit ${res.status ?? 'unknown'}`;
225
+ return { ok: false, detail };
226
+ }
227
+ if (readCurrentFrameworkVersion(this.home) !== version) {
228
+ return { ok: false, detail: `swap-current exited 0 but current still resolves to ${readCurrentFrameworkVersion(this.home) ?? 'nothing'}` };
229
+ }
230
+ return { ok: true, detail: null };
217
231
  }
218
232
  /**
219
233
  * Compare the bundled core version with `framework/current`. When they differ
@@ -266,8 +280,8 @@ class FrameworkManager {
266
280
  // No errors yet nothing materialized (empty/duplicate-only provider list).
267
281
  return { swapped: false, version: current };
268
282
  }
269
- const ok = this.swapCurrent(bundled);
270
- if (ok) {
283
+ const swap = this.swapCurrentDetailed(bundled);
284
+ if (swap.ok) {
271
285
  try {
272
286
  this.broadcast?.({ type: 'framework.updated', version: bundled });
273
287
  }
@@ -281,7 +295,7 @@ class FrameworkManager {
281
295
  this.broadcast?.({
282
296
  type: 'framework.update_failed',
283
297
  version: bundled,
284
- errors: [{ provider: providers[0] ?? 'claude', message: 'swap-current failed' }],
298
+ errors: [{ provider: providers[0] ?? 'claude', message: `swap-current failed${swap.detail ? `: ${swap.detail}` : ''}` }],
285
299
  });
286
300
  }
287
301
  catch {