@geonosis/doctor 2.10.0 → 2.11.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.
@@ -4,7 +4,7 @@ import {
4
4
  formatDoctor,
5
5
  formatJson,
6
6
  runDoctor
7
- } from "./chunk-2ZVCJG5R.js";
7
+ } from "./chunk-2VHAFVWH.js";
8
8
 
9
9
  // src/doctor-cli.ts
10
10
  import { fstatSync, statSync } from "fs";
@@ -138,6 +138,10 @@ var ABOUT = {
138
138
  seams: `The seam globs adoption.seams declares each name a file. A glob whose file was deleted and
139
139
  never undeclared measures nothing \u2014 every bump reads 0 deleted, 0 added over it \u2014 and a
140
140
  floor's adoption is measured by exactly those files.`,
141
+ formatter: `Whether the repo's own oxfmt would rewrite the kit's rule files under
142
+ .claude/rules/geonosis \u2014 tiers.md among them is generated. \`oxfmt --migrate=prettier\`
143
+ writes ignorePatterns: [], and the first format of a migrated repo did exactly that.
144
+ oxfmt is asked, so its ignore rules are read by the tool that applies them.`,
141
145
  exercised: `Every rule a config enables, against the corpus the loaded plugin ships. A rule at
142
146
  "error" that can never fire is indistinguishable from a clean tree. The line says what
143
147
  its number is evidence ABOUT \u2014 the corpus and the probes, never this tree \u2014 and a rule
@@ -184,7 +188,7 @@ var USAGE = `geonosis-doctor [--root <dir>] [--only <check,\u2026>] [--json] [--
184
188
 
185
189
  ${CHECKS.length} questions a version bump is not finished until something has asked. Most are ways
186
190
  enforcement has reported green while measuring nothing; drift asks whether the gate is still there
187
- at all, and the last two ask whether what was reported is what happened.
191
+ at all, and observability and deployed ask whether what was reported is what happened.
188
192
 
189
193
  With no arguments it runs every one of them over the working directory. A tree holding no
190
194
  package.json and no .oxlintrc.json is REFUSED with exit 2 \u2014 there is nothing there to examine, and a
@@ -193,13 +197,13 @@ page of SKIPs is not a pass.
193
197
  ${CHECKS.map((check) => ` ${check.padEnd(11)} ${ABOUT[check]}`).join("\n\n")}
194
198
 
195
199
  exercised reads the corpus the loaded plugin ships, and \u2014 when geonosis.json names one under
196
- doctor.corpus \u2014 the corpus THIS repo ships for its own options. Three rules cannot be answered any
197
- other way: layer-walls fires on a repo's own layer names, no-brand-names on its brand, and
198
- plugin-route-namespaced on its package root, while the shipped corpus says acme and layers/core.
200
+ doctor.corpus \u2014 the corpus THIS repo ships for its own options. A rule whose reach is the repo's
201
+ own vocabulary \u2014 its layer names, its brand, its plugin package root, the within its sagas live
202
+ in \u2014 cannot be answered any other way, while the shipped corpus says acme and layers/core.
199
203
 
200
204
  --print-config-shape every file this reads, and the keys it reads out of each
201
205
 
202
- Every run writes .geonosis/envelopes/doctor.json: the eleven checks CONSIDERED against the ones this
206
+ Every run writes .geonosis/envelopes/doctor.json: the ${CHECKS.length} checks CONSIDERED against the ones this
203
207
  run read, with the rest excused by name, so a --only run can never read as a verdict about the whole
204
208
  tree. The envelope check SKIPs that one file \u2014 this run is the one writing it.
205
209
 
@@ -256,6 +260,9 @@ geonosis.json \u2192 "law"
256
260
  maxLines number? the ceiling. Undeclared means UNJUDGED, never a default it fires on
257
261
  geonosis.json \u2192 "doctor"
258
262
  corpus string? the reach corpus this repo ships for its own rule options
263
+ apparatus string[]? directories whose .oxlintrc.json exists to EXERCISE rules over planted
264
+ files \u2014 the source of a corpus, say \u2014 and is not asked which engine its
265
+ manifests presume. A config inside a corpus needs no declaring
259
266
  groups object[]? { name, packages } sets of this repo's OWN packages that must resolve
260
267
  to one version; declared and empty is a refusal. The kit's own fixed
261
268
  group is checked when this is absent
@@ -336,11 +343,11 @@ var main = async () => {
336
343
  return report.ok ? 0 : 1;
337
344
  };
338
345
  try {
339
- process.exit(await main());
346
+ process.exitCode = await main();
340
347
  } catch (error) {
341
348
  process.stderr.write(`geonosis-doctor: ${error.message}
342
349
  `);
343
- process.exit(2);
350
+ process.exitCode = 2;
344
351
  }
345
352
  export {
346
353
  parseDoctorArgs
package/dist/index.d.ts CHANGED
@@ -6,12 +6,11 @@ type Overrides = {
6
6
  /**
7
7
  * The questions a bump is not finished until something has asked, in the order a run asks them.
8
8
  * The first five are ways enforcement has reported green while measuring nothing; `envelope` asks
9
- * the arithmetic underneath all of them — whether a gate read as many things as it was handed;
10
- * `drift` asks whether the gate is still there at all; `observability` and `deployed` ask the same
11
- * question one layer out — whether what was reported is what happened; `rails` asks it of the
12
- * settings an unattended run is bounded by, where a rendered file is not a loaded setting.
9
+ * whether a gate read as many things as it was handed; `drift` whether the gate is still there;
10
+ * `observability` and `deployed` whether what was reported is what happened; `rails` the same of
11
+ * the settings an unattended run loads; `exams` and `seams` whether an adoption sees its floors.
13
12
  */
14
- declare const CHECKS: readonly ["loaded", "group", "exercised", "baseline", "runner", "envelope", "drift", "observability", "deployed", "rails", "exams", "seams"];
13
+ declare const CHECKS: readonly ["loaded", "group", "exercised", "baseline", "runner", "envelope", "drift", "observability", "deployed", "rails", "exams", "seams", "formatter"];
15
14
  type CheckName = (typeof CHECKS)[number];
16
15
  /**
17
16
  * `SKIP` is a first-class answer and is printed like any other: a check whose line is missing reads
@@ -66,7 +65,7 @@ type RatchetConfig = {
66
65
  counters: Record<string, unknown>[];
67
66
  };
68
67
  type DoctorOptions = {
69
- /** Where `~/.claude` lives — the plugin registry and the user settings the doctor reads; the home directory unless a caller says otherwise. */
68
+ /** Where `~/.claude` is, for the plugin registry and user settings; the home dir by default. */
70
69
  home?: string;
71
70
  /**
72
71
  * Present only when a baseline comparison was asked for, because making one is the one part of
@@ -95,6 +94,30 @@ type DoctorReport = {
95
94
  root: string;
96
95
  };
97
96
 
97
+ /**
98
+ * Row 585: an `.oxlintrc.json` that exists to EXERCISE rules — the plugin's shipped corpus, a
99
+ * repo's own reach corpus — deliberately holds odd, partial and contradictory configuration,
100
+ * because that is what a fixture tree is for. Judged as though it governed a product it produced
101
+ * twenty-two WARNs about a tree nobody ships, and a reader who learns to skim those is a reader
102
+ * who skims the three lines that mean something.
103
+ *
104
+ * Apparatus is known STRUCTURALLY, never by a path list this package keeps (LAW 6): a config is
105
+ * apparatus when its directory is inside one the doctor already reads as evidence — the corpus
106
+ * the plugin ships (`corpusOfPlugin`), the corpus the repo declares (`geonosis.json` →
107
+ * `doctor.corpus`) — or inside one the repo names as such in `doctor.apparatus`, for a fixture
108
+ * tree that is the SOURCE of a corpus rather than a corpus itself. The default is empty: a repo
109
+ * that declares nothing has every config it holds judged, which is the safe direction — judging
110
+ * apparatus is noise, and ignoring a product config is a hole.
111
+ *
112
+ * The limit, stated: a fixture directory a repo neither ships as a corpus nor declares is still
113
+ * judged, by design.
114
+ */
115
+ declare const APPARATUS_KEY = "apparatus";
116
+ /** The directories `geonosis.json` names as apparatus, absolute; none when it names none. */
117
+ declare const declaredApparatusOf: (root: string) => string[];
118
+ /** The evidence directory a config sits in, if it sits in one at all. */
119
+ declare const evidenceHolding: (config: DiscoveredConfig, evidence: readonly string[]) => string | undefined;
120
+
98
121
  /**
99
122
  * `origin/main`, when the repo has one. Never invented: a comparison against a ref that is not
100
123
  * there would either crash or, worse, be reported as a comparison that found nothing.
@@ -157,8 +180,8 @@ declare const READERS: Record<string, string>;
157
180
  *
158
181
  * Every line here is something that reads as green from the outside: a job that cannot run, a suite
159
182
  * nothing runs, a directory nothing reaches, a law nobody finishes, a plugin nobody installed, a
160
- * block nothing reads. The other four checks ask whether a gate measures what it names; this one
161
- * asks whether it is still there at all.
183
+ * block nothing reads. Most checks ask whether a gate measures what it names; this one asks whether
184
+ * it is still there at all.
162
185
  */
163
186
  declare const checkDrift: ({ readers, root, userSettings, workspaces }: {
164
187
  /**
@@ -222,6 +245,27 @@ declare const checkExercised: ({ config, corpus, entry, oxlint, repoCorpus, root
222
245
  root: string;
223
246
  }) => Promise<Finding>;
224
247
 
248
+ type Constructible = {
249
+ create: (context: unknown) => unknown;
250
+ };
251
+ /**
252
+ * The option a rule says it is missing when constructed with these options, or undefined.
253
+ *
254
+ * Two shapes, because the doctor reads whatever plugin a config's directory resolves: a rule that
255
+ * THROWS its refusal from `create()` (the plugin up to 2.10.0, and any third-party plugin written
256
+ * that way), and a rule that answers a visitor which REPORTS the refusal on `Program` (the plugin
257
+ * from 2.11.0 — one attributable finding a run, in place of a throw that erased its neighbours).
258
+ * No filename: this is a question about the config, not a pass over a file, and a rule that has
259
+ * already answered for one file answers a fileless probe every time (#202).
260
+ */
261
+ declare const missingOptionOf: (rule: Constructible, options: unknown[]) => string | undefined;
262
+
263
+ declare const checkRequiredOptions: ({ config, entry }: {
264
+ config: DiscoveredConfig;
265
+ /** The plugin module oxlint loads from this config's directory. */
266
+ entry: string;
267
+ }) => Promise<Finding[]>;
268
+
225
269
  /**
226
270
  * The packages that version as ONE number — the kit's method floor, as data a consumer's tree can
227
271
  * read.
@@ -243,18 +287,19 @@ type HeldTogether = {
243
287
  };
244
288
  declare const KIT_GROUP: HeldTogether;
245
289
  /**
246
- * The groups a repo declares for its OWN packages, under `doctor.groups` in `geonosis.json`. Law 6:
247
- * the kit's group is the default and a repo that declares nothing gets it; a repo that declares the
248
- * key and puts nothing in it is REFUSED, because "two copies are a bug" is a claim someone made and
249
- * an empty list cannot hold it.
290
+ * Row 549: this used to read `geonosis.json` for itself, with its own `catch { return undefined
291
+ * }` — a parse error read as "this repo declares no groups", the KIT_GROUP default, rather than a
292
+ * question nobody could answer. Routed through the one reader, `unreadable` throws rather than
293
+ * answering `absent`; `checkGroup` reads the file itself and turns that into a FAIL line the same
294
+ * way `checkSeams` and `checkRails` do, so a run over this repo still finishes.
250
295
  */
251
296
  declare const declaredGroupsOf: (root: string) => HeldTogether[] | undefined;
252
297
  /**
253
298
  * #158 — the group question nothing asked.
254
299
  *
255
- * during.day carried `@geonosis/visual-diff` at 1.1.0 and 1.4.0 in one tree and every doctor line
256
- * was green: `loaded` is scoped to the plugin a config names, so a second kit package at a second
257
- * version is outside every question it asks. This is the consumer-side mirror of
300
+ * A Workers + D1 app carried `@geonosis/visual-diff` at 1.1.0 and 1.4.0 in one tree and every
301
+ * doctor line was green: `loaded` is scoped to the plugin a config names, so a second kit package
302
+ * at a second version is outside every question it asks. This is the consumer-side mirror of
258
303
  * `geonosis-release published --group`.
259
304
  *
260
305
  * Asked of the RESOLVER from each workspace directory, never of `find` over `node_modules` — on
@@ -273,27 +318,46 @@ declare const checkGroup: ({ groups, root, workspaces }: {
273
318
  * MEASURED 2026-09-02 (`~/.claude/plugins/installed_plugins.json`, `version: 2`): a map keyed
274
319
  * `<plugin>@<marketplace>`, each value a list of installations carrying `version`, `installPath`
275
320
  * and the commit it came from. This is the file `claude plugin list` answers from.
321
+ *
322
+ * MEASURED 2026-09-18: an installation also carries `scope` (`user` or `project`) and, at project
323
+ * scope, the `projectPath` it loads in. One machine held `2.10.0` at user scope and `2.6.1` at
324
+ * project scope for another repo, and a doctor that read only `version` reported the second as
325
+ * this repo's drift (a Medusa storefront #13).
276
326
  */
277
327
  declare const INSTALLED_PLUGINS = ".claude/plugins/installed_plugins.json";
278
328
  /** The plugin this kit publishes. Its own name, the way `FIXED_GROUP` is its own group. */
279
329
  declare const PLUGIN_NAME = "geonosis";
330
+ type InstalledPlugin = {
331
+ projectPath?: string;
332
+ scope?: string;
333
+ version: string;
334
+ };
280
335
  /**
281
- * Every version of one plugin this machine has installed, in the order the record lists them.
336
+ * Every installation of one plugin this machine has, in the order the record lists them, with
337
+ * the scope each loads at.
282
338
  *
283
339
  * A name can be installed from more than one marketplace and at more than one scope, so this
284
- * answers with a list rather than picking one: a session loads what it loads, and a doctor that
285
- * chose for the reader would be reporting about an installation nobody has.
340
+ * answers with a list rather than picking one: which of them a session loads is a question about
341
+ * a ROOT, and `loadedAt` answers it.
286
342
  */
343
+ declare const installedPlugins: (home: string, name: string) => InstalledPlugin[];
344
+ /** Every version of one plugin this machine has installed, at any scope. */
287
345
  declare const installedPluginVersions: (home: string, name: string) => string[];
346
+ /**
347
+ * The installations that LOAD in a session opened at `root`: a project-scoped install whose
348
+ * `projectPath` is this root wins, and only where none is does the user-scoped install load.
349
+ * A project-scoped install for another path loads nowhere here, whatever its version.
350
+ */
351
+ declare const loadedAt: (installs: InstalledPlugin[], root: string) => InstalledPlugin[];
288
352
  /**
289
353
  * #133: a consumer's npm bump does not move the CLAUDE PLUGIN.
290
354
  *
291
355
  * The hooks, the agents and the skills live in the plugin, and it updates on `claude plugin update`
292
356
  * and never on an install — so a repo can be on this release's packages while every session in it
293
- * runs the hooks of the one before, and a refusal added this release cannot fire. That is the
294
- * declared-versus-loaded question one surface out, and it is this check's to ask.
357
+ * runs the hooks of the one before. That is the declared-versus-loaded question one surface out,
358
+ * and it is this check's to ask.
295
359
  */
296
- declare const checkClaudePlugin: ({ candidate, home, name, train }: {
360
+ declare const checkClaudePlugin: ({ candidate, home, name, root, train }: {
297
361
  /**
298
362
  * Whether the packages here are a RELEASE CANDIDATE the registry has never seen — installed from
299
363
  * tarballs or a `file:` override. `claude plugin update` reads the marketplace, so it cannot
@@ -303,6 +367,8 @@ declare const checkClaudePlugin: ({ candidate, home, name, train }: {
303
367
  candidate?: boolean;
304
368
  home?: string;
305
369
  name?: string;
370
+ /** The repo being doctored — the root a project-scoped install has to name to load here. */
371
+ root?: string;
306
372
  /** The version the package train is on here, or nothing when this tree declares none. */
307
373
  train: string | undefined;
308
374
  }) => Finding[];
@@ -335,6 +401,20 @@ declare const checkLoaded: ({ configs, home, root, workspaces }: {
335
401
  workspaces: Workspace[];
336
402
  }) => Promise<Finding[]>;
337
403
 
404
+ /**
405
+ * The exporter, asked three things: is one configured, can anything reach it, and has anything
406
+ * actually arrived lately.
407
+ *
408
+ * Two of the four lying instruments of `docs/rules-backlog.md` #42 are in this shape — a deploy job
409
+ * that reported success having deployed nothing, and a `/health` that answered ok over an
410
+ * unreachable database. Both leave a green build and a silent project, and neither is visible from
411
+ * inside the process that is not reporting.
412
+ *
413
+ * This check reads a FILE the consumer's sink wrote, and imports nothing of
414
+ * `@geonosis/observability`: a check that needed the library it checks cannot run in the tree where
415
+ * the library is missing, which is the first case it exists to find. The wall is planted in the
416
+ * plugin's `dogfood.bin.test.ts`.
417
+ */
338
418
  /** The record a sink writes on every capture. `@geonosis/observability` exports the same shape. */
339
419
  type LastEventRecord = {
340
420
  at?: unknown;
@@ -360,18 +440,14 @@ declare const checkObservability: ({ now, root }: {
360
440
  }) => Promise<Finding[]>;
361
441
 
362
442
  declare const GEONOSIS_FILE = "geonosis.json";
443
+
363
444
  /**
364
- * The reach corpus a repo ships for ITS OWN options, if it declares one.
365
- *
366
- * `exercised` asks whether an enabled rule can fire at all, against the corpus the PLUGIN ships.
367
- * That answers for most rules and cannot answer for the ones whose reach is a repo's vocabulary:
368
- * `layer-walls` fires on this repo's layer names, `no-brand-names` on its brand,
369
- * `plugin-route-namespaced` on its package root. The plugin's corpus says `acme` and `layers/core`,
370
- * so it is no evidence either way — and those rules read as firing nowhere in a tree that enforces
371
- * them perfectly well.
372
- *
373
- * A repo answers for its own options by shipping fixtures in its own vocabulary and naming, in that
374
- * corpus's own manifest, exactly which rules it is evidence about.
445
+ * Row 549: this used to read `geonosis.json` for itself, with its own `catch { return undefined
446
+ * }` — a parse error read as "this repo declares no corpus", the exact collapse `geonosis-file.ts`
447
+ * exists to make unrepresentable (measured 2026-09-17 alongside `deployed`, `seams`, `rails`: a
448
+ * truncated file, a green line). Routed through the one reader, `unreadable` throws rather than
449
+ * answering `absent` — a config nobody can read has not been read, and every question this would
450
+ * answer is answered from a default nobody chose.
375
451
  */
376
452
  declare const repoCorpusOf: (root: string) => string | undefined;
377
453
 
@@ -379,6 +455,14 @@ declare const formatDoctor: ({ counts, findings, ok, root }: DoctorReport) => st
379
455
  declare const formatJson: (report: DoctorReport) => string;
380
456
 
381
457
  /**
458
+ * What oxlint would load, asked the only way that answers on every package manager.
459
+ *
460
+ * oxlint resolves a `jsPlugins` specifier from the CONFIG FILE's directory, not the working
461
+ * directory, so the question is asked from a directory and never from the process's cwd. And it is
462
+ * asked of the RESOLVER: counting copies with `find` is a bun/npm check only — on pnpm the entries
463
+ * under `node_modules/@scope/` are symlinks into `.pnpm/`, which keeps every version ever
464
+ * installed, so the same count answers 7 on a correct tree and 0 with the store excluded.
465
+ *
382
466
  * `root` is the directory the doctor was HANDED — the boundary a deployed tree actually has. A
383
467
  * package on the way up from `dir` but past `root` is not this tree's to see; #373/#386 measured
384
468
  * the kit's own workspace two directories above a consumer's checkout read exactly that way.
@@ -435,4 +519,4 @@ declare const checkRunner: ({ ratchet, root, workspaces }: {
435
519
  workspaces: Workspace[];
436
520
  }) => Finding[];
437
521
 
438
- export { CHECKS, COMPOSITION_ROOT, CONFIG_FILE, type CheckName, DEPLOYED_FILE, type DiscoveredConfig, DoctorError, type DoctorOptions, type DoctorReport, ENVELOPES_DIR, FIXED_GROUP, FLOOR_PACKAGES, type Finding, GEONOSIS_FILE, type HeldTogether, INSTALLED_PLUGINS, KIT_GROUP, type LastEventRecord, MANIFEST_FILE, type Manifest, NOT_WRITTEN, NO_ENVELOPES, type ObservabilityConfig, PLUGIN_NAME, RATCHET_FILE, READERS, type RatchetConfig, SCOPE, type Verdict, type Workspace, checkBaseline, checkClaudePlugin, checkDeployed, checkDrift, checkEnvelopes, checkExams, checkExercised, checkGroup, checkLoaded, checkObservability, checkRunner, corpusOfPlugin, declaredFor, declaredGroupsOf, defaultRef, discoverConfigs, discoverWorkspaces, enabledRulesOf, formatDoctor, formatJson, installedPluginVersions, packageDirOf, pluginVersionOf, readConfig, readRatchet, relativePath, relativeToRoot, repoCorpusOf, resolveFrom, runDoctor, satisfies };
522
+ export { APPARATUS_KEY, CHECKS, COMPOSITION_ROOT, CONFIG_FILE, type CheckName, DEPLOYED_FILE, type DiscoveredConfig, DoctorError, type DoctorOptions, type DoctorReport, ENVELOPES_DIR, FIXED_GROUP, FLOOR_PACKAGES, type Finding, GEONOSIS_FILE, type HeldTogether, INSTALLED_PLUGINS, type InstalledPlugin, KIT_GROUP, type LastEventRecord, MANIFEST_FILE, type Manifest, NOT_WRITTEN, NO_ENVELOPES, type ObservabilityConfig, PLUGIN_NAME, RATCHET_FILE, READERS, type RatchetConfig, SCOPE, type Verdict, type Workspace, checkBaseline, checkClaudePlugin, checkDeployed, checkDrift, checkEnvelopes, checkExams, checkExercised, checkGroup, checkLoaded, checkObservability, checkRequiredOptions, checkRunner, corpusOfPlugin, declaredApparatusOf, declaredFor, declaredGroupsOf, defaultRef, discoverConfigs, discoverWorkspaces, enabledRulesOf, evidenceHolding, formatDoctor, formatJson, installedPluginVersions, installedPlugins, loadedAt, missingOptionOf, packageDirOf, pluginVersionOf, readConfig, readRatchet, relativePath, relativeToRoot, repoCorpusOf, resolveFrom, runDoctor, satisfies };
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import {
2
+ APPARATUS_KEY,
2
3
  CHECKS,
3
4
  COMPOSITION_ROOT,
4
5
  CONFIG_FILE,
@@ -27,17 +28,23 @@ import {
27
28
  checkGroup,
28
29
  checkLoaded,
29
30
  checkObservability,
31
+ checkRequiredOptions,
30
32
  checkRunner,
31
33
  corpusOfPlugin,
34
+ declaredApparatusOf,
32
35
  declaredFor,
33
36
  declaredGroupsOf,
34
37
  defaultRef,
35
38
  discoverConfigs,
36
39
  discoverWorkspaces,
37
40
  enabledRulesOf,
41
+ evidenceHolding,
38
42
  formatDoctor,
39
43
  formatJson,
40
44
  installedPluginVersions,
45
+ installedPlugins,
46
+ loadedAt,
47
+ missingOptionOf,
41
48
  packageDirOf,
42
49
  pluginVersionOf,
43
50
  readConfig,
@@ -48,8 +55,9 @@ import {
48
55
  resolveFrom,
49
56
  runDoctor,
50
57
  satisfies
51
- } from "./chunk-2ZVCJG5R.js";
58
+ } from "./chunk-2VHAFVWH.js";
52
59
  export {
60
+ APPARATUS_KEY,
53
61
  CHECKS,
54
62
  COMPOSITION_ROOT,
55
63
  CONFIG_FILE,
@@ -78,17 +86,23 @@ export {
78
86
  checkGroup,
79
87
  checkLoaded,
80
88
  checkObservability,
89
+ checkRequiredOptions,
81
90
  checkRunner,
82
91
  corpusOfPlugin,
92
+ declaredApparatusOf,
83
93
  declaredFor,
84
94
  declaredGroupsOf,
85
95
  defaultRef,
86
96
  discoverConfigs,
87
97
  discoverWorkspaces,
88
98
  enabledRulesOf,
99
+ evidenceHolding,
89
100
  formatDoctor,
90
101
  formatJson,
91
102
  installedPluginVersions,
103
+ installedPlugins,
104
+ loadedAt,
105
+ missingOptionOf,
92
106
  packageDirOf,
93
107
  pluginVersionOf,
94
108
  readConfig,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geonosis/doctor",
3
- "version": "2.10.0",
3
+ "version": "2.11.0",
4
4
  "types": "./dist/index.d.ts",
5
5
  "description": "The adoption doctor — declared ≠ loaded, enabled ≠ exercised, a baseline that grew, a runner whose exit code is the only verdict.",
6
6
  "keywords": [
@@ -36,10 +36,10 @@
36
36
  "dist"
37
37
  ],
38
38
  "dependencies": {
39
- "@geonosis/lint-parity": "2.10.0"
39
+ "@geonosis/lint-parity": "2.11.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@geonosis/ratchet": "2.10.0"
42
+ "@geonosis/ratchet": "2.11.0"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "oxlint": ">=1.77"
@@ -51,7 +51,7 @@
51
51
  "access": "public"
52
52
  },
53
53
  "scripts": {
54
- "build": "tsup",
54
+ "build": "tsx ../../tooling/build-step.ts tsup",
55
55
  "typecheck": "tsc --noEmit",
56
56
  "lint": "oxlint --config ../../.oxlintrc.json .",
57
57
  "test:unit": "vitest run --project unit --root ../.. --passWithNoTests \"$PWD\"",