From cfc55d3255bb7ba376e6def69e985f121d5b46af Mon Sep 17 00:00:00 2001 From: weiqiuhan Date: Wed, 11 Feb 2026 14:05:47 +0800 Subject: [PATCH 1/5] fix: enhance deleteWorkspace to preserve specified files during deletion --- src/graph.ts | 4 ++-- src/utils/workspace.ts | 44 ++++++++++++++++++++++++++--------- tests/utils/workspace.test.ts | 43 ++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 13 deletions(-) diff --git a/src/graph.ts b/src/graph.ts index 771b9f7..30c64d1 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -23,8 +23,8 @@ export async function design2code(url: string, mode?: ValidationMode): Promise path.normalize(p))); + + // Collect ancestor directories of preserved files + const preserveDirs = new Set(); + for (const p of preserveFiles) { + let dir = path.dirname(p); + while (dir !== '.') { + preserveDirs.add(dir); + dir = path.dirname(dir); + } + } + + const deleteRecursive = (dirPath: string, relativeTo: string = '') => { + const entries = fs.readdirSync(dirPath); for (const entry of entries) { - if (exclude.includes(entry)) { - continue; + const fullPath = path.join(dirPath, entry); + const relPath = relativeTo ? path.join(relativeTo, entry) : entry; + + if (preserveFiles.has(relPath)) { + continue; // This file is preserved + } + + if (preserveDirs.has(relPath)) { + // Directory contains preserved files, recurse into it + deleteRecursive(fullPath, relPath); + } else { + fs.rmSync(fullPath, { recursive: true, force: true }); } - const fullPath = path.join(workspace.root, entry); - fs.rmSync(fullPath, { recursive: true, force: true }); } - } + }; + + deleteRecursive(workspace.root); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); logger.printWarnLog(`Failed to delete workspace: ${errorMessage}`); diff --git a/tests/utils/workspace.test.ts b/tests/utils/workspace.test.ts index dd2d4ad..0a469c7 100644 --- a/tests/utils/workspace.test.ts +++ b/tests/utils/workspace.test.ts @@ -77,4 +77,47 @@ describe('workspaceManager', () => { expect(fs.existsSync(root)).toBe(true); expect(fs.readdirSync(root)).toHaveLength(0); }); + + it('deleteWorkspace should preserve specified files while deleting others', () => { + const root = path.join(tempRoot, 'workspace-preserve'); + fs.mkdirSync(root, { recursive: true }); + fs.writeFileSync(path.join(root, 'a.txt'), 'a'); + fs.writeFileSync(path.join(root, 'delete-me.txt'), 'delete'); + fs.mkdirSync(path.join(root, 'checkpoint'), { recursive: true }); + fs.writeFileSync(path.join(root, 'checkpoint', 'coderio-cli.db'), 'db'); + fs.writeFileSync(path.join(root, 'checkpoint', 'checkpoint.json'), 'json'); + fs.mkdirSync(path.join(root, 'process'), { recursive: true }); + fs.writeFileSync(path.join(root, 'process', 'data.txt'), 'data'); + + const ws: WorkspaceStructure = { + root, + app: '', + process: '', + debug: '', + reports: '', + db: '', + checkpoint: '', + }; + + // Preserve only the database file + workspaceManager.deleteWorkspace(ws, ['checkpoint/coderio-cli.db']); + + // Root should still exist + expect(fs.existsSync(root)).toBe(true); + + // checkpoint directory should still exist (contains preserved file) + expect(fs.existsSync(path.join(root, 'checkpoint'))).toBe(true); + + // Database file should be preserved + expect(fs.existsSync(path.join(root, 'checkpoint', 'coderio-cli.db'))).toBe(true); + expect(fs.readFileSync(path.join(root, 'checkpoint', 'coderio-cli.db'), 'utf8')).toBe('db'); + + // checkpoint.json should be deleted + expect(fs.existsSync(path.join(root, 'checkpoint', 'checkpoint.json'))).toBe(false); + + // Other files and directories should be deleted + expect(fs.existsSync(path.join(root, 'a.txt'))).toBe(false); + expect(fs.existsSync(path.join(root, 'delete-me.txt'))).toBe(false); + expect(fs.existsSync(path.join(root, 'process'))).toBe(false); + }); }); From 08ba709be8c2f983f847ef7aebf721db8427db4e Mon Sep 17 00:00:00 2001 From: weiqiuhan Date: Wed, 11 Feb 2026 14:52:21 +0800 Subject: [PATCH 2/5] chore: update evoltagent dependency to version 1.1.4 in package.json and pnpm-lock.yaml --- package.json | 2 +- pnpm-lock.yaml | 39 +++++---------------------------------- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 41caaba..7ef96a4 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "better-sqlite3": "^11.10.0", "chalk": "^5.4.1", "commander": "^12.1.0", - "evoltagent": "^1.1.2", + "evoltagent": "1.1.4", "js-yaml": "^4.1.1", "pixelmatch": "^7.1.0", "prompts": "^2.4.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94a5042..4899b59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: ^12.1.0 version: 12.1.0 evoltagent: - specifier: ^1.1.2 - version: 1.1.2(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6) + specifier: 1.1.4 + version: 1.1.4(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6) js-yaml: specifier: ^4.1.1 version: 4.1.1 @@ -534,105 +534,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -774,79 +758,66 @@ packages: resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.57.1': resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.57.1': resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.57.1': resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.57.1': resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.57.1': resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.57.1': resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.57.1': resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.57.1': resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.57.1': resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.57.1': resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.57.1': resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.57.1': resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.57.1': resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} @@ -1428,8 +1399,8 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - evoltagent@1.1.2: - resolution: {integrity: sha512-4yYTAz/oNbPDe+L8iOX1CUUZUMNICcldfktlfn64CVW1C8k/4w0vh+TRgz7cWY3hBmNTEl723ipntcFJv1vBDA==} + evoltagent@1.1.4: + resolution: {integrity: sha512-K8EdW/N0gB3w/mgTUTbkftMGgBYG3TmTgjdi2skNhpnAvWGeRrjCHmNEJXqGKNjeA27muD9zmh9X+TFWckpEiA==} expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} @@ -3738,7 +3709,7 @@ snapshots: dependencies: eventsource-parser: 3.0.6 - evoltagent@1.1.2(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6): + evoltagent@1.1.4(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6): dependencies: '@anthropic-ai/sdk': 0.71.2(zod@4.3.6) '@google/generative-ai': 0.24.1 From cbc8b8950b3cb15f5ffedc5e16e9df75297a3c5e Mon Sep 17 00:00:00 2001 From: weiqiuhan Date: Wed, 11 Feb 2026 14:53:13 +0800 Subject: [PATCH 3/5] fix: enhance prompt for better component generataion --- src/nodes/code/prompt.ts | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/nodes/code/prompt.ts b/src/nodes/code/prompt.ts index 4a24878..1773942 100644 --- a/src/nodes/code/prompt.ts +++ b/src/nodes/code/prompt.ts @@ -47,21 +47,45 @@ const FILE_NAMING_CONVENTION = ` const OUTPUT_FORMAT = ` - If only one file (TSX) is needed: + **CRITICAL - Output Format Requirements:** + + **CASE 1: Single File (TSX only)** + - Return code wrapped in triple backticks with language identifier + - NO file name header needed + - Example: \`\`\`tsx - // code... + export default function Component() { + return
...
; + } \`\`\` - If multiple files are needed (e.g., TSX + Styles): + **CASE 2: Multiple Files (TSX + Styles)** + - **REQUIRED**: Each file MUST start with EXACTLY \`## \` (two hash symbols + one space) followed by filename + - **REQUIRED**: Filename must be complete with extension (e.g., \`index.tsx\`, \`index.module.css\`) + - **FORBIDDEN**: Do NOT use single \`#\`, do NOT omit filename, do NOT use other markers + - Follow this exact structure: + ## index.tsx \`\`\`tsx - // code... + export default function Component() { + return
...
; + } \`\`\` ## index.module.[css|less|scss] \`\`\`[css|less|scss] - // styles... + .container { + /* styles */ + } \`\`\` + + **VALIDATION CHECKLIST (for multiple files):** + ✓ Each file section starts with \`## \` (two hashes + space) + ✓ Filename includes full extension + ✓ Code wrapped in triple backticks with language + ✗ DO NOT use \`# filename\` (single hash) + ✗ DO NOT omit file headers + ✗ DO NOT use other separators
`; // ============================================ From f08823767a601dc620cefdbda94364f9c65266eb Mon Sep 17 00:00:00 2001 From: weiqiuhan Date: Wed, 11 Feb 2026 15:26:46 +0800 Subject: [PATCH 4/5] chore: update evolt to 1.1.5 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7ef96a4..bcb3fa3 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "better-sqlite3": "^11.10.0", "chalk": "^5.4.1", "commander": "^12.1.0", - "evoltagent": "1.1.4", + "evoltagent": "1.1.5", "js-yaml": "^4.1.1", "pixelmatch": "^7.1.0", "prompts": "^2.4.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4899b59..10b2283 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: ^12.1.0 version: 12.1.0 evoltagent: - specifier: 1.1.4 - version: 1.1.4(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6) + specifier: 1.1.5 + version: 1.1.5(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6) js-yaml: specifier: ^4.1.1 version: 4.1.1 @@ -1399,8 +1399,8 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - evoltagent@1.1.4: - resolution: {integrity: sha512-K8EdW/N0gB3w/mgTUTbkftMGgBYG3TmTgjdi2skNhpnAvWGeRrjCHmNEJXqGKNjeA27muD9zmh9X+TFWckpEiA==} + evoltagent@1.1.5: + resolution: {integrity: sha512-I+QsF5CU0LE9BmdnEBPLm/faPwGzzH1x4Q0hlYbu/Ook1qMvmOkKGnXV5GQ3hLpjdrITE9bZR/dY4EHEywNsEg==} expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} @@ -3709,7 +3709,7 @@ snapshots: dependencies: eventsource-parser: 3.0.6 - evoltagent@1.1.4(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6): + evoltagent@1.1.5(@cfworker/json-schema@4.1.1)(hono@4.11.7)(zod@4.3.6): dependencies: '@anthropic-ai/sdk': 0.71.2(zod@4.3.6) '@google/generative-ai': 0.24.1 From 0c06dd6fcb2993502c2fff507ff16c87ba934922 Mon Sep 17 00:00:00 2001 From: weiqiuhan Date: Thu, 12 Feb 2026 11:08:30 +0800 Subject: [PATCH 5/5] chore: update version --- package.json | 2 +- src/graph.ts | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bcb3fa3..03d26ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coderio", - "version": "1.0.2", + "version": "1.0.3", "description": "A modern CLI development tool built with TypeScript", "type": "module", "bin": { diff --git a/src/graph.ts b/src/graph.ts index 30c64d1..4ad8ac7 100644 --- a/src/graph.ts +++ b/src/graph.ts @@ -24,7 +24,11 @@ export async function design2code(url: string, mode?: ValidationMode): Promise