mirror of
https://github.com/rtk-ai/rtk.git
synced 2026-09-19 07:33:17 +08:00
dev-0.38.0-rc.174
13 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
deda44f736 | fix(docs): clean some docs + disclaimer | ||
|
|
6878819798 | fix: remove dead code | ||
|
|
77a0951433 |
fix(cmds): shared cmd execution flow + clean & update docs
shared cmd exec flow and also removed some notes in technical docs (does not belong here) |
||
|
|
46fa31c4b8 |
chore(refacto-codebase): Folders + Technical docs
- codebase more clear for humans and AI agents - alignement on vision and filter quality in technical docs |
||
|
|
f7b09fc86a |
fix(formatter): show full error message for test failures (#690)
format_compact() was truncating error messages to 2 lines via .take(2). Playwright (and vitest, pytest, cargo test) errors contain the critical expected/received diff and call log starting at line 3+, so agents saw only the error type with no actionable debug information. Fix: iterate all lines of error_message for each failure instead of taking the first 2. Summary line stays compact; only the per-failure detail is preserved in full. Affects all test runners using TestResult (playwright, vitest, cargo, pytest, dotnet) — any test failure is now fully visible. Closes #690 Signed-off-by: Ousama Ben Younes <benyounes.ousama@gmail.com> |
||
|
|
4d799b0e0a |
fix: remove all decorative emojis from CLI output (#687)
* fix: remove decorative emojis from CLI output (#511) Replace decorative emojis with plain text to reduce token waste. Keep functional symbols (⚠️ ✓ ❌ ✅ ℹ️) that convey meaning in fewer tokens. Signed-off-by: Patrick Szymkowiak <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: remove remaining decorative emojis from find_cmd and formatter Missed in initial emoji cleanup pass: 📁 in find_cmd.rs and parser/formatter.rs Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: remove all decorative emojis from CLI output (#511) Replace emojis with plain text tokens across all production files for better LLM compatibility. Test fixtures and external tool detection patterns (e.g. Black's "All done!") are preserved. Signed-off-by: Patrick Szymkowiak <patrick@rtk-ai.app> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: remove last decorative emoji from next_cmd.rs Remove ⚡ from Next.js Build header, missed in previous passes. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: remove remaining emojis from gh_cmd.rs and init.rs Replace production emojis: - gh_cmd.rs: 🟣→[merged], ⚪→[unknown]/[pending], ⭐→removed, 🔱→removed - init.rs: ⚪→[--] for "not found" status indicators Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: remove all checkmark emojis from CLI output Replace ✓ (U+2713) with plain text across 19 files: - "ok ✓" → "ok" (git add/commit/push/pull) - "✓ cargo test: ..." → "cargo test: ..." (all tool summaries) - Preserved ✓ in input detection patterns and test fixtures LLMs cannot interpret emoji semantics; plain text is clearer. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick Szymkowiak <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> Signed-off-by: Patrick Szymkowiak <patrick@rtk-ai.app> |
||
|
|
8fae5b067d |
Release v0.31.0 — develop → master (#666)
* fix: P1 exit codes, grep regex perf, SQLite WAL (#631) * fix: P1 exit codes, grep regex perf, SQLite concurrency Exit code propagation (same pattern as existing modules): - wget_cmd: run() and run_stdout() now exit on failure - container: docker_logs, kubectl_pods/services/logs now check status before parsing JSON (was showing "No pods found" on error) - pnpm_cmd: replace bail!() with eprint + process::exit in run_list and run_install Performance: - grep_cmd: compile context regex once before loop instead of per-line in clean_line() (was N compilations per grep call) Data integrity: - tracking: add PRAGMA journal_mode=WAL and busy_timeout=5000 to prevent SQLite corruption with concurrent Claude Code instances Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: address review findings on P1 fixes - tracking: WAL pragma non-fatal (NFS/read-only compat) - wget: forward raw stderr on failure, track raw==raw (no fake savings) - container: remove stderr shadow in docker_logs, add empty-stderr guard on all 4 new exit code paths for consistency with prisma pattern Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: raise output caps for P0 bugs (#617, #618, #620) (#630) * fix: raise output caps for grep, git status, and parser fallback (#617, #618, #620) - grep: per-file match cap 10 → 25, global max 50 → 200 - git status: file list caps 5/5/3 → 15/15/10 - parser fallback: truncate 500 → 2000 chars across all modules These P0 bugs caused LLM retry loops when RTK returned less signal than the raw command, making RTK worse than not using it. Fixes #617, #618, #620 Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: update README example and add truncation tests for modified/untracked - parser/README.md: update example from 500 → 2000 to match code - git.rs: add test_format_status_modified_truncation (cap 15) - git.rs: add test_format_status_untracked_truncation (cap 10) Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * refactor: extract output caps into [limits] config section Move hardcoded caps into config.toml so users can tune them: [limits] grep_max_results = 200 # global grep match limit grep_max_per_file = 25 # per-file match limit status_max_files = 15 # staged/modified file list cap status_max_untracked = 10 # untracked file list cap passthrough_max_chars = 2000 # parser fallback truncation All 8 modules now read from config::limits() instead of hardcoded values. Defaults unchanged from previous commit. Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * feat(.claude): add /rtk-triage skill — cross-analysis of PRs and issues (#662) * feat(.claude): add /rtk-triage skill — orchestrated PR+issue cross-analysis New skill that runs issue-triage + pr-triage in parallel then produces a cross-analysis layer that neither skill can do individually: - Double coverage detection: identifies when 2+ PRs target the same issue (via body scan + file overlap), recommends which to keep/close - Security gap detection: for security review issues, maps each finding to a PR (or flags it as uncovered) - P0/P1 bugs without PR: groups by pattern to suggest sprint batching - Our dirty PRs: identifies probable cause (conflict with sibling PR, needs rebase, missing linked issue) Output is saved automatically to claudedocs/RTK-YYYY-MM-DD.md. Usage: /rtk-triage (French, auto-save) /rtk-triage en (English output) Signed-off-by: Florian Bruniaux <florian@bel-etage.com> Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com> * docs(architecture): update module count to 66 Sync ARCHITECTURE.md with current main.rs state. Previous count (60) was stale since several modules were added (dotnet_cmd, dotnet_format_report, dotnet_trx, npm_cmd, gt_cmd, etc.). Signed-off-by: Florian Bruniaux <florian@bel-etage.com> Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com> --------- Signed-off-by: Florian Bruniaux <florian@bel-etage.com> Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com> * fix: subcommand routing drops unrecognized subcommands (#600) (#601) - git stash: pass unknown subcommands (save, branch, clear) through instead of silently falling back to git stash push - git branch: add --show-current, --set-upstream-to, --format, --sort to flag detection so they don't get overridden by -a injection - pip: replace bail!() with passthrough for unknown subcommands (freeze, download, wheel, etc.) Fixes #600 Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: resolve cargo fmt + 54 clippy warnings blocking CI (#663) cargo fmt diffs in config.rs, git.rs, playwright_cmd.rs were failing the fmt CI check, which cascaded to block clippy/test/security on PRs #632, #635, #638. Also fixes all clippy warnings: dead code annotations, iterator simplifications, assert patterns, and unnecessary allocations. Signed-off-by: Patrick Szymkowiak <patrick@rtk-ai.app> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: discover absolute paths + git global options (#485, #163) (#518) * fix: discover classifies absolute paths like /usr/bin/grep (#485) Normalize absolute binary paths before classification: /usr/bin/grep → grep, /bin/ls → ls, /usr/local/bin/git → git Adds strip_absolute_path() helper + 5 tests. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: discover and rewrite support git global options -C, --no-pager, etc. (#163) Strip git global options (-C <path>, -c <key=val>, --git-dir, --work-tree, --no-pager, --no-optional-locks, --bare, --literal-pathspecs) before classification so git -C /tmp status is recognized as rtk git. Rewrite preserves global options: git -C /tmp status → rtk git -C /tmp status Adds GIT_GLOBAL_OPT lazy_static regex + strip_git_global_opts() helper + 6 tests. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: prevent double `--` separator in cargo clippy with -p flags (#519) When running `rtk cargo clippy -p my-crate -- -D warnings`, Clap with `trailing_var_arg = true` preserves the `--` in parsed args when flags precede it. `restore_double_dash()` then added a second `--`, producing `cargo clippy -p my-crate -- -- -D warnings`. This caused rustc to interpret `-D` as a filename instead of a lint flag. Fix: skip restoration when args already contain `--` (Clap preserved it). Fixes #496 Signed-off-by: Ousama Ben Younes <benyounes.ousama@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * ci: add PR template + target branch check (#521) - PR template reminds contributors to target develop - CI workflow labels PRs targeting master with 'wrong-base' and posts a comment - Excludes develop→master PRs (maintainer releases) Signed-off-by: Patrick <patrick@rtk-ai.com> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: prevent rtk read from corrupting JSON/YAML/data files (#522) Add Language::Data variant for data formats (JSON, YAML, TOML, XML, CSV, etc.) with empty comment patterns to prevent comment stripping. AggressiveFilter falls back to MinimalFilter for data files. Fixes #464 Signed-off-by: Ousama Ben Younes <benyounes.ousama@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix: skip rewriting find/fd in pipes to preserve xargs compatibility (#439) (#563) rtk find outputs a grouped format incompatible with pipe consumers like xargs, grep, wc, sort. Skip rewrite when find/fd is followed by a pipe, preserving native one-per-line output. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: add hint when git diff is truncated + fix --no-compact passthrough (#427) (#564) When compact_diff truncates output, append a hint line so Claude knows how to get the full diff: [full diff: rtk git diff --no-compact] Also fix --no-compact flag being passed to git (causing usage error) and remove decorative emoji from compact_diff output. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: propagate exit codes in git diff, status+args, commit, and branch (#632) 4 P1 bugs where git exit codes were swallowed: - git diff: failure silently printed empty stat output - git status (with args): failure was filtered instead of propagated - git commit: failure printed "FAILED" but returned Ok(()) breaking pre-commit hooks - git branch (list mode): failure was silently ignored All now follow the established pattern: eprint stderr, track raw==raw, process::exit(code). Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * feat: add 5 new TOML filters (ollama, nx, gradle, spring-boot, jira) (#635) * feat: add 5 new TOML built-in filters (ollama, nx, gradle, spring-boot, jira) New filters for commands not covered by Rust modules: - ollama: strip ANSI spinners, keep final text response (#624) - nx: strip Nx monorepo noise, keep build results (#444) - gradle/gradlew: strip UP-TO-DATE tasks, keep build summary (#147) - spring-boot: strip banner and verbose logs, keep startup/errors (#147) - jira: strip blanks, truncate wide columns (#524) All 5 filters pass inline tests via rtk verify (123/123). Updated builtin filter count: 47 -> 52. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * feat: add 5 more TOML filters (turbo, mise, just, task, yadm) New filters for task runners and git wrapper: - turbo: strip cache/Tasks/Duration noise, keep task output (#531) - mise: strip install/download progress, keep task results (#607) - just: strip blanks and recipe headers, keep output (#607) - task: strip task headers and up-to-date lines, keep results (#607) - yadm: strip hint lines, compact git-like output (#567) All verified with fake binaries through catch-all TOML engine. 137/137 TOML tests pass, 934 Rust tests pass. Updated builtin filter count: 52 -> 57. Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> * fix: replace emojis with plain text in git status output (#603) (#638) Git status output used emojis (📌, 📝, ❓, ✅, ⚠️) that confuse non-Claude LLMs (GPT, etc.) causing retry loops. Replace with plain text labels (branch:, modified:, staged:, untracked:, conflicts:). Also add "clean — nothing to commit" when working tree is clean, so LLMs understand the repo state without ambiguity. Before: 📌 master After: branch: master clean — nothing to commit Fixes #603 Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> --------- Signed-off-by: Patrick <patrick@rtk.ai> Signed-off-by: Patrick szymkowiak <patrick.szymkowiak@innovtech.eu> Signed-off-by: Florian Bruniaux <florian@bel-etage.com> Signed-off-by: Florian BRUNIAUX <florian@bruniaux.com> Signed-off-by: Patrick Szymkowiak <patrick@rtk-ai.app> Signed-off-by: Ousama Ben Younes <benyounes.ousama@gmail.com> Signed-off-by: Patrick <patrick@rtk-ai.com> Co-authored-by: Florian BRUNIAUX <florian@bruniaux.com> Co-authored-by: Ben Younes <benyounes.ousama@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
155e26423d |
fix: prevent UTF-8 panics on multi-byte characters (#93)
* fix: prevent UTF-8 panics on multi-byte characters (Thai, emoji, CJK) Replace all byte-indexed string slicing (`&s[..n]`) with char-aware operations across 10 locations in 7 files. Rust strings are UTF-8, so byte slicing can land mid-character on Thai (3 bytes), emoji (4 bytes), or CJK text and panic at runtime. Fixes applied: - git.rs: filter_log_output, format_status_output - log_cmd.rs: error/warning message truncation (2 locations) - env_cmd.rs: long value display, mask_value - parser/mod.rs: truncate_output - grep_cmd.rs: clean_line (pattern context + fallback truncation) - wget_cmd.rs: compact_url, truncate_line, parse_error Also adds safe_char_boundary() utility and 20 regression tests covering Thai, emoji, and CJK input across all affected modules. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: collect chars once in compact_url to avoid redundant iteration Address review feedback: collect chars into Vec once instead of calling .chars() multiple times. Also fixes byte-vs-char length check. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: remove unused safe_char_boundary function and tests Address review: function was defined but never called anywhere. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: convert remaining is_char_boundary to full .chars() approach Address review: use consistent .chars() everywhere instead of mixing byte-based is_char_boundary with char-based operations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
e5adba8b21 |
fix(vitest): robust JSON extraction for pnpm/dotenv prefixes (#92)
* fix(vitest): robust JSON extraction for pnpm/dotenv prefixes
Problem: RTK's vitest parser forces --reporter=json but pnpm/dotenv prepend
non-JSON text to stdout (banners, env messages), causing 100% Tier 1 failure
and useless 500-char passthrough.
Solution:
- Add extract_json_object() to parser/mod.rs (shared utility)
- Algorithm: find "numTotalTests" or first standalone {, brace-balance forward
- VitestParser now tries direct parse → extract+parse → regex → passthrough
- Replace hardcoded Command::new("pnpm") with package_manager_exec("vitest")
- Delete orphan doc comment on line 203
Impact:
- Before: 100% Tier 3 passthrough with pnpm workflows
- After: Tier 1 success with prefixes, maintains 99.5% token savings
Tests:
- 6 tests for extract_json_object (clean, pnpm, dotenv, nested, no-json, strings)
- 3 tests for VitestParser with prefixes
- All 277 tests pass
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* chore(benchmark): add vitest, pnpm, and gh commands
Add benchmarks for recently implemented commands:
- vitest run (PR #92 - JSON extraction fix)
- pnpm list/outdated (PR #6)
- gh pr list/run list (existing gh support)
These commands are now tested in CI to ensure token savings are maintained.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
|
||
|
|
60d2d252ef |
fix: P0 crashes + cargo check + dedup utilities + discover status
Phase 1: Fix P0 crashes (3 bugs) - Add external_subcommand fallback for cargo/docker/kubectl - Fixes crashes on unsupported subcommands (e.g., cargo fmt, docker build) - All passthroughs now route gracefully instead of Clap parse errors Phase 2: cargo check handler + refactor (-40 lines) - Add dedicated cargo check handler (most frequently used missing command) - Extract run_cargo_filtered() to eliminate 90 lines of duplication - Fix filter_cargo_build() to handle "Checking" prefix (not just "Compiling") - Normalize exit code propagation in run_test() Phase 3: Utility deduplication (-60 lines) - Fix utils::truncate() Unicode handling (char-aware, not byte-based) - Remove 5 duplicated utility functions across modules: - 3x truncate() → use crate::utils::truncate - 1x strip_ansi() → use crate::utils::strip_ansi - Replace ~60 lines of inline package manager detection with utils::package_manager_exec() - Clean: lint_cmd, prettier_cmd, playwright_cmd now use shared utils Phase 4: Discover reporting improvements - Add RtkStatus enum (Existing/Passthrough/NotSupported) - Show status column in discover report to distinguish handler types - Prevents future misleading "build 9 git subcommands" false analyses Cleanup: - Remove 2 unused imports (parser::ParseError, std::collections::HashMap) - Reduce clippy warnings from 23 to 19 Testing: - 220 tests pass - 88 smoke tests pass - All manual verification complete Net: +10 lines, -3 P0 bugs, -5 duplications, +1 feature, +1 enum Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|
|
b13d92c9ea |
fix(docs): escape HTML tags in rustdoc comments
Fixes 6 rustdoc warnings: - Escape <action>, <detail>, <hash>, <branch>, <stats> tags - Use backticks for [RTK:PASSTHROUGH] marker All rustdoc warnings now resolved. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|
|
a27bce82f0 |
fix: allow git status to accept native flags
Previously, `rtk git status` was the only git subcommand that rejected all arguments. This fix aligns it with other git subcommands (diff, log, show, etc.) by accepting native git flags. Changes: - Extract format_status_output() as pure testable function - Add args variant to Clap Status command with trailing_var_arg - Modify run_status() to accept args parameter - Passthrough mode: if user provides flags (--short, -s, --porcelain), forward directly to git without RTK formatting - Default mode: no flags = RTK compact formatting (unchanged behavior) - Add 5 unit tests for format_status_output (clean, modified, untracked, mixed, truncation) - Add 4 smoke tests for flag passthrough (--short, -s, --porcelain) Test results: - 151 unit tests passed (5 new) - 69 smoke tests passed (4 new for status flags) Fixes the issue where commands like `rtk git status --short` were rejected with "unexpected argument" error. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|
|
edab4e142e |
feat: add parser infrastructure with three-tier fallback system
Implement Phase 3 of maintainability plan - unified parser architecture: **Core Components:** - parser/mod.rs: OutputParser trait + ParseResult enum (Full/Degraded/Passthrough) - parser/error.rs: ParseError types with thiserror (JSON, Pattern, Partial, etc.) - parser/types.rs: Canonical types (TestResult, LintResult, DependencyState, BuildOutput) - parser/formatter.rs: TokenFormatter trait with Compact/Verbose/Ultra modes - parser/README.md: Complete usage guide and migration examples **Three-Tier Fallback System:** 1. Tier 1 (Full): Complete JSON parsing with structured data 2. Tier 2 (Degraded): Partial regex extraction with warnings 3. Tier 3 (Passthrough): Truncated raw output with [RTK:PASSTHROUGH] marker **Benefits:** - Never returns false data silently (fixes prisma_cmd issue) - Graceful degradation on tool version changes - Unified interface across all tool types - Observable degradation with [RTK:DEGRADED] warnings - Foundation for Phase 4 module migrations **Dependencies:** - Added thiserror 1.0 for structured error types **Testing:** - 3 unit tests for ParseResult tier system - Tests pass: tier(), is_ok(), map(), warnings() Next: Phase 4 - Migrate existing modules to use parser trait Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |