specrails-desktop 2.8.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 (326) 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 +24 -1
  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/queue-manager.js +149 -18
  310. package/server/dist/setup-manager.js +131 -29
  311. package/server/dist/smash-runner.js +21 -6
  312. package/server/dist/ticket-store.js +6 -2
  313. package/server/dist/ticket-watcher.js +5 -1
  314. package/server/dist/vitest-setup.js +25 -0
  315. package/server/dist/workspace-manager.js +199 -0
  316. package/server/dist/workspace-resolution.js +147 -0
  317. package/client/dist/assets/index-DgKfQFcf.css +0 -2
  318. package/client/dist/assets/setup-BIIkb-_K.js +0 -1
  319. package/client/dist/assets/setup-BeQxu9kD.js +0 -1
  320. package/client/dist/assets/setup-CPa6GnlI.js +0 -1
  321. package/client/dist/assets/setup-CZl4OEJx.js +0 -1
  322. package/client/dist/assets/setup-ChpodNfn.js +0 -1
  323. package/client/dist/assets/setup-D_fjJH6u.js +0 -1
  324. package/client/dist/assets/setup-YzD8DX4O.js +0 -1
  325. package/client/dist/assets/setup-fRpDozmq.js +0 -1
  326. package/docs/adding-a-provider.md +0 -107
