specrails-desktop 2.7.0 → 2.9.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 (329) hide show
  1. package/README.md +23 -19
  2. package/client/dist/assets/{ActivityFeedPage-LKqd18-G.js → ActivityFeedPage-DNqnf1fZ.js} +1 -1
  3. package/client/dist/assets/{AgentsPage-Cb-b-6Ot.js → AgentsPage-vmNIEbGM.js} +1 -1
  4. package/client/dist/assets/{AnalyticsPage-HVxQQ1wy.js → AnalyticsPage-CdfN0ofZ.js} +1 -1
  5. package/client/dist/assets/{BarChart-BOyHB0dw.js → BarChart-CIkopHjl.js} +1 -1
  6. package/client/dist/assets/{CodePage-DnOnwKGB.js → CodePage-DDRNU5FN.js} +1 -1
  7. package/client/dist/assets/{DesktopAnalyticsPage-D2auU39x.js → DesktopAnalyticsPage-Cl3sKKSG.js} +1 -1
  8. package/client/dist/assets/{DocsDialog-CTuDX3GK.js → DocsDialog-BGrBOfUr.js} +2 -2
  9. package/client/dist/assets/{DocsPage-DRyMmu0Z.js → DocsPage-CY-2SSzw.js} +2 -2
  10. package/client/dist/assets/{ExportDropdown-DO-GGiMh.js → ExportDropdown-BRHcvP0r.js} +1 -1
  11. package/client/dist/assets/{IntegrationsPage-BhbO4jFT.js → IntegrationsPage-nKdLB4Ub.js} +1 -1
  12. package/client/dist/assets/{JobDetailPage-DJooEg1s.js → JobDetailPage-Bf0A6WWQ.js} +1 -1
  13. package/client/dist/assets/{JobsPage-BbaC-YOg.js → JobsPage-Vg4nXPdL.js} +1 -1
  14. package/client/dist/assets/{dist-js-CiIVMsx3.js → dist-js-0i_klubI.js} +1 -1
  15. package/client/dist/assets/{dist-js-Xc2lRKp2.js → dist-js-CUs5GjwA.js} +1 -1
  16. package/client/dist/assets/{index-DK214dak.js → index-BXoHFtfG.js} +8 -8
  17. package/client/dist/assets/index-D6BaYRRU.css +2 -0
  18. package/client/dist/assets/{integrations-2C7MkGT0.js → integrations-7YyTBuU9.js} +1 -1
  19. package/client/dist/assets/{integrations-CX4p_bij.js → integrations-B9CEpNF0.js} +1 -1
  20. package/client/dist/assets/{integrations-C2jQtv-s.js → integrations-BlvAdewo.js} +1 -1
  21. package/client/dist/assets/{integrations-eQPHAYsE.js → integrations-Bw8UM9Xd.js} +1 -1
  22. package/client/dist/assets/{integrations-BDC670cg.js → integrations-C5SxNKnG.js} +1 -1
  23. package/client/dist/assets/{integrations-BqUmRUef.js → integrations-CJQKMmdW.js} +1 -1
  24. package/client/dist/assets/{integrations-CB98NeH5.js → integrations-DWz1eU_K.js} +1 -1
  25. package/client/dist/assets/{integrations-_SuVeQIG.js → integrations-DiPR8Fzp.js} +1 -1
  26. package/client/dist/assets/{lib-Bo5s6xpe.js → lib-D6M_MvoC.js} +1 -1
  27. package/client/dist/assets/setup-B6egeeTM.js +1 -0
  28. package/client/dist/assets/setup-BHroXlke.js +1 -0
  29. package/client/dist/assets/setup-BIXsWUp1.js +1 -0
  30. package/client/dist/assets/setup-BJRdg1iE.js +1 -0
  31. package/client/dist/assets/setup-C0rVGnCy.js +1 -0
  32. package/client/dist/assets/setup-Cpu17hJv.js +1 -0
  33. package/client/dist/assets/setup-D-1r0uSx.js +1 -0
  34. package/client/dist/assets/setup-Dn2-veYO.js +1 -0
  35. package/client/dist/assets/{useProjectCache-DVNypkmR.js → useProjectCache-BeyBSNpD.js} +1 -1
  36. package/client/dist/index.html +4 -4
  37. package/docs/README.md +5 -2
  38. package/docs/agy-cli-provider-study.md +78 -0
  39. package/docs/cli.md +23 -4
  40. package/docs/codex.md +116 -58
  41. package/docs/creating-specs.md +19 -5
  42. package/docs/customizing.md +27 -6
  43. package/docs/gemini.md +225 -73
  44. package/docs/getting-started.md +18 -9
  45. package/docs/guide/de/agents/1-meet-the-agents.md +38 -0
  46. package/docs/guide/de/agents/2-profiles-and-the-balanced-default.md +45 -0
  47. package/docs/guide/de/agents/3-customizing-models-per-agent.md +60 -0
  48. package/docs/guide/de/agents/4-custom-agents-catalog.md +43 -0
  49. package/docs/guide/de/getting-started/1-what-is-specrails.md +49 -0
  50. package/docs/guide/de/getting-started/2-installing-and-first-run.md +42 -0
  51. package/docs/guide/de/getting-started/3-adding-your-first-project.md +58 -0
  52. package/docs/guide/de/getting-started/4-the-dashboard-tour.md +53 -0
  53. package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +78 -0
  54. package/docs/guide/de/insights/2-the-integrated-terminal.md +46 -0
  55. package/docs/guide/de/insights/3-code-explorer.md +50 -0
  56. package/docs/guide/de/integrations/1-ai-providers.md +64 -0
  57. package/docs/guide/de/integrations/2-plugins.md +44 -0
  58. package/docs/guide/de/integrations/3-jira-integration.md +71 -0
  59. package/docs/guide/de/integrations/4-mobile-companion.md +38 -0
  60. package/docs/guide/de/pipeline/1-rails-and-jobs.md +94 -0
  61. package/docs/guide/de/pipeline/2-the-job-detail-view.md +90 -0
  62. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  63. package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +60 -0
  64. package/docs/guide/de/settings/1-themes.md +37 -0
  65. package/docs/guide/de/settings/2-language.md +39 -0
  66. package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  67. package/docs/guide/de/settings/4-where-your-data-lives.md +48 -0
  68. package/docs/guide/de/specs/1-specs-and-the-backlog.md +52 -0
  69. package/docs/guide/de/specs/2-add-spec-quick-mode.md +45 -0
  70. package/docs/guide/de/specs/3-add-spec-explore-mode.md +68 -0
  71. package/docs/guide/de/specs/4-drafts-and-contract-layer.md +81 -0
  72. package/docs/guide/en/agents/1-meet-the-agents.md +38 -0
  73. package/docs/guide/en/agents/2-profiles-and-the-balanced-default.md +45 -0
  74. package/docs/guide/en/agents/3-customizing-models-per-agent.md +60 -0
  75. package/docs/guide/en/agents/4-custom-agents-catalog.md +43 -0
  76. package/docs/guide/en/getting-started/1-what-is-specrails.md +49 -0
  77. package/docs/guide/en/getting-started/2-installing-and-first-run.md +42 -0
  78. package/docs/guide/en/getting-started/3-adding-your-first-project.md +58 -0
  79. package/docs/guide/en/getting-started/4-the-dashboard-tour.md +53 -0
  80. package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +78 -0
  81. package/docs/guide/en/insights/2-the-integrated-terminal.md +46 -0
  82. package/docs/guide/en/insights/3-code-explorer.md +50 -0
  83. package/docs/guide/en/integrations/1-ai-providers.md +64 -0
  84. package/docs/guide/en/integrations/2-plugins.md +44 -0
  85. package/docs/guide/en/integrations/3-jira-integration.md +71 -0
  86. package/docs/guide/en/integrations/4-mobile-companion.md +38 -0
  87. package/docs/guide/en/pipeline/1-rails-and-jobs.md +94 -0
  88. package/docs/guide/en/pipeline/2-the-job-detail-view.md +90 -0
  89. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  90. package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +60 -0
  91. package/docs/guide/en/settings/1-themes.md +37 -0
  92. package/docs/guide/en/settings/2-language.md +39 -0
  93. package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  94. package/docs/guide/en/settings/4-where-your-data-lives.md +48 -0
  95. package/docs/guide/en/specs/1-specs-and-the-backlog.md +52 -0
  96. package/docs/guide/en/specs/2-add-spec-quick-mode.md +45 -0
  97. package/docs/guide/en/specs/3-add-spec-explore-mode.md +68 -0
  98. package/docs/guide/en/specs/4-drafts-and-contract-layer.md +81 -0
  99. package/docs/guide/es/agents/1-meet-the-agents.md +38 -0
  100. package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +45 -0
  101. package/docs/guide/es/agents/3-customizing-models-per-agent.md +60 -0
  102. package/docs/guide/es/agents/4-custom-agents-catalog.md +43 -0
  103. package/docs/guide/es/getting-started/1-what-is-specrails.md +49 -0
  104. package/docs/guide/es/getting-started/2-installing-and-first-run.md +42 -0
  105. package/docs/guide/es/getting-started/3-adding-your-first-project.md +58 -0
  106. package/docs/guide/es/getting-started/4-the-dashboard-tour.md +53 -0
  107. package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +78 -0
  108. package/docs/guide/es/insights/2-the-integrated-terminal.md +46 -0
  109. package/docs/guide/es/insights/3-code-explorer.md +50 -0
  110. package/docs/guide/es/integrations/1-ai-providers.md +64 -0
  111. package/docs/guide/es/integrations/2-plugins.md +44 -0
  112. package/docs/guide/es/integrations/3-jira-integration.md +71 -0
  113. package/docs/guide/es/integrations/4-mobile-companion.md +38 -0
  114. package/docs/guide/es/pipeline/1-rails-and-jobs.md +94 -0
  115. package/docs/guide/es/pipeline/2-the-job-detail-view.md +90 -0
  116. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  117. package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +60 -0
  118. package/docs/guide/es/settings/1-themes.md +37 -0
  119. package/docs/guide/es/settings/2-language.md +39 -0
  120. package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  121. package/docs/guide/es/settings/4-where-your-data-lives.md +48 -0
  122. package/docs/guide/es/specs/1-specs-and-the-backlog.md +52 -0
  123. package/docs/guide/es/specs/2-add-spec-quick-mode.md +45 -0
  124. package/docs/guide/es/specs/3-add-spec-explore-mode.md +68 -0
  125. package/docs/guide/es/specs/4-drafts-and-contract-layer.md +81 -0
  126. package/docs/guide/fr/agents/1-meet-the-agents.md +38 -0
  127. package/docs/guide/fr/agents/2-profiles-and-the-balanced-default.md +45 -0
  128. package/docs/guide/fr/agents/3-customizing-models-per-agent.md +60 -0
  129. package/docs/guide/fr/agents/4-custom-agents-catalog.md +43 -0
  130. package/docs/guide/fr/getting-started/1-what-is-specrails.md +49 -0
  131. package/docs/guide/fr/getting-started/2-installing-and-first-run.md +42 -0
  132. package/docs/guide/fr/getting-started/3-adding-your-first-project.md +58 -0
  133. package/docs/guide/fr/getting-started/4-the-dashboard-tour.md +53 -0
  134. package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +78 -0
  135. package/docs/guide/fr/insights/2-the-integrated-terminal.md +46 -0
  136. package/docs/guide/fr/insights/3-code-explorer.md +50 -0
  137. package/docs/guide/fr/integrations/1-ai-providers.md +64 -0
  138. package/docs/guide/fr/integrations/2-plugins.md +44 -0
  139. package/docs/guide/fr/integrations/3-jira-integration.md +71 -0
  140. package/docs/guide/fr/integrations/4-mobile-companion.md +38 -0
  141. package/docs/guide/fr/pipeline/1-rails-and-jobs.md +94 -0
  142. package/docs/guide/fr/pipeline/2-the-job-detail-view.md +90 -0
  143. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  144. package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +60 -0
  145. package/docs/guide/fr/settings/1-themes.md +37 -0
  146. package/docs/guide/fr/settings/2-language.md +39 -0
  147. package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  148. package/docs/guide/fr/settings/4-where-your-data-lives.md +48 -0
  149. package/docs/guide/fr/specs/1-specs-and-the-backlog.md +52 -0
  150. package/docs/guide/fr/specs/2-add-spec-quick-mode.md +45 -0
  151. package/docs/guide/fr/specs/3-add-spec-explore-mode.md +68 -0
  152. package/docs/guide/fr/specs/4-drafts-and-contract-layer.md +81 -0
  153. package/docs/guide/it/agents/1-meet-the-agents.md +38 -0
  154. package/docs/guide/it/agents/2-profiles-and-the-balanced-default.md +45 -0
  155. package/docs/guide/it/agents/3-customizing-models-per-agent.md +60 -0
  156. package/docs/guide/it/agents/4-custom-agents-catalog.md +43 -0
  157. package/docs/guide/it/getting-started/1-what-is-specrails.md +49 -0
  158. package/docs/guide/it/getting-started/2-installing-and-first-run.md +42 -0
  159. package/docs/guide/it/getting-started/3-adding-your-first-project.md +58 -0
  160. package/docs/guide/it/getting-started/4-the-dashboard-tour.md +53 -0
  161. package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +78 -0
  162. package/docs/guide/it/insights/2-the-integrated-terminal.md +46 -0
  163. package/docs/guide/it/insights/3-code-explorer.md +50 -0
  164. package/docs/guide/it/integrations/1-ai-providers.md +64 -0
  165. package/docs/guide/it/integrations/2-plugins.md +44 -0
  166. package/docs/guide/it/integrations/3-jira-integration.md +71 -0
  167. package/docs/guide/it/integrations/4-mobile-companion.md +38 -0
  168. package/docs/guide/it/pipeline/1-rails-and-jobs.md +94 -0
  169. package/docs/guide/it/pipeline/2-the-job-detail-view.md +90 -0
  170. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  171. package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +60 -0
  172. package/docs/guide/it/settings/1-themes.md +37 -0
  173. package/docs/guide/it/settings/2-language.md +39 -0
  174. package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  175. package/docs/guide/it/settings/4-where-your-data-lives.md +48 -0
  176. package/docs/guide/it/specs/1-specs-and-the-backlog.md +52 -0
  177. package/docs/guide/it/specs/2-add-spec-quick-mode.md +45 -0
  178. package/docs/guide/it/specs/3-add-spec-explore-mode.md +68 -0
  179. package/docs/guide/it/specs/4-drafts-and-contract-layer.md +81 -0
  180. package/docs/guide/ja/agents/1-meet-the-agents.md +38 -0
  181. package/docs/guide/ja/agents/2-profiles-and-the-balanced-default.md +45 -0
  182. package/docs/guide/ja/agents/3-customizing-models-per-agent.md +60 -0
  183. package/docs/guide/ja/agents/4-custom-agents-catalog.md +43 -0
  184. package/docs/guide/ja/getting-started/1-what-is-specrails.md +49 -0
  185. package/docs/guide/ja/getting-started/2-installing-and-first-run.md +42 -0
  186. package/docs/guide/ja/getting-started/3-adding-your-first-project.md +58 -0
  187. package/docs/guide/ja/getting-started/4-the-dashboard-tour.md +53 -0
  188. package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +78 -0
  189. package/docs/guide/ja/insights/2-the-integrated-terminal.md +46 -0
  190. package/docs/guide/ja/insights/3-code-explorer.md +50 -0
  191. package/docs/guide/ja/integrations/1-ai-providers.md +64 -0
  192. package/docs/guide/ja/integrations/2-plugins.md +44 -0
  193. package/docs/guide/ja/integrations/3-jira-integration.md +71 -0
  194. package/docs/guide/ja/integrations/4-mobile-companion.md +38 -0
  195. package/docs/guide/ja/pipeline/1-rails-and-jobs.md +94 -0
  196. package/docs/guide/ja/pipeline/2-the-job-detail-view.md +90 -0
  197. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  198. package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +60 -0
  199. package/docs/guide/ja/settings/1-themes.md +37 -0
  200. package/docs/guide/ja/settings/2-language.md +39 -0
  201. package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  202. package/docs/guide/ja/settings/4-where-your-data-lives.md +48 -0
  203. package/docs/guide/ja/specs/1-specs-and-the-backlog.md +52 -0
  204. package/docs/guide/ja/specs/2-add-spec-quick-mode.md +45 -0
  205. package/docs/guide/ja/specs/3-add-spec-explore-mode.md +68 -0
  206. package/docs/guide/ja/specs/4-drafts-and-contract-layer.md +81 -0
  207. package/docs/guide/pt/agents/1-meet-the-agents.md +38 -0
  208. package/docs/guide/pt/agents/2-profiles-and-the-balanced-default.md +45 -0
  209. package/docs/guide/pt/agents/3-customizing-models-per-agent.md +60 -0
  210. package/docs/guide/pt/agents/4-custom-agents-catalog.md +43 -0
  211. package/docs/guide/pt/getting-started/1-what-is-specrails.md +49 -0
  212. package/docs/guide/pt/getting-started/2-installing-and-first-run.md +42 -0
  213. package/docs/guide/pt/getting-started/3-adding-your-first-project.md +58 -0
  214. package/docs/guide/pt/getting-started/4-the-dashboard-tour.md +53 -0
  215. package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +78 -0
  216. package/docs/guide/pt/insights/2-the-integrated-terminal.md +46 -0
  217. package/docs/guide/pt/insights/3-code-explorer.md +50 -0
  218. package/docs/guide/pt/integrations/1-ai-providers.md +64 -0
  219. package/docs/guide/pt/integrations/2-plugins.md +44 -0
  220. package/docs/guide/pt/integrations/3-jira-integration.md +71 -0
  221. package/docs/guide/pt/integrations/4-mobile-companion.md +38 -0
  222. package/docs/guide/pt/pipeline/1-rails-and-jobs.md +94 -0
  223. package/docs/guide/pt/pipeline/2-the-job-detail-view.md +90 -0
  224. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  225. package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +60 -0
  226. package/docs/guide/pt/settings/1-themes.md +37 -0
  227. package/docs/guide/pt/settings/2-language.md +39 -0
  228. package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  229. package/docs/guide/pt/settings/4-where-your-data-lives.md +48 -0
  230. package/docs/guide/pt/specs/1-specs-and-the-backlog.md +52 -0
  231. package/docs/guide/pt/specs/2-add-spec-quick-mode.md +45 -0
  232. package/docs/guide/pt/specs/3-add-spec-explore-mode.md +68 -0
  233. package/docs/guide/pt/specs/4-drafts-and-contract-layer.md +81 -0
  234. package/docs/guide/zh/agents/1-meet-the-agents.md +38 -0
  235. package/docs/guide/zh/agents/2-profiles-and-the-balanced-default.md +45 -0
  236. package/docs/guide/zh/agents/3-customizing-models-per-agent.md +60 -0
  237. package/docs/guide/zh/agents/4-custom-agents-catalog.md +43 -0
  238. package/docs/guide/zh/getting-started/1-what-is-specrails.md +49 -0
  239. package/docs/guide/zh/getting-started/2-installing-and-first-run.md +42 -0
  240. package/docs/guide/zh/getting-started/3-adding-your-first-project.md +58 -0
  241. package/docs/guide/zh/getting-started/4-the-dashboard-tour.md +53 -0
  242. package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +78 -0
  243. package/docs/guide/zh/insights/2-the-integrated-terminal.md +46 -0
  244. package/docs/guide/zh/insights/3-code-explorer.md +50 -0
  245. package/docs/guide/zh/integrations/1-ai-providers.md +64 -0
  246. package/docs/guide/zh/integrations/2-plugins.md +44 -0
  247. package/docs/guide/zh/integrations/3-jira-integration.md +71 -0
  248. package/docs/guide/zh/integrations/4-mobile-companion.md +38 -0
  249. package/docs/guide/zh/pipeline/1-rails-and-jobs.md +94 -0
  250. package/docs/guide/zh/pipeline/2-the-job-detail-view.md +90 -0
  251. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +78 -0
  252. package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +60 -0
  253. package/docs/guide/zh/settings/1-themes.md +37 -0
  254. package/docs/guide/zh/settings/2-language.md +39 -0
  255. package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
  256. package/docs/guide/zh/settings/4-where-your-data-lives.md +48 -0
  257. package/docs/guide/zh/specs/1-specs-and-the-backlog.md +52 -0
  258. package/docs/guide/zh/specs/2-add-spec-quick-mode.md +45 -0
  259. package/docs/guide/zh/specs/3-add-spec-explore-mode.md +68 -0
  260. package/docs/guide/zh/specs/4-drafts-and-contract-layer.md +81 -0
  261. package/docs/internals/README.md +1 -1
  262. package/docs/internals/adding-a-provider.md +192 -59
  263. package/docs/internals/api-reference.md +130 -21
  264. package/docs/internals/architecture.md +22 -9
  265. package/docs/internals/bundled-framework-build-plan.md +264 -0
  266. package/docs/internals/configuration.md +33 -8
  267. package/docs/internals/global-artifacts-alignment-contract.md +486 -0
  268. package/docs/internals/global-artifacts-relocation-evaluation.md +294 -0
  269. package/docs/internals/operations-runbook.md +16 -5
  270. package/docs/internals/profiles.md +42 -14
  271. package/docs/platforms/macos.md +27 -8
  272. package/docs/platforms/windows.md +20 -6
  273. package/docs/running-pipelines.md +17 -9
  274. package/docs/terminal.md +9 -3
  275. package/docs/tracking-cost.md +17 -11
  276. package/package.json +1 -1
  277. package/server/dist/agent-refine-manager.js +20 -5
  278. package/server/dist/artifact-registry.js +468 -0
  279. package/server/dist/attachment-manager.js +5 -8
  280. package/server/dist/browser-capture-manager.js +4 -4
  281. package/server/dist/bundled-core.js +72 -0
  282. package/server/dist/bundled-openspec.js +58 -0
  283. package/server/dist/chat-manager.js +42 -5
  284. package/server/dist/code-explorer-router.js +10 -7
  285. package/server/dist/config.js +7 -2
  286. package/server/dist/context-budget.js +17 -6
  287. package/server/dist/context-scope.js +6 -2
  288. package/server/dist/contract-refine-runner.js +31 -9
  289. package/server/dist/desktop-router.js +39 -14
  290. package/server/dist/docs-router.js +210 -132
  291. package/server/dist/file-summary-manager.js +41 -16
  292. package/server/dist/framework-manager.js +248 -0
  293. package/server/dist/framework-migration.js +308 -0
  294. package/server/dist/index.js +30 -0
  295. package/server/dist/install-config-path.js +73 -0
  296. package/server/dist/jira/jira-sync-manager.js +23 -11
  297. package/server/dist/openspec-shim.js +153 -0
  298. package/server/dist/plugins-router.js +19 -8
  299. package/server/dist/profiles-router.js +38 -16
  300. package/server/dist/project-registry.js +101 -3
  301. package/server/dist/project-router-chat.js +1 -1
  302. package/server/dist/project-router-helpers.js +25 -12
  303. package/server/dist/project-router-jobs.js +3 -3
  304. package/server/dist/project-router-settings.js +8 -6
  305. package/server/dist/project-router-setup.js +27 -10
  306. package/server/dist/project-router-spending.js +6 -1
  307. package/server/dist/project-router-tickets.js +30 -10
  308. package/server/dist/project-router.js +16 -1
  309. package/server/dist/providers/gemini-adapter.js +4 -0
  310. package/server/dist/providers/gemini-agent-ack.js +65 -0
  311. package/server/dist/queue-manager.js +156 -12
  312. package/server/dist/setup-manager.js +131 -29
  313. package/server/dist/smash-runner.js +21 -6
  314. package/server/dist/ticket-store.js +6 -2
  315. package/server/dist/ticket-watcher.js +5 -1
  316. package/server/dist/util/stream-display.js +18 -3
  317. package/server/dist/vitest-setup.js +25 -0
  318. package/server/dist/workspace-manager.js +199 -0
  319. package/server/dist/workspace-resolution.js +147 -0
  320. package/client/dist/assets/index-DgKfQFcf.css +0 -2
  321. package/client/dist/assets/setup-BIIkb-_K.js +0 -1
  322. package/client/dist/assets/setup-BeQxu9kD.js +0 -1
  323. package/client/dist/assets/setup-CPa6GnlI.js +0 -1
  324. package/client/dist/assets/setup-CZl4OEJx.js +0 -1
  325. package/client/dist/assets/setup-ChpodNfn.js +0 -1
  326. package/client/dist/assets/setup-D_fjJH6u.js +0 -1
  327. package/client/dist/assets/setup-YzD8DX4O.js +0 -1
  328. package/client/dist/assets/setup-fRpDozmq.js +0 -1
  329. package/docs/adding-a-provider.md +0 -107
