specrails-desktop 2.16.0 → 2.18.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 (424) hide show
  1. package/client/dist/assets/{ActivityFeedPage-C_clKk8d.js → ActivityFeedPage-mGnv5SOe.js} +1 -1
  2. package/client/dist/assets/AgentsPage-BH1isg5j.js +86 -0
  3. package/client/dist/assets/AnalyticsPage-ByyshYRI.js +1 -0
  4. package/client/dist/assets/{BarChart-Dq1h8eYR.js → BarChart-BqHUOnl9.js} +3 -3
  5. package/client/dist/assets/CodePage-CU7T_HYs.js +2 -0
  6. package/client/dist/assets/{DesktopAnalyticsPage-CYhXhJoQ.js → DesktopAnalyticsPage-CR-m97Ui.js} +1 -1
  7. package/client/dist/assets/DocsDialog-CEmZp_8V.js +11 -0
  8. package/client/dist/assets/DocsPage-DYbAQ1AT.js +11 -0
  9. package/client/dist/assets/{ExportDropdown-DdB2ncYh.js → ExportDropdown-C-o1Q4ef.js} +1 -1
  10. package/client/dist/assets/IntegrationsPage-C6fKdwVH.js +3 -0
  11. package/client/dist/assets/JobDetailPage-CKfIfBgE.js +16 -0
  12. package/client/dist/assets/JobsPage-nBng0riZ.js +1 -0
  13. package/client/dist/assets/LoopBuilderPage-Co_TYqYk.js +7 -0
  14. package/client/dist/assets/LoopsPage-a2hd37Ya.js +1 -0
  15. package/client/dist/assets/{activity-Ca2XoBi-.js → activity-D8vQJrpW.js} +1 -1
  16. package/client/dist/assets/{addon-image-biWX2UUm.js → addon-image-Ba-TY3wr.js} +1 -1
  17. package/client/dist/assets/{addon-ligatures-D4EiDb5r.js → addon-ligatures-T4ARLiuu.js} +1 -1
  18. package/client/dist/assets/{addon-webgl-CDCIZQ03.js → addon-webgl-Cd73n8eh.js} +1 -1
  19. package/client/dist/assets/{addspec-DE_VfIyP.js → addspec-BloGn_ey.js} +1 -1
  20. package/client/dist/assets/agent-9WdSxPU5.js +1 -0
  21. package/client/dist/assets/agent-ASIyVcg0.js +1 -0
  22. package/client/dist/assets/agent-Bm2tPrdr.js +1 -0
  23. package/client/dist/assets/agent-C4bO1l_v.js +1 -0
  24. package/client/dist/assets/agent-CgKsh88Z2.js +1 -0
  25. package/client/dist/assets/agent-DMUrz9ZS2.js +1 -0
  26. package/client/dist/assets/agent-Dwkz5mPS.js +1 -0
  27. package/client/dist/assets/agent-pO8x4jbR.js +1 -0
  28. package/client/dist/assets/{agents-DcoUUFZl.js → agents-52t8NVpS.js} +1 -1
  29. package/client/dist/assets/{agents-DCX9D3-Q.js → agents-BAxAwHy-.js} +1 -1
  30. package/client/dist/assets/{agents-Jc-CjBDB.js → agents-BUYBb825.js} +1 -1
  31. package/client/dist/assets/{agents-CIhRSOna.js → agents-BjT_xLjv.js} +1 -1
  32. package/client/dist/assets/{agents-BYjUOrLD.js → agents-C07al8rI.js} +1 -1
  33. package/client/dist/assets/{agents-1lhqEcXH.js → agents-DfGvYtpq2.js} +1 -1
  34. package/client/dist/assets/{agents-CQlu1nOm.js → agents-Dli56gr82.js} +1 -1
  35. package/client/dist/assets/{agents-DVYpVGur.js → agents-Eqw_AQ6H.js} +1 -1
  36. package/client/dist/assets/{agentstudio-DCTpIqOx.js → agentstudio-CZm2rOzt.js} +1 -1
  37. package/client/dist/assets/{aiedit-Dirqf3Bm.js → aiedit-DYtnZU9H.js} +1 -1
  38. package/client/dist/assets/{analytics-BE49LbUk.js → analytics-B4FJ_pry.js} +1 -1
  39. package/client/dist/assets/{attachments-C2JPppoP.js → attachments-Ci6_42Kh.js} +1 -1
  40. package/client/dist/assets/{browser-Dpo_ug4c.js → browser-ZB1afzjZ.js} +1 -1
  41. package/client/dist/assets/{chat-mq1x9cxZ.js → chat-VMflhzxn.js} +1 -1
  42. package/client/dist/assets/chunk-BNv3lrIs.js +1 -0
  43. package/client/dist/assets/{code-DtIatVES.js → code-wtcs0ivb.js} +1 -1
  44. package/client/dist/assets/commands-Bc8y9eNo2.js +1 -0
  45. package/client/dist/assets/commands-Bl3-KVfj.js +1 -0
  46. package/client/dist/assets/commands-C5WQ9blx2.js +1 -0
  47. package/client/dist/assets/commands-CM99Upsz2.js +1 -0
  48. package/client/dist/assets/commands-Cc2WpuXa.js +1 -0
  49. package/client/dist/assets/commands-CckaBWdV.js +1 -0
  50. package/client/dist/assets/commands-DASXJD-l.js +1 -0
  51. package/client/dist/assets/commands-k9wbNYoi.js +1 -0
  52. package/client/dist/assets/{common-kftoE0Q-.js → common-BPQQkgJZ.js} +1 -1
  53. package/client/dist/assets/{cssMode-DSHXamUH.js → cssMode-DsArsSCT.js} +1 -1
  54. package/client/dist/assets/{dashboard-BQ3Oa8CE.js → dashboard-Cyzp4ox9.js} +1 -1
  55. package/client/dist/assets/{dist-js-Ele_sHO7.js → dist-js-BHhtSerX.js} +1 -1
  56. package/client/dist/assets/{dist-js-D27I-bfi.js → dist-js-CUegfF6k.js} +1 -1
  57. package/client/dist/assets/{editor.api2-Cwla1nvV.js → editor.api2-T7u8kQWG.js} +1 -1
  58. package/client/dist/assets/{editor.main-Cd8qBRAT.js → editor.main-G3Sl9C67.js} +2 -2
  59. package/client/dist/assets/{explore-CBYU76JD.js → explore-BKVV5JSu.js} +1 -1
  60. package/client/dist/assets/{freemarker2-CkEKTBm2.js → freemarker2-pBzQNgFi.js} +1 -1
  61. package/client/dist/assets/{handlebars-BRGx0JpL.js → handlebars-CtBTCnBI.js} +1 -1
  62. package/client/dist/assets/{html-BfRIaGgN.js → html-Dx3DYBzY.js} +1 -1
  63. package/client/dist/assets/{htmlMode-BTpSnsDE.js → htmlMode-In7frFOo.js} +1 -1
  64. package/client/dist/assets/index-B0FxQALR.css +2 -0
  65. package/client/dist/assets/index-B7vB20Jw.js +152 -0
  66. package/client/dist/assets/{integrations-jJGaKwff.js → integrations-CuWnMR5L.js} +1 -1
  67. package/client/dist/assets/{javascript-DMmE2kKN.js → javascript-BKcn-YkN.js} +1 -1
  68. package/client/dist/assets/{jira-BwACz875.js → jira-DXMoAKWD.js} +1 -1
  69. package/client/dist/assets/{jobs-DRInW0AE.js → jobs---dwa4Nf.js} +1 -1
  70. package/client/dist/assets/{jsonMode-hYuaUleY.js → jsonMode-jNREoQ3C.js} +1 -1
  71. package/client/dist/assets/{lib-qdRfWwE1.js → lib-PQoHlR5u.js} +2 -2
  72. package/client/dist/assets/{liquid-C-VbuTr7.js → liquid-CtRkGqBu.js} +1 -1
  73. package/client/dist/assets/{loops-DfGadne0.js → loops-D8Iu6Jss.js} +1 -1
  74. package/client/dist/assets/{lspLanguageFeatures-BALx-vjn.js → lspLanguageFeatures-Cl3gvD_W.js} +1 -1
  75. package/client/dist/assets/mcp-B4irfLJ2.js +1 -0
  76. package/client/dist/assets/mcp-B6nwJJmR.js +1 -0
  77. package/client/dist/assets/mcp-BOoEGTSQ.js +1 -0
  78. package/client/dist/assets/mcp-BP7PpbDr2.js +1 -0
  79. package/client/dist/assets/mcp-CIH0pH1K.js +1 -0
  80. package/client/dist/assets/mcp-CNgFiTEh.js +1 -0
  81. package/client/dist/assets/mcp-D3E4_Mmk2.js +1 -0
  82. package/client/dist/assets/mcp-mupPuPDO2.js +1 -0
  83. package/client/dist/assets/{mdx-Cs8MNCzn.js → mdx-B_nJldHz.js} +1 -1
  84. package/client/dist/assets/{monaco.contribution-CIvCAJs4.js → monaco.contribution-PUeaZk8T.js} +2 -2
  85. package/client/dist/assets/{nav-CCz4krPP.js → nav-DE3yWQw6.js} +1 -1
  86. package/client/dist/assets/{python-CGShLxuI.js → python-DS1Ce-A6.js} +1 -1
  87. package/client/dist/assets/{razor-CvOBQGd5.js → razor-L41Qg9OK.js} +1 -1
  88. package/client/dist/assets/settings-BKmORxlB2.js +1 -0
  89. package/client/dist/assets/settings-BVv2JgQ8.js +1 -0
  90. package/client/dist/assets/settings-Bghm3pAV.js +1 -0
  91. package/client/dist/assets/settings-BuC_aplX.js +1 -0
  92. package/client/dist/assets/settings-Bw_Qk8E32.js +1 -0
  93. package/client/dist/assets/settings-CAKgJv7p.js +1 -0
  94. package/client/dist/assets/settings-CEUgk1Ck.js +1 -0
  95. package/client/dist/assets/settings-C_PDE20s2.js +1 -0
  96. package/client/dist/assets/setup-4us-Bz3H.js +1 -0
  97. package/client/dist/assets/setup-BYoDYoPY2.js +1 -0
  98. package/client/dist/assets/setup-Bf9eLKxU.js +1 -0
  99. package/client/dist/assets/setup-C5UbM0RP.js +1 -0
  100. package/client/dist/assets/setup-CqGrWb6G.js +1 -0
  101. package/client/dist/assets/setup-JFkWWZnR.js +1 -0
  102. package/client/dist/assets/setup-faMApo0U2.js +1 -0
  103. package/client/dist/assets/setup-tloaTobG2.js +1 -0
  104. package/client/dist/assets/{specs-C_8j4ELZ.js → specs-BYeAbIEy.js} +1 -1
  105. package/client/dist/assets/{terminal-Cj4HzP3p.js → terminal-DFPNRLKp.js} +1 -1
  106. package/client/dist/assets/{tickets-DBQXMYYA.js → tickets-CkfbISuK.js} +1 -1
  107. package/client/dist/assets/{tsMode-04uOpiiP.js → tsMode-BC1g186U.js} +1 -1
  108. package/client/dist/assets/{typescript-CX0CwyIZ.js → typescript-BGlRGvJW.js} +1 -1
  109. package/client/dist/assets/upload-PnJDPHZH.js +1 -0
  110. package/client/dist/assets/{value-BRVOAvhY.js → value-BTDefcOV.js} +1 -1
  111. package/client/dist/assets/{workers-yr2u4c3C.js → workers-CXcXtO3b.js} +1 -1
  112. package/client/dist/assets/{xml-C0OFlt5X.js → xml-JdZZaIhJ.js} +1 -1
  113. package/client/dist/assets/{yaml-DgabaPs5.js → yaml-Cm82BVBt.js} +1 -1
  114. package/client/dist/index.html +30 -28
  115. package/docs/README.md +2 -0
  116. package/docs/guide/de/integrations/5-mcp-server.md +74 -0
  117. package/docs/guide/de/integrations/6-agent-chat.md +64 -0
  118. package/docs/guide/en/integrations/5-mcp-server.md +74 -0
  119. package/docs/guide/en/integrations/6-agent-chat.md +64 -0
  120. package/docs/guide/es/integrations/5-mcp-server.md +74 -0
  121. package/docs/guide/es/integrations/6-agent-chat.md +64 -0
  122. package/docs/guide/fr/integrations/5-mcp-server.md +74 -0
  123. package/docs/guide/fr/integrations/6-agent-chat.md +64 -0
  124. package/docs/guide/it/integrations/5-mcp-server.md +74 -0
  125. package/docs/guide/it/integrations/6-agent-chat.md +64 -0
  126. package/docs/guide/ja/integrations/5-mcp-server.md +74 -0
  127. package/docs/guide/ja/integrations/6-agent-chat.md +64 -0
  128. package/docs/guide/pt/integrations/5-mcp-server.md +74 -0
  129. package/docs/guide/pt/integrations/6-agent-chat.md +64 -0
  130. package/docs/guide/zh/integrations/5-mcp-server.md +74 -0
  131. package/docs/guide/zh/integrations/6-agent-chat.md +64 -0
  132. package/docs/mcp.md +249 -0
  133. package/package.json +8 -5
  134. package/server/dist/agent-chat-manager.js +224 -0
  135. package/server/dist/agent-chat-router.js +148 -0
  136. package/server/dist/agent-cwd-manager.js +94 -0
  137. package/server/dist/agent-mcp-config.js +208 -0
  138. package/server/dist/agent-store.js +59 -0
  139. package/server/dist/agent-tier.js +86 -0
  140. package/server/dist/desktop-db.js +27 -0
  141. package/server/dist/index.js +38 -0
  142. package/server/dist/mcp/guide.js +82 -0
  143. package/server/dist/mcp/index.js +21 -0
  144. package/server/dist/mcp/mcp-admin-router.js +71 -0
  145. package/server/dist/mcp/mcp-server.js +143 -0
  146. package/server/dist/mcp/mcp-tiers.js +48 -0
  147. package/server/dist/mcp/mcp-token.js +119 -0
  148. package/server/dist/mcp/resources.js +24 -0
  149. package/server/dist/mcp/tools/agents.js +319 -0
  150. package/server/dist/mcp/tools/analytics.js +168 -0
  151. package/server/dist/mcp/tools/app-settings.js +81 -0
  152. package/server/dist/mcp/tools/catalog.js +45 -0
  153. package/server/dist/mcp/tools/chat.js +147 -0
  154. package/server/dist/mcp/tools/code.js +145 -0
  155. package/server/dist/mcp/tools/jira.js +222 -0
  156. package/server/dist/mcp/tools/jobs.js +258 -0
  157. package/server/dist/mcp/tools/loops.js +229 -0
  158. package/server/dist/mcp/tools/meta.js +96 -0
  159. package/server/dist/mcp/tools/plugins.js +83 -0
  160. package/server/dist/mcp/tools/projects.js +62 -0
  161. package/server/dist/mcp/tools/rails.js +181 -0
  162. package/server/dist/mcp/tools/setup.js +167 -0
  163. package/server/dist/mcp/tools/specs.js +327 -0
  164. package/server/dist/mcp/tools/types.js +156 -0
  165. package/server/dist/mcp/tools/watch.js +93 -0
  166. package/server/dist/mobile/mobile-event-bus.js +2 -0
  167. package/server/dist/project-router-setup.js +15 -1
  168. package/server/dist/project-router-tickets.js +2 -2
  169. package/server/dist/providers/codex-adapter.js +19 -3
  170. package/server/dist/rails-router.js +5 -0
  171. package/server/dist/setup-manager.js +28 -0
  172. package/server/dist/spawn-lifecycle.js +21 -13
  173. package/server/dist/workspace-manager.js +11 -0
  174. package/client/dist/assets/AgentsPage-jcPUtPhP.js +0 -86
  175. package/client/dist/assets/AnalyticsPage-DZkVU3yd.js +0 -1
  176. package/client/dist/assets/CodePage-BcbZT88K.js +0 -2
  177. package/client/dist/assets/DocsDialog-CS3Syf61.js +0 -11
  178. package/client/dist/assets/DocsPage-l3ZcTO2E.js +0 -11
  179. package/client/dist/assets/IntegrationsPage-CJ_Om1zu.js +0 -3
  180. package/client/dist/assets/JobDetailPage-D5Cxw0md.js +0 -16
  181. package/client/dist/assets/JobsPage-3v_iX83r.js +0 -1
  182. package/client/dist/assets/LoopBuilderPage-4s_adZy5.js +0 -7
  183. package/client/dist/assets/LoopsPage-DA94-o0j.js +0 -1
  184. package/client/dist/assets/chunk-CilyBKbf.js +0 -1
  185. package/client/dist/assets/commands-B9XEyMj-.js +0 -1
  186. package/client/dist/assets/commands-BI1Ta-E7.js +0 -1
  187. package/client/dist/assets/commands-BdI0CtOL.js +0 -1
  188. package/client/dist/assets/commands-C2ewlyXo.js +0 -1
  189. package/client/dist/assets/commands-CwypztRT.js +0 -1
  190. package/client/dist/assets/commands-DSX3yJyr.js +0 -1
  191. package/client/dist/assets/commands-Ic1DJDxm.js +0 -1
  192. package/client/dist/assets/commands-yNn4IA4C.js +0 -1
  193. package/client/dist/assets/index-BRMyOS1B.css +0 -2
  194. package/client/dist/assets/index-meTWPBzY.js +0 -144
  195. package/client/dist/assets/settings-0m2iuTzd.js +0 -1
  196. package/client/dist/assets/settings-BA1V6KdK.js +0 -1
  197. package/client/dist/assets/settings-BN7OusER.js +0 -1
  198. package/client/dist/assets/settings-Bi5FFkIw.js +0 -1
  199. package/client/dist/assets/settings-CRJxyTNN.js +0 -1
  200. package/client/dist/assets/settings-DyBxunCh.js +0 -1
  201. package/client/dist/assets/settings-fk-WlnUt.js +0 -1
  202. package/client/dist/assets/settings-iQe5Dim-.js +0 -1
  203. package/client/dist/assets/setup-BOmQ4vh2.js +0 -1
  204. package/client/dist/assets/setup-BwO2-kuK.js +0 -1
  205. package/client/dist/assets/setup-CUTNWz-0.js +0 -1
  206. package/client/dist/assets/setup-Cf3hjChU.js +0 -1
  207. package/client/dist/assets/setup-CsuXrbJ2.js +0 -1
  208. package/client/dist/assets/setup-Df4cJOqu.js +0 -1
  209. package/client/dist/assets/setup-Do0fWx6W.js +0 -1
  210. package/client/dist/assets/setup-GlkDhBlJ.js +0 -1
  211. package/client/dist/assets/upload-DPG87J4t.js +0 -1
  212. /package/client/dist/assets/{abap-CK68cr9-.js → abap-CpHUwCVK.js} +0 -0
  213. /package/client/dist/assets/{activity-Di2f50_Z.js → activity-B82z3Pna.js} +0 -0
  214. /package/client/dist/assets/{activity-B2MvEH54.js → activity-BId0pwuS2.js} +0 -0
  215. /package/client/dist/assets/{activity-D4dhNEwO.js → activity-BVpZrs0J.js} +0 -0
  216. /package/client/dist/assets/{activity-DHjfmAyT.js → activity-BySXFT2J2.js} +0 -0
  217. /package/client/dist/assets/{activity-usnNa7FX.js → activity-DIWnV0Pl.js} +0 -0
  218. /package/client/dist/assets/{activity-C7VdmeGb.js → activity-Uj576ckT.js} +0 -0
  219. /package/client/dist/assets/{activity-BbNkUmW4.js → activity-w1qMFwxh.js} +0 -0
  220. /package/client/dist/assets/{addspec-CO1xv6BL.js → addspec-B9dY_F5T.js} +0 -0
  221. /package/client/dist/assets/{addspec-CNyAUGz_.js → addspec-B9nhMikb.js} +0 -0
  222. /package/client/dist/assets/{addspec-IozoiiGs.js → addspec-BtNaJHu2.js} +0 -0
  223. /package/client/dist/assets/{addspec-BxMn39wn.js → addspec-D43TlMVp2.js} +0 -0
  224. /package/client/dist/assets/{addspec-1HEtmLv1.js → addspec-DfgIZ5lO.js} +0 -0
  225. /package/client/dist/assets/{addspec-DfuR6EAl.js → addspec-W0r16BOC2.js} +0 -0
  226. /package/client/dist/assets/{addspec-DAveBiCE.js → addspec-tbxr3sHa.js} +0 -0
  227. /package/client/dist/assets/{agentstudio-DCyDW8sy.js → agentstudio-0o3XKrcy.js} +0 -0
  228. /package/client/dist/assets/{agentstudio-9NbsoGXk.js → agentstudio-Bu8m5jDw.js} +0 -0
  229. /package/client/dist/assets/{agentstudio-B1y0JWY-.js → agentstudio-C7xxqVWn.js} +0 -0
  230. /package/client/dist/assets/{agentstudio-1E-bag77.js → agentstudio-D-UoNAIA.js} +0 -0
  231. /package/client/dist/assets/{agentstudio-B-jQgYV-.js → agentstudio-OJjjz6Uf2.js} +0 -0
  232. /package/client/dist/assets/{agentstudio-Q0Sq_jTg.js → agentstudio-ObTpVbBP.js} +0 -0
  233. /package/client/dist/assets/{agentstudio-Bwa72b1S.js → agentstudio-PzFB3vfh2.js} +0 -0
  234. /package/client/dist/assets/{aiedit-DUpe7NxI.js → aiedit-BIQqv2XM2.js} +0 -0
  235. /package/client/dist/assets/{aiedit-kAU7KADg.js → aiedit-BaLZalLa.js} +0 -0
  236. /package/client/dist/assets/{aiedit-CvSspQmE.js → aiedit-BjlUzasF.js} +0 -0
  237. /package/client/dist/assets/{aiedit-DSLtsYIu.js → aiedit-BmDufyGU.js} +0 -0
  238. /package/client/dist/assets/{aiedit-qTGI_PGs.js → aiedit-DAM_WRAl2.js} +0 -0
  239. /package/client/dist/assets/{aiedit-CfBNanHE.js → aiedit-DRrNiaB4.js} +0 -0
  240. /package/client/dist/assets/{aiedit-CGxeml8D.js → aiedit-sP_iao2j.js} +0 -0
  241. /package/client/dist/assets/{analytics-CgEkAUiP.js → analytics-BDqqCzN9.js} +0 -0
  242. /package/client/dist/assets/{analytics-DEsEAJZL.js → analytics-B_rxNC9X.js} +0 -0
  243. /package/client/dist/assets/{analytics-D1ElChhs.js → analytics-C4z_NgJZ.js} +0 -0
  244. /package/client/dist/assets/{analytics-DDqve9Ma.js → analytics-DL2vJCbq.js} +0 -0
  245. /package/client/dist/assets/{analytics-CQqu1yE5.js → analytics-Ds_PNxtO2.js} +0 -0
  246. /package/client/dist/assets/{analytics-BDlELxc7.js → analytics-MVJRjcY52.js} +0 -0
  247. /package/client/dist/assets/{analytics-DBGO8B6-.js → analytics-e1mkNTgy2.js} +0 -0
  248. /package/client/dist/assets/{apex-BHHyAVNb.js → apex-DlD7oJX6.js} +0 -0
  249. /package/client/dist/assets/{atom-one-dark-DrWoEEbZ.js → atom-one-dark-BrRN8wBy.js} +0 -0
  250. /package/client/dist/assets/{attachments-BNgH6Tcu.js → attachments-8QCKHCEF2.js} +0 -0
  251. /package/client/dist/assets/{attachments-BLqqPGyy.js → attachments-BP0Ac1yt.js} +0 -0
  252. /package/client/dist/assets/{attachments-UJtEq892.js → attachments-CJaO1vCH.js} +0 -0
  253. /package/client/dist/assets/{attachments-D5fVsMgb.js → attachments-CPBVeHX72.js} +0 -0
  254. /package/client/dist/assets/{attachments-3CuBBRFu.js → attachments-CV2uaTGE.js} +0 -0
  255. /package/client/dist/assets/{attachments-CppM7de8.js → attachments-CaOjdN332.js} +0 -0
  256. /package/client/dist/assets/{attachments-pW3zm9nu.js → attachments-Db7JfA8a.js} +0 -0
  257. /package/client/dist/assets/{azcli-C56lfIEP.js → azcli-CmXFAbc-.js} +0 -0
  258. /package/client/dist/assets/{bat-BLamSaf-.js → bat-DdNJq4hH.js} +0 -0
  259. /package/client/dist/assets/{bicep-lrOcEItS.js → bicep-Bppz7WOA.js} +0 -0
  260. /package/client/dist/assets/{browser-C__Vz7KR.js → browser-0xeW8fUa2.js} +0 -0
  261. /package/client/dist/assets/{browser-EFmPpkvO.js → browser-543jbxE4.js} +0 -0
  262. /package/client/dist/assets/{browser-DhwTc0ry.js → browser-C9rUUxo4.js} +0 -0
  263. /package/client/dist/assets/{browser-C91MQBxx.js → browser-CEqx11iy.js} +0 -0
  264. /package/client/dist/assets/{browser-B7i7Ysc8.js → browser-CLC0etB_2.js} +0 -0
  265. /package/client/dist/assets/{browser-DwE289IS.js → browser-DyG2l9Wa.js} +0 -0
  266. /package/client/dist/assets/{browser-BVQgd1_1.js → browser-ExmELH702.js} +0 -0
  267. /package/client/dist/assets/{cameligo-BK_p0bgU.js → cameligo-0MRMdSmg.js} +0 -0
  268. /package/client/dist/assets/{chat-C5nJF6L0.js → chat-CCytD3P8.js} +0 -0
  269. /package/client/dist/assets/{chat-UMl6H55K.js → chat-CN8BMAMc.js} +0 -0
  270. /package/client/dist/assets/{chat-BXVx6rb5.js → chat-Cu6F3d6g2.js} +0 -0
  271. /package/client/dist/assets/{chat-CE8bx6Rz.js → chat-DagUyoVA.js} +0 -0
  272. /package/client/dist/assets/{chat-PVakYp92.js → chat-IjutwlBg.js} +0 -0
  273. /package/client/dist/assets/{chat-9RcD5Lcn.js → chat-NQPCBQo72.js} +0 -0
  274. /package/client/dist/assets/{chat-BnJPyeUK.js → chat-vVpwkOp52.js} +0 -0
  275. /package/client/dist/assets/{clojure-BQ7JOykv.js → clojure-B5dKj863.js} +0 -0
  276. /package/client/dist/assets/{clsx-CjLeUJfG.js → clsx-1dnHRn8W.js} +0 -0
  277. /package/client/dist/assets/{code-OoLqhjoI.js → code-32l6Naxu2.js} +0 -0
  278. /package/client/dist/assets/{code-Lg4awa35.js → code-BaG05zK62.js} +0 -0
  279. /package/client/dist/assets/{code-BPMR8_Vp.js → code-C5cibF2F.js} +0 -0
  280. /package/client/dist/assets/{code-aCUqkVN_.js → code-Ce-nBIwj.js} +0 -0
  281. /package/client/dist/assets/{code-BsOBm1Fb.js → code-Dap54vOb.js} +0 -0
  282. /package/client/dist/assets/{code-u9Sg9ohM.js → code-Dhb6jbAU.js} +0 -0
  283. /package/client/dist/assets/{code-eh4vO2-_.js → code-_NOCo-Ol2.js} +0 -0
  284. /package/client/dist/assets/{coffee-BD3DiL5s.js → coffee-DSbWjzk7.js} +0 -0
  285. /package/client/dist/assets/{common-C9VyfY7g.js → common-0aY9HQBP.js} +0 -0
  286. /package/client/dist/assets/{common-LDwESeCX.js → common-5jScBJqt.js} +0 -0
  287. /package/client/dist/assets/{common-ULlk84G4.js → common-BdaRciTu.js} +0 -0
  288. /package/client/dist/assets/{common-CzCQ0rpW.js → common-CHARW6MZ2.js} +0 -0
  289. /package/client/dist/assets/{common-CNoRVpnA.js → common-CQCJzAQq2.js} +0 -0
  290. /package/client/dist/assets/{common-Dmpyh323.js → common-DNhhqjlJ.js} +0 -0
  291. /package/client/dist/assets/{common-CcHFVATT.js → common-YdyZtmaI2.js} +0 -0
  292. /package/client/dist/assets/{cpp-splnCwCh.js → cpp-SBF8SAh9.js} +0 -0
  293. /package/client/dist/assets/{csharp-BCpsl-o3.js → csharp-Lzuq_1t-.js} +0 -0
  294. /package/client/dist/assets/{csp-tkCWrZmb.js → csp-BEzxZqi1.js} +0 -0
  295. /package/client/dist/assets/{css-B_xdnReq.js → css-C3D3PKln.js} +0 -0
  296. /package/client/dist/assets/{cypher-OL1zq-y3.js → cypher-CQ3dEPmv.js} +0 -0
  297. /package/client/dist/assets/{dart-CtTlOkrm.js → dart-DCPmxolI.js} +0 -0
  298. /package/client/dist/assets/{dashboard-C52PElPV.js → dashboard-BTiH361F.js} +0 -0
  299. /package/client/dist/assets/{dashboard-C-dXxut-.js → dashboard-COSm_14E.js} +0 -0
  300. /package/client/dist/assets/{dashboard-CUjyhohl.js → dashboard-CfOs70FN2.js} +0 -0
  301. /package/client/dist/assets/{dashboard-zH9quXks.js → dashboard-CzHDp14_2.js} +0 -0
  302. /package/client/dist/assets/{dashboard-03EpOoMM.js → dashboard-D6Woy2B5.js} +0 -0
  303. /package/client/dist/assets/{dashboard-C2owt3eN.js → dashboard-DwbH4oVH.js} +0 -0
  304. /package/client/dist/assets/{dashboard-Ch6H-457.js → dashboard-cWhU3krA2.js} +0 -0
  305. /package/client/dist/assets/{dockerfile-DcQ5CNiW.js → dockerfile-B_2_aaTO.js} +0 -0
  306. /package/client/dist/assets/{ecl-DZpiDRt6.js → ecl-rADUeXsV.js} +0 -0
  307. /package/client/dist/assets/{elixir-Dzj2lqtK.js → elixir-DOd-TuJO.js} +0 -0
  308. /package/client/dist/assets/{explore-CCcPXrHg.js → explore-B82VMUJ_.js} +0 -0
  309. /package/client/dist/assets/{explore-DQ0XEjed.js → explore-BGz1rvQE.js} +0 -0
  310. /package/client/dist/assets/{explore-xQoaak6e.js → explore-BzdMEpuf.js} +0 -0
  311. /package/client/dist/assets/{explore-B2n8r9Ye.js → explore-CbW0381i2.js} +0 -0
  312. /package/client/dist/assets/{explore-4SD1DxR0.js → explore-ChtxIiSM.js} +0 -0
  313. /package/client/dist/assets/{explore-BxR9q8Hq.js → explore-DfcUfiPw2.js} +0 -0
  314. /package/client/dist/assets/{explore-CZt4Ncpa.js → explore-yRF7wFSp2.js} +0 -0
  315. /package/client/dist/assets/{flow9-CFENCHIZ.js → flow9-Bf7zg_j0.js} +0 -0
  316. /package/client/dist/assets/{format-command-CMsBTOPN.js → format-command-D96da4fZ.js} +0 -0
  317. /package/client/dist/assets/{fsharp-D-4bv7FB.js → fsharp-BqROZjbA.js} +0 -0
  318. /package/client/dist/assets/{go-djxbTJq7.js → go-oQTP5uLe.js} +0 -0
  319. /package/client/dist/assets/{graphql-DHIFrkZ6.js → graphql-CSHfTU3q.js} +0 -0
  320. /package/client/dist/assets/{hcl-CXVoowNb.js → hcl-CeG-RoFJ.js} +0 -0
  321. /package/client/dist/assets/{ini-Crzc5kly.js → ini-B2Dv4ohc.js} +0 -0
  322. /package/client/dist/assets/{integrations-C7u7SInG.js → integrations-B0OBPU9_.js} +0 -0
  323. /package/client/dist/assets/{integrations-B17KyA-i.js → integrations-BA5pM05t.js} +0 -0
  324. /package/client/dist/assets/{integrations-DkBi-Gsh.js → integrations-BJvrlcc7.js} +0 -0
  325. /package/client/dist/assets/{integrations-DwSVdCpf.js → integrations-CPKYkG36.js} +0 -0
  326. /package/client/dist/assets/{integrations-A9f08E0o.js → integrations-CnrX7vqw2.js} +0 -0
  327. /package/client/dist/assets/{integrations-9qxUNhPD.js → integrations-DBou159M2.js} +0 -0
  328. /package/client/dist/assets/{integrations-B46ac3sf.js → integrations-DeJFRyXz2.js} +0 -0
  329. /package/client/dist/assets/{java-CYLaJrdE.js → java-aUDDeufb.js} +0 -0
  330. /package/client/dist/assets/{jira-Dht8qNck.js → jira-BDgxAFTF2.js} +0 -0
  331. /package/client/dist/assets/{jira-4Fin3fu7.js → jira-BwLBgmfI2.js} +0 -0
  332. /package/client/dist/assets/{jira-0ldfMByG.js → jira-D3GGzXOI.js} +0 -0
  333. /package/client/dist/assets/{jira-BpnpUFlb.js → jira-DeotPx6P2.js} +0 -0
  334. /package/client/dist/assets/{jira-DzIVvNmy.js → jira-NwlUCcQD.js} +0 -0
  335. /package/client/dist/assets/{jira-CBU0200d.js → jira-Srx2P5zS.js} +0 -0
  336. /package/client/dist/assets/{jira-01H1RfQj.js → jira-mi37H4Kt.js} +0 -0
  337. /package/client/dist/assets/{jobs-jEQidSIb.js → jobs-B56vQEkh2.js} +0 -0
  338. /package/client/dist/assets/{jobs-DM9owF1j.js → jobs-BYIk6Tg_.js} +0 -0
  339. /package/client/dist/assets/{jobs-Bw4hqEro.js → jobs-C-lM-iax2.js} +0 -0
  340. /package/client/dist/assets/{jobs-BF9raUkL.js → jobs-CYdevGgT.js} +0 -0
  341. /package/client/dist/assets/{jobs-ym72SIR9.js → jobs-D8adm2BX.js} +0 -0
  342. /package/client/dist/assets/{jobs-DcCONARH.js → jobs-K_Y8KAZ2.js} +0 -0
  343. /package/client/dist/assets/{jobs-Oz3UtLQn.js → jobs-OwM0ZWhI2.js} +0 -0
  344. /package/client/dist/assets/{julia-BJ7tUU-T.js → julia-C5LbruO5.js} +0 -0
  345. /package/client/dist/assets/{kotlin-CeWcU3lC.js → kotlin-C6mOuSKk.js} +0 -0
  346. /package/client/dist/assets/{less-CviwWNG4.js → less-D5qC3caW.js} +0 -0
  347. /package/client/dist/assets/{lexon-Dt28jqDS.js → lexon-Dr2La-fj.js} +0 -0
  348. /package/client/dist/assets/{loops-DE-2cmLw.js → loops-BDhEfnx82.js} +0 -0
  349. /package/client/dist/assets/{loops-mcoeFMat.js → loops-BM5QggwH.js} +0 -0
  350. /package/client/dist/assets/{loops-D_ZxkD4l.js → loops-CPjLAAxj.js} +0 -0
  351. /package/client/dist/assets/{loops-BYNUJVyD.js → loops-DKnk79TB2.js} +0 -0
  352. /package/client/dist/assets/{loops-B_gS4Pqu.js → loops-DLW0aFMm.js} +0 -0
  353. /package/client/dist/assets/{loops-Fv4Bs-9A.js → loops-Dcv3dFy_2.js} +0 -0
  354. /package/client/dist/assets/{loops-B_w7STrw.js → loops-y7wFRx6M.js} +0 -0
  355. /package/client/dist/assets/{lua-B6AOaJSi.js → lua-Zy6u5z6Z.js} +0 -0
  356. /package/client/dist/assets/{m3-VnMkHJcy.js → m3-C7XHeDz_.js} +0 -0
  357. /package/client/dist/assets/{markdown-8vKNdvIM.js → markdown-PiF7r-2h.js} +0 -0
  358. /package/client/dist/assets/{mips-DoEcuzan.js → mips-nn07GiyE.js} +0 -0
  359. /package/client/dist/assets/{msdax-CNzvHyEp.js → msdax-DaKFVMST.js} +0 -0
  360. /package/client/dist/assets/{mysql-Buk3vUtL.js → mysql-C6d6xrbU.js} +0 -0
  361. /package/client/dist/assets/{nav-Cw3_40fA.js → nav-1hj2izqB2.js} +0 -0
  362. /package/client/dist/assets/{nav-DNDJ3H-_.js → nav-BBUKMAu-2.js} +0 -0
  363. /package/client/dist/assets/{nav-CrG_mYRr.js → nav-CLqkP-26.js} +0 -0
  364. /package/client/dist/assets/{nav-DVp1nEsi.js → nav-Cv46L837.js} +0 -0
  365. /package/client/dist/assets/{nav-DbAbG5_k.js → nav-DgA-rjLk2.js} +0 -0
  366. /package/client/dist/assets/{nav-B5W9IMnf.js → nav-EG2pr6vN.js} +0 -0
  367. /package/client/dist/assets/{nav-_0vAgZ_k.js → nav-r3mIJVfU.js} +0 -0
  368. /package/client/dist/assets/{objective-c-DfOmda-5.js → objective-c-B6KMtI-k.js} +0 -0
  369. /package/client/dist/assets/{pascal-DoAA2yjy.js → pascal-DYr8MPE7.js} +0 -0
  370. /package/client/dist/assets/{pascaligo-C65Vn1fu.js → pascaligo-B3pd-jJ_.js} +0 -0
  371. /package/client/dist/assets/{perl-INlfQ_ro.js → perl-z2xUzoaL.js} +0 -0
  372. /package/client/dist/assets/{pgsql-DtwRzglx.js → pgsql-DUvT-09-.js} +0 -0
  373. /package/client/dist/assets/{php-DfHqVNet.js → php-CGyOmJfy.js} +0 -0
  374. /package/client/dist/assets/{pla-D3dNVRYk.js → pla-CMqgvyD0.js} +0 -0
  375. /package/client/dist/assets/{postiats-UKXD1rM4.js → postiats-Dx5LUn4Z.js} +0 -0
  376. /package/client/dist/assets/{powerquery-zE3E3O7s.js → powerquery-DazYxvJ6.js} +0 -0
  377. /package/client/dist/assets/{powershell-Df9b3zQl.js → powershell-B3nwlDka.js} +0 -0
  378. /package/client/dist/assets/{protobuf-BF0nUVrW.js → protobuf-BGuu2u2s.js} +0 -0
  379. /package/client/dist/assets/{pug-Bj6Yikv_.js → pug-Dbte1MXA.js} +0 -0
  380. /package/client/dist/assets/{qsharp-BI4h-raZ.js → qsharp-DJLwBOvG.js} +0 -0
  381. /package/client/dist/assets/{r-DhpnmaXx.js → r-DmGBRSHj.js} +0 -0
  382. /package/client/dist/assets/{redis-DwYYPr4d.js → redis-VvUYn0a4.js} +0 -0
  383. /package/client/dist/assets/{redshift-D2f3Bc-4.js → redshift-6GdDrxg3.js} +0 -0
  384. /package/client/dist/assets/{restructuredtext-Dkiif6fe.js → restructuredtext-CfAB8aRU.js} +0 -0
  385. /package/client/dist/assets/{ruby-C6hLmHy0.js → ruby-CIYK6MXY.js} +0 -0
  386. /package/client/dist/assets/{rust-X8WAGtxB.js → rust-CTHZfjj9.js} +0 -0
  387. /package/client/dist/assets/{sb-4M2la0Kr.js → sb-CkKTdkz_.js} +0 -0
  388. /package/client/dist/assets/{scala-CaCXz58E.js → scala-Bx-Wr9TM.js} +0 -0
  389. /package/client/dist/assets/{scheme-CMdjpmP7.js → scheme-Dcfi6f83.js} +0 -0
  390. /package/client/dist/assets/{scss-QopmvPyp.js → scss-ByL-7PFQ.js} +0 -0
  391. /package/client/dist/assets/{shell-CDBchS00.js → shell-Csnb9Yqd.js} +0 -0
  392. /package/client/dist/assets/{solidity-DvBfi5mC.js → solidity-Dbw5-0QP.js} +0 -0
  393. /package/client/dist/assets/{sophia-HSnXR17u.js → sophia-ZQ3saZQx.js} +0 -0
  394. /package/client/dist/assets/{sparql-DhG_ppup.js → sparql-BEtOel8u.js} +0 -0
  395. /package/client/dist/assets/{specs-CUE3xSFM.js → specs-B5XOoH-02.js} +0 -0
  396. /package/client/dist/assets/{specs-C2wW5bq8.js → specs-B8mwScoM2.js} +0 -0
  397. /package/client/dist/assets/{specs-Bku8SypT.js → specs-Bj_3fDrQ.js} +0 -0
  398. /package/client/dist/assets/{specs-CnH7dOiF.js → specs-CWNKAScX2.js} +0 -0
  399. /package/client/dist/assets/{specs-BvsFNKTs.js → specs-D4z5d8uq.js} +0 -0
  400. /package/client/dist/assets/{specs-D4ORogcT.js → specs-DgvIRZtM.js} +0 -0
  401. /package/client/dist/assets/{specs-D6Y76Bgi.js → specs-DuRzE5wE.js} +0 -0
  402. /package/client/dist/assets/{sql-DHeIS-tf.js → sql-DGPDbzB7.js} +0 -0
  403. /package/client/dist/assets/{st-CMWchiRU.js → st-GeW2MOgh.js} +0 -0
  404. /package/client/dist/assets/{swift-CDXvBefj.js → swift-BVYTN8jq.js} +0 -0
  405. /package/client/dist/assets/{systemverilog-0RTukYUE.js → systemverilog-Deg2a8Lr.js} +0 -0
  406. /package/client/dist/assets/{tcl-CbBF_Ttl.js → tcl-6DnLmROF.js} +0 -0
  407. /package/client/dist/assets/{terminal-BLh00ouM.js → terminal-B2sExUis.js} +0 -0
  408. /package/client/dist/assets/{terminal-Cz_Puz0q.js → terminal-CH0fdHvP.js} +0 -0
  409. /package/client/dist/assets/{terminal-DFEH9XTQ.js → terminal-CPMigUX7.js} +0 -0
  410. /package/client/dist/assets/{terminal-CB33IsO1.js → terminal-DOwfkxqa2.js} +0 -0
  411. /package/client/dist/assets/{terminal-CR6t-Oey.js → terminal-DjSSa5qP.js} +0 -0
  412. /package/client/dist/assets/{terminal-CY_sPfdD.js → terminal-DoMTHedv2.js} +0 -0
  413. /package/client/dist/assets/{terminal-BTanJIt_.js → terminal-w0i-OCp32.js} +0 -0
  414. /package/client/dist/assets/{tickets-D6f3GSYn.js → tickets-CQTana1u.js} +0 -0
  415. /package/client/dist/assets/{tickets-blQnNA4N.js → tickets-D00mSt832.js} +0 -0
  416. /package/client/dist/assets/{tickets-68LH1xp6.js → tickets-D7CSuWjO.js} +0 -0
  417. /package/client/dist/assets/{tickets-OrJwUxJR.js → tickets-Dq7HDy8n.js} +0 -0
  418. /package/client/dist/assets/{tickets-PtHNxQo5.js → tickets-DvbFg_-c2.js} +0 -0
  419. /package/client/dist/assets/{tickets-REr-EQx9.js → tickets-heDAaj8C2.js} +0 -0
  420. /package/client/dist/assets/{tickets-jxsTrApR.js → tickets-onKZz6Dd.js} +0 -0
  421. /package/client/dist/assets/{twig-DCcGd8FE.js → twig-XbbXW9Yz.js} +0 -0
  422. /package/client/dist/assets/{typespec-HTphp-Uh.js → typespec-CRlV8GhI.js} +0 -0
  423. /package/client/dist/assets/{vb-Cb_yUcVd.js → vb-BHE2izPH.js} +0 -0
  424. /package/client/dist/assets/{wgsl-DrKU3YXj.js → wgsl-Bf5vkfmY.js} +0 -0
