@g3nomaly/core 0.3.0 → 0.3.1

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 (243) hide show
  1. package/LICENSE +95 -0
  2. package/dist/cli/commands/add.d.ts +17 -0
  3. package/dist/cli/commands/add.d.ts.map +1 -0
  4. package/dist/cli/commands/add.js +76 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/installFromSources.d.ts +49 -0
  7. package/dist/cli/commands/installFromSources.d.ts.map +1 -0
  8. package/dist/cli/commands/installFromSources.js +138 -0
  9. package/dist/cli/commands/installFromSources.js.map +1 -0
  10. package/dist/cli/commands/ls.d.ts +16 -0
  11. package/dist/cli/commands/ls.d.ts.map +1 -0
  12. package/dist/cli/commands/ls.js +65 -0
  13. package/dist/cli/commands/ls.js.map +1 -0
  14. package/dist/cli/commands/remove.d.ts +13 -0
  15. package/dist/cli/commands/remove.d.ts.map +1 -0
  16. package/dist/cli/commands/remove.js +109 -0
  17. package/dist/cli/commands/remove.js.map +1 -0
  18. package/dist/cli/commands/sources.d.ts +45 -0
  19. package/dist/cli/commands/sources.d.ts.map +1 -0
  20. package/dist/cli/commands/sources.js +89 -0
  21. package/dist/cli/commands/sources.js.map +1 -0
  22. package/dist/cli/commands/update.d.ts +10 -0
  23. package/dist/cli/commands/update.d.ts.map +1 -0
  24. package/dist/cli/commands/update.js +92 -0
  25. package/dist/cli/commands/update.js.map +1 -0
  26. package/dist/cli/dialogue.d.ts +74 -0
  27. package/dist/cli/dialogue.d.ts.map +1 -0
  28. package/dist/cli/dialogue.js +117 -0
  29. package/dist/cli/dialogue.js.map +1 -0
  30. package/dist/cli/index.d.ts +19 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +16 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/cli/installDialogues.d.ts +15 -0
  35. package/dist/cli/installDialogues.d.ts.map +1 -0
  36. package/dist/cli/installDialogues.js +72 -0
  37. package/dist/cli/installDialogues.js.map +1 -0
  38. package/dist/cli/pick.d.ts +14 -0
  39. package/dist/cli/pick.d.ts.map +1 -0
  40. package/dist/cli/pick.js +35 -0
  41. package/dist/cli/pick.js.map +1 -0
  42. package/dist/cli/report.d.ts +34 -0
  43. package/dist/cli/report.d.ts.map +1 -0
  44. package/dist/cli/report.js +71 -0
  45. package/dist/cli/report.js.map +1 -0
  46. package/dist/cli/theme.d.ts +23 -0
  47. package/dist/cli/theme.d.ts.map +1 -0
  48. package/dist/cli/theme.js +25 -0
  49. package/dist/cli/theme.js.map +1 -0
  50. package/dist/cli/types.d.ts +45 -0
  51. package/dist/cli/types.d.ts.map +1 -0
  52. package/dist/cli/types.js +2 -0
  53. package/dist/cli/types.js.map +1 -0
  54. package/dist/config/config.d.ts +30 -0
  55. package/dist/config/config.d.ts.map +1 -0
  56. package/dist/config/config.js +77 -0
  57. package/dist/config/config.js.map +1 -0
  58. package/dist/config/index.d.ts +4 -0
  59. package/dist/config/index.d.ts.map +1 -0
  60. package/dist/config/index.js +3 -0
  61. package/dist/config/index.js.map +1 -0
  62. package/dist/config/types.d.ts +124 -0
  63. package/dist/config/types.d.ts.map +1 -0
  64. package/dist/config/types.js +61 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/hash/hash.d.ts +25 -0
  67. package/dist/hash/hash.d.ts.map +1 -0
  68. package/dist/hash/hash.js +44 -0
  69. package/dist/hash/hash.js.map +1 -0
  70. package/dist/hash/index.d.ts +2 -0
  71. package/dist/hash/index.d.ts.map +1 -0
  72. package/dist/hash/index.js +2 -0
  73. package/dist/hash/index.js.map +1 -0
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +2 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/installer/classify.d.ts +7 -0
  79. package/dist/installer/classify.d.ts.map +1 -0
  80. package/dist/installer/classify.js +47 -0
  81. package/dist/installer/classify.js.map +1 -0
  82. package/dist/installer/files.d.ts +15 -0
  83. package/dist/installer/files.d.ts.map +1 -0
  84. package/dist/installer/files.js +22 -0
  85. package/dist/installer/files.js.map +1 -0
  86. package/dist/installer/index.d.ts +19 -0
  87. package/dist/installer/index.d.ts.map +1 -0
  88. package/dist/installer/index.js +14 -0
  89. package/dist/installer/index.js.map +1 -0
  90. package/dist/installer/install.d.ts +13 -0
  91. package/dist/installer/install.d.ts.map +1 -0
  92. package/dist/installer/install.js +61 -0
  93. package/dist/installer/install.js.map +1 -0
  94. package/dist/installer/io.d.ts +4 -0
  95. package/dist/installer/io.d.ts.map +1 -0
  96. package/dist/installer/io.js +18 -0
  97. package/dist/installer/io.js.map +1 -0
  98. package/dist/installer/manifest.d.ts +59 -0
  99. package/dist/installer/manifest.d.ts.map +1 -0
  100. package/dist/installer/manifest.js +60 -0
  101. package/dist/installer/manifest.js.map +1 -0
  102. package/dist/installer/manifestSources.d.ts +21 -0
  103. package/dist/installer/manifestSources.d.ts.map +1 -0
  104. package/dist/installer/manifestSources.js +39 -0
  105. package/dist/installer/manifestSources.js.map +1 -0
  106. package/dist/installer/marketplace.d.ts +34 -0
  107. package/dist/installer/marketplace.d.ts.map +1 -0
  108. package/dist/installer/marketplace.js +64 -0
  109. package/dist/installer/marketplace.js.map +1 -0
  110. package/dist/installer/origin.d.ts +43 -0
  111. package/dist/installer/origin.d.ts.map +1 -0
  112. package/dist/installer/origin.js +22 -0
  113. package/dist/installer/origin.js.map +1 -0
  114. package/dist/installer/remove.d.ts +14 -0
  115. package/dist/installer/remove.d.ts.map +1 -0
  116. package/dist/installer/remove.js +37 -0
  117. package/dist/installer/remove.js.map +1 -0
  118. package/dist/installer/resolve.d.ts +78 -0
  119. package/dist/installer/resolve.d.ts.map +1 -0
  120. package/dist/installer/resolve.js +184 -0
  121. package/dist/installer/resolve.js.map +1 -0
  122. package/dist/installer/sourceRegistry.d.ts +59 -0
  123. package/dist/installer/sourceRegistry.d.ts.map +1 -0
  124. package/dist/installer/sourceRegistry.js +71 -0
  125. package/dist/installer/sourceRegistry.js.map +1 -0
  126. package/dist/installer/types.d.ts +80 -0
  127. package/dist/installer/types.d.ts.map +1 -0
  128. package/dist/installer/types.js +21 -0
  129. package/dist/installer/types.js.map +1 -0
  130. package/dist/registry/index.d.ts +12 -0
  131. package/dist/registry/index.d.ts.map +1 -0
  132. package/dist/registry/index.js +12 -0
  133. package/dist/registry/index.js.map +1 -0
  134. package/dist/registry/registry.handlers.d.ts +9 -0
  135. package/dist/registry/registry.handlers.d.ts.map +1 -0
  136. package/dist/registry/registry.handlers.js +13 -0
  137. package/dist/registry/registry.handlers.js.map +1 -0
  138. package/dist/registry/registry.io.d.ts +22 -0
  139. package/dist/registry/registry.io.d.ts.map +1 -0
  140. package/dist/registry/registry.io.js +78 -0
  141. package/dist/registry/registry.io.js.map +1 -0
  142. package/dist/registry/registry.mutations.d.ts +12 -0
  143. package/dist/registry/registry.mutations.d.ts.map +1 -0
  144. package/dist/registry/registry.mutations.js +22 -0
  145. package/dist/registry/registry.mutations.js.map +1 -0
  146. package/dist/registry/registry.selectors.d.ts +38 -0
  147. package/dist/registry/registry.selectors.d.ts.map +1 -0
  148. package/dist/registry/registry.selectors.js +61 -0
  149. package/dist/registry/registry.selectors.js.map +1 -0
  150. package/dist/registry/registry.store.d.ts +34 -0
  151. package/dist/registry/registry.store.d.ts.map +1 -0
  152. package/dist/registry/registry.store.js +27 -0
  153. package/dist/registry/registry.store.js.map +1 -0
  154. package/dist/registry/registry.template.d.ts +23 -0
  155. package/dist/registry/registry.template.d.ts.map +1 -0
  156. package/dist/registry/registry.template.js +63 -0
  157. package/dist/registry/registry.template.js.map +1 -0
  158. package/dist/registry/types.d.ts +33 -0
  159. package/dist/registry/types.d.ts.map +1 -0
  160. package/dist/registry/types.js +25 -0
  161. package/dist/registry/types.js.map +1 -0
  162. package/dist/security/index.d.ts +2 -0
  163. package/dist/security/index.d.ts.map +1 -0
  164. package/dist/security/index.js +2 -0
  165. package/dist/security/index.js.map +1 -0
  166. package/dist/security/securityParser.d.ts +14 -0
  167. package/dist/security/securityParser.d.ts.map +1 -0
  168. package/dist/security/securityParser.js +89 -0
  169. package/dist/security/securityParser.js.map +1 -0
  170. package/dist/security/securityWorker.d.ts +8 -0
  171. package/dist/security/securityWorker.d.ts.map +1 -0
  172. package/dist/security/securityWorker.js +158 -0
  173. package/dist/security/securityWorker.js.map +1 -0
  174. package/dist/sources/checkout.d.ts +14 -0
  175. package/dist/sources/checkout.d.ts.map +1 -0
  176. package/dist/sources/checkout.js +27 -0
  177. package/dist/sources/checkout.js.map +1 -0
  178. package/dist/sources/git.d.ts +9 -0
  179. package/dist/sources/git.d.ts.map +1 -0
  180. package/dist/sources/git.js +22 -0
  181. package/dist/sources/git.js.map +1 -0
  182. package/dist/sources/index.d.ts +5 -0
  183. package/dist/sources/index.d.ts.map +1 -0
  184. package/dist/sources/index.js +6 -0
  185. package/dist/sources/index.js.map +1 -0
  186. package/dist/sources/local.d.ts +10 -0
  187. package/dist/sources/local.d.ts.map +1 -0
  188. package/dist/sources/local.js +20 -0
  189. package/dist/sources/local.js.map +1 -0
  190. package/dist/sources/npm.d.ts +13 -0
  191. package/dist/sources/npm.d.ts.map +1 -0
  192. package/dist/sources/npm.js +128 -0
  193. package/dist/sources/npm.js.map +1 -0
  194. package/dist/sources/packageJson.d.ts +3 -0
  195. package/dist/sources/packageJson.d.ts.map +1 -0
  196. package/dist/sources/packageJson.js +13 -0
  197. package/dist/sources/packageJson.js.map +1 -0
  198. package/dist/sources/parse.d.ts +34 -0
  199. package/dist/sources/parse.d.ts.map +1 -0
  200. package/dist/sources/parse.js +92 -0
  201. package/dist/sources/parse.js.map +1 -0
  202. package/dist/sources/process.d.ts +18 -0
  203. package/dist/sources/process.d.ts.map +1 -0
  204. package/dist/sources/process.js +43 -0
  205. package/dist/sources/process.js.map +1 -0
  206. package/dist/sources/register.d.ts +16 -0
  207. package/dist/sources/register.d.ts.map +1 -0
  208. package/dist/sources/register.js +37 -0
  209. package/dist/sources/register.js.map +1 -0
  210. package/dist/sources/types.d.ts +73 -0
  211. package/dist/sources/types.d.ts.map +1 -0
  212. package/dist/sources/types.js +36 -0
  213. package/dist/sources/types.js.map +1 -0
  214. package/dist/utils/errors.d.ts +3 -0
  215. package/dist/utils/errors.d.ts.map +1 -0
  216. package/dist/utils/errors.js +6 -0
  217. package/dist/utils/errors.js.map +1 -0
  218. package/dist/utils/index.d.ts +7 -0
  219. package/dist/utils/index.d.ts.map +1 -0
  220. package/dist/utils/index.js +7 -0
  221. package/dist/utils/index.js.map +1 -0
  222. package/dist/utils/merge.d.ts +6 -0
  223. package/dist/utils/merge.d.ts.map +1 -0
  224. package/dist/utils/merge.js +21 -0
  225. package/dist/utils/merge.js.map +1 -0
  226. package/dist/utils/packageMeta.d.ts +12 -0
  227. package/dist/utils/packageMeta.d.ts.map +1 -0
  228. package/dist/utils/packageMeta.js +20 -0
  229. package/dist/utils/packageMeta.js.map +1 -0
  230. package/dist/utils/paths.d.ts +16 -0
  231. package/dist/utils/paths.d.ts.map +1 -0
  232. package/dist/utils/paths.js +40 -0
  233. package/dist/utils/paths.js.map +1 -0
  234. package/dist/utils/prompt.d.ts +3 -0
  235. package/dist/utils/prompt.d.ts.map +1 -0
  236. package/dist/utils/prompt.js +8 -0
  237. package/dist/utils/prompt.js.map +1 -0
  238. package/dist/utils/version.d.ts +9 -0
  239. package/dist/utils/version.d.ts.map +1 -0
  240. package/dist/utils/version.js +103 -0
  241. package/dist/utils/version.js.map +1 -0
  242. package/package.json +64 -3
  243. package/README.md +0 -3
