Initial TrueGrowth source import

This commit is contained in:
2026-07-07 09:36:36 +08:00
commit 3b6781d695
2283 changed files with 691996 additions and 0 deletions

View File

@@ -0,0 +1,815 @@
# Spec-Kit 最佳实践指南
本文档介绍如何在 Opentu 项目中使用 GitHub Spec-Kit 进行规范驱动开发(Spec-Driven Development, SDD)。
## 目录
- [什么是 Spec-Kit](#什么是-spec-kit)
- [核心理念](#核心理念)
- [安装与设置](#安装与设置)
- [工作流程](#工作流程)
- [Monorepo 项目配置](#monorepo-项目配置)
- [最佳实践](#最佳实践)
- [常见问题](#常见问题)
## 什么是 Spec-Kit
Spec-Kit 是 GitHub 开源的规范驱动开发工具包,它将传统的"先编码后写文档"流程倒置为"先写规范后生成代码"。规范成为项目的真实来源(source of truth),AI 工具根据规范生成、测试和验证代码。
### 核心组件
1. **Specify CLI** - 用于初始化项目和下载模板的命令行工具
2. **模板和脚本** - 预设的规范模板和辅助脚本
3. **AI 集成** - 支持 Claude Code、GitHub Copilot、Gemini CLI 等 AI 编码助手
### 支持的 AI 工具
- Claude Code (推荐用于 Opentu 项目)
- GitHub Copilot
- Gemini CLI
- Cursor
- 其他兼容的 AI 编码助手
## 核心理念
### 规范驱动开发的优势
1. **意图优先** - 从"做什么"和"为什么"开始,而不是"怎么做"
2. **清晰性** - 在编码前就明确需求和架构决策
3. **活文档** - 规范与代码同步演进,始终保持最新
4. **人机协作** - 人类负责战略决策,AI 负责执行实现
5. **早期验证** - 在多个检查点捕获需求偏差,避免后期返工
### 何时使用 Spec-Kit
**✅ 推荐使用:**
- 为现有系统添加新功能
- 复杂的功能开发需要架构决策
- 团队协作需要明确的需求文档
- 需要保持代码与文档同步
**❌ 不建议使用:**
- 简单的 bug 修复
- 样式微调
- 配置文件更新
- 一次性实验性代码
## 安装与设置
### 前置要求
```bash
# 检查 Python 版本 (需要 3.11+)
python --version
# 检查 Git
git --version
# 安装 uv 包管理器
curl -LsSf https://astral.sh/uv/install.sh | sh
```
### 初始化 Spec-Kit
```bash
# 在项目根目录执行
npx @github/specify init
# 或使用 Python 包
pip install github-specify
specify init
```
这将创建 `.specify/` 目录结构:
```
.specify/
├── memory/
│ └── constitution.md # 项目宪章(非常重要!)
├── specifications/ # 功能规范文档
├── plans/ # 实现计划
└── tasks/ # 任务列表
```
## 快速开始 - Specify 命令步骤流程
### 完整开发周期命令序列
```bash
# 0. 前置准备 - 初始化项目
npx @github/specify init
# 在 Claude Code 中按顺序执行以下 slash 命令:
# 1. 建立宪章 (一次性,项目级)
/speckit.constitution
# 2. 编写功能规范 (每个新功能)
/speckit.specify
# 3. (可选)澄清不明确的需求
/speckit.clarify
# 4. 制定实现计划
/speckit.plan
# 5. 生成任务清单
/speckit.tasks
# 6. (可选)分析一致性
/speckit.analyze
# 7. (可选)生成验收检查清单
/speckit.checklist
# 8. 执行实现
/speckit.implement
# 9. (可选)将任务转换为 GitHub Issues
/speckit.taskstoissues
```
### 命令详解
| 命令 | 用途 | 执行时机 | 输出文件 |
|------|------|---------|---------|
| `/speckit.constitution` | 定义项目宪章和开发原则 | 项目初期(一次性) | `.specify/memory/constitution.md` |
| `/speckit.specify` | 编写功能规范(what & why) | 每个新功能开始前 | `.specify/specifications/{feature}.md` |
| `/speckit.clarify` | 识别并澄清规范中的不明确之处 | 规范编写后(可选) | 更新 `.specify/specifications/{feature}.md` |
| `/speckit.plan` | 制定技术实现方案(how) | 规范确认后 | `.specify/plans/{feature}-plan.md` |
| `/speckit.tasks` | 分解为可执行任务 | 计划制定后 | `.specify/tasks/{feature}-tasks.md` |
| `/speckit.analyze` | 检查规范/计划/任务的一致性 | 任务生成后(可选) | 分析报告 |
| `/speckit.checklist` | 生成验收检查清单 | 实现前(可选) | 自定义检查清单 |
| `/speckit.implement` | AI 执行任务实现 | 任务清单确认后 | 实际代码文件 |
| `/speckit.taskstoissues` | 将任务转换为 GitHub Issues | 团队协作场景(可选) | GitHub Issues |
### 典型工作流示例
#### 场景 1: 首次使用(新项目)
```bash
# Step 1: 初始化
cd /path/to/aitu
npx @github/specify init
# Step 2: 在 Claude Code 中
/speckit.constitution
# AI 会引导你定义项目宪章,你可以基于现有的 CODING_STANDARDS.md
# Step 3: 开发第一个功能
/speckit.specify
# 描述: "添加图片圆形裁剪功能"
/speckit.plan
# AI 制定技术方案
/speckit.tasks
# AI 生成任务列表
/speckit.implement
# AI 开始实现
```
#### 场景 2: 日常功能开发
```bash
# 直接跳过 constitution(已存在)
# Step 1: 写规范
/speckit.specify
# 输入: "用户可以导出白板为 PDF 格式"
# Step 2: (可选)澄清
/speckit.clarify
# AI 提问: "PDF 导出是否包含注释?", "是否支持分页?"等
# 你回答后,AI 更新规范
# Step 3: 制定计划
/speckit.plan
# Step 4: 生成任务
/speckit.tasks
# Step 5: (可选)分析一致性
/speckit.analyze
# AI 检查规范、计划、任务是否一致
# Step 6: 实现
/speckit.implement
```
#### 场景 3: 团队协作
```bash
# 产品经理/技术负责人
/speckit.specify
/speckit.plan
/speckit.tasks
# 转换为 GitHub Issues
/speckit.taskstoissues
# 团队成员可以在 GitHub 上认领任务
# 开发团队成员
# 直接使用 GitHub Issues 进行开发
# 或者再次运行 /speckit.implement 自动实现
```
### 工作流检查点
```
┌─────────────────┐
│ Constitution │ ← 项目宪章(一次性)
└────────┬────────┘
┌─────────────────┐
│ Specify │ ← 功能规范(每个功能)
└────────┬────────┘
├──→ [Clarify] (可选澄清)
┌─────────────────┐
│ Plan │ ← 技术方案
└────────┬────────┘
┌─────────────────┐
│ Tasks │ ← 任务分解
└────────┬────────┘
├──→ [Analyze] (可选分析)
├──→ [Checklist] (可选检查清单)
├──→ [TasksToIssues] (可选团队协作)
┌─────────────────┐
│ Implement │ ← AI 执行实现
└─────────────────┘
[Code Review]
[Merge & Deploy]
```
## 工作流程
Spec-Kit 遵循五阶段工作流,每个阶段都有明确的检查点:
### 1. 建立宪章 (Constitution)
**命令:** `/speckit.constitution`
宪章是项目的"根本大法",定义不可妥协的原则和标准。
**Opentu 项目宪章示例:**
```markdown
# Opentu 项目宪章
## 代码质量原则
### 文件大小限制
- 单个文件不超过 500 行代码(包括空行和注释)
- 超过限制必须进行合理拆分
### TypeScript 规范
- 必须使用严格的 TypeScript 配置
- 禁止使用 `any` 类型,使用具体类型或泛型
- 所有组件 Props 必须有类型定义
### 架构约定
- 使用插件化架构(`withXxx` 模式)
- React 组件必须使用函数式组件和 Hooks
- 状态管理优先使用 React Context
### UI/UX 规范
- UI 组件必须使用 TDesign React (light 主题)
- Tooltip 统一使用 `theme='light'`
- 遵循品牌色彩系统(橙金色 #F39C12、蓝紫色 #5A4FCF)
### 测试要求
- 所有新功能必须包含单元测试
- 测试覆盖率不低于 80%
- 提交前必须通过类型检查和测试
### Git 提交规范
- 遵循 Conventional Commits: `<type>(<scope>): <subject>`
- 类型: feat, fix, docs, style, refactor, test, chore, perf, ci
### 性能要求
- 大组件必须使用 React.lazy 进行代码分割
- 图片必须使用懒加载
- 长列表必须考虑虚拟化
### 安全原则
- 所有用户输入必须验证和清理
- 不得硬编码敏感信息
- API 调用必须有安全的错误处理
```
**最佳实践:**
- 基于现有的 `CODING_STANDARDS.md` 提炼核心原则
- 宪章应该简洁(1-2 页),只包含非妥协性原则
- 定期审查和更新宪章
### 2. 编写规范 (Specification)
**命令:** `/speckit.specify`
规范聚焦于"做什么"和"为什么",避免过早陷入技术细节。
**好的规范示例:**
```markdown
# 规范: 图片圆形裁剪功能
## 背景
用户在插入图片后,只能使用方形裁剪,无法创建圆形或椭圆形的图片效果,
限制了设计创意。
## 目标
为用户提供三种图片裁剪形状选项:方形、圆形、椭圆形。
## 用户故事
作为白板用户,我希望能够:
1. 选中画布上的图片
2. 点击工具栏的"裁剪"按钮
3. 在弹出菜单中选择裁剪形状(方形/圆形/椭圆形)
4. 看到图片以选定形状显示
## 功能需求
- FR1: 在图片选中时显示裁剪按钮
- FR2: 提供三种裁剪形状选项
- FR3: 裁剪后保持图片质量
- FR4: 支持撤销/重做操作
## 非功能需求
- NFR1: 裁剪操作响应时间 < 200ms
- NFR2: 裁剪不影响原始图片文件
- NFR3: 支持移动端触摸操作
## 成功标准
- 用户可以成功应用三种裁剪形状
- E2E 测试通过
- 符合品牌设计规范
```
**❌ 避免在规范阶段:**
- 指定具体的技术实现(如"使用 canvas API")
- 详细的代码结构
- 具体的库或框架选择
### 3. 制定计划 (Plan)
**命令:** `/speckit.plan`
计划阶段做出技术决策,选择实现方案。
**计划示例:**
```markdown
# 实现计划: 图片圆形裁剪功能
## 技术栈选择
- 图片处理: Canvas API (浏览器原生支持)
- 组件库: TDesign React Popup 组件
- 状态管理: React useState + useCallback
## 架构方案
### 组件结构
```
components/
├── image-crop/
│ ├── ImageCropPopup.tsx # 裁剪菜单弹窗
│ ├── ImageCropPopup.scss # 样式文件
│ ├── image-crop.types.ts # 类型定义
│ └── use-image-crop.ts # 裁剪逻辑 Hook
```
### 数据流
1. 用户选中图片 -> 触发 popup 显示
2. 用户选择裁剪形状 -> 调用 `applyCrop(shape)`
3. Canvas API 处理图片 -> 生成新的图片 URL
4. 更新 Plait 节点数据
## 依赖项
- 无需新增外部依赖
- 复用现有的 Plait 插件系统
## 风险与缓解
- 风险: 大图片裁剪可能卡顿
- 缓解: 添加 loading 状态,使用 Web Worker
## 测试策略
- 单元测试: 测试 `useImageCrop` Hook
- 集成测试: 测试 ImageCropPopup 组件交互
- E2E 测试: 测试完整的用户流程
```
**最佳实践:**
- 评估多个技术方案,说明选择理由
- 识别技术风险和缓解策略
- 考虑与现有系统的集成点
### 4. 分解任务 (Tasks)
**命令:** `/speckit.tasks`
将计划分解为可执行的小任务。
**任务列表示例:**
```markdown
# 任务清单: 图片圆形裁剪功能
## Phase 1: 类型和工具函数
- [ ] 定义 `CropShape` 类型('rectangle' | 'circle' | 'ellipse')
- [ ] 定义 `ImageCropPopupProps` 接口
- [ ] 实现 `cropImageToShape()` 工具函数
## Phase 2: 核心组件
- [ ] 创建 `ImageCropPopup.tsx` 组件
- [ ] 实现 `useImageCrop` Hook
- [ ] 添加 BEM 样式 `image-crop-popup.scss`
## Phase 3: 集成
- [ ] 在 popup-toolbar 中添加裁剪按钮
- [ ] 连接到 Plait 图片节点更新逻辑
- [ ] 添加撤销/重做支持
## Phase 4: 测试
- [ ] 编写 `useImageCrop.test.ts` 单元测试
- [ ] 编写 `ImageCropPopup.test.tsx` 组件测试
- [ ] 编写 E2E 测试场景
## Phase 5: 文档和优化
- [ ] 更新组件文档
- [ ] 性能测试和优化
- [ ] Code review 和修复问题
```
**最佳实践:**
- 每个任务应该可以在 2-4 小时内完成
- 按逻辑依赖关系排序
- 包含测试和文档任务
### 5. 执行实现 (Implement)
**命令:** `/speckit.implement`
AI 根据规范、计划和任务开始生成代码。
**工作方式:**
1. AI 按顺序执行任务列表
2. 生成代码并运行测试
3. 遇到问题时暂停,寻求人类指导
4. 完成后更新任务状态
**人类在循环中的角色:**
- 审查生成的代码
- 在检查点提供反馈
- 解决 AI 无法处理的设计决策
- 批准关键的架构变更
## Monorepo 项目配置
Opentu 使用 Nx monorepo 结构,需要特殊配置来支持 Spec-Kit。
### 当前限制
⚠️ Spec-Kit 假设 `.specify` 在项目根目录,但 monorepo 中不同包可能需要独立的宪章。
### 推荐配置
#### 方案 1: 单一宪章(适合小型 monorepo)
```
aitu/
├── .specify/
│ └── memory/
│ └── constitution.md # 全局宪章
├── apps/
│ └── web/
└── packages/
├── drawnix/
└── react-board/
```
**适用场景:** 所有包遵循相同的编码标准
#### 方案 2: 分层宪章(适合大型 monorepo)
```
aitu/
├── .specify/
│ └── memory/
│ └── constitution.md # 根宪章(通用原则)
├── packages/
│ ├── drawnix/
│ │ └── .specify/
│ │ └── memory/
│ │ └── constitution.md # drawnix 特定原则
│ └── react-board/
│ └── .specify/
│ └── memory/
│ └── constitution.md # react-board 特定原则
```
**适用场景:** 不同包有不同的技术栈或规范
**⚠️ 注意:** 截至 2025 年初,Spec-Kit 对子目录 `.specify` 的支持仍在开发中。建议先使用方案 1。
### Monorepo 工作流建议
```bash
# 1. 在项目根目录初始化 Spec-Kit
cd /path/to/aitu
npx @github/specify init
# 2. 创建全局宪章
# 在 Claude Code 中运行: /speckit.constitution
# 3. 为特定包开发功能时,在规范中明确范围
# 示例规范开头:
# Specification: Add Image Crop Feature to Drawnix Package
# Scope: packages/drawnix/
# ...
# 4. 在计划阶段明确文件路径
# 示例计划:
# Files to modify:
# - packages/drawnix/src/components/image-crop/ImageCropPopup.tsx
# - packages/drawnix/src/hooks/useImageCrop.ts
```
## 最佳实践
### 1. 编写高质量规范
**✅ DO:**
- 使用用户故事格式("作为[角色],我希望[功能],以便[价值]")
- 定义明确的成功标准
- 包含非功能需求(性能、安全、可访问性)
- 使用具体的场景和示例
**❌ DON'T:**
- 过早指定技术实现细节
- 假设读者了解隐含的业务逻辑
- 使用模糊的术语("用户体验良好")
### 2. 渐进式规范
对于复杂功能,采用分阶段规范:
```markdown
# Phase 1 Specification: 基础图片裁剪
- 支持方形裁剪
- 基本的 UI 交互
# Phase 2 Specification: 高级裁剪形状
- 添加圆形和椭圆形
- 裁剪预览
# Phase 3 Specification: 性能优化
- Web Worker 处理大图
- 缓存裁剪结果
```
### 3. 版本控制规范
```bash
# 提交规范文档
git add .specify/specifications/image-crop.md
git commit -m "docs(spec): add image crop feature specification"
# 提交计划
git add .specify/plans/image-crop-plan.md
git commit -m "docs(plan): add implementation plan for image crop"
# 实现完成后更新规范
git add .specify/specifications/image-crop.md
git commit -m "docs(spec): update image crop spec with final implementation"
```
### 4. 团队协作
**规范审查会议:**
1. 产品经理提出需求
2. 使用 `/speckit.specify` 起草规范
3. 团队审查规范,提出问题和建议
4. 迭代规范直到达成共识
5. 技术负责人制定计划
6. 开发团队执行实现
**异步协作:**
- 在 GitHub PR 中审查规范文档
- 使用 GitHub Discussions 讨论计划方案
- 在 Issues 中跟踪规范变更请求
### 5. 测试驱动规范
在规范中明确测试场景:
```markdown
## 测试场景
### 场景 1: 成功裁剪为圆形
Given: 用户已上传一张图片
When: 用户选择"圆形裁剪"
Then: 图片以圆形显示,保持原始宽高比
### 场景 2: 大图片性能
Given: 用户上传 10MB 的高分辨率图片
When: 用户应用裁剪
Then: 操作在 500ms 内完成,UI 不卡顿
### 场景 3: 移动端触摸
Given: 用户在移动设备上
When: 用户触摸选择裁剪形状
Then: 触摸区域足够大(最小 44x44px),操作流畅
```
### 6. 活文档原则
规范是"活"的,随代码演进:
```markdown
# Specification: Image Crop Feature
## Version History
- v1.0 (2025-01-15): Initial specification
- v1.1 (2025-01-20): Added ellipse shape after user feedback
- v1.2 (2025-01-25): Updated performance requirements
## Implementation Status
✅ Completed: Rectangle and circle crop
🚧 In Progress: Ellipse crop
📋 Planned: Custom polygon crop
```
### 7. 利用 Opentu 现有规范
将项目现有文档整合到 Spec-Kit 工作流:
```markdown
# Constitution 引用现有规范
参见项目根目录的详细规范:
- 编码标准: docs/CODING_STANDARDS.md
- 品牌指南: docs/BRAND_GUIDELINES.md
- 设计系统: docs/TDESIGN_THEME_INTEGRATION.md
本宪章提炼这些文档中的核心原则,作为 AI 开发的指导方针。
```
### 8. 性能与质量检查
在实现阶段嵌入自动检查:
```markdown
# Implementation Checklist (自动化)
## 代码质量
- [ ] TypeScript 类型检查通过 (`nx typecheck drawnix`)
- [ ] ESLint 检查通过 (`nx lint drawnix`)
- [ ] 单元测试通过 (`nx test drawnix`)
- [ ] 文件行数 < 500 行
## 性能基准
- [ ] 裁剪操作 < 200ms (Lighthouse)
- [ ] 组件首次渲染 < 100ms
- [ ] Bundle 大小增加 < 10KB
## 安全检查
- [ ] 输入验证完整
- [ ] 无硬编码密钥
- [ ] 依赖漏洞扫描通过
```
## 常见问题
### Q: Spec-Kit 会让开发变慢吗?
**A:** 初期可能稍慢,但长期加速开发:
- ✅ 减少返工(早期发现需求偏差)
- ✅ 降低沟通成本(规范即文档)
- ✅ 提升代码质量(AI 遵循宪章)
- ✅ 新成员上手快(规范清晰)
### Q: 简单功能也要写规范吗?
**A:** 根据复杂度判断:
- 简单 bug 修复 → 直接编码
- 添加新 UI 组件 → 简化的规范(1-2 段)
- 复杂功能 → 完整的规范-计划-任务流程
### Q: 规范与代码不同步怎么办?
**A:** 建立同步机制:
1. PR 模板要求更新相关规范
2. CI 检查规范文件的修改时间
3. 定期规范审计(每月/每季度)
### Q: 如何处理规范变更?
**A:** 版本化规范文档:
```markdown
# Specification: Feature X (v2.0)
## Changes from v1.0
- Added: Support for dark mode
- Removed: Legacy browser support
- Modified: Performance requirement from 500ms to 200ms
## Migration Guide
...
```
### Q: AI 生成的代码不符合预期怎么办?
**A:** 调整规范和宪章:
1. 检查宪章是否明确约束
2. 在规范中添加反例("不应该...")
3. 在计划中明确技术选择理由
4. 人工审查并修正,然后更新规范
### Q: Spec-Kit 与 CLAUDE.md 的关系?
**A:** 互补使用:
- **CLAUDE.md** - 项目级指导,所有会话生效
- **.specify/constitution.md** - 功能级宪章,特定开发任务生效
- 建议: CLAUDE.md 保持简洁,详细规范放入 `.specify/`
### Q: 为什么不是全自动?
**A:** 这是设计理念,而不是技术限制:
1. 检查点验证 - 每个阶段都是质量门禁,防止错误累积
2. 人类在循环中 - 关键决策(架构选择、技术方案)需要人类判断
3. 早期纠偏 - 在编码前发现需求理解偏差,避免返工
4. 渐进式明确 - 从模糊的想法逐步细化到可执行任务
可以简化的场景
对于简单、明确的需求,你可以:
快速模式(跳过可选步骤):
/speckit.specify # 必需
/speckit.plan # 必需
/speckit.tasks # 必需
/speckit.implement # 必需
最小化模式(极简单任务):
/speckit.specify # 直接在这里描述清楚所有细节
/speckit.implement # 跳过 plan 和 tasks直接实现
未来可能性
虽然官方没有全自动模式,但理论上你可以:
1. 自己创建自动化脚本(但不推荐):
#!/bin/bash
# 不推荐:绕过检查点可能导致质量问题
claude-code "/speckit.specify $1 && /speckit.plan && /speckit.tasks && /speckit.implement"
2. 提交 Feature Request 到 https://github.com/github/spec-kit/issues建议增加
- --auto 标志自动执行所有步骤
- --fast 模式跳过可选步骤
- 交互式确认点(而非完全自动)
我的建议
保持当前的分阶段流程,因为:
- ✅ 质量更高:每个检查点都是质量保证
- ✅ 更可控:出问题时容易定位在哪个阶段
- ✅ 更灵活:可以在任何阶段调整方向
- ✅ 学习价值:理解 AI 的思考过程
对于重复性高的简单任务,可以使用快速模式(跳过 clarify/analyze但保留核心的 specify → plan → tasks → implement 流程。
## 参考资源
### 官方文档
- [Spec-Kit GitHub](https://github.com/github/spec-kit)
- [Spec-Driven Development 博客](https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/)
### Opentu 项目文档
- [编码规范](./CODING_STANDARDS.md)
- [品牌指南](./BRAND_GUIDELINES.md)
- [项目指导](../CLAUDE.md)
### 社区讨论
- [Monorepo 支持讨论](https://github.com/github/spec-kit/discussions/769)
- [工作区支持 Issue](https://github.com/github/spec-kit/issues/1026)
---
**文档版本:** v1.0
**最后更新:** 2025-01-22
**维护者:** Opentu 团队
*本文档遵循 Spec-Kit 的活文档原则,会随着工具和项目实践持续演进。*