@@ -0,0 +1,74 @@
1
+ # Controlar o Specrails a partir de qualquer IA (servidor MCP)
2
+
3
+ O Specrails pode expor-se **a si próprio** a qualquer assistente de IA que fale o [Model Context Protocol](https://modelcontextprotocol.io) — Claude Desktop, Claude Code, Cursor, Cline ou o seu próprio agente. Ative-o, aponte o seu assistente para o Specrails e poderá conduzir a app inteira conversando: *"lista os meus projetos", "cria uma spec para login social no projeto da API", "lança o rail 0 e avisa-me quando terminar", "quanto gastei esta semana?"*. O seu assistente invoca as ferramentas do Specrails nos bastidores em vez de ser você a clicar por toda a parte.
4
+
5
+ Este é o sentido oposto das funcionalidades de plugins e "Os meus MCPs aprovados": essas permitem que o Specrails *use* outros servidores MCP; esta permite que outras apps usem o **Specrails**.
6
+
7
+ ## Como ativar
8
+
9
+ Está **desativado por predefinição**. Abra **Definições ▸ MCP** e ligue o **Enable MCP**. É só isso — o servidor arranca imediatamente, sem reiniciar.
10
+
11
+ Mantém o controlo *do que* uma IA externa pode fazer através de um conjunto de níveis de permissão:
12
+
13
+ | Nível | O que permite | Predefinição |
14
+ |---|---|---|
15
+ | **Leitura** | Listar e inspecionar projetos, specs, trabalhos, análises… | Sempre ativo (quando o MCP está ativado) |
16
+ | **Escrita** | Criar e editar specs, alterar definições e configuração de rails | Desativado — ativação opcional |
17
+ | **Invocação de IA** | Ações que correm uma IA e **custam dinheiro** (lançar um rail, gerar uma spec, enviar um turno de chat) | Desativado — ativação opcional |
18
+ | **Destrutivo** | Eliminar projetos/specs/trabalhos, parar trabalho em curso | Desativado — ativação opcional |
19
+
20
+ Se o seu assistente tentar algo abrangido por um nível desativado, o Specrails recusa com uma mensagem clara que lhe diz qual o nível a ativar. Assim, pode começar apenas em modo de leitura e abrir exatamente aquilo de que precisa.
21
+
22
+ ## Ligar o seu assistente
23
+
24
+ O painel mostra um bloco de configuração pronto a colar. O caminho mais simples e universal é a **ponte** (bridge) incorporada (`specrails-mcp`): o seu assistente executa-a e ela retransmite para o Specrails por si. A ponte lê o token de acesso localmente, por isso **o token nunca aparece na configuração do seu assistente**.
25
+
26
+ Num cliente como o Claude Desktop ou o Cursor, a configuração tem este aspeto:
27
+
28
+ ```json
29
+ { "mcpServers": { "specrails": { "command": "specrails-mcp" } } }
30
+ ```
31
+
32
+ Os clientes que suportam servidores MCP HTTP remotos podem, em alternativa, apontar diretamente para `http://127.0.0.1:4200/api/mcp` com o token do painel.
33
+
34
+ Uma vez ligado, o seu assistente vê cerca de **18 ferramentas** que cobrem a app inteira — projetos, specs, rails e trabalhos, chat/Explore, agentes, plugins, Jira, loops, o explorador de código, análises, definições — mais uma ferramenta de **guia** incorporada que lê primeiro, para que perceba como o Specrails funciona sem que lhe explique seja o que for.
35
+
36
+ ## O que pode fazer com ele
37
+
38
+ Algumas receitas assim que o seu assistente estiver ligado. Comece com a **Leitura** ativa e, depois, ligue a **Escrita** e a **Invocação de IA** quando quiser que ele crie e lance trabalho de verdade.
39
+
40
+ **Transforme em specs o trabalho das suas outras ferramentas.** Se o seu assistente também tiver o GitHub, o Jira, o Gmail ou o Slack ligados, ele pode trazer esse trabalho para o Specrails por si:
41
+ > *"Pega nas issues abertas do GitHub desta semana com a etiqueta 'bug', cria uma spec para cada uma no projeto da API e lança-as."*
42
+ >
43
+ > *"Lê os meus emails de feedback de clientes mais recentes, agrupa-os por tema e cria uma spec por tema."*
44
+
45
+ **Piloto automático durante a noite.** Deixe-o a correr com a app no tabuleiro (tray) e volte para encontrar um relatório:
46
+ > *"Aqui estão 12 ideias. Transforma cada uma numa spec, lança-as três de cada vez pelos rails, vigia todos os trabalhos e amanhã dá-me um resumo do que terminou, do que falhou e do que custou."*
47
+
48
+ Mantenha o **Destrutivo** desativado e ele pode trabalhar a noite toda sem nunca eliminar nada.
49
+
50
+ **Em todos os seus projetos.** Algo que o painel não faz por si só:
51
+ > *"Verifica todos os meus projetos. Diz-me quais têm specs no backlog e nenhum rail a correr, e arranca o de prioridade mais alta em cada um."*
52
+
53
+ **Sem usar as mãos enquanto programa.** Conduza o Specrails a partir do seu editor ou por voz, sem trocar de janela:
54
+ > *"Lança o rail 0 em modo ultracode com o Opus para o ticket #42 e avisa-me quando estiver pronto."*
55
+
56
+ **Pergunte sobre custos e histórico.** As suas análises, em linguagem simples:
57
+ > *"Onde gastei mais em IA esta semana, por projeto e por modelo? Mostra-me os cinco tickets mais caros."*
58
+
59
+ **O seu standup diário.**
60
+ > *"Escreve o meu standup: que rails correram ontem, o que terminou, o que falhou, o custo total — em tópicos prontos a colar no Slack."*
61
+
62
+ **Perceba o código.** Sem precisar de editor:
63
+ > *"Que ficheiros é que o ticket #38 tocou? Resume numa linha o que mudou em cada um."*
64
+
65
+ Como o seu assistente lê primeiro o guia incorporado, raramente precisa de nomear ferramentas ou specs — descreva o resultado e ele descobre as chamadas certas.
66
+
67
+ ## Algumas coisas a saber
68
+
69
+ - **O Specrails tem de estar a correr.** O servidor MCP vive dentro da app, por isso o seu assistente só lhe consegue chegar enquanto o Specrails está aberto. Graças ao tabuleiro (tray), fechar a janela mantém-no a correr em segundo plano — só o **Exit** a partir do tabuleiro (barra de menus no Mac / área de notificação no Windows) é que efetivamente o para.
70
+ - **As ações longas transmitem em fluxo.** Lançar um rail ou gerar uma spec devolve resultado de imediato e termina em segundo plano; o seu assistente pode "vigiá-lo" e relatar quando estabilizar.
71
+ - **Segurança.** O MCP usa o seu próprio token de acesso, separado de tudo o resto, e escuta apenas na sua própria máquina (loopback). Pode copiar ou regenerar esse token a qualquer momento a partir do painel.
72
+ - **Não exposto (v1).** Por segurança, algumas capacidades de risco elevado são deliberadamente deixadas de fora: correr comandos de shell no terminal, o browser embutido, a edição de ficheiros dentro da app e a instalação de pré-requisitos do sistema. Tudo o que *gere* o Specrails está disponível; o acesso direto à máquina não está.
73
+
74
+ Pode desativar o MCP a qualquer momento a partir do mesmo painel — o seu assistente simplesmente perde o acesso, e mais nada muda.
@@ -0,0 +1,64 @@
1
+ # Comande o Specrails conversando (Agent Chat)
2
+
3
+ O **Agent Chat** é um copiloto que vive *dentro* do Specrails e pode conduzir a aplicação inteira por você. Em vez de ficar clicando por projetos, specs, trilhos e análises, basta pedir: *«quantos jobs deram certo esta semana?»*, *«cria uma spec para o login social no projeto da API»*, *«lança os três tickets de maior prioridade e me avisa quando terminarem»*. Ele realiza o trabalho chamando as próprias ferramentas do Specrails — as mesmas que o [servidor MCP](./5-mcp-server.md) expõe — enquanto você vê o painel se atualizar ao vivo por trás dele.
4
+
5
+ > **Não confunda com os agentes do pipeline.** A seção *Agentes* (Architect → Developer → Reviewer) trata de *como um trilho implementa uma spec*. O **Agent Chat** é um único assistente que *opera a própria aplicação*. Coisas diferentes, mesma palavra.
6
+
7
+ ## Como abrir
8
+
9
+ Há uma **bolha** flutuante na parte inferior da janela — clique nela para abrir o painel, ou pressione **⌘⇧A** (**Ctrl+Shift+A** no Windows/Linux) de qualquer lugar. O painel é uma janela de verdade que você pode mover, redimensionar, maximizar e devolver à bolha; ele lembra onde você o deixou.
10
+
11
+ Ele é **não modal de propósito**: o painel por trás continua vivo, então quando o agente lança um trilho ou cria uma spec você o vê aparecer em tempo real — não está olhando para uma tela congelada.
12
+
13
+ ## Pré-requisito: o servidor MCP
14
+
15
+ O Agent Chat opera a aplicação através do **servidor MCP do Specrails** integrado, então ele precisa estar ativo. Se não estiver, o painel abre com um banner de **Ativar Specrails MCP** de um clique — pressione-o e está pronto (sem reiniciar). Veja [Controle o Specrails a partir de qualquer IA](./5-mcp-server.md) para os detalhes; nada é instalado, tudo é local na sua máquina.
16
+
17
+ ## Escolher sobre o que ele trabalha
18
+
19
+ O cabeçalho tem um **seletor de projeto** (como o do Cursor). Escolha um projeto e tudo o que você pedir fica restrito a ele — *«lança os de alta prioridade»* se resolve contra esse projeto. Deixe-o em **Início** e o agente trabalha sobre toda a sua configuração: ele pode listar ou criar projetos e responder perguntas que abrangem tudo. Se você pedir algo específico de um projeto estando em Início, ele vai perguntar qual (ou se oferecer para criar um) em vez de adivinhar.
20
+
21
+ Escolher um projeto aqui **não** move o seu painel — o alvo do agente e o que você está vendo são independentes.
22
+
23
+ ## Provedor e modelo
24
+
25
+ Logo acima da caixa de mensagem você escolhe o **provedor** (Claude, Codex ou Gemini) e o seu **modelo**. Cada provedor tem a sua própria lista de modelos, e trocar de provedor inicia uma sessão nova com o modelo padrão daquele provedor — assim você pode, por exemplo, conduzir a aplicação com o Claude e passar para o Codex em outra conversa sem que nada se misture.
26
+
27
+ ## Níveis de permissão — a rédea está com você
28
+
29
+ O agente pode mexer na aplicação inteira, então você decide quanta liberdade ele tem por meio de um **nível** que você muda ao vivo pressionando **Shift+Tab** (o mesmo ciclo que o Claude Code usa). Cada nível inclui tudo o que está abaixo:
30
+
31
+ | Nível | O que ele pode fazer |
32
+ |---|---|
33
+ | 👀 **Observa** | Somente leitura — listar e inspecionar projetos, specs, jobs, análises. Nada muda. |
34
+ | ✍️ **Edita** | O acima **+** criar e editar (specs, ajustes, configuração de trilhos) — mudanças reversíveis. |
35
+ | ⚡ **Opera** | O acima **+** lançar trabalho de IA que **custa dinheiro** (trilhos, geração de specs). |
36
+ | 🔥 **Autônomo** | O acima **+** apagar e parar coisas — ações irreversíveis. |
37
+
38
+ Comece em **Observa** e suba o nível apenas quando quiser que o agente aja. Se ele tentar algo acima do nível atual, ele para e diz exatamente qual nível ativar — nunca contorna o limite. Isso é separado dos níveis de Ajustes ▸ MCP, que regem os assistentes *externos*; o nível aqui é só para este agente interno da aplicação.
39
+
40
+ ## Algumas coisas que você pode pedir
41
+
42
+ Quando estiver em **Opera**, experimente:
43
+
44
+ > *«Lista todas as specs pendentes do projeto da API e depois lança as três de maior prioridade em trilhos separados e fica de olho nelas.»*
45
+ >
46
+ > *«Quanto gastei esta semana, detalhado por projeto?»*
47
+ >
48
+ > *«Cria uma spec para um botão de alternância de modo escuro no projeto web, com Contract Layer.»*
49
+ >
50
+ > *«Algo falhou no último lote — encontra os jobs que falharam e resume o porquê.»*
51
+
52
+ As respostas chegam de forma fluida e já formatadas (títulos, tabelas, listas), cada uma com um pequeno botão de **copiar**. Uma etiqueta de status embaixo mostra o que o agente está fazendo agora — *Pensando…*, *MCP · jobs*, *Terminal* — para que você sempre saiba o estado dele.
53
+
54
+ ## Detalhes práticos
55
+
56
+ - **Histórico de prompts.** Com a caixa vazia, pressione **↑**/**↓** para percorrer o que você perguntou antes (mostrado esmaecido enquanto rola); comece a digitar para editar, ou pressione Enter para enviar.
57
+ - **Minimize sem perder nada.** Clique no ✕ para devolver o painel à bolha — a conversa continua rodando. Reabra e você chega na mensagem mais recente; nada é redigitado.
58
+ - **Nova conversa.** O botão **+** inicia um fio limpo; o histórico vive no nível da aplicação, acima de qualquer projeto individual.
59
+
60
+ ## Algumas coisas para saber
61
+
62
+ - **Opera e Autônomo custam dinheiro** porque executam IA. O agente destaca as ações que geram custo antes de fazê-las; mantenha o nível em Observa ou Edita se você só quer olhar e organizar.
63
+ - **O agente é de toda a aplicação**, não está atrelado ao projeto que você tem aberto — é por isso que ele tem o próprio seletor e o histórico dele não é por projeto.
64
+ - **Ele é tão capaz quanto o MCP permitir.** Se uma área inteira parecer bloqueada, verifique se o servidor MCP está ativado.
@@ -0,0 +1,74 @@
1
+ # 从任意 AI 操控 Specrails(MCP 服务器)
2
+
3
+ Specrails 可以把**自己**暴露给任何会说 [Model Context Protocol](https://modelcontextprotocol.io) 的 AI 助手——Claude Desktop、Claude Code、Cursor、Cline,或者你自己的 agent。打开这个功能,把你的助手指向 Specrails,你就能靠聊天来驱动整个应用:*「列出我的项目」「在 API 项目里为社交登录创建一份规格」「启动 rail 0,跑完了告诉我」「我这周花了多少钱?」*。你的助手会在幕后调用 Specrails 的工具,而不用你点来点去。
4
+
5
+ 这和插件以及「My approved MCPs」功能的方向正好相反:那些功能是让 Specrails 去*使用*别的 MCP 服务器;而这个功能是让别的应用来使用 **Specrails**。
6
+
7
+ ## 打开它
8
+
9
+ 它**默认是关闭的**。打开 **Settings ▸ MCP**,把 **Enable MCP** 拨开。就这样——服务器会立即启动,无需重启。
10
+
11
+ 通过一组权限层级,你可以始终掌控外部 AI 能透过它做*哪些*事:
12
+
13
+ | 层级 | 它允许什么 | 默认 |
14
+ |---|---|---|
15
+ | **Read** | 列出并查看项目、规格、任务、分析数据等等…… | 始终开启(在 MCP 启用时) |
16
+ | **Write** | 创建和编辑规格、修改设置与 rail 配置 | 关闭——需手动开启 |
17
+ | **AI-spawn** | 会运行 AI 并**产生费用**的操作(启动一条 rail、生成一份规格、发送一次聊天) | 关闭——需手动开启 |
18
+ | **Destructive** | 删除项目 / 规格 / 任务,停止正在运行的工作 | 关闭——需手动开启 |
19
+
20
+ 如果你的助手试图做某个被禁用层级所涵盖的事,Specrails 会拒绝,并给出一条清晰的提示,告诉你该打开哪个层级。所以你可以先从只读开始,再精确地放开你需要的部分。
21
+
22
+ ## 连接你的助手
23
+
24
+ 面板会显示一段可直接粘贴的配置块。最简单、最通用的方式是使用内置的**桥接**(`specrails-mcp`):你的助手运行它,由它代你转发到 Specrails。这个桥接会在本地读取访问令牌,所以**令牌绝不会出现在你助手的配置里**。
25
+
26
+ 在像 Claude Desktop 或 Cursor 这样的客户端里,配置看起来是这样:
27
+
28
+ ```json
29
+ { "mcpServers": { "specrails": { "command": "specrails-mcp" } } }
30
+ ```
31
+
32
+ 支持远程 HTTP MCP 服务器的客户端,则可以直接指向 `http://127.0.0.1:4200/api/mcp`,并配上面板里的令牌。
33
+
34
+ 一旦连上,你的助手会看到大约 **18 个工具**,覆盖整个应用——项目、规格、rail 和任务、聊天 / Explore、agent、插件、Jira、loop、代码浏览器、分析、设置——外加一个内置的**指南(guide)**工具,它会先读这个工具,从而无需你解释任何东西就能理解 Specrails 是怎么运作的。
35
+
36
+ ## 你能用它做些什么
37
+
38
+ 连上助手后,这里有几个上手的小配方。先打开 **Read**,等你真想让它创建并启动工作时,再打开 **Write** 和 **AI-spawn**。
39
+
40
+ **把你其他工具里的工作变成规格。** 如果你的助手还连着 GitHub、Jira、Gmail 或 Slack,它就能替你把这些工作搬进 Specrails:
41
+ > *「把本周打了 'bug' 标签的开放 GitHub issue 拿过来,在 API 项目里为每个创建一份规格,然后启动它们。」*
42
+ >
43
+ > *「读一下我最近的客户反馈邮件,按主题分组,每个主题创建一份规格。」*
44
+
45
+ **通宵自动驾驶。** 让应用待在托盘里跑着,回来时就能拿到一份报告:
46
+ > *「这里有 12 个点子。把每个变成一份规格,在 rail 上每次三个地启动它们,盯着每一个任务,明天给我一份总结:哪些完成了、哪些失败了、各花了多少钱。」*
47
+
48
+ 只要让 **Destructive** 保持关闭,它就能跑一整夜而绝不会删掉任何东西。
49
+
50
+ **横跨你所有的项目。** 这是 dashboard 自己做不到的事:
51
+ > *「检查我所有的项目。告诉我哪些在 backlog 里有规格却没有 rail 在跑,并在每个项目里启动优先级最高的那一个。」*
52
+
53
+ **写代码时不用动手。** 从你的编辑器里或用语音来驱动 Specrails,无需切换窗口:
54
+ > *「用 Opus、以 ultracode 模式在 rail 0 上为任务 #42 启动一条 rail,跑完了告诉我。」*
55
+
56
+ **询问费用和历史。** 用大白话查你的分析数据:
57
+ > *「我这周在 AI 上花得最多的是哪里,按项目、按模型分别列出来?给我看最贵的五个任务。」*
58
+
59
+ **你的每日站会。**
60
+ > *「帮我写站会汇报:昨天哪些 rail 跑了、哪些完成了、哪些失败了、总花费多少——做成可以直接粘进 Slack 的要点列表。」*
61
+
62
+ **读懂代码。** 不需要编辑器:
63
+ > *「任务 #38 改动了哪些文件?用一句话总结每个文件改了什么。」*
64
+
65
+ 因为你的助手会先读那份内置指南,所以你很少需要点名具体的工具或规格——描述你想要的结果,它就能算出该调用哪些工具。
66
+
67
+ ## 几点须知
68
+
69
+ - **Specrails 必须在运行。** MCP 服务器活在应用内部,所以只有在 Specrails 开着的时候,你的助手才能连上它。多亏了托盘,关掉窗口它仍会在后台运行——只有从托盘(Mac 菜单栏 / Windows 系统托盘)选择 **Exit**,才会真正把它停掉。
70
+ - **长任务会流式返回。** 启动一条 rail 或生成一份规格会立即返回,并在后台完成;你的助手可以「盯着」它,等它尘埃落定再回来报告。
71
+ - **安全。** MCP 使用它自己专属的访问令牌,与其他一切都分开,并且只监听你自己的机器(本地回环)。你随时可以从面板里复制或重新生成那个令牌。
72
+ - **未暴露的部分(v1)。** 出于安全考虑,有几项高风险能力被刻意排除在外:在终端里执行 shell 命令、内嵌浏览器、应用内文件编辑,以及安装系统先决条件。一切*管理* Specrails 的能力都开放可用;对机器的原始访问则不开放。
73
+
74
+ 你随时可以从同一个面板禁用 MCP——你的助手只是会失去访问权,其余一切照旧。
@@ -0,0 +1,64 @@
1
+ # 用对话操作 Specrails(Agent Chat)
2
+
3
+ **Agent Chat** 是一个住在 Specrails *内部*的副驾驶,可以替你驱动整个应用。你不必再在项目、规格、轨道和分析之间来回点击,只需开口就行:*「这周有多少任务成功了?」*、*「在 API 项目里为社交登录创建一份规格」*、*「启动优先级最高的三个工单,完成后告诉我」*。它通过调用 Specrails 自己的工具来完成工作——正是 [MCP 服务器](./5-mcp-server.md)所暴露的那些工具——与此同时你能看到后面的仪表盘实时更新。
4
+
5
+ > **不要与流水线智能体混淆。** *智能体*板块(Architect → Developer → Reviewer)讲的是*轨道如何实现一份规格*。而 **Agent Chat** 是一个*操作应用本身*的单一助手。两回事,同一个词。
6
+
7
+ ## 如何打开
8
+
9
+ 窗口底部有一个漂浮的**气泡**——点击它即可打开面板,或在任何地方按 **⌘⇧A**(Windows/Linux 上为 **Ctrl+Shift+A**)。面板是一个真正的窗口,你可以移动、缩放、最大化,也可以把它收回气泡;它会记住你上次放的位置。
10
+
11
+ 它**特意设计为非模态**:后面的仪表盘保持鲜活,所以当智能体启动一条轨道或创建一份规格时,你能实时看到它出现——你面对的不是一块冻结的屏幕。
12
+
13
+ ## 前提条件:MCP 服务器
14
+
15
+ Agent Chat 通过内嵌的 **Specrails MCP 服务器**来驱动应用,因此它必须处于开启状态。如果没有开启,面板会打开并显示一个一键式的**启用 Specrails MCP** 横幅——按一下即可就绪(无需重启)。详情见[从任意 AI 控制 Specrails](./5-mcp-server.md);不安装任何东西,一切都在你本机本地运行。
16
+
17
+ ## 选择它作用的对象
18
+
19
+ 标题栏有一个**项目选择器**(就像 Cursor 的那样)。选定一个项目,你提出的一切都会限定在它之内——*「启动高优先级的那些」*会针对那个项目来解析。把它留在**首页**,智能体就在你的整套配置上工作:它可以列出或创建项目,并回答涵盖全局的问题。如果你在首页却问了某个项目专属的事情,它会反问你是哪个项目(或主动提议创建一个),而不是瞎猜。
20
+
21
+ 在这里选择项目**不会**移动你的仪表盘——智能体的目标和你正在看的内容是彼此独立的。
22
+
23
+ ## 提供方与模型
24
+
25
+ 在消息框正上方,你可以选择**提供方**(Claude、Codex 或 Gemini)及其**模型**。每个提供方都有各自的模型清单,切换提供方会以该提供方的默认模型开启一段全新会话——因此你可以,比如说,用 Claude 驱动应用,再切到 Codex 进行另一段对话,两者互不串扰。
26
+
27
+ ## 权限级别——缰绳在你手里
28
+
29
+ 智能体可以触及整个应用,因此由你来决定给它多大的自由,方法是按 **Shift+Tab** 实时切换的一个**级别**(与 Claude Code 使用的是同一套循环)。每个级别都包含其下方的一切:
30
+
31
+ | 级别 | 它能做什么 |
32
+ |---|---|
33
+ | 👀 **观察** | 只读——列出并查看项目、规格、任务、分析。什么都不会改变。 |
34
+ | ✍️ **编辑** | 以上 **+** 创建和编辑(规格、设置、轨道配置)——可撤销的改动。 |
35
+ | ⚡ **操作** | 以上 **+** 启动**会产生费用**的 AI 工作(轨道、规格生成)。 |
36
+ | 🔥 **自主** | 以上 **+** 删除和停止各种东西——不可逆的操作。 |
37
+
38
+ 从**观察**开始,只有当你想让智能体动手时才提升级别。如果它尝试超出当前级别的操作,它会停下来,并准确告诉你需要切换到哪个级别——它绝不会绕过限制。这与 设置 ▸ MCP 的分级是相互独立的,后者管辖的是*外部*助手;这里的级别只针对这个应用内的智能体。
39
+
40
+ ## 一些可以让它做的事
41
+
42
+ 进入**操作**后,试试:
43
+
44
+ > *「列出 API 项目里所有待办规格,然后把优先级最高的三个分别放到独立的轨道上启动并盯着它们。」*
45
+ >
46
+ > *「我这周花了多少钱,按项目拆分一下?」*
47
+ >
48
+ > *「在 web 项目里为深色模式开关创建一份规格,带上 Contract Layer。」*
49
+ >
50
+ > *「上一批里有东西失败了——找出失败的任务并总结原因。」*
51
+
52
+ 回复会顺滑地流式呈现,并已排版落地(标题、表格、列表),每一段都带一个小小的**复制**按钮。底部的状态标签会显示智能体此刻正在做什么——*思考中……*、*MCP · jobs*、*Terminal*——让你随时了解它的状态。
53
+
54
+ ## 贴心细节
55
+
56
+ - **提示词历史。** 在输入框为空时,按 **↑**/**↓** 浏览你之前问过的内容(滚动时以淡化样式显示);开始输入即可编辑,或按回车发送。
57
+ - **最小化,而不丢失。** 点击 ✕ 把面板收回气泡——对话仍在继续运行。重新打开时你会落在最新一条消息上;无需重新输入任何内容。
58
+ - **新建对话。** **+** 按钮开启一段全新的线程;历史记录存在于整个应用层面,凌驾于任何单个项目之上。
59
+
60
+ ## 一些需要知道的事
61
+
62
+ - **操作和自主会产生费用**,因为它们运行 AI。智能体会在执行会产生费用的操作前把它们摆到明面上;如果你只想查看和整理,就把级别保持在观察或编辑。
63
+ - **智能体是全应用范围的**,并不绑定于你当前打开的项目——这正是它拥有自己的选择器、且历史记录不按项目区分的原因。
64
+ - **它的能力上限取决于 MCP 允许的范围。** 如果整个区域看起来都被禁用,请检查 MCP 服务器是否已启用。
package/docs/mcp.md ADDED
@@ -0,0 +1,249 @@
1
+ # The Specrails MCP server
2
+
3
+ Specrails Desktop can expose itself to **any MCP client** — Claude Desktop,
4
+ Claude Code, Cursor, or your own agent — as a local
5
+ [Model Context Protocol](https://modelcontextprotocol.io) server. Turn it on
6
+ and an external LLM can drive the whole dashboard: list your projects, read and
7
+ create specs, launch the AI pipeline, watch jobs settle, inspect analytics, and
8
+ more — through ~18 well-described tools instead of clicking around the UI.
9
+
10
+ > **Just want to get going?** Open **Settings ▸ MCP**, flip **Enable MCP** on,
11
+ > click **Copy client config**, and paste it into your MCP client. By default
12
+ > only **read** actions are allowed; turn on the **Write** / **AI-spawn** /
13
+ > **Destructive** tiers when you want the agent to actually change things or
14
+ > spend money. Everything below is detail for when you need it.
15
+
16
+ This is the **app talking to an outside agent** — the opposite direction from
17
+ the [Serena plugin](running-pipelines.md#plugins) or
18
+ `codex mcp add`, where Specrails *consumes* an MCP server. Here Specrails *is*
19
+ the server.
20
+
21
+ The MCP server is **off by default** and entirely local: it listens only on
22
+ loopback (`127.0.0.1`), is authenticated by a token separate from the app's
23
+ master token, and serves nothing until you explicitly enable it in Settings.
24
+
25
+ ## What the MCP exposes
26
+
27
+ When enabled, the server registers a compact catalog of **domain-facade tools**
28
+ plus a few **meta tools**, a set of read-only **resources**, and a self-contained
29
+ **guide** an LLM can read to learn the platform with no prior knowledge.
30
+
31
+ ### Tools (~18)
32
+
33
+ Each domain is a single tool with an `action` enum, rather than dozens of
34
+ narrow tools — so the catalog stays small and an agent discovers actions by
35
+ reading one description. The tools are:
36
+
37
+ | Tool | What it covers |
38
+ |---|---|
39
+ | `specrails_projects` | List / resolve projects; unregister (destructive) |
40
+ | `specrails_specs` | The spec/ticket backlog: list, get, create, update, delete, drafts, AI generate, AI-edit, Contract Refine, SMASH, per-ticket spend |
41
+ | `specrails_rails` | Assign tickets to a rail, configure it, and launch the pipeline |
42
+ | `specrails_jobs` | Inspect, stream, and stop pipeline jobs |
43
+ | `specrails_chat` | Explore / sidebar chat conversations and turns |
44
+ | `specrails_agents` | Agent profiles and the agents catalog (Claude-only features) |
45
+ | `specrails_plugins` | The per-project plugin marketplace (install / verify / uninstall) |
46
+ | `specrails_jira` | The Jira integration (connect, sync, outbox) |
47
+ | `specrails_loops` | Saved loop workflows |
48
+ | `specrails_code` | The read-only code explorer (tree, file, summaries, provenance) |
49
+ | `specrails_setup` | Add-project setup wizard surface |
50
+ | `specrails_analytics` | Per-project spending analytics + budget |
51
+ | `specrails_settings` | App-level settings |
52
+ | `specrails_watch` | Await the real result of an async (cost-incurring) action |
53
+ | `specrails_guide` | Returns the platform guide — read this first |
54
+ | `specrails_search` | Find the right tool/action for an intent |
55
+ | `specrails_describe` | Full description + input schema for a named tool |
56
+ | `specrails_select_project` | Set an active project so later calls can omit `projectId` |
57
+
58
+ Almost every domain tool is **project-scoped** and takes a `projectId`. Calling
59
+ `specrails_select_project` first lets later calls omit it.
60
+
61
+ ### Resources
62
+
63
+ Read-only state is also exposed as MCP **resources** so a client can fetch it
64
+ without a tool call:
65
+
66
+ - `specrails://guide` — the platform guide (concepts, workflow, invariants).
67
+ - `specrails://projects` — all registered projects.
68
+ - `specrails://projects/{projectId}` — a single project.
69
+
70
+ ### Async results — `specrails_watch`
71
+
72
+ Cost-incurring and streaming actions (launch a rail, generate a spec, send a
73
+ chat turn, AI-edit, Contract Refine, SMASH) **return immediately** with a
74
+ reference (a `jobId` / `requestId`) and emit their **real** result over the
75
+ app's WebSocket bus. An agent gets the actual outcome by calling
76
+ `specrails_watch` with that reference; it waits for the operation to settle and
77
+ returns the final result. Don't assume success from the acceptance alone — this
78
+ is spelled out in `specrails_guide`.
79
+
80
+ ## The four permission tiers
81
+
82
+ Every tool declares one tier. The server refuses any tool whose tier is not
83
+ enabled, and the refusal **names the tier the user must turn on** so the agent
84
+ can relay it rather than retrying blindly. The tiers are **opt-in and
85
+ cumulative** — read is always on, the rest are off until you enable them in
86
+ **Settings ▸ MCP**:
87
+
88
+ | Tier | Default | What it allows |
89
+ |---|---|---|
90
+ | **Read** | Always on | Queries + resources (list specs, read analytics, inspect jobs) |
91
+ | **Write** | Off | Mutating but non-destructive, non-spawn: create/edit specs, change settings, configure a rail |
92
+ | **AI-spawn** | Off | Actions that spawn an AI CLI and **cost money**: launch a rail, generate a spec, send a chat turn |
93
+ | **Destructive** | Off | Delete data, kill processes, or mutate an external system (e.g. unregister a project, `smash_undo`, Jira writes) |
94
+
95
+ The split is deliberate: a client you only half-trust can be left read-only;
96
+ **destructive and cost-incurring actions are opt-in** and never happen by
97
+ accident. A tool's tier is dynamic per action — e.g. `specrails_specs(list)` is
98
+ read while `specrails_specs(delete)` is destructive — so the same tool exposes
99
+ different actions at different trust levels.
100
+
101
+ ## Enabling it
102
+
103
+ 1. Open the app and go to **Settings ▸ MCP**.
104
+ 2. Toggle **Enable MCP**. This boots the embedded transport immediately — no
105
+ app restart. (Behind the scenes it persists `mcp_enabled` and starts serving
106
+ `/api/mcp`.)
107
+ 3. Enable the permission tiers you want (**Write** / **AI-spawn** /
108
+ **Destructive**). Leave them off to keep the agent read-only.
109
+ 4. Click **Copy client config** to grab a ready-to-paste configuration, or
110
+ **Copy token** if your client needs the raw token (for the direct-HTTP path
111
+ below).
112
+
113
+ Toggling the enable switch off again tears down all open MCP sessions
114
+ immediately.
115
+
116
+ ## Connecting a client
117
+
118
+ There are two ways to connect, and **the stdio bridge is the recommended,
119
+ universal one.**
120
+
121
+ ### Option A — the stdio bridge `specrails-mcp` (recommended)
122
+
123
+ Most MCP clients (Claude Desktop, Claude Code, Cursor) speak MCP over **stdio**:
124
+ they launch a command and talk to it on stdin/stdout. Specrails ships a tiny
125
+ relay, **`specrails-mcp`**, bundled with the app. It transparently forwards MCP
126
+ stdio from your client to the embedded HTTP server on loopback — and it reads
127
+ the scoped token from `~/.specrails/mcp.token` **locally**, so the token never
128
+ appears in your client's config file.
129
+
130
+ A typical client config looks like:
131
+
132
+ ```json
133
+ {
134
+ "mcpServers": {
135
+ "specrails": {
136
+ "command": "specrails-mcp"
137
+ }
138
+ }
139
+ }
140
+ ```
141
+
142
+ Use the exact command/path from the panel's **Copy client config** button — it
143
+ fills in the path to the bundled bridge for your platform. No token, no URL, no
144
+ port to manage; the bridge handles all of it. If the Specrails app isn't
145
+ running, the bridge replies with a clear *"Specrails app is not running. Start
146
+ the Specrails Desktop app, then retry."* rather than a cryptic connection error.
147
+
148
+ ### Option B — the direct HTTP URL (remote-HTTP clients)
149
+
150
+ Clients that speak MCP's **streamable-HTTP** transport directly can skip the
151
+ bridge and connect to:
152
+
153
+ ```
154
+ http://127.0.0.1:4200/api/mcp
155
+ ```
156
+
157
+ with the scoped token as a bearer header:
158
+
159
+ ```
160
+ Authorization: Bearer <your mcp token>
161
+ ```
162
+
163
+ Get the token from **Settings ▸ MCP ▸ Copy token** (or read
164
+ `~/.specrails/mcp.token`). The endpoint is **loopback-only** — it rejects any
165
+ request that doesn't originate from `127.0.0.1`, so this path is for local
166
+ HTTP-capable clients, not for exposing Specrails on a network. (`4200` is the
167
+ default app port; if you've changed it, the panel's config reflects the real
168
+ one.)
169
+
170
+ ## Security model
171
+
172
+ - **A scoped token, not the master token.** The MCP surface is authenticated by
173
+ its own token at `~/.specrails/mcp.token` (mode `0600`), completely separate
174
+ from the app's all-powerful master token (`~/.specrails/desktop.token`). The
175
+ master token grants terminals (shell), arbitrary AI-CLI spawns, and project
176
+ admin; handing that to a third-party MCP client would be a security smell. The
177
+ scoped token only reaches the four tiered surfaces above. You can rotate it
178
+ any time with **Regenerate token** in Settings — the old token stops working
179
+ immediately.
180
+ - **Loopback only.** Both the transport (`/api/mcp`) and the admin control plane
181
+ (`/api/mcp-admin`) require the request to come from `127.0.0.1`. There is no
182
+ network ingress; an MCP client must run on the same machine.
183
+ - **Tiers, not blanket access.** Even with a valid token, an agent can only do
184
+ what the enabled tiers allow (read by default). High-risk actions stay opt-in.
185
+ - **The app must be running.** The MCP server is embedded in the desktop app's
186
+ process — there is no standalone daemon. The Tauri shell keeps it alive even
187
+ when you close the main window: closing the window **minimizes to the system
188
+ tray / menu bar** and leaves the embedded server running, so your MCP client
189
+ stays connected. The server stops only when you choose **Exit** from the tray
190
+ menu (or the OS truly quits the app). If the app isn't running, the bridge
191
+ tells you to start it.
192
+
193
+ ## v1 limitations — what is *not* exposed
194
+
195
+ The tool catalog deliberately leaves the highest-risk execution vectors out of
196
+ v1. None of these are reachable over MCP:
197
+
198
+ - **Terminal shell execution.** The built-in terminal panel runs arbitrary
199
+ shell commands; the MCP surface does **not** expose it. An agent cannot run
200
+ shell on your machine through Specrails.
201
+ - **Browser capture.** No browser navigation / screenshot / capture tool.
202
+ - **In-app file write.** The code explorer is **read-only** over MCP — there is
203
+ no source-file overwrite tool (`code_write_file`). An agent can read files and
204
+ AI-generated summaries, but cannot edit your code directly through MCP. (AI
205
+ *rails* still write code — that's the pipeline, gated behind the AI-spawn
206
+ tier — but there is no direct file-overwrite tool.)
207
+ - **The prerequisite installer.** The `uv`/remote-script prerequisite installer
208
+ is not exposed, so an agent cannot trigger remote-script installs.
209
+ - The global Claude marketplace / `~/.claude/settings.json` mutation is also
210
+ out of scope.
211
+
212
+ These boundaries are intentional and may be revisited in a later version.
213
+
214
+ ## Troubleshooting
215
+
216
+ **My client can't connect / "app is not running"** — start the Specrails
217
+ Desktop app. The MCP server is embedded in the app process; it isn't a separate
218
+ daemon. If the window is hidden, the app is still running in the tray/menu bar —
219
+ look for the Specrails icon there. Only the tray **Exit** stops the server.
220
+
221
+ **Every tool is refused with a "permission tier" message** — the action needs a
222
+ tier you haven't enabled. Open **Settings ▸ MCP** and turn on **Write** /
223
+ **AI-spawn** / **Destructive** as appropriate. Read-only actions work with no
224
+ extra tiers.
225
+
226
+ **`401 Unauthorized: invalid MCP token`** (direct-HTTP path) — the bearer token
227
+ is wrong or stale. Re-copy it from **Settings ▸ MCP ▸ Copy token**, or
228
+ **Regenerate token** and update your client. The stdio bridge avoids this
229
+ entirely (it reads the token locally).
230
+
231
+ **The agent assumed a rail succeeded but it didn't** — cost-incurring actions
232
+ return a reference, not a result. The agent must call `specrails_watch` with the
233
+ returned `jobId`/`requestId` to get the real outcome. This is documented in
234
+ `specrails_guide`; point the agent at it.
235
+
236
+ **Connection refused on `:4200`** — that's the default app port. If you changed
237
+ the port in Settings, use the URL from **Copy client config**, which reflects
238
+ the real port. The bridge resolves the port automatically.
239
+
240
+ ## See also
241
+
242
+ - [Running pipelines](running-pipelines.md) — what rails, jobs, and the
243
+ pipeline an MCP client drives actually do.
244
+ - [Creating specs](creating-specs.md) — specs, drafts, SMASH, and Contract
245
+ Refine, all reachable via `specrails_specs`.
246
+ - [Tracking cost](tracking-cost.md) — the analytics an agent reads via
247
+ `specrails_analytics`.
248
+ - [Customising the app](customizing.md) — other settings, including the budget
249
+ the AI-spawn tier respects.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.16.0",
3
+ "version": "2.18.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,15 +24,16 @@
24
24
  "dev:server": "tsx watch server/index.ts",
25
25
  "dev:client": "cd client && npm run dev",
26
26
  "dev:desktop": "tauri dev",
27
- "build:server": "node -e \"require('fs').rmSync('server/dist',{recursive:true,force:true})\" && tsc --project tsconfig.json",
27
+ "build:server": "node -e \"require('fs').rmSync('server/dist',{recursive:true,force:true})\" && tsc --project tsconfig.build.json --noCheck",
28
28
  "build:cli": "tsc --project tsconfig.cli.json",
29
29
  "build": "npm run build:server && cd client && npm run build && cd .. && npm run build:cli",
30
30
  "build:sidecar": "node scripts/build-sidecar.mjs",
31
- "build:desktop": "npm run build:server && cd client && npm run build && cd .. && npm run build:sidecar && tauri build",
31
+ "build:mcp-bridge": "node scripts/build-mcp-bridge.mjs",
32
+ "build:desktop": "npm run build:server && cd client && npm run build && cd .. && npm run build:sidecar && npm run build:mcp-bridge && tauri build",
32
33
  "assemble-runtimes": "node scripts/assemble-runtimes-local.mjs",
33
34
  "build:desktop:local": "npm run assemble-runtimes && npm run build:desktop",
34
35
  "generate-icons": "tauri icon src-tauri/icons/icon.svg",
35
- "typecheck": "tsc --noEmit && tsc -p tsconfig.cli.json --noEmit && cd client && tsc --noEmit",
36
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.cli.json --noEmit && tsc -p mcp-bridge/tsconfig.json --noEmit && cd client && tsc --noEmit",
36
37
  "check-core-compat": "tsx scripts/check-core-compat.ts",
37
38
  "test": "vitest run && tsx scripts/check-core-compat.ts",
38
39
  "test:watch": "vitest",
@@ -42,6 +43,7 @@
42
43
  "ci": "npm run typecheck && npm run check-core-compat && npm run test:coverage && cd client && npm run test:coverage"
43
44
  },
44
45
  "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.29.0",
45
47
  "@tailwindcss/typography": "^0.5.19",
46
48
  "ajv": "^8.17.1",
47
49
  "better-sqlite3": "^12.8.0",
@@ -57,7 +59,8 @@
57
59
  "selfsigned": "^5.5.0",
58
60
  "tree-kill": "^1.2.2",
59
61
  "werift": "^0.23.0",
60
- "ws": "^8.16.0"
62
+ "ws": "^8.16.0",
63
+ "zod": "^3.25.76"
61
64
  },
62
65
  "devDependencies": {
63
66
  "@tauri-apps/cli": "^2.0.0",