plumbbob 0.8.14 → 0.8.18

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.
Files changed (85) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +6 -0
  3. package/dist/lib/agents.js +1 -1
  4. package/dist/lib/check.js +9 -6
  5. package/dist/verbs/finish.js +4 -2
  6. package/node_modules/checkride/CHANGELOG.md +234 -0
  7. package/node_modules/checkride/README.md +134 -31
  8. package/node_modules/checkride/dist/adapters.d.ts +50 -1
  9. package/node_modules/checkride/dist/adapters.d.ts.map +1 -1
  10. package/node_modules/checkride/dist/adapters.js +123 -7
  11. package/node_modules/checkride/dist/adapters.js.map +1 -1
  12. package/node_modules/checkride/dist/agent-setup/hook.d.ts.map +1 -1
  13. package/node_modules/checkride/dist/agent-setup/hook.js +15 -1
  14. package/node_modules/checkride/dist/agent-setup/hook.js.map +1 -1
  15. package/node_modules/checkride/dist/agent-setup/index.d.ts +0 -1
  16. package/node_modules/checkride/dist/agent-setup/index.d.ts.map +1 -1
  17. package/node_modules/checkride/dist/agent-setup/index.js.map +1 -1
  18. package/node_modules/checkride/dist/baseline/fallow.d.ts +64 -0
  19. package/node_modules/checkride/dist/baseline/fallow.d.ts.map +1 -0
  20. package/node_modules/checkride/dist/baseline/fallow.js +256 -0
  21. package/node_modules/checkride/dist/baseline/fallow.js.map +1 -0
  22. package/node_modules/checkride/dist/baseline/fingerprint.d.ts +4 -6
  23. package/node_modules/checkride/dist/baseline/fingerprint.d.ts.map +1 -1
  24. package/node_modules/checkride/dist/baseline/fingerprint.js +9 -4
  25. package/node_modules/checkride/dist/baseline/fingerprint.js.map +1 -1
  26. package/node_modules/checkride/dist/baseline/index.d.ts +4 -5
  27. package/node_modules/checkride/dist/baseline/index.d.ts.map +1 -1
  28. package/node_modules/checkride/dist/baseline/index.js +2 -2
  29. package/node_modules/checkride/dist/baseline/index.js.map +1 -1
  30. package/node_modules/checkride/dist/{baseline/command.d.ts → baseline-command.d.ts} +11 -9
  31. package/node_modules/checkride/dist/baseline-command.d.ts.map +1 -0
  32. package/node_modules/checkride/dist/{baseline/command.js → baseline-command.js} +9 -7
  33. package/node_modules/checkride/dist/baseline-command.js.map +1 -0
  34. package/node_modules/checkride/dist/cli.d.ts.map +1 -1
  35. package/node_modules/checkride/dist/cli.js +95 -8
  36. package/node_modules/checkride/dist/cli.js.map +1 -1
  37. package/node_modules/checkride/dist/config.d.ts +37 -12
  38. package/node_modules/checkride/dist/config.d.ts.map +1 -1
  39. package/node_modules/checkride/dist/config.js +268 -60
  40. package/node_modules/checkride/dist/config.js.map +1 -1
  41. package/node_modules/checkride/dist/digest/digest.d.ts +0 -6
  42. package/node_modules/checkride/dist/digest/digest.d.ts.map +1 -1
  43. package/node_modules/checkride/dist/digest/digest.js +3 -3
  44. package/node_modules/checkride/dist/digest/digest.js.map +1 -1
  45. package/node_modules/checkride/dist/digest/index.d.ts +1 -2
  46. package/node_modules/checkride/dist/digest/index.d.ts.map +1 -1
  47. package/node_modules/checkride/dist/digest/index.js +1 -1
  48. package/node_modules/checkride/dist/digest/index.js.map +1 -1
  49. package/node_modules/checkride/dist/doctor.d.ts +14 -1
  50. package/node_modules/checkride/dist/doctor.d.ts.map +1 -1
  51. package/node_modules/checkride/dist/doctor.js +124 -55
  52. package/node_modules/checkride/dist/doctor.js.map +1 -1
  53. package/node_modules/checkride/dist/init.d.ts +6 -0
  54. package/node_modules/checkride/dist/init.d.ts.map +1 -1
  55. package/node_modules/checkride/dist/init.js +347 -121
  56. package/node_modules/checkride/dist/init.js.map +1 -1
  57. package/node_modules/checkride/dist/links.d.ts.map +1 -1
  58. package/node_modules/checkride/dist/links.js +8 -9
  59. package/node_modules/checkride/dist/links.js.map +1 -1
  60. package/node_modules/checkride/dist/orchestrator.d.ts +56 -1
  61. package/node_modules/checkride/dist/orchestrator.d.ts.map +1 -1
  62. package/node_modules/checkride/dist/orchestrator.js +506 -138
  63. package/node_modules/checkride/dist/orchestrator.js.map +1 -1
  64. package/node_modules/checkride/dist/pack.d.ts +76 -0
  65. package/node_modules/checkride/dist/pack.d.ts.map +1 -0
  66. package/node_modules/checkride/dist/pack.js +217 -0
  67. package/node_modules/checkride/dist/pack.js.map +1 -0
  68. package/node_modules/checkride/dist/pm/translate.d.ts +18 -10
  69. package/node_modules/checkride/dist/pm/translate.d.ts.map +1 -1
  70. package/node_modules/checkride/dist/pm/translate.js +27 -13
  71. package/node_modules/checkride/dist/pm/translate.js.map +1 -1
  72. package/node_modules/checkride/dist/smoke.d.ts +86 -0
  73. package/node_modules/checkride/dist/smoke.d.ts.map +1 -0
  74. package/node_modules/checkride/dist/smoke.js +346 -0
  75. package/node_modules/checkride/dist/smoke.js.map +1 -0
  76. package/node_modules/checkride/dist/snippets.d.ts +215 -0
  77. package/node_modules/checkride/dist/snippets.d.ts.map +1 -0
  78. package/node_modules/checkride/dist/snippets.js +360 -0
  79. package/node_modules/checkride/dist/snippets.js.map +1 -0
  80. package/node_modules/checkride/package.json +4 -2
  81. package/node_modules/checkride/schema/checkride.config.schema.json +11 -6
  82. package/package.json +4 -3
  83. package/skills/pb-finish/SKILL.md +15 -2
  84. package/node_modules/checkride/dist/baseline/command.d.ts.map +0 -1
  85. package/node_modules/checkride/dist/baseline/command.js.map +0 -1
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Fallow (v7) report parsing, gating, and fingerprinting.
3
+ *
4
+ * Fallow fills three slots — `dead` (dead-code), `dupes` (duplication), and
5
+ * `health` (complexity) — and checkride owns the pass/fail *verdict* for all
6
+ * three by parsing fallow's JSON, rather than trusting its process exit code.
7
+ * That is deliberate: fallow 3.5.0's exit code does NOT reliably gate. Verified
8
+ * against fallow 3.5.0:
9
+ * - `fallow --format json --fail-on-issues` (combined) exits 0 with issues.
10
+ * - `fallow dupes --format json` exits 0 no matter how much duplication (its
11
+ * `--threshold` defaults to `0` = "no limit").
12
+ * - only `fallow dead-code`/`health` with `--fail-on-issues` exit 1 on findings.
13
+ * Keying pass/fail off the exit code (as the orchestrator does for every other
14
+ * adapter) therefore let a green ✔ hide real findings. checkride reads the
15
+ * authoritative issue count out of the JSON instead, so every fallow slot gates
16
+ * uniformly — and an *unrecognized* schema fails loudly rather than passing
17
+ * silently (the count can't be trusted, so the slot can't be green).
18
+ *
19
+ * The JSON is fallow's `schema_version: 7` shape (fallow >= 3.5; fallow 2.x was
20
+ * schema 4 with a different layout and is no longer supported). Each analysis
21
+ * kind has its own layout, so parsing dispatches on the top-level `kind`.
22
+ */
23
+ import { applyBaseline } from './store.js';
24
+ /**
25
+ * Minimum fallow JSON schema version checkride understands. fallow 3.5.0 and
26
+ * 3.6.0 both emit schema_version 7; 2.x emitted 4 with an incompatible layout.
27
+ * A report below this floor — or one whose kind/shape we can't read — is a
28
+ * hard failure, never a silent pass.
29
+ */
30
+ const FALLOW_SCHEMA_MIN = 7;
31
+ /** Narrow to a plain object (arrays and null excluded). */
32
+ function isPlainObject(value) {
33
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
34
+ }
35
+ /** Read a field as a trimmed string, or `''` when missing/not a string. */
36
+ function str(value) {
37
+ return typeof value === 'string' ? value.trim() : '';
38
+ }
39
+ /**
40
+ * Fingerprint key for one dead-code finding: `dead-code:<category>:<identity>`,
41
+ * where identity is a file and/or symbol (never a line or column, so the key
42
+ * survives edits that only move the code). Cross-file findings (cycles) key on
43
+ * the sorted set of files. Returns `null` when no stable identity can be read —
44
+ * the finding still counts toward `issueCount`, it just can't be individually
45
+ * grandfathered (which keeps the slot conservatively red, never silently green).
46
+ */
47
+ /** Finding fields that carry a single stable symbol identity, in priority order. */
48
+ const SYMBOL_FIELDS = [
49
+ 'export_name',
50
+ 'name',
51
+ 'type_name',
52
+ 'member',
53
+ 'package_name',
54
+ 'dependency',
55
+ 'specifier',
56
+ ];
57
+ /** The first non-empty symbol field on a finding, or `''` when none is present. */
58
+ function symbolIdentity(item) {
59
+ for (const field of SYMBOL_FIELDS) {
60
+ const value = str(item[field]);
61
+ if (value)
62
+ return value;
63
+ }
64
+ return '';
65
+ }
66
+ /**
67
+ * Key a cross-file finding (circular_dependencies, re_export_cycles) on its
68
+ * sorted file membership — a list of files/segments rather than one location.
69
+ * Returns `null` when the item carries no such list.
70
+ */
71
+ function cycleKey(category, item) {
72
+ for (const field of ['cycle', 'files', 'chain']) {
73
+ const arr = item[field];
74
+ if (!Array.isArray(arr))
75
+ continue;
76
+ const files = arr
77
+ .map((x) => (typeof x === 'string' ? x : isPlainObject(x) ? str(x['path']) || str(x['file']) : ''))
78
+ .filter(Boolean)
79
+ .toSorted();
80
+ if (files.length > 0)
81
+ return `dead-code:${category}:${files.join('->')}`;
82
+ }
83
+ return null;
84
+ }
85
+ function deadKey(category, item) {
86
+ if (!isPlainObject(item))
87
+ return null;
88
+ const file = str(item['path']) || str(item['file']);
89
+ const symbol = symbolIdentity(item);
90
+ if (file || symbol) {
91
+ const identity = [file, symbol].filter(Boolean).join(':');
92
+ return `dead-code:${category}:${identity}`;
93
+ }
94
+ return cycleKey(category, item);
95
+ }
96
+ /**
97
+ * Extract dead-code findings and the authoritative issue count (`total_issues`).
98
+ * Findings come from the top-level detail arrays (`unused_exports`,
99
+ * `unused_dev_dependencies`, `circular_dependencies`, …) rather than the summary
100
+ * keys: the summary aggregates a few categories under one name (e.g. dev and
101
+ * optional deps both count as `unused_dependencies`) whose items live in
102
+ * separately-named arrays, so keying off the summary would miss them. Iterating
103
+ * every array and letting {@link deadKey} return `null` for non-finding arrays
104
+ * (`next_steps`) covers whatever categories fallow reports — including ones added
105
+ * in a future minor — without a hand-maintained list. A category whose items
106
+ * carry no stable identity simply isn't fingerprinted; it still counts toward
107
+ * `total_issues`, so the slot stays red (never masked) until it's fixed.
108
+ */
109
+ function parseDeadCode(j) {
110
+ const summary = isPlainObject(j['summary']) ? j['summary'] : {};
111
+ const total = summary['total_issues'] ?? j['total_issues'];
112
+ if (typeof total !== 'number') {
113
+ return { ok: false, reason: 'fallow dead-code JSON missing summary.total_issues' };
114
+ }
115
+ const findings = [];
116
+ for (const [category, value] of Object.entries(j)) {
117
+ if (!Array.isArray(value))
118
+ continue;
119
+ for (const item of value) {
120
+ const key = deadKey(category, item);
121
+ if (key !== null)
122
+ findings.push(key);
123
+ }
124
+ }
125
+ return { ok: true, kind: 'dead-code', findings, issueCount: total };
126
+ }
127
+ /**
128
+ * Extract duplication findings. Each clone group carries a content-hash
129
+ * `fingerprint` (`dup:…`) that is stable across line moves — the ideal key. The
130
+ * issue count is the number of clone groups.
131
+ */
132
+ function parseDupes(j) {
133
+ const groups = j['clone_groups'];
134
+ if (!Array.isArray(groups)) {
135
+ return { ok: false, reason: 'fallow dupes JSON missing clone_groups' };
136
+ }
137
+ const findings = [];
138
+ for (const g of groups) {
139
+ if (!isPlainObject(g))
140
+ continue;
141
+ const fp = str(g['fingerprint']);
142
+ if (fp)
143
+ findings.push(`dupes:${fp}`);
144
+ }
145
+ return { ok: true, kind: 'dupes', findings, issueCount: groups.length };
146
+ }
147
+ /**
148
+ * Extract health (complexity) findings — one per function over threshold, keyed
149
+ * on file + function name (no line, so the key survives edits above it). The
150
+ * issue count is the number of findings.
151
+ */
152
+ function parseHealth(j) {
153
+ const findings = j['findings'];
154
+ if (!Array.isArray(findings)) {
155
+ return { ok: false, reason: 'fallow health JSON missing findings' };
156
+ }
157
+ const keys = [];
158
+ for (const f of findings) {
159
+ if (!isPlainObject(f))
160
+ continue;
161
+ keys.push(`health:${str(f['path'])}:${str(f['name'])}`);
162
+ }
163
+ return { ok: true, kind: 'health', findings: keys, issueCount: findings.length };
164
+ }
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
+ /**
172
+ * The reason a report's schema can't be trusted, or `null` when it is a
173
+ * supported version. Split out so {@link parseFallow} stays a thin dispatcher.
174
+ */
175
+ function fallowSchemaError(j) {
176
+ const schema = j['schema_version'];
177
+ if (typeof schema !== 'number')
178
+ return 'fallow JSON has no schema_version';
179
+ if (schema < FALLOW_SCHEMA_MIN) {
180
+ return `unsupported fallow schema_version ${schema}; checkride needs fallow >= 3.5 (schema_version ${FALLOW_SCHEMA_MIN}). Run \`pnpm up fallow\`.`;
181
+ }
182
+ return null;
183
+ }
184
+ function parseFallow(raw) {
185
+ if (raw.trim() === '')
186
+ return { ok: false, reason: 'fallow produced no JSON output' };
187
+ let j;
188
+ try {
189
+ j = JSON.parse(raw);
190
+ }
191
+ catch {
192
+ return { ok: false, reason: 'fallow did not emit valid JSON' };
193
+ }
194
+ if (!isPlainObject(j))
195
+ return { ok: false, reason: 'fallow output was not a JSON object' };
196
+ const schemaError = fallowSchemaError(j);
197
+ if (schemaError !== null)
198
+ return { ok: false, reason: schemaError };
199
+ const kind = str(j['kind']);
200
+ switch (kind) {
201
+ case 'dead-code':
202
+ return parseDeadCode(j);
203
+ case 'dupes':
204
+ return parseDupes(j);
205
+ case 'health':
206
+ return parseHealth(j);
207
+ default:
208
+ return { ok: false, reason: `unrecognized fallow report kind '${kind || '(missing)'}'` };
209
+ }
210
+ }
211
+ /**
212
+ * Fallow's fingerprint extractor (baseline part 1), for the extractor registry.
213
+ * Returns the finding keys for a recognized, readable report and an empty set
214
+ * for anything else — the "never throw, empty on malformed" contract every
215
+ * extractor honours. The *gating* verdict (`fallowVerdict`) is where an
216
+ * unreadable report becomes a failure; capture and masking only need the keys.
217
+ */
218
+ export function fallowFindings(raw) {
219
+ const parsed = parseFallow(raw);
220
+ return new Set(parsed.ok ? parsed.findings : []);
221
+ }
222
+ /**
223
+ * Decide a fallow slot's verdict from its raw JSON and (optionally) the slot's
224
+ * grandfathered keys. `baselineKeys === null` means no baseline is active (a
225
+ * plain run or a `checkride baseline` capture): the verdict is simply whether
226
+ * fallow found anything. With a baseline, findings are masked — the slot passes
227
+ * when every current finding is grandfathered and fails on any new one.
228
+ *
229
+ * A report that parses to *fewer* fingerprints than its issue count has findings
230
+ * that can't be individually grandfathered; a baseline must never mask such a
231
+ * slot to green, so it stays at the raw findings-based verdict. Correctness over
232
+ * precision: better to keep re-surfacing a finding than to silently pass one.
233
+ */
234
+ export function fallowVerdict(raw, baselineKeys) {
235
+ const parsed = parseFallow(raw);
236
+ if (!parsed.ok) {
237
+ return { ok: false, baselined: 0, newKeys: [], findings: new Set(), observed: false, reason: parsed.reason };
238
+ }
239
+ const findings = new Set(parsed.findings);
240
+ const rawOk = parsed.issueCount === 0;
241
+ const issueReason = rawOk ? null : `${parsed.issueCount} finding(s)`;
242
+ if (baselineKeys === null) {
243
+ return { ok: rawOk, baselined: 0, newKeys: [], findings, observed: true, reason: issueReason };
244
+ }
245
+ const adj = applyBaseline(findings, baselineKeys, rawOk);
246
+ const fullyTracked = findings.size === parsed.issueCount;
247
+ // Untracked findings block masking: hold the slot at its raw verdict.
248
+ if (!fullyTracked) {
249
+ return { ok: rawOk, baselined: adj.baselined, newKeys: adj.newKeys, findings, observed: true, reason: issueReason };
250
+ }
251
+ // Fully tracked: a masked slot (all findings grandfathered) is green; a slot
252
+ // that fails does so on `newKeys`, which the orchestrator lists — so no extra
253
+ // reason line is needed either way.
254
+ return { ok: adj.ok, baselined: adj.baselined, newKeys: adj.newKeys, findings, observed: true, reason: null };
255
+ }
256
+ //# sourceMappingURL=fallow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallow.js","sourceRoot":"","sources":["../../src/baseline/fallow.ts"],"names":[],"mappings":"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"}
@@ -12,15 +12,13 @@
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 (D12), not from an up-front list. Step 4
16
- * ships extractors for the blessed lint/struct/spell adapters (oxlint, ast-grep,
17
- * cspell); fallow's cross-file findings (cycles, duplication) sit out for now
18
- * (a4) and can gain a composite-key extractor later without touching this seam.
15
+ * per-adapter against real fixtures (D12), not from an up-front list. Extractors
16
+ * ship for the blessed lint/struct/spell adapters (oxlint, ast-grep, cspell) and
17
+ * for fallow's three analyses (dead-code, dupes, health — see `./fallow.ts`,
18
+ * which also owns fallow's gating verdict).
19
19
  */
