Install
The tool is a single native binary (Rust, ~1.4 MB, no runtime) β a full repo analysis takes about 20 ms.
npm / bun
bunx aispekt <path>
# or install globally
npm install -g aispekt
cargo
cargo install --locked \
--git https://github.com/erf1nd0r/aispekt aispekt
binaries
Prebuilt binaries for macOS, Linux, and Windows on the GitHub releases page.
Usage
aispekt <file-or-dir> [--json] [--min <score>]
Point it at a single CLAUDE.md/AGENTS.md β or at a repo
directory to unlock repo-aware checks: dead commands the file
references but package.json doesn't define, paths that don't exist,
lines that just restate the README, and a missing CLAUDE.md β AGENTS.md bridge.
--json | machine-readable report on stdout |
--min <score> | pass/fail threshold (default 60) |
--version | print version |
Exit codes: 0 score β₯ min Β· 1 below min Β·
2 usage or I/O error β drop it straight into CI:
# fail the build when the instruction file degrades
bunx aispekt . --min 75
False positive on a heuristic? Suppress a single finding with an
aispekt-ignore marker on the flagged line or the line above β
like eslint-disable-next-line.
Semantic judge β bring your own agent
Some questions no regex can answer: is this rule dead weight for a strong model? Do two instructions semantically contradict? aispekt ships that layer without asking for an API key β the judge is whatever AI agent you already run.
aispekt judge emit AGENTS.md --out brief.json
# any judge completes the brief: an agent, a BYOK script, a human
aispekt judge merge brief.json answers.json
The brief is self-contained JSON: the file content, one task per semantic check
(each with its evidence citation), and the exact answer contract.
For agent users it's one command β aispekt skill install drops an
Agent
Skill (the open SKILL.md standard read by Claude Code, Codex CLI,
Cursor, Gemini CLI, and more) into .claude/skills/; then
"judge this file with aispekt" runs the loop with your agent as judge.
The honesty rules are structural: answers are hash-bound to the exact content
judged, validated for verbatim quotes and real line numbers, and rendered as a
separate judge-labeled tier with a non-determinism caveat β
semantic verdicts can never move the deterministic score.
Judge checks live in
rules/judgepack.json,
same doctrine as the rulepack: adding one is a data edit.
How scoring works
Scoring is penalty-only: you start at 100 and lose points for content the evidence says hurts (redundancy, lint rules stated as prose, vague aspirations, dead commands). Nothing adds points, because the 2026 evidence's predictive signals are negative β completeness bonuses push files toward measurable harm. A lean, command-focused file scores an A by simply not doing the harmful things.
Every rule carries a citation and a confidence tier: measured study official docs community heuristic. Rules the studies contradict are labeled heuristic β never presented as fact.
The rules
Rendered live from rules/rulepack.json β the same versioned data file
the CLI embeds. Updating the rubric is a data edit, not a code change.
Show the full rule table
Playground
Try the analyzer without installing anything β this is the same Rust engine compiled to WebAssembly, running entirely in your browser. Nothing is uploaded, ever.