specrails-desktop 2.0.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 (455) hide show
  1. package/.claude/commands/specrails/batch-implement.md +287 -0
  2. package/.claude/commands/specrails/compat-check.md +271 -0
  3. package/.claude/commands/specrails/doctor.md +62 -0
  4. package/.claude/commands/specrails/enrich.md +1635 -0
  5. package/.claude/commands/specrails/explore-spec.md +173 -0
  6. package/.claude/commands/specrails/health-check.md +527 -0
  7. package/.claude/commands/specrails/implement.md +1457 -0
  8. package/.claude/commands/specrails/memory-inspect.md +259 -0
  9. package/.claude/commands/specrails/opsx-diff.md +419 -0
  10. package/.claude/commands/specrails/propose-spec.md +102 -0
  11. package/.claude/commands/specrails/reconfig.md +89 -0
  12. package/.claude/commands/specrails/refactor-recommender.md +212 -0
  13. package/.claude/commands/specrails/retry.md +363 -0
  14. package/.claude/commands/specrails/telemetry.md +552 -0
  15. package/.claude/commands/specrails/why.md +96 -0
  16. package/LICENSE +21 -0
  17. package/README.md +290 -0
  18. package/cli/dist/specrails-desktop.js +1098 -0
  19. package/client/dist/assets/ActivityFeedPage-Gy4x8dBt.js +1 -0
  20. package/client/dist/assets/AgentsPage-CPgu--Fb.js +86 -0
  21. package/client/dist/assets/AnalyticsPage-B5sJEee2.js +1 -0
  22. package/client/dist/assets/BarChart-7IMQ8HY1.js +33 -0
  23. package/client/dist/assets/CodePage-CBdFvbwe.js +2 -0
  24. package/client/dist/assets/DesktopAnalyticsPage-w0rdTq4w.js +1 -0
  25. package/client/dist/assets/DocsDialog-BZUYM7wm.js +11 -0
  26. package/client/dist/assets/DocsPage-9QglWl46.js +11 -0
  27. package/client/dist/assets/ExportDropdown-BLZFXtNi.js +1 -0
  28. package/client/dist/assets/IntegrationsPage-BxBE4y99.js +3 -0
  29. package/client/dist/assets/JobDetailPage-DydWx_5S.js +16 -0
  30. package/client/dist/assets/JobsPage-20ibw0IO.js +1 -0
  31. package/client/dist/assets/abap-Bw6f2wDG.js +1 -0
  32. package/client/dist/assets/activity-BEIp_Y1A.js +1 -0
  33. package/client/dist/assets/activity-BdrPln96.js +1 -0
  34. package/client/dist/assets/activity-CpkRS8Sx.js +1 -0
  35. package/client/dist/assets/activity-DKCpESPt.js +1 -0
  36. package/client/dist/assets/activity-DOUVEjJi.js +1 -0
  37. package/client/dist/assets/activity-DRwkql_y.js +1 -0
  38. package/client/dist/assets/activity-DcDQ7tjw.js +1 -0
  39. package/client/dist/assets/activity-Dv6H7wEr.js +1 -0
  40. package/client/dist/assets/addon-image-3WCl5Vhd.js +1 -0
  41. package/client/dist/assets/addon-ligatures-C5OdliKs.js +2 -0
  42. package/client/dist/assets/addon-webgl-BbX6pSjl.js +44 -0
  43. package/client/dist/assets/addspec-B5yl4Loj.js +1 -0
  44. package/client/dist/assets/addspec-BEeF5-zc.js +1 -0
  45. package/client/dist/assets/addspec-D33ocMxf.js +1 -0
  46. package/client/dist/assets/addspec-DFswZ0jK.js +1 -0
  47. package/client/dist/assets/addspec-DRE-jZv7.js +1 -0
  48. package/client/dist/assets/addspec-DVZ15Jp8.js +1 -0
  49. package/client/dist/assets/addspec-Fkv91Opc.js +1 -0
  50. package/client/dist/assets/addspec-GWm4ffKl.js +1 -0
  51. package/client/dist/assets/agents-1nCDWRmP.js +1 -0
  52. package/client/dist/assets/agents-Bm9rPqnt.js +1 -0
  53. package/client/dist/assets/agents-CMxtJMLD.js +1 -0
  54. package/client/dist/assets/agents-DK-Dlc0i.js +1 -0
  55. package/client/dist/assets/agents-Q6Ldfpxx.js +1 -0
  56. package/client/dist/assets/agents-TeOSy-ax.js +1 -0
  57. package/client/dist/assets/agents-iTqjRajS.js +1 -0
  58. package/client/dist/assets/agents-s87sMGzL.js +1 -0
  59. package/client/dist/assets/agentstudio-B6Wb59E7.js +1 -0
  60. package/client/dist/assets/agentstudio-BADhZ41e.js +1 -0
  61. package/client/dist/assets/agentstudio-BSnWLR63.js +1 -0
  62. package/client/dist/assets/agentstudio-BdidyBzZ.js +1 -0
  63. package/client/dist/assets/agentstudio-CxlUllqI.js +1 -0
  64. package/client/dist/assets/agentstudio-D3I62TLJ.js +1 -0
  65. package/client/dist/assets/agentstudio-DuH9TogZ.js +1 -0
  66. package/client/dist/assets/agentstudio-Kw88_dUF.js +1 -0
  67. package/client/dist/assets/aiedit-BWxHGsYA.js +1 -0
  68. package/client/dist/assets/aiedit-D2ji6Qy0.js +1 -0
  69. package/client/dist/assets/aiedit-DAhZTvtk.js +1 -0
  70. package/client/dist/assets/aiedit-DJMny-D5.js +1 -0
  71. package/client/dist/assets/aiedit-DOcxERkU.js +1 -0
  72. package/client/dist/assets/aiedit-DvrcbwGv.js +1 -0
  73. package/client/dist/assets/aiedit-TTwzL1TS.js +1 -0
  74. package/client/dist/assets/aiedit-WBSjT_C1.js +1 -0
  75. package/client/dist/assets/analytics-BIdr0YfL.js +1 -0
  76. package/client/dist/assets/analytics-C6EzgtdE.js +1 -0
  77. package/client/dist/assets/analytics-C9Zc-rkM.js +1 -0
  78. package/client/dist/assets/analytics-CVx3YOc0.js +1 -0
  79. package/client/dist/assets/analytics-CYj0tfj7.js +1 -0
  80. package/client/dist/assets/analytics-CnY4kNG3.js +1 -0
  81. package/client/dist/assets/analytics-CrPCZRJ-.js +1 -0
  82. package/client/dist/assets/analytics-DMCto-TF.js +1 -0
  83. package/client/dist/assets/apex-Cw8_REBo.js +1 -0
  84. package/client/dist/assets/atom-one-dark-B-oHczHB.css +1 -0
  85. package/client/dist/assets/attachments-BIsSSnHJ.js +1 -0
  86. package/client/dist/assets/attachments-BW4L3l2L.js +1 -0
  87. package/client/dist/assets/attachments-Bcf6BG6V.js +1 -0
  88. package/client/dist/assets/attachments-Bke8sCU4.js +1 -0
  89. package/client/dist/assets/attachments-COcrGRFz.js +1 -0
  90. package/client/dist/assets/attachments-DYHGA2Dj.js +1 -0
  91. package/client/dist/assets/attachments-Dd92KpUH.js +1 -0
  92. package/client/dist/assets/attachments-DzdU6DV6.js +1 -0
  93. package/client/dist/assets/azcli-Cz6HAoOw.js +1 -0
  94. package/client/dist/assets/bat-CcJ-xyqL.js +1 -0
  95. package/client/dist/assets/bicep-z1WDCKYz.js +2 -0
  96. package/client/dist/assets/browser-5ErDlJoR.js +1 -0
  97. package/client/dist/assets/browser-Bc-YdlVg.js +1 -0
  98. package/client/dist/assets/browser-BlYF4OOq.js +1 -0
  99. package/client/dist/assets/browser-CT-ReZGt.js +1 -0
  100. package/client/dist/assets/browser-DGITz3fC.js +1 -0
  101. package/client/dist/assets/browser-JsAIGCEW.js +1 -0
  102. package/client/dist/assets/browser-M5-rbPlw.js +1 -0
  103. package/client/dist/assets/browser-Qya9cARy.js +1 -0
  104. package/client/dist/assets/cameligo-BRewOpfa.js +1 -0
  105. package/client/dist/assets/chat-BEGuC03z.js +1 -0
  106. package/client/dist/assets/chat-BEW60P_u.js +1 -0
  107. package/client/dist/assets/chat-BQNMD0PL.js +1 -0
  108. package/client/dist/assets/chat-BsbNGPW9.js +1 -0
  109. package/client/dist/assets/chat-CboQguCi.js +1 -0
  110. package/client/dist/assets/chat-DRCa9pOt.js +1 -0
  111. package/client/dist/assets/chat-DwUm6W9z.js +1 -0
  112. package/client/dist/assets/chat-yoXwguQu.js +1 -0
  113. package/client/dist/assets/chunk-CilyBKbf.js +1 -0
  114. package/client/dist/assets/clojure-DBjRWN6g.js +1 -0
  115. package/client/dist/assets/clsx-DnqN-uhr.js +1 -0
  116. package/client/dist/assets/code-AL1rVIMb.js +1 -0
  117. package/client/dist/assets/code-C0BKpkht.js +1 -0
  118. package/client/dist/assets/code-C0FTS3ew.js +1 -0
  119. package/client/dist/assets/code-CPcHxzxw.js +1 -0
  120. package/client/dist/assets/code-D3ryDniw.js +1 -0
  121. package/client/dist/assets/code-D3zVVQTj.js +1 -0
  122. package/client/dist/assets/code-PCmfS3dn.js +1 -0
  123. package/client/dist/assets/code-exI0G5Wd.js +1 -0
  124. package/client/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  125. package/client/dist/assets/coffee-Cfk_XHGR.js +1 -0
  126. package/client/dist/assets/commands-B772IyDa.js +1 -0
  127. package/client/dist/assets/commands-BDDp6xFG.js +1 -0
  128. package/client/dist/assets/commands-CJxCry-o.js +1 -0
  129. package/client/dist/assets/commands-CfgY-_of.js +1 -0
  130. package/client/dist/assets/commands-DLrvnPNg.js +1 -0
  131. package/client/dist/assets/commands-IXMOKBYt.js +1 -0
  132. package/client/dist/assets/commands-UD1NzmwX.js +1 -0
  133. package/client/dist/assets/commands-sqrqsxyE.js +1 -0
  134. package/client/dist/assets/common-DCr6VzJ7.js +1 -0
  135. package/client/dist/assets/common-Dard9UNH.js +1 -0
  136. package/client/dist/assets/common-DeDELLZJ.js +1 -0
  137. package/client/dist/assets/common-DltqHaAe.js +1 -0
  138. package/client/dist/assets/common-Dmm1GhdD.js +1 -0
  139. package/client/dist/assets/common-DnjcgkPH.js +1 -0
  140. package/client/dist/assets/common-GbpxfPG8.js +1 -0
  141. package/client/dist/assets/common-wA36jmj1.js +1 -0
  142. package/client/dist/assets/cpp-BVob6BaP.js +1 -0
  143. package/client/dist/assets/csharp-C4fbRuOu.js +1 -0
  144. package/client/dist/assets/csp-DthFP_vT.js +1 -0
  145. package/client/dist/assets/css-CGMH0hcW.js +3 -0
  146. package/client/dist/assets/css.worker-Wv5dxAWO.js +89 -0
  147. package/client/dist/assets/cssMode-Cc6ozl-J.js +1 -0
  148. package/client/dist/assets/cypher-Pnf68BRV.js +1 -0
  149. package/client/dist/assets/dart-PMMOtxZX.js +1 -0
  150. package/client/dist/assets/dashboard-B4ixDVk8.js +1 -0
  151. package/client/dist/assets/dashboard-BZBADHSj.js +1 -0
  152. package/client/dist/assets/dashboard-C1MfeUHs.js +1 -0
  153. package/client/dist/assets/dashboard-C7SK6xu5.js +1 -0
  154. package/client/dist/assets/dashboard-CB6Le1yN.js +1 -0
  155. package/client/dist/assets/dashboard-CoTpMOBM.js +1 -0
  156. package/client/dist/assets/dashboard-Duo4DDCW.js +1 -0
  157. package/client/dist/assets/dashboard-I19DXBxw.js +1 -0
  158. package/client/dist/assets/dist-js-BY-Fv_fg.js +1 -0
  159. package/client/dist/assets/dist-js-Bakc4uxT.js +1 -0
  160. package/client/dist/assets/dockerfile-di1nsJCc.js +1 -0
  161. package/client/dist/assets/ecl-D_WVcB5M.js +1 -0
  162. package/client/dist/assets/editor-Br_kD0ds.css +1 -0
  163. package/client/dist/assets/editor.api2-XLGzZfbc.js +872 -0
  164. package/client/dist/assets/editor.main-CfXxHimg.js +6 -0
  165. package/client/dist/assets/editor.worker-Bd9IXS8d.js +26 -0
  166. package/client/dist/assets/elixir-OAdJEMOn.js +1 -0
  167. package/client/dist/assets/explore-4mFpnrKU.js +1 -0
  168. package/client/dist/assets/explore-A8Ltoblq.js +1 -0
  169. package/client/dist/assets/explore-B9A3iN2W.js +1 -0
  170. package/client/dist/assets/explore-BV5Xxlsn.js +1 -0
  171. package/client/dist/assets/explore-BrBJvfjP.js +1 -0
  172. package/client/dist/assets/explore-C3FSE42C.js +1 -0
  173. package/client/dist/assets/explore-D2EFgt8J.js +1 -0
  174. package/client/dist/assets/explore-hFc3HFcp.js +1 -0
  175. package/client/dist/assets/flow9-D3QEZjgn.js +1 -0
  176. package/client/dist/assets/format-command-CwGuwzGA.js +1 -0
  177. package/client/dist/assets/freemarker2-DP7J1gG3.js +3 -0
  178. package/client/dist/assets/fsharp-BF0k_8N8.js +1 -0
  179. package/client/dist/assets/go-BAQO5Jsz.js +1 -0
  180. package/client/dist/assets/graphql-hdFVFkiV.js +1 -0
  181. package/client/dist/assets/handlebars-BjRlucw6.js +1 -0
  182. package/client/dist/assets/hcl-DWnl1o-X.js +1 -0
  183. package/client/dist/assets/html-OumBQJ-U.js +1 -0
  184. package/client/dist/assets/html.worker-CQP8QQsS.js +502 -0
  185. package/client/dist/assets/htmlMode-CStc3zXM.js +1 -0
  186. package/client/dist/assets/index-CimDRRi7.css +2 -0
  187. package/client/dist/assets/index-XGZaKl_u.js +142 -0
  188. package/client/dist/assets/ini-CB-6OVu3.js +1 -0
  189. package/client/dist/assets/integrations-C3p12Ms6.js +1 -0
  190. package/client/dist/assets/integrations-Cr6hH7XR.js +1 -0
  191. package/client/dist/assets/integrations-Cublz3m6.js +1 -0
  192. package/client/dist/assets/integrations-D28q1kF6.js +1 -0
  193. package/client/dist/assets/integrations-DRdbki5W.js +1 -0
  194. package/client/dist/assets/integrations-DaC4SzzL.js +1 -0
  195. package/client/dist/assets/integrations-DmQYCUvN.js +1 -0
  196. package/client/dist/assets/integrations-HIlUxXVs.js +1 -0
  197. package/client/dist/assets/java-d1CmfiHX.js +1 -0
  198. package/client/dist/assets/javascript-CMk--e7g.js +1 -0
  199. package/client/dist/assets/jobs-BE1siB0M.js +1 -0
  200. package/client/dist/assets/jobs-BHcQ_Faf.js +1 -0
  201. package/client/dist/assets/jobs-CFfc2dNX.js +1 -0
  202. package/client/dist/assets/jobs-CSi5n8X_.js +1 -0
  203. package/client/dist/assets/jobs-Dc3X86PY.js +1 -0
  204. package/client/dist/assets/jobs-De5tASex.js +1 -0
  205. package/client/dist/assets/jobs-DsoXEdo7.js +1 -0
  206. package/client/dist/assets/jobs-Wl-ApPMb.js +1 -0
  207. package/client/dist/assets/json.worker-DzV-CpCQ.js +58 -0
  208. package/client/dist/assets/jsonMode-C2h3ZcjZ.js +7 -0
  209. package/client/dist/assets/julia-Bgv08lKa.js +1 -0
  210. package/client/dist/assets/kotlin-u98kaVTf.js +1 -0
  211. package/client/dist/assets/less-CjYwpgg5.js +2 -0
  212. package/client/dist/assets/lexon-YTjaAFBB.js +1 -0
  213. package/client/dist/assets/lib-CPxTMOAq.js +7 -0
  214. package/client/dist/assets/liquid-mI3KJrBE.js +1 -0
  215. package/client/dist/assets/lspLanguageFeatures-DU09ggWi.js +4 -0
  216. package/client/dist/assets/lua-BzmkWv27.js +1 -0
  217. package/client/dist/assets/m3-CFwk9fw0.js +1 -0
  218. package/client/dist/assets/markdown-CR5iMpSZ.js +1 -0
  219. package/client/dist/assets/mdx-C41VDTR_.js +1 -0
  220. package/client/dist/assets/mips-CcEalc17.js +1 -0
  221. package/client/dist/assets/monaco.contribution-CPObAXMC.js +2 -0
  222. package/client/dist/assets/msdax-BQbkawnr.js +1 -0
  223. package/client/dist/assets/mysql-GTlaaW_P.js +1 -0
  224. package/client/dist/assets/nav-0fwkrgHt.js +1 -0
  225. package/client/dist/assets/nav-BEL3MTwK.js +1 -0
  226. package/client/dist/assets/nav-B_G-TJDW.js +1 -0
  227. package/client/dist/assets/nav-C2YXcbZS.js +1 -0
  228. package/client/dist/assets/nav-ClzOE4mA.js +1 -0
  229. package/client/dist/assets/nav-CtYwmMgu.js +1 -0
  230. package/client/dist/assets/nav-D2bOGSEg.js +1 -0
  231. package/client/dist/assets/nav-iH1V5j6o.js +1 -0
  232. package/client/dist/assets/objective-c-Byu1T5if.js +1 -0
  233. package/client/dist/assets/pascal-BrfzBfRm.js +1 -0
  234. package/client/dist/assets/pascaligo-BXXKFUeo.js +1 -0
  235. package/client/dist/assets/perl-B3OikKq-.js +1 -0
  236. package/client/dist/assets/pgsql-CTsa0Acc.js +1 -0
  237. package/client/dist/assets/php-DiQh3FUW.js +1 -0
  238. package/client/dist/assets/pla-92uH8Fzm.js +1 -0
  239. package/client/dist/assets/postiats-BbeWkKUr.js +1 -0
  240. package/client/dist/assets/powerquery-DgDMzpsm.js +1 -0
  241. package/client/dist/assets/powershell-BfdUUzaG.js +1 -0
  242. package/client/dist/assets/preload-helper-DSXbuxSR.js +1 -0
  243. package/client/dist/assets/protobuf-BojW2ftW.js +2 -0
  244. package/client/dist/assets/pug-BxqTg3IU.js +1 -0
  245. package/client/dist/assets/python-Y27rKQtk.js +1 -0
  246. package/client/dist/assets/qsharp-BX_A-MW9.js +1 -0
  247. package/client/dist/assets/r-D9BMnxvJ.js +1 -0
  248. package/client/dist/assets/razor-Cd5-q9Bp.js +1 -0
  249. package/client/dist/assets/redis-5cJqEQJJ.js +1 -0
  250. package/client/dist/assets/redshift-d8BBqiwb.js +1 -0
  251. package/client/dist/assets/restructuredtext-C8a6yIcZ.js +1 -0
  252. package/client/dist/assets/ruby-egeh-6KX.js +1 -0
  253. package/client/dist/assets/rust-a3r9IInB.js +1 -0
  254. package/client/dist/assets/sb-y8iRIDei.js +1 -0
  255. package/client/dist/assets/scala-BPDK2AmK.js +1 -0
  256. package/client/dist/assets/scheme-BIWUEoOs.js +1 -0
  257. package/client/dist/assets/scss-CA-PSzwg.js +3 -0
  258. package/client/dist/assets/settings-55oDcbSh.js +1 -0
  259. package/client/dist/assets/settings-Bd4Tq1RB.js +1 -0
  260. package/client/dist/assets/settings-CCSM-Fhn.js +1 -0
  261. package/client/dist/assets/settings-D3e_bDoW.js +1 -0
  262. package/client/dist/assets/settings-DKbTkbn7.js +1 -0
  263. package/client/dist/assets/settings-Dxpo6_w7.js +1 -0
  264. package/client/dist/assets/settings-bt84e3Aa.js +1 -0
  265. package/client/dist/assets/settings-nu68QukM.js +1 -0
  266. package/client/dist/assets/setup-BMqwfbW9.js +1 -0
  267. package/client/dist/assets/setup-Bb5LcG28.js +1 -0
  268. package/client/dist/assets/setup-BeEx2_da.js +1 -0
  269. package/client/dist/assets/setup-CCCrB53Q.js +1 -0
  270. package/client/dist/assets/setup-CJA0ATmd.js +1 -0
  271. package/client/dist/assets/setup-CeiDbZcb.js +1 -0
  272. package/client/dist/assets/setup-Cus7TApA.js +1 -0
  273. package/client/dist/assets/setup-D9qOs2Xo.js +1 -0
  274. package/client/dist/assets/shell--LiT1Bja.js +1 -0
  275. package/client/dist/assets/solidity-DdqZccZg.js +1 -0
  276. package/client/dist/assets/sophia-S6-YxNG_.js +1 -0
  277. package/client/dist/assets/sparql-BSf5kMp2.js +1 -0
  278. package/client/dist/assets/specs-BFfu3u-a.js +1 -0
  279. package/client/dist/assets/specs-B__C8-8a.js +1 -0
  280. package/client/dist/assets/specs-CZ1PsXsC.js +1 -0
  281. package/client/dist/assets/specs-D2FzlLn9.js +1 -0
  282. package/client/dist/assets/specs-DaUTrNF9.js +1 -0
  283. package/client/dist/assets/specs-Dyc5hYeE.js +1 -0
  284. package/client/dist/assets/specs-cKEh2LXt.js +1 -0
  285. package/client/dist/assets/specs-k0PyLDVt.js +1 -0
  286. package/client/dist/assets/sql-D7KgjR8G.js +1 -0
  287. package/client/dist/assets/st-BnoDa-Ml.js +1 -0
  288. package/client/dist/assets/swift-DEUHTkUX.js +1 -0
  289. package/client/dist/assets/systemverilog-Tqb_KPnW.js +1 -0
  290. package/client/dist/assets/tcl-BmBFS2qq.js +1 -0
  291. package/client/dist/assets/terminal-80yDMgMF.js +1 -0
  292. package/client/dist/assets/terminal-Bje4ziIa.js +1 -0
  293. package/client/dist/assets/terminal-C2WYcFHF.js +1 -0
  294. package/client/dist/assets/terminal-CSONJOex.js +1 -0
  295. package/client/dist/assets/terminal-DEqzGtcr.js +1 -0
  296. package/client/dist/assets/terminal-DeWzh6ys.js +1 -0
  297. package/client/dist/assets/terminal-YOlsJCQj.js +1 -0
  298. package/client/dist/assets/terminal-lkZYR4wJ.js +1 -0
  299. package/client/dist/assets/tickets-CB7N30gm.js +1 -0
  300. package/client/dist/assets/tickets-CF2PYelu.js +1 -0
  301. package/client/dist/assets/tickets-DNOANUXr.js +1 -0
  302. package/client/dist/assets/tickets-DU1aqsbr.js +1 -0
  303. package/client/dist/assets/tickets-DYvafSaY.js +1 -0
  304. package/client/dist/assets/tickets-DlpC_iTg.js +1 -0
  305. package/client/dist/assets/tickets-DucYgtdl.js +1 -0
  306. package/client/dist/assets/tickets-clefmXLv.js +1 -0
  307. package/client/dist/assets/ts.worker-METxwbDZ.js +67719 -0
  308. package/client/dist/assets/tsMode-B0y_xEci.js +11 -0
  309. package/client/dist/assets/twig-BQV8igWC.js +1 -0
  310. package/client/dist/assets/typescript-BzK0OgwW.js +1 -0
  311. package/client/dist/assets/typespec-DlFroUGY.js +1 -0
  312. package/client/dist/assets/useProjectCache-DSaiGFjV.js +1 -0
  313. package/client/dist/assets/vb-BlrJpIMX.js +1 -0
  314. package/client/dist/assets/wgsl-BWgIc6FZ.js +298 -0
  315. package/client/dist/assets/workers-rt--R2Qy.js +1 -0
  316. package/client/dist/assets/xml-eX9QXAmI.js +1 -0
  317. package/client/dist/assets/yaml-fcsNkpOt.js +1 -0
  318. package/client/dist/index.html +246 -0
  319. package/docs/README.md +54 -0
  320. package/docs/cli.md +198 -0
  321. package/docs/codex.md +210 -0
  322. package/docs/creating-specs.md +197 -0
  323. package/docs/customizing.md +197 -0
  324. package/docs/getting-started.md +140 -0
  325. package/docs/internals/README.md +25 -0
  326. package/docs/internals/adding-a-provider.md +238 -0
  327. package/docs/internals/api-reference.md +634 -0
  328. package/docs/internals/architecture.md +332 -0
  329. package/docs/internals/configuration.md +172 -0
  330. package/docs/internals/openspec-workflow.md +282 -0
  331. package/docs/internals/operations-runbook.md +198 -0
  332. package/docs/internals/profiles.md +152 -0
  333. package/docs/platforms/macos.md +130 -0
  334. package/docs/platforms/windows.md +81 -0
  335. package/docs/running-pipelines.md +240 -0
  336. package/docs/terminal.md +138 -0
  337. package/docs/tracking-cost.md +155 -0
  338. package/package.json +82 -0
  339. package/server/dist/agent-generator.js +232 -0
  340. package/server/dist/agent-refine-db.js +124 -0
  341. package/server/dist/agent-refine-manager.js +526 -0
  342. package/server/dist/ai-invocations.js +111 -0
  343. package/server/dist/attachment-manager.js +299 -0
  344. package/server/dist/auth.js +207 -0
  345. package/server/dist/binary-probe.js +35 -0
  346. package/server/dist/browser-capture-manager.js +576 -0
  347. package/server/dist/browser-capture-types.js +28 -0
  348. package/server/dist/browser-network.js +149 -0
  349. package/server/dist/browser-playwright.js +888 -0
  350. package/server/dist/build-dirs.js +44 -0
  351. package/server/dist/changes-reader.js +120 -0
  352. package/server/dist/chat-manager.js +1060 -0
  353. package/server/dist/chromium-resolver.js +311 -0
  354. package/server/dist/code-explorer-router.js +788 -0
  355. package/server/dist/codex-otel-bridge.js +235 -0
  356. package/server/dist/command-resolver.js +102 -0
  357. package/server/dist/config.js +306 -0
  358. package/server/dist/context-budget.js +113 -0
  359. package/server/dist/context-scope.js +279 -0
  360. package/server/dist/contract-refine-runner.js +521 -0
  361. package/server/dist/core-compat.js +207 -0
  362. package/server/dist/core-package.js +14 -0
  363. package/server/dist/db.js +1034 -0
  364. package/server/dist/desktop-analytics.js +156 -0
  365. package/server/dist/desktop-db.js +456 -0
  366. package/server/dist/desktop-router.js +735 -0
  367. package/server/dist/docs-router.js +207 -0
  368. package/server/dist/explore-contract-refine.js +421 -0
  369. package/server/dist/explore-cwd-manager.js +242 -0
  370. package/server/dist/explore-draft-title.js +47 -0
  371. package/server/dist/explore-smash.js +450 -0
  372. package/server/dist/feature-flags.js +17 -0
  373. package/server/dist/file-provenance.js +382 -0
  374. package/server/dist/file-summary-generator.js +221 -0
  375. package/server/dist/file-summary-manager.js +689 -0
  376. package/server/dist/hooks.js +102 -0
  377. package/server/dist/ids.js +7 -0
  378. package/server/dist/index.js +586 -0
  379. package/server/dist/metrics.js +136 -0
  380. package/server/dist/mobile/index.js +16 -0
  381. package/server/dist/mobile/mobile-admin-router.js +84 -0
  382. package/server/dist/mobile/mobile-auth.js +67 -0
  383. package/server/dist/mobile/mobile-devices.js +80 -0
  384. package/server/dist/mobile/mobile-event-bus.js +39 -0
  385. package/server/dist/mobile/mobile-gateway.js +285 -0
  386. package/server/dist/mobile/mobile-mdns.js +81 -0
  387. package/server/dist/mobile/mobile-pairing.js +179 -0
  388. package/server/dist/mobile/mobile-redact.js +53 -0
  389. package/server/dist/mobile/mobile-router.js +411 -0
  390. package/server/dist/mobile/mobile-tls.js +86 -0
  391. package/server/dist/mobile/mobile-types.js +9 -0
  392. package/server/dist/mobile/mobile-ws.js +275 -0
  393. package/server/dist/path-resolver.js +298 -0
  394. package/server/dist/plugin-manager.js +617 -0
  395. package/server/dist/plugins/claude-approval.js +179 -0
  396. package/server/dist/plugins/claude-md-mutation.js +146 -0
  397. package/server/dist/plugins/codex-mcp.js +108 -0
  398. package/server/dist/plugins/contributors.js +72 -0
  399. package/server/dist/plugins/drift.js +58 -0
  400. package/server/dist/plugins/index.js +14 -0
  401. package/server/dist/plugins/json-mutation.js +120 -0
  402. package/server/dist/plugins/manager.js +32 -0
  403. package/server/dist/plugins/ownership.js +86 -0
  404. package/server/dist/plugins/paths.js +37 -0
  405. package/server/dist/plugins/prereq-installer.js +104 -0
  406. package/server/dist/plugins/rail-integration.js +79 -0
  407. package/server/dist/plugins/serena/index.js +13 -0
  408. package/server/dist/plugins/serena/install.js +91 -0
  409. package/server/dist/plugins/serena/instructions-content.js +21 -0
  410. package/server/dist/plugins/serena/manifest.js +111 -0
  411. package/server/dist/plugins/serena/verify.js +78 -0
  412. package/server/dist/plugins-router.js +215 -0
  413. package/server/dist/pricing.js +89 -0
  414. package/server/dist/profile-manager.js +310 -0
  415. package/server/dist/profiles-router.js +759 -0
  416. package/server/dist/project-registry.js +443 -0
  417. package/server/dist/project-router.js +4016 -0
  418. package/server/dist/proposal-manager.js +291 -0
  419. package/server/dist/provider-selection.js +69 -0
  420. package/server/dist/providers/claude-adapter.js +281 -0
  421. package/server/dist/providers/codex-adapter.js +264 -0
  422. package/server/dist/providers/index.js +23 -0
  423. package/server/dist/providers/registry.js +37 -0
  424. package/server/dist/providers/types.js +22 -0
  425. package/server/dist/queue-manager.js +1511 -0
  426. package/server/dist/rails-router.js +362 -0
  427. package/server/dist/rails-store.js +116 -0
  428. package/server/dist/result-event.js +106 -0
  429. package/server/dist/schemas/profile.v1.json +151 -0
  430. package/server/dist/setup-manager.js +1165 -0
  431. package/server/dist/setup-prerequisites.js +372 -0
  432. package/server/dist/smash-runner.js +663 -0
  433. package/server/dist/spec-draft-parser.js +133 -0
  434. package/server/dist/spec-launcher-manager.js +174 -0
  435. package/server/dist/spec-models.js +32 -0
  436. package/server/dist/specrails-tech-client.js +82 -0
  437. package/server/dist/spending.js +448 -0
  438. package/server/dist/telemetry-compactor.js +180 -0
  439. package/server/dist/telemetry-export.js +317 -0
  440. package/server/dist/telemetry-receiver.js +224 -0
  441. package/server/dist/terminal-manager.js +633 -0
  442. package/server/dist/terminal-marks-store.js +117 -0
  443. package/server/dist/terminal-osc-parser.js +159 -0
  444. package/server/dist/terminal-settings.js +282 -0
  445. package/server/dist/terminal-shell-integration.js +196 -0
  446. package/server/dist/ticket-broadcast.js +47 -0
  447. package/server/dist/ticket-store.js +397 -0
  448. package/server/dist/ticket-watcher.js +117 -0
  449. package/server/dist/types.js +10 -0
  450. package/server/dist/user-mcp-config.js +117 -0
  451. package/server/dist/util/cli-prompt.js +181 -0
  452. package/server/dist/util/secure-fs.js +50 -0
  453. package/server/dist/util/win-spawn.js +43 -0
  454. package/server/dist/webhook-manager.js +89 -0
  455. package/server/dist/ws-routing.js +47 -0