20
20
  /** A stable, order-independent set of diagnostic keys for one adapter's output. */
21
21
  export type Fingerprint = ReadonlySet<string>;
22
- /** Turns one adapter's raw output (JSON or text) into a fingerprint. */
23
- export type Extractor = (raw: string) => Fingerprint;
24
22
  /**
25
23
  * Fingerprint one adapter's raw output, or `null` when the adapter has no
26
24
  * extractor (baseline unsupported for that slot). Keyed on adapter name, so an
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAE9C,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,WAAW,CAAC;AAmFrD;;;;;;;;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
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,mFAAmF;AACnF,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AA0F9C;;;;;;;;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"}
@@ -12,11 +12,12 @@
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 (D12), not from an up-front list. Step 4
16
- * ships extractors for the blessed lint/struct/spell adapters (oxlint, ast-grep,
17
- * cspell); fallow's cross-file findings (cycles, duplication) sit out for now
18
- * (a4) and can gain a composite-key extractor later without touching this seam.
15
+ * per-adapter against real fixtures (D12), not from an up-front list. Extractors
16
+ * ship for the blessed lint/struct/spell adapters (oxlint, ast-grep, cspell) and
17
+ * for fallow's three analyses (dead-code, dupes, health — see `./fallow.ts`,
18
+ * which also owns fallow's gating verdict).
19
19
  */
