--format json for machine-readable output. The
schemas are versioned: version is 1, and changes within v1 are additive
only, so parsers can rely on the fields below. Keys are camelCase, optional
fields are omitted when absent, and file paths are relative to root.
roe --format json
The combined run — a bare roe, or roe check — prints a
single document rather than three concatenated ones, so stdout stays valid JSON:
{
"version": 1,
"root": "/path/to/solution",
"deadCode": { "version": 1, "…": "…" },
"dupes": { "version": 1, "…": "…" },
"health": { "version": 1, "…": "…" }
}
| Field | Description |
|---|---|
version | Schema version of the combined document, 1. |
root | The analysis root path. |
deadCode | The roe dead-code report, unchanged. |
dupes | The roe dupes report, unchanged. mode is always exact — the combined run takes no --mode flag. |
health | The roe health report, unchanged. hotspots is always empty — hotspots need roe health --hotspots. |
version and root, so anything already written against
roe dead-code --format json can consume deadCode as-is.
roe dead-code --format json
{
"version": 1,
"root": "/path/to/solution",
"summary": {
"projects": 3,
"filesScanned": 214,
"symbols": 2610,
"unusedTypes": 0,
"unusedMembers": 1,
"unusedFiles": 1,
"elapsedMs": 74
},
"notes": [],
"findings": [
{
"kind": "unused-member",
"symbolKind": "method",
"name": "App.Billing.InvoiceService.RecalculateAll",
"project": "App",
"file": "src/App/Billing/InvoiceService.cs",
"line": 88,
"column": 17,
"visibility": "private"
}
]
}
| Field | Description |
|---|---|
version | Schema version, 1. |
root | The analysis root path. |
summary | Scan totals: projects, filesScanned, symbols, unusedTypes, unusedMembers, unusedFiles, elapsedMs. |
notes | Human-readable notes about the scan, if any. |
findings[].kind | unused-type, unused-member, or unused-file — the same names used by inline suppressions. |
findings[].symbolKind | The kind of symbol (e.g. method). Optional. |
findings[].name | Fully-qualified symbol name, or the file path for a dead file. |
findings[].project | The containing project. Optional. |
findings[].file, line, column | Location of the finding; dead-file findings are pinned at 1:1. |
findings[].visibility | The symbol’s visibility (e.g. private). Optional. |
roe dupes --format json
{
"version": 1,
"root": "/path/to/solution",
"mode": "exact",
"summary": {
"projects": 1,
"filesScanned": 214,
"groups": 1,
"duplicatedLines": 48,
"elapsedMs": 61
},
"groups": [
{
"tokenCount": 105,
"lineCount": 24,
"occurrences": [
{
"file": "src/App/Billing/PaymentService.cs",
"startLine": 40,
"startColumn": 5,
"endLine": 63,
"endColumn": 6
},
{
"file": "src/App/Shipping/ShippingService.cs",
"startLine": 38,
"startColumn": 5,
"endLine": 61,
"endColumn": 6
}
]
}
]
}
| Field | Description |
|---|---|
version | Schema version, 1. |
root | The analysis root path. |
mode | The matching mode used: exact or semantic. |
summary | Scan totals: projects, filesScanned, groups, duplicatedLines, elapsedMs. |
groups[].tokenCount | Length of the duplicated block in tokens. |
groups[].lineCount | Length of the duplicated block in lines. |
groups[].occurrences[] | Every location of the block: file, startLine, startColumn, endLine, endColumn. |
roe health --format json
{
"version": 1,
"root": "/path/to/solution",
"summary": {
"projects": 1,
"filesScanned": 214,
"symbols": 2610,
"highComplexity": 1,
"highCognitiveComplexity": 0,
"longMethods": 0,
"tooManyParameters": 1,
"largeFiles": 0,
"largeTypes": 1,
"circularDependencies": 1,
"elapsedMs": 8,
"excluded": {
"testProjects": ["App.Tests"],
"ignoredFiles": 4
}
},
"findings": [
{
"kind": "large-type",
"name": "App.Billing.InvoiceService",
"project": "App",
"file": "src/App/Billing/InvoiceService.cs",
"line": 3,
"column": 14,
"metric": 34,
"threshold": 20,
"breakdown": {
"methods": 15,
"properties": 19,
"fields": 0,
"events": 0
}
},
{
"kind": "too-many-parameters",
"name": "App.Billing.InvoiceService.Reconcile",
"project": "App",
"file": "src/App/Billing/InvoiceService.cs",
"line": 42,
"column": 17,
"metric": 8,
"threshold": 5,
"parameters": {
"required": 8,
"optional": 2,
"out": 1
}
}
],
"cycles": [
{
"path": [
{
"name": "App.Orders.Order",
"project": "App",
"file": "src/App/Orders/Order.cs",
"line": 3,
"column": 14
},
{
"name": "App.Orders.Invoice",
"project": "App",
"file": "src/App/Orders/Invoice.cs",
"line": 8,
"column": 14
}
],
"others": []
}
],
"hotspots": []
}
| Field | Description |
|---|---|
version | Schema version, 1. |
root | The analysis root path. |
summary | Scan totals: projects, filesScanned, symbols, one count per check (highComplexity, highCognitiveComplexity, longMethods, tooManyParameters, largeFiles, largeTypes, circularDependencies), and elapsedMs. commitsWalked is present only when --hotspots was passed. The three scan totals count what was eligible to be reported, so they narrow under --exclude-tests and the config’s ignore globs (top-level and health.ignore). |
summary.baselined | How many findings and cycles a baseline hid — they are counted nowhere else in this document. Present only when a baseline was in force, so 0 means “the baseline is fully ratcheted” and absent means “no baseline was used”. |
summary.excluded | What was ruled out before any check ran: testProjects (an array of project names, present under --exclude-tests) and ignoredFiles (a count). Omitted entirely when nothing was excluded. |
findings[].kind | high-complexity, high-cognitive-complexity, long-method, too-many-parameters, large-file, or large-type — the same names used by inline suppressions. |
findings[].name | Fully-qualified symbol name, or the file path for a large file. |
findings[].project | The containing project. Optional. |
findings[].file, line, column | Location of the finding; large-file findings are pinned at 1:1. |
findings[].metric | The measured value — the complexity score, line count, member count, or, for too-many-parameters, the required parameter count rather than the declared total. |
findings[].threshold | The threshold it exceeded. metric / threshold is the severity the human report sorts by. |
findings[].breakdown | Member composition — methods, properties, fields, events. Present on large-type findings only. |
findings[].parameters | Signature composition — required, optional, out. Present on too-many-parameters findings only. required always equals metric; the three sum to the declared parameter count. |
cycles[].path | The types on the cycle, each referencing the next and the last referencing the first. Each entry has name, project, file, line, column. |
cycles[].others | Types in the same tangle that aren’t on path. Empty for a simple cycle. |
hotspots[] | Present only with --hotspots: file, project, score, weightedCommits, cyclomatic, lines, complexityDensity. Empty otherwise. |
One finding is emitted per tripped check, so a single method that’s both too
complex and too long appears twice. The human report groups those into one
entry, and
--sort and --limit apply to it alone — JSON is never
reordered or truncated.