{"record":{"id":"140865bbb64a9bfe","repo":"hasura/graphql-engine","slug":"no-files-in-the-plugin-archive-matched-the-glob-pa","errorCode":null,"errorMessage":"no files in the plugin archive matched the glob pattern=%s","messagePattern":"no files in the plugin archive matched the glob pattern=(.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/plugins/move.go","lineNumber":72,"sourceCode":"\tnewDir, err := filepath.Abs(filepath.Join(filepath.FromSlash(toDir), filepath.FromSlash(fo.To)))\n\tif err != nil {\n\t\treturn nil, errors.E(\n\t\t\top,\n\t\t\tfmt.Errorf(\"could not get the relative path for the move dst: %w\", err),\n\t\t)\n\t}\n\n\tgl, err := filepath.Glob(\n\t\tfilepath.Join(filepath.FromSlash(fromDir), filepath.FromSlash(fo.From)),\n\t)\n\tif err != nil {\n\t\treturn nil, errors.E(op, fmt.Errorf(\"could not get files using a glob string: %w\", err))\n\t}\n\n\tif len(gl) == 0 {\n\t\treturn nil, errors.E(\n\t\t\top,\n\t\t\tfmt.Errorf(\"no files in the plugin archive matched the glob pattern=%s\", fo.From),\n\t\t)\n\t}\n\n\tmoves := make([]move, 0, len(gl))\n\tfor _, v := range gl {\n\t\tnewPath := filepath.Join(newDir, filepath.Base(filepath.FromSlash(v)))\n\t\t// Check secure path\n\t\tm := move{from: v, to: newPath}\n\t\tif !isMoveAllowed(fromDir, toDir, m) {\n\t\t\treturn nil, errors.E(\n\t\t\t\top,\n\t\t\t\tfmt.Errorf(\n\t\t\t\t\t\"can't move, move target %v is not a subpath from=%q, to=%q\",\n\t\t\t\t\tm,\n\t\t\t\t\tfromDir,\n\t\t\t\t\ttoDir,\n\t\t\t\t),\n\t\t\t)","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/cli/plugins/move.go#L54-L90","documentation":"findMoveTargets ran the glob built from the plugin's From pattern against the extracted archive directory and got zero matches, so there is nothing to move into the install layout. The plugin binary/artifact the manifest expects is not where the manifest says it is.","triggerScenarios":"Installing a plugin whose manifest From glob (e.g. 'bin/*') matches no file in the downloaded/extracted archive — wrong path casing, archive layout changed upstream, or glob missing a directory level.","commonSituations":"Plugin release changed its archive layout (added a top-level folder) without updating the manifest; From uses 'dist/plugin' but archive contains 'plugin'; OS/arch-specific artifact missing from the release for your platform.","solutions":["Download and extract the plugin archive manually and compare its layout with the From pattern in the plugin manifest","Fix the From pattern in the manifest/index to match the real archive layout (include the top-level directory if present)","Check that a build for your OS/architecture exists in the release; if not, pick another platform or build from source","Update the plugin index (hasura plugins update-index) in case the layout fix was published"],"exampleFix":"// before\nFrom: \"plugin\" // archive actually contains build/plugin\n// after\nFrom: \"build/plugin\"","handlingStrategy":"validation","validationCode":"matches, _ := filepath.Glob(filepath.Join(srcDir, filepath.FromSlash(fo.From)))\nif len(matches) == 0 {\n    return fmt.Errorf(\"archive layout does not match From=%s; inspect the extracted archive\", fo.From)\n}","typeGuard":null,"tryCatchPattern":"if err := moveToInstallDir(...); err != nil && strings.Contains(err.Error(), \"no files in the plugin archive matched\") {\n    // extract archive, compare layout, update manifest or index\n}","preventionTips":["Write tests that extract the real release archive and assert the glob matches","Bump plugin index version whenever archive layout changes","Confirm platform artifacts exist for all supported OS/arch pairs"],"tags":["go","filesystem","plugin-install","manifest-mismatch"],"backgroundTag":"glob-no-matches","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}