20
+ import { fallowFindings } from './fallow.js';
20
21
  /**
21
22
  * Build a finding's key from its identity. Line and column are intentionally
22
23
  * excluded so the key survives edits that only move the code; the message is
@@ -93,6 +94,10 @@ const EXTRACTORS = {
93
94
  oxlint: extractOxlint,
94
95
  'ast-grep': extractAstGrep,
95
96
  cspell: extractCspell,
97
+ // One `fallow` adapter fills all three fallow slots (dead/dupes/health); its
98
+ // extractor dispatches on the report's `kind`, so a single registration serves
99
+ // every slot. See `./fallow.ts`.
100
+ fallow: fallowFindings,
96
101
  };
97
102
  /**
98
103
  * Fingerprint one adapter's raw output, or `null` when the adapter has no
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/baseline/fingerprint.ts"],"names":[],"mappings":"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"}
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,mFAAmF;AACnF,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,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"}
@@ -4,10 +4,9 @@
4
4
  * the module's only public surface (C2): siblings import from `../baseline`,
5
5
  * never from `./fingerprint.js` directly.
6
6
  */
7
- export type { Extractor, Fingerprint } from './fingerprint.js';
7
+ export type { Fingerprint } from './fingerprint.js';
8
8
  export { fingerprint, isFingerprintable } from './fingerprint.js';
