@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,137 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { link, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { REFERENCE_RECEIPT_DIRECTORY, } from './cli-corpus-types.js';
|
|
5
|
+
const isErrno = (error, code) => (error instanceof Error && 'code' in error && error.code === code);
|
|
6
|
+
const readOptional = async (file) => {
|
|
7
|
+
try {
|
|
8
|
+
return await readFile(file);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (isErrno(error, 'ENOENT'))
|
|
12
|
+
return null;
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const parseJson = (bytes, file) => {
|
|
17
|
+
let value;
|
|
18
|
+
try {
|
|
19
|
+
value = JSON.parse(new TextDecoder().decode(bytes));
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new Error(`Corpus reference provenance is invalid: ${file}`, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
25
|
+
throw new Error(`Corpus reference provenance is invalid: ${file}`);
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
};
|
|
29
|
+
// Write to a unique inode first, then hard-link it into the final name. The
|
|
30
|
+
// final path therefore appears fully formed or not at all, and link() refuses
|
|
31
|
+
// to replace evidence that another process or user already placed there.
|
|
32
|
+
const atomicExclusiveWrite = async (target, bytes) => {
|
|
33
|
+
const temporary = `${target}.pending-${randomUUID()}`;
|
|
34
|
+
await writeFile(temporary, bytes, { flag: 'wx' });
|
|
35
|
+
try {
|
|
36
|
+
await link(temporary, target);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await unlink(temporary).catch((error) => {
|
|
40
|
+
if (!isErrno(error, 'ENOENT'))
|
|
41
|
+
throw error;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export const referenceReceiptPaths = (outDir, item, index) => {
|
|
46
|
+
const stem = `${String(index + 1).padStart(2, '0')}-${item.id}`;
|
|
47
|
+
return {
|
|
48
|
+
image: path.join(outDir, `${stem}.webp`),
|
|
49
|
+
intent: path.join(outDir, REFERENCE_RECEIPT_DIRECTORY, `${stem}.intent.json`),
|
|
50
|
+
receipt: path.join(outDir, REFERENCE_RECEIPT_DIRECTORY, `${stem}.json`),
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const expectedIntent = (paths, item, index) => ({
|
|
54
|
+
ordinal: index + 1,
|
|
55
|
+
id: item.id,
|
|
56
|
+
file: path.basename(paths.image),
|
|
57
|
+
});
|
|
58
|
+
const parseIntent = (bytes, file, expected) => {
|
|
59
|
+
const value = parseJson(bytes, file);
|
|
60
|
+
if (value.version !== 1
|
|
61
|
+
|| value.ordinal !== expected.ordinal
|
|
62
|
+
|| value.id !== expected.id
|
|
63
|
+
|| value.file !== expected.file
|
|
64
|
+
|| typeof value.nonce !== 'string'
|
|
65
|
+
|| !/^[0-9a-f-]{36}$/u.test(value.nonce)) {
|
|
66
|
+
throw new Error(`Corpus reference download intent is invalid: ${file}`);
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
};
|
|
70
|
+
const parseReceipt = (bytes, file, intent) => {
|
|
71
|
+
const value = parseJson(bytes, file);
|
|
72
|
+
if (value.version !== 1
|
|
73
|
+
|| value.ordinal !== intent.ordinal
|
|
74
|
+
|| value.id !== intent.id
|
|
75
|
+
|| value.file !== intent.file
|
|
76
|
+
|| value.intentNonce !== intent.nonce
|
|
77
|
+
|| typeof value.sha256 !== 'string'
|
|
78
|
+
|| !/^[a-f0-9]{64}$/u.test(value.sha256)
|
|
79
|
+
|| !Number.isSafeInteger(value.bytes)
|
|
80
|
+
|| !Number.isSafeInteger(value.width)
|
|
81
|
+
|| !Number.isSafeInteger(value.height)) {
|
|
82
|
+
throw new Error(`Corpus reference receipt is invalid: ${file}`);
|
|
83
|
+
}
|
|
84
|
+
return value;
|
|
85
|
+
};
|
|
86
|
+
export const loadReferenceProvenance = async (paths, item, index) => {
|
|
87
|
+
const [intentBytes, receiptBytes] = await Promise.all([
|
|
88
|
+
readOptional(paths.intent),
|
|
89
|
+
readOptional(paths.receipt),
|
|
90
|
+
]);
|
|
91
|
+
if (!intentBytes && receiptBytes) {
|
|
92
|
+
throw new Error(`Corpus reference ${item.id} has a digest receipt without its download intent;`
|
|
93
|
+
+ ' refusing ambiguous evidence');
|
|
94
|
+
}
|
|
95
|
+
const intent = intentBytes
|
|
96
|
+
? parseIntent(intentBytes, paths.intent, expectedIntent(paths, item, index))
|
|
97
|
+
: null;
|
|
98
|
+
const receipt = receiptBytes && intent
|
|
99
|
+
? parseReceipt(receiptBytes, paths.receipt, intent)
|
|
100
|
+
: null;
|
|
101
|
+
return { intent, receipt };
|
|
102
|
+
};
|
|
103
|
+
export const ensureReferenceDownloadIntent = async (paths, item, index, existing) => {
|
|
104
|
+
if (existing)
|
|
105
|
+
return existing;
|
|
106
|
+
const intent = {
|
|
107
|
+
version: 1,
|
|
108
|
+
...expectedIntent(paths, item, index),
|
|
109
|
+
nonce: randomUUID(),
|
|
110
|
+
};
|
|
111
|
+
await atomicExclusiveWrite(paths.intent, `${JSON.stringify(intent, null, 2)}\n`);
|
|
112
|
+
return intent;
|
|
113
|
+
};
|
|
114
|
+
export const writeReferenceReceipt = async (paths, intent, reference) => {
|
|
115
|
+
const receipt = {
|
|
116
|
+
version: 1,
|
|
117
|
+
ordinal: reference.ordinal,
|
|
118
|
+
id: reference.id,
|
|
119
|
+
file: path.basename(reference.file),
|
|
120
|
+
intentNonce: intent.nonce,
|
|
121
|
+
sha256: reference.sha256,
|
|
122
|
+
bytes: reference.bytes,
|
|
123
|
+
width: reference.width,
|
|
124
|
+
height: reference.height,
|
|
125
|
+
};
|
|
126
|
+
await atomicExclusiveWrite(paths.receipt, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
127
|
+
return receipt;
|
|
128
|
+
};
|
|
129
|
+
export const publishReferenceImage = async (paths, bytes) => await atomicExclusiveWrite(paths.image, bytes);
|
|
130
|
+
export const receiptMatchesReference = (receipt, reference) => (receipt.ordinal === reference.ordinal
|
|
131
|
+
&& receipt.id === reference.id
|
|
132
|
+
&& receipt.file === path.basename(reference.file)
|
|
133
|
+
&& receipt.sha256 === reference.sha256
|
|
134
|
+
&& receipt.bytes === reference.bytes
|
|
135
|
+
&& receipt.width === reference.width
|
|
136
|
+
&& receipt.height === reference.height);
|
|
137
|
+
//# sourceMappingURL=cli-corpus-reference-receipts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-reference-receipts.js","sourceRoot":"","sources":["../src/cli-corpus-reference-receipts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { CorpusInspirationRequest } from './corpus-client.js';
|
|
2
|
+
import type { CorpusInspirationManifest, InspirationClient } from './cli-corpus-types.js';
|
|
3
|
+
export declare const downloadCorpusInspiration: (args: {
|
|
4
|
+
client: InspirationClient;
|
|
5
|
+
request: CorpusInspirationRequest;
|
|
6
|
+
outDir: string;
|
|
7
|
+
origin: string;
|
|
8
|
+
idempotencyKey?: string;
|
|
9
|
+
now?: () => Date;
|
|
10
|
+
}) => Promise<CorpusInspirationManifest>;
|
|
11
|
+
export declare const resumeCorpusInspiration: (args: {
|
|
12
|
+
client: InspirationClient;
|
|
13
|
+
outDir: string;
|
|
14
|
+
origin: string;
|
|
15
|
+
now?: () => Date;
|
|
16
|
+
}) => Promise<CorpusInspirationManifest>;
|
|
17
|
+
//# sourceMappingURL=cli-corpus-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-run.d.ts","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAC;AAa5B,OAAO,KAAK,EAEV,yBAAyB,EAEzB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,yBAAyB,GAAU,MAAM;IACpD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CAmDpC,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM;IAClD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,KAAG,OAAO,CAAC,yBAAyB,CA+CpC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { CORPUS_QUERY_IDEMPOTENCY_REVISION } from './corpus-client.js';
|
|
5
|
+
import { assertAttemptMatchesEvidence, assertInspirationRunIncomplete, readInspirationAttempt, readOptionalInspirationEvidence, validateInspirationSet, writeInspirationAttempt, writeInspirationEvidence, writeInspirationManifest, } from './cli-corpus-evidence.js';
|
|
6
|
+
import { completeReferenceDownloads } from './cli-corpus-reference-downloads.js';
|
|
7
|
+
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
8
|
+
export const downloadCorpusInspiration = async (args) => {
|
|
9
|
+
const outDir = path.resolve(args.outDir);
|
|
10
|
+
const origin = new URL(args.origin).origin;
|
|
11
|
+
const status = await args.client.status();
|
|
12
|
+
if (status.queryIdempotencyRevision !== CORPUS_QUERY_IDEMPOTENCY_REVISION) {
|
|
13
|
+
throw new Error(`12UI Worker at ${origin} does not support ${CORPUS_QUERY_IDEMPOTENCY_REVISION};`
|
|
14
|
+
+ ' refusing a paid corpus request');
|
|
15
|
+
}
|
|
16
|
+
await mkdir(path.dirname(outDir), { recursive: true });
|
|
17
|
+
await mkdir(outDir);
|
|
18
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(args.idempotencyKey ?? `corpus-inspire:${randomUUID()}`, 'idempotencyKey');
|
|
19
|
+
if (!idempotencyKey)
|
|
20
|
+
throw new TypeError('idempotencyKey is required');
|
|
21
|
+
const attempt = {
|
|
22
|
+
version: 1,
|
|
23
|
+
createdAt: (args.now ?? (() => new Date()))().toISOString(),
|
|
24
|
+
origin,
|
|
25
|
+
idempotencyKey,
|
|
26
|
+
request: args.request,
|
|
27
|
+
};
|
|
28
|
+
await writeInspirationAttempt(outDir, attempt);
|
|
29
|
+
let response;
|
|
30
|
+
try {
|
|
31
|
+
response = await args.client.inspire(args.request, { idempotencyKey });
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
throw new Error(`Corpus inspiration response is ambiguous; the stable attempt is in ${outDir}.`
|
|
35
|
+
+ ` Resume with "12ui corpus resume --out-dir ${outDir} --origin ${origin}".`, { cause: error });
|
|
36
|
+
}
|
|
37
|
+
const evidence = {
|
|
38
|
+
version: 1,
|
|
39
|
+
request: args.request,
|
|
40
|
+
response,
|
|
41
|
+
};
|
|
42
|
+
await writeInspirationEvidence(outDir, evidence);
|
|
43
|
+
validateInspirationSet(evidence, outDir);
|
|
44
|
+
const references = await completeReferenceDownloads({
|
|
45
|
+
client: args.client,
|
|
46
|
+
evidence,
|
|
47
|
+
outDir,
|
|
48
|
+
origin,
|
|
49
|
+
});
|
|
50
|
+
return await writeInspirationManifest({ attempt, evidence, references, outDir, now: args.now });
|
|
51
|
+
};
|
|
52
|
+
export const resumeCorpusInspiration = async (args) => {
|
|
53
|
+
const outDir = path.resolve(args.outDir);
|
|
54
|
+
const origin = new URL(args.origin).origin;
|
|
55
|
+
const status = await args.client.status();
|
|
56
|
+
if (status.queryIdempotencyRevision !== CORPUS_QUERY_IDEMPOTENCY_REVISION) {
|
|
57
|
+
throw new Error(`12UI Worker at ${origin} does not support ${CORPUS_QUERY_IDEMPOTENCY_REVISION};`
|
|
58
|
+
+ ' refusing corpus resume');
|
|
59
|
+
}
|
|
60
|
+
await assertInspirationRunIncomplete(outDir);
|
|
61
|
+
const attempt = await readInspirationAttempt(outDir);
|
|
62
|
+
if (attempt.origin !== origin) {
|
|
63
|
+
throw new Error(`Corpus inspiration attempt belongs to ${attempt.origin}; refusing resume against ${origin}`);
|
|
64
|
+
}
|
|
65
|
+
let evidence = await readOptionalInspirationEvidence(outDir);
|
|
66
|
+
if (!evidence) {
|
|
67
|
+
let response;
|
|
68
|
+
try {
|
|
69
|
+
response = await args.client.inspire(attempt.request, {
|
|
70
|
+
idempotencyKey: attempt.idempotencyKey,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
throw new Error(`Corpus inspiration response remains ambiguous; retry`
|
|
75
|
+
+ ` "12ui corpus resume --out-dir ${outDir} --origin ${origin}".`, { cause: error });
|
|
76
|
+
}
|
|
77
|
+
evidence = {
|
|
78
|
+
version: 1,
|
|
79
|
+
request: attempt.request,
|
|
80
|
+
response,
|
|
81
|
+
};
|
|
82
|
+
await writeInspirationEvidence(outDir, evidence);
|
|
83
|
+
}
|
|
84
|
+
assertAttemptMatchesEvidence(attempt, evidence);
|
|
85
|
+
validateInspirationSet(evidence, outDir);
|
|
86
|
+
const references = await completeReferenceDownloads({
|
|
87
|
+
client: args.client,
|
|
88
|
+
evidence,
|
|
89
|
+
outDir,
|
|
90
|
+
origin,
|
|
91
|
+
});
|
|
92
|
+
return await writeInspirationManifest({ attempt, evidence, references, outDir, now: args.now });
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=cli-corpus-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-run.js","sourceRoot":"","sources":["../src/cli-corpus-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CorpusAspect, CorpusInspirationRequest, CorpusInspirationResponse, TwelveUiCorpusClient } from './corpus-client.js';
|
|
2
|
+
export declare const CORPUS_USAGE_NOTICE = "These are AI generated screens for reference only. Free to use, no warranty.";
|
|
3
|
+
export declare const INSPIRATION_EVIDENCE_FILE = "inspire-evidence.json";
|
|
4
|
+
export declare const INSPIRATION_ATTEMPT_FILE = "inspire-attempt.json";
|
|
5
|
+
export declare const INSPIRATION_MANIFEST_FILE = "manifest.json";
|
|
6
|
+
export declare const REFERENCE_RECEIPT_DIRECTORY = ".reference-receipts";
|
|
7
|
+
export type InspirationClient = Pick<TwelveUiCorpusClient, 'status' | 'inspire' | 'download'>;
|
|
8
|
+
export type ReferenceClient = Pick<TwelveUiCorpusClient, 'download'>;
|
|
9
|
+
export type CorpusInspirationAttempt = {
|
|
10
|
+
version: 1;
|
|
11
|
+
createdAt: string;
|
|
12
|
+
origin: string;
|
|
13
|
+
idempotencyKey: string;
|
|
14
|
+
request: CorpusInspirationRequest;
|
|
15
|
+
};
|
|
16
|
+
export type CorpusInspirationEvidence = {
|
|
17
|
+
version: 1;
|
|
18
|
+
request: CorpusInspirationRequest;
|
|
19
|
+
response: CorpusInspirationResponse;
|
|
20
|
+
};
|
|
21
|
+
export type DownloadedCorpusReference = {
|
|
22
|
+
ordinal: number;
|
|
23
|
+
id: string;
|
|
24
|
+
role: 'core' | 'stretch';
|
|
25
|
+
arm: string;
|
|
26
|
+
aspect: CorpusAspect;
|
|
27
|
+
file: string;
|
|
28
|
+
sha256: string;
|
|
29
|
+
bytes: number;
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
};
|
|
33
|
+
export type CorpusInspirationManifest = {
|
|
34
|
+
version: 1;
|
|
35
|
+
createdAt: string;
|
|
36
|
+
origin: string;
|
|
37
|
+
idempotencyKey: string;
|
|
38
|
+
notice: typeof CORPUS_USAGE_NOTICE;
|
|
39
|
+
request: CorpusInspirationRequest;
|
|
40
|
+
response: {
|
|
41
|
+
setId: string;
|
|
42
|
+
query: string;
|
|
43
|
+
seed: number;
|
|
44
|
+
k: number;
|
|
45
|
+
poolSize: number;
|
|
46
|
+
coverage: number;
|
|
47
|
+
truncated: boolean;
|
|
48
|
+
weightsSource: CorpusInspirationResponse['weightsSource'];
|
|
49
|
+
};
|
|
50
|
+
references: DownloadedCorpusReference[];
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=cli-corpus-types.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const CORPUS_USAGE_NOTICE = 'These are AI generated screens for reference only. Free to use, no warranty.';
|
|
2
|
+
export const INSPIRATION_EVIDENCE_FILE = 'inspire-evidence.json';
|
|
3
|
+
export const INSPIRATION_ATTEMPT_FILE = 'inspire-attempt.json';
|
|
4
|
+
export const INSPIRATION_MANIFEST_FILE = 'manifest.json';
|
|
5
|
+
export const REFERENCE_RECEIPT_DIRECTORY = '.reference-receipts';
|
|
6
|
+
//# sourceMappingURL=cli-corpus-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-corpus-types.js","sourceRoot":"","sources":["../src/cli-corpus-types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,mBAAmB,GAC9B,8EAA8E,CAAC;AAEjF,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AACjE,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAC/D,MAAM,CAAC,MAAM,yBAAyB,GAAG,eAAe,CAAC;AACzD,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-export-command.d.ts","sourceRoot":"","sources":["../src/cli-export-command.ts"],"names":[],"mappings":"AAQA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA4N/D,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,GAAG,SAAS,EACtC,OAAO,QAAQ,KACd,OAAO,CAAC,IAAI,CAyFd,CAAC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { materializeConversionArtifacts, } from './artifact-materializer.js';
|
|
5
|
+
import { stringFlag } from './cli-arguments.js';
|
|
6
|
+
import { TwelveUiConversionClient, } from './conversion-client.js';
|
|
7
|
+
import { CONVERSION_OUTPUT_FILENAME_SUFFIXES, isConversionOutput, } from './conversion-outputs.js';
|
|
8
|
+
import { readConversionConfig } from './config.js';
|
|
9
|
+
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
10
|
+
import { parseConversionOutputProfile, } from './project-profiles.js';
|
|
11
|
+
import { isResponsiveConversionQuality, } from './responsive-quality.js';
|
|
12
|
+
const sha256 = (bytes) => (createHash('sha256').update(bytes).digest('hex'));
|
|
13
|
+
const parseOutputs = (value) => {
|
|
14
|
+
if (!value?.trim())
|
|
15
|
+
throw new Error('--output is required');
|
|
16
|
+
const outputs = value.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
17
|
+
if (outputs.length === 0)
|
|
18
|
+
throw new Error('--output is required');
|
|
19
|
+
const invalid = outputs.filter((output) => !isConversionOutput(output));
|
|
20
|
+
if (invalid.length > 0)
|
|
21
|
+
throw new Error(`Unsupported export output: ${invalid.join(', ')}`);
|
|
22
|
+
return [...new Set(outputs)];
|
|
23
|
+
};
|
|
24
|
+
const readProfile = async (output, value) => {
|
|
25
|
+
if (!value?.trim()) {
|
|
26
|
+
throw new Error(`${output === 'web_project' ? '--web-profile' : '--app-profile'} is required`
|
|
27
|
+
+ ` when exporting ${output}`);
|
|
28
|
+
}
|
|
29
|
+
const trimmed = value.trim();
|
|
30
|
+
const source = trimmed.startsWith('{')
|
|
31
|
+
? trimmed
|
|
32
|
+
: await readFile(path.resolve(trimmed.startsWith('@') ? trimmed.slice(1) : trimmed), 'utf8');
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(source);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new Error(`Invalid ${output} profile JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
39
|
+
}
|
|
40
|
+
return parseConversionOutputProfile(output, parsed);
|
|
41
|
+
};
|
|
42
|
+
const outputIdempotencyKey = (base, output, requestShapeSha256) => {
|
|
43
|
+
const suffix = `${output}:${requestShapeSha256.slice(0, 32)}`;
|
|
44
|
+
return `${base.slice(0, 128 - suffix.length - 1)}:${suffix}`;
|
|
45
|
+
};
|
|
46
|
+
const prepareExportPlan = (args) => {
|
|
47
|
+
const requestShape = args.output === 'html'
|
|
48
|
+
? {
|
|
49
|
+
output: args.output,
|
|
50
|
+
responsiveQuality: args.responsiveQuality,
|
|
51
|
+
}
|
|
52
|
+
: args.output === 'web_project' || args.output === 'app_project'
|
|
53
|
+
? {
|
|
54
|
+
output: args.output,
|
|
55
|
+
profile: args.profile,
|
|
56
|
+
}
|
|
57
|
+
: {
|
|
58
|
+
output: args.output,
|
|
59
|
+
};
|
|
60
|
+
const requestShapeSha256 = sha256(Buffer.from(JSON.stringify(requestShape)));
|
|
61
|
+
return {
|
|
62
|
+
output: args.output,
|
|
63
|
+
request: {
|
|
64
|
+
idempotencyKey: args.output === 'layerdoc'
|
|
65
|
+
? null
|
|
66
|
+
: outputIdempotencyKey(args.idempotencyKey, args.output, requestShapeSha256),
|
|
67
|
+
requestShapeSha256,
|
|
68
|
+
...(args.output === 'html'
|
|
69
|
+
? { responsiveQuality: args.responsiveQuality }
|
|
70
|
+
: {}),
|
|
71
|
+
...(args.output === 'web_project' || args.output === 'app_project'
|
|
72
|
+
? { profile: args.profile }
|
|
73
|
+
: {}),
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
const waitForSuccess = async (client, operation, timeoutMs) => {
|
|
78
|
+
if (operation.status === 'succeeded')
|
|
79
|
+
return operation;
|
|
80
|
+
return client.waitForConversion(operation.id, {
|
|
81
|
+
expiresAt: operation.expires_at,
|
|
82
|
+
timeoutMs,
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
const exportOne = async (args) => {
|
|
86
|
+
const outFile = path.join(args.outDir, args.plan.output === 'html'
|
|
87
|
+
? 'export.responsive.html'
|
|
88
|
+
: args.plan.output === 'html_fixed'
|
|
89
|
+
? 'export.fixed.html'
|
|
90
|
+
: `export.${CONVERSION_OUTPUT_FILENAME_SUFFIXES[args.plan.output]}`);
|
|
91
|
+
if (args.plan.output === 'layerdoc') {
|
|
92
|
+
await writeFile(outFile, args.baseLayerDoc, { flag: 'wx' });
|
|
93
|
+
return {
|
|
94
|
+
output: args.plan.output,
|
|
95
|
+
conversionId: args.source.id,
|
|
96
|
+
outFile,
|
|
97
|
+
artifactManifest: null,
|
|
98
|
+
request: args.plan.request,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const shared = {
|
|
102
|
+
output: args.plan.output,
|
|
103
|
+
idempotencyKey: args.plan.request.idempotencyKey,
|
|
104
|
+
waitSeconds: 20,
|
|
105
|
+
};
|
|
106
|
+
const input = args.plan.output === 'html'
|
|
107
|
+
? {
|
|
108
|
+
sourceConversionId: args.source.id,
|
|
109
|
+
output: 'html',
|
|
110
|
+
responsiveQuality: args.plan.request.responsiveQuality,
|
|
111
|
+
idempotencyKey: shared.idempotencyKey,
|
|
112
|
+
waitSeconds: shared.waitSeconds,
|
|
113
|
+
}
|
|
114
|
+
: args.plan.output === 'web_project'
|
|
115
|
+
? {
|
|
116
|
+
layerdoc: args.baseLayerDoc,
|
|
117
|
+
filename: `${args.source.id}.layerdoc.json`,
|
|
118
|
+
output: 'web_project',
|
|
119
|
+
profile: args.plan.request.profile,
|
|
120
|
+
idempotencyKey: shared.idempotencyKey,
|
|
121
|
+
waitSeconds: shared.waitSeconds,
|
|
122
|
+
}
|
|
123
|
+
: args.plan.output === 'app_project'
|
|
124
|
+
? {
|
|
125
|
+
layerdoc: args.baseLayerDoc,
|
|
126
|
+
filename: `${args.source.id}.layerdoc.json`,
|
|
127
|
+
output: 'app_project',
|
|
128
|
+
profile: args.plan.request.profile,
|
|
129
|
+
idempotencyKey: shared.idempotencyKey,
|
|
130
|
+
waitSeconds: shared.waitSeconds,
|
|
131
|
+
}
|
|
132
|
+
: {
|
|
133
|
+
layerdoc: args.baseLayerDoc,
|
|
134
|
+
filename: `${args.source.id}.layerdoc.json`,
|
|
135
|
+
output: args.plan.output,
|
|
136
|
+
idempotencyKey: shared.idempotencyKey,
|
|
137
|
+
waitSeconds: shared.waitSeconds,
|
|
138
|
+
};
|
|
139
|
+
const completed = await waitForSuccess(args.client, await args.client.createConversion(input), args.timeoutMs);
|
|
140
|
+
const downloaded = await args.client.downloadResult(completed.id, args.plan.output);
|
|
141
|
+
await writeFile(outFile, downloaded.bytes, { flag: 'wx' });
|
|
142
|
+
return {
|
|
143
|
+
output: args.plan.output,
|
|
144
|
+
conversionId: completed.id,
|
|
145
|
+
outFile,
|
|
146
|
+
artifactManifest: await materializeConversionArtifacts(args.client, completed, outFile),
|
|
147
|
+
request: args.plan.request,
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
export const runExportCommand = async (sourceConversionId, flags) => {
|
|
151
|
+
const sourceId = sourceConversionId?.trim();
|
|
152
|
+
if (!sourceId)
|
|
153
|
+
throw new Error('Usage: 12ui export <source-conversion-id> --output <formats>');
|
|
154
|
+
const outputs = parseOutputs(stringFlag(flags, 'output'));
|
|
155
|
+
const outDirValue = stringFlag(flags, 'out-dir');
|
|
156
|
+
if (!outDirValue)
|
|
157
|
+
throw new Error('--out-dir is required');
|
|
158
|
+
const outDir = path.resolve(outDirValue);
|
|
159
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
|
|
160
|
+
if (!idempotencyKey)
|
|
161
|
+
throw new Error('--idempotency-key is required');
|
|
162
|
+
const responsiveValue = stringFlag(flags, 'responsive-quality') ?? 'standard';
|
|
163
|
+
if (!isResponsiveConversionQuality(responsiveValue)) {
|
|
164
|
+
throw new Error('--responsive-quality must be standard or pro');
|
|
165
|
+
}
|
|
166
|
+
const [webProfile, appProfile] = await Promise.all([
|
|
167
|
+
outputs.includes('web_project')
|
|
168
|
+
? readProfile('web_project', stringFlag(flags, 'web-profile'))
|
|
169
|
+
: undefined,
|
|
170
|
+
outputs.includes('app_project')
|
|
171
|
+
? readProfile('app_project', stringFlag(flags, 'app-profile'))
|
|
172
|
+
: undefined,
|
|
173
|
+
]);
|
|
174
|
+
const client = new TwelveUiConversionClient(readConversionConfig({
|
|
175
|
+
origin: stringFlag(flags, 'origin'),
|
|
176
|
+
apiKey: stringFlag(flags, 'api-key'),
|
|
177
|
+
}));
|
|
178
|
+
const source = await client.getConversion(sourceId);
|
|
179
|
+
if (source.status !== 'succeeded' || source.output !== 'layerdoc') {
|
|
180
|
+
throw new Error(`Source conversion ${sourceId} must be a successful layerdoc conversion;`
|
|
181
|
+
+ ` found ${source.status} ${source.output}`);
|
|
182
|
+
}
|
|
183
|
+
const baseLayerDoc = (await client.downloadResult(source.id, 'layerdoc')).bytes;
|
|
184
|
+
await mkdir(outDir, { recursive: false });
|
|
185
|
+
const timeoutValue = stringFlag(flags, 'timeout-ms');
|
|
186
|
+
const timeoutMs = timeoutValue === undefined ? undefined : Number(timeoutValue);
|
|
187
|
+
if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs < 1_000)) {
|
|
188
|
+
throw new Error('--timeout-ms must be a number of at least 1000');
|
|
189
|
+
}
|
|
190
|
+
const plans = outputs.map((output) => prepareExportPlan({
|
|
191
|
+
idempotencyKey,
|
|
192
|
+
output,
|
|
193
|
+
profile: output === 'web_project' ? webProfile : output === 'app_project' ? appProfile : undefined,
|
|
194
|
+
responsiveQuality: responsiveValue,
|
|
195
|
+
}));
|
|
196
|
+
const preparedAt = new Date().toISOString();
|
|
197
|
+
const settled = await Promise.allSettled(plans.map((plan) => exportOne({
|
|
198
|
+
baseLayerDoc,
|
|
199
|
+
client,
|
|
200
|
+
outDir,
|
|
201
|
+
plan,
|
|
202
|
+
source,
|
|
203
|
+
timeoutMs,
|
|
204
|
+
})));
|
|
205
|
+
const results = settled.flatMap((result) => result.status === 'fulfilled' ? [result.value] : []);
|
|
206
|
+
const failures = settled.flatMap((result, index) => result.status === 'rejected'
|
|
207
|
+
? [{
|
|
208
|
+
output: plans[index].output,
|
|
209
|
+
request: plans[index].request,
|
|
210
|
+
error: result.reason instanceof Error ? result.reason.message : String(result.reason),
|
|
211
|
+
}]
|
|
212
|
+
: []);
|
|
213
|
+
const manifestPath = path.join(outDir, 'export-manifest.json');
|
|
214
|
+
await writeFile(manifestPath, `${JSON.stringify({
|
|
215
|
+
schemaVersion: 2,
|
|
216
|
+
sourceConversionId: source.id,
|
|
217
|
+
sourceLayerDocSha256: sha256(baseLayerDoc),
|
|
218
|
+
idempotencyKey,
|
|
219
|
+
preparedAt,
|
|
220
|
+
completedAt: new Date().toISOString(),
|
|
221
|
+
results,
|
|
222
|
+
failures,
|
|
223
|
+
}, null, 2)}\n`, { flag: 'wx' });
|
|
224
|
+
if (failures.length > 0) {
|
|
225
|
+
throw new Error(`One or more exports failed without redispatch: ${failures.map((failure) => (`${failure.output}: ${failure.error}`)).join('; ')}. Evidence: ${manifestPath}`);
|
|
226
|
+
}
|
|
227
|
+
console.log(JSON.stringify({
|
|
228
|
+
sourceConversionId: source.id,
|
|
229
|
+
sourceLayerDocSha256: sha256(baseLayerDoc),
|
|
230
|
+
manifestPath,
|
|
231
|
+
results,
|
|
232
|
+
}, null, 2));
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=cli-export-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-export-command.js","sourceRoot":"","sources":["../src/cli-export-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 runImageCommand: (action: string | undefined, flags: CliFlags, dependencies?: {
|
|
5
|
+
generate?: typeof ensembleImage;
|
|
6
|
+
preflight?: typeof preflightImageProvider;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
//# sourceMappingURL=cli-image-command.d.ts.map
|
|
@@ -0,0 +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;AAM/D,OAAO,EAGL,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAgEvC,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,CA8Id,CAAC"}
|