@hashicorp/kits 0.1.3 → 0.1.5
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.
- package/README.md +175 -34
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +29 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +820 -161
- package/dist/cli/install.js.map +1 -1
- package/dist/cli/list.d.ts.map +1 -1
- package/dist/cli/list.js +8 -6
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/types.d.ts +17 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js +1 -0
- package/dist/cli/types.js.map +1 -1
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +300 -38
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/cli/upgrade.d.ts.map +1 -1
- package/dist/cli/upgrade.js +334 -105
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/validate.js +5 -5
- package/dist/cli/validate.js.map +1 -1
- package/dist/core/types.d.ts +4 -4
- package/dist/core/upgrade-executor.d.ts +7 -7
- package/dist/core/upgrade-executor.d.ts.map +1 -1
- package/dist/core/upgrade-executor.js +17 -17
- package/dist/core/upgrade-executor.js.map +1 -1
- package/dist/discovery/kit-scanner.d.ts +3 -3
- package/dist/discovery/kit-scanner.js +10 -10
- package/dist/discovery/kit-scanner.js.map +1 -1
- package/dist/discovery/types.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/lockfile/index.d.ts +79 -0
- package/dist/lockfile/index.d.ts.map +1 -0
- package/dist/lockfile/index.js +203 -0
- package/dist/lockfile/index.js.map +1 -0
- package/dist/lockfile/read.d.ts +32 -0
- package/dist/lockfile/read.d.ts.map +1 -0
- package/dist/lockfile/read.js +88 -0
- package/dist/lockfile/read.js.map +1 -0
- package/dist/lockfile/types.d.ts +126 -0
- package/dist/lockfile/types.d.ts.map +1 -0
- package/dist/lockfile/types.js +44 -0
- package/dist/lockfile/types.js.map +1 -0
- package/dist/{manifest → lockfile}/upgrade-check.d.ts +5 -5
- package/dist/lockfile/upgrade-check.d.ts.map +1 -0
- package/dist/{manifest → lockfile}/upgrade-check.js +11 -9
- package/dist/lockfile/upgrade-check.js.map +1 -0
- package/dist/lockfile/utils.d.ts +35 -0
- package/dist/lockfile/utils.d.ts.map +1 -0
- package/dist/lockfile/utils.js +57 -0
- package/dist/lockfile/utils.js.map +1 -0
- package/dist/lockfile/write.d.ts +44 -0
- package/dist/lockfile/write.d.ts.map +1 -0
- package/dist/lockfile/write.js +77 -0
- package/dist/lockfile/write.js.map +1 -0
- package/dist/manifest/hash.d.ts +7 -0
- package/dist/manifest/hash.d.ts.map +1 -0
- package/dist/manifest/hash.js +30 -0
- package/dist/manifest/hash.js.map +1 -0
- package/dist/manifest/index.d.ts +8 -77
- package/dist/manifest/index.d.ts.map +1 -1
- package/dist/manifest/index.js +6 -197
- package/dist/manifest/index.js.map +1 -1
- package/dist/manifest/read.d.ts +4 -24
- package/dist/manifest/read.d.ts.map +1 -1
- package/dist/manifest/read.js +22 -46
- package/dist/manifest/read.js.map +1 -1
- package/dist/manifest/types.d.ts +17 -109
- package/dist/manifest/types.d.ts.map +1 -1
- package/dist/manifest/types.js +8 -37
- package/dist/manifest/types.js.map +1 -1
- package/dist/manifest/utils.d.ts +1 -27
- package/dist/manifest/utils.d.ts.map +1 -1
- package/dist/manifest/utils.js +1 -28
- package/dist/manifest/utils.js.map +1 -1
- package/dist/manifest/write.d.ts +3 -34
- package/dist/manifest/write.d.ts.map +1 -1
- package/dist/manifest/write.js +5 -45
- package/dist/manifest/write.js.map +1 -1
- package/dist/resolution/index.d.ts +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +23 -13
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/primitives-registry.d.ts +1 -1
- package/dist/resolution/primitives-registry.js +2 -2
- package/dist/resolution/primitives-registry.js.map +1 -1
- package/dist/tui/kit-select.d.ts.map +1 -1
- package/dist/tui/kit-select.js +4 -5
- package/dist/tui/kit-select.js.map +1 -1
- package/dist/tui/types.d.ts +1 -0
- package/dist/tui/types.d.ts.map +1 -1
- package/dist/tui/upgrade-select.d.ts +1 -1
- package/dist/tui/upgrade-select.d.ts.map +1 -1
- package/dist/tui/upgrade-select.js +15 -4
- package/dist/tui/upgrade-select.js.map +1 -1
- package/dist/validation/validate-kits.d.ts +2 -2
- package/dist/validation/validate-kits.js +4 -4
- package/dist/validation/validate-kits.js.map +1 -1
- package/package.json +1 -1
- package/schemas/kit.schema.json +2 -2
- package/schemas/{manifest.schema.json → kits-lock.schema.json} +34 -8
- package/schemas/kits-manifest.schema.json +95 -0
- package/schemas/{kits.schema.json → kits-registry.schema.json} +3 -3
- package/schemas/{primitives.schema.json → primitives-registry.schema.json} +2 -2
- package/dist/manifest/upgrade-check.d.ts.map +0 -1
- package/dist/manifest/upgrade-check.js.map +0 -1
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lockfile module for the kit installer.
|
|
3
|
+
*
|
|
4
|
+
* This module handles reading, writing, and managing the kits lockfile
|
|
5
|
+
* that tracks installed kits and primitives across harnesses.
|
|
6
|
+
*/
|
|
7
|
+
import { readLockfile, getOrCreateLockfile } from "./read.js";
|
|
8
|
+
import { writeLockfile } from "./write.js";
|
|
9
|
+
export { LOCKFILE_VERSION, GLOBAL_LOCKFILE_PATH, PROJECT_LOCKFILE_DIR, PROJECT_LOCKFILE_FILENAME, createEmptyLockfile, } from "./types.js";
|
|
10
|
+
// Re-export read functions
|
|
11
|
+
export { readLockfile, getOrCreateLockfile, LockfileReadError } from "./read.js";
|
|
12
|
+
// Re-export write functions
|
|
13
|
+
export { writeLockfile, LockfileWriteError } from "./write.js";
|
|
14
|
+
// Re-export scope-aware path functions (renamed for clarity)
|
|
15
|
+
export { getLockfilePathForScope, getLockfileDirForScope } from "./write.js";
|
|
16
|
+
// Re-export upgrade check functions
|
|
17
|
+
export { checkForUpgrades, checkForUpgradesInScope, createUpgradeSummary, } from "./upgrade-check.js";
|
|
18
|
+
// Re-export utils
|
|
19
|
+
export { expandPath, getLockfilePath, getLockfileDir, ensureLockfileDir, } from "./utils.js";
|
|
20
|
+
/**
|
|
21
|
+
* Record a kit installation in the lockfile.
|
|
22
|
+
*
|
|
23
|
+
* @param harness - The harness name
|
|
24
|
+
* @param kit - The kit definition
|
|
25
|
+
* @param primitives - The resolved primitives that were installed
|
|
26
|
+
* @param source - The source repository
|
|
27
|
+
* @param scope - Installation scope (global or project)
|
|
28
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
29
|
+
*/
|
|
30
|
+
export async function recordInstallation(harness, kit, primitives, source, scope = "global", projectRoot, installAs) {
|
|
31
|
+
const lockfile = await getOrCreateLockfile(scope, projectRoot);
|
|
32
|
+
const kitInstanceName = installAs ?? kit.name;
|
|
33
|
+
// Ensure harness entry exists
|
|
34
|
+
if (!lockfile.harnesses[harness]) {
|
|
35
|
+
lockfile.harnesses[harness] = { kits: {} };
|
|
36
|
+
}
|
|
37
|
+
// Convert resolved primitives to installed primitives
|
|
38
|
+
const installedPrimitives = primitives.map((p) => {
|
|
39
|
+
const installed = {
|
|
40
|
+
name: p.name,
|
|
41
|
+
type: p.type,
|
|
42
|
+
namespacedName: `${kitInstanceName}.${p.name}`,
|
|
43
|
+
isInline: p.isInline,
|
|
44
|
+
installedPath: p.sourcePath,
|
|
45
|
+
};
|
|
46
|
+
// Only add optional fields if they have values
|
|
47
|
+
if (p.resolvedVersion) {
|
|
48
|
+
installed.version = p.resolvedVersion;
|
|
49
|
+
}
|
|
50
|
+
const versionSpec = p.ref ? extractVersionSpec(p.ref) : undefined;
|
|
51
|
+
if (versionSpec) {
|
|
52
|
+
installed.versionSpec = versionSpec;
|
|
53
|
+
}
|
|
54
|
+
return installed;
|
|
55
|
+
});
|
|
56
|
+
// Record the kit installation
|
|
57
|
+
const harnessEntry = lockfile.harnesses[harness];
|
|
58
|
+
if (harnessEntry) {
|
|
59
|
+
harnessEntry.kits[kitInstanceName] = {
|
|
60
|
+
name: kit.name,
|
|
61
|
+
installAs: kitInstanceName,
|
|
62
|
+
version: kit.version,
|
|
63
|
+
installedAt: new Date().toISOString(),
|
|
64
|
+
source,
|
|
65
|
+
primitives: installedPrimitives,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Update source
|
|
69
|
+
lockfile.source = source;
|
|
70
|
+
await writeLockfile(lockfile, scope, projectRoot);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Remove a kit installation from the lockfile.
|
|
74
|
+
*
|
|
75
|
+
* @param harness - The harness name
|
|
76
|
+
* @param kitName - The kit instance name (installAs) to remove
|
|
77
|
+
* @param scope - Installation scope (global or project)
|
|
78
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
79
|
+
* @returns The removed kit info or null if not found
|
|
80
|
+
*/
|
|
81
|
+
export async function removeInstallation(harness, kitName, scope = "global", projectRoot) {
|
|
82
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
83
|
+
if (!lockfile) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const harnessEntry = lockfile.harnesses[harness];
|
|
87
|
+
if (!harnessEntry) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const kit = harnessEntry.kits[kitName];
|
|
91
|
+
if (!kit) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
// Remove the kit
|
|
95
|
+
delete harnessEntry.kits[kitName];
|
|
96
|
+
// Clean up empty harness entries
|
|
97
|
+
if (Object.keys(harnessEntry.kits).length === 0) {
|
|
98
|
+
delete lockfile.harnesses[harness];
|
|
99
|
+
}
|
|
100
|
+
await writeLockfile(lockfile, scope, projectRoot);
|
|
101
|
+
return kit;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get all installed kits, optionally filtered by harness.
|
|
105
|
+
*
|
|
106
|
+
* @param scope - Installation scope (global or project)
|
|
107
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
108
|
+
* @param harness - Optional harness name to filter by
|
|
109
|
+
* @returns Array of installed kit info with harness context
|
|
110
|
+
*/
|
|
111
|
+
export async function getInstalledKits(scope = "global", projectRoot, harness) {
|
|
112
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
113
|
+
if (!lockfile) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
const result = [];
|
|
117
|
+
for (const [harnessName, harnessEntry] of Object.entries(lockfile.harnesses)) {
|
|
118
|
+
if (harness && harnessName !== harness) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (harnessEntry) {
|
|
122
|
+
for (const [kitName, kit] of Object.entries(harnessEntry.kits)) {
|
|
123
|
+
result.push({
|
|
124
|
+
harness: harnessName,
|
|
125
|
+
kitName,
|
|
126
|
+
kit,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Check if a kit is installed in any harness.
|
|
135
|
+
*
|
|
136
|
+
* @param kitName - The kit instance name (installAs) to check
|
|
137
|
+
* @param scope - Installation scope (global or project)
|
|
138
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
139
|
+
* @returns True if the kit is installed somewhere
|
|
140
|
+
*/
|
|
141
|
+
export async function isKitInstalled(kitName, scope = "global", projectRoot) {
|
|
142
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
143
|
+
if (!lockfile) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
for (const harness of Object.values(lockfile.harnesses)) {
|
|
147
|
+
if (harness && kitName in harness.kits) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Check if a kit is installed in a specific harness.
|
|
155
|
+
*
|
|
156
|
+
* @param harness - The harness name
|
|
157
|
+
* @param kitName - The kit instance name (installAs) to check
|
|
158
|
+
* @param scope - Installation scope (global or project)
|
|
159
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
160
|
+
* @returns True if the kit is installed in the harness
|
|
161
|
+
*/
|
|
162
|
+
export async function isKitInstalledInHarness(harness, kitName, scope = "global", projectRoot) {
|
|
163
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
164
|
+
if (!lockfile) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const harnessEntry = lockfile.harnesses[harness];
|
|
168
|
+
return harnessEntry ? kitName in harnessEntry.kits : false;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get a specific installed kit.
|
|
172
|
+
*
|
|
173
|
+
* @param harness - The harness name
|
|
174
|
+
* @param kitName - The kit instance name (installAs)
|
|
175
|
+
* @param scope - Installation scope (global or project)
|
|
176
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
177
|
+
* @returns The installed kit or null if not found
|
|
178
|
+
*/
|
|
179
|
+
export async function getInstalledKit(harness, kitName, scope = "global", projectRoot) {
|
|
180
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
181
|
+
if (!lockfile) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const harnessEntry = lockfile.harnesses[harness];
|
|
185
|
+
if (!harnessEntry) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return harnessEntry.kits[kitName] ?? null;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Extract version spec from a ref string.
|
|
192
|
+
*
|
|
193
|
+
* @param ref - The ref string (e.g., "tf-plan@^1.0.0")
|
|
194
|
+
* @returns The version spec portion or undefined
|
|
195
|
+
*/
|
|
196
|
+
function extractVersionSpec(ref) {
|
|
197
|
+
const atIndex = ref.indexOf("@");
|
|
198
|
+
if (atIndex === -1) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
return ref.slice(atIndex + 1);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lockfile/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lockfile read operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality to read and validate the kits lockfile.
|
|
5
|
+
*/
|
|
6
|
+
import type { InstallationScope } from "../core/types.js";
|
|
7
|
+
import type { KitsLockfile } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Error thrown when lockfile read fails.
|
|
10
|
+
*/
|
|
11
|
+
export declare class LockfileReadError extends Error {
|
|
12
|
+
readonly errorCause?: unknown;
|
|
13
|
+
constructor(message: string, cause?: unknown);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read the kits lockfile from disk.
|
|
17
|
+
*
|
|
18
|
+
* @param scope - Installation scope (global or project)
|
|
19
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
20
|
+
* @returns The lockfile or null if it doesn't exist
|
|
21
|
+
* @throws LockfileReadError if the file exists but cannot be read or parsed
|
|
22
|
+
*/
|
|
23
|
+
export declare function readLockfile(scope?: InstallationScope, projectRoot?: string): Promise<KitsLockfile | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Get or create the kits lockfile.
|
|
26
|
+
*
|
|
27
|
+
* @param scope - Installation scope (global or project)
|
|
28
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
29
|
+
* @returns The existing lockfile or a new empty lockfile
|
|
30
|
+
*/
|
|
31
|
+
export declare function getOrCreateLockfile(scope?: InstallationScope, projectRoot?: string): Promise<KitsLockfile>;
|
|
32
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/lockfile/read.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAK7C;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,GAAE,iBAA4B,EACnC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAuC9B;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,GAAE,iBAA4B,EACnC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAGvB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lockfile read operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides functionality to read and validate the kits lockfile.
|
|
5
|
+
*/
|
|
6
|
+
import fs from "node:fs/promises";
|
|
7
|
+
import { LOCKFILE_VERSION, createEmptyLockfile } from "./types.js";
|
|
8
|
+
import { getLockfilePath } from "./utils.js";
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when lockfile read fails.
|
|
11
|
+
*/
|
|
12
|
+
export class LockfileReadError extends Error {
|
|
13
|
+
errorCause;
|
|
14
|
+
constructor(message, cause) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "LockfileReadError";
|
|
17
|
+
this.errorCause = cause;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read the kits lockfile from disk.
|
|
22
|
+
*
|
|
23
|
+
* @param scope - Installation scope (global or project)
|
|
24
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
25
|
+
* @returns The lockfile or null if it doesn't exist
|
|
26
|
+
* @throws LockfileReadError if the file exists but cannot be read or parsed
|
|
27
|
+
*/
|
|
28
|
+
export async function readLockfile(scope = "global", projectRoot) {
|
|
29
|
+
const lockfilePath = getLockfilePath(scope, projectRoot);
|
|
30
|
+
try {
|
|
31
|
+
const content = await fs.readFile(lockfilePath, "utf-8");
|
|
32
|
+
const lockfile = JSON.parse(content);
|
|
33
|
+
// Validate lockfile version
|
|
34
|
+
if (!isValidLockfile(lockfile)) {
|
|
35
|
+
throw new LockfileReadError(`Invalid lockfile format at ${lockfilePath}; expected version ${LOCKFILE_VERSION}`);
|
|
36
|
+
}
|
|
37
|
+
return lockfile;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
const nodeError = error;
|
|
41
|
+
// File doesn't exist - return null
|
|
42
|
+
if (nodeError.code === "ENOENT") {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Re-throw LockfileReadError as-is
|
|
46
|
+
if (error instanceof LockfileReadError) {
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
// JSON parse errors
|
|
50
|
+
if (error instanceof SyntaxError) {
|
|
51
|
+
throw new LockfileReadError(`Failed to parse lockfile at ${lockfilePath}; invalid JSON`, error);
|
|
52
|
+
}
|
|
53
|
+
// Other errors
|
|
54
|
+
throw new LockfileReadError(`Failed to read lockfile at ${lockfilePath}`, error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get or create the kits lockfile.
|
|
59
|
+
*
|
|
60
|
+
* @param scope - Installation scope (global or project)
|
|
61
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
62
|
+
* @returns The existing lockfile or a new empty lockfile
|
|
63
|
+
*/
|
|
64
|
+
export async function getOrCreateLockfile(scope = "global", projectRoot) {
|
|
65
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
66
|
+
return lockfile ?? createEmptyLockfile(scope, projectRoot);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validates that a lockfile has the expected structure.
|
|
70
|
+
*/
|
|
71
|
+
function isValidLockfile(lockfile) {
|
|
72
|
+
if (!lockfile || typeof lockfile !== "object") {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const m = lockfile;
|
|
76
|
+
// Check required fields
|
|
77
|
+
if (typeof m["version"] !== "string") {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (typeof m["lastUpdated"] !== "string") {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (!m["harnesses"] || typeof m["harnesses"] !== "object") {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/lockfile/read.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIlC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,UAAU,CAAW;IAE9B,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA2B,QAAQ,EACnC,WAAoB;IAEpB,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QAErD,4BAA4B;QAC5B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,iBAAiB,CACzB,8BAA8B,YAAY,sBAAsB,gBAAgB,EAAE,CACnF,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,KAA8B,CAAC;QAEjD,mCAAmC;QACnC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mCAAmC;QACnC,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,oBAAoB;QACpB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,iBAAiB,CACzB,+BAA+B,YAAY,gBAAgB,EAC3D,KAAK,CACN,CAAC;QACJ,CAAC;QAED,eAAe;QACf,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAA2B,QAAQ,EACnC,WAAoB;IAEpB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,OAAO,QAAQ,IAAI,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAAiB;IACxC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,GAAG,QAAmC,CAAC;IAE9C,wBAAwB;IACxB,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kits lockfile type definitions.
|
|
3
|
+
*
|
|
4
|
+
* The lockfile tracks all installed kits and primitives across harnesses,
|
|
5
|
+
* enabling uninstallation, upgrade checking, and conflict detection.
|
|
6
|
+
*/
|
|
7
|
+
import type { PrimitiveType, HarnessName, InstallationScope } from "../core/types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Version of the lockfile schema.
|
|
10
|
+
*/
|
|
11
|
+
export declare const LOCKFILE_VERSION: "1.0";
|
|
12
|
+
/**
|
|
13
|
+
* Global lockfile file location.
|
|
14
|
+
* User-level installation, available in all projects.
|
|
15
|
+
*/
|
|
16
|
+
export declare const GLOBAL_LOCKFILE_PATH = "~/.agents/kits-lock.json";
|
|
17
|
+
/**
|
|
18
|
+
* Project lockfile directory name.
|
|
19
|
+
* Repository-level installation, version-controllable.
|
|
20
|
+
*/
|
|
21
|
+
export declare const PROJECT_LOCKFILE_DIR = ".agents";
|
|
22
|
+
/**
|
|
23
|
+
* Project lockfile name within PROJECT_LOCKFILE_DIR.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PROJECT_LOCKFILE_FILENAME = "kits-lock.json";
|
|
26
|
+
/**
|
|
27
|
+
* Information about an installed primitive.
|
|
28
|
+
*/
|
|
29
|
+
export interface InstalledPrimitive {
|
|
30
|
+
name: string;
|
|
31
|
+
type: PrimitiveType;
|
|
32
|
+
namespacedName: string;
|
|
33
|
+
version?: string;
|
|
34
|
+
versionSpec?: string;
|
|
35
|
+
isInline: boolean;
|
|
36
|
+
installedPath: string;
|
|
37
|
+
instanceName?: string;
|
|
38
|
+
configHash?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Information about an installed kit.
|
|
42
|
+
*/
|
|
43
|
+
export interface InstalledKit {
|
|
44
|
+
name: string;
|
|
45
|
+
installAs: string;
|
|
46
|
+
version: string;
|
|
47
|
+
installedAt: string;
|
|
48
|
+
source: string;
|
|
49
|
+
primitives: InstalledPrimitive[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Harness installation record.
|
|
53
|
+
*/
|
|
54
|
+
export interface HarnessInstallation {
|
|
55
|
+
kits: Record<string, InstalledKit>;
|
|
56
|
+
mcpInstances?: Record<string, McpInstance>;
|
|
57
|
+
hookInstances?: Record<string, HookInstance>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* MCP server instance record.
|
|
61
|
+
*/
|
|
62
|
+
export interface McpInstance {
|
|
63
|
+
version: string;
|
|
64
|
+
configHash: string;
|
|
65
|
+
usedBy: string[];
|
|
66
|
+
sourcePrimitive: string;
|
|
67
|
+
installedAt: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hook program instance record.
|
|
71
|
+
*/
|
|
72
|
+
export interface HookInstance {
|
|
73
|
+
version: string;
|
|
74
|
+
configHash: string;
|
|
75
|
+
usedBy: string[];
|
|
76
|
+
sourcePrimitive: string;
|
|
77
|
+
installedAt: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Kits lockfile structure.
|
|
81
|
+
*/
|
|
82
|
+
export interface KitsLockfile {
|
|
83
|
+
version: typeof LOCKFILE_VERSION;
|
|
84
|
+
scope: InstallationScope;
|
|
85
|
+
projectRoot?: string;
|
|
86
|
+
lastUpdated: string;
|
|
87
|
+
source?: string;
|
|
88
|
+
manifest?: {
|
|
89
|
+
path: string;
|
|
90
|
+
hash: string;
|
|
91
|
+
};
|
|
92
|
+
harnesses: Partial<Record<HarnessName, HarnessInstallation>>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Available upgrade information.
|
|
96
|
+
*/
|
|
97
|
+
export interface UpgradeCheck {
|
|
98
|
+
kit: string;
|
|
99
|
+
name?: string;
|
|
100
|
+
harness: HarnessName;
|
|
101
|
+
primitive: string;
|
|
102
|
+
type: PrimitiveType;
|
|
103
|
+
currentVersion: string;
|
|
104
|
+
availableVersion: string;
|
|
105
|
+
versionSpec: string;
|
|
106
|
+
breaking: boolean;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Summary of available upgrades.
|
|
110
|
+
*/
|
|
111
|
+
export interface UpgradeSummary {
|
|
112
|
+
upgrades: UpgradeCheck[];
|
|
113
|
+
totalUpgrades: number;
|
|
114
|
+
breakingChanges: number;
|
|
115
|
+
affectedKits: number;
|
|
116
|
+
affectedHarnesses: number;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Creates an empty lockfile for the specified scope.
|
|
120
|
+
*
|
|
121
|
+
* @param scope - Installation scope (global or project)
|
|
122
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
123
|
+
* @returns Empty kits lockfile
|
|
124
|
+
*/
|
|
125
|
+
export declare function createEmptyLockfile(scope?: InstallationScope, projectRoot?: string): KitsLockfile;
|
|
126
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lockfile/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kits lockfile type definitions.
|
|
3
|
+
*
|
|
4
|
+
* The lockfile tracks all installed kits and primitives across harnesses,
|
|
5
|
+
* enabling uninstallation, upgrade checking, and conflict detection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Version of the lockfile schema.
|
|
9
|
+
*/
|
|
10
|
+
export const LOCKFILE_VERSION = "1.0";
|
|
11
|
+
/**
|
|
12
|
+
* Global lockfile file location.
|
|
13
|
+
* User-level installation, available in all projects.
|
|
14
|
+
*/
|
|
15
|
+
export const GLOBAL_LOCKFILE_PATH = "~/.agents/kits-lock.json";
|
|
16
|
+
/**
|
|
17
|
+
* Project lockfile directory name.
|
|
18
|
+
* Repository-level installation, version-controllable.
|
|
19
|
+
*/
|
|
20
|
+
export const PROJECT_LOCKFILE_DIR = ".agents";
|
|
21
|
+
/**
|
|
22
|
+
* Project lockfile name within PROJECT_LOCKFILE_DIR.
|
|
23
|
+
*/
|
|
24
|
+
export const PROJECT_LOCKFILE_FILENAME = "kits-lock.json";
|
|
25
|
+
/**
|
|
26
|
+
* Creates an empty lockfile for the specified scope.
|
|
27
|
+
*
|
|
28
|
+
* @param scope - Installation scope (global or project)
|
|
29
|
+
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
30
|
+
* @returns Empty kits lockfile
|
|
31
|
+
*/
|
|
32
|
+
export function createEmptyLockfile(scope = "global", projectRoot) {
|
|
33
|
+
const lockfile = {
|
|
34
|
+
version: LOCKFILE_VERSION,
|
|
35
|
+
scope,
|
|
36
|
+
lastUpdated: new Date().toISOString(),
|
|
37
|
+
harnesses: {},
|
|
38
|
+
};
|
|
39
|
+
if (scope === "project" && projectRoot) {
|
|
40
|
+
lockfile.projectRoot = projectRoot;
|
|
41
|
+
}
|
|
42
|
+
return lockfile;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lockfile/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAc,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,gBAAgB,CAAC;AAuG1D;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA2B,QAAQ,EACnC,WAAoB;IAEpB,MAAM,QAAQ,GAAiB;QAC7B,OAAO,EAAE,gBAAgB;QACzB,KAAK;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,EAAE,CAAC;QACvC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;IACrC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -6,27 +6,27 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { HarnessName, InstallationScope } from "../core/types.js";
|
|
8
8
|
import type { PrimitivesRegistryLoader } from "../resolution/primitives-registry.js";
|
|
9
|
-
import type {
|
|
9
|
+
import type { KitsLockfile, UpgradeCheck, UpgradeSummary } from "./types.js";
|
|
10
10
|
/**
|
|
11
11
|
* Check for available upgrades for a specific installation scope.
|
|
12
12
|
*
|
|
13
|
-
* Convenience function that reads the
|
|
13
|
+
* Convenience function that reads the lockfile for the given scope
|
|
14
14
|
* and checks for available upgrades.
|
|
15
15
|
*
|
|
16
16
|
* @param scope - Installation scope (global or project)
|
|
17
17
|
* @param registry - The primitives registry loader
|
|
18
18
|
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
19
|
-
* @returns Array of available upgrade information, empty if no
|
|
19
|
+
* @returns Array of available upgrade information, empty if no lockfile exists
|
|
20
20
|
*/
|
|
21
21
|
export declare function checkForUpgradesInScope(scope: InstallationScope, registry: PrimitivesRegistryLoader, projectRoot?: string): Promise<UpgradeCheck[]>;
|
|
22
22
|
/**
|
|
23
23
|
* Check for available upgrades across all installed primitives.
|
|
24
24
|
*
|
|
25
|
-
* @param
|
|
25
|
+
* @param lockfile - The kits lockfile
|
|
26
26
|
* @param registry - The primitives registry loader
|
|
27
27
|
* @returns Array of available upgrade information
|
|
28
28
|
*/
|
|
29
|
-
export declare function checkForUpgrades(
|
|
29
|
+
export declare function checkForUpgrades(lockfile: KitsLockfile, registry: PrimitivesRegistryLoader): Promise<UpgradeCheck[]>;
|
|
30
30
|
/**
|
|
31
31
|
* Create an upgrade summary from upgrade checks.
|
|
32
32
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-check.d.ts","sourceRoot":"","sources":["../../src/lockfile/upgrade-check.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAiB,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG7E;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,wBAAwB,EAClC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CAMzB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,wBAAwB,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CAwCzB;AA0ED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,cAAc,CAiB7E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EAAE,GACvB,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAW7B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,EAAE,GACvB,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAUlC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAE1E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAEvE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAG3D"}
|
|
@@ -5,41 +5,42 @@
|
|
|
5
5
|
* to identify available updates.
|
|
6
6
|
*/
|
|
7
7
|
import * as semver from "semver";
|
|
8
|
-
import {
|
|
8
|
+
import { readLockfile } from "./read.js";
|
|
9
9
|
/**
|
|
10
10
|
* Check for available upgrades for a specific installation scope.
|
|
11
11
|
*
|
|
12
|
-
* Convenience function that reads the
|
|
12
|
+
* Convenience function that reads the lockfile for the given scope
|
|
13
13
|
* and checks for available upgrades.
|
|
14
14
|
*
|
|
15
15
|
* @param scope - Installation scope (global or project)
|
|
16
16
|
* @param registry - The primitives registry loader
|
|
17
17
|
* @param projectRoot - Absolute path to project root (required for project scope)
|
|
18
|
-
* @returns Array of available upgrade information, empty if no
|
|
18
|
+
* @returns Array of available upgrade information, empty if no lockfile exists
|
|
19
19
|
*/
|
|
20
20
|
export async function checkForUpgradesInScope(scope, registry, projectRoot) {
|
|
21
|
-
const
|
|
22
|
-
if (!
|
|
21
|
+
const lockfile = await readLockfile(scope, projectRoot);
|
|
22
|
+
if (!lockfile) {
|
|
23
23
|
return [];
|
|
24
24
|
}
|
|
25
|
-
return checkForUpgrades(
|
|
25
|
+
return checkForUpgrades(lockfile, registry);
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Check for available upgrades across all installed primitives.
|
|
29
29
|
*
|
|
30
|
-
* @param
|
|
30
|
+
* @param lockfile - The kits lockfile
|
|
31
31
|
* @param registry - The primitives registry loader
|
|
32
32
|
* @returns Array of available upgrade information
|
|
33
33
|
*/
|
|
34
|
-
export async function checkForUpgrades(
|
|
34
|
+
export async function checkForUpgrades(lockfile, registry) {
|
|
35
35
|
const upgrades = [];
|
|
36
36
|
// Load the registry if not already loaded
|
|
37
37
|
await registry.load();
|
|
38
38
|
// Iterate through all harnesses and kits
|
|
39
|
-
for (const [harnessName, harnessEntry] of Object.entries(
|
|
39
|
+
for (const [harnessName, harnessEntry] of Object.entries(lockfile.harnesses)) {
|
|
40
40
|
if (!harnessEntry)
|
|
41
41
|
continue;
|
|
42
42
|
for (const [kitName, kit] of Object.entries(harnessEntry.kits)) {
|
|
43
|
+
const canonicalName = kit.name ?? kitName;
|
|
43
44
|
// Check each primitive for upgrades
|
|
44
45
|
for (const primitive of kit.primitives) {
|
|
45
46
|
// Skip inline primitives - they don't come from the registry
|
|
@@ -51,6 +52,7 @@ export async function checkForUpgrades(manifest, registry) {
|
|
|
51
52
|
// Check for available upgrade
|
|
52
53
|
const upgrade = await checkPrimitiveUpgrade(registry, harnessName, kitName, primitive.name, primitive.type, primitive.version, primitive.versionSpec);
|
|
53
54
|
if (upgrade) {
|
|
55
|
+
upgrade.name = canonicalName;
|
|
54
56
|
upgrades.push(upgrade);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-check.js","sourceRoot":"","sources":["../../src/lockfile/upgrade-check.ts"],"names":[],"mappings":"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"}
|