specrails-desktop 2.36.0 → 2.42.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 (510) hide show
  1. package/README.md +94 -247
  2. package/client/dist/assets/ActivityFeedPage-DoEMumQS.js +1 -0
  3. package/client/dist/assets/AgentBrowserCapture-DIh4K0gh.js +1 -0
  4. package/client/dist/assets/AgentModeAnalyticsPane-mbq4WEoO.js +2 -0
  5. package/client/dist/assets/AgentModeCodePane-CKh7zuA4.js +2 -0
  6. package/client/dist/assets/AgentModeJobsPane-BDokPiLJ.js +1 -0
  7. package/client/dist/assets/AgentsPage-BFVAZbBj.js +87 -0
  8. package/client/dist/assets/AnalyticsPage-3Y9LuWwz.js +1 -0
  9. package/client/dist/assets/CodePage-C9KyuV_C.js +3 -0
  10. package/client/dist/assets/DesktopAnalyticsPage-Bhi54bXQ.js +1 -0
  11. package/client/dist/assets/{DocsDialog-C76VdBJC.js → DocsDialog-Dj6mt4ga.js} +2 -2
  12. package/client/dist/assets/{DocsPage-ziMlj6B6.js → DocsPage-24yWglNI.js} +1 -1
  13. package/client/dist/assets/ExportDropdown-ophapHrT.js +1 -0
  14. package/client/dist/assets/InteractiveJobComposer-C1ucmxQh.js +19 -0
  15. package/client/dist/assets/JobDetailModal-DNWmgVHD.js +1 -0
  16. package/client/dist/assets/JobDetailPage-BcajZyuu.js +1 -0
  17. package/client/dist/assets/JobsPage-B9nTZw6e.js +1 -0
  18. package/client/dist/assets/LoopBuilderPage-Oc48iOFW.js +7 -0
  19. package/client/dist/assets/LoopPreviewModal-ae0Fr6SU.js +1 -0
  20. package/client/dist/assets/LoopsPage-CUEqzUBI.js +1 -0
  21. package/client/dist/assets/MinimizedChatsContext-Deg39peL.js +1 -0
  22. package/client/dist/assets/PluginsPage-C1xtARIx.js +2 -0
  23. package/client/dist/assets/ProjectSettingsDialog-JZzrXFBN.js +1 -0
  24. package/client/dist/assets/RepositoryDeliveries-CSDsiVUz.js +5 -0
  25. package/client/dist/assets/RepositoryScopeSelector-D-RCaknl.js +1 -0
  26. package/client/dist/assets/ReviewPacketPage-x5EfGTiL.js +1 -0
  27. package/client/dist/assets/TemplatePreviewModal-BSyuZxGq.js +1 -0
  28. package/client/dist/assets/TicketDetailModalContext-DqyF0so-.js +14 -0
  29. package/client/dist/assets/Trans-SnMX4MhW.js +1 -0
  30. package/client/dist/assets/agent-BdT0SB1D.js +1 -0
  31. package/client/dist/assets/agent-Bh9K7iEt.js +1 -0
  32. package/client/dist/assets/agent-C4ibdFk9.js +1 -0
  33. package/client/dist/assets/agent-CSFY22Zo.js +1 -0
  34. package/client/dist/assets/agent-DAnqxUn8.js +1 -0
  35. package/client/dist/assets/agent-DTQiu0Mi.js +1 -0
  36. package/client/dist/assets/agent-T54WuR_Y.js +1 -0
  37. package/client/dist/assets/agent-i75WDZOA.js +1 -0
  38. package/client/dist/assets/browser-05vRDg_y.js +1 -0
  39. package/client/dist/assets/browser-Bulb-cB1.js +1 -0
  40. package/client/dist/assets/browser-C7f-Jsg1.js +1 -0
  41. package/client/dist/assets/browser-CG0PE1j_.js +1 -0
  42. package/client/dist/assets/browser-CMzaqAjo.js +1 -0
  43. package/client/dist/assets/browser-DMajYdNX.js +1 -0
  44. package/client/dist/assets/browser-DxcOHrdP.js +1 -0
  45. package/client/dist/assets/browser-ObE7xVo3.js +1 -0
  46. package/client/dist/assets/builder-765NeYTp.js +1 -0
  47. package/client/dist/assets/builder-8MG3V6ea.js +1 -0
  48. package/client/dist/assets/builder-B-1UBs5K.js +1 -0
  49. package/client/dist/assets/builder-BTiGnPT0.js +1 -0
  50. package/client/dist/assets/builder-Cx9Rz-7u.js +1 -0
  51. package/client/dist/assets/builder-DKFMELBl.js +1 -0
  52. package/client/dist/assets/builder-OcmKrC0h.js +1 -0
  53. package/client/dist/assets/builder-P9qVBXFZ.js +1 -0
  54. package/client/dist/assets/{button-CJqFnUOL.js → button-DCBqEaZl.js} +1 -1
  55. package/client/dist/assets/{code-CkUuW4m9.js → code-B37GRg9C.js} +1 -1
  56. package/client/dist/assets/{code-B0O8-p8k.js → code-BBOEZbf9.js} +1 -1
  57. package/client/dist/assets/{code-B1VLZDhS.js → code-BRm-jcyx.js} +1 -1
  58. package/client/dist/assets/{code-Bpj4Ddml.js → code-CF7w62CR.js} +1 -1
  59. package/client/dist/assets/{code-BykBZ5-e.js → code-CLuvJt2r.js} +1 -1
  60. package/client/dist/assets/{code-B86IMAfz.js → code-D0RCm59f.js} +1 -1
  61. package/client/dist/assets/code-DaZ-ZwCT.js +1 -0
  62. package/client/dist/assets/{code-cAqaqMTx.js → code-iIHkGaCL.js} +1 -1
  63. package/client/dist/assets/commands-0XjAftla.js +1 -0
  64. package/client/dist/assets/commands-BAWSYHjQ.js +1 -0
  65. package/client/dist/assets/commands-BBwowgiE.js +1 -0
  66. package/client/dist/assets/commands-BacjIZLN.js +1 -0
  67. package/client/dist/assets/commands-Bs62IAZ3.js +1 -0
  68. package/client/dist/assets/commands-CLPdh-Hh.js +1 -0
  69. package/client/dist/assets/commands-DlbFzgrp.js +1 -0
  70. package/client/dist/assets/commands-LjPSsi5F.js +1 -0
  71. package/client/dist/assets/common-B5AZNYMH.js +1 -0
  72. package/client/dist/assets/common-BFZ0c_vN.js +1 -0
  73. package/client/dist/assets/common-BrlwEnL7.js +1 -0
  74. package/client/dist/assets/common-BttQx3z4.js +1 -0
  75. package/client/dist/assets/common-CM65k_-e.js +1 -0
  76. package/client/dist/assets/common-D4mvFFlu.js +1 -0
  77. package/client/dist/assets/common-TZ9Ny96S.js +1 -0
  78. package/client/dist/assets/common-nFpSF4GC.js +1 -0
  79. package/client/dist/assets/dashboard-B14uYXkG.js +1 -0
  80. package/client/dist/assets/dashboard-BK_mez-z.js +1 -0
  81. package/client/dist/assets/dashboard-BfBir_6o.js +1 -0
  82. package/client/dist/assets/dashboard-Bt0cCzeG.js +1 -0
  83. package/client/dist/assets/dashboard-BwkjxI6H.js +1 -0
  84. package/client/dist/assets/{dashboard-C8WOEiPu.js → dashboard-C3bDKf7s.js} +1 -1
  85. package/client/dist/assets/dashboard-CdvjGfog.js +1 -0
  86. package/client/dist/assets/dashboard-fRrP0Kv0.js +1 -0
  87. package/client/dist/assets/dialog-SRw01_QU.js +45 -0
  88. package/client/dist/assets/dist-js-CJ_2XX1Y.js +1 -0
  89. package/client/dist/assets/formatDistanceToNow-DSj5DprF.js +1 -0
  90. package/client/dist/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js +1 -0
  91. package/client/dist/assets/index-DwAmL7m5.css +2 -0
  92. package/client/dist/assets/index-EzrkUb8B.js +76 -0
  93. package/client/dist/assets/{jira-api-B1-MUehg.js → jira-api-CSCqGr-Q.js} +1 -1
  94. package/client/dist/assets/{jobs-CN_zv4Gr.js → jobs-B8rrzfyZ.js} +1 -1
  95. package/client/dist/assets/{jobs-DUlWSYq2.js → jobs-BS6RTurf.js} +1 -1
  96. package/client/dist/assets/{jobs-Bpks6doU.js → jobs-BTT0Bsks.js} +1 -1
  97. package/client/dist/assets/{jobs-Bgq-PZkC.js → jobs-CezU69AE.js} +1 -1
  98. package/client/dist/assets/{jobs-SwYS2M-B.js → jobs-ClFJae0s.js} +1 -1
  99. package/client/dist/assets/{jobs-BAls3bWq.js → jobs-DJSFIFVy.js} +1 -1
  100. package/client/dist/assets/{jobs-DhxKgWFq.js → jobs-DhgGr8vm.js} +1 -1
  101. package/client/dist/assets/{jobs-B_TeSQxb.js → jobs-DzMjUcaN.js} +1 -1
  102. package/client/dist/assets/mcp-6rMoZfEO.js +1 -0
  103. package/client/dist/assets/mcp-BD8sL5mP.js +1 -0
  104. package/client/dist/assets/mcp-BkcA3I5s.js +1 -0
  105. package/client/dist/assets/mcp-CCpSelOh.js +1 -0
  106. package/client/dist/assets/mcp-CUAN6ORK.js +1 -0
  107. package/client/dist/assets/mcp-CqbRxRTE.js +1 -0
  108. package/client/dist/assets/mcp-DP2YfVhO.js +1 -0
  109. package/client/dist/assets/mcp-DUVQamDz.js +1 -0
  110. package/client/dist/assets/narration-B-ynWTpn.js +1 -0
  111. package/client/dist/assets/narration-Bj_laZwg.js +1 -0
  112. package/client/dist/assets/narration-BxHpmMv_.js +1 -0
  113. package/client/dist/assets/narration-C1Px0-0j.js +1 -0
  114. package/client/dist/assets/narration-CAXhGbzM.js +1 -0
  115. package/client/dist/assets/narration-DQ1l_Kq6.js +1 -0
  116. package/client/dist/assets/narration-XISXwqZd.js +1 -0
  117. package/client/dist/assets/narration-kwzfglQo.js +1 -0
  118. package/client/dist/assets/nav-1-Hh2kOz.js +1 -0
  119. package/client/dist/assets/nav-B34QkESm.js +1 -0
  120. package/client/dist/assets/nav-Bap_UXAq.js +1 -0
  121. package/client/dist/assets/{nav-pYuXq7sf.js → nav-BwxXIB24.js} +1 -1
  122. package/client/dist/assets/nav-Ch-zHBG5.js +1 -0
  123. package/client/dist/assets/nav-CygC_WN-.js +1 -0
  124. package/client/dist/assets/{nav-iwjCg5FR.js → nav-KnnLQtOQ.js} +1 -1
  125. package/client/dist/assets/nav-m00uxYUG.js +1 -0
  126. package/client/dist/assets/packet-BQ2tXfJI.js +1 -0
  127. package/client/dist/assets/packet-BdpOJ1Cy.js +1 -0
  128. package/client/dist/assets/packet-C3Ievb9R.js +1 -0
  129. package/client/dist/assets/packet-C4zJIG0Y.js +1 -0
  130. package/client/dist/assets/packet-Cx-zRuWn.js +1 -0
  131. package/client/dist/assets/packet-DUTGX52M.js +1 -0
  132. package/client/dist/assets/packet-DhsKtUPB.js +1 -0
  133. package/client/dist/assets/packet-z3LJ8Zyy.js +1 -0
  134. package/client/dist/assets/project-repositories-DYhTvwQ1.js +1 -0
  135. package/client/dist/assets/provider-capabilities-B-wOHfLP.js +1 -0
  136. package/client/dist/assets/settings-BBt2xtDQ.js +1 -0
  137. package/client/dist/assets/settings-BJB9RKJj.js +1 -0
  138. package/client/dist/assets/settings-CHwQR2rB.js +1 -0
  139. package/client/dist/assets/settings-CrMi3kSi.js +1 -0
  140. package/client/dist/assets/settings-DKyhDGD1.js +1 -0
  141. package/client/dist/assets/settings-Deupji9c.js +1 -0
  142. package/client/dist/assets/settings-DqRMmwAM.js +1 -0
  143. package/client/dist/assets/settings-J4rj6vo-.js +1 -0
  144. package/client/dist/assets/setup-2xGgu4Sk.js +1 -0
  145. package/client/dist/assets/setup-Ba11l2JA.js +1 -0
  146. package/client/dist/assets/setup-BzW4kMok.js +1 -0
  147. package/client/dist/assets/setup-COzwYhkJ.js +1 -0
  148. package/client/dist/assets/setup-CRVULhtF.js +1 -0
  149. package/client/dist/assets/setup-DgvlxwpE.js +1 -0
  150. package/client/dist/assets/setup-Dw_wYeEY.js +1 -0
  151. package/client/dist/assets/setup-ZPtEeJPW.js +1 -0
  152. package/client/dist/assets/spending-BqbdPm_4.js +1 -0
  153. package/client/dist/assets/square-Ci-PFcFe.js +1 -0
  154. package/client/dist/assets/{terminal-BFRZnMPP.js → terminal-BAzpHtpY.js} +1 -1
  155. package/client/dist/assets/{terminal-IahE4LW9.js → terminal-C7dHeR3x.js} +1 -1
  156. package/client/dist/assets/{terminal-tITa81iz.js → terminal-CMla5Qsz.js} +1 -1
  157. package/client/dist/assets/{terminal-BZiIu3rf.js → terminal-CdNXH-n9.js} +1 -1
  158. package/client/dist/assets/{terminal-ScjyXNxQ.js → terminal-Cw5bZsmV.js} +1 -1
  159. package/client/dist/assets/{terminal-C2NAd7BW.js → terminal-DFUP4eNv.js} +1 -1
  160. package/client/dist/assets/{terminal-d7GadXbN.js → terminal-DGqljeK_.js} +1 -1
  161. package/client/dist/assets/{terminal-QpXZU2Bn.js → terminal-cU70NodO.js} +1 -1
  162. package/client/dist/assets/useDesktop-RSMTyy7V.js +1 -0
  163. package/client/dist/assets/useSharedWebSocket-BOdS5_Iz.js +2 -0
  164. package/client/dist/index.html +34 -35
  165. package/docs/README.md +3 -0
  166. package/docs/agent-live-steering.md +57 -0
  167. package/docs/ci-cd.md +57 -0
  168. package/docs/code-explorer.md +48 -0
  169. package/docs/codex.md +12 -1
  170. package/docs/features/detachable-mission-windows.md +59 -0
  171. package/docs/guide/de/integrations/5-mcp-server.md +13 -9
  172. package/docs/guide/de/integrations/6-agent-chat.md +1 -0
  173. package/docs/guide/en/integrations/5-mcp-server.md +13 -9
  174. package/docs/guide/en/integrations/6-agent-chat.md +1 -0
  175. package/docs/guide/es/integrations/5-mcp-server.md +13 -9
  176. package/docs/guide/es/integrations/6-agent-chat.md +1 -0
  177. package/docs/guide/fr/integrations/5-mcp-server.md +13 -9
  178. package/docs/guide/fr/integrations/6-agent-chat.md +1 -0
  179. package/docs/guide/it/integrations/5-mcp-server.md +13 -9
  180. package/docs/guide/it/integrations/6-agent-chat.md +1 -0
  181. package/docs/guide/ja/integrations/5-mcp-server.md +13 -9
  182. package/docs/guide/ja/integrations/6-agent-chat.md +1 -0
  183. package/docs/guide/pt/integrations/5-mcp-server.md +13 -9
  184. package/docs/guide/pt/integrations/6-agent-chat.md +1 -0
  185. package/docs/guide/zh/integrations/5-mcp-server.md +13 -9
  186. package/docs/guide/zh/integrations/6-agent-chat.md +1 -0
  187. package/docs/internals/README.md +1 -0
  188. package/docs/internals/browser-capture-performance.md +55 -3
  189. package/docs/internals/browser-login-popups.md +45 -0
  190. package/docs/internals/browser-native-retina-audit.md +39 -0
  191. package/docs/internals/ci-cd-audit.md +39 -0
  192. package/docs/internals/core-runtime-updates.md +68 -0
  193. package/docs/internals/embedded-browser-native-webview-evaluation.md +2 -0
  194. package/docs/internals/implementation-reliability-audit.md +93 -0
  195. package/docs/internals/interactive-jobs.md +110 -6
  196. package/docs/internals/mcp-mission-audit.md +76 -0
  197. package/docs/internals/project-builder.md +404 -42
  198. package/docs/internals/safe-pr-review-flow.md +52 -10
  199. package/docs/internals/startup-recovery-audit.md +58 -0
  200. package/docs/mcp.md +74 -41
  201. package/docs/mission-processes.md +59 -0
  202. package/docs/multi-repo-projects.md +51 -0
  203. package/docs/platforms/windows-parity.md +70 -0
  204. package/docs/platforms/windows.md +13 -11
  205. package/docs/running-pipelines.md +14 -0
  206. package/mcp-bridge/dist/specrails-mcp.js +7186 -0
  207. package/package.json +9 -4
  208. package/server/dist/agent-chat-manager.js +537 -68
  209. package/server/dist/agent-chat-router.js +87 -6
  210. package/server/dist/agent-context-resolver.js +129 -25
  211. package/server/dist/agent-defaults.js +19 -11
  212. package/server/dist/agent-input-store.js +206 -0
  213. package/server/dist/agent-mcp-config.js +54 -15
  214. package/server/dist/agent-operator-prompt.js +255 -65
  215. package/server/dist/agent-spec-framing.js +202 -0
  216. package/server/dist/agent-steering.js +218 -0
  217. package/server/dist/agent-store.js +153 -0
  218. package/server/dist/api-not-found.js +8 -0
  219. package/server/dist/background-process-control.js +164 -0
  220. package/server/dist/background-process-service.js +61 -0
  221. package/server/dist/background-process-store.js +242 -0
  222. package/server/dist/background-windows-bootstrap.js +238 -0
  223. package/server/dist/blueprint-chat-manager.js +476 -62
  224. package/server/dist/blueprint-commit.js +21 -1
  225. package/server/dist/blueprint-draft-parser.js +122 -17
  226. package/server/dist/blueprint-generation.js +238 -0
  227. package/server/dist/blueprint-operator-prompt.js +91 -63
  228. package/server/dist/blueprint-router.js +55 -3
  229. package/server/dist/blueprint-spec-fixtures.js +85 -0
  230. package/server/dist/blueprint-spec-quality.js +57 -16
  231. package/server/dist/blueprint-store.js +92 -1
  232. package/server/dist/browser-capture-manager.js +86 -30
  233. package/server/dist/browser-playwright.js +168 -45
  234. package/server/dist/browser-viewport.js +26 -0
  235. package/server/dist/chat-manager.js +23 -15
  236. package/server/dist/chromium-archive.cjs +83 -0
  237. package/server/dist/chromium-resolver.js +72 -64
  238. package/server/dist/code-activity.js +145 -0
  239. package/server/dist/code-explorer-router.js +714 -114
  240. package/server/dist/core-compat.js +28 -1
  241. package/server/dist/core-execution.js +111 -0
  242. package/server/dist/core-package.js +4 -16
  243. package/server/dist/core-runtime.js +202 -0
  244. package/server/dist/core-update-manager.js +161 -60
  245. package/server/dist/core-update-state.js +29 -0
  246. package/server/dist/db.js +66 -35
  247. package/server/dist/delivery-evidence.js +142 -39
  248. package/server/dist/desktop-db.js +239 -43
  249. package/server/dist/desktop-router.js +109 -9
  250. package/server/dist/dev-ports.js +8 -3
  251. package/server/dist/file-provenance.js +34 -22
  252. package/server/dist/file-story-manager.js +62 -64
  253. package/server/dist/file-story.js +118 -35
  254. package/server/dist/file-summary-generator.js +46 -5
  255. package/server/dist/file-summary-manager.js +355 -106
  256. package/server/dist/framework-manager.js +98 -110
  257. package/server/dist/framework-reseed.js +76 -10
  258. package/server/dist/git-diagnostics.js +2 -2
  259. package/server/dist/headroom-manager.js +38 -3
  260. package/server/dist/host-control.js +52 -0
  261. package/server/dist/index.js +43 -2
  262. package/server/dist/interactive-job-session.js +149 -16
  263. package/server/dist/internal-api.js +48 -0
  264. package/server/dist/jira/jira-materializer.js +1 -0
  265. package/server/dist/json-tolerant.js +174 -0
  266. package/server/dist/legacy-migration.js +4 -2
  267. package/server/dist/loop-command-catalog.js +83 -21
  268. package/server/dist/loop-constants.js +6 -1
  269. package/server/dist/loop-decider.js +11 -1
  270. package/server/dist/loop-executors.js +194 -45
  271. package/server/dist/loop-factory.js +11 -4
  272. package/server/dist/loop-graph.js +90 -4
  273. package/server/dist/loop-run-manager.js +301 -69
  274. package/server/dist/loop-shell-invocation.js +21 -0
  275. package/server/dist/loop-step-idle.js +55 -0
  276. package/server/dist/loop-templates.js +31 -7
  277. package/server/dist/mcp/agent-capability.js +37 -4
  278. package/server/dist/mcp/guide.js +149 -36
  279. package/server/dist/mcp/mcp-admin-router.js +20 -4
  280. package/server/dist/mcp/mcp-server.js +89 -43
  281. package/server/dist/mcp/mcp-tiers.js +6 -5
  282. package/server/dist/mcp/mcp-token.js +3 -1
  283. package/server/dist/mcp/resources.js +5 -4
  284. package/server/dist/mcp/tools/catalog.js +4 -0
  285. package/server/dist/mcp/tools/code.js +125 -14
  286. package/server/dist/mcp/tools/context.js +153 -0
  287. package/server/dist/mcp/tools/git.js +15 -5
  288. package/server/dist/mcp/tools/jobs.js +84 -71
  289. package/server/dist/mcp/tools/loops.js +17 -6
  290. package/server/dist/mcp/tools/meta.js +74 -27
  291. package/server/dist/mcp/tools/mission.js +29 -0
  292. package/server/dist/mcp/tools/projects.js +22 -6
  293. package/server/dist/mcp/tools/rails.js +48 -11
  294. package/server/dist/mcp/tools/specs.js +86 -14
  295. package/server/dist/mcp/tools/support.js +1 -1
  296. package/server/dist/mcp/tools/types.js +117 -43
  297. package/server/dist/mcp/tools/watch.js +144 -51
  298. package/server/dist/milestone-chain-store.js +164 -0
  299. package/server/dist/milestone-chain.js +487 -0
  300. package/server/dist/milestone-progress.js +348 -0
  301. package/server/dist/mobile/mobile-devices.js +10 -7
  302. package/server/dist/mobile/mobile-gateway.js +2 -0
  303. package/server/dist/mobile/mobile-missions.js +214 -0
  304. package/server/dist/mobile/mobile-redact.js +17 -3
  305. package/server/dist/mobile/mobile-router.js +46 -4
  306. package/server/dist/mobile/mobile-ws.js +49 -4
  307. package/server/dist/multi-repo-bases.js +56 -0
  308. package/server/dist/multi-repo-checkout.js +101 -0
  309. package/server/dist/multi-repo-delivery.js +100 -0
  310. package/server/dist/multi-repo-execution-store.js +65 -0
  311. package/server/dist/multi-repo-execution.js +453 -0
  312. package/server/dist/offline-assemble.js +10 -8
  313. package/server/dist/openspec-runtime-plugin-commands.json +18 -0
  314. package/server/dist/openspec-runtime-plugin.js +120 -0
  315. package/server/dist/plugins/codex-spawn.js +49 -0
  316. package/server/dist/plugins/serena/manifest.js +2 -2
  317. package/server/dist/plugins/serena/templates/instructions.md +16 -0
  318. package/server/dist/pr-publisher.js +1 -1
  319. package/server/dist/profiles-router.js +3 -18
  320. package/server/dist/project-code-discovery.js +142 -0
  321. package/server/dist/project-git.js +19 -21
  322. package/server/dist/project-registry.js +272 -20
  323. package/server/dist/project-repositories.js +157 -0
  324. package/server/dist/project-repository-provenance.js +31 -0
  325. package/server/dist/project-router-background-processes.js +105 -0
  326. package/server/dist/project-router-git.js +75 -16
  327. package/server/dist/project-router-jobs.js +2 -126
  328. package/server/dist/project-router-loop-runs.js +72 -2
  329. package/server/dist/project-router-tickets.js +53 -8
  330. package/server/dist/project-router.js +239 -38
  331. package/server/dist/provider-detection.js +18 -6
  332. package/server/dist/provider-limit.js +64 -0
  333. package/server/dist/providers/claude-adapter.js +26 -1
  334. package/server/dist/providers/claude-background-tasks.js +18 -0
  335. package/server/dist/providers/claude-live-session.js +383 -0
  336. package/server/dist/providers/codex-adapter.js +19 -0
  337. package/server/dist/providers/codex-live-session.js +545 -0
  338. package/server/dist/providers/gemini-adapter.js +1 -0
  339. package/server/dist/providers/live-session-types.js +12 -0
  340. package/server/dist/providers/live-session.js +13 -0
  341. package/server/dist/providers/terminal-result.js +24 -0
  342. package/server/dist/queue-manager.js +2 -0
  343. package/server/dist/rail-isolated-launch.js +141 -16
  344. package/server/dist/rail-pr-decision.js +364 -99
  345. package/server/dist/rail-pr-store.js +24 -10
  346. package/server/dist/rail-worktree-release.js +34 -2
  347. package/server/dist/rail-worktrees-store.js +4 -4
  348. package/server/dist/rails-router.js +249 -55
  349. package/server/dist/repo-lock.js +92 -17
  350. package/server/dist/review-packet.js +23 -13
  351. package/server/dist/schemas/file-summary.v1.json +59 -59
  352. package/server/dist/schemas/profile.v1.json +137 -137
  353. package/server/dist/setup-manager.js +52 -8
  354. package/server/dist/shell-integration/bash-shim.bash +45 -0
  355. package/server/dist/shell-integration/fish-shim.fish +36 -0
  356. package/server/dist/shell-integration/powershell-shim.ps1 +48 -0
  357. package/server/dist/shell-integration/zsh-shim.zsh +47 -0
  358. package/server/dist/smash-runner.js +1 -0
  359. package/server/dist/spawn-lifecycle.js +44 -27
  360. package/server/dist/spec-contract-prompt.js +143 -0
  361. package/server/dist/spec-draft-parser.js +6 -1
  362. package/server/dist/spec-models.js +1 -0
  363. package/server/dist/stuck-run-detector.js +1 -0
  364. package/server/dist/terminal-manager.js +21 -1
  365. package/server/dist/terminal-shell-integration.js +4 -1
  366. package/server/dist/transient-children.js +619 -230
  367. package/server/dist/util/cli-prompt.js +78 -5
  368. package/server/dist/util/sqlite-migrations.js +20 -0
  369. package/server/dist/util/win-spawn.js +18 -3
  370. package/server/dist/util/windows-provider-shell.js +29 -0
  371. package/server/dist/verification-sentinel.js +14 -0
  372. package/server/dist/vitest-setup.js +2 -0
  373. package/server/dist/windows-job-supervisor.js +133 -0
  374. package/server/dist/workspace-manager.js +9 -30
  375. package/server/dist/worktree-manager.js +17 -2
  376. package/server/dist/worktree-overlay.js +3 -1
  377. package/client/dist/assets/ActivityFeedPage-tAQcWs1R.js +0 -1
  378. package/client/dist/assets/AgentBrowserCapture-BX8BNae5.js +0 -1
  379. package/client/dist/assets/AgentModeAnalyticsPane-BVAqCL0K.js +0 -2
  380. package/client/dist/assets/AgentModeCodePane-9XfqQc9c.js +0 -2
  381. package/client/dist/assets/AgentModeJobsPane-BCjLsPhc.js +0 -1
  382. package/client/dist/assets/AgentsPage-C8J_42sm.js +0 -87
  383. package/client/dist/assets/AnalyticsPage-BtQuyfJm.js +0 -1
  384. package/client/dist/assets/CodePage-BZ2MwdCu.js +0 -2
  385. package/client/dist/assets/DesktopAnalyticsPage-Bh_29V4g.js +0 -1
  386. package/client/dist/assets/ExportDropdown-BrtfWzEG.js +0 -1
  387. package/client/dist/assets/InteractiveJobComposer-BCZiSfzc.js +0 -19
  388. package/client/dist/assets/JobDetailModal-NAJmuYIT.js +0 -1
  389. package/client/dist/assets/JobDetailPage-fE0ZycUX.js +0 -1
  390. package/client/dist/assets/JobsPage-z5M_HVJG.js +0 -1
  391. package/client/dist/assets/LoopBuilderPage-j1FQS47c.js +0 -7
  392. package/client/dist/assets/LoopPreviewModal-DhDJjdCe.js +0 -1
  393. package/client/dist/assets/LoopsPage-Ll7zORZb.js +0 -1
  394. package/client/dist/assets/MinimizedChatsContext-Bd3OqR_S.js +0 -1
  395. package/client/dist/assets/PluginsPage-DN4kGvJt.js +0 -2
  396. package/client/dist/assets/ProjectSettingsDialog-OgsgxjzF.js +0 -1
  397. package/client/dist/assets/ReviewPacketPage-DFog4sXn.js +0 -1
  398. package/client/dist/assets/TemplatePreviewModal-L2XxqiOD.js +0 -1
  399. package/client/dist/assets/TicketDetailModal-CsF-AWZX.js +0 -14
  400. package/client/dist/assets/Trans-Bsz9_gyq.js +0 -1
  401. package/client/dist/assets/agent-BQgKv_2F.js +0 -1
  402. package/client/dist/assets/agent-C1NRDJqL.js +0 -1
  403. package/client/dist/assets/agent-CLNleiy6.js +0 -1
  404. package/client/dist/assets/agent-CmceArkQ.js +0 -1
  405. package/client/dist/assets/agent-D3UxQ3SR.js +0 -1
  406. package/client/dist/assets/agent-DB1JeE64.js +0 -1
  407. package/client/dist/assets/agent-DXkHcQ-D.js +0 -1
  408. package/client/dist/assets/agent-DjJJJ2M8.js +0 -1
  409. package/client/dist/assets/auth-D_5bQv5W.js +0 -1
  410. package/client/dist/assets/ban-E4EaZe3a.js +0 -1
  411. package/client/dist/assets/bot-DzuuuC5R.js +0 -1
  412. package/client/dist/assets/browser-BgqHDMXP.js +0 -1
  413. package/client/dist/assets/browser-CsKJtrpv.js +0 -1
  414. package/client/dist/assets/browser-Cu58EpZU.js +0 -1
  415. package/client/dist/assets/browser-CvXOJm-j.js +0 -1
  416. package/client/dist/assets/browser-DOrFh1c7.js +0 -1
  417. package/client/dist/assets/browser-DQv_Jo7x.js +0 -1
  418. package/client/dist/assets/browser-LPgxvJu2.js +0 -1
  419. package/client/dist/assets/browser-eL-3MIEI.js +0 -1
  420. package/client/dist/assets/builder-0IWtosUm.js +0 -1
  421. package/client/dist/assets/builder-Bf2N6XWn.js +0 -1
  422. package/client/dist/assets/builder-BnqaaBkT.js +0 -1
  423. package/client/dist/assets/builder-BxxfGgAO.js +0 -1
  424. package/client/dist/assets/builder-C5IIgWsq.js +0 -1
  425. package/client/dist/assets/builder-CHuahItu.js +0 -1
  426. package/client/dist/assets/builder-CjWosXL_.js +0 -1
  427. package/client/dist/assets/builder-CpCIOoKj.js +0 -1
  428. package/client/dist/assets/code-CHPkOkDS.js +0 -1
  429. package/client/dist/assets/commands-6tYQih5m.js +0 -1
  430. package/client/dist/assets/commands-BK2QinXN.js +0 -1
  431. package/client/dist/assets/commands-C2Nca76h.js +0 -1
  432. package/client/dist/assets/commands-CKdLihNX.js +0 -1
  433. package/client/dist/assets/commands-CYIBTAlc.js +0 -1
  434. package/client/dist/assets/commands-CjUtYJIM.js +0 -1
  435. package/client/dist/assets/commands-Cq_u_8y9.js +0 -1
  436. package/client/dist/assets/commands-D_ZHYQug.js +0 -1
  437. package/client/dist/assets/common-6MLbD-jM.js +0 -1
  438. package/client/dist/assets/common-BKGEu4rm.js +0 -1
  439. package/client/dist/assets/common-BNbnv8cE.js +0 -1
  440. package/client/dist/assets/common-BqGWtDbt.js +0 -1
  441. package/client/dist/assets/common-DBtTzeYm.js +0 -1
  442. package/client/dist/assets/common-DEW3Nr8n.js +0 -1
  443. package/client/dist/assets/common-DHsv9N5d.js +0 -1
  444. package/client/dist/assets/common-mkrEcW-Y.js +0 -1
  445. package/client/dist/assets/dashboard-B9GhC5ku.js +0 -1
  446. package/client/dist/assets/dashboard-CBnv6zOI.js +0 -1
  447. package/client/dist/assets/dashboard-CaP0fU87.js +0 -1
  448. package/client/dist/assets/dashboard-D4ZZ4x84.js +0 -1
  449. package/client/dist/assets/dashboard-DmuTQBX8.js +0 -1
  450. package/client/dist/assets/dashboard-DynLYj3d.js +0 -1
  451. package/client/dist/assets/dashboard-zj4gGFJ1.js +0 -1
  452. package/client/dist/assets/dialog-CdWCb02j.js +0 -45
  453. package/client/dist/assets/dist-bVqfYmby.js +0 -1
  454. package/client/dist/assets/dist-js-CWeUdf5Z.js +0 -1
  455. package/client/dist/assets/formatDistanceToNow-DQCvMgUc.js +0 -1
  456. package/client/dist/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js +0 -1
  457. package/client/dist/assets/git-refresh-wTW0rO0Z.js +0 -1
  458. package/client/dist/assets/i18n-hnX2DPmo.js +0 -2
  459. package/client/dist/assets/index-DIhMEAVw.js +0 -66
  460. package/client/dist/assets/index-DwygcU7s.css +0 -2
  461. package/client/dist/assets/mcp-B8X8wBLu.js +0 -1
  462. package/client/dist/assets/mcp-C2AojZZN.js +0 -1
  463. package/client/dist/assets/mcp-D8BT78_L.js +0 -1
  464. package/client/dist/assets/mcp-Df5RWBNk.js +0 -1
  465. package/client/dist/assets/mcp-Dj7BgMQW.js +0 -1
  466. package/client/dist/assets/mcp-Q7iT7rcz.js +0 -1
  467. package/client/dist/assets/mcp-YlvNvJbW.js +0 -1
  468. package/client/dist/assets/mcp-mKFpTSRb.js +0 -1
  469. package/client/dist/assets/narration-4Z2VUhZw.js +0 -1
  470. package/client/dist/assets/narration-BGuiEDj3.js +0 -1
  471. package/client/dist/assets/narration-BuSoqRmv.js +0 -1
  472. package/client/dist/assets/narration-CB9t29fy.js +0 -1
  473. package/client/dist/assets/narration-CU3x8FHD.js +0 -1
  474. package/client/dist/assets/narration-CWeXhfP5.js +0 -1
  475. package/client/dist/assets/narration-DRaDnhT5.js +0 -1
  476. package/client/dist/assets/narration-DtEbQgCw.js +0 -1
  477. package/client/dist/assets/nav-ApJVg3xu.js +0 -1
  478. package/client/dist/assets/nav-BKNky1Bg.js +0 -1
  479. package/client/dist/assets/nav-C6vWWKYx.js +0 -1
  480. package/client/dist/assets/nav-CXJ6Aw89.js +0 -1
  481. package/client/dist/assets/nav-CsmFBIDf.js +0 -1
  482. package/client/dist/assets/nav-DjkmQJjd.js +0 -1
  483. package/client/dist/assets/packet-B1IxaL5f.js +0 -1
  484. package/client/dist/assets/packet-Bh5kkbiB.js +0 -1
  485. package/client/dist/assets/packet-By8fqYxW.js +0 -1
  486. package/client/dist/assets/packet-CZdvA44E.js +0 -1
  487. package/client/dist/assets/packet-CrjHRQCP.js +0 -1
  488. package/client/dist/assets/packet-Dwi2pTtx.js +0 -1
  489. package/client/dist/assets/packet-_-ZIa0IR.js +0 -1
  490. package/client/dist/assets/packet-n0W6E1Hn.js +0 -1
  491. package/client/dist/assets/play-DNlrawbS.js +0 -1
  492. package/client/dist/assets/provider-capabilities-Doej9lfa.js +0 -1
  493. package/client/dist/assets/settings-Bd0x4TBa.js +0 -1
  494. package/client/dist/assets/settings-C1-7cXzC.js +0 -1
  495. package/client/dist/assets/settings-CAFaT38b.js +0 -1
  496. package/client/dist/assets/settings-Ct3v1nW2.js +0 -1
  497. package/client/dist/assets/settings-DHh7_IF5.js +0 -1
  498. package/client/dist/assets/settings-DQXAmdcv.js +0 -1
  499. package/client/dist/assets/settings-guzlhpup.js +0 -1
  500. package/client/dist/assets/settings-sZfTPMEH.js +0 -1
  501. package/client/dist/assets/setup-3jWaoVUO.js +0 -1
  502. package/client/dist/assets/setup-BjgRneb2.js +0 -1
  503. package/client/dist/assets/setup-BzFIjv-f.js +0 -1
  504. package/client/dist/assets/setup-C4VfQsxE.js +0 -1
  505. package/client/dist/assets/setup-DfUkpDbN.js +0 -1
  506. package/client/dist/assets/setup-ECe90Pmu.js +0 -1
  507. package/client/dist/assets/setup-dlqC4Jmm.js +0 -1
  508. package/client/dist/assets/setup-jwfLMiM2.js +0 -1
  509. package/client/dist/assets/spending-EC9xqio-.js +0 -1
  510. package/client/dist/assets/useDesktop-BQVt8lFd.js +0 -1
