@lumenflow/cli 2.21.1 → 3.0.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.
- package/README.md +53 -47
- package/dist/commands.js +3 -0
- package/dist/commands.js.map +1 -1
- package/dist/config-get.js +56 -0
- package/dist/config-get.js.map +1 -0
- package/dist/config-set.js +287 -0
- package/dist/config-set.js.map +1 -0
- package/dist/gates-runners.js +1 -1
- package/dist/gates-runners.js.map +1 -1
- package/dist/git-log.js +5 -3
- package/dist/git-log.js.map +1 -1
- package/dist/guard-worktree-commit.js +1 -1
- package/dist/guard-worktree-commit.js.map +1 -1
- package/dist/init-templates.js +6 -0
- package/dist/init-templates.js.map +1 -1
- package/dist/init.js +9 -1
- package/dist/init.js.map +1 -1
- package/dist/lane-edit.js +318 -0
- package/dist/lane-edit.js.map +1 -0
- package/dist/mem-checkpoint.js +70 -3
- package/dist/mem-checkpoint.js.map +1 -1
- package/dist/orchestrate-initiative.js +15 -1
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/pack-hash.js +101 -0
- package/dist/pack-hash.js.map +1 -0
- package/dist/pack-install.js +407 -0
- package/dist/pack-install.js.map +1 -0
- package/dist/pack-publish.js +277 -0
- package/dist/pack-publish.js.map +1 -0
- package/dist/pack-scaffold.js +269 -0
- package/dist/pack-scaffold.js.map +1 -0
- package/dist/pack-search.js +142 -0
- package/dist/pack-search.js.map +1 -0
- package/dist/pack-validate.js +208 -0
- package/dist/pack-validate.js.map +1 -0
- package/dist/public-manifest.js +46 -0
- package/dist/public-manifest.js.map +1 -1
- package/dist/release.js +1 -1
- package/dist/release.js.map +1 -1
- package/dist/task-claim.js +667 -0
- package/dist/task-claim.js.map +1 -0
- package/dist/workspace-init.js +321 -0
- package/dist/workspace-init.js.map +1 -0
- package/dist/wu-block.js +1 -1
- package/dist/wu-block.js.map +1 -1
- package/dist/wu-claim-state.js +0 -1
- package/dist/wu-claim-state.js.map +1 -1
- package/dist/wu-claim.js +1 -1
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-done.js +5 -3
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-spawn-prompt-builders.js +86 -28
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/package.json +19 -7
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file pack-install.ts
|
|
4
|
+
* Install a LumenFlow domain pack into workspace.yaml (WU-1827, WU-1875)
|
|
5
|
+
*
|
|
6
|
+
* Adds a PackPin entry to workspace.yaml, validates the pack using
|
|
7
|
+
* pack:validate, and pins the computed integrity hash.
|
|
8
|
+
*
|
|
9
|
+
* WU-1875: Added registry HTTP fetch path with SHA-256 integrity
|
|
10
|
+
* verification and FetchFn port for testability.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* pnpm pack:install --id my-pack --source local --version 1.0.0
|
|
14
|
+
* pnpm pack:install --id my-pack --source git --url https://github.com/org/repo.git --version 1.0.0
|
|
15
|
+
* pnpm pack:install --id my-pack --source registry --version 1.0.0 --registry-url https://custom.registry.dev
|
|
16
|
+
*/
|
|
17
|
+
import { createHash } from 'node:crypto';
|
|
18
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
19
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
20
|
+
import { join, resolve } from 'node:path';
|
|
21
|
+
import { execFile } from 'node:child_process';
|
|
22
|
+
import { tmpdir } from 'node:os';
|
|
23
|
+
import { promisify } from 'node:util';
|
|
24
|
+
import YAML from 'yaml';
|
|
25
|
+
import { WORKSPACE_FILE_NAME } from '@lumenflow/kernel';
|
|
26
|
+
import { createWUParser, WU_OPTIONS } from '@lumenflow/core';
|
|
27
|
+
import { validatePack } from './pack-validate.js';
|
|
28
|
+
import { computePackHash } from './pack-hash.js';
|
|
29
|
+
import { runCLI } from './cli-entry-point.js';
|
|
30
|
+
const execFileAsync = promisify(execFile);
|
|
31
|
+
export const LOG_PREFIX = '[pack:install]';
|
|
32
|
+
// --- Constants ---
|
|
33
|
+
const PACK_SOURCE_VALUES = ['local', 'git', 'registry'];
|
|
34
|
+
const UTF8 = 'utf-8';
|
|
35
|
+
const DEFAULT_REGISTRY_URL = 'https://registry.lumenflow.dev';
|
|
36
|
+
async function readWorkspaceFile(workspaceRoot) {
|
|
37
|
+
const workspacePath = join(workspaceRoot, WORKSPACE_FILE_NAME);
|
|
38
|
+
if (!existsSync(workspacePath)) {
|
|
39
|
+
throw new Error(`${WORKSPACE_FILE_NAME} not found at ${workspacePath}. ` +
|
|
40
|
+
'Run "lumenflow init" to create a workspace first.');
|
|
41
|
+
}
|
|
42
|
+
const content = await readFile(workspacePath, UTF8);
|
|
43
|
+
const parsed = YAML.parse(content);
|
|
44
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
45
|
+
throw new Error(`${WORKSPACE_FILE_NAME} is empty or malformed.`);
|
|
46
|
+
}
|
|
47
|
+
// Ensure packs array exists
|
|
48
|
+
if (!Array.isArray(parsed.packs)) {
|
|
49
|
+
parsed.packs = [];
|
|
50
|
+
}
|
|
51
|
+
return parsed;
|
|
52
|
+
}
|
|
53
|
+
async function writeWorkspaceFile(workspaceRoot, data) {
|
|
54
|
+
const workspacePath = join(workspaceRoot, WORKSPACE_FILE_NAME);
|
|
55
|
+
const content = YAML.stringify(data, { lineWidth: 120 });
|
|
56
|
+
await writeFile(workspacePath, content, UTF8);
|
|
57
|
+
}
|
|
58
|
+
// --- Build PackPin ---
|
|
59
|
+
function buildPackPin(options) {
|
|
60
|
+
const pin = {
|
|
61
|
+
id: options.packId,
|
|
62
|
+
version: options.version,
|
|
63
|
+
integrity: options.integrity,
|
|
64
|
+
source: options.source,
|
|
65
|
+
};
|
|
66
|
+
if (options.url) {
|
|
67
|
+
pin.url = options.url;
|
|
68
|
+
}
|
|
69
|
+
if (options.registryUrl) {
|
|
70
|
+
pin.registry_url = options.registryUrl;
|
|
71
|
+
}
|
|
72
|
+
return pin;
|
|
73
|
+
}
|
|
74
|
+
// --- Upsert PackPin into packs array ---
|
|
75
|
+
function upsertPackPin(packs, newPin) {
|
|
76
|
+
const existingIndex = packs.findIndex((p) => p.id === newPin.id);
|
|
77
|
+
if (existingIndex >= 0) {
|
|
78
|
+
// Replace existing entry
|
|
79
|
+
const updated = [...packs];
|
|
80
|
+
updated[existingIndex] = newPin;
|
|
81
|
+
return updated;
|
|
82
|
+
}
|
|
83
|
+
// Append new entry
|
|
84
|
+
return [...packs, newPin];
|
|
85
|
+
}
|
|
86
|
+
// --- Core install function ---
|
|
87
|
+
/**
|
|
88
|
+
* Install a pack into workspace.yaml.
|
|
89
|
+
*
|
|
90
|
+
* Steps:
|
|
91
|
+
* 1. Read workspace.yaml
|
|
92
|
+
* 2. Validate the pack at packRoot using pack:validate
|
|
93
|
+
* 3. Compute integrity hash
|
|
94
|
+
* 4. Build PackPin and upsert into workspace.yaml packs array
|
|
95
|
+
* 5. Write updated workspace.yaml
|
|
96
|
+
*
|
|
97
|
+
* Returns InstallPackResult with success=false if validation fails.
|
|
98
|
+
*/
|
|
99
|
+
export async function installPack(options) {
|
|
100
|
+
const { workspaceRoot, packId, source, version, url, registryUrl, packRoot } = options;
|
|
101
|
+
const absolutePackRoot = resolve(packRoot);
|
|
102
|
+
// 1. Read workspace.yaml
|
|
103
|
+
let workspace;
|
|
104
|
+
try {
|
|
105
|
+
workspace = await readWorkspaceFile(workspaceRoot);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
+
return { success: false, error: message };
|
|
110
|
+
}
|
|
111
|
+
// 2. Validate the pack
|
|
112
|
+
let validation;
|
|
113
|
+
try {
|
|
114
|
+
validation = await validatePack({ packRoot: absolutePackRoot });
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
118
|
+
return { success: false, error: `Pack validation failed: ${message}` };
|
|
119
|
+
}
|
|
120
|
+
if (!validation.allPassed) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
error: `Pack validation failed for "${packId}". Run pack:validate --pack-root ${absolutePackRoot} for details.`,
|
|
124
|
+
validation,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// 3. Compute integrity hash
|
|
128
|
+
let integrity;
|
|
129
|
+
try {
|
|
130
|
+
integrity = await computePackHash({ packRoot: absolutePackRoot });
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
134
|
+
return { success: false, error: `Integrity hash computation failed: ${message}` };
|
|
135
|
+
}
|
|
136
|
+
// 4. Build PackPin and upsert
|
|
137
|
+
const pin = buildPackPin({ packId, version, source, integrity, url, registryUrl });
|
|
138
|
+
workspace.packs = upsertPackPin(workspace.packs, pin);
|
|
139
|
+
// 5. Write updated workspace.yaml
|
|
140
|
+
try {
|
|
141
|
+
await writeWorkspaceFile(workspaceRoot, workspace);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
145
|
+
return { success: false, error: `Failed to write ${WORKSPACE_FILE_NAME}: ${message}` };
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
success: true,
|
|
149
|
+
integrity,
|
|
150
|
+
validation,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// --- Registry fetch + install (WU-1875) ---
|
|
154
|
+
/**
|
|
155
|
+
* Build the registry tarball URL for a given pack and version.
|
|
156
|
+
*
|
|
157
|
+
* Format: {registryUrl}/api/registry/packs/{packId}/versions/{version}/tarball
|
|
158
|
+
*/
|
|
159
|
+
function buildRegistryTarballUrl(registryUrl, packId, version) {
|
|
160
|
+
const base = registryUrl.replace(/\/+$/, '');
|
|
161
|
+
return `${base}/api/registry/packs/${encodeURIComponent(packId)}/versions/${encodeURIComponent(version)}/tarball`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Verify SHA-256 integrity of a buffer against an expected hash.
|
|
165
|
+
*
|
|
166
|
+
* @param buffer - The data to hash
|
|
167
|
+
* @param expectedIntegrity - Expected hash in "sha256:<hex>" format
|
|
168
|
+
* @returns Object with `valid` boolean and `actual` hash string
|
|
169
|
+
*/
|
|
170
|
+
function verifySha256Integrity(buffer, expectedIntegrity) {
|
|
171
|
+
const data = Buffer.from(buffer);
|
|
172
|
+
const actualHex = createHash('sha256').update(data).digest('hex');
|
|
173
|
+
const actualIntegrity = `sha256:${actualHex}`;
|
|
174
|
+
return {
|
|
175
|
+
valid: actualIntegrity === expectedIntegrity,
|
|
176
|
+
actual: actualIntegrity,
|
|
177
|
+
expected: expectedIntegrity,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Extract a gzipped tarball to a target directory.
|
|
182
|
+
*
|
|
183
|
+
* @param tarballPath - Path to the .tar.gz file
|
|
184
|
+
* @param targetDir - Directory to extract into
|
|
185
|
+
*/
|
|
186
|
+
async function extractTarball(tarballPath, targetDir) {
|
|
187
|
+
mkdirSync(targetDir, { recursive: true });
|
|
188
|
+
await execFileAsync('tar', ['-xzf', tarballPath, '-C', targetDir]);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Install a pack from a registry into workspace.yaml (WU-1875).
|
|
192
|
+
*
|
|
193
|
+
* Steps:
|
|
194
|
+
* 1. Fetch tarball from registry API endpoint
|
|
195
|
+
* 2. Verify SHA-256 integrity of downloaded tarball
|
|
196
|
+
* 3. Extract tarball to a temp directory
|
|
197
|
+
* 4. Validate the extracted pack using pack:validate
|
|
198
|
+
* 5. Compute integrity hash of extracted pack contents
|
|
199
|
+
* 6. Build PackPin and upsert into workspace.yaml
|
|
200
|
+
*
|
|
201
|
+
* Returns InstallPackResult with success=false on any failure.
|
|
202
|
+
*/
|
|
203
|
+
export async function installPackFromRegistry(options) {
|
|
204
|
+
const { workspaceRoot, packId, version, registryUrl, integrity, fetchFn } = options;
|
|
205
|
+
// 1. Fetch tarball from registry
|
|
206
|
+
const tarballUrl = buildRegistryTarballUrl(registryUrl, packId, version);
|
|
207
|
+
let response;
|
|
208
|
+
try {
|
|
209
|
+
response = await fetchFn(tarballUrl);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
213
|
+
return {
|
|
214
|
+
success: false,
|
|
215
|
+
error: `Registry fetch failed for "${packId}@${version}": ${message}`,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
if (!response.ok) {
|
|
219
|
+
const body = await response.text().catch(() => 'No response body');
|
|
220
|
+
return {
|
|
221
|
+
success: false,
|
|
222
|
+
error: `Registry returned ${String(response.status)} ${response.statusText} for "${packId}@${version}": ${body}`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
// 2. Verify SHA-256 integrity
|
|
226
|
+
let tarballBuffer;
|
|
227
|
+
try {
|
|
228
|
+
tarballBuffer = await response.arrayBuffer();
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
232
|
+
return {
|
|
233
|
+
success: false,
|
|
234
|
+
error: `Failed to read tarball response body: ${message}`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const integrityCheck = verifySha256Integrity(tarballBuffer, integrity);
|
|
238
|
+
if (!integrityCheck.valid) {
|
|
239
|
+
return {
|
|
240
|
+
success: false,
|
|
241
|
+
error: `Integrity mismatch for "${packId}@${version}". ` +
|
|
242
|
+
`Expected: ${integrityCheck.expected}, Got: ${integrityCheck.actual}`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// 3. Extract tarball to temp directory
|
|
246
|
+
const tempBase = join(tmpdir(), `lumenflow-registry-install-${packId}-${Date.now()}`);
|
|
247
|
+
const tarballPath = join(tempBase, `${packId}-${version}.tar.gz`);
|
|
248
|
+
const extractDir = join(tempBase, 'pack');
|
|
249
|
+
try {
|
|
250
|
+
mkdirSync(tempBase, { recursive: true });
|
|
251
|
+
await writeFile(tarballPath, Buffer.from(tarballBuffer));
|
|
252
|
+
await extractTarball(tarballPath, extractDir);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
error: `Failed to extract tarball for "${packId}@${version}": ${message}`,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
// 4-6. Delegate to existing installPack with extracted directory as packRoot
|
|
262
|
+
return installPack({
|
|
263
|
+
workspaceRoot,
|
|
264
|
+
packId,
|
|
265
|
+
source: 'registry',
|
|
266
|
+
version,
|
|
267
|
+
registryUrl,
|
|
268
|
+
packRoot: extractDir,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// --- CLI options ---
|
|
272
|
+
const DEFAULT_PACKS_ROOT = 'packages/@lumenflow/packs';
|
|
273
|
+
const PACK_INSTALL_OPTIONS = {
|
|
274
|
+
packId: {
|
|
275
|
+
name: 'id',
|
|
276
|
+
flags: '--id <packId>',
|
|
277
|
+
description: 'Pack ID to install',
|
|
278
|
+
},
|
|
279
|
+
source: {
|
|
280
|
+
name: 'source',
|
|
281
|
+
flags: '--source <source>',
|
|
282
|
+
description: 'Pack source: local, git, or registry',
|
|
283
|
+
},
|
|
284
|
+
version: {
|
|
285
|
+
name: 'version',
|
|
286
|
+
flags: '--version <version>',
|
|
287
|
+
description: 'Pack version in semver format',
|
|
288
|
+
},
|
|
289
|
+
url: {
|
|
290
|
+
name: 'url',
|
|
291
|
+
flags: '--url <url>',
|
|
292
|
+
description: 'Git repository URL (required for source: git)',
|
|
293
|
+
},
|
|
294
|
+
registryUrl: {
|
|
295
|
+
name: 'registryUrl',
|
|
296
|
+
flags: '--registry-url <url>',
|
|
297
|
+
description: 'Registry base URL (for source: registry)',
|
|
298
|
+
},
|
|
299
|
+
packRoot: {
|
|
300
|
+
name: 'packRoot',
|
|
301
|
+
flags: '--pack-root <dir>',
|
|
302
|
+
description: 'Direct path to resolved pack directory on disk (overrides default resolution)',
|
|
303
|
+
},
|
|
304
|
+
packsRoot: {
|
|
305
|
+
name: 'packsRoot',
|
|
306
|
+
flags: '--packs-root <dir>',
|
|
307
|
+
description: `Root directory containing packs (default: "${DEFAULT_PACKS_ROOT}")`,
|
|
308
|
+
},
|
|
309
|
+
integrity: {
|
|
310
|
+
name: 'integrity',
|
|
311
|
+
flags: '--integrity <hash>',
|
|
312
|
+
description: 'Expected SHA-256 integrity hash in "sha256:<hex>" format (required for source: registry)',
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Resolve pack root from CLI options.
|
|
317
|
+
* Priority: --pack-root > --packs-root/<id>
|
|
318
|
+
*/
|
|
319
|
+
function resolvePackRootFromCli(options) {
|
|
320
|
+
if (options.directPackRoot) {
|
|
321
|
+
return resolve(options.directPackRoot);
|
|
322
|
+
}
|
|
323
|
+
return resolve(options.packsRoot, options.packId);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* CLI main entry point for pack:install
|
|
327
|
+
*/
|
|
328
|
+
export async function main() {
|
|
329
|
+
const opts = createWUParser({
|
|
330
|
+
name: 'pack-install',
|
|
331
|
+
description: 'Install a LumenFlow domain pack into workspace.yaml',
|
|
332
|
+
options: [
|
|
333
|
+
PACK_INSTALL_OPTIONS.packId,
|
|
334
|
+
PACK_INSTALL_OPTIONS.source,
|
|
335
|
+
PACK_INSTALL_OPTIONS.version,
|
|
336
|
+
PACK_INSTALL_OPTIONS.url,
|
|
337
|
+
PACK_INSTALL_OPTIONS.registryUrl,
|
|
338
|
+
PACK_INSTALL_OPTIONS.packRoot,
|
|
339
|
+
PACK_INSTALL_OPTIONS.packsRoot,
|
|
340
|
+
PACK_INSTALL_OPTIONS.integrity,
|
|
341
|
+
WU_OPTIONS.force,
|
|
342
|
+
],
|
|
343
|
+
required: ['id', 'source', 'version'],
|
|
344
|
+
});
|
|
345
|
+
const packId = opts.id;
|
|
346
|
+
const source = opts.source;
|
|
347
|
+
const version = opts.version;
|
|
348
|
+
const url = opts.url;
|
|
349
|
+
const registryUrl = opts.registryUrl;
|
|
350
|
+
const directPackRoot = opts.packRoot;
|
|
351
|
+
const packsRoot = opts.packsRoot ?? DEFAULT_PACKS_ROOT;
|
|
352
|
+
// Validate source
|
|
353
|
+
if (!PACK_SOURCE_VALUES.includes(source)) {
|
|
354
|
+
console.error(`${LOG_PREFIX} Error: Invalid source "${source}". Must be one of: ${PACK_SOURCE_VALUES.join(', ')}`);
|
|
355
|
+
process.exit(1);
|
|
356
|
+
}
|
|
357
|
+
// Validate git source requires url
|
|
358
|
+
if (source === 'git' && !url) {
|
|
359
|
+
console.error(`${LOG_PREFIX} Error: --url is required when --source is "git"`);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
const workspaceRoot = resolve('.');
|
|
363
|
+
console.log(`${LOG_PREFIX} Installing pack "${packId}" v${version} (source: ${source})...`);
|
|
364
|
+
let result;
|
|
365
|
+
if (source === 'registry') {
|
|
366
|
+
// Registry source: fetch tarball from registry API (WU-1875)
|
|
367
|
+
const resolvedRegistryUrl = registryUrl ?? DEFAULT_REGISTRY_URL;
|
|
368
|
+
const integrityFlag = opts.integrity;
|
|
369
|
+
if (!integrityFlag) {
|
|
370
|
+
console.error(`${LOG_PREFIX} Error: --integrity is required when --source is "registry"`);
|
|
371
|
+
process.exit(1);
|
|
372
|
+
}
|
|
373
|
+
result = await installPackFromRegistry({
|
|
374
|
+
workspaceRoot,
|
|
375
|
+
packId,
|
|
376
|
+
version,
|
|
377
|
+
registryUrl: resolvedRegistryUrl,
|
|
378
|
+
integrity: integrityFlag,
|
|
379
|
+
fetchFn: globalThis.fetch,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
// Local or git source: use existing path-based install
|
|
384
|
+
const packRoot = resolvePackRootFromCli({ directPackRoot, packId, packsRoot });
|
|
385
|
+
result = await installPack({
|
|
386
|
+
workspaceRoot,
|
|
387
|
+
packId,
|
|
388
|
+
source,
|
|
389
|
+
version,
|
|
390
|
+
url,
|
|
391
|
+
registryUrl,
|
|
392
|
+
packRoot,
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
if (!result.success) {
|
|
396
|
+
console.error(`${LOG_PREFIX} Installation failed: ${result.error}`);
|
|
397
|
+
process.exit(1);
|
|
398
|
+
}
|
|
399
|
+
console.log(`${LOG_PREFIX} Pack "${packId}" v${version} installed successfully.`);
|
|
400
|
+
console.log(`${LOG_PREFIX} Integrity: ${result.integrity}`);
|
|
401
|
+
console.log(`${LOG_PREFIX} workspace.yaml updated.`);
|
|
402
|
+
}
|
|
403
|
+
// Run if executed directly
|
|
404
|
+
if (import.meta.main) {
|
|
405
|
+
void runCLI(main);
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=pack-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-install.js","sourceRoot":"","sources":["../src/pack-install.ts"],"names":[],"mappings":"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"}
|