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,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Agent Memory Inspector"
|
|
3
|
+
description: "Inspect and manage agent memory directories. Lists all sr-* agent memory stores, shows per-agent stats (file count, size, last modified), displays recent entries, and detects stale or orphaned files."
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [workflow, memory, agents, maintenance, diagnostics]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Inspect agent memory directories under `.claude/agent-memory/sr-*/` for **specrails-desktop**. Show per-agent stats, recent entries, and actionable recommendations.
|
|
9
|
+
|
|
10
|
+
**Input:** `$ARGUMENTS` — optional:
|
|
11
|
+
- `<agent-name>` — inspect a specific agent's memory (e.g. `sr-developer`, `sr-reviewer`)
|
|
12
|
+
- `--stale <days>` — flag files not modified in more than N days as stale (default: 30)
|
|
13
|
+
- `--prune` — delete stale files after confirmation (prints the list first, then asks)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Phase 0: Argument Parsing
|
|
18
|
+
|
|
19
|
+
Parse `$ARGUMENTS` to set runtime variables.
|
|
20
|
+
|
|
21
|
+
**Variables to set:**
|
|
22
|
+
|
|
23
|
+
- `AGENT_FILTER` — string or empty string. Default: `""` (inspect all agents).
|
|
24
|
+
- `STALE_DAYS` — integer. Default: `30`.
|
|
25
|
+
- `PRUNE_MODE` — boolean. Default: `false`.
|
|
26
|
+
|
|
27
|
+
**Parsing rules:**
|
|
28
|
+
|
|
29
|
+
1. Scan `$ARGUMENTS` for `--stale <N>`. If found, set `STALE_DAYS=<N>`. Validate that `<N>` is a positive integer; if not, print `Error: --stale requires a positive integer (e.g. --stale 14)` and stop. Strip from arguments.
|
|
30
|
+
2. Scan for `--prune`. If found, set `PRUNE_MODE=true`. Strip from arguments.
|
|
31
|
+
3. Remaining non-flag text (if any) is treated as `AGENT_FILTER`. Strip leading/trailing whitespace.
|
|
32
|
+
|
|
33
|
+
**Print active configuration:**
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Scanning: <all agents | agent: AGENT_FILTER> | Stale threshold: STALE_DAYS days | Prune: yes/no
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Phase 1: Discover Memory Directories
|
|
42
|
+
|
|
43
|
+
Glob all directories matching `.claude/agent-memory/sr-*/`.
|
|
44
|
+
|
|
45
|
+
If no directories are found:
|
|
46
|
+
```
|
|
47
|
+
No agent memory directories found under .claude/agent-memory/.
|
|
48
|
+
|
|
49
|
+
Agent memory is written by sr-* agents during the /specrails:implement pipeline.
|
|
50
|
+
Run /specrails:implement on a feature to generate your first memory entries.
|
|
51
|
+
```
|
|
52
|
+
Then stop.
|
|
53
|
+
|
|
54
|
+
If `AGENT_FILTER` is set, filter to only the directory `.claude/agent-memory/<AGENT_FILTER>/`. If that directory does not exist:
|
|
55
|
+
```
|
|
56
|
+
No memory directory found for agent: <AGENT_FILTER>
|
|
57
|
+
|
|
58
|
+
Available agents:
|
|
59
|
+
<list of discovered sr-* directory names>
|
|
60
|
+
```
|
|
61
|
+
Then stop.
|
|
62
|
+
|
|
63
|
+
Set `AGENT_DIRS` = list of matching directories (full paths), sorted alphabetically.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Phase 2: Collect Per-Agent Stats
|
|
68
|
+
|
|
69
|
+
For each directory in `AGENT_DIRS`, collect:
|
|
70
|
+
|
|
71
|
+
- `AGENT_NAME` — directory name (e.g. `sr-developer`)
|
|
72
|
+
- `FILE_COUNT` — total number of files (recursive, all types)
|
|
73
|
+
- `TOTAL_SIZE` — total size in bytes; display as human-readable (KB, MB)
|
|
74
|
+
- `LAST_MODIFIED` — ISO date of the most recently modified file
|
|
75
|
+
- `OLDEST_MODIFIED` — ISO date of the least recently modified file
|
|
76
|
+
- `STALE_FILES` — list of files not modified in more than `STALE_DAYS` days (full paths)
|
|
77
|
+
- `STALE_COUNT` — count of stale files
|
|
78
|
+
|
|
79
|
+
Use the current date to compute stale age. A file is stale if `(today - last_modified) > STALE_DAYS`.
|
|
80
|
+
|
|
81
|
+
Print a summary table after collecting all stats:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
## Agent Memory Overview
|
|
85
|
+
|
|
86
|
+
| Agent | Files | Size | Last Modified | Stale (>STALE_DAYS days) |
|
|
87
|
+
|-------|-------|------|---------------|--------------------------|
|
|
88
|
+
| sr-developer | N | N KB | YYYY-MM-DD | N files |
|
|
89
|
+
| sr-reviewer | N | N KB | YYYY-MM-DD | N files |
|
|
90
|
+
| ... | ... | ... | ... | ... |
|
|
91
|
+
|
|
92
|
+
Total: N agents | N files | N KB
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Phase 3: Display Recent Entries
|
|
98
|
+
|
|
99
|
+
For each agent in `AGENT_DIRS`, show the 5 most recently modified files.
|
|
100
|
+
|
|
101
|
+
Print per agent:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
### <agent-name>
|
|
105
|
+
|
|
106
|
+
Recent entries (5 most recent):
|
|
107
|
+
|
|
108
|
+
| File | Size | Last Modified |
|
|
109
|
+
|------|------|---------------|
|
|
110
|
+
| common-fixes.md | 2.1 KB | 2026-03-18 |
|
|
111
|
+
| ... | ... | ... |
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
If the agent directory has fewer than 5 files, show all of them.
|
|
115
|
+
|
|
116
|
+
If `AGENT_FILTER` is set (single-agent mode), show the full content of each file up to 50 lines. For files exceeding 50 lines, print the first 50 lines followed by:
|
|
117
|
+
```
|
|
118
|
+
... (N more lines — view full file at <relative-path>)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Phase 4: Orphan Detection
|
|
124
|
+
|
|
125
|
+
An **orphaned** memory directory is one whose agent name does not correspond to a known sr-agent persona.
|
|
126
|
+
|
|
127
|
+
Known sr-agent names (check for exact match):
|
|
128
|
+
`sr-architect`, `sr-developer`, `sr-test-writer`, `sr-reviewer`, `sr-frontend-reviewer`, `sr-backend-reviewer`, `sr-security-reviewer`, `sr-doc-sync`, `sr-product-manager`
|
|
129
|
+
|
|
130
|
+
For each directory in `AGENT_DIRS`, check whether its `AGENT_NAME` is in the known list. Collect non-matching directories as `ORPHANED_DIRS`.
|
|
131
|
+
|
|
132
|
+
If `ORPHANED_DIRS` is non-empty, print:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
### Orphaned Memory Directories
|
|
136
|
+
|
|
137
|
+
The following directories do not match any known sr-agent name and may be leftover from renamed or removed agents:
|
|
138
|
+
|
|
139
|
+
| Directory | Files | Size | Recommendation |
|
|
140
|
+
|-----------|-------|------|----------------|
|
|
141
|
+
| sr-old-agent | N | N KB | Review and delete if no longer needed |
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
If `ORPHANED_DIRS` is empty: skip this section entirely.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Phase 5: Stale File Report
|
|
149
|
+
|
|
150
|
+
Collect all stale files across all agents (from Phase 2 `STALE_FILES` lists).
|
|
151
|
+
|
|
152
|
+
If no stale files exist:
|
|
153
|
+
```
|
|
154
|
+
No stale files found (threshold: STALE_DAYS days). Memory is up to date.
|
|
155
|
+
```
|
|
156
|
+
Skip the rest of Phase 5.
|
|
157
|
+
|
|
158
|
+
Otherwise, print:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
### Stale Files (not modified in >STALE_DAYS days)
|
|
162
|
+
|
|
163
|
+
| Agent | File | Size | Last Modified | Age (days) |
|
|
164
|
+
|-------|------|------|---------------|------------|
|
|
165
|
+
| sr-developer | common-fixes.md | 1.2 KB | 2026-01-10 | 69 |
|
|
166
|
+
| ... | ... | ... | ... | ... |
|
|
167
|
+
|
|
168
|
+
N stale files total (N KB).
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Phase 6: Prune (if --prune)
|
|
174
|
+
|
|
175
|
+
Skip this phase if `PRUNE_MODE=false`.
|
|
176
|
+
|
|
177
|
+
If `PRUNE_MODE=true` and there are no stale files and no orphaned directories:
|
|
178
|
+
```
|
|
179
|
+
Nothing to prune. All memory files are within the STALE_DAYS-day threshold.
|
|
180
|
+
```
|
|
181
|
+
Then stop.
|
|
182
|
+
|
|
183
|
+
Otherwise, print the full list of files and directories that will be deleted:
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
## Files to Delete
|
|
187
|
+
|
|
188
|
+
The following N files will be permanently deleted:
|
|
189
|
+
|
|
190
|
+
Stale files:
|
|
191
|
+
- .claude/agent-memory/sr-developer/common-fixes.md (69 days old)
|
|
192
|
+
- ...
|
|
193
|
+
|
|
194
|
+
Orphaned directories:
|
|
195
|
+
- .claude/agent-memory/sr-old-agent/ (N files, N KB)
|
|
196
|
+
|
|
197
|
+
Proceed? [y/N]:
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Wait for user input.
|
|
201
|
+
|
|
202
|
+
- If the user enters `y` or `Y`:
|
|
203
|
+
- Delete each stale file individually.
|
|
204
|
+
- Delete each orphaned directory recursively.
|
|
205
|
+
- Print a confirmation for each deletion: `Deleted: <path>`
|
|
206
|
+
- Print a summary:
|
|
207
|
+
```
|
|
208
|
+
Pruned N files (N KB freed).
|
|
209
|
+
```
|
|
210
|
+
- If the user enters anything else (or presses Enter):
|
|
211
|
+
- Print: `Prune cancelled. No files were deleted.`
|
|
212
|
+
- Stop.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Phase 7: Recommendations
|
|
217
|
+
|
|
218
|
+
Print a final recommendations section based on findings:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
## Recommendations
|
|
222
|
+
|
|
223
|
+
<one or more of the following, based on findings>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Recommendation rules (print only applicable ones):**
|
|
227
|
+
|
|
228
|
+
1. **Prune stale data** — if `STALE_COUNT > 0` across any agent and `PRUNE_MODE=false`:
|
|
229
|
+
```
|
|
230
|
+
- N stale files detected. Run `/specrails:memory-inspect --prune` to remove them and free N KB.
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
2. **Investigate large memory** — if any single agent's `TOTAL_SIZE > 1 MB`:
|
|
234
|
+
```
|
|
235
|
+
- <agent-name> memory exceeds 1 MB (TOTAL_SIZE). Consider reviewing large files:
|
|
236
|
+
<list files over 100 KB>
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
3. **Orphaned directories** — if `ORPHANED_DIRS` is non-empty:
|
|
240
|
+
```
|
|
241
|
+
- N orphaned director(y|ies) found. Review and delete manually if no longer needed.
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
4. **Empty memory directories** — if any agent directory has `FILE_COUNT = 0`:
|
|
245
|
+
```
|
|
246
|
+
- <agent-name> memory directory is empty. It may be safe to delete:
|
|
247
|
+
rm -rf .claude/agent-memory/<agent-name>/
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
5. **Gitignore advisory** — check whether `.claude/agent-memory` appears in `.gitignore`. If not:
|
|
251
|
+
```
|
|
252
|
+
- Agent memory is local runtime state. Add to .gitignore:
|
|
253
|
+
echo '.claude/agent-memory/' >> .gitignore
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
If no recommendations apply, print:
|
|
257
|
+
```
|
|
258
|
+
All agent memory looks healthy. No action required.
|
|
259
|
+
```
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "OpenSpec Change Diff Visualizer"
|
|
3
|
+
description: "Show a before/after diff of OpenSpec spec changes for a given change. Highlights additions, removals, and behavioral modifications across acceptance criteria, flows, and constraints. Supports markdown and JSON output."
|
|
4
|
+
category: Workflow
|
|
5
|
+
tags: [openspec, diff, specs, visualization, changes]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Visualize spec changes for **specrails-desktop**: compare the current specs against a named OpenSpec change to show exactly what behavioral requirements are being added, modified, or removed.
|
|
9
|
+
|
|
10
|
+
**Input:** $ARGUMENTS — accepts:
|
|
11
|
+
- `<change-name>` — the kebab-case name of the change to diff (required). If omitted, interactive selection is offered.
|
|
12
|
+
- `--format json` — emit structured JSON instead of markdown (default: markdown).
|
|
13
|
+
- `--summary-only` — skip inline line-level diff; show only the file-level and behavioral summary.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Phase 0: Argument Parsing
|
|
18
|
+
|
|
19
|
+
Parse `$ARGUMENTS` to set runtime variables.
|
|
20
|
+
|
|
21
|
+
**Variables to set:**
|
|
22
|
+
|
|
23
|
+
- `CHANGE_NAME` — string. Required. If not provided, prompt the user.
|
|
24
|
+
- `FORMAT` — `"markdown"` or `"json"`. Default: `"markdown"`.
|
|
25
|
+
- `SUMMARY_ONLY` — boolean. Default: `false`.
|
|
26
|
+
|
|
27
|
+
**Parsing rules:**
|
|
28
|
+
|
|
29
|
+
1. Scan `$ARGUMENTS` for `--format <value>`. If found and value is `json`, set `FORMAT="json"`. Any other value: print `Error: unknown format "<value>". Valid: markdown, json` and stop. Strip from arguments.
|
|
30
|
+
2. Scan for `--summary-only`. If found, set `SUMMARY_ONLY=true`. Strip from arguments.
|
|
31
|
+
3. Treat the remaining token (if any) as `CHANGE_NAME`. Strip leading/trailing whitespace.
|
|
32
|
+
4. If `CHANGE_NAME` is empty after parsing:
|
|
33
|
+
- Run:
|
|
34
|
+
```bash
|
|
35
|
+
openspec list --json
|
|
36
|
+
```
|
|
37
|
+
- If the result shows available changes, use the **AskUserQuestion tool** (open-ended, show the list) to ask which change to diff.
|
|
38
|
+
- If no changes exist, print:
|
|
39
|
+
```
|
|
40
|
+
Error: no active changes found. Run /opsx:new or /opsx:ff to create one first.
|
|
41
|
+
```
|
|
42
|
+
Stop.
|
|
43
|
+
|
|
44
|
+
**Print active configuration:**
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Diffing change: <CHANGE_NAME>
|
|
48
|
+
Format: <markdown|json>
|
|
49
|
+
Summary only: <yes|no>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Phase 1: Locate the Change
|
|
55
|
+
|
|
56
|
+
Find the change directory and enumerate its spec artifacts.
|
|
57
|
+
|
|
58
|
+
### Step 1a: Resolve the change path
|
|
59
|
+
|
|
60
|
+
Check these locations in order:
|
|
61
|
+
|
|
62
|
+
1. `openspec/changes/<CHANGE_NAME>/` — active change.
|
|
63
|
+
2. `openspec/changes/archive/` — glob for directories matching `*<CHANGE_NAME>` or exact `<CHANGE_NAME>`. Take the most recent match (latest date prefix).
|
|
64
|
+
|
|
65
|
+
If neither location yields a directory, print:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Error: change "<CHANGE_NAME>" not found.
|
|
69
|
+
Searched:
|
|
70
|
+
- openspec/changes/<CHANGE_NAME>/
|
|
71
|
+
- openspec/changes/archive/*<CHANGE_NAME>*/
|
|
72
|
+
|
|
73
|
+
Run `openspec list` to see available changes.
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Stop.
|
|
77
|
+
|
|
78
|
+
Set `CHANGE_DIR` to the resolved path.
|
|
79
|
+
|
|
80
|
+
**Print:** `Found change at: <CHANGE_DIR>`
|
|
81
|
+
|
|
82
|
+
### Step 1b: Enumerate spec artifacts in the change
|
|
83
|
+
|
|
84
|
+
Collect spec content from the change directory using this priority:
|
|
85
|
+
|
|
86
|
+
1. **Delta-spec file** — `<CHANGE_DIR>/delta-spec.md`. If present, read it. Set `HAS_DELTA_SPEC=true`.
|
|
87
|
+
2. **Inline specs subdirectory** — `<CHANGE_DIR>/specs/`. If present, glob `**/*.md` within it. Each file is an individual spec. Set `HAS_SPEC_DIR=true`.
|
|
88
|
+
3. **Proposal file** — `<CHANGE_DIR>/proposal.md`. Always read if present. Used for context but not as a primary diff source. Set `HAS_PROPOSAL=true`.
|
|
89
|
+
|
|
90
|
+
At least one of `HAS_DELTA_SPEC` or `HAS_SPEC_DIR` must be true to proceed.
|
|
91
|
+
|
|
92
|
+
If neither exists:
|
|
93
|
+
```
|
|
94
|
+
Warning: no spec artifacts found in <CHANGE_DIR>.
|
|
95
|
+
Expected: delta-spec.md or specs/*.md
|
|
96
|
+
|
|
97
|
+
The change may not have reached the spec authoring phase yet.
|
|
98
|
+
Run /opsx:continue to create specs first.
|
|
99
|
+
```
|
|
100
|
+
Stop.
|
|
101
|
+
|
|
102
|
+
Store the collected spec content:
|
|
103
|
+
- `DELTA_SPEC` — string content of delta-spec.md (or `""` if absent).
|
|
104
|
+
- `CHANGE_SPECS` — array of `{ path, content }` objects from the specs/ subdirectory (or `[]` if absent).
|
|
105
|
+
- `PROPOSAL` — string content of proposal.md (or `""` if absent).
|
|
106
|
+
|
|
107
|
+
**Print:** `Spec artifacts: <delta-spec.md present|absent>, <N spec files in specs/>, proposal <present|absent>`
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Phase 2: Load Baseline Specs
|
|
112
|
+
|
|
113
|
+
Find the current baseline specs to compare against.
|
|
114
|
+
|
|
115
|
+
### Step 2a: Discover baseline spec files
|
|
116
|
+
|
|
117
|
+
Glob for markdown files in `openspec/specs/` (recursively: `openspec/specs/**/*.md`).
|
|
118
|
+
|
|
119
|
+
Store as `BASELINE_SPECS` — array of `{ path, content }` objects.
|
|
120
|
+
|
|
121
|
+
If `openspec/specs/` does not exist or contains no files:
|
|
122
|
+
```
|
|
123
|
+
Note: no baseline specs found in openspec/specs/.
|
|
124
|
+
Diff will show all change specs as net-new additions (no removals or modifications).
|
|
125
|
+
```
|
|
126
|
+
Set `BASELINE_SPECS=[]`.
|
|
127
|
+
|
|
128
|
+
**Print:** `Baseline: <N> spec file(s) found in openspec/specs/`
|
|
129
|
+
|
|
130
|
+
### Step 2b: Match change specs to baseline specs
|
|
131
|
+
|
|
132
|
+
For each entry in `CHANGE_SPECS` (from the change's specs/ subdirectory), attempt to find its counterpart in `BASELINE_SPECS`.
|
|
133
|
+
|
|
134
|
+
**Matching rule:** A change spec at `<CHANGE_DIR>/specs/<spec-name>/spec.md` matches a baseline spec at `openspec/specs/<spec-name>/spec.md` or `openspec/specs/<spec-name>.md`. Match on the spec name segment only.
|
|
135
|
+
|
|
136
|
+
Build `SPEC_PAIRS` — array of:
|
|
137
|
+
```
|
|
138
|
+
{
|
|
139
|
+
specName: string,
|
|
140
|
+
changePath: string | null, // path in change (null if baseline-only)
|
|
141
|
+
baselinePath: string | null, // path in baseline (null if change-only)
|
|
142
|
+
changeContent: string | null,
|
|
143
|
+
baselineContent: string | null,
|
|
144
|
+
matchType: "new" | "modified" | "deleted" | "unchanged"
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Match type rules:**
|
|
149
|
+
- `changePath` present, `baselinePath` absent → `"new"`.
|
|
150
|
+
- `changePath` absent, `baselinePath` present (and baseline spec is referenced/affected by delta-spec) → `"deleted"`.
|
|
151
|
+
- Both present and content differs → `"modified"`.
|
|
152
|
+
- Both present and content identical → `"unchanged"`.
|
|
153
|
+
|
|
154
|
+
For the delta-spec flow (when `HAS_DELTA_SPEC=true` and `HAS_SPEC_DIR=false`):
|
|
155
|
+
- The delta-spec itself is the primary artifact. There is no per-file pairing.
|
|
156
|
+
- Set `SPEC_PAIRS=[]` and use the delta-spec content directly in Phase 3.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Phase 3: Compute the Diff
|
|
161
|
+
|
|
162
|
+
Produce a structured diff comparing baseline vs. change specs.
|
|
163
|
+
|
|
164
|
+
### Step 3a: Delta-spec analysis (when HAS_DELTA_SPEC=true)
|
|
165
|
+
|
|
166
|
+
Parse the delta-spec sections to extract behavioral elements:
|
|
167
|
+
|
|
168
|
+
**Acceptance criteria / SHALL statements:**
|
|
169
|
+
- Glob for lines matching the pattern: `^\*\*\d+\.\d+\*\*` (numbered normative statements like `**1.1**`).
|
|
170
|
+
- Collect all `{ id, text }` pairs into `DELTA_STATEMENTS`.
|
|
171
|
+
|
|
172
|
+
**Surface impact table:**
|
|
173
|
+
- Find the `## Surface Impact` section (or `### Surface Impact of This Change`).
|
|
174
|
+
- Parse all table rows into `SURFACE_CHANGES`: `[ { category, element, change, severity } ]`.
|
|
175
|
+
|
|
176
|
+
**REST/API contract changes:**
|
|
177
|
+
- Find any section with "REST API", "API Contract", or "Endpoints" in the heading.
|
|
178
|
+
- Extract endpoint definitions: method + path + response shape changes.
|
|
179
|
+
- Store as `API_CHANGES`.
|
|
180
|
+
|
|
181
|
+
**Since there is no true baseline for a delta-spec** (it defines net-new behavior), classify every `DELTA_STATEMENTS` entry as a `"new"` addition. If the "Surface Impact" table includes rows with change type "Removal" or "BREAKING", classify those as `"modified"` or `"deleted"` accordingly.
|
|
182
|
+
|
|
183
|
+
Build `DIFF_RESULT`:
|
|
184
|
+
```
|
|
185
|
+
{
|
|
186
|
+
addedStatements: [{ id, text }],
|
|
187
|
+
modifiedStatements: [{ id, text, changeDescription }],
|
|
188
|
+
removedStatements: [{ id, text }],
|
|
189
|
+
surfaceChanges: [{ category, element, change, severity }],
|
|
190
|
+
apiChanges: [{ method, path, description }],
|
|
191
|
+
specPairs: []
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Step 3b: Spec-file-pair analysis (when HAS_SPEC_DIR=true)
|
|
196
|
+
|
|
197
|
+
For each `SPEC_PAIR` in `SPEC_PAIRS` where `matchType !== "unchanged"`:
|
|
198
|
+
|
|
199
|
+
**Line-level diff:**
|
|
200
|
+
|
|
201
|
+
Compare `baselineContent` and `changeContent` line by line:
|
|
202
|
+
|
|
203
|
+
1. Split each content string into lines.
|
|
204
|
+
2. Identify added lines (present in change, absent in baseline) and removed lines (present in baseline, absent in change).
|
|
205
|
+
3. For each changed block, compute a ±3-line context window.
|
|
206
|
+
4. Mark heading lines (starting with `#`) separately — heading changes indicate structural reorganization.
|
|
207
|
+
5. Mark lines containing normative language (`SHALL`, `MUST`, `SHOULD`, `MAY`, `SHALL NOT`, `MUST NOT`) as behavioral.
|
|
208
|
+
|
|
209
|
+
Produce `{ specName, matchType, addedLines, removedLines, behavioralChanges, headingChanges }`.
|
|
210
|
+
|
|
211
|
+
**Behavioral change classification:**
|
|
212
|
+
|
|
213
|
+
- Line added + contains `SHALL`/`MUST` → new requirement.
|
|
214
|
+
- Line removed + contains `SHALL`/`MUST` → removed requirement.
|
|
215
|
+
- Line modified (matched by proximity) + normative keyword → modified requirement.
|
|
216
|
+
- Other additions/removals → structural/non-normative.
|
|
217
|
+
|
|
218
|
+
Build `DIFF_RESULT` from all `SPEC_PAIRS`.
|
|
219
|
+
|
|
220
|
+
### Step 3c: Compute summary statistics
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
ADDED_COUNT = count(addedStatements) + count(added spec files)
|
|
224
|
+
MODIFIED_COUNT = count(modifiedStatements) + count(modified spec files)
|
|
225
|
+
REMOVED_COUNT = count(removedStatements) + count(deleted spec files)
|
|
226
|
+
TOTAL_CHANGES = ADDED_COUNT + MODIFIED_COUNT + REMOVED_COUNT
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Phase 4: Render Output
|
|
232
|
+
|
|
233
|
+
### If FORMAT = "json"
|
|
234
|
+
|
|
235
|
+
Emit a single JSON object:
|
|
236
|
+
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"schema_version": "1",
|
|
240
|
+
"project": "specrails-desktop",
|
|
241
|
+
"change": "<CHANGE_NAME>",
|
|
242
|
+
"generated_at": "<ISO 8601 timestamp>",
|
|
243
|
+
"source": "<delta-spec | spec-files>",
|
|
244
|
+
"summary": {
|
|
245
|
+
"total_changes": <N>,
|
|
246
|
+
"added": <N>,
|
|
247
|
+
"modified": <N>,
|
|
248
|
+
"removed": <N>
|
|
249
|
+
},
|
|
250
|
+
"added_statements": [
|
|
251
|
+
{ "id": "1.1", "text": "..." }
|
|
252
|
+
],
|
|
253
|
+
"modified_statements": [
|
|
254
|
+
{ "id": "2.3", "text": "...", "change_description": "..." }
|
|
255
|
+
],
|
|
256
|
+
"removed_statements": [
|
|
257
|
+
{ "id": "3.1", "text": "..." }
|
|
258
|
+
],
|
|
259
|
+
"surface_changes": [
|
|
260
|
+
{ "category": "...", "element": "...", "change": "...", "severity": "..." }
|
|
261
|
+
],
|
|
262
|
+
"api_changes": [
|
|
263
|
+
{ "method": "POST", "path": "/api/spawn", "description": "..." }
|
|
264
|
+
],
|
|
265
|
+
"spec_pairs": [
|
|
266
|
+
{
|
|
267
|
+
"spec_name": "...",
|
|
268
|
+
"match_type": "new|modified|deleted",
|
|
269
|
+
"added_lines": ["..."],
|
|
270
|
+
"removed_lines": ["..."],
|
|
271
|
+
"behavioral_changes": ["..."],
|
|
272
|
+
"heading_changes": ["..."]
|
|
273
|
+
}
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
Stop after emitting JSON.
|
|
279
|
+
|
|
280
|
+
### If FORMAT = "markdown"
|
|
281
|
+
|
|
282
|
+
Render the full diff report:
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
## OpenSpec Change Diff — <CHANGE_NAME>
|
|
286
|
+
Project: specrails-desktop | Generated: <YYYY-MM-DD HH:MM>
|
|
287
|
+
|
|
288
|
+
### Summary
|
|
289
|
+
|
|
290
|
+
| Metric | Count |
|
|
291
|
+
|--------|-------|
|
|
292
|
+
| ➕ Added requirements | <N> |
|
|
293
|
+
| ✏️ Modified requirements | <N> |
|
|
294
|
+
| ➖ Removed requirements | <N> |
|
|
295
|
+
| **Total changes** | **<N>** |
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
**If TOTAL_CHANGES = 0:**
|
|
299
|
+
```
|
|
300
|
+
✅ No behavioral differences detected between the change specs and the baseline.
|
|
301
|
+
```
|
|
302
|
+
Stop.
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
Then render sections:
|
|
307
|
+
|
|
308
|
+
#### Added Requirements
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
### ➕ Added Requirements (<N>)
|
|
312
|
+
|
|
313
|
+
<for each added statement:>
|
|
314
|
+
> **<id>** <text>
|
|
315
|
+
|
|
316
|
+
<if none:>
|
|
317
|
+
_No new requirements._
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### Modified Requirements
|
|
321
|
+
|
|
322
|
+
```
|
|
323
|
+
### ✏️ Modified Requirements (<N>)
|
|
324
|
+
|
|
325
|
+
<for each modified statement or spec pair with matchType="modified":>
|
|
326
|
+
#### <spec-name or section heading>
|
|
327
|
+
|
|
328
|
+
\`\`\`diff
|
|
329
|
+
- <removed line>
|
|
330
|
+
+ <added line>
|
|
331
|
+
\`\`\`
|
|
332
|
+
|
|
333
|
+
**Change:** <change_description or inferred summary>
|
|
334
|
+
|
|
335
|
+
<if SUMMARY_ONLY=true: skip inline diff blocks, show only change description>
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
#### Removed Requirements
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
### ➖ Removed Requirements (<N>)
|
|
342
|
+
|
|
343
|
+
<for each removed statement:>
|
|
344
|
+
> ~~**<id>** <text>~~
|
|
345
|
+
|
|
346
|
+
<if none:>
|
|
347
|
+
_No requirements removed._
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
#### Surface Impact (when HAS_DELTA_SPEC=true and SURFACE_CHANGES is non-empty)
|
|
351
|
+
|
|
352
|
+
```
|
|
353
|
+
### 🗺️ Surface Impact
|
|
354
|
+
|
|
355
|
+
| # | Category | Element | Change | Severity |
|
|
356
|
+
|---|----------|---------|--------|----------|
|
|
357
|
+
<rows from SURFACE_CHANGES>
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
#### API Contract Changes (when API_CHANGES is non-empty)
|
|
361
|
+
|
|
362
|
+
```
|
|
363
|
+
### 🔌 API Contract Changes
|
|
364
|
+
|
|
365
|
+
<for each API_CHANGES entry:>
|
|
366
|
+
- **<METHOD> <path>** — <description>
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
#### New Spec Files (when added spec files exist)
|
|
370
|
+
|
|
371
|
+
```
|
|
372
|
+
### 📄 New Spec Files
|
|
373
|
+
|
|
374
|
+
<for each specPair where matchType="new":>
|
|
375
|
+
- `<changePath>` — new spec, no baseline counterpart
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
#### Deleted Spec Files (when deleted spec files exist)
|
|
379
|
+
|
|
380
|
+
```
|
|
381
|
+
### 🗑️ Deleted Spec Files
|
|
382
|
+
|
|
383
|
+
<for each specPair where matchType="deleted":>
|
|
384
|
+
- `<baselinePath>` — removed by this change
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
Close the report:
|
|
390
|
+
|
|
391
|
+
```
|
|
392
|
+
---
|
|
393
|
+
_Generated by `/specrails:opsx-diff` in specrails-desktop_
|
|
394
|
+
_Change source: <CHANGE_DIR>_
|
|
395
|
+
|
|
396
|
+
**Next steps:**
|
|
397
|
+
- Run `/opsx:apply <CHANGE_NAME>` to implement these changes.
|
|
398
|
+
- Run `/opsx:archive <CHANGE_NAME>` after implementation to merge specs into baseline.
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Phase 5: Save Snapshot (optional)
|
|
404
|
+
|
|
405
|
+
After rendering, write a diff snapshot to `.claude/opsx-diff-history/`:
|
|
406
|
+
|
|
407
|
+
1. Filename: `<CHANGE_NAME>-<YYYY-MM-DD>.json`
|
|
408
|
+
2. Directory: `.claude/opsx-diff-history/` (create if absent, idempotent).
|
|
409
|
+
3. Content: the JSON object from Phase 4 (regardless of FORMAT setting).
|
|
410
|
+
|
|
411
|
+
Print: `Snapshot saved: .claude/opsx-diff-history/<CHANGE_NAME>-<YYYY-MM-DD>.json`
|
|
412
|
+
|
|
413
|
+
If the write fails: print `Warning: could not write diff snapshot. Continuing.` Do not abort.
|
|
414
|
+
|
|
415
|
+
**Housekeeping:** If `.claude/opsx-diff-history/` has more than 50 `.json` files, print:
|
|
416
|
+
```
|
|
417
|
+
Note: .claude/opsx-diff-history/ has <N> snapshots. Prune old ones with:
|
|
418
|
+
ls -t .claude/opsx-diff-history/ | tail -n +51 | xargs -I{} rm .claude/opsx-diff-history/{}
|
|
419
|
+
```
|