specrails-desktop 2.32.0 → 2.34.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 (228) hide show
  1. package/client/dist/assets/{ActivityFeedPage-DvnFkjVG.js → ActivityFeedPage-DIDxNsDj.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-CBjcliD7.js → AgentBrowserCapture-7pJ2G5VY.js} +1 -1
  3. package/client/dist/assets/AgentModeAnalyticsPane-BSSyTnTM.js +2 -0
  4. package/client/dist/assets/{AgentModeCodePane-CokuFVdV.js → AgentModeCodePane-DzW6gvDw.js} +2 -2
  5. package/client/dist/assets/{AgentModeJobsPane-rf_DlWNo.js → AgentModeJobsPane-9wJff15f.js} +1 -1
  6. package/client/dist/assets/AgentsPage-CIA67psb.js +87 -0
  7. package/client/dist/assets/AnalyticsPage-C0LwYELz.js +1 -0
  8. package/client/dist/assets/CodePage-RtKvHmAO.js +2 -0
  9. package/client/dist/assets/{DesktopAnalyticsPage-gBRVqiw6.js → DesktopAnalyticsPage-BU8Y_Ts1.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-BzO5dg2B.js → DocsDialog-DIpoaGlQ.js} +1 -1
  11. package/client/dist/assets/{DocsPage-Db_uxr1j.js → DocsPage-ME47KZpK.js} +1 -1
  12. package/client/dist/assets/InteractiveJobComposer-BGjIe9R6.js +19 -0
  13. package/client/dist/assets/{JobDetailModal-DPHh2WOS.js → JobDetailModal-1UZkqH4I.js} +1 -1
  14. package/client/dist/assets/JobDetailPage-CN65sAf1.js +1 -0
  15. package/client/dist/assets/JobsPage-f-4dqys7.js +1 -0
  16. package/client/dist/assets/LoopBuilderPage-WeiofeL6.js +7 -0
  17. package/client/dist/assets/LoopPreviewModal-DDTnTyH0.js +1 -0
  18. package/client/dist/assets/LoopsPage-BVNchIex.js +1 -0
  19. package/client/dist/assets/MinimizedChatsContext-CHsu3NCX.js +1 -0
  20. package/client/dist/assets/PluginsPage-CdFzGEfQ.js +2 -0
  21. package/client/dist/assets/ProjectSettingsDialog-BkCXBQWk.js +1 -0
  22. package/client/dist/assets/TemplatePreviewModal-RDi0khFG.js +1 -0
  23. package/client/dist/assets/TicketDetailModal-MhJzrqbi.js +14 -0
  24. package/client/dist/assets/{Trans-B2i5HVcM.js → Trans-CTqw6rr9.js} +1 -1
  25. package/client/dist/assets/{addspec-DhmnXER8.js → addspec-A1lDQa4M.js} +1 -1
  26. package/client/dist/assets/{addspec-BRlk8jON.js → addspec-BHZd0N5F.js} +1 -1
  27. package/client/dist/assets/{addspec-CHW9xf_X.js → addspec-BPpZ_olp.js} +1 -1
  28. package/client/dist/assets/{addspec-Di41DpYV.js → addspec-B_TPJt-R.js} +1 -1
  29. package/client/dist/assets/{addspec-4WmLJmBG.js → addspec-CLYLvaVP.js} +1 -1
  30. package/client/dist/assets/{addspec-C7XRejU4.js → addspec-CQBjzt24.js} +1 -1
  31. package/client/dist/assets/{addspec-x3mizDxc.js → addspec-D2YIQ0GU.js} +1 -1
  32. package/client/dist/assets/{addspec-DTmRrWrF.js → addspec-iFdQ6D99.js} +1 -1
  33. package/client/dist/assets/agent-Bd-q3Wqp.js +1 -0
  34. package/client/dist/assets/agent-BlvdW4Hv.js +1 -0
  35. package/client/dist/assets/agent-C-KQhxeM.js +1 -0
  36. package/client/dist/assets/agent-Ca15w5eu.js +1 -0
  37. package/client/dist/assets/agent-D6fKaoMd.js +1 -0
  38. package/client/dist/assets/agent-HFMYMTbB.js +1 -0
  39. package/client/dist/assets/agent-QIEbkBjg.js +1 -0
  40. package/client/dist/assets/agent-mTCsAbCl.js +1 -0
  41. package/client/dist/assets/agentstudio-BNUth0uj.js +1 -0
  42. package/client/dist/assets/agentstudio-BNdB5hkr.js +1 -0
  43. package/client/dist/assets/agentstudio-C7-bt8FO.js +1 -0
  44. package/client/dist/assets/agentstudio-C8uNchpV.js +1 -0
  45. package/client/dist/assets/agentstudio-CKabyMlg.js +1 -0
  46. package/client/dist/assets/agentstudio-CN2pokQu.js +1 -0
  47. package/client/dist/assets/agentstudio-DR7doNBV.js +1 -0
  48. package/client/dist/assets/agentstudio-y2dVDXeM.js +1 -0
  49. package/client/dist/assets/{analytics-C9RaQcE3.js → analytics-47pYygtV.js} +1 -1
  50. package/client/dist/assets/{analytics-B8Qtptbl.js → analytics-B0vt1g5U.js} +1 -1
  51. package/client/dist/assets/analytics-BMzCvrCU.js +1 -0
  52. package/client/dist/assets/{analytics-BPptRY4f.js → analytics-BlFN3Zwx.js} +1 -1
  53. package/client/dist/assets/{analytics-BxDGOIwf.js → analytics-CZYzL-nR.js} +1 -1
  54. package/client/dist/assets/{analytics-D_OZdQ9O.js → analytics-DAsb9MJ8.js} +1 -1
  55. package/client/dist/assets/{analytics-CJIwqrEl.js → analytics-FXQlQ2Yt.js} +1 -1
  56. package/client/dist/assets/{analytics-We6lUMI8.js → analytics-RnFCNkah.js} +1 -1
  57. package/client/dist/assets/{builder-CWYPw7Cw.js → builder-0IWtosUm.js} +1 -1
  58. package/client/dist/assets/{builder-CX1437hF.js → builder-Bf2N6XWn.js} +1 -1
  59. package/client/dist/assets/{builder-BiUG9Z5K.js → builder-BnqaaBkT.js} +1 -1
  60. package/client/dist/assets/{builder-CGRz_-zP.js → builder-BxxfGgAO.js} +1 -1
  61. package/client/dist/assets/{builder-DwDexYRE.js → builder-C5IIgWsq.js} +1 -1
  62. package/client/dist/assets/builder-CHuahItu.js +1 -0
  63. package/client/dist/assets/{builder-Cowk9jtL.js → builder-CjWosXL_.js} +1 -1
  64. package/client/dist/assets/{builder-3bygQtZi.js → builder-CpCIOoKj.js} +1 -1
  65. package/client/dist/assets/dashboard-BHRqsGCV.js +1 -0
  66. package/client/dist/assets/dashboard-Bfr90vOl.js +1 -0
  67. package/client/dist/assets/dashboard-CTsM8x3m.js +1 -0
  68. package/client/dist/assets/dashboard-CqC6wX0h.js +1 -0
  69. package/client/dist/assets/dashboard-CuZtAszc.js +1 -0
  70. package/client/dist/assets/dashboard-DAcqIc-n.js +1 -0
  71. package/client/dist/assets/dashboard-DekiV-86.js +1 -0
  72. package/client/dist/assets/dashboard-DoDczc5S.js +1 -0
  73. package/client/dist/assets/{dist-js-CkTZKBF9.js → dist-js-BmsFWRly.js} +1 -1
  74. package/client/dist/assets/{dist-js-ClShHcGa.js → dist-js-J5W_N5ng.js} +1 -1
  75. package/client/dist/assets/{formatDistanceToNow-BjGwPf6I.js → formatDistanceToNow-BOuXgebD.js} +1 -1
  76. package/client/dist/assets/{getTimezoneOffsetInMilliseconds-CSCbUI4W.js → getTimezoneOffsetInMilliseconds-EjGOpn4b.js} +1 -1
  77. package/client/dist/assets/{i18n-Ch-Db_x2.js → i18n-nJQvD5zJ.js} +2 -2
  78. package/client/dist/assets/index-C_sdsSZt.js +63 -0
  79. package/client/dist/assets/index-DCN5QbDm.css +2 -0
  80. package/client/dist/assets/{jira-BySfUuQZ.js → jira-BNZu8f9O.js} +1 -1
  81. package/client/dist/assets/{jira-gAvOyije.js → jira-BOoaUXbb.js} +1 -1
  82. package/client/dist/assets/{jira-pRaL7JQo.js → jira-BYVN4L2u.js} +1 -1
  83. package/client/dist/assets/jira-CKJg3HZd.js +1 -0
  84. package/client/dist/assets/{jira-Byw2C0F8.js → jira-DDDsZ4ub.js} +1 -1
  85. package/client/dist/assets/{jira-D38Gj7AT.js → jira-DXwYjVE4.js} +1 -1
  86. package/client/dist/assets/{jira-D11gPhxz.js → jira-Dn6U2nRW.js} +1 -1
  87. package/client/dist/assets/{jira-api-BgFIr8eD.js → jira-api-Bhixwn-d.js} +1 -1
  88. package/client/dist/assets/{jira-CNeYi06w.js → jira-j7hVolR5.js} +1 -1
  89. package/client/dist/assets/nav-ApJVg3xu.js +1 -0
  90. package/client/dist/assets/nav-BKNky1Bg.js +1 -0
  91. package/client/dist/assets/nav-C6vWWKYx.js +1 -0
  92. package/client/dist/assets/nav-CXJ6Aw89.js +1 -0
  93. package/client/dist/assets/nav-CsmFBIDf.js +1 -0
  94. package/client/dist/assets/nav-DjkmQJjd.js +1 -0
  95. package/client/dist/assets/nav-iwjCg5FR.js +1 -0
  96. package/client/dist/assets/nav-pYuXq7sf.js +1 -0
  97. package/client/dist/assets/{provider-capabilities-BvoExILy.js → provider-capabilities-Doej9lfa.js} +1 -1
  98. package/client/dist/assets/setup-3jWaoVUO.js +1 -0
  99. package/client/dist/assets/setup-BjgRneb2.js +1 -0
  100. package/client/dist/assets/setup-BzFIjv-f.js +1 -0
  101. package/client/dist/assets/setup-C4VfQsxE.js +1 -0
  102. package/client/dist/assets/setup-DfUkpDbN.js +1 -0
  103. package/client/dist/assets/setup-ECe90Pmu.js +1 -0
  104. package/client/dist/assets/setup-dlqC4Jmm.js +1 -0
  105. package/client/dist/assets/setup-jwfLMiM2.js +1 -0
  106. package/client/dist/assets/{spending-Dq43JYmD.js → spending-BpYPsevQ.js} +1 -1
  107. package/client/dist/assets/tickets-B4rjuSYi.js +1 -0
  108. package/client/dist/assets/tickets-Bc71ce1C.js +1 -0
  109. package/client/dist/assets/tickets-CLg7VTJ8.js +1 -0
  110. package/client/dist/assets/tickets-CP9U1GJt.js +1 -0
  111. package/client/dist/assets/tickets-CZNBiHbq.js +1 -0
  112. package/client/dist/assets/tickets-DlX2mEkD.js +1 -0
  113. package/client/dist/assets/tickets-W6pBmbrX.js +1 -0
  114. package/client/dist/assets/tickets-_yKvCt4Y.js +1 -0
  115. package/client/dist/assets/{useBrowserCaptureSession-TTO8vHtd.js → useBrowserCaptureSession-BBXBN0Na.js} +1 -1
  116. package/client/dist/assets/useDesktop-B6Du2N83.js +1 -0
  117. package/client/dist/assets/{useSharedWebSocket-DaPh7QBL.js → useSharedWebSocket-DK96ctb7.js} +1 -1
  118. package/client/dist/index.html +24 -24
  119. package/docs/guide/de/getting-started/3-adding-your-first-project.md +13 -32
  120. package/docs/guide/de/integrations/1-ai-providers.md +27 -16
  121. package/docs/guide/en/getting-started/3-adding-your-first-project.md +8 -27
  122. package/docs/guide/en/integrations/1-ai-providers.md +21 -18
  123. package/docs/guide/es/getting-started/3-adding-your-first-project.md +12 -31
  124. package/docs/guide/es/integrations/1-ai-providers.md +24 -16
  125. package/docs/guide/fr/getting-started/3-adding-your-first-project.md +15 -34
  126. package/docs/guide/fr/integrations/1-ai-providers.md +25 -16
  127. package/docs/guide/it/getting-started/3-adding-your-first-project.md +16 -35
  128. package/docs/guide/it/integrations/1-ai-providers.md +25 -16
  129. package/docs/guide/ja/getting-started/3-adding-your-first-project.md +16 -35
  130. package/docs/guide/ja/integrations/1-ai-providers.md +7 -12
  131. package/docs/guide/pt/getting-started/3-adding-your-first-project.md +15 -34
  132. package/docs/guide/pt/integrations/1-ai-providers.md +24 -16
  133. package/docs/guide/zh/getting-started/3-adding-your-first-project.md +18 -37
  134. package/docs/guide/zh/integrations/1-ai-providers.md +7 -12
  135. package/docs/internals/project-builder.md +11 -6
  136. package/package.json +1 -1
  137. package/server/dist/ai-invocations.js +35 -0
  138. package/server/dist/blueprint-commit.js +1 -1
  139. package/server/dist/desktop-db.js +22 -1
  140. package/server/dist/desktop-router.js +132 -43
  141. package/server/dist/framework-reseed.js +144 -0
  142. package/server/dist/index.js +41 -2
  143. package/server/dist/jira/jira-sync-manager.js +49 -2
  144. package/server/dist/jira-router.js +21 -0
  145. package/server/dist/job-phase-breakdown.js +132 -0
  146. package/server/dist/legacy-migration.js +395 -0
  147. package/server/dist/loop-executors.js +5 -1
  148. package/server/dist/offline-assemble.js +32 -4
  149. package/server/dist/pr-body.js +13 -0
  150. package/server/dist/project-router-jobs.js +16 -0
  151. package/server/dist/project-router-spending.js +11 -1
  152. package/server/dist/provider-detection.js +222 -0
  153. package/server/dist/provider-selection.js +71 -19
  154. package/server/dist/queue-manager.js +4 -0
  155. package/server/dist/rail-pr-decision.js +10 -0
  156. package/server/dist/rails-router.js +11 -0
  157. package/server/dist/rails-store.js +5 -1
  158. package/server/dist/repo-map.js +293 -0
  159. package/server/dist/setup-manager.js +57 -0
  160. package/server/dist/spending.js +45 -0
  161. package/client/dist/assets/AgentsPage-B648IzGI.js +0 -87
  162. package/client/dist/assets/AnalyticsPage-0rBoULPX.js +0 -1
  163. package/client/dist/assets/CodePage-ju302Vl7.js +0 -2
  164. package/client/dist/assets/InteractiveJobComposer-_jmsE_Az.js +0 -19
  165. package/client/dist/assets/JobDetailPage-7nwHyHGV.js +0 -1
  166. package/client/dist/assets/JobsPage-C_6YrcmE.js +0 -1
  167. package/client/dist/assets/LoopBuilderPage-DJ1UPDwL.js +0 -7
  168. package/client/dist/assets/LoopPreviewModal-12cUnljK.js +0 -1
  169. package/client/dist/assets/LoopsPage-CHYK0Xjr.js +0 -1
  170. package/client/dist/assets/MinimizedChatsContext-Gt6KQySM.js +0 -1
  171. package/client/dist/assets/PluginsPage-E59oQmwc.js +0 -2
  172. package/client/dist/assets/ProjectSettingsDialog-DQTLQ7ie.js +0 -1
  173. package/client/dist/assets/TemplatePreviewModal-nXUcDgfk.js +0 -1
  174. package/client/dist/assets/TicketDetailModal-C-tHW-2s.js +0 -14
  175. package/client/dist/assets/agent-BKsuIgIT.js +0 -1
  176. package/client/dist/assets/agent-Bs9NilfI.js +0 -1
  177. package/client/dist/assets/agent-C23h684q.js +0 -1
  178. package/client/dist/assets/agent-CqEjy3Z2.js +0 -1
  179. package/client/dist/assets/agent-D5DZTks1.js +0 -1
  180. package/client/dist/assets/agent-DE8hUYPl.js +0 -1
  181. package/client/dist/assets/agent-DsTuJGSc.js +0 -1
  182. package/client/dist/assets/agent-DwZM05-x.js +0 -1
  183. package/client/dist/assets/agentstudio-8TQqBenW.js +0 -1
  184. package/client/dist/assets/agentstudio-B8Z_mmEX.js +0 -1
  185. package/client/dist/assets/agentstudio-BZR9YmLs.js +0 -1
  186. package/client/dist/assets/agentstudio-Bge9pAWb.js +0 -1
  187. package/client/dist/assets/agentstudio-Bz169Vzt.js +0 -1
  188. package/client/dist/assets/agentstudio-D6L2jpNi.js +0 -1
  189. package/client/dist/assets/agentstudio-K2-Z7CL0.js +0 -1
  190. package/client/dist/assets/agentstudio-Zmgzthv8.js +0 -1
  191. package/client/dist/assets/analytics-BHqUazhP.js +0 -1
  192. package/client/dist/assets/builder-skfnZ1uC.js +0 -1
  193. package/client/dist/assets/dashboard-BVq6kRJe.js +0 -1
  194. package/client/dist/assets/dashboard-BaKPPmLH.js +0 -1
  195. package/client/dist/assets/dashboard-Bm8e4zYG.js +0 -1
  196. package/client/dist/assets/dashboard-Bt6IesnM.js +0 -1
  197. package/client/dist/assets/dashboard-C_NQZle_.js +0 -1
  198. package/client/dist/assets/dashboard-CyZKoGoI.js +0 -1
  199. package/client/dist/assets/dashboard-HIUdUBQ0.js +0 -1
  200. package/client/dist/assets/dashboard-pm4Mr229.js +0 -1
  201. package/client/dist/assets/index-Bz0TeGRs.css +0 -2
  202. package/client/dist/assets/index-kCUcnT8G.js +0 -77
  203. package/client/dist/assets/jira-CmKWERE0.js +0 -1
  204. package/client/dist/assets/nav-BHDiSIVu.js +0 -1
  205. package/client/dist/assets/nav-CMiYAq4i.js +0 -1
  206. package/client/dist/assets/nav-CqS7NrDW.js +0 -1
  207. package/client/dist/assets/nav-D-0M7xfv.js +0 -1
  208. package/client/dist/assets/nav-D65O6u9I.js +0 -1
  209. package/client/dist/assets/nav-D_LKYvBr.js +0 -1
  210. package/client/dist/assets/nav-FDTJmU79.js +0 -1
  211. package/client/dist/assets/nav-VaB-C4k5.js +0 -1
  212. package/client/dist/assets/setup-BBiHEO7h.js +0 -1
  213. package/client/dist/assets/setup-BlTWhNIQ.js +0 -1
  214. package/client/dist/assets/setup-Bp2L_oiP.js +0 -1
  215. package/client/dist/assets/setup-CInYXp1-.js +0 -1
  216. package/client/dist/assets/setup-CYH3bP6K.js +0 -1
  217. package/client/dist/assets/setup-DwcQ921P.js +0 -1
  218. package/client/dist/assets/setup-PBLjuDSs.js +0 -1
  219. package/client/dist/assets/setup-bx6FtoBp.js +0 -1
  220. package/client/dist/assets/tickets-BL9r1G0e.js +0 -1
  221. package/client/dist/assets/tickets-B_NyHJ8f.js +0 -1
  222. package/client/dist/assets/tickets-BarF1wuG.js +0 -1
  223. package/client/dist/assets/tickets-CclVhpQA.js +0 -1
  224. package/client/dist/assets/tickets-CqqOHbli.js +0 -1
  225. package/client/dist/assets/tickets-DCkFSiqt.js +0 -1
  226. package/client/dist/assets/tickets-Djn3ccfT.js +0 -1
  227. package/client/dist/assets/tickets-MiHBPsy_.js +0 -1
  228. package/client/dist/assets/useDesktop-DUvS4fuP.js +0 -1
