Commit Graph

657 Commits

Author SHA1 Message Date
aesoft ced70c6f0d Merge pull request #1334 from wlami/feat/pulumi-add-cli-filters
feat(pulumi): add CLI filters for preview/up/destroy/refresh/stack
2026-06-23 21:39:20 +02:00
Wladi Mitzel 5cfe4d5f87 fix(pulumi): keep Owner and version in pulumi-stack filter
Per review: avoid signal loss that pushes agents to retry with
`rtk proxy`. pulumi-stack now keeps the full stack identity block
(Owner:, Pulumi version used:) alongside the header and Last updated:.
Only interactive prompt and help-footer noise is stripped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 14:51:39 +02:00
Wladi Mitzel 1f6e36b27e fix(pulumi): keep stack identity in pulumi-stack filter
Stop stripping `Current stack is X:` and `Last updated:`. pulumi stack
is read-only (exit 0) so there's no tee fallback; dropping the active
stack identity was irreversible signal loss. Keeping the header also
fixes the orphaned indented `Managed by <user>` line.

Owner: and Pulumi version used: remain stripped as noise.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 07:57:18 +02:00
aesoft 6946bf9562 Merge pull request #2502 from Tailoo/fix/2501-dotnet-test-failure-dedup
fix(dotnet): stop duplicating failures on failing test runs (#2501)
2026-06-22 15:50:05 +02:00
Wladi Mitzel 729ac36682 Merge remote-tracking branch 'upstream/develop' into feat/pulumi-add-cli-filters
# Conflicts:
#	src/core/toml_filter.rs
2026-06-22 13:41:33 +02:00
Tailoo 5e7eab5846 fix(dotnet): keep raw fallback when parsed failures incomplete
test_needs_raw_fallback dropped the raw stdout prepend whenever every
parsed failure carried detail, but never checked the list was complete
against summary.failed. A run reporting 5 failures but parsing only 3
detailed blocks would silently lose the 2 unparsed failures.

Add a `failed_tests.len() < summary.failed` clause so the raw fallback is
kept when the structured section is numerically incomplete. Add a
regression test and fix an inconsistent existing fixture (failed: 5 with a
single parsed entry) that the new clause correctly flagged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 22:41:00 +02:00
aesoft e3f60e9822 Merge pull request #2294 from jsiu93/fix/vitest-reporter-passthrough
fix(vitest): preserve explicit reporters
2026-06-20 17:17:41 +02:00
xiaozh f9469d12cf fix(vitest): add passthrough recovery hint
Explicit Vitest reporters can produce successful output that exceeds the passthrough cap. Track truncation as structured state and use force_tee_hint so the full verbose output remains recoverable.
2026-06-20 19:31:01 +08:00
Adrien Eppling d2babe2bfb test(main): classify oc subcommand in PASSTHROUGH allowlist 2026-06-19 13:15:20 +02:00
Adrien Eppling 177242ad83 Merge remote-tracking branch 'origin/master' into fix/oc-classification-resync 2026-06-19 11:29:58 +02:00
Tailoo 2d9dc1ab9e fix(dotnet): stop duplicating failures on failing test runs
On failing `dotnet test` runs the orchestrator prepended the full raw
stdout ahead of the filtered summary. The `Failed Tests:` section already
reproduces each failure (name + message + clipped stack) parsed from
TRX/console, so every failure was printed twice — inflating output +65%
vs raw, scaling linearly with failure count (issue #2501).

Gate the raw-stdout prepend behind `test_needs_raw_fallback`: skip it when
the structured section carries detail, keep it when the filter is blind
(no failures parsed, or a parsed failure has empty detail — e.g. a
self-closing <UnitTestResult> with no <ErrorInfo>, or a build failure /
crash where nothing reaches failed_tests).

Extracts two pure, unit-tested fns (`test_needs_raw_fallback`,
`compose_failure_output`) so the orchestration decision is covered without
running dotnet.

Closes #2501

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 22:46:27 +02:00
aesoft 39cbb96897 Merge pull request #2243 from Alcamech/feat/oc-support
feat(oc): add Openshift CLI support with shared k8s filtering
2026-06-18 22:08:08 +02:00
Ousama Ben Younes 3572d11e26 refactor(grep): extract error-exit decision into pure unit-tested fn
Address KuSh review on #2465:
- Move the `exit_code >= 2` decision into a pure `is_grep_error_exit`
  function and unit-test it directly (0/1 = normal, >=2 = error),
  instead of faking the rg binary in an integration test.
- Drop the GREP_ERROR_EXIT const; the doc comment on the function
  conveys the grep/rg exit convention.
- Remove tests/grep_error_test.rs (faked binary) in favour of the
  unit test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 17:06:14 +02:00
Ousama Ben Younes d727db3fa1 fix(grep): surface error on exit code >= 2 instead of false "0 matches"
Exit codes >= 2 signal real errors in grep/rg (bad regex, tool
crash, missing binary). rtk was only checking the narrow case
exit_code == 2 with non-empty stderr, letting any other error
exit masquerade as a clean "0 matches" false negative.

Now any exit code >= 2 surfaces the error to stderr instead of
printing a false zero-match result.

Fixes #2461
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:06:14 +02:00
aesoft c8722bd55e Merge pull request #2416 from BrokkAi/fix/hook-uv-run-pytest
fix(hook): rewrite pytest under uv run
2026-06-18 16:13:32 +02:00
Jonathan Ellis 34441dd464 fix(hook): treat uv run as a transparent prefix 2026-06-18 03:53:27 -05:00
Lawton Mizell c7f493b0cd feat(oc): add Openshift CLI support with shared k8s filtering 2026-06-17 10:08:28 -04:00
vegetablechicken233 abe7d4210e fix(grep): use portable --null in system grep fallback (BSD/macOS)
The system-grep fallback (used when ripgrep is not installed) passed
-rnHZ, relying on -Z for the NUL filename separator the match parser
requires. -Z only means --null on GNU grep; on BSD/macOS grep it is an
alias for --decompress (zgrep mode), so output is plain
file:line:content with no NUL. parse_match_line() then matches zero
filenames and every result collapses into "N matches in 0 files" with
all lines hidden behind [+N more].

Use the long option --null instead, which both GNU and BSD grep define
as "print a zero-byte after the file name".

Related to #2310

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-16 23:41:13 +02:00
aesoft 3a73bcdffc Merge pull request #2394 from hgunduzoglu/fix/diff-modified-lines-false-identical
fix(diff): report modified-only diffs and follow diff exit convention
2026-06-16 20:29:49 +02:00
Nicolas Le Cam 307b557383 feat(grep): sort content alphabetically 2026-06-14 15:31:20 +02:00
Nicolas Le Cam 34aac6ed95 refactor(grep): extract parse_cluster to make cluster parsing directly testable
The left-to-right scanning logic now lives entirely in parse_cluster(), which
returns a ClusterResult enum (Boolean or ValueTaking). extract_pattern_path
just dispatches on the result — no loop logic inline.

parse_cluster() is the only place that touches cluster bytes, so the full
contract is testable in isolation:

  parse_cluster("ecarrot") → ValueTaking { prefix: None, flag: 'e', inline: "carrot" }
  parse_cluster("rne")     → ValueTaking { prefix: Some("n"), flag: 'e', inline: "" }
  parse_cluster("g*.rs")   → ValueTaking { prefix: None, flag: 'g', inline: "*.rs" }
  parse_cluster("rn")      → Boolean(Some("n"))

strip_r() remains as the focused r/R-stripping helper used internally by
parse_cluster (and tested directly to document the "carrot"→"caot" danger).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 15:29:21 +02:00
Nicolas Le Cam 8d29f75833 fix(grep): restore strip_r as explicit testable helper + pre-existing clippy fix
The left-to-right cluster scan now calls strip_r() at emit time on the
accumulated flag-letter prefix (raw_prefix), never on inline value bytes.
This makes the safety contract explicit and testable: strip_r("carrot")
produces "caot", documenting exactly why it must not touch value bytes.

Also fix pre-existing unused-mut in aws_cmd.rs (has_output_flag).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 15:29:21 +02:00
Nicolas Le Cam b7d93b509e fix(grep): left-to-right cluster scan, long value flags, format passthrough
Five regressions on grep_arg_parsing vs develop:

- `-ecarrot` matched "caot" — strip_r was applied to the inline value bytes.
  Fix: scan cluster left-to-right; stop at first value-taking letter and
  treat the remainder as the inline value without r/R stripping.

- `-g*.rs` glob became `*.s` — same root cause, inline glob value r-stripped.

- `--glob '*.md'` took `*.md` as a path — no VALUE_FLAGS_LONG existed; the
  value token fell through to the positional collector.
  Fix: add VALUE_FLAGS_LONG covering all rg long flags that take a value.

- `--max-count 1 fn file` took `1` as the pattern — same missing long flag.

- VALUE_FLAGS_SHORT expanded: add t/T (--type/--type-not), d (--max-depth),
  M (--max-columns) so inline short forms and space-separated forms parse
  correctly without mis-routing values to patterns or paths.

- --regexp (long form of -e) now routes to patterns like -e does.

- has_format_flag: add --count-matches, --json, --passthru, --files so
  these output-format modes get passthrough treatment instead of silent
  "0 matches in 0 files".

2183 tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 11:44:32 +02:00
aesoft 069a089c40 fix(security): harden meta command list check
fail in cicd before letting meta command omission reach production
2026-06-12 14:56:27 +02:00
aesoft 9cc4937dac fix(security): harden installer checksum, filter-trust, meta-command fallthrough 2026-06-12 14:01:04 +02:00
Husam c126d4594b fix(diff): report modified-only diffs and follow diff exit convention
rtk diff treated files whose changes were all classified as modified
(similar lines, e.g. "a: 1" vs "a: 2" in YAML/JSON) as identical,
because the identical check only looked at added/removed counts.
Report any non-empty change set as a difference, and exit 1 when
files differ per diff convention (0 when identical).

Fixes #2364
2026-06-11 17:47:08 +03:00
Nicolas Le Cam 7d6255f0e0 fix(grep): code and test cleanup 2026-06-11 01:54:36 +02:00
Nicolas Le Cam acb3a2d5cd fix(grep): handle value-taking flags in tail position of short clusters
A combined cluster like -rne PATTERN or -rA 2 had the last flag's
value consumed only if the cluster was exactly 2 chars. Longer
clusters (e.g. -rne) fell through to process_flag, which stripped
-r and emitted -ne — then -e ended up in flags without a value,
causing rg to error.

New unified short-flag handler: for any single-dash cluster, inspect
the last byte. If it is -e or a VALUE_FLAGS_SHORT member, strip the
r/R chars from the prefix, emit the prefix as a flag (if non-empty),
and consume the next token as the value (pattern for -e, flag value
otherwise). Long flags (--foo) are still routed through process_flag.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 00:23:25 +02:00
Nicolas Le Cam c40b3ef9db fix(grep): fix value-taking flags, -rN clusters, multi-path, and -e patterns
Four bugs in `extract_pattern_path` caused `rtk grep` to misparse
common invocations:

- `-A 2 error src` → `2` was taken as the pattern (value-taking
  flags not recognised)
- `-rn foo src` → `n` leaked to rg as `--replace` value (only
  standalone `-r` was stripped, not combined clusters like `-rn`)
- `TODO src tests` → second path silently dropped (only one path
  kept)
- `-i x agent -g '*.md'` → rg regex error (`*.md` became positional
  before `-g` could consume it)

New implementation:
- `VALUE_FLAGS_SHORT`: explicit byte-set of 2-char flags that consume
  one following token (`A`, `B`, `C`, `g`, `f`, `j`, `m`)
- `process_flag()`: strips `r`/`R` from any single-dash cluster,
  drops `--recursive`; replaces the old inline `if arg == "-r"` loop
- `extract_pattern_path` returns `(Vec<String>, Vec<String>, Vec<String>)`
  (patterns, paths, flags) — no more `Option<String>` for pattern
- `-e` values collected separately; if any `-e` is present, all
  positionals are paths; otherwise first positional is the pattern
- All patterns forwarded to rg as `-e` flags (BRE `\|`→`|` inline)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 00:16:57 +02:00
Nicolas Le Cam 84616d131d fix(grep): stabilize argument parsing 2026-06-10 23:38:54 +02:00
Nicolas Le Cam 6785a6c769 fix: minor print_manual_instructions regression 2026-06-09 21:51:23 +02:00
Nicolas Le Cam c59a76375a review: cleanup code, comments and uneeded undocumented RTK_CLAUDE_DIR now that we have CLAUDE_CONFIG_DIR 2026-06-09 21:51:23 +02:00
Christian C. Berclaz 9671d9ea7e refactor(init): address review feedback on CLAUDE_CONFIG_DIR PR
- restore migration Outdated check in hook_check (binary registered +
  legacy script present still reports Outdated until cleanup)
- add error context to resolve_claude_dir call sites (provider, integrity)
- use CLAUDE_DIR const instead of literal in telemetry + provider test
- simplify settings_path construction in print_manual_instructions

Refs #2087
2026-06-09 21:51:23 +02:00
Christian C. Berclaz 05de9d366a fix(init): respect CLAUDE_CONFIG_DIR for global paths
rtk init -g ignored CLAUDE_CONFIG_DIR and always targeted ~/.claude.
Honor the env var Claude Code uses to relocate its config directory.

Priority: RTK_CLAUDE_DIR > CLAUDE_CONFIG_DIR > $HOME/.claude.
Empty values are treated as unset. Manual-step instructions now
print the resolved path instead of a hardcoded ~/.claude.

All callsites that previously hardcoded home.join(CLAUDE_DIR) now use
the shared resolve_claude_dir(): hook_check (rtk gain), integrity
(rtk verify), telemetry, and discover (rtk discover).

Closes #633
2026-06-09 21:51:23 +02:00
Vinicius Dufloth f8bc856078 style(mvn): align overflow tail with canonical '… +N more {label}' shape
Match the join_with_overflow convention (ellipsis char, '+N more' label)
used by container, aws, gh and glab so the LLM sees one consistent
overflow style. The tee '[full output: …]' recovery hint already comes
from core tee_and_hint via RunOptions::with_tee, so capped failure output
carries the canonical recovery path unchanged.
2026-06-07 14:36:46 -03:00
Vinicius Dufloth 3c0ee949d4 refactor(mvn): bind failure cap to truncate::CAP_WARNINGS, drop config knob
Replace the per-filter LimitsConfig::mvn_max_failures field with a local
const MAX_MVN_FAILING_CLASSES = CAP_WARNINGS, matching the canonical cap
binding used by pytest/rspec/rake/runner. Align cap = 0 semantics with the
core policy (summary-only: no blocks emitted, tail still counts) instead
of the old opt-out meaning, so the future config surface lands without a
special case.
2026-06-07 14:35:41 -03:00
Vinicius Dufloth f026cfd750 Merge branch 'develop' into feat/mvn-rust-module 2026-06-07 14:30:38 -03:00
aesoft 63a76dedff Merge pull request #1645 from KuaaMU/master
fix(filters): remove max_lines cap from helm filter that truncates template output
2026-06-07 15:36:42 +02:00
aesoft 9574007f77 Merge pull request #2135 from dessite/fix/aws-json-preserves-values-for-unsupported-subcommands
fix(aws): preserve values in JSON output for unsupported subcommands
2026-06-07 15:32:47 +02:00
aesoft 35273c2dc1 Merge pull request #2181 from rtk-ai/fix/curl-binary-passthrough-1087
fix(curl): passthrough binary downloads to prevent UTF-8 corruption (#1087)
2026-06-07 15:20:08 +02:00
Vinicius Dufloth df76528dd3 fix(mvn): strip post-failure help boilerplate in non-quiet mode
filter_quiet already dropped the help block Maven emits after
'Failed to execute goal' (See ..., -> [Help 1], Re-run Maven, help
URLs, bare [ERROR] dividers); the non-quiet paths kept it via the
[ERROR] catch-alls — keep_outside_block for test/package and
filter_compile's own [ERROR] branch.

Promote QUIET_BOILER_PREFIXES to a shared BOILER_PREFIXES (+
is_boilerplate(), which also covers the bare [ERROR] divider lines,
matching filter_quiet's existing drop) and reject boilerplate before
each [ERROR] catch-all. The list deliberately keeps the resume hint
([ERROR] After correcting the problems... / [ERROR]   mvn <args>
-rf :module) — actionable signal for resuming a multi-module build —
and the Failed to execute goal terminator.

keep_continuation hygiene (defensive parity, not a demonstrated bug):
filter_surefire only reset the flag inside its kept branch, so a
dropped [ERROR] line would leave it stale and a following indented
line could be wrongly kept. No committed fixture exhibits the leak;
add the same end-of-loop fall-through reset filter_package already
has. filter_compile resets on its new boilerplate drop path.

Multifail-slice savings rise from 19.9% to 42.3%; threshold pinned
at >=30% to match the reactor-fail precedent. README: document the
stripping and drop the stale duration-normalisation bullet (that
behaviour was removed in 77e28d0).
2026-06-06 11:12:10 -03:00
Vinicius Dufloth be28a51179 fix(ci): pin fixture line endings, harden CRLF tests
test (windows-latest) failed on the two CRLF tests: with no
.gitattributes, the Windows runner's core.autocrlf=true checks fixtures
out with CRLF, include_str! embeds \r\n, and the tests'
replace('\n', "\r\n") synthesis produces \r\r\n. str::lines() strips
only the final \r\n of each pair, leaving a stray \r that $-anchored
regexes (MODULE_BANNER, BUILD_FOOT) reject — dropping the module banner
and BUILD SUCCESS in the CRLF leg only. Real Maven CRLF output (single
\r\n) was always handled; only the synthesized double-CR leg broke.

Root-cause fix: tests/fixtures/** -text — fixtures are byte-exact
filter inputs; eol conversion must never touch them. Defense-in-depth:
the two CRLF tests normalize the embedded fixture back to LF before
synthesizing, so they stay correct even on checkouts without
attributes (zip downloads, pre-existing autocrlf clones).

Also fixes the test doc comment, which claimed str::lines() keeps the
trailing \r of a \r\n pair — it strips it; the hazard is the doubled
\r\r\n, not single CRLF.
2026-06-06 11:07:46 -03:00
Vinicius Dufloth 1050cfeadc fix(mvn): re-arm failure trail on per-test sublines
Surefire 3.x emits one blank-separated detail block per failing test
under a single class close line. The trail previously ended at the
first blank line and never re-armed, so failures after the first lost
their exception message (unindented -> dropped) and leaked the full
junit/jdk framework stack (indented -> kept by keep_continuation).

SurefireBlock now remembers the trail's keep/drop decision when it
ends at a blank line (trail_rearm) and re-enters the trail on the next
per-test subline with the same decision — a capped class drops all its
per-test blocks, not just the first. Any other non-blank line disarms
re-entry; RUNNING/commit/drop clear it so an unrelated class can never
inherit the decision. Extra blanks between per-test blocks stay armed.

Per-test sublines use '<<< ERROR!' for thrown (non-assertion)
exceptions — accept both markers via a shared is_per_test_subline()
(also reused by filter_quiet, which already re-armed correctly), and
widen the CLOSE regex to tolerate an ERROR! marker defensively
(Surefire 3.5.5 emits FAILURE! even for errors-only classes, per the
fixture capture; detection keys off the counts, not the marker).

Fixture captured from real Maven 3.9.9 / Surefire 3.5.5 output against
the new tests/fixtures/multifail-skeleton/ (CalcTest: assertion failure
+ thrown exception in one class; BoomTest: errors-only class). A
byte-exact pin locks the single-failure path unchanged.
2026-06-06 11:05:05 -03:00
xiaozh e9b82fc2bb fix(vitest): preserve explicit reporters 2026-06-06 10:42:53 +08:00
aesoft 0a630fe9ac Merge pull request #2289 from rtk-ai/refacto/strip-output-decorators
refacto(cmds): strip decorator noise from filter output
2026-06-05 18:31:39 +02:00
Adrien Eppling 16d6599b4c refacto(cmds): strip decorator noise from filter output
Separator lines (═══, ---) and an emoji status marker cost tokens
without adding signal for the LLM — RTK output must never add noise
over raw. Semantic labels are kept; the emoji is swapped for plain
monochrome unicode.
2026-06-05 17:41:53 +02:00
Adrien Eppling 66d66b1fe6 fix: semgrep markers on test-fixture sensitive paths 2026-06-05 16:20:08 +02:00
Adrien Eppling 7a985c7b22 test(hook): Copilot CLI acceptance tests 2026-06-05 16:03:00 +02:00
aesoft e16aa26162 fix(permissions): >&file redirect no allow + scope Gemini/Cursor config 2026-06-05 14:03:48 +02:00
aesoft f88b6bec13 fix(permissions): project-first config lookup for Gemini/Cursor 2026-06-05 14:03:46 +02:00