@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,15 +0,0 @@
1
- # RTK Roadmap -
2
-
3
- Stability & Reliability
4
-
5
- Critical Fixes: Resolve bugs and stabilize Vitest/pnpm support.
6
-
7
- Fork Strategy: Establish the fork as the new standard if upstream remains inactive.
8
-
9
- Pro Tooling: Add a configuration file (TOML) and structured logging.
10
-
11
- Easy Install: Launch a Homebrew formula and pre-compiled binaries for one-click setup.
12
-
13
- Early Adoption: Prove token savings on real projects to onboard the first 5 teams.
14
-
15
- ---
@@ -1,217 +0,0 @@
1
- # Security Policy
2
-
3
- ## Reporting a Vulnerability
4
-
5
- If you discover a security vulnerability in RTK, please report it to the maintainers privately:
6
-
7
- - **Email**: security@rtk-ai.dev (or create a private security advisory on GitHub)
8
- - **Response time**: We aim to acknowledge reports within 48 hours
9
- - **Disclosure**: We follow responsible disclosure practices (90-day embargo)
10
-
11
- **Please do NOT:**
12
- - Open public GitHub issues for security vulnerabilities
13
- - Disclose vulnerabilities on social media or forums before we've had a chance to address them
14
-
15
- ---
16
-
17
- ## Security Review Process for Pull Requests
18
-
19
- RTK is a CLI tool that executes shell commands and handles user input. PRs from external contributors undergo enhanced security review to protect against:
20
-
21
- - **Shell injection** (command execution vulnerabilities)
22
- - **Supply chain attacks** (malicious dependencies)
23
- - **Backdoors** (logic bombs, exfiltration code)
24
- - **Data leaks** (tracking.db exposure, telemetry abuse)
25
-
26
- ---
27
-
28
- ## Automated Security Checks
29
-
30
- Every PR triggers our [`security-check.yml`](.github/workflows/security-check.yml) workflow:
31
-
32
- 1. **Dependency audit** (`cargo audit`) - Detects known CVEs
33
- 2. **Critical files alert** - Flags modifications to high-risk files
34
- 3. **Dangerous pattern scan** - Regex-based detection of:
35
- - Shell execution (`Command::new("sh")`)
36
- - Environment manipulation (`.env("LD_PRELOAD")`)
37
- - Network operations (`reqwest::`, `std::net::`)
38
- - Unsafe code blocks
39
- - Panic-inducing patterns (`.unwrap()` in production)
40
- 4. **Clippy security lints** - Enforces Rust best practices
41
-
42
- Results are posted in the PR's GitHub Actions summary.
43
-
44
- ---
45
-
46
- ## Critical Files Requiring Enhanced Review
47
-
48
- The following files are considered **high-risk** and trigger mandatory 2-reviewer approval:
49
-
50
- ### Tier 1: Shell Execution & System Interaction
51
- - **`src/runner.rs`** - Shell command execution engine (primary injection vector)
52
- - **`src/summary.rs`** - Command output aggregation (data exfiltration risk)
53
- - **`src/tracking.rs`** - SQLite database operations (privacy/telemetry concerns)
54
- - **`src/discover/registry.rs`** - Rewrite logic for all commands (command injection risk via rewrite rules)
55
- - **`hooks/rtk-rewrite.sh`** / **`.claude/hooks/rtk-rewrite.sh`** - Thin delegator hook (executes in Claude Code context, intercepts all commands)
56
-
57
- ### Tier 2: Input Validation
58
- - **`src/pnpm_cmd.rs`** - Package name validation (prevents injection via malicious names)
59
- - **`src/container.rs`** - Docker/container operations (privilege escalation risk)
60
-
61
- ### Tier 3: Supply Chain & CI/CD
62
- - **`Cargo.toml`** - Dependency manifest (typosquatting, backdoored crates)
63
- - **`.github/workflows/*.yml`** - CI/CD pipelines (release tampering, secret exfiltration)
64
-
65
- **If your PR modifies ANY of these files**, expect:
66
- - Detailed manual security review
67
- - Request for clarification on design choices
68
- - Potentially slower merge timeline
69
-
70
- ---
71
-
72
- ## Review Workflow
73
-
74
- ### For External Contributors
75
-
76
- 1. **Submit PR** → Automated `security-check.yml` runs
77
- 2. **Review automated results** → Fix any flagged issues
78
- 3. **Manual review** → Maintainer performs comprehensive security audit
79
- 4. **Approval** → Merge (or request for changes)
80
-
81
- ### For Maintainers
82
-
83
- Use the comprehensive security review process:
84
-
85
- ```bash
86
- # If Claude Code available, run the dedicated skill:
87
- /rtk-pr-security <PR_NUMBER>
88
-
89
- # Manual review (without Claude):
90
- gh pr view <PR_NUMBER>
91
- gh pr diff <PR_NUMBER> > /tmp/pr.diff
92
- bash scripts/detect-dangerous-patterns.sh /tmp/pr.diff
93
- ```
94
-
95
- **Review checklist:**
96
- - [ ] No critical files modified OR changes justified + reviewed by 2 maintainers
97
- - [ ] No dangerous patterns OR patterns explained + safe
98
- - [ ] No new dependencies OR deps audited on crates.io (downloads, maintainer, license)
99
- - [ ] PR description matches actual code changes (intent vs reality)
100
- - [ ] No logic bombs (time-based triggers, conditional backdoors)
101
- - [ ] Code quality acceptable (no unexplained complexity spikes)
102
-
103
- ---
104
-
105
- ## Dangerous Patterns We Check For
106
-
107
- | Pattern | Risk | Example |
108
- |---------|------|---------|
109
- | `Command::new("sh")` | Shell injection | Spawns shell with user input |
110
- | `.env("LD_PRELOAD")` | Library hijacking | Preloads malicious shared libraries |
111
- | `reqwest::`, `std::net::` | Data exfiltration | Unexpected network operations |
112
- | `unsafe {` | Memory safety | Bypasses Rust's guarantees |
113
- | `.unwrap()` in `src/` | DoS via panic | Crashes on invalid input |
114
- | `SystemTime::now() > ...` | Logic bombs | Delayed malicious behavior |
115
- | Base64/hex strings | Obfuscation | Hides malicious URLs/commands |
116
-
117
- See [Dangerous Patterns Reference](https://github.com/rtk-ai/rtk/wiki/Dangerous-Patterns) for exploitation examples.
118
-
119
- ---
120
-
121
- ## Dependency Security
122
-
123
- New dependencies added to `Cargo.toml` must meet these criteria:
124
-
125
- - **Downloads**: >10,000 on crates.io (or strong justification if lower)
126
- - **Maintainer**: Verified GitHub profile + track record of other crates
127
- - **License**: MIT or Apache-2.0 compatible
128
- - **Activity**: Recent commits (within 6 months)
129
- - **No typosquatting**: Manual verification against similar crate names
130
-
131
- **Red flags:**
132
- - Brand new crate (<1 month old) with low downloads
133
- - Anonymous maintainer with no GitHub history
134
- - Crate name suspiciously similar to popular crate (e.g., `serid` vs `serde`)
135
- - License change in recent versions
136
-
137
- ---
138
-
139
- ## Security Best Practices for Contributors
140
-
141
- ### Avoid These Anti-Patterns
142
-
143
- **❌ DON'T:**
144
- ```rust
145
- // Shell injection risk
146
- let user_input = get_arg();
147
- Command::new("sh").arg("-c").arg(format!("echo {}", user_input)).output();
148
-
149
- // Panic on invalid input
150
- let path = std::env::args().nth(1).unwrap();
151
-
152
- // Hardcoded secrets
153
- const API_KEY: &str = "sk_live_1234567890abcdef";
154
- ```
155
-
156
- **✅ DO:**
157
- ```rust
158
- // No shell, direct binary execution
159
- let user_input = get_arg();
160
- Command::new("echo").arg(user_input).output();
161
-
162
- // Graceful error handling
163
- let path = std::env::args().nth(1).context("Missing path argument")?;
164
-
165
- // Env vars or config files for secrets
166
- let api_key = std::env::var("API_KEY").context("API_KEY not set")?;
167
- ```
168
-
169
- ### Error Handling Guidelines
170
-
171
- - Use `anyhow::Result<T>` with `.context()` for all error propagation
172
- - NEVER use `.unwrap()` in `src/` (tests are OK)
173
- - Prefer `.expect("descriptive message")` over `.unwrap()` if unavoidable
174
- - Use `?` operator instead of `unwrap()` for propagation
175
-
176
- ### Input Validation
177
-
178
- - Validate all user input before passing to `Command`
179
- - Use allowlists for command flags (not denylists)
180
- - Canonicalize file paths to prevent traversal attacks
181
- - Sanitize package names with strict regex patterns
182
-
183
- ---
184
-
185
- ## Disclosure Timeline
186
-
187
- When vulnerabilities are reported:
188
-
189
- 1. **Day 0**: Acknowledgment sent to reporter
190
- 2. **Day 7**: Maintainers assess severity and impact
191
- 3. **Day 14**: Patch development begins
192
- 4. **Day 30**: Patch released + CVE filed (if applicable)
193
- 5. **Day 90**: Public disclosure (or earlier if patch is deployed)
194
-
195
- Critical vulnerabilities (remote code execution, data exfiltration) may be fast-tracked.
196
-
197
- ---
198
-
199
- ## Security Tooling
200
-
201
- - **`cargo audit`** - Automated CVE scanning (runs in CI)
202
- - **`cargo deny`** - License compliance + banned dependencies
203
- - **`cargo clippy`** - Lints for unsafe patterns
204
- - **GitHub Dependabot** - Automated dependency updates
205
- - **GitHub Code Scanning** - Static analysis via CodeQL (planned)
206
-
207
- ---
208
-
209
- ## Contact
210
-
211
- - **Security issues**: security@rtk-ai.dev
212
- - **General questions**: https://github.com/rtk-ai/rtk/discussions
213
- - **Maintainers**: @FlorianBruniaux (active fork maintainer)
214
-
215
- ---
216
-
217
- **Last updated**: 2026-03-05
@@ -1,102 +0,0 @@
1
- # Testing Execution Time Tracking
2
-
3
- ## Quick Test
4
-
5
- ```bash
6
- # 1. Install latest version
7
- cargo install --path .
8
-
9
- # 2. Run a few commands to populate data
10
- rtk git status
11
- rtk ls .
12
- rtk grep "tracking" src/
13
-
14
- # 3. Check gain stats (should show execution times)
15
- rtk gain
16
-
17
- # Expected output:
18
- # Total exec time: XX.Xs (avg XXms)
19
- # By Command table should show Time column
20
- ```
21
-
22
- ## Detailed Test Scenarios
23
-
24
- ### 1. Basic Time Tracking
25
- ```bash
26
- # Run commands with different execution times
27
- rtk git log -10 # Fast (~10ms)
28
- rtk cargo test # Slow (~300ms)
29
- rtk vitest run # Very slow (seconds)
30
-
31
- # Verify times are recorded
32
- rtk gain
33
- # Should show different avg times per command
34
- ```
35
-
36
- ### 2. Daily Breakdown
37
- ```bash
38
- rtk gain --daily
39
-
40
- # Expected:
41
- # Date column + Time column showing avg time per day
42
- # Today should have non-zero times
43
- # Historical data shows 0ms (no time recorded)
44
- ```
45
-
46
- ### 3. Export Formats
47
-
48
- **JSON Export:**
49
- ```bash
50
- rtk gain --daily --format json | jq '.summary'
51
-
52
- # Should include:
53
- # "total_time_ms": 12345,
54
- # "avg_time_ms": 67
55
- ```
56
-
57
- **CSV Export:**
58
- ```bash
59
- rtk gain --daily --format csv
60
-
61
- # Headers should include:
62
- # date,commands,input_tokens,...,total_time_ms,avg_time_ms
63
- ```
64
-
65
- ### 4. Multiple Commands
66
- ```bash
67
- # Run 10 commands and measure total time
68
- for i in {1..10}; do rtk git status; done
69
-
70
- rtk gain
71
- # Total exec time should be ~10-50ms (10 × 1-5ms)
72
- ```
73
-
74
- ## Verification Checklist
75
-
76
- - [ ] `rtk gain` shows "Total exec time: X (avg Yms)"
77
- - [ ] By Command table has "Time" column
78
- - [ ] `rtk gain --daily` shows time per day
79
- - [ ] JSON export includes `total_time_ms` and `avg_time_ms`
80
- - [ ] CSV export has time columns
81
- - [ ] New commands show realistic times (not 0ms)
82
- - [ ] Historical data preserved (old entries show 0ms)
83
-
84
- ## Database Schema Verification
85
-
86
- ```bash
87
- # Check SQLite schema includes exec_time_ms
88
- sqlite3 ~/.local/share/rtk/history.db "PRAGMA table_info(commands);"
89
-
90
- # Should show:
91
- # ...
92
- # 7|exec_time_ms|INTEGER|0|0|0
93
- ```
94
-
95
- ## Performance Impact
96
-
97
- The timer adds negligible overhead:
98
- - `Instant::now()` → ~10-50ns
99
- - `elapsed()` → ~10-50ns
100
- - SQLite insert with extra column → ~1-5µs
101
-
102
- Total overhead: **< 0.1ms per command**
package/temp/rtk/build.rs DELETED
@@ -1,57 +0,0 @@
1
- use std::collections::HashSet;
2
- use std::fs;
3
- use std::path::Path;
4
-
5
- fn main() {
6
- let filters_dir = Path::new("src/filters");
7
- let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR must be set by Cargo");
8
- let dest = Path::new(&out_dir).join("builtin_filters.toml");
9
-
10
- // Rebuild when any file in src/filters/ changes
11
- println!("cargo:rerun-if-changed=src/filters");
12
-
13
- let mut files: Vec<_> = fs::read_dir(filters_dir)
14
- .expect("src/filters/ directory must exist")
15
- .filter_map(|e| e.ok())
16
- .filter(|e| e.path().extension().is_some_and(|ext| ext == "toml"))
17
- .collect();
18
-
19
- // Sort alphabetically for deterministic filter ordering
20
- files.sort_by_key(|e| e.file_name());
21
-
22
- let mut combined = String::from("schema_version = 1\n\n");
23
-
24
- for entry in &files {
25
- let content = fs::read_to_string(entry.path())
26
- .unwrap_or_else(|e| panic!("Failed to read {:?}: {}", entry.path(), e));
27
- combined.push_str(&format!(
28
- "# --- {} ---\n",
29
- entry.file_name().to_string_lossy()
30
- ));
31
- combined.push_str(&content);
32
- combined.push_str("\n\n");
33
- }
34
-
35
- // Validate: parse the combined TOML to catch errors at build time
36
- let parsed: toml::Value = combined.parse().unwrap_or_else(|e| {
37
- panic!(
38
- "TOML validation failed for combined filters:\n{}\n\nCheck src/filters/*.toml files",
39
- e
40
- )
41
- });
42
-
43
- // Detect duplicate filter names across files
44
- if let Some(filters) = parsed.get("filters").and_then(|f| f.as_table()) {
45
- let mut seen: HashSet<String> = HashSet::new();
46
- for key in filters.keys() {
47
- if !seen.insert(key.clone()) {
48
- panic!(
49
- "Duplicate filter name '{}' found across src/filters/*.toml files",
50
- key
51
- );
52
- }
53
- }
54
- }
55
-
56
- fs::write(&dest, combined).expect("Failed to write combined builtin_filters.toml");
57
- }