@@ -4,55 +4,36 @@
4
4
 
5
5
  ## プロジェクト追加ダイアログを開く
6
6
 
7
- ウェルカム画面で **最初のプロジェクトを追加** をクリックします(あとからなら、左サイドバーの **プロジェクトを追加** ボタンでも開けます)。小さなダイアログが表示されます。
7
+ ようこそ画面の**最初のプロジェクトを追加**をクリックします(後からは左サイドバーの**プロジェクトを追加**ボタンでも構いません)。小さなダイアログが表示されます。
8
8
 
9
- ## 内容を入力する
9
+ ## 詳細を入力する
10
10
 
11
- **プロジェクトフォルダ** *(必須)*
11
+ **プロジェクトフォルダ** *(必須)*
12
12
 
13
- コードが入っているフォルダを specrails に指定します。デスクトップアプリでは、フォルダアイコンをクリックして視覚的に参照・選択するか、フルパスを貼り付けられます。指定するのはリポジトリのルート — コードと(通常は)`.git` ディレクトリを含むフォルダです。
13
+ コードが入っているフォルダを specrails に指定します。デスクトップアプリではフォルダアイコンをクリックして視覚的に選ぶか、フルパスを貼り付けられます。リポジトリのルート — コードと(通常は)`.git` ディレクトリを含むフォルダ — を指定してください。
14
14
 
