@vltpkg/graph 1.4.0 → 1.6.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 (53) hide show
  1. package/README.md +62 -3
  2. package/dist/actual/load.js +24 -12
  3. package/dist/build.js +30 -5
  4. package/dist/dependencies.d.ts +11 -0
  5. package/dist/dependencies.js +47 -7
  6. package/dist/filter-nodes-by-query.d.ts +39 -0
  7. package/dist/filter-nodes-by-query.js +100 -0
  8. package/dist/graph.js +3 -0
  9. package/dist/ideal/append-nodes.js +29 -11
  10. package/dist/ideal/get-importer-specs.js +17 -7
  11. package/dist/ideal/remove-satisfied-specs.js +18 -10
  12. package/dist/index.d.ts +3 -0
  13. package/dist/index.js +2 -0
  14. package/dist/install.d.ts +25 -8
  15. package/dist/install.js +25 -1
  16. package/dist/lockfile/load-edges.js +10 -2
  17. package/dist/modifiers.d.ts +11 -0
  18. package/dist/modifiers.js +105 -21
  19. package/dist/reify/add-edge.d.ts +4 -0
  20. package/dist/reify/add-edge.js +13 -7
  21. package/dist/reify/build.d.ts +7 -0
  22. package/dist/reify/check-needed-build.d.ts +5 -0
  23. package/dist/reify/check-needed-build.js +13 -0
  24. package/dist/reify/delete-edge.js +16 -14
  25. package/dist/reify/delete-nodes.d.ts +2 -1
  26. package/dist/reify/delete-nodes.js +4 -2
  27. package/dist/reify/index.d.ts +2 -0
  28. package/dist/reify/index.js +11 -39
  29. package/dist/reify/relink-bins.d.ts +9 -0
  30. package/dist/reify/relink-bins.js +39 -0
  31. package/dist/reify/update-importers-package-json.d.ts +6 -1
  32. package/dist/reify/update-importers-package-json.js +16 -15
  33. package/dist/skills/dirs.d.ts +58 -0
  34. package/dist/skills/dirs.js +211 -0
  35. package/dist/skills/discover.d.ts +73 -0
  36. package/dist/skills/discover.js +238 -0
  37. package/dist/skills/gitignore.d.ts +18 -0
  38. package/dist/skills/gitignore.js +82 -0
  39. package/dist/skills/index.d.ts +124 -0
  40. package/dist/skills/index.js +254 -0
  41. package/dist/skills/lazy.d.ts +8 -0
  42. package/dist/skills/lazy.js +8 -0
  43. package/dist/skills/mask.d.ts +26 -0
  44. package/dist/skills/mask.js +43 -0
  45. package/dist/skills/mounts.d.ts +78 -0
  46. package/dist/skills/mounts.js +162 -0
  47. package/dist/uninstall.d.ts +27 -7
  48. package/dist/uninstall.js +25 -1
  49. package/dist/update.d.ts +24 -4
  50. package/dist/update.js +24 -1
  51. package/dist/visualization/mermaid-output.d.ts +8 -0
  52. package/dist/visualization/mermaid-output.js +25 -8
  53. package/package.json +21 -21
