Skip to content

Getting started ​

Five minutes from install to your first semantic diff. You need Node.js 24 or newer and a git repository.

1. Install ​

Install the CLI and a language plugin, then add framework and effects plugins for whatever your project uses. Supported stacks lists them all.

bash
pnpm add -D @aburi/cli @aburi/lang-typescript @aburi/framework-next @aburi/framework-react
bash
npm install -D @aburi/cli @aburi/lang-typescript @aburi/framework-next @aburi/framework-react
bash
yarn add -D @aburi/cli @aburi/lang-typescript @aburi/framework-next @aburi/framework-react
bash
bun add -D @aburi/cli @aburi/lang-typescript @aburi/framework-next @aburi/framework-react

The rest of this page writes the commands bare. Run them through whichever package manager you installed with:

bash
pnpm exec aburi <command>
bash
npx aburi <command>
bash
yarn aburi <command>
bash
bunx aburi <command>

2. Create a config ​

bash
aburi init

init looks at your repository, works out the workspace layout, languages, and frameworks, and reports what it found:

✓ Wrote /home/you/shop/aburi.json
  managers: pnpm
  languages: ts
  frameworks: nextjs, react
  components: 1

The file it wrote names the plugins to load and the components it detected:

json
{
  "$schema": "https://aburi.kage1020.com/schema/aburi.config.v1.json",
  "languages": ["lang-typescript"],
  "frameworks": ["framework-next", "framework-react"],
  "components": [
    {
      "id": "storefront",
      "name": "storefront",
      "roots": ["apps/storefront"],
      "languages": ["ts"],
      "frameworks": ["nextjs", "react"]
    }
  ]
}

Everything else has a default, and Configuration covers the knobs you may want later.

TIP

aburi init --with-suggestions adds a comment naming the plugin packages it found in your project but not in your dependencies.

3. Scan ​

bash
aburi scan

The first line is the symbol census, the second says how much of the call graph resolved, and the arrows name what was written:

184 kept · 63 dropped · 212 files
calls 1043 · resolved 917 · unresolved 126 (external 108 · dynamic 14 · no-match 4)
→ /home/you/shop/out/aburi.ir.json
→ /home/you/shop/out/workspace.md

Three things land in out/:

FileWhat it is
aburi.ir.jsonThe analysis itself, as JSON. Everything else derives from it.
workspace.mdOne page covering the whole repository: components, dependencies, effect surface.
components/*.mdPer-component detail. Every kept symbol with its boundaries, rules, and effects.

Open workspace.md first. On a codebase you have never seen, it is the fastest map you will get.

4. Diff two revisions ​

bash
aburi diff main..HEAD --fail-on 'removed,changed:>20'

The glyph line is the summary — added, removed, changed, moved, moved+changed:

+2 -1 ~3 ↔0 ⤴0
calls 1043 · resolved 917 · unresolved 126 (external 108 · dynamic 14 · no-match 4)
→ /home/you/shop/out/diff.md

out/diff.md is the report you hand to a reviewer, and out/diff.json sits beside it. A tripped --fail-on clause prints the reason on stderr and exits 3, which is what CI gates on:

--fail-on removed tripped (observed: 1 removed)

See CI integration.

Quote the --fail-on value

> is a redirect in every shell. --fail-on changed:>5 writes a file called 5. --fail-on 'changed:>5' sets a threshold.

Reading the report explains what comes out.

5. Zoom in on one symbol ​

When the diff flags something and you want the full picture:

bash
aburi explain submitOrder

The symbol's Markdown goes to stdout, so you can pipe it into a pager or a file:

md
# `submitOrder` *(function)*

**File**: `apps/storefront/src/app/orders/actions.ts:5-12`
**Visibility**: public
**Language**: ts

## Signature

`(cart: Cart) → Promise<Order>` throws EmptyCart ⚡async

## Rules

- guard: `cart.items.length === 0` (L6)
- throw: `EmptyCart` (L7)

## Calls

- `EmptyCart` (L7)
- `createOrder` (L9)
- `sendReceipt` (L10)

## Derived by

- `export-keyword`

## Fingerprint

- api: `94f035a1f334`
- logic: `708d436dac4a`
- syntax: `d64c00d2efc8`

Sections for the component, decorators, effects, and callers appear whenever the analysis has them. Pass a symbol name, a file path, or a full symbol id — Aburi works out which one you meant. --output <path> writes the Markdown to a file instead.

Where to go next ​

Released under the Apache License 2.0.