Problem
jinks update --sync -y <abbrev> (v2.4.0) crashes in a non-interactive/headless shell as soon as it hits its first conflict-classified file:
? Conflicts detected. Resolve conflicts? (Y/n)
file:///.../node_modules/@teipublisher/jinks-cli/node_modules/@inquirer/core/dist/lib/create-prompt.js:67
reject(new ExitPromptError(`User force closed the prompt with ${code} ${signal}`));
^
ExitPromptError: User force closed the prompt with 0 null
-y/--confirm-breaking does not cover this prompt — per --help it only concerns breaking profile-version changes.
-q/--quiet (documented as "Do not print banner") turns out to also suppress this prompt — but by silently defaulting it to "yes, overwrite everything," not by skipping it. Verified with a live A/B test (same command, only -q added/removed, stdin closed to simulate a headless shell):
- Without
-q: crashes as above, after already syncing the non-conflicting update-type files.
- With
-q: completes with no prompt, but every conflict-type file (local content differs from both the last-recorded generated version and the newly generated one — the CLI's own signal that the file likely carries real developer customizations) gets overwritten right alongside the harmless ones, with no confirmation and nothing logged about what was clobbered.
So today, the interactive prompt (when it doesn't crash) is the only thing standing between a real local customization and a silent overwrite. In a headless/CI-style invocation — the exact context where nobody is watching the terminal to catch it — that protection currently either crashes the process or, if worked around with -q, silently disappears.
Requested feature
A non-interactive way to decline conflicts instead of only being able to crash or accept all:
--skip-conflicts: sync the non-conflicting update files, leave every conflict-flagged file untouched, and report which files were skipped (path + source) so the caller can resolve them separately — e.g. the same table update/conflict classification already printed, but as the final summary instead of (or in addition to) the pre-sync preview.
- Optionally, a
--dry-run / report-only mode that prints the update/conflict table without writing anything, so a script can inspect it before deciding how to proceed.
Either would let jinks update --sync be used safely from a script or CI job without risking silent data loss on files that already carry real customizations.
Environment
- jinks-cli 2.4.0 (installed via npm,
@teipublisher/jinks-cli)
- Node.js 24.12.0
- Reproduced against a fresh eXist-db devcontainer (TEI Publisher 10 / jinks generator backend)
Happy to share the exact repro command/output privately if useful — trimmed identifying details (server URL, app name) from this report.
Problem
jinks update --sync -y <abbrev>(v2.4.0) crashes in a non-interactive/headless shell as soon as it hits its firstconflict-classified file:-y/--confirm-breakingdoes not cover this prompt — per--helpit only concerns breaking profile-version changes.-q/--quiet(documented as "Do not print banner") turns out to also suppress this prompt — but by silently defaulting it to "yes, overwrite everything," not by skipping it. Verified with a live A/B test (same command, only-qadded/removed, stdin closed to simulate a headless shell):-q: crashes as above, after already syncing the non-conflictingupdate-type files.-q: completes with no prompt, but everyconflict-type file (local content differs from both the last-recorded generated version and the newly generated one — the CLI's own signal that the file likely carries real developer customizations) gets overwritten right alongside the harmless ones, with no confirmation and nothing logged about what was clobbered.So today, the interactive prompt (when it doesn't crash) is the only thing standing between a real local customization and a silent overwrite. In a headless/CI-style invocation — the exact context where nobody is watching the terminal to catch it — that protection currently either crashes the process or, if worked around with
-q, silently disappears.Requested feature
A non-interactive way to decline conflicts instead of only being able to crash or accept all:
--skip-conflicts: sync the non-conflictingupdatefiles, leave everyconflict-flagged file untouched, and report which files were skipped (path + source) so the caller can resolve them separately — e.g. the same tableupdate/conflictclassification already printed, but as the final summary instead of (or in addition to) the pre-sync preview.--dry-run/ report-only mode that prints the update/conflict table without writing anything, so a script can inspect it before deciding how to proceed.Either would let
jinks update --syncbe used safely from a script or CI job without risking silent data loss on files that already carry real customizations.Environment
@teipublisher/jinks-cli)Happy to share the exact repro command/output privately if useful — trimmed identifying details (server URL, app name) from this report.