Quickstart
Run the doctor, read the score, and triage the first finding.
First run
From the root of any Vue 3 or Nuxt 4 project:
npx -y @geoql/vue-doctor
The doctor will:
- Detect your project layout (
vuevsnuxt, theapp/andserver/directories, monorepo workspaces, and the usual auto-imports). - Run the audit. Most projects complete in under a second.
- Write a markdown report plus a SARIF artifact to
.doctor/. - Print a one-line summary to stdout (the
agentreporter).
A typical first run looks like this:
$ npx -y @geoql/vue-doctor
doctor@0.1.0 · scanning 124 files · 0 errors, 4 warns, 12 info
.score 88.0 · grade B · 0.42s
Reading the score
The score is a single integer from 0 to 100 plus a letter grade
(A ≥ 95, B ≥ 85, C ≥ 70, D ≥ 50, F < 50). It's deterministic:
the same diff on the same ruleset always produces the same number.
The number is computed from a √-decay over the findings:
errordeducts 5warndeducts 2infodeducts 0.5
Repeats of the same rule are damped by 1/√(i+1) so a single
em-dash on every page of a 200-file repo doesn't tank the score, but
a 200-file repo with 200 different rules firing is a real problem.
The full formula lives in Scoring — how the score is computed.
The score is for trend-spotting and CI gating, not for absolute comparison across projects. A score of 88 in a 5-file prototype and a score of 88 in a 200-file production app are not equivalent — the former is much easier to keep clean. Track the delta between commits, not the absolute value.
Reading the report
The markdown report (.doctor/report.md) has four sections:
- Summary — the score, file count, rule counts per severity, and a per-rule breakdown.
- Diagnostics — every finding with file, line, column, rule id, severity, and the suggested fix.
- Source profile — Vue version, Nuxt version, capabilities detected, monorepo layout.
- Timings — per-phase time spent (template AST, oxlint subprocess, scoring, reporter).
The SARIF artifact is the same data, in the GitHub code-scanning format. Wire it into your CI to get inline PR annotations.
Triage the first finding
The first thing most people see is no-em-dash-in-str — the doctor
flags em-dashes (—) in string literals because the AI agents
emitting them are almost always trying to look polished instead of
being correct. It's a stylistic tell, not a bug.
To silence it project-wide, add it to your doctor.config.ts:
import { defineConfig } from '@geoql/doctor-core';
export default defineConfig({
rules: {
'no-em-dash-in-str': 'off',
},
});
To silence it for a single line, use the inline disable:
// vue-doctor-disable-next-line no-em-dash-in-str const summary =
'Auto-generated — review before merging';
Inline disables are picked up by the respect-inline-disables flag
(--respect-inline-disables on the CLI, respectInlineDisables: true
in the config). The default is false so you don't accidentally
ship a // doctor-disable-next-line that no one is reviewing.
Next: CI
Once the first run is clean locally, wire it into CI. The next section walks through GitHub Actions, GitLab CI, and the composite actions.