@shaykec/bridge 0.4.25 → 0.4.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/journeys/ai-engineer.yaml +34 -0
  2. package/journeys/backend-developer.yaml +36 -0
  3. package/journeys/business-analyst.yaml +37 -0
  4. package/journeys/devops-engineer.yaml +37 -0
  5. package/journeys/engineering-manager.yaml +44 -0
  6. package/journeys/frontend-developer.yaml +41 -0
  7. package/journeys/fullstack-developer.yaml +49 -0
  8. package/journeys/mobile-developer.yaml +42 -0
  9. package/journeys/product-manager.yaml +35 -0
  10. package/journeys/qa-engineer.yaml +37 -0
  11. package/journeys/ux-designer.yaml +43 -0
  12. package/modules/README.md +52 -0
  13. package/modules/accessibility-fundamentals/content.md +126 -0
  14. package/modules/accessibility-fundamentals/exercises.md +88 -0
  15. package/modules/accessibility-fundamentals/module.yaml +43 -0
  16. package/modules/accessibility-fundamentals/quick-ref.md +71 -0
  17. package/modules/accessibility-fundamentals/quiz.md +100 -0
  18. package/modules/accessibility-fundamentals/resources.md +29 -0
  19. package/modules/accessibility-fundamentals/walkthrough.md +80 -0
  20. package/modules/adr-writing/content.md +121 -0
  21. package/modules/adr-writing/exercises.md +81 -0
  22. package/modules/adr-writing/module.yaml +41 -0
  23. package/modules/adr-writing/quick-ref.md +57 -0
  24. package/modules/adr-writing/quiz.md +73 -0
  25. package/modules/adr-writing/resources.md +29 -0
  26. package/modules/adr-writing/walkthrough.md +64 -0
  27. package/modules/ai-agents/content.md +120 -0
  28. package/modules/ai-agents/exercises.md +82 -0
  29. package/modules/ai-agents/module.yaml +42 -0
  30. package/modules/ai-agents/quick-ref.md +60 -0
  31. package/modules/ai-agents/quiz.md +103 -0
  32. package/modules/ai-agents/resources.md +30 -0
  33. package/modules/ai-agents/walkthrough.md +85 -0
  34. package/modules/ai-assisted-research/content.md +136 -0
  35. package/modules/ai-assisted-research/exercises.md +80 -0
  36. package/modules/ai-assisted-research/module.yaml +42 -0
  37. package/modules/ai-assisted-research/quick-ref.md +67 -0
  38. package/modules/ai-assisted-research/quiz.md +73 -0
  39. package/modules/ai-assisted-research/resources.md +33 -0
  40. package/modules/ai-assisted-research/walkthrough.md +85 -0
  41. package/modules/ai-pair-programming/content.md +105 -0
  42. package/modules/ai-pair-programming/exercises.md +98 -0
  43. package/modules/ai-pair-programming/module.yaml +39 -0
  44. package/modules/ai-pair-programming/quick-ref.md +58 -0
  45. package/modules/ai-pair-programming/quiz.md +73 -0
  46. package/modules/ai-pair-programming/resources.md +34 -0
  47. package/modules/ai-pair-programming/walkthrough.md +117 -0
  48. package/modules/ai-test-generation/content.md +125 -0
  49. package/modules/ai-test-generation/exercises.md +98 -0
  50. package/modules/ai-test-generation/module.yaml +39 -0
  51. package/modules/ai-test-generation/quick-ref.md +65 -0
  52. package/modules/ai-test-generation/quiz.md +74 -0
  53. package/modules/ai-test-generation/resources.md +41 -0
  54. package/modules/ai-test-generation/walkthrough.md +100 -0
  55. package/modules/api-design/content.md +189 -0
  56. package/modules/api-design/exercises.md +84 -0
  57. package/modules/api-design/game.yaml +113 -0
  58. package/modules/api-design/module.yaml +45 -0
  59. package/modules/api-design/quick-ref.md +73 -0
  60. package/modules/api-design/quiz.md +100 -0
  61. package/modules/api-design/resources.md +55 -0
  62. package/modules/api-design/walkthrough.md +88 -0
  63. package/modules/clean-code/content.md +136 -0
  64. package/modules/clean-code/exercises.md +137 -0
  65. package/modules/clean-code/game.yaml +172 -0
  66. package/modules/clean-code/module.yaml +44 -0
  67. package/modules/clean-code/quick-ref.md +44 -0
  68. package/modules/clean-code/quiz.md +105 -0
  69. package/modules/clean-code/resources.md +40 -0
  70. package/modules/clean-code/walkthrough.md +78 -0
  71. package/modules/clean-code/workshop.yaml +149 -0
  72. package/modules/code-review/content.md +130 -0
  73. package/modules/code-review/exercises.md +95 -0
  74. package/modules/code-review/game.yaml +83 -0
  75. package/modules/code-review/module.yaml +42 -0
  76. package/modules/code-review/quick-ref.md +77 -0
  77. package/modules/code-review/quiz.md +105 -0
  78. package/modules/code-review/resources.md +40 -0
  79. package/modules/code-review/walkthrough.md +106 -0
  80. package/modules/daily-workflow/content.md +81 -0
  81. package/modules/daily-workflow/exercises.md +50 -0
  82. package/modules/daily-workflow/module.yaml +33 -0
  83. package/modules/daily-workflow/quick-ref.md +37 -0
  84. package/modules/daily-workflow/quiz.md +65 -0
  85. package/modules/daily-workflow/resources.md +38 -0
  86. package/modules/daily-workflow/walkthrough.md +83 -0
  87. package/modules/debugging-systematically/content.md +139 -0
  88. package/modules/debugging-systematically/exercises.md +91 -0
  89. package/modules/debugging-systematically/module.yaml +46 -0
  90. package/modules/debugging-systematically/quick-ref.md +59 -0
  91. package/modules/debugging-systematically/quiz.md +105 -0
  92. package/modules/debugging-systematically/resources.md +42 -0
  93. package/modules/debugging-systematically/walkthrough.md +84 -0
  94. package/modules/debugging-systematically/workshop.yaml +127 -0
  95. package/modules/demo-test/content.md +68 -0
  96. package/modules/demo-test/exercises.md +28 -0
  97. package/modules/demo-test/game.yaml +171 -0
  98. package/modules/demo-test/module.yaml +41 -0
  99. package/modules/demo-test/quick-ref.md +54 -0
  100. package/modules/demo-test/quiz.md +74 -0
  101. package/modules/demo-test/resources.md +21 -0
  102. package/modules/demo-test/walkthrough.md +122 -0
  103. package/modules/demo-test/workshop.yaml +31 -0
  104. package/modules/design-critique/content.md +93 -0
  105. package/modules/design-critique/exercises.md +71 -0
  106. package/modules/design-critique/module.yaml +41 -0
  107. package/modules/design-critique/quick-ref.md +63 -0
  108. package/modules/design-critique/quiz.md +73 -0
  109. package/modules/design-critique/resources.md +27 -0
  110. package/modules/design-critique/walkthrough.md +68 -0
  111. package/modules/design-patterns/content.md +335 -0
  112. package/modules/design-patterns/exercises.md +82 -0
  113. package/modules/design-patterns/game.yaml +55 -0
  114. package/modules/design-patterns/module.yaml +45 -0
  115. package/modules/design-patterns/quick-ref.md +44 -0
  116. package/modules/design-patterns/quiz.md +101 -0
  117. package/modules/design-patterns/resources.md +40 -0
  118. package/modules/design-patterns/walkthrough.md +64 -0
  119. package/modules/exploratory-testing/content.md +133 -0
  120. package/modules/exploratory-testing/exercises.md +88 -0
  121. package/modules/exploratory-testing/module.yaml +41 -0
  122. package/modules/exploratory-testing/quick-ref.md +68 -0
  123. package/modules/exploratory-testing/quiz.md +75 -0
  124. package/modules/exploratory-testing/resources.md +39 -0
  125. package/modules/exploratory-testing/walkthrough.md +87 -0
  126. package/modules/git/content.md +128 -0
  127. package/modules/git/exercises.md +53 -0
  128. package/modules/git/game.yaml +190 -0
  129. package/modules/git/module.yaml +44 -0
  130. package/modules/git/quick-ref.md +67 -0
  131. package/modules/git/quiz.md +89 -0
  132. package/modules/git/resources.md +49 -0
  133. package/modules/git/walkthrough.md +92 -0
  134. package/modules/git/workshop.yaml +145 -0
  135. package/modules/hiring-interviews/content.md +130 -0
  136. package/modules/hiring-interviews/exercises.md +88 -0
  137. package/modules/hiring-interviews/module.yaml +41 -0
  138. package/modules/hiring-interviews/quick-ref.md +68 -0
  139. package/modules/hiring-interviews/quiz.md +73 -0
  140. package/modules/hiring-interviews/resources.md +36 -0
  141. package/modules/hiring-interviews/walkthrough.md +75 -0
  142. package/modules/hooks/content.md +97 -0
  143. package/modules/hooks/exercises.md +69 -0
  144. package/modules/hooks/module.yaml +39 -0
  145. package/modules/hooks/quick-ref.md +93 -0
  146. package/modules/hooks/quiz.md +81 -0
  147. package/modules/hooks/resources.md +34 -0
  148. package/modules/hooks/walkthrough.md +105 -0
  149. package/modules/hooks/workshop.yaml +64 -0
  150. package/modules/incident-response/content.md +124 -0
  151. package/modules/incident-response/exercises.md +82 -0
  152. package/modules/incident-response/game.yaml +132 -0
  153. package/modules/incident-response/module.yaml +45 -0
  154. package/modules/incident-response/quick-ref.md +53 -0
  155. package/modules/incident-response/quiz.md +103 -0
  156. package/modules/incident-response/resources.md +40 -0
  157. package/modules/incident-response/walkthrough.md +82 -0
  158. package/modules/llm-fundamentals/content.md +114 -0
  159. package/modules/llm-fundamentals/exercises.md +83 -0
  160. package/modules/llm-fundamentals/module.yaml +42 -0
  161. package/modules/llm-fundamentals/quick-ref.md +64 -0
  162. package/modules/llm-fundamentals/quiz.md +103 -0
  163. package/modules/llm-fundamentals/resources.md +30 -0
  164. package/modules/llm-fundamentals/walkthrough.md +91 -0
  165. package/modules/one-on-ones/content.md +133 -0
  166. package/modules/one-on-ones/exercises.md +81 -0
  167. package/modules/one-on-ones/module.yaml +44 -0
  168. package/modules/one-on-ones/quick-ref.md +67 -0
  169. package/modules/one-on-ones/quiz.md +73 -0
  170. package/modules/one-on-ones/resources.md +37 -0
  171. package/modules/one-on-ones/walkthrough.md +69 -0
  172. package/modules/package.json +9 -0
  173. package/modules/prioritization-frameworks/content.md +130 -0
  174. package/modules/prioritization-frameworks/exercises.md +93 -0
  175. package/modules/prioritization-frameworks/module.yaml +41 -0
  176. package/modules/prioritization-frameworks/quick-ref.md +77 -0
  177. package/modules/prioritization-frameworks/quiz.md +73 -0
  178. package/modules/prioritization-frameworks/resources.md +32 -0
  179. package/modules/prioritization-frameworks/walkthrough.md +69 -0
  180. package/modules/prompt-engineering/content.md +123 -0
  181. package/modules/prompt-engineering/exercises.md +82 -0
  182. package/modules/prompt-engineering/game.yaml +101 -0
  183. package/modules/prompt-engineering/module.yaml +45 -0
  184. package/modules/prompt-engineering/quick-ref.md +65 -0
  185. package/modules/prompt-engineering/quiz.md +105 -0
  186. package/modules/prompt-engineering/resources.md +36 -0
  187. package/modules/prompt-engineering/walkthrough.md +81 -0
  188. package/modules/rag-fundamentals/content.md +111 -0
  189. package/modules/rag-fundamentals/exercises.md +80 -0
  190. package/modules/rag-fundamentals/module.yaml +45 -0
  191. package/modules/rag-fundamentals/quick-ref.md +58 -0
  192. package/modules/rag-fundamentals/quiz.md +75 -0
  193. package/modules/rag-fundamentals/resources.md +34 -0
  194. package/modules/rag-fundamentals/walkthrough.md +75 -0
  195. package/modules/react-fundamentals/content.md +140 -0
  196. package/modules/react-fundamentals/exercises.md +81 -0
  197. package/modules/react-fundamentals/game.yaml +145 -0
  198. package/modules/react-fundamentals/module.yaml +45 -0
  199. package/modules/react-fundamentals/quick-ref.md +62 -0
  200. package/modules/react-fundamentals/quiz.md +106 -0
  201. package/modules/react-fundamentals/resources.md +42 -0
  202. package/modules/react-fundamentals/walkthrough.md +89 -0
  203. package/modules/react-fundamentals/workshop.yaml +112 -0
  204. package/modules/react-native-fundamentals/content.md +141 -0
  205. package/modules/react-native-fundamentals/exercises.md +79 -0
  206. package/modules/react-native-fundamentals/module.yaml +42 -0
  207. package/modules/react-native-fundamentals/quick-ref.md +60 -0
  208. package/modules/react-native-fundamentals/quiz.md +61 -0
  209. package/modules/react-native-fundamentals/resources.md +24 -0
  210. package/modules/react-native-fundamentals/walkthrough.md +84 -0
  211. package/modules/registry.yaml +1650 -0
  212. package/modules/risk-management/content.md +162 -0
  213. package/modules/risk-management/exercises.md +86 -0
  214. package/modules/risk-management/module.yaml +41 -0
  215. package/modules/risk-management/quick-ref.md +82 -0
  216. package/modules/risk-management/quiz.md +73 -0
  217. package/modules/risk-management/resources.md +40 -0
  218. package/modules/risk-management/walkthrough.md +67 -0
  219. package/modules/running-effective-standups/content.md +119 -0
  220. package/modules/running-effective-standups/exercises.md +79 -0
  221. package/modules/running-effective-standups/module.yaml +40 -0
  222. package/modules/running-effective-standups/quick-ref.md +61 -0
  223. package/modules/running-effective-standups/quiz.md +73 -0
  224. package/modules/running-effective-standups/resources.md +36 -0
  225. package/modules/running-effective-standups/walkthrough.md +76 -0
  226. package/modules/solid-principles/content.md +154 -0
  227. package/modules/solid-principles/exercises.md +107 -0
  228. package/modules/solid-principles/module.yaml +42 -0
  229. package/modules/solid-principles/quick-ref.md +50 -0
  230. package/modules/solid-principles/quiz.md +102 -0
  231. package/modules/solid-principles/resources.md +39 -0
  232. package/modules/solid-principles/walkthrough.md +84 -0
  233. package/modules/sprint-planning/content.md +142 -0
  234. package/modules/sprint-planning/exercises.md +79 -0
  235. package/modules/sprint-planning/game.yaml +84 -0
  236. package/modules/sprint-planning/module.yaml +44 -0
  237. package/modules/sprint-planning/quick-ref.md +76 -0
  238. package/modules/sprint-planning/quiz.md +102 -0
  239. package/modules/sprint-planning/resources.md +39 -0
  240. package/modules/sprint-planning/walkthrough.md +75 -0
  241. package/modules/sql-fundamentals/content.md +160 -0
  242. package/modules/sql-fundamentals/exercises.md +87 -0
  243. package/modules/sql-fundamentals/game.yaml +105 -0
  244. package/modules/sql-fundamentals/module.yaml +45 -0
  245. package/modules/sql-fundamentals/quick-ref.md +53 -0
  246. package/modules/sql-fundamentals/quiz.md +103 -0
  247. package/modules/sql-fundamentals/resources.md +42 -0
  248. package/modules/sql-fundamentals/walkthrough.md +92 -0
  249. package/modules/sql-fundamentals/workshop.yaml +109 -0
  250. package/modules/stakeholder-communication/content.md +186 -0
  251. package/modules/stakeholder-communication/exercises.md +87 -0
  252. package/modules/stakeholder-communication/module.yaml +38 -0
  253. package/modules/stakeholder-communication/quick-ref.md +89 -0
  254. package/modules/stakeholder-communication/quiz.md +73 -0
  255. package/modules/stakeholder-communication/resources.md +41 -0
  256. package/modules/stakeholder-communication/walkthrough.md +74 -0
  257. package/modules/system-design/content.md +149 -0
  258. package/modules/system-design/exercises.md +83 -0
  259. package/modules/system-design/game.yaml +95 -0
  260. package/modules/system-design/module.yaml +46 -0
  261. package/modules/system-design/quick-ref.md +59 -0
  262. package/modules/system-design/quiz.md +102 -0
  263. package/modules/system-design/resources.md +46 -0
  264. package/modules/system-design/walkthrough.md +90 -0
  265. package/modules/team-topologies/content.md +166 -0
  266. package/modules/team-topologies/exercises.md +85 -0
  267. package/modules/team-topologies/module.yaml +41 -0
  268. package/modules/team-topologies/quick-ref.md +61 -0
  269. package/modules/team-topologies/quiz.md +101 -0
  270. package/modules/team-topologies/resources.md +37 -0
  271. package/modules/team-topologies/walkthrough.md +76 -0
  272. package/modules/technical-debt/content.md +111 -0
  273. package/modules/technical-debt/exercises.md +92 -0
  274. package/modules/technical-debt/module.yaml +39 -0
  275. package/modules/technical-debt/quick-ref.md +60 -0
  276. package/modules/technical-debt/quiz.md +73 -0
  277. package/modules/technical-debt/resources.md +25 -0
  278. package/modules/technical-debt/walkthrough.md +94 -0
  279. package/modules/technical-mentoring/content.md +128 -0
  280. package/modules/technical-mentoring/exercises.md +84 -0
  281. package/modules/technical-mentoring/module.yaml +41 -0
  282. package/modules/technical-mentoring/quick-ref.md +74 -0
  283. package/modules/technical-mentoring/quiz.md +73 -0
  284. package/modules/technical-mentoring/resources.md +33 -0
  285. package/modules/technical-mentoring/walkthrough.md +65 -0
  286. package/modules/test-strategy/content.md +136 -0
  287. package/modules/test-strategy/exercises.md +84 -0
  288. package/modules/test-strategy/game.yaml +99 -0
  289. package/modules/test-strategy/module.yaml +45 -0
  290. package/modules/test-strategy/quick-ref.md +66 -0
  291. package/modules/test-strategy/quiz.md +99 -0
  292. package/modules/test-strategy/resources.md +60 -0
  293. package/modules/test-strategy/walkthrough.md +97 -0
  294. package/modules/test-strategy/workshop.yaml +96 -0
  295. package/modules/typescript-fundamentals/content.md +127 -0
  296. package/modules/typescript-fundamentals/exercises.md +79 -0
  297. package/modules/typescript-fundamentals/game.yaml +111 -0
  298. package/modules/typescript-fundamentals/module.yaml +45 -0
  299. package/modules/typescript-fundamentals/quick-ref.md +55 -0
  300. package/modules/typescript-fundamentals/quiz.md +104 -0
  301. package/modules/typescript-fundamentals/resources.md +42 -0
  302. package/modules/typescript-fundamentals/walkthrough.md +71 -0
  303. package/modules/typescript-fundamentals/workshop.yaml +146 -0
  304. package/modules/user-story-mapping/content.md +123 -0
  305. package/modules/user-story-mapping/exercises.md +87 -0
  306. package/modules/user-story-mapping/module.yaml +41 -0
  307. package/modules/user-story-mapping/quick-ref.md +64 -0
  308. package/modules/user-story-mapping/quiz.md +73 -0
  309. package/modules/user-story-mapping/resources.md +29 -0
  310. package/modules/user-story-mapping/walkthrough.md +86 -0
  311. package/modules/writing-prds/content.md +133 -0
  312. package/modules/writing-prds/exercises.md +93 -0
  313. package/modules/writing-prds/game.yaml +83 -0
  314. package/modules/writing-prds/module.yaml +44 -0
  315. package/modules/writing-prds/quick-ref.md +77 -0
  316. package/modules/writing-prds/quiz.md +103 -0
  317. package/modules/writing-prds/resources.md +30 -0
  318. package/modules/writing-prds/walkthrough.md +87 -0
  319. package/package.json +2 -2
  320. package/canvas-dist/assets/_basePickBy-BovdgFIW.js +0 -1
  321. package/canvas-dist/assets/_basePickBy-BtkHe2u_.js +0 -1
  322. package/canvas-dist/assets/_basePickBy-C0936578.js +0 -1
  323. package/canvas-dist/assets/_basePickBy-CE2Qvuh7.js +0 -1
  324. package/canvas-dist/assets/_basePickBy-DV6sX4CG.js +0 -1
  325. package/canvas-dist/assets/_basePickBy-DZX6ZNMT.js +0 -1
  326. package/canvas-dist/assets/_baseUniq-B7dN28TM.js +0 -1
  327. package/canvas-dist/assets/_baseUniq-Cl23fCdR.js +0 -1
  328. package/canvas-dist/assets/_baseUniq-CojWFw7B.js +0 -1
  329. package/canvas-dist/assets/_baseUniq-DA640BJl.js +0 -1
  330. package/canvas-dist/assets/_baseUniq-Ds-62CCj.js +0 -1
  331. package/canvas-dist/assets/_baseUniq-KG7SRw9H.js +0 -1
  332. package/canvas-dist/assets/arc-7E9FFKlC.js +0 -1
  333. package/canvas-dist/assets/arc-BSMfRZtt.js +0 -1
  334. package/canvas-dist/assets/arc-C6nT-koR.js +0 -1
  335. package/canvas-dist/assets/arc-D_fOnjmo.js +0 -1
  336. package/canvas-dist/assets/arc-Khfvgkr3.js +0 -1
  337. package/canvas-dist/assets/arc-ieS-i42x.js +0 -1
  338. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DF4t6GQD.js +0 -36
  339. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DXgSlsio.js +0 -36
  340. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DiomxPB4.js +0 -36
  341. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-DnFaxvXD.js +0 -36
  342. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-Dt38C0LJ.js +0 -36
  343. package/canvas-dist/assets/architectureDiagram-VXUJARFQ-egbtMwua.js +0 -36
  344. package/canvas-dist/assets/blockDiagram-VD42YOAC-CUNKQd-b.js +0 -122
  345. package/canvas-dist/assets/blockDiagram-VD42YOAC-D-NiLXxd.js +0 -122
  346. package/canvas-dist/assets/blockDiagram-VD42YOAC-Dx6Dh9gg.js +0 -122
  347. package/canvas-dist/assets/blockDiagram-VD42YOAC-_r-PmlQy.js +0 -122
  348. package/canvas-dist/assets/blockDiagram-VD42YOAC-bvYKZLMc.js +0 -122
  349. package/canvas-dist/assets/blockDiagram-VD42YOAC-l85QT9Ig.js +0 -122
  350. package/canvas-dist/assets/c4Diagram-YG6GDRKO-BWKCTyQi.js +0 -10
  351. package/canvas-dist/assets/c4Diagram-YG6GDRKO-CbXs2xzC.js +0 -10
  352. package/canvas-dist/assets/c4Diagram-YG6GDRKO-CjiS-GNK.js +0 -10
  353. package/canvas-dist/assets/c4Diagram-YG6GDRKO-D7SnLlHp.js +0 -10
  354. package/canvas-dist/assets/c4Diagram-YG6GDRKO-RTTCSVf2.js +0 -10
  355. package/canvas-dist/assets/c4Diagram-YG6GDRKO-yvqJ_AqX.js +0 -10
  356. package/canvas-dist/assets/channel-CSXq7GP6.js +0 -1
  357. package/canvas-dist/assets/channel-CvujjGiJ.js +0 -1
  358. package/canvas-dist/assets/channel-D959Iony.js +0 -1
  359. package/canvas-dist/assets/channel-DOSwCnrB.js +0 -1
  360. package/canvas-dist/assets/channel-sw61LzxF.js +0 -1
  361. package/canvas-dist/assets/channel-vZVnNhOK.js +0 -1
  362. package/canvas-dist/assets/chunk-4BX2VUAB-BBjuAwXr.js +0 -1
  363. package/canvas-dist/assets/chunk-4BX2VUAB-BXRNyucU.js +0 -1
  364. package/canvas-dist/assets/chunk-4BX2VUAB-Bgq5Z77T.js +0 -1
  365. package/canvas-dist/assets/chunk-4BX2VUAB-BuoMCMCr.js +0 -1
  366. package/canvas-dist/assets/chunk-4BX2VUAB-COD5n7vg.js +0 -1
  367. package/canvas-dist/assets/chunk-4BX2VUAB-K8DepKJO.js +0 -1
  368. package/canvas-dist/assets/chunk-55IACEB6-Bic_bMrQ.js +0 -1
  369. package/canvas-dist/assets/chunk-55IACEB6-DEy2QUDq.js +0 -1
  370. package/canvas-dist/assets/chunk-55IACEB6-Dcgbmfzg.js +0 -1
  371. package/canvas-dist/assets/chunk-55IACEB6-DfmuNm_E.js +0 -1
  372. package/canvas-dist/assets/chunk-55IACEB6-DlQRcczm.js +0 -1
  373. package/canvas-dist/assets/chunk-55IACEB6-p2qMY-fm.js +0 -1
  374. package/canvas-dist/assets/chunk-B4BG7PRW-BpbyxBP2.js +0 -165
  375. package/canvas-dist/assets/chunk-B4BG7PRW-CCPqvPrP.js +0 -165
  376. package/canvas-dist/assets/chunk-B4BG7PRW-CEeDPAki.js +0 -165
  377. package/canvas-dist/assets/chunk-B4BG7PRW-D2UFN_2M.js +0 -165
  378. package/canvas-dist/assets/chunk-B4BG7PRW-DFI5h6HC.js +0 -165
  379. package/canvas-dist/assets/chunk-B4BG7PRW-DKOiFGMU.js +0 -165
  380. package/canvas-dist/assets/chunk-DI55MBZ5-BV6nHjNQ.js +0 -220
  381. package/canvas-dist/assets/chunk-DI55MBZ5-CEZJmC0E.js +0 -220
  382. package/canvas-dist/assets/chunk-DI55MBZ5-DOZT99Ek.js +0 -220
  383. package/canvas-dist/assets/chunk-DI55MBZ5-DmC2LoG2.js +0 -220
  384. package/canvas-dist/assets/chunk-DI55MBZ5-DpkcJdZP.js +0 -220
  385. package/canvas-dist/assets/chunk-DI55MBZ5-fVTGx0zh.js +0 -220
  386. package/canvas-dist/assets/chunk-FMBD7UC4-BOCyQpI7.js +0 -15
  387. package/canvas-dist/assets/chunk-FMBD7UC4-C76FrRL8.js +0 -15
  388. package/canvas-dist/assets/chunk-FMBD7UC4-CAq-btWc.js +0 -15
  389. package/canvas-dist/assets/chunk-FMBD7UC4-CidVsej6.js +0 -15
  390. package/canvas-dist/assets/chunk-FMBD7UC4-DPpfskdX.js +0 -15
  391. package/canvas-dist/assets/chunk-FMBD7UC4-DnLtclge.js +0 -15
  392. package/canvas-dist/assets/chunk-QN33PNHL-BclpCUi8.js +0 -1
  393. package/canvas-dist/assets/chunk-QN33PNHL-DDUw8IU1.js +0 -1
  394. package/canvas-dist/assets/chunk-QN33PNHL-DdJFAUXw.js +0 -1
  395. package/canvas-dist/assets/chunk-QN33PNHL-DjV4jUn9.js +0 -1
  396. package/canvas-dist/assets/chunk-QN33PNHL-N-HTycqU.js +0 -1
  397. package/canvas-dist/assets/chunk-QN33PNHL-sd8p21DW.js +0 -1
  398. package/canvas-dist/assets/chunk-QZHKN3VN-B6mT-JkP.js +0 -1
  399. package/canvas-dist/assets/chunk-QZHKN3VN-BCo8pc7x.js +0 -1
  400. package/canvas-dist/assets/chunk-QZHKN3VN-C8IIu6es.js +0 -1
  401. package/canvas-dist/assets/chunk-QZHKN3VN-D9FF492U.js +0 -1
  402. package/canvas-dist/assets/chunk-QZHKN3VN-DWMbUjXT.js +0 -1
  403. package/canvas-dist/assets/chunk-QZHKN3VN-l5FBJ77g.js +0 -1
  404. package/canvas-dist/assets/chunk-TZMSLE5B-BASt-UWt.js +0 -1
  405. package/canvas-dist/assets/chunk-TZMSLE5B-BCfaZWLT.js +0 -1
  406. package/canvas-dist/assets/chunk-TZMSLE5B-BKIk_hBR.js +0 -1
  407. package/canvas-dist/assets/chunk-TZMSLE5B-C4pt-Ir8.js +0 -1
  408. package/canvas-dist/assets/chunk-TZMSLE5B-DwGlELvo.js +0 -1
  409. package/canvas-dist/assets/chunk-TZMSLE5B-jJKG-WvJ.js +0 -1
  410. package/canvas-dist/assets/classDiagram-2ON5EDUG-B7YQfPU4.js +0 -1
  411. package/canvas-dist/assets/classDiagram-2ON5EDUG-BZ61MaHY.js +0 -1
  412. package/canvas-dist/assets/classDiagram-2ON5EDUG-CGseYor2.js +0 -1
  413. package/canvas-dist/assets/classDiagram-2ON5EDUG-CKzOc99J.js +0 -1
  414. package/canvas-dist/assets/classDiagram-2ON5EDUG-Ce_LPjwW.js +0 -1
  415. package/canvas-dist/assets/classDiagram-2ON5EDUG-DorPdibv.js +0 -1
  416. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-B7YQfPU4.js +0 -1
  417. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-BZ61MaHY.js +0 -1
  418. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CGseYor2.js +0 -1
  419. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-CKzOc99J.js +0 -1
  420. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-Ce_LPjwW.js +0 -1
  421. package/canvas-dist/assets/classDiagram-v2-WZHVMYZB-DorPdibv.js +0 -1
  422. package/canvas-dist/assets/clone-74KSto7H.js +0 -1
  423. package/canvas-dist/assets/clone-CJQgAYVe.js +0 -1
  424. package/canvas-dist/assets/clone-DLeTuhHE.js +0 -1
  425. package/canvas-dist/assets/clone-D_IHK_lQ.js +0 -1
  426. package/canvas-dist/assets/clone-DxMUv1L9.js +0 -1
  427. package/canvas-dist/assets/clone-UNKf_nED.js +0 -1
  428. package/canvas-dist/assets/cose-bilkent-S5V4N54A-BTyQiCkr.js +0 -1
  429. package/canvas-dist/assets/cose-bilkent-S5V4N54A-BtPAe24N.js +0 -1
  430. package/canvas-dist/assets/cose-bilkent-S5V4N54A-DIjE7V3m.js +0 -1
  431. package/canvas-dist/assets/cose-bilkent-S5V4N54A-DKL_BGvE.js +0 -1
  432. package/canvas-dist/assets/cose-bilkent-S5V4N54A-LZ4OsCLU.js +0 -1
  433. package/canvas-dist/assets/cose-bilkent-S5V4N54A-XWeJtgga.js +0 -1
  434. package/canvas-dist/assets/dagre-6UL2VRFP-BJ2vcFwR.js +0 -4
  435. package/canvas-dist/assets/dagre-6UL2VRFP-C1FlE5s8.js +0 -4
  436. package/canvas-dist/assets/dagre-6UL2VRFP-C3BWFgl6.js +0 -4
  437. package/canvas-dist/assets/dagre-6UL2VRFP-CUnx73Rf.js +0 -4
  438. package/canvas-dist/assets/dagre-6UL2VRFP-Do10BY1y.js +0 -4
  439. package/canvas-dist/assets/dagre-6UL2VRFP-rOZEkrsg.js +0 -4
  440. package/canvas-dist/assets/diagram-PSM6KHXK-BGi_qzbq.js +0 -24
  441. package/canvas-dist/assets/diagram-PSM6KHXK-C3Nv7h_j.js +0 -24
  442. package/canvas-dist/assets/diagram-PSM6KHXK-CsMy-r0n.js +0 -24
  443. package/canvas-dist/assets/diagram-PSM6KHXK-Dj8g7kGt.js +0 -24
  444. package/canvas-dist/assets/diagram-PSM6KHXK-Dxb1w_7r.js +0 -24
  445. package/canvas-dist/assets/diagram-PSM6KHXK-kVMBkEyV.js +0 -24
  446. package/canvas-dist/assets/diagram-QEK2KX5R-4bsrr1WZ.js +0 -43
  447. package/canvas-dist/assets/diagram-QEK2KX5R-Bv7BmKfI.js +0 -43
  448. package/canvas-dist/assets/diagram-QEK2KX5R-C_FLN6hv.js +0 -43
  449. package/canvas-dist/assets/diagram-QEK2KX5R-Csuk5L3z.js +0 -43
  450. package/canvas-dist/assets/diagram-QEK2KX5R-D5Aszgz4.js +0 -43
  451. package/canvas-dist/assets/diagram-QEK2KX5R-DX58f87l.js +0 -43
  452. package/canvas-dist/assets/diagram-S2PKOQOG-1Q7hwiSd.js +0 -24
  453. package/canvas-dist/assets/diagram-S2PKOQOG-Bz9Vxi5V.js +0 -24
  454. package/canvas-dist/assets/diagram-S2PKOQOG-CdWgZIIc.js +0 -24
  455. package/canvas-dist/assets/diagram-S2PKOQOG-DBicbKFU.js +0 -24
  456. package/canvas-dist/assets/diagram-S2PKOQOG-DsXKwPtU.js +0 -24
  457. package/canvas-dist/assets/diagram-S2PKOQOG-L_SMHLXs.js +0 -24
  458. package/canvas-dist/assets/erDiagram-Q2GNP2WA-BYu7fh6H.js +0 -60
  459. package/canvas-dist/assets/erDiagram-Q2GNP2WA-CvnQ69BF.js +0 -60
  460. package/canvas-dist/assets/erDiagram-Q2GNP2WA-D3xm-Tdm.js +0 -60
  461. package/canvas-dist/assets/erDiagram-Q2GNP2WA-DIPpD8sj.js +0 -60
  462. package/canvas-dist/assets/erDiagram-Q2GNP2WA-DNgu6dMd.js +0 -60
  463. package/canvas-dist/assets/erDiagram-Q2GNP2WA-Decm8aB4.js +0 -60
  464. package/canvas-dist/assets/flowDiagram-NV44I4VS-2ymk2kw2.js +0 -162
  465. package/canvas-dist/assets/flowDiagram-NV44I4VS-BEPFOt6U.js +0 -162
  466. package/canvas-dist/assets/flowDiagram-NV44I4VS-BwqXYGfK.js +0 -162
  467. package/canvas-dist/assets/flowDiagram-NV44I4VS-CS1jax_z.js +0 -162
  468. package/canvas-dist/assets/flowDiagram-NV44I4VS-DQz5bf7r.js +0 -162
  469. package/canvas-dist/assets/flowDiagram-NV44I4VS-KW4T1sqF.js +0 -162
  470. package/canvas-dist/assets/ganttDiagram-JELNMOA3-B811prZt.js +0 -267
  471. package/canvas-dist/assets/ganttDiagram-JELNMOA3-C75pWm7X.js +0 -267
  472. package/canvas-dist/assets/ganttDiagram-JELNMOA3-CWsbo0fn.js +0 -267
  473. package/canvas-dist/assets/ganttDiagram-JELNMOA3-CbJozPBN.js +0 -267
  474. package/canvas-dist/assets/ganttDiagram-JELNMOA3-Co0cFt4c.js +0 -267
  475. package/canvas-dist/assets/ganttDiagram-JELNMOA3-I4PDqrRh.js +0 -267
  476. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-B-z0cLPt.js +0 -65
  477. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-Be40z-LF.js +0 -65
  478. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BejNaAVm.js +0 -65
  479. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-BqWDYr0X.js +0 -65
  480. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-DSvWGY-e.js +0 -65
  481. package/canvas-dist/assets/gitGraphDiagram-V2S2FVAM-HLYbyNJ5.js +0 -65
  482. package/canvas-dist/assets/graph-BE8KKsdf.js +0 -1
  483. package/canvas-dist/assets/graph-D6DzzszU.js +0 -1
  484. package/canvas-dist/assets/graph-DFR8Y_8s.js +0 -1
  485. package/canvas-dist/assets/graph-Da385cDY.js +0 -1
  486. package/canvas-dist/assets/graph-MU7gZz2B.js +0 -1
  487. package/canvas-dist/assets/graph-wjSBJwnf.js +0 -1
  488. package/canvas-dist/assets/index--ztw-8Rw.js +0 -647
  489. package/canvas-dist/assets/index-5TpIM6B1.js +0 -11
  490. package/canvas-dist/assets/index-BSswTuBk.js +0 -11
  491. package/canvas-dist/assets/index-BVvhMmjs.js +0 -11
  492. package/canvas-dist/assets/index-BY92Mj5g.js +0 -572
  493. package/canvas-dist/assets/index-CV7palC3.js +0 -572
  494. package/canvas-dist/assets/index-D9bmQGsB.js +0 -11
  495. package/canvas-dist/assets/index-DDIKkGv8.js +0 -592
  496. package/canvas-dist/assets/index-Dyo0NkPb.js +0 -574
  497. package/canvas-dist/assets/index-iQWajCow.js +0 -572
  498. package/canvas-dist/assets/index-m68YlAMU.js +0 -11
  499. package/canvas-dist/assets/index-mEoP57az.js +0 -11
  500. package/canvas-dist/assets/infoDiagram-HS3SLOUP--9BirqgJ.js +0 -2
  501. package/canvas-dist/assets/infoDiagram-HS3SLOUP-CSJVED2y.js +0 -2
  502. package/canvas-dist/assets/infoDiagram-HS3SLOUP-D68HIb2t.js +0 -2
  503. package/canvas-dist/assets/infoDiagram-HS3SLOUP-DK2VLGGz.js +0 -2
  504. package/canvas-dist/assets/infoDiagram-HS3SLOUP-PaFhn4yD.js +0 -2
  505. package/canvas-dist/assets/infoDiagram-HS3SLOUP-zLNG47sU.js +0 -2
  506. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-Bue2dR2X.js +0 -139
  507. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-CrgZfpdU.js +0 -139
  508. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-DUxWmkkC.js +0 -139
  509. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-OTFkv4pd.js +0 -139
  510. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-eK2_Zuu3.js +0 -139
  511. package/canvas-dist/assets/journeyDiagram-XKPGCS4Q-uds5Tz8D.js +0 -139
  512. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BETdiI7I.js +0 -89
  513. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-BdVh7KdN.js +0 -89
  514. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-Cxl8UM9S.js +0 -89
  515. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-DVPlx3I2.js +0 -89
  516. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-LtNWeoYB.js +0 -89
  517. package/canvas-dist/assets/kanban-definition-3W4ZIXB7-uvhEMvyE.js +0 -89
  518. package/canvas-dist/assets/layout-1OzszN14.js +0 -1
  519. package/canvas-dist/assets/layout-CJSupFcF.js +0 -1
  520. package/canvas-dist/assets/layout-DFRmxN_c.js +0 -1
  521. package/canvas-dist/assets/layout-DSu-zk7y.js +0 -1
  522. package/canvas-dist/assets/layout-TGcrvApd.js +0 -1
  523. package/canvas-dist/assets/layout-eStc8SYK.js +0 -1
  524. package/canvas-dist/assets/linear-9qlE6xa7.js +0 -1
  525. package/canvas-dist/assets/linear-CBfFWnLD.js +0 -1
  526. package/canvas-dist/assets/linear-Cv4ai8Hq.js +0 -1
  527. package/canvas-dist/assets/linear-DDzz65E6.js +0 -1
  528. package/canvas-dist/assets/linear-wbIqhwDf.js +0 -1
  529. package/canvas-dist/assets/linear-wyNKl76F.js +0 -1
  530. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-3l4YzhEM.js +0 -68
  531. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-B-KkpNlw.js +0 -68
  532. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-DHMHWgmT.js +0 -68
  533. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-Dqfyg4Z2.js +0 -68
  534. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-NeRYOzsq.js +0 -68
  535. package/canvas-dist/assets/mindmap-definition-VGOIOE7T-xyu628P9.js +0 -68
  536. package/canvas-dist/assets/pieDiagram-ADFJNKIX-BWNzVAGj.js +0 -30
  537. package/canvas-dist/assets/pieDiagram-ADFJNKIX-Bm3PXYs-.js +0 -30
  538. package/canvas-dist/assets/pieDiagram-ADFJNKIX-BvvN7VvQ.js +0 -30
  539. package/canvas-dist/assets/pieDiagram-ADFJNKIX-BwU7AN7W.js +0 -30
  540. package/canvas-dist/assets/pieDiagram-ADFJNKIX-CHgwWCaM.js +0 -30
  541. package/canvas-dist/assets/pieDiagram-ADFJNKIX-DlZc8YOh.js +0 -30
  542. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B-Zd8OFp.js +0 -7
  543. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-B1CnJyxI.js +0 -7
  544. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C0Qo00b9.js +0 -7
  545. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-C9bx3nEJ.js +0 -7
  546. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-UHENkiRO.js +0 -7
  547. package/canvas-dist/assets/quadrantDiagram-AYHSOK5B-jKfurTPU.js +0 -7
  548. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BPpNNusD.js +0 -64
  549. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-BwZF1NIK.js +0 -64
  550. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-CaT3Frtk.js +0 -64
  551. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-Dfoz7R_7.js +0 -64
  552. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-DsrX4TT-.js +0 -64
  553. package/canvas-dist/assets/requirementDiagram-UZGBJVZJ-dmouSXOl.js +0 -64
  554. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BEy-A1Fu.js +0 -10
  555. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BViMBiAQ.js +0 -10
  556. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-BqrM-qWN.js +0 -10
  557. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DRkRC9qB.js +0 -10
  558. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-DbuzKCtn.js +0 -10
  559. package/canvas-dist/assets/sankeyDiagram-TZEHDZUN-_aHMKbpw.js +0 -10
  560. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-B8FOaL2Q.js +0 -145
  561. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-C02NQwOB.js +0 -145
  562. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CgyHivPj.js +0 -145
  563. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-CzW1WaEm.js +0 -145
  564. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-DJhHI1pe.js +0 -145
  565. package/canvas-dist/assets/sequenceDiagram-WL72ISMW-VFkpAeoG.js +0 -145
  566. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BSqFX4PJ.js +0 -1
  567. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-BnXhhxkN.js +0 -1
  568. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-ClARVrvt.js +0 -1
  569. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-CuC6xesY.js +0 -1
  570. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-DcAiGjph.js +0 -1
  571. package/canvas-dist/assets/stateDiagram-FKZM4ZOC-aBg0hjTp.js +0 -1
  572. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-8fib9ftc.js +0 -1
  573. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-B-DO0ZqO.js +0 -1
  574. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-BksbsE4k.js +0 -1
  575. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-C2DJCNPK.js +0 -1
  576. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-CeA5jba6.js +0 -1
  577. package/canvas-dist/assets/stateDiagram-v2-4FDKWEC3-zsAyq0tK.js +0 -1
  578. package/canvas-dist/assets/timeline-definition-IT6M3QCI-BaHdYD2h.js +0 -61
  579. package/canvas-dist/assets/timeline-definition-IT6M3QCI-Bl2hg8IM.js +0 -61
  580. package/canvas-dist/assets/timeline-definition-IT6M3QCI-CrVwLiGm.js +0 -61
  581. package/canvas-dist/assets/timeline-definition-IT6M3QCI-DrXGRjnB.js +0 -61
  582. package/canvas-dist/assets/timeline-definition-IT6M3QCI-cYAwshf6.js +0 -61
  583. package/canvas-dist/assets/timeline-definition-IT6M3QCI-flyL0y-3.js +0 -61
  584. package/canvas-dist/assets/treemap-GDKQZRPO-C4Hg8kJ_.js +0 -162
  585. package/canvas-dist/assets/treemap-GDKQZRPO-DVY2G9qY.js +0 -162
  586. package/canvas-dist/assets/treemap-GDKQZRPO-DpLWPA1z.js +0 -162
  587. package/canvas-dist/assets/treemap-GDKQZRPO-Ds86cUVw.js +0 -162
  588. package/canvas-dist/assets/treemap-GDKQZRPO-DwmoI6tH.js +0 -162
  589. package/canvas-dist/assets/treemap-GDKQZRPO-SsGFkgVd.js +0 -162
  590. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-B9c1iLBf.js +0 -7
  591. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-BpX6MPWa.js +0 -7
  592. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CEgW_j0p.js +0 -7
  593. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CSEFGEQX.js +0 -7
  594. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-CnG4XoMc.js +0 -7
  595. package/canvas-dist/assets/xychartDiagram-PRI3JC2R-Dftj3Bt3.js +0 -7
