AI工作流(通用框架)
AI工作流
前言
该工作流具备泛发性,无论你是开发者还是其他行业从业者又或者你使用的是各式各样的agent工具 cluade code、codex、cursor等等。
你只要捋清楚这几个关键要素:AGENTS.md、 MCP服务、Skills、Command、Subagents、Hooks即可,下面就来讲解一下这几个要点
AGENTS.md
1. 为什么需要写AGENTS.md?
AGENT非常擅长局部修改,但缺乏上下文时容易“跑偏”。AGENTS.md 就像一张地图:告诉它命令在哪里,用什么测试、PR 怎么写、哪些操作禁止。顺带一提,这也能帮助新同事快速融入团队。

2. AGENTS.md如何查找呢?(Monorepos)
关于AGENTS.md文件查找跟node_modules的查找方式类似,以就近文件优先进行查找
repo/ ├─ AGENTS.md # 全仓默认规则 ├─ apps/ │ └─ web/ │ ├─ AGENTS.md # 仅对 /apps/web/** 生效 │ └─ src/components/Button.tsx └─ packages/ └─ api/ ├─ AGENTS.md # 仅对 /packages/api/** 生效 └─ src/routes/users.ts
3. 可选的AGENTS.override.md
有时可能需要一份临时、优先级更高的规则,例如发布封板、事故应急、合规冲刺等
-
• 该文件名只是约定,不是标准;只有部分工具/CLI 会自动识别。 -
• 如果工具不支持,可通过命令行额外指定策略文件实现同样效果。 -
• 建议“少量、明确、短期”:写清目的、约束内容、结束条件,窗口结束后立即删除。
repo/ ├─ AGENTS.md ├─ AGENTS.override.md # 全仓临时规则(若被支持) └─ packages/ └─ api/ ├─ AGENTS.md └─ AGENTS.override.md # 仅 API 范围的事故模式(若被支持)
4. 如何编写AGENT.md
不要将所有的内容都塞进AGENTS.md中,而是**使用渐进式披露**。仅向Agent提供其当前所需要的内容,并在需要时将其指向其他资源
模型启动时会加载所有 Skills 的基本信息(名称和用途),但不会读取具体内容。只有当模型真正需要某个 Skill 来指导工作时,才会去读取那份文档的详细内容。这种按需加载的方式,就是渐进式披露。

注意: 因为AGENTS.md每次对话都会发送给模型,因此保持AGENTS.md的干净性是非常有必要的(国外开发者建议是300-500行)。 例如lint、prettier这些内容不要写在AGENTS.md文件,这个可以放到后面的
Hooks章节,用PostToolUse这个hooks去做
MCP服务
1. 为什么要使用MCP服务
MCP是由Claude背后的公司Anthropic开放的标准。虽然听起来很有技术性,但是核心思想很简单。为AI Agent代理提供**统一的方式来连接工具、服务和数据**。
使用MCP即插即用。agent可以将结构化请求发送到任何MCP兼容工具,实时获取结果,甚至将多个工具链接在一起,无需提前了解具体细节
简单来说: AI Agent没有调用系统工具能力,添加MCP就是让它能够取调用你的系统工具
2. 常用的MCP推荐
市面上有开源的MCP服务市场,如glama、smithery等等。当我们需要某个服务能力,就可以去MCP市场去查找即可。如果不满足也可以自己开发一个自己的MCP服务。例如chrome-devtools-mcp 浏览器调试MCP、Redis帮你去查redis有哪些数据等等。按需查找适合自己的就可以了。

前端比较常用的有
Figma MCP、Chrome devtools、Electron mcp、Swagger mcp等等,
Chrome devtools
在使用Agent工具调试前端项目的时候,是不是经常遇到这样一个痛点。Agent没办法获取到浏览器控制台的信息,导致你在调试的时候都需要手动的告知或复制对应信息给Agent工具,它才能帮你修复bug问题。下面通过集成 chrome-devtools-mcp来解决这一痛点

使用chrome-devtools帮你调试、分析等等。关于浏览器操作都可以使用这个mcp来实现自动化

这里不在阐述怎么给你的AGENT配置MCP,你可以让agent帮你配置,或者阅读文档手动配置即可
注意: MCP如果不需要使用的话,那就把它关闭掉,不然会占用你的上下文,并且消耗你的token。跟AGENTS.md文件逻辑一样
现在头部公司都在cli平替MCP能有效的节约token消耗,大约在20倍的样子(网上的测评结果)。最近anthropics也在重构MCP的调度,根据提示词按需加载而不是一次性把所有mcp提示词都给model,大约比cli缩进到7x的样子。 (目前这个我还没系统看,但可以用这个cli替代mcp节约token是真实的)

