Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
aiscope
DevTools for your AI coding tools' memory. See what Cursor, Claude Code, and Copilot actually remember about your project — and where they disagree.

The problem
You probably run 1–3 AI coding tools side-by-side: Cursor, Claude Code, Copilot, Cline, Aider… Each one stores its memory in multiple private dotfiles that nobody ever opens after writing them:
GitHub Copilot:
.github/copilot-instructions.md
.github/instructions/*.md (per-glob applyTo)
.github/prompts/*.prompt.md (slash commands)
.github/chatmodes/*.chatmode.md
.github/agents/*.md
AGENTS.md (any depth, path-scoped)
Cursor:
.cursorrules
.cursor/rules/*.{md,mdc}
.cursor/commands/*.md
.cursor/agents/*.md
.cursor/modes/*.md
Claude Code:
CLAUDE.md (any depth, path-scoped)
.claude/agents/*.md
.claude/commands/*.md
.claude/skills/*/SKILL.md
~/.claude/CLAUDE.md (with --user)
Even if you only use one tool, you have rules in 5 places. After six months you have stale rules, contradicting rules, scope-mismatched rules, and rules that silently override each other — and you can't see any of it.
aiscope reads them all, classifies them by subsystem (instructions / prompts / agents / chatmodes / skills), respects scope (applyTo, globs, alwaysApply, path-derived prefix), and flags conflicts with compiler-grade source spans.
What it does
| Feature | Flag | What it gives you |
|---|---|---|
| Conflict detector | (default) | Points to exact file:line where rule X disagrees with rule Y |
| Subsystem-aware mode | --specific |
Drops false positives between prompts, instructions, agents, skills |
| User-scope memory | --user |
Also reads ~/.claude/CLAUDE.md and other cross-repo files |
| TUI | (default) | Two-pane terminal app: sources left, conflicts right |
| Compiler-grade diagnostics | --diag |
miette-style report with byte-precise spans for CI logs |
| Token-budget breakdown | (always) | "21% of your context window is stale" |
| Shareable PNG card | --card out.png |
Tweet-bait, blog hero, retro at 1280×720 |
| CI mode | aiscope check |
Exits 1 only on high-severity conflicts (no flapping) |
| Watch mode | aiscope watch |
Live re-scan on file change |
| Scriptable | --json, --text, --grep |
Pipeable into anything |
How it works
aiscope is a 6-layer deterministic pipeline. No LLM calls. No network. ~5 MB binary.
Source files (3 tools × 5 subsystems)
│
▼ Layer 0 scanner → (Source, raw text)
│ ├─ Copilot: .github/{copilot-instructions, instructions/, prompts/,
│ │ chatmodes/, agents/} + AGENTS.md (any depth, path-scoped)
│ ├─ Cursor: .cursorrules, .cursor/{rules,commands,agents,modes}/
│ └─ Claude: CLAUDE.md (any depth), .claude/{agents,commands,skills}/
│
▼ Layer 0.5 frontmatter → Scope { globs, alwaysApply, model, tools }
│ ├─ Copilot applyTo: "**/*.ts"
│ ├─ Cursor globs: ["**/*.rs"]
│ ├─ Cursor alwaysApply: true
│ └─ Path-derived: apps/web/AGENTS.md → "apps/web/**"
│
▼ Layer 1 parse → Statement (one bullet/paragraph + byte span)
│ pulldown-cmark CommonMark AST; skips code blocks, headings,
│ blockquotes, HTML, YAML frontmatter; preserves inline code.
│
▼ Layer 2 canonicalize → CanonicalText
│ NFKC + smart-quote/dash → ASCII + Unicode caseless fold +
│ punctuation strip + Snowball stem (preserves snake_case identifiers).
│
▼ Layer 3 pattern extract → Assertion { axis, value, polarity, condition }
│ Polarity (Forbid/Prefer/Allow) + clause splitter + condition extractor +
│ 10 axes with topic-gating. Confidence 0.85–0.97 per match.
│
▼ Layer 4 reason → Conflict { kind, severity, confidence }
│ ├─ Duplicate (cross-source SHA-256 fingerprint)
│ ├─ Clash (same axis, both Prefer, different values)
│ ├─ PolarityConflict (same value, opposite polarity)
│ └─ DuplicateName (agent/skill/chatmode `name:` collision)
│ Severity = High iff cross-source AND conf≥0.85 AND scopes overlap.
│
▼ Layer 5 render → TUI / miette diag / JSON / PNG card
Two reasoning modes
-
Uniform (default): every cross-file pair is a candidate conflict. Subsystem boundaries are ignored. Best for "show me everything that could contradict".
-
Specific (
--specific): subsystem-aware. Prompts ↔ Instructions never conflict (different intent). Agents ↔ non-Agents never conflict (isolated runners). Skills/ChatModes only check duplicate names + tool allowlists. Best for low-noise CI.
Scope-aware severity
Two rules with non-overlapping applyTo globs (e.g. **/*.ts vs **/*.py) still surface as conflicts — but downgraded to Severity::Low with a (scopes don't overlap) note. aiscope check ignores them; the TUI shows them.
Privacy & safety
- Read-only. Never modifies your files.
- Local only. No telemetry, no network, no account, no API key.
- No session-log access. v0.1 will not open
~/.claude/projects/*.jsonl(chat history). Only rules and instruction files. Enforced by tests/privacy_guard.rs. - No TLS interception. Not a proxy. Just walks your dotfiles.
Install
(Pre-built binaries shipping in v0.1.1 via GitHub Releases.)
Usage
|
CI
# .github/workflows/aiscope.yml
- run: cargo install aiscope
- run: aiscope check
Tech stack
| Crate | Role |
|---|---|
pulldown-cmark |
CommonMark AST with byte offsets |
unicode-normalization + caseless |
Unicode-correct fold (Turkish-safe) |
rust-stemmers |
Snowball stem for paraphrase-resistant fingerprinting |
regex |
Polarity / axis pattern matching |
globset |
applyTo / globs overlap test |
miette |
Compiler-grade diagnostics |
tiktoken-rs |
OpenAI BPE tokenizer for token-budget math |
tiny-skia + cosmic-text |
PNG card (pure Rust, no headless browser) |
| JetBrains Mono | Embedded monospace font (270 KB, Apache-2.0) |
ratatui + crossterm |
TUI |
clap |
CLI |
insta |
Snapshot determinism gate |
What to test
# 1. All unit + integration tests (42 tests across 5 binaries)
# 2. Lint
# 3. Release build
# 4. Live demo against the bundled Copilot-only fixture
;
Fixtures shipped in the repo
| Fixture | Tests |
|---|---|
tests/fixtures/{cursor,claude,copilot}/ |
Three-tool cross-conflict (smoke test) |
tests/fixtures/copilot-only/ |
Single-tool repo with all 5 subsystems |
tests/corpus/negation_clause.md |
"Don't X, prefer Y" → 2 clauses, no self-clash |
tests/corpus/historical_narrative.md |
"We migrated from npm to pnpm" → 0 false positives |
tests/corpus/conditional_clauses.md |
"snake_case in legacy, camelCase in new" |
tests/corpus/frontmatter_and_code.md |
YAML + code blocks + blockquotes all skipped |
tests/corpus/multi_axis.md |
Indentation + comments + imports in 3 lines |
Snapshots are pinned in tests/snapshots/. To accept intentional changes: cargo insta review.
Roadmap
- v0.2 —
semanticfeature: fastembed paraphrase recall, MCP server inventory, opt-in session-log scanning, git-aware memory diff - v0.3 —
aiscope trafficproxy mode (live cost monitoring) - v0.4 — hosted shareable snapshot URLs
- v0.5 — cross-tool memory port (
aiscope port cursor → claude)
License
MIT (aiscope source) · Apache-2.0 (embedded JetBrains Mono font)