@@ -0,0 +1,58 @@
1
+ # Startup and update recovery audit
2
+
3
+ Date: 2026-09-05. Branch: `feat/codex-gpt-6-astra`.
4
+
5
+ The reported symptom was an intermittently disconnected desktop with no visible
6
+ projects after an update or a cold start. Source inspection found several paths
7
+ that produce this symptom without deleting project data. The local sidecar log
8
+ also contains an older project hydration failure (an unavailable provider), but
9
+ does not establish which path caused every reported incident. No SQLite
10
+ corruption was found in that log. User databases were not modified.
11
+
12
+ ## Causes and corrections
13
+
14
+ | Failure | Correction |
15
+ | --- | --- |
16
+ | Authentication gave up after 20 attempts spaced 300 ms apart; a later healthy server never repaired the cached missing token. | Share bounded token refreshes between failed API authentication and WebSocket reconnects. Refresh a rejected credential and replay the rejected request at most once, preserving its body, headers and cancellation. |
17
+ | Failed initial project requests were treated as a successful empty database. | Preserve the last authoritative catalog and loading state, retry with bounded backoff, and refresh on reconnect, focus and network recovery. |
18
+ | Views opened during a database lock could remain empty after that project recovered. | Retry only explicit `project_unavailable` reads for a bounded window; consume the recovery event in specs, rails, pipeline and mission views to refetch without discarding conversation drafts. Both WebSocket hooks recover after an extended outage. |
19
+ | An older REST response could overwrite a newer WebSocket project list. | Track catalog revisions and discard responses captured before a newer catalog event. A real browser regression reproduced the original failure. |
20
+ | Windows `http://tauri.localhost` could be mistaken for a normal website before the IPC bridge appeared. | Recognize the Tauri virtual hostname when choosing API and WebSocket origins. |
21
+ | The native host treated any response from the authenticated `/api/state` endpoint as proof of readiness and terminated the app after a 30-second timeout. | Verify the public `/api/health` contract over direct IPv4 loopback. Keep a live slow-starting sidecar running and retry readiness; report an actual process exit separately. |
22
+ | Update restart proceeded even when the previous server still occupied port 4200. | Wait for port release, deduplicate restart requests, and report a delayed restart instead of launching into a known conflict. Validate sidecar process identity before termination. |
23
+ | The initial WebSocket catalog contained only successfully hydrated project contexts, unlike REST's persistent registry. | Use the durable catalog for WebSocket initialization and health counts. A registered but temporarily unavailable project returns 503 instead of a misleading 404. |
24
+ | A transient SQLite write lock during project startup prevented that project from loading for the entire process lifetime. | Retry failed DB opens after 1, 2 and 5 seconds, then every 30 seconds while the error remains BUSY/LOCKED. Cancel retries on removal or shutdown; corruption and failures after context construction starts are not blindly retried. |
25
+ | Two startups could read the same old migration version before either obtained SQLite's write lock. | Acquire the write lock with `BEGIN IMMEDIATE` and recheck each version inside the same transaction as its migration and version record. Close failed initialization handles. |
26
+ | A failed legacy `hub.sqlite` rename was logged and ignored, allowing a new empty `desktop.sqlite` to be created. | Fail explicitly and retain the existing data for a later retry; do not replace an inaccessible catalog with an empty one. |
27
+
28
+ ## Validation
29
+
30
+ - Server/CLI/MCP coverage: 273 files, 7,274 passing tests. Statements 85.45%,
31
+ branches 77.63%, functions 89.52%, lines 87.83%; all configured thresholds pass.
32
+ - Client coverage: 348 files, 4,335 passing tests. Statements/lines 89.14%,
33
+ branches 82.87%, functions 74.36%; all configured thresholds pass.
34
+ - Native host: `cargo test --lib --offline`, 20 passing tests covering false
35
+ health responses, slow readiness, occupied ports, process identity and expected
36
+ versus unexpected shutdown.
37
+ - `npm run typecheck`, `npm run build`, `npm run check-core-compat` and
38
+ `git diff --check` pass. The build retains the existing Vite chunk-size advisory.
39
+ - Final Chromium smoke: all three startup/restart/stale-response scenarios pass,
40
+ with no uncaught page errors.
41
+
42
+ Total: 11,629 passing automated tests plus the three browser smoke scenarios.
43
+
44
+ SQLite regressions use temporary databases, including a real WAL write lock and
45
+ two connections sharing a migration. The native tests do not terminate the user's
46
+ server. An installed-app update was not executed as part of this validation.
47
+
48
+ ## Reproducible browser check
49
+
50
+ Run `node scripts/smoke-startup-recovery.mjs` from the repository root. It bundles
51
+ the actual auth, shared WebSocket and desktop project providers and exercises
52
+ them in Chromium against a temporary loopback fixture. It never opens the
53
+ installed app or a user database. Playwright's Chromium must already be installed;
54
+ `SPECRAILS_SMOKE_BROWSER` can select an existing Chromium executable.
55
+
56
+ The check covers an eight-second startup, a restarted server with a replacement
57
+ credential, saved project selection, and an old REST response arriving after a
58
+ newer WebSocket catalog. All three scenarios passed after the corrections.
package/docs/mcp.md CHANGED
@@ -2,25 +2,25 @@
2
2
 
