{"id":"0297c897-c633-4d89-ace6-61a212b7001a","shortId":"rmurFM","kind":"skill","title":"test-driven-development","tagline":"在实现任何功能或修复 bug 时使用，在编写实现代码之前","description":"# 测试驱动开发（TDD）\n\n## 概述\n\n先写测试。看它失败。写最少的代码让它通过。\n\n**核心原则：** 如果你没有看到测试失败，你就不知道它是否测试了正确的东西。\n\n**违反规则的字面意思就是违反规则的精神。**\n\n## 何时使用\n\n**始终使用：**\n- 新功能\n- Bug 修复\n- 重构\n- 行为变更\n\n**例外（需询问你的人类伙伴）：**\n- 一次性原型\n- 生成的代码\n- 配置文件\n\n想着\"就这一次跳过 TDD\"？停下来。那是在给自己找借口。\n\n## 铁律\n\n```\n没有失败的测试，就不写生产代码\n```\n\n先写了代码再写测试？删掉它。从头来过。\n\n**没有例外：**\n- 不要保留作为\"参考\"\n- 不要在写测试时\"改编\"它\n- 不要看它\n- 删除就是删除\n\n从测试出发，重新实现。句号。\n\n## 红-绿-重构\n\n```dot\ndigraph tdd_cycle {\n    rankdir=LR;\n    red [label=\"红灯\\n编写失败的测试\", shape=box, style=filled, fillcolor=\"#ffcccc\"];\n    verify_red [label=\"验证正确失败\", shape=diamond];\n    green [label=\"绿灯\\n最少代码\", shape=box, style=filled, fillcolor=\"#ccffcc\"];\n    verify_green [label=\"验证通过\\n全部绿灯\", shape=diamond];\n    refactor [label=\"重构\\n清理代码\", shape=box, style=filled, fillcolor=\"#ccccff\"];\n    next [label=\"下一个\", shape=ellipse];\n\n    red -> verify_red;\n    verify_red -> green [label=\"是\"];\n    verify_red -> red [label=\"错误的\\n失败\"];\n    green -> verify_green;\n    verify_green -> refactor [label=\"是\"];\n    verify_green -> green [label=\"否\"];\n    refactor -> verify_green [label=\"保持\\n绿灯\"];\n    verify_green -> next;\n    next -> red;\n}\n```\n\n### 红灯 - 编写失败的测试\n\n写一个最小的测试来展示期望行为。\n\n<Good>\n```typescript\ntest('retries failed operations 3 times', async () => {\n  let attempts = 0;\n  const operation = () => {\n    attempts++;\n    if (attempts < 3) throw new Error('fail');\n    return 'success';\n  };\n\n  const result = await retryOperation(operation);\n\n  expect(result).toBe('success');\n  expect(attempts).toBe(3);\n});\n```\n名称清晰，测试真实行为，只测一件事\n</Good>\n\n<Bad>\n```typescript\ntest('retry works', async () => {\n  const mock = jest.fn()\n    .mockRejectedValueOnce(new Error())\n    .mockRejectedValueOnce(new Error())\n    .mockResolvedValueOnce('success');\n  await retryOperation(mock);\n  expect(mock).toHaveBeenCalledTimes(3);\n});\n```\n名称模糊，测试的是 mock 而非代码\n</Bad>\n\n**要求：**\n- 一个行为\n- 清晰的名称\n- 使用真实代码（除非不得已才用 mock）\n\n### 验证红灯 - 看它失败\n\n**必须执行。绝不跳过。**\n\n```bash\nnpm test path/to/test.test.ts\n```\n\n确认：\n- 测试失败（不是报错）\n- 失败信息符合预期\n- 失败原因是功能缺失（不是拼写错误）\n\n**测试通过了？** 你在测试已有的行为。修改测试。\n\n**测试报错了？** 修复错误，重新运行直到它正确地失败。\n\n### 绿灯 - 最少代码\n\n写最简单的代码让测试通过。\n\n<Good>\n```typescript\nasync function retryOperation<T>(fn: () => Promise<T>): Promise<T> {\n  for (let i = 0; i < 3; i++) {\n    try {\n      return await fn();\n    } catch (e) {\n      if (i === 2) throw e;\n    }\n  }\n  throw new Error('unreachable');\n}\n```\n刚好够通过测试\n</Good>\n\n<Bad>\n```typescript\nasync function retryOperation<T>(\n  fn: () => Promise<T>,\n  options?: {\n    maxRetries?: number;\n    backoff?: 'linear' | 'exponential';\n    onRetry?: (attempt: number) => void;\n  }\n): Promise<T> {\n  // YAGNI\n}\n```\n过度设计\n</Bad>\n\n不要添加功能、重构其他代码或做超出测试要求的\"改进\"。\n\n### 验证绿灯 - 看它通过\n\n**必须执行。**\n\n```bash\nnpm test path/to/test.test.ts\n```\n\n确认：\n- 测试通过\n- 其他测试仍然通过\n- 输出干净（没有错误、警告）\n\n**测试失败了？** 修改代码，不是测试。\n\n**其他测试失败了？** 立即修复。\n\n### 重构 - 清理代码\n\n只有在绿灯之后才重构：\n- 消除重复\n- 改善命名\n- 提取辅助函数\n\n保持测试绿灯。不要添加行为。\n\n### 重复\n\n为下一个功能写下一个失败的测试。\n\n## 好的测试\n\n| 特质 | 好的 | 差的 |\n|------|------|------|\n| **最小化** | 只测一件事。名称中有\"和\"？拆分它。 | `test('validates email and domain and whitespace')` |\n| **清晰** | 名称描述行为 | `test('test1')` |\n| **展示意图** | 展示期望的 API | 掩盖了代码应该做什么 |\n\n## 为什么顺序很重要\n\n**\"我先写完再补测试来验证\"**\n\n后写的测试立即通过。立即通过什么也证明不了：\n- 可能测试了错误的东西\n- 可能测试的是实现而非行为\n- 可能遗漏了你忘掉的边界情况\n- 你从未看到它捕获 bug\n\n先写测试迫使你看到测试失败，证明它确实在测试某些东西。\n\n**\"我已经手动测试了所有边界情况\"**\n\n手动测试是临时的。你以为你测试了所有情况，但是：\n- 没有测试记录\n- 代码变更后无法重新运行\n- 在压力下容易遗忘\n- \"我试过了能跑\" 不等于 全面测试\n\n自动化测试是系统性的。它们每次以相同方式运行。\n\n**\"删除 X 小时的工作太浪费了\"**\n\n沉没成本谬误。时间已经花了。你现在的选择：\n- 删除并用 TDD 重写（再花 X 小时，高信心）\n- 保留并后补测试（30 分钟，低信心，可能有 bug）\n\n\"浪费\"的是保留你无法信任的代码。没有真正测试的可运行代码就是技术债。\n\n**\"TDD 太教条了，务实意味着灵活变通\"**\n\nTDD 就是务实的：\n- 在 commit 前发现 bug（比事后调试快）\n- 防止回归（测试立即发现破坏）\n- 记录行为（测试展示如何使用代码）\n- 支持重构（放心修改，测试捕获破坏）\n\n\"务实的\"捷径 = 在生产环境调试 = 更慢。\n\n**\"后补测试也能达到相同目的——重要的是精神不是仪式\"**\n\n不对。后补测试回答\"这段代码做了什么？\"先写测试回答\"这段代码应该做什么？\"\n\n后补测试受你实现的偏见影响。你测试的是你构建的东西，而非需求要求的。你验证的是你记得的边界情况，而非发现的。\n\n先写测试迫使你在实现前发现边界情况。后补测试验证的是你记住了所有情况（你没有）。\n\n30 分钟的后补测试 ≠ TDD。你得到了覆盖率，但失去了测试有效的证明。\n\n## 常见借口\n\n| 借口 | 现实 |\n|------|------|\n| \"太简单了不用测\" | 简单的代码也会出 bug。测试只需 30 秒。 |\n| \"我之后补测试\" | 立即通过的测试什么也证明不了。 |\n| \"后补测试也能达到相同目的\" | 后补测试 = \"这做了什么？\" 先写测试 = \"这应该做什么？\" |\n| \"已经手动测试过了\" | 临时测试 ≠ 系统测试。无记录，无法重现。 |\n| \"删除 X 小时的工作太浪费\" | 沉没成本谬误。保留未验证的代码就是技术债。 |\n| \"留作参考，然后先写测试\" | 你会去改编它。那就是后补测试。删除就是删除。 |\n| \"需要先探索一下\" | 可以。探索完了扔掉，从 TDD 开始。 |\n| \"测试难写 = 设计不清楚\" | 听测试的。难以测试 = 难以使用。 |\n| \"TDD 会拖慢我\" | TDD 比调试快。务实 = 先写测试。 |\n| \"手动测试更快\" | 手动测试无法证明边界情况。每次修改你都得重新测。 |\n| \"现有代码没有测试\" | 你在改进它。为现有代码补测试。 |\n\n## 危险信号 - 停下来，从头开始\n\n- 先写了代码再写测试\n- 实现完了才补测试\n- 测试立即通过\n- 无法解释测试为什么失败\n- \"之后再补\"测试\n- 说服自己\"就这一次\"\n- \"我已经手动测试过了\"\n- \"后补测试也能达到相同目的\"\n- \"重要的是精神不是仪式\"\n- \"留作参考\"或\"改编现有代码\"\n- \"已经花了 X 小时了，删掉太浪费\"\n- \"TDD 太教条了，我是在务实\"\n- \"这次情况不同，因为……\"\n\n**以上所有情况都意味着：删除代码。用 TDD 从头开始。**\n\n## 示例：Bug 修复\n\n**Bug：** 空邮箱被接受了\n\n**红灯**\n```typescript\ntest('rejects empty email', async () => {\n  const result = await submitForm({ email: '' });\n  expect(result.error).toBe('Email required');\n});\n```\n\n**验证红灯**\n```bash\n$ npm test\nFAIL: expected 'Email required', got undefined\n```\n\n**绿灯**\n```typescript\nfunction submitForm(data: FormData) {\n  if (!data.email?.trim()) {\n    return { error: 'Email required' };\n  }\n  // ...\n}\n```\n\n**验证绿灯**\n```bash\n$ npm test\nPASS\n```\n\n**重构**\n如果需要，提取验证逻辑以支持多个字段。\n\n## 验证清单\n\n在标记工作完成之前：\n\n- [ ] 每个新函数/方法都有测试\n- [ ] 在实现之前看到每个测试失败\n- [ ] 每个测试因预期原因失败（功能缺失，不是拼写错误）\n- [ ] 为每个测试编写了最少代码使其通过\n- [ ] 所有测试通过\n- [ ] 输出干净（没有错误、警告）\n- [ ] 测试使用真实代码（只在不可避免时用 mock）\n- [ ] 覆盖了边界情况和错误场景\n\n不能全部勾选？你跳过了 TDD。从头开始。\n\n## 遇到困难时\n\n| 问题 | 解决方案 |\n|------|----------|\n| 不知道怎么测试 | 写出你期望的 API。先写断言。问你的人类伙伴。 |\n| 测试太复杂 | 设计太复杂。简化接口。 |\n| 必须 mock 所有东西 | 代码耦合太紧。使用依赖注入。 |\n| 测试 setup 太庞大 | 提取辅助函数。还是复杂？简化设计。 |\n\n## 调试集成\n\n发现 bug？写一个重现 bug 的失败测试。按 TDD 循环走。测试既证明了修复有效，又防止了回归。\n\n绝不在没有测试的情况下修复 bug。\n\n## 测试反模式\n\n添加 mock 或测试工具时，阅读 @testing-anti-patterns.md 以避免常见陷阱：\n- 测试 mock 行为而非真实行为\n- 在生产类中添加仅测试用的方法\n- 在不理解依赖的情况下使用 mock\n\n## 最终规则\n\n```\n生产代码 → 测试存在且先失败\n否则 → 不是 TDD\n```\n\n没有你的人类伙伴的许可，没有例外。","tags":["test","driven","development","superpowers","jnmetacode","agent-skills","agentic-coding","ai-coding","chinese","claude-code","code-review","cursor"],"capabilities":["skill","source-jnmetacode","skill-test-driven-development","topic-agent-skills","topic-agentic-coding","topic-ai-coding","topic-chinese","topic-claude-code","topic-code-review","topic-cursor","topic-gemini-cli","topic-kiro","topic-mcp","topic-npm-package","topic-prompt-engineering"],"categories":["superpowers-zh"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/jnMetaCode/superpowers-zh/test-driven-development","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add jnMetaCode/superpowers-zh","source_repo":"https://github.com/jnMetaCode/superpowers-zh","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 1857 github stars · SKILL.md body (5,703 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-03T00:52:46.287Z","embedding":null,"createdAt":"2026-04-18T21:56:01.181Z","updatedAt":"2026-05-03T00:52:46.287Z","lastSeenAt":"2026-05-03T00:52:46.287Z","tsv":"'0':162,257 '2':269 '3':157,168,187,213,259 '30':388,432,444 'api':349,601 'async':159,195,248,278,533 'attempt':161,165,167,185,290 'await':177,207,263,536 'backoff':286 'bash':228,302,545,568 'box':68,84,101 'bug':6,22,359,392,404,442,523,525,620,622,630 'catch':265 'ccccff':105 'ccffcc':88 'commit':402 'const':163,175,196,534 'cycl':60 'data':558 'data.email':561 'develop':4 'diamond':78,95 'digraph':58 'domain':340 'dot':57 'driven':3 'e':266,271 'ellips':110 'email':338,532,538,542,550,565 'empti':531 'error':171,201,204,274,564 'expect':180,184,210,539,549 'exponenti':288 'fail':155,172,548 'ffcccc':72 'fill':70,86,103 'fillcolor':71,87,104 'fn':251,264,281 'formdata':559 'function':249,279,556 'got':552 'green':79,90,116,125,127,129,134,135,140,145 'jest.fn':198 'label':64,75,80,91,97,107,117,122,131,136,141 'let':160,255 'linear':287 'lr':62 'maxretri':284 'mock':197,209,211,216,223,590,608,633,639,643 'mockrejectedvalueonc':199,202 'mockresolvedvalueonc':205 'new':170,200,203,273 'next':106,146,147 'npm':229,303,546,569 'number':285,291 'n全部绿灯':93 'n失败':124 'n最少代码':82 'n清理代码':99 'n绿灯':143 'n编写失败的测试':66 'onretri':289 'oper':156,164,179 'option':283 'pass':571 'path/to/test.test.ts':231,305 'promis':252,253,282,293 'rankdir':61 'red':63,74,111,113,115,120,121,148 'refactor':96,130,138 'reject':530 'requir':543,551,566 'result':176,181,535 'result.error':540 'retri':154,193 'retryoper':178,208,250,280 'return':173,262,563 'setup':613 'shape':67,77,83,94,100,109 'skill' 'skill-test-driven-development' 'source-jnmetacode' 'style':69,85,102 'submitform':537,557 'success':174,183,206 'tdd':10,33,59,381,396,399,434,472,479,481,512,520,594,625,649 'test':2,153,192,230,304,336,345,529,547,570 'test-driven-develop':1 'test1':346 'testing-anti-patterns.md':636 'throw':169,270,272 'time':158 'tobe':182,186,541 'tohavebeencalledtim':212 'topic-agent-skills' 'topic-agentic-coding' 'topic-ai-coding' 'topic-chinese' 'topic-claude-code' 'topic-code-review' 'topic-cursor' 'topic-gemini-cli' 'topic-kiro' 'topic-mcp' 'topic-npm-package' 'topic-prompt-engineering' 'tri':261 'trim':562 'typescript':152,191,247,277,528,555 'undefin':553 'unreach':275 'valid':337 'verifi':73,89,112,114,119,126,128,133,139,144 'void':292 'whitespac':342 'work':194 'x':375,384,459,509 'yagni':294 '一个行为':219 '一次性原型':28 '下一个':108 '不对':419 '不是':648 '不是报错':234 '不是拼写错误':237,582 '不是测试':314 '不知道怎么测试':599 '不等于':370 '不能全部勾选':592 '不要保留作为':43 '不要在写测试时':45 '不要添加功能':296 '不要添加行为':324 '不要看它':48 '临时测试':454 '为下一个功能写下一个失败的测试':326 '为什么顺序很重要':351 '为每个测试编写了最少代码使其通过':583 '为现有代码补测试':490 '之后再补':498 '从':471 '从头开始':493,521,595 '从头来过':41 '从测试出发':50 '代码变更后无法重新运行':367 '代码耦合太紧':610 '以上所有情况都意味着':517 '以避免常见陷阱':637 '会拖慢我':480 '但失去了测试有效的证明':436 '但是':365 '低信心':390 '何时使用':19 '你从未看到它捕获':358 '你以为你测试了所有情况':364 '你会去改编它':465 '你在改进它':489 '你在测试已有的行为':239 '你就不知道它是否测试了正确的东西':17 '你得到了覆盖率':435 '你没有':431 '你测试的是你构建的东西':425 '你现在的选择':379 '你跳过了':593 '你验证的是你记得的边界情况':427 '使用依赖注入':611 '使用真实代码':221 '例外':26 '保持':142 '保持测试绿灯':323 '保留并后补测试':387 '保留未验证的代码就是技术债':462 '修复':23,524 '修复错误':242 '修改代码':313 '修改测试':240 '借口':438 '停下来':34,492 '先写了代码再写测试':39,494 '先写断言':602 '先写测试':12,451,484 '先写测试回答':422 '先写测试迫使你在实现前发现边界情况':429 '先写测试迫使你看到测试失败':360 '全面测试':371 '其他测试仍然通过':308 '其他测试失败了':315 '再花':383 '写一个最小的测试来展示期望行为':151 '写一个重现':621 '写出你期望的':600 '写最少的代码让它通过':14 '写最简单的代码让测试通过':246 '分钟':389 '分钟的后补测试':433 '刚好够通过测试':276 '删掉太浪费':511 '删掉它':40 '删除':374,458 '删除代码':518 '删除就是删除':49,467 '删除并用':380 '前发现':403 '功能缺失':581 '务实':483 '务实意味着灵活变通':398 '务实的':413 '危险信号':491 '参考':44 '又防止了回归':628 '发现':619 '句号':52 '只在不可避免时用':589 '只有在绿灯之后才重构':319 '只测一件事':190,332 '可以':469 '可能有':391 '可能测试了错误的东西':355 '可能测试的是实现而非行为':356 '可能遗漏了你忘掉的边界情况':357 '名称中有':333 '名称描述行为':344 '名称模糊':214 '名称清晰':188 '后写的测试立即通过':353 '后补测试':449 '后补测试也能达到相同目的':417,448,503 '后补测试受你实现的偏见影响':424 '后补测试回答':420 '后补测试验证的是你记住了所有情况':430 '否':137 '否则':647 '听测试的':476 '和':334 '因为':516 '在':401 '在不理解依赖的情况下使用':642 '在压力下容易遗忘':368 '在实现之前看到每个测试失败':579 '在实现任何功能或修复':5 '在标记工作完成之前':576 '在生产环境调试':415 '在生产类中添加仅测试用的方法':641 '在编写实现代码之前':8 '太庞大':614 '太教条了':397,513 '太简单了不用测':440 '失败信息符合预期':235 '失败原因是功能缺失':236 '好的':329 '好的测试':327 '如果你没有看到测试失败':16 '如果需要':573 '始终使用':20 '它':47 '它们每次以相同方式运行':373 '实现完了才补测试':495 '小时':385 '小时了':510 '小时的工作太浪费':460 '小时的工作太浪费了':376 '就不写生产代码':38 '就是务实的':400 '就这一次':501 '就这一次跳过':32 '展示意图':347 '展示期望的':348 '差的':330 '已经手动测试过了':453 '已经花了':508 '常见借口':437 '开始':473 '循环走':626 '必须':607 '必须执行':226,301 '想着':31 '我之后补测试':446 '我先写完再补测试来验证':352 '我已经手动测试了所有边界情况':362 '我已经手动测试过了':502 '我是在务实':514 '我试过了能跑':369 '或':506 '或测试工具时':634 '所有东西':609 '所有测试通过':584 '手动测试无法证明边界情况':486 '手动测试是临时的':363 '手动测试更快':485 '拆分它':335 '按':624 '捷径':414 '探索完了扔掉':470 '掩盖了代码应该做什么':350 '提取辅助函数':322,615 '提取验证逻辑以支持多个字段':574 '支持重构':410 '改善命名':321 '改编':46 '改编现有代码':507 '改进':298 '放心修改':411 '新功能':21 '方法都有测试':578 '无法解释测试为什么失败':497 '无法重现':457 '无记录':456 '时使用':7 '时间已经花了':378 '是':118,132 '更慢':416 '最小化':331 '最少代码':245 '最终规则':644 '核心原则':15 '概述':11 '每个新函数':577 '每个测试因预期原因失败':580 '每次修改你都得重新测':487 '比事后调试快':405 '比调试快':482 '沉没成本谬误':377,461 '没有你的人类伙伴的许可':650 '没有例外':42,651 '没有失败的测试':37 '没有测试记录':366 '没有真正测试的可运行代码就是技术债':395 '没有错误':310,586 '测试':499,612,638 '测试使用真实代码':588 '测试反模式':631 '测试只需':443 '测试太复杂':604 '测试失败':233 '测试失败了':312 '测试存在且先失败':646 '测试展示如何使用代码':409 '测试报错了':241 '测试捕获破坏':412 '测试既证明了修复有效':627 '测试的是':215 '测试真实行为':189 '测试立即发现破坏':407 '测试立即通过':496 '测试通过':307 '测试通过了':238 '测试难写':474 '测试驱动开发':9 '浪费':393 '消除重复':320 '添加':632 '清晰':343 '清晰的名称':220 '清理代码':318 '然后先写测试':464 '特质':328 '现实':439 '现有代码没有测试':488 '生产代码':645 '生成的代码':29 '用':519 '留作参考':463,505 '的失败测试':623 '的是保留你无法信任的代码':394 '看它失败':13,225 '看它通过':300 '确认':232,306 '示例':522 '秒':445 '空邮箱被接受了':526 '立即修复':316 '立即通过什么也证明不了':354 '立即通过的测试什么也证明不了':447 '简化接口':606 '简化设计':617 '简单的代码也会出':441 '系统测试':455 '红':54 '红-绿-重构':53 '红灯':65,149,527 '绝不在没有测试的情况下修复':629 '绝不跳过':227 '绿':55 '绿灯':81,244,554 '编写失败的测试':150 '而非代码':217 '而非发现的':428 '而非需求要求的':426 '自动化测试是系统性的':372 '行为变更':25 '行为而非真实行为':640 '要求':218 '覆盖了边界情况和错误场景':591 '解决方案':598 '警告':311,587 '记录行为':408 '设计不清楚':475 '设计太复杂':605 '证明它确实在测试某些东西':361 '说服自己':500 '调试集成':618 '输出干净':309,585 '过度设计':295 '还是复杂':616 '这做了什么':450 '这应该做什么':452 '这次情况不同':515 '这段代码做了什么':421 '这段代码应该做什么':423 '违反规则的字面意思就是违反规则的精神':18 '遇到困难时':596 '那就是后补测试':466 '那是在给自己找借口':35 '配置文件':30 '重写':382 '重复':325 '重新实现':51 '重新运行直到它正确地失败':243 '重构':24,56,98,317,572 '重构其他代码或做超出测试要求的':297 '重要的是精神不是仪式':418,504 '铁律':36 '错误的':123 '问你的人类伙伴':603 '问题':597 '阅读':635 '防止回归':406 '除非不得已才用':222 '难以使用':478 '难以测试':477 '需要先探索一下':468 '需询问你的人类伙伴':27 '验证正确失败':76 '验证清单':575 '验证红灯':224,544 '验证绿灯':299,567 '验证通过':92 '高信心':386","prices":[{"id":"874f9904-971d-4a70-abf6-db0f216b7af2","listingId":"0297c897-c633-4d89-ace6-61a212b7001a","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"jnMetaCode","category":"superpowers-zh","install_from":"skills.sh"},"createdAt":"2026-04-18T21:56:01.181Z"}],"sources":[{"listingId":"0297c897-c633-4d89-ace6-61a212b7001a","source":"github","sourceId":"jnMetaCode/superpowers-zh/test-driven-development","sourceUrl":"https://github.com/jnMetaCode/superpowers-zh/tree/main/skills/test-driven-development","isPrimary":false,"firstSeenAt":"2026-04-18T21:56:01.181Z","lastSeenAt":"2026-05-03T00:52:46.287Z"}],"details":{"listingId":"0297c897-c633-4d89-ace6-61a212b7001a","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"jnMetaCode","slug":"test-driven-development","github":{"repo":"jnMetaCode/superpowers-zh","stars":1857,"topics":["agent-skills","agentic-coding","ai-coding","chinese","claude-code","code-review","cursor","gemini-cli","kiro","mcp","npm-package","prompt-engineering","skills","superpowers","tdd","trae"],"license":"mit","html_url":"https://github.com/jnMetaCode/superpowers-zh","pushed_at":"2026-04-28T15:32:18Z","description":"🦸 AI 编程超能力 · 中文增强版 — superpowers（116k+ ⭐）完整汉化 + 6 个中国原创 skills，让 Claude Code / Copilot CLI / Hermes Agent / Cursor / Windsurf / Kiro / Gemini CLI 等 16 款 AI 编程工具真正会干活","skill_md_sha":"0c824dd3627f85b70eb31443cec26601458eb3e0","skill_md_path":"skills/test-driven-development/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/jnMetaCode/superpowers-zh/tree/main/skills/test-driven-development"},"layout":"multi","source":"github","category":"superpowers-zh","frontmatter":{"name":"test-driven-development","description":"在实现任何功能或修复 bug 时使用，在编写实现代码之前"},"skills_sh_url":"https://skills.sh/jnMetaCode/superpowers-zh/test-driven-development"},"updatedAt":"2026-05-03T00:52:46.287Z"}}