@microwiseai/snapshot 0.3.71 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/commands/clone-all.d.ts +21 -0
  2. package/dist/commands/clone-all.d.ts.map +1 -0
  3. package/dist/commands/clone-all.js +57 -0
  4. package/dist/commands/clone-all.js.map +1 -0
  5. package/dist/commands/install.d.ts +9 -1
  6. package/dist/commands/install.d.ts.map +1 -1
  7. package/dist/commands/install.js +219 -49
  8. package/dist/commands/install.js.map +1 -1
  9. package/dist/commands/license.js.map +1 -1
  10. package/dist/commands/list.d.ts +15 -0
  11. package/dist/commands/list.d.ts.map +1 -1
  12. package/dist/commands/list.js +21 -39
  13. package/dist/commands/list.js.map +1 -1
  14. package/dist/commands/publish.d.ts.map +1 -1
  15. package/dist/commands/publish.js +22 -0
  16. package/dist/commands/publish.js.map +1 -1
  17. package/dist/index.js +51 -29
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +15 -10
  21. package/dist/lib/config.js.map +1 -1
  22. package/dist/lib/gitlab.d.ts.map +1 -1
  23. package/dist/lib/gitlab.js +6 -8
  24. package/dist/lib/gitlab.js.map +1 -1
  25. package/dist/lib/transitive-resolver.js.map +1 -1
  26. package/dist/lib/types.d.ts +1 -0
  27. package/dist/lib/types.d.ts.map +1 -1
  28. package/dist/lib/version-validator.d.ts +28 -0
  29. package/dist/lib/version-validator.d.ts.map +1 -0
  30. package/dist/lib/version-validator.js +105 -0
  31. package/dist/lib/version-validator.js.map +1 -0
  32. package/dist/lib.js.map +1 -1
  33. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts +86 -1
  34. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.d.ts.map +1 -1
  35. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js +171 -5
  36. package/node_modules/@microwiseai/snapshot-dedup/dist/dedup.js.map +1 -1
  37. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts +1 -1
  38. package/node_modules/@microwiseai/snapshot-dedup/dist/index.d.ts.map +1 -1
  39. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js +4 -2
  40. package/node_modules/@microwiseai/snapshot-dedup/dist/index.js.map +1 -1
  41. package/node_modules/@microwiseai/snapshot-dedup/package.json +8 -2
  42. package/package.json +18 -4
  43. package/dist/commands/doctor.d.ts +0 -2
  44. package/dist/commands/doctor.d.ts.map +0 -1
  45. package/dist/commands/doctor.js +0 -37
  46. package/dist/commands/doctor.js.map +0 -1
  47. package/dist/commands/setup.d.ts +0 -5
  48. package/dist/commands/setup.d.ts.map +0 -1
  49. package/dist/commands/setup.js +0 -52
  50. package/dist/commands/setup.js.map +0 -1
  51. package/dist/lib/access-sync.test.d.ts +0 -2
  52. package/dist/lib/access-sync.test.d.ts.map +0 -1
  53. package/dist/lib/access-sync.test.js +0 -112
  54. package/dist/lib/access-sync.test.js.map +0 -1
  55. package/dist/lib/auth-flow.test.d.ts +0 -2
  56. package/dist/lib/auth-flow.test.d.ts.map +0 -1
  57. package/dist/lib/auth-flow.test.js +0 -265
  58. package/dist/lib/auth-flow.test.js.map +0 -1
  59. package/dist/lib/config.test.d.ts +0 -2
  60. package/dist/lib/config.test.d.ts.map +0 -1
  61. package/dist/lib/config.test.js +0 -151
  62. package/dist/lib/config.test.js.map +0 -1
  63. package/dist/lib/gitlab.test.d.ts +0 -2
  64. package/dist/lib/gitlab.test.d.ts.map +0 -1
  65. package/dist/lib/gitlab.test.js +0 -63
  66. package/dist/lib/gitlab.test.js.map +0 -1
  67. package/dist/lib/prerequisites.d.ts +0 -33
  68. package/dist/lib/prerequisites.d.ts.map +0 -1
  69. package/dist/lib/prerequisites.js +0 -123
  70. package/dist/lib/prerequisites.js.map +0 -1
  71. package/dist/lib/registry.d.ts +0 -3
  72. package/dist/lib/registry.d.ts.map +0 -1
  73. package/dist/lib/registry.js +0 -53
  74. package/dist/lib/registry.js.map +0 -1
  75. package/dist/lib/transitive-resolver.test.d.ts +0 -2
  76. package/dist/lib/transitive-resolver.test.d.ts.map +0 -1
  77. package/dist/lib/transitive-resolver.test.js +0 -279
  78. package/dist/lib/transitive-resolver.test.js.map +0 -1
