2026-05-12

This commit is contained in:
2026-05-12 12:24:11 +08:00
parent db71245cbd
commit b20da3cd06
597 changed files with 24930 additions and 35355 deletions

View File

@@ -0,0 +1,406 @@
---
name: pmassist
description: |
产品文档协作与缺陷分析助手。用于创建或修订 PRD、FRD、DARDefect 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
- 开启新 RoundRound 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`:原始需求 + WWHWhat/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`(用于生成会话状态报告)

View 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/P2P0 未关闭不得进入下一轮完整输出。
- **证据优先**:关键结论必须标注证据或 `[ASSUMPTION]`;需维护证据索引与章节映射。
- **资产深挖**:若存在 CodeMap/DomainMap/Runtime必须下钻至页面/字段/调用链证据层级。
- **门禁治理**:可选门禁由系统推荐、用户确认;中途变更必须走变更单并记录风险接受。
- **流程裁剪**:允许按项目规模/风险等级裁剪角色流程,但必须留痕。
- **RACI 裁剪**:角色权限矩阵可按项目规模裁剪,裁剪原因必须落盘。
- **Git 纪律可选**:关键产出是否提交 Git 由用户确认;若启用需记录摘要/角色/阶段/变更原因。
- **不做外部工具联动**:不对接 Jira/飞书/Notion/GitHub可在未来扩展
## 0) 入口与角色选择
1. 选择工作方向:初始化项目 / 需求与验收 / 开发推进 / 测试文档 / 评审验收 / 变更管理 / 复盘归档。
2. 选择角色 AssistPM / 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 三层任意一层有未通过项,禁止进入归档阶段

View File

@@ -0,0 +1,2 @@
# Decision Log
- {{date}}: 初始化项目与基础规则确认。

View File

@@ -0,0 +1,5 @@
# Evidence Index
| ID | Title | Type | Source | Date | Path | Notes |
|---|---|---|---|---|---|---|
| SRC-001 | | | | | | |

View File

@@ -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 | | | |

View File

@@ -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`) | | | |

View File

@@ -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 | | | |

View File

@@ -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 | | | |

View File

@@ -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: 归档文档与复盘记录

View File

@@ -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/"

View File

@@ -0,0 +1,7 @@
round: {{round}}
questions:
- id: Q{{round}}-1
priority: P0
question: "..."
options: ["...", "...", "其他"]
status: pending

View File

@@ -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 |

View File

@@ -0,0 +1,21 @@
# Round {{round}}
## Plan
- WWH 填充度:
- 本轮目标:
- 需要读取的资产与资料:
- 需要提出的问题:
## Do
- 资产读取:
- 分析与产出:
- 提问:
## Check
- 目标覆盖:
- 证据充分性:
- 逻辑一致性:
## Act
- 更新 summary/decision_log/session
- 规划下一轮

View File

@@ -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: []

View File

@@ -0,0 +1,10 @@
# Status
- 当前阶段:{{current_phase}}
- 当前轮次:{{current_round}}
- 阻塞问题:{{p0_count}}
- 关键决策:{{last_decision}}
- 最近更新:{{date}}
## 下一步
- {{next_action}}

View File

@@ -0,0 +1,2 @@
# Summary
- {{date}}: 初始化项目,进入 Round 1。

View File

@@ -0,0 +1,7 @@
# Requirements
## 背景与目标
## 需求概述
## 证据/参考

View File

@@ -0,0 +1,5 @@
# Acceptance
## 验收标准
## 范围边界

View File

@@ -0,0 +1,5 @@
# Acceptance Checklist
| Item | Description | Status | Evidence |
|---|---|---|---|
| | | | |

View File

@@ -0,0 +1,5 @@
# Dependencies
| Dependency | Type | Impact | Owner | Status |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,5 @@
# Milestones
| Milestone | Date | Owner | Status |
|---|---|---|---|
| | | | |

View File

@@ -0,0 +1,5 @@
# Risks
| Risk | Level | Mitigation | Owner | Status |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,7 @@
# Architecture
## Overview
## Tradeoffs
## Evidence

View File

@@ -0,0 +1,5 @@
# Data Model
| Entity | Fields | Constraints | Notes |
|---|---|---|---|
| | | | |

View File

@@ -0,0 +1,5 @@
# Interfaces
| Interface | Owner | Input | Output | Notes |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,5 @@
# Change Log
| Change | Reason | Impact | Decision | Date |
|---|---|---|---|---|
| | | | | |

View File

@@ -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% 须填写原因,并获得人类确认后方可推进:
> - 原因:
> - 确认人:
> - 确认时间:
#### 失败/跳过明细(若有)
| 测试方法 | 失败原因 | 修复状态 | 修复时间 |
|----------|----------|----------|----------|
| — | — | — | — |
---
## 变更记录
> 暂无变更
---
## 阻塞记录
> 暂无阻塞

View File

@@ -0,0 +1,5 @@
# Defects
| ID | Summary | Severity | Status | Evidence |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,5 @@
# Regression
| Version | Cases | Pass | Fail | Notes |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,5 @@
# Test Cases
| Case | Scope | Steps | Expected | Status |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,5 @@
# Decision
| Item | Decision | Owner | Due | Status |
|---|---|---|---|---|
| | | | | |

View File

@@ -0,0 +1,7 @@
# Review
## Summary
## Issues
## Decision

View File

@@ -0,0 +1,7 @@
# Release Notes
## Highlights
## Changes
## Risks

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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"

View 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"