3
3
  Specrails Desktop can expose itself to **any MCP client** — Claude Desktop,
4
4
  Claude Code, Cursor, or your own agent — as a local
5
- [Model Context Protocol](https://modelcontextprotocol.io) server. Turn it on
6
- and an external LLM can drive the whole dashboard: list your projects, read and
5
+ [Model Context Protocol](https://modelcontextprotocol.io) server. A connected
6
+ agent can drive the whole dashboard: list your projects, read and
7
7
  create specs, launch the AI pipeline, watch jobs settle, inspect analytics, and
8
- more — through ~18 well-described tools instead of clicking around the UI.
8
+ more — through 22 tools with discoverable action schemas.
9
9
 
10
- > **Just want to get going?** Open **Settings ▸ MCP**, flip **Enable MCP** on,
11
- > click **Copy client config**, and paste it into your MCP client. By default
12
- > only **read** actions are allowed; turn on the **Write** / **AI-spawn** /
13
- > **Destructive** tiers when you want the agent to actually change things or
14
- > spend money. Everything below is detail for when you need it.
10
+ > **Just want to get going?** Open **Settings ▸ MCP**, click **Copy client
11
+ > config**, and paste it into your MCP client. MCP and all four permission tiers
12
+ > are on by default. Disable **Write**, **AI-spawn**, or **Destructive** there
13
+ > to restrict external clients. Existing disabled settings survive upgrades.
15
14
 
16
15
  This is the **app talking to an outside agent** — the opposite direction from
17
16
  the [Serena plugin](running-pipelines.md#plugins) or
18
17
  `codex mcp add`, where Specrails *consumes* an MCP server. Here Specrails *is*
19
18
  the server.
20
19
 
21
- The MCP server is **off by default** and entirely local: it listens only on
22
- loopback (`127.0.0.1`), is authenticated by a token separate from the app's
23
- master token, and serves nothing until you explicitly enable it in Settings.
20
+ The MCP server is **on by default** and entirely local: it listens only on
21
+ loopback (`127.0.0.1`) and is authenticated by a token separate from the app's
22
+ master token, so nothing off your machine can reach it. You can switch it off
23
+ at any time in Settings — an explicit off stays off across upgrades.
24
24
 
25
25
  ## What the MCP exposes
26
26
 
@@ -28,7 +28,7 @@ When enabled, the server registers a compact catalog of **domain-facade tools**
28
28
  plus a few **meta tools**, a set of read-only **resources**, and a self-contained
29
29
  **guide** an LLM can read to learn the platform with no prior knowledge.
30
30
 
31
- ### Tools (~18)
31
+ ### Tools (22)
32
32
 
33
33
  Each domain is a single tool with an `action` enum, rather than dozens of
34
34
  narrow tools — so the catalog stays small and an agent discovers actions by
@@ -37,26 +37,44 @@ reading one description. The tools are:
37
37
  | Tool | What it covers |
38
38
  |---|---|
39
39
  | `specrails_projects` | List / resolve projects; unregister (destructive) |
40
+ | `specrails_context` | Compact live briefing: project/providers, backlog, rails/runs/deliveries, Git/worktrees, blueprint; source and availability per section |
40
41
  | `specrails_specs` | The spec/ticket backlog: list, get, create, update, delete, drafts, AI generate, AI-edit, Contract Refine, SMASH, per-ticket spend |
41
- | `specrails_rails` | Assign tickets to a rail, configure it, and launch the pipeline — rails are dynamic (`create_rail`, up to 12) and `launch_all` starts every ready rail in parallel (worktree-isolated) |
42
- | `specrails_jobs` | Inspect, stream, and stop pipeline jobs |
42
+ | `specrails_rails` | Configure/launch dynamic rails (`create_rail`, up to 12), inspect PR candidates/review packets; `launch_all` reports outcomes and isolation availability per rail |
43
+ | `specrails_jobs` | Inspect paginated job events, phase breakdowns, queues and background processes; stop jobs |
43
44
  | `specrails_chat` | Explore / sidebar chat conversations and turns |
44
- | `specrails_agents` | Provider-scoped agent profiles and catalog (Claude and Kimi execution; Kimi manual roles only) |
45
+ | `specrails_agents` | Provider-scoped agent profiles and catalog; explicit profiles are validated for the selected provider |
45
46
  | `specrails_plugins` | The per-project plugin marketplace (install / verify / uninstall) |
46
47
  | `specrails_jira` | The Jira integration (connect, sync, outbox) |
47
48
  | `specrails_loops` | Saved loop workflows |
48
- | `specrails_code` | The code explorer (tree/file/provenance are provider-neutral; AI transforms are capability-gated) |
49
+ | `specrails_code` | File discovery, literal content search, bounded line reads, summaries and provenance; AI summary regeneration is capability-gated |
50
+ | `specrails_git` | Repository/branch/worktree information, status, diffs and PR lookup |
51
+ | `specrails_env` | Project environment readiness and environment-file management |
52
+ | `specrails_support` | Support triage, local diagnostics and specrails-core update workflows |
49
53
  | `specrails_setup` | Add-project setup wizard surface |
50
54
  | `specrails_analytics` | Per-project spending analytics + budget |
51
55
  | `specrails_settings` | App-level settings |
52
56
  | `specrails_watch` | Await the real result of an async (cost-incurring) action |
53
57
  | `specrails_guide` | Returns the platform guide — read this first |
54
- | `specrails_search` | Find the right tool/action for an intent |
55
- | `specrails_describe` | Full description + input schema for a named tool |
56
- | `specrails_select_project` | Set an active project so later calls can omit `projectId` |
58
+ | `specrails_search` | Find tools/actions by English or Spanish intent, including current permission previews |
59
+ | `specrails_describe` | Complete nested JSON schema and action tiers; optionally validate proposed arguments without execution |
60
+ | `specrails_select_project` | Set this session's active project so later calls can omit `projectId` |
57
61
 
58
62
  Almost every domain tool is **project-scoped** and takes a `projectId`. Calling
59
- `specrails_select_project` first lets later calls omit it.
63
+ `specrails_select_project` first lets later calls omit it. Each external MCP
64
+ session has its own selection. Mission calls default to the conversation's
65
+ project pin; change that pin in the mission UI or use an explicit `projectId`
66
+ for an intentional operation in another project. Selecting an MCP default
67
+ cannot silently override the mission pin.
68
+
69
+ `specrails_projects` includes registered projects whose databases are temporarily
70
+ unavailable and marks their `available` state. Their absence from the live
71
+ execution registry does not mean the project was deleted. `specrails_context`
72
+ reports unavailable sections explicitly rather than presenting empty data.
73
+
74
+ For investigation, fetch the relevant context sections, search source text with
75
+ `specrails_code(search)`, and read the returned file ranges. Refresh state after
76
+ mutations and inspect `specrails_rails(review_packet)` before assessing a
77
+ delivery. Context summaries and truncated searches are partial evidence.
60
78
 
61
79
  ### Resources
62
80
 
@@ -77,6 +95,11 @@ app's WebSocket bus. An agent gets the actual outcome by calling
77
95
  returns the final result. Don't assume success from the acceptance alone — this
78
96
  is spelled out in `specrails_guide`.
79
97
 
98
+ For jobs and loop runs, watch checks stored state before waiting; a completed
99
+ run returns immediately even if its completion event preceded the call. Use
100
+ `kind: "loop_run"` with a loop-run id. Timeouts do not establish success or
101
+ failure; inspect `specrails_jobs(get)` or `specrails_loops(run_get)` for evidence.
102
+
80
103
  Provider membership does not bypass capability checks. With Kimi, agentic
81
104
  chat/Explore/Quick Launcher/rails/loops without Decider/profiles are
82
105
  available, while Quick Spec, AI Edit, Contract Refine, SMASH/Re-SMASH,
@@ -88,37 +111,46 @@ before any mutation.
88
111
 
89
112
  Every tool declares one tier. The server refuses any tool whose tier is not
90
113
  enabled, and the refusal **names the tier the user must turn on** so the agent
91
- can relay it rather than retrying blindly. The tiers are **opt-in and
92
- cumulative** — read is always on, the rest are off until you enable them in
93
- **Settings ▸ MCP**:
114
+ can relay it rather than retrying blindly. The tiers are **on by default and
115
+ opt-out** — read is always on, and the other three are granted on a fresh
116
+ install so a connected assistant can drive the whole app out of the box; untick
117
+ any of them in **Settings ▸ MCP** to restrict clients:
94
118
 
95
119
  | Tier | Default | What it allows |
96
120
  |---|---|---|
97
121
  | **Read** | Always on | Queries + resources (list specs, read analytics, inspect jobs) |
98
- | **Write** | Off | Mutating but non-destructive, non-spawn: create/edit specs, change settings, configure a rail |
99
- | **AI-spawn** | Off | Actions that spawn an AI CLI and **cost money**: launch a rail, generate a spec, send a chat turn |
100
- | **Destructive** | Off | Delete data, kill processes, or mutate an external system (e.g. unregister a project, `smash_undo`, Jira writes) |
122
+ | **Write** | On | Mutating but non-destructive, non-spawn: create/edit specs, change settings, configure a rail |
123
+ | **AI-spawn** | On | Actions that spawn an AI CLI and **cost money**: launch a rail, generate a spec, send a chat turn |
124
+ | **Destructive** | On | Delete data, kill processes, or mutate an external system (e.g. unregister a project, `smash_undo`, Jira writes) |
125
+
126
+ `specrails_specs(commit_draft)` requires AI-spawn when it can append a Contract
127
+ Layer. A fresh direct insert with `contractRefine: false` and no Explore/draft
128
+ ids remains Write. `specrails_describe` can preview the tier for specific
129
+ arguments; its shared-schema validation does not replace action-specific or
130
+ backend state checks.
131
+
132
+ The split is deliberate: a client you only half-trust can be dropped to
133
+ read-only with three unticks, and **destructive and cost-incurring actions can
134
+ be withheld independently**. A tool's tier is dynamic per action — e.g.
135
+ `specrails_specs(list)` is read while `specrails_specs(delete)` is destructive —
136
+ so the same tool exposes different actions at different trust levels.
101
137
 
102
- The split is deliberate: a client you only half-trust can be left read-only;
103
- **destructive and cost-incurring actions are opt-in** and never happen by
104
- accident. A tool's tier is dynamic per action — e.g. `specrails_specs(list)` is
105
- read while `specrails_specs(delete)` is destructive — so the same tool exposes
106
- different actions at different trust levels.
138
+ ## Setting it up
107
139
 
108
- ## Enabling it
140
+ It is already running — the app persists `mcp_enabled` as on and serves
141
+ `/api/mcp` from the first launch, and the scoped token is minted at boot so the
142
+ bridge finds it immediately.
109
143
 
110
144
  1. Open the app and go to **Settings ▸ MCP**.
111
- 2. Toggle **Enable MCP**. This boots the embedded transport immediately — no
112
- app restart. (Behind the scenes it persists `mcp_enabled` and starts serving
113
- `/api/mcp`.)
114
- 3. Enable the permission tiers you want (**Write** / **AI-spawn** /
115
- **Destructive**). Leave them off to keep the agent read-only.
116
- 4. Click **Copy client config** to grab a ready-to-paste configuration, or
145
+ 2. Review the permission tiers (**Write** / **AI-spawn** / **Destructive**).
146
+ Untick the ones you don't want an external client to have; untick all three
147
+ to keep the agent read-only.
148
+ 3. Click **Copy client config** to grab a ready-to-paste configuration, or
117
149
  **Copy token** if your client needs the raw token (for the direct-HTTP path
118
150
  below).
119
151
 
120
- Toggling the enable switch off again tears down all open MCP sessions
121
- immediately.
152
+ Toggling the enable switch off tears down all open MCP sessions immediately;
153
+ toggling it back on boots the transport again — no app restart either way.
122
154
 
123
155
  ## Connecting a client
124
156
 
@@ -213,7 +245,8 @@ codex mcp add specrails -- <bridge command from Settings ▸ MCP>
213
245
  (`/api/mcp-admin`) require the request to come from `127.0.0.1`. There is no
214
246
  network ingress; an MCP client must run on the same machine.
215
247
  - **Tiers, not blanket access.** Even with a valid token, an agent can only do
216
- what the enabled tiers allow (read by default). High-risk actions stay opt-in.
248
+ what the enabled tiers allow. All four are on by default so a fresh install
249
+ works out of the box; high-risk actions can be withheld per tier at any time.
217
250
  - **Loopback is not identity.** The scoped MCP token identifies an external local
218
251
  client; it cannot impersonate the embedded Agent Mode by adding tier, project,
219
252
  or conversation headers. For each Agent Mode turn, Specrails mints a private,
@@ -0,0 +1,59 @@
1
+ # Aplicaciones y procesos de las misiones
2
+
3
+ El agente arranca aplicaciones, servidores de desarrollo y watchers mediante `specrails_jobs(background_start)`. El proceso queda ligado a la misión, al proyecto y al repositorio elegido, y aparece como una pastilla sobre el compositor. En proyectos con varios repositorios, el agente indica `repositoryId` para arrancar cada aplicación en la carpeta correcta.
4
+
5
+ El comando debe mantener el servidor en primer plano, por ejemplo `npm run dev`. No necesita `nohup` ni un `&` final: Specrails ya se encarga de ejecutarlo en segundo plano y conservar su control.
6
+
7
+ Antes de lanzar otra copia, el agente consulta `background_list`. El arranque devuelve `pid` y `processId`: este último identifica la ejecución aunque el sistema operativo reutilice el PID más adelante. Aceptar un comando no demuestra que la aplicación esté lista; consultar sus logs para identificar la URL o un error de arranque forma parte de la petición de lanzamiento y no necesita otra confirmación para leerlos.
8
+
9
+ ## Detener una aplicación
10
+
11
+ La X de la pastilla solicita la parada directamente. Mientras se confirma, aparece «Deteniendo» y el proceso sigue visible. Specrails intenta cerrar el grupo o árbol de procesos, da un plazo a la terminación normal y fuerza la parada si la aplicación no responde. La salida del shell por sí sola no cuenta como aplicación detenida.
12
+
13
+ Si la petición o la parada falla, la interfaz muestra el error y permite reintentar. Las peticiones repetidas conservan la identidad de la ejecución y no se dirigen a otro proceso que tenga el mismo PID. La interfaz vuelve a consultar el estado durante la parada, al recuperar la conexión y al regresar a la ventana.
14
+
15
+ Al cerrar un proyecto o Specrails se aplica el mismo cierre de procesos. El servidor espera un plazo limitado para que termine la limpieza antes de salir; la aplicación de escritorio deja margen para esa espera.
16
+
17
+ ## Explorar los logs
18
+
19
+ Al pulsar el cuerpo de la pastilla se abre el inspector. La X de parada y el botón que abre el inspector son controles separados, también accesibles con el teclado.
20
+
21
+ El botón **Procesos** del compositor abre el historial de la misión, aunque las pastillas de ejecuciones terminadas ya hayan desaparecido. Permite buscar por comando, carpeta, repositorio, PID o estado. Seleccionar una ejecución abre sus logs; volver al historial conserva la búsqueda. La reconexión y la recarga recuperan este historial del servidor.
22
+
23
+ El modal muestra comando, carpeta, repositorio, estado, duración y resultado de salida. Incluye:
24
+
25
+ - Salida estándar y errores, incluso si el proceso todavía no ha escrito un salto de línea.
26
+ - Búsqueda de texto y filtro por `stdout` o `stderr`.
27
+ - Pausa de la actualización y seguimiento de las últimas líneas. Desplazarse hacia arriba desactiva el seguimiento para poder leer.
28
+ - Copia y descarga de la vista filtrada.
29
+ - Avisos de errores de lectura y de truncamiento, con reintento.
30
+
31
+ Los logs se consultan únicamente mientras el inspector está abierto y actualizándose. Las secuencias de terminal se convierten en texto; no se ejecuta HTML ni se abren enlaces de control incluidos en la salida. Un inspector abierto conserva su última captura aunque desaparezca la pastilla del proceso terminado.
32
+
33
+ ## Retención y alcance
34
+
35
+ El servidor guarda el historial en `~/.specrails/background-processes.sqlite`, junto al catálogo de proyectos, usando una base separada para el tráfico de logs. Conserva hasta 10.000 líneas de 4.000 caracteres por ejecución, durante 30 días, con un máximo de 1.000 ejecuciones terminadas y 256 MiB de texto retenido en total. Cuando se alcanzan los límites, elimina primero el historial más antiguo. SQLite reutiliza las páginas liberadas; el tamaño del archivo puede superar el texto retenido por sus índices y metadatos.
36
+
37
+ La captura en memoria mantiene las últimas 2.000 líneas y hasta 32 ejecuciones terminadas durante diez minutos, pero su caducidad no borra el historial persistente. El inspector limita la vista a 2.000 líneas y 512 KiB de texto para mantenerla ágil; indica cualquier truncamiento. La búsqueda dentro del log y su exportación abarcan la vista disponible. MCP devuelve una cola más pequeña para no saturar el contexto del agente, y permite paginar los metadatos del historial con `limit` y `offset`.
38
+
39
+ Los cambios de estado se guardan en sus transiciones y la salida se escribe en lotes cada 250 ms. El cierre normal de un proceso y de Specrails vacía los lotes pendientes. Un cierre brusco puede perder la última fracción de segundo aún sin escribir; un fallo de almacenamiento se muestra como aviso independiente y permite seguir deteniendo los procesos. Borrar una misión o un proyecto elimina también su historial. Una segunda instancia no puede apropiarse del historial de un servidor de Specrails que siga activo.
40
+
41
+ Después de reiniciar, las ejecuciones que no habían confirmado su final aparecen como **Desconectadas**. Esto significa que Specrails perdió su supervisión: no demuestra que su proceso del sistema esté detenido. Sus logs siguen siendo consultables, pero la aplicación no intenta señalizar un PID antiguo. Las lecturas y paradas mantienen el aislamiento por misión, proyecto e identidad de ejecución.
42
+
43
+ Los logs que una versión anterior ya descartó al guardarlos sólo en memoria no pueden recuperarse retrospectivamente.
44
+
45
+ El cierre controla los grupos o árboles que Specrails ha creado. Aplicaciones que se desasocien deliberadamente y creen un servicio externo requieren la gestión propia de ese servicio. Esta función no sustituye a un supervisor del sistema operativo ni detiene procesos ajenos por coincidir en un puerto.
46
+
47
+ ## Implementación y referencia
48
+
49
+ `transient-children.ts` mantiene el ciclo de vida y los lotes; `background-process-store.ts` guarda el historial y `background-process-control.ts` encapsula el control del sistema operativo. REST y MCP comparten `background-process-service.ts`. El contexto del cliente reconcilia las ejecuciones y los modales de historial y logs presentan las capturas.
50
+
51
+ ## Puertos de las aplicaciones y conexión de la misión
52
+
53
+ Specrails escucha su API en `127.0.0.1:4200` por defecto. Otro servidor puede ocupar `[::1]:4200` simultáneamente: comparten el número de puerto, pero pertenecen a familias de direcciones diferentes. Por eso el proxy de desarrollo, la autenticación y el WebSocket usan IPv4 explícito para llegar a Specrails y evitar que un `localhost` ambiguo devuelva el HTML de un proyecto.
54
+
55
+ `SPECRAILS_DEV_SERVER_PORT` configura la API de desarrollo, con `SPECRAILS_PORT` como alternativa. `SPECRAILS_DEV_CLIENT_PORT` configura el cliente; ambos deben ser distintos. Vite informa de un puerto ocupado en lugar de cambiarlo silenciosamente. Conviene usar puertos de aplicación distintos de los reservados por Specrails, que el agente puede consultar mediante `background_list`.
56
+
57
+ Si una petición de misión recibe HTML, una respuesta inválida o ninguna confirmación de admisión, muestra un error traducido y conserva el borrador con sus referencias, adjuntos e identidad de envío. No reenvía automáticamente una operación cuyo resultado pueda ser incierto.
58
+
59
+ La separación entre shell, descendientes y eventos de salida se basa en los contratos de [procesos hijos de Node.js](https://nodejs.org/api/child_process.html#optionsdetached) y [señales de proceso](https://nodejs.org/api/process.html#processkillpid-signal), y se verifica con procesos locales desechables.
@@ -0,0 +1,51 @@
1
+ # Projects with several repositories
2
+
3
+ A Specrails project can contain a frontend, backend, libraries and other local repositories. They share one board, spec numbering, missions, Jira connection and project settings. A spec can select several repositories and describe the contract between them.
4
+
5
+ ## Add repositories
6
+
7
+ When adding a project, choose its primary folder and use **Add folder** for additional folders. On desktop, the folder picker also accepts several additional selections. In a web development session, enter their local paths.
8
+
9
+ For an existing project, open **Project settings → General → Repositories and folders**. Add repositories there, give them descriptive names, and optionally set their integration branches. The primary folder continues to own the existing project identity and backlog; adding a repository preserves the existing specs, history and Jira configuration.
10
+
11
+ Folder paths must exist. Specrails resolves symbolic links and rejects duplicate or nested roots within the same project. A secondary checkout can belong to several logical projects, each with its own backlog. Git operations on a shared checkout use the same repository lock.
12
+
13
+ A folder without Git can provide read-only context. It cannot be selected as an additional implementation target. A previously registered project with one non-Git primary folder retains its existing behavior.
14
+
15
+ ## Scope a shared spec
16
+
17
+ Use **Affected repositories** when creating or editing a spec. Select every repository that needs implementation changes. The selection is retained through Quick and Explore authoring, parked drafts, edits and Jira refreshes.
18
+
19
+ Older specs without a selection continue to target the primary repository. Jira imports use that same default until you choose a different scope. A batch targets the union of its specs' repositories. An explicit launch selection may add repositories but cannot omit a repository required by a spec. A standalone loop has a repository selector in its Run dialog.
20
+
21
+ The mission agent can discover every registered repository. Code and Git views have a repository picker, and file references retain repository identity even when several repos contain `src/index.ts`. Reading a repository does not add it to a spec's implementation scope.
22
+
23
+ ## Run and review
24
+
25
+ Multi-repository launches prepare isolated Git worktrees for all selected repositories before starting the provider. One coordinated implementation can edit the selected worktrees and verify changes across their boundaries. Preparation failures stop the launch and preserve an actionable error.
26
+
27
+ OpenSpec artifacts belong to the selected primary repository, or to the first selected repository when the primary is outside the scope. Custom shell nodes must choose a repository explicitly for multi-repository runs. Built-in archive steps use the artifact repository.
28
+
29
+ The delivery card contains one section per repository with its branch, commit and delivery status. Review evidence by repository, then create or publish a PR, integrate locally, or check out the work for that repository. Checkout moves a verified review branch into that repository's local folder; it does not mark the shared spec complete.
30
+
31
+ The shared spec and Jira issue finish only after every required repository is accepted, including explicit acceptance of repositories with no changes. If one integration succeeds and another fails, the successful result is retained. Resolve the reported problem and retry the outstanding repository. Git cannot make commits or merges atomic across separate repositories.
32
+
33
+ Revisions preserve the repository scope and build on the previous delivery commits. An already integrated repository starts from its verified integration head, preserving subsequent local work. Sequential milestone chunks use the latest delivered head for each repository, including repositories unchanged by an intermediate chunk. Their local integration destination remains the configured integration branch.
34
+
35
+ ## Change or detach a repository
36
+
37
+ Names and integration branches can be edited without moving a checkout. Changing a secondary folder path or detaching it is blocked while specs or active execution records still refer to that membership. Update those specs and resolve the pending work first. Detaching a member never deletes its local files.
38
+
39
+ An unavailable folder remains visible with an error. Specrails does not redirect an explicit repository selection to the primary folder. Frozen execution records keep their original paths so that recovery and review cannot follow a later membership edit into a different checkout.
40
+
41
+ ## MCP and API
42
+
43
+ `specrails_projects` and `specrails_context` expose repository inventories. Individual code and Git operations accept `repositoryId`; on a multi-repository project the agent must identify the member. Code find/search can discover across members and reports truncation when its shared budget is exhausted.
44
+
45
+ Specs and launches accept `repositoryIds`. IDs belong to the selected logical project. Unknown, removed or foreign IDs produce an error before implementation starts.
46
+
47
+ Use `specrails_rails` to implement a shared spec and `specrails_loops` for coordinated standalone work. Direct `specrails_jobs(spawn)` is a primary-repository operation; in a multi-repository project it requires that primary member's explicit ID and rejects secondary targets before enqueueing.
48
+
49
+ To start a development server through the mission agent, use `specrails_jobs` with `action: "background_start"`, the intended `repositoryId`, and a command such as `npm run dev`. An optional `cwd` stays inside that repository. This keeps the existing Autonomous permission level and explicit command confirmation; selecting or reading a repository does not start a process.
50
+
51
+ REST membership lives at `/api/projects/:projectId/repositories`. Repository code and Git routes live under `/api/projects/:projectId/repositories/:repositoryId`; existing unscoped routes retain primary-repository behavior. Grouped delivery decisions retain the parent delivery ID and optionally specify `repositoryId`. Review packets accept a `repositoryId` query parameter.
@@ -0,0 +1,70 @@
1
+ # Windows feature parity audit
2
+
3
+ This audit covers the `codex/multi-repo-projects` branch, including mission steering, multiple repositories, persistent process logs and the code explorer. It is a compatibility and regression audit, not a certificate that every Windows configuration or third-party login has been tested.
4
+
5
+ ## Feature coverage
6
+
7
+ | Feature | Windows implementation and checks |
8
+ | --- | --- |
9
+ | Installation, native runtimes | Native x64/ARM64 NSIS and MSI builds; embedded WebView2 offline provisioning; bundled Node/Git/core/OpenSpec; staged SQLite and full ConPTY/WinPTY dependency validation. |
10
+ | Desktop updates | Installer-specific Tauri targets keep NSIS and MSI separate. Missing, empty or ambiguous artifact/signature pairs fail manifest generation. Generic NSIS entries remain for older clients. Publication is serialized, and previous download installers are retained until the remote manifest matches the new release. |
11
+ | Startup and project catalog | Recover the actual Windows profile rather than inventing `C:\Users\Default`; SQLite catalog/repository IDs reopen under the same Unicode/spaced profile. |
12
+ | Projects and multi-repo | Repository membership and canonical identity use real paths; junction and case aliases cannot add the same repository twice. Shared backlog and per-repository jobs retain their existing regression coverage. |
13
+ | Core setup and updates | Offline assembly from the shipped core; preserve and restore the previous active framework if Windows junction replacement fails. Installed-package smoke waits for the real workspace marker. |
14
+ | Missions and live messages | Claude streaming keeps stdin open and puts system context in prompt files on Windows; Codex and Gemini large prompts avoid command-line limits. Edit/delete/steer UI behavior remains shared. |
15
+ | Rails and built-in/custom loops | Windows-safe process wrappers, environment and cwd handling; stop flows terminate owned process trees. User-authored shell commands still need syntax supported by their configured shell. |
16
+ | Background applications and logs | A Windows Job Object owns the application before command admission and retains descendants after launchers exit. Stop waits for the contained processes to terminate. Graceful host shutdown drains processes and logs before force-stop fallback. |
17
+ | Terminal | Bundled ConPTY helper forks the bundled Node instead of recursively launching the pkg sidecar. Native package smoke checks input, output and descendant cleanup. File drops quote for the session's actual shell. |
18
+ | Git and worktrees | Existing repository-scoped integration/checkout protections remain; Windows process and path helpers are exercised by native regression fixtures. Conflict decisions remain deliberate user-visible outcomes. |
19
+ | Files and observability | Same read-only tree/search/activity/diff/summary interfaces; Windows watcher root deletion degrades and retries instead of reporting a dead native watcher as healthy. |
20
+ | MCP and plugins | Core and project/repository scope remain explicit. Serena's app-managed Codex MCP configuration is injected into the actual provider spawns without replacing the user's authentication home. |
21
+ | Native browser | WebView2 browsing, capture and selector support share the host API; remote pages do not receive privileged desktop IPC. Browser/popup ownership and events are scoped to the calling app window. Reparenting retains the live session; occupied destinations park their previous browser and restore it on rollback. |
22
+ | Detached mission windows | Independent native windows share the original backend and active agent invocation. Versioned draft/workspace handoffs require destination acknowledgement; stale acknowledgements cannot close the source. Native mission close reintegrates, main close hides to tray, and popup close destroys only its own window. |
23
+ | File reveal, save, notifications | Supported native host commands replace dynamic imports that could be rejected by the production CSP or refer to missing plugins. |
24
+ | Keyboard, layouts, language | Ctrl+Enter works for feature exploration/refinement, shortcut hints display Windows modifiers, and terminal errors have translations in all eight locales. Shared client suites cover remaining UI behavior. |
25
+ | Mobile companion, analytics, settings, tickets/integrations | Shared Node/React implementations and existing regression suites; Windows startup, profile and subprocess fixes also apply to these callers. External services require their own credentials/network access. |
26
+
27
+ ## Automated gates
28
+
29
+ `.github/workflows/windows-parity.yml` runs a `windows-parity` job on `windows-latest` (x64) for every pull request and push to `main`, adding `windows-11-arm` on the `main` pushes. It installs dependencies, checks TypeScript, runs release/PTY helper regression tests, native filesystem/process tests (retried once, they drive real processes), the application build, native host build/tests, and four real native fixtures: WebView2 capture/selection, authentication popups, mission window handoff, and browser multiwindow transfer/parking. It is deliberately a separate workflow from `ci.yml`: `release.yml` waits for CI only, so a slow or flaky Windows run never delays the release PR, while Desktop Release still builds and installs on Windows before publication. The jsdom client suite is not repeated on Windows; it runs on Linux in CI. The bundled-core matrix in `ci.yml` exercises Windows junction/copy relocation for providers.
30
+
31
+ `.github/workflows/desktop-release.yml` builds the real installers and runs `scripts/smoke-windows-installers.ps1` before publishing artifacts. For each NSIS and MSI package, the script installs into a temporary path containing spaces and drives `scripts/smoke-installed-windows.mjs` with the installed Node runtime. The driver uses an isolated user profile and tests:
32
+
33
+ 1. The installed pkg sidecar boots with bundled resources and authenticates API access.
34
+ 2. A temporary Git repository is registered and core assembly completes offline.
35
+ 3. A source file can be read through the project API.
36
+ 4. A real PTY executes a Node helper in the correct cwd and streams its output.
37
+ 5. Closing the terminal terminates that helper, including the packaged ConPTY cleanup path.
38
+ 6. A background wrapper exits and leaves a descendant alive; its card remains running and Stop terminates the descendant before confirming completion.
39
+ 7. Authenticated host shutdown exits cleanly; restarting retains the same project ID.
40
+ 8. The temporary package is uninstalled and its fixture is removed.
41
+
42
+ Release-manifest and staged-helper tests can also run locally:
43
+
44
+ ```sh
45
+ node --test scripts/build-updater-manifest.test.mjs scripts/stage-windows-pty.test.mjs
46
+ ```
47
+
48
+ The current local audit results and any unexecuted checks are recorded in `openspec/changes/windows-feature-parity/verification.md`. A workflow definition is not evidence of a successful Windows run. The `native-macos` job compiles the same host and runs the four fixtures against WebKit, without a sidecar or packaged runtime resources.
49
+
50
+ The detachable-window implementation has passed native macOS fixtures locally, including independent mission windows, draft/revision rollback, browser session transfer, destination display scale, popup ownership and parked-session restoration. Windows x64/ARM64 execution of the new gates remains pending until CI results are recorded; a macOS pass does not establish WebView2 parity. See [Detachable mission windows](../features/detachable-mission-windows.md) for the behavior and test matrix.
51
+
52
+ ## Real-device release acceptance
53
+
54
+ Before claiming complete Windows parity, record successful x64 and ARM64 CI/release runs and exercise the actual installed UI on supported Windows versions:
55
+
56
+ - Clean NSIS and MSI installs, in-place upgrades from the previous release, relaunch, tray quit and uninstall. Verify one installation entry and preserved projects/logs.
57
+ - Native browsing and capture at 100%, 150% and 200% display scaling; resize, maximize, multi-monitor movement, keyboard/clipboard, popup/self-close, and the relevant Okta/SSO tenant. Detach two active missions, minimize main independently, move them between monitors, and reattach into a window with its own open browser; verify both sessions and pending inputs remain intact.
58
+ - Provider authentication and one real mission/rail per enabled provider; steering during a tool call; cancellation; multi-repo integration/checkout with clean and conflicting working trees.
59
+ - Long-running frontend/backend processes, immediate startup failure, stopping nested processes, app quit/update during execution, and persisted logs after restart.
60
+ - File selection/reveal/save and desktop notifications under normal user permissions. Test corporate security or network-drive policies where these are part of the supported customer environment.
61
+
62
+ Installers remain unsigned with Authenticode, so SmartScreen behavior described in the [Windows guide](./windows.md) still applies. The app cannot bypass OS or identity-provider policies.
63
+
64
+ ## Platform references
65
+
66
+ - [Tauri Windows installers and WebView2 provisioning](https://v2.tauri.app/distribute/windows-installer/)
67
+ - [Tauri updater](https://v2.tauri.app/plugin/updater/); the pinned updater 2.10.1 selects `OS-ARCH-installer` before `OS-ARCH` in `get_urls`.
68
+ - [Node filesystem watcher caveats](https://nodejs.org/api/fs.html#caveats)
69
+ - [Microsoft WebView2 runtime distribution](https://learn.microsoft.com/microsoft-edge/webview2/concepts/distribution)
70
+ - [Microsoft Windows Job Objects](https://learn.microsoft.com/en-us/windows/win32/procthread/job-objects)
@@ -4,9 +4,10 @@
4
4
 
5
5
  ## Supported configurations
6
6
 
7
- - **Windows 10** (1809 or newer) and **Windows 11**.
7
+ - **Windows 10 x64** (1809 or newer) and **Windows 11 x64/ARM64**.
8
8
  - Both **x64** and **ARM64** are first-class targets — each release publishes native installers for both architectures.
9
- - The terminal panel uses ConPTY, which requires **Windows 10 1809+** (always available on Windows 11).
9
+ - The terminal panel uses ConPTY on supported Windows builds and ships the node-pty WinPTY fallback for older Windows 10 builds.
10
+ - The installer embeds the evergreen WebView2 offline installer, so provisioning the app webview does not require a network connection.
10
11
 
11
12
  ## Installation
12
13
 
@@ -65,18 +66,15 @@ user-managed. See [Kimi](../kimi.md), [Codex](../codex.md), and
65
66
 
66
67
  The desktop app self-updates via the Tauri updater plugin. It checks a GitHub Releases `latest.json` endpoint and, on Windows, applies updates with `installMode: "passive"` — the update runs with a minimal progress UI and the app relaunches into the new version.
67
68
 
68
- Note that updates are delivered as the **MSI** (verified by an embedded **minisign** signature the updater checks before applying), not the NSIS `-setup.exe` used for first install. Because the installers are not Authenticode-signed, an applied update may still surface the same SmartScreen prompt; click **More info → Run anyway** as during the first install.
69
+ Updates preserve the installation format: NSIS installs receive a signed `-setup.exe` updater artifact, and MSI installs receive a signed `.msi` artifact for the same architecture. The signatures are Tauri/minisign integrity signatures, separate from Authenticode signing. An incomplete installer/signature pair blocks publication; the release no longer silently substitutes MSI for NSIS.
69
70
 
70
- ## Setup wizard
71
-
72
- When you add a project, the setup wizard runs `npx specrails-core@^4.12.0 init --from-config` under the hood (the full spawn is `npx --yes --prefer-online specrails-core@^4.12.0 init --yes --from-config <tempPath>`, with the app writing a temporary `install-config.yaml`). The wizard has three steps — **Configure / Install / Done**.
71
+ Normal quit and updates request an authenticated graceful shutdown of the owned sidecar first, giving processes and persistent logs time to close before a bounded force-stop fallback.
73
72
 
74
- There are two distinct version floors to be aware of:
73
+ ## Setup wizard
75
74
 
76
- - The app **installs** `specrails-core@^4.12.0` — the major-pinned range it ships (4.12.0 is the release that adds the Kimi provider target). The exact package spec is the `CORE_PACKAGE_SPEC` constant in `server/core-package.ts`, so it stays verifiable in one place. You need internet access at install time so `npx` can resolve it.
77
- - The minimum it will **accept** at runtime is **specrails-core ≥ 4.1.0** — the Node-native installer floor (`MIN_NODE_NATIVE_CORE_VERSION`). Anything below that is a legacy bash/python3 installer and cannot run on Windows without WSL.
75
+ Adding a project assembles the framework from the bundled or newer compatible activated core. The installed app includes the Node-native core and OpenSpec resources, so normal project setup does not require a separate core installation. Core updates preserve the previous active framework if switching the Windows junction fails.
78
76
 
79
- You can point the app at a local or linked build with the `SPECRAILS_CORE_BIN` environment variable (it overrides the `npx` spec above).
77
+ Online fallback uses the range in `server/core-package.ts` (currently `specrails-core@^5.0.0`). Runtime selection and the activated version are shared with the Settings view so a restart cannot silently downgrade a newer working core. `SPECRAILS_CORE_BIN` remains available for a deliberately selected local core executable. Legacy pre-4.1 bash/Python installers are not used for Windows setup.
80
78
 
81
79
  Reserved paths (`.specrails/profiles/**`, `.claude/agents/custom-*.md`) are preserved across re-runs per the contract documented in [specrails-core's README](https://github.com/fjpulidop/specrails-core#reserved-paths).
82
80
 
@@ -87,7 +85,7 @@ Reserved paths (`.specrails/profiles/**`, `.claude/agents/custom-*.md`) are pres
87
85
 
88
86
  ## Known limitations
89
87
 
90
- - **Terminal panel shell**: the bottom terminal panel auto-prefers **PowerShell 7 (`pwsh.exe`)** when it is on your `PATH`, then falls back to Windows PowerShell (`powershell.exe`), and finally `COMSPEC`/`cmd.exe`. Set the `SHELL` environment variable to override the platform default with any shell you prefer. Per-session shell selection is not yet exposed in the UI.
88
+ - **Terminal panel shell**: the bottom terminal panel auto-prefers **PowerShell 7 (`pwsh.exe`)** when it is on your `PATH`, then falls back to Windows PowerShell (`powershell.exe`), and finally `COMSPEC`/`cmd.exe`. Unix `SHELL` values inherited from Git Bash are ignored on Windows. Per-session shell selection is not yet exposed in the UI. File drops use the actual session shell; paths that cmd.exe would expand cannot be pasted as if they were literal paths.
91
89
  - **Port 4200** must be free on launch. The app binds `127.0.0.1:4200` for its API + WebSocket. If another process holds it, the app shows a native **Specrails — Port Conflict** dialog and exits. When you need to investigate, two files under `%USERPROFILE%\.specrails\` help: `desktop.log` (the embedded server's log output) and `manager.pid` (the running server's process ID).
92
90
  - **Custom window chrome**: the app uses a frameless window with a custom titlebar; the min/max/close controls are rendered by the app.
93
91
  - **Code signing**: Windows builds are unsigned in v1 (see SmartScreen above). Authenticode signing is deferred to a later release.
@@ -98,3 +96,7 @@ Reserved paths (`.specrails/profiles/**`, `.claude/agents/custom-*.md`) are pres
98
96
  - [Getting started](../getting-started.md) — first run, adding a project, the dashboard tour.
99
97
  - [Codex provider setup](../codex.md), [Gemini provider setup](../gemini.md), and [Kimi provider setup](../kimi.md) — installing and configuring the provider CLIs.
100
98
  - [CLI reference](../cli.md) — driving Specrails from the command line.
99
+
100
+ ## Verification
101
+
102
+ See [Windows parity audit](./windows-parity.md) for coverage, automated release gates and the real-device checks still required before making a compatibility claim. The source checks run on Windows x64 for every change and on ARM64 for pushes to `main` (`windows-parity.yml`, separate from the release-gating CI). Desktop Release installs both NSIS and MSI packages in temporary paths with spaces and exercises the installed server, database, repository browsing, PTY input/output/stop, graceful shutdown and restart.
@@ -68,6 +68,20 @@ boundary, so Kimi + Decider is rejected before the loop starts.
68
68
 
69
69
  ### Pipeline phases
70
70
 
71
+ Core versions that declare the shared execution runtime also keep a durable
72
+ journal for each run. Desktop freezes the selected specs, repository roots and
73
+ ownership in `.specrails/pipeline/<runId>/desktop-context.json`; Core owns the
74
+ separate normalized context, phase state and verification receipts. Retries keep
75
+ valid completed work and resume the first incomplete or invalid phase. A batch
76
+ uses one aggregate change, retaining each ticket's requirements and repository
77
+ scope.
78
+
79
+ Verification can reuse an actual successful command receipt only when its scope,
80
+ candidate files and environment remain current. Acceptance and security review
81
+ are still required, and confidence must pass before archive. A new verification
82
+ step checks receipt freshness again before reporting success. Older Core versions
83
+ continue through the ordinary verification path.
84
+
71
85
  `Implement` and `Batch` run the pipeline phases defined by the slash command's frontmatter — by default:
72
86
 
73
87
  ```