# FlowPilot

[English](README.en.md)

**一个文件，一句开发需求，全自动开发。**

把 `flow.js` 丢进任何项目，打开你选择的客户端（`Claude Code` / `Codex` / `Cursor` / `snow-cli` 等）描述你要做什么，然后去喝杯咖啡。
回来的时候，代码写好了，测试跑完了，git 也提交了。

> 新增说明：现已兼容 `Claude Code`、`Codex`、`Cursor`、`snow-cli` 和其他客户端；`init` 时可直接选择目标客户端并生成对应的 instruction file / 配置。

> 新增说明：内置 instruction file / 客户端增强模板现已将**输出风格作为硬约束**，要求回答遵循：**先结论、后细节、简洁直给、终端友好**；同时补强了依赖分析、并行调度、危险操作确认等执行约束，FlowPilot 自己的终端输出也会强化分组、状态图标与下一步提示。
> 这次升级**不仅包含表现层优化**：更友好的话术、更清晰的分组、更直观的终端排版之外，也同步增强了中断恢复、收尾边界、实时进度上报与验证策略。使用前请以最新文档和命令实际输出为准。

> 多客户端全自动并行开关：
> - `Claude Code`：开启 Agent Teams
> - `Codex`：在 `~/.codex/config.toml` 中设置 `multi_agent = true`，建议直接用 `codex --yolo`
> - `Cursor`：开启 `Agents`，并将 `Auto-Run Mode` 调成 `Run Everything`

> `Codex` 增强规则预览：
> - 标准执行流程：任务分析 → 并行调度与子任务下发 → 结果汇总 → 递归迭代
> - 并行约束：无前置依赖且无写冲突的任务优先并发；单轮最多同时下发 `50` 个子任务
> - 子任务契约：下发子任务时必须明确 `代理名称 / 任务定义 / 执行动作 / 预期结果`

## 快速开始

```bash
# 1. 构建并复制到你的项目
cd FlowPilot && npm install && npm run build
cp dist/flow.js /your/project/

# 2. 初始化（会显示客户端选项）
cd /your/project
node flow.js init

# 3. 启动客户端，直接描述需求
claude --dangerously-skip-permissions
```

初始化时会直接显示客户端选项：
- `Claude Code`：生成 `CLAUDE.md` + `.claude/settings.json`
- `Codex`：生成 `AGENTS.md`，并附加 Codex 平台增强规则（并行调度 + 子任务契约）
- `Cursor` / `Other`：生成通用版 `AGENTS.md`
- `snow-cli`：生成 `AGENTS.md` + `ROLE.md`

中断后直接继续：

```bash
# Claude Code
claude --dangerously-skip-permissions --continue

# Codex
codex --yolo
```

- `Claude Code`：推荐直接用 `--continue` / `--resume`
- `Codex`：重新进入项目目录后启动 `codex --yolo`，然后说「继续任务」
- `Cursor`：重新打开项目，在原会话或新会话中说「继续任务」
- `snow-cli` / 其他客户端：重新进入项目目录，恢复或新开会话后说「继续任务」

需要更完整说明时，再往下看「初始化与客户端选项」「执行流程」「错误处理」。

## 最近更新

🔥 **OpenSpec 集成** — 任务解析器兼容 OpenSpec checkbox 格式，双路径协议自动选择标准/OpenSpec 规划流程，支持 `tasks.md` 自动发现与用户确认

🧠 **长期记忆系统** — checkpoint 自动提取知识存入 `.flowpilot/memory.json`，BM25 + Dense 双路检索，MMR 重排序 + 时间衰减，`next` 时自动注入相关记忆到子Agent上下文

🔄 **自我进化引擎（完整闭环）** — Reflect → Experiment → Review 三阶段循环，成功/失败均触发进化，参数写入 config 被工作流真正消费，退化自动回滚

