Compatibility
How caique's drop-ins are graded — @inquirer/core's own suite at 46 / 46, @inquirer/prompts' at 222 / 222, and @clack/prompts' behavioural cases at 16 / 16 — and the differences that remain.
caique/inquirer and caique/clack 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.
| Capability | caique | inquirer-core | clack |
|---|---|---|---|
| Compatibility | |||
Passes @inquirer/core's own test suitecaique/inquirer — createPrompt, the hooks and the keypress helpers — is graded by @inquirer/core 12.0.3's own tests, unedited, rendered through a headless terminal. | caique: yes47 / 47 of its own tests | inquirer-core: yesits own suite, the control run | clack: does not applya different API |
Passes clack's own test suitecaique/clack is graded by the behavioural cases of @clack/prompts 1.8.1's own suite, with the snapshots of clack's exact frames subtracted by name, and one case that grades @clack/core's module state rather than @clack/prompts (D-20260930-caique-clack-core-exclusion). | caique: yes23 / 23 of its own tests | inquirer-core: does not applya different API | clack: yesits own suite, the control run |
Compatibility
Passes @inquirer/core's own test suite
caique/inquirer—createPrompt, the hooks and the keypress helpers — is graded by @inquirer/core 12.0.3's own tests, unedited, rendered through a headless terminal.inquirer-core- inquirer-core: yesits own suite, the control run
Passes clack's own test suite
caique/clackis graded by the behavioural cases of @clack/prompts 1.8.1's own suite, with the snapshots of clack's exact frames subtracted by name, and one case that grades @clack/core's module state rather than @clack/prompts (D-20260930-caique-clack-core-exclusion).inquirer-core- inquirer-core: does not applya different API
The counts are compat-oracle's baselines, the pass count each drop-in is held to. The family's compatibility page is generated from the oracle's last run and is the authority for the current figures.
| incumbent | graded version | drop-in | cases |
|---|---|---|---|
@inquirer/core | 12.0.6 | caique/inquirer | 46 / 46 |
@inquirer/prompts | 8.7.5 | caique/inquirer/prompts | 222 / 222 |
@clack/prompts | 1.8.1 | caique/clack | 16 / 16 |
How a suite is graded
- The incumbent's repository is cloned at the release tag and its test directory copied into
packages/compat-oracle/vendor/.PROVENANCEnames the tag, the commit and the command that reproduces it. - The only edit is the import that reaches the library, rewritten to a shim generated per run. Assertions and fixtures are upstream's, byte for byte.
- A control run points the shim at the real incumbent first, which proves the harness and sets the total every rate is measured against.
- The target run points the same shim at caique's path.
@inquirer/core: the loop, not the drawing
@inquirer/testing renders through a headless terminal and asserts the screen, so the 41 grade
hooks keeping their place across re-renders, keypresses that stop the instant a prompt settles,
an effect cleanup that throws superseding the answer, and an aborted signal still restoring the
cursor — behaviour a second implementation can share. usePagination is not implemented, and
no case in the suite reaches it.
@clack/prompts: 16 behavioural cases
289 of clack's 444 assertions are snapshots of clack's exact frames, in 17 of its 19 files.
Matching them frame for frame would make caique/clack clack, so they are subtracted by name,
as a declared subset. caique/clack passes all of limit-options.test.ts and the two
guide.test.ts cases that render all twelve prompts with and without the guide.
One more case is subtracted, by its exact title. It calls
updateSettings({ withGuide: false }) imported from @clack/core and asserts the prompts
obey it. That is module-level state inside @clack/core, a package caique does not depend on
and cannot read, so the case grades @clack/core and not @clack/prompts. caique/clack
exports its own updateSettings, as @clack/prompts does, and its prompts obey that one. The
subtraction is published on the compatibility page. The row reads 16 / 16, level with clack's
own 16 / 16, so burgee migrate rewrites @clack/prompts to caique/clack. It leaves a file
that imports box, progress or taskLog on clack.
Known differences
caique/clack's frames are clack's layout, not its bytes. A test of yours that snapshots clack's output will see different escape sequences.updateSettingsmust come fromcaique/clack, as above.burgee migratedoes not rewrite@clack/core. It refuses a file that imports both@clack/promptsand@clack/core(reasonsibling-state), with the fix: importupdateSettingsfromcaique/clack, then run it again. It reads one file at a time, so anupdateSettingsfrom@clack/corein a file with no clack prompts is not caught. Move that import yourself.caique/clackdoes not buildbox,progressortaskLog; no graded case reaches them.caique/inquirerhas nousePagination.- The legacy
inquirerpackage is not a drop-in: its object API is out of scope, andcaique/inquireris@inquirer/core's surface.
Why caique
caique against inquirer and clack, one capability per row, every cell linked to the test, grade or source that proves it.
Coming from inquirer
An inquirer alternative for prompts that never hang: caique/inquirer carries @inquirer/core's surface, graded 46 / 46 by its own suite — and caique's prompts are flags first, so a non-TTY caller gets an error naming the flag instead of a hang.