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
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# OpenSpec (opsx) Workflow
|
|
2
|
+
|
|
3
|
+
> **Note:** The OpenSpec Changes UI (the `/changes` route in the dashboard) was removed in the SPEA-341 redesign. There is no dashboard surface for the `opsx:*` workflow — you drive it from a Claude Code conversation, not from the app UI.
|
|
4
|
+
|
|
5
|
+
OpenSpec is the structured change-management workflow this repository uses to evolve itself. Every feature, fix, or refactor goes through a lifecycle of **artifacts** — from a proposal to an archived implementation — so that whoever (human or AI) picks up the work always has the full context.
|
|
6
|
+
|
|
7
|
+
This is a **contributor** workflow: it manages the app's _own_ changes under `openspec/`. It is not a per-project end-user feature exposed in the dashboard.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## How it works
|
|
12
|
+
|
|
13
|
+
The `opsx:*` commands are **Claude Code slash commands** (defined in `.claude/commands/opsx/`). When you type one in a Claude Code conversation, the assistant drives the standalone **`openspec` Node CLI** to scaffold change directories, read artifact templates, and report status — then does the actual artifact authoring, code edits, and verification **directly in the conversation**.
|
|
14
|
+
|
|
15
|
+
Two consequences worth internalizing:
|
|
16
|
+
|
|
17
|
+
- **They do not require the specrails-desktop server.** `opsx:*` is independent of the app process; nothing is queued, no rail is launched, and nothing streams to the Dashboard.
|
|
18
|
+
- **They are distinct from `/specrails:implement`.** The Architect → Developer → Reviewer agent pipeline is a _separate_ flow (`specrails-desktop implement`, backed by the `sr-architect` / `sr-developer` / `sr-reviewer` agents). `opsx:apply` does **not** spawn those agents — it implements tasks itself, in the same conversation.
|
|
19
|
+
|
|
20
|
+
Under the hood the assistant calls the `openspec` binary for state, e.g.:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
openspec list --json # active + recent changes
|
|
24
|
+
openspec new change "<name>" # scaffold a change directory
|
|
25
|
+
openspec status --change "<name>" --json # artifact graph + progress
|
|
26
|
+
openspec instructions <artifact-id> --change "<name>" --json # template + context
|
|
27
|
+
openspec instructions apply --change "<name>" --json # apply context files
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
You normally won't run these by hand — the slash command orchestrates them for you.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Where changes live
|
|
35
|
+
|
|
36
|
+
Changes are scaffolded under your project's `openspec/` directory:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
openspec/
|
|
40
|
+
config.yaml # selects the workflow schema (here: spec-driven)
|
|
41
|
+
changes/
|
|
42
|
+
<name>/ # an active change
|
|
43
|
+
proposal.md
|
|
44
|
+
design.md
|
|
45
|
+
tasks.md
|
|
46
|
+
specs/<capability>/spec.md
|
|
47
|
+
...
|
|
48
|
+
archive/ # completed changes, date-prefixed
|
|
49
|
+
2026-04-20-pipeline-telemetry/
|
|
50
|
+
2026-04-24-add-agents-profiles/
|
|
51
|
+
...
|
|
52
|
+
specs/ # main (synced) capability specs
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Archives land under `openspec/changes/archive/` (singular `archive`) with a `YYYY-MM-DD-<name>` directory name.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Artifacts are schema-driven
|
|
60
|
+
|
|
61
|
+
There is **no fixed list** of artifact filenames. The set is determined by the **workflow schema** declared in `openspec/config.yaml` (`schema: spec-driven` in this repo). The assistant reads the live artifact graph from `openspec status --change <name> --json` and never assumes specific names.
|
|
62
|
+
|
|
63
|
+
For the default **`spec-driven`** schema the artifacts are:
|
|
64
|
+
|
|
65
|
+
| Artifact | Purpose |
|
|
66
|
+
|----------|---------|
|
|
67
|
+
| `proposal.md` | Why / What changes / Capabilities / Impact |
|
|
68
|
+
| `specs/<capability>/spec.md` | One delta spec per capability listed in the proposal |
|
|
69
|
+
| `design.md` | Technical decisions, architecture, implementation approach |
|
|
70
|
+
| `tasks.md` | Checkboxed implementation tasks (`- [ ]` / `- [x]`) |
|
|
71
|
+
|
|
72
|
+
Some changes also carry `context-bundle.md` and a `.openspec.yaml` marker. Other schemas define a different artifact set entirely — always trust the CLI status output, not a hardcoded list.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## The change lifecycle
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
opsx:explore (optional) think through the idea first — no code
|
|
80
|
+
│
|
|
81
|
+
▼
|
|
82
|
+
opsx:new scaffold the change, show the first artifact template
|
|
83
|
+
│
|
|
84
|
+
▼
|
|
85
|
+
opsx:ff generate all apply-ready artifacts in one pass
|
|
86
|
+
│ (or opsx:continue to create one artifact at a time and review each)
|
|
87
|
+
│
|
|
88
|
+
▼
|
|
89
|
+
opsx:apply implement the tasks in-conversation, flipping - [ ] → - [x]
|
|
90
|
+
│
|
|
91
|
+
▼
|
|
92
|
+
opsx:verify in-conversation Completeness / Correctness / Coherence report
|
|
93
|
+
│
|
|
94
|
+
▼
|
|
95
|
+
opsx:sync (when needed) merge delta specs into openspec/specs/
|
|
96
|
+
│
|
|
97
|
+
▼
|
|
98
|
+
opsx:archive move the change to openspec/changes/archive/YYYY-MM-DD-<name>/
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Commands reference
|
|
104
|
+
|
|
105
|
+
Run these as Claude Code slash commands inside a conversation in the repo.
|
|
106
|
+
|
|
107
|
+
### `opsx:explore` — Think before you build
|
|
108
|
+
|
|
109
|
+
A thinking-partner mode for shaping an idea, investigating the codebase, or comparing approaches. It reads files and draws diagrams but **never writes application code**. It may capture decisions into OpenSpec artifacts if you ask, but it won't implement.
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
/opsx:explore real-time collaboration
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Use it when the problem is still fuzzy. When things crystallize, it can flow straight into a proposal.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
### `opsx:new` — Start a new change
|
|
120
|
+
|
|
121
|
+
Scaffolds the change directory and **shows the first artifact's template and instructions** — then stops and waits for your direction. It deliberately creates **no artifacts yet**.
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
/opsx:new add-user-auth
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
You can also pass a description instead of a name and let the assistant derive a kebab-case name.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### `opsx:ff` — Fast-forward artifact creation
|
|
132
|
+
|
|
133
|
+
Generates every artifact required to start implementation in one pass (in dependency order, reading each upstream artifact for context). Best when the task is well-defined and you want to go straight to `opsx:apply`.
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
/opsx:ff add-user-auth
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
The assistant loops the schema's artifacts, creating each one until everything `apply.requires` is done.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### `opsx:continue` — Create the next artifact, one at a time
|
|
144
|
+
|
|
145
|
+
Creates exactly **one** artifact per invocation — the next one whose dependencies are satisfied — then stops. Use it when you want to review and adjust each artifact before the next is drafted.
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
/opsx:continue add-user-auth
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Run it repeatedly until all artifacts exist, then move on to `opsx:apply`.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### `opsx:apply` — Implement the change
|
|
156
|
+
|
|
157
|
+
Reads the change's context files (via `openspec instructions apply --json`), then **implements the tasks directly in the conversation** — making the code edits and marking each task `- [ ]` → `- [x]` in the tasks file as it goes. It loops until all tasks are complete or it hits something that needs your input.
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
/opsx:apply add-user-auth
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
> **Not the app pipeline.** `opsx:apply` does the work itself, in-conversation. It does **not** queue a server job, spawn Architect/Developer/Reviewer agents, or stream to the Dashboard. For the agent pipeline, use `specrails-desktop implement` instead.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
### `opsx:verify` — Verify the implementation
|
|
168
|
+
|
|
169
|
+
Reads the artifacts and builds an in-conversation **verification report** across three dimensions:
|
|
170
|
+
|
|
171
|
+
- **Completeness** — are all `tasks.md` checkboxes done? Are all spec requirements implemented?
|
|
172
|
+
- **Correctness** — does the implementation match the requirements and cover the scenarios?
|
|
173
|
+
- **Coherence** — does the code follow the decisions in `design.md` and the project's patterns?
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
/opsx:verify add-user-auth
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Issues are graded CRITICAL / WARNING / SUGGESTION with file/line references. Resolve any CRITICALs (manually or by re-running `opsx:apply`), then verify again before archiving.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### `opsx:sync` — Sync delta specs to main specs
|
|
184
|
+
|
|
185
|
+
When a change adds, modifies, removes, or renames requirements, `opsx:sync` merges those delta specs (`openspec/changes/<name>/specs/`) into the main specs at `openspec/specs/<capability>/spec.md`. It's an **agent-driven intelligent merge** — it can add a single scenario without rewriting the whole requirement, and is idempotent. The change stays active; archive it once implementation is done.
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
/opsx:sync add-user-auth
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### `opsx:archive` — Archive a completed change
|
|
194
|
+
|
|
195
|
+
Moves the change to `openspec/changes/archive/YYYY-MM-DD-<name>/`. Before moving, it checks artifact and task completion (warning if anything is incomplete) and, when delta specs exist, offers to sync them first.
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
/opsx:archive add-user-auth
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
### `opsx:bulk-archive` — Archive several changes at once
|
|
204
|
+
|
|
205
|
+
Archives multiple completed changes in a single operation, checking the codebase to resolve spec conflicts intelligently. Use it when you've finished a batch of parallel changes.
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
/opsx:bulk-archive
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
### `opsx:onboard` — Guided walkthrough
|
|
214
|
+
|
|
215
|
+
A teaching mode that walks you through a complete OpenSpec cycle on real work in the codebase, narrating each step. Run it the first time you touch this workflow. (It checks that the `openspec` CLI is installed before starting.)
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
/opsx:onboard
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Use cases
|
|
224
|
+
|
|
225
|
+
### Feature implementation
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
/opsx:ff add-user-auth # scaffold + generate all artifacts
|
|
229
|
+
# review the generated proposal / design / tasks
|
|
230
|
+
/opsx:apply add-user-auth # implement the tasks in-conversation
|
|
231
|
+
/opsx:verify add-user-auth # check completeness/correctness/coherence
|
|
232
|
+
/opsx:sync add-user-auth # merge delta specs into main specs (if any)
|
|
233
|
+
/opsx:archive add-user-auth # archive
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Bug fix
|
|
237
|
+
|
|
238
|
+
For a well-understood bug, go straight to fast-forward:
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
/opsx:ff fix-token-refresh
|
|
242
|
+
# review the generated artifacts to confirm they describe the fix
|
|
243
|
+
/opsx:apply fix-token-refresh
|
|
244
|
+
/opsx:verify fix-token-refresh
|
|
245
|
+
/opsx:archive fix-token-refresh
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Refactor with careful artifact review
|
|
249
|
+
|
|
250
|
+
Use `opsx:explore` to think first, then create artifacts one at a time:
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
/opsx:explore the auth system is getting unwieldy
|
|
254
|
+
/opsx:new refactor-auth
|
|
255
|
+
/opsx:continue refactor-auth # creates the proposal — review it
|
|
256
|
+
/opsx:continue refactor-auth # creates the next artifact — review it
|
|
257
|
+
# ...repeat until all artifacts exist...
|
|
258
|
+
/opsx:apply refactor-auth
|
|
259
|
+
/opsx:verify refactor-auth
|
|
260
|
+
/opsx:archive refactor-auth
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Browsing changes via the app API
|
|
266
|
+
|
|
267
|
+
Although the dashboard `/changes` UI was removed, the server still **reads** the OpenSpec directory and exposes two read-only endpoints (per project):
|
|
268
|
+
|
|
269
|
+
| Endpoint | Returns |
|
|
270
|
+
|----------|---------|
|
|
271
|
+
| `GET /api/projects/:projectId/changes` | Active + archived changes (parsed from `openspec/changes/`) |
|
|
272
|
+
| `GET /api/projects/:projectId/changes/:changeId/artifacts/:artifact` | A single artifact's content (`proposal.md`, `design.md`, `tasks.md`, `delta-spec.md`, `context-bundle.md`) |
|
|
273
|
+
|
|
274
|
+
These are handy for tooling that wants to surface the artifact set without parsing the filesystem directly.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Further reading
|
|
279
|
+
|
|
280
|
+
- [CLI reference](../cli.md) — the `specrails-desktop` CLI and its verbs
|
|
281
|
+
- [Architecture](architecture.md) — server modules and how the app is wired
|
|
282
|
+
- [Adding a provider](adding-a-provider.md) — extending the provider adapter contract
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Operations Runbook
|
|
2
|
+
|
|
3
|
+
Common operational procedures for running, recovering, and updating specrails-desktop. Everything here is verified against the shipped code. The app binds to `127.0.0.1` only.
|
|
4
|
+
|
|
5
|
+
For the full data-directory layout, every CLI flag, env vars, and app/project settings, see [Configuration](configuration.md).
|
|
6
|
+
|
|
7
|
+
## Starting the app
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Start the app server (daemonized — it detaches and returns once ready)
|
|
11
|
+
specrails-desktop start
|
|
12
|
+
|
|
13
|
+
# Start on a non-default port (the --port flag may appear in any position)
|
|
14
|
+
specrails-desktop --port 5000 start
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`start` writes the server PID to `~/.specrails/manager.pid` and appends the server's stdout/stderr to `~/.specrails/desktop.log`. The default port is `4200`.
|
|
18
|
+
|
|
19
|
+
## Stopping the app
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
specrails-desktop stop
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`stop` reads the PID file and sends `SIGTERM`. If the PID file is stale (no such process), it prints `[specrails-desktop] server is not running (stale pid file)` and removes the file for you — so you rarely need to delete `manager.pid` by hand.
|
|
26
|
+
|
|
27
|
+
## Status / health check
|
|
28
|
+
|
|
29
|
+
The first thing to run when something looks wrong:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Is the app up? On what URL/PID? How many projects?
|
|
33
|
+
specrails-desktop status
|
|
34
|
+
|
|
35
|
+
# Same, against a custom port
|
|
36
|
+
specrails-desktop --port 5000 status
|
|
37
|
+
|
|
38
|
+
# One-line manager status (also usable as a script-friendly probe)
|
|
39
|
+
specrails-desktop --status
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`status` prints `server: running (pid <n>) on http://127.0.0.1:<port>`, the project count, and each project name. It exits non-zero when the app is not running.
|
|
43
|
+
|
|
44
|
+
> `specrails-desktop --jobs` is **not** functional against the running server — the server does not expose a cross-project `/api/jobs` route, so the command prints a message that jobs history requires a manager with SQLite persistence and exits `1`. Browse job history per project in the app's **Jobs** page instead.
|
|
45
|
+
|
|
46
|
+
## App data location
|
|
47
|
+
|
|
48
|
+
All app data lives under `~/.specrails/` (the path is hardcoded to your home directory — there is no override env var):
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
~/.specrails/
|
|
52
|
+
desktop.sqlite # App-level SQLite: project registry + desktop_settings
|
|
53
|
+
desktop.token # Auto-generated API token (mode 0600)
|
|
54
|
+
manager.pid # PID of the running server (removed on a clean stop)
|
|
55
|
+
desktop.log # Server stdout/stderr (appended on each start)
|
|
56
|
+
projects/
|
|
57
|
+
<slug>/
|
|
58
|
+
jobs.sqlite # Per-project job history, invocations, telemetry pointers
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
See [Configuration](configuration.md#specrails-directory-structure) for the complete per-project subtree (telemetry blobs, explore-cwd, terminals, attachments, etc.) and how the `<slug>` is derived.
|
|
62
|
+
|
|
63
|
+
> **Auth token caveat.** `~/.specrails/desktop.token` gates every `/api/*` request and WebSocket upgrade. Deleting it (or doing a full `rm -rf ~/.specrails`) regenerates a fresh token on the next start, which can leave an already-open browser tab or CLI on the old token — reload the app after a token reset. See [Configuration → Authentication](configuration.md#authentication).
|
|
64
|
+
|
|
65
|
+
## Log files
|
|
66
|
+
|
|
67
|
+
The app already daemonizes and writes its output to `~/.specrails/desktop.log` on every `start` — you do not need to redirect anything yourself.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# Follow the live log
|
|
71
|
+
tail -f ~/.specrails/desktop.log
|
|
72
|
+
|
|
73
|
+
# Show the last 200 lines
|
|
74
|
+
tail -n 200 ~/.specrails/desktop.log
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The log file is opened in append mode, so it accumulates across restarts. Truncate or rotate it manually if it grows large.
|
|
78
|
+
|
|
79
|
+
## Backups
|
|
80
|
+
|
|
81
|
+
To back up all app data, copy the whole directory while the app is stopped:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
specrails-desktop stop
|
|
85
|
+
cp -r ~/.specrails/ ~/specrails-backup-$(date +%Y%m%d)/
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Your project source code and each project's `.specrails/` folder (specs, profiles, plugins) live in your repos, not here — they are not part of this backup.
|
|
89
|
+
|
|
90
|
+
## Troubleshooting
|
|
91
|
+
|
|
92
|
+
### Port already in use
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Find the process bound to the port (use your custom port if not 4200)
|
|
96
|
+
lsof -i :4200
|
|
97
|
+
|
|
98
|
+
# Stop the app cleanly
|
|
99
|
+
specrails-desktop stop
|
|
100
|
+
|
|
101
|
+
# Last resort: kill by recorded PID
|
|
102
|
+
kill "$(cat ~/.specrails/manager.pid)"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
If you run the app on a custom port, point `lsof` and `status` at that port (`--port <n>`).
|
|
106
|
+
|
|
107
|
+
### Server won't start after a crash
|
|
108
|
+
|
|
109
|
+
A clean `stop` already clears a stale PID file. If a crash left one behind and `start` still refuses:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
rm ~/.specrails/manager.pid
|
|
113
|
+
specrails-desktop start
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Registry database reset (loses project registrations)
|
|
117
|
+
|
|
118
|
+
> **Warning:** `desktop.sqlite` is the project registry *and* the app-settings store. Deleting it unregisters **every** project and resets all app settings. Your project source and each project's specrails-core install are untouched, but you must re-add each project afterward.
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Back up first, then reset
|
|
122
|
+
cp ~/.specrails/desktop.sqlite ~/.specrails/desktop.sqlite.bak
|
|
123
|
+
specrails-desktop stop
|
|
124
|
+
rm -f ~/.specrails/desktop.sqlite* # the glob also clears the WAL/SHM sidecars
|
|
125
|
+
specrails-desktop start # re-creates an empty registry
|
|
126
|
+
|
|
127
|
+
# Re-register each project
|
|
128
|
+
specrails-desktop add /path/to/project-a
|
|
129
|
+
specrails-desktop add /path/to/project-b
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Per-project reset (keeps the registration)
|
|
133
|
+
|
|
134
|
+
To clear one project's job history, invocations, and telemetry pointers while keeping it registered, delete just that project's `jobs.sqlite` with the app stopped:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
specrails-desktop stop
|
|
138
|
+
rm -f ~/.specrails/projects/<slug>/jobs.sqlite*
|
|
139
|
+
specrails-desktop start
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The `<slug>` matches the project's directory name, lowercased with non-alphanumeric runs collapsed to hyphens (e.g. `My App v2!` → `my-app-v2`). The project's registration in `desktop.sqlite` and its on-disk `.specrails/` assets are left intact; the per-project DB is re-created empty on next start.
|
|
143
|
+
|
|
144
|
+
## Updates
|
|
145
|
+
|
|
146
|
+
For an npm-installed server:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npm update -g specrails-desktop
|
|
150
|
+
specrails-desktop stop && specrails-desktop start
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The desktop app self-updates via Tauri's passive updater — no manual step needed.
|
|
154
|
+
|
|
155
|
+
## Desktop app
|
|
156
|
+
|
|
157
|
+
These commands require the **Rust toolchain** and `@tauri-apps/cli` (a devDependency), in addition to a checked-out repo with both `npm install` trees (root + `client/`).
|
|
158
|
+
|
|
159
|
+
### Development
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
npm run dev:desktop
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Runs `tauri dev` — a hot-reloading desktop window backed by the dev server.
|
|
166
|
+
|
|
167
|
+
### Production build
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
npm run build:desktop
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
This single script chains the full pipeline: `build:server` → client build → `build:sidecar` → `tauri build`. There is **no** `npm run tauri` script — `npm run tauri dev` / `npm run tauri build` fail with `Missing script: tauri`.
|
|
174
|
+
|
|
175
|
+
The macOS build is signed + notarized. The Windows x64 and arm64 builds ship **unsigned** in v1 (users see a SmartScreen warning → "More info → Run anyway"). See [Windows](../platforms/windows.md) and [macOS](../platforms/macos.md) for platform specifics.
|
|
176
|
+
|
|
177
|
+
### Build the server sidecar only
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npm run build:sidecar
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Bundles the Express server (and the `node-pty` native module) into the standalone sidecar that Tauri ships. `build:desktop` runs this for you; run it on its own only when iterating on server code for a desktop build.
|
|
184
|
+
|
|
185
|
+
### Regenerate app icons
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm run generate-icons
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Regenerates every icon size (PNG/ICNS/ICO) from `src-tauri/icons/icon.svg` via `tauri icon`. Requires the Rust toolchain + `@tauri-apps/cli`. Run after any icon design change.
|
|
192
|
+
|
|
193
|
+
## Further reading
|
|
194
|
+
|
|
195
|
+
- [Configuration](configuration.md) — full data layout, app/project settings, auth token, env vars
|
|
196
|
+
- [CLI reference](../cli.md) — every command and flag in detail
|
|
197
|
+
- [Architecture](architecture.md) — server modules, data flow, WebSocket protocol
|
|
198
|
+
- [macOS](../platforms/macos.md) · [Windows](../platforms/windows.md) — platform-specific operations
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Profiles — Quick start
|
|
2
|
+
|
|
3
|
+
Profiles let you save a named combination of orchestrator model, agent
|
|
4
|
+
chain, per-agent models, and routing rules, and pick one per rail at
|
|
5
|
+
launch time. Different rails on the Dashboard can run different profiles
|
|
6
|
+
simultaneously — useful for batch runs where each feature needs a
|
|
7
|
+
different flavor of pipeline.
|
|
8
|
+
|
|
9
|
+
Requires **`specrails-core >= 4.1.0`** in the target project. Without
|
|
10
|
+
it, the app still lets you create/edit profiles but the pipeline runs in
|
|
11
|
+
legacy mode (a yellow banner on the Agents page tells you when this is
|
|
12
|
+
the case).
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. Open the Agents section
|
|
17
|
+
|
|
18
|
+
From any project, click **Agents** in the right sidebar (next to
|
|
19
|
+
Dashboard/Jobs/Analytics/Settings).
|
|
20
|
+
|
|
21
|
+
- **Profiles** tab — create and edit profiles.
|
|
22
|
+
- **Usage** tab — see which profiles are actually being used.
|
|
23
|
+
- **Catalog** tab — read the upstream `sr-*` agents or author custom
|
|
24
|
+
`custom-*` ones via the Studio.
|
|
25
|
+
|
|
26
|
+
When the project has no profiles yet, the empty state offers two entry
|
|
27
|
+
points:
|
|
28
|
+
|
|
29
|
+
- **Migrate from current agents** — reads your existing
|
|
30
|
+
`.claude/agents/` frontmatter models and creates a `default` profile
|
|
31
|
+
mirroring today's behavior (zero-loss). It requires the baseline trio
|
|
32
|
+
`sr-architect`, `sr-developer`, and `sr-reviewer` to be present — the
|
|
33
|
+
server rejects the migration if any is missing.
|
|
34
|
+
- **Blank profile** — start from scratch.
|
|
35
|
+
|
|
36
|
+
## 2. Saved profiles vs selection
|
|
37
|
+
|
|
38
|
+
Two orthogonal concepts:
|
|
39
|
+
|
|
40
|
+
- **Saved profiles** — the set of profiles in the project (`.specrails/profiles/*.json`).
|
|
41
|
+
Committed to git, shared with the team.
|
|
42
|
+
- **Selection** — which profile this particular invocation uses. Per-rail,
|
|
43
|
+
per-launch.
|
|
44
|
+
|
|
45
|
+
Resolution order when no explicit selection is passed:
|
|
46
|
+
|
|
47
|
+
1. The profile named `default` (or `project-default`).
|
|
48
|
+
2. Legacy mode (no profile active).
|
|
49
|
+
|
|
50
|
+
## 3. Pick a profile at launch
|
|
51
|
+
|
|
52
|
+
Profiles are picked on the **Dashboard rails board**, not in a separate
|
|
53
|
+
wizard. Each rail header has a compact profile dropdown
|
|
54
|
+
(`RailProfileSelector`):
|
|
55
|
+
|
|
56
|
+
- Pick a profile once and it persists across launches of that rail
|
|
57
|
+
(stored per rail; sent inline on `POST /rails/:i/launch`, or set on its
|
|
58
|
+
own via `PUT /rails/:i/profile`).
|
|
59
|
+
- Concurrent rails can run different profiles at the same time, so a batch
|
|
60
|
+
spread across rails can give each feature its own flavor of pipeline.
|
|
61
|
+
- The selector **self-hides** when the project has no profiles, so it never
|
|
62
|
+
leaves an empty gap in the rail header.
|
|
63
|
+
|
|
64
|
+
The "No profile" option is always available — use it to run a
|
|
65
|
+
rail exactly as it did pre-4.1.0.
|
|
66
|
+
|
|
67
|
+
### Codex / multi-provider
|
|
68
|
+
|
|
69
|
+
Agent profiles are a **Claude-only** feature. When a rail's AI engine is
|
|
70
|
+
Codex, the app force-nulls the profile and runs the rail in legacy mode —
|
|
71
|
+
Codex has no agent-profile concept. The profile selector is hidden for
|
|
72
|
+
Codex rails, so a profile picked on one engine never silently applies to
|
|
73
|
+
the other.
|
|
74
|
+
|
|
75
|
+
## 4. Author a custom agent (Agent Studio)
|
|
76
|
+
|
|
77
|
+
From the Catalog tab, create a new custom agent via:
|
|
78
|
+
|
|
79
|
+
- **Template** — start from one of ~50 curated templates spanning many
|
|
80
|
+
categories (engineering, product, data, security, …) — for example
|
|
81
|
+
Security Reviewer, Performance Profiler, Data Engineer, or UI/UX Polisher.
|
|
82
|
+
- **Generate** — describe the agent in natural language; Claude drafts the
|
|
83
|
+
full `.md` for you to review and edit before saving.
|
|
84
|
+
- **Blank** — start from a minimal template.
|
|
85
|
+
- **Duplicate** — copy any existing agent (upstream or custom).
|
|
86
|
+
|
|
87
|
+
Custom agents live at `.claude/agents/custom-*.md` and are never touched
|
|
88
|
+
by `specrails-core`'s installer/update scripts. Every save appends a new
|
|
89
|
+
version row; open **History** in the Studio to browse and restore.
|
|
90
|
+
|
|
91
|
+
Click **Test** in the Studio to run the current draft against a sample
|
|
92
|
+
task in an isolated `claude` invocation — no files are written, and you
|
|
93
|
+
see output, token count, and duration inline.
|
|
94
|
+
|
|
95
|
+
## 5. Observe
|
|
96
|
+
|
|
97
|
+
- A **profile badge** (themed with the `accent-primary` color) appears on
|
|
98
|
+
each job row showing which profile it ran under.
|
|
99
|
+
- The **Usage** tab shows usage per profile for the last 7/30/90 days:
|
|
100
|
+
jobs, success rate, avg duration, avg tokens, and avg cost.
|
|
101
|
+
- The **diagnostic ZIP export** on a job includes `profile.json` with
|
|
102
|
+
the exact snapshot that rail used.
|
|
103
|
+
|
|
104
|
+
## 6. Troubleshooting
|
|
105
|
+
|
|
106
|
+
- **Upgrade banner on Agents page** — `npx specrails-core@latest update`
|
|
107
|
+
in the project to bring it to ≥ 4.1.0.
|
|
108
|
+
- **Save disabled with "N issues to resolve"** — the live validator
|
|
109
|
+
enforces the baseline trio (`sr-architect`, `sr-developer`, `sr-reviewer`)
|
|
110
|
+
and routing ordering. Among the rules: a `default: true` routing rule (if
|
|
111
|
+
present) must be the **last** entry in `routing` and must target
|
|
112
|
+
`sr-developer`. Fix the listed issues and Save re-enables.
|
|
113
|
+
- **"agent 'xyz' already exists" (409)** — the name collides with an
|
|
114
|
+
existing file in `.claude/agents/`. Pick a different name.
|
|
115
|
+
- **The whole Agents section is missing** — it can be disabled server-side
|
|
116
|
+
with `SPECRAILS_AGENTS_SECTION=false`, which 404s the entire
|
|
117
|
+
`/profiles` router. Unset it (or leave it at its default) to restore the
|
|
118
|
+
section.
|
|
119
|
+
|
|
120
|
+
## 7. Reserved paths
|
|
121
|
+
|
|
122
|
+
`specrails-core`'s installer guarantees it will never touch:
|
|
123
|
+
|
|
124
|
+
- `.specrails/profiles/**` — your profile catalog.
|
|
125
|
+
- `.claude/agents/custom-*.md` — your custom agents.
|
|
126
|
+
|
|
127
|
+
Everything else under `.specrails/` (install-config, specrails-version,
|
|
128
|
+
setup-templates) is managed by the installer and may be overwritten on
|
|
129
|
+
update.
|
|
130
|
+
|
|
131
|
+
## 8. For developers
|
|
132
|
+
|
|
133
|
+
A few internals worth knowing if you're working on this surface:
|
|
134
|
+
|
|
135
|
+
- **Version gate.** Profile-aware spawns are gated by
|
|
136
|
+
`projectSupportsProfiles()` (`server/queue-manager.ts`), which reads the
|
|
137
|
+
project's `.specrails/specrails-version` and requires
|
|
138
|
+
`specrails-core >= 4.1.0`. Below that, the rail spawns in legacy mode and
|
|
139
|
+
no profile env var is injected.
|
|
140
|
+
- **Snapshot per job.** When a rail launches with a profile, the resolved
|
|
141
|
+
profile is written to
|
|
142
|
+
`~/.specrails/projects/<slug>/jobs/<jobId>/profile.json` (chmod `400`, so
|
|
143
|
+
mid-run edits are impossible) before the `claude` process spawns. The
|
|
144
|
+
spawn env then carries `SPECRAILS_PROFILE_PATH` pointing at that file.
|
|
145
|
+
The same snapshot is persisted to the `job_profiles` table for the Usage
|
|
146
|
+
analytics.
|
|
147
|
+
- **REST surface.** All profile operations live under
|
|
148
|
+
`/api/projects/:projectId/profiles` — list/get/create/update/delete,
|
|
149
|
+
`/:name/duplicate`, `/:name/rename`, `/resolve`, `/migrate-from-settings`,
|
|
150
|
+
`/analytics`, `/core-version`, and the catalog routes under `/catalog`.
|
|
151
|
+
The router 404s entirely when `SPECRAILS_AGENTS_SECTION=false`. See
|
|
152
|
+
[api-reference.md](api-reference.md) for the full route list.
|