tdd-plan
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseTDD Plan
TDD Plan
Invocation
调用方式
/tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "full story content"- — TrackerBoot 프로젝트 ID (필수)
project-id - — TrackerBoot 스토리 ID (숫자형, 예:
story-id또는12345678) → MCP를 통해 가져오기#12345678 - — 스토리 텍스트를 직접 붙여넣기 → 직접 사용
"full story content" - project-id 없음 → 오류를 표시하고 중지: "프로젝트 ID가 필요합니다. TrackerBoot 프로젝트 ID를 첫 번째 인수로 제공하세요."
- story-id/content 없음 → 오류를 표시하고 중지: "스토리가 필요합니다. TrackerBoot 스토리 ID를 제공하거나 스토리 내용을 붙여넣으세요."
/tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "full story content"- — TrackerBoot 项目 ID (必填)
project-id - — TrackerBoot 故事ID(数字格式,例如:
story-id或12345678)→ 通过MCP获取#12345678 - — 直接粘贴的需求故事文本 → 直接使用
"full story content" - 未传入project-id → 抛出错误并终止执行:"需要项目ID,请将TrackerBoot项目ID作为第一个参数传入。"
- 未传入story-id/故事内容 → 抛出错误并终止执行:"需要需求故事,请提供TrackerBoot故事ID或者粘贴故事内容。"
Step 1: 스토리 불러오기
步骤1:获取需求故事
인수 검증
参数校验
호출 시 와 (또는 스토리 텍스트)가 모두 제공되었는지 확인한다.
project-idstory-idproject-id❌ TrackerBoot 프로젝트 ID가 필요합니다.
프로젝트 ID 없이 실행하면 권한이 있는 임의의 프로젝트에서 스토리를 조회할 수 있습니다.
사용법: /tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "스토리 내용"
예시: /tdd-plan 99887766 12345678STOP.
story-id❌ 스토리가 필요합니다.
TrackerBoot 스토리 ID를 제공하거나 스토리 내용을 붙여넣으세요.
사용법: /tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "스토리 내용"STOP.
모두 제공되었으면: 를 세션 전체에서 사용할 값으로 저장한다.
project-id调用时需确认已同时传入和(或故事文本)。
project-idstory-id未传入则立即终止:
project-id❌ 需要TrackerBoot项目ID。
未携带项目ID运行可能会查询有权限的任意项目下的故事。
使用方法: /tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "故事内容"
示例: /tdd-plan 99887766 12345678终止执行。
未传入或故事文本则立即终止:
story-id❌ 需要需求故事。
请提供TrackerBoot故事ID或者粘贴故事内容。
使用方法: /tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "故事内容"终止执行。
所有参数均已提供: 将存储为整个会话的全局变量。
project-id스토리 ID가 제공된 경우
传入了故事ID的场景
tracker-boot-mcp-tb_get_storyjson
{
"storyId": 12345678
}호출 전 앞에 있는 을 제거합니다 ( → ).
##1234567812345678응답에서 추출:
- 제목: 필드
name - 설명: 필드
description - 인수 기준: 배열 (권장) 또는 설명의 "Acceptance Criteria:" 섹션 파싱
tasks[] - 상태: 필드
current_state
MCP 도구를 찾을 수 없거나 호출이 실패한 경우:
"Could not fetch story [ID] from TrackerBoot.
Please check that the TrackerBoot MCP server is configured, then try again,
or paste the story content directly."중지 — 진행하지 마십시오.
使用工具拉取故事内容:
tracker-boot-mcp-tb_get_storyjson
{
"storyId": 12345678
}调用前移除ID前缀的( → )。
##1234567812345678从响应中提取以下内容:
- 标题: 字段
name - 描述: 字段
description - 验收标准: 数组(推荐)或解析描述中的"Acceptance Criteria:"章节
tasks[] - 状态: 字段
current_state
无法找到MCP工具或调用失败时:
"Could not fetch story [ID] from TrackerBoot.
Please check that the TrackerBoot MCP server is configured, then try again,
or paste the story content directly."终止执行 — 不要继续后续流程。
스토리 내용을 붙여넣은 경우
直接粘贴故事内容的场景
직접 파싱 — 텍스트에서 제목, 설명, 인수 기준을 추출합니다.
直接解析 — 从文本中提取标题、描述、验收标准。
개발자에게 확인
向开发者确认内容
스토리를 표시하고 일시 정지:
markdown
undefined展示故事内容并暂停流程:
markdown
undefinedStory
Story
ID: [id or "—"]
Title: [title]
Description:
[description]
Acceptance Criteria:
- [AC 1]
- [AC 2] ...
Does this look correct? Type "ok" to continue, or let me know what to fix.
"ok" / "yes" / "looks good"를 기다립니다. 수정 사항이 있으면 적용하고 다시 표시합니다.
---ID: [id or "—"]
Title: [title]
Description:
[description]
Acceptance Criteria:
- [AC 1]
- [AC 2] ...
内容是否正确?输入"ok"继续,或者告知需要修改的内容。
等待用户输入"ok" / "yes" / "looks good",如果有修改内容则应用修改后重新展示。
---Step 2: 기술 스택 감지
步骤2:检测技术栈
프로젝트 루트 파일을 읽고 다음 규칙을 순서대로 적용합니다:
| 파일 존재 | 스택 |
|---|---|
의존성에 | TypeScript + React |
kotlin 플러그인이 있는 | Kotlin + Spring |
| Java + Spring |
| Java + Spring (Maven) |
| Python + FastAPI |
TypeScript의 경우, devDependencies도 확인:
- → 단위 테스트 FW: Vitest
"vitest" - → 단위 테스트 FW: Jest
"jest" - 또는
"@playwright/test"→ E2E: Playwrightplaywright.config.* - → E2E: Cypress
"cypress"
모호한 경우: "감지된 후보: [목록]. 어떤 스택으로 작업하고 있나요?"
감지되지 않은 경우: "스택을 감지할 수 없습니다. 다음 중 하나를 지정하세요: typescript-react / kotlin-spring / java-spring / python-fastapi"
전체 감지 규칙은 를 참조하세요.
.agents/skills/tdd-plan/references/tech-stack-detection.md读取项目根目录文件,按以下顺序匹配规则:
| 存在的文件 | 技术栈 |
|---|---|
依赖包含 | TypeScript + React |
包含kotlin插件的 | Kotlin + Spring |
| Java + Spring |
| Java + Spring (Maven) |
包含 | Python + FastAPI |
如果是TypeScript项目,同时检查devDependencies:
- → 单元测试框架: Vitest
"vitest" - → 单元测试框架: Jest
"jest" - 或
"@playwright/test"→ E2E测试框架: Playwrightplaywright.config.* - → E2E测试框架: Cypress
"cypress"
存在歧义时提示:"检测到的候选技术栈:[列表]。请问你正在使用哪个技术栈?"
未检测到技术栈时提示:"无法检测技术栈,请指定以下选项之一:typescript-react / kotlin-spring / java-spring / python-fastapi"
完整检测规则参考 。
.agents/skills/tdd-plan/references/tech-stack-detection.mdStep 3: 프로젝트 컨벤션 감지
步骤3:检测项目规范
기존 테스트 또는 소스 파일이 없는 경우(새 프로젝트) 이 단계를 건너뜁니다.
스토리와 같은 영역에서 테스트 파일 23개와 소스 파일 12개를 읽습니다. 최근 수정된 파일을 선호합니다.
추출:
- 테스트 파일 위치 (동일 위치 vs 디렉토리)
test/ - 테스트 파일 명명 접미사 (,
*.test.ts,*Test.kt)test_*.py - 테스트 구조 (describe/it 중첩, , 클래스 기반)
@Nested - 어서션 라이브러리 및 스타일
- 목 패턴 (vi.mock, vi.fn injection, mockk, @MockBean, MagicMock)
- 소스 파일의 의존성 주입 패턴
- 명명 컨벤션 (접미사, 대소문자)
간략한 요약을 표시합니다 (일시 정지 없음 — 정보 제공 목적):
markdown
undefined如果项目无现有测试或源文件(新项目)则跳过此步骤。
读取与需求故事同领域的23个测试文件和12个源文件,优先选择最近修改的文件。
提取以下内容:
- 测试文件位置(与源码同目录 vs 单独目录)
test/ - 测试文件命名后缀(、
*.test.ts、*Test.kt)test_*.py - 测试结构(describe/it嵌套、、类基结构)
@Nested - 断言库及使用风格
- Mock模式(vi.mock、vi.fn注入、mockk、@MockBean、MagicMock)
- 源文件的依赖注入模式
- 命名规范(后缀、大小写规则)
展示简要摘要(无需暂停,仅作信息提示):
markdown
undefinedProject Conventions Detected
检测到的项目规范
Files read: [file list]
- Test location: [co-located / test/ directory]
- Test naming: [pattern]
- Test structure: [describe/it / @Nested / class-based]
- Assertions: [expect().toEqual / assertThat / assert ==]
- Mocks: [vi.mock / vi.fn injection / mockk / MagicMock]
- Source structure: [feature-based / layer-based]
All new code will follow these patterns.
전체 컨벤션 규칙은 `.agents/skills/tdd-plan/references/convention-detection.md`를 참조하세요.
---读取的文件: [文件列表]
- 测试文件位置: [与源码同目录 / 独立test/目录]
- 测试文件命名: [匹配规则]
- 测试结构: [describe/it / @Nested / 类基结构]
- 断言风格: [expect().toEqual / assertThat / assert ==]
- Mock方式: [vi.mock / vi.fn injection / mockk / MagicMock]
- 源码结构: [feature-based / layer-based]
所有新代码将遵循以上模式。
完整规范检测规则参考 `.agents/skills/tdd-plan/references/convention-detection.md`。
---Step 4: 태스크 분해 제안
步骤4:提供任务拆解建议
세션 상태를 표시한 후 태스크를 제안합니다:
markdown
---展示会话状态后给出任务建议:
markdown
---🏓 Session State
🏓 会话状态
| Field | Value |
|---|---|
| Story | [ID]: [title] |
| Stack | [stack] |
| Test FW | [test framework] |
| E2E FW | [e2e framework] |
| Conventions | [new project / existing — key patterns] |
| Phase | PLANNING |
| 字段 | 取值 |
|---|---|
| 需求故事 | [ID]: [标题] |
| 技术栈 | [技术栈] |
| 单元测试框架 | [测试框架] |
| E2E测试框架 | [e2e框架] |
| 项目规范 | [新项目 / 现有项目 — 核心规则] |
| 阶段 | 规划中 |
Task Plan (Draft)
任务计划(草稿)
Task List
任务列表
Task 1: [title]
任务1: [标题]
- Type: unit | integration | e2e
- The test will assert: [one sentence]
- Implementation scope: [what code will be written]
- Acceptance criteria link: [which ACs]
- Dependencies: none
- 类型: unit | integration | e2e
- 测试断言内容: [一句话描述]
- 实现范围: [需要编写的代码内容]
- 关联验收标准: [关联的AC编号]
- 依赖: 无
Task 2: [title]
任务2: [标题]
...
...
Task [N] (E2E): [title]
任务[N] (E2E): [标题]
- Type: e2e
- The test will assert: [full user flow]
- Implementation scope: E2E test only
- Acceptance criteria link: Full AC coverage check
- Dependencies: Task [N-1]
Questions for clarification:
- [ambiguity or scope question]
Please review. You can add, remove, reorder, or adjust tasks.
Type "ready", "go", or "approved" when satisfied.
undefined- 类型: e2e
- 测试断言内容: [完整用户流程]
- 实现范围: 仅E2E测试
- 关联验收标准: 全量AC覆盖校验
- 依赖: 任务[N-1]
需要确认的问题:
- [歧义点或范围相关问题]
请审核,你可以新增、删除、重排序或调整任务。
确认无误后输入**"ready"、"go"或"approved"**继续。
undefined태스크 순서 결정 기준
任务排序规则
- 도메인/서비스 레이어 우선 (순수 로직, 단위 테스트하기 가장 쉬움)
- 레포지토리/데이터 레이어 두 번째 (영속성)
- API/컨트롤러 레이어 세 번째 (HTTP 인터페이스)
- E2E 마지막 (전체 흐름 검증)
- 优先处理领域/服务层(纯逻辑,最容易写单元测试)
- 其次处理仓库/数据层(持久化逻辑)
- 第三处理API/控制器层(HTTP接口)
- 最后处理E2E测试(全流程验证)
피드백 후
收到反馈后
태스크 목록을 업데이트하고 다시 표시합니다. 트리거 문구를 받을 때까지 반복합니다:
/ / /
readygoapprovedlooks good更新任务列表并重新展示,重复此流程直到收到用户触发指令:
/ / /
readygoapprovedlooks goodStep 5: 세션 파일 작성
步骤5:生成会话文件
세션 파일 경로 결정
确定会话文件路径
세션 파일은 프로젝트 루트의 에 저장됩니다. 파일 이름은 스토리 ID를 기반으로 합니다:
.tdd-sessions/| 상황 | 파일 이름 |
|---|---|
스토리 ID 사용 가능 (예: | |
| 스토리 ID 없음 (붙여넣은 내용) | |
제목 슬러그: 소문자, 공백 및 특수 문자는 하이픈으로 대체, 최대 40자.
예: "User Profile Update" → →
user-profile-update.tdd-sessions/user-profile-update-2026-03-31.md会话文件存储在项目根目录的下,文件名基于故事ID生成:
.tdd-sessions/| 场景 | 文件名 |
|---|---|
存在故事ID(例如: | |
| 无故事ID(粘贴的内容) | |
标题slug规则: 全小写,空格和特殊字符替换为连字符,最长40字符。
示例:"User Profile Update" → →
user-profile-update.tdd-sessions/user-profile-update-2026-03-31.md.tdd-sessions/
를 .gitignore
에 추가
.tdd-sessions/.gitignore将.tdd-sessions/
添加到.gitignore
.tdd-sessions/.gitignore세션 파일을 작성하기 전에:
- 프로젝트 루트에 가 존재하는지 확인
.gitignore - (또는
.tdd-sessions/)가 이미 목록에 있는지 확인.tdd-sessions - 목록에 없는 경우:
- 가 존재하는 경우: 파일에
.gitignore줄을 추가.tdd-sessions/ - 가 존재하지 않는 경우:
.gitignore를 단일 항목으로 포함하여 생성.tdd-sessions/
- 표시: "를
.tdd-sessions/에 추가했습니다" (또는 ".gitignore가 이미.tdd-sessions/에 있습니다").gitignore
生成会话文件前:
- 检查项目根目录是否存在
.gitignore - 检查(或
.tdd-sessions/)是否已在列表中.tdd-sessions - 如果不存在:
- 已存在:在文件末尾添加
.gitignore行.tdd-sessions/ - 不存在:新建文件并写入
.gitignore作为唯一内容.tdd-sessions/
- 已存在
- 提示:"已将添加到
.tdd-sessions/"(或".gitignore已存在于.tdd-sessions/中").gitignore
세션 파일 작성
生成会话文件
.tdd-sessions/markdown
undefined如果不存在目录则先创建,再写入文件:
.tdd-sessions/markdown
undefinedTDD Session
TDD Session
Meta
元信息
- Story ID: [id or "—"]
- Story Title: [title]
- Stack: [stack]
- Test FW: [framework]
- E2E FW: [framework]
- Conventions: [summary line]
- 故事ID: [id or "—"]
- 故事标题: [标题]
- 技术栈: [技术栈]
- 测试框架: [框架]
- E2E框架: [框架]
- 项目规范: [摘要]
Tasks
任务列表
| # | Title | Type | Status |
|---|---|---|---|
| 1 | [title] | unit | ⏳ pending |
| 2 | [title] | integration | ⏳ pending |
| 3 | [title] | e2e | ⏳ pending |
| # | 标题 | 类型 | 状态 |
|---|---|---|---|
| 1 | [标题] | unit | ⏳ 待处理 |
| 2 | [标题] | integration | ⏳ 待处理 |
| 3 | [标题] | e2e | ⏳ 待处理 |
Task Details
任务详情
Task 1: [title]
任务1: [标题]
- Type: unit
- The test will assert: [assertion description]
- Implementation scope: [scope]
- Acceptance criteria link: [AC reference]
- Dependencies: none
- Status: ⏳ pending
- 类型: unit
- 测试断言内容: [断言描述]
- 实现范围: [范围]
- 关联验收标准: [AC引用]
- 依赖: 无
- 状态: ⏳ 待处理
Task 2: [title]
任务2: [标题]
...
그런 다음 표시:
```markdown...
然后展示提示:
```markdown✅ Session Ready
✅ 会话已就绪
.tdd-sessions/[filename]Run /tdd-task to start Task 1.
undefined已创建,共包含[N]个任务。
.tdd-sessions/[filename]执行**/tdd-task**开始任务1。
undefined