2026-05-12
This commit is contained in:
203
membership/.claude/agents/demand-assessor.md
Normal file
203
membership/.claude/agents/demand-assessor.md
Normal file
@@ -0,0 +1,203 @@
|
||||
你是一个精通 Java 微服务架构的资深技术负责人。
|
||||
|
||||
请基于以下统一模型评估需求的工作量。
|
||||
|
||||
==============================
|
||||
整体工作量模型
|
||||
==============================
|
||||
|
||||
工作量指数 W =
|
||||
(单元业务复杂度 B × 单元数量 S)
|
||||
× 技术复杂度系数 F(T)
|
||||
× AI效率系数 G(A)
|
||||
|
||||
其中:
|
||||
|
||||
B = 单个功能单元复杂度
|
||||
S = 单元数量
|
||||
F(T) = 技术放大系数
|
||||
G(A) = AI效率系数
|
||||
|
||||
请严格按照步骤执行。
|
||||
|
||||
|
||||
====================================================
|
||||
第一部分:识别功能单元(规模 S)
|
||||
====================================================
|
||||
|
||||
1. 识别最小可重复功能单元
|
||||
(例如:接口、页面、报表、定时任务等)
|
||||
|
||||
2. 统计每类单元数量
|
||||
|
||||
要求:
|
||||
- 不要在此阶段评估复杂度
|
||||
- 仅统计数量
|
||||
|
||||
输出:
|
||||
- 单元类型
|
||||
- 每类数量
|
||||
- 总数量 S
|
||||
|
||||
|
||||
====================================================
|
||||
第二部分:单元业务复杂度评估 B(仅评单个单元)
|
||||
====================================================
|
||||
|
||||
假设只实现一个单元,评分(1-5):
|
||||
|
||||
1. 业务规则数量
|
||||
2. 状态流转复杂度
|
||||
3. 异常处理复杂度
|
||||
4. 边界场景复杂度
|
||||
5. 需求不确定性
|
||||
|
||||
计算:
|
||||
|
||||
B = 五项平均值(保留1位小数)
|
||||
|
||||
注意:
|
||||
禁止在此阶段考虑单元数量。
|
||||
|
||||
输出:
|
||||
- 各项评分
|
||||
- 单元复杂度 B
|
||||
|
||||
|
||||
====================================================
|
||||
第三部分:技术复杂度评估 F(T)
|
||||
====================================================
|
||||
|
||||
评估技术复杂度等级 T(1-5):
|
||||
|
||||
1 = 单服务简单CRUD
|
||||
2 = 单服务中等逻辑
|
||||
3 = 多服务调用
|
||||
4 = 涉及DB变更/MQ
|
||||
5 = 分布式事务/核心链路/高并发
|
||||
|
||||
计算:
|
||||
|
||||
F(T) = 1 + 0.2 × (T - 1)
|
||||
|
||||
输出:
|
||||
- T值
|
||||
- 技术复杂度系数 F(T)
|
||||
- 技术风险说明
|
||||
|
||||
|
||||
====================================================
|
||||
第四部分:AI效率系数 G(A) 计算
|
||||
====================================================
|
||||
|
||||
步骤A:正向评分(1-5分)
|
||||
|
||||
1.需求清晰
|
||||
2.规则明确度
|
||||
3.可验证性
|
||||
4.代码结构清晰度
|
||||
|
||||
P = 四项得分之和
|
||||
|
||||
|
||||
步骤B:架构抽象复杂度(计数制)
|
||||
|
||||
每触发一项 +1:
|
||||
|
||||
- 策略/模板动态组合
|
||||
- 插件或SPI机制
|
||||
- 规则引擎/表达式驱动
|
||||
- AOP深度影响核心逻辑
|
||||
- Saga/TCC/补偿机制
|
||||
- 多租户/动态数据源
|
||||
|
||||
记为 N1
|
||||
|
||||
|
||||
步骤C:变更影响范围(计数制)
|
||||
|
||||
每触发一项 +1:
|
||||
|
||||
- 老服务接口变更
|
||||
- 数据库老表变更
|
||||
- 核心业务链路变更
|
||||
- 公共组件修改
|
||||
- 权限安全机制修改
|
||||
- 分布式事务/MQ变更
|
||||
- 低测试覆盖区域
|
||||
|
||||
记为 N2
|
||||
|
||||
|
||||
步骤D:历史耦合程度(计数制)
|
||||
|
||||
每触发一项 +1:
|
||||
|
||||
- 巨型类
|
||||
- 高复杂度方法
|
||||
- 隐式调用链
|
||||
- 模块边界不清晰
|
||||
- 测试覆盖<30%
|
||||
- 多服务共享数据库
|
||||
- 无维护人/无文档
|
||||
|
||||
记为 N3
|
||||
|
||||
|
||||
步骤E:计算
|
||||
|
||||
N = N1 + N2 + N3
|
||||
|
||||
A = P - N
|
||||
|
||||
|
||||
====================================================
|
||||
第五部分:安全门检查
|
||||
====================================================
|
||||
|
||||
若满足任一:
|
||||
|
||||
- 修改核心结算逻辑
|
||||
- 修改分布式事务核心
|
||||
- 修改权限核心鉴权
|
||||
- 单测覆盖率<20%
|
||||
- 无法清晰定位影响范围
|
||||
|
||||
标记为【高风险变更】
|
||||
|
||||
|
||||
|
||||
====================================================
|
||||
第六部分:AI效率系数映射
|
||||
====================================================
|
||||
|
||||
若非高风险变更:
|
||||
|
||||
A ≥ 10 → G(A) = 0.55
|
||||
8 ≤ A < 10 → G(A) = 0.65
|
||||
6 ≤ A < 8 → G(A) = 0.75
|
||||
3 ≤ A < 6 → G(A) = 0.85
|
||||
1 ≤ A < 3 → G(A) = 0.95
|
||||
A ≤ 0 → G(A) = 1.0
|
||||
|
||||
|
||||
====================================================
|
||||
第七部分:最终工作量计算
|
||||
====================================================
|
||||
|
||||
计算:
|
||||
|
||||
基础工作量 = B × S
|
||||
技术放大后 = 基础工作量 × F(T)
|
||||
最终工作量指数 W = 技术放大后 × G(A)
|
||||
|
||||
请输出:
|
||||
|
||||
1. 单元数量 S
|
||||
2. 单元复杂度 B
|
||||
3. 技术系数 F(T)
|
||||
4. AI效率系数 G(A)
|
||||
5. 最终工作量指数 W
|
||||
6. 综合风险等级(低/中/高)
|
||||
7. 是否建议拆分需求
|
||||
8. AI建议参与方式
|
||||
151
membership/.claude/skills/pmassist/SKILL.md
Normal file
151
membership/.claude/skills/pmassist/SKILL.md
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
name: pmassist
|
||||
description: |
|
||||
产品文档协作与缺陷分析助手。用于创建或修订 PRD、FRD、DAR(Defect Analysis Report 缺陷分析报告)等产品类文档。
|
||||
支持快速起草、标准迭代、严格定稿三种模式。默认优先保证交付效率,再按需补齐证据、留痕与原型。
|
||||
---
|
||||
|
||||
# pmassist
|
||||
|
||||
## 核心原则
|
||||
- **分文档类型执行**: PRD、FRD、DAR 使用不同严格度。
|
||||
- **分阶段执行**: 草案、迭代、定稿采用不同要求,不默认一开始即使用最严格流程。
|
||||
- **WWH + PDCA 默认保留,但允许轻量化执行**。
|
||||
- **问答优先闭环关键问题,而非所有问题阻塞**。
|
||||
- **证据优先覆盖关键结论,而非所有句子逐条索证**。
|
||||
- **先可交付,再补完备性**。
|
||||
|
||||
---
|
||||
|
||||
## 0) 文档类型分流(先做)
|
||||
根据用户初始描述进行分支;不确定就追问:
|
||||
|
||||
- **PRD**: 新需求、流程优化、产品规划、业务方案、用户体验
|
||||
- **FRD**: 具体功能实现、接口/数据/流程细节、技术落地规格
|
||||
- **DAR**: 线上缺陷、事故复盘、根因分析、纠正预防
|
||||
|
||||
> 选择后加载对应模板:
|
||||
- PRD → `references/prd.md`
|
||||
- FRD → `references/frd.md`
|
||||
- DAR → `references/dar.md`
|
||||
|
||||
---
|
||||
|
||||
## 0.1) 执行模式选择(新增)
|
||||
在确认文档类型后,必须再确认执行模式:
|
||||
|
||||
### A. Quick 模式
|
||||
适用于:
|
||||
- PRD 初稿
|
||||
- 需求探索
|
||||
- 信息不完整但希望先出版本
|
||||
- 老需求的轻量改版
|
||||
|
||||
特点:
|
||||
- 允许先生成 v0 草案
|
||||
- 允许部分章节以 `[ASSUMPTION]` 标注
|
||||
- 不要求每轮完整 PDCA 留痕
|
||||
- 不要求 P0 全部解决后才继续草案输出
|
||||
- 图表、证据映射表可延后到定稿前补齐
|
||||
|
||||
### B. Standard 模式
|
||||
适用于:
|
||||
- 常规 PRD/FRD
|
||||
- 多方评审前的文档整理
|
||||
- 需要一定可追溯性,但不需要最强审计痕迹
|
||||
|
||||
特点:
|
||||
- 执行 WWH + PDCA
|
||||
- 关键问题需要闭环
|
||||
- 关键章节需要证据
|
||||
- 每轮有摘要与变更记录
|
||||
- 可以带未决项输出“待确认版”
|
||||
|
||||
### C. Strict 模式
|
||||
适用于:
|
||||
- FRD 正式交付
|
||||
- DAR 缺陷分析
|
||||
- 高风险项目
|
||||
- 需要完整审计留痕的文档
|
||||
|
||||
特点:
|
||||
- 必须完整执行 WWH + PDCA
|
||||
- 必须严格问答闭环
|
||||
- P0 未解答不得定稿
|
||||
- 必须完成证据→章节映射
|
||||
- 必须完成图表、表格、差异分析、资产深挖
|
||||
|
||||
### 默认策略
|
||||
- **PRD 默认 Quick**
|
||||
- **FRD 默认 Standard**
|
||||
- **DAR 默认 Strict**
|
||||
|
||||
若用户未指定,按以上默认策略执行。
|
||||
|
||||
---
|
||||
|
||||
## 1) 确认工作目录与项目简称
|
||||
- 默认路径:`./{项目简称}-{YYYYMMDD-HHMM}`
|
||||
- 项目简称来自「需求极简概称」或「文件标题」
|
||||
- 必须询问用户确认;未确认不得创建目录
|
||||
|
||||
---
|
||||
|
||||
## 1.5) 会话恢复(Resume Session)
|
||||
|
||||
### 触发条件
|
||||
用户提供已存在的工作目录路径,或明确表达以下意图时立即执行会话恢复:
|
||||
- “继续之前的工作”
|
||||
- “修改 XXX 的 PRD/FRD/DAR”
|
||||
- “重新编辑 {workdir} 的文档”
|
||||
- “在 {workdir} 基础上调整”
|
||||
- 用户直接提供形如 `./项目名-20260209-1500` 的路径
|
||||
|
||||
### 验证会话有效性
|
||||
基础必备文件:
|
||||
- `session.yaml`
|
||||
- `desc.md`
|
||||
|
||||
增强校验文件:
|
||||
- `summary.md`
|
||||
- `outputs/{doc_type}.md`
|
||||
|
||||
若基础文件缺失 → 提示损坏,建议创建新会话
|
||||
若增强文件缺失 → 允许恢复,但标记为“部分恢复”
|
||||
|
||||
### 状态回顾(自动生成报告)
|
||||
读取以下文件:
|
||||
- `session.yaml` → 获取文档类型、当前 Round、状态、模式
|
||||
- `summary.md` → 回顾已完成内容(若存在)
|
||||
- `questions/round_*.yaml` → 统计遗留问题(若存在)
|
||||
- `outputs/{doc_type}.md` → 检查章节完成度(若存在)
|
||||
- `session.yaml` 的 `prototype` 块 → 原型状态(如果启用)
|
||||
|
||||
生成会话状态报告并展示给用户。
|
||||
|
||||
### 询问工作模式
|
||||
展示报告后,询问用户选择工作方式:
|
||||
|
||||
- **Continue**:继续当前迭代
|
||||
- **Revise**:开启新轮次修订
|
||||
- **Patch**:仅改局部内容
|
||||
- **Prototype**:更新原型
|
||||
- **Finalize**:执行最终定稿
|
||||
- **Fast Draft**:基于已有材料快速重生成草案(新增)
|
||||
|
||||
---
|
||||
|
||||
## 2) 初始化工作区(确认后执行)
|
||||
|
||||
### 标准目录结构
|
||||
```text
|
||||
{workdir}/
|
||||
desc.md
|
||||
session.yaml
|
||||
summary.md
|
||||
decision_log.md
|
||||
materials/
|
||||
materials_index.md
|
||||
rounds/
|
||||
questions/
|
||||
outputs/
|
||||
270
membership/.claude/skills/tgassist/SKILL.md
Normal file
270
membership/.claude/skills/tgassist/SKILL.md
Normal file
@@ -0,0 +1,270 @@
|
||||
---
|
||||
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 / Dev / QA / Council(固定 6 角色)。
|
||||
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:等待人类确认 → 按评审意见修订 → 方案冻结或进入变更控制
|
||||
|
||||
### 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 中标注原因并获得人类确认
|
||||
|
||||
### 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:质量门禁 →(可选)安全审核 →(可选)合规/隐私审核
|
||||
- Check:问题清单与整改要求
|
||||
- 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 问题即推进阶段
|
||||
- 无证据断言关键结论
|
||||
@@ -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,12 @@
|
||||
# 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 | | | |
|
||||
@@ -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,43 @@
|
||||
# Gates (DoR / DoD)
|
||||
|
||||
> 每阶段进入前检查 DoR,完成后检查 DoD;可选门禁由系统推荐、用户确认。
|
||||
|
||||
## 需求输入
|
||||
- DoR: 需求来源明确;背景/目标初步描述
|
||||
- DoD: 需求文本落盘;证据索引初版
|
||||
|
||||
## 验收标准
|
||||
- DoR: 需求范围与目标明确
|
||||
- DoD: 验收标准可测试;范围边界明确
|
||||
|
||||
## 计划制定
|
||||
- DoR: 验收标准确认
|
||||
- DoD: 里程碑/资源/风险/依赖落盘
|
||||
|
||||
## 架构设计(可选)
|
||||
- DoR: 复杂度/风险达到门槛
|
||||
- DoD: 架构方案/接口/数据模型落盘并评审
|
||||
|
||||
## 模块任务拆分
|
||||
- DoR: 计划确认
|
||||
- DoD: 任务列表与责任人明确
|
||||
|
||||
## 功能开发
|
||||
- DoR: 任务清单确认
|
||||
- DoD: 实现记录与单测/自测结果
|
||||
|
||||
## 代码评审(可选)
|
||||
- DoR: 评审门禁启用
|
||||
- DoD: 评审结论与整改记录
|
||||
|
||||
## 测试
|
||||
- DoR: 可测试版本与用例准备
|
||||
- DoD: 测试报告/缺陷清单/回归记录
|
||||
|
||||
## 验收评审
|
||||
- DoR: 证据包齐全
|
||||
- DoD: 评审决议与整改清单
|
||||
|
||||
## 归档
|
||||
- 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
membership/.claude/skills/tgassist/scripts/init_workspace.sh
Normal file
158
membership/.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"
|
||||
18
membership/package.json
Normal file
18
membership/package.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "claude-team-workflow",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"claude:test": "node scripts/claude-safe-run.js .claude/agents/tester.md",
|
||||
"claude:architect": "node scripts/claude-safe-run.js .claude/agents/architect.md",
|
||||
"claude:backend": "node scripts/claude-safe-run.js .claude/agents/backend.md",
|
||||
"claude:frontend": "node scripts/claude-safe-run.js .claude/agents/frontend.md",
|
||||
"claude:review": "node scripts/claude-safe-run.js .claude/agents/codeReview.md",
|
||||
"claude:supervisor": "node scripts/claude-safe-run.js .claude/agents/supervisor.md",
|
||||
|
||||
"claude:product": "node scripts/claude-safe-run.js .claude/agents/product.md",
|
||||
"claude:security": "node scripts/claude-safe-run.js .claude/agents/security.md",
|
||||
|
||||
"claude:preflight": "node scripts/claude-safe-run.js .claude/agents/preflight.md",
|
||||
"claude:postflight": "node scripts/claude-safe-run.js .claude/agents/postflight.md"
|
||||
}
|
||||
}
|
||||
94
membership/scripts/claude-safe-run.js
Normal file
94
membership/scripts/claude-safe-run.js
Normal file
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Claude Safe Run - Team Edition
|
||||
*/
|
||||
|
||||
const { execSync } = require("child_process");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
// ---------- Utils ----------
|
||||
function run(cmd, options = {}) {
|
||||
return execSync(cmd, { stdio: "pipe", encoding: "utf-8", ...options });
|
||||
}
|
||||
|
||||
function exists(p) {
|
||||
return fs.existsSync(p);
|
||||
}
|
||||
|
||||
function fatal(msg) {
|
||||
console.error(`❌ ${msg}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// ---------- Args ----------
|
||||
const agentPrompt = process.argv[2];
|
||||
if (!agentPrompt) {
|
||||
fatal("Usage: node scripts/claude-safe-run.js <agent_prompt_path>");
|
||||
}
|
||||
|
||||
if (!exists(agentPrompt)) {
|
||||
fatal(`Agent prompt not found: ${agentPrompt}`);
|
||||
}
|
||||
|
||||
// ---------- Required Files ----------
|
||||
const PREFLIGHT_AGENT = ".claude/agents/preflight.md";
|
||||
const POSTFLIGHT_AGENT = ".claude/agents/postflight.md";
|
||||
const RUNS_DIR = ".claude/runs";
|
||||
|
||||
[PREFLIGHT_AGENT, POSTFLIGHT_AGENT, RUNS_DIR].forEach((p) => {
|
||||
if (!exists(p)) fatal(`Required file or directory missing: ${p}`);
|
||||
});
|
||||
|
||||
// ---------- Git Context ----------
|
||||
let git = {};
|
||||
try {
|
||||
git.user = run("git config user.name").trim();
|
||||
git.branch = run("git rev-parse --abbrev-ref HEAD").trim();
|
||||
git.commit = run("git rev-parse HEAD").trim();
|
||||
} catch {
|
||||
fatal("Git context unavailable. Are you in a git repository?");
|
||||
}
|
||||
|
||||
// ---------- Metadata ----------
|
||||
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
||||
const agentName = path.basename(agentPrompt, ".md");
|
||||
const runId = `${timestamp}-${agentName}-${git.user.replace(/\s+/g, "_")}`;
|
||||
|
||||
console.log(`🧠 Claude Safe Run`);
|
||||
console.log(`- Agent: ${agentName}`);
|
||||
console.log(`- Author: ${git.user}`);
|
||||
console.log(`- Branch: ${git.branch}`);
|
||||
console.log(`- Commit: ${git.commit}`);
|
||||
console.log(`- Run ID: ${runId}`);
|
||||
|
||||
// ---------- Preflight ----------
|
||||
console.log("\n🔍 Running Preflight Agent...");
|
||||
const preflightOutput = run(
|
||||
`claude run --prompt ${PREFLIGHT_AGENT} --input ${agentPrompt}`
|
||||
);
|
||||
|
||||
console.log(preflightOutput);
|
||||
|
||||
if (!preflightOutput.includes("PRECHECK: PASS")) {
|
||||
fatal("Preflight check failed or unclear. Execution aborted.");
|
||||
}
|
||||
|
||||
// ---------- Run Main Agent ----------
|
||||
console.log("\n🚀 Running Main Agent...");
|
||||
execSync(`claude run --prompt ${agentPrompt}`, { stdio: "inherit" });
|
||||
|
||||
// ---------- Postflight ----------
|
||||
console.log("\n🧪 Running Postflight Agent...");
|
||||
const postflightOutput = run(
|
||||
`claude run --prompt ${POSTFLIGHT_AGENT} --input ${runId}`
|
||||
);
|
||||
|
||||
console.log(postflightOutput);
|
||||
|
||||
if (!postflightOutput.includes("POSTCHECK: PASS")) {
|
||||
fatal("Postflight validation failed. Run logs invalid or missing.");
|
||||
}
|
||||
|
||||
console.log("\n✅ Claude run completed successfully.");
|
||||
console.log(`📄 Run ID: ${runId}`);
|
||||
BIN
membership/specs/materials/企业微信截图_17706340271335.png
Normal file
BIN
membership/specs/materials/企业微信截图_17706340271335.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 410 KiB |
BIN
membership/specs/materials/服务商配置.png
Normal file
BIN
membership/specs/materials/服务商配置.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 401 KiB |
BIN
membership/specs/materials/调度日志比价.png
Normal file
BIN
membership/specs/materials/调度日志比价.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
2493
membership/产品需求文档.txt
Normal file
2493
membership/产品需求文档.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user