rimuru-ai 1.19.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 (470) hide show
  1. package/.rimuru/AGENTS.md +30 -0
  2. package/.rimuru/agents/backend.md +27 -0
  3. package/.rimuru/agents/database.md +31 -0
  4. package/.rimuru/agents/devops.md +30 -0
  5. package/.rimuru/agents/document-prep.md +49 -0
  6. package/.rimuru/agents/erp-architect.md +41 -0
  7. package/.rimuru/agents/ethical-hacking.md +49 -0
  8. package/.rimuru/agents/frontend.md +31 -0
  9. package/.rimuru/agents/fullstack.md +24 -0
  10. package/.rimuru/agents/system-engineer.md +31 -0
  11. package/.rimuru/agents/veldora-agent-tool-dev.md +30 -0
  12. package/.rimuru/agents/veldora-backend-dev.md +32 -0
  13. package/.rimuru/agents/veldora-cicd.md +32 -0
  14. package/.rimuru/agents/veldora-database.md +32 -0
  15. package/.rimuru/agents/veldora-doc.md +87 -0
  16. package/.rimuru/agents/veldora-frontend-dev.md +32 -0
  17. package/.rimuru/agents/veldora-great-sage.md +33 -0
  18. package/.rimuru/agents/veldora-mcp-creator.md +30 -0
  19. package/.rimuru/agents/veldora-pro.md +224 -0
  20. package/.rimuru/agents/veldora-prompt-enhancer.md +27 -0
  21. package/.rimuru/agents/veldora-skill-creator.md +28 -0
  22. package/.rimuru/agents/veldora.md +225 -0
  23. package/.rimuru/agents/veldorapro-agent-tool-dev.md +29 -0
  24. package/.rimuru/agents/veldorapro-backend-dev.md +29 -0
  25. package/.rimuru/agents/veldorapro-cicd.md +29 -0
  26. package/.rimuru/agents/veldorapro-database.md +29 -0
  27. package/.rimuru/agents/veldorapro-frontend-dev.md +29 -0
  28. package/.rimuru/agents/veldorapro-great-sage.md +33 -0
  29. package/.rimuru/agents/veldorapro-mcp-creator.md +27 -0
  30. package/.rimuru/agents/veldorapro-prompt-enhancer.md +25 -0
  31. package/.rimuru/agents/veldorapro-skill-creator.md +27 -0
  32. package/.rimuru/command/ai-deps.md +24 -0
  33. package/.rimuru/command/changelog.md +49 -0
  34. package/.rimuru/command/commit.md +37 -0
  35. package/.rimuru/command/issues.md +23 -0
  36. package/.rimuru/command/learn.md +42 -0
  37. package/.rimuru/command/rmslop.md +15 -0
  38. package/.rimuru/command/spellcheck.md +5 -0
  39. package/.rimuru/command/translate.md +14 -0
  40. package/.rimuru/glossary/README.md +63 -0
  41. package/.rimuru/glossary/ar.md +28 -0
  42. package/.rimuru/glossary/br.md +34 -0
  43. package/.rimuru/glossary/bs.md +33 -0
  44. package/.rimuru/glossary/da.md +27 -0
  45. package/.rimuru/glossary/de.md +27 -0
  46. package/.rimuru/glossary/es.md +27 -0
  47. package/.rimuru/glossary/fr.md +27 -0
  48. package/.rimuru/glossary/ja.md +33 -0
  49. package/.rimuru/glossary/ko.md +27 -0
  50. package/.rimuru/glossary/no.md +38 -0
  51. package/.rimuru/glossary/pl.md +27 -0
  52. package/.rimuru/glossary/ru.md +27 -0
  53. package/.rimuru/glossary/th.md +34 -0
  54. package/.rimuru/glossary/tr.md +38 -0
  55. package/.rimuru/glossary/zh-cn.md +42 -0
  56. package/.rimuru/glossary/zh-tw.md +42 -0
  57. package/.rimuru/improver/changelog.md +250 -0
  58. package/.rimuru/improver/knowledge.md +172 -0
  59. package/.rimuru/improver/plugins.md +21 -0
  60. package/.rimuru/improver/skills.md +60 -0
  61. package/.rimuru/improver/token-audit.md +21 -0
  62. package/.rimuru/opencode.jsonc +140 -0
  63. package/.rimuru/plugins/smoke-theme.json +223 -0
  64. package/.rimuru/plugins/tui-smoke.tsx +1019 -0
  65. package/.rimuru/skills/effect/SKILL.md +38 -0
  66. package/.rimuru/themes/mytheme.json +223 -0
  67. package/.rimuru/tool/github-pr-search.ts +64 -0
  68. package/.rimuru/tool/github-triage.ts +60 -0
  69. package/README.md +31 -0
  70. package/package.json +167 -0
  71. package/src/account/account.ts +463 -0
  72. package/src/account/repo.ts +173 -0
  73. package/src/account/schema.ts +99 -0
  74. package/src/account/url.ts +8 -0
  75. package/src/acp/agent.ts +95 -0
  76. package/src/acp/config-option.ts +203 -0
  77. package/src/acp/content.ts +250 -0
  78. package/src/acp/directory.ts +210 -0
  79. package/src/acp/error.ts +90 -0
  80. package/src/acp/event.ts +342 -0
  81. package/src/acp/permission.ts +124 -0
  82. package/src/acp/profile.ts +42 -0
  83. package/src/acp/service.ts +1048 -0
  84. package/src/acp/session.ts +231 -0
  85. package/src/acp/tool.ts +367 -0
  86. package/src/acp/usage.ts +232 -0
  87. package/src/agent/agent.ts +459 -0
  88. package/src/agent/generate.txt +75 -0
  89. package/src/agent/prompt/compaction.txt +9 -0
  90. package/src/agent/prompt/explore.txt +18 -0
  91. package/src/agent/prompt/summary.txt +11 -0
  92. package/src/agent/prompt/title.txt +44 -0
  93. package/src/agent/subagent-permissions.ts +27 -0
  94. package/src/audio.d.ts +14 -0
  95. package/src/auth/index.ts +99 -0
  96. package/src/background/job.ts +39 -0
  97. package/src/bus/global.ts +22 -0
  98. package/src/cli/bootstrap.ts +11 -0
  99. package/src/cli/cmd/account.ts +264 -0
  100. package/src/cli/cmd/acp.ts +73 -0
  101. package/src/cli/cmd/agent.ts +259 -0
  102. package/src/cli/cmd/attach.ts +97 -0
  103. package/src/cli/cmd/cmd.ts +7 -0
  104. package/src/cli/cmd/db.ts +62 -0
  105. package/src/cli/cmd/debug/agent.handler.ts +193 -0
  106. package/src/cli/cmd/debug/agent.ts +27 -0
  107. package/src/cli/cmd/debug/config.ts +14 -0
  108. package/src/cli/cmd/debug/file.ts +73 -0
  109. package/src/cli/cmd/debug/index.ts +87 -0
  110. package/src/cli/cmd/debug/lsp.ts +50 -0
  111. package/src/cli/cmd/debug/ripgrep.ts +79 -0
  112. package/src/cli/cmd/debug/scrap.ts +15 -0
  113. package/src/cli/cmd/debug/skill.ts +15 -0
  114. package/src/cli/cmd/debug/snapshot.ts +50 -0
  115. package/src/cli/cmd/debug/startup.ts +11 -0
  116. package/src/cli/cmd/debug/v2.ts +49 -0
  117. package/src/cli/cmd/export.ts +292 -0
  118. package/src/cli/cmd/generate.ts +54 -0
  119. package/src/cli/cmd/github.handler.ts +1593 -0
  120. package/src/cli/cmd/github.shared.ts +30 -0
  121. package/src/cli/cmd/github.ts +42 -0
  122. package/src/cli/cmd/import.ts +224 -0
  123. package/src/cli/cmd/mcp.ts +850 -0
  124. package/src/cli/cmd/models.ts +66 -0
  125. package/src/cli/cmd/plug.ts +230 -0
  126. package/src/cli/cmd/pr.ts +115 -0
  127. package/src/cli/cmd/prompt-display.ts +1 -0
  128. package/src/cli/cmd/providers.ts +534 -0
  129. package/src/cli/cmd/run/demo.ts +1274 -0
  130. package/src/cli/cmd/run/entry.body.ts +205 -0
  131. package/src/cli/cmd/run/footer.command.tsx +1064 -0
  132. package/src/cli/cmd/run/footer.menu.tsx +351 -0
  133. package/src/cli/cmd/run/footer.permission.tsx +472 -0
  134. package/src/cli/cmd/run/footer.prompt.tsx +1306 -0
  135. package/src/cli/cmd/run/footer.question.tsx +573 -0
  136. package/src/cli/cmd/run/footer.subagent.tsx +173 -0
  137. package/src/cli/cmd/run/footer.ts +1129 -0
  138. package/src/cli/cmd/run/footer.view.tsx +943 -0
  139. package/src/cli/cmd/run/footer.width.ts +27 -0
  140. package/src/cli/cmd/run/permission.shared.ts +256 -0
  141. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  142. package/src/cli/cmd/run/prompt.shared.ts +153 -0
  143. package/src/cli/cmd/run/question.shared.ts +340 -0
  144. package/src/cli/cmd/run/runtime.boot.ts +202 -0
  145. package/src/cli/cmd/run/runtime.lifecycle.ts +406 -0
  146. package/src/cli/cmd/run/runtime.queue.ts +349 -0
  147. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  148. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  149. package/src/cli/cmd/run/runtime.ts +814 -0
  150. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  151. package/src/cli/cmd/run/scrollback.surface.ts +431 -0
  152. package/src/cli/cmd/run/scrollback.writer.tsx +352 -0
  153. package/src/cli/cmd/run/session-data.ts +1113 -0
  154. package/src/cli/cmd/run/session-replay.ts +374 -0
  155. package/src/cli/cmd/run/session.shared.ts +196 -0
  156. package/src/cli/cmd/run/splash.ts +280 -0
  157. package/src/cli/cmd/run/stream.transport.ts +1462 -0
  158. package/src/cli/cmd/run/stream.ts +175 -0
  159. package/src/cli/cmd/run/subagent-data.ts +876 -0
  160. package/src/cli/cmd/run/theme.ts +690 -0
  161. package/src/cli/cmd/run/tool.ts +1489 -0
  162. package/src/cli/cmd/run/trace.ts +94 -0
  163. package/src/cli/cmd/run/turn-summary.ts +47 -0
  164. package/src/cli/cmd/run/types.ts +350 -0
  165. package/src/cli/cmd/run/variant.shared.ts +215 -0
  166. package/src/cli/cmd/run.ts +894 -0
  167. package/src/cli/cmd/serve.ts +24 -0
  168. package/src/cli/cmd/session.ts +147 -0
  169. package/src/cli/cmd/stats.ts +393 -0
  170. package/src/cli/cmd/tui.ts +224 -0
  171. package/src/cli/cmd/uninstall.ts +353 -0
  172. package/src/cli/cmd/upgrade.ts +74 -0
  173. package/src/cli/cmd/web.ts +84 -0
  174. package/src/cli/effect/prompt.ts +37 -0
  175. package/src/cli/effect-cmd.ts +96 -0
  176. package/src/cli/error.ts +130 -0
  177. package/src/cli/heap.ts +45 -0
  178. package/src/cli/logo.ts +1 -0
  179. package/src/cli/network.ts +64 -0
  180. package/src/cli/tui/layer.ts +7 -0
  181. package/src/cli/tui/validate-session.ts +29 -0
  182. package/src/cli/tui/worker.ts +71 -0
  183. package/src/cli/ui.ts +98 -0
  184. package/src/cli/upgrade.ts +53 -0
  185. package/src/command/index.ts +184 -0
  186. package/src/command/template/initialize.txt +66 -0
  187. package/src/command/template/review.txt +101 -0
  188. package/src/config/agent.ts +59 -0
  189. package/src/config/command.ts +39 -0
  190. package/src/config/config.ts +686 -0
  191. package/src/config/entry-name.ts +19 -0
  192. package/src/config/managed.ts +69 -0
  193. package/src/config/markdown.ts +36 -0
  194. package/src/config/parse.ts +79 -0
  195. package/src/config/paths.ts +45 -0
  196. package/src/config/plugin.ts +79 -0
  197. package/src/config/tui-cwd.ts +5 -0
  198. package/src/config/tui-host-attention.ts +21 -0
  199. package/src/config/tui-migrate.ts +132 -0
  200. package/src/config/tui.ts +274 -0
  201. package/src/config/variable.ts +91 -0
  202. package/src/control-plane/adapters/index.ts +41 -0
  203. package/src/control-plane/adapters/worktree.ts +96 -0
  204. package/src/control-plane/dev/README.md +19 -0
  205. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  206. package/src/control-plane/types.ts +59 -0
  207. package/src/control-plane/util.ts +39 -0
  208. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  209. package/src/control-plane/workspace-context.ts +26 -0
  210. package/src/control-plane/workspace.ts +989 -0
  211. package/src/effect/app-runtime.ts +132 -0
  212. package/src/effect/bootstrap-runtime.ts +23 -0
  213. package/src/effect/bridge.ts +84 -0
  214. package/src/effect/config-service.ts +67 -0
  215. package/src/effect/instance-ref.ts +11 -0
  216. package/src/effect/instance-registry.ts +12 -0
  217. package/src/effect/instance-state.ts +69 -0
  218. package/src/effect/promise.ts +17 -0
  219. package/src/effect/run-service.ts +47 -0
  220. package/src/effect/runner.ts +217 -0
  221. package/src/effect/runtime-flags.ts +79 -0
  222. package/src/env/index.ts +43 -0
  223. package/src/event-v2-bridge.ts +79 -0
  224. package/src/format/formatter.ts +404 -0
  225. package/src/format/index.ts +205 -0
  226. package/src/git/index.ts +350 -0
  227. package/src/id/id.ts +80 -0
  228. package/src/ide/index.ts +61 -0
  229. package/src/image/image.ts +174 -0
  230. package/src/index.ts +142 -0
  231. package/src/installation/index.ts +350 -0
  232. package/src/lsp/client.ts +650 -0
  233. package/src/lsp/diagnostic.ts +29 -0
  234. package/src/lsp/language.ts +121 -0
  235. package/src/lsp/launch.ts +21 -0
  236. package/src/lsp/lsp.ts +511 -0
  237. package/src/lsp/server.ts +1983 -0
  238. package/src/markdown.d.ts +4 -0
  239. package/src/mcp/auth.ts +174 -0
  240. package/src/mcp/catalog.ts +153 -0
  241. package/src/mcp/index.ts +946 -0
  242. package/src/mcp/oauth-callback.ts +233 -0
  243. package/src/mcp/oauth-provider.ts +206 -0
  244. package/src/node.ts +4 -0
  245. package/src/patch/index.ts +686 -0
  246. package/src/permission/arity.ts +163 -0
  247. package/src/permission/evaluate.ts +1 -0
  248. package/src/permission/index.ts +230 -0
  249. package/src/plugin/azure.ts +26 -0
  250. package/src/plugin/cloudflare.ts +76 -0
  251. package/src/plugin/digitalocean.ts +383 -0
  252. package/src/plugin/github-copilot/copilot.ts +413 -0
  253. package/src/plugin/github-copilot/models.ts +246 -0
  254. package/src/plugin/index.ts +316 -0
  255. package/src/plugin/install.ts +439 -0
  256. package/src/plugin/loader.ts +237 -0
  257. package/src/plugin/meta.ts +188 -0
  258. package/src/plugin/openai/README.md +31 -0
  259. package/src/plugin/openai/codex.ts +641 -0
  260. package/src/plugin/openai/ws-pool.ts +270 -0
  261. package/src/plugin/openai/ws.ts +381 -0
  262. package/src/plugin/pty-environment.ts +24 -0
  263. package/src/plugin/shared.ts +323 -0
  264. package/src/plugin/snowflake-cortex.ts +529 -0
  265. package/src/plugin/tui/internal.ts +10 -0
  266. package/src/plugin/tui/runtime.ts +1130 -0
  267. package/src/plugin/xai.ts +716 -0
  268. package/src/project/bootstrap-service.ts +9 -0
  269. package/src/project/bootstrap.ts +76 -0
  270. package/src/project/instance-context.ts +24 -0
  271. package/src/project/instance-layer.ts +11 -0
  272. package/src/project/instance-runtime.ts +16 -0
  273. package/src/project/instance-store.ts +209 -0
  274. package/src/project/project.ts +519 -0
  275. package/src/project/vcs.ts +431 -0
  276. package/src/provider/auth.ts +233 -0
  277. package/src/provider/error.ts +188 -0
  278. package/src/provider/model-status.ts +8 -0
  279. package/src/provider/provider.ts +1979 -0
  280. package/src/provider/transform.ts +1426 -0
  281. package/src/question/index.ts +229 -0
  282. package/src/question/schema.ts +10 -0
  283. package/src/server/auth.ts +48 -0
  284. package/src/server/event.ts +13 -0
  285. package/src/server/global-lifecycle.ts +28 -0
  286. package/src/server/init-projectors.ts +3 -0
  287. package/src/server/mdns.ts +47 -0
  288. package/src/server/projectors.ts +1 -0
  289. package/src/server/proxy-util.ts +48 -0
  290. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  291. package/src/server/routes/instance/httpapi/api.ts +78 -0
  292. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  293. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  294. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  295. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  296. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  297. package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
  298. package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
  299. package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
  300. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  301. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  302. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  303. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  304. package/src/server/routes/instance/httpapi/groups/project-copy.ts +32 -0
  305. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  306. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  307. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  308. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  309. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  310. package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
  311. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  312. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  313. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  314. package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
  315. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  316. package/src/server/routes/instance/httpapi/handlers/control.ts +43 -0
  317. package/src/server/routes/instance/httpapi/handlers/event.ts +99 -0
  318. package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
  319. package/src/server/routes/instance/httpapi/handlers/file.ts +139 -0
  320. package/src/server/routes/instance/httpapi/handlers/global.ts +156 -0
  321. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  322. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  323. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  324. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +83 -0
  325. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  326. package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
  327. package/src/server/routes/instance/httpapi/handlers/pty.ts +273 -0
  328. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  329. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
  330. package/src/server/routes/instance/httpapi/handlers/session.ts +440 -0
  331. package/src/server/routes/instance/httpapi/handlers/sync.ts +89 -0
  332. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  333. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  334. package/src/server/routes/instance/httpapi/lifecycle.ts +54 -0
  335. package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
  336. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  337. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  338. package/src/server/routes/instance/httpapi/middleware/error.ts +43 -0
  339. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  340. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  341. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  342. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +41 -0
  343. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  344. package/src/server/routes/instance/httpapi/public.ts +535 -0
  345. package/src/server/routes/instance/httpapi/server.ts +298 -0
  346. package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
  347. package/src/server/server.ts +225 -0
  348. package/src/server/shared/fence.ts +60 -0
  349. package/src/server/shared/pty-ticket.ts +15 -0
  350. package/src/server/shared/public-ui.ts +12 -0
  351. package/src/server/shared/tui-control.ts +28 -0
  352. package/src/server/shared/ui.ts +122 -0
  353. package/src/server/shared/workspace-routing.ts +38 -0
  354. package/src/server/tui-event.ts +53 -0
  355. package/src/session/compaction.ts +620 -0
  356. package/src/session/instruction.ts +241 -0
  357. package/src/session/llm/AGENTS.md +90 -0
  358. package/src/session/llm/ai-sdk.ts +288 -0
  359. package/src/session/llm/native-request.ts +196 -0
  360. package/src/session/llm/native-runtime.ts +196 -0
  361. package/src/session/llm/request.ts +218 -0
  362. package/src/session/llm.ts +415 -0
  363. package/src/session/message-error.ts +14 -0
  364. package/src/session/message-v2.ts +744 -0
  365. package/src/session/message.ts +148 -0
  366. package/src/session/overflow.ts +34 -0
  367. package/src/session/processor.ts +1084 -0
  368. package/src/session/prompt/anthropic.txt +105 -0
  369. package/src/session/prompt/beast.txt +147 -0
  370. package/src/session/prompt/build-switch.txt +5 -0
  371. package/src/session/prompt/codex.txt +79 -0
  372. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  373. package/src/session/prompt/default.txt +95 -0
  374. package/src/session/prompt/gemini.txt +155 -0
  375. package/src/session/prompt/gpt.txt +107 -0
  376. package/src/session/prompt/kimi.txt +95 -0
  377. package/src/session/prompt/max-steps.txt +16 -0
  378. package/src/session/prompt/plan-mode.txt +70 -0
  379. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  380. package/src/session/prompt/plan.txt +26 -0
  381. package/src/session/prompt/trinity.txt +97 -0
  382. package/src/session/prompt.ts +1722 -0
  383. package/src/session/reminders.ts +92 -0
  384. package/src/session/retry.ts +201 -0
  385. package/src/session/revert.ts +160 -0
  386. package/src/session/run-state.ts +156 -0
  387. package/src/session/schema.ts +26 -0
  388. package/src/session/session.ts +1119 -0
  389. package/src/session/status.ts +97 -0
  390. package/src/session/summary.ts +165 -0
  391. package/src/session/system.ts +117 -0
  392. package/src/session/todo.ts +90 -0
  393. package/src/session/tools.ts +207 -0
  394. package/src/share/session.ts +61 -0
  395. package/src/share/share-next.ts +385 -0
  396. package/src/skill/discovery.ts +109 -0
  397. package/src/skill/index.ts +366 -0
  398. package/src/snapshot/index.ts +808 -0
  399. package/src/sql.d.ts +4 -0
  400. package/src/storage/schema.ts +5 -0
  401. package/src/storage/storage.ts +329 -0
  402. package/src/sync/README.md +179 -0
  403. package/src/sync/schema.ts +11 -0
  404. package/src/temporary.ts +31 -0
  405. package/src/tool/apply_patch.ts +313 -0
  406. package/src/tool/apply_patch.txt +33 -0
  407. package/src/tool/edit.ts +737 -0
  408. package/src/tool/edit.txt +10 -0
  409. package/src/tool/external-directory.ts +49 -0
  410. package/src/tool/glob.ts +76 -0
  411. package/src/tool/glob.txt +6 -0
  412. package/src/tool/grep.ts +112 -0
  413. package/src/tool/grep.txt +8 -0
  414. package/src/tool/invalid.ts +21 -0
  415. package/src/tool/json-schema.ts +164 -0
  416. package/src/tool/lsp.ts +113 -0
  417. package/src/tool/lsp.txt +24 -0
  418. package/src/tool/mcp-websearch.ts +96 -0
  419. package/src/tool/plan-enter.txt +14 -0
  420. package/src/tool/plan-exit.txt +13 -0
  421. package/src/tool/plan.ts +79 -0
  422. package/src/tool/question.ts +44 -0
  423. package/src/tool/question.txt +10 -0
  424. package/src/tool/read.ts +386 -0
  425. package/src/tool/read.txt +14 -0
  426. package/src/tool/registry.ts +440 -0
  427. package/src/tool/schema.ts +14 -0
  428. package/src/tool/shell/id.ts +19 -0
  429. package/src/tool/shell/prompt.ts +307 -0
  430. package/src/tool/shell/shell.txt +21 -0
  431. package/src/tool/shell.ts +657 -0
  432. package/src/tool/skill.ts +71 -0
  433. package/src/tool/skill.txt +5 -0
  434. package/src/tool/task.ts +346 -0
  435. package/src/tool/task.txt +19 -0
  436. package/src/tool/todo.ts +57 -0
  437. package/src/tool/todowrite.txt +44 -0
  438. package/src/tool/tool.ts +183 -0
  439. package/src/tool/truncate.ts +158 -0
  440. package/src/tool/truncation-dir.ts +4 -0
  441. package/src/tool/webfetch.ts +192 -0
  442. package/src/tool/webfetch.txt +13 -0
  443. package/src/tool/websearch.ts +143 -0
  444. package/src/tool/websearch.txt +14 -0
  445. package/src/tool/write.ts +104 -0
  446. package/src/tool/write.txt +8 -0
  447. package/src/util/archive.ts +17 -0
  448. package/src/util/bom.ts +27 -0
  449. package/src/util/data-url.ts +9 -0
  450. package/src/util/defer.ts +10 -0
  451. package/src/util/effect-http-client.ts +11 -0
  452. package/src/util/error.ts +1 -0
  453. package/src/util/filesystem.ts +251 -0
  454. package/src/util/html.ts +8 -0
  455. package/src/util/iife.ts +3 -0
  456. package/src/util/lazy.ts +20 -0
  457. package/src/util/local-context.ts +25 -0
  458. package/src/util/locale.ts +2 -0
  459. package/src/util/media.ts +26 -0
  460. package/src/util/process.ts +177 -0
  461. package/src/util/proxy-env.ts +72 -0
  462. package/src/util/queue.ts +32 -0
  463. package/src/util/record.ts +1 -0
  464. package/src/util/repository.ts +232 -0
  465. package/src/util/rpc.ts +66 -0
  466. package/src/util/signal.ts +12 -0
  467. package/src/util/timeout.ts +13 -0
  468. package/src/util/token.ts +1 -0
  469. package/src/util/wildcard.ts +59 -0
  470. package/src/worktree/index.ts +654 -0
@@ -0,0 +1,224 @@
1
+ import { cmd } from "@/cli/cmd/cmd"
2
+ import { Rpc } from "@/util/rpc"
3
+ import { type rpc } from "../tui/worker"
4
+ import path from "path"
5
+ import { fileURLToPath } from "url"
6
+ import { UI } from "@/cli/ui"
7
+ import { errorMessage } from "@rimurucode-ai/tui/util/error"
8
+ import { withTimeout } from "@/util/timeout"
9
+ import { withNetworkOptions, resolveNetworkOptionsNoConfig } from "@/cli/network"
10
+ import { Filesystem } from "@/util/filesystem"
11
+ import type { GlobalEvent } from "@rimurucode-ai/sdk/v2"
12
+ import type { EventSource } from "@rimurucode-ai/tui/context/sdk"
13
+ import { writeHeapSnapshot } from "v8"
14
+ import { validateSession } from "../tui/validate-session"
15
+ import { win32InstallCtrlCGuard } from "@rimurucode-ai/tui/terminal-win32"
16
+
17
+ declare global {
18
+ const OPENCODE_WORKER_PATH: string
19
+ }
20
+
21
+ type RpcClient = ReturnType<typeof Rpc.client<typeof rpc>>
22
+
23
+ function createWorkerFetch(client: RpcClient): typeof fetch {
24
+ const fn = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
25
+ const request = new Request(input, init)
26
+ const body = request.body ? await request.text() : undefined
27
+ const result = await client.call("fetch", {
28
+ url: request.url,
29
+ method: request.method,
30
+ headers: Object.fromEntries(request.headers.entries()),
31
+ body,
32
+ })
33
+ return new Response(result.body, {
34
+ status: result.status,
35
+ headers: result.headers,
36
+ })
37
+ }
38
+ return fn as typeof fetch
39
+ }
40
+
41
+ function createEventSource(client: RpcClient): EventSource {
42
+ return {
43
+ subscribe: async (handler) => {
44
+ return client.on<GlobalEvent>("global.event", (e) => {
45
+ handler(e)
46
+ })
47
+ },
48
+ }
49
+ }
50
+
51
+ async function target() {
52
+ if (typeof OPENCODE_WORKER_PATH !== "undefined") return OPENCODE_WORKER_PATH
53
+ const dist = new URL("./cli/tui/worker.js", import.meta.url)
54
+ if (await Filesystem.exists(fileURLToPath(dist))) return dist
55
+ return new URL("../tui/worker.ts", import.meta.url)
56
+ }
57
+
58
+ async function input(value?: string) {
59
+ const piped = process.stdin.isTTY ? undefined : await Bun.stdin.text()
60
+ if (!value) return piped
61
+ if (!piped) return value
62
+ return piped + "\n" + value
63
+ }
64
+
65
+ export function resolveThreadDirectory(project?: string, envPWD = process.env.PWD, cwd = process.cwd()) {
66
+ const root = Filesystem.resolve(envPWD ?? cwd)
67
+ if (project) return Filesystem.resolve(path.isAbsolute(project) ? project : path.join(root, project))
68
+ return Filesystem.resolve(cwd)
69
+ }
70
+
71
+ export const TuiThreadCommand = cmd({
72
+ command: "$0 [project]",
73
+ describe: "start rimuru-ai tui",
74
+ builder: (yargs) =>
75
+ withNetworkOptions(yargs)
76
+ .positional("project", {
77
+ type: "string",
78
+ describe: "path to start rimuru-ai in",
79
+ })
80
+ .option("model", {
81
+ type: "string",
82
+ alias: ["m"],
83
+ describe: "model to use in the format of provider/model",
84
+ })
85
+ .option("continue", {
86
+ alias: ["c"],
87
+ describe: "continue the last session",
88
+ type: "boolean",
89
+ })
90
+ .option("session", {
91
+ alias: ["s"],
92
+ type: "string",
93
+ describe: "session id to continue",
94
+ })
95
+ .option("fork", {
96
+ type: "boolean",
97
+ describe: "fork the session when continuing (use with --continue or --session)",
98
+ })
99
+ .option("prompt", {
100
+ type: "string",
101
+ describe: "prompt to use",
102
+ })
103
+ .option("agent", {
104
+ type: "string",
105
+ describe: "agent to use",
106
+ }),
107
+ handler: async (args) => {
108
+ const unguard = win32InstallCtrlCGuard()
109
+ try {
110
+ const { TuiConfig } = await import("@/config/tui")
111
+ if (args.fork && !args.continue && !args.session) {
112
+ UI.error("--fork requires --continue or --session")
113
+ process.exitCode = 1
114
+ return
115
+ }
116
+
117
+ // Resolve relative --project paths from PWD, then use the real cwd after
118
+ // chdir so the thread and worker share the same directory key.
119
+ const next = resolveThreadDirectory(args.project)
120
+ const file = await target()
121
+ try {
122
+ process.chdir(next)
123
+ } catch {
124
+ UI.error("Failed to change directory to " + next)
125
+ return
126
+ }
127
+ const cwd = Filesystem.resolve(process.cwd())
128
+
129
+ const worker = new Worker(file)
130
+ const client = Rpc.client<typeof rpc>(worker)
131
+ const reload = () => {
132
+ client.call("reload", undefined).catch(() => {})
133
+ }
134
+ process.on("SIGUSR2", reload)
135
+
136
+ let stopped = false
137
+ const stop = async () => {
138
+ if (stopped) return
139
+ stopped = true
140
+ process.off("SIGUSR2", reload)
141
+ await withTimeout(client.call("shutdown", undefined), 5000).catch(() => {})
142
+ worker.terminate()
143
+ }
144
+
145
+ const prompt = await input(args.prompt)
146
+ const config = await TuiConfig.get()
147
+
148
+ const network = resolveNetworkOptionsNoConfig(args)
149
+ const external =
150
+ process.argv.includes("--port") ||
151
+ process.argv.includes("--hostname") ||
152
+ process.argv.includes("--mdns") ||
153
+ network.mdns ||
154
+ network.port !== 0 ||
155
+ network.hostname !== "127.0.0.1"
156
+
157
+ const transport = external
158
+ ? {
159
+ url: (await client.call("server", network)).url,
160
+ fetch: undefined,
161
+ events: undefined,
162
+ }
163
+ : {
164
+ url: "http://rimuru-ai.internal",
165
+ fetch: createWorkerFetch(client),
166
+ events: createEventSource(client),
167
+ }
168
+
169
+ try {
170
+ await validateSession({
171
+ url: transport.url,
172
+ sessionID: args.session,
173
+ directory: cwd,
174
+ fetch: transport.fetch,
175
+ })
176
+ } catch (error) {
177
+ UI.error(errorMessage(error))
178
+ process.exitCode = 1
179
+ return
180
+ }
181
+
182
+ setTimeout(() => {
183
+ client.call("checkUpgrade", { directory: cwd }).catch(() => {})
184
+ }, 1000).unref?.()
185
+
186
+ try {
187
+ const { Effect } = await import("effect")
188
+ const { run } = await import("../tui/layer")
189
+ const { createLegacyTuiPluginHost } = await import("@/plugin/tui/runtime")
190
+ await Effect.runPromise(
191
+ run({
192
+ url: transport.url,
193
+ async onSnapshot() {
194
+ const tui = writeHeapSnapshot("tui.heapsnapshot")
195
+ const server = await client.call("snapshot", undefined)
196
+ return [tui, server]
197
+ },
198
+ config,
199
+ pluginHost: createLegacyTuiPluginHost(),
200
+ directory: cwd,
201
+ fetch: transport.fetch,
202
+ events: transport.events,
203
+ args: {
204
+ continue: args.continue,
205
+ sessionID: args.session,
206
+ agent: args.agent,
207
+ model: args.model,
208
+ prompt,
209
+ fork: args.fork,
210
+ },
211
+ }),
212
+ )
213
+ } finally {
214
+ await stop()
215
+ }
216
+ } finally {
217
+ try {
218
+ unguard?.()
219
+ } catch {}
220
+ }
221
+ process.exit(0)
222
+ },
223
+ })
224
+ // scratch
@@ -0,0 +1,353 @@
1
+ import type { Argv } from "yargs"
2
+ import { UI } from "../ui"
3
+ import * as prompts from "@clack/prompts"
4
+ import { Installation } from "../../installation"
5
+ import { Global } from "@rimurucode-ai/core/global"
6
+ import fs from "fs/promises"
7
+ import path from "path"
8
+ import os from "os"
9
+ import { Filesystem } from "@/util/filesystem"
10
+ import { Process } from "@/util/process"
11
+
12
+ interface UninstallArgs {
13
+ keepConfig: boolean
14
+ keepData: boolean
15
+ dryRun: boolean
16
+ force: boolean
17
+ }
18
+
19
+ interface RemovalTargets {
20
+ directories: Array<{ path: string; label: string; keep: boolean }>
21
+ shellConfig: string | null
22
+ binary: string | null
23
+ }
24
+
25
+ export const UninstallCommand = {
26
+ command: "uninstall",
27
+ describe: "uninstall rimuru-ai and remove all related files",
28
+ builder: (yargs: Argv) =>
29
+ yargs
30
+ .option("keep-config", {
31
+ alias: "c",
32
+ type: "boolean",
33
+ describe: "keep configuration files",
34
+ default: false,
35
+ })
36
+ .option("keep-data", {
37
+ alias: "d",
38
+ type: "boolean",
39
+ describe: "keep session data and snapshots",
40
+ default: false,
41
+ })
42
+ .option("dry-run", {
43
+ type: "boolean",
44
+ describe: "show what would be removed without removing",
45
+ default: false,
46
+ })
47
+ .option("force", {
48
+ alias: "f",
49
+ type: "boolean",
50
+ describe: "skip confirmation prompts",
51
+ default: false,
52
+ }),
53
+
54
+ handler: async (args: UninstallArgs) => {
55
+ UI.empty()
56
+ UI.println(UI.logo(" "))
57
+ UI.empty()
58
+ prompts.intro("Uninstall Rimuru")
59
+
60
+ const method = await Installation.method()
61
+ prompts.log.info(`Installation method: ${method}`)
62
+
63
+ const targets = await collectRemovalTargets(args, method)
64
+
65
+ await showRemovalSummary(targets, method)
66
+
67
+ if (!args.force && !args.dryRun) {
68
+ const confirm = await prompts.confirm({
69
+ message: "Are you sure you want to uninstall?",
70
+ initialValue: false,
71
+ })
72
+ if (!confirm || prompts.isCancel(confirm)) {
73
+ prompts.outro("Cancelled")
74
+ return
75
+ }
76
+ }
77
+
78
+ if (args.dryRun) {
79
+ prompts.log.warn("Dry run - no changes made")
80
+ prompts.outro("Done")
81
+ return
82
+ }
83
+
84
+ await executeUninstall(method, targets)
85
+
86
+ prompts.outro("Done")
87
+ },
88
+ }
89
+
90
+ async function collectRemovalTargets(args: UninstallArgs, method: Installation.Method): Promise<RemovalTargets> {
91
+ const directories: RemovalTargets["directories"] = [
92
+ { path: Global.Path.data, label: "Data", keep: args.keepData },
93
+ { path: Global.Path.cache, label: "Cache", keep: false },
94
+ { path: Global.Path.config, label: "Config", keep: args.keepConfig },
95
+ { path: Global.Path.state, label: "State", keep: false },
96
+ ]
97
+
98
+ const shellConfig = method === "curl" ? await getShellConfigFile() : null
99
+ const binary = method === "curl" ? process.execPath : null
100
+
101
+ return { directories, shellConfig, binary }
102
+ }
103
+
104
+ async function showRemovalSummary(targets: RemovalTargets, method: Installation.Method) {
105
+ prompts.log.message("The following will be removed:")
106
+
107
+ for (const dir of targets.directories) {
108
+ const exists = await fs
109
+ .access(dir.path)
110
+ .then(() => true)
111
+ .catch(() => false)
112
+ if (!exists) continue
113
+
114
+ const size = await getDirectorySize(dir.path)
115
+ const sizeStr = formatSize(size)
116
+ const status = dir.keep ? UI.Style.TEXT_DIM + "(keeping)" : ""
117
+ const prefix = dir.keep ? "○" : "✓"
118
+
119
+ prompts.log.info(` ${prefix} ${dir.label}: ${shortenPath(dir.path)} ${UI.Style.TEXT_DIM}(${sizeStr})${status}`)
120
+ }
121
+
122
+ if (targets.binary) {
123
+ prompts.log.info(` ✓ Binary: ${shortenPath(targets.binary)}`)
124
+ }
125
+
126
+ if (targets.shellConfig) {
127
+ prompts.log.info(` ✓ Shell PATH in ${shortenPath(targets.shellConfig)}`)
128
+ }
129
+
130
+ if (method !== "curl" && method !== "unknown") {
131
+ const cmds: Record<string, string> = {
132
+ npm: "npm uninstall -g rimuru-ai",
133
+ pnpm: "pnpm uninstall -g rimuru-ai",
134
+ bun: "bun remove -g rimuru-ai",
135
+ yarn: "yarn global remove rimuru-ai",
136
+ brew: "brew uninstall rimuru-ai",
137
+ choco: "choco uninstall rimuru-ai",
138
+ scoop: "scoop uninstall rimuru-ai",
139
+ }
140
+ prompts.log.info(` ✓ Package: ${cmds[method] || method}`)
141
+ }
142
+ }
143
+
144
+ async function executeUninstall(method: Installation.Method, targets: RemovalTargets) {
145
+ const spinner = prompts.spinner()
146
+ const errors: string[] = []
147
+
148
+ for (const dir of targets.directories) {
149
+ if (dir.keep) {
150
+ prompts.log.step(`Skipping ${dir.label} (--keep-${dir.label.toLowerCase()})`)
151
+ continue
152
+ }
153
+
154
+ const exists = await fs
155
+ .access(dir.path)
156
+ .then(() => true)
157
+ .catch(() => false)
158
+ if (!exists) continue
159
+
160
+ spinner.start(`Removing ${dir.label}...`)
161
+ const err = await fs.rm(dir.path, { recursive: true, force: true }).catch((e) => e)
162
+ if (err) {
163
+ spinner.stop(`Failed to remove ${dir.label}`, 1)
164
+ errors.push(`${dir.label}: ${err.message}`)
165
+ continue
166
+ }
167
+ spinner.stop(`Removed ${dir.label}`)
168
+ }
169
+
170
+ if (targets.shellConfig) {
171
+ spinner.start("Cleaning shell config...")
172
+ const err = await cleanShellConfig(targets.shellConfig).catch((e) => e)
173
+ if (err) {
174
+ spinner.stop("Failed to clean shell config", 1)
175
+ errors.push(`Shell config: ${err.message}`)
176
+ } else {
177
+ spinner.stop("Cleaned shell config")
178
+ }
179
+ }
180
+
181
+ if (method !== "curl" && method !== "unknown") {
182
+ const cmds: Record<string, string[]> = {
183
+ npm: ["npm", "uninstall", "-g", "rimuru-ai"],
184
+ pnpm: ["pnpm", "uninstall", "-g", "rimuru-ai"],
185
+ bun: ["bun", "remove", "-g", "rimuru-ai"],
186
+ yarn: ["yarn", "global", "remove", "rimuru-ai"],
187
+ brew: ["brew", "uninstall", "rimuru-ai"],
188
+ choco: ["choco", "uninstall", "rimuru-ai"],
189
+ scoop: ["scoop", "uninstall", "rimuru-ai"],
190
+ }
191
+
192
+ const cmd = cmds[method]
193
+ if (cmd) {
194
+ spinner.start(`Running ${cmd.join(" ")}...`)
195
+ const result = await Process.run(method === "choco" ? ["choco", "uninstall", "rimuru-ai", "-y", "-r"] : cmd, {
196
+ nothrow: true,
197
+ })
198
+ if (result.code !== 0) {
199
+ spinner.stop(`Package manager uninstall failed: exit code ${result.code}`, 1)
200
+ const text = `${result.stdout.toString("utf8")}\n${result.stderr.toString("utf8")}`
201
+ if (method === "choco" && text.includes("not running from an elevated command shell")) {
202
+ prompts.log.warn(`You may need to run '${cmd.join(" ")}' from an elevated command shell`)
203
+ } else {
204
+ prompts.log.warn(`You may need to run manually: ${cmd.join(" ")}`)
205
+ }
206
+ } else {
207
+ spinner.stop("Package removed")
208
+ }
209
+ }
210
+ }
211
+
212
+ if (method === "curl" && targets.binary) {
213
+ UI.empty()
214
+ prompts.log.message("To finish removing the binary, run:")
215
+ prompts.log.info(` rm "${targets.binary}"`)
216
+
217
+ const binDir = path.dirname(targets.binary)
218
+ if (binDir.includes(".rimuru")) {
219
+ prompts.log.info(` rmdir "${binDir}" 2>/dev/null`)
220
+ }
221
+ }
222
+
223
+ if (errors.length > 0) {
224
+ UI.empty()
225
+ prompts.log.warn("Some operations failed:")
226
+ for (const err of errors) {
227
+ prompts.log.error(` ${err}`)
228
+ }
229
+ }
230
+
231
+ UI.empty()
232
+ prompts.log.success("Thank you for using Rimuru!")
233
+ }
234
+
235
+ async function getShellConfigFile(): Promise<string | null> {
236
+ const shell = path.basename(process.env.SHELL || "bash")
237
+ const home = os.homedir()
238
+ const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, ".config")
239
+
240
+ const configFiles: Record<string, string[]> = {
241
+ fish: [path.join(xdgConfig, "fish", "config.fish")],
242
+ zsh: [
243
+ path.join(home, ".zshrc"),
244
+ path.join(home, ".zshenv"),
245
+ path.join(xdgConfig, "zsh", ".zshrc"),
246
+ path.join(xdgConfig, "zsh", ".zshenv"),
247
+ ],
248
+ bash: [
249
+ path.join(home, ".bashrc"),
250
+ path.join(home, ".bash_profile"),
251
+ path.join(home, ".profile"),
252
+ path.join(xdgConfig, "bash", ".bashrc"),
253
+ path.join(xdgConfig, "bash", ".bash_profile"),
254
+ ],
255
+ ash: [path.join(home, ".ashrc"), path.join(home, ".profile")],
256
+ sh: [path.join(home, ".profile")],
257
+ }
258
+
259
+ const candidates = configFiles[shell] || configFiles.bash
260
+
261
+ for (const file of candidates) {
262
+ const exists = await fs
263
+ .access(file)
264
+ .then(() => true)
265
+ .catch(() => false)
266
+ if (!exists) continue
267
+
268
+ const content = await Filesystem.readText(file).catch(() => "")
269
+ if (content.includes("# rimuru-ai") || content.includes(".rimuru/bin")) {
270
+ return file
271
+ }
272
+ }
273
+
274
+ return null
275
+ }
276
+
277
+ async function cleanShellConfig(file: string) {
278
+ const content = await Filesystem.readText(file)
279
+ const lines = content.split("\n")
280
+
281
+ const filtered: string[] = []
282
+ let skip = false
283
+
284
+ for (const line of lines) {
285
+ const trimmed = line.trim()
286
+
287
+ if (trimmed === "# rimuru-ai") {
288
+ skip = true
289
+ continue
290
+ }
291
+
292
+ if (skip) {
293
+ skip = false
294
+ if (trimmed.includes(".rimuru/bin") || trimmed.includes("fish_add_path")) {
295
+ continue
296
+ }
297
+ }
298
+
299
+ if (
300
+ (trimmed.startsWith("export PATH=") && trimmed.includes(".rimuru/bin")) ||
301
+ (trimmed.startsWith("fish_add_path") && trimmed.includes(".rimuru"))
302
+ ) {
303
+ continue
304
+ }
305
+
306
+ filtered.push(line)
307
+ }
308
+
309
+ while (filtered.length > 0 && filtered[filtered.length - 1].trim() === "") {
310
+ filtered.pop()
311
+ }
312
+
313
+ const output = filtered.join("\n") + "\n"
314
+ await Filesystem.write(file, output)
315
+ }
316
+
317
+ async function getDirectorySize(dir: string): Promise<number> {
318
+ let total = 0
319
+
320
+ const walk = async (current: string) => {
321
+ const entries = await fs.readdir(current, { withFileTypes: true }).catch(() => [])
322
+
323
+ for (const entry of entries) {
324
+ const full = path.join(current, entry.name)
325
+ if (entry.isDirectory()) {
326
+ await walk(full)
327
+ continue
328
+ }
329
+ if (entry.isFile()) {
330
+ const stat = await fs.stat(full).catch(() => null)
331
+ if (stat) total += stat.size
332
+ }
333
+ }
334
+ }
335
+
336
+ await walk(dir)
337
+ return total
338
+ }
339
+
340
+ function formatSize(bytes: number): string {
341
+ if (bytes < 1024) return `${bytes} B`
342
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
343
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
344
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`
345
+ }
346
+
347
+ function shortenPath(p: string): string {
348
+ const home = os.homedir()
349
+ if (p.startsWith(home)) {
350
+ return p.replace(home, "~")
351
+ }
352
+ return p
353
+ }
@@ -0,0 +1,74 @@
1
+ import type { Argv } from "yargs"
2
+ import { UI } from "../ui"
3
+ import * as prompts from "@clack/prompts"
4
+ import { Installation } from "../../installation"
5
+ import { InstallationVersion } from "@rimurucode-ai/core/installation/version"
6
+
7
+ export const UpgradeCommand = {
8
+ command: "upgrade [target]",
9
+ describe: "upgrade rimuru-ai to the latest or a specific version",
10
+ builder: (yargs: Argv) => {
11
+ return yargs
12
+ .positional("target", {
13
+ describe: "version to upgrade to, for ex '0.1.48' or 'v0.1.48'",
14
+ type: "string",
15
+ })
16
+ .option("method", {
17
+ alias: "m",
18
+ describe: "installation method to use",
19
+ type: "string",
20
+ choices: ["curl", "npm", "pnpm", "bun", "brew", "choco", "scoop"],
21
+ })
22
+ },
23
+ handler: async (args: { target?: string; method?: string }) => {
24
+ UI.empty()
25
+ UI.println(UI.logo(" "))
26
+ UI.empty()
27
+ prompts.intro("Upgrade")
28
+ const detectedMethod = await Installation.method()
29
+ const method = (args.method as Installation.Method) ?? detectedMethod
30
+ if (method === "unknown") {
31
+ prompts.log.error(`rimuru-ai is installed to ${process.execPath} and may be managed by a package manager`)
32
+ const install = await prompts.select({
33
+ message: "Install anyways?",
34
+ options: [
35
+ { label: "Yes", value: true },
36
+ { label: "No", value: false },
37
+ ],
38
+ initialValue: false,
39
+ })
40
+ if (!install) {
41
+ prompts.outro("Done")
42
+ return
43
+ }
44
+ }
45
+ prompts.log.info("Using method: " + method)
46
+ const target = args.target ? args.target.replace(/^v/, "") : await Installation.latest()
47
+
48
+ if (InstallationVersion === target) {
49
+ prompts.log.warn(`rimuru-ai upgrade skipped: ${target} is already installed`)
50
+ prompts.outro("Done")
51
+ return
52
+ }
53
+
54
+ prompts.log.info(`From ${InstallationVersion} → ${target}`)
55
+ const spinner = prompts.spinner()
56
+ spinner.start("Upgrading...")
57
+ const err = await Installation.upgrade(method, target).catch((err) => err)
58
+ if (err) {
59
+ spinner.stop("Upgrade failed", 1)
60
+ if (err instanceof Installation.UpgradeFailedError) {
61
+ // necessary because choco only allows install/upgrade in elevated terminals
62
+ if (method === "choco" && err.stderr.includes("not running from an elevated command shell")) {
63
+ prompts.log.error("Please run the terminal as Administrator and try again")
64
+ } else {
65
+ prompts.log.error(err.stderr)
66
+ }
67
+ } else if (err instanceof Error) prompts.log.error(err.message)
68
+ prompts.outro("Done")
69
+ return
70
+ }
71
+ spinner.stop("Upgrade complete")
72
+ prompts.outro("Done")
73
+ },
74
+ }