15
- **プロジェクト名** *(任意)*
15
+ **プロジェクト名** *(任意)*
16
16
 
17
17
  サイドバーに表示される分かりやすいラベルです。空欄のままにすると、specrails はフォルダ名を使います。
18
18
 
19
- **プロバイダー**
19
+ > 必要なツールが揃っているか、バックグラウンドで簡単なチェックが実行されます。必須のものが欠けていると**追加**ボタンは無効のままになり、**詳細情報**リンクが正確なインストールコマンドを示します。
20
20
 
21
- このプロジェクトで使う AI プロバイダーを選びます。specrails は、あなたのマシン上で検出したものを表示します。
21
+ フォームはこれだけです — **追加**をクリックすれば完了です。
22
22
 
23
- - 🤖 **Claude**
24
- - ⚡ **Codex**
25
- - ✨ **Gemini**
23
+ ## AI プロバイダーは自動検出されます
26
24
 
27
- 見つからなかったプロバイダーはグレーアウトされ、*not found* と表示されます。どれかをインストールしてサインインしたうえで、ダイアログを開き直してください。デフォルトでは利用可能なプロバイダーがすべて事前選択されていますが、使いたいものだけに絞り込むこともできます。複数選んだ場合は、**最初の** プロバイダーがプロジェクトのデフォルトになります。タスクごとの選択は、あとから行えます。
25
+ もうプロバイダーを選ぶ必要はありません。specrails はマシンにインストールされたすべての AI CLI — **Claude**、**Codex**、**Gemini**、**Kimi** — を検出し、どのプロジェクトでも常にそのすべてを使えます。後から新しいプロバイダーをインストールすれば、次にアプリへ戻ったときに自動であらゆる場所に現れます。再セットアップも、プロジェクトごとの設定も不要です。インストール済みでも未ログインのプロバイダーには、セレクターに控えめな*未ログイン*バッジが表示されます。
28
26
 
