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,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderExploreInstructions = renderExploreInstructions;
|
|
7
|
+
exports.renderExploreClaudeMd = renderExploreClaudeMd;
|
|
8
|
+
exports.exploreCwdPathFor = exploreCwdPathFor;
|
|
9
|
+
exports.ensureExploreCwd = ensureExploreCwd;
|
|
10
|
+
exports.removeExploreCwd = removeExploreCwd;
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const os_1 = __importDefault(require("os"));
|
|
14
|
+
const providers_1 = require("./providers");
|
|
15
|
+
/**
|
|
16
|
+
* ExploreCwdManager owns the per-project app-managed cwd used to spawn the
|
|
17
|
+
* provider CLI for Explore Spec turns. See openspec/changes/accelerate-spec-
|
|
18
|
+
* chat-first-token/design.md decisions D1–D3 + D9, and openspec/changes/
|
|
19
|
+
* add-multi-provider-support/specs/explore-spec/spec.md for the multi-
|
|
20
|
+
* provider behaviour (instructions file is adapter-driven: CLAUDE.md for
|
|
21
|
+
* claude, AGENTS.md for codex).
|
|
22
|
+
*
|
|
23
|
+
* Layout under `~/.specrails/projects/<slug>/explore-cwd/`:
|
|
24
|
+
* ├── <adapter.instructionsFilename> — embedded mini-prompt, app-owned
|
|
25
|
+
* ├── project — symlink/junction → <project.path>
|
|
26
|
+
* └── project-path.txt — fallback when symlink creation fails
|
|
27
|
+
*/
|
|
28
|
+
/** Embedded Explore instructions template. Interpolates {{projectName}}. */
|
|
29
|
+
const EXPLORE_INSTRUCTIONS_TEMPLATE = `# Explore Spec assistant for "{{projectName}}"
|
|
30
|
+
|
|
31
|
+
You are running inside the **Explore Spec** experience of Specrails. The
|
|
32
|
+
user has opened a thinking-partner conversation to shape a single backlog
|
|
33
|
+
ticket. The app commits the final ticket — you never write to disk and never
|
|
34
|
+
invoke ticket-creation slash commands.
|
|
35
|
+
|
|
36
|
+
## Where you are
|
|
37
|
+
|
|
38
|
+
- The current working directory is an app-managed scratch directory; it does
|
|
39
|
+
NOT contain the user's source code.
|
|
40
|
+
- The user's repo is mounted at \`./project\`. Read it ONLY when the spec
|
|
41
|
+
actually requires evidence (e.g. the user names a concrete file or feature).
|
|
42
|
+
Do not pre-emptively enumerate the repo or open dozens of files.
|
|
43
|
+
- If \`./project\` does not resolve (rare; e.g. symlink creation failed on
|
|
44
|
+
Windows), a sibling file \`project-path.txt\` contains the absolute project
|
|
45
|
+
path. Use that path with absolute reads in that case.
|
|
46
|
+
|
|
47
|
+
## What you must do
|
|
48
|
+
|
|
49
|
+
- Act as an interactive thinking partner for this ticket draft: investigate
|
|
50
|
+
just enough, ask only the questions you need, surface trade-offs, propose a
|
|
51
|
+
concrete shape.
|
|
52
|
+
- Maintain the structured live draft via fenced \`spec-draft\` JSON blocks at
|
|
53
|
+
the end of every turn that updates draft state. The app parses these blocks
|
|
54
|
+
and updates the user's draft pane; the block itself is stripped from the
|
|
55
|
+
visible chat output.
|
|
56
|
+
- Set \`ready: true\` in the draft block only when the draft has a title, a
|
|
57
|
+
description, at least one acceptance criterion, and no outstanding
|
|
58
|
+
clarifying question for the user.
|
|
59
|
+
|
|
60
|
+
## What you must NOT do
|
|
61
|
+
|
|
62
|
+
- Do NOT create or modify any files in this cwd or in \`./project\`.
|
|
63
|
+
- Do NOT call \`/specrails:propose-spec\`, \`/specrails:implement\`, or any
|
|
64
|
+
slash command that produces side effects in the project. The app owns the
|
|
65
|
+
commit via \`POST /tickets/from-draft\` when the user clicks Create Spec.
|
|
66
|
+
- Do NOT modify, rewrite, or reference the user's own \`./project/CLAUDE.md\`
|
|
67
|
+
in your output. It exists for other purposes.
|
|
68
|
+
|
|
69
|
+
## Style
|
|
70
|
+
|
|
71
|
+
- Be brief. A short observation plus a focused question beats a paragraph.
|
|
72
|
+
- Spec content (\`title\`, \`description\`, \`labels\`, \`acceptanceCriteria\`)
|
|
73
|
+
is always written in English. Conversational prose mirrors the user's
|
|
74
|
+
language.
|
|
75
|
+
|
|
76
|
+
The user's first message follows. Begin the conversation.
|
|
77
|
+
`;
|
|
78
|
+
/**
|
|
79
|
+
* Render the embedded template for a given project name.
|
|
80
|
+
* Exported for testing.
|
|
81
|
+
*/
|
|
82
|
+
function renderExploreInstructions(projectName) {
|
|
83
|
+
return EXPLORE_INSTRUCTIONS_TEMPLATE.replace(/\{\{projectName\}\}/g, projectName);
|
|
84
|
+
}
|
|
85
|
+
/** @deprecated Use `renderExploreInstructions` — kept as a thin wrapper so
|
|
86
|
+
* any external callsite continues to compile. */
|
|
87
|
+
function renderExploreClaudeMd(projectName) {
|
|
88
|
+
return renderExploreInstructions(projectName);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Compute the explore-cwd path for a project without touching the filesystem.
|
|
92
|
+
* Used by the legacy-cwd env-var short-circuit and by tests.
|
|
93
|
+
*/
|
|
94
|
+
function exploreCwdPathFor(slug, baseDir) {
|
|
95
|
+
const base = baseDir ?? path_1.default.join(os_1.default.homedir(), '.specrails', 'projects');
|
|
96
|
+
return path_1.default.join(base, slug, 'explore-cwd');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create or refresh the explore-cwd for a project. Idempotent and cheap when
|
|
100
|
+
* already up-to-date. Returns the absolute path to the cwd.
|
|
101
|
+
*
|
|
102
|
+
* When SPECRAILS_EXPLORE_LEGACY_CWD=1 is set, returns `projectPath` directly
|
|
103
|
+
* and performs no filesystem IO — used as the rollback escape hatch.
|
|
104
|
+
*
|
|
105
|
+
* Pass `baseDir` for tests to redirect away from the user's home directory.
|
|
106
|
+
*/
|
|
107
|
+
function ensureExploreCwd(input, baseDir) {
|
|
108
|
+
if (process.env.SPECRAILS_EXPLORE_LEGACY_CWD === '1') {
|
|
109
|
+
return input.projectPath;
|
|
110
|
+
}
|
|
111
|
+
const cwd = exploreCwdPathFor(input.slug, baseDir);
|
|
112
|
+
fs_1.default.mkdirSync(cwd, { recursive: true });
|
|
113
|
+
const adapter = (0, providers_1.getAdapter)(input.provider ?? 'claude');
|
|
114
|
+
const instructionsPath = path_1.default.join(cwd, adapter.instructionsFilename);
|
|
115
|
+
const desiredInstructions = renderExploreInstructions(input.projectName);
|
|
116
|
+
let currentInstructions = null;
|
|
117
|
+
try {
|
|
118
|
+
currentInstructions = fs_1.default.readFileSync(instructionsPath, 'utf-8');
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
/* file may not exist yet */
|
|
122
|
+
}
|
|
123
|
+
if (currentInstructions !== desiredInstructions) {
|
|
124
|
+
fs_1.default.writeFileSync(instructionsPath, desiredInstructions, 'utf-8');
|
|
125
|
+
}
|
|
126
|
+
// If the project switched providers since the last materialise (defensive
|
|
127
|
+
// — provider is immutable post-creation but the lifecycle code MUST handle
|
|
128
|
+
// the edge per spec), remove any stale instructions file authored by a
|
|
129
|
+
// different provider so the explore-cwd doesn't carry both.
|
|
130
|
+
const STALE_INSTRUCTION_FILES = ['CLAUDE.md', 'AGENTS.md'];
|
|
131
|
+
for (const stale of STALE_INSTRUCTION_FILES) {
|
|
132
|
+
if (stale === adapter.instructionsFilename)
|
|
133
|
+
continue;
|
|
134
|
+
const stalePath = path_1.default.join(cwd, stale);
|
|
135
|
+
if (fs_1.default.existsSync(stalePath)) {
|
|
136
|
+
try {
|
|
137
|
+
fs_1.default.unlinkSync(stalePath);
|
|
138
|
+
}
|
|
139
|
+
catch { /* best-effort */ }
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
ensureProjectLink(cwd, input.projectPath);
|
|
143
|
+
return cwd;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Recursively remove the explore-cwd directory for a project. The `project`
|
|
147
|
+
* symlink/junction is unlinked explicitly (never followed) so the user's
|
|
148
|
+
* repo is never touched.
|
|
149
|
+
*/
|
|
150
|
+
function removeExploreCwd(slug, baseDir) {
|
|
151
|
+
const cwd = exploreCwdPathFor(slug, baseDir);
|
|
152
|
+
if (!fs_1.default.existsSync(cwd))
|
|
153
|
+
return;
|
|
154
|
+
const linkPath = path_1.default.join(cwd, 'project');
|
|
155
|
+
try {
|
|
156
|
+
const st = fs_1.default.lstatSync(linkPath);
|
|
157
|
+
if (st.isSymbolicLink() || (process.platform === 'win32' && st.isDirectory())) {
|
|
158
|
+
// unlink works on POSIX symlinks; rmdir on Windows junctions
|
|
159
|
+
try {
|
|
160
|
+
fs_1.default.unlinkSync(linkPath);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
try {
|
|
164
|
+
fs_1.default.rmdirSync(linkPath);
|
|
165
|
+
}
|
|
166
|
+
catch { /* best-effort */ }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* link may not exist */
|
|
172
|
+
}
|
|
173
|
+
fs_1.default.rmSync(cwd, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Ensure `<cwd>/project` resolves to `<projectPath>` (symlink on POSIX,
|
|
177
|
+
* junction on Windows). Recreated when the existing target differs. On both
|
|
178
|
+
* symlink and junction failure, writes a `project-path.txt` fallback that
|
|
179
|
+
* the embedded CLAUDE.md tells the model to read.
|
|
180
|
+
*/
|
|
181
|
+
function ensureProjectLink(cwd, projectPath) {
|
|
182
|
+
const linkPath = path_1.default.join(cwd, 'project');
|
|
183
|
+
const fallbackPath = path_1.default.join(cwd, 'project-path.txt');
|
|
184
|
+
let needsCreate = true;
|
|
185
|
+
try {
|
|
186
|
+
const st = fs_1.default.lstatSync(linkPath);
|
|
187
|
+
if (st.isSymbolicLink()) {
|
|
188
|
+
const current = fs_1.default.readlinkSync(linkPath);
|
|
189
|
+
if (path_1.default.resolve(cwd, current) === path_1.default.resolve(projectPath)) {
|
|
190
|
+
needsCreate = false;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
fs_1.default.unlinkSync(linkPath);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// existing non-symlink (e.g. Windows junction or stale dir) — replace
|
|
198
|
+
try {
|
|
199
|
+
fs_1.default.unlinkSync(linkPath);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
try {
|
|
203
|
+
fs_1.default.rmdirSync(linkPath);
|
|
204
|
+
}
|
|
205
|
+
catch { /* best-effort */ }
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
/* link does not exist — fall through to create */
|
|
211
|
+
}
|
|
212
|
+
if (needsCreate) {
|
|
213
|
+
let created = false;
|
|
214
|
+
if (process.platform === 'win32') {
|
|
215
|
+
try {
|
|
216
|
+
fs_1.default.symlinkSync(projectPath, linkPath, 'junction');
|
|
217
|
+
created = true;
|
|
218
|
+
}
|
|
219
|
+
catch { /* fall through to plain symlink */ }
|
|
220
|
+
}
|
|
221
|
+
if (!created) {
|
|
222
|
+
try {
|
|
223
|
+
fs_1.default.symlinkSync(projectPath, linkPath);
|
|
224
|
+
created = true;
|
|
225
|
+
}
|
|
226
|
+
catch { /* fall through to text fallback */ }
|
|
227
|
+
}
|
|
228
|
+
if (!created) {
|
|
229
|
+
// Final fallback: write the absolute path so the model can use it.
|
|
230
|
+
fs_1.default.writeFileSync(fallbackPath, projectPath, 'utf-8');
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// If we successfully created/verified the symlink, clean up any stale
|
|
235
|
+
// fallback file from a prior failed attempt.
|
|
236
|
+
if (fs_1.default.existsSync(fallbackPath)) {
|
|
237
|
+
try {
|
|
238
|
+
fs_1.default.unlinkSync(fallbackPath);
|
|
239
|
+
}
|
|
240
|
+
catch { /* ignore */ }
|
|
241
|
+
}
|
|
242
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auto-title generation for Explore drafts.
|
|
4
|
+
*
|
|
5
|
+
* Strategy: deterministic single-line summary derived from the first
|
|
6
|
+
* user-submitted message in the conversation. Future enhancement: replace
|
|
7
|
+
* `generateAutoTitle` with an LLM-backed implementation that calls Claude
|
|
8
|
+
* with a short prompt and falls back to the deterministic path on failure.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.generateAutoTitle = generateAutoTitle;
|
|
12
|
+
const MAX_TITLE_LEN = 80;
|
|
13
|
+
const FALLBACK_TITLE = 'Untitled draft';
|
|
14
|
+
/**
|
|
15
|
+
* Produce a non-empty, single-line, human-meaningful title from a
|
|
16
|
+
* conversation transcript. Always returns a non-empty string.
|
|
17
|
+
*/
|
|
18
|
+
function generateAutoTitle(messages) {
|
|
19
|
+
const firstUser = messages.find((m) => m.role === 'user' && m.content.trim().length > 0);
|
|
20
|
+
if (!firstUser)
|
|
21
|
+
return FALLBACK_TITLE;
|
|
22
|
+
return summarizeToSingleLine(firstUser.content);
|
|
23
|
+
}
|
|
24
|
+
function summarizeToSingleLine(text) {
|
|
25
|
+
// Strip code fences and inline backticks — drafts are about ideas, not code
|
|
26
|
+
const stripped = text
|
|
27
|
+
.replace(/```[\s\S]*?```/g, ' ')
|
|
28
|
+
.replace(/`[^`]*`/g, ' ')
|
|
29
|
+
.replace(/\s+/g, ' ')
|
|
30
|
+
.trim();
|
|
31
|
+
if (!stripped)
|
|
32
|
+
return FALLBACK_TITLE;
|
|
33
|
+
// Prefer the first sentence if it's short enough
|
|
34
|
+
const sentenceMatch = stripped.match(/^.{1,80}?[.!?](\s|$)/);
|
|
35
|
+
if (sentenceMatch) {
|
|
36
|
+
const sentence = sentenceMatch[0].trim().replace(/[.!?]+$/, '');
|
|
37
|
+
if (sentence.length > 0)
|
|
38
|
+
return sentence;
|
|
39
|
+
}
|
|
40
|
+
if (stripped.length <= MAX_TITLE_LEN)
|
|
41
|
+
return stripped;
|
|
42
|
+
// Word-aware truncation
|
|
43
|
+
const head = stripped.slice(0, MAX_TITLE_LEN);
|
|
44
|
+
const lastSpace = head.lastIndexOf(' ');
|
|
45
|
+
const truncated = lastSpace > 20 ? head.slice(0, lastSpace) : head;
|
|
46
|
+
return truncated.trim() + '…';
|
|
47
|
+
}
|