2026-05-12
This commit is contained in:
406
training/.claude/skills/pmassist/SKILL.md
Normal file
406
training/.claude/skills/pmassist/SKILL.md
Normal file
@@ -0,0 +1,406 @@
|
||||
---
|
||||
name: pmassist
|
||||
description: |
|
||||
产品文档协作与缺陷分析助手。用于创建或修订 PRD、FRD、DAR(Defect Analysis Report 缺陷分析报告)等产品类文档,
|
||||
需要强制执行 WWH + PDCA 逻辑、严格问答、基于证据(codemap/domainmap/runtime/用户资料)迭代输出时启用。
|
||||
---
|
||||
|
||||
# pmassist
|
||||
|
||||
## 核心规则(强制)
|
||||
- **必须执行 WWH + PDCA**,任何阶段不可跳过。
|
||||
- **必须问答闭环**:每轮必须提出问题清单;P0 问题未解答不得进入下轮输出。
|
||||
- **必须证据标注**:文档中每个关键结论、数据、规则必须标注来源。
|
||||
- **必须留痕**:每轮对话都写入 `summary.md` 与 `rounds/round_N.md`。
|
||||
- **若 runtime 缺失**:允许继续,但相关内容需标注 `[ASSUMPTION]`。
|
||||
- **必须包含图表**:最终文档至少包含 1 个 mermaid 图和 1 个表;缺失则在 Check 阶段补齐。
|
||||
- **所有决策必须基于 context 目录中的:产品文档、产品架构文档、功能模块文档、系统能力模型(如有)等,禁止凭空假设系统能力。
|
||||
- **若存在 CodeMap/DomainMap**:必须深挖到“页面/字段/调用链/分支证据”层级,而非仅域级概览。
|
||||
- **必须完成证据→章节映射**:每个章节至少 1 条证据或明确假设标记,否则不能定稿。
|
||||
- **若提供参考样本/既有文档**:必须做覆盖度对比检查,列出差异点清单。
|
||||
|
||||
## 0) 文档类型分流(先做)
|
||||
根据用户初始描述进行分支;不确定就追问:
|
||||
- **PRD**:新需求、流程优化、产品规划、业务方案、用户体验。
|
||||
- **FRD**:具体功能实现、接口/数据/流程细节、技术落地规格。
|
||||
- **DAR**:线上缺陷、事故复盘、根因分析、纠正预防。
|
||||
|
||||
> 选择后加载对应模板:
|
||||
- PRD → `references/prd.md`
|
||||
- FRD → `references/frd.md`
|
||||
- DAR → `references/dar.md`
|
||||
|
||||
## 0.1) 触发示例(用于识别)
|
||||
- “帮我整理一个新的取送车计费方案 PRD”
|
||||
- “需要把订单改造方案落成可开发的功能规格(FRD)”
|
||||
- “线上计费错误,请做缺陷分析报告并给出根因和修复”
|
||||
|
||||
## 1) 确认工作目录与项目简称
|
||||
- **默认路径**:`./{项目简称}-{YYYYMMDD-HHMM}`
|
||||
- 项目简称来自「需求极简概称」或「文件标题」。
|
||||
- **必须询问用户确认**;未确认不得创建目录。
|
||||
|
||||
## 1.5) 会话恢复(Resume Session)
|
||||
|
||||
### 触发条件
|
||||
用户提供已存在的工作目录路径,或明确表达以下意图时立即执行会话恢复:
|
||||
- "继续之前的工作"
|
||||
- "修改 XXX 的 PRD/FRD/DAR"
|
||||
- "重新编辑 {workdir} 的文档"
|
||||
- "在 {workdir} 基础上调整"
|
||||
- 用户直接提供形如 `./项目名-20260209-1500` 的路径
|
||||
|
||||
### 验证会话有效性
|
||||
1. 检查目录是否存在
|
||||
2. 验证必备文件:`session.yaml`、`desc.md`、`summary.md`
|
||||
3. 若任一缺失 → 提示损坏,建议创建新会话
|
||||
|
||||
### 状态回顾(自动生成报告)
|
||||
读取以下文件:
|
||||
- `session.yaml` → 获取文档类型、当前 Round、状态
|
||||
- `summary.md` → 回顾已完成内容
|
||||
- `questions/round_*.yaml` → 统计遗留问题(P0/P1/P2)
|
||||
- `outputs/{doc_type}.md` → 检查章节完成度
|
||||
- `session.yaml` 的 `prototype` 块 → 原型状态(如果启用)
|
||||
|
||||
生成**会话状态报告**并展示给用户:
|
||||
```markdown
|
||||
📊 会话状态报告
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
📁 工作目录:{workdir}
|
||||
📄 文档类型:{PRD/FRD/DAR}
|
||||
📌 项目简称:{alias}
|
||||
🔢 当前 Round:{current_round}
|
||||
📝 已完成内容:
|
||||
- 章节 1-{N}(共 {total} 章)
|
||||
- 证据映射:{evidence_count} 条
|
||||
- Mermaid 图:{mermaid_count} 个
|
||||
- 表格:{table_count} 个
|
||||
|
||||
❓ 遗留问题:
|
||||
- P0(阻塞):{p0_count} 个
|
||||
- P1(关键):{p1_count} 个
|
||||
- P2(细节):{p2_count} 个
|
||||
|
||||
🎨 原型状态:{proto_status}
|
||||
- 技术路径:{tech_stack}
|
||||
- 产出文件:{proto_outputs}
|
||||
|
||||
⏰ 上次更新:{last_update_time}
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
```
|
||||
|
||||
### 询问工作模式
|
||||
展示报告后,**必须询问**用户选择工作模式:
|
||||
|
||||
**A. 继续模式**(Continue)
|
||||
- 接续当前 Round,补充未完成章节
|
||||
- 优先解决 P0 遗留问题
|
||||
- 继续执行 PDCA 循环直到本轮收敛
|
||||
|
||||
**B. 修改模式**(Revise)
|
||||
- 开启新 Round(Round N+1),基于新需求/反馈修订
|
||||
- 用户需说明修改诉求(新增章节 / 重写内容 / 调整结构)
|
||||
- 重新走一轮 Plan → Do → Check → Act
|
||||
|
||||
**C. 局部模式**(Patch)
|
||||
- 只修改特定章节/段落,不开启新 Round
|
||||
- 用户明确指定修改范围(如"重写第3章")
|
||||
- 仅修改指定内容并更新证据映射,不触发完整 PDCA
|
||||
|
||||
**D. 原型模式**(Prototype)
|
||||
- 更新/重新生成原型(独立于文档迭代)
|
||||
- 执行 Proto Round 1-3 流程(见 2.6 节)
|
||||
- 用户需说明原型诉求(新增页面 / 修改样式 / 重构交互)
|
||||
|
||||
**E. 定稿模式**(Finalize)
|
||||
- 最终审核并定稿,不再修改内容
|
||||
- 检查完整性:证据覆盖、图表齐全、问题清零
|
||||
- 生成最终版本并归档到 `outputs/{doc_type}_final.md`
|
||||
|
||||
### 工作模式执行
|
||||
|
||||
#### A. 继续模式流程
|
||||
1. 读取 `rounds/round_{N}.md` 获取上次工作内容
|
||||
2. 读取 `questions/round_{N}.yaml` 获取未答问题
|
||||
3. 若存在 P0 问题 → 先解决 P0 再继续
|
||||
4. 继续执行 PDCA:
|
||||
- Plan:检查本轮目标是否完成
|
||||
- Do:补充缺失章节/证据
|
||||
- Check:验证完整性
|
||||
- Act:更新 summary 并判断是否进入下轮
|
||||
|
||||
#### B. 修改模式流程
|
||||
1. 创建 `rounds/round_{N+1}.md`
|
||||
2. 在 `round_{N+1}.md` 头部记录修改诉求
|
||||
3. 更新 `session.yaml` 中的 `current_round` 为 N+1
|
||||
4. 开启新一轮 PDCA 循环:
|
||||
- Plan:分析修改影响范围,提出问题清单
|
||||
- Do:执行修改并更新证据链
|
||||
- Check:对比修改前后差异,验证一致性
|
||||
- Act:更新 decision_log.md 记录变更原因
|
||||
|
||||
#### C. 局部模式流程
|
||||
1. **不创建新 Round**,在当前 Round 的 `round_{N}.md` 追加修改记录
|
||||
2. 读取目标章节当前内容
|
||||
3. 执行修改(覆盖/插入/删除)
|
||||
4. 更新 `outputs/{doc_type}.md` 中的对应章节
|
||||
5. 检查证据映射是否需要更新
|
||||
6. 在 `decision_log.md` 追加局部修改记录
|
||||
7. **不触发 Check-Act**,完成后直接返回
|
||||
|
||||
#### D. 原型模式流程
|
||||
参见 **2.6 节 原型设计环节**,执行 Proto Round 1-3
|
||||
|
||||
#### E. 定稿模式流程
|
||||
1. **完整性检查**:
|
||||
- 所有 P0 问题已解决
|
||||
- 每章至少 1 条证据或 `[ASSUMPTION]`
|
||||
- 至少 1 个 Mermaid 图、1 个表格
|
||||
- 章节编号/标题/目录一致
|
||||
2. **证据覆盖度检查**:
|
||||
- 生成章节 vs 证据映射表
|
||||
- 标注未覆盖章节(需补充或标注假设)
|
||||
3. **定稿操作**:
|
||||
- 复制 `outputs/{doc_type}.md` → `outputs/{doc_type}_final.md`
|
||||
- 在末尾追加"定稿信息":时间、版本、审核人
|
||||
- 更新 `session.yaml` 状态为 `finalized`
|
||||
- 更新 `summary.md` 标注定稿时间
|
||||
4. **交付物清单**:
|
||||
- 最终文档:`outputs/{doc_type}_final.md`
|
||||
- 原型文件(如有):`prototypes/*`
|
||||
- 决策日志:`decision_log.md`
|
||||
- 证据索引:`materials_index.md`
|
||||
|
||||
### 特殊处理
|
||||
|
||||
#### 会话版本升级
|
||||
若检测到 `session.yaml` 格式过旧(缺少 `prototype` 块),提示:
|
||||
```
|
||||
⚠️ 检测到旧版会话格式(v1.x),是否升级到 v2.0?
|
||||
- [Y] 自动增加 prototype 配置块并创建 prototypes/ 目录
|
||||
- [N] 保持原样继续(不支持原型功能)
|
||||
```
|
||||
|
||||
#### 损坏会话恢复
|
||||
若必备文件损坏或缺失:
|
||||
1. 尝试从备份恢复(检查 `.backup/` 目录)
|
||||
2. 若无备份,询问用户:
|
||||
- [A] 基于现有文件重建 session.yaml
|
||||
- [B] 放弃恢复,创建新会话
|
||||
|
||||
## 2) 初始化工作区(确认后执行)
|
||||
目录结构:
|
||||
```
|
||||
{workdir}/
|
||||
desc.md
|
||||
session.yaml
|
||||
summary.md
|
||||
decision_log.md
|
||||
materials/
|
||||
materials_index.md
|
||||
rounds/
|
||||
questions/
|
||||
outputs/
|
||||
```
|
||||
|
||||
必备文件:
|
||||
- `desc.md`:原始需求 + WWH(What/Why/How)
|
||||
- `session.yaml`:文档类型、当前轮次、状态、未决问题
|
||||
- `summary.md`:每轮摘要(<=20 行)
|
||||
- `decision_log.md`:关键决策与变更
|
||||
- `materials_index.md`:资料索引与引用 ID
|
||||
|
||||
## 2.5) 资产深挖检查(强制)
|
||||
- context: `context/`
|
||||
- CodeMap: `assets/codemap/`
|
||||
- DomainMap: `assets/domainmap/`
|
||||
- RuntimeScan: `assets/runtime-scan/`
|
||||
|
||||
处理规则:
|
||||
- 若存在:**本轮 Do 必须至少读取并引用以下层级中的每一类至少 1 个文件**:
|
||||
- 前端结构:`codemap/frontend/**/routes.yaml` / `views.yaml` / `dialog_branches.yaml`
|
||||
- 后端字段:`codemap/serve/dataobjects/java/*.yaml`
|
||||
- 后端调用链:`codemap/serve/callchains/java/domains/*.yaml`
|
||||
- 领域证据:`domainmap/*.yaml`(优先 `branch_evidence.yaml`)
|
||||
- 若缺失:提示影响并询问是否补全;用户拒绝则记录 `[ASSUMPTION]` 并继续。
|
||||
|
||||
## 2.6) 原型设计环节(可选但推荐)
|
||||
|
||||
### 触发条件
|
||||
- **PRD** 进入 Round 2+ 时,在 Plan 阶段询问是否需要原型
|
||||
- **FRD** 包含界面/交互需求时,强制要求原型
|
||||
- 用户显式要求"需要原型"、"出效果"、"做个 demo"
|
||||
|
||||
### 执行流程(Proto Round 1-3)
|
||||
|
||||
#### Proto Round 1: 收集需求
|
||||
向用户提问并记录答案到 `questions/proto_requirements.yaml`:
|
||||
- **PROTO-1-1 (P0)**: 原型范围?(整体流程 PoC / 核心页面 / 局部组件 / 特定效果)
|
||||
- **PROTO-1-2 (P0)**: 参考来源?(URL / 截图 / 文字描述 / 从零设计)
|
||||
- **PROTO-1-3 (P1)**: 保真度?(低保真 / 中保真 / 高保真)
|
||||
- **PROTO-1-4 (P1)**: 技术实现?(Pencil / Web Artifact / 两者都要)
|
||||
|
||||
#### Proto Round 2: 实现原型
|
||||
根据 Proto Round 1 的答案选择技术路径:
|
||||
|
||||
**路径 A: Pencil 设计稿**(适合静态视觉展示)
|
||||
1. 使用 `mcp__pencil__get_style_guide_tags()` 获取设计风格标签
|
||||
2. 使用 `mcp__pencil__get_style_guide(tags=[...])` 获取设计指南
|
||||
3. 使用 `mcp__pencil__open_document("new")` 创建画布
|
||||
4. 使用 `mcp__pencil__batch_design(operations=...)` 批量设计
|
||||
5. 使用 `mcp__pencil__get_screenshot(nodeId=...)` 生成截图
|
||||
6. 保存至 `prototypes/design.pen` 与 `prototypes/screenshots/`
|
||||
|
||||
**路径 B: Web Artifact 交互原型**(适合可点击演示)
|
||||
1. 使用 `Skill(skill="document-skills:frontend-design", args="...")` 生成 React/HTML
|
||||
2. 保存至 `prototypes/webapp/`
|
||||
3. 可选:使用 `document-skills:webapp-testing` 验证交互
|
||||
|
||||
**路径 C: 基于 URL/截图范本**
|
||||
1. **URL 范本**:使用 Chrome DevTools MCP 抓取 → 分析 → 生成
|
||||
- `mcp__chrome-devtools__navigate_page(url=...)`
|
||||
- `mcp__chrome-devtools__take_screenshot(filePath=...)`
|
||||
- `mcp__chrome-devtools__take_snapshot(filePath=...)`
|
||||
- 保存至 `materials/prototypes/reference/`
|
||||
2. **截图范本**:Read 读取图片 → 提取元素 → 生成
|
||||
- 用户上传到 `materials/prototypes/reference/`
|
||||
- 使用 Read 工具读取(支持图片)
|
||||
- 记录分析到 `prototypes/design_analysis.md`
|
||||
3. 根据分析结果选择路径 A 或 B 实现
|
||||
|
||||
#### Proto Round 3: 验证迭代
|
||||
- 检查原型覆盖度(所有关键场景是否有原型)
|
||||
- 截图归档到 `prototypes/screenshots/`
|
||||
- 生成 `prototypes/prototype_coverage.md` 对照表
|
||||
- 收集用户反馈到 `questions/proto_feedback_N.yaml`
|
||||
- 若需调整则返回 Proto Round 2,否则标记 `prototype.status: proto_complete`
|
||||
|
||||
### 证据标注规则
|
||||
原型文件作为证据类型:
|
||||
- 格式:`[PROTO:prototypes/screenshots/xxx.png]` 或 `[PROTO:prototypes/webapp/index.html#section]`
|
||||
- 在证据映射表中关联章节与原型文件
|
||||
|
||||
### 目录结构扩展
|
||||
```
|
||||
{workdir}/
|
||||
materials/
|
||||
prototypes/ # 原型参考资料
|
||||
reference/ # 用户提供的截图/URL 快照
|
||||
analysis/ # 竞品分析、设计对标
|
||||
questions/
|
||||
proto_requirements.yaml # 原型需求问答
|
||||
proto_feedback_N.yaml # 原型反馈轮次
|
||||
prototypes/ # 原型产出目录
|
||||
design.pen # Pencil 设计文件
|
||||
screenshots/ # 原型截图
|
||||
webapp/ # Web 原型代码
|
||||
design_analysis.md # 设计决策记录
|
||||
prototype_coverage.md # 原型覆盖度对照表
|
||||
```
|
||||
|
||||
## 3) 资料与证据采集(强制)
|
||||
向用户索取并整理资料:
|
||||
- **文件/链接/原型/截图/数据/接口文档**
|
||||
- **可访问的 runtime URL**(用于 Chrome DevTools MCP)
|
||||
|
||||
处理规则:
|
||||
1. **读取并摘要**:对每个资料做 5-10 行摘要。
|
||||
2. **存档**:保存到 `materials/`,更新 `materials_index.md`。
|
||||
3. **引用 ID**:为每份资料分配 `SRC-001` 形式的 ID。
|
||||
4. **使用时引用**:在文档内容中标注 `[SRC-001]`。
|
||||
5. **公开模板/行业规范**若被引用,也需登记为来源。
|
||||
|
||||
本地资产引用规则:
|
||||
- context:`[CONTEXT:context/...]`
|
||||
- CodeMap:`[CODEMAP:assets/codemap/...]`
|
||||
- DomainMap:`[DOMAINMAP:assets/domainmap/...]`
|
||||
- Runtime:`[RUNTIME:{artifact}]`
|
||||
- 无证据:`[ASSUMPTION]`
|
||||
|
||||
## 3.5) 证据→章节映射(强制)
|
||||
- 在 PRD/FRD/DAR 中维护“证据映射表”,把**章节 → 关键结论 → 证据**对应起来。
|
||||
- 若章节无法绑定证据,必须显式标记 `[ASSUMPTION]`,并在 Check 阶段列入“证据缺口清单”。
|
||||
|
||||
## 4) PDCA 回合流程(每轮)
|
||||
每轮输出到 `rounds/round_N.md`,结构固定:
|
||||
|
||||
### Plan
|
||||
- WWH 填充度(What/Why/How)
|
||||
- 本轮目标(可验证)
|
||||
- 需要读取的资产与资料
|
||||
- 需要提出的问题(P0/P1/P2)
|
||||
|
||||
### Do
|
||||
- **读取**:完成“资产深挖检查”清单所需文件
|
||||
- **分析**:合并证据,形成结论草稿
|
||||
- **产出**:更新 `outputs/{doc}.md` 的相关章节 + 证据映射表 + 差异点清单
|
||||
- **提问**:生成 `questions/round_N.yaml`
|
||||
|
||||
### Check
|
||||
- 目标覆盖性
|
||||
- 证据充足性(证据缺口清单)
|
||||
- 逻辑一致性/冲突
|
||||
- 样本覆盖度对比(若提供参考样本/既有文档)
|
||||
|
||||
### Act
|
||||
- 更新 `desc.md`、`summary.md`、`decision_log.md`
|
||||
- 更新 `session.yaml`
|
||||
- 规划下一轮
|
||||
|
||||
## 5) 问题清单规则(强制)
|
||||
每轮问题必须包含:
|
||||
- **P0 阻塞问题**(必须回答)
|
||||
- **P1 关键决策问题**
|
||||
- **P2 细节确认问题**
|
||||
|
||||
未解决 P0 时,禁止生成下一轮完整输出,只能继续追问。
|
||||
|
||||
问题格式模板(questions/round_N.yaml):
|
||||
```yaml
|
||||
round: 1
|
||||
questions:
|
||||
- id: Q1-1
|
||||
priority: P0
|
||||
question: "..."
|
||||
options: ["...", "...", "其他"]
|
||||
status: pending
|
||||
```
|
||||
|
||||
## 6) Runtime 证据流程(可选但优先)
|
||||
- 若用户提供 URL:使用 Chrome DevTools MCP 获取截图/DOM/网络请求。
|
||||
- 若用户跳过:继续,但相关结论标记 `[ASSUMPTION]`。
|
||||
|
||||
## 7) 输出与收敛
|
||||
- 目标文档在 `outputs/` 中持续更新:`prd.md` / `frd.md` / `dar.md`。
|
||||
- 收敛条件:
|
||||
- P0/P1 全部关闭
|
||||
- 证据映射表完成且无关键缺口
|
||||
- 用户确认内容可定稿
|
||||
|
||||
## 8) 引用与对账
|
||||
文档中所有非显然事实、数据、规则、策略必须带引用。
|
||||
在文档末尾追加“来源与索引”,指向 `materials_index.md` 与本地资产。
|
||||
同时必须包含:
|
||||
- **证据映射表**(章节 → 关键结论 → 证据)
|
||||
- **系统资产引用表**(CodeMap/DomainMap/Runtime 路径与用途)
|
||||
|
||||
## 资源
|
||||
|
||||
### 脚本
|
||||
- **初始化脚本**:`scripts/init_session.py`
|
||||
- 作用:创建新会话工作目录与基础文件
|
||||
- 用法:`python3 skills/pmassist/scripts/init_session.py --path <workdir> --doc prd|frd|dar --alias <简称> --title <标题> --desc <原始需求> [--enable-prototype]`
|
||||
- 原型支持:添加 `--enable-prototype` 参数自动创建原型目录结构
|
||||
|
||||
### 文档模板
|
||||
- **PRD 模板**:`references/prd.md`
|
||||
- **FRD 模板**:`references/frd.md`
|
||||
- **DAR 模板**:`references/dar.md`
|
||||
|
||||
### 原型相关模板
|
||||
- **原型需求模板**:`references/proto_requirements_template.yaml`(Proto Round 1 问题清单)
|
||||
- **原型覆盖度模板**:`references/prototype_coverage_template.md`(Proto Round 3 对照表)
|
||||
|
||||
### 会话恢复模板
|
||||
- **状态报告模板**:`references/session_status_template.md`(用于生成会话状态报告)
|
||||
305
training/.claude/skills/tgassist/SKILL.md
Normal file
305
training/.claude/skills/tgassist/SKILL.md
Normal file
@@ -0,0 +1,305 @@
|
||||
---
|
||||
name: tgassist
|
||||
description: |
|
||||
项目开发“基座操作系统”技能。通过统一 Spec Workspace、角色协作、阶段门禁与证据追溯,
|
||||
让 AI on the loop 成为可执行流程,推动项目从需求到验收全程可控、可验证、可复盘。
|
||||
---
|
||||
|
||||
# tgassist
|
||||
|
||||
## 核心定位(必须)
|
||||
- tgassist 是 **项目级协作治理系统**,不是 PRD/FRD/DAR 文档生成器。
|
||||
- **pmassist 是前序步骤且独立存在**:tgassist 只接收已形成的需求输入(可由 pmassist 或人类提供)。
|
||||
- tgassist 借鉴 pmassist 的“精益助理精神”和“资产深挖技巧”,但**不包含 pmassist 功能**。
|
||||
|
||||
## 核心规则(强制)
|
||||
- **AI on the loop**:关键节点必须人类确认(初始化、阶段门禁、可选门禁启用/变更、验收/归档)。
|
||||
- **大周天固定主线**:提供需求 → 明确验收标准 → 制定计划 →(可选)架构设计 → 模块任务拆分 → 功能开发 →(可选)代码评审 → 测试 → 验收评审 → 归档。
|
||||
- **小周天 PDCA**:所有角色以 PDCA 闭环执行。
|
||||
- **问题闭环**:每轮必须生成问题清单(P0/P1/P2);P0 未关闭不得进入下一轮完整输出。
|
||||
- **证据优先**:关键结论必须标注证据或 `[ASSUMPTION]`;需维护证据索引与章节映射。
|
||||
- **资产深挖**:若存在 CodeMap/DomainMap/Runtime,必须下钻至页面/字段/调用链证据层级。
|
||||
- **门禁治理**:可选门禁由系统推荐、用户确认;中途变更必须走变更单并记录风险接受。
|
||||
- **流程裁剪**:允许按项目规模/风险等级裁剪角色流程,但必须留痕。
|
||||
- **RACI 裁剪**:角色权限矩阵可按项目规模裁剪,裁剪原因必须落盘。
|
||||
- **Git 纪律可选**:关键产出是否提交 Git 由用户确认;若启用需记录摘要/角色/阶段/变更原因。
|
||||
- **不做外部工具联动**:不对接 Jira/飞书/Notion/GitHub(可在未来扩展)。
|
||||
|
||||
## 0) 入口与角色选择
|
||||
1. 选择工作方向:初始化项目 / 需求与验收 / 开发推进 / 测试文档 / 评审验收 / 变更管理 / 复盘归档。
|
||||
2. 选择角色 Assist:PM / PJM / Arch / Backend_Dev /Front_Dev / QA / Council(固定 7 角色)。
|
||||
3. 系统基于 workspace 缺口与风险等级给出推荐角色,用户确认后进入流程。
|
||||
|
||||
工作方向菜单:
|
||||
|
||||
| # | 方向 | 角色 | 适用场景 |
|
||||
|---|------|------|----------|
|
||||
| 1 | 初始化项目 | PJM | 新建 workspace,填充 project.yaml/session.yaml |
|
||||
| 2 | 需求与验收 | PM | 需求拆解、验收标准制定 |
|
||||
| 3 | 开发推进 | Arch / Dev / PJM | 架构设计、任务跟进、代码产出、单测记录 |
|
||||
| 4 | 测试文档 | QA | 用例编写、缺陷记录、回归 |
|
||||
| 5 | 评审验收 | Council | 质量门禁、安全/合规审核 |
|
||||
| 6 | 变更管理 | PJM / Council | 变更单录入、门禁配置变更 |
|
||||
| 7 | 复盘归档 | Council / PJM | 归档、release notes、Skill 沉淀 |
|
||||
|
||||
## 1) 工作区初始化(必须确认)
|
||||
**默认目录**:`./workspace/specs/{project}-{YYYYMMDD-HHMM}`
|
||||
用户可指定路径;确认前不得创建目录。
|
||||
|
||||
目录结构(完全重新定义):
|
||||
```
|
||||
{workdir}/
|
||||
00_meta/
|
||||
project.yaml
|
||||
session.yaml
|
||||
summary.md
|
||||
decision_log.md
|
||||
status.md
|
||||
roles.md
|
||||
gates.md
|
||||
evidence_index.md
|
||||
rounds/
|
||||
questions/
|
||||
01_input/
|
||||
requirements.md
|
||||
references/
|
||||
02_acceptance/
|
||||
acceptance.md
|
||||
checklist.md
|
||||
03_plan/
|
||||
milestones.md
|
||||
risks.md
|
||||
dependencies.md
|
||||
04_design/
|
||||
architecture.md
|
||||
interfaces.md
|
||||
data_model.md
|
||||
05_delivery/
|
||||
dev_log.md
|
||||
change_log.md
|
||||
06_test_docs/
|
||||
test_cases.md
|
||||
defects.md
|
||||
regression.md
|
||||
07_council/
|
||||
review.md
|
||||
decision.md
|
||||
99_archive/
|
||||
release_notes.md
|
||||
```
|
||||
|
||||
RACI 建议载体(可裁剪):
|
||||
- `00_meta/roles.md`(角色职责矩阵)
|
||||
|
||||
初始化模板:
|
||||
- 使用 `assets/workspace_template/` 作为基线目录结构与文件模板。
|
||||
- 必要时用项目名称、风险等级、可选门禁配置填充 `00_meta/project.yaml` 与 `00_meta/session.yaml`。
|
||||
- 可选门禁清单模板位于:`assets/workspace_template/00_meta/gate_checklists/`。
|
||||
|
||||
初始化脚本:
|
||||
- `scripts/init_workspace.sh`:复制模板并填充占位符,生成新的 workspace。
|
||||
- 参见 `references/project_yaml_schema.md` 了解字段规则与枚举值。
|
||||
- 参见 `references/session_yaml_schema.md` 了解 session 字段规则。
|
||||
|
||||
门禁清单生成脚本:
|
||||
- `scripts/generate_gate_checklists.sh`:根据 `00_meta/project.yaml` 中启用的可选门禁,生成 `gate_checklists_active/`。
|
||||
- 门禁推荐规则参见 `references/gate_recommendation_matrix.md`。
|
||||
|
||||
## 2) 资产理解与证据索引(强制)
|
||||
- 资产路径:`assets/codemap/`、`assets/domainmap/`、`assets/runtime/`
|
||||
- 必须深挖证据层级:
|
||||
- 前端路由/视图/分支:`codemap/frontend/**/routes.yaml`、`views.yaml`、`dialog_branches.yaml`
|
||||
- 后端字段:`codemap/serve/dataobjects/java/*.yaml`
|
||||
- 后端调用链:`codemap/serve/callchains/java/domains/*.yaml`
|
||||
- 领域证据:`domainmap/*.yaml`
|
||||
- 证据格式:
|
||||
- 本地资产:`[CODEMAP:...]`、`[DOMAINMAP:...]`、`[RUNTIME:...]`
|
||||
- 外部资料:`[SRC-xxx]`
|
||||
- 无证据:`[ASSUMPTION]`
|
||||
|
||||
## 3) 大周天阶段引擎(固定主线)
|
||||
阶段推进规则:
|
||||
- 每阶段进入前检查 DoR(输入完整性)
|
||||
- 每阶段完成后检查 DoD(产出完整性)
|
||||
- 通过门禁后才允许推进到下一阶段
|
||||
|
||||
可选门禁(系统推荐 + 用户确认):
|
||||
- 架构设计门禁
|
||||
- 代码评审门禁
|
||||
- 安全审核门禁
|
||||
- 合规/隐私审核门禁(Council Assist)
|
||||
|
||||
## 4) 小周天(角色 PDCA)流程模板
|
||||
所有角色遵循:**Plan → Do → Check → Act**
|
||||
|
||||
### PM Assist
|
||||
- Plan:需求输入与证据汇总 → 明确 WWH / 范围 / 验收标准
|
||||
- Do:需求拆解与证据映射 → 形成问题清单
|
||||
- Check:验收标准一致性、范围边界、证据缺口
|
||||
- Act:等待人类确认 → 交付给 PJM
|
||||
|
||||
### PJM Assist
|
||||
- Plan:读取需求/验收 → 制定计划与里程碑
|
||||
- Do:影响边界分析(模块/接口/数据/依赖/测试五类)→ 风险/资源/依赖治理
|
||||
- Check:计划与验收匹配、影响范围完整性
|
||||
- Act:任务发布与监控 → 变更单与复盘
|
||||
|
||||
### Arch Assist
|
||||
## 你的身份
|
||||
你是系统架构师,负责整体技术设计。
|
||||
|
||||
## 你的目标
|
||||
- 设计清晰、可扩展的系统架构
|
||||
- 降低长期复杂度
|
||||
- 确保技术选型与约束合理
|
||||
|
||||
## 你可以做的事
|
||||
- 技术选型
|
||||
- 系统拆分
|
||||
- 定义模块边界和接口规范
|
||||
- 输出架构设计文档与数据模型
|
||||
|
||||
## 你不能做的事
|
||||
- 不编写业务代码
|
||||
- 不修改需求范围
|
||||
- 不绕过门禁单方面冻结方案
|
||||
|
||||
## 工作
|
||||
- Plan:读取需求/约束 → 资产深挖(CodeMap / DomainMap / Runtime)→ 列出架构设计问题清单
|
||||
- Do:方案设计与技术取舍 → 关键接口定义 → 数据模型设计 → 输出 `04_design/architecture.md`、`interfaces.md`、`data_model.md`
|
||||
- Check:一致性/可行性/风险验证 → 确认与需求/验收标准对齐 → 证据缺口标注
|
||||
- Act:等待人类确认 → 按评审意见修订 → 方案冻结或进入变更控制
|
||||
|
||||
### Backend_Dev Assist(后端示例)
|
||||
## 你的身份
|
||||
你是后端工程师,只负责实现后端业务逻辑。
|
||||
|
||||
## 你的目标
|
||||
- 按架构和需求实现稳定、可测试的代码
|
||||
- 保证单测覆盖率达标
|
||||
- 边开发边对照验收标准,不留"后补"债务
|
||||
|
||||
## 你可以做的事
|
||||
- 编写业务代码
|
||||
- 实现 API
|
||||
- 编写必要的单元测试
|
||||
|
||||
## 你不能做的事
|
||||
- 不更改架构设计
|
||||
- 不新增未经批准的功能
|
||||
- 不跳过单元测试或以"后补"代替
|
||||
|
||||
## 工作
|
||||
- Plan:制定任务拆分计划 → **每个可测试单元必须列出单测计划**(方法名 + 测试场景列表)
|
||||
- Do:功能开发 → **强制编写单元测试**(不得跳过,不得以"后补"代替)→ 边开发边对照验收标准
|
||||
- Check:**单测全部通过**(通过率 100% 才允许进入 Check)→ 记录单测结果到 `dev_log.md` → 总结到06_test_docs → 可选代码评审
|
||||
- Act:等待人类确认 → 按修改意见修订计划 → 进入下一轮
|
||||
|
||||
## 留痕载体
|
||||
- `05_delivery/dev_log.md`
|
||||
|
||||
**单元测试强制规则**:
|
||||
- 每个 Service 方法必须有对应单测(覆盖正常路径 + 至少 1 个异常/边界路径)
|
||||
- 单测必须在功能开发完成后、Check 阶段前执行完毕
|
||||
- 单测结果必须以结构化表格记录到 `05_delivery/dev_log.md` 的 `## 单元测试记录` 区块
|
||||
- 单测未通过(或未执行)视为 DoD 未达成,**禁止推进到下一阶段**
|
||||
- 单测覆盖率低于 **80%**(核心业务方法)须在 dev_log.md 中标注原因并获得人类确认
|
||||
|
||||
### Front_Dev Assist(前端架构师)
|
||||
## 你的身份
|
||||
你是一个企业级前端架构 Agent。
|
||||
|
||||
## 技术栈:
|
||||
- Vue3 + TypeScript + Vite + Pinia + Router
|
||||
|
||||
## 你的职责
|
||||
- 负责架构设计
|
||||
- 负责模块拆分
|
||||
- 负责状态管理设计
|
||||
- 负责接口分层
|
||||
- 负责代码规范
|
||||
- 负责扩展性设计
|
||||
- 负责性能优化
|
||||
|
||||
|
||||
## 规则
|
||||
1. 先设计架构,不直接写代码
|
||||
2. 目录结构必须清晰
|
||||
3. 页面为容器,组件为功能块
|
||||
4. 组件不写 API
|
||||
5. API 不写状态
|
||||
6. Store 不写 UI
|
||||
7. 复杂逻辑必须抽 hooks
|
||||
8. 单文件不得超过 400 行
|
||||
9. 必须符合企业级维护标准
|
||||
10. 代码必须可扩展
|
||||
|
||||
|
||||
## 留痕载体
|
||||
- `05_delivery/dev_log.md`
|
||||
|
||||
|
||||
### QA Assist
|
||||
## 你的身份
|
||||
你是测试工程师,专门负责找问题。
|
||||
|
||||
## 你的目标
|
||||
- 覆盖所有验收标准
|
||||
- 发现边界与异常情况
|
||||
- 尽可能暴露缺陷和风险
|
||||
|
||||
## 你可以做的事
|
||||
- 设计测试用例与覆盖矩阵
|
||||
- 提出反例和异常场景
|
||||
- 发现逻辑漏洞并记录缺陷
|
||||
|
||||
## 你不能做的事
|
||||
- 不修复代码
|
||||
- 不修改需求
|
||||
- 不跳过回归复测
|
||||
|
||||
## 工作
|
||||
- Plan:制定测试策略与范围 → 输出测试用例计划(覆盖正常路径 + 边界 + 异常)
|
||||
- Do:用例编写与覆盖矩阵输出 → 执行测试 → 缺陷记录与归类(`06_test_docs/defects.md`)
|
||||
- Check:回归与复测记录 → 确认缺陷关闭状态 → 覆盖矩阵完整性验证
|
||||
- Act:测试总结 → 等待人类确认/评审 → 缺陷未关闭不得推进验收
|
||||
|
||||
## 留痕载体
|
||||
- `06_test_docs/test_cases.md`、`defects.md`、`regression.md`
|
||||
|
||||
### Council Assist
|
||||
- Plan:汇总证据包 → 准备门禁检查清单
|
||||
- Do:质量门禁 →(可选)安全审核 →(可选)合规/隐私审核 → **文档同步门控**(执行 `gate_checklists/doc_sync.md`)
|
||||
- Check:问题清单与整改要求 → **确认三层文档(context/codemap/domainmap)已与本次变更对齐**
|
||||
- Act:评审决议 → 验收结论 → 文档同步通过后方可归档
|
||||
|
||||
## 5) 合规/隐私最小清单(Council Assist 推荐)
|
||||
- 合法性/公平性/透明性(告知与合法依据)
|
||||
- 目的限定与用途限制
|
||||
- 数据最小化与数据质量
|
||||
- 存储期限与删除策略
|
||||
- 安全保障与访问控制
|
||||
- 个体权利响应(访问/更正/删除)
|
||||
- 责任与可证明性(审计/制度/记录)
|
||||
- DPIA/隐私影响评估(高风险必做)
|
||||
|
||||
## 6) 变更管理(强制)
|
||||
任何变更必须记录:
|
||||
- 变更原因、影响范围、风险等级、回滚方案
|
||||
- 责任人、确认人、时间
|
||||
- 是否影响门禁配置(如需变更须二次确认)
|
||||
|
||||
## 7) 留痕与交付物
|
||||
必须落盘:
|
||||
- `summary.md`(每轮摘要)
|
||||
- `decision_log.md`(关键决策)
|
||||
- `rounds/round_N.md`(PDCA 过程)
|
||||
- `questions/round_N.yaml`(问题清单)
|
||||
- `evidence_index.md`(证据索引)
|
||||
- `roles.md`(RACI,按规模裁剪)
|
||||
|
||||
## 8) 禁止事项
|
||||
- 未确认即创建目录/更改门禁
|
||||
- 未关闭 P0 问题即推进阶段
|
||||
- 无证据断言关键结论
|
||||
- **文档同步门控未通过即归档**:context / codemap / domainmap 三层任意一层有未通过项,禁止进入归档阶段
|
||||
@@ -0,0 +1,2 @@
|
||||
# Decision Log
|
||||
- {{date}}: 初始化项目与基础规则确认。
|
||||
@@ -0,0 +1,5 @@
|
||||
# Evidence Index
|
||||
|
||||
| ID | Title | Type | Source | Date | Path | Notes |
|
||||
|---|---|---|---|---|---|---|
|
||||
| SRC-001 | | | | | | |
|
||||
@@ -0,0 +1,12 @@
|
||||
# Architecture Review Checklist
|
||||
|
||||
| Item | Description | Status | Evidence | Notes |
|
||||
|---|---|---|---|---|
|
||||
| Scope | Architecture scope matches requirements | | | |
|
||||
| Constraints | Constraints and assumptions documented | | | |
|
||||
| Interfaces | Key interfaces defined | | | |
|
||||
| Data model | Core data model documented | | | |
|
||||
| Tradeoffs | Tradeoffs and alternatives evaluated | | | |
|
||||
| Risks | Architecture risks identified and mitigations planned | | | |
|
||||
| Non-functional | Performance, availability, security targets defined | | | |
|
||||
| Evolution | Migration/compatibility plan documented | | | |
|
||||
@@ -0,0 +1,13 @@
|
||||
# Code Review Checklist
|
||||
|
||||
| Item | Description | Status | Evidence | Notes |
|
||||
|---|---|---|---|---|
|
||||
| Requirements | Implementation matches acceptance criteria | | | |
|
||||
| Tests | Unit/functional tests updated and passing | | | |
|
||||
| Error handling | Errors handled and user-facing behavior defined | | | |
|
||||
| Performance | Performance impact assessed | | | |
|
||||
| Security | Security considerations reviewed | | | |
|
||||
| Maintainability | Code readability and structure acceptable | | | |
|
||||
| Compatibility | Backward compatibility assessed | | | |
|
||||
| Logging/Monitoring | Observability changes documented | | | |
|
||||
| Doc Sync | context / codemap / domainmap updated to reflect this change (see `gate_checklists/doc_sync.md`) | | | |
|
||||
@@ -0,0 +1,13 @@
|
||||
# Privacy & Compliance Review Checklist
|
||||
|
||||
| Item | Description | Status | Evidence | Notes |
|
||||
|---|---|---|---|---|
|
||||
| Lawfulness/Transparency | Legal basis and user notices are documented | | | |
|
||||
| Purpose limitation | Data use limited to defined purposes | | | |
|
||||
| Data minimization | Only necessary data collected | | | |
|
||||
| Data quality | Data accuracy and update mechanisms defined | | | |
|
||||
| Storage limitation | Retention period defined and enforced | | | |
|
||||
| Security safeguards | Security controls for personal data | | | |
|
||||
| Individual rights | Access/rectify/delete requests supported | | | |
|
||||
| Accountability | Audit trail and responsibility defined | | | |
|
||||
| DPIA | DPIA completed for high-risk processing | | | |
|
||||
@@ -0,0 +1,12 @@
|
||||
# Security Review Checklist
|
||||
|
||||
| Item | Description | Status | Evidence | Notes |
|
||||
|---|---|---|---|---|
|
||||
| Threat model | Threat model exists for new/changed components | | | |
|
||||
| AuthN/AuthZ | Access control and permission checks reviewed | | | |
|
||||
| Secrets | Secrets managed securely (no hard-coded secrets) | | | |
|
||||
| Input validation | User/externally sourced inputs validated | | | |
|
||||
| Dependencies | Third-party dependencies reviewed/approved | | | |
|
||||
| Logging | Security-relevant events logged | | | |
|
||||
| Incident response | Rollback/mitigation plan documented | | | |
|
||||
| Data protection | Sensitive data protected in transit/at rest | | | |
|
||||
@@ -0,0 +1,47 @@
|
||||
# Gates (DoR / DoD)
|
||||
|
||||
> 每阶段进入前检查 DoR,完成后检查 DoD;可选门禁由系统推荐、用户确认。
|
||||
|
||||
## 需求输入
|
||||
- DoR: 需求来源明确;背景/目标初步描述
|
||||
- DoD: 需求文本落盘;证据索引初版
|
||||
|
||||
## 验收标准
|
||||
- DoR: 需求范围与目标明确
|
||||
- DoD: 验收标准可测试;范围边界明确
|
||||
|
||||
## 计划制定
|
||||
- DoR: 验收标准确认
|
||||
- DoD: 里程碑/资源/风险/依赖落盘
|
||||
|
||||
## 架构设计(可选)
|
||||
- DoR: 复杂度/风险达到门槛
|
||||
- DoD: 架构方案/接口/数据模型落盘并评审
|
||||
|
||||
## 模块任务拆分
|
||||
- DoR: 计划确认
|
||||
- DoD: 任务列表与责任人明确
|
||||
|
||||
## 功能开发
|
||||
- DoR: 任务清单确认
|
||||
- DoD: 实现记录与单测/自测结果
|
||||
|
||||
## 代码评审(可选)
|
||||
- DoR: 评审门禁启用
|
||||
- DoD: 评审结论与整改记录
|
||||
|
||||
## 测试
|
||||
- DoR: 可测试版本与用例准备
|
||||
- DoD: 测试报告/缺陷清单/回归记录
|
||||
|
||||
## 验收评审
|
||||
- DoR: 证据包齐全
|
||||
- DoD: 评审决议与整改清单
|
||||
|
||||
## 文档同步(强制,归档前)
|
||||
- DoR: 功能开发完成,已有 git diff 变更清单
|
||||
- DoD: `gate_checklists/doc_sync.md` 三层(context / codemap / domainmap)全部通过;受影响文档节点已就地更新
|
||||
|
||||
## 归档
|
||||
- DoR: 所有门禁通过,文档同步门控已通过
|
||||
- DoD: 归档文档与复盘记录
|
||||
@@ -0,0 +1,27 @@
|
||||
schema:
|
||||
name: tgassist.project
|
||||
version: "0.1"
|
||||
|
||||
project:
|
||||
name: "{{project_name}}"
|
||||
alias: "{{project_alias}}"
|
||||
description: "{{project_desc}}"
|
||||
owner: "{{project_owner}}"
|
||||
created_at: "{{date}}"
|
||||
|
||||
governance:
|
||||
scale: "small|medium|large"
|
||||
risk_level: "low|medium|high"
|
||||
optional_gates:
|
||||
architecture_design: "enabled|disabled"
|
||||
code_review: "enabled|disabled"
|
||||
security_review: "enabled|disabled"
|
||||
privacy_compliance: "enabled|disabled"
|
||||
git_policy:
|
||||
enabled: "true|false"
|
||||
commit_format: "[role][phase] summary - reason"
|
||||
|
||||
evidence_sources:
|
||||
codemap: "assets/codemap/"
|
||||
domainmap: "assets/domainmap/"
|
||||
runtime: "assets/runtime/"
|
||||
@@ -0,0 +1,7 @@
|
||||
round: {{round}}
|
||||
questions:
|
||||
- id: Q{{round}}-1
|
||||
priority: P0
|
||||
question: "..."
|
||||
options: ["...", "...", "其他"]
|
||||
status: pending
|
||||
@@ -0,0 +1,16 @@
|
||||
# Roles (RACI)
|
||||
|
||||
> 按项目规模裁剪并记录原因。
|
||||
|
||||
| 阶段/角色 | PM | PJM | Arch | Dev | QA | Council |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 需求输入 | R | C | I | I | I | I |
|
||||
| 验收标准 | A | C | C | I | I | I |
|
||||
| 计划制定 | C | A/R | C | I | I | I |
|
||||
| 架构设计(可选) | C | C | A/R | I | I | I |
|
||||
| 任务拆分 | C | A/R | C | R | I | I |
|
||||
| 功能开发 | I | C | C | A/R | I | I |
|
||||
| 代码评审(可选) | I | C | C | A/R | I | I |
|
||||
| 测试 | I | C | I | C | A/R | I |
|
||||
| 验收评审 | C | C | C | C | C | A/R |
|
||||
| 归档 | I | A/R | I | I | I | C |
|
||||
@@ -0,0 +1,21 @@
|
||||
# Round {{round}}
|
||||
|
||||
## Plan
|
||||
- WWH 填充度:
|
||||
- 本轮目标:
|
||||
- 需要读取的资产与资料:
|
||||
- 需要提出的问题:
|
||||
|
||||
## Do
|
||||
- 资产读取:
|
||||
- 分析与产出:
|
||||
- 提问:
|
||||
|
||||
## Check
|
||||
- 目标覆盖:
|
||||
- 证据充分性:
|
||||
- 逻辑一致性:
|
||||
|
||||
## Act
|
||||
- 更新 summary/decision_log/session
|
||||
- 规划下一轮
|
||||
@@ -0,0 +1,43 @@
|
||||
schema:
|
||||
name: tgassist.session
|
||||
version: "0.1"
|
||||
|
||||
status:
|
||||
current_phase: "demand"
|
||||
current_round: 1
|
||||
state: "in_progress"
|
||||
last_updated: "{{date}}"
|
||||
|
||||
phases:
|
||||
- name: "demand"
|
||||
status: "in_progress"
|
||||
- name: "acceptance"
|
||||
status: "pending"
|
||||
- name: "plan"
|
||||
status: "pending"
|
||||
- name: "architecture"
|
||||
status: "optional"
|
||||
- name: "decompose"
|
||||
status: "pending"
|
||||
- name: "develop"
|
||||
status: "pending"
|
||||
- name: "code_review"
|
||||
status: "optional"
|
||||
- name: "test"
|
||||
status: "pending"
|
||||
- name: "acceptance_review"
|
||||
status: "pending"
|
||||
- name: "archive"
|
||||
status: "pending"
|
||||
|
||||
questions:
|
||||
p0_open: 0
|
||||
p1_open: 0
|
||||
p2_open: 0
|
||||
|
||||
metrics:
|
||||
evidence_count: 0
|
||||
mermaid_count: 0
|
||||
table_count: 0
|
||||
|
||||
assumptions: []
|
||||
@@ -0,0 +1,10 @@
|
||||
# Status
|
||||
|
||||
- 当前阶段:{{current_phase}}
|
||||
- 当前轮次:{{current_round}}
|
||||
- 阻塞问题:{{p0_count}}
|
||||
- 关键决策:{{last_decision}}
|
||||
- 最近更新:{{date}}
|
||||
|
||||
## 下一步
|
||||
- {{next_action}}
|
||||
@@ -0,0 +1,2 @@
|
||||
# Summary
|
||||
- {{date}}: 初始化项目,进入 Round 1。
|
||||
@@ -0,0 +1,7 @@
|
||||
# Requirements
|
||||
|
||||
## 背景与目标
|
||||
|
||||
## 需求概述
|
||||
|
||||
## 证据/参考
|
||||
@@ -0,0 +1,5 @@
|
||||
# Acceptance
|
||||
|
||||
## 验收标准
|
||||
|
||||
## 范围边界
|
||||
@@ -0,0 +1,5 @@
|
||||
# Acceptance Checklist
|
||||
|
||||
| Item | Description | Status | Evidence |
|
||||
|---|---|---|---|
|
||||
| | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Dependencies
|
||||
|
||||
| Dependency | Type | Impact | Owner | Status |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Milestones
|
||||
|
||||
| Milestone | Date | Owner | Status |
|
||||
|---|---|---|---|
|
||||
| | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Risks
|
||||
|
||||
| Risk | Level | Mitigation | Owner | Status |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,7 @@
|
||||
# Architecture
|
||||
|
||||
## Overview
|
||||
|
||||
## Tradeoffs
|
||||
|
||||
## Evidence
|
||||
@@ -0,0 +1,5 @@
|
||||
# Data Model
|
||||
|
||||
| Entity | Fields | Constraints | Notes |
|
||||
|---|---|---|---|
|
||||
| | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Interfaces
|
||||
|
||||
| Interface | Owner | Input | Output | Notes |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Change Log
|
||||
|
||||
| Change | Reason | Impact | Decision | Date |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,90 @@
|
||||
# 开发日志 (05_delivery/dev_log.md)
|
||||
|
||||
> **项目**: {project_name}
|
||||
> **更新规则**: 每个任务完成或有重要产出时更新;单元测试执行后**必须**填写"单元测试记录"区块
|
||||
|
||||
---
|
||||
|
||||
## 任务状态总览
|
||||
|
||||
| 任务 | 负责人 | Day | 状态 | 完成时间 | 备注 |
|
||||
|------|--------|-----|------|----------|------|
|
||||
| T-xxx | — | — | ⬜ 待开始 | — | — |
|
||||
|
||||
> 状态说明:✅ 完成 / 🔄 进行中 / ⬜ 待开始 / ❌ 阻塞
|
||||
|
||||
---
|
||||
|
||||
## 开发日志详情
|
||||
|
||||
### {YYYY-MM-DD} | Round N | Dev Assist — {任务编号} {任务名称}
|
||||
|
||||
**PDCA 阶段**: Do — 代码产出
|
||||
|
||||
**本轮产出**:
|
||||
|
||||
| 文件 | 模块 | 说明 |
|
||||
|------|------|------|
|
||||
| — | — | — |
|
||||
|
||||
**关键设计决策**:
|
||||
- (记录影响后续维护的设计选择)
|
||||
|
||||
**DoD 验证清单**:
|
||||
- [ ] ...
|
||||
|
||||
**遗留问题**:
|
||||
- (无则写"无")
|
||||
|
||||
---
|
||||
|
||||
## 单元测试记录
|
||||
|
||||
> ⚠️ **强制要求**:每个任务的单测必须在进入 Check 阶段前完成并记录。
|
||||
> 单测未通过或未记录 = DoD 未达成 = 禁止推进下一阶段。
|
||||
|
||||
### {任务编号} {任务名称} — 单测计划与结果
|
||||
|
||||
**执行时间**: {YYYY-MM-DD HH:MM}
|
||||
**执行人**: {name}
|
||||
**测试框架**: JUnit 5 / Mockito(或实际使用框架)
|
||||
|
||||
#### 单测结果明细
|
||||
|
||||
| 测试类 | 测试方法 | 场景描述 | 结果 | 备注 |
|
||||
|--------|----------|----------|------|------|
|
||||
| `XxxServiceTest` | `testSave_success` | 正常创建,返回主键 | ✅ PASS | — |
|
||||
| `XxxServiceTest` | `testSave_missingOrderNo` | 订单号为空,抛 BusinessException | ✅ PASS | — |
|
||||
| `XxxServiceTest` | `testSave_invalidProvider` | 服务商不存在,抛 BusinessException | ✅ PASS | — |
|
||||
| `XxxServiceTest` | `testList_emptyResult` | 无数据时返回空 Page | ✅ PASS | — |
|
||||
|
||||
> 结果说明:✅ PASS / ❌ FAIL / ⚠️ SKIP(须注明原因)
|
||||
|
||||
#### 覆盖率摘要
|
||||
|
||||
| 类 | 方法数 | 已覆盖 | 覆盖率 | 是否达标(≥80%) |
|
||||
|----|--------|--------|--------|-----------------|
|
||||
| `XxxService` | — | — | —% | — |
|
||||
|
||||
> 覆盖率低于 80% 须填写原因,并获得人类确认后方可推进:
|
||||
> - 原因:
|
||||
> - 确认人:
|
||||
> - 确认时间:
|
||||
|
||||
#### 失败/跳过明细(若有)
|
||||
|
||||
| 测试方法 | 失败原因 | 修复状态 | 修复时间 |
|
||||
|----------|----------|----------|----------|
|
||||
| — | — | — | — |
|
||||
|
||||
---
|
||||
|
||||
## 变更记录
|
||||
|
||||
> 暂无变更
|
||||
|
||||
---
|
||||
|
||||
## 阻塞记录
|
||||
|
||||
> 暂无阻塞
|
||||
@@ -0,0 +1,5 @@
|
||||
# Defects
|
||||
|
||||
| ID | Summary | Severity | Status | Evidence |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Regression
|
||||
|
||||
| Version | Cases | Pass | Fail | Notes |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Test Cases
|
||||
|
||||
| Case | Scope | Steps | Expected | Status |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,5 @@
|
||||
# Decision
|
||||
|
||||
| Item | Decision | Owner | Due | Status |
|
||||
|---|---|---|---|---|
|
||||
| | | | | |
|
||||
@@ -0,0 +1,7 @@
|
||||
# Review
|
||||
|
||||
## Summary
|
||||
|
||||
## Issues
|
||||
|
||||
## Decision
|
||||
@@ -0,0 +1,7 @@
|
||||
# Release Notes
|
||||
|
||||
## Highlights
|
||||
|
||||
## Changes
|
||||
|
||||
## Risks
|
||||
@@ -0,0 +1,16 @@
|
||||
# Gate Recommendation Matrix (tgassist)
|
||||
|
||||
> System recommends gates based on project scale and risk level. User confirmation is required.
|
||||
|
||||
## Matrix
|
||||
|
||||
| Risk \ Scale | Small | Medium | Large |
|
||||
|---|---|---|---|
|
||||
| Low | (none) | Code Review | Code Review |
|
||||
| Medium | Code Review + Security Review | Architecture + Code Review + Security Review | Architecture + Code Review + Security Review |
|
||||
| High | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance |
|
||||
|
||||
## Notes
|
||||
- Architecture gate recommended when system complexity is medium or above.
|
||||
- Privacy/Compliance gate recommended for high-risk or personal data handling projects.
|
||||
- User can override recommendations, but must record decision and risk acceptance.
|
||||
@@ -0,0 +1,50 @@
|
||||
# project.yaml Schema (tgassist)
|
||||
|
||||
## Fields
|
||||
|
||||
- `schema.name`:
|
||||
- Value: `tgassist.project`
|
||||
|
||||
- `schema.version`:
|
||||
- Value: `0.1`
|
||||
|
||||
- `project.name`:
|
||||
- Human-readable project name
|
||||
|
||||
- `project.alias`:
|
||||
- Short slug used for directory naming
|
||||
|
||||
- `project.description`:
|
||||
- One-line description
|
||||
|
||||
- `project.owner`:
|
||||
- Primary owner (role/person)
|
||||
|
||||
- `project.created_at`:
|
||||
- ISO date (YYYY-MM-DD)
|
||||
|
||||
- `governance.scale`:
|
||||
- Enum: `small | medium | large`
|
||||
|
||||
- `governance.risk_level`:
|
||||
- Enum: `low | medium | high`
|
||||
|
||||
- `governance.optional_gates`:
|
||||
- `architecture_design`: `enabled | disabled`
|
||||
- `code_review`: `enabled | disabled`
|
||||
- `security_review`: `enabled | disabled`
|
||||
- `privacy_compliance`: `enabled | disabled`
|
||||
|
||||
- `governance.git_policy`:
|
||||
- `enabled`: `true | false`
|
||||
- `commit_format`: string, default `[role][phase] summary - reason`
|
||||
|
||||
- `evidence_sources`:
|
||||
- `codemap`: path string
|
||||
- `domainmap`: path string
|
||||
- `runtime`: path string
|
||||
|
||||
## Notes
|
||||
- Optional gates default to `disabled` until user confirms.
|
||||
- Risk level drives recommended optional gates.
|
||||
- If `git_policy.enabled=true`, commits must include summary, role, phase, and change reason.
|
||||
@@ -0,0 +1,44 @@
|
||||
# session.yaml Schema (tgassist)
|
||||
|
||||
## Fields
|
||||
|
||||
- `schema.name`:
|
||||
- Value: `tgassist.session`
|
||||
|
||||
- `schema.version`:
|
||||
- Value: `0.1`
|
||||
|
||||
- `status.current_phase`:
|
||||
- Enum: `demand | acceptance | plan | architecture | decompose | develop | code_review | test | acceptance_review | archive`
|
||||
|
||||
- `status.current_round`:
|
||||
- Integer (>= 1)
|
||||
|
||||
- `status.state`:
|
||||
- Enum: `in_progress | awaiting_answers | finalized`
|
||||
|
||||
- `status.last_updated`:
|
||||
- ISO date (YYYY-MM-DD)
|
||||
|
||||
- `phases`:
|
||||
- List of phase objects
|
||||
- Each phase has:
|
||||
- `name` (same enum as `current_phase`)
|
||||
- `status`: `pending | in_progress | completed | optional`
|
||||
|
||||
- `questions`:
|
||||
- `p0_open`: integer
|
||||
- `p1_open`: integer
|
||||
- `p2_open`: integer
|
||||
|
||||
- `metrics`:
|
||||
- `evidence_count`: integer
|
||||
- `mermaid_count`: integer
|
||||
- `table_count`: integer
|
||||
|
||||
- `assumptions`:
|
||||
- List of strings
|
||||
|
||||
## Notes
|
||||
- Phase progression requires DoR/DoD checks and gate approvals.
|
||||
- `state` becomes `awaiting_answers` when P0 questions remain.
|
||||
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat <<'USAGE'
|
||||
Usage:
|
||||
generate_gate_checklists.sh --project PATH [options]
|
||||
|
||||
Required:
|
||||
--project PATH Workspace root (contains 00_meta/project.yaml)
|
||||
|
||||
Optional:
|
||||
--output PATH Output directory for active gate checklists
|
||||
(default: <project>/00_meta/gate_checklists_active)
|
||||
--template PATH Template dir (default: skills/tg/assets/workspace_template/00_meta/gate_checklists)
|
||||
-h, --help Show help
|
||||
USAGE
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "error: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
command -v python3 >/dev/null 2>&1 || die "python3 is required"
|
||||
|
||||
project=""
|
||||
output=""
|
||||
template_dir=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--project) project="$2"; shift 2;;
|
||||
--output) output="$2"; shift 2;;
|
||||
--template) template_dir="$2"; shift 2;;
|
||||
-h|--help) usage; exit 0;;
|
||||
*) die "unknown arg: $1";;
|
||||
esac
|
||||
done
|
||||
|
||||
[[ -z "$project" ]] && die "--project is required"
|
||||
|
||||
project_yaml="$project/00_meta/project.yaml"
|
||||
[[ -f "$project_yaml" ]] || die "missing $project_yaml"
|
||||
|
||||
if [[ -z "$output" ]]; then
|
||||
output="$project/00_meta/gate_checklists_active"
|
||||
fi
|
||||
|
||||
if [[ -z "$template_dir" ]]; then
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
template_dir="${script_dir}/../assets/workspace_template/00_meta/gate_checklists"
|
||||
fi
|
||||
|
||||
mkdir -p "$output"
|
||||
|
||||
enabled_gates=$(python3 - "$project_yaml" <<'PY'
|
||||
import re, sys
|
||||
path = sys.argv[1]
|
||||
patterns = {
|
||||
"architecture_design": "architecture_review.md",
|
||||
"code_review": "code_review.md",
|
||||
"security_review": "security_review.md",
|
||||
"privacy_compliance": "privacy_review.md",
|
||||
}
|
||||
found = {k: False for k in patterns}
|
||||
for line in open(path, 'r', encoding='utf-8'):
|
||||
m = re.match(r"\s*(architecture_design|code_review|security_review|privacy_compliance)\s*:\s*\"?(\w+)\"?", line)
|
||||
if m:
|
||||
found[m.group(1)] = (m.group(2).strip().lower() == "enabled")
|
||||
|
||||
files = []
|
||||
for k, v in found.items():
|
||||
if v:
|
||||
files.append(patterns[k])
|
||||
|
||||
print(" ".join(files))
|
||||
PY
|
||||
)
|
||||
|
||||
if [[ -z "$enabled_gates" ]]; then
|
||||
echo "No optional gates enabled."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
for f in $enabled_gates; do
|
||||
src="$template_dir/$f"
|
||||
[[ -f "$src" ]] || die "template missing: $src"
|
||||
cp "$src" "$output/"
|
||||
echo "Copied: $f"
|
||||
done
|
||||
|
||||
echo "Active gate checklists generated at: $output"
|
||||
158
training/.claude/skills/tgassist/scripts/init_workspace.sh
Normal file
158
training/.claude/skills/tgassist/scripts/init_workspace.sh
Normal file
@@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
cat <<'USAGE'
|
||||
Usage:
|
||||
init_workspace.sh --name NAME [options]
|
||||
|
||||
Required:
|
||||
--name NAME Project name
|
||||
|
||||
Optional:
|
||||
--alias ALIAS Project alias (default: slugified name)
|
||||
--desc DESC Project description
|
||||
--owner OWNER Project owner
|
||||
--scale small|medium|large Project scale (default: medium)
|
||||
--risk low|medium|high Risk level (default: medium)
|
||||
--gate-architecture enabled|disabled Optional gate (default: disabled)
|
||||
--gate-code-review enabled|disabled Optional gate (default: disabled)
|
||||
--gate-security enabled|disabled Optional gate (default: disabled)
|
||||
--gate-privacy enabled|disabled Optional gate (default: disabled)
|
||||
--git-enabled true|false Git policy enabled (default: false)
|
||||
--git-commit-format FORMAT Commit format (default: "[role][phase] summary - reason")
|
||||
--output PATH Output directory (default: ./workspace/specs/{alias}-YYYYMMDD-HHMM)
|
||||
-h, --help Show help
|
||||
USAGE
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "error: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
command -v python3 >/dev/null 2>&1 || die "python3 is required"
|
||||
|
||||
project_name=""
|
||||
project_alias=""
|
||||
project_desc=""
|
||||
project_owner=""
|
||||
scale="medium"
|
||||
risk="medium"
|
||||
_gate_arch="disabled"
|
||||
_gate_code_review="disabled"
|
||||
_gate_security="disabled"
|
||||
_gate_privacy="disabled"
|
||||
git_enabled="false"
|
||||
git_commit_format="[role][phase] summary - reason"
|
||||
output=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--name) project_name="$2"; shift 2;;
|
||||
--alias) project_alias="$2"; shift 2;;
|
||||
--desc) project_desc="$2"; shift 2;;
|
||||
--owner) project_owner="$2"; shift 2;;
|
||||
--scale) scale="$2"; shift 2;;
|
||||
--risk) risk="$2"; shift 2;;
|
||||
--gate-architecture) _gate_arch="$2"; shift 2;;
|
||||
--gate-code-review) _gate_code_review="$2"; shift 2;;
|
||||
--gate-security) _gate_security="$2"; shift 2;;
|
||||
--gate-privacy) _gate_privacy="$2"; shift 2;;
|
||||
--git-enabled) git_enabled="$2"; shift 2;;
|
||||
--git-commit-format) git_commit_format="$2"; shift 2;;
|
||||
--output) output="$2"; shift 2;;
|
||||
-h|--help) usage; exit 0;;
|
||||
*) die "unknown arg: $1";;
|
||||
esac
|
||||
done
|
||||
|
||||
[[ -z "$project_name" ]] && die "--name is required"
|
||||
|
||||
if [[ -z "$project_alias" ]]; then
|
||||
project_alias=$(echo "$project_name" | tr '[:upper:] ' '[:lower:]-' | tr -cd 'a-z0-9-')
|
||||
fi
|
||||
|
||||
if [[ -z "$output" ]]; then
|
||||
output="./workspace/specs/${project_alias}-$(date +%Y%m%d-%H%M)"
|
||||
fi
|
||||
|
||||
if [[ -e "$output" ]]; then
|
||||
die "output already exists: $output"
|
||||
fi
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
template_dir="${script_dir}/../assets/workspace_template"
|
||||
|
||||
mkdir -p "$output"
|
||||
cp -R "$template_dir"/. "$output"/
|
||||
|
||||
date_str="$(date +%Y-%m-%d)"
|
||||
|
||||
export TG_PROJECT_NAME="$project_name"
|
||||
export TG_PROJECT_ALIAS="$project_alias"
|
||||
export TG_PROJECT_DESC="$project_desc"
|
||||
export TG_PROJECT_OWNER="$project_owner"
|
||||
export TG_DATE="$date_str"
|
||||
export TG_SCALE="$scale"
|
||||
export TG_RISK="$risk"
|
||||
export TG_GATE_ARCH="$_gate_arch"
|
||||
export TG_GATE_CODE_REVIEW="$_gate_code_review"
|
||||
export TG_GATE_SECURITY="$_gate_security"
|
||||
export TG_GATE_PRIVACY="$_gate_privacy"
|
||||
export TG_GIT_ENABLED="$git_enabled"
|
||||
export TG_GIT_COMMIT_FORMAT="$git_commit_format"
|
||||
export TG_CURRENT_PHASE="demand"
|
||||
export TG_CURRENT_ROUND="1"
|
||||
export TG_P0_COUNT="0"
|
||||
export TG_LAST_DECISION="-"
|
||||
export TG_NEXT_ACTION="collect requirements"
|
||||
|
||||
replace_file() {
|
||||
python3 - "$1" <<'PY'
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
path = Path(os.environ["TARGET_FILE"])
|
||||
data = path.read_text()
|
||||
repl = {
|
||||
"project_name": os.environ.get("TG_PROJECT_NAME", ""),
|
||||
"project_alias": os.environ.get("TG_PROJECT_ALIAS", ""),
|
||||
"project_desc": os.environ.get("TG_PROJECT_DESC", ""),
|
||||
"project_owner": os.environ.get("TG_PROJECT_OWNER", ""),
|
||||
"date": os.environ.get("TG_DATE", ""),
|
||||
"current_phase": os.environ.get("TG_CURRENT_PHASE", ""),
|
||||
"current_round": os.environ.get("TG_CURRENT_ROUND", ""),
|
||||
"p0_count": os.environ.get("TG_P0_COUNT", ""),
|
||||
"last_decision": os.environ.get("TG_LAST_DECISION", ""),
|
||||
"next_action": os.environ.get("TG_NEXT_ACTION", ""),
|
||||
}
|
||||
for k, v in repl.items():
|
||||
data = data.replace("{{" + k + "}}", v)
|
||||
|
||||
# project.yaml optional fields
|
||||
if path.name == "project.yaml":
|
||||
data = data.replace("small|medium|large", os.environ.get("TG_SCALE", "medium"))
|
||||
data = data.replace("low|medium|high", os.environ.get("TG_RISK", "medium"))
|
||||
data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_ARCH") == "enabled" else "disabled", 1)
|
||||
data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_CODE_REVIEW") == "enabled" else "disabled", 1)
|
||||
data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_SECURITY") == "enabled" else "disabled", 1)
|
||||
data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_PRIVACY") == "enabled" else "disabled", 1)
|
||||
data = data.replace("true|false", "true" if os.environ.get("TG_GIT_ENABLED") == "true" else "false", 1)
|
||||
data = data.replace("[role][phase] summary - reason", os.environ.get("TG_GIT_COMMIT_FORMAT", "[role][phase] summary - reason"))
|
||||
|
||||
path.write_text(data)
|
||||
PY
|
||||
}
|
||||
|
||||
for f in \
|
||||
"$output/00_meta/project.yaml" \
|
||||
"$output/00_meta/session.yaml" \
|
||||
"$output/00_meta/summary.md" \
|
||||
"$output/00_meta/decision_log.md" \
|
||||
"$output/00_meta/status.md"; do
|
||||
export TARGET_FILE="$f"
|
||||
replace_file "$f"
|
||||
done
|
||||
|
||||
echo "Workspace initialized at: $output"
|
||||
Reference in New Issue
Block a user