关于 lynx-openui
lynx-openui 是用于生成 Lynx 界面的有效 OpenUI Lang v0.5 程序的技能。它指导如何依据文档组件、已提供的工具和运行时参考编写内容,并校验完整程序或编辑补丁。
主要功能
- 01生成 OpenUI Lang v0.5
- 02依据组件目录生成内容
- 03Query 与 Mutation 使用规则
- 04完整程序和补丁工作流
- 05语法与引用校验
适用场景
- 01构建声明式 Lynx 界面
- 02用已提供的读取工具呈现数据
- 03添加明确触发的写入操作
- 04以补丁方式编辑现有程序
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lynx-community/ skills --skill lynx-openui安装后在 Claude Code 中输入/lynx-openui确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEagents/openai.yamlreferences/components.mdexamples.mdruntime.md详细介绍
生成 Lynx OpenUI 程序
生成有效的 OpenUI Lang v0.5,供
<OpenUiRenderer response={...}> 使用。请生成声明式 DSL,而非应用程序代码。
阅读参考资料
- 生成程序前,务必先阅读 components.md。将调用方提供的组件签名视为权威扩展或替代定义。
- 如果请求涉及状态、工具、实时数据、变更、操作、重复查询数据或编辑,请阅读 runtime.md。
- 对于复杂布局或工具工作流,请阅读 examples.md。请借鉴其中的模式,不要照搬无关内容。
工作流程
- 确定所需 UI、确切的活动组件目录、已配置的根组件、可用工具架构、由宿主提供的预取 Query 键、媒体 URL,以及宿主是否支持完整程序或
mergeStatements补丁。 - 选择数据模式:
- 对于自包含内容以及不存在工具的情况,使用静态值。
- 仅在调用方或宿主提供了实际读取工具时使用
Query。 - 仅在存在实际写入工具时使用
Mutation,并通过显式Action触发。
- 仅选择活动目录允许的组件和位置参数。将明确缩减的目录视为完整词汇表:其中未列出的内置组件不可用。存在宿主明确指定的根组件时,使用该组件;否则使用 Library 的默认
Stack根组件。 - 编写适合流式传输的图结构。对于完整程序,先写根组件,再写状态、查询或变更、结构组件,最后写叶子内容。对于编辑模式补丁,仅返回变更过的语句。
- 返回程序前,验证语法、引用、可达性、组件名称、参数顺序、工具名称和操作目标。
输出约定
- 仅返回 OpenUI Lang。不要返回 Markdown、代码围栏、说明文字、JSON、XML、HTML、JavaScript、TypeScript、JSX 或 CSS。
- 每行写一条赋值语句。
- 对于完整程序,第一条非空行必须将
root赋值为对宿主明确指定的根组件的调用,例如root = Shell(...)。 否则使用 Library 的默认root = Stack(...)。 - 默认返回完整程序。当调用方明确说明宿主使用编辑模式或
mergeStatements时,仅返回变更过的语句,并且只有在根图结构发生变化时才包含root。 - 如果请求需要不可用的组件或能力,请使用受支持的 OpenUI 组件给出简洁说明,不要杜撰语法。
语法规则
- 普通声明使用
identifier = Expression,可变状态使用$identifier = defaultValue。 - 按位置传递组件参数。绝不使用
gap: "m"之类的命名参数。 - 可选参数只能从末尾省略。设置靠后的参数时,必须为前面的每个位置提供有效值。
- 使用双引号字符串,并转义其中的引号和反斜杠。
- 使用引用或内联组件。根组件和主要区块优先使用引用,以便流式传输逐步呈现结构。
- 确保每个引用的标识符均已定义。确保除
root外的每条声明都能从root、从可由root到达的表达式,或从可由root到达的操作到达。 - 仅使用文档中定义的运算符、内置项、组件和操作步骤。
使用默认 Stack 根组件时,正确的位置布局:
root = Stack([header, content], "column", false, "l", "stretch", "start")
错误的位置布局:
root = Stack([header, content], "column", "l", "stretch")
错误写法将字符串传入 wrap,并导致后续所有属性的位置都发生偏移。
数据与交互规则
- 不要编造工具名称。如果未提供工具架构,请使用静态数据或提供说明性 UI。
- 为每个
Query提供一个符合真实工具数据结构的代表性默认结果,确保响应稳定后、请求解析前的首次同步渲染中,UI 就能正常显示。 - 当宿主提供预取的 Query 结果时,保留对应的 Query 赋值名称。这些名称是语句 ID 和预取键,不是工具名称。参见 runtime.md。
- 将
Query和Mutation声明在普通标识符上,绝不要使用$identifiers。 - 使用
@Each展示由查询结果驱动的重复 UI。将依赖循环变量的组件内联到@Each中。 - 仅从活动目录组件上的明确提交或确认操作触发写入操作。使用默认目录时,请使用
Button。不要将 mutation 绑定到输入项的变更操作。 - 当输入项必须更新
$variable时,请使用 runtime.md 中名称相同的name模式。不要编造事件值变量。 - 按有意设定的顺序执行多步操作。请记住,mutation 失败会停止剩余步骤。
- 使用
@ToAssistant继续对话;仅在 URL 由调用方提供或可信时使用@OpenUrl。 - 使用调用方提供的媒体 URL。不要伪造 CDN URL,也不要假设宿主会解析图片搜索字符串。
Lynx UI 规则
- 优先采用紧凑、移动端优先且组件树层级较浅的布局。
- 仅当活动目录中存在相关组件时,才应用组件专属偏好;否则遵循提供的自定义签名。
- 使用默认目录时,普通的垂直结构请用
Stack或Column,小型水平分组请用Row,分组或重复内容请用List。 - 当存在
Image时,优先使用明确的变体,以便 Lynx 渲染器获得具体的尺寸信息。 - 使用默认目录时,请将可读文本放在
Text或TextContent中;不要输出原始 Lynx 元素。 - 如果可用,请使用
Tabs展示不同视图,并使用Modal展示点击打开的详情。先传入模态框触发器,再传入内容;不要同时将触发器作为同级组件渲染。
最终验证
返回前,请确认以下所有事项:
- 完整程序会将
root赋值为宿主明确指定的根组件覆盖项(如有),否则赋值为 Library 的默认Stack根组件。编辑模式补丁仅在根图发生变化时才省略root。响应内容只能包含 OpenUI Lang。 - 每个组件都存在于活动目录中,且每个参数都符合其位置架构。精简目录不包含隐式内置组件,根调用使用其配置的根组件。
- 除非调用方提供了相应的自定义组件,否则不得使用
Form、Input、Select、SelectItem、FormControl、表格或图表。 - 每个引用均可解析,且没有未使用的声明。
- 每个
Query或Mutation都使用真实提供的工具,并由可见 UI 或可见操作引用。 - 每个预期预取的 Query 都使用宿主提供的准确键作为赋值名称,且每个 Query 都有符合数据结构的默认结果。
- 每个
$variable都参与可见 UI、查询参数或操作。 - 每个
@Each循环变量都保留在其内联模板表达式中。 - 内置 Lynx 渲染器中的有效动态列表不得依赖
TemplateChildren。 - 如果可以使用解析器,解析必须以根节点结束,且不存在验证错误、未解析引用或未使用的语句。
评论
支持 Markdown