Skills
1. 什么是的skills
Agent skills是一种轻量的开放格式,用于通过专业知识和工作流程扩展AI agent的功能。
skill是包含SKILL.md文件的文件夹。该文件包含元数据(name和description)以及告诉Agent如何执行特定任务的说明。SKILLS也可以包含script、references、assets
my-skill/├── SKILL.md # Required: instructions + metadata├── scripts/ # Optional: executable code├── references/ # Optional: documentation└── assets/ # Optional: templates, resources
2. 为什么需要使用skills
skills是可重用的,基于文件系统资源为AI agent提供特定领域的专业知识。将通用AI agent变为专业的Agent在工作流程、上下文和最佳实践。与prompt不同(一次性任务对话说明),skills按需加载,无需在多个对话中重复提供相同的指导。
将通用Agent看作为一家饭店,skills在其中就充当菜谱的角色。当你的饭店拥有了菜谱那么这家饭店就具备了那些特色菜,也将菜系作为一个工作流的方式存储下。这样每次顾客点西红柿炒蛋就无需重新学一遍,做出来的口味也会更加统一
主要优点
-
• • 更专业的Agent(垂直agent): 根据 特定领域任务定制功能 -
• • 减少重复: 一次创建,自动使用 -
• • 组合功能: 组合skills去构建复杂的工作流程
例如claude code 、codex这些提供的模型是广泛性的,并不是垂类的AI AGENT,因此我们需要给这个AI AGENT赋予
角色让他更加专业
3. 常用的skills
跟Mcp服务一样, 市面上有开源的Skills市场,如skills.sh等等。根据需求自行查找,不满足可以自己编写属于符合自己团队的skills

前端比较常用的有
superpower、vue、react等等。(如下是我的IM客户端项目用到的skills)

在这里重点说一下superpowers这个skills集合(处理复杂任务)。目前我常用的如下四个using-superpowers、brainstorming、writing-plans、executing-plans

using-superpowers
using-superpowers 是 Superpowers 技能库中的一个基础规则集。它的存在是为了确保 AI 在处理任务时,必须先检查并调用相关技能,而不是仅凭直觉或默认逻辑行动。

AI AGENNTS会自行判断是否需要调用那个skills,但这个是AGENTS主观上的判断,有时候你存在相关skills但是AI AGENTS也会忽略,因此需要使用这个
using-superpowers。
为了不让AI AGENTS去猜需要使用到哪个skills, 在你的输入prompt的时候,明确指出你需要使用的那个skills。如下图: (指定brainstorming出一个设计方案)

