{"record":{"id":"f89b6530669d3862","repo":"pulumi/pulumi","slug":"no-folder-at-path-s","errorCode":null,"errorMessage":"no folder at path '%s'","messagePattern":"no folder at path '(.+?)'","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/resource/plugin/host.go","lineNumber":269,"sourceCode":"\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn append(projectPlugins, pluginsFromPackages...), nil\n}\n\nfunc resolvePluginPath(root string, path string) (string, error) {\n\t// The path is relative to the project root. Make it absolute here so we don't need to track that everywhere its used.\n\tvar err error\n\tif !filepath.IsAbs(path) {\n\t\tpath, err = filepath.Abs(filepath.Join(root, path))\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"getting absolute path for plugin path %s: %w\", path, err)\n\t\t}\n\t}\n\n\tstat, err := os.Stat(path)\n\tif os.IsNotExist(err) {\n\t\treturn \"\", fmt.Errorf(\"no folder at path '%s'\", path)\n\t} else if err != nil {\n\t\treturn \"\", fmt.Errorf(\"checking provider folder: %w\", err)\n\t} else if !stat.IsDir() {\n\t\treturn \"\", fmt.Errorf(\"provider folder '%s' is not a directory\", path)\n\t}\n\n\treturn path, nil\n}\n\nfunc parsePluginOpts(\n\troot string, providerOpts workspace.PluginOptions, k apitype.PluginKind,\n) (workspace.ProjectPlugin, error) {\n\thandleErr := func(msg string, a ...any) (workspace.ProjectPlugin, error) {\n\t\treturn workspace.ProjectPlugin{},\n\t\t\tfmt.Errorf(\"parsing plugin options for '%s': %w\", providerOpts.Name, fmt.Errorf(msg, a...))\n\t}\n\tif providerOpts.Name == \"\" {\n\t\treturn handleErr(\"name must not be empty\")","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/pulumi/pulumi/blob/793f7b2e160db4321fb7fb6b0607461e01cb251e/pkg/resource/plugin/host.go#L251-L287","documentation":"After resolving the plugin path to an absolute location, resolvePluginPath stats the directory; if os.Stat reports the path does not exist, this error is returned. It means the configured plugin path points to a nonexistent folder on disk — the provider plugin binary/directory was not found where Pulumi.yaml says it should be.","triggerScenarios":"Setting plugins.<kind>.<name>.path in Pulumi.yaml (or passing --plugin-path) to a folder that does not exist, then starting a program that needs that provider.","commonSituations":"Typo in the path; building the plugin into a different output directory; CI checkout that doesn't include the locally built provider; deleting a vendor directory; moving the repo without updating the path.","solutions":["Verify the path exists: ls the exact absolute path shown in the error","Fix the path in Pulumi.yaml or rebuild/install the plugin into that directory","Run the plugin build step (make provider / make build_provider) before pulumi up","Commit or persist built plugin artifacts in CI, or install via pulumi plugin install instead of a local path"],"exampleFix":"// before (Pulumi.yaml)\nplugins:\n  providers:\n    - name: myprov\n      path: ./build/myprov   # folder not built yet\n// after\nplugins:\n  providers:\n    - name: myprov\n      path: ./bin/myprov     # directory that exists after make provider","handlingStrategy":"validation","validationCode":"if st, err := os.Stat(pluginDir); os.IsNotExist(err) {\n    return fmt.Errorf(\"plugin directory %s does not exist; build it first\", pluginDir)\n} else if err == nil && !st.IsDir() {\n    return fmt.Errorf(\"%s is not a directory\", pluginDir)\n}","typeGuard":"func pluginDirExists(p string) bool {\n    st, err := os.Stat(p)\n    return err == nil && st.IsDir()\n}","tryCatchPattern":null,"preventionTips":["Build the provider before pulumi up (make provider)","Check the exact path in Pulumi.yaml against the filesystem","In CI, persist or rebuild plugin artifacts each run","Prefer `pulumi plugin install` over local paths when possible"],"tags":["filesystem","plugins","configuration"],"backgroundTag":"plugin-path-not-found","analyzedSha":"793f7b2e160db4321fb7fb6b0607461e01cb251e","analyzedAt":"2026-08-31T09:36:43.099Z","schemaVersion":2},"datasetVersion":"2026-09-01T08:17:40.651Z"}