Skip to content

Plugin fails to load on opencode ≥1.15: import pkg from "../package.json" needs with { type: "json" } (regression in 2.14.0) #112

@leiverkus

Description

@leiverkus

Summary

Since v2.14.0, dist/plugin.js line 1 imports package.json without an ESM import attribute:

import pkg from "../package.json";

Bun's strict-ESM mode (used by opencode's embedded Bun runtime in recent versions, e.g. opencode 1.15.x) — and Node.js ≥22 — both require an import attribute for JSON modules. Without it the module fails to load and opencode logs:

ERROR service=plugin path=opencode-mem
  target=file:///…/opencode-mem@latest/node_modules/opencode-mem/dist/plugin.js
  error=Module "file:///…/opencode-mem/package.json" needs an import attribute of "type: json"
  failed to load plugin

The plugin never initializes. No memory tool, no web server, no auto-capture.

Affected versions

Verified by extracting each dist/plugin.js from npm:

Version First line of dist/plugin.js Loads?
2.13.0 const { OpenCodeMemPlugin } = await import("./index.js");
2.14.0 import pkg from "../package.json";
2.14.1 import pkg from "../package.json";
2.14.2 (latest) import pkg from "../package.json";

The regression was introduced when export const id was added (probably as part of opencode plugin metadata work in 2.14.0).

Environment

  • macOS 26.3 (Apple Silicon, arm64)
  • opencode 1.15.3 (Homebrew, anomalyco/opencode)
  • opencode-mem 2.14.2 installed via opencode's plugin cache at ~/.cache/opencode/packages/opencode-mem@latest/
  • Reproduction is platform-independent — same error on Linux and Windows with a strict-ESM runtime

Reproduction

  1. Configure opencode with "plugin": ["opencode-mem"] (no version pin, picks up @latest).
  2. Wipe the cache: rm -rf ~/.cache/opencode/packages/opencode-mem@latest.
  3. Start opencode (TUI or GUI). Cache repopulates with v2.14.2.
  4. Observe the error in ~/.local/share/opencode/log/<latest>.log.

Fix

One-line change in the TypeScript source (presumably src/plugin.ts):

- import pkg from "../package.json";
+ import pkg from "../package.json" with { type: "json" };

This is the standard ESM JSON import attribute syntax (TC39 proposal, shipped in Node 22 and Bun ≥1.2). Older runtimes that don't yet support with are not relevant here because opencode itself targets recent Bun.

Alternative if broader compatibility matters: read the file at runtime instead:

import { readFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
const pkg = JSON.parse(
  readFileSync(new URL("../package.json", import.meta.url), "utf8")
);

This avoids the import-attribute question entirely and works in all ESM runtimes.

Why this isn't already in the tracker

I suspect most users hit it after the recent opencode update to 1.15 (which bundles a newer Bun with stricter ESM enforcement), and either rolled back to 2.13.0 or disabled the plugin without filing. Stuck on this with a fresh cache today.

Workaround for users until fixed

Pin to 2.13.0 in opencode.jsonc:

"plugin": [
  ["opencode-mem@2.13.0", { /* …config… */ }]
]

(Note: 2.13.0 has the unrelated sharp native-binary issue — see #88 / #94 / #97 — but the plugin at least loads, and the sharp path is only hit at embedding time. For users who don't trigger the embedding code path, 2.13.0 + the manual npm install onnxruntime-node@1.14.0 sharp@^0.32.0 --no-save in the cache directory is a working stopgap.)

Notes / related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions