rird 2.1.231 → 2.3.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 (381) hide show
  1. package/AGENTS.md +86 -0
  2. package/COMPLETED_TEST_SUITE.txt +280 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +397 -6
  5. package/RIRD_ERROR_HANDLING_SUMMARY.md +307 -0
  6. package/TESTING.md +512 -0
  7. package/TEST_IMPLEMENTATION_REPORT.md +463 -0
  8. package/TEST_SUITE.md +307 -0
  9. package/TEST_SUMMARY.txt +380 -0
  10. package/bin/rird-perf.js +37 -0
  11. package/bin/rird.js +43 -8
  12. package/bunfig.toml +4 -0
  13. package/create-wrapper.ps1 +51 -0
  14. package/docs/ARCHITECTURE.md +768 -0
  15. package/docs/CLI_REFERENCE.md +681 -0
  16. package/docs/DOCUMENTATION_MANIFEST.md +392 -0
  17. package/docs/INDEX.md +295 -0
  18. package/docs/PRODUCTION_SETUP.md +633 -0
  19. package/docs/TROUBLESHOOTING.md +914 -0
  20. package/facebook_ads_library.png +0 -0
  21. package/nul +0 -0
  22. package/nul`nif +0 -0
  23. package/package.json +104 -15
  24. package/parsers-config.ts +239 -0
  25. package/rird-1.0.199.tgz +0 -0
  26. package/rird-1.0.205.tgz +0 -0
  27. package/script/build-windows.ts +56 -0
  28. package/script/build.ts +165 -0
  29. package/{postinstall.mjs → script/postinstall.mjs} +47 -68
  30. package/script/publish-registries.ts +187 -0
  31. package/script/publish.ts +85 -0
  32. package/script/schema.ts +47 -0
  33. package/src/acp/README.md +164 -0
  34. package/src/acp/agent.ts +1063 -0
  35. package/src/acp/session.ts +101 -0
  36. package/src/acp/types.ts +22 -0
  37. package/src/agent/agent.ts +367 -0
  38. package/src/agent/generate.txt +75 -0
  39. package/src/agent/prompt/compaction.txt +12 -0
  40. package/src/agent/prompt/explore.txt +18 -0
  41. package/src/agent/prompt/summary.txt +10 -0
  42. package/src/agent/prompt/title.txt +36 -0
  43. package/src/auth/index.ts +70 -0
  44. package/src/bun/index.ts +114 -0
  45. package/src/bus/bus-event.ts +43 -0
  46. package/src/bus/global.ts +10 -0
  47. package/src/bus/index.ts +105 -0
  48. package/src/cli/bootstrap.ts +17 -0
  49. package/src/cli/cmd/acp.ts +104 -0
  50. package/src/cli/cmd/activate.ts +50 -0
  51. package/src/cli/cmd/agent.ts +256 -0
  52. package/src/cli/cmd/auth.ts +412 -0
  53. package/src/cli/cmd/cmd.ts +7 -0
  54. package/src/cli/cmd/debug/config.ts +15 -0
  55. package/src/cli/cmd/debug/file.ts +91 -0
  56. package/src/cli/cmd/debug/index.ts +43 -0
  57. package/src/cli/cmd/debug/lsp.ts +48 -0
  58. package/src/cli/cmd/debug/ripgrep.ts +83 -0
  59. package/src/cli/cmd/debug/scrap.ts +15 -0
  60. package/src/cli/cmd/debug/skill.ts +15 -0
  61. package/src/cli/cmd/debug/snapshot.ts +48 -0
  62. package/src/cli/cmd/export.ts +88 -0
  63. package/src/cli/cmd/generate.ts +38 -0
  64. package/src/cli/cmd/github.ts +1400 -0
  65. package/src/cli/cmd/import.ts +98 -0
  66. package/src/cli/cmd/mcp.ts +654 -0
  67. package/src/cli/cmd/models.ts +68 -0
  68. package/src/cli/cmd/pr.ts +112 -0
  69. package/src/cli/cmd/run.ts +434 -0
  70. package/src/cli/cmd/serve.ts +31 -0
  71. package/src/cli/cmd/session.ts +106 -0
  72. package/src/cli/cmd/stats.ts +298 -0
  73. package/src/cli/cmd/tui/app.tsx +694 -0
  74. package/src/cli/cmd/tui/attach.ts +30 -0
  75. package/src/cli/cmd/tui/component/border.tsx +21 -0
  76. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  77. package/src/cli/cmd/tui/component/dialog-command.tsx +124 -0
  78. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  79. package/src/cli/cmd/tui/component/dialog-model.tsx +236 -0
  80. package/src/cli/cmd/tui/component/dialog-provider.tsx +240 -0
  81. package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
  82. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  83. package/src/cli/cmd/tui/component/dialog-stash.tsx +86 -0
  84. package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
  85. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  86. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  87. package/src/cli/cmd/tui/component/did-you-know.tsx +85 -0
  88. package/src/cli/cmd/tui/component/logo.tsx +48 -0
  89. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +574 -0
  90. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  91. package/src/cli/cmd/tui/component/prompt/index.tsx +1087 -0
  92. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  93. package/src/cli/cmd/tui/component/tips.ts +27 -0
  94. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  95. package/src/cli/cmd/tui/context/args.tsx +14 -0
  96. package/src/cli/cmd/tui/context/directory.ts +13 -0
  97. package/src/cli/cmd/tui/context/exit.tsx +23 -0
  98. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  99. package/src/cli/cmd/tui/context/keybind.tsx +101 -0
  100. package/src/cli/cmd/tui/context/kv.tsx +49 -0
  101. package/src/cli/cmd/tui/context/local.tsx +345 -0
  102. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  103. package/src/cli/cmd/tui/context/route.tsx +46 -0
  104. package/src/cli/cmd/tui/context/sdk.tsx +74 -0
  105. package/src/cli/cmd/tui/context/sync.tsx +372 -0
  106. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  107. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  108. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  109. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  110. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  111. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  112. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  113. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  114. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  115. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  116. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  117. package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
  118. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  119. package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
  120. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  121. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  122. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  123. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  124. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  125. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  126. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  127. package/src/cli/cmd/tui/context/theme/orng.json +245 -0
  128. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  129. package/src/cli/cmd/tui/context/theme/rird.json +245 -0
  130. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  131. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  132. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  133. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  134. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  135. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  136. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  137. package/src/cli/cmd/tui/context/theme.tsx +1109 -0
  138. package/src/cli/cmd/tui/event.ts +40 -0
  139. package/src/cli/cmd/tui/hooks/use-safe-terminal-dimensions.ts +12 -0
  140. package/src/cli/cmd/tui/routes/home.tsx +138 -0
  141. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
  142. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
  143. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  144. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  145. package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
  146. package/src/cli/cmd/tui/routes/session/header.tsx +125 -0
  147. package/src/cli/cmd/tui/routes/session/index.tsx +1876 -0
  148. package/src/cli/cmd/tui/routes/session/sidebar.tsx +320 -0
  149. package/src/cli/cmd/tui/spawn.ts +60 -0
  150. package/src/cli/cmd/tui/thread.ts +142 -0
  151. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  152. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  153. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  154. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
  155. package/src/cli/cmd/tui/ui/dialog-select.tsx +333 -0
  156. package/src/cli/cmd/tui/ui/dialog.tsx +171 -0
  157. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  158. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  159. package/src/cli/cmd/tui/util/clipboard.ts +127 -0
  160. package/src/cli/cmd/tui/util/editor.ts +32 -0
  161. package/src/cli/cmd/tui/util/terminal.ts +146 -0
  162. package/src/cli/cmd/tui/worker.ts +63 -0
  163. package/src/cli/cmd/uninstall.ts +344 -0
  164. package/src/cli/cmd/upgrade.ts +127 -0
  165. package/src/cli/cmd/web.ts +84 -0
  166. package/src/cli/error.ts +69 -0
  167. package/src/cli/ui.ts +101 -0
  168. package/src/cli/upgrade.ts +28 -0
  169. package/src/command/index.ts +80 -0
  170. package/src/command/template/initialize.txt +10 -0
  171. package/src/command/template/review.txt +97 -0
  172. package/src/config/config.ts +994 -0
  173. package/src/config/markdown.ts +41 -0
  174. package/src/env/index.ts +26 -0
  175. package/src/file/ignore.ts +83 -0
  176. package/src/file/index.ts +328 -0
  177. package/src/file/ripgrep.ts +393 -0
  178. package/src/file/time.ts +64 -0
  179. package/src/file/watcher.ts +103 -0
  180. package/src/flag/flag.ts +84 -0
  181. package/src/format/formatter.ts +315 -0
  182. package/src/format/index.ts +137 -0
  183. package/src/global/index.ts +101 -0
  184. package/src/id/id.ts +73 -0
  185. package/src/ide/index.ts +76 -0
  186. package/src/index.ts +297 -0
  187. package/src/index.ts.backup +271 -0
  188. package/src/installation/index.ts +258 -0
  189. package/src/lib/IMPLEMENTATION_NOTES.md +345 -0
  190. package/src/lib/error-handler.ts +225 -0
  191. package/src/lib/error-testing-guide.md +258 -0
  192. package/src/lib/errors.ts +285 -0
  193. package/src/lib/performance.ts +70 -0
  194. package/src/lib/telemetry.ts +282 -0
  195. package/src/lsp/client.ts +229 -0
  196. package/src/lsp/index.ts +485 -0
  197. package/src/lsp/language.ts +116 -0
  198. package/src/lsp/server.ts +1895 -0
  199. package/src/mcp/auth.ts +135 -0
  200. package/src/mcp/index.ts +1117 -0
  201. package/src/mcp/intent-analyzer.ts +376 -0
  202. package/src/mcp/oauth-callback.ts +200 -0
  203. package/src/mcp/oauth-provider.ts +154 -0
  204. package/src/patch/index.ts +632 -0
  205. package/src/permission/index.ts +199 -0
  206. package/src/plugin/index.ts +91 -0
  207. package/src/project/bootstrap.ts +33 -0
  208. package/src/project/instance.ts +78 -0
  209. package/src/project/project.ts +236 -0
  210. package/src/project/state.ts +65 -0
  211. package/src/project/vcs.ts +76 -0
  212. package/src/provider/auth.ts +143 -0
  213. package/src/provider/models-macro.ts +55 -0
  214. package/src/provider/models.ts +161 -0
  215. package/src/provider/provider.ts +1109 -0
  216. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  217. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  218. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
  219. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  220. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  221. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  222. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  223. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  224. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
  225. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  226. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  227. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  228. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  229. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  230. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  231. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  232. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  233. package/src/provider/transform.ts +455 -0
  234. package/src/pty/index.ts +231 -0
  235. package/src/security/guardrails.test.ts +341 -0
  236. package/src/security/guardrails.ts +570 -0
  237. package/src/security/index.ts +19 -0
  238. package/src/server/error.ts +36 -0
  239. package/src/server/project.ts +79 -0
  240. package/src/server/server.ts +2641 -0
  241. package/src/server/tui.ts +71 -0
  242. package/src/session/compaction.ts +228 -0
  243. package/src/session/index.ts +464 -0
  244. package/src/session/llm.ts +201 -0
  245. package/src/session/message-v2.ts +695 -0
  246. package/src/session/message.ts +189 -0
  247. package/src/session/processor.ts +409 -0
  248. package/src/session/prompt/act-switch.txt +5 -0
  249. package/src/session/prompt/anthropic-20250930.txt +166 -0
  250. package/src/session/prompt/anthropic.txt +63 -0
  251. package/src/session/prompt/anthropic_spoof.txt +1 -0
  252. package/src/session/prompt/beast.txt +76 -0
  253. package/src/session/prompt/codex.txt +304 -0
  254. package/src/session/prompt/copilot-gpt-5.txt +137 -0
  255. package/src/session/prompt/gemini.txt +62 -0
  256. package/src/session/prompt/max-steps.txt +16 -0
  257. package/src/session/prompt/plan-reminder-anthropic.txt +35 -0
  258. package/src/session/prompt/plan.txt +24 -0
  259. package/src/session/prompt/polaris.txt +88 -0
  260. package/src/session/prompt/qwen.txt +59 -0
  261. package/src/session/prompt.ts +1552 -0
  262. package/src/session/retry.ts +86 -0
  263. package/src/session/revert.ts +108 -0
  264. package/src/session/sensitive-filter.test.ts +327 -0
  265. package/src/session/sensitive-filter.ts +466 -0
  266. package/src/session/status.ts +76 -0
  267. package/src/session/summary.ts +209 -0
  268. package/src/session/system.ts +122 -0
  269. package/src/session/todo.ts +37 -0
  270. package/src/share/share-next.ts +222 -0
  271. package/src/share/share.ts +87 -0
  272. package/src/shell/shell.ts +67 -0
  273. package/src/skill/index.ts +1 -0
  274. package/src/skill/skill.ts +83 -0
  275. package/src/snapshot/index.ts +197 -0
  276. package/src/storage/storage.ts +226 -0
  277. package/src/tests/agent.test.ts +308 -0
  278. package/src/tests/build-guards.test.ts +267 -0
  279. package/src/tests/config.test.ts +664 -0
  280. package/src/tests/tool-registry.test.ts +589 -0
  281. package/src/tool/bash.ts +314 -0
  282. package/src/tool/bash.txt +158 -0
  283. package/src/tool/batch.ts +175 -0
  284. package/src/tool/batch.txt +24 -0
  285. package/src/tool/codesearch.ts +184 -0
  286. package/src/tool/codesearch.txt +12 -0
  287. package/src/tool/edit.ts +675 -0
  288. package/src/tool/edit.txt +10 -0
  289. package/src/tool/glob.ts +65 -0
  290. package/src/tool/glob.txt +6 -0
  291. package/src/tool/grep.ts +121 -0
  292. package/src/tool/grep.txt +8 -0
  293. package/src/tool/invalid.ts +17 -0
  294. package/src/tool/ls.ts +110 -0
  295. package/src/tool/ls.txt +1 -0
  296. package/src/tool/lsp-diagnostics.ts +26 -0
  297. package/src/tool/lsp-diagnostics.txt +1 -0
  298. package/src/tool/lsp-hover.ts +31 -0
  299. package/src/tool/lsp-hover.txt +1 -0
  300. package/src/tool/lsp.ts +87 -0
  301. package/src/tool/lsp.txt +19 -0
  302. package/src/tool/multiedit.ts +46 -0
  303. package/src/tool/multiedit.txt +41 -0
  304. package/src/tool/patch.ts +233 -0
  305. package/src/tool/patch.txt +1 -0
  306. package/src/tool/read.ts +219 -0
  307. package/src/tool/read.txt +12 -0
  308. package/src/tool/registry.ts +162 -0
  309. package/src/tool/skill.ts +100 -0
  310. package/src/tool/task.ts +136 -0
  311. package/src/tool/task.txt +51 -0
  312. package/src/tool/todo.ts +39 -0
  313. package/src/tool/todoread.txt +14 -0
  314. package/src/tool/todowrite.txt +167 -0
  315. package/src/tool/tool.ts +71 -0
  316. package/src/tool/webfetch.ts +198 -0
  317. package/src/tool/webfetch.txt +13 -0
  318. package/src/tool/websearch.ts +268 -0
  319. package/src/tool/websearch.txt +13 -0
  320. package/src/tool/write.ts +110 -0
  321. package/src/tool/write.txt +8 -0
  322. package/src/util/archive.ts +16 -0
  323. package/src/util/color.ts +19 -0
  324. package/src/util/context.ts +25 -0
  325. package/src/util/defer.ts +12 -0
  326. package/src/util/eventloop.ts +20 -0
  327. package/src/util/filesystem.ts +83 -0
  328. package/src/util/fn.ts +11 -0
  329. package/src/util/iife.ts +3 -0
  330. package/src/util/keybind.ts +102 -0
  331. package/src/util/lazy.ts +11 -0
  332. package/src/util/license.ts +362 -0
  333. package/src/util/locale.ts +81 -0
  334. package/src/util/lock.ts +98 -0
  335. package/src/util/log.ts +180 -0
  336. package/src/util/queue.ts +32 -0
  337. package/src/util/rpc.ts +42 -0
  338. package/src/util/scrap.ts +10 -0
  339. package/src/util/signal.ts +12 -0
  340. package/src/util/timeout.ts +14 -0
  341. package/src/util/token.ts +7 -0
  342. package/src/util/wildcard.ts +54 -0
  343. package/sst-env.d.ts +9 -0
  344. package/test/agent/agent.test.ts +146 -0
  345. package/test/bun.test.ts +53 -0
  346. package/test/cli/cmd/acp.test.ts +144 -0
  347. package/test/cli/cmd/run.test.ts +250 -0
  348. package/test/cli/github-remote.test.ts +80 -0
  349. package/test/config/agent-color.test.ts +66 -0
  350. package/test/config/config.test.ts +536 -0
  351. package/test/config/markdown.test.ts +89 -0
  352. package/test/file/ignore.test.ts +10 -0
  353. package/test/fixture/fixture.ts +37 -0
  354. package/test/fixture/lsp/fake-lsp-server.js +77 -0
  355. package/test/helpers.ts +172 -0
  356. package/test/ide/ide.test.ts +82 -0
  357. package/test/installation/installation.test.ts +143 -0
  358. package/test/keybind.test.ts +421 -0
  359. package/test/lsp/client.test.ts +95 -0
  360. package/test/mcp/headers.test.ts +153 -0
  361. package/test/patch/patch.test.ts +348 -0
  362. package/test/preload.ts +57 -0
  363. package/test/project/project.test.ts +74 -0
  364. package/test/provider/provider.test.ts +74 -0
  365. package/test/provider/transform.test.ts +411 -0
  366. package/test/session/retry.test.ts +111 -0
  367. package/test/session/session.test.ts +71 -0
  368. package/test/skill/skill.test.ts +131 -0
  369. package/test/snapshot/snapshot.test.ts +940 -0
  370. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  371. package/test/tool/bash.test.ts +434 -0
  372. package/test/tool/grep.test.ts +108 -0
  373. package/test/tool/patch.test.ts +259 -0
  374. package/test/tool/read.test.ts +42 -0
  375. package/test/util/iife.test.ts +36 -0
  376. package/test/util/lazy.test.ts +50 -0
  377. package/test/util/license.test.ts +235 -0
  378. package/test/util/timeout.test.ts +21 -0
  379. package/test/util/wildcard.test.ts +55 -0
  380. package/tsconfig.json +16 -0
  381. package/update-versions.ps1 +65 -0
package/TESTING.md ADDED
@@ -0,0 +1,512 @@
1
+ # RIRD CLI Testing Guide
2
+
3
+ Complete guide for running, writing, and maintaining tests for the RIRD CLI.
4
+
5
+ ## Quick Start
6
+
7
+ ### Run All Tests
8
+ ```bash
9
+ npm test
10
+ # or
11
+ bun test
12
+ ```
13
+
14
+ ### Run Tests in Watch Mode
15
+ ```bash
16
+ npm run test:watch
17
+ ```
18
+
19
+ ### Run Specific Test File
20
+ ```bash
21
+ bun test test/util/license.test.ts
22
+ ```
23
+
24
+ ## Test Organization
25
+
26
+ ```
27
+ test/
28
+ ├── agent/ # Agent functionality
29
+ ├── cli/
30
+ │ └── cmd/ # Command tests
31
+ │ ├── acp.test.ts # ACP server tests
32
+ │ └── run.test.ts # Run command tests
33
+ ├── config/ # Configuration tests
34
+ ├── installation/
35
+ │ └── installation.test.ts # Installation & upgrade
36
+ ├── provider/ # Provider discovery tests
37
+ ├── util/
38
+ │ └── license.test.ts # License validation
39
+ ├── helpers.ts # Shared test utilities
40
+ └── fixture/
41
+ └── fixture.ts # Test fixtures
42
+ ```
43
+
44
+ ## Writing Tests
45
+
46
+ ### Basic Test Structure
47
+
48
+ ```typescript
49
+ import { test, expect, describe } from "bun:test"
50
+
51
+ describe("Feature Name", () => {
52
+ test("should do something", () => {
53
+ expect(2 + 2).toBe(4)
54
+ })
55
+
56
+ test("should handle error cases", () => {
57
+ expect(() => {
58
+ throw new Error("oops")
59
+ }).toThrow()
60
+ })
61
+ })
62
+ ```
63
+
64
+ ### Async Tests
65
+
66
+ ```typescript
67
+ test("should load async data", async () => {
68
+ const result = await someAsyncFunction()
69
+ expect(result).toBeDefined()
70
+ })
71
+ ```
72
+
73
+ ### Using Mock Helpers
74
+
75
+ ```typescript
76
+ import { createMockLicense, mockEnv, mockHttpServer } from "../helpers"
77
+
78
+ test("should validate license", async () => {
79
+ const mockLicense = createMockLicense("test-key", "user@example.com", "pro")
80
+
81
+ const restoreEnv = mockEnv({ RIRD_LICENSE_KEY: mockLicense.key })
82
+
83
+ try {
84
+ // Your test code
85
+ } finally {
86
+ restoreEnv()
87
+ }
88
+ })
89
+ ```
90
+
91
+ ### Using Temporary Files
92
+
93
+ ```typescript
94
+ import { createTmpFile, cleanupTmpFile } from "../helpers"
95
+
96
+ test("should write and read files", async () => {
97
+ const filePath = await createTmpFile("test content", "myfile")
98
+
99
+ try {
100
+ const content = await Bun.file(filePath).text()
101
+ expect(content).toBe("test content")
102
+ } finally {
103
+ await cleanupTmpFile(filePath)
104
+ }
105
+ })
106
+ ```
107
+
108
+ ### Using Test Fixtures
109
+
110
+ ```typescript
111
+ import { tmpdir } from "../fixture/fixture"
112
+ import { Instance } from "../../src/project/instance"
113
+
114
+ test("should work with project instance", async () => {
115
+ await using tmp = await tmpdir({
116
+ init: async (dir) => {
117
+ // Setup files in temp directory
118
+ await Bun.write(`${dir}/config.json`, JSON.stringify({}))
119
+ }
120
+ })
121
+
122
+ await Instance.provide({
123
+ directory: tmp.path,
124
+ fn: async () => {
125
+ // Run code in temporary project context
126
+ }
127
+ })
128
+ })
129
+ ```
130
+
131
+ ## Available Test Helpers
132
+
133
+ ### Mock Factories
134
+
135
+ #### `createMockProvider(name?, apiKey?, enabled?)`
136
+ Creates a mock LLM provider object.
137
+
138
+ ```typescript
139
+ const provider = createMockProvider("anthropic", "sk-test-key", true)
140
+ ```
141
+
142
+ #### `createMockLicense(key?, email?, plan?)`
143
+ Creates a mock license object.
144
+
145
+ ```typescript
146
+ const license = createMockLicense("lic-123", "admin@example.com", "enterprise")
147
+ ```
148
+
149
+ ### HTTP Server Mocking
150
+
151
+ #### `mockHttpServer(responses?)`
152
+ Creates a test HTTP server.
153
+
154
+ ```typescript
155
+ const { server, port, close } = await mockHttpServer({
156
+ "/api/validate": { valid: true },
157
+ "/api/status": (req) => new Response(JSON.stringify({ status: "ok" }))
158
+ })
159
+
160
+ try {
161
+ const result = await fetch(`http://127.0.0.1:${port}/api/validate`)
162
+ } finally {
163
+ close()
164
+ }
165
+ ```
166
+
167
+ ### Environment Variables
168
+
169
+ #### `mockEnv(vars)`
170
+ Temporarily sets environment variables.
171
+
172
+ ```typescript
173
+ const restore = mockEnv({
174
+ RIRD_LICENSE_KEY: "test-key",
175
+ DEBUG: "true"
176
+ })
177
+
178
+ // Environment is mocked
179
+ expect(process.env.RIRD_LICENSE_KEY).toBe("test-key")
180
+
181
+ restore() // Environment is restored
182
+ ```
183
+
184
+ ### File System Utilities
185
+
186
+ #### `createTmpFile(content, name?)`
187
+ Creates a temporary file.
188
+
189
+ ```typescript
190
+ const path = await createTmpFile("file content", "testfile")
191
+ ```
192
+
193
+ #### `cleanupTmpFile(filePath)`
194
+ Removes a temporary file.
195
+
196
+ ```typescript
197
+ await cleanupTmpFile(path)
198
+ ```
199
+
200
+ ### Test Configuration
201
+
202
+ #### `createTestConfig()`
203
+ Creates temporary test configuration.
204
+
205
+ ```typescript
206
+ const { configDir, configFile } = await createTestConfig()
207
+ ```
208
+
209
+ #### `waitFor(fn, timeout?, interval?)`
210
+ Waits for async condition with timeout.
211
+
212
+ ```typescript
213
+ await waitFor(() => fileExists(path), 5000, 100)
214
+ ```
215
+
216
+ ## Test Coverage Requirements
217
+
218
+ ### Critical Modules (Must Have Tests)
219
+
220
+ 1. **License Validation** (util/license.ts)
221
+ - License key loading
222
+ - License validation
223
+ - Cache management
224
+ - Error handling
225
+
226
+ 2. **CLI Commands** (cli/cmd/*.ts)
227
+ - Command definition
228
+ - Argument parsing
229
+ - Option handling
230
+ - Handler functions
231
+
232
+ 3. **Installation** (installation/index.ts)
233
+ - Version detection
234
+ - Installation method detection
235
+ - Upgrade functionality
236
+ - Error handling
237
+
238
+ 4. **Provider System** (provider/provider.ts)
239
+ - Provider discovery
240
+ - Configuration loading
241
+ - Multi-provider support
242
+ - Environment variable handling
243
+
244
+ ### Test Categories
245
+
246
+ #### Unit Tests
247
+ - Pure function testing
248
+ - Input/output verification
249
+ - Error cases
250
+
251
+ #### Integration Tests
252
+ - Component interaction
253
+ - Configuration loading
254
+ - File system operations
255
+
256
+ #### Async Tests
257
+ - Promise handling
258
+ - Error propagation
259
+ - Timeout behavior
260
+
261
+ ## Best Practices
262
+
263
+ ### Test Naming
264
+ Use clear, descriptive names that explain what is being tested:
265
+
266
+ ```typescript
267
+ // Good
268
+ test("should fail when license key is missing", async () => {})
269
+ test("should save license key to file with correct permissions", async () => {})
270
+
271
+ // Bad
272
+ test("license test", async () => {})
273
+ test("fails", async () => {})
274
+ ```
275
+
276
+ ### Assertions
277
+ Be specific with assertions:
278
+
279
+ ```typescript
280
+ // Good
281
+ expect(result.valid).toBe(false)
282
+ expect(result.message).toContain("No license key found")
283
+
284
+ // Bad
285
+ expect(result).toBeDefined()
286
+ ```
287
+
288
+ ### Cleanup
289
+ Always clean up resources:
290
+
291
+ ```typescript
292
+ test("should manage resources", async () => {
293
+ const file = await createTmpFile("content", "test")
294
+
295
+ try {
296
+ // Test code
297
+ } finally {
298
+ await cleanupTmpFile(file) // Always cleanup
299
+ }
300
+ })
301
+ ```
302
+
303
+ ### Test Isolation
304
+ Keep tests independent:
305
+
306
+ ```typescript
307
+ describe("Feature", () => {
308
+ let cleanup: () => void
309
+
310
+ beforeEach(() => {
311
+ cleanup = mockEnv({ TEST_VAR: "value" })
312
+ })
313
+
314
+ afterEach(() => {
315
+ cleanup() // Restore state
316
+ })
317
+
318
+ test("uses TEST_VAR", () => {
319
+ expect(process.env.TEST_VAR).toBe("value")
320
+ })
321
+ })
322
+ ```
323
+
324
+ ### Error Testing
325
+ Test both success and failure paths:
326
+
327
+ ```typescript
328
+ test("should validate license", async () => {
329
+ // Success case
330
+ const validResult = await validateLicense("valid-key")
331
+ expect(validResult.valid).toBe(true)
332
+
333
+ // Failure case
334
+ const invalidResult = await validateLicense("invalid-key")
335
+ expect(invalidResult.valid).toBe(false)
336
+ })
337
+ ```
338
+
339
+ ## Running Tests in CI
340
+
341
+ ### GitHub Actions Example
342
+
343
+ ```yaml
344
+ name: Tests
345
+ on: [push, pull_request]
346
+
347
+ jobs:
348
+ test:
349
+ runs-on: ubuntu-latest
350
+ steps:
351
+ - uses: actions/checkout@v3
352
+ - uses: oven-sh/setup-bun@v1
353
+ - run: bun install
354
+ - run: bun test
355
+ ```
356
+
357
+ ### CI Best Practices
358
+
359
+ 1. Run tests on every push
360
+ 2. Fail CI if tests fail
361
+ 3. Cache dependencies
362
+ 4. Set timeouts for long-running tests
363
+ 5. Report test results
364
+
365
+ ## Debugging Tests
366
+
367
+ ### Verbose Output
368
+ ```bash
369
+ bun test --verbose
370
+ ```
371
+
372
+ ### Run Single Test
373
+ ```bash
374
+ bun test --grep "License validation"
375
+ ```
376
+
377
+ ### Watch Specific File
378
+ ```bash
379
+ bun test test/util/license.test.ts --watch
380
+ ```
381
+
382
+ ### Debug with Console
383
+ ```typescript
384
+ test("debug test", () => {
385
+ console.log("Debug output:", someValue)
386
+ expect(someValue).toBeDefined()
387
+ })
388
+ ```
389
+
390
+ ## Common Testing Patterns
391
+
392
+ ### Testing Async Functions
393
+
394
+ ```typescript
395
+ test("should handle async operations", async () => {
396
+ const result = await asyncFunction()
397
+ expect(result).toEqual(expectedValue)
398
+ })
399
+ ```
400
+
401
+ ### Testing Error Throwing
402
+
403
+ ```typescript
404
+ test("should throw on invalid input", () => {
405
+ expect(() => {
406
+ functionThatThrows("bad")
407
+ }).toThrow("expected error message")
408
+ })
409
+ ```
410
+
411
+ ### Testing with Timeouts
412
+
413
+ ```typescript
414
+ test("should timeout appropriately", async () => {
415
+ const promise = longRunningOperation()
416
+
417
+ await expect(
418
+ Promise.race([promise, timeout(1000)])
419
+ ).rejects.toThrow("Timeout")
420
+ })
421
+ ```
422
+
423
+ ### Testing with Mocked HTTP
424
+
425
+ ```typescript
426
+ test("should call API", async () => {
427
+ const { server, port, close } = await mockHttpServer({
428
+ "/api/data": { id: 1, name: "test" }
429
+ })
430
+
431
+ try {
432
+ const response = await fetch(`http://127.0.0.1:${port}/api/data`)
433
+ const data = await response.json()
434
+ expect(data.name).toBe("test")
435
+ } finally {
436
+ close()
437
+ }
438
+ })
439
+ ```
440
+
441
+ ## Troubleshooting
442
+
443
+ ### Tests Hanging
444
+ - Check for unresolved promises
445
+ - Verify async/await usage
446
+ - Set timeout: `bun test --timeout 30000`
447
+
448
+ ### Module Not Found
449
+ - Verify import paths
450
+ - Check file existence
451
+ - Ensure tsconfig includes test files
452
+
453
+ ### Permission Errors
454
+ - Check temp directory permissions
455
+ - Verify .rird directory is writable
456
+ - Run with appropriate privileges
457
+
458
+ ### Network Tests Failing
459
+ - Expected in offline environments
460
+ - Mock HTTP calls in tests
461
+ - Use mockHttpServer helper
462
+
463
+ ## Performance
464
+
465
+ ### Test Execution Time
466
+
467
+ Current test suite executes in:
468
+ - Unit tests: < 1 second
469
+ - Integration tests: 1-5 seconds
470
+ - Full suite: < 10 seconds
471
+
472
+ Optimize slow tests by:
473
+ - Mocking external calls
474
+ - Using tmpdir fixtures
475
+ - Avoiding unnecessary waits
476
+
477
+ ## Maintenance
478
+
479
+ ### When to Add Tests
480
+
481
+ 1. When fixing bugs - add regression test
482
+ 2. When adding features - add feature test
483
+ 3. When refactoring - maintain existing tests
484
+ 4. When improving error handling - add error test
485
+
486
+ ### When to Update Tests
487
+
488
+ 1. When changing function signatures
489
+ 2. When modifying error messages
490
+ 3. When updating file formats
491
+ 4. When changing environment variables
492
+
493
+ ### Deprecating Tests
494
+
495
+ 1. Mark test with skip or only
496
+ 2. Document why it's deprecated
497
+ 3. Create replacement test
498
+ 4. Remove after replacement verified
499
+
500
+ ## Test Statistics
501
+
502
+ - **Total Test Files**: 32
503
+ - **Total Test Cases**: 100+
504
+ - **Critical Modules**: 5
505
+ - **Helper Utilities**: 10+
506
+ - **Code Coverage**: Core paths covered
507
+
508
+ ## Resources
509
+
510
+ - [Bun Test Documentation](https://bun.sh/docs/test/basics)
511
+ - [Testing Best Practices](https://github.com/goldbergyoni/javascript-testing-best-practices)
512
+ - [RIRD CLI Documentation](./CLAUDE.md)