@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.
Files changed (157) hide show
  1. package/README.md +484 -0
  2. package/dist/artifact-materializer.d.ts +17 -0
  3. package/dist/artifact-materializer.d.ts.map +1 -0
  4. package/dist/artifact-materializer.js +66 -0
  5. package/dist/artifact-materializer.js.map +1 -0
  6. package/dist/cli-arguments.d.ts +8 -0
  7. package/dist/cli-arguments.d.ts.map +1 -0
  8. package/dist/cli-arguments.js +39 -0
  9. package/dist/cli-arguments.js.map +1 -0
  10. package/dist/cli-auth-command.d.ts +3 -0
  11. package/dist/cli-auth-command.d.ts.map +1 -0
  12. package/dist/cli-auth-command.js +100 -0
  13. package/dist/cli-auth-command.js.map +1 -0
  14. package/dist/cli-corpus-command.d.ts +12 -0
  15. package/dist/cli-corpus-command.d.ts.map +1 -0
  16. package/dist/cli-corpus-command.js +120 -0
  17. package/dist/cli-corpus-command.js.map +1 -0
  18. package/dist/cli-corpus-evidence.d.ts +17 -0
  19. package/dist/cli-corpus-evidence.d.ts.map +1 -0
  20. package/dist/cli-corpus-evidence.js +150 -0
  21. package/dist/cli-corpus-evidence.js.map +1 -0
  22. package/dist/cli-corpus-reference-downloads.d.ts +8 -0
  23. package/dist/cli-corpus-reference-downloads.d.ts.map +1 -0
  24. package/dist/cli-corpus-reference-downloads.js +111 -0
  25. package/dist/cli-corpus-reference-downloads.js.map +1 -0
  26. package/dist/cli-corpus-reference-receipts.d.ts +36 -0
  27. package/dist/cli-corpus-reference-receipts.d.ts.map +1 -0
  28. package/dist/cli-corpus-reference-receipts.js +137 -0
  29. package/dist/cli-corpus-reference-receipts.js.map +1 -0
  30. package/dist/cli-corpus-run.d.ts +17 -0
  31. package/dist/cli-corpus-run.d.ts.map +1 -0
  32. package/dist/cli-corpus-run.js +94 -0
  33. package/dist/cli-corpus-run.js.map +1 -0
  34. package/dist/cli-corpus-types.d.ts +52 -0
  35. package/dist/cli-corpus-types.d.ts.map +1 -0
  36. package/dist/cli-corpus-types.js +6 -0
  37. package/dist/cli-corpus-types.js.map +1 -0
  38. package/dist/cli-export-command.d.ts +3 -0
  39. package/dist/cli-export-command.d.ts.map +1 -0
  40. package/dist/cli-export-command.js +234 -0
  41. package/dist/cli-export-command.js.map +1 -0
  42. package/dist/cli-image-command.d.ts +8 -0
  43. package/dist/cli-image-command.d.ts.map +1 -0
  44. package/dist/cli-image-command.js +193 -0
  45. package/dist/cli-image-command.js.map +1 -0
  46. package/dist/cli-persistence.d.ts +25 -0
  47. package/dist/cli-persistence.d.ts.map +1 -0
  48. package/dist/cli-persistence.js +253 -0
  49. package/dist/cli-persistence.js.map +1 -0
  50. package/dist/cli-skill-command.d.ts +9 -0
  51. package/dist/cli-skill-command.d.ts.map +1 -0
  52. package/dist/cli-skill-command.js +215 -0
  53. package/dist/cli-skill-command.js.map +1 -0
  54. package/dist/cli.d.ts +3 -0
  55. package/dist/cli.d.ts.map +1 -0
  56. package/dist/cli.js +272 -0
  57. package/dist/cli.js.map +1 -0
  58. package/dist/codex-skill-config.d.ts +3 -0
  59. package/dist/codex-skill-config.d.ts.map +1 -0
  60. package/dist/codex-skill-config.js +83 -0
  61. package/dist/codex-skill-config.js.map +1 -0
  62. package/dist/config.d.ts +7 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +34 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/conversion-client.d.ts +264 -0
  67. package/dist/conversion-client.d.ts.map +1 -0
  68. package/dist/conversion-client.js +445 -0
  69. package/dist/conversion-client.js.map +1 -0
  70. package/dist/conversion-models.d.ts +4 -0
  71. package/dist/conversion-models.d.ts.map +1 -0
  72. package/dist/conversion-models.js +3 -0
  73. package/dist/conversion-models.js.map +1 -0
  74. package/dist/conversion-outputs.d.ts +118 -0
  75. package/dist/conversion-outputs.d.ts.map +1 -0
  76. package/dist/conversion-outputs.js +84 -0
  77. package/dist/conversion-outputs.js.map +1 -0
  78. package/dist/conversion-problems.d.ts +3 -0
  79. package/dist/conversion-problems.d.ts.map +1 -0
  80. package/dist/conversion-problems.js +21 -0
  81. package/dist/conversion-problems.js.map +1 -0
  82. package/dist/corpus-client.d.ts +171 -0
  83. package/dist/corpus-client.d.ts.map +1 -0
  84. package/dist/corpus-client.js +85 -0
  85. package/dist/corpus-client.js.map +1 -0
  86. package/dist/credential-setup.d.ts +27 -0
  87. package/dist/credential-setup.d.ts.map +1 -0
  88. package/dist/credential-setup.js +242 -0
  89. package/dist/credential-setup.js.map +1 -0
  90. package/dist/credential-store.d.ts +12 -0
  91. package/dist/credential-store.d.ts.map +1 -0
  92. package/dist/credential-store.js +103 -0
  93. package/dist/credential-store.js.map +1 -0
  94. package/dist/idempotency-key.d.ts +2 -0
  95. package/dist/idempotency-key.d.ts.map +1 -0
  96. package/dist/idempotency-key.js +19 -0
  97. package/dist/idempotency-key.js.map +1 -0
  98. package/dist/image-generation-evidence.d.ts +26 -0
  99. package/dist/image-generation-evidence.d.ts.map +1 -0
  100. package/dist/image-generation-evidence.js +28 -0
  101. package/dist/image-generation-evidence.js.map +1 -0
  102. package/dist/image-output-width.d.ts +11 -0
  103. package/dist/image-output-width.d.ts.map +1 -0
  104. package/dist/image-output-width.js +55 -0
  105. package/dist/image-output-width.js.map +1 -0
  106. package/dist/image-provider-preflight.d.ts +21 -0
  107. package/dist/image-provider-preflight.d.ts.map +1 -0
  108. package/dist/image-provider-preflight.js +184 -0
  109. package/dist/image-provider-preflight.js.map +1 -0
  110. package/dist/index.d.ts +13 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +13 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/legacy-codex-cleanup.d.ts +11 -0
  115. package/dist/legacy-codex-cleanup.d.ts.map +1 -0
  116. package/dist/legacy-codex-cleanup.js +147 -0
  117. package/dist/legacy-codex-cleanup.js.map +1 -0
  118. package/dist/legacy-skill-catalog.d.ts +5 -0
  119. package/dist/legacy-skill-catalog.d.ts.map +1 -0
  120. package/dist/legacy-skill-catalog.js +123 -0
  121. package/dist/legacy-skill-catalog.js.map +1 -0
  122. package/dist/local-conversion-input.d.ts +21 -0
  123. package/dist/local-conversion-input.d.ts.map +1 -0
  124. package/dist/local-conversion-input.js +54 -0
  125. package/dist/local-conversion-input.js.map +1 -0
  126. package/dist/login-auth.d.ts +63 -0
  127. package/dist/login-auth.d.ts.map +1 -0
  128. package/dist/login-auth.js +282 -0
  129. package/dist/login-auth.js.map +1 -0
  130. package/dist/package-client.d.ts +147 -0
  131. package/dist/package-client.d.ts.map +1 -0
  132. package/dist/package-client.js +119 -0
  133. package/dist/package-client.js.map +1 -0
  134. package/dist/project-profiles.d.ts +45 -0
  135. package/dist/project-profiles.d.ts.map +1 -0
  136. package/dist/project-profiles.js +162 -0
  137. package/dist/project-profiles.js.map +1 -0
  138. package/dist/responsive-quality.d.ts +26 -0
  139. package/dist/responsive-quality.d.ts.map +1 -0
  140. package/dist/responsive-quality.js +68 -0
  141. package/dist/responsive-quality.js.map +1 -0
  142. package/dist/server.d.ts +6 -0
  143. package/dist/server.d.ts.map +1 -0
  144. package/dist/server.js +173 -0
  145. package/dist/server.js.map +1 -0
  146. package/dist/skill-installer.d.ts +51 -0
  147. package/dist/skill-installer.d.ts.map +1 -0
  148. package/dist/skill-installer.js +328 -0
  149. package/dist/skill-installer.js.map +1 -0
  150. package/package.json +53 -0
  151. package/skills/design/SKILL.md +156 -0
  152. package/skills/design/agents/openai.yaml +6 -0
  153. package/skills/design/references/selection-contract.md +44 -0
  154. package/skills/design-convert/SKILL.md +118 -0
  155. package/skills/design-convert/agents/openai.yaml +6 -0
  156. package/skills/design-search/SKILL.md +86 -0
  157. package/skills/design-search/agents/openai.yaml +6 -0
