C.W.K.
Stream
Lesson 04 of 05 · published

터미널은 일등 타깃이야

~11 min · terminal-profile, coding-agents, safety, bracketed-paste

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"텍스트 필드에선 잘못된 붙여넣기가 창피해. 터미널에선 잘못된 붙여넣기가 실행돼."

왜 터미널이 특별한가

Terminal, iTerm, VS Code 나 Cursor 내장 터미널, 또는 Codex 나 Claude Code 같은 코딩-에이전트 CLI 에 받아쓰는 건 일등 사용 사례야 — 아빠는 그것들에서 하루 종일 살아. 근데 터미널은 범용 텍스트 필드가 아냐. 거기 붙여넣은 텍스트는 실행될 수 있어. 실행 전에 못 읽는 큰 숨은 붙여넣기 블록은 잘해야 적대적이고 나빠야 위험해. 그래서 Firekeeper 는 터미널한테 Mail 작성 창과 다른 규칙의 자기 삽입 프로파일을 줘.

터미널 프로파일 규칙

타깃을 터미널로 감지하고(번들 id 로 — Terminal, iTerm2, Ghostty, 에디터-내장 터미널, 에이전트 CLI) 동작을 바꿔:

  • 짧은 단일-줄 받아쓰기: 평범하게 붙여넣기.
  • 길거나 여러-줄 받아쓰기: 보이고 편집 가능하게 유지 — 명시적 '터미널로 보내기' 있는 프리뷰 오버레이, 또는 느린/줄별 삽입, 또는 타깃이 지원하면 bracketed-paste-인식 삽입.
  • 긴 터미널 받아쓰기 후 Enter 를 절대 자동으로 안 누름, 유저가 명시적으로 '엔터 쳐' 라고 말하고 그 동작을 켜지 않는 한.

Enter 규칙이 하중 받는 거야: 자동 실행되는 받아쓰기는 다 생각 안 끝낸 명령을 돌릴 수 있는 받아쓰기야.

범용 텍스트 필드:  텍스트 붙여넣기 -> 완료
터미널 프로파일:    터미널 감지
                     -> 짧아? 붙여넣기
                     -> 길어? 프리뷰 / 청크 / bracketed-paste, 편집 가능 유지
                     -> 말한 '엔터 쳐' 그리고 켜졌을 때만 Enter

작업 루프 존중

더 깊은 생각은 유저의 실제 워크플로 존중이야. 코딩 에이전트에 긴 프롬프트를 받아쓰는 개발자는 보내기 전에 보고 편집 하고 싶어 — 그게 도구가 루프랑 싸우는 대신 맞는 방식이야. Wispr Flow 가 이걸 알아냈고; Firekeeper 는 이걸 있으면 좋은 게 아니라 설계 요구사항으로 다뤄. 터미널 프로파일이 '받아쓸 수 있어' 를 '내 실제 개발 환경에 안전하게 받아쓸 수 있어' 로 바꾸는 거야.

앱이 자기 주도로 터미널에 Enter 를 절대 합성하지 마. 터미널 받아쓰기 후 Enter 자동 누름은 반쯤 만든 명령을 실행할 수 있어. 합성된 Enter 로 가는 유일한 경로는 유저가 설정 켠 채 명시적으로 '엔터 쳐' 문구를 말하는 것 — 의도적 신호 둘, 절대 추론 아님. 의심스러우면, 커서를 텍스트 끝에 두고 사람이 누르게 둬.
번들 id 로 타깃 카테고리를 감지하고, 그다음 특화해. 최전면 앱의 번들 식별자는 삽입 프로파일을 고르는 안정적이고 싼 신호야. 알려진 터미널과 코딩-에이전트 번들 id 집합을 유지하고, 타깃이 맞으면 조심스러운 프로파일로 전환해. 미상 앱은 터미널 게 아니라 안전한 범용 경로를 받아.

Code

터미널은 조심스러운 프로파일을 받고, Enter 는 절대 추론 안 함·swift
let terminalBundles: Set<String> = [
    "com.apple.Terminal", "com.googlecode.iterm2", "com.mitchellh.ghostty",
    "com.microsoft.VSCode", "com.todesktop.230313mzl4w4u92" /* Cursor */,
    // ...감지 가능한 코딩-에이전트 CLI 들도
]

func insertInto(_ t: TargetSnapshot, text: String, spokeEnter: Bool, enterEnabled: Bool) async {
    if terminalBundles.contains(t.appBundleID) {
        if text.isMultiline { await previewThenSend(text, into: t) }  // 보이고/편집 가능 유지
        else { await pasteInsert(text, into: t) }
        // Enter 는 명시적 말한 명령 그리고 설정 켜짐 둘 다 필요.
        if spokeEnter && enterEnabled { await synthesizeReturn() }
    } else {
        await insertAtomic(text, into: t)   // 범용 안전 경로
    }
}

External links

Exercise

텍스트를 삽입하는 게 평범한 텍스트 필드와 다른 결과를 내는 타깃 셋을 나열해(터미널, 스프레드시트 수식 입력줄, Enter 로 보내는 채팅 입력). 각각에 대해, 위험한 기본 동작이 뭐고, 거기서 받아쓰기를 안전하게 하려고 어떤 특화 규칙을 더할래?
Hint
패턴은: 타깃이 삽입된 텍스트를 그냥 담는 것 너머로 뭘 하는지 식별 — 실행(터미널), 평가(수식 입력줄), 전송(Enter-채팅). 특화 규칙은 늘 제일 되돌릴 수 없는 결과를 제약해: 자동 실행 마, 자동 평가 마, 자동 전송 마. 타깃 카테고리를 감지하고 사람이 할 때까지 위험한 마지막 단계를 보류해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.