mirror of
https://github.com/rtk-ai/rtk.git
synced 2026-09-19 07:33:17 +08:00
7d76af84b9
* fix(cicd): Add security check on dev branch PR add security check cicd on dev branch PR Signed-off-by: aesoft <43991222+aeppling@users.noreply.github.com> * fix: enrich telemetry with install_method and token savings - Add install_method detection (homebrew/cargo/script/nix/other) - Add tokens_saved_24h and tokens_saved_total to payload - Add Tracker::total_tokens_saved() and Tracker::tokens_saved_24h() methods - Point telemetry to new dedicated rtk-telemetry service Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: detect install method on Windows paths Add backslash variants for .cargo\bin and .local\bin detection Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: enrich telemetry with install_method and token savings (#432) - Add install_method detection (homebrew/cargo/script/nix/other) - Add tokens_saved_24h and tokens_saved_total to payload - Add Tracker::total_tokens_saved() and Tracker::tokens_saved_24h() methods - Point telemetry to new dedicated rtk-telemetry service Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: 4 critical bugs — git exit code, jq warning, npm run doubling, pnpm build filter (#458) * fix: propagate exit code 128 when rtk git status runs outside a repo (#435) Previously printed "Not a git repository" to stdout and returned exit 0. Now prints to stderr and exits with git's actual exit code (128). Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: warn when jq is not installed instead of silent exit (#430) Hook now prints a warning to stderr before exiting cleanly, so users know the rewrite pipeline is not functioning. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: strip leading 'run' arg to prevent npm run run doubling (#438) When user types 'rtk npm run build', args contain ["run", "build"]. Since npm_cmd always prepends 'run', this caused 'npm run run build'. Now strips the leading 'run' from args if present. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: route pnpm build through generic passthrough instead of Next.js filter (#454) pnpm build was hardcoded to next_cmd::run which misparses Vite/other framework output as errors. Now uses generic passthrough. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * docs: bump README version to 0.28.0 Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: warn when rtk binary is not in PATH instead of silent exit (#430) (#465) Applies the same fix as jq — all silent exits now warn on stderr. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: aesoft <43991222+aeppling@users.noreply.github.com> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> Co-authored-by: aesoft <43991222+aeppling@users.noreply.github.com>
62 lines
2.0 KiB
Bash
62 lines
2.0 KiB
Bash
#!/usr/bin/env bash
|
|
# rtk-hook-version: 2
|
|
# RTK Claude Code hook — rewrites commands to use rtk for token savings.
|
|
# Requires: rtk >= 0.23.0, jq
|
|
#
|
|
# This is a thin delegating hook: all rewrite logic lives in `rtk rewrite`,
|
|
# which is the single source of truth (src/discover/registry.rs).
|
|
# To add or change rewrite rules, edit the Rust registry — not this file.
|
|
|
|
if ! command -v jq &>/dev/null; then
|
|
echo "[rtk] WARNING: jq is not installed. Hook cannot rewrite commands. Install jq: https://jqlang.github.io/jq/download/" >&2
|
|
exit 0
|
|
fi
|
|
|
|
if ! command -v rtk &>/dev/null; then
|
|
echo "[rtk] WARNING: rtk is not installed or not in PATH. Hook cannot rewrite commands. Install: https://github.com/rtk-ai/rtk#installation" >&2
|
|
exit 0
|
|
fi
|
|
|
|
# Version guard: rtk rewrite was added in 0.23.0.
|
|
# Older binaries: warn once and exit cleanly (no silent failure).
|
|
RTK_VERSION=$(rtk --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
|
if [ -n "$RTK_VERSION" ]; then
|
|
MAJOR=$(echo "$RTK_VERSION" | cut -d. -f1)
|
|
MINOR=$(echo "$RTK_VERSION" | cut -d. -f2)
|
|
# Require >= 0.23.0
|
|
if [ "$MAJOR" -eq 0 ] && [ "$MINOR" -lt 23 ]; then
|
|
echo "[rtk] WARNING: rtk $RTK_VERSION is too old (need >= 0.23.0). Upgrade: cargo install rtk" >&2
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
INPUT=$(cat)
|
|
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
|
|
|
|
if [ -z "$CMD" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Delegate all rewrite logic to the Rust binary.
|
|
# rtk rewrite exits 1 when there's no rewrite — hook passes through silently.
|
|
REWRITTEN=$(rtk rewrite "$CMD" 2>/dev/null) || exit 0
|
|
|
|
# No change — nothing to do.
|
|
if [ "$CMD" = "$REWRITTEN" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
ORIGINAL_INPUT=$(echo "$INPUT" | jq -c '.tool_input')
|
|
UPDATED_INPUT=$(echo "$ORIGINAL_INPUT" | jq --arg cmd "$REWRITTEN" '.command = $cmd')
|
|
|
|
jq -n \
|
|
--argjson updated "$UPDATED_INPUT" \
|
|
'{
|
|
"hookSpecificOutput": {
|
|
"hookEventName": "PreToolUse",
|
|
"permissionDecision": "allow",
|
|
"permissionDecisionReason": "RTK auto-rewrite",
|
|
"updatedInput": $updated
|
|
}
|
|
}'
|