@microwiseai/snapshot 0.3.6 → 0.3.27

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 (312) hide show
  1. package/dist/commands/install.d.ts +13 -0
  2. package/dist/commands/install.d.ts.map +1 -1
  3. package/dist/commands/install.js +526 -49
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/license.d.ts +21 -0
  6. package/dist/commands/license.d.ts.map +1 -0
  7. package/dist/commands/license.js +120 -0
  8. package/dist/commands/license.js.map +1 -0
  9. package/dist/index.js +46 -6
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/config.d.ts +32 -0
  12. package/dist/lib/config.d.ts.map +1 -1
  13. package/dist/lib/config.js +89 -0
  14. package/dist/lib/config.js.map +1 -1
  15. package/dist/lib/gitlab.d.ts +26 -20
  16. package/dist/lib/gitlab.d.ts.map +1 -1
  17. package/dist/lib/gitlab.js +100 -153
  18. package/dist/lib/gitlab.js.map +1 -1
  19. package/dist/lib/package-resolver.d.ts +48 -0
  20. package/dist/lib/package-resolver.d.ts.map +1 -0
  21. package/dist/lib/package-resolver.js +178 -0
  22. package/dist/lib/package-resolver.js.map +1 -0
  23. package/dist/lib/skit-adapter.d.ts +56 -0
  24. package/dist/lib/skit-adapter.d.ts.map +1 -0
  25. package/dist/lib/skit-adapter.js +166 -0
  26. package/dist/lib/skit-adapter.js.map +1 -0
  27. package/dist/lib/transitive-resolver.d.ts +86 -0
  28. package/dist/lib/transitive-resolver.d.ts.map +1 -0
  29. package/dist/lib/transitive-resolver.js +431 -0
  30. package/dist/lib/transitive-resolver.js.map +1 -0
  31. package/dist/lib/types.d.ts +6 -0
  32. package/dist/lib/types.d.ts.map +1 -1
  33. package/dist/lib.d.ts +59 -0
  34. package/dist/lib.d.ts.map +1 -0
  35. package/dist/lib.js +134 -0
  36. package/dist/lib.js.map +1 -0
  37. package/dist/tools/snapshot-to-license.d.ts +13 -0
  38. package/dist/tools/snapshot-to-license.d.ts.map +1 -0
  39. package/dist/tools/snapshot-to-license.js +105 -0
  40. package/dist/tools/snapshot-to-license.js.map +1 -0
  41. package/node_modules/@microwiseai/cache/README.md +143 -0
  42. package/node_modules/@microwiseai/cache/dist/file.d.ts +97 -0
  43. package/node_modules/@microwiseai/cache/dist/file.d.ts.map +1 -0
  44. package/node_modules/@microwiseai/cache/dist/file.js +256 -0
  45. package/node_modules/@microwiseai/cache/dist/file.js.map +1 -0
  46. package/node_modules/@microwiseai/cache/dist/index.d.ts +10 -0
  47. package/node_modules/@microwiseai/cache/dist/index.d.ts.map +1 -0
  48. package/node_modules/@microwiseai/cache/dist/index.js +11 -0
  49. package/node_modules/@microwiseai/cache/dist/index.js.map +1 -0
  50. package/node_modules/@microwiseai/cache/dist/memory.d.ts +69 -0
  51. package/node_modules/@microwiseai/cache/dist/memory.d.ts.map +1 -0
  52. package/node_modules/@microwiseai/cache/dist/memory.js +152 -0
  53. package/node_modules/@microwiseai/cache/dist/memory.js.map +1 -0
  54. package/node_modules/@microwiseai/cache/dist/types.d.ts +76 -0
  55. package/node_modules/@microwiseai/cache/dist/types.d.ts.map +1 -0
  56. package/node_modules/@microwiseai/cache/dist/types.js +5 -0
  57. package/node_modules/@microwiseai/cache/dist/types.js.map +1 -0
  58. package/node_modules/@microwiseai/cache/package.json +40 -0
  59. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.d.ts +7 -0
  60. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.d.ts.map +1 -0
  61. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.js +139 -0
  62. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/detector.test.js.map +1 -0
  63. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.d.ts +8 -0
  64. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.d.ts.map +1 -0
  65. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.js +195 -0
  66. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/reporter.test.js.map +1 -0
  67. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.d.ts +8 -0
  68. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.d.ts.map +1 -0
  69. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.js +97 -0
  70. package/node_modules/@microwiseai/import-telemetry/dist/__tests__/types.test.js.map +1 -0
  71. package/node_modules/@microwiseai/import-telemetry/dist/detector.d.ts +16 -0
  72. package/node_modules/@microwiseai/import-telemetry/dist/detector.d.ts.map +1 -0
  73. package/node_modules/@microwiseai/import-telemetry/dist/detector.js +103 -0
  74. package/node_modules/@microwiseai/import-telemetry/dist/detector.js.map +1 -0
  75. package/node_modules/@microwiseai/import-telemetry/dist/index.d.ts +48 -0
  76. package/node_modules/@microwiseai/import-telemetry/dist/index.d.ts.map +1 -0
  77. package/node_modules/@microwiseai/import-telemetry/dist/index.js +56 -0
  78. package/node_modules/@microwiseai/import-telemetry/dist/index.js.map +1 -0
  79. package/node_modules/@microwiseai/import-telemetry/dist/reporter.d.ts +16 -0
  80. package/node_modules/@microwiseai/import-telemetry/dist/reporter.d.ts.map +1 -0
  81. package/node_modules/@microwiseai/import-telemetry/dist/reporter.js +147 -0
  82. package/node_modules/@microwiseai/import-telemetry/dist/reporter.js.map +1 -0
  83. package/node_modules/@microwiseai/import-telemetry/dist/types.d.ts +75 -0
  84. package/node_modules/@microwiseai/import-telemetry/dist/types.d.ts.map +1 -0
  85. package/node_modules/@microwiseai/import-telemetry/dist/types.js +23 -0
  86. package/node_modules/@microwiseai/import-telemetry/dist/types.js.map +1 -0
  87. package/node_modules/@microwiseai/import-telemetry/package.json +40 -0
  88. package/node_modules/@microwiseai/license/README.md +157 -0
  89. package/node_modules/@microwiseai/license/dist/api/client.d.ts +37 -0
  90. package/node_modules/@microwiseai/license/dist/api/client.d.ts.map +1 -0
  91. package/node_modules/@microwiseai/license/dist/api/client.js +95 -0
  92. package/node_modules/@microwiseai/license/dist/api/client.js.map +1 -0
  93. package/node_modules/@microwiseai/license/dist/api/endpoints.d.ts +25 -0
  94. package/node_modules/@microwiseai/license/dist/api/endpoints.d.ts.map +1 -0
  95. package/node_modules/@microwiseai/license/dist/api/endpoints.js +101 -0
  96. package/node_modules/@microwiseai/license/dist/api/endpoints.js.map +1 -0
  97. package/node_modules/@microwiseai/license/dist/api/index.d.ts +7 -0
  98. package/node_modules/@microwiseai/license/dist/api/index.d.ts.map +1 -0
  99. package/node_modules/@microwiseai/license/dist/api/index.js +8 -0
  100. package/node_modules/@microwiseai/license/dist/api/index.js.map +1 -0
  101. package/node_modules/@microwiseai/license/dist/cache/file.d.ts +38 -0
  102. package/node_modules/@microwiseai/license/dist/cache/file.d.ts.map +1 -0
  103. package/node_modules/@microwiseai/license/dist/cache/file.js +140 -0
  104. package/node_modules/@microwiseai/license/dist/cache/file.js.map +1 -0
  105. package/node_modules/@microwiseai/license/dist/cache/index.d.ts +7 -0
  106. package/node_modules/@microwiseai/license/dist/cache/index.d.ts.map +1 -0
  107. package/node_modules/@microwiseai/license/dist/cache/index.js +10 -0
  108. package/node_modules/@microwiseai/license/dist/cache/index.js.map +1 -0
  109. package/node_modules/@microwiseai/license/dist/cache/memory.d.ts +35 -0
  110. package/node_modules/@microwiseai/license/dist/cache/memory.d.ts.map +1 -0
  111. package/node_modules/@microwiseai/license/dist/cache/memory.js +77 -0
  112. package/node_modules/@microwiseai/license/dist/cache/memory.js.map +1 -0
  113. package/node_modules/@microwiseai/license/dist/cache/offline.d.ts +29 -0
  114. package/node_modules/@microwiseai/license/dist/cache/offline.d.ts.map +1 -0
  115. package/node_modules/@microwiseai/license/dist/cache/offline.js +58 -0
  116. package/node_modules/@microwiseai/license/dist/cache/offline.js.map +1 -0
  117. package/node_modules/@microwiseai/license/dist/client.d.ts +42 -0
  118. package/node_modules/@microwiseai/license/dist/client.d.ts.map +1 -0
  119. package/node_modules/@microwiseai/license/dist/client.js +83 -0
  120. package/node_modules/@microwiseai/license/dist/client.js.map +1 -0
  121. package/node_modules/@microwiseai/license/dist/config.d.ts +27 -0
  122. package/node_modules/@microwiseai/license/dist/config.d.ts.map +1 -0
  123. package/node_modules/@microwiseai/license/dist/config.js +52 -0
  124. package/node_modules/@microwiseai/license/dist/config.js.map +1 -0
  125. package/node_modules/@microwiseai/license/dist/core/activate.d.ts +21 -0
  126. package/node_modules/@microwiseai/license/dist/core/activate.d.ts.map +1 -0
  127. package/node_modules/@microwiseai/license/dist/core/activate.js +72 -0
  128. package/node_modules/@microwiseai/license/dist/core/activate.js.map +1 -0
  129. package/node_modules/@microwiseai/license/dist/core/check.d.ts +19 -0
  130. package/node_modules/@microwiseai/license/dist/core/check.d.ts.map +1 -0
  131. package/node_modules/@microwiseai/license/dist/core/check.js +244 -0
  132. package/node_modules/@microwiseai/license/dist/core/check.js.map +1 -0
  133. package/node_modules/@microwiseai/license/dist/core/index.d.ts +7 -0
  134. package/node_modules/@microwiseai/license/dist/core/index.d.ts.map +1 -0
  135. package/node_modules/@microwiseai/license/dist/core/index.js +10 -0
  136. package/node_modules/@microwiseai/license/dist/core/index.js.map +1 -0
  137. package/node_modules/@microwiseai/license/dist/core/verify.d.ts +39 -0
  138. package/node_modules/@microwiseai/license/dist/core/verify.d.ts.map +1 -0
  139. package/node_modules/@microwiseai/license/dist/core/verify.js +188 -0
  140. package/node_modules/@microwiseai/license/dist/core/verify.js.map +1 -0
  141. package/node_modules/@microwiseai/license/dist/env.d.ts +33 -0
  142. package/node_modules/@microwiseai/license/dist/env.d.ts.map +1 -0
  143. package/node_modules/@microwiseai/license/dist/env.js +69 -0
  144. package/node_modules/@microwiseai/license/dist/env.js.map +1 -0
  145. package/node_modules/@microwiseai/license/dist/helpers/cache.d.ts +97 -0
  146. package/node_modules/@microwiseai/license/dist/helpers/cache.d.ts.map +1 -0
  147. package/node_modules/@microwiseai/license/dist/helpers/cache.js +198 -0
  148. package/node_modules/@microwiseai/license/dist/helpers/cache.js.map +1 -0
  149. package/node_modules/@microwiseai/license/dist/helpers/index.d.ts +7 -0
  150. package/node_modules/@microwiseai/license/dist/helpers/index.d.ts.map +1 -0
  151. package/node_modules/@microwiseai/license/dist/helpers/index.js +9 -0
  152. package/node_modules/@microwiseai/license/dist/helpers/index.js.map +1 -0
  153. package/node_modules/@microwiseai/license/dist/helpers/telemetry.d.ts +68 -0
  154. package/node_modules/@microwiseai/license/dist/helpers/telemetry.d.ts.map +1 -0
  155. package/node_modules/@microwiseai/license/dist/helpers/telemetry.js +119 -0
  156. package/node_modules/@microwiseai/license/dist/helpers/telemetry.js.map +1 -0
  157. package/node_modules/@microwiseai/license/dist/index.d.ts +34 -0
  158. package/node_modules/@microwiseai/license/dist/index.d.ts.map +1 -0
  159. package/node_modules/@microwiseai/license/dist/index.js +48 -0
  160. package/node_modules/@microwiseai/license/dist/index.js.map +1 -0
  161. package/node_modules/@microwiseai/license/dist/machine/id.d.ts +19 -0
  162. package/node_modules/@microwiseai/license/dist/machine/id.d.ts.map +1 -0
  163. package/node_modules/@microwiseai/license/dist/machine/id.js +83 -0
  164. package/node_modules/@microwiseai/license/dist/machine/id.js.map +1 -0
  165. package/node_modules/@microwiseai/license/dist/machine/index.d.ts +6 -0
  166. package/node_modules/@microwiseai/license/dist/machine/index.d.ts.map +1 -0
  167. package/node_modules/@microwiseai/license/dist/machine/index.js +6 -0
  168. package/node_modules/@microwiseai/license/dist/machine/index.js.map +1 -0
  169. package/node_modules/@microwiseai/license/dist/machine/instance.d.ts +23 -0
  170. package/node_modules/@microwiseai/license/dist/machine/instance.d.ts.map +1 -0
  171. package/node_modules/@microwiseai/license/dist/machine/instance.js +52 -0
  172. package/node_modules/@microwiseai/license/dist/machine/instance.js.map +1 -0
  173. package/node_modules/@microwiseai/license/dist/telemetry/index.d.ts +6 -0
  174. package/node_modules/@microwiseai/license/dist/telemetry/index.d.ts.map +1 -0
  175. package/node_modules/@microwiseai/license/dist/telemetry/index.js +6 -0
  176. package/node_modules/@microwiseai/license/dist/telemetry/index.js.map +1 -0
  177. package/node_modules/@microwiseai/license/dist/telemetry/manager.d.ts +53 -0
  178. package/node_modules/@microwiseai/license/dist/telemetry/manager.d.ts.map +1 -0
  179. package/node_modules/@microwiseai/license/dist/telemetry/manager.js +125 -0
  180. package/node_modules/@microwiseai/license/dist/telemetry/manager.js.map +1 -0
  181. package/node_modules/@microwiseai/license/dist/telemetry/payload.d.ts +17 -0
  182. package/node_modules/@microwiseai/license/dist/telemetry/payload.d.ts.map +1 -0
  183. package/node_modules/@microwiseai/license/dist/telemetry/payload.js +65 -0
  184. package/node_modules/@microwiseai/license/dist/telemetry/payload.js.map +1 -0
  185. package/node_modules/@microwiseai/license/dist/types/api.d.ts +120 -0
  186. package/node_modules/@microwiseai/license/dist/types/api.d.ts.map +1 -0
  187. package/node_modules/@microwiseai/license/dist/types/api.js +5 -0
  188. package/node_modules/@microwiseai/license/dist/types/api.js.map +1 -0
  189. package/node_modules/@microwiseai/license/dist/types/config.d.ts +80 -0
  190. package/node_modules/@microwiseai/license/dist/types/config.d.ts.map +1 -0
  191. package/node_modules/@microwiseai/license/dist/types/config.js +12 -0
  192. package/node_modules/@microwiseai/license/dist/types/config.js.map +1 -0
  193. package/node_modules/@microwiseai/license/dist/types/errors.d.ts +93 -0
  194. package/node_modules/@microwiseai/license/dist/types/errors.d.ts.map +1 -0
  195. package/node_modules/@microwiseai/license/dist/types/errors.js +144 -0
  196. package/node_modules/@microwiseai/license/dist/types/errors.js.map +1 -0
  197. package/node_modules/@microwiseai/license/dist/types/index.d.ts +10 -0
  198. package/node_modules/@microwiseai/license/dist/types/index.d.ts.map +1 -0
  199. package/node_modules/@microwiseai/license/dist/types/index.js +6 -0
  200. package/node_modules/@microwiseai/license/dist/types/index.js.map +1 -0
  201. package/node_modules/@microwiseai/license/dist/types/license.d.ts +113 -0
  202. package/node_modules/@microwiseai/license/dist/types/license.d.ts.map +1 -0
  203. package/node_modules/@microwiseai/license/dist/types/license.js +5 -0
  204. package/node_modules/@microwiseai/license/dist/types/license.js.map +1 -0
  205. package/node_modules/@microwiseai/license/dist/utils/date.d.ts +45 -0
  206. package/node_modules/@microwiseai/license/dist/utils/date.d.ts.map +1 -0
  207. package/node_modules/@microwiseai/license/dist/utils/date.js +95 -0
  208. package/node_modules/@microwiseai/license/dist/utils/date.js.map +1 -0
  209. package/node_modules/@microwiseai/license/dist/utils/env.d.ts +41 -0
  210. package/node_modules/@microwiseai/license/dist/utils/env.d.ts.map +1 -0
  211. package/node_modules/@microwiseai/license/dist/utils/env.js +80 -0
  212. package/node_modules/@microwiseai/license/dist/utils/env.js.map +1 -0
  213. package/node_modules/@microwiseai/license/dist/utils/index.d.ts +7 -0
  214. package/node_modules/@microwiseai/license/dist/utils/index.d.ts.map +1 -0
  215. package/node_modules/@microwiseai/license/dist/utils/index.js +7 -0
  216. package/node_modules/@microwiseai/license/dist/utils/index.js.map +1 -0
  217. package/node_modules/@microwiseai/license/dist/utils/mask.d.ts +27 -0
  218. package/node_modules/@microwiseai/license/dist/utils/mask.d.ts.map +1 -0
  219. package/node_modules/@microwiseai/license/dist/utils/mask.js +67 -0
  220. package/node_modules/@microwiseai/license/dist/utils/mask.js.map +1 -0
  221. package/node_modules/@microwiseai/license/package.json +52 -0
  222. package/node_modules/@microwiseai/license-types/README.md +84 -0
  223. package/node_modules/@microwiseai/license-types/dist/api.d.ts +120 -0
  224. package/node_modules/@microwiseai/license-types/dist/api.d.ts.map +1 -0
  225. package/node_modules/@microwiseai/license-types/dist/api.js +5 -0
  226. package/node_modules/@microwiseai/license-types/dist/api.js.map +1 -0
  227. package/node_modules/@microwiseai/license-types/dist/config.d.ts +80 -0
  228. package/node_modules/@microwiseai/license-types/dist/config.d.ts.map +1 -0
  229. package/node_modules/@microwiseai/license-types/dist/config.js +12 -0
  230. package/node_modules/@microwiseai/license-types/dist/config.js.map +1 -0
  231. package/node_modules/@microwiseai/license-types/dist/errors.d.ts +93 -0
  232. package/node_modules/@microwiseai/license-types/dist/errors.d.ts.map +1 -0
  233. package/node_modules/@microwiseai/license-types/dist/errors.js +144 -0
  234. package/node_modules/@microwiseai/license-types/dist/errors.js.map +1 -0
  235. package/node_modules/@microwiseai/license-types/dist/index.d.ts +10 -0
  236. package/node_modules/@microwiseai/license-types/dist/index.d.ts.map +1 -0
  237. package/node_modules/@microwiseai/license-types/dist/index.js +6 -0
  238. package/node_modules/@microwiseai/license-types/dist/index.js.map +1 -0
  239. package/node_modules/@microwiseai/license-types/dist/license.d.ts +113 -0
  240. package/node_modules/@microwiseai/license-types/dist/license.d.ts.map +1 -0
  241. package/node_modules/@microwiseai/license-types/dist/license.js +5 -0
  242. package/node_modules/@microwiseai/license-types/dist/license.js.map +1 -0
  243. package/node_modules/@microwiseai/license-types/package.json +38 -0
  244. package/node_modules/@microwiseai/license-utils/README.md +82 -0
  245. package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.d.ts +2 -0
  246. package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.d.ts.map +1 -0
  247. package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.js +124 -0
  248. package/node_modules/@microwiseai/license-utils/dist/__tests__/machine.test.js.map +1 -0
  249. package/node_modules/@microwiseai/license-utils/dist/index.d.ts +7 -0
  250. package/node_modules/@microwiseai/license-utils/dist/index.d.ts.map +1 -0
  251. package/node_modules/@microwiseai/license-utils/dist/index.js +15 -0
  252. package/node_modules/@microwiseai/license-utils/dist/index.js.map +1 -0
  253. package/node_modules/@microwiseai/license-utils/dist/machine/id.d.ts +19 -0
  254. package/node_modules/@microwiseai/license-utils/dist/machine/id.d.ts.map +1 -0
  255. package/node_modules/@microwiseai/license-utils/dist/machine/id.js +83 -0
  256. package/node_modules/@microwiseai/license-utils/dist/machine/id.js.map +1 -0
  257. package/node_modules/@microwiseai/license-utils/dist/machine/index.d.ts +6 -0
  258. package/node_modules/@microwiseai/license-utils/dist/machine/index.d.ts.map +1 -0
  259. package/node_modules/@microwiseai/license-utils/dist/machine/index.js +6 -0
  260. package/node_modules/@microwiseai/license-utils/dist/machine/index.js.map +1 -0
  261. package/node_modules/@microwiseai/license-utils/dist/machine/instance.d.ts +23 -0
  262. package/node_modules/@microwiseai/license-utils/dist/machine/instance.d.ts.map +1 -0
  263. package/node_modules/@microwiseai/license-utils/dist/machine/instance.js +52 -0
  264. package/node_modules/@microwiseai/license-utils/dist/machine/instance.js.map +1 -0
  265. package/node_modules/@microwiseai/license-utils/dist/utils/date.d.ts +45 -0
  266. package/node_modules/@microwiseai/license-utils/dist/utils/date.d.ts.map +1 -0
  267. package/node_modules/@microwiseai/license-utils/dist/utils/date.js +95 -0
  268. package/node_modules/@microwiseai/license-utils/dist/utils/date.js.map +1 -0
  269. package/node_modules/@microwiseai/license-utils/dist/utils/env.d.ts +16 -0
  270. package/node_modules/@microwiseai/license-utils/dist/utils/env.d.ts.map +1 -0
  271. package/node_modules/@microwiseai/license-utils/dist/utils/env.js +22 -0
  272. package/node_modules/@microwiseai/license-utils/dist/utils/env.js.map +1 -0
  273. package/node_modules/@microwiseai/license-utils/dist/utils/index.d.ts +7 -0
  274. package/node_modules/@microwiseai/license-utils/dist/utils/index.d.ts.map +1 -0
  275. package/node_modules/@microwiseai/license-utils/dist/utils/index.js +7 -0
  276. package/node_modules/@microwiseai/license-utils/dist/utils/index.js.map +1 -0
  277. package/node_modules/@microwiseai/license-utils/dist/utils/mask.d.ts +27 -0
  278. package/node_modules/@microwiseai/license-utils/dist/utils/mask.d.ts.map +1 -0
  279. package/node_modules/@microwiseai/license-utils/dist/utils/mask.js +67 -0
  280. package/node_modules/@microwiseai/license-utils/dist/utils/mask.js.map +1 -0
  281. package/node_modules/@microwiseai/license-utils/package.json +45 -0
  282. package/node_modules/@microwiseai/telemetry/README.md +86 -0
  283. package/node_modules/@microwiseai/telemetry/dist/index.d.ts +9 -0
  284. package/node_modules/@microwiseai/telemetry/dist/index.d.ts.map +1 -0
  285. package/node_modules/@microwiseai/telemetry/dist/index.js +10 -0
  286. package/node_modules/@microwiseai/telemetry/dist/index.js.map +1 -0
  287. package/node_modules/@microwiseai/telemetry/dist/manager.d.ts +71 -0
  288. package/node_modules/@microwiseai/telemetry/dist/manager.d.ts.map +1 -0
  289. package/node_modules/@microwiseai/telemetry/dist/manager.js +171 -0
  290. package/node_modules/@microwiseai/telemetry/dist/manager.js.map +1 -0
  291. package/node_modules/@microwiseai/telemetry/dist/payload.d.ts +13 -0
  292. package/node_modules/@microwiseai/telemetry/dist/payload.d.ts.map +1 -0
  293. package/node_modules/@microwiseai/telemetry/dist/payload.js +35 -0
  294. package/node_modules/@microwiseai/telemetry/dist/payload.js.map +1 -0
  295. package/node_modules/@microwiseai/telemetry/dist/types.d.ts +76 -0
  296. package/node_modules/@microwiseai/telemetry/dist/types.d.ts.map +1 -0
  297. package/node_modules/@microwiseai/telemetry/dist/types.js +13 -0
  298. package/node_modules/@microwiseai/telemetry/dist/types.js.map +1 -0
  299. package/node_modules/@microwiseai/telemetry/package.json +43 -0
  300. package/node_modules/chalk/license +9 -0
  301. package/node_modules/chalk/package.json +83 -0
  302. package/node_modules/chalk/readme.md +297 -0
  303. package/node_modules/chalk/source/index.d.ts +325 -0
  304. package/node_modules/chalk/source/index.js +225 -0
  305. package/node_modules/chalk/source/utilities.js +33 -0
  306. package/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  307. package/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  308. package/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  309. package/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
  310. package/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  311. package/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
  312. package/package.json +26 -2
