@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,561 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # RTK Smoke Test Suite
4
+ # Exercises every command to catch regressions after merge.
5
+ # Exit code: number of failures (0 = all green)
6
+ #
7
+ set -euo pipefail
8
+
9
+ PASS=0
10
+ FAIL=0
11
+ SKIP=0
12
+ FAILURES=()
13
+
14
+ # Colors
15
+ RED='\033[0;31m'
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[0;33m'
18
+ CYAN='\033[0;36m'
19
+ BOLD='\033[1m'
20
+ NC='\033[0m'
21
+
22
+ # ── Helpers ──────────────────────────────────────────
23
+
24
+ assert_ok() {
25
+ local name="$1"
26
+ shift
27
+ local output
28
+ if output=$("$@" 2>&1); then
29
+ PASS=$((PASS + 1))
30
+ printf " ${GREEN}PASS${NC} %s\n" "$name"
31
+ else
32
+ FAIL=$((FAIL + 1))
33
+ FAILURES+=("$name")
34
+ printf " ${RED}FAIL${NC} %s\n" "$name"
35
+ printf " cmd: %s\n" "$*"
36
+ printf " out: %s\n" "$(echo "$output" | head -3)"
37
+ fi
38
+ }
39
+
40
+ assert_contains() {
41
+ local name="$1"
42
+ local needle="$2"
43
+ shift 2
44
+ local output
45
+ if output=$("$@" 2>&1) && echo "$output" | grep -q "$needle"; then
46
+ PASS=$((PASS + 1))
47
+ printf " ${GREEN}PASS${NC} %s\n" "$name"
48
+ else
49
+ FAIL=$((FAIL + 1))
50
+ FAILURES+=("$name")
51
+ printf " ${RED}FAIL${NC} %s\n" "$name"
52
+ printf " expected: '%s'\n" "$needle"
53
+ printf " got: %s\n" "$(echo "$output" | head -3)"
54
+ fi
55
+ }
56
+
57
+ assert_exit_ok() {
58
+ local name="$1"
59
+ shift
60
+ if "$@" >/dev/null 2>&1; then
61
+ PASS=$((PASS + 1))
62
+ printf " ${GREEN}PASS${NC} %s\n" "$name"
63
+ else
64
+ FAIL=$((FAIL + 1))
65
+ FAILURES+=("$name")
66
+ printf " ${RED}FAIL${NC} %s\n" "$name"
67
+ printf " cmd: %s\n" "$*"
68
+ fi
69
+ }
70
+
71
+ assert_fails() {
72
+ local name="$1"
73
+ shift
74
+ if "$@" >/dev/null 2>&1; then
75
+ FAIL=$((FAIL + 1))
76
+ FAILURES+=("$name (expected failure, got success)")
77
+ printf " ${RED}FAIL${NC} %s (expected failure)\n" "$name"
78
+ else
79
+ PASS=$((PASS + 1))
80
+ printf " ${GREEN}PASS${NC} %s\n" "$name"
81
+ fi
82
+ }
83
+
84
+ assert_help() {
85
+ local name="$1"
86
+ shift
87
+ assert_contains "$name --help" "Usage:" "$@" --help
88
+ }
89
+
90
+ skip_test() {
91
+ local name="$1"
92
+ local reason="$2"
93
+ SKIP=$((SKIP + 1))
94
+ printf " ${YELLOW}SKIP${NC} %s (%s)\n" "$name" "$reason"
95
+ }
96
+
97
+ section() {
98
+ printf "\n${BOLD}${CYAN}── %s ──${NC}\n" "$1"
99
+ }
100
+
101
+ # ── Preamble ─────────────────────────────────────────
102
+
103
+ RTK=$(command -v rtk || echo "")
104
+ if [[ -z "$RTK" ]]; then
105
+ echo "rtk not found in PATH. Run: cargo install --path ."
106
+ exit 1
107
+ fi
108
+
109
+ printf "${BOLD}RTK Smoke Test Suite${NC}\n"
110
+ printf "Binary: %s\n" "$RTK"
111
+ printf "Version: %s\n" "$(rtk --version)"
112
+ printf "Date: %s\n" "$(date '+%Y-%m-%d %H:%M')"
113
+
114
+ # Need a git repo to test git commands
115
+ if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
116
+ echo "Must run from inside a git repository."
117
+ exit 1
118
+ fi
119
+
120
+ REPO_ROOT=$(git rev-parse --show-toplevel)
121
+
122
+ # ── 1. Version & Help ───────────────────────────────
123
+
124
+ section "Version & Help"
125
+
126
+ assert_contains "rtk --version" "rtk" rtk --version
127
+ assert_contains "rtk --help" "Usage:" rtk --help
128
+
129
+ # ── 2. Ls ────────────────────────────────────────────
130
+
131
+ section "Ls"
132
+
133
+ assert_ok "rtk ls ." rtk ls .
134
+ assert_ok "rtk ls -la ." rtk ls -la .
135
+ assert_ok "rtk ls -lh ." rtk ls -lh .
136
+ assert_ok "rtk ls -l src/" rtk ls -l src/
137
+ assert_ok "rtk ls src/ -l (flag after)" rtk ls src/ -l
138
+ assert_ok "rtk ls multi paths" rtk ls src/ scripts/
139
+ assert_contains "rtk ls -a shows hidden" ".git" rtk ls -a .
140
+ assert_contains "rtk ls shows sizes" "K" rtk ls src/
141
+ assert_contains "rtk ls shows dirs with /" "/" rtk ls .
142
+
143
+ # ── 2b. Tree ─────────────────────────────────────────
144
+
145
+ section "Tree"
146
+
147
+ if command -v tree >/dev/null 2>&1; then
148
+ assert_ok "rtk tree ." rtk tree .
149
+ assert_ok "rtk tree -L 2 ." rtk tree -L 2 .
150
+ assert_ok "rtk tree -d -L 1 ." rtk tree -d -L 1 .
151
+ assert_contains "rtk tree shows src/" "src" rtk tree -L 1 .
152
+ else
153
+ skip_test "rtk tree" "tree not installed"
154
+ fi
155
+
156
+ # ── 3. Read ──────────────────────────────────────────
157
+
158
+ section "Read"
159
+
160
+ assert_ok "rtk read Cargo.toml" rtk read Cargo.toml
161
+ assert_ok "rtk read --level none Cargo.toml" rtk read --level none Cargo.toml
162
+ assert_ok "rtk read --level aggressive Cargo.toml" rtk read --level aggressive Cargo.toml
163
+ assert_ok "rtk read -n Cargo.toml" rtk read -n Cargo.toml
164
+ assert_ok "rtk read --max-lines 5 Cargo.toml" rtk read --max-lines 5 Cargo.toml
165
+
166
+ section "Read (stdin support)"
167
+
168
+ assert_ok "rtk read stdin pipe" bash -c 'echo "fn main() {}" | rtk read -'
169
+
170
+ # ── 4. Git ───────────────────────────────────────────
171
+
172
+ section "Git (existing)"
173
+
174
+ assert_ok "rtk git status" rtk git status
175
+ assert_ok "rtk git status --short" rtk git status --short
176
+ assert_ok "rtk git status -s" rtk git status -s
177
+ assert_ok "rtk git status --porcelain" rtk git status --porcelain
178
+ assert_ok "rtk git log" rtk git log
179
+ assert_ok "rtk git log -5" rtk git log -- -5
180
+ assert_ok "rtk git diff" rtk git diff
181
+ assert_ok "rtk git diff --stat" rtk git diff --stat
182
+
183
+ section "Git (new: branch, fetch, stash, worktree)"
184
+
185
+ assert_ok "rtk git branch" rtk git branch
186
+ assert_ok "rtk git fetch" rtk git fetch
187
+ assert_ok "rtk git stash list" rtk git stash list
188
+ assert_ok "rtk git worktree" rtk git worktree
189
+
190
+ section "Git (passthrough: unsupported subcommands)"
191
+
192
+ assert_ok "rtk git tag --list" rtk git tag --list
193
+ assert_ok "rtk git remote -v" rtk git remote -v
194
+ assert_ok "rtk git rev-parse HEAD" rtk git rev-parse HEAD
195
+
196
+ # ── 5. GitHub CLI ────────────────────────────────────
197
+
198
+ section "GitHub CLI"
199
+
200
+ if command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1; then
201
+ assert_ok "rtk gh pr list" rtk gh pr list
202
+ assert_ok "rtk gh run list" rtk gh run list
203
+ assert_ok "rtk gh issue list" rtk gh issue list
204
+ # pr create/merge/diff/comment/edit are write ops, test help only
205
+ assert_help "rtk gh" rtk gh
206
+ else
207
+ skip_test "gh commands" "gh not authenticated"
208
+ fi
209
+
210
+ # ── 6. Cargo ─────────────────────────────────────────
211
+
212
+ section "Cargo (new)"
213
+
214
+ assert_ok "rtk cargo build" rtk cargo build
215
+ assert_ok "rtk cargo clippy" rtk cargo clippy
216
+ # cargo test exits non-zero due to pre-existing failures; check output ignoring exit code
217
+ output_cargo_test=$(rtk cargo test 2>&1 || true)
218
+ if echo "$output_cargo_test" | grep -q "FAILURES\|test result:\|passed"; then
219
+ PASS=$((PASS + 1))
220
+ printf " ${GREEN}PASS${NC} %s\n" "rtk cargo test"
221
+ else
222
+ FAIL=$((FAIL + 1))
223
+ FAILURES+=("rtk cargo test")
224
+ printf " ${RED}FAIL${NC} %s\n" "rtk cargo test"
225
+ printf " got: %s\n" "$(echo "$output_cargo_test" | head -3)"
226
+ fi
227
+ assert_help "rtk cargo" rtk cargo
228
+
229
+ # ── 7. Curl ──────────────────────────────────────────
230
+
231
+ section "Curl (new)"
232
+
233
+ assert_contains "rtk curl JSON detect" "string" rtk curl https://httpbin.org/json
234
+ assert_ok "rtk curl plain text" rtk curl https://httpbin.org/robots.txt
235
+ assert_help "rtk curl" rtk curl
236
+
237
+ # ── 8. Npm / Npx ────────────────────────────────────
238
+
239
+ section "Npm / Npx (new)"
240
+
241
+ assert_help "rtk npm" rtk npm
242
+ assert_help "rtk npx" rtk npx
243
+
244
+ # ── 9. Pnpm ─────────────────────────────────────────
245
+
246
+ section "Pnpm"
247
+
248
+ assert_help "rtk pnpm" rtk pnpm
249
+ assert_help "rtk pnpm build" rtk pnpm build
250
+ assert_help "rtk pnpm typecheck" rtk pnpm typecheck
251
+
252
+ if command -v pnpm >/dev/null 2>&1; then
253
+ assert_ok "rtk pnpm help" rtk pnpm help
254
+ fi
255
+
256
+ # ── 10. Grep ─────────────────────────────────────────
257
+
258
+ section "Grep"
259
+
260
+ assert_ok "rtk grep pattern" rtk grep "pub fn" src/
261
+ assert_contains "rtk grep finds results" "pub fn" rtk grep "pub fn" src/
262
+ assert_ok "rtk grep with file type" rtk grep "pub fn" src/ -t rust
263
+
264
+ section "Grep (extra args passthrough)"
265
+
266
+ assert_ok "rtk grep -i case insensitive" rtk grep "fn" src/ -i
267
+ assert_ok "rtk grep -A context lines" rtk grep "fn run" src/ -A 2
268
+
269
+ # ── 11. Find ─────────────────────────────────────────
270
+
271
+ section "Find"
272
+
273
+ assert_ok "rtk find *.rs" rtk find "*.rs" src/
274
+ assert_contains "rtk find shows files" ".rs" rtk find "*.rs" src/
275
+
276
+ # ── 12. Json ─────────────────────────────────────────
277
+
278
+ section "Json"
279
+
280
+ # Create temp JSON file for testing
281
+ TMPJSON=$(mktemp /tmp/rtk-test-XXXXX.json)
282
+ echo '{"name":"test","count":42,"items":[1,2,3]}' > "$TMPJSON"
283
+
284
+ assert_ok "rtk json file" rtk json "$TMPJSON"
285
+ assert_contains "rtk json shows schema" "string" rtk json "$TMPJSON"
286
+
287
+ rm -f "$TMPJSON"
288
+
289
+ # ── 13. Deps ─────────────────────────────────────────
290
+
291
+ section "Deps"
292
+
293
+ assert_ok "rtk deps ." rtk deps .
294
+ assert_contains "rtk deps shows Cargo" "Cargo" rtk deps .
295
+
296
+ # ── 14. Env ──────────────────────────────────────────
297
+
298
+ section "Env"
299
+
300
+ assert_ok "rtk env" rtk env
301
+ assert_ok "rtk env --filter PATH" rtk env --filter PATH
302
+
303
+ # ── 16. Log ──────────────────────────────────────────
304
+
305
+ section "Log"
306
+
307
+ TMPLOG=$(mktemp /tmp/rtk-log-XXXXX.log)
308
+ for i in $(seq 1 20); do
309
+ echo "[2025-01-01 12:00:00] INFO: repeated message" >> "$TMPLOG"
310
+ done
311
+ echo "[2025-01-01 12:00:01] ERROR: something failed" >> "$TMPLOG"
312
+
313
+ assert_ok "rtk log file" rtk log "$TMPLOG"
314
+
315
+ rm -f "$TMPLOG"
316
+
317
+ # ── 17. Summary ──────────────────────────────────────
318
+
319
+ section "Summary"
320
+
321
+ assert_ok "rtk summary echo hello" rtk summary echo hello
322
+
323
+ # ── 18. Err ──────────────────────────────────────────
324
+
325
+ section "Err"
326
+
327
+ assert_ok "rtk err echo ok" rtk err echo ok
328
+
329
+ # ── 19. Test runner ──────────────────────────────────
330
+
331
+ section "Test runner"
332
+
333
+ assert_ok "rtk test echo ok" rtk test echo ok
334
+
335
+ # ── 20. Gain ─────────────────────────────────────────
336
+
337
+ section "Gain"
338
+
339
+ assert_ok "rtk gain" rtk gain
340
+ assert_ok "rtk gain --history" rtk gain --history
341
+
342
+ # ── 21. Config & Init ────────────────────────────────
343
+
344
+ section "Config & Init"
345
+
346
+ assert_ok "rtk config" rtk config
347
+ assert_ok "rtk init --show" rtk init --show
348
+
349
+ # ── 22. Wget ─────────────────────────────────────────
350
+
351
+ section "Wget"
352
+
353
+ if command -v wget >/dev/null 2>&1; then
354
+ assert_ok "rtk wget stdout" rtk wget https://httpbin.org/robots.txt -O
355
+ else
356
+ skip_test "rtk wget" "wget not installed"
357
+ fi
358
+
359
+ # ── 23. Tsc / Lint / Prettier / Next / Playwright ───
360
+
361
+ section "JS Tooling (help only, no project context)"
362
+
363
+ assert_help "rtk tsc" rtk tsc
364
+ assert_help "rtk lint" rtk lint
365
+ assert_help "rtk prettier" rtk prettier
366
+ assert_help "rtk next" rtk next
367
+ assert_help "rtk playwright" rtk playwright
368
+
369
+ # ── 24. Prisma ───────────────────────────────────────
370
+
371
+ section "Prisma (help only)"
372
+
373
+ assert_help "rtk prisma" rtk prisma
374
+
375
+ # ── 25. Vitest ───────────────────────────────────────
376
+
377
+ section "Vitest (help only)"
378
+
379
+ assert_help "rtk vitest" rtk vitest
380
+
381
+ # ── 26. Docker / Kubectl (help only) ────────────────
382
+
383
+ section "Docker / Kubectl (help only)"
384
+
385
+ assert_help "rtk docker" rtk docker
386
+ assert_help "rtk kubectl" rtk kubectl
387
+
388
+ # ── 27. Python (conditional) ────────────────────────
389
+
390
+ section "Python (conditional)"
391
+
392
+ if command -v pytest &>/dev/null; then
393
+ assert_help "rtk pytest" rtk pytest --help
394
+ else
395
+ skip_test "rtk pytest" "pytest not installed"
396
+ fi
397
+
398
+ if command -v ruff &>/dev/null; then
399
+ assert_help "rtk ruff" rtk ruff --help
400
+ else
401
+ skip_test "rtk ruff" "ruff not installed"
402
+ fi
403
+
404
+ if command -v pip &>/dev/null; then
405
+ assert_help "rtk pip" rtk pip --help
406
+ else
407
+ skip_test "rtk pip" "pip not installed"
408
+ fi
409
+
410
+ # ── 28. Go (conditional) ────────────────────────────
411
+
412
+ section "Go (conditional)"
413
+
414
+ if command -v go &>/dev/null; then
415
+ assert_help "rtk go" rtk go --help
416
+ assert_help "rtk go test" rtk go test -h
417
+ assert_help "rtk go build" rtk go build -h
418
+ assert_help "rtk go vet" rtk go vet -h
419
+ else
420
+ skip_test "rtk go" "go not installed"
421
+ fi
422
+
423
+ if command -v golangci-lint &>/dev/null; then
424
+ assert_help "rtk golangci-lint" rtk golangci-lint --help
425
+ else
426
+ skip_test "rtk golangci-lint" "golangci-lint not installed"
427
+ fi
428
+
429
+ # ── 29. Graphite (conditional) ─────────────────────
430
+
431
+ section "Graphite (conditional)"
432
+
433
+ if command -v gt &>/dev/null; then
434
+ assert_help "rtk gt" rtk gt --help
435
+ assert_ok "rtk gt log short" rtk gt log short
436
+ else
437
+ skip "gt not installed"
438
+ fi
439
+
440
+ # ── 30. Global flags ────────────────────────────────
441
+
442
+ section "Global flags"
443
+
444
+ assert_ok "rtk -u ls ." rtk -u ls .
445
+ assert_ok "rtk --skip-env npm --help" rtk --skip-env npm --help
446
+
447
+ # ── 31. CcEconomics ─────────────────────────────────
448
+
449
+ section "CcEconomics"
450
+
451
+ assert_ok "rtk cc-economics" rtk cc-economics
452
+
453
+ # ── 32. Learn ───────────────────────────────────────
454
+
455
+ section "Learn"
456
+
457
+ assert_ok "rtk learn --help" rtk learn --help
458
+ assert_ok "rtk learn (no sessions)" rtk learn --since 0 2>&1 || true
459
+
460
+ # ── 32. Rewrite ───────────────────────────────────────
461
+
462
+ section "Rewrite"
463
+
464
+ assert_contains "rewrite git status" "rtk git status" rtk rewrite "git status"
465
+ assert_contains "rewrite cargo test" "rtk cargo test" rtk rewrite "cargo test"
466
+ assert_contains "rewrite compound &&" "rtk git status" rtk rewrite "git status && cargo test"
467
+ assert_contains "rewrite pipe preserves" "| head" rtk rewrite "git log | head"
468
+
469
+ section "Rewrite (#345: RTK_DISABLED skip)"
470
+
471
+ assert_fails "rewrite RTK_DISABLED=1 skip" rtk rewrite "RTK_DISABLED=1 git status"
472
+ assert_fails "rewrite env RTK_DISABLED skip" rtk rewrite "FOO=1 RTK_DISABLED=1 cargo test"
473
+
474
+ section "Rewrite (#346: 2>&1 preserved)"
475
+
476
+ assert_contains "rewrite 2>&1 preserved" "2>&1" rtk rewrite "cargo test 2>&1 | head"
477
+
478
+ section "Rewrite (#196: gh --json skip)"
479
+
480
+ assert_fails "rewrite gh --json skip" rtk rewrite "gh pr list --json number"
481
+ assert_fails "rewrite gh --jq skip" rtk rewrite "gh api /repos --jq .name"
482
+ assert_fails "rewrite gh --template skip" rtk rewrite "gh pr view 1 --template '{{.title}}'"
483
+ assert_contains "rewrite gh normal works" "rtk gh pr list" rtk rewrite "gh pr list"
484
+
485
+ # ── 33. Verify ────────────────────────────────────────
486
+
487
+ section "Verify"
488
+
489
+ assert_ok "rtk verify" rtk verify
490
+
491
+ # ── 34. Proxy ─────────────────────────────────────────
492
+
493
+ section "Proxy"
494
+
495
+ assert_ok "rtk proxy echo hello" rtk proxy echo hello
496
+ assert_contains "rtk proxy passthrough" "hello" rtk proxy echo hello
497
+
498
+ # ── 35. Discover ──────────────────────────────────────
499
+
500
+ section "Discover"
501
+
502
+ assert_ok "rtk discover" rtk discover
503
+
504
+ # ── 36. Diff ──────────────────────────────────────────
505
+
506
+ section "Diff"
507
+
508
+ assert_ok "rtk diff two files" rtk diff Cargo.toml LICENSE
509
+
510
+ # ── 37. Wc ────────────────────────────────────────────
511
+
512
+ section "Wc"
513
+
514
+ assert_ok "rtk wc Cargo.toml" rtk wc Cargo.toml
515
+
516
+ # ── 38. Smart ─────────────────────────────────────────
517
+
518
+ section "Smart"
519
+
520
+ assert_ok "rtk smart src/main.rs" rtk smart src/main.rs
521
+
522
+ # ── 39. Json edge cases ──────────────────────────────
523
+
524
+ section "Json (edge cases)"
525
+
526
+ assert_fails "rtk json on TOML (#347)" rtk json Cargo.toml
527
+
528
+ # ── 40. Docker (conditional) ─────────────────────────
529
+
530
+ section "Docker (conditional)"
531
+
532
+ if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
533
+ assert_ok "rtk docker ps" rtk docker ps
534
+ assert_ok "rtk docker images" rtk docker images
535
+ else
536
+ skip_test "rtk docker" "docker not running"
537
+ fi
538
+
539
+ # ── 41. Hook check ───────────────────────────────────
540
+
541
+ section "Hook check (#344)"
542
+
543
+ assert_contains "rtk init --show hook version" "version" rtk init --show
544
+
545
+ # ══════════════════════════════════════════════════════
546
+ # Report
547
+ # ══════════════════════════════════════════════════════
548
+
549
+ printf "\n${BOLD}══════════════════════════════════════${NC}\n"
550
+ printf "${BOLD}Results: ${GREEN}%d passed${NC}, ${RED}%d failed${NC}, ${YELLOW}%d skipped${NC}\n" "$PASS" "$FAIL" "$SKIP"
551
+
552
+ if [[ ${#FAILURES[@]} -gt 0 ]]; then
553
+ printf "\n${RED}Failures:${NC}\n"
554
+ for f in "${FAILURES[@]}"; do
555
+ printf " - %s\n" "$f"
556
+ done
557
+ fi
558
+
559
+ printf "${BOLD}══════════════════════════════════════${NC}\n"
560
+
561
+ exit "$FAIL"