@@ -37,6 +37,12 @@ export function loadInstallHistory(historyPath) {
37
37
  if (!data.packages || typeof data.packages !== 'object') {
38
38
  return { packages: {}, updatedAt: new Date().toISOString() };
39
39
  }
40
+ // Backward-compat migration: ensure every entry has a referencedBy set.
41
+ // Older history files (pre replace-mode / ADR 001) only stored `snapshot`
42
+ // (the first installer). Backfill referencedBy = [snapshot] so the safety
43
+ // check has data to work with. This runs in-memory on every load; it is
44
+ // persisted the next time saveInstallHistory() is called.
45
+ backfillReferencedBy(data);
40
46
  return data;
41
47
  }
42
48
  catch {
@@ -44,6 +50,19 @@ export function loadInstallHistory(historyPath) {
44
50
  return { packages: {}, updatedAt: new Date().toISOString() };
45
51
  }
46
52
  }
53
+ /**
54
+ * Ensure every history entry has a `referencedBy` array (migration/backfill).
55
+ * Missing/invalid → `[snapshot]` (or `[]` if snapshot also missing).
56
+ * Mutates the passed history in place.
57
+ */
58
+ export function backfillReferencedBy(history) {
59
+ for (const entry of Object.values(history.packages)) {
60
+ if (!Array.isArray(entry.referencedBy)) {
61
+ entry.referencedBy = entry.snapshot ? [entry.snapshot] : [];
62
+ }
63
+ }
64
+ return history;
65
+ }
47
66
  /**
48
67
  * Save install history to disk
49
68
  */
@@ -64,14 +83,64 @@ export function recordInstalledPackages(packages, snapshotName, historyPath) {
64
83
  const now = new Date().toISOString();
65
84
  for (const [name, version] of Object.entries(packages)) {
66
85
  const key = `${name}@${version}`;
67
- history.packages[key] = {
68
- snapshot: snapshotName,
69
- installedAt: now,
70
- version,
71
- };
86
+ const existing = history.packages[key];
87
+ if (existing) {
88
+ // Package already tracked: preserve the first-installer metadata
89
+ // (snapshot / installedAt) and just union this snapshot into referencedBy.
90
+ const refs = new Set(existing.referencedBy ?? (existing.snapshot ? [existing.snapshot] : []));
91
+ refs.add(snapshotName);
92
+ existing.referencedBy = Array.from(refs);
93
+ }
94
+ else {
95
+ history.packages[key] = {
96
+ snapshot: snapshotName,
97
+ installedAt: now,
98
+ version,
99
+ referencedBy: [snapshotName],
100
+ };
101
+ }
72
102
  }
73
103
  saveInstallHistory(history, historyPath);
74
104
  }
