@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,52 +0,0 @@
1
- # Built-in Filters
2
-
3
- Each `.toml` file in this directory defines one filter and its inline tests.
4
- Files are concatenated alphabetically by `build.rs` into a single TOML blob embedded in the binary.
5
-
6
- ## Adding a filter
7
-
8
- 1. Copy any existing `.toml` file and rename it (e.g. `my-tool.toml`)
9
- 2. Update the three required fields: `description`, `match_command`, and at least one action field
10
- 3. Add `[[tests.my-tool]]` entries to verify the filter behaves correctly
11
- 4. Run `cargo test` — the build step validates TOML syntax and runs inline tests
12
-
13
- ## File format
14
-
15
- ```toml
16
- [filters.my-tool]
17
- description = "Short description of what this filter does"
18
- match_command = "^my-tool\\b" # regex matched against the full command string
19
- strip_ansi = true # optional: strip ANSI escape codes first
20
- strip_lines_matching = [ # optional: drop lines matching any of these regexes
21
- "^\\s*$",
22
- "^noise pattern",
23
- ]
24
- max_lines = 40 # optional: keep only the first N lines after filtering
25
- on_empty = "my-tool: ok" # optional: message to emit when output is empty after filtering
26
-
27
- [[tests.my-tool]]
28
- name = "descriptive test name"
29
- input = "raw command output here"
30
- expected = "expected filtered output"
31
- ```
32
-
33
- ## Available filter fields
34
-
35
- | Field | Type | Description |
36
- |-------|------|-------------|
37
- | `description` | string | Human-readable description |
38
- | `match_command` | regex | Matches the command string (e.g. `"^docker\\s+inspect"`) |
39
- | `strip_ansi` | bool | Strip ANSI escape codes before processing |
40
- | `strip_lines_matching` | regex[] | Drop lines matching any regex |
41
- | `keep_lines_matching` | regex[] | Keep only lines matching at least one regex |
42
- | `replace` | array | Regex substitutions (`{ pattern, replacement }`) |
43
- | `match_output` | array | Short-circuit rules (`{ pattern, message }`) |
44
- | `truncate_lines_at` | int | Truncate lines longer than N characters |
45
- | `max_lines` | int | Keep only the first N lines |
46
- | `tail_lines` | int | Keep only the last N lines (applied after other filters) |
47
- | `on_empty` | string | Fallback message when filtered output is empty |
48
-
49
- ## Naming convention
50
-
51
- Use the command name as the filename: `terraform-plan.toml`, `docker-inspect.toml`, `mix-compile.toml`.
52
- For commands with subcommands, prefer `<cmd>-<subcommand>.toml` over grouping multiple filters in one file.
@@ -1,34 +0,0 @@
1
- [filters.ansible-playbook]
2
- description = "Compact ansible-playbook output"
3
- match_command = "^ansible-playbook\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^ok: \\[",
8
- "^skipping: \\[",
9
- ]
10
- max_lines = 60
11
-
12
- [[tests.ansible-playbook]]
13
- name = "strips ok and skipping lines, keeps changed and failures"
14
- input = """
15
- PLAY [all] *********************************************************************
16
-
17
- TASK [Gathering Facts] *********************************************************
18
- ok: [web01]
19
- ok: [web02]
20
-
21
- TASK [Install nginx] ***********************************************************
22
- changed: [web01]
23
- skipping: [web02]
24
-
25
- PLAY RECAP *********************************************************************
26
- web01 : ok=2 changed=1 unreachable=0 failed=0
27
- web02 : ok=1 changed=0 unreachable=0 failed=0
28
- """
29
- expected = "PLAY [all] *********************************************************************\nTASK [Gathering Facts] *********************************************************\nTASK [Install nginx] ***********************************************************\nchanged: [web01]\nPLAY RECAP *********************************************************************\nweb01 : ok=2 changed=1 unreachable=0 failed=0\nweb02 : ok=1 changed=0 unreachable=0 failed=0"
30
-
31
- [[tests.ansible-playbook]]
32
- name = "failed task preserved"
33
- input = "TASK [Start service] ***\nfailed: [web01] => {\"msg\": \"Service not found\"}\nPLAY RECAP ***\nweb01 : ok=1 failed=1"
34
- expected = "TASK [Start service] ***\nfailed: [web01] => {\"msg\": \"Service not found\"}\nPLAY RECAP ***\nweb01 : ok=1 failed=1"
@@ -1,47 +0,0 @@
1
- [filters.basedpyright]
2
- description = "Compact basedpyright type checker output — strip blank lines, keep errors"
3
- match_command = "^basedpyright\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^Searching for source files",
8
- "^Found \\d+ source file",
9
- "^Pyright \\d+\\.\\d+",
10
- "^basedpyright \\d+\\.\\d+",
11
- ]
12
- max_lines = 50
13
- on_empty = "basedpyright: ok"
14
-
15
- [[tests.basedpyright]]
16
- name = "strips noise, keeps errors and summary"
17
- input = """
18
- basedpyright 1.22.0
19
- Searching for source files
20
- Found 42 source files
21
-
22
- /home/user/app/main.py
23
- /home/user/app/main.py:10:5 - error: "foo" is not defined (reportUndefinedVariable)
24
- /home/user/app/main.py:25:1 - error: Type "str" is not assignable to type "int" (reportAssignmentType)
25
-
26
- /home/user/app/utils.py
27
- /home/user/app/utils.py:8:9 - warning: Variable "x" is not accessed (reportUnusedVariable)
28
-
29
- 3 errors, 1 warning, 0 informations
30
- """
31
- expected = "/home/user/app/main.py\n /home/user/app/main.py:10:5 - error: \"foo\" is not defined (reportUndefinedVariable)\n /home/user/app/main.py:25:1 - error: Type \"str\" is not assignable to type \"int\" (reportAssignmentType)\n/home/user/app/utils.py\n /home/user/app/utils.py:8:9 - warning: Variable \"x\" is not accessed (reportUnusedVariable)\n3 errors, 1 warning, 0 informations"
32
-
33
- [[tests.basedpyright]]
34
- name = "clean output"
35
- input = """
36
- basedpyright 1.22.0
37
- Searching for source files
38
- Found 10 source files
39
-
40
- 0 errors, 0 warnings, 0 informations
41
- """
42
- expected = "0 errors, 0 warnings, 0 informations"
43
-
44
- [[tests.basedpyright]]
45
- name = "empty input passes through"
46
- input = ""
47
- expected = ""
@@ -1,45 +0,0 @@
1
- [filters.biome]
2
- description = "Compact Biome lint/format output — strip blank lines, keep diagnostics"
3
- match_command = "^biome\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^Checked \\d+ file",
8
- "^Fixed \\d+ file",
9
- "^The following command",
10
- "^Run it with",
11
- ]
12
- max_lines = 50
13
- on_empty = "biome: ok"
14
-
15
- [[tests.biome]]
16
- name = "lint strips noise, keeps diagnostics"
17
- input = """
18
- Checked 42 files in 0.5s
19
-
20
- src/app.tsx:5:3 lint/suspicious/noExplicitAny ━━━━━━━━━━━━━━━━━━━━
21
- × Unexpected any. Specify a different type.
22
- 3 │ interface Props {
23
- 4 │ data: any;
24
- 5 │ ^^^
25
-
26
- src/utils.ts:12:1 lint/complexity/noForEach ━━━━━━━━━━━━━━━━━━━━
27
- × Prefer for...of instead of forEach.
28
- 12 │ items.forEach(item => process(item));
29
- │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
30
-
31
- Found 2 errors.
32
- """
33
- expected = "src/app.tsx:5:3 lint/suspicious/noExplicitAny ━━━━━━━━━━━━━━━━━━━━\n × Unexpected any. Specify a different type.\n 3 │ interface Props {\n 4 │ data: any;\n 5 │ ^^^\nsrc/utils.ts:12:1 lint/complexity/noForEach ━━━━━━━━━━━━━━━━━━━━\n × Prefer for...of instead of forEach.\n 12 │ items.forEach(item => process(item));\n │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFound 2 errors."
34
-
35
- [[tests.biome]]
36
- name = "clean check"
37
- input = """
38
- Checked 42 files in 0.3s
39
- """
40
- expected = "biome: ok"
41
-
42
- [[tests.biome]]
43
- name = "empty input passes through"
44
- input = ""
45
- expected = ""
@@ -1,37 +0,0 @@
1
- [filters.brew-install]
2
- description = "Compact brew install/upgrade output — strip downloads, short-circuit when already installed"
3
- match_command = "^brew\\s+(install|upgrade)\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^==> Downloading",
8
- "^==> Pouring",
9
- "^Already downloaded:",
10
- "^###",
11
- "^==> Fetching",
12
- ]
13
- match_output = [
14
- { pattern = "already installed", message = "ok (already installed)" },
15
- ]
16
- max_lines = 20
17
-
18
- [[tests.brew-install]]
19
- name = "already installed short-circuits"
20
- input = """
21
- Warning: rtk 0.27.1 is already installed and up-to-date.
22
- To reinstall 0.27.1, run:
23
- brew reinstall rtk
24
- """
25
- expected = "ok (already installed)"
26
-
27
- [[tests.brew-install]]
28
- name = "install strips download lines"
29
- input = """
30
- ==> Fetching jq
31
- ==> Downloading https://homebrew.bintray.com/bottles/jq-1.7.1.arm64_sonoma.bottle.tar.gz
32
- ######################################################################## 100.0%
33
- ==> Pouring jq-1.7.1.arm64_sonoma.bottle.tar.gz
34
- ==> Summary
35
- /opt/homebrew/Cellar/jq/1.7.1: 18 files, 1.2MB
36
- """
37
- expected = "==> Summary\n/opt/homebrew/Cellar/jq/1.7.1: 18 files, 1.2MB"
@@ -1,40 +0,0 @@
1
- [filters.composer-install]
2
- description = "Compact composer install/update/require output — strip downloads, short-circuit when up-to-date"
3
- match_command = "^composer\\s+(install|update|require)\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^ - Downloading ",
8
- "^ - Installing ",
9
- "^Loading composer",
10
- "^Updating dependencies",
11
- ]
12
- match_output = [
13
- { pattern = "Nothing to install, update or remove", message = "ok (up to date)" },
14
- ]
15
- max_lines = 30
16
-
17
- [[tests.composer-install]]
18
- name = "nothing to do short-circuits"
19
- input = """
20
- Loading composer repositories with package information
21
- Updating dependencies
22
- Lock file operations: 0 installs, 0 updates, 0 removals
23
- Nothing to install, update or remove
24
- Generating autoload files
25
- """
26
- expected = "ok (up to date)"
27
-
28
- [[tests.composer-install]]
29
- name = "install strips download lines"
30
- input = """
31
- Loading composer repositories with package information
32
- Updating dependencies
33
- - Downloading symfony/console (v6.4.0)
34
- - Installing symfony/console (v6.4.0): Extracting archive
35
- - Downloading psr/log (3.0.0)
36
- - Installing psr/log (3.0.0): Extracting archive
37
- Writing lock file
38
- Generating autoload files
39
- """
40
- expected = "Writing lock file\nGenerating autoload files"
@@ -1,16 +0,0 @@
1
- [filters.df]
2
- description = "Compact df output — truncate wide columns, limit rows"
3
- match_command = "^df(\\s|$)"
4
- strip_ansi = true
5
- truncate_lines_at = 80
6
- max_lines = 20
7
-
8
- [[tests.df]]
9
- name = "short output passes through unchanged"
10
- input = "Filesystem 1K-blocks Used Available Use% Mounted on\n/dev/sda1 4096000 123456 3972544 4% /"
11
- expected = "Filesystem 1K-blocks Used Available Use% Mounted on\n/dev/sda1 4096000 123456 3972544 4% /"
12
-
13
- [[tests.df]]
14
- name = "empty input passes through"
15
- input = ""
16
- expected = ""
@@ -1,64 +0,0 @@
1
- [filters.dotnet-build]
2
- description = "Compact dotnet build output — short-circuit on success, strip banners"
3
- match_command = "^dotnet\\s+build\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^Microsoft \\(R\\)",
8
- "^Copyright \\(C\\)",
9
- "^ Determining projects",
10
- ]
11
- match_output = [
12
- { pattern = "0 Warning\\(s\\)\\n\\s+0 Error\\(s\\)", message = "ok (build succeeded)" },
13
- ]
14
- max_lines = 40
15
-
16
- [[tests.dotnet-build]]
17
- name = "successful build short-circuits to ok"
18
- input = """
19
- Microsoft (R) Build Engine version 17.8.3+195e7f5a3
20
- Copyright (C) Microsoft Corporation. All rights reserved.
21
-
22
- Determining projects to restore...
23
- All projects are up-to-date for restore.
24
- MyApp -> /home/user/MyApp/bin/Debug/net8.0/MyApp.dll
25
-
26
- Build succeeded.
27
- 0 Warning(s)
28
- 0 Error(s)
29
-
30
- Time Elapsed 00:00:02.34
31
- """
32
- expected = "ok (build succeeded)"
33
-
34
- [[tests.dotnet-build]]
35
- name = "build with warnings not short-circuited"
36
- input = """
37
- Microsoft (R) Build Engine version 17.8.3+195e7f5a3
38
- Copyright (C) Microsoft Corporation. All rights reserved.
39
-
40
- Determining projects to restore...
41
- MyApp -> /home/user/MyApp/bin/Debug/net8.0/MyApp.dll
42
-
43
- Build succeeded.
44
- 3 Warning(s)
45
- 0 Error(s)
46
-
47
- Time Elapsed 00:00:01.87
48
- """
49
- expected = " MyApp -> /home/user/MyApp/bin/Debug/net8.0/MyApp.dll\nBuild succeeded.\n 3 Warning(s)\n 0 Error(s)\nTime Elapsed 00:00:01.87"
50
-
51
- [[tests.dotnet-build]]
52
- name = "build errors pass through"
53
- input = """
54
- Microsoft (R) Build Engine version 17.8.3+195e7f5a3
55
- Copyright (C) Microsoft Corporation. All rights reserved.
56
-
57
- Determining projects to restore...
58
- src/Program.cs(10,5): error CS1002: ; expected [/home/user/MyApp/MyApp.csproj]
59
-
60
- Build FAILED.
61
- 0 Warning(s)
62
- 1 Error(s)
63
- """
64
- expected = "src/Program.cs(10,5): error CS1002: ; expected [/home/user/MyApp/MyApp.csproj]\nBuild FAILED.\n 0 Warning(s)\n 1 Error(s)"
@@ -1,16 +0,0 @@
1
- [filters.du]
2
- description = "Compact du output"
3
- match_command = "^du\\b"
4
- strip_lines_matching = ["^\\s*$"]
5
- truncate_lines_at = 120
6
- max_lines = 40
7
-
8
- [[tests.du]]
9
- name = "preserves sizes, strips blank lines"
10
- input = "4.0K\t./src\n\n8.0K\t./tests\n16K\t."
11
- expected = "4.0K\t./src\n8.0K\t./tests\n16K\t."
12
-
13
- [[tests.du]]
14
- name = "single line passthrough"
15
- input = "128K\t."
16
- expected = "128K\t."
@@ -1,15 +0,0 @@
1
- [filters.fail2ban-client]
2
- description = "Compact fail2ban-client output"
3
- match_command = "^fail2ban-client\\b"
4
- strip_lines_matching = ["^\\s*$"]
5
- max_lines = 30
6
-
7
- [[tests.fail2ban-client]]
8
- name = "strips blank lines"
9
- input = "Status for the jail: sshd\n|- Filter\n| |- Currently failed: 3\n\n|- Actions\n `- Total banned: 42"
10
- expected = "Status for the jail: sshd\n|- Filter\n| |- Currently failed: 3\n|- Actions\n `- Total banned: 42"
11
-
12
- [[tests.fail2ban-client]]
13
- name = "single line passthrough"
14
- input = "Shutdown successful"
15
- expected = "Shutdown successful"
@@ -1,49 +0,0 @@
1
- [filters.gcc]
2
- description = "Compact gcc/g++ compiler output — strip notes, keep errors and warnings"
3
- match_command = "^g(cc|\\+\\+)\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^\\s+\\|\\s*$",
8
- "^In file included from",
9
- "^\\s+from\\s",
10
- "^\\d+ warnings? generated",
11
- "^\\d+ errors? generated",
12
- ]
13
- max_lines = 50
14
- on_empty = "gcc: ok"
15
-
16
- [[tests.gcc]]
17
- name = "strips include chain, keeps errors and warnings"
18
- input = """
19
- In file included from /usr/include/stdio.h:42:
20
- from main.c:1:
21
- main.c:10:5: error: use of undeclared identifier 'foo'
22
- foo();
23
- ^
24
- main.c:15:12: warning: unused variable 'x' [-Wunused-variable]
25
- int x = 42;
26
- ^
27
- 2 warnings generated.
28
- 1 error generated.
29
- """
30
- expected = "main.c:10:5: error: use of undeclared identifier 'foo'\n foo();\n ^\nmain.c:15:12: warning: unused variable 'x' [-Wunused-variable]\n int x = 42;\n ^"
31
-
32
- [[tests.gcc]]
33
- name = "clean compilation"
34
- input = """
35
- """
36
- expected = "gcc: ok"
37
-
38
- [[tests.gcc]]
39
- name = "linker error kept"
40
- input = """
41
- /usr/bin/ld: /tmp/main.o: undefined reference to 'missing_func'
42
- collect2: error: ld returned 1 exit status
43
- """
44
- expected = "/usr/bin/ld: /tmp/main.o: undefined reference to 'missing_func'\ncollect2: error: ld returned 1 exit status"
45
-
46
- [[tests.gcc]]
47
- name = "empty input passes through"
48
- input = ""
49
- expected = ""
@@ -1,22 +0,0 @@
1
- [filters.gcloud]
2
- description = "Compact gcloud output"
3
- match_command = "^gcloud\\b"
4
- strip_ansi = true
5
- strip_lines_matching = ["^\\s*$"]
6
- truncate_lines_at = 120
7
- max_lines = 30
8
-
9
- [[tests.gcloud]]
10
- name = "strips blank lines, preserves output"
11
- input = """
12
- Updated property [core/project].
13
-
14
- NAME REGION STATUS
15
- my-cluster us-central1 RUNNING
16
- """
17
- expected = "Updated property [core/project].\nNAME REGION STATUS\nmy-cluster us-central1 RUNNING"
18
-
19
- [[tests.gcloud]]
20
- name = "single line passthrough"
21
- input = "Listed 0 items."
22
- expected = "Listed 0 items."
@@ -1,24 +0,0 @@
1
- [filters.hadolint]
2
- description = "Compact hadolint Dockerfile linting output"
3
- match_command = "^hadolint\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- ]
8
- truncate_lines_at = 120
9
- max_lines = 40
10
-
11
- [[tests.hadolint]]
12
- name = "Dockerfile warnings kept, blank lines stripped"
13
- input = """
14
- Dockerfile:3 DL3008 warning: Pin versions in apt-get install
15
- Dockerfile:5 DL3009 info: Delete apt-get lists after installing
16
-
17
- Dockerfile:8 DL4006 warning: Set SHELL option -o pipefail before RUN with pipe
18
- """
19
- expected = "Dockerfile:3 DL3008 warning: Pin versions in apt-get install\nDockerfile:5 DL3009 info: Delete apt-get lists after installing\nDockerfile:8 DL4006 warning: Set SHELL option -o pipefail before RUN with pipe"
20
-
21
- [[tests.hadolint]]
22
- name = "empty input passes through"
23
- input = ""
24
- expected = ""
@@ -1,29 +0,0 @@
1
- [filters.helm]
2
- description = "Compact helm output"
3
- match_command = "^helm\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^W\\d{4}",
8
- ]
9
- truncate_lines_at = 120
10
- max_lines = 40
11
-
12
- [[tests.helm]]
13
- name = "strips blank lines, preserves release info"
14
- input = """
15
- NAME: my-release
16
- LAST DEPLOYED: Mon Jan 15 10:30:00 2024
17
- NAMESPACE: default
18
- STATUS: deployed
19
- REVISION: 3
20
-
21
- NOTES:
22
- Application is running.
23
- """
24
- expected = "NAME: my-release\nLAST DEPLOYED: Mon Jan 15 10:30:00 2024\nNAMESPACE: default\nSTATUS: deployed\nREVISION: 3\nNOTES:\nApplication is running."
25
-
26
- [[tests.helm]]
27
- name = "strips glog W-prefix warnings"
28
- input = "W0115 10:30:00 warning message from internal\nNAME: my-chart\nSTATUS: deployed"
29
- expected = "NAME: my-chart\nSTATUS: deployed"
@@ -1,27 +0,0 @@
1
- [filters.iptables]
2
- description = "Compact iptables output"
3
- match_command = "^iptables\\b"
4
- strip_lines_matching = [
5
- "^\\s*$",
6
- "^Chain DOCKER",
7
- "^Chain BR-",
8
- ]
9
- max_lines = 50
10
- truncate_lines_at = 120
11
-
12
- [[tests.iptables]]
13
- name = "strips Docker chains, preserves real rules"
14
- input = """
15
- Chain INPUT (policy ACCEPT)
16
- num target prot opt source destination
17
- 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
18
- Chain DOCKER (1 references)
19
- DOCKER all -- 0.0.0.0/0 0.0.0.0/0
20
- Chain BR-abcdef (0 references)
21
- """
22
- expected = "Chain INPUT (policy ACCEPT)\nnum target prot opt source destination\n1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0\n DOCKER all -- 0.0.0.0/0 0.0.0.0/0"
23
-
24
- [[tests.iptables]]
25
- name = "preserves FORWARD and OUTPUT chains"
26
- input = "Chain FORWARD (policy DROP)\n1 ACCEPT tcp\nChain OUTPUT (policy ACCEPT)\n1 ACCEPT all"
27
- expected = "Chain FORWARD (policy DROP)\n1 ACCEPT tcp\nChain OUTPUT (policy ACCEPT)\n1 ACCEPT all"
@@ -1,28 +0,0 @@
1
- [filters.jj]
2
- description = "Compact Jujutsu (jj) output — strip blank lines, truncate"
3
- match_command = "^jj\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- "^Hint:",
8
- "^Working copy now at:",
9
- ]
10
- max_lines = 30
11
- truncate_lines_at = 120
12
-
13
- [[tests.jj]]
14
- name = "log output stripped of hints"
15
- input = """
16
- @ qpvuntsm patrick@example.com 2026-03-10 12:00 abc123
17
- │ feat: add new feature
18
- ◉ zzzzzzzz root()
19
-
20
- Working copy now at: qpvuntsm abc123 feat: add new feature
21
- Hint: use `jj log` to see the full history
22
- """
23
- expected = "@ qpvuntsm patrick@example.com 2026-03-10 12:00 abc123\n│ feat: add new feature\n◉ zzzzzzzz root()"
24
-
25
- [[tests.jj]]
26
- name = "empty input passes through"
27
- input = ""
28
- expected = ""
@@ -1,24 +0,0 @@
1
- [filters.jq]
2
- description = "Compact jq output — truncate large JSON results"
3
- match_command = "^jq\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- ]
8
- max_lines = 40
9
- truncate_lines_at = 120
10
-
11
- [[tests.jq]]
12
- name = "short output passes through"
13
- input = """
14
- {
15
- "name": "test",
16
- "version": "1.0"
17
- }
18
- """
19
- expected = "{\n \"name\": \"test\",\n \"version\": \"1.0\"\n}"
20
-
21
- [[tests.jq]]
22
- name = "empty input passes through"
23
- input = ""
24
- expected = ""
@@ -1,41 +0,0 @@
1
- [filters.make]
2
- description = "Compact make output"
3
- match_command = "^make\\b"
4
- strip_lines_matching = [
5
- "^make\\[\\d+\\]:",
6
- "^\\s*$",
7
- "^Nothing to be done",
8
- ]
9
- max_lines = 50
10
- on_empty = "make: ok"
11
-
12
- [[tests.make]]
13
- name = "strips entering/leaving lines"
14
- input = """
15
- make[1]: Entering directory '/home/user'
16
- gcc -O2 foo.c
17
- make[1]: Leaving directory '/home/user'
18
- """
19
- expected = """
20
- gcc -O2 foo.c
21
- """
22
-
23
- [[tests.make]]
24
- name = "strips blank lines"
25
- input = """
26
- gcc -O2 foo.c
27
-
28
- gcc -O2 bar.c
29
- """
30
- expected = """
31
- gcc -O2 foo.c
32
- gcc -O2 bar.c
33
- """
34
-
35
- [[tests.make]]
36
- name = "on_empty when all stripped"
37
- input = """
38
- make[1]: Entering directory '/home/user'
39
- make[1]: Leaving directory '/home/user'
40
- """
41
- expected = "make: ok"
@@ -1,24 +0,0 @@
1
- [filters.markdownlint]
2
- description = "Compact markdownlint output — strip blank lines, limit rows"
3
- match_command = "^markdownlint\\b"
4
- strip_ansi = true
5
- strip_lines_matching = [
6
- "^\\s*$",
7
- ]
8
- max_lines = 50
9
- truncate_lines_at = 120
10
-
11
- [[tests.markdownlint]]
12
- name = "linting errors stripped of blank lines"
13
- input = """
14
- README.md:1:1 MD041/first-line-heading/first-line-h1 First line in file should be a top level heading
15
- README.md:10:1 MD022/blanks-around-headings Headings should be surrounded by blank lines
16
-
17
- README.md:15:80 MD013/line-length Line length [Expected: 80; Actual: 95]
18
- """
19
- expected = "README.md:1:1 MD041/first-line-heading/first-line-h1 First line in file should be a top level heading\nREADME.md:10:1 MD022/blanks-around-headings Headings should be surrounded by blank lines\nREADME.md:15:80 MD013/line-length Line length [Expected: 80; Actual: 95]"
20
-
21
- [[tests.markdownlint]]
22
- name = "empty input passes through"
23
- input = ""
24
- expected = ""