@@ -1,21 +1,172 @@
1
1
  import chalk from 'chalk';
2
2
  import { execSync } from 'child_process';
3
+ import { writeFileSync, existsSync, readFileSync, unlinkSync } from 'fs';
4
+ import { homedir, platform, arch } from 'os';
5
+ import { join } from 'path';
3
6
  import { fetchSnapshotFromRepo, snapshotNameToRepoName } from '../lib/gitlab.js';
4
7
  import { saveCurrentSnapshot } from '../lib/snapshot.js';
5
- import { getGitlabToken } from '../lib/config.js';
8
+ import { getLicenseKey, REGISTRY_PROXY_URL, VENDOR_NAME, STORE_URL, PACKAGE_NAME, getIstCredentials, LICENSE_API_URL } from '../lib/config.js';
9
+ import { resolveSnapshotDependencies, detectPackageType } from '../lib/package-resolver.js';
10
+ import { resolveDepsFromLicenseAPI } from '../lib/transitive-resolver.js';
11
+ import { installSkitPackage } from '../lib/skit-adapter.js';
12
+ import { createLicenseClient, markLicenseChecked } from '@microwiseai/license';
13
+ // CLI version (from package.json)
14
+ const CLI_VERSION = '0.3.27';
15
+ /**
16
+ * Send install telemetry to license-api (fire and forget)
17
+ */
18
+ async function sendInstallTelemetry(data) {
19
+ try {
20
+ const telemetry = {
21
+ event: 'install',
22
+ ...data,
23
+ timestamp: new Date().toISOString(),
24
+ };
25
+ // Fire and forget - don't block on response
26
+ fetch(`${LICENSE_API_URL}/telemetry`, {
27
+ method: 'POST',
28
+ headers: { 'Content-Type': 'application/json' },
29
+ body: JSON.stringify({
30
+ machineId: data.userId || 'anonymous',
31
+ instanceName: data.package,
32
+ vendorName: VENDOR_NAME,
33
+ packageName: data.package,
34
+ packageVersion: data.version,
35
+ sdkVersion: data.cliVersion,
36
+ licenseStatus: data.success ? 'valid' : 'invalid',
37
+ licenseType: 'beta',
38
+ productId: 'snapshot-cli',
39
+ platform: data.platform,
40
+ nodeVersion: process.version,
41
+ // Custom fields in metadata
42
+ metadata: JSON.stringify(telemetry),
43
+ }),
44
+ }).catch(() => {
45
+ // Silently ignore telemetry errors
46
+ });
47
+ }
48
+ catch {
49
+ // Silently ignore telemetry errors
50
+ }
51
+ }
6
52
  // Default installers for backward compatibility
