thuban 0.3.3 → 0.4.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 (960) hide show
  1. package/README.md +2 -0
  2. package/dist/LICENSE +21 -0
  3. package/dist/README.md +187 -0
  4. package/dist/cli.js +2 -0
  5. package/dist/packages/crucible/.golden/golden-master.json +414 -0
  6. package/dist/packages/crucible/badge-generator.js +1 -0
  7. package/dist/packages/crucible/banner.js +1 -0
  8. package/dist/packages/crucible/ci-integration.js +1 -0
  9. package/dist/packages/crucible/golden-master.js +1 -0
  10. package/dist/packages/crucible/index.js +1 -0
  11. package/dist/packages/crucible/kenny-mode.js +1 -0
  12. package/dist/packages/crucible/leaderboard.js +1 -0
  13. package/dist/packages/crucible/mutation-engine.js +1 -0
  14. package/dist/packages/crucible/pattern-learner.js +1 -0
  15. package/dist/packages/crucible/report-generator.js +1 -0
  16. package/dist/packages/crucible/rule-loader.js +1 -0
  17. package/dist/packages/crucible/seeding-engine.js +1 -0
  18. package/dist/packages/crucible/seeds/csharp/seed-001.cs +28 -0
  19. package/dist/packages/crucible/seeds/csharp/seed-002.cs +24 -0
  20. package/dist/packages/crucible/seeds/csharp/seed-003.cs +30 -0
  21. package/dist/packages/crucible/seeds/csharp/seed-004.cs +31 -0
  22. package/dist/packages/crucible/seeds/csharp/seed-005.cs +28 -0
  23. package/dist/packages/crucible/seeds/csharp/seed-006.cs +25 -0
  24. package/dist/packages/crucible/seeds/csharp/seed-007.cs +34 -0
  25. package/dist/packages/crucible/seeds/csharp/seed-008.cs +23 -0
  26. package/dist/packages/crucible/seeds/csharp/seed-009.cs +27 -0
  27. package/dist/packages/crucible/seeds/csharp/seed-010.cs +29 -0
  28. package/dist/packages/crucible/seeds/csharp/seed-011.cs +32 -0
  29. package/dist/packages/crucible/seeds/csharp/seed-012.cs +27 -0
  30. package/dist/packages/crucible/seeds/csharp/seed-013.cs +27 -0
  31. package/dist/packages/crucible/seeds/csharp/seed-014.cs +26 -0
  32. package/dist/packages/crucible/seeds/csharp/seed-015.cs +33 -0
  33. package/dist/packages/crucible/seeds/csharp/seed-016.cs +25 -0
  34. package/dist/packages/crucible/seeds/csharp/seed-017.cs +22 -0
  35. package/dist/packages/crucible/seeds/csharp/seed-018.cs +26 -0
  36. package/dist/packages/crucible/seeds/csharp/seed-019.cs +25 -0
  37. package/dist/packages/crucible/seeds/csharp/seed-020.cs +22 -0
  38. package/dist/packages/crucible/seeds/csharp/seed-021.cs +28 -0
  39. package/dist/packages/crucible/seeds/csharp/seed-022.cs +25 -0
  40. package/dist/packages/crucible/seeds/csharp/seed-023.cs +33 -0
  41. package/dist/packages/crucible/seeds/csharp/seed-024.cs +31 -0
  42. package/dist/packages/crucible/seeds/csharp/seed-025.cs +31 -0
  43. package/dist/packages/crucible/seeds/csharp/seed-026.cs +25 -0
  44. package/dist/packages/crucible/seeds/csharp/seed-027.cs +29 -0
  45. package/dist/packages/crucible/seeds/csharp/seed-028.cs +25 -0
  46. package/dist/packages/crucible/seeds/csharp/seed-029.cs +27 -0
  47. package/dist/packages/crucible/seeds/csharp/seed-030.cs +27 -0
  48. package/dist/packages/crucible/seeds/csharp/seed-031.cs +28 -0
  49. package/dist/packages/crucible/seeds/csharp/seed-032.cs +30 -0
  50. package/dist/packages/crucible/seeds/csharp/seed-033.cs +27 -0
  51. package/dist/packages/crucible/seeds/csharp/seed-034.cs +25 -0
  52. package/dist/packages/crucible/seeds/csharp/seed-035.cs +32 -0
  53. package/dist/packages/crucible/seeds/csharp/seed-036.cs +28 -0
  54. package/dist/packages/crucible/seeds/csharp/seed-037.cs +29 -0
  55. package/dist/packages/crucible/seeds/csharp/seed-038.cs +28 -0
  56. package/dist/packages/crucible/seeds/csharp/seed-039.cs +29 -0
  57. package/dist/packages/crucible/seeds/csharp/seed-040.cs +28 -0
  58. package/dist/packages/crucible/seeds/csharp/seed-041.cs +33 -0
  59. package/dist/packages/crucible/seeds/csharp/seed-042.cs +27 -0
  60. package/dist/packages/crucible/seeds/csharp/seed-043.cs +27 -0
  61. package/dist/packages/crucible/seeds/csharp/seed-044.cs +25 -0
  62. package/dist/packages/crucible/seeds/csharp/seed-045.cs +30 -0
  63. package/dist/packages/crucible/seeds/csharp/seed-046.cs +29 -0
  64. package/dist/packages/crucible/seeds/csharp/seed-047.cs +26 -0
  65. package/dist/packages/crucible/seeds/csharp/seed-048.cs +31 -0
  66. package/dist/packages/crucible/seeds/csharp/seed-049.cs +27 -0
  67. package/dist/packages/crucible/seeds/csharp/seed-050.cs +30 -0
  68. package/dist/packages/crucible/seeds/csharp/seed-051.cs +34 -0
  69. package/dist/packages/crucible/seeds/csharp/seed-052.cs +36 -0
  70. package/dist/packages/crucible/seeds/go/seed-001.go +29 -0
  71. package/dist/packages/crucible/seeds/go/seed-002.go +27 -0
  72. package/dist/packages/crucible/seeds/go/seed-003.go +31 -0
  73. package/dist/packages/crucible/seeds/go/seed-004.go +27 -0
  74. package/dist/packages/crucible/seeds/go/seed-005.go +27 -0
  75. package/dist/packages/crucible/seeds/go/seed-006.go +29 -0
  76. package/dist/packages/crucible/seeds/go/seed-007.go +24 -0
  77. package/dist/packages/crucible/seeds/go/seed-008.go +25 -0
  78. package/dist/packages/crucible/seeds/go/seed-009.go +30 -0
  79. package/dist/packages/crucible/seeds/go/seed-010.go +35 -0
  80. package/dist/packages/crucible/seeds/go/seed-011.go +24 -0
  81. package/dist/packages/crucible/seeds/go/seed-012.go +24 -0
  82. package/dist/packages/crucible/seeds/go/seed-013.go +31 -0
  83. package/dist/packages/crucible/seeds/go/seed-014.go +35 -0
  84. package/dist/packages/crucible/seeds/go/seed-015.go +25 -0
  85. package/dist/packages/crucible/seeds/go/seed-016.go +19 -0
  86. package/dist/packages/crucible/seeds/go/seed-017.go +23 -0
  87. package/dist/packages/crucible/seeds/go/seed-018.go +23 -0
  88. package/dist/packages/crucible/seeds/go/seed-019.go +22 -0
  89. package/dist/packages/crucible/seeds/go/seed-020.go +31 -0
  90. package/dist/packages/crucible/seeds/go/seed-021.go +22 -0
  91. package/dist/packages/crucible/seeds/go/seed-022.go +29 -0
  92. package/dist/packages/crucible/seeds/go/seed-023.go +26 -0
  93. package/dist/packages/crucible/seeds/go/seed-024.go +27 -0
  94. package/dist/packages/crucible/seeds/go/seed-025.go +23 -0
  95. package/dist/packages/crucible/seeds/go/seed-026.go +29 -0
  96. package/dist/packages/crucible/seeds/go/seed-027.go +26 -0
  97. package/dist/packages/crucible/seeds/go/seed-028.go +23 -0
  98. package/dist/packages/crucible/seeds/go/seed-029.go +28 -0
  99. package/dist/packages/crucible/seeds/go/seed-030.go +27 -0
  100. package/dist/packages/crucible/seeds/go/seed-031.go +28 -0
  101. package/dist/packages/crucible/seeds/go/seed-032.go +27 -0
  102. package/dist/packages/crucible/seeds/go/seed-033.go +29 -0
  103. package/dist/packages/crucible/seeds/go/seed-034.go +22 -0
  104. package/dist/packages/crucible/seeds/go/seed-035.go +32 -0
  105. package/dist/packages/crucible/seeds/go/seed-036.go +27 -0
  106. package/dist/packages/crucible/seeds/go/seed-037.go +27 -0
  107. package/dist/packages/crucible/seeds/go/seed-038.go +27 -0
  108. package/dist/packages/crucible/seeds/go/seed-039.go +26 -0
  109. package/dist/packages/crucible/seeds/go/seed-040.go +37 -0
  110. package/dist/packages/crucible/seeds/go/seed-041.go +23 -0
  111. package/dist/packages/crucible/seeds/go/seed-042.go +32 -0
  112. package/dist/packages/crucible/seeds/go/seed-043.go +35 -0
  113. package/dist/packages/crucible/seeds/go/seed-044.go +25 -0
  114. package/dist/packages/crucible/seeds/go/seed-045.go +26 -0
  115. package/dist/packages/crucible/seeds/go/seed-046.go +34 -0
  116. package/dist/packages/crucible/seeds/go/seed-047.go +26 -0
  117. package/dist/packages/crucible/seeds/go/seed-048.go +29 -0
  118. package/dist/packages/crucible/seeds/go/seed-049.go +24 -0
  119. package/dist/packages/crucible/seeds/go/seed-050.go +27 -0
  120. package/dist/packages/crucible/seeds/go/seed-051.go +38 -0
  121. package/dist/packages/crucible/seeds/go/seed-052.go +27 -0
  122. package/dist/packages/crucible/seeds/java/seed-001.java +23 -0
  123. package/dist/packages/crucible/seeds/java/seed-002.java +22 -0
  124. package/dist/packages/crucible/seeds/java/seed-003.java +28 -0
  125. package/dist/packages/crucible/seeds/java/seed-004.java +26 -0
  126. package/dist/packages/crucible/seeds/java/seed-005.java +33 -0
  127. package/dist/packages/crucible/seeds/java/seed-006.java +22 -0
  128. package/dist/packages/crucible/seeds/java/seed-007.java +21 -0
  129. package/dist/packages/crucible/seeds/java/seed-008.java +29 -0
  130. package/dist/packages/crucible/seeds/java/seed-009.java +24 -0
  131. package/dist/packages/crucible/seeds/java/seed-010.java +30 -0
  132. package/dist/packages/crucible/seeds/java/seed-011.java +25 -0
  133. package/dist/packages/crucible/seeds/java/seed-012.java +20 -0
  134. package/dist/packages/crucible/seeds/java/seed-013.java +26 -0
  135. package/dist/packages/crucible/seeds/java/seed-014.java +23 -0
  136. package/dist/packages/crucible/seeds/java/seed-015.java +25 -0
  137. package/dist/packages/crucible/seeds/java/seed-016.java +22 -0
  138. package/dist/packages/crucible/seeds/java/seed-017.java +24 -0
  139. package/dist/packages/crucible/seeds/java/seed-018.java +24 -0
  140. package/dist/packages/crucible/seeds/java/seed-019.java +38 -0
  141. package/dist/packages/crucible/seeds/java/seed-020.java +24 -0
  142. package/dist/packages/crucible/seeds/java/seed-021.java +22 -0
  143. package/dist/packages/crucible/seeds/java/seed-022.java +22 -0
  144. package/dist/packages/crucible/seeds/java/seed-023.java +22 -0
  145. package/dist/packages/crucible/seeds/java/seed-024.java +25 -0
  146. package/dist/packages/crucible/seeds/java/seed-025.java +27 -0
  147. package/dist/packages/crucible/seeds/java/seed-026.java +25 -0
  148. package/dist/packages/crucible/seeds/java/seed-027.java +22 -0
  149. package/dist/packages/crucible/seeds/java/seed-028.java +21 -0
  150. package/dist/packages/crucible/seeds/java/seed-029.java +28 -0
  151. package/dist/packages/crucible/seeds/java/seed-030.java +27 -0
  152. package/dist/packages/crucible/seeds/java/seed-031.java +23 -0
  153. package/dist/packages/crucible/seeds/java/seed-032.java +22 -0
  154. package/dist/packages/crucible/seeds/java/seed-033.java +24 -0
  155. package/dist/packages/crucible/seeds/java/seed-034.java +24 -0
  156. package/dist/packages/crucible/seeds/java/seed-035.java +29 -0
  157. package/dist/packages/crucible/seeds/java/seed-036.java +25 -0
  158. package/dist/packages/crucible/seeds/java/seed-037.java +30 -0
  159. package/dist/packages/crucible/seeds/java/seed-038.java +29 -0
  160. package/dist/packages/crucible/seeds/java/seed-039.java +26 -0
  161. package/dist/packages/crucible/seeds/java/seed-040.java +31 -0
  162. package/dist/packages/crucible/seeds/java/seed-041.java +20 -0
  163. package/dist/packages/crucible/seeds/java/seed-042.java +26 -0
  164. package/dist/packages/crucible/seeds/java/seed-043.java +31 -0
  165. package/dist/packages/crucible/seeds/java/seed-044.java +22 -0
  166. package/dist/packages/crucible/seeds/java/seed-045.java +25 -0
  167. package/dist/packages/crucible/seeds/java/seed-046.java +22 -0
  168. package/dist/packages/crucible/seeds/java/seed-047.java +26 -0
  169. package/dist/packages/crucible/seeds/java/seed-048.java +24 -0
  170. package/dist/packages/crucible/seeds/java/seed-049.java +28 -0
  171. package/dist/packages/crucible/seeds/java/seed-050.java +29 -0
  172. package/dist/packages/crucible/seeds/java/seed-051.java +25 -0
  173. package/dist/packages/crucible/seeds/java/seed-052.java +32 -0
  174. package/dist/packages/crucible/seeds/js/seed-001.js +27 -0
  175. package/dist/packages/crucible/seeds/js/seed-002.js +28 -0
  176. package/dist/packages/crucible/seeds/js/seed-003.js +30 -0
  177. package/dist/packages/crucible/seeds/js/seed-004.js +28 -0
  178. package/dist/packages/crucible/seeds/js/seed-005.js +31 -0
  179. package/dist/packages/crucible/seeds/js/seed-006.js +28 -0
  180. package/dist/packages/crucible/seeds/js/seed-007.js +26 -0
  181. package/dist/packages/crucible/seeds/js/seed-008.js +30 -0
  182. package/dist/packages/crucible/seeds/js/seed-009.js +30 -0
  183. package/dist/packages/crucible/seeds/js/seed-010.js +29 -0
  184. package/dist/packages/crucible/seeds/js/seed-011.js +34 -0
  185. package/dist/packages/crucible/seeds/js/seed-012.js +32 -0
  186. package/dist/packages/crucible/seeds/js/seed-013.js +29 -0
  187. package/dist/packages/crucible/seeds/js/seed-014.js +29 -0
  188. package/dist/packages/crucible/seeds/js/seed-015.js +31 -0
  189. package/dist/packages/crucible/seeds/js/seed-016.js +31 -0
  190. package/dist/packages/crucible/seeds/js/seed-017.js +30 -0
  191. package/dist/packages/crucible/seeds/js/seed-018.js +29 -0
  192. package/dist/packages/crucible/seeds/js/seed-019.js +32 -0
  193. package/dist/packages/crucible/seeds/js/seed-020.js +29 -0
  194. package/dist/packages/crucible/seeds/js/seed-021.js +31 -0
  195. package/dist/packages/crucible/seeds/js/seed-022.js +31 -0
  196. package/dist/packages/crucible/seeds/js/seed-023.js +29 -0
  197. package/dist/packages/crucible/seeds/js/seed-024.js +29 -0
  198. package/dist/packages/crucible/seeds/js/seed-025.js +34 -0
  199. package/dist/packages/crucible/seeds/js/seed-026.js +31 -0
  200. package/dist/packages/crucible/seeds/js/seed-027.js +31 -0
  201. package/dist/packages/crucible/seeds/js/seed-028.js +33 -0
  202. package/dist/packages/crucible/seeds/js/seed-029.js +33 -0
  203. package/dist/packages/crucible/seeds/js/seed-030.js +30 -0
  204. package/dist/packages/crucible/seeds/js/seed-031.js +31 -0
  205. package/dist/packages/crucible/seeds/js/seed-032.js +34 -0
  206. package/dist/packages/crucible/seeds/js/seed-033.js +33 -0
  207. package/dist/packages/crucible/seeds/js/seed-034.js +33 -0
  208. package/dist/packages/crucible/seeds/js/seed-035.js +30 -0
  209. package/dist/packages/crucible/seeds/js/seed-036.js +30 -0
  210. package/dist/packages/crucible/seeds/js/seed-037.js +29 -0
  211. package/dist/packages/crucible/seeds/js/seed-038.js +31 -0
  212. package/dist/packages/crucible/seeds/js/seed-039.js +34 -0
  213. package/dist/packages/crucible/seeds/js/seed-040.js +35 -0
  214. package/dist/packages/crucible/seeds/js/seed-041.js +32 -0
  215. package/dist/packages/crucible/seeds/js/seed-042.js +32 -0
  216. package/dist/packages/crucible/seeds/js/seed-043.js +27 -0
  217. package/dist/packages/crucible/seeds/js/seed-044.js +29 -0
  218. package/dist/packages/crucible/seeds/js/seed-045.js +33 -0
  219. package/dist/packages/crucible/seeds/js/seed-046.js +33 -0
  220. package/dist/packages/crucible/seeds/js/seed-047.js +29 -0
  221. package/dist/packages/crucible/seeds/js/seed-048.js +29 -0
  222. package/dist/packages/crucible/seeds/js/seed-049.js +34 -0
  223. package/dist/packages/crucible/seeds/js/seed-050.js +34 -0
  224. package/dist/packages/crucible/seeds/js/seed-051.js +30 -0
  225. package/dist/packages/crucible/seeds/js/seed-052.js +30 -0
  226. package/dist/packages/crucible/seeds/js/seed-053.js +26 -0
  227. package/dist/packages/crucible/seeds/js/seed-054.js +35 -0
  228. package/dist/packages/crucible/seeds/js/seed-055.js +33 -0
  229. package/dist/packages/crucible/seeds/kotlin/seed-001.kt +24 -0
  230. package/dist/packages/crucible/seeds/kotlin/seed-002.kt +27 -0
  231. package/dist/packages/crucible/seeds/kotlin/seed-003.kt +29 -0
  232. package/dist/packages/crucible/seeds/kotlin/seed-004.kt +24 -0
  233. package/dist/packages/crucible/seeds/kotlin/seed-005.kt +29 -0
  234. package/dist/packages/crucible/seeds/kotlin/seed-006.kt +21 -0
  235. package/dist/packages/crucible/seeds/kotlin/seed-007.kt +23 -0
  236. package/dist/packages/crucible/seeds/kotlin/seed-008.kt +25 -0
  237. package/dist/packages/crucible/seeds/kotlin/seed-009.kt +21 -0
  238. package/dist/packages/crucible/seeds/kotlin/seed-010.kt +28 -0
  239. package/dist/packages/crucible/seeds/kotlin/seed-011.kt +22 -0
  240. package/dist/packages/crucible/seeds/kotlin/seed-012.kt +25 -0
  241. package/dist/packages/crucible/seeds/kotlin/seed-013.kt +30 -0
  242. package/dist/packages/crucible/seeds/kotlin/seed-014.kt +27 -0
  243. package/dist/packages/crucible/seeds/kotlin/seed-015.kt +24 -0
  244. package/dist/packages/crucible/seeds/kotlin/seed-016.kt +28 -0
  245. package/dist/packages/crucible/seeds/kotlin/seed-017.kt +33 -0
  246. package/dist/packages/crucible/seeds/kotlin/seed-018.kt +31 -0
  247. package/dist/packages/crucible/seeds/kotlin/seed-019.kt +28 -0
  248. package/dist/packages/crucible/seeds/kotlin/seed-020.kt +31 -0
  249. package/dist/packages/crucible/seeds/kotlin/seed-021.kt +34 -0
  250. package/dist/packages/crucible/seeds/kotlin/seed-022.kt +29 -0
  251. package/dist/packages/crucible/seeds/kotlin/seed-023.kt +20 -0
  252. package/dist/packages/crucible/seeds/kotlin/seed-024.kt +23 -0
  253. package/dist/packages/crucible/seeds/kotlin/seed-025.kt +23 -0
  254. package/dist/packages/crucible/seeds/kotlin/seed-026.kt +26 -0
  255. package/dist/packages/crucible/seeds/kotlin/seed-027.kt +29 -0
  256. package/dist/packages/crucible/seeds/kotlin/seed-028.kt +24 -0
  257. package/dist/packages/crucible/seeds/kotlin/seed-029.kt +27 -0
  258. package/dist/packages/crucible/seeds/kotlin/seed-030.kt +26 -0
  259. package/dist/packages/crucible/seeds/kotlin/seed-031.kt +28 -0
  260. package/dist/packages/crucible/seeds/kotlin/seed-032.kt +29 -0
  261. package/dist/packages/crucible/seeds/kotlin/seed-033.kt +30 -0
  262. package/dist/packages/crucible/seeds/kotlin/seed-034.kt +26 -0
  263. package/dist/packages/crucible/seeds/kotlin/seed-035.kt +33 -0
  264. package/dist/packages/crucible/seeds/kotlin/seed-036.kt +25 -0
  265. package/dist/packages/crucible/seeds/kotlin/seed-037.kt +26 -0
  266. package/dist/packages/crucible/seeds/kotlin/seed-038.kt +25 -0
  267. package/dist/packages/crucible/seeds/kotlin/seed-039.kt +29 -0
  268. package/dist/packages/crucible/seeds/kotlin/seed-040.kt +28 -0
  269. package/dist/packages/crucible/seeds/kotlin/seed-041.kt +31 -0
  270. package/dist/packages/crucible/seeds/kotlin/seed-042.kt +27 -0
  271. package/dist/packages/crucible/seeds/kotlin/seed-043.kt +26 -0
  272. package/dist/packages/crucible/seeds/kotlin/seed-044.kt +27 -0
  273. package/dist/packages/crucible/seeds/kotlin/seed-045.kt +27 -0
  274. package/dist/packages/crucible/seeds/kotlin/seed-046.kt +33 -0
  275. package/dist/packages/crucible/seeds/kotlin/seed-047.kt +32 -0
  276. package/dist/packages/crucible/seeds/kotlin/seed-048.kt +20 -0
  277. package/dist/packages/crucible/seeds/kotlin/seed-049.kt +23 -0
  278. package/dist/packages/crucible/seeds/kotlin/seed-050.kt +19 -0
  279. package/dist/packages/crucible/seeds/php/seed-001.php +23 -0
  280. package/dist/packages/crucible/seeds/php/seed-002.php +18 -0
  281. package/dist/packages/crucible/seeds/php/seed-003.php +25 -0
  282. package/dist/packages/crucible/seeds/php/seed-004.php +21 -0
  283. package/dist/packages/crucible/seeds/php/seed-005.php +21 -0
  284. package/dist/packages/crucible/seeds/php/seed-006.php +21 -0
  285. package/dist/packages/crucible/seeds/php/seed-007.php +18 -0
  286. package/dist/packages/crucible/seeds/php/seed-008.php +19 -0
  287. package/dist/packages/crucible/seeds/php/seed-009.php +24 -0
  288. package/dist/packages/crucible/seeds/php/seed-010.php +24 -0
  289. package/dist/packages/crucible/seeds/php/seed-011.php +18 -0
  290. package/dist/packages/crucible/seeds/php/seed-012.php +24 -0
  291. package/dist/packages/crucible/seeds/php/seed-013.php +23 -0
  292. package/dist/packages/crucible/seeds/php/seed-014.php +20 -0
  293. package/dist/packages/crucible/seeds/php/seed-015.php +18 -0
  294. package/dist/packages/crucible/seeds/php/seed-016.php +18 -0
  295. package/dist/packages/crucible/seeds/php/seed-017.php +18 -0
  296. package/dist/packages/crucible/seeds/php/seed-018.php +17 -0
  297. package/dist/packages/crucible/seeds/php/seed-019.php +24 -0
  298. package/dist/packages/crucible/seeds/php/seed-020.php +19 -0
  299. package/dist/packages/crucible/seeds/php/seed-021.php +22 -0
  300. package/dist/packages/crucible/seeds/php/seed-022.php +15 -0
  301. package/dist/packages/crucible/seeds/php/seed-023.php +24 -0
  302. package/dist/packages/crucible/seeds/php/seed-024.php +22 -0
  303. package/dist/packages/crucible/seeds/php/seed-025.php +20 -0
  304. package/dist/packages/crucible/seeds/php/seed-026.php +22 -0
  305. package/dist/packages/crucible/seeds/php/seed-027.php +15 -0
  306. package/dist/packages/crucible/seeds/php/seed-028.php +15 -0
  307. package/dist/packages/crucible/seeds/php/seed-029.php +21 -0
  308. package/dist/packages/crucible/seeds/php/seed-030.php +21 -0
  309. package/dist/packages/crucible/seeds/php/seed-031.php +23 -0
  310. package/dist/packages/crucible/seeds/php/seed-032.php +18 -0
  311. package/dist/packages/crucible/seeds/php/seed-033.php +18 -0
  312. package/dist/packages/crucible/seeds/php/seed-034.php +24 -0
  313. package/dist/packages/crucible/seeds/php/seed-035.php +22 -0
  314. package/dist/packages/crucible/seeds/php/seed-036.php +17 -0
  315. package/dist/packages/crucible/seeds/php/seed-037.php +19 -0
  316. package/dist/packages/crucible/seeds/php/seed-038.php +20 -0
  317. package/dist/packages/crucible/seeds/php/seed-039.php +15 -0
  318. package/dist/packages/crucible/seeds/php/seed-040.php +21 -0
  319. package/dist/packages/crucible/seeds/php/seed-041.php +20 -0
  320. package/dist/packages/crucible/seeds/php/seed-042.php +21 -0
  321. package/dist/packages/crucible/seeds/php/seed-043.php +21 -0
  322. package/dist/packages/crucible/seeds/php/seed-044.php +25 -0
  323. package/dist/packages/crucible/seeds/php/seed-045.php +25 -0
  324. package/dist/packages/crucible/seeds/php/seed-046.php +20 -0
  325. package/dist/packages/crucible/seeds/php/seed-047.php +21 -0
  326. package/dist/packages/crucible/seeds/php/seed-048.php +19 -0
  327. package/dist/packages/crucible/seeds/php/seed-049.php +18 -0
  328. package/dist/packages/crucible/seeds/php/seed-050.php +20 -0
  329. package/dist/packages/crucible/seeds/python/seed-001.py +33 -0
  330. package/dist/packages/crucible/seeds/python/seed-002.py +39 -0
  331. package/dist/packages/crucible/seeds/python/seed-003.py +31 -0
  332. package/dist/packages/crucible/seeds/python/seed-004.py +33 -0
  333. package/dist/packages/crucible/seeds/python/seed-005.py +33 -0
  334. package/dist/packages/crucible/seeds/python/seed-006.py +34 -0
  335. package/dist/packages/crucible/seeds/python/seed-007.py +33 -0
  336. package/dist/packages/crucible/seeds/python/seed-008.py +38 -0
  337. package/dist/packages/crucible/seeds/python/seed-009.py +38 -0
  338. package/dist/packages/crucible/seeds/python/seed-010.py +42 -0
  339. package/dist/packages/crucible/seeds/python/seed-011.py +30 -0
  340. package/dist/packages/crucible/seeds/python/seed-012.py +35 -0
  341. package/dist/packages/crucible/seeds/python/seed-013.py +33 -0
  342. package/dist/packages/crucible/seeds/python/seed-014.py +40 -0
  343. package/dist/packages/crucible/seeds/python/seed-015.py +33 -0
  344. package/dist/packages/crucible/seeds/python/seed-016.py +34 -0
  345. package/dist/packages/crucible/seeds/python/seed-017.py +34 -0
  346. package/dist/packages/crucible/seeds/python/seed-018.py +30 -0
  347. package/dist/packages/crucible/seeds/python/seed-019.py +33 -0
  348. package/dist/packages/crucible/seeds/python/seed-020.py +37 -0
  349. package/dist/packages/crucible/seeds/python/seed-021 2.py +37 -0
  350. package/dist/packages/crucible/seeds/python/seed-021 3.py +37 -0
  351. package/dist/packages/crucible/seeds/python/seed-021.py +37 -0
  352. package/dist/packages/crucible/seeds/python/seed-022 2.py +34 -0
  353. package/dist/packages/crucible/seeds/python/seed-022 3.py +34 -0
  354. package/dist/packages/crucible/seeds/python/seed-022.py +34 -0
  355. package/dist/packages/crucible/seeds/python/seed-023 2.py +37 -0
  356. package/dist/packages/crucible/seeds/python/seed-023 3.py +37 -0
  357. package/dist/packages/crucible/seeds/python/seed-023.py +37 -0
  358. package/dist/packages/crucible/seeds/python/seed-024 2.py +38 -0
  359. package/dist/packages/crucible/seeds/python/seed-024 3.py +38 -0
  360. package/dist/packages/crucible/seeds/python/seed-024.py +38 -0
  361. package/dist/packages/crucible/seeds/python/seed-025 2.py +40 -0
  362. package/dist/packages/crucible/seeds/python/seed-025 3.py +40 -0
  363. package/dist/packages/crucible/seeds/python/seed-025.py +40 -0
  364. package/dist/packages/crucible/seeds/python/seed-026 2.py +35 -0
  365. package/dist/packages/crucible/seeds/python/seed-026 3.py +35 -0
  366. package/dist/packages/crucible/seeds/python/seed-026.py +35 -0
  367. package/dist/packages/crucible/seeds/python/seed-027 2.py +35 -0
  368. package/dist/packages/crucible/seeds/python/seed-027 3.py +35 -0
  369. package/dist/packages/crucible/seeds/python/seed-027.py +35 -0
  370. package/dist/packages/crucible/seeds/python/seed-028 2.py +42 -0
  371. package/dist/packages/crucible/seeds/python/seed-028 3.py +42 -0
  372. package/dist/packages/crucible/seeds/python/seed-028.py +42 -0
  373. package/dist/packages/crucible/seeds/python/seed-029.py +42 -0
  374. package/dist/packages/crucible/seeds/python/seed-030 2.py +37 -0
  375. package/dist/packages/crucible/seeds/python/seed-030 3.py +37 -0
  376. package/dist/packages/crucible/seeds/python/seed-030.py +37 -0
  377. package/dist/packages/crucible/seeds/python/seed-031 2.py +34 -0
  378. package/dist/packages/crucible/seeds/python/seed-031 3.py +34 -0
  379. package/dist/packages/crucible/seeds/python/seed-031.py +34 -0
  380. package/dist/packages/crucible/seeds/python/seed-032.py +33 -0
  381. package/dist/packages/crucible/seeds/python/seed-033.py +32 -0
  382. package/dist/packages/crucible/seeds/python/seed-034.py +38 -0
  383. package/dist/packages/crucible/seeds/python/seed-035.py +35 -0
  384. package/dist/packages/crucible/seeds/python/seed-036 2.py +33 -0
  385. package/dist/packages/crucible/seeds/python/seed-036 3.py +33 -0
  386. package/dist/packages/crucible/seeds/python/seed-036.py +33 -0
  387. package/dist/packages/crucible/seeds/python/seed-037 2.py +41 -0
  388. package/dist/packages/crucible/seeds/python/seed-037 3.py +41 -0
  389. package/dist/packages/crucible/seeds/python/seed-037.py +41 -0
  390. package/dist/packages/crucible/seeds/python/seed-038 2.py +33 -0
  391. package/dist/packages/crucible/seeds/python/seed-038 3.py +33 -0
  392. package/dist/packages/crucible/seeds/python/seed-038.py +33 -0
  393. package/dist/packages/crucible/seeds/python/seed-039 2.py +39 -0
  394. package/dist/packages/crucible/seeds/python/seed-039 3.py +39 -0
  395. package/dist/packages/crucible/seeds/python/seed-039.py +39 -0
  396. package/dist/packages/crucible/seeds/python/seed-040 2.py +39 -0
  397. package/dist/packages/crucible/seeds/python/seed-040 3.py +39 -0
  398. package/dist/packages/crucible/seeds/python/seed-040.py +39 -0
  399. package/dist/packages/crucible/seeds/python/seed-041 2.py +37 -0
  400. package/dist/packages/crucible/seeds/python/seed-041 3.py +37 -0
  401. package/dist/packages/crucible/seeds/python/seed-041.py +37 -0
  402. package/dist/packages/crucible/seeds/python/seed-042 2.py +38 -0
  403. package/dist/packages/crucible/seeds/python/seed-042 3.py +38 -0
  404. package/dist/packages/crucible/seeds/python/seed-042.py +38 -0
  405. package/dist/packages/crucible/seeds/python/seed-043 2.py +32 -0
  406. package/dist/packages/crucible/seeds/python/seed-043 3.py +32 -0
  407. package/dist/packages/crucible/seeds/python/seed-043.py +32 -0
  408. package/dist/packages/crucible/seeds/python/seed-044 2.py +38 -0
  409. package/dist/packages/crucible/seeds/python/seed-044 3.py +38 -0
  410. package/dist/packages/crucible/seeds/python/seed-044.py +38 -0
  411. package/dist/packages/crucible/seeds/python/seed-045 2.py +36 -0
  412. package/dist/packages/crucible/seeds/python/seed-045 3.py +36 -0
  413. package/dist/packages/crucible/seeds/python/seed-045.py +36 -0
  414. package/dist/packages/crucible/seeds/python/seed-046 2.py +33 -0
  415. package/dist/packages/crucible/seeds/python/seed-046 3.py +33 -0
  416. package/dist/packages/crucible/seeds/python/seed-046.py +33 -0
  417. package/dist/packages/crucible/seeds/python/seed-047 2.py +44 -0
  418. package/dist/packages/crucible/seeds/python/seed-047 3.py +44 -0
  419. package/dist/packages/crucible/seeds/python/seed-047.py +44 -0
  420. package/dist/packages/crucible/seeds/python/seed-048 2.py +35 -0
  421. package/dist/packages/crucible/seeds/python/seed-048 3.py +35 -0
  422. package/dist/packages/crucible/seeds/python/seed-048.py +35 -0
  423. package/dist/packages/crucible/seeds/python/seed-049 2.py +39 -0
  424. package/dist/packages/crucible/seeds/python/seed-049 3.py +39 -0
  425. package/dist/packages/crucible/seeds/python/seed-049.py +39 -0
  426. package/dist/packages/crucible/seeds/python/seed-050 2.py +39 -0
  427. package/dist/packages/crucible/seeds/python/seed-050 3.py +39 -0
  428. package/dist/packages/crucible/seeds/python/seed-050.py +39 -0
  429. package/dist/packages/crucible/seeds/python/seed-051 2.py +38 -0
  430. package/dist/packages/crucible/seeds/python/seed-051 3.py +38 -0
  431. package/dist/packages/crucible/seeds/python/seed-051.py +38 -0
  432. package/dist/packages/crucible/seeds/python/seed-052 2.py +41 -0
  433. package/dist/packages/crucible/seeds/python/seed-052 3.py +41 -0
  434. package/dist/packages/crucible/seeds/python/seed-052.py +41 -0
  435. package/dist/packages/crucible/seeds/ruby/seed-001 2.rb +15 -0
  436. package/dist/packages/crucible/seeds/ruby/seed-001 3.rb +15 -0
  437. package/dist/packages/crucible/seeds/ruby/seed-001.rb +15 -0
  438. package/dist/packages/crucible/seeds/ruby/seed-002 2.rb +22 -0
  439. package/dist/packages/crucible/seeds/ruby/seed-002 3.rb +22 -0
  440. package/dist/packages/crucible/seeds/ruby/seed-002.rb +22 -0
  441. package/dist/packages/crucible/seeds/ruby/seed-003 2.rb +25 -0
  442. package/dist/packages/crucible/seeds/ruby/seed-003 3.rb +25 -0
  443. package/dist/packages/crucible/seeds/ruby/seed-003.rb +25 -0
  444. package/dist/packages/crucible/seeds/ruby/seed-004 2.rb +17 -0
  445. package/dist/packages/crucible/seeds/ruby/seed-004 3.rb +17 -0
  446. package/dist/packages/crucible/seeds/ruby/seed-004.rb +17 -0
  447. package/dist/packages/crucible/seeds/ruby/seed-005 2.rb +21 -0
  448. package/dist/packages/crucible/seeds/ruby/seed-005 3.rb +21 -0
  449. package/dist/packages/crucible/seeds/ruby/seed-005.rb +21 -0
  450. package/dist/packages/crucible/seeds/ruby/seed-006 2.rb +17 -0
  451. package/dist/packages/crucible/seeds/ruby/seed-006 3.rb +17 -0
  452. package/dist/packages/crucible/seeds/ruby/seed-006.rb +17 -0
  453. package/dist/packages/crucible/seeds/ruby/seed-007 2.rb +16 -0
  454. package/dist/packages/crucible/seeds/ruby/seed-007 3.rb +16 -0
  455. package/dist/packages/crucible/seeds/ruby/seed-007.rb +16 -0
  456. package/dist/packages/crucible/seeds/ruby/seed-008 2.rb +18 -0
  457. package/dist/packages/crucible/seeds/ruby/seed-008 3.rb +18 -0
  458. package/dist/packages/crucible/seeds/ruby/seed-008.rb +18 -0
  459. package/dist/packages/crucible/seeds/ruby/seed-009 2.rb +20 -0
  460. package/dist/packages/crucible/seeds/ruby/seed-009 3.rb +20 -0
  461. package/dist/packages/crucible/seeds/ruby/seed-009.rb +20 -0
  462. package/dist/packages/crucible/seeds/ruby/seed-010 2.rb +24 -0
  463. package/dist/packages/crucible/seeds/ruby/seed-010 3.rb +24 -0
  464. package/dist/packages/crucible/seeds/ruby/seed-010.rb +24 -0
  465. package/dist/packages/crucible/seeds/ruby/seed-011 2.rb +21 -0
  466. package/dist/packages/crucible/seeds/ruby/seed-011 3.rb +21 -0
  467. package/dist/packages/crucible/seeds/ruby/seed-011.rb +21 -0
  468. package/dist/packages/crucible/seeds/ruby/seed-012 2.rb +22 -0
  469. package/dist/packages/crucible/seeds/ruby/seed-012 3.rb +22 -0
  470. package/dist/packages/crucible/seeds/ruby/seed-012.rb +22 -0
  471. package/dist/packages/crucible/seeds/ruby/seed-013 2.rb +21 -0
  472. package/dist/packages/crucible/seeds/ruby/seed-013 3.rb +21 -0
  473. package/dist/packages/crucible/seeds/ruby/seed-013.rb +21 -0
  474. package/dist/packages/crucible/seeds/ruby/seed-014 2.rb +16 -0
  475. package/dist/packages/crucible/seeds/ruby/seed-014 3.rb +16 -0
  476. package/dist/packages/crucible/seeds/ruby/seed-014.rb +16 -0
  477. package/dist/packages/crucible/seeds/ruby/seed-015 2.rb +18 -0
  478. package/dist/packages/crucible/seeds/ruby/seed-015 3.rb +18 -0
  479. package/dist/packages/crucible/seeds/ruby/seed-015.rb +18 -0
  480. package/dist/packages/crucible/seeds/ruby/seed-016 2.rb +17 -0
  481. package/dist/packages/crucible/seeds/ruby/seed-016 3.rb +17 -0
  482. package/dist/packages/crucible/seeds/ruby/seed-016.rb +17 -0
  483. package/dist/packages/crucible/seeds/ruby/seed-017 2.rb +25 -0
  484. package/dist/packages/crucible/seeds/ruby/seed-017 3.rb +25 -0
  485. package/dist/packages/crucible/seeds/ruby/seed-017.rb +25 -0
  486. package/dist/packages/crucible/seeds/ruby/seed-018 2.rb +23 -0
  487. package/dist/packages/crucible/seeds/ruby/seed-018 3.rb +23 -0
  488. package/dist/packages/crucible/seeds/ruby/seed-018.rb +23 -0
  489. package/dist/packages/crucible/seeds/ruby/seed-019 2.rb +20 -0
  490. package/dist/packages/crucible/seeds/ruby/seed-019 3.rb +20 -0
  491. package/dist/packages/crucible/seeds/ruby/seed-019.rb +20 -0
  492. package/dist/packages/crucible/seeds/ruby/seed-020 2.rb +17 -0
  493. package/dist/packages/crucible/seeds/ruby/seed-020 3.rb +17 -0
  494. package/dist/packages/crucible/seeds/ruby/seed-020.rb +17 -0
  495. package/dist/packages/crucible/seeds/ruby/seed-021 2.rb +20 -0
  496. package/dist/packages/crucible/seeds/ruby/seed-021 3.rb +20 -0
  497. package/dist/packages/crucible/seeds/ruby/seed-021.rb +20 -0
  498. package/dist/packages/crucible/seeds/ruby/seed-022 2.rb +21 -0
  499. package/dist/packages/crucible/seeds/ruby/seed-022 3.rb +21 -0
  500. package/dist/packages/crucible/seeds/ruby/seed-022.rb +21 -0
  501. package/dist/packages/crucible/seeds/ruby/seed-023 2.rb +19 -0
  502. package/dist/packages/crucible/seeds/ruby/seed-023 3.rb +19 -0
  503. package/dist/packages/crucible/seeds/ruby/seed-023.rb +19 -0
  504. package/dist/packages/crucible/seeds/ruby/seed-024 2.rb +17 -0
  505. package/dist/packages/crucible/seeds/ruby/seed-024 3.rb +17 -0
  506. package/dist/packages/crucible/seeds/ruby/seed-024.rb +17 -0
  507. package/dist/packages/crucible/seeds/ruby/seed-025 2.rb +17 -0
  508. package/dist/packages/crucible/seeds/ruby/seed-025 3.rb +17 -0
  509. package/dist/packages/crucible/seeds/ruby/seed-025.rb +17 -0
  510. package/dist/packages/crucible/seeds/ruby/seed-026 2.rb +18 -0
  511. package/dist/packages/crucible/seeds/ruby/seed-026 3.rb +18 -0
  512. package/dist/packages/crucible/seeds/ruby/seed-026.rb +18 -0
  513. package/dist/packages/crucible/seeds/ruby/seed-027 2.rb +21 -0
  514. package/dist/packages/crucible/seeds/ruby/seed-027 3.rb +21 -0
  515. package/dist/packages/crucible/seeds/ruby/seed-027.rb +21 -0
  516. package/dist/packages/crucible/seeds/ruby/seed-028 2.rb +22 -0
  517. package/dist/packages/crucible/seeds/ruby/seed-028 3.rb +22 -0
  518. package/dist/packages/crucible/seeds/ruby/seed-028.rb +22 -0
  519. package/dist/packages/crucible/seeds/ruby/seed-029 2.rb +19 -0
  520. package/dist/packages/crucible/seeds/ruby/seed-029 3.rb +19 -0
  521. package/dist/packages/crucible/seeds/ruby/seed-029.rb +19 -0
  522. package/dist/packages/crucible/seeds/ruby/seed-030 2.rb +20 -0
  523. package/dist/packages/crucible/seeds/ruby/seed-030 3.rb +20 -0
  524. package/dist/packages/crucible/seeds/ruby/seed-030.rb +20 -0
  525. package/dist/packages/crucible/seeds/ruby/seed-031 2.rb +17 -0
  526. package/dist/packages/crucible/seeds/ruby/seed-031 3.rb +17 -0
  527. package/dist/packages/crucible/seeds/ruby/seed-031.rb +17 -0
  528. package/dist/packages/crucible/seeds/ruby/seed-032 2.rb +22 -0
  529. package/dist/packages/crucible/seeds/ruby/seed-032 3.rb +22 -0
  530. package/dist/packages/crucible/seeds/ruby/seed-032.rb +22 -0
  531. package/dist/packages/crucible/seeds/ruby/seed-033 2.rb +18 -0
  532. package/dist/packages/crucible/seeds/ruby/seed-033 3.rb +18 -0
  533. package/dist/packages/crucible/seeds/ruby/seed-033.rb +18 -0
  534. package/dist/packages/crucible/seeds/ruby/seed-034 2.rb +19 -0
  535. package/dist/packages/crucible/seeds/ruby/seed-034 3.rb +19 -0
  536. package/dist/packages/crucible/seeds/ruby/seed-034.rb +19 -0
  537. package/dist/packages/crucible/seeds/ruby/seed-035 2.rb +19 -0
  538. package/dist/packages/crucible/seeds/ruby/seed-035 3.rb +19 -0
  539. package/dist/packages/crucible/seeds/ruby/seed-035.rb +19 -0
  540. package/dist/packages/crucible/seeds/ruby/seed-036 2.rb +18 -0
  541. package/dist/packages/crucible/seeds/ruby/seed-036 3.rb +18 -0
  542. package/dist/packages/crucible/seeds/ruby/seed-036.rb +18 -0
  543. package/dist/packages/crucible/seeds/ruby/seed-037 2.rb +21 -0
  544. package/dist/packages/crucible/seeds/ruby/seed-037 3.rb +21 -0
  545. package/dist/packages/crucible/seeds/ruby/seed-037.rb +21 -0
  546. package/dist/packages/crucible/seeds/ruby/seed-038 2.rb +24 -0
  547. package/dist/packages/crucible/seeds/ruby/seed-038 3.rb +24 -0
  548. package/dist/packages/crucible/seeds/ruby/seed-038.rb +24 -0
  549. package/dist/packages/crucible/seeds/ruby/seed-039 2.rb +24 -0
  550. package/dist/packages/crucible/seeds/ruby/seed-039 3.rb +24 -0
  551. package/dist/packages/crucible/seeds/ruby/seed-039.rb +24 -0
  552. package/dist/packages/crucible/seeds/ruby/seed-040 2.rb +22 -0
  553. package/dist/packages/crucible/seeds/ruby/seed-040 3.rb +22 -0
  554. package/dist/packages/crucible/seeds/ruby/seed-040.rb +22 -0
  555. package/dist/packages/crucible/seeds/ruby/seed-041 2.rb +23 -0
  556. package/dist/packages/crucible/seeds/ruby/seed-041 3.rb +23 -0
  557. package/dist/packages/crucible/seeds/ruby/seed-041.rb +23 -0
  558. package/dist/packages/crucible/seeds/ruby/seed-042 2.rb +25 -0
  559. package/dist/packages/crucible/seeds/ruby/seed-042 3.rb +25 -0
  560. package/dist/packages/crucible/seeds/ruby/seed-042.rb +25 -0
  561. package/dist/packages/crucible/seeds/ruby/seed-043 2.rb +23 -0
  562. package/dist/packages/crucible/seeds/ruby/seed-043 3.rb +23 -0
  563. package/dist/packages/crucible/seeds/ruby/seed-043.rb +23 -0
  564. package/dist/packages/crucible/seeds/ruby/seed-044 2.rb +16 -0
  565. package/dist/packages/crucible/seeds/ruby/seed-044 3.rb +16 -0
  566. package/dist/packages/crucible/seeds/ruby/seed-044.rb +16 -0
  567. package/dist/packages/crucible/seeds/ruby/seed-045 2.rb +22 -0
  568. package/dist/packages/crucible/seeds/ruby/seed-045 3.rb +22 -0
  569. package/dist/packages/crucible/seeds/ruby/seed-045.rb +22 -0
  570. package/dist/packages/crucible/seeds/ruby/seed-046 2.rb +27 -0
  571. package/dist/packages/crucible/seeds/ruby/seed-046 3.rb +27 -0
  572. package/dist/packages/crucible/seeds/ruby/seed-046.rb +27 -0
  573. package/dist/packages/crucible/seeds/ruby/seed-047 2.rb +26 -0
  574. package/dist/packages/crucible/seeds/ruby/seed-047 3.rb +26 -0
  575. package/dist/packages/crucible/seeds/ruby/seed-047.rb +26 -0
  576. package/dist/packages/crucible/seeds/ruby/seed-048 2.rb +24 -0
  577. package/dist/packages/crucible/seeds/ruby/seed-048 3.rb +24 -0
  578. package/dist/packages/crucible/seeds/ruby/seed-048.rb +24 -0
  579. package/dist/packages/crucible/seeds/ruby/seed-049 2.rb +20 -0
  580. package/dist/packages/crucible/seeds/ruby/seed-049 3.rb +20 -0
  581. package/dist/packages/crucible/seeds/ruby/seed-049.rb +20 -0
  582. package/dist/packages/crucible/seeds/ruby/seed-050 2.rb +27 -0
  583. package/dist/packages/crucible/seeds/ruby/seed-050 3.rb +27 -0
  584. package/dist/packages/crucible/seeds/ruby/seed-050.rb +27 -0
  585. package/dist/packages/crucible/seeds/rust/seed-001 2.rs +25 -0
  586. package/dist/packages/crucible/seeds/rust/seed-001 3.rs +25 -0
  587. package/dist/packages/crucible/seeds/rust/seed-001.rs +25 -0
  588. package/dist/packages/crucible/seeds/rust/seed-002 2.rs +20 -0
  589. package/dist/packages/crucible/seeds/rust/seed-002 3.rs +20 -0
  590. package/dist/packages/crucible/seeds/rust/seed-002.rs +20 -0
  591. package/dist/packages/crucible/seeds/rust/seed-003 2.rs +23 -0
  592. package/dist/packages/crucible/seeds/rust/seed-003 3.rs +23 -0
  593. package/dist/packages/crucible/seeds/rust/seed-003.rs +23 -0
  594. package/dist/packages/crucible/seeds/rust/seed-004 2.rs +21 -0
  595. package/dist/packages/crucible/seeds/rust/seed-004 3.rs +21 -0
  596. package/dist/packages/crucible/seeds/rust/seed-004.rs +21 -0
  597. package/dist/packages/crucible/seeds/rust/seed-005 2.rs +21 -0
  598. package/dist/packages/crucible/seeds/rust/seed-005 3.rs +21 -0
  599. package/dist/packages/crucible/seeds/rust/seed-005.rs +21 -0
  600. package/dist/packages/crucible/seeds/rust/seed-006 2.rs +24 -0
  601. package/dist/packages/crucible/seeds/rust/seed-006 3.rs +24 -0
  602. package/dist/packages/crucible/seeds/rust/seed-006.rs +24 -0
  603. package/dist/packages/crucible/seeds/rust/seed-007 2.rs +20 -0
  604. package/dist/packages/crucible/seeds/rust/seed-007 3.rs +20 -0
  605. package/dist/packages/crucible/seeds/rust/seed-007.rs +20 -0
  606. package/dist/packages/crucible/seeds/rust/seed-008 2.rs +19 -0
  607. package/dist/packages/crucible/seeds/rust/seed-008 3.rs +19 -0
  608. package/dist/packages/crucible/seeds/rust/seed-008.rs +19 -0
  609. package/dist/packages/crucible/seeds/rust/seed-009 2.rs +28 -0
  610. package/dist/packages/crucible/seeds/rust/seed-009 3.rs +28 -0
  611. package/dist/packages/crucible/seeds/rust/seed-009.rs +28 -0
  612. package/dist/packages/crucible/seeds/rust/seed-010 2.rs +28 -0
  613. package/dist/packages/crucible/seeds/rust/seed-010 3.rs +28 -0
  614. package/dist/packages/crucible/seeds/rust/seed-010.rs +28 -0
  615. package/dist/packages/crucible/seeds/rust/seed-011 2.rs +25 -0
  616. package/dist/packages/crucible/seeds/rust/seed-011 3.rs +25 -0
  617. package/dist/packages/crucible/seeds/rust/seed-011.rs +25 -0
  618. package/dist/packages/crucible/seeds/rust/seed-012 2.rs +31 -0
  619. package/dist/packages/crucible/seeds/rust/seed-012 3.rs +31 -0
  620. package/dist/packages/crucible/seeds/rust/seed-012.rs +31 -0
  621. package/dist/packages/crucible/seeds/rust/seed-013 2.rs +27 -0
  622. package/dist/packages/crucible/seeds/rust/seed-013 3.rs +27 -0
  623. package/dist/packages/crucible/seeds/rust/seed-013.rs +27 -0
  624. package/dist/packages/crucible/seeds/rust/seed-014 2.rs +30 -0
  625. package/dist/packages/crucible/seeds/rust/seed-014 3.rs +30 -0
  626. package/dist/packages/crucible/seeds/rust/seed-014.rs +30 -0
  627. package/dist/packages/crucible/seeds/rust/seed-015 2.rs +33 -0
  628. package/dist/packages/crucible/seeds/rust/seed-015 3.rs +33 -0
  629. package/dist/packages/crucible/seeds/rust/seed-015.rs +33 -0
  630. package/dist/packages/crucible/seeds/rust/seed-016 2.rs +22 -0
  631. package/dist/packages/crucible/seeds/rust/seed-016 3.rs +22 -0
  632. package/dist/packages/crucible/seeds/rust/seed-016.rs +22 -0
  633. package/dist/packages/crucible/seeds/rust/seed-017 2.rs +28 -0
  634. package/dist/packages/crucible/seeds/rust/seed-017 3.rs +28 -0
  635. package/dist/packages/crucible/seeds/rust/seed-017.rs +28 -0
  636. package/dist/packages/crucible/seeds/rust/seed-018 2.rs +21 -0
  637. package/dist/packages/crucible/seeds/rust/seed-018 3.rs +21 -0
  638. package/dist/packages/crucible/seeds/rust/seed-018.rs +21 -0
  639. package/dist/packages/crucible/seeds/rust/seed-019 2.rs +36 -0
  640. package/dist/packages/crucible/seeds/rust/seed-019 3.rs +36 -0
  641. package/dist/packages/crucible/seeds/rust/seed-019.rs +36 -0
  642. package/dist/packages/crucible/seeds/rust/seed-020 2.rs +27 -0
  643. package/dist/packages/crucible/seeds/rust/seed-020 3.rs +27 -0
  644. package/dist/packages/crucible/seeds/rust/seed-020.rs +27 -0
  645. package/dist/packages/crucible/seeds/rust/seed-021 2.rs +26 -0
  646. package/dist/packages/crucible/seeds/rust/seed-021 3.rs +26 -0
  647. package/dist/packages/crucible/seeds/rust/seed-021.rs +26 -0
  648. package/dist/packages/crucible/seeds/rust/seed-022 2.rs +23 -0
  649. package/dist/packages/crucible/seeds/rust/seed-022 3.rs +23 -0
  650. package/dist/packages/crucible/seeds/rust/seed-022.rs +23 -0
  651. package/dist/packages/crucible/seeds/rust/seed-023 2.rs +22 -0
  652. package/dist/packages/crucible/seeds/rust/seed-023 3.rs +22 -0
  653. package/dist/packages/crucible/seeds/rust/seed-023.rs +22 -0
  654. package/dist/packages/crucible/seeds/rust/seed-024 2.rs +24 -0
  655. package/dist/packages/crucible/seeds/rust/seed-024 3.rs +24 -0
  656. package/dist/packages/crucible/seeds/rust/seed-024.rs +24 -0
  657. package/dist/packages/crucible/seeds/rust/seed-025 2.rs +29 -0
  658. package/dist/packages/crucible/seeds/rust/seed-025 3.rs +29 -0
  659. package/dist/packages/crucible/seeds/rust/seed-025.rs +29 -0
  660. package/dist/packages/crucible/seeds/rust/seed-026 2.rs +23 -0
  661. package/dist/packages/crucible/seeds/rust/seed-026 3.rs +23 -0
  662. package/dist/packages/crucible/seeds/rust/seed-026.rs +23 -0
  663. package/dist/packages/crucible/seeds/rust/seed-027 2.rs +24 -0
  664. package/dist/packages/crucible/seeds/rust/seed-027 3.rs +24 -0
  665. package/dist/packages/crucible/seeds/rust/seed-027.rs +24 -0
  666. package/dist/packages/crucible/seeds/rust/seed-028 2.rs +25 -0
  667. package/dist/packages/crucible/seeds/rust/seed-028 3.rs +25 -0
  668. package/dist/packages/crucible/seeds/rust/seed-028.rs +25 -0
  669. package/dist/packages/crucible/seeds/rust/seed-029 2.rs +25 -0
  670. package/dist/packages/crucible/seeds/rust/seed-029 3.rs +25 -0
  671. package/dist/packages/crucible/seeds/rust/seed-029.rs +25 -0
  672. package/dist/packages/crucible/seeds/rust/seed-030 2.rs +30 -0
  673. package/dist/packages/crucible/seeds/rust/seed-030 3.rs +30 -0
  674. package/dist/packages/crucible/seeds/rust/seed-030.rs +30 -0
  675. package/dist/packages/crucible/seeds/rust/seed-031 2.rs +22 -0
  676. package/dist/packages/crucible/seeds/rust/seed-031 3.rs +22 -0
  677. package/dist/packages/crucible/seeds/rust/seed-031.rs +22 -0
  678. package/dist/packages/crucible/seeds/rust/seed-032 2.rs +25 -0
  679. package/dist/packages/crucible/seeds/rust/seed-032 3.rs +25 -0
  680. package/dist/packages/crucible/seeds/rust/seed-032.rs +25 -0
  681. package/dist/packages/crucible/seeds/rust/seed-033 2.rs +25 -0
  682. package/dist/packages/crucible/seeds/rust/seed-033 3.rs +25 -0
  683. package/dist/packages/crucible/seeds/rust/seed-033.rs +25 -0
  684. package/dist/packages/crucible/seeds/rust/seed-034 2.rs +20 -0
  685. package/dist/packages/crucible/seeds/rust/seed-034 3.rs +20 -0
  686. package/dist/packages/crucible/seeds/rust/seed-034.rs +20 -0
  687. package/dist/packages/crucible/seeds/rust/seed-035 2.rs +28 -0
  688. package/dist/packages/crucible/seeds/rust/seed-035 3.rs +28 -0
  689. package/dist/packages/crucible/seeds/rust/seed-035.rs +28 -0
  690. package/dist/packages/crucible/seeds/rust/seed-036 2.rs +26 -0
  691. package/dist/packages/crucible/seeds/rust/seed-036 3.rs +26 -0
  692. package/dist/packages/crucible/seeds/rust/seed-036.rs +26 -0
  693. package/dist/packages/crucible/seeds/rust/seed-037 2.rs +31 -0
  694. package/dist/packages/crucible/seeds/rust/seed-037 3.rs +31 -0
  695. package/dist/packages/crucible/seeds/rust/seed-037.rs +31 -0
  696. package/dist/packages/crucible/seeds/rust/seed-038 2.rs +25 -0
  697. package/dist/packages/crucible/seeds/rust/seed-038 3.rs +25 -0
  698. package/dist/packages/crucible/seeds/rust/seed-038.rs +25 -0
  699. package/dist/packages/crucible/seeds/rust/seed-039 2.rs +28 -0
  700. package/dist/packages/crucible/seeds/rust/seed-039 3.rs +28 -0
  701. package/dist/packages/crucible/seeds/rust/seed-039.rs +28 -0
  702. package/dist/packages/crucible/seeds/rust/seed-040 2.rs +27 -0
  703. package/dist/packages/crucible/seeds/rust/seed-040 3.rs +27 -0
  704. package/dist/packages/crucible/seeds/rust/seed-040.rs +27 -0
  705. package/dist/packages/crucible/seeds/rust/seed-041 2.rs +32 -0
  706. package/dist/packages/crucible/seeds/rust/seed-041 3.rs +32 -0
  707. package/dist/packages/crucible/seeds/rust/seed-041.rs +32 -0
  708. package/dist/packages/crucible/seeds/rust/seed-042 2.rs +27 -0
  709. package/dist/packages/crucible/seeds/rust/seed-042 3.rs +27 -0
  710. package/dist/packages/crucible/seeds/rust/seed-042.rs +27 -0
  711. package/dist/packages/crucible/seeds/rust/seed-043 2.rs +29 -0
  712. package/dist/packages/crucible/seeds/rust/seed-043 3.rs +29 -0
  713. package/dist/packages/crucible/seeds/rust/seed-043.rs +29 -0
  714. package/dist/packages/crucible/seeds/rust/seed-044 2.rs +25 -0
  715. package/dist/packages/crucible/seeds/rust/seed-044 3.rs +25 -0
  716. package/dist/packages/crucible/seeds/rust/seed-044.rs +25 -0
  717. package/dist/packages/crucible/seeds/rust/seed-045 2.rs +28 -0
  718. package/dist/packages/crucible/seeds/rust/seed-045 3.rs +28 -0
  719. package/dist/packages/crucible/seeds/rust/seed-045.rs +28 -0
  720. package/dist/packages/crucible/seeds/rust/seed-046 2.rs +25 -0
  721. package/dist/packages/crucible/seeds/rust/seed-046 3.rs +25 -0
  722. package/dist/packages/crucible/seeds/rust/seed-046.rs +25 -0
  723. package/dist/packages/crucible/seeds/rust/seed-047 2.rs +34 -0
  724. package/dist/packages/crucible/seeds/rust/seed-047 3.rs +34 -0
  725. package/dist/packages/crucible/seeds/rust/seed-047.rs +34 -0
  726. package/dist/packages/crucible/seeds/rust/seed-048 2.rs +21 -0
  727. package/dist/packages/crucible/seeds/rust/seed-048 3.rs +21 -0
  728. package/dist/packages/crucible/seeds/rust/seed-048.rs +21 -0
  729. package/dist/packages/crucible/seeds/rust/seed-049 2.rs +26 -0
  730. package/dist/packages/crucible/seeds/rust/seed-049 3.rs +26 -0
  731. package/dist/packages/crucible/seeds/rust/seed-049.rs +26 -0
  732. package/dist/packages/crucible/seeds/rust/seed-050 2.rs +23 -0
  733. package/dist/packages/crucible/seeds/rust/seed-050 3.rs +23 -0
  734. package/dist/packages/crucible/seeds/rust/seed-050.rs +23 -0
  735. package/dist/packages/crucible/seeds/ts/seed-001 2.ts +32 -0
  736. package/dist/packages/crucible/seeds/ts/seed-001 3.ts +32 -0
  737. package/dist/packages/crucible/seeds/ts/seed-001.ts +32 -0
  738. package/dist/packages/crucible/seeds/ts/seed-002 2.ts +34 -0
  739. package/dist/packages/crucible/seeds/ts/seed-002 3.ts +34 -0
  740. package/dist/packages/crucible/seeds/ts/seed-002.ts +34 -0
  741. package/dist/packages/crucible/seeds/ts/seed-003 2.ts +28 -0
  742. package/dist/packages/crucible/seeds/ts/seed-003 3.ts +28 -0
  743. package/dist/packages/crucible/seeds/ts/seed-003.ts +28 -0
  744. package/dist/packages/crucible/seeds/ts/seed-004 2.ts +34 -0
  745. package/dist/packages/crucible/seeds/ts/seed-004 3.ts +34 -0
  746. package/dist/packages/crucible/seeds/ts/seed-004.ts +34 -0
  747. package/dist/packages/crucible/seeds/ts/seed-005 2.ts +32 -0
  748. package/dist/packages/crucible/seeds/ts/seed-005 3.ts +32 -0
  749. package/dist/packages/crucible/seeds/ts/seed-005.ts +32 -0
  750. package/dist/packages/crucible/seeds/ts/seed-006 2.ts +31 -0
  751. package/dist/packages/crucible/seeds/ts/seed-006 3.ts +31 -0
  752. package/dist/packages/crucible/seeds/ts/seed-006.ts +31 -0
  753. package/dist/packages/crucible/seeds/ts/seed-007 2.ts +28 -0
  754. package/dist/packages/crucible/seeds/ts/seed-007 3.ts +28 -0
  755. package/dist/packages/crucible/seeds/ts/seed-007.ts +28 -0
  756. package/dist/packages/crucible/seeds/ts/seed-008 2.ts +40 -0
  757. package/dist/packages/crucible/seeds/ts/seed-008 3.ts +40 -0
  758. package/dist/packages/crucible/seeds/ts/seed-008.ts +40 -0
  759. package/dist/packages/crucible/seeds/ts/seed-009 2.ts +31 -0
  760. package/dist/packages/crucible/seeds/ts/seed-009 3.ts +31 -0
  761. package/dist/packages/crucible/seeds/ts/seed-009.ts +31 -0
  762. package/dist/packages/crucible/seeds/ts/seed-010 2.ts +33 -0
  763. package/dist/packages/crucible/seeds/ts/seed-010 3.ts +33 -0
  764. package/dist/packages/crucible/seeds/ts/seed-010.ts +33 -0
  765. package/dist/packages/crucible/seeds/ts/seed-011 2.ts +29 -0
  766. package/dist/packages/crucible/seeds/ts/seed-011 3.ts +29 -0
  767. package/dist/packages/crucible/seeds/ts/seed-011.ts +29 -0
  768. package/dist/packages/crucible/seeds/ts/seed-012 2.ts +34 -0
  769. package/dist/packages/crucible/seeds/ts/seed-012 3.ts +34 -0
  770. package/dist/packages/crucible/seeds/ts/seed-012.ts +34 -0
  771. package/dist/packages/crucible/seeds/ts/seed-013 2.ts +31 -0
  772. package/dist/packages/crucible/seeds/ts/seed-013 3.ts +31 -0
  773. package/dist/packages/crucible/seeds/ts/seed-013.ts +31 -0
  774. package/dist/packages/crucible/seeds/ts/seed-014 2.ts +36 -0
  775. package/dist/packages/crucible/seeds/ts/seed-014 3.ts +36 -0
  776. package/dist/packages/crucible/seeds/ts/seed-014.ts +36 -0
  777. package/dist/packages/crucible/seeds/ts/seed-015 2.ts +31 -0
  778. package/dist/packages/crucible/seeds/ts/seed-015 3.ts +31 -0
  779. package/dist/packages/crucible/seeds/ts/seed-015.ts +31 -0
  780. package/dist/packages/crucible/seeds/ts/seed-016 2.ts +37 -0
  781. package/dist/packages/crucible/seeds/ts/seed-016 3.ts +37 -0
  782. package/dist/packages/crucible/seeds/ts/seed-016.ts +37 -0
  783. package/dist/packages/crucible/seeds/ts/seed-017 2.ts +44 -0
  784. package/dist/packages/crucible/seeds/ts/seed-017 3.ts +44 -0
  785. package/dist/packages/crucible/seeds/ts/seed-017.ts +44 -0
  786. package/dist/packages/crucible/seeds/ts/seed-018 2.ts +33 -0
  787. package/dist/packages/crucible/seeds/ts/seed-018 3.ts +33 -0
  788. package/dist/packages/crucible/seeds/ts/seed-018.ts +33 -0
  789. package/dist/packages/crucible/seeds/ts/seed-019 2.ts +32 -0
  790. package/dist/packages/crucible/seeds/ts/seed-019 3.ts +32 -0
  791. package/dist/packages/crucible/seeds/ts/seed-019.ts +32 -0
  792. package/dist/packages/crucible/seeds/ts/seed-020 2.ts +33 -0
  793. package/dist/packages/crucible/seeds/ts/seed-020 3.ts +33 -0
  794. package/dist/packages/crucible/seeds/ts/seed-020.ts +33 -0
  795. package/dist/packages/crucible/seeds/ts/seed-021 2.ts +33 -0
  796. package/dist/packages/crucible/seeds/ts/seed-021 3.ts +33 -0
  797. package/dist/packages/crucible/seeds/ts/seed-021.ts +33 -0
  798. package/dist/packages/crucible/seeds/ts/seed-022 2.ts +34 -0
  799. package/dist/packages/crucible/seeds/ts/seed-022 3.ts +34 -0
  800. package/dist/packages/crucible/seeds/ts/seed-022.ts +34 -0
  801. package/dist/packages/crucible/seeds/ts/seed-023 2.ts +33 -0
  802. package/dist/packages/crucible/seeds/ts/seed-023 3.ts +33 -0
  803. package/dist/packages/crucible/seeds/ts/seed-023.ts +33 -0
  804. package/dist/packages/crucible/seeds/ts/seed-024 2.ts +35 -0
  805. package/dist/packages/crucible/seeds/ts/seed-024 3.ts +35 -0
  806. package/dist/packages/crucible/seeds/ts/seed-024.ts +35 -0
  807. package/dist/packages/crucible/seeds/ts/seed-025 2.ts +29 -0
  808. package/dist/packages/crucible/seeds/ts/seed-025 3.ts +29 -0
  809. package/dist/packages/crucible/seeds/ts/seed-025.ts +29 -0
  810. package/dist/packages/crucible/seeds/ts/seed-026 2.ts +36 -0
  811. package/dist/packages/crucible/seeds/ts/seed-026 3.ts +36 -0
  812. package/dist/packages/crucible/seeds/ts/seed-026.ts +36 -0
  813. package/dist/packages/crucible/seeds/ts/seed-027 2.ts +30 -0
  814. package/dist/packages/crucible/seeds/ts/seed-027 3.ts +30 -0
  815. package/dist/packages/crucible/seeds/ts/seed-027.ts +30 -0
  816. package/dist/packages/crucible/seeds/ts/seed-028 2.ts +32 -0
  817. package/dist/packages/crucible/seeds/ts/seed-028 3.ts +32 -0
  818. package/dist/packages/crucible/seeds/ts/seed-028.ts +32 -0
  819. package/dist/packages/crucible/seeds/ts/seed-029 2.ts +34 -0
  820. package/dist/packages/crucible/seeds/ts/seed-029 3.ts +34 -0
  821. package/dist/packages/crucible/seeds/ts/seed-029.ts +34 -0
  822. package/dist/packages/crucible/seeds/ts/seed-030 2.ts +37 -0
  823. package/dist/packages/crucible/seeds/ts/seed-030 3.ts +37 -0
  824. package/dist/packages/crucible/seeds/ts/seed-030.ts +37 -0
  825. package/dist/packages/crucible/seeds/ts/seed-031 2.ts +31 -0
  826. package/dist/packages/crucible/seeds/ts/seed-031 3.ts +31 -0
  827. package/dist/packages/crucible/seeds/ts/seed-031.ts +31 -0
  828. package/dist/packages/crucible/seeds/ts/seed-032 2.ts +32 -0
  829. package/dist/packages/crucible/seeds/ts/seed-032 3.ts +32 -0
  830. package/dist/packages/crucible/seeds/ts/seed-032.ts +32 -0
  831. package/dist/packages/crucible/seeds/ts/seed-033 2.ts +32 -0
  832. package/dist/packages/crucible/seeds/ts/seed-033 3.ts +32 -0
  833. package/dist/packages/crucible/seeds/ts/seed-033.ts +32 -0
  834. package/dist/packages/crucible/seeds/ts/seed-034 2.ts +34 -0
  835. package/dist/packages/crucible/seeds/ts/seed-034 3.ts +34 -0
  836. package/dist/packages/crucible/seeds/ts/seed-034.ts +34 -0
  837. package/dist/packages/crucible/seeds/ts/seed-035 2.ts +29 -0
  838. package/dist/packages/crucible/seeds/ts/seed-035 3.ts +29 -0
  839. package/dist/packages/crucible/seeds/ts/seed-035.ts +29 -0
  840. package/dist/packages/crucible/seeds/ts/seed-036 2.ts +34 -0
  841. package/dist/packages/crucible/seeds/ts/seed-036 3.ts +34 -0
  842. package/dist/packages/crucible/seeds/ts/seed-036.ts +34 -0
  843. package/dist/packages/crucible/seeds/ts/seed-037 2.ts +33 -0
  844. package/dist/packages/crucible/seeds/ts/seed-037 3.ts +33 -0
  845. package/dist/packages/crucible/seeds/ts/seed-037.ts +33 -0
  846. package/dist/packages/crucible/seeds/ts/seed-038 2.ts +29 -0
  847. package/dist/packages/crucible/seeds/ts/seed-038 3.ts +29 -0
  848. package/dist/packages/crucible/seeds/ts/seed-038.ts +29 -0
  849. package/dist/packages/crucible/seeds/ts/seed-039 2.ts +35 -0
  850. package/dist/packages/crucible/seeds/ts/seed-039 3.ts +35 -0
  851. package/dist/packages/crucible/seeds/ts/seed-039.ts +35 -0
  852. package/dist/packages/crucible/seeds/ts/seed-040 2.ts +31 -0
  853. package/dist/packages/crucible/seeds/ts/seed-040 3.ts +31 -0
  854. package/dist/packages/crucible/seeds/ts/seed-040.ts +31 -0
  855. package/dist/packages/crucible/seeds/ts/seed-041 2.ts +29 -0
  856. package/dist/packages/crucible/seeds/ts/seed-041 3.ts +29 -0
  857. package/dist/packages/crucible/seeds/ts/seed-041.ts +29 -0
  858. package/dist/packages/crucible/seeds/ts/seed-042 2.ts +33 -0
  859. package/dist/packages/crucible/seeds/ts/seed-042 3.ts +33 -0
  860. package/dist/packages/crucible/seeds/ts/seed-042.ts +33 -0
  861. package/dist/packages/crucible/seeds/ts/seed-043 2.ts +32 -0
  862. package/dist/packages/crucible/seeds/ts/seed-043 3.ts +32 -0
  863. package/dist/packages/crucible/seeds/ts/seed-043.ts +32 -0
  864. package/dist/packages/crucible/seeds/ts/seed-044 2.ts +36 -0
  865. package/dist/packages/crucible/seeds/ts/seed-044 3.ts +36 -0
  866. package/dist/packages/crucible/seeds/ts/seed-044.ts +36 -0
  867. package/dist/packages/crucible/seeds/ts/seed-045 2.ts +39 -0
  868. package/dist/packages/crucible/seeds/ts/seed-045 3.ts +39 -0
  869. package/dist/packages/crucible/seeds/ts/seed-045.ts +39 -0
  870. package/dist/packages/crucible/seeds/ts/seed-046 2.ts +41 -0
  871. package/dist/packages/crucible/seeds/ts/seed-046 3.ts +41 -0
  872. package/dist/packages/crucible/seeds/ts/seed-046.ts +41 -0
  873. package/dist/packages/crucible/seeds/ts/seed-047 2.ts +33 -0
  874. package/dist/packages/crucible/seeds/ts/seed-047 3.ts +33 -0
  875. package/dist/packages/crucible/seeds/ts/seed-047.ts +33 -0
  876. package/dist/packages/crucible/seeds/ts/seed-048 2.ts +33 -0
  877. package/dist/packages/crucible/seeds/ts/seed-048 3.ts +33 -0
  878. package/dist/packages/crucible/seeds/ts/seed-048.ts +33 -0
  879. package/dist/packages/crucible/seeds/ts/seed-049 2.ts +34 -0
  880. package/dist/packages/crucible/seeds/ts/seed-049 3.ts +34 -0
  881. package/dist/packages/crucible/seeds/ts/seed-049.ts +34 -0
  882. package/dist/packages/crucible/seeds/ts/seed-050 2.ts +41 -0
  883. package/dist/packages/crucible/seeds/ts/seed-050 3.ts +41 -0
  884. package/dist/packages/crucible/seeds/ts/seed-050.ts +41 -0
  885. package/dist/packages/crucible/seeds/ts/seed-051 2.ts +34 -0
  886. package/dist/packages/crucible/seeds/ts/seed-051 3.ts +34 -0
  887. package/dist/packages/crucible/seeds/ts/seed-051.ts +34 -0
  888. package/dist/packages/crucible/seeds/ts/seed-052 2.ts +36 -0
  889. package/dist/packages/crucible/seeds/ts/seed-052 3.ts +36 -0
  890. package/dist/packages/crucible/seeds/ts/seed-052.ts +36 -0
  891. package/dist/packages/crucible/self-attack.js +1 -0
  892. package/dist/packages/scanner/ai-confidence-scorer.js +1 -0
  893. package/dist/packages/scanner/alert-manager.js +1 -0
  894. package/dist/packages/scanner/ast-analyzer.js +1 -0
  895. package/dist/packages/scanner/baseline-manager.js +1 -0
  896. package/dist/packages/scanner/cfg-analyzer.js +1 -0
  897. package/dist/packages/scanner/code-scanner.js +1 -0
  898. package/dist/packages/scanner/codebase-passport.js +1 -0
  899. package/dist/packages/scanner/copy-paste-detector.js +1 -0
  900. package/dist/packages/scanner/dependency-graph.js +1 -0
  901. package/dist/packages/scanner/drift-detector.js +1 -0
  902. package/dist/packages/scanner/executive-report.js +1 -0
  903. package/dist/packages/scanner/export-verifier.js +1 -0
  904. package/dist/packages/scanner/file-collector.js +1 -0
  905. package/dist/packages/scanner/file-watcher.js +1 -0
  906. package/dist/packages/scanner/ghost-code-detector.js +1 -0
  907. package/dist/packages/scanner/go-ast-analyzer.js +1 -0
  908. package/dist/packages/scanner/hallucination-detector.js +1 -0
  909. package/dist/packages/scanner/health-checker.js +1 -0
  910. package/dist/packages/scanner/html-report.js +1 -0
  911. package/dist/packages/scanner/index.js +1 -0
  912. package/dist/packages/scanner/license-manager.js +1 -0
  913. package/dist/packages/scanner/master-health-checker.js +1 -0
  914. package/dist/packages/scanner/monitor-notifier.js +1 -0
  915. package/dist/packages/scanner/monitor-service.js +1 -0
  916. package/dist/packages/scanner/monitor-store.js +1 -0
  917. package/dist/packages/scanner/pre-commit-gate.js +1 -0
  918. package/dist/packages/scanner/python-ast-analyzer.js +1 -0
  919. package/dist/packages/scanner/scan-diff.js +1 -0
  920. package/dist/packages/scanner/scan-runner.js +1 -0
  921. package/dist/packages/scanner/secret-scanner.js +1 -0
  922. package/dist/packages/scanner/sentinel-core.js +1 -0
  923. package/dist/packages/scanner/sentinel-knowledge.js +1 -0
  924. package/dist/packages/scanner/taint-tracker.js +1 -0
  925. package/dist/packages/scanner/tech-debt-analyzer.js +1 -0
  926. package/dist/packages/scanner/tech-debt-cost.js +1 -0
  927. package/dist/packages/scanner/widget-generator.js +1 -0
  928. package/package.json +15 -7
  929. package/cli.js +0 -2627
  930. package/packages/scanner/ai-confidence-scorer.js +0 -260
  931. package/packages/scanner/alert-manager.js +0 -398
  932. package/packages/scanner/baseline-manager.js +0 -109
  933. package/packages/scanner/code-scanner.js +0 -758
  934. package/packages/scanner/codebase-passport.js +0 -299
  935. package/packages/scanner/copy-paste-detector.js +0 -276
  936. package/packages/scanner/dependency-graph.js +0 -541
  937. package/packages/scanner/drift-detector.js +0 -423
  938. package/packages/scanner/executive-report.js +0 -774
  939. package/packages/scanner/file-collector.js +0 -64
  940. package/packages/scanner/file-watcher.js +0 -323
  941. package/packages/scanner/ghost-code-detector.js +0 -301
  942. package/packages/scanner/hallucination-detector.js +0 -822
  943. package/packages/scanner/health-checker.js +0 -586
  944. package/packages/scanner/html-report.js +0 -634
  945. package/packages/scanner/index.js +0 -100
  946. package/packages/scanner/license-manager.js +0 -331
  947. package/packages/scanner/master-health-checker.js +0 -513
  948. package/packages/scanner/monitor-notifier.js +0 -64
  949. package/packages/scanner/monitor-service.js +0 -103
  950. package/packages/scanner/monitor-store.js +0 -117
  951. package/packages/scanner/pre-commit-gate.js +0 -216
  952. package/packages/scanner/scan-diff.js +0 -50
  953. package/packages/scanner/scan-runner.js +0 -172
  954. package/packages/scanner/secret-scanner.js +0 -612
  955. package/packages/scanner/secret-scanner.test.js +0 -103
  956. package/packages/scanner/sentinel-core.js +0 -616
  957. package/packages/scanner/sentinel-knowledge.js +0 -322
  958. package/packages/scanner/tech-debt-analyzer.js +0 -583
  959. package/packages/scanner/tech-debt-cost.js +0 -194
  960. package/packages/scanner/widget-generator.js +0 -415
@@ -0,0 +1 @@
1
+ "use strict";const fs=require("fs"),path=require("path"),RULES_DIR=path.join(__dirname,"rules"),COMMUNITY_FILENAME="community-discovered.json",COMMUNITY_FILE=path.join(RULES_DIR,COMMUNITY_FILENAME),MISSED_PATTERNS_FILE=path.join(__dirname,"missed-patterns.json"),MAX_PATTERN_LENGTH=500,MAX_QUANTIFIERS=20,MAX_ALTERNATIONS=30;class PatternLearner{constructor(e={}){this.rulesDir=e.rulesDir||RULES_DIR,this.communityFile=e.communityFile||path.join(this.rulesDir,COMMUNITY_FILENAME),this.missedPatternsFile=e.missedPatternsFile||MISSED_PATTERNS_FILE}_readJsonArray(e){if(!fs.existsSync(e))return[];try{const t=JSON.parse(fs.readFileSync(e,"utf-8"));if(!Array.isArray(t))return[];for(const e of t)e&&"object"==typeof e&&(delete e.__proto__,delete e.constructor,delete e.prototype);return t}catch{return[]}}_writeJsonArray(e,t){fs.mkdirSync(path.dirname(e),{recursive:!0}),fs.writeFileSync(e,JSON.stringify(t,null,2)+"\n","utf-8")}_invalidateRuleCache(){try{delete require.cache[require.resolve("./rule-loader.js")]}catch{}}_nextId(e,t){if(!/^[A-Z]+$/.test(t))throw new Error(`[PatternLearner] _nextId prefix must be uppercase alpha, got: "${t}"`);let r=0;const n=new RegExp(`^${t}(\\d+)$`);for(const t of e){const e=n.exec(t.id||"");e&&(r=Math.max(r,parseInt(e[1],10)))}return t+String(r+1).padStart("MISS"===t?4:3,"0")}_deriveTrigger(e){if(!e||"string"!=typeof e)return null;const t=e.split("\n").map(e=>e.trim()).filter(Boolean).find(e=>!e.startsWith("//")&&!e.startsWith("#")&&!e.startsWith("*")&&!e.startsWith("/*")&&!/^(import|from|using|package|require|namespace)\b/.test(e)&&e.length>=8&&e.length<=240);if(!t)return null;const r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return this._checkRegexComplexity(r).safe?r:null}_checkRegexComplexity(e){if("string"!=typeof e||!e)return{safe:!1,reason:"pattern must be a non-empty string"};if(e.length>500)return{safe:!1,reason:"pattern exceeds max length of 500 characters"};let t=0,r=0;const n=[];for(let s=0;s<e.length;s++){const i=e[s];if("\\"!==i)if("("!==i){if(")"===i){const r=n.pop();if(!r)continue;const i=/^\{\d+(,\d*)?\}/.exec(e.slice(s+1)),a=e[s+1];if("+"===a||"*"===a||"?"===a||i){if(t++,r.hasQuantifier||r.hasAlternation)return{safe:!1,reason:"nested quantifier detected (potential catastrophic backtracking)"};n.length>0&&(n[n.length-1].hasQuantifier=!0)}continue}if("+"!==i&&"*"!==i&&"?"!==i){if("{"===i){/^\{\d+(,\d*)?\}/.exec(e.slice(s))&&(t++,n.length>0&&(n[n.length-1].hasQuantifier=!0));continue}"|"!==i||(r++,n.length>0&&(n[n.length-1].hasAlternation=!0))}else t++,n.length>0&&(n[n.length-1].hasQuantifier=!0)}else n.push({hasQuantifier:!1,hasAlternation:!1});else s++}return t>20?{safe:!1,reason:`pattern has ${t} quantifiers, exceeding max of 20`}:r>30?{safe:!1,reason:`pattern has ${r} alternations, exceeding max of 30`}:{safe:!0,reason:null}}patternExists(e,t){if(!fs.existsSync(this.rulesDir))return!1;const r=fs.readdirSync(this.rulesDir).filter(e=>e.endsWith(".json"));for(const n of r){const r=this._readJsonArray(path.join(this.rulesDir,n));for(const n of r)if(null==e){if(n.category===t)return!0}else if(n.pattern===e&&n.category===t)return!0}return!1}categoryCovered(e){return this.patternExists(null,e)}recordNewPattern(e={}){const{pattern:t,flags:r="gi",category:n,description:s,language:i=[],severity:a="medium",source:o}=e;if(!t||!n)throw new Error('[PatternLearner] recordNewPattern requires "pattern" and "category"');new RegExp(t,r);const d=this._checkRegexComplexity(t);if(!d.safe)throw new Error(`[PatternLearner] recordNewPattern rejected unsafe pattern: ${d.reason}`);if(this.patternExists(t,n))return{added:!1,reason:"duplicate",id:null};const c=this._readJsonArray(this.communityFile),u=this._nextId(c,"COMM"),l={id:u,pattern:t,flags:r,category:n,description:s||`Community-discovered pattern for "${n}"`,language:i,severity:a,discoveredAt:(new Date).toISOString(),source:o||"crucible-run"};return c.push(l),this._writeJsonArray(this.communityFile,c),this._invalidateRuleCache(),{added:!0,reason:null,id:u,entry:l}}recordDiscoveredIfUncovered(e={}){const{category:t,language:r,content:n,severity:s,seedId:i}=e;if(!t)return{added:!1,reason:"no-category"};if(this.categoryCovered(t))return{added:!1,reason:"already-covered"};const a=this._deriveTrigger(n);return a?this.recordNewPattern({pattern:a,flags:"gi",category:t,description:`Auto-discovered pattern for previously-uncovered category "${t}"`+(i?` (seed ${i})`:""),language:r?[r]:[],severity:s||"medium",source:`crucible-auto-discovery:${i||"unknown"}`}):{added:!1,reason:"no-derivable-trigger"}}recordMissedPattern(e={}){const{seedId:t,content:r,expectedCategory:n,language:s,scannerOutput:i,severity:a="medium",meta:o={}}=e;if(!n)throw new Error('[PatternLearner] recordMissedPattern requires "expectedCategory"');const d=this._readJsonArray(this.missedPatternsFile),c=`${t||""}|${n}|${s||""}`,u=d.find(e=>`${e.seedId||""}|${e.expectedCategory}|${e.language||""}`===c);if(u)return u.timesSeen=(u.timesSeen||1)+1,u.lastSeenAt=(new Date).toISOString(),this._writeJsonArray(this.missedPatternsFile,d),{added:!1,reason:"duplicate-updated",entry:u};const l={id:this._nextId(d,"MISS"),seedId:t||null,expectedCategory:n,language:s||null,severity:a,content:r||null,scannerOutput:i||null,status:"pending",discoveredAt:(new Date).toISOString(),timesSeen:1,meta:o};return d.push(l),this._writeJsonArray(this.missedPatternsFile,d),{added:!0,reason:null,entry:l}}getMissedPatterns(e={}){const t=this._readJsonArray(this.missedPatternsFile);return e.status?t.filter(t=>t.status===e.status):t}reviewMissedPattern(e,t){if("confirmed"!==t&&"rejected"!==t)throw new Error('[PatternLearner] decision must be "confirmed" or "rejected"');const r=this._readJsonArray(this.missedPatternsFile),n=r.find(t=>t.id===e);return n?(n.status=t,n.reviewedAt=(new Date).toISOString(),this._writeJsonArray(this.missedPatternsFile,r),n):null}promoteToScannerRule(e,t={}){const{pattern:r,flags:n="gi",description:s,language:i,severity:a}=t,o=this._readJsonArray(this.missedPatternsFile),d=o.find(t=>t.id===e);if(!d)throw new Error(`[PatternLearner] missed-pattern "${e}" not found`);if("confirmed"!==d.status)throw new Error(`[PatternLearner] missed-pattern "${e}" must be status "confirmed" before promotion (current: "${d.status}")`);if(!r)throw new Error('[PatternLearner] promoteToScannerRule requires an explicit "pattern" regex source');const c=this.recordNewPattern({pattern:r,flags:n,category:d.expectedCategory,description:s||`Promoted from missed-pattern ${e}: ${d.expectedCategory}`,language:i||(d.language?[d.language]:[]),severity:a||d.severity||"medium",source:`learn:${e}`});return c.added&&(d.status="promoted",d.promotedAt=(new Date).toISOString(),d.promotedRuleId=c.id,this._writeJsonArray(this.missedPatternsFile,o)),Object.assign({},c,{missedEntry:d})}autoPromoteMissedPatterns(){const e=this._readJsonArray(this.missedPatternsFile),t=this._readJsonArray(this.communityFile);let r=0,n=0,s=0;const i=[];for(const a of e){if("pending"!==a.status)continue;r++;const e=this._deriveTrigger(a.content);if(!e){a.status="rejected",a.reviewedAt=(new Date).toISOString(),a.reviewNote="auto-review: no derivable pattern from stored content",s++;continue}if(this.patternExists(e,a.expectedCategory)){a.status="rejected",a.reviewedAt=(new Date).toISOString(),a.reviewNote="auto-review: derived pattern already covered by an existing rule",s++;continue}a.status="confirmed",a.reviewedAt=(new Date).toISOString(),a.reviewNote="auto-confirmed: derivable pattern found";const o=this._nextId(t,"COMM");t.push({id:o,pattern:e,flags:"gi",category:a.expectedCategory,description:`Auto-promoted from missed-pattern ${a.id}: ${a.expectedCategory}`,language:a.language?[a.language]:[],severity:a.severity||"medium",discoveredAt:(new Date).toISOString(),source:`learn:${a.id}`}),a.status="promoted",a.promotedAt=(new Date).toISOString(),a.promotedRuleId=o,n++,i.push(o)}return n>0&&(this._writeJsonArray(this.communityFile,t),this._invalidateRuleCache()),r>0&&this._writeJsonArray(this.missedPatternsFile,e),{reviewed:r,promoted:n,skipped:s,promotedIds:i}}}module.exports={PatternLearner:PatternLearner,RULES_DIR:RULES_DIR,COMMUNITY_FILE:COMMUNITY_FILE,MISSED_PATTERNS_FILE:MISSED_PATTERNS_FILE};
@@ -0,0 +1 @@
1
+ "use strict";const fs=require("fs"),path=require("path"),crypto=require("crypto");function getScannerVersion(){try{return JSON.parse(fs.readFileSync(path.join(__dirname,"..","..","package.json"),"utf-8")).version||"unknown"}catch{return"unknown"}}function calculateCrucibleScore(e={}){let t=0,n=0;if(e.seedResults&&e.seedResults.total>0&&(t+=e.seedResults.detected/e.seedResults.total*100*.4,n+=.4),e.mutationResults&&e.mutationResults.total>0&&(t+=e.mutationResults.killed/e.mutationResults.total*100*.25,n+=.25),e.kennyResults&&(t+=.25*(e.kennyResults.score||0),n+=.25),e.selfAttackResults&&(t+=.1*(e.selfAttackResults.score||0),n+=.1),0===n)return 0;const s=t/n;return Math.round(Math.min(100,Math.max(0,s)))}function scoreColor(e){return e>=90?"#22c55e":e>=70?"#f59e0b":e>=50?"#f97316":"#ef4444"}function scoreLabel(e){return e>=90?"Excellent":e>=70?"Good":e>=50?"Fair":e>=30?"Poor":"Critical"}function esc(e){return String(e||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function generateHTML(e){const t=e.title||"Crucible Report",n=e.timestamp||(new Date).toISOString(),s=e.level||"medium",a="number"==typeof e.score?e.score:calculateCrucibleScore(e),r=scoreColor(a),o=scoreLabel(a),d=buildSeedSection(e.seedResults),i=buildMutationSection(e.mutationResults),l=buildKennySection(e.kennyResults),c=buildSelfAttackSection(e.selfAttackResults),p=buildGoldenSection(e.goldenComparison),u=buildDivergenceSection(e.divergenceStats);return`<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <title>${esc(t)}</title>\n <style>\n :root {\n --bg: #0f0f0f;\n --surface: #1a1a1a;\n --surface2: #242424;\n --border: #2e2e2e;\n --text: #e5e5e5;\n --text-muted: #888;\n --accent: #f97316;\n --green: #22c55e;\n --red: #ef4444;\n --amber: #f59e0b;\n --blue: #3b82f6;\n --purple: #a855f7;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n min-height: 100vh;\n }\n a { color: var(--accent); text-decoration: none; }\n h1, h2, h3 { font-weight: 700; }\n\n /* ── Header ── */\n .header {\n background: linear-gradient(135deg, #1a0a00 0%, #0f0f0f 60%);\n border-bottom: 1px solid var(--border);\n padding: 2rem;\n display: flex;\n align-items: center;\n gap: 2rem;\n }\n .header-logo {\n font-size: 2.5rem;\n font-weight: 900;\n background: linear-gradient(135deg, #f97316, #ef4444);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n letter-spacing: -1px;\n }\n .header-info { flex: 1; }\n .header-info h1 { font-size: 1.5rem; color: var(--text); }\n .header-meta { color: var(--text-muted); font-size: 0.85rem; margin-top: 0.25rem; }\n\n /* ── Score gauge ── */\n .score-gauge {\n text-align: center;\n min-width: 120px;\n }\n .score-circle {\n width: 100px; height: 100px;\n border-radius: 50%;\n border: 4px solid ${r};\n display: flex; flex-direction: column;\n align-items: center; justify-content: center;\n margin: 0 auto 0.5rem;\n box-shadow: 0 0 20px ${r}40;\n }\n .score-number { font-size: 2rem; font-weight: 900; color: ${r}; }\n .score-label-small { font-size: 0.7rem; color: var(--text-muted); }\n .score-grade { font-size: 0.9rem; font-weight: 700; color: ${r}; }\n\n /* ── Container ── */\n .container { max-width: 1200px; margin: 0 auto; padding: 2rem; }\n\n /* ── Summary cards ── */\n .cards {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n margin-bottom: 2rem;\n }\n .card {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n padding: 1.25rem;\n }\n .card-value { font-size: 2rem; font-weight: 900; }\n .card-label { font-size: 0.8rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-top: 0.25rem; }\n .card.green .card-value { color: var(--green); }\n .card.red .card-value { color: var(--red); }\n .card.amber .card-value { color: var(--amber); }\n .card.blue .card-value { color: var(--blue); }\n .card.purple .card-value{ color: var(--purple); }\n\n /* ── Sections ── */\n .section {\n background: var(--surface);\n border: 1px solid var(--border);\n border-radius: 8px;\n margin-bottom: 1.5rem;\n overflow: hidden;\n }\n .section-header {\n display: flex; align-items: center; justify-content: space-between;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--border);\n cursor: pointer;\n user-select: none;\n }\n .section-header:hover { background: var(--surface2); }\n .section-title { font-size: 1rem; font-weight: 700; display: flex; align-items: center; gap: 0.5rem; }\n .section-badge {\n font-size: 0.75rem; font-weight: 600;\n padding: 0.2rem 0.6rem; border-radius: 999px;\n background: var(--surface2); border: 1px solid var(--border);\n }\n .section-badge.pass { background: #052e16; border-color: #16a34a; color: var(--green); }\n .section-badge.fail { background: #450a0a; border-color: #dc2626; color: var(--red); }\n .section-body { padding: 1.25rem; }\n\n /* ── Bar charts ── */\n .bar-chart { display: flex; flex-direction: column; gap: 0.5rem; }\n .bar-row { display: flex; align-items: center; gap: 0.75rem; }\n .bar-label { width: 160px; font-size: 0.85rem; text-align: right; color: var(--text-muted); flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .bar-track { flex: 1; height: 20px; background: var(--surface2); border-radius: 4px; overflow: hidden; position: relative; }\n .bar-fill { height: 100%; border-radius: 4px; transition: width 0.4s ease; display: flex; align-items: center; padding-left: 8px; font-size: 0.75rem; font-weight: 600; color: white; }\n .bar-count { font-size: 0.8rem; color: var(--text-muted); min-width: 60px; }\n\n /* ── Test table ── */\n .test-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }\n .test-table th {\n text-align: left; padding: 0.5rem 0.75rem;\n border-bottom: 1px solid var(--border);\n color: var(--text-muted); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.75rem;\n }\n .test-table td { padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--border); vertical-align: top; }\n .test-table tr:last-child td { border-bottom: none; }\n .test-table tr:hover td { background: var(--surface2); }\n .pass-icon { color: var(--green); font-weight: 700; }\n .fail-icon { color: var(--red); font-weight: 700; }\n .warn-icon { color: var(--amber); font-weight: 700; }\n .badge {\n display: inline-block; font-size: 0.7rem; font-weight: 600;\n padding: 0.1rem 0.4rem; border-radius: 4px; margin: 0 0.1rem;\n }\n .badge-critical { background: #450a0a; color: #fca5a5; border: 1px solid #ef4444; }\n .badge-high { background: #431407; color: #fdba74; border: 1px solid #f97316; }\n .badge-medium { background: #422006; color: #fcd34d; border: 1px solid #f59e0b; }\n .badge-category { background: #1e1b4b; color: #a5b4fc; border: 1px solid #6366f1; }\n .badge-lang { background: #052e16; color: #86efac; border: 1px solid #22c55e; }\n\n /* ── Golden comparison ── */\n .regression { background: #450a0a; border: 1px solid var(--red); border-radius: 6px; padding: 1rem; margin-top: 1rem; }\n .improvement { background: #052e16; border: 1px solid var(--green); border-radius: 6px; padding: 1rem; margin-top: 1rem; }\n .neutral { background: var(--surface2); border: 1px solid var(--border); border-radius: 6px; padding: 1rem; margin-top: 1rem; }\n\n /* ── Collapse toggle ── */\n .chevron { transition: transform 0.2s; }\n .collapsed .chevron { transform: rotate(-90deg); }\n .collapsible-body { display: block; }\n .collapsed .collapsible-body { display: none; }\n\n /* ── Responsive ── */\n @media (max-width: 768px) {\n .header { flex-direction: column; text-align: center; }\n .bar-label { width: 100px; }\n }\n\n /* ── Footer ── */\n .footer {\n text-align: center;\n padding: 2rem;\n color: var(--text-muted);\n font-size: 0.8rem;\n border-top: 1px solid var(--border);\n }\n </style>\n</head>\n<body>\n\n<div class="header">\n <div class="header-logo">&#x1F525; CRUCIBLE</div>\n <div class="header-info">\n <h1>${esc(t)}</h1>\n <div class="header-meta">\n Level: <strong>${esc(s)}</strong> &nbsp;|&nbsp;\n Generated: <strong>${esc(new Date(n).toLocaleString())}</strong> &nbsp;|&nbsp;\n Branch: <strong>kenny-mode</strong> &nbsp;|&nbsp;\n Scanner: <strong>v${esc(getScannerVersion())}</strong>\n </div>\n </div>\n <div class="score-gauge">\n <div class="score-circle">\n <div class="score-number">${a}</div>\n <div class="score-label-small">/ 100</div>\n </div>\n <div class="score-grade">${esc(o)}</div>\n <div class="score-label-small">Crucible Score</div>\n </div>\n</div>\n\n<div class="container">\n ${buildSummaryCards(e,a)}\n ${p}\n ${u}\n ${d}\n ${i}\n ${l}\n ${c}\n</div>\n\n<div class="footer">\n Generated by <strong>Thuban Crucible</strong> &mdash; The Fire Test for Security Scanners\n</div>\n\n<script>\n // Collapsible sections\n document.querySelectorAll('.section-header').forEach(h => {\n h.addEventListener('click', () => {\n h.closest('.section').classList.toggle('collapsed');\n });\n });\n<\/script>\n</body>\n</html>`}function buildSummaryCards(e,t){const n=e.seedResults||{},s=e.mutationResults||{},a=e.kennyResults||{},r=n.total>0?Math.round(n.detected/n.total*100):null,o=s.total>0?Math.round(s.killed/s.total*100):null,d=[];return n.total&&(d.push(`<div class="card ${r>=70?"green":"red"}">\n <div class="card-value">${r}%</div>\n <div class="card-label">Seed Detection Rate</div>\n </div>`),d.push(`<div class="card blue">\n <div class="card-value">${n.total}</div>\n <div class="card-label">Seeds Tested</div>\n </div>`)),s.total&&d.push(`<div class="card ${o>=70?"green":"amber"}">\n <div class="card-value">${o}%</div>\n <div class="card-label">Mutation Kill Rate</div>\n </div>`),void 0!==a.score&&d.push(`<div class="card ${a.score>=70?"green":"amber"}">\n <div class="card-value">${a.score}</div>\n <div class="card-label">Kenny Score</div>\n </div>`),d.push(`<div class="card purple">\n <div class="card-value">${t}</div>\n <div class="card-label">Crucible Score</div>\n </div>`),`<div class="cards">${d.join("")}</div>`}function buildSeedSection(e){if(!e)return"";const t=e.total||0,n=e.detected||0,s=e.missed||0,a=e.byLanguage||{},r=e.byCategory||{},o=Object.entries(a).sort(([,e],[,t])=>t.detected/t.total-e.detected/e.total).map(([e,t])=>{const n=t.total>0?Math.round(t.detected/t.total*100):0,s=n>=70?"#22c55e":n>=50?"#f59e0b":"#ef4444";return`<div class="bar-row">\n <div class="bar-label">${esc(e)}</div>\n <div class="bar-track">\n <div class="bar-fill" style="width:${n}%; background:${s}">${n}%</div>\n </div>\n <div class="bar-count">${t.detected}/${t.total}</div>\n </div>`}).join(""),d=Object.entries(r).sort(([,e],[,t])=>t.detected/t.total-e.detected/e.total).map(([e,t])=>{const n=t.total>0?Math.round(t.detected/t.total*100):0,s=n>=70?"#22c55e":n>=50?"#f59e0b":"#ef4444";return`<div class="bar-row">\n <div class="bar-label">${esc(e)}</div>\n <div class="bar-track">\n <div class="bar-fill" style="width:${n}%; background:${s}">${n}%</div>\n </div>\n <div class="bar-count">${t.detected}/${t.total}</div>\n </div>`}).join(""),i=0===s?'<span class="section-badge pass">All seeds detected</span>':`<span class="section-badge fail">${s} missed</span>`,l=(e.tests||[]).slice(0,200).map(e=>`<tr>\n <td><span class="${e.detected?"pass-icon":"fail-icon"}">${e.detected?"✓":"✗"}</span></td>\n <td><code>${esc(e.id)}</code></td>\n <td><span class="badge badge-lang">${esc(e.language)}</span></td>\n <td><span class="badge badge-category">${esc(e.category)}</span></td>\n <td><span class="badge badge-${esc((e.severity||"medium").toLowerCase())}">${esc(e.severity)}</span></td>\n <td style="color:var(--text-muted);font-size:0.8rem">${esc(e.expected)}</td>\n </tr>`).join("");return`\n<div class="section" id="seed-section">\n <div class="section-header">\n <div class="section-title">&#127807; Seed Results <span style="color:var(--text-muted);font-weight:400;font-size:0.9rem">${n}/${t} detected</span></div>\n ${i}\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n <div style="display:grid;grid-template-columns:1fr 1fr;gap:2rem;margin-bottom:1.5rem">\n <div>\n <h3 style="margin-bottom:0.75rem;font-size:0.9rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.05em">By Language</h3>\n <div class="bar-chart">${o||'<div style="color:var(--text-muted)">No data</div>'}</div>\n </div>\n <div>\n <h3 style="margin-bottom:0.75rem;font-size:0.9rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:0.05em">By Category</h3>\n <div class="bar-chart">${d||'<div style="color:var(--text-muted)">No data</div>'}</div>\n </div>\n </div>\n ${l?`\n <table class="test-table">\n <thead><tr>\n <th></th><th>Seed</th><th>Lang</th><th>Category</th><th>Severity</th><th>Expected</th>\n </tr></thead>\n <tbody>${l}</tbody>\n </table>`:""}\n </div>\n</div>`}function buildMutationSection(e){if(!e)return"";const t=e.total||0,n=e.killed||0,s=e.survived||0,a=t>0?Math.round(n/t*100):0,r=a>=70?"#22c55e":a>=50?"#f59e0b":"#ef4444",o=(e.tests||[]).slice(0,100).map(e=>`<tr>\n <td><span class="${e.killed?"pass-icon":"fail-icon"}">${e.killed?"✓":"✗"}</span></td>\n <td><code>${esc(e.seedId)}</code></td>\n <td>${(e.applied||[]).map(e=>`<span class="badge badge-category">${esc(e)}</span>`).join(" ")}</td>\n <td><span class="${e.killed?"pass-icon":"fail-icon"}" style="font-size:0.85rem">${e.killed?"Killed":"Survived"}</span></td>\n </tr>`).join("");return`\n<div class="section" id="mutation-section">\n <div class="section-header">\n <div class="section-title">&#129516; Mutation Kill Rate <span style="color:${r};margin-left:0.5rem">${a}%</span></div>\n <span class="section-badge ${a>=70?"pass":"fail"}">${n}/${t} killed</span>\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n <div class="bar-chart" style="margin-bottom:1rem">\n <div class="bar-row">\n <div class="bar-label">Kill Rate</div>\n <div class="bar-track">\n <div class="bar-fill" style="width:${a}%; background:${r}">${a}%</div>\n </div>\n <div class="bar-count">${n}/${t}</div>\n </div>\n <div class="bar-row">\n <div class="bar-label">Survival Rate</div>\n <div class="bar-track">\n <div class="bar-fill" style="width:${t>0?Math.round(s/t*100):0}%; background:#ef4444">${t>0?Math.round(s/t*100):0}%</div>\n </div>\n <div class="bar-count">${s}/${t}</div>\n </div>\n </div>\n ${o?`\n <table class="test-table">\n <thead><tr><th></th><th>Seed</th><th>Mutations Applied</th><th>Result</th></tr></thead>\n <tbody>${o}</tbody>\n </table>`:""}\n </div>\n</div>`}function buildKennySection(e){if(!e)return"";const t=e.score||0,n=e.total||0,s=e.passed||0,a=(e.failed,scoreColor(t)),r=Object.entries(e.batteries||{}).map(([e,t])=>{const n=t.total>0?Math.round(t.passed/t.total*100):0,s=n>=70?"#22c55e":n>=50?"#f59e0b":"#ef4444";return`<div class="bar-row">\n <div class="bar-label">${esc(e)}</div>\n <div class="bar-track">\n <div class="bar-fill" style="width:${n}%; background:${s}">${n}%</div>\n </div>\n <div class="bar-count">${t.passed}/${t.total}</div>\n </div>`}).join(""),o=(e.tests||[]).map(e=>{const t=(e.missingDetections||[]).map(e=>`<span class="badge badge-category">${esc(e)}</span>`).join(" "),n=(e.falsePositives||[]).map(e=>`<span class="badge badge-high">${esc(e)}</span>`).join(" ");return`<tr>\n <td><span class="${e.passed?"pass-icon":e.crashed||e.timedOut?"warn-icon":"fail-icon"}">${e.passed?"✓":e.crashed?"⚡":e.timedOut?"⏱":"✗"}</span></td>\n <td style="font-size:0.8rem;color:var(--text-muted)">${esc(e.id)}</td>\n <td>${esc(e.name)}</td>\n <td><span class="badge badge-lang">${esc(e.battery)}</span></td>\n <td>${t||n||'<span style="color:var(--text-muted)">—</span>'}</td>\n </tr>`}).join("");return`\n<div class="section" id="kenny-section">\n <div class="section-header">\n <div class="section-title">&#128293; Kenny Mode <span style="color:${a};margin-left:0.5rem">${t}/100</span></div>\n <span class="section-badge ${t>=70?"pass":"fail"}">${s}/${n} passed</span>\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n <div class="bar-chart" style="margin-bottom:1.5rem">\n ${r||'<div style="color:var(--text-muted)">No battery data</div>'}\n </div>\n ${o?`\n <table class="test-table">\n <thead><tr><th></th><th>ID</th><th>Test</th><th>Battery</th><th>Issues</th></tr></thead>\n <tbody>${o}</tbody>\n </table>`:""}\n </div>\n</div>`}function buildSelfAttackSection(e){if(!e)return"";const t=e.score||0,n=(e.crashes||[]).length,s=(e.hangs||[]).length,a=(e.missedDetections||[]).length,r=(e.passed||[]).length,o=scoreColor(t),d=(e.crashes||[]).map(e=>`<tr>\n <td><span class="fail-icon">⚡</span></td>\n <td><code>${esc(e.payload)}</code></td>\n <td>${esc(e.description)}</td>\n <td style="color:var(--red)">${esc(e.error||"")}</td>\n </tr>`).join(""),i=(e.hangs||[]).map(e=>`<tr>\n <td><span class="warn-icon">⏱</span></td>\n <td><code>${esc(e.payload)}</code></td>\n <td>${esc(e.description)}</td>\n <td style="color:var(--amber)">Timed out after ${e.timeout}ms</td>\n </tr>`).join(""),l=(e.passed||[]).map(e=>`<tr>\n <td><span class="pass-icon">✓</span></td>\n <td><code>${esc(e.payload)}</code></td>\n <td colspan="2">${esc(e.description)}</td>\n </tr>`).join("");return`\n<div class="section" id="self-attack-section">\n <div class="section-header">\n <div class="section-title">&#128481; Self-Attack <span style="color:${o};margin-left:0.5rem">${t}/100</span></div>\n <span class="section-badge ${n+s===0?"pass":"fail"}">${n} crash, ${s} hang, ${a} missed</span>\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n ${n+s+a+r>0?`\n <table class="test-table">\n <thead><tr><th></th><th>Payload</th><th>Description</th><th>Details</th></tr></thead>\n <tbody>\n ${d}\n ${i}\n ${l}\n </tbody>\n </table>`:'<div style="color:var(--text-muted)">No self-attack results</div>'}\n </div>\n</div>`}function buildGoldenSection(e){if(!e||!e.hasMaster)return"";const t=e.passed?"improvement":"regression",n=e.passed?"✓":"✗",s=(e.lostDetections||[]).map(e=>`<div style="color:var(--red);font-size:0.85rem">&#8722; ${esc(e)}</div>`).join(""),a=(e.newDetections||[]).map(e=>`<div style="color:var(--green);font-size:0.85rem">&#43; ${esc(e)}</div>`).join("");return`\n<div class="section" id="golden-section">\n <div class="section-header">\n <div class="section-title">&#127775; Golden Master Comparison</div>\n <span class="section-badge ${e.passed?"pass":"fail"}">${e.passed?"No regressions":`${e.regressions} regression(s)`}</span>\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n <div class="${t}">\n <strong>${n} ${esc(e.summary)}</strong>\n <div style="margin-top:0.5rem;color:var(--text-muted);font-size:0.85rem">\n Golden from: ${esc(e.goldenTimestamp||"unknown")} &nbsp;|&nbsp;\n Previous score: ${null!=e.goldenScore?e.goldenScore:"N/A"}\n </div>\n </div>\n ${s?`<div style="margin-top:1rem"><strong style="color:var(--red)">Regressions (lost detections):</strong>${s}</div>`:""}\n ${a?`<div style="margin-top:1rem"><strong style="color:var(--green)">Improvements (new detections):</strong>${a}</div>`:""}\n </div>\n</div>`}function buildDivergenceSection(e){if(!e||!e.sampled)return"";const t=null!=e.agreementRate?e.agreementRate:0,n=t>=95?"#22c55e":t>=80?"#f59e0b":"#ef4444",s=(e.divergences||[]).length,a=(e.divergences||[]).map(e=>`<tr>\n <td><span class="warn-icon">⚠</span></td>\n <td><code>${esc(e.seedId)}</code></td>\n <td><span class="badge badge-lang">${esc(e.language)}</span></td>\n <td><span class="badge badge-category">${esc(e.category)}</span></td>\n <td style="font-size:0.8rem;color:var(--text-muted)">${esc(e.phase)}</td>\n <td style="font-size:0.8rem">${esc(JSON.stringify(e.heuristicCategories))}</td>\n <td style="font-size:0.8rem">${esc(JSON.stringify(e.productionCategories))}</td>\n </tr>`).join("");return`\n<div class="section" id="divergence-section">\n <div class="section-header">\n <div class="section-title">&#128269; Heuristic-CLI Agreement <span style="color:${n};margin-left:0.5rem">${t}%</span></div>\n <span class="section-badge ${0===s?"pass":"fail"}">${0===s?"No divergences":`${s} divergence(s)`}</span>\n <span class="chevron">&#8964;</span>\n </div>\n <div class="collapsible-body section-body">\n <div style="color:var(--text-muted);font-size:0.85rem;margin-bottom:1rem">\n Randomly sampled ${Math.round(100*e.sampleRate)}% of seeds where the fast heuristic\n (<code>_simulateScan()</code>) reported "detected", then cross-checked against the real\n production scanner (CodeScanner + HallucinationDetector). Agreement: <strong>${t}%</strong>\n on ${e.sampled} sampled seed(s). This never affects the headline Crucible score.\n </div>\n ${a?`\n <table class="test-table">\n <thead><tr><th></th><th>Seed</th><th>Lang</th><th>Category</th><th>Phase</th><th>Heuristic</th><th>Production</th></tr></thead>\n <tbody>${a}</tbody>\n </table>`:""}\n </div>\n</div>`}class ReportGenerator{constructor(e={}){this.outputDir=path.resolve(e.outputDir||process.cwd())}generate(e,t={}){const n=(e.timestamp||(new Date).toISOString()).replace(/[:.]/g,"-").slice(0,19),s=t.filename||`crucible-report-${n}.html`,a=path.basename(s),r=path.join(this.outputDir,a),o=generateHTML(e);return fs.writeFileSync(r,o,"utf-8"),r}generateJSON(e,t={}){const n=e.timestamp||(new Date).toISOString(),s=n.replace(/[:.]/g,"-").slice(0,19),a=t.filename||`crucible-report-${s}.json`,r=path.basename(a),o=path.join(this.outputDir,r),d="number"==typeof e.score?e.score:calculateCrucibleScore(e),i={timestamp:n,score:d,scoreLabel:scoreLabel(d),scannerVersion:getScannerVersion(),level:e.level||"medium",seeds:e.seedResults?{total:e.seedResults.total,detected:e.seedResults.detected,missed:e.seedResults.missed,rate:e.seedResults.total>0?Math.round(e.seedResults.detected/e.seedResults.total*100):null}:null,mutations:e.mutationResults?{total:e.mutationResults.total,killed:e.mutationResults.killed,survived:e.mutationResults.survived,killRate:e.mutationResults.total>0?Math.round(e.mutationResults.killed/e.mutationResults.total*100):null}:null,kenny:e.kennyResults?{score:e.kennyResults.score,passed:e.kennyResults.passed,total:e.kennyResults.total}:null,selfAttack:e.selfAttackResults?{score:e.selfAttackResults.score}:null,golden:e.goldenComparison?{passed:e.goldenComparison.passed,regressions:e.goldenComparison.regressions}:null,divergence:e.divergenceStats&&e.divergenceStats.sampled?{sampleRate:e.divergenceStats.sampleRate,sampled:e.divergenceStats.sampled,agreements:e.divergenceStats.agreements,agreementRate:e.divergenceStats.agreementRate,divergences:e.divergenceStats.divergences}:null};return fs.writeFileSync(o,JSON.stringify(i,null,2),"utf-8"),o}}module.exports={ReportGenerator:ReportGenerator,generateHTML:generateHTML,calculateCrucibleScore:calculateCrucibleScore,scoreColor:scoreColor,scoreLabel:scoreLabel,getScannerVersion:getScannerVersion};
@@ -0,0 +1 @@
1
+ "use strict";const fs=require("fs"),path=require("path"),RULES_DIR=path.join(__dirname,"rules"),MAX_PATTERN_LENGTH=500,MAX_QUANTIFIERS=20,MAX_ALTERNATIONS=30;function _checkRegexComplexity(e){if("string"!=typeof e||!e)return{safe:!1,reason:"pattern must be a non-empty string"};if(e.length>500)return{safe:!1,reason:"pattern exceeds max length of 500"};let t=0,n=0;const r=[];for(let a=0;a<e.length;a++){const s=e[a];if("\\"!==s)if("("!==s){if(")"===s){const n=r.pop();if(!n)continue;const s=/^\{\d+(,\d*)?\}/.exec(e.slice(a+1)),i=e[a+1];if("+"===i||"*"===i||"?"===i||s){if(t++,n.hasQuantifier||n.hasAlternation)return{safe:!1,reason:"nested quantifier detected (potential catastrophic backtracking)"};r.length>0&&(r[r.length-1].hasQuantifier=!0)}continue}if("+"!==s&&"*"!==s&&"?"!==s){if("{"===s){/^\{\d+(,\d*)?\}/.exec(e.slice(a))&&(t++,r.length>0&&(r[r.length-1].hasQuantifier=!0));continue}"|"!==s||(n++,r.length>0&&(r[r.length-1].hasAlternation=!0))}else t++,r.length>0&&(r[r.length-1].hasQuantifier=!0)}else r.push({hasQuantifier:!1,hasAlternation:!1});else a++}return t>20?{safe:!1,reason:`pattern has ${t} quantifiers, exceeding max of 20`}:n>30?{safe:!1,reason:`pattern has ${n} alternations, exceeding max of 30`}:{safe:!0,reason:null}}let _compiledPatterns=null;function getPatterns(){if(_compiledPatterns)return _compiledPatterns;const e=fs.readdirSync(RULES_DIR).filter(e=>e.endsWith(".json")).sort(),t=[];for(const n of e){const e=path.join(RULES_DIR,n);let r;try{const t=fs.readFileSync(e,"utf-8");r=JSON.parse(t)}catch(e){throw new Error(`[rule-loader] Failed to read/parse rule file "${n}": ${e.message}`)}if(!Array.isArray(r))throw new Error(`[rule-loader] Rule file "${n}" must export a JSON array, got: ${typeof r}`);for(const e of r){if(e.pattern){const t=_checkRegexComplexity(e.pattern);if(!t.safe){console.warn(`[rule-loader] WARNING: Skipping rule "${e.id}" in "${n}" — ${t.reason}`);continue}}let r,a;try{r=new RegExp(e.pattern,e.flags||"")}catch(t){throw new Error(`[rule-loader] Failed to compile rule "${e&&e.id}" in file "${n}": ${t.message}\n pattern: ${e&&e.pattern}\n flags: ${e&&e.flags}`)}if(e.context)try{a=new RegExp(e.context,e.contextFlags||"")}catch(t){throw new Error(`[rule-loader] Failed to compile context for rule "${e&&e.id}" in file "${n}": ${t.message}`)}t.push({regex:r,category:e.category,id:e.id,description:e.description,language:e.language,severity:e.severity,name:e.name,type:e.type,message:e.message,context:a,skipIfSafe:e.skipIfSafe,skipInTests:e.skipInTests,sourceFile:n})}}return _compiledPatterns=t,_compiledPatterns}function getCodeScannerPatterns(){return getPatterns().filter(e=>"code-scanner-core.json"===e.sourceFile).map(e=>{const t={id:e.id,name:e.name,type:e.type,pattern:e.regex,severity:e.severity,message:e.message};return e.context&&(t.context=e.context),e.skipIfSafe&&(t.skipIfSafe=!0),e.skipInTests&&(t.skipInTests=!0),t})}module.exports={getPatterns:getPatterns,getCodeScannerPatterns:getCodeScannerPatterns};
@@ -0,0 +1 @@
1
+ "use strict";const fs=require("fs"),path=require("path");function mulberry32(e){let t=e>>>0;return function(){t|=0,t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}const LANG_DIR_MAP={javascript:"js",js:"js",typescript:"ts",ts:"ts",python:"python",py:"python",java:"java",csharp:"csharp",cs:"csharp",go:"go",golang:"go",kotlin:"kotlin",kt:"kotlin",rust:"rust",rs:"rust",php:"php",ruby:"ruby",rb:"ruby"},ALL_LANGUAGES=["js","ts","python","java","csharp","go","kotlin","rust","php","ruby"];function parseSeedHeader(e){const t=e.split("\n").slice(0,20),s={};let r=!1;for(const e of t){const t=e.trim().replace(/^\/\/\s*/,"").replace(/^#\s*/,"").replace(/^\*\s*/,"");if("[CRUCIBLE-SEED]"===t){r=!0;continue}if(!r)continue;const a=t.match(/^(category|severity|language|expected):\s*(.+)$/);if(a&&(s[a[1]]=a[2].trim()),Object.keys(s).length>=4)break}return Object.keys(s).length>=3?s:null}class SeedingEngine{constructor(e={}){this.seedsDir=e.seedsDir||path.join(__dirname,"seeds"),this.prngseed="number"==typeof e.prngseed?e.prngseed:42,this._byLanguage=new Map,this._byCategory=new Map,this._all=[],this._loaded=!1}load(){if(this._loaded)return this._all.length;if(!fs.existsSync(this.seedsDir))throw new Error(`Seeds directory not found: ${this.seedsDir}`);const e=fs.readdirSync(this.seedsDir,{withFileTypes:!0}).filter(e=>e.isDirectory()).map(e=>e.name);for(const t of e){const e=path.join(this.seedsDir,t),s=fs.readdirSync(e).filter(e=>/\.(js|ts|py|java|cs|go|kt|rs|php|rb)$/.test(e)).sort();for(const r of s){const s=path.join(e,r);let a;try{a=fs.readFileSync(s,"utf-8")}catch{continue}const n=parseSeedHeader(a),i={id:`${t}/${r}`,file:s,langDir:t,filename:r,content:a,category:n?.category||"unknown",severity:n?.severity||"medium",language:n?.language||t,expected:n?.expected||""};this._all.push(i),this._byLanguage.has(t)||this._byLanguage.set(t,[]),this._byLanguage.get(t).push(i);const o=i.category;this._byCategory.has(o)||this._byCategory.set(o,[]),this._byCategory.get(o).push(i)}}return this._loaded=!0,this._all.length}get languages(){return this.load(),Array.from(this._byLanguage.keys()).sort()}get categories(){return this.load(),Array.from(this._byCategory.keys()).sort()}get count(){return this.load(),this._all.length}forLanguage(e){this.load();const t=LANG_DIR_MAP[e.toLowerCase()]||e.toLowerCase();return this._byLanguage.get(t)||[]}forCategory(e){return this.load(),this._byCategory.get(e)||[]}forLanguageAndCategory(e,t){return this.load(),this.forLanguage(e).filter(e=>e.category===t)}createPRNG(){return mulberry32(this.prngseed)}_shuffle(e,t){for(let s=e.length-1;s>0;s--){const r=Math.floor(t()*(s+1));[e[s],e[r]]=[e[r],e[s]]}return e}sample(e,t){const s=this.createPRNG(),r=e.slice();return this._shuffle(r,s),r.slice(0,t)}selectForLevel(e,t={}){this.load();let s=this._all.slice();if(t.languages&&t.languages.length){const e=t.languages.map(e=>LANG_DIR_MAP[e.toLowerCase()]||e.toLowerCase());s=s.filter(t=>e.includes(t.langDir))}t.categories&&t.categories.length&&(s=s.filter(e=>t.categories.includes(e.category)));const r=this.createPRNG(),a=s.slice();switch(this._shuffle(a,r),e){case"gentle":default:return a.slice(0,50);case"medium":return a.slice(0,200);case"hell":return a}}stats(){this.load();const e={};for(const[t,s]of this._byLanguage)e[t]=s.length;const t={};for(const[e,s]of this._byCategory)t[e]=s.length;const s={critical:0,high:0,medium:0,low:0};for(const e of this._all){const t=(e.severity||"medium").toLowerCase();s[t]=(s[t]||0)+1}return{total:this._all.length,byLanguage:e,byCategory:t,bySeverity:s}}}module.exports={SeedingEngine:SeedingEngine,mulberry32:mulberry32,parseSeedHeader:parseSeedHeader,ALL_LANGUAGES:ALL_LANGUAGES,LANG_DIR_MAP:LANG_DIR_MAP};
@@ -0,0 +1,28 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded SQL Server connection string with plaintext password
6
+
7
+ using System.Data.SqlClient;
8
+
9
+ namespace App.Data
10
+ {
11
+ public class DatabaseConfig
12
+ {
13
+ private const string ConnectionString =
14
+ "Server=prod-sql.internal;Database=AppDb;User Id=sa;Password=Pr0dS@P@ssw0rd!;";
15
+
16
+ public static SqlConnection GetConnection()
17
+ {
18
+ return new SqlConnection(ConnectionString);
19
+ }
20
+
21
+ public static void TestConnection()
22
+ {
23
+ using var conn = GetConnection();
24
+ conn.Open();
25
+ System.Console.WriteLine("Connected to: " + conn.DataSource);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,24 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded AWS credentials stored as string constants
6
+
7
+ using Amazon;
8
+ using Amazon.S3;
9
+ using Amazon.Runtime;
10
+
11
+ namespace App.Cloud
12
+ {
13
+ public class AwsClientFactory
14
+ {
15
+ private const string AccessKeyId = "AKIAIOSFODNN7EXAMPLE";
16
+ private const string SecretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
17
+
18
+ public static AmazonS3Client CreateS3Client()
19
+ {
20
+ var credentials = new BasicAWSCredentials(AccessKeyId, SecretAccessKey);
21
+ return new AmazonS3Client(credentials, RegionEndpoint.USEast1);
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,30 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded JWT signing key embedded in authentication middleware
6
+
7
+ using Microsoft.IdentityModel.Tokens;
8
+ using System.IdentityModel.Tokens.Jwt;
9
+ using System.Text;
10
+
11
+ namespace App.Auth
12
+ {
13
+ public class JwtService
14
+ {
15
+ // Vulnerable: secret hardcoded — should come from configuration/vault
16
+ private const string SigningKey = "my-256-bit-super-secret-jwt-key!!";
17
+
18
+ public string GenerateToken(string userId)
19
+ {
20
+ var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SigningKey));
21
+ var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
22
+ var token = new JwtSecurityToken(
23
+ issuer: "myapp",
24
+ audience: "myapp-users",
25
+ expires: System.DateTime.UtcNow.AddHours(24),
26
+ signingCredentials: creds);
27
+ return new JwtSecurityTokenHandler().WriteToken(token);
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,31 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: high
4
+ // language: csharp
5
+ // expected: Hardcoded Stripe secret key used for payment processing
6
+
7
+ using Stripe;
8
+
9
+ namespace App.Payments
10
+ {
11
+ public class PaymentService
12
+ {
13
+ private const string StripeSecretKey = "sk_live_51HqT4vKZ3VpNm8Yw9fX2rLcD";
14
+
15
+ public PaymentService()
16
+ {
17
+ StripeConfiguration.ApiKey = StripeSecretKey;
18
+ }
19
+
20
+ public Charge CreateCharge(string token, long amountCents)
21
+ {
22
+ var options = new ChargeCreateOptions
23
+ {
24
+ Amount = amountCents,
25
+ Currency = "usd",
26
+ Source = token
27
+ };
28
+ return new ChargeService().Create(options);
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,28 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded Azure Storage connection string containing account key
6
+
7
+ using Azure.Storage.Blobs;
8
+
9
+ namespace App.Storage
10
+ {
11
+ public class BlobStorageService
12
+ {
13
+ private const string AzureStorageConnectionString =
14
+ "DefaultEndpointsProtocol=https;AccountName=prodstorageacct;" +
15
+ "AccountKey=dGhpcyBpcyBhIGZha2Uga2V5IGZvciBkZW1vIHB1cnBvc2VzIG9ubHkh;" +
16
+ "EndpointSuffix=core.windows.net";
17
+
18
+ private readonly BlobServiceClient _client;
19
+
20
+ public BlobStorageService()
21
+ {
22
+ _client = new BlobServiceClient(AzureStorageConnectionString);
23
+ }
24
+
25
+ public BlobContainerClient GetContainer(string name)
26
+ => _client.GetBlobContainerClient(name);
27
+ }
28
+ }
@@ -0,0 +1,25 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: high
4
+ // language: csharp
5
+ // expected: Hardcoded SendGrid API key for email sending
6
+
7
+ using SendGrid;
8
+ using SendGrid.Helpers.Mail;
9
+
10
+ namespace App.Notifications
11
+ {
12
+ public class EmailService
13
+ {
14
+ private const string SendGridApiKey = "SG.aBcDeFgHiJkLmNoPqRsTuVwXyZ.0123456789abcdefghijklmno";
15
+
16
+ public async System.Threading.Tasks.Task SendAsync(string to, string subject, string body)
17
+ {
18
+ var client = new SendGridClient(SendGridApiKey);
19
+ var from = new EmailAddress("noreply@company.com", "Company");
20
+ var toAddr = new EmailAddress(to);
21
+ var msg = MailHelper.CreateSingleEmail(from, toAddr, subject, body, body);
22
+ await client.SendEmailAsync(msg);
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,34 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded encryption key and IV stored as byte array constants
6
+
7
+ using System.Security.Cryptography;
8
+
9
+ namespace App.Security
10
+ {
11
+ public class DataEncryptor
12
+ {
13
+ // Vulnerable: hardcoded AES key and IV in source code
14
+ private static readonly byte[] AesKey = new byte[]
15
+ {
16
+ 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
17
+ 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
18
+ };
19
+ private static readonly byte[] AesIv = new byte[]
20
+ {
21
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
22
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
23
+ };
24
+
25
+ public static byte[] Encrypt(byte[] data)
26
+ {
27
+ using var aes = Aes.Create();
28
+ aes.Key = AesKey;
29
+ aes.IV = AesIv;
30
+ using var enc = aes.CreateEncryptor();
31
+ return enc.TransformFinalBlock(data, 0, data.Length);
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,23 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: hardcoded_secret
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: Hardcoded GitHub PAT and Slack webhook URL in integration service
6
+
7
+ namespace App.Integrations
8
+ {
9
+ public class IntegrationConfig
10
+ {
11
+ public const string GitHubToken = "ghp_aBcDeFgHiJkLmNoPqRsTuVwXyZ012345";
12
+ public const string SlackWebhookUrl = "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX";
13
+ public const string PagerDutyApiKey = "pdkey-u-AbCdEfGhIjKlMnOpQrStUv";
14
+
15
+ public static System.Net.Http.HttpClient CreateGitHubClient()
16
+ {
17
+ var client = new System.Net.Http.HttpClient();
18
+ client.DefaultRequestHeaders.Add("Authorization", $"token {GitHubToken}");
19
+ client.DefaultRequestHeaders.Add("User-Agent", "MyApp/1.0");
20
+ return client;
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,27 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection via string concatenation in SqlCommand
6
+
7
+ using System.Data.SqlClient;
8
+
9
+ namespace App.Data
10
+ {
11
+ public class UserRepository
12
+ {
13
+ private readonly string _connectionString;
14
+
15
+ public UserRepository(string connectionString) => _connectionString = connectionString;
16
+
17
+ public SqlDataReader FindByUsername(string username)
18
+ {
19
+ var conn = new SqlConnection(_connectionString);
20
+ conn.Open();
21
+ // Vulnerable: direct string concatenation into SQL
22
+ var cmd = new SqlCommand(
23
+ "SELECT * FROM Users WHERE Username = '" + username + "'", conn);
24
+ return cmd.ExecuteReader();
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,29 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection via string.Format building WHERE clause
6
+
7
+ using System;
8
+ using System.Data.SqlClient;
9
+
10
+ namespace App.Data
11
+ {
12
+ public class ProductSearch
13
+ {
14
+ private readonly string _conn;
15
+
16
+ public ProductSearch(string conn) => _conn = conn;
17
+
18
+ public SqlDataReader Search(string keyword, string category)
19
+ {
20
+ // Vulnerable: string.Format with unsanitized inputs
21
+ string sql = string.Format(
22
+ "SELECT * FROM Products WHERE Name LIKE '%{0}%' AND Category = '{1}'",
23
+ keyword, category);
24
+ var connection = new SqlConnection(_conn);
25
+ connection.Open();
26
+ return new SqlCommand(sql, connection).ExecuteReader();
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,32 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection in login via string interpolation in SqlCommand
6
+
7
+ using System.Data.SqlClient;
8
+ using Microsoft.AspNetCore.Mvc;
9
+
10
+ namespace App.Controllers
11
+ {
12
+ [ApiController]
13
+ [Route("api/[controller]")]
14
+ public class AuthController : ControllerBase
15
+ {
16
+ private readonly string _conn;
17
+
18
+ public AuthController(string conn) => _conn = conn;
19
+
20
+ [HttpPost("login")]
21
+ public IActionResult Login(string username, string password)
22
+ {
23
+ // Vulnerable: C# interpolated string injected into SQL
24
+ string sql = $"SELECT Id FROM Users WHERE Username='{username}' AND Password='{password}'";
25
+ using var connection = new SqlConnection(_conn);
26
+ connection.Open();
27
+ using var cmd = new SqlCommand(sql, connection);
28
+ var result = cmd.ExecuteScalar();
29
+ return result != null ? Ok("Authenticated") : Unauthorized();
30
+ }
31
+ }
32
+ }
@@ -0,0 +1,27 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection via dynamic ORDER BY column from user input
6
+
7
+ using System.Data.SqlClient;
8
+
9
+ namespace App.Data
10
+ {
11
+ public class ReportRepository
12
+ {
13
+ private readonly string _conn;
14
+
15
+ public ReportRepository(string conn) => _conn = conn;
16
+
17
+ public SqlDataReader GetSortedReport(string tableName, string sortColumn, string sortDir)
18
+ {
19
+ // Vulnerable: all three parameters injected without validation
20
+ string sql = "SELECT * FROM " + tableName +
21
+ " ORDER BY " + sortColumn + " " + sortDir;
22
+ var connection = new SqlConnection(_conn);
23
+ connection.Open();
24
+ return new SqlCommand(sql, connection).ExecuteReader();
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection in stored procedure exec via string concatenation
6
+
7
+ using System.Data;
8
+ using System.Data.SqlClient;
9
+
10
+ namespace App.Data
11
+ {
12
+ public class AuditService
13
+ {
14
+ private readonly string _conn;
15
+
16
+ public AuditService(string conn) => _conn = conn;
17
+
18
+ public void LogEvent(string userId, string action)
19
+ {
20
+ // Vulnerable: building EXEC string manually
21
+ string sql = "EXEC sp_RecordAudit '" + userId + "', '" + action + "'";
22
+ using var connection = new SqlConnection(_conn);
23
+ connection.Open();
24
+ new SqlCommand(sql, connection).ExecuteNonQuery();
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,26 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection via string concatenation in WHERE IN clause
6
+
7
+ using System.Data.SqlClient;
8
+
9
+ namespace App.Data
10
+ {
11
+ public class BatchOrderService
12
+ {
13
+ private readonly string _conn;
14
+
15
+ public BatchOrderService(string conn) => _conn = conn;
16
+
17
+ public SqlDataReader GetOrdersByIds(string rawIds)
18
+ {
19
+ // Vulnerable: rawIds like "1,2,3" injected into IN clause
20
+ string sql = $"SELECT * FROM Orders WHERE Id IN ({rawIds})";
21
+ var connection = new SqlConnection(_conn);
22
+ connection.Open();
23
+ return new SqlCommand(sql, connection).ExecuteReader();
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,33 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: sql_injection
3
+ // severity: critical
4
+ // language: csharp
5
+ // expected: SQL injection via ADO.NET command text built with user search parameters
6
+
7
+ using System;
8
+ using System.Data.SqlClient;
9
+ using Microsoft.AspNetCore.Mvc;
10
+
11
+ namespace App.Controllers
12
+ {
13
+ [ApiController]
14
+ [Route("api/[controller]")]
15
+ public class SearchController : ControllerBase
16
+ {
17
+ private readonly string _conn;
18
+
19
+ public SearchController(string conn) => _conn = conn;
20
+
21
+ [HttpGet]
22
+ public IActionResult Search([FromQuery] string name, [FromQuery] string dept)
23
+ {
24
+ // Vulnerable: both query params concatenated into SQL
25
+ string sql = "SELECT * FROM Employees WHERE Name LIKE '%" + name
26
+ + "%' AND Department = '" + dept + "'";
27
+ using var connection = new SqlConnection(_conn);
28
+ connection.Open();
29
+ using var reader = new SqlCommand(sql, connection).ExecuteReader();
30
+ return Ok("Results fetched");
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,25 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: xss
3
+ // severity: high
4
+ // language: csharp
5
+ // expected: XSS via Response.Write with unescaped user input from query string
6
+
7
+ using System.Web;
8
+
9
+ namespace App.Handlers
10
+ {
11
+ public class GreetingHandler : IHttpHandler
12
+ {
13
+ public bool IsReusable => false;
14
+
15
+ public void ProcessRequest(HttpContext context)
16
+ {
17
+ string name = context.Request.QueryString["name"];
18
+ context.Response.ContentType = "text/html";
19
+ // Vulnerable: name reflected without HtmlEncode
20
+ context.Response.Write("<html><body>");
21
+ context.Response.Write("<h1>Welcome, " + name + "!</h1>");
22
+ context.Response.Write("</body></html>");
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,22 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: xss
3
+ // severity: high
4
+ // language: csharp
5
+ // expected: XSS via Response.Write with search query reflected into HTML
6
+
7
+ using System.Web;
8
+ using System.Web.UI;
9
+
10
+ namespace App.Pages
11
+ {
12
+ public class SearchPage : Page
13
+ {
14
+ protected void Page_Load(object sender, System.EventArgs e)
15
+ {
16
+ string q = Request.QueryString["q"];
17
+ // Vulnerable: writing raw query parameter into page output
18
+ Response.Write("<h2>Results for: " + q + "</h2>");
19
+ Response.Write("<meta name=\"description\" content=\"" + q + "\">");
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,26 @@
1
+ // [CRUCIBLE-SEED]
2
+ // category: xss
3
+ // severity: high
4
+ // language: csharp
5
+ // expected: XSS via MVC action returning raw HTML with user input embedded
6
+
7
+ using Microsoft.AspNetCore.Mvc;
8
+
9
+ namespace App.Controllers
10
+ {
11
+ public class ProfileController : Controller
12
+ {
13
+ [HttpGet("profile")]
14
+ public ContentResult ShowProfile(string username, string bio)
15
+ {
16
+ // Vulnerable: username and bio embedded without encoding
17
+ string html = $@"
18
+ <html><body>
19
+ <h1>{username}</h1>
20
+ <p>{bio}</p>
21
+ <script>var user = ""{username}"";</script>
22
+ </body></html>";
23
+ return Content(html, "text/html");
24
+ }
25
+ }
26
+ }