thuban 0.3.4 → 0.4.1

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 (739) hide show
  1. package/README.md +2 -0
  2. package/dist/README.md +2 -0
  3. package/dist/cli.js +1 -1
  4. package/dist/packages/crucible/.golden/golden-master.json +414 -0
  5. package/dist/packages/crucible/badge-generator.js +1 -0
  6. package/dist/packages/crucible/banner.js +1 -0
  7. package/dist/packages/crucible/ci-integration.js +1 -0
  8. package/dist/packages/crucible/golden-master.js +1 -0
  9. package/dist/packages/crucible/index.js +1 -0
  10. package/dist/packages/crucible/kenny-mode.js +1 -0
  11. package/dist/packages/crucible/leaderboard.js +1 -0
  12. package/dist/packages/crucible/mutation-engine.js +1 -0
  13. package/dist/packages/crucible/pattern-learner.js +1 -0
  14. package/dist/packages/crucible/report-generator.js +1 -0
  15. package/dist/packages/crucible/rule-loader.js +1 -0
  16. package/dist/packages/crucible/seeding-engine.js +1 -0
  17. package/dist/packages/crucible/seeds/csharp/seed-001.cs +28 -0
  18. package/dist/packages/crucible/seeds/csharp/seed-002.cs +24 -0
  19. package/dist/packages/crucible/seeds/csharp/seed-003.cs +30 -0
  20. package/dist/packages/crucible/seeds/csharp/seed-004.cs +31 -0
  21. package/dist/packages/crucible/seeds/csharp/seed-005.cs +28 -0
  22. package/dist/packages/crucible/seeds/csharp/seed-006.cs +25 -0
  23. package/dist/packages/crucible/seeds/csharp/seed-007.cs +34 -0
  24. package/dist/packages/crucible/seeds/csharp/seed-008.cs +23 -0
  25. package/dist/packages/crucible/seeds/csharp/seed-009.cs +27 -0
  26. package/dist/packages/crucible/seeds/csharp/seed-010.cs +29 -0
  27. package/dist/packages/crucible/seeds/csharp/seed-011.cs +32 -0
  28. package/dist/packages/crucible/seeds/csharp/seed-012.cs +27 -0
  29. package/dist/packages/crucible/seeds/csharp/seed-013.cs +27 -0
  30. package/dist/packages/crucible/seeds/csharp/seed-014.cs +26 -0
  31. package/dist/packages/crucible/seeds/csharp/seed-015.cs +33 -0
  32. package/dist/packages/crucible/seeds/csharp/seed-016.cs +25 -0
  33. package/dist/packages/crucible/seeds/csharp/seed-017.cs +22 -0
  34. package/dist/packages/crucible/seeds/csharp/seed-018.cs +26 -0
  35. package/dist/packages/crucible/seeds/csharp/seed-019.cs +25 -0
  36. package/dist/packages/crucible/seeds/csharp/seed-020.cs +22 -0
  37. package/dist/packages/crucible/seeds/csharp/seed-021.cs +28 -0
  38. package/dist/packages/crucible/seeds/csharp/seed-022.cs +25 -0
  39. package/dist/packages/crucible/seeds/csharp/seed-023.cs +33 -0
  40. package/dist/packages/crucible/seeds/csharp/seed-024.cs +31 -0
  41. package/dist/packages/crucible/seeds/csharp/seed-025.cs +31 -0
  42. package/dist/packages/crucible/seeds/csharp/seed-026.cs +25 -0
  43. package/dist/packages/crucible/seeds/csharp/seed-027.cs +29 -0
  44. package/dist/packages/crucible/seeds/csharp/seed-028.cs +25 -0
  45. package/dist/packages/crucible/seeds/csharp/seed-029.cs +27 -0
  46. package/dist/packages/crucible/seeds/csharp/seed-030.cs +27 -0
  47. package/dist/packages/crucible/seeds/csharp/seed-031.cs +28 -0
  48. package/dist/packages/crucible/seeds/csharp/seed-032.cs +30 -0
  49. package/dist/packages/crucible/seeds/csharp/seed-033.cs +27 -0
  50. package/dist/packages/crucible/seeds/csharp/seed-034.cs +25 -0
  51. package/dist/packages/crucible/seeds/csharp/seed-035.cs +32 -0
  52. package/dist/packages/crucible/seeds/csharp/seed-036.cs +28 -0
  53. package/dist/packages/crucible/seeds/csharp/seed-037.cs +29 -0
  54. package/dist/packages/crucible/seeds/csharp/seed-038.cs +28 -0
  55. package/dist/packages/crucible/seeds/csharp/seed-039.cs +29 -0
  56. package/dist/packages/crucible/seeds/csharp/seed-040.cs +28 -0
  57. package/dist/packages/crucible/seeds/csharp/seed-041.cs +33 -0
  58. package/dist/packages/crucible/seeds/csharp/seed-042.cs +27 -0
  59. package/dist/packages/crucible/seeds/csharp/seed-043.cs +27 -0
  60. package/dist/packages/crucible/seeds/csharp/seed-044.cs +25 -0
  61. package/dist/packages/crucible/seeds/csharp/seed-045.cs +30 -0
  62. package/dist/packages/crucible/seeds/csharp/seed-046.cs +29 -0
  63. package/dist/packages/crucible/seeds/csharp/seed-047.cs +26 -0
  64. package/dist/packages/crucible/seeds/csharp/seed-048.cs +31 -0
  65. package/dist/packages/crucible/seeds/csharp/seed-049.cs +27 -0
  66. package/dist/packages/crucible/seeds/csharp/seed-050.cs +30 -0
  67. package/dist/packages/crucible/seeds/csharp/seed-051.cs +34 -0
  68. package/dist/packages/crucible/seeds/csharp/seed-052.cs +36 -0
  69. package/dist/packages/crucible/seeds/go/seed-001.go +29 -0
  70. package/dist/packages/crucible/seeds/go/seed-002.go +27 -0
  71. package/dist/packages/crucible/seeds/go/seed-003.go +31 -0
  72. package/dist/packages/crucible/seeds/go/seed-004.go +27 -0
  73. package/dist/packages/crucible/seeds/go/seed-005.go +27 -0
  74. package/dist/packages/crucible/seeds/go/seed-006.go +29 -0
  75. package/dist/packages/crucible/seeds/go/seed-007.go +24 -0
  76. package/dist/packages/crucible/seeds/go/seed-008.go +25 -0
  77. package/dist/packages/crucible/seeds/go/seed-009.go +30 -0
  78. package/dist/packages/crucible/seeds/go/seed-010.go +35 -0
  79. package/dist/packages/crucible/seeds/go/seed-011.go +24 -0
  80. package/dist/packages/crucible/seeds/go/seed-012.go +24 -0
  81. package/dist/packages/crucible/seeds/go/seed-013.go +31 -0
  82. package/dist/packages/crucible/seeds/go/seed-014.go +35 -0
  83. package/dist/packages/crucible/seeds/go/seed-015.go +25 -0
  84. package/dist/packages/crucible/seeds/go/seed-016.go +19 -0
  85. package/dist/packages/crucible/seeds/go/seed-017.go +23 -0
  86. package/dist/packages/crucible/seeds/go/seed-018.go +23 -0
  87. package/dist/packages/crucible/seeds/go/seed-019.go +22 -0
  88. package/dist/packages/crucible/seeds/go/seed-020.go +31 -0
  89. package/dist/packages/crucible/seeds/go/seed-021.go +22 -0
  90. package/dist/packages/crucible/seeds/go/seed-022.go +29 -0
  91. package/dist/packages/crucible/seeds/go/seed-023.go +26 -0
  92. package/dist/packages/crucible/seeds/go/seed-024.go +27 -0
  93. package/dist/packages/crucible/seeds/go/seed-025.go +23 -0
  94. package/dist/packages/crucible/seeds/go/seed-026.go +29 -0
  95. package/dist/packages/crucible/seeds/go/seed-027.go +26 -0
  96. package/dist/packages/crucible/seeds/go/seed-028.go +23 -0
  97. package/dist/packages/crucible/seeds/go/seed-029.go +28 -0
  98. package/dist/packages/crucible/seeds/go/seed-030.go +27 -0
  99. package/dist/packages/crucible/seeds/go/seed-031.go +28 -0
  100. package/dist/packages/crucible/seeds/go/seed-032.go +27 -0
  101. package/dist/packages/crucible/seeds/go/seed-033.go +29 -0
  102. package/dist/packages/crucible/seeds/go/seed-034.go +22 -0
  103. package/dist/packages/crucible/seeds/go/seed-035.go +32 -0
  104. package/dist/packages/crucible/seeds/go/seed-036.go +27 -0
  105. package/dist/packages/crucible/seeds/go/seed-037.go +27 -0
  106. package/dist/packages/crucible/seeds/go/seed-038.go +27 -0
  107. package/dist/packages/crucible/seeds/go/seed-039.go +26 -0
  108. package/dist/packages/crucible/seeds/go/seed-040.go +37 -0
  109. package/dist/packages/crucible/seeds/go/seed-041.go +23 -0
  110. package/dist/packages/crucible/seeds/go/seed-042.go +32 -0
  111. package/dist/packages/crucible/seeds/go/seed-043.go +35 -0
  112. package/dist/packages/crucible/seeds/go/seed-044.go +25 -0
  113. package/dist/packages/crucible/seeds/go/seed-045.go +26 -0
  114. package/dist/packages/crucible/seeds/go/seed-046.go +34 -0
  115. package/dist/packages/crucible/seeds/go/seed-047.go +26 -0
  116. package/dist/packages/crucible/seeds/go/seed-048.go +29 -0
  117. package/dist/packages/crucible/seeds/go/seed-049.go +24 -0
  118. package/dist/packages/crucible/seeds/go/seed-050.go +27 -0
  119. package/dist/packages/crucible/seeds/go/seed-051.go +38 -0
  120. package/dist/packages/crucible/seeds/go/seed-052.go +27 -0
  121. package/dist/packages/crucible/seeds/java/seed-001.java +23 -0
  122. package/dist/packages/crucible/seeds/java/seed-002.java +22 -0
  123. package/dist/packages/crucible/seeds/java/seed-003.java +28 -0
  124. package/dist/packages/crucible/seeds/java/seed-004.java +26 -0
  125. package/dist/packages/crucible/seeds/java/seed-005.java +33 -0
  126. package/dist/packages/crucible/seeds/java/seed-006.java +22 -0
  127. package/dist/packages/crucible/seeds/java/seed-007.java +21 -0
  128. package/dist/packages/crucible/seeds/java/seed-008.java +29 -0
  129. package/dist/packages/crucible/seeds/java/seed-009.java +24 -0
  130. package/dist/packages/crucible/seeds/java/seed-010.java +30 -0
  131. package/dist/packages/crucible/seeds/java/seed-011.java +25 -0
  132. package/dist/packages/crucible/seeds/java/seed-012.java +20 -0
  133. package/dist/packages/crucible/seeds/java/seed-013.java +26 -0
  134. package/dist/packages/crucible/seeds/java/seed-014.java +23 -0
  135. package/dist/packages/crucible/seeds/java/seed-015.java +25 -0
  136. package/dist/packages/crucible/seeds/java/seed-016.java +22 -0
  137. package/dist/packages/crucible/seeds/java/seed-017.java +24 -0
  138. package/dist/packages/crucible/seeds/java/seed-018.java +24 -0
  139. package/dist/packages/crucible/seeds/java/seed-019.java +38 -0
  140. package/dist/packages/crucible/seeds/java/seed-020.java +24 -0
  141. package/dist/packages/crucible/seeds/java/seed-021.java +22 -0
  142. package/dist/packages/crucible/seeds/java/seed-022.java +22 -0
  143. package/dist/packages/crucible/seeds/java/seed-023.java +22 -0
  144. package/dist/packages/crucible/seeds/java/seed-024.java +25 -0
  145. package/dist/packages/crucible/seeds/java/seed-025.java +27 -0
  146. package/dist/packages/crucible/seeds/java/seed-026.java +25 -0
  147. package/dist/packages/crucible/seeds/java/seed-027.java +22 -0
  148. package/dist/packages/crucible/seeds/java/seed-028.java +21 -0
  149. package/dist/packages/crucible/seeds/java/seed-029.java +28 -0
  150. package/dist/packages/crucible/seeds/java/seed-030.java +27 -0
  151. package/dist/packages/crucible/seeds/java/seed-031.java +23 -0
  152. package/dist/packages/crucible/seeds/java/seed-032.java +22 -0
  153. package/dist/packages/crucible/seeds/java/seed-033.java +24 -0
  154. package/dist/packages/crucible/seeds/java/seed-034.java +24 -0
  155. package/dist/packages/crucible/seeds/java/seed-035.java +29 -0
  156. package/dist/packages/crucible/seeds/java/seed-036.java +25 -0
  157. package/dist/packages/crucible/seeds/java/seed-037.java +30 -0
  158. package/dist/packages/crucible/seeds/java/seed-038.java +29 -0
  159. package/dist/packages/crucible/seeds/java/seed-039.java +26 -0
  160. package/dist/packages/crucible/seeds/java/seed-040.java +31 -0
  161. package/dist/packages/crucible/seeds/java/seed-041.java +20 -0
  162. package/dist/packages/crucible/seeds/java/seed-042.java +26 -0
  163. package/dist/packages/crucible/seeds/java/seed-043.java +31 -0
  164. package/dist/packages/crucible/seeds/java/seed-044.java +22 -0
  165. package/dist/packages/crucible/seeds/java/seed-045.java +25 -0
  166. package/dist/packages/crucible/seeds/java/seed-046.java +22 -0
  167. package/dist/packages/crucible/seeds/java/seed-047.java +26 -0
  168. package/dist/packages/crucible/seeds/java/seed-048.java +24 -0
  169. package/dist/packages/crucible/seeds/java/seed-049.java +28 -0
  170. package/dist/packages/crucible/seeds/java/seed-050.java +29 -0
  171. package/dist/packages/crucible/seeds/java/seed-051.java +25 -0
  172. package/dist/packages/crucible/seeds/java/seed-052.java +32 -0
  173. package/dist/packages/crucible/seeds/js/seed-001.js +27 -0
  174. package/dist/packages/crucible/seeds/js/seed-002.js +28 -0
  175. package/dist/packages/crucible/seeds/js/seed-003.js +30 -0
  176. package/dist/packages/crucible/seeds/js/seed-004.js +28 -0
  177. package/dist/packages/crucible/seeds/js/seed-005.js +31 -0
  178. package/dist/packages/crucible/seeds/js/seed-006.js +28 -0
  179. package/dist/packages/crucible/seeds/js/seed-007.js +26 -0
  180. package/dist/packages/crucible/seeds/js/seed-008.js +30 -0
  181. package/dist/packages/crucible/seeds/js/seed-009.js +30 -0
  182. package/dist/packages/crucible/seeds/js/seed-010.js +29 -0
  183. package/dist/packages/crucible/seeds/js/seed-011.js +34 -0
  184. package/dist/packages/crucible/seeds/js/seed-012.js +32 -0
  185. package/dist/packages/crucible/seeds/js/seed-013.js +29 -0
  186. package/dist/packages/crucible/seeds/js/seed-014.js +29 -0
  187. package/dist/packages/crucible/seeds/js/seed-015.js +31 -0
  188. package/dist/packages/crucible/seeds/js/seed-016.js +31 -0
  189. package/dist/packages/crucible/seeds/js/seed-017.js +30 -0
  190. package/dist/packages/crucible/seeds/js/seed-018.js +29 -0
  191. package/dist/packages/crucible/seeds/js/seed-019.js +32 -0
  192. package/dist/packages/crucible/seeds/js/seed-020.js +29 -0
  193. package/dist/packages/crucible/seeds/js/seed-021.js +31 -0
  194. package/dist/packages/crucible/seeds/js/seed-022.js +31 -0
  195. package/dist/packages/crucible/seeds/js/seed-023.js +29 -0
  196. package/dist/packages/crucible/seeds/js/seed-024.js +29 -0
  197. package/dist/packages/crucible/seeds/js/seed-025.js +34 -0
  198. package/dist/packages/crucible/seeds/js/seed-026.js +31 -0
  199. package/dist/packages/crucible/seeds/js/seed-027.js +31 -0
  200. package/dist/packages/crucible/seeds/js/seed-028.js +33 -0
  201. package/dist/packages/crucible/seeds/js/seed-029.js +33 -0
  202. package/dist/packages/crucible/seeds/js/seed-030.js +30 -0
  203. package/dist/packages/crucible/seeds/js/seed-031.js +31 -0
  204. package/dist/packages/crucible/seeds/js/seed-032.js +34 -0
  205. package/dist/packages/crucible/seeds/js/seed-033.js +33 -0
  206. package/dist/packages/crucible/seeds/js/seed-034.js +33 -0
  207. package/dist/packages/crucible/seeds/js/seed-035.js +30 -0
  208. package/dist/packages/crucible/seeds/js/seed-036.js +30 -0
  209. package/dist/packages/crucible/seeds/js/seed-037.js +29 -0
  210. package/dist/packages/crucible/seeds/js/seed-038.js +31 -0
  211. package/dist/packages/crucible/seeds/js/seed-039.js +34 -0
  212. package/dist/packages/crucible/seeds/js/seed-040.js +35 -0
  213. package/dist/packages/crucible/seeds/js/seed-041.js +32 -0
  214. package/dist/packages/crucible/seeds/js/seed-042.js +32 -0
  215. package/dist/packages/crucible/seeds/js/seed-043.js +27 -0
  216. package/dist/packages/crucible/seeds/js/seed-044.js +29 -0
  217. package/dist/packages/crucible/seeds/js/seed-045.js +33 -0
  218. package/dist/packages/crucible/seeds/js/seed-046.js +33 -0
  219. package/dist/packages/crucible/seeds/js/seed-047.js +29 -0
  220. package/dist/packages/crucible/seeds/js/seed-048.js +29 -0
  221. package/dist/packages/crucible/seeds/js/seed-049.js +34 -0
  222. package/dist/packages/crucible/seeds/js/seed-050.js +34 -0
  223. package/dist/packages/crucible/seeds/js/seed-051.js +30 -0
  224. package/dist/packages/crucible/seeds/js/seed-052.js +30 -0
  225. package/dist/packages/crucible/seeds/js/seed-053.js +26 -0
  226. package/dist/packages/crucible/seeds/js/seed-054.js +35 -0
  227. package/dist/packages/crucible/seeds/js/seed-055.js +33 -0
  228. package/dist/packages/crucible/seeds/kotlin/seed-001.kt +24 -0
  229. package/dist/packages/crucible/seeds/kotlin/seed-002.kt +27 -0
  230. package/dist/packages/crucible/seeds/kotlin/seed-003.kt +29 -0
  231. package/dist/packages/crucible/seeds/kotlin/seed-004.kt +24 -0
  232. package/dist/packages/crucible/seeds/kotlin/seed-005.kt +29 -0
  233. package/dist/packages/crucible/seeds/kotlin/seed-006.kt +21 -0
  234. package/dist/packages/crucible/seeds/kotlin/seed-007.kt +23 -0
  235. package/dist/packages/crucible/seeds/kotlin/seed-008.kt +25 -0
  236. package/dist/packages/crucible/seeds/kotlin/seed-009.kt +21 -0
  237. package/dist/packages/crucible/seeds/kotlin/seed-010.kt +28 -0
  238. package/dist/packages/crucible/seeds/kotlin/seed-011.kt +22 -0
  239. package/dist/packages/crucible/seeds/kotlin/seed-012.kt +25 -0
  240. package/dist/packages/crucible/seeds/kotlin/seed-013.kt +30 -0
  241. package/dist/packages/crucible/seeds/kotlin/seed-014.kt +27 -0
  242. package/dist/packages/crucible/seeds/kotlin/seed-015.kt +24 -0
  243. package/dist/packages/crucible/seeds/kotlin/seed-016.kt +28 -0
  244. package/dist/packages/crucible/seeds/kotlin/seed-017.kt +33 -0
  245. package/dist/packages/crucible/seeds/kotlin/seed-018.kt +31 -0
  246. package/dist/packages/crucible/seeds/kotlin/seed-019.kt +28 -0
  247. package/dist/packages/crucible/seeds/kotlin/seed-020.kt +31 -0
  248. package/dist/packages/crucible/seeds/kotlin/seed-021.kt +34 -0
  249. package/dist/packages/crucible/seeds/kotlin/seed-022.kt +29 -0
  250. package/dist/packages/crucible/seeds/kotlin/seed-023.kt +20 -0
  251. package/dist/packages/crucible/seeds/kotlin/seed-024.kt +23 -0
  252. package/dist/packages/crucible/seeds/kotlin/seed-025.kt +23 -0
  253. package/dist/packages/crucible/seeds/kotlin/seed-026.kt +26 -0
  254. package/dist/packages/crucible/seeds/kotlin/seed-027.kt +29 -0
  255. package/dist/packages/crucible/seeds/kotlin/seed-028.kt +24 -0
  256. package/dist/packages/crucible/seeds/kotlin/seed-029.kt +27 -0
  257. package/dist/packages/crucible/seeds/kotlin/seed-030.kt +26 -0
  258. package/dist/packages/crucible/seeds/kotlin/seed-031.kt +28 -0
  259. package/dist/packages/crucible/seeds/kotlin/seed-032.kt +29 -0
  260. package/dist/packages/crucible/seeds/kotlin/seed-033.kt +30 -0
  261. package/dist/packages/crucible/seeds/kotlin/seed-034.kt +26 -0
  262. package/dist/packages/crucible/seeds/kotlin/seed-035.kt +33 -0
  263. package/dist/packages/crucible/seeds/kotlin/seed-036.kt +25 -0
  264. package/dist/packages/crucible/seeds/kotlin/seed-037.kt +26 -0
  265. package/dist/packages/crucible/seeds/kotlin/seed-038.kt +25 -0
  266. package/dist/packages/crucible/seeds/kotlin/seed-039.kt +29 -0
  267. package/dist/packages/crucible/seeds/kotlin/seed-040.kt +28 -0
  268. package/dist/packages/crucible/seeds/kotlin/seed-041.kt +31 -0
  269. package/dist/packages/crucible/seeds/kotlin/seed-042.kt +27 -0
  270. package/dist/packages/crucible/seeds/kotlin/seed-043.kt +26 -0
  271. package/dist/packages/crucible/seeds/kotlin/seed-044.kt +27 -0
  272. package/dist/packages/crucible/seeds/kotlin/seed-045.kt +27 -0
  273. package/dist/packages/crucible/seeds/kotlin/seed-046.kt +33 -0
  274. package/dist/packages/crucible/seeds/kotlin/seed-047.kt +32 -0
  275. package/dist/packages/crucible/seeds/kotlin/seed-048.kt +20 -0
  276. package/dist/packages/crucible/seeds/kotlin/seed-049.kt +23 -0
  277. package/dist/packages/crucible/seeds/kotlin/seed-050.kt +19 -0
  278. package/dist/packages/crucible/seeds/php/seed-001.php +23 -0
  279. package/dist/packages/crucible/seeds/php/seed-002.php +18 -0
  280. package/dist/packages/crucible/seeds/php/seed-003.php +25 -0
  281. package/dist/packages/crucible/seeds/php/seed-004.php +21 -0
  282. package/dist/packages/crucible/seeds/php/seed-005.php +21 -0
  283. package/dist/packages/crucible/seeds/php/seed-006.php +21 -0
  284. package/dist/packages/crucible/seeds/php/seed-007.php +18 -0
  285. package/dist/packages/crucible/seeds/php/seed-008.php +19 -0
  286. package/dist/packages/crucible/seeds/php/seed-009.php +24 -0
  287. package/dist/packages/crucible/seeds/php/seed-010.php +24 -0
  288. package/dist/packages/crucible/seeds/php/seed-011.php +18 -0
  289. package/dist/packages/crucible/seeds/php/seed-012.php +24 -0
  290. package/dist/packages/crucible/seeds/php/seed-013.php +23 -0
  291. package/dist/packages/crucible/seeds/php/seed-014.php +20 -0
  292. package/dist/packages/crucible/seeds/php/seed-015.php +18 -0
  293. package/dist/packages/crucible/seeds/php/seed-016.php +18 -0
  294. package/dist/packages/crucible/seeds/php/seed-017.php +18 -0
  295. package/dist/packages/crucible/seeds/php/seed-018.php +17 -0
  296. package/dist/packages/crucible/seeds/php/seed-019.php +24 -0
  297. package/dist/packages/crucible/seeds/php/seed-020.php +19 -0
  298. package/dist/packages/crucible/seeds/php/seed-021.php +22 -0
  299. package/dist/packages/crucible/seeds/php/seed-022.php +15 -0
  300. package/dist/packages/crucible/seeds/php/seed-023.php +24 -0
  301. package/dist/packages/crucible/seeds/php/seed-024.php +22 -0
  302. package/dist/packages/crucible/seeds/php/seed-025.php +20 -0
  303. package/dist/packages/crucible/seeds/php/seed-026.php +22 -0
  304. package/dist/packages/crucible/seeds/php/seed-027.php +15 -0
  305. package/dist/packages/crucible/seeds/php/seed-028.php +15 -0
  306. package/dist/packages/crucible/seeds/php/seed-029.php +21 -0
  307. package/dist/packages/crucible/seeds/php/seed-030.php +21 -0
  308. package/dist/packages/crucible/seeds/php/seed-031.php +23 -0
  309. package/dist/packages/crucible/seeds/php/seed-032.php +18 -0
  310. package/dist/packages/crucible/seeds/php/seed-033.php +18 -0
  311. package/dist/packages/crucible/seeds/php/seed-034.php +24 -0
  312. package/dist/packages/crucible/seeds/php/seed-035.php +22 -0
  313. package/dist/packages/crucible/seeds/php/seed-036.php +17 -0
  314. package/dist/packages/crucible/seeds/php/seed-037.php +19 -0
  315. package/dist/packages/crucible/seeds/php/seed-038.php +20 -0
  316. package/dist/packages/crucible/seeds/php/seed-039.php +15 -0
  317. package/dist/packages/crucible/seeds/php/seed-040.php +21 -0
  318. package/dist/packages/crucible/seeds/php/seed-041.php +20 -0
  319. package/dist/packages/crucible/seeds/php/seed-042.php +21 -0
  320. package/dist/packages/crucible/seeds/php/seed-043.php +21 -0
  321. package/dist/packages/crucible/seeds/php/seed-044.php +25 -0
  322. package/dist/packages/crucible/seeds/php/seed-045.php +25 -0
  323. package/dist/packages/crucible/seeds/php/seed-046.php +20 -0
  324. package/dist/packages/crucible/seeds/php/seed-047.php +21 -0
  325. package/dist/packages/crucible/seeds/php/seed-048.php +19 -0
  326. package/dist/packages/crucible/seeds/php/seed-049.php +18 -0
  327. package/dist/packages/crucible/seeds/php/seed-050.php +20 -0
  328. package/dist/packages/crucible/seeds/python/seed-001.py +33 -0
  329. package/dist/packages/crucible/seeds/python/seed-002.py +39 -0
  330. package/dist/packages/crucible/seeds/python/seed-003.py +31 -0
  331. package/dist/packages/crucible/seeds/python/seed-004.py +33 -0
  332. package/dist/packages/crucible/seeds/python/seed-005.py +33 -0
  333. package/dist/packages/crucible/seeds/python/seed-006.py +34 -0
  334. package/dist/packages/crucible/seeds/python/seed-007.py +33 -0
  335. package/dist/packages/crucible/seeds/python/seed-008.py +38 -0
  336. package/dist/packages/crucible/seeds/python/seed-009.py +38 -0
  337. package/dist/packages/crucible/seeds/python/seed-010.py +42 -0
  338. package/dist/packages/crucible/seeds/python/seed-011.py +30 -0
  339. package/dist/packages/crucible/seeds/python/seed-012.py +35 -0
  340. package/dist/packages/crucible/seeds/python/seed-013.py +33 -0
  341. package/dist/packages/crucible/seeds/python/seed-014.py +40 -0
  342. package/dist/packages/crucible/seeds/python/seed-015.py +33 -0
  343. package/dist/packages/crucible/seeds/python/seed-016.py +34 -0
  344. package/dist/packages/crucible/seeds/python/seed-017.py +34 -0
  345. package/dist/packages/crucible/seeds/python/seed-018.py +30 -0
  346. package/dist/packages/crucible/seeds/python/seed-019.py +33 -0
  347. package/dist/packages/crucible/seeds/python/seed-020.py +37 -0
  348. package/dist/packages/crucible/seeds/python/seed-021 2.py +37 -0
  349. package/dist/packages/crucible/seeds/python/seed-021.py +37 -0
  350. package/dist/packages/crucible/seeds/python/seed-022 2.py +34 -0
  351. package/dist/packages/crucible/seeds/python/seed-022.py +34 -0
  352. package/dist/packages/crucible/seeds/python/seed-023 2.py +37 -0
  353. package/dist/packages/crucible/seeds/python/seed-023.py +37 -0
  354. package/dist/packages/crucible/seeds/python/seed-024 2.py +38 -0
  355. package/dist/packages/crucible/seeds/python/seed-024.py +38 -0
  356. package/dist/packages/crucible/seeds/python/seed-025 2.py +40 -0
  357. package/dist/packages/crucible/seeds/python/seed-025.py +40 -0
  358. package/dist/packages/crucible/seeds/python/seed-026 2.py +35 -0
  359. package/dist/packages/crucible/seeds/python/seed-026.py +35 -0
  360. package/dist/packages/crucible/seeds/python/seed-027 2.py +35 -0
  361. package/dist/packages/crucible/seeds/python/seed-027.py +35 -0
  362. package/dist/packages/crucible/seeds/python/seed-028 2.py +42 -0
  363. package/dist/packages/crucible/seeds/python/seed-028.py +42 -0
  364. package/dist/packages/crucible/seeds/python/seed-029.py +42 -0
  365. package/dist/packages/crucible/seeds/python/seed-030 2.py +37 -0
  366. package/dist/packages/crucible/seeds/python/seed-030.py +37 -0
  367. package/dist/packages/crucible/seeds/python/seed-031 2.py +34 -0
  368. package/dist/packages/crucible/seeds/python/seed-031.py +34 -0
  369. package/dist/packages/crucible/seeds/python/seed-032.py +33 -0
  370. package/dist/packages/crucible/seeds/python/seed-033.py +32 -0
  371. package/dist/packages/crucible/seeds/python/seed-034.py +38 -0
  372. package/dist/packages/crucible/seeds/python/seed-035.py +35 -0
  373. package/dist/packages/crucible/seeds/python/seed-036 2.py +33 -0
  374. package/dist/packages/crucible/seeds/python/seed-036.py +33 -0
  375. package/dist/packages/crucible/seeds/python/seed-037 2.py +41 -0
  376. package/dist/packages/crucible/seeds/python/seed-037.py +41 -0
  377. package/dist/packages/crucible/seeds/python/seed-038 2.py +33 -0
  378. package/dist/packages/crucible/seeds/python/seed-038.py +33 -0
  379. package/dist/packages/crucible/seeds/python/seed-039 2.py +39 -0
  380. package/dist/packages/crucible/seeds/python/seed-039.py +39 -0
  381. package/dist/packages/crucible/seeds/python/seed-040 2.py +39 -0
  382. package/dist/packages/crucible/seeds/python/seed-040.py +39 -0
  383. package/dist/packages/crucible/seeds/python/seed-041 2.py +37 -0
  384. package/dist/packages/crucible/seeds/python/seed-041.py +37 -0
  385. package/dist/packages/crucible/seeds/python/seed-042 2.py +38 -0
  386. package/dist/packages/crucible/seeds/python/seed-042.py +38 -0
  387. package/dist/packages/crucible/seeds/python/seed-043 2.py +32 -0
  388. package/dist/packages/crucible/seeds/python/seed-043.py +32 -0
  389. package/dist/packages/crucible/seeds/python/seed-044 2.py +38 -0
  390. package/dist/packages/crucible/seeds/python/seed-044.py +38 -0
  391. package/dist/packages/crucible/seeds/python/seed-045 2.py +36 -0
  392. package/dist/packages/crucible/seeds/python/seed-045.py +36 -0
  393. package/dist/packages/crucible/seeds/python/seed-046 2.py +33 -0
  394. package/dist/packages/crucible/seeds/python/seed-046.py +33 -0
  395. package/dist/packages/crucible/seeds/python/seed-047 2.py +44 -0
  396. package/dist/packages/crucible/seeds/python/seed-047.py +44 -0
  397. package/dist/packages/crucible/seeds/python/seed-048 2.py +35 -0
  398. package/dist/packages/crucible/seeds/python/seed-048.py +35 -0
  399. package/dist/packages/crucible/seeds/python/seed-049 2.py +39 -0
  400. package/dist/packages/crucible/seeds/python/seed-049.py +39 -0
  401. package/dist/packages/crucible/seeds/python/seed-050 2.py +39 -0
  402. package/dist/packages/crucible/seeds/python/seed-050.py +39 -0
  403. package/dist/packages/crucible/seeds/python/seed-051 2.py +38 -0
  404. package/dist/packages/crucible/seeds/python/seed-051.py +38 -0
  405. package/dist/packages/crucible/seeds/python/seed-052 2.py +41 -0
  406. package/dist/packages/crucible/seeds/python/seed-052.py +41 -0
  407. package/dist/packages/crucible/seeds/ruby/seed-001 2.rb +15 -0
  408. package/dist/packages/crucible/seeds/ruby/seed-001.rb +15 -0
  409. package/dist/packages/crucible/seeds/ruby/seed-002 2.rb +22 -0
  410. package/dist/packages/crucible/seeds/ruby/seed-002.rb +22 -0
  411. package/dist/packages/crucible/seeds/ruby/seed-003 2.rb +25 -0
  412. package/dist/packages/crucible/seeds/ruby/seed-003.rb +25 -0
  413. package/dist/packages/crucible/seeds/ruby/seed-004 2.rb +17 -0
  414. package/dist/packages/crucible/seeds/ruby/seed-004.rb +17 -0
  415. package/dist/packages/crucible/seeds/ruby/seed-005 2.rb +21 -0
  416. package/dist/packages/crucible/seeds/ruby/seed-005.rb +21 -0
  417. package/dist/packages/crucible/seeds/ruby/seed-006 2.rb +17 -0
  418. package/dist/packages/crucible/seeds/ruby/seed-006.rb +17 -0
  419. package/dist/packages/crucible/seeds/ruby/seed-007 2.rb +16 -0
  420. package/dist/packages/crucible/seeds/ruby/seed-007.rb +16 -0
  421. package/dist/packages/crucible/seeds/ruby/seed-008 2.rb +18 -0
  422. package/dist/packages/crucible/seeds/ruby/seed-008.rb +18 -0
  423. package/dist/packages/crucible/seeds/ruby/seed-009 2.rb +20 -0
  424. package/dist/packages/crucible/seeds/ruby/seed-009.rb +20 -0
  425. package/dist/packages/crucible/seeds/ruby/seed-010 2.rb +24 -0
  426. package/dist/packages/crucible/seeds/ruby/seed-010.rb +24 -0
  427. package/dist/packages/crucible/seeds/ruby/seed-011 2.rb +21 -0
  428. package/dist/packages/crucible/seeds/ruby/seed-011.rb +21 -0
  429. package/dist/packages/crucible/seeds/ruby/seed-012 2.rb +22 -0
  430. package/dist/packages/crucible/seeds/ruby/seed-012.rb +22 -0
  431. package/dist/packages/crucible/seeds/ruby/seed-013 2.rb +21 -0
  432. package/dist/packages/crucible/seeds/ruby/seed-013.rb +21 -0
  433. package/dist/packages/crucible/seeds/ruby/seed-014 2.rb +16 -0
  434. package/dist/packages/crucible/seeds/ruby/seed-014.rb +16 -0
  435. package/dist/packages/crucible/seeds/ruby/seed-015 2.rb +18 -0
  436. package/dist/packages/crucible/seeds/ruby/seed-015.rb +18 -0
  437. package/dist/packages/crucible/seeds/ruby/seed-016 2.rb +17 -0
  438. package/dist/packages/crucible/seeds/ruby/seed-016.rb +17 -0
  439. package/dist/packages/crucible/seeds/ruby/seed-017 2.rb +25 -0
  440. package/dist/packages/crucible/seeds/ruby/seed-017.rb +25 -0
  441. package/dist/packages/crucible/seeds/ruby/seed-018 2.rb +23 -0
  442. package/dist/packages/crucible/seeds/ruby/seed-018.rb +23 -0
  443. package/dist/packages/crucible/seeds/ruby/seed-019 2.rb +20 -0
  444. package/dist/packages/crucible/seeds/ruby/seed-019.rb +20 -0
  445. package/dist/packages/crucible/seeds/ruby/seed-020 2.rb +17 -0
  446. package/dist/packages/crucible/seeds/ruby/seed-020.rb +17 -0
  447. package/dist/packages/crucible/seeds/ruby/seed-021 2.rb +20 -0
  448. package/dist/packages/crucible/seeds/ruby/seed-021.rb +20 -0
  449. package/dist/packages/crucible/seeds/ruby/seed-022 2.rb +21 -0
  450. package/dist/packages/crucible/seeds/ruby/seed-022.rb +21 -0
  451. package/dist/packages/crucible/seeds/ruby/seed-023 2.rb +19 -0
  452. package/dist/packages/crucible/seeds/ruby/seed-023.rb +19 -0
  453. package/dist/packages/crucible/seeds/ruby/seed-024 2.rb +17 -0
  454. package/dist/packages/crucible/seeds/ruby/seed-024.rb +17 -0
  455. package/dist/packages/crucible/seeds/ruby/seed-025 2.rb +17 -0
  456. package/dist/packages/crucible/seeds/ruby/seed-025.rb +17 -0
  457. package/dist/packages/crucible/seeds/ruby/seed-026 2.rb +18 -0
  458. package/dist/packages/crucible/seeds/ruby/seed-026.rb +18 -0
  459. package/dist/packages/crucible/seeds/ruby/seed-027 2.rb +21 -0
  460. package/dist/packages/crucible/seeds/ruby/seed-027.rb +21 -0
  461. package/dist/packages/crucible/seeds/ruby/seed-028 2.rb +22 -0
  462. package/dist/packages/crucible/seeds/ruby/seed-028.rb +22 -0
  463. package/dist/packages/crucible/seeds/ruby/seed-029 2.rb +19 -0
  464. package/dist/packages/crucible/seeds/ruby/seed-029.rb +19 -0
  465. package/dist/packages/crucible/seeds/ruby/seed-030 2.rb +20 -0
  466. package/dist/packages/crucible/seeds/ruby/seed-030.rb +20 -0
  467. package/dist/packages/crucible/seeds/ruby/seed-031 2.rb +17 -0
  468. package/dist/packages/crucible/seeds/ruby/seed-031.rb +17 -0
  469. package/dist/packages/crucible/seeds/ruby/seed-032 2.rb +22 -0
  470. package/dist/packages/crucible/seeds/ruby/seed-032.rb +22 -0
  471. package/dist/packages/crucible/seeds/ruby/seed-033 2.rb +18 -0
  472. package/dist/packages/crucible/seeds/ruby/seed-033.rb +18 -0
  473. package/dist/packages/crucible/seeds/ruby/seed-034 2.rb +19 -0
  474. package/dist/packages/crucible/seeds/ruby/seed-034.rb +19 -0
  475. package/dist/packages/crucible/seeds/ruby/seed-035 2.rb +19 -0
  476. package/dist/packages/crucible/seeds/ruby/seed-035.rb +19 -0
  477. package/dist/packages/crucible/seeds/ruby/seed-036 2.rb +18 -0
  478. package/dist/packages/crucible/seeds/ruby/seed-036.rb +18 -0
  479. package/dist/packages/crucible/seeds/ruby/seed-037 2.rb +21 -0
  480. package/dist/packages/crucible/seeds/ruby/seed-037.rb +21 -0
  481. package/dist/packages/crucible/seeds/ruby/seed-038 2.rb +24 -0
  482. package/dist/packages/crucible/seeds/ruby/seed-038.rb +24 -0
  483. package/dist/packages/crucible/seeds/ruby/seed-039 2.rb +24 -0
  484. package/dist/packages/crucible/seeds/ruby/seed-039.rb +24 -0
  485. package/dist/packages/crucible/seeds/ruby/seed-040 2.rb +22 -0
  486. package/dist/packages/crucible/seeds/ruby/seed-040.rb +22 -0
  487. package/dist/packages/crucible/seeds/ruby/seed-041 2.rb +23 -0
  488. package/dist/packages/crucible/seeds/ruby/seed-041.rb +23 -0
  489. package/dist/packages/crucible/seeds/ruby/seed-042 2.rb +25 -0
  490. package/dist/packages/crucible/seeds/ruby/seed-042.rb +25 -0
  491. package/dist/packages/crucible/seeds/ruby/seed-043 2.rb +23 -0
  492. package/dist/packages/crucible/seeds/ruby/seed-043.rb +23 -0
  493. package/dist/packages/crucible/seeds/ruby/seed-044 2.rb +16 -0
  494. package/dist/packages/crucible/seeds/ruby/seed-044.rb +16 -0
  495. package/dist/packages/crucible/seeds/ruby/seed-045 2.rb +22 -0
  496. package/dist/packages/crucible/seeds/ruby/seed-045.rb +22 -0
  497. package/dist/packages/crucible/seeds/ruby/seed-046 2.rb +27 -0
  498. package/dist/packages/crucible/seeds/ruby/seed-046.rb +27 -0
  499. package/dist/packages/crucible/seeds/ruby/seed-047 2.rb +26 -0
  500. package/dist/packages/crucible/seeds/ruby/seed-047.rb +26 -0
  501. package/dist/packages/crucible/seeds/ruby/seed-048 2.rb +24 -0
  502. package/dist/packages/crucible/seeds/ruby/seed-048.rb +24 -0
  503. package/dist/packages/crucible/seeds/ruby/seed-049 2.rb +20 -0
  504. package/dist/packages/crucible/seeds/ruby/seed-049.rb +20 -0
  505. package/dist/packages/crucible/seeds/ruby/seed-050 2.rb +27 -0
  506. package/dist/packages/crucible/seeds/ruby/seed-050.rb +27 -0
  507. package/dist/packages/crucible/seeds/rust/seed-001 2.rs +25 -0
  508. package/dist/packages/crucible/seeds/rust/seed-001.rs +25 -0
  509. package/dist/packages/crucible/seeds/rust/seed-002 2.rs +20 -0
  510. package/dist/packages/crucible/seeds/rust/seed-002.rs +20 -0
  511. package/dist/packages/crucible/seeds/rust/seed-003 2.rs +23 -0
  512. package/dist/packages/crucible/seeds/rust/seed-003.rs +23 -0
  513. package/dist/packages/crucible/seeds/rust/seed-004 2.rs +21 -0
  514. package/dist/packages/crucible/seeds/rust/seed-004.rs +21 -0
  515. package/dist/packages/crucible/seeds/rust/seed-005 2.rs +21 -0
  516. package/dist/packages/crucible/seeds/rust/seed-005.rs +21 -0
  517. package/dist/packages/crucible/seeds/rust/seed-006 2.rs +24 -0
  518. package/dist/packages/crucible/seeds/rust/seed-006.rs +24 -0
  519. package/dist/packages/crucible/seeds/rust/seed-007 2.rs +20 -0
  520. package/dist/packages/crucible/seeds/rust/seed-007.rs +20 -0
  521. package/dist/packages/crucible/seeds/rust/seed-008 2.rs +19 -0
  522. package/dist/packages/crucible/seeds/rust/seed-008.rs +19 -0
  523. package/dist/packages/crucible/seeds/rust/seed-009 2.rs +28 -0
  524. package/dist/packages/crucible/seeds/rust/seed-009.rs +28 -0
  525. package/dist/packages/crucible/seeds/rust/seed-010 2.rs +28 -0
  526. package/dist/packages/crucible/seeds/rust/seed-010.rs +28 -0
  527. package/dist/packages/crucible/seeds/rust/seed-011 2.rs +25 -0
  528. package/dist/packages/crucible/seeds/rust/seed-011.rs +25 -0
  529. package/dist/packages/crucible/seeds/rust/seed-012 2.rs +31 -0
  530. package/dist/packages/crucible/seeds/rust/seed-012.rs +31 -0
  531. package/dist/packages/crucible/seeds/rust/seed-013 2.rs +27 -0
  532. package/dist/packages/crucible/seeds/rust/seed-013.rs +27 -0
  533. package/dist/packages/crucible/seeds/rust/seed-014 2.rs +30 -0
  534. package/dist/packages/crucible/seeds/rust/seed-014.rs +30 -0
  535. package/dist/packages/crucible/seeds/rust/seed-015 2.rs +33 -0
  536. package/dist/packages/crucible/seeds/rust/seed-015.rs +33 -0
  537. package/dist/packages/crucible/seeds/rust/seed-016 2.rs +22 -0
  538. package/dist/packages/crucible/seeds/rust/seed-016.rs +22 -0
  539. package/dist/packages/crucible/seeds/rust/seed-017 2.rs +28 -0
  540. package/dist/packages/crucible/seeds/rust/seed-017.rs +28 -0
  541. package/dist/packages/crucible/seeds/rust/seed-018 2.rs +21 -0
  542. package/dist/packages/crucible/seeds/rust/seed-018.rs +21 -0
  543. package/dist/packages/crucible/seeds/rust/seed-019 2.rs +36 -0
  544. package/dist/packages/crucible/seeds/rust/seed-019.rs +36 -0
  545. package/dist/packages/crucible/seeds/rust/seed-020 2.rs +27 -0
  546. package/dist/packages/crucible/seeds/rust/seed-020.rs +27 -0
  547. package/dist/packages/crucible/seeds/rust/seed-021 2.rs +26 -0
  548. package/dist/packages/crucible/seeds/rust/seed-021.rs +26 -0
  549. package/dist/packages/crucible/seeds/rust/seed-022 2.rs +23 -0
  550. package/dist/packages/crucible/seeds/rust/seed-022.rs +23 -0
  551. package/dist/packages/crucible/seeds/rust/seed-023 2.rs +22 -0
  552. package/dist/packages/crucible/seeds/rust/seed-023.rs +22 -0
  553. package/dist/packages/crucible/seeds/rust/seed-024 2.rs +24 -0
  554. package/dist/packages/crucible/seeds/rust/seed-024.rs +24 -0
  555. package/dist/packages/crucible/seeds/rust/seed-025 2.rs +29 -0
  556. package/dist/packages/crucible/seeds/rust/seed-025.rs +29 -0
  557. package/dist/packages/crucible/seeds/rust/seed-026 2.rs +23 -0
  558. package/dist/packages/crucible/seeds/rust/seed-026.rs +23 -0
  559. package/dist/packages/crucible/seeds/rust/seed-027 2.rs +24 -0
  560. package/dist/packages/crucible/seeds/rust/seed-027.rs +24 -0
  561. package/dist/packages/crucible/seeds/rust/seed-028 2.rs +25 -0
  562. package/dist/packages/crucible/seeds/rust/seed-028.rs +25 -0
  563. package/dist/packages/crucible/seeds/rust/seed-029 2.rs +25 -0
  564. package/dist/packages/crucible/seeds/rust/seed-029.rs +25 -0
  565. package/dist/packages/crucible/seeds/rust/seed-030 2.rs +30 -0
  566. package/dist/packages/crucible/seeds/rust/seed-030.rs +30 -0
  567. package/dist/packages/crucible/seeds/rust/seed-031 2.rs +22 -0
  568. package/dist/packages/crucible/seeds/rust/seed-031.rs +22 -0
  569. package/dist/packages/crucible/seeds/rust/seed-032 2.rs +25 -0
  570. package/dist/packages/crucible/seeds/rust/seed-032.rs +25 -0
  571. package/dist/packages/crucible/seeds/rust/seed-033 2.rs +25 -0
  572. package/dist/packages/crucible/seeds/rust/seed-033.rs +25 -0
  573. package/dist/packages/crucible/seeds/rust/seed-034 2.rs +20 -0
  574. package/dist/packages/crucible/seeds/rust/seed-034.rs +20 -0
  575. package/dist/packages/crucible/seeds/rust/seed-035 2.rs +28 -0
  576. package/dist/packages/crucible/seeds/rust/seed-035.rs +28 -0
  577. package/dist/packages/crucible/seeds/rust/seed-036 2.rs +26 -0
  578. package/dist/packages/crucible/seeds/rust/seed-036.rs +26 -0
  579. package/dist/packages/crucible/seeds/rust/seed-037 2.rs +31 -0
  580. package/dist/packages/crucible/seeds/rust/seed-037.rs +31 -0
  581. package/dist/packages/crucible/seeds/rust/seed-038 2.rs +25 -0
  582. package/dist/packages/crucible/seeds/rust/seed-038.rs +25 -0
  583. package/dist/packages/crucible/seeds/rust/seed-039 2.rs +28 -0
  584. package/dist/packages/crucible/seeds/rust/seed-039.rs +28 -0
  585. package/dist/packages/crucible/seeds/rust/seed-040 2.rs +27 -0
  586. package/dist/packages/crucible/seeds/rust/seed-040.rs +27 -0
  587. package/dist/packages/crucible/seeds/rust/seed-041 2.rs +32 -0
  588. package/dist/packages/crucible/seeds/rust/seed-041.rs +32 -0
  589. package/dist/packages/crucible/seeds/rust/seed-042 2.rs +27 -0
  590. package/dist/packages/crucible/seeds/rust/seed-042.rs +27 -0
  591. package/dist/packages/crucible/seeds/rust/seed-043 2.rs +29 -0
  592. package/dist/packages/crucible/seeds/rust/seed-043.rs +29 -0
  593. package/dist/packages/crucible/seeds/rust/seed-044 2.rs +25 -0
  594. package/dist/packages/crucible/seeds/rust/seed-044.rs +25 -0
  595. package/dist/packages/crucible/seeds/rust/seed-045 2.rs +28 -0
  596. package/dist/packages/crucible/seeds/rust/seed-045.rs +28 -0
  597. package/dist/packages/crucible/seeds/rust/seed-046 2.rs +25 -0
  598. package/dist/packages/crucible/seeds/rust/seed-046.rs +25 -0
  599. package/dist/packages/crucible/seeds/rust/seed-047 2.rs +34 -0
  600. package/dist/packages/crucible/seeds/rust/seed-047.rs +34 -0
  601. package/dist/packages/crucible/seeds/rust/seed-048 2.rs +21 -0
  602. package/dist/packages/crucible/seeds/rust/seed-048.rs +21 -0
  603. package/dist/packages/crucible/seeds/rust/seed-049 2.rs +26 -0
  604. package/dist/packages/crucible/seeds/rust/seed-049.rs +26 -0
  605. package/dist/packages/crucible/seeds/rust/seed-050 2.rs +23 -0
  606. package/dist/packages/crucible/seeds/rust/seed-050.rs +23 -0
  607. package/dist/packages/crucible/seeds/ts/seed-001 2.ts +32 -0
  608. package/dist/packages/crucible/seeds/ts/seed-001.ts +32 -0
  609. package/dist/packages/crucible/seeds/ts/seed-002 2.ts +34 -0
  610. package/dist/packages/crucible/seeds/ts/seed-002.ts +34 -0
  611. package/dist/packages/crucible/seeds/ts/seed-003 2.ts +28 -0
  612. package/dist/packages/crucible/seeds/ts/seed-003.ts +28 -0
  613. package/dist/packages/crucible/seeds/ts/seed-004 2.ts +34 -0
  614. package/dist/packages/crucible/seeds/ts/seed-004.ts +34 -0
  615. package/dist/packages/crucible/seeds/ts/seed-005 2.ts +32 -0
  616. package/dist/packages/crucible/seeds/ts/seed-005.ts +32 -0
  617. package/dist/packages/crucible/seeds/ts/seed-006 2.ts +31 -0
  618. package/dist/packages/crucible/seeds/ts/seed-006.ts +31 -0
  619. package/dist/packages/crucible/seeds/ts/seed-007 2.ts +28 -0
  620. package/dist/packages/crucible/seeds/ts/seed-007.ts +28 -0
  621. package/dist/packages/crucible/seeds/ts/seed-008 2.ts +40 -0
  622. package/dist/packages/crucible/seeds/ts/seed-008.ts +40 -0
  623. package/dist/packages/crucible/seeds/ts/seed-009 2.ts +31 -0
  624. package/dist/packages/crucible/seeds/ts/seed-009.ts +31 -0
  625. package/dist/packages/crucible/seeds/ts/seed-010 2.ts +33 -0
  626. package/dist/packages/crucible/seeds/ts/seed-010.ts +33 -0
  627. package/dist/packages/crucible/seeds/ts/seed-011 2.ts +29 -0
  628. package/dist/packages/crucible/seeds/ts/seed-011.ts +29 -0
  629. package/dist/packages/crucible/seeds/ts/seed-012 2.ts +34 -0
  630. package/dist/packages/crucible/seeds/ts/seed-012.ts +34 -0
  631. package/dist/packages/crucible/seeds/ts/seed-013 2.ts +31 -0
  632. package/dist/packages/crucible/seeds/ts/seed-013.ts +31 -0
  633. package/dist/packages/crucible/seeds/ts/seed-014 2.ts +36 -0
  634. package/dist/packages/crucible/seeds/ts/seed-014.ts +36 -0
  635. package/dist/packages/crucible/seeds/ts/seed-015 2.ts +31 -0
  636. package/dist/packages/crucible/seeds/ts/seed-015.ts +31 -0
  637. package/dist/packages/crucible/seeds/ts/seed-016 2.ts +37 -0
  638. package/dist/packages/crucible/seeds/ts/seed-016.ts +37 -0
  639. package/dist/packages/crucible/seeds/ts/seed-017 2.ts +44 -0
  640. package/dist/packages/crucible/seeds/ts/seed-017.ts +44 -0
  641. package/dist/packages/crucible/seeds/ts/seed-018 2.ts +33 -0
  642. package/dist/packages/crucible/seeds/ts/seed-018.ts +33 -0
  643. package/dist/packages/crucible/seeds/ts/seed-019 2.ts +32 -0
  644. package/dist/packages/crucible/seeds/ts/seed-019.ts +32 -0
  645. package/dist/packages/crucible/seeds/ts/seed-020 2.ts +33 -0
  646. package/dist/packages/crucible/seeds/ts/seed-020.ts +33 -0
  647. package/dist/packages/crucible/seeds/ts/seed-021 2.ts +33 -0
  648. package/dist/packages/crucible/seeds/ts/seed-021.ts +33 -0
  649. package/dist/packages/crucible/seeds/ts/seed-022 2.ts +34 -0
  650. package/dist/packages/crucible/seeds/ts/seed-022.ts +34 -0
  651. package/dist/packages/crucible/seeds/ts/seed-023 2.ts +33 -0
  652. package/dist/packages/crucible/seeds/ts/seed-023.ts +33 -0
  653. package/dist/packages/crucible/seeds/ts/seed-024 2.ts +35 -0
  654. package/dist/packages/crucible/seeds/ts/seed-024.ts +35 -0
  655. package/dist/packages/crucible/seeds/ts/seed-025 2.ts +29 -0
  656. package/dist/packages/crucible/seeds/ts/seed-025.ts +29 -0
  657. package/dist/packages/crucible/seeds/ts/seed-026 2.ts +36 -0
  658. package/dist/packages/crucible/seeds/ts/seed-026.ts +36 -0
  659. package/dist/packages/crucible/seeds/ts/seed-027 2.ts +30 -0
  660. package/dist/packages/crucible/seeds/ts/seed-027.ts +30 -0
  661. package/dist/packages/crucible/seeds/ts/seed-028 2.ts +32 -0
  662. package/dist/packages/crucible/seeds/ts/seed-028.ts +32 -0
  663. package/dist/packages/crucible/seeds/ts/seed-029 2.ts +34 -0
  664. package/dist/packages/crucible/seeds/ts/seed-029.ts +34 -0
  665. package/dist/packages/crucible/seeds/ts/seed-030 2.ts +37 -0
  666. package/dist/packages/crucible/seeds/ts/seed-030.ts +37 -0
  667. package/dist/packages/crucible/seeds/ts/seed-031 2.ts +31 -0
  668. package/dist/packages/crucible/seeds/ts/seed-031.ts +31 -0
  669. package/dist/packages/crucible/seeds/ts/seed-032 2.ts +32 -0
  670. package/dist/packages/crucible/seeds/ts/seed-032.ts +32 -0
  671. package/dist/packages/crucible/seeds/ts/seed-033 2.ts +32 -0
  672. package/dist/packages/crucible/seeds/ts/seed-033.ts +32 -0
  673. package/dist/packages/crucible/seeds/ts/seed-034 2.ts +34 -0
  674. package/dist/packages/crucible/seeds/ts/seed-034.ts +34 -0
  675. package/dist/packages/crucible/seeds/ts/seed-035 2.ts +29 -0
  676. package/dist/packages/crucible/seeds/ts/seed-035.ts +29 -0
  677. package/dist/packages/crucible/seeds/ts/seed-036 2.ts +34 -0
  678. package/dist/packages/crucible/seeds/ts/seed-036.ts +34 -0
  679. package/dist/packages/crucible/seeds/ts/seed-037 2.ts +33 -0
  680. package/dist/packages/crucible/seeds/ts/seed-037.ts +33 -0
  681. package/dist/packages/crucible/seeds/ts/seed-038 2.ts +29 -0
  682. package/dist/packages/crucible/seeds/ts/seed-038.ts +29 -0
  683. package/dist/packages/crucible/seeds/ts/seed-039 2.ts +35 -0
  684. package/dist/packages/crucible/seeds/ts/seed-039.ts +35 -0
  685. package/dist/packages/crucible/seeds/ts/seed-040 2.ts +31 -0
  686. package/dist/packages/crucible/seeds/ts/seed-040.ts +31 -0
  687. package/dist/packages/crucible/seeds/ts/seed-041 2.ts +29 -0
  688. package/dist/packages/crucible/seeds/ts/seed-041.ts +29 -0
  689. package/dist/packages/crucible/seeds/ts/seed-042 2.ts +33 -0
  690. package/dist/packages/crucible/seeds/ts/seed-042.ts +33 -0
  691. package/dist/packages/crucible/seeds/ts/seed-043 2.ts +32 -0
  692. package/dist/packages/crucible/seeds/ts/seed-043.ts +32 -0
  693. package/dist/packages/crucible/seeds/ts/seed-044 2.ts +36 -0
  694. package/dist/packages/crucible/seeds/ts/seed-044.ts +36 -0
  695. package/dist/packages/crucible/seeds/ts/seed-045 2.ts +39 -0
  696. package/dist/packages/crucible/seeds/ts/seed-045.ts +39 -0
  697. package/dist/packages/crucible/seeds/ts/seed-046 2.ts +41 -0
  698. package/dist/packages/crucible/seeds/ts/seed-046.ts +41 -0
  699. package/dist/packages/crucible/seeds/ts/seed-047 2.ts +33 -0
  700. package/dist/packages/crucible/seeds/ts/seed-047.ts +33 -0
  701. package/dist/packages/crucible/seeds/ts/seed-048 2.ts +33 -0
  702. package/dist/packages/crucible/seeds/ts/seed-048.ts +33 -0
  703. package/dist/packages/crucible/seeds/ts/seed-049 2.ts +34 -0
  704. package/dist/packages/crucible/seeds/ts/seed-049.ts +34 -0
  705. package/dist/packages/crucible/seeds/ts/seed-050 2.ts +41 -0
  706. package/dist/packages/crucible/seeds/ts/seed-050.ts +41 -0
  707. package/dist/packages/crucible/seeds/ts/seed-051 2.ts +34 -0
  708. package/dist/packages/crucible/seeds/ts/seed-051.ts +34 -0
  709. package/dist/packages/crucible/seeds/ts/seed-052 2.ts +36 -0
  710. package/dist/packages/crucible/seeds/ts/seed-052.ts +36 -0
  711. package/dist/packages/crucible/self-attack.js +1 -0
  712. package/dist/packages/scanner/ai-confidence-scorer.js +1 -1
  713. package/dist/packages/scanner/alert-manager.js +1 -1
  714. package/dist/packages/scanner/ast-analyzer.js +1 -0
  715. package/dist/packages/scanner/baseline-manager.js +1 -1
  716. package/dist/packages/scanner/cfg-analyzer.js +1 -0
  717. package/dist/packages/scanner/code-scanner.js +1 -1
  718. package/dist/packages/scanner/dependency-graph.js +1 -1
  719. package/dist/packages/scanner/drift-detector.js +1 -1
  720. package/dist/packages/scanner/executive-report.js +1 -1
  721. package/dist/packages/scanner/export-verifier.js +1 -0
  722. package/dist/packages/scanner/file-collector.js +1 -1
  723. package/dist/packages/scanner/file-watcher.js +1 -1
  724. package/dist/packages/scanner/ghost-code-detector.js +1 -1
  725. package/dist/packages/scanner/go-ast-analyzer.js +1 -0
  726. package/dist/packages/scanner/hallucination-detector.js +1 -1
  727. package/dist/packages/scanner/html-report.js +1 -1
  728. package/dist/packages/scanner/license-manager.js +1 -1
  729. package/dist/packages/scanner/master-health-checker.js +1 -1
  730. package/dist/packages/scanner/monitor-service.js +1 -1
  731. package/dist/packages/scanner/monitor-store.js +1 -1
  732. package/dist/packages/scanner/python-ast-analyzer.js +1 -0
  733. package/dist/packages/scanner/secret-scanner.js +1 -1
  734. package/dist/packages/scanner/sentinel-core.js +1 -1
  735. package/dist/packages/scanner/taint-tracker.js +1 -0
  736. package/dist/packages/scanner/tech-debt-analyzer.js +1 -1
  737. package/dist/packages/scanner/tech-debt-cost.js +1 -1
  738. package/dist/packages/scanner/widget-generator.js +1 -1
  739. package/package.json +7 -3
