Compatibility
How seniority's four drop-ins are graded by their incumbents' own suites — lilconfig 77 / 77, rc 1 / 1 (one bit), cosmiconfig 242 / 243 (level with cosmiconfig itself), dotenv 197 / 197 (level with dotenv 18 itself) — and the differences that remain.
seniority (cosmiconfig's API at the root), seniority/lilconfig, seniority/dotenv and
seniority/rc are graded, not described as compatible. Each is run against its incumbent's
own test suite, by
compat-oracle,
in CI.
✓ yes · ◐ partial, with what is missing · ✗ no · — does not apply. Every mark links to its evidence: our test or grade, or the incumbent’s source at the version compat-oracle grades.
Compatibility
Passes lilconfig's own test suite
seniority/lilconfigis graded by lilconfig 3.1.3's own tests, all 77, the same count the real lilconfig gets here.cosmiconfig- cosmiconfig: does not applya different API
Passes rc's own test
seniority/rcruns rc 1.2.8's test script, one script of bare assertions with no reporter, and exits 0: the grade is one bit, not 100% of anything.seniority- seniority: yes1 / 1 of its own tests
cosmiconfig- cosmiconfig: does not applya different API
Passes find-up's own test suite
seniority/find-upruns find-up 8.0.0's own suite, unmodified: 104 of 104, the same as find-up itself, with the two cases that expect a.gitat the vendored root subtracted by name from both.cosmiconfig- cosmiconfig: does not applya different API
Passes cosmiconfig's own test suite
senioritypasses 242 of the 243 cases of cosmiconfig 10.0.1's own suite on Linux, the count the published control run passes too, the XDG global-directory pair included.Passes dotenv's own test suite
seniority/dotenvpasses all 197 assertions of dotenv 18.0.9's own suite (node-tap counts assertions), as dotenv itself does here — itsdotenv runcommand line andimport 'dotenv/config'included.cosmiconfig- cosmiconfig: does not applya different API
The family's compatibility page is generated from the oracle's last run and is the authority for the current figures.
How a suite is graded
- The incumbent's repository is cloned at the graded version, and its test directory is copied
into
packages/compat-oracle/vendor/. The versions are cosmiconfig 10.0.1, lilconfig 3.1.4, dotenv 18.0.9, and rc 1.2.8 (rc's release was never tagged, so its commit is pinned). Each copy has aPROVENANCEfile. - The only edit is the import that reaches the library, rewritten to a shim generated per run.
- A control run points the shim at the real incumbent first. Its total is what every rate is measured against.
- The target run points the same shim at seniority.
What each grade covers
- lilconfig: 77 of 77, the same count the real lilconfig gets here. Ten of the cases mock
fswithjest.mockto assert which files were read, and the oracle applies that mock the way jest does. - rc: 1 of 1, by exit code. rc's suite is one script of bare assertions with no reporter, so the grade is one bit: the script ran against seniority and exited 0. It is not 100% of anything.
- cosmiconfig: 242 of 243, the same count the real cosmiconfig gets here. YAML files are
read with
seniority/yaml, the package's own parser, loaded on the first YAML file. The 54 YAML cases that failed until 2026-09-30 pass, all 22 ofimport.test.tsamong them. So does the XDG pair that registers only on Linux: the global config directory is read fromXDG_CONFIG_HOMEas cosmiconfig reads it. The one not passing isindex.test.ts, which imports cosmiconfig's entry by a file path and fails for the control too. - dotenv: 197 of 197, the same count the real dotenv gets here. The suite runs under
node-tap, which counts assertions, so 197 is assertions. It spawns
dotenv runand programs thatimport 'dotenv/config', and seniority answers both. dotenv 17.4.2's suite is graded and not claimed: 107 of 141, the 34 being the vault, the tips and the log line 18 moved to stderr.
Known differences
- No YAML, and no INI. The cosmiconfig and rc drop-ins read JSON (rc's with comments) and refuse YAML and INI by name, with a hint naming the argument that supplies a parser.
seniority/dotenvwritesprocess.envonly when you give it nothing else. PassprocessEnvand it fills that object instead.- No vault.
.env.vault,DOTENV_KEYanddecryptare not implemented, because dotenv 18 removed them. - seniority's own API is stricter than the drop-ins.
resolvereads only declared options from the environment and refuses unclear booleans.seniority/rckeeps rc's behaviour, which is to take every<name>_variable.
Moving one import
- import { cosmiconfig } from 'cosmiconfig';
+ import { cosmiconfig } from 'seniority';- import { lilconfig } from 'lilconfig';
+ import { lilconfig } from 'seniority/lilconfig';npx burgee migrate --dry-run lists every import it would rewrite, and rewrites only drop-ins
graded level with their incumbent, which here means lilconfig and rc.
Incremental migration moves from a drop-in to resolve.
Why seniority
seniority against cosmiconfig, lilconfig, dotenv and rc, one capability per row, every cell linked to the test, grade or source that proves it — including YAML, which it deliberately leaves to a loader you pass.
Coming from cosmiconfig
A cosmiconfig alternative with zero dependencies: import { cosmiconfig } from seniority, graded 242 / 243 by cosmiconfig's own suite, level with cosmiconfig itself — with provenance, so every resolved value can say where it came from, as text, --json data or an agent event.