@microwiseai/snapshot 0.3.5 → 0.3.26

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 +621 -98
  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 +13 -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,16 +1,310 @@
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';
6
- async function installSnapshot(snapshot, depth = 0) {
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.25';
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
+ }
52
+ // Default installers for backward compatibility
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
60
+ 'gitlab-install': {
61
+ command: 'glpkg install {pkg}',
62
+ check: 'glpkg --version',
63
+ hint: 'npm install -g @glpkg/cli (gitlab-install is deprecated, use glpkg)',
64
+ },
65
+ 'skit': {
66
+ command: 'skit install {pkg}',
67
+ check: 'skit --version',
68
+ hint: 'npm install -g @ist/skit',
69
+ },
70
+ 'npm-proxy': {
71
+ command: 'npm install -g {pkg}',
72
+ check: 'npm --version',
73
+ hint: 'npm is required',
74
+ },
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
+ }
170
+ function commandExists(cmd) {
171
+ try {
172
+ const checkCmd = process.platform === 'win32'
173
+ ? `where ${cmd.split(' ')[0]}`
174
+ : `which ${cmd.split(' ')[0]}`;
175
+ execSync(checkCmd, { stdio: 'pipe' });
176
+ return true;
177
+ }
178
+ catch {
179
+ return false;
180
+ }
181
+ }
182
+ function runCommand(command) {
183
+ try {
184
+ execSync(command, { stdio: 'pipe', encoding: 'utf-8' });
185
+ return true;
186
+ }
187
+ catch {
188
+ return false;
189
+ }
190
+ }
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 = {}) {
7
296
  const indent = ' '.repeat(depth);
8
297
  const result = {
9
- packages: [],
10
- skits: [],
11
- failedPackages: [],
12
- failedSkits: [],
298
+ installed: [],
299
+ failed: [],
13
300
  };
301
+ // Merge installers: snapshot + parent (parent takes precedence for overrides like npm-proxy)
302
+ let installers = { ...DEFAULT_INSTALLERS };
303
+ if (snapshot.installers) {
304
+ installers = { ...installers, ...snapshot.installers };
305
+ }
306
+ // Parent installers take precedence (for effectiveInstallers override)
307
+ installers = { ...installers, ...parentInstallers };
14
308
  // Handle extends - install base snapshot first
15
309
  if (snapshot.extends) {
16
310
  console.log('');
@@ -18,11 +312,11 @@ async function installSnapshot(snapshot, depth = 0) {
18
312
  try {
19
313
  const baseSnapshot = await fetchSnapshotFromRepo(snapshot.extends);
20
314
  console.log(chalk.gray(`${indent} Installing base snapshot...`));
21
- const baseResult = await installSnapshot(baseSnapshot, depth + 1);
22
- result.packages.push(...baseResult.packages);
23
- result.skits.push(...baseResult.skits);
24
- result.failedPackages.push(...baseResult.failedPackages);
25
- result.failedSkits.push(...baseResult.failedSkits);
315
+ const baseResult = await installSnapshot(baseSnapshot, depth + 1, installers, options);
316
+ result.installed.push(...baseResult.result.installed);
317
+ result.failed.push(...baseResult.result.failed);
318
+ // Update installers with any from base
319
+ installers = { ...installers, ...baseResult.installers };
26
320
  }
27
321
  catch (error) {
28
322
  const errMsg = error instanceof Error ? error.message : String(error);
@@ -44,71 +338,123 @@ async function installSnapshot(snapshot, depth = 0) {
44
338
  }
45
339
  }
46
340
  }
47
- const packages = snapshot.packages || {};
48
- const skits = snapshot.skits || {};
49
- const packageEntries = Object.entries(packages);
50
- const skitEntries = Object.entries(skits);
51
- // Install npm packages
52
- if (packageEntries.length > 0) {
53
- const total = packageEntries.length;
54
- console.log('');
55
- console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages ===`));
56
- for (let i = 0; i < packageEntries.length; i++) {
57
- const [name, version] = packageEntries[i];
58
- const pkgSpec = `${name}@${version}`;
59
- const progress = `[${i + 1}/${total}]`;
60
- process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
61
- try {
62
- execSync(`gitlab-install add -g ${pkgSpec}`, {
63
- stdio: 'pipe',
64
- encoding: 'utf-8',
65
- });
66
- console.log(chalk.green(' ✓'));
67
- result.packages.push(pkgSpec);
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
+ // ============================================================
372
+ // New structure: install block
373
+ if (snapshot.install) {
374
+ for (const [installerName, packages] of Object.entries(snapshot.install)) {
375
+ const packageEntries = Object.entries(packages);
376
+ if (packageEntries.length === 0)
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;
68
384
  }
69
- catch {
70
- console.log(chalk.red(' ✗'));
71
- result.failedPackages.push(pkgSpec);
385
+ const installerConfig = installers[installerName] || DEFAULT_INSTALLERS[installerName];
386
+ if (!installerConfig) {
387
+ console.log(chalk.red(`${indent}Unknown installer: ${installerName}`));
388
+ result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
389
+ continue;
390
+ }
391
+ const total = packageEntries.length;
392
+ console.log('');
393
+ console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages (${installerName}) ===`));
394
+ // Check if installer exists
395
+ const cmdName = installerConfig.check.split(' ')[0];
396
+ if (!commandExists(cmdName)) {
397
+ console.log(chalk.red(`${indent}${installerName} not found.`));
398
+ console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
399
+ result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
400
+ continue;
401
+ }
402
+ // Install packages
403
+ for (let i = 0; i < packageEntries.length; i++) {
404
+ const [name, version] = packageEntries[i];
405
+ const pkgSpec = `${name}@${version}`;
406
+ const progress = `[${i + 1}/${total}]`;
407
+ const command = installerConfig.command.replace('{pkg}', pkgSpec);
408
+ process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
409
+ if (runCommand(command)) {
410
+ console.log(chalk.green(' ✓'));
411
+ result.installed.push(pkgSpec);
412
+ }
413
+ else {
414
+ console.log(chalk.red(' ✗'));
415
+ result.failed.push(pkgSpec);
416
+ }
72
417
  }
73
418
  }
