@12ui/design 0.2.5 → 0.2.7

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 (74) hide show
  1. package/README.md +12 -17
  2. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -1
  3. package/dist/cli-corpus-reference-downloads.js +4 -0
  4. package/dist/cli-corpus-reference-downloads.js.map +1 -1
  5. package/dist/cli-corpus-types.d.ts +4 -0
  6. package/dist/cli-corpus-types.d.ts.map +1 -1
  7. package/dist/cli-image-batch-command.d.ts +8 -0
  8. package/dist/cli-image-batch-command.d.ts.map +1 -0
  9. package/dist/cli-image-batch-command.js +127 -0
  10. package/dist/cli-image-batch-command.js.map +1 -0
  11. package/dist/cli-image-command.d.ts.map +1 -1
  12. package/dist/cli-image-command.js +17 -111
  13. package/dist/cli-image-command.js.map +1 -1
  14. package/dist/cli-persistence.d.ts +3 -0
  15. package/dist/cli-persistence.d.ts.map +1 -1
  16. package/dist/cli-persistence.js +66 -3
  17. package/dist/cli-persistence.js.map +1 -1
  18. package/dist/cli-skill-command.d.ts.map +1 -1
  19. package/dist/cli-skill-command.js +5 -0
  20. package/dist/cli-skill-command.js.map +1 -1
  21. package/dist/cli.js +6 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/client-auth-guidance.d.ts +3 -0
  24. package/dist/client-auth-guidance.d.ts.map +1 -0
  25. package/dist/client-auth-guidance.js +14 -0
  26. package/dist/client-auth-guidance.js.map +1 -0
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +2 -1
  29. package/dist/config.js.map +1 -1
  30. package/dist/conversion-client.d.ts.map +1 -1
  31. package/dist/conversion-client.js +2 -1
  32. package/dist/conversion-client.js.map +1 -1
  33. package/dist/corpus-client.d.ts.map +1 -1
  34. package/dist/corpus-client.js +2 -1
  35. package/dist/corpus-client.js.map +1 -1
  36. package/dist/image-generation-batch-manifest.d.ts +24 -0
  37. package/dist/image-generation-batch-manifest.d.ts.map +1 -0
  38. package/dist/image-generation-batch-manifest.js +91 -0
  39. package/dist/image-generation-batch-manifest.js.map +1 -0
  40. package/dist/image-generation-evidence.d.ts +9 -1
  41. package/dist/image-generation-evidence.d.ts.map +1 -1
  42. package/dist/image-generation-evidence.js.map +1 -1
  43. package/dist/image-generation-request.d.ts +29 -0
  44. package/dist/image-generation-request.d.ts.map +1 -0
  45. package/dist/image-generation-request.js +46 -0
  46. package/dist/image-generation-request.js.map +1 -0
  47. package/dist/image-generation-run.d.ts +35 -0
  48. package/dist/image-generation-run.d.ts.map +1 -0
  49. package/dist/image-generation-run.js +134 -0
  50. package/dist/image-generation-run.js.map +1 -0
  51. package/dist/image-generation-usage.d.ts +71 -0
  52. package/dist/image-generation-usage.d.ts.map +1 -0
  53. package/dist/image-generation-usage.js +192 -0
  54. package/dist/image-generation-usage.js.map +1 -0
  55. package/dist/legacy-cli-cleanup.d.ts +1 -0
  56. package/dist/legacy-cli-cleanup.d.ts.map +1 -1
  57. package/dist/legacy-cli-cleanup.js +12 -0
  58. package/dist/legacy-cli-cleanup.js.map +1 -1
  59. package/dist/legacy-npm-global-cli-cleanup.d.ts +16 -0
  60. package/dist/legacy-npm-global-cli-cleanup.d.ts.map +1 -0
  61. package/dist/legacy-npm-global-cli-cleanup.js +102 -0
  62. package/dist/legacy-npm-global-cli-cleanup.js.map +1 -0
  63. package/dist/legacy-npm-global-cli-recognition.d.ts +12 -0
  64. package/dist/legacy-npm-global-cli-recognition.d.ts.map +1 -0
  65. package/dist/legacy-npm-global-cli-recognition.js +105 -0
  66. package/dist/legacy-npm-global-cli-recognition.js.map +1 -0
  67. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  68. package/dist/legacy-skill-catalog.js +23 -2
  69. package/dist/legacy-skill-catalog.js.map +1 -1
  70. package/package.json +1 -1
  71. package/skills/design/SKILL.md +108 -205
  72. package/skills/design/references/selection-contract.md +43 -75
  73. package/skills/design-convert/SKILL.md +47 -97
  74. package/skills/design-search/SKILL.md +26 -60
