tdd-plan

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

TDD Plan

TDD Plan

Invocation

调用方式

/tdd-plan <project-id> <story-id>
/tdd-plan <project-id> "full story content"
  • project-id
    — TrackerBoot 프로젝트 ID (필수)
  • story-id
    — TrackerBoot 스토리 ID (숫자형, 예:
    12345678
    또는
    #12345678
    ) → MCP를 통해 가져오기
  • "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"
  • project-id
    — TrackerBoot 项目 ID (必填)
  • story-id
    — TrackerBoot 故事ID(数字格式,例如:
    12345678
    #12345678
    )→ 通过MCP获取
  • "full story content"
    — 直接粘贴的需求故事文本 → 直接使用
  • 未传入project-id → 抛出错误并终止执行:"需要项目ID,请将TrackerBoot项目ID作为第一个参数传入。"
  • 未传入story-id/故事内容 → 抛出错误并终止执行:"需要需求故事,请提供TrackerBoot故事ID或者粘贴故事内容。"

Step 1: 스토리 불러오기

步骤1:获取需求故事

인수 검증

参数校验

호출 시
project-id
story-id
(또는 스토리 텍스트)가 모두 제공되었는지 확인한다.
project-id
가 없으면 즉시 중단:
❌ TrackerBoot 프로젝트 ID가 필요합니다.

프로젝트 ID 없이 실행하면 권한이 있는 임의의 프로젝트에서 스토리를 조회할 수 있습니다.

사용법: /tdd-plan <project-id> <story-id>
        /tdd-plan <project-id> "스토리 내용"
예시:   /tdd-plan 99887766 12345678
STOP.
story-id
또는 스토리 텍스트가 없으면 즉시 중단:
❌ 스토리가 필요합니다.

TrackerBoot 스토리 ID를 제공하거나 스토리 내용을 붙여넣으세요.

사용법: /tdd-plan <project-id> <story-id>
        /tdd-plan <project-id> "스토리 내용"
STOP.
모두 제공되었으면:
project-id
를 세션 전체에서 사용할 값으로 저장한다.
调用时需确认已同时传入
project-id
story-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_story
도구를 사용하여 스토리를 페치합니다:
json
{
  "storyId": 12345678
}
호출 전 앞에 있는
#
을 제거합니다 (
#12345678
12345678
).
응답에서 추출:
  • 제목:
    name
    필드
  • 설명:
    description
    필드
  • 인수 기준:
    tasks[]
    배열 (권장) 또는 설명의 "Acceptance Criteria:" 섹션 파싱
  • 상태:
    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_story
工具拉取故事内容:
json
{
  "storyId": 12345678
}
调用前移除ID前缀的
#
#12345678
12345678
)。
从响应中提取以下内容:
  • 标题:
    name
    字段
  • 描述:
    description
    字段
  • 验收标准:
    tasks[]
    数组(推荐)或解析描述中的"Acceptance Criteria:"章节
  • 状态:
    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
undefined

Story

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:检测技术栈

프로젝트 루트 파일을 읽고 다음 규칙을 순서대로 적용합니다:
파일 존재스택
의존성에
"react"
가 있는
package.json
TypeScript + React
kotlin 플러그인이 있는
build.gradle.kts
Kotlin + Spring
build.gradle
(.kts 아님) +
src/main/java/
Java + Spring
pom.xml
+
src/main/java/
Java + Spring (Maven)
fastapi
가 있는
pyproject.toml
또는
requirements.txt
Python + FastAPI
TypeScript의 경우, devDependencies도 확인:
  • "vitest"
    → 단위 테스트 FW: Vitest
  • "jest"
    → 단위 테스트 FW: Jest
  • "@playwright/test"
    또는
    playwright.config.*
    → E2E: Playwright
  • "cypress"
    → E2E: Cypress
모호한 경우: "감지된 후보: [목록]. 어떤 스택으로 작업하고 있나요?" 감지되지 않은 경우: "스택을 감지할 수 없습니다. 다음 중 하나를 지정하세요: typescript-react / kotlin-spring / java-spring / python-fastapi"
전체 감지 규칙은
.agents/skills/tdd-plan/references/tech-stack-detection.md
를 참조하세요.

读取项目根目录文件,按以下顺序匹配规则:
存在的文件技术栈
依赖包含
"react"
package.json
TypeScript + React
包含kotlin插件的
build.gradle.kts
Kotlin + Spring
build.gradle
(非.kts格式) +
src/main/java/
Java + Spring
pom.xml
+
src/main/java/
Java + Spring (Maven)
包含
fastapi
pyproject.toml
requirements.txt
Python + FastAPI
如果是TypeScript项目,同时检查devDependencies:
  • "vitest"
    → 单元测试框架: Vitest
  • "jest"
    → 单元测试框架: Jest
  • "@playwright/test"
    playwright.config.*
    → E2E测试框架: Playwright
  • "cypress"
    → E2E测试框架: Cypress
