Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
8fae5b0
Release v0.31.0 — develop → master (#666)
pszymkowiak Mar 18, 2026
4d799b0
fix: remove all decorative emojis from CLI output (#687)
pszymkowiak Mar 18, 2026
4792008
fix: remove all decorative emojis from CLI output (#687) (#686)
pszymkowiak Mar 18, 2026
48e53cb
chore(master): release 0.30.1 (#693)
github-actions[bot] Mar 18, 2026
56160d8
feat: OpenClaw plugin for transparent exec rewriting (#358)
aneym Mar 18, 2026
f16853a
feat: add Gemini CLI support via rtk init --gemini (#573)
ousamabenyounes Mar 18, 2026
7d04b48
feat(init): add Codex CLI support via AGENTS.md + RTK.md workflow (#…
Zacaria Mar 18, 2026
0800bbe
feat(copilot): add Copilot hook support (VS Code + CLI) (#605)
jeziellopes Mar 18, 2026
c3917e4
feat: add Cursor Agent support via --agent flag (#595)
moisei Mar 18, 2026
86d5069
feat: add Windsurf support via rtk init --agent windsurf (#695) (#697)
pszymkowiak Mar 18, 2026
d921cc4
feat: add Cline/Roo Code support via rtk init --agent cline (#701) (#…
pszymkowiak Mar 18, 2026
4020aa0
chore: merge master into develop (resolve emoji conflicts in Cursor s…
pszymkowiak Mar 18, 2026
5e1fc20
fix(skill/rtk-triage): increase PR/issue limit to 200 with pagination…
FlorianBruniaux Mar 19, 2026
737dada
feat: 9-tool AI agent support + emoji removal (#704)
pszymkowiak Mar 19, 2026
3480ce5
fix(golangci-lint): add v2 compatibility with runtime version detection
apowis Mar 19, 2026
c85e348
chore(master): release 0.31.0 (#719)
github-actions[bot] Mar 19, 2026
15bc0f8
feat(ruby): add Ruby on Rails support (rspec, rubocop, rake, bundle) …
navidemad Mar 19, 2026
4edc3fc
fix: increase signal in git diff, git log, and json filters (#621) (#…
pszymkowiak Mar 19, 2026
15d5beb
fix: preserve cargo test compile diagnostics
youbamj Mar 19, 2026
138e914
fix(ruby): use rails test for positional file args in rtk rake
Maimer Mar 19, 2026
53bc81e
fix(cicd): gete release like tag for pre-release
aeppling Mar 19, 2026
8657494
fix(cicd): missing doc
aeppling Mar 19, 2026
ec92c43
Merge pull request #741 from Maimer/pim_fix_rake_multiple_test_files
aeppling Mar 20, 2026
97b6878
Merge pull request #738 from youbamj/fix/cargo-test-compile-diagnostics
aeppling Mar 20, 2026
a9c610a
fix(hook): respect Claude Code deny/ask permission rules on rewrite
FlorianBruniaux Mar 13, 2026
e303fe1
fix(permissions): check deny rules before rewrite + flush stdout
FlorianBruniaux Mar 16, 2026
49fac62
fix(permissions): support *:* and leading/middle wildcards
FlorianBruniaux Mar 16, 2026
466aa78
docs(changelog): add entries for hook permission fix and git status f…
FlorianBruniaux Mar 19, 2026
6aa5e90
fix(golangci): use resolved_command for version detection, move test …
apowis Mar 20, 2026
95a4961
Merge pull request #722 from apowis/fix/golangci-lint-v2-compatibility
aeppling Mar 20, 2026
200af43
Merge pull request #736 from rtk-ai/fix/issue-668/pre-release-tag
aeppling Mar 20, 2026
cadbb23
Fix trx injection for dotnet tests running with various Microsoft Tes…
danielmarbach Mar 20, 2026
f7b09fc
fix(formatter): show full error message for test failures (#690)
ousamabenyounes Mar 19, 2026
b4ccf04
fix(playwright): add tee_and_hint pass-through on failure (#690)
ousamabenyounes Mar 21, 2026
4a79e48
Add files via upload
aeppling Mar 21, 2026
da999c8
Update ci.yml
aeppling Mar 21, 2026
4b2179e
Update CONTRIBUTING.md
aeppling Mar 21, 2026
8eefef1
Merge pull request #746 from danielmarbach/dotnet-test
aeppling Mar 21, 2026
dff0d5a
Merge pull request #768 from rtk-ai/license-to-apache-2-0
aeppling Mar 21, 2026
fdeb09f
fix(gh): passthrough --comments flag in issue/pr view
mvanhorn Mar 21, 2026
dc6b026
Merge pull request #729 from ousamabenyounes/fix/test-failure-error-m…
aeppling Mar 21, 2026
75cd223
Merge pull request #775 from mvanhorn/osc/720-issue-pr-view-comments-…
aeppling Mar 21, 2026
1536667
fix(cicd): pre-release correct tag
aeppling Mar 21, 2026
3b94b60
fix(cicd): explicit fetch tag
aeppling Mar 21, 2026
4b52bfe
Merge pull request #778 from rtk-ai/cicd-wrong-prerelease-tag
aeppling Mar 21, 2026
2ef0690
fix(gh): skip compact_diff for --name-only/--stat flags in pr diff
mvanhorn Mar 21, 2026
0bb3eaf
Merge branch 'master' into develop
aeppling Mar 22, 2026
c576249
Merge pull request #773 from mvanhorn/osc/730-pr-diff-name-only-empty
aeppling Mar 22, 2026
af56573
fix: update Discord invite link (#711) (#786)
pszymkowiak Mar 23, 2026
0eecee5
fix: add telemetry documentation and init notice (#640) (#788)
pszymkowiak Mar 23, 2026
e666d3e
docs: add all 9 AI tool integrations to README
pszymkowiak Mar 23, 2026
976077c
Merge pull request #790 from rtk-ai/feat/readme-agent-docs
pszymkowiak Mar 23, 2026
64bfd06
Merge pull request #780 from rtk-ai/develop
pszymkowiak Mar 24, 2026
248ed09
chore(master): release 0.33.0-rc.54
github-actions[bot] Mar 24, 2026
2cc01f4
Merge pull request #794 from rtk-ai/release-please--branches--master-…
pszymkowiak Mar 24, 2026
a051a6f
Merge pull request #576 from rtk-ai/fix/hook-bypass-permission
pszymkowiak Mar 24, 2026
36a6f48
fix: strip trailing stderr redirects before rewrite matching (#530)
pszymkowiak Mar 24, 2026
edd9c02
Merge pull request #797 from rtk-ai/fix/strip-stderr-redirects
pszymkowiak Mar 24, 2026
7f670d4
chore: bump version to 0.33.0
pszymkowiak Mar 25, 2026
c0bd165
Merge pull request #804 from rtk-ai/fix/version-bump-033
pszymkowiak Mar 25, 2026
76ce711
chore: merge master into develop (resolve version conflicts)
pszymkowiak Mar 25, 2026
0649e97
fix: hook security + stderr redirects + version bump (#807)
pszymkowiak Mar 25, 2026
32c67e0
fix(cicd): use dev- prefix for pre-release tags to avoid polluting re…
pszymkowiak Mar 25, 2026
9c21275
Merge pull request #814 from rtk-ai/fix/cicd-prerelease-tags
pszymkowiak Mar 25, 2026
522bd64
Merge pull request #816 from rtk-ai/develop
pszymkowiak Mar 25, 2026
d6425c3
chore(master): release 0.33.1
github-actions[bot] Mar 25, 2026
a00560a
Merge pull request #817 from rtk-ai/release-please--branches--master-…
pszymkowiak Mar 25, 2026
ce1dd38
chore: merge upstream rtk-ai/rtk v0.33.1 and set version to 0.33.1-faire
Nava2 Mar 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 60 additions & 23 deletions .claude/hooks/rtk-rewrite.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
#!/bin/bash
# rtk-hook-version: 3
# RTK auto-rewrite hook for Claude Code PreToolUse:Bash
# Transparently rewrites raw commands to their RTK equivalents.
# Uses `rtk rewrite` as single source of truth — no duplicate mapping logic here.
#
# To add support for new commands, update src/discover/registry.rs (PATTERNS + RULES).
#
# Exit code protocol for `rtk rewrite`:
# 0 + stdout Rewrite found, no deny/ask rule matched → auto-allow
# 1 No RTK equivalent → pass through unchanged
# 2 Deny rule matched → pass through (Claude Code native deny handles it)
# 3 + stdout Ask rule matched → rewrite but let Claude Code prompt the user

# --- Audit logging (opt-in via RTK_HOOK_AUDIT=1) ---
_rtk_audit_log() {
Expand Down Expand Up @@ -37,34 +44,64 @@ case "$CMD" in
*'<<'*) _rtk_audit_log "skip:heredoc" "$CMD"; exit 0 ;;
esac

# Rewrite via rtk — single source of truth for all command mappings.
# Exit 1 = no RTK equivalent, pass through unchanged.
# Exit 0 = rewritten command (or already RTK, identical output).
REWRITTEN=$(rtk rewrite "$CMD" 2>/dev/null) || {
_rtk_audit_log "skip:no_match" "$CMD"
exit 0
}
# Rewrite via rtk — single source of truth for all command mappings and permission checks.
# Use "|| EXIT_CODE=$?" to capture non-zero exit codes without triggering set -e.
EXIT_CODE=0
REWRITTEN=$(rtk rewrite "$CMD" 2>/dev/null) || EXIT_CODE=$?

# If output is identical, command was already using RTK — nothing to do.
if [ "$CMD" = "$REWRITTEN" ]; then
_rtk_audit_log "skip:already_rtk" "$CMD"
exit 0
fi
case $EXIT_CODE in
0)
# Rewrite found, no permission rules matched — safe to auto-allow.
if [ "$CMD" = "$REWRITTEN" ]; then
_rtk_audit_log "skip:already_rtk" "$CMD"
exit 0
fi
;;
1)
# No RTK equivalent — pass through unchanged.
_rtk_audit_log "skip:no_match" "$CMD"
exit 0
;;
2)
# Deny rule matched — let Claude Code's native deny rule handle it.
_rtk_audit_log "skip:deny_rule" "$CMD"
exit 0
;;
3)
# Ask rule matched — rewrite the command but do NOT auto-allow so that
# Claude Code prompts the user for confirmation.
;;
*)
exit 0
;;
esac

_rtk_audit_log "rewrite" "$CMD" "$REWRITTEN"

# Build the updated tool_input with all original fields preserved, only command changed.
ORIGINAL_INPUT=$(echo "$INPUT" | jq -c '.tool_input')
UPDATED_INPUT=$(echo "$ORIGINAL_INPUT" | jq --arg cmd "$REWRITTEN" '.command = $cmd')

# Output the rewrite instruction in Claude Code hook format.
jq -n \
--argjson updated "$UPDATED_INPUT" \
'{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "RTK auto-rewrite",
"updatedInput": $updated
}
}'
if [ "$EXIT_CODE" -eq 3 ]; then
# Ask: rewrite the command, omit permissionDecision so Claude Code prompts.
jq -n \
--argjson updated "$UPDATED_INPUT" \
'{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"updatedInput": $updated
}
}'
else
# Allow: output the rewrite instruction in Claude Code hook format.
jq -n \
--argjson updated "$UPDATED_INPUT" \
'{
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "allow",
"permissionDecisionReason": "RTK auto-rewrite",
"updatedInput": $updated
}
}'
fi
241 changes: 241 additions & 0 deletions .claude/skills/rtk-triage/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
---
description: >
Triage complet RTK : exécute issue-triage + pr-triage en parallèle,
puis croise les données pour détecter doubles couvertures, trous sécurité,
P0 sans PR, et conflits internes. Sauvegarde dans claudedocs/RTK-YYYY-MM-DD.md.
Args: "en"/"fr" pour la langue (défaut: fr), "save" pour forcer la sauvegarde.
allowed-tools:
- Bash
- Write
- Read
- AskUserQuestion
---

# /rtk-triage

Orchestrateur de triage RTK. Fusionne issue-triage + pr-triage et produit une analyse croisée.

---

## Quand utiliser

- Hebdomadaire ou avant chaque sprint
- Quand le backlog PR/issues grossit rapidement
- Pour identifier les doublons avant de reviewer

---

## Workflow en 4 phases

### Phase 0 — Préconditions

```bash
git rev-parse --is-inside-work-tree
gh auth status
```

Vérifier que la date actuelle est connue (utiliser `date +%Y-%m-%d`).

---

### Phase 1 — Data gathering (parallèle)

Lancer les deux collectes simultanément :

**Issues** :
```bash
gh repo view --json nameWithOwner -q .nameWithOwner

gh issue list --state open --limit 150 \
--json number,title,author,createdAt,updatedAt,labels,assignees,body

gh issue list --state closed --limit 20 \
--json number,title,labels,closedAt

gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'
```

**PRs** :
```bash
# Fetcher toutes les PRs ouvertes — paginer si nécessaire (gh limite à 200 par appel)
gh pr list --state open --limit 200 \
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body

# Si le repo a >200 PRs ouvertes, relancer avec --search pour paginer :
# gh pr list --state open --limit 200 --search "is:pr is:open sort:updated-desc" ...

# Pour chaque PR, récupérer les fichiers modifiés (nécessaire pour overlap detection)
# Prioriser les PRs candidates (même domaine, même auteur)
gh pr view {num} --json files --jq '[.files[].path] | join(",")'
```

---

### Phase 2 — Triage individuel

Exécuter les analyses de `/issue-triage` et `/pr-triage` séparément (même logique que les skills individuels) pour produire :

**Issues** :
- Catégorisation (Bug/Feature/Enhancement/Question/Duplicate)
- Risque (Rouge/Jaune/Vert)
- Staleness (>30j)
- Map `issue_number → [PR numbers]` via scan `fixes #N`, `closes #N`, `resolves #N`

**PRs** :
- Taille (XS/S/M/L/XL)
- CI status (clean/dirty)
- Nos PRs vs externes
- Overlaps (>50% fichiers communs entre 2 PRs)
- Clusters (auteur avec 3+ PRs)

Afficher les tableaux standards de chaque skill (voir SKILL.md de issue-triage et pr-triage pour le format exact).

---

### Phase 3 — Analyse croisée (cœur de ce skill)

C'est ici que ce skill apporte de la valeur au-delà des deux skills individuels.

#### 3.1 Double couverture — 2 PRs pour 1 issue

Pour chaque issue liée à ≥2 PRs (via scan des bodies + overlap fichiers) :

| Issue | PR1 (infos) | PR2 (infos) | Verdict recommandé |
|-------|-------------|-------------|-------------------|
| #N (titre) | PR#X — auteur, taille, CI | PR#Y — auteur, taille, CI | Garder la plus ciblée. Fermer/coordonner l'autre |

Règle de verdict :
- Préférer la plus petite (XS < S < M) si même scope
- Préférer CI clean sur CI dirty
- Préférer "nos PRs" si l'une est interne
- Si overlap de fichiers >80% → conflit quasi-certain, signaler

#### 3.2 Trous de couverture sécurité

Pour chaque issue rouge (#640-type security review) :
- Lister les sous-findings mentionnés dans le body
- Croiser avec les PRs existantes (mots-clés dans titre/body)
- Identifier les findings sans PR

Format :
```
## Issue #N — security review (finding par finding)
| Finding | PR associée | Status |
|---------|-------------|--------|
| Description finding 1 | PR#X | En review |
| **Description finding critique** | **AUCUNE** | ⚠️ Trou |
```

#### 3.3 P0/P1 bugs sans PR

Issues labelisées P0 ou P1 (ou mots-clés : "crash", "truncat", "cap", "hardcoded") sans aucune PR liée.

Format :
```
## Bugs critiques sans PR
| Issue | Titre | Pattern commun | Effort estimé |
|-------|-------|----------------|---------------|
```

Chercher un pattern commun (ex: "cap hardcodé", "exit code perdu") — si 3+ bugs partagent un pattern, suggérer un sprint groupé.

#### 3.4 Nos PRs dirty — causes probables

Pour chaque PR interne avec CI dirty ou CONFLICTING :
- Vérifier si un autre PR touche les mêmes fichiers
- Vérifier si un merge récent sur develop peut expliquer le conflit
- Recommander : rebase, fermeture, ou attente

Format :
```
## Nos PRs dirty
| PR | Issue(s) | Cause probable | Action |
|----|----------|----------------|--------|
```

#### 3.5 PRs sans issue trackée

PRs internes sans `fixes #N` dans le body — signaler pour traçabilité.

---

### Phase 4 — Output final

#### Afficher l'analyse croisée complète (sections 3.1 → 3.5)

Puis afficher le résumé chiffré :

```
## Résumé chiffré — YYYY-MM-DD

| Catégorie | Count |
|-----------|-------|
| PRs prêtes à merger (nos) | N |
| Quick wins externes | N |
| Double couverture (conflicts) | N paires |
| P0/P1 bugs sans PR | N |
| Security findings sans PR | N |
| Nos PRs dirty à rebaser | N |
| PRs à fermer (recommandé) | N |
```

#### Sauvegarder dans claudedocs

```bash
date +%Y-%m-%d # Pour construire le nom de fichier
```

Sauvegarder dans `claudedocs/RTK-YYYY-MM-DD.md` avec :
- Les tableaux de triage issues + PRs (Phase 2)
- L'analyse croisée complète (Phase 3)
- Le résumé chiffré

Confirmer : `Sauvegardé dans claudedocs/RTK-YYYY-MM-DD.md`

---

## Format du fichier sauvegardé

```markdown
# RTK Triage — YYYY-MM-DD

Croisement issues × PRs. {N} PRs ouvertes, {N} issues ouvertes.

---

## 1. Double couverture
...

## 2. Trous sécurité
...

## 3. P0/P1 sans PR
...

## 4. Nos PRs dirty
...

## 5. Nos PRs prêtes à merger
...

## 6. Quick wins externes
...

## 7. Actions prioritaires
(liste ordonnée par impact/urgence)

---

## Résumé chiffré
...
```

---

## Règles

- Langue : argument `en`/`fr`. Défaut : `fr`. Les commentaires GitHub restent toujours en anglais.
- Ne jamais poster de commentaires GitHub sans validation utilisateur (AskUserQuestion).
- Si >200 issues ou >200 PRs : prévenir l'utilisateur et paginer (relancer avec `--search` ou `gh api` avec pagination).
- L'analyse croisée (Phase 3) est toujours exécutée — c'est la valeur ajoutée de ce skill.
- Le fichier claudedocs est sauvegardé automatiquement sauf si l'utilisateur dit "no save".
13 changes: 13 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Summary
<!-- What does this PR do? Keep it short (1-3 bullet points). -->

-

## Test plan
<!-- How did you verify this works? -->

- [ ] `cargo fmt --all && cargo clippy --all-targets && cargo test`
- [ ] Manual testing: `rtk <command>` output inspected

> **Important:** All PRs must target the `develop` branch (not `master`).
> See [CONTRIBUTING.md](../blob/master/CONTRIBUTING.md) for details.
Loading
Loading