mirror of
https://github.com/rtk-ai/rtk.git
synced 2026-09-19 07:33:17 +08:00
7b7a5ae4b6
* feat: add Claude Code tooling — agents, commands, rules, skills
Port and adapt 15 Claude Code artifacts from MethodeAristote/ccboard
to RTK's Rust/CLI context. All TypeScript/web-specific references
replaced with Rust idioms, cargo toolchain, and RTK constraints.
## Agents (2)
- **code-reviewer** (rewrite): RTK-specific red flags table
(Regex::new in fn, unwrap in prod, async deps, no fallback, no savings
test), defensive patterns with before/after examples, adversarial
questions for RTK (savings ≥60%, fallback, startup, exit code,
cross-platform, ANSI, fixtures)
- **system-architect** (new): RTK architecture map, filter module
pattern (Pattern 1-4), TOML DSL vs Rust decision guide, performance
budget (<10ms startup, <5MB binary), module boundary definitions
## Commands (7, under .claude/commands/tech/)
- **worktree**: Creates git worktrees with background `cargo check
--all-targets`, `--fast`/`--no-check` flags, branch naming
`feature/xxx` → `.worktrees/feature-xxx`
- **worktree-status**: Checks background cargo check log
(`/tmp/worktree-cargo-check-{branch}.log`)
- **remove-worktree**: Removes worktree + git ref + branch, protected
branches: `master`/`main`
- **clean-worktrees**: Auto-removes worktrees on branches merged into
master (`git branch --merged master`)
- **clean-worktree**: Interactive cleanup with `y/N` prompt
- **codereview**: Pre-PR review, base `master`, 🔴 checks for
`unwrap()`, non-lazy regex, missing `.context()`, async deps, missing
token savings tests; `--auto` mode runs `cargo fmt + clippy + test`
- **audit-codebase**: 7-category health audit scored 0-10 (secrets,
security, deps via cargo audit, structure, tests, perf <10ms, AI
patterns), weighted global score
## Rules (2, under .claude/rules/)
- **search-strategy**: Navigation codebase RTK — module map, priority
order (Grep > Glob > Read > Explore), patterns for finding commands,
filter functions, lazy_static regexes, test coverage, TOML filters
- **rust-patterns**: RTK non-negotiables (no async, lazy_static
mandatory, fallback pattern, exit code propagation) + idiomatic Rust
(iterators, ownership, error handling, module structure template,
anti-patterns table)
## Skills (4, under .claude/skills/)
- **code-simplifier**: Rust simplification patterns (iterator chains,
string joining, Option/Result chaining, early returns, clone removal),
RTK guard-rails (never simplify away lazy_static, .context(), fallback)
- **performance**: Startup benchmark (hyperfine), binary size
(cargo-bloat), memory profiling (/usr/bin/time), regex compilation
audit, forbidden deps table, before/after regression template
- **design-patterns**: Rust patterns for RTK — Newtype (type safety),
Builder (complex config), State Machine (multi-phase output parsing),
Trait Object (command dispatch), RAII, Extension Trait; selection guide
+ anti-patterns
- **tdd-rust**: Full Red-Green-Refactor workflow — real fixtures capture,
snapshot tests (insta), count_tokens() savings assertion (≥60%),
fallback test, ANSI stripping test, Arrange-Act-Assert pattern,
"done" checklist
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com>
* chore: update version references to 0.28.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com>
---------
Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
4.1 KiB
4.1 KiB
model, description
| model | description |
|---|---|
| haiku | Auto-clean all stale worktrees (merged branches) |
Clean Worktrees (Automatic)
Automatically clean all stale worktrees: merged branches and orphaned git references.
vs /tech:clean-worktree:
/tech:clean-worktree: Interactive, asks confirmation/tech:clean-worktrees: Automatic, no interaction (safe: merged only)
Usage
/tech:clean-worktrees # Clean all merged worktrees
/tech:clean-worktrees --dry-run # Preview what would be deleted
Implementation
#!/bin/bash
set -euo pipefail
DRY_RUN=false
if [[ "${ARGUMENTS:-}" == *"--dry-run"* ]]; then
DRY_RUN=true
fi
echo "🧹 Cleaning Worktrees"
echo "====================="
echo ""
# Step 1: Prune stale git references
echo "1️⃣ Pruning stale git references..."
PRUNED=$(git worktree prune -v 2>&1)
if [ -n "$PRUNED" ]; then
echo "$PRUNED"
echo "✅ Stale references pruned"
else
echo "✅ No stale references found"
fi
echo ""
# Step 2: Find merged worktrees
echo "2️⃣ Finding merged worktrees..."
MERGED_COUNT=0
MERGED_BRANCHES=()
while IFS= read -r line; do
path=$(echo "$line" | awk '{print $1}')
branch=$(echo "$line" | grep -oE '\[.*\]' | tr -d '[]' || true)
[ -z "$branch" ] && continue
[ "$branch" = "master" ] && continue
[ "$branch" = "main" ] && continue
[ "$path" = "$(pwd)" ] && continue
if git branch --merged master | grep -q "^[* ] ${branch}$" 2>/dev/null; then
MERGED_COUNT=$((MERGED_COUNT + 1))
MERGED_BRANCHES+=("$branch|$path")
echo " ✓ $branch (merged)"
fi
done < <(git worktree list)
if [ $MERGED_COUNT -eq 0 ]; then
echo "✅ No merged worktrees found"
echo ""
echo "📊 Current worktrees:"
git worktree list
exit 0
fi
echo ""
echo "📋 Found $MERGED_COUNT merged worktree(s)"
echo ""
if [ "$DRY_RUN" = true ]; then
echo "🔍 DRY RUN MODE - No changes will be made"
echo ""
echo "Would delete:"
for item in "${MERGED_BRANCHES[@]}"; do
branch=$(echo "$item" | cut -d'|' -f1)
path=$(echo "$item" | cut -d'|' -f2)
echo " - $branch"
echo " Path: $path"
done
echo ""
echo "Run without --dry-run to actually delete"
exit 0
fi
# Step 3: Remove merged worktrees
echo "3️⃣ Removing merged worktrees..."
REMOVED_COUNT=0
FAILED_COUNT=0
for item in "${MERGED_BRANCHES[@]}"; do
branch=$(echo "$item" | cut -d'|' -f1)
path=$(echo "$item" | cut -d'|' -f2)
echo ""
echo "🗑️ Removing: $branch"
if git worktree remove "$path" 2>/dev/null; then
echo " ✅ Worktree removed"
else
echo " ⚠️ Git remove failed, forcing..."
rm -rf "$path" 2>/dev/null || true
git worktree prune 2>/dev/null || true
echo " ✅ Worktree forcefully removed"
fi
if git branch -d "$branch" 2>/dev/null; then
echo " ✅ Local branch deleted"
else
echo " ⚠️ Local branch already deleted"
fi
if git ls-remote --heads origin "$branch" 2>/dev/null | grep -q "$branch"; then
echo " 🌐 Remote branch exists: $branch"
echo " (Skipping auto-delete - use /tech:remove-worktree for manual removal)"
fi
REMOVED_COUNT=$((REMOVED_COUNT + 1))
done
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ Cleanup Complete!"
echo ""
echo "📊 Summary:"
echo " - Removed: $REMOVED_COUNT worktree(s)"
if [ $FAILED_COUNT -gt 0 ]; then
echo " - Failed: $FAILED_COUNT worktree(s)"
fi
echo ""
echo "📂 Remaining worktrees:"
git worktree list
echo ""
WORKTREES_SIZE=$(du -sh .worktrees/ 2>/dev/null | awk '{print $1}' || echo "N/A")
echo "💾 Worktrees disk usage: $WORKTREES_SIZE"
Safety Features
- ✅ Only merged branches: Never touches unmerged work
- ✅ Protected branches: Skips
masterandmain - ✅ Main repo: Never removes current working directory
- ✅ Remote branches: Reports but doesn't auto-delete
- ✅ Dry-run mode: Preview before deletion
When to Use
- After merging PRs into master
- Weekly maintenance
- Before creating new worktrees (keep things clean)
For unmerged branches: use /tech:remove-worktree <branch> (confirms deletion).