diff --git a/src/tools/new.ts b/src/tools/new.ts index 6c11f9f..f45451e 100644 --- a/src/tools/new.ts +++ b/src/tools/new.ts @@ -43,11 +43,15 @@ export default defineTool({ const isPublic = isPublicArg !== false const moduleName = name.replace(/-/g, "_") + const modulePath = join(dir, `${moduleName}.py`) if (existsSync(dir)) { if (!existsSync(ep.mainPath)) { return error(`Error: path already exists at ${dir}, but it is not a valid endpoint (__main__.py is missing)`) } + if (!existsSync(modulePath)) { + return error(`Error: path already exists at ${dir}, but it is not a valid endpoint (module file ${moduleName}.py is missing)`) + } const existingMain = readFileSync(ep.mainPath, "utf-8") const existingPublic = existingMain.match(/^#--web\s+(true|false)\s*$/m)?.[1] @@ -92,7 +96,7 @@ def main(args): ` writeFileSync(join(dir, "__main__.py"), mainPy) - writeFileSync(join(dir, `${moduleName}.py`), modulePy) + writeFileSync(modulePath, modulePy) return text(`Created endpoint at /api/my/${pkg}/${name}\nFiles:\n ${dir}/__main__.py\n ${dir}/${moduleName}.py`) }, diff --git a/tests/secrets.test.ts b/tests/secrets.test.ts index 92390eb..6014f75 100644 --- a/tests/secrets.test.ts +++ b/tests/secrets.test.ts @@ -304,6 +304,12 @@ test("action_new reports incompatible existing paths as MCP errors", () => { assert.equal(incomplete.isError, true) assert.match(resultText(incomplete), /not a valid endpoint/) + actionNew.handler({ endpoint: "v1/missing-module", public: true }) + rmSync("packages/v1/missing-module/missing_module.py") + const missingModule = actionNew.handler({ endpoint: "v1/missing-module", public: true }) + assert.equal(missingModule.isError, true) + assert.match(resultText(missingModule), /module file missing_module\.py is missing/) + actionNew.handler({ endpoint: "v1/private-action", public: false }) const visibilityConflict = actionNew.handler({ endpoint: "v1/private-action", public: true }) assert.equal(visibilityConflict.isError, true)