29
- > 必要なツールがそろっているかを確認するため、バックグラウンドで簡単なチェックが走ります。何か欠かせないものが足りない場合は、**追加** ボタンが無効のままになり、**詳細情報** リンクが正確なインストールコマンドを案内します。
27
+ ## セットアップは静かに行われます
30
28
 
31
- **追加** をクリックして進みましょう。
29
+ セットアップウィザードはありません。**追加**をクリックした瞬間にプロジェクトは登録され、サイドバーに現れます — すぐに開けます。バックグラウンドで specrails がプロジェクトの workspace を組み立てます(数秒、完全オフライン)。プロジェクト行の小さく点滅するドットが作業中を示し、すべて整うと自然に消えます。あるプロバイダーで失敗しても、プロジェクトは他のプロバイダーで動き続けます — 琥珀色のドットが現れ、クリックすると再試行します。
32
30
 
33
- ## 数秒で終わるセットアップ
31
+ ## 何が、どこにインストールされるのか
34
32
 
35
- そのフォルダにすでに specrails が設定済みなら、これで完了です。プロジェクトが瞬時にサイドバーに現れます。
33
+ セットアップは意図的に**非侵襲的**です。あなたのリポジトリは手つかずのまま。specrails のすべての成果物(エージェント定義、コマンド、プロファイル、ローカル設定)はホームディレクトリ配下のプロジェクトごとの workspace に置かれ、アプリに同梱された単一の共有フレームワークにリンクされます。リポジトリが変更されることはありません — アプリの更新時には、すべてのプロジェクトが新しいフレームワークを自動で、一度に受け取ります。
36
34
 
37
- まっさらなプロジェクトの場合は、短い **セットアップウィザード** が走ります。ステップは 3 つです。
35
+ > **より深いセットアップを望むなら?** アプリはあえて高速なテンプレートインストールを既定にしています。AI で強化されたフロー(コードベース分析とカスタムエージェントペルソナ)が良ければ、ターミナルでプロジェクトフォルダから `npx specrails-core@latest init` を実行できます。
38
36
 
39
- 1. **設定** — 選んだ各プロバイダーについて、基本的な内容を確認します。
40
- 2. **インストール** — specrails がプロジェクトを自動でセットアップします。これは *クイック* インストールで、すぐに使えるテンプレートのエージェントが数秒のうちに配置されます。実行中の様子はライブログで確認できます。
41
- 3. **完了** — すべて準備できたことを伝えるサマリーが表示されます。
37
+ ## 準備完了
42
38
 
43
- 複数プロバイダーのプロジェクトでは、インストールがプロバイダーごとに 1 回ずつ順番に実行され、完了ステップにはそれぞれのカードが表示されます。
44
-
45
- ## インストールされるもの
46
-
47
- セットアップは意図的に軽量で、**非侵襲的** です。specrails は、パイプラインが実行方法を把握できるよう、プロジェクトにごく少量の設定を追加します。
48
-
49
- - プロジェクトのエージェントプロファイルとローカル設定を収める `.specrails/` フォルダ。
50
- - Architect → Developer → Reviewer → Ship パイプラインを動かす、`.claude/agents/` 配下のエージェント定義。
51
-
52
- それだけです。specrails がセットアップ中にあなたのソースコードを書き換えることはありません。これらのファイルは、設定をチームと共有したければコミットしても安全です。
53
-
54
- > **もっと踏み込んだセットアップがしたい?** このアプリは、あえて高速なテンプレートインストールを採用しています。AI による拡張フロー(コードベースの分析やカスタムエージェントのペルソナ生成)がよければ、プロジェクトフォルダのターミナルで `npx specrails-core@latest init` を実行できます。
55
-
56
- ## これで準備完了
57
-
58
- セットアップが終わると、specrails はあなたをプロジェクトのダッシュボードへ案内します。さあ、ツアーの時間です。[The dashboard tour](the-dashboard-tour) をご覧ください。
39
+ **追加**をクリックした瞬間からプロジェクトのダッシュボードが使えます。さあツアーへ — [ダッシュボードツアー](the-dashboard-tour)をご覧ください。
@@ -16,22 +16,17 @@ Specrails は特定の AI に縛られません。Claude、Codex、Gemini、Kimi
16
16
  4 つとも**デフォルトで有効**です。CLI が `PATH` にあれば表示されます。
17
17
  Kimi は `kimi --version` を確認し、`kimi login` を実行してください。
18
18
 
19
- ## プロジェクトに 1 つのプロバイダーをインストールする
19
+ ## プロバイダーは自動検出されます
20
20
 
21
- プロジェクトを追加すると、セットアップウィザードがどのプロバイダーをインストールするか尋ねます。1 つ選んでインストールのステップを進めれば完了です。あとはそのプロジェクトがそのプロバイダーを*持っている*状態になり、それ以降は意識する必要はありません。スペック、レール、チャット、アナリティクスは、どれを選んでも同じように動きます。
21
+ プロジェクトごとにプロバイダーを選ぶことはもうありません。specrails はマシンにインストールされたすべてのプロバイダー CLI を検出し、**すべて**のプロジェクトで常に**全部**を利用できるようにします。その上で各サーフェスがプロバイダーの公表するケイパビリティを確認します。Kimi の正確なマトリクスは[Kimi を使う](../../../kimi.md)を参照してください。
22
22
 
23
- 使いたい CLI が Add Project に出てこない場合、ほとんどはその CLI がインストールされていないか、`PATH` 上にないのが原因です。インストールしてから Add Project を開き直してください。
23
+ 使いたいプロバイダーがどこにも現れない場合、ほぼ確実に CLI が未インストールか `PATH` にないためです。インストールしてログインし、アプリに戻ってください — ウィンドウのフォーカス時に検出が再実行され、プロバイダーは自動であらゆる場所に現れ、その workspace サーフェスもバックグラウンドで組み立てられます。インストール済みでも未ログインのプロバイダーは、エンジンセレクターに*未ログイン*バッジ付きで表示されます。
24
24
 
25
- ## 1 つのプロジェクトに複数のプロバイダーをインストールする
25
+ 複数プロバイダーのマシンについて知っておくと良いこと:
26
26
 
27
- 同じプロジェクトに**複数**のプロバイダーをインストールできます — たとえば Claude *と* Gemini を一緒に、といった具合です。**Add Project** では、プロバイダーの一覧がチェックボックスになるので、使いたいものをすべてチェックしてください。最初に選んだものがそのプロジェクトの**プライマリ**(デフォルト)プロバイダーになり、残りは代替として使えるようになります。
28
-
29
- マルチプロバイダーのプロジェクトについて、知っておくとよいことがいくつかあります。
30
-
31
- - **プロバイダーが 1 つなら、これまでとまったく同じ挙動です。** プロジェクトにプロバイダーが 1 つしかなければ、プロバイダーの選択 UI はどこにも表示されません — アプリはすっきりシンプルなままです。
32
- - **UI は capability に従います。** Claude と Kimi はプロバイダー別の
33
- profile に対応し、Codex と Gemini は legacy mode で実行します。
34
- - **プロバイダーの選択は作成後に固定されます。** このバージョンでは、プロジェクトを追加するときにプロバイダーを選び、あとから設定で変更することはできません。別の組み合わせが必要になったら、新しいプロジェクトを作成してください。
27
+ - **プロバイダーが 1 つだけなら挙動は以前とまったく同じです。** 1 つしか検出されなければ、プロバイダーピッカーはどこにも表示されません — アプリはすっきりシンプルなままです。
28
+ - **ケイパビリティがサイドバーを決めます。** 検出済みプロバイダーの少なくとも 1 つが対応していればセクションは表示され、その中のエンジン関連の操作は対応プロバイダーだけを提示します。Kimi はプロファイル、カスタムロール、Freestyle を公表しますが、強制可能なノーツール境界を要する構造化アクションは公表しません。
29
+ - **何もロックされません。** プロバイダー CLI の追加や削除はすべてのプロジェクトに自動反映されます — 管理すべきプロジェクトごとのプロバイダー設定は存在しません。
35
30
 
36
31
  ## 呼び出しごとにプロバイダーを選ぶ
37
32
 
@@ -4,55 +4,36 @@ Um projeto é apenas uma pasta no seu computador que contém uma base de código
4
4
 
5
5
  ## Abrir a janela Adicionar projeto
6
6
 
7
- Clique em **Adicionar o seu primeiro projeto** no ecrã de boas-vindas (ou, mais tarde, no botão **Adicionar projeto** na barra lateral esquerda). Aparece uma pequena janela.
7
+ Clique em **Adicione o seu primeiro projeto** no ecrã de boas-vindas (ou no botão **Adicionar projeto** na barra lateral esquerda mais tarde). Aparece uma pequena janela.
8
8
 
9
- ## Preencher os dados
9
+ ## Preencher os detalhes
10
10
 
11
11
  **Pasta do projeto** *(obrigatório)*
12
12
 
13
- Aponte o specrails para a pasta que contém o seu código. Na app de desktop pode clicar no ícone de pasta para navegar e escolhê-la visualmente, ou colar o caminho completo. Esta deve ser a raiz do seu repositório — a pasta que contém o seu código e (normalmente) um diretório `.git`.
13
+ Indique ao specrails a pasta que contém o seu código. Na app de desktop pode clicar no ícone de pasta para navegar e escolher visualmente, ou colar o caminho completo. Deve ser a raiz do seu repositório — a pasta que contém o código e (normalmente) um diretório `.git`.
14
14
 
15
15
  **Nome do projeto** *(opcional)*
16
16
 
17
- Uma etiqueta amigável mostrada na barra lateral. Se a deixar em branco, o specrails usa o nome da pasta.
17
+ Um rótulo amigável mostrado na barra lateral. Se deixar em branco, o specrails usa o nome da pasta.
18
18
 
19
- **Fornecedores**
19
+ > Uma verificação rápida corre em segundo plano para confirmar que as ferramentas necessárias estão presentes. Se faltar algo essencial, o botão **Adicionar** fica desativado e uma ligação **Mais info** dá-lhe os comandos de instalação exatos.
20
20
 
21
- Escolha que fornecedor(es) de IA este projeto deve usar. O specrails mostra-lhe os que detetou na sua máquina:
21
+ É todo o formulário — clique em **Adicionar** e está feito.
22
22
 
23
- - 🤖 **Claude**
24
- - ⚡ **Codex**
25
- - ✨ **Gemini**
23
+ ## Os fornecedores de IA são detetados automaticamente
26
24
 
27
- Os fornecedores que não encontrou aparecem a cinzento e marcados como *não encontrado* — instale e inicie sessão num deles e volte a abrir a janela. Por predefinição, todos os fornecedores disponíveis ficam pré-selecionados, mas pode desmarcar até ficar apenas com o que pretende. Se escolher mais do que um, o **primeiro** torna-se o fornecedor predefinido do projeto; mais tarde poderá escolher por tarefa.
25
+ Já não escolhe fornecedores. O specrails deteta cada CLI de IA instalado na sua máquina — **Claude**, **Codex**, **Gemini**, **Kimi** — e todos os projetos podem usá-los todos, sempre. Se instalar um fornecedor novo mais tarde, ele aparece em todo o lado por si próprio na próxima vez que focar a app; sem reconfiguração, sem ajustes por projeto. Se um fornecedor estiver instalado mas sem sessão iniciada, o seu seletor mostra um distintivo subtil *Sem sessão iniciada*.
28
26
 
29
- > Uma verificação rápida corre em segundo plano para confirmar que as ferramentas necessárias estão presentes. Se faltar algo essencial, o botão **Adicionar** permanece desativado e uma ligação **Mais informações** dá-lhe os comandos de instalação exatos.
27
+ ## A configuração acontece em silêncio
30
28
 
31
- Clique em **Adicionar** para continuar.
29
+ Não há assistente de configuração. No momento em que clica em **Adicionar**, o projeto fica registado e aparece na barra lateral — pode abri-lo de imediato. Em segundo plano, o specrails monta o workspace do projeto (poucos segundos, totalmente offline): um pequeno ponto a pulsar na linha do projeto mostra que está a trabalhar, e desaparece quando tudo está pronto. Se algo falhar para um fornecedor, o projeto continua a funcionar com os restantes — aparece um ponto âmbar e clicar nele tenta de novo.
32
30
 
33
- ## Uma configuração que corre em segundos
31
+ ## O que é instalado — e onde
34
32
 
35
- Se a pasta já tiver o specrails configurado, está concluído — o projeto aparece instantaneamente na sua barra lateral.
33
+ A configuração é deliberadamente **não invasiva**: o seu repositório permanece intacto. Todos os artefactos do specrails (definições de agentes, comandos, perfis, definições locais) vivem num workspace por projeto sob o seu diretório home, ligado a uma única instalação partilhada do framework que vem com a app. O seu repo nunca é modificado — e quando a app é atualizada, todos os projetos recebem o novo framework automaticamente, de uma vez.
36
34
 
37
- Se for um projeto novo, corre um breve **assistente de configuração**. Tem três passos:
35
+ > **Prefere a configuração profunda?** A app inclui de propósito a instalação rápida com templates. Se preferir o fluxo enriquecido por IA (análise da base de código e personas de agentes personalizadas), pode executar `npx specrails-core@latest init` a partir da pasta do projeto num terminal.
38
36
 
39
- 1. **Configurar** — confirme o essencial para cada fornecedor que escolheu.
40
- 2. **Instalar** — o specrails prepara o projeto automaticamente. Esta é a instalação *rápida*: agentes de template prontos a usar, instalados em segundos. Vai ver um log em direto enquanto corre.
41
- 3. **Concluído** — um resumo a confirmar que está tudo pronto.
37
+ ## Já está dentro
42
38
 
