specrails-desktop 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/.claude/commands/specrails/batch-implement.md +287 -0
  2. package/.claude/commands/specrails/compat-check.md +271 -0
  3. package/.claude/commands/specrails/doctor.md +62 -0
  4. package/.claude/commands/specrails/enrich.md +1635 -0
  5. package/.claude/commands/specrails/explore-spec.md +173 -0
  6. package/.claude/commands/specrails/health-check.md +527 -0
  7. package/.claude/commands/specrails/implement.md +1457 -0
  8. package/.claude/commands/specrails/memory-inspect.md +259 -0
  9. package/.claude/commands/specrails/opsx-diff.md +419 -0
  10. package/.claude/commands/specrails/propose-spec.md +102 -0
  11. package/.claude/commands/specrails/reconfig.md +89 -0
  12. package/.claude/commands/specrails/refactor-recommender.md +212 -0
  13. package/.claude/commands/specrails/retry.md +363 -0
  14. package/.claude/commands/specrails/telemetry.md +552 -0
  15. package/.claude/commands/specrails/why.md +96 -0
  16. package/LICENSE +21 -0
  17. package/README.md +290 -0
  18. package/cli/dist/specrails-desktop.js +1098 -0
  19. package/client/dist/assets/ActivityFeedPage-Gy4x8dBt.js +1 -0
  20. package/client/dist/assets/AgentsPage-CPgu--Fb.js +86 -0
  21. package/client/dist/assets/AnalyticsPage-B5sJEee2.js +1 -0
  22. package/client/dist/assets/BarChart-7IMQ8HY1.js +33 -0
  23. package/client/dist/assets/CodePage-CBdFvbwe.js +2 -0
  24. package/client/dist/assets/DesktopAnalyticsPage-w0rdTq4w.js +1 -0
  25. package/client/dist/assets/DocsDialog-BZUYM7wm.js +11 -0
  26. package/client/dist/assets/DocsPage-9QglWl46.js +11 -0
  27. package/client/dist/assets/ExportDropdown-BLZFXtNi.js +1 -0
  28. package/client/dist/assets/IntegrationsPage-BxBE4y99.js +3 -0
  29. package/client/dist/assets/JobDetailPage-DydWx_5S.js +16 -0
  30. package/client/dist/assets/JobsPage-20ibw0IO.js +1 -0
  31. package/client/dist/assets/abap-Bw6f2wDG.js +1 -0
  32. package/client/dist/assets/activity-BEIp_Y1A.js +1 -0
  33. package/client/dist/assets/activity-BdrPln96.js +1 -0
  34. package/client/dist/assets/activity-CpkRS8Sx.js +1 -0
  35. package/client/dist/assets/activity-DKCpESPt.js +1 -0
  36. package/client/dist/assets/activity-DOUVEjJi.js +1 -0
  37. package/client/dist/assets/activity-DRwkql_y.js +1 -0
  38. package/client/dist/assets/activity-DcDQ7tjw.js +1 -0
  39. package/client/dist/assets/activity-Dv6H7wEr.js +1 -0
  40. package/client/dist/assets/addon-image-3WCl5Vhd.js +1 -0
  41. package/client/dist/assets/addon-ligatures-C5OdliKs.js +2 -0
  42. package/client/dist/assets/addon-webgl-BbX6pSjl.js +44 -0
  43. package/client/dist/assets/addspec-B5yl4Loj.js +1 -0
  44. package/client/dist/assets/addspec-BEeF5-zc.js +1 -0
  45. package/client/dist/assets/addspec-D33ocMxf.js +1 -0
  46. package/client/dist/assets/addspec-DFswZ0jK.js +1 -0
  47. package/client/dist/assets/addspec-DRE-jZv7.js +1 -0
  48. package/client/dist/assets/addspec-DVZ15Jp8.js +1 -0
  49. package/client/dist/assets/addspec-Fkv91Opc.js +1 -0
  50. package/client/dist/assets/addspec-GWm4ffKl.js +1 -0
  51. package/client/dist/assets/agents-1nCDWRmP.js +1 -0
  52. package/client/dist/assets/agents-Bm9rPqnt.js +1 -0
  53. package/client/dist/assets/agents-CMxtJMLD.js +1 -0
  54. package/client/dist/assets/agents-DK-Dlc0i.js +1 -0
  55. package/client/dist/assets/agents-Q6Ldfpxx.js +1 -0
  56. package/client/dist/assets/agents-TeOSy-ax.js +1 -0
  57. package/client/dist/assets/agents-iTqjRajS.js +1 -0
  58. package/client/dist/assets/agents-s87sMGzL.js +1 -0
  59. package/client/dist/assets/agentstudio-B6Wb59E7.js +1 -0
  60. package/client/dist/assets/agentstudio-BADhZ41e.js +1 -0
  61. package/client/dist/assets/agentstudio-BSnWLR63.js +1 -0
  62. package/client/dist/assets/agentstudio-BdidyBzZ.js +1 -0
  63. package/client/dist/assets/agentstudio-CxlUllqI.js +1 -0
  64. package/client/dist/assets/agentstudio-D3I62TLJ.js +1 -0
  65. package/client/dist/assets/agentstudio-DuH9TogZ.js +1 -0
  66. package/client/dist/assets/agentstudio-Kw88_dUF.js +1 -0
  67. package/client/dist/assets/aiedit-BWxHGsYA.js +1 -0
  68. package/client/dist/assets/aiedit-D2ji6Qy0.js +1 -0
  69. package/client/dist/assets/aiedit-DAhZTvtk.js +1 -0
  70. package/client/dist/assets/aiedit-DJMny-D5.js +1 -0
  71. package/client/dist/assets/aiedit-DOcxERkU.js +1 -0
  72. package/client/dist/assets/aiedit-DvrcbwGv.js +1 -0
  73. package/client/dist/assets/aiedit-TTwzL1TS.js +1 -0
  74. package/client/dist/assets/aiedit-WBSjT_C1.js +1 -0
  75. package/client/dist/assets/analytics-BIdr0YfL.js +1 -0
  76. package/client/dist/assets/analytics-C6EzgtdE.js +1 -0
  77. package/client/dist/assets/analytics-C9Zc-rkM.js +1 -0
  78. package/client/dist/assets/analytics-CVx3YOc0.js +1 -0
  79. package/client/dist/assets/analytics-CYj0tfj7.js +1 -0
  80. package/client/dist/assets/analytics-CnY4kNG3.js +1 -0
  81. package/client/dist/assets/analytics-CrPCZRJ-.js +1 -0
  82. package/client/dist/assets/analytics-DMCto-TF.js +1 -0
  83. package/client/dist/assets/apex-Cw8_REBo.js +1 -0
  84. package/client/dist/assets/atom-one-dark-B-oHczHB.css +1 -0
  85. package/client/dist/assets/attachments-BIsSSnHJ.js +1 -0
  86. package/client/dist/assets/attachments-BW4L3l2L.js +1 -0
  87. package/client/dist/assets/attachments-Bcf6BG6V.js +1 -0
  88. package/client/dist/assets/attachments-Bke8sCU4.js +1 -0
  89. package/client/dist/assets/attachments-COcrGRFz.js +1 -0
  90. package/client/dist/assets/attachments-DYHGA2Dj.js +1 -0
  91. package/client/dist/assets/attachments-Dd92KpUH.js +1 -0
  92. package/client/dist/assets/attachments-DzdU6DV6.js +1 -0
  93. package/client/dist/assets/azcli-Cz6HAoOw.js +1 -0
  94. package/client/dist/assets/bat-CcJ-xyqL.js +1 -0
  95. package/client/dist/assets/bicep-z1WDCKYz.js +2 -0
  96. package/client/dist/assets/browser-5ErDlJoR.js +1 -0
  97. package/client/dist/assets/browser-Bc-YdlVg.js +1 -0
  98. package/client/dist/assets/browser-BlYF4OOq.js +1 -0
  99. package/client/dist/assets/browser-CT-ReZGt.js +1 -0
  100. package/client/dist/assets/browser-DGITz3fC.js +1 -0
  101. package/client/dist/assets/browser-JsAIGCEW.js +1 -0
  102. package/client/dist/assets/browser-M5-rbPlw.js +1 -0
  103. package/client/dist/assets/browser-Qya9cARy.js +1 -0
  104. package/client/dist/assets/cameligo-BRewOpfa.js +1 -0
  105. package/client/dist/assets/chat-BEGuC03z.js +1 -0
  106. package/client/dist/assets/chat-BEW60P_u.js +1 -0
  107. package/client/dist/assets/chat-BQNMD0PL.js +1 -0
  108. package/client/dist/assets/chat-BsbNGPW9.js +1 -0
  109. package/client/dist/assets/chat-CboQguCi.js +1 -0
  110. package/client/dist/assets/chat-DRCa9pOt.js +1 -0
  111. package/client/dist/assets/chat-DwUm6W9z.js +1 -0
  112. package/client/dist/assets/chat-yoXwguQu.js +1 -0
  113. package/client/dist/assets/chunk-CilyBKbf.js +1 -0
  114. package/client/dist/assets/clojure-DBjRWN6g.js +1 -0
  115. package/client/dist/assets/clsx-DnqN-uhr.js +1 -0
  116. package/client/dist/assets/code-AL1rVIMb.js +1 -0
  117. package/client/dist/assets/code-C0BKpkht.js +1 -0
  118. package/client/dist/assets/code-C0FTS3ew.js +1 -0
  119. package/client/dist/assets/code-CPcHxzxw.js +1 -0
  120. package/client/dist/assets/code-D3ryDniw.js +1 -0
  121. package/client/dist/assets/code-D3zVVQTj.js +1 -0
  122. package/client/dist/assets/code-PCmfS3dn.js +1 -0
  123. package/client/dist/assets/code-exI0G5Wd.js +1 -0
  124. package/client/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  125. package/client/dist/assets/coffee-Cfk_XHGR.js +1 -0
  126. package/client/dist/assets/commands-B772IyDa.js +1 -0
  127. package/client/dist/assets/commands-BDDp6xFG.js +1 -0
  128. package/client/dist/assets/commands-CJxCry-o.js +1 -0
  129. package/client/dist/assets/commands-CfgY-_of.js +1 -0
  130. package/client/dist/assets/commands-DLrvnPNg.js +1 -0
  131. package/client/dist/assets/commands-IXMOKBYt.js +1 -0
  132. package/client/dist/assets/commands-UD1NzmwX.js +1 -0
  133. package/client/dist/assets/commands-sqrqsxyE.js +1 -0
  134. package/client/dist/assets/common-DCr6VzJ7.js +1 -0
  135. package/client/dist/assets/common-Dard9UNH.js +1 -0
  136. package/client/dist/assets/common-DeDELLZJ.js +1 -0
  137. package/client/dist/assets/common-DltqHaAe.js +1 -0
  138. package/client/dist/assets/common-Dmm1GhdD.js +1 -0
  139. package/client/dist/assets/common-DnjcgkPH.js +1 -0
  140. package/client/dist/assets/common-GbpxfPG8.js +1 -0
  141. package/client/dist/assets/common-wA36jmj1.js +1 -0
  142. package/client/dist/assets/cpp-BVob6BaP.js +1 -0
  143. package/client/dist/assets/csharp-C4fbRuOu.js +1 -0
  144. package/client/dist/assets/csp-DthFP_vT.js +1 -0
  145. package/client/dist/assets/css-CGMH0hcW.js +3 -0
  146. package/client/dist/assets/css.worker-Wv5dxAWO.js +89 -0
  147. package/client/dist/assets/cssMode-Cc6ozl-J.js +1 -0
  148. package/client/dist/assets/cypher-Pnf68BRV.js +1 -0
  149. package/client/dist/assets/dart-PMMOtxZX.js +1 -0
  150. package/client/dist/assets/dashboard-B4ixDVk8.js +1 -0
  151. package/client/dist/assets/dashboard-BZBADHSj.js +1 -0
  152. package/client/dist/assets/dashboard-C1MfeUHs.js +1 -0
  153. package/client/dist/assets/dashboard-C7SK6xu5.js +1 -0
  154. package/client/dist/assets/dashboard-CB6Le1yN.js +1 -0
  155. package/client/dist/assets/dashboard-CoTpMOBM.js +1 -0
  156. package/client/dist/assets/dashboard-Duo4DDCW.js +1 -0
  157. package/client/dist/assets/dashboard-I19DXBxw.js +1 -0
  158. package/client/dist/assets/dist-js-BY-Fv_fg.js +1 -0
  159. package/client/dist/assets/dist-js-Bakc4uxT.js +1 -0
  160. package/client/dist/assets/dockerfile-di1nsJCc.js +1 -0
  161. package/client/dist/assets/ecl-D_WVcB5M.js +1 -0
  162. package/client/dist/assets/editor-Br_kD0ds.css +1 -0
  163. package/client/dist/assets/editor.api2-XLGzZfbc.js +872 -0
  164. package/client/dist/assets/editor.main-CfXxHimg.js +6 -0
  165. package/client/dist/assets/editor.worker-Bd9IXS8d.js +26 -0
  166. package/client/dist/assets/elixir-OAdJEMOn.js +1 -0
  167. package/client/dist/assets/explore-4mFpnrKU.js +1 -0
  168. package/client/dist/assets/explore-A8Ltoblq.js +1 -0
  169. package/client/dist/assets/explore-B9A3iN2W.js +1 -0
  170. package/client/dist/assets/explore-BV5Xxlsn.js +1 -0
  171. package/client/dist/assets/explore-BrBJvfjP.js +1 -0
  172. package/client/dist/assets/explore-C3FSE42C.js +1 -0
  173. package/client/dist/assets/explore-D2EFgt8J.js +1 -0
  174. package/client/dist/assets/explore-hFc3HFcp.js +1 -0
  175. package/client/dist/assets/flow9-D3QEZjgn.js +1 -0
  176. package/client/dist/assets/format-command-CwGuwzGA.js +1 -0
  177. package/client/dist/assets/freemarker2-DP7J1gG3.js +3 -0
  178. package/client/dist/assets/fsharp-BF0k_8N8.js +1 -0
  179. package/client/dist/assets/go-BAQO5Jsz.js +1 -0
  180. package/client/dist/assets/graphql-hdFVFkiV.js +1 -0
  181. package/client/dist/assets/handlebars-BjRlucw6.js +1 -0
  182. package/client/dist/assets/hcl-DWnl1o-X.js +1 -0
  183. package/client/dist/assets/html-OumBQJ-U.js +1 -0
  184. package/client/dist/assets/html.worker-CQP8QQsS.js +502 -0
  185. package/client/dist/assets/htmlMode-CStc3zXM.js +1 -0
  186. package/client/dist/assets/index-CimDRRi7.css +2 -0
  187. package/client/dist/assets/index-XGZaKl_u.js +142 -0
  188. package/client/dist/assets/ini-CB-6OVu3.js +1 -0
  189. package/client/dist/assets/integrations-C3p12Ms6.js +1 -0
  190. package/client/dist/assets/integrations-Cr6hH7XR.js +1 -0
  191. package/client/dist/assets/integrations-Cublz3m6.js +1 -0
  192. package/client/dist/assets/integrations-D28q1kF6.js +1 -0
  193. package/client/dist/assets/integrations-DRdbki5W.js +1 -0
  194. package/client/dist/assets/integrations-DaC4SzzL.js +1 -0
  195. package/client/dist/assets/integrations-DmQYCUvN.js +1 -0
  196. package/client/dist/assets/integrations-HIlUxXVs.js +1 -0
  197. package/client/dist/assets/java-d1CmfiHX.js +1 -0
  198. package/client/dist/assets/javascript-CMk--e7g.js +1 -0
  199. package/client/dist/assets/jobs-BE1siB0M.js +1 -0
  200. package/client/dist/assets/jobs-BHcQ_Faf.js +1 -0
  201. package/client/dist/assets/jobs-CFfc2dNX.js +1 -0
  202. package/client/dist/assets/jobs-CSi5n8X_.js +1 -0
  203. package/client/dist/assets/jobs-Dc3X86PY.js +1 -0
  204. package/client/dist/assets/jobs-De5tASex.js +1 -0
  205. package/client/dist/assets/jobs-DsoXEdo7.js +1 -0
  206. package/client/dist/assets/jobs-Wl-ApPMb.js +1 -0
  207. package/client/dist/assets/json.worker-DzV-CpCQ.js +58 -0
  208. package/client/dist/assets/jsonMode-C2h3ZcjZ.js +7 -0
  209. package/client/dist/assets/julia-Bgv08lKa.js +1 -0
  210. package/client/dist/assets/kotlin-u98kaVTf.js +1 -0
  211. package/client/dist/assets/less-CjYwpgg5.js +2 -0
  212. package/client/dist/assets/lexon-YTjaAFBB.js +1 -0
  213. package/client/dist/assets/lib-CPxTMOAq.js +7 -0
  214. package/client/dist/assets/liquid-mI3KJrBE.js +1 -0
  215. package/client/dist/assets/lspLanguageFeatures-DU09ggWi.js +4 -0
  216. package/client/dist/assets/lua-BzmkWv27.js +1 -0
  217. package/client/dist/assets/m3-CFwk9fw0.js +1 -0
  218. package/client/dist/assets/markdown-CR5iMpSZ.js +1 -0
  219. package/client/dist/assets/mdx-C41VDTR_.js +1 -0
  220. package/client/dist/assets/mips-CcEalc17.js +1 -0
  221. package/client/dist/assets/monaco.contribution-CPObAXMC.js +2 -0
  222. package/client/dist/assets/msdax-BQbkawnr.js +1 -0
  223. package/client/dist/assets/mysql-GTlaaW_P.js +1 -0
  224. package/client/dist/assets/nav-0fwkrgHt.js +1 -0
  225. package/client/dist/assets/nav-BEL3MTwK.js +1 -0
  226. package/client/dist/assets/nav-B_G-TJDW.js +1 -0
  227. package/client/dist/assets/nav-C2YXcbZS.js +1 -0
  228. package/client/dist/assets/nav-ClzOE4mA.js +1 -0
  229. package/client/dist/assets/nav-CtYwmMgu.js +1 -0
  230. package/client/dist/assets/nav-D2bOGSEg.js +1 -0
  231. package/client/dist/assets/nav-iH1V5j6o.js +1 -0
  232. package/client/dist/assets/objective-c-Byu1T5if.js +1 -0
  233. package/client/dist/assets/pascal-BrfzBfRm.js +1 -0
  234. package/client/dist/assets/pascaligo-BXXKFUeo.js +1 -0
  235. package/client/dist/assets/perl-B3OikKq-.js +1 -0
  236. package/client/dist/assets/pgsql-CTsa0Acc.js +1 -0
  237. package/client/dist/assets/php-DiQh3FUW.js +1 -0
  238. package/client/dist/assets/pla-92uH8Fzm.js +1 -0
  239. package/client/dist/assets/postiats-BbeWkKUr.js +1 -0
  240. package/client/dist/assets/powerquery-DgDMzpsm.js +1 -0
  241. package/client/dist/assets/powershell-BfdUUzaG.js +1 -0
  242. package/client/dist/assets/preload-helper-DSXbuxSR.js +1 -0
  243. package/client/dist/assets/protobuf-BojW2ftW.js +2 -0
  244. package/client/dist/assets/pug-BxqTg3IU.js +1 -0
  245. package/client/dist/assets/python-Y27rKQtk.js +1 -0
  246. package/client/dist/assets/qsharp-BX_A-MW9.js +1 -0
  247. package/client/dist/assets/r-D9BMnxvJ.js +1 -0
  248. package/client/dist/assets/razor-Cd5-q9Bp.js +1 -0
  249. package/client/dist/assets/redis-5cJqEQJJ.js +1 -0
  250. package/client/dist/assets/redshift-d8BBqiwb.js +1 -0
  251. package/client/dist/assets/restructuredtext-C8a6yIcZ.js +1 -0
  252. package/client/dist/assets/ruby-egeh-6KX.js +1 -0
  253. package/client/dist/assets/rust-a3r9IInB.js +1 -0
  254. package/client/dist/assets/sb-y8iRIDei.js +1 -0
  255. package/client/dist/assets/scala-BPDK2AmK.js +1 -0
  256. package/client/dist/assets/scheme-BIWUEoOs.js +1 -0
  257. package/client/dist/assets/scss-CA-PSzwg.js +3 -0
  258. package/client/dist/assets/settings-55oDcbSh.js +1 -0
  259. package/client/dist/assets/settings-Bd4Tq1RB.js +1 -0
  260. package/client/dist/assets/settings-CCSM-Fhn.js +1 -0
  261. package/client/dist/assets/settings-D3e_bDoW.js +1 -0
  262. package/client/dist/assets/settings-DKbTkbn7.js +1 -0
  263. package/client/dist/assets/settings-Dxpo6_w7.js +1 -0
  264. package/client/dist/assets/settings-bt84e3Aa.js +1 -0
  265. package/client/dist/assets/settings-nu68QukM.js +1 -0
  266. package/client/dist/assets/setup-BMqwfbW9.js +1 -0
  267. package/client/dist/assets/setup-Bb5LcG28.js +1 -0
  268. package/client/dist/assets/setup-BeEx2_da.js +1 -0
  269. package/client/dist/assets/setup-CCCrB53Q.js +1 -0
  270. package/client/dist/assets/setup-CJA0ATmd.js +1 -0
  271. package/client/dist/assets/setup-CeiDbZcb.js +1 -0
  272. package/client/dist/assets/setup-Cus7TApA.js +1 -0
  273. package/client/dist/assets/setup-D9qOs2Xo.js +1 -0
  274. package/client/dist/assets/shell--LiT1Bja.js +1 -0
  275. package/client/dist/assets/solidity-DdqZccZg.js +1 -0
  276. package/client/dist/assets/sophia-S6-YxNG_.js +1 -0
  277. package/client/dist/assets/sparql-BSf5kMp2.js +1 -0
  278. package/client/dist/assets/specs-BFfu3u-a.js +1 -0
  279. package/client/dist/assets/specs-B__C8-8a.js +1 -0
  280. package/client/dist/assets/specs-CZ1PsXsC.js +1 -0
  281. package/client/dist/assets/specs-D2FzlLn9.js +1 -0
  282. package/client/dist/assets/specs-DaUTrNF9.js +1 -0
  283. package/client/dist/assets/specs-Dyc5hYeE.js +1 -0
  284. package/client/dist/assets/specs-cKEh2LXt.js +1 -0
  285. package/client/dist/assets/specs-k0PyLDVt.js +1 -0
  286. package/client/dist/assets/sql-D7KgjR8G.js +1 -0
  287. package/client/dist/assets/st-BnoDa-Ml.js +1 -0
  288. package/client/dist/assets/swift-DEUHTkUX.js +1 -0
  289. package/client/dist/assets/systemverilog-Tqb_KPnW.js +1 -0
  290. package/client/dist/assets/tcl-BmBFS2qq.js +1 -0
  291. package/client/dist/assets/terminal-80yDMgMF.js +1 -0
  292. package/client/dist/assets/terminal-Bje4ziIa.js +1 -0
  293. package/client/dist/assets/terminal-C2WYcFHF.js +1 -0
  294. package/client/dist/assets/terminal-CSONJOex.js +1 -0
  295. package/client/dist/assets/terminal-DEqzGtcr.js +1 -0
  296. package/client/dist/assets/terminal-DeWzh6ys.js +1 -0
  297. package/client/dist/assets/terminal-YOlsJCQj.js +1 -0
  298. package/client/dist/assets/terminal-lkZYR4wJ.js +1 -0
  299. package/client/dist/assets/tickets-CB7N30gm.js +1 -0
  300. package/client/dist/assets/tickets-CF2PYelu.js +1 -0
  301. package/client/dist/assets/tickets-DNOANUXr.js +1 -0
  302. package/client/dist/assets/tickets-DU1aqsbr.js +1 -0
  303. package/client/dist/assets/tickets-DYvafSaY.js +1 -0
  304. package/client/dist/assets/tickets-DlpC_iTg.js +1 -0
  305. package/client/dist/assets/tickets-DucYgtdl.js +1 -0
  306. package/client/dist/assets/tickets-clefmXLv.js +1 -0
  307. package/client/dist/assets/ts.worker-METxwbDZ.js +67719 -0
  308. package/client/dist/assets/tsMode-B0y_xEci.js +11 -0
  309. package/client/dist/assets/twig-BQV8igWC.js +1 -0
  310. package/client/dist/assets/typescript-BzK0OgwW.js +1 -0
  311. package/client/dist/assets/typespec-DlFroUGY.js +1 -0
  312. package/client/dist/assets/useProjectCache-DSaiGFjV.js +1 -0
  313. package/client/dist/assets/vb-BlrJpIMX.js +1 -0
  314. package/client/dist/assets/wgsl-BWgIc6FZ.js +298 -0
  315. package/client/dist/assets/workers-rt--R2Qy.js +1 -0
  316. package/client/dist/assets/xml-eX9QXAmI.js +1 -0
  317. package/client/dist/assets/yaml-fcsNkpOt.js +1 -0
  318. package/client/dist/index.html +246 -0
  319. package/docs/README.md +54 -0
  320. package/docs/cli.md +198 -0
  321. package/docs/codex.md +210 -0
  322. package/docs/creating-specs.md +197 -0
  323. package/docs/customizing.md +197 -0
  324. package/docs/getting-started.md +140 -0
  325. package/docs/internals/README.md +25 -0
  326. package/docs/internals/adding-a-provider.md +238 -0
  327. package/docs/internals/api-reference.md +634 -0
  328. package/docs/internals/architecture.md +332 -0
  329. package/docs/internals/configuration.md +172 -0
  330. package/docs/internals/openspec-workflow.md +282 -0
  331. package/docs/internals/operations-runbook.md +198 -0
  332. package/docs/internals/profiles.md +152 -0
  333. package/docs/platforms/macos.md +130 -0
  334. package/docs/platforms/windows.md +81 -0
  335. package/docs/running-pipelines.md +240 -0
  336. package/docs/terminal.md +138 -0
  337. package/docs/tracking-cost.md +155 -0
  338. package/package.json +82 -0
  339. package/server/dist/agent-generator.js +232 -0
  340. package/server/dist/agent-refine-db.js +124 -0
  341. package/server/dist/agent-refine-manager.js +526 -0
  342. package/server/dist/ai-invocations.js +111 -0
  343. package/server/dist/attachment-manager.js +299 -0
  344. package/server/dist/auth.js +207 -0
  345. package/server/dist/binary-probe.js +35 -0
  346. package/server/dist/browser-capture-manager.js +576 -0
  347. package/server/dist/browser-capture-types.js +28 -0
  348. package/server/dist/browser-network.js +149 -0
  349. package/server/dist/browser-playwright.js +888 -0
  350. package/server/dist/build-dirs.js +44 -0
  351. package/server/dist/changes-reader.js +120 -0
  352. package/server/dist/chat-manager.js +1060 -0
  353. package/server/dist/chromium-resolver.js +311 -0
  354. package/server/dist/code-explorer-router.js +788 -0
  355. package/server/dist/codex-otel-bridge.js +235 -0
  356. package/server/dist/command-resolver.js +102 -0
  357. package/server/dist/config.js +306 -0
  358. package/server/dist/context-budget.js +113 -0
  359. package/server/dist/context-scope.js +279 -0
  360. package/server/dist/contract-refine-runner.js +521 -0
  361. package/server/dist/core-compat.js +207 -0
  362. package/server/dist/core-package.js +14 -0
  363. package/server/dist/db.js +1034 -0
  364. package/server/dist/desktop-analytics.js +156 -0
  365. package/server/dist/desktop-db.js +456 -0
  366. package/server/dist/desktop-router.js +735 -0
  367. package/server/dist/docs-router.js +207 -0
  368. package/server/dist/explore-contract-refine.js +421 -0
  369. package/server/dist/explore-cwd-manager.js +242 -0
  370. package/server/dist/explore-draft-title.js +47 -0
  371. package/server/dist/explore-smash.js +450 -0
  372. package/server/dist/feature-flags.js +17 -0
  373. package/server/dist/file-provenance.js +382 -0
  374. package/server/dist/file-summary-generator.js +221 -0
  375. package/server/dist/file-summary-manager.js +689 -0
  376. package/server/dist/hooks.js +102 -0
  377. package/server/dist/ids.js +7 -0
  378. package/server/dist/index.js +586 -0
  379. package/server/dist/metrics.js +136 -0
  380. package/server/dist/mobile/index.js +16 -0
  381. package/server/dist/mobile/mobile-admin-router.js +84 -0
  382. package/server/dist/mobile/mobile-auth.js +67 -0
  383. package/server/dist/mobile/mobile-devices.js +80 -0
  384. package/server/dist/mobile/mobile-event-bus.js +39 -0
  385. package/server/dist/mobile/mobile-gateway.js +285 -0
  386. package/server/dist/mobile/mobile-mdns.js +81 -0
  387. package/server/dist/mobile/mobile-pairing.js +179 -0
  388. package/server/dist/mobile/mobile-redact.js +53 -0
  389. package/server/dist/mobile/mobile-router.js +411 -0
  390. package/server/dist/mobile/mobile-tls.js +86 -0
  391. package/server/dist/mobile/mobile-types.js +9 -0
  392. package/server/dist/mobile/mobile-ws.js +275 -0
  393. package/server/dist/path-resolver.js +298 -0
  394. package/server/dist/plugin-manager.js +617 -0
  395. package/server/dist/plugins/claude-approval.js +179 -0
  396. package/server/dist/plugins/claude-md-mutation.js +146 -0
  397. package/server/dist/plugins/codex-mcp.js +108 -0
  398. package/server/dist/plugins/contributors.js +72 -0
  399. package/server/dist/plugins/drift.js +58 -0
  400. package/server/dist/plugins/index.js +14 -0
  401. package/server/dist/plugins/json-mutation.js +120 -0
  402. package/server/dist/plugins/manager.js +32 -0
  403. package/server/dist/plugins/ownership.js +86 -0
  404. package/server/dist/plugins/paths.js +37 -0
  405. package/server/dist/plugins/prereq-installer.js +104 -0
  406. package/server/dist/plugins/rail-integration.js +79 -0
  407. package/server/dist/plugins/serena/index.js +13 -0
  408. package/server/dist/plugins/serena/install.js +91 -0
  409. package/server/dist/plugins/serena/instructions-content.js +21 -0
  410. package/server/dist/plugins/serena/manifest.js +111 -0
  411. package/server/dist/plugins/serena/verify.js +78 -0
  412. package/server/dist/plugins-router.js +215 -0
  413. package/server/dist/pricing.js +89 -0
  414. package/server/dist/profile-manager.js +310 -0
  415. package/server/dist/profiles-router.js +759 -0
  416. package/server/dist/project-registry.js +443 -0
  417. package/server/dist/project-router.js +4016 -0
  418. package/server/dist/proposal-manager.js +291 -0
  419. package/server/dist/provider-selection.js +69 -0
  420. package/server/dist/providers/claude-adapter.js +281 -0
  421. package/server/dist/providers/codex-adapter.js +264 -0
  422. package/server/dist/providers/index.js +23 -0
  423. package/server/dist/providers/registry.js +37 -0
  424. package/server/dist/providers/types.js +22 -0
  425. package/server/dist/queue-manager.js +1511 -0
  426. package/server/dist/rails-router.js +362 -0
  427. package/server/dist/rails-store.js +116 -0
  428. package/server/dist/result-event.js +106 -0
  429. package/server/dist/schemas/profile.v1.json +151 -0
  430. package/server/dist/setup-manager.js +1165 -0
  431. package/server/dist/setup-prerequisites.js +372 -0
  432. package/server/dist/smash-runner.js +663 -0
  433. package/server/dist/spec-draft-parser.js +133 -0
  434. package/server/dist/spec-launcher-manager.js +174 -0
  435. package/server/dist/spec-models.js +32 -0
  436. package/server/dist/specrails-tech-client.js +82 -0
  437. package/server/dist/spending.js +448 -0
  438. package/server/dist/telemetry-compactor.js +180 -0
  439. package/server/dist/telemetry-export.js +317 -0
  440. package/server/dist/telemetry-receiver.js +224 -0
  441. package/server/dist/terminal-manager.js +633 -0
  442. package/server/dist/terminal-marks-store.js +117 -0
  443. package/server/dist/terminal-osc-parser.js +159 -0
  444. package/server/dist/terminal-settings.js +282 -0
  445. package/server/dist/terminal-shell-integration.js +196 -0
  446. package/server/dist/ticket-broadcast.js +47 -0
  447. package/server/dist/ticket-store.js +397 -0
  448. package/server/dist/ticket-watcher.js +117 -0
  449. package/server/dist/types.js +10 -0
  450. package/server/dist/user-mcp-config.js +117 -0
  451. package/server/dist/util/cli-prompt.js +181 -0
  452. package/server/dist/util/secure-fs.js +50 -0
  453. package/server/dist/util/win-spawn.js +43 -0
  454. package/server/dist/webhook-manager.js +89 -0
  455. package/server/dist/ws-routing.js +47 -0
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // Context budget — coarse token estimates for the four Add Spec context scopes.
3
+ // Powers the live numeric line in the Cost Awareness meter.
4
+ //
5
+ // Estimates are bytes/4 (ASCII heuristic). Codebase walk respects common
6
+ // ignore patterns (node_modules, .git, dist, build) but does not parse
7
+ // .gitignore — keeping it cheap and fast.
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.clearContextBudgetCache = clearContextBudgetCache;
13
+ exports.computeContextBudget = computeContextBudget;
14
+ exports.getContextBudget = getContextBudget;
15
+ const node_fs_1 = __importDefault(require("node:fs"));
16
+ const node_path_1 = __importDefault(require("node:path"));
17
+ const context_scope_1 = require("./context-scope");
18
+ const BYTES_PER_TOKEN = 4;
19
+ const CACHE_TTL_MS = 60_000;
20
+ const SKIP_DIRS = new Set([
21
+ 'node_modules', '.git', 'dist', 'build', '.next', '.turbo',
22
+ 'coverage', '.cache', 'tmp', '.specrails',
23
+ ]);
24
+ const SOURCE_EXT = new Set([
25
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
26
+ '.md', '.json', '.css', '.scss', '.html',
27
+ '.py', '.rb', '.go', '.rs', '.java', '.kt', '.swift',
28
+ '.c', '.cc', '.cpp', '.h', '.hpp', '.cs',
29
+ ]);
30
+ const cache = new Map();
31
+ function clearContextBudgetCache(projectId) {
32
+ if (projectId)
33
+ cache.delete(projectId);
34
+ else
35
+ cache.clear();
36
+ }
37
+ function walkCodebase(root) {
38
+ if (!node_fs_1.default.existsSync(root))
39
+ return { fileCount: 0, bytes: 0 };
40
+ let fileCount = 0;
41
+ let bytes = 0;
42
+ const stack = [root];
43
+ while (stack.length > 0) {
44
+ const dir = stack.pop();
45
+ let entries;
46
+ try {
47
+ entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
48
+ }
49
+ catch {
50
+ continue;
51
+ }
52
+ for (const e of entries) {
53
+ if (SKIP_DIRS.has(e.name))
54
+ continue;
55
+ if (e.name.startsWith('.') && e.name !== '.specrails-skip-marker')
56
+ continue;
57
+ const full = node_path_1.default.join(dir, e.name);
58
+ if (e.isDirectory()) {
59
+ stack.push(full);
60
+ }
61
+ else if (e.isFile()) {
62
+ const ext = node_path_1.default.extname(e.name).toLowerCase();
63
+ if (!SOURCE_EXT.has(ext))
64
+ continue;
65
+ try {
66
+ bytes += node_fs_1.default.statSync(full).size;
67
+ fileCount += 1;
68
+ }
69
+ catch { /* skip */ }
70
+ }
71
+ }
72
+ }
73
+ return { fileCount, bytes };
74
+ }
75
+ function readMcpServers(projectPath) {
76
+ const file = node_path_1.default.join(projectPath, '.mcp.json');
77
+ if (!node_fs_1.default.existsSync(file))
78
+ return [];
79
+ try {
80
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(file, 'utf8'));
81
+ return parsed.mcpServers ? Object.keys(parsed.mcpServers).sort() : [];
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ }
87
+ function bytesOfSection(section) {
88
+ return section ? Buffer.byteLength(section, 'utf8') : 0;
89
+ }
90
+ function computeContextBudget(projectPath) {
91
+ // Use the same builders the spawn path uses — token estimates reflect what
92
+ // will actually land in the system prompt (caps + formatting included), not
93
+ // the raw on-disk byte count of source files.
94
+ const ticketsBytes = bytesOfSection((0, context_scope_1.buildSpecrailsTicketsSection)(projectPath));
95
+ const openspecBytes = bytesOfSection((0, context_scope_1.buildOpenSpecSpecsSection)(projectPath));
96
+ const { fileCount, bytes: codebaseBytes } = walkCodebase(projectPath);
97
+ return {
98
+ specrailsTicketsTokens: Math.round(ticketsBytes / BYTES_PER_TOKEN),
99
+ openspecSpecsTokens: Math.round(openspecBytes / BYTES_PER_TOKEN),
100
+ codebaseFileCount: fileCount,
101
+ codebaseEstimatedTokens: Math.round(codebaseBytes / BYTES_PER_TOKEN),
102
+ mcpServers: readMcpServers(projectPath),
103
+ };
104
+ }
105
+ function getContextBudget(projectId, projectPath) {
106
+ const now = Date.now();
107
+ const hit = cache.get(projectId);
108
+ if (hit && hit.expiresAt > now)
109
+ return hit.value;
110
+ const value = computeContextBudget(projectPath);
111
+ cache.set(projectId, { value, expiresAt: now + CACHE_TTL_MS });
112
+ return value;
113
+ }
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ // Context Scope — per-spec configuration that controls what context is fed
3
+ // into the Add Spec flow (Quick `generate-spec` and Explore chat turns).
4
+ //
5
+ // Four orthogonal toggles:
6
+ // - specrails: concat <project>/.specrails/local-tickets.json (all tickets)
7
+ // into the system prompt
8
+ // - openspec: concat <project>/openspec/specs/**/spec.md into the system prompt
9
+ // - full: allow Read/Grep/Glob (Bash is never auto-allowed)
10
+ // - mcp: Explore-only — spawn from <project> so .mcp.json is honored
11
+ // - userMcp: Explore-only — inject the user's own already-approved MCP
12
+ // servers (claude: ~/.claude.json user+local scope, fed via
13
+ // `--mcp-config`; codex: ~/.codex is read natively). Independent
14
+ // of `mcp` (project `.mcp.json`) and does NOT change the spawn cwd.
15
+ //
16
+ // Persistence: `queue_state.add_spec_context_scope_last` (per-project) holds
17
+ // the last-used scope. `chat_conversations.context_scope` (per-conversation,
18
+ // JSON) freezes the scope at the conversation's creation time.
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.BYTES_PER_TOKEN = exports.SPEC_CONCAT_TOKEN_CAP = void 0;
24
+ exports.defaultBootScope = defaultBootScope;
25
+ exports.normalizeContextScope = normalizeContextScope;
26
+ exports.getLastContextScope = getLastContextScope;
27
+ exports.setLastContextScope = setLastContextScope;
28
+ exports.setConversationContextScope = setConversationContextScope;
29
+ exports.getConversationContextScope = getConversationContextScope;
30
+ exports.buildSpecrailsTicketsSection = buildSpecrailsTicketsSection;
31
+ exports.buildOpenSpecSpecsSection = buildOpenSpecSpecsSection;
32
+ exports.buildScopedSystemPromptPrefix = buildScopedSystemPromptPrefix;
33
+ exports.toolFlagsForScope = toolFlagsForScope;
34
+ const node_fs_1 = __importDefault(require("node:fs"));
35
+ const node_path_1 = __importDefault(require("node:path"));
36
+ // Maximum tokens worth of concatenated spec content injected per section
37
+ // (specrails + openspec each get their own 30k budget).
38
+ exports.SPEC_CONCAT_TOKEN_CAP = 30_000;
39
+ // Rough heuristic: ASCII text averages ~4 bytes per token.
40
+ exports.BYTES_PER_TOKEN = 4;
41
+ function defaultBootScope(mode) {
42
+ return {
43
+ specrails: true,
44
+ openspec: false,
45
+ full: mode === 'explore',
46
+ mcp: false,
47
+ contractRefine: false,
48
+ userMcp: false,
49
+ };
50
+ }
51
+ // Shape-validate an unknown value into a ContextScope. Unknown keys are
52
+ // dropped; non-boolean values fall back to `fallback` per key.
53
+ function normalizeContextScope(value, fallback) {
54
+ if (!value || typeof value !== 'object')
55
+ return { ...fallback };
56
+ const v = value;
57
+ return {
58
+ specrails: typeof v.specrails === 'boolean' ? v.specrails : fallback.specrails,
59
+ openspec: typeof v.openspec === 'boolean' ? v.openspec : fallback.openspec,
60
+ full: typeof v.full === 'boolean' ? v.full : fallback.full,
61
+ mcp: typeof v.mcp === 'boolean' ? v.mcp : fallback.mcp,
62
+ contractRefine: typeof v.contractRefine === 'boolean' ? v.contractRefine : fallback.contractRefine,
63
+ userMcp: typeof v.userMcp === 'boolean' ? v.userMcp : (fallback.userMcp ?? false),
64
+ };
65
+ }
66
+ function getLastContextScope(db, mode = 'explore') {
67
+ const row = db.prepare(`SELECT value FROM queue_state WHERE key = 'add_spec_context_scope_last'`).get();
68
+ const fallback = defaultBootScope(mode);
69
+ if (!row?.value)
70
+ return fallback;
71
+ try {
72
+ return normalizeContextScope(JSON.parse(row.value), fallback);
73
+ }
74
+ catch {
75
+ return fallback;
76
+ }
77
+ }
78
+ function setLastContextScope(db, scope) {
79
+ const value = JSON.stringify({
80
+ specrails: !!scope.specrails,
81
+ openspec: !!scope.openspec,
82
+ full: !!scope.full,
83
+ mcp: !!scope.mcp,
84
+ contractRefine: !!scope.contractRefine,
85
+ userMcp: !!scope.userMcp,
86
+ });
87
+ db.prepare(`INSERT OR REPLACE INTO queue_state (key, value) VALUES ('add_spec_context_scope_last', ?)`).run(value);
88
+ }
89
+ function setConversationContextScope(db, conversationId, scope) {
90
+ db.prepare(`UPDATE chat_conversations SET context_scope = ? WHERE id = ?`).run(JSON.stringify(scope), conversationId);
91
+ }
92
+ function getConversationContextScope(db, conversationId) {
93
+ const row = db.prepare(`SELECT context_scope FROM chat_conversations WHERE id = ?`).get(conversationId);
94
+ if (!row?.context_scope)
95
+ return null;
96
+ try {
97
+ const parsed = JSON.parse(row.context_scope);
98
+ return normalizeContextScope(parsed, {
99
+ specrails: false, openspec: false, full: true, mcp: false, contractRefine: false, userMcp: false,
100
+ });
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ function walkMdFiles(root, predicate) {
107
+ if (!node_fs_1.default.existsSync(root))
108
+ return [];
109
+ const out = [];
110
+ const stack = [root];
111
+ while (stack.length > 0) {
112
+ const dir = stack.pop();
113
+ let entries;
114
+ try {
115
+ entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
116
+ }
117
+ catch {
118
+ continue;
119
+ }
120
+ for (const e of entries) {
121
+ const full = node_path_1.default.join(dir, e.name);
122
+ if (e.isDirectory()) {
123
+ if (e.name.startsWith('.') && e.name !== '.specrails')
124
+ continue;
125
+ if (e.name === 'node_modules')
126
+ continue;
127
+ stack.push(full);
128
+ }
129
+ else if (e.isFile() && e.name.endsWith('.md')) {
130
+ const rel = node_path_1.default.relative(root, full);
131
+ if (predicate(rel))
132
+ out.push(full);
133
+ }
134
+ }
135
+ }
136
+ out.sort();
137
+ return out;
138
+ }
139
+ function concatFilesWithCap(files, byteCap) {
140
+ let total = 0;
141
+ const parts = [];
142
+ let truncated = false;
143
+ for (const file of files) {
144
+ let content;
145
+ try {
146
+ content = node_fs_1.default.readFileSync(file, 'utf8');
147
+ }
148
+ catch {
149
+ continue;
150
+ }
151
+ const header = `### ${node_path_1.default.basename(file)}\n\n`;
152
+ const piece = `${header}${content}\n\n`;
153
+ const pieceBytes = Buffer.byteLength(piece);
154
+ if (total + pieceBytes > byteCap) {
155
+ const remaining = Math.max(0, byteCap - total);
156
+ if (remaining > 0) {
157
+ parts.push(piece.slice(0, remaining));
158
+ total = byteCap;
159
+ }
160
+ truncated = true;
161
+ break;
162
+ }
163
+ parts.push(piece);
164
+ total += pieceBytes;
165
+ }
166
+ return { text: parts.join(''), truncated, bytes: total };
167
+ }
168
+ // Format the project's local-tickets.json store as a markdown section. ALL
169
+ // tickets are included (no status filter). Capped at 30k tokens worth of
170
+ // bytes; overflow ends with a `(truncated)` marker.
171
+ function buildSpecrailsTicketsSection(projectPath) {
172
+ const file = node_path_1.default.join(projectPath, '.specrails', 'local-tickets.json');
173
+ if (!node_fs_1.default.existsSync(file))
174
+ return null;
175
+ let raw;
176
+ try {
177
+ raw = node_fs_1.default.readFileSync(file, 'utf8');
178
+ }
179
+ catch {
180
+ return null;
181
+ }
182
+ let parsed;
183
+ try {
184
+ parsed = JSON.parse(raw);
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ // Ticket store schemas seen in the wild:
190
+ // 1.0: { tickets: [<ticket>, ...] } — array form
191
+ // 1.1: { tickets: { "1": <ticket>, ... } } — object keyed by id
192
+ // bare array: [<ticket>, ...] — legacy/test form
193
+ let tickets = [];
194
+ if (parsed && typeof parsed === 'object') {
195
+ const t = parsed.tickets;
196
+ if (Array.isArray(t))
197
+ tickets = t;
198
+ else if (t && typeof t === 'object')
199
+ tickets = Object.values(t);
200
+ else if (Array.isArray(parsed))
201
+ tickets = parsed;
202
+ }
203
+ if (tickets.length === 0)
204
+ return null;
205
+ const cap = exports.SPEC_CONCAT_TOKEN_CAP * exports.BYTES_PER_TOKEN;
206
+ const parts = [];
207
+ let total = 0;
208
+ let truncated = false;
209
+ for (const t of tickets) {
210
+ if (!t || typeof t !== 'object')
211
+ continue;
212
+ const x = t;
213
+ const id = typeof x.id === 'number' ? x.id : (typeof x.id === 'string' ? x.id : '?');
214
+ const title = typeof x.title === 'string' ? x.title : '(untitled)';
215
+ const status = typeof x.status === 'string' ? x.status : '?';
216
+ const priority = typeof x.priority === 'string' ? x.priority : '—';
217
+ const labels = Array.isArray(x.labels) ? x.labels.filter((l) => typeof l === 'string') : [];
218
+ const description = typeof x.description === 'string' ? x.description : '';
219
+ const labelLine = labels.length > 0 ? ` · labels: ${labels.join(', ')}` : '';
220
+ const block = `### #${id} · ${title}\nstatus: ${status} · priority: ${priority}${labelLine}\n\n${description}\n\n`;
221
+ const blockBytes = Buffer.byteLength(block);
222
+ if (total + blockBytes > cap) {
223
+ const remaining = Math.max(0, cap - total);
224
+ if (remaining > 0) {
225
+ parts.push(block.slice(0, remaining));
226
+ total = cap;
227
+ }
228
+ truncated = true;
229
+ break;
230
+ }
231
+ parts.push(block);
232
+ total += blockBytes;
233
+ }
234
+ if (parts.length === 0)
235
+ return null;
236
+ return `## Specrails Tickets\n\n${parts.join('')}${truncated ? '\n(truncated)\n' : ''}`;
237
+ }
238
+ function buildOpenSpecSpecsSection(projectPath) {
239
+ const root = node_path_1.default.join(projectPath, 'openspec', 'specs');
240
+ // Only include `spec.md` files under each capability directory.
241
+ const files = walkMdFiles(root, (rel) => rel.endsWith('spec.md'));
242
+ if (files.length === 0)
243
+ return null;
244
+ const cap = exports.SPEC_CONCAT_TOKEN_CAP * exports.BYTES_PER_TOKEN;
245
+ const { text, truncated } = concatFilesWithCap(files, cap);
246
+ if (!text)
247
+ return null;
248
+ return `## OpenSpec Specs\n\n${text}${truncated ? '\n(truncated)\n' : ''}`;
249
+ }
250
+ function buildScopedSystemPromptPrefix(scope, projectPath) {
251
+ const sections = [];
252
+ if (scope.specrails) {
253
+ const s = buildSpecrailsTicketsSection(projectPath);
254
+ if (s)
255
+ sections.push(s);
256
+ }
257
+ if (scope.openspec) {
258
+ const s = buildOpenSpecSpecsSection(projectPath);
259
+ if (s)
260
+ sections.push(s);
261
+ }
262
+ return sections.join('\n\n');
263
+ }
264
+ // Compute the claude CLI tool flags for the given scope.
265
+ // We use `--tools` (whitelist) instead of `--disallowedTools` because
266
+ // `--dangerously-skip-permissions` can bypass disallow filters in some CLI
267
+ // versions; an explicit whitelist is the most reliable lockdown.
268
+ //
269
+ // - full=true → --tools Read,Grep,Glob (Bash is NEVER auto-allowed)
270
+ // - full=false → --tools __none__ (a non-existent tool name; effectively
271
+ // disables all tools because Commander.js requires a non-empty
272
+ // value, and the empty string `""` is silently dropped by some
273
+ // CLI versions, falling back to the default tool set).
274
+ function toolFlagsForScope(scope) {
275
+ if (scope.full) {
276
+ return { args: ['--tools', 'Read,Grep,Glob'] };
277
+ }
278
+ return { args: ['--tools', '__none__'] };
279
+ }