@@ -50,21 +50,28 @@ Compare the output against the matching architecture's `sha256` (`platforms["win
50
50
  The desktop app ships its own **Node** and **Git** runtimes inside the bundle, so you do **not** need to pre-install them:
51
51
 
52
52
  - `runtimes/node/{node.exe, npm.cmd, npx.cmd}`
53
- - `runtimes/git/cmd/git.exe`
53
+ - `runtimes/git/cmd/git.exe` (the app probes this path first, then falls back to `runtimes/git/bin/git.exe` — PortableGit ships the real binary at `cmd/git.exe` with a redirector at `bin/git.exe`)
54
54
 
55
55
  When the bundle is present, the Tauri host sets `SPECRAILS_IS_DESKTOP=1` and `SPECRAILS_BUNDLED_RUNTIMES_PATH`, and the embedded server prepends the bundled `node`/`git` directories to the front of `PATH` so a system install can never shadow them. If a build ships **without** the runtimes (or a partial extraction occurs), the app does not dead-end — it falls back to discovering `node`/`git` on your system `PATH` (probed with Windows `where.exe`) instead of reporting a corrupted bundle.
56
56
 
57
- The **provider CLIs** — **Claude Code** and **Codex** — are **never bundled**. They are always probed via your system `PATH`, in every mode. Install at least one before adding a project; the prerequisites panel blocks Add Project until one is usable.
57
+ The **provider CLIs** — **Claude Code**, **Codex**, and **Gemini** — are **never bundled**. All three are probed via your system `PATH`, in every mode (using Windows `where.exe`). Install at least one before adding a project; the prerequisites panel blocks Add Project until one is usable. All three are enabled by default; you can roll one back with `SPECRAILS_CODEX_BETA=0` or `SPECRAILS_GEMINI_BETA=0` (each disabled only by the exact string `0`). See the per-provider setup guides: [Codex](../codex.md) and [Gemini](../gemini.md).
58
58
 
