@creeperhost/modlens-mcp 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +938 -0
  2. package/dist/access-flags.d.ts +58 -0
  3. package/dist/access-flags.d.ts.map +1 -0
  4. package/dist/access-flags.js +79 -0
  5. package/dist/access-flags.js.map +1 -0
  6. package/dist/access-flags.test.d.ts +2 -0
  7. package/dist/access-flags.test.d.ts.map +1 -0
  8. package/dist/access-flags.test.js +189 -0
  9. package/dist/access-flags.test.js.map +1 -0
  10. package/dist/batch-ingest.d.ts +2 -0
  11. package/dist/batch-ingest.d.ts.map +1 -0
  12. package/dist/batch-ingest.js +54 -0
  13. package/dist/batch-ingest.js.map +1 -0
  14. package/dist/batch-resolve-mixins.d.ts +2 -0
  15. package/dist/batch-resolve-mixins.d.ts.map +1 -0
  16. package/dist/batch-resolve-mixins.js +36 -0
  17. package/dist/batch-resolve-mixins.js.map +1 -0
  18. package/dist/cache.d.ts +16 -0
  19. package/dist/cache.d.ts.map +1 -0
  20. package/dist/cache.js +36 -0
  21. package/dist/cache.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +1318 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/curseforge.d.ts +53 -0
  27. package/dist/curseforge.d.ts.map +1 -0
  28. package/dist/curseforge.js +104 -0
  29. package/dist/curseforge.js.map +1 -0
  30. package/dist/db-backend.d.ts +17 -0
  31. package/dist/db-backend.d.ts.map +1 -0
  32. package/dist/db-backend.js +40 -0
  33. package/dist/db-backend.js.map +1 -0
  34. package/dist/db.d.ts +11 -0
  35. package/dist/db.d.ts.map +1 -0
  36. package/dist/db.js +55 -0
  37. package/dist/db.js.map +1 -0
  38. package/dist/embed-queue.d.ts +12 -0
  39. package/dist/embed-queue.d.ts.map +1 -0
  40. package/dist/embed-queue.js +103 -0
  41. package/dist/embed-queue.js.map +1 -0
  42. package/dist/embeddings.d.ts +21 -0
  43. package/dist/embeddings.d.ts.map +1 -0
  44. package/dist/embeddings.js +55 -0
  45. package/dist/embeddings.js.map +1 -0
  46. package/dist/env-path.d.ts +19 -0
  47. package/dist/env-path.d.ts.map +1 -0
  48. package/dist/env-path.js +40 -0
  49. package/dist/env-path.js.map +1 -0
  50. package/dist/fetch-utils.d.ts +24 -0
  51. package/dist/fetch-utils.d.ts.map +1 -0
  52. package/dist/fetch-utils.js +73 -0
  53. package/dist/fetch-utils.js.map +1 -0
  54. package/dist/fetch-utils.test.d.ts +2 -0
  55. package/dist/fetch-utils.test.d.ts.map +1 -0
  56. package/dist/fetch-utils.test.js +133 -0
  57. package/dist/fetch-utils.test.js.map +1 -0
  58. package/dist/generated/sqlite/browser.d.ts +55 -0
  59. package/dist/generated/sqlite/browser.d.ts.map +1 -0
  60. package/dist/generated/sqlite/browser.js +18 -0
  61. package/dist/generated/sqlite/browser.js.map +1 -0
  62. package/dist/generated/sqlite/client.d.ts +72 -0
  63. package/dist/generated/sqlite/client.d.ts.map +1 -0
  64. package/dist/generated/sqlite/client.js +33 -0
  65. package/dist/generated/sqlite/client.js.map +1 -0
  66. package/dist/generated/sqlite/commonInputTypes.d.ts +387 -0
  67. package/dist/generated/sqlite/commonInputTypes.d.ts.map +1 -0
  68. package/dist/generated/sqlite/commonInputTypes.js +11 -0
  69. package/dist/generated/sqlite/commonInputTypes.js.map +1 -0
  70. package/dist/generated/sqlite/enums.d.ts +2 -0
  71. package/dist/generated/sqlite/enums.d.ts.map +1 -0
  72. package/dist/generated/sqlite/enums.js +11 -0
  73. package/dist/generated/sqlite/enums.js.map +1 -0
  74. package/dist/generated/sqlite/internal/class.d.ts +226 -0
  75. package/dist/generated/sqlite/internal/class.d.ts.map +1 -0
  76. package/dist/generated/sqlite/internal/class.js +84 -0
  77. package/dist/generated/sqlite/internal/class.js.map +1 -0
  78. package/dist/generated/sqlite/internal/prismaNamespace.d.ts +1344 -0
  79. package/dist/generated/sqlite/internal/prismaNamespace.d.ts.map +1 -0
  80. package/dist/generated/sqlite/internal/prismaNamespace.js +220 -0
  81. package/dist/generated/sqlite/internal/prismaNamespace.js.map +1 -0
  82. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +204 -0
  83. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  84. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js +191 -0
  85. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js.map +1 -0
  86. package/dist/generated/sqlite/models/DocEntry.d.ts +1223 -0
  87. package/dist/generated/sqlite/models/DocEntry.d.ts.map +1 -0
  88. package/dist/generated/sqlite/models/DocEntry.js +2 -0
  89. package/dist/generated/sqlite/models/DocEntry.js.map +1 -0
  90. package/dist/generated/sqlite/models/McSourceFile.d.ts +1289 -0
  91. package/dist/generated/sqlite/models/McSourceFile.d.ts.map +1 -0
  92. package/dist/generated/sqlite/models/McSourceFile.js +2 -0
  93. package/dist/generated/sqlite/models/McSourceFile.js.map +1 -0
  94. package/dist/generated/sqlite/models/McVersion.d.ts +1315 -0
  95. package/dist/generated/sqlite/models/McVersion.d.ts.map +1 -0
  96. package/dist/generated/sqlite/models/McVersion.js +2 -0
  97. package/dist/generated/sqlite/models/McVersion.js.map +1 -0
  98. package/dist/generated/sqlite/models/McVersionDiff.d.ts +1061 -0
  99. package/dist/generated/sqlite/models/McVersionDiff.d.ts.map +1 -0
  100. package/dist/generated/sqlite/models/McVersionDiff.js +2 -0
  101. package/dist/generated/sqlite/models/McVersionDiff.js.map +1 -0
  102. package/dist/generated/sqlite/models/Mod.d.ts +2396 -0
  103. package/dist/generated/sqlite/models/Mod.d.ts.map +1 -0
  104. package/dist/generated/sqlite/models/Mod.js +2 -0
  105. package/dist/generated/sqlite/models/Mod.js.map +1 -0
  106. package/dist/generated/sqlite/models/ModClass.d.ts +1254 -0
  107. package/dist/generated/sqlite/models/ModClass.d.ts.map +1 -0
  108. package/dist/generated/sqlite/models/ModClass.js +2 -0
  109. package/dist/generated/sqlite/models/ModClass.js.map +1 -0
  110. package/dist/generated/sqlite/models/ModSourceFile.d.ts +1283 -0
  111. package/dist/generated/sqlite/models/ModSourceFile.d.ts.map +1 -0
  112. package/dist/generated/sqlite/models/ModSourceFile.js +2 -0
  113. package/dist/generated/sqlite/models/ModSourceFile.js.map +1 -0
  114. package/dist/generated/sqlite/models/ModTag.d.ts +1278 -0
  115. package/dist/generated/sqlite/models/ModTag.d.ts.map +1 -0
  116. package/dist/generated/sqlite/models/ModTag.js +2 -0
  117. package/dist/generated/sqlite/models/ModTag.js.map +1 -0
  118. package/dist/generated/sqlite/models/ModVersionDiff.d.ts +1073 -0
  119. package/dist/generated/sqlite/models/ModVersionDiff.d.ts.map +1 -0
  120. package/dist/generated/sqlite/models/ModVersionDiff.js +2 -0
  121. package/dist/generated/sqlite/models/ModVersionDiff.js.map +1 -0
  122. package/dist/generated/sqlite/models/Primer.d.ts +1319 -0
  123. package/dist/generated/sqlite/models/Primer.d.ts.map +1 -0
  124. package/dist/generated/sqlite/models/Primer.js +2 -0
  125. package/dist/generated/sqlite/models/Primer.js.map +1 -0
  126. package/dist/generated/sqlite/models.d.ts +12 -0
  127. package/dist/generated/sqlite/models.d.ts.map +1 -0
  128. package/dist/generated/sqlite/models.js +2 -0
  129. package/dist/generated/sqlite/models.js.map +1 -0
  130. package/dist/jar.d.ts +7 -0
  131. package/dist/jar.d.ts.map +1 -0
  132. package/dist/jar.js +52 -0
  133. package/dist/jar.js.map +1 -0
  134. package/dist/java-tools.d.ts +46 -0
  135. package/dist/java-tools.d.ts.map +1 -0
  136. package/dist/java-tools.js +263 -0
  137. package/dist/java-tools.js.map +1 -0
  138. package/dist/launcher.d.ts +3 -0
  139. package/dist/launcher.d.ts.map +1 -0
  140. package/dist/launcher.js +105 -0
  141. package/dist/launcher.js.map +1 -0
  142. package/dist/mappings.d.ts +95 -0
  143. package/dist/mappings.d.ts.map +1 -0
  144. package/dist/mappings.js +1094 -0
  145. package/dist/mappings.js.map +1 -0
  146. package/dist/mappings.test.d.ts +2 -0
  147. package/dist/mappings.test.d.ts.map +1 -0
  148. package/dist/mappings.test.js +161 -0
  149. package/dist/mappings.test.js.map +1 -0
  150. package/dist/minecraft.d.ts +21 -0
  151. package/dist/minecraft.d.ts.map +1 -0
  152. package/dist/minecraft.js +70 -0
  153. package/dist/minecraft.js.map +1 -0
  154. package/dist/modpacks-ch.d.ts +224 -0
  155. package/dist/modpacks-ch.d.ts.map +1 -0
  156. package/dist/modpacks-ch.js +146 -0
  157. package/dist/modpacks-ch.js.map +1 -0
  158. package/dist/modrinth.d.ts +67 -0
  159. package/dist/modrinth.d.ts.map +1 -0
  160. package/dist/modrinth.js +88 -0
  161. package/dist/modrinth.js.map +1 -0
  162. package/dist/platform-adapter.d.ts +23 -0
  163. package/dist/platform-adapter.d.ts.map +1 -0
  164. package/dist/platform-adapter.js +2 -0
  165. package/dist/platform-adapter.js.map +1 -0
  166. package/dist/platform.d.ts +47 -0
  167. package/dist/platform.d.ts.map +1 -0
  168. package/dist/platform.js +175 -0
  169. package/dist/platform.js.map +1 -0
  170. package/dist/processor.d.ts +51 -0
  171. package/dist/processor.d.ts.map +1 -0
  172. package/dist/processor.js +655 -0
  173. package/dist/processor.js.map +1 -0
  174. package/dist/processor.test.d.ts +2 -0
  175. package/dist/processor.test.d.ts.map +1 -0
  176. package/dist/processor.test.js +629 -0
  177. package/dist/processor.test.js.map +1 -0
  178. package/dist/repositories/embeddings-sqlite.d.ts +38 -0
  179. package/dist/repositories/embeddings-sqlite.d.ts.map +1 -0
  180. package/dist/repositories/embeddings-sqlite.js +208 -0
  181. package/dist/repositories/embeddings-sqlite.js.map +1 -0
  182. package/dist/repositories/embeddings.d.ts +40 -0
  183. package/dist/repositories/embeddings.d.ts.map +1 -0
  184. package/dist/repositories/embeddings.js +136 -0
  185. package/dist/repositories/embeddings.js.map +1 -0
  186. package/dist/repositories/index.d.ts +2 -0
  187. package/dist/repositories/index.d.ts.map +1 -0
  188. package/dist/repositories/index.js +15 -0
  189. package/dist/repositories/index.js.map +1 -0
  190. package/dist/repositories/mcVersion.d.ts +16 -0
  191. package/dist/repositories/mcVersion.d.ts.map +1 -0
  192. package/dist/repositories/mcVersion.js +52 -0
  193. package/dist/repositories/mcVersion.js.map +1 -0
  194. package/dist/repositories/mod.d.ts +241 -0
  195. package/dist/repositories/mod.d.ts.map +1 -0
  196. package/dist/repositories/mod.js +342 -0
  197. package/dist/repositories/mod.js.map +1 -0
  198. package/dist/repositories/packs.d.ts +44 -0
  199. package/dist/repositories/packs.d.ts.map +1 -0
  200. package/dist/repositories/packs.js +138 -0
  201. package/dist/repositories/packs.js.map +1 -0
  202. package/dist/search-adapter.d.ts +34 -0
  203. package/dist/search-adapter.d.ts.map +1 -0
  204. package/dist/search-adapter.js +195 -0
  205. package/dist/search-adapter.js.map +1 -0
  206. package/dist/search.d.ts +6 -0
  207. package/dist/search.d.ts.map +1 -0
  208. package/dist/search.js +54 -0
  209. package/dist/search.js.map +1 -0
  210. package/dist/search.test.d.ts +2 -0
  211. package/dist/search.test.d.ts.map +1 -0
  212. package/dist/search.test.js +71 -0
  213. package/dist/search.test.js.map +1 -0
  214. package/dist/security.d.ts +98 -0
  215. package/dist/security.d.ts.map +1 -0
  216. package/dist/security.js +446 -0
  217. package/dist/security.js.map +1 -0
  218. package/dist/security.test.d.ts +2 -0
  219. package/dist/security.test.d.ts.map +1 -0
  220. package/dist/security.test.js +687 -0
  221. package/dist/security.test.js.map +1 -0
  222. package/dist/server.d.ts +2 -0
  223. package/dist/server.d.ts.map +1 -0
  224. package/dist/server.js +1465 -0
  225. package/dist/server.js.map +1 -0
  226. package/dist/setup.d.ts +2 -0
  227. package/dist/setup.d.ts.map +1 -0
  228. package/dist/setup.js +1113 -0
  229. package/dist/setup.js.map +1 -0
  230. package/dist/tools/bytecode.d.ts +129 -0
  231. package/dist/tools/bytecode.d.ts.map +1 -0
  232. package/dist/tools/bytecode.js +679 -0
  233. package/dist/tools/bytecode.js.map +1 -0
  234. package/dist/tools/catalog.d.ts +54 -0
  235. package/dist/tools/catalog.d.ts.map +1 -0
  236. package/dist/tools/catalog.js +249 -0
  237. package/dist/tools/catalog.js.map +1 -0
  238. package/dist/tools/compat-check.d.ts +23 -0
  239. package/dist/tools/compat-check.d.ts.map +1 -0
  240. package/dist/tools/compat-check.js +250 -0
  241. package/dist/tools/compat-check.js.map +1 -0
  242. package/dist/tools/compat-check.test.d.ts +2 -0
  243. package/dist/tools/compat-check.test.d.ts.map +1 -0
  244. package/dist/tools/compat-check.test.js +179 -0
  245. package/dist/tools/compat-check.test.js.map +1 -0
  246. package/dist/tools/diagnostics.d.ts +10 -0
  247. package/dist/tools/diagnostics.d.ts.map +1 -0
  248. package/dist/tools/diagnostics.js +133 -0
  249. package/dist/tools/diagnostics.js.map +1 -0
  250. package/dist/tools/diagnostics.test.d.ts +2 -0
  251. package/dist/tools/diagnostics.test.d.ts.map +1 -0
  252. package/dist/tools/diagnostics.test.js +168 -0
  253. package/dist/tools/diagnostics.test.js.map +1 -0
  254. package/dist/tools/docs.d.ts +19 -0
  255. package/dist/tools/docs.d.ts.map +1 -0
  256. package/dist/tools/docs.js +230 -0
  257. package/dist/tools/docs.js.map +1 -0
  258. package/dist/tools/embed-registry.d.ts +125 -0
  259. package/dist/tools/embed-registry.d.ts.map +1 -0
  260. package/dist/tools/embed-registry.js +560 -0
  261. package/dist/tools/embed-registry.js.map +1 -0
  262. package/dist/tools/gradle.d.ts +16 -0
  263. package/dist/tools/gradle.d.ts.map +1 -0
  264. package/dist/tools/gradle.js +182 -0
  265. package/dist/tools/gradle.js.map +1 -0
  266. package/dist/tools/graphify.d.ts +144 -0
  267. package/dist/tools/graphify.d.ts.map +1 -0
  268. package/dist/tools/graphify.js +798 -0
  269. package/dist/tools/graphify.js.map +1 -0
  270. package/dist/tools/graphify.test.d.ts +2 -0
  271. package/dist/tools/graphify.test.d.ts.map +1 -0
  272. package/dist/tools/graphify.test.js +39 -0
  273. package/dist/tools/graphify.test.js.map +1 -0
  274. package/dist/tools/ingest.d.ts +85 -0
  275. package/dist/tools/ingest.d.ts.map +1 -0
  276. package/dist/tools/ingest.js +477 -0
  277. package/dist/tools/ingest.js.map +1 -0
  278. package/dist/tools/ingest.test.d.ts +2 -0
  279. package/dist/tools/ingest.test.d.ts.map +1 -0
  280. package/dist/tools/ingest.test.js +340 -0
  281. package/dist/tools/ingest.test.js.map +1 -0
  282. package/dist/tools/kubejs.d.ts +37 -0
  283. package/dist/tools/kubejs.d.ts.map +1 -0
  284. package/dist/tools/kubejs.js +245 -0
  285. package/dist/tools/kubejs.js.map +1 -0
  286. package/dist/tools/mappings.d.ts +17 -0
  287. package/dist/tools/mappings.d.ts.map +1 -0
  288. package/dist/tools/mappings.js +85 -0
  289. package/dist/tools/mappings.js.map +1 -0
  290. package/dist/tools/mc-fts.d.ts +101 -0
  291. package/dist/tools/mc-fts.d.ts.map +1 -0
  292. package/dist/tools/mc-fts.js +279 -0
  293. package/dist/tools/mc-fts.js.map +1 -0
  294. package/dist/tools/mcmeta.d.ts +41 -0
  295. package/dist/tools/mcmeta.d.ts.map +1 -0
  296. package/dist/tools/mcmeta.js +365 -0
  297. package/dist/tools/mcmeta.js.map +1 -0
  298. package/dist/tools/mixin-scan.d.ts +113 -0
  299. package/dist/tools/mixin-scan.d.ts.map +1 -0
  300. package/dist/tools/mixin-scan.js +433 -0
  301. package/dist/tools/mixin-scan.js.map +1 -0
  302. package/dist/tools/mod-data.d.ts +83 -0
  303. package/dist/tools/mod-data.d.ts.map +1 -0
  304. package/dist/tools/mod-data.js +630 -0
  305. package/dist/tools/mod-data.js.map +1 -0
  306. package/dist/tools/mod-tags.d.ts +59 -0
  307. package/dist/tools/mod-tags.d.ts.map +1 -0
  308. package/dist/tools/mod-tags.js +279 -0
  309. package/dist/tools/mod-tags.js.map +1 -0
  310. package/dist/tools/mod-tags.test.d.ts +2 -0
  311. package/dist/tools/mod-tags.test.d.ts.map +1 -0
  312. package/dist/tools/mod-tags.test.js +75 -0
  313. package/dist/tools/mod-tags.test.js.map +1 -0
  314. package/dist/tools/modpacks-ch.d.ts +257 -0
  315. package/dist/tools/modpacks-ch.d.ts.map +1 -0
  316. package/dist/tools/modpacks-ch.js +516 -0
  317. package/dist/tools/modpacks-ch.js.map +1 -0
  318. package/dist/tools/packtools.d.ts +113 -0
  319. package/dist/tools/packtools.d.ts.map +1 -0
  320. package/dist/tools/packtools.js +809 -0
  321. package/dist/tools/packtools.js.map +1 -0
  322. package/dist/tools/packtools.test.d.ts +2 -0
  323. package/dist/tools/packtools.test.d.ts.map +1 -0
  324. package/dist/tools/packtools.test.js +99 -0
  325. package/dist/tools/packtools.test.js.map +1 -0
  326. package/dist/tools/platform.d.ts +68 -0
  327. package/dist/tools/platform.d.ts.map +1 -0
  328. package/dist/tools/platform.js +452 -0
  329. package/dist/tools/platform.js.map +1 -0
  330. package/dist/tools/primers.d.ts +36 -0
  331. package/dist/tools/primers.d.ts.map +1 -0
  332. package/dist/tools/primers.js +451 -0
  333. package/dist/tools/primers.js.map +1 -0
  334. package/dist/tools/reports.d.ts +19 -0
  335. package/dist/tools/reports.d.ts.map +1 -0
  336. package/dist/tools/reports.js +573 -0
  337. package/dist/tools/reports.js.map +1 -0
  338. package/dist/tools/source.d.ts +10 -0
  339. package/dist/tools/source.d.ts.map +1 -0
  340. package/dist/tools/source.js +101 -0
  341. package/dist/tools/source.js.map +1 -0
  342. package/dist/tools/vanilla-data.d.ts +127 -0
  343. package/dist/tools/vanilla-data.d.ts.map +1 -0
  344. package/dist/tools/vanilla-data.js +824 -0
  345. package/dist/tools/vanilla-data.js.map +1 -0
  346. package/dist/tools/vanilla.d.ts +171 -0
  347. package/dist/tools/vanilla.d.ts.map +1 -0
  348. package/dist/tools/vanilla.js +612 -0
  349. package/dist/tools/vanilla.js.map +1 -0
  350. package/dist/tools/version-diff.d.ts +113 -0
  351. package/dist/tools/version-diff.d.ts.map +1 -0
  352. package/dist/tools/version-diff.js +519 -0
  353. package/dist/tools/version-diff.js.map +1 -0
  354. package/dist/tools/version-diff.test.d.ts +2 -0
  355. package/dist/tools/version-diff.test.d.ts.map +1 -0
  356. package/dist/tools/version-diff.test.js +102 -0
  357. package/dist/tools/version-diff.test.js.map +1 -0
  358. package/dist/validate.d.ts +19 -0
  359. package/dist/validate.d.ts.map +1 -0
  360. package/dist/validate.js +54 -0
  361. package/dist/validate.js.map +1 -0
  362. package/dist/validate.test.d.ts +2 -0
  363. package/dist/validate.test.d.ts.map +1 -0
  364. package/dist/validate.test.js +73 -0
  365. package/dist/validate.test.js.map +1 -0
  366. package/package.json +62 -0
  367. package/prisma/backends/schema.sqlite.prisma +215 -0
  368. package/prisma/backends/template.db +0 -0
  369. package/prisma/schema.prisma +303 -0
  370. package/scripts/backup.mjs +151 -0
  371. package/scripts/build-template-db.mjs +38 -0
  372. package/scripts/check-atm10.mjs +27 -0
  373. package/scripts/check-sync.mjs +13 -0
  374. package/scripts/create-fts-index.mjs +50 -0
  375. package/scripts/enable-pgvector.mjs +90 -0
  376. package/scripts/enable-sqlite-vec.mjs +158 -0
  377. package/scripts/migrate-backend.mjs +188 -0
  378. package/scripts/migrate-embed-provenance.mjs +80 -0
  379. package/scripts/migrate-metadata-source.mjs +62 -0
  380. package/scripts/migrate-mod-source-files.mjs +67 -0
  381. package/scripts/post-update.mjs +77 -0
  382. package/scripts/verify-atm10.mjs +63 -0