@@ -0,0 +1,162 @@
1
+ import { existsSync, lstatSync, readdirSync, readlinkSync, realpathSync, unlinkSync, } from 'node:fs';
2
+ import { dirname, join, relative, resolve, sep } from 'node:path';
3
+ import { baseDepID, isDepID, joinDepIDTuple, splitDepID, } from '@vltpkg/dep-id';
4
+ import { symlinkSyncMkdirp } from "../reify/symlink-sync.js";
5
+ import { gitignoreNames } from "./gitignore.js";
6
+ /** `lstat`, undefined when missing or unreadable (eg, ENOTDIR) */
7
+ export const lstat = (path) => {
8
+ try {
9
+ return lstatSync(path, { throwIfNoEntry: false });
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ };
15
+ /** Resolved path, lowercased on win32. */
16
+ export const norm = (p) => {
17
+ const r = resolve(p);
18
+ return process.platform === 'win32' ? r.toLowerCase() : r;
19
+ };
20
+ /** realpath, else the resolved path when missing. */
21
+ export const realOr = (p) => {
22
+ try {
23
+ return realpathSync(p);
24
+ }
25
+ catch {
26
+ return resolve(p);
27
+ }
28
+ };
29
+ /**
30
+ * Same real path? Case-insensitive on win32.
31
+ */
32
+ export const samePath = (a, b) => norm(realOr(a)) === norm(realOr(b));
33
+ const storeSeg = `${sep}node_modules${sep}.vlt${sep}`;
34
+ // resolved target of a symlink (or junction)
35
+ const linkTarget = (link) => {
36
+ if (!lstat(link)?.isSymbolicLink())
37
+ return undefined;
38
+ let raw = readlinkSync(link);
39
+ if (raw.startsWith('\\\\?\\'))
40
+ raw = raw.slice(4);
41
+ return resolve(dirname(link), raw);
42
+ };
43
+ /**
44
+ * The target of `link` if it is a symlink (or junction) pointing into
45
+ * a `node_modules/.vlt` store, otherwise undefined. Any store, not just
46
+ * the project's: win32 junctions are absolute, so they point to the old
47
+ * store after the project is moved or copied.
48
+ */
49
+ export const mountTarget = (link) => {
50
+ const target = linkTarget(link);
51
+ return target && norm(target).includes(storeSeg) ?
52
+ target
53
+ : undefined;
54
+ };
55
+ // the deepest workspace holding `target`
56
+ const workspaceOf = (target, workspaces) => {
57
+ const t = norm(realOr(target));
58
+ return workspaces
59
+ .filter(({ path }) => {
60
+ const p = norm(path);
61
+ return t === p || t.startsWith(p + sep);
62
+ })
63
+ .sort((a, b) => b.path.length - a.path.length)[0];
64
+ };
65
+ /**
66
+ * The DepID of the last `node_modules/.vlt/<DepID>` segment of a raw
67
+ * link target, if valid.
68
+ */
69
+ export const ownerOf = (target) => {
70
+ const parts = target.split(sep);
71
+ const seg = (i) => process.platform === 'win32' ? parts[i]?.toLowerCase() : parts[i];
72
+ for (let i = parts.length - 3; i >= 0; i--) {
73
+ if (seg(i) === 'node_modules' && seg(i + 1) === '.vlt') {
74
+ const id = parts[i + 2];
75
+ return isDepID(id) ? id : undefined;
76
+ }
77
+ }
78
+ return undefined;
79
+ };
80
+ /**
81
+ * One key per package: registry + name, else the DepID w/o its extra.
82
+ */
83
+ export const packageKey = (id) => {
84
+ const t = splitDepID(id);
85
+ if (t[0] !== 'registry')
86
+ return baseDepID(id);
87
+ const spec = t[2];
88
+ const at = spec.lastIndexOf('@');
89
+ return joinDepIDTuple([
90
+ 'registry',
91
+ t[1],
92
+ at > 0 ? spec.slice(0, at) : spec,
93
+ ]);
94
+ };
95
+ /**
96
+ * All vlt links in the given dirs: links into a `node_modules/.vlt`
97
+ * store, and links listed in the dir's `.gitignore` block (or `made`)
98
+ * into a workspace or dangling. Anything else is ignored.
99
+ */
100
+ export const readMounts = (scan, { workspaces = [], made, } = {}) => {
101
+ const mounts = [];
102
+ for (const dir of scan) {
103
+ let entries;
104
+ try {
105
+ entries = readdirSync(dir.real);
106
+ }
107
+ catch {
108
+ continue;
109
+ }
110
+ const listed = gitignoreNames(dir.real);
111
+ for (const name of entries) {
112
+ const link = join(dir.real, name);
113
+ const mount = `${dir.dir}/${name}`;
114
+ const m = { dir, name, mount, link };
115
+ const target = mountTarget(link);
116
+ if (target) {
117
+ mounts.push({ ...m, target, owner: ownerOf(target) });
118
+ continue;
119
+ }
120
+ const wsTarget = (listed.has(name) || made?.has(mount)) && linkTarget(link);
121
+ if (!wsTarget)
122
+ continue;
123
+ if (!existsSync(wsTarget)) {
124
+ mounts.push({ ...m, target: wsTarget });
125
+ continue;
126
+ }
127
+ const ws = workspaceOf(wsTarget, workspaces);
128
+ if (ws)
129
+ mounts.push({ ...m, target: wsTarget, owner: ws.id });
130
+ }
131
+ }
132
+ return mounts.sort((a, b) => a.mount.localeCompare(b.mount, 'en'));
133
+ };
134
+ /**
135
+ * Link a skill at `<dir>/<skill>`. `'unchanged'` if the entry already
136
+ * is the skill. Never touches anything not managed by vlt (a store
137
+ * link, or `owned`): returns `'conflict'` instead.
138
+ */
139
+ export const mountSkill = (skill, dir, owned = false) => {
140
+ const link = join(dir.real, skill.skill);
141
+ if (lstat(link)) {
142
+ if (samePath(link, skill.path))
143
+ return 'unchanged';
144
+ if (!owned && !mountTarget(link))
145
+ return 'conflict';
146
+ unlinkSync(link);
147
+ }
148
+ // junctions need no admin rights, but want an absolute target
149
+ if (process.platform === 'win32') {
150
+ symlinkSyncMkdirp(skill.path, link, 'junction');
151
+ }
152
+ else {
153
+ symlinkSyncMkdirp(relative(dir.real, skill.path), link, 'dir');
154
+ }
155
+ return 'linked';
156
+ };
157
+ /**
158
+ * Remove a vlt link. Its dir is kept.
159
+ */
160
+ export const unmountSkill = (m) => {
161
+ unlinkSync(m.link);
162
+ };
@@ -1,14 +1,34 @@
1
+ import type { DepID } from '@vltpkg/dep-id';
1
2
  import type { PackageInfoClient } from '@vltpkg/package-info';
2
3
  import type { LoadOptions } from './actual/load.ts';
3
4
  import type { RemoveImportersDependenciesMap } from './dependencies.ts';
5
+ import type { ReifyResult } from './reify/index.ts';
6
+ import type { Graph } from './graph.ts';
7
+ import type { LinkSkillsResult } from './skills/index.ts';
4
8
  export type UninstallOptions = LoadOptions & {
5
9
  packageInfo: PackageInfoClient;
6
10
  allowScripts: string;
11
+ /**
12
+ * DSS query: packages whose agent skills get linked into the
13
+ * project's agent skill dirs after uninstall. Selectors may end with
14
+ * `:skill()`. Unset or `:not(*)`: none.
15
+ */
16
+ allowSkills?: string;
17
+ /**
18
+ * agent skill dirs, relative to projectRoot. Unset: detect; `[]`:
19
+ * none
20
+ */
21
+ skillsDirs?: string[];
22
+ /** store dirs of these nodes are never removed, eg the running vlt */
23
+ keepNodes?: ReadonlySet<DepID>;
7
24
  };
8
- export declare const uninstall: (options: UninstallOptions, remove?: RemoveImportersDependenciesMap) => Promise<{
9
- graph: import("./graph.ts").Graph;
10
- diff: undefined;
11
- } | {
12
- graph: import("./graph.ts").Graph;
13
- diff: import("./reify/index.ts").ReifyResult;
14
- }>;
25
+ /**
26
+ * Result of {@link uninstall}.
27
+ */
28
+ export type UninstallResult = {
29
+ graph: Graph;
30
+ diff?: ReifyResult;
31
+ /** skill links added or removed, if any */
32
+ skills?: LinkSkillsResult;
33
+ };
34
+ export declare const uninstall: (options: UninstallOptions, remove?: RemoveImportersDependenciesMap) => Promise<UninstallResult>;
package/dist/uninstall.js CHANGED
@@ -8,7 +8,19 @@ import { RollbackRemove } from '@vltpkg/rollback-remove';
8
8
  import { Monorepo } from '@vltpkg/workspaces';
9
9
  import { existsSync, rmSync } from 'node:fs';
10
10
  import { resolve } from 'node:path';
11
+ import { assertQuery } from "./filter-nodes-by-query.js";
12
+ import { assertSkillsDirs } from "./skills/dirs.js";
11
13
  export const uninstall = async (options, remove) => {
14
+ // unset or `:not(*)`: no skills work at all, the skills code never
15
+ // loads
16
+ const allowSkills = options.allowSkills === ':not(*)' ?
17
+ undefined
18
+ : options.allowSkills;
19
+ // fail before uninstalling, not after
20
+ if (allowSkills) {
21
+ await assertQuery(allowSkills, 'allow-skills', ['skill']);
22
+ assertSkillsDirs(options.projectRoot, options.skillsDirs);
23
+ }
12
24
  const mainManifest = options.packageJson.read(options.projectRoot);
13
25
  const modifiers = GraphModifier.maybeLoad(options);
14
26
  const remover = new RollbackRemove();
@@ -17,6 +29,7 @@ export const uninstall = async (options, remove) => {
17
29
  packageJson: options.packageJson,
18
30
  scurry: options.scurry,
19
31
  });
32
+ let result;
20
33
  try {
21
34
  // Load the actual graph before building the ideal graph so that
22
35
  // manifest data from installed packages can be used to hydrate
@@ -55,6 +68,7 @@ export const uninstall = async (options, remove) => {
55
68
  ...options,
56
69
  remove,
57
70
  graph,
71
+ modifiers,
58
72
  })
59
73
  : undefined;
60
74
  saveImportersPackageJson?.();
@@ -71,7 +85,7 @@ export const uninstall = async (options, remove) => {
71
85
  modifiers,
72
86
  remover,
73
87
  });
