@hasna/terminal 2.0.5 → 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 (263) hide show
  1. package/dist/cli.js +52 -21
  2. package/package.json +1 -1
  3. package/src/ai.ts +77 -130
  4. package/src/cli.tsx +51 -21
  5. package/src/command-validator.ts +11 -0
  6. package/src/context-hints.ts +291 -0
  7. package/src/discover.ts +238 -0
  8. package/src/economy.ts +53 -0
  9. package/src/output-processor.ts +7 -18
  10. package/src/output-store.ts +65 -0
  11. package/src/providers/base.ts +3 -1
  12. package/src/providers/groq.ts +108 -0
  13. package/src/providers/index.ts +26 -2
  14. package/src/providers/providers.test.ts +4 -2
  15. package/src/providers/xai.ts +108 -0
  16. package/src/sessions-db.ts +81 -0
  17. package/temp/rtk/.claude/agents/code-reviewer.md +221 -0
  18. package/temp/rtk/.claude/agents/debugger.md +519 -0
  19. package/temp/rtk/.claude/agents/rtk-testing-specialist.md +461 -0
  20. package/temp/rtk/.claude/agents/rust-rtk.md +511 -0
  21. package/temp/rtk/.claude/agents/technical-writer.md +355 -0
  22. package/temp/rtk/.claude/commands/diagnose.md +352 -0
  23. package/temp/rtk/.claude/commands/test-routing.md +362 -0
  24. package/temp/rtk/.claude/hooks/bash/pre-commit-format.sh +16 -0
  25. package/temp/rtk/.claude/hooks/rtk-rewrite.sh +70 -0
  26. package/temp/rtk/.claude/hooks/rtk-suggest.sh +152 -0
  27. package/temp/rtk/.claude/rules/cli-testing.md +526 -0
  28. package/temp/rtk/.claude/skills/issue-triage/SKILL.md +348 -0
  29. package/temp/rtk/.claude/skills/issue-triage/templates/issue-comment.md +134 -0
  30. package/temp/rtk/.claude/skills/performance.md +435 -0
  31. package/temp/rtk/.claude/skills/pr-triage/SKILL.md +315 -0
  32. package/temp/rtk/.claude/skills/pr-triage/templates/review-comment.md +71 -0
  33. package/temp/rtk/.claude/skills/repo-recap.md +206 -0
  34. package/temp/rtk/.claude/skills/rtk-tdd/SKILL.md +78 -0
  35. package/temp/rtk/.claude/skills/rtk-tdd/references/testing-patterns.md +124 -0
  36. package/temp/rtk/.claude/skills/security-guardian.md +503 -0
  37. package/temp/rtk/.claude/skills/ship.md +404 -0
  38. package/temp/rtk/.github/workflows/benchmark.yml +34 -0
  39. package/temp/rtk/.github/workflows/dco-check.yaml +12 -0
  40. package/temp/rtk/.github/workflows/release-please.yml +51 -0
  41. package/temp/rtk/.github/workflows/release.yml +343 -0
  42. package/temp/rtk/.github/workflows/security-check.yml +135 -0
  43. package/temp/rtk/.github/workflows/validate-docs.yml +78 -0
  44. package/temp/rtk/.release-please-manifest.json +3 -0
  45. package/temp/rtk/ARCHITECTURE.md +1491 -0
  46. package/temp/rtk/CHANGELOG.md +640 -0
  47. package/temp/rtk/CLAUDE.md +605 -0
  48. package/temp/rtk/CONTRIBUTING.md +199 -0
  49. package/temp/rtk/Cargo.lock +1668 -0
  50. package/temp/rtk/Cargo.toml +64 -0
  51. package/temp/rtk/Formula/rtk.rb +43 -0
  52. package/temp/rtk/INSTALL.md +390 -0
  53. package/temp/rtk/LICENSE +21 -0
  54. package/temp/rtk/README.md +386 -0
  55. package/temp/rtk/README_es.md +159 -0
  56. package/temp/rtk/README_fr.md +197 -0
  57. package/temp/rtk/README_ja.md +159 -0
  58. package/temp/rtk/README_ko.md +159 -0
  59. package/temp/rtk/README_zh.md +167 -0
  60. package/temp/rtk/ROADMAP.md +15 -0
  61. package/temp/rtk/SECURITY.md +217 -0
  62. package/temp/rtk/TEST_EXEC_TIME.md +102 -0
  63. package/temp/rtk/build.rs +57 -0
  64. package/temp/rtk/docs/AUDIT_GUIDE.md +432 -0
  65. package/temp/rtk/docs/FEATURES.md +1410 -0
  66. package/temp/rtk/docs/TROUBLESHOOTING.md +309 -0
  67. package/temp/rtk/docs/filter-workflow.md +102 -0
  68. package/temp/rtk/docs/images/gain-dashboard.jpg +0 -0
  69. package/temp/rtk/docs/tracking.md +583 -0
  70. package/temp/rtk/hooks/opencode-rtk.ts +39 -0
  71. package/temp/rtk/hooks/rtk-awareness.md +29 -0
  72. package/temp/rtk/hooks/rtk-rewrite.sh +61 -0
  73. package/temp/rtk/hooks/test-rtk-rewrite.sh +442 -0
  74. package/temp/rtk/install.sh +124 -0
  75. package/temp/rtk/release-please-config.json +10 -0
  76. package/temp/rtk/scripts/benchmark.sh +592 -0
  77. package/temp/rtk/scripts/check-installation.sh +162 -0
  78. package/temp/rtk/scripts/install-local.sh +37 -0
  79. package/temp/rtk/scripts/rtk-economics.sh +137 -0
  80. package/temp/rtk/scripts/test-all.sh +561 -0
  81. package/temp/rtk/scripts/test-aristote.sh +227 -0
  82. package/temp/rtk/scripts/test-tracking.sh +79 -0
  83. package/temp/rtk/scripts/update-readme-metrics.sh +32 -0
  84. package/temp/rtk/scripts/validate-docs.sh +73 -0
  85. package/temp/rtk/src/aws_cmd.rs +880 -0
  86. package/temp/rtk/src/binlog.rs +1645 -0
  87. package/temp/rtk/src/cargo_cmd.rs +1727 -0
  88. package/temp/rtk/src/cc_economics.rs +1157 -0
  89. package/temp/rtk/src/ccusage.rs +340 -0
  90. package/temp/rtk/src/config.rs +187 -0
  91. package/temp/rtk/src/container.rs +855 -0
  92. package/temp/rtk/src/curl_cmd.rs +134 -0
  93. package/temp/rtk/src/deps.rs +268 -0
  94. package/temp/rtk/src/diff_cmd.rs +367 -0
  95. package/temp/rtk/src/discover/mod.rs +274 -0
  96. package/temp/rtk/src/discover/provider.rs +388 -0
  97. package/temp/rtk/src/discover/registry.rs +2022 -0
  98. package/temp/rtk/src/discover/report.rs +202 -0
  99. package/temp/rtk/src/discover/rules.rs +667 -0
  100. package/temp/rtk/src/display_helpers.rs +402 -0
  101. package/temp/rtk/src/dotnet_cmd.rs +1771 -0
  102. package/temp/rtk/src/dotnet_format_report.rs +133 -0
  103. package/temp/rtk/src/dotnet_trx.rs +593 -0
  104. package/temp/rtk/src/env_cmd.rs +204 -0
  105. package/temp/rtk/src/filter.rs +462 -0
  106. package/temp/rtk/src/filters/README.md +52 -0
  107. package/temp/rtk/src/filters/ansible-playbook.toml +34 -0
  108. package/temp/rtk/src/filters/basedpyright.toml +47 -0
  109. package/temp/rtk/src/filters/biome.toml +45 -0
  110. package/temp/rtk/src/filters/brew-install.toml +37 -0
  111. package/temp/rtk/src/filters/composer-install.toml +40 -0
  112. package/temp/rtk/src/filters/df.toml +16 -0
  113. package/temp/rtk/src/filters/dotnet-build.toml +64 -0
  114. package/temp/rtk/src/filters/du.toml +16 -0
  115. package/temp/rtk/src/filters/fail2ban-client.toml +15 -0
  116. package/temp/rtk/src/filters/gcc.toml +49 -0
  117. package/temp/rtk/src/filters/gcloud.toml +22 -0
  118. package/temp/rtk/src/filters/hadolint.toml +24 -0
  119. package/temp/rtk/src/filters/helm.toml +29 -0
  120. package/temp/rtk/src/filters/iptables.toml +27 -0
  121. package/temp/rtk/src/filters/jj.toml +28 -0
  122. package/temp/rtk/src/filters/jq.toml +24 -0
  123. package/temp/rtk/src/filters/make.toml +41 -0
  124. package/temp/rtk/src/filters/markdownlint.toml +24 -0
  125. package/temp/rtk/src/filters/mix-compile.toml +27 -0
  126. package/temp/rtk/src/filters/mix-format.toml +15 -0
  127. package/temp/rtk/src/filters/mvn-build.toml +44 -0
  128. package/temp/rtk/src/filters/oxlint.toml +43 -0
  129. package/temp/rtk/src/filters/ping.toml +63 -0
  130. package/temp/rtk/src/filters/pio-run.toml +40 -0
  131. package/temp/rtk/src/filters/poetry-install.toml +50 -0
  132. package/temp/rtk/src/filters/pre-commit.toml +35 -0
  133. package/temp/rtk/src/filters/ps.toml +16 -0
  134. package/temp/rtk/src/filters/quarto-render.toml +41 -0
  135. package/temp/rtk/src/filters/rsync.toml +48 -0
  136. package/temp/rtk/src/filters/shellcheck.toml +27 -0
  137. package/temp/rtk/src/filters/shopify-theme.toml +29 -0
  138. package/temp/rtk/src/filters/skopeo.toml +45 -0
  139. package/temp/rtk/src/filters/sops.toml +16 -0
  140. package/temp/rtk/src/filters/ssh.toml +44 -0
  141. package/temp/rtk/src/filters/stat.toml +34 -0
  142. package/temp/rtk/src/filters/swift-build.toml +41 -0
  143. package/temp/rtk/src/filters/systemctl-status.toml +33 -0
  144. package/temp/rtk/src/filters/terraform-plan.toml +35 -0
  145. package/temp/rtk/src/filters/tofu-fmt.toml +16 -0
  146. package/temp/rtk/src/filters/tofu-init.toml +38 -0
  147. package/temp/rtk/src/filters/tofu-plan.toml +35 -0
  148. package/temp/rtk/src/filters/tofu-validate.toml +17 -0
  149. package/temp/rtk/src/filters/trunk-build.toml +39 -0
  150. package/temp/rtk/src/filters/ty.toml +50 -0
  151. package/temp/rtk/src/filters/uv-sync.toml +37 -0
  152. package/temp/rtk/src/filters/xcodebuild.toml +99 -0
  153. package/temp/rtk/src/filters/yamllint.toml +25 -0
  154. package/temp/rtk/src/find_cmd.rs +598 -0
  155. package/temp/rtk/src/format_cmd.rs +386 -0
  156. package/temp/rtk/src/gain.rs +723 -0
  157. package/temp/rtk/src/gh_cmd.rs +1651 -0
  158. package/temp/rtk/src/git.rs +2012 -0
  159. package/temp/rtk/src/go_cmd.rs +592 -0
  160. package/temp/rtk/src/golangci_cmd.rs +254 -0
  161. package/temp/rtk/src/grep_cmd.rs +288 -0
  162. package/temp/rtk/src/gt_cmd.rs +810 -0
  163. package/temp/rtk/src/hook_audit_cmd.rs +283 -0
  164. package/temp/rtk/src/hook_check.rs +171 -0
  165. package/temp/rtk/src/init.rs +1859 -0
  166. package/temp/rtk/src/integrity.rs +537 -0
  167. package/temp/rtk/src/json_cmd.rs +231 -0
  168. package/temp/rtk/src/learn/detector.rs +628 -0
  169. package/temp/rtk/src/learn/mod.rs +119 -0
  170. package/temp/rtk/src/learn/report.rs +184 -0
  171. package/temp/rtk/src/lint_cmd.rs +694 -0
  172. package/temp/rtk/src/local_llm.rs +316 -0
  173. package/temp/rtk/src/log_cmd.rs +248 -0
  174. package/temp/rtk/src/ls.rs +324 -0
  175. package/temp/rtk/src/main.rs +2482 -0
  176. package/temp/rtk/src/mypy_cmd.rs +389 -0
  177. package/temp/rtk/src/next_cmd.rs +241 -0
  178. package/temp/rtk/src/npm_cmd.rs +236 -0
  179. package/temp/rtk/src/parser/README.md +267 -0
  180. package/temp/rtk/src/parser/error.rs +46 -0
  181. package/temp/rtk/src/parser/formatter.rs +336 -0
  182. package/temp/rtk/src/parser/mod.rs +311 -0
  183. package/temp/rtk/src/parser/types.rs +119 -0
  184. package/temp/rtk/src/pip_cmd.rs +302 -0
  185. package/temp/rtk/src/playwright_cmd.rs +479 -0
  186. package/temp/rtk/src/pnpm_cmd.rs +573 -0
  187. package/temp/rtk/src/prettier_cmd.rs +221 -0
  188. package/temp/rtk/src/prisma_cmd.rs +482 -0
  189. package/temp/rtk/src/psql_cmd.rs +382 -0
  190. package/temp/rtk/src/pytest_cmd.rs +384 -0
  191. package/temp/rtk/src/read.rs +217 -0
  192. package/temp/rtk/src/rewrite_cmd.rs +50 -0
  193. package/temp/rtk/src/ruff_cmd.rs +402 -0
  194. package/temp/rtk/src/runner.rs +271 -0
  195. package/temp/rtk/src/summary.rs +297 -0
  196. package/temp/rtk/src/tee.rs +405 -0
  197. package/temp/rtk/src/telemetry.rs +248 -0
  198. package/temp/rtk/src/toml_filter.rs +1655 -0
  199. package/temp/rtk/src/tracking.rs +1416 -0
  200. package/temp/rtk/src/tree.rs +209 -0
  201. package/temp/rtk/src/tsc_cmd.rs +259 -0
  202. package/temp/rtk/src/utils.rs +432 -0
  203. package/temp/rtk/src/verify_cmd.rs +47 -0
  204. package/temp/rtk/src/vitest_cmd.rs +385 -0
  205. package/temp/rtk/src/wc_cmd.rs +401 -0
  206. package/temp/rtk/src/wget_cmd.rs +260 -0
  207. package/temp/rtk/tests/fixtures/dotnet/build_failed.txt +11 -0
  208. package/temp/rtk/tests/fixtures/dotnet/format_changes.json +31 -0
  209. package/temp/rtk/tests/fixtures/dotnet/format_empty.json +1 -0
  210. package/temp/rtk/tests/fixtures/dotnet/format_success.json +12 -0
  211. package/temp/rtk/tests/fixtures/dotnet/test_failed.txt +18 -0
  212. package/dist/App.js +0 -404
  213. package/dist/Browse.js +0 -79
  214. package/dist/FuzzyPicker.js +0 -47
  215. package/dist/Onboarding.js +0 -51
  216. package/dist/Spinner.js +0 -12
  217. package/dist/StatusBar.js +0 -49
  218. package/dist/ai.js +0 -368
  219. package/dist/cache.js +0 -41
  220. package/dist/command-rewriter.js +0 -64
  221. package/dist/command-validator.js +0 -77
  222. package/dist/compression.js +0 -107
  223. package/dist/diff-cache.js +0 -107
  224. package/dist/economy.js +0 -79
  225. package/dist/expand-store.js +0 -38
  226. package/dist/file-cache.js +0 -72
  227. package/dist/file-index.js +0 -62
  228. package/dist/history.js +0 -62
  229. package/dist/lazy-executor.js +0 -54
  230. package/dist/line-dedup.js +0 -59
  231. package/dist/loop-detector.js +0 -75
  232. package/dist/mcp/install.js +0 -98
  233. package/dist/mcp/server.js +0 -569
  234. package/dist/noise-filter.js +0 -86
  235. package/dist/output-processor.js +0 -136
  236. package/dist/output-router.js +0 -41
  237. package/dist/parsers/base.js +0 -2
  238. package/dist/parsers/build.js +0 -64
  239. package/dist/parsers/errors.js +0 -101
  240. package/dist/parsers/files.js +0 -78
  241. package/dist/parsers/git.js +0 -99
  242. package/dist/parsers/index.js +0 -48
  243. package/dist/parsers/tests.js +0 -89
  244. package/dist/providers/anthropic.js +0 -39
  245. package/dist/providers/base.js +0 -4
  246. package/dist/providers/cerebras.js +0 -95
  247. package/dist/providers/index.js +0 -49
  248. package/dist/recipes/model.js +0 -20
  249. package/dist/recipes/storage.js +0 -136
  250. package/dist/search/content-search.js +0 -68
  251. package/dist/search/file-search.js +0 -61
  252. package/dist/search/filters.js +0 -34
  253. package/dist/search/index.js +0 -5
  254. package/dist/search/semantic.js +0 -320
  255. package/dist/session-boot.js +0 -59
  256. package/dist/session-context.js +0 -55
  257. package/dist/sessions-db.js +0 -120
  258. package/dist/smart-display.js +0 -286
  259. package/dist/snapshots.js +0 -51
  260. package/dist/supervisor.js +0 -112
  261. package/dist/test-watchlist.js +0 -131
  262. package/dist/tree.js +0 -94
  263. package/dist/usage-cache.js +0 -65
