@12ui/design 0.2.20 → 0.2.21
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/dist/branch-progress.js +1 -1
- package/dist/branch-progress.js.map +1 -1
- package/dist/cli-auth-command.d.ts.map +1 -1
- package/dist/cli-auth-command.js +7 -1
- package/dist/cli-auth-command.js.map +1 -1
- package/dist/cli-branch-command.d.ts +0 -1
- package/dist/cli-branch-command.d.ts.map +1 -1
- package/dist/cli-branch-command.js +16 -41
- package/dist/cli-branch-command.js.map +1 -1
- package/dist/cli-capabilities.d.ts +6 -5
- package/dist/cli-capabilities.d.ts.map +1 -1
- package/dist/cli-capabilities.js +6 -5
- package/dist/cli-capabilities.js.map +1 -1
- package/dist/cli-cli-command.d.ts.map +1 -1
- package/dist/cli-cli-command.js +7 -1
- package/dist/cli-cli-command.js.map +1 -1
- package/dist/cli-convert-command.d.ts +12 -0
- package/dist/cli-convert-command.d.ts.map +1 -1
- package/dist/cli-convert-command.js +70 -12
- package/dist/cli-convert-command.js.map +1 -1
- package/dist/cli-corpus-command.d.ts.map +1 -1
- package/dist/cli-corpus-command.js +7 -6
- package/dist/cli-corpus-command.js.map +1 -1
- package/dist/cli-create-command.d.ts +35 -1
- package/dist/cli-create-command.d.ts.map +1 -1
- package/dist/cli-create-command.js +40 -24
- package/dist/cli-create-command.js.map +1 -1
- package/dist/cli-detach.js +2 -2
- package/dist/cli-detach.js.map +1 -1
- package/dist/cli-draft-command.d.ts +23 -7
- package/dist/cli-draft-command.d.ts.map +1 -1
- package/dist/cli-draft-command.js +38 -12
- package/dist/cli-draft-command.js.map +1 -1
- package/dist/cli-export-command.d.ts.map +1 -1
- package/dist/cli-export-command.js +19 -1
- package/dist/cli-export-command.js.map +1 -1
- package/dist/cli-image-batch-command.d.ts +0 -6
- package/dist/cli-image-batch-command.d.ts.map +1 -1
- package/dist/cli-image-batch-command.js +7 -15
- package/dist/cli-image-batch-command.js.map +1 -1
- package/dist/cli-image-command.d.ts.map +1 -1
- package/dist/cli-image-command.js +7 -7
- package/dist/cli-image-command.js.map +1 -1
- package/dist/cli-next-command.d.ts +51 -0
- package/dist/cli-next-command.d.ts.map +1 -0
- package/dist/cli-next-command.js +152 -0
- package/dist/cli-next-command.js.map +1 -0
- package/dist/cli-output-paths.d.ts +20 -0
- package/dist/cli-output-paths.d.ts.map +1 -1
- package/dist/cli-output-paths.js +30 -0
- package/dist/cli-output-paths.js.map +1 -1
- package/dist/cli-package-command.d.ts +0 -1
- package/dist/cli-package-command.d.ts.map +1 -1
- package/dist/cli-package-command.js +11 -5
- package/dist/cli-package-command.js.map +1 -1
- package/dist/cli-run.d.ts.map +1 -1
- package/dist/cli-run.js +15 -12
- package/dist/cli-run.js.map +1 -1
- package/dist/cli-select-command.d.ts +0 -1
- package/dist/cli-select-command.d.ts.map +1 -1
- package/dist/cli-select-command.js +25 -35
- package/dist/cli-select-command.js.map +1 -1
- package/dist/cli-skill-command.d.ts.map +1 -1
- package/dist/cli-skill-command.js +7 -2
- package/dist/cli-skill-command.js.map +1 -1
- package/dist/cli-usage.d.ts +69 -2
- package/dist/cli-usage.d.ts.map +1 -1
- package/dist/cli-usage.js +119 -37
- package/dist/cli-usage.js.map +1 -1
- package/dist/image-batch-status.d.ts +1 -1
- package/dist/image-batch-status.js +1 -1
- package/dist/image-batch-status.js.map +1 -1
- package/dist/legacy-skill-catalog.d.ts.map +1 -1
- package/dist/legacy-skill-catalog.js +59 -10
- package/dist/legacy-skill-catalog.js.map +1 -1
- package/dist/mcp-convert.d.ts +32 -0
- package/dist/mcp-convert.d.ts.map +1 -0
- package/dist/mcp-convert.js +118 -0
- package/dist/mcp-convert.js.map +1 -0
- package/dist/next-target.d.ts +56 -0
- package/dist/next-target.d.ts.map +1 -0
- package/dist/next-target.js +72 -0
- package/dist/next-target.js.map +1 -0
- package/dist/run-journal-commands.d.ts +10 -0
- package/dist/run-journal-commands.d.ts.map +1 -1
- package/dist/run-journal-commands.js +35 -26
- package/dist/run-journal-commands.js.map +1 -1
- package/dist/selection-record.d.ts +7 -5
- package/dist/selection-record.d.ts.map +1 -1
- package/dist/selection-record.js +21 -4
- package/dist/selection-record.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -78
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/skills/design/SKILL.md +5 -8
- package/skills/design-branch/SKILL.md +12 -16
- package/skills/design-convert/SKILL.md +10 -15
- package/skills/design-draft/SKILL.md +24 -43
- package/skills/design-search/SKILL.md +4 -7
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What one argument to `12ui next` names.
|
|
3
|
+
*
|
|
4
|
+
* "What is happening and what do I do" had five spellings with three argument
|
|
5
|
+
* shapes — a positional directory, a positional hosted id, and `--manifest`
|
|
6
|
+
* pointing at a file — and a measured run used two of them on one run and still
|
|
7
|
+
* did not know what to do. The shapes are all still real; only the caller's
|
|
8
|
+
* obligation to know which one they are in is gone. This module holds the whole
|
|
9
|
+
* of that decision, so the dispatcher and the run journal resolve it the same
|
|
10
|
+
* way rather than twice.
|
|
11
|
+
*
|
|
12
|
+
* Deliberately dependency-light: the run journal resolves a target before any
|
|
13
|
+
* command module loads, and it must never be the reason a dispatch throws.
|
|
14
|
+
*/
|
|
15
|
+
export type NextTarget = {
|
|
16
|
+
kind: 'create';
|
|
17
|
+
runId: string;
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'branch';
|
|
20
|
+
directory: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'draft';
|
|
23
|
+
directory: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'image-batch';
|
|
26
|
+
manifestPath: string;
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'conversion';
|
|
29
|
+
conversionId: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A path that exists but holds no run record still carries `directory`: the
|
|
33
|
+
* caller named a durable place, and the refusal about it belongs in that
|
|
34
|
+
* place's journal rather than nowhere.
|
|
35
|
+
*/
|
|
36
|
+
| {
|
|
37
|
+
kind: 'unknown';
|
|
38
|
+
given: string;
|
|
39
|
+
resolved: string;
|
|
40
|
+
directory?: string;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Resolved in the order a caller means them.
|
|
44
|
+
*
|
|
45
|
+
* A draft run directory that has started branching answers about the branch:
|
|
46
|
+
* the branch is what is moving, and the draft half is already terminal. That
|
|
47
|
+
* ordering is the one judgement here, and it is the same judgement
|
|
48
|
+
* `resolveBranchDirectory` makes for `branch execute <run-dir>`.
|
|
49
|
+
*/
|
|
50
|
+
export declare const resolveNextTarget: (given: string) => Promise<NextTarget>;
|
|
51
|
+
/**
|
|
52
|
+
* The durable directory a target's record lives in, for the run journal. A
|
|
53
|
+
* hosted run has none — it is the service's, not this machine's.
|
|
54
|
+
*/
|
|
55
|
+
export declare const nextTargetWorkspace: (target: NextTarget) => string | undefined;
|
|
56
|
+
//# sourceMappingURL=next-target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-target.d.ts","sourceRoot":"","sources":["../src/next-target.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE;AAC9C;;;;GAIG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAqB7E;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,GAAU,OAAO,MAAM,KAAG,OAAO,CAAC,UAAU,CAwBzE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,UAAU,KAAG,MAAM,GAAG,SAYjE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { BRANCH_ATTEMPT_FILENAME, BRANCH_COMPLETION_FILENAME, } from './branch-run-record.js';
|
|
4
|
+
import { BRANCH_PROGRESS_FILENAME } from './branch-progress.js';
|
|
5
|
+
import { DRAFT_BRANCH_DIRECTORY, DRAFT_GENERATION_MANIFEST, DRAFT_RECORD_FILENAME, } from './draft-workspace.js';
|
|
6
|
+
/** Hosted create/branch runs mint this shape, and nothing else does. */
|
|
7
|
+
const HOSTED_RUN_ID = /^crt-[a-f0-9]{40}$/u;
|
|
8
|
+
/** A conversion is `12ui resume`'s argument, not this command's. */
|
|
9
|
+
const CONVERSION_ID = /^cnv-/u;
|
|
10
|
+
const BRANCH_RECORDS = [
|
|
11
|
+
BRANCH_ATTEMPT_FILENAME,
|
|
12
|
+
BRANCH_COMPLETION_FILENAME,
|
|
13
|
+
BRANCH_PROGRESS_FILENAME,
|
|
14
|
+
];
|
|
15
|
+
const exists = async (file) => (stat(file).then(() => true).catch(() => false));
|
|
16
|
+
const holdsAny = async (directory, names) => ((await Promise.all(names.map((name) => exists(path.join(directory, name))))).some(Boolean));
|
|
17
|
+
/**
|
|
18
|
+
* Resolved in the order a caller means them.
|
|
19
|
+
*
|
|
20
|
+
* A draft run directory that has started branching answers about the branch:
|
|
21
|
+
* the branch is what is moving, and the draft half is already terminal. That
|
|
22
|
+
* ordering is the one judgement here, and it is the same judgement
|
|
23
|
+
* `resolveBranchDirectory` makes for `branch execute <run-dir>`.
|
|
24
|
+
*/
|
|
25
|
+
export const resolveNextTarget = async (given) => {
|
|
26
|
+
const trimmed = given.trim();
|
|
27
|
+
if (HOSTED_RUN_ID.test(trimmed))
|
|
28
|
+
return { kind: 'create', runId: trimmed };
|
|
29
|
+
if (CONVERSION_ID.test(trimmed))
|
|
30
|
+
return { kind: 'conversion', conversionId: trimmed };
|
|
31
|
+
const resolved = path.resolve(trimmed);
|
|
32
|
+
const entry = await stat(resolved).catch(() => null);
|
|
33
|
+
if (entry?.isFile())
|
|
34
|
+
return { kind: 'image-batch', manifestPath: resolved };
|
|
35
|
+
if (entry?.isDirectory()) {
|
|
36
|
+
if (await holdsAny(resolved, BRANCH_RECORDS))
|
|
37
|
+
return { kind: 'branch', directory: resolved };
|
|
38
|
+
const branchDir = path.join(resolved, DRAFT_BRANCH_DIRECTORY);
|
|
39
|
+
if (await holdsAny(branchDir, BRANCH_RECORDS))
|
|
40
|
+
return { kind: 'branch', directory: branchDir };
|
|
41
|
+
if (await exists(path.join(resolved, DRAFT_RECORD_FILENAME))) {
|
|
42
|
+
return { kind: 'draft', directory: resolved };
|
|
43
|
+
}
|
|
44
|
+
if (await exists(path.join(resolved, DRAFT_GENERATION_MANIFEST))) {
|
|
45
|
+
return { kind: 'image-batch', manifestPath: path.join(resolved, DRAFT_GENERATION_MANIFEST) };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
kind: 'unknown',
|
|
50
|
+
given: trimmed,
|
|
51
|
+
resolved,
|
|
52
|
+
...(entry?.isDirectory() ? { directory: resolved } : {}),
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* The durable directory a target's record lives in, for the run journal. A
|
|
57
|
+
* hosted run has none — it is the service's, not this machine's.
|
|
58
|
+
*/
|
|
59
|
+
export const nextTargetWorkspace = (target) => {
|
|
60
|
+
switch (target.kind) {
|
|
61
|
+
case 'branch':
|
|
62
|
+
case 'draft':
|
|
63
|
+
return target.directory;
|
|
64
|
+
case 'image-batch':
|
|
65
|
+
return path.dirname(target.manifestPath);
|
|
66
|
+
case 'unknown':
|
|
67
|
+
return target.directory;
|
|
68
|
+
default:
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=next-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next-target.js","sourceRoot":"","sources":["../src/next-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AA8B9B,wEAAwE;AACxE,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAC5C,oEAAoE;AACpE,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,MAAM,cAAc,GAAG;IACrB,uBAAuB;IACvB,0BAA0B;IAC1B,wBAAwB;CAChB,CAAC;AAEX,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE,CAAC,CACvD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAC/C,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAwB,EAAoB,EAAE,CAAC,CACxF,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAC3F,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,KAAa,EAAuB,EAAE;IAC5E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3E,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACtF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,MAAM,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IAC5E,IAAI,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QACzB,IAAI,MAAM,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QAC7F,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAC9D,IAAI,MAAM,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC/F,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yBAAyB,CAAC,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,QAAQ;QACR,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAkB,EAAsB,EAAE;IAC5E,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,SAAS,CAAC;QAC1B,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3C,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC,SAAS,CAAC;QAC1B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -39,6 +39,16 @@ export type RunJournalCommand = {
|
|
|
39
39
|
} & Partial<JournaledCommand> | JournaledCommand & {
|
|
40
40
|
skip?: undefined;
|
|
41
41
|
});
|
|
42
|
+
/**
|
|
43
|
+
* The MCP server's one paid tool, under the name its journal lines carry.
|
|
44
|
+
*
|
|
45
|
+
* It is declared here rather than in `server.ts` because this file is the
|
|
46
|
+
* enumeration of the surface: a paid path that journals under a name this table
|
|
47
|
+
* has never heard of is exactly the hole the table exists to close. The server
|
|
48
|
+
* itself has no argv and no long-lived workspace, so it opens one journal per
|
|
49
|
+
* tool call in the directory that call writes to.
|
|
50
|
+
*/
|
|
51
|
+
export declare const MCP_CONVERT_JOURNAL_CMD = "mcp design.convert";
|
|
42
52
|
export declare const RUN_JOURNAL_COMMANDS: readonly RunJournalCommand[];
|
|
43
53
|
export declare const runJournalCommandFor: (command: readonly string[], flags: CliFlags) => RunJournalCommand | undefined;
|
|
44
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-journal-commands.d.ts","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-journal-commands.d.ts","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AAEH,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,QAAQ,KACZ,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtD,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7E,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;CACnE,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAyD7F;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAwL5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,QAAQ,KACd,iBAAiB,GAAG,SAEtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAU,MAAM;IACzC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,KAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAkBhC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { booleanFlag, stringFlag } from './cli-arguments.js';
|
|
3
3
|
import { resolveBranchDirectory } from './cli-branch-command.js';
|
|
4
|
+
import { nextTargetWorkspace, resolveNextTarget } from './next-target.js';
|
|
4
5
|
/** `--wait` keeps the work in this shell; `--dry-run` starts nothing at all. */
|
|
5
6
|
const detachesByDefault = (flags) => (!booleanFlag(flags, 'wait') && !booleanFlag(flags, 'dry-run'));
|
|
6
7
|
const resolved = (value) => (value?.trim() ? path.resolve(value.trim()) : undefined);
|
|
@@ -25,6 +26,13 @@ const conversionOutputDirectory = (command, flags) => {
|
|
|
25
26
|
const input = resolved(command[1]);
|
|
26
27
|
return input ? path.dirname(input) : undefined;
|
|
27
28
|
};
|
|
29
|
+
/** `12ui next` takes one argument of three shapes; one module decides which. */
|
|
30
|
+
const nextWorkspace = async (command) => {
|
|
31
|
+
const given = command[1]?.trim();
|
|
32
|
+
if (!given)
|
|
33
|
+
return undefined;
|
|
34
|
+
return nextTargetWorkspace(await resolveNextTarget(given));
|
|
35
|
+
};
|
|
28
36
|
const branchDirectory = async (command, flags) => {
|
|
29
37
|
const flagValue = stringFlag(flags, 'out-dir')?.trim();
|
|
30
38
|
const positional = command[2]?.trim();
|
|
@@ -37,6 +45,16 @@ const branchDirectory = async (command, flags) => {
|
|
|
37
45
|
return directory.branchDir;
|
|
38
46
|
};
|
|
39
47
|
const is = (...tokens) => (command) => (tokens.every((token, index) => command[index] === token));
|
|
48
|
+
/**
|
|
49
|
+
* The MCP server's one paid tool, under the name its journal lines carry.
|
|
50
|
+
*
|
|
51
|
+
* It is declared here rather than in `server.ts` because this file is the
|
|
52
|
+
* enumeration of the surface: a paid path that journals under a name this table
|
|
53
|
+
* has never heard of is exactly the hole the table exists to close. The server
|
|
54
|
+
* itself has no argv and no long-lived workspace, so it opens one journal per
|
|
55
|
+
* tool call in the directory that call writes to.
|
|
56
|
+
*/
|
|
57
|
+
export const MCP_CONVERT_JOURNAL_CMD = 'mcp design.convert';
|
|
40
58
|
export const RUN_JOURNAL_COMMANDS = [
|
|
41
59
|
{
|
|
42
60
|
cmd: 'help',
|
|
@@ -93,13 +111,6 @@ export const RUN_JOURNAL_COMMANDS = [
|
|
|
93
111
|
workspace: manifestDirectory,
|
|
94
112
|
detached: detachesByDefault,
|
|
95
113
|
},
|
|
96
|
-
{
|
|
97
|
-
cmd: 'image batch-status',
|
|
98
|
-
matches: is('image', 'batch-status'),
|
|
99
|
-
paid: false,
|
|
100
|
-
terminalOnSuccess: false,
|
|
101
|
-
workspace: manifestDirectory,
|
|
102
|
-
},
|
|
103
114
|
{
|
|
104
115
|
cmd: 'image generate',
|
|
105
116
|
matches: is('image', 'generate'),
|
|
@@ -112,13 +123,6 @@ export const RUN_JOURNAL_COMMANDS = [
|
|
|
112
123
|
matches: is('image'),
|
|
113
124
|
skip: 'An unrecognized image action refuses before it resolves a directory.',
|
|
114
125
|
},
|
|
115
|
-
{
|
|
116
|
-
cmd: 'draft status',
|
|
117
|
-
matches: is('draft', 'status'),
|
|
118
|
-
paid: false,
|
|
119
|
-
terminalOnSuccess: false,
|
|
120
|
-
workspace: (command) => resolved(command[2]),
|
|
121
|
-
},
|
|
122
126
|
{
|
|
123
127
|
cmd: 'draft',
|
|
124
128
|
matches: is('draft'),
|
|
@@ -154,17 +158,20 @@ export const RUN_JOURNAL_COMMANDS = [
|
|
|
154
158
|
workspace: branchDirectory,
|
|
155
159
|
detached: detachesByDefault,
|
|
156
160
|
},
|
|
157
|
-
{
|
|
158
|
-
cmd: 'branch status',
|
|
159
|
-
matches: is('branch', 'status'),
|
|
160
|
-
paid: false,
|
|
161
|
-
terminalOnSuccess: false,
|
|
162
|
-
workspace: branchDirectory,
|
|
163
|
-
},
|
|
164
161
|
{
|
|
165
162
|
cmd: 'branch',
|
|
166
163
|
matches: is('branch'),
|
|
167
|
-
skip: 'An unrecognized branch action
|
|
164
|
+
skip: 'An unrecognized branch action, and the retired `branch status`, refuse before they'
|
|
165
|
+
+ ' resolve a directory.',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
// One reader for every run shape, so its journal line is the one that can
|
|
169
|
+
// settle whether the run this workspace holds is over.
|
|
170
|
+
cmd: 'next',
|
|
171
|
+
matches: is('next'),
|
|
172
|
+
paid: false,
|
|
173
|
+
terminalOnSuccess: false,
|
|
174
|
+
workspace: nextWorkspace,
|
|
168
175
|
},
|
|
169
176
|
{
|
|
170
177
|
cmd: 'export',
|
|
@@ -190,8 +197,8 @@ export const RUN_JOURNAL_COMMANDS = [
|
|
|
190
197
|
{
|
|
191
198
|
cmd: 'create',
|
|
192
199
|
matches: is('create'),
|
|
193
|
-
skip: 'claim
|
|
194
|
-
+ '
|
|
200
|
+
skip: 'claim and dispatch act on a hosted run and write no local workspace;'
|
|
201
|
+
+ ' only `create download` has an --out-dir.',
|
|
195
202
|
},
|
|
196
203
|
{
|
|
197
204
|
cmd: 'convert package',
|
|
@@ -225,8 +232,10 @@ export const RUN_JOURNAL_COMMANDS = [
|
|
|
225
232
|
{
|
|
226
233
|
cmd: 'mcp',
|
|
227
234
|
matches: is('mcp'),
|
|
228
|
-
skip: '
|
|
229
|
-
+ '
|
|
235
|
+
skip: 'The server process owns no workspace: it serves the MCP protocol on'
|
|
236
|
+
+ ' stdio for as long as a client is attached. Each paid tool call it'
|
|
237
|
+
+ ' serves opens its own journal in the directory it writes to — see'
|
|
238
|
+
+ ` \`${MCP_CONVERT_JOURNAL_CMD}\` in server.ts.`,
|
|
230
239
|
},
|
|
231
240
|
];
|
|
232
241
|
export const runJournalCommandFor = (command, flags) => (RUN_JOURNAL_COMMANDS.find((entry) => entry.matches(command, flags)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-journal-commands.js","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-journal-commands.js","sourceRoot":"","sources":["../src/run-journal-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,13 @@ export type SelectionRecord = {
|
|
|
68
68
|
idempotencyKey: string;
|
|
69
69
|
providerIdempotencyEnforced: boolean;
|
|
70
70
|
attemptEvidencePath: string;
|
|
71
|
+
/**
|
|
72
|
+
* Inert since 0.2.20 and always empty. Its only writer was `--reject`,
|
|
73
|
+
* which was deleted: the parser is last-wins, so the flag could never carry
|
|
74
|
+
* the several reasons its own documentation showed, and it had zero uses.
|
|
75
|
+
* The field stays because `selection.json` v6 is a durable artifact other
|
|
76
|
+
* readers parse; it goes when the record next takes a version.
|
|
77
|
+
*/
|
|
71
78
|
rejectionReasons: string[];
|
|
72
79
|
}[];
|
|
73
80
|
recommendation: {
|
|
@@ -83,11 +90,6 @@ export declare const buildSelectionRecord: (args: {
|
|
|
83
90
|
draft: DraftRecord;
|
|
84
91
|
winner: string;
|
|
85
92
|
reason: string;
|
|
86
|
-
recommendation?: {
|
|
87
|
-
candidateId: string | null;
|
|
88
|
-
source: string | null;
|
|
89
|
-
};
|
|
90
|
-
rejectionReasons?: Record<string, string[]>;
|
|
91
93
|
now?: () => Date;
|
|
92
94
|
}) => Promise<SelectionRecord>;
|
|
93
95
|
export declare const writeSelectionRecord: (file: string, record: SelectionRecord) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-record.d.ts","sourceRoot":"","sources":["../src/selection-record.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;;;;GAWG;AAEH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,EAAE;QACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,WAAW,EAAE,MAAM,GAAG,qBAAqB,CAAC;KAC7C,CAAC;IACF,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACnD,eAAe,EAAE;QACf,SAAS,EAAE,WAAW,GAAG,0BAA0B,CAAC;QACpD,UAAU,EAAE,gCAAgC,GAAG,sBAAsB,CAAC;QACtE,mBAAmB,EAAE,CAAC,CAAC;KACxB,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,IAAI,CAAC;QACf,cAAc,EAAE,MAAM,CAAC;QACvB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC5E,CAAC;IACF,UAAU,EAAE;QACV,aAAa,EAAE,aAAa,GAAG,oBAAoB,CAAC;QACpD,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,SAAS,EAAE,MAAM,CAAC;QAClB,uBAAuB,EAAE,MAAM,CAAC;QAChC,yBAAyB,EAAE,MAAM,CAAC;QAClC,aAAa,EAAE,aAAa,GAAG,oBAAoB,CAAC;QACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,2BAA2B,EAAE,OAAO,CAAC;QACrC,mBAAmB,EAAE,MAAM,CAAC;QAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;KAC5B,EAAE,CAAC;IACJ,cAAc,EAAE;QAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,aAAa,GAAG,UAAU,GAAG,mBAAmB,CAAC;IAClE,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"selection-record.d.ts","sourceRoot":"","sources":["../src/selection-record.ts"],"names":[],"mappings":"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"}
|
package/dist/selection-record.js
CHANGED
|
@@ -16,6 +16,25 @@ import { readImageGenerationAttemptFile } from './image-generation-staging.js';
|
|
|
16
16
|
* none.
|
|
17
17
|
*/
|
|
18
18
|
export const SELECTION_RECORD_VERSION = 6;
|
|
19
|
+
/**
|
|
20
|
+
* What the run itself recommends, derived rather than re-declared.
|
|
21
|
+
*
|
|
22
|
+
* `12ui draft` pairs candidate A with the corpus's top-ranked reference, B with
|
|
23
|
+
* the second, and so on (`draft-run.ts` sorts by ordinal before pairing), so the
|
|
24
|
+
* head of the ranking IS the run's recommendation and the run directory has held
|
|
25
|
+
* it all along. `--recommended` asked the caller to type back a fact the record
|
|
26
|
+
* beside it already stated, which is how the two drift apart.
|
|
27
|
+
*
|
|
28
|
+
* A candidate that never landed cannot be the recommendation, so the head is
|
|
29
|
+
* the highest-ranked candidate with an image on disk. A run where none landed
|
|
30
|
+
* indicates nothing, and says so.
|
|
31
|
+
*/
|
|
32
|
+
const recommendationFromRun = (candidates) => {
|
|
33
|
+
const landed = candidates.find((candidate) => candidate.sha256 !== null);
|
|
34
|
+
return landed
|
|
35
|
+
? { candidateId: landed.id, source: 'corpus-rank-1' }
|
|
36
|
+
: { candidateId: null, source: null };
|
|
37
|
+
};
|
|
19
38
|
export const buildSelectionRecord = async (args) => {
|
|
20
39
|
const now = args.now ?? (() => new Date());
|
|
21
40
|
const { draft } = args;
|
|
@@ -46,12 +65,10 @@ export const buildSelectionRecord = async (args) => {
|
|
|
46
65
|
// Only ever the recorded CLI value, never an assumed guarantee.
|
|
47
66
|
providerIdempotencyEnforced: attempt?.providerIdempotencyEnforced === true,
|
|
48
67
|
attemptEvidencePath,
|
|
49
|
-
rejectionReasons:
|
|
50
|
-
? []
|
|
51
|
-
: args.rejectionReasons?.[candidate.id] ?? [],
|
|
68
|
+
rejectionReasons: [],
|
|
52
69
|
};
|
|
53
70
|
}));
|
|
54
|
-
const recommendation =
|
|
71
|
+
const recommendation = recommendationFromRun(candidates);
|
|
55
72
|
const selectionSource = recommendation.candidateId === null
|
|
56
73
|
? 'no-recommendation'
|
|
57
74
|
: recommendation.candidateId === args.winner
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-record.js","sourceRoot":"","sources":["../src/selection-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAG/E;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"selection-record.js","sourceRoot":"","sources":["../src/selection-record.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAapD,MAAM,MAAM,gBAAgB,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE5D,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4F7E"}
|
package/dist/server.js
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import { readFile
|
|
5
|
-
import
|
|
6
|
-
import { materializeConversionArtifacts } from './artifact-materializer.js';
|
|
7
|
-
import { prepareOutputFile } from './cli-output-paths.js';
|
|
8
|
-
import { CONVERSION_MODELS, isConversionModel } from './conversion-models.js';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { CONVERSION_MODELS } from './conversion-models.js';
|
|
9
6
|
import { TwelveUiConversionClient } from './conversion-client.js';
|
|
10
|
-
import { CONVERSION_OUTPUTS, LAYERDOC_INPUT_OUTPUTS,
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
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';
|
|
7
|
+
import { CONVERSION_OUTPUTS, LAYERDOC_INPUT_OUTPUTS, } from './conversion-outputs.js';
|
|
8
|
+
import { runMcpConvert } from './mcp-convert.js';
|
|
9
|
+
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, } from './project-profiles.js';
|
|
14
10
|
export async function startMcpServer(options) {
|
|
15
11
|
const client = new TwelveUiConversionClient({
|
|
16
12
|
origin: options.config.origin,
|
|
@@ -85,75 +81,8 @@ export async function startMcpServer(options) {
|
|
|
85
81
|
try {
|
|
86
82
|
if (request.params.name !== 'design.convert')
|
|
87
83
|
throw new Error(`Unknown tool: ${request.params.name}`);
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
? input.imagePath
|
|
91
|
-
: null;
|
|
92
|
-
const layerdocPath = typeof input.layerdocPath === 'string' && input.layerdocPath.trim()
|
|
93
|
-
? input.layerdocPath
|
|
94
|
-
: null;
|
|
95
|
-
if ((imagePath === null) === (layerdocPath === null)) {
|
|
96
|
-
throw new Error('Provide exactly one imagePath or layerdocPath');
|
|
97
|
-
}
|
|
98
|
-
const inputPath = path.resolve(imagePath ?? layerdocPath);
|
|
99
|
-
if (!isConversionOutput(input.output)) {
|
|
100
|
-
throw new Error(`output must be one of ${CONVERSION_OUTPUTS.join(', ')}`);
|
|
101
|
-
}
|
|
102
|
-
const output = input.output;
|
|
103
|
-
if (input.model !== undefined && !isConversionModel(input.model)) {
|
|
104
|
-
throw new Error(`model must be one of ${CONVERSION_MODELS.join(', ')}`);
|
|
105
|
-
}
|
|
106
|
-
if (layerdocPath && input.model !== undefined) {
|
|
107
|
-
throw new Error('model is only valid with imagePath');
|
|
108
|
-
}
|
|
109
|
-
const profile = isProjectConversionOutput(output)
|
|
110
|
-
? parseConversionOutputProfile(output, input.profile)
|
|
111
|
-
: undefined;
|
|
112
|
-
if (!isProjectConversionOutput(output) && input.profile !== undefined) {
|
|
113
|
-
throw new Error('profile is only valid for web_project or app_project outputs');
|
|
114
|
-
}
|
|
115
|
-
const conversionInput = createInputForLocalFile({
|
|
116
|
-
bytes: new Uint8Array(await readFile(inputPath)),
|
|
117
|
-
filePath: inputPath,
|
|
118
|
-
output,
|
|
119
|
-
...(profile ? { profile } : {}),
|
|
120
|
-
});
|
|
121
|
-
if (layerdocPath && conversionInput.layerdoc === undefined) {
|
|
122
|
-
throw new Error('layerdocPath must refer to a JSON file');
|
|
123
|
-
}
|
|
124
|
-
if (imagePath && conversionInput.layerdoc !== undefined) {
|
|
125
|
-
throw new Error('Use layerdocPath for LayerDoc JSON input');
|
|
126
|
-
}
|
|
127
|
-
const idempotencyKey = normalizeOptionalIdempotencyKey(input.idempotencyKey);
|
|
128
|
-
const requestInput = conversionInput.layerdoc !== undefined
|
|
129
|
-
? conversionInput
|
|
130
|
-
: {
|
|
131
|
-
...conversionInput,
|
|
132
|
-
...(isConversionModel(input.model) ? { model: input.model } : {}),
|
|
133
|
-
};
|
|
134
|
-
// Made writable before the conversion is bought, exactly as the CLI does.
|
|
135
|
-
const outFile = await prepareOutputFile(typeof input.outFile === 'string' && input.outFile.trim()
|
|
136
|
-
? input.outFile
|
|
137
|
-
: defaultConversionOutputPath(inputPath, output));
|
|
138
|
-
const operation = await client.createConversion({
|
|
139
|
-
...requestInput,
|
|
140
|
-
...(idempotencyKey ? { idempotencyKey } : {}),
|
|
141
|
-
});
|
|
142
|
-
const completed = operation.status === 'succeeded'
|
|
143
|
-
? operation
|
|
144
|
-
: await client.waitForConversion(operation.id, {
|
|
145
|
-
timeoutMs: typeof input.timeoutMs === 'number' ? input.timeoutMs : undefined,
|
|
146
|
-
expiresAt: operation.expires_at,
|
|
147
|
-
});
|
|
148
|
-
const downloaded = await client.downloadResult(completed.id, output);
|
|
149
|
-
await writeFile(outFile, downloaded.bytes);
|
|
150
|
-
const artifactManifest = await materializeConversionArtifacts(client, completed, outFile);
|
|
151
|
-
return {
|
|
152
|
-
content: [{
|
|
153
|
-
type: 'text',
|
|
154
|
-
text: JSON.stringify({ id: completed.id, output, outFile, artifactManifest }, null, 2),
|
|
155
|
-
}],
|
|
156
|
-
};
|
|
84
|
+
const result = await runMcpConvert(client, (request.params.arguments ?? {}));
|
|
85
|
+
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
157
86
|
}
|
|
158
87
|
catch (error) {
|
|
159
88
|
return {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/design/SKILL.md
CHANGED
|
@@ -24,13 +24,15 @@ quicker.
|
|
|
24
24
|
|
|
25
25
|
## 1. Explore — four directions
|
|
26
26
|
|
|
27
|
+
Already holding the finished design? Build it, do not redraw it: see
|
|
28
|
+
`design-convert`. Only to redraw an existing interface:
|
|
29
|
+
`12ui draft --redesign-source <png> --mode exploratory|reskin`.
|
|
30
|
+
|
|
27
31
|
12ui draft --query "<product, audience, surface, goal, personality>"
|
|
28
32
|
|
|
29
33
|
Creates the run directory and prints its path — pass it to every later
|
|
30
34
|
command. Searches the corpus for four diverse references and generates one
|
|
31
35
|
one-viewport candidate steered by each, returning immediately.
|
|
32
|
-
`12ui draft status <run-dir>` reports progress (typically ~90s).
|
|
33
|
-
Redesigns: `--redesign-source <png> --mode exploratory|reskin`.
|
|
34
36
|
|
|
35
37
|
## 2. Select
|
|
36
38
|
|
|
@@ -45,8 +47,6 @@ For a single fold, view, or state:
|
|
|
45
47
|
|
|
46
48
|
12ui convert <run-dir>/candidates/B.png --export html
|
|
47
49
|
|
|
48
|
-
Runs ~5 minutes with streamed progress.
|
|
49
|
-
|
|
50
50
|
For a full page or a multi-page site or app — the winner is viewport 1 of
|
|
51
51
|
the first page; it needs no separate conversion:
|
|
52
52
|
|
|
@@ -55,12 +55,9 @@ the first page; it needs no separate conversion:
|
|
|
55
55
|
--scope page|site --convert html
|
|
56
56
|
|
|
57
57
|
The server plans the screens; the command dispatches, downloads, and
|
|
58
|
-
converts one package per page
|
|
59
|
-
`12ui branch status <run-dir>` reports progress (typically 5–15 min;
|
|
60
|
-
large runs can take up to ~30 min).
|
|
58
|
+
converts one package per page, into `<run-dir>/branch/pages/`.
|
|
61
59
|
Wait for it rather than building the same pages by hand in the meantime —
|
|
62
60
|
they are already being produced and paid for.
|
|
63
|
-
Per-page HTML lands in `<run-dir>/branch/pages/`.
|
|
64
61
|
|
|
65
62
|
## 4. Integrate
|
|
66
63
|
|