{"record":{"id":"5f439f5f43d46c50","repo":"windmill-labs/windmill","slug":"could-not-extract-flow-name-from-path-p","errorCode":null,"errorMessage":"Could not extract flow name from path: ${p}","messagePattern":"Could not extract flow name from path: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/src/types.ts","lineNumber":245,"sourceCode":"    const appName = extractResourceName(p, \"app\");\n    if (!appName) {\n      throw new Error(`Could not extract app name from path: ${p}`);\n    }\n    await pushApp(workspace, appName, buildFolderPath(appName, \"app\"), message, permissionedAsContext);\n  } else if (typeEnding === \"raw_app\") {\n    const rawAppName = extractResourceName(p, \"raw_app\");\n    if (!rawAppName) {\n      throw new Error(`Could not extract raw app name from path: ${p}`);\n    }\n    await pushRawApp(workspace, rawAppName, buildFolderPath(rawAppName, \"raw_app\"), message, defaultTs);\n  } else if (typeEnding === \"folder\") {\n    await pushFolder(workspace, p, befObj, newObj);\n  } else if (typeEnding === \"variable\") {\n    await pushVariable(workspace, p, befObj, newObj, plainSecrets, wsSpecific);\n  } else if (typeEnding === \"flow\") {\n    const flowName = extractResourceName(p, \"flow\");\n    if (!flowName) {\n      throw new Error(`Could not extract flow name from path: ${p}`);\n    }\n    await pushFlow(workspace, flowName, buildFolderPath(flowName, \"flow\"), message, permissionedAsContext);\n  } else if (typeEnding === \"resource\") {\n    if (!alreadySynced.includes(p)) {\n      alreadySynced.push(p);\n      await pushResource(workspace, p, befObj, newObj, originalLocalPath || p, wsSpecific, true);\n    }\n  } else if (typeEnding === \"resource-type\") {\n    await pushResourceType(workspace, p, befObj, newObj);\n  } else if (typeEnding === \"schedule\") {\n    await pushSchedule(workspace, p, befObj, newObj, permissionedAsContext, enabledOwnedByParent);\n  } else if (typeEnding === \"http_trigger\") {\n    await pushTrigger(\"http\", workspace, p, befObj, newObj, permissionedAsContext);\n  } else if (typeEnding === \"websocket_trigger\") {\n    await pushTrigger(\"websocket\", workspace, p, befObj, newObj, permissionedAsContext);\n  } else if (typeEnding === \"kafka_trigger\") {\n    await pushTrigger(\"kafka\", workspace, p, befObj, newObj, permissionedAsContext);\n  } else if (typeEnding === \"nats_trigger\") {","sourceCodeStart":227,"sourceCodeEnd":263,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/types.ts#L227-L263","documentation":"Thrown by pushObj when the sync path is recognized as an app (typeEnding app) but extractResourceName cannot recover the app's name from the file path. Generic guard against malformed paths: the input at fault is the local path `p`, which ends in .app but lacks a parseable name segment, so pushApp cannot determine the remote app to update.","triggerScenarios":"Thrown at cli/src/types.ts:245 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Name the file <flowname>.flow.yaml (or use the <flowname>/flow folder layout).","Check the path suffix for typos."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}