From e899bcd7372a3623110b35ba9f8c6e2039f89cf5 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:45:05 +0100 Subject: [PATCH 1/7] chore(opencode): add wrapper package for plugin loading Adds a standalone obsxa-opencode package that re-exports the existing plugin entrypoint so users can install a stable package name while OpenCode subpath plugin specifier support is still pending. --- opencode/CHANGELOG.md | 3 +++ opencode/index.mjs | 2 ++ opencode/package.json | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 opencode/CHANGELOG.md create mode 100644 opencode/index.mjs create mode 100644 opencode/package.json diff --git a/opencode/CHANGELOG.md b/opencode/CHANGELOG.md new file mode 100644 index 0000000..1512c42 --- /dev/null +++ b/opencode/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +## Unreleased diff --git a/opencode/index.mjs b/opencode/index.mjs new file mode 100644 index 0000000..cef156d --- /dev/null +++ b/opencode/index.mjs @@ -0,0 +1,2 @@ +export { createObsxaPlugin } from "obsxa/opencode"; +export { createObsxaPlugin as default } from "obsxa/opencode"; diff --git a/opencode/package.json b/opencode/package.json new file mode 100644 index 0000000..fff4a8a --- /dev/null +++ b/opencode/package.json @@ -0,0 +1,21 @@ +{ + "name": "obsxa-opencode", + "version": "0.0.2", + "description": "OpenCode plugin wrapper package for obsxa", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/oritwoen/obsxa.git" + }, + "files": [ + "index.mjs" + ], + "type": "module", + "main": "./index.mjs", + "exports": { + ".": "./index.mjs" + }, + "dependencies": { + "obsxa": "0.0.2" + } +} From 9feac5584521f83369323643c8ebf9081cd9ac53 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:45:20 +0100 Subject: [PATCH 2/7] chore(release): sync root and wrapper version bumps Routes pnpm release through a single script that bumps the root package first, mirrors that version into the wrapper package, and then runs changelogen for both targets before final release commit and tag. --- package.json | 2 +- scripts/release-with-opencode.mjs | 44 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 scripts/release-with-opencode.mjs diff --git a/package.json b/package.json index 0937f98..d3d2d1d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "test:run": "vitest --run", "generate": "drizzle-kit generate", "prepack": "pnpm run build", - "release": "pnpm test:run && pnpm build && changelogen --release --push" + "release": "pnpm test:run && pnpm build && node ./scripts/release-with-opencode.mjs" }, "dependencies": { "@libsql/client": "^0.17.0", diff --git a/scripts/release-with-opencode.mjs b/scripts/release-with-opencode.mjs new file mode 100644 index 0000000..0f896b9 --- /dev/null +++ b/scripts/release-with-opencode.mjs @@ -0,0 +1,44 @@ +import { execFileSync } from "node:child_process"; +import { readFileSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const rootDir = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const packageJsonPath = resolve(rootDir, "package.json"); +const opencodePackageJsonPath = resolve(rootDir, "opencode/package.json"); + +function runChangelogen(args) { + execFileSync("changelogen", args, { + cwd: rootDir, + stdio: "inherit", + }); +} + +function readRootVersion() { + const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8")); + const version = packageJson.version; + if (typeof version !== "string" || version.length === 0) { + throw new Error("Missing version in package.json"); + } + return version; +} + +function syncOpencodePackageVersion(version) { + const opencodePackageJson = JSON.parse(readFileSync(opencodePackageJsonPath, "utf8")); + opencodePackageJson.version = version; + opencodePackageJson.dependencies ??= {}; + opencodePackageJson.dependencies.obsxa = version; + writeFileSync( + opencodePackageJsonPath, + `${JSON.stringify(opencodePackageJson, null, 2)}\n`, + "utf8", + ); +} + +runChangelogen(["--bump"]); + +const version = readRootVersion(); +syncOpencodePackageVersion(version); + +runChangelogen(["--bump", "--dir", "./opencode", "-r", version]); +runChangelogen(["--release", "-r", version, "--push"]); From 7cf0d0244f6455331de581b27013784b544ea157 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:45:30 +0100 Subject: [PATCH 3/7] chore(ci): publish wrapper package in release job Extends the tag-triggered npm release workflow to publish the new wrapper package after the main package and records the release-flow change in the unreleased changelog notes. --- .github/workflows/release.yml | 4 ++++ CHANGELOG.md | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2373b83..636612a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,3 +34,7 @@ jobs: - run: pnpm publish --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} + + - run: pnpm publish --dir ./opencode --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/CHANGELOG.md b/CHANGELOG.md index fbe782c..f3fd972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +### 🏡 Chore + +- **release:** Simplify release flow to one script and sync version for wrapper `opencode` package +- **release:** Publish wrapper package from `opencode/` in release workflow + ### ⚠️ Notes - **db path:** `createObsxa()` now defaults to an XDG-compliant data path (`~/.local/share/obsxa/obsxa.db` on Linux) instead of `./obsxa.db`. Pass `db: "./obsxa.db"` explicitly to keep legacy location. From ace554cf6d93bcc3312009ebdc87aa8ef07f70a2 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:51:28 +0100 Subject: [PATCH 4/7] chore(release): harden wrapper sync safeguards Adds an explicit existence check before syncing wrapper metadata and removes fixed obsxa version pinning in the wrapper dependency to reduce manual drift risk between wrapper and root package maintenance. --- opencode/package.json | 2 +- scripts/release-with-opencode.mjs | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/opencode/package.json b/opencode/package.json index fff4a8a..07376b9 100644 --- a/opencode/package.json +++ b/opencode/package.json @@ -16,6 +16,6 @@ ".": "./index.mjs" }, "dependencies": { - "obsxa": "0.0.2" + "obsxa": "*" } } diff --git a/scripts/release-with-opencode.mjs b/scripts/release-with-opencode.mjs index 0f896b9..8dea5e3 100644 --- a/scripts/release-with-opencode.mjs +++ b/scripts/release-with-opencode.mjs @@ -1,5 +1,5 @@ import { execFileSync } from "node:child_process"; -import { readFileSync, writeFileSync } from "node:fs"; +import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; @@ -24,10 +24,12 @@ function readRootVersion() { } function syncOpencodePackageVersion(version) { + if (!existsSync(opencodePackageJsonPath)) { + throw new Error(`Missing wrapper package definition at ${opencodePackageJsonPath}`); + } + const opencodePackageJson = JSON.parse(readFileSync(opencodePackageJsonPath, "utf8")); opencodePackageJson.version = version; - opencodePackageJson.dependencies ??= {}; - opencodePackageJson.dependencies.obsxa = version; writeFileSync( opencodePackageJsonPath, `${JSON.stringify(opencodePackageJson, null, 2)}\n`, From c0709403ce39370e7cf792dd66bad2d6987a1687 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:59:37 +0100 Subject: [PATCH 5/7] chore(release): pin wrapper dependency to synced root version Keeps obsxa-opencode bound to the exact root package version and updates release sync logic so dependency and wrapper version move together on every release. --- opencode/package.json | 2 +- scripts/release-with-opencode.mjs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/opencode/package.json b/opencode/package.json index 07376b9..fff4a8a 100644 --- a/opencode/package.json +++ b/opencode/package.json @@ -16,6 +16,6 @@ ".": "./index.mjs" }, "dependencies": { - "obsxa": "*" + "obsxa": "0.0.2" } } diff --git a/scripts/release-with-opencode.mjs b/scripts/release-with-opencode.mjs index 8dea5e3..32af47c 100644 --- a/scripts/release-with-opencode.mjs +++ b/scripts/release-with-opencode.mjs @@ -30,6 +30,8 @@ function syncOpencodePackageVersion(version) { const opencodePackageJson = JSON.parse(readFileSync(opencodePackageJsonPath, "utf8")); opencodePackageJson.version = version; + opencodePackageJson.dependencies ??= {}; + opencodePackageJson.dependencies.obsxa = version; writeFileSync( opencodePackageJsonPath, `${JSON.stringify(opencodePackageJson, null, 2)}\n`, From 76db4123ff7c6f55cfbfe5f4ef6505b6ee8d23d9 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:01:46 +0100 Subject: [PATCH 6/7] chore(opencode): ship wrapper type declarations Adds declaration entrypoints to obsxa-opencode so TypeScript consumers get createObsxaPlugin types from the wrapper package, matching the runtime re-export. --- opencode/index.d.mts | 1 + opencode/package.json | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 opencode/index.d.mts diff --git a/opencode/index.d.mts b/opencode/index.d.mts new file mode 100644 index 0000000..6713f3e --- /dev/null +++ b/opencode/index.d.mts @@ -0,0 +1 @@ +export { createObsxaPlugin, createObsxaPlugin as default } from "obsxa/opencode"; diff --git a/opencode/package.json b/opencode/package.json index fff4a8a..1321093 100644 --- a/opencode/package.json +++ b/opencode/package.json @@ -8,12 +8,17 @@ "url": "git+https://github.com/oritwoen/obsxa.git" }, "files": [ - "index.mjs" + "index.mjs", + "index.d.mts" ], "type": "module", "main": "./index.mjs", + "types": "./index.d.mts", "exports": { - ".": "./index.mjs" + ".": { + "types": "./index.d.mts", + "default": "./index.mjs" + } }, "dependencies": { "obsxa": "0.0.2" From 761a98a4b1be1b10b3e9060a2ff55b8dfe7b1941 Mon Sep 17 00:00:00 2001 From: oritwoen <18102267+oritwoen@users.noreply.github.com> Date: Thu, 12 Mar 2026 14:12:13 +0100 Subject: [PATCH 7/7] chore(release): keep root-only changelog flow Drops opencode changelog bumping and removes opencode/CHANGELOG.md so release tagging stays single-source in root and avoids conflicting multi-release tag behavior. --- CHANGELOG.md | 1 + opencode/CHANGELOG.md | 3 --- scripts/release-with-opencode.mjs | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 opencode/CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md index f3fd972..74f7adc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - **release:** Simplify release flow to one script and sync version for wrapper `opencode` package - **release:** Publish wrapper package from `opencode/` in release workflow +- **release:** Keep single root changelog/release and sync wrapper package metadata only ### ⚠️ Notes diff --git a/opencode/CHANGELOG.md b/opencode/CHANGELOG.md deleted file mode 100644 index 1512c42..0000000 --- a/opencode/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -# Changelog - -## Unreleased diff --git a/scripts/release-with-opencode.mjs b/scripts/release-with-opencode.mjs index 32af47c..5c37b96 100644 --- a/scripts/release-with-opencode.mjs +++ b/scripts/release-with-opencode.mjs @@ -44,5 +44,4 @@ runChangelogen(["--bump"]); const version = readRootVersion(); syncOpencodePackageVersion(version); -runChangelogen(["--bump", "--dir", "./opencode", "-r", version]); runChangelogen(["--release", "-r", version, "--push"]);