@@ -0,0 +1,215 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { booleanFlag, stringFlag } from './cli-arguments.js';
4
+ import { persistCurrentCli } from './cli-persistence.js';
5
+ import { enableCodexSkill, isCodexSkillEnabled } from './codex-skill-config.js';
6
+ import { readStoredConversionCredentials, resolveCredentialFile, } from './credential-store.js';
7
+ import { prepareConversionCredentials, } from './credential-setup.js';
8
+ import { cleanupLegacyCodexInstall } from './legacy-codex-cleanup.js';
9
+ import { discoverSkillTargets, inspectSkillInstallation, installSkillsTransaction, isSkillClient, isTwelveUiSkillName, readBundledSkill, removeRecognizedLegacySkills, removeSkill, requiredScopesForSkills, resolveSkillDirectory, SKILL_CLIENTS, TWELVE_UI_SKILL_NAMES, } from './skill-installer.js';
10
+ const selectedSkills = (flags) => {
11
+ const value = stringFlag(flags, 'skill');
12
+ if (value === undefined)
13
+ return [...TWELVE_UI_SKILL_NAMES];
14
+ if (!isTwelveUiSkillName(value)) {
15
+ throw new Error(`--skill must be one of: ${TWELVE_UI_SKILL_NAMES.join(', ')}`);
16
+ }
17
+ return [value];
18
+ };
19
+ const resolveTargets = async (flags, skills) => {
20
+ const clientValue = stringFlag(flags, 'client');
21
+ const clientHome = stringFlag(flags, 'home');
22
+ if (clientHome && !clientValue) {
23
+ throw new Error('--home requires --client because a custom home cannot be auto-detected');
24
+ }
25
+ if (clientValue) {
26
+ if (!isSkillClient(clientValue)) {
27
+ throw new Error(`--client must be one of: ${SKILL_CLIENTS.join(', ')}`);
28
+ }
29
+ return skills.map((skill) => ({
30
+ client: clientValue,
31
+ destination: resolveSkillDirectory({
32
+ client: clientValue,
33
+ clientHome,
34
+ skill,
35
+ }),
36
+ skill,
37
+ }));
38
+ }
39
+ const discovered = (await Promise.all(skills.map((skill) => (discoverSkillTargets({ skill }))))).flat();
40
+ if (discovered.length === 0) {
41
+ throw new Error(`No supported CLI installations found (${SKILL_CLIENTS.join(', ')});`
42
+ + ' pass --client to choose a target');
43
+ }
44
+ return discovered;
45
+ };
46
+ const printStatus = async (skills, targets, json) => {
47
+ const [installations, credentials] = await Promise.all([
48
+ Promise.all(targets.map(async (target) => {
49
+ const status = await inspectSkillInstallation(target.destination);
50
+ return {
51
+ client: target.client,
52
+ destination: target.destination,
53
+ skillName: target.skill,
54
+ status,
55
+ ...(target.client === 'codex' && status !== 'not_installed'
56
+ ? { enabled: await isCodexSkillEnabled(target.destination) }
57
+ : {}),
58
+ };
59
+ })),
60
+ readStoredConversionCredentials(),
61
+ ]);
62
+ const result = {
63
+ schemaVersion: 3,
64
+ selectedSkills: skills,
65
+ installations,
66
+ credentials: credentials ? 'configured' : 'not_configured',
67
+ credentialFile: resolveCredentialFile(),
68
+ };
69
+ if (json) {
70
+ console.log(JSON.stringify(result, null, 2));
71
+ return;
72
+ }
73
+ for (const installation of installations) {
74
+ const enabled = 'enabled' in installation
75
+ ? `, ${installation.enabled ? 'enabled' : 'disabled'}`
76
+ : '';
77
+ console.log(`${installation.client}: ${installation.skillName} ${installation.status}${enabled}`
78
+ + ` (${installation.destination})`);
79
+ }
80
+ console.log(`Credentials: ${result.credentials} (${result.credentialFile})`);
81
+ };
82
+ export const runSkillCommand = async (action, flags, dependencies = {}) => {
83
+ const skills = selectedSkills(flags);
84
+ if (action === 'print') {
85
+ if (skills.length !== 1)
86
+ throw new Error('skill print requires --skill');
87
+ process.stdout.write(await readBundledSkill(skills[0]));
88
+ return;
89
+ }
90
+ const targets = await resolveTargets(flags, skills);
91
+ if (action === 'status') {
92
+ await printStatus(skills, targets, booleanFlag(flags, 'json'));
93
+ return;
94
+ }
95
+ if (action === 'remove') {
96
+ const removed = await Promise.all(targets.map(async (target) => ({
97
+ ...target,
98
+ removed: await removeSkill(target.destination),
99
+ })));
100
+ for (const result of removed) {
101
+ console.log(result.removed
102
+ ? `Removed ${result.skill} from ${result.client} at ${result.destination}.`
103
+ : `${result.skill} is not installed for ${result.client} at ${result.destination}.`);
104
+ }
105
+ console.log(`Credentials were retained at ${resolveCredentialFile()}.`);
106
+ return;
107
+ }
108
+ if (action !== 'install') {
109
+ throw new Error(`Usage: 12ui skill <install|status|print|remove>`
110
+ + ` [--skill ${TWELVE_UI_SKILL_NAMES.join('|')}]`);
111
+ }
112
+ if (booleanFlag(flags, 'skip-auth') && stringFlag(flags, 'api-key')) {
113
+ throw new Error('--skip-auth cannot be combined with --api-key');
114
+ }
115
+ const inspected = await Promise.all(targets.map(async (target) => ({
116
+ target,
117
+ status: await inspectSkillInstallation(target.destination),
118
+ })));
119
+ const conflicts = inspected.filter(({ status }) => status === 'different');
120
+ if (conflicts.length > 0 && !booleanFlag(flags, 'force')) {
121
+ const { inspectLegacySkillDirectory } = await import('./legacy-skill-catalog.js');
122
+ const legacyStates = await Promise.all(conflicts.map(({ target }) => (inspectLegacySkillDirectory(target.destination))));
123
+ const unknown = conflicts.filter((_, index) => legacyStates[index] !== 'recognized');
124
+ if (unknown.length > 0) {
125
+ throw new Error(`Different skills already exist at ${unknown.map(({ target }) => target.destination).join(', ')}; use --force to replace them`);
126
+ }
127
+ }
128
+ let credentialTransaction = null;
129
+ if (!booleanFlag(flags, 'skip-auth')) {
130
+ credentialTransaction = await (dependencies.prepareCredentials ?? prepareConversionCredentials)({
131
+ apiKey: stringFlag(flags, 'api-key'),
132
+ origin: stringFlag(flags, 'origin'),
133
+ loginOrigin: stringFlag(flags, 'login-origin'),
134
+ keyName: stringFlag(flags, 'key-name'),
135
+ requiredScopes: requiredScopesForSkills(skills),
136
+ onApprovalUrl: (url) => {
137
+ console.log('Connect your 12UI account to install the design skills:');
138
+ console.log(url);
139
+ },
140
+ });
141
+ }
142
+ let persistence;
143
+ let results;
144
+ let legacy;
145
+ let codexCleanup;
146
+ let credentials = null;
147
+ try {
148
+ persistence = await (dependencies.persistCli ?? (() => persistCurrentCli()))();
149
+ results = await installSkillsTransaction({
150
+ targets,
151
+ force: booleanFlag(flags, 'force'),
152
+ });
153
+ const codexTargets = results.filter(({ target }) => target.client === 'codex');
154
+ for (const { target } of codexTargets)
155
+ await enableCodexSkill(target.destination);
156
+ const legacyRoots = [
157
+ ...targets.map((target) => path.dirname(target.destination)),
158
+ ...(stringFlag(flags, 'home') ? [] : [path.join(os.homedir(), '.agents', 'skills')]),
159
+ ];
160
+ legacy = await removeRecognizedLegacySkills({
161
+ roots: legacyRoots,
162
+ exclusions: targets.map((target) => target.destination),
163
+ });
164
+ codexCleanup = stringFlag(flags, 'home')
165
+ ? null
166
+ : await cleanupLegacyCodexInstall();
167
+ credentials = credentialTransaction
168
+ ? await credentialTransaction.commit()
169
+ : null;
170
+ }
171
+ catch (error) {
172
+ if (credentialTransaction) {
173
+ try {
174
+ await credentialTransaction.rollback();
175
+ }
176
+ catch (rollbackError) {
177
+ throw new AggregateError([
178
+ error instanceof Error ? error : new Error(String(error)),
179
+ rollbackError instanceof Error ? rollbackError : new Error(String(rollbackError)),
180
+ ], '12UI installation failed and the uncommitted credential could not be revoked');
181
+ }
182
+ }
183
+ throw error;
184
+ }
185
+ for (const result of results) {
186
+ const enabled = result.target.client === 'codex' ? ' and enabled' : '';
187
+ console.log(`${result.target.client}: ${result.target.skill} ${result.result.replace('_', ' ')}${enabled}`
188
+ + ` at ${result.target.destination}.`);
189
+ }
190
+ console.log(`Pinned @12ui/design ${persistence.version} via ${persistence.source}`
191
+ + ` at ${persistence.dataRoot}; launcher ${persistence.launcher}.`);
192
+ for (const removed of legacy.removed)
193
+ console.log(`Removed recognized legacy skill: ${removed}`);
194
+ for (const preserved of legacy.preserved) {
195
+ console.log(`Preserved unrecognized or locally modified legacy skill: ${preserved}`);
196
+ }
197
+ for (const removed of codexCleanup?.removed ?? []) {
198
+ console.log(`Removed recognized legacy codex-design installation: ${removed}`);
199
+ }
200
+ for (const preserved of codexCleanup?.preserved ?? []) {
201
+ console.log(`Preserved unrecognized legacy codex-design path: ${preserved}`);
202
+ }
203
+ for (const recovery of codexCleanup?.recovery ?? []) {
204
+ console.log(`Recoverable retired codex-design bytes: ${recovery}`);
205
+ }
206
+ if (credentials) {
207
+ console.log(`12UI credentials ${credentials.source === 'browser' ? 'created' : 'imported'}`
208
+ + ` and verified for ${skills.join(', ')} at ${credentials.credentialFile}.`);
209
+ }
210
+ else {
211
+ console.log('Authentication skipped; configure TWELVE_UI_API_KEY before using the skills.');
212
+ }
213
+ console.log(`Legacy codex-design workspace data is preserved at ${codexCleanup?.workspaceData ?? path.join(os.homedir(), '.12ui', 'codex-design')}.`);
214
+ };
215
+ //# sourceMappingURL=cli-skill-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skill-command.js","sourceRoot":"","sources":["../src/cli-skill-command.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,272 @@
1
+ #!/usr/bin/env node
2
+ import { readFile, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { materializeConversionArtifacts } from './artifact-materializer.js';
5
+ import { booleanFlag, parseCliArguments, stringFlag, } from './cli-arguments.js';
6
+ import { runAuthCommand } from './cli-auth-command.js';
7
+ import { runCorpusCommand } from './cli-corpus-command.js';
8
+ import { runExportCommand } from './cli-export-command.js';
9
+ import { runImageCommand } from './cli-image-command.js';
10
+ import { runSkillCommand } from './cli-skill-command.js';
11
+ import { isConversionModel, CONVERSION_MODELS } from './conversion-models.js';
12
+ import { TwelveUiConversionClient, } from './conversion-client.js';
13
+ import { CONVERSION_OUTPUTS, isConversionOutput } from './conversion-outputs.js';
14
+ import { readConversionConfig } from './config.js';
15
+ import { classifyLocalConversionInput, createInputForLocalFile, defaultConversionOutputPath, } from './local-conversion-input.js';
16
+ import { MAX_IMAGE_OUTPUT_WIDTH, normalizeImageOutputWidth, parseImageOutputWidth, } from './image-output-width.js';
17
+ import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
18
+ import { APP_PROJECT_CAPABILITIES, isProjectConversionOutput, parseConversionOutputProfile, WEB_PROJECT_CAPABILITIES, } from './project-profiles.js';
19
+ import { isResponsiveConversionQuality, RESPONSIVE_CONVERSION_QUALITIES, } from './responsive-quality.js';
20
+ import { startMcpServer } from './server.js';
21
+ const usage = (exitCode = 1) => {
22
+ const outputs = CONVERSION_OUTPUTS.join('|');
23
+ console.error(`Usage:
24
+ 12ui auth login [--api-key <personal-key>] [--login-origin <url>] [--key-name <name>]
25
+ 12ui auth status [--login-origin <url>] [--json]
26
+ 12ui auth logout [--login-origin <url>]
27
+ 12ui skill install [--skill design|design-search|design-convert] [--client codex|claude-code] [--home <client-home>] [--api-key <key>] [--login-origin <url>] [--key-name <name>] [--force] [--skip-auth]
28
+ 12ui skill status [--skill design|design-search|design-convert] [--client codex|claude-code] [--home <client-home>] [--json]
29
+ 12ui skill print --skill design|design-search|design-convert
30
+ 12ui skill remove [--skill design|design-search|design-convert] [--client codex|claude-code] [--home <client-home>]
31
+ 12ui corpus inspire --query <text>|--query-file <file> --out-dir <directory> [--count <1-48>] [--wildness <0-0.6>] [--seed <integer>] [--aspect landscape|square|portrait] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
32
+ 12ui corpus resume --out-dir <directory> [--origin <url>] [--api-key <key>]
33
+ 12ui image generate --prompt-file <file> --reference-1 <file> --reference-2 <file> --reference-3 <file> --reference-4 <file> --out <file> [--aspect landscape|portrait|square] [--provider auto|codex|openai] --project-root <directory> --idempotency-key <key>
34
+ 12ui capabilities [--json]
35
+ 12ui convert <image.png|jpg|webp|layerdoc.json> --output ${outputs} [--model fast|standard|pro] [--width <px>] [--responsive-quality standard|pro] [--profile <json|file>] [--out <file>] [--detach] [--timeout-ms <ms>] [--idempotency-key <key>] [--origin <url>] [--api-key <key>]
36
+ 12ui export <source-conversion-id> --output <comma-separated-formats> --out-dir <directory> --idempotency-key <key> [--responsive-quality standard|pro] [--web-profile <json|file>] [--app-profile <json|file>] [--timeout-ms <ms>] [--origin <url>] [--api-key <key>]
37
+ 12ui resume <conversion-id> --output ${outputs} --out <file> [--timeout-ms <ms>] [--origin <url>] [--api-key <key>]
38
+ 12ui mcp [--origin <url>] [--api-key <key>]
39
+ 12ui --version
40
+
41
+ Omit --client to discover and target every supported CLI installation.`);
42
+ process.exit(exitCode);
43
+ };
44
+ const parseTimeoutMs = (value) => {
45
+ if (value === undefined)
46
+ return undefined;
47
+ const timeoutMs = Number(value);
48
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 1_000) {
49
+ throw new Error('--timeout-ms must be a number of at least 1000');
50
+ }
51
+ return Math.floor(timeoutMs);
52
+ };
53
+ const parseProjectProfileFlag = async (output, value) => {
54
+ if (!isProjectConversionOutput(output)) {
55
+ if (value !== undefined)
56
+ throw new Error('--profile is only valid for project outputs');
57
+ return undefined;
58
+ }
59
+ if (!value?.trim())
60
+ throw new Error(`--profile is required for ${output}`);
61
+ const trimmed = value.trim();
62
+ const source = trimmed.startsWith('{')
63
+ ? trimmed
64
+ : await readFile(path.resolve(trimmed.startsWith('@') ? trimmed.slice(1) : trimmed), 'utf8');
65
+ let parsed;
66
+ try {
67
+ parsed = JSON.parse(source);
68
+ }
69
+ catch (error) {
70
+ throw new Error(`--profile must contain valid JSON: ${error instanceof Error ? error.message : String(error)}`);
71
+ }
72
+ return parseConversionOutputProfile(output, parsed);
73
+ };
74
+ const writeCompletedConversion = async (args) => {
75
+ const downloaded = await args.client.downloadResult(args.operation.id, args.output);
76
+ await writeFile(args.outFile, downloaded.bytes);
77
+ const artifactManifest = await materializeConversionArtifacts(args.client, args.operation, args.outFile);
78
+ console.log(JSON.stringify({
79
+ id: args.operation.id,
80
+ output: args.output,
81
+ outFile: args.outFile,
82
+ artifactManifest,
83
+ }, null, 2));
84
+ };
85
+ const printCapabilities = () => {
86
+ console.log(JSON.stringify({
87
+ inputs: ['image/png', 'image/jpeg', 'image/webp', 'application/vnd.layerdoc+json'],
88
+ outputs: CONVERSION_OUTPUTS,
89
+ imageModels: CONVERSION_MODELS,
90
+ imageOutputWidth: {
91
+ flag: '--width',
92
+ minimum: 1,
93
+ maximum: MAX_IMAGE_OUTPUT_WIDTH,
94
+ description: 'Set the native output canvas width by proportionally resizing image input up or down.',
95
+ },
96
+ responsiveQualities: RESPONSIVE_CONVERSION_QUALITIES,
97
+ projectProfiles: {
98
+ web_project: WEB_PROJECT_CAPABILITIES,
99
+ app_project: APP_PROJECT_CAPABILITIES,
100
+ },
101
+ }, null, 2));
102
+ };
103
+ const printVersion = async () => {
104
+ const packageJson = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
105
+ if (typeof packageJson.version !== 'string')
106
+ throw new Error('Invalid package version');
107
+ console.log(packageJson.version);
108
+ };
109
+ const runConversionCommand = async (command, flags) => {
110
+ const verb = command[0];
111
+ const config = readConversionConfig({
112
+ origin: stringFlag(flags, 'origin'),
113
+ apiKey: stringFlag(flags, 'api-key'),
114
+ });
115
+ if (verb === 'mcp') {
116
+ await startMcpServer({ config });
117
+ return;
118
+ }
119
+ const outputValue = stringFlag(flags, 'output');
120
+ const output = isConversionOutput(outputValue) ? outputValue : usage();
121
+ const client = new TwelveUiConversionClient(config);
122
+ const timeoutMs = parseTimeoutMs(stringFlag(flags, 'timeout-ms'));
123
+ if (verb === 'resume') {
124
+ if (stringFlag(flags, 'profile') !== undefined
125
+ || stringFlag(flags, 'model') !== undefined
126
+ || stringFlag(flags, 'width') !== undefined
127
+ || stringFlag(flags, 'responsive-quality') !== undefined
128
+ || booleanFlag(flags, 'detach')) {
129
+ throw new Error('--profile, --model, --width, --responsive-quality, and --detach are not accepted by resume');
130
+ }
131
+ const conversionId = command[1]?.trim();
132
+ const outFile = stringFlag(flags, 'out');
133
+ if (!conversionId)
134
+ usage();
135
+ const resolvedOutFile = outFile ? path.resolve(outFile) : usage();
136
+ const current = await client.getConversion(conversionId);
137
+ if (current.output !== output) {
138
+ throw new Error(`Conversion ${conversionId} produces ${current.output}, not ${output}`);
139
+ }
140
+ const completed = current.status === 'succeeded'
141
+ ? current
142
+ : await client.waitForConversion(current.id, {
143
+ expiresAt: current.expires_at,
144
+ timeoutMs,
145
+ });
146
+ await writeCompletedConversion({
147
+ client,
148
+ operation: completed,
149
+ output,
150
+ outFile: resolvedOutFile,
151
+ });
152
+ return;
153
+ }
154
+ if (verb !== 'convert' || !command[1])
155
+ usage();
156
+ const modelValue = stringFlag(flags, 'model');
157
+ const model = modelValue === undefined
158
+ ? undefined
159
+ : isConversionModel(modelValue)
160
+ ? modelValue
161
+ : usage();
162
+ const responsiveValue = stringFlag(flags, 'responsive-quality');
163
+ if (responsiveValue !== undefined && !isResponsiveConversionQuality(responsiveValue)) {
164
+ throw new Error(`--responsive-quality must be one of: ${RESPONSIVE_CONVERSION_QUALITIES.join(', ')}`);
165
+ }
166
+ const profile = await parseProjectProfileFlag(output, stringFlag(flags, 'profile'));
167
+ const inputPath = path.resolve(command[1]);
168
+ const localInput = classifyLocalConversionInput(inputPath);
169
+ const outputWidth = parseImageOutputWidth(stringFlag(flags, 'width'));
170
+ if (outputWidth !== undefined && localInput.kind === 'layerdoc') {
171
+ throw new Error('--width is only valid for image input');
172
+ }
173
+ const sourceBytes = new Uint8Array(await readFile(inputPath));
174
+ const inputBytes = outputWidth !== undefined && localInput.kind === 'image'
175
+ ? await normalizeImageOutputWidth({
176
+ bytes: sourceBytes,
177
+ mediaType: localInput.mediaType,
178
+ width: outputWidth,
179
+ })
180
+ : sourceBytes;
181
+ const input = createInputForLocalFile({
182
+ bytes: inputBytes,
183
+ filePath: inputPath,
184
+ output,
185
+ ...(profile ? { profile } : {}),
186
+ });
187
+ const idempotencyKey = normalizeOptionalIdempotencyKey(stringFlag(flags, 'idempotency-key'), '--idempotency-key');
188
+ if (input.layerdoc !== undefined && model)
189
+ throw new Error('--model is only valid for image input');
190
+ if (input.layerdoc !== undefined && responsiveValue) {
191
+ throw new Error('--responsive-quality with LayerDoc input requires the SDK source-conversion workflow');
192
+ }
193
+ if (responsiveValue && output !== 'html') {
194
+ throw new Error('--responsive-quality is only valid with --output html');
195
+ }
196
+ const conversionInput = input.layerdoc !== undefined
197
+ ? input
198
+ : {
199
+ ...input,
200
+ ...(model ? { model } : {}),
201
+ ...(responsiveValue ? { responsiveQuality: responsiveValue } : {}),
202
+ };
203
+ const detach = booleanFlag(flags, 'detach');
204
+ const created = await client.createConversion({
205
+ ...conversionInput,
206
+ ...(idempotencyKey ? { idempotencyKey } : {}),
207
+ waitSeconds: detach ? 0 : 20,
208
+ });
209
+ if (detach) {
210
+ console.log(JSON.stringify({
211
+ id: created.id,
212
+ status: created.status,
213
+ output: created.output,
214
+ expiresAt: created.expires_at,
215
+ }, null, 2));
216
+ return;
217
+ }
218
+ let operation;
219
+ try {
220
+ operation = created.status === 'succeeded'
221
+ ? created
222
+ : await client.waitForConversion(created.id, {
223
+ expiresAt: created.expires_at,
224
+ timeoutMs,
225
+ });
226
+ }
227
+ catch (error) {
228
+ const detail = error instanceof Error ? error.message : String(error);
229
+ throw new Error(`Conversion ${created.id} failed: ${detail}`, { cause: error });
230
+ }
231
+ const outFile = path.resolve(stringFlag(flags, 'out') || defaultConversionOutputPath(inputPath, output));
232
+ await writeCompletedConversion({ client, operation, output, outFile });
233
+ };
234
+ const main = async () => {
235
+ const { command, flags } = parseCliArguments(process.argv.slice(2));
236
+ if (booleanFlag(flags, 'help'))
237
+ usage(0);
238
+ if (booleanFlag(flags, 'version') || command[0] === 'version') {
239
+ await printVersion();
240
+ return;
241
+ }
242
+ if (command[0] === 'skill') {
243
+ await runSkillCommand(command[1], flags);
244
+ return;
245
+ }
246
+ if (command[0] === 'auth') {
247
+ await runAuthCommand(command[1], flags);
248
+ return;
249
+ }
250
+ if (command[0] === 'corpus') {
251
+ await runCorpusCommand(command[1], flags);
252
+ return;
253
+ }
254
+ if (command[0] === 'image') {
255
+ await runImageCommand(command[1], flags);
256
+ return;
257
+ }
258
+ if (command[0] === 'export') {
259
+ await runExportCommand(command[1], flags);
260
+ return;
261
+ }
262
+ if (command[0] === 'capabilities') {
263
+ printCapabilities();
264
+ return;
265
+ }
266
+ await runConversionCommand(command, flags);
267
+ };
268
+ main().catch((error) => {
269
+ console.error(error instanceof Error ? error.message : String(error));
270
+ process.exitCode = 1;
271
+ });
272
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const isCodexSkillEnabled: (skillDirectory: string) => Promise<boolean>;
2
+ export declare const enableCodexSkill: (skillDirectory: string) => Promise<boolean>;
3
+ //# sourceMappingURL=codex-skill-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-skill-config.d.ts","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"AA8DA,eAAO,MAAM,mBAAmB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CASjF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CAqB9E,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ const CONFIG_HEADER = /^\s*\[\[skills\.config\]\]\s*$/;
4
+ const PATH_ENTRY = /^\s*path\s*=\s*("(?:\\.|[^"])*")\s*$/;
5
+ const ENABLED_ENTRY = /^(\s*enabled\s*=\s*)(true|false)(\s*)$/;
6
+ const configPathForSkill = (skillDirectory) => (path.join(path.dirname(path.dirname(skillDirectory)), 'config.toml'));
7
+ const skillConfigBlocks = (lines) => {
8
+ const starts = lines.flatMap((line, index) => (CONFIG_HEADER.test(line) ? [index] : []));
9
+ return starts.map((start, index) => ({
10
+ start,
11
+ end: starts[index + 1] ?? lines.length,
12
+ }));
13
+ };
14
+ const parseTomlString = (value) => {
15
+ try {
16
+ const parsed = JSON.parse(value);
17
+ return typeof parsed === 'string' ? parsed : null;
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ };
23
+ const matchingBlock = (lines, skillDirectory) => {
24
+ const expected = path.resolve(skillDirectory, 'SKILL.md');
25
+ return skillConfigBlocks(lines).find((block) => lines
26
+ .slice(block.start + 1, block.end)
27
+ .some((line) => {
28
+ const match = PATH_ENTRY.exec(line);
29
+ const configured = match?.[1] ? parseTomlString(match[1]) : null;
30
+ return configured !== null && path.resolve(configured) === expected;
31
+ })) ?? null;
32
+ };
33
+ const readConfigLines = async (skillDirectory) => {
34
+ const configPath = configPathForSkill(skillDirectory);
35
+ let source;
36
+ try {
37
+ source = await readFile(configPath, 'utf8');
38
+ }
39
+ catch (error) {
40
+ if (error.code === 'ENOENT')
41
+ return null;
42
+ throw error;
43
+ }
44
+ return {
45
+ configPath,
46
+ lines: source.split(/\r?\n/),
47
+ trailingNewline: source.endsWith('\n'),
48
+ };
49
+ };
50
+ export const isCodexSkillEnabled = async (skillDirectory) => {
51
+ const config = await readConfigLines(skillDirectory);
52
+ if (!config)
53
+ return true;
54
+ const block = matchingBlock(config.lines, skillDirectory);
55
+ if (!block)
56
+ return true;
57
+ const enabled = config.lines
58
+ .slice(block.start + 1, block.end)
59
+ .find((line) => ENABLED_ENTRY.test(line));
60
+ return enabled ? ENABLED_ENTRY.exec(enabled)?.[2] !== 'false' : true;
61
+ };
62
+ export const enableCodexSkill = async (skillDirectory) => {
63
+ const config = await readConfigLines(skillDirectory);
64
+ if (!config)
65
+ return false;
66
+ const block = matchingBlock(config.lines, skillDirectory);
67
+ if (!block)
68
+ return false;
69
+ const enabledIndex = config.lines.findIndex((line, index) => (index > block.start && index < block.end && ENABLED_ENTRY.test(line)));
70
+ if (enabledIndex === -1) {
71
+ config.lines.splice(block.end, 0, 'enabled = true');
72
+ }
73
+ else {
74
+ const match = ENABLED_ENTRY.exec(config.lines[enabledIndex]);
75
+ if (match?.[2] === 'true')
76
+ return false;
77
+ config.lines[enabledIndex] = `${match?.[1] ?? 'enabled = '}true${match?.[3] ?? ''}`;
78
+ }
79
+ const serialized = config.lines.join('\n');
80
+ await writeFile(config.configPath, config.trailingNewline && !serialized.endsWith('\n') ? `${serialized}\n` : serialized);
81
+ return true;
82
+ };
83
+ //# sourceMappingURL=codex-skill-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-skill-config.js","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type ConversionConfig = {
2
+ origin: string;
3
+ apiKey: string;
4
+ };
5
+ export declare const normalizeConversionOrigin: (value: string) => string;
6
+ export declare const readConversionConfig: (overrides?: Partial<ConversionConfig>) => ConversionConfig;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM,KAAG,MAezD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,YAAW,OAAO,CAAC,gBAAgB,CAAM,KAAG,gBAoBhF,CAAC"}