@k2works/claude-code-booster 2.7.1 → 3.1.0

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 (527) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -103
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/review/index.md +5 -0
  522. package/lib/assets/docs/strategy/index.md +15 -0
  523. package/lib/assets/docs/template/index.md +9 -5
  524. package/lib/assets/mkdocs.yml +33 -19
  525. package/package.json +1 -1
  526. package/lib/assets/docs/analysis/index.md +0 -8
  527. /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
@@ -0,0 +1,107 @@
1
+ # 第 2 章: 仮実装と三角測量
2
+
3
+ ## 2.1 はじめに
4
+
5
+ 第 1 章では、最小の 1 ケースを Green にしました。
6
+ この章では、次の 2 つのテクニックで実装を育てます。
7
+
8
+ - Fake It: まず動く最小のコードを書く
9
+ - Triangulation: 複数ケースから一般ルールを導く
10
+
11
+ ## 2.2 仮実装(Fake It)
12
+
13
+ まず `2` のケースを追加して、仮実装の限界を明確にします。
14
+
15
+ ```scala
16
+ test("2 を渡すと文字列 2 を返す") {
17
+ assert(FizzBuzz.generate(2) === "2")
18
+ }
19
+ ```
20
+
21
+ このテストは失敗します。
22
+ 現在の実装は常に `"1"` を返すためです。
23
+
24
+ ここで実装を一段だけ一般化します。
25
+
26
+ ```scala
27
+ object FizzBuzz:
28
+ def generate(number: Int): String = number.toString
29
+ ```
30
+
31
+ `1` と `2` のテストがともに通れば Green です。
32
+
33
+ ## 2.3 三角測量(Triangulation)
34
+
35
+ Triangulation は、1 つの具体例だけで一般化せず、2 つ以上の点で法則を確定する手法です。
36
+
37
+ 実践手順は次の通りです。
38
+
39
+ 1. 具体的な新テストを 1 つ追加して失敗を作る
40
+ 2. 最小変更でテストを通す
41
+ 3. 既存テストも含めて一貫するルールか確認する
42
+
43
+ この繰り返しにより、偶然通る実装ではなく、仕様に沿う実装へ近づけます。
44
+
45
+ ## 2.4 Fizz のテスト
46
+
47
+ 次に 3 の倍数ケースを追加します。
48
+
49
+ ```scala
50
+ test("3 の倍数を渡すと Fizz を返す") {
51
+ assert(FizzBuzz.generate(3) === "Fizz")
52
+ }
53
+ ```
54
+
55
+ テストを通す最小実装の例です。
56
+
57
+ ```scala
58
+ object FizzBuzz:
59
+ def generate(number: Int): String =
60
+ if number % 3 == 0 then "Fizz"
61
+ else number.toString
62
+ ```
63
+
64
+ `if` でも `match` でも構いません。
65
+ この時点では、可読性よりも小さなステップを優先します。
66
+
67
+ ## 2.5 Buzz のテスト
68
+
69
+ 続いて 5 の倍数ケースを追加します。
70
+
71
+ ```scala
72
+ test("5 の倍数を渡すと Buzz を返す") {
73
+ assert(FizzBuzz.generate(5) === "Buzz")
74
+ }
75
+ ```
76
+
77
+ 最小実装の例です。
78
+
79
+ ```scala
80
+ object FizzBuzz:
81
+ def generate(number: Int): String =
82
+ if number % 3 == 0 then "Fizz"
83
+ else if number % 5 == 0 then "Buzz"
84
+ else number.toString
85
+ ```
86
+
87
+ まだ 15 のケースは未対応なので、次章で仕上げます。
88
+
89
+ ## 2.6 TODO リストの更新
90
+
91
+ ここまでの完了状態を反映します。
92
+
93
+ - [x] `FizzBuzz.generate(1)` が `"1"` を返す
94
+ - [x] `FizzBuzz.generate(2)` が `"2"` を返す
95
+ - [x] `FizzBuzz.generate(3)` が `"Fizz"` を返す
96
+ - [x] `FizzBuzz.generate(5)` が `"Buzz"` を返す
97
+ - [ ] `FizzBuzz.generate(15)` が `"FizzBuzz"` を返す
98
+ - [ ] `FizzBuzz.generateList(100)` が 100 件の結果を返す
99
+
100
+ ## 2.7 まとめ
101
+
102
+ この章のポイントは次の 2 点です。
103
+
104
+ - Fake It で、まず動く最小実装を作る
105
+ - Triangulation で、複数のテストケースから実装を一般化する
106
+
107
+ 次章では、`15` と `generateList` を追加して実装を完成させます。
@@ -0,0 +1,99 @@
1
+ # 第 3 章: 明白な実装とリファクタリング
2
+
3
+ ## 3.1 はじめに
4
+
5
+ この章では、残っている仕様を満たして実装を完成させます。
6
+
7
+ - Obvious Implementation: 仕様が明確なら、素直で読みやすい実装を選ぶ
8
+ - Refactoring: 振る舞いを変えずに構造を整理する
9
+
10
+ ## 3.2 FizzBuzz のテスト
11
+
12
+ まず 15 の倍数ケースを追加します。
13
+
14
+ ```scala
15
+ test("15 の倍数を渡すと FizzBuzz を返す") {
16
+ assert(FizzBuzz.generate(15) === "FizzBuzz")
17
+ }
18
+ ```
19
+
20
+ ここで重要なのは判定順序です。
21
+ `3` と `5` を先に判定すると `15` が `Fizz` または `Buzz` になってしまうため、`15` を最初に判定する必要があります。
22
+
23
+ ## 3.3 明白な実装
24
+
25
+ 仕様が揃った段階で、`match` を使って読みやすく整理します。
26
+
27
+ ```scala
28
+ object FizzBuzz:
29
+ def generate(number: Int): String =
30
+ number match
31
+ case n if n % 15 == 0 => "FizzBuzz"
32
+ case n if n % 3 == 0 => "Fizz"
33
+ case n if n % 5 == 0 => "Buzz"
34
+ case n => n.toString
35
+ ```
36
+
37
+ この実装は仕様との対応が 1 対 1 で追いやすく、将来の拡張時にも安全です。
38
+
39
+ ## 3.4 リストの生成
40
+
41
+ 続いて `generateList` を追加します。
42
+
43
+ ```scala
44
+ def generateList(count: Int): List[String] =
45
+ (1 to count).map(generate).toList
46
+ ```
47
+
48
+ 対応するテストを追加します。
49
+
50
+ ```scala
51
+ test("1 から 100 までのリストを生成する") {
52
+ val result = FizzBuzz.generateList(100)
53
+ assert(result.length === 100)
54
+ assert(result.head === "1")
55
+ assert(result(2) === "Fizz")
56
+ assert(result(4) === "Buzz")
57
+ assert(result(14) === "FizzBuzz")
58
+ }
59
+ ```
60
+
61
+ `length` と代表値を確認することで、リスト全体の生成と変換ロジックを同時に検証できます。
62
+
63
+ ## 3.5 リファクタリング
64
+
65
+ この実装では Scala の特性を活かせます。
66
+
67
+ - Pattern matching により条件分岐の意図が明確になります。
68
+ - `Range` と `map` により副作用のない関数型スタイルで記述できます。
69
+
70
+ 振る舞いを変えない範囲で、命名や重複の整理を行います。
71
+
72
+ ## 3.6 プログラムの実行
73
+
74
+ 手元で確認するために `main` メソッドを追加します。
75
+
76
+ ```scala
77
+ @main def runFizzBuzz(): Unit =
78
+ FizzBuzz.generateList(100).foreach(println)
79
+ ```
80
+
81
+ 実行は `sbt run` です。
82
+ `1` から `100` までの結果が順に出力されます。
83
+
84
+ ## 3.7 まとめ
85
+
86
+ 3 章を通じて、FizzBuzz を題材に TDD の基本サイクルを完走しました。
87
+
88
+ - Red: 仕様ごとに失敗するテストを追加
89
+ - Green: 最小実装で段階的に通過
90
+ - Refactor: 明白で読みやすい形に整理
91
+
92
+ TODO リストの最終状態です。
93
+
94
+ - [x] `FizzBuzz.generate(1)` が `"1"` を返す
95
+ - [x] `FizzBuzz.generate(2)` が `"2"` を返す
96
+ - [x] `FizzBuzz.generate(3)` が `"Fizz"` を返す
97
+ - [x] `FizzBuzz.generate(5)` が `"Buzz"` を返す
98
+ - [x] `FizzBuzz.generate(15)` が `"FizzBuzz"` を返す
99
+ - [x] `FizzBuzz.generateList(100)` が 100 件の結果を返す
@@ -0,0 +1,123 @@
1
+ # 第 4 章: バージョン管理と Conventional Commits
2
+
3
+ ## 4.1 はじめに
4
+
5
+ ソフトウェア開発では、変更履歴を安全に管理し、チームで追跡可能にする仕組みが重要です。
6
+ Git による版管理とコミットメッセージ規約を整えることで、TDD の小さな変更を確実に積み上げられます。
7
+
8
+ ## 4.2 Git によるバージョン管理
9
+
10
+ Scala プロジェクト(`apps/scala`)では、次の基本フローで変更を記録します。
11
+
12
+ ```bash
13
+ cd apps/scala
14
+ git init
15
+ git add .
16
+ git commit -m "chore(scala): initialize sbt project"
17
+ ```
18
+
19
+ `git init` でリポジトリを初期化し、`git add` でステージング、`git commit` で履歴を確定します。
20
+ TDD では Red → Green → Refactor の小さな単位でコミットすると、変更意図を追いやすくなります。
21
+
22
+ ### .gitignore の設定
23
+
24
+ `apps/scala/.gitignore` には、ビルド成果物と IDE 補助ファイルを含めます。
25
+
26
+ ```bash
27
+ target/
28
+ .bsp/
29
+ .metals/
30
+ .bloop/
31
+ .idea/
32
+ *.class
33
+ *.log
34
+ *.jar
35
+ .DS_Store
36
+ project/metals.sbt
37
+ project/project/
38
+ ```
39
+
40
+ 最低限として、次の 4 つは必ず除外します。
41
+
42
+ - `target/`
43
+ - `.bsp/`
44
+ - `.metals/`
45
+ - `.bloop/`
46
+
47
+ ## 4.3 Conventional Commits
48
+
49
+ Conventional Commits は、Angular Convention に由来するコミットメッセージ規約です。
50
+ 基本フォーマットは次の通りです。
51
+
52
+ ```text
53
+ <type>(<scope>): <subject>
54
+ ```
55
+
56
+ - `type`: 変更種別
57
+ - `scope`: 変更対象(任意)
58
+ - `subject`: 変更内容の要約(命令形・簡潔)
59
+
60
+ ### type の種類
61
+
62
+ - `feat`: 新機能の追加
63
+ - `fix`: バグ修正
64
+ - `docs`: ドキュメント変更
65
+ - `style`: 振る舞いに影響しない整形
66
+ - `refactor`: 振る舞いを変えない構造改善
67
+ - `test`: テスト追加・修正
68
+ - `chore`: ビルドや設定などの雑務
69
+
70
+ ### scope と subject の書き方
71
+
72
+ - `scope` はモジュール単位で短く書きます(例: `scala`, `fizzbuzz`, `ci`)。
73
+ - `subject` は 50 文字前後を目安に、何をしたかを明確に書きます。
74
+ - 末尾の句点は付けません。
75
+
76
+ ### コミットメッセージの例
77
+
78
+ ```text
79
+ test(fizzbuzz): add failing test for multiples of 15
80
+ feat(fizzbuzz): implement generateList for 1 to n
81
+ refactor(fizzbuzz): simplify rule matching order
82
+ docs(scala): add chapter about sbt and scalafmt
83
+ chore(ci): add scala-ci workflow for pull requests
84
+ ```
85
+
86
+ ## 4.4 ブランチ戦略
87
+
88
+ ### Git Flow の基本概念
89
+
90
+ Git Flow では、主に次のブランチを使います。
91
+
92
+ - `main`: リリース済みの安定コード
93
+ - `develop`: 開発統合ブランチ
94
+ - `feature/*`: 機能開発ブランチ
95
+ - `release/*`: リリース準備ブランチ
96
+ - `hotfix/*`: 緊急修正ブランチ
97
+
98
+ 学習用プロジェクトでは、まず `main` と `feature/*` の運用から始めると実践しやすいです。
99
+
100
+ ### feature ブランチの作成と運用
101
+
102
+ ```bash
103
+ git switch main
104
+ git pull origin main
105
+ git switch -c feature/scala-chapter-04
106
+ ```
107
+
108
+ 運用ポイントは次の通りです。
109
+
110
+ - 1 ブランチ 1 テーマに絞ります。
111
+ - Red / Green / Refactor の区切りで小さくコミットします。
112
+ - 完了後に Pull Request を作成し、レビュー後に `main` へマージします。
113
+
114
+ ## 4.5 まとめ
115
+
116
+ この章では、Scala の TDD 開発を支える版管理の基礎を整理しました。
117
+
118
+ - Git の基本操作で変更履歴を安全に管理する
119
+ - `.gitignore` で不要ファイルを除外する
120
+ - Conventional Commits で履歴を読みやすくする
121
+ - `feature` ブランチ運用で変更を分離する
122
+
123
+ 次章では、`sbt` を中心にパッケージ管理と静的解析を整備します。
@@ -0,0 +1,196 @@
1
+ # 第 5 章: パッケージ管理と静的解析
2
+
3
+ ## 5.1 はじめに
4
+
5
+ Scala 開発では、依存関係の管理とコード品質の維持を仕組み化することが重要です。
6
+ この章では、`sbt` によるパッケージ管理と `scalafmt`、`WartRemover`、コンパイラオプションによる品質管理を扱います。
7
+
8
+ ## 5.2 sbt によるパッケージ管理
9
+
10
+ ### build.sbt の構成
11
+
12
+ `apps/scala/build.sbt` では、プロジェクトの基本情報と依存関係を定義します。
13
+
14
+ ```scala
15
+ lazy val root = (project in file("."))
16
+ .settings(
17
+ name := "fizzbuzz",
18
+ version := "0.1.0",
19
+ scalaVersion := "3.3.4",
20
+ libraryDependencies ++= Seq(
21
+ "org.scalatest" %% "scalatest" % "3.2.18" % Test
22
+ )
23
+ )
24
+ ```
25
+
26
+ - `name`: プロジェクト名
27
+ - `version`: アプリケーションのバージョン
28
+ - `scalaVersion`: 使用する Scala バージョン
29
+ - `libraryDependencies`: 利用ライブラリ
30
+
31
+ ### プラグインの追加(project/plugins.sbt)
32
+
33
+ `sbt` プラグインは `apps/scala/project/plugins.sbt` に追加します。
34
+
35
+ ```scala
36
+ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
37
+ addSbtPlugin("org.wartremover" % "sbt-wartremover" % "3.2.5")
38
+ ```
39
+
40
+ ### 依存関係の管理(`%` と `%%` の違い、Test スコープ)
41
+
42
+ - `%`: Java など Scala バージョンに依存しない Artifact に使います。
43
+ - `%%`: Scala バージョン接尾辞(例: `_3`)を自動付与します。
44
+ - `% Test`: テスト時だけ必要な依存関係に付けます。
45
+
46
+ 例:
47
+
48
+ ```scala
49
+ "org.scalatest" %% "scalatest" % "3.2.18" % Test
50
+ ```
51
+
52
+ この指定により、本番 Artifact には `ScalaTest` が含まれません。
53
+
54
+ ## 5.3 scalafmt によるコードフォーマット
55
+
56
+ `apps/scala/.scalafmt.conf` は次の設定です。
57
+
58
+ ```scala
59
+ version = 3.7.17
60
+ runner.dialect = scala3
61
+ maxColumn = 100
62
+ ```
63
+
64
+ 整形コマンド:
65
+
66
+ ```bash
67
+ cd apps/scala
68
+ sbt scalafmt
69
+ sbt scalafmtCheck
70
+ ```
71
+
72
+ - `sbt scalafmt`: 自動整形
73
+ - `sbt scalafmtCheck`: 未整形コードを検出(CI 向け)
74
+
75
+ ## 5.4 WartRemover による静的解析
76
+
77
+ `WartRemover` は危険な記述をコンパイル時に検出する静的解析ツールです。
78
+
79
+ ### build.sbt への設定追加
80
+
81
+ `build.sbt` に次のような設定を追加します。
82
+
83
+ ```scala
84
+ wartremoverErrors ++= Seq(
85
+ Wart.Null,
86
+ Wart.Var,
87
+ Wart.Return
88
+ )
89
+ ```
90
+
91
+ ### 検出される問題の種類
92
+
93
+ - `Null`: `null` 利用による `NullPointerException` リスク
94
+ - `Var`: 可変変数による状態変化の複雑化
95
+ - `Return`: 早期 return による制御フローの可読性低下
96
+
97
+ ### 警告と推奨事項
98
+
99
+ - まずは `Errors` を最小セットで導入します。
100
+ - 既存コードが多い場合は段階的にルールを増やします。
101
+ - `Option`、不変 `val`、式指向の記述に置き換えると改善しやすいです。
102
+
103
+ ## 5.5 コード複雑度チェック
104
+
105
+ コードの循環複雑度(Cyclomatic Complexity)は、メソッド内の分岐数に基づいてコードの複雑さを数値化する指標です。複雑度が高いメソッドはテストが困難で、バグが混入しやすくなります。
106
+
107
+ ### 循環複雑度の計算ルール
108
+
109
+ | ルール | 説明 |
110
+ |--------|------|
111
+ | 基本複雑度 | 各メソッドの初期値は 1 |
112
+ | `if` / `else if` | 条件分岐ごとに +1 |
113
+ | `match` / `case` | 各 case 分岐ごとに +1(`case class` / `case object` 定義は除外) |
114
+ | `while` / `for` | ループごとに +1 |
115
+ | `&&` / `\|\|` | 短絡評価の論理演算子ごとに +1 |
116
+ | `try` / `catch` | 例外処理ごとに +1 |
117
+
118
+ 一般的な目安として、1 メソッドあたり複雑度 **10 以下** が推奨されます。
119
+
120
+ ### カスタム複雑度チェッカー
121
+
122
+ Scala には標準的な複雑度チェックツールがないため、`scripts/complexity.sh` にカスタムスクリプトを用意しています。
123
+
124
+ ```bash
125
+ # 実行(デフォルト閾値: 7)
126
+ bash scripts/complexity.sh src
127
+
128
+ # 閾値を指定して実行
129
+ bash scripts/complexity.sh --threshold 10 src
130
+ ```
131
+
132
+ 実行結果の例:
133
+
134
+ ```
135
+ === Scala 循環複雑度チェック (閾値: 10) ===
136
+
137
+ OK generate (FizzBuzz.scala) 複雑度: 8
138
+ OK generateList (FizzBuzz.scala) 複雑度: 1
139
+ OK create (Type.scala) 複雑度: 5
140
+
141
+ 関数数: 22, 違反: 0
142
+
143
+ OK すべての関数が複雑度閾値以内です。
144
+ ```
145
+
146
+ ### Makefile への統合
147
+
148
+ `Makefile` の `check` タスクに複雑度チェックを組み込んでいます。
149
+
150
+ ```makefile
151
+ complexity:
152
+ bash scripts/complexity.sh --threshold 10 src
153
+
154
+ check: fmt-check lint complexity test
155
+ ```
156
+
157
+ `make check` を実行すると、フォーマットチェック → コンパイル → 複雑度チェック → テスト の順に品質ゲートが走ります。
158
+
159
+ ### 複雑度が高い場合の対処
160
+
161
+ 複雑度が閾値を超えた場合は、以下のリファクタリングを検討します。
162
+
163
+ 1. **メソッド分割**: 長い `match` 式を小さなメソッドに分解
164
+ 2. **ポリモーフィズムの活用**: 条件分岐を `sealed trait` + `case object` のパターンマッチに置き換え
165
+ 3. **高階関数の利用**: `if` / `for` をコレクション操作(`map` / `filter`)に置き換え
166
+ 4. **ガード条件の簡略化**: 複雑な条件を別メソッドとして抽出
167
+
168
+ ## 5.6 コンパイラオプション
169
+
170
+ `apps/scala/build.sbt` では次の `scalacOptions` を設定しています。
171
+
172
+ ```scala
173
+ scalacOptions ++= Seq(
174
+ "-deprecation",
175
+ "-feature",
176
+ "-unchecked",
177
+ "-Xfatal-warnings"
178
+ )
179
+ ```
180
+
181
+ - `-deprecation`: 非推奨 API 使用時に警告
182
+ - `-feature`: 明示が必要な言語機能使用時に警告
183
+ - `-unchecked`: 型検査が不十分な箇所を警告
184
+ - `-Xfatal-warnings`: 警告をエラー扱いにして品質を強制
185
+
186
+ ## 5.7 まとめ
187
+
188
+ この章では、Scala プロジェクトの品質基盤を整えました。
189
+
190
+ - `sbt` で依存関係とプラグインを管理する
191
+ - `scalafmt` でフォーマットを統一する
192
+ - `WartRemover` で危険な記述を早期検出する
193
+ - カスタムスクリプトでコード複雑度をチェックする
194
+ - `scalacOptions` でコンパイル時の品質ゲートを強化する
195
+
196
+ 次章では、これらを `Makefile` と GitHub Actions で自動実行する方法を扱います。
@@ -0,0 +1,186 @@
1
+ # 第 6 章: タスクランナーと CI/CD
2
+
3
+ ## 6.1 はじめに
4
+
5
+ TDD を継続するには、テスト・整形・静的解析を毎回確実に実行できる仕組みが必要です。
6
+ この章では、`Makefile`、`sbt` タスク、Nix 開発環境、GitHub Actions を使って開発タスクを自動化します。
7
+
8
+ ## 6.2 Nix による開発環境
9
+
10
+ 本プロジェクトでは Nix Flakes で開発環境を宣言的に管理しています。
11
+ `ops/nix/environments/scala/shell.nix` に Scala 環境の定義があります。
12
+
13
+ ```nix
14
+ { packages ? import <nixpkgs> {} }:
15
+ let
16
+ baseShell = import ../../shells/shell.nix { inherit packages; };
17
+ in
18
+ packages.mkShell {
19
+ inherit (baseShell) pure;
20
+ buildInputs = baseShell.buildInputs ++ (with packages; [
21
+ scala_3
22
+ sbt
23
+ metals
24
+ scala-cli
25
+ ]);
26
+ shellHook = ''
27
+ ${baseShell.shellHook}
28
+ echo "Scala development environment activated"
29
+ '';
30
+ }
31
+ ```
32
+
33
+ 環境の起動:
34
+
35
+ ```bash
36
+ nix develop .#scala
37
+ ```
38
+
39
+ これにより、Scala 3、sbt、Metals、scala-cli が揃った環境に入れます。
40
+ チーム全員が同じツールバージョンを使えるため、「自分のマシンでは動く」問題を防げます。
41
+
42
+ ## 6.3 Makefile によるタスク管理
43
+
44
+ `apps/scala/Makefile` には、日常的に使うタスクが定義されています。
45
+
46
+ ```makefile
47
+ .PHONY: test fmt fmt-check lint complexity check build run clean
48
+
49
+ test:
50
+ sbt test
51
+
52
+ fmt:
53
+ sbt scalafmt
54
+
55
+ fmt-check:
56
+ sbt scalafmtCheck
57
+
58
+ lint:
59
+ sbt compile
60
+
61
+ complexity:
62
+ bash scripts/complexity.sh --threshold 10 src
63
+
64
+ check: fmt-check lint complexity test
65
+ ```
66
+
67
+ この構成の狙いは、`make check` 1 つで品質ゲートをまとめて実行できる点です。
68
+
69
+ - `test`: 単体テスト実行
70
+ - `fmt` / `fmt-check`: フォーマット適用と検証
71
+ - `lint`: コンパイルによる静的チェック
72
+ - `complexity`: コード複雑度チェック
73
+ - `check`: CI と同等のローカル検証
74
+
75
+ Nix 環境内で実行するのが前提です:
76
+
77
+ ```bash
78
+ nix develop .#scala --command make check
79
+ ```
80
+
81
+ ## 6.4 sbt のカスタムタスク
82
+
83
+ `sbt` では `build.sbt` に独自タスクを追加できます。
84
+ たとえば、テストと整形確認をまとめたタスクは次のように定義できます。
85
+
86
+ ```scala
87
+ lazy val verify = taskKey[Unit]("Run format check and tests")
88
+
89
+ verify := {
90
+ (Compile / compile).value
91
+ (Test / test).value
92
+ }
93
+ ```
94
+
95
+ また、`~` prefix を使うとファイル変更を監視して自動実行できます。
96
+
97
+ ```bash
98
+ nix develop .#scala --command sbt ~test
99
+ ```
100
+
101
+ TDD の Red → Green を高速に回すときに有効です。
102
+
103
+ ## 6.5 GitHub Actions による CI/CD
104
+
105
+ `.github/workflows/scala-ci.yml` では、Nix を活用して CI を実行しています。
106
+
107
+ ```yaml
108
+ name: Scala CI
109
+
110
+ on:
111
+ push:
112
+ branches: [main, develop]
113
+ paths:
114
+ - "apps/scala/**"
115
+ - ".github/workflows/scala-ci.yml"
116
+ pull_request:
117
+ branches: [main]
118
+ paths:
119
+ - "apps/scala/**"
120
+
121
+ permissions:
122
+ contents: read
123
+
124
+ jobs:
125
+ test:
126
+ runs-on: ubuntu-latest
127
+
128
+ steps:
129
+ - name: Checkout the repository
130
+ uses: actions/checkout@v4
131
+
132
+ - name: Install Nix
133
+ uses: cachix/install-nix-action@v30
134
+ with:
135
+ nix_path: nixpkgs=channel:nixos-unstable
136
+
137
+ - name: Cache Nix store
138
+ uses: actions/cache@v4
139
+ with:
140
+ path: /tmp/nix-cache
141
+ key: ${{ runner.os }}-nix-scala-${{ hashFiles('flake.lock', 'ops/nix/environments/scala/shell.nix') }}
142
+ restore-keys: |
143
+ ${{ runner.os }}-nix-scala-
144
+
145
+ - name: Check formatting
146
+ run: nix develop .#scala --command bash -c "cd apps/scala && sbt scalafmtCheck"
147
+
148
+ - name: Compile (lint)
149
+ run: nix develop .#scala --command bash -c "cd apps/scala && sbt compile"
150
+
151
+ - name: Run complexity check
152
+ run: nix develop .#scala --command bash -c "cd apps/scala && bash scripts/complexity.sh --threshold 10 src"
153
+
154
+ - name: Run tests
155
+ run: nix develop .#scala --command bash -c "cd apps/scala && sbt test"
156
+ ```
157
+
158
+ ### Nix を CI で使う利点
159
+
160
+ - **環境の再現性**: ローカルと CI で同じ Nix 環境を使うため、環境差異による失敗がない
161
+ - **ツールバージョンの固定**: `flake.lock` でパッケージバージョンが固定される
162
+ - **キャッシュの効率化**: `flake.lock` と `shell.nix` のハッシュでキャッシュキーを生成し、変更時のみ再構築
163
+ - **統一的なパターン**: Clojure、.NET など他の言語と同じ CI パターンを使える
164
+
165
+ ## 6.6 開発ワークフロー
166
+
167
+ Red-Green-Refactor を自動化で支える基本フローは次の通りです。
168
+
169
+ 1. 環境起動: `nix develop .#scala` で開発環境に入る
170
+ 2. Red: 失敗するテストを追加し、`make test` で失敗を確認
171
+ 3. Green: 最小実装で `make test` を通過
172
+ 4. Refactor: `make check` で整形・コンパイル・複雑度・テストを一括確認
173
+ 5. Push: GitHub Actions で Nix 環境内の同じチェックを再実行
174
+
175
+ ローカルと CI で同じ Nix 環境・同じコマンドを使うことで、環境差分による失敗を防げます。
176
+
177
+ ## 6.7 まとめ
178
+
179
+ この章では、Scala 開発の自動化基盤を整理しました。
180
+
181
+ - Nix Flakes で開発環境を宣言的に管理し、再現性を確保する
182
+ - `Makefile` で日常タスクを短いコマンドに集約する
183
+ - `sbt` のタスクと監視実行で開発サイクルを高速化する
184
+ - GitHub Actions で Nix 環境を使い、ローカルと同一の品質ゲートを適用する
185
+
186
+ 第 2 部の環境整備が完了したので、次章からはオブジェクト指向設計に進みます。