{"id":"922ed754-0101-449c-a016-c79ff9a88672","shortId":"U2nVA6","kind":"skill","title":"test-driven-development","tagline":"Use when implementing any feature or bugfix, before writing implementation code","description":"# Test-Driven Development (TDD)\n\n## Overview\n\nWrite the test first. Watch it fail. Write minimal code to pass.\n\n**Core principle:** If you didn't watch the test fail, you don't know if it tests the right thing.\n\n**Violating the letter of the rules is violating the spirit of the rules.**\n\n## When to Use\n**Always:**\n- New features\n- Bug fixes\n- Refactoring\n- Behavior changes\n\n**Exceptions (ask your human partner):**\n- Throwaway prototypes\n- Generated code\n- Configuration files\n\nThinking \"skip TDD just this once\"? Stop. That's rationalization.\n\n## The Iron Law\n\n```\nNO PRODUCTION CODE WITHOUT A FAILING TEST FIRST\n```\n\nWrite code before the test? Delete it. Start over.\n\n**No exceptions:**\n- Don't keep it as \"reference\"\n- Don't \"adapt\" it while writing tests\n- Don't look at it\n- Delete means delete\n\nImplement fresh from tests. Period.\n\n## Red-Green-Refactor\n\n```dot\ndigraph tdd_cycle {\n    rankdir=LR;\n    red [label=\"RED\\nWrite failing test\", shape=box, style=filled, fillcolor=\"#ffcccc\"];\n    verify_red [label=\"Verify fails\\ncorrectly\", shape=diamond];\n    green [label=\"GREEN\\nMinimal code\", shape=box, style=filled, fillcolor=\"#ccffcc\"];\n    verify_green [label=\"Verify passes\\nAll green\", shape=diamond];\n    refactor [label=\"REFACTOR\\nClean up\", shape=box, style=filled, fillcolor=\"#ccccff\"];\n    next [label=\"Next\", shape=ellipse];\n\n    red -> verify_red;\n    verify_red -> green [label=\"yes\"];\n    verify_red -> red [label=\"wrong\\nfailure\"];\n    green -> verify_green;\n    verify_green -> refactor [label=\"yes\"];\n    verify_green -> green [label=\"no\"];\n    refactor -> verify_green [label=\"stay\\ngreen\"];\n    verify_green -> next;\n    next -> red;\n}\n```\n\n### RED - Write Failing Test\n\nWrite one minimal test showing what should happen.\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```\nClear name, tests real behavior, one thing\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```\nVague name, tests mock not code\n</Bad>\n\n**Requirements:**\n- One behavior\n- Clear name\n- Real code (no mocks unless unavoidable)\n\n### Verify RED - Watch It Fail\n\n**MANDATORY. Never skip.**\n\n```bash\nnpm test path/to/test.test.ts\n```\n\nConfirm:\n- Test fails (not errors)\n- Failure message is expected\n- Fails because feature missing (not typos)\n\n**Test passes?** You're testing existing behavior. Fix test.\n\n**Test errors?** Fix error, re-run until it fails correctly.\n\n### GREEN - Minimal Code\n\nWrite simplest code to pass the test.\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```\nJust enough to pass\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```\nOver-engineered\n</Bad>\n\nDon't add features, refactor other code, or \"improve\" beyond the test.\n\n### Verify GREEN - Watch It Pass\n\n**MANDATORY.**\n\n```bash\nnpm test path/to/test.test.ts\n```\n\nConfirm:\n- Test passes\n- Other tests still pass\n- Output pristine (no errors, warnings)\n\n**Test fails?** Fix code, not test.\n\n**Other tests fail?** Fix now.\n\n### REFACTOR - Clean Up\n\nAfter green only:\n- Remove duplication\n- Improve names\n- Extract helpers\n\nKeep tests green. Don't add behavior.\n\n### Repeat\n\nNext failing test for next feature.\n\n## Good Tests\n\n| Quality | Good | Bad |\n|---------|------|-----|\n| **Minimal** | One thing. \"and\" in name? Split it. | `test('validates email and domain and whitespace')` |\n| **Clear** | Name describes behavior | `test('test1')` |\n| **Shows intent** | Demonstrates desired API | Obscures what code should do |\n\n## Why Order Matters\n\n**\"I'll write tests after to verify it works\"**\n\nTests written after code pass immediately. Passing immediately proves nothing:\n- Might test wrong thing\n- Might test implementation, not behavior\n- Might miss edge cases you forgot\n- You never saw it catch the bug\n\nTest-first forces you to see the test fail, proving it actually tests something.\n\n**\"I already manually tested all the edge cases\"**\n\nManual testing is ad-hoc. You think you tested everything but:\n- No record of what you tested\n- Can't re-run when code changes\n- Easy to forget cases under pressure\n- \"It worked when I tried it\" ≠ comprehensive\n\nAutomated tests are systematic. They run the same way every time.\n\n**\"Deleting X hours of work is wasteful\"**\n\nSunk cost fallacy. The time is already gone. Your choice now:\n- Delete and rewrite with TDD (X more hours, high confidence)\n- Keep it and add tests after (30 min, low confidence, likely bugs)\n\nThe \"waste\" is keeping code you can't trust. Working code without real tests is technical debt.\n\n**\"TDD is dogmatic, being pragmatic means adapting\"**\n\nTDD IS pragmatic:\n- Finds bugs before commit (faster than debugging after)\n- Prevents regressions (tests catch breaks immediately)\n- Documents behavior (tests show how to use code)\n- Enables refactoring (change freely, tests catch breaks)\n\n\"Pragmatic\" shortcuts = debugging in production = slower.\n\n**\"Tests after achieve the same goals - it's spirit not ritual\"**\n\nNo. Tests-after answer \"What does this do?\" Tests-first answer \"What should this do?\"\n\nTests-after are biased by your implementation. You test what you built, not what's required. You verify remembered edge cases, not discovered ones.\n\nTests-first force edge case discovery before implementing. Tests-after verify you remembered everything (you didn't).\n\n30 minutes of tests after ≠ TDD. You get coverage, lose proof tests work.\n\n## Common Rationalizations\n\n| Excuse | Reality |\n|--------|---------|\n| \"Too simple to test\" | Simple code breaks. Test takes 30 seconds. |\n| \"I'll test after\" | Tests passing immediately prove nothing. |\n| \"Tests after achieve same goals\" | Tests-after = \"what does this do?\" Tests-first = \"what should this do?\" |\n| \"Already manually tested\" | Ad-hoc ≠ systematic. No record, can't re-run. |\n| \"Deleting X hours is wasteful\" | Sunk cost fallacy. Keeping unverified code is technical debt. |\n| \"Keep as reference, write tests first\" | You'll adapt it. That's testing after. Delete means delete. |\n| \"Need to explore first\" | Fine. Throw away exploration, start with TDD. |\n| \"Test hard = design unclear\" | Listen to test. Hard to test = hard to use. |\n| \"TDD will slow me down\" | TDD faster than debugging. Pragmatic = test-first. |\n| \"Manual test faster\" | Manual doesn't prove edge cases. You'll re-test every change. |\n| \"Existing code has no tests\" | You're improving it. Add tests for existing code. |\n\n## Red Flags - STOP and Start Over\n\n- Code before test\n- Test after implementation\n- Test passes immediately\n- Can't explain why test failed\n- Tests added \"later\"\n- Rationalizing \"just this once\"\n- \"I already manually tested it\"\n- \"Tests after achieve the same purpose\"\n- \"It's about spirit not ritual\"\n- \"Keep as reference\" or \"adapt existing code\"\n- \"Already spent X hours, deleting is wasteful\"\n- \"TDD is dogmatic, I'm being pragmatic\"\n- \"This is different because...\"\n\n**All of these mean: Delete code. Start over with TDD.**\n\n## Example: Bug Fix\n\n**Bug:** Empty email accepted\n\n**RED**\n```typescript\ntest('rejects empty email', async () => {\n  const result = await submitForm({ email: '' });\n  expect(result.error).toBe('Email required');\n});\n```\n\n**Verify RED**\n```bash\n$ npm test\nFAIL: expected 'Email required', got undefined\n```\n\n**GREEN**\n```typescript\nfunction submitForm(data: FormData) {\n  if (!data.email?.trim()) {\n    return { error: 'Email required' };\n  }\n  // ...\n}\n```\n\n**Verify GREEN**\n```bash\n$ npm test\nPASS\n```\n\n**REFACTOR**\nExtract validation for multiple fields if needed.\n\n## Verification Checklist\n\nBefore marking work complete:\n\n- [ ] Every new function/method has a test\n- [ ] Watched each test fail before implementing\n- [ ] Each test failed for expected reason (feature missing, not typo)\n- [ ] Wrote minimal code to pass each test\n- [ ] All tests pass\n- [ ] Output pristine (no errors, warnings)\n- [ ] Tests use real code (mocks only if unavoidable)\n- [ ] Edge cases and errors covered\n\nCan't check all boxes? You skipped TDD. Start over.\n\n## When Stuck\n\n| Problem | Solution |\n|---------|----------|\n| Don't know how to test | Write wished-for API. Write assertion first. Ask your human partner. |\n| Test too complicated | Design too complicated. Simplify interface. |\n| Must mock everything | Code too coupled. Use dependency injection. |\n| Test setup huge | Extract helpers. Still complex? Simplify design. |\n\n## Debugging Integration\n\nBug found? Write failing test reproducing it. Follow TDD cycle. Test proves fix and prevents regression.\n\nNever fix bugs without a test.\n\n## Testing Anti-Patterns\n\nWhen adding mocks or test utilities, read @testing-anti-patterns.md to avoid common pitfalls:\n- Testing mock behavior instead of real behavior\n- Adding test-only methods to production classes\n- Mocking without understanding dependencies\n\n## Final Rule\n\n```\nProduction code → test exists and failed first\nOtherwise → not TDD\n```\n\nNo exceptions without your human partner's permission.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["test","driven","development","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-test-driven-development","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/test-driven-development","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34460 github stars · SKILL.md body (10,042 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-04-22T06:52:00.513Z","embedding":null,"createdAt":"2026-04-18T21:46:10.779Z","updatedAt":"2026-04-22T06:52:00.513Z","lastSeenAt":"2026-04-22T06:52:00.513Z","tsv":"'0':273,413 '2':425 '3':268,279,298,328,415 '30':715,855,881 'accept':1109 'achiev':785,894,1058 'actual':620 'ad':635,915,1045,1308,1326 'ad-hoc':634,914 'adapt':129,744,947,1072 'add':459,519,712,1018 'alreadi':624,694,911,1052,1075 'alway':70 'answer':798,806 'anti':1305 'anti-pattern':1304 'api':558,1245 'ask':79,1249,1391 'assert':1247 'async':270,310,404,437,1116 'attempt':272,276,278,296,449 'autom':670 'avoid':1316 'await':288,322,419,1119 'away':962 'backoff':445 'bad':532 'bash':354,475,1129,1153 'behavior':76,303,337,379,520,551,594,763,1321,1325 'beyond':466 'bias':815 'boundari':1399 'box':164,183,203,1225 'break':760,776,878 'bug':73,607,720,749,1104,1106,1281,1299 'bugfix':11 'built':823 'case':598,630,660,832,841,1001,1217 'catch':421,605,759,775 'ccccff':207 'ccffcc':187 'chang':77,656,772,1008 'check':1223 'checklist':1166 'choic':697 'clarif':1393 'class':1333 'clean':503 'clear':299,338,548,1366 'code':15,31,86,104,111,181,334,341,395,398,463,494,561,579,655,725,731,769,877,935,1010,1022,1029,1074,1098,1195,1211,1264,1341 'commit':751 'common':868,1317 'complet':1170 'complex':1276 'complic':1255,1258 'comprehens':669 'confid':708,718 'configur':87 'confirm':358,479 'const':274,286,311,1117 'core':34 'correct':392 'cost':689,931 'coupl':1266 'cover':1220 'coverag':863 'criteria':1402 'cycl':154,1290 'data':1142 'data.email':1145 'debt':737,938 'debug':754,779,988,1279 'delet':115,139,141,681,699,925,953,955,1079,1097 'demonstr':556 'depend':1268,1337 'describ':550,1370 'design':969,1256,1278 'desir':557 'develop':4,19 'diamond':176,196 'didn':38,853 'differ':1091 'digraph':152 'discov':834 'discoveri':842 'document':762 'doesn':997 'dogmat':740,1084 'domain':545 'dot':151 'driven':3,18 'duplic':509 'e':422,427 'easi':657 'edg':597,629,831,840,1000,1216 'ellips':212 'email':543,1108,1115,1121,1125,1134,1149 'empti':1107,1114 'enabl':770 'engin':456 'enough':433 'environ':1382 'environment-specif':1381 'error':282,316,319,362,383,385,430,489,1148,1206,1219 'everi':679,1007,1171 'everyth':641,851,1263 'exampl':1103 'except':78,120,1351 'excus':870 'exist':378,1009,1021,1073,1343 'expect':291,295,325,366,1122,1133,1187 'expert':1387 'explain':1040 'explor':958,963 'exponenti':447 'extract':512,1158,1273 'fail':28,43,107,161,173,253,266,283,350,360,367,391,492,499,523,617,1043,1132,1180,1185,1284,1345 'failur':363 'fallaci':690,932 'faster':752,986,995 'featur':9,72,369,460,527,1189 'ffcccc':168 'field':1162 'file':88 'fill':166,185,205 'fillcolor':167,186,206 'final':1338 'find':748 'fine':960 'first':25,109,610,805,838,906,944,959,992,1248,1346 'fix':74,380,384,493,500,1105,1293,1298 'flag':1024 'fn':407,420,440 'follow':1288 'forc':611,839 'forget':659 'forgot':600 'formdata':1143 'found':1282 'freeli':773 'fresh':143 'function':405,438,1140 'function/method':1173 'generat':85 'get':862 'goal':788,896 'gone':695 'good':528,531 'got':1136 'green':149,177,179,189,194,218,227,229,231,236,237,242,247,393,470,506,516,1138,1152 'happen':262 'hard':968,974,977 'helper':513,1274 'high':707 'hoc':636,916 'hour':683,706,927,1078 'huge':1272 'human':81,1251,1354 'immedi':581,583,761,889,1037 'implement':7,14,142,592,818,844,1034,1182 'improv':465,510,1016 'inject':1269 'input':1396 'instead':1322 'integr':1280 'intent':555 'interfac':1260 'iron':100 'jest.fn':313 'keep':123,514,709,724,933,939,1068 'know':47,1237 'label':158,171,178,190,198,209,219,224,233,238,243 'later':1046 'law':101 'let':271,411 'letter':56 'like':719 'limit':1358 'linear':446 'listen':971 'll':568,884,946,1003 'look':136 'lose':864 'low':717 'lr':156 'm':1086 'mandatori':351,474 'manual':625,631,912,993,996,1053 'mark':1168 'match':1367 'matter':566 'maxretri':443 'mean':140,743,954,1096 'messag':364 'method':1330 'might':586,590,595 'min':716 'minim':30,257,394,533,1194 'minut':856 'miss':370,596,1190,1404 'mock':312,324,326,332,343,1212,1262,1309,1320,1334 'mockrejectedvalueonc':314,317 'mockresolvedvalueonc':320 'multipl':1161 'must':1261 'nall':193 'name':300,330,339,511,538,549 'nclean':200 'ncorrect':174 'need':956,1164 'never':352,602,1297 'new':71,281,315,318,429,1172 'next':208,210,248,249,522,526 'nfailur':226 'ngreen':245 'nminim':180 'noth':585,891 'npm':355,476,1130,1154 'number':444,450 'nwrite':160 'obscur':559 'one':256,304,336,534,835 'onretri':448 'oper':267,275,290 'option':442 'order':565 'otherwis':1347 'output':486,1203,1376 'over-engin':454 'overview':21 'partner':82,1252,1355 'pass':33,192,374,400,435,473,481,485,580,582,888,1036,1156,1197,1202 'path/to/test.test.ts':357,478 'pattern':1306 'period':146 'permiss':1357,1397 'pitfal':1318 'pragmat':742,747,777,989,1088 'pressur':662 'prevent':756,1295 'principl':35 'pristin':487,1204 'problem':1233 'product':103,781,1332,1340 'promis':408,409,441,452 'proof':865 'prototyp':84 'prove':584,618,890,999,1292 'purpos':1061 'qualiti':530 'rankdir':155 'ration':98,869,1047 're':376,387,652,923,1005,1015 're-run':386,651,922 're-test':1004 'read':1313 'real':302,340,733,1210,1324 'realiti':871 'reason':1188 'record':644,919 'red':148,157,159,170,213,215,217,222,223,250,251,347,1023,1110,1128 'red-green-refactor':147 'refactor':75,150,197,199,232,240,461,502,771,1157 'refer':126,941,1070 'regress':757,1296 'reject':1113 'rememb':830,850 'remov':508 'repeat':521 'reproduc':1286 'requir':335,827,1126,1135,1150,1395 'result':287,292,1118 'result.error':1123 'retri':265,308 'retryoper':289,323,406,439 'return':284,418,1147 'review':1388 'rewrit':701 'right':52 'ritual':793,1067 'rule':59,66,1339 'run':388,653,675,924 'safeti':1398 'saw':603 'scope':1369 'second':882 'see':614 'setup':1271 'shape':163,175,182,195,202,211 'shortcut':778 'show':259,554,765 'simpl':873,876 'simplest':397 'simplifi':1259,1277 'skill':1361 'skill-test-driven-development' 'skip':90,353,1227 'slow':982 'slower':782 'solut':1234 'someth':622 'source-sickn33' 'specif':1383 'spent':1076 'spirit':63,791,1065 'split':539 'start':117,964,1027,1099,1229 'stay':244 'still':484,1275 'stop':95,1025,1389 'stuck':1232 'style':165,184,204 'submitform':1120,1141 'substitut':1379 'success':285,294,321,1401 'sunk':688,930 'systemat':673,917 'take':880 'task':1365 'tdd':20,91,153,703,738,745,860,966,980,985,1082,1102,1228,1289,1349 'technic':736,937 'test':2,17,24,42,50,108,114,133,145,162,254,258,264,301,307,331,356,359,373,377,381,382,402,468,477,480,483,491,496,498,515,524,529,541,552,570,576,587,591,609,616,621,626,632,640,648,671,713,734,758,764,774,783,796,804,812,820,837,846,858,866,875,879,885,887,892,898,905,913,943,951,967,973,976,991,994,1006,1013,1019,1031,1032,1035,1042,1044,1054,1056,1112,1131,1155,1176,1179,1184,1199,1201,1208,1240,1253,1270,1285,1291,1302,1303,1311,1319,1328,1342,1385 'test-driven':16 'test-driven-develop':1 'test-first':608,990 'test-on':1327 'test1':553 'testing-anti-patterns.md':1314 'tests-aft':795,811,845,897 'tests-first':803,836,904 'thing':53,305,535,589 'think':89,638 'throw':280,426,428,961 'throwaway':83 'time':269,680,692 'tobe':293,297,1124 'tohavebeencalledtim':327 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':1374 'tri':417,667 'trim':1146 'trust':729 'typescript':263,306,403,436,1111,1139 'typo':372,1192 'unavoid':345,1215 'unclear':970 'undefin':1137 'understand':1336 'unless':344 'unreach':431 'unverifi':934 'use':5,69,768,979,1209,1267,1359 'util':1312 'vagu':329 'valid':542,1159,1384 'verif':1165 'verifi':169,172,188,191,214,216,221,228,230,235,241,246,346,469,573,829,848,1127,1151 'violat':54,61 'void':451 'warn':490,1207 'wast':687,722,929,1081 'watch':26,40,348,471,1177 'way':678 'whitespac':547 'wish':1243 'wished-for':1242 'without':105,732,1300,1335,1352 'work':309,575,664,685,730,867,1169 'write':13,22,29,110,132,252,255,396,569,942,1241,1246,1283 'written':577 'wrong':225,588 'wrote':1193 'x':682,704,926,1077 'yagni':453 'yes':220,234","prices":[{"id":"5df63349-5ae9-4536-b389-1bebd3ea1512","listingId":"922ed754-0101-449c-a016-c79ff9a88672","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:46:10.779Z"}],"sources":[{"listingId":"922ed754-0101-449c-a016-c79ff9a88672","source":"github","sourceId":"sickn33/antigravity-awesome-skills/test-driven-development","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/test-driven-development","isPrimary":false,"firstSeenAt":"2026-04-18T21:46:10.779Z","lastSeenAt":"2026-04-22T06:52:00.513Z"}],"details":{"listingId":"922ed754-0101-449c-a016-c79ff9a88672","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"test-driven-development","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34460,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-22T06:40:00Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"c6bfa48e1b6a872f1e647d3f0d98a1dc88ea5927","skill_md_path":"skills/test-driven-development/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/test-driven-development"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"test-driven-development","description":"Use when implementing any feature or bugfix, before writing implementation code"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/test-driven-development"},"updatedAt":"2026-04-22T06:52:00.513Z"}}