| 模块 | 评分 | 借鉴内容 |
|------|------|----------|
| 记忆系统 | 100% | BM25 稀疏向量（FNV-1a 20-bit）、Dense Vector 检索、RRF 三源融合、Multimodal 嵌入、10语言分词、TTL+LRU 缓存 |
| 循环检测 | 100% | 重复失败/乒乓/全局熔断三策略 + FNV-1a 哈希 + 警告注入（独创） |
| 历史进化 | 100% | 三阶段循环（Reflect→Experiment→Review）、心跳自检、预快照回滚、协议自修改、活跃时间窗口 |
| 知识提取 | 95% | LLM + 规则引擎双路径、标签提取、决策模式匹配、30+ 技术栈检测 |

---

🔥 **子代理执行可视化增强** — 协议层新增子代理进度上报机制（建议每 30 秒更新 phase），formatter 实时显示任务激活时长（⏱️ X分X秒），超过 5 分钟显示超时预警（⚠️ 超时）

🔥 **Codex 并发上限调整为 50** — 通过分析 Codex CLI 源码，发现默认并发上限为 6，需在 `~/.codex/config.toml` 中配置：
  ```toml
  [agents]
  max_threads = 50
  ```

---

## 为什么用 FlowPilot

传统 CC 开发：你是项目经理——拆任务、分配、跟进、验收，全程盯着。
FlowPilot：你是甲方——只说要什么，剩下的全自动。

| 传统 CC 开发 | FlowPilot 开发 |
|-------------|---------------|
| 手动拆任务、一个个跟 CC 说 | 说一句需求，自动拆解 10+ 个任务 |
| 上下文满了要从头来 | 新窗口一句话，从断点继续，零丢失 |
| 一次只能做一件事 | 多个子Agent并行开发，速度翻倍 |
| 做到一半忘了之前的决策 | 四层记忆 + 跨工作流长期记忆，100个任务也不迷路 |
| 每次手动 git commit | 每完成一个任务自动提交，收尾自动跑测试 |
| 换个项目要重新配置 | 单文件复制即用，Node/Rust/Go/Python/Java/C++/Makefile 通吃 |
| 每次都犯同样的错 | 自我进化引擎，每轮自动反思优化，越跑越聪明 |

### 和主流方案的区别

**vs Claude Code 原生子Agent（Task 工具）**

CC 自带 Task 工具能派子Agent，但它是**无状态**的——上下文绑定在当前对话，关窗口就没了。FlowPilot 在此之上解决了三个原生做不到的事：

1. **不怕中断**：所有状态持久化在磁盘，compact、崩溃、关窗口都无所谓，`resume` 一键继续
2. **不怕膨胀**：主Agent 永远只读 progress.md（< 100 行），100 个任务也不会变慢
3. **自动并行**：依赖图分析 + 批量派发，不用手动决定谁先谁后

| | 原生 Task | FlowPilot |
|---|-----------|-----------|
| 状态持久化 | 对话内，compact 即丢 | 磁盘文件，永不丢失 |
| 中断恢复 | 依赖对话历史，compact 后状态易丢 | 磁盘恢复，`resume` 一键继续 |
| 并行调度 | 手动安排 | 自动依赖分析，批量派发 |
| 上下文膨胀 | 主Agent越做越慢 | 四层记忆，主Agent < 100 行 |
| git 提交 | 手动 | 每个任务自动 commit |
| 收尾验证 | 无 | 自动 build/test/lint |
| 跨会话记忆 | 无，每次从零开始 | 长期记忆库，自动检索注入 |
| 自我优化 | 无 | 三阶段进化，越跑越聪明 |

**vs OpenSpec（规格驱动框架）**