59
59
  ## Updates
60
60
 
61
- The desktop app self-updates via the Tauri updater plugin. It checks a GitHub Releases `latest.json` endpoint and, on Windows, applies updates with `installMode: "passive"` — the update runs with a minimal progress UI and the app relaunches into the new version. Because the installers are unsigned, an applied update may surface the same SmartScreen prompt; click **More info → Run anyway** as during the first install.
61
+ The desktop app self-updates via the Tauri updater plugin. It checks a GitHub Releases `latest.json` endpoint and, on Windows, applies updates with `installMode: "passive"` — the update runs with a minimal progress UI and the app relaunches into the new version.
62
+
63
+ Note that updates are delivered as the **MSI** (verified by an embedded **minisign** signature the updater checks before applying), not the NSIS `-setup.exe` used for first install. Because the installers are not Authenticode-signed, an applied update may still surface the same SmartScreen prompt; click **More info → Run anyway** as during the first install.
62
64
 
63
65
  ## Setup wizard
64
66
 
65
- When you add a project, the setup wizard runs `npx specrails-core@latest init --from-config` under the hood (the full spawn is `npx --yes --prefer-online specrails-core@latest init --yes --from-config <tempPath>`, with the app writing a temporary `install-config.yaml`). The wizard has three steps — **Configure / Install / Done**.
67
+ When you add a project, the setup wizard runs `npx specrails-core@^4.8.0 init --from-config` under the hood (the full spawn is `npx --yes --prefer-online specrails-core@^4.8.0 init --yes --from-config <tempPath>`, with the app writing a temporary `install-config.yaml`). The wizard has three steps — **Configure / Install / Done**.
68
+
69
+ There are two distinct version floors to be aware of:
70
+
71
+ - The app **installs** `specrails-core@^4.8.0` — the major-pinned range it ships (4.8.0 is the release that adds the Gemini provider target). The exact package spec is the `CORE_PACKAGE_SPEC` constant in `server/core-package.ts`, so it stays verifiable in one place. You need internet access at install time so `npx` can resolve it.
72
+ - The minimum it will **accept** at runtime is **specrails-core ≥ 4.1.0** — the Node-native installer floor (`MIN_NODE_NATIVE_CORE_VERSION`). Anything below that is a legacy bash/python3 installer and cannot run on Windows without WSL.
66
73
 