74
- return { graph, diff };
88
+ result = { graph, diff };
75
89
  /* c8 ignore start */
76
90
  }
77
91
  catch (err) {
@@ -87,4 +101,14 @@ export const uninstall = async (options, remove) => {
87
101
  throw err;
88
102
  }
89
103
  /* c8 ignore stop */
104
+ // after the try: a link failure must not roll back the uninstall
105
+ if (!allowSkills)
106
+ return result;
107
+ const { linkSkills } = await import("./skills/index.js");
108
+ result.skills = await linkSkills({
109
+ ...options,
110
+ graph: result.graph,
111
+ target: allowSkills,
112
+ });
113
+ return result;
90
114
  };
package/dist/update.d.ts CHANGED
@@ -1,12 +1,32 @@
1
1
  import type { PackageInfoClient } from '@vltpkg/package-info';
2
2
  import type { LoadOptions } from './actual/load.ts';
3
3
  import { Graph } from './graph.ts';
4
+ import type { DepID } from '@vltpkg/dep-id';
5
+ import type { Diff } from './diff.ts';
6
+ import type { LinkSkillsResult } from './skills/index.ts';
4
7
  export type UpdateOptions = LoadOptions & {
5
8
  packageInfo: PackageInfoClient;
6
9
  allowScripts: string;
10
+ /**
11
+ * DSS query: packages whose agent skills get linked into the
12
+ * project's agent skill dirs after update. Selectors may end with
13
+ * `:skill()`. Unset or `:not(*)`: none.
14
+ */
15
+ allowSkills?: string;
16
+ /**
17
+ * agent skill dirs, relative to projectRoot. Unset: detect; `[]`:
18
+ * none
19
+ */
20
+ skillsDirs?: string[];
7
21
  };
