@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.
Files changed (54) hide show
  1. package/README.md +53 -47
  2. package/dist/commands.js +3 -0
  3. package/dist/commands.js.map +1 -1
  4. package/dist/config-get.js +56 -0
  5. package/dist/config-get.js.map +1 -0
  6. package/dist/config-set.js +287 -0
  7. package/dist/config-set.js.map +1 -0
  8. package/dist/gates-runners.js +1 -1
  9. package/dist/gates-runners.js.map +1 -1
  10. package/dist/git-log.js +5 -3
  11. package/dist/git-log.js.map +1 -1
  12. package/dist/guard-worktree-commit.js +1 -1
  13. package/dist/guard-worktree-commit.js.map +1 -1
  14. package/dist/init-templates.js +6 -0
  15. package/dist/init-templates.js.map +1 -1
  16. package/dist/init.js +9 -1
  17. package/dist/init.js.map +1 -1
  18. package/dist/lane-edit.js +318 -0
  19. package/dist/lane-edit.js.map +1 -0
  20. package/dist/mem-checkpoint.js +70 -3
  21. package/dist/mem-checkpoint.js.map +1 -1
  22. package/dist/orchestrate-initiative.js +15 -1
  23. package/dist/orchestrate-initiative.js.map +1 -1
  24. package/dist/pack-hash.js +101 -0
  25. package/dist/pack-hash.js.map +1 -0
  26. package/dist/pack-install.js +407 -0
  27. package/dist/pack-install.js.map +1 -0
  28. package/dist/pack-publish.js +277 -0
  29. package/dist/pack-publish.js.map +1 -0
  30. package/dist/pack-scaffold.js +269 -0
  31. package/dist/pack-scaffold.js.map +1 -0
  32. package/dist/pack-search.js +142 -0
  33. package/dist/pack-search.js.map +1 -0
  34. package/dist/pack-validate.js +208 -0
  35. package/dist/pack-validate.js.map +1 -0
  36. package/dist/public-manifest.js +46 -0
  37. package/dist/public-manifest.js.map +1 -1
  38. package/dist/release.js +1 -1
  39. package/dist/release.js.map +1 -1
  40. package/dist/task-claim.js +667 -0
  41. package/dist/task-claim.js.map +1 -0
  42. package/dist/workspace-init.js +321 -0
  43. package/dist/workspace-init.js.map +1 -0
  44. package/dist/wu-block.js +1 -1
  45. package/dist/wu-block.js.map +1 -1
  46. package/dist/wu-claim-state.js +0 -1
  47. package/dist/wu-claim-state.js.map +1 -1
  48. package/dist/wu-claim.js +1 -1
  49. package/dist/wu-claim.js.map +1 -1
  50. package/dist/wu-done.js +5 -3
  51. package/dist/wu-done.js.map +1 -1
  52. package/dist/wu-spawn-prompt-builders.js +86 -28
  53. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  54. 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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"}