@hasna/terminal 2.3.0 → 2.3.2

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 (267) hide show
  1. package/dist/App.js +404 -0
  2. package/dist/Browse.js +79 -0
  3. package/dist/FuzzyPicker.js +47 -0
  4. package/dist/Onboarding.js +51 -0
  5. package/dist/Spinner.js +12 -0
  6. package/dist/StatusBar.js +49 -0
  7. package/dist/ai.js +322 -0
  8. package/dist/cache.js +41 -0
  9. package/dist/cli.js +64 -16
  10. package/dist/command-rewriter.js +64 -0
  11. package/dist/command-validator.js +86 -0
  12. package/dist/compression.js +107 -0
  13. package/dist/context-hints.js +275 -0
  14. package/dist/diff-cache.js +107 -0
  15. package/dist/discover.js +212 -0
  16. package/dist/economy.js +123 -0
  17. package/dist/expand-store.js +38 -0
  18. package/dist/file-cache.js +72 -0
  19. package/dist/file-index.js +62 -0
  20. package/dist/history.js +62 -0
  21. package/dist/lazy-executor.js +54 -0
  22. package/dist/line-dedup.js +59 -0
  23. package/dist/loop-detector.js +75 -0
  24. package/dist/mcp/install.js +98 -0
  25. package/dist/mcp/server.js +569 -0
  26. package/dist/noise-filter.js +86 -0
  27. package/dist/output-processor.js +129 -0
  28. package/dist/output-router.js +41 -0
  29. package/dist/output-store.js +111 -0
  30. package/dist/parsers/base.js +2 -0
  31. package/dist/parsers/build.js +64 -0
  32. package/dist/parsers/errors.js +101 -0
  33. package/dist/parsers/files.js +78 -0
  34. package/dist/parsers/git.js +99 -0
  35. package/dist/parsers/index.js +48 -0
  36. package/dist/parsers/tests.js +89 -0
  37. package/dist/providers/anthropic.js +39 -0
  38. package/dist/providers/base.js +4 -0
  39. package/dist/providers/cerebras.js +95 -0
  40. package/dist/providers/groq.js +95 -0
  41. package/dist/providers/index.js +73 -0
  42. package/dist/providers/xai.js +95 -0
  43. package/dist/recipes/model.js +20 -0
  44. package/dist/recipes/storage.js +136 -0
  45. package/dist/search/content-search.js +68 -0
  46. package/dist/search/file-search.js +61 -0
  47. package/dist/search/filters.js +34 -0
  48. package/dist/search/index.js +5 -0
  49. package/dist/search/semantic.js +320 -0
  50. package/dist/session-boot.js +59 -0
  51. package/dist/session-context.js +55 -0
  52. package/dist/sessions-db.js +173 -0
  53. package/dist/smart-display.js +286 -0
  54. package/dist/snapshots.js +51 -0
  55. package/dist/supervisor.js +112 -0
  56. package/dist/test-watchlist.js +131 -0
  57. package/dist/tool-profiles.js +122 -0
  58. package/dist/tree.js +94 -0
  59. package/dist/usage-cache.js +65 -0
  60. package/package.json +8 -1
  61. package/src/ai.ts +8 -0
  62. package/src/cli.tsx +57 -18
  63. package/src/output-processor.ts +6 -1
  64. package/src/output-store.ts +58 -12
  65. package/src/tool-profiles.ts +139 -0
  66. package/.claude/scheduled_tasks.lock +0 -1
  67. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -20
  68. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -14
  69. package/CONTRIBUTING.md +0 -80
  70. package/benchmarks/benchmark.mjs +0 -115
  71. package/imported_modules.txt +0 -0
  72. package/temp/rtk/.claude/agents/code-reviewer.md +0 -221
  73. package/temp/rtk/.claude/agents/debugger.md +0 -519
  74. package/temp/rtk/.claude/agents/rtk-testing-specialist.md +0 -461
  75. package/temp/rtk/.claude/agents/rust-rtk.md +0 -511
  76. package/temp/rtk/.claude/agents/technical-writer.md +0 -355
  77. package/temp/rtk/.claude/commands/diagnose.md +0 -352
  78. package/temp/rtk/.claude/commands/test-routing.md +0 -362
  79. package/temp/rtk/.claude/hooks/bash/pre-commit-format.sh +0 -16
  80. package/temp/rtk/.claude/hooks/rtk-rewrite.sh +0 -70
  81. package/temp/rtk/.claude/hooks/rtk-suggest.sh +0 -152
  82. package/temp/rtk/.claude/rules/cli-testing.md +0 -526
  83. package/temp/rtk/.claude/skills/issue-triage/SKILL.md +0 -348
  84. package/temp/rtk/.claude/skills/issue-triage/templates/issue-comment.md +0 -134
  85. package/temp/rtk/.claude/skills/performance.md +0 -435
  86. package/temp/rtk/.claude/skills/pr-triage/SKILL.md +0 -315
  87. package/temp/rtk/.claude/skills/pr-triage/templates/review-comment.md +0 -71
  88. package/temp/rtk/.claude/skills/repo-recap.md +0 -206
  89. package/temp/rtk/.claude/skills/rtk-tdd/SKILL.md +0 -78
  90. package/temp/rtk/.claude/skills/rtk-tdd/references/testing-patterns.md +0 -124
  91. package/temp/rtk/.claude/skills/security-guardian.md +0 -503
  92. package/temp/rtk/.claude/skills/ship.md +0 -404
  93. package/temp/rtk/.github/workflows/benchmark.yml +0 -34
  94. package/temp/rtk/.github/workflows/dco-check.yaml +0 -12
  95. package/temp/rtk/.github/workflows/release-please.yml +0 -51
  96. package/temp/rtk/.github/workflows/release.yml +0 -343
  97. package/temp/rtk/.github/workflows/security-check.yml +0 -135
  98. package/temp/rtk/.github/workflows/validate-docs.yml +0 -78
  99. package/temp/rtk/.release-please-manifest.json +0 -3
  100. package/temp/rtk/ARCHITECTURE.md +0 -1491
  101. package/temp/rtk/CHANGELOG.md +0 -640
  102. package/temp/rtk/CLAUDE.md +0 -605
  103. package/temp/rtk/CONTRIBUTING.md +0 -199
  104. package/temp/rtk/Cargo.lock +0 -1668
  105. package/temp/rtk/Cargo.toml +0 -64
  106. package/temp/rtk/Formula/rtk.rb +0 -43
  107. package/temp/rtk/INSTALL.md +0 -390
  108. package/temp/rtk/LICENSE +0 -21
  109. package/temp/rtk/README.md +0 -386
  110. package/temp/rtk/README_es.md +0 -159
  111. package/temp/rtk/README_fr.md +0 -197
  112. package/temp/rtk/README_ja.md +0 -159
  113. package/temp/rtk/README_ko.md +0 -159
  114. package/temp/rtk/README_zh.md +0 -167
  115. package/temp/rtk/ROADMAP.md +0 -15
  116. package/temp/rtk/SECURITY.md +0 -217
  117. package/temp/rtk/TEST_EXEC_TIME.md +0 -102
  118. package/temp/rtk/build.rs +0 -57
  119. package/temp/rtk/docs/AUDIT_GUIDE.md +0 -432
  120. package/temp/rtk/docs/FEATURES.md +0 -1410
  121. package/temp/rtk/docs/TROUBLESHOOTING.md +0 -309
  122. package/temp/rtk/docs/filter-workflow.md +0 -102
  123. package/temp/rtk/docs/images/gain-dashboard.jpg +0 -0
  124. package/temp/rtk/docs/tracking.md +0 -583
  125. package/temp/rtk/hooks/opencode-rtk.ts +0 -39
  126. package/temp/rtk/hooks/rtk-awareness.md +0 -29
  127. package/temp/rtk/hooks/rtk-rewrite.sh +0 -61
  128. package/temp/rtk/hooks/test-rtk-rewrite.sh +0 -442
  129. package/temp/rtk/install.sh +0 -124
  130. package/temp/rtk/release-please-config.json +0 -10
  131. package/temp/rtk/scripts/benchmark.sh +0 -592
  132. package/temp/rtk/scripts/check-installation.sh +0 -162
  133. package/temp/rtk/scripts/install-local.sh +0 -37
  134. package/temp/rtk/scripts/rtk-economics.sh +0 -137
  135. package/temp/rtk/scripts/test-all.sh +0 -561
  136. package/temp/rtk/scripts/test-aristote.sh +0 -227
  137. package/temp/rtk/scripts/test-tracking.sh +0 -79
  138. package/temp/rtk/scripts/update-readme-metrics.sh +0 -32
  139. package/temp/rtk/scripts/validate-docs.sh +0 -73
  140. package/temp/rtk/src/aws_cmd.rs +0 -880
  141. package/temp/rtk/src/binlog.rs +0 -1645
  142. package/temp/rtk/src/cargo_cmd.rs +0 -1727
  143. package/temp/rtk/src/cc_economics.rs +0 -1157
  144. package/temp/rtk/src/ccusage.rs +0 -340
  145. package/temp/rtk/src/config.rs +0 -187
  146. package/temp/rtk/src/container.rs +0 -855
  147. package/temp/rtk/src/curl_cmd.rs +0 -134
  148. package/temp/rtk/src/deps.rs +0 -268
  149. package/temp/rtk/src/diff_cmd.rs +0 -367
  150. package/temp/rtk/src/discover/mod.rs +0 -274
  151. package/temp/rtk/src/discover/provider.rs +0 -388
  152. package/temp/rtk/src/discover/registry.rs +0 -2022
  153. package/temp/rtk/src/discover/report.rs +0 -202
  154. package/temp/rtk/src/discover/rules.rs +0 -667
  155. package/temp/rtk/src/display_helpers.rs +0 -402
  156. package/temp/rtk/src/dotnet_cmd.rs +0 -1771
  157. package/temp/rtk/src/dotnet_format_report.rs +0 -133
  158. package/temp/rtk/src/dotnet_trx.rs +0 -593
  159. package/temp/rtk/src/env_cmd.rs +0 -204
  160. package/temp/rtk/src/filter.rs +0 -462
  161. package/temp/rtk/src/filters/README.md +0 -52
  162. package/temp/rtk/src/filters/ansible-playbook.toml +0 -34
  163. package/temp/rtk/src/filters/basedpyright.toml +0 -47
  164. package/temp/rtk/src/filters/biome.toml +0 -45
  165. package/temp/rtk/src/filters/brew-install.toml +0 -37
  166. package/temp/rtk/src/filters/composer-install.toml +0 -40
  167. package/temp/rtk/src/filters/df.toml +0 -16
  168. package/temp/rtk/src/filters/dotnet-build.toml +0 -64
  169. package/temp/rtk/src/filters/du.toml +0 -16
  170. package/temp/rtk/src/filters/fail2ban-client.toml +0 -15
  171. package/temp/rtk/src/filters/gcc.toml +0 -49
  172. package/temp/rtk/src/filters/gcloud.toml +0 -22
  173. package/temp/rtk/src/filters/hadolint.toml +0 -24
  174. package/temp/rtk/src/filters/helm.toml +0 -29
  175. package/temp/rtk/src/filters/iptables.toml +0 -27
  176. package/temp/rtk/src/filters/jj.toml +0 -28
  177. package/temp/rtk/src/filters/jq.toml +0 -24
  178. package/temp/rtk/src/filters/make.toml +0 -41
  179. package/temp/rtk/src/filters/markdownlint.toml +0 -24
  180. package/temp/rtk/src/filters/mix-compile.toml +0 -27
  181. package/temp/rtk/src/filters/mix-format.toml +0 -15
  182. package/temp/rtk/src/filters/mvn-build.toml +0 -44
  183. package/temp/rtk/src/filters/oxlint.toml +0 -43
  184. package/temp/rtk/src/filters/ping.toml +0 -63
  185. package/temp/rtk/src/filters/pio-run.toml +0 -40
  186. package/temp/rtk/src/filters/poetry-install.toml +0 -50
  187. package/temp/rtk/src/filters/pre-commit.toml +0 -35
  188. package/temp/rtk/src/filters/ps.toml +0 -16
  189. package/temp/rtk/src/filters/quarto-render.toml +0 -41
  190. package/temp/rtk/src/filters/rsync.toml +0 -48
  191. package/temp/rtk/src/filters/shellcheck.toml +0 -27
  192. package/temp/rtk/src/filters/shopify-theme.toml +0 -29
  193. package/temp/rtk/src/filters/skopeo.toml +0 -45
  194. package/temp/rtk/src/filters/sops.toml +0 -16
  195. package/temp/rtk/src/filters/ssh.toml +0 -44
  196. package/temp/rtk/src/filters/stat.toml +0 -34
  197. package/temp/rtk/src/filters/swift-build.toml +0 -41
  198. package/temp/rtk/src/filters/systemctl-status.toml +0 -33
  199. package/temp/rtk/src/filters/terraform-plan.toml +0 -35
  200. package/temp/rtk/src/filters/tofu-fmt.toml +0 -16
  201. package/temp/rtk/src/filters/tofu-init.toml +0 -38
  202. package/temp/rtk/src/filters/tofu-plan.toml +0 -35
  203. package/temp/rtk/src/filters/tofu-validate.toml +0 -17
  204. package/temp/rtk/src/filters/trunk-build.toml +0 -39
  205. package/temp/rtk/src/filters/ty.toml +0 -50
  206. package/temp/rtk/src/filters/uv-sync.toml +0 -37
  207. package/temp/rtk/src/filters/xcodebuild.toml +0 -99
  208. package/temp/rtk/src/filters/yamllint.toml +0 -25
  209. package/temp/rtk/src/find_cmd.rs +0 -598
  210. package/temp/rtk/src/format_cmd.rs +0 -386
  211. package/temp/rtk/src/gain.rs +0 -723
  212. package/temp/rtk/src/gh_cmd.rs +0 -1651
  213. package/temp/rtk/src/git.rs +0 -2012
  214. package/temp/rtk/src/go_cmd.rs +0 -592
  215. package/temp/rtk/src/golangci_cmd.rs +0 -254
  216. package/temp/rtk/src/grep_cmd.rs +0 -288
  217. package/temp/rtk/src/gt_cmd.rs +0 -810
  218. package/temp/rtk/src/hook_audit_cmd.rs +0 -283
  219. package/temp/rtk/src/hook_check.rs +0 -171
  220. package/temp/rtk/src/init.rs +0 -1859
  221. package/temp/rtk/src/integrity.rs +0 -537
  222. package/temp/rtk/src/json_cmd.rs +0 -231
  223. package/temp/rtk/src/learn/detector.rs +0 -628
  224. package/temp/rtk/src/learn/mod.rs +0 -119
  225. package/temp/rtk/src/learn/report.rs +0 -184
  226. package/temp/rtk/src/lint_cmd.rs +0 -694
  227. package/temp/rtk/src/local_llm.rs +0 -316
  228. package/temp/rtk/src/log_cmd.rs +0 -248
  229. package/temp/rtk/src/ls.rs +0 -324
  230. package/temp/rtk/src/main.rs +0 -2482
  231. package/temp/rtk/src/mypy_cmd.rs +0 -389
  232. package/temp/rtk/src/next_cmd.rs +0 -241
  233. package/temp/rtk/src/npm_cmd.rs +0 -236
  234. package/temp/rtk/src/parser/README.md +0 -267
  235. package/temp/rtk/src/parser/error.rs +0 -46
  236. package/temp/rtk/src/parser/formatter.rs +0 -336
  237. package/temp/rtk/src/parser/mod.rs +0 -311
  238. package/temp/rtk/src/parser/types.rs +0 -119
  239. package/temp/rtk/src/pip_cmd.rs +0 -302
  240. package/temp/rtk/src/playwright_cmd.rs +0 -479
  241. package/temp/rtk/src/pnpm_cmd.rs +0 -573
  242. package/temp/rtk/src/prettier_cmd.rs +0 -221
  243. package/temp/rtk/src/prisma_cmd.rs +0 -482
  244. package/temp/rtk/src/psql_cmd.rs +0 -382
  245. package/temp/rtk/src/pytest_cmd.rs +0 -384
  246. package/temp/rtk/src/read.rs +0 -217
  247. package/temp/rtk/src/rewrite_cmd.rs +0 -50
  248. package/temp/rtk/src/ruff_cmd.rs +0 -402
  249. package/temp/rtk/src/runner.rs +0 -271
  250. package/temp/rtk/src/summary.rs +0 -297
  251. package/temp/rtk/src/tee.rs +0 -405
  252. package/temp/rtk/src/telemetry.rs +0 -248
  253. package/temp/rtk/src/toml_filter.rs +0 -1655
  254. package/temp/rtk/src/tracking.rs +0 -1416
  255. package/temp/rtk/src/tree.rs +0 -209
  256. package/temp/rtk/src/tsc_cmd.rs +0 -259
  257. package/temp/rtk/src/utils.rs +0 -432
  258. package/temp/rtk/src/verify_cmd.rs +0 -47
  259. package/temp/rtk/src/vitest_cmd.rs +0 -385
  260. package/temp/rtk/src/wc_cmd.rs +0 -401
  261. package/temp/rtk/src/wget_cmd.rs +0 -260
  262. package/temp/rtk/tests/fixtures/dotnet/build_failed.txt +0 -11
  263. package/temp/rtk/tests/fixtures/dotnet/format_changes.json +0 -31
  264. package/temp/rtk/tests/fixtures/dotnet/format_empty.json +0 -1
  265. package/temp/rtk/tests/fixtures/dotnet/format_success.json +0 -12
  266. package/temp/rtk/tests/fixtures/dotnet/test_failed.txt +0 -18
  267. package/tsconfig.json +0 -15