@@ -0,0 +1,516 @@
1
+ /**
2
+ * modpacks.ch tool — search and sync packs from both the FTB and
3
+ * CurseForge namespaces exposed by the modpacks.ch public API (no API key
4
+ * required for either).
5
+ *
6
+ * modpacks.ch is a service by CreeperHost (https://www.creeperhost.net).
7
+ * Thanks to CreeperHost for providing this free public API.
8
+ *
9
+ * User-Agent spec: The modpacks.ch team requested a custom User-Agent for
10
+ * usage tracking. See USER_AGENT constant in src/modpacks-ch.ts.
11
+ *
12
+ * Supported actions:
13
+ * search — full-text search FTB or CurseForge packs
14
+ * featured — list featured FTB packs
15
+ * info — get pack metadata + version list
16
+ * manifest — get the full file manifest for a specific version
17
+ * sync_pack_mods — download + ingest every mod/datapack/resourcepack JAR
18
+ * from a pack version's manifest into the ModLens DB
19
+ * search_ftb_mods — search the FTB mod index (returns mixed CF int / MR
20
+ * string IDs)
21
+ */
22
+ import { join, resolve } from "path";
23
+ import { createHash } from "crypto";
24
+ import { rename, mkdir } from "fs/promises";
25
+ import AdmZip from "adm-zip";
26
+ import { ensureDir, exists, CACHE_ROOT } from "../cache.js";
27
+ import { searchPacks, getFeaturedPacks, getPack, getPackManifest, getCfPack, getCfPackManifest, searchMods, getMod, getModsBatch, resolveModVersionUrl, USER_AGENT, downloadManifestFile, resolveFileUrl, } from "../modpacks-ch.js";
28
+ import { fetchWithRetry, DOWNLOAD_OPTS } from "../fetch-utils.js";
29
+ import { createWriteStream } from "fs";
30
+ import { pipeline } from "stream/promises";
31
+ const MOD_HEADERS = { "User-Agent": USER_AGENT };
32
+ import { ingestMod } from "./ingest.js";
33
+ import { upsertPackVersion, upsertPackFile, listPackVersions, listPackFiles, findPacksForMod, findPacksForCfProject, findPackVersion, } from "../repositories/packs.js";
34
+ // ── Pack search / browse ──────────────────────────────────────────────────────
35
+ export async function searchPacksAction(term, namespace = "ftb", limit = 20) {
36
+ // Always call the unified FTB search endpoint — it returns both FTB pack IDs
37
+ // (in `packs`) and CurseForge pack IDs (in `curseforge`) in a single response.
38
+ // The /curseforge/search/ endpoint does not exist.
39
+ const r = await searchPacks(term, limit);
40
+ if (!r)
41
+ return { ftbPacks: [], cfPacks: [], total: 0 };
42
+ const ftbPacks = r.packs ?? [];
43
+ const cfPacks = r.curseforge ?? [];
44
+ // If caller specified a namespace, surface only that subset (but always
45
+ // include both for discoverability — callers can filter as needed).
46
+ return {
47
+ ftbPacks,
48
+ cfPacks,
49
+ total: r.total,
50
+ note: "ftbPacks = FTB-hosted; cfPacks = CurseForge-hosted (use namespace=curseforge for info/manifest)",
51
+ };
52
+ }
53
+ export async function featuredPacksAction(limit = 20) {
54
+ const r = await getFeaturedPacks(limit);
55
+ if (!r)
56
+ return { packs: [], total: 0 };
57
+ return r;
58
+ }
59
+ export async function packInfoAction(packId, namespace = "ftb") {
60
+ const pack = namespace === "curseforge"
61
+ ? await getCfPack(packId)
62
+ : await getPack(packId);
63
+ if (!pack)
64
+ throw new Error(`Pack ${packId} not found on namespace "${namespace}"`);
65
+ // Summarise versions (strip massive description field)
66
+ return {
67
+ id: pack.id,
68
+ name: pack.name,
69
+ synopsis: pack.synopsis,
70
+ provider: pack.provider,
71
+ installs: pack.installs,
72
+ tags: (pack.tags ?? []).map((t) => t.name),
73
+ authors: (pack.authors ?? []).map((a) => ({ name: a.name, type: a.type })),
74
+ links: (pack.links ?? []).map((l) => ({ type: l.type, url: l.link })),
75
+ versions: (pack.versions ?? []).map((v) => ({
76
+ id: v.id,
77
+ name: v.name,
78
+ type: v.type,
79
+ targets: (v.targets ?? []).map((t) => ({ name: t.name, version: t.version })),
80
+ updated: new Date(v.updated * 1000).toISOString(),
81
+ })),
82
+ };
83
+ }
84
+ export async function packManifestAction(packId, versionId, namespace = "ftb") {
85
+ const manifest = namespace === "curseforge"
86
+ ? await getCfPackManifest(packId, versionId)
87
+ : await getPackManifest(packId, versionId);
88
+ if (!manifest)
89
+ throw new Error(`Manifest not found for pack ${packId} version ${versionId} (${namespace})`);
90
+ const fileSummary = (f) => ({
91
+ id: f.id,
92
+ name: f.name,
93
+ type: f.type,
94
+ path: f.path,
95
+ size: f.size,
96
+ sha1: f.sha1 || null,
97
+ clientonly: f.clientonly,
98
+ serveronly: f.serveronly,
99
+ optional: f.optional,
100
+ hasCdnUrl: !!resolveFileUrl(f),
101
+ cfProject: f.curseforge?.project ?? null,
102
+ cfFile: f.curseforge?.file ?? null,
103
+ });
104
+ const manifestFiles = manifest.files ?? [];
105
+ return {
106
+ id: manifest.id,
107
+ parent: manifest.parent,
108
+ name: manifest.name,
109
+ version: manifest.version,
110
+ type: manifest.type,
111
+ targets: (manifest.targets ?? []).map((t) => ({ name: t.name, version: t.version })),
112
+ fileCount: manifestFiles.length,
113
+ byType: Object.fromEntries([...new Set(manifestFiles.map((f) => f.type))].map((t) => [
114
+ t,
115
+ manifestFiles.filter((f) => f.type === t).length,
116
+ ])),
117
+ files: manifestFiles.map(fileSummary),
118
+ };
119
+ }
120
+ // ── FTB mod search ────────────────────────────────────────────────────────────
121
+ export async function searchFtbModsAction(term, limit = 20) {
122
+ const r = await searchMods(term, limit);
123
+ if (!r)
124
+ return { mods: [], total: 0, enriched: [] };
125
+ // Enrich the first up to 20 IDs into full mod objects so callers get
126
+ // names/synopses without having to call ftb_mod_info for each hit.
127
+ const mods = r.mods ?? [];
128
+ const take = mods.slice(0, Math.min(mods.length, 20));
129
+ const enriched = await getModsBatch(take);
130
+ return {
131
+ total: r.total ?? 0,
132
+ mods,
133
+ enriched: enriched.map((m) => ({
134
+ id: m.id,
135
+ name: m.name,
136
+ synopsis: m.synopsis,
137
+ installs: m.installs,
138
+ links: (m.links ?? []).map((l) => ({ type: l.type, url: l.link })),
139
+ })),
140
+ };
141
+ }
142
+ export async function ftbModInfoAction(modId, opts = {}) {
143
+ const m = await getMod(modId);
144
+ if (!m)
145
+ throw new Error(`FTB mod ${modId} not found`);
146
+ // Filter versions by mcVersion / loader if requested
147
+ let versions = m.versions;
148
+ if (opts.mcVersion) {
149
+ versions = versions.filter((v) => v.targets.some((t) => t.type === "game" && t.version === opts.mcVersion));
150
+ }
151
+ if (opts.loader) {
152
+ const loaderLower = opts.loader.toLowerCase();
153
+ versions = versions.filter((v) => v.targets.some((t) => t.type === "modloader" && t.name.toLowerCase() === loaderLower));
154
+ }
155
+ return {
156
+ id: m.id,
157
+ name: m.name,
158
+ synopsis: m.synopsis,
159
+ installs: m.installs,
160
+ links: m.links.map((l) => ({ type: l.type, url: l.link })),
161
+ versions: versions.map((v) => ({
162
+ fileId: v.id,
163
+ name: v.name,
164
+ version: v.version,
165
+ type: v.type,
166
+ size: v.size,
167
+ sha1: v.sha1 || null,
168
+ url: resolveModVersionUrl(v),
169
+ mcVersions: v.targets.filter((t) => t.type === "game").map((t) => t.version),
170
+ loaders: v.targets.filter((t) => t.type === "modloader").map((t) => t.name),
171
+ updated: new Date(v.updated * 1000).toISOString(),
172
+ })),
173
+ };
174
+ }
175
+ /**
176
+ * Download and ingest a single mod JAR from the modpacks.ch CDN.
177
+ * No CF API key required.
178
+ *
179
+ * @param modId - CF project ID (integer) or Modrinth slug/ID (string)
180
+ * @param opts.mcVersion - Filter to versions for this MC version
181
+ * @param opts.loader - Filter to versions for this loader (neoforge, fabric, etc.)
182
+ * @param opts.fileId - Exact CF file ID to download (skip filtering)
183
+ * @param opts.force - Re-download even if the file is already in cache
184
+ */
185
+ export async function downloadModAction(modId, opts = {}) {
186
+ const m = await getMod(modId);
187
+ if (!m)
188
+ throw new Error(`Mod ${modId} not found on modpacks.ch`);
189
+ let candidates = m.versions;
190
+ if (opts.fileId !== undefined) {
191
+ // Exact file requested
192
+ candidates = candidates.filter((v) => v.id === opts.fileId);
193
+ }
194
+ else {
195
+ if (opts.mcVersion) {
196
+ candidates = candidates.filter((v) => v.targets.some((t) => t.type === "game" && t.version === opts.mcVersion));
197
+ }
198
+ if (opts.loader) {
199
+ const lo = opts.loader.toLowerCase();
200
+ candidates = candidates.filter((v) => v.targets.some((t) => t.type === "modloader" && t.name.toLowerCase() === lo));
201
+ }
202
+ }
203
+ if (candidates.length === 0) {
204
+ throw new Error(`No version of mod ${m.name} (${modId}) matches the requested filters` +
205
+ (opts.mcVersion ? ` mcVersion=${opts.mcVersion}` : "") +
206
+ (opts.loader ? ` loader=${opts.loader}` : ""));
207
+ }
208
+ // Take the first (most recent) matching version
209
+ const version = candidates[0];
210
+ const url = resolveModVersionUrl(version);
211
+ if (!url)
212
+ throw new Error(`No download URL available for ${version.name}`);
213
+ // Build a stable cache path: use sha1 when available
214
+ const key = version.sha1 || String(version.id);
215
+ const destPath = join(CACHE_ROOT, "mods", String(m.id), `${key}.jar`);
216
+ const tmpPath = destPath + ".tmp";
217
+ await ensureDir(destPath);
218
+ if (opts.force || !(await exists(destPath))) {
219
+ const res = await fetchWithRetry(url, { headers: MOD_HEADERS }, DOWNLOAD_OPTS);
220
+ if (!res.ok)
221
+ throw new Error(`Download failed for ${version.name}: HTTP ${res.status}`);
222
+ const stream = createWriteStream(tmpPath);
223
+ await pipeline(res.body, stream);
224
+ await rename(tmpPath, destPath);
225
+ }
226
+ const result = await ingestMod(destPath, /* skipSource */ true);
227
+ return {
228
+ status: result.status,
229
+ modId: result.status === "ingested" || result.status === "replaced" || result.status === "already_ingested"
230
+ ? (result.mod?.id ?? result.existingDbId)
231
+ : undefined,
232
+ name: version.name,
233
+ version: version.version,
234
+ jarPath: destPath,
235
+ message: "message" in result ? result.message : undefined,
236
+ };
237
+ }
238
+ // ── Sync pack mods ────────────────────────────────────────────────────────────
239
+ /**
240
+ * Download and ingest every mod (and optionally resource/datapack) from a
241
+ * modpack manifest into the ModLens database.
242
+ *
243
+ * Works for both FTB packs and CurseForge packs via the modpacks.ch API —
244
+ * no CurseForge API key required.
245
+ */
246
+ export async function syncPackModsAction(opts) {
247
+ const { packId, versionId, namespace, concurrency = 3 } = opts;
248
+ const ingestTypes = opts.fileTypes ?? ["mod", "resource"];
249
+ const skipServer = opts.skipServer ?? false;
250
+ const skipOptional = opts.skipOptional ?? false;
251
+ const manifest = namespace === "curseforge"
252
+ ? await getCfPackManifest(packId, versionId)
253
+ : await getPackManifest(packId, versionId);
254
+ if (!manifest) {
255
+ throw new Error(`Manifest not found for pack ${packId} v${versionId} (${namespace})`);
256
+ }
257
+ // Filter to downloadable, ingestable file types
258
+ const candidates = manifest.files.filter((f) => {
259
+ if (!ingestTypes.includes(f.type))
260
+ return false;
261
+ if (skipServer && f.serveronly)
262
+ return false;
263
+ if (skipOptional && f.optional)
264
+ return false;
265
+ if (!resolveFileUrl(f))
266
+ return false; // no URL → skip
267
+ return true;
268
+ });
269
+ const packCacheDir = join(CACHE_ROOT, "packs", String(namespace), String(packId), String(versionId));
270
+ const results = [];
271
+ // Process `concurrency` files at a time
272
+ for (let i = 0; i < candidates.length; i += concurrency) {
273
+ const batch = candidates.slice(i, i + concurrency);
274
+ const batchResults = await Promise.all(batch.map((file) => processFile(file, packCacheDir)));
275
+ results.push(...batchResults);
276
+ }
277
+ // ── Record pack membership ────────────────────────────────────────────────
278
+ // Upsert the pack version row first.
279
+ const mcVersion = manifest.targets.find((t) => t.name === "minecraft")?.version ?? null;
280
+ const modloader = manifest.targets.find((t) => t.type === "modloader")?.name ?? null;
281
+ const pvId = await upsertPackVersion({
282
+ namespace,
283
+ packId,
284
+ versionId,
285
+ packName: manifest.name,
286
+ versionName: manifest.version || manifest.name,
287
+ mcVersion,
288
+ modloader,
289
+ });
290
+ // Build a map from manifest file id → processed result.
291
+ const resultMap = new Map();
292
+ for (const r of results) {
293
+ if (r.fileId !== undefined)
294
+ resultMap.set(r.fileId, r);
295
+ }
296
+ // Upsert one PackFile row per manifest entry (ALL files, not just candidates).
297
+ await Promise.all(manifest.files.map((f) => {
298
+ const processed = resultMap.get(f.id);
299
+ return upsertPackFile({
300
+ packVersionId: pvId,
301
+ manifestFileId: f.id,
302
+ fileType: f.type,
303
+ fileName: f.name,
304
+ filePath: f.path || null,
305
+ cfProject: f.curseforge?.project ?? null,
306
+ cfFile: f.curseforge?.file ?? null,
307
+ sha1: f.sha1 || null,
308
+ status: processed?.status ?? "not_synced",
309
+ modId: processed?.dbId ?? null,
310
+ });
311
+ }));
312
+ const ingested = results.filter((r) => r.status === "ingested" || r.status === "replaced").length;
313
+ const skipped = results.filter((r) => r.status === "already_ingested" || r.status === "duplicate_version" || r.status === "duplicate_hash").length;
314
+ const failed = results.filter((r) => r.status === "error").length;
315
+ return {
316
+ packId,
317
+ versionId,
318
+ namespace,
319
+ packVersionDbId: pvId,
320
+ total: candidates.length,
321
+ ingested,
322
+ skipped,
323
+ failed,
324
+ files: results,
325
+ };
326
+ }
327
+ async function processFile(file, cacheDir) {
328
+ const url = resolveFileUrl(file);
329
+ // Derive a stable local path: sha1 preferred, fall back to name hash
330
+ const key = file.sha1 || createHash("sha1").update(url).digest("hex");
331
+ const ext = file.name.endsWith(".zip") ? ".zip" : ".jar";
332
+ const destPath = join(cacheDir, `${key}${ext}`);
333
+ try {
334
+ await ensureDir(destPath);
335
+ if (!(await exists(destPath))) {
336
+ // Download to a temp path then rename atomically
337
+ const tmpPath = destPath + ".tmp";
338
+ await downloadManifestFile(file, tmpPath);
339
+ await rename(tmpPath, destPath);
340
+ }
341
+ // Only ingest JARs (mods) — ZIPs are resource/datapacks that the
342
+ // ingestMod path doesn't handle yet.
343
+ if (ext === ".zip") {
344
+ return { name: file.name, type: file.type, fileId: file.id, status: "downloaded_zip" };
345
+ }
346
+ const result = await ingestMod(destPath, /* skipSource */ true);
347
+ return {
348
+ name: file.name,
349
+ type: file.type,
350
+ fileId: file.id,
351
+ status: result.status,
352
+ dbId: result.status === "ingested" || result.status === "replaced"
353
+ ? result.mod?.id
354
+ : result.status === "already_ingested"
355
+ ? result.mod?.id
356
+ : result.existingDbId,
357
+ message: "message" in result ? result.message : undefined,
358
+ };
359
+ }
360
+ catch (err) {
361
+ return {
362
+ name: file.name,
363
+ type: file.type,
364
+ fileId: file.id,
365
+ status: "error",
366
+ message: err instanceof Error ? err.message : String(err),
367
+ };
368
+ }
369
+ }
370
+ // ── Pack membership queries ───────────────────────────────────────────────────
371
+ /** List all pack versions recorded in the DB, optionally filtered by namespace / packId. */
372
+ export async function listPackVersionsAction(namespace, packId) {
373
+ const rows = await listPackVersions(namespace, packId);
374
+ return {
375
+ total: rows.length,
376
+ versions: rows.map((v) => ({
377
+ dbId: v.id,
378
+ namespace: v.namespace,
379
+ packId: v.packId,
380
+ versionId: v.versionId,
381
+ packName: v.packName,
382
+ versionName: v.versionName,
383
+ mcVersion: v.mcVersion,
384
+ modloader: v.modloader,
385
+ syncedAt: v.syncedAt,
386
+ })),
387
+ };
388
+ }
389
+ /**
390
+ * List all files recorded for a specific pack version.
391
+ * Look up the version by either its DB id (packVersionDbId) or
392
+ * the (namespace + packId + versionId) triple.
393
+ */
394
+ export async function listPackFilesAction(opts) {
395
+ let pvId = opts.packVersionDbId;
396
+ if (pvId === undefined) {
397
+ if (!opts.namespace || opts.packId === undefined || opts.versionId === undefined) {
398
+ throw new Error("Provide either packVersionDbId or (namespace + packId + versionId)");
399
+ }
400
+ const pv = await findPackVersion(opts.namespace, opts.packId, opts.versionId);
401
+ if (!pv)
402
+ throw new Error(`Pack version not yet recorded — run sync_pack_mods first`);
403
+ pvId = pv.id;
404
+ }
405
+ const files = await listPackFiles(pvId);
406
+ const filtered = opts.fileType ? files.filter((f) => f.fileType === opts.fileType) : files;
407
+ return {
408
+ packVersionDbId: pvId,
409
+ total: filtered.length,
410
+ byType: Object.fromEntries([...new Set(files.map((f) => f.fileType))].map((t) => [
411
+ t,
412
+ files.filter((f) => f.fileType === t).length,
413
+ ])),
414
+ files: filtered.map((f) => ({
415
+ id: f.id,
416
+ manifestFileId: f.manifestFileId,
417
+ fileType: f.fileType,
418
+ fileName: f.fileName,
419
+ filePath: f.filePath,
420
+ cfProject: f.cfProject,
421
+ cfFile: f.cfFile,
422
+ sha1: f.sha1,
423
+ status: f.status,
424
+ modId: f.modId,
425
+ })),
426
+ };
427
+ }
428
+ /**
429
+ * Find every pack version that contains a given mod.
430
+ * Accepts a ModLens DB mod id (modDbId) or a CurseForge project id (cfProject).
431
+ */
432
+ export async function findModInPacksAction(opts) {
433
+ if (opts.modDbId !== undefined) {
434
+ const rows = await findPacksForMod(opts.modDbId);
435
+ return { modDbId: opts.modDbId, packs: rows };
436
+ }
437
+ if (opts.cfProject !== undefined) {
438
+ const rows = await findPacksForCfProject(opts.cfProject);
439
+ return { cfProject: opts.cfProject, packs: rows };
440
+ }
441
+ throw new Error("Provide either modDbId or cfProject");
442
+ }
443
+ /**
444
+ * Download and extract the overrides ZIP (KubeJS scripts, configs, defaultconfigs,
445
+ * resource overrides, etc.) for a CurseForge pack version.
446
+ *
447
+ * The overrides are extracted to:
448
+ * CACHE_ROOT/packs/curseforge/{packId}/{versionId}/overrides/
449
+ *
450
+ * The corresponding PackFile record is updated to status "extracted".
451
+ */
452
+ export async function downloadOverridesAction(opts) {
453
+ const { namespace, packId, versionId, force = false } = opts;
454
+ const manifest = namespace === "curseforge"
455
+ ? await getCfPackManifest(packId, versionId)
456
+ : await getPackManifest(packId, versionId);
457
+ if (!manifest)
458
+ throw new Error(`Manifest not found for pack ${packId} v${versionId} (${namespace})`);
459
+ const overrideFile = manifest.files.find((f) => f.type === "cf-extract");
460
+ if (!overrideFile)
461
+ throw new Error("No cf-extract (overrides) entry found in manifest");
462
+ // Use the URL from the manifest (the full CF pack ZIP like "All the Mods 10-7.0.zip")
463
+ const url = resolveFileUrl(overrideFile);
464
+ if (!url)
465
+ throw new Error(`No download URL for cf-extract entry in pack ${packId} v${versionId}`);
466
+ const packCacheDir = join(CACHE_ROOT, "packs", namespace, String(packId), String(versionId));
467
+ // Store under the real filename, not "overrides.zip"
468
+ const urlFilename = decodeURIComponent(url.split("/").pop() ?? "pack.zip");
469
+ const zipPath = join(packCacheDir, urlFilename);
470
+ const extractDir = join(packCacheDir, "overrides");
471
+ await mkdir(packCacheDir, { recursive: true });
472
+ // Download if not cached (or forced)
473
+ if (force || !(await exists(zipPath))) {
474
+ const tmpPath = zipPath + ".tmp";
475
+ const res = await fetchWithRetry(url, { headers: MOD_HEADERS }, DOWNLOAD_OPTS);
476
+ if (!res.ok)
477
+ throw new Error(`Failed to download overrides.zip: HTTP ${res.status} from ${url}`);
478
+ const writer = createWriteStream(tmpPath);
479
+ await pipeline(res.body, writer);
480
+ await rename(tmpPath, zipPath);
481
+ }
482
+ // Extract with zip-slip protection: validate each entry resolves inside extractDir
483
+ await mkdir(extractDir, { recursive: true });
484
+ const zip = new AdmZip(zipPath);
485
+ const resolvedExtractDir = resolve(extractDir);
486
+ for (const entry of zip.getEntries()) {
487
+ const target = resolve(extractDir, entry.entryName);
488
+ if (!target.startsWith(resolvedExtractDir + require("path").sep) && target !== resolvedExtractDir) {
489
+ throw new Error(`Zip-slip detected: entry "${entry.entryName}" escapes extract dir`);
490
+ }
491
+ }
492
+ zip.extractAllTo(extractDir, /* overwrite */ true);
493
+ const entries = zip.getEntries().map((e) => e.entryName);
494
+ const topDirs = [...new Set(entries.map((e) => e.split("/")[0]))].sort();
495
+ // Update pack_file status in DB
496
+ const pv = await findPackVersion(namespace, packId, versionId);
497
+ if (pv) {
498
+ await upsertPackFile({
499
+ packVersionId: pv.id,
500
+ manifestFileId: overrideFile.id,
501
+ fileType: overrideFile.type,
502
+ fileName: overrideFile.name,
503
+ filePath: overrideFile.path || null,
504
+ status: "extracted",
505
+ });
506
+ }
507
+ return {
508
+ status: "extracted",
509
+ zipPath,
510
+ extractDir,
511
+ fileCount: entries.length,
512
+ topDirs,
513
+ url,
514
+ };
515
+ }
516
+ //# sourceMappingURL=modpacks-ch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modpacks-ch.js","sourceRoot":"","sources":["../../src/tools/modpacks-ch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Modpack-specific analysis tools.
3
+ *
4
+ * Tools for modpack developers that go beyond single-mod analysis:
5
+ * - Asset conflict detection across all mod JARs
6
+ * - Vanilla data/asset override tracking
7
+ * - Mod sidedness classification (client-only / server-only / common / client-optional)
8
+ * - Mod complexity scoring for performance/compat triage
9
+ * - Pack-level changelog between two sets of mods
10
+ * - Pack knowledge graph — composite graph of all mods, deps, tags, mixins, and optionally KubeJS scripts
11
+ */
12
+ /**
13
+ * Scan all mod JARs in the DB for duplicate asset paths.
14
+ * When two mods ship the same assets/ path, the last-loaded mod silently wins.
15
+ *
16
+ * assetType: filter to a specific sub-folder (textures | models | sounds | blockstates | shaders | all)
17
+ * mcVersion / loader: optional DB filters
18
+ * limit: max conflicts to return (default 300)
19
+ */
20
+ export declare function findAssetConflicts(assetType?: string, mcVersion?: string, loader?: string, limit?: number): Promise<object>;
21
+ /**
22
+ * Find all mods that override vanilla (minecraft namespace) data or assets.
23
+ * data/minecraft/ overrides affect recipes, loot tables, advancements, etc.
24
+ * assets/minecraft/ overrides change vanilla textures, sounds, models.
25
+ *
26
+ * overrideType: "data" | "assets" | "all" (default all)
27
+ * dataSubtype: optional subfolder filter, e.g. "recipes", "loot_tables", "advancements"
28
+ */
29
+ export declare function findVanillaOverrides(overrideType?: string, dataSubtype?: string, mcVersion?: string, loader?: string): Promise<object>;
30
+ export type ModSidedness = "client_only" | "server_only" | "client_optional" | "common" | "unknown";
31
+ /**
32
+ * Determine the sidedness of a single mod:
33
+ * client_only: not needed on dedicated server
34
+ * server_only: not needed on client
35
+ * client_optional: works without it on server (cosmetic/HUD/minimap mods)
36
+ * common: required on both sides
37
+ *
38
+ * Detection order:
39
+ * 1. fabric.mod.json "environment" field (authoritative for Fabric/Quilt)
40
+ * 2. neoforge.mods.toml / mods.toml "displayTest" (authoritative for NeoForge/Forge)
41
+ * 3. Bytecode reference heuristic (fallback)
42
+ */
43
+ export declare function analyzeModSidedness(modIdOrDbId: string | number): Promise<object>;
44
+ /**
45
+ * Classify all mods in the DB by sidedness.
46
+ * Groups results into: client_only / server_only / client_optional / common / unknown.
47
+ */
48
+ export declare function analyzePackSidedness(mcVersion?: string, loader?: string): Promise<object>;
49
+ /**
50
+ * Compute a complexity / heaviness score per mod.
51
+ * Score = classCount + atCount×10 + awCount×10 + mixinCount×20
52
+ *
53
+ * Useful for identifying which mods are the biggest sources of class
54
+ * transformer / mixin overhead — helpful when diagnosing crashes or lag.
55
+ */
56
+ export declare function computeModComplexity(mcVersion?: string, loader?: string): Promise<object>;
57
+ /**
58
+ * Compare two sets of mod DB ids (old pack vs new pack).
59
+ * Returns: added mods, removed mods, updated mods (same modId, different version).
60
+ *
61
+ * oldIds: DB ids representing the old pack state
62
+ * newIds: DB ids representing the new pack state
63
+ */
64
+ export declare function computePackChangelog(oldIds: number[], newIds: number[]): Promise<object>;
65
+ /**
66
+ * Scan all mod JARs in the DB for duplicate data resource paths.
67
+ * When two mods ship the same data/ path, the last-loaded mod silently wins.
68
+ *
69
+ * dataType: filter to specific data sub-folder
70
+ * (recipe | loot_tables | advancements | tags | structures | all)
71
+ * mcVersion / loader: optional DB filters
72
+ * limit: max conflicts to return (default 300)
73
+ */
74
+ export declare function findDataConflicts(dataType?: string, mcVersion?: string, loader?: string, limit?: number): Promise<object>;
75
+ /**
76
+ * Build a composite knowledge graph of the entire modpack.
77
+ *
78
+ * Nodes: mods, mixin target classes, tags, KubeJS scripts, script categories
79
+ * Edges: depends_on, mixes_into, contributes_tag, tag_conflict, script_modifies, has_category
80
+ *
81
+ * @param mcVersion optional MC version filter
82
+ * @param loader optional loader filter
83
+ * @param scriptsDir optional path to kubejs/ directory to include script analysis
84
+ */
85
+ export declare function buildPackGraph(mcVersion?: string, loader?: string, scriptsDir?: string): Promise<object>;
86
+ /**
87
+ * Compare a modpack's config directory against default configs bundled in mod JARs.
88
+ *
89
+ * For each ingested mod, extracts default config files from the JAR
90
+ * (`defaultconfigs/` and `config/` prefixes) and compares against the
91
+ * on-disk pack config directory.
92
+ *
93
+ * Returns:
94
+ * - modified: files that exist in both the pack and a JAR default, but content differs
95
+ * - custom: files on disk that don't match any mod's JAR defaults
96
+ * - unchanged: files identical to the JAR default
97
+ *
98
+ * @param configDir absolute path to the modpack's config/ directory
99
+ * @param mcVersion optional MC version filter
100
+ * @param loader optional loader filter
101
+ */
102
+ export declare function diffPackConfigs(configDir: string, mcVersion?: string, loader?: string): Promise<object>;
103
+ /**
104
+ * One-shot modpack health overview.
105
+ * Aggregates key metrics in a single call to give agents a fast starting point:
106
+ * - mod count, loader/MC version breakdown
107
+ * - missing dependency count
108
+ * - mixin hotspot count (classes targeted by 3+ mods)
109
+ * - asset/data conflict counts
110
+ * - sidedness breakdown (client_only / server_only / common)
111
+ */
112
+ export declare function packHealth(mcVersion?: string, loader?: string): Promise<object>;
113
+ //# sourceMappingURL=packtools.d.ts.map