mcpField
L
lynx-openui

lynx-openui

github.com/lynx-community设计与 UI28139 次安装1 天前更新
代码仓库

关于 lynx-openui

lynx-openui 是用于生成 Lynx 界面的有效 OpenUI Lang v0.5 程序的技能。它指导如何依据文档组件、已提供的工具和运行时参考编写内容,并校验完整程序或编辑补丁。

主要功能

  1. 01生成 OpenUI Lang v0.5
  2. 02依据组件目录生成内容
  3. 03Query 与 Mutation 使用规则
  4. 04完整程序和补丁工作流
  5. 05语法与引用校验

适用场景

  1. 01构建声明式 Lynx 界面
  2. 02用已提供的读取工具呈现数据
  3. 03添加明确触发的写入操作
  4. 04以补丁方式编辑现有程序

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lynx-community/skills --skill lynx-openui

安装后在 Claude Code 中输入/lynx-openui确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
agents/
openai.yaml
references/
components.md
examples.md
runtime.md

详细介绍

生成 Lynx OpenUI 程序

生成有效的 OpenUI Lang v0.5,供 <OpenUiRenderer response={...}> 使用。请生成声明式 DSL,而非应用程序代码。

阅读参考资料

  • 生成程序前,务必先阅读 components.md。将调用方提供的组件签名视为权威扩展或替代定义。
  • 如果请求涉及状态、工具、实时数据、变更、操作、重复查询数据或编辑,请阅读 runtime.md。
  • 对于复杂布局或工具工作流,请阅读 examples.md。请借鉴其中的模式,不要照搬无关内容。

工作流程

  1. 确定所需 UI、确切的活动组件目录、已配置的根组件、可用工具架构、由宿主提供的预取 Query 键、媒体 URL,以及宿主是否支持完整程序或 mergeStatements 补丁。
  2. 选择数据模式:
    • 对于自包含内容以及不存在工具的情况,使用静态值。
    • 仅在调用方或宿主提供了实际读取工具时使用 Query。
    • 仅在存在实际写入工具时使用 Mutation,并通过显式 Action 触发。
  3. 仅选择活动目录允许的组件和位置参数。将明确缩减的目录视为完整词汇表:其中未列出的内置组件不可用。存在宿主明确指定的根组件时,使用该组件;否则使用 Library 的默认 Stack 根组件。
  4. 编写适合流式传输的图结构。对于完整程序,先写根组件,再写状态、查询或变更、结构组件,最后写叶子内容。对于编辑模式补丁,仅返回变更过的语句。
  5. 返回程序前,验证语法、引用、可达性、组件名称、参数顺序、工具名称和操作目标。

输出约定

  • 仅返回 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