@@ -1,461 +0,0 @@
1
- ---
2
- name: rtk-testing-specialist
3
- description: RTK testing expert - snapshot tests, token accuracy, cross-platform validation
4
- model: sonnet
5
- tools: Read, Write, Edit, Bash, Grep, Glob
6
- ---
7
-
8
- # RTK Testing Specialist
9
-
10
- You are a testing expert specializing in RTK's unique testing needs: command output validation, token counting accuracy, and cross-platform shell compatibility.
11
-
12
- ## Core Responsibilities
13
-
14
- - **Snapshot testing**: Use `insta` crate for output validation
15
- - **Token accuracy**: Verify 60-90% savings claims with real fixtures
16
- - **Cross-platform**: Test bash/zsh/PowerShell compatibility
17
- - **Regression prevention**: Detect performance degradation in CI
18
- - **Integration tests**: Real command execution (git, cargo, gh, pnpm, etc.)
19
-
20
- ## Testing Patterns
21
-
22
- ### Snapshot Testing with `insta`
23
-
24
- RTK uses the `insta` crate for snapshot-based output validation. This is the **primary testing strategy** for filters.
25
-
26
- ```rust
27
- use insta::assert_snapshot;
28
-
29
- #[test]
30
- fn test_git_log_output() {
31
- let input = include_str!("../tests/fixtures/git_log_raw.txt");
32
- let output = filter_git_log(input);
33
-
34
- // Snapshot test - will fail if output changes
35
- // First run: creates snapshot
36
- // Subsequent runs: compares against snapshot
37
- assert_snapshot!(output);
38
- }
39
- ```
40
-
41
- **Workflow**:
42
- 1. **Write test**: Add `assert_snapshot!(output);` in test
43
- 2. **Run tests**: `cargo test` (will create new snapshots)
44
- 3. **Review snapshots**: `cargo insta review` (interactive review)
45
- 4. **Accept changes**: `cargo insta accept` (if output is correct)
46
-
47
- **When to use**:
48
- - **All new filters**: Every filter should have at least one snapshot test
49
- - **Output format changes**: When modifying filter logic
50
- - **Regression detection**: Catch unintended output changes
51
-
52
- **Example workflow** (adding snapshot test):
53
-
54
- ```bash
55
- # 1. Create fixture
56
- echo "raw command output" > tests/fixtures/newcmd_raw.txt
57
-
58
- # 2. Write test
59
- cat > src/newcmd_cmd.rs <<'EOF'
60
- #[cfg(test)]
61
- mod tests {
62
- use super::*;
63
- use insta::assert_snapshot;
64
-
65
- #[test]
66
- fn test_newcmd_output_format() {
67
- let input = include_str!("../tests/fixtures/newcmd_raw.txt");
68
- let output = filter_newcmd(input);
69
- assert_snapshot!(output);
70
- }
71
- }
72
- EOF
73
-
74
- # 3. Run test (creates snapshot)
75
- cargo test test_newcmd_output_format
76
-
77
- # 4. Review snapshot
78
- cargo insta review
79
- # Press 'a' to accept, 'r' to reject
80
-
81
- # 5. Snapshot saved in snapshots/
82
- ls -la src/snapshots/
83
- ```
84
-
85
- ### Token Count Validation
86
-
87
- All filters **MUST** verify token savings claims (60-90%) in tests:
88
-
89
- ```rust
90
- #[cfg(test)]
91
- mod tests {
92
- use super::*;
93
-
94
- // Helper function (add to tests/common/mod.rs if not exists)
95
- fn count_tokens(text: &str) -> usize {
96
- // Simple whitespace tokenization (good enough for tests)
97
- text.split_whitespace().count()
98
- }
99
-
100
- #[test]
101
- fn test_token_savings_claim() {
102
- let fixtures = [
103
- ("git_log", 0.80), // 80% savings expected
104
- ("cargo_test", 0.90), // 90% savings expected
105
- ("gh_pr_view", 0.87), // 87% savings expected
106
- ];
107
-
108
- for (name, expected_savings) in fixtures {
109
- let input = include_str!(&format!("../tests/fixtures/{}_raw.txt", name));
110
- let output = apply_filter(name, input);
111
-
112
- let input_tokens = count_tokens(input);
113
- let output_tokens = count_tokens(&output);
114
-
115
- let savings = 100.0 - (output_tokens as f64 / input_tokens as f64 * 100.0);
116
-
117
- assert!(
118
- savings >= expected_savings,
119
- "{} filter: expected ≥{:.0}% savings, got {:.1}%",
120
- name, expected_savings * 100.0, savings * 100.0
121
- );
122
- }
123
- }
124
- }
125
- ```
126
-
127
- **Why critical**: RTK promises 60-90% token savings. Tests must verify these claims with real fixtures. If savings drop below 60%, it's a **release blocker**.
128
-
129
- **Creating fixtures**:
130
-
131
- ```bash
132
- # Capture real command output
133
- git log -20 > tests/fixtures/git_log_raw.txt
134
- cargo test > tests/fixtures/cargo_test_raw.txt 2>&1
135
- gh pr view 123 > tests/fixtures/gh_pr_view_raw.txt
136
-
137
- # Then test with:
138
- # let input = include_str!("../tests/fixtures/git_log_raw.txt");
139
- ```
140
-
141
- ### Cross-Platform Shell Escaping
142
-
143
- RTK must work on macOS (zsh), Linux (bash), Windows (PowerShell). Shell escaping differs:
144
-
145
- ```rust
146
- #[cfg(target_os = "windows")]
147
- const EXPECTED_SHELL: &str = "cmd.exe";
148
-
149
- #[cfg(target_os = "macos")]
150
- const EXPECTED_SHELL: &str = "zsh";
151
-
152
- #[cfg(target_os = "linux")]
153
- const EXPECTED_SHELL: &str = "bash";
154
-
155
- #[test]
156
- fn test_shell_escaping() {
157
- let cmd = r#"git log --format="%H %s""#;
158
- let escaped = escape_for_shell(cmd);
159
-
160
- #[cfg(target_os = "windows")]
161
- assert_eq!(escaped, r#"git log --format=\"%H %s\""#);
162
-
163
- #[cfg(not(target_os = "windows"))]
164
- assert_eq!(escaped, r#"git log --format="%H %s""#);
165
- }
166
-
167
- #[test]
168
- fn test_command_execution_cross_platform() {
169
- let result = execute_command("git", &["--version"]);
170
- assert!(result.is_ok());
171
-
172
- let output = result.unwrap();
173
- assert!(output.contains("git version"));
174
-
175
- // Verify exit code preserved
176
- assert_eq!(output.status, 0);
177
- }
178
- ```
179
-
180
- **Testing platforms**:
181
- - **macOS**: `cargo test` (local)
182
- - **Linux**: `docker run --rm -v $(pwd):/rtk -w /rtk rust:latest cargo test`
183
- - **Windows**: Trust CI/CD or test manually if available
184
-
185
- ### Integration Tests (Real Commands)
186
-
187
- Integration tests execute real commands via RTK to verify end-to-end behavior:
188
-
189
- ```rust
190
- #[test]
191
- #[ignore] // Run with: cargo test --ignored
192
- fn test_real_git_log() {
193
- // Requires:
194
- // 1. RTK binary installed (cargo install --path .)
195
- // 2. Git repository available
196
-
197
- let output = std::process::Command::new("rtk")
198
- .args(&["git", "log", "-10"])
199
- .output()
200
- .expect("Failed to run rtk");
201
-
202
- assert!(output.status.success(), "RTK exited with non-zero status");
203
- assert!(!output.stdout.is_empty(), "RTK produced empty output");
204
-
205
- // Verify condensed (not raw git output)
206
- let stdout = String::from_utf8_lossy(&output.stdout);
207
- assert!(
208
- stdout.len() < 5000,
209
- "Output too large ({} bytes), filter not working",
210
- stdout.len()
211
- );
212
-
213
- // Verify format preservation (spot check)
214
- assert!(stdout.contains("commit") || stdout.contains("Author"));
215
- }
216
- ```
217
-
218
- **Run integration tests**:
219
-
220
- ```bash
221
- # Install RTK first
222
- cargo install --path .
223
-
224
- # Run integration tests
225
- cargo test --ignored
226
-
227
- # Specific integration test
228
- cargo test --ignored test_real_git_log
229
- ```
230
-
231
- **When to write integration tests**:
232
- - **New filter added**: Verify filter works with real command
233
- - **Command routing changes**: Verify RTK intercepts correctly
234
- - **Hook integration changes**: Verify Claude Code hook rewriting works
235
-
236
- ## Test Coverage Strategy
237
-
238
- **Priority targets**:
239
- 1. 🔴 **All filters**: git, cargo, gh, pnpm, docker, lint, tsc, etc. → Snapshot + token accuracy
240
- 2. 🟡 **Edge cases**: Empty output, malformed input, unicode, ANSI codes
241
- 3. 🟢 **Performance**: Benchmark startup time (<10ms), memory usage (<5MB)
242
-
243
- **Coverage goals**:
244
- - **100% filter coverage**: Every filter has snapshot test + token accuracy test
245
- - **95% token savings verification**: Fixtures with known savings (60-90%)
246
- - **Cross-platform tests**: macOS + Linux (Windows in CI only)
247
-
248
- **Coverage verification**:
249
-
250
- ```bash
251
- # Install tarpaulin (code coverage tool)
252
- cargo install cargo-tarpaulin
253
-
254
- # Run coverage
255
- cargo tarpaulin --out Html --output-dir coverage/
256
-
257
- # Open coverage report
258
- open coverage/index.html
259
- ```
260
-
261
- ## Commands
262
-
263
- ```bash
264
- # Run all tests
265
- cargo test --all
266
-
267
- # Run snapshot tests only
268
- cargo test --test snapshots
269
-
270
- # Run integration tests (requires real commands + rtk installed)
271
- cargo test --ignored
272
-
273
- # Review snapshot changes
274
- cargo insta review
275
-
276
- # Accept all snapshot changes
277
- cargo insta accept
278
-
279
- # Benchmark performance
280
- cargo bench
281
-
282
- # Cross-platform testing (Linux via Docker)
283
- docker run --rm -v $(pwd):/rtk -w /rtk rust:latest cargo test
284
- ```
285
-
286
- ## Anti-Patterns
287
-
288
- ❌ **DON'T** test with hardcoded output → Use real command fixtures
289
- - Create fixtures: `git log -20 > tests/fixtures/git_log_raw.txt`
290
- - Then test: `include_str!("../tests/fixtures/git_log_raw.txt")`
291
-
292
- ❌ **DON'T** skip cross-platform tests → macOS ≠ Linux ≠ Windows
293
- - Shell escaping differs
294
- - Path separators differ
295
- - Line endings differ
296
- - Test on at least macOS + Linux
297
-
298
- ❌ **DON'T** ignore performance regressions → Benchmark in CI
299
- - Startup time must be <10ms
300
- - Memory usage must be <5MB
301
- - Use `hyperfine` and `time -l` to verify
302
-
303
- ❌ **DON'T** accept <60% token savings → Fails promise to users
304
- - All filters must achieve 60-90% savings
305
- - Test with real fixtures, not synthetic data
306
- - If savings drop, investigate and fix before merge
307
-
308
- ✅ **DO** use `insta` for snapshot tests
309
- - Catches unintended output changes
310
- - Easy to review and accept changes
311
- - Standard tool for Rust output validation
312
-
313
- ✅ **DO** verify token savings with real fixtures
314
- - Use real command output, not synthetic
315
- - Calculate savings: `100.0 - (output_tokens / input_tokens * 100.0)`
316
- - Assert `savings >= 60.0`
317
-
318
- ✅ **DO** test shell escaping on all platforms
319
- - Use `#[cfg(target_os = "...")]` for platform-specific tests
320
- - Test macOS, Linux, Windows (via CI)
321
-
322
- ✅ **DO** run integration tests before release
323
- - Install RTK: `cargo install --path .`
324
- - Run tests: `cargo test --ignored`
325
- - Verify end-to-end behavior with real commands
326
-
327
- ## Testing Workflow (Step-by-Step)
328
-
329
- ### Adding Test for New Filter
330
-
331
- **Scenario**: You just implemented `filter_newcmd()` in `src/newcmd_cmd.rs`.
332
-
333
- **Steps**:
334
-
335
- 1. **Create fixture** (real command output):
336
- ```bash
337
- newcmd --some-args > tests/fixtures/newcmd_raw.txt
338
- ```
339
-
340
- 2. **Add snapshot test** to `src/newcmd_cmd.rs`:
341
- ```rust
342
- #[cfg(test)]
343
- mod tests {
344
- use super::*;
345
- use insta::assert_snapshot;
346
-
347
- #[test]
348
- fn test_newcmd_output_format() {
349
- let input = include_str!("../tests/fixtures/newcmd_raw.txt");
350
- let output = filter_newcmd(input);
351
- assert_snapshot!(output);
352
- }
353
- }
354
- ```
355
-
356
- 3. **Run test** (creates snapshot):
357
- ```bash
358
- cargo test test_newcmd_output_format
359
- ```
360
-
361
- 4. **Review snapshot**:
362
- ```bash
363
- cargo insta review
364
- # Press 'a' to accept if output looks correct
365
- ```
366
-
367
- 5. **Add token accuracy test**:
368
- ```rust
369
- #[test]
370
- fn test_newcmd_token_savings() {
371
- let input = include_str!("../tests/fixtures/newcmd_raw.txt");
372
- let output = filter_newcmd(input);
373
-
374
- let input_tokens = count_tokens(input);
375
- let output_tokens = count_tokens(&output);
376
- let savings = 100.0 - (output_tokens as f64 / input_tokens as f64 * 100.0);
377
-
378
- assert!(savings >= 60.0, "Expected ≥60% savings, got {:.1}%", savings);
379
- }
380
- ```
381
-
382
- 6. **Run all tests**:
383
- ```bash
384
- cargo test --all
385
- ```
386
-
387
- 7. **Commit**:
388
- ```bash
389
- git add src/newcmd_cmd.rs tests/fixtures/newcmd_raw.txt src/snapshots/
390
- git commit -m "test(newcmd): add snapshot + token accuracy tests"
391
- ```
392
-
393
- ### Updating Filter (with Snapshot Test)
394
-
395
- **Scenario**: You modified `filter_git_log()` output format.
396
-
397
- **Steps**:
398
-
399
- 1. **Run tests** (will fail - snapshot mismatch):
400
- ```bash
401
- cargo test test_git_log_output_format
402
- # Output: snapshot mismatch detected
403
- ```
404
-
405
- 2. **Review changes**:
406
- ```bash
407
- cargo insta review
408
- # Shows diff: old vs new snapshot
409
- # Press 'a' to accept if intentional
410
- # Press 'r' to reject if bug
411
- ```
412
-
413
- 3. **If rejected**: Fix filter logic, re-run tests
414
-
415
- 4. **If accepted**: Snapshot updated, commit:
416
- ```bash
417
- git add src/snapshots/
418
- git commit -m "refactor(git): update log output format"
419
- ```
420
-
421
- ### Running Integration Tests
422
-
423
- **Before release** (or when modifying critical paths):
424
-
425
- ```bash
426
- # 1. Install RTK locally
427
- cargo install --path . --force
428
-
429
- # 2. Run integration tests
430
- cargo test --ignored
431
-
432
- # 3. Verify output
433
- # All tests should pass
434
- # If failures: investigate and fix before release
435
- ```
436
-
437
- ## Test Organization
438
-
439
- ```
440
- rtk/
441
- ├── src/
442
- │ ├── git.rs # Filter implementation
443
- │ │ └── #[cfg(test)] mod tests { ... } # Unit tests
444
- │ ├── snapshots/ # Insta snapshots (gitignored pattern)
445
- │ │ └── git.rs.snap # Snapshot for git tests
446
- ├── tests/
447
- │ ├── common/
448
- │ │ └── mod.rs # Shared test utilities (count_tokens, etc.)
449
- │ ├── fixtures/ # Real command output fixtures
450
- │ │ ├── git_log_raw.txt # Real git log output
451
- │ │ ├── cargo_test_raw.txt # Real cargo test output
452
- │ │ └── gh_pr_view_raw.txt # Real gh pr view output
453
- │ └── integration_test.rs # Integration tests (#[ignore])
454
- ```
455
-
456
- **Best practices**:
457
- - Unit tests: Embedded in module (`#[cfg(test)] mod tests`)
458
- - Fixtures: In `tests/fixtures/` (real command output)
459
- - Snapshots: In `src/snapshots/` (auto-generated by insta)
460
- - Shared utils: In `tests/common/mod.rs` (count_tokens, helpers)
461
- - Integration: In `tests/` with `#[ignore]` attribute