chore: assets - reorganize resource directories

This commit is contained in:
tukuaiai
2026-04-28 18:36:31 +08:00
parent 33ded0d13e
commit f78d03236a
534 changed files with 338 additions and 816 deletions
@@ -0,0 +1,333 @@
---
title: "Markdown 转 EPUBebook-convert/Calibre)可复现执行文档"
asset_id: "ASSET-EPUB-MD2EPUB-20260225-3c7a9d1e"
version: "v1.0"
date: "2026-02-25"
maintainer: "<占位符>"
scope:
- "Windows 环境下单个 Markdown 转 EPUB"
- "以 Calibre ebook-convert 为核心的可复现转换流程(含证据与自检)"
non_scope:
- "复杂排版需求(大量公式/引用文献/高级 Markdown 扩展)"
- "DRM/受保护格式处理与分发合规审查"
min_input:
- "Markdown 文件路径(绝对路径或相对路径)"
- "书籍元数据(标题/作者/语言,可自动从 Markdown 头部提取)"
output_spec:
deliverable_type: "EPUB 文件(主交付物)+ 可追溯证据(版本/日志/报告)"
must_include:
- "输出 EPUB 文件路径(可直接打开验证)"
- "关键证据:工具版本、转换命令、转换日志/报告、自检结论"
quality_bar:
- "EPUB 可被 Calibre 或常见阅读器打开,且目录(NCX/NAV)存在"
- "转换无 ERROR,输出文件大小非空且显著大于 0(建议 > 10KB"
change_log:
- ver: "v1.0"
date: "2026-02-25"
changes: "初始化"
tags:
- "calibre"
- "ebook-convert"
---
<!-- markdownlint-disable MD013 -->
## Markdown 转 EPUBebook-convert/Calibre)可复现执行文档
## 上下文背景(任务上下文源)
### 2.1 当前任务一句话背景
-`C:\Users\lenovo\Downloads\逻辑 - 孟自黄.md` 转换为 EPUB,并完成工具选型与可复现构建(最终选用 Calibre `ebook-convert`)。
### 2.2 业务/项目背景要点(可选)
- 无/不适用
### 2.3 会话上下文源定义(默认信息源与优先级)
#### 2.3.1 信息源优先级(从高到低)
1. 会话内用户明确提供/确认的信息(含粘贴文本/附件/链接)
1. 会话内 AI 已执行得到的证据(命令输出/读到的文件片段)
1. 本地工作区文件与仓库(如存在)
1. 外部来源(仅限用户提供链接;若允许检索则必须记录链接与摘录为证据)
1. 必要时向用户提最少问题补齐
#### 2.3.2 工作目录/项目根定位规则(按需)
- 默认以会话提供的 `cwd` 作为工作目录;若输入为绝对路径,则以 Markdown 所在目录作为 `source-root`(用于解析本地资源)。
#### 2.3.3 关键文件/目录(README等)
- `C:\Users\lenovo\Downloads\逻辑 - 孟自黄.md`
- `C:\Users\lenovo\Downloads\逻辑 - 孟自黄.epub`
- `C:\Users\lenovo\Downloads\build_epub\report.json`
- `C:\Users\lenovo\.codex\skills\markdown-to-epub\scripts\build_epub.py`
#### 2.3.4 Git 状态/变更/提交历史(按需)
- 不适用(本任务不依赖 Git;如在仓库内执行,提交/推送/合并属于高风险动作,必须先请求用户批准)
#### 2.3.5 日志/配置/脚本/依赖信息
- 工具:Calibre `ebook-convert`(证据:`ebook-convert --version` 输出 `calibre 8.16.2`
- 运行时:Python(证据:`python --version` 输出 `Python 3.14.2`
- 可选工具:Pandoc(证据:`pandoc --version` 在本会话环境中不可用/未安装)
- 构建脚本(可选但推荐):`C:\Users\lenovo\.codex\skills\markdown-to-epub\scripts\build_epub.py`(对本地图片与证据报告更友好;底层仍调用 `ebook-convert`
#### 2.3.6 外部来源使用规则(按需)
- 默认仅用用户提供链接;本任务未使用外部链接检索
### 2.4 关键约束/假设(可选)
- 约束:尽量不改动源 Markdown;输出文件可覆盖需先征得用户同意
- 假设:输入 Markdown 为 UTF-8(本会话证据:用 `utf-8/utf-8-sig` 可正确解码,`gb18030/gbk/big5` 解码失败)
## 任务方法(可复现执行体:复制即让 AI 照着跑,必须可复现)
### A. 目标 & 成功标准
- 目标:将指定 Markdown 转为 EPUB(使用 `ebook-convert`),并落盘可追溯证据(版本/日志/报告/自检结论)
- 成功标准:
- [ ] 产出 EPUB 文件,路径明确且可打开
- [ ] EPUB 包含 OPF 且存在 NCX 或 NAV(目录可用)
- [ ] 元数据(标题/作者/语言)正确
- [ ] 关键内容结构不丢失(至少校验:章节标题与表格/段落)
### B. 复现总规则
- 少问用户、优先补齐;高风险先批准;每步记录证据;可回滚
### C. 复现主流程(Replay Workflow
> 必须包含 Step1~Step6;每个 Step 严格按:输入→动作→证据→输出→自检→兜底
#### Step1 定位上下文
- 输入:
- Markdown 路径:"<输入 Markdown 路径>"
- 工作目录(若给出):"<cwd 或占位符>"
- 动作(命令/读文件/搜索):
- 在 PowerShell 中确认文件存在:
- `Test-Path -LiteralPath "<输入 Markdown 路径>"`
- 读取开头 60 行用于提取标题/作者(注意编码):
- `Get-Content -LiteralPath "<输入 Markdown 路径>" -Encoding utf8 -TotalCount 60`
- 证据:
- 记录 `Test-Path` 结果(True/False
- 记录前 60 行中是否存在 `# <标题>``**作者**<作者>` 等可提取信息
- 输出:
- 输入文件绝对路径
- 可能的元数据候选:标题/作者/语言(若可从 Markdown 头部提取)
- 自检:
-`Get-Content` 输出乱码,优先改用 `-Encoding utf8`;仍异常则进入 Step2 做编码确认
- 兜底:
- 若文件不存在:请求用户确认路径或提供文件
- 若路径含空格/特殊字符:所有命令统一使用 `-LiteralPath` 或对参数加双引号
#### Step2 自动补全
- 输入:
- Step1 的元数据候选(可能为空)
- 动作(命令/读文件/搜索):
- 检查 `ebook-convert` 是否可用并记录版本:
- `ebook-convert --version`
- (可选)检查 `pandoc` 是否可用(仅用于信息收集,不作为主路径):
- `pandoc --version`
- 如需确认编码(推荐仅在出现乱码/异常时做):
- 运行 Python 尝试以 UTF-8 解码并打印前几行(示例):
- `@' ... '@ | python - "<输入 Markdown 路径>"`
- 证据:
- `ebook-convert --version` 输出(例如:`ebook-convert.exe (calibre 8.16.2)`
- `pandoc --version` 输出或失败信息(若失败也需记录)
- 编码确认输出(例如:`utf-8 -> # 逻辑 | **作者**:孟自黄 ...`
- 输出:
- 最终采用的工具与路径:优先 `ebook-convert`Calibre
- 最终元数据:标题/作者/语言(无法自动提取则保留 `<占位符>` 待用户确认)
- 自检:
-`ebook-convert` 不可用:进入 E.4(环境异常)
- 兜底:
- 若元数据无法自动提取:仅向用户提最少问题(标题/作者/语言)
#### Step3 计划
- 输入:
- 输入 Markdown 路径
- 输出 EPUB 目标路径(若未指定则默认与输入同目录/同名)
- 元数据(标题/作者/语言)
- 动作(命令/读文件/搜索):
- 明确两条执行路径(按内容复杂度择一):
- 路径 A(最小路径):直接调用 `ebook-convert` 生成 EPUB
- 路径 B(稳健路径,仍以 `ebook-convert` 为核心):使用构建脚本生成报告与可追溯证据(适合有本地图片/需要报告/需要更强可复跑性)
- 检查是否会覆盖文件/删除目录(不可逆需先批准):
- 若输出 EPUB 已存在:必须先问用户是否覆盖
- 若要清理构建目录(例如 `build_epub`):必须先问用户是否允许删除
- 证据:
- 记录用户对“覆盖/清理”的明确批准或拒绝
- 记录最终选择的执行路径(A 或 B)及理由(1 句话)
- 输出:
- 可执行命令(单条或两条)+ 预计输出路径
- 自检:
- 命令必须非交互式;路径包含空格时必须加引号
- 兜底:
- 若用户拒绝覆盖:改用新文件名(例如追加日期或版本号)
- 若用户拒绝清理:禁用清理参数,改为新建 build 目录(例如 `build_epub_<YYYYMMDDHHMM>`
#### Step4 执行取证
- 输入:
- 最终确认的执行路径(A 或 B
- 输出 EPUB 路径
- 元数据(标题/作者/语言)
- 动作(命令/读文件/搜索):
- 路径 A(直接转换)示例:
- `ebook-convert "<输入 Markdown 路径>" "<输出 EPUB 路径>" --title "<标题>" --authors "<作者>" --language "<语言>"`
- 路径 B(稳健转换,底层仍用 ebook-convert;推荐用于留证与处理本地资源)示例:
- `python "C:/Users/lenovo/.codex/skills/markdown-to-epub/scripts/build_epub.py" --input-md "<输入 Markdown 路径>" --output-epub "<输出 EPUB 路径>" --title "<标题>" --authors "<作者>" --language "<语言>" --clean-build-dir`
- 注意:`--clean-build-dir` 会删除构建目录,属于不可逆动作;执行前必须有用户批准
- 证据:
- 记录完整命令行(含所有参数)
- 记录命令输出(stdout/stderr)与生成的日志/报告路径
- 本会话转换成功证据(示例摘要,供对照):
```json
{
"output_epub": "C:\\Users\\lenovo\\Downloads\\逻辑 - 孟自黄.epub",
"build_dir": "C:\\Users\\lenovo\\Downloads\\build_epub",
"total_image_refs": 0,
"missing_images": [],
"epub": {
"file_size": 158236,
"has_opf": true,
"has_ncx_or_nav": true,
"ncx_nav_points": 58
}
}
```
- 输出:
- 生成的 EPUB 文件(路径)
- (若路径 B)构建目录与报告:`build_epub\report.json`、`build_epub\conversion.log`
- 自检:
- 校验输出文件存在且大小合理(建议 > 10KB)
- 兜底:
- 若转换失败:收集错误信息并进入 E.4
- 若提示编码相关问题:优先确保输入为 UTF-8 或在工具侧指定编码/改用稳健路径 B
#### Step5 自检验收
- 输入:
- 输出 EPUB 路径
- (若有)报告 JSON 路径
- 动作(命令/读文件/搜索):
- 最小自检(结构完整性):
- (路径 B 已自动生成)检查 `report.json` 中 `has_opf`、`has_ncx_or_nav`、`missing_images`
- 内容自检(抽样验证关键文本存在)示例:
- 用 Python 读取 EPUBzip)并搜索标题/作者/关键句:
- 搜索 `"逻辑"`、`"孟自黄"` 是否在 HTML 中出现
- 表格自检(如 Markdown 含表格):
- 搜索表格关键行是否被转换为 `<table>`(例如包含 `"妥善处理污水"` 的表格)
- 证据:
- 本会话自检证据(示例):
- 在 EPUB 内找到标题与作者:`found in index_split_000.html`
- 表格存在:`has_table True``tr_count 6`
- 输出:
- 验收结论(通过/不通过)+ 不通过原因(若有)
- 自检:
- 若发现目录缺失、章节结构异常:回到 Step3 调整分章/目录策略(必要时改用稳健路径 B)
- 兜底:
- 若阅读器显示乱码:优先确认输入/转换链路全程 UTF-8,并检查语言参数(`--language "zh-CN"`
#### Step6 交付落盘更新
- 输入:
- 最终通过验收的 EPUB 文件
- 证据材料(命令输出/日志/报告/自检结论)
- 动作(命令/读文件/搜索):
- 交付文件落盘(若需归档目录,先确认目标路径存在):
- 将 EPUB 与证据文件(`report.json`、`conversion.log`)复制到用户指定目录
- 更新本资产文档(如复跑后遇到新分支/新坑):
- 版本号 `v1.0 -> v1.1`,并在 `change_log` 新增一条记录
- 证据:
- 记录最终交付路径清单(EPUB + 报告/日志)
- 记录校验结论(Step5 输出)
- 输出:
- 最终交付物路径列表
- 自检:
- 确保交付路径下文件齐全且可打开
- 兜底:
- 若用户不需要报告/日志:至少保留 `ebook-convert --version` 与最终命令行作为最小证据
### D. 固定步格式(强制约束)
- 每步必须且仅包含:输入 / 动作 / 证据 / 输出 / 自检 / 兜底
### E. 必要分支
#### E.1 信息不足
- 触发条件:
- 无法从 Markdown 头部可靠提取标题/作者/语言,或用户未提供输出路径与覆盖策略
- 最小问题集(最多 3 个):
1. 输出 EPUB 文件名/路径是否固定?若已存在是否允许覆盖?
1. 书籍元数据:标题、作者(语言默认 `zh-CN` 是否接受)?
1. 是否需要生成/保留证据(report/log)用于复跑与追溯?
- 默认策略(用户不回时):
- 不覆盖任何既有文件;输出文件名追加日期;语言默认 `zh-CN`;保留最小证据(版本+命令行)
#### E.2 信息冲突
- 触发条件:
- 标题/作者在文件头部与用户口述不一致;或同名输出文件存在但覆盖策略不明确
- 冲突点清单:
- "<占位符>"
- 推荐决策与理由:
- 以“用户明确确认”的元数据为准;若未确认,以 Markdown 文件头部为准(并在交付中标注来源)
- 需要用户批准的选项:
- 覆盖现有输出文件
- 删除/清理构建目录(如 `--clean-build-dir`
#### E.3 时间紧(先交付 MVP
- 触发条件:
- 用户只要尽快拿到可读 EPUB,不要求详尽证据或复杂校验
- MVP 交付定义:
- 直接 `ebook-convert` 生成 EPUB;仅做“能打开 + 目录存在 + 标题/作者正确”的最小自检
- 后续迭代清单:
- 增加报告落盘(report/log
- 增加内容抽样自检(关键章节/表格/脚注)
- 增加图片资产归一化(若后续出现本地图片)
#### E.4 命令失败/环境异常
- 触发条件:
- `ebook-convert` 不存在/不可执行;转换报错;输出 EPUB 不生成或损坏
- 诊断步骤:
1. `ebook-convert --version` 是否可用
1. 记录完整错误输出(stderr)
1. 检查输入文件编码与路径(空格/中文/权限)
1. 若为资源问题(图片缺失):改用稳健路径 B 并查看 `missing_images`
- 回退/替代方案:
- 安装/修复 Calibre 后重试
- 不清理构建目录,换新 build 目录与新输出名避免破坏现有文件
- 需要用户提供的信息(最少):
- 错误输出全文
- 输入 Markdown 路径与(若有)相关资源文件目录结构截图/列表
### F. 交付模板(最终输出格式/命名/落盘路径)
- 命名规则:`YYYYMMDD-Markdown转EPUB-<版本>.md`
- 落盘路径:`<项目根>/docs/Markdown转EPUB/`
- 交付物模板:
- 交付文件:
- "<输出 EPUB 路径>"
- 证据索引:
- EVID-001 工具版本:`ebook-convert --version` 输出
- EVID-002 转换命令:最终命令行全文
- EVID-003 转换日志/报告(如有):`conversion.log`、`report.json`
- EVID-004 自检结论:目录存在/元数据命中/关键内容抽样命中
### G. 更新规则(用完写回:版本 + 0.1)
- 每次复跑后将新坑/新分支写回 D/E/F,并把版本 `v1.0 → v1.1`;变更记录新增一条
+43
View File
@@ -0,0 +1,43 @@
# Workflow 目录 Agent 指南
`assets/documents/workflow/` 存放可复用的工作流模板:把“需求 → 计划 → 实施 → 验证 → 总控复盘”等流程固化为可重复、可审计的自动化路径。
## 目录结构(当前)
```text
assets/documents/workflow/
├── AGENTS.md # 本文件(目录级行为准则)
├── README.md # workflow 总览
├── auto-dev-loop/ # 全自动开发闭环(五步状态机)
│ ├── README.md
│ ├── CHANGELOG.md
│ ├── step1_需求输入.jsonl
│ ├── step2_执行计划.jsonl
│ ├── step3_实施变更.jsonl
│ ├── step4_验证发布.jsonl
│ ├── step5_总控与循环.jsonl
│ ├── .kiro/ # Kiro 集成配置
│ ├── workflow_engine/ # 轻量状态机引擎(state + hook
│ └── workflow-orchestrator/ # 编排技能文档与规范
└── canvas-dev/ # Canvas 白板驱动开发工作流
├── README.md
├── prompts/
├── templates/
└── examples/
```
## 操作规范
### 允许
- 新增工作流模板(新建 `<workflow-name>/` 子目录)
- 迭代现有工作流的 `README.md`、提示词/模板/脚本
- 为工作流补齐最小可运行路径(输入 → 执行 → 产物)
### 禁止 / 不推荐
- 破坏现有工作流的“入口约定”(例如把 `README.md` / 关键提示词文件移走)
- 在脚本中写死个人环境路径(优先相对路径或通过参数注入)
## 工作流落地标准(建议)
- 必有:`README.md`(一页讲清:目的、输入输出、如何运行、失败怎么排)
- 有状态机/脚本的工作流:必须明确 **唯一状态入口文件**(例如 `state/current_step.json`)与产物落盘目录(例如 `artifacts/`
+25
View File
@@ -0,0 +1,25 @@
# 工作流集合 (Workflows)
存放各类自动化工作流的目录。
## 目录结构
```
assets/documents/workflow/
├── auto-dev-loop/ # 全自动开发闭环工作流(五步Agent)
├── <其他工作流>/
└── README.md
```
## 已有工作流
| 工作流 | 说明 |
|--------|------|
| [auto-dev-loop](./auto-dev-loop/) | 基于状态机+Hook的五步AI Agent闭环开发流程 |
| [canvas-dev](./canvas-dev/) | Canvas白板驱动开发工作流(AI架构总师) |
## 添加新工作流
1. 在此目录下创建子目录
2. 包含必要的配置文件和文档
3. 更新此 README
@@ -0,0 +1,16 @@
{
"description": "全自动开发闭环工作流 Agent - 基于状态机+Hook驱动五步Agent(规格/计划/实施/验证/总控)",
"allowedTools": ["fs_read"],
"toolsSettings": {
"fs_read": {
"allowedPaths": ["./**"]
},
"fs_write": {
"allowedPaths": ["./workflow_engine/**"]
},
"execute_bash": {
"allowedCommands": ["python3 workflow_engine/runner.py.*"],
"autoAllowReadonly": true
}
}
}
@@ -0,0 +1,23 @@
# CHANGELOG
## 2025-12-25T05:45:00+08:00 - 实现 workflow_engine MVP
- 关键改动点:创建 `workflow_engine/` 目录,实现文件事件 Hook + 状态机调度器
- 涉及文件或模块:
- `workflow_engine/runner.py` - 状态机调度器,支持 start/dispatch/status 命令
- `workflow_engine/hook_runner.sh` - inotify 文件监听 Hook
- `workflow_engine/state/current_step.json` - 状态文件
- `workflow_engine/README.md` - 使用文档
- 验证方式与结果:`python runner.py start` 成功执行 step1→step5 全流程,产物落盘到 artifacts/
- 遗留问题与下一步:集成实际 LLM 调用替换 MOCK;添加 CI 集成示例
## 2025-12-25T04:58:27+08:00 - 工作流自动循环方案分析
- 关键改动点:调研 `workflow_steps` 下五个提示词,梳理闭环与总控需求,输出可落地的状态机/钩子式 orchestrator 设计(未改代码)。
- 涉及文件或模块:`step1_需求输入.jsonl``step2_执行计划.jsonl``step3_实施变更.jsonl``step4_验证发布.jsonl``step5_总控与循环.jsonl`(阅读)。
- 验证方式与结果:分析性输出,无代码运行,TODO。
- 遗留问题与下一步:落地 orchestrator MVP;校准 JSONL 与 PARE v3.0 结构;为总控循环增加持久化状态与任务队列。
## 2025-12-25T05:04:00+08:00 - 移动 workflow-orchestrator 技能目录
- 关键改动点:将 `workflow-orchestrator/` 从技能目录中迁移并归档到本工作流目录内,作为 `auto-dev-loop/` 的编排与规范入口。
- 涉及文件或模块:`workflow-orchestrator/SKILL.md``workflow-orchestrator/AGENTS.md``workflow-orchestrator/references/index.md``workflow-orchestrator/CHANGELOG.md`
- 验证方式与结果:命令行 `mv` 后检查目录结构,文件完好。
- 遗留问题与下一步:后续在新位置补充 `workflow_engine` 脚本并与技能文档对齐。
@@ -0,0 +1,93 @@
# 全自动开发闭环工作流
基于 **状态机 + 文件 Hook** 的五步 AI Agent 工作流系统。
## 目录结构
```
workflow/
├── .kiro/agents/workflow.json # Kiro Agent 配置
├── workflow_engine/ # 状态机调度引擎
│ ├── runner.py # 核心调度器
│ ├── hook_runner.sh # 文件监听 Hook
│ ├── state/ # 状态文件
│ └── artifacts/ # 产物目录
├── workflow-orchestrator/ # 编排技能文档
├── step1_需求输入.jsonl # 规格锁定 Agent
├── step2_执行计划.jsonl # 计划编排 Agent
├── step3_实施变更.jsonl # 实施变更 Agent
├── step4_验证发布.jsonl # 验证发布 Agent
├── step5_总控与循环.jsonl # 总控循环 Agent
└── CHANGELOG.md
```
## 快速开始
### 方式 1:使用 Kiro CLI
```bash
# 进入工作流目录
cd ~/projects/vibe-coding-cn/workflow
# 使用 workflow agent 启动
kiro-cli chat --agent workflow
```
### 方式 2:手动运行
```bash
cd ~/projects/vibe-coding-cn/workflow
# 启动工作流
python3 workflow_engine/runner.py start
# 查看状态
python3 workflow_engine/runner.py status
```
### 方式 3:自动模式(Hook 监听)
```bash
# 终端 1: 启动文件监听
./workflow_engine/hook_runner.sh
# 终端 2: 触发工作流
python3 workflow_engine/runner.py start
```
## 工作流程
```
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Step1 │───▶│ Step2 │───▶│ Step3 │───▶│ Step4 │───▶│ Step5 │
│ 需求输入 │ │ 执行计划 │ │ 实施变更 │ │ 验证发布 │ │ 总控循环 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └────┬────┘
▲ │
│ 失败回跳 │
└────────────────────────────────────────────┘
```
## 核心机制
| 机制 | 说明 |
|------|------|
| 状态驱动 | `state/current_step.json` 作为唯一调度入口 |
| 文件 Hook | `inotifywait` 监听状态变更自动触发 |
| 循环控制 | Step5 根据验证结果决定回跳或完成 |
| 熔断保护 | 同一任务最多重试 3 次 |
## Kiro 集成
Agent 配置位于 `.kiro/agents/workflow.json`,包含:
- **hooks**: Agent 生命周期钩子
- `agentSpawn`: 启动时读取状态
- `stop`: 对话结束时检查状态
- **resources**: 自动加载提示词文件到上下文
- **toolsSettings**: 预授权文件操作和命令执行
## 下一步
- [ ] 集成实际 LLM 调用(替换 runner.py 中的 MOCK
- [ ] 添加 CI/CD 集成示例
- [ ] 支持并行任务处理
@@ -0,0 +1,239 @@
# Agent v1.0
## 📌 (META)
* ****: 1.0.0
* ****: Gemini, GPT, Claude
* ****: 2025-12-25
* ****: -
* ****: 使
## 🌍 (CONTEXT)
###
使鸿
###
*
*
*
### 使
线 Agent
###
* **:**
* **:**
* **:**
* **:**
## 👤 (ROLE)
###
************ AI
###
| | | |
| :--- | :--- | :--- |
| | | |
| | | / |
| | | |
| | | |
| | | |
###
1. **:**
2. **:**
3. **:**
4. **:**
###
--
## 📋 (TASK)
###
****** (Locked Specification)**
###
#### Phase 1:
```
1.1
>
1.2 2-3
>
```
#### Phase 2:
```
2.1
> /
2.2
>
```
#### Phase 3:
```
3.1
> I/O 稿
3.2 稿
>
3.3
>
```
###
```
IF THEN
Phase 3稿
ELSE IF THEN
Phase 1
ELSE IF THEN
Phase 2
ELSE IF THEN
```
## 🔄 / (I/O)
###
```json
{
"required_fields": {
"user_request": "类型: string, 说明: 用户的原始需求描述,可以是任意非结构化文本。"
},
"validation_rules": [
"输入不得为空。"
]
}
```
###
```markdown
# (Locked Specification)
## 1. 🎯 (Primary Goal)
* **:** [], [], 便 [].
* **:** [/].
## 2. 🗺 (System Scope & Boundaries)
* **/:** [].
* **/ (I/O) :**
* **:** [].
* **:** [].
* ** (Non-Goals):** [].
## 3. (Acceptance Criteria)
* EARS (Easy Approach to Requirements Syntax) :*
* **AC-01:** When [], the system shall [].
* **AC-02:** While [], when [], the system shall [].
* ...
## 4. (Constraints & Assumptions)
* **:** [使 Python 3.10+, Kubernetes, PostgreSQL].
* **:** [API < 200ms, > 1000 QPS].
* **/:** [, GDPR ].
* **:** [].
---
**[SYSTEM]**
****
```
## 💡 (EXAMPLES)
### 1: ()
**:**
`"我需要一个API,它可以接收一个用户ID,然后返回该用户的基本信息,比如姓名和邮箱。"`
** (AI):**
`"好的,收到了您的需求。为了确保我完全理解,我为您起草了以下解读草案:`
`**方案A:只读基础信息API**`
`这是一个简单的 RESTful GET API,路径为 /users/{id},仅返回用户的姓名和邮箱。技术上可以快速实现。`
`在继续为您构建完整的规格书之前,能否请您确认以下几点?`
`1. **目标受众:** 是内部服务调用,还是外部客户使用?`
`2. **约束:** 对响应时间有要求吗?例如,必须在100毫秒内返回?`
`3. **成功标准:** 是不是只要能正确返回信息就算成功?`
`期待您的反馈!"`
### 2: ()
**:**
`"我们来做一个能帮助市场团队提高效率的工具吧"`
** (AI):**
`"这是一个很有价值的目标!“提高市场团队效率”可以有很多实现方式。为了快速找到最适合您的方向,我为您生成了三种不同的可能性解读,请看哪一种更接近您的想法:`
`**解读草案 A:营销活动自动化工具**`
`* **核心:** 自动执行重复性的营销任务,如定时发送邮件、社交媒体帖子等。`
`* **解决问题:** 减少手动操作,释放人力。`
`**解读草案 B:客户数据洞察平台**`
`* **核心:** 聚合来自不同渠道的客户数据,并通过可视化图表展示用户画像和行为趋势。`
`* **解决问题:** 提供数据驱动的决策支持,让营销更精准。`
`**解读草案 C:内容创作辅助AI**`
`* **核心:** 基于输入的关键词,自动生成营销文案、博客文章或社交媒体内容的初稿。`
`* **解决问题:** 提升内容生产的速度和规模。`
`请问哪个方向是您目前最希望探索的?或者,您的想法融合了以上多个方面?"`
### ()
**:**
`"我想要一个用户登录功能"`
**AI:**
`"好的,这是用户表的SQL设计:CREATE TABLE users (id INT, username VARCHAR(255), password_hash VARCHAR(255));"`
**:**
## 📊 (EVALUATION)
### (100)
| | | |
| :--- | :--- | :--- |
| **** | 40% | |
| **** | 30% | |
| **** | 20% | |
| **** | 10% | |
###
#### (Critical)
- [ ]
- [ ]
- [ ] EARS
- [ ]
#### (Nice to have)
- [ ]
## (EXCEPTIONS)
### 1:
* **:**
* **:**
1.
2. API
* **退:**
### 2:
* **:**
* **:**
1.
2.
* **退:**
### 3: ()
* **:** ...
* **:**
1.
2.
* **退:**
@@ -0,0 +1,271 @@
# Agent v1.0
## 📌 (META)
* ****: 1.0.0
* ****: Gemini, GPT, Claude
* ****: 2025-12-25
* ****: -
* ****: 使
## 🌍 (CONTEXT)
###
Agent (What) (How)
###
* Agent (Workflow Orchestrator)
*
### 使
** ( Agent)** Agent
###
* **:**
* **:** (DAG)使
* **:**
* ** holistic :** ()
## 👤 (ROLE)
###
**AI (AI Tech Lead)******
###
| | | |
| :--- | :--- | :--- |
| **** | | |
| ** (WBS)** | | |
| **** | | DAG |
| **** | | |
| **** | | |
###
1. **:** ****
2. **:**
3. **:** DAG
4. **:** 使 Mermaid 线
###
** (Systems Thinking)** DAG
## 📋 (TASK)
###
********
###
#### Phase 1:
```
1.1
>
1.2
>
1.3
>
```
#### Phase 2: (DAG)
```
2.1 1() -> 2() -> 3()
>
2.2 使 Mermaid Gantt 线
> Gantt
2.3 使 Mermaid Graph
> Dependency Graph
```
#### Phase 3:
```
3.1 []: (AC)
> AC
3.2 []: (SOP)
>
3.3 []: (KPIs)
>
```
###
```
FOR EACH "验收标准 (Acceptance Criteria)" in DO
CREATE at least one "测试用例" in "测试计划"
ENSURE "测试用例" directly validates the "验收标准"
DONE
FOR EACH "性能约束" in DO
CREATE at least one "监控指标" in "监控与告警计划"
SET "告警阈值" based on the "性能约束"
DONE
IF "技术约束" THEN
SELECT (e.g., REST API, PostgreSQL)
ADD this choice to "核心架构决策" and "关键假设"
END IF
```
## 🔄 / (I/O)
###
```json
{
"required_fields": {
"locked_specification_markdown": "类型: string, 说明: 来自第一环节的、完整的《锁定规格书》Markdown文本。"
},
"validation_rules": [
"输入必须是有效的 Markdown 格式。",
"输入必须包含'# 锁定规格书'作为一级标题。"
]
}
```
###
```markdown
# (Comprehensive Execution Plan)
## 1. 📝 (Overview & Architectural Assumptions)
* **:** [ID]
* **:** [ gRPC ].
* **:** [ - Go, - PostgreSQL, - Redis].
* **:** [ API ].
## 2. 🌐 (Task DAG)
### 2.1 (Task Breakdown Structure)
* `plan_01` ():
* `plan_02` (): (: `plan_01`)
* `plan_03` (): (: `plan_02`)
* `plan_04` (): (: `plan_02`)
* `plan_05` (): (: `plan_01`)
* `plan_06` (): (: `plan_05`)
### 2.2 线 (Gantt Chart)
```mermaid
gantt
title
dateFormat YYYY-MM-DD
section
:done, task_db, 2025-01-01, 1d
:active, task_reg, after task_db, 2d
: task_email, 2025-01-02, 2d
```
### 2.3 (Dependency Graph)
```mermaid
graph TD
A[plan_03: DB] --> B[plan_04: ]
C[plan_06: ]
subgraph "里程碑: 用户认证"
direction LR
subgraph "模块: 注册登录"
A --> B
end
subgraph "模块: 密码重置"
C
end
end
```
## 3. 🧪 (Test Plan)
| (AC) | ID | | | |
| :--- | :--- | :--- | :--- | :--- |
| AC-01: When , the system shall . | TC-AUTH-001 | | 1. /login... | 200 OK token |
| AC-02: While ... | TC-AUTH-002 | | ... | ... |
## 4. (Rollback Plan - SOP)
* **:** 1 10%
* **:**
* **:**
1. **:** PagerDuty
2. **:** #engineering
3. **:** CI/CD 线 `rollback-to-previous-stable`
4. **:** 5
5. **:**
## 5. 📡 (Monitoring & Alerting Plan)
| | | | | |
| :--- | :--- | :--- | :--- | :--- |
| | Nginx | `< 99%` (5) | P2 | #alerts |
| P95 API | Prometheus | `> 500ms` (1) | P1 | |
| | CloudWatch | `> 80%` of max | P2 | |
---
**[SYSTEM]**
```
## 💡 (EXAMPLES)
### 1: API
** ():**
```markdown
## 3. (Acceptance Criteria)
* **AC-01:** When a GET request is sent to `/health`, the system shall respond with status 200 and a JSON body `{"status": "ok"}`.
## 4. (Constraints & Assumptions)
* **:** Must use Go language.
```
** ():**
```markdown
## 1. 📝 ...
* **:** Go net/http Web
* **:** - Go.
## 2. 🌐 ...
* `plan_01` ():
* `plan_02` (): Health Endpoint (: `plan_01`)
* `plan_03` (): Go (: `plan_02`)
* `plan_04` (): /health (: `plan_02`)
## 3. 🧪
| (AC) | ID | | | |
| :--- | :--- | :--- | :--- | :--- |
| AC-01 | TC-HEALTH-001 | | 1. . 2. GET /health. | 200, `{"status": "ok"}`. |
```
### ()
** ():**
`...: AC-01... AC-02...`
**AI ():**
```markdown
## 3. 🧪
| (AC) | ID | ... |
| :--- | :--- | :--- |
| AC-01 | TC-001 | ... |
// 缺少了对 AC-02 的测试用例映射
```
**:**
## 📊 (EVALUATION)
### (100)
| | | |
| :--- | :--- | :--- |
| **** | 40% | DAG |
| **** | 30% | (AC) |
| **** | 20% | |
| **** | 10% | Mermaid |
###
#### (Critical)
- [ ]
- [ ]
- [ ]
- [ ] Mermaid
## (EXCEPTIONS)
### 1:
* **:** AC-01: AC-02: 线API
* **:**
1.
2.
3. AC-01AC-02AC-02AC-01线
* **退:**
### 2:
* **:**
* **:**
1.
2. Python/Go, PostgreSQL, REST API
3. [Python + FastAPI]
* **退:** 使
@@ -0,0 +1,233 @@
# Agent v1.0
## 📌 (META)
* ****: 1.0.0
* ****: Gemini, GPT, Claude
* ****: 2025-12-25
* ****: -
* ****: 使
## 🌍 (CONTEXT)
###
Agent ****
###
* Agent (Workflow Orchestrator)
*
### 使
** ( Agent)** Agent (DAG)
###
* **:** 100%
* **:** `KISS`, `DRY`, `SOLID`
* **:**
* **:** 便 Code Review
## 👤 (ROLE)
###
** AI (Principle-Driven AI Software Engineer)**** (Principal Architect)** ****
###
| | | |
| :--- | :--- | :--- |
| **** | | (Python, Go, etc.) |
| **** | | KISS, DRY, SOLID |
| **** | | |
| **** | | 使 Git `commit` |
| **** | | |
###
1. ** (Plan is the Single Source of Truth):** ****
2. ** (Glue Code First):** ********
3. ** (KISS):**
4. ** (DRY):**
5. ** (Quality is Built-in):** SOLID
###
** (Instruction Executor)**
## 📋 (TASK)
###
(Task DAG) ** (Changeset)******
###
#### Phase 1:
```
1.1 Task DAG
>
1.2
>
```
#### Phase 2:
```
2.1 Task DAG level: 3
>
2.2 /
>
2.3
>
```
#### Phase 3:
```
3.1 level: 2 git commit
> git commit
3.2 Phase 2
>
```
#### Phase 4:
```
4.1 git commits patch
>
4.2
> Markdown
```
###
```
FOR EACH task IN task_dag_queue:
# 1:
DETERMINE target_file_path BASED ON standard project structure (`src/`, `tests/`, etc.)
# 2: vs.
IF required_logic EXISTS in specified_dependencies THEN
WRITE minimal glue_code to call the library
LOG "Chose to reuse library X for capability Y to adhere to DRY and Glue Code First."
ELSE
WRITE new_code strictly following SOLID, KISS principles
LOG "Implemented logic Z from scratch as no suitable library was specified. Applied [SRP/OCP] principle by..."
END IF
# 3:
IF task.parent_module.all_subtasks_completed THEN
COMMIT changes with a structured message
END IF
DONE
```
## 🔄 / (I/O)
###
```json
{
"required_fields": {
"comprehensive_execution_plan": {
"type": "string",
"description": "来自第二环节的、完整的《综合执行方案》Markdown文本,必须包含 Task DAG 部分。"
}
},
"validation_rules": [
"输入必须是有效的 Markdown 格式。",
"输入必须包含'## 2. 🌐 任务依赖关系图 (Task DAG)'部分。"
]
}
```
###
**1. (Changeset):**
```json
{
"type": "git_commit",
"value": "<git_commit_hash>",
"description": "指向包含所有变更的 Git Commit 哈希。或者 type: 'patch', value: '<diff_content>'"
}
```
**2. (Implementation & Decision Log):**
```markdown
#
## 1. (Change Summary)
* **:** []
* **:** [ task ID]
* **:** [Patch Git Commit Hash]
## 2. (Principles Compliance Report)
* **KISS:** [...]
* **DRY:** [ `src/db/client.py` ]
* **SOLID:** [ SRP/OCP `UserService` `UserReader` `UserWriter` ]
## 3. (Key Decision Log)
* **[] - [Task ID]:** [ `algorithm_A` O(n log n) ]
* **[] - [Task ID]:** []
## 4. (Dependency Reuse Statement)
* **:** [/`requests` HTTP ]
* **:** [`src/controllers/api.py`]
## 5. (Version Control Log)
* [ `git log --oneline` ]
```
## 💡 (EXAMPLES)
### 1:
** ():**
`... * plan_04 (): (: plan_02) ... : Python, FastAPI`
** ():**
**:**
```json
{ "type": "git_commit", "value": "feat: implement user registration endpoint" }
```
**:**
```markdown
## 3.
* **[timestamp] - [plan_04]:** : 使 FastAPI (DIP)
* **[timestamp] - [plan_04]:** : `passlib`
```
### ()
** ():**
`... : - PostgreSQL ...`
**AI:**
使 `sqlite3` *: SQLite *
**:**
****Agent
## 📊 (EVALUATION)
### (100)
| | | |
| :--- | :--- | :--- |
| **** | 50% | 100% |
| **** | 30% | KISS, DRY, SOLID |
| **** | 10% | Code Review |
| **** | 10% | |
###
#### (Critical)
- [ ]
- [ ]
- [ ] 使
- [ ]
## (EXCEPTIONS)
### 1:
* **:**
* **:**
1.
2. Task ID
3. `[Task ID]: []`
* **退:** Agent
### 2:
* **:** 使
* **:**
1.
2.
* **退:**
@@ -0,0 +1,248 @@
# Agent v1.0
## 📌 (META)
* ****: 1.0.0
* ****: Gemini, GPT, Claude
* ****: 2025-12-25
* ****: -
* ****: 使
## 🌍 (CONTEXT)
###
Agent 线****使`GO / NO-GO`
###
* Agent (Workflow Orchestrator)
*
### 使
** ( Agent)** Agent 线
###
* **:**
* **:** `GO / NO-GO`
* **:**
* **线:** 线线
## 👤 (ROLE)
###
** Agent (Automated QA & Release Gatekeeper Agent)**
###
| | | |
| :--- | :--- | :--- |
| **** | | |
| ** (SAST/DAST)** | | / |
| **** | | `GO/NO-GO` |
| **CI/CD ** | | |
| **** | | ( Prometheus) |
###
1. ** (Evidence is the Sole Adjudicator):** GO / NO-GO
2. ** (The Plan is the Constitution of Verification):** ****
3. ** (Zero Tolerance):** **P0****S0******
4. ** (Full Auditability):**
###
** (Adjudicator)**
## 📋 (TASK)
###
******/**线**线**
###
#### Phase 1:
```
1.1
>
1.2
>
```
#### Phase 2: ```
2.1
> (JUnit XML )
2.2 (SAST)
> (SARIF )
2.3 []
>
```
#### Phase 3:
```
3.1
> 稿
3.2
> `GO` `NO-GO`
```
#### Phase 4: /线
```
4.1
> (IF GO):
> (IF NO-GO):
4.2 ( GO )
> 15线线
4.3 稿
> Markdown
```
###
```python
def adjudicate(evidence_package):
# Rule 1: Zero tolerance for critical test failures
if evidence_package.tests.p0_failures > 0:
return "NO-GO", "Critical (P0) test cases failed."
# Rule 2: Zero tolerance for new high-severity vulnerabilities
if evidence_package.security.new_s0_vulnerabilities > 0:
return "NO-GO", "New critical (S0) security vulnerabilities detected."
# Rule 3: Check for major quality deviations
if evidence_package.quality_audit.s0_deviations > 0:
return "NO-GO", "Severe (S0) deviation from architectural principles detected."
# All critical checks passed
return "GO", "All P0 quality gates passed successfully."
```
## 🔄 / (I/O)
###
```json
{
"required_fields": {
"execution_plan": "类型: string, 说明: 第二环节的《综合执行方案》Markdown文本。",
"changeset": "类型: object, 说明: 第三环节的变更集 (e.g., { 'type': 'git_commit', 'value': 'hash' })。",
"implementation_log": "类型: string, 说明: 第三环节的《实施与决策日志》Markdown文本。"
},
"validation_rules": [
"所有输入字段不得为空。"
]
}
```
### ```markdown
# (Validation & Release Evidence Package)
## 1. (Final Adjudication Result)
* **:** **[GO / NO-GO]**
* **:** [YYYY-MM-DD HH:MM:SS UTC]
* **:** [P0S0/S1]
## 2. (Evidence Package Summary)
| | | | |
| :--- | :--- | :--- | :--- |
| | PASSED | : 95% | [link_to_unit_test_report.xml] |
| | PASSED | 12/12 scenarios | [link_to_integration_report.xml] |
| (SAST) | WARN | 2 new S2 vulns | [link_to_sast_report.sarif] |
| | PASSED | 0 S0/S1 deviations | [link_to_audit_report.json] |
## 3. (Detailed Audit & Test Findings)
### 3.1
* []
### 3.2
* **[] :** [S2 - Hardcoded Secret]
* **:**
* **:** `src/config/database.py`
* **:** [].
* **:** [ Secrets Manager].
## 4. (Release & Monitoring Records)
* **:** [ (Canary Release)]
* **:** [YYYY-MM-DD HH:MM:SS UTC]
* ** ID:** [Git Commit Hash]
* **:** [ SUCCEEDED / ROLLED_BACK]
* ** NO-GO ():** []
### 4.1 线线 (Post-Launch Monitoring Baseline)
| (KPI) | 线 (15) | () |
| :--- | :--- | :--- |
| P95 API | 150ms | > 500ms |
| | 99.98% | < 99.9% |
| CPU 使 | 35% | > 80% |
---
**[SYSTEM]**
```
## 💡 (EXAMPLES)
### 1: (GO)
** ():**
`: . : 0S0/S1.`
** ():**
```markdown
## 1.
* **:** **GO**
* **:** P0
## 4.
* **:** SUCCEEDED
```
### 2: (NO-GO)
** ():**
`: (TC-AUTH-001, AC-01: ).`
** ():**
```markdown
## 1.
* **:** **NO-GO**
* **:** (P0) TC-AUTH-001
## 4.
* **:** ROLLED_BACK
* ** NO-GO :** (P0) TC-AUTH-001
```
### ()
** ():**
`: 1S0SQL.`
**AI:**
**GO**S0
**:**
********Agent
## 📊 (EVALUATION)
### (100)
| | | |
| :--- | :--- | :--- |
| **** | 50% | `GO/NO-GO` 100% |
| **** | 30% | |
| **** | 15% | 线 |
| **** | 5% | |
###
#### (Critical)
- [ ]
- [ ] GO/NO-GO
- [ ] NO-GO
- [ ] GO线线
## (EXCEPTIONS)
### 1:
* **:**
* **:**
1.
2. `INDETERMINATE` ()
3.
* **退:**
### 2:
* **:**
* **:**
1.
2. `NO-GO`
3. `[Test Case ID]`
* **退:**
@@ -0,0 +1,209 @@
# Agent v2.0
## 📌 (META)
* ****: 2.0.0
* ****: Gemini, GPT, Claude
* ****: 2025-12-25
* ****: -
* ****: 使
## 🌍 (CONTEXT)
###
Agent ** (Master Orchestrator)** ****使-****
###
* Agent
*
### 使
###
* **:**
* **:**
* **:**
* **:** 使
## 👤 (ROLE)
###
**AI (AI Project Orchestrator)**** Agent**
###
| | | |
| :--- | :--- | :--- |
| **** | | / Agent ( Step 2) |
| **** | | |
| **** | | |
| **** | | **** |
| ** Agent ** | | Agent |
###
1. ** (Perfection is the Only Exit):**
2. ** (Failure Triggers Re-planning):** `NO-GO` ****
3. ** (State Must Be Recorded):**
4. ** (Archiving is a By-product of Success):**
###
** (Cybernetic Loop)** ** (Sense) -> (Compare) -> (Act)**
* **:**
* **:**
* **:**
## 📋 (TASK)
###
**(S2)->(S3)->(S4)******
###
#### Phase 1:
```
1.1
> (GO / NO-GO)
1.2
>
```
#### Phase 2:
```
2.1 IF == 'GO' THEN
[]
ELSE (IF == 'NO-GO' or 'INDETERMINATE')
[]
END IF
```
#### Phase 3:
```
3.1 ** (Success Workflow):**
3.1.1
3.1.2 **:** S1-S4 CHANGELOG.md
3.1.3
3.2 ** (Failure Workflow):**
3.2.1 ()
3.2.2
3.2.3
```
#### Phase 4:
```
4.1 IF [] THEN
**: - Agent**
ELSE IF [] THEN
**: - Agent**
ELSE (IF [] )
**: **
END IF
```
## 🔄 / (I/O)
###
```json
{
"required_fields": {
"master_task_list": "类型: object, 说明: 描述整个项目所有任务及其当前状态的JSON对象。",
"latest_validation_package": "类型: string, 说明: 来自第四环节的最新《验证与发布证据包》Markdown文本。"
},
"optional_fields": {
"all_artifacts_from_current_loop": "类型: object, 说明: 本次成功循环中S1-S4的所有产物,用于归档。"
}
}
```
###
Agent ********
**1. (Control Command):**
```json
{
"next_action": "[RESTART_FROM_STEP_2 | PROCEED_TO_NEXT_TASK | TERMINATE_SUCCESS]",
"context_for_step_2": {
"original_spec_id": "...",
"task_to_process": "...",
"failure_context": { //仅在失败时提供
"failed_task": "...",
"root_cause": "...",
"evidence_link": "..."
}
},
"final_report": "..." //仅在最终成功时提供
}
```
**2. (Archival Document - ):**
* ()
## 💡 (EXAMPLES)
### 1:
**:**
* `master_task_list`: `{"task_auth": {"status": "IN_PROGRESS"}}`
* `latest_validation_package`: `...: NO-GO... : TC-AUTH-001 ...`
** ():**
```json
{
"next_action": "RESTART_FROM_STEP_2",
"context_for_step_2": {
"original_spec_id": "SPEC-001",
"task_to_process": "task_auth",
"failure_context": {
"failed_task": "task_auth",
"root_cause": "Integration test failed: TC-AUTH-001",
"evidence_link": "path/to/validation_package.md"
}
}
}
```
**:** `master_task_list` `{"task_auth": {"status": "FAILED", "reason": "TC-AUTH-001 failed"}}`
### 2:
**:**
* `master_task_list`: `{"task_auth": {"status": "IN_PROGRESS"}, "task_payment": {"status": "PENDING"}}`
* `latest_validation_package`: `...: GO...`
* `all_artifacts...`: `{...}`
** ():**
```json
{
"next_action": "PROCEED_TO_NEXT_TASK",
"context_for_step_2": {
"original_spec_id": "SPEC-001",
"task_to_process": "task_payment",
"failure_context": null
}
}
```
**:**
1. `task_auth` CHANGELOG
2. `master_task_list` `{"task_auth": {"status": "COMPLETED"}, "task_payment": {"status": "IN_PROGRESS"}}`
## 📊 (EVALUATION)
### (100)
| | | |
| :--- | :--- | :--- |
| **** | 50% | `GO/NO-GO` `RESTART/PROCEED/TERMINATE` |
| **** | 30% | |
| **** | 20% | |
## (EXCEPTIONS)
### 1:
* **:** N N=3
* **:**
1.
2. `FATAL_ERROR: MAX_RETRIES_EXCEEDED`
3.
* **退:**
### 2:
* **:** `master_task_list` 访
* **:**
1.
2.
* **退:**
@@ -0,0 +1,21 @@
# AGENTS - workflow-orchestrator
## 目录骨架
```
workflow-orchestrator/
├── AGENTS.md # 本文件(目录级约束)
├── SKILL.md # 技能入口,状态机与 hook 约定
├── CHANGELOG.md # 变更记录
├── references/
│ └── index.md # 参考索引与待补充子文档
```
## 职责与依赖
- 职责:用文件事件 hook + 轻量状态机,编排 `step1~step5` 的自动执行,支持失败回跳、归档与闭环。
- 上游:`../step1_需求输入.jsonl` ... `../step5_总控与循环.jsonl`(五步提示词定义)。
- 下游:`../workflow_engine/*`(状态机引擎与 Hook),产物落盘到 `../workflow_engine/artifacts/`
## 使用要点
- 状态文件:`../workflow_engine/state/current_step.json` 为唯一调度入口;每次更新即触发对应 Runner。
- 总控逻辑:Step5 依据 `verify.status` 回跳 step2 或标记完成;防止无限循环需在 Runner 中实现熔断计数。
- 产物:按 `../workflow_engine/artifacts/<run_id>/<step>.{json,md}` 落盘,便于审计与归档。
@@ -0,0 +1,7 @@
# CHANGELOG
## 2025-12-25T04:58:27+08:00 - 创建 workflow-orchestrator 技能骨架
- 新增 `SKILL.md` 定义基于文件 hook 的闭环编排技能,覆盖触发条件、状态机与回跳逻辑。
- 新增 `references/index.md` 索引,预留 state/CI 子文档占位。
- 新增 `AGENTS.md` 记录目录骨架与依赖关系。
- 验证:文档编写,无脚本运行(TODO)。
@@ -0,0 +1,87 @@
---
name: workflow-orchestrator
description: "自动化闭环开发工作流编排:基于状态机+文件系统 hook 驱动五步 Agent(规格/计划/实施/验证/总控),适用于需要最小依赖、可复现的全自动软件流水线。"
---
# workflow-orchestrator 技能
一个以「文件事件 hook + 轻量状态机」驱动的全自动开发闭环编排技能,连接现有五个 workflow_steps 提示词(step1~step5),在本地/CI 均可无服务依赖运行。
## 何时使用此技能
- 需要让 step1~step5 提示词按顺序自动执行,并在验证失败时回跳重跑计划/实施。
- 希望用最小依赖(仅文件系统与 shell)实现自动化,而非部署消息队列/微服务。
- 想在 CI 或本地通过简单命令/文件变更触发整条流水线。
- 需要总控(Step5)记录失败上下文并驱动循环直至所有任务完成。
## 不适用 / 边界
- 不处理外部云编排(Airflow/Temporal);若需分布式调度请另用专用框架。
- 模型调用凭证/安全策略需由外部注入,本技能不管理密钥。
- 不创建新提示词内容,只编排已存在的 `workflow_steps/stepN_*.jsonl`
- 输入需求缺失时,请先完成 Step1 的人工确认,再启动编排。
## 快速参考
- 目录约定
- 状态:`workflow_steps/state/current_step.json`
- 产物:`workflow_steps/artifacts/<run_id>/<step>.json|md`
- Hook 脚本:`workflow_engine/hook_runner.sh`(监听 state 变更)
- Runner`workflow_engine/runner.py run --step N --input INPUT.json --state STATE.json`
- 状态文件最小 Schema
```json
{
"run_id": "2025-12-25T05-00-00Z",
"step": "step3",
"status": "pending|running|success|failed",
"payload_path": "artifacts/<run>/<prev>.json",
"next_hint": "optional textual guidance",
"verify": {"status": "failed|success", "details": "..."},
"target_step": "step2|step5|done"
}
```
- Hook 触发(最小命令行示例)
```bash
# 启动监听(依赖 inotify-tools
workflow_engine/hook_runner.sh
```
文件 `state/current_step.json` 每次更新即触发对应 `runner.py`
- `step1 -> step2 -> step3 -> step4 -> step5`
- Step5 根据 `verify.status` 写入 `target_step=step2`(失败回跳)或 `done`(全部完成)。
- 手动启动/重跑
```bash
# 人工输入需求后触发 step1
python workflow_engine/runner.py run --step 1 --input user_request.json --state workflow_steps/state/current_step.json
```
## 示例
### 示例 1:全链路首轮
- 输入:`user_request.json` 包含原始需求。
- 步骤:运行 `runner.py step1` 生成规格书 → hook 自动推进 step2/3/4 → step5 归档。
- 期望:`artifacts/<run>/locked_spec.md`、计划、补丁、测试报告齐全;state 标记 `done`
### 示例 2:验证失败回跳
- 输入:Step4 写出 `verify.status=failed`(含失败用例与日志)。
- 步骤:Step5 读取失败上下文写 `target_step=step2`hook 触发 step2 重新规划 → step3 → step4。
- 期望:第二轮通过;state 历史包含失败记录;产物追加带版本号的补丁/报告。
### 示例 3CI 集成
- 输入:CI job 上传需求与代码变更,触发 `runner.py step1`
- 步骤:CI 中后台运行 `hook_runner.sh`;每个 step 输出工件到 `artifacts/` 并作为 job artifact。
- 期望:流水线失败时 CI 直接暴露 Step4 报告;通过后 Step5 归档并关闭 job。
## 参考资料
- `workflow_steps/step1_需求输入.jsonl` ... `step5_总控与循环.jsonl`
- `workflow_engine/hook_runner.sh`(需自建,监听 `state/current_step.json`
- `workflow_engine/runner.py`(需自建,封装模型调用与状态写入)
## 维护
- 来源:仓库内现有五步提示词;不引用外部未验证信息。
- 最后更新:2025-12-25
- 已知限制:未内置凭证管理;需要 inotify-tools 或同类文件监听工具。
@@ -0,0 +1,7 @@
# workflow-orchestrator 参考索引
- `../SKILL.md`:技能入口、触发条件、状态机与 hook 约定。
- `state-schema`:建议的 `state/current_step.json` 字段与示例。
- `ci-notes`:在 CI 中使用本技能的注意事项与命令示例(TODO)。
> TODO: 如需更详细的状态机图、命令清单或集成脚本,请在此添加子文档并更新索引。
@@ -0,0 +1,79 @@
# workflow_engine
全自动开发闭环的轻量编排引擎,基于 **文件事件 Hook + 状态机** 实现。
## 目录结构
```
workflow_engine/
├── runner.py # 状态机调度器
├── hook_runner.sh # 文件监听 Hook (inotify)
├── state/
│ └── current_step.json # 当前状态
└── artifacts/
└── <run_id>/ # 每次运行的产物
├── step1.json
├── step2.json
└── ...
```
## 快速开始
### 1. 手动模式(无 Hook
```bash
# 启动新工作流
python runner.py start
# 查看状态
python runner.py status
```
### 2. 自动模式(Hook 监听)
```bash
# 终端 1: 启动 Hook 监听
./hook_runner.sh
# 终端 2: 启动工作流(状态变更会自动触发后续步骤)
python runner.py start
```
## 状态文件 Schema
```json
{
"run_id": "20251225T053800",
"step": "step3",
"status": "running|success|failed|completed|fatal_error",
"payload_path": "artifacts/20251225T053800/step2.json",
"verify": {"status": "success|failed", "details": "..."},
"target_step": "step2|step5|done",
"retry_count": 0
}
```
## 流程控制
```
step1 → step2 → step3 → step4 → step5
┌─────────────┴─────────────┐
│ │
verify=failed verify=success
│ │
▼ ▼
target_step=step2 target_step=done
(回跳重规划) (流程结束)
```
## 熔断机制
- 同一任务最多重试 3 次
- 超过后状态变为 `fatal_error`,需人工介入
## TODO
- [ ] 集成实际 LLM 调用(替换 runner.py 中的 MOCK
- [ ] 添加 CI 集成示例
- [ ] 支持并行任务处理
@@ -0,0 +1,6 @@
{
"step": "step1",
"status": "success",
"output": "[MOCK] step1 completed",
"timestamp": "2025-12-25T05:45:01.810163"
}
@@ -0,0 +1,6 @@
{
"step": "step2",
"status": "success",
"output": "[MOCK] step2 completed",
"timestamp": "2025-12-25T05:45:01.812465"
}
@@ -0,0 +1,6 @@
{
"step": "step3",
"status": "success",
"output": "[MOCK] step3 completed",
"timestamp": "2025-12-25T05:45:01.816471"
}
@@ -0,0 +1,6 @@
{
"step": "step4",
"status": "success",
"output": "[MOCK] step4 completed",
"timestamp": "2025-12-25T05:45:01.823537"
}
@@ -0,0 +1,6 @@
{
"step": "step5",
"status": "success",
"output": "[MOCK] step5 completed",
"timestamp": "2025-12-25T05:45:01.824088"
}
@@ -0,0 +1,38 @@
#!/bin/bash
# workflow_engine/hook_runner.sh
# 文件事件 Hook - 监听状态文件变更并触发调度
#
# 依赖: inotify-tools (apt install inotify-tools)
# 用法: ./hook_runner.sh
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
STATE_FILE="$SCRIPT_DIR/state/current_step.json"
RUNNER="$SCRIPT_DIR/runner.py"
echo "[HOOK] 启动监听: $STATE_FILE"
echo "[HOOK] 按 Ctrl+C 停止"
# 检查依赖
if ! command -v inotifywait &> /dev/null; then
echo "[ERROR] 需要安装 inotify-tools: sudo apt install inotify-tools"
exit 1
fi
# 确保状态文件存在
mkdir -p "$(dirname "$STATE_FILE")"
[ -f "$STATE_FILE" ] || echo '{"status":"idle"}' > "$STATE_FILE"
# 监听文件修改事件
inotifywait -m -e modify "$STATE_FILE" 2>/dev/null | while read -r directory event filename; do
echo "[HOOK] $(date '+%H:%M:%S') 检测到状态变更"
# 读取 target_step
target=$(python3 -c "import json; print(json.load(open('$STATE_FILE')).get('target_step',''))" 2>/dev/null)
if [ "$target" = "done" ]; then
echo "[HOOK] 工作流已完成"
elif [ -n "$target" ] && [ "$target" != "null" ]; then
echo "[HOOK] 触发调度 -> $target"
python3 "$RUNNER" dispatch
fi
done
@@ -0,0 +1,197 @@
#!/usr/bin/env python3
"""
workflow_engine/runner.py - 轻量状态机调度器
用于编排 step1~step5 的全自动开发闭环
"""
import json
import os
import sys
from datetime import datetime
from pathlib import Path
BASE_DIR = Path(__file__).parent.parent
STATE_FILE = BASE_DIR / "workflow_engine/state/current_step.json"
ARTIFACTS_DIR = BASE_DIR / "workflow_engine/artifacts"
PROMPTS_DIR = BASE_DIR
STEP_MAP = {
"step1": "step1_需求输入.jsonl",
"step2": "step2_执行计划.jsonl",
"step3": "step3_实施变更.jsonl",
"step4": "step4_验证发布.jsonl",
"step5": "step5_总控与循环.jsonl",
}
STEP_FLOW = ["step1", "step2", "step3", "step4", "step5"]
MAX_RETRY_COUNT = 3
def load_state() -> dict:
if STATE_FILE.exists():
return json.loads(STATE_FILE.read_text(encoding="utf-8"))
return {"run_id": None, "step": None, "status": "idle"}
def save_state(state: dict):
STATE_FILE.parent.mkdir(parents=True, exist_ok=True)
STATE_FILE.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8")
def get_run_id() -> str:
return datetime.now().strftime("%Y%m%dT%H%M%S")
def get_artifact_path(run_id: str, step: str, ext: str = "json") -> Path:
path = ARTIFACTS_DIR / run_id
path.mkdir(parents=True, exist_ok=True)
return path / f"{step}.{ext}"
def next_step(current: str) -> str | None:
"""返回下一步,step5 后返回 None"""
try:
idx = STEP_FLOW.index(current)
return STEP_FLOW[idx + 1] if idx + 1 < len(STEP_FLOW) else None
except ValueError:
return None
def run_step(step: str, state: dict, input_data: dict = None):
"""执行单个步骤(实际调用模型的占位)"""
prompt_file = PROMPTS_DIR / STEP_MAP.get(step, "")
if not prompt_file.exists():
print(f"[ERROR] Prompt file not found: {prompt_file}")
return None
run_id = state.get("run_id") or get_run_id()
# 更新状态为 running
state.update({"run_id": run_id, "step": step, "status": "running"})
save_state(state)
print(f"[RUN] {step} | run_id={run_id}")
print(f" prompt: {prompt_file.name}")
# === 这里是模型调用占位 ===
# 实际实现时替换为:
# result = call_llm(prompt_file.read_text(), input_data)
result = {
"step": step,
"status": "success", # 模拟成功
"output": f"[MOCK] {step} completed",
"timestamp": datetime.now().isoformat()
}
# 可选:通过环境变量模拟 step4 验证失败,用于本地验证重试/熔断逻辑
# 默认不生效,不影响正常使用
if step == "step4":
mock_verify = os.environ.get("VIBE_WORKFLOW_MOCK_VERIFY_STATUS")
if mock_verify in ("success", "failed"):
result["verify"] = {"status": mock_verify}
# ========================
# 保存产物
artifact_path = get_artifact_path(run_id, step)
artifact_path.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8")
print(f" artifact: {artifact_path}")
return result
def dispatch():
"""根据当前状态分发到下一步"""
state = load_state()
target = state.get("target_step")
if target == "done":
print("[DONE] 所有任务完成")
return
if target:
# 有明确的目标步骤(来自 step5 的指令)
run_step(target, state)
else:
print("[IDLE] 无待执行任务,使用 'run --step 1' 启动")
def start_workflow(input_file: str = None):
"""从 step1 启动新的工作流"""
run_id = get_run_id()
state = {"run_id": run_id, "step": None, "status": "pending"}
input_data = None
if input_file and Path(input_file).exists():
input_data = json.loads(Path(input_file).read_text(encoding="utf-8"))
print(f"[START] 新工作流 run_id={run_id}")
# 显式状态机:支持 step5 失败回跳 step2,并可多次重试(带熔断)
step_idx = 0
while step_idx < len(STEP_FLOW):
step = STEP_FLOW[step_idx]
result = run_step(step, state, input_data)
if not result:
state["status"] = "error"
save_state(state)
return
# step4 后检查验证结果
if step == "step4":
verify_status = result.get("verify", {}).get("status", "success")
state["verify"] = {"status": verify_status}
# step5 决定下一步(回跳/完成)
if step == "step5":
if state.get("verify", {}).get("status") == "failed":
next_retry_count = state.get("retry_count", 0) + 1
if next_retry_count > MAX_RETRY_COUNT:
print(f"[FATAL] 超过最大重试次数")
state["retry_count"] = next_retry_count
state["target_step"] = "step2"
state["status"] = "fatal_error"
save_state(state)
return
state["retry_count"] = next_retry_count
state["target_step"] = "step2"
state["status"] = "retry"
save_state(state)
print(f"[RETRY {next_retry_count}/{MAX_RETRY_COUNT}] 验证失败,返回 step2 重规划")
step_idx = STEP_FLOW.index("step2")
continue
state["target_step"] = "done"
state["status"] = "completed"
save_state(state)
print(f"[COMPLETE] 工作流完成")
return
save_state(state)
step_idx += 1
def main():
if len(sys.argv) < 2:
print("Usage:")
print(" python runner.py start [input.json] - 启动新工作流")
print(" python runner.py dispatch - 根据状态分发")
print(" python runner.py status - 查看当前状态")
return
cmd = sys.argv[1]
if cmd == "start":
input_file = sys.argv[2] if len(sys.argv) > 2 else None
start_workflow(input_file)
elif cmd == "dispatch":
dispatch()
elif cmd == "status":
state = load_state()
print(json.dumps(state, ensure_ascii=False, indent=2))
else:
print(f"Unknown command: {cmd}")
if __name__ == "__main__":
main()
@@ -0,0 +1,9 @@
{
"run_id": "20251225T054501",
"step": "step5",
"status": "completed",
"verify": {
"status": "success"
},
"target_step": "done"
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,56 @@
# 🎨 Canvas白板驱动开发工作流
> 图形是第一公民,代码是白板的序列化形式
## 核心理念
```
传统开发:代码 → 口头沟通 → 脑补架构 → 代码失控
Canvas方式:代码 ⇄ 白板 ⇄ AI ⇄ 人类(白板为单一真相源)
```
| 痛点 | 解法 |
|:---|:---|
| 🤖 AI看不懂项目结构 | ✅ AI直接读白板JSON,秒懂架构 |
| 🧠 人类记不住复杂依赖 | ✅ 连线清晰,牵一发动全身一目了然 |
| 💬 团队协作靠嘴说 | ✅ 指着白板讲,新人5分钟看懂 |
## 文件结构
```
canvas-dev/
├── README.md # 本文件 - 工作流概述
├── workflow.md # 完整工作流步骤(线性流程)
├── prompts/
│ ├── 01-架构分析.md # 从代码生成白板的提示词
│ ├── 02-白板驱动编码.md # 根据白板生成代码的提示词
│ └── 03-白板同步检查.md # 校验白板与代码一致性
├── templates/
│ ├── project.canvas # Obsidian Canvas 项目模板
│ └── module.canvas # 单模块白板模板
└── examples/
└── demo-project.canvas # 示例项目白板
```
## 快速开始
### 1. 准备工具
- [Obsidian](https://obsidian.md/) - 免费开源白板工具
- AI助手(Claude/GPT-4,需支持读取Canvas JSON
### 2. 生成项目架构白板
```bash
# 将项目代码路径提供给AI,使用架构分析提示词
# AI自动生成 .canvas 文件
```
### 3. 用白板驱动开发
- 在白板上画出新模块和依赖关系
- 导出白板JSON发送给AI
- AI根据白板生成/修改代码
## 相关文档
- [Canvas白板驱动开发详解](../../guides/playbook/图形化AI协作-Canvas白板驱动开发.md)
- [白板驱动开发系统提示词(在线提示词库入口)](../../../prompt/README.md)
- [胶水编程](../../principles/fundamentals/胶水编程.md)
@@ -0,0 +1,281 @@
{
"nodes": [
{
"id": "title",
"type": "text",
"x": -100,
"y": -350,
"width": 400,
"height": 60,
"text": "# 📦 电商系统架构白板\n\n演示项目 - 用户、商品、订单管理"
},
{
"id": "group-frontend",
"type": "group",
"x": -600,
"y": -250,
"width": 250,
"height": 500,
"label": "🖥️ 前端"
},
{
"id": "group-api",
"type": "group",
"x": -300,
"y": -250,
"width": 250,
"height": 500,
"label": "🌐 API网关"
},
{
"id": "group-service",
"type": "group",
"x": 0,
"y": -250,
"width": 300,
"height": 500,
"label": "⚙️ 业务服务"
},
{
"id": "group-infra",
"type": "group",
"x": 350,
"y": -250,
"width": 300,
"height": 500,
"label": "🔧 基础设施"
},
{
"id": "fe-web",
"type": "text",
"x": -580,
"y": -200,
"width": 210,
"height": 80,
"text": "# Web App\n\nReact + TypeScript"
},
{
"id": "fe-mobile",
"type": "text",
"x": -580,
"y": -100,
"width": 210,
"height": 80,
"text": "# Mobile App\n\nReact Native"
},
{
"id": "api-gateway",
"type": "text",
"x": -280,
"y": -200,
"width": 210,
"height": 100,
"text": "# API Gateway\n\n- 路由分发\n- 认证鉴权\n- 限流熔断"
},
{
"id": "svc-user",
"type": "text",
"x": 20,
"y": -200,
"width": 260,
"height": 100,
"text": "# UserService\n\n- 用户注册/登录\n- 个人信息管理\n- 权限校验"
},
{
"id": "svc-product",
"type": "text",
"x": 20,
"y": -80,
"width": 260,
"height": 100,
"text": "# ProductService\n\n- 商品CRUD\n- 库存管理\n- 分类搜索"
},
{
"id": "svc-order",
"type": "text",
"x": 20,
"y": 40,
"width": 260,
"height": 100,
"text": "# OrderService\n\n- 下单流程\n- 订单状态机\n- 退款处理"
},
{
"id": "svc-payment",
"type": "text",
"x": 20,
"y": 160,
"width": 260,
"height": 80,
"text": "# PaymentService\n\n- 支付网关对接\n- 账单管理"
},
{
"id": "infra-db",
"type": "text",
"x": 370,
"y": -200,
"width": 260,
"height": 80,
"text": "# PostgreSQL\n\n主数据库",
"color": "4"
},
{
"id": "infra-cache",
"type": "text",
"x": 370,
"y": -100,
"width": 260,
"height": 80,
"text": "# Redis\n\n缓存 + 会话",
"color": "1"
},
{
"id": "infra-mq",
"type": "text",
"x": 370,
"y": 0,
"width": 260,
"height": 80,
"text": "# RabbitMQ\n\n异步消息队列",
"color": "2"
},
{
"id": "infra-es",
"type": "text",
"x": 370,
"y": 100,
"width": 260,
"height": 80,
"text": "# Elasticsearch\n\n商品搜索引擎",
"color": "5"
},
{
"id": "external-stripe",
"type": "text",
"x": 370,
"y": 200,
"width": 260,
"height": 60,
"text": "# Stripe API\n\n外部支付服务",
"color": "6"
}
],
"edges": [
{
"id": "e-web-gw",
"fromNode": "fe-web",
"toNode": "api-gateway",
"fromSide": "right",
"toSide": "left",
"label": "HTTP"
},
{
"id": "e-mobile-gw",
"fromNode": "fe-mobile",
"toNode": "api-gateway",
"fromSide": "right",
"toSide": "left",
"label": "HTTP"
},
{
"id": "e-gw-user",
"fromNode": "api-gateway",
"toNode": "svc-user",
"fromSide": "right",
"toSide": "left",
"label": "/users/*"
},
{
"id": "e-gw-product",
"fromNode": "api-gateway",
"toNode": "svc-product",
"fromSide": "right",
"toSide": "left",
"label": "/products/*"
},
{
"id": "e-gw-order",
"fromNode": "api-gateway",
"toNode": "svc-order",
"fromSide": "right",
"toSide": "left",
"label": "/orders/*"
},
{
"id": "e-order-user",
"fromNode": "svc-order",
"toNode": "svc-user",
"fromSide": "top",
"toSide": "bottom",
"label": "校验用户"
},
{
"id": "e-order-product",
"fromNode": "svc-order",
"toNode": "svc-product",
"fromSide": "top",
"toSide": "bottom",
"label": "扣减库存"
},
{
"id": "e-order-payment",
"fromNode": "svc-order",
"toNode": "svc-payment",
"fromSide": "bottom",
"toSide": "top",
"label": "发起支付"
},
{
"id": "e-user-db",
"fromNode": "svc-user",
"toNode": "infra-db",
"fromSide": "right",
"toSide": "left"
},
{
"id": "e-product-db",
"fromNode": "svc-product",
"toNode": "infra-db",
"fromSide": "right",
"toSide": "left"
},
{
"id": "e-order-db",
"fromNode": "svc-order",
"toNode": "infra-db",
"fromSide": "right",
"toSide": "left"
},
{
"id": "e-user-cache",
"fromNode": "svc-user",
"toNode": "infra-cache",
"fromSide": "right",
"toSide": "left",
"label": "会话"
},
{
"id": "e-product-es",
"fromNode": "svc-product",
"toNode": "infra-es",
"fromSide": "right",
"toSide": "left",
"label": "搜索"
},
{
"id": "e-order-mq",
"fromNode": "svc-order",
"toNode": "infra-mq",
"fromSide": "right",
"toSide": "left",
"label": "订单事件"
},
{
"id": "e-payment-stripe",
"fromNode": "svc-payment",
"toNode": "external-stripe",
"fromSide": "right",
"toSide": "left",
"label": "支付请求"
}
]
}
@@ -0,0 +1,85 @@
# 01-架构分析提示词
> 从现有代码自动生成 Obsidian Canvas 架构白板
## 使用场景
- 接手新项目,快速理解架构
- 为现有项目建立可视化文档
- 准备 Code Review 或技术分享
## 提示词
```markdown
你是一个代码架构分析专家。请分析以下项目结构,生成 Obsidian Canvas 格式的架构白板。
## 输入
项目路径:{PROJECT_PATH}
分析粒度:{GRANULARITY} (file/class/service)
## 输出要求
生成符合 Obsidian Canvas JSON 格式的 .canvas 文件,包含:
1. **节点 (nodes)**
- 每个模块/文件/类作为一个节点
- 节点包含:id, type, x, y, width, height, text
- 按功能分区布局(如:API层左侧,数据层右侧)
2. **连线 (edges)**
- 表示模块间的依赖/调用关系
- 包含:id, fromNode, toNode, fromSide, toSide, label
- label 标注关系类型(调用/继承/依赖/数据流)
3. **分组 (groups)**
- 按功能域分组(如:用户模块、支付模块)
- 用颜色区分不同层级
## Canvas JSON 结构示例
```json
{
"nodes": [
{
"id": "node1",
"type": "text",
"x": 0,
"y": 0,
"width": 200,
"height": 100,
"text": "# UserService\n- createUser()\n- getUser()"
}
],
"edges": [
{
"id": "edge1",
"fromNode": "node1",
"toNode": "node2",
"fromSide": "right",
"toSide": "left",
"label": "调用"
}
]
}
```
## 分析步骤
1. 扫描项目目录结构
2. 识别入口文件和核心模块
3. 分析 import/require 语句提取依赖关系
4. 识别数据库操作、API调用、外部服务
5. 按调用层级布局节点位置
6. 生成完整的 .canvas JSON
```
## 使用示例
```
请分析 /home/user/my-project 项目,生成文件级别的架构白板。
重点关注:
- API 路由和处理函数
- 数据库模型和操作
- 外部服务调用
```
## 输出文件
生成的 `.canvas` 文件可直接用 Obsidian 打开查看和编辑。
@@ -0,0 +1,88 @@
# 02-白板驱动编码提示词
> 根据 Canvas 白板架构图生成/修改代码
## 使用场景
- 新功能开发:先画白板,再生成代码
- 架构重构:修改白板连线,AI同步重构代码
- 模块拆分:在白板拆分节点,AI生成新文件
## 提示词
```markdown
你是一个根据架构白板生成代码的专家。请根据以下 Obsidian Canvas 白板 JSON,生成对应的代码实现。
## 输入
Canvas JSON
```json
{CANVAS_JSON}
```
技术栈:{TECH_STACK}
目标目录:{TARGET_DIR}
## 解析规则
1. **节点 → 文件/类**
- 节点 text 中的标题 → 文件名/类名
- 节点 text 中的列表项 → 方法/函数
- 节点颜色/分组 → 模块归属
2. **连线 → 依赖关系**
- fromNode → toNode = import/调用关系
- edge label 决定关系类型:
- "调用" → 函数调用
- "继承" → class extends
- "依赖" → import
- "数据流" → 参数传递
3. **分组 → 目录结构**
- 同一分组的节点放在同一目录
- 分组名称 → 目录名
## 输出要求
1. 生成完整的文件结构
2. 每个文件包含:
- 正确的 import 语句(根据连线)
- 类/函数定义(根据节点内容)
- 调用关系实现(根据连线方向)
3. 添加必要的类型注解和注释
4. 遵循技术栈的最佳实践
## 输出格式
```
文件:{文件路径}
```{语言}
{代码内容}
```
```
## 使用示例
```
根据以下白板生成 Python FastAPI 项目代码:
{粘贴 .canvas 文件内容}
技术栈:Python 3.11 + FastAPI + SQLAlchemy
目标目录:/home/user/my-api
```
## 增量更新模式
当白板有修改时,使用以下提示词:
```markdown
白板已更新,请对比新旧版本,只修改变化的部分:
旧白板:{OLD_CANVAS_JSON}
新白板:{NEW_CANVAS_JSON}
输出:
1. 需要新增的文件
2. 需要修改的文件(只输出 diff)
3. 需要删除的文件
```
@@ -0,0 +1,147 @@
# 03-白板同步检查提示词
> 校验白板与实际代码的一致性
## 使用场景
- PR/MR 合并前检查白板是否需要更新
- 定期审计架构文档准确性
- 发现代码中的隐式依赖
## 提示词
```markdown
你是一个代码与架构一致性检查专家。请对比以下白板和代码,找出不一致之处。
## 输入
Canvas 白板 JSON
```json
{CANVAS_JSON}
```
项目代码路径:{PROJECT_PATH}
## 检查项
1. **节点完整性**
- 白板中的节点是否都有对应的代码文件/类?
- 代码中是否有白板未记录的重要模块?
2. **连线准确性**
- 白板连线是否反映真实的 import/调用关系?
- 代码中是否有白板未标注的依赖?
3. **分组正确性**
- 白板分组是否与目录结构一致?
- 是否有跨分组的异常依赖?
## 输出格式
### 🔴 严重不一致(必须修复)
| 类型 | 白板 | 代码 | 建议 |
|:---|:---|:---|:---|
| 缺失节点 | - | UserService.py | 添加到白板 |
| 错误连线 | A→B | A不调用B | 删除连线 |
### 🟡 轻微不一致(建议修复)
| 类型 | 白板 | 代码 | 建议 |
|:---|:---|:---|:---|
| 命名不一致 | user_service | UserService | 统一命名 |
### 🟢 一致性良好
- 节点覆盖率:{X}%
- 连线准确率:{Y}%
### 📋 修复建议
1. {具体修复步骤}
2. {具体修复步骤}
```
## 自动化脚本(可选)
```python
#!/usr/bin/env python3
"""
canvas_sync_check.py - 白板与代码一致性检查脚本
用法:python canvas_sync_check.py project.canvas /path/to/project
"""
import json
import ast
import os
from pathlib import Path
def load_canvas(canvas_path):
with open(canvas_path) as f:
return json.load(f)
def extract_imports(py_file):
"""提取 Python 文件的 import 关系"""
with open(py_file) as f:
tree = ast.parse(f.read())
imports = []
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
imports.append(alias.name)
elif isinstance(node, ast.ImportFrom):
if node.module:
imports.append(node.module)
return imports
def check_consistency(canvas, project_path):
"""对比白板节点与实际文件"""
canvas_nodes = {n['text'].split('\n')[0].strip('# ')
for n in canvas.get('nodes', [])}
actual_files = set()
for py_file in Path(project_path).rglob('*.py'):
actual_files.add(py_file.stem)
missing_in_canvas = actual_files - canvas_nodes
missing_in_code = canvas_nodes - actual_files
return {
'missing_in_canvas': missing_in_canvas,
'missing_in_code': missing_in_code,
'coverage': len(canvas_nodes & actual_files) / len(actual_files) * 100
}
if __name__ == '__main__':
import sys
if len(sys.argv) != 3:
print("用法: python canvas_sync_check.py <canvas_file> <project_path>")
sys.exit(1)
canvas = load_canvas(sys.argv[1])
result = check_consistency(canvas, sys.argv[2])
print(f"覆盖率: {result['coverage']:.1f}%")
if result['missing_in_canvas']:
print(f"白板缺失: {result['missing_in_canvas']}")
if result['missing_in_code']:
print(f"代码缺失: {result['missing_in_code']}")
```
## CI/CD 集成
```yaml
# .github/workflows/canvas-check.yml
name: Canvas Sync Check
on:
pull_request:
paths:
- '**.py'
- '**.canvas'
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check canvas consistency
run: python scripts/canvas_sync_check.py docs/architecture.canvas src/
```
@@ -0,0 +1,61 @@
{
"nodes": [
{
"id": "module-main",
"type": "text",
"x": 0,
"y": 0,
"width": 280,
"height": 150,
"text": "# ModuleName\n\n## 职责\n- 功能描述1\n- 功能描述2\n\n## 公开接口\n- method1()\n- method2()"
},
{
"id": "module-dep1",
"type": "text",
"x": -350,
"y": 0,
"width": 200,
"height": 100,
"text": "# 依赖模块1\n\n被本模块调用",
"color": "3"
},
{
"id": "module-dep2",
"type": "text",
"x": 350,
"y": 0,
"width": 200,
"height": 100,
"text": "# 下游模块\n\n调用本模块",
"color": "5"
},
{
"id": "note-design",
"type": "text",
"x": 0,
"y": 200,
"width": 280,
"height": 100,
"text": "## 📝 设计决策\n\n- 为什么这样设计?\n- 有哪些权衡?",
"color": "6"
}
],
"edges": [
{
"id": "edge-dep1",
"fromNode": "module-main",
"toNode": "module-dep1",
"fromSide": "left",
"toSide": "right",
"label": "调用"
},
{
"id": "edge-dep2",
"fromNode": "module-dep2",
"toNode": "module-main",
"fromSide": "left",
"toSide": "right",
"label": "调用"
}
]
}
@@ -0,0 +1,159 @@
{
"nodes": [
{
"id": "group-api",
"type": "group",
"x": -400,
"y": -200,
"width": 300,
"height": 400,
"label": "🌐 API 层"
},
{
"id": "group-service",
"type": "group",
"x": 0,
"y": -200,
"width": 300,
"height": 400,
"label": "⚙️ 服务层"
},
{
"id": "group-data",
"type": "group",
"x": 400,
"y": -200,
"width": 300,
"height": 400,
"label": "💾 数据层"
},
{
"id": "node-api-user",
"type": "text",
"x": -380,
"y": -150,
"width": 260,
"height": 120,
"text": "# UserAPI\n\n- POST /users\n- GET /users/{id}\n- PUT /users/{id}\n- DELETE /users/{id}"
},
{
"id": "node-api-order",
"type": "text",
"x": -380,
"y": 0,
"width": 260,
"height": 120,
"text": "# OrderAPI\n\n- POST /orders\n- GET /orders/{id}\n- GET /orders/user/{user_id}"
},
{
"id": "node-service-user",
"type": "text",
"x": 20,
"y": -150,
"width": 260,
"height": 120,
"text": "# UserService\n\n- create_user()\n- get_user()\n- update_user()\n- delete_user()"
},
{
"id": "node-service-order",
"type": "text",
"x": 20,
"y": 0,
"width": 260,
"height": 120,
"text": "# OrderService\n\n- create_order()\n- get_order()\n- get_user_orders()"
},
{
"id": "node-model-user",
"type": "text",
"x": 420,
"y": -150,
"width": 260,
"height": 120,
"text": "# User Model\n\n- id: int\n- name: str\n- email: str\n- created_at: datetime"
},
{
"id": "node-model-order",
"type": "text",
"x": 420,
"y": 0,
"width": 260,
"height": 120,
"text": "# Order Model\n\n- id: int\n- user_id: int (FK)\n- total: decimal\n- status: str"
},
{
"id": "node-db",
"type": "text",
"x": 420,
"y": 150,
"width": 260,
"height": 80,
"text": "# Database\n\nPostgreSQL",
"color": "4"
}
],
"edges": [
{
"id": "edge-api-user-service",
"fromNode": "node-api-user",
"toNode": "node-service-user",
"fromSide": "right",
"toSide": "left",
"label": "调用"
},
{
"id": "edge-api-order-service",
"fromNode": "node-api-order",
"toNode": "node-service-order",
"fromSide": "right",
"toSide": "left",
"label": "调用"
},
{
"id": "edge-service-user-model",
"fromNode": "node-service-user",
"toNode": "node-model-user",
"fromSide": "right",
"toSide": "left",
"label": "操作"
},
{
"id": "edge-service-order-model",
"fromNode": "node-service-order",
"toNode": "node-model-order",
"fromSide": "right",
"toSide": "left",
"label": "操作"
},
{
"id": "edge-order-user-dep",
"fromNode": "node-service-order",
"toNode": "node-service-user",
"fromSide": "top",
"toSide": "bottom",
"label": "依赖"
},
{
"id": "edge-model-user-db",
"fromNode": "node-model-user",
"toNode": "node-db",
"fromSide": "bottom",
"toSide": "top"
},
{
"id": "edge-model-order-db",
"fromNode": "node-model-order",
"toNode": "node-db",
"fromSide": "bottom",
"toSide": "top"
},
{
"id": "edge-order-user-fk",
"fromNode": "node-model-order",
"toNode": "node-model-user",
"fromSide": "top",
"toSide": "bottom",
"label": "FK: user_id"
}
]
}
@@ -0,0 +1,31 @@
🚀 Canvas驱动开发法 - 完整工作流
1. 理解核心理念:Canvas白板作为唯一真相源,代码是其序列化形式;图形语言优于文字描述;人类负责架构设计,AI负责代码实现
/
2. 准备工具环境:安装Obsidian(免费开源白板工具);配置AI助手(Claude/GPT-4,需支持读取Canvas JSON格式);准备目标项目代码库
/
3. 生成初始架构白板:向AI提供项目代码路径;使用架构分析提示词让AI扫描项目结构;AI自动生成.canvas文件,包含模块节点和依赖连线
/
4. 用Obsidian打开.canvas文件:导入生成的架构白板;检查自动识别的模块、文件、API调用关系;验证关键依赖连线是否准确
/
5. 人工优化白板架构:拖动调整模块位置使布局清晰;补充AI遗漏的隐式依赖连线;添加注释节点标注关键设计决策;删除冗余或错误的连接
/
6. 建立代码-白板同步机制:【假设:有自动化工具】配置代码变更监听脚本;设置白板自动更新规则(新文件→新节点,新import→新连线);或手动维护:每次代码改动后更新对应白板区域
/
7. 用白板驱动AI编程(新功能开发场景):在白板上画出新模块框和预期调用关系;导出白板JSON发送给AI;指令:"按照这个架构图实现具体代码";AI根据节点名称、连线方向生成文件和函数调用
/
8. 用白板驱动代码重构(架构调整场景):在白板上删除/重连模块间的依赖线;标注需要拆分的大模块(如payment_service拆分为payment_processor和payment_validator);发送修改后的白板给AI:"按新架构重构代码,列出需要修改的文件清单"
/
9. 用白板辅助Code Review:Review前先看白板全局架构;识别异常连线(如前端直接连数据库、循环依赖);在白板上标注问题点;讨论时指着白板说明:"这条调用链不应该存在"
/
10. 用白板加速团队协作:新人入职时先看白板1分钟理解全局;需求评审时在白板上画出变更范围;技术方案会议投屏白板而非代码;会后将白板标注转化为开发任务
/
11. 维护白板与代码一致性:每次PR/MR合并前检查白板是否需要更新;定期运行自动校验脚本:对比白板JSON与实际代码依赖;发现不一致时优先修正白板(因为白板是事实来源)
/
12. 扩展应用场景:接手遗留项目时先自动生成白板快速理解;性能优化时用白板标注热点路径;安全审计时检查白板上的敏感数据流向;API设计时画出服务间调用拓扑
/
13. 【缺口澄清】明确你的项目类型以优化流程:A) 单体应用(单进程多模块) B) 微服务架构(多服务RPC通信) C) 前后端分离(前端框架+后端API)?默认假设A继续
/
14. 【缺口澄清】选择白板粒度级别:A) 文件级(每个代码文件一个节点) B) 类/函数级(每个类一个节点) C) 服务级(仅显示大模块)?推荐新手选A,复杂项目选C
/
15. 持续迭代工作流:每周回顾白板是否反映真实架构;收集团队反馈优化节点命名和布局规则;探索白板与CI/CD集成(如PR触发白板diff检查);分享最佳实践案例到团队知识库