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.
- package/AGENTS.md +86 -0
- package/COMPLETED_TEST_SUITE.txt +280 -0
- package/Dockerfile +18 -0
- package/README.md +397 -6
- package/RIRD_ERROR_HANDLING_SUMMARY.md +307 -0
- package/TESTING.md +512 -0
- package/TEST_IMPLEMENTATION_REPORT.md +463 -0
- package/TEST_SUITE.md +307 -0
- package/TEST_SUMMARY.txt +380 -0
- package/bin/rird-perf.js +37 -0
- package/bin/rird.js +43 -8
- package/bunfig.toml +4 -0
- package/create-wrapper.ps1 +51 -0
- package/docs/ARCHITECTURE.md +768 -0
- package/docs/CLI_REFERENCE.md +681 -0
- package/docs/DOCUMENTATION_MANIFEST.md +392 -0
- package/docs/INDEX.md +295 -0
- package/docs/PRODUCTION_SETUP.md +633 -0
- package/docs/TROUBLESHOOTING.md +914 -0
- package/facebook_ads_library.png +0 -0
- package/nul +0 -0
- package/nul`nif +0 -0
- package/package.json +104 -15
- package/parsers-config.ts +239 -0
- package/rird-1.0.199.tgz +0 -0
- package/rird-1.0.205.tgz +0 -0
- package/script/build-windows.ts +56 -0
- package/script/build.ts +165 -0
- package/{postinstall.mjs → script/postinstall.mjs} +47 -68
- package/script/publish-registries.ts +187 -0
- package/script/publish.ts +85 -0
- package/script/schema.ts +47 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1063 -0
- package/src/acp/session.ts +101 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +367 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +12 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +10 -0
- package/src/agent/prompt/title.txt +36 -0
- package/src/auth/index.ts +70 -0
- package/src/bun/index.ts +114 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/acp.ts +104 -0
- package/src/cli/cmd/activate.ts +50 -0
- package/src/cli/cmd/agent.ts +256 -0
- package/src/cli/cmd/auth.ts +412 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/debug/config.ts +15 -0
- package/src/cli/cmd/debug/file.ts +91 -0
- package/src/cli/cmd/debug/index.ts +43 -0
- package/src/cli/cmd/debug/lsp.ts +48 -0
- package/src/cli/cmd/debug/ripgrep.ts +83 -0
- package/src/cli/cmd/debug/scrap.ts +15 -0
- package/src/cli/cmd/debug/skill.ts +15 -0
- package/src/cli/cmd/debug/snapshot.ts +48 -0
- package/src/cli/cmd/export.ts +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +1400 -0
- package/src/cli/cmd/import.ts +98 -0
- package/src/cli/cmd/mcp.ts +654 -0
- package/src/cli/cmd/models.ts +68 -0
- package/src/cli/cmd/pr.ts +112 -0
- package/src/cli/cmd/run.ts +434 -0
- package/src/cli/cmd/serve.ts +31 -0
- package/src/cli/cmd/session.ts +106 -0
- package/src/cli/cmd/stats.ts +298 -0
- package/src/cli/cmd/tui/app.tsx +694 -0
- package/src/cli/cmd/tui/attach.ts +30 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +124 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +236 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +240 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/did-you-know.tsx +85 -0
- package/src/cli/cmd/tui/component/logo.tsx +48 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +574 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1087 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/tips.ts +27 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +23 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +101 -0
- package/src/cli/cmd/tui/context/kv.tsx +49 -0
- package/src/cli/cmd/tui/context/local.tsx +345 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +46 -0
- package/src/cli/cmd/tui/context/sdk.tsx +74 -0
- package/src/cli/cmd/tui/context/sync.tsx +372 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/orng.json +245 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rird.json +245 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1109 -0
- package/src/cli/cmd/tui/event.ts +40 -0
- package/src/cli/cmd/tui/hooks/use-safe-terminal-dimensions.ts +12 -0
- package/src/cli/cmd/tui/routes/home.tsx +138 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +125 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +1876 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +320 -0
- package/src/cli/cmd/tui/spawn.ts +60 -0
- package/src/cli/cmd/tui/thread.ts +142 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +333 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +171 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +100 -0
- package/src/cli/cmd/tui/util/clipboard.ts +127 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -0
- package/src/cli/cmd/tui/util/terminal.ts +146 -0
- package/src/cli/cmd/tui/worker.ts +63 -0
- package/src/cli/cmd/uninstall.ts +344 -0
- package/src/cli/cmd/upgrade.ts +127 -0
- package/src/cli/cmd/web.ts +84 -0
- package/src/cli/error.ts +69 -0
- package/src/cli/ui.ts +101 -0
- package/src/cli/upgrade.ts +28 -0
- package/src/command/index.ts +80 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +97 -0
- package/src/config/config.ts +994 -0
- package/src/config/markdown.ts +41 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +328 -0
- package/src/file/ripgrep.ts +393 -0
- package/src/file/time.ts +64 -0
- package/src/file/watcher.ts +103 -0
- package/src/flag/flag.ts +84 -0
- package/src/format/formatter.ts +315 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +101 -0
- package/src/id/id.ts +73 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +297 -0
- package/src/index.ts.backup +271 -0
- package/src/installation/index.ts +258 -0
- package/src/lib/IMPLEMENTATION_NOTES.md +345 -0
- package/src/lib/error-handler.ts +225 -0
- package/src/lib/error-testing-guide.md +258 -0
- package/src/lib/errors.ts +285 -0
- package/src/lib/performance.ts +70 -0
- package/src/lib/telemetry.ts +282 -0
- package/src/lsp/client.ts +229 -0
- package/src/lsp/index.ts +485 -0
- package/src/lsp/language.ts +116 -0
- package/src/lsp/server.ts +1895 -0
- package/src/mcp/auth.ts +135 -0
- package/src/mcp/index.ts +1117 -0
- package/src/mcp/intent-analyzer.ts +376 -0
- package/src/mcp/oauth-callback.ts +200 -0
- package/src/mcp/oauth-provider.ts +154 -0
- package/src/patch/index.ts +632 -0
- package/src/permission/index.ts +199 -0
- package/src/plugin/index.ts +91 -0
- package/src/project/bootstrap.ts +33 -0
- package/src/project/instance.ts +78 -0
- package/src/project/project.ts +236 -0
- package/src/project/state.ts +65 -0
- package/src/project/vcs.ts +76 -0
- package/src/provider/auth.ts +143 -0
- package/src/provider/models-macro.ts +55 -0
- package/src/provider/models.ts +161 -0
- package/src/provider/provider.ts +1109 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +455 -0
- package/src/pty/index.ts +231 -0
- package/src/security/guardrails.test.ts +341 -0
- package/src/security/guardrails.ts +570 -0
- package/src/security/index.ts +19 -0
- package/src/server/error.ts +36 -0
- package/src/server/project.ts +79 -0
- package/src/server/server.ts +2641 -0
- package/src/server/tui.ts +71 -0
- package/src/session/compaction.ts +228 -0
- package/src/session/index.ts +464 -0
- package/src/session/llm.ts +201 -0
- package/src/session/message-v2.ts +695 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +409 -0
- package/src/session/prompt/act-switch.txt +5 -0
- package/src/session/prompt/anthropic-20250930.txt +166 -0
- package/src/session/prompt/anthropic.txt +63 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +76 -0
- package/src/session/prompt/codex.txt +304 -0
- package/src/session/prompt/copilot-gpt-5.txt +137 -0
- package/src/session/prompt/gemini.txt +62 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +35 -0
- package/src/session/prompt/plan.txt +24 -0
- package/src/session/prompt/polaris.txt +88 -0
- package/src/session/prompt/qwen.txt +59 -0
- package/src/session/prompt.ts +1552 -0
- package/src/session/retry.ts +86 -0
- package/src/session/revert.ts +108 -0
- package/src/session/sensitive-filter.test.ts +327 -0
- package/src/session/sensitive-filter.ts +466 -0
- package/src/session/status.ts +76 -0
- package/src/session/summary.ts +209 -0
- package/src/session/system.ts +122 -0
- package/src/session/todo.ts +37 -0
- package/src/share/share-next.ts +222 -0
- package/src/share/share.ts +87 -0
- package/src/shell/shell.ts +67 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +83 -0
- package/src/snapshot/index.ts +197 -0
- package/src/storage/storage.ts +226 -0
- package/src/tests/agent.test.ts +308 -0
- package/src/tests/build-guards.test.ts +267 -0
- package/src/tests/config.test.ts +664 -0
- package/src/tests/tool-registry.test.ts +589 -0
- package/src/tool/bash.ts +314 -0
- package/src/tool/bash.txt +158 -0
- package/src/tool/batch.ts +175 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +184 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/edit.ts +675 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/glob.ts +65 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +121 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +110 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp-diagnostics.ts +26 -0
- package/src/tool/lsp-diagnostics.txt +1 -0
- package/src/tool/lsp-hover.ts +31 -0
- package/src/tool/lsp-hover.txt +1 -0
- package/src/tool/lsp.ts +87 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/patch.ts +233 -0
- package/src/tool/patch.txt +1 -0
- package/src/tool/read.ts +219 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +162 -0
- package/src/tool/skill.ts +100 -0
- package/src/tool/task.ts +136 -0
- package/src/tool/task.txt +51 -0
- package/src/tool/todo.ts +39 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +71 -0
- package/src/tool/webfetch.ts +198 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +268 -0
- package/src/tool/websearch.txt +13 -0
- package/src/tool/write.ts +110 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +83 -0
- package/src/util/fn.ts +11 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +102 -0
- package/src/util/lazy.ts +11 -0
- package/src/util/license.ts +362 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/queue.ts +32 -0
- package/src/util/rpc.ts +42 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/wildcard.ts +54 -0
- package/sst-env.d.ts +9 -0
- package/test/agent/agent.test.ts +146 -0
- package/test/bun.test.ts +53 -0
- package/test/cli/cmd/acp.test.ts +144 -0
- package/test/cli/cmd/run.test.ts +250 -0
- package/test/cli/github-remote.test.ts +80 -0
- package/test/config/agent-color.test.ts +66 -0
- package/test/config/config.test.ts +536 -0
- package/test/config/markdown.test.ts +89 -0
- package/test/file/ignore.test.ts +10 -0
- package/test/fixture/fixture.ts +37 -0
- package/test/fixture/lsp/fake-lsp-server.js +77 -0
- package/test/helpers.ts +172 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/installation/installation.test.ts +143 -0
- package/test/keybind.test.ts +421 -0
- package/test/lsp/client.test.ts +95 -0
- package/test/mcp/headers.test.ts +153 -0
- package/test/patch/patch.test.ts +348 -0
- package/test/preload.ts +57 -0
- package/test/project/project.test.ts +74 -0
- package/test/provider/provider.test.ts +74 -0
- package/test/provider/transform.test.ts +411 -0
- package/test/session/retry.test.ts +111 -0
- package/test/session/session.test.ts +71 -0
- package/test/skill/skill.test.ts +131 -0
- package/test/snapshot/snapshot.test.ts +940 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/bash.test.ts +434 -0
- package/test/tool/grep.test.ts +108 -0
- package/test/tool/patch.test.ts +259 -0
- package/test/tool/read.test.ts +42 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/license.test.ts +235 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/wildcard.test.ts +55 -0
- package/tsconfig.json +16 -0
- 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)
|