ix · diff

v1.0.0 to v1.0.0

50 added, 88 removed. Audit A to A.

---
name: ix
- description: "This skill should be used when answering structural questions about a codebase: understanding what a symbol is, tracing flows, measuring change impact, finding callers/callees/imports, or detecting code smells. It drives the Ix CLI (ix map/explain/trace/impact/search/rank/smells) against a persistent code graph stored in a local backend, instead of grepping or guessing. Run scripts/bootstrap.sh once to install the CLI and start the backend, then ix map on the repo root."
+ description: "Answer structural questions about a codebase — what a symbol is, what calls it, what a change breaks, where the hotspots are — from a persistent code graph via the ix CLI, instead of grepping."
license: Apache-2.0
metadata:
version: 1.0.0
source: https://github.com/ix-infrastructure/Ix
---
# Ix — Persistent Codebase Map
- ## Overview
-
- Ix parses a repository with tree-sitter (26 languages), builds a graph of its symbols, calls, and imports, and stores it in a local backend (ArangoDB via Docker). Query that graph with `ix` commands to answer bounded, structural questions instead of reading files blindly. The graph persists between sessions.
-
- Use this skill whenever the question is about structure, relationships, or impact: what a symbol is, what calls it, what it calls, how data flows, what breaks if a change lands, which files are most depended-on, or where the smells are.
-
- ## When to Use
-
- - Answering "what is this / what does it touch" questions about a symbol, class, or module.
- - Tracing how a flow moves through the system.
- - Estimating blast radius before a change.
- - Finding callers, callees, imports, and dependents.
- - Detecting smells, ranking hotspots, and scoring subsystems.
- - Onboarding to an unfamiliar codebase.
-
- Do not use this skill for prose-style or history questions — use it for structural, graph-backed answers.
-
- ## Quick Start (first run)
-
- Map the target repo with the bootstrap script:
-
- ```bash
- bash scripts/bootstrap.sh [repo-root] [--no-map] # Bash / Git Bash / macOS / Linux
- powershell -ExecutionPolicy Bypass -File scripts/bootstrap.ps1 [repo-root] [-NoMap] # Windows PowerShell
- ```
-
- The bootstrap checks Node >= 22, git, Docker, and ripgrep; installs the `ix` CLI if missing; starts the local Docker backend; and maps the repo by default. Re-run `scripts/bootstrap.sh` on each new repo to register and map it.
+ Ix parses a repository with tree-sitter (26 languages) into a graph of symbols,
+ calls and imports, kept in a local backend (ArangoDB via Docker) and persisted
+ between sessions. Query it for structural answers — what a symbol is, what calls
+ it, how a flow moves, what a change breaks, which files carry the most weight,
+ where the smells are — instead of reading files to find out. It does not answer
+ prose or history questions.
- Refresh the graph after code changes:
+ ## First run
```bash
- ix map --silent
+ bash scripts/bootstrap.sh [repo-root] [--no-map] # macOS / Linux / Git Bash
+ powershell -ExecutionPolicy Bypass -File scripts/bootstrap.ps1 [repo-root] [-NoMap] # Windows
```
- ## Core Workflow
+ Checks Node >= 22, git, Docker and ripgrep, installs the CLI if missing, starts
+ the backend, and maps the repo. Re-run it per repo.
- Map → Explain → Trace → Impact
+ ## Core workflow
| Step | Command | Example |
|---|---|---|
- | Build/refresh the graph | `ix map` | `ix map .` |
+ | Bounded context to start from | `ix context` | `ix context IngestionService` |
| Understand a component | `ix explain` | `ix explain IngestionService` |
- | Bounded deterministic context | `ix context` | `ix context IngestionService --max-entities 20` |
| Trace a flow | `ix trace` | `ix trace user_login_flow` |
- | Analyze impact | `ix impact` | `ix impact verify_token --format llm` |
+ | Blast radius of a change | `ix impact` | `ix impact verify_token` |
+ | Build / refresh the graph | `ix map` | `ix map .` |
- ## Using the Skill
+ ## How to spend calls
- 1. Start with high-level commands for one-shot answers: `ix overview`, `ix impact`, `ix rank`.
- 2. Drill down with primitives — `ix search`, `ix callers`, `ix callees`, `ix contains`, `ix imports`, `ix imported-by`, `ix depends` — reusing exact entity IDs from prior JSON output.
- 3. Prefer `--format llm` when reading output yourself (token-minimal); use `--format json` when chaining commands or extracting a field. See references/output-formats.md.
- 4. For the full command surface, decomposition recipes, and best practices, load references/commands.md; for a command's complete flag list, load references/flags.md.
- 5. If the backend is unreachable or a command fails, load references/troubleshooting.md.
+ 1. **Start with `ix context <file-or-symbol>`** — one bounded call that names the
+ files and symbols that matter, with line ranges.
+ 2. **Read the ranges, not the files.** `ix read <symbol>`, or `path:120-180`, is
+ one to three thousand tokens; the file around it is commonly thirty to sixty
+ thousand — and every one of those is re-sent on every later step of the turn.
+ 3. Drill down with primitives, reusing the exact entity IDs from earlier output:
+ `ix search`, `ix callers`, `ix callees`, `ix contains`, `ix imports`,
+ `ix imported-by`, `ix depends`.
+ 4. **Do not poll `ix status`.** A command that needs the backend says so itself,
+ with a hint; a health check in front of every call is a wasted round trip.
+ 5. Format: `llm` is the one to read, and `IX_FORMAT=llm` (or
+ `ix config set format llm`) makes it the default so it need not be typed per
+ call; `json` is for chaining or extracting a field. On `ix context` the same
+ answer runs about 7.6 : 0.8 : 1 for json : llm : text.
## Rules
- 1. Before answering codebase questions, run targeted `ix` commands. Do not answer from training data alone.
- 2. After noticing contradictory information, run `ix conflicts` and present the results.
- 3. Never guess codebase facts — if Ix has structured data, use it.
- 4. Immediately after modifying code, run `ix map --silent` to re-ingest.
- 5. When Ix reports low confidence, mention the uncertainty to the user, suggest re-running `ix map`, and never present low-confidence data as established fact.
-
- ## Harness install seam
-
- The skill installer (`scripts/install-skill.sh`) reads an explicit, small harness table from `ix-cli/scripts/skill-harnesses.mjs` — claude, agents, codex and cursor only. Each entry's skills directory is verified against what that harness actually reads (Cursor uses `~/.cursor/skills-cursor`, not `~/.cursor/skills`); gemini, opencode, openclaw and vscode have no skills convention, so they are deliberately not install targets. Adding a harness is a one-line edit in that table, after checking where the harness really looks. `ix mcp install` uses the separate MCP host registry (`ix-cli/src/mcp/hosts.ts`) — a different table answering a different question.
-
- When `TOOLSCAN_PATH` is set, both surfaces consult its discovery output so a harness CLI installed outside `PATH` can still be found — and `ix mcp install` executes the absolute path toolscan reports, so the off-PATH harness is inspected and registered through the binary toolscan found. Toolscan is optional and additive: if it is unset or fails, the embedded `PATH` and config-directory probes remain authoritative. `TOOLSCAN_PATH` is opt-in: neither surface ever looks `toolscan` up on `PATH` (the CLI executes whatever `TOOLSCAN_PATH` names, so only set it to a binary you trust).
-
- The probe battery has two environment seams:
-
- | Seam | Used by | Default |
- |---|---|---|
- | `TOOLSCAN_PATH` | `skill-harnesses.mjs --probe`, `ix mcp install` | Unset — no toolscan, embedded probes decide |
- | `HARNESS_HOME` | `skill-harnesses.mjs --probe` | `os.homedir()`; `install-skill.sh` uses the shell's `$HOME` |
-
- For a hermetic probe with no real user configuration:
-
- ```bash
- HARNESS_HOME="$(mktemp -d)" \
- node ix-cli/scripts/skill-harnesses.mjs --probe
- ```
-
- To drive the same probe with a local or npm-installed toolscan bundle:
-
- ```bash
- TOOLSCAN_PATH=/path/to/toolscan/dist/toolscan.mjs \
- HARNESS_HOME="$(mktemp -d)" \
- node ix-cli/scripts/skill-harnesses.mjs --probe
- ```
-
- `--probe` emits `id|label|bin|config-dir|skill-dir|present|detectedVia`, where `present` is `1` or `0` and `detectedVia` names the probe that decided (`toolscan` | `path` | `config-dir` | `none`). `scripts/install-skill.sh --dry-run --json` emits the same per-harness view as machine-readable JSON: one object per host with `action` (`would-install` | `would-refuse` | `installed` | `refused` | `skip`), `dest`, and `detectedVia` — so CI can assert *how* a harness was found, not just that it was. A `would-refuse` in the preview exits 1, matching the real run's conflict exit, so scripts can rely on the two agreeing.
-
- The install report's `--format json|llm` output carries `detectedVia` per host (`toolscan` | `path` | `config-dir` | `none`), so a consumer can see which probe decided presence — a host toolscan found reads `toolscan` even when its CLI also happens to be on PATH, and a host found by the PATH probe reads `path` rather than being misattributed to its config directory.
-
- ## References
-
- - **references/commands.md** — full command routing tables, decomposition recipes, best practices, and the do-not-use list. Load before running any command beyond the core four above.
- - **references/flags.md** — every flag the CLI registers, per command, with values and defaults. Load when a command needs shaping beyond the examples in commands.md, or to check whether a flag exists before guessing.
- - **references/output-formats.md** — `--format llm|json|text` rules, commands that do not implement `llm`, and Pro-gated commands. Load when formatting output or when a "requires Ix Pro" error appears.
- - **references/troubleshooting.md** — prerequisites, backend health checks, `ix doctor`, and environment flags. Load when a command fails or the backend is unreachable.
+ 1. Answer codebase questions from targeted `ix` commands, not from training data.
+ 2. Never guess a codebase fact that Ix holds.
+ 3. On contradictory information, run `ix conflicts` and present the results.
+ 4. Refresh with `ix map --silent` when the graph has gone stale — after a branch
+ switch, a pull, or a batch of edits. Editor plugins re-ingest edited files on
+ a debounce; this is not a per-edit step.
+ 5. When Ix reports low confidence, say so, suggest re-running `ix map`, and never
+ present it as established fact.
- ## Scripts
+ ## References — load on demand
- - **scripts/bootstrap.sh** — cross-platform first-run setup (bash; works on macOS, Linux, and Windows under Git Bash / MSYS2 / WSL).
- - **scripts/bootstrap.ps1** — native Windows PowerShell first-run setup.
+ - **references/commands.md** — command routing tables, decomposition recipes,
+ best practices, the do-not-use list. Before any command beyond the table above.
+ - **references/flags.md** — every flag the CLI registers, per command, with
+ values and defaults. Before guessing whether a flag exists.
+ - **references/output-formats.md** — the `llm|json|text` rules, what does not
+ implement `llm`, and which commands are Pro-gated.
+ - **references/troubleshooting.md** — prerequisites, `ix doctor`, backend health,
+ environment flags. When a command fails.
+ - **scripts/bootstrap.sh** / **scripts/bootstrap.ps1** — first-run setup (bash;
+ and native PowerShell for Windows).