brainstorming、writing-plans、executing-plans
-
1. brainstormin头脑风暴将你的粗略想法输出设计文档 -
2. writing-plans根据设计文档来生成`执行计划 -
3. execute-plan来执行和实施计划等等工作流

superpowers还提供了其他skills,例如code-review等。根据自己需要添加即可
create-skills
使用create-skills来帮助你创建自己的skills

Command
自定义命令是可重复使用的提示符,以 Markdown 文件的形式保存。它们可以执行 shell 命令并接受参数。
适用场景:常见任务、模板、简单自动化
开源的gstack提供了一些常用command,例如/review帮你code review代码等

Subagents(子代理)
什么是子代理?
子代理相当于一个“专职小助手”,带着自己的规则、工具权限、上下文窗口,去完成某一类任务,然后把“结果摘要”带回来。你可以把它理解成:把一个大脑拆成多个岗位角色 ,每个岗位只做一件事,并且有明确的权限边界
如下是我本地安装的全局subsgent的其中一个frontend-developer针对前端开发者、本质上它也是一个提示词

为什么要有Sub-Agents?
子代理的工程价值,本质上就是三件事:隔离、约束、复用
-
• 隔离,解决的是上下文污染问题 ——大量对当前执行有用、但对后续决策毫无价值的日志、搜索结果和中间推理,不应该进入主对话的长期记忆;子代理天然拥有独立上下文,执行完即丢弃,只把结论带回来,让 Claude 记得更少、但记得对。 -
• 约束,解决的是行为不可控问题 ——通过工具权限边界,把“我希望你别这么做”变成“你物理上做不到”,让代码审查只能读、修 bug 才能写,角色职责不再依赖提示词自觉。 -
• 复用,解决的是经验无法沉淀的问题 ——当子代理被定义成文件、放进版本控制后,好的使用方式就从一次性对话,变成了可共享、可迭代的工程资产
提示: 每一种AGENT工具、每次会话都存在token上下文限制。假如我们把所有任务都放到主agent去执行,那么上下文很快就被沾满。当AGENT感到token上下焦虑时,就会出现
幻觉和敷衍的去执行你的任务。因此我们应该将高噪的任务分配给subAgent,然后由subAgent返回结构给主agent即可
subagent推荐
老样子,跟前面的Mcp和Skills一样开源社区提供了很多通用性的subAgent。当然如果开源社区不满足你的需求,你想自定义也是完全可以的
如下这个项目: (前端、后端架构、数据库优化、内容创作、营销等等)

使用@然后选择对应的subagent即可

其实你现在正在使用subagent,可能你并没有发现,例如cursor的plan其实本质上就是一个subagent…
Hooks
Hooks事件驱动自动化。它是 Claude Code 三大扩展机制中唯一能拦截和修改 Claude 行为的机制,也是工程化实践中安全防线的最后一道闸门
hooks理解为Node层的中间件、拦截器、AOP切面、前端框架的生命周期钩子

如下claude code的三个比较常用的Hooks,更多Hooks自行查阅
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
典型的Hooks配置
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "./hooks/block-dangerous.sh" } ] } ], "PostToolUse": [ { "matcher": "Write", "hooks": [ { "type": "command", "command": "prettier --write $CLAUDE_FILE_PATH" } ] } ] }}
block-dangerous.sh脚本实例
#!/bin/bash# block-dangerous.sh# 阻止危险的 Bash 命令set -e# 读取 stdin 输入INPUT=$(cat)# 提取命令COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // ""')# 调试输出(到 stderr,不影响 JSON 响应)echo "DEBUG: Checking command: $COMMAND" >&2# 危险命令模式DANGEROUS_PATTERNS=( "rm -rf /" "rm -rf ~" "rm -rf \$HOME" "rm -rf /*" "> /dev/sd" "mkfs." "dd if=" ":(){:|:&};:" # Fork bomb "chmod -R 777 /" "git push --force origin main" "git push --force origin master" "git reset --hard origin" "DROP DATABASE" "DROP TABLE" "TRUNCATE" "curl.*| sh" # 危险的管道执行 "curl.*| bash" "wget.*| sh" "wget.*| bash")# 检查每个危险模式for pattern in "${DANGEROUS_PATTERNS[@]}"; do if [[ "$COMMAND" == *"$pattern"* ]]; then echo "BLOCKED: Command matches dangerous pattern: $pattern" >&2 cat <<EOF{ "hookSpecificOutput": { "hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "Blocked dangerous command pattern: $pattern. This command could cause irreversible damage." }}EOF exit 2 fidone# 命令安全,允许执行echo '{}'exit 0
从opencode开源的issue也可以看出这三个hooks较为重要

Claude code和opencode的hook的映射关系。(目前opencode还不支持直接将claude code的hooks兼容到opencode)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
如下图所示,我在本地配置了我的opencode的plugin禁止读取我的私密文件。当我在输入框输入读取.env直接给我中断了
脑子犯浑的时候这个钩子是特别有用的,例如: 阻止git push --force、rm -rf等高危命令

总结
经过上面对AGENTS.md、 MCP服务、Skills、Subagents、Hooks说明,接下来总结一下在项目中使用的步骤: (不同的AGENT工具可能配置方式有点不同)
-
1. 创建AGENNTS.md文件。一个专门的、可预测的地方,提供上下文和说明,以帮助 AI 编码代理处理您的项目(每次会话都会携带上、在claude code是cluade.md文件名称) -
2. 配置项目相应的skills,例如react你就配置react相关的skills、vue你就配置vue相关的skills。这些skills都可以在skills.sh找到不需要记。 -
3. 这里在推荐 superpowers这个通用skills。对于一些复杂任务,我们先出技术设计文档、执行计划输出、代码审查等等(符合软件工程工作流) -
4. 配置 MCP服务,这个主要拓展AI AGENTS操作系统能力。例如chrome-devtools是谷歌开源的用于agent去调用谷歌浏览器的mcp服务 -
5. 配置 subagents让你的agent更加对某一任务更加专业、并且降低主agent`的上下文消耗 -
6. 配置 Agent Hooks事件驱动自动化,拦截高危操作、代码格式化等
提示1: 在使用AI Agent的时候,应该保持prompt的清晰度,不要让模型去猜测你的意图,从而达到输入的准确性
提示2: AGENTS.md每次会话都会携带,尽可能保持干净整洁
提示3: MCP每次会话都会携带,如何任务不需要使用mcp应该关闭掉。 agent会自动决定是否调用mcp,但是为了更好的调用,建议提示词显示说明(这里可以考虑使用cli节省token,本地cli云端MCP原则)
提示4: agent会自动决定是否调用skills,但是为了更好的调用,建议提示词显示说明
如果文章对你有启发,关注我,后续持续更新AI相关,thanks
夜雨聆风