plumbbob 0.9.3 → 0.9.5
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/.claude-plugin/plugin.json +1 -1
- package/README.md +15 -13
- package/dist/cli-core.js +19 -2
- package/dist/lib/check.js +46 -13
- package/dist/lib/intent.js +1 -1
- package/dist/lib/latch.js +3 -3
- package/dist/lib/reentry.js +70 -0
- package/dist/verbs/agent.js +2 -2
- package/dist/verbs/doctor.js +4 -4
- package/dist/verbs/finish.js +1 -1
- package/dist/verbs/recover.js +297 -0
- package/dist/verbs/revert.js +2 -2
- package/dist/verbs/spike.js +8 -2
- package/hooks/post-edit.sh +4 -4
- package/hooks/pre-bash-commit.sh +3 -3
- package/node_modules/checkride/.claude-plugin/plugin.json +11 -0
- package/node_modules/checkride/CHANGELOG.md +1003 -0
- package/node_modules/checkride/LICENSE +201 -21
- package/node_modules/checkride/README.md +171 -30
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts +15 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.d.ts.map +1 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js +17 -0
- package/node_modules/checkride/dist/__tests__/fixtures/released-stanzas.js.map +1 -0
- package/node_modules/checkride/dist/adapters.d.ts +18 -6
- package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
- package/node_modules/checkride/dist/adapters.js +42 -23
- package/node_modules/checkride/dist/adapters.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/claude.d.ts +88 -0
- package/node_modules/checkride/dist/agent-setup/claude.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/claude.js +305 -0
- package/node_modules/checkride/dist/agent-setup/claude.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/command.d.ts +43 -0
- package/node_modules/checkride/dist/agent-setup/command.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/command.js +77 -0
- package/node_modules/checkride/dist/agent-setup/command.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts +61 -0
- package/node_modules/checkride/dist/agent-setup/cursor.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/cursor.js +189 -0
- package/node_modules/checkride/dist/agent-setup/cursor.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/files.d.ts +50 -0
- package/node_modules/checkride/dist/agent-setup/files.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/files.js +80 -0
- package/node_modules/checkride/dist/agent-setup/files.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/harness.d.ts +101 -0
- package/node_modules/checkride/dist/agent-setup/harness.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/harness.js +84 -0
- package/node_modules/checkride/dist/agent-setup/harness.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/hook.d.ts +45 -52
- package/node_modules/checkride/dist/agent-setup/hook.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/hook.js +64 -95
- package/node_modules/checkride/dist/agent-setup/hook.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/index.d.ts +10 -4
- package/node_modules/checkride/dist/agent-setup/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/agent-setup/index.js +9 -4
- package/node_modules/checkride/dist/agent-setup/index.js.map +1 -1
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts +58 -0
- package/node_modules/checkride/dist/agent-setup/scripts.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/scripts.js +299 -0
- package/node_modules/checkride/dist/agent-setup/scripts.js.map +1 -0
- package/node_modules/checkride/dist/agent-setup/skills.d.ts +31 -0
- package/node_modules/checkride/dist/agent-setup/skills.d.ts.map +1 -0
- package/node_modules/checkride/dist/agent-setup/skills.js +56 -0
- package/node_modules/checkride/dist/agent-setup/skills.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/configured.d.ts +30 -0
- package/node_modules/checkride/dist/artifacts/configured.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/configured.js +45 -0
- package/node_modules/checkride/dist/artifacts/configured.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/format.d.ts +33 -0
- package/node_modules/checkride/dist/artifacts/format.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/format.js +56 -0
- package/node_modules/checkride/dist/artifacts/format.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/freshness.d.ts +32 -0
- package/node_modules/checkride/dist/artifacts/freshness.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/freshness.js +37 -0
- package/node_modules/checkride/dist/artifacts/freshness.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/index.d.ts +22 -0
- package/node_modules/checkride/dist/artifacts/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/index.js +19 -0
- package/node_modules/checkride/dist/artifacts/index.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/json.d.ts +31 -0
- package/node_modules/checkride/dist/artifacts/json.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/json.js +47 -0
- package/node_modules/checkride/dist/artifacts/json.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/raw.d.ts +60 -0
- package/node_modules/checkride/dist/artifacts/raw.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/raw.js +91 -0
- package/node_modules/checkride/dist/artifacts/raw.js.map +1 -0
- package/node_modules/checkride/dist/artifacts/summary.d.ts +69 -0
- package/node_modules/checkride/dist/artifacts/summary.d.ts.map +1 -0
- package/node_modules/checkride/dist/artifacts/summary.js +108 -0
- package/node_modules/checkride/dist/artifacts/summary.js.map +1 -0
- package/node_modules/checkride/dist/atomic.d.ts +16 -1
- package/node_modules/checkride/dist/atomic.d.ts.map +1 -1
- package/node_modules/checkride/dist/atomic.js +25 -3
- package/node_modules/checkride/dist/atomic.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.d.ts +9 -5
- package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fallow.js +161 -58
- package/node_modules/checkride/dist/baseline/fallow.js.map +1 -1
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts +7 -7
- package/node_modules/checkride/dist/baseline/fingerprint.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/fingerprint.js +16 -19
- package/node_modules/checkride/dist/baseline/fingerprint.js.map +1 -1
- package/node_modules/checkride/dist/baseline/index.d.ts +4 -4
- package/node_modules/checkride/dist/baseline/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/index.js +4 -4
- package/node_modules/checkride/dist/baseline/index.js.map +1 -1
- package/node_modules/checkride/dist/baseline/store.d.ts +12 -4
- package/node_modules/checkride/dist/baseline/store.d.ts.map +1 -1
- package/node_modules/checkride/dist/baseline/store.js +16 -9
- package/node_modules/checkride/dist/baseline/store.js.map +1 -1
- package/node_modules/checkride/dist/baseline-command.d.ts +5 -5
- package/node_modules/checkride/dist/baseline-command.js +7 -7
- package/node_modules/checkride/dist/baseline-command.js.map +1 -1
- package/node_modules/checkride/dist/cli.d.ts +17 -4
- package/node_modules/checkride/dist/cli.d.ts.map +1 -1
- package/node_modules/checkride/dist/cli.js +259 -18
- package/node_modules/checkride/dist/cli.js.map +1 -1
- package/node_modules/checkride/dist/config.d.ts +84 -8
- package/node_modules/checkride/dist/config.d.ts.map +1 -1
- package/node_modules/checkride/dist/config.js +122 -18
- package/node_modules/checkride/dist/config.js.map +1 -1
- package/node_modules/checkride/dist/digest/digest.d.ts +5 -5
- package/node_modules/checkride/dist/digest/digest.js +5 -5
- package/node_modules/checkride/dist/digest/index.d.ts +2 -2
- package/node_modules/checkride/dist/digest/index.js +2 -2
- package/node_modules/checkride/dist/doctor.d.ts +25 -6
- package/node_modules/checkride/dist/doctor.d.ts.map +1 -1
- package/node_modules/checkride/dist/doctor.js +193 -27
- package/node_modules/checkride/dist/doctor.js.map +1 -1
- package/node_modules/checkride/dist/gate.d.ts +135 -0
- package/node_modules/checkride/dist/gate.d.ts.map +1 -0
- package/node_modules/checkride/dist/gate.js +490 -0
- package/node_modules/checkride/dist/gate.js.map +1 -0
- package/node_modules/checkride/dist/init.d.ts +72 -12
- package/node_modules/checkride/dist/init.d.ts.map +1 -1
- package/node_modules/checkride/dist/init.js +324 -81
- package/node_modules/checkride/dist/init.js.map +1 -1
- package/node_modules/checkride/dist/json.d.ts +21 -0
- package/node_modules/checkride/dist/json.d.ts.map +1 -0
- package/node_modules/checkride/dist/json.js +21 -0
- package/node_modules/checkride/dist/json.js.map +1 -0
- package/node_modules/checkride/dist/links.d.ts +31 -5
- package/node_modules/checkride/dist/links.d.ts.map +1 -1
- package/node_modules/checkride/dist/links.js +141 -32
- package/node_modules/checkride/dist/links.js.map +1 -1
- package/node_modules/checkride/dist/node-pin.d.ts +129 -0
- package/node_modules/checkride/dist/node-pin.d.ts.map +1 -0
- package/node_modules/checkride/dist/node-pin.js +211 -0
- package/node_modules/checkride/dist/node-pin.js.map +1 -0
- package/node_modules/checkride/dist/orchestrator.d.ts +40 -10
- package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
- package/node_modules/checkride/dist/orchestrator.js +196 -102
- package/node_modules/checkride/dist/orchestrator.js.map +1 -1
- package/node_modules/checkride/dist/pack.d.ts +8 -9
- package/node_modules/checkride/dist/pack.d.ts.map +1 -1
- package/node_modules/checkride/dist/pack.js +53 -17
- package/node_modules/checkride/dist/pack.js.map +1 -1
- package/node_modules/checkride/dist/pm/detect.d.ts +6 -1
- package/node_modules/checkride/dist/pm/detect.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/detect.js +6 -1
- package/node_modules/checkride/dist/pm/detect.js.map +1 -1
- package/node_modules/checkride/dist/pm/index.d.ts +6 -2
- package/node_modules/checkride/dist/pm/index.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/index.js +6 -2
- package/node_modules/checkride/dist/pm/index.js.map +1 -1
- package/node_modules/checkride/dist/pm/launch.d.ts +51 -0
- package/node_modules/checkride/dist/pm/launch.d.ts.map +1 -0
- package/node_modules/checkride/dist/pm/launch.js +92 -0
- package/node_modules/checkride/dist/pm/launch.js.map +1 -0
- package/node_modules/checkride/dist/pm/tools.d.ts +73 -0
- package/node_modules/checkride/dist/pm/tools.d.ts.map +1 -0
- package/node_modules/checkride/dist/pm/tools.js +124 -0
- package/node_modules/checkride/dist/pm/tools.js.map +1 -0
- package/node_modules/checkride/dist/pm/translate.d.ts +35 -9
- package/node_modules/checkride/dist/pm/translate.d.ts.map +1 -1
- package/node_modules/checkride/dist/pm/translate.js +78 -18
- package/node_modules/checkride/dist/pm/translate.js.map +1 -1
- package/node_modules/checkride/dist/proc.d.ts +30 -0
- package/node_modules/checkride/dist/proc.d.ts.map +1 -0
- package/node_modules/checkride/dist/proc.js +42 -0
- package/node_modules/checkride/dist/proc.js.map +1 -0
- package/node_modules/checkride/dist/qa/cli.d.ts +20 -0
- package/node_modules/checkride/dist/qa/cli.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/cli.js +24 -0
- package/node_modules/checkride/dist/qa/cli.js.map +1 -0
- package/node_modules/checkride/dist/qa/dead.d.ts +39 -0
- package/node_modules/checkride/dist/qa/dead.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/dead.js +88 -0
- package/node_modules/checkride/dist/qa/dead.js.map +1 -0
- package/node_modules/checkride/dist/qa/dupes.d.ts +45 -0
- package/node_modules/checkride/dist/qa/dupes.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/dupes.js +62 -0
- package/node_modules/checkride/dist/qa/dupes.js.map +1 -0
- package/node_modules/checkride/dist/qa/health.d.ts +85 -0
- package/node_modules/checkride/dist/qa/health.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/health.js +109 -0
- package/node_modules/checkride/dist/qa/health.js.map +1 -0
- package/node_modules/checkride/dist/qa/index.d.ts +23 -0
- package/node_modules/checkride/dist/qa/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/index.js +22 -0
- package/node_modules/checkride/dist/qa/index.js.map +1 -0
- package/node_modules/checkride/dist/qa/mutation.d.ts +80 -0
- package/node_modules/checkride/dist/qa/mutation.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/mutation.js +195 -0
- package/node_modules/checkride/dist/qa/mutation.js.map +1 -0
- package/node_modules/checkride/dist/qa/qa.d.ts +71 -0
- package/node_modules/checkride/dist/qa/qa.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/qa.js +158 -0
- package/node_modules/checkride/dist/qa/qa.js.map +1 -0
- package/node_modules/checkride/dist/qa/read.d.ts +40 -0
- package/node_modules/checkride/dist/qa/read.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/read.js +47 -0
- package/node_modules/checkride/dist/qa/read.js.map +1 -0
- package/node_modules/checkride/dist/qa/render.d.ts +26 -0
- package/node_modules/checkride/dist/qa/render.d.ts.map +1 -0
- package/node_modules/checkride/dist/qa/render.js +310 -0
- package/node_modules/checkride/dist/qa/render.js.map +1 -0
- package/node_modules/checkride/dist/security.d.ts +45 -0
- package/node_modules/checkride/dist/security.d.ts.map +1 -0
- package/node_modules/checkride/dist/security.js +86 -0
- package/node_modules/checkride/dist/security.js.map +1 -0
- package/node_modules/checkride/dist/smoke.d.ts +5 -5
- package/node_modules/checkride/dist/smoke.js +5 -5
- package/node_modules/checkride/dist/snippets.d.ts +26 -29
- package/node_modules/checkride/dist/snippets.d.ts.map +1 -1
- package/node_modules/checkride/dist/snippets.js +26 -30
- package/node_modules/checkride/dist/snippets.js.map +1 -1
- package/node_modules/checkride/dist/tool-json.d.ts +33 -0
- package/node_modules/checkride/dist/tool-json.d.ts.map +1 -0
- package/node_modules/checkride/dist/tool-json.js +58 -0
- package/node_modules/checkride/dist/tool-json.js.map +1 -0
- package/node_modules/checkride/dist/triage/cli.d.ts +21 -0
- package/node_modules/checkride/dist/triage/cli.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/cli.js +26 -0
- package/node_modules/checkride/dist/triage/cli.js.map +1 -0
- package/node_modules/checkride/dist/triage/doctor-fold.d.ts +51 -0
- package/node_modules/checkride/dist/triage/doctor-fold.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/doctor-fold.js +88 -0
- package/node_modules/checkride/dist/triage/doctor-fold.js.map +1 -0
- package/node_modules/checkride/dist/triage/env.d.ts +54 -0
- package/node_modules/checkride/dist/triage/env.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/env.js +81 -0
- package/node_modules/checkride/dist/triage/env.js.map +1 -0
- package/node_modules/checkride/dist/triage/gate.d.ts +61 -0
- package/node_modules/checkride/dist/triage/gate.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/gate.js +121 -0
- package/node_modules/checkride/dist/triage/gate.js.map +1 -0
- package/node_modules/checkride/dist/triage/index.d.ts +22 -0
- package/node_modules/checkride/dist/triage/index.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/index.js +20 -0
- package/node_modules/checkride/dist/triage/index.js.map +1 -0
- package/node_modules/checkride/dist/triage/render.d.ts +19 -0
- package/node_modules/checkride/dist/triage/render.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/render.js +419 -0
- package/node_modules/checkride/dist/triage/render.js.map +1 -0
- package/node_modules/checkride/dist/triage/triage.d.ts +83 -0
- package/node_modules/checkride/dist/triage/triage.d.ts.map +1 -0
- package/node_modules/checkride/dist/triage/triage.js +131 -0
- package/node_modules/checkride/dist/triage/triage.js.map +1 -0
- package/node_modules/checkride/package.json +17 -15
- package/node_modules/checkride/schema/checkride.config.schema.json +62 -5
- package/node_modules/checkride/schema/checkride.summary.schema.json +1 -1
- package/node_modules/checkride/skills/check/SKILL.md +257 -0
- package/node_modules/checkride/skills/qa/SKILL.md +231 -0
- package/node_modules/checkride/templates/shared/cspell.json +1 -0
- package/node_modules/checkride/templates/shared/oxlintrc.json +1 -1
- package/package.json +2 -2
- package/skills/build/SKILL.md +23 -19
- package/skills/finish/SKILL.md +3 -1
- package/skills/harvest/SKILL.md +2 -1
- package/skills/plan/SKILL.md +8 -7
- package/skills/recover/SKILL.md +28 -0
- package/skills/refine/SKILL.md +5 -4
- package/skills/spike/SKILL.md +1 -1
- package/skills/step/SKILL.md +4 -4
- package/skills/verify/SKILL.md +19 -14
- package/templates/intent.md +8 -7
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import type { Fingerprint } from './fingerprint.js';
|
|
24
24
|
/**
|
|
25
|
-
* Fallow's fingerprint extractor
|
|
25
|
+
* Fallow's fingerprint extractor, for the extractor registry.
|
|
26
26
|
* Returns the finding keys for a recognized, readable report and an empty set
|
|
27
27
|
* for anything else — the "never throw, empty on malformed" contract every
|
|
28
28
|
* extractor honours. The *gating* verdict (`fallowVerdict`) is where an
|
|
@@ -55,10 +55,14 @@ export type FallowVerdict = {
|
|
|
55
55
|
* fallow found anything. With a baseline, findings are masked — the slot passes
|
|
56
56
|
* when every current finding is grandfathered and fails on any new one.
|
|
57
57
|
*
|
|
58
|
-
* A report
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
58
|
+
* A report whose keys don't map one-per-finding onto its issue count — an
|
|
59
|
+
* un-keyable finding, or a key produced for something the count doesn't include
|
|
60
|
+
* — has findings that can't be individually grandfathered; a baseline must never
|
|
61
|
+
* mask such a slot to green, so it stays at the raw findings-based verdict. A key
|
|
62
|
+
* *collision* (two findings sharing a key) is not un-keyable — both are keyed, so
|
|
63
|
+
* the baseline coarsens (grandfathering one grandfathers both) but stays active.
|
|
64
|
+
* Correctness over precision: better to keep re-surfacing a finding than to
|
|
65
|
+
* silently pass one.
|
|
62
66
|
*/
|
|
63
67
|
export declare function fallowVerdict(raw: string, baselineKeys: readonly string[] | null): FallowVerdict;
|
|
64
68
|
//# sourceMappingURL=fallow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallow.d.ts","sourceRoot":"","sources":["../../src/baseline/fallow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"fallow.d.ts","sourceRoot":"","sources":["../../src/baseline/fallow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAgTpD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAGvD;AAED,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,EAAE,EAAE,OAAO,CAAC;IACZ,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gEAAgE;IAChE,QAAQ,EAAE,WAAW,CAAC;IACtB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,aAAa,CA0BhG"}
|
|
@@ -20,12 +20,14 @@
|
|
|
20
20
|
* schema 4 with a different layout and is no longer supported). Each analysis
|
|
21
21
|
* kind has its own layout, so parsing dispatches on the top-level `kind`.
|
|
22
22
|
*/
|
|
23
|
+
import { parseToolJson } from '../tool-json.js';
|
|
23
24
|
import { applyBaseline } from './store.js';
|
|
24
25
|
/**
|
|
25
|
-
* Minimum fallow JSON schema version checkride understands. fallow
|
|
26
|
-
* 3.
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* Minimum fallow JSON schema version checkride understands. Every fallow from
|
|
27
|
+
* 3.5.0 through 3.9.1 emits schema_version 7 (verified: dead-code, dupes, and
|
|
28
|
+
* health all report 7, with identical top-level layouts); 2.x emitted 4 with an
|
|
29
|
+
* incompatible layout. A report below this floor — or one whose kind/shape we
|
|
30
|
+
* can't read — is a hard failure, never a silent pass.
|
|
29
31
|
*/
|
|
30
32
|
const FALLOW_SCHEMA_MIN = 7;
|
|
31
33
|
/** Narrow to a plain object (arrays and null excluded). */
|
|
@@ -37,32 +39,74 @@ function str(value) {
|
|
|
37
39
|
return typeof value === 'string' ? value.trim() : '';
|
|
38
40
|
}
|
|
39
41
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
42
|
+
* Fields naming the declaration that owns a member-scoped finding, in priority
|
|
43
|
+
* order. fallow reports an unused class/enum/store member as `parent_name` +
|
|
44
|
+
* `member_name`, a component binding as `component_name` + `prop_name` /
|
|
45
|
+
* `input_name` / `output_name` / `emit_name` / `event_name`, and a catalog entry
|
|
46
|
+
* as `catalog_name` + `entry_name`. Both halves are needed: the leaf alone is
|
|
47
|
+
* ambiguous (two classes in one file can each have a `render`), and the
|
|
48
|
+
* container alone collapses every member of one declaration onto one key.
|
|
46
49
|
*/
|
|
47
|
-
|
|
50
|
+
const CONTAINER_FIELDS = ['parent_name', 'component_name', 'catalog_name'];
|
|
51
|
+
/** Finding fields that carry a stable leaf symbol, in priority order. */
|
|
48
52
|
const SYMBOL_FIELDS = [
|
|
49
53
|
'export_name',
|
|
50
54
|
'name',
|
|
51
55
|
'type_name',
|
|
52
56
|
'member',
|
|
57
|
+
'member_name',
|
|
58
|
+
'prop_name',
|
|
59
|
+
'emit_name',
|
|
60
|
+
'input_name',
|
|
61
|
+
'output_name',
|
|
62
|
+
'event_name',
|
|
63
|
+
'entry_name',
|
|
64
|
+
'action_name',
|
|
65
|
+
'key_name',
|
|
53
66
|
'package_name',
|
|
54
67
|
'dependency',
|
|
55
68
|
'specifier',
|
|
56
69
|
];
|
|
57
|
-
/** The first non-empty
|
|
58
|
-
function
|
|
59
|
-
for (const field of
|
|
70
|
+
/** The first non-empty field of `fields` on a finding, or `''` when none is set. */
|
|
71
|
+
function firstField(item, fields) {
|
|
72
|
+
for (const field of fields) {
|
|
60
73
|
const value = str(item[field]);
|
|
61
74
|
if (value)
|
|
62
75
|
return value;
|
|
63
76
|
}
|
|
64
77
|
return '';
|
|
65
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* A finding's stable symbol identity: `<container>.<leaf>` when it carries both
|
|
81
|
+
* (`Svc.unusedOne`), otherwise whichever half it has, otherwise `''`. Composing
|
|
82
|
+
* the two is what keeps a member-scoped finding line-free — with neither half
|
|
83
|
+
* recognized such a finding has no symbol at all and falls back to
|
|
84
|
+
* `<path>:<line>:<col>`, a key that moves whenever code above it does, so a
|
|
85
|
+
* grandfathered finding resurfaces as new on the next unrelated edit.
|
|
86
|
+
*/
|
|
87
|
+
function symbolIdentity(item) {
|
|
88
|
+
return [firstField(item, CONTAINER_FIELDS), firstField(item, SYMBOL_FIELDS)].filter(Boolean).join('.');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* A finding's `line[:col]` position, or `''` when it carries neither. Only used
|
|
92
|
+
* to disambiguate findings that share every stable identity field (see
|
|
93
|
+
* {@link withPosition}); a keyable finding never falls back to this.
|
|
94
|
+
*/
|
|
95
|
+
function position(item) {
|
|
96
|
+
return [item['line'], item['col']].filter((n) => typeof n === 'number').join(':');
|
|
97
|
+
}
|
|
98
|
+
/** Append `:<line>[:<col>]` to a key when the finding has a position, else leave it. */
|
|
99
|
+
function withPosition(key, item) {
|
|
100
|
+
const pos = position(item);
|
|
101
|
+
return pos ? `${key}:${pos}` : key;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* A function name that is a real, stable identifier (kept line-free so its key
|
|
105
|
+
* survives edits above it). Fallow wraps names it can't resolve to an identity
|
|
106
|
+
* in angle brackets (`<arrow>`, `<anonymous>`); those fail this test and get a
|
|
107
|
+
* position appended, since every such placeholder in a file is otherwise equal.
|
|
108
|
+
*/
|
|
109
|
+
const STABLE_IDENTIFIER = /^[A-Za-z_$][\w$.]*$/;
|
|
66
110
|
/**
|
|
67
111
|
* Key a cross-file finding (circular_dependencies, re_export_cycles) on its
|
|
68
112
|
* sorted file membership — a list of files/segments rather than one location.
|
|
@@ -82,17 +126,67 @@ function cycleKey(category, item) {
|
|
|
82
126
|
}
|
|
83
127
|
return null;
|
|
84
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Fingerprint key for one dead-code finding: `dead-code:<category>:<identity>`,
|
|
131
|
+
* where identity is a file and symbol (never a line or column, so the key
|
|
132
|
+
* survives edits that only move the code). When a finding has a file but no
|
|
133
|
+
* symbol — `stale_suppressions`, `policy_violations` and the boundary
|
|
134
|
+
* categories carry only a path — the path alone would collide with its siblings
|
|
135
|
+
* in the same file, so the position is appended to keep them distinct, at the
|
|
136
|
+
* cost of a key that moves. Cross-file findings (cycles) key on the
|
|
137
|
+
* sorted set of files. Returns `null` when no stable identity can be read — the
|
|
138
|
+
* finding still counts toward `issueCount`, it just can't be individually
|
|
139
|
+
* grandfathered (which keeps the slot conservatively red, never silently green).
|
|
140
|
+
*/
|
|
85
141
|
function deadKey(category, item) {
|
|
86
142
|
if (!isPlainObject(item))
|
|
87
143
|
return null;
|
|
88
144
|
const file = str(item['path']) || str(item['file']);
|
|
89
145
|
const symbol = symbolIdentity(item);
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
146
|
+
if (symbol)
|
|
147
|
+
return `dead-code:${category}:${[file, symbol].filter(Boolean).join(':')}`;
|
|
148
|
+
if (file)
|
|
149
|
+
return withPosition(`dead-code:${category}:${file}`, item);
|
|
94
150
|
return cycleKey(category, item);
|
|
95
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Top-level arrays that are NOT counted in `total_issues`, so keying them would
|
|
154
|
+
* push the key count past the issue count and leave the two out of step: the
|
|
155
|
+
* advisory `next_steps`, the project-level `workspace_diagnostics`, and the
|
|
156
|
+
* three opt-in "health signal" rules that fallow's own `issue-registry.json`
|
|
157
|
+
* marks `counts_in_total: false`. They have to be skipped by name rather than
|
|
158
|
+
* left to {@link deadKey} — `workspace_diagnostics` carries a `path`, and
|
|
159
|
+
* `thin_wrappers` and `duplicate_prop_shapes` a `file`, so all three key
|
|
160
|
+
* readily. Verified against fallow 3.9.1's registry; every other array counts.
|
|
161
|
+
*/
|
|
162
|
+
const UNCOUNTED_ARRAYS = new Set([
|
|
163
|
+
'next_steps',
|
|
164
|
+
'workspace_diagnostics',
|
|
165
|
+
'prop_drilling_chains',
|
|
166
|
+
'thin_wrappers',
|
|
167
|
+
'duplicate_prop_shapes',
|
|
168
|
+
]);
|
|
169
|
+
/**
|
|
170
|
+
* Key every counted finding in a dead-code report. Returns the keys — duplicates
|
|
171
|
+
* intact, so a collision stays visible to the caller's tracking check — and how
|
|
172
|
+
* many items carried no stable identity to key on.
|
|
173
|
+
*/
|
|
174
|
+
function collectDeadKeys(j) {
|
|
175
|
+
const keys = [];
|
|
176
|
+
let unkeyed = 0;
|
|
177
|
+
for (const [category, value] of Object.entries(j)) {
|
|
178
|
+
if (!Array.isArray(value) || UNCOUNTED_ARRAYS.has(category))
|
|
179
|
+
continue;
|
|
180
|
+
for (const item of value) {
|
|
181
|
+
const key = deadKey(category, item);
|
|
182
|
+
if (key === null)
|
|
183
|
+
unkeyed += 1;
|
|
184
|
+
else
|
|
185
|
+
keys.push(key);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return { keys, unkeyed };
|
|
189
|
+
}
|
|
96
190
|
/**
|
|
97
191
|
* Extract dead-code findings and the authoritative issue count (`total_issues`).
|
|
98
192
|
* Findings come from the top-level detail arrays (`unused_exports`,
|
|
@@ -100,10 +194,10 @@ function deadKey(category, item) {
|
|
|
100
194
|
* keys: the summary aggregates a few categories under one name (e.g. dev and
|
|
101
195
|
* optional deps both count as `unused_dependencies`) whose items live in
|
|
102
196
|
* separately-named arrays, so keying off the summary would miss them. Iterating
|
|
103
|
-
* every array
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
197
|
+
* every array except the {@link UNCOUNTED_ARRAYS} covers whatever categories
|
|
198
|
+
* fallow reports — including ones added in a future minor — without a
|
|
199
|
+
* hand-maintained list of the ones that do count. A category whose items carry
|
|
200
|
+
* no stable identity simply isn't fingerprinted; it still counts toward
|
|
107
201
|
* `total_issues`, so the slot stays red (never masked) until it's fixed.
|
|
108
202
|
*/
|
|
109
203
|
function parseDeadCode(j) {
|
|
@@ -112,17 +206,17 @@ function parseDeadCode(j) {
|
|
|
112
206
|
if (typeof total !== 'number') {
|
|
113
207
|
return { ok: false, reason: 'fallow dead-code JSON missing summary.total_issues' };
|
|
114
208
|
}
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return { ok: true, kind: 'dead-code', findings, issueCount: total };
|
|
209
|
+
const { keys, unkeyed } = collectDeadKeys(j);
|
|
210
|
+
// Two independent ways the keys can fail to cover the findings, both required
|
|
211
|
+
// because either alone has a blind spot. Counting the items we could not key
|
|
212
|
+
// is direct and exact. Comparing against the authoritative `total` catches
|
|
213
|
+
// findings the iteration never reached at all (nothing to count) — and cannot
|
|
214
|
+
// be substituted for the direct count, because a key produced for something
|
|
215
|
+
// `total` omits would otherwise offset a real un-keyable finding back to zero.
|
|
216
|
+
// `keys.length` is taken BEFORE the Set collapses collisions, so a collision
|
|
217
|
+
// still reads as fully tracked.
|
|
218
|
+
const fullyTracked = unkeyed === 0 && keys.length === total;
|
|
219
|
+
return { ok: true, kind: 'dead-code', findings: keys, issueCount: total, fullyTracked };
|
|
126
220
|
}
|
|
127
221
|
/**
|
|
128
222
|
* Extract duplication findings. Each clone group carries a content-hash
|
|
@@ -142,12 +236,14 @@ function parseDupes(j) {
|
|
|
142
236
|
if (fp)
|
|
143
237
|
findings.push(`dupes:${fp}`);
|
|
144
238
|
}
|
|
145
|
-
return { ok: true, kind: 'dupes', findings, issueCount: groups.length };
|
|
239
|
+
return { ok: true, kind: 'dupes', findings, issueCount: groups.length, fullyTracked: findings.length === groups.length };
|
|
146
240
|
}
|
|
147
241
|
/**
|
|
148
242
|
* Extract health (complexity) findings — one per function over threshold, keyed
|
|
149
|
-
* on file + function name
|
|
150
|
-
*
|
|
243
|
+
* on file + function name. A named function stays line-free so its key survives
|
|
244
|
+
* edits above it; an anonymous placeholder (`<arrow>`, `<anonymous>`) shares its
|
|
245
|
+
* name with every sibling in the file, so it gets a position appended to stay
|
|
246
|
+
* distinct. The issue count is the number of findings.
|
|
151
247
|
*/
|
|
152
248
|
function parseHealth(j) {
|
|
153
249
|
const findings = j['findings'];
|
|
@@ -158,16 +254,12 @@ function parseHealth(j) {
|
|
|
158
254
|
for (const f of findings) {
|
|
159
255
|
if (!isPlainObject(f))
|
|
160
256
|
continue;
|
|
161
|
-
|
|
257
|
+
const name = str(f['name']);
|
|
258
|
+
const base = `health:${str(f['path'])}:${name}`;
|
|
259
|
+
keys.push(STABLE_IDENTIFIER.test(name) ? base : withPosition(base, f));
|
|
162
260
|
}
|
|
163
|
-
return { ok: true, kind: 'health', findings: keys, issueCount: findings.length };
|
|
261
|
+
return { ok: true, kind: 'health', findings: keys, issueCount: findings.length, fullyTracked: keys.length === findings.length };
|
|
164
262
|
}
|
|
165
|
-
/**
|
|
166
|
-
* Parse a fallow report into findings + an issue count, or the reason it could
|
|
167
|
-
* not be trusted. Every failure path (bad JSON, missing/old schema, unknown
|
|
168
|
-
* kind, missing count field) is a *loud* failure the caller turns into a red
|
|
169
|
-
* slot — checkride never treats an unreadable fallow report as "clean".
|
|
170
|
-
*/
|
|
171
263
|
/**
|
|
172
264
|
* The reason a report's schema can't be trusted, or `null` when it is a
|
|
173
265
|
* supported version. Split out so {@link parseFallow} stays a thin dispatcher.
|
|
@@ -181,16 +273,20 @@ function fallowSchemaError(j) {
|
|
|
181
273
|
}
|
|
182
274
|
return null;
|
|
183
275
|
}
|
|
276
|
+
/**
|
|
277
|
+
* Parse a fallow report into findings + an issue count, or the reason it could
|
|
278
|
+
* not be trusted. Every failure path (bad JSON, missing/old schema, unknown
|
|
279
|
+
* kind, missing count field) is a *loud* failure the caller turns into a red
|
|
280
|
+
* slot — checkride never treats an unreadable fallow report as "clean".
|
|
281
|
+
*/
|
|
184
282
|
function parseFallow(raw) {
|
|
185
283
|
if (raw.trim() === '')
|
|
186
284
|
return { ok: false, reason: 'fallow produced no JSON output' };
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
285
|
+
// Tolerant of a launcher preamble ahead of the report — see `parseToolJson`.
|
|
286
|
+
const parsed = parseToolJson(raw);
|
|
287
|
+
if (!parsed)
|
|
192
288
|
return { ok: false, reason: 'fallow did not emit valid JSON' };
|
|
193
|
-
|
|
289
|
+
const j = parsed.value;
|
|
194
290
|
if (!isPlainObject(j))
|
|
195
291
|
return { ok: false, reason: 'fallow output was not a JSON object' };
|
|
196
292
|
const schemaError = fallowSchemaError(j);
|
|
@@ -209,7 +305,7 @@ function parseFallow(raw) {
|
|
|
209
305
|
}
|
|
210
306
|
}
|
|
211
307
|
/**
|
|
212
|
-
* Fallow's fingerprint extractor
|
|
308
|
+
* Fallow's fingerprint extractor, for the extractor registry.
|
|
213
309
|
* Returns the finding keys for a recognized, readable report and an empty set
|
|
214
310
|
* for anything else — the "never throw, empty on malformed" contract every
|
|
215
311
|
* extractor honours. The *gating* verdict (`fallowVerdict`) is where an
|
|
@@ -226,10 +322,14 @@ export function fallowFindings(raw) {
|
|
|
226
322
|
* fallow found anything. With a baseline, findings are masked — the slot passes
|
|
227
323
|
* when every current finding is grandfathered and fails on any new one.
|
|
228
324
|
*
|
|
229
|
-
* A report
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
325
|
+
* A report whose keys don't map one-per-finding onto its issue count — an
|
|
326
|
+
* un-keyable finding, or a key produced for something the count doesn't include
|
|
327
|
+
* — has findings that can't be individually grandfathered; a baseline must never
|
|
328
|
+
* mask such a slot to green, so it stays at the raw findings-based verdict. A key
|
|
329
|
+
* *collision* (two findings sharing a key) is not un-keyable — both are keyed, so
|
|
330
|
+
* the baseline coarsens (grandfathering one grandfathers both) but stays active.
|
|
331
|
+
* Correctness over precision: better to keep re-surfacing a finding than to
|
|
332
|
+
* silently pass one.
|
|
233
333
|
*/
|
|
234
334
|
export function fallowVerdict(raw, baselineKeys) {
|
|
235
335
|
const parsed = parseFallow(raw);
|
|
@@ -243,9 +343,12 @@ export function fallowVerdict(raw, baselineKeys) {
|
|
|
243
343
|
return { ok: rawOk, baselined: 0, newKeys: [], findings, observed: true, reason: issueReason };
|
|
244
344
|
}
|
|
245
345
|
const adj = applyBaseline(findings, baselineKeys, rawOk);
|
|
246
|
-
|
|
247
|
-
//
|
|
248
|
-
|
|
346
|
+
// Findings the keys don't cover block masking: hold the slot at its raw
|
|
347
|
+
// verdict. A key collision does NOT (both findings are keyed, so the report
|
|
348
|
+
// stays fully tracked), so it coarsens the baseline instead of disabling it. A
|
|
349
|
+
// *deduplicated* size comparison could not tell the two apart, which is what
|
|
350
|
+
// disabled the whole slot on any collision.
|
|
351
|
+
if (!parsed.fullyTracked) {
|
|
249
352
|
return { ok: rawOk, baselined: adj.baselined, newKeys: adj.newKeys, findings, observed: true, reason: issueReason };
|
|
250
353
|
}
|
|
251
354
|
// Fully tracked: a masked slot (all findings grandfathered) is green; a slot
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallow.js","sourceRoot":"","sources":["../../src/baseline/fallow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;
|
|
1
|
+
{"version":3,"file":"fallow.js","sourceRoot":"","sources":["../../src/baseline/fallow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-adapter diagnostic fingerprints
|
|
2
|
+
* Per-adapter diagnostic fingerprints.
|
|
3
3
|
*
|
|
4
4
|
* A *fingerprint* is a stable, order-independent set of key strings extracted
|
|
5
5
|
* from one adapter's raw output. Each key names a single finding by what it is
|
|
6
6
|
* (`<file>:<rule>:<message>`) rather than where it sits, so a finding keeps its
|
|
7
|
-
* key when unrelated edits shift its line and column — that is what
|
|
8
|
-
* the baseline
|
|
7
|
+
* key when unrelated edits shift its line and column — that is what lets
|
|
8
|
+
* the baseline subtract already-known findings without re-flagging
|
|
9
9
|
* them every time surrounding code moves.
|
|
10
10
|
*
|
|
11
|
-
* This is deliberately NOT a normalized diagnostic schema
|
|
11
|
+
* This is deliberately NOT a normalized diagnostic schema: each adapter
|
|
12
12
|
* owns its own key string, the raw `.check/<slot>.json` stays authoritative, and
|
|
13
13
|
* an adapter whose output isn't a stable diagnostic set simply has no extractor
|
|
14
14
|
* and returns `null` — baseline is unsupported for that slot, decided
|
|
15
|
-
* per-adapter against real fixtures
|
|
15
|
+
* per-adapter against real fixtures, not from an up-front list. Extractors
|
|
16
16
|
* ship for the blessed lint/struct/spell adapters (oxlint, ast-grep, cspell) and
|
|
17
17
|
* for fallow's three analyses (dead-code, dupes, health — see `./fallow.ts`,
|
|
18
18
|
* which also owns fallow's gating verdict).
|
|
@@ -25,8 +25,8 @@ export type Fingerprint = ReadonlySet<string>;
|
|
|
25
25
|
* alternate tool that shares a slot with a supported default (biome/eslint for
|
|
26
26
|
* `lint`, knip for `dead`) opts out until it grows its own extractor. A
|
|
27
27
|
* supported adapter with zero findings returns an empty set, never `null` —
|
|
28
|
-
* "supported but clean" and "unsupported" are distinct, and
|
|
29
|
-
* the difference.
|
|
28
|
+
* "supported but clean" and "unsupported" are distinct, and masking and the
|
|
29
|
+
* ratchet depend on the difference.
|
|
30
30
|
*/
|
|
31
31
|
export declare function fingerprint(adapter: string, raw: string): Fingerprint | null;
|
|
32
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAqF9C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAG5E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D"}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Per-adapter diagnostic fingerprints
|
|
2
|
+
* Per-adapter diagnostic fingerprints.
|
|
3
3
|
*
|
|
4
4
|
* A *fingerprint* is a stable, order-independent set of key strings extracted
|
|
5
5
|
* from one adapter's raw output. Each key names a single finding by what it is
|
|
6
6
|
* (`<file>:<rule>:<message>`) rather than where it sits, so a finding keeps its
|
|
7
|
-
* key when unrelated edits shift its line and column — that is what
|
|
8
|
-
* the baseline
|
|
7
|
+
* key when unrelated edits shift its line and column — that is what lets
|
|
8
|
+
* the baseline subtract already-known findings without re-flagging
|
|
9
9
|
* them every time surrounding code moves.
|
|
10
10
|
*
|
|
11
|
-
* This is deliberately NOT a normalized diagnostic schema
|
|
11
|
+
* This is deliberately NOT a normalized diagnostic schema: each adapter
|
|
12
12
|
* owns its own key string, the raw `.check/<slot>.json` stays authoritative, and
|
|
13
13
|
* an adapter whose output isn't a stable diagnostic set simply has no extractor
|
|
14
14
|
* and returns `null` — baseline is unsupported for that slot, decided
|
|
15
|
-
* per-adapter against real fixtures
|
|
15
|
+
* per-adapter against real fixtures, not from an up-front list. Extractors
|
|
16
16
|
* ship for the blessed lint/struct/spell adapters (oxlint, ast-grep, cspell) and
|
|
17
17
|
* for fallow's three analyses (dead-code, dupes, health — see `./fallow.ts`,
|
|
18
18
|
* which also owns fallow's gating verdict).
|
|
19
19
|
*/
|
|
20
|
+
import { isRecord } from '../json.js';
|
|
21
|
+
import { parseToolJson } from '../tool-json.js';
|
|
20
22
|
import { fallowFindings } from './fallow.js';
|
|
21
23
|
/**
|
|
22
24
|
* Build a finding's key from its identity. Line and column are intentionally
|
|
@@ -27,19 +29,14 @@ import { fallowFindings } from './fallow.js';
|
|
|
27
29
|
function key(file, rule, message) {
|
|
28
30
|
return `${file}:${rule}:${message.replace(/\s+/g, ' ').trim()}`;
|
|
29
31
|
}
|
|
30
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Parse JSON output defensively; malformed input yields `null`, never a throw.
|
|
34
|
+
* Tolerant of a launcher preamble ahead of the JSON — see `parseToolJson` —
|
|
35
|
+
* because an extractor that silently finds no findings would quietly stop
|
|
36
|
+
* masking the baseline rather than fail loudly.
|
|
37
|
+
*/
|
|
31
38
|
function parseJson(raw) {
|
|
32
|
-
|
|
33
|
-
const parsed = JSON.parse(raw);
|
|
34
|
-
return parsed;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/** Narrow to a plain object so string fields can be read without assertions. */
|
|
41
|
-
function isRecord(value) {
|
|
42
|
-
return typeof value === 'object' && value !== null;
|
|
39
|
+
return parseToolJson(raw)?.value ?? null;
|
|
43
40
|
}
|
|
44
41
|
/** Read a field as a string, or `''` when it is missing or not a string. */
|
|
45
42
|
function str(value) {
|
|
@@ -105,8 +102,8 @@ const EXTRACTORS = {
|
|
|
105
102
|
* alternate tool that shares a slot with a supported default (biome/eslint for
|
|
106
103
|
* `lint`, knip for `dead`) opts out until it grows its own extractor. A
|
|
107
104
|
* supported adapter with zero findings returns an empty set, never `null` —
|
|
108
|
-
* "supported but clean" and "unsupported" are distinct, and
|
|
109
|
-
* the difference.
|
|
105
|
+
* "supported but clean" and "unsupported" are distinct, and masking and the
|
|
106
|
+
* ratchet depend on the difference.
|
|
110
107
|
*/
|
|
111
108
|
export function fingerprint(adapter, raw) {
|
|
112
109
|
const extractor = EXTRACTORS[adapter];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C;;;;;GAKG;AACH,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;IACtD,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAClE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ7C;;;;;GAKG;AACH,SAAS,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;IACtD,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,4EAA4E;AAC5E,SAAS,GAAG,CAAC,KAAc;IACzB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,2EAA2E;AAC3E,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,MAAM,aAAa,GAAc,CAAC,GAAG,EAAE,EAAE;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,cAAc,GAAc,CAAC,GAAG,EAAE,EAAE;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,SAAS;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAClC,IAAI,IAAI,IAAI,OAAO;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,uEAAuE;AACvE,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAE7C,kFAAkF;AAClF,MAAM,aAAa,GAAc,CAAC,GAAG,EAAE,EAAE;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,UAAU,GAAwC;IACtD,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,cAAc;IAC1B,MAAM,EAAE,aAAa;IACrB,6EAA6E;IAC7E,+EAA+E;IAC/E,iCAAiC;IACjC,MAAM,EAAE,cAAc;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,GAAW;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAC3C,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Baseline module — per-adapter diagnostic fingerprints
|
|
3
|
-
*
|
|
4
|
-
* the module's only public surface
|
|
2
|
+
* Baseline module — per-adapter diagnostic fingerprints and the baseline
|
|
3
|
+
* read/write/ratchet built on top of them. This barrel is
|
|
4
|
+
* the module's only public surface: siblings import from `../baseline`,
|
|
5
5
|
* never from `./fingerprint.js` directly.
|
|
6
6
|
*/
|
|
7
7
|
export type { Fingerprint } from './fingerprint.js';
|
|
8
8
|
export { fingerprint, isFingerprintable } from './fingerprint.js';
|
|
9
9
|
export { fallowVerdict } from './fallow.js';
|
|
10
10
|
export type { Baseline } from './store.js';
|
|
11
|
-
export { applyBaseline, BASELINE_FILE, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
|
|
11
|
+
export { applyBaseline, BASELINE_FILE, BASELINE_SCHEMA_VERSION, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/baseline/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/baseline/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Baseline module — per-adapter diagnostic fingerprints
|
|
3
|
-
*
|
|
4
|
-
* the module's only public surface
|
|
2
|
+
* Baseline module — per-adapter diagnostic fingerprints and the baseline
|
|
3
|
+
* read/write/ratchet built on top of them. This barrel is
|
|
4
|
+
* the module's only public surface: siblings import from `../baseline`,
|
|
5
5
|
* never from `./fingerprint.js` directly.
|
|
6
6
|
*/
|
|
7
7
|
export { fingerprint, isFingerprintable } from './fingerprint.js';
|
|
8
8
|
export { fallowVerdict } from './fallow.js';
|
|
9
|
-
export { applyBaseline, BASELINE_FILE, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
|
|
9
|
+
export { applyBaseline, BASELINE_FILE, BASELINE_SCHEMA_VERSION, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/baseline/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/baseline/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The baseline artifact: its on-disk shape and the pure read / write / apply /
|
|
3
|
-
* ratchet operations a baseline-aware run
|
|
3
|
+
* ratchet operations a baseline-aware run is built from.
|
|
4
4
|
*
|
|
5
5
|
* This file imports nothing from the orchestrator on purpose: the `baseline`
|
|
6
|
-
* command (command.ts) bridges to the run pipeline, but a *run* only needs to
|
|
6
|
+
* command (`../baseline-command.ts`) bridges to the run pipeline, but a *run* only needs to
|
|
7
7
|
* mask and ratchet an already-captured baseline, so the orchestrator can depend
|
|
8
8
|
* on these helpers without a load-order cycle. Keeping the file I/O and the
|
|
9
9
|
* set algebra here (not in the orchestrator) also preserves the orchestrator's
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
import type { Fingerprint } from './fingerprint.js';
|
|
13
13
|
/** The committed baseline artifact, at repo root beside `checkride.config.json`. */
|
|
14
14
|
export declare const BASELINE_FILE = "checkride.baseline.json";
|
|
15
|
-
/** Schema version of the baseline file; independent of the summary schema
|
|
15
|
+
/** Schema version of the baseline file; independent of the summary schema. */
|
|
16
16
|
export declare const BASELINE_SCHEMA_VERSION = 1;
|
|
17
17
|
/** Shape of `checkride.baseline.json`: per-slot sets of grandfathered keys. */
|
|
18
18
|
export type Baseline = {
|
|
@@ -33,6 +33,14 @@ export type BaselineAdjustment = {
|
|
|
33
33
|
* baseline is a committed file a run reads on every invocation, so a malformed
|
|
34
34
|
* one is coerced into a clean shape (or dropped) rather than thrown — a corrupt
|
|
35
35
|
* baseline must never break `checkride`.
|
|
36
|
+
*
|
|
37
|
+
* A file from a *newer* schema is dropped rather than read optimistically. The
|
|
38
|
+
* fields it does not have yet are the ones that would say which findings are
|
|
39
|
+
* masked and why, so guessing means either masking findings it never
|
|
40
|
+
* grandfathered or claiming ones it did. Dropping it fails closed: the run
|
|
41
|
+
* reports the diagnostics that are actually there — more red than the author
|
|
42
|
+
* intended, never a green that was not earned. Same direction as
|
|
43
|
+
* {@link applyBaseline}'s refusal to mask an unparseable run.
|
|
36
44
|
*/
|
|
37
45
|
export declare function loadBaseline(cwd: string): Baseline | null;
|
|
38
46
|
/** Serialize and write the baseline to `cwd` (pretty-printed, trailing newline, atomic). */
|
|
@@ -57,7 +65,7 @@ export declare function applyBaseline(current: Fingerprint, baselinedKeys: reado
|
|
|
57
65
|
* are the run's failures, not new debt, so only a `checkride baseline` capture
|
|
58
66
|
* ever adds keys. Callers gate this on a full run (no `--only`/`--skip`/
|
|
59
67
|
* `--changed`, no early `--bail` break) so a partial run can't prune keys it
|
|
60
|
-
* simply didn't observe
|
|
68
|
+
* simply didn't observe.
|
|
61
69
|
*/
|
|
62
70
|
export declare function ratchet(baseline: Baseline, observed: ReadonlyMap<string, Fingerprint>): Baseline;
|
|
63
71
|
/** Total grandfathered diagnostics across every slot. */
|