⚙️
Part 7고급⏱ 약 55분 · 2개 섹션
터미널 UI 엔진
React가 터미널을 만나면
✦이 챕터에서 배울 것
전체 아키텍처에서 현재 위치
⚙️코어 엔진
→🔧도구 시스템
→🛡️보안
→🧠컨텍스트
→🤝멀티 에이전트
→🌐생태계
→⚡인프라
1
Ink 렌더링 엔진
React → Yoga → ANSI → Terminal 파이프라인
ReconcilerYoga 레이아웃더블 버퍼링ANSI 코드|
ink/ink.tsxink/renderer.tsink/dom.tsClaude 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.tsxInk 컴포넌트는 웹의 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, justifyContent14 // padding, margin, width, height15 // borderStyle, borderColor16 // 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// ╰──────────╯