@g3nomaly/core 0.3.0 → 0.3.2

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 (247) hide show
  1. package/LICENSE +95 -0
  2. package/dist/cli/commands/add.d.ts +37 -0
  3. package/dist/cli/commands/add.d.ts.map +1 -0
  4. package/dist/cli/commands/add.js +99 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/conflict.d.ts +52 -0
  7. package/dist/cli/commands/conflict.d.ts.map +1 -0
  8. package/dist/cli/commands/conflict.js +88 -0
  9. package/dist/cli/commands/conflict.js.map +1 -0
  10. package/dist/cli/commands/installFromSources.d.ts +78 -0
  11. package/dist/cli/commands/installFromSources.d.ts.map +1 -0
  12. package/dist/cli/commands/installFromSources.js +187 -0
  13. package/dist/cli/commands/installFromSources.js.map +1 -0
  14. package/dist/cli/commands/ls.d.ts +26 -0
  15. package/dist/cli/commands/ls.d.ts.map +1 -0
  16. package/dist/cli/commands/ls.js +85 -0
  17. package/dist/cli/commands/ls.js.map +1 -0
  18. package/dist/cli/commands/remove.d.ts +19 -0
  19. package/dist/cli/commands/remove.d.ts.map +1 -0
  20. package/dist/cli/commands/remove.js +123 -0
  21. package/dist/cli/commands/remove.js.map +1 -0
  22. package/dist/cli/commands/sources.d.ts +69 -0
  23. package/dist/cli/commands/sources.d.ts.map +1 -0
  24. package/dist/cli/commands/sources.js +103 -0
  25. package/dist/cli/commands/sources.js.map +1 -0
  26. package/dist/cli/commands/update.d.ts +17 -0
  27. package/dist/cli/commands/update.d.ts.map +1 -0
  28. package/dist/cli/commands/update.js +110 -0
  29. package/dist/cli/commands/update.js.map +1 -0
  30. package/dist/cli/dialogue.d.ts +126 -0
  31. package/dist/cli/dialogue.d.ts.map +1 -0
  32. package/dist/cli/dialogue.js +156 -0
  33. package/dist/cli/dialogue.js.map +1 -0
  34. package/dist/cli/index.d.ts +19 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +16 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/installDialogues.d.ts +23 -0
  39. package/dist/cli/installDialogues.d.ts.map +1 -0
  40. package/dist/cli/installDialogues.js +89 -0
  41. package/dist/cli/installDialogues.js.map +1 -0
  42. package/dist/cli/pick.d.ts +23 -0
  43. package/dist/cli/pick.d.ts.map +1 -0
  44. package/dist/cli/pick.js +44 -0
  45. package/dist/cli/pick.js.map +1 -0
  46. package/dist/cli/report.d.ts +58 -0
  47. package/dist/cli/report.d.ts.map +1 -0
  48. package/dist/cli/report.js +92 -0
  49. package/dist/cli/report.js.map +1 -0
  50. package/dist/cli/theme.d.ts +27 -0
  51. package/dist/cli/theme.d.ts.map +1 -0
  52. package/dist/cli/theme.js +29 -0
  53. package/dist/cli/theme.js.map +1 -0
  54. package/dist/cli/types.d.ts +96 -0
  55. package/dist/cli/types.d.ts.map +1 -0
  56. package/dist/cli/types.js +2 -0
  57. package/dist/cli/types.js.map +1 -0
  58. package/dist/config/config.d.ts +55 -0
  59. package/dist/config/config.d.ts.map +1 -0
  60. package/dist/config/config.js +107 -0
  61. package/dist/config/config.js.map +1 -0
  62. package/dist/config/index.d.ts +4 -0
  63. package/dist/config/index.d.ts.map +1 -0
  64. package/dist/config/index.js +3 -0
  65. package/dist/config/index.js.map +1 -0
  66. package/dist/config/types.d.ts +182 -0
  67. package/dist/config/types.d.ts.map +1 -0
  68. package/dist/config/types.js +51 -0
  69. package/dist/config/types.js.map +1 -0
  70. package/dist/hash/hash.d.ts +23 -0
  71. package/dist/hash/hash.d.ts.map +1 -0
  72. package/dist/hash/hash.js +43 -0
  73. package/dist/hash/hash.js.map +1 -0
  74. package/dist/hash/index.d.ts +2 -0
  75. package/dist/hash/index.d.ts.map +1 -0
  76. package/dist/hash/index.js +3 -0
  77. package/dist/hash/index.js.map +1 -0
  78. package/dist/index.d.ts +1 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +3 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/installer/classify.d.ts +33 -0
  83. package/dist/installer/classify.d.ts.map +1 -0
  84. package/dist/installer/classify.js +82 -0
  85. package/dist/installer/classify.js.map +1 -0
  86. package/dist/installer/files.d.ts +19 -0
  87. package/dist/installer/files.d.ts.map +1 -0
  88. package/dist/installer/files.js +23 -0
  89. package/dist/installer/files.js.map +1 -0
  90. package/dist/installer/index.d.ts +19 -0
  91. package/dist/installer/index.d.ts.map +1 -0
  92. package/dist/installer/index.js +14 -0
  93. package/dist/installer/index.js.map +1 -0
  94. package/dist/installer/install.d.ts +25 -0
  95. package/dist/installer/install.d.ts.map +1 -0
  96. package/dist/installer/install.js +74 -0
  97. package/dist/installer/install.js.map +1 -0
  98. package/dist/installer/io.d.ts +9 -0
  99. package/dist/installer/io.d.ts.map +1 -0
  100. package/dist/installer/io.js +23 -0
  101. package/dist/installer/io.js.map +1 -0
  102. package/dist/installer/manifest.d.ts +69 -0
  103. package/dist/installer/manifest.d.ts.map +1 -0
  104. package/dist/installer/manifest.js +70 -0
  105. package/dist/installer/manifest.js.map +1 -0
  106. package/dist/installer/manifestSources.d.ts +32 -0
  107. package/dist/installer/manifestSources.d.ts.map +1 -0
  108. package/dist/installer/manifestSources.js +50 -0
  109. package/dist/installer/manifestSources.js.map +1 -0
  110. package/dist/installer/marketplace.d.ts +46 -0
  111. package/dist/installer/marketplace.d.ts.map +1 -0
  112. package/dist/installer/marketplace.js +72 -0
  113. package/dist/installer/marketplace.js.map +1 -0
  114. package/dist/installer/origin.d.ts +59 -0
  115. package/dist/installer/origin.d.ts.map +1 -0
  116. package/dist/installer/origin.js +29 -0
  117. package/dist/installer/origin.js.map +1 -0
  118. package/dist/installer/remove.d.ts +26 -0
  119. package/dist/installer/remove.d.ts.map +1 -0
  120. package/dist/installer/remove.js +49 -0
  121. package/dist/installer/remove.js.map +1 -0
  122. package/dist/installer/resolve.d.ts +127 -0
  123. package/dist/installer/resolve.d.ts.map +1 -0
  124. package/dist/installer/resolve.js +251 -0
  125. package/dist/installer/resolve.js.map +1 -0
  126. package/dist/installer/sourceRegistry.d.ts +96 -0
  127. package/dist/installer/sourceRegistry.d.ts.map +1 -0
  128. package/dist/installer/sourceRegistry.js +86 -0
  129. package/dist/installer/sourceRegistry.js.map +1 -0
  130. package/dist/installer/types.d.ts +133 -0
  131. package/dist/installer/types.d.ts.map +1 -0
  132. package/dist/installer/types.js +31 -0
  133. package/dist/installer/types.js.map +1 -0
  134. package/dist/registry/index.d.ts +8 -0
  135. package/dist/registry/index.d.ts.map +1 -0
  136. package/dist/registry/index.js +9 -0
  137. package/dist/registry/index.js.map +1 -0
  138. package/dist/registry/registry.handlers.d.ts +16 -0
  139. package/dist/registry/registry.handlers.d.ts.map +1 -0
  140. package/dist/registry/registry.handlers.js +13 -0
  141. package/dist/registry/registry.handlers.js.map +1 -0
  142. package/dist/registry/registry.io.d.ts +38 -0
  143. package/dist/registry/registry.io.d.ts.map +1 -0
  144. package/dist/registry/registry.io.js +101 -0
  145. package/dist/registry/registry.io.js.map +1 -0
  146. package/dist/registry/registry.mutations.d.ts +19 -0
  147. package/dist/registry/registry.mutations.d.ts.map +1 -0
  148. package/dist/registry/registry.mutations.js +29 -0
  149. package/dist/registry/registry.mutations.js.map +1 -0
  150. package/dist/registry/registry.selectors.d.ts +68 -0
  151. package/dist/registry/registry.selectors.d.ts.map +1 -0
  152. package/dist/registry/registry.selectors.js +91 -0
  153. package/dist/registry/registry.selectors.js.map +1 -0
  154. package/dist/registry/registry.store.d.ts +47 -0
  155. package/dist/registry/registry.store.d.ts.map +1 -0
  156. package/dist/registry/registry.store.js +36 -0
  157. package/dist/registry/registry.store.js.map +1 -0
  158. package/dist/registry/registry.template.d.ts +29 -0
  159. package/dist/registry/registry.template.d.ts.map +1 -0
  160. package/dist/registry/registry.template.js +70 -0
  161. package/dist/registry/registry.template.js.map +1 -0
  162. package/dist/registry/types.d.ts +47 -0
  163. package/dist/registry/types.d.ts.map +1 -0
  164. package/dist/registry/types.js +35 -0
  165. package/dist/registry/types.js.map +1 -0
  166. package/dist/security/index.d.ts +2 -0
  167. package/dist/security/index.d.ts.map +1 -0
  168. package/dist/security/index.js +3 -0
  169. package/dist/security/index.js.map +1 -0
  170. package/dist/security/securityParser.d.ts +15 -0
  171. package/dist/security/securityParser.d.ts.map +1 -0
  172. package/dist/security/securityParser.js +79 -0
  173. package/dist/security/securityParser.js.map +1 -0
  174. package/dist/security/securityWorker.d.ts +19 -0
  175. package/dist/security/securityWorker.d.ts.map +1 -0
  176. package/dist/security/securityWorker.js +137 -0
  177. package/dist/security/securityWorker.js.map +1 -0
  178. package/dist/sources/checkout.d.ts +20 -0
  179. package/dist/sources/checkout.d.ts.map +1 -0
  180. package/dist/sources/checkout.js +33 -0
  181. package/dist/sources/checkout.js.map +1 -0
  182. package/dist/sources/git.d.ts +11 -0
  183. package/dist/sources/git.d.ts.map +1 -0
  184. package/dist/sources/git.js +24 -0
  185. package/dist/sources/git.js.map +1 -0
  186. package/dist/sources/index.d.ts +5 -0
  187. package/dist/sources/index.d.ts.map +1 -0
  188. package/dist/sources/index.js +6 -0
  189. package/dist/sources/index.js.map +1 -0
  190. package/dist/sources/local.d.ts +12 -0
  191. package/dist/sources/local.d.ts.map +1 -0
  192. package/dist/sources/local.js +22 -0
  193. package/dist/sources/local.js.map +1 -0
  194. package/dist/sources/npm.d.ts +16 -0
  195. package/dist/sources/npm.d.ts.map +1 -0
  196. package/dist/sources/npm.js +162 -0
  197. package/dist/sources/npm.js.map +1 -0
  198. package/dist/sources/packageJson.d.ts +3 -0
  199. package/dist/sources/packageJson.d.ts.map +1 -0
  200. package/dist/sources/packageJson.js +13 -0
  201. package/dist/sources/packageJson.js.map +1 -0
  202. package/dist/sources/parse.d.ts +42 -0
  203. package/dist/sources/parse.d.ts.map +1 -0
  204. package/dist/sources/parse.js +114 -0
  205. package/dist/sources/parse.js.map +1 -0
  206. package/dist/sources/process.d.ts +21 -0
  207. package/dist/sources/process.d.ts.map +1 -0
  208. package/dist/sources/process.js +46 -0
  209. package/dist/sources/process.js.map +1 -0
  210. package/dist/sources/register.d.ts +31 -0
  211. package/dist/sources/register.d.ts.map +1 -0
  212. package/dist/sources/register.js +52 -0
  213. package/dist/sources/register.js.map +1 -0
  214. package/dist/sources/types.d.ts +108 -0
  215. package/dist/sources/types.d.ts.map +1 -0
  216. package/dist/sources/types.js +53 -0
  217. package/dist/sources/types.js.map +1 -0
  218. package/dist/utils/errors.d.ts +8 -0
  219. package/dist/utils/errors.d.ts.map +1 -0
  220. package/dist/utils/errors.js +11 -0
  221. package/dist/utils/errors.js.map +1 -0
  222. package/dist/utils/index.d.ts +7 -0
  223. package/dist/utils/index.d.ts.map +1 -0
  224. package/dist/utils/index.js +7 -0
  225. package/dist/utils/index.js.map +1 -0
  226. package/dist/utils/merge.d.ts +12 -0
  227. package/dist/utils/merge.d.ts.map +1 -0
  228. package/dist/utils/merge.js +28 -0
  229. package/dist/utils/merge.js.map +1 -0
  230. package/dist/utils/packageMeta.d.ts +26 -0
  231. package/dist/utils/packageMeta.d.ts.map +1 -0
  232. package/dist/utils/packageMeta.js +24 -0
  233. package/dist/utils/packageMeta.js.map +1 -0
  234. package/dist/utils/paths.d.ts +27 -0
  235. package/dist/utils/paths.d.ts.map +1 -0
  236. package/dist/utils/paths.js +51 -0
  237. package/dist/utils/paths.js.map +1 -0
  238. package/dist/utils/prompt.d.ts +8 -0
  239. package/dist/utils/prompt.d.ts.map +1 -0
  240. package/dist/utils/prompt.js +13 -0
  241. package/dist/utils/prompt.js.map +1 -0
  242. package/dist/utils/version.d.ts +14 -0
  243. package/dist/utils/version.d.ts.map +1 -0
  244. package/dist/utils/version.js +140 -0
  245. package/dist/utils/version.js.map +1 -0
  246. package/package.json +64 -3
  247. package/README.md +0 -3