存在歧义时提示:"检测到的候选技术栈:[列表]。请问你正在使用哪个技术栈?" 未检测到技术栈时提示:"无法检测技术栈,请指定以下选项之一:typescript-react / kotlin-spring / java-spring / python-fastapi"
完整检测规则参考
.agents/skills/tdd-plan/references/tech-stack-detection.md

Step 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
undefined

Project 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

🏓 会话状态

FieldValue
Story[ID]: [title]
Stack[stack]
Test FW[test framework]
E2E FW[e2e framework]
Conventions[new project / existing — key patterns]
PhasePLANNING

字段取值
需求故事[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:
  1. [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]

需要确认的问题:
  1. [歧义点或范围相关问题]

请审核,你可以新增、删除、重排序或调整任务。 确认无误后输入**"ready""go""approved"**继续。
undefined

태스크 순서 결정 기준

任务排序规则

  1. 도메인/서비스 레이어 우선 (순수 로직, 단위 테스트하기 가장 쉬움)
  2. 레포지토리/데이터 레이어 두 번째 (영속성)
  3. API/컨트롤러 레이어 세 번째 (HTTP 인터페이스)
  4. E2E 마지막 (전체 흐름 검증)
  1. 优先处理领域/服务层(纯逻辑,最容易写单元测试)
  2. 其次处理仓库/数据层(持久化逻辑)
  3. 第三处理API/控制器层(HTTP接口)
  4. 最后处理E2E测试(全流程验证)

피드백 후

收到反馈后

태스크 목록을 업데이트하고 다시 표시합니다. 트리거 문구를 받을 때까지 반복합니다:
ready
/
go
/
approved
/
looks good

更新任务列表并重新展示,重复此流程直到收到用户触发指令:
ready
/
go
/
approved
/
looks good

Step 5: 세션 파일 작성

步骤5:生成会话文件

세션 파일 경로 결정

确定会话文件路径

세션 파일은 프로젝트 루트의
.tdd-sessions/
에 저장됩니다. 파일 이름은 스토리 ID를 기반으로 합니다:
상황파일 이름
스토리 ID 사용 가능 (예:
12345678
)
.tdd-sessions/12345678.md
스토리 ID 없음 (붙여넣은 내용)
.tdd-sessions/{title-slug}-{YYYY-MM-DD}.md
제목 슬러그: 소문자, 공백 및 특수 문자는 하이픈으로 대체, 최대 40자. 예: "User Profile Update" →
user-profile-update
.tdd-sessions/user-profile-update-2026-03-31.md
会话文件存储在项目根目录的
.tdd-sessions/
下,文件名基于故事ID生成:
场景文件名
存在故事ID(例如:
12345678
.tdd-sessions/12345678.md
无故事ID(粘贴的内容)
.tdd-sessions/{title-slug}-{YYYY-MM-DD}.md
标题slug规则: 全小写,空格和特殊字符替换为连字符,最长40字符。 示例:"User Profile Update" →
user-profile-update
.tdd-sessions/user-profile-update-2026-03-31.md

.tdd-sessions/
.gitignore
에 추가

.tdd-sessions/
添加到
.gitignore

세션 파일을 작성하기 전에:
  1. 프로젝트 루트에
    .gitignore
    가 존재하는지 확인
  2. .tdd-sessions/
    (또는
    .tdd-sessions
    )가 이미 목록에 있는지 확인
  3. 목록에 없는 경우:
    • .gitignore
      가 존재하는 경우: 파일에
      .tdd-sessions/
      줄을 추가
    • .gitignore
      가 존재하지 않는 경우:
      .tdd-sessions/
      를 단일 항목으로 포함하여 생성
  4. 표시: "
    .tdd-sessions/
    .gitignore
    에 추가했습니다" (또는 "
    .tdd-sessions/
    가 이미
    .gitignore
    에 있습니다")
生成会话文件前:
  1. 检查项目根目录是否存在
    .gitignore
  2. 检查
    .tdd-sessions/
    (或
    .tdd-sessions
    )是否已在列表中
  3. 如果不存在:
    • 已存在
      .gitignore
      :在文件末尾添加
      .tdd-sessions/
    • 不存在
      .gitignore
      :新建文件并写入
      .tdd-sessions/
      作为唯一内容
  4. 提示:"已将
    .tdd-sessions/
    添加到
    .gitignore
    "(或"
    .tdd-sessions/
    已存在于
    .gitignore
    中")

세션 파일 작성

生成会话文件

.tdd-sessions/
디렉토리가 없으면 생성한 후 파일을 작성합니다:
markdown
undefined
如果不存在
.tdd-sessions/
目录则先创建,再写入文件:
markdown
undefined

TDD 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

任务列表

#TitleTypeStatus
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]
created with [N] tasks.
Run /tdd-task to start Task 1.
undefined
已创建
.tdd-sessions/[filename]
,共包含[N]个任务。
执行**/tdd-task**开始任务1。
undefined