@@ -0,0 +1,35 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: command_injection
3
+ # severity: high
4
+ # language: python
5
+ # expected: command injection via paramiko exec_command with user-controlled command string
6
+
7
+ import paramiko
8
+ from flask import Flask, request, jsonify
9
+
10
+ app = Flask(__name__)
11
+
12
+
13
+ def get_ssh_client(host: str) -> paramiko.SSHClient:
14
+ client = paramiko.SSHClient()
15
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
16
+ client.connect(host, username="deploy", key_filename="/home/deploy/.ssh/id_rsa")
17
+ return client
18
+
19
+
20
+ @app.route("/ssh/run", methods=["POST"])
21
+ def run_remote_command():
22
+ data = request.get_json()
23
+ host = data.get("host", "")
24
+ # command from user — attacker appends malicious commands
25
+ command = data.get("command", "")
26
+ allowed_hosts = ["web-01.internal", "web-02.internal"]
27
+ if host not in allowed_hosts:
28
+ return jsonify({"error": "Host not allowed"}), 403
29
+
30
+ client = get_ssh_client(host)
31
+ # command not validated — attacker sends "ls; cat /etc/shadow"
32
+ stdin, stdout, stderr = client.exec_command(command)
33
+ output = stdout.read().decode()
34
+ client.close()
35
+ return jsonify({"output": output})
@@ -0,0 +1,35 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: command_injection
3
+ # severity: high
4
+ # language: python
5
+ # expected: command injection via paramiko exec_command with user-controlled command string
6
+
7
+ import paramiko
8
+ from flask import Flask, request, jsonify
9
+
10
+ app = Flask(__name__)
11
+
12
+
13
+ def get_ssh_client(host: str) -> paramiko.SSHClient:
14
+ client = paramiko.SSHClient()
15
+ client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
16
+ client.connect(host, username="deploy", key_filename="/home/deploy/.ssh/id_rsa")
17
+ return client
18
+
19
+
20
+ @app.route("/ssh/run", methods=["POST"])
21
+ def run_remote_command():
22
+ data = request.get_json()
23
+ host = data.get("host", "")
24
+ # command from user — attacker appends malicious commands
25
+ command = data.get("command", "")
26
+ allowed_hosts = ["web-01.internal", "web-02.internal"]
27
+ if host not in allowed_hosts:
28
+ return jsonify({"error": "Host not allowed"}), 403
29
+
30
+ client = get_ssh_client(host)
31
+ # command not validated — attacker sends "ls; cat /etc/shadow"
32
+ stdin, stdout, stderr = client.exec_command(command)
33
+ output = stdout.read().decode()
34
+ client.close()
35
+ return jsonify({"output": output})
@@ -0,0 +1,42 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: command_injection
3
+ # severity: critical
4
+ # language: python
5
+ # expected: command injection via subprocess.run with shell=True and user-controlled git operation
6
+
7
+ import subprocess
8
+ from dataclasses import dataclass
9
+
10
+
11
+ @dataclass
12
+ class GitConfig:
13
+ repo_path: str
14
+ branch: str # user-controlled
15
+ remote: str = "origin"
16
+
17
+
18
+ class GitService:
19
+ def clone(self, repo_url: str, target: str) -> str:
20
+ # repo_url from user — injection possible
21
+ result = subprocess.run(
22
+ f"git clone {repo_url} {target}", shell=True, capture_output=True, text=True
23
+ )
24
+ return result.stdout
25
+
26
+ def checkout(self, cfg: GitConfig) -> str:
27
+ # cfg.branch from user — "main; cat /etc/passwd > /tmp/leak"
28
+ result = subprocess.run(
29
+ f"git -C {cfg.repo_path} checkout {cfg.branch}",
30
+ shell=True, capture_output=True, text=True
31
+ )
32
+ return result.stdout
33
+
34
+ def tag(self, repo: str, tag_name: str, message: str) -> str:
35
+ result = subprocess.run(
36
+ f'git -C {repo} tag -a {tag_name} -m "{message}"',
37
+ shell=True, capture_output=True, text=True
38
+ )
39
+ return result.stdout
40
+
41
+ def archive(self, repo: str, branch: str, output_file: str) -> None:
42
+ subprocess.run(f"git -C {repo} archive {branch} > {output_file}", shell=True)
@@ -0,0 +1,42 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: command_injection
3
+ # severity: critical
4
+ # language: python
5
+ # expected: command injection via subprocess.run with shell=True and user-controlled git operation
6
+
7
+ import subprocess
8
+ from dataclasses import dataclass
9
+
10
+
11
+ @dataclass
12
+ class GitConfig:
13
+ repo_path: str
14
+ branch: str # user-controlled
15
+ remote: str = "origin"
16
+
17
+
18
+ class GitService:
19
+ def clone(self, repo_url: str, target: str) -> str:
20
+ # repo_url from user — injection possible
21
+ result = subprocess.run(
22
+ f"git clone {repo_url} {target}", shell=True, capture_output=True, text=True
23
+ )
24
+ return result.stdout
25
+
26
+ def checkout(self, cfg: GitConfig) -> str:
27
+ # cfg.branch from user — "main; cat /etc/passwd > /tmp/leak"
28
+ result = subprocess.run(
29
+ f"git -C {cfg.repo_path} checkout {cfg.branch}",
30
+ shell=True, capture_output=True, text=True
31
+ )
32
+ return result.stdout
33
+
34
+ def tag(self, repo: str, tag_name: str, message: str) -> str:
35
+ result = subprocess.run(
36
+ f'git -C {repo} tag -a {tag_name} -m "{message}"',
37
+ shell=True, capture_output=True, text=True
38
+ )
39
+ return result.stdout
40
+
41
+ def archive(self, repo: str, branch: str, output_file: str) -> None:
42
+ subprocess.run(f"git -C {repo} archive {branch} > {output_file}", shell=True)
@@ -0,0 +1,42 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal via open() with unvalidated user-supplied file path
6
+
7
+ import os
8
+ from flask import Flask, request, send_file, abort
9
+
10
+ app = Flask(__name__)
11
+
12
+ BASE_DIR = "/var/app/public/files"
13
+
14
+
15
+ @app.route("/files/<path:filename>")
16
+ def serve_file(filename: str):
17
+ # path.join does NOT prevent traversal — "../../etc/passwd" resolves outside BASE_DIR
18
+ file_path = os.path.join(BASE_DIR, filename)
19
+ try:
20
+ with open(file_path, "rb") as f:
21
+ return f.read()
22
+ except FileNotFoundError:
23
+ abort(404)
24
+
25
+
26
+ @app.route("/download")
27
+ def download():
28
+ file_path = request.args.get("path", "")
29
+ # Completely unvalidated path — reads arbitrary files
30
+ try:
31
+ with open(file_path, "r") as f:
32
+ return f.read()
33
+ except Exception as e:
34
+ return str(e), 400
35
+
36
+
37
+ @app.route("/logs/view")
38
+ def view_log():
39
+ log_name = request.args.get("log", "app.log")
40
+ log_path = f"/var/log/app/{log_name}"
41
+ with open(log_path, "r") as f:
42
+ return f.read()
@@ -0,0 +1,37 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal in Django view via user-controlled filename parameter
6
+
7
+ import os
8
+ from django.http import FileResponse, Http404, HttpResponse
9
+ from django.conf import settings
10
+
11
+
12
+ def serve_user_file(request, user_id: str):
13
+ filename = request.GET.get("file", "")
14
+ # No normalization — filename can be "../../../etc/passwd"
15
+ file_path = os.path.join(settings.MEDIA_ROOT, user_id, filename)
16
+ try:
17
+ return FileResponse(open(file_path, "rb"))
18
+ except FileNotFoundError:
19
+ raise Http404("File not found")
20
+
21
+
22
+ def export_report(request):
23
+ report_name = request.GET.get("report", "monthly")
24
+ locale = request.GET.get("locale", "en")
25
+ # Both report_name and locale inserted into path — traversal possible
26
+ path = os.path.join(settings.REPORTS_DIR, locale, f"{report_name}.pdf")
27
+ if not os.path.exists(path):
28
+ raise Http404
29
+ with open(path, "rb") as f:
30
+ return HttpResponse(f.read(), content_type="application/pdf")
31
+
32
+
33
+ def read_template(request):
34
+ template = request.GET.get("template", "welcome")
35
+ path = f"{settings.TEMPLATES_DIR}/{template}.html"
36
+ with open(path) as f:
37
+ return HttpResponse(f.read())
@@ -0,0 +1,37 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal in Django view via user-controlled filename parameter
6
+
7
+ import os
8
+ from django.http import FileResponse, Http404, HttpResponse
9
+ from django.conf import settings
10
+
11
+
12
+ def serve_user_file(request, user_id: str):
13
+ filename = request.GET.get("file", "")
14
+ # No normalization — filename can be "../../../etc/passwd"
15
+ file_path = os.path.join(settings.MEDIA_ROOT, user_id, filename)
16
+ try:
17
+ return FileResponse(open(file_path, "rb"))
18
+ except FileNotFoundError:
19
+ raise Http404("File not found")
20
+
21
+
22
+ def export_report(request):
23
+ report_name = request.GET.get("report", "monthly")
24
+ locale = request.GET.get("locale", "en")
25
+ # Both report_name and locale inserted into path — traversal possible
26
+ path = os.path.join(settings.REPORTS_DIR, locale, f"{report_name}.pdf")
27
+ if not os.path.exists(path):
28
+ raise Http404
29
+ with open(path, "rb") as f:
30
+ return HttpResponse(f.read(), content_type="application/pdf")
31
+
32
+
33
+ def read_template(request):
34
+ template = request.GET.get("template", "welcome")
35
+ path = f"{settings.TEMPLATES_DIR}/{template}.html"
36
+ with open(path) as f:
37
+ return HttpResponse(f.read())
@@ -0,0 +1,34 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal via zipfile extraction without entry path validation (zip-slip)
6
+
7
+ import os
8
+ import zipfile
9
+
10
+
11
+ EXTRACT_BASE = "/var/app/uploads/extracted"
12
+
13
+
14
+ def extract_archive(zip_bytes: bytes, user_id: str) -> list:
15
+ import io
16
+ extracted = []
17
+ with zipfile.ZipFile(io.BytesIO(zip_bytes)) as zf:
18
+ for entry in zf.infolist():
19
+ # entry.filename can contain "../" — writes outside EXTRACT_BASE
20
+ output_path = os.path.join(EXTRACT_BASE, user_id, entry.filename)
21
+ if entry.is_dir():
22
+ os.makedirs(output_path, exist_ok=True)
23
+ else:
24
+ os.makedirs(os.path.dirname(output_path), exist_ok=True)
25
+ with zf.open(entry) as src, open(output_path, "wb") as dst:
26
+ dst.write(src.read())
27
+ extracted.append(output_path)
28
+ return extracted
29
+
30
+
31
+ def get_extracted_file(user_id: str, relative_path: str) -> bytes:
32
+ full_path = os.path.join(EXTRACT_BASE, user_id, relative_path)
33
+ with open(full_path, "rb") as f:
34
+ return f.read()
@@ -0,0 +1,34 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal via zipfile extraction without entry path validation (zip-slip)
6
+
7
+ import os
8
+ import zipfile
9
+
10
+
11
+ EXTRACT_BASE = "/var/app/uploads/extracted"
12
+
13
+
14
+ def extract_archive(zip_bytes: bytes, user_id: str) -> list:
15
+ import io
16
+ extracted = []
17
+ with zipfile.ZipFile(io.BytesIO(zip_bytes)) as zf:
18
+ for entry in zf.infolist():
19
+ # entry.filename can contain "../" — writes outside EXTRACT_BASE
20
+ output_path = os.path.join(EXTRACT_BASE, user_id, entry.filename)
21
+ if entry.is_dir():
22
+ os.makedirs(output_path, exist_ok=True)
23
+ else:
24
+ os.makedirs(os.path.dirname(output_path), exist_ok=True)
25
+ with zf.open(entry) as src, open(output_path, "wb") as dst:
26
+ dst.write(src.read())
27
+ extracted.append(output_path)
28
+ return extracted
29
+
30
+
31
+ def get_extracted_file(user_id: str, relative_path: str) -> bytes:
32
+ full_path = os.path.join(EXTRACT_BASE, user_id, relative_path)
33
+ with open(full_path, "rb") as f:
34
+ return f.read()
@@ -0,0 +1,33 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: medium
4
+ # language: python
5
+ # expected: path traversal via Flask send_from_directory with user-controlled subdirectory
6
+
7
+ import os
8
+ from flask import Flask, request, send_from_directory, abort
9
+
10
+ app = Flask(__name__)
11
+
12
+ UPLOADS_ROOT = "/var/uploads"
13
+
14
+
15
+ @app.route("/uploads/<user_id>/files")
16
+ def list_files(user_id: str):
17
+ subdir = request.args.get("folder", "")
18
+ # user_id and subdir can include "../" to escape UPLOADS_ROOT
19
+ target_dir = os.path.join(UPLOADS_ROOT, user_id, subdir)
20
+ try:
21
+ files = os.listdir(target_dir)
22
+ return {"files": files}
23
+ except FileNotFoundError:
24
+ abort(404)
25
+
26
+
27
+ @app.route("/uploads/<user_id>/get")
28
+ def get_file(user_id: str):
29
+ filename = request.args.get("name", "")
30
+ directory = request.args.get("dir", "")
31
+ # send_from_directory with user-controlled directory + filename
32
+ full_dir = os.path.join(UPLOADS_ROOT, user_id, directory)
33
+ return send_from_directory(full_dir, filename)
@@ -0,0 +1,32 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: path_traversal
3
+ # severity: high
4
+ # language: python
5
+ # expected: path traversal via FastAPI file endpoint with unvalidated path parameter
6
+
7
+ import os
8
+ from fastapi import FastAPI, Query
9
+ from fastapi.responses import FileResponse, PlainTextResponse
10
+
11
+ app = FastAPI()
12
+
13
+ STATIC_ROOT = "/var/app/static"
14
+
15
+
16
+ @app.get("/static/{file_path:path}")
17
+ async def serve_static(file_path: str):
18
+ # file_path can be "../../etc/passwd" — no normalization or boundary check
19
+ full_path = os.path.join(STATIC_ROOT, file_path)
20
+ if not os.path.isfile(full_path):
21
+ return PlainTextResponse("Not found", status_code=404)
22
+ return FileResponse(full_path)
23
+
24
+
25
+ @app.get("/config/view")
26
+ async def view_config(name: str = Query(...)):
27
+ config_path = f"/etc/myapp/{name}.conf"
28
+ try:
29
+ with open(config_path) as f:
30
+ return {"content": f.read()}
31
+ except FileNotFoundError:
32
+ return {"error": "Config not found"}, 404
@@ -0,0 +1,38 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: high
4
+ # language: python
5
+ # expected: MD5 used for password hashing
6
+
7
+ import hashlib
8
+ import psycopg2
9
+
10
+
11
+ def get_db():
12
+ return psycopg2.connect(host="localhost", dbname="app", user="app", password="app")
13
+
14
+
15
+ def hash_password(password: str) -> str:
16
+ # MD5 is cryptographically broken — must not be used for passwords
17
+ return hashlib.md5(password.encode()).hexdigest()
18
+
19
+
20
+ def register_user(email: str, password: str) -> None:
21
+ conn = get_db()
22
+ cur = conn.cursor()
23
+ pw_hash = hash_password(password)
24
+ cur.execute("INSERT INTO users (email, password_hash) VALUES (%s, %s)", (email, pw_hash))
25
+ conn.commit()
26
+
27
+
28
+ def login_user(email: str, password: str) -> bool:
29
+ conn = get_db()
30
+ cur = conn.cursor()
31
+ pw_hash = hash_password(password)
32
+ cur.execute("SELECT id FROM users WHERE email = %s AND password_hash = %s", (email, pw_hash))
33
+ return cur.fetchone() is not None
34
+
35
+
36
+ def hash_file(file_path: str) -> str:
37
+ with open(file_path, "rb") as f:
38
+ return hashlib.md5(f.read()).hexdigest()
@@ -0,0 +1,35 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: high
4
+ # language: python
5
+ # expected: SHA1 used for password hashing and random.random() for token generation
6
+
7
+ import hashlib
8
+ import random
9
+ import time
10
+
11
+
12
+ def hash_password(password: str, salt: str = "") -> str:
13
+ # SHA-1 is deprecated for security-sensitive hashing
14
+ return hashlib.sha1((salt + password).encode()).hexdigest()
15
+
16
+
17
+ def generate_session_token() -> str:
18
+ # random.random() is not cryptographically secure
19
+ return hex(int(random.random() * 10**18))[2:]
20
+
21
+
22
+ def generate_reset_token(user_id: int) -> str:
23
+ # Predictable — only uses timestamp and non-secure random
24
+ return hashlib.sha1(f"{user_id}-{time.time()}-{random.randint(0, 999999)}".encode()).hexdigest()
25
+
26
+
27
+ def create_api_key(user_id: str) -> str:
28
+ # Weak entropy source — easily guessable
29
+ rand = random.getrandbits(32)
30
+ return hashlib.md5(f"{user_id}{rand}".encode()).hexdigest()
31
+
32
+
33
+ def generate_otp() -> str:
34
+ # random.randint is predictable — use secrets.randbelow instead
35
+ return str(random.randint(100000, 999999))
@@ -0,0 +1,33 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: high
4
+ # language: python
5
+ # expected: DES cipher usage and AES-ECB mode with static key
6
+
7
+ from Crypto.Cipher import DES, AES
8
+ import base64
9
+
10
+ DES_KEY = b"weakkey!" # 8 bytes — DES is broken
11
+ AES_KEY = b"0123456789abcdef" # 16 bytes
12
+
13
+
14
+ def des_encrypt(data: str) -> str:
15
+ # DES has only 56-bit effective key length — trivially brute-forced
16
+ padded = data + " " * (8 - len(data) % 8)
17
+ cipher = DES.new(DES_KEY, DES.MODE_ECB)
18
+ return base64.b64encode(cipher.encrypt(padded.encode())).decode()
19
+
20
+
21
+ def aes_ecb_encrypt(data: str) -> str:
22
+ # ECB mode: identical plaintext blocks produce identical ciphertext blocks
23
+ pad_len = 16 - len(data) % 16
24
+ padded = (data + chr(pad_len) * pad_len).encode()
25
+ cipher = AES.new(AES_KEY, AES.MODE_ECB)
26
+ return base64.b64encode(cipher.encrypt(padded)).decode()
27
+
28
+
29
+ def aes_ecb_decrypt(ciphertext: str) -> str:
30
+ cipher = AES.new(AES_KEY, AES.MODE_ECB)
31
+ decrypted = cipher.decrypt(base64.b64decode(ciphertext))
32
+ pad_len = decrypted[-1]
33
+ return decrypted[:-pad_len].decode()
@@ -0,0 +1,33 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: high
4
+ # language: python
5
+ # expected: DES cipher usage and AES-ECB mode with static key
6
+
7
+ from Crypto.Cipher import DES, AES
8
+ import base64
9
+
10
+ DES_KEY = b"weakkey!" # 8 bytes — DES is broken
11
+ AES_KEY = b"0123456789abcdef" # 16 bytes
12
+
13
+
14
+ def des_encrypt(data: str) -> str:
15
+ # DES has only 56-bit effective key length — trivially brute-forced
16
+ padded = data + " " * (8 - len(data) % 8)
17
+ cipher = DES.new(DES_KEY, DES.MODE_ECB)
18
+ return base64.b64encode(cipher.encrypt(padded.encode())).decode()
19
+
20
+
21
+ def aes_ecb_encrypt(data: str) -> str:
22
+ # ECB mode: identical plaintext blocks produce identical ciphertext blocks
23
+ pad_len = 16 - len(data) % 16
24
+ padded = (data + chr(pad_len) * pad_len).encode()
25
+ cipher = AES.new(AES_KEY, AES.MODE_ECB)
26
+ return base64.b64encode(cipher.encrypt(padded)).decode()
27
+
28
+
29
+ def aes_ecb_decrypt(ciphertext: str) -> str:
30
+ cipher = AES.new(AES_KEY, AES.MODE_ECB)
31
+ decrypted = cipher.decrypt(base64.b64decode(ciphertext))
32
+ pad_len = decrypted[-1]
33
+ return decrypted[:-pad_len].decode()
@@ -0,0 +1,41 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: medium
4
+ # language: python
5
+ # expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
6
+
7
+ import hmac
8
+ import hashlib
9
+
10
+
11
+ WEBHOOK_SECRET = b"static-webhook-secret-2024"
12
+
13
+
14
+ def compute_signature(payload: bytes) -> str:
15
+ return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
16
+
17
+
18
+ def verify_signature(payload: bytes, received_sig: str) -> bool:
19
+ expected = compute_signature(payload)
20
+ # String comparison leaks timing info — use hmac.compare_digest instead
21
+ return expected == received_sig
22
+
23
+
24
+ def verify_api_key(provided: str, stored: str) -> bool:
25
+ # Direct equality — timing side-channel attack possible
26
+ return provided == stored
27
+
28
+
29
+ def derive_key(password: str) -> bytes:
30
+ # Only 1000 iterations — far below NIST recommendation of 600,000+
31
+ return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
32
+
33
+
34
+ def check_token(token_a: str, token_b: str) -> bool:
35
+ # Char-by-char comparison leaks prefix matches
36
+ if len(token_a) != len(token_b):
37
+ return False
38
+ for a, b in zip(token_a, token_b):
39
+ if a != b:
40
+ return False
41
+ return True
@@ -0,0 +1,41 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: medium
4
+ # language: python
5
+ # expected: timing attack via string comparison of HMAC signatures, low-iteration PBKDF2
6
+
7
+ import hmac
8
+ import hashlib
9
+
10
+
11
+ WEBHOOK_SECRET = b"static-webhook-secret-2024"
12
+
13
+
14
+ def compute_signature(payload: bytes) -> str:
15
+ return hmac.new(WEBHOOK_SECRET, payload, hashlib.sha256).hexdigest()
16
+
17
+
18
+ def verify_signature(payload: bytes, received_sig: str) -> bool:
19
+ expected = compute_signature(payload)
20
+ # String comparison leaks timing info — use hmac.compare_digest instead
21
+ return expected == received_sig
22
+
23
+
24
+ def verify_api_key(provided: str, stored: str) -> bool:
25
+ # Direct equality — timing side-channel attack possible
26
+ return provided == stored
27
+
28
+
29
+ def derive_key(password: str) -> bytes:
30
+ # Only 1000 iterations — far below NIST recommendation of 600,000+
31
+ return hashlib.pbkdf2_hmac("sha1", password.encode(), b"static-salt", 1000)
32
+
33
+
34
+ def check_token(token_a: str, token_b: str) -> bool:
35
+ # Char-by-char comparison leaks prefix matches
36
+ if len(token_a) != len(token_b):
37
+ return False
38
+ for a, b in zip(token_a, token_b):
39
+ if a != b:
40
+ return False
41
+ return True
@@ -0,0 +1,33 @@
1
+ # [CRUCIBLE-SEED]
2
+ # category: insecure_crypto
3
+ # severity: high
4
+ # language: python
5
+ # expected: MD5 used for file integrity and RSA with insufficient key size
6
+
7
+ import hashlib
8
+ from Crypto.PublicKey import RSA
9
+ from Crypto.Signature import pkcs1_15
10
+ from Crypto.Hash import MD5
11
+
12
+
13
+ def checksum_file(filepath: str) -> str:
14
+ # MD5 is collision-prone — not suitable for integrity verification
15
+ with open(filepath, "rb") as f:
16
+ return hashlib.md5(f.read()).hexdigest()
17
+
18
+
19
+ def verify_file_integrity(filepath: str, expected_md5: str) -> bool:
20
+ return checksum_file(filepath) == expected_md5
21
+
22
+
23
+ def generate_rsa_keypair():
24
+ # 512-bit RSA key — trivially factorable in seconds
25
+ key = RSA.generate(512)
26
+ return key.export_key().decode(), key.publickey().export_key().decode()
27
+
28
+
29
+ def sign_with_md5(private_key_pem: str, message: bytes) -> bytes:
30
+ key = RSA.import_key(private_key_pem)
31
+ # MD5 with RSA — known-weak combination
32
+ h = MD5.new(message)
33
+ return pkcs1_15.new(key).sign(h)