diff --git a/README.md b/README.md index 908ee32..c6e2520 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,9 @@ JevGate parses your repository locally and builds small units of evidence: a function, a file outline, a pair of copies, a test, a documentation section. It asks [TypeSafe Jev](https://docs.typesafe.ai) short, typed questions about each one. Code, not a chat model, combines the answers into a verdict. Each finding has a location, a probability and a concrete next step, so an agent or CI job can act on it and a person can check it quickly. -```text -JevGate: consider · gate passed · 42 files · 118 API requests · 263410 input tokens · ~$0.0111 - -Consider (2): - src/billing/invoices.ts:88 [maintainability/shared-logic] `createInvoice` and `createReceipt` - perform the same steps for the same purpose (0.93). Differences: `invoices`→`receipts`. - → Move the shared steps into one implementation - src/api/search.py:41 [security/injection] `search_orders` places its parameters into a - database query without binding, escaping or checking them; a caller passing outside - input would make it exploitable (0.88). - → Pass the values as bound query parameters -``` +![JevGate's terminal output on zoxide: the gate fails on 3 review findings (a function mixing separate jobs, and two sets of importers repeating the same steps), 3 consider findings (a group of file helpers that could be a module, branching that hides a main path, an unexplained 7) and optional notes on unnamed values](site/src/images/terminal.svg) + +JevGate 0.22.0 on [zoxide](https://github.com/ajeetdsouza/zoxide/tree/09a18b4424b3f1033094ffd97da6d47585e38259), rerun from its answer cache, so it cost nothing; 9 of the 11 notes are left out. **[Documentation](https://tech-byte-frontier.github.io/jevgate/)** · [Rules](https://tech-byte-frontier.github.io/jevgate/reference/rules.html) · [Configuration](https://tech-byte-frontier.github.io/jevgate/configuration.html) · [CI](https://tech-byte-frontier.github.io/jevgate/ci.html) · [Troubleshooting](https://tech-byte-frontier.github.io/jevgate/troubleshooting.html) · [Changelog](CHANGELOG.md) @@ -56,6 +47,10 @@ jevgate check --report # review, then open a local HTML dashb jevgate baseline # accept today's findings; later checks fail only on new ones ``` +`jevgate check --report` writes the same findings to a local dashboard you can filter by path and classification, with each file's findings, undecided units and the answers behind them: + +![JevGate's HTML report on zoxide: totals for files, review and consider findings, notes and cost, then a list of files by classification, with src/util.rs open to show its review and consider findings, their next steps and one undecided unit](site/src/images/report.png) + `jevgate --help` gives the workflow, exit codes, files and environment, and `jevgate check --help` explains each flag and the JSON report. Coding agents can also call JevGate as a tool through its MCP server, `jevgate mcp` ([coding agents](https://tech-byte-frontier.github.io/jevgate/coding-agents.html)). ## Continuous integration diff --git a/site/src/images/report.png b/site/src/images/report.png new file mode 100644 index 0000000..c499e7c Binary files /dev/null and b/site/src/images/report.png differ diff --git a/site/src/images/terminal.svg b/site/src/images/terminal.svg new file mode 100644 index 0000000..a4ea8f4 --- /dev/null +++ b/site/src/images/terminal.svg @@ -0,0 +1,40 @@ + + + + + +jevgate check · zoxide +~/zoxide $ jevgate check --verbose +JevGate: review · gate failed: 3 new review findings · 27 files · 0 API requests · 0 input tokens · ~$0.0000 +Review (3): + src/util.rs:269 [maintainability/function-simplification] `resolve_path` mixes separate jobs in long blocks; + splitting it would make it easier to understand (0.86). + → Extract each separate job into its own named function + src/import/autojump.rs:64 [maintainability/shared-logic] `Iter::next` (src/import/autojump.rs:64) and + `Iter::next` (src/import/z.rs:66) perform the same steps for the same purpose (1.00). + → Move the shared steps into one implementation + src/import/fasd.rs:16 [maintainability/shared-logic] `Fasd::dirs` (src/import/fasd.rs:16), `ZshZ::dirs` + (src/import/zsh_z.rs:16) and 2 more copies perform the same steps for the same purpose (0.99). + → Move the shared steps into one implementation +Consider (3): + src/util.rs:154 [maintainability/file-organization] Some members of this file could move to a separate + module (0.97). G3 (`write`, `tmpfile`, `rename`, `canonicalize`, `current_dir`, `path_to_str` and 1 + more) or G1 (`Fzf`, `Fzf::new`, `Fzf::enable_preview`, `Fzf::args`, `Fzf::env`, `Fzf::envs`) would be + most useful as its own module. + → Consider moving that set of members into its own module + src/import/atuin.rs:75 [maintainability/function-simplification] `Iter::next` has branching that likely + hides its main path (0.94). + → Consider guard clauses, early returns or a lookup table + src/cmd/query.rs:32 [maintainability/hardcoded-values] `Query::query_interactive` uses a value whose meaning + a reader must guess (0.82). The value is 7. + → Give the value a descriptive constant name +Notes (11, optional): + src/db/mod.rs:121 [maintainability/hardcoded-values] `Database::age` likely uses a value whose meaning a + reader must guess. The value is 0.9. It is written once in its file, so it is a note. + → Optional: name or configure the value if it changes + src/db/dir.rs:59 [maintainability/hardcoded-values] `DirDisplay::fmt` likely uses a value whose meaning a + reader must guess. The value is 9999.0. It is written once in its file, so it is a note. + → Optional: name or configure the value if it changes + … 9 more notes +2 files with uncertain units. +