docguard-cli 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PHILOSOPHY.md +1 -0
- package/README.md +70 -30
- package/cli/commands/ci.mjs +52 -13
- package/cli/commands/guard.mjs +80 -0
- package/cli/commands/hooks.mjs +167 -2
- package/cli/commands/impact.mjs +213 -5
- package/cli/commands/mcp.mjs +195 -53
- package/cli/commands/report.mjs +200 -0
- package/cli/commands/score.mjs +55 -1
- package/cli/docguard.mjs +101 -13
- package/cli/findings.mjs +6 -0
- package/cli/scanners/agent-readability.mjs +6 -1
- package/cli/scanners/semantic-claims.mjs +10 -2
- package/cli/shared-git.mjs +23 -0
- package/cli/validators/architecture.mjs +8 -1
- package/cli/validators/cross-reference.mjs +124 -3
- package/cli/validators/docs-coverage.mjs +5 -0
- package/cli/validators/reference-existence.mjs +172 -18
- package/cli/validators/traceability.mjs +63 -0
- package/cli/writers/baseline.mjs +84 -0
- package/cli/writers/history.mjs +82 -0
- package/cli/writers/junit.mjs +103 -0
- package/docs/commands.md +30 -2
- package/docs/configuration.md +14 -0
- package/docs/faq.md +12 -0
- package/extensions/spec-kit-docguard/extension.yml +1 -1
- package/extensions/spec-kit-docguard/skills/docguard-fix/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-guard/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-review/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-sync/SKILL.md +2 -2
- package/package.json +1 -1
- package/schemas/docguard-config.schema.json +5 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Score History — local-first trend memory at `.docguard/history.jsonl`.
|
|
3
|
+
*
|
|
4
|
+
* `docguard ci` appends one line per run ({timestamp, commit, score, grade,
|
|
5
|
+
* errors, warnings, passed, total, status}); `docguard score --trend` reads
|
|
6
|
+
* it back and renders the trajectory. JSONL because append is the hot path:
|
|
7
|
+
* one O(1) write per CI run, and a truncated last line (crash mid-write)
|
|
8
|
+
* corrupts one entry, not the file. The rare trim rewrite goes through a
|
|
9
|
+
* temp-file + rename so a crash mid-trim can't truncate history; concurrent
|
|
10
|
+
* appends during a trim window can still lose an entry — acceptable for a
|
|
11
|
+
* trend log, not a ledger.
|
|
12
|
+
*
|
|
13
|
+
* Local-first by design: `.docguard/` is gitignored, so history accumulates
|
|
14
|
+
* per checkout. In ephemeral CI, persist it across runs with a cache/artifact
|
|
15
|
+
* step (see CI-RECIPES) — the file format is stable and merge-friendly.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { resolve, dirname } from 'node:path';
|
|
20
|
+
|
|
21
|
+
const HISTORY_PATH = '.docguard/history.jsonl';
|
|
22
|
+
|
|
23
|
+
// Trim trigger: beyond this many entries the file is rewritten keeping the
|
|
24
|
+
// most recent MAX_ENTRIES. Generous — 1000 CI runs of ~150 bytes ≈ 150 KB.
|
|
25
|
+
const MAX_ENTRIES = 1000;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Append one run entry. Silent no-op on failure (read-only checkouts, odd
|
|
29
|
+
* CI filesystems) — recording history must never fail the pipeline it's
|
|
30
|
+
* recording.
|
|
31
|
+
*/
|
|
32
|
+
export function appendHistory(projectDir, entry) {
|
|
33
|
+
try {
|
|
34
|
+
const p = resolve(projectDir, HISTORY_PATH);
|
|
35
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
36
|
+
appendFileSync(p, JSON.stringify(entry) + '\n');
|
|
37
|
+
// Occasional trim, checked cheaply by size (~200 KB ≫ MAX_ENTRIES rows).
|
|
38
|
+
// Temp-file + rename: a crash mid-trim leaves the old file intact
|
|
39
|
+
// instead of a truncated one (L2).
|
|
40
|
+
if (statSync(p).size > 256 * 1024) {
|
|
41
|
+
const rows = loadHistory(projectDir, MAX_ENTRIES);
|
|
42
|
+
const tmp = p + '.tmp';
|
|
43
|
+
writeFileSync(tmp, rows.map(r => JSON.stringify(r)).join('\n') + '\n');
|
|
44
|
+
renameSync(tmp, p);
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
} catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Read the last `limit` valid entries, oldest → newest. Malformed lines
|
|
54
|
+
* (partial writes, hand edits) are skipped, never thrown.
|
|
55
|
+
*/
|
|
56
|
+
export function loadHistory(projectDir, limit = 50) {
|
|
57
|
+
try {
|
|
58
|
+
const p = resolve(projectDir, HISTORY_PATH);
|
|
59
|
+
if (!existsSync(p)) return [];
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const line of readFileSync(p, 'utf-8').split('\n')) {
|
|
62
|
+
if (!line.trim()) continue;
|
|
63
|
+
try {
|
|
64
|
+
const e = JSON.parse(line);
|
|
65
|
+
if (e && typeof e.score === 'number') out.push(e);
|
|
66
|
+
} catch { /* skip malformed line */ }
|
|
67
|
+
}
|
|
68
|
+
return out.slice(-limit);
|
|
69
|
+
} catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Unicode sparkline over the score series (0–100 → ▁–█). Pure display.
|
|
76
|
+
*/
|
|
77
|
+
export function sparkline(scores) {
|
|
78
|
+
const BARS = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'];
|
|
79
|
+
return scores
|
|
80
|
+
.map(s => BARS[Math.min(BARS.length - 1, Math.max(0, Math.floor((s / 100) * BARS.length)))])
|
|
81
|
+
.join('');
|
|
82
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JUnit XML writer — `docguard guard --format junit`.
|
|
3
|
+
*
|
|
4
|
+
* SARIF covers GitHub Code Scanning; JUnit covers everything else an
|
|
5
|
+
* enterprise runs: GitLab CI (`artifacts:reports:junit`), Jenkins
|
|
6
|
+
* (`junit` step), Azure DevOps, CircleCI, Bamboo. One testcase per
|
|
7
|
+
* validator keeps the report readable in those UIs — a failed validator
|
|
8
|
+
* shows its findings (code + message + location) as the failure body.
|
|
9
|
+
*
|
|
10
|
+
* Mapping (deterministic):
|
|
11
|
+
* validator error findings → <failure> (red in every CI)
|
|
12
|
+
* validator crashed (fail, no
|
|
13
|
+
* structured findings) → <error> from its string errors (red)
|
|
14
|
+
* warn-only validator → passing testcase + findings in
|
|
15
|
+
* <system-out> (visible, non-gating)
|
|
16
|
+
* skipped / n/a → <skipped/>
|
|
17
|
+
*
|
|
18
|
+
* Zero npm dependencies — pure string assembly with strict XML escaping.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
function esc(s) {
|
|
22
|
+
return String(s ?? '')
|
|
23
|
+
.replace(/&/g, '&')
|
|
24
|
+
.replace(/</g, '<')
|
|
25
|
+
.replace(/>/g, '>')
|
|
26
|
+
.replace(/"/g, '"')
|
|
27
|
+
.replace(/'/g, ''');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function findingLine(f) {
|
|
31
|
+
const code = f.code ? `[${f.code}] ` : '';
|
|
32
|
+
const loc = f.location ? ` (${f.location})` : '';
|
|
33
|
+
return `${code}${f.message}${loc}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Build the JUnit XML document from runGuardInternal's data.
|
|
38
|
+
* `data.validators` entries: { name, status, findings? }; `data.findings`
|
|
39
|
+
* is the flat list with `validator` back-references — we group by the
|
|
40
|
+
* validator display name via each result's own findings when present,
|
|
41
|
+
* falling back to the flat list.
|
|
42
|
+
*/
|
|
43
|
+
export function toJUnit(data) {
|
|
44
|
+
const cases = [];
|
|
45
|
+
let failures = 0, errorCount = 0, skipped = 0;
|
|
46
|
+
|
|
47
|
+
for (const v of data.validators || []) {
|
|
48
|
+
const vFindings = Array.isArray(v.findings)
|
|
49
|
+
? v.findings
|
|
50
|
+
: (data.findings || []).filter(f => f.validator === v.key || f.validator === v.name);
|
|
51
|
+
const errors = vFindings.filter(f => f.severity === 'error');
|
|
52
|
+
const warns = vFindings.filter(f => f.severity !== 'error');
|
|
53
|
+
const attrs = `name="${esc(v.name)}" classname="docguard.guard"`;
|
|
54
|
+
|
|
55
|
+
if (v.status === 'skipped' || v.status === 'na') {
|
|
56
|
+
skipped++;
|
|
57
|
+
cases.push(` <testcase ${attrs}><skipped/></testcase>`);
|
|
58
|
+
} else if (errors.length > 0) {
|
|
59
|
+
failures++;
|
|
60
|
+
const body = errors.map(findingLine).join('\n');
|
|
61
|
+
cases.push(
|
|
62
|
+
` <testcase ${attrs}>\n` +
|
|
63
|
+
` <failure message="${esc(errors[0].message)}" type="${esc(errors[0].code || 'docguard')}">${esc(body)}</failure>\n` +
|
|
64
|
+
` </testcase>`
|
|
65
|
+
);
|
|
66
|
+
} else if (v.status === 'fail') {
|
|
67
|
+
// A validator that failed WITHOUT structured error findings — the
|
|
68
|
+
// crash path (guard catches the throw and records string errors only).
|
|
69
|
+
// This must go red in CI, not render as a passing testcase (M1).
|
|
70
|
+
errorCount++;
|
|
71
|
+
const body = (v.errors || []).join('\n') || 'validator failed without structured findings';
|
|
72
|
+
cases.push(
|
|
73
|
+
` <testcase ${attrs}>\n` +
|
|
74
|
+
` <error message="${esc((v.errors || [])[0] || 'validator failed')}" type="docguard.crash">${esc(body)}</error>\n` +
|
|
75
|
+
` </testcase>`
|
|
76
|
+
);
|
|
77
|
+
} else if (warns.length > 0) {
|
|
78
|
+
const body = warns.map(findingLine).join('\n');
|
|
79
|
+
cases.push(
|
|
80
|
+
` <testcase ${attrs}>\n` +
|
|
81
|
+
` <system-out>${esc(body)}</system-out>\n` +
|
|
82
|
+
` </testcase>`
|
|
83
|
+
);
|
|
84
|
+
} else {
|
|
85
|
+
cases.push(` <testcase ${attrs}/>`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const total = (data.validators || []).length;
|
|
90
|
+
const suiteAttrs =
|
|
91
|
+
`name="docguard guard — ${esc(data.project || 'project')}" ` +
|
|
92
|
+
`tests="${total}" failures="${failures}" errors="${errorCount}" skipped="${skipped}" ` +
|
|
93
|
+
`timestamp="${esc(data.timestamp || '')}"`;
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
`<?xml version="1.0" encoding="UTF-8"?>\n` +
|
|
97
|
+
`<testsuites tests="${total}" failures="${failures}" errors="${errorCount}">\n` +
|
|
98
|
+
` <testsuite ${suiteAttrs}>\n` +
|
|
99
|
+
cases.join('\n') + (cases.length ? '\n' : '') +
|
|
100
|
+
` </testsuite>\n` +
|
|
101
|
+
`</testsuites>`
|
|
102
|
+
);
|
|
103
|
+
}
|
package/docs/commands.md
CHANGED
|
@@ -38,6 +38,17 @@ npx docguard-cli diagnose --format prompt # Raw AI prompt (all issues combined)
|
|
|
38
38
|
npx docguard-cli guard # Text output
|
|
39
39
|
npx docguard-cli guard --format json # Structured JSON (the stable agent contract)
|
|
40
40
|
npx docguard-cli guard --format sarif # SARIF 2.1.0 for GitHub Code Scanning
|
|
41
|
+
npx docguard-cli guard --format junit # JUnit XML for GitLab/Jenkins/Azure DevOps
|
|
42
|
+
npx docguard-cli guard --update-baseline # Freeze current findings (brownfield adoption)
|
|
43
|
+
npx docguard-cli guard --no-baseline # Ignore the committed baseline this run
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Adoption baseline:** on a legacy repo, `--update-baseline` writes
|
|
47
|
+
`.docguard.baseline.json` (commit it). From then on guard/ci suppress those
|
|
48
|
+
frozen findings — visibly — and gate only new drift. Fingerprints are stable
|
|
49
|
+
across line-number churn and volatile counts, so the baseline doesn't rot.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
41
52
|
npx docguard-cli guard --verbose # Show all check details
|
|
42
53
|
npx docguard-cli guard --changed-only # Pre-commit lite mode (fast subset)
|
|
43
54
|
```
|
|
@@ -181,7 +192,7 @@ never touched without `--force`.
|
|
|
181
192
|
|
|
182
193
|
**MCP server over stdio** — DocGuard's read-only core as native agent tools
|
|
183
194
|
(`docguard_guard`, `docguard_score`, `docguard_explain`,
|
|
184
|
-
`docguard_verify_claims`, `docguard_diagnose`).
|
|
195
|
+
`docguard_verify_claims`, `docguard_report`, `docguard_diagnose`).
|
|
185
196
|
|
|
186
197
|
```bash
|
|
187
198
|
claude mcp add docguard -- npx docguard-cli mcp
|
|
@@ -211,15 +222,32 @@ npx docguard-cli memory --pack # .docguard/context-pack.md (session-start co
|
|
|
211
222
|
|
|
212
223
|
## DevOps Commands
|
|
213
224
|
|
|
225
|
+
### `docguard report`
|
|
226
|
+
|
|
227
|
+
**Compliance-evidence bundle for audits** — guard verdict, CDD score, ALCOA+
|
|
228
|
+
data-integrity attributes, findings grouped by code, and fix history, stamped
|
|
229
|
+
with the git commit and a tamper-evident sha256 integrity hash. Evidence, not
|
|
230
|
+
a gate: always exits 0 (`guard`/`ci` fail builds).
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
npx docguard-cli report # markdown to stdout
|
|
234
|
+
npx docguard-cli report --format json # machine bundle
|
|
235
|
+
npx docguard-cli report --out evidence.md # write to a file
|
|
236
|
+
```
|
|
237
|
+
|
|
214
238
|
### `docguard ci`
|
|
215
239
|
|
|
216
|
-
**Single command for CI/CD pipelines.** Runs guard + score internally (no
|
|
240
|
+
**Single command for CI/CD pipelines.** Runs guard + score internally (no
|
|
241
|
+
subprocess). Read-only and machine-clean: it never scaffolds or mutates the
|
|
242
|
+
workspace it validates. Each run appends one line to `.docguard/history.jsonl`
|
|
243
|
+
so `docguard score --trend` can show the trajectory (opt out: `--no-history`).
|
|
217
244
|
|
|
218
245
|
```bash
|
|
219
246
|
npx docguard-cli ci # Basic check
|
|
220
247
|
npx docguard-cli ci --threshold 70 # Fail below score 70
|
|
221
248
|
npx docguard-cli ci --threshold 80 --fail-on-warning # Strict mode
|
|
222
249
|
npx docguard-cli ci --format json # JSON for GitHub Actions
|
|
250
|
+
npx docguard-cli score --trend # Score history from past ci runs
|
|
223
251
|
```
|
|
224
252
|
|
|
225
253
|
### `docguard hooks`
|
package/docs/configuration.md
CHANGED
|
@@ -111,6 +111,20 @@ Conventional doc folders (`docs/`, `doc/`, `documentation/`, `guides/`,
|
|
|
111
111
|
that set with non-standard homes — it never replaces auto-detection. To exclude
|
|
112
112
|
a conventional dir, list it in `.docguardignore`.
|
|
113
113
|
|
|
114
|
+
## Adoption baseline — `baseline`
|
|
115
|
+
|
|
116
|
+
When a committed `.docguard.baseline.json` exists (written by
|
|
117
|
+
`docguard guard --update-baseline`), guard/ci suppress the frozen findings
|
|
118
|
+
and gate only new drift. Set `"baseline": false` in `.docguard.json` to
|
|
119
|
+
ignore the file entirely (same as always passing `--no-baseline`):
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
{ "baseline": false }
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Suppression is always visible in output and in the `baselineSuppressed`
|
|
126
|
+
JSON field — nothing is silently hidden.
|
|
127
|
+
|
|
114
128
|
## Muting a validator
|
|
115
129
|
|
|
116
130
|
Two ways to turn a validator off, for two different intents:
|
package/docs/faq.md
CHANGED
|
@@ -123,6 +123,18 @@ Yes — DocGuard ships a template at `templates/ci/github-actions.yml`. Copy it
|
|
|
123
123
|
|
|
124
124
|
Only if you install hooks (`docguard hooks`). Without hooks, it's advisory only.
|
|
125
125
|
|
|
126
|
+
### I ran guard on our legacy repo and got dozens of findings. Now what?
|
|
127
|
+
|
|
128
|
+
Freeze them and move forward:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npx docguard-cli guard --update-baseline # writes .docguard.baseline.json — commit it
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
From then on guard/ci pass, suppress the frozen findings **visibly**
|
|
135
|
+
("N pre-existing finding(s) suppressed"), and gate only NEW drift. Burn the
|
|
136
|
+
baseline down at your own pace; `--no-baseline` shows the full picture anytime.
|
|
137
|
+
|
|
126
138
|
---
|
|
127
139
|
|
|
128
140
|
## Technical
|
|
@@ -3,7 +3,7 @@ schema_version: "1.0"
|
|
|
3
3
|
extension:
|
|
4
4
|
id: "docguard"
|
|
5
5
|
name: "DocGuard — CDD Enforcement"
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.33.0"
|
|
7
7
|
description: "Canonical-Driven Development enforcement as a true spec-kit extension. LLM-first design with automated validators, 4 AI behavior skills, spec-kit skill chaining, and workflow hooks. One pinned runtime dependency (@babel/parser); pure Node.js otherwise."
|
|
8
8
|
author: "Ricardo Accioly"
|
|
9
9
|
repository: "https://github.com/raccioly/docguard"
|
|
@@ -6,10 +6,10 @@ description: AI-driven documentation repair with structured research workflow, t
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.33.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-fix
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.33.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Fix Skill
|
|
15
15
|
|
|
@@ -7,10 +7,10 @@ description: Run DocGuard guard validation against Canonical-Driven Development
|
|
|
7
7
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
8
8
|
metadata:
|
|
9
9
|
author: docguard
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.33.0
|
|
11
11
|
source: extensions/spec-kit-docguard/skills/docguard-guard
|
|
12
12
|
---
|
|
13
|
-
<!-- docguard:version: 0.
|
|
13
|
+
<!-- docguard:version: 0.33.0 -->
|
|
14
14
|
|
|
15
15
|
# DocGuard Guard Skill
|
|
16
16
|
|
|
@@ -6,10 +6,10 @@ description: Cross-document consistency analysis and quality assessment. Perform
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.33.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-review
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.33.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Review Skill
|
|
15
15
|
|
|
@@ -6,10 +6,10 @@ description: CDD maturity assessment with category-aware improvement roadmap. Ru
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.33.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-score
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.33.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Score Skill
|
|
15
15
|
|
|
@@ -4,10 +4,10 @@ description: Keep canonical documentation ALWAYS UP TO DATE. Refreshes code-trut
|
|
|
4
4
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
5
5
|
metadata:
|
|
6
6
|
author: docguard
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.33.0
|
|
8
8
|
source: extensions/spec-kit-docguard/skills/docguard-sync
|
|
9
9
|
---
|
|
10
|
-
<!-- docguard:version: 0.
|
|
10
|
+
<!-- docguard:version: 0.33.0 -->
|
|
11
11
|
|
|
12
12
|
# DocGuard Sync Skill
|
|
13
13
|
|
package/package.json
CHANGED
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"enum": ["cli", "library", "webapp", "api", "unknown"],
|
|
30
30
|
"description": "Project shape. Affects which validators run (e.g. webapp + api need env vars; cli/library can skip)."
|
|
31
31
|
},
|
|
32
|
+
"baseline": {
|
|
33
|
+
"type": "boolean",
|
|
34
|
+
"description": "Set false to ignore a committed .docguard.baseline.json entirely (equivalent to always passing --no-baseline). Default: the baseline auto-applies when the file exists.",
|
|
35
|
+
"default": true
|
|
36
|
+
},
|
|
32
37
|
"projectTypeConfig": {
|
|
33
38
|
"type": "object",
|
|
34
39
|
"description": "Per-type behavior knobs that override profile defaults.",
|