* feat: 第一版大重构 * fix: 修复类型问题 * chore: 更新版本到 1.3.2 * Add brave as alternative WebSearchTool * fix: 修正顺序 * fix: 修复对穷鬼模式的 auto dream 和 session memory 越过 * feat: 穷鬼模式去除 session-summary * feat: 创建 builtin-tools 包,搬运所有工具实现 将 src/tools/ 下的全部 60 个工具目录迁移至 packages/builtin-tools/src/tools/, 内部导入路径已更新为 src/ alias 模式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 更新 src/ 中所有工具引用至 builtin-tools 包,删除 src/tools/ - src/tools.ts 及 178 个 src/ 文件的 import 路径从 ./tools/ 改为 builtin-tools/tools/ - 删除 src/tools/ 整个目录(已迁移至 packages/builtin-tools/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 builtin-tools 路径别名至 tsconfig,更新 bun.lock - tsconfig.json 新增 builtin-tools/* 和 builtin-tools 路径映射 - 新增 packages/builtin-tools/src 至 include Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 为 builtin-tools、mcp-client、agent-tools 添加 @claude-code-best 作用域前缀 所有包名及 import 路径统一添加 @claude-code-best/ 前缀: - builtin-tools → @claude-code-best/builtin-tools - mcp-client → @claude-code-best/mcp-client - agent-tools → @claude-code-best/agent-tools Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复 node 环境没有 bun 的问题 --------- Co-authored-by: Eric-Guo <eric.guocz@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
6.4 KiB
Chapter 3: Text & Styling
Text Component
Text renders styled text content. It supports colors, emphasis, and text wrapping.
import { Text } from '@anthropic/ink'
<Text bold color="success">Operation complete</Text>
Text Props
| Prop | Type | Default | Description |
|---|---|---|---|
color |
keyof Theme | Color |
- | Foreground color |
backgroundColor |
keyof Theme |
- | Background color (theme-aware) |
bold |
boolean |
false |
Bold text |
dimColor |
boolean |
false |
Dim text (uses theme's inactive color) |
italic |
boolean |
false |
Italic text |
underline |
boolean |
false |
Underlined text |
strikethrough |
boolean |
false |
Strikethrough text |
inverse |
boolean |
false |
Swap foreground/background |
wrap |
TextWrap |
'wrap' |
Wrapping/truncation mode |
children |
ReactNode |
- | Text content |
Note:
boldanddimColorare mutually exclusive (ANSI terminals cannot render both simultaneously).
BaseText vs ThemedText
BaseText-- Accepts rawColorvalues onlyText(default export) -- Theme-aware, acceptskeyof Theme | Colorforcolor, andkeyof ThemeforbackgroundColor
// Raw color
<BaseText color="rgb(255,0,0)">Red text</BaseText>
// Theme key (resolved to current theme palette)
<Text color="error">Error message</Text>
// Mixed
<Text color="#FF0000">Custom red</Text>
Text Wrap Modes
<Text wrap="wrap">...</Text> // Word-wrap at container width (default)
<Text wrap="wrap-trim">...</Text> // Wrap + trim trailing whitespace
<Text wrap="end">...</Text> // Truncate with "..." at end
<Text wrap="truncate-end">...</Text> // Same as "end"
<Text wrap="truncate">...</Text> // Truncate (no ellipsis)
<Text wrap="middle">...</Text> // "start...end"
<Text wrap="truncate-middle">...</Text> // Same as "middle"
<Text wrap="truncate-start">...</Text> // "...text"
TextHoverColorContext
Uncolored Text children inherit a hover color from context:
import { TextHoverColorContext } from '@anthropic/ink'
<TextHoverColorContext.Provider value="suggestion">
<Text>Uncolored text gets the suggestion color</Text>
<Text color="error">This stays red</Text>
</TextHoverColorContext.Provider>
Precedence: explicit color > TextHoverColorContext > dimColor.
Color System
Raw Color Formats
Four formats are supported for raw color values:
// RGB
<Text color="rgb(255,107,128)">Bright red</Text>
// Hex
<Text color="#FF6B80">Bright red</Text>
// ANSI 256-color
<Text color="ansi256(196)">Red from 256-color palette</Text>
// Named ANSI 16-color
<Text color="ansi:red">Red</Text>
<Text color="ansi:greenBright">Bright green</Text>
ANSI Named Colors
Full list of ansi: prefixed names:
| Name | Color |
|---|---|
ansi:black |
Black |
ansi:red |
Red |
ansi:green |
Green |
ansi:yellow |
Yellow |
ansi:blue |
Blue |
ansi:magenta |
Magenta |
ansi:cyan |
Cyan |
ansi:white |
White |
ansi:blackBright |
Dark gray |
ansi:redBright |
Bright red |
ansi:greenBright |
Bright green |
ansi:yellowBright |
Bright yellow |
ansi:blueBright |
Bright blue |
ansi:magentaBright |
Bright magenta |
ansi:cyanBright |
Bright cyan |
ansi:whiteBright |
Bright white |
Utility Functions
color(colorValue, themeName, type?)
Curried theme-aware color function. Resolves theme keys to raw color values.
import { color } from '@anthropic/ink'
const paint = color('error', 'dark') // Returns (text: string) => string
console.log(paint('failed')) // 'failed' wrapped in ANSI red codes
const paintFg = color('rgb(255,0,0)', 'dark', 'foreground')
const paintBg = color('success', 'dark', 'background')
Parameters:
c--keyof Theme | Color | undefined-- Theme key or raw colortheme--ThemeName-- Current themetype--'foreground' | 'background'(default'foreground')
stringWidth(text)
Measures the visual width of a string in terminal columns, accounting for:
- CJK characters (2 columns each)
- Emoji (2 columns each)
- ANSI escape sequences (0 columns)
import { stringWidth } from '@anthropic/ink'
stringWidth('hello') // 5
stringWidth('你好') // 4
stringWidth('\x1b[31mhi') // 2 (ANSI codes ignored)
wrapText(text, width, textWrap)
Wraps text to a given width with the specified wrapping mode.
import { wrapText } from '@anthropic/ink'
wrapText('Hello World', 5, 'wrap') // 'Hello\nWorld'
wrapText('Hello World', 8, 'end') // 'Hello...'
wrapAnsi(text, width)
Wraps text containing ANSI escape codes while preserving styling.
import { wrapAnsi } from '@anthropic/ink'
wrapAnsi('\x1b[31mHello World\x1b[0m', 5)
// Wraps at word boundaries, keeps color codes intact
measureElement(node)
Measures a rendered DOM element's dimensions.
import { measureElement } from '@anthropic/ink'
const { width, height } = measureElement(domElement)
Link Component
Renders an OSC 8 terminal hyperlink (clickable URL in supported terminals).
import { Link } from '@anthropic/ink'
<Link url="https://example.com">
<Text underline color="suggestion">example.com</Text>
</Link>
Props:
url--string(required) -- Target URLchildren--ReactNode-- Display contentfallback--ReactNode-- Shown when hyperlinks are unsupported
RawAnsi Component
Renders pre-formatted ANSI strings directly into the layout.
import { RawAnsi } from '@anthropic/ink'
<RawAnsi
lines={['\x1b[31mRed line 1\x1b[0m', '\x1b[32mGreen line 2\x1b[0m']}
width={40}
/>
Props:
lines--string[]-- Pre-rendered ANSI lines (one terminal row each)width--number-- Column width the producer wrapped to
Border Rendering
renderBorder(box, output, options?)
Low-level border rendering function used internally by Box.
import { renderBorder } from '@anthropic/ink'
import type { BorderTextOptions } from '@anthropic/ink'
Border styles available (from cli-boxes):
single-- Thin lines─│┌┐└┘double-- Double lines═║╔╗╚╝round-- Rounded corners─│╭╮╰╯bold-- Bold lines━┃┏┓┗┛singleDouble-- Single horizontal, double verticaldoubleSingle-- Double horizontal, single verticalclassic-- ASCII─|++++