router-for-me/CLIProxyAPI · error
unsupported install type %q
Error message
unsupported install type %q
What it means
Client.InstallFromManifest dispatched on manifest.InstallType() and hit the default branch — the install.type string is neither 'direct' nor the GitHub-release type. This indicates a manifest with a missing, empty, or newer/unknown install type that this client build cannot handle.
Source
Thrown at internal/pluginstore/install.go:83
return c.installRelease(ctx, plugin, release, latestVersion, options)
}
func (c Client) InstallManifest(ctx context.Context, manifest Manifest, options InstallOptions) (InstallResult, error) {
if errValidate := manifest.Validate(); errValidate != nil {
return InstallResult{}, errValidate
}
options = normalizeInstallOptions(options)
switch manifest.InstallType() {
case InstallTypeDirect:
plugin, errPlugin := c.directPluginFromManifest(ctx, manifest)
if errPlugin != nil {
return InstallResult{}, errPlugin
}
return c.InstallDirect(ctx, plugin, plugin.Install, options)
case InstallTypeGitHubRelease:
return c.InstallVersion(ctx, manifest.Plugin(), manifest.ReleaseTag, manifest.Version, options)
default:
return InstallResult{}, fmt.Errorf("unsupported install type %q", manifest.Install.Type)
}
}
// InstallVersion installs a plugin artifact from a fixed release tag/version.
func (c Client) InstallVersion(ctx context.Context, plugin Plugin, releaseTag string, version string, options InstallOptions) (InstallResult, error) {
if errValidate := ValidatePlugin(plugin); errValidate != nil {
return InstallResult{}, errValidate
}
options = normalizeInstallOptions(options)
version = normalizeVersion(version)
if !validPluginVersion(version) {
return InstallResult{}, fmt.Errorf("invalid plugin version %q", version)
}
releaseTag = strings.TrimSpace(releaseTag)
if releaseTag == "" {
releaseTag = version
}
release, errRelease := c.FetchReleaseByTag(ctx, plugin, releaseTag)View on GitHub (pinned to 78f0c4079e)
Solutions
- Set install.type to a supported value ('direct' or the GitHub release type) in the manifest
- Upgrade the client to a version that knows the new install type
- If installing from a GitHub release is acceptable, convert the manifest to that type
Example fix
// before
{"install":{"type":"source"}}
// after
{"install":{"type":"github-release"}} Defensive patterns
Strategy: validation
Validate before calling
switch m.InstallType() {
case pluginstore.InstallTypeDirect, pluginstore.InstallTypeGitHubRelease:
default:
return fmt.Errorf("unsupported install type %q", m.Install.Type)
} Type guard
func supportedInstallType(m pluginstore.Manifest) bool {
switch m.InstallType() {
case pluginstore.InstallTypeDirect, pluginstore.InstallTypeGitHubRelease:
return true
}
return false
} Try / catch
if err != nil && strings.Contains(err.Error(), "unsupported install type") {
// check for client upgrade; otherwise normalize the manifest's install.type
} Prevention
- Validate install.type against known values before calling InstallFromManifest
- Upgrade clients before the index adopts new install types
- Manifest templates should default install.type explicitly
When it happens
Trigger: InstallFromManifest with a manifest whose install.type is empty, misspelled ('Direct', 'github'), or a type introduced after this client version.
Common situations: Manifest authored by hand without install.type; index schema evolved and added a new install type; client binary older than the index.
Related errors
- direct install plugin %q resolved as %q
- unsupported plugin sync schema_version %d
- plugin sync item %d: %w
- plugin sync response contains duplicate plugin %q
- direct plugin sync manifest requires pinned artifacts
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/f702c600e8557a6e.
Report an issue: GitHub.