mirror of
https://github.com/rtk-ai/rtk.git
synced 2026-09-19 07:33:17 +08:00
f447a3d5b1
* feat: add `rtk rewrite` command — single source of truth for hook rewrites Implements `rtk rewrite <cmd>` as the canonical rewrite engine for all LLM hook integrations (Claude Code, Gemini CLI, future tools). - Add `rewrite_prefixes` field to `RtkRule` in discover/registry.rs - Add public `rewrite_command()` with compound command support (&&, ||, ;, |) - Add `rewrite_segment()`, `rewrite_compound()`, `strip_word_prefix()` helpers - Handle already-rtk commands (exit 0, identical output) - Handle unsupported/ignored commands (exit 1, no output) - Add 20 unit tests covering all branches and edge cases - Create `src/rewrite_cmd.rs` thin CLI wrapper - Register `Commands::Rewrite` in main.rs - Simplify `.claude/hooks/rtk-rewrite.sh` from 357 → 60 lines Hooks no longer need duplicate mapping logic — a single `REWRITTEN=$(rtk rewrite "$CMD") || exit 0` handles everything. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: fix version references and module count for 0.22.2 - README.md, CLAUDE.md, ARCHITECTURE.md: 0.20.1 → 0.22.2 - ARCHITECTURE.md: module count 48 → 51 (added rewrite_cmd + 2 from master) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci: update hook coverage check to verify registry (not hook script) Since PR #241, the hook delegates to `rtk rewrite` — command mappings live in src/discover/registry.rs, not the bash hook script. Update the "Verify hook coverage" CI step to: - Check that the hook calls `rtk rewrite` (new architecture) - Check that registry.rs has rewrite_prefixes for all Python/Go commands Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: support single `&` background operator in compound rewrites Per feedback from @xDelph: AI agents increasingly use `cmd1 & cmd2` for parallel execution. This commit adds support alongside existing `&&`, `||`, `;`, and `|` operators. Changes: - rewrite_compound: add match arm for single `&` (after `&&` check) - rewrite_command: add `" & "` to has_compound detection - init: show "installed/updated" vs "already up to date" so users know whether rtk init changed the hook on re-run Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: add Python/Go commands to rewrite registry Add `ruff`, `pytest`, `pip`, `go`, and `golangci-lint` to both PATTERNS and RULES in registry.rs so the CI coverage check passes and `rtk rewrite` correctly identifies these commands. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update version reference to 0.23.0 in README Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update version reference to 0.23.0 in CLAUDE.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update version and module count to 0.23.0/52 in ARCHITECTURE.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address P0 review feedback on rtk-rewrite PR P0.1 - Replace 218-line bash hook with 58-line thin delegating hook. All rewrite logic now lives exclusively in `rtk rewrite` (Rust registry). `rtk init` installs the thin hook via include_str!. P0.2 - Fix `head -20 file` crash at runtime. Generic prefix replacement produced `rtk read -20 file` (invalid clap args). Now translates `head -N file` → `rtk read file --max-lines N` and skips unsupported head flags (e.g. -c) by returning exit 1. P0.3 - Add version guard in hook for rtk < 0.23.0. Prints a warning to stderr instead of silently doing nothing. Also adds missing registry entries vs old hook: - gh release, cargo install - docker run/exec/build, kubectl describe/apply - tree, diff 474 tests pass, 0 clippy warnings. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: cargo fmt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(discover): extract rules/patterns into rules.rs Per aeppling review: registry.rs was too large (~1500 lines). Extract all static data into src/discover/rules.rs: - RtkRule struct (with pub fields) - PATTERNS const array - RULES const array - IGNORED_PREFIXES and IGNORED_EXACT const arrays registry.rs now contains only logic + tests. rules.rs is the single place to add a new command mapping. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update version reference to 0.24.0 in README * docs: update version references to 0.24.0 in CLAUDE.md and ARCHITECTURE.md * fix(discover): add aws and psql to rewrite registry rtk aws and rtk psql modules exist since PR #216 but were missing from the registry rules — rewrite was silently skipping them. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * test(discover): exhaustive regression tests for rewrite registry Cover all command categories added in PR #241 and missing from the previous test suite: - aws / psql (PR #216 modules, gap detected during non-reg run) - Python: ruff, pytest, python -m pytest, pip, uv pip - Go: go test/build/vet, golangci-lint - JS/TS: vitest, pnpm vitest, prisma, prettier, pnpm list - Compound operators: || and ; rewrites, 4-segment chains, mixed supported/unsupported segments, all-unsupported → None - sudo prefix rewrite, env var prefix rewrite - find with native flags - Registry invariants: PATTERNS/RULES aligned, all rules valid, all patterns are valid regex Before: 559 tests. After: 607 tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(migration): document breaking change + detect outdated hook in rtk config CHANGELOG [Unreleased]: - Migration required: rtk init --global needed after upgrade - Documents upgrade path and explains no immediate breakage rtk init --show / rtk config now detects old hook (inline if-else) vs new thin delegator (rtk rewrite) and prints actionable warning: ⚠️ Hook: ~/.claude/hooks/rtk-rewrite.sh (outdated — inline logic, not thin delegator) → Run `rtk init --global` to upgrade to the single source of truth hook Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update hook references for thin delegator (0.24.0) - ARCHITECTURE.md: fix hook description (shell script → thin delegator) - INSTALL.md: add upgrade path for old hook users (pre-0.24 breaking change) - SECURITY.md: add registry.rs + hook files to Tier 1 critical files Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(arch): fix module count 52→55, add aws/psql/rewrite to module map Adds aws_cmd, psql_cmd (PR #216) and rewrite_cmd (this PR) to the Complete Module Map table. Updates total from 52 to 55 to match main.rs. Fixes CI validate-docs.sh module count mismatch. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * ci: fix hook coverage check to search rules.rs instead of registry.rs After the PR #241 refactor, rewrite_prefixes constants moved from registry.rs to rules.rs. Update grep to search the whole discover/ directory so it finds them in the right file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
391 lines
11 KiB
Markdown
391 lines
11 KiB
Markdown
# RTK Installation Guide - For AI Coding Assistants
|
|
|
|
## ⚠️ Name Collision Warning
|
|
|
|
**There are TWO completely different projects named "rtk":**
|
|
|
|
1. ✅ **Rust Token Killer** (this project) - LLM token optimizer
|
|
- Repos: `rtk-ai/rtk`
|
|
- Has `rtk gain` command for token savings stats
|
|
|
|
2. ❌ **Rust Type Kit** (reachingforthejack/rtk) - DIFFERENT PROJECT
|
|
- Rust codebase query tool and type generator
|
|
- **DO NOT install if you want token optimization**
|
|
|
|
## Pre-Installation Check (REQUIRED)
|
|
|
|
**AI assistants should ALWAYS verify if RTK is already installed before attempting installation.**
|
|
|
|
```bash
|
|
# Check if RTK is installed
|
|
rtk --version
|
|
|
|
# CRITICAL: Verify it's the Token Killer (not Type Kit)
|
|
rtk gain # Should show token savings stats, NOT "command not found"
|
|
|
|
# Check installation path
|
|
which rtk
|
|
```
|
|
|
|
If `rtk gain` works, you have the **correct** RTK installed. **DO NOT reinstall**. Skip to "Project Initialization".
|
|
|
|
If `rtk gain` fails but `rtk --version` succeeds, you have the **wrong** RTK (Type Kit). Uninstall and reinstall the correct one (see below).
|
|
|
|
## Installation (only if RTK not available or wrong RTK installed)
|
|
|
|
### Step 0: Uninstall Wrong RTK (if needed)
|
|
|
|
If you accidentally installed Rust Type Kit:
|
|
|
|
```bash
|
|
cargo uninstall rtk
|
|
```
|
|
|
|
### Quick Install (Linux/macOS)
|
|
|
|
```bash
|
|
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh
|
|
```
|
|
|
|
After installation, **verify you have the correct rtk**:
|
|
```bash
|
|
rtk gain # Must show token savings stats (not "command not found")
|
|
```
|
|
|
|
### Alternative: Manual Installation
|
|
|
|
```bash
|
|
# From rtk-ai repository (NOT reachingforthejack!)
|
|
cargo install --git https://github.com/rtk-ai/rtk
|
|
|
|
# OR (if published and correct on crates.io)
|
|
cargo install rtk
|
|
|
|
# ALWAYS VERIFY after installation
|
|
rtk gain # MUST show token savings, not "command not found"
|
|
```
|
|
|
|
⚠️ **WARNING**: `cargo install rtk` from crates.io might install the wrong package. Always verify with `rtk gain`.
|
|
|
|
## Project Initialization
|
|
|
|
### Which mode to choose?
|
|
|
|
```
|
|
Do you want RTK active across ALL Claude Code projects?
|
|
│
|
|
├─ YES → rtk init -g (recommended)
|
|
│ Hook + RTK.md (~10 tokens in context)
|
|
│ Commands auto-rewritten transparently
|
|
│
|
|
├─ YES, minimal → rtk init -g --hook-only
|
|
│ Hook only, nothing added to CLAUDE.md
|
|
│ Zero tokens in context
|
|
│
|
|
└─ NO, single project → rtk init
|
|
Local CLAUDE.md only (137 lines)
|
|
No hook, no global effect
|
|
```
|
|
|
|
### Recommended: Global Hook-First Setup
|
|
|
|
**Best for: All projects, automatic RTK usage**
|
|
|
|
```bash
|
|
rtk init -g
|
|
# → Installs hook to ~/.claude/hooks/rtk-rewrite.sh
|
|
# → Creates ~/.claude/RTK.md (10 lines, meta commands only)
|
|
# → Adds @RTK.md reference to ~/.claude/CLAUDE.md
|
|
# → Prompts: "Patch settings.json? [y/N]"
|
|
# → If yes: patches + creates backup (~/.claude/settings.json.bak)
|
|
|
|
# Automated alternatives:
|
|
rtk init -g --auto-patch # Patch without prompting
|
|
rtk init -g --no-patch # Print manual instructions instead
|
|
|
|
# Verify installation
|
|
rtk init --show # Check hook is installed and executable
|
|
```
|
|
|
|
**Token savings**: ~99.5% reduction (2000 tokens → 10 tokens in context)
|
|
|
|
**What is settings.json?**
|
|
Claude Code's hook registry. RTK adds a PreToolUse hook that rewrites commands transparently. Without this, Claude won't invoke the hook automatically.
|
|
|
|
```
|
|
Claude Code settings.json rtk-rewrite.sh RTK binary
|
|
│ │ │ │
|
|
│ "git status" │ │ │
|
|
│ ──────────────────►│ │ │
|
|
│ │ PreToolUse trigger │ │
|
|
│ │ ───────────────────►│ │
|
|
│ │ │ rewrite command │
|
|
│ │ │ → rtk git status │
|
|
│ │◄────────────────────│ │
|
|
│ │ updated command │ │
|
|
│ │ │
|
|
│ execute: rtk git status │
|
|
│ ─────────────────────────────────────────────────────────────►│
|
|
│ │ filter
|
|
│ "3 modified, 1 untracked ✓" │
|
|
│◄──────────────────────────────────────────────────────────────│
|
|
```
|
|
|
|
**Backup Safety**:
|
|
RTK backs up existing settings.json before changes. Restore if needed:
|
|
```bash
|
|
cp ~/.claude/settings.json.bak ~/.claude/settings.json
|
|
```
|
|
|
|
### Alternative: Local Project Setup
|
|
|
|
**Best for: Single project without hook**
|
|
|
|
```bash
|
|
cd /path/to/your/project
|
|
rtk init # Creates ./CLAUDE.md with full RTK instructions (137 lines)
|
|
```
|
|
|
|
**Token savings**: Instructions loaded only for this project
|
|
|
|
### Upgrading from Previous Version
|
|
|
|
#### From old 137-line CLAUDE.md injection (pre-0.22)
|
|
|
|
```bash
|
|
rtk init -g # Automatically migrates to hook-first mode
|
|
# → Removes old 137-line block
|
|
# → Installs hook + RTK.md
|
|
# → Adds @RTK.md reference
|
|
```
|
|
|
|
#### From old hook with inline logic (pre-0.24) — ⚠️ Breaking Change
|
|
|
|
RTK 0.24.0 replaced the inline command-detection hook (~200 lines) with a **thin delegator** that calls `rtk rewrite`. The binary now contains the rewrite logic, so adding new commands no longer requires a hook update.
|
|
|
|
The old hook still works but won't benefit from new rules added in future releases.
|
|
|
|
```bash
|
|
# Upgrade hook to thin delegator
|
|
rtk init --global
|
|
|
|
# Verify the new hook is active
|
|
rtk init --show
|
|
# Should show: ✅ Hook: ... (thin delegator, up to date)
|
|
```
|
|
|
|
## Common User Flows
|
|
|
|
### First-Time User (Recommended)
|
|
```bash
|
|
# 1. Install RTK
|
|
cargo install --git https://github.com/rtk-ai/rtk
|
|
rtk gain # Verify (must show token stats)
|
|
|
|
# 2. Setup with prompts
|
|
rtk init -g
|
|
# → Answer 'y' when prompted to patch settings.json
|
|
# → Creates backup automatically
|
|
|
|
# 3. Restart Claude Code
|
|
# 4. Test: git status (should use rtk)
|
|
```
|
|
|
|
### CI/CD or Automation
|
|
```bash
|
|
# Non-interactive setup (no prompts)
|
|
rtk init -g --auto-patch
|
|
|
|
# Verify in scripts
|
|
rtk init --show | grep "Hook:"
|
|
```
|
|
|
|
### Conservative User (Manual Control)
|
|
```bash
|
|
# Get manual instructions without patching
|
|
rtk init -g --no-patch
|
|
|
|
# Review printed JSON snippet
|
|
# Manually edit ~/.claude/settings.json
|
|
# Restart Claude Code
|
|
```
|
|
|
|
### Temporary Trial
|
|
```bash
|
|
# Install hook
|
|
rtk init -g --auto-patch
|
|
|
|
# Later: remove everything
|
|
rtk init -g --uninstall
|
|
|
|
# Restore backup if needed
|
|
cp ~/.claude/settings.json.bak ~/.claude/settings.json
|
|
```
|
|
|
|
## Installation Verification
|
|
|
|
```bash
|
|
# Basic test
|
|
rtk ls .
|
|
|
|
# Test with git
|
|
rtk git status
|
|
|
|
# Test with pnpm (fork only)
|
|
rtk pnpm list
|
|
|
|
# Test with Vitest (feat/vitest-support branch only)
|
|
rtk vitest run
|
|
```
|
|
|
|
## Uninstalling
|
|
|
|
### Complete Removal (Global Installations Only)
|
|
|
|
```bash
|
|
# Complete removal (global installations only)
|
|
rtk init -g --uninstall
|
|
|
|
# What gets removed:
|
|
# - Hook: ~/.claude/hooks/rtk-rewrite.sh
|
|
# - Context: ~/.claude/RTK.md
|
|
# - Reference: @RTK.md line from ~/.claude/CLAUDE.md
|
|
# - Registration: RTK hook entry from settings.json
|
|
|
|
# Restart Claude Code after uninstall
|
|
```
|
|
|
|
**For Local Projects**: Manually remove RTK block from `./CLAUDE.md`
|
|
|
|
### Binary Removal
|
|
|
|
```bash
|
|
# If installed via cargo
|
|
cargo uninstall rtk
|
|
|
|
# If installed via package manager
|
|
brew uninstall rtk # macOS Homebrew
|
|
sudo apt remove rtk # Debian/Ubuntu
|
|
sudo dnf remove rtk # Fedora/RHEL
|
|
```
|
|
|
|
### Restore from Backup (if needed)
|
|
|
|
```bash
|
|
cp ~/.claude/settings.json.bak ~/.claude/settings.json
|
|
```
|
|
|
|
## Essential Commands
|
|
|
|
### Files
|
|
```bash
|
|
rtk ls . # Compact tree view
|
|
rtk read file.rs # Optimized reading
|
|
rtk grep "pattern" . # Grouped search results
|
|
```
|
|
|
|
### Git
|
|
```bash
|
|
rtk git status # Compact status
|
|
rtk git log -n 10 # Condensed logs
|
|
rtk git diff # Optimized diff
|
|
rtk git add . # → "ok ✓"
|
|
rtk git commit -m "msg" # → "ok ✓ abc1234"
|
|
rtk git push # → "ok ✓ main"
|
|
```
|
|
|
|
### Pnpm (fork only)
|
|
```bash
|
|
rtk pnpm list # Dependency tree (-70% tokens)
|
|
rtk pnpm outdated # Available updates (-80-90%)
|
|
rtk pnpm install pkg # Silent installation
|
|
```
|
|
|
|
### Tests
|
|
```bash
|
|
rtk test cargo test # Failures only (-90%)
|
|
rtk vitest run # Filtered Vitest output (-99.6%)
|
|
```
|
|
|
|
### Statistics
|
|
```bash
|
|
rtk gain # Token savings
|
|
rtk gain --graph # With ASCII graph
|
|
rtk gain --history # With command history
|
|
```
|
|
|
|
## Validated Token Savings
|
|
|
|
### Production T3 Stack Project
|
|
| Operation | Standard | RTK | Reduction |
|
|
|-----------|----------|-----|-----------|
|
|
| `vitest run` | 102,199 chars | 377 chars | **-99.6%** |
|
|
| `git status` | 529 chars | 217 chars | **-59%** |
|
|
| `pnpm list` | ~8,000 tokens | ~2,400 | **-70%** |
|
|
| `pnpm outdated` | ~12,000 tokens | ~1,200-2,400 | **-80-90%** |
|
|
|
|
### Typical Claude Code Session (30 min)
|
|
- **Without RTK**: ~150,000 tokens
|
|
- **With RTK**: ~45,000 tokens
|
|
- **Savings**: **70% reduction**
|
|
|
|
## Troubleshooting
|
|
|
|
### RTK command not found after installation
|
|
```bash
|
|
# Check PATH
|
|
echo $PATH | grep -o '[^:]*\.cargo[^:]*'
|
|
|
|
# Add to PATH if needed (~/.bashrc or ~/.zshrc)
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
|
|
# Reload shell
|
|
source ~/.bashrc # or source ~/.zshrc
|
|
```
|
|
|
|
### RTK command not available (e.g., vitest)
|
|
```bash
|
|
# Check branch
|
|
cd /path/to/rtk
|
|
git branch
|
|
|
|
# Switch to feat/vitest-support if needed
|
|
git checkout feat/vitest-support
|
|
|
|
# Reinstall
|
|
cargo install --path . --force
|
|
```
|
|
|
|
### Compilation error
|
|
```bash
|
|
# Update Rust
|
|
rustup update stable
|
|
|
|
# Clean and recompile
|
|
cargo clean
|
|
cargo build --release
|
|
cargo install --path . --force
|
|
```
|
|
|
|
## Support and Contributing
|
|
|
|
- **Website**: https://www.rtk-ai.app
|
|
- **Contact**: contact@rtk-ai.app
|
|
- **Troubleshooting**: See [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for common issues
|
|
- **GitHub issues**: https://github.com/rtk-ai/rtk/issues
|
|
- **Pull Requests**: https://github.com/rtk-ai/rtk/pulls
|
|
|
|
⚠️ **If you installed the wrong rtk (Type Kit)**, see [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md#problem-rtk-gain-command-not-found)
|
|
|
|
## AI Assistant Checklist
|
|
|
|
Before each session:
|
|
|
|
- [ ] Verify RTK is installed: `rtk --version`
|
|
- [ ] If not installed → follow "Install from fork"
|
|
- [ ] If project not initialized → `rtk init`
|
|
- [ ] Use `rtk` for ALL git/pnpm/test/vitest commands
|
|
- [ ] Check savings: `rtk gain`
|
|
|
|
**Golden Rule**: AI coding assistants should ALWAYS use `rtk` as a proxy for shell commands that generate verbose output (git, pnpm, npm, cargo test, vitest, docker, kubectl).
|