关于 aif-implement
aif-implement 是 AI Factory 技能,用于执行开发计划中的任务、跟踪进度并在不同会话间继续工作。它也支持不创建本地计划文件的单次小范围变更,并为关联任务提供 Handoff 同步流程。
主要功能
- 01执行计划中的任务
- 02只读列出可用计划
- 03无计划文件时执行单项任务
- 04跟踪进度并恢复工作
- 05与 Handoff 同步关联任务
适用场景
- 01执行开发计划中的任务
- 02不创建计划文件进行小范围修改
- 03在会话中断后继续实现工作
MCP 相关
关联 Handoff 任务时,该技能会在手动会话中使用 Handoff MCP 工具同步状态和计划内容。自主 Handoff 模式下由协调器负责同步,技能不会调用 MCP 工具。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ lee-to/ ai-factory --skill aif-implement安装后在 Claude Code 中输入/aif-implement确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/IMPLEMENTATION-GUIDE.mdLOGGING-GUIDE.mdtests/fast-plan-creates-file.yamlnon-ultra-index-does-not-change-full-discovery.yamlsequential-plan-discovery.yamlultra-reads-phase-updates-index.yamlwithout-plan-broad-scope-redirects.yamlwithout-plan-conflict-errors.yamlwithout-plan-creates-file.yamlwithout-plan-empty-errors.yamlwithout-plan-invalid-docs-errors.yaml详细介绍
实施 - 执行任务计划
执行计划中的任务、跟踪进度,并支持会话续接。
工作流
步骤 0(预备):检测交接模式
确定交接模式。如果调用方在提示词中明确传入了 HANDOFF_MODE 和 HANDOFF_SKIP_REVIEW,则使用这些值。否则,使用 Bash 工具:
Bash: printenv HANDOFF_MODE || true
Bash: printenv HANDOFF_SKIP_REVIEW || true
然后检查 HANDOFF_MODE:
当 HANDOFF_MODE 为 1(自主交接 Agent)时
交接协调器已经直接管理状态转换和数据库写入。请勿调用 MCP 工具。改为:
- 不提问: 不要使用
AskUserQuestion——使用合理的默认值(在检查点自动提交,跳过暂停提示)。 - 不暂停或恢复提示: 按顺序执行所有任务,不要停下来等待确认。遇到阻止继续的完整性、安全性或需求冲突时,仍应按规定的非交互式结果停止。
当 HANDOFF_MODE 不为 1(手动 Claude Code 会话)时
交接同步在流程中内联处理——请参阅步骤 0.2(读取计划文件后),了解任务 ID 提取和 MCP 同步触发。同步点如下:
- 开始时(步骤 0.2):
handoff_sync_status→"implementing"(设置paused: true) - 更新检查清单时(步骤 3.6): 使用更新后的计划内容调用
handoff_push_plan - 完成时(步骤 5): 先用最终计划调用
handoff_push_plan,然后调用handoff_sync_status→"review"(设置paused: true),或"done"(当HANDOFF_SKIP_REVIEW=1时设置paused: false)
重要: 除 done 外,每次调用 handoff_sync_status 时都必须传入 paused: true。这样可防止自主交接 Agent 在你手动处理期间接手任务。只有 done 才传入 paused: false。
步骤 0:检查当前状态
首先: 确定当前所处的状态:
1. Read `.ai-factory/config.yaml` if it exists to resolve:
- `paths.description`, `paths.architecture`, `paths.rules_file`, `paths.roadmap`, `paths.research`; derive `research_bundles_dir = <parent directory of paths.research>/research/`
- `paths.plan`, `paths.plans`, `paths.fix_plan`, `paths.patches`
- `paths.archive`
- `paths.rules`
- `language.ui`, `language.artifacts`
- `git.enabled`, `git.base_branch`, `git.create_branches`
- `workflow.plan_id_format` (default: `slug`) — used by branch-based plan discovery.
Active values: `slug` and `sequential`. Discovery treats a root `*.md` as
a full plan unless it is the resolved `paths.plan` or `paths.fix_plan`.
Treat a direct child `*/index.md` as an ultra bundle only after reading it
and confirming that it contains exactly one
``; ignore unrelated directories and never count
phase files independently.
When `sequential`, resolve both
`<paths.plans>/[0-9]{4}_<branch-slug>.md` and
`<paths.plans>/[0-9]{4}_<branch-slug>/index.md`, then choose the
highest-numbered matching artifact.
`timestamp` and `uuid` are **reserved values** and currently behave like `slug`.
Treat any unknown value as `slug`.
- `rules.base` plus any named `rules.<area>` entries
2. Parse arguments:
- --list → list available plans only (no implementation; STOP)
- --without-plan <description> → inline implementation mode; skip plan discovery and jump to Step 0.inline
- @<path> → explicit plan file, ultra directory, or ultra `index.md` override (highest priority)
- <number> → start from specific task
- status → status-only mode
- Optional inline-mode flag: --docs=yes|no|warn (only valid with --without-plan; default: warn)
3. If `git.enabled = true`, check for uncommitted changes (`git status`)
4. If `git.enabled = true`, check current branch
步骤 0.list:列出可用计划(--list)
如果 $ARGUMENTS 包含 --list,则以只读方式发现计划,然后停止。
1. Get current branch:
git branch --show-current (git mode only)
2. Convert branch to canonical stem: replace "/" with "-" (git mode only)
3. Check existence of:
- <configured plans dir>/<branch-stem>.md and
<configured plans dir>/<branch-stem>/index.md (git mode only); Read the
directory entrypoint and report it only when it contains exactly one
``
- when `workflow.plan_id_format = sequential`: also glob
`<configured plans dir>/[0-9][0-9][0-9][0-9]_<branch-stem>.md` and
`<configured plans dir>/[0-9][0-9][0-9][0-9]_<branch-stem>/index.md`;
Read every directory entrypoint, discard those without exactly one marker,
and report all valid matches (highest-numbered first)
- if git mode is off or branch creation is disabled: any root `*.md` full
plan or declared-ultra direct child `*/index.md` entrypoint in
`<configured plans dir>/`; exclude the resolved fast/fix plan paths
- <resolved fast plan path>
- <resolved fix plan path>
4. Print plan availability summary and usage hints
5. STOP.
重要: 在 --list 模式下:
- 不要执行任务
- 不要修改文件
- 不要更新 TaskList 状态
有关详细的输出格式和示例,请参阅:
skills/aif-implement/references/IMPLEMENTATION-GUIDE.md→“列出可用计划(--list)”
步骤 0.inline:内联实施模式(--without-plan)
如果 $ARGUMENTS 包含 --without-plan,则根据描述执行一个范围明确的任务,不要创建或读取任何计划文件。这是适用于小型 feat/chore 任务的轻量流程;这类任务不值得制定完整计划,但也不是错误修复(修复错误请使用 /aif-fix)。
参数解析:
1. description = everything after `--without-plan`, excluding any recognized flag tokens (`--docs=...`).
2. docs_policy = value of `--docs=yes|no|warn` if present, else `warn` (default).
3. Validation:
- description is empty →
ERROR: "Usage: /aif-implement --without-plan <description> [--docs=yes|no|warn]"
→ STOP
- arguments also contain `@<path>`, `status`, or a bare task id number →
ERROR: "`--without-plan` is mutually exclusive with @plan-file, status, and task id."
→ STOP
- `--docs=<value>` where <value> not in {yes, no, warn} →
ERROR: "Invalid --docs value. Expected yes|no|warn."
→ STOP
范围限制(防止任务悄然膨胀):
执行前,先评估描述。如果任务范围看起来过于宽泛,不适合一次性内联执行——例如包含多个由“and”/“и”连接且彼此无关的指令、涉及多个子系统,或范围描述大约超过 300 个字符——请勿尝试自行推测计划。请改为打印:
Description looks too broad for inline implementation. Recommended:
/aif-plan fast <description>
→ 停止。
范围小且明确的描述(例如“添加返回 200 和 {status:"ok"} 的 GET /healthz”)可继续执行。
对现有计划文件发出提醒(非阻塞):
内联模式按设计会忽略计划文件。如果磁盘上存在以下任何文件,请输出一行 WARN [inline],提醒用户这些文件被有意跳过(不要读取这些文件,也不要重定向):
<configured plans dir>/<branch>.md或<configured plans dir>/<branch>/index.md(仅 git 模式)——或对应的[0-9]{4}_<branch>顺序编号形式- 已解析的快速计划路径(
paths.plan) - 已解析的修复计划路径(
paths.fix_plan)
示例:WARN [inline] paths.plan exists but is ignored in --without-plan mode.
加载项目上下文(与常规实施相同):
使用步骤 0 中解析的配置:
paths.description(DESCRIPTION.md),如果存在paths.architecture(ARCHITECTURE.md),如果存在paths.rules_file(RULES.md)+rules.base+ 命名的rules.<area>条目.ai-factory/skill-context/aif-implement/SKILL.md— 如果该文件存在则为必需(其优先级与强制执行方式与 Step 0.1 中常规模式相同)language.ui、language.artifacts
计划产物策略: inline 模式不会加载或使用 plan/fix-plan 文件。计划文件永远不会被读取、解析或执行。允许进行最小限度的存在性探测(参见上文 surprise-warn 部分),仅用于输出 WARN [inline] 行——不会从磁盘读取任何内容。同时跳过:resume/recovery 对账、TaskList 加载、复选框状态比较。
执行任务(一次性):
- 声明:
Inline implementation: <description> - 仅读取与所述范围相关的文件
- 遵循现有代码模式和 skill-context 规则应用更改
- 按照
references/LOGGING-GUIDE.md应用详细日志记录 - 默认不添加测试。仅在以下情况下添加:描述中明确要求测试(例如 "with tests"、"add tests for X"),或者现有项目约定 / 涉及的代码路径明确要求测试(例如,测试文件与该区域每个源文件一一对应,或 RULES.md / skill-context 规则要求此类更改具备测试覆盖)。如有疑问,倾向于不添加测试,让用户通过
/aif-plan跟进以获得更广泛的测试覆盖。 - 验证更改可编译/运行,且所述行为正常工作
inline 模式中禁止的操作:
- 不要创建或读取
paths.plan/paths.plans/*/paths.fix_plan。 - 不要调用
/aif-plan或/aif-fix。 - 不要在
paths.patches下创建条目(不创建[FIX]自我改进补丁——这不是 bugfix 流程)。 - 不要调用
TaskList/TaskGet/TaskUpdate(没有计划 = 没有持久化任务)。 - 不要在磁盘上搜索或修改计划复选框。
- 不要触发 roadmap 里程碑完成检查、docs checkpoint-from-plan-setting、plan-file cleanup 提示或 worktree merge 提示(这些属于计划支撑的工作流)。
Handoff inline 支持:
命名澄清:
--without-plan意味着“磁盘上没有本地计划产物”(没有paths.plan/paths.plans/*/paths.fix_plan)。当 Handoff 任务被关联时,该任务仍通过handoff_push_plan在 Handoff 内部表示为一个合成计划——那是远程表示,而非本地文件。本地无计划契约得以保留;仅远程同步表面保持不变。
当 HANDOFF_MODE 为 1 时(自主 Handoff Agent 调用 inline 模式):
- 不要调用任何
mcp__handoff__*工具(协调器直接管理 status/sync——与 Step 0(pre)规则相同)。 - 不要创建本地计划产物(上述常规 Prohibited 列表仍然适用)。
- 不要切换分支、创建 worktree、合并 worktree,或以其他方式更改协调器设置的 branch/worktree——inline 模式在其被调用时的工作树上操作。
- 继续一次性执行;技能返回后,协调器将任务标记为完成。
当 HANDOFF_MODE 不为 1 且设置了 HANDOFF_TASK_ID 时(手动 Claude Code 会话关联到 Handoff 任务):
-
构建合成计划内容:
# Inline implementation - [ ] <description> -
调用
handoff_sync_status,参数为{ taskId: <HANDOFF_TASK_ID>, newStatus: "implementing", sourceTimestamp: "<current UTC ISO 8601>", direction: "aif_to_handoff", paused: true }。 -
调用
handoff_push_plan,参数为{ taskId: <HANDOFF_TASK_ID>, planContent: <synthetic content above> }。 -
执行成功后,将合成内容中的复选框翻转为
- [x],并使用更新后的文本再次调用handoff_push_plan。 -
完成同步:
- 如果
HANDOFF_SKIP_REVIEW为1→handoff_sync_status→"done",paused: false。 - 否则 →
handoff_sync_status→"review",paused: true。
- 如果
如果 HANDOFF_TASK_ID 缺失 → 跳过本次运行的所有 MCP 同步。
文档策略(内联模式,由 --docs 控制):
--docs=yes→ 完成后,显示文档检查点(与常规模式中的Docs: yes使用相同的 AskUserQuestion),并通过/aif-docs处理更改。--docs=no→ 跳过文档检查点,并输出WARN [docs] --docs=no in inline mode; documentation checkpoint skipped。--docs=warn(默认)→ 输出WARN [docs] Inline mode default is warn-only; documentation checkpoint skipped. Pass --docs=yes to enable.
内联模式中的上下文维护:
- 已解析的描述文档更新:允许,遵循与常规模式相同的规则(仅记录新增依赖项/集成的事实性差异)。
- 已解析的架构文档和
AGENTS.md:仅在实际创建了新模块/文件夹时允许更新。 - 已解析的路线图文档:内联模式下不更新(没有计划,无法关联里程碑)。
- 已解析的规则文件:内联模式下不编辑(与常规模式相同)。
完成时的输出(内联模式):
## Inline Implementation Complete
Task: <description>
Files modified:
- <file> (created|modified)
Documentation: <outcome per --docs>
What's next?
1. 🔍 /aif-verify — Verify the change (recommended)
2. 💾 /aif-commit — Commit directly
然后提供:
AskUserQuestion: Inline task complete. What's next?
Options:
1. Verify first — Run /aif-verify (recommended)
2. Skip to commit — Go straight to /aif-commit
→ 所选后续操作完成后即停止。不生成摘要文档或报告文件。
步骤 0.0:恢复/继续(中断后或执行 /clear 后)
如果用户在次日继续、表示会话已中止,或者你怀疑上下文已丢失(例如执行 /clear 后),请先从仓库重建本地上下文,再继续任务:
如果 git.enabled = true:
1. git status
2. git branch --show-current
3. git log --oneline --decorate -20
4. (optional) git diff --stat
5. (optional) git stash list
如果 git.enabled = false,跳过 git 恢复命令,仅根据已解析的计划/修复计划路径和工作树状态进行核对。
然后核对计划/任务状态:
- 当使用 Git 分支计划时,确保当前计划文档与当前分支匹配(
@path覆盖优先;否则,分支命名的完整计划文件或 ultra 目录优先于已解析的快速计划)。 - 如果
git.enabled = false,或者完整/ultra 计划是在没有分支的情况下创建的,则优先选择:- 显式指定的
@plan-file-or-directory, - 然后是配置的计划目录中唯一的根目录
*.md完整计划,或已声明 ultra 计划的直接子目录*/index.md入口文件(排除已解析的快速/修复计划路径), - 然后是已解析的快速计划路径。
- 显式指定的
- 比较
TaskList状态与计划入口文件中的复选框。- 如果某个任务的代码更改看起来已实现,但任务尚未标记为已完成,请快速验证,然后执行
TaskUpdate(..., status: "completed")并更新计划复选框。 - 如果某个任务已标记为已完成,但对应代码缺失(发生了 rebase/reset),则将其重新标记为待处理,并与用户讨论。
- 如果某个任务的代码更改看起来已实现,但任务尚未标记为已完成,请快速验证,然后执行
如果存在未提交的更改:
AskUserQuestion: You have uncommitted changes. Commit them first?
Options:
1. Yes, commit now (/aif-commit)
2. No, stash and continue
3. Cancel
根据选择:
- 是 → 运行
/aif-commit,然后继续发现计划 - 否 →
git stash push -m "aif-implement: stash before plan execution",然后继续 - 取消 → 告知用户:“实施已取消。” → 停止
如果不存在计划文件,但存在已解析的修复计划:
修复计划由 /aif-fix 在计划模式下创建。转入修复工作流:
Found a fix plan at the resolved fix plan path.
This plan was created by /aif-fix and should be executed through the fix workflow
(it creates a patch and handles cleanup automatically).
Running /aif-fix to execute the plan...
→ 调用 /aif-fix(不带参数——它会检测已解析的修复计划并执行该计划)。
→ 停止——不要继续实施工作流。
如果不存在计划文件,也不存在已解析的修复计划(所有任务均已完成或刚开始):
AskUserQuestion: No active plan found. Current branch: <current-branch>.
What would you like to do?
Options:
1. Start new feature from current branch
2. Return to configured base branch and start new feature
3. Create quick task plan (no branch)
4. Nothing, just checking status
根据选择:
- 新功能,基于当前状态 →
/aif-plan full <description> - 返回基础分支 →
git checkout <configured-base-branch>,然后执行git pull origin <configured-base-branch>→/aif-plan full <description>(仅 Git 模式) - 快速任务 →
/aif-plan fast <description> - 无操作,只查看状态 → 显示分支信息和近期提交摘要 → 停止
如果 git.enabled = false,将选项 2 替换为:
2. 不创建分支,创建详细完整计划- 将其转交给
/aif-plan full <description>,不执行任何 git 命令
如果计划文件存在 → 继续执行步骤 0.1
步骤 0.1:加载项目上下文和过往经验
使用步骤 0 中解析出的配置:
- 路径: description、architecture、RULES.md、路线图、research、plan 文件、patches 和 rules 目录
- 语言: prompts 使用
language.ui,生成的内容使用language.artifacts - 规则层级: 已解析的 RULES.md 文件 +
rules.base+ 命名的rules.<area>条目
如果 .ai-factory/DESCRIPTION.md 存在,请读取(使用配置中的路径)以了解:
- 技术栈(语言、框架、数据库、ORM)
- 项目架构和约定
- 非功能性需求
如果已解析的架构文档存在,请读取(paths.architecture,默认值:.ai-factory/ARCHITECTURE.md)以了解:
- 选定的架构模式和文件夹结构
- 依赖规则(什么依赖什么)
- 层/模块边界和通信模式
- 实现时遵循这些约定,包括文件放置、导入和模块边界
如果已解析的 RULES.md 路径存在,请读取:
- 这些是用户添加的项目专属规则和约定
- 实现时始终遵循这些规则——它们优先于通用模式
- 规则简短且可执行——将每条规则视为硬性要求
读取规则层级(路径来自配置):
- RULES.md – 公理(通用项目规则)
- rules/base.md — 项目专属的基础约定(命名、结构、模式)
- rules. — 根据配置解析出的特定领域规则条目(例如
rules.api、rules.frontend)
加载所有可用的规则文件并合并。更具体的规则优先于通用规则。
读取 .ai-factory/skill-context/aif-implement/SKILL.md — 如果文件存在则必须读取。
此文件包含 /aif-evolve 根据补丁、代码库约定和技术栈分析积累的项目专属规则。这些规则针对当前项目量身定制。
如何应用 skill-context 规则:
- 将其视为对此技能通用说明的项目级覆盖规则
- 当 skill-context 规则与本 SKILL.md 中的通用规则冲突时,以 skill-context 规则为准(更具体的上下文优先——与嵌套 CLAUDE.md 文件遵循相同原则)
- 如果没有冲突,则同时应用:SKILL.md 中的通用规则和 skill-context 中的项目规则
- 即使 skill-context 规则看起来与此技能的默认规则矛盾,也不要忽略它们——这些规则之所以存在,是因为项目经验表明默认规则并不充分
- 重要: skill-context 规则适用于此技能的所有输出——包括编写的代码以及更新计划复选框的方式。如果 skill-context 规则要求“代码必须遵循 X”或“实现必须包含 Y”,则必须遵守。编写违反 skill-context 规则的代码属于缺陷。
执行要求: 生成任何输出文档后,都要根据所有 skill-context 规则进行检查。如果违反了任何规则,请在向用户展示前修正输出。
补丁备用方案(仅在缺少 skill-context 时有限使用):
- 如果
.ai-factory/skill-context/aif-implement/SKILL.md不存在,且已解析的 patches 目录存在:- 使用
Glob在已解析的 patches 目录中查找*.md文件 - 按文件名字典序升序排列补丁文件,然后选择最后 10 个(少于 10 个则全部选择)
- 只读取选中的补丁文件
- 优先关注 Root Cause 和 Prevention 部分
- 使用
- 如果 skill-context 存在,默认情况下不要读取所有补丁。
- 仅当任务明显符合已知故障模式时,才可选择性地读取少量相关的近期补丁。
实现时使用这些上下文:
- 遵循指定的技术栈
- 使用正确的导入模式和约定
- 按照指定方式进行适当的错误处理和日志记录
- 避免 skill-context 规则和相关备用补丁中记录的陷阱
步骤 0.2:查找计划文档
将每个选定的文档统一为:
plan_entrypoint— 包含设置和## Tasks的单个 Markdown 文件plan_bundle_dir— 对于 fast/full/fix 计划为空;其他情况为 ultra 目录phase_files— 对于单文件计划为空;其他情况为 ultra 入口文件## Phase Index中 按顺序排列的链接
如果 $ARGUMENTS 包含 @<path>:
- 相对于项目根目录解析路径(也接受绝对路径)。
- 接受现有 Markdown 文件、包含
index.md的 ultra 目录,或该 ultra 包中的index.md。 - 如果两种形式都不存在,使用 fast 文件、full 文件和 ultra 目录的示例报告缺失路径,然后停止。
- 在规范化目录或将显式指定的
index.md视为 ultra 之前,读取index.md并要求其中恰好有一个 ``;否则以计划完整性错误停止。 - 如果所选文件是
paths.fix_plan,调用/aif-fix并停止。 - 否则使用该文件并跳过自动发现。
如果没有显式覆盖,则按以下顺序解析:
1. Branch-based full/ultra artifact:
a. Compute <branch-stem> by replacing "/" with "-".
b. For workflow.plan_id_format=sequential, glob both:
<paths.plans>/[0-9][0-9][0-9][0-9]_<branch-stem>.md
<paths.plans>/[0-9][0-9][0-9][0-9]_<branch-stem>/index.md
Read every directory candidate and retain it only when `index.md` contains
exactly one . Choose the highest numeric prefix
across valid artifacts. If multiple valid candidates exist, emit
WARN [aif-implement] and name the chosen artifact; if both shapes share
the highest prefix, prefer ultra.
c. If no valid sequential candidate exists, or sequential mode is inactive,
check:
<paths.plans>/<branch-stem>/index.md
<paths.plans>/<branch-stem>.md
Read the directory entrypoint before selection and ignore it unless it
contains exactly one . If both valid shapes
exist, emit WARN and prefer the ultra entrypoint.
2. If no branch artifact resolves, count active named artifacts as:
- each root <paths.plans>/*.md file except resolved paths.plan and paths.fix_plan
- each direct child <paths.plans>/*/index.md containing
Exactly one total → use it. More than one → ask the user to choose or use
@<path>; do not count phase files as independent plans.
3. No named artifact → paths.plan.
4. No regular plan → paths.fix_plan, then redirect to /aif-fix and STOP.
优先级仍为:显式路径 → 基于分支的 full/ultra 工件 → 单个命名的 full/ultra 工件 → fast 计划 → 重定向到 fix 计划。发现过程只扫描 paths.plans;排除 paths.archive/plans 下的归档文件和目录。
读取所选工件:
- 如果自动发现的目录入口文件不恰好包含一个 ``, 则它不是 AI Factory 计划。忽略它并继续发现。如果它包含该标记,但 Phase Index 格式错误,则以计划完整性错误停止,不要回退到其他计划。
- 始终完整读取
plan_entrypoint。 - 如果它是 ultra(包含 ``),则验证 Phase Index 中的每个相对链接,拒绝逃逸出该包的路径,记录按顺序排列的阶段文件,并确保每个索引任务都恰好对应一个
## Task N章节。若包损坏,则发出警告并停止,不要猜测。 - 实施某个任务前,完整读取该任务的阶段文件。恢复执行时,即使活动阶段在之前的会话中已读取,也要重新读取。
index.md是唯一的进度来源;阶段文件不得包含重复的任务复选框。- 将
## Original Request视为有用的原始范围上下文。可执行输入仍包括设置、依赖项、任务清单、已提交的 Research Context,以及(对于 ultra)链接的阶段规范。 - 对入口文件中的 Research Context 应用研究偏移约定。使用规范语法
^(?:Source|Reference):\s+\x60([^\x60]+)\x60\s+\(解析第一行Source:/Reference:;捕获反引号括起的路径,以保留空格和方括号。对于较旧的裸路径行,回退到^(?:Source|Reference):\s+(.+?)\s+\(。仅当两种形式都无法识别出可用路径时,才回退到paths.research。 - 如果解析出的来源位于
research_bundles_dir内,则要求其同级INDEX.md恰好包含 ``,且在## Artifact Index中链接到该RESEARCH.md;否则发出WARN [research-drift]。有效的同级 C4/ADR/依赖项工件仅作为理由说明,不会扩大已提交的范围。 - 存在
SHA256:时,严格提取当前来源文本中位于和之间的内容,移除 HTML 注释块,保留行顺序和行首空白,去除每行末尾的空格,使用 LF 换行,并以一个换行符结尾。通过 stdin 使用shasum -a 256或sha256sum计算哈希;摘要具有权威性。仅当不存在SHA256:时,才将Updated:用作旧版回退方式。如果来源缺失或无效,或版本不匹配,则发出WARN [research-drift]并继续使用已提交的计划上下文。在本约定的单文件表述中:发出WARN [research-drift]并继续使用计划中内嵌的 Research Context 作为范围。
读取 plan_entrypoint 后立即检查其第一行是否包含 ``:
- 在手动模式下,提取它,并调用
handoff_sync_status,状态设为implementing,使用实际的当前 UTC 时间戳,方向设为aif_to_handoff,并将paused: true。 - 在自主 Handoff 模式下,不要调用 MCP。
- 如果不存在,则本次会话跳过 MCP 同步。
向 Handoff 推送 ultra 进度时,将完整套件序列化为入口文件内容,后接每个 链接的阶段文件,并按顺序以 `` 作为前缀。
步骤 1:加载当前状态
TaskList → Get all tasks with status
查找:
- 下一个待处理任务(未阻塞、未完成)
- 任何进行中的任务(优先恢复这些任务)
步骤 2:显示进度
## Implementation Progress
✅ Completed: 3/8 tasks
🔄 In Progress: Task #4 - Implement search service
⏳ Pending: 4 tasks
Current task: #4 - Implement search service
步骤 3:执行当前任务
对于每项任务:
3.1:获取完整详情
TaskGet(taskId) → Get description, files, context
对于 ultra 套件,先从 index.md 解析任务详情链接,然后在将任务标记为进行中
之前,读取链接阶段文件的全部内容。将其中按顺序排列的实现步骤、接口、边缘情况、
日志记录、验收标准和验证要求都视为必需内容。不要仅仅因为 TaskGet 包含较短
摘要,就改用新方案。如果阶段说明与当前代码或项目上下文冲突,请停止并报告
具体差异;不要悄悄做出 ultra 原本要预先规划的架构决策。
3.1.1:运行需求一致性门槛
在将会改变行为的任务标记为进行中之前:
- 如果计划中存在
## Requirements Reconciliation章节,请先阅读。根据内嵌的## Research Context(它仍是已提交的需求快照),核对所选研究来源的引用。 仅在步骤 0.2 的差异警告中使用实时研究文件;除非明确执行重新基准,否则 不要用它更改任务需求。重新阅读其他引用权威来源中的相关内容。 - 仅在用户或项目明确声明优先级层次时才应用该层次。除非明确声明路线图文本 是详细契约,否则应将其视为范围说明。
- 将任务拟议的行为与引用的需求进行比较。如果二者明显冲突,请输出
ERROR [requirement-conflict],将任务保留为待处理状态,并停止。在手动模式下, 请求澄清。在HANDOFF_MODE=1下,不要提示;返回handoff_outcome: blocked_external,以便协调器路由该任务,也不要表示实现已完成 或请求评审。不要先实现,再事后改写需求文档。 - 如果行为取决于彼此独立的选择器、状态、模式或输入形状,请确认任务涵盖 所有适用且受支持的组合,包括验证、持久化、输出/转换和副作用。不要根据 关于某一维度的规则,推断对另一维度的限制。
如果旧计划缺少 ## Requirements Reconciliation,请根据任务、Original Request、
已提交的 Research Context、项目规则以及其中明确引用的任何权威来源执行此门槛。
内嵌的 Research Context 仍优先于其实时差异来源。不要扩展到无关研究。
3.2:标记为进行中
TaskUpdate(taskId, status: "in_progress")
3.3:实现任务
- 阅读相关文件
- 进行必要的更改
- 遵循现有代码模式
- 除非计划包含测试任务,否则不要编写测试
- 不要撰写报告或摘要
- 将需求、研究、路线图、规则和架构文档视为只读,除非当前任务明确要求修改其所属文档。这不妨碍稍后在此工作流中明确允许的事实性上下文维护,但此类更新不得仅为匹配实现而更改行为需求。
3.4:验证实现
- 检查代码能否编译/运行
- 验证功能是否正常
- 修复任何即时问题
- 运行任务指定的验证场景。当有代表性的仓库制品定义契约时,应通过主要路径验证该制品,而不要只依赖合成测试夹具。
3.5:标记为已完成
TaskUpdate(taskId, status: "completed")
3.6:更新计划入口文件中的复选框
完成任务后,立即更新计划入口文件中的复选框
(ultra 对应 index.md):
# Before
- [ ] Task 1: Create user model
# After
- [x] Task 1: Create user model
此操作为强制要求——复选框必须反映实际进度:
- 使用
Edit工具将- [ ]改为- [x] - 每完成一项任务后,立即执行此操作
- 即使之后会提供删除选项,也要执行
- 计划入口文件是进度的真实来源
- 绝不要在 ultra 阶段文件中添加或更新重复的进度复选框
**交接同步(仅限手动模式——当 HANDOFF_MODE 为 1 时跳过):**如果在步骤 0.2 中提取了 Handoff 任务 ID,则调用 handoff_push_plan,并传入 { taskId: <id>, planContent: <full updated plan text> } 以同步检查清单进度。对于 ultra,请使用步骤 0.2 中定义的 bundle 序列化方式。
3.7:必要时更新已解析的描述文档
如果在实现过程中:
- 添加了新的依赖项/库
- 技术栈发生变化(例如添加 Redis、更换 ORM)
- 添加了新的集成(例如 Stripe、SendGrid)
- 做出了架构决策
→ 更新已解析的描述文档(paths.description,默认值:.ai-factory/DESCRIPTION.md),以反映这些变更:
## Tech Stack
- **Cache:** Redis (added for session storage)
这样可确保已解析的描述文档始终是真实来源。
3.7.1:项目结构发生变化时更新 AGENTS.md 和 ARCHITECTURE.md
如果在实现过程中:
- 创建了新的目录或模块
- 项目结构发生重大变化(新增
src/modules/、新的 API 路由目录等) - 添加了新的入口点或关键文件
→ 更新 AGENTS.md——刷新“Project Structure”树和“Key Entry Points”表,以反映新增的目录/文件。
→ 更新已解析的架构文档——如果添加了应记录在文件夹结构部分中的新模块或层级。
仅在结构确实发生变化时更新——不要在每项任务后都重写。检查是否创建了当前结构图中尚未列出的新目录。
3.8:检查提交检查点
如果计划中有提交检查点,且当前任务处于某个检查点:
AskUserQuestion: ✅ Tasks <first>-<last> completed. This is a commit checkpoint. Ready to commit? Suggested message: "<conventional commit message>"
Options:
1. Yes, commit now (/aif-commit)
2. No, continue to next task
3. Skip all commit checkpoints
根据选择执行:
- 是,现在提交 → 使用建议的消息调用
/aif-commit,然后继续下一项任务 - 否,继续下一项任务 → 不提交,直接继续下一项任务
- 跳过所有提交检查点 → 在本次
/aif-implement运行的后续所有检查点中,自动跳过提示并直接继续下一项任务(相当于每次都选择“否,继续下一项任务”)。此项设置仅在当前上下文中有效——执行/clear或开启新会话后会重置
3.9:继续下一项任务或暂停
步骤 4:会话持久化
进度会通过 TaskUpdate 自动保存。
暂停:
Current progress saved.
Completed: 4/8 tasks
Next task: #5 - Add pagination support
To resume later, run:
/aif-implement
恢复(下一会话):
/aif-implement
→ 自动查找下一项未完成的任务
步骤 5:完成
**交接同步(仅限手动模式——当 HANDOFF_MODE 为 1 时完全跳过):**如果从计划注释中提取了 Handoff 任务 ID,且 HANDOFF_MODE 不为 1:
- 调用
handoff_push_plan,并传入{ taskId: <id>, planContent: <final updated plan text> };对于 ultra,请序列化完整的 bundle。 - 如果
HANDOFF_SKIP_REVIEW为1:调用handoff_sync_status,并传入{ taskId: <id>, newStatus: "done", sourceTimestamp: "<current UTC time in ISO 8601 format>", direction: "aif_to_handoff", paused: false }。 - 否则:调用
handoff_sync_status,并传入{ taskId: <id>, newStatus: "review", sourceTimestamp: "<current UTC time in ISO 8601 format>", direction: "aif_to_handoff", paused: true }。
所有任务完成后:
## Implementation Complete
All 8 tasks completed.
Branch: feature/product-search
Plan artifact: .ai-factory/plans/feature-product-search.md
Files modified:
- src/services/search.ts (created)
- src/api/products/search.ts (created)
- src/types/search.ts (created)
Documentation: updated existing docs | created docs/<feature-slug>.md | skipped by user | warn-only (Docs: no/unset)
What's next?
1. 🔍 /aif-verify — Verify nothing was missed (recommended)
2. 💾 /aif-commit — Commit the changes directly
检查 ROADMAP.md 进度:
如果已解析的路线图文档存在:
- 读取该文档
1.1. 如果计划入口文件包含
## Roadmap Linkage,且其中的里程碑不为none,则优先使用该里程碑进行完成标记 - 检查已完成的工作是否对应某个未勾选的里程碑
- 如果对应——将其标记为
[x],并使用当天日期在 Completed 表中添加条目 - 告知用户标记为已完成的里程碑
上下文维护(工件)
仅在有具体内容需要记录时执行此步骤。
DESCRIPTION.md(允许在此命令中修改):
- 如果此计划引入了新的依赖项/集成,或更改了技术栈,请仅根据实际差异更新已解析的描述工件。
- 不要重写无关章节。
ARCHITECTURE.md + AGENTS.md(允许在此命令中修改):
- 如果添加了新模块/层/文件夹(或更改了依赖规则),请更新已解析的架构工件,以反映新的结构和约束。
- 如果你维护
AGENTS.md的结构图或入口点,仅在其内容有误时更新。
ROADMAP.md(允许修改,但有限制):
- 有明确证据时,此命令可以标记里程碑已完成。
- 如果里程碑映射不明确,输出
WARN [roadmap] ...并建议用户使用以下命令:/aif-roadmap check- 或
/aif-roadmap <short update request>
RULES.md(此命令中不允许修改):
- 绝不编辑
/aif-implement中已解析的paths.rules_file工件。 - 如果在实现过程中发现了可重复的惯例/陷阱,请提出最多 3 条候选规则,并请用户通过
/aif-rules添加。 - 不要自动调用
/aif-rules(该命令由用户调用)。
如果存在候选规则:
AskUserQuestion: Capture new project rules in the resolved RULES.md artifact?
Options:
1. Yes — output `/aif-rules ...` commands (recommended)
2. No — skip
文档策略检查点(完成后、清理计划前):
读取计划入口点设置 Docs: yes/no。
如果计划设置为 Docs: yes:
AskUserQuestion: Documentation checkpoint — how should we document this feature?
Options:
1. Update existing docs (recommended) — invoke /aif-docs
2. Create a new feature doc page — invoke /aif-docs with feature-page context
3. Skip documentation
处理方式:
- 选项 1 → 调用
/aif-docs,根据已完成的工作更新 README/文档 - 选项 2 → 调用
/aif-docs并提供上下文,以创建docs/<feature-slug>.md,包含以下章节(Summary、Usage/user-facing behavior、Configuration、API/CLI changes、Examples、Troubleshooting、See Also),并在 README 文档表格中添加链接 - 选项 3 → 不调用
/aif-docs;输出WARN [docs] Documentation skipped by user
如果计划设置为 Docs: no 或未设置:
- 不要显示强制性的文档检查点提示
- 不要自动调用
/aif-docs - 输出
WARN [docs] Docs policy is no/unset; skipping documentation checkpoint
最终完成输出中必须始终包含文档处理结果:
Documentation: updated existing docsDocumentation: created docs/<feature-slug>.mdDocumentation: skipped by userDocumentation: warn-only (Docs: no/unset)
完成后处理计划工件:
-
如果是已解析的快速计划路径(来自
/aif-plan fast):AskUserQuestion: Would you like to delete the resolved fast plan file? (It's no longer needed) Options: 1. Yes, delete it 2. No, keep it根据选择处理:
- “是,删除” → 删除文件:
rm <resolved fast plan path> - “否,保留” → 保留文件不变,继续下一步
- “是,删除” → 删除文件:
-
如果是以分支命名的完整文件或 ultra bundle 目录:
- 保留——用于记录已完成的工作
- 如有需要,用户可以在合并前删除
检查当前是否在 git worktree 中运行:
检测 worktree 上下文:
# If .git is a file (not a directory), we're in a worktree
[ -f .git ]
如果当前位于 worktree 中,请提供合并回去并清理的选项:
You're working in a parallel worktree.
Branch: <current-branch>
Worktree: <current-directory>
Main repo: <main-repo-path>
AskUserQuestion: Would you like to merge this branch into the configured base branch and clean up?
Options:
1. Yes, merge and clean up (recommended)
2. No, I'll handle it manually
根据选择处理:
- “是,合并并清理” → 按照下方的 Worktree Merge 流程操作
- “否,我会手动处理” → 显示提醒:
To merge and clean up later: cd <main-repo-path> git merge <branch> /aif-plan --cleanup <branch>
Worktree Merge
-
确保所有内容均已提交 — 检查
git status。如果存在未提交的更改,建议先运行/aif-commit并等待。 -
获取仓库根路径:
MAIN_REPO=$(git rev-parse --git-common-dir | sed 's|/\.git$||') BRANCH=$(git branch --show-current) -
切换到仓库根目录:
cd "${MAIN_REPO}" -
合并分支:
git checkout <configured-base-branch> git pull origin <configured-base-branch> git merge "${BRANCH}"如果发生合并冲突:
⚠️ Merge conflict detected. Resolve manually: cd <main-repo-path> git merge --abort # to cancel # or resolve conflicts and git commit→ 在此处停止,不要继续清理。
-
移除 worktree 和分支(仅在合并成功后):
git worktree remove <worktree-path> git branch -d "${BRANCH}" -
确认:
✅ Merged and cleaned up! Branch <branch> merged into <configured-base-branch>. Worktree removed. You're now in: <main-repo-path> (<configured-base-branch>)
→ 停止 — worktree 已合并并移除,无需执行其他步骤。
最后一步 — 验证或提交
AskUserQuestion: All tasks complete. What's next?
Options:
1. Verify first — Run /aif-verify to check completeness (recommended)
2. Skip to commit — Go straight to /aif-commit
根据选择:
- “先验证” → 调用
/aif-verify→ 完成后,继续执行下方的上下文清理 - “跳过并提交” → 调用
/aif-commit→ 完成后,继续执行下方的上下文清理
上下文清理(验证或提交后):
如有需要,建议用户释放上下文空间:使用 /clear(完全重置)或 /compact(压缩历史记录)。
重要:不要生成摘要报告,不要编写分析文档,也不要执行收尾任务。
命令
开始/继续实现
/aif-implement
从下一个未完成的任务继续。
列出可用计划
/aif-implement --list
列出已解析的快速/修复计划路径,以及当前分支的完整/超长产物(包括顺序标识符),然后退出,不执行实现。
使用指定的计划产物
/aif-implement @my-custom-plan.md
/aif-implement @.ai-factory/plans/feature-user-auth.md status
/aif-implement @.ai-factory/plans/feature-user-auth status
使用提供的计划文件、超长计划目录或超长计划 index.md,而不是自动检测计划文件或分支默认产物。
内联实现(无计划)
/aif-implement --without-plan add GET /healthz endpoint returning {"status":"ok"}
/aif-implement --without-plan rename LogLevel.VERBOSE to LogLevel.TRACE --docs=yes
一次性执行小型任务,不使用任何计划文件。不能与 @plan-file、status 或任务 ID 同时使用。不会创建 FIX_PLAN.md 或补丁。默认文档策略为 warn;传入 --docs=yes 可运行文档检查点,传入 --docs=no 可关闭警告。完整流程请参阅 Step 0.inline。
从指定任务开始
/aif-implement 5
从任务 #5 开始(适用于跳过任务或重新执行任务)。
仅检查状态
/aif-implement status
显示进度,但不执行任务。
执行规则
应执行:
- ✅ 一次执行一个任务
- ✅ 开始任务前,将其标记为 in_progress
- ✅ 完成任务后,将其标记为 completed
- ✅ 遵循现有代码规范
- ✅ 遵循
/aif-best-practices指南(命名、结构、错误处理) - ✅ 创建任务说明中提到的文件
- ✅ 处理任务中提到的边界情况
- ✅ 如果任务不明确,暂停并询问
不应执行:
- ❌ 编写测试(除非任务列表明确要求)
- ❌ 创建报告文件
- ❌ 创建摘要文档
- ❌ 添加计划中没有的任务
- ❌ 未经用户许可跳过任务
- ❌ 将未完成的任务标记为已完成
- ❌ 违反已解析架构产物中关于文件放置和模块边界的规范
产物归属边界
- 此命令的主要归属内容:任务执行状态和计划进度复选框。
- 允许更新的上下文产物:已解析的描述产物、已解析的架构产物,以及在实现证据支持时,已解析路线图产物中的路线图里程碑完成状态。
- 此命令默认只读的上下文:已解析的
paths.rules_file、配置的paths.research,以及计划入口链接的任何确切研究来源。 - 上下文检查发现应仅通过
WARN/ERROR输出传达;这不会取代下方要求的详细实现日志记录规则。
有关进度显示格式、阻塞问题处理、会话连续性示例和完整流程示例 → 请参阅 references/IMPLEMENTATION-GUIDE.md
关键规则
- 除非任务列表明确包含测试任务,否则绝不编写测试
- 完成后绝不创建报告或摘要文档
- 开始工作前始终将任务标记为 in_progress
- 完成后始终将任务标记为 completed
- 始终更新计划文件中的复选框——任务完成后立即将
- [ ]→- [x] - 保留进度——任务应跨会话保留
- 一次只处理一个任务——只专注于当前任务
关键:日志记录要求
实现代码时始终添加详细日志。 有关日志指南、模式和管理要求 → 请阅读 references/LOGGING-GUIDE.md
关键规则:记录函数的进入/退出、状态变更、外部调用和错误上下文。使用结构化日志和可配置的日志级别(LOG_LEVEL 环境变量)。
不要为了“保持代码整洁”而跳过日志记录——实现期间必须添加详细日志,但日志必须可配置。