105
+ /**
106
+ * Record that a snapshot *references* a set of packages, without (re)installing
107
+ * them. Used for dedup-skipped packages: even when a package was already
108
+ * installed by another snapshot and is skipped, the referencing snapshot must
109
+ * still be recorded in referencedBy so replace-mode won't later remove a
110
+ * package that this snapshot depends on.
111
+ *
112
+ * Only touches packages that already exist in history (skipped ⇒ present).
113
+ * Non-existent keys are ignored (no phantom entries).
114
+ */
115
+ export function recordReferences(packages, snapshotName, historyPath) {
116
+ const history = loadInstallHistory(historyPath);
117
+ let changed = false;
118
+ for (const [name, version] of Object.entries(packages)) {
119
+ const key = `${name}@${version}`;
120
+ const existing = history.packages[key];
121
+ if (!existing)
122
+ continue;
123
+ const refs = new Set(existing.referencedBy ?? (existing.snapshot ? [existing.snapshot] : []));
124
+ if (!refs.has(snapshotName)) {
125
+ refs.add(snapshotName);
126
+ existing.referencedBy = Array.from(refs);
127
+ changed = true;
128
+ }
129
+ }
130
+ if (changed)
131
+ saveInstallHistory(history, historyPath);
132
+ }
133
+ /** Record references from a list of specs (e.g. ["@ist/sesh@0.3.33"]). */
134
+ export function recordReferencesFromSpecs(specs, snapshotName, historyPath) {
135
+ const packages = {};
136
+ for (const spec of specs) {
137
+ const atIdx = spec.lastIndexOf('@');
138
+ if (atIdx > 0) {
139
+ packages[spec.substring(0, atIdx)] = spec.substring(atIdx + 1);
140
+ }
141
+ }
142
+ recordReferences(packages, snapshotName, historyPath);
143
+ }
75
144
  /**
76
145
  * Record a list of installed package specs (e.g., ["@ist/sesh@0.3.33"])
77
146
  */
@@ -193,4 +262,101 @@ export function getInstalledCount(historyPath) {
193
262
  const history = loadInstallHistory(historyPath);
194
263
  return Object.keys(history.packages).length;
195
264
  }
265
+ /** Split a "name@version" history key into its package name. */
266
+ function keyToName(key) {
267
+ const atIdx = key.lastIndexOf('@');
268
+ return atIdx > 0 ? key.substring(0, atIdx) : key;
269
+ }
270
+ /** Snapshot names that reference (require) a given package@version. */
271
+ export function getReferencedBy(name, version, historyPath) {
272
+ const history = loadInstallHistory(historyPath);
273
+ const entry = history.packages[`${name}@${version}`];
274
+ if (!entry)
275
+ return [];
276
+ return entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []);
277
+ }
278
+ /**
279
+ * Compute the replace plan for installing a new version of `snapshotName`.
280
+ *
281
+ * @param snapshotName - the snapshot whose version is being replaced
282
+ * @param newSet - the new version's full package set (name -> version),
283
+ * including the extends chain (e.g. from collectAllPackages)
284
+ *
285
+ * Ordering note: history keys are `name@version`, so recording the new version
286
+ * (e.g. `a@2`) never overwrites the previous entry (`a@1`) — both coexist. This
287
+ * function therefore works correctly whether called before OR after recording,
288
+ * and the install flow calls it AFTER recordInstalledSpecs/recordReferences.
289
+ * That order is in fact preferable: referencedBy for shared packages is
290
+ * up to date, the new current-version entries are classified as "keep", and
291
+ * superseded old-version entries are detected as `stale`. The plan is computed
292
+ * by iterating referencedBy (not getPackagesBySnapshot).
293
+ */
294
+ export function computeReplacePlan(snapshotName, newSet, historyPath) {
295
+ const history = loadInstallHistory(historyPath); // backfilled → referencedBy present
296
+ const plan = { remove: [], keepShared: [], stale: [] };
297
+ for (const [key, entry] of Object.entries(history.packages)) {
298
+ const refs = new Set(entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []));
299
+ if (!refs.has(snapshotName))
300
+ continue; // not part of this snapshot's set → untouched
301
+ const name = keyToName(key);
302
+ const version = entry.version;
303
+ if (name in newSet) {
304
+ if (newSet[name] === version) {
305
+ continue; // still current in the new version → keep as-is
306
+ }
307
+ // Same package, different version → old entry superseded by the new install.
308
+ plan.stale.push({ name, version });
309
+ continue;
310
+ }
311
+ // Package name is gone from the new version → removal candidate.
312
+ const remaining = new Set(refs);
313
+ remaining.delete(snapshotName);
314
+ if (remaining.size === 0) {
315
+ plan.remove.push({ name, version }); // nobody else references it → safe to remove
316
+ }
317
+ else {
318
+ // Still referenced by another snapshot → keep installed (safety guard).
319
+ plan.keepShared.push({ name, version, remainingRefs: Array.from(remaining) });
320
+ }
321
+ }
322
+ return plan;
323
+ }
324
+ /**
325
+ * Apply the history side of a replace plan.
326
+ *
327
+ * @param removed - items whose uninstall SUCCEEDED (their history key is deleted)
328
+ * @param keepShared - items kept installed; `snapshotName` is dropped from refs
329
+ * @param stale - superseded old-version items; `snapshotName` dropped from refs
330
+ *
331
+ * For keepShared/stale entries, if dropping `snapshotName` leaves an empty
332
+ * referencedBy the history key is deleted too. Uninstall failures should be
333
+ * omitted from `removed` so their entries are preserved for a later retry.
334
+ */
335
+ export function applyReplaceHistory(snapshotName, removed, keepShared, stale, historyPath) {
336
+ const history = loadInstallHistory(historyPath);
337
+ // Hard-delete successfully uninstalled packages.
338
+ for (const item of removed) {
339
+ delete history.packages[`${item.name}@${item.version}`];
340
+ }
341
+ // Drop this snapshot from the refs of kept/superseded packages.
342
+ const dropRef = (name, version) => {
343
+ const key = `${name}@${version}`;
344
+ const entry = history.packages[key];
345
+ if (!entry)
346
+ return;
347
+ const refs = new Set(entry.referencedBy ?? (entry.snapshot ? [entry.snapshot] : []));
348
+ refs.delete(snapshotName);
349
+ if (refs.size === 0) {
350
+ delete history.packages[key];
351
+ }
352
+ else {
353
+ entry.referencedBy = Array.from(refs);
354
+ }
355
+ };
356
+ for (const item of keepShared)
357
+ dropRef(item.name, item.version);
358
+ for (const item of stale)
359
+ dropRef(item.name, item.version);
360
+ saveInstallHistory(history, historyPath);
361
+ }
196
362
  //# sourceMappingURL=dedup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dedup.js","sourceRoot":"","sources":["../src/dedup.ts"],"names":[],"mappings":"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"}