43
- Num projeto com vários fornecedores, a instalação corre uma vez por fornecedor, um a seguir ao outro, e o passo Concluído mostra um cartão para cada um.
44
-
45
- ## O que é instalado
46
-
47
- A configuração é deliberadamente leve e **não invasiva**. O specrails acrescenta uma pequena quantidade de configuração ao seu projeto para que o pipeline saiba como funcionar:
48
-
49
- - Uma pasta `.specrails/` que contém os perfis de agentes e as definições locais do seu projeto.
50
- - Definições de agentes em `.claude/agents/` que dão vida ao pipeline Arquiteto → Developer → Revisor → Ship.
51
-
52
- E é só isto — o specrails não reescreve o seu código-fonte durante a configuração, e estes ficheiros podem ser incluídos no commit sem problemas, caso queira partilhar a configuração com a sua equipa.
53
-
54
- > **Prefere a configuração aprofundada?** A app traz de propósito a instalação rápida por templates. Se preferir o fluxo enriquecido por IA (análise da base de código e personas de agentes personalizadas), pode executar `npx specrails-core@latest init` a partir da pasta do projeto num terminal.
55
-
56
- ## Está dentro
57
-
58
- Assim que a configuração terminar, o specrails leva-o diretamente para o dashboard do seu projeto. É hora do tour — veja [O tour pelo dashboard](the-dashboard-tour).
39
+ O painel do projeto fica disponível no momento em que clica em **Adicionar**. Hora da visita guiada — veja [A visita ao painel](the-dashboard-tour).
@@ -16,22 +16,30 @@ capabilities exigidas pelo seu contrato.
16
16
  Os quatro estão **ativados por omissão**. O provider aparece quando o CLI está
17
17
  no `PATH`; para Kimi, confirme `kimi --version` e execute `kimi login`.
18
18
 
19
- ## Instalar um provider para um projeto
20
-
21
- Quando adiciona um projeto, o assistente de configuração pergunta qual ou quais providers instalar. Escolha um, avance pelo passo de instalação e está feito. A partir daí o projeto simplesmente *tem* esse provider — nunca mais precisa de pensar nisso. Specs, rails, chat e analytics funcionam todos da mesma forma, independentemente do que escolheu.
22
-
23
- Se um CLI que quer não aparecer em Adicionar Projeto, é quase sempre porque o CLI não está instalado ou não está no seu `PATH`. Instale-o e volte a abrir Adicionar Projeto.
24
-
25
- ## Instalar vários providers num só projeto
26
-
27
- Pode instalar **mais do que um** provider no mesmo projeto — por exemplo Claude *e* Gemini. Em **Adicionar Projeto**, a lista de providers passa a ser um conjunto de caixas de seleção; marque tudo o que quiser. O primeiro que selecionar torna-se o provider **primário** (por omissão) do projeto; os restantes ficam disponíveis como alternativas.
28
-
29
- Algumas coisas que vale a pena saber sobre projetos multi-provider:
30
-
31
- - **Com um só provider, tudo se comporta exatamente como antes.** Se um projeto tiver apenas um provider, nunca verá um seletor de provider em lado nenhum — a app mantém-se limpa e simples.
32
- - **As capabilities controlam a UI.** Claude e Kimi suportam perfis separados
33
- por provider; Codex e Gemini usam modo legacy.
34
- - **A escolha de providers fica fixada após a criação.** Nesta versão escolhe os seus providers quando adiciona o projeto e não podem ser alterados mais tarde nas Definições. Se precisar de uma combinação diferente, isso é um projeto novo.
19
+ ## Os providers são detetados automaticamente
20
+
21
+ Nunca escolhes providers por projeto. O specrails deteta cada CLI de provider
22
+ instalado na tua máquina e disponibiliza **todos** a **todos** os projetos,
23
+ sempre. Cada superfície verifica depois as capacidades anunciadas pelo
24
+ provider. Vê [Usar o Kimi](../../../kimi.md) para a matriz exata do Kimi.
25
+
26
+ Se um provider que queres não aparece em lado nenhum, é quase sempre porque o
27
+ CLI não está instalado ou não está no teu `PATH`. Instala-o, inicia sessão e
28
+ volta à app — a deteção corre de novo ao focar a janela e o provider aparece
29
+ por si próprio em todo o lado, com a sua superfície de workspace montada em
30
+ segundo plano. Um provider instalado mas sem sessão iniciada continua a
31
+ aparecer, com um distintivo *Sem sessão iniciada* nos seletores de motor.
32
+
33
+ Algumas coisas úteis sobre máquinas multi-provider:
34
+
35
+ - **Um único provider comporta-se exatamente como antes.** Se só um for detetado, nunca verás um seletor de provider — a app mantém-se limpa e simples.
36
+ - **As capabilities comandam a barra lateral.** Uma secção é visível quando pelo
37
+ menos um provider detetado a suporta; lá dentro, as ações por motor só
38
+ oferecem os providers capazes. O Kimi anuncia perfis, roles personalizados e
39
+ Freestyle; não anuncia ações estruturadas que exijam uma fronteira sem
40
+ ferramentas aplicável.
41
+ - **Nada fica bloqueado.** Instalar ou remover um CLI de provider atualiza todos
42
+ os projetos automaticamente — não há definição de provider por projeto para gerir.
35
43
 
36
44
  ## Escolher um provider a cada invocação
37
45
 
@@ -2,57 +2,38 @@
2
2
 
3
3
  一个项目其实就是你电脑上存放某个代码库的文件夹。我们来连接一个吧。
4
4
 
5
- ## 打开“添加项目”对话框
5
+ ## 打开"添加项目"对话框
6
6
 
7
- 在欢迎界面点击 **添加你的第一个项目**(之后也可以点击左侧边栏里的 **添加项目** 按钮)。会弹出一个小对话框。
7
+ 在欢迎页面点击**添加你的第一个项目**(之后也可以点击左侧边栏的**添加项目**按钮)。会出现一个小对话框。
8
8
 
9
- ## 填写详情
9
+ ## 填写信息
10
10
 
11
- **项目文件夹** *(必填)*
11
+ **项目文件夹** *(必填)*
12
12
 
13
- 把 specrails 指向存放你代码的文件夹。在桌面应用里,你可以点击文件夹图标来可视化浏览选择,也可以直接粘贴完整路径。这应该是你仓库的根目录——也就是那个包含你的代码、并且(通常)有一个 `.git` 目录的文件夹。
13
+ 告诉 specrails 存放代码的文件夹。在桌面应用中,你可以点击文件夹图标进行可视化选择,或直接粘贴完整路径。它应该是仓库的根目录 — 包含代码和(通常)`.git` 目录的那个文件夹。
14
14
 
15
- **项目名称** *(可选)*
15
+ **项目名称** *(可选)*
16
16
 
17
- 显示在侧边栏里的友好标签。如果留空,specrails 会用文件夹名。
17
+ 显示在侧边栏中的友好名称。留空时 specrails 会使用文件夹名。
18
18
 
19
- **提供商**
19
+ > 后台会快速检查所需工具是否齐全。如果缺少必要工具,**添加**按钮将保持禁用,**更多信息**链接会给出确切的安装命令。
20
20
 
21
- 选择这个项目要使用哪个(些)AI 提供商。specrails 会把它在你机器上检测到的那些展示给你:
21
+ 整个表单就这些 — 点击**添加**即可。
22
22
 
23
- - 🤖 **Claude**
24
- - ⚡ **Codex**
25
- - ✨ **Gemini**
23
+ ## AI 提供商自动检测
26
24
 
27
- 没找到的提供商会变灰,并标注为 *未找到*——安装并登录其中一个,然后重新打开对话框即可。默认情况下,所有可用的提供商都会被预选中,但你可以取消勾选,只留下想要的那个。如果你选了不止一个,**第一个** 会成为项目的默认提供商;之后你可以按任务来选择。
25
+ 你不再需要选择提供商。specrails 会检测你机器上安装的每个 AI CLI — **Claude**、**Codex**、**Gemini**、**Kimi** — 且每个项目始终可以使用它们全部。之后安装新的提供商,下次回到应用时它会自动出现在所有地方;无需重新配置,无需按项目设置。如果某个提供商已安装但未登录,其选择器会显示一个不显眼的*未登录*标记。
28
26
 
