用 Markdown 行为文件搭建个人 AI 工作流:一个 SuperClaude 风格实践教程

1. 你要做成什么

目标不是复刻一个完整 agent 平台,而是做一个个人可维护的“行为文件驱动 AI 工作流”:

1. 把常用任务拆成 Markdown 行为文件:命令、角色、模式。 2. 每次调用模型前,按任务组合这些行为文件,拼成系统提示词。 3. 保留会话历史,支持中断后恢复。 4. 先用离线 mock 验证流程,再替换成真实模型 API。

适合场景:

不适合场景:

2. 最小架构

本教程使用 3 类 Markdown 资产:

一次调用的上下文结构:

基础系统规则
+ 选中的 command Markdown
+ 选中的 agent Markdown
+ 选中的 mode Markdown
+ 用户输入
+ 历史记录(可选)

先不要引入复杂路由器。个人实践版只需要显式指定:

python personal_ai_workflow.py --command review --agent senior-engineer --mode risk-first "请审查这个函数"

3. 第一步:创建项目结构

mkdir -p personal-ai-workflow/{commands,agents,modes,sessions}
cd personal-ai-workflow
python3 -m venv .venv
source .venv/bin/activate

如果你要接真实 Anthropic API,再安装依赖:

pip install anthropic

先做离线 mock 时,不需要任何第三方依赖。

4. 第二步:写 3 个行为文件

4.1 命令:代码审查

创建 commands/review.md

# Command: review

你正在执行代码审查。

必须检查:
- 正确性:代码是否满足需求。
- 安全性:是否有注入、泄密、权限绕过风险。
- 可维护性:命名、边界、异常处理是否清晰。
- 测试:是否有必要的单元测试或回归测试。

输出格式:
1. 结论:通过 / 有条件通过 / 不通过
2. 阻断问题:必须修复的问题
3. 重要建议:值得修复但不阻断的问题
4. 可忽略建议:锦上添花的问题

4.2 角色:资深工程师

创建 agents/senior-engineer.md

# Agent: senior-engineer

你是务实的资深工程师。

偏好:
- 简单够用优先。
- 不过度设计。
- 先指出真实风险,再给建议。
- 不为了显得专业而引入不必要组件。

4.3 模式:风险优先

创建 modes/risk-first.md

# Mode: risk-first

回答时先列风险,再列改进建议。

规则:
- 高风险放前面。
- 不确定时标注“需要验证”。
- 不要把风格问题伪装成严重问题。

5. 第三步:实现离线最小闭环

创建 personal_ai_workflow.py

from __future__ import annotations

import argparse
import json
from dataclasses import dataclass, asdict
from pathlib import Path

ROOT = Path(__file__).parent
SESSIONS = ROOT / "sessions"


@dataclass
class Message:
    role: str
    content: str


class PersonalWorkflow:
    def __init__(self, session_name: str = "default") -> None:
        self.session_path = SESSIONS / f"{session_name}.json"
        self.history: list[Message] = self.load_history()

    def load_asset(self, kind: str, name: str | None) -> str:
        if not name:
            return ""
        path = ROOT / kind / f"{name}.md"
        if not path.exists():
            raise FileNotFoundError(f"missing {kind} asset: {path}")
        return path.read_text(encoding="utf-8")

    def build_system_prompt(
        self,
        command: str | None,
        agent: str | None,
        modes: list[str],
    ) -> str:
        parts = [
            "你是一个由本地 Markdown 行为文件约束的个人 AI 助手。",
            "<workflow>",
        ]
        parts.append(self.load_asset("commands", command))
        parts.append(self.load_asset("agents", agent))
        for mode in modes:
            parts.append(self.load_asset("modes", mode))
        parts.append("</workflow>")
        return "\n\n".join(part for part in parts if part.strip())

    def load_history(self) -> list[Message]:
        if not self.session_path.exists():
            return []
        data = json.loads(self.session_path.read_text(encoding="utf-8"))
        return [Message(**item) for item in data]

    def save_history(self) -> None:
        SESSIONS.mkdir(exist_ok=True)
        payload = [asdict(item) for item in self.history]
        self.session_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")

    def mock_model_call(self, system_prompt: str, user_prompt: str) -> str:
        return (
            "[MOCK 输出]\n"
            "已加载行为文件。真实接入模型前,请检查下面的系统提示词是否符合预期。\n\n"
            f"--- SYSTEM PROMPT ---\n{system_prompt}\n\n"
            f"--- USER PROMPT ---\n{user_prompt}\n"
        )

    def run(
        self,
        user_prompt: str,
        command: str | None,
        agent: str | None,
        modes: list[str],
        remember: bool,
    ) -> str:
        system_prompt = self.build_system_prompt(command, agent, modes)
        output = self.mock_model_call(system_prompt, user_prompt)
        if remember:
            self.history.append(Message(role="user", content=user_prompt))
            self.history.append(Message(role="assistant", content=output))
            self.save_history()
        return output


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser()
    parser.add_argument("prompt")
    parser.add_argument("--command")
    parser.add_argument("--agent")
    parser.add_argument("--mode", action="append", default=[])
    parser.add_argument("--session", default="default")
    parser.add_argument("--no-remember", action="store_true")
    return parser.parse_args()


def main() -> None:
    args = parse_args()
    workflow = PersonalWorkflow(session_name=args.session)
    output = workflow.run(
        user_prompt=args.prompt,
        command=args.command,
        agent=args.agent,
        modes=args.mode,
        remember=not args.no_remember,
    )
    print(output)


