跳转到使用指南
ink作者 Google Labs

Ink Skill.

Claude Code 和 Codex 的 UI 设计 skill:将 JSON 规格渲染为交互式终端 UI(使用 Ink)。

  • Web & UI
  • 终端 UI
google-labs-code/design.md · .agents/skills/ink/SKILL.mdSKILL.md
--- name: ink description: Ink terminal renderer for json-render that turns JSON specs into interactive terminal UIs. Use when working with @json-render/ink, building terminal UIs from JSON, creating terminal component catalogs, or rendering AI-generated specs in the terminal. --- ## Quick Start ## Spec Structure (Flat Element Map) ## Standard Components ## Visibility Conditions ## Dynamic Prop Expressions ## Event System
从上游文件读取的前言和章节标题(2026-09-14)· 完整内容 9,805 字符

01 功能说明

ink Skill 在 Claude Code 和 Codex 中的作用

摘要、工作流与产物,均读自该 skill 的 SKILL.md。

来自 SKILL.md读取于 2026-09-14 · 非实际运行记录

以 skill 自身的术语

该 skill 涵盖 @json-render/ink,一个 Ink 终端渲染器,可将 JSON 规格转换为具有数据绑定、可见性、动作和动态 props 的交互式终端组件树。文中介绍了如何使用 zod 从 Ink schema 定义 catalog,仅将自定义组件注册到 registry 中,并在 JSONUIProvider 内使用 Renderer 进行渲染,或使用更高层的 createRenderer 和 standardComponents。

读者将学习扁平元素映射规格格式(含 root key)、标准布局、内容与交互组件集合、状态与绑定表达式、事件系统以及内置的 setState、pushState 和 removeState 动作、repeat 列表、通过 useUIStream 实现的 JSONL 流式传输、provider 的作用、关键导出内容,以及诸如 80-120 列宽等终端设计规范。

它产出什么

  • 由 JSON 规格渲染出的交互式终端组件树。
  • 根据 catalog 生成的、用于规格编写的 AI 系统提示词。
  • 一个与框架无关的内存中 StateStore,用于驱动重新渲染。
查看示例提示词 ↗

工作方式

  1. 01
    从 Ink Schema 定义 Catalog

    从 @json-render/core 导入 defineCatalog,并传入 Ink schema 以及你想要允许的组件和动作定义。

  2. 02
    仅注册你的自定义组件

    defineRegistry 接收 catalog,但标准组件实现已内置,因此只需将自定义组件映射到 Ink 元素。

  3. 03
    将 Renderer 包裹在 Providers 中

    JSONUIProvider 为 Renderer 提供状态、可见性、动作和焦点上下文,Renderer 则接收规格和 registry。

  4. 04
    以扁平元素映射的形式编写规格

    规格中包含一个指定首个元素名称的 root key,以及一个由带有 props、children 和可选事件绑定的类型化节点组成的 elements map。

  5. 05
    使用表达式绑定 Props

    任何 prop 值都可以在渲染时从状态、repeat 项、条件或字符串模板中解析,而不必硬编码。

  6. 06
    渐进式流式传输规格

    useUIStream 从 API 端点消费 JSONL patch 流,并向调用方暴露 spec、send 和 isStreaming。

02 找到适合场景

何时使用 ink Skill

当任务是此类 UI 设计时,在 Claude Code 或 Codex 中使用 ink skill。下方的适用范围和限制取自该 skill 自身的文件。

适合场景

  • 使用 @json-render/ink 从 JSON 规格构建终端 UI 的团队。
  • 除标准组件集之外还需要自己的终端组件 catalog 的项目。
  • 在终端而非浏览器中渲染 AI 生成的规格。
  • 带有输入框、选择器、开关和确认提示的交互式终端表单。
  • 将从 API 端点生成的规格逐步流式传输到终端中。

了解边界

  • 这不是浏览器或 React DOM 渲染器;其输出是 Ink 终端组件树。
  • 不推荐使用宽的横向主布局,应优先采用垂直结构。