@@ -17,5 +17,5 @@
17
17
  * // After successful install, record them
18
18
  * recordInstalledPackages(result.toInstall, '@ist/full');
19
19
  */
20
- export { dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled, loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, clearInstallHistory, getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, type InstalledPackageEntry, type InstallHistory, type DedupResult, type DedupReport, type SkippedPackage, } from './dedup.js';
20
+ export { dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled, loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, recordReferences, recordReferencesFromSpecs, clearInstallHistory, backfillReferencedBy, getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, getReferencedBy, computeReplacePlan, applyReplaceHistory, type InstalledPackageEntry, type InstallHistory, type DedupResult, type DedupReport, type SkippedPackage, type ReplacePlan, type ReplaceRemovalItem, type ReplaceSharedItem, } from './dedup.js';
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAGlB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EAGnB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAGlB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAGlB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EAGpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAGf,kBAAkB,EAClB,mBAAmB,EAGnB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAC"}
@@ -21,7 +21,9 @@ export {
21
21
  // Core dedup functions
22
22
  dedup, dedupWithReport, dedupInstallBlock, isAlreadyInstalled,
23
23
  // History management
24
- loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, clearInstallHistory,
24
+ loadInstallHistory, saveInstallHistory, recordInstalledPackages, recordInstalledSpecs, recordReferences, recordReferencesFromSpecs, clearInstallHistory, backfillReferencedBy,
25
25
  // Utility functions
26
- getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, } from './dedup.js';
26
+ getPackagesBySnapshot, getInstalledCount, getHistoryFilePath, getReferencedBy,
27
+ // Replace mode (ADR 001)
28
+ computeReplacePlan, applyReplaceHistory, } from './dedup.js';
27
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO;AACL,uBAAuB;AACvB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB;AAElB,qBAAqB;AACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB;AAEnB,oBAAoB;AACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,GAQnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO;AACL,uBAAuB;AACvB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB;AAElB,qBAAqB;AACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB;AAEpB,oBAAoB;AACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe;AAEf,yBAAyB;AACzB,kBAAkB,EAClB,mBAAmB,GAWpB,MAAM,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microwiseai/snapshot-dedup",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Deduplication logic for Snapshot CLI - prevents reinstalling already-installed packages",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,10 +12,13 @@
12
12
  }
13
13
  },