if __name__ == "__main__":
    main()

6. 第四步:跑通第一个用例

执行:

python personal_ai_workflow.py \
  --command review \
  --agent senior-engineer \
  --mode risk-first \
  --session code-review-demo \
  '请审查这个 Python 函数:def add(a,b): return a+b'

预期输出应该包含:

[MOCK 输出]
已加载行为文件。
--- SYSTEM PROMPT ---
# Command: review
# Agent: senior-engineer
# Mode: risk-first
--- USER PROMPT ---
请审查这个 Python 函数:def add(a,b): return a+b

验收标准:

如果这里没跑通,不要接 API。先修本地资产加载和历史保存。

7. 第五步:增加第二个个人用例:计划拆解

创建 commands/plan.md

# Command: plan

你正在把一个目标拆成可执行计划。

要求:
- 先写边界:做什么,不做什么。
- 再拆成 3–7 个小步骤。
- 每一步必须有验收标准。
- 不要默认引入新工具或新依赖。

创建 modes/step-by-step.md

# Mode: step-by-step

输出必须按步骤组织。
每一步包含:目标、操作、验收标准、失败处理。

执行:

python personal_ai_workflow.py \
  --command plan \
  --agent senior-engineer \
  --mode step-by-step \
  --session planning-demo \
  '我想把每周读到的技术文章整理成个人知识卡片,请给我一个一周内能完成的实践计划。'

预期结果:

8. 第六步:增加第三个个人用例:调试复盘

创建 commands/debug.md

# Command: debug

你正在做系统化调试。

流程:
1. 复述现象。
2. 列出已知事实。
3. 给出 2–4 个假设。
4. 为每个假设设计最小验证步骤。
5. 验证前不要直接改代码。

创建 modes/concise.md

# Mode: concise

保持简洁。
优先输出可验证步骤,不输出长篇背景解释。

执行:

python personal_ai_workflow.py \
  --command debug \
  --agent senior-engineer \
  --mode concise \
  --session debug-demo \
  '我的脚本昨天能运行,今天报 ModuleNotFoundError: requests,应该怎么排查?'

验收标准:

9. 第七步:替换成真实 Anthropic API(可选)

确认 mock 路径稳定后,再加真实模型调用。不要把 API Key 写进代码。

设置环境变量:

export ANTHROPIC_API_KEY='你的 key'

personal_ai_workflow.py 中新增一个真实调用方法:

import os
from anthropic import Anthropic


def anthropic_call(system_prompt: str, user_prompt: str) -> str:
    if not os.environ.get("ANTHROPIC_API_KEY"):
        raise RuntimeError("ANTHROPIC_API_KEY is not set")

    client = Anthropic()
    response = client.messages.create(
        model="claude-sonnet-4-5",
        max_tokens=1600,
        system=system_prompt,
        messages=[{"role": "user", "content": user_prompt}],
    )
    return "".join(block.text for block in response.content if block.type == "text")

然后把 mock_model_call() 替换为可切换模式:

if use_real_model:
    output = anthropic_call(system_prompt, user_prompt)
else:
    output = self.mock_model_call(system_prompt, user_prompt)

个人实践建议:默认仍保留 mock 模式。真实调用前先打印系统提示词,确认没有加载错行为文件。

10. 个人实践的安全边界

不要一开始做这些:

推荐的安全推进顺序:

1. 只读建议:模型只输出建议,不动文件。 2. 生成候选补丁:模型输出 diff,但由你手动应用。 3. 受限写入:只允许写临时目录或草稿目录。 4. 人工确认后执行:任何真实副作用前都需要确认。

11. 一周实践路线

Day 1:只做行为文件

交付物:

验收:你能说清每个文件什么时候用。

Day 2:跑通 mock 引擎

交付物:

验收:每个命令组合都能正确拼接系统提示词。

Day 3:整理 3 个真实个人任务

建议任务:

验收:每个任务都有输入、输出、你是否采纳、原因。

Day 4:接入真实模型

只做一次真实调用,不做自动化循环。

验收:真实输出比 mock 更有用,且行为文件约束被遵守。

Day 5:补失败处理

必须覆盖:

Day 6:沉淀个人模板

把高频任务整理成固定命令:

alias ai-review='python personal_ai_workflow.py --command review --agent senior-engineer --mode risk-first'
alias ai-plan='python personal_ai_workflow.py --command plan --agent senior-engineer --mode step-by-step'
alias ai-debug='python personal_ai_workflow.py --command debug --agent senior-engineer --mode concise'

Day 7:做一次复盘

复盘问题:

12. 常见坑与处理

坑 1:行为文件写得太长

表现:模型忽略重点,输出变散。

处理:每个行为文件先控制在 30 行以内,只保留硬规则。

坑 2:command、agent、mode 职责混在一起

表现:多个文件互相重复甚至冲突。

处理:

坑 3:过早做自动化执行

表现:模型还不稳定,就开始写文件、跑命令、改配置。

处理:先保留人工确认。个人实践的第一目标是降低重复提示词,不是让 AI 自主接管电脑。

坑 4:session 越积越长

表现:模型开始引用过期背景。

处理:每个任务单独 session。任务结束后写一段人工摘要,而不是无限保存所有对话。

13. 最小可用标准

这个个人工作流达到下面标准就够用:

不要急着做复杂路由、插件系统、多模型调度、自动文件修改。先把个人高频场景跑顺。