|
9 | 9 | createToolResponse, |
10 | 10 | type ErrorCode |
11 | 11 | } from "@/tools/utils/response"; |
12 | | -import { access, mkdir } from "node:fs/promises"; |
| 12 | +import { access, mkdir, stat } from "node:fs/promises"; |
13 | 13 | import { dirname } from "node:path"; |
14 | 14 | import { z } from "zod"; |
15 | 15 | import { isPathAllowed } from "./utils/sandbox"; |
@@ -139,8 +139,24 @@ async function handleCreateWidget( |
139 | 139 | const widgetFolder = options.name.charAt(0).toLowerCase() + options.name.slice(1); |
140 | 140 | const widgetPath = `${outputDir}/${widgetFolder}`; |
141 | 141 |
|
142 | | - // Run generator inside outputDir — it creates the widget subfolder |
143 | | - await runWidgetGenerator(options, tracker, outputDir); |
| 142 | + // If the widget directory already exists, skip the Yeoman scaffold — the generator |
| 143 | + // refuses to run in non-empty directories. The existing scaffold is still valid; |
| 144 | + // generate-widget-code will overwrite the source files anyway. |
| 145 | + let alreadyExists = false; |
| 146 | + try { |
| 147 | + await stat(widgetPath); |
| 148 | + alreadyExists = true; |
| 149 | + } catch { |
| 150 | + /* directory doesn't exist yet — proceed with scaffold */ |
| 151 | + } |
| 152 | + |
| 153 | + if (alreadyExists) { |
| 154 | + console.error(`[create-widget] Widget directory already exists at ${widgetPath} — skipping scaffold`); |
| 155 | + await tracker.progress(SCAFFOLD_PROGRESS.COMPLETE, "Widget directory already exists — skipping scaffold."); |
| 156 | + } else { |
| 157 | + // Run generator inside outputDir — it creates the widget subfolder |
| 158 | + await runWidgetGenerator(options, tracker, outputDir); |
| 159 | + } |
144 | 160 |
|
145 | 161 | console.error(`[create-widget] Widget created successfully at ${widgetPath}`); |
146 | 162 | await tracker.progress(SCAFFOLD_PROGRESS.COMPLETE, "Widget created successfully!"); |
|
0 commit comments