8
- export declare const update: (options: UpdateOptions) => Promise<{
9
- buildQueue: import("@vltpkg/dep-id").DepID[] | undefined;
22
+ /**
23
+ * Result of {@link update}.
24
+ */
25
+ export type UpdateResult = {
26
+ buildQueue?: DepID[];
10
27
  graph: Graph;
11
- diff: import("./diff.ts").Diff;
12
- }>;
28
+ diff?: Diff;
29
+ /** skill links added or removed, if any */
30
+ skills?: LinkSkillsResult;
31
+ };
32
+ export declare const update: (options: UpdateOptions) => Promise<UpdateResult>;
package/dist/update.js CHANGED
@@ -12,6 +12,8 @@ import { RollbackRemove } from '@vltpkg/rollback-remove';
12
12
  import { Monorepo } from '@vltpkg/workspaces';
13
13
  import { existsSync, rmSync } from 'node:fs';
14
14
  import { resolve } from 'node:path';
15
+ import { assertQuery } from "./filter-nodes-by-query.js";
16
+ import { assertSkillsDirs } from "./skills/dirs.js";
15
17
  /**
16
18
  * Graph to update from. `-w` filtered: the lockfile (else installed)
17
19
  * graph minus the selected workspaces' deps, so only those re-resolve
@@ -45,6 +47,16 @@ const startingGraph = (options, monorepo) => {
45
47
  return graph;
46
48
  };
47
49
  export const update = async (options) => {
50
+ // unset or `:not(*)`: no skills work at all, the skills code never
51
+ // loads
52
+ const allowSkills = options.allowSkills === ':not(*)' ?
53
+ undefined
54
+ : options.allowSkills;
55
+ // fail before updating, not after
56
+ if (allowSkills) {
57
+ await assertQuery(allowSkills, 'allow-skills', ['skill']);
58
+ assertSkillsDirs(options.projectRoot, options.skillsDirs);
59
+ }
48
60
  let mainManifest = undefined;
49
61
  try {
50
62
  mainManifest = options.packageJson.read(options.projectRoot);
@@ -66,6 +78,7 @@ export const update = async (options) => {
66
78
  packageJson: options.packageJson,
67
79
  scurry: options.scurry,
68
80
  });
81
+ let result;
69
82
  try {
70
83
  const done = graphStep('build');
71
84
  const graph = await buildIdealFromStartingGraph({
@@ -94,7 +107,7 @@ export const update = async (options) => {
94
107
  remover,
95
108
  update: true,
96
109
  });
97
- return { buildQueue, graph, diff };
110
+ result = { buildQueue, graph, diff };
98
111
  /* c8 ignore start */