9
- export type { Baseline, BaselineAdjustment } from './store.js';
10
- export { applyBaseline, BASELINE_FILE, BASELINE_SCHEMA_VERSION, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
11
- export type { BaselineOptions, BaselineResult } from './command.js';
12
- export { runBaseline } from './command.js';
9
+ export { fallowVerdict } from './fallow.js';
10
+ export type { Baseline } from './store.js';
11
+ export { applyBaseline, BASELINE_FILE, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
13
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,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,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,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -5,6 +5,6 @@
5
5
  * never from `./fingerprint.js` directly.
6
6
  */
7
7
  export { fingerprint, isFingerprintable } from './fingerprint.js';
8
- export { applyBaseline, BASELINE_FILE, BASELINE_SCHEMA_VERSION, baselinesEqual, countBaselineKeys, loadBaseline, ratchet, writeBaseline, } from './store.js';
9
- export { runBaseline } from './command.js';
8
+ export { fallowVerdict } from './fallow.js';
9
+ export { applyBaseline, BASELINE_FILE, 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;AAElE,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,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,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC"}
@@ -10,17 +10,19 @@
10
10
  *
11
11
  * Only slots whose adapter has an extractor participate: a supported-but-clean
12
12
  * slot records an empty array (it opted in and had nothing to grandfather),
13
- * while a slot with no extractor (fallow, tsc, links, …) simply never appears —
14
- * exactly the "supported vs. unsupported" distinction the fingerprint contract
15
- * draws. Running each check under the resolved package manager and capturing raw
13
+ * while a slot with no extractor (tsc, links, …) simply never appears — exactly
14
+ * the "supported vs. unsupported" distinction the fingerprint contract draws.
15
+ * The fallow slots (dead/dupes/health) are fingerprintable, so `checkride
16
+ * baseline` grandfathers their findings like any other. Running each check under
17
+ * the resolved package manager and capturing raw
16
18
  * output is delegated to {@link runChecks}, so baseline fingerprints precisely
17
19
  * the bytes a normal run would.
18
20
  */
19
- import type { Adapter, Slot } from '../adapters.js';
20
- import type { CheckrideConfig } from '../config.js';
21
- import type { CheckRunner, Out } from '../orchestrator.js';
22
- import type { PackageManager } from '../pm/index.js';
23
- import type { Baseline } from './store.js';
21
+ import type { Adapter, Slot } from './adapters.js';
22
+ import type { Baseline } from './baseline/store.js';
23
+ import type { CheckrideConfig } from './config.js';
24
+ import type { CheckRunner, Out } from './orchestrator.js';
25
+ import type { PackageManager } from './pm/index.js';
24
26
  export type BaselineOptions = {
25
27
  cwd?: string;
26
28
  slots?: readonly Slot[];
@@ -39,4 +41,4 @@ export type BaselineResult = {
39
41
  };
40
42
  /** Run the pipeline and write the per-adapter fingerprint baseline to `cwd`. */
41
43
  export declare function runBaseline(options: BaselineOptions): Promise<BaselineResult>;
42
- //# sourceMappingURL=command.d.ts.map
44
+ //# sourceMappingURL=baseline-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-command.d.ts","sourceRoot":"","sources":["../src/baseline-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAc,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sEAAsE;IACtE,EAAE,CAAC,EAAE,cAAc,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEnF,gFAAgF;AAChF,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAsCnF"}
@@ -10,15 +10,17 @@
10
10
  *
11
11
  * Only slots whose adapter has an extractor participate: a supported-but-clean
12
12
  * slot records an empty array (it opted in and had nothing to grandfather),
13
- * while a slot with no extractor (fallow, tsc, links, …) simply never appears —
14
- * exactly the "supported vs. unsupported" distinction the fingerprint contract
15
- * draws. Running each check under the resolved package manager and capturing raw
13
+ * while a slot with no extractor (tsc, links, …) simply never appears — exactly
14
+ * the "supported vs. unsupported" distinction the fingerprint contract draws.
15
+ * The fallow slots (dead/dupes/health) are fingerprintable, so `checkride
16
+ * baseline` grandfathers their findings like any other. Running each check under
17
+ * the resolved package manager and capturing raw
16
18
  * output is delegated to {@link runChecks}, so baseline fingerprints precisely
17
19
  * the bytes a normal run would.
18
20
  */
19
- import { runChecks } from '../orchestrator.js';
20
- import { fingerprint } from './fingerprint.js';
21
- import { BASELINE_FILE, BASELINE_SCHEMA_VERSION, writeBaseline } from './store.js';
21
+ import { fingerprint } from './baseline/fingerprint.js';
22
+ import { BASELINE_FILE, BASELINE_SCHEMA_VERSION, writeBaseline } from './baseline/store.js';
23
+ import { runChecks } from './orchestrator.js';
22
24
  /** Run the pipeline and write the per-adapter fingerprint baseline to `cwd`. */
23
25
  export async function runBaseline(options) {
24
26
  const cwd = options.cwd ?? process.cwd();
@@ -55,4 +57,4 @@ export async function runBaseline(options) {
55
57
  stderr.write(`\nbaseline: wrote ${BASELINE_FILE} — ${total} diagnostic(s) across ${where}\n`);
56
58
  return { ok: true, exitCode: 0, baseline };
57
59
  }
58
- //# sourceMappingURL=command.js.map
60
+ //# sourceMappingURL=baseline-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-command.js","sourceRoot":"","sources":["../src/baseline-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAqB,WAAW,EAAS,MAAM,WAAW,CAAC;AAEvE,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGvD,+DAA+D;AAC/D,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC;AAqGhE,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAejF;AAQD,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAgBlE;AAuCD,gEAAgE;AAChE,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC3E"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAqB,WAAW,EAAS,MAAM,WAAW,CAAC;AAEvE,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGvD,+DAA+D;AAC/D,MAAM,MAAM,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC;AAwJhE,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,CAmBjF;AAQD,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBlE;AA2CD,gEAAgE;AAChE,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC3E"}