Repository navigation
v0.7.0
-
Add informational paired benchmark history with raw measurements, variability, and explicit baselines.
-
Allow serialized coverage backfill from an existing completed CI run without rerunning tests.
-
Publish successful coverage despite unrelated CI failures, and show post-merge before
pre-merge within each PR in the two-phase coverage view. -
Show one coverage result per PR, replacing pre-merge with exact-commit post-merge coverage
when available; show both phases separately without repeated main runs or attempts. -
Refresh coverage overview ordering on PR merge, closure, or reopening without waiting for another CI run.
-
Run Python tooling tests and resource benchmarks through explicit Aspect Bazel targets and a
hermetic Python 3.13 interpreter; keep pre-commit focused on fast checks. -
Suggest similar registered flags, primaries, topics, and aliases for misspelled help selectors.
-
Order coverage reports by actual PR merge and tag timestamps, without standalone main rows.
Omit closed, unmerged PRs from the overview while retaining their reports. -
Rank fuzzy flag suggestions and show up to three candidates for misspelled options.
-
Avoid redundant help spacing in console, Markdown, and man-page output while preserving
intentional blank lines in code examples. -
Default help and width-controlled comparison summaries to
--width=auto:110. Support custom
automatic caps of at least 40 columns and persistent INI preferences, with explicit CLI overrides. -
Retain detailed coverage reports by CI run and attempt, with a published history index and
correct ordering for PRs merged through an aggregation branch. -
Clarify safety provenance names and enforce ASCII source text while preserving Unicode output.
Standardize multiline struct initializer formatting, including generated license registrations. -
Add a read-only benchmark harness for runtime logical content-read accounting on real files.
-
Derive shared expression behavior and help relationships from registry capabilities.
Treat every explicit archive mode consistently when archive support is unavailable. -
Escape control bytes in human-readable tables and tree labels, keeping unusual filenames
on one display line and preserving newline distinctions in Markdown. -
Distinguish aggregate summary rows with
is_totalin JSONL and quote ambiguous data labels
in text tables, preserving real groups namedtotal. -
Use grouped scope headers in console comparison summaries and compact scope rows when the table
exceeds--width. Preserve Unicode graphemes, numeric values, and machine-output accounting. -
Label console summary groupings and report omitted groups under
--top, including
machine-readable group counts in truncated JSONL tables. -
Export ordinary and comparison summaries as CSV/TSV with one shared schema and explicit row identity.
-
Group archive members correctly with
--summary=hash, using the active filesystem and
configured hash algorithm and encoding consistently with{hash}. -
Identify every JSONL summary row by request, grouping, and scope, retaining template text
and comparison roots so repeated and mixed summaries can be separated reliably. -
Extend
--explainwith effective worker limits, retained-state notes, active content-reading
fields, and advisory expression costs without running the search or executing actions. -
Reject invalid field templates before traversal or actions, including configured summaries and
comparison runs. Printf field escapes share quoted-placeholder parsing with ordinary templates. -
Explain inactive CLI modifiers for grep, diff, hash, shard, archive, and reduction output using the effective
configuration; dormant configured defaults remain quiet and valid. -
Resolve the current behavior values shown by
--explainfrom the complete configuration,
including named selections and explicit files, instead of only command-line flags. -
Show named-profile availability, declared behavior, skip and validation reasons, and physical
flag origins in configuration inspection, with small configuration recipes. -
Show effective safety decisions in
--explain, including mandatory and profile origins,
active modes, per-file categories, and expanded directory roots. -
Make default help a compact command and task guide, with direct routes to the complete
flag inventory and detailed reference; wrap the help title to the requested width.
Structure comparison guidance and keep safety tables readable with labeled rows on narrow terminals. -
Suggest close registered option and predicate spellings in usage errors, and explain when a
short global must be moved before the roots; command arguments remain literal. -
Explain comparison exit status for automation, including summary output, output selection,
filtered populations, and error precedence. -
Keep comparison summaries and listings physical when shard flags are present, preventing
mixed sets from being assigned wholly to their representative's comparison category. -
Apply shard grouping once to each collected summary/histogram population, preserving collection
placement and eliminating logical-set plus physical-member double counting. -
Explain physical files versus logical shard sets with tested examples covering classification,
actions, collection placement, reductions, duplicates, and comparison. -
Resolve archive filename sniffing from the final traversal mode, so a later all-mode selection
restores the filename gate after any-mode flags or named configuration selections. -
Add an order-and-limits guide covering actions, collections, summaries, packing,
parallel traversal, and comparison populations. -
Add executable archive-safety recipes for inspection, new archives, member deletion,
and writing reports only beneath a declared output root. -
Reject zero, negative, malformed, and overflowing histogram widths before traversal or actions,
including settings selected from configuration files. -
Render Markdown histograms as bucket/value tables and reject unsupported histogram formats
before traversal or actions, instead of silently emitting text bars. -
Comparison status and built-in grep output support JSONL records, including grep context and
counts. Non-UTF-8 values use lossless tagged base64 objects. Unsupported comparison formats
fail before traversal or expression actions. -
Reject duplicate normalized archive destinations before creating output.
--pack-duplicates=first
keeps the first collected input; dry-run validates the same member plan.
Named roots (--root=NAME=PATH) give inputs distinct archive directories. -
Avoid duplicate comparison tables when combining
--compare=summarywith bare--summary,
while retaining scoped totals and explicitly requested grouping tables. -
Lead the README with binary installation and common tasks before the detailed feature matrices.
-
Correct the release archive description: lean and full executables have separate archives,
each with its own matching debug symbols. -
Add regression coverage for Markdown table alignment after newline and pipe normalization.
-
Reject malformed, negative, or overflowing buffer limits before traversal and actions,
including limits selected from configuration files. -
Validate capture references in field consumers, including printf, grep templates, directory
execution, and columns; escaped literal references no longer hide unused captures.
Directory captures preserve implicit output consistently with ordinary captures. -
Correct binary-content help to state the exact 8,000-byte NUL sniff window.
Install
Run either or both install blocks: the lean binary is installed as xff, and the all-features
binary as xff_full. Ensure ${HOME}/.local/bin is in PATH; the generated manual pages are
installed below ${HOME}/.local/share/man.
Release files without an archive suffix, such as xff-linux-x86_64, are the actual stripped
platform executables and can be downloaded and installed directly. Each matching .tar.zst
contains that same stripped executable together with its separate debug-information file.
Install on Linux x86_64:
XFF_VERSION=v0.7.0
XFF_PATH_BIN="${HOME}/.local/bin"
XFF_PATH_MAN="${HOME}/.local/share/man/man1"
XFF_PATH_TEMP="$(mktemp -d "${TMPDIR:-/tmp}/xff-install.XXXXXX")"
trap 'rm -rf "${XFF_PATH_TEMP}"' EXIT
mkdir -p "${XFF_PATH_BIN}"
mkdir -p "${XFF_PATH_MAN}"
cd "${XFF_PATH_TEMP}"
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/SHA256SUMS"
# Install xff.
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/xff-linux-x86_64"
grep ' xff-linux-x86_64$' SHA256SUMS | sha256sum -c -
install -m 0755 xff-linux-x86_64 "${XFF_PATH_BIN}/xff"
"${XFF_PATH_BIN}/xff" --pager=never --man > "${XFF_PATH_MAN}/xff.1"
# Install xff_full.
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/xff_full-linux-x86_64"
grep ' xff_full-linux-x86_64$' SHA256SUMS | sha256sum -c -
install -m 0755 xff_full-linux-x86_64 "${XFF_PATH_BIN}/xff_full"
"${XFF_PATH_BIN}/xff_full" --pager=never --man > "${XFF_PATH_MAN}/xff_full.1"Install on macOS:
XFF_VERSION=v0.7.0
XFF_PATH_BIN="${HOME}/.local/bin"
XFF_PATH_MAN="${HOME}/.local/share/man/man1"
XFF_PATH_TEMP="$(mktemp -d "${TMPDIR:-/tmp}/xff-install.XXXXXX")"
trap 'rm -rf "${XFF_PATH_TEMP}"' EXIT
mkdir -p "${XFF_PATH_BIN}"
mkdir -p "${XFF_PATH_MAN}"
cd "${XFF_PATH_TEMP}"
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/SHA256SUMS"
# Install xff.
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/xff-macos-arm64"
grep ' xff-macos-arm64$' SHA256SUMS | shasum -a 256 -c -
install -m 0755 xff-macos-arm64 "${XFF_PATH_BIN}/xff"
"${XFF_PATH_BIN}/xff" --pager=never --man > "${XFF_PATH_MAN}/xff.1"
# Install xff_full.
curl -fLO "https://github.com/mboworks/xff/releases/download/${XFF_VERSION}/xff_full-macos-arm64"
grep ' xff_full-macos-arm64$' SHA256SUMS | shasum -a 256 -c -
install -m 0755 xff_full-macos-arm64 "${XFF_PATH_BIN}/xff_full"
"${XFF_PATH_BIN}/xff_full" --pager=never --man > "${XFF_PATH_MAN}/xff_full.1"