@@ -0,0 +1,130 @@
1
+ # Specrails on macOS
2
+
3
+ ## Supported configurations
4
+
5
+ - **macOS on Apple Silicon (arm64)** — the only architecture the shipped desktop build targets. The official `.dmg` is built on Apple-Silicon CI and named `specrails-desktop-<version>-aarch64.dmg`.
6
+ - Intel Macs are supported only via Rosetta / forward-compat. There is no native x86_64 macOS build today.
7
+
8
+ ## Installation
9
+
10
+ Signed, notarized builds are published on every release under:
11
+
12
+ > 📥 `https://specrails.dev/downloads/specrails-desktop/latest/`
13
+
14
+ - `specrails-desktop-<version>-aarch64.dmg` — the Apple Silicon installer.
15
+
16
+ Versioned copies live at `downloads/specrails-desktop/v<version>/` for archival and deep-linking. A machine-readable `manifest.json` in `latest/` describes the current release (version, sha256, size) so you can verify a download:
17
+
18
+ ```bash
19
+ shasum -a 256 specrails-desktop-<version>-aarch64.dmg
20
+ ```
21
+
22
+ Compare the output against `platforms["darwin-arm64"].sha256` in `https://specrails.dev/downloads/specrails-desktop/latest/manifest.json`.
23
+
24
+ To install: open the `.dmg` and drag **Specrails** into `Applications/`.
25
+
26
+ ## Gatekeeper / first launch
27
+
28
+ Official installers from the release pipeline are **code-signed and notarized**, so they open cleanly — double-click to launch, no extra steps.
29
+
30
+ **Local or self-built `.app` bundles are unsigned.** Gatekeeper will warn that the app is from an unidentified developer. To run an unsigned local build:
31
+
32
+ - Right-click the app in `Applications/` → **Open** → confirm **Open** in the dialog, or
33
+ - Clear the quarantine attribute from a terminal:
34
+
35
+ ```bash
36
+ xattr -dr com.apple.quarantine "/Applications/Specrails.app"
37
+ ```
38
+
39
+ You only need this once per build. It does not apply to the notarized installers above.
40
+
41
+ ## Prerequisites
42
+
43
+ When you add a project, the app checks for the tools it needs and surfaces them in a **prerequisites panel** (in the `Add Project` dialog and the setup wizard). It checks:
44
+
45
+ - **Bundled tools** — `node`, `npm`, `npx`, `git`.
46
+ - **Provider CLIs** — **Claude Code** and **Codex**. These are always probed via your system `PATH` (never bundled). **At least one provider must be installed and working** before Add Project is enabled — if neither is usable the panel blocks the dialog.
47
+
48
+ When everything is in order, the panel collapses to a single line: **All required tools detected** (no per-tool rows, no version numbers). The detailed per-tool list — with versions, and including the Claude/Codex provider rows — only renders when something is **missing**, below its minimum version, or broken.
49
+
50
+ ## PATH resolution
51
+
52
+ GUI apps on macOS inherit a minimal `PATH` from launchd when launched from Finder, Dock, or Spotlight. On Apple Silicon this typically omits `/opt/homebrew/bin` and any tool-version-manager shims. The app resolves this differently depending on whether it is running as the shipped desktop app or as a plain server.
53
+
54
+ ### Desktop app (the default for `.dmg` users)
55
+
56
+ The shipped desktop app bundles its own Node and Git runtimes. When those bundled binaries are present, the Tauri host sets `SPECRAILS_IS_DESKTOP=1` and `SPECRAILS_BUNDLED_RUNTIMES_PATH` before spawning the embedded server (`src-tauri/src/lib.rs`). In that mode `resolveStartupPath()` (in `server/path-resolver.ts`):
57
+
58
+ - Prepends the **bundled** `node` and `git` bin directories to the front of `process.env.PATH`. A system Homebrew or nvm-managed `node`/`git` can never shadow them.
59
+ - **Skips** the Homebrew fast-path prepend entirely.
60
+ - **Skips** the login-shell merge — `augmentPathFromLoginShell()` is a no-op so it cannot reorder system tools ahead of the bundled ones (`loginShellStatus: "skipped"`).
61
+
62
+ If a build ships **without** the bundled runtimes (or has a partial/botched extraction), the desktop app does **not** dead-end: it falls through to the same system discovery described below, so a system-installed `node`/`git` still satisfies the requirement.
63
+
64
+ ### Server / non-bundled fallback
65
+
66
+ When the app runs without an active bundle (a runtimes-less build, or `npm run dev:server`), the app reconstructs `PATH` in two steps:
67
+
68
+ 1. **Fast path (sync)** — `resolveStartupPath()` prepends any missing well-known package-manager directories to `process.env.PATH`:
69
+ - `/opt/homebrew/bin`, `/opt/homebrew/sbin` (Apple Silicon Homebrew prefix)
70
+ - `/usr/local/bin`, `/usr/local/sbin` (Intel/Rosetta forward-compat and `.pkg` installer destination)
71
+
72
+ Existing entries keep their original order; the fast path only fills gaps.
73
+
74
+ 2. **Login-shell merge (async)** — right after the HTTP server starts listening, `augmentPathFromLoginShell()` spawns `$SHELL -l -i` once (1500 ms timeout) and merges whatever `PATH` that login + interactive shell exposes. This recovers the segments that Volta, nvm, fnm, asdf, etc. add only inside your interactive shell — whatever your `$SHELL` produces, no specific rc file is assumed. On timeout or non-zero exit, the fast-path `PATH` stays in effect and a single warning is logged.
75
+
76
+ The resolved `PATH` is stored on `process.env.PATH`, so every downstream spawn inherits it (`QueueManager` → provider CLI, `SetupManager` → `npx specrails-core`, `terminalManager` PTYs, etc.).
77
+
78
+ ## Broken-symlink detection
79
+
80
+ If `which node` succeeds but `node --version` fails (typical with a stale `/usr/local/bin/node` symlink left by an old installer pointing at a deleted `Cellar` target), the prerequisites response sets:
81
+
82
+ - `installed: true`
83
+ - `executable: false`
84
+ - `meetsMinimum: false`
85
+ - `installHint`: `node found at <path> but failed to execute — possibly a broken symlink or a stale install. Reinstall node or remove the stale link at <path>.`
86
+
87
+ This points you at the actual fix (remove the stale link) instead of sending you in circles reinstalling Node. A separate state — installed, executable, but **below** the required version — reads as `<version> found — needs <minVersion>+`.
88
+
89
+ ## Diagnostic endpoint
90
+
91
+ `GET /api/setup-prerequisites?diagnostic=1` returns the standard payload plus a `diagnostic` block. Example (illustrative — real payloads also carry `pathSources: "bundled"` segments in desktop mode):
92
+
93
+ ```jsonc
94
+ {
95
+ "diagnostic": {
96
+ "pathSegments": ["/opt/homebrew/bin", "/opt/homebrew/sbin", "/usr/local/bin", "/usr/local/sbin", "/usr/bin", "/bin"],
97
+ "pathSources": ["fast-path", "fast-path", "fast-path", "fast-path", "inherited", "inherited"],
98
+ "loginShellStatus": "ok", // "ok" | "skipped" | "timeout" | "error"
99
+ "whichResults": { // also includes provider CLIs (and "uv" when applicable)
100
+ "node": "/opt/homebrew/bin/node",
101
+ "npm": "/opt/homebrew/bin/npm",
102
+ "npx": "/opt/homebrew/bin/npx",
103
+ "git": "/usr/bin/git",
104
+ "claude": "/opt/homebrew/bin/claude",
105
+ "codex": null
106
+ },
107
+ "nodeEnv": "production",
108
+ "platform": "darwin"
109
+ }
110
+ }
111
+ ```
112
+
113
+ `whichResults` is keyed by command name for **every** prerequisite the panel checks, so it includes `claude`/`codex` (and `uv` when probed) on top of the four bundled tools.
114
+
115
+ The install-instructions modal exposes a **Copy diagnostics** button that fetches this endpoint and copies the JSON to the clipboard for bug reports. The base endpoint (no `?diagnostic=1`) omits the `diagnostic` field, keeping the regular UI poll small.
116
+
117
+ ## Verifying manually
118
+
119
+ After installing or reinstalling Node (or a provider CLI):
120
+
121
+ 1. Quit Specrails completely (**Cmd-Q**, not just close the window).
122
+ 2. Relaunch from `Applications/`.
123
+ 3. Open the `Add Project` dialog.
124
+ 4. The panel should collapse to **All required tools detected**. If something is still flagged, the per-tool list expands — find the red row, click **More info → Copy diagnostics**, and inspect its `whichResults` entry and `pathSegments` to see whether the resolver found the binary you expect.
125
+
126
+ ## Known limitations
127
+
128
+ - **Provider requirement**: at least one of Claude Code or Codex must be installed and on `PATH`; otherwise Add Project stays disabled.
129
+ - **Port 4200** must be free on launch. The app binds `127.0.0.1:4200` for its API + WebSocket; if another process holds the port, the server cannot start.
130
+ - **Terminal panel**: the bottom terminal panel spawns `$SHELL -l -i`, so your `.zshrc` / `.bashrc` loads as it would in a normal login shell. Per-session shell selection is not yet exposed in the UI — set `SHELL` to override the default.
@@ -0,0 +1,81 @@
1
+ # Specrails on Windows
2
+
3
+ > The installed app, its Start Menu entry, and its window title all read **Specrails** — that is the packaged product name.
4
+
5
+ ## Supported configurations
6
+
7
+ - **Windows 10** (1809 or newer) and **Windows 11**.
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).
10
+
11
+ ## Installation
12
+
13
+ Installers are published on every release under:
14
+
15
+ > 📥 `https://specrails.dev/downloads/specrails-desktop/latest/`
16
+
17
+ Pick the pair that matches your CPU architecture:
18
+
19
+ | Architecture | NSIS installer (recommended) | MSI installer (enterprise/group-policy) |
20
+ | --- | --- | --- |
21
+ | x64 | `specrails-desktop-<version>-x64-setup.exe` | `specrails-desktop-<version>-x64.msi` |
22
+ | ARM64 | `specrails-desktop-<version>-arm64-setup.exe` | `specrails-desktop-<version>-arm64.msi` |
23
+
24
+ If you are unsure which to use, the NSIS `-setup.exe` is the right choice for individual installs; the MSI exists for enterprise deployment. Versioned copies live at `downloads/specrails-desktop/v<version>/` for archival and deep-linking.
25
+
26
+ A machine-readable `manifest.json` in `latest/` describes the current release (version, sha256, size) per platform, including `windows-x64` and `windows-arm64` entries — consumers can read it to build download links without hardcoding a version.
27
+
28
+ ## SmartScreen warning
29
+
30
+ The Windows installers are **not code-signed** in v1. Running them triggers Microsoft SmartScreen:
31
+
32
+ > **Windows protected your PC**
33
+ > Microsoft Defender SmartScreen prevented an unrecognized app from starting. Running this app might put your PC at risk.
34
+
35
+ To install:
36
+
37
+ 1. Click **More info**
38
+ 2. Click **Run anyway**
39
+
40
+ This warning is expected and will persist until Authenticode code signing is added in a later release. The installer and the bundled server binary are built by GitHub Actions from source, and their sha256 hashes are published in `manifest.json` — verify before running if you want higher assurance:
41
+
42
+ ```powershell
43
+ Get-FileHash specrails-desktop-<version>-x64-setup.exe -Algorithm SHA256
44
+ ```
45
+
46
+ Compare the output against the matching architecture's `sha256` (`platforms["windows-x64"].sha256` or `platforms["windows-arm64"].sha256`) in `https://specrails.dev/downloads/specrails-desktop/latest/manifest.json`.
47
+
48
+ ## What's bundled
49
+
50
+ The desktop app ships its own **Node** and **Git** runtimes inside the bundle, so you do **not** need to pre-install them:
51
+
52
+ - `runtimes/node/{node.exe, npm.cmd, npx.cmd}`
53
+ - `runtimes/git/cmd/git.exe`
54
+
55
+ When the bundle is present, the Tauri host sets `SPECRAILS_IS_DESKTOP=1` and `SPECRAILS_BUNDLED_RUNTIMES_PATH`, and the embedded server prepends the bundled `node`/`git` directories to the front of `PATH` so a system install can never shadow them. If a build ships **without** the runtimes (or a partial extraction occurs), the app does not dead-end — it falls back to discovering `node`/`git` on your system `PATH` (probed with Windows `where.exe`) instead of reporting a corrupted bundle.
56
+
57
+ The **provider CLIs** — **Claude Code** and **Codex** — are **never bundled**. They are always probed via your system `PATH`, in every mode. Install at least one before adding a project; the prerequisites panel blocks Add Project until one is usable.
58
+
59
+ ## Updates
60
+
61
+ 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. Because the installers are unsigned, an applied update may surface the same SmartScreen prompt; click **More info → Run anyway** as during the first install.
62
+
63
+ ## Setup wizard
64
+
65
+ When you add a project, the setup wizard runs `npx specrails-core@latest init --from-config` under the hood (the full spawn is `npx --yes --prefer-online specrails-core@latest init --yes --from-config <tempPath>`, with the app writing a temporary `install-config.yaml`). The wizard has three steps — **Configure / Install / Done**.
66
+
67
+ This requires **specrails-core ≥ 4.1.0** — the Node-native installer floor enforced by the app (`MIN_NODE_NATIVE_CORE_VERSION`). Earlier bash/python3 installers cannot run on Windows without WSL. The app pins `@latest` on every spawn, so the constraint resolves automatically as long as you have internet access at install time.
68
+
69
+ 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).
70
+
71
+ ## Uninstall
72
+
73
+ - NSIS: use the **Start Menu → Specrails → Uninstall** entry, or *Settings → Apps*.
74
+ - MSI: use *Settings → Apps* or `msiexec /x <msi-path>`.
75
+
76
+ ## Known limitations
77
+
78
+ - **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.
79
+ - **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.
80
+ - **Custom window chrome**: the app uses a frameless window with a custom titlebar; the min/max/close controls are rendered by the app.
81
+ - **Code signing**: Windows builds are unsigned in v1 (see SmartScreen above). Authenticode signing is deferred to a later release.
@@ -0,0 +1,240 @@
1
+ # Running pipelines
2
+
3
+ You have specs on the board. Now let's ship them. This guide covers launching a rail, the three rail modes, agent profiles, plugins, and the Jobs page.
4
+
5
+ ## The big picture
6
+
7
+ ```
8
+ SpecsBoard (left) Rails (right)
9
+ ───────────────── ─────────────────
10
+ #1 Login flow ─┐
11
+ #2 Webhook retry │ drag onto
12
+ #3 Cost limits │ ────────────► Rail 1
13
+ #4 Audit log │ ▶ Play
14
+
15
+ └────────────► Rail 2
16
+ ▶ Play
17
+
18
+ Each rail runs Architect → Developer → Reviewer → Ship
19
+ in your project directory.
20
+ ```
21
+
22
+ A **rail** is an execution lane. Drag a spec card from the SpecsBoard onto a rail and press **▶ Play** to launch the pipeline. Rails let you organise and queue work into named lanes.
23
+
24
+ Rails run on **Claude** by default. If your project has both providers installed, a per-rail engine selector lets you launch a rail on **Codex** instead — see [Using Codex](codex.md).
25
+
26
+ > **One job at a time per project.** Each project has a single queue, so within a project only one rail job runs at a time; the rest queue behind it. Real parallelism is **across projects** — open two projects and their rails run independently. See [Running multiple rails](#running-multiple-rails).
27
+
28
+ ## Rails
29
+
30
+ Each rail has a header with:
31
+
32
+ - **Status pill** — `idle`, `running`, or `failed`. (There's no separate "completed" state — a rail returns to `idle` when its job finishes cleanly.)
33
+ - **Spec list** — the IDs of the specs assigned to this rail. Drag in more, drag out to detach. You can also use the **Move to rail** popover from a spec card; it shows a status dot per rail so you don't push work onto a busy lane.
34
+ - **Mode segmented control** — `Implement`, `Batch`, and (Claude rails only) `Ultra`. See [Rail modes](#rail-modes).
35
+ - **Profile picker** — which agent profile this rail uses. This only appears once the project has **at least one** profile (create them on the Agents page). When present, `No profile` runs the rail in legacy mode.
36
+ - **Engine selector** — Claude vs Codex. Only renders on projects with more than one provider installed.
37
+ - **Play / Stop button** — start or cancel.
38
+
39
+ ### Rail modes
40
+
41
+ The mode is a segmented control in the rail header, persisted per rail.
42
+
43
+ | Mode | Command | What it does |
44
+ |------|---------|--------------|
45
+ | **Implement** | `/specrails:implement` | One job covering all the specs on the rail. Runs the full Architect → Developer → Reviewer → Ship pipeline. |
46
+ | **Batch** | `/specrails:batch-implement` | One job that works through the rail's specs sequentially, in dependency-aware waves. |
47
+ | **Ultra** | (Ultracode) | Claude implements each spec autonomously, **bypassing** the OpenSpec pipeline. One independent job per spec. Claude only. |
48
+
49
+ ### Pipeline phases
50
+
51
+ `Implement` and `Batch` run the pipeline phases defined by the slash command's frontmatter — by default:
52
+
53
+ ```
54
+ Architect ──► Developer ──► Reviewer ──► Ship
55
+ ```
56
+
57
+ Each phase is a specialised Claude Code agent invoked in your project's working directory:
58
+
59
+ | Phase | Agent | What it does |
60
+ |-------|-------|--------------|
61
+ | Architect | `sr-architect` | Plans the implementation |
62
+ | Developer | `sr-developer` | Writes the code |
63
+ | Reviewer | `sr-reviewer` | Reviews the output |
64
+ | Ship | (varies) | Final wrap-up: tests, commit, PR draft |
65
+
66
+ The exact agent for each phase is determined by your project's agent profile. The baseline trio (`sr-architect`, `sr-developer`, `sr-reviewer`) is mandatory; routing rules in the profile can fan-out or override. The phase progress bar only renders when the command defines phases.
67
+
68
+ ### Ultracode mode
69
+
70
+ `Ultra` is a Claude-only mode that skips the Architect → Developer → Reviewer → Ship pipeline entirely. Instead of orchestrating the agent chain, it hands Claude a configurable pre-prompt plus the full spec text and lets it work autonomously with its native tools.
71
+
72
+ - **One job per spec.** If the rail has three specs, `Ultra` launches three independent jobs.
73
+ - **Variable cost.** Because the run is open-ended, pressing Play opens a confirmation dialog before anything spawns.
74
+ - **Model picker.** A per-rail control lets you pick **Haiku / Sonnet / Opus** (default Sonnet) for the Ultracode run.
75
+ - **Claude only.** The `Ultra` segment and its model picker only appear when the rail's engine is Claude. Agent profiles don't apply to Ultracode rails.
76
+
77
+ You can customise the Ultracode pre-prompt per project on the [Settings page](customizing.md#per-project-settings).
78
+
79
+ ### Running multiple rails
80
+
81
+ Within a single project, jobs are **serialised** — the project runs one rail job at a time and queues the rest. Adding more rails organises your work into lanes, but it doesn't make them run concurrently inside that project.
82
+
83
+ True parallelism is **across projects**: each project has its own queue, so rails in different projects run at the same time without contending. There is no global concurrency limit to configure — the only automatic throttle is budget-based (see [Stopping everything](#stopping-everything)).
84
+
85
+ ## Jobs
86
+
87
+ Every rail run becomes a **Job**. Find them under **Jobs** in the project's right sidebar.
88
+
89
+ ### Jobs page
90
+
91
+ A card list of every job for the active project, newest first. Each card shows:
92
+
93
+ - A status badge, the profile badge, a priority badge, duration, cost, and the launched command.
94
+
95
+ Controls above the list:
96
+
97
+ - **Status filter chips** — click to show only jobs in a given status.
98
+ - **Date-range filter** — narrow to a window of time.
99
+ - **Compare** — enter compare mode, select two jobs, and open a side-by-side comparison.
100
+
101
+ Click a card to open the **Job Detail page**.
102
+
103
+ ### Job Detail page
104
+
105
+ Two purpose-built components above the streaming log:
106
+
107
+ - **`JobStatusPanel`** — header with a status icon, a live duration ticker, and an incremental counter for turns + tokens + cost (derived from streaming `assistant` events). Cost shows `—` until the authoritative `total_cost_usd` arrives at job exit.
108
+ - **`JobTicketHeader`** — chips for every ticket the job touched (resolved by parsing the `command` and matching against the spec board). Click a chip to open the spec's detail modal over the job page without changing the route. A `+N more` collapse mode kicks in at ≥ 4 tickets.
109
+
110
+ Below: the full streaming log with auto-scroll, search, and copy.
111
+
112
+ ### Cancelling a job
113
+
114
+ Click **Stop** on the rail header. The app sends `SIGTERM` to the subprocess, waits **5 s**, then `SIGKILL`.
115
+
116
+ ### Diagnostic export
117
+
118
+ Visible only when [telemetry](customizing.md#telemetry) was enabled for the job. Click **Export diagnostic** in the Job Detail header to download a ZIP containing:
119
+
120
+ - `job-metadata.json` — command, status, profile, plugins
121
+ - `telemetry.ndjson` — uncompressed OTLP/JSON
122
+ - `logs.txt` — full streaming log
123
+ - `summary.md` — human-readable highlights
124
+ - `profile.json`, `plugins.json` — exact snapshots of what ran (when present)
125
+
126
+ ## Agent profiles
127
+
128
+ A **profile** is a named JSON file that bundles the agent chain + per-agent models + routing rules. Different rails can run different profiles.
129
+
130
+ ### Why use profiles
131
+
132
+ Without profiles, every rail uses the project's frontmatter-baked models. With profiles, you can:
133
+
134
+ - Keep a `default` profile for everyday work (Sonnet across the board).
135
+ - Add a `budget` profile that swaps Developer to Haiku and routes simple tasks away from Architect.
136
+ - Add a `max` profile for high-stakes work with Opus + every optional agent.
137
+
138
+ ### Browse / create profiles
139
+
140
+ Open **Agents** in the project's right sidebar. Two sub-tabs:
141
+
142
+ - **Profiles** — full CRUD over `.specrails/profiles/*.json`. The live validator enforces the baseline trio and routing ordering — Save is disabled with an "N issues to resolve" hint while the profile is broken.
143
+ - **Agents Catalog** — read-only viewer of upstream `sr-*` agents and your `custom-*` agents.
144
+
145
+ The empty state offers **Migrate from current agents**: one click creates a `default` profile mirroring today's frontmatter.
146
+
147
+ Each profile gets a per-profile analytics card showing usage for the last 7 / 30 / 90 days: jobs, success rate, avg tokens, avg duration.
148
+
149
+ ### Pick a profile at launch
150
+
151
+ Pick the profile from the **rail header's profile dropdown**. It's preselected to the project's resolved default, and your choice **persists per rail** across launches. The selection is sent with the launch; rails in the same batch can run different profiles.
152
+
153
+ The **`No profile`** option always exists — use it to run a rail exactly as it did pre-4.1.0. (The dropdown itself only appears once the project has at least one profile.)
154
+
155
+ ### Custom agents (Agent Studio)
156
+
157
+ From the Agents Catalog tab, the toolbar offers three creation entry points:
158
+
159
+ | Button | Behaviour |
160
+ |--------|-----------|
161
+ | **Generate with Claude** | Describe the agent in natural language; Claude drafts the full `.md`. |
162
+ | **Template** | Start from the catalog of 50 templates across 13 categories (Software Engineering, Testing & QA, Data & Analytics, Security & Compliance, Product & Design, …). |
163
+ | **Blank** | Start from a minimal template. |
164
+
165
+ You can also **Duplicate** any existing agent (upstream or custom) from its card.
166
+
167
+ Custom agents live at `.claude/agents/custom-*.md` and are **never touched** by specrails-core's installer/update scripts. Every save appends a version row — open **History** in the Studio to browse and restore.
168
+
169
+ Click **Test** in the Studio to run the current draft against a sample task in an isolated `claude` invocation — no files written; output + token count + duration shown inline.
170
+
171
+ ### Requirements
172
+
173
+ Profiles require `specrails-core ≥ 4.1.0` in the project. Without it, you can still create and edit profiles in the app, but the pipeline runs in legacy mode (no env injection). A yellow banner on the Agents page tells you when to upgrade.
174
+
175
+ For deeper internals (resolution order, snapshotting, file format), see [internals/profiles.md](internals/profiles.md).
176
+
177
+ ## Plugins
178
+
179
+ Per-project bundled integrations. Click **Integrations** in the project's right sidebar.
180
+
181
+ ### Bundled today
182
+
183
+ - **Serena** — semantic code navigation via LSP + MCP. Requires `uv` on PATH (the app auto-detects).
184
+
185
+ ### Installing a plugin
186
+
187
+ Each plugin tile has:
188
+
189
+ - **Status** — `not installed`, `installed`, `orphan` (state file mentions it but `.mcp.json` doesn't), or `degraded` (verify failed).
190
+ - **Preview install** — shows which `mcpServers` entries and agent fragments will land where, so you can sanity-check before clicking.
191
+ - **Install** — applies the changes. Progress streams over the WebSocket (`plugin.install_progress` event).
192
+ - **Uninstall** — removes the surgical changes; never wholesale rewrites your `.mcp.json`.
193
+ - **Health** — on-demand verify (probes a `--version`-style command with a 2 s timeout).
194
+
195
+ ### How plugins affect your pipeline
196
+
197
+ Before each rail spawn, the app:
198
+
199
+ 1. Resolves the project's installed plugins (parallel verify, per-plugin 2 s timeout).
200
+ 2. Classifies them into `active` and `degraded`.
201
+ 3. Writes a per-job snapshot to `~/.specrails/projects/<slug>/jobs/<jobId>/plugins.json` (chmod 400).
202
+ 4. Injects two env vars into the subprocess: `SPECRAILS_PLUGINS_ACTIVE` (CSV) and `SPECRAILS_PLUGINS_SNAPSHOT` (file path).
203
+
204
+ Degraded plugins are **non-blocking** — the rail spawns anyway, but a `plugin.degraded` toast surfaces in the UI.
205
+
206
+ ### Reserved paths
207
+
208
+ The app never wholesale rewrites these files:
209
+
210
+ - `<project>/.mcp.json` — surgical merge per plugin.
211
+ - `<project>/.specrails/plugins/state.json` — install registry.
212
+ - `<project>/.specrails/plugins/snapshots/<jobId>.json` — per-job snapshots.
213
+ - `<project>/.claude/agents/custom-<plugin>.md` — optional fragment per plugin.
214
+
215
+ specrails-core's installer also guarantees it never touches `.specrails/plugins/**` or `.claude/agents/custom-*.md`.
216
+
217
+ ## Running many specs at once
218
+
219
+ Want a whole batch of specs to run from one rail? Use **Batch** mode:
220
+
221
+ 1. Drag all the specs you want onto a single rail.
222
+ 2. Switch that rail's mode to **Batch**.
223
+ 3. Press **▶ Play**.
224
+
225
+ The rail launches one `/specrails:batch-implement` job that works through every assigned spec in dependency-aware waves. Monitor progress on the Jobs page. Because a project runs one job at a time, this is also the way to chain a list of specs without juggling multiple rails.
226
+
227
+ ## Stopping everything
228
+
229
+ If something looks wrong:
230
+
231
+ - **One rail** — click **Stop** on the rail header.
232
+ - **Auto-pause on budget** — if you set a daily budget (project or app-wide), the queue automatically pauses once that day's spend hits the cap. Configure it under [Budget](customizing.md#budget).
233
+ - **Everything** — quit the desktop app, or run `specrails-desktop stop`.
234
+
235
+ ## Where to go next
236
+
237
+ - [Tracking cost](tracking-cost.md) — see what each rail run is costing you.
238
+ - [Customising the app](customizing.md) — daily budget, per-job alerts, telemetry.
239
+ - [Using Codex](codex.md) — run rails on the Codex CLI.
240
+ - [Agent profile internals](internals/profiles.md) — for power users.
@@ -0,0 +1,138 @@
1
+ # Terminal panel
2
+
3
+ specrails-desktop ships a full-featured terminal at the bottom of the window. Toggle it with `Cmd+J` (macOS) or `Ctrl+J` (other). It's a real xterm.js with WebGL rendering, shell integration, scrollback search, file drag-and-drop, inline images, and a few quality-of-life touches you won't find in a plain terminal app.
4
+
5
+ ```
6
+ ┌──────────────────────────────────────────────────────────────┐
7
+ │ Dashboard content │
8
+ │ │
9
+ ├─────────────────────────────── Cmd+J ────────────────────────┤
10
+ │ ▶ specrails-desktop /Users/you/repos/my-app │
11
+ │ $ git status │
12
+ │ ↳ 28ms · cwd: /Users/you/repos/my-app │
13
+ │ │
14
+ └──────────────────────────────────────────────────────────────┘
15
+ ```
16
+
17
+ ## Why use the built-in terminal?
18
+
19
+ You don't have to. You can keep using iTerm/Windows Terminal/Alacritty/whatever you love. But the built-in panel buys you:
20
+
21
+ - **Per-prompt timing** — every command taking ≥ 500 ms shows a small live timer in the terminal's top-left corner; once done, the duration sits there as a record.
22
+ - **Long-running command notifications** — when a command exceeds 60 seconds and you've context-switched away, you get a native desktop notification.
23
+ - **Open this directory** in the right-click menu when a CWD has been observed (Tauri desktop app only).
24
+ - **Drag a file from Finder/Explorer** onto the terminal to paste its absolute path (Tauri desktop app only).
25
+ - **Live theme switching** — the terminal recolours when you change the app theme without losing scrollback.
26
+
27
+ ### Toolbar shortcuts
28
+
29
+ The panel header carries three one-click shortcuts:
30
+
31
+ - **Open AI CLI** (✨ Sparkles) — spins up a fresh session and types your CLI for you. On a single-provider project it launches that provider's CLI directly (`claude` or `codex`); on a multi-provider project it opens a small picker so you choose which CLI to start.
32
+ - **Open in browser** (🌐 Globe) — opens the URL from the `browserShortcutUrl` setting (default `https://specrails.dev`). Right-click it to jump to the setting and change the URL.
33
+ - **Paste quick script** (`</>`) — writes the snippet from the `quickScript` setting (which defaults to a personalised `echo "Wake up, <username> …"` reminder, editable in Settings) into the active session. Right-click it to edit the snippet in Settings. Disabled when there's no active terminal or the snippet is empty.
34
+
35
+ ## Keyboard shortcuts
36
+
37
+ | Action | macOS | Other |
38
+ |--------|-------|-------|
39
+ | Toggle panel | `Cmd+J` | `Ctrl+J` |
40
+ | Copy selection | `Cmd+C` | `Ctrl+C` |
41
+ | Paste (bracketed) | `Cmd+V` | `Ctrl+V` |
42
+ | Clear scrollback | `Cmd+K` | `Ctrl+K` |
43
+ | Find in scrollback | `Cmd+F` | `Ctrl+F` |
44
+ | Zoom font in / out | `Cmd+=` / `Cmd+-` | `Ctrl+=` / `Ctrl+-` |
45
+ | Reset font size | `Cmd+0` | `Ctrl+0` |
46
+ | Jump to previous prompt | `Cmd+ArrowUp` | `Ctrl+ArrowUp` |
47
+ | Jump to next prompt | `Cmd+ArrowDown` | `Ctrl+ArrowDown` |
48
+
49
+ `Cmd+C` only consumes the keystroke when there's a non-empty selection; otherwise it passes through to the PTY so apps like vim still receive `Ctrl+C`. Inside alt-screen apps with mouse reporting (tmux, htop), hold `Shift` while dragging to bypass mouse-mode and use native xterm selection.
50
+
51
+ ## Right-click menu
52
+
53
+ Right-click anywhere in the active terminal:
54
+
55
+ - Copy / Paste / Select All / Clear / Search… / Save scrollback to file…
56
+ - **Open `<cwd>`** — when shell integration has reported a CWD via OSC 1337 (Tauri desktop app only). In a plain browser context this item never appears.
57
+
58
+ Menu position flips when near the bottom-right corner of the viewport.
59
+
60
+ ## Shell integration
61
+
62
+ Shell integration is **on by default** (toggle in Settings → Terminal panel). The app auto-injects a small shim per shell that emits OSC 133 prompt marks plus OSC 1337 `CurrentDir=…`. The shim runs only in the app's spawned shell — your normal terminal apps elsewhere are untouched.
63
+
64
+ Per shell:
65
+
66
+ | Shell | Mechanism |
67
+ |-------|-----------|
68
+ | zsh | `ZDOTDIR=<shim dir>`; the shim's `.zshrc` sources `~/.zshrc` first |
69
+ | bash | `--rcfile <shim path>`; the shim sources `~/.bashrc` first |
70
+ | fish | `fish -C "source '<bundled shim>'"` (`--init-command`); runs after `config.fish` / `conf.d`, so your real fish config is preserved |
71
+ | PowerShell | `-NoLogo -NoExit -File <shim.ps1>`; the shim dot-sources the original `$PROFILE` |
72
+
73
+ Each shim sets `SPECRAILS_SHELL_INTEGRATION_LOADED=1` as a sentinel.
74
+
75
+ If shell integration doesn't bootstrap — for example your `~/.zshrc` runs `exec zsh` (which throws away our `ZDOTDIR`) or a similarly aggressive customisation — there's no error message. The panel detects the missing prompt marks silently; the gutter, per-prompt timing badge, and long-running notifications simply won't appear. If that happens, disable shell integration in Settings; the rest of the panel keeps working.
76
+
77
+ ## Drag and drop
78
+
79
+ Inside the Tauri desktop app, drop one or more files from Finder/Explorer onto the terminal viewport to paste their absolute paths into the active session. Paths are shell-quoted for your host platform:
80
+
81
+ - macOS / Linux — POSIX single-quote
82
+ - Windows — double-quote with `^`-escaped percent/caret (matches `cmd.exe` rules)
83
+
84
+ In a plain browser context this is a silent no-op — the browser doesn't expose `File.path`.
85
+
86
+ ## Inline images
87
+
88
+ The panel decodes Sixel and iTerm2 inline-image protocols via `@xterm/addon-image`. Try `imgcat foo.png` or any tool that emits Sixel.
89
+
90
+ Disable in Settings → Terminal panel → Image rendering if you hit memory pressure on heavy image streams. The per-frame cap is 8 megapixels.
91
+
92
+ ## Settings
93
+
94
+ Two layers:
95
+
96
+ - **App-wide defaults** — Desktop Settings (gear icon on the sidebar) → Terminal panel.
97
+ - **Per-project overrides** — Project Settings (gear in the project navbar) → Terminal panel.
98
+
99
+ Project wins per-field; absent fields fall back to app-wide defaults.
100
+
101
+ Hot-reload semantics:
102
+
103
+ | Setting | Hot-reload | Notes |
104
+ |---------|------------|-------|
105
+ | Font family / size | Live | Existing sessions reconfigure immediately |
106
+ | Copy on select | Live | |
107
+ | Long-running threshold | Live | |
108
+ | Notify on completion | Live | |
109
+ | Browser shortcut URL | Live | The Open-in-browser toolbar button uses the new value next click |
110
+ | Quick script | Live | The Paste-quick-script toolbar button uses the new value next click |
111
+ | Render mode (auto / canvas / webgl) | Next session | Live sessions keep their boot-time config |
112
+ | Shell integration | Next session | |
113
+ | Image rendering | Next session | |
114
+
115
+ Render mode `auto` picks WebGL when the WebView exposes WebGL2; on `webglcontextlost` the panel transparently reverts to xterm's default renderer.
116
+
117
+ ## Limits and edge cases
118
+
119
+ - **Sessions per project** — hard cap of 10.
120
+ - **Closing a project** — kills all its sessions immediately.
121
+ - **Window close / quit** — graceful: SIGTERM, 2 s grace, SIGKILL.
122
+ - **Cmd+J inside an open Dialog** — ignored. The panel won't toggle on top of a modal.
123
+
124
+ ## Diagnostics
125
+
126
+ If something looks broken:
127
+
128
+ 1. Open Settings → Terminal panel and confirm shell integration is enabled.
129
+ 2. Check that `printenv SPECRAILS_SHELL_INTEGRATION_LOADED` outputs `1` inside a freshly opened terminal.
130
+ 3. Open a session, then `printf '\x1b]133;A\x07'` manually and watch the gutter — a marker should appear.
131
+ 4. As a last resort, disable shell integration in Settings and re-enable; new sessions receive a fresh shim.
132
+
133
+ For deeper inspection of how the panel resolves PATH at startup (relevant for Volta/nvm/asdf shims), call `GET /api/setup-prerequisites?diagnostic=1` from the app and check the `pathSegments` / `pathSources` in the response. The install-instructions modal has a **Copy diagnostics** button that does this for you.
134
+
135
+ ## Where to go next
136
+
137
+ - [Customising the app](customizing.md) — terminal settings, themes.
138
+ - [Getting started](getting-started.md) — registering a project.