99
112
  }
100
113
  catch (err) {
@@ -110,4 +123,14 @@ export const update = async (options) => {
110
123
  throw err;
111
124
  }
112
125
  /* c8 ignore stop */
126
+ // after the try: a link failure must not roll back the update
127
+ if (!allowSkills)
128
+ return result;
129
+ const { linkSkills } = await import("./skills/index.js");
130
+ result.skills = await linkSkills({
131
+ ...options,
132
+ graph: result.graph,
133
+ target: allowSkills,
134
+ });
135
+ return result;
113
136
  };
@@ -1,9 +1,17 @@
1
+ import type { DepID } from '@vltpkg/dep-id';
1
2
  import type { EdgeLike, NodeLike } from '@vltpkg/types';
3
+ /** A leaf drawn under a graph node: node label, optional edge label. */
4
+ export type MermaidChild = {
5
+ label: string;
6
+ edge?: string;
7
+ };
2
8
  export type MermaidOutputGraph = {
3
9
  edges: EdgeLike[];
4
10
  importers: Set<NodeLike>;
5
11
  nodes: NodeLike[];
6
12
  highlightSelection?: boolean;
13
+ /** leaves to draw under included nodes (class `b`), eg: skills */
14
+ children?: Map<DepID, MermaidChild[]>;
7
15
  };
8
16
  /**
9
17
  * Generates a short identifier for a given index following the pattern:
@@ -1,6 +1,7 @@
1
1
  import { Edge } from "../edge.js";
2
2
  import { Node } from "../node.js";
3
3
  let missingCount = 0;
4
+ const escapeLabel = (s) => s.replaceAll('"', '#quot;').replaceAll('@', '#64;');
4
5
  const isSelected = (options, edge, node) => (!node || options.nodes.includes(node)) &&
5
6
  /* c8 ignore next */ (!edge || options.edges.includes(edge));
6
7
  /**
@@ -72,7 +73,7 @@ const nodeRef = (node, labeledNodes, depIdMapping, options) => {
72
73
  labeledNodes.add(node.id);
73
74
  return `${shortId}("${String(node).replaceAll('@', '#64;')}")${selectedClass}`;
74
75
  };
75
- function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, node, isImporter = false) {
76
+ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, leaves, node, isImporter = false) {
76
77
  if (seenNodes.has(node.id) || !includedItems.get(node)) {
77
78
  return '';
78
79
  }
@@ -87,8 +88,10 @@ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options
87
88
  ...node.edgesOut.values(),
88
89
  ...(node.workspaces?.values() ?? []),
89
90
  ];
90
- const edges = allEdges
91
- .map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, e))
91
+ const edges = [
92
+ leaves.get(node.id),
93
+ ...allEdges.map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, leaves, e)),
94
+ ]
92
95
  .filter(Boolean)
93
96
  .join('\n');
94
97
  // Only render node standalone for importers, others are rendered as part of edges
@@ -98,7 +101,7 @@ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options
98
101
  }
99
102
  return edges;
100
103
  }
101
- function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, edge) {
104
+ function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options, leaves, edge) {
102
105
  if (!includedItems.get(edge)) {
103
106
  return '';
104
107
  }
@@ -112,14 +115,14 @@ function parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, options
112
115
  // Label the target node first so that if it's referenced again later in the graph,
113
116
  // it will use the short identifier instead of repeating the full label.
114
117
  const toRef = nodeRef(edge.to, labeledNodes, depIdMapping, options);
115
- const childEdges = parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, edge.to);
118
+ const childEdges = parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, leaves, edge.to);
116
119
  return edgeResult + toRef + (childEdges ? '\n' + childEdges : '');
117
120
  }
118
121
  /**
119
122
  * Returns a mermaid string representation of the graph.
120
123
  */
