@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
package/dist/server.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { materializeConversionArtifacts } from './artifact-materializer.js';
|
|
7
|
+
import { CONVERSION_MODELS, isConversionModel } from './conversion-models.js';
|
|
8
|
+
import { TwelveUiConversionClient } from './conversion-client.js';
|
|
9
|
+
import { CONVERSION_OUTPUTS, LAYERDOC_INPUT_OUTPUTS, isConversionOutput, } from './conversion-outputs.js';
|
|
10
|
+
import { createInputForLocalFile, defaultConversionOutputPath, } from './local-conversion-input.js';
|
|
11
|
+
import { normalizeOptionalIdempotencyKey } from './idempotency-key.js';
|
|
12
|
+
import { APP_PROJECT_FRAMEWORKS, APP_PROJECT_LANGUAGES, APP_PROJECT_PACKAGINGS, APP_PROJECT_STYLINGS, WEB_PROJECT_FRAMEWORKS, WEB_PROJECT_LANGUAGES, WEB_PROJECT_PACKAGINGS, WEB_PROJECT_STYLINGS, isProjectConversionOutput, parseConversionOutputProfile, } from './project-profiles.js';
|
|
13
|
+
export async function startMcpServer(options) {
|
|
14
|
+
const client = new TwelveUiConversionClient({
|
|
15
|
+
origin: options.config.origin,
|
|
16
|
+
apiKey: options.config.apiKey,
|
|
17
|
+
});
|
|
18
|
+
const server = new Server({ name: '@12ui/design', version: await resolvePackageVersion() }, { capabilities: { tools: {} } });
|
|
19
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
20
|
+
tools: [{
|
|
21
|
+
name: 'design.convert',
|
|
22
|
+
description: 'Convert one local image into LayerDoc, responsive HTML, fixed design files, or a versioned web/native source-project bundle; LayerDoc v2 JSON is accepted for every output, including canonical republishing.',
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
required: ['output'],
|
|
27
|
+
properties: {
|
|
28
|
+
imagePath: { type: 'string', description: 'Absolute or working-directory-relative PNG, JPEG, or WebP path.' },
|
|
29
|
+
layerdocPath: { type: 'string', description: 'Absolute or working-directory-relative public LayerDoc v2 JSON path. Supports every output.' },
|
|
30
|
+
output: { type: 'string', enum: [...CONVERSION_OUTPUTS] },
|
|
31
|
+
model: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
enum: [...CONVERSION_MODELS],
|
|
34
|
+
default: 'standard',
|
|
35
|
+
description: 'Image conversion model policy. Omit for standard; not accepted with layerdocPath.',
|
|
36
|
+
},
|
|
37
|
+
profile: {
|
|
38
|
+
type: 'object',
|
|
39
|
+
additionalProperties: false,
|
|
40
|
+
required: ['version', 'framework', 'styling', 'language', 'packaging'],
|
|
41
|
+
properties: {
|
|
42
|
+
version: { const: 1 },
|
|
43
|
+
framework: { enum: [...WEB_PROJECT_FRAMEWORKS, ...APP_PROJECT_FRAMEWORKS] },
|
|
44
|
+
styling: { enum: [...WEB_PROJECT_STYLINGS, ...APP_PROJECT_STYLINGS] },
|
|
45
|
+
language: { enum: [...WEB_PROJECT_LANGUAGES, ...APP_PROJECT_LANGUAGES] },
|
|
46
|
+
packaging: { enum: [...WEB_PROJECT_PACKAGINGS, ...APP_PROJECT_PACKAGINGS] },
|
|
47
|
+
},
|
|
48
|
+
description: 'Required for web_project and app_project; forbidden for every other output.',
|
|
49
|
+
},
|
|
50
|
+
outFile: { type: 'string', description: 'Optional output path. Defaults beside the input file.' },
|
|
51
|
+
timeoutMs: { type: 'number', minimum: 1000 },
|
|
52
|
+
idempotencyKey: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
minLength: 1,
|
|
55
|
+
maxLength: 128,
|
|
56
|
+
description: 'Optional stable key to reuse when safely retrying an ambiguous create request.',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
oneOf: [
|
|
60
|
+
{ required: ['imagePath'], not: { required: ['layerdocPath'] } },
|
|
61
|
+
{
|
|
62
|
+
required: ['layerdocPath'],
|
|
63
|
+
not: {
|
|
64
|
+
anyOf: [
|
|
65
|
+
{ required: ['imagePath'] },
|
|
66
|
+
{ required: ['model'] },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
properties: { output: { enum: [...LAYERDOC_INPUT_OUTPUTS] } },
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
allOf: [{
|
|
73
|
+
if: {
|
|
74
|
+
required: ['output'],
|
|
75
|
+
properties: { output: { enum: ['web_project', 'app_project'] } },
|
|
76
|
+
},
|
|
77
|
+
then: { required: ['profile'] },
|
|
78
|
+
else: { not: { required: ['profile'] } },
|
|
79
|
+
}],
|
|
80
|
+
},
|
|
81
|
+
}],
|
|
82
|
+
}));
|
|
83
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
84
|
+
try {
|
|
85
|
+
if (request.params.name !== 'design.convert')
|
|
86
|
+
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
87
|
+
const input = (request.params.arguments ?? {});
|
|
88
|
+
const imagePath = typeof input.imagePath === 'string' && input.imagePath.trim()
|
|
89
|
+
? input.imagePath
|
|
90
|
+
: null;
|
|
91
|
+
const layerdocPath = typeof input.layerdocPath === 'string' && input.layerdocPath.trim()
|
|
92
|
+
? input.layerdocPath
|
|
93
|
+
: null;
|
|
94
|
+
if ((imagePath === null) === (layerdocPath === null)) {
|
|
95
|
+
throw new Error('Provide exactly one imagePath or layerdocPath');
|
|
96
|
+
}
|
|
97
|
+
const inputPath = path.resolve(imagePath ?? layerdocPath);
|
|
98
|
+
if (!isConversionOutput(input.output)) {
|
|
99
|
+
throw new Error(`output must be one of ${CONVERSION_OUTPUTS.join(', ')}`);
|
|
100
|
+
}
|
|
101
|
+
const output = input.output;
|
|
102
|
+
if (input.model !== undefined && !isConversionModel(input.model)) {
|
|
103
|
+
throw new Error(`model must be one of ${CONVERSION_MODELS.join(', ')}`);
|
|
104
|
+
}
|
|
105
|
+
if (layerdocPath && input.model !== undefined) {
|
|
106
|
+
throw new Error('model is only valid with imagePath');
|
|
107
|
+
}
|
|
108
|
+
const profile = isProjectConversionOutput(output)
|
|
109
|
+
? parseConversionOutputProfile(output, input.profile)
|
|
110
|
+
: undefined;
|
|
111
|
+
if (!isProjectConversionOutput(output) && input.profile !== undefined) {
|
|
112
|
+
throw new Error('profile is only valid for web_project or app_project outputs');
|
|
113
|
+
}
|
|
114
|
+
const conversionInput = createInputForLocalFile({
|
|
115
|
+
bytes: new Uint8Array(await readFile(inputPath)),
|
|
116
|
+
filePath: inputPath,
|
|
117
|
+
output,
|
|
118
|
+
...(profile ? { profile } : {}),
|
|
119
|
+
});
|
|
120
|
+
if (layerdocPath && conversionInput.layerdoc === undefined) {
|
|
121
|
+
throw new Error('layerdocPath must refer to a JSON file');
|
|
122
|
+
}
|
|
123
|
+
if (imagePath && conversionInput.layerdoc !== undefined) {
|
|
124
|
+
throw new Error('Use layerdocPath for LayerDoc JSON input');
|
|
125
|
+
}
|
|
126
|
+
const idempotencyKey = normalizeOptionalIdempotencyKey(input.idempotencyKey);
|
|
127
|
+
const requestInput = conversionInput.layerdoc !== undefined
|
|
128
|
+
? conversionInput
|
|
129
|
+
: {
|
|
130
|
+
...conversionInput,
|
|
131
|
+
...(isConversionModel(input.model) ? { model: input.model } : {}),
|
|
132
|
+
};
|
|
133
|
+
const operation = await client.createConversion({
|
|
134
|
+
...requestInput,
|
|
135
|
+
...(idempotencyKey ? { idempotencyKey } : {}),
|
|
136
|
+
});
|
|
137
|
+
const completed = operation.status === 'succeeded'
|
|
138
|
+
? operation
|
|
139
|
+
: await client.waitForConversion(operation.id, {
|
|
140
|
+
timeoutMs: typeof input.timeoutMs === 'number' ? input.timeoutMs : undefined,
|
|
141
|
+
expiresAt: operation.expires_at,
|
|
142
|
+
});
|
|
143
|
+
const downloaded = await client.downloadResult(completed.id, output);
|
|
144
|
+
const outFile = path.resolve(typeof input.outFile === 'string' && input.outFile.trim()
|
|
145
|
+
? input.outFile
|
|
146
|
+
: defaultConversionOutputPath(inputPath, output));
|
|
147
|
+
await writeFile(outFile, downloaded.bytes);
|
|
148
|
+
const artifactManifest = await materializeConversionArtifacts(client, completed, outFile);
|
|
149
|
+
return {
|
|
150
|
+
content: [{
|
|
151
|
+
type: 'text',
|
|
152
|
+
text: JSON.stringify({ id: completed.id, output, outFile, artifactManifest }, null, 2),
|
|
153
|
+
}],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
content: [{ type: 'text', text: error instanceof Error ? error.message : String(error) }],
|
|
159
|
+
isError: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
await server.connect(new StdioServerTransport());
|
|
164
|
+
}
|
|
165
|
+
const resolvePackageVersion = async () => {
|
|
166
|
+
const raw = await readFile(new URL('../package.json', import.meta.url), 'utf8');
|
|
167
|
+
const parsed = JSON.parse(raw);
|
|
168
|
+
if (typeof parsed.version !== 'string' || !parsed.version.trim()) {
|
|
169
|
+
throw new Error('12ui package.json is missing a version');
|
|
170
|
+
}
|
|
171
|
+
return parsed.version.trim();
|
|
172
|
+
};
|
|
173
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export declare const TWELVE_UI_SKILL_NAME = "design";
|
|
2
|
+
export declare const TWELVE_UI_SKILL_NAMES: readonly ["design", "design-search", "design-convert"];
|
|
3
|
+
export type TwelveUiSkillName = typeof TWELVE_UI_SKILL_NAMES[number];
|
|
4
|
+
export declare const SKILL_CLIENTS: readonly ["codex", "claude-code"];
|
|
5
|
+
export type SkillClient = typeof SKILL_CLIENTS[number];
|
|
6
|
+
export type SkillInstallStatus = 'not_installed' | 'current' | 'different';
|
|
7
|
+
export type SkillTarget = {
|
|
8
|
+
client: SkillClient;
|
|
9
|
+
destination: string;
|
|
10
|
+
skill: TwelveUiSkillName;
|
|
11
|
+
};
|
|
12
|
+
export declare const isSkillClient: (value: unknown) => value is SkillClient;
|
|
13
|
+
export declare const isTwelveUiSkillName: (value: unknown) => value is TwelveUiSkillName;
|
|
14
|
+
export declare const skillSupportsClient: (skill: TwelveUiSkillName, client: SkillClient) => boolean;
|
|
15
|
+
export declare const requiredScopesForSkill: (skill: TwelveUiSkillName) => readonly ("design.convert" | "design.corpus.retrieve")[];
|
|
16
|
+
export declare const requiredScopesForSkills: (skills: readonly TwelveUiSkillName[]) => readonly ("design.convert" | "design.corpus.retrieve")[];
|
|
17
|
+
export declare const resolveSkillDirectory: (args: {
|
|
18
|
+
client: SkillClient;
|
|
19
|
+
clientHome?: string;
|
|
20
|
+
environment?: NodeJS.ProcessEnv;
|
|
21
|
+
homeDirectory?: string;
|
|
22
|
+
skill?: TwelveUiSkillName;
|
|
23
|
+
}) => string;
|
|
24
|
+
export declare const discoverSkillTargets: (args?: {
|
|
25
|
+
environment?: NodeJS.ProcessEnv;
|
|
26
|
+
homeDirectory?: string;
|
|
27
|
+
skill?: TwelveUiSkillName;
|
|
28
|
+
}) => Promise<SkillTarget[]>;
|
|
29
|
+
export declare const inspectSkillInstallation: (destination: string) => Promise<SkillInstallStatus>;
|
|
30
|
+
export declare const installSkill: (args: {
|
|
31
|
+
destination: string;
|
|
32
|
+
force?: boolean;
|
|
33
|
+
}) => Promise<"installed" | "replaced" | "already_current">;
|
|
34
|
+
export type SkillInstallResult = {
|
|
35
|
+
target: SkillTarget;
|
|
36
|
+
result: 'installed' | 'replaced' | 'already_current';
|
|
37
|
+
};
|
|
38
|
+
export declare const installSkillsTransaction: (args: {
|
|
39
|
+
targets: readonly SkillTarget[];
|
|
40
|
+
force?: boolean;
|
|
41
|
+
}) => Promise<SkillInstallResult[]>;
|
|
42
|
+
export declare const removeRecognizedLegacySkills: (args: {
|
|
43
|
+
roots: readonly string[];
|
|
44
|
+
exclusions?: readonly string[];
|
|
45
|
+
}) => Promise<{
|
|
46
|
+
removed: string[];
|
|
47
|
+
preserved: string[];
|
|
48
|
+
}>;
|
|
49
|
+
export declare const removeSkill: (destination: string) => Promise<boolean>;
|
|
50
|
+
export declare const readBundledSkill: (skill?: TwelveUiSkillName) => Promise<string>;
|
|
51
|
+
//# sourceMappingURL=skill-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installer.d.ts","sourceRoot":"","sources":["../src/skill-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { access, cp, mkdir, readdir, readFile, rename, rmdir, rm, stat, } from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { inspectLegacySkillDirectory, LEGACY_SKILL_NAMES, matchingLegacySkillFiles, } from './legacy-skill-catalog.js';
|
|
8
|
+
export const TWELVE_UI_SKILL_NAME = 'design';
|
|
9
|
+
export const TWELVE_UI_SKILL_NAMES = [
|
|
10
|
+
TWELVE_UI_SKILL_NAME,
|
|
11
|
+
'design-search',
|
|
12
|
+
'design-convert',
|
|
13
|
+
];
|
|
14
|
+
export const SKILL_CLIENTS = ['codex', 'claude-code'];
|
|
15
|
+
const skillDefinitions = {
|
|
16
|
+
design: {
|
|
17
|
+
clients: SKILL_CLIENTS,
|
|
18
|
+
requiredScopes: ['design.convert', 'design.corpus.retrieve'],
|
|
19
|
+
},
|
|
20
|
+
'design-search': {
|
|
21
|
+
clients: SKILL_CLIENTS,
|
|
22
|
+
requiredScopes: ['design.corpus.retrieve'],
|
|
23
|
+
},
|
|
24
|
+
'design-convert': {
|
|
25
|
+
clients: SKILL_CLIENTS,
|
|
26
|
+
requiredScopes: ['design.convert'],
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
const clientDefinitions = {
|
|
30
|
+
codex: {
|
|
31
|
+
defaultHome: '.codex',
|
|
32
|
+
executable: 'codex',
|
|
33
|
+
homeEnvironment: 'CODEX_HOME',
|
|
34
|
+
},
|
|
35
|
+
'claude-code': {
|
|
36
|
+
defaultHome: '.claude',
|
|
37
|
+
executable: 'claude',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const exists = async (target) => {
|
|
41
|
+
try {
|
|
42
|
+
await stat(target);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error.code === 'ENOENT')
|
|
47
|
+
return false;
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const listFiles = async (root, relative = '') => {
|
|
52
|
+
const directory = path.join(root, relative);
|
|
53
|
+
const entries = await readdir(directory, { withFileTypes: true });
|
|
54
|
+
const files = await Promise.all(entries.map(async (entry) => {
|
|
55
|
+
const child = path.join(relative, entry.name);
|
|
56
|
+
if (entry.isDirectory())
|
|
57
|
+
return listFiles(root, child);
|
|
58
|
+
return [child];
|
|
59
|
+
}));
|
|
60
|
+
return files.flat().sort();
|
|
61
|
+
};
|
|
62
|
+
const expandHome = (value, homeDirectory) => (value === '~'
|
|
63
|
+
? homeDirectory
|
|
64
|
+
: value.startsWith(`~${path.sep}`)
|
|
65
|
+
? path.join(homeDirectory, value.slice(2))
|
|
66
|
+
: value);
|
|
67
|
+
export const isSkillClient = (value) => (typeof value === 'string' && SKILL_CLIENTS.includes(value));
|
|
68
|
+
export const isTwelveUiSkillName = (value) => (typeof value === 'string' && TWELVE_UI_SKILL_NAMES.includes(value));
|
|
69
|
+
export const skillSupportsClient = (skill, client) => skillDefinitions[skill].clients.includes(client);
|
|
70
|
+
export const requiredScopesForSkill = (skill) => (skillDefinitions[skill].requiredScopes);
|
|
71
|
+
export const requiredScopesForSkills = (skills) => {
|
|
72
|
+
const requested = new Set(skills.flatMap((skill) => [...requiredScopesForSkill(skill)]));
|
|
73
|
+
return ['design.convert', 'design.corpus.retrieve'].filter((scope) => (requested.has(scope)));
|
|
74
|
+
};
|
|
75
|
+
const sourceRootFor = (skill) => (fileURLToPath(new URL(`../skills/${skill}`, import.meta.url)));
|
|
76
|
+
const skillFromDestination = (destination) => {
|
|
77
|
+
const name = path.basename(destination);
|
|
78
|
+
if (!isTwelveUiSkillName(name)) {
|
|
79
|
+
throw new Error(`Skill destination must end in one of: ${TWELVE_UI_SKILL_NAMES.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
return name;
|
|
82
|
+
};
|
|
83
|
+
const resolveClientHome = (args) => {
|
|
84
|
+
const definition = clientDefinitions[args.client];
|
|
85
|
+
const environmentHome = definition.homeEnvironment
|
|
86
|
+
? args.environment[definition.homeEnvironment]?.trim()
|
|
87
|
+
: undefined;
|
|
88
|
+
const configuredHome = args.clientHome?.trim()
|
|
89
|
+
|| environmentHome
|
|
90
|
+
|| path.join(args.homeDirectory, definition.defaultHome);
|
|
91
|
+
return path.resolve(expandHome(configuredHome, args.homeDirectory));
|
|
92
|
+
};
|
|
93
|
+
export const resolveSkillDirectory = (args) => {
|
|
94
|
+
const skill = args.skill ?? TWELVE_UI_SKILL_NAME;
|
|
95
|
+
if (!skillSupportsClient(skill, args.client)) {
|
|
96
|
+
throw new Error(`${skill} does not support ${args.client}`);
|
|
97
|
+
}
|
|
98
|
+
const environment = args.environment ?? process.env;
|
|
99
|
+
const homeDirectory = args.homeDirectory ?? os.homedir();
|
|
100
|
+
const clientHome = resolveClientHome({
|
|
101
|
+
...args,
|
|
102
|
+
environment,
|
|
103
|
+
homeDirectory,
|
|
104
|
+
});
|
|
105
|
+
return path.join(clientHome, 'skills', skill);
|
|
106
|
+
};
|
|
107
|
+
const executableExists = async (executable, environment) => {
|
|
108
|
+
const pathValue = environment.PATH?.trim();
|
|
109
|
+
if (!pathValue)
|
|
110
|
+
return false;
|
|
111
|
+
const extensions = process.platform === 'win32'
|
|
112
|
+
? (environment.PATHEXT ?? '.EXE;.CMD;.BAT;.COM').split(';')
|
|
113
|
+
: [''];
|
|
114
|
+
const candidates = pathValue
|
|
115
|
+
.split(path.delimiter)
|
|
116
|
+
.filter(Boolean)
|
|
117
|
+
.flatMap((directory) => extensions.map((extension) => (path.join(directory, `${executable}${extension.toLowerCase()}`))));
|
|
118
|
+
return (await Promise.all(candidates.map(async (candidate) => {
|
|
119
|
+
try {
|
|
120
|
+
await access(candidate, process.platform === 'win32' ? constants.F_OK : constants.X_OK);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}))).some(Boolean);
|
|
127
|
+
};
|
|
128
|
+
export const discoverSkillTargets = async (args = {}) => {
|
|
129
|
+
const skill = args.skill ?? TWELVE_UI_SKILL_NAME;
|
|
130
|
+
const environment = args.environment ?? process.env;
|
|
131
|
+
const homeDirectory = args.homeDirectory ?? os.homedir();
|
|
132
|
+
const discovered = await Promise.all(SKILL_CLIENTS.map(async (client) => {
|
|
133
|
+
if (!skillSupportsClient(skill, client))
|
|
134
|
+
return null;
|
|
135
|
+
const definition = clientDefinitions[client];
|
|
136
|
+
const configuredHome = definition.homeEnvironment
|
|
137
|
+
? environment[definition.homeEnvironment]?.trim()
|
|
138
|
+
: undefined;
|
|
139
|
+
const clientHome = resolveClientHome({ client, environment, homeDirectory });
|
|
140
|
+
const detected = Boolean(configuredHome)
|
|
141
|
+
|| await exists(clientHome)
|
|
142
|
+
|| await executableExists(definition.executable, environment);
|
|
143
|
+
return detected
|
|
144
|
+
? {
|
|
145
|
+
client,
|
|
146
|
+
destination: path.join(clientHome, 'skills', skill),
|
|
147
|
+
skill,
|
|
148
|
+
}
|
|
149
|
+
: null;
|
|
150
|
+
}));
|
|
151
|
+
return discovered.filter((target) => target !== null);
|
|
152
|
+
};
|
|
153
|
+
export const inspectSkillInstallation = async (destination) => {
|
|
154
|
+
const skill = skillFromDestination(destination);
|
|
155
|
+
const sourceRoot = sourceRootFor(skill);
|
|
156
|
+
if (!(await exists(destination)))
|
|
157
|
+
return 'not_installed';
|
|
158
|
+
const [expectedFiles, installedFiles] = await Promise.all([
|
|
159
|
+
listFiles(sourceRoot),
|
|
160
|
+
listFiles(destination),
|
|
161
|
+
]);
|
|
162
|
+
if (installedFiles.length !== expectedFiles.length
|
|
163
|
+
|| installedFiles.some((file, index) => file !== expectedFiles[index])) {
|
|
164
|
+
return 'different';
|
|
165
|
+
}
|
|
166
|
+
for (const relative of expectedFiles) {
|
|
167
|
+
try {
|
|
168
|
+
const [source, installed] = await Promise.all([
|
|
169
|
+
readFile(path.join(sourceRoot, relative)),
|
|
170
|
+
readFile(path.join(destination, relative)),
|
|
171
|
+
]);
|
|
172
|
+
if (!source.equals(installed))
|
|
173
|
+
return 'different';
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error.code === 'ENOENT')
|
|
177
|
+
return 'different';
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return 'current';
|
|
182
|
+
};
|
|
183
|
+
export const installSkill = async (args) => {
|
|
184
|
+
const skill = skillFromDestination(args.destination);
|
|
185
|
+
const sourceRoot = sourceRootFor(skill);
|
|
186
|
+
const current = await inspectSkillInstallation(args.destination);
|
|
187
|
+
if (current === 'current')
|
|
188
|
+
return 'already_current';
|
|
189
|
+
if (current === 'different' && !args.force) {
|
|
190
|
+
throw new Error(`A different skill already exists at ${args.destination}; use --force to replace it`);
|
|
191
|
+
}
|
|
192
|
+
const parent = path.dirname(args.destination);
|
|
193
|
+
await mkdir(parent, { recursive: true });
|
|
194
|
+
const staging = path.join(parent, `.${skill}-${randomUUID()}.tmp`);
|
|
195
|
+
const backup = path.join(parent, `.${skill}-${randomUUID()}.backup`);
|
|
196
|
+
await cp(sourceRoot, staging, { recursive: true, errorOnExist: true });
|
|
197
|
+
try {
|
|
198
|
+
if (current === 'different') {
|
|
199
|
+
await rename(args.destination, backup);
|
|
200
|
+
try {
|
|
201
|
+
await rename(staging, args.destination);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
await rename(backup, args.destination);
|
|
205
|
+
throw error;
|
|
206
|
+
}
|
|
207
|
+
await rm(backup, { recursive: true, force: true });
|
|
208
|
+
return 'replaced';
|
|
209
|
+
}
|
|
210
|
+
await rename(staging, args.destination);
|
|
211
|
+
return 'installed';
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
await rm(staging, { recursive: true, force: true });
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
export const installSkillsTransaction = async (args) => {
|
|
218
|
+
const uniqueTargets = [...new Map(args.targets.map((target) => [
|
|
219
|
+
path.resolve(target.destination),
|
|
220
|
+
{ ...target, destination: path.resolve(target.destination) },
|
|
221
|
+
])).values()];
|
|
222
|
+
const inspected = await Promise.all(uniqueTargets.map(async (target) => ({
|
|
223
|
+
target,
|
|
224
|
+
status: await inspectSkillInstallation(target.destination),
|
|
225
|
+
legacy: await inspectLegacySkillDirectory(target.destination),
|
|
226
|
+
})));
|
|
227
|
+
const conflicts = inspected.filter(({ status, legacy }) => (status === 'different' && legacy !== 'recognized'));
|
|
228
|
+
if (conflicts.length > 0 && !args.force) {
|
|
229
|
+
throw new Error(`Different skills already exist at ${conflicts.map(({ target }) => target.destination).join(', ')}; use --force to replace them`);
|
|
230
|
+
}
|
|
231
|
+
const changes = inspected.filter(({ status }) => status !== 'current');
|
|
232
|
+
const staged = await Promise.all(changes.map(async ({ target }) => {
|
|
233
|
+
const parent = path.dirname(target.destination);
|
|
234
|
+
await mkdir(parent, { recursive: true });
|
|
235
|
+
const staging = path.join(parent, `.${target.skill}-${randomUUID()}.tmp`);
|
|
236
|
+
const backup = path.join(parent, `.${target.skill}-${randomUUID()}.backup`);
|
|
237
|
+
await cp(sourceRootFor(target.skill), staging, { recursive: true, errorOnExist: true });
|
|
238
|
+
return { target, staging, backup, hadExisting: await exists(target.destination) };
|
|
239
|
+
}));
|
|
240
|
+
const applied = [];
|
|
241
|
+
try {
|
|
242
|
+
for (const entry of staged) {
|
|
243
|
+
if (entry.hadExisting)
|
|
244
|
+
await rename(entry.target.destination, entry.backup);
|
|
245
|
+
try {
|
|
246
|
+
await rename(entry.staging, entry.target.destination);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (entry.hadExisting)
|
|
250
|
+
await rename(entry.backup, entry.target.destination);
|
|
251
|
+
throw error;
|
|
252
|
+
}
|
|
253
|
+
applied.push(entry);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
for (const entry of [...applied].reverse()) {
|
|
258
|
+
await rm(entry.target.destination, { recursive: true, force: true });
|
|
259
|
+
if (entry.hadExisting)
|
|
260
|
+
await rename(entry.backup, entry.target.destination);
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
await Promise.all(staged.map(({ staging }) => rm(staging, { recursive: true, force: true })));
|
|
266
|
+
}
|
|
267
|
+
await Promise.all(applied.map(({ backup }) => rm(backup, { recursive: true, force: true })));
|
|
268
|
+
return inspected.map(({ target, status, legacy }) => ({
|
|
269
|
+
target,
|
|
270
|
+
result: status === 'current'
|
|
271
|
+
? 'already_current'
|
|
272
|
+
: status === 'not_installed'
|
|
273
|
+
? 'installed'
|
|
274
|
+
: legacy === 'recognized' || args.force
|
|
275
|
+
? 'replaced'
|
|
276
|
+
: 'installed',
|
|
277
|
+
}));
|
|
278
|
+
};
|
|
279
|
+
export const removeRecognizedLegacySkills = async (args) => {
|
|
280
|
+
const exclusions = new Set((args.exclusions ?? []).map((value) => path.resolve(value)));
|
|
281
|
+
const candidates = [...new Set(args.roots.flatMap((root) => (LEGACY_SKILL_NAMES.map((name) => path.resolve(root, name)))))].filter((candidate) => !exclusions.has(candidate));
|
|
282
|
+
const inspected = await Promise.all(candidates.map(async (candidate) => ({
|
|
283
|
+
candidate,
|
|
284
|
+
status: await inspectLegacySkillDirectory(candidate),
|
|
285
|
+
matchingFiles: await matchingLegacySkillFiles(candidate),
|
|
286
|
+
})));
|
|
287
|
+
const matchingPaths = inspected.flatMap(({ candidate, matchingFiles }) => (matchingFiles.map((file) => path.join(candidate, file))));
|
|
288
|
+
await Promise.all(matchingPaths.map((file) => rm(file)));
|
|
289
|
+
const possibleEmptyDirectories = [...new Set(matchingPaths.flatMap((file) => {
|
|
290
|
+
const directories = [];
|
|
291
|
+
let directory = path.dirname(file);
|
|
292
|
+
const candidate = inspected.find(({ candidate: root }) => file.startsWith(`${root}${path.sep}`))
|
|
293
|
+
?.candidate;
|
|
294
|
+
while (candidate && directory.startsWith(candidate)) {
|
|
295
|
+
directories.push(directory);
|
|
296
|
+
if (directory === candidate)
|
|
297
|
+
break;
|
|
298
|
+
directory = path.dirname(directory);
|
|
299
|
+
}
|
|
300
|
+
return directories;
|
|
301
|
+
}))].sort((left, right) => right.length - left.length);
|
|
302
|
+
for (const directory of possibleEmptyDirectories) {
|
|
303
|
+
await rmdir(directory).catch((error) => {
|
|
304
|
+
if (error.code !== 'ENOENT' && error.code !== 'ENOTEMPTY')
|
|
305
|
+
throw error;
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
const remaining = await Promise.all(inspected.map(async ({ candidate, status, matchingFiles }) => ({
|
|
309
|
+
candidate,
|
|
310
|
+
preserve: status !== 'missing'
|
|
311
|
+
&& (matchingFiles.length === 0 || await exists(candidate)),
|
|
312
|
+
})));
|
|
313
|
+
return {
|
|
314
|
+
removed: matchingPaths,
|
|
315
|
+
preserved: remaining
|
|
316
|
+
.filter(({ preserve }) => preserve)
|
|
317
|
+
.map(({ candidate }) => candidate),
|
|
318
|
+
};
|
|
319
|
+
};
|
|
320
|
+
export const removeSkill = async (destination) => {
|
|
321
|
+
skillFromDestination(destination);
|
|
322
|
+
if (!(await exists(destination)))
|
|
323
|
+
return false;
|
|
324
|
+
await rm(destination, { recursive: true });
|
|
325
|
+
return true;
|
|
326
|
+
};
|
|
327
|
+
export const readBundledSkill = async (skill = TWELVE_UI_SKILL_NAME) => (readFile(path.join(sourceRootFor(skill), 'SKILL.md'), 'utf8'));
|
|
328
|
+
//# sourceMappingURL=skill-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../src/skill-installer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@12ui/design",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "The canonical 12UI CLI, SDK, MCP server, and visual interface design skills",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"12ui": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/**/*",
|
|
13
|
+
"skills/**/*",
|
|
14
|
+
"README.md",
|
|
15
|
+
"package.json"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "node ../../scripts/build-typescript-package.mjs",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"start": "node dist/cli.js",
|
|
21
|
+
"test": "vitest",
|
|
22
|
+
"test:run": "vitest run",
|
|
23
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.type-tests.json",
|
|
24
|
+
"prepublishOnly": "npm run build"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@just-every/ensemble": "0.2.271",
|
|
28
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
29
|
+
"sharp": "^0.34.5"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.19.17",
|
|
33
|
+
"typescript": "^5.9.3",
|
|
34
|
+
"vitest": "^3.2.4"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"mcp",
|
|
38
|
+
"mcp-server",
|
|
39
|
+
"design",
|
|
40
|
+
"just-every",
|
|
41
|
+
"image-to-html",
|
|
42
|
+
"image-to-react",
|
|
43
|
+
"image-to-app",
|
|
44
|
+
"layered-document",
|
|
45
|
+
"design-corpus",
|
|
46
|
+
"visual-retrieval"
|
|
47
|
+
],
|
|
48
|
+
"author": "Just Every",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": "^22.13.0 || >=24.0.0"
|
|
52
|
+
}
|
|
53
|
+
}
|