乐于分享
好东西不私藏

AI工作流(通用框架)

AI工作流(通用框架)

AI工作流

前言

该工作流具备泛发性,无论你是开发者还是其他行业从业者又或者你使用的是各式各样的agent工具 cluade codecodexcursor等等。

你只要捋清楚这几个关键要素:AGENTS.md MCP服务SkillsCommandSubagentsHooks即可,下面就来讲解一下这几个要点

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 MCPChrome devtoolsElectron mcpSwagger 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也可以包含scriptreferencesassets

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

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

在这里重点说一下superpowers这个skills集合(处理复杂任务)。目前我常用的如下四个using-superpowersbrainstormingwriting-plansexecuting-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. 1. brainstormin头脑风暴将你的粗略想法输出设计文档
  2. 2. writing-plans根据设计文档来生成`执行计划
  3. 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推荐

老样子,跟前面的McpSkills一样开源社区提供了很多通用性的subAgent。当然如果开源社区不满足你的需求,你想自定义也是完全可以的

如下这个项目: (前端、后端架构、数据库优化、内容创作、营销等等)

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

其实你现在正在使用subagent,可能你并没有发现,例如cursor的plan其实本质上就是一个subagent…

Hooks

Hooks事件驱动自动化。它是 Claude Code 三大扩展机制中唯一能拦截和修改 Claude 行为的机制,也是工程化实践中安全防线的最后一道闸门

hooks理解为Node层的中间件、拦截器、AOP切面、前端框架的生命周期钩子

如下claude code的三个比较常用的Hooks,更多Hooks自行查阅

事件
触发时机
能否阻止
典型用途
PreToolUse
工具执行前
权限检查、参数修改、危险操作拦截
PostToolUse
工具执行之后
格式化、验证、日志记录
Stop
claude完成相应时
质量检查、自动测试

典型的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)

claude code
opencode
PreToolUse
tool.execute.before
PostToolUse
tool.execute.after
Stop
tool.execute.event

如下图所示,我在本地配置了我的opencode的plugin禁止读取我的私密文件。当我在输入框输入读取.env直接给我中断了

脑子犯浑的时候这个钩子是特别有用的,例如: 阻止git push --forcerm -rf等高危命令

总结

经过上面对AGENTS.md MCP服务SkillsSubagentsHooks说明,接下来总结一下在项目中使用的步骤: (不同的AGENT工具可能配置方式有点不同)

  1. 1. 创建AGENNTS.md文件。一个专门的、可预测的地方,提供上下文和说明,以帮助 AI 编码代理处理您的项目(每次会话都会携带上、在claude code是cluade.md文件名称)
  2. 2. 配置项目相应的skills,例如react你就配置react相关的skills、vue你就配置vue相关的skills。这些skills都可以在skills.sh找到不需要记。
  3. 3. 这里在推荐superpowers这个通用skills。对于一些复杂任务,我们先出技术设计文档执行计划输出代码审查等等(符合软件工程工作流)
  4. 4. 配置MCP服务,这个主要拓展AI AGENTS操作系统能力。例如chrome-devtools是谷歌开源的用于agent去调用谷歌浏览器的mcp服务
  5. 5. 配置subagents让你的agent更加对某一任务更加专业、并且降低主agent`的上下文消耗
  6. 6. 配置Agent Hooks事件驱动自动化,拦截高危操作、代码格式化等

提示1: 在使用AI Agent的时候,应该保持prompt的清晰度,不要让模型去猜测你的意图,从而达到输入的准确性

提示2: AGENTS.md每次会话都会携带,尽可能保持干净整洁

提示3: MCP每次会话都会携带,如何任务不需要使用mcp应该关闭掉。 agent会自动决定是否调用mcp,但是为了更好的调用,建议提示词显示说明(这里可以考虑使用cli节省token,本地cli云端MCP原则)

提示4: agent会自动决定是否调用skills,但是为了更好的调用,建议提示词显示说明

以上是我个人的使用习惯仅供参考,我的想法是后续切到claude code的cli就不需要处理兼容性问题了

如果文章对你有启发,关注我,后续持续更新AI相关,thanks