{"record":{"id":"e92dce6eb7eadb4c","repo":"Budibase/budibase","slug":"no-skeleton-found-in-latest-release","errorCode":null,"errorMessage":"No skeleton found in latest release.","messagePattern":"No skeleton found in latest release\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/cli/src/plugins/skeleton.ts","lineNumber":25,"sourceCode":"const download = require(\"download\")\nconst tar = require(\"tar\")\n\nconst HBS_FILES = [\"package.json.hbs\", \"schema.json.hbs\", \"README.md.hbs\"]\n\nasync function getSkeletonUrl(type: string) {\n  const resp = await fetch(\n    \"https://api.github.com/repos/budibase/budibase-skeleton/releases/latest\"\n  )\n  if (resp.status >= 300) {\n    throw new Error(\"Failed to retrieve skeleton metadata\")\n  }\n  const json = (await resp.json()) as { assets: any[] }\n  for (let asset of json[\"assets\"]) {\n    if (asset.name && asset.name.includes(type)) {\n      return asset[\"browser_download_url\"]\n    }\n  }\n  throw new Error(\"No skeleton found in latest release.\")\n}\n\nexport async function getSkeleton(type: string, name: string) {\n  const url = await getSkeletonUrl(type)\n  const tarballFile = join(os.tmpdir(), \"skeleton.tar.gz\")\n\n  // download the full skeleton tarball\n  fs.writeFileSync(tarballFile, await download(url))\n  fs.mkdirSync(name)\n  // extract it and get what we need\n  await tar.extract({\n    file: tarballFile,\n    C: name,\n  })\n  // clear up\n  fs.rmSync(tarballFile)\n}\n","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/cli/src/plugins/skeleton.ts#L7-L43","documentation":"After successfully fetching the latest budibase-skeleton release metadata, getSkeletonUrl scans the release assets for one whose filename contains the requested plugin type. If no asset name matches, it concludes the latest release has no matching skeleton and throws.","triggerScenarios":"The plugin init/skeleton command requests a type string that no asset filename in the latest release contains — e.g. a new/unsupported plugin type or a renamed asset convention (type embedded in asset name like 'datasource-...' or 'component-...').","commonSituations":"Requesting a plugin type the skeleton repo no longer ships; skeleton repo released without assets; case/spelling mismatch between requested type and asset filename; using an outdated CLI that expects old asset names.","solutions":["Check the latest release assets at github.com/budibase/budibase-skeleton/releases and use an exactly matching type value","Update the Budibase CLI to the latest version so it requests current asset names","If the release genuinely has no assets, wait for/pin to a previous release or raise an issue on the skeleton repo"],"exampleFix":"// before (unsupported type)\nbudibase-plugins init widget my-plugin\n// Error: No skeleton found in the latest release.\n// after: use a type shipped by the latest release, e.g.\nbudibase-plugins init component my-plugin","handlingStrategy":"validation","validationCode":"const release = await fetch(\"https://api.github.com/repos/budibase/budibase-skeleton/releases/latest\").then(r => r.json())\nconst match = (release.assets ?? []).find((a: { name: string }) => a.name.includes(pluginType))\nif (!match) throw new Error(`No skeleton asset for type \"${pluginType}\"; available: ${(release.assets ?? []).map((a: any) => a.name).join(\", \")}`)","typeGuard":null,"tryCatchPattern":"try {\n  await getSkeleton(type, name)\n} catch (err) {\n  if ((err as Error).message === \"No skeleton found in the latest release.\") {\n    // fall back to a known-good type or surface available asset names\n  } else throw err\n}","preventionTips":["Use plugin type strings exactly as named in the latest skeleton release assets","Keep the CLI updated so requested types match current asset naming","If a release ships without assets, pin to a previous working release"],"tags":["github-api","cli","plugin","release-assets"],"backgroundTag":"release-asset-not-found","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}