[OpenSpec](https://github.com/Fission-AI/OpenSpec) 解决的是「写代码之前怎么把需求想清楚」，产出是 proposal/spec/design 文档。FlowPilot 解决的是「需求清楚之后怎么全自动执行」，产出是可运行的代码和 git 历史。

| | OpenSpec | FlowPilot |
|---|---------|-----------|
| 定位 | 规划层：需求 → 规格文档 | 执行层：任务 → 代码 → 提交 |
| 产出 | Markdown 文档 | 可运行代码 + git 历史 |
| 执行 | 文档写完仍需人工/AI 逐个实现 | 全自动派发、并行执行、自动提交 |
| 适用范围 | 工具无关，20+ AI 助手 | 面向 Claude Code / Codex / Cursor / snow-cli 等客户端，深度集成 |

FlowPilot 的核心优势是**端到端自动化**——从需求到代码到提交到验证，中间不需要人。OpenSpec 在规划阶段更强，两者已实现集成：

**OpenSpec + FlowPilot 集成**：FlowPilot 的任务解析器自动兼容 OpenSpec 的 checkbox 格式（`- [ ] 1.1 Task`），无需格式转换。工作流协议内置双路径：

| 路径 | 触发条件 | 流程 |
|------|---------|------|
| Path A（标准） | 默认 | brainstorming → 生成任务 → `flow.js init` |
| Path B（OpenSpec） | 项目有 `openspec/` + CLI 可用 | `/opsx:new` → `/opsx:ff` → `cat tasks.md \| flow.js init` |

此外，协议会自动检测项目根目录的 `tasks.md` 文件并询问用户确认，也支持用户在消息中直接提供任务列表。

## 30 秒体验

```bash
cp dist/flow.js 你的项目/
cd 你的项目
node flow.js init
```

打开 Claude Code，直接描述需求：

```
你：帮我做一个电商系统，用户注册、商品管理、购物车、订单支付

（然后就不用管了）
```

CC 会自动：拆解任务 → 识别依赖 → 并行派发子Agent → 写代码 → checkpoint → git commit → 跑 build/test/lint → 全部完成。

`flow finish` 现在会真正执行自动验证，而不是停留在“尽力探测”。如果当前工作流根目录本身没有可检测脚本，但只包含一个可识别子项目（例如 `FlowPilot/`），它会自动进入该子项目执行验证命令；对 `vitest` 测试脚本也会自动补成 `--run`，避免 finish 卡在 watch 模式。

## 核心优势

### 无限上下文 — 做 100 个任务也不会 compact 丢失

四层记忆架构，主Agent 上下文永远 < 100 行：

| 层级 | 谁读 | 内容 |
|------|------|------|
| progress.md | 主Agent | 极简状态表（一行一个任务） |
| task-xxx.md | 子Agent | 每个任务的详细产出和决策 |
| summary.md | 子Agent | 滚动摘要（超10个任务自动压缩） |
| memory.json | 子Agent | 跨工作流长期记忆（自动检索注入） |

子Agent 自行记录产出，主Agent 不膨胀。就算 compact 了，文件还在，恢复即继续。长期记忆跨工作流持久化，上一轮学到的经验自动注入下一轮。

### 并行开发 — 不是一个个做，是一起做

```
串行：数据库 → 用户API → 商品API → 用户页 → 商品页    （5轮）
并行：数据库 → [用户API, 商品API] → [用户页, 商品页]   （3轮）
```

`flow next --batch` 自动找出所有可并行的任务，主Agent 在同一条消息中派发多个子Agent 同时执行。

### 万步零偏移 — 中断恢复不丢一步

关窗口、断网、compact、CC 崩溃，随便来：

```
新窗口 → 说：继续任务 → flow resume
  ├─ 若无待接管变更：重置未完成任务 → 继续
  └─ 若有待处理变更：暂停调度 → adopt / 确认并处理列出的本任务变更后 restart → 再继续
```

所有状态持久化在文件里，不依赖对话历史。哪怕并行执行中 3 个子Agent 同时中断，恢复后也不会盲目重派；若检测到工作流期间新增但归属未明的变更，FlowPilot 会暂停并要求人工确认，而不是暗示你整文件 `git restore`。只有列出的 task-owned 变更才适合 `adopt` 或在处理后 `restart`。

### 迭代审查 — 跑完一轮再来一轮，越改越好

一轮工作流全自动跑完后，可以再起一轮新的工作流审查上一轮的产出：检查实现是否偏离需求、补漏洞、提升代码质量。全程耗时极短，多迭代几轮也不费事。对比原生使用 CC Agent Teams 手动调度，效率提升显著，性价比极高——省下来的时间，陪陪家人不好吗？

```
第一轮：需求 → 全自动实现 → 代码产出
第二轮：审查 → 发现偏离/缺陷 → 自动修补
第三轮：精修 → 代码质量提升 → 收尾验证
```

### 自我进化 — 每跑一轮，下一轮更聪明

FlowPilot 内置三阶段有机进化循环，成功和失败均触发进化，结果写入 `.flowpilot/config.json`，被 maxRetries / hints / verify / hooks 真正消费；历史上曾存在的 `parallelLimit` 不再参与运行时批次裁剪，也不会被自动进化改写：

```
finish() 触发：
  Reflect（反思）→ 分析本轮成败模式（失败链、重试热点、类型集中度）
  Experiment（实验）→ 自动调整 config 参数和协议模板，保存完整快照

review() 触发：
  Review（自愈）→ 对比进化前后指标，退化则自动回滚

Finalization 阶段（可选补充）：
  需要额外人工反思时，CC sub-agent + brainstorming 技能深度反思 → node flow.js evolve 应用结果
```

| 阶段 | 触发时机 | 做什么 |
|------|---------|--------|
| Reflect | finish 末尾 | LLM 或规则分析工作流统计，输出 findings + experiments |
| Experiment | finish 末尾 | 自动调整 config 参数和协议模板，保存完整快照 |
| Review | review 时 | 对比进化前后指标，恶化自动回滚，检查配置完整性 |

### 收尾总结 — 清目录前先把结果说清楚

`flow finish` 在删除临时工作流目录前，会先完成两件事：

1. 在终端输出本轮工作流最终总结
2. 在 `.workflow/final-summary.md` 落一份同样的总结，然后再执行清理

总结会列出所有任务，并用下面的标记显示状态：

```text
✓ 已完成
⊘ 已跳过
✗ 已失败
○ 未完成
```

这样用户在 `.workflow/` 被清掉之前，就已经能在终端看见完整结果；同时流程内也可以验证“先总结、后清理”的顺序。需要注意的是：未执行 `flow review` 时，`flow finish` 不会结束工作流；即使 `review` 已完成，也只有最终 commit 真正成功后才会清理 `.workflow/` 并回到 idle。若 `review` 已完成但当前没有待提交文件，FlowPilot 会补一个显式最终收尾提交，以保持“只有 committed 才能结束工作流”的严格语义。

进化结果直接影响工作流行为：

| 参数 | 作用 |
|------|------|
| `maxRetries` | checkpoint 失败时决定重试次数 |
| `hints` | 注入到子Agent上下文作为"进化建议" |

- 成功时：优化重试与经验规则
- 失败时：增加前置检查建议，优化重试与验证策略
- 有 `ANTHROPIC_API_KEY` 时用 LLM 深度分析，没有则用规则引擎——零依赖约束下的优雅降级

### 单文件通吃一切 — 零依赖，复制即用

- 单文件 `dist/flow.js`，当前构建产物约 `213KB`
- 零运行时依赖，只需 Node.js
- 自动识别 8 种项目类型，收尾时自动跑对应的验证命令，并区分通过 / 跳过 / 未发现命令

## 文档

- [快速上手](docs/quick-start.md) — 不懂原理也能用，3 步开始全自动开发
- [详细使用指南](docs/usage-guide.md) — 完整命令说明、并行开发技巧、任务设计实战示例

## 前置准备

建议先安装插件 / 技能，否则多代理和上下文增强能力会降级。

`Claude Code` 可在 CC 中执行 `/plugin` 打开插件商店，选择安装：

- `superpowers` — 需求拆解头脑风暴
- `frontend-design` — 前端任务
- `feature-dev` — 后端任务
- `code-review` — 收尾代码审查
- `context7` — 实时查阅第三方库文档

不同客户端的并行 / 自动运行开关：

- `Claude Code`
  - 在 `~/.claude/settings.json` 中添加：
    ```json
    "env": {
      "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
    }
    ```
- `Codex`
  - 在 `~/.codex/config.toml` 中加入：
    ```toml
    [agents]
    max_threads = 50          # 子代理并发上限，默认 6
    
    [features]
    multi_agent = true
    ```
  - 全自动运行建议使用：`codex --yolo`
- `Cursor`
  - 在设置的 `Agents` 中开启 `Agents`
  - 将 `Auto-Run Mode` 调成 `Run Everything`
- `其他客户端`
  - 没有统一标准，请先按各自文档自测多代理 / 自动运行能力

`node flow.js init` 在接管模式下会直接显示客户端选项：
- `Claude Code`：生成 `CLAUDE.md` + `.claude/settings.json`
- `Codex`：生成 `AGENTS.md`，并附加 Codex 平台增强规则（如多代理并行调度约定）
- `Cursor` / `Other`：生成通用版 `AGENTS.md`
- `snow-cli`：生成 `AGENTS.md` + `ROLE.md`（两者内容保持一致）

缺失插件会在输出中提醒。

setup/init 写入的 instruction file（`Claude Code` 默认 `CLAUDE.md`，`Codex / Cursor / Other` 默认 `AGENTS.md`，旧项目继续兼容已有文件）、`.claude/settings.json`、`.gitignore` 遵循 ownership-based cleanup：FlowPilot 只清理自己创建或注入的部分，不会自动恢复你的手动改动；cleanup 后若仍有真正的用户残留改动，`flow finish` 会停在 `finishing` 并提示你人工处理，而不是把这些用户改动误判成可自动清理的 workflow residue。

默认情况下，FlowPilot 还会在项目 `.gitignore` 中确保以下本地状态被忽略：`.workflow/`（本地临时运行态）、`.flowpilot/`（本地持久化产品状态）、`.claude/settings.json`（本地集成配置）、`.claude/worktrees/`（本地工作树目录）。不会忽略整个 `.claude/` 目录。

## 初始化与客户端选项

```bash
# 构建单文件
cd FlowPilot && npm install && npm run build

# 自动化验证脚本
npm run test:smoke
npm run test:run

# 复制到任意项目
cp dist/flow.js /your/project/
cd /your/project

# 初始化（显示客户端选项；按客户端生成对应 instruction file）
node flow.js init

# 全自动模式启动 CC，直接描述需求，剩下的全自动
claude --dangerously-skip-permissions
```

> `--dangerously-skip-permissions` 跳过所有权限确认，实现真正的无人值守。

中断恢复：
```bash
claude --dangerously-skip-permissions --continue   # 接续最近一次对话
claude --dangerously-skip-permissions --resume     # 从历史对话列表选择
```

如果恢复时工作区仍然有未归档变更，`resume` 会明确告诉你哪些是启动前就存在的 baseline 未归档变更，哪些是由显式 ownership 支撑的 task-owned 变更，哪些是工作流期间新增但归属未明的变更（可能包含你的手动修改/删除）；如果 dirty baseline 缺失，也会直接说明“无法证明这是干净重启，也无法可靠区分用户操作与任务残留”。

## 架构概览

```
主Agent（调度器，< 100行上下文）
  │
  ├─ node flow.js next ──→ 返回任务 + 依赖上下文 + 相关记忆
  │
  ├─ 子Agent（Task工具派发）
  │   ├─ frontend → /frontend-design 插件 + 其他匹配的 Skill/MCP
  │   ├─ backend  → /feature-dev 插件 + 其他匹配的 Skill/MCP
  │   └─ general  → 直接执行 + 其他匹配的 Skill/MCP
  │
  ├─ node flow.js checkpoint ──→ 记录产出 + 知识提取 + git commit
  │
  ├─ .workflow/（本地临时运行态）
  │   ├─ progress.md        # 任务状态表（主Agent读）
  │   ├─ tasks.md           # 完整任务定义
  │   ├─ config.json        # 运行态文件（兼容旧路径，推荐迁移）
  │   └─ context/
  │       ├─ summary.md     # 滚动摘要
  │       └─ task-xxx.md    # 各任务详细产出
  │
  └─ .flowpilot/（本地持久化产品状态）
      ├─ config.json        # 持久配置（maxRetries/hints/verify/hooks 等）
      ├─ memory.json        # 长期记忆库（知识条目 + 标签 + 时间戳）
      └─ evolution/         # 进化历史（reflect/experiment/review 记录）
```

## 四层记忆机制

| 层级 | 文件 | 读者 | 内容 |
|------|------|------|------|
| 第一层 | progress.md | 主Agent | 极简状态表（ID/标题/状态/摘要） |
| 第二层 | context/task-xxx.md | 子Agent | 每个任务的详细产出和决策记录 |
| 第三层 | context/summary.md | 子Agent | 滚动摘要（技术栈/架构决策/已完成模块） |
| 第四层 | .flowpilot/memory.json | 子Agent | 跨工作流长期记忆（标签化知识条目） |

`flow next` 自动拼装：summary + 依赖任务的 context → 注入子Agent prompt。
主Agent 永远只读 progress.md，上下文占用极小。

## 长期记忆系统

跨工作流的持久化知识库，存储在 `.flowpilot/memory.json`。

### 写入 → 存储 → 检索 → 注入

```
checkpoint（成功/失败）
    ↓
知识提取（LLM 智能提取 或 规则引擎降级）
    ↓
存储到 .flowpilot/memory.json（带标签、时间戳、来源）
    ↓
next/nextBatch 时语义检索相关记忆
    ↓
带 [source] 标签注入子Agent上下文
```

### 知识提取

子Agent 在 checkpoint 摘要中使用标签标记关键知识：

| 标签 | 用途 | 示例 |
|------|------|------|
| `[REMEMBER]` | 通用经验 | `[REMEMBER] Vite 需要配置 resolve.alias 才能用 @ 路径` |
| `[DECISION]` | 架构/技术决策 | `[DECISION] 选用 Zustand 而非 Redux，因为项目规模小` |
| `[ARCHITECTURE]` | 系统架构 | `[ARCHITECTURE] 采用 monorepo + turborepo 结构` |

提取路径：
- 有 `ANTHROPIC_API_KEY` 或 `ANTHROPIC_AUTH_TOKEN` → LLM 智能提取 + 去重（Claude Haiku）
- 无 API key → 规则引擎匹配标签（零依赖降级）

### 检索引擎

- BM25 稀疏向量 + 前向最大匹配中文分词 + 技术词表
- 有 `EMBEDDING_API_KEY` 时额外启用 Dense embedding 双路融合
- MMR 重排序去冗余 + 时间衰减（半衰期 30 天）
- 架构类和决策类记忆不衰减，永久保留

### 使用方式

- 自动注入：`next`/`next --batch` 时自动检索并注入相关记忆
- 手动查询：`node flow.js recall <关键词>`

## 命令参考

```bash
node flow.js init [--force]       # 初始化/接管项目
node flow.js next [--batch]       # 获取下一个/所有可并行任务
node flow.js checkpoint <id>      # 记录任务完成（stdin/--file/内联）[--files f1 f2 ...]
node flow.js skip <id>            # 手动跳过任务
node flow.js review               # 标记code-review已完成 + 进化自愈检查
node flow.js finish               # 智能收尾（验证+总结；未review或最终commit未成功时不会结束工作流）
node flow.js status               # 查看全局进度
node flow.js resume               # 中断恢复
node flow.js add <描述> [--type]  # 追加任务（frontend/backend/general）
node flow.js recall <关键词>      # 检索历史记忆（BM25 + Dense 双路）
node flow.js evolve               # 接收 CC sub-agent 反思结果并应用进化
```

配套 npm 脚本：
- `npm run test:run`：一次性执行完整 Vitest 测试集
- `npm run test:smoke`：执行工作流边界相关冒烟测试，适合改命令/文档后快速验证

## 执行流程（全自动）

```
node flow.js init
       ↓
  协议嵌入 instruction file（`Claude Code` 默认 `CLAUDE.md`，`Codex / Cursor / Other` 默认 `AGENTS.md`，旧项目兼容原有文件）+ 按客户端选择注入额外配置
       ↓
  用户描述需求 / 丢入开发文档
       ↓                          ← 以下全自动，无需人工介入
  ┌─→ flow next (--batch) ──→ 获取任务+上下文+相关记忆
  │        ↓
  │   子Agent执行（自动选插件）
  │        ↓
  │   flow checkpoint ──→ 知识提取 → 记录产出 + git commit
  │        ↓
  └── 还有任务？──→ 是 → 循环
                   否 ↓
             flow finish ──→ build/test/lint
                   ↓
              code-review ──→ flow review（进化自愈检查）
                   ↓
              flow evolve（可选，CC 深度反思）
                   ↓
             flow finish ──→ final commit + auto Reflect + Experiment → idle
```

## 错误处理

- **任务失败** — 自动重试 3 次，3 次仍失败则标记 `failed` 并跳过
- **级联跳过** — 依赖了失败任务的后续任务自动标记 `skipped`
- **中断恢复** — `active` 状态的任务在干净场景下会重置为 `pending`；若检测到工作流期间新增的未处理变更，工作流进入 `reconciling`。只有列出的 task-owned 变更适合 `adopt` / `restart`；归属未明的文件必须先人工确认，不能整文件 `git restore`
- **验证失败** — `flow finish` 报错后可派子Agent修复，再次 finish
- **最终提交拒绝** — `flow finish` 在 verify/review 之后还会检查 dirty baseline、checkpoint owned files、以及 instruction file（`AGENTS.md` / 兼容旧 `CLAUDE.md`）、`.claude/settings.json` / `.gitignore` 的 cleanup 结果；只要边界不安全，或最终 commit 没真正成功，就拒绝结束工作流并列出下一步处理信息。用户手动改动应被视为 user-owned/baseline，不会被 FlowPilot 自动恢复，也不应被误判为 task residue
- **循环检测** — 三策略防护（重复失败/乒乓/全局熔断），自动注入警告到下一任务
- **心跳自检** — 活跃任务超时（>30分钟）告警，记忆膨胀（>100条）自动压缩
- **进化回滚** — 实验导致指标恶化时，`review` 自动回滚到实验前快照

## 环境变量

所有环境变量均为可选，无 API key 也能完整运行。

| 变量 | 用途 | 说明 |
|------|------|------|
| `ANTHROPIC_API_KEY` | LLM 智能提取 + 进化反思 | 启用 Claude Haiku 进行知识提取和去重 |
| `ANTHROPIC_AUTH_TOKEN` | 同上（二选一） | 与 `ANTHROPIC_API_KEY` 等效，优先使用 |
| `ANTHROPIC_BASE_URL` | API 中转地址 | 自定义 API endpoint，适用于代理/镜像场景 |
| `EMBEDDING_API_KEY` | Dense embedding 双路融合 | 启用向量嵌入，与 BM25 融合提升检索精度 |

降级策略：
- 无 `ANTHROPIC_API_KEY`/`ANTHROPIC_AUTH_TOKEN` → 知识提取降级到规则引擎匹配标签
- 无 `EMBEDDING_API_KEY` → 检索仅用 BM25 稀疏向量（仍然有效）

## 开发

```bash
cd FlowPilot
npm install
npm run build        # 构建 → dist/flow.js
npm run dev          # 开发模式
npm test             # 运行测试
```

### 源码结构

```
src/
├── main.ts                          # 入口，依赖注入
├── domain/
│   ├── types.ts                     # TaskEntry, ProgressData 等类型
│   ├── task-store.ts                # 任务状态管理（纯函数）
│   ├── workflow.ts                  # WorkflowDefinition 定义
│   └── repository.ts               # 仓储接口
├── application/
│   └── workflow-service.ts          # 核心用例（16个）
├── infrastructure/
│   ├── fs-repository.ts             # 文件系统 + 协议嵌入 + Hooks注入
│   ├── markdown-parser.ts           # 任务Markdown解析（兼容FlowPilot/OpenSpec双格式）
│   ├── memory.ts                    # 智能记忆引擎（BM25 + 向量索引 + RRF + MMR + LRU缓存）
│   ├── extractor.ts                 # 知识提取（LLM + 规则引擎降级）
│   ├── truncation.ts                # CJK感知智能截断
│   ├── loop-detector.ts             # 三策略循环检测
│   ├── history.ts                   # 历史分析 + 三阶段自我进化（Reflect/Experiment/Review）
│   ├── git.ts                       # 自动git提交（子模块感知）
│   ├── verify.ts                    # 多语言项目验证（8种）
│   ├── hooks.ts                     # 生命周期钩子
│   ├── protocol-template.ts         # 工作流协议模板（双路径：标准/OpenSpec）
│   └── logger.ts                    # 结构化日志（JSONL）
└── interfaces/
    ├── cli.ts                       # 命令路由
    ├── formatter.ts                 # 输出格式化
    └── stdin.ts                     # stdin读取
```

### 依赖方向

```
interfaces → application → domain ← infrastructure
```

运行时零外部依赖，只用 Node.js 内置模块（fs, path, child_process, crypto, https）。LLM 智能提取、长期记忆双路检索、自我进化反思均为可选增强，通过环境变量（`ANTHROPIC_API_KEY`/`ANTHROPIC_AUTH_TOKEN`/`EMBEDDING_API_KEY`）按需启用，无 API key 时自动降级到规则引擎。

## 开源许可

本项目基于 [MIT License](LICENSE) 开源。

Copyright (c) 2025-2026 FlowPilot Contributors

## QQ群交流

欢迎加入 `FlowPilot交流` QQ 群交流使用问题、工作流实践和改进建议。

- 群号：`760311090`
- 群主 QQ：`879360806`

![FlowPilot QQ 群二维码](docs/qq_qr.png)

## 卸载 FlowPilot

如果你之后不想继续在某个项目里使用 FlowPilot，只需要删除它带入或运行时生成的文件：

- `flow.js`（你复制进项目的单文件工具）
- instruction file：
  - `Claude Code` 模式通常是 `CLAUDE.md`
  - `Codex / Cursor / Other` 模式通常是 `AGENTS.md`
  - 兼容旧项目时会继续复用原有 instruction file
  - `snow-cli` 模式下还可能有 `ROLE.md`
- `.claude/settings.json`（如果是 FlowPilot 在 `Claude Code` 模式下生成的）
- `.workflow/`（本地临时运行态）
- `.flowpilot/`（本地持久状态）

常见做法：

```bash
rm -rf flow.js AGENTS.md CLAUDE.md ROLE.md .claude/settings.json .workflow .flowpilot
```

注意：
- 如果 `AGENTS.md` / `CLAUDE.md` / `ROLE.md` 里已经被你手动加入了项目自己的长期说明，请先保留需要的内容
- 如果 `.claude/` 目录因为删掉 `settings.json` 变成空目录，也可以一起删除
- 如果你只想停用工作流而保留 instruction file，也可以只删 `flow.js`、`.claude/settings.json`、`.workflow/`、`.flowpilot/`