14
14
  "scripts": {
15
- "build": "tsc",
15
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
16
+ "build": "tsc -p tsconfig.build.json",
16
17
  "dev": "tsc --watch",
18
+ "typecheck": "tsc --noEmit",
17
19
  "test": "vitest",
18
20
  "test:run": "vitest run",
21
+ "lint": "eslint src",
19
22
  "prepublishOnly": "npm run build"
20
23
  },
21
24
  "files": [
@@ -32,6 +35,9 @@
32
35
  "dependencies": {},
33
36
  "devDependencies": {
34
37
  "@types/node": "^20.11.0",
38
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
39
+ "@typescript-eslint/parser": "^8.57.0",
40
+ "eslint": "^10.0.3",
35
41
  "typescript": "^5.7.3",
36
42
  "vitest": "^4.0.18"
37
43
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microwiseai/snapshot",
3
- "version": "0.3.71",
3
+ "version": "0.5.0",
4
4
  "description": "CLI for installing IST Snapshot packages",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -19,8 +19,10 @@
19
19
  "snapshot": "./dist/index.js"
20
20
  },
21
21
  "scripts": {
22
- "build": "tsc",
22
+ "prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
23
+ "build": "tsc -p tsconfig.build.json",
23
24
  "dev": "tsc --watch",
25
+ "typecheck": "tsc --noEmit",
24
26
  "test": "vitest",
25
27
  "test:run": "vitest run",
26
28
  "lint": "eslint src",
@@ -40,10 +42,11 @@
40
42
  "author": "IST Team",
41
43
  "license": "MIT",
42
44
  "dependencies": {
45
+ "@gitdot/clone-lib": "^0.2.0",
43
46
  "@microwiseai/import-telemetry": "^0.1.0",
44
47
  "@microwiseai/license": "^0.1.4",
45
48
  "@microwiseai/skit": "^0.1.19",
46
- "@microwiseai/snapshot-dedup": "^0.1.0",
49
+ "@microwiseai/snapshot-dedup": "0.2.0",
47
50
  "@microwiseai/snapshot-parallel": "^0.1.0",
48
51
  "chalk": "^5.3.0",
49
52
  "commander": "^12.1.0",
@@ -67,5 +70,16 @@
67
70
  "@microwiseai/skit",
68
71
  "@microwiseai/snapshot-dedup",
69
72
  "@microwiseai/snapshot-parallel"
70
- ]
73
+ ],
74
+ "glpkg": {
75
+ "groups": {
76
+ "microwiseai": [
77
+ "@gitdot/clone-lib"
78
+ ]
79
+ }
80
+ },
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "git+https://gitlab.com/microwiseai/snapshot.git"
84
+ }
71
85
  }
