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
package/docs/codex.md ADDED
@@ -0,0 +1,210 @@
1
+ # Using Specrails with the Codex CLI
2
+
3
+ Specrails supports **two AI providers**: Anthropic's
4
+ [Claude Code](https://claude.com/claude-code) and OpenAI's
5
+ [Codex CLI](https://developers.openai.com/codex). You pick one or
6
+ both when you add a project; the rest of the app behaves identically
7
+ across them. (See [Running both providers in one
8
+ project](#running-both-providers-in-one-project) below.)
9
+
10
+ > The codex path is enabled by default. To temporarily disable it
11
+ > (e.g. as an emergency rollback during a beta window), set
12
+ > `SPECRAILS_CODEX_BETA=0` in the app's environment (the legacy
13
+ > `SPECRAILS_HUB_CODEX_BETA` name is still read as a fallback when the
14
+ > new variable is unset). Unset or set to `1` to re-enable.
15
+
16
+ ## Prerequisites
17
+
18
+ | What | Why | How |
19
+ |---|---|---|
20
+ | `codex` CLI ≥ 0.128.0 | Earlier versions don't support `exec --json` + `exec resume` semantics the app relies on | `brew install codex` (macOS) · winget / download from https://developers.openai.com/codex (Windows / Linux) |
21
+ | Authentication | Codex needs OAuth or an API key | `codex login` (ChatGPT OAuth) or set `OPENAI_API_KEY` |
22
+ | `uv` ≥ 0.1.0 (optional) | Required if you want to install the Serena plugin | `brew install uv` · `pipx install uv` · or the curl installer at https://docs.astral.sh/uv |
23
+ | `git`, `node`, `npm`, `npx` | Same as Claude — needed for `specrails-core init` | Use your usual installer |
24
+
25
+ The app's `Add Project` dialog runs a live prerequisites check. It
26
+ disables the Codex provider checkbox with a "not found" hint when the
27
+ binary isn't on `PATH`; it shows install commands if you click "More info".
28
+
29
+ ## Adding a codex project
30
+
31
+ 1. Open the app UI and click **Add Project**.
32
+ 2. Pick the project's path.
33
+ 3. In the **AI providers** row, check **Codex** (you can check
34
+ **Claude** too — see [Running both providers in one
35
+ project](#running-both-providers-in-one-project)). The first
36
+ provider you select becomes the project default.
37
+ 4. Submit. The app writes `.specrails/install-config.yaml` (with
38
+ `provider: codex` and `tier: quick` as YAML keys) and spawns
39
+ `npx specrails-core@latest init --from-config <file>` — the provider
40
+ and tier live in the YAML, not as CLI flags. The install produces:
41
+ - `.codex/config.toml` — model, reasoning effort, sandbox mode, and
42
+ approval policy (all top-level keys per the codex 0.128.0+ schema).
43
+ - `.codex/skills/sr-*/SKILL.md` — general specrails skills
44
+ (implement, batch-implement, why, compat-check, …).
45
+ - `.codex/skills/rails/sr-*/SKILL.md` — the pipeline rails.
46
+ - `AGENTS.md` — top-level instructions file with a sentinel-protected
47
+ managed block. Anything outside the sentinels is preserved on
48
+ updates.
49
+
50
+ The exact rail and lifecycle skill set is produced by
51
+ `specrails-core`, not the app, so the precise file list can vary by
52
+ core version.
53
+
54
+ The provider **set** you choose is immutable after creation — you
55
+ can't add or remove a provider on an existing project (the on-disk
56
+ layouts are disjoint and we don't want to ask you to migrate two trees
57
+ in place). Install both up front if you want the choice later.
58
+
59
+ ## Running both providers in one project
60
+
61
+ A single project can install **both** Claude and Codex. In the
62
+ **Add Project** dialog the **AI providers** control is a multi-select —
63
+ check both and the app runs each provider's install sequentially. The
64
+ first provider you select is the **primary/default**; the helper text
65
+ spells this out: *"Both engines will be set up. The first is the
66
+ project default. Cannot be changed after creation."*
67
+
68
+ Once both are installed:
69
+
70
+ - **Per-invocation engine pickers** let you choose Claude vs Codex each
71
+ time you spawn work. The picker appears in the **Add Spec** dialog
72
+ (`AiEngineSelector`), in the **rail header** (`RailEngineSelector`),
73
+ and in the terminal's **Open AI CLI** menu (`CliLaunchMenu`). On
74
+ single-provider projects these pickers don't render — there's nothing
75
+ to choose.
76
+ - The **selected engine is remembered per project** (it defaults to the
77
+ primary), so you don't have to re-pick on every spawn.
78
+ - **Capability intersection.** The right sidebar only shows sections
79
+ that *every* installed provider supports. Because Codex has no agent
80
+ profiles and no plugins, the **Agents** and **Integrations** sections
81
+ are **hidden** while both providers are installed. Single-provider
82
+ projects are unaffected.
83
+
84
+ When only one provider is installed the app behaves byte-identically to
85
+ a single-provider project — no engine pickers, no provider persisted on
86
+ spawns, no overrides.
87
+
88
+ ## What's different vs Claude
89
+
90
+ | Surface | Claude | Codex |
91
+ |---|---|---|
92
+ | **CLI** | `claude` | `codex` |
93
+ | **Project dir** | `.claude/` | `.codex/` |
94
+ | **Instructions file** | `CLAUDE.md` | `AGENTS.md` |
95
+ | **Agent format** | `.claude/agents/<id>.md` with `model:` frontmatter | `.codex/skills/<id>/SKILL.md` Skill format |
96
+ | **Agent profiles** | Full support (rail `RailProfileSelector`) | **None** — codex rails force the profile to `null`; the Agents section is Claude-only |
97
+ | **Contract Refine** | Claude-only (it `--resume`s the Explore session and runs `/specrails:contract-refine`) | **Skipped** — toggling "Enrich with Contract Layer" on a codex spec is a no-op |
98
+ | **MCP registration** | Surgical merge of `<project>/.mcp.json` | `codex mcp add` against per-project `CODEX_HOME=~/.specrails/projects/<slug>/codex-home/` (isolated) |
99
+ | **Session resume** | `--resume <session_id>` | `exec resume <thread_id>` |
100
+ | **Native cost report** | `result.total_cost_usd` from `--output-format stream-json` | None — cost is **estimated** by the app from `turn.completed.usage` and the local pricing table at `server/pricing.ts` |
101
+ | **Telemetry** | `OTEL_EXPORTER_OTLP_*` env vars consumed by claude itself | Synthesised by the app from `codex exec --json` events and POSTed to the same in-process OTLP receiver — telemetry export ZIP works identically |
102
+
103
+ ## Estimated cost
104
+
105
+ Codex does not report `total_cost_usd` natively. The app computes an
106
+ estimate from the captured `usage` (input / output / cached input
107
+ tokens × the local rate-card in `server/pricing.ts`) and stores it in
108
+ `ai_invocations.total_cost_usd` with `total_cost_usd_estimated = 1`.
109
+
110
+ The Analytics page surfaces this in two places:
111
+
112
+ - **The cost cell** in the Raw Invocations table shows a `~` prefix
113
+ (e.g. `~$0.012`) and a tooltip explaining the fallback when you
114
+ hover.
115
+ - **The Hero** shows a small italic suffix next to the invocation
116
+ count (`· includes ~$X.XX estimated`) when any row in the active
117
+ window came from the fallback.
118
+ - **A new "By provider" card** between the Hero and the Timeline
119
+ splits per-provider cost into authoritative vs estimated columns
120
+ whenever the project has invoked both providers.
121
+
122
+ The pricing table is reviewed quarterly. The reference date sits on
123
+ each entry as `lastReviewedAt`. If OpenAI raises prices mid-quarter,
124
+ ship an out-of-band update to `server/pricing.ts`.
125
+
126
+ ## Plugins and MCP on codex projects
127
+
128
+ The **Integrations** (plugins) marketplace is a **Claude-only** capability. The app
129
+ hides the Integrations tab for any project that includes codex — both codex-only and
130
+ dual-provider (Claude + Codex) projects — because the sidebar only shows sections that
131
+ *every* installed provider supports (the capability intersection in
132
+ `provider-capabilities.ts`). So there is no in-app plugins page to install Serena on a
133
+ codex project.
134
+
135
+ To give a codex project MCP servers, register them with `codex mcp add` from your
136
+ terminal: codex chat / Explore turns spawn with your own environment and read your global
137
+ `~/.codex/config.toml`, so those servers are available natively — no extra plumbing required.
138
+
139
+ ## Troubleshooting
140
+
141
+ **"codex binary not found" when adding a project** — install codex CLI
142
+ and restart the app so PATH refreshes. The app's
143
+ `/api/setup-prerequisites` endpoint surfaces the absolute path it
144
+ resolved, useful for diagnosing Homebrew-vs-npm install collisions.
145
+
146
+ **"codex 0.120.0 is older than required 0.128.0"** — upgrade. The
147
+ adapter pins the minimum because earlier versions don't support
148
+ `exec --json` or `exec resume`.
149
+
150
+ **"codex mcp add serena failed: auth missing"** — run `codex login`
151
+ or set `OPENAI_API_KEY`. The app doesn't proxy auth.
152
+
153
+ **Cost shows as `—` for codex jobs even though tokens are non-zero**
154
+ — the spawned model isn't in `server/pricing.ts` (e.g. a brand-new
155
+ model OpenAI shipped after our last review). Update the pricing table
156
+ and reload the page.
157
+
158
+ **Cost on the Hero looks too high after a long Explore session** —
159
+ remember that codex Explore uses real `exec resume`, so every turn
160
+ re-feeds the prior conversation. Long sessions accumulate input-
161
+ token cost the same way Claude's `--resume` does. The Hero footnote
162
+ calls this out.
163
+
164
+ **"Enrich with Contract Layer" did nothing on a codex spec** — that's
165
+ expected. Contract Refine is a Claude-only capability; the Add Spec UI
166
+ hides the toggle for codex, and the server skips it defensively if a
167
+ codex conversation reaches the refine path. There's no error — the
168
+ spec just commits without a Contract Layer block.
169
+
170
+ ## Emergency rollback
171
+
172
+ If you need to disable the codex path, set `SPECRAILS_CODEX_BETA=0`
173
+ in the app's environment. For a source checkout that's:
174
+
175
+ ```bash
176
+ SPECRAILS_CODEX_BETA=0 npm run dev
177
+ ```
178
+
179
+ For the packaged desktop app, set the variable in the environment the app
180
+ process inherits (the `npm run dev` form is for source runs only).
181
+
182
+ `GET /api/available-providers` will report `codex: false` and
183
+ `POST /api/projects` will refuse new codex projects. Existing
184
+ codex projects keep functioning — only new-project gating is gated by
185
+ the env var.
186
+
187
+ ## Architecture pointers (for specrails-desktop developers)
188
+
189
+ The codex integration lives in:
190
+
191
+ - `server/providers/codex-adapter.ts` — `ProviderAdapter`
192
+ implementation for codex 0.128.0+. Fixtures under
193
+ `server/providers/__fixtures__/codex/0.128.0/`.
194
+ - `server/pricing.ts` — local pricing table + `estimateCostUsd`.
195
+ - `server/codex-otel-bridge.ts` — synthetic OTEL traces / metrics /
196
+ logs derived from JSONL events.
197
+ - `server/plugins/codex-mcp.ts` — `codex mcp add/remove/list` wrapper
198
+ with per-project `CODEX_HOME`.
199
+
200
+ The contract every provider implements is at
201
+ `server/providers/types.ts`. Adding a new provider in the future is
202
+ one new adapter file + one entry in `server/providers/index.ts`.
203
+
204
+ ## See also
205
+
206
+ - [Adding a provider](internals/adding-a-provider.md) — the developer
207
+ guide to wiring a third AI CLI adapter.
208
+ - [Tracking cost](tracking-cost.md) — how the Analytics page surfaces
209
+ per-invocation cost across every surface (including the estimated
210
+ codex rows described above).
@@ -0,0 +1,197 @@
1
+ # Creating specs
2
+
3
+ A **spec** in specrails-desktop is a description of work you want done — what the AI agents will read and act on. This guide walks through every way you can create, refine, compare, and organise them. Specs are engine-agnostic: depending on how the project was set up, they can be generated by Claude or by Codex.
4
+
5
+ ## Creating a spec
6
+
7
+ Open the Dashboard and click **Add** (the Plus button on the SpecsBoard toolbar). The **Add Spec** dialog opens with three modes:
8
+
9
+ - **Quick** — you describe what you want; the AI writes the full spec.
10
+ - **Explore** — you converse with the AI and shape the spec turn by turn.
11
+ - **Raw** — your prompt is saved verbatim as a spec, with **no AI** involved.
12
+
13
+ On a multi-provider project (one set up with both Claude and Codex), an **AI engine** selector sits at the top of the dialog so you can pick which engine generates this spec. The choice is remembered per project. Single-provider projects don't show the selector.
14
+
15
+ ### Quick mode
16
+
17
+ For when you already know what you want. Type your idea; the AI generates the full spec. This is usually a single turn — but it runs multi-turn when you give it the full codebase (the context slider's higher presets) or attach files, so it can read what it needs first.
18
+
19
+ **Controls:**
20
+
21
+ - **Engine + model** — the engine selector (multi-provider only) and a model picker. The model defaults to a sensible choice for the engine and can be overridden per spec.
22
+ - **Context slider** — Quick mode shows the same context preset slider as Explore, capped at the **Max** preset (see the table below).
23
+ - **Fine-tune** — expand to toggle the underlying flags by hand, including **Enrich with Contract Layer**.
24
+ - **From a website** — when the browser-capture feature is enabled, this opens an embedded browser so you can capture a page (DOM, screenshots, network) and turn it into a spec.
25
+ - **Attachments** — drop mockups, briefs, or data files into the idea field. Attachments give the AI more to work with (and switch Quick generation to multi-turn).
26
+
27
+ **Enrich with Contract Layer** appends a structured block to the generated description so downstream agents don't have to guess names or shapes:
28
+
29
+ - **Naming Contract** — exact identifiers to reuse
30
+ - **Data Shapes** — JSON-ish payloads
31
+ - **State Machine** — transitions
32
+ - **Invariants** — must-hold properties
33
+ - **File Touch List** — files the implementation will edit
34
+
35
+ Your last choice for this toggle is remembered per project.
36
+
37
+ While the spec is being generated, a toast in the corner shows the project name, a truncated copy of your idea, and the **elapsed time** ("Generating… 0:12"). When it finishes it switches to "Generated in <time>" with a **View** action that jumps straight to the new spec.
38
+
39
+ ### Explore mode
40
+
41
+ For when the spec needs shaping. You converse with the AI; a live draft updates each turn.
42
+
43
+ **Context preset slider** — pick how much the AI sees before it answers. Each preset flips a set of concrete flags:
44
+
45
+ | Preset | What the AI sees |
46
+ |--------|------------------|
47
+ | Minimal | Just your message — nothing else loaded. Fastest and cheapest. |
48
+ | Light | + your specrails tickets (`.specrails/local-tickets.json`). |
49
+ | Standard | + specrails tickets **and** OpenSpec specs. |
50
+ | Rich | + full-codebase read access (Read / Grep / Glob). |
51
+ | Max | Rich, plus a **Contract Layer** enrichment pass. |
52
+ | Desktop | Max, plus **project MCPs** (`.mcp.json`) **and your own approved MCP servers**. |
53
+
54
+ Rich and Max both load the full codebase — they differ only in whether the Contract Layer pass runs. The decision is per-conversation (saved on `chat_conversations.context_scope`) so it doesn't bleed into other Explore sessions.
55
+
56
+ Click **Fine-tune** to set the flags individually. One toggle only appears here:
57
+
58
+ - **My approved MCPs** — loads the MCP servers you've already approved locally (`claude mcp add` / `codex mcp add`) without changing where the spawn runs. Explore-only; disabled in Quick mode.
59
+
60
+ **Buttons in the shell:**
61
+
62
+ - **Save as Draft** — persists the conversation as a draft ticket so you can come back later. Available once you've sent at least one user message. The draft carries `origin_conversation_id` pointing back at this conversation so you can resume it from the dashboard.
63
+ - **Review →** — opens a Review overlay that diffs the proposed spec against the baseline before you commit.
64
+ - **Create Spec** — promotes the live draft to a real spec (status `todo`). When you're editing an existing spec the same button reads **Update Spec** instead. The conversation stays in history.
65
+ - **Minimize** — parks the conversation as a chip in the minimized-chats dock; click the chip later to restore it.
66
+ - **Discard** — destructive, asks for confirmation.
67
+
68
+ ### Raw mode
69
+
70
+ No AI. Whatever you type is saved verbatim as a spec, with a title (auto-derived from the first line, editable), a priority, and optional labels. Use it when you already have the spec text and just want it on the board.
71
+
72
+ ## Drafts
73
+
74
+ A draft is an in-progress Explore conversation saved as a ticket with status `draft`. Drafts behave like normal tickets but:
75
+
76
+ - Carry a `Draft` pill where the priority pill would be.
77
+ - Live in the active (Todo) bucket with a subtly tinted border — there's no separate Backlog column.
78
+ - Have a **Continue Editing** action in the detail modal that re-opens the original conversation with its full chat history.
79
+
80
+ Drafts are never auto-deleted. You either discard them explicitly or commit them to a real status.
81
+
82
+ > Pro tip: when you're not sure if a spec is worth doing, save it as a draft and let it sit. The next morning, open the draft, glance at the description, and decide.
83
+
84
+ ## Compare two specs side by side
85
+
86
+ Open any spec modal. Then either:
87
+
88
+ - **Drag the modal header** toward the left or right edge of the screen — once you cross 20% of the viewport it snaps to a half-screen panel and a picker of your other todo specs appears on the opposite side.
89
+ - **Click "Compare"** in the modal toolbar — same result, no drag.
90
+
91
+ ```
92
+ Drag left: Drag right:
93
+ ┌────────┬─────────┐ ┌─────────┬────────┐
94
+ │ Spec A │ Picker │ │ Picker │ Spec A │
95
+ │ │ ┌─────┐ │ │ ┌─────┐ │ │
96
+ │ │ │ #2 │ │ │ │ #2 │ │ │
97
+ │ │ │ #5 │ │ │ │ #5 │ │ │
98
+ │ │ └─────┘ │ │ └─────┘ │ │
99
+ └────────┴─────────┘ └─────────┴────────┘
100
+ ```
101
+
102
+ Click a picker card and that side becomes a second detail modal — now you have two specs open side by side, fully interactive.
103
+
104
+ **Resize the split** by dragging the vertical divider, or focus it and use arrow keys / Home / End / 0. The ratio is clamped between 25% and 75%.
105
+
106
+ **Exit rules:**
107
+
108
+ - Backdrop click → close both.
109
+ - `×` on the *original* (origin) side → close both.
110
+ - `×` on the *other* side → return that side to the picker.
111
+ - Open a third spec from a link inside either panel (e.g. an epic chip in the SMASH sidebar, or **Continue Editing** on a draft) → split-view collapses and the third spec opens centred.
112
+
113
+ **URL persistence:** the comparison is encoded in the URL as `?compare=<id>&compareSide=<side>&compareOrigin=<id>`, so a page refresh restores the split.
114
+
115
+ **Viewport:** disabled below 900px. If you shrink the window while in split, the app collapses cleanly to a centred modal.
116
+
117
+ ## SMASH a big spec
118
+
119
+ Got an epic that's clearly too big? Open it and click **SMASH Spec into Sub-Specs** in the toolbar. The AI decomposes it into a family of sub-specs. Each child:
120
+
121
+ - Gets `parent_epic_id` pointing back at the epic.
122
+ - Carries an execution order (the SMASH agent decides the right order).
123
+ - Carries a short summary (the agent aims for roughly 120 characters) surfaced on its postit card.
124
+
125
+ Inside the epic's modal you'll see an **Epic Family Sidebar** listing all children. Inside each child's modal, an **Epic Breadcrumb** lets you jump back to the parent. If the epic already has children, the button reads **Re-SMASH** and regenerates the family (after a confirmation).
126
+
127
+ ## Continue Editing — refine an existing spec
128
+
129
+ For any spec with status `draft`, `todo`, or `backlog`, the detail modal shows a **Continue Editing** button. Click it and:
130
+
131
+ 1. The spec opens in a fresh Explore shell with the draft pane pre-seeded with the current title, description, priority, labels, and acceptance criteria.
132
+ 2. If the spec was originally an Explore draft (i.e. it has `origin_conversation_id`), that original conversation is resumed — you see the chat history.
133
+ 3. You type the first refinement. The AI updates the live draft.
134
+ 4. The Review step shows a real diff against the current spec before you commit.
135
+ 5. On commit, the spec is PATCH-ed — no new ticket is created.
136
+
137
+ Continue Editing works from the dashboard or from inside a split-view comparison — triggering it from a split-view panel collapses the comparison automatically because the shell needs the full screen.
138
+
139
+ The Contract Layer (if a spec has one) is shown inside the detail modal as a collapsible disclosure with an `N/5 populated` badge. You can re-run the enrichment for a single ticket from there.
140
+
141
+ ## Status visuals
142
+
143
+ Every spec card shows a status indicator that stays consistent across view modes:
144
+
145
+ | Status | Indicator | Border |
146
+ |--------|-----------|--------|
147
+ | `draft` | Accent-secondary dot, `Draft` pill | Subtle accent-secondary tint, dashed on postit |
148
+ | `todo` | Gray dot, muted text | Dashed left border |
149
+ | `in_progress` | Blue pulsing dot, bold text | Solid blue left border |
150
+ | `done` | Green checkmark, dimmed text | Solid green left border |
151
+ | `cancelled` | Red X, dimmed text | No border |
152
+
153
+ ## Filtering and sorting
154
+
155
+ The SpecsBoard toolbar has four controls plus the Add button:
156
+
157
+ - **Status filter** — a single-select dropdown with three values: **All**, **ToDo**, **Done**. Defaults to **All**, which shows everything (including drafts and done specs).
158
+ - **Label dropdown** — multi-select across every label used in the project.
159
+ - **Sort** — **Default**, **Ticket #**, or **Priority**, each with an ascending/descending toggle.
160
+ - **View toggle** — switch between List view and Post-it view (see below).
161
+
162
+ Priority itself is set per spec from the right-click menu (below), not from a toolbar filter — there is no priority filter and no search box on the board.
163
+
164
+ ## Right-click context menu
165
+
166
+ Right-click any spec card (in any view mode):
167
+
168
+ - **Delete ticket** — with confirmation.
169
+ - **Change status → Todo / Done**
170
+ - **Set priority → Critical / High / Medium / Low**
171
+
172
+ ## View modes
173
+
174
+ The SpecsBoard has **two** view modes, switched from a toolbar toggle and remembered per project:
175
+
176
+ - **List view** (`row`) — compact one-line rows.
177
+ - **Post-it view** (`postit`, the default) — postit-style cards with short summaries; drag a card onto a rail to queue it.
178
+
179
+ (The separate List / Grid / Post-it picker you may see elsewhere — like the split-view comparison picker — is its own surface and unrelated to this toggle.)
180
+
181
+ ## What happens behind the scenes
182
+
183
+ You don't need this to use the feature, but it's nice to know:
184
+
185
+ - Specs live in `<project>/.specrails/local-tickets.json` (a JSON store).
186
+ - A file watcher catches external edits (e.g. when an agent flips a spec to `in_progress`) and broadcasts a WebSocket event, so the board updates instantly.
187
+ - Every AI CLI invocation that creates or refines a spec is recorded in your analytics under one of these surfaces:
188
+ - `quick-spec` — Quick mode generation (and the Quick-mode Contract Refine pass).
189
+ - `explore-spec` — every Explore conversation turn (and the Explore Contract Refine pass).
190
+ - `ai-edit` — Continue Editing / AI Edit refine turns.
191
+ - Drafts are linked to their conversation via `origin_conversation_id`. Deleting a draft cascades to its conversation when no other ticket references it; deleting a conversation clears the field on any linked tickets.
192
+
193
+ ## Where to go next
194
+
195
+ - [Running pipelines](running-pipelines.md) — drag those specs onto rails and launch the implementation pipeline.
196
+ - [Tracking cost](tracking-cost.md) — see what each spec is costing you.
197
+ - [Customising the app](customizing.md) — set a daily budget so you can stop worrying.
@@ -0,0 +1,197 @@
1
+ # Customising the app
2
+
3
+ Every setting you can change, grouped by where you'll find it.
4
+
5
+ ## Themes
6
+
7
+ Open **Desktop Settings** (gear icon at the bottom of the Arc sidebar) → **Appearance**.
8
+
9
+ Five built-in themes:
10
+
11
+ | Theme | Vibe |
12
+ |-------|------|
13
+ | **SpecRails** *(default)* | Brand theme — deep navy-indigo with saturated cyan accents |
14
+ | **Dracula** | The original — dark purple-tinted with vivid neon accents |
15
+ | **Aurora Light** | Premium light — Linear-inspired indigo on warm off-white |
16
+ | **Obsidian Dark** | Premium dark — near-black blue-tinted with electric accents |
17
+ | **Matrix** | Phosphor terminal — soft mint on green-tinted near-black |
18
+
19
+ The selection is app-wide (one theme across all projects) and applies instantly:
20
+
21
+ - All UI components recolour live.
22
+ - The terminal panel reconfigures without losing scrollback or shell integration.
23
+ - Recharts charts in Analytics recolour live.
24
+ - Syntax-highlighted code blocks recolour live.
25
+
26
+ There's an inline anti-FOUC script in `client/index.html` so a page refresh never shows a flash of the wrong theme.
27
+
28
+ The active theme persists to `desktop_settings.ui_theme` on the server and mirrors to `localStorage` so the desktop app and browser stay in sync if you use both.
29
+
30
+ > Want a sixth theme? It's a small contribution — see `client/src/lib/themes.ts` and [internals/architecture.md](internals/architecture.md) for the contract.
31
+
32
+ ## Sidebars
33
+
34
+ Both sidebars cycle through the same three states with their pin icon:
35
+
36
+ - **Pinned-open** — always wide.
37
+ - **Pinned-collapsed** — always a narrow strip of icons.
38
+ - **Unpinned** *(default)* — collapsed strip that expands on hover.
39
+
40
+ Keyboard shortcuts:
41
+
42
+ | Shortcut | Action |
43
+ |----------|--------|
44
+ | `Cmd+B` / `Ctrl+B` | Cycle the **right** project sidebar (Chat) |
45
+ | `⌥⌘B` / `Ctrl+Alt+B` | Cycle the **left** Arc sidebar |
46
+
47
+ State is per-machine (local UI preference, not synced).
48
+
49
+ > Press `?` anywhere for the full keyboard-shortcuts cheatsheet. `Cmd+K` / `Ctrl+K` opens the command palette; `Cmd+J` / `Ctrl+J` toggles the terminal panel.
50
+
51
+ ## Per-project settings
52
+
53
+ Open **Settings** from the project navbar (top right of any project page).
54
+
55
+ ### Budget
56
+
57
+ | Setting | Behaviour |
58
+ |---------|-----------|
59
+ | **Daily budget (USD)** | The queue auto-pauses when this project's spend for the current calendar day exceeds the cap. Blank = no cap. |
60
+ | **Per-job cost alert (USD)** | OS notification when a single job in this project exceeds this amount. Blank = disabled. |
61
+
62
+ The daily counter is the sum of completed-job cost since midnight, so it resets at the start of each calendar day. When the cap is hit you see a "Daily budget exceeded — Queue is paused" banner on the project (plus a toast). Resume by raising or clearing the budget (and waiting for the next day if you've genuinely spent it).
63
+
64
+ ### Rail pre-prompt
65
+
66
+ A custom instruction appended to every **Implement** and **Batch-implement** rail job, after the ticket context and before execution. Use it for stable project guidance that should accompany every rail run (e.g. "keep migrations backward compatible, add tests for every change"). Leave it blank for none.
67
+
68
+ ### Ultracode pre-prompt
69
+
70
+ The instruction sent to Claude for **Ultracode** rails (Claude-only). Ultracode skips the OpenSpec pipeline — it hands Claude this pre-prompt plus the spec text and lets it implement autonomously. The spec text is appended automatically after the pre-prompt. Leave it blank to use the built-in default.
71
+
72
+ ### Telemetry
73
+
74
+ Opt-in OpenTelemetry capture for rail runs.
75
+
76
+ | Setting | Behaviour |
77
+ |---------|-----------|
78
+ | **Enable pipeline telemetry** | Default OFF. When ON, every rail spawn gets OTLP env vars injected. Each rail's traces/metrics/logs are captured to a `.ndjson.gz` blob. |
79
+
80
+ When telemetry is on, the **Diagnostic ZIP** button appears on every job's detail page. The ZIP contains `job-metadata.json`, `telemetry.ndjson`, `logs.txt`, `summary.md`, and per-job snapshots of the agent profile and active plugins.
81
+
82
+ Retention: raw blobs > 7 days old are compacted at startup (file deleted, aggregates kept).
83
+
84
+ Scope: rails only. The sidebar chat, Explore, AI Edit, and the setup wizard are not instrumented (telemetry env injection happens only in the queue manager).
85
+
86
+ ### Terminal panel
87
+
88
+ Hot-reload semantics: font family/size, copy-on-select, long-running command threshold, and notify-on-completion apply **live** to existing sessions on save. Render mode, shell integration, and image rendering apply on **the next spawned session**.
89
+
90
+ | Setting | Default | What it does |
91
+ |---------|---------|--------------|
92
+ | Font family | `'DM Mono', 'JetBrains Mono', ui-monospace, Menlo, monospace` | Terminal font |
93
+ | Font size | 12 px | Cmd+= / Cmd+- live-zooms within a session |
94
+ | Copy on select | off | Auto-copy when text is selected |
95
+ | Render mode | auto | `auto` picks WebGL when available; falls back to canvas on context loss |
96
+ | Shell integration | on | Inject OSC 133 / 1337 shim per shell |
97
+ | Image rendering | on | Decode Sixel + iTerm2 inline images (`@xterm/addon-image`) |
98
+ | Long-running command threshold | 60 s | Trigger a notification after this duration |
99
+ | Notify on completion when unfocused | on | Emits a desktop notification when a long-running command finishes and the window isn't focused |
100
+
101
+ Project overrides win per-field; missing fields fall back to app defaults; missing app defaults fall back to built-ins.
102
+
103
+ See [terminal.md](terminal.md) for the full reference of keyboard shortcuts and shell integration.
104
+
105
+ ## App-wide settings
106
+
107
+ Open **Desktop Settings** from the Arc sidebar. These apply across every project.
108
+
109
+ | Section | What it does |
110
+ |---------|--------------|
111
+ | **Appearance** | Theme picker — see above. |
112
+ | **Registered Projects** | The project registry. Re-resolve, rename, or remove projects. |
113
+ | **specrails-tech** | Base URL for the external specrails-tech agents service (default `http://localhost:3000`). |
114
+ | **Budget & Alerts** | App-wide daily budget (a global spend cap across all projects — queues auto-pause when exceeded) plus a per-job cost alert threshold. Distinct from the per-project budget. |
115
+ | **OS Notifications** | Native desktop notifications when jobs complete or fail. Notifications only fire when the tab isn't focused. Filter on all / completed-only / failed-only. |
116
+ | **Outbound Webhooks** | Notify external tools (Slack, Zapier, CI/CD) on app events. Requests are signed with `X-Specrails-Signature` when a secret is set. |
117
+ | **Terminal Panel** | The same terminal fields as per-project, applied app-wide as defaults. Per-project values override them. |
118
+ | **Onboarding** | Re-run the welcome tour. |
119
+ | **Desktop Information** | Version, paths, and diagnostics. |
120
+
121
+ ## Authentication
122
+
123
+ There is no token to configure — the app manages it for you.
124
+
125
+ On first run the app generates a token and persists it to `~/.specrails/desktop.token` (mode `0600`). Every `/api/*` route requires it (the only exceptions are `/api/health` and `/api/token`), and WebSocket upgrades carry it as a subprotocol. The browser client fetches the token same-origin, so you never see it.
126
+
127
+ The app binds to `127.0.0.1` only, so it's never exposed to your network. To rotate the token, stop the app, delete `~/.specrails/desktop.token`, and start it again — a fresh token is generated on the next boot.
128
+
129
+ ## Environment variables
130
+
131
+ Most settings live in the UI. A few app-level switches are env-only because they're guardrails ops people want to flip without opening the dashboard.
132
+
133
+ ### Server-side (read at app startup or by spawned children)
134
+
135
+ | Variable | Effect |
136
+ |----------|--------|
137
+ | `SPECRAILS_CORE_BIN` | Override the `specrails-core` binary (default: `npx --yes --prefer-online specrails-core@latest`) |
138
+ | `SPECRAILS_TECH_URL` | Override the specrails-tech proxy base URL |
139
+ | `SPECRAILS_AGENTS_SECTION=false` | Hide the Agents section from every project |
140
+ | `SPECRAILS_PLUGINS_SECTION=false` | Hide the Integrations section from every project |
141
+ | `SPECRAILS_TERMINAL_PANEL=false` | Disable the bottom terminal panel everywhere |
142
+ | `SPECRAILS_CODE_EXPLORER=false` | Disable the read-only Code section server-side |
143
+ | `SPECRAILS_BROWSER_CAPTURE=false` | Disable Add-Spec-from-browser capture |
144
+ | `SPECRAILS_CODEX_BETA=0` | Emergency rollback — disable the Codex provider (legacy `SPECRAILS_HUB_CODEX_BETA` still honoured as a fallback) |
145
+ | `SPECRAILS_SMASH=0` | Kill switch for SMASH spec decomposition (`0` / `false` / `off`; endpoints return 409) |
146
+ | `SPECRAILS_EXPLORE_CONTRACT_REFINE=0` | App-wide kill switch for Contract Refine (auto-fire + retry endpoint; accepts `0` / `false` / `off`) |
147
+ | `SPECRAILS_EXPLORE_LEGACY_CWD=1` | Force Explore spawns to use the project root instead of the app-managed `explore-cwd/` |
148
+ | `SPECRAILS_FILE_SUMMARY_MODEL` | Override the model used for Code-section file summaries |
149
+ | `SPECRAILS_ALLOW_LOCAL_WEBHOOKS=1` | Allow outbound webhooks to target loopback / private-network addresses |
150
+
151
+ ### Client-side (Vite — set at build time)
152
+
153
+ These feature flags are **default ON**. Set the flag to `false` to hide the feature.
154
+
155
+ | Variable | Effect |
156
+ |----------|--------|
157
+ | `VITE_FEATURE_TERMINAL_PANEL=false` | Hide the bottom terminal panel |
158
+ | `VITE_FEATURE_AGENTS_SECTION=false` | Hide the Agents section |
159
+ | `VITE_FEATURE_CODE_EXPLORER=false` | Hide the read-only Code section |
160
+ | `VITE_FEATURE_EXPLORE_REVIEW=false` | Disable the Review step in the Explore shell |
161
+ | `VITE_FEATURE_EXPLORE_PREMIUM_UX=false` | Disable the "Conectando…/Pensando…/Consultando código…" pills above the Explore streaming bubble |
162
+
163
+ > **Port:** the app doesn't read an env var for its port — use the `--port <n>` global flag: `specrails-desktop --port 5000 start`.
164
+
165
+ Set them in the shell that launches the app. Desktop app users can set them in their shell rc files since the desktop app inherits the launchd PATH and env.
166
+
167
+ ## Resetting the app
168
+
169
+ To wipe all app state (project registry, settings, theme) but keep your project source code intact:
170
+
171
+ ```bash
172
+ specrails-desktop stop
173
+ rm -rf ~/.specrails/desktop.sqlite* ~/.specrails/projects/
174
+ specrails-desktop start
175
+ ```
176
+
177
+ The `desktop.sqlite*` glob also removes the SQLite WAL/SHM sidecars. This deletes the project registry and every per-project SQLite. Your project directories on disk and their `.specrails/` folders (specs, profiles, plugins) are untouched. `desktop.token` and `manager.pid` regenerate harmlessly on the next start.
178
+
179
+ For a more surgical reset (e.g. clear job history for one project but keep the registration), see [internals/operations-runbook.md](internals/operations-runbook.md).
180
+
181
+ ## Backup
182
+
183
+ Everything the app knows is in `~/.specrails/`. Back it up:
184
+
185
+ ```bash
186
+ tar -czf specrails-backup-$(date +%F).tar.gz -C ~ .specrails
187
+ ```
188
+
189
+ Restore by extracting the archive in `~/`.
190
+
191
+ Per-project specs, profiles, and plugins live in your project directories (`<project>/.specrails/`), so they ride along with `git`.
192
+
193
+ ## Where to go next
194
+
195
+ - [Tracking cost](tracking-cost.md) — set a daily budget so you can stop checking the bill.
196
+ - [Terminal panel](terminal.md) — fine-tune the bottom panel.
197
+ - [Operations runbook](internals/operations-runbook.md) — port conflicts, stale PID files, recovery procedures.