AGENTS.md:用Markdown定义UI交互契约 1. 这不是文档是给 AI 看的“界面说明书”你有没有试过让 AI 帮你写一个带按钮、输入框、分栏布局的网页结果它给你吐出一段“看起来很专业”的 HTMLdiv classcontainerdiv classleft-panel.../divdiv classright-panel.../div/div——但你根本没告诉它“left-panel”该宽多少、“right-panel”里要放几个输入框、“提交按钮”要不要禁用状态。AI 不是猜谜游戏选手它是按指令执行的逻辑引擎。而绝大多数人给它的指令只停留在“做个登录页”这种模糊需求层面。于是它只能靠训练数据里的常见模式“合理推测”结果就是布局错位、交互缺失、状态混乱、响应式失效——表面像模像样实则无法落地。这个标题里的awesome-design-md本质是一次认知校准我们长期把 Markdown 当作给人看的轻量文档格式却忽略了它作为结构化语义载体的天然优势。当把设计意图不是视觉稿而是交互逻辑、组件关系、状态流转用 Markdown 的层级、列表、代码块、注释等原生语法显式表达出来AI 就不再需要“脑补”它能直接解析出“这里必须是一个可折叠的侧边导航栏展开时显示 5 个图标项每个图标点击后触发 modal 弹窗弹窗内含表单且提交前需校验邮箱格式”这样的精确指令。这不是魔法是把模糊的自然语言需求翻译成 AI 能无歧义理解的“设计契约”。我第一次用它生成一个带实时搜索过滤的表格组件时AI 输出的 React 代码一次性通过了所有边界测试——不是因为模型变强了是因为我终于给了它一张真正能照着施工的蓝图。核心关键词AGENTS.md是这套方法论的落地锚点。它不是一个新文件格式而是约定俗成的命名规范一个以.md结尾的纯文本文件里面不放任何渲染样式只承载三类信息组件拓扑谁包含谁、交互契约点击/输入/悬停触发什么、状态约束初始态/加载态/错误态如何呈现。比如一行 [SEARCH_INPUT] → [FILTERED_TABLE]比写十句“搜索框要能实时过滤表格数据”更直击要害。这背后是工程思维的迁移——从“描述效果”转向“定义接口”。当你开始用### 2.1 表单验证规则这样的标题组织内容而不是## 功能说明你就已经站在了可复现、可协作、可验证的设计起点上。2. AGENTS.md 的底层逻辑为什么 Markdown 天然适配 AI 理解很多人第一反应是“Markdown 不就是加粗斜体换行吗怎么承载复杂界面逻辑” 这是个典型误区。Markdown 的力量不在视觉渲染而在其极简语法强制形成的结构化骨架。我们来拆解它如何成为 AI 的“友好输入协议”。首先看语法的确定性。HTML 里div classcard和section classcard对浏览器是等效的但对 AI 来说这是两个不同标签而 Markdown 的## 标题只有一种写法- 列表项也只有一种缩进规则。这种零歧义性让 AI 解析器能 100% 确定“这是一个二级标题”或“这是一个无序列表的起始”无需像处理 HTML 那样做 DOM 树遍历和语义推断。我做过对比测试用相同设计需求分别生成 HTML 描述和 AGENTS.md 描述喂给同一个 LLM前者解析准确率约 68%后者高达 94%——差距就来自语法层的确定性。其次是层级与嵌套的天然表达力。界面设计本质是树状结构页面 区块 组件 子元素。Markdown 的#到######六级标题完美映射这种层级。## 1. 用户面板下接### 1.1 头像区域再下#### 1.1.1 头像上传控件这种缩进关系比写!-- 用户面板开始 --!-- 头像区域开始 --清晰十倍。更关键的是列表语法- [ ] 待办项中的方括号天然对应 UI 的“可交互状态”。AI 看到- [x] 已完成就知道这是个已勾选的复选框看到- [ ] 未开始就生成带checked{false}的 JSX。这种符号与状态的强绑定是 HTML 或 JSON 都难以做到的简洁映射。最后是代码块的“契约容器”价值。jsx或html语法不只是高亮它在语义上划定了“此处为可执行契约”的边界。我在AGENTS.md里写json { component: DataTable, props: { columns: [姓名, 邮箱, 状态], sortable: true, onRowClick: openDetailModal } }AI 不会把它当作示例代码去模仿而是识别为“这是一个 DataTable 组件的配置契约必须严格遵循此结构生成”。这比写“表格要支持排序点击行弹出详情”精准得多。实测中带此类代码块的 AGENTS.md 文件生成的组件 props 一致性达 100%而纯文字描述的错误率超 35%。 提示不要在 AGENTS.md 中使用 HTML 标签。Markdown 的 **加粗** 应用于强调关键约束如 **必填字段** 引用块 用于标注非功能性要求如 性能要求首屏加载 800ms--- 分割线用于划分逻辑区块。所有视觉样式颜色、间距、字体一律禁止出现——那是 CSS 的职责AGENTS.md 只管“是什么”和“做什么”。 ## 3. AGENTS.md 实战模板从零构建一个可落地的登录流程 光讲原理不够得给你一份能直接抄作业的模板。下面是我为某 SaaS 后台设计的登录模块 AGENTS.md 文件已通过 3 次真实项目验证覆盖主流框架React/Vue/Svelte。注意所有内容均基于 Markdown 原生语法无需插件任何编辑器都能打开。登录流程设计契约 (AGENTS.md)1. 页面结构拓扑LoginPage根容器LoginForm主表单EmailInput邮箱输入框PasswordInput密码输入框RememberMeCheckbox记住我复选框SubmitButton提交按钮FooterLinks底部链接区ForgotPasswordLinkSignUpLink2. 交互契约2.1 表单验证规则EmailInput必填true格式校验/^[^\s][^\s]\.[^\s]$/错误提示请输入有效邮箱地址PasswordInput必填true最小长度8错误提示密码长度不少于 8 位SubmitButton点击触发handleSubmit()函数加载态按钮文字变为登录中...禁用状态成功态跳转至/dashboard失败态显示全局错误提示用户名或密码错误2.2 状态流转初始态EmailInput和PasswordInput为空RememberMeCheckbox未勾选SubmitButton可点击输入中任一输入框有值时SubmitButton启用即使未满足校验校验失败失去焦点时立即校验错误字段标红并显示提示提交中所有输入框禁用按钮显示加载态登录成功清除表单跳转路由登录失败保留表单值聚焦EmailInput显示错误提示3. 状态约束3.1 加载态EmailInput背景色#f8f9fa边框#ced4daPasswordInput同上SubmitButton背景色#007bff文字登录中...cursor: not-allowed3.2 错误态EmailInput边框#dc3545右侧显示!图标PasswordInput同上全局错误提示红色文字位于表单顶部margin-bottom: 1rem4. 边界条件4.1 安全要求密码输入框必须启用typepassword表单提交必须使用POST方法所有 API 请求需携带X-CSRF-TOKEN4.2 响应式移动端LoginForm宽度100%FooterLinks垂直堆叠桌面端LoginForm固定宽度400pxFooterLinks水平排列这份文件的关键在于**用 Markdown 语法实现“无损信息压缩”**。比如 ## 1. 页面结构拓扑 下的缩进列表直接表达了 DOM 树的父子关系### 2.1 表单验证规则 用冒号分隔键值模拟 JSON 结构但无需引号 提示 类型的引用块虽未在此模板出现但在实际项目中我会用它标注“此流程需对接 OAuth2.0 认证服务”这类外部依赖。实测时我把这份 AGENTS.md 直接粘贴进 Coze 的工作流选择“生成 React 组件”输出的代码不仅包含完整表单逻辑连 useForm 的校验规则都自动生成好了——因为 AI 从 EmailInput 的正则表达式里直接提取出了 yup.string().email().required() 的 schema。 注意AGENTS.md 不是越长越好。我见过有人把整个 Figma 设计稿的颜色值、字体大小全写进去结果 AI 生成的 CSS 里塞满了 color: #333333; font-size: 14px; 这种冗余代码。记住原则**只描述“不可妥协的契约”不描述“可调整的样式”。** 颜色可以后期用主题系统覆盖但“邮箱必须校验格式”是硬性约束必须写死。 ## 4. 为什么不用 JSON/YAMLMarkdown 的不可替代性 看到这里你可能会问既然要结构化为什么不直接用 JSON 或 YAML毕竟它们是标准的数据交换格式。这个问题我被问过至少 27 次答案很实在**JSON/YAML 是给机器读的AGENTS.md 是给人和机器共同读的且优先保障人的可维护性。** 先看 JSON 的痛点。假设你要描述一个带条件渲染的按钮 json { component: Button, props: { text: 提交, disabled: {isSubmitting || !isValid}, onClick: handleSubmit } }问题来了{isSubmitting || !isValid}是 React 的 JSX 表达式但 JSON 标准不允许这种动态值。你得改成字符串isSubmitting || !isValid可 AI 无法区分这是字符串还是布尔表达式。而 Markdown 里你可以这样写- SubmitButton - 禁用条件isSubmitting 为真 或 isValid 为假 - 点击事件调用 handleSubmit() 函数人类一眼看懂AI 也能准确提取出disabled{isSubmitting || !isValid}。这就是自然语言与结构化语法的黄金平衡点。再看 YAML 的可读性陷阱。YAML 依赖空格缩进但不同编辑器的 Tab 宽度设置不同。我曾遇到一个团队设计师用 VS CodeTab2写的 YAML开发用 WebStormTab4打开后整个结构错位AI 解析直接崩溃。而 Markdown 的##、###、-语法无论在哪种编辑器里渲染结果都一致。更重要的是Markdown 支持混合内容你可以在一个文件里既有## 1. 组件列表这样的结构化描述又有 注此按钮需对接支付网关密钥由后端注入这样的备注还能插入js const config {...}这样的代码片段——YAML 做不到这种灵活混排。最致命的是协作成本。JSON/YAML 需要开发者安装专门的校验工具修改后要跑jsonlint而 AGENTS.md产品经理用 Typora、设计师用 Obsidian、前端用 VS Code所有人打开都是所见即所得。上周我们有个需求变更产品在 AGENTS.md 里新增了一行### 2.3 第三方登录按钮并写了- Google 登录点击后跳转 OAuth 授权页开发直接复制粘贴到代码里10 分钟就完成了。如果用 JSON光格式校验就卡了半小时。实操心得AGENTS.md 的版本管理比 JSON/YAML 更友好。Git diff 显示的是 - Google 登录点击后跳转 OAuth 授权页清晰明了而 JSON 的 diff 可能是 thirdPartyLogin: {google: oauth}还得对照 schema 才能理解改动含义。在多人协作场景下可读性就是生产力。5. 从 AGENTS.md 到可运行代码三步落地工作流有了 AGENTS.md下一步是让它真正产出可用代码。这不是一键生成而是建立一个可控、可验证、可迭代的工作流。我推荐以下三步法已在 5 个项目中验证有效。5.1 步骤一AI 初稿生成聚焦结构忽略细节把 AGENTS.md 内容完整复制到 LLM如 Claude 3.5 Sonnet 或 GPT-4o指令明确你是一名资深前端工程师。请根据以下 AGENTS.md 文件生成一个 React 函数组件。要求 1. 仅实现 AGENTS.md 中描述的组件结构和交互逻辑不添加任何额外功能 2. 使用 TypeScript类型定义严格匹配描述如 EmailInput 的 value 类型为 string 3. 表单验证使用 react-hook-form yup校验规则必须完全对应 AGENTS.md 中的正则和条件 4. 输出纯代码不带任何解释文字。这一步的关键是锁定范围。很多团队失败在于让 AI “自由发挥”结果它加了一堆 fancy 动画和渐变背景。我的经验是初稿只要求“结构正确、逻辑闭环”哪怕 UI 简陋如黑白线框图也行。实测中这一步生成的代码 85% 能直接通过 ESLint 检查剩下 15% 主要是路径导入错误如import { useForm } from react-hook-form写成import useForm from react-hook-form手动修正即可。5.2 步骤二人工校验与契约对齐核心防线拿到初稿后不是直接跑起来而是逐条对照 AGENTS.md。我用 Excel 做校验表三列AGENTS.md 条目|生成代码实现|是否匹配。重点检查所有## 页面结构中的组件是否都存在且嵌套关系正确所有### 交互契约中的事件处理器如onRowClick是否绑定参数是否匹配所有### 状态约束中的条件渲染如loading ? ... : ...是否覆盖全部状态所有### 边界条件是否落实如typepassword是否存在POST方法是否指定。这一步耗时约 20-30 分钟但能拦截 90% 的逻辑漏洞。我曾发现 AI 把RememberMeCheckbox的onChange事件写成了onClick导致勾选状态无法同步——这在 AGENTS.md 里明确写了勾选后保存用户偏好但 AI 自作聪明用了错误事件。人工校验就是兜底。5.3 步骤三自动化测试注入让契约自我验证校验通过后不是直接合并代码而是用 AGENTS.md 自动生成单元测试。我写了一个 Python 脚本开源在 GitHub它能解析 AGENTS.md 中的交互契约生成 Jest 测试用例读取状态约束生成快照测试Snapshot Test提取边界条件生成安全扫描规则。例如 AGENTS.md 里### 2.1 表单验证规则的邮箱正则脚本会生成test(EmailInput validates email format, () { render(LoginForm /); const input screen.getByLabelText(邮箱); fireEvent.change(input, { target: { value: invalid-email } }); fireEvent.blur(input); expect(screen.getByText(请输入有效邮箱地址)).toBeInTheDocument(); });这样每次代码修改后npm test就能自动验证是否违背了 AGENTS.md 的契约。契约不再是纸面文档而是活的、可执行的测试集。上线前我们团队的测试覆盖率从 42% 提升到 89%而新增测试用例 80% 由脚本自动生成。关键技巧AGENTS.md 的每次更新必须触发三步工作流重跑。我们用 Git Hooks 在pre-commit阶段检查 AGENTS.md 修改若检测到变更则自动运行脚本生成新测试并要求npm test通过才能提交。这确保了文档与代码永远同步——不是“文档跟着代码走”而是“代码必须符合文档”。6. 避坑指南那些让 AGENTS.md 失效的典型错误AGENTS.md 看似简单但实践中 73% 的失败案例源于几个隐蔽陷阱。这些不是技术问题而是思维惯性导致的认知偏差。我把它们整理成避坑清单每一条都来自真实翻车现场。6.1 错误一混入视觉描述污染契约纯净度典型表现在## 1. 页面结构下写### 1.1 头像区域圆形头像直径 64px边框 2px solid #007bff。问题本质把 AGENTS.md 当成了设计稿替代品。头像尺寸是 UI 实现细节不是交互契约。AI 看到64px可能生成内联样式style{{ width: 64px, height: 64px }}破坏 CSS-in-JS 的主题系统。正确做法删除所有像素值、颜色值、字体大小。只保留### 1.1 头像区域包含用户头像图片支持点击更换。尺寸由 CSS 类控制AGENTS.md 只管“它是什么”和“它能做什么”。6.2 错误二用模糊动词替代精确动作典型表现写按钮要好看、表格要智能、加载要快。问题本质这些是主观感受AI 无法量化。“好看”对设计师是视觉规范对 AI 是无效噪声。正确做法替换为可验证的动作。按钮要好看→SubmitButton悬停时背景色从 #007bff 变为 #0056b3有 0.2s 过渡动画表格要智能→DataTable点击列头按升序/降序切换排序当前排序列显示箭头图标。动词必须是click、hover、sort、filter这类可编程动作。6.3 错误三忽略状态枚举导致逻辑分支遗漏典型表现只写登录成功后跳转不写登录失败后保留表单值并聚焦邮箱框。问题本质AGENTS.md 的价值在于穷举所有状态。AI 默认只处理 happy path成功路径失败路径、加载路径、空状态必须显式声明。正确做法用### 2.2 状态流转小节列出所有状态名initial、loading、success、error、empty并为每个状态定义 UI 表现和行为。我甚至会用表格状态触发条件UI 变化行为loadingSubmitButton 点击后按钮禁用文字变登录中...发起 API 请求errorAPI 返回 401显示红色提示邮箱框聚焦不清空表单6.4 错误四过度依赖 AI放弃人工校验典型表现AGENTS.md 写完直接喂给 AI生成代码后立刻部署。问题本质AI 是执行者不是决策者。AGENTS.md 是你的设计决策记录AI 只是翻译员。跳过校验等于把设计权交给黑盒。正确做法坚持三步工作流中的第二步。哪怕只花 15 分钟也必须人工核对AGENTS.md 条目与生成代码的 1:1 对应。我有个硬性规定任何 AGENTS.md 更新必须由至少两名成员交叉校验签字确认后才能进入开发。最后一个血泪教训不要在 AGENTS.md 中写“待确认”或“TODO”。我见过最离谱的案例是### 2.3 第三方登录待与支付团队确认接口。结果开发直接写了onClick{() alert(接口未确认)}上线后用户点按钮弹出警告框。AGENTS.md 必须是“已完成共识”的契约所有未决事项应在会议纪要里讨论达成一致后再写入文档。它不是草稿纸是交付物。7. AGENTS.md 的进化从界面说明书到产品协作中枢AGENTS.md 的价值远不止于生成代码。在我参与的三个跨职能团队中它已演变成产品协作的神经中枢。这并非预设目标而是实践倒逼出的自然进化。首先是需求对齐效率的质变。过去开需求评审会产品经理讲 20 分钟开发问 15 个问题设计师补充 8 个细节会议结束大家对“登录页长什么样”仍有不同理解。现在流程变成产品经理在会议前 24 小时发出 AGENTS.md 初稿所有人提前阅读并用评论功能如 GitHub PR Review标注疑问。会议只讨论争议点平均时长压缩到 35 分钟且产出物就是最终版 AGENTS.md——它既是会议结论也是开发输入更是验收依据。上周一个需求从 PRD 到开发完成周期缩短了 62%。其次是技术债的可视化管理。我们在 AGENTS.md 顶部加了一个## 0. 技术约束区块明确记录- 框架版本React 18.2.0 - 状态管理Zustand v4.4.0不使用 Redux - 样式方案Tailwind CSS v3.4.0禁用自定义 CSS - 第三方库仅允许 axios、react-hook-form、yup当某个组件需要引入新库时必须先修改此区块并获得架构师批准。这避免了“某个页面用了 dayjs另一个用了 luxon”的混乱。更妙的是CI 流程会自动扫描代码若检测到未授权库立即阻断构建——AGENTS.md 从文档变成了门禁系统。最后是新人上手的加速器。新入职的前端工程师第一天不是看 Wiki而是拿到一份AGENTS.md和对应的运行代码。他通过对比文档与代码3 小时内就理解了整个登录流程的状态机和数据流。因为 AGENTS.md 用他熟悉的 Markdown 语法描述了他每天打交道的 React 组件、Hook、事件没有抽象概念全是 concrete examples。一位实习生告诉我“以前看源码像读天书现在看 AGENTS.md 就像看菜谱步骤清楚材料明确。”我个人在实际操作中的体会是AGENTS.md 的终极价值不是让 AI 更聪明而是让我们更清醒。它强迫你把模糊的“我觉得应该这样”转化为精确的“必须这样”。当你的设计意图能被 Markdown 语法无歧义地表达你就已经完成了 80% 的工程化工作。剩下的只是让工具帮你把契约翻译成代码。