29
- > 后台会做一次快速检查,确认所需的工具都在。如果缺少某个关键工具,**添加** 按钮会保持禁用状态,并通过 **更多信息** 链接给出确切的安装命令。
27
+ ## 配置在后台静默完成
30
28
 
31
- 点击 **添加** 继续。
29
+ 不再有设置向导。点击**添加**的那一刻,项目即注册完成并出现在侧边栏中 — 你可以立即打开它。specrails 会在后台组装项目的 workspace(几秒钟,完全离线):项目行上一个轻微闪烁的小点表示正在工作,一切就绪后它会自然消失。如果某个提供商的组装失败,项目仍可使用其他提供商 — 会出现一个琥珀色圆点,点击即可重试。
32
30
 
33
- ## 几秒钟就跑完的设置
31
+ ## 安装了什么 — 以及安装在哪里
34
32
 
35
- 如果该文件夹已经配置好了 specrails,那你就齐活了——项目会立刻出现在侧边栏里。
33
+ 配置刻意做到**非侵入式**:你的仓库保持原样。所有 specrails 产物(代理定义、命令、配置文件、本地设置)都放在你 home 目录下的项目专属 workspace 中,链接到随应用一起分发的单一共享框架安装。你的仓库永远不会被修改 — 应用更新时,所有项目会自动、一次性地获得新框架。
36
34
 
37
- 如果这是个全新的项目,会运行一个简短的**设置向导**。它分三步:
35
+ > **想要深度配置?** 应用有意默认提供快速模板安装。如果你偏好 AI 增强流程(代码库分析和定制代理角色),可以在终端里从项目文件夹运行 `npx specrails-core@latest init`。
38
36
 
39
- 1. **配置**——为你选择的每个提供商确认基本信息。
40
- 2. **安装**——specrails 自动完成项目设置。这是*快速*安装:开箱即用的模板 agent,几秒内就位。运行过程中你会看到实时日志。
41
- 3. **完成**——一份汇总,确认一切就绪。
37
+ ## 你已就绪
42
38
 
43
- 对于多提供商项目,安装会按提供商逐个运行,一个接一个,“完成”这一步会为每个提供商显示一张卡片。
44
-
45
- ## 会安装些什么
46
-
47
- 设置刻意做得很轻量,而且**不侵入**。specrails 只往你的项目里加入少量配置,好让流水线知道该怎么运行:
48
-
49
- - 一个 `.specrails/` 文件夹,存放项目的 agent profile 和本地设置。
50
- - `.claude/agents/` 下的 agent 定义,为“架构师 → 开发者 → 评审员 → 交付”这条流水线提供支撑。
51
-
52
- 仅此而已——设置过程中 specrails 不会改写你的源代码,而且这些文件可以放心提交,如果你想和团队共享这份配置的话。
53
-
54
- > **想要深度设置?** 应用刻意默认采用快速模板安装。如果你更想要 AI 增强流程(代码库分析与自定义 agent 人设),可以在终端里、从你的项目文件夹运行 `npx specrails-core@latest init`。
55
-
56
- ## 你进来了
57
-
58
- 设置一结束,specrails 就会把你带进项目的仪表盘。是时候逛一圈了——参见[仪表盘导览](the-dashboard-tour)。
39
+ 点击**添加**的那一刻,项目仪表盘即已可用。是时候参观一下了 — 参见[仪表盘导览](the-dashboard-tour)。
@@ -15,22 +15,17 @@ Specrails 并不绑定某一个 AI。Claude、Codex、Gemini 和 Kimi 都是一
15
15
  四家都是**默认启用**的。CLI 在 `PATH` 上就会显示。Kimi 请先确认
16
16
  `kimi --version`,再运行 `kimi login`。
17
17
 
18
- ## 为一个项目安装单个提供方
18
+ ## 提供方自动检测
19
19
 
20
- 添加项目时,setup 向导会问你想安装哪个(哪些)提供方。选一个,点完安装步骤,就搞定了。从那以后,这个项目就直接*拥有*了这个提供方——你再也不用去操心它。规格、rail、聊天和分析,无论你选了哪一个,用起来都一样。
20
+ 你永远不需要按项目挑选提供方。specrails 会检测你机器上安装的每个提供方 CLI,并让**所有**项目始终可以使用**全部**提供方。之后各个界面会检查提供方声明的能力。Kimi 的确切能力矩阵参见[使用 Kimi](../../../kimi.md)。
21
21
 
22
- 如果你想要的某个 CLI 没有出现在 Add Project 里,原因几乎总是它没安装、或不在你的 `PATH` 上。装好它,再重新打开 Add Project 即可。
22
+ 如果你想要的提供方哪里都没出现,几乎总是因为该 CLI 未安装或不在 `PATH` 中。安装并登录后切回应用 — 检测会在窗口获得焦点时重新运行,该提供方会自动出现在所有地方,其项目 workspace 也会在后台组装完成。已安装但未登录的提供方仍会出现,只是在引擎选择器上带有*未登录*标记。
23
23
 
24
- ## 为同一个项目安装多个提供方
24
+ 关于多提供方机器的几点说明:
25
25
 
26
- 你可以把**不止一个**提供方装进同一个项目——比如同时用 Claude *和* Gemini。在 **Add Project** 里,提供方列表会变成一组复选框;想要哪些就勾哪些。你勾选的第一个会成为这个项目的**主**(默认)提供方,其余的则作为备选可用。
27
-
28
- 关于多提供方项目,有几点值得了解:
29
-
30
- - **只有一个提供方时,行为和以前完全一样。** 如果一个项目只有单个提供方,你在任何地方都不会看到提供方选择器——应用保持干净、简单。
31
- - **UI 由 capability 驱动。** Claude 和 Kimi 支持按提供方隔离的
32
- profile;Codex 和 Gemini 使用 legacy mode。
33
- - **提供方在创建后就锁定了。** 在这个版本里,你在添加项目时选定提供方,之后无法再从 Settings 更改。如果你需要不同的组合,那就新建一个项目。
26
+ - **只有一个提供方时行为与从前完全一致。** 只检测到一个提供方时,你不会在任何地方看到提供方选择器 — 应用保持干净简洁。
27
+ - **能力决定侧边栏。** 只要至少一个已检测的提供方支持某个版块,它就可见;版块内与引擎相关的操作只会提供有能力的提供方。Kimi 声明了配置文件、自定义角色和 Freestyle;不声明需要可强制执行的无工具边界的结构化操作。
28
+ - **没有任何锁定。** 安装或移除某个提供方 CLI 会自动更新所有项目 — 不存在需要管理的按项目提供方设置。
34
29
 
35
30
  ## 按调用逐个选择提供方
36
31
 
@@ -245,12 +245,17 @@ Launching the already committed M1/M2+ tickets is ordinary Batch rail
245
245
  execution and can use Kimi.
246
246
 
