5.5 KiB
5.5 KiB
Toolbox Reading V2 Design
Goal
Add four new PowerShell-friendly, AI-friendly reading commands to the toolbox so the workflow can move from "find a file" to "read the right part" without falling back to Get-Content or wasting tokens on full-file dumps.
Scope
- Add
snipfor precise snippet extraction from files or stdin. - Add
outlinefor heuristic structure summaries of common source and config files. - Add
fileprobefor fast file-type and usefulness heuristics before opening a file. - Add
chunkcatfor deterministic chunk listing and chunk extraction from large text files. - Add help examples and README usage for all four commands.
- Reuse the existing workspace CLI contract: shared
--json,--input-format, exit codes, and PowerShell pipe support.
Non-Goals
- No TUI, pager, fuzzy picker, or interactive mode.
- No tree-sitter, Roslyn, or heavyweight language parser in this iteration.
- No write or patch workflow in this batch.
- No token estimation command, preview patch command, or replacement engine in this batch.
Design Direction
- Prefer heuristic parsing over heavyweight parsing.
- This keeps the binaries small, predictable, and fast enough for ad hoc shell use.
- False positives are acceptable when they are clearly labeled as heuristic output.
- Prefer compact text output that is useful to both humans and AI.
- Text mode should avoid banners and avoid dumping redundant metadata.
- JSON mode should expose stable machine fields so scripts can select the next action.
- Treat these commands as a chain rather than isolated tools.
fileprobeanswers "what is this file and should I read it?"outlineanswers "where is the interesting structure?"snipanswers "show me the exact region."chunkcatanswers "how do I traverse this large file safely?"
Command Designs
snip
- Input:
- one or more file paths from argv
- or stdin content when piped
- Selectors:
--lines <START[:END]>--around <REGEX>--symbol <NAME>- exactly one selector must be present
- Supporting flags:
--context <N>for--aroundand--symbol--max-matches <N>for--around
- Output:
- text mode emits
path:start-end reason=...followed by numbered lines - JSON mode emits an array of snippets with
path,start_line,end_line,reason, andlines
- text mode emits
- Heuristic behavior:
--symboluses language-aware regexes for Rust and C# plus generic fallbacks for other text files- when possible, symbol extraction expands to a balanced block instead of a single line
outline
- Input:
- one or more file paths from argv
- stdin paths in line mode
- Supported heuristic families:
- Rust:
mod,struct,enum,trait,impl,fn,const,static,type - C#:
namespace,class,struct,enum,interface,record, method-like members - JSON: object keys traversed by depth
- TOML: tables and keys
- YAML: indentation-based key outline
- Rust:
- Flags:
--depth <N>to cap nested output--kind all|code|config
- Output:
- text mode emits one compact line per item:
line depth kind name - JSON mode emits per-file objects with stable
items
- text mode emits one compact line per item:
- Heuristic behavior:
- items are marked by file-relative line number and depth, not claimed as exact AST nodes
fileprobe
- Input:
- one or more file paths from argv or stdin
- Output fields:
- path, extension, size, modified time
exists,is_dir,is_binary,encoding_hintfamilysuch assource,config,data,binary,archive,unknownlanguage_hintline_count,blank_lines,longest_line- heuristic flags such as
likely_generated,likely_minified,likely_test,likely_lockfile,likely_vendor - optional
container_hintsuch aspe,zip,sqlite,pdf
- Heuristic behavior:
- detect binary vs text from bytes and UTF-8 validity
- infer family and language from extension plus lightweight content checks
- do not parse PE deeply here;
binmetaremains the dedicated PE inspector
chunkcat
- Input:
- one text file path at a time in v1
- Flags:
--max-lines <N>defaulting to a budget-friendly size--overlap <N>for deterministic overlap between chunks--chunk <INDEX>to emit a specific chunk
- Output:
- without
--chunk, emit chunk inventory only - with
--chunk, emit the selected chunk with numbered lines - JSON mode emits chunk metadata, and chunk content only when
--chunkis set
- without
- Behavior:
- chunking is line-based and deterministic
- line ranges are stable for the same file contents and options
- overlapping chunks use a fixed stride of
max_lines - overlap
Shared Testing Strategy
- Add unit tests for:
- selector parsing
- heuristic file classification
- chunk calculation
- outline extraction helpers
- Add integration tests for:
--helpexamples- PowerShell pipeline scenarios
- JSON output shape for automation
- Add fixtures for:
- Rust source with multiple symbols
- C# source with Unity-style class structure
- JSON, TOML, and YAML config files
- minified/generated-ish text and simple binary-like samples
Risks
- Heuristic structure detection can misclassify edge-case syntax.
- This is acceptable if outputs are useful and clearly heuristic.
snip --symbolblock expansion can drift on malformed files.- Prefer a safe fallback to line-only snippets over panics or empty output.
chunkcatcan become noisy if default chunk size is too small.- Pick a conservative default tuned for AI reading, not log streaming.