package/README.md CHANGED
@@ -53,19 +53,11 @@ manual recreation.
53
53
 
54
54
  ```bash
55
55
  12ui skill status --json
56
- 12ui auth status
57
56
  12ui corpus inspire \
58
57
  --query "Editorial architecture homepage with warm materiality" \
59
58
  --out-dir ./references \
60
59
  --count 4
61
- 12ui image generate \
62
- --prompt "Create one compelling first viewport for an editorial architecture homepage. Use the attached image as inspiration, not a template. Prioritize hierarchy and breathing room, and choose the remaining layout and visual style yourself." \
63
- --reference ./references/01.webp \
64
- --out ./candidate-1.png \
65
- --aspect landscape \
66
- --project-root . \
67
- --provider auto \
68
- --idempotency-key product-candidate-1
60
+ 12ui image generate-batch --manifest ./generation.json
69
61
  12ui export <base-layerdoc-conversion-id> \
70
62
  --output html,pdf,psd,pptx,sketch,web_project \
71
63
  --out-dir ./exports \
@@ -73,14 +65,17 @@ manual recreation.
73
65
  --idempotency-key product-exports-v1
74
66
  ```
75
67
 
76
- `image generate` resolves one provider before dispatch: authenticated Codex,
77
- then `OPENAI_API_KEY` from the process or exactly `<project-root>/.env`. It
78
- refuses a Git-tracked `.env`, never stores or prints the key, persists attempt
79
- evidence, and never switches providers after dispatch. Pass exactly one of
80
- `--prompt` or `--prompt-file` and exactly one `--reference`; independent
81
- candidates should use different references. Choose `--aspect` explicitly for
82
- the target interface; it defaults to `landscape` for compatibility. Generated
83
- candidates are always PNG bytes, and `--out` must end in `.png`.
68
+ `image generate-batch` accepts 2-16 manifest jobs, preflights one provider,
69
+ reserves every attempt before dispatch, starts all provider calls concurrently,
70
+ and waits for the complete batch. Each job has one prompt, one reference, one
71
+ PNG output, and one stable idempotency key. Per-candidate and batch evidence
72
+ records provider-start and completion times. It never retries a candidate or
73
+ switches providers after dispatch.
74
+
75
+ The single-candidate `image generate` command remains available. Both commands
76
+ resolve authenticated Codex first, then `OPENAI_API_KEY` from the process or
77
+ exactly `<project-root>/.env`. They refuse a Git-tracked `.env`, never store or
78
+ print the key, and always write PNG bytes.
84
79
 
85
80
  `export` downloads one successful base LayerDoc once and dispatches the chosen
86
81
  formats in parallel. Project exports require exact web/native profiles; image
