feat(template): ADR-013 Skill 替代脚本 — 框架脱敏/初始化机制重构

- 废弃 ADR-008 双分支+shell脚本方案(ai_project分支已过时)
- 新增 project-init Skill:export(脱敏导出) + init(初始化新项目)双模式
- 保留 SYNC.md(框架/项目边界)+ TEMPLATE.yaml(变量定义)
- L-006: 当 AI 是执行者时,Skill 优于 Shell 脚本
- 3 文件替代 4文件+1分支,零维护成本

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
tupingr
2026-05-26 15:33:05 +08:00
parent 6992f59cd2
commit 473f61b4cc
6 changed files with 282 additions and 7 deletions
+27 -7
View File
@@ -59,18 +59,38 @@
## ADR-008: 框架/项目双分支 + 同步机制 ## ADR-008: 框架/项目双分支 + 同步机制
- 日期: 2026-05-25 - 日期: 2026-05-25
- 状态: 已采纳 - 状态: 已废弃(被 ADR-013 替代,2026-05-26
- 决策: 采用双分支策略:`main` 分支开发具体项目(ErrLens),`ai_project` 分支保持为去敏的通用模板。通过 `sync-template.sh` 从 main 单向同步框架层变化到模板分支 - 决策: ~~采用双分支策略:`main` 分支开发具体项目(ErrLens),`ai_project` 分支保持为去敏的通用模板。通过 `sync-template.sh` 从 main 单向同步框架层变化到模板分支~~ 废弃原因:双分支维护成本高,容易过时。ai_project 分支在新架构升级后已严重落后于 main
- 理由: - 理由(原):
- 框架层变化需要传播到模板,但重做去敏化消耗巨大(~100K tokens - 框架层变化需要传播到模板,但重做去敏化消耗巨大(~100K tokens
- 两个分支的差异本质是"变量替换",可以脚本自动化 - 两个分支的差异本质是"变量替换",可以脚本自动化
- 框架层(AGENTS/权限/提示词/工作流)和项目层(任务/日志/代码)的边界清晰 - 框架层(AGENTS/权限/提示词/工作流)和项目层(任务/日志/代码)的边界清晰
- 影响: - 影响(原):
- 新增 `SYNC.md` 定义框架层/项目层边界 - 新增 `SYNC.md` 定义框架层/项目层边界(保留,被 ADR-013 复用)
- 新增 `sync-template.sh` 实现自动同步 - 新增 `sync-template.sh` 实现自动同步(已删除)
- 新增 `TEMPLATE.yaml` + `init.sh` 实现一键初始化 - 新增 `TEMPLATE.yaml` + `init.sh` 实现一键初始化TEMPLATE.yaml 保留,init.sh 删除)
- AI 项目框架从此可复用,token 节省 95%+ - AI 项目框架从此可复用,token 节省 95%+
## ADR-013: Skill 替代脚本 — 框架脱敏/初始化的正确方式
- 日期: 2026-05-26
- 状态: 已采纳
- 决策: 废弃 ADR-008 的「双分支 + shell 脚本」方案,改为「Skill + 配置文件」方案。框架脱敏和项目初始化由 `project-init` Skill 按需执行,不再维护独立模板分支
- 理由:
- **双分支方案的问题已被验证**ADR-008 的 ai_project 分支在新架构升级(dashboard.md / .ai/tasks/ / 归档)后严重过时,SYNC.md 和 sync-template.sh 的文件清单全是旧结构引用
- **AI 是执行者,不需要可执行脚本**:shell 脚本是给人类或 CI 用的。但当前场景中,脱敏/初始化是由 AI(Claude Code)执行的——AI 需要的是清晰的规格说明(SYNC.md + TEMPLATE.yaml + Skill 指令),而不是可执行脚本
- **Skill 方案不过时**:脚本写死了文件列表,框架一变脚本就过时。Skill 描述的是「方法」——读 SYNC.md 获取边界 → 读 TEMPLATE.yaml 获取变量 → 执行替换。框架变化时只需更新 SYNC.md,Skill 本身不变
- **零维护成本**:不再需要 sync-template.sh、init.sh、独立 Git 分支。3 个文件(SYNC.md + TEMPLATE.yaml + Skillvs 旧方案的 4 个文件 + 1 个分支
- 关键洞察:
- **「脚本优于 Skill」的前提是执行者是机器**。当执行者是 AI 时,Skill(语义描述 + 约束)优于脚本(硬编码文件列表)
- **边界定义文件(SYNC.md)是长期资产**,脚本是短期负债——脚本依赖边界定义,但边界定义不应绑定于特定的执行方式
- 影响:
- 保留 `SYNC.md`(更新为新架构文件结构)
- 保留 `TEMPLATE.yaml`(变量定义)
- 新增 `.trae/skills/project-init/SKILL.md`
- 废弃 `sync-template.sh``init.sh`
- 废弃 `ai_project` 分支(不再维护,仅保留历史参考)
## ADR-009: 人机协同数据质量闭环 ## ADR-009: 人机协同数据质量闭环
- 日期: 2026-05-26 - 日期: 2026-05-26
+8
View File
@@ -31,6 +31,14 @@
- [x] `.ai/principles.md` 新增「Arch AI 上下文资源管理」硬约束 - [x] `.ai/principles.md` 新增「Arch AI 上下文资源管理」硬约束
- [x] L-005: 上下文窗口是硬约束——盲目冲刺 = 带残缺记忆做决策 - [x] L-005: 上下文窗口是硬约束——盲目冲刺 = 带残缺记忆做决策
### 模板机制重构(ADR-013
- [x] 废弃 ADR-008 的「双分支 + shell 脚本」方案
- [x] ADR-013: Skill 替代脚本——project-init Skill 按需执行脱敏/初始化
- [x] 保留 SYNC.md(更新为新架构)、保留 TEMPLATE.yaml(变量定义)
- [x] 新增 project-init Skillexport + init 双模式)
- [x] L-006: 当 AI 是执行者时,Skill 优于 Shell 脚本
- [x] 废弃 sync-template.sh、init.sh、ai_project 分支
### 知识库变更汇总 ### 知识库变更汇总
| 文件 | 新增 | | 文件 | 新增 |
+20
View File
@@ -72,6 +72,26 @@
--- ---
## L-006: 当 AI 是执行者时,Skill 优于 Shell 脚本
**日期**: 2026-05-26
**上下文**: ADR-008 的「双分支 + sync-template.sh」模板同步方案,在新架构升级后 ai_project 分支严重过时。用户要求把脱敏模板价值提取到 main,放弃独立分支
**问题**:
- `sync-template.sh` 硬编码了旧架构的文件列表(DASHBOARD.md / ROADMAP.md / today.md / queue.md),框架一升级脚本就过时
- 维护一个独立 Git 分支的成本 > 收益:需要手动切换分支、跑脚本、处理冲突
- Shell 脚本的设计假设是「人类或 CI 执行」,但实际场景是 AI 执行。AI 不需要可执行脚本——AI 需要清晰的规格
**教训**:
1. **「用什么执行」决定「用什么描述」**。人/CI 执行 → 写脚本。AI 执行 → 写 Skill(语义描述 + 约束 + 边界定义)。Skill 描述「方法」,不会因文件路径变化而过时
2. **边界定义文件是长期资产,执行脚本是短期负债**。SYNC.md 定义了什么属于框架、什么属于项目——这个定义独立于任何执行方式。脚本绑定了执行方式,框架一变就废
3. **让 Git 做版本管理,让 Skill 做逻辑执行**。不需要为「脱敏」这个逻辑维护一个独立分支,Skill 从当前 main 实时执行脱敏,永远不过时
4. **3 文件 > 4 文件 + 1 分支**。新方案:SYNC.md + TEMPLATE.yaml + Skill。旧方案:SYNC.md + TEMPLATE.yaml + sync-template.sh + init.sh + ai_project 分支
**行动**:
- ADR-008 标记废弃,新增 ADR-013
- 废弃 sync-template.sh、init.sh、ai_project 分支
- 保留并更新 SYNC.md(框架/项目边界),新增 TEMPLATE.yaml(变量定义),新增 project-init Skill
---
## L-004: 跨平台 AI 协作下,文档是唯一的通信协议 ## L-004: 跨平台 AI 协作下,文档是唯一的通信协议
**日期**: 2026-05-26 **日期**: 2026-05-26
+107
View File
@@ -0,0 +1,107 @@
---
name: "project-init"
description: "框架脱敏/初始化:将当前项目框架层导出为通用模板,或从模板初始化新项目。用户说「导出框架」「初始化新项目」「套这个框架开新项目」时调用。"
---
# 项目框架脱敏与初始化
## 功能
将当前项目的「框架层」(AI 协作体系)与「项目层」(ErrLens 具体内容)分离。框架层可导出为通用模板,用于初始化任意新项目。
**核心逻辑**:框架是骨架(角色、权限、工作流、Skill),项目是肉(PRD、架构、代码、ADR)。同一套骨架可以长出不同的肉。
## 触发条件
- 用户说「导出框架」「脱敏」「生成模板」
- 用户说「初始化新项目」「套这个框架开新项目」「用这个骨架开个 IC 验证项目」
- 当前项目框架层有重大更新后,用户想刷新模板
## 两个模式
### Export(脱敏导出)
将当前项目框架层文件复制 → 把 ErrLens 具体值替换为 `{{变量}}` → 输出干净的模板目录。
### Init(初始化新项目)
读取模板 → 把 `{{变量}}` 替换为用户提供的新项目值 → 输出可开工的新项目目录。
## 变量定义
`TEMPLATE.yaml`。核心变量:
| 变量 | 当前值(ErrLens | 说明 |
|------|-------------------|------|
| `{{PROJECT_NAME}}` | ErrLens | 项目名 |
| `{{PROJECT_CONCEPT}}` | 学生错题本 | 核心概念 |
| `{{PROJECT_DESCRIPTION}}` | AI 驱动的学生错题整理与分析应用 | 一句话描述 |
| `{{P01_NAME}}` | P01_errlens_app | 主应用目录名 |
| `{{DATABASE_URL}}` | postgresql://.../errlens | 数据库连接 |
## 框架层 vs 项目层
`SYNC.md`。核心区分:
**框架层(导出/同步)**
- `AGENTS.md` — AI 角色+权限
- `dashboard.md` — 控制面板结构
- `DECISIONS.md` — 决策入口
- `.ai/principles.md` — 设计原则
- `.ai/config/` — AI 配置
- `.ai/prompts/` — 提示词模板
- `.ai/roles/*/card.md` — 角色身份卡
- `.ai/phases/INDEX.md` — 阶段索引
- `.ai/knowledge/patterns.md` — 可复用模式
- `.ai/knowledge/lessons.md` — 框架级教训
- `.ai/tasks/templates/` — Task 模板
- `.trae/skills/` — 全部 Skill
- `docs/使用手册.md` — 使用说明
- `ENVIRONMENT.md` — 环境结构
- `TEMPLATE.yaml` — 变量定义
- `SYNC.md` — 边界定义
**项目层(不导出,新项目自己写)**
- `.ai/tasks/active/` — 具体 task
- `.ai/phases/phase-*/goal.md, scope.md, architecture.md, decisions.md, completion.md`
- `.ai/knowledge/decisions.md` — 项目 ADR
- `.ai/knowledge/journal/` — 开发日志
- `docs/01_*/ ~ docs/06_*/` — PRD、架构设计等
- `docs/share/` — 对外分享
- `projects/` — 代码
- `reports/` — 测试报告
## 执行步骤
### Export 模式
1.`SYNC.md` 确认框架层文件清单
2.`TEMPLATE.yaml` 获取变量清单和当前值
3. 对每个框架层文件:
- 复制内容
- 将当前值(如 `ErrLens`)替换为 `{{PROJECT_NAME}}`
-`errlens` 替换为 `{{PROJECT_NAME_LOWER}}`
- 依此类推,覆盖 TEMPLATE.yaml 中所有变量
4. 输出到指定目录(默认 `../project-template/`
### Init 模式
1. 询问用户:项目名、核心概念、一句话描述
2.`TEMPLATE.yaml`,生成新值(如 `PROJECT_NAME: "ICValidator"`
3. 复制框架层文件到新项目目录
4. 将所有 `{{变量}}` 替换为新值
5. 创建项目层空目录结构(.ai/tasks/active/, .ai/phases/, docs/01_产品需求/ 等)
6. 告知用户:新项目就绪,Arch AI 可以开始写 PRD
## 注意事项
1. **框架层不包含具体业务的 ADR**。ADR-009(人机协同)是 ErrLens 特有的,不导出。ADR-007(分层架构)是框架级的,可导出
2. **Skill 本身属于框架层**,会被导出。新项目自带全套 Skill
3. **TEMPLATE.yaml 导出后变量值变为 `{{}}` 占位符**,等待 init 时填入新值
4. **脱敏检查**:export 后应人工抽查,确保没有 ErrLens 特有信息泄露到模板
---
**Version**: 1.0
**Created**: 2026-05-26
**Based On**: ADR-008(模板同步机制),废弃 ai_project 分支方案,改为 Skill 按需执行
+83
View File
@@ -0,0 +1,83 @@
# 模板同步边界定义
> 定义哪些文件属于"框架层"(跨项目复用),哪些属于"项目层"(项目特有)。
> 框架层变化通过 `sync-template.sh` 从 main 同步到 ai_project 模板分支。
---
## 规则
```
框架层 = 可以复用的结构和逻辑(同步)
项目层 = 某个具体项目的内容和数据(不同步)
```
---
## 文件分类
### 框架层(自动同步)
| 文件/目录 | 说明 |
|-----------|------|
| `AGENTS.md` | AI 角色定义 + 权限矩阵 + 工作流 + 命名规范 |
| `dashboard.md` | 控制面板结构(人类+Arch AI 入口) |
| `DECISIONS.md` | 决策入口结构 |
| `.ai/principles.md` | 架构设计原则 + Arch AI 上下文管理 |
| `.ai/config/*.json` | AI 配置(权限路径、职责定义、工作流) |
| `.ai/prompts/` | 提示词模板(架构、编码、测试) |
| `.ai/roles/README.md` | 角色工作台说明 |
| `.ai/roles/{arch,dev,qa}/card.md` | 角色身份卡(身份、权限、启动流程) |
| `.ai/phases/INDEX.md` | 阶段索引 + 切换规则 |
| `.ai/knowledge/patterns.md` | 可复用模式 |
| `.ai/knowledge/lessons.md` | 框架级经验教训 |
| `.ai/tasks/templates/` | Task 模板(Coder + Tester |
| `.trae/skills/` | Skill 定义 |
| `docs/使用手册.md` | 使用手册(框架层) |
| `ENVIRONMENT.md` | 开发环境结构(框架层) |
| `sync-template.sh` | 同步脚本本身 |
| `TEMPLATE.yaml` | 模板变量配置 |
| `init.sh` | 新项目初始化脚本 |
| `SYNC.md` | 本文档 |
### 项目层(不同步)
| 文件/目录 | 说明 |
|-----------|------|
| `.ai/tasks/active/` | 活跃 task 文件(项目特定) |
| `.ai/tasks/completed/` | 已完成 task(项目特定) |
| `.ai/phases/phase-*/goal.md` | 阶段目标(项目特定) |
| `.ai/phases/phase-*/scope.md` | 阶段范围(项目特定) |
| `.ai/phases/phase-*/architecture.md` | 架构快照(项目特定) |
| `.ai/phases/phase-*/decisions.md` | 阶段决策(项目特定) |
| `.ai/phases/phase-*/completion.md` | 完成状态(项目特定) |
| `.ai/knowledge/decisions.md` | ADR 全文(项目特定) |
| `.ai/knowledge/journal/` | 每日日志(项目特定) |
| `.ai/archive/` | 归档文件 |
| `docs/01_*/ ~ docs/06_*/` | 项目文档(PRD、架构、数据模型等) |
| `docs/share/` | 对外分享内容 |
| `projects/` | 项目代码 |
| `reports/` | 测试报告 |
| `review/` | 旧 review 流程(已废弃,由 .ai/tasks/ 替代) |
---
## 使用流程
```bash
# 1. 切换到模板分支
git checkout ai_project
# 2. 运行同步脚本
bash sync-template.sh main ai_project
# 3. 检查变更 + 提交
git diff --stat
git add -A && git commit -m "sync: 框架更新 from main"
```
## 原则
1. **脚本覆盖框架层** — 直接 checkout 无需人工判断
2. **项目层隔离** — 任务、日志、代码、决策不受影响
3. **新架构适配** — dashboard.md / DECISIONS.md / .ai/tasks/ 已纳入框架层定义
+37
View File
@@ -0,0 +1,37 @@
# ============================================================
# 项目模板变量定义
# 用于 project-init Skill 的 export/init 双向替换
# ============================================================
# --- 项目身份 ---
PROJECT_NAME: "ErrLens"
PROJECT_NAME_LOWER: "errlens"
PROJECT_CONCEPT: "学生错题本"
PROJECT_DESCRIPTION: "AI 驱动的学生错题整理与分析应用"
# --- 子项目 P01(主应用)---
P01_NAME: "P01_errlens_app"
P01_DESC: "ErrLens 主应用"
P01_FRONTEND: "Taro 4 + React 18 + TypeScript"
P01_BACKEND: "NestJS 10 + TypeScript"
# --- 子项目 P02(训练/AI---
P02_NAME: "P02_errlens_training"
P02_DESC: "ErrLens AI 训练模块"
# --- 子项目 P03(管理后台)---
P03_NAME: "P03_errlens_web"
P03_DESC: "ErrLens Web 管理后台"
# --- 阶段定义 ---
PHASE1_NAME: "基础搭建"
PHASE1_GOAL: "搭建项目骨架:协作框架、脚手架、权限体系"
PHASE2_NAME: "MVP"
PHASE2_GOAL: "实现学生错题本核心功能"
PHASE3_NAME: "功能完善"
PHASE3_GOAL: "功能迭代、多端适配、性能优化"
PHASE4_NAME: "打磨发布"
PHASE4_GOAL: "质量提升、安全审计、文档完善"
# --- 数据库 ---
DATABASE_URL: "postgresql://user:password@localhost:5432/errlens"