74
419
  }
75
- // Install skits
76
- if (skitEntries.length > 0) {
77
- const total = skitEntries.length;
420
+ // Legacy: packages (use glpkg)
421
+ if (snapshot.packages && Object.keys(snapshot.packages).length > 0) {
422
+ const packageEntries = Object.entries(snapshot.packages);
423
+ const total = packageEntries.length;
424
+ const installerConfig = installers['glpkg'] || DEFAULT_INSTALLERS['glpkg'];
78
425
  console.log('');
79
- console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} skits ===`));
80
- // Check if skit command exists
81
- let skitAvailable = true;
82
- try {
83
- execSync('which skit', { stdio: 'pipe' });
84
- }
85
- catch {
86
- console.log(chalk.red(`${indent}skit command not found.`));
87
- skitAvailable = false;
88
- result.failedSkits.push(...skitEntries.map(([n, v]) => `${n}@${v}`));
426
+ console.log(chalk.yellow(`${indent}=== ${snapshot.name}: ${total} packages ===`));
427
+ const cmdName = installerConfig.check.split(' ')[0];
428
+ if (!commandExists(cmdName)) {
429
+ console.log(chalk.red(`${indent}glpkg not found.`));
430
+ console.log(chalk.yellow(`${indent}Install: ${installerConfig.hint}`));
431
+ result.failed.push(...packageEntries.map(([n, v]) => `${n}@${v}`));
89
432
  }
90
- if (skitAvailable) {
91
- for (let i = 0; i < skitEntries.length; i++) {
92
- const [name, version] = skitEntries[i];
93
- const skitSpec = `${name}@${version}`;
433
+ else {
434
+ for (let i = 0; i < packageEntries.length; i++) {
435
+ const [name, version] = packageEntries[i];
436
+ const pkgSpec = `${name}@${version}`;
94
437
  const progress = `[${i + 1}/${total}]`;
95
- process.stdout.write(`${indent}${chalk.blue(progress)} ${skitSpec}...`);
96
- try {
97
- execSync(`skit add ${skitSpec}`, {
98
- stdio: 'pipe',
99
- encoding: 'utf-8',
100
- });
438
+ const command = installerConfig.command.replace('{pkg}', pkgSpec);
439
+ process.stdout.write(`${indent}${chalk.blue(progress)} ${pkgSpec}...`);
440
+ if (runCommand(command)) {
101
441
  console.log(chalk.green(' ✓'));
102
- result.skits.push(skitSpec);
442
+ result.installed.push(pkgSpec);
103
443
  }
104
- catch {
444
+ else {
105
445
  console.log(chalk.red(' ✗'));
106
- result.failedSkits.push(skitSpec);
446
+ result.failed.push(pkgSpec);
107
447
  }
108
448
  }
109
449
  }
110
450
  }
111
- return result;
451
+ // Legacy: skits (use skit-adapter: lib 우선, CLI fallback)
452
+ if (snapshot.skits && Object.keys(snapshot.skits).length > 0) {
453
+ const skitResult = await installSkitPackages(snapshot.skits, snapshot.name, indent);
454
+ result.installed.push(...skitResult.installed);
455
+ result.failed.push(...skitResult.failed);
456
+ }
457
+ return { result, installers };
112
458
  }
113
459
  export async function installCommand(name) {
114
460
  console.log(chalk.blue.bold(`
@@ -116,6 +462,34 @@ export async function installCommand(name) {
116
462
  ║ Snapshot Installer ║
117
463
  ╚══════════════════════════════════════════════════════════════╝
118
464
  `));
465
+ // ========== IST Login Check ==========
466
+ const istCredentials = getIstCredentials();
467
+ if (!istCredentials?.userId) {
468
+ console.log(chalk.red('⛔ IST login required'));
469
+ console.log(chalk.gray(' Run: ist auth login'));
470
+ process.exit(1);
471
+ }
472
+ console.log(chalk.green('✓') + ' IST login verified');
473
+ // ======================================
474
+ // ========== License Check ==========
475
+ const apiUrl = process.env.LICENSE_API_URL || 'https://license-api.sisung-kim1.workers.dev/api';
476
+ const license = createLicenseClient({
477
+ vendorName: VENDOR_NAME,
478
+ apiUrl,
479
+ cliCommand: 'snapshot license',
480
+ storeUrl: STORE_URL,
481
+ });
482
+ const licenseResult = await license.checkLicense();
483
+ if (licenseResult.valid) {
484
+ markLicenseChecked(PACKAGE_NAME);
485
+ console.log(chalk.green('✓') + ' License verified');
486
+ }
487
+ else {
488
+ // License invalid - try anonymous access (public packages will work via registry-proxy)
489
+ console.log(chalk.yellow('⚠') + ' No license - trying anonymous access...');
490
+ console.log(chalk.gray(' (Public packages will install without license)'));
491
+ }
492
+ // ====================================
119
493
  // Validate name
120
494
  let repoName;
121
495
  try {
@@ -132,27 +506,17 @@ export async function installCommand(name) {
132
506
  }
133
507
  console.log(chalk.gray(`Snapshot: ${name}`));
134
508
  console.log(chalk.gray(`Repo: ${repoName}`));
135
- // Check GitLab token
136
- const token = getGitlabToken();
137
- if (!token) {
138
- console.log(chalk.red('Error: GitLab token not found.'));
139
- console.log(chalk.yellow('Run: gitlab-config save <token>'));
140
- process.exit(1);
141
- }
142
- console.log(chalk.green('✓') + ' GitLab token found');
143
- // Check gitlab-install (cross-platform)
144
- try {
145
- const whichCmd = process.platform === 'win32' ? 'where gitlab-install' : 'which gitlab-install';
146
- execSync(whichCmd, { stdio: 'pipe' });
509
+ // Check auth: license key for registry-proxy
510
+ const licenseKey = getLicenseKey();
511
+ const useProxy = true; // Always use registry-proxy
512
+ if (licenseKey) {
513
+ console.log(chalk.green('✓') + ' Using registry-proxy with license key');
147
514
  }
148
- catch {
149
- console.log(chalk.red('Error: gitlab-install not found.'));
150
- console.log(chalk.yellow('Install: npm install -g @glpkg/installer'));
151
- process.exit(1);
515
+ else {
516
+ console.log(chalk.yellow('⚠') + ' No license key - trying anonymous access');
152
517
  }
153
- console.log(chalk.green('✓') + ' gitlab-install available');
154
518
  // Fetch snapshot
155
- console.log(chalk.gray('Fetching snapshot from GitLab...'));
519
+ console.log(chalk.gray('Fetching snapshot...'));
156
520
  let snapshot;
157
521
  try {
158
522
  snapshot = await fetchSnapshotFromRepo(name);
@@ -167,44 +531,203 @@ export async function installCommand(name) {
167
531
  if (snapshot.description) {
168
532
  console.log(chalk.gray(` ${snapshot.description}`));
169
533
  }
534
+ // ========== Resolve Dependencies via Registry Proxy API ==========
535
+ let apiResolvedDeps = null;
536
+ if (licenseKey && snapshot.registry && snapshot.install) {
537
+ // Extract scopes and first groupId from snapshot.registry
538
+ const scopes = [];
539
+ let groupId = null;
540
+ for (const [scope, config] of Object.entries(snapshot.registry)) {
541
+ const normalizedScope = scope.startsWith('@') ? scope : `@${scope}`;
542
+ scopes.push(normalizedScope);
543
+ if (config.group && !groupId) {
544
+ groupId = config.group;
545
+ }
546
+ }
547
+ // Extract packages from snapshot.install (all installers)
548
+ const packages = [];
549
+ for (const pkgs of Object.values(snapshot.install)) {
550
+ for (const [name, version] of Object.entries(pkgs)) {
551
+ packages.push(`${name}@${version}`);
552
+ }
553
+ }
554
+ if (packages.length > 0 && groupId && scopes.length > 0) {
555
+ console.log(chalk.gray('Resolving dependencies via Registry Proxy API...'));
556
+ try {
557
+ apiResolvedDeps = await resolveDepsFromLicenseAPI({
558
+ packages,
559
+ groupId,
560
+ scopes,
561
+ includePeer: true,
562
+ });
563
+ const depCount = Object.keys(apiResolvedDeps.dependencies).length;
564
+ const peerCount = Object.keys(apiResolvedDeps.peerDependencies || {}).length;
565
+ console.log(chalk.green('✓') + ` Resolved ${depCount} dependencies, ${peerCount} peer dependencies`);
566
+ }
567
+ catch (error) {
568
+ const errMsg = error instanceof Error ? error.message : String(error);
569
+ console.log(chalk.yellow('⚠') + ` Registry Proxy API resolve failed: ${errMsg}`);
570
+ console.log(chalk.gray(' Falling back to local dependency resolution...'));
571
+ }
572
+ }
573
+ }
574
+ // ================================================================
575
+ // ========== Snapshot Access Check ==========
576
+ if (snapshot.access && typeof snapshot.access === 'object' && snapshot.access.type === 'licensed') {
577
+ const productId = snapshot.access.productId;
578
+ const accessResult = await license.checkLicense({ productId });
579
+ if (!accessResult.valid) {
580
+ console.log('');
581
+ console.log(chalk.red('⛔ This snapshot requires a license'));
582
+ console.log(chalk.gray(` Product: ${productId}`));
583
+ console.log(chalk.gray(` Activate: snapshot license activate <KEY>`));
584
+ process.exit(1);
585
+ }
586
+ console.log(chalk.green('✓') + ` License verified for ${productId}`);
587
+ }
588
+ // access가 없거나 'public'이면 그냥 통과
589
+ // ============================================
590
+ // Collect all packages to determine scopes
591
+ const allPackages = {
592
+ ...(snapshot.packages || {}),
593
+ };
594
+ if (snapshot.install) {
595
+ for (const pkgs of Object.values(snapshot.install)) {
596
+ Object.assign(allPackages, pkgs);
597
+ }
598
+ }
599
+ // Configure .npmrc for proxy (with or without auth token)
600
+ let npmrcBackup = null;
601
+ if (useProxy) {
602
+ const scopes = extractScopes(allPackages);
603
+ if (scopes.length > 0) {
604
+ if (licenseKey) {
605
+ console.log(chalk.gray(`Configuring registry-proxy for scopes: ${scopes.join(', ')}`));
606
+ npmrcBackup = configureNpmrcForProxy(scopes, licenseKey);
607
+ }
608
+ else {
609
+ // Anonymous mode - configure proxy without auth token
610
+ console.log(chalk.gray(`Configuring registry-proxy (anonymous) for scopes: ${scopes.join(', ')}`));
611
+ npmrcBackup = configureNpmrcForProxyAnonymous(scopes);
612
+ }
613
+ }
614
+ }
615
+ // Determine which installers to use
616
+ const effectiveInstallers = { ...DEFAULT_INSTALLERS };
617
+ if (useProxy) {
618
+ // When using proxy, override glpkg with npm-proxy
619
+ effectiveInstallers['glpkg'] = DEFAULT_INSTALLERS['npm-proxy'];
620
+ effectiveInstallers['gitlab-install'] = DEFAULT_INSTALLERS['npm-proxy'];
621
+ }
170
622
  // Install (handles extends recursively)
171
- const result = await installSnapshot(snapshot, 0);
623
+ let installError = null;
624
+ let result = { installed: [], failed: [] };
625
+ try {
626
+ // API 결과가 있으면 snapshot.install 구성
627
+ let effectiveSnapshot = snapshot;
628
+ if (apiResolvedDeps) {
629
+ // API 결과를 타입별로 분류
630
+ const allDeps = {
631
+ ...apiResolvedDeps.dependencies,
632
+ ...(apiResolvedDeps.peerDependencies || {}),
633
+ };
634
+ const classified = {
635
+ skit: {},
636
+ npm: {},
637
+ generic: {},
638
+ };
639
+ // 병렬로 타입 판별
640
+ const entries = Object.entries(allDeps);
641
+ const types = await Promise.all(entries.map(([name]) => detectPackageType(name, { skipRegistry: true })));
642
+ for (let i = 0; i < entries.length; i++) {
643
+ const [name, version] = entries[i];
644
+ const type = types[i];
645
+ classified[type][name] = version;
646
+ }
647
+ // snapshot.install 구성
648
+ const newInstall = {};
649
+ if (Object.keys(classified.skit).length > 0) {
650
+ newInstall['skit'] = classified.skit;
651
+ }
652
+ if (Object.keys(classified.npm).length > 0) {
653
+ newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = classified.npm;
654
+ }
655
+ if (Object.keys(classified.generic).length > 0) {
656
+ newInstall[useProxy ? 'npm-proxy' : 'glpkg'] = {
657
+ ...(newInstall[useProxy ? 'npm-proxy' : 'glpkg'] || {}),
658
+ ...classified.generic,
659
+ };
660
+ }
661
+ // 기존 snapshot 복사 후 install 오버라이드
662
+ effectiveSnapshot = {
663
+ ...snapshot,
664
+ install: newInstall,
665
+ };
666
+ console.log(chalk.gray(` skit: ${Object.keys(classified.skit).length}, npm: ${Object.keys(classified.npm).length}, generic: ${Object.keys(classified.generic).length}`));
667
+ }
668
+ // Auto-detect 모드: snapshot.install이 없으면 자동 판별 (API 실패 시 fallback)
669
+ const autoDetect = !effectiveSnapshot.install;
670
+ const installResult = await installSnapshot(effectiveSnapshot, 0, effectiveInstallers, {
671
+ useProxy,
672
+ autoDetect,
673
+ });
674
+ result = installResult.result;
675
+ }
676
+ catch (err) {
677
+ installError = err instanceof Error ? err : new Error(String(err));
678
+ }
679
+ finally {
680
+ // Restore .npmrc
681
+ if (npmrcBackup) {
682
+ restoreNpmrc(npmrcBackup);
683
+ console.log(chalk.gray('Restored .npmrc'));
684
+ }
685
+ }
686
+ if (installError) {
687
+ console.log(chalk.red(`Error during installation: ${installError.message}`));
688
+ process.exit(1);
689
+ }
172
690
  // Summary
173
691
  console.log('');
174
692
  console.log(chalk.yellow('═══════════════════════════════════'));
175
693
  console.log(chalk.yellow(' Final Summary '));
176
694
  console.log(chalk.yellow('═══════════════════════════════════'));
177
- const totalPkgs = result.packages.length + result.failedPackages.length;
178
- const totalSkits = result.skits.length + result.failedSkits.length;
179
- if (totalPkgs > 0) {
180
- console.log(`Packages: ${chalk.green(result.packages.length)}/${totalPkgs}`);
181
- }
182
- if (totalSkits > 0) {
183
- console.log(`Skits: ${chalk.green(result.skits.length)}/${totalSkits}`);
184
- }
185
- if (result.failedPackages.length > 0 || result.failedSkits.length > 0) {
695
+ const total = result.installed.length + result.failed.length;
696
+ console.log(`Installed: ${chalk.green(result.installed.length)}/${total}`);
697
+ if (result.failed.length > 0) {
186
698
  console.log('');
187
699
  console.log(chalk.red('Failed:'));
188
- for (const pkg of result.failedPackages) {
700
+ for (const pkg of result.failed) {
189
701
  console.log(chalk.red(` ✗ ${pkg}`));
190
702
  }
191
- for (const skit of result.failedSkits) {
192
- console.log(chalk.red(` ✗ ${skit}`));
193
- }
194
703
  }
195
704
  // Save
196
- if (result.packages.length > 0 || result.skits.length > 0) {
705
+ if (result.installed.length > 0) {
197
706
  saveCurrentSnapshot({
198
707
  name: snapshot.name,
199
708
  version: snapshot.version,
200
709
  installedAt: new Date().toISOString(),
201
- packages: result.packages,
202
- skits: result.skits,
710
+ packages: result.installed,
203
711
  });
204
712
  console.log('');
205
713
  console.log(chalk.green('✓') + ' Snapshot info saved');
206
714
  }
207
- if (result.failedPackages.length > 0 || result.failedSkits.length > 0) {
715
+ // Send telemetry (fire and forget)
716
+ sendInstallTelemetry({
717
+ package: snapshot.name,
718
+ version: snapshot.version,
719
+ success: result.failed.length === 0,
720
+ installedCount: result.installed.length,
721
+ failedCount: result.failed.length,
722
+ error: result.failed.length > 0 ? `Failed: ${result.failed.join(', ')}` : undefined,
723
+ userId: istCredentials?.userId,
724
+ userEmail: istCredentials?.email,
725
+ licenseKey: licenseKey ? licenseKey.substring(0, 9) : undefined,
726
+ platform: platform(),
727
+ arch: arch(),
728
+ cliVersion: CLI_VERSION,
729
+ });
730
+ if (result.failed.length > 0) {
208
731
  process.exit(1);
209
732
  }
210
733
  }