{"record":{"id":"537cacd4d0375a8d","repo":"remotion-dev/remotion","slug":"the-remover-finished-but-skill-is-still-installed","errorCode":null,"errorMessage":"The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again.","messagePattern":"The remover finished, but (.+?) is still installed (.+?)\\. Please try again\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/studio-server/src/preview-server/routes/install-remotion-skill.ts","lineNumber":128,"sourceCode":"\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst info = getRemotionSkillsInfo({remotionRoot});\n\t\t\tconst updatedSkill = info.skills.find(({name}) => name === skill);\n\t\t\tif (action === 'install' && !updatedSkill?.installedInProject) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`The installer finished, but ${skill} was not found in the project. Please try again.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\taction === 'remove' &&\n\t\t\t\t(removingGlobally\n\t\t\t\t\t? updatedSkill?.installedGlobally\n\t\t\t\t\t: updatedSkill?.installedInProject)\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`The remover finished, but ${skill} is still installed ${removingGlobally ? 'globally' : 'in the project'}. Please try again.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tRenderInternals.Log.info(\n\t\t\t\t{indent: false, logLevel},\n\t\t\t\tRenderInternals.chalk.gray('╰─ '),\n\t\t\t\t`Done in ${Date.now() - time}ms`,\n\t\t\t);\n\t\t\treturn info;\n\t\t} catch (error) {\n\t\t\tRenderInternals.Log.info(\n\t\t\t\t{indent: false, logLevel},\n\t\t\t\tRenderInternals.chalk.gray('╰─ '),\n\t\t\t\tRenderInternals.chalk.red(`Errored in ${Date.now() - time}ms`),\n\t\t\t);\n\t\t\tthrow error;\n\t\t}","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/remotion-dev/remotion/blob/46a3a6bf13ca367376ff18bbb06dae2e87e0d068/packages/studio-server/src/preview-server/routes/install-remotion-skill.ts#L110-L146","documentation":"After running the package-manager remove command, changeRemotionSkill re-reads skills info to confirm the removal took effect. If the skill still reports as installed globally (when removingGlobally) or in the project (otherwise), the removal failed silently, so this error is thrown and the user is asked to retry.","triggerScenarios":"Calling removeRemotionSkillHandler where the remove command finishes but getRemotionSkillsInfo still shows installedGlobally (for global removal) or installedInProject (for project removal) as true.","commonSituations":"Package manager left the dependency in package.json or global install dir; peer/hoisted copies remain in node_modules; the remove command removed a different copy than the one detected; cached node_modules state.","solutions":["Retry the removal once","Manually remove the dependency (package.json entry or `npm rm -g` / equivalent) and rerun the package manager install to clean node_modules","Check for duplicate installs (local + global) and remove the one actually reported by skills info","Restart Studio and re-check skills info to rule out stale cache"],"exampleFix":"// before\nnpx remotion studio  // remove fails silently, skill persists\n// after\nnpm uninstall @remotion/captions   # or remove from package.json, then reinstall\nglobal case: npm rm -g @remotion/captions","handlingStrategy":"retry","validationCode":"const info = await getRemotionSkillsInfo();\nconst s = info.skills.find((x) => x.name === skill);\nif (!s?.installedInProject && !s?.installedGlobally) {\n  // already removed; skip\n}","typeGuard":null,"tryCatchPattern":"try {\n  await removeSkill(skill);\n} catch (e) {\n  if (e.message.includes('is still installed')) {\n    await removeSkill(skill); // retry, or clean up package.json manually\n  }\n}","preventionTips":["Check for duplicate local+global installs before removing","Confirm the removal in package.json / global dir afterwards","Restart Studio if skills info appears stale"],"tags":["package-manager","verification","studio"],"backgroundTag":"invalid-state-transition","analyzedSha":"46a3a6bf13ca367376ff18bbb06dae2e87e0d068","analyzedAt":"2026-09-18T00:12:20.256Z","contentChangedAt":"2026-09-18T00:12:20.256Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}