"Everything is connected!" — Dirk Gently
A Rust port of Perl's Graph::Easy: build graphs (nodes/edges/groups), lay them out deterministically on a flat surface, and render them as ASCII art, boxart, HTML, or Graphviz DOT — plus parse graphs from the Graph::Easy text format and from DOT.
Status: initial capability wave complete — compatibility is gated
differentially against the original Perl tool via a pinned oracle
(v0.69, just oracle-verify).
Build the CLI and render a graph to ASCII art — the Graph::Easy text format goes in on stdin, the layout comes out:
cargo build -p gently-cli
echo '[ Bonn ] --> [ Berlin ] --> [ Hamburg ]' | target/debug/gently --as ascii+------+ +--------+ +---------+
| Bonn | --> | Berlin | --> | Hamburg |
+------+ +--------+ +---------+
--as selects the output format (so does the output filename's
extension, as in upstream). Rendering from a file argument instead of
stdin:
target/debug/gently --as ascii examples/simple-chain/input.gvMore worked examples (chain, edge styles, diamonds, self-loops, …) with
committed, byte-verified output live in examples/;
a visual gallery of every example — CLI ASCII art plus SVG renderings — is
at docs/gallery.md.
Where gently still differs from the pinned Graph::Easy oracle — and which
classes are deliberately outside byte-compat — see
docs/known-hard-cases.md.
| Stage | Formats |
|---|---|
| Parse | Graph::Easy text, Graphviz DOT |
Render via CLI (--as) |
ascii, html, txt, dot/graphviz |
| Render via library | boxart (CLI wiring pending) |
Asking for an unwired format (e.g. --as boxart, --as svg) errors with
gently: unknown output format and exit 255 until a renderer is wired
to the CLI.
Work is tracked with wai; notable
changes are recorded in CHANGELOG.md (Keep a Changelog);
the capability corpus in specs/ is written in the
Specodelic four-layer format
(intent statement + state model + constraints/properties per spec).
just lint # all specs must be lint-clean
just gates # compile + model-check the corpus
just oracle-verify # differential compat gate (needs fixtures; spec ge.oracle)
just perf-check # performance budgets (spec ge.perf)
just examples-verify # published examples stay byte-identical to expected output
just gallery-verify # docs/gallery/*.svg stay byte-identical to regenerated output