@@ -0,0 +1,21 @@
1
+ import type { RegisteredSource, SourceRecord, SourceSpec } from "../sources/types";
2
+ import type { InstallManifest } from "./manifest";
3
+ /**
4
+ * Sources of one or more manifests plus the built-in ones, each name once and
5
+ * built-in sources first. When two manifests register one name for different
6
+ * places, the first manifest's spec is used.
7
+ */
8
+ export declare function manifestSources(manifests: readonly InstallManifest[], builtins: SourceRecord): RegisteredSource[];
9
+ /**
10
+ * Registers a source in every manifest. Nothing changes unless every manifest accepts it.
11
+ *
12
+ * @throws when the name is built in, invalid, or already registered in any manifest
13
+ */
14
+ export declare function registerSource(manifests: readonly InstallManifest[], name: string, spec: SourceSpec, builtins: SourceRecord): void;
15
+ /**
16
+ * Unregisters a source from every manifest that has it.
17
+ *
18
+ * @throws when the name is built in or no manifest registers it
19
+ */
20
+ export declare function unregisterSource(manifests: readonly InstallManifest[], name: string, builtins: SourceRecord): void;
21
+ //# sourceMappingURL=manifestSources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestSources.d.ts","sourceRoot":"","sources":["../../src/installer/manifestSources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAMjH;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAGlI;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAKlH"}
@@ -0,0 +1,39 @@
1
+ // packages/core/src/installer/manifestSources.ts
2
+ import { addSource, listSources, removeSource } from "../sources/register";
3
+ /**
4
+ * Sources of one or more manifests plus the built-in ones, each name once and
5
+ * built-in sources first. When two manifests register one name for different
6
+ * places, the first manifest's spec is used.
7
+ */
8
+ export function manifestSources(manifests, builtins) {
9
+ const byName = new Map();
10
+ for (const manifest of manifests) {
11
+ for (const source of listSources(manifest.sources, builtins))
12
+ if (!byName.has(source.name))
13
+ byName.set(source.name, source);
14
+ }
15
+ return [...byName.values()];
16
+ }
17
+ /**
18
+ * Registers a source in every manifest. Nothing changes unless every manifest accepts it.
19
+ *
20
+ * @throws when the name is built in, invalid, or already registered in any manifest
21
+ */
22
+ export function registerSource(manifests, name, spec, builtins) {
23
+ const updated = manifests.map((manifest) => addSource(manifest.sources, name, spec, builtins));
24
+ manifests.forEach((manifest, index) => { manifest.sources = updated[index] ?? manifest.sources; });
25
+ }
26
+ /**
27
+ * Unregisters a source from every manifest that has it.
28
+ *
29
+ * @throws when the name is built in or no manifest registers it
30
+ */
31
+ export function unregisterSource(manifests, name, builtins) {
32
+ const holding = manifests.filter((manifest) => manifest.sources[name] !== undefined);
33
+ // With no manifest holding it, removeSource throws the reason: built in, or never registered.
34
+ if (holding.length === 0)
35
+ removeSource({}, name, builtins);
36
+ for (const manifest of holding)
37
+ manifest.sources = removeSource(manifest.sources, name, builtins);
38
+ }
39
+ //# sourceMappingURL=manifestSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifestSources.js","sourceRoot":"","sources":["../../src/installer/manifestSources.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAI1E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,SAAqC,EAAE,QAAsB;IAC3F,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAA;IAClD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC7H,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAqC,EAAE,IAAY,EAAE,IAAgB,EAAE,QAAsB;IAC1H,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC9F,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAA,CAAC,CAAC,CAAC,CAAA;AACnG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAqC,EAAE,IAAY,EAAE,QAAsB;IAC1G,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAA;IACpF,8FAA8F;IAC9F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,YAAY,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC1D,KAAK,MAAM,QAAQ,IAAI,OAAO;QAAE,QAAQ,CAAC,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;AACnG,CAAC"}
@@ -0,0 +1,34 @@
1
+ /** Folders a plugin or marketplace manifest may sit in, in the order they are tried. */
2
+ export declare const MANIFEST_DIRS: string[];
3
+ /** One plugin a marketplace lists, by its folder inside the source. */
4
+ export interface MarketplacePlugin {
5
+ name: string;
6
+ /** Absolute plugin folder */
7
+ dir: string;
8
+ }
9
+ /**
10
+ * First existing `<dir>/.claude-plugin/<file>` or `<dir>/.cursor-plugin/<file>`.
11
+ *
12
+ * @returns absolute path, or `null` when neither exists
13
+ */
14
+ export declare function manifestFile(dir: string, file: string): string | null;
15
+ /**
16
+ * Resolves `rel` against `base` and rejects a result outside `root`.
17
+ *
18
+ * @param root - Absolute folder nothing may leave, e.g. a source checkout
19
+ * @throws when the path points outside `root`
20
+ */
21
+ export declare function resolveInside(root: string, base: string, rel: string): string;
22
+ /**
23
+ * The plugins a source's `marketplace.json` lists. Plugins whose `source` is
24
+ * not a relative path (a git or npm reference) are skipped with a warning.
25
+ *
26
+ * @param root - Absolute root of the source
27
+ * @returns `null` when the source has no marketplace
28
+ * @throws when the marketplace is not valid JSON, or a plugin path leaves the source
29
+ */
30
+ export declare function readMarketplace(root: string): {
31
+ plugins: MarketplacePlugin[];
32
+ warnings: string[];
33
+ } | null;
34
+ //# sourceMappingURL=marketplace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/installer/marketplace.ts"],"names":[],"mappings":"AAKA,wFAAwF;AACxF,eAAO,MAAM,aAAa,UAAuC,CAAA;AAWjE,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,GAAG,EAAG,MAAM,CAAA;CACb;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAezG"}
@@ -0,0 +1,64 @@
1
+ // packages/core/src/installer/marketplace.ts
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ /** Folders a plugin or marketplace manifest may sit in, in the order they are tried. */
6
+ export const MANIFEST_DIRS = [".claude-plugin", ".cursor-plugin"];
7
+ const MARKETPLACE_FILE = "marketplace.json";
8
+ const MarketplaceSchema = z.object({
9
+ plugins: z.array(z.object({
10
+ name: z.string().min(1),
11
+ source: z.unknown(),
12
+ })).default([]),
13
+ });
14
+ /**
15
+ * First existing `<dir>/.claude-plugin/<file>` or `<dir>/.cursor-plugin/<file>`.
16
+ *
17
+ * @returns absolute path, or `null` when neither exists
18
+ */
19
+ export function manifestFile(dir, file) {
20
+ for (const manifestDir of MANIFEST_DIRS) {
21
+ const candidate = path.join(dir, manifestDir, file);
22
+ if (fs.existsSync(candidate))
23
+ return candidate;
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Resolves `rel` against `base` and rejects a result outside `root`.
29
+ *
30
+ * @param root - Absolute folder nothing may leave, e.g. a source checkout
31
+ * @throws when the path points outside `root`
32
+ */
33
+ export function resolveInside(root, base, rel) {
34
+ const resolved = path.resolve(base, rel);
35
+ if (resolved !== root && !resolved.startsWith(root + path.sep)) {
36
+ throw new Error(`manifest path "${rel}" points outside the source`);
37
+ }
38
+ return resolved;
39
+ }
40
+ /**
41
+ * The plugins a source's `marketplace.json` lists. Plugins whose `source` is
42
+ * not a relative path (a git or npm reference) are skipped with a warning.
43
+ *
44
+ * @param root - Absolute root of the source
45
+ * @returns `null` when the source has no marketplace
46
+ * @throws when the marketplace is not valid JSON, or a plugin path leaves the source
47
+ */
48
+ export function readMarketplace(root) {
49
+ const file = manifestFile(root, MARKETPLACE_FILE);
50
+ if (file === null)
51
+ return null;
52
+ const marketplace = MarketplaceSchema.parse(JSON.parse(fs.readFileSync(file, "utf8")));
53
+ const plugins = [];
54
+ const warnings = [];
55
+ for (const plugin of marketplace.plugins) {
56
+ if (typeof plugin.source !== "string") {
57
+ warnings.push(`${plugin.name}: marketplace source is not a relative path, skipped`);
58
+ continue;
59
+ }
60
+ plugins.push({ name: plugin.name, dir: resolveInside(root, root, plugin.source) });
61
+ }
62
+ return { plugins, warnings };
63
+ }
64
+ //# sourceMappingURL=marketplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/installer/marketplace.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,wFAAwF;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;AAEjE,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAE3C,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,EAAI,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChB,CAAC,CAAA;AASF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY;IACpD,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;IAChD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACxC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,6BAA6B,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACjD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IACtF,MAAM,OAAO,GAAwB,EAAE,CAAA;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACzC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,sDAAsD,CAAC,CAAA;YACnF,SAAQ;QACV,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Where an entry came from: the registered source, the folder its file paths
4
+ * resolve against, and the revision the source was read at.
5
+ */
6
+ export declare const EntryOriginSchema: z.ZodObject<{
7
+ source: z.ZodString;
8
+ dir: z.ZodString;
9
+ commit: z.ZodOptional<z.ZodString>;
10
+ version: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export type EntryOrigin = z.infer<typeof EntryOriginSchema>;
13
+ /** A registry entry read from a source: the base fields plus its origin. */
14
+ export declare const OriginEntrySchema: z.ZodObject<{
15
+ name: z.ZodString;
16
+ description: z.ZodOptional<z.ZodString>;
17
+ version: z.ZodOptional<z.ZodString>;
18
+ group: z.ZodOptional<z.ZodString>;
19
+ registryDependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
20
+ files: z.ZodArray<z.ZodObject<{
21
+ path: z.ZodString;
22
+ type: z.ZodString;
23
+ hash: z.ZodOptional<z.ZodString>;
24
+ version: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>>;
26
+ origin: z.ZodObject<{
27
+ source: z.ZodString;
28
+ dir: z.ZodString;
29
+ commit: z.ZodOptional<z.ZodString>;
30
+ version: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ }, z.core.$strip>;
33
+ export type OriginEntry = z.infer<typeof OriginEntrySchema>;
34
+ /** What a source's reader passes to the function that reads one entry folder. */
35
+ export interface ReadContext {
36
+ /** Origin recorded on the entry */
37
+ origin: EntryOrigin;
38
+ /** Group the entry is listed under, e.g. the plugin it ships in */
39
+ group: string;
40
+ /** Version to record when the entry's own manifest has none */
41
+ version?: string;
42
+ }
43
+ //# sourceMappingURL=origin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/installer/origin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;iBAS5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;iBAE5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,MAAM,EAAI,WAAW,CAAA;IACrB,mEAAmE;IACnE,KAAK,EAAK,MAAM,CAAA;IAChB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB"}
@@ -0,0 +1,22 @@
1
+ // packages/core/src/installer/origin.ts
2
+ import { z } from "zod";
3
+ import { BaseRegistryEntrySchema } from "../registry/types";
4
+ /**
5
+ * Where an entry came from: the registered source, the folder its file paths
6
+ * resolve against, and the revision the source was read at.
7
+ */
8
+ export const EntryOriginSchema = z.object({
9
+ /** Name of the registered source, e.g. `g3n-skills` */
10
+ source: z.string().min(1),
11
+ /** Source-relative folder that `files[].path` resolves against, e.g. `skills/speech` or `dist/components` */
12
+ dir: z.string(),
13
+ /** Commit a git source resolved to */
14
+ commit: z.string().min(1).optional(),
15
+ /** Version an npm source resolved to, or the version in a local source's package.json */
16
+ version: z.string().min(1).optional(),
17
+ });
18
+ /** A registry entry read from a source: the base fields plus its origin. */
19
+ export const OriginEntrySchema = BaseRegistryEntrySchema.extend({
20
+ origin: EntryOriginSchema,
21
+ });
22
+ //# sourceMappingURL=origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/installer/origin.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,uDAAuD;IACvD,MAAM,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,6GAA6G;IAC7G,GAAG,EAAM,CAAC,CAAC,MAAM,EAAE;IACnB,sCAAsC;IACtC,MAAM,EAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,yFAAyF;IACzF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAA;AAIF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,MAAM,CAAC;IAC9D,MAAM,EAAE,iBAAiB;CAC1B,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { BaseFileEntry } from "../registry/types";
2
+ import type { InstallerIO, RemoveResult } from "./types";
3
+ /**
4
+ * Removes a manifest entry's files from `installDir`. A file whose on-disk
5
+ * hash differs from the hash recorded at install time is kept unless `force`
6
+ * is set. Directories left empty by the removals are pruned up to
7
+ * `installDir`.
8
+ */
9
+ export declare function removeInstalledFiles(files: readonly BaseFileEntry[], installDir: string, opts: {
10
+ force?: boolean;
11
+ }, io: InstallerIO): Promise<RemoveResult>;
12
+ /** Removes `dir` and its parents while they exist and are empty, stopping at `stopAt`. */
13
+ export declare function pruneEmptyDirs(dir: string, stopAt: string, io: InstallerIO): void;
14
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/installer/remove.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAExD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACzB,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,YAAY,CAAC,CAsBvB;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAMjF"}
@@ -0,0 +1,37 @@
1
+ // packages/core/src/installer/remove.ts
2
+ import path from "node:path";
3
+ /**
4
+ * Removes a manifest entry's files from `installDir`. A file whose on-disk
5
+ * hash differs from the hash recorded at install time is kept unless `force`
6
+ * is set. Directories left empty by the removals are pruned up to
7
+ * `installDir`.
8
+ */
9
+ export async function removeInstalledFiles(files, installDir, opts, io) {
10
+ const result = { removed: [], kept: [], missing: [] };
11
+ for (const file of files) {
12
+ const destPath = path.join(installDir, file.path);
13
+ if (!io.exists(destPath)) {
14
+ result.missing.push(file.path);
15
+ continue;
16
+ }
17
+ if (file.hash && opts.force !== true && (await io.hashFile(destPath)) !== file.hash) {
18
+ result.kept.push(file.path);
19
+ continue;
20
+ }
21
+ io.removeFile(destPath);
22
+ result.removed.push(file.path);
23
+ }
24
+ for (const relPath of result.removed) {
25
+ pruneEmptyDirs(path.dirname(path.join(installDir, relPath)), installDir, io);
26
+ }
27
+ return result;
28
+ }
29
+ /** Removes `dir` and its parents while they exist and are empty, stopping at `stopAt`. */
30
+ export function pruneEmptyDirs(dir, stopAt, io) {
31
+ let current = dir;
32
+ while (current !== stopAt && io.exists(current) && io.listDir(current).length === 0) {
33
+ io.removeDir(current);
34
+ current = path.dirname(current);
35
+ }
36
+ }
37
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/installer/remove.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAI5B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAA+B,EAC/B,UAAkB,EAClB,IAAyB,EACzB,EAAe;IAEf,MAAM,MAAM,GAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAEnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3B,SAAQ;QACV,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACrC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,MAAc,EAAE,EAAe;IACzE,IAAI,OAAO,GAAG,GAAG,CAAA;IACjB,OAAO,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { OriginEntry } from "./origin";
2
+ import type { SourceOffer } from "./sourceRegistry";
3
+ /** An entry or group as named on the command line or in `registryDependencies`. */
4
+ export interface EntryRequest {
5
+ name: string;
6
+ /** Registered source the name must come from, when given as `<name>@<source>` */
7
+ source?: string;
8
+ }
9
+ /** Entries a set of requests resolved to, and what could not be resolved. */
10
+ export interface Resolution<T extends OriginEntry> {
11
+ /** Resolved entries by key, `registryDependencies` rewritten to the resolved keys */
12
+ entries: Map<string, SourceOffer<T>>;
13
+ /** Requests and dependencies no source offers, e.g. `ghost` or `ghost@mine` */
14
+ unknown: string[];
15
+ /** One message per name more than one source offers, naming the qualified forms to pick from */
16
+ ambiguous: string[];
17
+ /** Why an entry nobody named is in the set, e.g. `{ vocabulary: "dep of plan" }` */
18
+ notes: Record<string, string>;
19
+ }
20
+ /** One entry with its dependencies resolved across sources. */
21
+ export interface ResolvedDependencies<T extends OriginEntry> {
22
+ /** The entry with `registryDependencies` rewritten to the resolved keys */
23
+ offer: SourceOffer<T>;
24
+ dependencies: SourceOffer<T>[];
25
+ /** Dependencies no source offers, e.g. `ghost (dep of plan)` */
26
+ unknown: string[];
27
+ ambiguous: string[];
28
+ }
29
+ /**
30
+ * Reads `emphasise` or `emphasise@g3n-skills`; names are matched in
31
+ * lowercase. A leading `@` belongs to the name, as in `@shadcn/button@shadcn`.
32
+ */
33
+ export declare function parseRequest(token: string): EntryRequest;
34
+ /** A request as it is typed, e.g. `emphasise@g3n-skills`. */
35
+ export declare function formatRequest(request: EntryRequest): string;
36
+ /**
37
+ * Resolves the `registryDependencies` of one entry against every offer. A
38
+ * dependency that cannot be resolved keeps its bare name in the rewritten
39
+ * list and is reported in `unknown` or `ambiguous`.
40
+ *
41
+ * @param preferred - Source to take a key from when several offer it: where it is installed, or where the request named it
42
+ */
43
+ export declare function resolveDependencies<T extends OriginEntry>(offer: SourceOffer<T>, offers: readonly SourceOffer<T>[], preferred?: Record<string, string>): ResolvedDependencies<T>;
44
+ /**
45
+ * Resolves entry and group names against every offer, with the dependency
46
+ * closure of each across sources. An entry named in the request settles which
47
+ * source its key comes from for every dependency. Two different entries
48
+ * wanted under one key are reported as ambiguous, since a target holds one
49
+ * folder per key.
50
+ *
51
+ * @param installed - Source each installed key came from
52
+ */
53
+ export declare function resolveRequests<T extends OriginEntry>(tokens: readonly string[], offers: readonly SourceOffer<T>[], installed?: Record<string, string>): Resolution<T>;
54
+ /**
55
+ * Resolves entry and group names against what a target has installed, with
56
+ * `<name>@<source>` keeping only entries installed from that source. Works
57
+ * from the install manifest alone, so no source needs to be reachable.
58
+ *
59
+ * @returns installed keys in the order named, and the names that match nothing installed
60
+ */
61
+ export declare function resolveInstalled<T extends OriginEntry>(tokens: readonly string[], installed: Record<string, T>): {
62
+ keys: string[];
63
+ unknown: string[];
64
+ };
65
+ /** Source each installed key came from, across manifests; the first manifest wins on a clash. */
66
+ export declare function installedOrigins<T extends OriginEntry>(installed: readonly Record<string, T>[]): Record<string, string>;
67
+ /**
68
+ * The fresh offer for each installed key, from the source it was installed
69
+ * from and never another, with its dependencies resolved.
70
+ *
71
+ * @param preferred - Source each installed key came from, across targets
72
+ * @returns the offers found, and the keys whose source is gone or no longer offers them
73
+ */
74
+ export declare function resolveUpdates<T extends OriginEntry>(keys: readonly string[], installed: Record<string, T>, offers: readonly SourceOffer<T>[], preferred?: Record<string, string>): {
75
+ offers: SourceOffer<T>[];
76
+ missing: string[];
77
+ };
78
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/installer/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAEnD,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAK,MAAM,CAAA;IACf,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,WAAW;IAC/C,qFAAqF;IACrF,OAAO,EAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IACtC,+EAA+E;IAC/E,OAAO,EAAI,MAAM,EAAE,CAAA;IACnB,gGAAgG;IAChG,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,oFAAoF;IACpF,KAAK,EAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAClC;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,2EAA2E;IAC3E,KAAK,EAAS,WAAW,CAAC,CAAC,CAAC,CAAA;IAC5B,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9B,gEAAgE;IAChE,OAAO,EAAO,MAAM,EAAE,CAAA;IACtB,SAAS,EAAK,MAAM,EAAE,CAAA;CACvB;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAKxD;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAE3D;AAqDD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,EACjC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACrC,oBAAoB,CAAC,CAAC,CAAC,CAiBzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,EACnD,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,MAAM,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,EACjC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACrC,UAAU,CAAC,CAAC,CAAC,CAuCf;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAYtJ;AAED,iGAAiG;AACjG,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAAE,SAAS,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIvH;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,WAAW,EAClD,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAC5B,MAAM,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,EACjC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACrC;IAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CASjD"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Reads `emphasise` or `emphasise@g3n-skills`; names are matched in
3
+ * lowercase. A leading `@` belongs to the name, as in `@shadcn/button@shadcn`.
4
+ */
5
+ export function parseRequest(token) {
6
+ const at = token.indexOf("@", 1);
7
+ return at > 0
8
+ ? { name: token.slice(0, at).toLowerCase(), source: token.slice(at + 1) }
9
+ : { name: token.toLowerCase() };
10
+ }
11
+ /** A request as it is typed, e.g. `emphasise@g3n-skills`. */
12
+ export function formatRequest(request) {
13
+ return request.source === undefined ? request.name : `${request.name}@${request.source}`;
14
+ }
15
+ /** Name of the source an offer comes from. */
16
+ function sourceOf(offer) {
17
+ return offer.entry.origin.source;
18
+ }
19
+ /** Names of the sources the offers come from, each once, sorted. */
20
+ function uniqueSources(offers) {
21
+ return [...new Set(offers.map(sourceOf))].sort();
22
+ }
23
+ /**
24
+ * Entries one request names. A group name expands to every entry in it and
25
+ * wins over an entry with the same key. A name offered by several sources is
26
+ * settled by the preferred source for it, and is ambiguous otherwise.
27
+ */
28
+ function matchRequest(request, offers, preferred) {
29
+ const pool = request.source === undefined ? offers : offers.filter((o) => sourceOf(o) === request.source);
30
+ const group = pool.filter((o) => o.entry.group === request.name);
31
+ const matches = group.length > 0 ? group : pool.filter((o) => o.key === request.name);
32
+ if (matches.length === 0)
33
+ return null;
34
+ const sources = uniqueSources(matches);
35
+ if (sources.length === 1)
36
+ return matches;
37
+ const pinned = preferred[request.name];
38
+ if (pinned !== undefined && sources.includes(pinned))
39
+ return matches.filter((o) => sourceOf(o) === pinned);
40
+ return { ambiguous: `${request.name} is offered by ${sources.length} sources, name one: ${sources.map((s) => `${request.name}@${s}`).join(", ")}` };
41
+ }
42
+ /**
43
+ * The entry a dependency of `dependent` points at: the named source when the
44
+ * dependency is qualified, else the dependent's own source, else the source
45
+ * preferred for the key, else the only source offering it.
46
+ */
47
+ function matchDependency(token, dependent, offers, preferred) {
48
+ const request = parseRequest(token);
49
+ const named = offers.filter((o) => o.key === request.name);
50
+ const from = (source) => named.find((o) => sourceOf(o) === source);
51
+ if (request.source !== undefined)
52
+ return from(request.source) ?? null;
53
+ const settled = from(sourceOf(dependent)) ?? from(preferred[request.name]);
54
+ if (settled !== undefined)
55
+ return settled;
56
+ if (named.length <= 1)
57
+ return named[0] ?? null;
58
+ return { ambiguous: `${dependent.key} depends on ${request.name}, offered by ${uniqueSources(named).join(", ")}; qualify it as ${request.name}@<source>` };
59
+ }
60
+ /**
61
+ * Resolves the `registryDependencies` of one entry against every offer. A
62
+ * dependency that cannot be resolved keeps its bare name in the rewritten
63
+ * list and is reported in `unknown` or `ambiguous`.
64
+ *
65
+ * @param preferred - Source to take a key from when several offer it: where it is installed, or where the request named it
66
+ */
67
+ export function resolveDependencies(offer, offers, preferred = {}) {
68
+ const result = { offer, dependencies: [], unknown: [], ambiguous: [] };
69
+ const keys = (offer.entry.registryDependencies ?? []).map((token) => {
70
+ const match = matchDependency(token, offer, offers, preferred);
71
+ if (match === null) {
72
+ result.unknown.push(`${token} (dep of ${offer.key})`);
73
+ return parseRequest(token).name;
74
+ }
75
+ if ("ambiguous" in match) {
76
+ result.ambiguous.push(match.ambiguous);
77
+ return parseRequest(token).name;
78
+ }
79
+ result.dependencies.push(match);
80
+ return match.key;
81
+ });
82
+ result.offer = { ...offer, entry: { ...offer.entry, registryDependencies: keys.length > 0 ? keys : undefined } };
83
+ return result;
84
+ }
85
+ /**
86
+ * Resolves entry and group names against every offer, with the dependency
87
+ * closure of each across sources. An entry named in the request settles which
88
+ * source its key comes from for every dependency. Two different entries
89
+ * wanted under one key are reported as ambiguous, since a target holds one
90
+ * folder per key.
91
+ *
92
+ * @param installed - Source each installed key came from
93
+ */
94
+ export function resolveRequests(tokens, offers, installed = {}) {
95
+ const preferred = { ...installed };
96
+ const result = { entries: new Map(), unknown: [], ambiguous: [], notes: {} };
97
+ const named = new Set();
98
+ const add = (offer, note) => {
99
+ const existing = result.entries.get(offer.key);
100
+ if (existing !== undefined) {
101
+ if (sourceOf(existing) !== sourceOf(offer)) {
102
+ result.ambiguous.push(`${offer.key} is wanted from both ${sourceOf(existing)} and ${sourceOf(offer)}`);
103
+ }
104
+ return;
105
+ }
106
+ const resolved = resolveDependencies(offer, offers, preferred);
107
+ result.entries.set(offer.key, resolved.offer);
108
+ result.unknown.push(...resolved.unknown);
109
+ result.ambiguous.push(...resolved.ambiguous);
110
+ if (note !== undefined && !named.has(offer.key))
111
+ result.notes[offer.key] = note;
112
+ for (const dependency of resolved.dependencies)
113
+ add(dependency, `dep of ${offer.key}`);
114
+ };
115
+ const requested = [];
116
+ for (const token of tokens) {
117
+ const request = parseRequest(token);
118
+ const match = matchRequest(request, offers, preferred);
119
+ if (match === null)
120
+ result.unknown.push(formatRequest(request));
121
+ else if ("ambiguous" in match)
122
+ result.ambiguous.push(match.ambiguous);
123
+ else
124
+ requested.push(...match);
125
+ }
126
+ for (const offer of requested) {
127
+ named.add(offer.key);
128
+ preferred[offer.key] = sourceOf(offer);
129
+ }
130
+ for (const offer of requested)
131
+ add(offer);
132
+ result.unknown = [...new Set(result.unknown)];
133
+ result.ambiguous = [...new Set(result.ambiguous)];
134
+ return result;
135
+ }
136
+ /**
137
+ * Resolves entry and group names against what a target has installed, with
138
+ * `<name>@<source>` keeping only entries installed from that source. Works
139
+ * from the install manifest alone, so no source needs to be reachable.
140
+ *
141
+ * @returns installed keys in the order named, and the names that match nothing installed
142
+ */
143
+ export function resolveInstalled(tokens, installed) {
144
+ const keys = [];
145
+ const unknown = [];
146
+ for (const token of tokens) {
147
+ const request = parseRequest(token);
148
+ const pool = Object.entries(installed).filter(([, entry]) => request.source === undefined || entry.origin.source === request.source);
149
+ const group = pool.filter(([, entry]) => entry.group === request.name).map(([key]) => key);
150
+ const matches = group.length > 0 ? group : pool.filter(([key]) => key === request.name).map(([key]) => key);
151
+ if (matches.length === 0)
152
+ unknown.push(formatRequest(request));
153
+ keys.push(...matches);
154
+ }
155
+ return { keys: [...new Set(keys)], unknown };
156
+ }
157
+ /** Source each installed key came from, across manifests; the first manifest wins on a clash. */
158
+ export function installedOrigins(installed) {
159
+ const origins = {};
160
+ for (const record of installed)
161
+ for (const [key, entry] of Object.entries(record))
162
+ origins[key] ??= entry.origin.source;
163
+ return origins;
164
+ }
165
+ /**
166
+ * The fresh offer for each installed key, from the source it was installed
167
+ * from and never another, with its dependencies resolved.
168
+ *
169
+ * @param preferred - Source each installed key came from, across targets
170
+ * @returns the offers found, and the keys whose source is gone or no longer offers them
171
+ */
172
+ export function resolveUpdates(keys, installed, offers, preferred = {}) {
173
+ const found = [];
174
+ const missing = [];
175
+ for (const key of keys) {
176
+ const fresh = offers.find((o) => o.key === key && sourceOf(o) === installed[key]?.origin.source);
177
+ if (fresh === undefined)
178
+ missing.push(key);
179
+ else
180
+ found.push(resolveDependencies(fresh, offers, preferred).offer);
181
+ }
182
+ return { offers: found, missing };
183
+ }
184
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/installer/resolve.ts"],"names":[],"mappings":"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"}