# lets > `lets` is a file-operations CLI for coding agents: Locate, Edit, Transform, Show. One Bash call reads, searches, edits or transforms several files and returns bounded, numbered output whose last line (the footer) names everything it left out. One static Rust binary; no index, no daemon, no config file. Install on Linux or macOS with `curl -fsSL https://raw.githubusercontent.com/mayberuk/lets/main/install.sh | sh`, then `lets hooks install claude-code` (or `lets hooks install codex`). Run it through Bash the way you already run `cat` or `grep`: `lets show`, `lets find`, `lets edit`, `lets transform`, `lets write`. Pass several files or ranges to one call instead of one call per file; every verb accepts a list. If the footer doesn't name a cut, nothing was cut, so trust the output and skip the follow-up read. In particular, never `cat` or `sed -n` a file right after a `lets edit` on it: the changed region and a syntax-check result are already in that edit's own output. Run `lets` without `| head`: output is already bounded (200 lines per file, 50 search hits by default), and a call over budget exits non-zero and says so rather than truncating silently. Branch on the exit code or the last stderr line, `ERROR_CODE=`, not on the message text: 0 done; 1 `not_found`, `over_cap`, `invalid_pattern`, `exists`, `empty_input`, `empty_file`, `mixed_endings`, `no_grammar`, `update_available`, `path_conflict`, `not_on_path`, `no_repository`, `guessed_span`; 2 `ambiguous`, `expect_refused`; 3 `check_failed`; 4 `over_budget`; 5 `changed`; 6 `outside_tree`; 7 `unsupported_file`, `locked`, `read_only`, `io_error`, `update_failed`; 8 `partial_batch`; 64 `usage`. Full table: https://lets.mayberuk.com/docs/exit-codes.md. The target grammar every verb speaks: `path`, `path:40`, `path:40-80`, `path@'regex'`, `path#symbolName`. `find` needs only a path or directory, not a target, but every hit it prints is itself a valid target (`path:line`) for a following `show` or `edit`. ## Docs - [lets show](https://lets.mayberuk.com/docs/show.md): Read files, line ranges, symbols and regex-anchored context — several targets per call, with a bounded window and an honest footer. - [lets find](https://lets.mayberuk.com/docs/find.md): Search files or directories and print hits as path:line, capped at 50 hits, reporting instead of flooding. - [lets edit](https://lets.mayberuk.com/docs/edit.md): Content-addressed, exactly-once text replacement, with the post-state and a syntax check returned in the same call. - [lets transform](https://lets.mayberuk.com/docs/transform.md): Structured edits for JSON, YAML, TOML and markdown frontmatter — a dotted path in, the changed value back, comments and order preserved. - [lets write](https://lets.mayberuk.com/docs/write.md): Create a file from stdin, checked on creation, refusing a silent overwrite or a silent empty file. - [Install and update](https://lets.mayberuk.com/docs/install.md): The install.sh one-liner and its flags, the dist installer, and lets update / lets version. - [lets hooks and lets hook classify](https://lets.mayberuk.com/docs/hooks.md): How lets reaches an agent without asking it to remember a prose rule — installing the integration, and what the PreToolUse classifier blocks. - [lets guide](https://lets.mayberuk.com/docs/guide.md): The one-screen cheat sheet lets guide prints — verbs, targets and exit codes, meant to be read once per session. - [lets stats](https://lets.mayberuk.com/docs/stats.md): Aggregate session-transcript counts for the hook and the lets calls it drove — what each field counts, --dir, --since and --json. - [Target grammar](https://lets.mayberuk.com/docs/targets.md): The one grammar show, edit and transform speak for a path, a line, a range, a regex anchor or a symbol. - [Exit codes](https://lets.mayberuk.com/docs/exit-codes.md): The full table of exit codes and slugs every verb can return, and the rule for branching on the slug instead of the message text. - [--json and --jsonl](https://lets.mayberuk.com/docs/json.md): The structured output shape every reporting verb carries — one object for --json, one object per item plus a trailing stats record for --jsonl. ## Optional - [Product overview](https://lets.mayberuk.com/index.md): what `lets` replaces, the two ideas behind it, five before/after pairs, measured results and install. - [Full reference in one file](https://lets.mayberuk.com/llms-full.txt): the product overview and every page above concatenated, for a single fetch that teaches the whole API.