thuban 0.4.10 → 0.4.11

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 (1531) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +437 -437
  3. package/dist/LICENSE +21 -0
  4. package/dist/README.md +437 -0
  5. package/dist/cli.js +2 -0
  6. package/dist/package.json +63 -0
  7. package/dist/packages/crucible/.golden/golden-master.json +414 -0
  8. package/dist/packages/crucible/report-generator.js +1 -0
  9. package/dist/packages/crucible/rules/code-scanner-core.json +303 -0
  10. package/dist/packages/crucible/rules/command-injection.json +411 -0
  11. package/dist/packages/crucible/rules/crypto-misuse.json +35 -0
  12. package/dist/packages/crucible/rules/deserialization.json +152 -0
  13. package/dist/packages/crucible/rules/env-injection.json +46 -0
  14. package/dist/packages/crucible/rules/eval-abuse.json +104 -0
  15. package/dist/packages/crucible/rules/file-upload.json +46 -0
  16. package/dist/packages/crucible/rules/hallucination.json +22 -0
  17. package/dist/packages/crucible/rules/hardcoded-secret.json +397 -0
  18. package/dist/packages/crucible/rules/hardcoded-url.json +13 -0
  19. package/dist/packages/crucible/rules/insecure-crypto.json +302 -0
  20. package/dist/packages/crucible/rules/integer-overflow.json +35 -0
  21. package/dist/packages/crucible/rules/log-injection.json +33 -0
  22. package/dist/packages/crucible/rules/mass-assignment.json +112 -0
  23. package/dist/packages/crucible/rules/open-redirect.json +196 -0
  24. package/dist/packages/crucible/rules/path-traversal.json +422 -0
  25. package/dist/packages/crucible/rules/prototype-pollution.json +22 -0
  26. package/dist/packages/crucible/rules/sql-injection.json +619 -0
  27. package/dist/packages/crucible/rules/ssrf.json +557 -0
  28. package/dist/packages/crucible/rules/timing-attack.json +55 -0
  29. package/dist/packages/crucible/rules/unsafe-block.json +24 -0
  30. package/dist/packages/crucible/rules/xss.json +663 -0
  31. package/dist/packages/crucible/rules/xxe.json +66 -0
  32. package/dist/packages/crucible/rules/yaml-deserialization.json +22 -0
  33. package/dist/packages/crucible/rules/yaml-injection.json +22 -0
  34. package/dist/packages/crucible/seeds/csharp/seed-001.cs +28 -0
  35. package/dist/packages/crucible/seeds/csharp/seed-002.cs +24 -0
  36. package/dist/packages/crucible/seeds/csharp/seed-003.cs +30 -0
  37. package/dist/packages/crucible/seeds/csharp/seed-004.cs +31 -0
  38. package/dist/packages/crucible/seeds/csharp/seed-005.cs +28 -0
  39. package/dist/packages/crucible/seeds/csharp/seed-006.cs +25 -0
  40. package/dist/packages/crucible/seeds/csharp/seed-007.cs +34 -0
  41. package/dist/packages/crucible/seeds/csharp/seed-008.cs +23 -0
  42. package/dist/packages/crucible/seeds/csharp/seed-009.cs +27 -0
  43. package/dist/packages/crucible/seeds/csharp/seed-010.cs +29 -0
  44. package/dist/packages/crucible/seeds/csharp/seed-011.cs +32 -0
  45. package/dist/packages/crucible/seeds/csharp/seed-012.cs +27 -0
  46. package/dist/packages/crucible/seeds/csharp/seed-013.cs +27 -0
  47. package/dist/packages/crucible/seeds/csharp/seed-014.cs +26 -0
  48. package/dist/packages/crucible/seeds/csharp/seed-015.cs +33 -0
  49. package/dist/packages/crucible/seeds/csharp/seed-016.cs +25 -0
  50. package/dist/packages/crucible/seeds/csharp/seed-017.cs +22 -0
  51. package/dist/packages/crucible/seeds/csharp/seed-018.cs +26 -0
  52. package/dist/packages/crucible/seeds/csharp/seed-019.cs +25 -0
  53. package/dist/packages/crucible/seeds/csharp/seed-020.cs +22 -0
  54. package/dist/packages/crucible/seeds/csharp/seed-021.cs +28 -0
  55. package/dist/packages/crucible/seeds/csharp/seed-022.cs +25 -0
  56. package/dist/packages/crucible/seeds/csharp/seed-023.cs +33 -0
  57. package/dist/packages/crucible/seeds/csharp/seed-024.cs +31 -0
  58. package/dist/packages/crucible/seeds/csharp/seed-025.cs +31 -0
  59. package/dist/packages/crucible/seeds/csharp/seed-026.cs +25 -0
  60. package/dist/packages/crucible/seeds/csharp/seed-027.cs +29 -0
  61. package/dist/packages/crucible/seeds/csharp/seed-028.cs +25 -0
  62. package/dist/packages/crucible/seeds/csharp/seed-029.cs +27 -0
  63. package/dist/packages/crucible/seeds/csharp/seed-030.cs +27 -0
  64. package/dist/packages/crucible/seeds/csharp/seed-031.cs +28 -0
  65. package/dist/packages/crucible/seeds/csharp/seed-032.cs +30 -0
  66. package/dist/packages/crucible/seeds/csharp/seed-033.cs +27 -0
  67. package/dist/packages/crucible/seeds/csharp/seed-034.cs +25 -0
  68. package/dist/packages/crucible/seeds/csharp/seed-035.cs +32 -0
  69. package/dist/packages/crucible/seeds/csharp/seed-036.cs +28 -0
  70. package/dist/packages/crucible/seeds/csharp/seed-037.cs +29 -0
  71. package/dist/packages/crucible/seeds/csharp/seed-038.cs +28 -0
  72. package/dist/packages/crucible/seeds/csharp/seed-039.cs +29 -0
  73. package/dist/packages/crucible/seeds/csharp/seed-040.cs +28 -0
  74. package/dist/packages/crucible/seeds/csharp/seed-041.cs +33 -0
  75. package/dist/packages/crucible/seeds/csharp/seed-042.cs +27 -0
  76. package/dist/packages/crucible/seeds/csharp/seed-043.cs +27 -0
  77. package/dist/packages/crucible/seeds/csharp/seed-044.cs +25 -0
  78. package/dist/packages/crucible/seeds/csharp/seed-045.cs +30 -0
  79. package/dist/packages/crucible/seeds/csharp/seed-046.cs +29 -0
  80. package/dist/packages/crucible/seeds/csharp/seed-047.cs +26 -0
  81. package/dist/packages/crucible/seeds/csharp/seed-048.cs +31 -0
  82. package/dist/packages/crucible/seeds/csharp/seed-049.cs +27 -0
  83. package/dist/packages/crucible/seeds/csharp/seed-050.cs +30 -0
  84. package/dist/packages/crucible/seeds/csharp/seed-051.cs +34 -0
  85. package/dist/packages/crucible/seeds/csharp/seed-052.cs +36 -0
  86. package/dist/packages/crucible/seeds/go/seed-001.go +29 -0
  87. package/dist/packages/crucible/seeds/go/seed-002.go +27 -0
  88. package/dist/packages/crucible/seeds/go/seed-003.go +31 -0
  89. package/dist/packages/crucible/seeds/go/seed-004.go +27 -0
  90. package/dist/packages/crucible/seeds/go/seed-005.go +27 -0
  91. package/dist/packages/crucible/seeds/go/seed-006.go +29 -0
  92. package/dist/packages/crucible/seeds/go/seed-007.go +24 -0
  93. package/dist/packages/crucible/seeds/go/seed-008.go +25 -0
  94. package/dist/packages/crucible/seeds/go/seed-009.go +30 -0
  95. package/dist/packages/crucible/seeds/go/seed-010.go +35 -0
  96. package/dist/packages/crucible/seeds/go/seed-011.go +24 -0
  97. package/dist/packages/crucible/seeds/go/seed-012.go +24 -0
  98. package/dist/packages/crucible/seeds/go/seed-013.go +31 -0
  99. package/dist/packages/crucible/seeds/go/seed-014.go +35 -0
  100. package/dist/packages/crucible/seeds/go/seed-015.go +25 -0
  101. package/dist/packages/crucible/seeds/go/seed-016.go +19 -0
  102. package/dist/packages/crucible/seeds/go/seed-017.go +23 -0
  103. package/dist/packages/crucible/seeds/go/seed-018.go +23 -0
  104. package/dist/packages/crucible/seeds/go/seed-019.go +22 -0
  105. package/dist/packages/crucible/seeds/go/seed-020.go +31 -0
  106. package/dist/packages/crucible/seeds/go/seed-021.go +22 -0
  107. package/dist/packages/crucible/seeds/go/seed-022.go +29 -0
  108. package/dist/packages/crucible/seeds/go/seed-023.go +26 -0
  109. package/dist/packages/crucible/seeds/go/seed-024.go +27 -0
  110. package/dist/packages/crucible/seeds/go/seed-025.go +23 -0
  111. package/dist/packages/crucible/seeds/go/seed-026.go +29 -0
  112. package/dist/packages/crucible/seeds/go/seed-027.go +26 -0
  113. package/dist/packages/crucible/seeds/go/seed-028.go +23 -0
  114. package/dist/packages/crucible/seeds/go/seed-029.go +28 -0
  115. package/dist/packages/crucible/seeds/go/seed-030.go +27 -0
  116. package/dist/packages/crucible/seeds/go/seed-031.go +28 -0
  117. package/dist/packages/crucible/seeds/go/seed-032.go +27 -0
  118. package/dist/packages/crucible/seeds/go/seed-033.go +29 -0
  119. package/dist/packages/crucible/seeds/go/seed-034.go +22 -0
  120. package/dist/packages/crucible/seeds/go/seed-035.go +32 -0
  121. package/dist/packages/crucible/seeds/go/seed-036.go +27 -0
  122. package/dist/packages/crucible/seeds/go/seed-037.go +27 -0
  123. package/dist/packages/crucible/seeds/go/seed-038.go +27 -0
  124. package/dist/packages/crucible/seeds/go/seed-039.go +26 -0
  125. package/dist/packages/crucible/seeds/go/seed-040.go +37 -0
  126. package/dist/packages/crucible/seeds/go/seed-041.go +23 -0
  127. package/dist/packages/crucible/seeds/go/seed-042.go +32 -0
  128. package/dist/packages/crucible/seeds/go/seed-043.go +35 -0
  129. package/dist/packages/crucible/seeds/go/seed-044.go +25 -0
  130. package/dist/packages/crucible/seeds/go/seed-045.go +26 -0
  131. package/dist/packages/crucible/seeds/go/seed-046.go +34 -0
  132. package/dist/packages/crucible/seeds/go/seed-047.go +26 -0
  133. package/dist/packages/crucible/seeds/go/seed-048.go +29 -0
  134. package/dist/packages/crucible/seeds/go/seed-049.go +24 -0
  135. package/dist/packages/crucible/seeds/go/seed-050.go +27 -0
  136. package/dist/packages/crucible/seeds/go/seed-051.go +38 -0
  137. package/dist/packages/crucible/seeds/go/seed-052.go +27 -0
  138. package/dist/packages/crucible/seeds/java/seed-001.java +23 -0
  139. package/dist/packages/crucible/seeds/java/seed-002.java +22 -0
  140. package/dist/packages/crucible/seeds/java/seed-003.java +28 -0
  141. package/dist/packages/crucible/seeds/java/seed-004.java +26 -0
  142. package/dist/packages/crucible/seeds/java/seed-005.java +33 -0
  143. package/dist/packages/crucible/seeds/java/seed-006.java +22 -0
  144. package/dist/packages/crucible/seeds/java/seed-007.java +21 -0
  145. package/dist/packages/crucible/seeds/java/seed-008.java +29 -0
  146. package/dist/packages/crucible/seeds/java/seed-009.java +24 -0
  147. package/dist/packages/crucible/seeds/java/seed-010.java +30 -0
  148. package/dist/packages/crucible/seeds/java/seed-011.java +25 -0
  149. package/dist/packages/crucible/seeds/java/seed-012.java +20 -0
  150. package/dist/packages/crucible/seeds/java/seed-013.java +26 -0
  151. package/dist/packages/crucible/seeds/java/seed-014.java +23 -0
  152. package/dist/packages/crucible/seeds/java/seed-015.java +25 -0
  153. package/dist/packages/crucible/seeds/java/seed-016.java +22 -0
  154. package/dist/packages/crucible/seeds/java/seed-017.java +24 -0
  155. package/dist/packages/crucible/seeds/java/seed-018.java +24 -0
  156. package/dist/packages/crucible/seeds/java/seed-019.java +38 -0
  157. package/dist/packages/crucible/seeds/java/seed-020.java +24 -0
  158. package/dist/packages/crucible/seeds/java/seed-021.java +22 -0
  159. package/dist/packages/crucible/seeds/java/seed-022.java +22 -0
  160. package/dist/packages/crucible/seeds/java/seed-023.java +22 -0
  161. package/dist/packages/crucible/seeds/java/seed-024.java +25 -0
  162. package/dist/packages/crucible/seeds/java/seed-025.java +27 -0
  163. package/dist/packages/crucible/seeds/java/seed-026.java +25 -0
  164. package/dist/packages/crucible/seeds/java/seed-027.java +22 -0
  165. package/dist/packages/crucible/seeds/java/seed-028.java +21 -0
  166. package/dist/packages/crucible/seeds/java/seed-029.java +28 -0
  167. package/dist/packages/crucible/seeds/java/seed-030.java +27 -0
  168. package/dist/packages/crucible/seeds/java/seed-031.java +23 -0
  169. package/dist/packages/crucible/seeds/java/seed-032.java +22 -0
  170. package/dist/packages/crucible/seeds/java/seed-033.java +24 -0
  171. package/dist/packages/crucible/seeds/java/seed-034.java +24 -0
  172. package/dist/packages/crucible/seeds/java/seed-035.java +29 -0
  173. package/dist/packages/crucible/seeds/java/seed-036.java +25 -0
  174. package/dist/packages/crucible/seeds/java/seed-037.java +30 -0
  175. package/dist/packages/crucible/seeds/java/seed-038.java +29 -0
  176. package/dist/packages/crucible/seeds/java/seed-039.java +26 -0
  177. package/dist/packages/crucible/seeds/java/seed-040.java +31 -0
  178. package/dist/packages/crucible/seeds/java/seed-041.java +20 -0
  179. package/dist/packages/crucible/seeds/java/seed-042.java +26 -0
  180. package/dist/packages/crucible/seeds/java/seed-043.java +31 -0
  181. package/dist/packages/crucible/seeds/java/seed-044.java +22 -0
  182. package/dist/packages/crucible/seeds/java/seed-045.java +25 -0
  183. package/dist/packages/crucible/seeds/java/seed-046.java +22 -0
  184. package/dist/packages/crucible/seeds/java/seed-047.java +26 -0
  185. package/dist/packages/crucible/seeds/java/seed-048.java +24 -0
  186. package/dist/packages/crucible/seeds/java/seed-049.java +28 -0
  187. package/dist/packages/crucible/seeds/java/seed-050.java +29 -0
  188. package/dist/packages/crucible/seeds/java/seed-051.java +25 -0
  189. package/dist/packages/crucible/seeds/java/seed-052.java +32 -0
  190. package/dist/packages/crucible/seeds/js/seed-001.js +27 -0
  191. package/dist/packages/crucible/seeds/js/seed-002.js +28 -0
  192. package/dist/packages/crucible/seeds/js/seed-003.js +30 -0
  193. package/dist/packages/crucible/seeds/js/seed-004.js +28 -0
  194. package/dist/packages/crucible/seeds/js/seed-005.js +31 -0
  195. package/dist/packages/crucible/seeds/js/seed-006.js +28 -0
  196. package/dist/packages/crucible/seeds/js/seed-007.js +26 -0
  197. package/dist/packages/crucible/seeds/js/seed-008.js +30 -0
  198. package/dist/packages/crucible/seeds/js/seed-009.js +30 -0
  199. package/dist/packages/crucible/seeds/js/seed-010.js +29 -0
  200. package/dist/packages/crucible/seeds/js/seed-011.js +34 -0
  201. package/dist/packages/crucible/seeds/js/seed-012.js +32 -0
  202. package/dist/packages/crucible/seeds/js/seed-013.js +29 -0
  203. package/dist/packages/crucible/seeds/js/seed-014.js +29 -0
  204. package/dist/packages/crucible/seeds/js/seed-015.js +31 -0
  205. package/dist/packages/crucible/seeds/js/seed-016.js +31 -0
  206. package/dist/packages/crucible/seeds/js/seed-017.js +30 -0
  207. package/dist/packages/crucible/seeds/js/seed-018.js +29 -0
  208. package/dist/packages/crucible/seeds/js/seed-019.js +32 -0
  209. package/dist/packages/crucible/seeds/js/seed-020.js +29 -0
  210. package/dist/packages/crucible/seeds/js/seed-021.js +31 -0
  211. package/dist/packages/crucible/seeds/js/seed-022.js +31 -0
  212. package/dist/packages/crucible/seeds/js/seed-023.js +29 -0
  213. package/dist/packages/crucible/seeds/js/seed-024.js +29 -0
  214. package/dist/packages/crucible/seeds/js/seed-025.js +34 -0
  215. package/dist/packages/crucible/seeds/js/seed-026.js +31 -0
  216. package/dist/packages/crucible/seeds/js/seed-027.js +31 -0
  217. package/dist/packages/crucible/seeds/js/seed-028.js +33 -0
  218. package/dist/packages/crucible/seeds/js/seed-029.js +33 -0
  219. package/dist/packages/crucible/seeds/js/seed-030.js +30 -0
  220. package/dist/packages/crucible/seeds/js/seed-031.js +31 -0
  221. package/dist/packages/crucible/seeds/js/seed-032.js +34 -0
  222. package/dist/packages/crucible/seeds/js/seed-033.js +33 -0
  223. package/dist/packages/crucible/seeds/js/seed-034.js +33 -0
  224. package/dist/packages/crucible/seeds/js/seed-035.js +30 -0
  225. package/dist/packages/crucible/seeds/js/seed-036.js +30 -0
  226. package/dist/packages/crucible/seeds/js/seed-037.js +29 -0
  227. package/dist/packages/crucible/seeds/js/seed-038.js +31 -0
  228. package/dist/packages/crucible/seeds/js/seed-039.js +34 -0
  229. package/dist/packages/crucible/seeds/js/seed-040.js +35 -0
  230. package/dist/packages/crucible/seeds/js/seed-041.js +32 -0
  231. package/dist/packages/crucible/seeds/js/seed-042.js +32 -0
  232. package/dist/packages/crucible/seeds/js/seed-043.js +27 -0
  233. package/dist/packages/crucible/seeds/js/seed-044.js +29 -0
  234. package/dist/packages/crucible/seeds/js/seed-045.js +33 -0
  235. package/dist/packages/crucible/seeds/js/seed-046.js +33 -0
  236. package/dist/packages/crucible/seeds/js/seed-047.js +29 -0
  237. package/dist/packages/crucible/seeds/js/seed-048.js +29 -0
  238. package/dist/packages/crucible/seeds/js/seed-049.js +34 -0
  239. package/dist/packages/crucible/seeds/js/seed-050.js +34 -0
  240. package/dist/packages/crucible/seeds/js/seed-051.js +30 -0
  241. package/dist/packages/crucible/seeds/js/seed-052.js +30 -0
  242. package/dist/packages/crucible/seeds/js/seed-053.js +26 -0
  243. package/dist/packages/crucible/seeds/js/seed-054.js +35 -0
  244. package/dist/packages/crucible/seeds/js/seed-055.js +33 -0
  245. package/dist/packages/crucible/seeds/kotlin/seed-001.kt +24 -0
  246. package/dist/packages/crucible/seeds/kotlin/seed-002.kt +27 -0
  247. package/dist/packages/crucible/seeds/kotlin/seed-003.kt +29 -0
  248. package/dist/packages/crucible/seeds/kotlin/seed-004.kt +24 -0
  249. package/dist/packages/crucible/seeds/kotlin/seed-005.kt +29 -0
  250. package/dist/packages/crucible/seeds/kotlin/seed-006.kt +21 -0
  251. package/dist/packages/crucible/seeds/kotlin/seed-007.kt +23 -0
  252. package/dist/packages/crucible/seeds/kotlin/seed-008.kt +25 -0
  253. package/dist/packages/crucible/seeds/kotlin/seed-009.kt +21 -0
  254. package/dist/packages/crucible/seeds/kotlin/seed-010.kt +28 -0
  255. package/dist/packages/crucible/seeds/kotlin/seed-011.kt +22 -0
  256. package/dist/packages/crucible/seeds/kotlin/seed-012.kt +25 -0
  257. package/dist/packages/crucible/seeds/kotlin/seed-013.kt +30 -0
  258. package/dist/packages/crucible/seeds/kotlin/seed-014.kt +27 -0
  259. package/dist/packages/crucible/seeds/kotlin/seed-015.kt +24 -0
  260. package/dist/packages/crucible/seeds/kotlin/seed-016.kt +28 -0
  261. package/dist/packages/crucible/seeds/kotlin/seed-017.kt +33 -0
  262. package/dist/packages/crucible/seeds/kotlin/seed-018.kt +31 -0
  263. package/dist/packages/crucible/seeds/kotlin/seed-019.kt +28 -0
  264. package/dist/packages/crucible/seeds/kotlin/seed-020.kt +31 -0
  265. package/dist/packages/crucible/seeds/kotlin/seed-021.kt +34 -0
  266. package/dist/packages/crucible/seeds/kotlin/seed-022.kt +29 -0
  267. package/dist/packages/crucible/seeds/kotlin/seed-023.kt +20 -0
  268. package/dist/packages/crucible/seeds/kotlin/seed-024.kt +23 -0
  269. package/dist/packages/crucible/seeds/kotlin/seed-025.kt +23 -0
  270. package/dist/packages/crucible/seeds/kotlin/seed-026.kt +26 -0
  271. package/dist/packages/crucible/seeds/kotlin/seed-027.kt +29 -0
  272. package/dist/packages/crucible/seeds/kotlin/seed-028.kt +24 -0
  273. package/dist/packages/crucible/seeds/kotlin/seed-029.kt +27 -0
  274. package/dist/packages/crucible/seeds/kotlin/seed-030.kt +26 -0
  275. package/dist/packages/crucible/seeds/kotlin/seed-031.kt +28 -0
  276. package/dist/packages/crucible/seeds/kotlin/seed-032.kt +29 -0
  277. package/dist/packages/crucible/seeds/kotlin/seed-033.kt +30 -0
  278. package/dist/packages/crucible/seeds/kotlin/seed-034.kt +26 -0
  279. package/dist/packages/crucible/seeds/kotlin/seed-035.kt +33 -0
  280. package/dist/packages/crucible/seeds/kotlin/seed-036.kt +25 -0
  281. package/dist/packages/crucible/seeds/kotlin/seed-037.kt +26 -0
  282. package/dist/packages/crucible/seeds/kotlin/seed-038.kt +25 -0
  283. package/dist/packages/crucible/seeds/kotlin/seed-039.kt +29 -0
  284. package/dist/packages/crucible/seeds/kotlin/seed-040.kt +28 -0
  285. package/dist/packages/crucible/seeds/kotlin/seed-041.kt +31 -0
  286. package/dist/packages/crucible/seeds/kotlin/seed-042.kt +27 -0
  287. package/dist/packages/crucible/seeds/kotlin/seed-043.kt +26 -0
  288. package/dist/packages/crucible/seeds/kotlin/seed-044.kt +27 -0
  289. package/dist/packages/crucible/seeds/kotlin/seed-045.kt +27 -0
  290. package/dist/packages/crucible/seeds/kotlin/seed-046.kt +33 -0
  291. package/dist/packages/crucible/seeds/kotlin/seed-047.kt +32 -0
  292. package/dist/packages/crucible/seeds/kotlin/seed-048.kt +20 -0
  293. package/dist/packages/crucible/seeds/kotlin/seed-049.kt +23 -0
  294. package/dist/packages/crucible/seeds/kotlin/seed-050.kt +19 -0
  295. package/dist/packages/crucible/seeds/php/seed-001.php +23 -0
  296. package/dist/packages/crucible/seeds/php/seed-002.php +18 -0
  297. package/dist/packages/crucible/seeds/php/seed-003.php +25 -0
  298. package/dist/packages/crucible/seeds/php/seed-004.php +21 -0
  299. package/dist/packages/crucible/seeds/php/seed-005.php +21 -0
  300. package/dist/packages/crucible/seeds/php/seed-006.php +21 -0
  301. package/dist/packages/crucible/seeds/php/seed-007.php +18 -0
  302. package/dist/packages/crucible/seeds/php/seed-008.php +19 -0
  303. package/dist/packages/crucible/seeds/php/seed-009.php +24 -0
  304. package/dist/packages/crucible/seeds/php/seed-010.php +24 -0
  305. package/dist/packages/crucible/seeds/php/seed-011.php +18 -0
  306. package/dist/packages/crucible/seeds/php/seed-012.php +24 -0
  307. package/dist/packages/crucible/seeds/php/seed-013.php +23 -0
  308. package/dist/packages/crucible/seeds/php/seed-014.php +20 -0
  309. package/dist/packages/crucible/seeds/php/seed-015.php +18 -0
  310. package/dist/packages/crucible/seeds/php/seed-016.php +18 -0
  311. package/dist/packages/crucible/seeds/php/seed-017.php +18 -0
  312. package/dist/packages/crucible/seeds/php/seed-018.php +17 -0
  313. package/dist/packages/crucible/seeds/php/seed-019.php +24 -0
  314. package/dist/packages/crucible/seeds/php/seed-020.php +19 -0
  315. package/dist/packages/crucible/seeds/php/seed-021.php +22 -0
  316. package/dist/packages/crucible/seeds/php/seed-022.php +15 -0
  317. package/dist/packages/crucible/seeds/php/seed-023.php +24 -0
  318. package/dist/packages/crucible/seeds/php/seed-024.php +22 -0
  319. package/dist/packages/crucible/seeds/php/seed-025.php +20 -0
  320. package/dist/packages/crucible/seeds/php/seed-026.php +22 -0
  321. package/dist/packages/crucible/seeds/php/seed-027.php +15 -0
  322. package/dist/packages/crucible/seeds/php/seed-028.php +15 -0
  323. package/dist/packages/crucible/seeds/php/seed-029.php +21 -0
  324. package/dist/packages/crucible/seeds/php/seed-030.php +21 -0
  325. package/dist/packages/crucible/seeds/php/seed-031.php +23 -0
  326. package/dist/packages/crucible/seeds/php/seed-032.php +18 -0
  327. package/dist/packages/crucible/seeds/php/seed-033.php +18 -0
  328. package/dist/packages/crucible/seeds/php/seed-034.php +24 -0
  329. package/dist/packages/crucible/seeds/php/seed-035.php +22 -0
  330. package/dist/packages/crucible/seeds/php/seed-036.php +17 -0
  331. package/dist/packages/crucible/seeds/php/seed-037.php +19 -0
  332. package/dist/packages/crucible/seeds/php/seed-038.php +20 -0
  333. package/dist/packages/crucible/seeds/php/seed-039.php +15 -0
  334. package/dist/packages/crucible/seeds/php/seed-040.php +21 -0
  335. package/dist/packages/crucible/seeds/php/seed-041.php +20 -0
  336. package/dist/packages/crucible/seeds/php/seed-042.php +21 -0
  337. package/dist/packages/crucible/seeds/php/seed-043.php +21 -0
  338. package/dist/packages/crucible/seeds/php/seed-044.php +25 -0
  339. package/dist/packages/crucible/seeds/php/seed-045.php +25 -0
  340. package/dist/packages/crucible/seeds/php/seed-046.php +20 -0
  341. package/dist/packages/crucible/seeds/php/seed-047.php +21 -0
  342. package/dist/packages/crucible/seeds/php/seed-048.php +19 -0
  343. package/dist/packages/crucible/seeds/php/seed-049.php +18 -0
  344. package/dist/packages/crucible/seeds/php/seed-050.php +20 -0
  345. package/dist/packages/crucible/seeds/python/seed-001.py +33 -0
  346. package/dist/packages/crucible/seeds/python/seed-002.py +39 -0
  347. package/dist/packages/crucible/seeds/python/seed-003.py +31 -0
  348. package/dist/packages/crucible/seeds/python/seed-004.py +33 -0
  349. package/dist/packages/crucible/seeds/python/seed-005.py +33 -0
  350. package/dist/packages/crucible/seeds/python/seed-006.py +34 -0
  351. package/dist/packages/crucible/seeds/python/seed-007.py +33 -0
  352. package/dist/packages/crucible/seeds/python/seed-008.py +38 -0
  353. package/dist/packages/crucible/seeds/python/seed-009.py +38 -0
  354. package/dist/packages/crucible/seeds/python/seed-010.py +42 -0
  355. package/dist/packages/crucible/seeds/python/seed-011.py +30 -0
  356. package/dist/packages/crucible/seeds/python/seed-012.py +35 -0
  357. package/dist/packages/crucible/seeds/python/seed-013.py +33 -0
  358. package/dist/packages/crucible/seeds/python/seed-014.py +40 -0
  359. package/dist/packages/crucible/seeds/python/seed-015.py +33 -0
  360. package/dist/packages/crucible/seeds/python/seed-016.py +34 -0
  361. package/dist/packages/crucible/seeds/python/seed-017.py +34 -0
  362. package/dist/packages/crucible/seeds/python/seed-018.py +30 -0
  363. package/dist/packages/crucible/seeds/python/seed-019.py +33 -0
  364. package/dist/packages/crucible/seeds/python/seed-020.py +37 -0
  365. package/dist/packages/crucible/seeds/python/seed-021 2.py +37 -0
  366. package/dist/packages/crucible/seeds/python/seed-021.py +37 -0
  367. package/dist/packages/crucible/seeds/python/seed-022 2.py +34 -0
  368. package/dist/packages/crucible/seeds/python/seed-022.py +34 -0
  369. package/dist/packages/crucible/seeds/python/seed-023 2.py +37 -0
  370. package/dist/packages/crucible/seeds/python/seed-023.py +37 -0
  371. package/dist/packages/crucible/seeds/python/seed-024 2.py +38 -0
  372. package/dist/packages/crucible/seeds/python/seed-024.py +38 -0
  373. package/dist/packages/crucible/seeds/python/seed-025 2.py +40 -0
  374. package/dist/packages/crucible/seeds/python/seed-025.py +40 -0
  375. package/dist/packages/crucible/seeds/python/seed-026 2.py +35 -0
  376. package/dist/packages/crucible/seeds/python/seed-026.py +35 -0
  377. package/dist/packages/crucible/seeds/python/seed-027 2.py +35 -0
  378. package/dist/packages/crucible/seeds/python/seed-027.py +35 -0
  379. package/dist/packages/crucible/seeds/python/seed-028 2.py +42 -0
  380. package/dist/packages/crucible/seeds/python/seed-028.py +42 -0
  381. package/dist/packages/crucible/seeds/python/seed-029.py +42 -0
  382. package/dist/packages/crucible/seeds/python/seed-030 2.py +37 -0
  383. package/dist/packages/crucible/seeds/python/seed-030.py +37 -0
  384. package/dist/packages/crucible/seeds/python/seed-031 2.py +34 -0
  385. package/dist/packages/crucible/seeds/python/seed-031.py +34 -0
  386. package/dist/packages/crucible/seeds/python/seed-032.py +33 -0
  387. package/dist/packages/crucible/seeds/python/seed-033.py +32 -0
  388. package/dist/packages/crucible/seeds/python/seed-034.py +38 -0
  389. package/dist/packages/crucible/seeds/python/seed-035.py +35 -0
  390. package/dist/packages/crucible/seeds/python/seed-036 2.py +33 -0
  391. package/dist/packages/crucible/seeds/python/seed-036.py +33 -0
  392. package/dist/packages/crucible/seeds/python/seed-037 2.py +41 -0
  393. package/dist/packages/crucible/seeds/python/seed-037.py +41 -0
  394. package/dist/packages/crucible/seeds/python/seed-038 2.py +33 -0
  395. package/dist/packages/crucible/seeds/python/seed-038.py +33 -0
  396. package/dist/packages/crucible/seeds/python/seed-039 2.py +39 -0
  397. package/dist/packages/crucible/seeds/python/seed-039.py +39 -0
  398. package/dist/packages/crucible/seeds/python/seed-040 2.py +39 -0
  399. package/dist/packages/crucible/seeds/python/seed-040.py +39 -0
  400. package/dist/packages/crucible/seeds/python/seed-041 2.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.py +38 -0
  404. package/dist/packages/crucible/seeds/python/seed-043 2.py +32 -0
  405. package/dist/packages/crucible/seeds/python/seed-043.py +32 -0
  406. package/dist/packages/crucible/seeds/python/seed-044 2.py +38 -0
  407. package/dist/packages/crucible/seeds/python/seed-044.py +38 -0
  408. package/dist/packages/crucible/seeds/python/seed-045 2.py +36 -0
  409. package/dist/packages/crucible/seeds/python/seed-045.py +36 -0
  410. package/dist/packages/crucible/seeds/python/seed-046 2.py +33 -0
  411. package/dist/packages/crucible/seeds/python/seed-046.py +33 -0
  412. package/dist/packages/crucible/seeds/python/seed-047 2.py +44 -0
  413. package/dist/packages/crucible/seeds/python/seed-047.py +44 -0
  414. package/dist/packages/crucible/seeds/python/seed-048 2.py +35 -0
  415. package/dist/packages/crucible/seeds/python/seed-048.py +35 -0
  416. package/dist/packages/crucible/seeds/python/seed-049 2.py +39 -0
  417. package/dist/packages/crucible/seeds/python/seed-049.py +39 -0
  418. package/dist/packages/crucible/seeds/python/seed-050 2.py +39 -0
  419. package/dist/packages/crucible/seeds/python/seed-050.py +39 -0
  420. package/dist/packages/crucible/seeds/python/seed-051 2.py +38 -0
  421. package/dist/packages/crucible/seeds/python/seed-051.py +38 -0
  422. package/dist/packages/crucible/seeds/python/seed-052 2.py +41 -0
  423. package/dist/packages/crucible/seeds/python/seed-052.py +41 -0
  424. package/dist/packages/crucible/seeds/ruby/seed-001 2.rb +15 -0
  425. package/dist/packages/crucible/seeds/ruby/seed-001.rb +15 -0
  426. package/dist/packages/crucible/seeds/ruby/seed-002 2.rb +22 -0
  427. package/dist/packages/crucible/seeds/ruby/seed-002.rb +22 -0
  428. package/dist/packages/crucible/seeds/ruby/seed-003 2.rb +25 -0
  429. package/dist/packages/crucible/seeds/ruby/seed-003.rb +25 -0
  430. package/dist/packages/crucible/seeds/ruby/seed-004 2.rb +17 -0
  431. package/dist/packages/crucible/seeds/ruby/seed-004.rb +17 -0
  432. package/dist/packages/crucible/seeds/ruby/seed-005 2.rb +21 -0
  433. package/dist/packages/crucible/seeds/ruby/seed-005.rb +21 -0
  434. package/dist/packages/crucible/seeds/ruby/seed-006 2.rb +17 -0
  435. package/dist/packages/crucible/seeds/ruby/seed-006.rb +17 -0
  436. package/dist/packages/crucible/seeds/ruby/seed-007 2.rb +16 -0
  437. package/dist/packages/crucible/seeds/ruby/seed-007.rb +16 -0
  438. package/dist/packages/crucible/seeds/ruby/seed-008 2.rb +18 -0
  439. package/dist/packages/crucible/seeds/ruby/seed-008.rb +18 -0
  440. package/dist/packages/crucible/seeds/ruby/seed-009 2.rb +20 -0
  441. package/dist/packages/crucible/seeds/ruby/seed-009.rb +20 -0
  442. package/dist/packages/crucible/seeds/ruby/seed-010 2.rb +24 -0
  443. package/dist/packages/crucible/seeds/ruby/seed-010.rb +24 -0
  444. package/dist/packages/crucible/seeds/ruby/seed-011 2.rb +21 -0
  445. package/dist/packages/crucible/seeds/ruby/seed-011.rb +21 -0
  446. package/dist/packages/crucible/seeds/ruby/seed-012 2.rb +22 -0
  447. package/dist/packages/crucible/seeds/ruby/seed-012.rb +22 -0
  448. package/dist/packages/crucible/seeds/ruby/seed-013 2.rb +21 -0
  449. package/dist/packages/crucible/seeds/ruby/seed-013.rb +21 -0
  450. package/dist/packages/crucible/seeds/ruby/seed-014 2.rb +16 -0
  451. package/dist/packages/crucible/seeds/ruby/seed-014.rb +16 -0
  452. package/dist/packages/crucible/seeds/ruby/seed-015 2.rb +18 -0
  453. package/dist/packages/crucible/seeds/ruby/seed-015.rb +18 -0
  454. package/dist/packages/crucible/seeds/ruby/seed-016 2.rb +17 -0
  455. package/dist/packages/crucible/seeds/ruby/seed-016.rb +17 -0
  456. package/dist/packages/crucible/seeds/ruby/seed-017 2.rb +25 -0
  457. package/dist/packages/crucible/seeds/ruby/seed-017.rb +25 -0
  458. package/dist/packages/crucible/seeds/ruby/seed-018 2.rb +23 -0
  459. package/dist/packages/crucible/seeds/ruby/seed-018.rb +23 -0
  460. package/dist/packages/crucible/seeds/ruby/seed-019 2.rb +20 -0
  461. package/dist/packages/crucible/seeds/ruby/seed-019.rb +20 -0
  462. package/dist/packages/crucible/seeds/ruby/seed-020 2.rb +17 -0
  463. package/dist/packages/crucible/seeds/ruby/seed-020.rb +17 -0
  464. package/dist/packages/crucible/seeds/ruby/seed-021 2.rb +20 -0
  465. package/dist/packages/crucible/seeds/ruby/seed-021.rb +20 -0
  466. package/dist/packages/crucible/seeds/ruby/seed-022 2.rb +21 -0
  467. package/dist/packages/crucible/seeds/ruby/seed-022.rb +21 -0
  468. package/dist/packages/crucible/seeds/ruby/seed-023 2.rb +19 -0
  469. package/dist/packages/crucible/seeds/ruby/seed-023.rb +19 -0
  470. package/dist/packages/crucible/seeds/ruby/seed-024 2.rb +17 -0
  471. package/dist/packages/crucible/seeds/ruby/seed-024.rb +17 -0
  472. package/dist/packages/crucible/seeds/ruby/seed-025 2.rb +17 -0
  473. package/dist/packages/crucible/seeds/ruby/seed-025.rb +17 -0
  474. package/dist/packages/crucible/seeds/ruby/seed-026 2.rb +18 -0
  475. package/dist/packages/crucible/seeds/ruby/seed-026.rb +18 -0
  476. package/dist/packages/crucible/seeds/ruby/seed-027 2.rb +21 -0
  477. package/dist/packages/crucible/seeds/ruby/seed-027.rb +21 -0
  478. package/dist/packages/crucible/seeds/ruby/seed-028 2.rb +22 -0
  479. package/dist/packages/crucible/seeds/ruby/seed-028.rb +22 -0
  480. package/dist/packages/crucible/seeds/ruby/seed-029 2.rb +19 -0
  481. package/dist/packages/crucible/seeds/ruby/seed-029.rb +19 -0
  482. package/dist/packages/crucible/seeds/ruby/seed-030 2.rb +20 -0
  483. package/dist/packages/crucible/seeds/ruby/seed-030.rb +20 -0
  484. package/dist/packages/crucible/seeds/ruby/seed-031 2.rb +17 -0
  485. package/dist/packages/crucible/seeds/ruby/seed-031.rb +17 -0
  486. package/dist/packages/crucible/seeds/ruby/seed-032 2.rb +22 -0
  487. package/dist/packages/crucible/seeds/ruby/seed-032.rb +22 -0
  488. package/dist/packages/crucible/seeds/ruby/seed-033 2.rb +18 -0
  489. package/dist/packages/crucible/seeds/ruby/seed-033.rb +18 -0
  490. package/dist/packages/crucible/seeds/ruby/seed-034 2.rb +19 -0
  491. package/dist/packages/crucible/seeds/ruby/seed-034.rb +19 -0
  492. package/dist/packages/crucible/seeds/ruby/seed-035 2.rb +19 -0
  493. package/dist/packages/crucible/seeds/ruby/seed-035.rb +19 -0
  494. package/dist/packages/crucible/seeds/ruby/seed-036 2.rb +18 -0
  495. package/dist/packages/crucible/seeds/ruby/seed-036.rb +18 -0
  496. package/dist/packages/crucible/seeds/ruby/seed-037 2.rb +21 -0
  497. package/dist/packages/crucible/seeds/ruby/seed-037.rb +21 -0
  498. package/dist/packages/crucible/seeds/ruby/seed-038 2.rb +24 -0
  499. package/dist/packages/crucible/seeds/ruby/seed-038.rb +24 -0
  500. package/dist/packages/crucible/seeds/ruby/seed-039 2.rb +24 -0
  501. package/dist/packages/crucible/seeds/ruby/seed-039.rb +24 -0
  502. package/dist/packages/crucible/seeds/ruby/seed-040 2.rb +22 -0
  503. package/dist/packages/crucible/seeds/ruby/seed-040.rb +22 -0
  504. package/dist/packages/crucible/seeds/ruby/seed-041 2.rb +23 -0
  505. package/dist/packages/crucible/seeds/ruby/seed-041.rb +23 -0
  506. package/dist/packages/crucible/seeds/ruby/seed-042 2.rb +25 -0
  507. package/dist/packages/crucible/seeds/ruby/seed-042.rb +25 -0
  508. package/dist/packages/crucible/seeds/ruby/seed-043 2.rb +23 -0
  509. package/dist/packages/crucible/seeds/ruby/seed-043.rb +23 -0
  510. package/dist/packages/crucible/seeds/ruby/seed-044 2.rb +16 -0
  511. package/dist/packages/crucible/seeds/ruby/seed-044.rb +16 -0
  512. package/dist/packages/crucible/seeds/ruby/seed-045 2.rb +22 -0
  513. package/dist/packages/crucible/seeds/ruby/seed-045.rb +22 -0
  514. package/dist/packages/crucible/seeds/ruby/seed-046 2.rb +27 -0
  515. package/dist/packages/crucible/seeds/ruby/seed-046.rb +27 -0
  516. package/dist/packages/crucible/seeds/ruby/seed-047 2.rb +26 -0
  517. package/dist/packages/crucible/seeds/ruby/seed-047.rb +26 -0
  518. package/dist/packages/crucible/seeds/ruby/seed-048 2.rb +24 -0
  519. package/dist/packages/crucible/seeds/ruby/seed-048.rb +24 -0
  520. package/dist/packages/crucible/seeds/ruby/seed-049 2.rb +20 -0
  521. package/dist/packages/crucible/seeds/ruby/seed-049.rb +20 -0
  522. package/dist/packages/crucible/seeds/ruby/seed-050 2.rb +27 -0
  523. package/dist/packages/crucible/seeds/ruby/seed-050.rb +27 -0
  524. package/dist/packages/crucible/seeds/rust/seed-001 2.rs +25 -0
  525. package/dist/packages/crucible/seeds/rust/seed-001.rs +25 -0
  526. package/dist/packages/crucible/seeds/rust/seed-002 2.rs +20 -0
  527. package/dist/packages/crucible/seeds/rust/seed-002.rs +20 -0
  528. package/dist/packages/crucible/seeds/rust/seed-003 2.rs +23 -0
  529. package/dist/packages/crucible/seeds/rust/seed-003.rs +23 -0
  530. package/dist/packages/crucible/seeds/rust/seed-004 2.rs +21 -0
  531. package/dist/packages/crucible/seeds/rust/seed-004.rs +21 -0
  532. package/dist/packages/crucible/seeds/rust/seed-005 2.rs +21 -0
  533. package/dist/packages/crucible/seeds/rust/seed-005.rs +21 -0
  534. package/dist/packages/crucible/seeds/rust/seed-006 2.rs +24 -0
  535. package/dist/packages/crucible/seeds/rust/seed-006.rs +24 -0
  536. package/dist/packages/crucible/seeds/rust/seed-007 2.rs +20 -0
  537. package/dist/packages/crucible/seeds/rust/seed-007.rs +20 -0
  538. package/dist/packages/crucible/seeds/rust/seed-008 2.rs +19 -0
  539. package/dist/packages/crucible/seeds/rust/seed-008.rs +19 -0
  540. package/dist/packages/crucible/seeds/rust/seed-009 2.rs +28 -0
  541. package/dist/packages/crucible/seeds/rust/seed-009.rs +28 -0
  542. package/dist/packages/crucible/seeds/rust/seed-010 2.rs +28 -0
  543. package/dist/packages/crucible/seeds/rust/seed-010.rs +28 -0
  544. package/dist/packages/crucible/seeds/rust/seed-011 2.rs +25 -0
  545. package/dist/packages/crucible/seeds/rust/seed-011.rs +25 -0
  546. package/dist/packages/crucible/seeds/rust/seed-012 2.rs +31 -0
  547. package/dist/packages/crucible/seeds/rust/seed-012.rs +31 -0
  548. package/dist/packages/crucible/seeds/rust/seed-013 2.rs +27 -0
  549. package/dist/packages/crucible/seeds/rust/seed-013.rs +27 -0
  550. package/dist/packages/crucible/seeds/rust/seed-014 2.rs +30 -0
  551. package/dist/packages/crucible/seeds/rust/seed-014.rs +30 -0
  552. package/dist/packages/crucible/seeds/rust/seed-015 2.rs +33 -0
  553. package/dist/packages/crucible/seeds/rust/seed-015.rs +33 -0
  554. package/dist/packages/crucible/seeds/rust/seed-016 2.rs +22 -0
  555. package/dist/packages/crucible/seeds/rust/seed-016.rs +22 -0
  556. package/dist/packages/crucible/seeds/rust/seed-017 2.rs +28 -0
  557. package/dist/packages/crucible/seeds/rust/seed-017.rs +28 -0
  558. package/dist/packages/crucible/seeds/rust/seed-018 2.rs +21 -0
  559. package/dist/packages/crucible/seeds/rust/seed-018.rs +21 -0
  560. package/dist/packages/crucible/seeds/rust/seed-019 2.rs +36 -0
  561. package/dist/packages/crucible/seeds/rust/seed-019.rs +36 -0
  562. package/dist/packages/crucible/seeds/rust/seed-020 2.rs +27 -0
  563. package/dist/packages/crucible/seeds/rust/seed-020.rs +27 -0
  564. package/dist/packages/crucible/seeds/rust/seed-021 2.rs +26 -0
  565. package/dist/packages/crucible/seeds/rust/seed-021.rs +26 -0
  566. package/dist/packages/crucible/seeds/rust/seed-022 2.rs +23 -0
  567. package/dist/packages/crucible/seeds/rust/seed-022.rs +23 -0
  568. package/dist/packages/crucible/seeds/rust/seed-023 2.rs +22 -0
  569. package/dist/packages/crucible/seeds/rust/seed-023.rs +22 -0
  570. package/dist/packages/crucible/seeds/rust/seed-024 2.rs +24 -0
  571. package/dist/packages/crucible/seeds/rust/seed-024.rs +24 -0
  572. package/dist/packages/crucible/seeds/rust/seed-025 2.rs +29 -0
  573. package/dist/packages/crucible/seeds/rust/seed-025.rs +29 -0
  574. package/dist/packages/crucible/seeds/rust/seed-026 2.rs +23 -0
  575. package/dist/packages/crucible/seeds/rust/seed-026.rs +23 -0
  576. package/dist/packages/crucible/seeds/rust/seed-027 2.rs +24 -0
  577. package/dist/packages/crucible/seeds/rust/seed-027.rs +24 -0
  578. package/dist/packages/crucible/seeds/rust/seed-028 2.rs +25 -0
  579. package/dist/packages/crucible/seeds/rust/seed-028.rs +25 -0
  580. package/dist/packages/crucible/seeds/rust/seed-029 2.rs +25 -0
  581. package/dist/packages/crucible/seeds/rust/seed-029.rs +25 -0
  582. package/dist/packages/crucible/seeds/rust/seed-030 2.rs +30 -0
  583. package/dist/packages/crucible/seeds/rust/seed-030.rs +30 -0
  584. package/dist/packages/crucible/seeds/rust/seed-031 2.rs +22 -0
  585. package/dist/packages/crucible/seeds/rust/seed-031.rs +22 -0
  586. package/dist/packages/crucible/seeds/rust/seed-032 2.rs +25 -0
  587. package/dist/packages/crucible/seeds/rust/seed-032.rs +25 -0
  588. package/dist/packages/crucible/seeds/rust/seed-033 2.rs +25 -0
  589. package/dist/packages/crucible/seeds/rust/seed-033.rs +25 -0
  590. package/dist/packages/crucible/seeds/rust/seed-034 2.rs +20 -0
  591. package/dist/packages/crucible/seeds/rust/seed-034.rs +20 -0
  592. package/dist/packages/crucible/seeds/rust/seed-035 2.rs +28 -0
  593. package/dist/packages/crucible/seeds/rust/seed-035.rs +28 -0
  594. package/dist/packages/crucible/seeds/rust/seed-036 2.rs +26 -0
  595. package/dist/packages/crucible/seeds/rust/seed-036.rs +26 -0
  596. package/dist/packages/crucible/seeds/rust/seed-037 2.rs +31 -0
  597. package/dist/packages/crucible/seeds/rust/seed-037.rs +31 -0
  598. package/dist/packages/crucible/seeds/rust/seed-038 2.rs +25 -0
  599. package/dist/packages/crucible/seeds/rust/seed-038.rs +25 -0
  600. package/dist/packages/crucible/seeds/rust/seed-039 2.rs +28 -0
  601. package/dist/packages/crucible/seeds/rust/seed-039.rs +28 -0
  602. package/dist/packages/crucible/seeds/rust/seed-040 2.rs +27 -0
  603. package/dist/packages/crucible/seeds/rust/seed-040.rs +27 -0
  604. package/dist/packages/crucible/seeds/rust/seed-041 2.rs +32 -0
  605. package/dist/packages/crucible/seeds/rust/seed-041.rs +32 -0
  606. package/dist/packages/crucible/seeds/rust/seed-042 2.rs +27 -0
  607. package/dist/packages/crucible/seeds/rust/seed-042.rs +27 -0
  608. package/dist/packages/crucible/seeds/rust/seed-043 2.rs +29 -0
  609. package/dist/packages/crucible/seeds/rust/seed-043.rs +29 -0
  610. package/dist/packages/crucible/seeds/rust/seed-044 2.rs +25 -0
  611. package/dist/packages/crucible/seeds/rust/seed-044.rs +25 -0
  612. package/dist/packages/crucible/seeds/rust/seed-045 2.rs +28 -0
  613. package/dist/packages/crucible/seeds/rust/seed-045.rs +28 -0
  614. package/dist/packages/crucible/seeds/rust/seed-046 2.rs +25 -0
  615. package/dist/packages/crucible/seeds/rust/seed-046.rs +25 -0
  616. package/dist/packages/crucible/seeds/rust/seed-047 2.rs +34 -0
  617. package/dist/packages/crucible/seeds/rust/seed-047.rs +34 -0
  618. package/dist/packages/crucible/seeds/rust/seed-048 2.rs +21 -0
  619. package/dist/packages/crucible/seeds/rust/seed-048.rs +21 -0
  620. package/dist/packages/crucible/seeds/rust/seed-049 2.rs +26 -0
  621. package/dist/packages/crucible/seeds/rust/seed-049.rs +26 -0
  622. package/dist/packages/crucible/seeds/rust/seed-050 2.rs +23 -0
  623. package/dist/packages/crucible/seeds/rust/seed-050.rs +23 -0
  624. package/dist/packages/crucible/seeds/ts/seed-001 2.ts +32 -0
  625. package/dist/packages/crucible/seeds/ts/seed-001.ts +32 -0
  626. package/dist/packages/crucible/seeds/ts/seed-002 2.ts +34 -0
  627. package/dist/packages/crucible/seeds/ts/seed-002.ts +34 -0
  628. package/dist/packages/crucible/seeds/ts/seed-003 2.ts +28 -0
  629. package/dist/packages/crucible/seeds/ts/seed-003.ts +28 -0
  630. package/dist/packages/crucible/seeds/ts/seed-004 2.ts +34 -0
  631. package/dist/packages/crucible/seeds/ts/seed-004.ts +34 -0
  632. package/dist/packages/crucible/seeds/ts/seed-005 2.ts +32 -0
  633. package/dist/packages/crucible/seeds/ts/seed-005.ts +32 -0
  634. package/dist/packages/crucible/seeds/ts/seed-006 2.ts +31 -0
  635. package/dist/packages/crucible/seeds/ts/seed-006.ts +31 -0
  636. package/dist/packages/crucible/seeds/ts/seed-007 2.ts +28 -0
  637. package/dist/packages/crucible/seeds/ts/seed-007.ts +28 -0
  638. package/dist/packages/crucible/seeds/ts/seed-008 2.ts +40 -0
  639. package/dist/packages/crucible/seeds/ts/seed-008.ts +40 -0
  640. package/dist/packages/crucible/seeds/ts/seed-009 2.ts +31 -0
  641. package/dist/packages/crucible/seeds/ts/seed-009.ts +31 -0
  642. package/dist/packages/crucible/seeds/ts/seed-010 2.ts +33 -0
  643. package/dist/packages/crucible/seeds/ts/seed-010.ts +33 -0
  644. package/dist/packages/crucible/seeds/ts/seed-011 2.ts +29 -0
  645. package/dist/packages/crucible/seeds/ts/seed-011.ts +29 -0
  646. package/dist/packages/crucible/seeds/ts/seed-012 2.ts +34 -0
  647. package/dist/packages/crucible/seeds/ts/seed-012.ts +34 -0
  648. package/dist/packages/crucible/seeds/ts/seed-013 2.ts +31 -0
  649. package/dist/packages/crucible/seeds/ts/seed-013.ts +31 -0
  650. package/dist/packages/crucible/seeds/ts/seed-014 2.ts +36 -0
  651. package/dist/packages/crucible/seeds/ts/seed-014.ts +36 -0
  652. package/dist/packages/crucible/seeds/ts/seed-015 2.ts +31 -0
  653. package/dist/packages/crucible/seeds/ts/seed-015.ts +31 -0
  654. package/dist/packages/crucible/seeds/ts/seed-016 2.ts +37 -0
  655. package/dist/packages/crucible/seeds/ts/seed-016.ts +37 -0
  656. package/dist/packages/crucible/seeds/ts/seed-017 2.ts +44 -0
  657. package/dist/packages/crucible/seeds/ts/seed-017.ts +44 -0
  658. package/dist/packages/crucible/seeds/ts/seed-018 2.ts +33 -0
  659. package/dist/packages/crucible/seeds/ts/seed-018.ts +33 -0
  660. package/dist/packages/crucible/seeds/ts/seed-019 2.ts +32 -0
  661. package/dist/packages/crucible/seeds/ts/seed-019.ts +32 -0
  662. package/dist/packages/crucible/seeds/ts/seed-020 2.ts +33 -0
  663. package/dist/packages/crucible/seeds/ts/seed-020.ts +33 -0
  664. package/dist/packages/crucible/seeds/ts/seed-021 2.ts +33 -0
  665. package/dist/packages/crucible/seeds/ts/seed-021.ts +33 -0
  666. package/dist/packages/crucible/seeds/ts/seed-022 2.ts +34 -0
  667. package/dist/packages/crucible/seeds/ts/seed-022.ts +34 -0
  668. package/dist/packages/crucible/seeds/ts/seed-023 2.ts +33 -0
  669. package/dist/packages/crucible/seeds/ts/seed-023.ts +33 -0
  670. package/dist/packages/crucible/seeds/ts/seed-024 2.ts +35 -0
  671. package/dist/packages/crucible/seeds/ts/seed-024.ts +35 -0
  672. package/dist/packages/crucible/seeds/ts/seed-025 2.ts +29 -0
  673. package/dist/packages/crucible/seeds/ts/seed-025.ts +29 -0
  674. package/dist/packages/crucible/seeds/ts/seed-026 2.ts +36 -0
  675. package/dist/packages/crucible/seeds/ts/seed-026.ts +36 -0
  676. package/dist/packages/crucible/seeds/ts/seed-027 2.ts +30 -0
  677. package/dist/packages/crucible/seeds/ts/seed-027.ts +30 -0
  678. package/dist/packages/crucible/seeds/ts/seed-028 2.ts +32 -0
  679. package/dist/packages/crucible/seeds/ts/seed-028.ts +32 -0
  680. package/dist/packages/crucible/seeds/ts/seed-029 2.ts +34 -0
  681. package/dist/packages/crucible/seeds/ts/seed-029.ts +34 -0
  682. package/dist/packages/crucible/seeds/ts/seed-030 2.ts +37 -0
  683. package/dist/packages/crucible/seeds/ts/seed-030.ts +37 -0
  684. package/dist/packages/crucible/seeds/ts/seed-031 2.ts +31 -0
  685. package/dist/packages/crucible/seeds/ts/seed-031.ts +31 -0
  686. package/dist/packages/crucible/seeds/ts/seed-032 2.ts +32 -0
  687. package/dist/packages/crucible/seeds/ts/seed-032.ts +32 -0
  688. package/dist/packages/crucible/seeds/ts/seed-033 2.ts +32 -0
  689. package/dist/packages/crucible/seeds/ts/seed-033.ts +32 -0
  690. package/dist/packages/crucible/seeds/ts/seed-034 2.ts +34 -0
  691. package/dist/packages/crucible/seeds/ts/seed-034.ts +34 -0
  692. package/dist/packages/crucible/seeds/ts/seed-035 2.ts +29 -0
  693. package/dist/packages/crucible/seeds/ts/seed-035.ts +29 -0
  694. package/dist/packages/crucible/seeds/ts/seed-036 2.ts +34 -0
  695. package/dist/packages/crucible/seeds/ts/seed-036.ts +34 -0
  696. package/dist/packages/crucible/seeds/ts/seed-037 2.ts +33 -0
  697. package/dist/packages/crucible/seeds/ts/seed-037.ts +33 -0
  698. package/dist/packages/crucible/seeds/ts/seed-038 2.ts +29 -0
  699. package/dist/packages/crucible/seeds/ts/seed-038.ts +29 -0
  700. package/dist/packages/crucible/seeds/ts/seed-039 2.ts +35 -0
  701. package/dist/packages/crucible/seeds/ts/seed-039.ts +35 -0
  702. package/dist/packages/crucible/seeds/ts/seed-040 2.ts +31 -0
  703. package/dist/packages/crucible/seeds/ts/seed-040.ts +31 -0
  704. package/dist/packages/crucible/seeds/ts/seed-041 2.ts +29 -0
  705. package/dist/packages/crucible/seeds/ts/seed-041.ts +29 -0
  706. package/dist/packages/crucible/seeds/ts/seed-042 2.ts +33 -0
  707. package/dist/packages/crucible/seeds/ts/seed-042.ts +33 -0
  708. package/dist/packages/crucible/seeds/ts/seed-043 2.ts +32 -0
  709. package/dist/packages/crucible/seeds/ts/seed-043.ts +32 -0
  710. package/dist/packages/crucible/seeds/ts/seed-044 2.ts +36 -0
  711. package/dist/packages/crucible/seeds/ts/seed-044.ts +36 -0
  712. package/dist/packages/crucible/seeds/ts/seed-045 2.ts +39 -0
  713. package/dist/packages/crucible/seeds/ts/seed-045.ts +39 -0
  714. package/dist/packages/crucible/seeds/ts/seed-046 2.ts +41 -0
  715. package/dist/packages/crucible/seeds/ts/seed-046.ts +41 -0
  716. package/dist/packages/crucible/seeds/ts/seed-047 2.ts +33 -0
  717. package/dist/packages/crucible/seeds/ts/seed-047.ts +33 -0
  718. package/dist/packages/crucible/seeds/ts/seed-048 2.ts +33 -0
  719. package/dist/packages/crucible/seeds/ts/seed-048.ts +33 -0
  720. package/dist/packages/crucible/seeds/ts/seed-049 2.ts +34 -0
  721. package/dist/packages/crucible/seeds/ts/seed-049.ts +34 -0
  722. package/dist/packages/crucible/seeds/ts/seed-050 2.ts +41 -0
  723. package/dist/packages/crucible/seeds/ts/seed-050.ts +41 -0
  724. package/dist/packages/crucible/seeds/ts/seed-051 2.ts +34 -0
  725. package/dist/packages/crucible/seeds/ts/seed-051.ts +34 -0
  726. package/dist/packages/crucible/seeds/ts/seed-052 2.ts +36 -0
  727. package/dist/packages/crucible/seeds/ts/seed-052.ts +36 -0
  728. package/dist/packages/scanner/alert-manager.js +1 -0
  729. package/dist/packages/scanner/architecture-map.js +1 -0
  730. package/dist/packages/scanner/ast-analyzer.js +1 -0
  731. package/dist/packages/scanner/benchmarks.js +1 -0
  732. package/dist/packages/scanner/cfg-analyzer.js +1 -0
  733. package/dist/packages/scanner/code-scanner.js +1 -0
  734. package/dist/packages/scanner/compliance-mapper.js +1 -0
  735. package/dist/packages/scanner/file-collector.js +1 -0
  736. package/dist/packages/scanner/file-watcher.js +1 -0
  737. package/dist/packages/scanner/ghost-code-detector.js +1 -0
  738. package/dist/packages/scanner/git-velocity.js +1 -0
  739. package/dist/packages/scanner/hallucination-detector.js +1 -0
  740. package/dist/packages/scanner/health-checker.js +1 -0
  741. package/dist/packages/scanner/investor-report.js +1 -0
  742. package/dist/packages/scanner/json-file-util.js +1 -0
  743. package/dist/packages/scanner/monitor-store.js +1 -0
  744. package/dist/packages/scanner/python_ast_helper.py +426 -0
  745. package/dist/packages/scanner/risk-valuation.js +1 -0
  746. package/dist/packages/scanner/scan-history.js +1 -0
  747. package/dist/packages/scanner/secret-scanner.js +1 -0
  748. package/dist/packages/scanner/sentinel-core.js +1 -0
  749. package/dist/packages/scanner/supply-chain.js +1 -0
  750. package/dist/packages/scanner/support-bot.js +1 -0
  751. package/dist/packages/scanner/support-knowledge.js +1 -0
  752. package/dist/packages/scanner/taint-tracker.js +1 -0
  753. package/package.json +15 -13
  754. package/cli.js +0 -2
  755. package/packages/crucible/.golden/golden-master.json +0 -414
  756. package/packages/crucible/README.md +0 -93
  757. package/packages/crucible/report-generator.js +0 -1
  758. package/packages/crucible/rules/code-scanner-core.json +0 -281
  759. package/packages/crucible/rules/command-injection.json +0 -411
  760. package/packages/crucible/rules/crypto-misuse.json +0 -35
  761. package/packages/crucible/rules/deserialization.json +0 -152
  762. package/packages/crucible/rules/env-injection.json +0 -46
  763. package/packages/crucible/rules/eval-abuse.json +0 -104
  764. package/packages/crucible/rules/file-upload.json +0 -46
  765. package/packages/crucible/rules/hallucination.json +0 -22
  766. package/packages/crucible/rules/hardcoded-secret.json +0 -397
  767. package/packages/crucible/rules/hardcoded-url.json +0 -13
  768. package/packages/crucible/rules/insecure-crypto.json +0 -302
  769. package/packages/crucible/rules/integer-overflow.json +0 -35
  770. package/packages/crucible/rules/log-injection.json +0 -33
  771. package/packages/crucible/rules/mass-assignment.json +0 -112
  772. package/packages/crucible/rules/open-redirect.json +0 -196
  773. package/packages/crucible/rules/path-traversal.json +0 -422
  774. package/packages/crucible/rules/prototype-pollution.json +0 -22
  775. package/packages/crucible/rules/sql-injection.json +0 -619
  776. package/packages/crucible/rules/ssrf.json +0 -557
  777. package/packages/crucible/rules/timing-attack.json +0 -55
  778. package/packages/crucible/rules/unsafe-block.json +0 -24
  779. package/packages/crucible/rules/xss.json +0 -663
  780. package/packages/crucible/rules/xxe.json +0 -66
  781. package/packages/crucible/rules/yaml-deserialization.json +0 -22
  782. package/packages/crucible/rules/yaml-injection.json +0 -22
  783. package/packages/crucible/seeds/csharp/seed-001.cs +0 -28
  784. package/packages/crucible/seeds/csharp/seed-002.cs +0 -24
  785. package/packages/crucible/seeds/csharp/seed-003.cs +0 -30
  786. package/packages/crucible/seeds/csharp/seed-004.cs +0 -31
  787. package/packages/crucible/seeds/csharp/seed-005.cs +0 -28
  788. package/packages/crucible/seeds/csharp/seed-006.cs +0 -25
  789. package/packages/crucible/seeds/csharp/seed-007.cs +0 -34
  790. package/packages/crucible/seeds/csharp/seed-008.cs +0 -23
  791. package/packages/crucible/seeds/csharp/seed-009.cs +0 -27
  792. package/packages/crucible/seeds/csharp/seed-010.cs +0 -29
  793. package/packages/crucible/seeds/csharp/seed-011.cs +0 -32
  794. package/packages/crucible/seeds/csharp/seed-012.cs +0 -27
  795. package/packages/crucible/seeds/csharp/seed-013.cs +0 -27
  796. package/packages/crucible/seeds/csharp/seed-014.cs +0 -26
  797. package/packages/crucible/seeds/csharp/seed-015.cs +0 -33
  798. package/packages/crucible/seeds/csharp/seed-016.cs +0 -25
  799. package/packages/crucible/seeds/csharp/seed-017.cs +0 -22
  800. package/packages/crucible/seeds/csharp/seed-018.cs +0 -26
  801. package/packages/crucible/seeds/csharp/seed-019.cs +0 -25
  802. package/packages/crucible/seeds/csharp/seed-020.cs +0 -22
  803. package/packages/crucible/seeds/csharp/seed-021.cs +0 -28
  804. package/packages/crucible/seeds/csharp/seed-022.cs +0 -25
  805. package/packages/crucible/seeds/csharp/seed-023.cs +0 -33
  806. package/packages/crucible/seeds/csharp/seed-024.cs +0 -31
  807. package/packages/crucible/seeds/csharp/seed-025.cs +0 -31
  808. package/packages/crucible/seeds/csharp/seed-026.cs +0 -25
  809. package/packages/crucible/seeds/csharp/seed-027.cs +0 -29
  810. package/packages/crucible/seeds/csharp/seed-028.cs +0 -25
  811. package/packages/crucible/seeds/csharp/seed-029.cs +0 -27
  812. package/packages/crucible/seeds/csharp/seed-030.cs +0 -27
  813. package/packages/crucible/seeds/csharp/seed-031.cs +0 -28
  814. package/packages/crucible/seeds/csharp/seed-032.cs +0 -30
  815. package/packages/crucible/seeds/csharp/seed-033.cs +0 -27
  816. package/packages/crucible/seeds/csharp/seed-034.cs +0 -25
  817. package/packages/crucible/seeds/csharp/seed-035.cs +0 -32
  818. package/packages/crucible/seeds/csharp/seed-036.cs +0 -28
  819. package/packages/crucible/seeds/csharp/seed-037.cs +0 -29
  820. package/packages/crucible/seeds/csharp/seed-038.cs +0 -28
  821. package/packages/crucible/seeds/csharp/seed-039.cs +0 -29
  822. package/packages/crucible/seeds/csharp/seed-040.cs +0 -28
  823. package/packages/crucible/seeds/csharp/seed-041.cs +0 -33
  824. package/packages/crucible/seeds/csharp/seed-042.cs +0 -27
  825. package/packages/crucible/seeds/csharp/seed-043.cs +0 -27
  826. package/packages/crucible/seeds/csharp/seed-044.cs +0 -25
  827. package/packages/crucible/seeds/csharp/seed-045.cs +0 -30
  828. package/packages/crucible/seeds/csharp/seed-046.cs +0 -29
  829. package/packages/crucible/seeds/csharp/seed-047.cs +0 -26
  830. package/packages/crucible/seeds/csharp/seed-048.cs +0 -31
  831. package/packages/crucible/seeds/csharp/seed-049.cs +0 -27
  832. package/packages/crucible/seeds/csharp/seed-050.cs +0 -30
  833. package/packages/crucible/seeds/csharp/seed-051.cs +0 -34
  834. package/packages/crucible/seeds/csharp/seed-052.cs +0 -36
  835. package/packages/crucible/seeds/go/seed-001.go +0 -29
  836. package/packages/crucible/seeds/go/seed-002.go +0 -27
  837. package/packages/crucible/seeds/go/seed-003.go +0 -31
  838. package/packages/crucible/seeds/go/seed-004.go +0 -27
  839. package/packages/crucible/seeds/go/seed-005.go +0 -27
  840. package/packages/crucible/seeds/go/seed-006.go +0 -29
  841. package/packages/crucible/seeds/go/seed-007.go +0 -24
  842. package/packages/crucible/seeds/go/seed-008.go +0 -25
  843. package/packages/crucible/seeds/go/seed-009.go +0 -30
  844. package/packages/crucible/seeds/go/seed-010.go +0 -35
  845. package/packages/crucible/seeds/go/seed-011.go +0 -24
  846. package/packages/crucible/seeds/go/seed-012.go +0 -24
  847. package/packages/crucible/seeds/go/seed-013.go +0 -31
  848. package/packages/crucible/seeds/go/seed-014.go +0 -35
  849. package/packages/crucible/seeds/go/seed-015.go +0 -25
  850. package/packages/crucible/seeds/go/seed-016.go +0 -19
  851. package/packages/crucible/seeds/go/seed-017.go +0 -23
  852. package/packages/crucible/seeds/go/seed-018.go +0 -23
  853. package/packages/crucible/seeds/go/seed-019.go +0 -22
  854. package/packages/crucible/seeds/go/seed-020.go +0 -31
  855. package/packages/crucible/seeds/go/seed-021.go +0 -22
  856. package/packages/crucible/seeds/go/seed-022.go +0 -29
  857. package/packages/crucible/seeds/go/seed-023.go +0 -26
  858. package/packages/crucible/seeds/go/seed-024.go +0 -27
  859. package/packages/crucible/seeds/go/seed-025.go +0 -23
  860. package/packages/crucible/seeds/go/seed-026.go +0 -29
  861. package/packages/crucible/seeds/go/seed-027.go +0 -26
  862. package/packages/crucible/seeds/go/seed-028.go +0 -23
  863. package/packages/crucible/seeds/go/seed-029.go +0 -28
  864. package/packages/crucible/seeds/go/seed-030.go +0 -27
  865. package/packages/crucible/seeds/go/seed-031.go +0 -28
  866. package/packages/crucible/seeds/go/seed-032.go +0 -27
  867. package/packages/crucible/seeds/go/seed-033.go +0 -29
  868. package/packages/crucible/seeds/go/seed-034.go +0 -22
  869. package/packages/crucible/seeds/go/seed-035.go +0 -32
  870. package/packages/crucible/seeds/go/seed-036.go +0 -27
  871. package/packages/crucible/seeds/go/seed-037.go +0 -27
  872. package/packages/crucible/seeds/go/seed-038.go +0 -27
  873. package/packages/crucible/seeds/go/seed-039.go +0 -26
  874. package/packages/crucible/seeds/go/seed-040.go +0 -37
  875. package/packages/crucible/seeds/go/seed-041.go +0 -23
  876. package/packages/crucible/seeds/go/seed-042.go +0 -32
  877. package/packages/crucible/seeds/go/seed-043.go +0 -35
  878. package/packages/crucible/seeds/go/seed-044.go +0 -25
  879. package/packages/crucible/seeds/go/seed-045.go +0 -26
  880. package/packages/crucible/seeds/go/seed-046.go +0 -34
  881. package/packages/crucible/seeds/go/seed-047.go +0 -26
  882. package/packages/crucible/seeds/go/seed-048.go +0 -29
  883. package/packages/crucible/seeds/go/seed-049.go +0 -24
  884. package/packages/crucible/seeds/go/seed-050.go +0 -27
  885. package/packages/crucible/seeds/go/seed-051.go +0 -38
  886. package/packages/crucible/seeds/go/seed-052.go +0 -27
  887. package/packages/crucible/seeds/java/seed-001.java +0 -23
  888. package/packages/crucible/seeds/java/seed-002.java +0 -22
  889. package/packages/crucible/seeds/java/seed-003.java +0 -28
  890. package/packages/crucible/seeds/java/seed-004.java +0 -26
  891. package/packages/crucible/seeds/java/seed-005.java +0 -33
  892. package/packages/crucible/seeds/java/seed-006.java +0 -22
  893. package/packages/crucible/seeds/java/seed-007.java +0 -21
  894. package/packages/crucible/seeds/java/seed-008.java +0 -29
  895. package/packages/crucible/seeds/java/seed-009.java +0 -24
  896. package/packages/crucible/seeds/java/seed-010.java +0 -30
  897. package/packages/crucible/seeds/java/seed-011.java +0 -25
  898. package/packages/crucible/seeds/java/seed-012.java +0 -20
  899. package/packages/crucible/seeds/java/seed-013.java +0 -26
  900. package/packages/crucible/seeds/java/seed-014.java +0 -23
  901. package/packages/crucible/seeds/java/seed-015.java +0 -25
  902. package/packages/crucible/seeds/java/seed-016.java +0 -22
  903. package/packages/crucible/seeds/java/seed-017.java +0 -24
  904. package/packages/crucible/seeds/java/seed-018.java +0 -24
  905. package/packages/crucible/seeds/java/seed-019.java +0 -38
  906. package/packages/crucible/seeds/java/seed-020.java +0 -24
  907. package/packages/crucible/seeds/java/seed-021.java +0 -22
  908. package/packages/crucible/seeds/java/seed-022.java +0 -22
  909. package/packages/crucible/seeds/java/seed-023.java +0 -22
  910. package/packages/crucible/seeds/java/seed-024.java +0 -25
  911. package/packages/crucible/seeds/java/seed-025.java +0 -27
  912. package/packages/crucible/seeds/java/seed-026.java +0 -25
  913. package/packages/crucible/seeds/java/seed-027.java +0 -22
  914. package/packages/crucible/seeds/java/seed-028.java +0 -21
  915. package/packages/crucible/seeds/java/seed-029.java +0 -28
  916. package/packages/crucible/seeds/java/seed-030.java +0 -27
  917. package/packages/crucible/seeds/java/seed-031.java +0 -23
  918. package/packages/crucible/seeds/java/seed-032.java +0 -22
  919. package/packages/crucible/seeds/java/seed-033.java +0 -24
  920. package/packages/crucible/seeds/java/seed-034.java +0 -24
  921. package/packages/crucible/seeds/java/seed-035.java +0 -29
  922. package/packages/crucible/seeds/java/seed-036.java +0 -25
  923. package/packages/crucible/seeds/java/seed-037.java +0 -30
  924. package/packages/crucible/seeds/java/seed-038.java +0 -29
  925. package/packages/crucible/seeds/java/seed-039.java +0 -26
  926. package/packages/crucible/seeds/java/seed-040.java +0 -31
  927. package/packages/crucible/seeds/java/seed-041.java +0 -20
  928. package/packages/crucible/seeds/java/seed-042.java +0 -26
  929. package/packages/crucible/seeds/java/seed-043.java +0 -31
  930. package/packages/crucible/seeds/java/seed-044.java +0 -22
  931. package/packages/crucible/seeds/java/seed-045.java +0 -25
  932. package/packages/crucible/seeds/java/seed-046.java +0 -22
  933. package/packages/crucible/seeds/java/seed-047.java +0 -26
  934. package/packages/crucible/seeds/java/seed-048.java +0 -24
  935. package/packages/crucible/seeds/java/seed-049.java +0 -28
  936. package/packages/crucible/seeds/java/seed-050.java +0 -29
  937. package/packages/crucible/seeds/java/seed-051.java +0 -25
  938. package/packages/crucible/seeds/java/seed-052.java +0 -32
  939. package/packages/crucible/seeds/js/seed-001.js +0 -27
  940. package/packages/crucible/seeds/js/seed-002.js +0 -28
  941. package/packages/crucible/seeds/js/seed-003.js +0 -30
  942. package/packages/crucible/seeds/js/seed-004.js +0 -28
  943. package/packages/crucible/seeds/js/seed-005.js +0 -31
  944. package/packages/crucible/seeds/js/seed-006.js +0 -28
  945. package/packages/crucible/seeds/js/seed-007.js +0 -26
  946. package/packages/crucible/seeds/js/seed-008.js +0 -30
  947. package/packages/crucible/seeds/js/seed-009.js +0 -30
  948. package/packages/crucible/seeds/js/seed-010.js +0 -29
  949. package/packages/crucible/seeds/js/seed-011.js +0 -34
  950. package/packages/crucible/seeds/js/seed-012.js +0 -32
  951. package/packages/crucible/seeds/js/seed-013.js +0 -29
  952. package/packages/crucible/seeds/js/seed-014.js +0 -29
  953. package/packages/crucible/seeds/js/seed-015.js +0 -31
  954. package/packages/crucible/seeds/js/seed-016.js +0 -31
  955. package/packages/crucible/seeds/js/seed-017.js +0 -30
  956. package/packages/crucible/seeds/js/seed-018.js +0 -29
  957. package/packages/crucible/seeds/js/seed-019.js +0 -32
  958. package/packages/crucible/seeds/js/seed-020.js +0 -29
  959. package/packages/crucible/seeds/js/seed-021.js +0 -31
  960. package/packages/crucible/seeds/js/seed-022.js +0 -31
  961. package/packages/crucible/seeds/js/seed-023.js +0 -29
  962. package/packages/crucible/seeds/js/seed-024.js +0 -29
  963. package/packages/crucible/seeds/js/seed-025.js +0 -34
  964. package/packages/crucible/seeds/js/seed-026.js +0 -31
  965. package/packages/crucible/seeds/js/seed-027.js +0 -31
  966. package/packages/crucible/seeds/js/seed-028.js +0 -33
  967. package/packages/crucible/seeds/js/seed-029.js +0 -33
  968. package/packages/crucible/seeds/js/seed-030.js +0 -30
  969. package/packages/crucible/seeds/js/seed-031.js +0 -31
  970. package/packages/crucible/seeds/js/seed-032.js +0 -34
  971. package/packages/crucible/seeds/js/seed-033.js +0 -33
  972. package/packages/crucible/seeds/js/seed-034.js +0 -33
  973. package/packages/crucible/seeds/js/seed-035.js +0 -30
  974. package/packages/crucible/seeds/js/seed-036.js +0 -30
  975. package/packages/crucible/seeds/js/seed-037.js +0 -29
  976. package/packages/crucible/seeds/js/seed-038.js +0 -31
  977. package/packages/crucible/seeds/js/seed-039.js +0 -34
  978. package/packages/crucible/seeds/js/seed-040.js +0 -35
  979. package/packages/crucible/seeds/js/seed-041.js +0 -32
  980. package/packages/crucible/seeds/js/seed-042.js +0 -32
  981. package/packages/crucible/seeds/js/seed-043.js +0 -27
  982. package/packages/crucible/seeds/js/seed-044.js +0 -29
  983. package/packages/crucible/seeds/js/seed-045.js +0 -33
  984. package/packages/crucible/seeds/js/seed-046.js +0 -33
  985. package/packages/crucible/seeds/js/seed-047.js +0 -29
  986. package/packages/crucible/seeds/js/seed-048.js +0 -29
  987. package/packages/crucible/seeds/js/seed-049.js +0 -34
  988. package/packages/crucible/seeds/js/seed-050.js +0 -34
  989. package/packages/crucible/seeds/js/seed-051.js +0 -30
  990. package/packages/crucible/seeds/js/seed-052.js +0 -30
  991. package/packages/crucible/seeds/js/seed-053.js +0 -26
  992. package/packages/crucible/seeds/js/seed-054.js +0 -35
  993. package/packages/crucible/seeds/js/seed-055.js +0 -33
  994. package/packages/crucible/seeds/kotlin/seed-001.kt +0 -24
  995. package/packages/crucible/seeds/kotlin/seed-002.kt +0 -27
  996. package/packages/crucible/seeds/kotlin/seed-003.kt +0 -29
  997. package/packages/crucible/seeds/kotlin/seed-004.kt +0 -24
  998. package/packages/crucible/seeds/kotlin/seed-005.kt +0 -29
  999. package/packages/crucible/seeds/kotlin/seed-006.kt +0 -21
  1000. package/packages/crucible/seeds/kotlin/seed-007.kt +0 -23
  1001. package/packages/crucible/seeds/kotlin/seed-008.kt +0 -25
  1002. package/packages/crucible/seeds/kotlin/seed-009.kt +0 -21
  1003. package/packages/crucible/seeds/kotlin/seed-010.kt +0 -28
  1004. package/packages/crucible/seeds/kotlin/seed-011.kt +0 -22
  1005. package/packages/crucible/seeds/kotlin/seed-012.kt +0 -25
  1006. package/packages/crucible/seeds/kotlin/seed-013.kt +0 -30
  1007. package/packages/crucible/seeds/kotlin/seed-014.kt +0 -27
  1008. package/packages/crucible/seeds/kotlin/seed-015.kt +0 -24
  1009. package/packages/crucible/seeds/kotlin/seed-016.kt +0 -28
  1010. package/packages/crucible/seeds/kotlin/seed-017.kt +0 -33
  1011. package/packages/crucible/seeds/kotlin/seed-018.kt +0 -31
  1012. package/packages/crucible/seeds/kotlin/seed-019.kt +0 -28
  1013. package/packages/crucible/seeds/kotlin/seed-020.kt +0 -31
  1014. package/packages/crucible/seeds/kotlin/seed-021.kt +0 -34
  1015. package/packages/crucible/seeds/kotlin/seed-022.kt +0 -29
  1016. package/packages/crucible/seeds/kotlin/seed-023.kt +0 -20
  1017. package/packages/crucible/seeds/kotlin/seed-024.kt +0 -23
  1018. package/packages/crucible/seeds/kotlin/seed-025.kt +0 -23
  1019. package/packages/crucible/seeds/kotlin/seed-026.kt +0 -26
  1020. package/packages/crucible/seeds/kotlin/seed-027.kt +0 -29
  1021. package/packages/crucible/seeds/kotlin/seed-028.kt +0 -24
  1022. package/packages/crucible/seeds/kotlin/seed-029.kt +0 -27
  1023. package/packages/crucible/seeds/kotlin/seed-030.kt +0 -26
  1024. package/packages/crucible/seeds/kotlin/seed-031.kt +0 -28
  1025. package/packages/crucible/seeds/kotlin/seed-032.kt +0 -29
  1026. package/packages/crucible/seeds/kotlin/seed-033.kt +0 -30
  1027. package/packages/crucible/seeds/kotlin/seed-034.kt +0 -26
  1028. package/packages/crucible/seeds/kotlin/seed-035.kt +0 -33
  1029. package/packages/crucible/seeds/kotlin/seed-036.kt +0 -25
  1030. package/packages/crucible/seeds/kotlin/seed-037.kt +0 -26
  1031. package/packages/crucible/seeds/kotlin/seed-038.kt +0 -25
  1032. package/packages/crucible/seeds/kotlin/seed-039.kt +0 -29
  1033. package/packages/crucible/seeds/kotlin/seed-040.kt +0 -28
  1034. package/packages/crucible/seeds/kotlin/seed-041.kt +0 -31
  1035. package/packages/crucible/seeds/kotlin/seed-042.kt +0 -27
  1036. package/packages/crucible/seeds/kotlin/seed-043.kt +0 -26
  1037. package/packages/crucible/seeds/kotlin/seed-044.kt +0 -27
  1038. package/packages/crucible/seeds/kotlin/seed-045.kt +0 -27
  1039. package/packages/crucible/seeds/kotlin/seed-046.kt +0 -33
  1040. package/packages/crucible/seeds/kotlin/seed-047.kt +0 -32
  1041. package/packages/crucible/seeds/kotlin/seed-048.kt +0 -20
  1042. package/packages/crucible/seeds/kotlin/seed-049.kt +0 -23
  1043. package/packages/crucible/seeds/kotlin/seed-050.kt +0 -19
  1044. package/packages/crucible/seeds/php/seed-001.php +0 -23
  1045. package/packages/crucible/seeds/php/seed-002.php +0 -18
  1046. package/packages/crucible/seeds/php/seed-003.php +0 -25
  1047. package/packages/crucible/seeds/php/seed-004.php +0 -21
  1048. package/packages/crucible/seeds/php/seed-005.php +0 -21
  1049. package/packages/crucible/seeds/php/seed-006.php +0 -21
  1050. package/packages/crucible/seeds/php/seed-007.php +0 -18
  1051. package/packages/crucible/seeds/php/seed-008.php +0 -19
  1052. package/packages/crucible/seeds/php/seed-009.php +0 -24
  1053. package/packages/crucible/seeds/php/seed-010.php +0 -24
  1054. package/packages/crucible/seeds/php/seed-011.php +0 -18
  1055. package/packages/crucible/seeds/php/seed-012.php +0 -24
  1056. package/packages/crucible/seeds/php/seed-013.php +0 -23
  1057. package/packages/crucible/seeds/php/seed-014.php +0 -20
  1058. package/packages/crucible/seeds/php/seed-015.php +0 -18
  1059. package/packages/crucible/seeds/php/seed-016.php +0 -18
  1060. package/packages/crucible/seeds/php/seed-017.php +0 -18
  1061. package/packages/crucible/seeds/php/seed-018.php +0 -17
  1062. package/packages/crucible/seeds/php/seed-019.php +0 -24
  1063. package/packages/crucible/seeds/php/seed-020.php +0 -19
  1064. package/packages/crucible/seeds/php/seed-021.php +0 -22
  1065. package/packages/crucible/seeds/php/seed-022.php +0 -15
  1066. package/packages/crucible/seeds/php/seed-023.php +0 -24
  1067. package/packages/crucible/seeds/php/seed-024.php +0 -22
  1068. package/packages/crucible/seeds/php/seed-025.php +0 -20
  1069. package/packages/crucible/seeds/php/seed-026.php +0 -22
  1070. package/packages/crucible/seeds/php/seed-027.php +0 -15
  1071. package/packages/crucible/seeds/php/seed-028.php +0 -15
  1072. package/packages/crucible/seeds/php/seed-029.php +0 -21
  1073. package/packages/crucible/seeds/php/seed-030.php +0 -21
  1074. package/packages/crucible/seeds/php/seed-031.php +0 -23
  1075. package/packages/crucible/seeds/php/seed-032.php +0 -18
  1076. package/packages/crucible/seeds/php/seed-033.php +0 -18
  1077. package/packages/crucible/seeds/php/seed-034.php +0 -24
  1078. package/packages/crucible/seeds/php/seed-035.php +0 -22
  1079. package/packages/crucible/seeds/php/seed-036.php +0 -17
  1080. package/packages/crucible/seeds/php/seed-037.php +0 -19
  1081. package/packages/crucible/seeds/php/seed-038.php +0 -20
  1082. package/packages/crucible/seeds/php/seed-039.php +0 -15
  1083. package/packages/crucible/seeds/php/seed-040.php +0 -21
  1084. package/packages/crucible/seeds/php/seed-041.php +0 -20
  1085. package/packages/crucible/seeds/php/seed-042.php +0 -21
  1086. package/packages/crucible/seeds/php/seed-043.php +0 -21
  1087. package/packages/crucible/seeds/php/seed-044.php +0 -25
  1088. package/packages/crucible/seeds/php/seed-045.php +0 -25
  1089. package/packages/crucible/seeds/php/seed-046.php +0 -20
  1090. package/packages/crucible/seeds/php/seed-047.php +0 -21
  1091. package/packages/crucible/seeds/php/seed-048.php +0 -19
  1092. package/packages/crucible/seeds/php/seed-049.php +0 -18
  1093. package/packages/crucible/seeds/php/seed-050.php +0 -20
  1094. package/packages/crucible/seeds/python/seed-001.py +0 -33
  1095. package/packages/crucible/seeds/python/seed-002.py +0 -39
  1096. package/packages/crucible/seeds/python/seed-003.py +0 -31
  1097. package/packages/crucible/seeds/python/seed-004.py +0 -33
  1098. package/packages/crucible/seeds/python/seed-005.py +0 -33
  1099. package/packages/crucible/seeds/python/seed-006.py +0 -34
  1100. package/packages/crucible/seeds/python/seed-007.py +0 -33
  1101. package/packages/crucible/seeds/python/seed-008.py +0 -38
  1102. package/packages/crucible/seeds/python/seed-009.py +0 -38
  1103. package/packages/crucible/seeds/python/seed-010.py +0 -42
  1104. package/packages/crucible/seeds/python/seed-011.py +0 -30
  1105. package/packages/crucible/seeds/python/seed-012.py +0 -35
  1106. package/packages/crucible/seeds/python/seed-013.py +0 -33
  1107. package/packages/crucible/seeds/python/seed-014.py +0 -40
  1108. package/packages/crucible/seeds/python/seed-015.py +0 -33
  1109. package/packages/crucible/seeds/python/seed-016.py +0 -34
  1110. package/packages/crucible/seeds/python/seed-017.py +0 -34
  1111. package/packages/crucible/seeds/python/seed-018.py +0 -30
  1112. package/packages/crucible/seeds/python/seed-019.py +0 -33
  1113. package/packages/crucible/seeds/python/seed-020.py +0 -37
  1114. package/packages/crucible/seeds/python/seed-021 2.py +0 -37
  1115. package/packages/crucible/seeds/python/seed-021.py +0 -37
  1116. package/packages/crucible/seeds/python/seed-022 2.py +0 -34
  1117. package/packages/crucible/seeds/python/seed-022.py +0 -34
  1118. package/packages/crucible/seeds/python/seed-023 2.py +0 -37
  1119. package/packages/crucible/seeds/python/seed-023.py +0 -37
  1120. package/packages/crucible/seeds/python/seed-024 2.py +0 -38
  1121. package/packages/crucible/seeds/python/seed-024.py +0 -38
  1122. package/packages/crucible/seeds/python/seed-025 2.py +0 -40
  1123. package/packages/crucible/seeds/python/seed-025.py +0 -40
  1124. package/packages/crucible/seeds/python/seed-026 2.py +0 -35
  1125. package/packages/crucible/seeds/python/seed-026.py +0 -35
  1126. package/packages/crucible/seeds/python/seed-027 2.py +0 -35
  1127. package/packages/crucible/seeds/python/seed-027.py +0 -35
  1128. package/packages/crucible/seeds/python/seed-028 2.py +0 -42
  1129. package/packages/crucible/seeds/python/seed-028.py +0 -42
  1130. package/packages/crucible/seeds/python/seed-029.py +0 -42
  1131. package/packages/crucible/seeds/python/seed-030 2.py +0 -37
  1132. package/packages/crucible/seeds/python/seed-030.py +0 -37
  1133. package/packages/crucible/seeds/python/seed-031 2.py +0 -34
  1134. package/packages/crucible/seeds/python/seed-031.py +0 -34
  1135. package/packages/crucible/seeds/python/seed-032.py +0 -33
  1136. package/packages/crucible/seeds/python/seed-033.py +0 -32
  1137. package/packages/crucible/seeds/python/seed-034.py +0 -38
  1138. package/packages/crucible/seeds/python/seed-035.py +0 -35
  1139. package/packages/crucible/seeds/python/seed-036 2.py +0 -33
  1140. package/packages/crucible/seeds/python/seed-036.py +0 -33
  1141. package/packages/crucible/seeds/python/seed-037 2.py +0 -41
  1142. package/packages/crucible/seeds/python/seed-037.py +0 -41
  1143. package/packages/crucible/seeds/python/seed-038 2.py +0 -33
  1144. package/packages/crucible/seeds/python/seed-038.py +0 -33
  1145. package/packages/crucible/seeds/python/seed-039 2.py +0 -39
  1146. package/packages/crucible/seeds/python/seed-039.py +0 -39
  1147. package/packages/crucible/seeds/python/seed-040 2.py +0 -39
  1148. package/packages/crucible/seeds/python/seed-040.py +0 -39
  1149. package/packages/crucible/seeds/python/seed-041 2.py +0 -37
  1150. package/packages/crucible/seeds/python/seed-041.py +0 -37
  1151. package/packages/crucible/seeds/python/seed-042 2.py +0 -38
  1152. package/packages/crucible/seeds/python/seed-042.py +0 -38
  1153. package/packages/crucible/seeds/python/seed-043 2.py +0 -32
  1154. package/packages/crucible/seeds/python/seed-043.py +0 -32
  1155. package/packages/crucible/seeds/python/seed-044 2.py +0 -38
  1156. package/packages/crucible/seeds/python/seed-044.py +0 -38
  1157. package/packages/crucible/seeds/python/seed-045 2.py +0 -36
  1158. package/packages/crucible/seeds/python/seed-045.py +0 -36
  1159. package/packages/crucible/seeds/python/seed-046 2.py +0 -33
  1160. package/packages/crucible/seeds/python/seed-046.py +0 -33
  1161. package/packages/crucible/seeds/python/seed-047 2.py +0 -44
  1162. package/packages/crucible/seeds/python/seed-047.py +0 -44
  1163. package/packages/crucible/seeds/python/seed-048 2.py +0 -35
  1164. package/packages/crucible/seeds/python/seed-048.py +0 -35
  1165. package/packages/crucible/seeds/python/seed-049 2.py +0 -39
  1166. package/packages/crucible/seeds/python/seed-049.py +0 -39
  1167. package/packages/crucible/seeds/python/seed-050 2.py +0 -39
  1168. package/packages/crucible/seeds/python/seed-050.py +0 -39
  1169. package/packages/crucible/seeds/python/seed-051 2.py +0 -38
  1170. package/packages/crucible/seeds/python/seed-051.py +0 -38
  1171. package/packages/crucible/seeds/python/seed-052 2.py +0 -41
  1172. package/packages/crucible/seeds/python/seed-052.py +0 -41
  1173. package/packages/crucible/seeds/ruby/seed-001 2.rb +0 -15
  1174. package/packages/crucible/seeds/ruby/seed-001.rb +0 -15
  1175. package/packages/crucible/seeds/ruby/seed-002 2.rb +0 -22
  1176. package/packages/crucible/seeds/ruby/seed-002.rb +0 -22
  1177. package/packages/crucible/seeds/ruby/seed-003 2.rb +0 -25
  1178. package/packages/crucible/seeds/ruby/seed-003.rb +0 -25
  1179. package/packages/crucible/seeds/ruby/seed-004 2.rb +0 -17
  1180. package/packages/crucible/seeds/ruby/seed-004.rb +0 -17
  1181. package/packages/crucible/seeds/ruby/seed-005 2.rb +0 -21
  1182. package/packages/crucible/seeds/ruby/seed-005.rb +0 -21
  1183. package/packages/crucible/seeds/ruby/seed-006 2.rb +0 -17
  1184. package/packages/crucible/seeds/ruby/seed-006.rb +0 -17
  1185. package/packages/crucible/seeds/ruby/seed-007 2.rb +0 -16
  1186. package/packages/crucible/seeds/ruby/seed-007.rb +0 -16
  1187. package/packages/crucible/seeds/ruby/seed-008 2.rb +0 -18
  1188. package/packages/crucible/seeds/ruby/seed-008.rb +0 -18
  1189. package/packages/crucible/seeds/ruby/seed-009 2.rb +0 -20
  1190. package/packages/crucible/seeds/ruby/seed-009.rb +0 -20
  1191. package/packages/crucible/seeds/ruby/seed-010 2.rb +0 -24
  1192. package/packages/crucible/seeds/ruby/seed-010.rb +0 -24
  1193. package/packages/crucible/seeds/ruby/seed-011 2.rb +0 -21
  1194. package/packages/crucible/seeds/ruby/seed-011.rb +0 -21
  1195. package/packages/crucible/seeds/ruby/seed-012 2.rb +0 -22
  1196. package/packages/crucible/seeds/ruby/seed-012.rb +0 -22
  1197. package/packages/crucible/seeds/ruby/seed-013 2.rb +0 -21
  1198. package/packages/crucible/seeds/ruby/seed-013.rb +0 -21
  1199. package/packages/crucible/seeds/ruby/seed-014 2.rb +0 -16
  1200. package/packages/crucible/seeds/ruby/seed-014.rb +0 -16
  1201. package/packages/crucible/seeds/ruby/seed-015 2.rb +0 -18
  1202. package/packages/crucible/seeds/ruby/seed-015.rb +0 -18
  1203. package/packages/crucible/seeds/ruby/seed-016 2.rb +0 -17
  1204. package/packages/crucible/seeds/ruby/seed-016.rb +0 -17
  1205. package/packages/crucible/seeds/ruby/seed-017 2.rb +0 -25
  1206. package/packages/crucible/seeds/ruby/seed-017.rb +0 -25
  1207. package/packages/crucible/seeds/ruby/seed-018 2.rb +0 -23
  1208. package/packages/crucible/seeds/ruby/seed-018.rb +0 -23
  1209. package/packages/crucible/seeds/ruby/seed-019 2.rb +0 -20
  1210. package/packages/crucible/seeds/ruby/seed-019.rb +0 -20
  1211. package/packages/crucible/seeds/ruby/seed-020 2.rb +0 -17
  1212. package/packages/crucible/seeds/ruby/seed-020.rb +0 -17
  1213. package/packages/crucible/seeds/ruby/seed-021 2.rb +0 -20
  1214. package/packages/crucible/seeds/ruby/seed-021.rb +0 -20
  1215. package/packages/crucible/seeds/ruby/seed-022 2.rb +0 -21
  1216. package/packages/crucible/seeds/ruby/seed-022.rb +0 -21
  1217. package/packages/crucible/seeds/ruby/seed-023 2.rb +0 -19
  1218. package/packages/crucible/seeds/ruby/seed-023.rb +0 -19
  1219. package/packages/crucible/seeds/ruby/seed-024 2.rb +0 -17
  1220. package/packages/crucible/seeds/ruby/seed-024.rb +0 -17
  1221. package/packages/crucible/seeds/ruby/seed-025 2.rb +0 -17
  1222. package/packages/crucible/seeds/ruby/seed-025.rb +0 -17
  1223. package/packages/crucible/seeds/ruby/seed-026 2.rb +0 -18
  1224. package/packages/crucible/seeds/ruby/seed-026.rb +0 -18
  1225. package/packages/crucible/seeds/ruby/seed-027 2.rb +0 -21
  1226. package/packages/crucible/seeds/ruby/seed-027.rb +0 -21
  1227. package/packages/crucible/seeds/ruby/seed-028 2.rb +0 -22
  1228. package/packages/crucible/seeds/ruby/seed-028.rb +0 -22
  1229. package/packages/crucible/seeds/ruby/seed-029 2.rb +0 -19
  1230. package/packages/crucible/seeds/ruby/seed-029.rb +0 -19
  1231. package/packages/crucible/seeds/ruby/seed-030 2.rb +0 -20
  1232. package/packages/crucible/seeds/ruby/seed-030.rb +0 -20
  1233. package/packages/crucible/seeds/ruby/seed-031 2.rb +0 -17
  1234. package/packages/crucible/seeds/ruby/seed-031.rb +0 -17
  1235. package/packages/crucible/seeds/ruby/seed-032 2.rb +0 -22
  1236. package/packages/crucible/seeds/ruby/seed-032.rb +0 -22
  1237. package/packages/crucible/seeds/ruby/seed-033 2.rb +0 -18
  1238. package/packages/crucible/seeds/ruby/seed-033.rb +0 -18
  1239. package/packages/crucible/seeds/ruby/seed-034 2.rb +0 -19
  1240. package/packages/crucible/seeds/ruby/seed-034.rb +0 -19
  1241. package/packages/crucible/seeds/ruby/seed-035 2.rb +0 -19
  1242. package/packages/crucible/seeds/ruby/seed-035.rb +0 -19
  1243. package/packages/crucible/seeds/ruby/seed-036 2.rb +0 -18
  1244. package/packages/crucible/seeds/ruby/seed-036.rb +0 -18
  1245. package/packages/crucible/seeds/ruby/seed-037 2.rb +0 -21
  1246. package/packages/crucible/seeds/ruby/seed-037.rb +0 -21
  1247. package/packages/crucible/seeds/ruby/seed-038 2.rb +0 -24
  1248. package/packages/crucible/seeds/ruby/seed-038.rb +0 -24
  1249. package/packages/crucible/seeds/ruby/seed-039 2.rb +0 -24
  1250. package/packages/crucible/seeds/ruby/seed-039.rb +0 -24
  1251. package/packages/crucible/seeds/ruby/seed-040 2.rb +0 -22
  1252. package/packages/crucible/seeds/ruby/seed-040.rb +0 -22
  1253. package/packages/crucible/seeds/ruby/seed-041 2.rb +0 -23
  1254. package/packages/crucible/seeds/ruby/seed-041.rb +0 -23
  1255. package/packages/crucible/seeds/ruby/seed-042 2.rb +0 -25
  1256. package/packages/crucible/seeds/ruby/seed-042.rb +0 -25
  1257. package/packages/crucible/seeds/ruby/seed-043 2.rb +0 -23
  1258. package/packages/crucible/seeds/ruby/seed-043.rb +0 -23
  1259. package/packages/crucible/seeds/ruby/seed-044 2.rb +0 -16
  1260. package/packages/crucible/seeds/ruby/seed-044.rb +0 -16
  1261. package/packages/crucible/seeds/ruby/seed-045 2.rb +0 -22
  1262. package/packages/crucible/seeds/ruby/seed-045.rb +0 -22
  1263. package/packages/crucible/seeds/ruby/seed-046 2.rb +0 -27
  1264. package/packages/crucible/seeds/ruby/seed-046.rb +0 -27
  1265. package/packages/crucible/seeds/ruby/seed-047 2.rb +0 -26
  1266. package/packages/crucible/seeds/ruby/seed-047.rb +0 -26
  1267. package/packages/crucible/seeds/ruby/seed-048 2.rb +0 -24
  1268. package/packages/crucible/seeds/ruby/seed-048.rb +0 -24
  1269. package/packages/crucible/seeds/ruby/seed-049 2.rb +0 -20
  1270. package/packages/crucible/seeds/ruby/seed-049.rb +0 -20
  1271. package/packages/crucible/seeds/ruby/seed-050 2.rb +0 -27
  1272. package/packages/crucible/seeds/ruby/seed-050.rb +0 -27
  1273. package/packages/crucible/seeds/rust/seed-001 2.rs +0 -25
  1274. package/packages/crucible/seeds/rust/seed-001.rs +0 -25
  1275. package/packages/crucible/seeds/rust/seed-002 2.rs +0 -20
  1276. package/packages/crucible/seeds/rust/seed-002.rs +0 -20
  1277. package/packages/crucible/seeds/rust/seed-003 2.rs +0 -23
  1278. package/packages/crucible/seeds/rust/seed-003.rs +0 -23
  1279. package/packages/crucible/seeds/rust/seed-004 2.rs +0 -21
  1280. package/packages/crucible/seeds/rust/seed-004.rs +0 -21
  1281. package/packages/crucible/seeds/rust/seed-005 2.rs +0 -21
  1282. package/packages/crucible/seeds/rust/seed-005.rs +0 -21
  1283. package/packages/crucible/seeds/rust/seed-006 2.rs +0 -24
  1284. package/packages/crucible/seeds/rust/seed-006.rs +0 -24
  1285. package/packages/crucible/seeds/rust/seed-007 2.rs +0 -20
  1286. package/packages/crucible/seeds/rust/seed-007.rs +0 -20
  1287. package/packages/crucible/seeds/rust/seed-008 2.rs +0 -19
  1288. package/packages/crucible/seeds/rust/seed-008.rs +0 -19
  1289. package/packages/crucible/seeds/rust/seed-009 2.rs +0 -28
  1290. package/packages/crucible/seeds/rust/seed-009.rs +0 -28
  1291. package/packages/crucible/seeds/rust/seed-010 2.rs +0 -28
  1292. package/packages/crucible/seeds/rust/seed-010.rs +0 -28
  1293. package/packages/crucible/seeds/rust/seed-011 2.rs +0 -25
  1294. package/packages/crucible/seeds/rust/seed-011.rs +0 -25
  1295. package/packages/crucible/seeds/rust/seed-012 2.rs +0 -31
  1296. package/packages/crucible/seeds/rust/seed-012.rs +0 -31
  1297. package/packages/crucible/seeds/rust/seed-013 2.rs +0 -27
  1298. package/packages/crucible/seeds/rust/seed-013.rs +0 -27
  1299. package/packages/crucible/seeds/rust/seed-014 2.rs +0 -30
  1300. package/packages/crucible/seeds/rust/seed-014.rs +0 -30
  1301. package/packages/crucible/seeds/rust/seed-015 2.rs +0 -33
  1302. package/packages/crucible/seeds/rust/seed-015.rs +0 -33
  1303. package/packages/crucible/seeds/rust/seed-016 2.rs +0 -22
  1304. package/packages/crucible/seeds/rust/seed-016.rs +0 -22
  1305. package/packages/crucible/seeds/rust/seed-017 2.rs +0 -28
  1306. package/packages/crucible/seeds/rust/seed-017.rs +0 -28
  1307. package/packages/crucible/seeds/rust/seed-018 2.rs +0 -21
  1308. package/packages/crucible/seeds/rust/seed-018.rs +0 -21
  1309. package/packages/crucible/seeds/rust/seed-019 2.rs +0 -36
  1310. package/packages/crucible/seeds/rust/seed-019.rs +0 -36
  1311. package/packages/crucible/seeds/rust/seed-020 2.rs +0 -27
  1312. package/packages/crucible/seeds/rust/seed-020.rs +0 -27
  1313. package/packages/crucible/seeds/rust/seed-021 2.rs +0 -26
  1314. package/packages/crucible/seeds/rust/seed-021.rs +0 -26
  1315. package/packages/crucible/seeds/rust/seed-022 2.rs +0 -23
  1316. package/packages/crucible/seeds/rust/seed-022.rs +0 -23
  1317. package/packages/crucible/seeds/rust/seed-023 2.rs +0 -22
  1318. package/packages/crucible/seeds/rust/seed-023.rs +0 -22
  1319. package/packages/crucible/seeds/rust/seed-024 2.rs +0 -24
  1320. package/packages/crucible/seeds/rust/seed-024.rs +0 -24
  1321. package/packages/crucible/seeds/rust/seed-025 2.rs +0 -29
  1322. package/packages/crucible/seeds/rust/seed-025.rs +0 -29
  1323. package/packages/crucible/seeds/rust/seed-026 2.rs +0 -23
  1324. package/packages/crucible/seeds/rust/seed-026.rs +0 -23
  1325. package/packages/crucible/seeds/rust/seed-027 2.rs +0 -24
  1326. package/packages/crucible/seeds/rust/seed-027.rs +0 -24
  1327. package/packages/crucible/seeds/rust/seed-028 2.rs +0 -25
  1328. package/packages/crucible/seeds/rust/seed-028.rs +0 -25
  1329. package/packages/crucible/seeds/rust/seed-029 2.rs +0 -25
  1330. package/packages/crucible/seeds/rust/seed-029.rs +0 -25
  1331. package/packages/crucible/seeds/rust/seed-030 2.rs +0 -30
  1332. package/packages/crucible/seeds/rust/seed-030.rs +0 -30
  1333. package/packages/crucible/seeds/rust/seed-031 2.rs +0 -22
  1334. package/packages/crucible/seeds/rust/seed-031.rs +0 -22
  1335. package/packages/crucible/seeds/rust/seed-032 2.rs +0 -25
  1336. package/packages/crucible/seeds/rust/seed-032.rs +0 -25
  1337. package/packages/crucible/seeds/rust/seed-033 2.rs +0 -25
  1338. package/packages/crucible/seeds/rust/seed-033.rs +0 -25
  1339. package/packages/crucible/seeds/rust/seed-034 2.rs +0 -20
  1340. package/packages/crucible/seeds/rust/seed-034.rs +0 -20
  1341. package/packages/crucible/seeds/rust/seed-035 2.rs +0 -28
  1342. package/packages/crucible/seeds/rust/seed-035.rs +0 -28
  1343. package/packages/crucible/seeds/rust/seed-036 2.rs +0 -26
  1344. package/packages/crucible/seeds/rust/seed-036.rs +0 -26
  1345. package/packages/crucible/seeds/rust/seed-037 2.rs +0 -31
  1346. package/packages/crucible/seeds/rust/seed-037.rs +0 -31
  1347. package/packages/crucible/seeds/rust/seed-038 2.rs +0 -25
  1348. package/packages/crucible/seeds/rust/seed-038.rs +0 -25
  1349. package/packages/crucible/seeds/rust/seed-039 2.rs +0 -28
  1350. package/packages/crucible/seeds/rust/seed-039.rs +0 -28
  1351. package/packages/crucible/seeds/rust/seed-040 2.rs +0 -27
  1352. package/packages/crucible/seeds/rust/seed-040.rs +0 -27
  1353. package/packages/crucible/seeds/rust/seed-041 2.rs +0 -32
  1354. package/packages/crucible/seeds/rust/seed-041.rs +0 -32
  1355. package/packages/crucible/seeds/rust/seed-042 2.rs +0 -27
  1356. package/packages/crucible/seeds/rust/seed-042.rs +0 -27
  1357. package/packages/crucible/seeds/rust/seed-043 2.rs +0 -29
  1358. package/packages/crucible/seeds/rust/seed-043.rs +0 -29
  1359. package/packages/crucible/seeds/rust/seed-044 2.rs +0 -25
  1360. package/packages/crucible/seeds/rust/seed-044.rs +0 -25
  1361. package/packages/crucible/seeds/rust/seed-045 2.rs +0 -28
  1362. package/packages/crucible/seeds/rust/seed-045.rs +0 -28
  1363. package/packages/crucible/seeds/rust/seed-046 2.rs +0 -25
  1364. package/packages/crucible/seeds/rust/seed-046.rs +0 -25
  1365. package/packages/crucible/seeds/rust/seed-047 2.rs +0 -34
  1366. package/packages/crucible/seeds/rust/seed-047.rs +0 -34
  1367. package/packages/crucible/seeds/rust/seed-048 2.rs +0 -21
  1368. package/packages/crucible/seeds/rust/seed-048.rs +0 -21
  1369. package/packages/crucible/seeds/rust/seed-049 2.rs +0 -26
  1370. package/packages/crucible/seeds/rust/seed-049.rs +0 -26
  1371. package/packages/crucible/seeds/rust/seed-050 2.rs +0 -23
  1372. package/packages/crucible/seeds/rust/seed-050.rs +0 -23
  1373. package/packages/crucible/seeds/ts/seed-001 2.ts +0 -32
  1374. package/packages/crucible/seeds/ts/seed-001.ts +0 -32
  1375. package/packages/crucible/seeds/ts/seed-002 2.ts +0 -34
  1376. package/packages/crucible/seeds/ts/seed-002.ts +0 -34
  1377. package/packages/crucible/seeds/ts/seed-003 2.ts +0 -28
  1378. package/packages/crucible/seeds/ts/seed-003.ts +0 -28
  1379. package/packages/crucible/seeds/ts/seed-004 2.ts +0 -34
  1380. package/packages/crucible/seeds/ts/seed-004.ts +0 -34
  1381. package/packages/crucible/seeds/ts/seed-005 2.ts +0 -32
  1382. package/packages/crucible/seeds/ts/seed-005.ts +0 -32
  1383. package/packages/crucible/seeds/ts/seed-006 2.ts +0 -31
  1384. package/packages/crucible/seeds/ts/seed-006.ts +0 -31
  1385. package/packages/crucible/seeds/ts/seed-007 2.ts +0 -28
  1386. package/packages/crucible/seeds/ts/seed-007.ts +0 -28
  1387. package/packages/crucible/seeds/ts/seed-008 2.ts +0 -40
  1388. package/packages/crucible/seeds/ts/seed-008.ts +0 -40
  1389. package/packages/crucible/seeds/ts/seed-009 2.ts +0 -31
  1390. package/packages/crucible/seeds/ts/seed-009.ts +0 -31
  1391. package/packages/crucible/seeds/ts/seed-010 2.ts +0 -33
  1392. package/packages/crucible/seeds/ts/seed-010.ts +0 -33
  1393. package/packages/crucible/seeds/ts/seed-011 2.ts +0 -29
  1394. package/packages/crucible/seeds/ts/seed-011.ts +0 -29
  1395. package/packages/crucible/seeds/ts/seed-012 2.ts +0 -34
  1396. package/packages/crucible/seeds/ts/seed-012.ts +0 -34
  1397. package/packages/crucible/seeds/ts/seed-013 2.ts +0 -31
  1398. package/packages/crucible/seeds/ts/seed-013.ts +0 -31
  1399. package/packages/crucible/seeds/ts/seed-014 2.ts +0 -36
  1400. package/packages/crucible/seeds/ts/seed-014.ts +0 -36
  1401. package/packages/crucible/seeds/ts/seed-015 2.ts +0 -31
  1402. package/packages/crucible/seeds/ts/seed-015.ts +0 -31
  1403. package/packages/crucible/seeds/ts/seed-016 2.ts +0 -37
  1404. package/packages/crucible/seeds/ts/seed-016.ts +0 -37
  1405. package/packages/crucible/seeds/ts/seed-017 2.ts +0 -44
  1406. package/packages/crucible/seeds/ts/seed-017.ts +0 -44
  1407. package/packages/crucible/seeds/ts/seed-018 2.ts +0 -33
  1408. package/packages/crucible/seeds/ts/seed-018.ts +0 -33
  1409. package/packages/crucible/seeds/ts/seed-019 2.ts +0 -32
  1410. package/packages/crucible/seeds/ts/seed-019.ts +0 -32
  1411. package/packages/crucible/seeds/ts/seed-020 2.ts +0 -33
  1412. package/packages/crucible/seeds/ts/seed-020.ts +0 -33
  1413. package/packages/crucible/seeds/ts/seed-021 2.ts +0 -33
  1414. package/packages/crucible/seeds/ts/seed-021.ts +0 -33
  1415. package/packages/crucible/seeds/ts/seed-022 2.ts +0 -34
  1416. package/packages/crucible/seeds/ts/seed-022.ts +0 -34
  1417. package/packages/crucible/seeds/ts/seed-023 2.ts +0 -33
  1418. package/packages/crucible/seeds/ts/seed-023.ts +0 -33
  1419. package/packages/crucible/seeds/ts/seed-024 2.ts +0 -35
  1420. package/packages/crucible/seeds/ts/seed-024.ts +0 -35
  1421. package/packages/crucible/seeds/ts/seed-025 2.ts +0 -29
  1422. package/packages/crucible/seeds/ts/seed-025.ts +0 -29
  1423. package/packages/crucible/seeds/ts/seed-026 2.ts +0 -36
  1424. package/packages/crucible/seeds/ts/seed-026.ts +0 -36
  1425. package/packages/crucible/seeds/ts/seed-027 2.ts +0 -30
  1426. package/packages/crucible/seeds/ts/seed-027.ts +0 -30
  1427. package/packages/crucible/seeds/ts/seed-028 2.ts +0 -32
  1428. package/packages/crucible/seeds/ts/seed-028.ts +0 -32
  1429. package/packages/crucible/seeds/ts/seed-029 2.ts +0 -34
  1430. package/packages/crucible/seeds/ts/seed-029.ts +0 -34
  1431. package/packages/crucible/seeds/ts/seed-030 2.ts +0 -37
  1432. package/packages/crucible/seeds/ts/seed-030.ts +0 -37
  1433. package/packages/crucible/seeds/ts/seed-031 2.ts +0 -31
  1434. package/packages/crucible/seeds/ts/seed-031.ts +0 -31
  1435. package/packages/crucible/seeds/ts/seed-032 2.ts +0 -32
  1436. package/packages/crucible/seeds/ts/seed-032.ts +0 -32
  1437. package/packages/crucible/seeds/ts/seed-033 2.ts +0 -32
  1438. package/packages/crucible/seeds/ts/seed-033.ts +0 -32
  1439. package/packages/crucible/seeds/ts/seed-034 2.ts +0 -34
  1440. package/packages/crucible/seeds/ts/seed-034.ts +0 -34
  1441. package/packages/crucible/seeds/ts/seed-035 2.ts +0 -29
  1442. package/packages/crucible/seeds/ts/seed-035.ts +0 -29
  1443. package/packages/crucible/seeds/ts/seed-036 2.ts +0 -34
  1444. package/packages/crucible/seeds/ts/seed-036.ts +0 -34
  1445. package/packages/crucible/seeds/ts/seed-037 2.ts +0 -33
  1446. package/packages/crucible/seeds/ts/seed-037.ts +0 -33
  1447. package/packages/crucible/seeds/ts/seed-038 2.ts +0 -29
  1448. package/packages/crucible/seeds/ts/seed-038.ts +0 -29
  1449. package/packages/crucible/seeds/ts/seed-039 2.ts +0 -35
  1450. package/packages/crucible/seeds/ts/seed-039.ts +0 -35
  1451. package/packages/crucible/seeds/ts/seed-040 2.ts +0 -31
  1452. package/packages/crucible/seeds/ts/seed-040.ts +0 -31
  1453. package/packages/crucible/seeds/ts/seed-041 2.ts +0 -29
  1454. package/packages/crucible/seeds/ts/seed-041.ts +0 -29
  1455. package/packages/crucible/seeds/ts/seed-042 2.ts +0 -33
  1456. package/packages/crucible/seeds/ts/seed-042.ts +0 -33
  1457. package/packages/crucible/seeds/ts/seed-043 2.ts +0 -32
  1458. package/packages/crucible/seeds/ts/seed-043.ts +0 -32
  1459. package/packages/crucible/seeds/ts/seed-044 2.ts +0 -36
  1460. package/packages/crucible/seeds/ts/seed-044.ts +0 -36
  1461. package/packages/crucible/seeds/ts/seed-045 2.ts +0 -39
  1462. package/packages/crucible/seeds/ts/seed-045.ts +0 -39
  1463. package/packages/crucible/seeds/ts/seed-046 2.ts +0 -41
  1464. package/packages/crucible/seeds/ts/seed-046.ts +0 -41
  1465. package/packages/crucible/seeds/ts/seed-047 2.ts +0 -33
  1466. package/packages/crucible/seeds/ts/seed-047.ts +0 -33
  1467. package/packages/crucible/seeds/ts/seed-048 2.ts +0 -33
  1468. package/packages/crucible/seeds/ts/seed-048.ts +0 -33
  1469. package/packages/crucible/seeds/ts/seed-049 2.ts +0 -34
  1470. package/packages/crucible/seeds/ts/seed-049.ts +0 -34
  1471. package/packages/crucible/seeds/ts/seed-050 2.ts +0 -41
  1472. package/packages/crucible/seeds/ts/seed-050.ts +0 -41
  1473. package/packages/crucible/seeds/ts/seed-051 2.ts +0 -34
  1474. package/packages/crucible/seeds/ts/seed-051.ts +0 -34
  1475. package/packages/crucible/seeds/ts/seed-052 2.ts +0 -36
  1476. package/packages/crucible/seeds/ts/seed-052.ts +0 -36
  1477. package/packages/scanner/alert-manager.js +0 -1
  1478. package/packages/scanner/ast-analyzer.js +0 -1
  1479. package/packages/scanner/cfg-analyzer.js +0 -1
  1480. package/packages/scanner/code-scanner.js +0 -1
  1481. package/packages/scanner/file-collector.js +0 -1
  1482. package/packages/scanner/file-watcher.js +0 -1
  1483. package/packages/scanner/ghost-code-detector.js +0 -1
  1484. package/packages/scanner/hallucination-detector.js +0 -1
  1485. package/packages/scanner/health-checker.js +0 -1
  1486. package/packages/scanner/investor-report.js +0 -1
  1487. package/packages/scanner/master-health-checker.js +0 -1
  1488. package/packages/scanner/monitor-store.js +0 -1
  1489. package/packages/scanner/python_ast_helper.py +0 -426
  1490. package/packages/scanner/secret-scanner.js +0 -1
  1491. package/packages/scanner/sentinel-core.js +0 -1
  1492. package/packages/scanner/support-bot.js +0 -1
  1493. package/packages/scanner/support-knowledge.js +0 -1
  1494. package/packages/scanner/taint-tracker.js +0 -1
  1495. /package/{packages → dist/packages}/crucible/badge-generator.js +0 -0
  1496. /package/{packages → dist/packages}/crucible/banner.js +0 -0
  1497. /package/{packages → dist/packages}/crucible/ci-integration.js +0 -0
  1498. /package/{packages → dist/packages}/crucible/golden-master.js +0 -0
  1499. /package/{packages → dist/packages}/crucible/index.js +0 -0
  1500. /package/{packages → dist/packages}/crucible/kenny-mode.js +0 -0
  1501. /package/{packages → dist/packages}/crucible/leaderboard.js +0 -0
  1502. /package/{packages → dist/packages}/crucible/mutation-engine.js +0 -0
  1503. /package/{packages → dist/packages}/crucible/pattern-learner.js +0 -0
  1504. /package/{packages → dist/packages}/crucible/rule-loader.js +0 -0
  1505. /package/{packages → dist/packages}/crucible/seeding-engine.js +0 -0
  1506. /package/{packages → dist/packages}/crucible/self-attack.js +0 -0
  1507. /package/{packages → dist/packages}/scanner/ai-confidence-scorer.js +0 -0
  1508. /package/{packages → dist/packages}/scanner/baseline-manager.js +0 -0
  1509. /package/{packages → dist/packages}/scanner/codebase-passport.js +0 -0
  1510. /package/{packages → dist/packages}/scanner/copy-paste-detector.js +0 -0
  1511. /package/{packages → dist/packages}/scanner/dependency-graph.js +0 -0
  1512. /package/{packages → dist/packages}/scanner/drift-detector.js +0 -0
  1513. /package/{packages → dist/packages}/scanner/executive-report.js +0 -0
  1514. /package/{packages → dist/packages}/scanner/export-verifier.js +0 -0
  1515. /package/{packages → dist/packages}/scanner/feedback-client.js +0 -0
  1516. /package/{packages → dist/packages}/scanner/go-ast-analyzer.js +0 -0
  1517. /package/{packages → dist/packages}/scanner/html-report.js +0 -0
  1518. /package/{packages → dist/packages}/scanner/index.js +0 -0
  1519. /package/{packages → dist/packages}/scanner/license-manager.js +0 -0
  1520. /package/{packages → dist/packages}/scanner/monitor-notifier.js +0 -0
  1521. /package/{packages → dist/packages}/scanner/monitor-service.js +0 -0
  1522. /package/{packages → dist/packages}/scanner/pre-commit-gate.js +0 -0
  1523. /package/{packages → dist/packages}/scanner/python-ast-analyzer.js +0 -0
  1524. /package/{packages → dist/packages}/scanner/read-file.js +0 -0
  1525. /package/{packages → dist/packages}/scanner/scan-diff.js +0 -0
  1526. /package/{packages → dist/packages}/scanner/scan-runner.js +0 -0
  1527. /package/{packages → dist/packages}/scanner/sentinel-knowledge.js +0 -0
  1528. /package/{packages → dist/packages}/scanner/slack-notifier.js +0 -0
  1529. /package/{packages → dist/packages}/scanner/tech-debt-analyzer.js +0 -0
  1530. /package/{packages → dist/packages}/scanner/tech-debt-cost.js +0 -0
  1531. /package/{packages → dist/packages}/scanner/widget-generator.js +0 -0