@@ -1,2 +0,0 @@
1
- export declare function doctorCommand(): Promise<void>;
2
- //# sourceMappingURL=doctor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCnD"}
@@ -1,37 +0,0 @@
1
- import chalk from 'chalk';
2
- import { checkPrerequisites, MINIMAL_PREREQUISITES } from '../lib/prerequisites.js';
3
- export async function doctorCommand() {
4
- console.log(chalk.blue('Checking prerequisites...\n'));
5
- const results = checkPrerequisites(MINIMAL_PREREQUISITES);
6
- const missing = results.filter(r => !r.installed);
7
- // Print results
8
- for (const r of results) {
9
- const icon = r.installed ? chalk.green('✅') : chalk.red('❌');
10
- console.log(` ${icon} ${r.name}`);
11
- if (!r.installed) {
12
- console.log(chalk.gray(` Required by: ${r.requiredBy.join(', ')}`));
13
- if (r.installCommand) {
14
- console.log(chalk.gray(` Fix: ${r.installCommand}`));
15
- }
16
- if (r.guide) {
17
- console.log(chalk.gray(` ${r.guide}`));
18
- }
19
- }
20
- }
21
- console.log('');
22
- if (missing.length === 0) {
23
- console.log(chalk.green('All prerequisites satisfied! ✓'));
24
- }
25
- else {
26
- console.log(chalk.yellow(`${missing.length} issue(s) found.`));
27
- const fixable = missing.filter(r => r.installCommand);
28
- if (fixable.length > 0) {
29
- console.log(chalk.gray(`Run 'snapshot setup' to install ${fixable.length} missing prerequisite(s).`));
30
- }
31
- const manual = missing.filter(r => !r.installCommand);
32
- if (manual.length > 0) {
33
- console.log(chalk.gray(`${manual.length} require manual action (see above).`));
34
- }
35
- }
36
- }
37
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAoB,MAAM,yBAAyB,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAElD,gBAAgB;IAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,OAAO,CAAC,MAAM,2BAA2B,CAAC,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,qCAAqC,CAAC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,5 +0,0 @@
1
- export declare function setupCommand(options: {
2
- auto?: boolean;
3
- dryRun?: boolean;
4
- }): Promise<void>;
5
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD/F"}
@@ -1,52 +0,0 @@
1
- import chalk from 'chalk';
2
- import { checkPrerequisites, installPrerequisite, MINIMAL_PREREQUISITES } from '../lib/prerequisites.js';
3
- export async function setupCommand(options) {
4
- console.log(chalk.blue('Setting up prerequisites...\n'));
5
- const results = checkPrerequisites(MINIMAL_PREREQUISITES);
6
- const missing = results.filter(r => !r.installed);
7
- if (missing.length === 0) {
8
- console.log(chalk.green('All prerequisites already satisfied! ✓'));
9
- return;
10
- }
11
- console.log(`Found ${missing.length} missing prerequisite(s):\n`);
12
- for (const item of missing) {
13
- if (!item.installCommand) {
14
- // Manual action required
15
- console.log(` ${chalk.yellow('⚠')} ${item.name}: requires manual action`);
16
- console.log(chalk.gray(` ${item.guide || 'No instructions available.'}`));
17
- console.log('');
18
- continue;
19
- }
20
- if (options.dryRun) {
21
- console.log(` ${chalk.cyan('→')} Would install: ${item.name}`);
22
- console.log(chalk.gray(` Command: ${item.installCommand}`));
23
- console.log('');
24
- continue;
25
- }
26
- console.log(` ${chalk.cyan('→')} Installing: ${item.name}...`);
27
- const result = installPrerequisite(item);
28
- if (result.success) {
29
- console.log(` ${chalk.green('✅')} ${item.name} installed`);
30
- }
31
- else {
32
- console.log(` ${chalk.red('❌')} ${item.name} failed: ${result.error}`);
33
- }
34
- console.log('');
35
- }
36
- // Re-check
37
- console.log(chalk.blue('Verifying...\n'));
38
- const recheck = checkPrerequisites(MINIMAL_PREREQUISITES);
39
- const stillMissing = recheck.filter(r => !r.installed);
40
- if (stillMissing.length === 0) {
41
- console.log(chalk.green('All prerequisites satisfied! ✓'));
42
- }
43
- else {
44
- console.log(chalk.yellow(`${stillMissing.length} still missing:`));
45
- for (const r of stillMissing) {
46
- console.log(` ${chalk.red('❌')} ${r.name}`);
47
- if (r.guide)
48
- console.log(chalk.gray(` ${r.guide}`));
49
- }
50
- }
51
- }
52
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=access-sync.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-sync.test.d.ts","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":""}
@@ -1,112 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import { syncPackageAccess } from './access-sync.js';
3
- import { LICENSE_API_URL } from './config.js';
4
- /**
5
- * Unit tests for access-sync.
6
- *
7
- * `fetch` is fully mocked — no real license-api write calls are made.
8
- * Transitive resolution is disabled so the only network surface is the
9
- * idempotent upsert (POST /admin/package-access/with-deps).
10
- */
11
- const UPSERT_URL = `${LICENSE_API_URL}/admin/package-access/with-deps`;
12
- function makeFetchMock() {
13
- return vi.fn(async () => ({
14
- ok: true,
15
- json: async () => ({}),
16
- }));
17
- }
18
- /** Extract parsed bodies of every upsert call recorded by the fetch mock. */
19
- function upsertBodies(fetchMock) {
20
- return fetchMock.mock.calls
21
- .filter((call) => call[0] === UPSERT_URL)
22
- .map((call) => JSON.parse(call[1].body));
23
- }
24
- describe('syncPackageAccess - snapshot own package registration', () => {
25
- let originalFetch;
26
- beforeEach(() => {
27
- originalFetch = globalThis.fetch;
28
- process.env.LICENSE_API_ADMIN_KEY = 'test-admin-key';
29
- vi.spyOn(console, 'log').mockImplementation(() => { });
30
- vi.spyOn(console, 'error').mockImplementation(() => { });
31
- });
32
- afterEach(() => {
33
- globalThis.fetch = originalFetch;
34
- delete process.env.LICENSE_API_ADMIN_KEY;
35
- vi.restoreAllMocks();
36
- });
37
- it("registers the snapshot's own package with its declared access level", async () => {
38
- const fetchMock = makeFetchMock();
39
- globalThis.fetch = fetchMock;
40
- const snapshot = {
41
- name: '@ist/testing',
42
- version: '0.1.0',
43
- access: 'authenticated',
44
- install: {
45
- 'gitlab-install': {
46
- '@ist/member-a': '1.0.0',
47
- },
48
- },
49
- };
50
- const result = await syncPackageAccess(snapshot, { includeTransitive: false });
51
- const bodies = upsertBodies(fetchMock);
52
- const self = bodies.find((b) => b.scope === '@ist' && b.packageName === 'testing');
53
- expect(self).toBeDefined();
54
- expect(self.accessLevel).toBe('authenticated');
55
- // Snapshot's own package has no parent.
56
- expect(self.parentPackage).toBeUndefined();
57
- // Still uses the idempotent with-deps upsert with empty dependencies.
58
- expect(self.dependencies).toEqual([]);
59
- // Member package is registered too and points to the snapshot as parent.
60
- const member = bodies.find((b) => b.packageName === 'member-a');
61
- expect(member).toBeDefined();
62
- expect(member.parentPackage).toBe('@ist/testing');
63
- expect(result.registered).toContain('@ist/testing');
64
- });
65
- it('maps public access for the snapshot own package', async () => {
66
- const fetchMock = makeFetchMock();
67
- globalThis.fetch = fetchMock;
68
- const snapshot = {
69
- name: '@ist/free',
70
- version: '1.0.0',
71
- access: 'public',
72
- install: {},
73
- };
74
- await syncPackageAccess(snapshot, { includeTransitive: false });
75
- const self = upsertBodies(fetchMock).find((b) => b.packageName === 'free');
76
- expect(self).toBeDefined();
77
- expect(self.accessLevel).toBe('public');
78
- });
79
- it('maps licensed access and propagates productId for the snapshot own package', async () => {
80
- const fetchMock = makeFetchMock();
81
- globalThis.fetch = fetchMock;
82
- const snapshot = {
83
- name: '@ist/pro',
84
- version: '1.0.0',
85
- access: { type: 'licensed', productId: 'prod_123' },
86
- install: {},
87
- };
88
- await syncPackageAccess(snapshot, { includeTransitive: false });
89
- const self = upsertBodies(fetchMock).find((b) => b.packageName === 'pro');
90
- expect(self).toBeDefined();
91
- expect(self.accessLevel).toBe('licensed');
92
- expect(self.requiredProductIds).toBe('prod_123');
93
- });
94
- it('does not duplicate when the snapshot package also appears as a member', async () => {
95
- const fetchMock = makeFetchMock();
96
- globalThis.fetch = fetchMock;
97
- const snapshot = {
98
- name: '@ist/testing',
99
- version: '0.1.0',
100
- access: 'authenticated',
101
- install: {
102
- 'gitlab-install': {
103
- '@ist/testing': '0.1.0',
104
- },
105
- },
106
- };
107
- await syncPackageAccess(snapshot, { includeTransitive: false });
108
- const selfHits = upsertBodies(fetchMock).filter((b) => b.scope === '@ist' && b.packageName === 'testing');
109
- expect(selfHits).toHaveLength(1);
110
- });
111
- });
112
- //# sourceMappingURL=access-sync.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"access-sync.test.js","sourceRoot":"","sources":["../../src/lib/access-sync.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=auth-flow.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-flow.test.d.ts","sourceRoot":"","sources":["../../src/lib/auth-flow.test.ts"],"names":[],"mappings":""}