需要提供的信息

  • 一个 JSON specRenderer 会收到 spec 对象,以及用于解析组件的 registry。
  • 一个 catalogcreateRenderer 基于一个 catalog 模块构建,该模块与 standardComponents 以及任何 overrides 一起被展开。
  • 组件实现自定义组件在 defineRegistry 中映射为 Ink 函数,并从 spec 接收 props。
  • 自定义组件 schema每个自定义组件条目都使用 zod object 声明其 props,从而使 catalog 保持类型安全。
  • 初始状态值受控状态(例如当前激活的标签)会以 state prop 的形式传递给 renderer。

03 Skill 内部

ink Skill 给 Claude Code 和 Codex 的规则

SKILL.md 为 Agent 设定的 8 条具体指令、默认值与限制——文件中真正改变结果的部分。

  1. 布局默认按行排列

    使用 Box 进行布局,配合 flexDirection、padding 和 gap;如果不设置,flexDirection 默认是 row,这会让期望 column 的人感到意外。

  2. 双向绑定不使用 statePath

    组件不应使用 statePath prop 进行绑定;应将绑定表达式放在表单组件的自然值 prop 上。

  3. Newline 只能放在 column Box 内

    Newline 组件用于插入空行,必须放置在 flexDirection 为 column 的 Box 内。

  4. 为 80-120 列宽设计

    终端宽度大约为 80-120 列,因此主结构应优先使用 flexDirection 为 column 的垂直布局。

  5. 使用命名的终端颜色

    颜色应来自命名的终端调色板:red、green、yellow、blue、magenta、cyan、white、gray。

  6. 外部 Store 会覆盖 Props

    当一个 StateStore 被传递给 StateProvider 或 JSONUIProvider 时,initialState 和 onStateChange 会被忽略,因此该 store 是唯一的数据源。

  7. 用于分组的 borderStyle

    使用 Box 上的 borderStyle prop 进行视觉分组;该文件将 single、double、round 和 bold 列为可选项。

  8. Tabs 驱动多视图布局

    对于多视图 UI,使用 Tabs 并将可见条件绑定到子内容上,而不是渲染独立的 spec。

04 投入使用

在 Claude Code 或 Codex 中安装 ink

一条 npx skills add 命令,然后在你的 Agent 中执行第一个任务和对结果的清单检查。

将 ink 添加到 Claude Code、Codex 或你的 Agent

在你的项目中运行;安装程序会询问要把它添加到哪个 Agent。

Terminal
npx skills add https://github.com/google-labs-code/design.md --skill ink

用于 .agents/skills/ink/SKILL.md 的通用 skills CLI 形式;该仓库可能会自行记录其路径。

给 Skill 一个首次 UI 设计任务

按 skill 自身的术语撰写;把括号中的部分换成你的内容。

Starter prompt
Build a terminal dashboard spec for [project name] using the Ink schema. Use a Box with flexDirection column containing a Heading, a Divider, a Table of [rows], and a StatusLine. Add a Tabs component bound with $bindState to /activeTab, show each view through a visible condition, and wire a ConfirmInput to a setState action that flips /confirmed.

来源:依据 SKILL.md,按 skill 自身的术语撰写。

检查首次结果

SKILL.md 本身如何描述正确的结果:

  • 使用 flatToTree 转换扁平元素映射,以确认每个元素都能解析到该树中。
  • 在验证绑定是否指向正确路径时,使用 useStateValue 读回单个值。
  • 依靠 VisibilityProvider 的状态驱动渲染,确认条件区块确实会切换。
  • 写入外部 store,并确认终端会自动重新渲染。
  • 验证双向绑定是否通过带有 $bindState 或 $bindItem 表达式的 useBoundProp 进行。
  • 检查 ProgressBar 的值是否保持在 0-1 范围内。

在 OpenDesign 中从其 SKILL.md 链接导入 ink:Plugins → Add → Skill → Import from link,然后在顶部栏中选择它。

05 开源、可追溯

来源、许可与验证

