octobercms/october · error · ApplicationException

Plugin [$name] not found

Error message

Plugin [$name] not found

What it means

UpdateManager::uninstallPlugin($name) first checks pluginManager->hasPlugin($name) and throws 'Plugin [$name] not found' when false — you cannot uninstall something the plugin manager does not see as installed. hasPlugin resolves by the Author.Plugin code against registered (filesystem) plugins, so a wrong code/casing or an already-deleted plugin directory both fail here. Note this check runs before any composer rollback/removal and before deletePlugin().

Source

Thrown at modules/system/classes/updatemanager/ManagesPlugins.php:56

        }
        // Remote
        else {
            $details = $this->requestPluginDetails($code);
            $composerCode = $details['composer_code'] ?? '';
            $composerVersion = $details['composer_version'] ?? '';
        }

        return [$composerCode, $composerVersion];
    }

    /**
     * uninstallPlugin attempts to remove the plugin using composer before
     * deleting from the filesystem
     */
    public function uninstallPlugin($name)
    {
        if (!$this->pluginManager->hasPlugin($name)) {
            throw new ApplicationException("Plugin [$name] not found");
        }

        // Remove via composer
        $composer = ComposerManager::instance();
        $composerCode = $this->pluginManager->getComposerCode($name);

        if ($composerCode && $composer->hasPackage($composerCode)) {
            $this->rollbackPlugin($name);
            $composer->remove([$composerCode]);
        }

        $this->pluginManager->deletePlugin($name);
    }

    /**
     * requestPluginDetails looks up a plugin from the update server
     */
    public function requestPluginDetails(string $name): array

View on GitHub (pinned to b608633a7e)

Solutions

  1. Confirm the exact code with `php artisan plugin:list` (or by listing plugins/*/*) and retry with matching casing
  2. If the directory is already gone, there is nothing to uninstall — clean up leftovers (permissions/DB records) instead of re-running remove
  3. Restore the plugin files (git checkout / reinstall) first if you need a clean uninstall that rolls back versions
  4. Use `php artisan plugin:refresh Author.Plugin` if the goal is re-installing its database structures

Example fix

// before — code doesn't match the registered plugin
cd && php artisan plugin:remove acme.blog
// after — exact Author.Plugin casing as registered
php artisan plugin:remove Acme.Blog
Defensive patterns

Strategy: validation

Validate before calling

// Check registration state before attempting removal
$code = 'Acme.Blog';
if (!\System\Classes\PluginManager::instance()->hasPlugin($code)) {
    // not installed — check the filesystem to see if files were already deleted
    if (!is_dir(plugins_path('acme/blog'))) {
        // nothing to remove; clean up any leftover DB rows instead
    }
    return;
}
\System\Classes\UpdateManager::instance()->uninstallPlugin($code);

Try / catch

try {
    \System\Classes\UpdateManager::instance()->uninstallPlugin($name);
} catch (\October\Rain\Exception\ApplicationException $ex) {
    if (str_contains($ex->getMessage(), 'not found')) {
        $this->error("Plugin {$name} is not installed — nothing to remove.");
        return 1;
    }
    throw $ex;
}

Prevention

When it happens

Trigger: `php artisan plugin:remove Author.Plugin` where the plugins/author/plugin directory is absent (already manually deleted), the code or casing doesn't match, or the plugin namespace is unregistered due to boot failure.

Common situations: Plugin files deleted via FTP/git but DB/artisan still asked to remove it; author directory casing differs from the code (acme.Blog vs Acme.Blog); a plugin disabled/removed by another admin moments earlier.

Related errors


AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21). Data as JSON: /api/errors/d97c16d40bfc56ff. Report an issue: GitHub.