@@ -0,0 +1,592 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Use local release build if available, otherwise fall back to installed rtk
5
+ if [ -f "./target/release/rtk" ]; then
6
+ RTK="$(cd "$(dirname ./target/release/rtk)" && pwd)/$(basename ./target/release/rtk)"
7
+ elif command -v rtk &> /dev/null; then
8
+ RTK="$(command -v rtk)"
9
+ else
10
+ echo "Error: rtk not found. Run 'cargo build --release' or install rtk."
11
+ exit 1
12
+ fi
13
+ BENCH_DIR="$(pwd)/scripts/benchmark"
14
+
15
+ # Mode local : générer les fichiers debug
16
+ if [ -z "$CI" ]; then
17
+ rm -rf "$BENCH_DIR"
18
+ mkdir -p "$BENCH_DIR/unix" "$BENCH_DIR/rtk" "$BENCH_DIR/diff"
19
+ fi
20
+
21
+ # Nom de fichier safe
22
+ safe_name() {
23
+ echo "$1" | tr ' /' '_-' | tr -cd 'a-zA-Z0-9_-'
24
+ }
25
+
26
+ # Fonction pour compter les tokens (~4 chars = 1 token)
27
+ count_tokens() {
28
+ local input="$1"
29
+ local len=${#input}
30
+ echo $(( (len + 3) / 4 ))
31
+ }
32
+
33
+ # Compteurs globaux
34
+ TOTAL_UNIX=0
35
+ TOTAL_RTK=0
36
+ TOTAL_TESTS=0
37
+ GOOD_TESTS=0
38
+ FAIL_TESTS=0
39
+ SKIP_TESTS=0
40
+
41
+ # Fonction de benchmark — une ligne par test
42
+ bench() {
43
+ local name="$1"
44
+ local unix_cmd="$2"
45
+ local rtk_cmd="$3"
46
+
47
+ unix_out=$(eval "$unix_cmd" 2>/dev/null || true)
48
+ rtk_out=$(eval "$rtk_cmd" 2>/dev/null || true)
49
+
50
+ unix_tokens=$(count_tokens "$unix_out")
51
+ rtk_tokens=$(count_tokens "$rtk_out")
52
+
53
+ TOTAL_TESTS=$((TOTAL_TESTS + 1))
54
+
55
+ local icon=""
56
+ local tag=""
57
+
58
+ if [ -z "$rtk_out" ]; then
59
+ icon="❌"
60
+ tag="FAIL"
61
+ FAIL_TESTS=$((FAIL_TESTS + 1))
62
+ TOTAL_UNIX=$((TOTAL_UNIX + unix_tokens))
63
+ TOTAL_RTK=$((TOTAL_RTK + unix_tokens))
64
+ elif [ "$rtk_tokens" -ge "$unix_tokens" ] && [ "$unix_tokens" -gt 0 ]; then
65
+ icon="⚠️"
66
+ tag="SKIP"
67
+ SKIP_TESTS=$((SKIP_TESTS + 1))
68
+ TOTAL_UNIX=$((TOTAL_UNIX + unix_tokens))
69
+ TOTAL_RTK=$((TOTAL_RTK + unix_tokens))
70
+ else
71
+ icon="✅"
72
+ tag="GOOD"
73
+ GOOD_TESTS=$((GOOD_TESTS + 1))
74
+ TOTAL_UNIX=$((TOTAL_UNIX + unix_tokens))
75
+ TOTAL_RTK=$((TOTAL_RTK + rtk_tokens))
76
+ fi
77
+
78
+ if [ "$tag" = "FAIL" ]; then
79
+ printf "%s %-24s │ %-40s │ %-40s │ %6d → %6s (--)\n" \
80
+ "$icon" "$name" "$unix_cmd" "$rtk_cmd" "$unix_tokens" "-"
81
+ else
82
+ if [ "$unix_tokens" -gt 0 ]; then
83
+ local pct=$(( (unix_tokens - rtk_tokens) * 100 / unix_tokens ))
84
+ else
85
+ local pct=0
86
+ fi
87
+ printf "%s %-24s │ %-40s │ %-40s │ %6d → %6d (%+d%%)\n" \
88
+ "$icon" "$name" "$unix_cmd" "$rtk_cmd" "$unix_tokens" "$rtk_tokens" "$pct"
89
+ fi
90
+
91
+ # Fichiers debug en local uniquement
92
+ if [ -z "$CI" ]; then
93
+ local filename=$(safe_name "$name")
94
+ local prefix="GOOD"
95
+ [ "$tag" = "FAIL" ] && prefix="FAIL"
96
+ [ "$tag" = "SKIP" ] && prefix="BAD"
97
+
98
+ local ts=$(date "+%d/%m/%Y %H:%M:%S")
99
+
100
+ printf "# %s\n> %s\n\n\`\`\`bash\n$ %s\n\`\`\`\n\n\`\`\`\n%s\n\`\`\`\n" \
101
+ "$name" "$ts" "$unix_cmd" "$unix_out" > "$BENCH_DIR/unix/${filename}.md"
102
+
103
+ printf "# %s\n> %s\n\n\`\`\`bash\n$ %s\n\`\`\`\n\n\`\`\`\n%s\n\`\`\`\n" \
104
+ "$name" "$ts" "$rtk_cmd" "$rtk_out" > "$BENCH_DIR/rtk/${filename}.md"
105
+
106
+ {
107
+ echo "# Diff: $name"
108
+ echo "> $ts"
109
+ echo ""
110
+ echo "| Metric | Unix | RTK |"
111
+ echo "|--------|------|-----|"
112
+ echo "| Tokens | $unix_tokens | $rtk_tokens |"
113
+ echo ""
114
+ echo "## Unix"
115
+ echo "\`\`\`"
116
+ echo "$unix_out"
117
+ echo "\`\`\`"
118
+ echo ""
119
+ echo "## RTK"
120
+ echo "\`\`\`"
121
+ echo "$rtk_out"
122
+ echo "\`\`\`"
123
+ } > "$BENCH_DIR/diff/${prefix}-${filename}.md"
124
+ fi
125
+ }
126
+
127
+ # Section header
128
+ section() {
129
+ echo ""
130
+ echo "── $1 ──"
131
+ }
132
+
133
+ # ═══════════════════════════════════════════
134
+ echo "RTK Benchmark"
135
+ echo "═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════"
136
+ printf " %-24s │ %-40s │ %-40s │ %s\n" "TEST" "SHELL" "RTK" "TOKENS"
137
+ echo "───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"
138
+
139
+ # ===================
140
+ # ls
141
+ # ===================
142
+ section "ls"
143
+ bench "ls" "ls -la" "$RTK ls"
144
+ bench "ls src/" "ls -la src/" "$RTK ls src/"
145
+ bench "ls -l src/" "ls -l src/" "$RTK ls -l src/"
146
+ bench "ls -la src/" "ls -la src/" "$RTK ls -la src/"
147
+ bench "ls -lh src/" "ls -lh src/" "$RTK ls -lh src/"
148
+ bench "ls src/ -l" "ls -l src/" "$RTK ls src/ -l"
149
+ bench "ls -a" "ls -la" "$RTK ls -a"
150
+ bench "ls multi" "ls -la src/ scripts/" "$RTK ls src/ scripts/"
151
+
152
+ # ===================
153
+ # read
154
+ # ===================
155
+ section "read"
156
+ bench "read" "cat src/main.rs" "$RTK read src/main.rs"
157
+ bench "read -l minimal" "cat src/main.rs" "$RTK read src/main.rs -l minimal"
158
+ bench "read -l aggressive" "cat src/main.rs" "$RTK read src/main.rs -l aggressive"
159
+ bench "read -n" "cat -n src/main.rs" "$RTK read src/main.rs -n"
160
+
161
+ # ===================
162
+ # find
163
+ # ===================
164
+ section "find"
165
+ bench "find *" "find . -type f" "$RTK find '*'"
166
+ bench "find *.rs" "find . -name '*.rs' -type f" "$RTK find '*.rs'"
167
+ bench "find --max 10" "find . -not -path './target/*' -not -path './.git/*' -type f | head -10" "$RTK find '*' --max 10"
168
+ bench "find --max 100" "find . -not -path './target/*' -not -path './.git/*' -type f | head -100" "$RTK find '*' --max 100"
169
+
170
+ # ===================
171
+ # git
172
+ # ===================
173
+ section "git"
174
+ bench "git status" "git status" "$RTK git status"
175
+ bench "git log -n 10" "git log -10" "$RTK git log -n 10"
176
+ bench "git log -n 5" "git log -5" "$RTK git log -n 5"
177
+ bench "git diff" "git diff HEAD~1 2>/dev/null || echo ''" "$RTK git diff HEAD~1"
178
+
179
+ # ===================
180
+ # grep
181
+ # ===================
182
+ section "grep"
183
+ bench "grep fn" "grep -rn 'fn ' src/ || true" "$RTK grep 'fn ' src/"
184
+ bench "grep struct" "grep -rn 'struct ' src/ || true" "$RTK grep 'struct ' src/"
185
+ bench "grep -l 40" "grep -rn 'fn ' src/ || true" "$RTK grep 'fn ' src/ -l 40"
186
+ bench "grep --max 20" "grep -rn 'fn ' src/ | head -20 || true" "$RTK grep 'fn ' src/ --max 20"
187
+ bench "grep -c" "grep -ron 'fn ' src/ || true" "$RTK grep 'fn ' src/ -c"
188
+
189
+ # ===================
190
+ # json
191
+ # ===================
192
+ section "json"
193
+ cat > /tmp/rtk_bench.json << 'JSONEOF'
194
+ {
195
+ "name": "rtk",
196
+ "version": "0.2.1",
197
+ "config": {
198
+ "debug": false,
199
+ "max_depth": 10,
200
+ "filters": ["node_modules", "target", ".git"]
201
+ },
202
+ "dependencies": {
203
+ "serde": "1.0",
204
+ "clap": "4.0",
205
+ "anyhow": "1.0"
206
+ }
207
+ }
208
+ JSONEOF
209
+ bench "json" "cat /tmp/rtk_bench.json" "$RTK json /tmp/rtk_bench.json"
210
+ bench "json -d 2" "cat /tmp/rtk_bench.json" "$RTK json /tmp/rtk_bench.json -d 2"
211
+ rm -f /tmp/rtk_bench.json
212
+
213
+ # ===================
214
+ # deps
215
+ # ===================
216
+ section "deps"
217
+ bench "deps" "cat Cargo.toml" "$RTK deps"
218
+
219
+ # ===================
220
+ # env
221
+ # ===================
222
+ section "env"
223
+ bench "env" "env" "$RTK env"
224
+ bench "env -f PATH" "env | grep PATH" "$RTK env -f PATH"
225
+ bench "env --show-all" "env" "$RTK env --show-all"
226
+
227
+ # ===================
228
+ # err
229
+ # ===================
230
+ section "err"
231
+ if command -v cargo &>/dev/null; then
232
+ bench "err cargo build" "cargo build 2>&1 || true" "$RTK err cargo build"
233
+ else
234
+ echo "⏭️ err cargo build (cargo not in PATH, skipped)"
235
+ fi
236
+
237
+ # ===================
238
+ # test
239
+ # ===================
240
+ section "test"
241
+ if command -v cargo &>/dev/null; then
242
+ bench "test cargo test" "cargo test 2>&1 || true" "$RTK test cargo test"
243
+ else
244
+ echo "⏭️ test cargo test (cargo not in PATH, skipped)"
245
+ fi
246
+
247
+ # ===================
248
+ # log
249
+ # ===================
250
+ section "log"
251
+ LOG_FILE="/tmp/rtk_bench_sample.log"
252
+ cat > "$LOG_FILE" << 'LOGEOF'
253
+ 2024-01-15 10:00:01 INFO Application started
254
+ 2024-01-15 10:00:02 INFO Loading configuration
255
+ 2024-01-15 10:00:03 ERROR Connection failed: timeout
256
+ 2024-01-15 10:00:04 ERROR Connection failed: timeout
257
+ 2024-01-15 10:00:05 ERROR Connection failed: timeout
258
+ 2024-01-15 10:00:06 ERROR Connection failed: timeout
259
+ 2024-01-15 10:00:07 ERROR Connection failed: timeout
260
+ 2024-01-15 10:00:08 WARN Retrying connection
261
+ 2024-01-15 10:00:09 INFO Connection established
262
+ 2024-01-15 10:00:10 INFO Processing request
263
+ 2024-01-15 10:00:11 INFO Processing request
264
+ 2024-01-15 10:00:12 INFO Processing request
265
+ 2024-01-15 10:00:13 INFO Request completed
266
+ LOGEOF
267
+ bench "log" "cat $LOG_FILE" "$RTK log $LOG_FILE"
268
+ rm -f "$LOG_FILE"
269
+
270
+ # ===================
271
+ # summary
272
+ # ===================
273
+ section "summary"
274
+ if command -v cargo &>/dev/null; then
275
+ bench "summary cargo --help" "cargo --help" "$RTK summary cargo --help"
276
+ else
277
+ echo "⏭️ summary cargo --help (cargo not in PATH, skipped)"
278
+ fi
279
+ if command -v rustc &>/dev/null; then
280
+ bench "summary rustc --help" "rustc --help 2>/dev/null || echo 'rustc not found'" "$RTK summary rustc --help"
281
+ else
282
+ echo "⏭️ summary rustc --help (rustc not in PATH, skipped)"
283
+ fi
284
+
285
+ # ===================
286
+ # cargo
287
+ # ===================
288
+ section "cargo"
289
+ if command -v cargo &>/dev/null; then
290
+ bench "cargo build" "cargo build 2>&1 || true" "$RTK cargo build"
291
+ bench "cargo test" "cargo test 2>&1 || true" "$RTK cargo test"
292
+ bench "cargo clippy" "cargo clippy 2>&1 || true" "$RTK cargo clippy"
293
+ bench "cargo check" "cargo check 2>&1 || true" "$RTK cargo check"
294
+ else
295
+ echo "⏭️ cargo build/test/clippy/check (cargo not in PATH, skipped)"
296
+ fi
297
+
298
+ # ===================
299
+ # diff
300
+ # ===================
301
+ section "diff"
302
+ bench "diff" "diff Cargo.toml LICENSE 2>&1 || true" "$RTK diff Cargo.toml LICENSE"
303
+
304
+ # ===================
305
+ # smart
306
+ # ===================
307
+ section "smart"
308
+ bench "smart main.rs" "cat src/main.rs" "$RTK smart src/main.rs"
309
+
310
+ # ===================
311
+ # wc
312
+ # ===================
313
+ section "wc"
314
+ bench "wc" "wc Cargo.toml src/main.rs" "$RTK wc Cargo.toml src/main.rs"
315
+
316
+ # ===================
317
+ # curl
318
+ # ===================
319
+ section "curl"
320
+ if command -v curl &> /dev/null; then
321
+ bench "curl json" "curl -s https://httpbin.org/json" "$RTK curl https://httpbin.org/json"
322
+ bench "curl text" "curl -s https://httpbin.org/robots.txt" "$RTK curl https://httpbin.org/robots.txt"
323
+ fi
324
+
325
+ # ===================
326
+ # wget
327
+ # ===================
328
+ if command -v wget &> /dev/null; then
329
+ section "wget"
330
+ bench "wget" "wget -qO- https://httpbin.org/robots.txt" "$RTK wget https://httpbin.org/robots.txt -O"
331
+ fi
332
+
333
+ # ===================
334
+ # Modern JavaScript Stack (skip si pas de package.json)
335
+ # ===================
336
+ if [ -f "package.json" ]; then
337
+ section "modern JS stack"
338
+
339
+ if command -v tsc &> /dev/null || [ -f "node_modules/.bin/tsc" ]; then
340
+ bench "tsc" "tsc --noEmit 2>&1 || true" "$RTK tsc --noEmit"
341
+ fi
342
+
343
+ if command -v prettier &> /dev/null || [ -f "node_modules/.bin/prettier" ]; then
344
+ bench "prettier --check" "prettier --check . 2>&1 || true" "$RTK prettier --check ."
345
+ fi
346
+
347
+ if command -v eslint &> /dev/null || [ -f "node_modules/.bin/eslint" ]; then
348
+ bench "lint" "eslint . 2>&1 || true" "$RTK lint ."
349
+ fi
350
+
351
+ if [ -f "next.config.js" ] || [ -f "next.config.mjs" ] || [ -f "next.config.ts" ]; then
352
+ if command -v next &> /dev/null || [ -f "node_modules/.bin/next" ]; then
353
+ bench "next build" "next build 2>&1 || true" "$RTK next build"
354
+ fi
355
+ fi
356
+
357
+ if [ -f "playwright.config.ts" ] || [ -f "playwright.config.js" ]; then
358
+ if command -v playwright &> /dev/null || [ -f "node_modules/.bin/playwright" ]; then
359
+ bench "playwright test" "playwright test 2>&1 || true" "$RTK playwright test"
360
+ fi
361
+ fi
362
+
363
+ if [ -f "prisma/schema.prisma" ]; then
364
+ if command -v prisma &> /dev/null || [ -f "node_modules/.bin/prisma" ]; then
365
+ bench "prisma generate" "prisma generate 2>&1 || true" "$RTK prisma generate"
366
+ fi
367
+ fi
368
+
369
+ if command -v vitest &> /dev/null || [ -f "node_modules/.bin/vitest" ]; then
370
+ bench "vitest run" "vitest run --reporter=json 2>&1 || true" "$RTK vitest run"
371
+ fi
372
+
373
+ if command -v pnpm &> /dev/null; then
374
+ bench "pnpm list" "pnpm list --depth 0 2>&1 || true" "$RTK pnpm list --depth 0"
375
+ bench "pnpm outdated" "pnpm outdated 2>&1 || true" "$RTK pnpm outdated"
376
+ fi
377
+ fi
378
+
379
+ # ===================
380
+ # gh (skip si pas dispo ou pas dans un repo)
381
+ # ===================
382
+ if command -v gh &> /dev/null && git rev-parse --git-dir &> /dev/null; then
383
+ section "gh"
384
+ bench "gh pr list" "gh pr list 2>&1 || true" "$RTK gh pr list"
385
+ bench "gh run list" "gh run list 2>&1 || true" "$RTK gh run list"
386
+ fi
387
+
388
+ # ===================
389
+ # docker (skip si pas dispo)
390
+ # ===================
391
+ if command -v docker &> /dev/null; then
392
+ section "docker"
393
+ bench "docker ps" "docker ps 2>/dev/null || true" "$RTK docker ps"
394
+ bench "docker images" "docker images 2>/dev/null || true" "$RTK docker images"
395
+ fi
396
+
397
+ # ===================
398
+ # kubectl (skip si pas dispo)
399
+ # ===================
400
+ if command -v kubectl &> /dev/null; then
401
+ section "kubectl"
402
+ bench "kubectl pods" "kubectl get pods 2>/dev/null || true" "$RTK kubectl pods"
403
+ bench "kubectl services" "kubectl get services 2>/dev/null || true" "$RTK kubectl services"
404
+ fi
405
+
406
+ # ===================
407
+ # Python (avec fixtures temporaires)
408
+ # ===================
409
+ if command -v python3 &> /dev/null && command -v ruff &> /dev/null && command -v pytest &> /dev/null; then
410
+ section "python"
411
+
412
+ PYTHON_FIXTURE=$(mktemp -d)
413
+ cd "$PYTHON_FIXTURE"
414
+
415
+ # pyproject.toml
416
+ cat > pyproject.toml << 'PYEOF'
417
+ [project]
418
+ name = "rtk-bench"
419
+ version = "0.1.0"
420
+
421
+ [tool.ruff]
422
+ line-length = 88
423
+ PYEOF
424
+
425
+ # sample.py avec quelques issues ruff
426
+ cat > sample.py << 'PYEOF'
427
+ import os
428
+ import sys
429
+ import json
430
+
431
+
432
+ def process_data(x):
433
+ if x == None: # E711: comparison to None
434
+ return []
435
+ result = []
436
+ for i in range(len(x)): # C416: unnecessary list comprehension
437
+ result.append(x[i] * 2)
438
+ return result
439
+
440
+ def unused_function(): # F841: local variable assigned but never used
441
+ temp = 42
442
+ return None
443
+ PYEOF
444
+
445
+ # test_sample.py
446
+ cat > test_sample.py << 'PYEOF'
447
+ from sample import process_data
448
+
449
+ def test_process_data():
450
+ assert process_data([1, 2, 3]) == [2, 4, 6]
451
+
452
+ def test_process_data_none():
453
+ assert process_data(None) == []
454
+ PYEOF
455
+
456
+ bench "ruff check" "ruff check . 2>&1 || true" "$RTK ruff check ."
457
+ bench "pytest" "pytest -v 2>&1 || true" "$RTK pytest -v"
458
+
459
+ cd - > /dev/null
460
+ rm -rf "$PYTHON_FIXTURE"
461
+ fi
462
+
463
+ # ===================
464
+ # Go (avec fixtures temporaires)
465
+ # ===================
466
+ if command -v go &> /dev/null && command -v golangci-lint &> /dev/null; then
467
+ section "go"
468
+
469
+ GO_FIXTURE=$(mktemp -d)
470
+ cd "$GO_FIXTURE"
471
+
472
+ # go.mod
473
+ cat > go.mod << 'GOEOF'
474
+ module bench
475
+
476
+ go 1.21
477
+ GOEOF
478
+
479
+ # main.go
480
+ cat > main.go << 'GOEOF'
481
+ package main
482
+
483
+ import "fmt"
484
+
485
+ func Add(a, b int) int {
486
+ return a + b
487
+ }
488
+
489
+ func Multiply(a, b int) int {
490
+ return a * b
491
+ }
492
+
493
+ func main() {
494
+ fmt.Println(Add(2, 3))
495
+ fmt.Println(Multiply(4, 5))
496
+ }
497
+ GOEOF
498
+
499
+ # main_test.go
500
+ cat > main_test.go << 'GOEOF'
501
+ package main
502
+
503
+ import "testing"
504
+
505
+ func TestAdd(t *testing.T) {
506
+ result := Add(2, 3)
507
+ if result != 5 {
508
+ t.Errorf("Add(2, 3) = %d; want 5", result)
509
+ }
510
+ }
511
+
512
+ func TestMultiply(t *testing.T) {
513
+ result := Multiply(4, 5)
514
+ if result != 20 {
515
+ t.Errorf("Multiply(4, 5) = %d; want 20", result)
516
+ }
517
+ }
518
+ GOEOF
519
+
520
+ bench "golangci-lint" "golangci-lint run 2>&1 || true" "$RTK golangci-lint run"
521
+ bench "go test" "go test -v 2>&1 || true" "$RTK go test -v"
522
+ bench "go build" "go build ./... 2>&1 || true" "$RTK go build ./..."
523
+ bench "go vet" "go vet ./... 2>&1 || true" "$RTK go vet ./..."
524
+
525
+ cd - > /dev/null
526
+ rm -rf "$GO_FIXTURE"
527
+ fi
528
+
529
+ # ===================
530
+ # rewrite (verify rewrite works with and without quotes)
531
+ # ===================
532
+ section "rewrite"
533
+
534
+ # bench_rewrite: verifies rewrite produces expected output (not token comparison)
535
+ bench_rewrite() {
536
+ local name="$1"
537
+ local cmd="$2"
538
+ local expected="$3"
539
+
540
+ result=$(eval "$cmd" 2>&1 || true)
541
+
542
+ TOTAL_TESTS=$((TOTAL_TESTS + 1))
543
+
544
+ if [ "$result" = "$expected" ]; then
545
+ printf "✅ %-24s │ %-40s │ %s\n" "$name" "$cmd" "$result"
546
+ GOOD_TESTS=$((GOOD_TESTS + 1))
547
+ else
548
+ printf "❌ %-24s │ %-40s │ got: %s (expected: %s)\n" "$name" "$cmd" "$result" "$expected"
549
+ FAIL_TESTS=$((FAIL_TESTS + 1))
550
+ fi
551
+ }
552
+
553
+ bench_rewrite "rewrite quoted" "$RTK rewrite 'git status'" "rtk git status"
554
+ bench_rewrite "rewrite unquoted" "$RTK rewrite git status" "rtk git status"
555
+ bench_rewrite "rewrite ls -al" "$RTK rewrite ls -al" "rtk ls -al"
556
+ bench_rewrite "rewrite npm exec" "$RTK rewrite npm exec" "rtk npm exec"
557
+ bench_rewrite "rewrite cargo test" "$RTK rewrite cargo test" "rtk cargo test"
558
+ bench_rewrite "rewrite compound" "$RTK rewrite 'cargo test && git push'" "rtk cargo test && rtk git push"
559
+
560
+ # ===================
561
+ # Résumé global
562
+ # ===================
563
+ echo ""
564
+ echo "═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════"
565
+
566
+ if [ "$TOTAL_TESTS" -gt 0 ]; then
567
+ GOOD_PCT=$((GOOD_TESTS * 100 / TOTAL_TESTS))
568
+ if [ "$TOTAL_UNIX" -gt 0 ]; then
569
+ TOTAL_SAVED=$((TOTAL_UNIX - TOTAL_RTK))
570
+ TOTAL_SAVE_PCT=$((TOTAL_SAVED * 100 / TOTAL_UNIX))
571
+ else
572
+ TOTAL_SAVED=0
573
+ TOTAL_SAVE_PCT=0
574
+ fi
575
+
576
+ echo ""
577
+ echo " ✅ $GOOD_TESTS good ⚠️ $SKIP_TESTS skip ❌ $FAIL_TESTS fail $GOOD_TESTS/$TOTAL_TESTS ($GOOD_PCT%)"
578
+ echo " Tokens: $TOTAL_UNIX → $TOTAL_RTK (-$TOTAL_SAVE_PCT%)"
579
+ echo ""
580
+
581
+ # Fichiers debug en local
582
+ if [ -z "$CI" ]; then
583
+ echo " Debug: $BENCH_DIR/{unix,rtk,diff}/"
584
+ fi
585
+ echo ""
586
+
587
+ # Exit code non-zero si moins de 80% good
588
+ if [ "$GOOD_PCT" -lt 80 ]; then
589
+ echo " BENCHMARK FAILED: $GOOD_PCT% good (minimum 80%)"
590
+ exit 1
591
+ fi
592
+ fi