@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.
- package/dist/cli.js +52 -21
- package/package.json +1 -1
- package/src/ai.ts +77 -130
- package/src/cli.tsx +51 -21
- package/src/command-validator.ts +11 -0
- package/src/context-hints.ts +291 -0
- package/src/discover.ts +238 -0
- package/src/economy.ts +53 -0
- package/src/output-processor.ts +7 -18
- package/src/output-store.ts +65 -0
- package/src/providers/base.ts +3 -1
- package/src/providers/groq.ts +108 -0
- package/src/providers/index.ts +26 -2
- package/src/providers/providers.test.ts +4 -2
- package/src/providers/xai.ts +108 -0
- package/src/sessions-db.ts +81 -0
- package/temp/rtk/.claude/agents/code-reviewer.md +221 -0
- package/temp/rtk/.claude/agents/debugger.md +519 -0
- package/temp/rtk/.claude/agents/rtk-testing-specialist.md +461 -0
- package/temp/rtk/.claude/agents/rust-rtk.md +511 -0
- package/temp/rtk/.claude/agents/technical-writer.md +355 -0
- package/temp/rtk/.claude/commands/diagnose.md +352 -0
- package/temp/rtk/.claude/commands/test-routing.md +362 -0
- package/temp/rtk/.claude/hooks/bash/pre-commit-format.sh +16 -0
- package/temp/rtk/.claude/hooks/rtk-rewrite.sh +70 -0
- package/temp/rtk/.claude/hooks/rtk-suggest.sh +152 -0
- package/temp/rtk/.claude/rules/cli-testing.md +526 -0
- package/temp/rtk/.claude/skills/issue-triage/SKILL.md +348 -0
- package/temp/rtk/.claude/skills/issue-triage/templates/issue-comment.md +134 -0
- package/temp/rtk/.claude/skills/performance.md +435 -0
- package/temp/rtk/.claude/skills/pr-triage/SKILL.md +315 -0
- package/temp/rtk/.claude/skills/pr-triage/templates/review-comment.md +71 -0
- package/temp/rtk/.claude/skills/repo-recap.md +206 -0
- package/temp/rtk/.claude/skills/rtk-tdd/SKILL.md +78 -0
- package/temp/rtk/.claude/skills/rtk-tdd/references/testing-patterns.md +124 -0
- package/temp/rtk/.claude/skills/security-guardian.md +503 -0
- package/temp/rtk/.claude/skills/ship.md +404 -0
- package/temp/rtk/.github/workflows/benchmark.yml +34 -0
- package/temp/rtk/.github/workflows/dco-check.yaml +12 -0
- package/temp/rtk/.github/workflows/release-please.yml +51 -0
- package/temp/rtk/.github/workflows/release.yml +343 -0
- package/temp/rtk/.github/workflows/security-check.yml +135 -0
- package/temp/rtk/.github/workflows/validate-docs.yml +78 -0
- package/temp/rtk/.release-please-manifest.json +3 -0
- package/temp/rtk/ARCHITECTURE.md +1491 -0
- package/temp/rtk/CHANGELOG.md +640 -0
- package/temp/rtk/CLAUDE.md +605 -0
- package/temp/rtk/CONTRIBUTING.md +199 -0
- package/temp/rtk/Cargo.lock +1668 -0
- package/temp/rtk/Cargo.toml +64 -0
- package/temp/rtk/Formula/rtk.rb +43 -0
- package/temp/rtk/INSTALL.md +390 -0
- package/temp/rtk/LICENSE +21 -0
- package/temp/rtk/README.md +386 -0
- package/temp/rtk/README_es.md +159 -0
- package/temp/rtk/README_fr.md +197 -0
- package/temp/rtk/README_ja.md +159 -0
- package/temp/rtk/README_ko.md +159 -0
- package/temp/rtk/README_zh.md +167 -0
- package/temp/rtk/ROADMAP.md +15 -0
- package/temp/rtk/SECURITY.md +217 -0
- package/temp/rtk/TEST_EXEC_TIME.md +102 -0
- package/temp/rtk/build.rs +57 -0
- package/temp/rtk/docs/AUDIT_GUIDE.md +432 -0
- package/temp/rtk/docs/FEATURES.md +1410 -0
- package/temp/rtk/docs/TROUBLESHOOTING.md +309 -0
- package/temp/rtk/docs/filter-workflow.md +102 -0
- package/temp/rtk/docs/images/gain-dashboard.jpg +0 -0
- package/temp/rtk/docs/tracking.md +583 -0
- package/temp/rtk/hooks/opencode-rtk.ts +39 -0
- package/temp/rtk/hooks/rtk-awareness.md +29 -0
- package/temp/rtk/hooks/rtk-rewrite.sh +61 -0
- package/temp/rtk/hooks/test-rtk-rewrite.sh +442 -0
- package/temp/rtk/install.sh +124 -0
- package/temp/rtk/release-please-config.json +10 -0
- package/temp/rtk/scripts/benchmark.sh +592 -0
- package/temp/rtk/scripts/check-installation.sh +162 -0
- package/temp/rtk/scripts/install-local.sh +37 -0
- package/temp/rtk/scripts/rtk-economics.sh +137 -0
- package/temp/rtk/scripts/test-all.sh +561 -0
- package/temp/rtk/scripts/test-aristote.sh +227 -0
- package/temp/rtk/scripts/test-tracking.sh +79 -0
- package/temp/rtk/scripts/update-readme-metrics.sh +32 -0
- package/temp/rtk/scripts/validate-docs.sh +73 -0
- package/temp/rtk/src/aws_cmd.rs +880 -0
- package/temp/rtk/src/binlog.rs +1645 -0
- package/temp/rtk/src/cargo_cmd.rs +1727 -0
- package/temp/rtk/src/cc_economics.rs +1157 -0
- package/temp/rtk/src/ccusage.rs +340 -0
- package/temp/rtk/src/config.rs +187 -0
- package/temp/rtk/src/container.rs +855 -0
- package/temp/rtk/src/curl_cmd.rs +134 -0
- package/temp/rtk/src/deps.rs +268 -0
- package/temp/rtk/src/diff_cmd.rs +367 -0
- package/temp/rtk/src/discover/mod.rs +274 -0
- package/temp/rtk/src/discover/provider.rs +388 -0
- package/temp/rtk/src/discover/registry.rs +2022 -0
- package/temp/rtk/src/discover/report.rs +202 -0
- package/temp/rtk/src/discover/rules.rs +667 -0
- package/temp/rtk/src/display_helpers.rs +402 -0
- package/temp/rtk/src/dotnet_cmd.rs +1771 -0
- package/temp/rtk/src/dotnet_format_report.rs +133 -0
- package/temp/rtk/src/dotnet_trx.rs +593 -0
- package/temp/rtk/src/env_cmd.rs +204 -0
- package/temp/rtk/src/filter.rs +462 -0
- package/temp/rtk/src/filters/README.md +52 -0
- package/temp/rtk/src/filters/ansible-playbook.toml +34 -0
- package/temp/rtk/src/filters/basedpyright.toml +47 -0
- package/temp/rtk/src/filters/biome.toml +45 -0
- package/temp/rtk/src/filters/brew-install.toml +37 -0
- package/temp/rtk/src/filters/composer-install.toml +40 -0
- package/temp/rtk/src/filters/df.toml +16 -0
- package/temp/rtk/src/filters/dotnet-build.toml +64 -0
- package/temp/rtk/src/filters/du.toml +16 -0
- package/temp/rtk/src/filters/fail2ban-client.toml +15 -0
- package/temp/rtk/src/filters/gcc.toml +49 -0
- package/temp/rtk/src/filters/gcloud.toml +22 -0
- package/temp/rtk/src/filters/hadolint.toml +24 -0
- package/temp/rtk/src/filters/helm.toml +29 -0
- package/temp/rtk/src/filters/iptables.toml +27 -0
- package/temp/rtk/src/filters/jj.toml +28 -0
- package/temp/rtk/src/filters/jq.toml +24 -0
- package/temp/rtk/src/filters/make.toml +41 -0
- package/temp/rtk/src/filters/markdownlint.toml +24 -0
- package/temp/rtk/src/filters/mix-compile.toml +27 -0
- package/temp/rtk/src/filters/mix-format.toml +15 -0
- package/temp/rtk/src/filters/mvn-build.toml +44 -0
- package/temp/rtk/src/filters/oxlint.toml +43 -0
- package/temp/rtk/src/filters/ping.toml +63 -0
- package/temp/rtk/src/filters/pio-run.toml +40 -0
- package/temp/rtk/src/filters/poetry-install.toml +50 -0
- package/temp/rtk/src/filters/pre-commit.toml +35 -0
- package/temp/rtk/src/filters/ps.toml +16 -0
- package/temp/rtk/src/filters/quarto-render.toml +41 -0
- package/temp/rtk/src/filters/rsync.toml +48 -0
- package/temp/rtk/src/filters/shellcheck.toml +27 -0
- package/temp/rtk/src/filters/shopify-theme.toml +29 -0
- package/temp/rtk/src/filters/skopeo.toml +45 -0
- package/temp/rtk/src/filters/sops.toml +16 -0
- package/temp/rtk/src/filters/ssh.toml +44 -0
- package/temp/rtk/src/filters/stat.toml +34 -0
- package/temp/rtk/src/filters/swift-build.toml +41 -0
- package/temp/rtk/src/filters/systemctl-status.toml +33 -0
- package/temp/rtk/src/filters/terraform-plan.toml +35 -0
- package/temp/rtk/src/filters/tofu-fmt.toml +16 -0
- package/temp/rtk/src/filters/tofu-init.toml +38 -0
- package/temp/rtk/src/filters/tofu-plan.toml +35 -0
- package/temp/rtk/src/filters/tofu-validate.toml +17 -0
- package/temp/rtk/src/filters/trunk-build.toml +39 -0
- package/temp/rtk/src/filters/ty.toml +50 -0
- package/temp/rtk/src/filters/uv-sync.toml +37 -0
- package/temp/rtk/src/filters/xcodebuild.toml +99 -0
- package/temp/rtk/src/filters/yamllint.toml +25 -0
- package/temp/rtk/src/find_cmd.rs +598 -0
- package/temp/rtk/src/format_cmd.rs +386 -0
- package/temp/rtk/src/gain.rs +723 -0
- package/temp/rtk/src/gh_cmd.rs +1651 -0
- package/temp/rtk/src/git.rs +2012 -0
- package/temp/rtk/src/go_cmd.rs +592 -0
- package/temp/rtk/src/golangci_cmd.rs +254 -0
- package/temp/rtk/src/grep_cmd.rs +288 -0
- package/temp/rtk/src/gt_cmd.rs +810 -0
- package/temp/rtk/src/hook_audit_cmd.rs +283 -0
- package/temp/rtk/src/hook_check.rs +171 -0
- package/temp/rtk/src/init.rs +1859 -0
- package/temp/rtk/src/integrity.rs +537 -0
- package/temp/rtk/src/json_cmd.rs +231 -0
- package/temp/rtk/src/learn/detector.rs +628 -0
- package/temp/rtk/src/learn/mod.rs +119 -0
- package/temp/rtk/src/learn/report.rs +184 -0
- package/temp/rtk/src/lint_cmd.rs +694 -0
- package/temp/rtk/src/local_llm.rs +316 -0
- package/temp/rtk/src/log_cmd.rs +248 -0
- package/temp/rtk/src/ls.rs +324 -0
- package/temp/rtk/src/main.rs +2482 -0
- package/temp/rtk/src/mypy_cmd.rs +389 -0
- package/temp/rtk/src/next_cmd.rs +241 -0
- package/temp/rtk/src/npm_cmd.rs +236 -0
- package/temp/rtk/src/parser/README.md +267 -0
- package/temp/rtk/src/parser/error.rs +46 -0
- package/temp/rtk/src/parser/formatter.rs +336 -0
- package/temp/rtk/src/parser/mod.rs +311 -0
- package/temp/rtk/src/parser/types.rs +119 -0
- package/temp/rtk/src/pip_cmd.rs +302 -0
- package/temp/rtk/src/playwright_cmd.rs +479 -0
- package/temp/rtk/src/pnpm_cmd.rs +573 -0
- package/temp/rtk/src/prettier_cmd.rs +221 -0
- package/temp/rtk/src/prisma_cmd.rs +482 -0
- package/temp/rtk/src/psql_cmd.rs +382 -0
- package/temp/rtk/src/pytest_cmd.rs +384 -0
- package/temp/rtk/src/read.rs +217 -0
- package/temp/rtk/src/rewrite_cmd.rs +50 -0
- package/temp/rtk/src/ruff_cmd.rs +402 -0
- package/temp/rtk/src/runner.rs +271 -0
- package/temp/rtk/src/summary.rs +297 -0
- package/temp/rtk/src/tee.rs +405 -0
- package/temp/rtk/src/telemetry.rs +248 -0
- package/temp/rtk/src/toml_filter.rs +1655 -0
- package/temp/rtk/src/tracking.rs +1416 -0
- package/temp/rtk/src/tree.rs +209 -0
- package/temp/rtk/src/tsc_cmd.rs +259 -0
- package/temp/rtk/src/utils.rs +432 -0
- package/temp/rtk/src/verify_cmd.rs +47 -0
- package/temp/rtk/src/vitest_cmd.rs +385 -0
- package/temp/rtk/src/wc_cmd.rs +401 -0
- package/temp/rtk/src/wget_cmd.rs +260 -0
- package/temp/rtk/tests/fixtures/dotnet/build_failed.txt +11 -0
- package/temp/rtk/tests/fixtures/dotnet/format_changes.json +31 -0
- package/temp/rtk/tests/fixtures/dotnet/format_empty.json +1 -0
- package/temp/rtk/tests/fixtures/dotnet/format_success.json +12 -0
- package/temp/rtk/tests/fixtures/dotnet/test_failed.txt +18 -0
- package/dist/App.js +0 -404
- package/dist/Browse.js +0 -79
- package/dist/FuzzyPicker.js +0 -47
- package/dist/Onboarding.js +0 -51
- package/dist/Spinner.js +0 -12
- package/dist/StatusBar.js +0 -49
- package/dist/ai.js +0 -368
- package/dist/cache.js +0 -41
- package/dist/command-rewriter.js +0 -64
- package/dist/command-validator.js +0 -77
- package/dist/compression.js +0 -107
- package/dist/diff-cache.js +0 -107
- package/dist/economy.js +0 -79
- package/dist/expand-store.js +0 -38
- package/dist/file-cache.js +0 -72
- package/dist/file-index.js +0 -62
- package/dist/history.js +0 -62
- package/dist/lazy-executor.js +0 -54
- package/dist/line-dedup.js +0 -59
- package/dist/loop-detector.js +0 -75
- package/dist/mcp/install.js +0 -98
- package/dist/mcp/server.js +0 -569
- package/dist/noise-filter.js +0 -86
- package/dist/output-processor.js +0 -136
- package/dist/output-router.js +0 -41
- package/dist/parsers/base.js +0 -2
- package/dist/parsers/build.js +0 -64
- package/dist/parsers/errors.js +0 -101
- package/dist/parsers/files.js +0 -78
- package/dist/parsers/git.js +0 -99
- package/dist/parsers/index.js +0 -48
- package/dist/parsers/tests.js +0 -89
- package/dist/providers/anthropic.js +0 -39
- package/dist/providers/base.js +0 -4
- package/dist/providers/cerebras.js +0 -95
- package/dist/providers/index.js +0 -49
- package/dist/recipes/model.js +0 -20
- package/dist/recipes/storage.js +0 -136
- package/dist/search/content-search.js +0 -68
- package/dist/search/file-search.js +0 -61
- package/dist/search/filters.js +0 -34
- package/dist/search/index.js +0 -5
- package/dist/search/semantic.js +0 -320
- package/dist/session-boot.js +0 -59
- package/dist/session-context.js +0 -55
- package/dist/sessions-db.js +0 -120
- package/dist/smart-display.js +0 -286
- package/dist/snapshots.js +0 -51
- package/dist/supervisor.js +0 -112
- package/dist/test-watchlist.js +0 -131
- package/dist/tree.js +0 -94
- package/dist/usage-cache.js +0 -65
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
---
|
|
@@ -0,0 +1,217 @@
|
|
|
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
|
|
@@ -0,0 +1,102 @@
|
|
|
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**
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
}
|