@@ -0,0 +1,264 @@
1
+ I have enough confirmation of the reusable mechanics. Here is the build plan.
2
+
3
+ ---
4
+
5
+ # BUILD PLAN — Framework specrails-core empaquetado en la app de escritorio
6
+
7
+ > **Objetivo de una frase**: instalar el *framework* de specrails-core **una sola vez** desde dentro del `.dmg`/`.exe`, materializarlo en `~/.specrails/framework/<version>/`, y que cada workspace lo **enlace por symlink** (con fallback a copia donde el symlink falle). Las actualizaciones de core viajan con la actualización de la app: un único swap atómico de `~/.specrails/framework/current` actualiza **todos** los workspaces a la vez. Se elimina el `npx specrails-core init` por proyecto en escritorio.
8
+
9
+ **Audiencia**: owner + maintainers. Esto dirige la implementación.
10
+
11
+ ---
12
+
13
+ ## 1. Modelo de destino
14
+
15
+ El framework deja de copiarse por proyecto. Pasa a ser un único árbol versionado, compartido por todos los workspaces vía un symlink indireccional (`current`):
16
+
17
+ ```
18
+ ~/.specrails/
19
+ ├── framework/
20
+ │ ├── 4.9.0/ ← materializado UNA vez desde el bundle de la app
21
+ │ │ ├── claude/ ← providerDir framework (estático, read-only)
22
+ │ │ │ ├── agents/sr-*.md
23
+ │ │ │ ├── commands/specrails/*.md
24
+ │ │ │ ├── skills/<sr-*>/SKILL.md
25
+ │ │ │ └── rules/layer.md
26
+ │ │ ├── codex/ ← .codex/skills/**, settings
27
+ │ │ ├── gemini/ ← .gemini/{agents,commands,settings}
28
+ │ │ └── setup-templates/ ← caché enrich (INPUT de /specrails:enrich), provider-invariante
29
+ │ ├── 4.10.0/ ← tras un app-update: nueva versión materializada al lado
30
+ │ └── current ──────────────► 4.10.0/ (symlink; swap atómico = una operación)
31
+
32
+ ├── registry.json ← (YA EXISTE) allocation por repo
33
+ ├── manager.pid
34
+ └── projects/<slug>/
35
+ ├── workspace/ ← (YA EXISTE) cwd de spawns; SPECRAILS_REPO_DIR apunta al repo
36
+ │ ├── project ───────────► <repo real> (symlink/junction; YA EXISTE)
37
+ │ └── .claude/ ← providerDir DEL WORKSPACE
38
+ │ ├── agents ─────► ~/.specrails/framework/current/claude/agents (LINK)
39
+ │ ├── commands ─────► ~/.specrails/framework/current/claude/commands (LINK)
40
+ │ ├── skills ─────► ~/.specrails/framework/current/claude/skills (LINK)
41
+ │ ├── rules ─────► ~/.specrails/framework/current/claude/rules (LINK)
42
+ │ └── agent-memory/ ← DIR REAL, escribible, per-workspace (NO se enlaza)
43
+ └── .specrails/
44
+ ├── specrails-version ← marcador per-install (gate de "relocated")
45
+ ├── specrails-manifest.json ← registra qué versión de framework consume
46
+ └── install-config.yaml ← (vive IN-REPO en codeRoot, no aquí)
47
+ ```
48
+
49
+ **Invariante de enlace**: se enlazan **solo los subárboles estáticos** del providerDir (`agents/`, `commands/`, `skills/`, `rules/`, `settings`). `agent-memory/` queda como directorio real y escribible en el workspace — nunca apunta al framework read-only. `openspec/**` sigue residiendo **en el repo** (codeRoot), no en el workspace.
50
+
51
+ **Por qué `current` y no enlazar a `4.10.0/` directo**: el indireccional permite que un app-update materialice `4.10.0/` al lado de `4.9.0/`, verifique, y luego haga **un solo `renameSync` atómico** de `current`. Todos los workspaces que enlazan a `current/...` quedan actualizados sin tocar ningún workspace. En POSIX esto es O(1); en Windows ver §7.
52
+
53
+ ---
54
+
55
+ ## 2. Split framework vs proyecto
56
+
57
+ Tabla definitiva. **framework-once** = se materializa una vez en `~/.specrails/framework/<version>/<provider>/`. **project-seed** = se crea por workspace en `assembleProjectWorkspace` (sin red, instantáneo).
58
+
59
+ | Artifact | framework-once | project-seed | Provider |
60
+ |---|:---:|:---:|---|
61
+ | `templates/agents/sr-*.md` (14 personas) | ✅ (enlazado) | | per-provider (rewrite ruta / frontmatter gemini) |
62
+ | `templates/commands/specrails/*.md` (24) | ✅ (enlazado) | | claude; portado a codex skills / gemini toml |
63
+ | `templates/codex-skills/**` | ✅ (copia verbatim) | | codex |
64
+ | `templates/gemini-commands/{implement,batch-implement}.toml` | ✅ | | gemini |
65
+ | `templates/rules/layer.md` | ✅ (enlazado) | | per-provider |
66
+ | `commands/{enrich,doctor}.md` (raíz) | ✅ | | invariante |
67
+ | `templates/settings/{codex-config.toml, gemini-settings.json}` | ✅ | | per-provider |
68
+ | `setup-templates/**` (caché enrich: settings.json, confidence-config, perf-thresholds, security-exemptions, personas, claude-md, profiles/default.json) | ✅ (en `<version>/setup-templates/`) | | invariante |
69
+ | **registry.json entry** | | ✅ | — |
70
+ | `<workspace>/project` symlink (junction/text fallback) | | ✅ | — |
71
+ | `.specrails/specrails-version` + `specrails-manifest.json` | | ✅ | — |
72
+ | `.specrails/install-config.yaml` (in-repo, codeRoot) | | ✅ (autor=user) | — |
73
+ | `<providerDir>/agent-memory/<id>/` dirs (+ `explanations/`) | | ✅ (DIR real escribible) | per-provider |
74
+ | `openspec/**` (in-repo, codeRoot) | | ✅ (vía `openspec init`, requiere red) | per-provider |
75
+ | `~/.gemini/acknowledgments/agents.json` entry | | ✅ (re-hash de los ficheros ENLAZADOS, keyed por repoRoot) | gemini |
76
+ | `local-tickets.json`, `profiles/.user-preferred.json`, `plugins/state.json`, `file-summaries/**` | | ✅ (lazy en runtime, no en install) | — |
77
+
78
+ ### Manejo de placeholders al compartir
79
+
80
+ - **`{{PROJECT_NAME}}`**: solo aparece en *product agents*, comandos VPC, y `claude-md/root.md` — **ninguno se coloca en el tier quick/default**. Es enrich-only. El tier quick es **project-genérico**.
81
+ - **`{{LAYER_*}}`, `{{ARCHITECTURE_DIAGRAM}}`, `{{CI_*}}`, `{{BACKLOG_*}}`, campos de persona**: `renderPlaceholders` (scaffold.ts:1261-1267) **strippea todo `{{...}}` no sustituido a string vacío** en el tier quick. Por eso un fichero compartido por symlink es seguro sin reescritura per-project.
82
+ - **`MEMORY_PATH`, `PERSONA_DIR`, `SECURITY_EXEMPTIONS_PATH`**: son constantes **por provider** (no por proyecto). Pre-renderizan bien en la copia compartida del framework.
83
+ - **`codex-config.toml MODEL_NAME`**: hardcodeado a `gpt-5.5-mini` en install → constante per-provider, compartible.
84
+
85
+ **Conclusión**: el symlink puro del subárbol estático del providerDir es viable **sin reescritura per-project**. Esto se protege con un test de invariante (ver §9): "ningún token per-project debe rellenarse en tier quick".
86
+
87
+ ---
88
+
89
+ ## 3. Cambios en specrails-core
90
+
91
+ Se refactoriza el monolito `scaffoldInstallation` (scaffold.ts:252) en dos funciones puras y composables. Su cuerpo ya separa concerns en helpers que mapean 1:1.
92
+
93
+ ### 3.1 `installFramework(globalDir, provider, version)` — idempotente, versionado
94
+
95
+ Materializa el framework UNA vez en `globalDir/<version>/<providerDir>/`. Cuerpo = los helpers existentes pero escribiendo al dir global en lugar de per-workspace:
96
+
97
+ - `templatesSrc → setup-templates` copyDir (scaffold.ts:299-314) → `<version>/setup-templates/`
98
+ - `copyBundledCommands` (:386) → coloca `commands/specrails/*`, `codex-skills/**`, gemini overrides
99
+ - `placeSkills` (:1177) → genera skills claude desde commands
100
+ - `applyCodexSettings` (:1081) / `applyGeminiSettings` (:751) → settings por provider
101
+ - `writeGeminiAgentFromTemplate` (:609) → re-emite frontmatter gemini
102
+
103
+ **Idempotencia**: si `<version>/<provider>/` ya existe y su manifest hash coincide, no-op. `buildManifest` (manifest.ts:47) corre **una vez** sobre `frameworkDir`. **Multi-provider**: `<version>/` se sub-keyea por provider; se materializa una vez **por provider** que el proyecto instale.
104
+
105
+ ### 3.2 `assembleProjectWorkspace(workspace, frameworkDir, project)` — sin red
106
+
107
+ Reemplaza `placeQuickTierArtefacts` (scaffold.ts:878). En lugar de escribir ficheros per-project:
108
+
109
+ 1. **Enlaza** los subárboles estáticos del `<frameworkDir>/<providerDir>/` dentro del workspace (`agents/`, `commands/`, `skills/`, `rules/`, settings). Copy fallback en Windows (misma lógica que `ensureProjectLink`).
110
+ 2. **Seeds del proyecto** (conserva de `placeQuickTierArtefacts`):
111
+ - mkdir loop de `agent-memory/<id>/` (:1005) + `explanations/` (:179) — **dirs reales escribibles, NUNCA enlazados**.
112
+ - exclusión VPC (:989).
113
+ - `writeManifestFiles` (manifest.ts:74) → `.specrails/{specrails-version, specrails-manifest.json}` apuntando a la versión del framework.
114
+ - `writeGeminiAgentAcknowledgments` (scaffold.ts:696) **per-project** — re-hashea los ficheros **enlazados**, keyed por repoRoot (gemini-only; fácil de olvidar).
115
+ 3. **No** corre `openspec init` aquí — se separa (ver 3.4).
116
+
117
+ `renderPlaceholders` ya no se invoca en el camino quick (los tokens son provider-constantes).
118
+
119
+ ### 3.3 Descomposición de init/update
120
+
121
+ - **`init.ts:124`** se descompone en:
122
+ `ensureFramework(version, provider)` *(skip si la app ya lo materializó)* → `assembleProjectWorkspace(resolveArtifacts(allocate:true))` → `installOpenSpecProject(codeRoot)`.
123
+ - **`update.ts:138`** (re-scaffold) se convierte en:
124
+ re-materializar framework a `<nueva-version>/` → **swap atómico** de `~/.specrails/framework/current` → re-link workspaces. **Un swap actualiza todos.**
125
+
126
+ ### 3.4 Modo framework-global standalone (`npx specrails-core init` sin escritorio)
127
+
128
+ Nueva variante que también instala el framework una vez:
129
+ - `installFramework(~/.specrails/framework, provider, CORE_VERSION)` si no existe esa versión.
130
+ - `assembleProjectWorkspace(...)` con symlink al framework global.
131
+ - `installOpenSpecProject(codeRoot)` in-repo.
132
+
133
+ Para el caso standalone, el framework viene del propio paquete npm de core (no del bundle de la app). La diferencia escritorio vs standalone es **solo el origen** del árbol a materializar (bundle de la app vs `node_modules/specrails-core/templates`). El resto es idéntico.
134
+
135
+ ### 3.5 Composición con el split codeRoot/artifactRoot (ya construido)
136
+
137
+ - `resolveArtifacts(allocate:true)` (registry.ts:395) sigue siendo el allocator per-project; `assembleProjectWorkspace` consume su `Resolution` (workspaceDir/artifactRoot/codeRoot/stateDir) sin cambios.
138
+ - Los `${SPECRAILS_REPO_DIR:-.}` en los cuerpos de agent/command son expansiones de env **en runtime** (stage-3), no sustituciones en install — son exactamente lo que hace que un fichero compartido re-apunte la I/O al repo en ejecución. **Esto es lo que hace viable la copia única compartida.**
139
+ - **openspec carve-out**: `openspec/**` se queda residente en el repo (codeRoot) vía la red `npx @fission-ai/openspec init`. **No es framework, no es instantáneo, no es offline, no es relocalizable.** El objetivo "eliminar npx per-project" **no cubre openspec** (ver §9).
140
+
141
+ ---
142
+
143
+ ## 4. Cambios en specrails-desktop
144
+
145
+ ### 4.1 Bundle de templates en la app (espeja el patrón runtimes **verbatim**)
146
+
147
+ - **`tauri.conf.json`**: añadir `"framework/**/*"` a `bundle.resources` (junto a `"runtimes/**/*"`, hoy en línea 46). Forma glob para preservar la estructura anidada.
148
+ - **CI (`desktop-release.yml`)**: paso que ensambla `src-tauri/framework/` antes de `tauri build` — copia `templates/**`, `commands/{enrich,doctor}.md`, y genera los providerDir materializados (claude/codex/gemini) + `setup-templates/`. Es el mismo patrón que ensambla `runtimes/`. `src-tauri/framework/` gitignored con `.gitkeep`.
149
+ - **`scripts/build-sidecar.mjs`**: si algún asset del framework debe resolverse en filesystem real (no dentro del snapshot pkg), copiarlo igual que `node-pty`. La mayoría son ficheros de texto estáticos → bajo riesgo (ver §9).
150
+ - **`lib.rs`** (espejo de líneas 181-215): resolver `<resource_dir>/framework`, gate por existencia (`framework/.../claude/agents` existe y no vacío), y exportar `SPECRAILS_BUNDLED_FRAMEWORK_PATH` al sidecar. **Existence-gated** como los runtimes: si no hay framework empaquetado → fallback al `npx` legacy (no dead-end).
151
+
152
+ ### 4.2 `FrameworkManager` (nuevo módulo server)
153
+
154
+ - `materialize()`: copia `SPECRAILS_BUNDLED_FRAMEWORK_PATH` → `~/.specrails/framework/<version>/` si esa versión no existe. Idempotente (skip si manifest hash coincide).
155
+ - `swapCurrent(version)`: `renameSync` atómico de `~/.specrails/framework/current` (reusa `atomicWrite`/rename de artifact-registry.ts:213-227). Crea `current.tmp` → rename.
156
+ - `versionCheck()`: en **first-run** y **post-update**, compara la versión bundleada con `current` → materializa + swap si difiere.
157
+ - Multi-provider: materializa por provider; el swap de `current` cambia **todos los providers a la vez** (un solo `current` por versión que contiene los 3 providerDirs).
158
+
159
+ ### 4.3 Extender `ensureWorkspace` para enlazar el framework
160
+
161
+ `server/workspace-manager.ts` ya tiene el baile symlink/junction/text-fallback (`ensureProjectLink`, :81-131). Se añade un paso paralelo que enlaza los subárboles estáticos del providerDir desde `~/.specrails/framework/current/<provider>/` al `<workspace>/<providerDir>/`:
162
+ - POSIX: `symlinkSync`.
163
+ - Windows: intenta junction → symlink → **copy fallback** (la "one current-swap updates all" no aplica en copy; ver §7).
164
+ - `agent-memory/` se crea como dir real (nunca enlazado).
165
+
166
+ ### 4.4 `setup-manager` ya no corre `npx … init`
167
+
168
+ `server/setup-manager.ts:685-858` deja de spawnear `npx specrails-core init`. En su lugar:
169
+ - `FrameworkManager.materialize()` (instantáneo/offline — ya está en disco desde el bundle).
170
+ - `assembleProjectWorkspace` server-side (port del de core, o invocar core en modo "assemble-only" sin red): enlazar + seeds.
171
+ - **openspec init** sigue necesitando red en el primer assemble (paso separado, con su propio progreso de streaming; ver §9 para bundlear openspec offline como follow-up).
172
+ - El árbol per-provider (setup-manager.ts:504-558) se materializa por provider seleccionado.
173
+
174
+ ### 4.5 El gate adapta `isWorkspacePopulated` al layout enlazado
175
+
176
+ `workspace-resolution.ts` (`resolveProjectExecution`, gate de stage 2) detecta "relocated" vía `<workspace>/.specrails/specrails-version`. El check de "populated" debe aceptar **symlinks** como providerDir válido (hoy puede asumir dirs reales). `projectSupportsProfiles` (queue-manager.ts:67-84) sigue gateando por `>= 4.1.0`. El gate dispara **después** de que el framework symlink esté presente en el workspace.
177
+
178
+ ---
179
+
180
+ ## 5. Canal de actualización
181
+
182
+ ```
183
+ core bump (4.9.0 → 4.10.0)
184
+ → la app empaqueta el nuevo core en el bundle (CI ensambla framework/4.10.0)
185
+ → el updater de Tauri instala la nueva app (SIN CAMBIOS en el updater)
186
+ → al arrancar la app nueva: FrameworkManager.versionCheck()
187
+ → materialize 4.10.0/ AL LADO de 4.9.0/ (no destructivo)
188
+ → verifica (manifest hash, smoke de un comando)
189
+ → swapCurrent('4.10.0') ← UN renameSync atómico
190
+ → TODOS los workspaces que enlazan a current/... quedan en 4.10.0 sin tocarlos
191
+ ```
192
+
193
+ - **Desacople total del npx per-project**: ningún proyecto vuelve a ejecutar `npx specrails-core` para actualizar el framework. La actualización es O(1) en POSIX (un swap), O(proyectos) solo en Windows-copy-fallback (§7).
194
+ - **Versiones antiguas**: `4.9.0/` se conserva hasta que ningún workspace la referencie; GC opcional (borrar dirs de versión != `current` sin referencias) tras N días.
195
+ - **Aviso in-app "framework actualizado"**: **SÍ, recomendado** — un toast no intrusivo "specrails-core actualizado a 4.10.0" tras el swap, broadcast por WS (`framework.updated`, app-level sin projectId). Justificación: el usuario debe saber que sus agents/commands cambiaron. No bloquea nada.
196
+
197
+ ---
198
+
199
+ ## 6. Migración desde el modelo recién construido
200
+
201
+ Hoy los workspaces existentes contienen una **copia completa** del framework (de core stages 1-3 + desktop stage 2). Plan de switch a symlink-to-global, **no destructivo**, en el siguiente arranque:
202
+
203
+ 1. **Detectar copia**: en `ensureWorkspace`, si `<workspace>/<providerDir>/agents/` es un **dir real** (no symlink) y su contenido coincide (hash) con `framework/current/<provider>/agents/`, marcarlo como "copia migrable".
204
+ 2. **Backup**: renombrar el providerDir copiado a `<providerDir>.pre-symlink.bak` (no borrar).
205
+ 3. **Re-enlazar**: crear los symlinks estáticos a `framework/current/...`.
206
+ 4. **Preservar mutable**: mover `agent-memory/` de la copia al nuevo layout como dir real (NO se enlaza — es estado del proyecto).
207
+ 5. **Verificar**: si un comando/skill resuelve OK vía el symlink, borrar el `.bak`; si no, revertir (restaurar `.bak`).
208
+ 6. **Idempotente**: una vez migrado (providerDir ya es symlink), no-op en arranques siguientes.
209
+
210
+ Workspaces con **divergencia local** (el usuario editó un agent en su copia) → **no migrar automáticamente**: dejar la copia, loggear `framework.migration_skipped` con el path, y surfacing opcional en Settings ("este proyecto usa una copia local del framework").
211
+
212
+ ---
213
+
214
+ ## 7. Versionado y concurrencia
215
+
216
+ - **Dirs versionados**: `framework/<version>/` inmutables tras materializar. Nunca se mutan in-place.
217
+ - **Swap atómico de `current`**: `renameSync` de un symlink es atómico en POSIX. En Windows se usa el patrón temp+rename de `atomicWrite` (artifact-registry.ts:213-227).
218
+ - **Rail en vuelo durante un update**:
219
+ - Los rails ya capturan un **snapshot per-job** (profile.json chmod 400, plugins.json). El framework consumido se resuelve al **spawn**, no continuamente.
220
+ - **Serializar el swap**: `FrameworkManager.swapCurrent` corre bajo el file-lock del registry (mismo lock que `resolveArtifacts`). Si hay un job spawneando, el swap espera a que termine la resolución de ese job.
221
+ - Un job que ya spawneó con `4.9.0` resuelto en su cwd sigue con `4.9.0` (el symlink `current` cambió, pero el proceso ya tiene los handles abiertos o resolvió rutas absolutas en el snapshot). **No se interrumpe un rail mid-flight.**
222
+ - Recomendación: el swap captura en el snapshot del job la versión de framework resuelta (`specrails.framework_version` en OTEL resource attrs) para trazabilidad.
223
+ - **Windows symlink/junction fallback** (workspace-manager.ts:106-124):
224
+ - Junction para `project →` repo funciona.
225
+ - Para los subárboles del framework: junction (apunta a dir) → symlink → **copy**. En modo copy, un app-update **debe re-copiar por workspace** (`update` se vuelve O(proyectos) en Windows). Aceptable v1; el swap O(1) es una optimización solo-POSIX.
226
+ - El marcador necesita `specrails-version >= 4.1.0` o cae a legacy.
227
+
228
+ ---
229
+
230
+ ## 8. Plan de implementación por fases
231
+
232
+ Cada fase independientemente testeable + verde, con gates de cobertura (**80% server** lines/functions/statements, 70% branches; **80% client** lines/statements; **70% global**).
233
+
234
+ | Fase | Repo | Contenido | Reusa runtimes-pattern | Test verde |
235
+ |---|---|---|---|---|
236
+ | **0. PoC** | desktop | PoC: ¿claude/codex/gemini descubren **commands** y **skills** vía symlink? (agents ya PROBADO esta sesión). Bundle de templates sobrevive el resource-copy de Tauri (¿exec bits / symlinks en templates?). | — | PoC documentado, go/no-go |
237
+ | **1. Refactor core puro** | core | Partir `scaffoldInstallation` en `installFramework` + `assembleProjectWorkspace`. **Sin cambiar el comportamiento** (siguen escribiendo per-project). Tests de paridad byte. | — | Tests core actuales + nuevos unit |
238
+ | **2. Framework global en core** | core | `installFramework(globalDir, provider, version)` escribe a `~/.specrails/framework/<version>/`; `assembleProjectWorkspace` enlaza. Modo standalone `npx init` framework-global. Guard de invariante PROJECT_NAME. | — | Unit + integración (link + seeds + ack gemini) |
239
+ | **3. Bundle desktop** | desktop | `tauri.conf` glob + CI ensambla `framework/` + `lib.rs` env `SPECRAILS_BUNDLED_FRAMEWORK_PATH` (existence-gated). | **VERBATIM** (espeja `runtimes/`) | Smoke: framework presente en `.app` / `.exe` |
240
+ | **4. FrameworkManager** | desktop | `materialize` + `swapCurrent` (atomic) + `versionCheck`. WS `framework.updated`. | renameSync reusa artifact-registry | Unit server (cobertura 80%) |
241
+ | **5. ensureWorkspace + setup-manager** | desktop | Enlazar framework en workspace (copy fallback Win); `setup-manager` deja de spawnear `npx init` (assemble offline). Gate `isWorkspacePopulated` acepta symlinks. | ensureProjectLink reusa | Server cobertura; e2e add-project offline |
242
+ | **6. Canal de update** | desktop | Post-update versionCheck → materialize + swap. Aviso in-app. Rail-mid-flight serializado + snapshot framework_version. | updater unchanged | Test swap concurrente + job snapshot |
243
+ | **7. Migración** | desktop | Detectar copia → backup → re-enlazar → verificar → GC. Skip en divergencia local. | — | Test migración no-destructiva + revert |
244
+ | **8. openspec offline (follow-up)** | core | Bundlear openspec + `init` offline (eliminar la última red). | — | e2e add-project sin red total |
245
+
246
+ **Orden estricto**: 0 → 1 → 2 (core verde standalone) → 3 → 4 → 5 → 6 → 7. La 8 es independiente y diferible.
247
+
248
+ ---
249
+
250
+ ## 9. Riesgos y validaciones
251
+
252
+ **Necesitan PoC (Fase 0):**
253
+ - **Discovery de commands/skills por symlink**: AGENTS por symlink está **PROBADO esta sesión**. Falta verificar que claude descubre `commands/specrails/*.md` y `skills/<sr-*>/SKILL.md` cuando el dir es un symlink, y que codex resuelve `.codex/skills/**` y gemini sus `.toml` enlazados. **Bloqueante**: si un provider no sigue symlinks de commands/skills, ese subárbol cae a copy fallback (no se rompe, pero pierde el O(1) update).
254
+ - **Templates sobreviven el resource-copy de Tauri**: los runtimes tuvieron caveats (Tauri dereferencia symlinks #13219, no preserva exec bits, no codesigna resources). **Validar**: ¿algún fichero de `templates/**` es un symlink o necesita exec bit? Casi todos son texto (`.md`/`.toml`/`.json`/`.yaml`) → bajo riesgo, **pero confirmar** que no hay symlinks internos y que el árbol anidado se preserva con la forma glob. No requieren codesign (no son Mach-O).
255
+
256
+ **Riesgos de diseño (mitigaciones ya en el plan):**
257
+ - **`agent-memory/` dentro del providerDir** (scaffold.ts:1005): si se enlaza el providerDir entero a un framework read-only, los agents no pueden escribir memoria. **Mitigación**: enlazar solo subárboles estáticos; `agent-memory/` real y escribible.
258
+ - **Gemini acknowledgments** (scaffold.ts:696): hashean los bytes exactos de los ficheros, keyed por repoRoot. Cada workspace debe re-escribir su entrada hasheando los ficheros **enlazados**, o gemini headless cae a agents genéricos. **Mitigación**: `writeGeminiAgentAcknowledgments` per-project en `assembleProjectWorkspace`; test que verifica el hash post-link.
259
+ - **openspec NO cubierto** por "eliminar npx": sigue requiriendo red en el primer assemble (init.ts:208-248). **Mitigación**: paso separado con streaming; Fase 8 bundlea openspec offline.
260
+ - **Invariante quick-tier** depende de que `renderPlaceholders` strippee `{{...}}` a vacío (scaffold.ts:1266). Si un template futuro añade un token per-project a rellenar en quick, el symlink puro se rompe. **Mitigación**: test de guard — "ningún `{{...}}` per-project sobrevive en tier quick; solo PROJECT_NAME existe y es enrich-only".
261
+ - **Framework PER PROVIDER**: `.claude/.codex/.gemini` difieren (path rewrites, frontmatter, ports de codex skills). `<version>/` sub-keyeado por provider; el swap de `current` cambia todos los providers juntos.
262
+ - **`codex-config.toml MODEL_NAME`** hardcodeado (scaffold.ts:1091): si la selección de modelo se vuelve per-project, la copia compartida de codex necesitaría un overlay, no un link raw. **Hoy**: constante, compartible.
263
+ - **Windows copy fallback**: la optimización "un swap actualiza todos" no aplica en copy → update O(proyectos). Aceptable v1.
264
+ - **`setup-templates/` (input de enrich)** hoy se copia per-project (scaffold.ts:299). Al compartirse, `/specrails:enrich` debe leerlo del framework dir, no del workspace. **Validar la resolución de rutas de enrich antes de reubicarlo** (Fase 2).
@@ -2,7 +2,17 @@
2
2
 
3
3
  Reference for configuring specrails-desktop: app-wide settings, per-project settings, the authentication token, environment variables, CLI flags, and the `~/.specrails/` data directory.
4
4
 
5
- Everything here is verified against the shipped code (v1.63.1). The app server binds to `127.0.0.1` only and rejects any non-localhost origin, so all of this is local-first by design.
5
+ Everything here is verified against `main`. The app server binds to `127.0.0.1` only and rejects any non-localhost origin, so all of this is local-first by design.
6
+
7
+ > **Providers at a glance.** A project can run **Claude, Codex, Gemini, or any combination** of them. All three are enabled by default and are chosen when you add the project (see [Project settings](#project-settings)). Each has its own default model, resolved at spawn time:
8
+ >
9
+ > | Provider | CLI binary | Default model | Emergency rollback |
10
+ > |----------|-----------|---------------|--------------------|
11
+ > | Claude Code | `claude` | `sonnet` | — |
12
+ > | Codex CLI | `codex` | `gpt-5.5` | `SPECRAILS_CODEX_BETA=0` |
13
+ > | Gemini CLI | `gemini` | `gemini-3.5-flash` | `SPECRAILS_GEMINI_BETA=0` |
14
+ >
15
+ > The provider set is **immutable after the project is created**.
6
16
 
7
17
  ---
8
18
 
@@ -28,19 +38,21 @@ To rotate the token, stop the app, delete `~/.specrails/desktop.token`, and star
28
38
 
29
39
  App settings apply across all projects. Open them from the **left sidebar → Settings**, or via the Command Palette (`Cmd/Ctrl+K`) → **Desktop Settings**. They are persisted in `~/.specrails/desktop.sqlite` under the `desktop_settings` key/value table.
30
40
 
31
- The Global Settings page is organised into these sections:
41
+ The Global Settings page is organised into the sections below (it also surfaces a read-only **Registered Projects** list, an **Onboarding** replay button, and a **Desktop Information** diagnostics block, which carry no stored settings):
32
42
 
33
43
  | Section | What it controls | Stored key / default |
34
44
  |---------|------------------|----------------------|
35
45
  | **Appearance** | App-wide UI theme. Five built-ins: `specrails` (default), `dracula`, `aurora-light`, `obsidian-dark`, `matrix`. | `ui_theme` = `specrails` |
46
+ | **Language** | App-wide UI language (hot-switch, no restart). Eight built-ins: `en`, `es`, `fr`, `de`, `pt`, `it`, `zh`, `ja`. | `ui_language` (unset = follow the OS language; only an explicit pick is persisted) |
47
+ | **Mobile Access** | Enable the mobile-companion gateway, pair/revoke devices, and rotate the device cert identity. | — (loopback + token still enforced server-side) |
36
48
  | **specrails-tech** | Base URL for the external specrails-tech agents service. | `specrails_tech_url` = `http://localhost:3000` (the `SPECRAILS_TECH_URL` env var is only a fallback when this setting is unset — the stored setting wins) |
37
49
  | **Budget & Alerts** | App-wide daily spend cap (queues auto-pause when exceeded) and a per-job cost alert threshold. | `desktop_daily_budget_usd`, `cost_alert_threshold_usd` (both unset by default = no cap / no alert) |
38
50
  | **OS Notifications** | Desktop notification preferences for long-running jobs and budget events. | — |
39
- | **Outbound Webhooks** | HTTP webhooks fired on `job.completed`, `job.failed`, `job.canceled`, `daily_budget_exceeded`, and `desktop_daily_budget_exceeded`. | webhooks table (defaults to `["job.completed","job.failed"]` per hook) |
51
+ | **Outbound Webhooks** | HTTP webhooks fired on `job.completed`, `job.failed`, `job.canceled`, `daily_budget_exceeded`, and `desktop_daily_budget_exceeded`. | webhooks table (a hook created without an explicit events list defaults to `["job.completed","job.failed","job.canceled"]`) |
40
52
  | **Code section** | Plain-language file-summary language (`en` / `es`) and the monthly summary budget cap. | `summary_language` = `en`, `summary_monthly_budget_usd` = `5.00` |
41
53
  | **Terminal Panel** | App-wide defaults for the integrated terminal (font, render mode, copy-on-select, shell integration, image rendering, long-command threshold). | `terminal.*` keys |
42
54
 
43
- > There is **no** "Claude model", "Max concurrent jobs", "Job timeout", or "Authentication token" app setting. Within a project, jobs run one at a time (see [Architecture](architecture.md)); the only automatic queue pause is budget-based. The default model is the provider adapter's default (the `sonnet` alias for Claude), resolved at spawn time — it is not a stored setting.
55
+ > There is **no** "Claude model", "Max concurrent jobs", "Job timeout", or "Authentication token" app setting. Within a project, jobs run one at a time (see [Architecture](architecture.md)); the only automatic queue pause is budget-based. The default model is each provider's adapter default (e.g. `sonnet` for Claude, `gpt-5.5` for Codex, `gemini-3.5-flash` for Gemini), resolved at spawn time — it is not a stored setting.
44
56
 
45
57
  **Port is not a live setting.** `desktop_settings` does store a `port` value, but it is display-only. The port the server actually binds is taken from the `--port` argv (default `4200`); changing the stored value does not rebind a running server. Set the port with `--port <n>` on `specrails-desktop start`.
46
58
 
@@ -58,7 +70,7 @@ Project settings apply to a single project. Open them from the project's **Setti
58
70
  | **Budget** | Per-project daily spend cap (with queue auto-pause) and a per-job cost alert threshold. |
59
71
  | **Terminal Settings** | Per-project overrides for the terminal panel defaults (project override → app default → built-in). |
60
72
 
61
- > The project's **provider(s)** (Claude, Codex, or both) are chosen when you add the project and are **immutable after creation** there is no provider switch in Project Settings. There is also **no** Name edit, Path row, or model-override field on this page.
73
+ > The project's **provider(s)** — **Claude, Codex, Gemini, or any combination** — are chosen when you add the project and are **immutable after creation**. All three are enabled by default; there is no provider switch in Project Settings. There is also **no** Name edit, Path row, or model-override field on this page. See [Customising the app](../customizing.md) for how to disable a provider app-wide via its rollback gate.
62
74
 
63
75
  ---
64
76
 
@@ -121,9 +133,20 @@ A few env vars are read directly by the app. The two most useful operational one
121
133
  | `SPECRAILS_TECH_URL` | Fallback specrails-tech base URL. Resolution order is the `specrails_tech_url` app setting **first**, then this env var, then `http://localhost:3000` — so a stored app setting takes precedence over this var. |
122
134
  | `WM_ZOMBIE_TIMEOUT_MS` | Zombie-job detection timeout in milliseconds (default `1800000` = 30 min). This is a stuck-job watchdog, **not** a hard "kill after N minutes" cap. |
123
135
 
124
- `ANTHROPIC_API_KEY` is **not** read by the app. The Claude CLI authenticates on its own — via a Claude subscription login or its own API-key configuration — so you do not set it for the app.
136
+ ### Provider rollback gates
125
137
 
126
- For the full catalogue of feature flags and kill switches (`SPECRAILS_*` server gates, `VITE_FEATURE_*` client flags, `SPECRAILS_CODEX_BETA`, `SPECRAILS_EXPLORE_*`), see [../customizing.md](../customizing.md#environment-variables).
138
+ Both extra providers are **enabled by default** and only need these levers if you want to turn one off app-wide (an emergency rollback — no redeploy needed):
139
+
140
+ | Variable | Effect |
141
+ |----------|--------|
142
+ | `SPECRAILS_CODEX_BETA=0` | Disables the Codex provider (only the exact string `0` disables it; `1`/`true`/unset = enabled). The legacy name `SPECRAILS_HUB_CODEX_BETA` is honoured as a fallback when this is unset. |
143
+ | `SPECRAILS_GEMINI_BETA=0` | Disables the Gemini provider (only the exact string `0`). Unlike Codex, Gemini has **no legacy `SPECRAILS_HUB_*` fallback name**. |
144
+
145
+ A disabled provider stops appearing in Add Project and is rejected by the create-project API; existing projects that already use it are unaffected on disk.
146
+
147
+ `ANTHROPIC_API_KEY` is **not** read by the app. Each provider's CLI authenticates on its own — Claude via a subscription login or its own API-key configuration, Codex via `codex login`, Gemini via `GEMINI_API_KEY` (a Google AI Studio key) — so you do not set provider keys for the app itself. See the [Codex](../codex.md) and [Gemini](../gemini.md) guides for per-provider auth.
148
+
149
+ For the full catalogue of feature flags and kill switches (`SPECRAILS_*` server gates, `VITE_FEATURE_*` client flags, `SPECRAILS_CODEX_BETA`, `SPECRAILS_GEMINI_BETA`, `SPECRAILS_EXPLORE_*`), see [../customizing.md](../customizing.md#environment-variables).
127
150
 
128
151
  ---
129
152
 
@@ -169,4 +192,6 @@ rm -rf ~/.specrails/desktop.sqlite ~/.specrails/projects/
169
192
  - [Architecture](architecture.md) — server modules, data flow, WebSocket protocol
170
193
  - [CLI reference](../cli.md) — every command and flag in detail
171
194
  - [Customising the app](../customizing.md) — feature flags, env vars, keybindings
172
- - [Adding a provider](adding-a-provider.md) — wiring a third AI CLI adapter
195
+ - [Codex](../codex.md) — using the Codex CLI provider
196
+ - [Gemini](../gemini.md) — using the Gemini CLI provider
197
+ - [Adding a provider](adding-a-provider.md) — wiring a new AI CLI adapter