@12ui/design 0.2.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 +484 -0
- package/dist/artifact-materializer.d.ts +17 -0
- package/dist/artifact-materializer.d.ts.map +1 -0
- package/dist/artifact-materializer.js +66 -0
- package/dist/artifact-materializer.js.map +1 -0
- package/dist/cli-arguments.d.ts +8 -0
- package/dist/cli-arguments.d.ts.map +1 -0
- package/dist/cli-arguments.js +39 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli-auth-command.d.ts +3 -0
- package/dist/cli-auth-command.d.ts.map +1 -0
- package/dist/cli-auth-command.js +100 -0
- package/dist/cli-auth-command.js.map +1 -0
- package/dist/cli-corpus-command.d.ts +12 -0
- package/dist/cli-corpus-command.d.ts.map +1 -0
- package/dist/cli-corpus-command.js +120 -0
- package/dist/cli-corpus-command.js.map +1 -0
- package/dist/cli-corpus-evidence.d.ts +17 -0
- package/dist/cli-corpus-evidence.d.ts.map +1 -0
- package/dist/cli-corpus-evidence.js +150 -0
- package/dist/cli-corpus-evidence.js.map +1 -0
- package/dist/cli-corpus-reference-downloads.d.ts +8 -0
- package/dist/cli-corpus-reference-downloads.d.ts.map +1 -0
- package/dist/cli-corpus-reference-downloads.js +111 -0
- package/dist/cli-corpus-reference-downloads.js.map +1 -0
- package/dist/cli-corpus-reference-receipts.d.ts +36 -0
- package/dist/cli-corpus-reference-receipts.d.ts.map +1 -0
- package/dist/cli-corpus-reference-receipts.js +137 -0
- package/dist/cli-corpus-reference-receipts.js.map +1 -0
- package/dist/cli-corpus-run.d.ts +17 -0
- package/dist/cli-corpus-run.d.ts.map +1 -0
- package/dist/cli-corpus-run.js +94 -0
- package/dist/cli-corpus-run.js.map +1 -0
- package/dist/cli-corpus-types.d.ts +52 -0
- package/dist/cli-corpus-types.d.ts.map +1 -0
- package/dist/cli-corpus-types.js +6 -0
- package/dist/cli-corpus-types.js.map +1 -0
- package/dist/cli-export-command.d.ts +3 -0
- package/dist/cli-export-command.d.ts.map +1 -0
- package/dist/cli-export-command.js +234 -0
- package/dist/cli-export-command.js.map +1 -0
- package/dist/cli-image-command.d.ts +8 -0
- package/dist/cli-image-command.d.ts.map +1 -0
- package/dist/cli-image-command.js +193 -0
- package/dist/cli-image-command.js.map +1 -0
- package/dist/cli-persistence.d.ts +25 -0
- package/dist/cli-persistence.d.ts.map +1 -0
- package/dist/cli-persistence.js +253 -0
- package/dist/cli-persistence.js.map +1 -0
- package/dist/cli-skill-command.d.ts +9 -0
- package/dist/cli-skill-command.d.ts.map +1 -0
- package/dist/cli-skill-command.js +215 -0
- package/dist/cli-skill-command.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +272 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-skill-config.d.ts +3 -0
- package/dist/codex-skill-config.d.ts.map +1 -0
- package/dist/codex-skill-config.js +83 -0
- package/dist/codex-skill-config.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +34 -0
- package/dist/config.js.map +1 -0
- package/dist/conversion-client.d.ts +264 -0
- package/dist/conversion-client.d.ts.map +1 -0
- package/dist/conversion-client.js +445 -0
- package/dist/conversion-client.js.map +1 -0
- package/dist/conversion-models.d.ts +4 -0
- package/dist/conversion-models.d.ts.map +1 -0
- package/dist/conversion-models.js +3 -0
- package/dist/conversion-models.js.map +1 -0
- package/dist/conversion-outputs.d.ts +118 -0
- package/dist/conversion-outputs.d.ts.map +1 -0
- package/dist/conversion-outputs.js +84 -0
- package/dist/conversion-outputs.js.map +1 -0
- package/dist/conversion-problems.d.ts +3 -0
- package/dist/conversion-problems.d.ts.map +1 -0
- package/dist/conversion-problems.js +21 -0
- package/dist/conversion-problems.js.map +1 -0
- package/dist/corpus-client.d.ts +171 -0
- package/dist/corpus-client.d.ts.map +1 -0
- package/dist/corpus-client.js +85 -0
- package/dist/corpus-client.js.map +1 -0
- package/dist/credential-setup.d.ts +27 -0
- package/dist/credential-setup.d.ts.map +1 -0
- package/dist/credential-setup.js +242 -0
- package/dist/credential-setup.js.map +1 -0
- package/dist/credential-store.d.ts +12 -0
- package/dist/credential-store.d.ts.map +1 -0
- package/dist/credential-store.js +103 -0
- package/dist/credential-store.js.map +1 -0
- package/dist/idempotency-key.d.ts +2 -0
- package/dist/idempotency-key.d.ts.map +1 -0
- package/dist/idempotency-key.js +19 -0
- package/dist/idempotency-key.js.map +1 -0
- package/dist/image-generation-evidence.d.ts +26 -0
- package/dist/image-generation-evidence.d.ts.map +1 -0
- package/dist/image-generation-evidence.js +28 -0
- package/dist/image-generation-evidence.js.map +1 -0
- package/dist/image-output-width.d.ts +11 -0
- package/dist/image-output-width.d.ts.map +1 -0
- package/dist/image-output-width.js +55 -0
- package/dist/image-output-width.js.map +1 -0
- package/dist/image-provider-preflight.d.ts +21 -0
- package/dist/image-provider-preflight.d.ts.map +1 -0
- package/dist/image-provider-preflight.js +184 -0
- package/dist/image-provider-preflight.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-codex-cleanup.d.ts +11 -0
- package/dist/legacy-codex-cleanup.d.ts.map +1 -0
- package/dist/legacy-codex-cleanup.js +147 -0
- package/dist/legacy-codex-cleanup.js.map +1 -0
- package/dist/legacy-skill-catalog.d.ts +5 -0
- package/dist/legacy-skill-catalog.d.ts.map +1 -0
- package/dist/legacy-skill-catalog.js +123 -0
- package/dist/legacy-skill-catalog.js.map +1 -0
- package/dist/local-conversion-input.d.ts +21 -0
- package/dist/local-conversion-input.d.ts.map +1 -0
- package/dist/local-conversion-input.js +54 -0
- package/dist/local-conversion-input.js.map +1 -0
- package/dist/login-auth.d.ts +63 -0
- package/dist/login-auth.d.ts.map +1 -0
- package/dist/login-auth.js +282 -0
- package/dist/login-auth.js.map +1 -0
- package/dist/package-client.d.ts +147 -0
- package/dist/package-client.d.ts.map +1 -0
- package/dist/package-client.js +119 -0
- package/dist/package-client.js.map +1 -0
- package/dist/project-profiles.d.ts +45 -0
- package/dist/project-profiles.d.ts.map +1 -0
- package/dist/project-profiles.js +162 -0
- package/dist/project-profiles.js.map +1 -0
- package/dist/responsive-quality.d.ts +26 -0
- package/dist/responsive-quality.d.ts.map +1 -0
- package/dist/responsive-quality.js +68 -0
- package/dist/responsive-quality.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +173 -0
- package/dist/server.js.map +1 -0
- package/dist/skill-installer.d.ts +51 -0
- package/dist/skill-installer.d.ts.map +1 -0
- package/dist/skill-installer.js +328 -0
- package/dist/skill-installer.js.map +1 -0
- package/package.json +53 -0
- package/skills/design/SKILL.md +156 -0
- package/skills/design/agents/openai.yaml +6 -0
- package/skills/design/references/selection-contract.md +44 -0
- package/skills/design-convert/SKILL.md +118 -0
- package/skills/design-convert/agents/openai.yaml +6 -0
- package/skills/design-search/SKILL.md +86 -0
- package/skills/design-search/agents/openai.yaml +6 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { lstat, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { ensembleImage } from '@just-every/ensemble';
|
|
5
|
+
import { OpenAIProvider } from '@just-every/ensemble/model_providers/openai';
|
|
6
|
+
import { stringFlag } from './cli-arguments.js';
|
|
7
|
+
import { imageAttemptPath, writeImageGenerationAttempt, } from './image-generation-evidence.js';
|
|
8
|
+
import { IMAGE_GENERATION_PROVIDERS, isImageGenerationProvider, preflightImageProvider, } from './image-provider-preflight.js';
|
|
9
|
+
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
10
|
+
const IMAGE_GENERATION_ASPECTS = ['landscape', 'portrait', 'square'];
|
|
11
|
+
const isImageGenerationAspect = (value) => (IMAGE_GENERATION_ASPECTS.includes(value));
|
|
12
|
+
const sha256 = (value) => (createHash('sha256').update(value).digest('hex'));
|
|
13
|
+
const referenceFlags = (flags) => {
|
|
14
|
+
const values = ['reference-1', 'reference-2', 'reference-3', 'reference-4']
|
|
15
|
+
.map((name) => stringFlag(flags, name)?.trim())
|
|
16
|
+
.filter((value) => Boolean(value));
|
|
17
|
+
if (values.length !== 4) {
|
|
18
|
+
throw new Error('image generate requires exactly --reference-1, --reference-2, --reference-3, and --reference-4');
|
|
19
|
+
}
|
|
20
|
+
return values;
|
|
21
|
+
};
|
|
22
|
+
const imageDataUrl = (bytes, filePath) => {
|
|
23
|
+
const extension = path.extname(filePath).toLowerCase();
|
|
24
|
+
const mediaType = extension === '.png'
|
|
25
|
+
? 'image/png'
|
|
26
|
+
: extension === '.jpg' || extension === '.jpeg'
|
|
27
|
+
? 'image/jpeg'
|
|
28
|
+
: extension === '.webp'
|
|
29
|
+
? 'image/webp'
|
|
30
|
+
: null;
|
|
31
|
+
if (!mediaType) {
|
|
32
|
+
throw new Error(`Reference images must be PNG, JPEG, or WebP: ${filePath}`);
|
|
33
|
+
}
|
|
34
|
+
return `data:${mediaType};base64,${Buffer.from(bytes).toString('base64')}`;
|
|
35
|
+
};
|
|
36
|
+
const generatedBytes = async (result) => {
|
|
37
|
+
if (/^https?:\/\//iu.test(result)) {
|
|
38
|
+
const response = await fetch(result);
|
|
39
|
+
if (!response.ok)
|
|
40
|
+
throw new Error(`Generated image download failed with HTTP ${response.status}`);
|
|
41
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
42
|
+
}
|
|
43
|
+
const dataUrl = result.match(/^data:image\/(?:png|jpeg|webp);base64,(.+)$/isu);
|
|
44
|
+
const encoded = dataUrl?.[1] ?? result;
|
|
45
|
+
const bytes = new Uint8Array(Buffer.from(encoded, 'base64'));
|
|
46
|
+
if (bytes.byteLength === 0)
|
|
47
|
+
throw new Error('Image provider returned an empty image');
|
|
48
|
+
return bytes;
|
|
49
|
+
};
|
|
50
|
+
const pathExists = async (target) => {
|
|
51
|
+
try {
|
|
52
|
+
await lstat(target);
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (error.code === 'ENOENT')
|
|
57
|
+
return false;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
export const runImageCommand = async (action, flags, dependencies = {}) => {
|
|
62
|
+
if (action !== 'generate') {
|
|
63
|
+
throw new Error('Usage: 12ui image generate --prompt-file <file> --reference-1 <file>'
|
|
64
|
+
+ ' --reference-2 <file> --reference-3 <file> --reference-4 <file>'
|
|
65
|
+
+ ' --out <file> --aspect landscape|portrait|square'
|
|
66
|
+
+ ' --provider auto|codex|openai --project-root <directory>'
|
|
67
|
+
+ ' --idempotency-key <key>');
|
|
68
|
+
}
|
|
69
|
+
const promptPath = path.resolve(stringFlag(flags, 'prompt-file') ?? '');
|
|
70
|
+
const outputPath = path.resolve(stringFlag(flags, 'out') ?? '');
|
|
71
|
+
const projectRoot = path.resolve(stringFlag(flags, 'project-root') ?? '');
|
|
72
|
+
if (!stringFlag(flags, 'prompt-file'))
|
|
73
|
+
throw new Error('--prompt-file is required');
|
|
74
|
+
if (!stringFlag(flags, 'out'))
|
|
75
|
+
throw new Error('--out is required');
|
|
76
|
+
if (!stringFlag(flags, 'project-root'))
|
|
77
|
+
throw new Error('--project-root is required');
|
|
78
|
+
const attemptFile = imageAttemptPath(outputPath);
|
|
79
|
+
if (await pathExists(outputPath)) {
|
|
80
|
+
throw new Error(`Refusing to dispatch because output already exists at ${outputPath}`);
|
|
81
|
+
}
|
|
82
|
+
if (await pathExists(attemptFile)) {
|
|
83
|
+
throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
|
|
84
|
+
+ ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
|
|
85
|
+
}
|
|
86
|
+
await mkdir(path.dirname(outputPath), { recursive: true });
|
|
87
|
+
const providerValue = stringFlag(flags, 'provider') ?? 'auto';
|
|
88
|
+
if (!isImageGenerationProvider(providerValue)) {
|
|
89
|
+
throw new Error(`--provider must be one of: ${IMAGE_GENERATION_PROVIDERS.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
const aspectValue = stringFlag(flags, 'aspect') ?? 'landscape';
|
|
92
|
+
if (!isImageGenerationAspect(aspectValue)) {
|
|
93
|
+
throw new Error(`--aspect must be one of: ${IMAGE_GENERATION_ASPECTS.join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
|
|
96
|
+
if (!idempotencyKey)
|
|
97
|
+
throw new Error('--idempotency-key is required');
|
|
98
|
+
const prompt = (await readFile(promptPath, 'utf8')).trim();
|
|
99
|
+
if (!prompt)
|
|
100
|
+
throw new Error('--prompt-file must not be empty');
|
|
101
|
+
const references = await Promise.all(referenceFlags(flags).map(async (value) => {
|
|
102
|
+
const referencePath = path.resolve(value);
|
|
103
|
+
const bytes = new Uint8Array(await readFile(referencePath));
|
|
104
|
+
return {
|
|
105
|
+
path: referencePath,
|
|
106
|
+
bytes,
|
|
107
|
+
sha256: sha256(bytes),
|
|
108
|
+
dataUrl: imageDataUrl(bytes, referencePath),
|
|
109
|
+
};
|
|
110
|
+
}));
|
|
111
|
+
const preflight = await (dependencies.preflight ?? preflightImageProvider)({
|
|
112
|
+
provider: providerValue,
|
|
113
|
+
projectRoot,
|
|
114
|
+
});
|
|
115
|
+
const attempt = {
|
|
116
|
+
schemaVersion: 1,
|
|
117
|
+
status: 'prepared',
|
|
118
|
+
idempotencyKey,
|
|
119
|
+
provider: preflight.provider,
|
|
120
|
+
model: preflight.model,
|
|
121
|
+
providerEvidence: preflight.provider === 'codex'
|
|
122
|
+
? { codexVersion: preflight.codexVersion }
|
|
123
|
+
: { keySource: preflight.keySource },
|
|
124
|
+
promptFile: promptPath,
|
|
125
|
+
promptSha256: sha256(prompt),
|
|
126
|
+
references: references.map(({ path: referencePath, sha256: digest }) => ({
|
|
127
|
+
path: referencePath,
|
|
128
|
+
sha256: digest,
|
|
129
|
+
})),
|
|
130
|
+
outputPath,
|
|
131
|
+
preparedAt: new Date().toISOString(),
|
|
132
|
+
};
|
|
133
|
+
await writeImageGenerationAttempt(attemptFile, attempt, true).catch((error) => {
|
|
134
|
+
if (error.code === 'EEXIST') {
|
|
135
|
+
throw new Error(`Image attempt evidence already exists at ${attemptFile}. Refusing to redispatch an`
|
|
136
|
+
+ ' ambiguous or completed request; inspect it and use a new output/idempotency key.');
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
139
|
+
});
|
|
140
|
+
attempt.status = 'dispatched';
|
|
141
|
+
attempt.dispatchedAt = new Date().toISOString();
|
|
142
|
+
await writeImageGenerationAttempt(attemptFile, attempt);
|
|
143
|
+
try {
|
|
144
|
+
const agent = {
|
|
145
|
+
agent_id: `12ui-image-${sha256(idempotencyKey).slice(0, 16)}`,
|
|
146
|
+
model: preflight.model,
|
|
147
|
+
cwd: projectRoot,
|
|
148
|
+
retryOptions: { maxRetries: 0 },
|
|
149
|
+
};
|
|
150
|
+
const options = {
|
|
151
|
+
n: 1,
|
|
152
|
+
size: aspectValue,
|
|
153
|
+
quality: 'high',
|
|
154
|
+
source_images: references.map(({ dataUrl }) => dataUrl),
|
|
155
|
+
...(preflight.provider === 'codex'
|
|
156
|
+
? { input_fidelity: 'high' }
|
|
157
|
+
: {}),
|
|
158
|
+
output_format: 'png',
|
|
159
|
+
idempotency_key: idempotencyKey,
|
|
160
|
+
request_id: idempotencyKey,
|
|
161
|
+
};
|
|
162
|
+
const generated = dependencies.generate
|
|
163
|
+
? await dependencies.generate(prompt, agent, options)
|
|
164
|
+
: preflight.provider === 'openai'
|
|
165
|
+
? await new OpenAIProvider(preflight.apiKey).createImage(prompt, preflight.model, agent, options)
|
|
166
|
+
: await ensembleImage(prompt, agent, options);
|
|
167
|
+
if (!Array.isArray(generated) || generated.length !== 1 || typeof generated[0] !== 'string') {
|
|
168
|
+
throw new Error('Image provider did not return exactly one image');
|
|
169
|
+
}
|
|
170
|
+
const bytes = await generatedBytes(generated[0]);
|
|
171
|
+
await writeFile(outputPath, bytes, { flag: 'wx' });
|
|
172
|
+
attempt.status = 'succeeded';
|
|
173
|
+
attempt.completedAt = new Date().toISOString();
|
|
174
|
+
attempt.outputSha256 = sha256(bytes);
|
|
175
|
+
await writeImageGenerationAttempt(attemptFile, attempt);
|
|
176
|
+
console.log(JSON.stringify({
|
|
177
|
+
provider: attempt.provider,
|
|
178
|
+
model: attempt.model,
|
|
179
|
+
outputPath,
|
|
180
|
+
outputSha256: attempt.outputSha256,
|
|
181
|
+
attemptFile,
|
|
182
|
+
}, null, 2));
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
attempt.status = 'failed';
|
|
186
|
+
attempt.completedAt = new Date().toISOString();
|
|
187
|
+
attempt.error = error instanceof Error ? error.message : String(error);
|
|
188
|
+
await writeImageGenerationAttempt(attemptFile, attempt);
|
|
189
|
+
throw new Error(`Image generation failed after dispatch with ${attempt.provider}; no provider fallback`
|
|
190
|
+
+ ` was attempted. Evidence: ${attemptFile}. ${attempt.error}`, { cause: error });
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
//# sourceMappingURL=cli-image-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-image-command.js","sourceRoot":"","sources":["../src/cli-image-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type NpmInstallInvocation = {
|
|
2
|
+
executable: 'npm' | 'npm.cmd';
|
|
3
|
+
arguments: string[];
|
|
4
|
+
environment: NodeJS.ProcessEnv;
|
|
5
|
+
};
|
|
6
|
+
type NpmInstallRunner = (invocation: NpmInstallInvocation) => Promise<void>;
|
|
7
|
+
export type CliPersistenceResult = {
|
|
8
|
+
source: 'bundle' | 'npm';
|
|
9
|
+
version: string;
|
|
10
|
+
dataRoot: string;
|
|
11
|
+
launcher: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const resolveCliInstallLayout: (environment?: NodeJS.ProcessEnv, homeDirectory?: string, platform?: NodeJS.Platform) => {
|
|
14
|
+
dataRoot: string;
|
|
15
|
+
launcher: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const persistCurrentCli: (args?: {
|
|
18
|
+
environment?: NodeJS.ProcessEnv;
|
|
19
|
+
homeDirectory?: string;
|
|
20
|
+
platform?: NodeJS.Platform;
|
|
21
|
+
runNpmInstall?: NpmInstallRunner;
|
|
22
|
+
}) => Promise<CliPersistenceResult>;
|
|
23
|
+
export declare const runningPackageRoot: () => string;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=cli-persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-persistence.d.ts","sourceRoot":"","sources":["../src/cli-persistence.ts"],"names":[],"mappings":"AAoBA,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;AAe5E,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;CAClB,CAAC;AA4JF,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;CAC7B,KAAG,OAAO,CAAC,oBAAoB,CAoIpC,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,MAErC,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { chmod, lstat, mkdir, readFile, readlink, rename, rm, symlink, writeFile, } from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const runNpmInstall = async (invocation) => {
|
|
10
|
+
await execFileAsync(invocation.executable, invocation.arguments, {
|
|
11
|
+
encoding: 'utf8',
|
|
12
|
+
timeout: 5 * 60_000,
|
|
13
|
+
windowsHide: true,
|
|
14
|
+
env: invocation.environment,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
const packageIdentity = async () => {
|
|
18
|
+
const parsed = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
|
|
19
|
+
if (parsed.name !== '@12ui/design' || typeof parsed.version !== 'string') {
|
|
20
|
+
throw new Error('The running CLI is not a publishable @12ui/design package');
|
|
21
|
+
}
|
|
22
|
+
return { name: parsed.name, version: parsed.version };
|
|
23
|
+
};
|
|
24
|
+
const exists = async (target) => {
|
|
25
|
+
try {
|
|
26
|
+
await lstat(target);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error.code === 'ENOENT')
|
|
31
|
+
return false;
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const readLinkOrNull = async (target) => {
|
|
36
|
+
try {
|
|
37
|
+
return await readlink(target);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error.code === 'EINVAL')
|
|
41
|
+
return null;
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const assertManagedLauncherCollision = async (launcher, dataRoot, homeDirectory, platform) => {
|
|
46
|
+
if (!(await exists(launcher)))
|
|
47
|
+
return;
|
|
48
|
+
const link = await readLinkOrNull(launcher);
|
|
49
|
+
if (link !== null) {
|
|
50
|
+
const resolved = path.resolve(path.dirname(launcher), link);
|
|
51
|
+
const bundleLauncher = path.join(dataRoot, 'current', 'bin', '12ui');
|
|
52
|
+
const npmLauncher = path.join(dataRoot, 'current', 'node_modules', '@12ui', 'design', 'dist', 'cli.js');
|
|
53
|
+
if (resolved === bundleLauncher || resolved === npmLauncher)
|
|
54
|
+
return;
|
|
55
|
+
throw new Error(`Refusing to replace unrecognized 12ui launcher symlink at ${launcher}`);
|
|
56
|
+
}
|
|
57
|
+
const source = await readFile(launcher, 'utf8');
|
|
58
|
+
const normalize = (value) => (platform === 'win32' ? value.toLowerCase() : value);
|
|
59
|
+
const normalizedSource = normalize(source);
|
|
60
|
+
const packageCliSuffix = normalize(path.join('@12ui', 'design', 'dist', 'cli.js'));
|
|
61
|
+
const recognizedCurrent = normalizedSource.includes(normalize(path.join(dataRoot, 'current'))) && normalizedSource.includes(packageCliSuffix);
|
|
62
|
+
const recognizedWindowsVersion = platform === 'win32'
|
|
63
|
+
&& normalizedSource.includes(normalize(`${path.join(dataRoot, 'versions')}${path.sep}`))
|
|
64
|
+
&& normalizedSource.includes(packageCliSuffix);
|
|
65
|
+
const legacyRoot = path.join(homeDirectory, '.local', 'share', 'just-every', '12ui-cli');
|
|
66
|
+
const recognizedLegacy = source.includes(legacyRoot)
|
|
67
|
+
&& source.includes('@just-every/12ui/dist/cli.js');
|
|
68
|
+
if (!recognizedCurrent && !recognizedWindowsVersion && !recognizedLegacy) {
|
|
69
|
+
throw new Error(`Refusing to replace unrecognized 12ui launcher at ${launcher}`);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const assertManagedCurrentLink = async (current, dataRoot) => {
|
|
73
|
+
if (!(await exists(current)))
|
|
74
|
+
return;
|
|
75
|
+
const link = await readLinkOrNull(current);
|
|
76
|
+
if (link === null) {
|
|
77
|
+
throw new Error(`Refusing to replace unrecognized 12ui current path at ${current}`);
|
|
78
|
+
}
|
|
79
|
+
const resolved = path.resolve(path.dirname(current), link);
|
|
80
|
+
const versionsRoot = path.join(dataRoot, 'versions');
|
|
81
|
+
const releasesRoot = path.join(dataRoot, 'releases');
|
|
82
|
+
if (!resolved.startsWith(`${versionsRoot}${path.sep}`)
|
|
83
|
+
&& !resolved.startsWith(`${releasesRoot}${path.sep}`)) {
|
|
84
|
+
throw new Error(`Refusing to replace unrecognized 12ui current link at ${current}`);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const verifyInstalledVersion = async (versionRoot, identity) => {
|
|
88
|
+
const installedPackage = path.join(versionRoot, 'node_modules', '@12ui', 'design', 'package.json');
|
|
89
|
+
const installed = JSON.parse(await readFile(installedPackage, 'utf8'));
|
|
90
|
+
if (installed.name !== identity.name || installed.version !== identity.version) {
|
|
91
|
+
throw new Error(`Managed @12ui/design ${identity.version} has been locally modified`);
|
|
92
|
+
}
|
|
93
|
+
await readFile(path.join(versionRoot, 'node_modules', '@12ui', 'design', 'dist', 'cli.js'));
|
|
94
|
+
};
|
|
95
|
+
const writeExecutableAtomic = async (target, source, platform) => {
|
|
96
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
97
|
+
const temporary = `${target}.${randomUUID()}.tmp`;
|
|
98
|
+
try {
|
|
99
|
+
await writeFile(temporary, source, { encoding: 'utf8', flag: 'wx', mode: 0o755 });
|
|
100
|
+
await chmod(temporary, 0o755);
|
|
101
|
+
if (platform === 'win32' && await exists(target)) {
|
|
102
|
+
const previous = `${target}.${randomUUID()}.previous`;
|
|
103
|
+
await rename(target, previous);
|
|
104
|
+
try {
|
|
105
|
+
await rename(temporary, target);
|
|
106
|
+
}
|
|
107
|
+
catch (replacementError) {
|
|
108
|
+
try {
|
|
109
|
+
await rename(previous, target);
|
|
110
|
+
}
|
|
111
|
+
catch (rollbackError) {
|
|
112
|
+
throw new AggregateError([replacementError, rollbackError], `Failed to replace and restore the managed 12ui launcher at ${target}`);
|
|
113
|
+
}
|
|
114
|
+
throw replacementError;
|
|
115
|
+
}
|
|
116
|
+
await rm(previous, { force: true });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
await rename(temporary, target);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await rm(temporary, { force: true });
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
export const resolveCliInstallLayout = (environment = process.env, homeDirectory = os.homedir(), platform = process.platform) => {
|
|
126
|
+
if (platform === 'win32') {
|
|
127
|
+
const configuredLocalAppData = environment.LOCALAPPDATA?.trim();
|
|
128
|
+
const configuredRoamingAppData = environment.APPDATA?.trim();
|
|
129
|
+
const localAppData = configuredLocalAppData
|
|
130
|
+
? path.resolve(configuredLocalAppData)
|
|
131
|
+
: path.join(homeDirectory, 'AppData', 'Local');
|
|
132
|
+
const roamingAppData = configuredRoamingAppData
|
|
133
|
+
? path.resolve(configuredRoamingAppData)
|
|
134
|
+
: path.join(homeDirectory, 'AppData', 'Roaming');
|
|
135
|
+
return {
|
|
136
|
+
dataRoot: path.join(localAppData, '12ui'),
|
|
137
|
+
launcher: path.join(roamingAppData, 'npm', '12ui.cmd'),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const dataRoot = environment.XDG_DATA_HOME?.trim()
|
|
141
|
+
? path.join(path.resolve(environment.XDG_DATA_HOME), '12ui')
|
|
142
|
+
: path.join(homeDirectory, '.local', 'share', '12ui');
|
|
143
|
+
return {
|
|
144
|
+
dataRoot,
|
|
145
|
+
launcher: path.join(homeDirectory, '.local', 'bin', '12ui'),
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
export const persistCurrentCli = async (args = {}) => {
|
|
149
|
+
const environment = args.environment ?? process.env;
|
|
150
|
+
const homeDirectory = args.homeDirectory ?? os.homedir();
|
|
151
|
+
const platform = args.platform ?? process.platform;
|
|
152
|
+
const identity = await packageIdentity();
|
|
153
|
+
const layout = resolveCliInstallLayout(environment, homeDirectory, platform);
|
|
154
|
+
if (environment.TWELVE_UI_INSTALL_SOURCE === 'bundle') {
|
|
155
|
+
const bundleRoot = environment.TWELVE_UI_BUNDLE_ROOT?.trim();
|
|
156
|
+
if (!bundleRoot || !path.isAbsolute(bundleRoot)) {
|
|
157
|
+
throw new Error('The npm-free installer did not provide an absolute TWELVE_UI_BUNDLE_ROOT');
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
source: 'bundle',
|
|
161
|
+
version: identity.version,
|
|
162
|
+
dataRoot: layout.dataRoot,
|
|
163
|
+
launcher: layout.launcher,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const versionsRoot = path.join(layout.dataRoot, 'versions');
|
|
167
|
+
const versionRoot = path.join(versionsRoot, identity.version);
|
|
168
|
+
await mkdir(versionsRoot, { recursive: true });
|
|
169
|
+
await Promise.all([
|
|
170
|
+
assertManagedLauncherCollision(layout.launcher, layout.dataRoot, homeDirectory, platform),
|
|
171
|
+
...(platform === 'win32'
|
|
172
|
+
? []
|
|
173
|
+
: [assertManagedCurrentLink(path.join(layout.dataRoot, 'current'), layout.dataRoot)]),
|
|
174
|
+
]);
|
|
175
|
+
if (!(await exists(versionRoot))) {
|
|
176
|
+
const staging = path.join(versionsRoot, `.${identity.version}-${randomUUID()}.tmp`);
|
|
177
|
+
await mkdir(staging);
|
|
178
|
+
try {
|
|
179
|
+
await (args.runNpmInstall ?? runNpmInstall)({
|
|
180
|
+
executable: platform === 'win32' ? 'npm.cmd' : 'npm',
|
|
181
|
+
arguments: [
|
|
182
|
+
'install',
|
|
183
|
+
'--no-audit',
|
|
184
|
+
'--no-fund',
|
|
185
|
+
'--omit=dev',
|
|
186
|
+
'--prefix',
|
|
187
|
+
staging,
|
|
188
|
+
`${identity.name}@${identity.version}`,
|
|
189
|
+
],
|
|
190
|
+
environment,
|
|
191
|
+
});
|
|
192
|
+
const installedPackage = path.join(staging, 'node_modules', '@12ui', 'design', 'package.json');
|
|
193
|
+
const installed = JSON.parse(await readFile(installedPackage, 'utf8'));
|
|
194
|
+
if (installed.name !== identity.name || installed.version !== identity.version) {
|
|
195
|
+
throw new Error('npm installed a different @12ui/design package identity');
|
|
196
|
+
}
|
|
197
|
+
await rename(staging, versionRoot);
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
await rm(staging, { recursive: true, force: true });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
await verifyInstalledVersion(versionRoot, identity);
|
|
204
|
+
let cliPath;
|
|
205
|
+
if (platform === 'win32') {
|
|
206
|
+
cliPath = path.join(versionRoot, 'node_modules', '@12ui', 'design', 'dist', 'cli.js');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const current = path.join(layout.dataRoot, 'current');
|
|
210
|
+
const currentTemporary = path.join(layout.dataRoot, `.current-${randomUUID()}.tmp`);
|
|
211
|
+
await symlink(path.relative(layout.dataRoot, versionRoot), currentTemporary, 'dir');
|
|
212
|
+
try {
|
|
213
|
+
await rename(currentTemporary, current);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
if (error.code !== 'EEXIST'
|
|
217
|
+
&& error.code !== 'ENOTEMPTY') {
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
const previous = path.join(layout.dataRoot, `.current-${randomUUID()}.previous`);
|
|
221
|
+
await rename(current, previous);
|
|
222
|
+
try {
|
|
223
|
+
await rename(currentTemporary, current);
|
|
224
|
+
}
|
|
225
|
+
catch (replacementError) {
|
|
226
|
+
try {
|
|
227
|
+
await rename(previous, current);
|
|
228
|
+
}
|
|
229
|
+
catch (rollbackError) {
|
|
230
|
+
throw new AggregateError([replacementError, rollbackError], `Failed to replace and restore the managed 12ui current link at ${current}`);
|
|
231
|
+
}
|
|
232
|
+
throw replacementError;
|
|
233
|
+
}
|
|
234
|
+
await rm(previous, { force: true });
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
await rm(currentTemporary, { force: true });
|
|
238
|
+
}
|
|
239
|
+
cliPath = path.join(current, 'node_modules', '@12ui', 'design', 'dist', 'cli.js');
|
|
240
|
+
}
|
|
241
|
+
const launcher = platform === 'win32'
|
|
242
|
+
? `@echo off\r\n"${process.execPath.replaceAll('%', '%%')}" "${cliPath.replaceAll('%', '%%')}" %*\r\n`
|
|
243
|
+
: `#!/bin/sh\nexec "${process.execPath}" "${cliPath}" "$@"\n`;
|
|
244
|
+
await writeExecutableAtomic(layout.launcher, launcher, platform);
|
|
245
|
+
return {
|
|
246
|
+
source: 'npm',
|
|
247
|
+
version: identity.version,
|
|
248
|
+
dataRoot: layout.dataRoot,
|
|
249
|
+
launcher: layout.launcher,
|
|
250
|
+
};
|
|
251
|
+
};
|
|
252
|
+
export const runningPackageRoot = () => (path.dirname(path.dirname(fileURLToPath(import.meta.url))));
|
|
253
|
+
//# sourceMappingURL=cli-persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-persistence.js","sourceRoot":"","sources":["../src/cli-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type CliFlags } from './cli-arguments.js';
|
|
2
|
+
import { type CliPersistenceResult } from './cli-persistence.js';
|
|
3
|
+
import { prepareConversionCredentials } from './credential-setup.js';
|
|
4
|
+
export type SkillCommandDependencies = {
|
|
5
|
+
persistCli?: () => Promise<CliPersistenceResult>;
|
|
6
|
+
prepareCredentials?: typeof prepareConversionCredentials;
|
|
7
|
+
};
|
|
8
|
+
export declare const runSkillCommand: (action: string | undefined, flags: CliFlags, dependencies?: SkillCommandDependencies) => Promise<void>;
|
|
9
|
+
//# sourceMappingURL=cli-skill-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-skill-command.d.ts","sourceRoot":"","sources":["../src/cli-skill-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAMpF,OAAO,EACL,4BAA4B,EAG7B,MAAM,uBAAuB,CAAC;AA0G/B,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,OAAO,4BAA4B,CAAC;CAC1D,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,QAAQ,EACf,eAAc,wBAA6B,KAC1C,OAAO,CAAC,IAAI,CAqJd,CAAC"}
|