本页面事实的来源,以及最后检查时间。

Skill 文件
.agents/skills/ink/SKILL.md 验证时记录的内容校验和;提交 9bf8eae
License
Apache-2.0 来自 LICENSE。
仓库星标数
27,894 GitHub 快照拍摄于 2026-09-14,针对整个 google-labs-code/design.md 仓库。不是 ink 的评分或使用数量。
已由 OpenDesign 验证
2026-09-14 已检查源文件、路径、许可文本和 star 数量。未内置在 OpenDesign 主程序(检查日期 2026-08-28);本页面未记录实际运行。

SKILL.md 内部

  1. 快速开始导入、创建 catalog、自定义组件注册表,以及被 provider 包裹的 Renderer。
  2. 规范结构(扁平元素映射)root 加上 elements 的 JSON 结构,包含带类型的节点、props 和 children。
  3. 标准组件列出布局、内容和交互组件,以及各自的事件、变体和选项。
  4. 可见性条件使用 $state、eq、not,以及 $and 和 $or 组合器的 visible 语法。
  5. 动态 Prop 表达式$state、$bindState、$bindItem、$cond 和 $template,以及 no-statePath 规则。
  6. 事件系统emit 触发命名事件,通过元素的 on 字段映射到 action。
  7. 内置 ActionsetState、pushState 和 removeState 会自动处理,并带有 statePath 参数。
  8. Repeat(动态列表)repeat 会渲染一个状态数组,子元素内部可使用 $item 和 $index。
  9. 流式渲染useUIStream 根据 JSONL 补丁流逐步渲染规范。
  10. Provider六个 provider,从 StateProvider 和 ActionProvider,到合并后的 JSONUIProvider。
  11. createRenderer(更高层级的 API)基于 catalog 创建一个组件,内置 standardComponents 和所有 provider。
  12. 终端 UI 设计指南关于布局、宽度、borderStyle、颜色、标题、标签页、sparkline 和图表的规范。
Skill 自身的描述
"Ink terminal renderer for json-render that turns JSON specs into interactive terminal UIs. Use when working with @json-render/ink, building terminal UIs from JSON, creating terminal component catalogs, or rendering AI-generated specs in the terminal."

来自 SKILL.md 的 front-matter 描述。完整文件约 9,805 个字符。在 GitHub 上阅读完整文件。

06 安装之前

关于 ink Skill 的常见问题

以下回答来自 2026-09-14 读取到的 SKILL.md,而非某次实际运行的记录。

规范长什么样?

它是一个扁平的元素映射:root 键指定第一个元素,elements 对象保存每个节点及其 type、props 和 children 数组。

我可以接入自己的状态管理吗?

可以。在受控模式下,向 StateProvider 或 JSONUIProvider 传入一个 StateStore,此时 initialState 和 onStateChange 会被忽略。

这个能在浏览器中渲染吗?

不能。它是一个 Ink 终端渲染器,所以生成的结果是一个交互式终端组件树,而不是 DOM 树。

模型能替我生成 spec 吗?

可以。./server 导出会把你的 catalog 转换为 AI 系统提示词,而 useUIStream 会在生成的 JSONL patch 到达时逐步流式渲染它们。

Ink

在真实 UI 设计任务上运行 ink。

下载 OpenDesign,从其 SKILL.md 链接导入 ink,粘贴上方提示词,在查看结果之前先阅读计划。

终端
npx skills add https://github.com/google-labs-code/design.md --skill ink

OpenDesign 桌面客户端

一套设计系统,让每一次创作都保持品牌一致

在完整的 Vibe Design Workspace 中,用同一套品牌规则生成网页、PPT、可交互原型、数据看板、图像与 HTML 视频。连接本地 Codex、Claude Code、Cursor 等编程助手,即可免费创作。

  • 覆盖网页、PPT、原型、数据看板、图像与视频
  • 140+ 设计系统,以及完整模板与技能库
  • 连接本地 Codex 与 21+ 款编程助手 · 免费使用
免费下载

支持 macOS 与 Windows