# tdd-guard
**Repository Path**: vcdplus/tdd-guard
## Basic Information
- **Project Name**: tdd-guard
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-01
- **Last Updated**: 2025-09-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# TDD Guard
[](https://www.npmjs.com/package/tdd-guard)
[](https://github.com/nizos/tdd-guard/actions/workflows/ci.yml)
[](https://github.com/nizos/tdd-guard/actions/workflows/security.yml)
[](LICENSE)
为Claude Code提供自动化的测试驱动开发强制执行。
## 概述
TDD Guard确保Claude Code遵循测试驱动开发原则。当您的代理尝试跳过测试或过度实现时,TDD Guard会阻止该操作并解释需要做什么来代替——自动强制执行红-绿-重构周期。
点击观看TDD Guard的实际运行
## 特性
- **测试优先强制执行** - 阻止没有失败测试的实现
- **最小实现** - 防止超出当前测试要求的代码
- **Lint集成** - 使用您的linting规则强制重构
- **多语言支持** - TypeScript, JavaScript, Python, PHP, Go, and Rust
- **可定制规则** - 调整验证规则以匹配您的TDD风格
- **灵活验证** - 使用本地Claude或更快的Anthropic API
- **会话控制** - 在会话中途开启和关闭
## 如何阻止跳过测试或过度实现
TDD Guard通过多层防护体系来确保严格的TDD实践:
### 核心防护机制
#### 1. **钩子集成验证**
- 通过Claude Code的`PreToolUse`钩子,在每次文件操作(Write、Edit、MultiEdit)前自动触发验证
- 验证失败时会阻止操作并提供具体原因和下一步指导
#### 2. **AI驱动智能分析**
- 使用Claude模型分析代码修改是否符合TDD原则
- 基于动态生成的上下文提示进行验证,包括:
- 当前测试状态
- 代码修改内容
- 文件类型识别
- TODO列表状态
#### 3. **严格的TDD周期强制执行**
**Red Phase(红灯阶段)**:
- 只允许一次添加一个测试
- 必须是描述期望行为的失败测试
**Green Phase(绿灯阶段)**:
- 只允许编写刚好使当前测试通过的最小代码
- 根据测试失败类型匹配实现:
- `"not defined"` → 只创建空存根
- `"not a function"` → 只添加方法存根
- 断言错误 → 只实现断言所需的最小逻辑
**Refactor Phase(重构阶段)**:
- 只有在相关测试通过时才允许重构
- 禁止在重构阶段添加新功能
#### 4. **绝对违规检测**
以下情况总是被阻止:
- **多重测试添加**:一次操作添加多个新测试
- **过度实现**:代码超出当前测试要求的实现
- **提前实现**:没有失败测试就编写实现代码
- **带红灯重构**:测试失败时尝试重构
#### 5. **防护措施防止绕过**
- **配置保护**:阻止读取`.claude/tdd-guard/**`目录
- **命令拦截**:阻止使用可能绕过验证的shell命令(如`sed`、`awk`等)
- **忽略模式**:可配置忽略特定文件类型
### 实施建议
1. **正确配置钩子**:在Claude Code中设置`PreToolUse`钩子匹配`Write|Edit|MultiEdit|TodoWrite`
2. **设置防护权限**:
```json
{
"permissions": {
"deny": ["Read(.claude/tdd-guard/**)"]
}
}
```
3. **选择合适的AI模型**:根据需求选择Claude CLI或Anthropic API
4. **配置测试报告器**:根据使用的测试框架安装对应的报告器
这种多层防护确保了严格的TDD实践,强制开发者遵循红-绿-重构周期,防止跳过测试步骤或过度实现未测试的功能。
## 要求
- Node.js 18+
- Claude Code或Anthropic API密钥
- 测试框架 (Jest, Vitest, pytest, PHPUnit, Go 1.24+, or Rust with cargo/cargo-nextest)
## 快速开始
### 1. 安装TDD Guard
```bash
npm install -g tdd-guard
```
### 2. 添加测试报告器
TDD Guard需要从您的测试运行器捕获测试结果。请在下方选择您的语言:
JavaScript/TypeScript
选择您的测试运行器:
#### Vitest
在您的项目中安装[tdd-guard-vitest](https://www.npmjs.com/package/tdd-guard-vitest)报告器:
```bash
npm install --save-dev tdd-guard-vitest
```
添加到您的`vitest.config.ts`:
```typescript
import { defineConfig } from 'vitest/config'
import { VitestReporter } from 'tdd-guard-vitest'
export default defineConfig({
test: {
reporters: [
'default',
new VitestReporter('/Users/username/projects/my-app'),
],
},
})
```
#### Jest
在您的项目中安装[tdd-guard-jest](https://www.npmjs.com/package/tdd-guard-jest)报告器:
```bash
npm install --save-dev tdd-guard-jest
```
添加到您的`jest.config.ts`:
```typescript
import type { Config } from 'jest'
const config: Config = {
reporters: [
'default',
[
'tdd-guard-jest',
{
projectRoot: '/Users/username/projects/my-app',
},
],
],
}
export default config
```
**注意:** 对于Vitest和Jest,当您的测试配置不在项目根目录时(例如,在工作区或monorepo中),请指定项目根路径。这确保TDD Guard可以找到测试结果。有关更多详细信息,请参阅报告器配置文档:
- [Vitest configuration](reporters/vitest/README.md#configuration)
- [Jest configuration](reporters/jest/README.md#configuration)
Python (pytest)
安装[tdd-guard-pytest](https://pypi.org/project/tdd-guard-pytest)报告器:
```bash
pip install tdd-guard-pytest
```
在您的`pyproject.toml`中配置项目根目录:
```toml
[tool.pytest.ini_options]
tdd_guard_project_root = "/Users/username/projects/my-app"
```
**注意:** 当您的测试从子目录运行或在monorepo设置中时,请指定项目根路径。这确保TDD Guard可以找到测试结果。有关替代配置方法(pytest.ini, setup.cfg),请参阅[pytest报告器配置](reporters/pytest/README.md#configuration)。
PHP (PHPUnit)
在您的项目中安装tdd-guard/phpunit报告器:
```bash
composer require --dev tdd-guard/phpunit
```
对于PHPUnit 9.x,添加到您的`phpunit.xml`:
```xml
/Users/username/projects/my-app
```
对于PHPUnit 10.x/11.x/12.x,添加到您的`phpunit.xml`:
```xml
```
**注意:** 当您的phpunit.xml不在项目根目录时(例如,在子目录或monorepo中),请指定项目根路径。这确保TDD Guard可以找到测试结果。报告器将结果保存到`.claude/tdd-guard/data/test.json`。
Go
安装tdd-guard-go报告器:
```bash
go install github.com/nizos/tdd-guard/reporters/go/cmd/tdd-guard-go@latest
```
将`go test -json`输出管道到报告器:
```bash
go test -json ./... 2>&1 | tdd-guard-go -project-root /Users/username/projects/my-app
```
对于Makefile集成:
```makefile
test:
go test -json ./... 2>&1 | tdd-guard-go -project-root /Users/username/projects/my-app
```
**注意:** 报告器充当过滤器,将测试输出原样传递,同时为TDD Guard捕获结果。有关更多详细信息,请参阅[Go报告器配置](reporters/go/README.md#configuration)。
Rust
安装tdd-guard-rust报告器:
```bash
cargo install tdd-guard-rust
```
使用它从`cargo test`或`cargo nextest`捕获测试结果:
```bash
# With nextest (recommended)
cargo nextest run 2>&1 | tdd-guard-rust --project-root /Users/username/projects/my-app --passthrough
# With cargo test
cargo test -- -Z unstable-options --format json 2>&1 | tdd-guard-rust --project-root /Users/username/projects/my-app --passthrough
```
对于Makefile集成:
```makefile
test:
cargo nextest run 2>&1 | tdd-guard-rust --project-root $(PWD) --passthrough
```
**注意:** 报告器充当过滤器,将测试输出原样传递,同时为TDD Guard捕获结果。有关更多详细信息,请参阅[Rust报告器配置](reporters/rust/README.md#configuration)。
### 3. 配置Claude Code钩子
在Claude Code中使用`/hooks`命令:
1. 在Claude Code中输入`/hooks`
2. 选择`PreToolUse - Before tool execution`
3. 选择`+ Add new matcher...`并输入:`Write|Edit|MultiEdit|TodoWrite`
4. 选择`+ Add new hook...`并输入:`tdd-guard`
5. 选择保存位置(推荐项目设置)
请参阅[加强TDD强制执行](docs/enforcement.md)以防止代理绕过验证。
## 配置
**快速设置:**
- [切换命令](docs/quick-commands.md) - 使用`tdd-guard on/off`启用/禁用
- [会话清除](docs/session-clearing.md) - 新会话自动清理
- [自定义指令](docs/custom-instructions.md) - 自定义TDD验证规则
- [忽略模式](docs/ignore-patterns.md) - 控制哪些文件被验证
**高级:**
- [ESLint集成](docs/linting.md) - 自动重构支持
- [AI模型](docs/ai-model.md) - 在Claude CLI和Anthropic API之间切换
**注意:** 如果TDD Guard找不到Claude,请参阅[Claude二进制设置](docs/claude-binary.md)。
## 安全通知
正如[Claude Code钩子文档](https://docs.anthropic.com/en/docs/claude-code/hooks#security-considerations)所述:
> 钩子以您的完整用户权限执行shell命令,无需确认。您负责确保您的钩子安全可靠。Anthropic不对因使用钩子而导致的数据丢失或系统损坏承担责任。
我们出于透明度分享此信息。请在使用钩子之前阅读完整的[安全注意事项](https://docs.anthropic.com/en/docs/claude-code/hooks#security-considerations)。
TDD Guard以您的用户权限运行,并可以访问您的文件系统。我们遵循安全最佳实践,包括自动安全扫描、依赖审计和测试驱动开发。如果您有安全顾虑,请审查源代码。
## 路线图
- 添加对更多测试框架的支持 (Mocha, unittest, etc.)
- 添加对其他编程语言的支持 (Ruby, Java, C#, etc.)
- 验证通过MCPs和shell命令进行的文件修改
- 为OpenCode和其他供应商无关的AI编码工具添加集成
- 当测试为绿色时鼓励有意义的重新构建机会
- 添加对每个项目多个并发会话的支持
## 架构分析
### 项目概述
TDD Guard是一个为Claude Code提供自动化测试驱动开发强制执行的工具。它确保Claude Code遵循TDD原则,通过阻止跳过测试或过度实现来强制执行红-绿-重构周期。
### 核心架构
#### 1. **多语言、多框架支持**
- **支持的语言和框架**:
- JavaScript/TypeScript: Jest, Vitest
- Python: pytest
- PHP: PHPUnit
- Go: go test
- Rust: cargo test, cargo nextest
- Ruby: RSpec (规划中)
#### 2. **架构分层**
```
┌─────────────────┐
│ CLI Layer │ ← 命令行接口
├─────────────────┤
│ Hook Layer │ ← Claude Code钩子集成
├─────────────────┤
│ Guard Layer │ ← 核心Guard机制
├─────────────────┤
│ Validator Layer │ ← AI验证逻辑
├─────────────────┤
│ Reporter Layer │ ← 多语言测试报告器
├─────────────────┤
│ Storage Layer │ ← 数据持久化
└─────────────────┘
```
### 核心组件分析
#### **GuardManager** (`src/guard/GuardManager.ts`)
- **职责**:管理TDD Guard的启用/禁用状态和忽略模式
- **功能**:
- 启用/禁用Guard
- 文件忽略模式匹配
- 配置持久化
- **设计模式**:单例模式,依赖注入
#### **验证器** (`src/validation/validator.ts`)
- **职责**:使用AI模型验证代码修改是否符合TDD原则
- **流程**:
1. 生成动态上下文提示
2. 调用AI模型(Claude CLI或Anthropic API)
3. 解析模型响应
4. 返回验证结果(block/approve)
#### **钩子处理器** (`src/hooks/processHookData.ts`)
- **职责**:处理Claude Code的钩子事件
- **支持的事件类型**:
- `PreToolUse`: 工具使用前验证
- `PostToolUse`: 工具使用后处理
- `SessionStart`: 会话开始
- `UserPromptSubmit`: 用户命令处理
#### **配置系统** (`src/config/Config.ts`)
- **职责**:管理项目配置和环境变量
- **配置项**:
- 数据目录路径
- AI模型类型
- Linter类型
- 项目根目录
### 报告器架构
#### **统一接口设计**
每个语言的报告器都遵循相同的架构模式:
```
Input → Parser → Transformer → Storage
```
#### **Go报告器示例** (`reporters/go/`)
- **Parser**: 解析`go test -json`输出
- **Transformer**: 转换测试结果为统一格式
- **Storage**: 保存到`.claude/tdd-guard/data/test.json`
- **Formatter**: 格式化输出,保持原始测试输出
#### **其他报告器**
- **Jest/Vitest**: 集成到测试配置中
- **pytest**: 通过插件系统
- **PHPUnit**: 通过监听器和扩展
- **Rust**: 作为cargo命令的管道过滤器
### 数据流和逻辑流程
#### **完整TDD周期验证流程**
```
1. 用户输入命令
↓
2. Claude Code触发PreToolUse钩子
↓
3. processHookData处理钩子事件
↓
4. 检查Guard是否启用
↓
5. 检查文件是否被忽略
↓
6. 构建验证上下文
↓
7. 调用AI验证器
↓
8. AI模型分析代码修改
↓
9. 返回验证结果 (block/approve)
↓
10. 如果block,阻止操作并显示原因
```
#### **测试结果收集流程**
```
测试运行 → 报告器 → 解析 → 转换 → 存储
↓ ↓ ↓ ↓ ↓
go test tdd-guard-go JSON 统一格式 test.json
pytest pytest插件 JSON 统一格式 test.json
jest jest报告器 JSON 统一格式 test.json
```
#### **代码质量检查流程**
```
PostToolUse → 检测文件修改 → 运行Linter → 存储结果 → 下次验证时检查
```
### 存储架构
#### **数据文件结构**
```
.claude/tdd-guard/data/
├── test.json # 测试结果
├── modifications.json # 代码修改记录
├── todos.json # TODO列表
├── lint.json # 代码质量检查结果
├── config.json # Guard配置
└── instructions.md # 自定义指令
```
#### **存储接口** (`src/storage/Storage.ts`)
- **职责**:抽象存储操作
- **实现**:文件系统存储 (`FileStorage`)
- **设计模式**:策略模式,支持不同存储后端
### 合约和类型系统
#### **Schema验证**
- 使用Zod进行运行时类型验证
- 确保数据一致性和安全性
- 支持多语言测试结果的统一格式
#### **类型定义**
- `ValidationResult`: 验证结果(block/approve)
- `Context`: 验证上下文
- `HookData`: 钩子事件数据
- `TestResult`: 统一测试结果格式
### 设计模式和最佳实践
#### **采用的设计模式**
1. **策略模式**: 不同AI模型的验证策略
2. **观察者模式**: 钩子事件处理
3. **工厂模式**: 报告器和Linter的创建
4. **适配器模式**: 不同测试框架的适配
5. **命令模式**: 用户命令处理
#### **架构优势**
- **可扩展性**: 易于添加新语言和测试框架
- **可维护性**: 清晰的分层架构
- **类型安全**: 全面的TypeScript类型定义
- **测试友好**: 完整的单元测试覆盖
### 安全考虑
#### **安全措施**
- 环境变量验证
- 路径遍历防护
- 输入数据验证
- 最小权限原则
#### **透明度**
- 开源代码审查
- 安全扫描集成
- 明确的安全警告
### 总结
TDD Guard是一个设计精良的TDD强制执行工具,具有:
1. **多语言支持**: 支持主流编程语言和测试框架
2. **AI驱动验证**: 使用Claude进行智能代码分析
3. **钩子集成**: 无缝集成到Claude Code工作流
4. **可配置性**: 灵活的配置和自定义选项
5. **健壮性**: 完善的错误处理和类型安全
6. **可扩展性**: 模块化架构便于功能扩展
该项目展示了现代软件架构的最佳实践,结合了AI技术、测试驱动开发原则和工程化方法,为开发者提供了强大的TDD实践工具。
## 开发
- [开发指南](DEVELOPMENT.md) - 设置说明和开发指南
- [架构决策记录](docs/adr/) - 技术设计决策和理由
## 贡献
欢迎贡献!随时提交问题和拉取请求。
**贡献者:**
- Python/pytest支持:[@Durafen](https://github.com/Durafen)
- PHP/PHPUnit支持:[@wazum](https://github.com/wazum)
- Rust/cargo支持:[@104hp6u](https://github.com/104hp6u)
## 支持
- [配置](docs/configuration.md) - 完整的设置文档
- [讨论](https://github.com/nizos/tdd-guard/discussions) - 提出问题并分享想法
- [问题](https://github.com/nizos/tdd-guard/issues) - 报告错误并请求功能
## 许可证
[MIT](LICENSE)