247
247
  - **Launch Milestone 1** (`client/src/lib/milestone-launch.ts`
248
- `launchMilestone`): gather `M1`-labeled `todo` tickets → `POST /rails`
249
- (server allocates the lowest free index) → `PUT /rails/:i/tickets` → `POST
250
- /rails/:i/launch {mode:'batch-implement'}` (the server maps the bare mode to
251
- the batch factory loop: worktree isolation + ask-first PR). Offered on the
252
- Builder done screen and the sidebar entry; existing 409 guards surface as
253
- toasts.
248
+ `launchMilestone`): gather `M1`-labeled `todo` tickets → chunk into groups
249
+ of ≤ `MAX_TICKETS_PER_RAIL` (3) → per chunk: `POST /rails` (server allocates
250
+ the lowest free index; rails named `M1 · <k>` when the milestone needs more
251
+ than one) → `PUT /rails/:i/tickets` → `POST /rails/:i/launch
252
+ {mode:'batch-implement'}` (the server maps the bare mode to the batch
253
+ factory loop: worktree isolation + ask-first PR). The launch route rejects
254
+ any rail carrying more than 3 specs (`rail_ticket_cap_exceeded`), so the cap
255
+ holds for every launch door. A failure before anything launched surfaces as
256
+ a typed reason; a mid-batch failure keeps the launched rails and reports the
257
+ skipped rest (`skippedCount` → partial-launch toast). Offered on the Builder
258
+ done screen and the sidebar entry; existing 409 guards surface as toasts.
254
259
  - **Sidebar re-entry** (`BuilderSidebarEntry`, mounted in
255
260
  `ProjectRightSidebar` + `AgentWorkspaceSidebar`): visible iff
256
261
  `GET /api/projects/:id/blueprint` (project-router) returns a blueprint
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.32.0",
3
+ "version": "2.34.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InvalidSurfaceError = void 0;
4
4
  exports.recordInvocation = recordInvocation;
5
+ exports.sumInvocationCostForRuns = sumInvocationCostForRuns;
5
6
  exports.updateTicketIdForConversation = updateTicketIdForConversation;
6
7
  exports.listInvocationsForConversation = listInvocationsForConversation;
7
8
  exports.getTicketSpendingSummary = getTicketSpendingSummary;
@@ -45,6 +46,40 @@ function recordInvocation(db, input) {
45
46
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
46
47
  `).run(input.id, input.project_id, input.provider, input.surface, input.surface_ref_id ?? null, input.ticket_id ?? null, input.conversation_id ?? null, input.model ?? null, input.status, input.started_at, input.finished_at ?? null, input.duration_ms ?? null, input.duration_api_ms ?? null, input.tokens_in ?? null, input.tokens_out ?? null, input.tokens_cache_read ?? null, input.tokens_cache_create ?? null, input.total_cost_usd ?? null, input.total_cost_usd_estimated ? 1 : 0, input.num_turns ?? null, input.session_id ?? null, input.loop_run_id ?? null);
47
48
  }
49
+ /**
50
+ * Total AI spend attributable to a set of implementation runs, for the PR-body
51
+ * cost footer. A "run" id is either a loop_runs row id (loop AI-step/decider
52
+ * invocations link via `loop_run_id`) or a QueueManager job id (rows with
53
+ * surface='job' and `surface_ref_id` = the id, plus the merge-orchestrator's
54
+ * `<jobId>:merge:<step>` sub-rows). Failed/aborted rows count — they billed
55
+ * real tokens. Returns null when no priced rows match, so callers can omit
56
+ * the footer instead of printing $0.00 for legacy runs.
57
+ */
58
+ function sumInvocationCostForRuns(db, runIds) {
59
+ const ids = [...new Set(runIds.filter((id) => typeof id === 'string' && id.length > 0))];
60
+ if (ids.length === 0)
61
+ return null;
62
+ const placeholders = ids.map(() => '?').join(', ');
63
+ const mergePrefixes = ids.map(() => `surface_ref_id LIKE ? ESCAPE '\\'`).join(' OR ');
64
+ const rows = db.prepare(`SELECT total_cost_usd, total_cost_usd_estimated FROM ai_invocations
65
+ WHERE total_cost_usd IS NOT NULL
66
+ AND (loop_run_id IN (${placeholders})
67
+ OR surface_ref_id IN (${placeholders})
68
+ OR ${mergePrefixes})`).all(...ids, ...ids, ...ids.map((id) => `${escapeLikePattern(id)}:merge:%`));
69
+ if (rows.length === 0)
70
+ return null;
71
+ let totalUsd = 0;
72
+ let estimated = false;
73
+ for (const row of rows) {
74
+ totalUsd += row.total_cost_usd;
75
+ if (row.total_cost_usd_estimated === 1)
76
+ estimated = true;
77
+ }
78
+ return { totalUsd, estimated };
79
+ }
80
+ function escapeLikePattern(value) {
81
+ return value.replace(/[\\%_]/g, (ch) => `\\${ch}`);
82
+ }
48
83
  function updateTicketIdForConversation(db, conversationId, ticketId) {
49
84
  const result = db.prepare(`UPDATE ai_invocations SET ticket_id = ? WHERE conversation_id = ? AND ticket_id IS NULL`).run(ticketId, conversationId);
50
85
  return result.changes;
@@ -101,7 +101,7 @@ function createBlueprintCommitRunner(deps) {
101
101
  hasCore: deps.io?.hasCore ?? offline_assemble_1.canAssembleProject,
102
102
  mkdir: deps.io?.mkdir ?? ((dir) => fs_1.default.mkdirSync(dir, { recursive: true })),
103
103
  exec: deps.io?.exec ?? execCli,
104
- assemble: deps.io?.assemble ?? (async (opts) => (0, offline_assemble_1.assembleProjectOffline)(opts)),
104
+ assemble: deps.io?.assemble ?? (async (opts) => { await (0, offline_assemble_1.assembleProjectOffline)(opts); }),
105
105
  writePair: deps.io?.writePair ?? blueprint_render_1.writeBlueprintPair,
106
106
  mutateTickets: deps.io?.mutateTickets ?? ((filePath, fn) => { (0, ticket_store_1.mutateStore)(filePath, fn); }),
107
107
  registerProject: deps.io?.registerProject ??
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setProjectProvidersMirror = setProjectProvidersMirror;
6
7
  exports.getDesktopDbPath = getDesktopDbPath;
7
8
  exports.initDesktopDb = initDesktopDb;
8
9
  exports.listProjects = listProjects;
@@ -51,11 +52,31 @@ function parseProviders(raw, primary) {
51
52
  }
52
53
  return [primary];
53
54
  }
55
+ // Detected-set mirror (global-core-zero-friction). When the app-level
56
+ // detection singleton has a snapshot, every project row READS its `providers`
57
+ // as the machine's detected set (wire compat: the column keeps existing, but no
58
+ // longer gates anything) and its `provider` as the derived primary (stored
59
+ // primary while still detected → claude → fixed preference order). Null
60
+ // supplier (startup, unit tests) = legacy row behaviour, byte-identical.
61
+ let _detectedMirrorSupplier = null;
62
+ function setProjectProvidersMirror(fn) {
63
+ _detectedMirrorSupplier = fn;
64
+ }
65
+ const PRIMARY_PREFERENCE = ['claude', 'codex', 'gemini', 'kimi'];
54
66
  function mapProjectRow(raw) {
55
67
  if (!raw)
56
68
  return undefined;
57
69
  const provider = (raw.provider ?? 'claude');
58
- return { ...raw, provider, providers: parseProviders(raw.providers, provider) };
70
+ const stored = parseProviders(raw.providers, provider);
71
+ const detected = _detectedMirrorSupplier?.();
72
+ if (Array.isArray(detected) && detected.length > 0) {
73
+ const mirrored = detected;
74
+ let primary = mirrored.includes(provider) ? provider : undefined;
75
+ if (!primary)
76
+ primary = PRIMARY_PREFERENCE.find((p) => mirrored.includes(p)) ?? mirrored[0];
77
+ return { ...raw, provider: primary, providers: [...mirrored] };
78
+ }
79
+ return { ...raw, provider, providers: stored };
59
80
  }
60
81
  // ─── Desktop DB path ──────────────────────────────────────────────────────────
61
82
  function getDesktopDbPath() {