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.
- package/.claude/commands/specrails/batch-implement.md +287 -0
- package/.claude/commands/specrails/compat-check.md +271 -0
- package/.claude/commands/specrails/doctor.md +62 -0
- package/.claude/commands/specrails/enrich.md +1635 -0
- package/.claude/commands/specrails/explore-spec.md +173 -0
- package/.claude/commands/specrails/health-check.md +527 -0
- package/.claude/commands/specrails/implement.md +1457 -0
- package/.claude/commands/specrails/memory-inspect.md +259 -0
- package/.claude/commands/specrails/opsx-diff.md +419 -0
- package/.claude/commands/specrails/propose-spec.md +102 -0
- package/.claude/commands/specrails/reconfig.md +89 -0
- package/.claude/commands/specrails/refactor-recommender.md +212 -0
- package/.claude/commands/specrails/retry.md +363 -0
- package/.claude/commands/specrails/telemetry.md +552 -0
- package/.claude/commands/specrails/why.md +96 -0
- package/LICENSE +21 -0
- package/README.md +290 -0
- package/cli/dist/specrails-desktop.js +1098 -0
- package/client/dist/assets/ActivityFeedPage-Gy4x8dBt.js +1 -0
- package/client/dist/assets/AgentsPage-CPgu--Fb.js +86 -0
- package/client/dist/assets/AnalyticsPage-B5sJEee2.js +1 -0
- package/client/dist/assets/BarChart-7IMQ8HY1.js +33 -0
- package/client/dist/assets/CodePage-CBdFvbwe.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-w0rdTq4w.js +1 -0
- package/client/dist/assets/DocsDialog-BZUYM7wm.js +11 -0
- package/client/dist/assets/DocsPage-9QglWl46.js +11 -0
- package/client/dist/assets/ExportDropdown-BLZFXtNi.js +1 -0
- package/client/dist/assets/IntegrationsPage-BxBE4y99.js +3 -0
- package/client/dist/assets/JobDetailPage-DydWx_5S.js +16 -0
- package/client/dist/assets/JobsPage-20ibw0IO.js +1 -0
- package/client/dist/assets/abap-Bw6f2wDG.js +1 -0
- package/client/dist/assets/activity-BEIp_Y1A.js +1 -0
- package/client/dist/assets/activity-BdrPln96.js +1 -0
- package/client/dist/assets/activity-CpkRS8Sx.js +1 -0
- package/client/dist/assets/activity-DKCpESPt.js +1 -0
- package/client/dist/assets/activity-DOUVEjJi.js +1 -0
- package/client/dist/assets/activity-DRwkql_y.js +1 -0
- package/client/dist/assets/activity-DcDQ7tjw.js +1 -0
- package/client/dist/assets/activity-Dv6H7wEr.js +1 -0
- package/client/dist/assets/addon-image-3WCl5Vhd.js +1 -0
- package/client/dist/assets/addon-ligatures-C5OdliKs.js +2 -0
- package/client/dist/assets/addon-webgl-BbX6pSjl.js +44 -0
- package/client/dist/assets/addspec-B5yl4Loj.js +1 -0
- package/client/dist/assets/addspec-BEeF5-zc.js +1 -0
- package/client/dist/assets/addspec-D33ocMxf.js +1 -0
- package/client/dist/assets/addspec-DFswZ0jK.js +1 -0
- package/client/dist/assets/addspec-DRE-jZv7.js +1 -0
- package/client/dist/assets/addspec-DVZ15Jp8.js +1 -0
- package/client/dist/assets/addspec-Fkv91Opc.js +1 -0
- package/client/dist/assets/addspec-GWm4ffKl.js +1 -0
- package/client/dist/assets/agents-1nCDWRmP.js +1 -0
- package/client/dist/assets/agents-Bm9rPqnt.js +1 -0
- package/client/dist/assets/agents-CMxtJMLD.js +1 -0
- package/client/dist/assets/agents-DK-Dlc0i.js +1 -0
- package/client/dist/assets/agents-Q6Ldfpxx.js +1 -0
- package/client/dist/assets/agents-TeOSy-ax.js +1 -0
- package/client/dist/assets/agents-iTqjRajS.js +1 -0
- package/client/dist/assets/agents-s87sMGzL.js +1 -0
- package/client/dist/assets/agentstudio-B6Wb59E7.js +1 -0
- package/client/dist/assets/agentstudio-BADhZ41e.js +1 -0
- package/client/dist/assets/agentstudio-BSnWLR63.js +1 -0
- package/client/dist/assets/agentstudio-BdidyBzZ.js +1 -0
- package/client/dist/assets/agentstudio-CxlUllqI.js +1 -0
- package/client/dist/assets/agentstudio-D3I62TLJ.js +1 -0
- package/client/dist/assets/agentstudio-DuH9TogZ.js +1 -0
- package/client/dist/assets/agentstudio-Kw88_dUF.js +1 -0
- package/client/dist/assets/aiedit-BWxHGsYA.js +1 -0
- package/client/dist/assets/aiedit-D2ji6Qy0.js +1 -0
- package/client/dist/assets/aiedit-DAhZTvtk.js +1 -0
- package/client/dist/assets/aiedit-DJMny-D5.js +1 -0
- package/client/dist/assets/aiedit-DOcxERkU.js +1 -0
- package/client/dist/assets/aiedit-DvrcbwGv.js +1 -0
- package/client/dist/assets/aiedit-TTwzL1TS.js +1 -0
- package/client/dist/assets/aiedit-WBSjT_C1.js +1 -0
- package/client/dist/assets/analytics-BIdr0YfL.js +1 -0
- package/client/dist/assets/analytics-C6EzgtdE.js +1 -0
- package/client/dist/assets/analytics-C9Zc-rkM.js +1 -0
- package/client/dist/assets/analytics-CVx3YOc0.js +1 -0
- package/client/dist/assets/analytics-CYj0tfj7.js +1 -0
- package/client/dist/assets/analytics-CnY4kNG3.js +1 -0
- package/client/dist/assets/analytics-CrPCZRJ-.js +1 -0
- package/client/dist/assets/analytics-DMCto-TF.js +1 -0
- package/client/dist/assets/apex-Cw8_REBo.js +1 -0
- package/client/dist/assets/atom-one-dark-B-oHczHB.css +1 -0
- package/client/dist/assets/attachments-BIsSSnHJ.js +1 -0
- package/client/dist/assets/attachments-BW4L3l2L.js +1 -0
- package/client/dist/assets/attachments-Bcf6BG6V.js +1 -0
- package/client/dist/assets/attachments-Bke8sCU4.js +1 -0
- package/client/dist/assets/attachments-COcrGRFz.js +1 -0
- package/client/dist/assets/attachments-DYHGA2Dj.js +1 -0
- package/client/dist/assets/attachments-Dd92KpUH.js +1 -0
- package/client/dist/assets/attachments-DzdU6DV6.js +1 -0
- package/client/dist/assets/azcli-Cz6HAoOw.js +1 -0
- package/client/dist/assets/bat-CcJ-xyqL.js +1 -0
- package/client/dist/assets/bicep-z1WDCKYz.js +2 -0
- package/client/dist/assets/browser-5ErDlJoR.js +1 -0
- package/client/dist/assets/browser-Bc-YdlVg.js +1 -0
- package/client/dist/assets/browser-BlYF4OOq.js +1 -0
- package/client/dist/assets/browser-CT-ReZGt.js +1 -0
- package/client/dist/assets/browser-DGITz3fC.js +1 -0
- package/client/dist/assets/browser-JsAIGCEW.js +1 -0
- package/client/dist/assets/browser-M5-rbPlw.js +1 -0
- package/client/dist/assets/browser-Qya9cARy.js +1 -0
- package/client/dist/assets/cameligo-BRewOpfa.js +1 -0
- package/client/dist/assets/chat-BEGuC03z.js +1 -0
- package/client/dist/assets/chat-BEW60P_u.js +1 -0
- package/client/dist/assets/chat-BQNMD0PL.js +1 -0
- package/client/dist/assets/chat-BsbNGPW9.js +1 -0
- package/client/dist/assets/chat-CboQguCi.js +1 -0
- package/client/dist/assets/chat-DRCa9pOt.js +1 -0
- package/client/dist/assets/chat-DwUm6W9z.js +1 -0
- package/client/dist/assets/chat-yoXwguQu.js +1 -0
- package/client/dist/assets/chunk-CilyBKbf.js +1 -0
- package/client/dist/assets/clojure-DBjRWN6g.js +1 -0
- package/client/dist/assets/clsx-DnqN-uhr.js +1 -0
- package/client/dist/assets/code-AL1rVIMb.js +1 -0
- package/client/dist/assets/code-C0BKpkht.js +1 -0
- package/client/dist/assets/code-C0FTS3ew.js +1 -0
- package/client/dist/assets/code-CPcHxzxw.js +1 -0
- package/client/dist/assets/code-D3ryDniw.js +1 -0
- package/client/dist/assets/code-D3zVVQTj.js +1 -0
- package/client/dist/assets/code-PCmfS3dn.js +1 -0
- package/client/dist/assets/code-exI0G5Wd.js +1 -0
- package/client/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
- package/client/dist/assets/coffee-Cfk_XHGR.js +1 -0
- package/client/dist/assets/commands-B772IyDa.js +1 -0
- package/client/dist/assets/commands-BDDp6xFG.js +1 -0
- package/client/dist/assets/commands-CJxCry-o.js +1 -0
- package/client/dist/assets/commands-CfgY-_of.js +1 -0
- package/client/dist/assets/commands-DLrvnPNg.js +1 -0
- package/client/dist/assets/commands-IXMOKBYt.js +1 -0
- package/client/dist/assets/commands-UD1NzmwX.js +1 -0
- package/client/dist/assets/commands-sqrqsxyE.js +1 -0
- package/client/dist/assets/common-DCr6VzJ7.js +1 -0
- package/client/dist/assets/common-Dard9UNH.js +1 -0
- package/client/dist/assets/common-DeDELLZJ.js +1 -0
- package/client/dist/assets/common-DltqHaAe.js +1 -0
- package/client/dist/assets/common-Dmm1GhdD.js +1 -0
- package/client/dist/assets/common-DnjcgkPH.js +1 -0
- package/client/dist/assets/common-GbpxfPG8.js +1 -0
- package/client/dist/assets/common-wA36jmj1.js +1 -0
- package/client/dist/assets/cpp-BVob6BaP.js +1 -0
- package/client/dist/assets/csharp-C4fbRuOu.js +1 -0
- package/client/dist/assets/csp-DthFP_vT.js +1 -0
- package/client/dist/assets/css-CGMH0hcW.js +3 -0
- package/client/dist/assets/css.worker-Wv5dxAWO.js +89 -0
- package/client/dist/assets/cssMode-Cc6ozl-J.js +1 -0
- package/client/dist/assets/cypher-Pnf68BRV.js +1 -0
- package/client/dist/assets/dart-PMMOtxZX.js +1 -0
- package/client/dist/assets/dashboard-B4ixDVk8.js +1 -0
- package/client/dist/assets/dashboard-BZBADHSj.js +1 -0
- package/client/dist/assets/dashboard-C1MfeUHs.js +1 -0
- package/client/dist/assets/dashboard-C7SK6xu5.js +1 -0
- package/client/dist/assets/dashboard-CB6Le1yN.js +1 -0
- package/client/dist/assets/dashboard-CoTpMOBM.js +1 -0
- package/client/dist/assets/dashboard-Duo4DDCW.js +1 -0
- package/client/dist/assets/dashboard-I19DXBxw.js +1 -0
- package/client/dist/assets/dist-js-BY-Fv_fg.js +1 -0
- package/client/dist/assets/dist-js-Bakc4uxT.js +1 -0
- package/client/dist/assets/dockerfile-di1nsJCc.js +1 -0
- package/client/dist/assets/ecl-D_WVcB5M.js +1 -0
- package/client/dist/assets/editor-Br_kD0ds.css +1 -0
- package/client/dist/assets/editor.api2-XLGzZfbc.js +872 -0
- package/client/dist/assets/editor.main-CfXxHimg.js +6 -0
- package/client/dist/assets/editor.worker-Bd9IXS8d.js +26 -0
- package/client/dist/assets/elixir-OAdJEMOn.js +1 -0
- package/client/dist/assets/explore-4mFpnrKU.js +1 -0
- package/client/dist/assets/explore-A8Ltoblq.js +1 -0
- package/client/dist/assets/explore-B9A3iN2W.js +1 -0
- package/client/dist/assets/explore-BV5Xxlsn.js +1 -0
- package/client/dist/assets/explore-BrBJvfjP.js +1 -0
- package/client/dist/assets/explore-C3FSE42C.js +1 -0
- package/client/dist/assets/explore-D2EFgt8J.js +1 -0
- package/client/dist/assets/explore-hFc3HFcp.js +1 -0
- package/client/dist/assets/flow9-D3QEZjgn.js +1 -0
- package/client/dist/assets/format-command-CwGuwzGA.js +1 -0
- package/client/dist/assets/freemarker2-DP7J1gG3.js +3 -0
- package/client/dist/assets/fsharp-BF0k_8N8.js +1 -0
- package/client/dist/assets/go-BAQO5Jsz.js +1 -0
- package/client/dist/assets/graphql-hdFVFkiV.js +1 -0
- package/client/dist/assets/handlebars-BjRlucw6.js +1 -0
- package/client/dist/assets/hcl-DWnl1o-X.js +1 -0
- package/client/dist/assets/html-OumBQJ-U.js +1 -0
- package/client/dist/assets/html.worker-CQP8QQsS.js +502 -0
- package/client/dist/assets/htmlMode-CStc3zXM.js +1 -0
- package/client/dist/assets/index-CimDRRi7.css +2 -0
- package/client/dist/assets/index-XGZaKl_u.js +142 -0
- package/client/dist/assets/ini-CB-6OVu3.js +1 -0
- package/client/dist/assets/integrations-C3p12Ms6.js +1 -0
- package/client/dist/assets/integrations-Cr6hH7XR.js +1 -0
- package/client/dist/assets/integrations-Cublz3m6.js +1 -0
- package/client/dist/assets/integrations-D28q1kF6.js +1 -0
- package/client/dist/assets/integrations-DRdbki5W.js +1 -0
- package/client/dist/assets/integrations-DaC4SzzL.js +1 -0
- package/client/dist/assets/integrations-DmQYCUvN.js +1 -0
- package/client/dist/assets/integrations-HIlUxXVs.js +1 -0
- package/client/dist/assets/java-d1CmfiHX.js +1 -0
- package/client/dist/assets/javascript-CMk--e7g.js +1 -0
- package/client/dist/assets/jobs-BE1siB0M.js +1 -0
- package/client/dist/assets/jobs-BHcQ_Faf.js +1 -0
- package/client/dist/assets/jobs-CFfc2dNX.js +1 -0
- package/client/dist/assets/jobs-CSi5n8X_.js +1 -0
- package/client/dist/assets/jobs-Dc3X86PY.js +1 -0
- package/client/dist/assets/jobs-De5tASex.js +1 -0
- package/client/dist/assets/jobs-DsoXEdo7.js +1 -0
- package/client/dist/assets/jobs-Wl-ApPMb.js +1 -0
- package/client/dist/assets/json.worker-DzV-CpCQ.js +58 -0
- package/client/dist/assets/jsonMode-C2h3ZcjZ.js +7 -0
- package/client/dist/assets/julia-Bgv08lKa.js +1 -0
- package/client/dist/assets/kotlin-u98kaVTf.js +1 -0
- package/client/dist/assets/less-CjYwpgg5.js +2 -0
- package/client/dist/assets/lexon-YTjaAFBB.js +1 -0
- package/client/dist/assets/lib-CPxTMOAq.js +7 -0
- package/client/dist/assets/liquid-mI3KJrBE.js +1 -0
- package/client/dist/assets/lspLanguageFeatures-DU09ggWi.js +4 -0
- package/client/dist/assets/lua-BzmkWv27.js +1 -0
- package/client/dist/assets/m3-CFwk9fw0.js +1 -0
- package/client/dist/assets/markdown-CR5iMpSZ.js +1 -0
- package/client/dist/assets/mdx-C41VDTR_.js +1 -0
- package/client/dist/assets/mips-CcEalc17.js +1 -0
- package/client/dist/assets/monaco.contribution-CPObAXMC.js +2 -0
- package/client/dist/assets/msdax-BQbkawnr.js +1 -0
- package/client/dist/assets/mysql-GTlaaW_P.js +1 -0
- package/client/dist/assets/nav-0fwkrgHt.js +1 -0
- package/client/dist/assets/nav-BEL3MTwK.js +1 -0
- package/client/dist/assets/nav-B_G-TJDW.js +1 -0
- package/client/dist/assets/nav-C2YXcbZS.js +1 -0
- package/client/dist/assets/nav-ClzOE4mA.js +1 -0
- package/client/dist/assets/nav-CtYwmMgu.js +1 -0
- package/client/dist/assets/nav-D2bOGSEg.js +1 -0
- package/client/dist/assets/nav-iH1V5j6o.js +1 -0
- package/client/dist/assets/objective-c-Byu1T5if.js +1 -0
- package/client/dist/assets/pascal-BrfzBfRm.js +1 -0
- package/client/dist/assets/pascaligo-BXXKFUeo.js +1 -0
- package/client/dist/assets/perl-B3OikKq-.js +1 -0
- package/client/dist/assets/pgsql-CTsa0Acc.js +1 -0
- package/client/dist/assets/php-DiQh3FUW.js +1 -0
- package/client/dist/assets/pla-92uH8Fzm.js +1 -0
- package/client/dist/assets/postiats-BbeWkKUr.js +1 -0
- package/client/dist/assets/powerquery-DgDMzpsm.js +1 -0
- package/client/dist/assets/powershell-BfdUUzaG.js +1 -0
- package/client/dist/assets/preload-helper-DSXbuxSR.js +1 -0
- package/client/dist/assets/protobuf-BojW2ftW.js +2 -0
- package/client/dist/assets/pug-BxqTg3IU.js +1 -0
- package/client/dist/assets/python-Y27rKQtk.js +1 -0
- package/client/dist/assets/qsharp-BX_A-MW9.js +1 -0
- package/client/dist/assets/r-D9BMnxvJ.js +1 -0
- package/client/dist/assets/razor-Cd5-q9Bp.js +1 -0
- package/client/dist/assets/redis-5cJqEQJJ.js +1 -0
- package/client/dist/assets/redshift-d8BBqiwb.js +1 -0
- package/client/dist/assets/restructuredtext-C8a6yIcZ.js +1 -0
- package/client/dist/assets/ruby-egeh-6KX.js +1 -0
- package/client/dist/assets/rust-a3r9IInB.js +1 -0
- package/client/dist/assets/sb-y8iRIDei.js +1 -0
- package/client/dist/assets/scala-BPDK2AmK.js +1 -0
- package/client/dist/assets/scheme-BIWUEoOs.js +1 -0
- package/client/dist/assets/scss-CA-PSzwg.js +3 -0
- package/client/dist/assets/settings-55oDcbSh.js +1 -0
- package/client/dist/assets/settings-Bd4Tq1RB.js +1 -0
- package/client/dist/assets/settings-CCSM-Fhn.js +1 -0
- package/client/dist/assets/settings-D3e_bDoW.js +1 -0
- package/client/dist/assets/settings-DKbTkbn7.js +1 -0
- package/client/dist/assets/settings-Dxpo6_w7.js +1 -0
- package/client/dist/assets/settings-bt84e3Aa.js +1 -0
- package/client/dist/assets/settings-nu68QukM.js +1 -0
- package/client/dist/assets/setup-BMqwfbW9.js +1 -0
- package/client/dist/assets/setup-Bb5LcG28.js +1 -0
- package/client/dist/assets/setup-BeEx2_da.js +1 -0
- package/client/dist/assets/setup-CCCrB53Q.js +1 -0
- package/client/dist/assets/setup-CJA0ATmd.js +1 -0
- package/client/dist/assets/setup-CeiDbZcb.js +1 -0
- package/client/dist/assets/setup-Cus7TApA.js +1 -0
- package/client/dist/assets/setup-D9qOs2Xo.js +1 -0
- package/client/dist/assets/shell--LiT1Bja.js +1 -0
- package/client/dist/assets/solidity-DdqZccZg.js +1 -0
- package/client/dist/assets/sophia-S6-YxNG_.js +1 -0
- package/client/dist/assets/sparql-BSf5kMp2.js +1 -0
- package/client/dist/assets/specs-BFfu3u-a.js +1 -0
- package/client/dist/assets/specs-B__C8-8a.js +1 -0
- package/client/dist/assets/specs-CZ1PsXsC.js +1 -0
- package/client/dist/assets/specs-D2FzlLn9.js +1 -0
- package/client/dist/assets/specs-DaUTrNF9.js +1 -0
- package/client/dist/assets/specs-Dyc5hYeE.js +1 -0
- package/client/dist/assets/specs-cKEh2LXt.js +1 -0
- package/client/dist/assets/specs-k0PyLDVt.js +1 -0
- package/client/dist/assets/sql-D7KgjR8G.js +1 -0
- package/client/dist/assets/st-BnoDa-Ml.js +1 -0
- package/client/dist/assets/swift-DEUHTkUX.js +1 -0
- package/client/dist/assets/systemverilog-Tqb_KPnW.js +1 -0
- package/client/dist/assets/tcl-BmBFS2qq.js +1 -0
- package/client/dist/assets/terminal-80yDMgMF.js +1 -0
- package/client/dist/assets/terminal-Bje4ziIa.js +1 -0
- package/client/dist/assets/terminal-C2WYcFHF.js +1 -0
- package/client/dist/assets/terminal-CSONJOex.js +1 -0
- package/client/dist/assets/terminal-DEqzGtcr.js +1 -0
- package/client/dist/assets/terminal-DeWzh6ys.js +1 -0
- package/client/dist/assets/terminal-YOlsJCQj.js +1 -0
- package/client/dist/assets/terminal-lkZYR4wJ.js +1 -0
- package/client/dist/assets/tickets-CB7N30gm.js +1 -0
- package/client/dist/assets/tickets-CF2PYelu.js +1 -0
- package/client/dist/assets/tickets-DNOANUXr.js +1 -0
- package/client/dist/assets/tickets-DU1aqsbr.js +1 -0
- package/client/dist/assets/tickets-DYvafSaY.js +1 -0
- package/client/dist/assets/tickets-DlpC_iTg.js +1 -0
- package/client/dist/assets/tickets-DucYgtdl.js +1 -0
- package/client/dist/assets/tickets-clefmXLv.js +1 -0
- package/client/dist/assets/ts.worker-METxwbDZ.js +67719 -0
- package/client/dist/assets/tsMode-B0y_xEci.js +11 -0
- package/client/dist/assets/twig-BQV8igWC.js +1 -0
- package/client/dist/assets/typescript-BzK0OgwW.js +1 -0
- package/client/dist/assets/typespec-DlFroUGY.js +1 -0
- package/client/dist/assets/useProjectCache-DSaiGFjV.js +1 -0
- package/client/dist/assets/vb-BlrJpIMX.js +1 -0
- package/client/dist/assets/wgsl-BWgIc6FZ.js +298 -0
- package/client/dist/assets/workers-rt--R2Qy.js +1 -0
- package/client/dist/assets/xml-eX9QXAmI.js +1 -0
- package/client/dist/assets/yaml-fcsNkpOt.js +1 -0
- package/client/dist/index.html +246 -0
- package/docs/README.md +54 -0
- package/docs/cli.md +198 -0
- package/docs/codex.md +210 -0
- package/docs/creating-specs.md +197 -0
- package/docs/customizing.md +197 -0
- package/docs/getting-started.md +140 -0
- package/docs/internals/README.md +25 -0
- package/docs/internals/adding-a-provider.md +238 -0
- package/docs/internals/api-reference.md +634 -0
- package/docs/internals/architecture.md +332 -0
- package/docs/internals/configuration.md +172 -0
- package/docs/internals/openspec-workflow.md +282 -0
- package/docs/internals/operations-runbook.md +198 -0
- package/docs/internals/profiles.md +152 -0
- package/docs/platforms/macos.md +130 -0
- package/docs/platforms/windows.md +81 -0
- package/docs/running-pipelines.md +240 -0
- package/docs/terminal.md +138 -0
- package/docs/tracking-cost.md +155 -0
- package/package.json +82 -0
- package/server/dist/agent-generator.js +232 -0
- package/server/dist/agent-refine-db.js +124 -0
- package/server/dist/agent-refine-manager.js +526 -0
- package/server/dist/ai-invocations.js +111 -0
- package/server/dist/attachment-manager.js +299 -0
- package/server/dist/auth.js +207 -0
- package/server/dist/binary-probe.js +35 -0
- package/server/dist/browser-capture-manager.js +576 -0
- package/server/dist/browser-capture-types.js +28 -0
- package/server/dist/browser-network.js +149 -0
- package/server/dist/browser-playwright.js +888 -0
- package/server/dist/build-dirs.js +44 -0
- package/server/dist/changes-reader.js +120 -0
- package/server/dist/chat-manager.js +1060 -0
- package/server/dist/chromium-resolver.js +311 -0
- package/server/dist/code-explorer-router.js +788 -0
- package/server/dist/codex-otel-bridge.js +235 -0
- package/server/dist/command-resolver.js +102 -0
- package/server/dist/config.js +306 -0
- package/server/dist/context-budget.js +113 -0
- package/server/dist/context-scope.js +279 -0
- package/server/dist/contract-refine-runner.js +521 -0
- package/server/dist/core-compat.js +207 -0
- package/server/dist/core-package.js +14 -0
- package/server/dist/db.js +1034 -0
- package/server/dist/desktop-analytics.js +156 -0
- package/server/dist/desktop-db.js +456 -0
- package/server/dist/desktop-router.js +735 -0
- package/server/dist/docs-router.js +207 -0
- package/server/dist/explore-contract-refine.js +421 -0
- package/server/dist/explore-cwd-manager.js +242 -0
- package/server/dist/explore-draft-title.js +47 -0
- package/server/dist/explore-smash.js +450 -0
- package/server/dist/feature-flags.js +17 -0
- package/server/dist/file-provenance.js +382 -0
- package/server/dist/file-summary-generator.js +221 -0
- package/server/dist/file-summary-manager.js +689 -0
- package/server/dist/hooks.js +102 -0
- package/server/dist/ids.js +7 -0
- package/server/dist/index.js +586 -0
- package/server/dist/metrics.js +136 -0
- package/server/dist/mobile/index.js +16 -0
- package/server/dist/mobile/mobile-admin-router.js +84 -0
- package/server/dist/mobile/mobile-auth.js +67 -0
- package/server/dist/mobile/mobile-devices.js +80 -0
- package/server/dist/mobile/mobile-event-bus.js +39 -0
- package/server/dist/mobile/mobile-gateway.js +285 -0
- package/server/dist/mobile/mobile-mdns.js +81 -0
- package/server/dist/mobile/mobile-pairing.js +179 -0
- package/server/dist/mobile/mobile-redact.js +53 -0
- package/server/dist/mobile/mobile-router.js +411 -0
- package/server/dist/mobile/mobile-tls.js +86 -0
- package/server/dist/mobile/mobile-types.js +9 -0
- package/server/dist/mobile/mobile-ws.js +275 -0
- package/server/dist/path-resolver.js +298 -0
- package/server/dist/plugin-manager.js +617 -0
- package/server/dist/plugins/claude-approval.js +179 -0
- package/server/dist/plugins/claude-md-mutation.js +146 -0
- package/server/dist/plugins/codex-mcp.js +108 -0
- package/server/dist/plugins/contributors.js +72 -0
- package/server/dist/plugins/drift.js +58 -0
- package/server/dist/plugins/index.js +14 -0
- package/server/dist/plugins/json-mutation.js +120 -0
- package/server/dist/plugins/manager.js +32 -0
- package/server/dist/plugins/ownership.js +86 -0
- package/server/dist/plugins/paths.js +37 -0
- package/server/dist/plugins/prereq-installer.js +104 -0
- package/server/dist/plugins/rail-integration.js +79 -0
- package/server/dist/plugins/serena/index.js +13 -0
- package/server/dist/plugins/serena/install.js +91 -0
- package/server/dist/plugins/serena/instructions-content.js +21 -0
- package/server/dist/plugins/serena/manifest.js +111 -0
- package/server/dist/plugins/serena/verify.js +78 -0
- package/server/dist/plugins-router.js +215 -0
- package/server/dist/pricing.js +89 -0
- package/server/dist/profile-manager.js +310 -0
- package/server/dist/profiles-router.js +759 -0
- package/server/dist/project-registry.js +443 -0
- package/server/dist/project-router.js +4016 -0
- package/server/dist/proposal-manager.js +291 -0
- package/server/dist/provider-selection.js +69 -0
- package/server/dist/providers/claude-adapter.js +281 -0
- package/server/dist/providers/codex-adapter.js +264 -0
- package/server/dist/providers/index.js +23 -0
- package/server/dist/providers/registry.js +37 -0
- package/server/dist/providers/types.js +22 -0
- package/server/dist/queue-manager.js +1511 -0
- package/server/dist/rails-router.js +362 -0
- package/server/dist/rails-store.js +116 -0
- package/server/dist/result-event.js +106 -0
- package/server/dist/schemas/profile.v1.json +151 -0
- package/server/dist/setup-manager.js +1165 -0
- package/server/dist/setup-prerequisites.js +372 -0
- package/server/dist/smash-runner.js +663 -0
- package/server/dist/spec-draft-parser.js +133 -0
- package/server/dist/spec-launcher-manager.js +174 -0
- package/server/dist/spec-models.js +32 -0
- package/server/dist/specrails-tech-client.js +82 -0
- package/server/dist/spending.js +448 -0
- package/server/dist/telemetry-compactor.js +180 -0
- package/server/dist/telemetry-export.js +317 -0
- package/server/dist/telemetry-receiver.js +224 -0
- package/server/dist/terminal-manager.js +633 -0
- package/server/dist/terminal-marks-store.js +117 -0
- package/server/dist/terminal-osc-parser.js +159 -0
- package/server/dist/terminal-settings.js +282 -0
- package/server/dist/terminal-shell-integration.js +196 -0
- package/server/dist/ticket-broadcast.js +47 -0
- package/server/dist/ticket-store.js +397 -0
- package/server/dist/ticket-watcher.js +117 -0
- package/server/dist/types.js +10 -0
- package/server/dist/user-mcp-config.js +117 -0
- package/server/dist/util/cli-prompt.js +181 -0
- package/server/dist/util/secure-fs.js +50 -0
- package/server/dist/util/win-spawn.js +43 -0
- package/server/dist/webhook-manager.js +89 -0
- 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.
|