JSON output
aiscope --json . > scan.json
The full bundle as one JSON object — suitable for scripts, dashboards, and custom integrations.
Schema (top-level)
{
"root": "/path/to/repo",
"sources": [
{
"tool": "copilot",
"subsystem": "instructions",
"path": ".github/copilot-instructions.md",
"label": ".github/copilot-instructions.md",
"name": null,
"description": null,
"scope": {
"globs": [],
"always_apply": false,
"path_prefix": null,
"model": null,
"tools": []
}
}
],
"statements": [
{
"source_index": 0,
"text": "Use camelCase for variables and functions.",
"line": 5,
"byte_start": 87,
"byte_end": 130
}
],
"rules": [
/* same as statements (legacy alias) */
],
"assertions": [
{
"statement_index": 0,
"axis": { "kind": "naming", "scope": "variables" },
"value": "camel_case",
"polarity": "positive",
"confidence": 0.95
}
],
"conflicts": [
{
"kind": "clash",
"left": 0,
"right": 3,
"axis": { "kind": "naming", "scope": "variables" },
"note": "camelCase disagrees with snake_case",
"severity": "high",
"confidence": 0.93
}
],
"total_tokens": 159,
"stale_tokens": 12
}
Recipes
List only HIGH conflicts
aiscope --json . | jq '.conflicts[] | select(.severity == "high")'
Count duplicates
aiscope --json . | jq '[.conflicts[] | select(.kind == "duplicate")] | length'
Find sources with no applyTo
aiscope --json . | jq '.sources[] | select(.scope.globs == []) | .label'
Waste percentage
aiscope --json . | jq '(.stale_tokens / .total_tokens * 100 | floor)'
Stability
The schema follows semver:
- 0.x: fields may be added; existing fields are stable within a minor.
- 1.0+: schema is fully stable.
Field names use snake_case to match Rust conventions on the producing side.