@@ -0,0 +1,187 @@
1
+ import { installedEntries, saveInstallManifest } from "../../installer/manifest";
2
+ import { installedForks, installedOrigins, resolveInstalled, resolveRequests, resolveUpdates } from "../../installer/resolve";
3
+ import { entrySource, offerRegistry, offers } from "../../installer/sourceRegistry";
4
+ import { runDialogueValue } from "../dialogue";
5
+ import { cascadeDialogue, incompleteDialogue, notInstalledDialogue, conflictDialogue, removeChangedDialogue, selectRemovalDialogue } from "../installDialogues";
6
+ import { pickOffers } from "../pick";
7
+ import { reportResolution } from "../report";
8
+ import { c, lineError, lineInfo, lineWarn } from "../theme";
9
+ import { addEntries } from "./add";
10
+ import { removeEntries } from "./remove";
11
+ import { updateEntries } from "./update";
12
+ /**
13
+ * @brief The context's file source for a registry, or a copy out of each source's checkout.
14
+ *
15
+ * @param registry - Source registry the files are read from.
16
+ * @param context - What the installer calls itself.
17
+ * @returns Function giving each entry's files.
18
+ */
19
+ function filesFrom(registry, context) {
20
+ return context.fileSource?.(registry) ?? entrySource(registry);
21
+ }
22
+ /**
23
+ * @brief Installed entries of every target, each key once; the first target wins on a clash.
24
+ *
25
+ * @param targets - Targets to read, in priority order.
26
+ * @param schema - Schema installed entries are parsed with.
27
+ * @returns Installed entries by key.
28
+ */
29
+ function installedAcross(targets, schema) {
30
+ const installed = {};
31
+ for (const target of targets)
32
+ for (const [key, entry] of Object.entries(installedEntries(target.manifest, schema)))
33
+ installed[key] ??= entry;
34
+ return installed;
35
+ }
36
+ /**
37
+ * @brief Installs entries or whole groups from a source registry into every target,
38
+ * each with its dependencies from any source, and saves each manifest. With
39
+ * no names the user picks from what the sources offer. A key an installed
40
+ * fork stands in for is not installed.
41
+ *
42
+ * @param names - As typed: `<name>` or `<name>@<source>`, a name being an entry key or a group
43
+ * @param targets - Install targets, each with its manifest.
44
+ * @param registry - Source registry the names are resolved against.
45
+ * @param options - Force, dry run and preset answers.
46
+ * @param context - What the installer calls itself.
47
+ * @param after - Runs after each manifest is saved.
48
+ */
49
+ export async function addFromSources(targets, names, registry, options, context, after) {
50
+ const available = offers(registry);
51
+ const requested = names.length > 0 ? [...names] : await pickOffers(available, context.noun, options.answers);
52
+ if (requested.length === 0)
53
+ return;
54
+ const installed = targets.map((t) => installedEntries(t.manifest, context.entrySchema));
55
+ const resolution = resolveRequests(requested, available, installedOrigins(installed));
56
+ await reportResolution(resolution, context, options.answers);
57
+ const forks = installedForks(installed);
58
+ const selected = [...resolution.entries.values()].filter(({ key }) => {
59
+ const fork = forks[key];
60
+ if (fork !== undefined)
61
+ console.log(lineInfo(`${c.key(key)} is forked as ${c.key(fork)} — not installed. Remove the fork to install it.`));
62
+ return fork === undefined;
63
+ });
64
+ if (selected.length === 0)
65
+ return;
66
+ const keys = selected.map((s) => s.key);
67
+ await addEntries(offerRegistry(selected), [...targets], filesFrom(registry, context), keys, options, { onCollision: conflictDialogue });
68
+ for (const target of targets) {
69
+ saveInstallManifest(target.manifest, context.entrySchema);
70
+ await after?.(target, keys);
71
+ }
72
+ }
73
+ /**
74
+ * @brief Warns about dependencies an updated entry now has that the target does not hold.
75
+ *
76
+ * @param updated - Offers that were updated.
77
+ * @param installed - Installed entries by key.
78
+ * @param context - What the installer calls itself.
79
+ */
80
+ function reportNewDependencies(updated, installed, context) {
81
+ const forks = installedForks([installed]);
82
+ for (const { key, entry } of updated) {
83
+ const missing = (entry.registryDependencies ?? []).filter((dep) => installed[dep] === undefined && forks[dep] === undefined);
84
+ if (missing.length > 0) {
85
+ console.log(lineWarn(`${c.key(key)} now depends on ${missing.map((m) => c.key(m)).join(", ")}: run ${c.cmd(`${context.bin} add ${key}`)} to install them`));
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * @brief Re-installs installed entries from the source each one was installed
91
+ * from, at that source's current revision; with no names, everything
92
+ * installed. Forks are reported and left alone. Names installed in no
93
+ * target are reported first, and the sources are only opened once something
94
+ * is left to update. Dependencies an entry gained since install are
95
+ * reported, not installed.
96
+ *
97
+ * @param targets - Install targets, each with its manifest.
98
+ * @param names - Names to update; empty to update everything installed.
99
+ * @param openRegistry - Opens the source registry; the command disposes it
100
+ * @param options - Force, dry run and preset answers.
101
+ * @param context - What the installer calls itself.
102
+ * @param after - Runs after each manifest is saved.
103
+ */
104
+ export async function updateFromSources(targets, names, openRegistry, options, context, after) {
105
+ const plans = targets.map((target) => {
106
+ const installed = installedEntries(target.manifest, context.entrySchema);
107
+ const named = names.length > 0 ? resolveInstalled(names, installed) : { keys: Object.keys(installed), unknown: [] };
108
+ const forks = named.keys.filter((key) => installed[key]?.forkedFrom !== undefined);
109
+ return { target, installed, forks, unknown: named.unknown, keys: named.keys.filter((key) => !forks.includes(key)) };
110
+ });
111
+ for (const { installed, forks } of plans) {
112
+ for (const key of forks)
113
+ console.log(lineInfo(`${c.key(key)} is a fork of ${c.key(installed[key]?.forkedFrom ?? "")} — not updated`));
114
+ }
115
+ const unknown = [...new Set(plans.flatMap((p) => p.unknown))].filter((name) => plans.every((p) => p.unknown.includes(name)));
116
+ if (unknown.length > 0) {
117
+ const list = unknown.map((k) => c.key(k)).join(", ");
118
+ console.error(lineError(`Not installed: ${list}. Run ${c.cmd(`${context.bin} add`)} to install them.`));
119
+ const proceed = plans.some((p) => p.keys.length > 0)
120
+ && (await runDialogueValue(notInstalledDialogue, { unknown: list }, options.answers)) === true;
121
+ if (!proceed)
122
+ process.exit(1);
123
+ }
124
+ if (plans.every((p) => p.keys.length === 0)) {
125
+ console.log(lineInfo("Nothing to update."));
126
+ return;
127
+ }
128
+ const registry = await openRegistry();
129
+ const available = offers(registry);
130
+ const origins = installedOrigins(plans.map((p) => p.installed));
131
+ try {
132
+ for (const plan of plans) {
133
+ if (targets.length > 1)
134
+ console.log(c.header(plan.target.label));
135
+ if (plan.keys.length === 0) {
136
+ console.log(lineInfo("Nothing to update."));
137
+ continue;
138
+ }
139
+ const { offers: updated, missing } = resolveUpdates(plan.keys, plan.installed, available, origins);
140
+ reportNewDependencies(updated, plan.installed, context);
141
+ for (const key of missing) {
142
+ console.log(lineWarn(`${c.key(key)}: its source ${c.key(plan.installed[key]?.origin.source ?? "")} is not registered or no longer offers it, left as is`));
143
+ }
144
+ if (updated.length === 0)
145
+ continue;
146
+ const keys = updated.map((u) => u.key);
147
+ await updateEntries(offerRegistry(updated), [plan.target], filesFrom(registry, context), keys, options, { onCollision: conflictDialogue });
148
+ if (options.dryRun !== true) {
149
+ saveInstallManifest(plan.target.manifest, context.entrySchema);
150
+ await after?.(plan.target, keys);
151
+ }
152
+ }
153
+ }
154
+ finally {
155
+ registry.dispose();
156
+ }
157
+ }
158
+ /**
159
+ * @brief Removes installed entries, or whole groups, from every target and saves
160
+ * each manifest. Works from the manifests alone, so no source needs to be
161
+ * reachable; installed dependents are offered for removal too. With no names
162
+ * the user picks from what is installed.
163
+ *
164
+ * @param after - Gets the keys a target no longer holds, to clean up what the installer added beside the files
165
+ * @param targets - Install targets, each with its manifest.
166
+ * @param names - Names to remove; empty to pick from what is installed.
167
+ * @param options - Force flag and preset answers.
168
+ * @param context - What the installer calls itself.
169
+ */
170
+ export async function removeFromTargets(targets, names, options, context, after) {
171
+ const installed = installedAcross(targets, context.entrySchema);
172
+ // Unknown names stay in the list so the command reports them as "not installed".
173
+ const { keys, unknown } = resolveInstalled(names, installed);
174
+ const before = targets.map((t) => Object.keys(installedEntries(t.manifest, context.entrySchema)));
175
+ await removeEntries(installed, [...targets], [...keys, ...unknown], options, {
176
+ onNoValue: selectRemovalDialogue(context.noun),
177
+ onCascade: cascadeDialogue,
178
+ onCollision: removeChangedDialogue,
179
+ onIncomplete: incompleteDialogue,
180
+ });
181
+ for (const [index, target] of targets.entries()) {
182
+ saveInstallManifest(target.manifest, context.entrySchema);
183
+ const still = installedEntries(target.manifest, context.entrySchema);
184
+ await after?.(target, (before[index] ?? []).filter((key) => still[key] === undefined));
185
+ }
186
+ }
187
+ //# sourceMappingURL=installFromSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installFromSources.js","sourceRoot":"","sources":["../../../src/cli/commands/installFromSources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { BaseRegistry } from "../../registry/types";
2
+ import type { LSOptions } from "../types";
3
+ import type { OriginEntry } from "../../installer/origin";
4
+ import type { SourceRegistry } from "../../installer/sourceRegistry";
5
+ import type { RegisteredSource } from "../../sources/types";
6
+ /**
7
+ * @brief Lists the entries of a registry, grouped by each entry's `group`.
8
+ *
9
+ * @param registry - Entries to list, by key.
10
+ * @param options - Prints JSON when `json` is set.
11
+ */
12
+ export declare function lsEntries(registry: BaseRegistry, options?: LSOptions): void;
13
+ /**
14
+ * @brief Lists what each source of a source registry offers.
15
+ *
16
+ * A header per source
17
+ * with where it comes from when `sources` holds its spec, then its entries by group, `●` marking the ones
18
+ * `installed` holds and `◐` the ones an installed fork stands in for. With `json`, prints every offer as `{ key, ...entry }`.
19
+ *
20
+ * @param registry - Source registry to list.
21
+ * @param sources - Registered sources, for where each one comes from.
22
+ * @param installed - Installed entries by key, to mark; empty to mark nothing
23
+ * @param options - Prints JSON when `json` is set.
24
+ */
25
+ export declare function lsSourceRegistry<T extends OriginEntry>(registry: SourceRegistry<T>, sources: readonly RegisteredSource[], installed: Record<string, OriginEntry>, options?: LSOptions): void;
26
+ //# sourceMappingURL=ls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ls.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAE,SAAc,GAAG,IAAI,CAiB/E;AAcD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EACpD,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,OAAO,GAAE,SAAc,GACtB,IAAI,CA4BN"}
@@ -0,0 +1,85 @@
1
+ // packages/core/src/cli/commands/ls.ts
2
+ import chalk from "chalk";
3
+ import { c } from "../theme";
4
+ import { installedForks } from "../../installer/resolve";
5
+ import { offers } from "../../installer/sourceRegistry";
6
+ import { describeSource } from "../../sources/checkout";
7
+ /**
8
+ * @brief Lists the entries of a registry, grouped by each entry's `group`.
9
+ *
10
+ * @param registry - Entries to list, by key.
11
+ * @param options - Prints JSON when `json` is set.
12
+ */
13
+ export function lsEntries(registry, options = {}) {
14
+ if (options.json === true) {
15
+ console.log(JSON.stringify(registry, null, 2));
16
+ return;
17
+ }
18
+ const byGroup = {};
19
+ for (const [key, meta] of Object.entries(registry))
20
+ (byGroup[meta.group ?? "default"] ??= []).push(key);
21
+ for (const group of Object.keys(byGroup).sort()) {
22
+ console.log(c.header(group));
23
+ for (const key of (byGroup[group] ?? []).sort()) {
24
+ const meta = registry[key];
25
+ console.log(` ${c.key(key.padEnd(26))} ${chalk.dim(meta?.description ?? "")}`);
26
+ }
27
+ console.log();
28
+ }
29
+ }
30
+ /**
31
+ * @brief Formats the revision of the checkout an entry was read from.
32
+ *
33
+ * @param origin - Origin of the entry, or `undefined` when unknown.
34
+ * @returns ` at <commit>` or ` v<version>`, empty when neither is known.
35
+ */
36
+ function revision(origin) {
37
+ if (origin?.commit !== undefined)
38
+ return ` at ${origin.commit.slice(0, 7)}`;
39
+ if (origin?.version !== undefined)
40
+ return ` v${origin.version}`;
41
+ return "";
42
+ }
43
+ /**
44
+ * @brief Lists what each source of a source registry offers.
45
+ *
46
+ * A header per source
47
+ * with where it comes from when `sources` holds its spec, then its entries by group, `●` marking the ones
48
+ * `installed` holds and `◐` the ones an installed fork stands in for. With `json`, prints every offer as `{ key, ...entry }`.
49
+ *
50
+ * @param registry - Source registry to list.
51
+ * @param sources - Registered sources, for where each one comes from.
52
+ * @param installed - Installed entries by key, to mark; empty to mark nothing
53
+ * @param options - Prints JSON when `json` is set.
54
+ */
55
+ export function lsSourceRegistry(registry, sources, installed, options = {}) {
56
+ if (options.json === true) {
57
+ console.log(JSON.stringify(offers(registry).map(({ key, entry }) => ({ key, ...entry })), null, 2));
58
+ return;
59
+ }
60
+ const forks = installedForks([installed]);
61
+ for (const [name, store] of registry.sources) {
62
+ const listed = Object.entries(store.store.state).sort(([a], [b]) => a.localeCompare(b));
63
+ if (listed.length === 0)
64
+ continue;
65
+ const spec = sources.find((s) => s.name === name)?.spec;
66
+ const from = spec === undefined ? "" : describeSource(spec);
67
+ console.log(chalk.bold(`${name} ${chalk.dim(`${from}${revision(listed[0]?.[1].origin)}`)}`));
68
+ const byGroup = {};
69
+ for (const [key, entry] of listed)
70
+ (byGroup[entry.group ?? "default"] ??= []).push([key, entry]);
71
+ for (const group of Object.keys(byGroup).sort()) {
72
+ console.log(c.header(group));
73
+ for (const [key, entry] of byGroup[group] ?? []) {
74
+ const fork = forks[key];
75
+ const forkedHere = fork !== undefined && installed[fork]?.origin.source === name;
76
+ const mark = installed[key]?.origin.source === name ? chalk.green("●") : forkedHere ? chalk.yellow("◐") : " ";
77
+ const label = `${c.key(key)} ${chalk.dim(entry.version ?? "")}`;
78
+ const note = forkedHere ? `forked as ${fork}` : entry.description ?? "";
79
+ console.log(` ${mark} ${label.padEnd(40)} ${chalk.dim(note)}`);
80
+ }
81
+ }
82
+ console.log();
83
+ }
84
+ }
85
+ //# sourceMappingURL=ls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../../src/cli/commands/ls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { BaseRegistry } from "../../registry/types";
2
+ import type { InstallOptions, InstallTarget, RemoveDialogues } from "../types";
3
+ /**
4
+ * @brief Removes installed entries and drops them from each target's store. With no
5
+ * keys and an `onNoValue` dialogue the user picks from what is installed.
6
+ * Removal is all-or-nothing per entry: local changes prompt keep/remove
7
+ * through `onCollision` (kept entirely without it), and an entry with files
8
+ * missing on disk proceeds only when `onIncomplete` confirms. Installed
9
+ * dependents (via `registryDependencies`) are offered for cascade removal
10
+ * through `onCascade`. The caller saves each target's store after.
11
+ *
12
+ * @param registry - Entries the targets are checked against for dependents.
13
+ * @param targets - Destinations to remove from.
14
+ * @param keys - Keys to remove; empty to pick from what is installed.
15
+ * @param options - Force flag and preset answers.
16
+ * @param dialogues - Dialogues for the picker, cascade, local changes and missing files.
17
+ */
18
+ export declare function removeEntries(registry: BaseRegistry, targets: InstallTarget[], keys: string[], options?: InstallOptions, dialogues?: RemoveDialogues): Promise<void>;
19
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AAO5E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAwC/E;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,EAAE,EACxB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,cAAmB,EAC5B,SAAS,GAAE,eAAoB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA4Ef"}
@@ -0,0 +1,123 @@
1
+ // packages/core/src/cli/commands/remove.ts
2
+ import chalk from "chalk";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { entries as storeEntries, entryDependencies, get } from "../../registry/registry.selectors";
6
+ import { unregister } from "../../registry/registry.mutations";
7
+ import { recordedHashes, removeInstalledFiles } from "../../installer";
8
+ import { createInstallerIO } from "../../installer/io";
9
+ import { ConflictDecision } from "../../installer/types";
10
+ import { guardCancel } from "../../utils/prompt";
11
+ import { runDialogueValue } from "../dialogue";
12
+ import { c, lineSuccess, lineWarn, lineInfo } from "../theme";
13
+ const KeysSchema = z.array(z.string());
14
+ /**
15
+ * @brief Compares an entry's files on disk with the hashes recorded at install.
16
+ *
17
+ * @param entry - Installed entry whose files to check.
18
+ * @param installDir - Directory the files are in.
19
+ * @param io - Installer I/O that reads the files.
20
+ * @returns The files missing and the files modified on disk.
21
+ */
22
+ async function diskState(entry, installDir, io) {
23
+ const recorded = recordedHashes(entry);
24
+ const missing = [];
25
+ const modified = [];
26
+ for (const file of entry.files) {
27
+ const destPath = path.join(installDir, file.path);
28
+ if (!io.exists(destPath)) {
29
+ missing.push(file.path);
30
+ continue;
31
+ }
32
+ const recordedHash = recorded[file.path];
33
+ if (recordedHash !== undefined && (await io.hashFile(destPath)) !== recordedHash)
34
+ modified.push(file.path);
35
+ }
36
+ return { missing, modified };
37
+ }
38
+ /**
39
+ * @brief Removes installed entries and drops them from each target's store. With no
40
+ * keys and an `onNoValue` dialogue the user picks from what is installed.
41
+ * Removal is all-or-nothing per entry: local changes prompt keep/remove
42
+ * through `onCollision` (kept entirely without it), and an entry with files
43
+ * missing on disk proceeds only when `onIncomplete` confirms. Installed
44
+ * dependents (via `registryDependencies`) are offered for cascade removal
45
+ * through `onCascade`. The caller saves each target's store after.
46
+ *
47
+ * @param registry - Entries the targets are checked against for dependents.
48
+ * @param targets - Destinations to remove from.
49
+ * @param keys - Keys to remove; empty to pick from what is installed.
50
+ * @param options - Force flag and preset answers.
51
+ * @param dialogues - Dialogues for the picker, cascade, local changes and missing files.
52
+ */
53
+ export async function removeEntries(registry, targets, keys, options = {}, dialogues = {}) {
54
+ const io = createInstallerIO();
55
+ if (keys.length === 0 && dialogues.onNoValue !== undefined) {
56
+ const installed = [...new Set(targets.flatMap((t) => Object.keys(storeEntries(t.store))))].sort();
57
+ if (installed.length === 0) {
58
+ console.log(lineInfo("Nothing installed."));
59
+ return;
60
+ }
61
+ const choices = installed.map((key) => ({ value: key, label: c.key(key) }));
62
+ const picked = guardCancel(await runDialogueValue(dialogues.onNoValue, { keyChoices: choices }, options.answers));
63
+ keys = KeysSchema.parse(picked ?? []);
64
+ }
65
+ for (const target of targets) {
66
+ if (targets.length > 1)
67
+ console.log(c.header(target.label));
68
+ const targetKeys = Object.keys(storeEntries(target.store));
69
+ // Mutable queue so cascade confirmations can append dependents mid-loop.
70
+ const queue = [...keys];
71
+ let i = 0;
72
+ while (i < queue.length) {
73
+ const key = queue[i++];
74
+ const installed = get(target.store, key);
75
+ if (!installed) {
76
+ console.log(lineInfo(`${c.key(key)} — not installed`));
77
+ continue;
78
+ }
79
+ const dependents = entryDependencies(key, registry, targetKeys).filter((d) => !queue.includes(d));
80
+ if (dependents.length > 0) {
81
+ console.log(lineWarn(`${dependents.map((d) => c.key(d)).join(", ")} depend${dependents.length === 1 ? "s" : ""} on ${c.key(key)}.`));
82
+ if (dialogues.onCascade !== undefined) {
83
+ const also = await runDialogueValue(dialogues.onCascade, { key: c.key(key), dependents: dependents.map((d) => c.key(d)).join(", ") }, options.answers);
84
+ if (also === true)
85
+ queue.push(...dependents);
86
+ }
87
+ }
88
+ const state = await diskState(installed, target.installDir, io);
89
+ if (state.missing.length > 0 && dialogues.onIncomplete !== undefined) {
90
+ console.log(lineWarn(`${c.key(key)} is incomplete on disk — missing ${state.missing.map((f) => c.file(f)).join(", ")}`));
91
+ const proceed = await runDialogueValue(dialogues.onIncomplete, { key: c.key(key), target: c.target(target.label), missing: state.missing.map((f) => c.file(f)).join(", ") }, options.answers);
92
+ if (proceed !== true) {
93
+ console.log(lineInfo(`${c.key(key)} — skipped`));
94
+ continue;
95
+ }
96
+ }
97
+ let force = options.force ?? false;
98
+ if (state.modified.length > 0 && !force) {
99
+ console.log(lineWarn(`${c.key(key)} has local changes in ${state.modified.map((f) => c.file(f)).join(", ")}`));
100
+ if (dialogues.onCollision !== undefined) {
101
+ const answer = await runDialogueValue(dialogues.onCollision, { key: c.key(key), target: c.target(target.label) }, options.answers);
102
+ if (answer === ConflictDecision.Overwrite)
103
+ force = true;
104
+ }
105
+ if (!force) {
106
+ console.log(lineInfo(`${c.key(key)} — kept ${chalk.dim(`(use ${c.flag("-f")} to remove)`)}`));
107
+ continue;
108
+ }
109
+ }
110
+ const result = await removeInstalledFiles(installed.files, target.installDir, { force }, io);
111
+ if (result.removed.length > 0) {
112
+ console.log(lineSuccess(`Removed ${c.key(key)} ${chalk.dim(`(${result.removed.length} file${result.removed.length === 1 ? "" : "s"})`)}`));
113
+ }
114
+ if (result.kept.length === 0) {
115
+ unregister(target.store, key);
116
+ }
117
+ else {
118
+ console.log(lineInfo(`${c.key(key)} kept in manifest (some files were kept)`));
119
+ }
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/cli/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { z } from "zod";
2
+ import type { OriginEntry } from "../../installer/origin";
3
+ import type { ReadSource } from "../../installer/sourceRegistry";
4
+ import type { SourceRecord } from "../../sources/types";
5
+ import type { ManifestTarget } from "./installFromSources";
6
+ /**
7
+ * @brief What an installer tells the source commands about itself.
8
+ *
9
+ * @property bin - Installer binary, for the hints it prints, e.g. `g3n-skills`.
10
+ * @property noun - What one entry is called, e.g. `skill`.
11
+ * @property builtins - Sources built into the installer.
12
+ * @property entrySchema - Schema installed entries are parsed with.
13
+ * @property readSource - Reads the entries of a source checkout.
14
+ * @property projectRoot - Absolute root that local source paths and the `node_modules` lookup start from.
15
+ */
16
+ export interface SourceCommandContext<T extends OriginEntry> {
17
+ bin: string;
18
+ noun: string;
19
+ builtins: SourceRecord;
20
+ entrySchema: z.ZodType<T>;
21
+ readSource: ReadSource<T>;
22
+ projectRoot: string;
23
+ }
24
+ /**
25
+ * @brief Options that register a source.
26
+ *
27
+ * @property name - Name to register under; derived from the source when absent.
28
+ * @property ref - Branch or tag a git source is pinned to.
29
+ * @property absolutePaths - Store a local path absolute instead of relative to the project root, for a manifest every project shares.
30
+ */
31
+ export interface SourceAddOptions {
32
+ name?: string;
33
+ ref?: string;
34
+ absolutePaths?: boolean;
35
+ }
36
+ /**
37
+ * @brief Registers a git repository, npm package or local folder as a source in
38
+ * every manifest, after checking it can be read and offers at least one entry.
39
+ *
40
+ * @param manifests - Manifests to register the source in.
41
+ * @param input - The source as typed, e.g. `owner/repo`, `npm:@scope/pkg` or `./folder`
42
+ * @param options - Name, ref and path handling for the source.
43
+ * @param context - What the installer calls itself.
44
+ */
45
+ export declare function addSourceEntries<T extends OriginEntry>(manifests: readonly ManifestTarget[], input: string, options: SourceAddOptions, context: SourceCommandContext<T>): Promise<void>;
46
+ /**
47
+ * @brief Lists each manifest's sources, built-in ones first, with how many installed entries came from each.
48
+ *
49
+ * @param manifests - Manifests to list, one target each.
50
+ * @param options - Prints JSON when `json` is set.
51
+ * @param context - Built-in sources and the entry schema.
52
+ */
53
+ export declare function lsSources<T extends OriginEntry>(manifests: readonly ManifestTarget[], options: {
54
+ json?: boolean;
55
+ }, context: Pick<SourceCommandContext<T>, "builtins" | "entrySchema">): void;
56
+ /**
57
+ * @brief Unregisters a source from every manifest that has it. Refused for built-in
58
+ * sources, and while installed entries came from it unless `force` is set;
59
+ * forced, those entries stay installed but can no longer be updated.
60
+ *
61
+ * @param manifests - Manifests to unregister the source from.
62
+ * @param name - Name of the source to unregister.
63
+ * @param options - Force flag, keeping installed entries without updates.
64
+ * @param context - What the installer calls itself.
65
+ */
66
+ export declare function removeSourceEntries<T extends OriginEntry>(manifests: readonly ManifestTarget[], name: string, options: {
67
+ force?: boolean;
68
+ }, context: Pick<SourceCommandContext<T>, "bin" | "noun" | "builtins" | "entrySchema">): void;
69
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,WAAW;IACzD,GAAG,EAAU,MAAM,CAAC;IACpB,IAAI,EAAS,MAAM,CAAC;IACpB,QAAQ,EAAK,YAAY,CAAC;IAC1B,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACzB,UAAU,EAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAG,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,WAAW,EAC1D,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAC7C,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3B,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC,GACjE,IAAI,CAuBN;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,WAAW,EACvD,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAC5B,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC,GAClF,IAAI,CAmBN"}