@@ -1 +1 @@
1
- {"version":3,"file":"cli-corpus-reference-downloads.d.ts","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAmH/B,eAAO,MAAM,0BAA0B,GAAU,MAAM;IACrD,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,OAAO,CAAC,yBAAyB,EAAE,CA4CtC,CAAC"}
1
+ {"version":3,"file":"cli-corpus-reference-downloads.d.ts","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAuH/B,eAAO,MAAM,0BAA0B,GAAU,MAAM;IACrD,MAAM,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,OAAO,CAAC,yBAAyB,EAAE,CA4CtC,CAAC"}
@@ -36,7 +36,11 @@ const referenceFromBytes = async (args) => {
36
36
  id: args.item.id,
37
37
  role: args.item.role,
38
38
  arm: args.item.arm,
39
+ cell: args.item.cell,
39
40
  aspect: args.item.aspect,
41
+ relevance: args.item.relevance,
42
+ relevancePercentile: args.item.relevancePercentile,
43
+ qualityPercentile: args.item.qualityPercentile,
40
44
  file: args.file,
41
45
  sha256: sha256(args.bytes),
42
46
  bytes: args.bytes.byteLength,
@@ -1 +1 @@
1
- {"version":3,"file":"cli-corpus-reference-downloads.js","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-corpus-reference-downloads.js","sourceRoot":"","sources":["../src/cli-corpus-reference-downloads.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,11 @@ export type DownloadedCorpusReference = {
23
23
  id: string;
24
24
  role: 'core' | 'stretch';
25
25
  arm: string;
26
+ cell: string | null;
26
27
  aspect: CorpusAspect;
28
+ relevance: number;
29
+ relevancePercentile: number;
30
+ qualityPercentile: number;
27
31
  file: string;
28
32
  sha256: string;
29
33
  bytes: number;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-corpus-types.d.ts","sourceRoot":"","sources":["../src/cli-corpus-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,mBAAmB,iFACgD,CAAC;AAEjF,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AACzD,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE,yBAAyB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,EAAE,MAAM,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,yBAAyB,CAAC,eAAe,CAAC,CAAC;KAC3D,CAAC;IACF,UAAU,EAAE,yBAAyB,EAAE,CAAC;CACzC,CAAC"}
1
+ {"version":3,"file":"cli-corpus-types.d.ts","sourceRoot":"","sources":["../src/cli-corpus-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,mBAAmB,iFACgD,CAAC;AAEjF,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,kBAAkB,CAAC;AACzD,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAC9F,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;AAErE,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE,yBAAyB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,OAAO,EAAE,wBAAwB,CAAC;IAClC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,EAAE,MAAM,CAAC;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,yBAAyB,CAAC,eAAe,CAAC,CAAC;KAC3D,CAAC;IACF,UAAU,EAAE,yBAAyB,EAAE,CAAC;CACzC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ensembleImage } from '@just-every/ensemble';
2
+ import { type CliFlags } from './cli-arguments.js';
3
+ import { preflightImageProvider } from './image-provider-preflight.js';
4
+ export declare const runImageBatchCommand: (flags: CliFlags, dependencies?: {
5
+ generate?: typeof ensembleImage;
6
+ preflight?: typeof preflightImageProvider;
7
+ }) => Promise<void>;
8
+ //# sourceMappingURL=cli-image-batch-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-image-batch-command.d.ts","sourceRoot":"","sources":["../src/cli-image-batch-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAsB/D,OAAO,EACL,sBAAsB,EAEvB,MAAM,+BAA+B,CAAC;AA2DvC,eAAO,MAAM,oBAAoB,GAC/B,OAAO,QAAQ,EACf,eAAc;IACZ,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,sBAAsB,CAAC;CACtC,KACL,OAAO,CAAC,IAAI,CAgHd,CAAC"}
@@ -0,0 +1,127 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { stringFlag } from './cli-arguments.js';
5
+ import { readImageGenerationBatchManifest, resolveImageGenerationBatchRequests, } from './image-generation-batch-manifest.js';
6
+ import { dispatchImageGeneration, failImageGenerationBeforeDispatch, markImageGenerationDispatched, reserveImageGeneration, } from './image-generation-run.js';
7
+ import { imageGenerationPathExists, imageGenerationSha256, prepareImageGenerationRequest, } from './image-generation-request.js';
8
+ import { summarizeImageGenerationUsage, } from './image-generation-usage.js';
9
+ import { preflightImageProvider, } from './image-provider-preflight.js';
10
+ const writeBatchAttempt = async (file, attempt, exclusive = false) => {
11
+ await mkdir(path.dirname(file), { recursive: true });
12
+ if (exclusive) {
13
+ await writeFile(file, `${JSON.stringify(attempt, null, 2)}\n`, {
14
+ encoding: 'utf8',
15
+ flag: 'wx',
16
+ mode: 0o600,
17
+ });
18
+ return;
19
+ }
20
+ const temporary = `${file}.${randomUUID()}.tmp`;
21
+ try {
22
+ await writeFile(temporary, `${JSON.stringify(attempt, null, 2)}\n`, {
23
+ encoding: 'utf8',
24
+ flag: 'wx',
25
+ mode: 0o600,
26
+ });
27
+ await rename(temporary, file);
28
+ }
29
+ finally {
30
+ await rm(temporary, { force: true });
31
+ }
32
+ };
33
+ const errorMessage = (error) => (error instanceof Error ? error.message : String(error));
34
+ const failReserved = async (reserved, message) => {
35
+ await Promise.allSettled(reserved.map((item) => failImageGenerationBeforeDispatch(item, message)));
36
+ };
37
+ export const runImageBatchCommand = async (flags, dependencies = {}) => {
38
+ const manifestFlag = stringFlag(flags, 'manifest')?.trim();
39
+ if (!manifestFlag) {
40
+ throw new Error('Usage: 12ui image generate-batch --manifest <batch.json>');
41
+ }
42
+ const manifestPath = path.resolve(manifestFlag);
43
+ const batchAttemptFile = `${manifestPath}.attempt.json`;
44
+ if (await imageGenerationPathExists(batchAttemptFile)) {
45
+ throw new Error(`Image batch attempt evidence already exists at ${batchAttemptFile}`);
46
+ }
47
+ const { manifest, source } = await readImageGenerationBatchManifest(manifestPath);
48
+ const requests = resolveImageGenerationBatchRequests({ manifest, manifestPath });
49
+ const prepared = await Promise.all(requests.map(prepareImageGenerationRequest));
50
+ const preflight = await (dependencies.preflight ?? preflightImageProvider)({
51
+ provider: manifest.provider,
52
+ projectRoot: prepared[0].projectRoot,
53
+ });
54
+ const manifestSha256 = imageGenerationSha256(source);
55
+ const attempt = {
56
+ version: 1,
57
+ status: 'prepared',
58
+ manifestPath,
59
+ manifestSha256,
60
+ projectRoot: prepared[0].projectRoot,
61
+ requestedProvider: manifest.provider,
62
+ provider: preflight.provider,
63
+ model: preflight.model,
64
+ candidateIds: prepared.map((item) => item.candidateId),
65
+ candidateAttemptFiles: prepared.map((item) => item.attemptFile),
66
+ preparedAt: new Date().toISOString(),
67
+ };
68
+ await writeBatchAttempt(batchAttemptFile, attempt, true);
69
+ const reservations = await Promise.allSettled(prepared.map((request) => (reserveImageGeneration({
70
+ request,
71
+ preflight,
72
+ batch: {
73
+ candidateId: request.candidateId,
74
+ manifestPath,
75
+ manifestSha256,
76
+ },
77
+ }))));
78
+ const reserved = reservations.flatMap((result) => (result.status === 'fulfilled' ? [result.value] : []));
79
+ const reservationErrors = reservations.flatMap((result) => (result.status === 'rejected' ? [errorMessage(result.reason)] : []));
80
+ if (reservationErrors.length > 0) {
81
+ const message = 'Batch reservation failed before any provider request was started';
82
+ await failReserved(reserved, message);
83
+ attempt.status = 'failed';
84
+ attempt.completedAt = new Date().toISOString();
85
+ attempt.errors = reservationErrors;
86
+ await writeBatchAttempt(batchAttemptFile, attempt);
87
+ throw new AggregateError(reservationErrors, `${message}. Evidence: ${batchAttemptFile}`);
88
+ }
89
+ attempt.status = 'dispatched';
90
+ attempt.dispatchedAt = new Date().toISOString();
91
+ await writeBatchAttempt(batchAttemptFile, attempt);
92
+ const marked = await Promise.allSettled(reserved.map((item) => markImageGenerationDispatched(item)));
93
+ const markErrors = marked.flatMap((result) => (result.status === 'rejected' ? [errorMessage(result.reason)] : []));
94
+ if (markErrors.length > 0) {
95
+ const message = 'Batch evidence preparation failed before any provider request was started';
96
+ await failReserved(reserved, message);
97
+ attempt.status = 'failed';
98
+ attempt.completedAt = new Date().toISOString();
99
+ attempt.errors = markErrors;
100
+ await writeBatchAttempt(batchAttemptFile, attempt);
101
+ throw new AggregateError(markErrors, `${message}. Evidence: ${batchAttemptFile}`);
102
+ }
103
+ const settled = await Promise.allSettled(reserved.map((item) => (dispatchImageGeneration(item, { generate: dependencies.generate }))));
104
+ const results = settled.flatMap((result) => (result.status === 'fulfilled' ? [result.value] : []));
105
+ const errors = settled.flatMap((result) => (result.status === 'rejected' ? [errorMessage(result.reason)] : []));
106
+ attempt.completedAt = new Date().toISOString();
107
+ attempt.results = results;
108
+ attempt.accounting = summarizeImageGenerationUsage(reserved.map((item) => item.attempt.usage), preflight.provider);
109
+ if (errors.length > 0) {
110
+ attempt.status = 'failed';
111
+ attempt.errors = errors;
112
+ await writeBatchAttempt(batchAttemptFile, attempt);
113
+ throw new AggregateError(errors, `Image batch finished with ${errors.length} failed candidate(s); no retries or provider`
114
+ + ` fallback were attempted. Evidence: ${batchAttemptFile}`);
115
+ }
116
+ attempt.status = 'succeeded';
117
+ await writeBatchAttempt(batchAttemptFile, attempt);
118
+ console.log(JSON.stringify({
119
+ provider: attempt.provider,
120
+ model: attempt.model,
121
+ manifestPath,
122
+ batchAttemptFile,
123
+ accounting: attempt.accounting,
124
+ candidates: results,
125
+ }, null, 2));
126
+ };
127
+ //# sourceMappingURL=cli-image-batch-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-image-batch-command.js","sourceRoot":"","sources":["../src/cli-image-batch-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-image-command.d.ts","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAO/D,OAAO,EAGL,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAyDvC,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc;IACZ,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,sBAAsB,CAAC;CACtC,KACL,OAAO,CAAC,IAAI,CA0Id,CAAC"}
1
+ {"version":3,"file":"cli-image-command.d.ts","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAc/D,OAAO,EAGL,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAoCvC,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc;IACZ,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,sBAAsB,CAAC;CACtC,KACL,OAAO,CAAC,IAAI,CAkDd,CAAC"}
@@ -1,16 +1,10 @@
1
- import { createHash } from 'node:crypto';
2
- import { lstat, mkdir, readFile, writeFile } from 'node:fs/promises';
1
+ import { readFile } from 'node:fs/promises';
3
2
  import path from 'node:path';
4
- import { ensembleImage } from '@just-every/ensemble';
5
- import { OpenAIProvider } from '@just-every/ensemble/model_providers/openai';
6
3
  import { stringFlag } from './cli-arguments.js';
7
- import { imageAttemptPath, writeImageGenerationAttempt, } from './image-generation-evidence.js';
8
- import { generatedPngBytes, referenceImageDataUrl } from './image-generation-output.js';
4
+ import { dispatchImageGeneration, markImageGenerationDispatched, reserveImageGeneration, } from './image-generation-run.js';
5
+ import { IMAGE_GENERATION_ASPECTS, isImageGenerationAspect, prepareImageGenerationRequest, } from './image-generation-request.js';
9
6
  import { IMAGE_GENERATION_PROVIDERS, isImageGenerationProvider, preflightImageProvider, } from './image-provider-preflight.js';
10
7
  import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
11
- const IMAGE_GENERATION_ASPECTS = ['landscape', 'portrait', 'square'];
12
- const isImageGenerationAspect = (value) => (IMAGE_GENERATION_ASPECTS.includes(value));
13
- const sha256 = (value) => (createHash('sha256').update(value).digest('hex'));
14
8
  const referenceFlag = (flags) => {
15
9
  const numbered = ['reference-1', 'reference-2', 'reference-3', 'reference-4']
16
10
  .filter((name) => stringFlag(flags, name) !== undefined);
@@ -40,17 +34,6 @@ const promptInput = async (flags) => {
40
34
  throw new Error('--prompt-file must not be empty');
41
35
  return { prompt, source: { kind: 'file', path: promptPath } };
42
36
  };
43
- const pathExists = async (target) => {
44
- try {
45
- await lstat(target);
46
- return true;
47
- }
48
- catch (error) {
49
- if (error.code === 'ENOENT')
50
- return false;
51
- throw error;
52
- }
53
- };
54
37
  export const runImageCommand = async (action, flags, dependencies = {}) => {
55
38
  if (action !== 'generate') {
56
39
  throw new Error('Usage: 12ui image generate --prompt <text>|--prompt-file <file>'
@@ -70,15 +53,6 @@ export const runImageCommand = async (action, flags, dependencies = {}) => {
70
53
  if (path.extname(outputPath).toLowerCase() !== '.png') {
71
54
  throw new Error('--out must end in .png because image generate always writes PNG bytes');
72
55
  }
73
- const attemptFile = imageAttemptPath(outputPath);
74
- if (await pathExists(outputPath)) {
75
- throw new Error(`Refusing to dispatch because output already exists at ${outputPath}`);
76
- }
77
- if (await pathExists(attemptFile)) {
78
- throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
79
- + ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
80
- }
81
- await mkdir(path.dirname(outputPath), { recursive: true });
82
56
  const providerValue = stringFlag(flags, 'provider') ?? 'auto';
83
57
  if (!isImageGenerationProvider(providerValue)) {
84
58
  throw new Error(`--provider must be one of: ${IMAGE_GENERATION_PROVIDERS.join(', ')}`);
@@ -90,91 +64,23 @@ export const runImageCommand = async (action, flags, dependencies = {}) => {
90
64
  const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
91
65
  if (!idempotencyKey)
92
66
  throw new Error('--idempotency-key is required');
93
- const referenceBytes = new Uint8Array(await readFile(referencePath));
94
- const reference = {
95
- path: referencePath,
96
- sha256: sha256(referenceBytes),
97
- dataUrl: await referenceImageDataUrl(referenceBytes, referencePath),
98
- };
99
- const preflight = await (dependencies.preflight ?? preflightImageProvider)({
100
- provider: providerValue,
101
- projectRoot,
102
- });
103
- const attempt = {
104
- schemaVersion: 2,
105
- status: 'prepared',
106
- idempotencyKey,
107
- provider: preflight.provider,
108
- model: preflight.model,
109
- providerIdempotencyEnforced: preflight.provider === 'openai',
110
- providerEvidence: preflight.provider === 'codex'
111
- ? { codexVersion: preflight.codexVersion }
112
- : { keySource: preflight.keySource },
67
+ const request = await prepareImageGenerationRequest({
113
68
  prompt,
114
69
  promptSource,
115
- promptSha256: sha256(prompt),
116
- reference: { path: reference.path, sha256: reference.sha256 },
70
+ referencePath,
117
71
  outputPath,
118
- preparedAt: new Date().toISOString(),
119
- };
120
- await writeImageGenerationAttempt(attemptFile, attempt, true).catch((error) => {
121
- if (error.code === 'EEXIST') {
122
- throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
123
- + ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
124
- }
125
- throw error;
72
+ projectRoot,
73
+ provider: providerValue,
74
+ aspect: aspectValue,
75
+ idempotencyKey,
126
76
  });
127
- attempt.status = 'dispatched';
128
- attempt.dispatchedAt = new Date().toISOString();
129
- await writeImageGenerationAttempt(attemptFile, attempt);
130
- try {
131
- const agent = {
132
- agent_id: `12ui-image-${sha256(idempotencyKey).slice(0, 16)}`,
133
- model: preflight.model,
134
- cwd: projectRoot,
135
- retryOptions: { maxRetries: 0 },
136
- };
137
- const options = {
138
- n: 1,
139
- size: aspectValue,
140
- quality: 'high',
141
- source_images: [reference.dataUrl],
142
- ...(preflight.provider === 'codex'
143
- ? { input_fidelity: 'high' }
144
- : {}),
145
- output_format: 'png',
146
- idempotency_key: idempotencyKey,
147
- request_id: idempotencyKey,
148
- };
149
- const generated = dependencies.generate
150
- ? await dependencies.generate(prompt, agent, options)
151
- : preflight.provider === 'openai'
152
- ? await new OpenAIProvider(preflight.apiKey).createImage(prompt, preflight.model, agent, options)
153
- : await ensembleImage(prompt, agent, options);
154
- if (!Array.isArray(generated) || generated.length !== 1 || typeof generated[0] !== 'string') {
155
- throw new Error('Image provider did not return exactly one image');
156
- }
157
- const bytes = await generatedPngBytes(generated[0]);
158
- await writeFile(outputPath, bytes, { flag: 'wx' });
159
- attempt.status = 'succeeded';
160
- attempt.completedAt = new Date().toISOString();
161
- attempt.outputSha256 = sha256(bytes);
162
- await writeImageGenerationAttempt(attemptFile, attempt);
163
- console.log(JSON.stringify({
164
- provider: attempt.provider,
165
- model: attempt.model,
166
- outputPath,
167
- outputSha256: attempt.outputSha256,
168
- attemptFile,
169
- }, null, 2));
170
- }
171
- catch (error) {
172
- attempt.status = 'failed';
173
- attempt.completedAt = new Date().toISOString();
174
- attempt.error = error instanceof Error ? error.message : String(error);
175
- await writeImageGenerationAttempt(attemptFile, attempt);
176
- throw new Error(`Image generation failed after dispatch with ${attempt.provider}; no provider fallback`
177
- + ` was attempted. Evidence: ${attemptFile}. ${attempt.error}`, { cause: error });
178
- }
77
+ const preflight = await (dependencies.preflight ?? preflightImageProvider)({
78
+ provider: providerValue,
79
+ projectRoot,
80
+ });
81
+ const reserved = await reserveImageGeneration({ request, preflight });
82
+ await markImageGenerationDispatched(reserved);
83
+ const result = await dispatchImageGeneration(reserved, { generate: dependencies.generate });
84
+ console.log(JSON.stringify(result, null, 2));
179
85
  };
180
86
  //# sourceMappingURL=cli-image-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-image-command.js","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-image-command.js","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { retireRecognizedLegacyCli, type RetiredLegacyCli } from './legacy-cli-cleanup.js';
2
+ import { retireRecognizedNpmGlobalLegacyCli, type RetiredLegacyNpmGlobalCli } from './legacy-npm-global-cli-cleanup.js';
2
3
  type NpmInstallInvocation = {
3
4
  executable: 'npm' | 'npm.cmd';
4
5
  arguments: string[];
@@ -16,6 +17,7 @@ export type CliPersistenceResult = {
16
17
  dataRoot: string;
17
18
  launcher: string;
18
19
  retiredLegacyCli?: RetiredLegacyCli;
20
+ retiredLegacyNpmGlobalCli?: RetiredLegacyNpmGlobalCli;
19
21
  };
20
22
  export declare const resolveCliInstallLayout: (environment?: NodeJS.ProcessEnv, homeDirectory?: string, platform?: NodeJS.Platform) => {
21
23
  dataRoot: string;
@@ -28,6 +30,7 @@ export declare const persistCurrentCli: (args?: {
28
30
  runNpmInstall?: NpmInstallRunner;
29
31
  runLauncherCheck?: LauncherCheckRunner;
30
32
  retireLegacyCli?: typeof retireRecognizedLegacyCli;
33
+ retireNpmGlobalLegacyCli?: typeof retireRecognizedNpmGlobalLegacyCli;
31
34
  }) => Promise<CliPersistenceResult>;
32
35
  export declare const runningPackageRoot: () => string;
33
36
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"cli-persistence.d.ts","sourceRoot":"","sources":["../src/cli-persistence.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,yBAAyB,EACzB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAIjC,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,UAAU,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5E,KAAK,mBAAmB,GAAG,CAAC,IAAI,EAAE;IAChC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAmCpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAsLF,eAAO,MAAM,uBAAuB,GAClC,cAAa,MAAM,CAAC,UAAwB,EAC5C,sBAA4B,EAC5B,WAAU,MAAM,CAAC,QAA2B,KAC3C;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAuBlB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,OAAM;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,eAAe,CAAC,EAAE,OAAO,yBAAyB,CAAC;CAC/C,KAAG,OAAO,CAAC,oBAAoB,CAiLpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,MAErC,CAAC"}
1
+ {"version":3,"file":"cli-persistence.d.ts","sourceRoot":"","sources":["../src/cli-persistence.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,yBAAyB,EAEzB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kCAAkC,EAElC,KAAK,yBAAyB,EAC/B,MAAM,oCAAoC,CAAC;AAI5C,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;CAChC,CAAC;AAEF,KAAK,gBAAgB,GAAG,CAAC,UAAU,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5E,KAAK,mBAAmB,GAAG,CAAC,IAAI,EAAE;IAChC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAmCpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,QAAQ,GAAG,KAAK,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CACvD,CAAC;AAsLF,eAAO,MAAM,uBAAuB,GAClC,cAAa,MAAM,CAAC,UAAwB,EAC5C,sBAA4B,EAC5B,WAAU,MAAM,CAAC,QAA2B,KAC3C;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAuBlB,CAAC;AA2DF,eAAO,MAAM,iBAAiB,GAAU,OAAM;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC,eAAe,CAAC,EAAE,OAAO,yBAAyB,CAAC;IACnD,wBAAwB,CAAC,EAAE,OAAO,kCAAkC,CAAC;CACjE,KAAG,OAAO,CAAC,oBAAoB,CAwMpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,MAErC,CAAC"}
@@ -5,7 +5,8 @@ import os from 'node:os';
5
5
  import path from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import { promisify } from 'node:util';
8
- import { retireRecognizedLegacyCli, } from './legacy-cli-cleanup.js';
8
+ import { retireRecognizedLegacyCli, restoreRetiredLegacyCli, } from './legacy-cli-cleanup.js';
9
+ import { retireRecognizedNpmGlobalLegacyCli, restoreRetiredNpmGlobalLegacyCli, } from './legacy-npm-global-cli-cleanup.js';
9
10
  const execFileAsync = promisify(execFile);
10
11
  const runNpmInstall = async (invocation) => {
11
12
  await execFileAsync(invocation.executable, invocation.arguments, {
@@ -177,6 +178,45 @@ export const resolveCliInstallLayout = (environment = process.env, homeDirectory
177
178
  launcher: path.join(homeDirectory, '.local', 'bin', '12ui'),
178
179
  };
179
180
  };
181
+ const retireLegacyCliInstallations = async (args) => {
182
+ const retirements = await Promise.allSettled([
183
+ (args.retireLegacyCli ?? retireRecognizedLegacyCli)({
184
+ dataRoot: args.dataRoot,
185
+ homeDirectory: args.homeDirectory,
186
+ }),
187
+ args.platform === 'win32'
188
+ ? Promise.resolve(null)
189
+ : (args.retireNpmGlobalLegacyCli ?? retireRecognizedNpmGlobalLegacyCli)({
190
+ dataRoot: args.dataRoot,
191
+ homeDirectory: args.homeDirectory,
192
+ }),
193
+ ]);
194
+ const retiredLegacyCli = retirements[0].status === 'fulfilled'
195
+ ? retirements[0].value
196
+ : null;
197
+ const retiredLegacyNpmGlobalCli = retirements[1].status === 'fulfilled'
198
+ ? retirements[1].value
199
+ : null;
200
+ const retirementErrors = retirements.flatMap((result) => (result.status === 'rejected'
201
+ ? [result.reason instanceof Error ? result.reason : new Error(String(result.reason))]
202
+ : []));
203
+ if (retirementErrors.length === 0) {
204
+ return { retiredLegacyCli, retiredLegacyNpmGlobalCli };
205
+ }
206
+ const restorationResults = await Promise.allSettled([
207
+ ...(retiredLegacyCli ? [restoreRetiredLegacyCli(retiredLegacyCli)] : []),
208
+ ...(retiredLegacyNpmGlobalCli
209
+ ? [restoreRetiredNpmGlobalLegacyCli(retiredLegacyNpmGlobalCli)]
210
+ : []),
211
+ ]);
212
+ const restorationErrors = restorationResults.flatMap((result) => (result.status === 'rejected'
213
+ ? [result.reason instanceof Error ? result.reason : new Error(String(result.reason))]
214
+ : []));
215
+ if (restorationErrors.length > 0 || retirementErrors.length > 1) {
216
+ throw new AggregateError([...retirementErrors, ...restorationErrors], 'Legacy 12ui CLI retirement failed');
217
+ }
218
+ throw retirementErrors[0];
219
+ };
180
220
  export const persistCurrentCli = async (args = {}) => {
181
221
  const environment = args.environment ?? process.env;
182
222
  const homeDirectory = args.homeDirectory ?? os.homedir();
@@ -188,11 +228,29 @@ export const persistCurrentCli = async (args = {}) => {
188
228
  if (!bundleRoot || !path.isAbsolute(bundleRoot)) {
189
229
  throw new Error('The npm-free installer did not provide an absolute TWELVE_UI_BUNDLE_ROOT');
190
230
  }
231
+ await (args.runLauncherCheck ?? runLauncherCheck)({
232
+ environment,
233
+ launcher: path.join(bundleRoot, 'bin', '12ui'),
234
+ version: identity.version,
235
+ });
236
+ const retired = await retireLegacyCliInstallations({
237
+ dataRoot: layout.dataRoot,
238
+ homeDirectory,
239
+ platform,
240
+ retireLegacyCli: args.retireLegacyCli,
241
+ retireNpmGlobalLegacyCli: args.retireNpmGlobalLegacyCli,
242
+ });
191
243
  return {
192
244
  source: 'bundle',
193
245
  version: identity.version,
194
246
  dataRoot: layout.dataRoot,
195
247
  launcher: layout.launcher,
248
+ ...(retired.retiredLegacyCli
249
+ ? { retiredLegacyCli: retired.retiredLegacyCli }
250
+ : {}),
251
+ ...(retired.retiredLegacyNpmGlobalCli
252
+ ? { retiredLegacyNpmGlobalCli: retired.retiredLegacyNpmGlobalCli }
253
+ : {}),
196
254
  };
197
255
  }
198
256
  const versionsRoot = path.join(layout.dataRoot, 'versions');
@@ -278,6 +336,7 @@ export const persistCurrentCli = async (args = {}) => {
278
336
  ? `@echo off\r\n"${process.execPath.replaceAll('%', '%%')}" "${cliPath.replaceAll('%', '%%')}" %*\r\n`
279
337
  : `#!/bin/sh\nexec "${process.execPath}" "${cliPath}" "$@"\n`;
280
338
  let retiredLegacyCli = null;
339
+ let retiredLegacyNpmGlobalCli = null;
281
340
  try {
282
341
  await writeExecutableAtomic(layout.launcher, launcher, platform);
283
342
  await (args.runLauncherCheck ?? runLauncherCheck)({
@@ -285,10 +344,13 @@ export const persistCurrentCli = async (args = {}) => {
285
344
  launcher: layout.launcher,
286
345
  version: identity.version,
287
346
  });
288
- retiredLegacyCli = await (args.retireLegacyCli ?? retireRecognizedLegacyCli)({
347
+ ({ retiredLegacyCli, retiredLegacyNpmGlobalCli } = await retireLegacyCliInstallations({
289
348
  dataRoot: layout.dataRoot,
290
349
  homeDirectory,
291
- });
350
+ platform,
351
+ retireLegacyCli: args.retireLegacyCli,
352
+ retireNpmGlobalLegacyCli: args.retireNpmGlobalLegacyCli,
353
+ }));
292
354
  }
293
355
  catch (error) {
294
356
  const rollbackErrors = [];
@@ -320,6 +382,7 @@ export const persistCurrentCli = async (args = {}) => {
320
382
  dataRoot: layout.dataRoot,
321
383
  launcher: layout.launcher,
322
384
  ...(retiredLegacyCli ? { retiredLegacyCli } : {}),
385
+ ...(retiredLegacyNpmGlobalCli ? { retiredLegacyNpmGlobalCli } : {}),
323
386
  };
324
387
  };
325
388
  export const runningPackageRoot = () => (path.dirname(path.dirname(fileURLToPath(import.meta.url))));