7
53
  const DEFAULT_INSTALLERS = {
54
+ 'glpkg': {
55
+ command: 'glpkg install {pkg}',
56
+ check: 'glpkg --version',
57
+ hint: 'npm install -g @glpkg/cli',
58
+ },
59
+ // Legacy alias for backward compatibility
8
60
  'gitlab-install': {
9
- command: 'gitlab-install add -g {pkg}',
10
- check: 'gitlab-install --version',
11
- hint: 'npm install -g @glpkg/installer',
61
+ command: 'glpkg install {pkg}',
62
+ check: 'glpkg --version',
63
+ hint: 'npm install -g @glpkg/cli (gitlab-install is deprecated, use glpkg)',
12
64
  },
13
65
  'skit': {
14
66
  command: 'skit install {pkg}',
15
67
  check: 'skit --version',
16
68
  hint: 'npm install -g @ist/skit',
17
69
  },
70
+ 'npm-proxy': {
71
+ command: 'npm install -g {pkg}',
72
+ check: 'npm --version',
73
+ hint: 'npm is required',
74
+ },
18
75
  };
76
+ /**
77
+ * Configure .npmrc for registry-proxy with session token
78
+ */
79
+ function configureNpmrcForProxy(scopes, licenseKey) {
80
+ const npmrcPath = join(homedir(), '.npmrc');
81
+ let originalContent = null;
82
+ // Backup existing .npmrc
83
+ if (existsSync(npmrcPath)) {
84
+ originalContent = readFileSync(npmrcPath, 'utf-8');
85
+ }
86
+ // Build new .npmrc content
87
+ const proxyHost = REGISTRY_PROXY_URL.replace('https://', '');
88
+ const lines = [];
89
+ // Keep existing content that's not related to our scopes
90
+ if (originalContent) {
91
+ const existingLines = originalContent.split('\n');
92
+ for (const line of existingLines) {
93
+ // Skip lines related to our scopes or proxy
94
+ const isOurScope = scopes.some(s => line.includes(`${s}:registry`));
95
+ const isProxyAuth = line.includes(proxyHost);
96
+ if (!isOurScope && !isProxyAuth && line.trim()) {
97
+ lines.push(line);
98
+ }
99
+ }
100
+ }
101
+ // Add proxy registry config for each scope
102
+ for (const scope of scopes) {
103
+ lines.push(`${scope}:registry=${REGISTRY_PROXY_URL}/`);
104
+ }
105
+ // Add auth token for proxy
106
+ lines.push(`//${proxyHost}/:_authToken=${licenseKey}`);
107
+ writeFileSync(npmrcPath, lines.join('\n') + '\n');
108
+ return { path: npmrcPath, content: originalContent };
109
+ }
110
+ /**
111
+ * Restore original .npmrc
112
+ */
113
+ function restoreNpmrc(backup) {
114
+ if (backup.content === null) {
115
+ // Original didn't exist, remove it
116
+ if (existsSync(backup.path)) {
117
+ unlinkSync(backup.path);
118
+ }
119
+ }
120
+ else {
121
+ // Restore original content
122
+ writeFileSync(backup.path, backup.content);
123
+ }
124
+ }
125
+ /**
126
+ * Configure .npmrc for registry-proxy WITHOUT auth token (anonymous access)
127
+ */
128
+ function configureNpmrcForProxyAnonymous(scopes) {
129
+ const npmrcPath = join(homedir(), '.npmrc');
130
+ let originalContent = null;
131
+ // Backup existing .npmrc
132
+ if (existsSync(npmrcPath)) {
133
+ originalContent = readFileSync(npmrcPath, 'utf-8');
134
+ }
135
+ // Build new .npmrc content
136
+ const proxyHost = REGISTRY_PROXY_URL.replace('https://', '');
137
+ const lines = [];
138
+ // Keep existing content that's not related to our scopes
139
+ if (originalContent) {
140
+ const existingLines = originalContent.split('\n');
141
+ for (const line of existingLines) {
142
+ // Skip lines related to our scopes or proxy
143
+ const isOurScope = scopes.some(s => line.includes(`${s}:registry`));
144
+ const isProxyAuth = line.includes(proxyHost);
145
+ if (!isOurScope && !isProxyAuth && line.trim()) {
146
+ lines.push(line);
147
+ }
148
+ }
149
+ }
150
+ // Add proxy registry config for each scope (NO auth token)
151
+ for (const scope of scopes) {
152
+ lines.push(`${scope}:registry=${REGISTRY_PROXY_URL}/`);
153
+ }
154
+ writeFileSync(npmrcPath, lines.join('\n') + '\n');
155
+ return { path: npmrcPath, content: originalContent };
156
+ }
157
+ /**
158
+ * Extract scopes from packages
159
+ */
160
+ function extractScopes(packages) {
161
+ const scopes = new Set();
162
+ for (const name of Object.keys(packages)) {
163
+ if (name.startsWith('@')) {
164
+ const scope = name.split('/')[0];
165
+ scopes.add(scope);
166
+ }
167
+ }
168
+ return Array.from(scopes);
169
+ }
19
170
  function commandExists(cmd) {
20
171
  try {
21
172
  const checkCmd = process.platform === 'win32'
@@ -37,17 +188,123 @@ function runCommand(command) {
37
188
  return false;
38
189
  }
39
190
  }
40
- async function installSnapshot(snapshot, depth = 0, parentInstallers = {}) {
191
+ /**
192
+ * PackageType을 installer 이름으로 변환
193
+ */
194
+ function packageTypeToInstaller(type, useProxy) {
195
+ switch (type) {
196
+ case 'skit':
197
+ return 'skit';
198
+ case 'npm':
199
+ return useProxy ? 'npm-proxy' : 'glpkg';
200
+ case 'generic':
201
+ default:
202
+ return 'glpkg';
203
+ }
204
+ }
205
+ /**
206
+ * Skit 패키지 설치 (lib 우선, CLI fallback)
207
+ * @ist/skit lib가 있으면 직접 호출, 없으면 CLI 사용
208
+ */
209
+ async function installSkitPackages(packages, snapshotName, indent) {
210
+ const result = { installed: [], failed: [] };
211
+ const packageEntries = Object.entries(packages);
212
+ if (packageEntries.length === 0) {
213
+ return result;
214
+ }
215
+ const total = packageEntries.length;
216
+ console.log('');
217
+ console.log(chalk.yellow(`${indent}=== ${snapshotName}: ${total} skits ===`));
218
+ // Install packages using skit-adapter
219
+ for (let i = 0; i < packageEntries.length; i++) {
220
+ const [name, version] = packageEntries[i];
221
+ const pkgSpec = `${name}@${version}`;
222
+ const progress = `[${i + 1}/${total}]`;
223
+ process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
224
+ try {
225
+ const installResult = await installSkitPackage(name, version);
226
+ if (installResult.success) {
227
+ console.log(chalk.green(' ✓'));
228
+ result.installed.push(pkgSpec);
229
+ }
230
+ else {
231
+ console.log(chalk.red(' ✗'));
232
+ if (installResult.error) {
233
+ console.log(chalk.gray(`${indent} ${installResult.error}`));
234
+ }
235
+ result.failed.push(pkgSpec);
236
+ }
237
+ }
238
+ catch (error) {
239
+ console.log(chalk.red(' ✗'));
240
+ const errMsg = error instanceof Error ? error.message : String(error);
241
+ console.log(chalk.gray(`${indent} ${errMsg}`));
242
+ result.failed.push(pkgSpec);
243
+ }
244
+ }
245
+ return result;
246
+ }
247
+ /**
248
+ * 타입별 패키지 설치 (non-skit)
249
+ */
250
+ async function installPackagesByType(packages, installerName, installers, snapshotName, indent, typeLabel) {
251
+ const result = { installed: [], failed: [] };
252
+ const packageEntries = Object.entries(packages);
253
+ if (packageEntries.length === 0) {
254
+ return result;
255
+ }
256
+ // Skit packages use dedicated function
257
+ if (installerName === 'skit') {
258
+ return installSkitPackages(packages, snapshotName, indent);
259
+ }
260
+ const installerConfig = installers[installerName] || DEFAULT_INSTALLERS[installerName];
261
+ if (!installerConfig) {
262
+ console.log(chalk.red(`${indent}Unknown installer: ${installerName}`));
263
+ result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
264
+ return result;
265
+ }
266
+ const total = packageEntries.length;
267
+ console.log('');
268
+ console.log(chalk.yellow(`${indent}=== ${snapshotName}: ${total} ${typeLabel} (${installerName}) ===`));
269
+ // Check if installer exists
270
+ const cmdName = installerConfig.check.split(' ')[0];
271
+ if (!commandExists(cmdName)) {
272
+ console.log(chalk.red(`${indent}${installerName} not found.`));
273
+ console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
274
+ result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
275
+ return result;
276
+ }
277
+ // Install packages
278
+ for (let i = 0; i < packageEntries.length; i++) {
279
+ const [name, version] = packageEntries[i];
280
+ const pkgSpec = `${name}@${version}`;
281
+ const progress = `[${i + 1}/${total}]`;
282
+ const command = installerConfig.command.replace('{pkg}', pkgSpec);
283
+ process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
284
+ if (runCommand(command)) {
285
+ console.log(chalk.green(' ✓'));
286
+ result.installed.push(pkgSpec);
287
+ }
288
+ else {
289
+ console.log(chalk.red(' ✗'));
290
+ result.failed.push(pkgSpec);
291
+ }
292
+ }
293
+ return result;
294
+ }
295
+ export async function installSnapshot(snapshot, depth = 0, parentInstallers = {}, options = {}) {
41
296
  const indent = ' '.repeat(depth);
42
297
  const result = {
43
298
  installed: [],
44
299
  failed: [],
45
300
  };
46
- // Merge installers: parent + current snapshot
47
- let installers = { ...parentInstallers };
301
+ // Merge installers: snapshot + parent (parent takes precedence for overrides like npm-proxy)
302
+ let installers = { ...DEFAULT_INSTALLERS };
48
303
  if (snapshot.installers) {
49
304
  installers = { ...installers, ...snapshot.installers };
50
305
  }
306
+ // Parent installers take precedence (for effectiveInstallers override)
307
+ installers = { ...installers, ...parentInstallers };
51
308
  // Handle extends - install base snapshot first
52
309
  if (snapshot.extends) {
53
310
  console.log('');
@@ -55,7 +312,7 @@ async function installSnapshot(snapshot, depth = 0, parentInstallers = {}) {
55
312
  try {
56
313
  const baseSnapshot = await fetchSnapshotFromRepo(snapshot.extends);
57
314
  console.log(chalk.gray(`${indent} Installing base snapshot...`));
58
- const baseResult = await installSnapshot(baseSnapshot, depth + 1, installers);
315
+ const baseResult = await installSnapshot(baseSnapshot, depth + 1, installers, options);
59
316
  result.installed.push(...baseResult.result.installed);
60
317
  result.failed.push(...baseResult.result.failed);
61
318
  // Update installers with any from base
@@ -81,12 +338,50 @@ async function installSnapshot(snapshot, depth = 0, parentInstallers = {}) {
81
338
  }
82
339
  }
83
340
  }
341
+ // ============================================================
342
+ // Auto-detect mode: 패키지 타입 자동 판별
343
+ // ============================================================
344
+ if (options.autoDetect && !snapshot.install) {
345
+ console.log(chalk.gray(`${indent} Auto-detecting package types...`));
346
+ const resolved = await resolveSnapshotDependencies(snapshot, { skipRegistry: true });
347
+ // skit 패키지 설치 (skit-adapter 사용: lib 우선, CLI fallback)
348
+ if (Object.keys(resolved.skit).length > 0) {
349
+ const skitResult = await installSkitPackages(resolved.skit, snapshot.name, indent);
350
+ result.installed.push(...skitResult.installed);
351
+ result.failed.push(...skitResult.failed);
352
+ }
353
+ // npm 패키지 설치 (proxy 사용 시 npm-proxy, 아니면 glpkg)
354
+ if (Object.keys(resolved.npm).length > 0) {
355
+ const npmInstaller = options.useProxy ? 'npm-proxy' : 'glpkg';
356
+ const npmResult = await installPackagesByType(resolved.npm, npmInstaller, installers, snapshot.name, indent, 'npm packages');
357
+ result.installed.push(...npmResult.installed);
358
+ result.failed.push(...npmResult.failed);
359
+ }
360
+ // generic 패키지 설치 (glpkg)
361
+ if (Object.keys(resolved.generic).length > 0) {
362
+ const genericInstaller = options.useProxy ? 'npm-proxy' : 'glpkg';
363
+ const genericResult = await installPackagesByType(resolved.generic, genericInstaller, installers, snapshot.name, indent, 'packages');
364
+ result.installed.push(...genericResult.installed);
365
+ result.failed.push(...genericResult.failed);
366
+ }
367
+ return { result, installers };
368
+ }
369
+ // ============================================================
370
+ // Legacy mode: 기존 방식 (하위호환)
371
+ // ============================================================
84
372
  // New structure: install block
85
373
  if (snapshot.install) {
86
374
  for (const [installerName, packages] of Object.entries(snapshot.install)) {
87
375
  const packageEntries = Object.entries(packages);
88
376
  if (packageEntries.length === 0)
89
377
  continue;
378
+ // Skit packages: use skit-adapter (lib 우선, CLI fallback)
379
+ if (installerName === 'skit') {
380
+ const skitResult = await installSkitPackages(packages, snapshot.name, indent);
381
+ result.installed.push(...skitResult.installed);
382
+ result.failed.push(...skitResult.failed);
383
+ continue;
384
+ }
90
385
  const installerConfig = installers[installerName] || DEFAULT_INSTALLERS[installerName];
91
386
  if (!installerConfig) {
92
387
  console.log(chalk.red(`${indent}Unknown installer: ${installerName}`));
@@ -122,16 +417,16 @@ async function installSnapshot(snapshot, depth = 0, parentInstallers = {}) {
122
417
  }
123
418
  }
124
419
  }
125
- // Legacy: packages (use gitlab-install)
420
+ // Legacy: packages (use glpkg)
126
421
  if (snapshot.packages && Object.keys(snapshot.packages).length > 0) {
127
422
  const packageEntries = Object.entries(snapshot.packages);
128
423
  const total = packageEntries.length;
129
- const installerConfig = installers['gitlab-install'] || DEFAULT_INSTALLERS['gitlab-install'];
424
+ const installerConfig = installers['glpkg'] || DEFAULT_INSTALLERS['glpkg'];
130
425
  console.log('');
131
426
  console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages ===`));
132
427
  const cmdName = installerConfig.check.split(' ')[0];
133
428
  if (!commandExists(cmdName)) {
134
- console.log(chalk.red(`${indent}gitlab-install not found.`));
429
+ console.log(chalk.red(`${indent}glpkg not found.`));
135
430
  console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
136
431
  result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
137
432
  }
@@ -153,36 +448,11 @@ async function installSnapshot(snapshot, depth = 0, parentInstallers = {}) {
153
448
  }
154
449
  }
155
450
  }
156
- // Legacy: skits (use skit)
451
+ // Legacy: skits (use skit-adapter: lib 우선, CLI fallback)
157
452
  if (snapshot.skits && Object.keys(snapshot.skits).length > 0) {
158
- const skitEntries = Object.entries(snapshot.skits);
159
- const total = skitEntries.length;
160
- const installerConfig = installers['skit'] || DEFAULT_INSTALLERS['skit'];
161
- console.log('');
162
- console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} skits ===`));
163
- const cmdName = installerConfig.check.split(' ')[0];
164
- if (!commandExists(cmdName)) {
165
- console.log(chalk.red(`${indent}skit not found.`));
166
- console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
167
- result.failed.push(...skitEntries.map(([n, v]) => `${n}@${v}`));
168
- }
169
- else {
170
- for (let i = 0; i < skitEntries.length; i++) {
171
- const [name, version] = skitEntries[i];
172
- const skitSpec = `${name}@${version}`;
173
- const progress = `[${i + 1}/${total}]`;
174
- const command = installerConfig.command.replace('{pkg}', skitSpec);
175
- process.stdout.write(`${indent}${chalk.blue(progress)} ${skitSpec}...`);
176
- if (runCommand(command)) {
177
- console.log(chalk.green(' ✓'));
178
- result.installed.push(skitSpec);
179
- }
180
- else {
181
- console.log(chalk.red(' ✗'));
182
- result.failed.push(skitSpec);
183
- }
184
- }
185
- }
453
+ const skitResult = await installSkitPackages(snapshot.skits, snapshot.name, indent);
454
+ result.installed.push(...skitResult.installed);
455
+ result.failed.push(...skitResult.failed);
186
456
  }
187
457
  return { result, installers };
188
458
  }
@@ -192,6 +462,43 @@ export async function installCommand(name) {
192
462
  ║ Snapshot Installer ║
193
463
  ╚══════════════════════════════════════════════════════════════╝
194
464
  `));
465
+ // ========== IST Login Check ==========
466
+ // Public packages (@ist/minimal, @ist/foundation) can be installed without login
467
+ const PUBLIC_PACKAGES = ['@ist/minimal', '@ist/foundation'];
468
+ const isPublicPackage = PUBLIC_PACKAGES.includes(name);
469
+ const istCredentials = getIstCredentials();
470
+ if (istCredentials?.userId) {
471
+ console.log(chalk.green('✓') + ' IST login verified');
472
+ }
473
+ else if (isPublicPackage) {
474
+ console.log(chalk.yellow('⚠') + ' No IST login - installing public package');
475
+ }
476
+ else {
477
+ console.log(chalk.red('⛔ IST login required for non-public packages'));
478
+ console.log(chalk.gray(' Run: ist auth login'));
479
+ console.log(chalk.gray(' Or install @ist/minimal first (no login required)'));
480
+ process.exit(1);
481
+ }
482
+ // ======================================
483
+ // ========== License Check ==========
484
+ const apiUrl = process.env.LICENSE_API_URL || 'https://license-api.sisung-kim1.workers.dev/api';
485
+ const license = createLicenseClient({
486
+ vendorName: VENDOR_NAME,
487
+ apiUrl,
488
+ cliCommand: 'snapshot license',
489
+ storeUrl: STORE_URL,
490
+ });
491
+ const licenseResult = await license.checkLicense();
492
+ if (licenseResult.valid) {
493
+ markLicenseChecked(PACKAGE_NAME);
494
+ console.log(chalk.green('✓') + ' License verified');
495
+ }
496
+ else {
497
+ // License invalid - try anonymous access (public packages will work via registry-proxy)
498
+ console.log(chalk.yellow('⚠') + ' No license - trying anonymous access...');
499
+ console.log(chalk.gray(' (Public packages will install without license)'));
500
+ }
501
+ // ====================================
195
502
  // Validate name
196
503
  let repoName;
197
504
  try {
@@ -208,16 +515,17 @@ export async function installCommand(name) {
208
515
  }
209
516
  console.log(chalk.gray(`Snapshot: ${name}`));
210
517
  console.log(chalk.gray(`Repo: ${repoName}`));
211
- // Check GitLab token
212
- const token = getGitlabToken();
213
- if (!token) {
214
- console.log(chalk.red('Error: GitLab token not found.'));
215
- console.log(chalk.yellow('Run: gitlab-config save <token>'));
216
- process.exit(1);
518
+ // Check auth: license key for registry-proxy
519
+ const licenseKey = getLicenseKey();
520
+ const useProxy = true; // Always use registry-proxy
521
+ if (licenseKey) {
522
+ console.log(chalk.green('✓') + ' Using registry-proxy with license key');
523
+ }
524
+ else {
525
+ console.log(chalk.yellow('⚠') + ' No license key - trying anonymous access');
217
526
  }
218
- console.log(chalk.green('✓') + ' GitLab token found');
219
527
  // Fetch snapshot
220
- console.log(chalk.gray('Fetching snapshot from GitLab...'));
528
+ console.log(chalk.gray('Fetching snapshot...'));
221
529
  let snapshot;
222
530
  try {
223
531
  snapshot = await fetchSnapshotFromRepo(name);
@@ -232,8 +540,162 @@ export async function installCommand(name) {
232
540
  if (snapshot.description) {
233
541
  console.log(chalk.gray(` ${snapshot.description}`));
234
542
  }
543
+ // ========== Resolve Dependencies via Registry Proxy API ==========
544
+ let apiResolvedDeps = null;
545
+ if (licenseKey && snapshot.registry && snapshot.install) {
546
+ // Extract scopes and first groupId from snapshot.registry
547
+ const scopes = [];
548
+ let groupId = null;
549
+ for (const [scope, config] of Object.entries(snapshot.registry)) {
550
+ const normalizedScope = scope.startsWith('@') ? scope : `@${scope}`;
551
+ scopes.push(normalizedScope);
552
+ if (config.group && !groupId) {
553
+ groupId = config.group;
554
+ }
555
+ }
556
+ // Extract packages from snapshot.install (all installers)
557
+ const packages = [];
558
+ for (const pkgs of Object.values(snapshot.install)) {
559
+ for (const [name, version] of Object.entries(pkgs)) {
560
+ packages.push(`${name}@${version}`);
561
+ }
562
+ }
563
+ if (packages.length > 0 && groupId && scopes.length > 0) {
564
+ console.log(chalk.gray('Resolving dependencies via Registry Proxy API...'));
565
+ try {
566
+ apiResolvedDeps = await resolveDepsFromLicenseAPI({
567
+ packages,
568
+ groupId,
569
+ scopes,
570
+ includePeer: true,
571
+ });
572
+ const depCount = Object.keys(apiResolvedDeps.dependencies).length;
573
+ const peerCount = Object.keys(apiResolvedDeps.peerDependencies || {}).length;
574
+ console.log(chalk.green('✓') + ` Resolved ${depCount} dependencies, ${peerCount} peer dependencies`);
575
+ }
576
+ catch (error) {
577
+ const errMsg = error instanceof Error ? error.message : String(error);
578
+ console.log(chalk.yellow('⚠') + ` Registry Proxy API resolve failed: ${errMsg}`);
579
+ console.log(chalk.gray(' Falling back to local dependency resolution...'));
580
+ }
581
+ }
582
+ }
583
+ // ================================================================
584
+ // ========== Snapshot Access Check ==========
585
+ if (snapshot.access && typeof snapshot.access === 'object' && snapshot.access.type === 'licensed') {
586
+ const productId = snapshot.access.productId;
587
+ const accessResult = await license.checkLicense({ productId });
588
+ if (!accessResult.valid) {
589
+ console.log('');
590
+ console.log(chalk.red('⛔ This snapshot requires a license'));
591
+ console.log(chalk.gray(` Product: ${productId}`));
592
+ console.log(chalk.gray(` Activate: snapshot license activate <KEY>`));
593
+ process.exit(1);
594
+ }
595
+ console.log(chalk.green('✓') + ` License verified for ${productId}`);
596
+ }
597
+ // access가 없거나 'public'이면 그냥 통과
598
+ // ============================================
599
+ // Collect all packages to determine scopes
600
+ const allPackages = {
601
+ ...(snapshot.packages || {}),
602
+ };
603
+ if (snapshot.install) {
604
+ for (const pkgs of Object.values(snapshot.install)) {
605
+ Object.assign(allPackages, pkgs);
606
+ }
607
+ }
608
+ // Configure .npmrc for proxy (with or without auth token)
609
+ let npmrcBackup = null;
610
+ if (useProxy) {
611
+ const scopes = extractScopes(allPackages);
612
+ if (scopes.length > 0) {
613
+ if (licenseKey) {
614
+ console.log(chalk.gray(`Configuring registry-proxy for scopes: ${scopes.join(', ')}`));
615
+ npmrcBackup = configureNpmrcForProxy(scopes, licenseKey);
616
+ }
617
+ else {
618
+ // Anonymous mode - configure proxy without auth token
619
+ console.log(chalk.gray(`Configuring registry-proxy (anonymous) for scopes: ${scopes.join(', ')}`));
620
+ npmrcBackup = configureNpmrcForProxyAnonymous(scopes);
621
+ }
622
+ }
623
+ }
624
+ // Determine which installers to use
625
+ const effectiveInstallers = { ...DEFAULT_INSTALLERS };
626
+ if (useProxy) {
627
+ // When using proxy, override glpkg with npm-proxy
628
+ effectiveInstallers['glpkg'] = DEFAULT_INSTALLERS['npm-proxy'];
629
+ effectiveInstallers['gitlab-install'] = DEFAULT_INSTALLERS['npm-proxy'];
630
+ }
235
631
  // Install (handles extends recursively)
236
- const { result } = await installSnapshot(snapshot, 0, DEFAULT_INSTALLERS);
632
+ let installError = null;
633
+ let result = { installed: [], failed: [] };
634
+ try {
635
+ // API 결과가 있으면 snapshot.install 구성
636
+ let effectiveSnapshot = snapshot;
637
+ if (apiResolvedDeps) {
638
+ // API 결과를 타입별로 분류
639
+ const allDeps = {
640
+ ...apiResolvedDeps.dependencies,
641
+ ...(apiResolvedDeps.peerDependencies || {}),
642
+ };
643
+ const classified = {
644
+ skit: {},
645
+ npm: {},
646
+ generic: {},
647
+ };
648
+ // 병렬로 타입 판별
649
+ const entries = Object.entries(allDeps);
650
+ const types = await Promise.all(entries.map(([name]) => detectPackageType(name, { skipRegistry: true })));
651
+ for (let i = 0; i < entries.length; i++) {
652
+ const [name, version] = entries[i];
653
+ const type = types[i];
654
+ classified[type][name] = version;
655
+ }
656
+ // snapshot.install 구성
657
+ const newInstall = {};
658
+ if (Object.keys(classified.skit).length > 0) {
659
+ newInstall['skit'] = classified.skit;
660
+ }
661
+ if (Object.keys(classified.npm).length > 0) {
662
+ newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = classified.npm;
663
+ }
664
+ if (Object.keys(classified.generic).length > 0) {
665
+ newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = {
666
+ ...(newInstall[useProxy ? 'npm-proxy' : 'glpkg'] || {}),
667
+ ...classified.generic,
668
+ };
669
+ }
670
+ // 기존 snapshot 복사 후 install 오버라이드
671
+ effectiveSnapshot = {
672
+ ...snapshot,
673
+ install: newInstall,
674
+ };
675
+ console.log(chalk.gray(` skit: ${Object.keys(classified.skit).length}, npm: ${Object.keys(classified.npm).length}, generic: ${Object.keys(classified.generic).length}`));
676
+ }
677
+ // Auto-detect 모드: snapshot.install이 없으면 자동 판별 (API 실패 시 fallback)
678
+ const autoDetect = !effectiveSnapshot.install;
679
+ const installResult = await installSnapshot(effectiveSnapshot, 0, effectiveInstallers, {
680
+ useProxy,
681
+ autoDetect,
682
+ });
683
+ result = installResult.result;
684
+ }
685
+ catch (err) {
686
+ installError = err instanceof Error ? err : new Error(String(err));
687
+ }
688
+ finally {
689
+ // Restore .npmrc
690
+ if (npmrcBackup) {
691
+ restoreNpmrc(npmrcBackup);
692
+ console.log(chalk.gray('Restored .npmrc'));
693
+ }
694
+ }
695
+ if (installError) {
696
+ console.log(chalk.red(`Error during installation: ${installError.message}`));
697
+ process.exit(1);
698
+ }
237
699
  // Summary
238
700
  console.log('');
239
701
  console.log(chalk.yellow('═══════════════════════════════════'));
@@ -259,6 +721,21 @@ export async function installCommand(name) {
259
721
  console.log('');
260
722
  console.log(chalk.green('✓') + ' Snapshot info saved');
261
723
  }
724
+ // Send telemetry (fire and forget)
725
+ sendInstallTelemetry({
726
+ package: snapshot.name,
727
+ version: snapshot.version,
728
+ success: result.failed.length === 0,
729
+ installedCount: result.installed.length,
730
+ failedCount: result.failed.length,
731
+ error: result.failed.length > 0 ? `Failed: ${result.failed.join(', ')}` : undefined,
732
+ userId: istCredentials?.userId,
733
+ userEmail: istCredentials?.email,
734
+ licenseKey: licenseKey ? licenseKey.substring(0, 9) : undefined,
735
+ platform: platform(),
736
+ arch: arch(),
737
+ cliVersion: CLI_VERSION,
738
+ });
262
739
  if (result.failed.length > 0) {
263
740
  process.exit(1);
264
741
  }