67
- This requires **specrails-core 4.1.0** the Node-native installer floor enforced by the app (`MIN_NODE_NATIVE_CORE_VERSION`). Earlier bash/python3 installers cannot run on Windows without WSL. The app pins `@latest` on every spawn, so the constraint resolves automatically as long as you have internet access at install time.
74
+ You can point the app at a local or linked build with the `SPECRAILS_CORE_BIN` environment variable (it overrides the `npx` spec above).
68
75
 
69
76
  Reserved paths (`.specrails/profiles/**`, `.claude/agents/custom-*.md`) are preserved across re-runs per the contract documented in [specrails-core's README](https://github.com/fjpulidop/specrails-core#reserved-paths).
70
77
 
@@ -76,6 +83,13 @@ Reserved paths (`.specrails/profiles/**`, `.claude/agents/custom-*.md`) are pres
76
83
  ## Known limitations
77
84
 
78
85
  - **Terminal panel shell**: the bottom terminal panel auto-prefers **PowerShell 7 (`pwsh.exe`)** when it is on your `PATH`, then falls back to Windows PowerShell (`powershell.exe`), and finally `COMSPEC`/`cmd.exe`. Set the `SHELL` environment variable to override the platform default with any shell you prefer. Per-session shell selection is not yet exposed in the UI.
79
- - **Port 4200** must be free on launch. The app binds `127.0.0.1:4200` for its API + WebSocket. If another process holds it, the app shows a native **Specrails — Port Conflict** dialog and exits.
86
+ - **Port 4200** must be free on launch. The app binds `127.0.0.1:4200` for its API + WebSocket. If another process holds it, the app shows a native **Specrails — Port Conflict** dialog and exits. When you need to investigate, two files under `%USERPROFILE%\.specrails\` help: `desktop.log` (the embedded server's log output) and `manager.pid` (the running server's process ID).
80
87
  - **Custom window chrome**: the app uses a frameless window with a custom titlebar; the min/max/close controls are rendered by the app.
81
88
  - **Code signing**: Windows builds are unsigned in v1 (see SmartScreen above). Authenticode signing is deferred to a later release.
89
+
90
+ ## See also
91
+
92
+ - [macOS platform guide](./macos.md) — the equivalent guide for Apple Silicon.
93
+ - [Getting started](../getting-started.md) — first run, adding a project, the dashboard tour.
94
+ - [Codex provider setup](../codex.md) and [Gemini provider setup](../gemini.md) — installing and configuring the provider CLIs.
95
+ - [CLI reference](../cli.md) — driving Specrails from the command line.
@@ -21,7 +21,7 @@ SpecsBoard (left) Rails (right)
21
21
 
22
22
  A **rail** is an execution lane. Drag a spec card from the SpecsBoard onto a rail and press **▶ Play** to launch the pipeline. Rails let you organise and queue work into named lanes.
23
23
 
24
- Rails run on **Claude** by default. If your project has both providers installed, a per-rail engine selector lets you launch a rail on **Codex** instead — see [Using Codex](codex.md).
24
+ Rails run on **Claude** by default. If your project has more than one provider installed, a per-rail engine selector lets you launch a rail on **Codex** or **Gemini** instead — see [Using Codex](codex.md) and [Using Gemini](gemini.md). Only **Ultracode** mode is Claude-only; the standard Implement and Batch pipelines run on any installed provider.
25
25
 
26
26
  > **One job at a time per project.** Each project has a single queue, so within a project only one rail job runs at a time; the rest queue behind it. Real parallelism is **across projects** — open two projects and their rails run independently. See [Running multiple rails](#running-multiple-rails).
27
27
 
@@ -33,7 +33,7 @@ Each rail has a header with:
33
33
  - **Spec list** — the IDs of the specs assigned to this rail. Drag in more, drag out to detach. You can also use the **Move to rail** popover from a spec card; it shows a status dot per rail so you don't push work onto a busy lane.
34
34
  - **Mode segmented control** — `Implement`, `Batch`, and (Claude rails only) `Ultra`. See [Rail modes](#rail-modes).
35
35
  - **Profile picker** — which agent profile this rail uses. This only appears once the project has **at least one** profile (create them on the Agents page). When present, `No profile` runs the rail in legacy mode.
36
- - **Engine selector** — Claude vs Codex. Only renders on projects with more than one provider installed.
36
+ - **Engine selector** — pick which installed provider (Claude, Codex, or Gemini) runs this rail. Only renders on projects with more than one provider installed.
37
37
  - **Play / Stop button** — start or cancel.
38
38
 
39
39
  ### Rail modes
@@ -54,7 +54,7 @@ The mode is a segmented control in the rail header, persisted per rail.
54
54
  Architect ──► Developer ──► Reviewer ──► Ship
55
55
  ```
56
56
 
57
- Each phase is a specialised Claude Code agent invoked in your project's working directory:
57
+ Each phase is a specialised agent invoked by the rail's engine (Claude, Codex, or Gemini) in your project's working directory:
58
58
 
59
59
  | Phase | Agent | What it does |
60
60
  |-------|-------|--------------|
@@ -63,7 +63,7 @@ Each phase is a specialised Claude Code agent invoked in your project's working
63
63
  | Reviewer | `sr-reviewer` | Reviews the output |
64
64
  | Ship | (varies) | Final wrap-up: tests, commit, PR draft |
65
65
 
66
- The exact agent for each phase is determined by your project's agent profile. The baseline trio (`sr-architect`, `sr-developer`, `sr-reviewer`) is mandatory; routing rules in the profile can fan-out or override. The phase progress bar only renders when the command defines phases.
66
+ In plain terms: the project's **agent profile** decides which AI agent handles each phase. The baseline trio (`sr-architect`, `sr-developer`, `sr-reviewer`) is always present; a profile's routing rules can add extra agents or swap which one runs a phase. The phase progress bar only renders when the command defines phases. For the full format, see [internals/profiles.md](internals/profiles.md).
67
67
 
68
68
  ### Ultracode mode
69
69
 
@@ -72,9 +72,10 @@ The exact agent for each phase is determined by your project's agent profile. Th
72
72
  - **One job per spec.** If the rail has three specs, `Ultra` launches three independent jobs.
73
73
  - **Variable cost.** Because the run is open-ended, pressing Play opens a confirmation dialog before anything spawns.
74
74
  - **Model picker.** A per-rail control lets you pick **Haiku / Sonnet / Opus** (default Sonnet) for the Ultracode run.
75
- - **Claude only.** The `Ultra` segment and its model picker only appear when the rail's engine is Claude. Agent profiles don't apply to Ultracode rails.
75
+ - **Claude only.** The `Ultra` segment and its model picker only appear when the rail's engine is Claude. Codex and Gemini rails can't run Ultracode, and agent profiles don't apply to Ultracode rails.
76
+ - **Interactive (optional).** An `Interactive` toggle next to the `Ultra` segment turns the run into a back-and-forth session: you can chat with the running job, send follow-up prompts, and click **Finalize** when you're done. Without it, the job runs to completion on its own. (Available when the rail is idle; can be disabled server-side via `SPECRAILS_INTERACTIVE_JOBS=false`.)
76
77
 
77
- You can customise the Ultracode pre-prompt per project on the [Settings page](customizing.md#per-project-settings).
78
+ You can customise the Ultracode pre-prompt per project on the [Settings page](customizing.md#ultracode-pre-prompt).
78
79
 
79
80
  ### Running multiple rails
80
81
 
@@ -102,10 +103,10 @@ Click a card to open the **Job Detail page**.
102
103
 
103
104
  ### Job Detail page
104
105
 
105
- Two purpose-built components above the streaming log:
106
+ Two panels sit above the streaming log:
106
107
 
107
- - **`JobStatusPanel`** header with a status icon, a live duration ticker, and an incremental counter for turns + tokens + cost (derived from streaming `assistant` events). Cost shows `—` until the authoritative `total_cost_usd` arrives at job exit.
108
- - **`JobTicketHeader`** — chips for every ticket the job touched (resolved by parsing the `command` and matching against the spec board). Click a chip to open the spec's detail modal over the job page without changing the route. A `+N more` collapse mode kicks in at ≥ 4 tickets.
108
+ - **Status header** a status icon and a live duration timer (the one genuinely live number), plus an activity line showing what the job is doing right now and a count of steps taken. Cost, turns, and tokens are deliberately **not** estimated mid-run — they show as pending and are revealed with their final, authoritative values when the job exits.
109
+ - **Ticket header** — chips for every spec the job touched (matched from the launched command). Click a chip to open that spec's detail over the job page without leaving it. With four or more tickets, the chips collapse into a `+N more` mode you can expand.
109
110
 
110
111
  Below: the full streaming log with auto-scroll, search, and copy.
111
112
 
@@ -113,6 +114,10 @@ Below: the full streaming log with auto-scroll, search, and copy.
113
114
 
114
115
  Click **Stop** on the rail header. The app sends `SIGTERM` to the subprocess, waits **5 s**, then `SIGKILL`.
115
116
 
117
+ ### If a rail won't launch
118
+
119
+ If you pick an engine whose CLI isn't installed on your machine, the launch fails fast instead of starting a broken job. Install the missing provider CLI — see [Using Codex](codex.md) or [Using Gemini](gemini.md) — then launch again. (Missing Claude or Codex returns a precise "*&lt;provider&gt; CLI not found*" message; missing Gemini surfaces a generic launch error today, but the result is the same — nothing spawns.)
120
+
116
121
  ### Diagnostic export
117
122
 
118
123
  Visible only when [telemetry](customizing.md#telemetry) was enabled for the job. Click **Export diagnostic** in the Job Detail header to download a ZIP containing:
@@ -152,6 +157,8 @@ Pick the profile from the **rail header's profile dropdown**. It's preselected t
152
157
 
153
158
  The **`No profile`** option always exists — use it to run a rail exactly as it did pre-4.1.0. (The dropdown itself only appears once the project has at least one profile.)
154
159
 
160
+ > **Profiles apply to Claude rails only.** When a rail's engine is Codex or Gemini, the run always uses legacy mode — any selected profile is ignored. Profiles are a Claude-specific feature.
161
+
155
162
  ### Custom agents (Agent Studio)
156
163
 
157
164
  From the Agents Catalog tab, the toolbar offers three creation entry points:
@@ -237,4 +244,5 @@ If something looks wrong:
237
244
  - [Tracking cost](tracking-cost.md) — see what each rail run is costing you.
238
245
  - [Customising the app](customizing.md) — daily budget, per-job alerts, telemetry.
239
246
  - [Using Codex](codex.md) — run rails on the Codex CLI.
247
+ - [Using Gemini](gemini.md) — run rails on the Gemini CLI.
240
248
  - [Agent profile internals](internals/profiles.md) — for power users.
package/docs/terminal.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  specrails-desktop ships a full-featured terminal at the bottom of the window. Toggle it with `Cmd+J` (macOS) or `Ctrl+J` (other). It's a real xterm.js with WebGL rendering, shell integration, scrollback search, file drag-and-drop, inline images, and a few quality-of-life touches you won't find in a plain terminal app.
4
4
 
5
+ The panel opens your usual shell. On macOS/Linux it honours `$SHELL` (falling back to `/bin/zsh` when `$SHELL` is unset); on Windows it picks PowerShell (`pwsh`, then the built-in `powershell.exe`) and only falls back to `cmd.exe` as a last resort.
6
+
7
+ > The terminal panel is **on by default**. To turn it off entirely, set `SPECRAILS_TERMINAL_PANEL=false` (server) or build the client with `VITE_FEATURE_TERMINAL_PANEL=false` — both are opt-out (any other value, or unset, keeps the panel on).
8
+
5
9
  ```
6
10
  ┌──────────────────────────────────────────────────────────────┐
7
11
  │ Dashboard content │
@@ -28,7 +32,7 @@ You don't have to. You can keep using iTerm/Windows Terminal/Alacritty/whatever
28
32
 
29
33
  The panel header carries three one-click shortcuts:
30
34
 
31
- - **Open AI CLI** (✨ Sparkles) — spins up a fresh session and types your CLI for you. On a single-provider project it launches that provider's CLI directly (`claude` or `codex`); on a multi-provider project it opens a small picker so you choose which CLI to start.
35
+ - **Open AI CLI** (✨ Sparkles) — spins up a fresh session and types the launch command for you. On a single-provider project it launches the project's provider CLI directly (`claude`, `codex`, or `gemini`); on a multi-provider project it opens a small picker so you choose which CLI to start.
32
36
  - **Open in browser** (🌐 Globe) — opens the URL from the `browserShortcutUrl` setting (default `https://specrails.dev`). Right-click it to jump to the setting and change the URL.
33
37
  - **Paste quick script** (`</>`) — writes the snippet from the `quickScript` setting (which defaults to a personalised `echo "Wake up, <username> …"` reminder, editable in Settings) into the active session. Right-click it to edit the snippet in Settings. Disabled when there's no active terminal or the snippet is empty.
34
38
 
@@ -79,7 +83,7 @@ If shell integration doesn't bootstrap — for example your `~/.zshrc` runs `exe
79
83
  Inside the Tauri desktop app, drop one or more files from Finder/Explorer onto the terminal viewport to paste their absolute paths into the active session. Paths are shell-quoted for your host platform:
80
84
 
81
85
  - macOS / Linux — POSIX single-quote
82
- - Windows — double-quote with `^`-escaped percent/caret (matches `cmd.exe` rules)
86
+ - Windows — PowerShell single-quote (the panel's default Windows shell is PowerShell, where single-quoted strings are literal, so this is injection-safe)
83
87
 
84
88
  In a plain browser context this is a silent no-op — the browser doesn't expose `File.path`.
85
89
 
@@ -117,9 +121,10 @@ Render mode `auto` picks WebGL when the WebView exposes WebGL2; on `webglcontext
117
121
  ## Limits and edge cases
118
122
 
119
123
  - **Sessions per project** — hard cap of 10.
120
- - **Closing a project** — kills all its sessions immediately.
124
+ - **Closing a project** — kills all its sessions (SIGTERM, then SIGKILL after a short grace).
121
125
  - **Window close / quit** — graceful: SIGTERM, 2 s grace, SIGKILL.
122
126
  - **Cmd+J inside an open Dialog** — ignored. The panel won't toggle on top of a modal.
127
+ - **Failed spawn** — if a new session dies within ~1.5 s of opening (for example the host is out of file descriptors), the panel surfaces a concrete reason (e.g. "out of file descriptors") instead of leaving a blank pane.
123
128
 
124
129
  ## Diagnostics
125
130
 
@@ -136,3 +141,4 @@ For deeper inspection of how the panel resolves PATH at startup (relevant for Vo
136
141
 
137
142
  - [Customising the app](customizing.md) — terminal settings, themes.
138
143
  - [Getting started](getting-started.md) — registering a project.
144
+ - [Codex](codex.md) / [Gemini](gemini.md) — setting up the CLI behind the **Open AI CLI** button on a Codex or Gemini project.
@@ -1,6 +1,6 @@
1
1
  # Tracking cost
2
2
 
3
- specrails-desktop records every AI CLI invocation it spawns — both Claude and Codex — and surfaces the totals on one Analytics page per project. This guide walks through what's tracked, what's not, and how to read the dashboard.
3
+ specrails-desktop records every AI CLI invocation it spawns — Claude, Codex, and Gemini — and surfaces the totals on one Analytics page per project. This guide walks through what's tracked, what's not, and how to read the dashboard.
4
4
 
5
5
  ## What gets tracked
6
6
 
@@ -15,22 +15,27 @@ Six surfaces, all per-project:
15
15
  | **`smash`** | SMASH runs that break an epic spec into sub-specs |
16
16
  | **`file-summary`** | Code-explorer AI summaries of individual files |
17
17
 
18
- Each invocation row carries: provider (Claude or Codex), model, status, started/finished timestamps, duration (wall clock + API-only), tokens (in / out / cache read / cache create), total USD cost, turn count, and — when applicable — the ticket and conversation IDs it touched.
18
+ Each invocation row carries: provider (Claude, Codex, or Gemini), model, status, started/finished timestamps, duration (wall clock + API-only), tokens (in / out / cache read / cache create), total USD cost, turn count, and — when applicable — the ticket and conversation IDs it touched.
19
19
 
20
20
  > Cost averages exclude `failed`/`aborted` rows, but those rows still count toward the total run count and the failure rate.
21
21
 
22
- ## Claude vs Codex cost
22
+ ## Authoritative vs estimated cost
23
23
 
24
- Claude cost is **provider-billed and authoritative** the figure comes straight from the CLI.
24
+ Whether a cost figure is exact depends on the provider's CLI, not on which provider you picked:
25
25
 
26
- Codex has no native cost field, so the app **estimates** its cost from a local rate-card (`server/pricing.ts`). Estimated rows are flagged: they render with a `~` tilde in the raw table and feed an "includes ~$X estimated" footnote in the Hero. On multi-provider projects, a **Provider breakdown** card splits spend by engine so you can see authoritative vs estimated at a glance.
26
+ - **Claude cost is provider-billed and authoritative** the figure comes straight from the CLI's own usage report.
27
+ - **Codex and Gemini do not report cost natively**, so the app **estimates** their cost from a local rate-card (`server/pricing.ts`) using the captured token counts. Estimated rows are flagged: they render with a `~` tilde in the raw table (hover for the tooltip — *"Estimated from local pricing table — this provider does not report cost natively"*) and feed an "includes ~$X estimated" footnote in the Hero.
28
+
29
+ On multi-provider projects, a **Provider breakdown** card splits spend across the project's installed engines so you can see authoritative vs estimated at a glance.
30
+
31
+ > **Fail-soft on unknown models.** The rate card lists specific models (the current Codex and Gemini catalogs). If an invocation uses a model that isn't in the table, the app **does not fabricate a number** — it stores no cost (`total_cost_usd` is left empty), so that row simply shows a blank cost rather than a misleading estimate.
27
32
 
28
33
  ## What's NOT tracked (intentionally)
29
34
 
30
35
  - **Sidebar chat** — the general-purpose chat panel in the right sidebar. It spawns an AI process but isn't pipeline work, so the app excludes it from analytics by design.
31
36
  - **Setup wizard** — the install/enrich flow when you add a project. It *does* spawn an AI CLI (a genuine model invocation), but it's an interactive one-time wizard rather than a repeatable pipeline job, so it's deliberately left uninstrumented.
32
37
 
33
- If you want the absolute total of what an engine has cost you, your provider's own console (e.g. the Anthropic console for Claude) is the source of truth.
38
+ If you want the absolute total of what an engine has cost you, your provider's own console is the source of truth — the Anthropic console for Claude, the OpenAI dashboard for Codex, and Google AI Studio / Cloud billing for Gemini.
34
39
 
35
40
  ## The Analytics page
36
41
 
@@ -40,7 +45,7 @@ Open **Analytics** from the project right sidebar.
40
45
 
41
46
  - **Period** — `7d`, `30d`, `90d`, or `All`. (There's no 24-hour or custom-range option here — the custom calendar range lives on Desktop Analytics, below.)
42
47
  - **Surface** — chips for `All` plus each of the six surfaces (Jobs, Explore, Quick, Refine, SMASH, File summaries). All are included by default; toggle chips to narrow the view.
43
- - **Engine** — provider chips (Claude / Codex) that appear **only on multi-provider projects**, letting you filter by engine.
48
+ - **Engine** — one chip per installed provider (Claude, Codex, Gemini) plus `All`. These appear **only on multi-provider projects** (more than one engine installed) and let you filter spend by engine.
44
49
 
45
50
  The period and surface filters are URL-synced, so you can share or bookmark a view.
46
51
 
@@ -57,13 +62,13 @@ When the project has zero invocations in the period (e.g. you just started), the
57
62
 
58
63
  ### Provider breakdown
59
64
 
60
- On multi-provider projects, a dedicated card splits total spend between Claude and Codex. It's hidden on single-provider projects.
65
+ On multi-provider projects, a dedicated card splits total spend across the project's installed engines (Claude, Codex, Gemini) — it's data-driven, so it renders for any combination of more than one provider. Each engine's row marks an all-estimated total with a `~` tilde. It's hidden on single-provider projects.
61
66
 
62
67
  ### Daily stacked timeline
63
68
 
64
- A daily bar chart for the period, stacked by surface. Days with zero activity are zero-filled so the x-axis stays regular.
69
+ A daily bar chart for the period, stacked by surface. It plots five series — **Jobs, Explore, Quick, Refine, and File summaries**. SMASH spend is still tracked and shows up elsewhere (the Hero per-surface bar, Top models, and the raw table), but it is not currently a separate bar in this chart. Days with zero activity are zero-filled so the x-axis stays regular.
65
70
 
66
- Surface colours are consistent across the whole page:
71
+ Surface colours are consistent wherever a surface appears across the page:
67
72
 
68
73
  - `job` → blue (`accent-info`)
69
74
  - `quick-spec` → purple (`accent-secondary`)
@@ -152,4 +157,5 @@ For the cross-project view, open **Analytics** from the Arc sidebar on the left.
152
157
 
153
158
  - [Customising the app](customizing.md) — set the budget, configure notifications.
154
159
  - [Creating specs](creating-specs.md) — every spec you create adds rows to your analytics.
155
- - [Using Codex](codex.md) — how cost works when you run a project on Codex.
160
+ - [Using Codex](codex.md) — how cost works when you run a project on Codex (estimated, ~ tilde).
161
+ - [Using Gemini](gemini.md) — how cost works when you run a project on Gemini (also estimated, ~ tilde).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specrails-desktop",
3
- "version": "2.7.0",
3
+ "version": "2.9.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,6 +15,7 @@ const agent_generator_1 = require("./agent-generator");
15
15
  const ai_invocations_1 = require("./ai-invocations");
16
16
  const result_event_1 = require("./result-event");
17
17
  const spawn_lifecycle_1 = require("./spawn-lifecycle");
18
+ const workspace_resolution_1 = require("./workspace-resolution");
18
19
  const providers_1 = require("./providers");
19
20
  const agent_refine_db_1 = require("./agent-refine-db");
20
21
  const CUSTOM_PREFIX = /^custom-[a-z0-9][a-z0-9-]*$/;
@@ -174,14 +175,23 @@ class AgentRefineManager {
174
175
  // ─── Private ──────────────────────────────────────────────────────────────
175
176
  _agentFile(agentId) {
176
177
  // Per-provider on-disk layout:
177
- // claude → <project>/.claude/agents/<agentId>.md
178
- // codex → <project>/.codex/skills/<agentId>/SKILL.md
178
+ // claude → <root>/.claude/agents/<agentId>.md
179
+ // codex → <root>/.codex/skills/<agentId>/SKILL.md
179
180
  // Future providers add their own branch via the adapter; the projectDir
180
181
  // is already provider-aware.
182
+ //
183
+ // Relocate-artifacts: custom-* agents are materialized by core into the
184
+ // WORKSPACE when the project is relocated (same place the rails load them
185
+ // from). Reading/writing `<project.path>/<providerDir>/agents` would touch a
186
+ // stale repo copy the rails never see — and this path WRITES the refined
187
+ // agent. Resolve through the gate so reads + writes hit the same tree the
188
+ // rails consume. Legacy projects are byte-identical (root === project.path).
189
+ const exec = (0, workspace_resolution_1.resolveProjectExecution)({ path: this._projectPath });
190
+ const root = exec.relocated && exec.workspaceDir ? exec.workspaceDir : this._projectPath;
181
191
  if (this._adapter.id === 'codex') {
182
- return path_1.default.join(this._projectPath, this._adapter.projectDirName, 'skills', agentId, 'SKILL.md');
192
+ return path_1.default.join(root, this._adapter.projectDirName, 'skills', agentId, 'SKILL.md');
183
193
  }
184
- return path_1.default.join(this._projectPath, this._adapter.projectDirName, 'agents', `${agentId}.md`);
194
+ return path_1.default.join(root, this._adapter.projectDirName, 'agents', `${agentId}.md`);
185
195
  }
186
196
  _currentVersion(agentId) {
187
197
  const row = this._db
@@ -224,11 +234,16 @@ class AgentRefineManager {
224
234
  // Spawn / stream / settlement is owned by the shared spawn-lifecycle; the
225
235
  // refine-specific draft buffering, accounting, validation and history all
226
236
  // stay here unchanged.
237
+ // Relocate-artifacts gate: spawn from the workspace (with SPECRAILS_REPO_DIR)
238
+ // when relocated, else cwd = project.path + empty env (byte-identical legacy).
239
+ const refineExec = (0, workspace_resolution_1.resolveProjectExecution)({ path: this._projectPath });
240
+ const refineEnv = refineExec.relocated ? { ...process.env, ...refineExec.env } : undefined;
227
241
  const run = await (0, spawn_lifecycle_1.runAiCliInvocation)({
228
242
  adapter: this._adapter,
229
243
  action,
230
244
  buildOpts: { prompt, model: refineModel, sessionId: session.session_id ?? undefined },
231
- cwd: this._projectPath,
245
+ cwd: refineExec.cwd,
246
+ env: refineEnv,
232
247
  onSpawn: (child) => this._activeProcesses.set(refineId, child),
233
248
  onSpawnError: (err) => { spawnState.err = err; },
234
249
  onEvent: (ev) => {