@geonosis/doctor 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -14
- package/dist/{chunk-7BRGHYQR.js → chunk-SMCRXSH5.js} +1122 -251
- package/dist/doctor-cli.js +60 -9
- package/dist/index.d.ts +83 -6
- package/dist/index.js +19 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -55,6 +55,29 @@ npm and pnpm alike.
|
|
|
55
55
|
A declared range this check cannot read is a **FAIL**, not a pass. A version it cannot judge is a
|
|
56
56
|
refusal.
|
|
57
57
|
|
|
58
|
+
#### A geonosis bin a git hook cannot start
|
|
59
|
+
|
|
60
|
+
Every committed hook — `lefthook.yml`, `.husky/*`, `.githooks/*` — is read, and a line running a
|
|
61
|
+
geonosis bin through `pnpm`, `npx`, `bunx` or `yarn` is a **FAIL** naming the direct call that
|
|
62
|
+
replaces it.
|
|
63
|
+
|
|
64
|
+
A git hook's PATH is not the shell's: no nvm shim, no corepack shim, nothing a version manager put
|
|
65
|
+
there. dielime's first hooked commit was "refused" on 2026-08-30 and the ledger never ran — `pnpm`
|
|
66
|
+
was not found, and the sentence its author read was a version manager's failure wearing a gate's
|
|
67
|
+
refusal costume. That is the worst shape a gate has, because it is indistinguishable from the gate
|
|
68
|
+
working. `node_modules/.bin/<bin>` is linked by every package manager and needs nothing on PATH.
|
|
69
|
+
|
|
70
|
+
A hook file naming no geonosis bin is a **SKIP** with the sentence, never a vacuous OK.
|
|
71
|
+
|
|
72
|
+
The FAIL names what the fix costs elsewhere: knip's lefthook plugin does not resolve
|
|
73
|
+
`node_modules/.bin/<bin>` back to the package that ships it, so taking this refusal makes knip call
|
|
74
|
+
that dependency unused. The line carries the `ignoreDependencies` entry that answers it, to be added
|
|
75
|
+
in the same commit — a consumer told to do one thing by one gate and undo it by another does
|
|
76
|
+
neither (#176).
|
|
77
|
+
|
|
78
|
+
It is a `loaded` line, not a `drift` one: it reads a committed file and nothing else, and
|
|
79
|
+
during.day's fast tier runs `--only loaded`, so as a drift line it fired in CI and never locally.
|
|
80
|
+
|
|
58
81
|
## The options a rule actually runs under
|
|
59
82
|
|
|
60
83
|
Every reader here that consumes a rule's configuration reads `overrides[]` as well as `rules`, and
|
|
@@ -169,6 +192,26 @@ nowhere in it is a FAIL — claiming evidence and shipping none is worse than cl
|
|
|
169
192
|
It is read for the config beside `geonosis.json` and no other: a nested config sets different
|
|
170
193
|
options, and asking one config's fixtures to answer for another's would report firing nowhere.
|
|
171
194
|
|
|
195
|
+
#### The engine a rule presumes (#159)
|
|
196
|
+
|
|
197
|
+
A rule that reaches ONE engine carries it in its own metadata — `presumes: { engine, packages }` —
|
|
198
|
+
and this asks the manifests from the config's directory up to the root whether any of those packages
|
|
199
|
+
is declared. during.day ran three Medusa rules at `error` over sagaflow trees: the default step
|
|
200
|
+
factory is `createStep`, sagaflow has none, and the possible findings were zero. Enabled-with-no-
|
|
201
|
+
engine and clean are the identical green.
|
|
202
|
+
|
|
203
|
+
A **WARN**, because which rules a repo enables is the repo's decision and the two actions — drop the
|
|
204
|
+
rule from that config, or install the engine — are the reader's. A plugin too old to declare any
|
|
205
|
+
presumption answers with none, and says nothing.
|
|
206
|
+
|
|
207
|
+
#### What the number is evidence about (#160)
|
|
208
|
+
|
|
209
|
+
The `exercised` line says, on the same line as its number, that the firing happened in the corpus
|
|
210
|
+
and in the probes and **says nothing about this tree**. "17 enabled, 17 exercised" was read as
|
|
211
|
+
liveness in a consumer; three of those 17 could never fire on the surface that repo writes, and its
|
|
212
|
+
own `--prove` plant was green in a spelling its code does not use. Nobody goes looking for the
|
|
213
|
+
denominator of a green, so it goes where the green is.
|
|
214
|
+
|
|
172
215
|
### `baseline` — a number that may only shrink, against another ref
|
|
173
216
|
|
|
174
217
|
A ratchet lowers its **own** baseline whenever a number shrinks; that is what locks a win in, and it
|
|
@@ -210,6 +253,17 @@ runs `bun ./scripts/vitest-strict.ts` reads as neither, and that consumer's wrap
|
|
|
210
253
|
exemplary fix — it spawns vitest with `--reporter=json`, reads the report, and fails on a missing
|
|
211
254
|
one. The verdict is right and the sentence understates it.
|
|
212
255
|
|
|
256
|
+
#### A falsification nothing runs
|
|
257
|
+
|
|
258
|
+
`geonosis-ratchet --prove` plants each counter's known-bad input and requires the counter to read
|
|
259
|
+
it — a gate that has never been seen red has not been shown to measure (D-029). The ratchet is
|
|
260
|
+
strict about this where the flag runs, and until now nothing asked whether the flag is ever run: a
|
|
261
|
+
prove that lives in the release ritual is run by the release that remembers it, and a counter can
|
|
262
|
+
spend a release reading zero off a mis-escaped match (#140, measured in a consumer).
|
|
263
|
+
|
|
264
|
+
A repo with counters and no `--prove` in any verify tier, script or workflow is a **WARN** naming a
|
|
265
|
+
tier it already declares. A repo with no ratchet configured gets no line at all.
|
|
266
|
+
|
|
213
267
|
### `drift` — the gate that is no longer there
|
|
214
268
|
|
|
215
269
|
The other four ask whether a gate measures what it names. This one asks whether it still runs.
|
|
@@ -224,6 +278,9 @@ The other four ask whether a gate measures what it names. This one asks whether
|
|
|
224
278
|
| workspace bins | FAIL | a script calling a bin THIS repo's own workspaces declare, with no `node_modules/.bin/<name>` at the root. pnpm links a workspace bin only for the packages that depend on it: dielime's `@dielime/gate-tools` had to become an explicit root devDependency before the gate scripts could find it, and naming that took a debugging session. External commands are not judged — that would be a guess |
|
|
225
279
|
| plugin directories | FAIL | a manifest directory under the roots `no-unregistered-plugin-dir` names that the registry never mentions. SKIP when the rule is not configured — the roots are the repo's, read from the rule it already wrote, never a list invented here |
|
|
226
280
|
| `publicHoistPattern` | FAIL / SKIP | a pattern in `pnpm-workspace.yaml` with no root `node_modules` link for a workspace package it matches. pnpm dropped one during an **unrelated** `add`, then answered "Already up to date" to every install afterwards over a clean `git status` — the tree was fixed only by deleting `.modules.yaml` and `.pnpm-workspace-state-v1.json`, which the line carries verbatim. Only workspace packages are judged, because one exists on disk by construction and a missing link for it cannot be "the install never ran"; the root package is never asked about, since no package manager puts a repo's root inside its own `node_modules`. A pattern matching no workspace package is SKIP, never a pass |
|
|
281
|
+
| `@geonosis/observability` | WARN | it is declared in a manifest here and **no source file imports it** — installed is not composed. The kit ships the sink adapter and the reference consumer sent production errors nowhere, because nothing at its composition root ever built one; from outside the process that reads exactly like a project with nothing to report (#165). No line at all in a repo that never installed it |
|
|
282
|
+
| an `allowBuilds` entry | WARN | a platform-split package allowed by ONE platform name. pnpm 11.5.1 writes this file itself when it refuses a build script, and what it writes is the platform of the machine that ran the install — so every other platform refuses the install by the name that is missing, on somebody else's machine (#188, measured here). How many a family publishes is the registry's answer, so the line names the family and the shape rather than a count it would have to guess |
|
|
283
|
+
| a workspace's `lint` script | WARN / SKIP | the file set the script covers, against the one a committed hook lints. during.day's `apps/web` script covered `src` and not `__tests__`, so the pre-commit hook — which lints whatever is STAGED — was the first door ever to read a moved test file, and it found violations the package gate had never seen (#172). The line names the globs left to the hook alone. SKIP when no committed hook lints staged files: there is no second file set to be narrower than |
|
|
227
284
|
| the law | WARN / SKIP | its measured length against `geonosis.json` → `law.maxLines`. **SKIP when the repo declares no ceiling** — during.day read "1,104 lines against a ceiling of 200" for a number it never chose, which is unactionable in both directions. The length is still printed, because that is the number a repo declares against |
|
|
228
285
|
| `.claude/settings.json` | WARN | nothing under `enabledPlugins` enables the kit's plugin, so the gates run and the method does not (D-041). The **user-scope** `~/.claude/settings.json` is read too and acknowledged as "installed elsewhere — not this repo's to declare": both source repos got this WARN while the plugin was installed machine-wide. The key is read, never the word `geonosis` appearing somewhere in the file |
|
|
229
286
|
| `geonosis.json` blocks | WARN | a block whose package **no manifest declares** — nothing reads it, and a stale `node_modules` copy is named as what a previous install left behind; a block whose package is declared and does not resolve — run the install; or a **declared** package with no block, running on defaults nobody chose |
|
|
@@ -238,20 +295,6 @@ The "installed with no block" direction is scoped to **direct** dependencies. `@
|
|
|
238
295
|
a package they never installed is noise — which is how a reader learns to skip the section (#61). A
|
|
239
296
|
transitive presence gets an OK line naming where it came from, and no demand.
|
|
240
297
|
|
|
241
|
-
#### A geonosis bin a git hook cannot start
|
|
242
|
-
|
|
243
|
-
Every committed hook — `lefthook.yml`, `.husky/*`, `.githooks/*` — is read, and a line running a
|
|
244
|
-
geonosis bin through `pnpm`, `npx`, `bunx` or `yarn` is a **FAIL** naming the direct call that
|
|
245
|
-
replaces it.
|
|
246
|
-
|
|
247
|
-
A git hook's PATH is not the shell's: no nvm shim, no corepack shim, nothing a version manager put
|
|
248
|
-
there. dielime's first hooked commit was "refused" on 2026-08-30 and the ledger never ran — `pnpm`
|
|
249
|
-
was not found, and the sentence its author read was a version manager's failure wearing a gate's
|
|
250
|
-
refusal costume. That is the worst shape a gate has, because it is indistinguishable from the gate
|
|
251
|
-
working. `node_modules/.bin/<bin>` is linked by every package manager and needs nothing on PATH.
|
|
252
|
-
|
|
253
|
-
A hook file naming no geonosis bin is a **SKIP** with the sentence, never a vacuous OK.
|
|
254
|
-
|
|
255
298
|
### `observability` — a sink nobody can reach
|
|
256
299
|
|
|
257
300
|
The exporter named by the `observability` block in `geonosis.json`: is a sink configured, is its
|