Claude Code 및 기타 하네스를 위한 멀티 하네스 플러그인 마켓플레이스입니다.
한국어는 runchr 제공 번역입니다. 원문 README는 English tool page.
Inquirer.js
Inquirer.js는 Node.js에서 명령줄 인터페이스를 구축하기 위한 일반적인 대화형 CLI 프롬프트—input, select, checkbox 등—를 제공하는 TypeScript 라이브러리입니다.
- Install
- npm install @inquirer/prompts
프로젝트 README (번역)
GitHub ↗Written by the project's own authors, not by runchr. Snapshot taken 2026-10-30.
Inquirer
일반적인 대화형 명령줄 사용자 인터페이스 모음입니다.
직접 터미널에서 사용해 보세요!
npx @inquirer/demo@latest
설치
yarn
pnpm
yarn add @inquirer/prompts
pnpm add @inquirer/prompts
bun
deno
bun add @inquirer/prompts
deno add npm:@inquirer/prompts
npm
npm install @inquirer/prompts
Deno에서는 프롬프트가 환경에서 터미널의 유니코드 및 색상 지원을 감지하므로 스크립트를 --allow-env 옵션과 함께 실행하세요.
참고
Inquirer는 최근 패키지 크기를 줄이고 성능을 개선하기 위해 처음부터 다시 작성되었습니다. 이전 버전의 패키지는 여전히 유지 관리되고 있으며(적극적으로 개발되지는 않음), 최신 API로 마이그레이션되지 않았을 수 있는 수백 개의 커뮤니티 기여 프롬프트를 제공했습니다. 이것이 원하는 것이라면 이전 패키지는 여기에 있습니다.
사용법
import { input } from '@inquirer/prompts' ;
const answer = await input ( { message : 'Enter your name' } ) ;
프롬프트
Input
import { input } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Select
import { select } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Checkbox
import { checkbox } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Confirm
import { confirm } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Search
import { search } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Password
import { password } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Expand
import { expand } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Editor
임시 파일에서 사용자가 선호하는 편집기의 인스턴스를 실행합니다. 사용자가 편집기를 종료하면 임시 파일의 내용이 답변으로 읽힙니다. 사용되는 편집기는 $VISUAL 또는 $EDITOR 환경 변수를 읽어 결정됩니다. 둘 다 없으면 OS 기본값이 사용됩니다(Windows에서는 notepad, Mac 또는 Linux에서는 vim).
import { editor } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Number
input 프롬프트와 매우 유사하지만, 내장된 숫자 유효성 검사 구성 옵션이 있습니다.
import { number } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
Raw List
import { rawlist } from '@inquirer/prompts' ;
사용 예제 및 옵션 문서는 문서를 참조하세요.
국제화 (i18n)
영어 이외의 언어로 프롬프트가 필요하신가요? @inquirer/i18n 패키지는 내장 현지화 기능을 갖춘 @inquirer/prompts의 드롭인 대체품입니다.
루트 import는 LANGUAGE, LC_ALL, LC_MESSAGES, LANG 환경 변수에서 로케일을 자동으로 감지합니다(Intl API로 대체). 지원되는 로케일이 없으면 영어가 사용됩니다.
// 드롭인 대체품 — 로케일은 환경 변수에서 자동 감지됩니다
import { input , select , confirm } from '@inquirer/i18n' ;
내장 로케일에는 영어, 프랑스어, 스페인어, 중국어(간체), 포르투갈어가 포함됩니다. 하위 경로 import(예: @inquirer/i18n/fr)를 통해 특정 언어로 고정하거나, createLocalizedPrompts 및 registerLocale API를 사용하여 직접 추가할 수도 있습니다.
사용 가능한 언어와 사용자 정의 로케일 생성 방법은 전체 문서를 참조하세요.
나만의 프롬프트 만들기
API 문서는 여기에, 테스트 유틸리티는 여기에 있습니다.
고급 사용법
모든 inquirer 프롬프트는 2개의 인수를 받는 함수입니다. 첫 번째 인수는 프롬프트 구성(각 프롬프트마다 고유)입니다. 두 번째는 컨텍스트 또는 런타임 구성을 제공합니다.
컨텍스트 옵션은 다음과 같습니다:
속성
타입
필수
설명
input
NodeJS.ReadableStream
아니오
stdin 스트림 (기본값은 process.stdin)
output
NodeJS.WritableStream
아니오
stdout 스트림 (기본값은 process.stdout)
clearPromptOnDone
boolean
아니오
true이면 프롬프트에 답한 후 화면을 지웁니다
signal
AbortSignal
아니오
프롬프트를 비동기적으로 취소하는 AbortSignal
경고
입력 스트림을 제공하거나 process.stdin을 파이핑할 때는 inquirer 함수를 호출하기 전에 process.stdin.setRawMode(true)를 호출해야 할 가능성이 매우 높습니다. Node.js는 보통 자동으로 처리하지만, stdin을 가릴 때 Node가 추적을 잃고 그렇게 해야 한다는 것을 알지 못할 수 있습니다. 프롬프트가 대화형이 아니라면(화살표가 작동하지 않는 등) 이 때문일 가능성이 높습니다.
기존 node:readline 인터페이스에서 Inquirer를 실행할 때는 프롬프트를 시작하기 전에 readline 인스턴스를 일시 중지하고, 프롬프트가 완료된 후 다시 재개하세요. 이렇게 하면 process.stdin 소유권 이전이 명시적으로 이루어지고, 부모 readline 루프가 입력 스트림에 대한 제어를 잃지 않습니다.
const answer = await rl . question ( 'Command: ' ) ;
if ( answer === 'configure' ) {
rl . pause ( ) ;
try {
const value = await input ( { message : 'Configuration value' } ) ;
} finally {
rl . resume ( ) ;
}
}
예제:
import { confirm } from '@inquirer/prompts' ;
const allowEmail = await confirm (
{ message : 'Do you allow us to send you email?' } ,
{
output : new Stream . Writable ( {
write ( chunk , _encoding , next ) {
// Do something
next ( ) ;
} ,
} ) ,
clearPromptOnDone : true ,
} ,
) ;
프롬프트 취소
AbortController 또는 AbortSignal로 수행할 수 있습니다.
// 예제 1: 내장 AbortSignal 유틸리티 사용
import { confirm } from '@inquirer/prompts' ;
const answer = await confirm ( { ... } , { signal : AbortSignal . timeout ( 5000 ) } ) ;
// 예제 2: AbortController로 사용자 정의 취소 구현
import { confirm } from '@inquirer/prompts' ;
const controller = new AbortController ( ) ;
setTimeout ( ( ) => {
controller . abort ( ) ; // 프라미스를 거부합니다
} , 5000 ) ;
const answer = await confirm ( { ... } , { signal : controller . signal } ) ;
레시피
ctrl+c를 우아하게 처리하기
사용자가 ctrl+c를 눌러 프롬프트를 종료하면 Inquirer는 프롬프트 프라미스를 거부합니다. 이는 프로그램이 환경을 정리/해제할 수 있도록 하기 위한 예상된 동작입니다. async/await를 사용할 때 거부된 프라미스는 오류를 던집니다. 처리되지 않으면 해당 오류는 사용자의 터미널에 스택 트레이스를 출력합니다.
ExitPromptError: User force closed the prompt with 0 null
at file://example/packages/core/dist/esm/lib/create-prompt.js:55:20
at Emitter.emit (file://example/node_modules/signal-exit/dist/mjs/index.js:67:19)
at #processEmit (file://example/node_modules/signal-exit/dist/mjs/index.js:236:27)
at #process.emit (file://example/node_modules/signal-exit/dist/mjs/index.js:187:37)
at process.callbackTrampoline (node:internal/async_hooks:130:17)
이것은 좋은 UX가 아니므로, 이러한 오류를 우아하게 처리할 것을 강력히 권장합니다.
첫 번째 옵션은 데모 프로그램에서처럼 스크립트를 try/catch로 감싸는 것입니다. 또는 CLI 프레임워크 메커니즘에서 오류를 처리하세요. 예를 들어 Clipanion의 catch 메서드가 있습니다.
마지막으로, 이벤트 리스너로 전역에서 오류를 처리하고 무음 처리할 수 있습니다.
process . on ( 'uncaughtException' , ( error ) => {
if ( error instanceof Error && error . name === 'ExitPromptError' ) {
console . log ( '👋 until next time!' ) ;
} else {
// 알 수 없는 오류는 다시 던집니다
throw error ;
}
} ) ;
답변을 객체로 받기
많은 질문을 할 때 모든 곳에서 답변당 하나의 변수를 유지하고 싶지 않을 수 있습니다. 이 경우 답변을 객체 안에 넣을 수 있습니다.
import { input , confirm } from '@inquirer/prompts' ;
const answers = {
firstName : await input ( { message : "What's your first name?" } ) ,
allowEmail : await confirm ( { message : 'Do you allow us to send you email?' } ) ,
} ;
console . log ( answers . firstName ) ;
조건부로 질문하기
일부 질문은 다른 질문의 답변에 따라 달라질 수 있습니다.
import { input , confirm } from '@inquirer/prompts' ;
const allowEmail = await confirm ( { message : 'Do you allow us to send you email?' } ) ;
let email ;
if ( allowEmail ) {
email = await input ( { message : 'What is your email address' } ) ;
}
타임아웃 후 기본값 받기
import { input } from '@inquirer/prompts' ;
const controller = new AbortController ( ) ;
const timeout = setTimeout ( ( ) => {
controller . abort ( ) ;
} , 5000 ) ;
const clearInputTimeout = ( ) => clearTimeout ( timeout ) ;
process . stdin . once ( 'keypress' , clearInputTimeout ) ;
const answer = await input (
{ message : 'Enter a value (timing out in 5 seconds)' } ,
{ signal : controller . signal } ,
)
. catch ( ( error ) => {
if ( error . name === 'AbortPromptError' ) {
return 'Default value' ;
}
throw error ;
} )
. finally ( ( ) => {
clearInputTimeout ( ) ;
process . stdin . off ( 'keypress' , clearInputTimeout ) ;
} ) ;
pre-commit/git 훅 또는 스크립트로 사용하기
기본적으로 husky / lint-staged 같은 도구에서 실행되는 스크립트는 대화형 셸 내에서 실행되지 않을 수 있습니다. 비대화형 셸에서는 Inquirer가 실행될 수 없고, 사용자가 프로세스에 키 누름 이벤트를 보낼 수 없습니다.
작동하게 하려면 tty(또는 "대화형" 입력 스트림)를 시작해야 합니다.
이러한 스크립트가 package.json 내에 설정되어 있다면 스트림을 다음과 같이 정의할 수 있습니다:
"precommit" : " my-script < /dev/tty "
또는 셸 스크립트 파일에 있다면 다음과 같이 하세요: (Windows에서는 이것이 유일한 옵션일 가능성이 높습니다)
#! /bin/sh
exec < /dev/tty
node my-script.js
nodemon과 함께 사용하기
inquirer 프롬프트를 nodemon과 함께 사용할 때는 모든 것이 예상대로 작동하도록 --no-stdin 플래그를 전달해야 합니다.
npx nodemon ./packages/demo/demos/password.mjs --no-stdin
대부분의 경우 Node에 내장된 새로운 watch 모드를 사용할 수 있습니다. 이 모드는 inquirer와 함께 별도 설정 없이 작동합니다.
# 필요에 따라 하나 선택
node --watch script.js
node --watch-path=packages/ packages/demo/
구성 대기하기
일부 질문 구성은 값을 await해야 할 수 있습니다.
import { confirm } from '@inquirer/prompts' ;
const answer = await confirm ( { message : await getMessage ( ) } ) ;
bash 스크립트 내에서 npx와 함께 사용하기
npx를 통해 셸에서 직접 Inquirer 프롬프트를 사용할 수 있으며, 이는 빠른 스크립트나 package.json 명령에 유용합니다.
커뮤니티 라이브러리인 @inquirer-cli는 각 프롬프트를 독립 실행형 CLI로 노출합니다.
예를 들어 입력을 요청하려면:
name= $( npx -y @inquirer-cli/input -r " What is your name? " )
echo " Hello, $name ! "
또는 대화형 버전 범프를 만들려면:
$ npm version $( npx -y @inquirer-cli/select -c patch -c minor -c major ' Select Version ' )
자세히 알아보기: @inquirer-cli.
커뮤니티 프롬프트
멋진 프롬프트를 만들었다면 아래 목록에 추가하는 PR을 보내주세요!
Interactive List Prompt
화살표 키 + Enter로 선택하거나 선택지와 연결된 키를 눌러 선택합니다.
? Choose an option:
> Run command (D)
Quit (Q)
Action Select Prompt
목록에서 항목을 선택하고 키를 눌러 수행할 작업을 선택합니다.
? Choose a file Open <O> Edit <E> Delete <X>
❯ image.png
audio.mp3
code.py
Table Multiple Prompt
테이블 표시에서 여러 답변을 선택합니다.
Choose between choices ? (Press < space > to select, < Up and Down > to move rows,
< Left and Right > to move columns)
┌──────────┬───────┬───────┐
│ 1-2 of 2 │ Yes ? │ No ? |
├──────────┼───────┼───────┤
│ Choice 1 │ [ ◯ ] │ ◯ |
├──────────┼───────┼───────┤
│ Choice 2 │ ◯ │ ◯ |
└──────────┴───────┴───────┘
Toggle Prompt
토글로 확인합니다. 화살표 키 + Enter로 선택합니다.
? Do you want to continue? no / yes
Sortable Checkbox Prompt
내장 checkbox 프롬프트와 동일하지만 ctrl+up/down을 사용하여 선택지 순서를 변경할 수도 있습니다.
? Which PRs and in what order would you like to merge? (Press <space> to select, <a> to toggle all, <i> to invert selection, <ctrl+up> to move item up, <ctrl+down> to move item down, and <enter> to proceed)
❯ ◯ PR 1
◯ PR 2
◯ PR 3
Multi Select Prompt
다중 선택과 필터링/검색을 지원하는 inquirer select입니다.
? Choose your OS, IDE, PL, etc. (Press <tab> to select/deselect, <backspace> to remove selected
option, <enter>…
Other tools that do the same work
일상적인 엔지니어링 작업을 위한 에이전트 스킬.
Python과 .NET에서 프로덕션 AI 에이전트와 멀티 에이전트 워크플로를 구축하세요.
No comments yet.
to comment.