@@ -0,0 +1,98 @@
1
+ # AI-Assisted Test Generation Exercises
2
+
3
+ ## Exercise 1: Write a Test Generation Prompt
4
+
5
+ **Task:** For this function, write a prompt you'd use to generate unit tests. Include: framework (Vitest), desired cases, and any style preferences.
6
+
7
+ ```javascript
8
+ function slugify(text) {
9
+ return String(text)
10
+ .toLowerCase()
11
+ .trim()
12
+ .replace(/\s+/g, '-')
13
+ .replace(/[^a-z0-9-]/g, '');
14
+ }
15
+ ```
16
+
17
+ **Validation:**
18
+ - [ ] Prompt includes the function (or clear reference)
19
+ - [ ] Framework specified
20
+ - [ ] At least 3 case types (e.g., happy, empty, special chars)
21
+ - [ ] Prompt is specific enough to get usable output
22
+
23
+ **Hints:**
24
+ 1. What happens with "Hello World", "", "UPPERCASE", "a—b"?
25
+ 2. Specify assert style: toBe, toEqual, toMatch
26
+ 3. Include "trim and replace" behavior in the prompt
27
+
28
+ ---
29
+
30
+ ## Exercise 2: Critique and Fix a Generated Test
31
+
32
+ **Task:** This test was AI-generated. Identify 2 problems and fix them.
33
+
34
+ ```javascript
35
+ test('fetchUser works', async () => {
36
+ const result = await fetchUser(1);
37
+ expect(result).toBeTruthy();
38
+ });
39
+ ```
40
+
41
+ **Validation:**
42
+ - [ ] Identifies shallow assertion (toBeTruthy)
43
+ - [ ] Identifies missing mock/setup if fetchUser hits network
44
+ - [ ] Proposes concrete improvements (e.g., expect(result.name).toBe('Alice'))
45
+
46
+ **Hints:**
47
+ 1. What does toBeTruthy actually verify?
48
+ 2. Does fetchUser need a mock? What would happen without it?
49
+ 3. What would a strong assertion look like?
50
+
51
+ ---
52
+
53
+ ## Exercise 3: Generate and Review
54
+
55
+ **Task:** Use Claude (or another AI) to generate tests for `slugify` from Exercise 1. Run them. Then review using the checklist: assertions verify behavior? Edge cases covered? Tests independent? List 2 improvements you'd make.
56
+
57
+ **Validation:**
58
+ - [ ] Tests were generated and run
59
+ - [ ] At least one improvement identified
60
+ - [ ] Improvement is actionable (specific change, not vague)
61
+
62
+ **Hints:**
63
+ 1. Try the prompt you wrote in Exercise 1
64
+ 2. Run with `npx vitest run` or your project's test command
65
+ 3. Look for toBeDefined, toBeTruthy, or missing edge cases
66
+
67
+ ---
68
+
69
+ ## Exercise 4: AI for Integration Test Setup
70
+
71
+ **Task:** You have an API endpoint `POST /users` that creates a user. Writing integration tests requires: DB setup, request body, and assertions. Write a prompt that asks AI to generate one integration test, including setup and teardown. Specify your stack (e.g., Node, Express, Jest, supertest).
72
+
73
+ **Validation:**
74
+ - [ ] Prompt specifies stack and tools
75
+ - [ ] Asks for setup (DB, server) and teardown
76
+ - [ ] Asks for clear assertion (status, body shape)
77
+ - [ ] Understands AI may need refinement—integration is complex
78
+
79
+ **Hints:**
80
+ 1. "Generate integration test for POST /users with Jest and supertest"
81
+ 2. Include: how to start/stop server, reset DB
82
+ 3. Ask for status 201 and body containing id, name, email
83
+
84
+ ---
85
+
86
+ ## Exercise 5: Build a Prompt Template
87
+
88
+ **Task:** Create a reusable prompt template for unit test generation. Use placeholders like [FUNCTION], [FRAMEWORK], [CASES]. Write 2 example fills (different functions) showing how you'd use it.
89
+
90
+ **Validation:**
91
+ - [ ] Template has clear placeholders
92
+ - [ ] Template includes context that improves output (framework, style, cases)
93
+ - [ ] Both examples would produce usable prompts
94
+
95
+ **Hints:**
96
+ 1. Start with: "Generate [FRAMEWORK] unit tests for [FUNCTION]..."
97
+ 2. Add: "Include [CASES]. Use [STYLE]."
98
+ 3. Example: [FUNCTION]=parsePrice, [CASES]=happy, null, invalid
@@ -0,0 +1,39 @@
1
+ slug: ai-test-generation
2
+ title: "AI-Assisted Test Generation — Using Claude for Coverage"
3
+ version: 1.0.0
4
+ description: "Use AI to generate tests—prompting strategies, review practices, and combining human judgment with AI speed."
5
+ category: quality-assurance
6
+ tags: [ai, testing, test-generation, claude, automation, coverage]
7
+ difficulty: intermediate
8
+
9
+ xp:
10
+ read: 15
11
+ walkthrough: 40
12
+ exercise: 25
13
+ quiz: 20
14
+ quiz-perfect-bonus: 10
15
+
16
+ time:
17
+ quick: 5
18
+ read: 20
19
+ guided: 50
20
+
21
+ prerequisites: [test-strategy]
22
+ related: [ai-pair-programming, prompt-engineering]
23
+
24
+ triggers:
25
+ - "How can AI help me write tests?"
26
+ - "Can Claude generate unit tests?"
27
+ - "How do I use AI for test coverage?"
28
+ - "What's the best way to prompt AI for tests?"
29
+
30
+ visuals:
31
+ diagrams: [diagram-mermaid, diagram-flow]
32
+ quiz-types: [quiz-timed-choice, quiz-matching]
33
+ playground: javascript
34
+ slides: true
35
+
36
+ sources:
37
+ - url: "https://docs.anthropic.com"
38
+ label: "Anthropic Claude Documentation"
39
+ type: docs
@@ -0,0 +1,65 @@
1
+ # AI-Assisted Test Generation Quick Reference
2
+
3
+ ## Prompt Checklist
4
+
5
+ - [ ] Function/code under test
6
+ - [ ] Framework (Jest, Vitest, Playwright)
7
+ - [ ] Case types (happy, edge, error)
8
+ - [ ] One example test for style
9
+ - [ ] Constraints (no mocks for X, use RTL)
10
+
11
+ ## AI Strengths
12
+
13
+ | Strength | Use For |
14
+ |----------|---------|
15
+ | Boilerplate | describe, it, expect structure |
16
+ | Edge cases | Empty, null, boundary suggestions |
17
+ | Test data | Fixtures, mocks, invalid inputs |
18
+ | Test doubles | Stub/mock generation |
19
+
20
+ ## AI Weaknesses
21
+
22
+ | Weakness | Human Must |
23
+ |----------|------------|
24
+ | Intent | Provide context and priorities |
25
+ | What matters | Choose what to test |
26
+ | Assertion quality | Review and strengthen |
27
+ | Framework quirks | Specify and verify |
28
+
29
+ ## Review Checklist for Generated Tests
30
+
31
+ - [ ] Assertions verify behavior, not just "defined"
32
+ - [ ] Edge cases and errors covered
33
+ - [ ] Mocks justified (not over-used)
34
+ - [ ] Test names are descriptive
35
+ - [ ] Tests are independent
36
+
37
+ ## Common Pitfalls
38
+
39
+ | Pitfall | Fix |
40
+ |---------|-----|
41
+ | expect(x).toBeDefined() | Assert expected value (toBe, toEqual) |
42
+ | Over-mocking | Use real deps for integration |
43
+ | Wrong framework | Specify in prompt; refine and regenerate |
44
+ | Missing edge cases | Ask for "boundary and invalid inputs" |
45
+
46
+ ## Iteration Loop
47
+
48
+ ```
49
+ Prompt → Generate → Run → Review → Refine prompt → (repeat)
50
+ ```
51
+
52
+ ## By Layer
53
+
54
+ | Layer | AI Does | You Do |
55
+ |-------|---------|--------|
56
+ | Unit | Draft + edge cases | Verify assertions, add critical cases |
57
+ | Integration | Setup, fixtures | Verify real flows, DB state |
58
+ | E2E | Steps, selectors | Choose scenarios, reduce flakiness |
59
+
60
+ ## One-Liners
61
+
62
+ - **Context wins**: Function + framework + examples = better tests.
63
+ - **Review always**: AI drafts; you verify.
64
+ - **Iterate prompts**: Save what works for your stack.
65
+ - **Human + AI**: You direct; AI speeds you up.
@@ -0,0 +1,74 @@
1
+ # AI-Assisted Test Generation Quiz
2
+
3
+ ## Question 1
4
+
5
+ What is AI typically good at when generating tests?
6
+
7
+ A) Deciding which tests matter most for your business
8
+ B) Generating boilerplate, edge cases, and test data
9
+ C) Knowing your team's testing conventions without being told
10
+ D) Writing perfect tests that never need review
11
+
12
+ <!-- ANSWER: B -->
13
+ <!-- EXPLANATION: AI excels at generating structure (describe, it, expect), suggesting edge cases, and creating fixtures. It does not know your business priorities or conventions without explicit context. -->
14
+
15
+ ## Question 2
16
+
17
+ Why should you review AI-generated tests critically?
18
+
19
+ A) AI always produces bugs
20
+ B) AI often produces shallow assertions and over-mocking that need strengthening
21
+ C) Review is only for style
22
+ D) AI-generated tests don't need review
23
+
24
+ <!-- ANSWER: B -->
25
+ <!-- EXPLANATION: AI commonly produces tests with weak assertions (e.g., toBeDefined), excessive mocking, or missing edge cases. Human review ensures tests actually verify behavior. -->
26
+
27
+ ## Question 3
28
+
29
+ What improves AI test generation prompts?
30
+
31
+ A) Longer prompts are always better
32
+ B) Providing the function, framework, example tests, and desired cases
33
+ C) Asking for "comprehensive" tests without specifics
34
+ D) Avoiding any examples to keep output original
35
+
36
+ <!-- ANSWER: B -->
37
+ <!-- EXPLANATION: Context matters: the function under test, the framework (Jest, Vitest), one example test for style, and specific case types (happy, edge, error) all improve output quality. -->
38
+
39
+ ## Question 4
40
+
41
+ When is AI most useful for test generation?
42
+
43
+ A) Only for e2e tests
44
+ B) For unit test boilerplate and edge case suggestions; human decides strategy
45
+ C) To replace all manual test writing
46
+ D) Only when you have no tests yet
47
+
48
+ <!-- ANSWER: B -->
49
+ <!-- EXPLANATION: AI is strongest for unit-level drafts and suggestions. Human judgment is essential for prioritization, integration/e2e strategy, and verifying assertions are meaningful. -->
50
+
51
+ ## Question 5
52
+
53
+ What should you do when AI generates tests with the wrong framework (e.g., Jest instead of Vitest)?
54
+
55
+ A) Manually rewrite every test
56
+ B) Refine the prompt to specify the framework and regenerate
57
+ C) Switch your project to match the AI output
58
+ D) Use the tests as-is since APIs are similar
59
+
60
+ <!-- ANSWER: B -->
61
+ <!-- EXPLANATION: Refining the prompt to explicitly specify Vitest (vi.fn(), vi.mock()) and regenerating is efficient. Building a prompt library for your stack avoids repeats. -->
62
+
63
+ ## Question 6
64
+
65
+ Match the AI capability to the test layer:
66
+
67
+ <!-- VISUAL: quiz-matching -->
68
+
69
+ - Unit tests :: Boilerplate, edge cases, mocks — human verifies assertions
70
+ - Integration tests :: Setup, fixtures, contracts — human verifies real flows
71
+ - E2E tests :: Selectors, steps — human chooses scenarios
72
+
73
+ <!-- ANSWER: (implicit from matching) -->
74
+ <!-- EXPLANATION: AI can draft at all layers, but human responsibility differs. Unit: verify assertions. Integration: verify real system behavior. E2E: choose what matters, avoid flakiness. -->
@@ -0,0 +1,41 @@
1
+ # AI-Assisted Test Generation — Resources
2
+
3
+ ## AI & Prompting
4
+
5
+ - [Anthropic Claude Documentation](https://docs.anthropic.com/) — Claude API, prompting, best practices.
6
+ - [Claude Prompt Engineering](https://docs.anthropic.com/claude/docs/prompt-engineering) — Context, examples, and structure.
7
+ - [OpenAI Prompt Engineering](https://platform.openai.com/docs/guides/prompt-engineering) — General prompting patterns (apply to Claude).
8
+ - [Prompt Engineering Guide](https://www.promptingguide.ai/) — Techniques for better prompts across models.
9
+
10
+ ## Testing Frameworks
11
+
12
+ - [Vitest](https://vitest.dev/) — Fast, ESM-native test runner. Great for JS/TS.
13
+ - [Jest](https://jestjs.io/) — Popular unit testing framework. Large ecosystem.
14
+ - [Playwright](https://playwright.dev/) — E2E testing. AI can help with selectors and flows.
15
+ - [Testing Library](https://testing-library.com/) — User-centric component tests. Specify in prompts.
16
+
17
+ ## Articles
18
+
19
+ - [AI-Generated Tests: What to Watch For](https://martinfowler.com/articles/ai-testing.html) — Martin Fowler (if available) or similar. Pitfalls of AI tests.
20
+ - [Using AI for Test Automation](https://www.ministryoftesting.com/articles) — Ministry of Testing. Practical tips.
21
+ - [Test Doubles and Mocks](https://martinfowler.com/bliki/TestDouble.html) — So AI generates the right kind.
22
+ - [Meaningful Assertions](https://kentcdodds.com/blog/what-to-test) — Kent C. Dodds. What to verify.
23
+
24
+ ## Tools
25
+
26
+ - [Cursor](https://cursor.com/) — AI-assisted IDE. Inline test generation.
27
+ - [GitHub Copilot](https://github.com/features/copilot) — Test generation in the editor.
28
+ - [Claude Code / Claude Codex](https://www.anthropic.com/product) — Coding-focused Claude.
29
+ - [Mocha / Chai](https://mochajs.org/) — Alternative test framework. Specify in prompts if used.
30
+
31
+ ## Best Practices
32
+
33
+ - [Test Strategy — Martin Fowler](https://martinfowler.com/articles/practical-test-pyramid.html) — Foundation for what to test.
34
+ - [Test-Driven Development](https://martinfowler.com/bliki/TestDrivenDevelopment.html) — TDD and AI: who drives?
35
+ - [Refactoring with Tests](https://refactoring.com/) — Safe refactoring; AI-generated tests support this.
36
+
37
+ ## Community
38
+
39
+ - [Ministry of Testing](https://www.ministryoftesting.com/) — Testing community, AI in testing discussions.
40
+ - [r/QualityAssurance](https://www.reddit.com/r/QualityAssurance/) — QA discussions, tool experiences.
41
+ - [Claude Community](https://www.anthropic.com/community) — Claude usage and prompting tips.
@@ -0,0 +1,100 @@
1
+ # AI-Assisted Test Generation Walkthrough — Learn by Doing
2
+
3
+ ## Before We Begin
4
+
5
+ **Diagnostic Question:** When AI generates tests, what could go wrong? What would you still need to verify or add yourself?
6
+
7
+ **Checkpoint:** You recognize that AI can draft tests but may miss edge cases, use the wrong assertions, or assume a different framework. Human review is essential.
8
+
9
+ ---
10
+
11
+ ## Step 1: Provide Context for a Test Prompt
12
+
13
+ You want AI to generate tests for this function:
14
+
15
+ <!-- hint:code language="javascript" highlight="1,5" -->
16
+
17
+ ```javascript
18
+ function parsePrice(input) {
19
+ if (input == null || input === '') return null;
20
+ const num = parseFloat(String(input).replace(/[^0-9.-]/g, ''));
21
+ return isNaN(num) ? null : Math.round(num * 100) / 100;
22
+ }
23
+ ```
24
+
25
+ **Task:** Write a prompt you'd send to Claude (or another AI) to generate unit tests. Include: the function, the framework (e.g., Vitest), what cases you want, and one example of a test style you prefer.
26
+
27
+ **Question:** What would happen if you only said "Generate tests for this function" without context?
28
+
29
+ **Checkpoint:** User includes: function code, Vitest, requested cases (happy, empty, null, invalid string, decimals), and maybe one example test. They understand minimal prompts produce generic output; context yields better tests.
30
+
31
+ ---
32
+
33
+ ## Step 2: Review AI-Generated Tests
34
+
35
+ <!-- hint:card type="warning" title="AI test pitfalls" -->
36
+
37
+ Suppose AI produced:
38
+
39
+ ```javascript
40
+ test('parses price', () => {
41
+ const result = parsePrice('$19.99');
42
+ expect(result).toBeDefined();
43
+ });
44
+ ```
45
+
46
+ **Task:** Why is this test weak? Rewrite it (or describe what to change) so it actually verifies behavior.
47
+
48
+ **Question:** What's the difference between "the code ran" and "the code did the right thing"?
49
+
50
+ **Checkpoint:** User identifies: toBeDefined() only checks non-null. Should assert expect(result).toBe(19.99) or similar. They understand assertions must verify expected output, not just "it didn't crash."
51
+
52
+ ---
53
+
54
+ ## Step 3: Generate Tests with Claude
55
+
56
+ **Task:** Pick a small function from your codebase (or use `parsePrice` above). Use Claude to generate unit tests. Provide: the function, framework, and at least 3 case types you want. Run the tests. What passed? What did you have to fix or improve?
57
+
58
+ **Question:** What did you learn about prompting from the first attempt? What would you add to the prompt next time?
59
+
60
+ **Checkpoint:** User completes the task, runs tests, and reflects. They note: maybe add "use toBe for numbers, toBeNull for null", or "include $ and , in input" to improve next output.
61
+
62
+ ---
63
+
64
+ ## Step 4: Use AI for Edge Cases
65
+
66
+ <!-- hint:buttons type="single" prompt="Which edge case would you add first?" options="17 and 121,18.5,eighteen" -->
67
+
68
+ You have a function that validates a user age (must be 18–120). You've written happy path tests.
69
+
70
+ **Task:** Prompt AI: "Suggest 5 edge case inputs for a function that validates age 18–120. Include boundary and invalid cases." List what AI suggests. Then evaluate: which would you actually add to your test suite? Why or why not?
71
+
72
+ **Question:** When would you reject an AI-suggested edge case?
73
+
74
+ **Checkpoint:** User gets suggestions (e.g., 17, 18, 120, 121, -1, "eighteen", 18.5). They evaluate: 18 and 120 are must-haves; 17 and 121 test boundaries; -1 and "eighteen" test invalid; 18.5 might be optional. They reject cases that don't match real usage (e.g., if age is always integer).
75
+
76
+ ---
77
+
78
+ ## Step 5: AI for Test Data
79
+
80
+ You need to test an API that accepts `{ name, email, createdAt }`. You want 3 valid and 2 invalid payloads.
81
+
82
+ **Task:** Write a prompt for AI to generate these payloads. What specific requirements would you include? (e.g., email format, date format, invalid examples)
83
+
84
+ **Question:** Why might AI-generated test data still need your review?
85
+
86
+ **Checkpoint:** User writes a clear prompt with constraints (valid email, ISO date, name length). They note: AI might generate data that passes validation but doesn't match real-world edge cases (Unicode, SQL injection attempts); human review catches those.
87
+
88
+ ---
89
+
90
+ ## Step 6: Iterate on a Failed Prompt
91
+
92
+ <!-- hint:celebrate -->
93
+
94
+ Your first prompt produced tests that used `jest.fn()` but your project uses Vitest (`vi.fn()`). The tests also didn't handle async.
95
+
96
+ **Task:** Write a refined prompt that would fix these issues. What would you add or change?
97
+
98
+ **Question:** How do you build a "prompt library" for test generation over time?
99
+
100
+ **Checkpoint:** User adds: "Use Vitest (vi.fn(), vi.mock())", "This function is async—use async/await in tests". They see value in saving successful prompts for reuse (framework, style, common patterns).
@@ -0,0 +1,189 @@
1
+ # API Design — REST, GraphQL, and Contract-First Thinking
2
+
3
+ <!-- hint:slides topic="API design: REST principles, GraphQL tradeoffs, contract-first design, versioning, pagination, and error handling" slides="6" -->
4
+
5
+ ## REST Principles
6
+
7
+ **REST** (Representational State Transfer) models the web as resources identified by URLs, manipulated via HTTP verbs.
8
+
9
+ | Principle | Meaning |
10
+ |-----------|---------|
11
+ | **Resources** | Nouns in URLs: `/users`, `/users/123`, `/users/123/orders` |
12
+ | **HTTP verbs** | GET (read), POST (create), PUT (replace), PATCH (partial update), DELETE (remove) |
13
+ | **Status codes** | 200 OK, 201 Created, 400 Bad Request, 404 Not Found, 429 Too Many Requests |
14
+ | **HATEOAS** | Responses include links to related resources (optional in practice) |
15
+
16
+ ## REST Naming Conventions
17
+
18
+ - **Plural nouns:** `/users` not `/user`
19
+ - **Hierarchy:** `/users/123/orders`
20
+ - **No verbs in URL:** Use POST `/users` not `POST /createUser`
21
+ - **Snake_case or camelCase:** Be consistent (JSON often uses camelCase)
22
+
23
+ Example:
24
+
25
+ ```http
26
+ GET /users/42/orders?status=active&limit=10
27
+ POST /users
28
+ {
29
+ "email": "alice@example.com",
30
+ "name": "Alice"
31
+ }
32
+ ```
33
+
34
+ ```mermaid
35
+ sequenceDiagram
36
+ participant Client
37
+ participant Gateway as API Gateway
38
+ participant Server
39
+ participant DB as Database
40
+ Client->>Gateway: HTTP Request
41
+ Gateway->>Server: Forward Request
42
+ Server->>DB: Query
43
+ DB-->>Server: Result
44
+ Server-->>Gateway: Response
45
+ Gateway-->>Client: HTTP Response
46
+ ```
47
+
48
+ ## GraphQL Basics
49
+
50
+ **GraphQL** lets clients request exactly the fields they need with a single endpoint.
51
+
52
+ ```graphql
53
+ query {
54
+ user(id: "42") {
55
+ name
56
+ email
57
+ orders(limit: 5) {
58
+ id
59
+ total
60
+ }
61
+ }
62
+ }
63
+ ```
64
+
65
+ - **Queries** — Read data
66
+ - **Mutations** — Create, update, delete
67
+ - **Schemas** — Strong typing; tools generate clients
68
+ - **Resolvers** — Server-side functions that fetch each field
69
+
70
+ ## REST vs GraphQL
71
+
72
+ ```mermaid
73
+ sequenceDiagram
74
+ participant C as Client
75
+ participant R as REST API
76
+ participant G as GraphQL API
77
+ C->>R: GET /users/1
78
+ R-->>C: Full user object
79
+ C->>R: GET /users/1/orders
80
+ R-->>C: Orders
81
+ Note over C,G: vs GraphQL
82
+ C->>G: POST /graphql { user { name orders { total } } }
83
+ G-->>C: Only requested fields, one round-trip
84
+ ```
85
+
86
+ | Criterion | REST | GraphQL |
87
+ |-----------|------|--------|
88
+ | **Over-fetching** | Common (full objects) | Client specifies fields |
89
+ | **Under-fetching** | Multiple requests (N+1) | Single request, nested |
90
+ | **Caching** | HTTP cache, CDN | Custom (normalized cache) |
91
+ | **Discoverability** | URLs, OpenAPI | Schema, introspection |
92
+ | **Complexity** | Simpler | Schema, resolvers, tooling |
93
+
94
+ **Use REST** when: CRUD-heavy, HTTP caching matters, clients are simple. **Use GraphQL** when: flexible queries, mobile (bandwidth), many clients with different needs.
95
+
96
+ ## Contract-First Design
97
+
98
+ Define the API before coding: **OpenAPI** (Swagger) for REST, **GraphQL schema** for GraphQL.
99
+
100
+ ```yaml
101
+ # OpenAPI snippet
102
+ paths:
103
+ /users/{id}:
104
+ get:
105
+ summary: Get user by ID
106
+ parameters:
107
+ - name: id
108
+ in: path
109
+ required: true
110
+ schema:
111
+ type: string
112
+ responses:
113
+ '200':
114
+ description: User object
115
+ '404':
116
+ description: Not found
117
+ ```
118
+
119
+ Benefits: generate clients, mock servers, documentation, validation.
120
+
121
+ ## API Versioning
122
+
123
+ | Strategy | Example | Pros / Cons |
124
+ |----------|---------|-------------|
125
+ | **URL** | `/v1/users`, `/v2/users` | Clear, cacheable; more URLs |
126
+ | **Header** | `Accept: application/vnd.api+json;version=2` | Clean URLs; less visible |
127
+ | **Query param** | `?version=2` | Simple; can be forgotten |
128
+ | **Media type** | `application/vnd.myapi.v2+json` | RESTful; verbose |
129
+
130
+ Common: **URL versioning** (`/v1/`, `/v2/`) — predictable, easy to route.
131
+
132
+ ## Pagination
133
+
134
+ | Strategy | Use Case |
135
+ |----------|----------|
136
+ | **Offset** | `?offset=20&limit=10` — Simple, can skip; inconsistent if data changes |
137
+ | **Cursor** | `?cursor=abc123&limit=10` — Stable for feeds; no random access |
138
+ | **Page** | `?page=3&per_page=10` — Human-friendly; same issues as offset |
139
+
140
+ **Cursor-based** is preferred for feeds and infinite scroll.
141
+
142
+ ## Error Handling
143
+
144
+ Return structured errors:
145
+
146
+ ```json
147
+ {
148
+ "error": {
149
+ "code": "VALIDATION_ERROR",
150
+ "message": "Invalid email format",
151
+ "details": [
152
+ { "field": "email", "reason": "Must be a valid email" }
153
+ ]
154
+ }
155
+ }
156
+ ```
157
+
158
+ Use appropriate status codes: `400` (client error), `401` (unauthorized), `403` (forbidden), `404` (not found), `429` (rate limited), `500` (server error).
159
+
160
+ ## Rate Limiting
161
+
162
+ Protect the API: return `429 Too Many Requests` and include headers:
163
+
164
+ ```http
165
+ X-RateLimit-Limit: 1000
166
+ X-RateLimit-Remaining: 42
167
+ X-RateLimit-Reset: 1640995200
168
+ Retry-After: 60
169
+ ```
170
+
171
+ ## Authentication
172
+
173
+ | Method | Use Case |
174
+ |--------|----------|
175
+ | **API Key** | Simple, server-to-server |
176
+ | **OAuth 2.0** | Delegated access, user consent |
177
+ | **JWT** | Stateless, signed tokens; include in `Authorization: Bearer <token>` |
178
+
179
+ Always use HTTPS for credentials.
180
+
181
+ ## Key Takeaways
182
+
183
+ - **REST:** Resources, verbs, status codes; good for CRUD
184
+ - **GraphQL:** Flexible queries, one endpoint; good for varied clients
185
+ - **Contract-first:** Define schema/OpenAPI before implementation
186
+ - **Version** explicitly (URL or header)
187
+ - **Pagination:** Prefer cursor for feeds
188
+ - **Errors:** Structured body, correct status codes
189
+ - **Rate limit** and **authenticate** securely
@@ -0,0 +1,84 @@
1
+ # API Design Exercises
2
+
3
+ ## Exercise 1: REST Resource Design
4
+
5
+ **Task:** Design REST endpoints for a "books" API: list books, get one book, create a book, update a book, delete a book. Include: URL, method, request body (where applicable), and key response codes.
6
+
7
+ **Validation:**
8
+ - [ ] Plural resource name (`/books`)
9
+ - [ ] Correct HTTP verbs for each action
10
+ - [ ] 201 for create, 200 for get/update, 204 for delete
11
+ - [ ] Request body for create and update
12
+
13
+ **Hints:**
14
+ 1. GET /books — list, GET /books/:id — get one
15
+ 2. POST /books — create (body: title, author, isbn)
16
+ 3. PUT or PATCH /books/:id — update
17
+ 4. DELETE /books/:id — delete (204 No Content)
18
+
19
+ ---
20
+
21
+ ## Exercise 2: GraphQL Query and Mutation
22
+
23
+ **Task:** Design a GraphQL schema and one query + one mutation for a "tasks" API. Query: get task by id with title, status, assignee name. Mutation: create task with title and assigneeId. Write the schema types and the query/mutation.
24
+
25
+ **Validation:**
26
+ - [ ] Task type with id, title, status, assignee
27
+ - [ ] Query: task(id: ID!): Task
28
+ - [ ] Mutation: createTask(title: String!, assigneeId: ID!): Task
29
+ - [ ] Assignee can be embedded or referenced
30
+
31
+ **Hints:**
32
+ 1. type Task { id: ID! title: String! status: String assignee: User }
33
+ 2. type User { id: ID! name: String }
34
+ 3. createTask returns Task (with id from server)
35
+
36
+ ---
37
+
38
+ ## Exercise 3: OpenAPI Snippet
39
+
40
+ **Task:** Write OpenAPI 3.0 for `GET /books` and `POST /books`. Include: parameters (optional: author, limit), request/response schemas, status codes 200, 201, 400.
41
+
42
+ **Validation:**
43
+ - [ ] paths./books with get and post
44
+ - [ ] GET has parameters; POST has requestBody
45
+ - [ ] Schemas for Book (id, title, author)
46
+ - [ ] Correct status codes
47
+
48
+ **Hints:**
49
+ 1. openapi: 3.0.0, paths, components.schemas
50
+ 2. parameters: author (query), limit (query, default 20)
51
+ 3. requestBody for POST: application/json, required: title, author
52
+
53
+ ---
54
+
55
+ ## Exercise 4: Pagination Comparison
56
+
57
+ **Task:** Compare offset and cursor pagination for a feed of 10,000 items. Scenario: user requests page 5 (offset 40). Between requests, 3 items are inserted at the start. What does the user see with offset vs cursor? Which is better for a social feed?
58
+
59
+ **Validation:**
60
+ - [ ] Offset: might see duplicates or miss items when data shifts
61
+ - [ ] Cursor: stable, no duplicates; better for feeds
62
+ - [ ] Recommendation: cursor for feeds, offset for admin UIs
63
+
64
+ **Hints:**
65
+ 1. Offset 40 = items 41–50. After insert, "page 5" might return different items
66
+ 2. Cursor points to last seen item; next page is "after cursor"
67
+ 3. Social feeds: cursor preferred (consistent infinite scroll)
68
+
69
+ ---
70
+
71
+ ## Exercise 5: Error and Rate Limit Response
72
+
73
+ **Task:** Design the full HTTP response for: (1) 400 Bad Request — invalid JSON body, (2) 429 Too Many Requests — client exceeded 100 req/min. Include status, headers, and body format.
74
+
75
+ **Validation:**
76
+ - [ ] 400: body has error code, message, optionally details
77
+ - [ ] 429: Retry-After header, optionally X-RateLimit-* headers
78
+ - [ ] Content-Type: application/json
79
+ - [ ] Body is parseable and actionable for clients
80
+
81
+ **Hints:**
82
+ 1. 400: { "error": { "code": "INVALID_JSON", "message": "..." } }
83
+ 2. 429: Retry-After: 60 (seconds)
84
+ 3. X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset