/audit-codebase
RTK Codebase Health Audit — 7 catégories scorées 0-10
$ npx -y skills add rtk-ai/rtk --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/audit-codebase
Context preview
What this command does when you run it.
RTK Codebase Health Audit — 7 catégories scorées 0-10
Command definition
audit-codebase.mdmodel: sonnet
description: RTK Codebase Health Audit — 7 catégories scorées 0-10
argument-hint: "[--category <cat>] [--fix] [--json]"
allowed-tools: [Read, Grep, Glob, Bash, Write]
Audit Codebase — Santé du Projet RTK
Score global et par catégorie (0-10) avec plan d'action priorisé.
Arguments
- `--category <cat>` — Auditer une seule catégorie : `secrets`, `security`, `deps`, `structure`, `tests`, `perf`, `ai`
- `--fix` — Après l'audit, proposer les fixes prioritaires
- `--json` — Output JSON pour CI/CD
Usage
/tech:audit-codebase
/tech:audit-codebase --category security
/tech:audit-codebase --fix
/tech:audit-codebase --json
Arguments: $ARGUMENTS
Seuils de Scoring
| Score | Tier | Status | | ----- | --------- | -------------------- | | 0-4 | 🔴 Tier 1 | Critique | | 5-7 | 🟡 Tier 2 | Amélioration requise | | 8-10 | 🟢 Tier 3 | Production Ready |
Phase 1 : Audit Secrets (Poids: 2x)
# API keys hardcodées
Grep "sk-[a-zA-Z0-9]{20}" src/
Grep "Bearer [a-zA-Z0-9]" src/
# Credentials dans le code
Grep "password\s*=\s*\"" src/
Grep "token\s*=\s*\"[^$]" src/
# .env accidentellement commité
git ls-files | grep "\.env" | grep -v "\.env\.example"
# Chemins absolus hardcodés (home dir, etc.)
Grep "/home/[a-z]" src/
Grep "/Users/[A-Z]" src/| Condition | Score | | ----------------------- | ------------ | | 0 secrets trouvés | 10/10 | | Chemin absolu hardcodé | -1 par occ. | | Credential réel exposé | 0/10 immédiat|
Phase 2 : Audit Sécurité (Poids: 2x)
**Objectif** : Pas d'injection shell, pas de panic en prod, error handling complet.
# unwrap() en production (hors tests)
Grep "\.unwrap()" src/ --glob "*.rs"
# Filtrer les tests : compter ceux hors #[cfg(test)]
# panic! en production
Grep "panic!" src/ --glob "*.rs"
# expect() sans message explicite
Grep '\.expect("")' src/
# format! dans des chemins injection-possibles
Grep "Command::new.*format!" src/
# ? sans .context()
# (approximation - chercher les ? seuls)
Grep "[^;]\?" src/ --glob "*.rs"| Condition | Score | | -------------------------------- | ----------------- | | 0 unwrap() hors tests | 10/10 | | `unwrap()` en production | -1.5 par fichier | | `panic!` hors tests | -2 par occurrence | | `?` sans `.context()` | -0.5 par 10 occ. | | Injection shell potentielle | -3 par occurrence |
Phase 3 : Audit Dépendances (Poids: 1x)
# Vulnérabilités connues
cargo audit 2>&1 | tail -30
# Dépendances outdated
cargo outdated 2>&1 | head -30
# Dépendances async (interdit dans RTK)
Grep "tokio\|async-std\|futures" Cargo.toml
# Taille binaire post-strip
ls -lh target/release/rtk 2>/dev/null || echo "Build needed"
| Condition | Score | | -------------------------------- | ------------- | | 0 CVE high/critical | 10/10 | | 1 CVE moderate | -1 par CVE | | 1+ CVE high | -2 par CVE | | 1+ CVE critical | 0/10 immédiat | | Dépendance async présente | -3 (perf killer) | | Binaire >5MB stripped | -1 |
Phase 4 : Audit Structure (Poids: 1.5x)
**Objectif** : Architecture RTK respectée, conventions Rust appliquées.
# Regex non-lazy (compilées à chaque appel)
Grep "Regex::new" src/ --glob "*.rs"
# Compter les patterns fixes et réutilisés hors LazyLock
# Modules sans fallback vers commande brute
Grep "execute_raw\|passthrough\|raw_cmd" src/ --glob "*.rs"
# Modules sans module de tests intégré
Grep "#\[cfg(test)\]" src/ --glob "*.rs" --output_mode files_with_matches
# Fichiers source sans tests correspondants
Glob src/*_cmd.rs
# main.rs : vérifier que tous les modules sont enregistrés
Grep "mod " src/main.rs
| Condition | Score | | -------------------------------------- | ------------------- | | 0 regex non-lazy | 10/10 | | Regex fixe recompilée dans une fonction | -2 par occurrence | | Module sans fallback brute | -1.5 par module | | Module sans #[cfg(test)] | -1 par module |
Phase 5 : Audit Tests (Poids: 2x)
**Objectif** : Couverture croissante, savings claims vérifiés.
# Ratio modules avec tests embarqués
MODULES=$(Glob src/*_cmd.rs | wc -l)
TESTED=$(Grep "#\[cfg(test)\]" src/ --glob "*_cmd.rs" --output_mode files_with_matches | wc -l)
echo "Test coverage: $TESTED / $MODULES modules"
# Fixtures réelles présentes
Glob tests/fixtures/*.txt | wc -l
# Tests de token savings (count_tokens assertions)
Grep "count_tokens\|savings" src/ --glob "*.rs" --output_mode count
# Smoke tests OK
ls scripts/test-all.sh 2>/dev/null && echo "Smoke tests present" || echo "Missing"
| Coverage % | Score | Tier | | ------------------ | ----- | ---- | | <30% modules | 3/10 | 🔴 1 | | 30-49% | 5/10 | 🟡 2 | | 50-69% | 7/10 | 🟡 2 | | 70-89% | 8/10 | 🟢 3 | | 90%+ modules | 10/10 | 🟢 3 |
**Bonus** : Fixtures réelles pour chaque filtre = +0.5. Smoke tests présents = +0.5.
Phase 6 : Audit Performance (Poids: 2x)
**Objectif** : Startup <10ms, mémoire <5MB, savings claims tenus.
# Benchmark startup (si hyperfine dispo)
which hyperfine && hyperfine 'rtk git status' --warmup 3 2>&1 | grep "Time"
# Mémoire binaire
ls -lh target/release/rtk 2>/dev/null
# Dépendances lourdes
Grep "serde_json\|regex\|rusqlite" Cargo.toml
# (ok mais vérifier qu'elles sont nécessaires)
# Regex compilées au runtime
Grep "Regex::new" src/ --glob "*.rs" --output_mode count
# Clone() excessifs (approx)
Grep "\.clone()" src/ --glob "*.rs" --output_mode count
| Condition | Score | | ------------------------------ | -------------- | | Startup <10ms
Read more
model: sonnet description: RTK Codebase Health Audit — 7 catégories scorées 0-10 argument-hint: "[--category <cat>] [--fix] [--json]" allowed-tools: [Read, Grep, Glob, Bash, Write]
Audit Codebase — Santé du Projet RTK
Score global et par catégorie (0-10) avec plan d'action priorisé.
Arguments
- `--category <cat>` — Auditer une seule catégorie : `secrets`, `security`, `deps`, `structure`, `tests`, `perf`, `ai`
- `--fix` — Après l'audit, proposer les fixes prioritaires
- `--json` — Output JSON pour CI/CD
Usage
/tech:audit-codebase /tech:audit-codebase --category security /tech:audit-codebase --fix /tech:audit-codebase --json
Arguments: $ARGUMENTS
Seuils de Scoring
| Score | Tier | Status | | ----- | --------- | -------------------- | | 0-4 | 🔴 Tier 1 | Critique | | 5-7 | 🟡 Tier 2 | Amélioration requise | | 8-10 | 🟢 Tier 3 | Production Ready |
Phase 1 : Audit Secrets (Poids: 2x)
# API keys hardcodées
Grep "sk-[a-zA-Z0-9]{20}" src/
Grep "Bearer [a-zA-Z0-9]" src/
# Credentials dans le code
Grep "password\s*=\s*\"" src/
Grep "token\s*=\s*\"[^$]" src/
# .env accidentellement commité
git ls-files | grep "\.env" | grep -v "\.env\.example"
# Chemins absolus hardcodés (home dir, etc.)
Grep "/home/[a-z]" src/
Grep "/Users/[A-Z]" src/| Condition | Score | | ----------------------- | ------------ | | 0 secrets trouvés | 10/10 | | Chemin absolu hardcodé | -1 par occ. | | Credential réel exposé | 0/10 immédiat|
Phase 2 : Audit Sécurité (Poids: 2x)
**Objectif** : Pas d'injection shell, pas de panic en prod, error handling complet.
# unwrap() en production (hors tests)
Grep "\.unwrap()" src/ --glob "*.rs"
# Filtrer les tests : compter ceux hors #[cfg(test)]
# panic! en production
Grep "panic!" src/ --glob "*.rs"
# expect() sans message explicite
Grep '\.expect("")' src/
# format! dans des chemins injection-possibles
Grep "Command::new.*format!" src/
# ? sans .context()
# (approximation - chercher les ? seuls)
Grep "[^;]\?" src/ --glob "*.rs"| Condition | Score | | -------------------------------- | ----------------- | | 0 unwrap() hors tests | 10/10 | | `unwrap()` en production | -1.5 par fichier | | `panic!` hors tests | -2 par occurrence | | `?` sans `.context()` | -0.5 par 10 occ. | | Injection shell potentielle | -3 par occurrence |
Phase 3 : Audit Dépendances (Poids: 1x)
# Vulnérabilités connues cargo audit 2>&1 | tail -30 # Dépendances outdated cargo outdated 2>&1 | head -30 # Dépendances async (interdit dans RTK) Grep "tokio\|async-std\|futures" Cargo.toml # Taille binaire post-strip ls -lh target/release/rtk 2>/dev/null || echo "Build needed"
| Condition | Score | | -------------------------------- | ------------- | | 0 CVE high/critical | 10/10 | | 1 CVE moderate | -1 par CVE | | 1+ CVE high | -2 par CVE | | 1+ CVE critical | 0/10 immédiat | | Dépendance async présente | -3 (perf killer) | | Binaire >5MB stripped | -1 |
Phase 4 : Audit Structure (Poids: 1.5x)
**Objectif** : Architecture RTK respectée, conventions Rust appliquées.
# Regex non-lazy (compilées à chaque appel) Grep "Regex::new" src/ --glob "*.rs" # Compter les patterns fixes et réutilisés hors LazyLock # Modules sans fallback vers commande brute Grep "execute_raw\|passthrough\|raw_cmd" src/ --glob "*.rs" # Modules sans module de tests intégré Grep "#\[cfg(test)\]" src/ --glob "*.rs" --output_mode files_with_matches # Fichiers source sans tests correspondants Glob src/*_cmd.rs # main.rs : vérifier que tous les modules sont enregistrés Grep "mod " src/main.rs
| Condition | Score | | -------------------------------------- | ------------------- | | 0 regex non-lazy | 10/10 | | Regex fixe recompilée dans une fonction | -2 par occurrence | | Module sans fallback brute | -1.5 par module | | Module sans #[cfg(test)] | -1 par module |
Phase 5 : Audit Tests (Poids: 2x)
**Objectif** : Couverture croissante, savings claims vérifiés.
# Ratio modules avec tests embarqués MODULES=$(Glob src/*_cmd.rs | wc -l) TESTED=$(Grep "#\[cfg(test)\]" src/ --glob "*_cmd.rs" --output_mode files_with_matches | wc -l) echo "Test coverage: $TESTED / $MODULES modules" # Fixtures réelles présentes Glob tests/fixtures/*.txt | wc -l # Tests de token savings (count_tokens assertions) Grep "count_tokens\|savings" src/ --glob "*.rs" --output_mode count # Smoke tests OK ls scripts/test-all.sh 2>/dev/null && echo "Smoke tests present" || echo "Missing"
| Coverage % | Score | Tier | | ------------------ | ----- | ---- | | <30% modules | 3/10 | 🔴 1 | | 30-49% | 5/10 | 🟡 2 | | 50-69% | 7/10 | 🟡 2 | | 70-89% | 8/10 | 🟢 3 | | 90%+ modules | 10/10 | 🟢 3 |
**Bonus** : Fixtures réelles pour chaque filtre = +0.5. Smoke tests présents = +0.5.
Phase 6 : Audit Performance (Poids: 2x)
**Objectif** : Startup <10ms, mémoire <5MB, savings claims tenus.
# Benchmark startup (si hyperfine dispo) which hyperfine && hyperfine 'rtk git status' --warmup 3 2>&1 | grep "Time" # Mémoire binaire ls -lh target/release/rtk 2>/dev/null # Dépendances lourdes Grep "serde_json\|regex\|rusqlite" Cargo.toml # (ok mais vérifier qu'elles sont nécessaires) # Regex compilées au runtime Grep "Regex::new" src/ --glob "*.rs" --output_mode count # Clone() excessifs (approx) Grep "\.clone()" src/ --glob "*.rs" --output_mode count
| Condition | Score | | ------------------------------ | -------------- | | Startup <10ms
CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies
Repo: rtk-ai/rtk
Other commands on rtk.
- /clean-worktree
Interactive cleanup of stale worktrees (merged branches, orphaned refs)
Open command - /clean-worktrees
Clean all merged worktrees automatically (no interaction)
Open command - /diagnose
RTK environment diagnostics - Checks installation, hooks, version, command routing
Open command - /codereview
RTK Code Review — Review locale pre-PR avec auto-fix
Open command - /remove-worktree
Remove a specific worktree (directory + git reference + branch)
Open command - /worktree-status
Check background cargo check status for a git worktree
Open command

