10 KiB
Mercury Toolbox V2 Design
Goal
Promote the repository from a generic AI-friendly CLI toolbox into the formally named Mercury Toolbox / 水星工具箱, add four new high-leverage commands for search-to-context, diagnostics, log reduction, and binary string triage, and ship a first-class Windows + PowerShell installation path that automatically places the toolbox on the user PATH.
Scope
- Rename the toolbox brand in repository-level docs, workspace metadata, install-facing text, and user help from the generic placeholder wording to
Mercury Toolbox/水星工具箱. - Add four new commands:
hitsnipdiagpicklogshapestringscan
- Keep natural binary names such as
snip,outline,hitsnip, anddiagpick; do not introduce a global binary prefix. - Add a user-facing PowerShell installer that:
- builds the workspace release binaries
- installs all toolbox binaries into
$env:LOCALAPPDATA\MercuryToolbox\bin - automatically adds that directory to the user PATH if missing
- reports what changed and how to verify the install
- Add a complementary uninstall path and installation documentation.
- Preserve the shared CLI contract:
- compact ASCII text output by default
--jsonfor machine consumption- PowerShell-friendly stdin behavior
- stable exit code mapping
Non-Goals
- No GUI, TUI, or long-running background service.
- No package publishing, Scoop bucket, installer EXE, or code signing in this iteration.
- No heavyweight parser stack such as tree-sitter, Roslyn, or full symbol servers.
- No single “master” control binary; the toolbox remains a workspace of small independent commands.
Product Direction
The existing toolbox already covers “find a file”, “probe the environment”, and “read a known target”. The new batch fills the remaining gaps that are especially painful for AI-assisted terminal workflows:
hitsnipanswers “I already have search hits; now give me the smallest useful context.”diagpickanswers “this compiler or runtime log is noisy; show me the actionable diagnostics.”logshapeanswers “this log is too repetitive; summarize the patterns before I read it.”stringscananswers “this binary or generated blob is opaque; show me the strings that reveal identity, runtime, and ecosystem.”
The installation work is part of the feature set, not a side quest. A toolbox that is annoying to install has near-zero real-world value even if the commands are good.
Branding And Naming
Repository Name
- Primary English name:
Mercury Toolbox - Primary Chinese name:
水星工具箱 - Documentation should treat these as the formal product name, not as aliases for the old placeholder wording.
Binary Names
- Keep natural command names:
jsonlgreprecentpathshadowportpingbinmetafileprobeoutlinesnipchunkcathitsnipdiagpicklogshapestringscan
- Do not add
mercury-prefixes. - The installer owns product-level grouping; the binaries stay small and task-specific.
Installation Design
Main Installation Path
- Add
scripts/install-toolbox.ps1 - Default behavior:
- verify
cargoexists - run
cargo build --release --workspace - collect all known toolbox executables from
target\release - create
$env:LOCALAPPDATA\MercuryToolbox\binif needed - copy all toolbox executables into that directory
- inspect the user PATH
- append the install directory if missing
- print a compact summary of installed commands and PATH status
- verify
PATH Policy
- PATH updates target the user-level environment variable, not machine-wide PATH.
- The script should avoid duplicate path entries by normalizing path comparison.
- Current-session PATH may also be patched so the commands are usable immediately after install without opening a new shell.
Safety And UX
- Support
-NoPathUpdatefor explicit opt-out. - Support
-InstallRoot <PATH>for advanced/manual installs, while defaulting to$env:LOCALAPPDATA\MercuryToolbox. - Support
-Configuration Debug|Release, defaulting toRelease. - Text output should clearly distinguish:
- install root
- bin directory
- copied binaries
- whether PATH was already configured, updated, or skipped
Uninstall Path
- Add
scripts/uninstall-toolbox.ps1 - Default behavior:
- remove installed binaries from the Mercury Toolbox bin directory
- remove the Mercury Toolbox bin directory from the user PATH when present
- leave unrelated files untouched
Fallback Installation Path
- README also documents manual per-command install via
cargo install --path crates/<command>. - This is a fallback path for Rust-native users, not the primary recommendation.
Command Designs
hitsnip
Purpose
Convert search hits into deduplicated, compact context windows so neither humans nor AI have to manually reopen each hit.
Inputs
- Explicit files plus line references in one of these forms:
path:linepath:line:column
- stdin text from tools such as
rg -n - JSONL hit records with at least
pathandline
Output
- Text mode:
- one header per merged snippet
- numbered lines under each snippet
- compact reason metadata such as hit count and merged line span
- JSON mode:
- one JSON array of snippet objects
- fields:
pathstart_lineend_linehit_lineshit_countlines
Behavior
- Merge nearby hits in the same file when the distance between hit windows is at most
--max-gap. - Expand each hit by
--contextlines. - Deduplicate repeated identical hit lines.
- Ignore malformed lines with clear usage/runtime errors rather than panicking.
Key Flags
--context <N>--max-gap <N>--limit <N>--input-format auto|lines|jsonl- shared
--json
diagpick
Purpose
Extract actionable diagnostics from compiler, build, and runtime logs and optionally attach source context.
Inputs
- Plain text logs from stdin or files
- JSONL records with fields such as
path,line,column,severity,message
Recognized Text Patterns
- Rust diagnostics:
error[E0425]: ...--> path:line:column
- MSVC/C#/Unity-style:
path(line,column): error CSxxxx: ...path:line:column: error: ...
- Generic runtime stack/log references where a path and line are present
Output
- Text mode:
- one compact record per diagnostic
- optional source snippet below when
--with-sourceis enabled
- JSON mode:
- array of diagnostics with stable fields:
pathlinecolumnseveritycodemessagesourcetool_hint
- array of diagnostics with stable fields:
Key Flags
--with-source--context <N>--limit <N>--severity error|warning|note|all
logshape
Purpose
Collapse repetitive logs into pattern groups before anyone spends tokens reading the raw stream.
Inputs
- Plain log lines from stdin or files
Heuristic Normalization
- Replace volatile fragments with placeholders:
- timestamps
- decimal and hex numbers
- UUID-like tokens
- long paths and addresses
- Preserve level-like prefixes such as
INFO,WARN,ERRORwhen possible
Output
- Text mode:
- one compact line per template
- includes count and a representative sample
- JSON mode:
- array of groups with fields:
patterncountfirst_linelast_linesample
- array of groups with fields:
Key Flags
--top <N>--min-count <N>--show-samples--keep-level
stringscan
Purpose
Expose the high-signal strings inside binaries, generated files, and opaque artifacts for reverse engineering and quick triage.
Inputs
- One or more file paths from argv or stdin
Output
- Text mode:
- one compact summary line per file in summary mode
- optional per-string output when filtering by category
- JSON mode:
- per-file reports with:
pathis_binarystring_countcategoriesmatches
- per-file reports with:
Heuristic Categories
urlpathdllnamespaceunitydotnetil2cppbepinexgeneric
Key Flags
--min-len <N>--kind all|url|path|dll|namespace|unity|dotnet|il2cpp|bepinex|generic--unique--limit <N>--details
Shared Fixtures
Add fixtures that support these commands without introducing heavyweight dependencies:
fixtures/hits/rg-output.txtfixtures/diag/rust-errors.txtfixtures/diag/unity-errors.txtfixtures/logs/repetitive.logfixtures/binaries/stringscan-sample.bin
The binary fixture should embed obvious markers such as URLs, DLL names, Unity namespace fragments, and BepInEx-like strings so category detection can be tested reliably.
Testing Strategy
- Unit tests:
- hit parsing and merge planning for
hitsnip - diagnostic parsing helpers for
diagpick - normalization and grouping for
logshape - string extraction and category heuristics for
stringscan - installer path normalization and PATH edit helpers
- hit parsing and merge planning for
- Integration tests:
--helpexamples for all new binaries- PowerShell pipeline flows
- JSON output shape
- install/uninstall script dry-run or temp-root behavior
- Verification gates stay under the existing Jade standard, including
check-jade.ps1.
Risks
- Search-hit parsing can get messy when input mixes drive-letter paths and colon-separated line syntax.
- Prefer a path-aware parser that handles Windows drive prefixes before splitting on the final line/column segments.
- Diagnostic parsers can drift when tools change exact wording.
- Keep the patterns heuristic and additive rather than pretending to be a full parser for each toolchain.
- Over-normalizing logs can merge meaningfully different failures.
- Keep the normalization rule set conservative in v1.
- Binary string scanning can explode in output volume.
- Default to concise summaries and require explicit detail flags for large per-string dumps.
- PATH editing is user-hostile if it duplicates entries or stomps unrelated content.
- Use minimal, append-only edits with idempotent detection.