/Part 7: 인프라/터미널 UI 엔진
⚙️
Part 7고급⏱ 약 55분 · 2개 섹션

터미널 UI 엔진

React가 터미널을 만나면

터미널 UI 엔진 대표 이미지
이 챕터에서 배울 것
  • React Reconciler + Yoga WASM = Flexbox 터미널 레이아웃
  • 더블 버퍼링으로 깜빡임 방지
  • 마우스 트래킹, 텍스트 선택, 하이퍼링크 지원
전체 아키텍처에서 현재 위치
⚙️코어 엔진
🔧도구 시스템
🛡️보안
🧠컨텍스트
🤝멀티 에이전트
🌐생태계
인프라
1

Ink 렌더링 엔진

React → Yoga → ANSI → Terminal 파이프라인

ReconcilerYoga 레이아웃더블 버퍼링ANSI 코드|ink/ink.tsxink/renderer.tsink/dom.ts

Claude Code의 터미널 UI는 React + Yoga WASM 기반입니다. src/ink/ink.tsx가 렌더링 엔진의 핵심입니다.

src/ink/ink.tsx — 렌더링 파이프라인
1// src/ink/ink.tsx — Ink 렌더링 엔진
2
3import React from 'react'
4import type { FiberRoot } from 'react-reconciler'
5import reconciler from './reconciler.js'
6import renderNodeToOutput from './render-node-to-output.js'
7import { optimize } from './optimizer.js'
8import { writeDiffToTerminal } from './terminal.js'
9
10export default class Ink {
11 // 렌더링 파이프라인:
12 // 1. React Reconciler → DOM 트리 변환💡
13 // reconciler.updateContainer(element, rootNode)
14 //
15 // 2. Yoga 레이아웃 → Flexbox 계산💡
16 // yogaNode.calculateLayout(termWidth, termHeight)
17 //
18 // 3. renderNodeToOutput() → ANSI 코드 생성
19 // DOM 트리를 순회하며 ANSI 이스케이프 시퀀스 생성
20 //
21 // 4. optimize() → 프레임 최적화💡
22 // 이전 프레임과 diff하여 변경분만 추출
23 //
24 // 5. writeDiffToTerminal() → 화면 출력
25 // 변경된 영역만 터미널에 쓰기
26
27 // 더블 버퍼링:
28 // front frame (현재 화면) ↔ back frame (다음 화면)💡
29 // 전환 시 깜빡임 방지
30
31 // 마우스 트래킹 (mode-1003):
32 // ENABLE_MOUSE_TRACKING → 클릭 이벤트 수신
33 // AlternateScreen에서만 활성화
34
35 // Kitty 키보드 프로토콜:
36 // ENABLE_KITTY_KEYBOARD → 확장 키 입력
37 // Ctrl+C, 함수 키, 수정자 키 정확한 감지
38}
2

터미널 컴포넌트

Box, Text, Button, ScrollBox 등 기본 컴포넌트

Flex 레이아웃텍스트 스타일링스크롤포커스 관리|ink/components/Box.tsxink/components/Text.tsxink/components/ScrollBox.tsx

Ink 컴포넌트는 웹의 React 컴포넌트와 유사한 API를 제공합니다. Box<div>, Text<span>에 해당합니다.

src/ink/components/Box.tsx — 터미널 Flexbox
1// src/ink/components/Box.tsx — Flex 컨테이너
2
3export type Props = Styles & {
4 ref?: Ref<DOMElement>
5 tabIndex?: number // Tab/Shift+Tab 포커스 순서💡
6 autoFocus?: boolean // 마운트 시 자동 포커스
7 onClick?: (event: ClickEvent) => void // 마우스 클릭💡
8 onFocus?: (event: FocusEvent) => void // 포커스
9 onBlur?: (event: FocusEvent) => void // 블러
10 onKeyDown?: (event: KeyboardEvent) => void // 키보드
11
12 // Styles (Flexbox 속성)
13 // flexDirection, alignItems, justifyContent
14 // padding, margin, width, height
15 // borderStyle, borderColor
16 // overflow: 'hidden' | 'visible'
17}
18
19// 사용 예시:
20// <Box flexDirection="column" padding={1} borderStyle="round">
21// <Text color="green">성공!</Text>
22// <Box marginTop={1}>
23// <Text dimColor>2.3초 소요</Text>
24// </Box>
25// </Box>
26//
27// 터미널 출력:
28// ╭──────────╮
29// │ 성공! │
30// │ │
31// │ 2.3초 소요│
32// ╰──────────╯