121
124
  export function mermaidOutput(options) {
122
- const { edges, importers, nodes, highlightSelection } = options;
125
+ const { edges, importers, nodes, highlightSelection, children } = options;
123
126
  const seen = new Set();
124
127
  const includedItems = new Map();
125
128
  const traverse = new Set([...importers].map(i => ({ self: i, parent: undefined })));
@@ -157,14 +160,28 @@ export function mermaidOutput(options) {
157
160
  }
158
161
  // Create DepID to short identifier mapping
159
162
  const depIdMapping = createDepIdMapping(importers);
163
+ // leaf lines per node, ids after the graph's
164
+ const leaves = new Map();
165
+ let leafIndex = depIdMapping.size;
166
+ for (const [id, items] of children ?? []) {
167
+ const from = depIdMapping.get(id);
168
+ if (!from || !items.length)
169
+ continue;
170
+ leaves.set(id, items
171
+ .map(({ label, edge }) => `${from} -->${edge === undefined ? '' : `|"${escapeLabel(edge)}"|`} ${generateShortId(leafIndex++)}("${escapeLabel(label)}"):::b`)
172
+ .join('\n'));
173
+ }
160
174
  // Track nodes that have had their label printed (shared across all importers)
161
175
  const labeledNodes = new Set();
162
176
  // Track nodes that have been processed (shared across all importers to avoid duplicates)
163
177
  const seenNodes = new Set();
164
178
  const graphOutput = [...importers]
165
- .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, i, true))
179
+ .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, options, leaves, i, true))
166
180
  .filter(Boolean)
167
181
  .join('\n');
168
- const styleDefinition = highlightSelection ? '\nclassDef a fill:gold,color:#242424' : '';
182
+ const styleDefinition = (highlightSelection ?
183
+ '\nclassDef a fill:gold,color:#242424'
184
+ : '') +
185
+ (leaves.size ? '\nclassDef b fill:turquoise,color:#242424' : '');
169
186
  return 'flowchart TD\n' + graphOutput + styleDefinition;
170
187
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "1.4.0",
4
+ "version": "1.6.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -13,26 +13,26 @@
13
13
  "url": "http://vlt.sh"
14
14
  },
15
15
  "dependencies": {
16
- "@vltpkg/cmd-shim": "1.4.0",
17
- "@vltpkg/dep-id": "1.4.0",
18
- "@vltpkg/dss-breadcrumb": "1.4.0",
19
- "@vltpkg/error-cause": "1.4.0",
20
- "@vltpkg/fast-split": "1.4.0",
21
- "@vltpkg/graph-run": "1.4.0",
22
- "@vltpkg/init": "1.4.0",
23
- "@vltpkg/output": "1.4.0",
24
- "@vltpkg/package-info": "1.4.0",
25
- "@vltpkg/package-json": "1.4.0",
26
- "@vltpkg/pick-manifest": "1.4.0",
27
- "@vltpkg/query": "1.4.0",
28
- "@vltpkg/rollback-remove": "1.4.0",
29
- "@vltpkg/run": "1.4.0",
30
- "@vltpkg/satisfies": "1.4.0",
31
- "@vltpkg/security-archive": "1.4.0",
32
- "@vltpkg/spec": "1.4.0",
33
- "@vltpkg/types": "1.4.0",
34
- "@vltpkg/vlt-json": "1.4.0",
35
- "@vltpkg/workspaces": "1.4.0",
16
+ "@vltpkg/cmd-shim": "1.6.0",
17
+ "@vltpkg/dep-id": "1.6.0",
18
+ "@vltpkg/dss-breadcrumb": "1.6.0",
19
+ "@vltpkg/error-cause": "1.6.0",
20
+ "@vltpkg/fast-split": "1.6.0",
21
+ "@vltpkg/graph-run": "1.6.0",
22
+ "@vltpkg/init": "1.6.0",
23
+ "@vltpkg/output": "1.6.0",
24
+ "@vltpkg/package-info": "1.6.0",
25
+ "@vltpkg/package-json": "1.6.0",
26
+ "@vltpkg/pick-manifest": "1.6.0",
27
+ "@vltpkg/query": "1.6.0",
28
+ "@vltpkg/rollback-remove": "1.6.0",
29
+ "@vltpkg/run": "1.6.0",
30
+ "@vltpkg/satisfies": "1.6.0",
31
+ "@vltpkg/security-archive": "1.6.0",
32
+ "@vltpkg/spec": "1.6.0",
33
+ "@vltpkg/types": "1.6.0",
34
+ "@vltpkg/vlt-json": "1.6.0",
35
+ "@vltpkg/workspaces": "1.6.0",
36
36
  "path-scurry": "^2.0.1",
37
37
  "promise-call-limit": "^3.0.2"
38
38
  },