anomalyco / anomalyco/opencode
plugin: configured local plugin file paths silently dropped since #46105
@jlongster is already working on this.
Since Sep 1, 2026.
- Dominant language
- TypeScript
- Stars
- 209k
- Forks
- 27.5k
- PR merge metrics
- PR metrics pending
Description
Summary
Since #46105 (2026-08-30), configured plugin entries that resolve to an absolute file path are silently dropped with only a level=WARN log line ("configured plugin path must be a directory"), while the plugins docs still document file paths as valid config entries. Upgrading silently disables local plugins.
Environment
- opencode version: v2 branch (source build at
71779ae5de, channellocal) - OS: Darwin 25.6.0 (darwin arm64)
- Terminal: Unavailable (headless server context)
- Shell: /bin/zsh
- Install/channel: source build (channel local), v2 line
- Active plugins: two local plugins configured by absolute path (see Reproduction)
Reproduction
- Configure a local plugin by absolute file path:
where{ "plugins": [ "/Users/me/opencode-plugin/plugin.js" ] }plugin.jshas a default export (export default { id, setup }). This worked before 2026-08-30. - Start
opencode serve(or any server that loads plugins). - The plugin is not loaded. The server log contains:
No error is surfaced to the user; the plugin simply disappears (its models, tools, and skills are gone).level=WARN message="configured plugin path must be a directory" target=/Users/me/opencode-plugin/plugin.js
Expected Behavior
Either:
- Configured file paths keep working (resolve the file directly as the plugin entrypoint, as before #46105), or
- The docs are updated to remove file-path examples, and the drop is surfaced loudly (config error / visible warning) instead of a
WARNlog line — silently losing plugins on upgrade is the worst outcome.
Actual Behavior
packages/core/src/config/plugin/source.ts (since 6a2c3e91c7, #46105) drops any configured target that fs.isFile with the warning "configured plugin path must be a directory" and returns Option.none, so the plugin is never loaded. This also affects relative file paths (../shared/plugin.ts) and file:// entries pointing at files, which resolve to absolute paths before the check.
Additional Context
- The docs still show file paths as valid:
packages/www/src/docs/content/plugins.mdxexamples include"../shared/plugin.ts","/absolute/path/plugin.ts", and"file:///home/me/plugins/local".config.mdxsays "Load plugins from packages or local plugin directories" and only shows directory examples. - Directory targets only work when the directory contains an
index.ts/index.js(PluginSourceDirectory.entrypoint); a directory without one is also dropped ("configured plugin directory has no index entrypoint"). - Workaround: point the config at the plugin directory and add an
index.jsre-exporting the plugin file. Package (npm/Git) plugin entries are unaffected because they resolve throughpackage.jsonexports/main. - This bit in production on a self-hosted instance: both configured plugins (a subscription auth plugin and a pipeline plugin) silently vanished after rebasing onto the v2 branch that includes #46105; models provided by the subscription plugin disappeared from the catalog.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.