欢迎光临
我们一直在努力

从零搭建 AI Agent 开发工作流:从一次对话到可持续交付

写给希望让 AI 持续参与开发的个人与团队,也写给将执行这套流程的 AI Agent。

本文使用虚构目录和通用示例,不依赖任何特定项目、业务领域、编程语言或编辑器。文中的模板是一套可迁移的设计,落地时应根据目标仓库的真实结构调整。

1. 先理解:我们要搭建什么

第一次让 AI 修改代码,往往只需要一句话。但持续使用后,问题会逐渐出现:下一次会话不知道上次做到哪里;同类功能使用不同实现;小改动触发大规模重构;AI 说“完成了”,却没有执行验证;修正过的问题又出现。

这些问题需要一套稳定的工作协议。它让 Agent 每次都能回答:

  • 这次要交付什么,哪些内容属于范围之外?
  • 修改前应读哪些规则、事实和现有实现?
  • 哪些约束必须在实现时遵守?
  • 用什么证据证明本次交付达标?
  • 如果中断,下一次如何继续?
  • 本文把“全 AI Agent 开发工作流”定义为:由 Agent 主动完成需求理解、必要阅读、实现、验证和交付整理,人负责提供业务事实、评估结果并决定需要授权的外部操作。

    自动化程度提高,并不意味着业务判断和发布责任消失。文档中的“必须”属于执行约定;脚本只有实际运行才产生检查效果;CI 只有被配置成合并必需检查后,才形成对应的合并约束。

    三种角色如何配合

    角色主要职责交付证据
    描述目标、补充事实、判断取舍、授权发布等操作 验收标准与明确决策
    Agent 阅读、实现、检查、修复、整理结果 文件变更与验证摘要
    工具与 CI 执行可重复检查 退出码、日志与检查报告

    日常使用时,人只需表达需求,无需记住规则文件、选择任务档位或手动触发内部流程。搭建工作流时,则需要把这些职责明确写进仓库。

    2. 第一阶段:用三个文件搭出最小闭环

    不要一开始创建几十篇规范。先准备一个统一入口、一份执行规则和一个检查脚本:

    repository/
    ├── AGENTS.md
    ├── agent/
    │ └── rules/
    │ └── core.md
    └── tools/
    └── agent/
    └── check.sh

    上面的路径均为本文示例。目录名可以调整,但入口里的引用必须同步修改。

    这三个文件分别回答:去哪里读、按什么顺序做、怎样检查。

    2.1 统一入口只负责导航

    把以下内容作为根目录 AGENTS.md 的起点:

    # Agent 工作入口

    适用范围:本仓库中的开发、排查和文档任务。

    ## 启动顺序

    1. 阅读 agent/rules/core.md。
    2. 检查当前 Git 状态,识别已有改动。
    3. 明确交付物及验收条件,自行判断任务规模。
    4. 根据本文件的“已启用规则包”加载适用规则。
    5. 阅读直接相关的现有实现后再修改。

    ## 已启用规则包

    暂无。新增时登记触发条件、权威文件与对应检查。

    ## 验证入口

    有文件变更时,由 Agent 执行 bash tools/agent/check.sh。
    行为变更还须执行相关构建与测试;命令以仓库配置为准。

    ## 交付

    说明修改结果、验证证据和未完成事项。
    未经授权,不提交、推送或发布。
    不得覆盖与当前任务无关的已有改动。

    入口应保持简短。具体编码规范、数据规则和长模板放到独立文件中,入口只说明何时加载它们。

    这里的文件名本身不保证任何工具会自动加载它。需要在所用 Agent 环境中确认入口加载机制;如果没有自动发现能力,就在该环境的启动配置中明确指定读取入口。

    2.2 内核只规定通用动作

    将以下模板写入 agent/rules/core.md:

    # 执行内核

    ## 开始前

    – 明确交付物、验收条件和最小修改范围。
    – 检查现有改动,不覆盖他人或其他任务的工作。
    – 先读相关实现,再决定如何修改。
    – 只询问影响正确性的缺失事实,不要求用户选择工作流档位。

    ## 执行中

    – 采用满足需求的最小正确改动,不顺手重构。
    – 任务扩展到新的模块或风险领域时,先加载适用规则。
    – 不编造接口、数据关系、测试结果或工具能力。
    – 保留仍有效的注释;行为变化时同步修正文档。

    ## 结束前

    – 有文件变更就执行仓库检查入口。
    – 根据行为变化执行相关构建、测试或文档检查。
    – 必需检查失败时先修复;无法执行时记录原因,不声称通过。
    – 交付结果、证据和剩余事项;遵守当前授权范围。

    好的规则应有触发条件和可观察动作。“认真检查代码”很难执行,“行为变更时运行相关测试,并报告结果”更具体。

    2.3 先让检查入口真正可运行

    以下脚本只检查已跟踪改动中的 Git 空白错误,并展示未跟踪文件。它是可运行的起点,不代表代码、业务、安全或未跟踪文件内容已经检查完毕。

    写入 tools/agent/check.sh:

    #!/usr/bin/env bash
    set -euo pipefail

    root="$(git rev-parse –show-toplevel)"
    cd "$root"

    if ! git rev-parse –verify HEAD >/dev/null 2>&1; then
    echo "CHECK_STATUS=failed"
    echo "REASON=initial_commit_required"
    exit 1
    fi

    echo "CHECK_SCOPE=tracked_changes_against_HEAD"
    if ! git diff –check HEAD —; then
    echo "CHECK_STATUS=failed"
    exit 1
    fi

    echo "UNTRACKED_FILES_BEGIN"
    git ls-files –others –exclude-standard
    echo "UNTRACKED_FILES_END"
    echo "CHECK_STATUS=passed"
    echo "CHECK_COVERAGE=tracked_whitespace_only"

    git diff HEAD 比较当前已跟踪文件与当前提交,覆盖其最终状态中的暂存及未暂存改动。未跟踪文件不会自动进入这个 diff,因此必须另行检查,不能把“没有 diff”当成“没有工作需要验证”。

    第一次搭建时,让 Agent 创建这三个文件、运行检查,并报告检查范围。随后根据仓库已有配置接入真正的格式检查、类型检查、构建与测试命令。不要照抄与技术栈不符的命令,也不要留下始终成功的测试占位脚本。

    **本阶段验收:**给 Agent 一个小改动,它能自己读入口、保护已有工作、修改目标文件、运行检查并说明结果。

    3. 第二阶段:让流程随任务规模变化

    如果每次改一个文案都阅读整套架构文档,工作流会变成负担。需要让阅读与验证随任务规模变化。

    3.1 用五个问题判断任务

    Agent 在内部回答:

    问题目的
    最终交付物是什么? 区分问答、文档、配置、代码和迁移
    最少影响哪些文件或模块? 确定初始范围
    是否改变数据结构或模块契约? 触发结构、兼容性与迁移规则
    是否涉及受保护数据或权限边界? 立即触发领域约束
    是否新增被代码读取的配置? 核对默认值、读取方式和生效机制

    文件数是参考信号,行为影响同样重要。一行权限判断可能比十个文档文件更需要验证。

    3.2 定义三档即可

    档位典型范围阅读与执行验证
    轻量 局部文档、文案或简单配置,影响可控 直接相关规则及目标文件 基础检查、格式或配置有效性
    单点 一个局部行为或模块 适用规则及一至两个同类实现 基础检查、相关构建与行为测试
    完整 跨模块、新契约、结构迁移或复杂行为 路由文档、领域事实、参考实现 完整收尾及必要集成验证

    开始时选择足以完成任务的最小流程。发现范围扩大时再升级,不提前为可能发生的事情创建大量文件。

    **任务规模与领域约束分别判断。**修改很少的文件,也不能跳过适用的数据隔离或权限要求。配置变化如果会改变运行行为,也不能仅因扩展名是配置文件就减少验证。

    可追加到内核:

    ## 任务规模

    自行选择轻量、单点或完整流程,无需用户确认档位。
    阅读与验证按实际影响缩放,领域硬约束始终生效。
    范围扩大时,先补读新触发的规则,再继续修改。
    纯问答且无文件变化时,不运行无关的交付脚本。

    **本阶段验收:**文案修改不会触发全量构建;局部缺陷修复会读取同类实现并执行有意义的相关测试。

    4. 第三阶段:把规则拆成内核与规则包

    通用流程稳定后,再加入项目适用的知识。可以用四层结构组织:

    层内容维护方式
    L1 内核 开始、执行、验证、交付 保持通用与简短
    L2 已启用规则包 语言、框架、数据、权限、迁移等要求 按能力启用
    L3 团队补充 团队约定和本地协作方式 进入版本控制
    L4 个人补充 个人环境与表达偏好 通常本地保存并忽略提交

    团队与个人层只能补充适用要求,不能通过一句“跳过检查”关闭硬门禁。此约定仍需执行环境和检查机制配合;文本层级不会自动形成权限隔离。

    扩展后的示例结构:

    agent/
    ├── rules/
    │ ├── core.md
    │ ├── packs/
    │ │ ├── data-scope.md
    │ │ ├── language.md
    │ │ └── migration.md
    │ ├── team/
    │ └── local/
    └── skills/
    └── task-start/
    └── SKILL.md

    4.1 在入口声明已启用规则包

    ## 已启用规则包

    | 包 | 触发条件 | 权威文件 |
    |—|—|—|
    | data-scope | 查询或修改具有归属边界的数据 | agent/rules/packs/data-scope.md |
    | language | 修改应用源代码 | agent/rules/packs/language.md |
    | migration | 修改结构或新增数据迁移 | agent/rules/packs/migration.md |

    先判断任务语义,再判断文件路径。
    规则适用但文件缺失时,查找是否迁移;仍找不到则报告缺口。
    不得从缺失文档中推断不存在约束。

    仅按文件路径加载可能太晚。例如,Agent 正在设计查询方案,尚未打开数据访问文件,此时数据归属规则已经应该生效。

    4.2 一个规则包的可复制结构

    以下规则包采用虚构的“工作区数据隔离”场景:

    # 数据范围规则

    ## 触发条件

    查询、导出、统计或修改属于某个工作区的数据时适用。

    ## 必须保持的约束

    数据范围来自经过验证的身份上下文。
    不得只相信请求参数中的工作区标识。
    关联关系必须根据已确认的结构与现有实现确定。

    ## 实现参考

    阅读目标仓库已登记的数据访问样板。
    若样板与当前契约冲突,先核实事实再实施。

    ## 验证

    验证当前工作区的数据可访问。
    验证其他工作区的数据不可访问。
    覆盖实际发生变化的读取、导出或写入路径。

    ## 例外

    跨工作区操作必须具有明确用途、权限边界及验证证据。
    不得用一条“允许例外”注释代替权限检查。

    ## 不确定时

    若归属关系或授权范围无法从代码和文档确认,询问业务事实。

    规则说明“为什么、何时、怎么做”;脚本或策略配置保存机器判断所需的名单。对同一名单保留一个权威来源,其他文件引用它,避免多份复制逐渐不一致。

    4.3 Skill 用来封装重复步骤

    当开任务动作经常重复,可将步骤整理为 Skill。其是否自动发现、何时加载,仍取决于 Agent 环境,需要显式适配。


    name: task-start
    description: 开发与排查任务的内部启动流程。

    # 开任务

    1. 阅读仓库入口与内核。
    2. 检查 Git 状态,识别已有改动。
    3. 明确交付物并判断任务规模。
    4. 加载适用规则包。
    5. 单点任务读取直接相关的同类实现。
    6. 完整任务读取任务路由,选择必要资料。
    7. 预计跨会话时,读取或建立对应任务的交接文件。
    8. 实施最小正确改动并执行适用验证。

    用户无需手动触发本流程。

    入口负责导航,规则规定约束,Skill 编排步骤,脚本产生可重复结果。四者分工清楚,后续维护才不会互相覆盖。

    **本阶段验收:**任务在动手前加载适用规则;未启用、无关的规则包不会进入上下文。

    5. 第四阶段:建立小而可检索的知识库

    当 Agent 经常需要理解模块关系时,再补知识库。先写最常用的事实和样板,不追求一次覆盖整个仓库。

    docs/engineering/
    ├── index.md
    ├── essentials.md
    ├── task-routing.md
    ├── patterns/
    │ └── endpoint.md
    ├── domains/
    │ └── workspace.md
    └── lessons-inbox.md

    5.1 先有路由,再增加正文

    task-routing.md 示例:

    # 任务路由

    | 任务 | 先读 | 再看 |
    |—|—|—|
    | 修改接口 | patterns/endpoint.md | 同模块已验证的相似接口 |
    | 调整数据范围 | domains/workspace.md | 适用的数据访问实现 |
    | 数据迁移 | 对应迁移规则包 | 最近一个适用迁移样板 |
    | 修复缺陷 | 相关模块文档 | 失败路径与已有测试 |

    每次先选最相关的一至三份资料;出现具体缺口再扩展阅读。

    参考实现也会过期。Agent 应核对它是否仍符合当前契约,不能把“已经存在”理解成“一定正确”。

    5.2 每篇知识页回答固定问题


    title: 工作区数据访问
    status: active
    verified: YYYY-MM-DD
    sources:
    – 替换为目标仓库真实的实现路径

    # 工作区数据访问

    ## 解决什么问题

    ## 必须保持的业务事实

    ## 推荐实现与适用条件

    ## 常见错误与反例

    ## 如何验证

    ## 相关入口

    verified 表示最近一次实际核对时间,不能只因编辑了文字就更新。sources 应指向真正核实过的实现,而不是猜测的文件名。

    知识库后续可增加三类检查:页面是否进入索引、内部链接是否存在、长期未核验页面是否需要提醒。过期提示通常意味着需要复核,不应自动宣判实现错误。

    **本阶段验收:**Agent 能通过路由找到依据,并说明这次选用的样板为何适用。

    6. 第五阶段:把约定变成可验证的门禁

    “必须遵守”只有被执行和核验后才有实际效果。这里需要区分不同检查的能力。

    检查能提供的证据无法单独证明
    文本扫描 是否出现某种已知模式 模式的业务含义是否正确
    语法与类型检查 语法、类型约束是否满足 业务行为是否符合需求
    构建 当前环境下能否构建 运行时所有路径均正确
    行为测试 给定场景中的实际输出 未覆盖场景没有缺陷
    人或独立审查 契约、边界与遗漏风险 所有运行条件均已穷尽

    例如,查询中出现了工作区字段,不等于隔离已经正确实现。它可能来自不可信参数,也可能出现在无效分支中。需要针对真实授权边界设计测试。

    6.1 明确检查对象

    至少区分三种范围:

    范围比较对象适用时机
    当前工作 已跟踪的暂存、未暂存状态及未跟踪文件 日常收尾
    整个分支 目标分支与当前分支共同祖先之后的变更 合并前检查
    明确基线 指定基线与目标提交之间的变更 CI 或可复现审计

    已提交但未合并的修改,不能用空的工作区 diff 代替审查。分支检查应记录实际基线;基线不存在或 Git 命令失败时,应明确失败,不能吞掉错误后报告“没有改动”。

    对脚本实现的要求:

    • 文件列表使用 NUL 分隔等可靠方式,处理空格和特殊字符。
    • 纳入未跟踪文件,并处理删除、重命名及二进制文件。
    • 按文件类型和完整语法单元选择扫描方式,避免关键词跨文件误匹配。
    • 若只扫增量,要说明对未修改上下文的依赖和盲区。
    • 将“检查通过”“不适用”“无法执行”“检查失败”分别输出。

    6.2 增加统一收尾入口

    当检查变多时,用 tools/agent/finish.sh 编排它们。下面是行为契约,尚不是可直接执行的脚本:

    确定检查范围和基线

    收集已跟踪与未跟踪的变化,识别受影响模块

    执行基础检查和适用的领域门禁

    执行相关构建、测试、迁移或文档检查

    检查是否存在需要记录的新经验

    输出每项状态及总体退出码

    实现时,必需检查只要有一项失败,总退出码就必须非零。可以继续执行其他独立检查以收集证据,但不要让最后一条成功的输出掩盖前面的失败。依赖失败步骤的检查应标记为阻塞或未执行。

    可采用以下机器可读摘要:

    AUDIT_SCOPE=working_tree
    CHANGED_FILES=3
    LINT=passed
    BUILD=not_applicable
    TESTS=passed
    LESSONS_WARNING=no
    OVERALL=passed

    这只是格式示例,不能原样作为验证结果。not_applicable 需要说明理由;必需检查无法执行时,总体应为 incomplete 或失败,并使用非零退出码。

    6.3 用少量反例验证门禁本身

    门禁脚本也会写错。至少构造以下验证场景:

    场景预期
    合法修改 通过
    已知违规修改 非零退出并定位原因
    新增未跟踪文件包含违规 不能漏扫
    基线不存在 明确失败
    无适用代码变化 明确跳过构建,不伪造构建通过
    检查工具缺失 报告无法执行,不视作通过

    这些用例在隔离的临时仓库中执行,避免往工作仓库注入违规样例。

    6.4 把同一套检查接入 CI

    本地和 CI 应复用核心检查逻辑,分别传入合适的变更范围。CI 还需要配置依赖安装、足够的 Git 历史、目标基线以及对应的构建环境。

    推荐的责任分配是:本地快速发现问题,CI 在合并前重新核验。如果某条交付通道没有执行 CI,就不能宣称它拥有相同门禁。Git hook 可以作为可选便利,但不能代替远端必需检查。

    **本阶段验收:**故意引入一条已知违规时,本地和 CI 都能按预期失败;修复后通过,且报告相同规则编号。

    7. 第六阶段:让跨会话任务可以接续

    长任务需要交接文件,因为聊天记录可能被压缩、环境可能切换、执行者也可能变化。

    仅为预计跨会话的任务创建状态文件,例如 agent/state/<task-id>.md:


    task: 替换为明确目标
    status: in_progress
    updated: YYYY-MM-DD
    branch: 替换为实际分支
    head: 替换为最后核对的提交标识

    # 任务交接

    ## 验收条件

    ## 已确认事实与决策

    ## 已完成

    ## 当前文件变更

    ## 已运行的验证

    记录命令、结果、检查范围,以及验证后是否继续改过代码。

    ## 未完成与阻塞原因

    ## 下一步

    ## 相关文件与依据

    续接时先核对任务目标、当前分支、提交与工作区,再使用交接信息。其他任务的 in_progress 文件不意味着应该自动切换过去。

    交接保存结论、证据和下一步,不需要复制整段聊天。验证后又改过代码,应重新运行受影响的检查。全部验收条件满足才标记 done。

    个人任务状态通常可以加入忽略文件;团队确实需要共享时再纳入版本控制,并避免记录凭据或敏感内容。

    **本阶段验收:**新会话能准确说出已完成内容、剩余步骤和验证是否仍有效,不重新执行已确认无须重复的工作。

    8. 第七阶段:让错误逐步变成可复用规则

    工作流的演进应来自真实问题。每个任务都自动写一篇总结,容易产生重复材料。

    只在出现以下信号时记录经验:

    • 用户纠正了业务口径、关联关系或权限边界。
    • Agent 差点写错,而现有规则和检查无法覆盖。
    • 同一种误解反复出现,需要建立统一依据。

    lessons-inbox.md 中可使用以下条目:

    – 日期:YYYY-MM-DD
    现象:跨工作区导出缺少范围校验。
    建议:导出路径复用已验证的身份上下文。
    证据:替换为实际文件与验证场景。
    同类:export-scope
    状态:待评估

    这是虚构示例。Agent 负责提出有证据的候选经验,负责人评估适用范围,防止把一次特殊处理升级为全局要求。

    处理路径可以是:

    发现问题 → 记录证据 → 评估是否通用
    ├─ 业务事实 → 领域文档
    ├─ 重复步骤 → Skill
    ├─ 已知反模式 → 规则与检查
    └─ 特殊情况 → 保留案例或关闭

    同类问题出现两次仍未处理,可以发出提醒。次数阈值只是维护策略,不代表严重程度;单次严重问题也应立即处理。已被检查覆盖的问题无需重复进入收件箱。

    **本阶段验收:**至少一条真实经验完成“记录、评估、更新规则或检查、回归验证、关闭”的闭环。

    9. 把所有步骤连起来

    #mermaid-svg-jEVgyf46gM4LZlgb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jEVgyf46gM4LZlgb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jEVgyf46gM4LZlgb .error-icon{fill:#552222;}#mermaid-svg-jEVgyf46gM4LZlgb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jEVgyf46gM4LZlgb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jEVgyf46gM4LZlgb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jEVgyf46gM4LZlgb .marker.cross{stroke:#333333;}#mermaid-svg-jEVgyf46gM4LZlgb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jEVgyf46gM4LZlgb p{margin:0;}#mermaid-svg-jEVgyf46gM4LZlgb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jEVgyf46gM4LZlgb .cluster-label text{fill:#333;}#mermaid-svg-jEVgyf46gM4LZlgb .cluster-label span{color:#333;}#mermaid-svg-jEVgyf46gM4LZlgb .cluster-label span p{background-color:transparent;}#mermaid-svg-jEVgyf46gM4LZlgb .label text,#mermaid-svg-jEVgyf46gM4LZlgb span{fill:#333;color:#333;}#mermaid-svg-jEVgyf46gM4LZlgb .node rect,#mermaid-svg-jEVgyf46gM4LZlgb .node circle,#mermaid-svg-jEVgyf46gM4LZlgb .node ellipse,#mermaid-svg-jEVgyf46gM4LZlgb .node polygon,#mermaid-svg-jEVgyf46gM4LZlgb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jEVgyf46gM4LZlgb .rough-node .label text,#mermaid-svg-jEVgyf46gM4LZlgb .node .label text,#mermaid-svg-jEVgyf46gM4LZlgb .image-shape .label,#mermaid-svg-jEVgyf46gM4LZlgb .icon-shape .label{text-anchor:middle;}#mermaid-svg-jEVgyf46gM4LZlgb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jEVgyf46gM4LZlgb .rough-node .label,#mermaid-svg-jEVgyf46gM4LZlgb .node .label,#mermaid-svg-jEVgyf46gM4LZlgb .image-shape .label,#mermaid-svg-jEVgyf46gM4LZlgb .icon-shape .label{text-align:center;}#mermaid-svg-jEVgyf46gM4LZlgb .node.clickable{cursor:pointer;}#mermaid-svg-jEVgyf46gM4LZlgb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jEVgyf46gM4LZlgb .arrowheadPath{fill:#333333;}#mermaid-svg-jEVgyf46gM4LZlgb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jEVgyf46gM4LZlgb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jEVgyf46gM4LZlgb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jEVgyf46gM4LZlgb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jEVgyf46gM4LZlgb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jEVgyf46gM4LZlgb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jEVgyf46gM4LZlgb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jEVgyf46gM4LZlgb .cluster text{fill:#333;}#mermaid-svg-jEVgyf46gM4LZlgb .cluster span{color:#333;}#mermaid-svg-jEVgyf46gM4LZlgb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jEVgyf46gM4LZlgb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jEVgyf46gM4LZlgb rect.text{fill:none;stroke-width:0;}#mermaid-svg-jEVgyf46gM4LZlgb .icon-shape,#mermaid-svg-jEVgyf46gM4LZlgb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jEVgyf46gM4LZlgb .icon-shape p,#mermaid-svg-jEVgyf46gM4LZlgb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jEVgyf46gM4LZlgb .icon-shape .label rect,#mermaid-svg-jEVgyf46gM4LZlgb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jEVgyf46gM4LZlgb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jEVgyf46gM4LZlgb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jEVgyf46gM4LZlgb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    失败

    无法执行

    通过

    用户描述需求

    读取入口并检查工作状态

    明确交付物与验收条件

    判断任务规模并加载适用规则

    关键事实是否充分

    查询依据或询问缺失事实

    阅读样板并实施最小改动

    范围是否扩大

    执行适用验证

    必需检查是否通过

    报告未完成与具体阻塞

    按需更新交接与经验

    交付结果和证据

    例如,用户提出:“列表页增加一个筛选条件。”

    Agent 先确认字段语义与预期结果,读取相似筛选实现。如果影响仅局限于一个模块,就按单点流程执行。如果继续发现接口契约或数据结构必须调整,则补读相关规则并扩大验证范围。修改后覆盖实际改变的筛选行为;若涉及数据归属,还需验证边界。最后交付改了什么、跑了哪些检查、还剩什么。

    人的需求没有变成一串工具命令,流程细节由 Agent 承担。

    10. 多个 Agent 工具如何共用一套流程

    把业务规则保存在仓库中的唯一权威位置,为不同工具建立薄薄的入口适配层。适配层只负责加载,不再复制一整份规范。

    接入新工具时验证三件事:

  • 新会话是否实际读取了仓库入口?
  • 条件规则是否在适用任务中加载?
  • 修改后是否执行了同一套检查并正确解释退出码?
  • 不要仅凭配置文件存在就判断接入成功。让 Agent 报告读取的规则路径、准备修改的范围与验证命令,再用一个小任务检查实际行为。

    多 Agent 并行可以后续再引入。先确保单个 Agent 能稳定完成闭环;并行时还需要明确文件所有权、隔离工作区、合并负责人和最终验证责任。

    11. 交付信息也要有固定结构

    完成回复无需机械粘贴长表,但应包含以下内容:

    已完成:具体行为或交付物。

    变更:关键文件及修改原因。

    验证:实际运行的命令、检查范围与结果。

    剩余:未完成事项、无法执行的检查及影响;没有则省略。

    “检查通过”必须说明是哪一类检查。“构建通过”不能替代“业务测试通过”。环境限制导致测试未运行时,应明确写出,避免让读者误以为已经验证。

    12. 给 AI 的落地执行任务书

    以下内容可直接交给目标仓库中的 Agent。它是实施这篇指南的指令模板,不表示前文的示例目录和脚本已经在目标仓库存在。

    请为当前仓库搭建一个渐进式 AI Agent 开发工作流。

    目标:用户日常只描述需求,Agent 自动完成必要阅读、实现、验证和交付整理。

    执行顺序:

    1. 检查已有入口、规则、脚本、构建配置和 Git 状态。
    优先复用既有机制,不覆盖无关改动,不建立重复规则源。
    2. 先搭建统一入口、简短内核和实际可运行的检查入口。
    使用仓库真实命令;不能运行的检查明确报告,不写虚假成功占位。
    3. 加入轻量、单点、完整三档;档位由 Agent 自判。
    领域约束根据任务语义生效,不由文件数量豁免。
    4. 只为已确认适用的领域添加规则包,登记触发条件及权威文件。
    缺少业务事实时先查已有依据,仍无法确认再询问。
    5. 需要时补充最小知识路由、参考样板和交接模板。
    不为小任务强制创建专题文档或任务状态文件。
    6. 增强检查范围,纳入未跟踪文件,并区分工作区与分支审计。
    基线缺失、工具缺失和检查失败均不得解释成通过。
    7. 为门禁设计合法、违规、未跟踪文件和错误基线等验证场景。
    在隔离临时环境运行,检查退出码和定位结果。
    8. 若已有 CI,则复用核心检查接入当前流程。
    若需要外部配置或授权,先完成本地可审阅产物,再说明剩余步骤。
    9. 提供经验收件箱,仅记录真实且尚未覆盖的问题。
    10. 交付实际文件、检查证据、覆盖边界与尚未完成的配置。

    约束:

    – 不假设任何工具自动识别所有规则格式,必须验证入口加载。
    – 不引入与仓库无关的技术栈、业务名单和平台规范。
    – 团队与个人补充不能关闭适用硬门禁。
    – 不为工作流完整而重构业务代码。
    – 不擅自提交、推送或发布,遵守当前明确授权。

    完成条件:

    一次普通需求能实际走通:入口读取 → 必要阅读 → 修改 → 验证 → 交付。
    文档承诺的自动动作,应有实测证据;尚未实现的能力明确列为后续项。

    13. 最终验收:检查工作流是否真的成立

    验收场景应观察到的行为
    新会话的小改动 自动读取入口,完成修改与适用检查
    已有无关改动 保留,不混入任务交付
    一个局部缺陷 阅读同类实现,验证改变的行为
    涉及权限或数据边界 实现前加载规则,并验证实际边界
    中途扩大范围 及时补读规则并扩大验证
    新增未跟踪文件 纳入检查,不因 Git diff 为空漏过
    已提交的分支变更 选用分支或明确基线审计
    检查失败或无法运行 清楚报告,不声称全部完成
    长任务换会话 核实交接状态后继续
    同类误解重复发生 记录与评估,形成可复用修正

    可以分三轮建设:第一轮跑通最小闭环;第二轮加入实际用到的领域规则、样板和行为验证;第三轮再完善分支门禁、交接与经验维护。每轮都用真实的小任务验收,再增加下一层能力。

    赞(0)
    未经允许不得转载:171主机测评 » 从零搭建 AI Agent 开发工作流:从一次对话到可持续交付
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址