package/dist/cli.js ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ const path=require("path"),fs=require("fs"),os=require("os"),_CLI_VERSION=JSON.parse(fs.readFileSync(path.join(__dirname,"package.json"),"utf-8")).version,CodeScanner=require("./packages/scanner/code-scanner.js"),DependencyGraph=require("./packages/scanner/dependency-graph.js"),CIIntegration=require("./packages/crucible/ci-integration.js"),BadgeGenerator=require("./packages/crucible/badge-generator.js"),Leaderboard=require("./packages/crucible/leaderboard.js"),Crucible=require("./packages/crucible/index.js"),DriftDetector=require("./packages/scanner/drift-detector.js"),WidgetGenerator=require("./packages/scanner/widget-generator.js"),AlertManager=require("./packages/scanner/alert-manager.js"),TechDebtAnalyzer=require("./packages/scanner/tech-debt-analyzer.js"),HallucinationDetector=require("./packages/scanner/hallucination-detector.js"),HtmlReportGenerator=require("./packages/scanner/html-report.js"),FileWatcher=require("./packages/scanner/file-watcher.js"),LicenseManager=require("./packages/scanner/license-manager.js"),PreCommitGate=require("./packages/scanner/pre-commit-gate.js"),TechDebtCostCalculator=require("./packages/scanner/tech-debt-cost.js"),GhostCodeDetector=require("./packages/scanner/ghost-code-detector.js"),AIConfidenceScorer=require("./packages/scanner/ai-confidence-scorer.js"),CopyPasteDriftDetector=require("./packages/scanner/copy-paste-detector.js"),CodebasePassport=require("./packages/scanner/codebase-passport.js"),ExecutiveReport=require("./packages/scanner/executive-report.js"),InvestorReport=require("./packages/scanner/investor-report.js"),{SupplyChainAnalyzer:SupplyChainAnalyzer}=require("./packages/scanner/supply-chain.js"),GitVelocityAnalyzer=require("./packages/scanner/git-velocity.js"),SupportBot=require("./packages/scanner/support-bot.js"),FeedbackClient=require("./packages/scanner/feedback-client.js"),BaselineManager=require("./packages/scanner/baseline-manager.js"),MonitorStore=require("./packages/scanner/monitor-store.js"),{MonitorService:MonitorService,resolveIntervalMs:resolveIntervalMs}=require("./packages/scanner/monitor-service.js"),{collectFiles:collectFiles}=require("./packages/scanner/file-collector.js"),{generateArchitectureMap:generateArchitectureMap}=require("./packages/scanner/architecture-map.js"),{calculateRiskValuation:calculateRiskValuation}=require("./packages/scanner/risk-valuation.js"),{recordAndAnalyze:recordAndAnalyze}=require("./packages/scanner/scan-history.js"),{generateBenchmarks:generateBenchmarks}=require("./packages/scanner/benchmarks.js");function parseFlag(e,o,n){const c=e.find(e=>e.startsWith(`--${o}=`));return c?c.split("=").slice(1).join("="):!!e.includes(`--${o}`)||n}function parseIntFlag(e,o,n){const c=parseFlag(e,o,null);if(null===c)return n;const l=parseInt(c,10);return isNaN(l)?n:l}const COLORS={reset:"",bold:"",red:"",green:"",yellow:"",blue:"",cyan:"",gray:"",white:"",bgRed:"",bgGreen:"",bgYellow:""};function c(e,o){return`${COLORS[e]}${o}${COLORS.reset}`}function banner(){console.log(""),console.log(c("cyan"," ╔══════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," THUBAN Code Health Engine ")+c("cyan","║")),console.log(c("cyan"," ║")+c("gray",` v${_CLI_VERSION} · Public Beta · thuban.dev `)+c("cyan","║")),console.log(c("cyan"," ╚══════════════════════════════════════╝")),console.log("")}function printHelp(){banner();const e=(new LicenseManager).getStatus(),o=JSON.parse(fs.readFileSync(path.join(__dirname,"package.json"),"utf-8"));console.log(c("gray",` v${o.version} · ${e.tierName} tier`)+(e.licensed?c("green"," ✓"):"")+c("gray"," · https://thuban.dev")),console.log(""),console.log(c("bold"," QUICK START")),console.log(""),console.log(c("gray"," Run these in order to see what Thuban does:")),console.log(""),console.log(` ${c("cyan","npx thuban scan .")} Scan your project`),console.log(` ${c("cyan","npx thuban fix .")} Preview what can be fixed`),console.log(` ${c("cyan","npx thuban fix . --fix")} Apply all safe fixes`),console.log(` ${c("cyan","npx thuban dashboard .")} Open visual HTML report`),console.log(""),console.log(c("bold"," SCAN & DETECT")),console.log(""),console.log(` ${c("cyan","scan")} [path|url] Full health scan — score, grade, all issues`),console.log(` ${c("cyan","compare")} [a] [b] Compare two codebases side by side`),console.log(` ${c("cyan","hallucinate")} [path] Find phantom APIs and invented imports`),console.log(` ${c("cyan","ghosts")} [path] Dead functions nobody calls`),console.log(` ${c("cyan","ai-score")} [path] Probability each function is AI-generated`),console.log(` ${c("cyan","clones")} [path] Copy-pasted code that has drifted apart`),console.log(` ${c("cyan","drift")} [path] Files that changed since Mother Code was set`),console.log(` ${c("cyan","deps")} [path] Dependency map — circular, orphan, critical`),console.log(` ${c("cyan","diff")} [path] Scan only git-changed files`),console.log(` ${c("cyan","debt")} [path] Detailed tech debt breakdown`),console.log(` ${c("cyan","cost")} [path] Tech debt translated to £ and hours`),console.log(""),console.log(c("bold"," FIX & PROTECT")),console.log(""),console.log(` ${c("cyan","fix")} [path] Preview fixable issues ${c("gray","(safe, no changes)")}`),console.log(` ${c("cyan","fix")} [path] ${c("gray","--fix")} Apply all safe fixes`),console.log(` ${c("cyan","fix")} [path] ${c("gray","--fix --commit")} Each fix = 1 git commit ${c("gray","(revert any)")}`),console.log(` ${c("cyan","inject")} [path] Add Mother Code DNA to every file`),console.log(` ${c("cyan","gate")} Install pre-commit hook ${c("gray","(blocks hallucinations)")}`),console.log(` ${c("cyan","watch")} [path] Live sentinel — scans files as you save`),console.log(` ${c("cyan","monitor")} [path] Recurring scans with saved history and alerts ${c("gray","(Pro)")}`),console.log(` ${c("cyan","history")} [path] View recurring scan history for a repo ${c("gray","(Pro)")}`),console.log(` ${c("cyan","trend")} [path] Show issue trends across recurring scans ${c("gray","(Pro)")}`),console.log(` ${c("cyan","baseline")} [path] Snapshot issues so future scans show only NEW ones`),console.log(""),console.log(c("bold"," REPORTS")),console.log(""),console.log(` ${c("cyan","dashboard")} [path] Interactive HTML report ${c("gray","(share with your team)")}`),console.log(` ${c("cyan","executive")} [path] CTO-ready report ${c("gray","(print to PDF from browser)")}`),console.log(` ${c("cyan","report")} [path] Combined scan + deps + drift summary`),console.log(` ${c("cyan","passport")} [path] Codebase identity card ${c("gray","(for new team members)")}`),console.log(""),console.log(c("bold"," INVESTOR")),console.log(""),console.log(` ${c("cyan","investor-report")} [path] Board-ready due diligence report ${c("gray","(--key=XXX for full)")}`),console.log(` ${c("gray"," Free: score + verdict | $99 Snapshot: + risk matrix | $249 Full: everything")}`),console.log(""),console.log(c("bold"," SUPPORT & FEEDBACK")),console.log(""),console.log(` ${c("cyan","support")} Interactive diagnostic assistant`),console.log(` ${c("cyan","support")} ${c("gray","--diagnose")} Run full system diagnostic`),console.log(` ${c("cyan","feedback")} ${c("gray",'"message"')} Report a bug or request a feature`),console.log(""),console.log(c("bold"," LICENSE")),console.log(""),console.log(` ${c("cyan","activate")} <key> Activate a license key`),console.log(` ${c("cyan","status")} Show license, usage, and features`),console.log(` ${c("cyan","upgrade")} Open pricing page`),console.log(""),console.log(c("bold"," OPTIONS")),console.log(""),console.log(` ${c("gray","--fix")} Apply changes ${c("gray","(default is dry-run preview)")}`),console.log(` ${c("gray","--commit")} Auto-commit each fix for easy rollback`),console.log(` ${c("gray","--unsafe")} Include fixes that change runtime behaviour`),console.log(` ${c("gray","--json")} Machine-readable JSON output`),console.log(` ${c("gray","--baseline")} Only show NEW issues vs saved baseline`),console.log(` ${c("gray","--verbose")} Show detailed output`),console.log(` ${c("gray","--ignore <pat>")} Skip files matching pattern`),console.log(` ${c("gray","--max-issues <n>")} Limit displayed issues ${c("gray","(default: 50)")}`),console.log(""),console.log(c("bold"," EXAMPLES")),console.log(""),console.log(c("gray"," # Scan the current project")),console.log(` ${c("white","npx thuban scan .")}`),console.log(""),console.log(c("gray"," # Find and fix all AI hallucinations")),console.log(` ${c("white","npx thuban hallucinate .")}`),console.log(` ${c("white","npx thuban fix . --fix")}`),console.log(""),console.log(c("gray"," # Generate a report for your CTO")),console.log(` ${c("white","npx thuban executive .")}`),console.log(""),console.log(c("gray"," # Block hallucinated code on every commit")),console.log(` ${c("white","npx thuban gate --fix")}`),console.log(""),console.log(c("gray"," # Scan a specific folder, ignore tests")),console.log(` ${c("white",'npx thuban scan ./src --ignore "**/*.test.js"')}`),console.log(""),console.log(c("gray"," # Generate an investor due diligence report")),console.log(` ${c("white",'npx thuban investor-report . --company-name="Acme Corp"')}`),console.log(""),console.log(c("gray"," # Get help from the support assistant")),console.log(` ${c("white","npx thuban support")}`),console.log(""),console.log(c("gray"," Report a bug or request a feature:")),console.log(` ${c("white",'npx thuban feedback "your message here"')}`),console.log(` ${c("cyan","https://github.com/SilverwingsBenefitsGit/thuban/issues")}`),console.log("")}function parseArgs(e){const o={command:null,targetPath:process.cwd(),json:!1,fix:!1,dryRun:!1,safe:!0,gitCommit:!1,verbose:!1,ignore:[],maxIssues:50,licenseKey:null,baseline:!1,baselineCreate:!1,frequency:"daily",intervalMs:null,notify:"inbox",once:!1,companyName:null,feedbackText:null,diagnoseOnly:!1,smart:!1,reportKey:null,sbom:!1,offline:!1},n=["activate","status","upgrade","help","version","support","feedback"];let c=0;for(;c<e.length;){const l=e[c];"--json"===l?o.json=!0:"--fix"===l?o.fix=!0:"--dry-run"===l||"--dryrun"===l?o.dryRun=!0:"--unsafe"===l?o.safe=!1:"--git-commit"===l||"--commit"===l?o.gitCommit=!0:"--baseline"===l?o.baseline=!0:"--baseline-create"===l?o.baselineCreate=!0:"--frequency"===l&&e[c+1]?o.frequency=e[++c]:"--interval-ms"===l&&e[c+1]?o.intervalMs=parseInt(e[++c],10):"--notify"===l&&e[c+1]?o.notify=e[++c]:"--once"===l?o.once=!0:"--diagnose"===l?o.diagnoseOnly=!0:"--smart"===l?o.smart=!0:l.startsWith("--key=")?o.reportKey=l.split("=").slice(1).join("="):"--key"===l&&e[c+1]?o.reportKey=e[++c]:l.startsWith("--company-name=")?o.companyName=l.split("=").slice(1).join("="):"--company-name"===l&&e[c+1]?o.companyName=e[++c]:"--sbom"===l?o.sbom=!0:"--offline"===l?o.offline=!0:"--verbose"===l?o.verbose=!0:"--ignore"===l&&e[c+1]?o.ignore.push(e[++c]):"--max-issues"===l&&e[c+1]?o.maxIssues=parseInt(e[++c],10):"--help"===l||"-h"===l?o.command="help":"--version"===l||"-v"===l?o.command="version":o.command?"activate"!==o.command||o.licenseKey?"feedback"!==o.command||o.feedbackText?n.includes(o.command)||(l.match(/^(https?:\/\/|git@)/)?o.targetPath=l:o.targetPath=path.resolve(l)):o.feedbackText=l:o.licenseKey=l:o.command=l,c++}return o}function summarizeRemainingFiles(e,o,n){const c=new Set(e),l=o.filter(e=>!c.has(e)),s=new Map;for(const e of l){const o=path.relative(n,e).split(path.sep).filter(Boolean),c=o.length>1?o[0]:"(root)";s.set(c,(s.get(c)||0)+1)}const t=Array.from(s.entries()).sort((e,o)=>o[1]-e[1]||e[0].localeCompare(o[0])).slice(0,3).map(([e,o])=>({directory:e,count:o}));return{remainingFiles:l,remainingCount:l.length,topDirectories:t,previewFiles:l.slice(0,5).map(e=>path.relative(n,e))}}function requireProFeature(e){const o=new LicenseManager;if(!o.canUseProFeature(e).allowed){const o="https://thuban.dev/pricing";console.log(""),console.log(c("yellow"," ╔══════════════════════════════════════════════════════════════╗")),console.log(c("yellow"," ║")+c("bold"," PRO FEATURE REQUIRED ")+c("yellow","║")),console.log(c("yellow"," ╠══════════════════════════════════════════════════════════════╣")),console.log(c("yellow"," ║")+` ${e} is available on Thuban Pro.`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" Free Thuban gives you a one-off checkup. Pro gives you".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" a pair of eyes on your codebase all day every day with".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" recurring scans, saved history, trends, and alerts.".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ║")+` Upgrade now: ${o}`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" CLI shortcut: thuban upgrade".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ╚══════════════════════════════════════════════════════════════╝")),console.log(""),process.exit(0)}return o}function resolveRepoConfigOrExit(e,o){const n=e.getRepo(o);return n||(console.log(""),console.log(c("yellow"," No monitor configuration found for this repo.")),console.log(c("gray"," Run `thuban monitor <path> --once` or `thuban monitor <path>` first.")),console.log(""),process.exit(0)),n}function printFileCapUpgradePrompt({scannedCount:e,totalCount:o,remainingSummary:n,upgradeUrl:l}){const s=n.topDirectories.length;if(console.log(c("yellow"," ╔══════════════════════════════════════════════════════════════╗")),console.log(c("yellow"," ║")+c("bold"," FREE TIER LIMIT REACHED ")+c("yellow","║")),console.log(c("yellow"," ╠══════════════════════════════════════════════════════════════╣")),console.log(c("yellow"," ║")+` You have scanned ${e} of ${o} files.`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" Upgrade to Thuban Pro for continuous monitoring —".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" a pair of eyes on your codebase, all day, every day.".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" Your always-on guardian with unlimited scans.".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+` ${n.remainingCount} more files remaining including ${s}`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+` critical director${1===s?"y":"ies"}.`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ║")+` Upgrade now: ${l}`.padEnd(62)+c("yellow","║")),console.log(c("yellow"," ║")+" CLI shortcut: thuban upgrade".padEnd(62)+c("yellow","║")),console.log(c("yellow"," ╚══════════════════════════════════════════════════════════════╝")),console.log(""),n.topDirectories.length>0){console.log(c("bold"," Remaining scan preview"));for(const e of n.topDirectories)console.log(` ${c("yellow","•")} ${c("cyan",e.directory)} ${c("gray",`(${e.count} files)`)}`);if(n.previewFiles.length>0){console.log(""),console.log(c("gray"," Next files that would be scanned:"));for(const e of n.previewFiles)console.log(` ${c("gray","·")} ${e}`)}console.log("")}}async function cmdScan(e){const o=Date.now(),n=/^(https?:\/\/|git@)/.test(e.targetPath);let l=n?e.targetPath:path.resolve(e.targetPath),s=null;if(n){e.json||(console.log(""),console.log(c("cyan"," Cloning repository...")),console.log(c("gray",` ${e.targetPath}`)));const o=path.join(os.tmpdir(),"thuban-scan-"+Date.now()),{execFileSync:n}=require("child_process");try{n("git",["clone","--depth","1",e.targetPath,o],{stdio:"pipe",timeout:6e4}),l=o,s=o,e.json||(console.log(c("cyan"," Cloned successfully")),console.log(""))}catch(e){console.error(c("red",` Failed to clone repository: ${e.message}`)),console.error(c("gray"," Check the URL is correct and the repo is accessible")),process.exit(1)}}const t=new LicenseManager,a=t.getTierConfig(),r=t.canScan(),i="https://thuban.dev/pricing";r.allowed||e.json||(console.log(""),console.log(c("red"," ╔══════════════════════════════════════════════════╗")),console.log(c("red"," ║")+c("bold"," Monthly scan limit reached ")+c("red","║")),console.log(c("red"," ╚══════════════════════════════════════════════════╝")),console.log(""),console.log(` You've used ${c("bold",r.used+"/"+r.limit)} free scans this month.`),console.log(` Resets on ${c("cyan",r.resetsOn)}.`),console.log(""),console.log(` ${c("cyan","Upgrade to Pro")} for unlimited scans, full reports, auto-fix, and an always-on pair of eyes via thuban monitor:`),console.log(` ${c("bold",i)}`),console.log(""),console.log(` Or activate a key: ${c("cyan","thuban activate <your-key>")}`),console.log(""),process.exit(0)),e.json||(banner(),0===t.usage.totalScans&&(console.log(c("cyan"," ┌──────────────────────────────────────────────────────┐")),console.log(c("cyan"," │")+c("bold"," Welcome to Thuban! ")+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","Thuban scans your codebase for AI hallucinations,")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","dead code, tech debt, and architecture drift.")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","After this scan, try:")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban fix .")+" "+c("gray","Preview fixes")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban dashboard .")+" "+c("gray","Visual report")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban --help")+" "+c("gray","All commands")+" "+c("cyan","│")),console.log(c("cyan"," └──────────────────────────────────────────────────────┘")),console.log("")),console.log(c("bold"," SCANNING: ")+c("cyan",l)),console.log(""));const g=collectFiles(l,e.ignore),d=g.length,y=a.maxFiles<1/0?g.slice(0,a.maxFiles):g,u=d>a.maxFiles,h=u?summarizeRemainingFiles(y,g,l):null;if(!e.json&&u?(console.log(c("yellow",` Free tier: scanning ${a.maxFiles} of ${d} files`)),console.log(c("gray"," Partial results below. Upgrade to scan your entire codebase.")),console.log("")):e.json||(console.log(c("gray",` Found ${y.length} files to scan...`)),console.log("")),0===y.length)return e.json?void console.log(JSON.stringify({files:0,filesScanned:0,elapsed_ms:Date.now()-o,tier:t.getTier(),issues:[],totalIssues:0,score:null,grade:"N/A",warning:"No scannable files found. Thuban deeply analyses: JavaScript, TypeScript, Python, Go, Rust, Java, Kotlin, C#, PHP, Ruby. Other file types are not yet supported.",supportedExtensions:[".js",".ts",".jsx",".tsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".cs",".php",".rb"]},null,2)):(console.log(c("yellow"," ╔══════════════════════════════════════════════════════╗")),console.log(c("yellow"," ║")+c("bold"," NO SCANNABLE FILES FOUND ")+c("yellow","║")),console.log(c("yellow"," ╠══════════════════════════════════════════════════════╣")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ║")+c("bold"," Thuban cannot score this project. ")+" "+c("yellow","║")),console.log(c("yellow"," ║")+" No files matched the supported language list. "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("cyan","Deeply analysed:")+" "+c("yellow","║")),console.log(c("yellow"," ║")+" JS · TS · Python · Go · Rust · Java "+c("yellow","║")),console.log(c("yellow"," ║")+" Kotlin · C# · PHP · Ruby "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("gray","More languages coming soon. Request yours at")+" "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("cyan",'thuban feedback "Please add <language>"')+" "+c("yellow","║")),console.log(c("yellow"," ║")+" "+c("yellow","║")),console.log(c("yellow"," ╚══════════════════════════════════════════════════════╝")),void console.log(""));const p=new CodeScanner({rootPath:l,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),f=new HallucinationDetector({rootPath:l}),[m,b]=await Promise.all([p.scanFiles(y),f.scan(y)]),$=Date.now()-o;t.recordScan();const w=[];for(const e of m.issues||[])w.push({file:path.relative(l,e.file),...e});for(const e of b.phantomAPIs)w.push({file:e.file,line:e.line,severity:"critical",category:"hallucination",id:"HALL_API",message:`${e.name} — this API does not exist`,suggestion:e.suggestion,crash:!0});for(const e of b.phantomImports)w.push({file:e.file,line:e.line,severity:"critical",category:"hallucination",id:"HALL_IMPORT",message:`${e.module} — ${e.reason}`,crash:!0});for(const e of b.deprecatedAPIs)w.push({file:e.file,line:e.line,severity:"high",category:"deprecated",id:"DEPR_API",message:`${e.name} — deprecated since ${e.since}`,suggestion:e.suggestion});for(const e of b.aiSmells)w.push({file:e.file,line:e.line,severity:"warning",category:"ai_smell",id:e.id,message:e.message});if(e.json)return void console.log(JSON.stringify({files:d,filesScanned:y.length,elapsed_ms:$,tier:t.getTier(),issues:a.showFullDetails?w:w.slice(0,a.teaserIssues),totalIssues:w.length,gated:!a.showFullDetails,fileLimitReached:u,upgradeUrl:u?i:null,remainingFiles:h?h.remainingCount:0,remainingDirectories:h?h.topDirectories:[],remainingPreview:h?h.previewFiles:[]},null,2));const v={critical:0,high:1,error:2,medium:3,warning:4,low:5,info:6};w.sort((e,o)=>(v[e.severity]||99)-(v[o.severity]||99));const S=w.filter(e=>"critical"===e.severity),C=w.filter(e=>"high"===e.severity||"error"===e.severity),x=w.filter(e=>"medium"===e.severity||"warning"===e.severity),E=w.filter(e=>"low"===e.severity||"info"===e.severity),P=w.filter(e=>"hallucination"===e.category),I=w.filter(e=>"deprecated"===e.category),A=w.filter(e=>"ai_smell"===e.category),R=x.filter(e=>"ai_smell"!==e.category),D=Math.max(0,100-15*S.length-5*C.length-2*R.length-.5*A.length-.25*E.length),N=D>=90?"A":D>=80?"B":D>=70?"C+":D>=60?"C":D>=50?"D+":D>=40?"D":"F",T=D>=80?"green":D>=60?"yellow":"red",k=w.filter(e=>!1!==e.fixable).length;console.log(c("cyan"," ╔══════════════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," THUBAN SCAN RESULTS ")+c("cyan","║")),console.log(c("cyan"," ║")+c("gray",` v${_CLI_VERSION} · Public Beta `)+c("cyan","║")),console.log(c("cyan"," ╠══════════════════════════════════════════════════════╣")),console.log(c("cyan"," ║")+` Files scanned: ${c("bold",String(y.length).padEnd(6))}`+(u?c("yellow",` of ${d}`):" ")+c("cyan"," ║")),console.log(c("cyan"," ║")+` Health score: ${c(T,(N+" ("+Math.round(D)+"/100)").padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ║")+` Issues found: ${c(w.length>0?"yellow":"green",String(w.length).padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ║")+` Auto-fixable: ${c("green",String(k).padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ║")+` Scan time: ${c("gray",($+"ms").padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ╚══════════════════════════════════════════════════════╝")),console.log("");const F=t.getTier();if("trial"===F&&t._trialInfo){const{daysRemaining:e,expiresAt:o}=t._trialInfo,n=e<=3?"red":e<=7?"yellow":"cyan",l=new Date(o).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"});console.log(c(n,` Trial: ${e} day${1===e?"":"s"} remaining (expires ${l})`)),e<=7&&console.log(c("gray"," Love it? Upgrade at: ")+c("cyan","https://thuban.dev/pricing")),console.log("")}else"free"===F&&t._trialExpired&&(console.log(c("yellow"," Your Thuban trial has expired. Upgrade to continue:")),console.log(c("cyan"," https://thuban.dev/pricing")),console.log(""));if(y.some(e=>!(e.endsWith(".js")||e.endsWith(".ts")||e.endsWith(".jsx")||e.endsWith(".tsx")||e.endsWith(".mjs")))){const e=[...new Set(y.filter(e=>!/\.(js|ts|jsx|tsx|mjs)$/.test(e)).map(e=>path.extname(e)).filter(Boolean))];console.log(c("gray"," Note: Score includes Security + Hallucination + Code Quality categories.")),console.log(c("gray",` Architecture + Dependency analysis evaluated for JS/TS only. Detected non-JS: ${e.join(", ")}`)),console.log("")}if(P.length>0){console.log(c("bgRed"," CRITICAL ")+c("red",c("bold",` ${P.length} Hallucinated API${P.length>1?"s":""}`))),console.log(c("gray"," These imports or method calls do not exist. Your code WILL crash when it hits them.")),console.log("");const e=a.showFullDetails?P.length:Math.min(a.teaserIssues,P.length);for(let o=0;o<e;o++){const e=P[o],n=e.line?`:${e.line}`:"";console.log(` ${c("cyan",e.file+n)}`);try{const o=path.resolve(l,e.file),n=fs.readFileSync(o,"utf-8").replace(/\r\n/g,"\n").split("\n");e.line&&n[e.line-1]&&console.log(` ${c("red",n[e.line-1].trim())}`)}catch(e){}console.log(` ${c("yellow","^^^")} ${e.message}`),e.suggestion&&console.log(` ${c("green","Fix:")} ${e.suggestion}`),console.log("")}P.length>e&&(console.log(c("gray",` ... ${P.length-e} more hallucinations hidden`)),console.log(c("cyan"," Upgrade to Pro to see all: ")+c("bold","thuban upgrade")),console.log(""))}if(I.length>0){console.log(c("red",c("bold",` DEPRECATED: ${I.length} API${I.length>1?"s":""} that will break on upgrade`))),console.log(c("gray"," These work NOW but will stop working when you upgrade Node.js or your dependencies.")),console.log(c("gray"," Fix: ")+c("cyan","npx thuban fix . --fix --unsafe")),console.log("");const e=a.showFullDetails?I.length:Math.min(a.teaserIssues,I.length);for(let o=0;o<e;o++){const e=I[o],n=e.line?`:${e.line}`:"";console.log(` ${c("cyan",e.file+n)}`),console.log(` ${c("yellow",e.message)}`),e.suggestion&&console.log(` ${c("green","→")} ${e.suggestion}`),console.log("")}I.length>e&&(console.log(c("gray",` ... ${I.length-e} more hidden`)),console.log(""))}const O=w.filter(e=>"security"===e.category),j=w.filter(e=>"quality"===e.category||"performance"===e.category||"ai"===e.category||"ai_smell"===e.category);if(O.length>0){console.log(c("red",c("bold",` SECURITY: ${O.length} issue${O.length>1?"s":""}`)));const e=a.showFullDetails?Math.min(O.length,10):Math.min(a.teaserIssues,O.length);for(let o=0;o<e;o++){const e=O[o],n=e.line?`:${e.line}`:"";console.log(` ${c("red","✗")} ${c("cyan",e.file+n)} ${c("gray",e.message)}`)}O.length>e&&console.log(c("gray",` ... ${O.length-e} more hidden`)),console.log("")}if(j.length>0){const e={};for(const o of j){const n=(o.message||o.type||"other").replace(/\s*—.*$/,"").trim();e[n]||(e[n]=[]),e[n].push(o)}const o=Object.entries(e).sort((e,o)=>o[1].length-e[1].length);console.log(c("yellow",c("bold",` CODE QUALITY: ${j.length} issue${j.length>1?"s":""}`))),console.log(c("gray"," Patterns that reduce code quality, maintainability, or production readiness.")),console.log("");const n=a.showFullDetails?o.length:Math.min(3,o.length);for(let e=0;e<n;e++){const[n,l]=o[e],s="high"===l[0].severity||"error"===l[0].severity?"red":"yellow";if(console.log(` ${c(s,"!")} ${c("bold",String(l.length))} x ${n}`),l[0].file){const e=l[0].line?`:${l[0].line}`:"";console.log(` ${c("gray","e.g.")} ${c("cyan",l[0].file+e)}`)}}o.length>n&&console.log(c("gray",` ... ${o.length-n} more issue types`)),console.log("");const l=j.filter(e=>!1!==e.fixable).length;l>0&&(console.log(c("gray",` ${l} of these can be auto-fixed: `)+c("cyan","npx thuban fix . --fix --unsafe")),console.log(""))}if(console.log(c("bold"," ┌──────────────────────────────────────────────────────┐")),D<60?console.log(c("bold"," │ ")+c("red","YOUR CODEBASE HAS A SERIOUS HEALTH PROBLEM ")+c("bold"," │")):D<80?console.log(c("bold"," │ ")+c("yellow","YOUR CODEBASE NEEDS ATTENTION ")+c("bold"," │")):console.log(c("bold"," │ ")+c("green","YOUR CODEBASE IS IN GOOD SHAPE ")+c("bold"," │")),console.log(c("bold"," │")+` Score: ${c(T,N+" ("+Math.round(D)+"/100)")} `+c("bold","│")),console.log(c("bold"," └──────────────────────────────────────────────────────┘")),console.log(""),S.length>0){console.log(c("red",` ${S.length} function${S.length>1?"s":""} will crash in production.`));const e=S.length<=3?"30 seconds":S.length<=10?"2 minutes":"10 minutes";console.log(c("gray",` Estimated cleanup: ${e} with Thuban auto-fix.`)),console.log(c("gray"," Estimated cost if shipped: your weekend.")),console.log("")}try{const e=t.getStatus();e.keyExpired?(console.log(c("red"," ┌──────────────────────────────────────────────────────┐")),console.log(c("red"," │")+c("bold"," LICENSE KEY EXPIRED ")+c("red","│")),console.log(c("red"," │")+" Your features have been downgraded to Free tier. "+c("red","│")),console.log(c("red"," │")+" Renew at: "+c("cyan","https://thuban.dev/account")+" "+c("red","│")),console.log(c("red"," │")+" Or run: "+c("bold","thuban activate <new-key>")+" "+c("red","│")),console.log(c("red"," └──────────────────────────────────────────────────────┘")),console.log("")):null!=e.keyDaysRemaining&&e.keyDaysRemaining<=14&&e.keyDaysRemaining>0&&(console.log(c("yellow",` ⚠ License key expires in ${e.keyDaysRemaining} day(s). Renew at https://thuban.dev/account`)),console.log(""))}catch(e){}if(a.showFullDetails)w.length>0&&(w.filter(e=>!1!==e.fixable).length,console.log(c("cyan"," ┌──────────────────────────────────────────────────────┐")),console.log(c("cyan"," │")+c("bold"," WHAT TO DO NEXT ")+c("cyan","│")),console.log(c("cyan"," ├──────────────────────────────────────────────────────┤")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","1. See what would be fixed (safe preview):")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban fix . ")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","2. Apply all safe fixes:")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban fix . --fix")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","3. Apply fixes with git rollback:")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban fix . --fix --commit")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","Each fix = 1 git commit. Undo any with git revert.")+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","4. Generate visual report (HTML):")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban dashboard .")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","Opens a dashboard you can share with your team.")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","5. Show tech debt cost in £:")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban cost .")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","6. Block bad code on every commit:")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","npx thuban gate")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","Installs a pre-commit hook. Set once, forget.")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("gray","All commands: npx thuban --help")+" "+c("cyan","│")),console.log(c("cyan"," └──────────────────────────────────────────────────────┘")),console.log(""));else{const e=w.length-a.teaserIssues;e>0&&(console.log(c("cyan"," ╔══════════════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold",` ${e} more issues hidden `)+c("cyan","║")),console.log(c("cyan"," ║")+c("gray"," Upgrade to see every issue, fix them automatically,")+c("cyan","║")),console.log(c("cyan"," ║")+c("gray"," and get the full HTML dashboard report. ")+c("cyan","║")),console.log(c("cyan"," ╠══════════════════════════════════════════════════════╣")),console.log(c("cyan"," ║")+` ${c("bold","thuban upgrade")} Open pricing page `+c("cyan","║")),console.log(c("cyan"," ║")+` ${c("bold","thuban activate")} <key> Activate a license key `+c("cyan","║")),console.log(c("cyan"," ╚══════════════════════════════════════════════════════╝")),console.log(""));const o=t.canScan(),n=o.remaining;console.log(c("gray",` Free scans remaining this month: ${n}/${o.limit}`)),console.log("")}u&&printFileCapUpgradePrompt({scannedCount:y.length,totalCount:d,remainingSummary:h,upgradeUrl:i}),w.length>0&&!u&&(console.log(c("gray"," ─────────────────────────────────────────────────────")),console.log(c("gray"," Thuban runs 100% on your machine. No data leaves.")),console.log(c("gray"," No cloud costs. As your codebase grows, Thuban grows with it.")),console.log(""),console.log(c("gray"," Keep your codebase healthy continuously:")),console.log(c("gray"," ")+c("cyan","npx thuban gate --fix")+c("gray"," Block bad code on every commit")),console.log(c("gray"," ")+c("cyan","npx thuban watch .")+c("gray"," Scan files as you save them")),console.log(c("gray"," ")+c("cyan","npx thuban baseline .")+c("gray"," Only alert on NEW issues")),console.log(""))}async function cmdDeps(e){const o=Date.now(),n=path.resolve(e.targetPath);e.json||(banner(),console.log(c("bold"," MAPPING DEPENDENCIES: ")+c("cyan",n)),console.log(""));const l=collectFiles(n,e.ignore),s=new DependencyGraph({rootPath:n});await s.build(l);const t=Date.now()-o,a=s.getModuleSummary(),r=s.getMostCriticalFiles(10),i=s.getOrphanFiles(),g=s.circularDeps||[];if(e.json)console.log(JSON.stringify({elapsed_ms:t,summary:a,critical:r,orphans:i,circular:g,graph:s.toJSON()},null,2));else{if(console.log(c("gray",` Analysed ${l.length} files in ${t}ms`)),console.log(""),console.log(c("bold"," DEPENDENCY SUMMARY")),console.log(` Files: ${a.totalFiles||l.length}`),console.log(` Import links: ${a.totalImports||0}`),console.log(` Circular deps: ${g.length>0?c("red",g.length):c("green","0")}`),console.log(` Orphan files: ${i.length>0?c("yellow",i.length):c("green","0")}`),console.log(""),r.length>0){console.log(c("bold"," MOST CRITICAL FILES")+c("gray"," (most dependents)"));for(const e of r){const o="string"==typeof e?e:e.file||e.path||String(e),l=path.relative(n,o),s="object"==typeof e&&(e.dependents||e.score||e.count)||"?";console.log(` ${c("cyan",l)} ${c("gray","→ "+s+" dependents")}`)}console.log("")}if(g.length>0){console.log(c("red"," CIRCULAR DEPENDENCIES"));for(const e of g.slice(0,5)){const o=Array.isArray(e)?e.map(e=>path.relative(n,e)).join(" → "):String(e);console.log(` ${c("yellow","⟲")} ${o}`)}console.log("")}if(i.length>0){console.log(c("yellow"," ORPHAN FILES")+c("gray"," (no imports, no exports consumed)"));for(const e of i.slice(0,10)){const o="string"==typeof e?e:e.file||e.path||String(e);console.log(` ${c("gray","○")} ${path.relative(n,o)}`)}i.length>10&&console.log(c("gray",` ... and ${i.length-10} more`)),console.log("")}}}async function cmdMonitor(e){requireProFeature("Scheduled monitoring");const o=path.resolve(e.targetPath),n=new MonitorService,l=n.configureRepo({repoPath:o,frequency:e.frequency,intervalMs:resolveIntervalMs(e.frequency,e.intervalMs),notification:{channels:String(e.notify||"inbox").split(",").map(e=>e.trim()).filter(Boolean)}});if(e.once){const o=await n.runRepoScan(l);return e.json?void console.log(JSON.stringify(o.run,null,2)):(console.log(""),console.log(c("bold"," THUBAN MONITOR RUN")),console.log(` Repo: ${l.repoPath}`),console.log(` New issues: ${o.diff.added.length}`),console.log(` Resolved issues: ${o.diff.resolved.length}`),console.log(` History saved: ${o.runPath}`),void console.log(""))}console.log(""),console.log(c("bold"," THUBAN MONITOR ACTIVE")),console.log(` Repo: ${l.repoPath}`),console.log(` Frequency: ${l.frequency} (${l.intervalMs}ms)`),console.log(` Notifications: ${(l.notification.channels||[]).join(", ")}`),console.log(c("gray"," Press Ctrl+C to stop.")),console.log(""),n.start(l),process.on("SIGINT",()=>{n.stopAll(),process.exit(0)})}async function cmdHistory(e){requireProFeature("Scan history");const o=new MonitorStore,n=resolveRepoConfigOrExit(o,e.targetPath),l=o.listRuns(n.repoId);if(e.json)return void console.log(JSON.stringify({repo:n,runs:l},null,2));console.log(""),console.log(c("bold"," THUBAN HISTORY")),console.log(` Repo: ${n.repoPath}`),console.log(` Runs: ${l.length}`),console.log("");for(const e of l.slice(-10).reverse())console.log(` ${c("cyan",e.timestamp)} issues=${e.metrics.issueCount} new=${e.diff?.added?.length||0} resolved=${e.diff?.resolved?.length||0}`);const s=o.getNotifications(10).filter(e=>e.repoId===n.repoId);if(s.length){console.log(""),console.log(c("bold"," RECENT ALERTS"));for(const e of s)console.log(` ${c("yellow",e.timestamp)} ${e.summary}`)}console.log("")}async function cmdTrend(e){requireProFeature("Trend reporting");const o=new MonitorStore,n=resolveRepoConfigOrExit(o,e.targetPath),l=o.listRuns(n.repoId).map(e=>({timestamp:e.timestamp,issueCount:e.metrics.issueCount,hallucinations:e.metrics.hallucinations,secrets:e.metrics.secrets,techDebtScore:e.metrics.techDebtScore,techDebtHours:e.metrics.techDebtHours}));if(e.json)console.log(JSON.stringify({repo:n,trend:l},null,2));else{console.log(""),console.log(c("bold"," THUBAN TREND")),console.log(` Repo: ${n.repoPath}`),console.log("");for(const e of l.slice(-12))console.log(` ${c("cyan",e.timestamp)} issues=${e.issueCount} hallucinations=${e.hallucinations} secrets=${e.secrets} debtScore=${e.techDebtScore??"n/a"} debtHours=${e.techDebtHours??"n/a"}`);console.log("")}}async function cmdDrift(e){const o=Date.now(),n=path.resolve(e.targetPath);e.json||(banner(),console.log(c("bold"," DETECTING DRIFT: ")+c("cyan",n)),console.log(""));const l=collectFiles(n,e.ignore),s=new DriftDetector({rootPath:n}),t=[];let a=0,r=0;for(const e of l)try{const o=await s.analyzeFile(e);o&&o.hasWidget&&(a++,o.drifts&&o.drifts.length>0&&(r++,t.push({file:path.relative(n,e),...o})))}catch(e){}const i=Date.now()-o;if(e.json)return void console.log(JSON.stringify({elapsed_ms:i,total:l.length,annotated:a,drifted:r,results:t},null,2));if(console.log(c("gray",` Checked ${l.length} files in ${i}ms`)),console.log(""),console.log(` Files with Mother Code: ${c("cyan",a)}`),console.log(` Files without: ${c("yellow",l.length-a)}`),console.log(` Files with drift: ${r>0?c("red",r):c("green","0")}`),console.log(""),t.length>0){console.log(c("bold"," DRIFT DETECTED"));for(const e of t.slice(0,20)){console.log(` ${c("yellow","⚠")} ${c("cyan",e.file)}`);for(const o of e.drifts)console.log(` ${c("gray","→")} ${o.type||o.id||o.name}: ${o.message||o.detail||JSON.stringify(o)}`)}console.log("")}const g=l.length>0?Math.round(a/l.length*100):0,d=g>=80?"green":g>=40?"yellow":"red";console.log(` Mother Code coverage: ${c(d,g+"%")}`),console.log(""),0===a&&(console.log(c("cyan"," ┌──────────────────────────────────────────────────────┐")),console.log(c("cyan"," │")+c("bold"," NO MOTHER CODE ANNOTATIONS FOUND ")+c("cyan","│")),console.log(c("cyan"," ├──────────────────────────────────────────────────────┤")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" Drift detection needs Mother Code annotations to "+c("cyan","│")),console.log(c("cyan"," │")+" know what each file SHOULD be doing. Without them, "+c("cyan","│")),console.log(c("cyan"," │")+" there is nothing to drift FROM. "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" Add annotations automatically: "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","npx thuban widget .")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," │")+" Then re-run drift detection: "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("bold","npx thuban drift .")+" "+c("cyan","│")),console.log(c("cyan"," │")+" "+c("cyan","│")),console.log(c("cyan"," └──────────────────────────────────────────────────────┘")),console.log(""))}async function cmdInject(e){const o=path.resolve(e.targetPath);e.json||(banner(),console.log(c("bold"," INJECTING MOTHER CODE: ")+c("cyan",o)),console.log(""));const n=collectFiles(o,e.ignore).filter(e=>e.endsWith(".js")||e.endsWith(".ts")||e.endsWith(".jsx")||e.endsWith(".tsx")||e.endsWith(".py")||e.endsWith(".java")||e.endsWith(".cs")||e.endsWith(".go")||e.endsWith(".kt")||e.endsWith(".rs")||e.endsWith(".php")||e.endsWith(".rb")),l=new DependencyGraph({rootPath:o});await l.build(n);const s=new WidgetGenerator({rootPath:o,dependencyGraph:l});let t=0,a=0;const r=[];for(const l of n)try{const n=fs.readFileSync(l,"utf-8").replace(/\r\n/g,"\n");if(n.includes("@purpose")&&n.includes("@module")){a++;continue}const i=await s.generateWidget(l,n);if(!i){a++;continue}const g=i&&i.widgetString?i.widgetString:String(i),d=path.extname(l).toLowerCase();let y;if(y=".py"===d||".rb"===d?g.replace(/^\/\*\*\r?\n/,"").replace(/\s*\*\/\s*$/,"").split(/\r?\n/).map(e=>e.replace(/^\s*\*\s?/,"# ")).join("\n"):".go"===d||".rs"===d?g.replace(/^\/\*\*\r?\n/,"").replace(/\s*\*\/\s*$/,"").split(/\r?\n/).map(e=>e.replace(/^\s*\*\s?/,"// ")).join("\n"):g,e.fix){let s;if(".php"===d&&n.trimStart().startsWith("<?php")){const e=n.indexOf("<?php")+5,o=n.slice(e);s=n.slice(0,e)+"\n"+y+"\n"+o}else s=y+"\n\n"+n;fs.writeFileSync(l,s,"utf-8"),t++,e.json||console.log(` ${c("green","✓")} ${path.relative(o,l)}`)}else r.push({file:path.relative(o,l),widget:y}),t++}catch(e){a++}if(e.json)console.log(JSON.stringify({injected:t,skipped:a,dryRun:!e.fix,previews:r},null,2));else{if(console.log(""),e.fix)console.log(c("green",` ✓ Injected Mother Code into ${t} files`));else if(console.log(c("yellow",` DRY RUN — ${t} files would be annotated. Use --fix to apply.`)),e.verbose&&r.length>0){console.log("");for(const e of r.slice(0,5))console.log(` ${c("cyan",e.file)}:`),console.log(c("gray",e.widget.split(/\r?\n/).map(e=>" "+e).join("\n"))),console.log("")}console.log(` ${c("gray",`Skipped: ${a} (already annotated or unsupported)`)}`),console.log("")}}async function cmdReport(e){const o=Date.now(),n=path.resolve(e.targetPath);e.json||(banner(),console.log(c("bold"," FULL REPORT: ")+c("cyan",n)),console.log(""));const l=collectFiles(n,e.ignore),s=new CodeScanner({rootPath:n}),t=new DependencyGraph({rootPath:n}),a=new DriftDetector({rootPath:n}),[r]=await Promise.all([s.scanFiles(l),t.build(l)]);let i=0,g=0;for(const e of l)try{const o=await a.analyzeFile(e);o&&o.hasWidget&&(g++,o.drifts&&o.drifts.length>0&&i++)}catch(e){}const d=Date.now()-o;let y=0,u=0,h=0;for(const e of r.issues||[])y++,"critical"===e.severity&&u++,"high"===e.severity&&h++;const p=t.getOrphanFiles(),f=t.circularDeps||[],m=l.length>0?Math.round(g/l.length*100):0,b=Math.max(0,Math.round(100-15*u-5*h-10*f.length-1*p.length-.1*(100-m)-3*i));if(e.json)return void console.log(JSON.stringify({elapsed_ms:d,files:l.length,health_score:b,issues:{total:y,critical:u,high:h},dependencies:{circular:f.length,orphans:p.length},mother_code:{annotated:g,coverage_pct:m,drifted:i}},null,2));const $=b>=80?"green":b>=60?"yellow":"red";console.log(c("bold"," ╔══════════════════════════════════════╗")),console.log(c("bold"," ║ THUBAN HEALTH REPORT ║")),console.log(c("bold"," ╚══════════════════════════════════════╝")),console.log(""),console.log(` ${c("bold","Health Score:")} ${c($,b+"/100")}`),console.log(` ${c("bold","Files Scanned:")} ${l.length}`),console.log(` ${c("bold","Time:")} ${d}ms`),console.log(""),console.log(c("bold"," ── Code Quality ──────────────────────")),console.log(` Total issues: ${y}`),console.log(` Critical: ${u>0?c("red",u):c("green","0")}`),console.log(` High: ${h>0?c("red",h):c("green","0")}`),console.log(""),console.log(c("bold"," ── Dependencies ─────────────────────")),console.log(` Circular deps: ${f.length>0?c("red",f.length):c("green","0")}`),console.log(` Orphan files: ${p.length>0?c("yellow",p.length):c("green","0")}`),console.log(""),console.log(c("bold"," ── Mother Code ──────────────────────")),console.log(` Annotated files: ${g}`),console.log(` Coverage: ${c(m>=80?"green":m>=40?"yellow":"red",m+"%")}`),console.log(` Drifted files: ${i>0?c("yellow",i):c("green","0")}`),console.log("");const w=b>=90?"A":b>=80?"B":b>=70?"C":b>=60?"D":"F",v=b>=80?"green":b>=60?"yellow":"red";console.log(` ${c("bold","Grade:")} ${c(v,w)}`),console.log(""),b<80&&(console.log(c("bold"," RECOMMENDATIONS:")),u>0&&console.log(` ${c("red","→")} Fix ${u} critical issues immediately`),f.length>0&&console.log(` ${c("yellow","→")} Resolve ${f.length} circular dependencies`),m<50&&console.log(` ${c("yellow","→")} Run ${c("cyan","thuban inject --fix")} to improve Mother Code coverage`),i>0&&console.log(` ${c("yellow","→")} ${i} files have drifted from their annotations`),p.length>5&&console.log(` ${c("gray","→")} Consider removing ${p.length} orphan files`),console.log(""))}async function runAnalysisCommand(e,o,n,l,s,t){const a=path.resolve(e.targetPath),r=collectFiles(a,e.ignore);e.json||(banner(),console.log(c("bold",` ${o}: `)+c("cyan",a)),console.log(c("gray",` Scanning ${r.length} ${n}`)),console.log(""));const i=l(a),g=await i[s](r);e.json?console.log(JSON.stringify(t.toJSON?t.toJSON(i,g):g,null,2)):console.log(t.toReport(i,g))}async function cmdDebt(e){await runAnalysisCommand(e,"TECH DEBT ANALYSIS","files...",e=>new TechDebtAnalyzer({rootPath:e}),"analyze",{toReport:(e,o)=>e.formatReport(o),toJSON:(e,o)=>e.toJSON(o)})}async function cmdFix(e){const o=path.resolve(e.targetPath),n=collectFiles(o,e.ignore),{execSync:l}=require("child_process");e.json||(banner(),console.log(c("bold"," AUTO-FIX TECH DEBT: ")+c("cyan",o)),console.log(""));const s=new TechDebtAnalyzer({rootPath:o});if(!e.fix){const o=await s.fix(n,{dryRun:!0});if(e.json)console.log(JSON.stringify(o,null,2));else{console.log(c("cyan"," ╔══════════════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," DRY RUN — no files will be changed ")+c("cyan","║")),console.log(c("cyan"," ╚══════════════════════════════════════════════════════╝")),console.log(""),console.log(` Fixable items: ${c("bold",o.totalFixable)}`),console.log("");const e={},n=["break_circular","extract_to_env","update_deprecated_api","wrap_localhost_url"];let l=0,s=0;for(const c of o.fixes){const o=c.fixAction||"unknown";e[o]||(e[o]=0),e[o]++,n.includes(o)?s++:l++}console.log(c("green",c("bold",` SAFE FIXES (${l})`))+c("gray"," — no runtime behaviour change"));for(const[o,l]of Object.entries(e).sort((e,o)=>o[1]-e[1])){if(n.includes(o))continue;const e={inject_widget:"Inject Mother Code DNA annotations",regenerate_widget:"Update stale annotations",remove_console_log:"Remove debug console.logs",flag_for_removal:"Confirm orphan files for removal"}[o]||o;console.log(` ${c("green","→")} ${e}: ${c("bold",l)}`)}if(console.log(""),s>0){console.log(c("yellow",c("bold",` UNSAFE FIXES (${s})`))+c("gray"," — may change runtime behaviour"));for(const[o,l]of Object.entries(e).sort((e,o)=>o[1]-e[1])){if(!n.includes(o))continue;const e={break_circular:"Restructure circular dependencies",extract_to_env:"Extract hardcoded secrets to env vars",update_deprecated_api:"Replace deprecated API calls with modern equivalents",wrap_localhost_url:"Wrap hardcoded localhost URLs in env var fallback"}[o]||o;console.log(` ${c("yellow","!")} ${e}: ${c("bold",l)}`)}console.log(""),console.log(c("gray"," Unsafe fixes require --unsafe flag:")),console.log(` ${c("cyan","thuban fix [path] --fix --unsafe")}`),console.log("")}console.log(c("bold"," TO APPLY:")),console.log(` ${c("cyan","thuban fix [path] --fix")} Apply safe fixes only`),console.log(` ${c("cyan","thuban fix [path] --fix --unsafe")} Apply all fixes`),console.log(` ${c("cyan","thuban fix [path] --fix --commit")} Each fix = separate git commit`),console.log("")}return}e.json||(e.safe?console.log(c("green"," SAFE MODE")+c("gray"," — only non-runtime-changing fixes will be applied")):console.log(c("yellow"," UNSAFE MODE")+c("gray"," — all fixes including runtime changes")),console.log(""));const t=await s.fix(n,{dryRun:!1,safeOnly:e.safe});if(e.gitCommit&&t.fixed>0)try{l("git rev-parse --git-dir",{cwd:o,stdio:"pipe"}),l("git add -A",{cwd:o,stdio:"pipe"});const n=`fix(thuban): auto-fix ${t.fixed} issues [safe=${e.safe}]`;l(`git commit -m "${n}"`,{cwd:o,stdio:"pipe"}),e.json||(console.log(c("green",` ✓ Changes committed: "${n}"`)),console.log(c("gray"," Revert with: git revert HEAD")),console.log(""))}catch(o){e.json||(console.log(c("yellow"," ⚠ Could not auto-commit: "+(o.message||"not a git repo"))),console.log(""))}if(e.json)console.log(JSON.stringify(t,null,2));else{console.log(c("cyan"," ╔══════════════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," FIX RESULTS ")+c("cyan","║")),console.log(c("cyan"," ╠══════════════════════════════════════════════════════╣"));const o=(t.fixes||[]).filter(e=>"fixed"===e.status&&("inject_widget"===e.fixAction||"regenerate_widget"===e.fixAction)).length,n=t.fixed-o;o>0&&console.log(c("cyan"," ║")+` Annotations added: ${c("green",String(o).padEnd(19))}`+c("cyan"," ║")),n>0&&console.log(c("cyan"," ║")+` Issues fixed: ${c("green",String(n).padEnd(20))}`+c("cyan"," ║")),0===o&&0===n&&console.log(c("cyan"," ║")+` Fixed: ${c("green",String(t.fixed).padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ║")+` Flagged for review: ${c("yellow",String(t.flagged).padEnd(19))}`+c("cyan"," ║")),t.failed>0&&console.log(c("cyan"," ║")+` Failed: ${c("red",String(t.failed).padEnd(20))}`+c("cyan"," ║")),t.skipped>0&&console.log(c("cyan"," ║")+` Skipped: ${c("gray",String(t.skipped).padEnd(20))}`+c("cyan"," ║")),console.log(c("cyan"," ╚══════════════════════════════════════════════════════╝")),console.log(""),t.fixed>0&&(console.log(c("green"," Your files have been updated. Changes are saved to disk.")),e.gitCommit||console.log(c("gray"," Tip: use --commit next time to auto-commit each fix for easy rollback.")),console.log(""),console.log(c("gray"," Verify the changes:")),console.log(c("gray"," ")+c("cyan","npx thuban scan .")+c("gray"," Re-scan to see your new score")),console.log(c("gray"," ")+c("cyan","npx thuban dashboard .")+c("gray"," Generate updated report")),console.log("")),t.skipped>0&&(console.log(c("gray",` ${t.skipped} items were skipped (no auto-fix available or pattern not matched).`)),console.log(c("gray"," Review them manually or run: ")+c("cyan","npx thuban dashboard .")),console.log("")),t.flagged>0&&(console.log(c("gray",` ${t.flagged} items need human review (secrets, orphan files, complex patterns).`)),console.log(c("gray"," See details: ")+c("cyan","npx thuban dashboard .")),console.log(""))}}async function cmdHallucinate(e){await runAnalysisCommand(e,"HALLUCINATION SCAN","files for AI hallucinations...",e=>new HallucinationDetector({rootPath:e}),"scan",{toReport:(e,o)=>e.formatReport(o)})}async function cmdWatch(e){const o=path.resolve(e.targetPath),n=new CodeScanner({rootPath:o,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),c=new HallucinationDetector({rootPath:o}),l=new FileWatcher({rootPath:o,ignorePatterns:["node_modules",".git","dist",".next","__pycache__",...e.ignore]});process.on("SIGINT",()=>{l.stop(),process.exit(0)}),l.start(async e=>{const o=[],l=await n.scanFile(e);l&&o.push(...l);const s=await c.scan([e]);if(s.phantomAPIs.length>0)for(const e of s.phantomAPIs)o.push({severity:"high",message:`Phantom API: ${e.name} — ${e.suggestion}`,line:e.line});if(s.phantomImports.length>0)for(const e of s.phantomImports)o.push({severity:"critical",message:`Phantom import: ${e.module} — ${e.reason}`,line:e.line});if(s.aiSmells.length>0)for(const e of s.aiSmells)o.push({severity:"warning",message:`AI smell: ${e.message}`,line:e.line});return o})}async function cmdDashboard(e){const o=path.resolve(e.targetPath),n=collectFiles(o,e.ignore);e.json||(banner(),console.log(c("bold"," GENERATING DASHBOARD: ")+c("cyan",o)),console.log(c("gray",` Scanning ${n.length} files...`)),console.log(""));const l=new TechDebtAnalyzer({rootPath:o}),s=await l.analyze(n),t=new DependencyGraph({rootPath:o});await t.build(n);const a={circular:t.circularDeps||[],orphans:t.getOrphanFiles()||[],critical:t.getMostCriticalFiles(5)||[]},r=new HallucinationDetector({rootPath:o}),i=await r.scan(n),g=new HtmlReportGenerator({rootPath:o,outputDir:o}),d=path.basename(o),y=await g.writeReport(s,a,{projectName:d,hallucinations:i});e.json?console.log(JSON.stringify({outputPath:y,scores:s.scores,stats:s.stats},null,2)):(console.log(c("green"," ✓ Dashboard generated:")),console.log(` ${c("cyan",y)}`),console.log(""),console.log(c("gray"," Open in your browser to view the interactive report")),console.log(""))}async function cmdDiff(e){const o=path.resolve(e.targetPath),{execSync:n}=require("child_process");e.json||(banner(),console.log(c("bold"," DIFF SCAN: ")+c("cyan",o)));let l=[];try{let e="main";try{n("git rev-parse --verify main",{cwd:o,stdio:"pipe"})}catch{try{n("git rev-parse --verify master",{cwd:o,stdio:"pipe"}),e="master"}catch{e="HEAD~1"}}const c=n(`git diff --name-only ${e}...HEAD`,{cwd:o,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),s=n("git diff --name-only HEAD",{cwd:o,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),t=n("git ls-files --others --exclude-standard",{cwd:o,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),a=new Set([...c.split(/\r?\n/).filter(Boolean),...s.split(/\r?\n/).filter(Boolean),...t.split(/\r?\n/).filter(Boolean)]);for(const e of a){const n=path.resolve(o,e),c=path.extname(e).toLowerCase();[".js",".ts",".jsx",".tsx",".mjs",".cjs",".json"].includes(c)&&fs.existsSync(n)&&l.push(n)}}catch(o){e.json||console.log(c("red",` ✗ Not a git repository or git error: ${o.message}`)),process.exit(1)}if(0===l.length)return void(e.json?console.log(JSON.stringify({changedFiles:0,issues:0})):console.log(c("green"," ✓ No changed files to scan")));e.json||console.log(c("gray",` Scanning ${l.length} changed file${1===l.length?"":"s"}...\n`));const s=new CodeScanner({rootPath:o}),t=new HallucinationDetector({rootPath:o}),a=await s.scanFiles(l),r=await t.scan(l);let i=0;const g={};for(const e of a.issues||[]){const n=path.relative(o,e.file);g[n]||(g[n]=[]),g[n].push(e),i++}if(i+=r.stats.totalIssues,e.json)console.log(JSON.stringify({changedFiles:l.length,totalIssues:i,codeIssues:g,hallucinations:r},null,2));else{for(const[e,o]of Object.entries(g)){console.log(` ${c("cyan",e)}`);for(const e of o.slice(0,5)){const o="critical"===e.severity||"high"===e.severity?"red":"warning"===e.severity?"yellow":"gray";console.log(` ${c(o,"✗")} ${c("gray",e.message||e.id||"")}`)}o.length>5&&console.log(` ${c("gray",`... and ${o.length-5} more`)}`),console.log("")}r.stats.totalIssues>0&&console.log(t.formatReport(r));const e=0===i?"green":"yellow";console.log(` ${c(e,`${l.length} files changed, ${i} new issues introduced`)}\n`)}}async function cmdActivate(e){banner();const o=new LicenseManager,n=e.licenseKey;if(!n)return console.log(c("red"," Usage: thuban activate <license-key>")),console.log(""),console.log(c("gray"," Get a key at: ")+c("cyan","https://thuban.dev/pricing")),void console.log("");const l=o.activate(n);if(l.success)if("trial"===l.tier){const e=new Date(l.expiresAt).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"});console.log(c("cyan"," ╔══════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," Trial activated — Pro features unlocked! ")+c("cyan","║")),console.log(c("cyan"," ╚══════════════════════════════════════════════╝")),console.log(""),console.log(` Tier: ${c("bold","Trial (Pro features)")}`),console.log(` Status: ${c("green","Active")}`),console.log(` Days left: ${c("cyan",l.daysRemaining+" days")}`),console.log(` Expires: ${c("gray",e)}`),console.log(""),console.log(c("gray"," Unlimited scans, all languages, full security reports.")),console.log(c("gray"," Run ")+c("cyan","npx thuban scan .")+c("gray"," to get started.")),console.log(""),console.log(c("gray"," Love it? Upgrade at: ")+c("cyan","https://thuban.dev/pricing")),console.log("")}else console.log(c("green"," ╔══════════════════════════════════════╗")),console.log(c("green"," ║")+c("bold"," License activated! ")+c("green","║")),console.log(c("green"," ╚══════════════════════════════════════╝")),console.log(""),console.log(` Tier: ${c("bold",l.tierName)}`),console.log(` Status: ${c("green","Active")}`),console.log(""),console.log(c("gray"," All features unlocked. Run ")+c("cyan","thuban scan .")+c("gray"," to get started.")),console.log("");else console.log(c("red"," Invalid license key.")),console.log(""),l.error&&l.error.includes("expired")?console.log(c("yellow",` ${l.error}`)):console.log(c("gray"," Check for typos or get a new key at: ")+c("cyan","https://thuban.dev/pricing")),console.log("")}async function cmdStatus(e){banner();const o=(new LicenseManager).getStatus();if(console.log(c("bold"," LICENSE STATUS")),console.log(""),console.log(` Tier: ${c("bold",o.tierName)}${o.licensed?c("green"," (active)"):""}`),console.log(` Machine ID: ${c("gray",o.machineId)}`),console.log(` Scans this month: ${c("bold",o.scansUsed)}${o.scansLimit<1/0?c("gray"," / "+o.scansLimit):""}`),console.log(` Lifetime scans: ${c("gray",o.totalScans)}`),"trial"===o.tier&&void 0!==o.trialDaysRemaining){const e=new Date(o.trialExpiresAt).toLocaleDateString("en-GB",{day:"numeric",month:"long",year:"numeric"}),n=o.trialDaysRemaining<=3?"red":o.trialDaysRemaining<=7?"yellow":"cyan";console.log(""),console.log(c("cyan"," ╔══════════════════════════════════════════════════════╗")),console.log(c("cyan"," ║")+c("bold"," TRIAL KEY ACTIVE ")+c("cyan","║")),console.log(c("cyan"," ╠══════════════════════════════════════════════════════╣")),console.log(c("cyan"," ║")+` Trial expires: ${c(n,e.padEnd(36))}`+c("cyan"," ║")),console.log(c("cyan"," ║")+` Days remaining: ${c(n,String(o.trialDaysRemaining).padEnd(35))}`+c("cyan","║")),console.log(c("cyan"," ║")+" Love it? Upgrade to keep full access: "+c("cyan","║")),console.log(c("cyan"," ║")+" "+c("bold","https://thuban.dev/pricing")+" "+c("cyan","║")),console.log(c("cyan"," ╚══════════════════════════════════════════════════════╝"))}else o.trialExpired&&(console.log(""),console.log(c("yellow"," Your Thuban trial has expired.")),console.log(c("gray"," Upgrade to keep unlimited scans and full reports:")),console.log(c("cyan"," https://thuban.dev/pricing")));console.log(""),console.log(c("bold"," FEATURES")),console.log(` Full scan details: ${o.features.fullDetails?c("green","Yes"):c("red","No")}`),console.log(` HTML dashboard: ${o.features.dashboard?c("green","Yes"):c("red","No")}`),console.log(` Auto-fix: ${o.features.autoFix?c("green","Yes"):c("red","No")}`),console.log(` CI Action: ${o.features.ciAction?c("green","Yes"):c("red","No")}`),console.log(""),o.licensed||(console.log(c("cyan"," Upgrade at: ")+c("bold","https://thuban.dev/pricing")),console.log(""))}function cmdUpgrade(){banner(),console.log(c("bold"," THUBAN PRICING")),console.log(""),console.log(` ${c("gray","FREE")} ${c("bold","$0/mo")}`),console.log(" 5 scans/month, 100 files, summary only"),console.log(""),console.log(` ${c("cyan","PRO")} ${c("bold","$9/mo")} ${c("gray","(or $90/year — save 17%)")}`),console.log(" Unlimited scans, full details, auto-fix, HTML dashboard"),console.log(""),console.log(` ${c("cyan","TEAM")} ${c("bold","$49/mo")}`),console.log(" Everything in Pro + 10 seats, CI Action, team reports"),console.log(""),console.log(` ${c("cyan","ENTERPRISE")} ${c("bold","$299/mo")}`),console.log(" Everything in Team + unlimited seats, priority support, SLA"),console.log(""),console.log(c("bold"," Subscribe at: ")+c("cyan","https://thuban.dev/pricing")),console.log("");try{const{exec:e}=require("child_process"),o=process.platform;e(("win32"===o?"start":"darwin"===o?"open":"xdg-open")+" https://thuban.dev/pricing")}catch(e){}}async function cmdGate(e){const o=path.resolve(e.targetPath);if(e.fix){const e=PreCommitGate.install(o);return banner(),e.success?(console.log(c("green"," ✓ Pre-commit gate installed!")),console.log(""),console.log(c("gray"," Every commit will now be checked for hallucinated APIs.")),console.log(c("gray"," Commits with phantom APIs will be blocked automatically.")),console.log(""),console.log(` To remove: ${c("cyan","thuban gate --uninstall")}`)):console.log(c("red",` Error: ${e.error}`)),void console.log("")}if(process.argv.includes("--uninstall")){const e=PreCommitGate.uninstall(o);return banner(),console.log(c("green",` ✓ ${e.message}`)),void console.log("")}const n=new PreCommitGate({rootPath:o,strict:!process.argv.includes("--warn")}).run();if(e.json)return void console.log(JSON.stringify(n,null,2));const l=process.argv.includes("--ci");if(l||banner(),0===n.files)return console.log(c("gray"," No staged files to check.")),console.log(""),console.log(` Install the gate: ${c("cyan","thuban gate --fix")}`),void console.log("");if(n.passed)console.log(c("green",` ✓ ${n.message}`)),console.log(c("gray",` ${n.elapsed}ms`)),l||console.log(""),process.exit(0);else{console.log(c("red",` ✗ ${n.message}`)),console.log("");for(const e of n.issues)console.log(` ${c("red",e.file)}:${e.line}`),console.log(` ${c("yellow",e.code)}`),console.log(` ${c("red","^^^")} ${e.message}`),e.fix&&console.log(` ${c("green","Fix:")} ${e.fix}`),console.log("");process.exit(1)}}async function cmdCost(e){const o=path.resolve(e.targetPath);banner(),console.log(c("bold"," SCANNING: ")+c("cyan",o)),console.log("");const n=collectFiles(o,e.ignore),l=new CodeScanner({rootPath:o,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),s=new HallucinationDetector({rootPath:o}),[t,a]=await Promise.all([l.scanFiles(n),s.scan(n)]),r=[];for(const e of t.issues||[])r.push({file:path.relative(o,e.file),...e});for(const e of a.phantomAPIs)r.push({category:"hallucination",severity:"critical",message:e.name});for(const e of a.deprecatedAPIs)r.push({category:"deprecated",severity:"high",message:e.name});const i=new TechDebtCostCalculator,g=i.calculate(r,n.length);e.json?console.log(JSON.stringify(g,null,2)):console.log(i.formatCLI(g))}async function scanWithDetector(e,o,n,l="scan"){const s=path.resolve(e.targetPath);banner(),console.log(c("bold",` ${o}: `)+c("cyan",s)),console.log("");const t=collectFiles(s,e.ignore),a=n(s),r=await a[l](t);return e.json?(console.log(JSON.stringify(r,null,2)),{result:r,files:t,handled:!0}):{result:r,files:t,handled:!1}}async function cmdGhosts(e){const{result:o,handled:n}=await scanWithDetector(e,"SCANNING FOR GHOST CODE",e=>new GhostCodeDetector({rootPath:e}));if(!n){if(0===o.ghosts.length)return console.log(c("green"," No ghost code detected. Every function is referenced.")),void console.log("");console.log(c("yellow",c("bold",` GHOST CODE: ${o.totalGhosts} function${o.totalGhosts>1?"s":""} exist but are never called`))),console.log("");for(const n of o.ghosts.slice(0,e.maxIssues)){const e="high"===n.severity?"red":"yellow";console.log(` ${c(e,"⊘")} ${c("cyan",n.file)}:${n.line}`),console.log(` ${c("bold",n.name+"()")} — ${n.wastedLines} lines, ${n.references} references`),console.log("")}console.log(c("bold"," ┌──────────────────────────────────────────────────────┐")),console.log(c("bold"," │")+` Wasted code: ${c("red",o.totalWastedLines+" lines")} (${o.wastedPercent}% of codebase) `+c("bold","│")),console.log(c("bold"," └──────────────────────────────────────────────────────┘")),console.log("")}}async function cmdAIScore(e){const{result:o,files:n,handled:l}=await scanWithDetector(e,"AI CONFIDENCE SCORING",e=>new AIConfidenceScorer({rootPath:e}));if(!l){if(0===o.totalFunctions)return console.log(c("yellow",` No functions found to analyse (${n.length} file(s) collected — test/config files are skipped).`)),void console.log("");if(0===o.highConfidence.length&&0===o.mediumConfidence.length)return console.log(c("green",` No AI-generated code patterns detected across ${o.totalFunctions} function(s).`)),void console.log("");console.log(c("red",c("bold",` HIGH CONFIDENCE AI-GENERATED (${o.highConfidence.length} functions)`))),console.log("");for(const e of o.highConfidence.slice(0,15)){console.log(` ${c("red",e.confidence+"%")} AI ${c("cyan",e.file)}:${e.line}`),console.log(` ${c("bold",e.name+"()")} — ${e.lineCount} lines | Test coverage: ${e.testCoverage}`);for(const o of e.signals.slice(0,2))console.log(` ${c("gray","• "+o)}`);console.log("")}if(o.mediumConfidence.length>0){console.log(c("yellow",c("bold",` POSSIBLE AI-GENERATED (${o.mediumConfidence.length} functions)`))),console.log("");for(const e of o.mediumConfidence.slice(0,10))console.log(` ${c("yellow",e.confidence+"%")} AI ${c("cyan",e.file)}:${e.line} ${c("gray",e.name+"()")}`);console.log("")}console.log(c("bold"," ┌──────────────────────────────────────────────────────┐")),console.log(c("bold"," │")+` ${c("red",o.aiPercentage+"%")} of functions are likely AI-generated `+c("bold","│")),console.log(c("bold"," │")+` ${c("yellow",o.aiLikelyCount)} high confidence | ${o.aiPossibleCount} possible `+c("bold","│")),console.log(c("bold"," └──────────────────────────────────────────────────────┘")),console.log("")}}async function cmdClones(e){const{result:o,handled:n}=await scanWithDetector(e,"COPY-PASTE DRIFT DETECTION",e=>new CopyPasteDriftDetector({rootPath:e}));if(!n){if(0===o.clusters.length)return console.log(c("green"," No copy-paste drift detected.")),void console.log("");console.log(c("yellow",c("bold",` COPY-PASTE CLUSTERS: ${o.totalClusters} found`))),console.log("");for(const e of o.clusters.slice(0,10)){const o="high"===e.severity?"red":"yellow";console.log(` ${c(o,"◈")} ${c("bold",e.pattern+" pattern")} — ${e.totalInstances} instances`);for(const o of e.members){const e=o.similarity<100?c("gray",` (${o.similarity}% similar)`):"";console.log(` ${c("cyan",o.file)}:${o.line} ${c("gray",o.name+"()")}${e}`)}console.log(` ${c("green","→")} ${e.recommendation}`),console.log("")}console.log(c("bold",` Total duplicate lines: ${c("red",o.totalDuplicateLines)}`)),console.log(c("gray",` ${o.recommendation}`)),console.log("")}}async function cmdPassport(e){const o=path.resolve(e.targetPath);banner(),console.log(c("bold"," GENERATING CODEBASE PASSPORT: ")+c("cyan",o)),console.log("");const n=collectFiles(o,e.ignore),l=new CodebasePassport({rootPath:o}),s=l.generate(n);if(e.json)return void console.log(JSON.stringify(s,null,2));const t=l.save(s),a=s.project,r=s.onboarding;console.log(c("green",` ✓ Passport generated: ${c("bold",path.relative(o,t))}`)),console.log(""),console.log(c("bold"," PROJECT IDENTITY")),console.log(` Name: ${c("cyan",a.name)}`),console.log(` Files: ${c("bold",a.totalFiles)}`),console.log(` Lines: ${c("bold",a.totalLines.toLocaleString())}`),console.log(` Architecture: ${c("bold",a.architecture)}`),console.log(` Frameworks: ${a.frameworks.join(", ")||"vanilla"}`),console.log(""),console.log(c("bold"," LANGUAGES"));for(const e of a.languages.slice(0,5)){const o="█".repeat(Math.max(1,Math.round(e.percentage/5)));console.log(` ${e.extension.padEnd(6)} ${c("cyan",o)} ${e.percentage}% (${e.lines} lines)`)}if(console.log(""),console.log(c("bold"," ONBOARDING")),console.log(` Read time: ~${r.estimatedReadTimeMinutes} minutes`),console.log(` Start here: ${r.startHere.slice(0,3).join(", ")}`),r.doNotTouch.length>0&&console.log(` Do not touch: ${c("red",r.doNotTouch.join(", "))}`),console.log(` Summary: ${r.quickSummary}`),console.log(""),s.sacred.length>0){console.log(c("bold"," SACRED FILES (high impact if changed)"));for(const e of s.sacred.slice(0,5))console.log(` ${c("red","!")} ${c("cyan",e.file)} — imported by ${e.importedBy} files`);console.log("")}console.log(c("gray",` Full passport: ${t}`)),console.log(c("gray"," Share with new team members for instant onboarding.")),console.log("")}async function cmdExecutive(e){const o=path.resolve(e.targetPath);banner(),console.log(c("bold"," GENERATING EXECUTIVE REPORT: ")+c("cyan",o)),console.log("");const n=collectFiles(o,e.ignore);console.log(c("gray",` Scanning ${n.length} files...`));const l=new CodeScanner({rootPath:o,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),s=new HallucinationDetector({rootPath:o}),t=new GhostCodeDetector({rootPath:o}),a=new AIConfidenceScorer({rootPath:o}),r=new CopyPasteDriftDetector({rootPath:o}),[i,g,d,y,u]=await Promise.all([l.scanFiles(n),s.scan(n),t.scan(n),a.scan(n),r.scan(n)]);let h=0;for(const e of n)try{h+=fs.readFileSync(e,"utf-8").replace(/\r\n/g,"\n").split("\n").length}catch{}const p=[];for(const e of i.issues||[])p.push({file:path.relative(o,e.file),...e});for(const e of g.phantomAPIs)p.push({category:"hallucination",severity:"critical",message:e.name});for(const e of g.deprecatedAPIs)p.push({category:"deprecated",severity:"high",message:e.name});const f=(new TechDebtCostCalculator).calculate(p,n.length),m=new ExecutiveReport({rootPath:o,companyName:e.companyName||void 0}),b=m.generate({scanResults:i,hallResults:g,debtCost:f,ghostResults:d,aiScoreResults:y,cloneResults:u,fileCount:n.length,lineCount:h}),$=m.save(b,o);console.log(c("green"," ✓ Executive report generated!")),console.log(""),console.log(` ${c("bold","Report:")} ${c("cyan",$)}`),console.log(""),console.log(c("gray"," Open in browser → Ctrl+P → Save as PDF")),console.log(c("gray",' Or click the "Save as PDF" button in the report.')),console.log("");try{const{exec:e}=require("child_process"),o=process.platform;e(`${"win32"===o?"start":"darwin"===o?"open":"xdg-open"} "${$}"`),console.log(c("green"," ✓ Opened in your default browser.")),console.log("")}catch(e){}}async function cmdInvestorReport(e){const o=path.resolve(e.targetPath);banner(),console.log(c("bold"," GENERATING INVESTOR DUE DILIGENCE REPORT")),console.log(c("cyan",` Target: ${o}`)),console.log("");const n=collectFiles(o,e.ignore);console.log(c("gray",` Scanning ${n.length} files...`));const l=new CodeScanner({rootPath:o,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),s=new HallucinationDetector({rootPath:o}),t=new GhostCodeDetector({rootPath:o}),a=new AIConfidenceScorer({rootPath:o}),r=new CopyPasteDriftDetector({rootPath:o}),[i,g,d,y,u]=await Promise.all([l.scanFiles(n),s.scan(n),t.scan(n),a.scan(n),r.scan(n)]);let h=0;for(const e of n)try{h+=fs.readFileSync(e,"utf-8").replace(/\r\n/g,"\n").split("\n").length}catch{}const p=[];for(const e of i.issues||[])p.push({file:path.relative(o,e.file),...e});for(const e of g.phantomAPIs||[])p.push({category:"hallucination",severity:"critical",message:e.name});for(const e of g.deprecatedAPIs||[])p.push({category:"deprecated",severity:"high",message:e.name});const f=(new TechDebtCostCalculator).calculate(p,n.length),m=new GitVelocityAnalyzer({rootPath:o}).analyze();console.log(c("gray"," Building architecture map..."));const b=await generateArchitectureMap({files:n,rootPath:o,scanResults:i,hallResults:g});console.log(c("gray"," Calculating risk-adjusted valuation impact..."));const $=calculateRiskValuation({scanResults:i,hallResults:g,ghostResults:d,cloneResults:u}),w={};for(const e of n)try{const o=path.extname(e).toLowerCase(),n=fs.readFileSync(e,"utf-8").replace(/\r\n/g,"\n");w[o]=(w[o]||0)+n.split("\n").length}catch{}const v=b.modules.length>0?b.modules.reduce((e,o)=>e+o.avgComplexity,0)/b.modules.length:0,S=(g.phantomAPIs?.length||0)+(i.issues||[]).filter(e=>"critical"===e.severity).length;let C=null;try{const e=fs.readdirSync(o).filter(e=>/^crucible-report-.*\.json$/.test(e)).map(e=>({f:e,mtime:fs.statSync(path.join(o,e)).mtimeMs})).sort((e,o)=>o.mtime-e.mtime);e.length>0&&(C=JSON.parse(fs.readFileSync(path.join(o,e[0].f),"utf-8")))}catch{}console.log(c("gray"," Scanning dependency supply chain (CVEs, licenses, malicious packages)..."));const x=new SupplyChainAnalyzer({rootPath:o,offline:e.offline});let E=null;try{E=await x.analyze()}catch(e){console.log(c("yellow",` ⚠ Supply chain scan failed: ${e.message}`))}const P=new InvestorReport({rootPath:o,companyName:e.companyName||void 0,reportKey:e.reportKey||void 0}),I="full"===P.tier?"Full Audit":"snapshot"===P.tier?"Snapshot":"Preview (free)";console.log(` ${c("bold","Tier:")} ${c("free"===P.tier?"yellow":"green",I)}`),"free"===P.tier&&console.log(c("yellow"," ⚠ Free preview — some sections locked. Purchase a key at thuban.dev")),console.log("");const A=P._calculateOverallScore({scanResults:i,hallResults:g,ghostResults:d,cloneResults:u,aiScoreResults:y,fileCount:n.length}),R=generateBenchmarks({trustScore:A,lineCount:h,criticalFindings:S,hallucinations:g.phantomAPIs?.length||0,testCoverageRatio:0,avgComplexity:v,dependencyCVEs:0,ghostCodePercent:d.wastedPercent||0,cloneRatio:(u.totalDuplicateLines||0)/Math.max(h,1),languageLineCounts:w}),D=recordAndAnalyze(o,{trustScore:A,crucibleScore:C?.score??null,findingsByType:{critical:S,high:(i.issues||[]).filter(e=>"high"===e.severity).length,medium:(i.issues||[]).filter(e=>"medium"===e.severity||"warning"===e.severity).length,low:(i.issues||[]).filter(e=>"low"===e.severity||"info"===e.severity).length}}),N=P.generate({scanResults:i,hallResults:g,debtCost:f,ghostResults:d,aiScoreResults:y,cloneResults:u,velocityResults:m,architectureData:b,riskValuation:$,historyData:D,benchmarkData:R,crucibleResults:C,supplyChainResults:E,fileCount:n.length,lineCount:h}),T=P.save(N,o);let k=null,F=null;if(e.sbom&&E)try{const e=x.generateCycloneDX(E,{componentName:P.companyName}),n=x.generateSPDX(E,{componentName:P.companyName}),c=(new Date).toISOString().split("T")[0];k=path.join(o,`thuban-sbom-cyclonedx-${c}.json`),F=path.join(o,`thuban-sbom-spdx-${c}.json`),fs.writeFileSync(k,JSON.stringify(e,null,2),"utf-8"),fs.writeFileSync(F,JSON.stringify(n,null,2),"utf-8")}catch(e){console.log(c("yellow",` ⚠ SBOM generation failed: ${e.message}`)),k=null,F=null}console.log(c("green"," ✓ Investor report generated!")),console.log(""),console.log(` ${c("bold","Report:")} ${c("cyan",T)}`),k&&console.log(` ${c("bold","SBOM (CycloneDX):")} ${c("cyan",k)}`),F&&console.log(` ${c("bold","SBOM (SPDX):")} ${c("cyan",F)}`),console.log(""),console.log(c("gray"," Open in browser → Ctrl+P → Save as PDF for board presentations")),console.log(c("gray",' Or click the "Save as PDF" button in the report.')),console.log("");try{const{exec:e}=require("child_process"),o=process.platform;e(`${"win32"===o?"start":"darwin"===o?"open":"xdg-open"} "${T}"`),console.log(c("green"," ✓ Opened in your default browser.")),console.log("")}catch(e){}}async function cmdSupport(e){const o=new SupportBot({rootPath:e.targetPath,verbose:e.verbose,smart:e.smart});if(e.diagnoseOnly)return banner(),console.log(c("bold"," SYSTEM DIAGNOSTIC")),console.log(""),void await o.diagnose();const n=process.argv.slice(3).filter(e=>!e.startsWith("--"));if(n.length>0){banner();const l=n.join(" "),s=e.smart?await o.queryAsync(l):o.query(l);return"none"===s.type?(console.log(c("yellow",` No exact match found for: "${l}"`)),console.log(""),console.log(c("gray"," Try running:")),console.log(` ${c("cyan","thuban support")} Interactive help`),console.log(` ${c("cyan","thuban support --diagnose")} System diagnostic`)):(console.log(c("green",` Found: ${s.type}`)),console.log(""),s.data&&(s.data.answer?console.log(` ${s.data.answer}`):s.data.fix?console.log(` ${c("bold","Fix:")} ${s.data.fix}`):s.data.description&&console.log(` ${s.data.description}`))),void console.log("")}await o.startInteractive()}async function cmdFeedback(e){const o=new FeedbackClient;if(process.argv.includes("--retry")){banner(),console.log(c("bold"," RETRYING PENDING FEEDBACK")),console.log("");const e=await o.retryPending();return console.log(c("green",` ✓ Sent ${e.sent}/${e.total} pending items`)),e.failed>0&&console.log(c("yellow",` ⚠ ${e.failed} items still pending (will retry next time)`)),void console.log("")}if(e.feedbackText){const n=process.argv.includes("--bug")?"bug":process.argv.includes("--feature")?"feature":"general";return void await o.submit(e.feedbackText,n)}await o.startInteractive()}async function cmdBaseline(e){const o=path.resolve(e.targetPath),n=new BaselineManager(o);if(banner(),e.baselineCreate||!n.exists()){console.log(c("bold"," CREATING BASELINE: ")+c("cyan",o)),console.log("");const l=collectFiles(o,e.ignore),s=new CodeScanner({rootPath:o,ignorePatterns:["node_modules/**",".git/**","dist/**",...e.ignore]}),t=new HallucinationDetector({rootPath:o}),[a,r]=await Promise.all([s.scanFiles(l),t.scan(l)]),i=[];for(const e of a.issues||[])i.push({file:path.relative(o,e.file),...e});for(const e of r.phantomAPIs)i.push({file:e.file,category:"hallucination",severity:"critical",id:e.id,message:e.name});for(const e of r.deprecatedAPIs)i.push({file:e.file,category:"deprecated",severity:"high",id:e.id,message:e.name});for(const e of r.aiSmells)i.push({file:e.file,category:"ai_smell",severity:"warning",id:e.id,message:e.message});const g=n.create(i);console.log(c("green",` ✓ Baseline created: ${c("bold",g.count)} known issues recorded`)),console.log(` ${c("cyan",g.path)}`),console.log(""),console.log(c("gray"," Future scans with --baseline will only report NEW issues.")),console.log(c("gray"," Commit .thuban-baseline.json to share baseline with your team.")),console.log("")}else{const e=n.load();console.log(c("bold"," BASELINE STATUS")),console.log(""),console.log(` Created: ${c("cyan",e.created)}`),console.log(` Known issues: ${c("bold",e.issueCount)}`),console.log(""),console.log(c("gray"," Use --baseline-create to update the baseline")),console.log(c("gray"," Use --baseline with scan to only see new issues")),console.log("")}}async function cmdCrucible(e){const o=process.argv.slice(2),n=o[1]||"",l=path.resolve(e.targetPath);if("ci"===n){const e=o[2]||"",n=CIIntegration.listPlatforms();if(!e||!n.includes(e))return console.log(""),console.log(c("bold"," CRUCIBLE CI INTEGRATION")),console.log(""),console.log(c("gray"," Usage:")),console.log(` ${c("cyan","thuban crucible ci github")} → .github/workflows/thuban-crucible.yml`),console.log(` ${c("cyan","thuban crucible ci gitlab")} → .gitlab-ci.yml`),console.log(` ${c("cyan","thuban crucible ci bitbucket")} → bitbucket-pipelines.yml`),console.log(""),e&&(console.log(c("red",` Unknown platform: ${e}`)),console.log(c("gray",` Supported: ${n.join(", ")}`))),void console.log("");const s=o.find(e=>e.startsWith("--threshold=")),t=o.find(e=>e.startsWith("--level=")),a=o.find(e=>e.startsWith("--node=")),r=s?parseInt(s.split("=")[1],10):70,i=t?t.split("=")[1]:"gentle",g=a?a.split("=")[1]:"20";try{const o=CIIntegration.generateCIConfig(e,l,{threshold:r,level:i,nodeVersion:g});console.log(""),console.log(c("green"," ✓ CI config generated")),console.log(` ${c("cyan",o.filename)}`),console.log(""),console.log(c("gray",` Config: threshold=${o.threshold}, level=${o.level}`)),console.log(c("gray"," Commit this file and Crucible will run on every PR.")),console.log("")}catch(e){console.error(c("red",` Error: ${e.message}`))}return}if("badge"===n){const e=o.find(e=>e.startsWith("--score="));let n=e?parseInt(e.split("=")[1],10):null;if(null===n&&(n=BadgeGenerator.readLastScore(l)),null===n)return console.log(""),console.log(c("yellow"," No Crucible report found.")),console.log(c("gray"," Run `thuban crucible run .` first, or pass --score=<n>")),void console.log("");const s=o.find(e=>e.startsWith("--style=")),t=o.find(e=>e.startsWith("--threshold=")),a=s?s.split("=")[1]:"score",r=t?parseInt(t.split("=")[1],10):70,i=BadgeGenerator.generateBadge({score:n,targetPath:l,style:a,threshold:r});return console.log(""),console.log(c("green",` ✓ Badge generated: ${c("cyan",path.relative(l,i.outputPath))}`)),console.log(` Score: ${c("green"===i.color?"green":"yellow"===i.color?"yellow":"red",n+"/100")} (${i.verdict})`),console.log(""),console.log(c("bold"," Add to README.md:")),console.log(` ${c("cyan",i.markdown)}`),void console.log("")}if("leaderboard"!==n&&"lb"!==n){if("run"===n||"seed"===n){const n=parseFlag(o,"level","gentle"),s=parseIntFlag(o,"seed",42),t=parseFlag(o,"lang",null),a=parseFlag(o,"category",null);console.log(Crucible.banner.fullBanner({level:n,version:_CLI_VERSION})),console.log(c("bold"," Running adversarial seed tests...")),console.log(c("gray",` Level: ${n} · PRNG seed: ${s}`)),console.log("");let r=0,i=0,g=0;const d=await Crucible.run({targetPath:l,level:n,seed:s,languages:t?t.split(","):void 0,categories:a?a.split(","):void 0,onProgress(e,o,n){g++,"seed"===e&&(n.detected?(r++,process.stdout.write(c("green","."))):(i++,process.stdout.write(c("red","x"))),g%50==0&&process.stdout.write("\n"))}});process.stdout.write("\n\n"),console.log(c("bold"," Results:")+` ${c("green",d.seedResults.detected+" detected")} ${c("red",d.seedResults.missed+" missed")} (${d.seedResults.total} seeds)`),console.log(Crucible.banner.scoreBanner(d.score));const y=Crucible.compareGolden(d);return y.hasMaster?console.log(y.passed?c("green"," ✓ No regressions vs golden master"):c("red",` ✗ ${y.regressions} regression(s) vs golden master`)):console.log(c("gray"," (No golden master — run `thuban crucible approve` to set one)")),console.log(""),e.json&&console.log(JSON.stringify(d,null,2)),BadgeGenerator.writeLastScore&&BadgeGenerator.writeLastScore(l,d.score),void(Leaderboard.addEntry&&Leaderboard.addEntry(l,{score:d.score,level:n,timestamp:d.timestamp}))}if("approve"===n){console.log(""),console.log(c("bold"," Approving current results as golden master..."));const e=await Crucible.run({targetPath:l,level:"gentle",seed:42}),o=Crucible.approve(e);return console.log(c("green",` ✓ Golden master saved: ${o.count} findings, score ${o.meta.score}`)),console.log(c("gray"," File: .golden/golden-master.json")),void console.log("")}if("kenny"===n){console.log(Crucible.banner.compactBanner("KENNY MODE")),console.log(c("bold",` Kenny's 7-report test battery (${Crucible.KennyMode.testCount} tests)`)),console.log("");const o=await Crucible.kenny({onProgress(e,o){const n=o.passed?c("green","✓"):o.crashed?c("yellow","⚡"):c("red","✗"),l=c("gray",e.id)+" "+e.name,s=o.missingDetections&&o.missingDetections.length?c("red"," missing: "+o.missingDetections.join(", ")):"";console.log(` ${n} ${l}${s}`)}});return console.log(Crucible.banner.summaryLine(o.passed,o.total-o.skipped,o.score)),void(e.json&&console.log(JSON.stringify(o,null,2)))}if("self-test"===n||"selftest"===n){console.log(Crucible.banner.compactBanner("SELF-ATTACK")),console.log(c("bold",` Adversarial self-attack (${Crucible.SelfAttack.payloadCount} payloads)`)),console.log("");const o=await Crucible.selfTest({onProgress(e,o){const n="pass"===o.type?c("green","✓"):"crash"===o.type?c("red","⚡ CRASH"):"hang"===o.type?c("yellow","⏱ HANG"):c("yellow","? MISSED");console.log(` ${n} ${c("gray",e.name)} ${e.description}`)}});console.log("");const n=o.crashes.length,l=o.hangs.length;return 0===n&&0===l?console.log(c("green",` ✓ All ${o.payloadCount} payloads handled gracefully`)):(n&&console.log(c("red",` ✗ ${n} crash(es) detected`)),l&&console.log(c("yellow",` ⚠ ${l} hang(s) detected`))),console.log(Crucible.banner.scoreBanner(o.score)),void(e.json&&console.log(JSON.stringify(o,null,2)))}if("report"===n){console.log(""),console.log(c("bold"," Generating Crucible report..."));const o=await Crucible.run({targetPath:l,level:"gentle",seed:42}),n=await Crucible.kenny(),s=Crucible.compareGolden(o),t={title:"Thuban Crucible Report",level:"gentle",score:o.score,seedResults:o.seedResults,mutationResults:o.mutationResults,kennyResults:n,goldenComparison:s.hasMaster?s:null},a=e.output?path.resolve(e.output):l,{htmlPath:r,jsonPath:i}=Crucible.report(t,{outputDir:a});return console.log(c("green",` ✓ HTML report: ${c("cyan",r)}`)),console.log(c("green",` ✓ JSON summary: ${c("cyan",i)}`)),void console.log(Crucible.banner.scoreBanner(o.score))}if("golden"===n){const e=(new Crucible.GoldenMaster).loadMaster();return console.log(""),e?(console.log(c("bold"," Golden Master Status")),console.log(` Score: ${null!=e.meta.score?e.meta.score:"N/A"}`),console.log(` Findings: ${e.count}`),console.log(` Saved: ${e.timestamp}`),console.log(` Hash: ${e.hash}`)):console.log(c("yellow"," No golden master. Run `thuban crucible approve` to create one.")),void console.log("")}console.log(""),console.log(c("bold"," CRUCIBLE — Adversarial Testing Engine")),console.log(""),console.log(c("gray"," Core commands:")),console.log(` ${c("cyan","thuban crucible run")} [path] [--level gentle|medium|hell]`),console.log(` ${c("cyan","thuban crucible seed")} [path]`),console.log(` ${c("cyan","thuban crucible mutate")} [path]`),console.log(` ${c("cyan","thuban crucible golden")} [path]`),console.log(` ${c("cyan","thuban crucible approve")}`),console.log(` ${c("cyan","thuban crucible self-test")}`),console.log(` ${c("cyan","thuban crucible kenny")}`),console.log(` ${c("cyan","thuban crucible report")}`),console.log(""),console.log(c("gray"," CI/CD & badges:")),console.log(` ${c("cyan","thuban crucible ci github")} Generate GitHub Actions workflow`),console.log(` ${c("cyan","thuban crucible ci gitlab")} Generate GitLab CI config`),console.log(` ${c("cyan","thuban crucible ci bitbucket")} Generate Bitbucket Pipelines config`),console.log(` ${c("cyan","thuban crucible badge")} Generate SVG score badge for README`),console.log(` ${c("cyan","thuban crucible leaderboard")} View score history & trend`),console.log(""),console.log(c("gray"," Options:")),console.log(` ${c("gray","--threshold=<n>")} Fail CI if score drops below n (default 70)`),console.log(` ${c("gray","--level=<l>")} gentle | medium | hell`),console.log(` ${c("gray","--score=<n>")} Explicit score for badge (else reads last report)`),console.log(` ${c("gray","--style=score|verdict")} Badge text style`),console.log("")}else{if(e.json){const e=Leaderboard.getSummary(l);return void console.log(JSON.stringify(e,null,2))}Leaderboard.printLeaderboard(l,{color:!0})}}function getTelemetryConfigPath(){const e=process.env.HOME||process.env.USERPROFILE||os.homedir();return path.join(e,".thuban-telemetry.json")}function isTelemetryEnabled(){try{return!0===JSON.parse(fs.readFileSync(getTelemetryConfigPath(),"utf-8")).enabled}catch{return!1}}async function cmdTelemetry(e){const o=getTelemetryConfigPath(),n=process.argv.slice(2);if(n.includes("--on"))fs.writeFileSync(o,JSON.stringify({enabled:!0,updated:(new Date).toISOString()})),console.log(""),console.log(c("cyan"," Telemetry enabled")),console.log(c("gray"," Anonymous usage stats will be sent (no code, no paths, no PII)")),console.log(c("gray"," Turn off anytime: npx thuban telemetry --off")),console.log("");else if(n.includes("--off"))fs.writeFileSync(o,JSON.stringify({enabled:!1,updated:(new Date).toISOString()})),console.log(""),console.log(c("cyan"," Telemetry disabled")),console.log(c("gray"," No data will be collected")),console.log("");else{const e=isTelemetryEnabled();console.log(""),console.log(c("bold"," TELEMETRY STATUS")),console.log(""),console.log(` Status: ${e?c("cyan","Enabled"):c("gray","Disabled (default)")}`),console.log(""),console.log(c("gray"," Thuban telemetry is 100% opt-in and anonymous.")),console.log(c("gray"," We collect: file count, score, grade, languages, OS, scan duration.")),console.log(c("gray"," We never collect: code, file names, paths, project names, or PII.")),console.log(""),console.log(` Enable: ${c("cyan","npx thuban telemetry --on")}`),console.log(` Disable: ${c("cyan","npx thuban telemetry --off")}`),console.log("")}}async function runScanSilent(e){const o=/^(https?:\/\/|git@)/.test(e);let n=o?e:path.resolve(e),c=null,l=e;if(o){const o=path.join(os.tmpdir(),"thuban-compare-"+Date.now()+"-"+Math.random().toString(36).slice(2,6)),{execFileSync:s}=require("child_process");s("git",["clone","--depth","1",e,o],{stdio:"pipe",timeout:6e4}),n=o,c=o;const t=e.replace(/\.git$/,"").split("/");l=t[t.length-1]||e}else l=path.basename(path.resolve(e))||e;const s=Date.now(),t=new CodeScanner,a=new DependencyGraph,r=new HallucinationDetector({rootPath:n}),i=collectFiles(n,[]),g={};let d=0,y=0;for(const e of i)try{const o=t.scanFile(e);path.relative(n,e),g[e]=o,a.addFile(e,n),o.motherCode&&o.motherCode.hasDNA&&d++,o.drifts&&o.drifts.length>0&&y++}catch(e){}const u=r.scan(i,n),h=Date.now()-s;let p=0,f=0,m=0;const b={};for(const[,e]of Object.entries(g))if(e.issues){p+=e.issues.length;for(const o of e.issues){"critical"===o.severity&&f++,"high"===o.severity&&m++;const e=o.category||o.type||"other";b[e]=(b[e]||0)+1}}const $=(u.phantomAPIs||[]).length+(u.phantomImports||[]).length+(u.deprecatedAPIs||[]).length;p+=$,f+=(u.phantomAPIs||[]).length+(u.phantomImports||[]).length,m+=(u.deprecatedAPIs||[]).length,$>0&&(b.hallucination=$);const w=a.getOrphanFiles(),v=a.circularDeps||[],S=i.length>0?Math.round(d/i.length*100):0,C=Math.max(0,Math.round(100-15*f-5*m-10*v.length-1*w.length-.1*(100-S)-3*y)),x=C>=90?"A":C>=80?"B":C>=70?"C":C>=60?"D":"F";if(c)try{fs.rmSync(c,{recursive:!0,force:!0})}catch{}return{label:l,files:i.length,score:C,grade:x,elapsed:h,issues:{total:p,critical:f,high:m},categories:b,dependencies:{circular:v.length,orphans:w.length},motherCode:{annotated:d,coverage:S,drifted:y}}}async function cmdCompare(e){const o=process.argv.slice(2).filter(e=>"compare"!==e&&!e.startsWith("--"));o.length<2&&(console.log(""),console.log(c("red"," Compare requires two paths or URLs")),console.log(""),console.log(c("gray"," Usage:")),console.log(` ${c("cyan","npx thuban compare ./project-a ./project-b")}`),console.log(` ${c("cyan","npx thuban compare . https://github.com/user/repo")}`),console.log(` ${c("cyan","npx thuban compare https://github.com/a/repo https://github.com/b/repo")}`),console.log(""),process.exit(1)),console.log(""),console.log(c("bold"," ╔══════════════════════════════════════╗")),console.log(c("bold"," ║ THUBAN — Codebase Comparison ║")),console.log(c("bold"," ╚══════════════════════════════════════╝")),console.log(""),console.log(c("cyan",` Scanning: ${o[0]}`));const n=await runScanSilent(o[0]);console.log(c("cyan",` Scanning: ${o[1]}`));const l=await runScanSilent(o[1]);console.log("");const s=(e,o)=>String(e).padEnd(o),t=(e,o)=>String(e).padStart(o),a=20,r=n.label.length>a?n.label.slice(0,18)+"..":n.label,i=l.label.length>a?l.label.slice(0,18)+"..":l.label,g=n.score>=80?"green":n.score>=60?"yellow":"red",d=l.score>=80?"green":l.score>=60?"yellow":"red";console.log(c("bold"," ┌──────────────────────┬──────────────────────┬──────────────────────┐")),console.log(c("bold",` │ ${s("METRIC",a)} │ ${s(r,a)} │ ${s(i,a)} │`)),console.log(c("bold"," ├──────────────────────┼──────────────────────┼──────────────────────┤"));const y=(e,o,n)=>{console.log(` │ ${c("gray",s(e,a))} │ ${s(o,a)} │ ${s(n,a)} │`)};y("Health Score",`${c(g,n.score+"/100")}`,`${c(d,l.score+"/100")}`),y("Grade",`${c(g,n.grade)}`,`${c(d,l.grade)}`),y("Files Scanned",String(n.files),String(l.files)),y("Total Issues",String(n.issues.total),String(l.issues.total)),y("Critical Issues",String(n.issues.critical),String(l.issues.critical)),y("High Issues",String(n.issues.high),String(l.issues.high)),y("Circular Deps",String(n.dependencies.circular),String(l.dependencies.circular)),y("Orphan Files",String(n.dependencies.orphans),String(l.dependencies.orphans)),y("Mother Code DNA",`${n.motherCode.coverage}%`,`${l.motherCode.coverage}%`),y("Drift Issues",String(n.motherCode.drifted),String(l.motherCode.drifted)),y("Scan Time",`${n.elapsed}ms`,`${l.elapsed}ms`),console.log(c("bold"," └──────────────────────┴──────────────────────┴──────────────────────┘")),console.log("");const u=n.score-l.score;if(0===u)console.log(c("cyan",` VERDICT: Both codebases score identically (${n.score}/100)`));else{const e=u>0?n:l,o=u>0?l:n;console.log(c("cyan",` VERDICT: ${e.label} is healthier`)),console.log(c("gray",` ${e.label} scores ${e.score}/100 (${e.grade}) vs ${o.label} at ${o.score}/100 (${o.grade})`)),console.log(c("gray",` ${Math.abs(u)} point difference — ${Math.abs(u)>20?"significant gap":Math.abs(u)>10?"moderate gap":"close race"}`))}const h=new Set([...Object.keys(n.categories),...Object.keys(l.categories)]);if(h.size>0){console.log(""),console.log(c("bold"," ISSUE BREAKDOWN"));for(const e of h){const o=n.categories[e]||0,a=l.categories[e]||0,g=e.charAt(0).toUpperCase()+e.slice(1);console.log(c("gray",` ${s(g,22)} ${t(o,5)} vs ${t(a,5)} ${o<a?c("green",`← ${r}`):o>a?c("green",`→ ${i}`):c("gray","tied")}`))}}console.log(""),console.log(c("gray",` Full scan: npx thuban scan ${o[0]}`)),console.log(c("gray",` Full scan: npx thuban scan ${o[1]}`)),console.log("")}async function main(){const e=parseArgs(process.argv.slice(2));if(e.command&&"help"!==e.command||(printHelp(),process.exit(0)),"version"===e.command){const e=JSON.parse(fs.readFileSync(path.join(__dirname,"package.json"),"utf-8"));console.log(`thuban v${e.version}`),process.exit(0)}["activate","status","upgrade","telemetry","compare","crucible","support","feedback"].includes(e.command)||e.targetPath.match(/^(https?:\/\/|git@)/)||fs.existsSync(e.targetPath)||(console.error(c("red",` Error: Path not found: ${e.targetPath}`)),process.exit(1));try{switch(e.command){case"scan":await cmdScan(e);break;case"deps":await cmdDeps(e);break;case"drift":await cmdDrift(e);break;case"inject":await cmdInject(e);break;case"health":case"report":await cmdReport(e);break;case"debt":await cmdDebt(e);break;case"fix":await cmdFix(e);break;case"hallucinate":case"hal":await cmdHallucinate(e);break;case"watch":await cmdWatch(e);break;case"monitor":await cmdMonitor(e);break;case"history":await cmdHistory(e);break;case"trend":await cmdTrend(e);break;case"dashboard":case"dash":await cmdDashboard(e);break;case"diff":await cmdDiff(e);break;case"activate":await cmdActivate(e);break;case"status":await cmdStatus(e);break;case"upgrade":cmdUpgrade();break;case"gate":await cmdGate(e);break;case"cost":await cmdCost(e);break;case"ghosts":await cmdGhosts(e);break;case"ai-score":case"aiscore":await cmdAIScore(e);break;case"clones":case"duplicates":await cmdClones(e);break;case"passport":await cmdPassport(e);break;case"executive":case"exec-report":case"pdf":await cmdExecutive(e);break;case"baseline":await cmdBaseline(e);break;case"telemetry":await cmdTelemetry(e);break;case"compare":await cmdCompare(e);break;case"crucible":await cmdCrucible(e);break;case"investor-report":case"investor":await cmdInvestorReport(e);break;case"support":case"help-me":await cmdSupport(e);break;case"feedback":await cmdFeedback(e);break;default:console.error(""),console.error(c("red",` Unknown command: ${e.command}`)),console.error("");const o=["scan","compare","deps","drift","inject","health","report","debt","fix","hallucinate","watch","dashboard","diff","gate","cost","ghosts","ai-score","clones","passport","executive","baseline","activate","status","upgrade","telemetry","investor-report","support","feedback"].filter(o=>o.startsWith(e.command.slice(0,2))||o.includes(e.command));o.length>0&&(console.error(c("gray"," Did you mean: ")+c("cyan",o.join(", "))+c("gray","?")),console.error("")),console.error(c("gray"," Quick start:")),console.error(` ${c("cyan","npx thuban scan .")} Scan your project`),console.error(` ${c("cyan","npx thuban --help")} See all commands`),console.error(""),process.exit(1)}}catch(o){console.error(c("red",` Error: ${o.message}`)),e.verbose&&console.error(o.stack),process.exit(1)}}main();
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "thuban",
3
+ "version": "0.4.11",
4
+ "description": "The safety layer for AI-coded software. Detect hallucinated APIs, ghost code, tech debt, and architecture drift. One command. Minimal dependencies.",
5
+ "bin": {
6
+ "thuban": "cli.js"
7
+ },
8
+ "scripts": {
9
+ "scan": "node cli.js scan",
10
+ "test": "node build.js && node --test tests/build-integrity.test.js tests/crlf-safety.test.js tests/windows-paths.test.js tests/npm-publish-smoke.test.js",
11
+ "test:all": "node --test tests/*.test.js packages/scanner/*.test.js packages/crucible/*.test.js",
12
+ "test:build": "node build.js && node --test tests/build-integrity.test.js tests/npm-publish-smoke.test.js"
13
+ },
14
+ "keywords": [
15
+ "code-quality",
16
+ "static-analysis",
17
+ "ai-hallucination",
18
+ "hallucination-detection",
19
+ "ghost-code",
20
+ "tech-debt",
21
+ "ai-code-review",
22
+ "code-health",
23
+ "pre-commit",
24
+ "copilot",
25
+ "cursor",
26
+ "ai-safety",
27
+ "developer-tools",
28
+ "devtools",
29
+ "linter",
30
+ "code-scanner"
31
+ ],
32
+ "author": "Silverwings Benefits <hello@thuban.dev>",
33
+ "license": "SEE LICENSE IN LICENSE",
34
+ "homepage": "https://thuban.dev",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/SilverwingsBenefitsGit/thuban.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/SilverwingsBenefitsGit/thuban/issues"
41
+ },
42
+ "engines": {
43
+ "node": ">=16.0.0"
44
+ },
45
+ "files": [
46
+ "cli.js",
47
+ "packages/scanner/*.js",
48
+ "packages/scanner/python_ast_helper.py",
49
+ "packages/crucible/*.js",
50
+ "packages/crucible/seeds/**",
51
+ "packages/crucible/.golden/",
52
+ "packages/crucible/rules/**",
53
+ "README.md",
54
+ "LICENSE",
55
+ "package.json"
56
+ ],
57
+ "dependencies": {
58
+ "@babel/parser": "^7.29.7"
59
+ },
60
+ "devDependencies": {
61
+ "terser": "^5.48.0"
62
+ }
63
+ }