Files
gh-chamherry-claude-code-th…/commands/project-init.md
2025-11-29 18:08:40 +08:00

2035 lines
60 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
allowed-tools: Read, Write, AskUserQuestion, Bash(date:*), Glob, Grep
description: 智能分析项目并生成 CLAUDE.md 规范文件(完全跨平台)
---
智能分析现有项目结构和配置文件,自动推断技术栈、架构模式等信息,**只对无法确定的信息进行询问**,最终生成项目的 CLAUDE.md 开发规范文件。
**核心特性**:
- 🔍 **智能分析**: 自动检测项目类型、语言、框架
- 💡 **按需询问**: 只对无法推断的信息询问用户
- 🎯 **数据优先**: 优先使用项目实际数据,避免猜测
- 🌐 **跨平台**: 完全兼容 Windows / macOS / Linux
---
## 内置模板
以下是用于生成 CLAUDE.md 的内置模板:
```template
# CLAUDE.md 模板
> 用于在新项目中快速建立开发规范和最佳实践。使用时请填充 `[占位符]` 部分。
---
## 项目概述
**[项目名称]** - [项目一句话描述]
### 核心技术栈
- **框架**: [框架名称和版本]
- **数据存储**: [数据库/缓存技术]
- **开发语言**: [语言和版本]
- **代码风格**: [命名规范]
### 项目架构
```
[绘制项目架构图]
例如:
API层 → Service层 → Logic层 → Data层 → Storage
```
**关键模块**
- **[模块1]**: [路径] - [说明]
- **[模块2]**: [路径] - [说明]
---
## 测试规范
- 测试覆盖率 > 80%
- 使用 Mock 模拟外部依赖
- Mock 数据存放在 `test/data/` 目录
- 测试文件存放在 `test/` 目录
---
## 架构规则(强制)
### 层职责定义
- **[Layer 1]**: ✅ [应该做的] / ❌ [不应该做的]
- **[Layer 2]**: ✅ [应该做的] / ❌ [不应该做的]
### 开发规则
1. **命名规范** - [统一命名规范]
2. **依赖管理** - [依赖引入规则]
3. **错误处理** - [统一错误处理机制]
4. **版本控制** - Git提交必须使用 AskUserQuestion 工具询问用户同意
5. **禁止行为** - [明确禁止的操作]
### Claude Code 工具使用规范
**AI 必须使用的工具**
- **AskUserQuestion**: 数据不足或需要决策时,必须主动询问用户
- **TodoWrite**: 跟踪多步骤任务的进度,及时更新任务状态
- **Read/Grep/Glob**: 修改前必须先分析现有代码,避免重复定义
**Token 管理规范(强制)**
在开始每个 todo 任务前,必须评估剩余 token 是否足够完成该任务:
1. **评估标准**
- 当前剩余 token < 30000存在风险
- 当前剩余 token < 20000高风险
- 当前剩余 token < 10000极高风险
2. **风险处理流程**
**如果存在风险**,必须使用 AskUserQuestion 工具询问用户:
```yaml
question: "⚠️ Token 预警:当前剩余 [X] tokens即将开始「[Todo任务名称]」可能存在 token 不足风险。您希望如何处理?"
header: "Token 管理"
multiSelect: false
options:
- label: "继续执行当前任务"
description: "继续完成当前任务,可能需要在新会话中继续未完成的工作"
- label: "生成进度总结文档"
description: "生成包含当前进度总结和剩余待办事项实施方案的文档,便于在新会话中继续"
```
3. **生成进度总结文档**(用户选择选项 2 时):
创建文档:`docs/progress/YYYY-MM-DD-HH-MM-[任务名称]-进度总结.md`
文档必须包含:
```markdown
# [任务名称] - 进度总结与实施方案
**创建时间**: YYYY-MM-DD HH:MM
**当前状态**: 进行中
**完成度**: X/Y 个任务
---
## 一、已完成任务
### 1.1 任务清单
- [x] 任务 1 - 完成情况描述
- [x] 任务 2 - 完成情况描述
- [x] 任务 3 - 完成情况描述
### 1.2 关键成果
- **成果 1**: 具体内容和路径
- **成果 2**: 具体内容和路径
- **成果 3**: 具体内容和路径
### 1.3 已修改文件
```
path/to/file1.ext - 修改内容描述
path/to/file2.ext - 修改内容描述
```
---
## 二、剩余待办任务
### 2.1 待办清单
- [ ] 任务 4 - 详细描述
- [ ] 任务 5 - 详细描述
- [ ] 任务 6 - 详细描述
### 2.2 实施方案
#### 任务 4: [任务名称]
**目标**: [具体目标]
**步骤**:
1. [详细步骤 1]
2. [详细步骤 2]
3. [详细步骤 3]
**需要修改的文件**:
- `path/to/file1.ext` - [修改说明]
- `path/to/file2.ext` - [修改说明]
**注意事项**:
- [注意点 1]
- [注意点 2]
#### 任务 5: [任务名称]
... (同上格式)
---
## 三、技术背景和上下文
### 3.1 项目架构
[关键架构信息]
### 3.2 技术栈
[使用的技术栈]
### 3.3 重要约束
- [约束 1]
- [约束 2]
### 3.4 已知问题
- [问题 1 及解决方案]
- [问题 2 及解决方案]
---
## 四、继续工作指南
### 4.1 快速启动
在新会话中执行以下步骤:
1. 阅读本文档了解当前进度
2. 使用 TodoWrite 工具恢复任务列表
3. 从「任务 4」开始继续执行
### 4.2 验证检查清单
开始前请确认:
- [ ] 已理解所有已完成任务的内容
- [ ] 已查看所有修改过的文件
- [ ] 已理解剩余任务的实施方案
- [ ] 已了解技术背景和约束
---
**🤖 Generated with Claude Code**
```
4. **文档生成后**
- 输出文档路径
- 提示用户在新会话中使用 `@文档路径` 继续工作
- 优雅结束当前会话
**最佳实践**
- 定期评估 token 使用情况
- 在大型任务开始前进行评估
- 预留至少 15000 tokens 的安全边际
- 及时保存进度,避免工作丢失
---
## 核心开发实践(强制)
### 1. 代码修改前的分析(强制)
**所有代码修改前,必须先完成深度分析,理解项目架构后再设计方案。**
#### 调用链路分析要点
```
HTTP请求 → 路由 → Controller → Service → Logic → Data → Storage
```
必须分析:
- **入口点**: 请求从哪个API端点或界面进入
- **数据流转**: 数据在各层之间如何传递和转换
- **依赖关系**: 各组件之间的依赖
- **错误传播**: 错误如何在调用链中传播
- **缓存策略**: 缓存的读写时机
- **事务边界**: 数据一致性保证点
#### 方案设计原则KISS
设计前必须回答4个问题
1. **"这是真问题还是臆想的?"** - 拒绝过度设计
2. **"有更简单的方法吗?"** - 永远寻找最简方案
3. **"会破坏什么吗?"** - 向后兼容是铁律
4. **"真的需要这个功能吗?"** - 确认功能必要性
**性能要求**
- 最小化数据库/缓存操作次数
- 优先使用批量操作
- 合理使用并发和异步
- 避免不必要的数据复制
**代码简洁性**
- 能用30行解决绝不写300行
- 复用现有代码
- 函数职责单一
#### 数据驱动的方案设计(强制)
**所有方案必须有充足的数据支撑**
数据充足性判断:
- ✅ 是否完整理解现有代码实现逻辑?
- ✅ 是否掌握性能瓶颈数据?
- ✅ 是否了解用户实际使用场景?
- ✅ 是否分析业界最佳实践?
- ✅ 是否评估不同方案优劣?
**数据不足时的处理**
```
⚠️ 我没有足够的信心设计最佳方案
需要以下数据:
1. [具体需要的数据1]
2. [具体需要的数据2]
...
请提供这些数据或告诉我如何获取。
```
**禁止**
- ❌ 基于猜测或假设进行方案设计
- ❌ 数据不足时强行给出方案
- ❌ 使用"可能"、"也许"等不确定词汇描述关键决策
#### 方案审批流程(强制)
**在实施任何代码修改前,必须先获得用户审批**
**工作流程**
1. **分析阶段**AI 使用只读工具Read/Grep/Glob深度分析代码
2. **方案设计**:制定详细的实施方案(见下方"方案文档要求"
3. **展示方案**:向用户清晰展示方案,等待批准
4. **执行修改**:获得批准后才开始实际修改代码
**方案文档要求**
1. **提交方案设计文档**,包含:
- 完整调用链路分析
- 问题诊断和根因分析
- **支撑数据和分析**(必须包含)
- 方案设计(架构图、时序图、代码片段)
- KISS原则4问题的回答
- 性能影响评估
- 风险分析和缓解措施
- **文档保存**: 保存到 `docs/todo/YYYY-MM-DD-HH-MM-功能名称-方案.md`
2. **等待用户确认** - 批准后方可开始实施
3. **实施** - 严格按照批准方案执行
#### 分析检查清单
开始编码前必须完成:
- [ ] 已完整追踪调用链路
- [ ] 已理解所有涉及层的职责
- [ ] 已识别所有数据转换点
- [ ] 已回答KISS原则4个问题
- [ ] 已收集充足数据支撑方案
- [ ] 已制定详细实施方案
- [ ] 已获得用户审批确认
### 2. SOLID原则强制执行
**所有架构设计和代码实现必须遵循SOLID原则**
#### 1. 单一职责原则SRP - Single Responsibility Principle
- **定义**:一个类/模块只负责一个功能领域的变化
- **实践要点**
- 每个包/模块职责单一且清晰
- 工厂负责创建,适配器负责转换,具体实现负责执行
- 避免"上帝类"或"万能函数"
- 一个模块的修改原因只能有一个
#### 2. 开闭原则OCP - Open-Closed Principle
- **定义**:对扩展开放,对修改封闭
- **实践要点**
- 添加新功能通过扩展实现,不修改现有代码
- 使用接口和抽象类定义扩展点
- 新增实现只需创建新文件,无需修改旧代码
- 避免使用大量 switch/if-else 判断类型
#### 3. 里氏替换原则LSP - Liskov Substitution Principle
- **定义**:子类必须能够替换父类而不影响程序正确性
- **实践要点**
- 所有实现同一接口的类必须可互换
- 接口契约必须保持一致
- 不违反接口定义的前置条件和后置条件
- 调用方不应关心具体实现类型
#### 4. 接口隔离原则ISP - Interface Segregation Principle
- **定义**:客户端不应该依赖它不需要的接口
- **实践要点**
- 接口应该小而专注,只包含必要方法
- 避免臃肿的接口定义
- 根据客户端需求定义最小接口
- 大接口应拆分为多个小接口
#### 5. 依赖倒置原则DIP - Dependency Inversion Principle
- **定义**:高层模块不应该依赖低层模块,两者都应该依赖抽象
- **实践要点**
- 依赖接口而不是具体实现
- 通过依赖注入传递依赖
- 抽象层不依赖具体层
- 具体实现可以随时替换
#### SOLID原则检查清单
**设计新功能前必须回答**
- [ ] **SRP**:每个模块的职责是否单一明确?
- [ ] **OCP**:添加新功能是否需要修改现有代码?
- [ ] **LSP**:所有实现是否可以互换使用?
- [ ] **ISP**:接口是否臃肿,是否包含不必要的方法?
- [ ] **DIP**:是否依赖抽象而不是具体实现?
**违反SOLID原则的后果**
- 代码耦合度高,难以维护
- 功能扩展需要大量修改现有代码
- 测试困难,无法进行单元测试
- 技术债务快速累积
### 3. 功能版本迭代限制
**禁止版本迭代**: 对于存量功能严格禁止版本迭代v1、v2、v3
**核心原则**
- **就地更新**: 所有改进必须直接修改现有代码
- **用户主导**: 只有用户明确要求才能创建新版本
- **单一实现**: 每个功能只能有一个实现版本
- **向后兼容**: 必须保持向后兼容
- **清理废弃**: 必须版本迭代时同时清理旧代码
### 4. 任务解析与影响分析
**任务前置分析原则**: 执行任何任务前,必须先进行全面分析
#### 文件影响评估
- **主要修改文件**: 直接需要编辑的核心文件
- **关联影响文件**: 可能受影响需同步更新的文件
- **测试相关文件**: 需要更新或新增的测试文件
- **配置文件**: 可能需要调整的配置
#### 依赖关系分析
- **文件依赖**: 识别导入/引用关系
- **功能依赖**: 识别模块间调用关系
#### 重复定义检查
添加任何新定义前,必须先检查:
```bash
# 检查函数/类/接口定义
grep -r "functionName\|className" --include="*.[ext]"
```
**原则**: 避免重复实现,优先复用现有代码
### 5. 前置条件信任原则
**避免重复验证**: 信任调用链的前置条件
```[语言]
// ❌ 过度防御:重复验证已验证数据
function process(data) {
if (!data) return // 前层已验证
if (!data.field) return // 前层已验证
// ...
}
// ✅ 信任前置条件
function process(data) {
// 前置条件: 调用方已验证
const value = data.field
// 业务逻辑...
}
```
**分层职责**
- **入口层**: 负责验证和防护
- **业务层**: 信任前置条件,专注业务
- **数据层**: 处理持久化,不做业务验证
---
## 交互规范(强制)
### 沟通原则
- **中文响应**: 所有响应使用中文
- **详细说明**: 提供清晰的操作步骤和说明
- **操作确认**: 重要操作前进行确认
- **透明度**: 如实汇报进度、问题和风险
### 主动提问机制(强制)
- **数据不足时提问**: 缺乏必要信息时,必须使用 `AskUserQuestion` 工具询问用户
- **明确性优先**: 遇到模糊需求时,通过提问明确用户意图
- **必须提问的场景**:
- 技术方案有多种实现路径需权衡时
- 需要删除或修改重要功能/数据时
- 配置参数会显著影响系统行为时
- 不确定用户具体需求时
- 设计决策可能影响架构或性能时
- 存在向后兼容性风险时
- **提问质量要求**:
- 问题应具体、聚焦
- 提供2-4个清晰选项
- 每个选项附带详细说明
- 说明各选项的影响和优缺点
- **等待确认**: 提问后必须等待用户回答
### 文件创建限制(强制)
- **禁止主动创建文档**: 不主动创建文档文件(*.md)或README除非用户明确要求
- **优先编辑**: 优先编辑现有文件而非创建新文件
- **必要性原则**: 只创建绝对必要的文件
- **用户确认**: 创建新文件前必须征得用户同意
---
**最后更新**: [日期]
```
```monorepo-template
# CLAUDE.md 模板 (Monorepo)
> Monorepo 项目的统一开发规范和最佳实践。包含多个子项目的协作规范。
---
## 项目概述
**[项目名称]** - [项目一句话描述]
### 项目类型
**Monorepo** ([Monorepo类型]: 前后端分离 / 多服务架构 / Workspace 管理等)
### 项目架构Monorepo
**整体架构**:
```
Monorepo 根目录
├── [子项目1路径] - [子项目1名称] ([技术栈])
├── [子项目2路径] - [子项目2名称] ([技术栈])
└── [子项目N路径] - [子项目N名称] ([技术栈])
```
**子项目详情**:
#### [子项目1名称] (`[子项目1路径]`)
- **技术栈**: [框架] + [语言]
- **职责**: [项目职责描述]
- **主要目录**:
- `src/` - 源代码
- `test/` - 测试文件
- [其他关键目录]
- **数据存储**: [数据库/缓存技术]
- **架构模式**: [架构模式]
#### [子项目2名称] (`[子项目2路径]`)
- **技术栈**: [框架] + [语言]
- **职责**: [项目职责描述]
- **主要目录**:
- `src/` - 源代码
- `test/` - 测试文件
- [其他关键目录]
- **数据存储**: [数据库/缓存技术]
- **架构模式**: [架构模式]
**项目间关系**:
- [子项目1] → [子项目2]: [关系描述,如 API 调用]
- [子项目2] → [数据存储]: [关系描述]
### 核心技术栈
**整体技术栈**:
- **语言**: [所有使用的语言,去重]
- **框架**: [所有使用的框架,去重]
- **数据存储**: [所有数据存储技术,去重]
- **代码风格**: [统一的命名规范,或注明差异]
---
## 测试规范
- 各子项目测试覆盖率 > 80%
- 使用 Mock 模拟外部依赖和跨项目依赖
- Mock 数据存放在各子项目的 `test/data/` 目录
- 测试文件存放在各子项目的 `test/` 目录
- 集成测试放在根目录 `integration-tests/` 目录
---
## 架构规则(强制)
### Monorepo 管理规则
1. **子项目独立性**
- ✅ 每个子项目应该能独立构建和测试
- ✅ 子项目间的依赖应该明确声明
- ❌ 禁止直接引用其他子项目的内部实现
- ❌ 禁止循环依赖
2. **共享代码管理**
- ✅ 共享工具库放在 `packages/` 或 `libs/` 目录
- ✅ 共享类型定义统一管理
- ❌ 禁止复制粘贴代码到多个子项目
3. **版本控制策略**
- ✅ 使用统一的版本管理工具(如 Lerna、pnpm workspaces
- ✅ 子项目版本同步或独立管理(根据实际情况)
### 层职责定义
**[子项目1名称]**:
- **[Layer 1]**: ✅ [应该做的] / ❌ [不应该做的]
- **[Layer 2]**: ✅ [应该做的] / ❌ [不应该做的]
**[子项目2名称]**:
- **[Layer 1]**: ✅ [应该做的] / ❌ [不应该做的]
- **[Layer 2]**: ✅ [应该做的] / ❌ [不应该做的]
### 开发规则
1. **命名规范** - [统一命名规范,或注明各子项目差异]
2. **依赖管理** - 使用 workspace 特性管理子项目间依赖
3. **错误处理** - [统一错误处理机制]
4. **版本控制** - Git提交必须使用 AskUserQuestion 工具询问用户同意
5. **禁止行为** - [明确禁止的操作]
- 禁止子项目间的紧耦合
- 禁止绕过 API 直接访问其他子项目的数据库
### Claude Code 工具使用规范
**AI 必须使用的工具**
- **AskUserQuestion**: 数据不足或需要决策时,必须主动询问用户
- **TodoWrite**: 跟踪多步骤任务的进度,及时更新任务状态
- **Read/Grep/Glob**: 修改前必须先分析现有代码,避免重复定义
- **跨项目影响分析**: 修改子项目代码时,必须分析对其他子项目的影响
**Token 管理规范(强制)**
在开始每个 todo 任务前,必须评估剩余 token 是否足够完成该任务:
1. **评估标准**
- 当前剩余 token < 30000存在风险
- 当前剩余 token < 20000高风险
- 当前剩余 token < 10000极高风险
2. **风险处理流程**
**如果存在风险**,必须使用 AskUserQuestion 工具询问用户:
```yaml
question: "⚠️ Token 预警:当前剩余 [X] tokens即将开始「[Todo任务名称]」可能存在 token 不足风险。您希望如何处理?"
header: "Token 管理"
multiSelect: false
options:
- label: "继续执行当前任务"
description: "继续完成当前任务,可能需要在新会话中继续未完成的工作"
- label: "生成进度总结文档"
description: "生成包含当前进度总结和剩余待办事项实施方案的文档,便于在新会话中继续"
```
3. **生成进度总结文档**(用户选择选项 2 时):
创建文档:`docs/progress/YYYY-MM-DD-HH-MM-[任务名称]-进度总结.md`
文档必须包含:
```markdown
# [任务名称] - 进度总结与实施方案
**创建时间**: YYYY-MM-DD HH:MM
**当前状态**: 进行中
**完成度**: X/Y 个任务
**项目类型**: Monorepo
---
## 一、已完成任务
### 1.1 任务清单
- [x] 任务 1 - 完成情况描述
- [x] 任务 2 - 完成情况描述
- [x] 任务 3 - 完成情况描述
### 1.2 关键成果
- **成果 1**: 具体内容和路径
- **成果 2**: 具体内容和路径
- **成果 3**: 具体内容和路径
### 1.3 已修改文件Monorepo
```
[子项目1]/path/to/file1.ext - 修改内容描述
[子项目2]/path/to/file2.ext - 修改内容描述
共享库/path/to/shared.ext - 修改内容描述
```
### 1.4 跨项目影响
- **[子项目1]**: 影响描述
- **[子项目2]**: 影响描述
- **共享代码**: 影响范围
---
## 二、剩余待办任务
### 2.1 待办清单
- [ ] 任务 4 - 详细描述(涉及子项目:[列表]
- [ ] 任务 5 - 详细描述(涉及子项目:[列表]
- [ ] 任务 6 - 详细描述(涉及子项目:[列表]
### 2.2 实施方案
#### 任务 4: [任务名称]
**目标**: [具体目标]
**涉及子项目**: [子项目列表]
**步骤**:
1. [详细步骤 1]
2. [详细步骤 2]
3. [详细步骤 3]
**需要修改的文件**:
- `[子项目1]/path/to/file1.ext` - [修改说明]
- `[子项目2]/path/to/file2.ext` - [修改说明]
- `共享库/path/to/shared.ext` - [修改说明]
**跨项目影响**:
- [子项目1]: [影响说明]
- [子项目2]: [影响说明]
**注意事项**:
- [注意点 1]
- [注意点 2]
#### 任务 5: [任务名称]
... (同上格式)
---
## 三、技术背景和上下文
### 3.1 Monorepo 架构
```
[展示 monorepo 结构和子项目关系]
```
### 3.2 子项目信息
- **[子项目1]**: [技术栈] - [职责]
- **[子项目2]**: [技术栈] - [职责]
### 3.3 重要约束
- [约束 1]
- [约束 2]
- [Monorepo 特定约束]
### 3.4 已知问题
- [问题 1 及解决方案]
- [问题 2 及解决方案]
---
## 四、继续工作指南
### 4.1 快速启动
在新会话中执行以下步骤:
1. 阅读本文档了解当前进度
2. 使用 TodoWrite 工具恢复任务列表
3. 从「任务 4」开始继续执行
4. 注意跨项目影响分析
### 4.2 验证检查清单
开始前请确认:
- [ ] 已理解所有已完成任务的内容
- [ ] 已查看所有修改过的文件(包括所有子项目)
- [ ] 已理解剩余任务的实施方案
- [ ] 已了解 Monorepo 架构和子项目关系
- [ ] 已了解跨项目影响范围
---
**🤖 Generated with Claude Code**
```
4. **文档生成后**
- 输出文档路径
- 提示用户在新会话中使用 `@文档路径` 继续工作
- 优雅结束当前会话
**最佳实践**
- 定期评估 token 使用情况
- 在大型任务开始前进行评估
- Monorepo 项目由于涉及多个子项目,通常需要更多 tokens
- 预留至少 20000 tokens 的安全边际
- 及时保存进度,避免工作丢失
---
## 核心开发实践(强制)
### 1. 代码修改前的分析(强制)
**所有代码修改前,必须先完成深度分析,理解 Monorepo 架构后再设计方案。**
#### 调用链路分析要点Monorepo
```
用户请求 → [子项目1入口] → [子项目1业务逻辑] → [跨项目API调用] → [子项目2] → [数据存储]
```
必须分析:
- **入口点**: 请求从哪个子项目的哪个端点进入
- **跨项目调用**: 数据如何在子项目间流转
- **依赖关系**: 各子项目之间的依赖
- **错误传播**: 错误如何跨项目传播
- **数据一致性**: 跨项目的事务和一致性保证
#### 方案设计原则: KISS
设计前必须回答4个问题:
1. **"这是真问题还是臆想的?"** - 拒绝过度设计
2. **"有更简单的方法吗?"** - 永远寻找最简方案
3. **"会破坏什么吗?"** - 向后兼容是铁律,考虑对所有子项目的影响
4. **"真的需要这个功能吗?"** - 确认功能必要性
**性能要求**:
- 最小化跨项目通信次数
- 优先使用批量操作
- 合理使用缓存减少跨项目调用
- 避免不必要的数据复制
**代码简洁性**:
- 能用30行解决绝不写300行
- 复用现有代码和共享库
- 函数职责单一
#### 数据驱动的方案设计(强制)
**所有方案必须有充足的数据支撑**
数据充足性判断:
- ✅ 是否完整理解现有代码实现逻辑?
- ✅ 是否掌握各子项目之间的调用关系?
- ✅ 是否了解跨项目的性能瓶颈?
- ✅ 是否分析业界 Monorepo 最佳实践?
- ✅ 是否评估不同方案优劣?
**数据不足时的处理**:
```
⚠️ 我没有足够的信心设计最佳方案
需要以下数据:
1. [具体需要的数据1]
2. [具体需要的数据2]
...
请提供这些数据或告诉我如何获取。
```
**禁止**:
- ❌ 基于猜测或假设进行方案设计
- ❌ 数据不足时强行给出方案
- ❌ 使用"可能"、"也许"等不确定词汇描述关键决策
- ❌ 忽视跨项目影响
#### 方案审批流程(强制)
**在实施任何代码修改前,必须先获得用户审批**:
**工作流程**:
1. **分析阶段**: AI 使用只读工具(Read/Grep/Glob)深度分析所有相关子项目的代码
2. **方案设计**: 制定详细的实施方案,包括跨项目影响分析
3. **展示方案**: 向用户清晰展示方案,等待批准
4. **执行修改**: 获得批准后才开始实际修改代码
**方案文档要求**:
1. **提交方案设计文档**,包含:
- 完整调用链路分析(包括跨项目调用)
- 问题诊断和根因分析
- **支撑数据和分析**(必须包含)
- 方案设计(架构图、时序图、代码片段)
- KISS原则4问题的回答
- 性能影响评估(特别是跨项目通信)
- **跨项目影响分析**(列出所有受影响的子项目)
- 风险分析和缓解措施
- **文档保存**: 保存到 `docs/todo/YYYY-MM-DD-HH-MM-功能名称-方案.md`
2. **等待用户确认** - 批准后方可开始实施
3. **实施** - 严格按照批准方案执行
#### 分析检查清单
开始编码前必须完成:
- [ ] 已完整追踪调用链路(包括跨项目调用)
- [ ] 已理解所有涉及子项目的职责
- [ ] 已识别所有跨项目数据传递点
- [ ] 已回答KISS原则4个问题
- [ ] 已收集充足数据支撑方案
- [ ] 已分析对所有子项目的影响
- [ ] 已制定详细实施方案
- [ ] 已获得用户审批确认
### 2. SOLID原则强制执行
**所有架构设计和代码实现必须遵循SOLID原则**
**Monorepo 特别注意**
- 在 Monorepo 中SOLID 原则不仅适用于单个子项目内部,也适用于子项目之间的关系
- 子项目间的接口设计同样需要遵循 SOLID 原则
#### 1. 单一职责原则SRP - Single Responsibility Principle
- **定义**:一个类/模块只负责一个功能领域的变化
- **实践要点**
- 每个包/模块职责单一且清晰
- 工厂负责创建,适配器负责转换,具体实现负责执行
- 避免"上帝类"或"万能函数"
- 一个模块的修改原因只能有一个
- **Monorepo 应用**
- 每个子项目应该有明确且单一的职责
- 避免子项目职责过于复杂或模糊
#### 2. 开闭原则OCP - Open-Closed Principle
- **定义**:对扩展开放,对修改封闭
- **实践要点**
- 添加新功能通过扩展实现,不修改现有代码
- 使用接口和抽象类定义扩展点
- 新增实现只需创建新文件,无需修改旧代码
- 避免使用大量 switch/if-else 判断类型
- **Monorepo 应用**
- 添加新子项目不应该需要修改现有子项目
- 子项目间的 API 应该稳定,通过版本控制实现兼容
#### 3. 里氏替换原则LSP - Liskov Substitution Principle
- **定义**:子类必须能够替换父类而不影响程序正确性
- **实践要点**
- 所有实现同一接口的类必须可互换
- 接口契约必须保持一致
- 不违反接口定义的前置条件和后置条件
- 调用方不应关心具体实现类型
- **Monorepo 应用**
- 如果多个子项目实现相同的接口,它们应该可以互相替换
- 共享接口的契约必须严格遵守
#### 4. 接口隔离原则ISP - Interface Segregation Principle
- **定义**:客户端不应该依赖它不需要的接口
- **实践要点**
- 接口应该小而专注,只包含必要方法
- 避免臃肿的接口定义
- 根据客户端需求定义最小接口
- 大接口应拆分为多个小接口
- **Monorepo 应用**
- 子项目之间的 API 应该精简,只暴露必要的接口
- 避免一个子项目暴露过多不相关的功能
#### 5. 依赖倒置原则DIP - Dependency Inversion Principle
- **定义**:高层模块不应该依赖低层模块,两者都应该依赖抽象
- **实践要点**
- 依赖接口而不是具体实现
- 通过依赖注入传递依赖
- 抽象层不依赖具体层
- 具体实现可以随时替换
- **Monorepo 应用**
- 子项目之间应该通过定义良好的接口通信
- 避免直接依赖其他子项目的具体实现
- 使用共享接口定义实现解耦
#### SOLID原则检查清单
**设计新功能前必须回答**
- [ ] **SRP**:每个模块的职责是否单一明确?(包括子项目级别)
- [ ] **OCP**:添加新功能是否需要修改现有代码?(包括其他子项目)
- [ ] **LSP**:所有实现是否可以互换使用?(包括跨子项目)
- [ ] **ISP**:接口是否臃肿,是否包含不必要的方法?(包括跨项目 API
- [ ] **DIP**:是否依赖抽象而不是具体实现?(包括子项目间依赖)
**违反SOLID原则的后果**
- 代码耦合度高,难以维护
- 功能扩展需要大量修改现有代码
- 子项目间紧耦合,难以独立开发和部署
- 测试困难,无法进行单元测试
- 技术债务快速累积
### 3. 功能版本迭代限制
**禁止版本迭代**: 对于存量功能,严格禁止版本迭代(v1、v2、v3)
**核心原则**:
- **就地更新**: 所有改进必须直接修改现有代码
- **用户主导**: 只有用户明确要求才能创建新版本
- **单一实现**: 每个功能只能有一个实现版本
- **向后兼容**: 必须保持向后兼容,考虑所有依赖该功能的子项目
- **清理废弃**: 必须版本迭代时同时清理旧代码
### 4. 任务解析与影响分析
**任务前置分析原则**: 执行任何任务前,必须先进行全面分析
#### 文件影响评估Monorepo
- **主要修改文件**: 直接需要编辑的核心文件
- **关联影响文件**: 同一子项目中可能受影响的文件
- **跨项目影响文件**: 其他子项目中可能受影响的文件
- **共享代码影响**: 共享库和工具的影响范围
- **测试相关文件**: 需要更新或新增的测试文件(包括集成测试)
- **配置文件**: 可能需要调整的配置
#### 依赖关系分析Monorepo
- **子项目内依赖**: 识别导入/引用关系
- **跨项目依赖**: 识别子项目间的调用关系
- **共享代码依赖**: 识别对共享库的依赖
#### 重复定义检查
添加任何新定义前,必须先检查所有子项目:
```bash
# 检查所有子项目中的函数/类/接口定义
grep -r "functionName\|className" --include="*.[ext]" [所有子项目路径]
```
**原则**: 避免重复实现,优先复用现有代码和共享库
### 5. 前置条件信任原则
**避免重复验证**: 信任调用链的前置条件
**分层职责**:
- **入口层**: 负责验证和防护(通常在面向用户的子项目)
- **业务层**: 信任前置条件,专注业务
- **数据层**: 处理持久化,不做业务验证
- **跨项目调用**: 调用其他子项目的 API 时,信任其已完成验证
---
## 交互规范(强制)
### 沟通原则
- **中文响应**: 所有响应使用中文
- **详细说明**: 提供清晰的操作步骤和说明
- **操作确认**: 重要操作前进行确认
- **透明度**: 如实汇报进度、问题和风险
- **跨项目影响说明**: 修改代码时明确说明对其他子项目的影响
### 主动提问机制(强制)
- **数据不足时提问**: 缺乏必要信息时,必须使用 `AskUserQuestion` 工具询问用户
- **明确性优先**: 遇到模糊需求时,通过提问明确用户意图
- **必须提问的场景**:
- 技术方案有多种实现路径需权衡时
- 需要删除或修改重要功能/数据时
- 修改可能影响多个子项目时
- 配置参数会显著影响系统行为时
- 不确定用户具体需求时
- 设计决策可能影响架构或性能时
- 存在跨项目向后兼容性风险时
- **提问质量要求**:
- 问题应具体、聚焦
- 提供2-4个清晰选项
- 每个选项附带详细说明
- 说明各选项的影响和优缺点(包括对各子项目的影响)
- **等待确认**: 提问后必须等待用户回答
### 文件创建限制(强制)
- **禁止主动创建文档**: 不主动创建文档文件(*.md)或README除非用户明确要求
- **优先编辑**: 优先编辑现有文件而非创建新文件
- **必要性原则**: 只创建绝对必要的文件
- **用户确认**: 创建新文件前必须征得用户同意
---
## Monorepo 特定规范
### 跨项目通信规范
1. **API 调用规范**
- 使用明确定义的 API 接口
- API 变更必须遵循版本管理策略
- 禁止直接访问其他子项目的内部实现
2. **共享代码规范**
- 共享代码放在独立的包中
- 共享代码必须有完善的文档和测试
- 修改共享代码必须评估对所有依赖方的影响
3. **数据共享规范**
- 优先使用 API 传递数据
- 必要时可共享数据库,但需明确所有权
- 禁止直接读写其他子项目的数据表
### 构建和部署规范
1. **独立构建**: 每个子项目应该能独立构建
2. **依赖顺序**: 明确子项目的构建依赖顺序
3. **并行构建**: 利用 workspace 工具进行并行构建
4. **增量构建**: 只构建有变更的子项目
---
**最后更新**: [日期]
```
---
## 执行步骤
### 1. 前置检查
a. 检查当前目录是否已存在 CLAUDE.md 文件
- 使用 Read 工具尝试读取 ./CLAUDE.md
- 如果文件存在,使用 AskUserQuestion 询问用户是否要覆盖:
- 选项 1: "备份后覆盖"(推荐) - 将现有文件备份为 CLAUDE.md.backup-{timestamp}
- 选项 2: "直接覆盖" - 直接覆盖现有文件
- 选项 3: "取消操作" - 退出命令
- 如果用户选择取消,立即终止执行并输出提示信息
### 1.5 检测 Monorepo 结构
**目标**: 智能检测项目是否为 Monorepo包含多个子项目
#### a. 检测显式 Monorepo 配置
使用 Read 工具检查是否有 Monorepo 配置:
```bash
# 1. 检测 Node.js workspaces
Read package.json → 检查 workspaces 字段
- 如果存在 workspaces 数组 → isMonorepo = true, confidence = "high", type = "workspaces"
# 2. 检测 Lerna
Read lerna.json → 是否存在
- 如果存在 → isMonorepo = true, confidence = "high", type = "lerna"
# 3. 检测 Turborepo
Read turbo.json → 是否存在
- 如果存在 → isMonorepo = true, confidence = "high", type = "turborepo"
# 4. 检测 pnpm workspaces
Read pnpm-workspace.yaml → 是否存在
- 如果存在 → isMonorepo = true, confidence = "high", type = "pnpm-workspaces"
```
#### b. 检测典型目录结构
如果没有检测到显式配置,使用 Glob 检测常见目录组合:
```bash
# 检测前后端分离
Glob: frontend
Glob: backend
- 如果同时存在 → 检查是否有独立配置文件
- frontend/package.json 或 frontend/其他配置 存在
- backend/go.mod 或 backend/其他配置 存在
- 如果是 → isMonorepo = true, confidence = "medium", type = "frontend-backend"
# 检测 client-server 结构
Glob: client
Glob: server
- 同上逻辑
# 检测 web-api 结构
Glob: web
Glob: api
- 同上逻辑
# 检测 Node.js packages/apps 结构
Glob: packages/*/package.json
Glob: apps/*/package.json
- 如果找到多个≥2个子项目 → isMonorepo = true, confidence = "medium", type = "multi-packages"
# 检测 Go 多应用结构
Glob: cmd/*
- 如果 cmd 目录下有多个子目录≥2个
- 且根目录有 go.mod
- → isMonorepo = true, confidence = "medium", type = "go-multi-app"
# 检测 Python/其他多服务结构
Glob: services/*/
- 如果 services 目录下有多个子目录≥2个
- 且子目录包含配置文件
- → isMonorepo = true, confidence = "medium", type = "multi-services"
```
#### c. 检测多配置文件(兜底检测)
如果以上都未检测到,搜索所有配置文件:
```bash
# 搜索所有主要配置文件
Glob: **/package.json
Glob: **/go.mod
Glob: **/pyproject.toml
Glob: **/pom.xml
Glob: **/Cargo.toml
# 统计配置文件数量和位置
如果在不同的一级子目录中找到多个配置文件≥2个:
- isMonorepo = true
- confidence = "low" # 需要用户确认
- type = "multi-project"
```
#### d. 结果记录
创建 Monorepo 检测结果数据结构:
```javascript
MonorepoDetection = {
isMonorepo: true/false,
confidence: "high" | "medium" | "low" | null,
type: "workspaces" | "lerna" | "turborepo" | "pnpm-workspaces" |
"frontend-backend" | "multi-packages" | "go-multi-app" |
"multi-services" | "multi-project" | null,
subProjectPaths: [
"frontend/",
"backend/",
// ... 其他子项目路径
]
}
```
#### e. 用户确认confidence = "low" 时)
如果置信度为 "low",使用 AskUserQuestion 确认:
```yaml
使用 AskUserQuestion:
question: "检测到项目中有多个配置文件,这是一个包含多个子项目的 Monorepo 吗?"
header: "Monorepo 确认"
multiSelect: false
options:
- label: "是,这是一个 Monorepo"
description: "项目包含多个独立的子项目(如前端+后端)"
- label: "否,这是单个项目"
description: "按照单项目模式分析"
```
#### f. 输出检测结果
输出检测摘要:
```
🔍 项目结构检测完成!
📦 项目类型: [Monorepo / 单项目]
🔧 检测方式: [检测到的配置类型]
📂 子项目: [子项目数量] 个
- [子项目1路径]
- [子项目2路径]
...
```
### 2. 项目分析(智能推断)
**核心原则**: 数据驱动,避免猜测。通过分析项目文件自动推断信息,减少用户输入负担。
#### a. 检测项目类型
使用 Read 工具检查项目配置文件:
**Node.js/TypeScript 项目检测**:
```bash
检测文件: package.json
提取信息:
- 项目名称: name 字段
- 项目描述: description 字段
- 语言: 检查 devDependencies 中是否有 typescript
- 框架: 从 dependencies 推断
- "next" → Next.js
- "react" → React
- "vue" → Vue
- "express" → Express
- "nestjs" → NestJS
- 测试框架: 从 devDependencies 推断 (jest, vitest, mocha 等)
- 代码风格: 检查 eslintConfig, prettier 配置
```
**Go 项目检测**:
```bash
检测文件: go.mod
提取信息:
- 项目名称: module 声明
- 语言版本: go 版本行
- 框架: 从 require 推断
- "gin-gonic/gin" → Gin
- "labstack/echo" → Echo
- "gofiber/fiber" → Fiber
检测文件: go.sum (确认依赖)
```
**Python 项目检测**:
```bash
检测文件: pyproject.toml (优先) 或 requirements.txt 或 setup.py
提取信息:
- 项目名称: [project].name 或从目录名推断
- 语言版本: requires-python 字段
- 框架: 从依赖推断
- "fastapi" → FastAPI
- "django" → Django
- "flask" → Flask
- 测试框架: pytest, unittest 等
```
**Java 项目检测**:
```bash
检测文件: pom.xml 或 build.gradle
提取信息:
- 项目名称: artifactId 或 name
- 语言版本: Java version
- 框架: 从依赖推断
- "spring-boot" → Spring Boot
- "micronaut" → Micronaut
- "quarkus" → Quarkus
```
#### b. 分析项目结构
使用 Glob 工具列举项目目录,推断架构模式:
```bash
# 检测顶层目录
检测路径:
- src/, lib/, pkg/ (源代码目录)
- test/, tests/, __tests__/ (测试目录)
- docs/ (文档目录)
架构模式推断:
- 存在 src/controllers, src/services, src/models → 分层架构MVC
- 存在 src/api, src/service, src/logic, src/data → 分层架构(四层)
- 存在 packages/, services/, apps/ → 微服务架构
- 存在 functions/, lambda/ → Serverless
- 否则 → 单体应用
```
#### c. 分析代码风格
使用 Read 工具读取几个代码文件样本:
```bash
# 读取 2-3 个代码文件
# 分析变量命名模式
命名规范检测:
- 检测变量/函数名中的模式
- camelCase: 首字母小写 (userName, getUserData)
- PascalCase: 首字母大写 (UserName, GetUserData)
- snake_case: 下划线连接 (user_name, get_user_data)
Lint 配置检测:
- .eslintrc.* (JavaScript/TypeScript)
- .golangci.yml (Go)
- .flake8, pyproject.toml (Python)
- checkstyle.xml (Java)
```
#### d. 分析数据存储
使用 Grep 工具搜索数据库相关导入和配置:
```bash
# 搜索数据库导入语句
关键词:
- "mysql", "pg", "postgres" → PostgreSQL/MySQL
- "mongodb", "mongo" → MongoDB
- "redis" → Redis
- "elasticsearch", "es" → Elasticsearch
# 搜索配置文件
检查:
- docker-compose.yml (服务定义)
- .env.example (环境变量示例)
- config/ 目录下的配置文件
```
#### e. 检测测试配置
```bash
检测测试目录:
- test/, tests/, __tests__/ 是否存在
- 测试文件数量和覆盖情况
检测测试配置:
- jest.config.js, vitest.config.ts (JS/TS)
- go.mod 中的测试依赖
- pytest.ini, tox.ini (Python)
- pom.xml 中的测试配置 (Java)
推断测试要求:
- 存在完善测试配置 + 多个测试文件 → 建议 >80%
- 存在基础测试 → 建议 >60%
- 无测试 → 不强制要求
```
#### f. 记录推断结果
创建推断结果数据结构,记录每项信息的值和置信度:
```javascript
分析结果 = {
projectName: {
value: "从配置文件读取的名称",
source: "package.json",
confidence: "high" // high: 确定 | medium: 较确定 | low: 需确认 | none: 未检测到
},
projectDescription: {
value: "从配置文件读取的描述",
source: "package.json",
confidence: "medium" // 描述可能不准确,建议用户确认
},
language: {
value: "TypeScript 5.0+",
source: "package.json devDependencies",
confidence: "high"
},
framework: {
value: "Next.js",
source: "package.json dependencies",
confidence: "high"
},
storage: {
value: ["PostgreSQL", "Redis"],
source: "grep 搜索和 docker-compose.yml",
confidence: "medium"
},
architecture: {
value: "分层架构",
source: "目录结构分析",
confidence: "medium"
},
namingStyle: {
value: "驼峰命名camelCase",
source: "代码文件分析",
confidence: "high"
},
testCoverage: {
value: ">80%",
source: "测试配置和文件检测",
confidence: "medium"
},
gitApproval: {
value: null, // 这个需要用户决策
source: null,
confidence: "none"
}
}
```
#### g. 输出分析结果
输出分析摘要供用户查看:
```
🔍 项目分析完成!
📊 自动检测结果:
✅ 项目类型: TypeScript 项目 (来源: package.json)
✅ 项目名称: my-app (来源: package.json)
✅ 开发语言: TypeScript 5.0+ (来源: package.json)
✅ 主要框架: Next.js (来源: dependencies)
✅ 数据存储: PostgreSQL, Redis (来源: docker-compose.yml)
✅ 架构模式: 分层架构 (来源: 目录结构)
✅ 命名规范: 驼峰命名 (来源: 代码分析)
⚠️ 测试要求: 建议 >80% (来源: 测试配置)
❓ 需要您确认的信息:
- 项目描述 (自动检测可能不准确)
- Git 提交流程 (需要您的决策)
```
### 2.5 分析子项目Monorepo 场景)
**仅在步骤 1.5 检测到 Monorepo 时执行此步骤**
#### a. 遍历子项目
对 MonorepoDetection.subProjectPaths 中的每个子项目路径执行分析:
```bash
对于每个子项目路径 (例如 "frontend/", "backend/"):
1. 进入子项目目录上下文(相对路径)
2. 检测项目类型(重复步骤 2.a 的逻辑,但在子目录中)
- 读取 [子项目路径]/package.json
- 读取 [子项目路径]/go.mod
- 读取 [子项目路径]/pyproject.toml
- 读取 [子项目路径]/pom.xml
- ... 其他配置文件
3. 提取项目信息(重复步骤 2.a 的逻辑)
- 项目名称
- 项目描述
- 语言和框架
- 测试框架
- 代码风格
4. 分析项目结构(重复步骤 2.b 的逻辑)
- 使用 Glob 列举子项目的子目录
- 推断子项目的架构模式
5. 分析代码风格(重复步骤 2.c 的逻辑)
- 读取子项目中的代码文件样本
6. 分析数据存储(重复步骤 2.d 的逻辑)
- 搜索数据库相关导入
- 检查子项目的配置文件
7. 检测测试配置(重复步骤 2.e 的逻辑)
- 检测子项目的测试目录
- 检测子项目的测试配置
```
#### b. 汇总子项目分析结果
创建子项目分析结果数据结构:
```javascript
SubProjectsAnalysis = [
{
path: "frontend/",
projectName: {
value: "Web Frontend",
source: "frontend/package.json",
confidence: "high"
},
projectDescription: {
value: "用户界面应用",
source: "frontend/package.json",
confidence: "medium"
},
language: {
value: "TypeScript 5.0+",
source: "frontend/package.json",
confidence: "high"
},
framework: {
value: "Next.js 14",
source: "frontend/package.json dependencies",
confidence: "high"
},
architecture: {
value: "组件化架构",
source: "目录结构分析",
confidence: "medium"
},
namingStyle: {
value: "驼峰命名 (camelCase)",
source: "代码分析",
confidence: "high"
},
storage: {
value: null,
source: null,
confidence: "none" // 前端通常不直接访问数据库
},
testCoverage: {
value: ">80%",
source: "测试配置",
confidence: "medium"
}
},
{
path: "backend/",
projectName: {
value: "API Server",
source: "backend/go.mod",
confidence: "high"
},
projectDescription: {
value: "RESTful API 服务",
source: "推断",
confidence: "low"
},
language: {
value: "Go 1.21+",
source: "backend/go.mod",
confidence: "high"
},
framework: {
value: "Gin",
source: "backend/go.mod require",
confidence: "high"
},
architecture: {
value: "分层架构",
source: "目录结构分析",
confidence: "medium"
},
namingStyle: {
value: "驼峰命名 (camelCase)",
source: "代码分析",
confidence: "high"
},
storage: {
value: ["PostgreSQL", "Redis"],
source: "grep 搜索和配置文件",
confidence: "medium"
},
testCoverage: {
value: ">80%",
source: "测试配置",
confidence: "medium"
}
}
// ... 其他子项目
]
```
#### c. 推断项目间关系
基于子项目类型和配置,推断项目间的关系:
```javascript
ProjectRelations = [
{
from: "frontend/",
to: "backend/",
relation: "API 调用",
confidence: "high", // 基于前端是 web 应用,后端是 API 服务
description: "前端通过 HTTP API 调用后端服务"
}
// 可以根据配置文件中的 API 地址等信息进一步确认
]
```
#### d. 限制子项目数量
为了保证性能和可维护性:
```bash
如果检测到的子项目数量 > 10:
使用 AskUserQuestion 让用户选择:
question: "检测到 [数量] 个子项目,数量较多。您希望如何处理?"
header: "子项目数量"
multiSelect: false
options:
- label: "分析前 10 个子项目"
description: "只分析最重要的 10 个子项目"
- label: "让我手动选择"
description: "展示所有子项目,让我选择要分析的"
- label: "全部分析(不推荐)"
description: "可能需要较长时间"
```
#### e. 输出子项目分析摘要
```
📦 Monorepo 子项目分析完成!
共检测到 [数量] 个子项目:
📂 frontend/ - Web Frontend
✅ 语言: TypeScript 5.0+
✅ 框架: Next.js 14
✅ 架构: 组件化架构
📂 backend/ - API Server
✅ 语言: Go 1.21+
✅ 框架: Gin
✅ 架构: 分层架构
✅ 数据: PostgreSQL, Redis
🔗 项目关系:
frontend/ → backend/ (API 调用)
```
### 3. 智能信息收集
根据项目分析结果,**只对置信度低或无法推断的信息进行询问**。
#### 询问策略:
**A. confidence = "high" 的信息**:
- ✅ 直接使用,不询问
- 在最终确认时展示给用户
**B. confidence = "medium" 的信息**:
- ⚠️ 作为推荐选项,但仍询问用户确认
- 在选项中标注 "(已检测)"
**C. confidence = "low" 或 "none" 的信息**:
- ❌ 必须询问用户
- 提供常见选项供选择
#### 询问示例:
**场景 1: 项目名称 confidence="high"**
```
不询问,直接使用检测到的值
```
**场景 2: 项目描述 confidence="medium"**
```yaml
使用 AskUserQuestion:
question: "请确认项目描述:"
header: "项目描述"
multiSelect: false
options:
- label: "使用检测到的描述 (已检测)"
description: "Web application for user management"
- label: "Web 应用后端服务"
description: "提供 RESTful API 的后端服务"
- Other: 自定义描述
```
**场景 3: 数据存储 confidence="medium"**
```yaml
使用 AskUserQuestion:
question: "请确认项目使用的数据存储技术(可多选):"
header: "数据存储"
multiSelect: true
options:
- label: "PostgreSQL (已检测)"
description: "关系型数据库"
- label: "Redis (已检测)"
description: "缓存系统"
- label: "MySQL"
description: "关系型数据库"
- Other: 其他存储技术
```
**场景 4: Git 提交流程 confidence="none"**
```yaml
使用 AskUserQuestion:
question: "Git 提交是否需要审批确认?"
header: "提交规范"
multiSelect: false
options:
- label: "需要(使用 AskUserQuestion"
description: "提交前必须询问用户确认"
- label: "不需要"
description: "允许直接提交"
```
#### 分批询问流程:
根据实际需要询问的问题数量,灵活分批:
**如果需要询问 0-2 个问题**: 一次性询问
**如果需要询问 3-5 个问题**: 分 2 批询问
**如果需要询问 6+ 个问题**: 分 3-4 批询问
**优先级排序**:
1. 高优先级: 项目描述、架构模式 (影响模板填充)
2. 中优先级: 数据存储、命名规范 (可能影响规范细节)
3. 低优先级: 测试要求、Git 提交规范 (配置项)
#### Monorepo 策略询问(仅 Monorepo 场景):
**仅在步骤 1.5 检测到 Monorepo 时执行**
在完成常规信息收集后,询问用户如何生成 CLAUDE.md
```yaml
使用 AskUserQuestion:
question: "检测到这是一个 Monorepo 项目,包含 [数量] 个子项目。您希望如何生成 CLAUDE.md"
header: "Monorepo 策略"
multiSelect: false
options:
- label: "只在根目录生成统一的 CLAUDE.md推荐"
description: "生成一个包含所有子项目信息的统一规范文件,便于整体管理"
- label: "为每个子项目生成独立的 CLAUDE.md"
description: "在根目录和每个子项目目录都生成独立的 CLAUDE.md便于各自开发"
- label: "仅为根目录生成,忽略子项目"
description: "按照单项目模式生成,不体现子项目信息"
```
记录用户选择:
- 选项 1 → userStrategy = "unified"
- 选项 2 → userStrategy = "separate"
- 选项 3 → userStrategy = "ignore"
### 4. 生成 CLAUDE.md
根据分析结果和用户确认的信息,执行以下步骤:
**判断项目类型**:
- 如果是单项目 或 userStrategy = "ignore" → 使用**单项目模板**
- 如果是 Monorepo 且 userStrategy = "unified" → 使用**Monorepo 统一模板**
- 如果是 Monorepo 且 userStrategy = "separate" → 使用**Monorepo 统一模板 + 子项目模板**
#### 4.1 单项目场景
a. 从"内置模板"部分提取**单项目模板**内容(```template 和 ``` 之间的内容)
b. 创建变量映射表并进行字符串替换:
- `[项目名称]` → 分析结果中的项目名称(或用户输入)
- `[项目一句话描述]` → 分析结果中的项目描述(或用户输入)
- `[框架名称和版本]` → 分析结果中的框架(或用户选择)
- `[数据库/缓存技术]` → 分析结果中的数据存储(多个则用逗号连接)
- `[语言和版本]` → 分析结果中的开发语言(或用户选择)
- `[命名规范]` → 分析结果中的代码风格(或用户选择)
c. 添加生成时间戳:
- 使用 Bash date 命令获取当前日期
- 替换模板最后的 `[日期]` 为实际日期格式YYYY-MM-DD
d. 根据分析结果和用户配置,调整对应章节:
- 如果测试覆盖率选择"不强制要求",修改"测试规范"章节,删除覆盖率要求
- 如果 Git 提交选择"不需要"审批,修改"版本控制"规则,移除 AskUserQuestion 要求
#### 4.2 Monorepo 场景unified 或 separate
a. 从"内置模板"部分提取**Monorepo 模板**内容(```monorepo-template 和 ``` 之间的内容)
b. 创建根项目变量映射并替换:
- `[项目名称]` → 根项目名称
- `[项目一句话描述]` → 根项目描述
- `[Monorepo类型]` → 检测到的类型(如 "前后端分离"、"多服务架构"等)
- `[子项目数量]` → SubProjectsAnalysis 的长度
c. 生成子项目信息部分:
```markdown
### 项目架构Monorepo
**项目类型**: Monorepo ([Monorepo类型])
**整体架构**:
```
Monorepo 根目录
├── [子项目1路径] - [子项目1名称] ([技术栈])
├── [子项目2路径] - [子项目2名称] ([技术栈])
└── [子项目N路径] - [子项目N名称] ([技术栈])
```
**子项目详情**:
#### [子项目1名称] (`[子项目1路径]`)
- **技术栈**: [框架] + [语言]
- **职责**: [从描述推断或用户提供]
- **主要目录**: [从分析结果提取]
- **数据存储**: [如果有]
- **架构模式**: [分析结果]
#### [子项目2名称] (`[子项目2路径]`)
...
**项目间关系**:
[根据 ProjectRelations 生成]
- [子项目1] → [子项目2]: [关系描述]
```
d. 生成核心技术栈部分(汇总所有子项目):
```markdown
### 核心技术栈
**整体技术栈**:
- **语言**: [去重后的所有语言]
- **框架**: [去重后的所有框架]
- **数据存储**: [去重后的所有数据存储]
- **代码风格**: [统一或列举差异]
```
e. 添加生成时间戳
f. 调整开发规范章节:
- 保留通用的开发规范
- 在必要时添加子项目特定的说明
#### 4.3 Monorepo separate 场景(额外步骤)
如果 userStrategy = "separate",为每个子项目生成独立的 CLAUDE.md
对于每个子项目:
1. 使用单项目模板
2. 填充该子项目的分析数据
3. 添加"父项目引用"章节:
```markdown
## 父项目
本项目是 [根项目名称] Monorepo 的一部分。
**位置**: `[子项目路径]`
**其他子项目**: [列出其他子项目]
完整项目规范请参考根目录的 CLAUDE.md。
```
4. 记录要写入的文件路径:[子项目路径]/CLAUDE.md
### 5. 文件写入
#### 5.1 备份现有文件(如需要)
a. 如果用户在步骤 1 中选择了"备份后覆盖"
- 使用 Bash date 命令生成时间戳格式YYYYMMDDHHmmss
- 使用 Read 工具读取现有的 CLAUDE.md
- 使用 Write 工具将内容写入 CLAUDE.md.backup-{timestamp}
- 输出备份成功信息
#### 5.2 写入根目录 CLAUDE.md
b. 使用 Write 工具将生成的内容写入 ./CLAUDE.md 文件
#### 5.3 写入子项目 CLAUDE.md仅 separate 场景)
如果 userStrategy = "separate"
- 对每个子项目路径
- 使用 Write 工具将子项目的 CLAUDE.md 写入 [子项目路径]/CLAUDE.md
- 输出每个文件的写入成功信息
### 6. 确认完成
输出成功信息,展示完整的配置信息:
#### 6.1 单项目场景
```
✅ 项目规范文件生成成功!
📄 文件位置: ./CLAUDE.md
📅 生成时间: {当前时间}
📊 项目配置摘要:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 项目名称: {项目名称}
✅ 项目描述: {项目描述}
✅ 开发语言: {语言和版本}
✅ 主要框架: {框架}
✅ 数据存储: {数据存储技术}
✅ 架构模式: {架构模式}
✅ 命名规范: {命名规范}
✅ 测试要求: {测试覆盖率}
✅ Git 提交: {是否需要审批}
🎯 自动检测项数: {检测成功的项数}/{总项数}
💡 下一步操作:
1. 查看生成的 CLAUDE.md 文件
2. 根据项目实际情况调整细节
3. 提交到版本控制系统
🤖 Generated with Claude Code
```
#### 6.2 Monorepo 场景unified
```
✅ Monorepo 项目规范文件生成成功!
📄 文件位置: ./CLAUDE.md
📅 生成时间: {当前时间}
📦 Monorepo 信息:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🏗️ 项目类型: Monorepo ({Monorepo类型})
📂 子项目数: {子项目数量}
📊 子项目摘要:
{对每个子项目}
📂 {子项目路径} - {子项目名称}
✅ 语言: {语言}
✅ 框架: {框架}
✅ 架构: {架构模式}
🔗 项目关系:
{项目间关系列表}
🎯 自动检测项数: {检测成功的项数}/{总项数}
💡 下一步操作:
1. 查看生成的 CLAUDE.md 文件
2. 根据各子项目实际情况调整细节
3. 提交到版本控制系统
🤖 Generated with Claude Code
```
#### 6.3 Monorepo 场景separate
```
✅ Monorepo 项目规范文件生成成功!
📄 生成的文件:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📄 ./CLAUDE.md (根目录统一规范)
📄 {子项目1路径}/CLAUDE.md
📄 {子项目2路径}/CLAUDE.md
...
📅 生成时间: {当前时间}
📦 Monorepo 信息:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🏗️ 项目类型: Monorepo ({Monorepo类型})
📂 子项目数: {子项目数量}
📊 子项目摘要:
{对每个子项目}
📂 {子项目路径} - {子项目名称}
✅ 语言: {语言}
✅ 框架: {框架}
✅ 架构: {架构模式}
✅ 独立规范: {子项目路径}/CLAUDE.md
🎯 自动检测项数: {检测成功的项数}/{总项数}
💡 下一步操作:
1. 查看根目录的 CLAUDE.md整体规范
2. 查看各子项目的 CLAUDE.md特定规范
3. 根据实际情况调整细节
4. 提交到版本控制系统
🤖 Generated with Claude Code
```
---
## 跨平台兼容性说明
此命令已优化为完全跨平台兼容:
### ✅ 跨平台特性
1. **内置模板** - 不需要读取外部文件,避免路径问题
2. **Claude Code 工具** - 仅使用跨平台的内置工具
- Read/Write: 文件读写
- Glob: 文件查找(跨平台模式匹配)
- Grep: 内容搜索(跨平台正则表达式)
- AskUserQuestion: 用户交互
- Bash date: 时间戳生成Windows/Mac/Linux 均支持)
3. **最小依赖** - 仅依赖标准工具,无需额外安装
4. **相对路径** - 使用 `./CLAUDE.md` 相对路径,适配所有系统
### 🖥️ 系统支持
-**Windows**: 完全支持(包括 CMD 和 PowerShell
-**macOS**: 完全支持
-**Linux**: 完全支持
-**WSL**: 完全支持
### 📝 核心改进
1. **智能分析优先**
- 自动检测项目配置文件package.json, go.mod, pyproject.toml 等)
- 智能推断技术栈、架构模式、代码风格
- 减少用户输入负担,提升体验
2. **数据驱动决策**
- 基于实际项目数据进行推断
- 避免猜测和假设
- 置信度评估确保准确性
3. **按需询问**
- 只对无法确定的信息询问用户
- 提供检测到的值作为推荐选项
- 灵活的分批询问策略
4. **错误处理**
- 文件读写失败时,提供清晰的错误信息
- 权限不足时,建议用户检查目录权限
- 用户输入验证(避免空值)
5. **灵活性**
- 支持空项目(使用传统询问模式)
- 支持已有项目(智能分析模式)
- 允许用户覆盖自动检测的结果
6. **向后兼容**
- 备份机制确保不会丢失现有配置
- 提供清晰的操作提示和确认
7. **遵循 KISS 原则**
- 不进行过度验证
- 不添加不必要的功能
- 专注于核心任务:分析项目 → 收集信息 → 生成文件
### 🎯 最佳实践
**对于新项目(空目录)**:
- 命令会检测到没有配置文件
- 自动切换到询问模式
- 引导用户完成所有配置
**对于已有项目**:
- 命令会自动分析项目文件
- 提取尽可能多的信息
- 只对不确定的信息进行询问
- 展示分析结果供用户确认
**最佳工作流程**:
1. 在项目根目录运行命令
2. 查看自动分析结果
3. 确认或修改推断的信息
4. 生成规范文件
5. 根据实际需求微调细节