From db6d52e4af03be3db682122d000af6486958870c Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Sun, 5 Apr 2026 14:09:10 -0700 Subject: [PATCH] fix: ship built opencode plugin assets --- package.json | 10 +++- scripts/build-opencode.js | 24 +++++++++ tests/scripts/build-opencode.test.js | 63 +++++++++++++++++++++++ yarn.lock | 75 +++++++++++++++++++++++++++- 4 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 scripts/build-opencode.js create mode 100644 tests/scripts/build-opencode.test.js diff --git a/package.json b/package.json index d5881e02..c102ad66 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ ".codex/", ".cursor/", ".opencode/commands/", + ".opencode/dist/", ".opencode/instructions/", ".opencode/plugins/", ".opencode/prompts/", @@ -112,7 +113,9 @@ "orchestrate:worker": "bash scripts/orchestrate-codex-worker.sh", "orchestrate:tmux": "node scripts/orchestrate-worktrees.js", "test": "node scripts/ci/check-unicode-safety.js && node scripts/ci/validate-agents.js && node scripts/ci/validate-commands.js && node scripts/ci/validate-rules.js && node scripts/ci/validate-skills.js && node scripts/ci/validate-hooks.js && node scripts/ci/validate-install-manifests.js && node scripts/ci/validate-no-personal-paths.js && npm run catalog:check && node tests/run-all.js", - "coverage": "c8 --all --include=\"scripts/**/*.js\" --check-coverage --lines 80 --functions 80 --branches 80 --statements 80 --reporter=text --reporter=lcov node tests/run-all.js" + "coverage": "c8 --all --include=\"scripts/**/*.js\" --check-coverage --lines 80 --functions 80 --branches 80 --statements 80 --reporter=text --reporter=lcov node tests/run-all.js", + "build:opencode": "node scripts/build-opencode.js", + "prepack": "npm run build:opencode" }, "dependencies": { "@iarna/toml": "^2.2.5", @@ -121,10 +124,13 @@ }, "devDependencies": { "@eslint/js": "^9.39.2", + "@opencode-ai/plugin": "^1.0.0", + "@types/node": "^20.19.24", "c8": "^11.0.0", "eslint": "^9.39.2", "globals": "^17.1.0", - "markdownlint-cli": "^0.48.0" + "markdownlint-cli": "^0.48.0", + "typescript": "^5.9.3" }, "engines": { "node": ">=18" diff --git a/scripts/build-opencode.js b/scripts/build-opencode.js new file mode 100644 index 00000000..a0e0f8fc --- /dev/null +++ b/scripts/build-opencode.js @@ -0,0 +1,24 @@ +#!/usr/bin/env node + +const fs = require("node:fs") +const path = require("node:path") +const { execFileSync } = require("node:child_process") + +const rootDir = path.resolve(__dirname, "..") +const opencodeDir = path.join(rootDir, ".opencode") +const distDir = path.join(opencodeDir, "dist") + +fs.rmSync(distDir, { recursive: true, force: true }) + +const tscBin = path.join(rootDir, "node_modules", ".bin", process.platform === "win32" ? "tsc.cmd" : "tsc") + +if (!fs.existsSync(tscBin)) { + throw new Error( + "TypeScript compiler not found. Install root dev dependencies before publishing so .opencode/dist can be built." + ) +} + +execFileSync(tscBin, ["-p", path.join(opencodeDir, "tsconfig.json")], { + cwd: rootDir, + stdio: "inherit", +}) diff --git a/tests/scripts/build-opencode.test.js b/tests/scripts/build-opencode.test.js new file mode 100644 index 00000000..760c41d8 --- /dev/null +++ b/tests/scripts/build-opencode.test.js @@ -0,0 +1,63 @@ +/** + * Tests for scripts/build-opencode.js + */ + +const assert = require("assert") +const fs = require("fs") +const path = require("path") +const { spawnSync } = require("child_process") + +function runTest(name, fn) { + try { + fn() + console.log(` ✓ ${name}`) + return true + } catch (error) { + console.log(` ✗ ${name}`) + console.error(` ${error.message}`) + return false + } +} + +function main() { + console.log("\n=== Testing build-opencode.js ===\n") + + let passed = 0 + let failed = 0 + + const repoRoot = path.join(__dirname, "..", "..") + const packageJson = JSON.parse( + fs.readFileSync(path.join(repoRoot, "package.json"), "utf8") + ) + const buildScript = path.join(repoRoot, "scripts", "build-opencode.js") + const distEntry = path.join(repoRoot, ".opencode", "dist", "index.js") + const tests = [ + ["package.json exposes the OpenCode build and prepack hooks", () => { + assert.strictEqual(packageJson.scripts["build:opencode"], "node scripts/build-opencode.js") + assert.strictEqual(packageJson.scripts.prepack, "npm run build:opencode") + assert.ok(packageJson.files.includes(".opencode/dist/")) + }], + ["build script generates .opencode/dist", () => { + const result = spawnSync("node", [buildScript], { + cwd: repoRoot, + encoding: "utf8", + }) + assert.strictEqual(result.status, 0, result.stderr) + assert.ok(fs.existsSync(distEntry), ".opencode/dist/index.js should exist after build") + }], + ] + + for (const [name, fn] of tests) { + if (runTest(name, fn)) { + passed += 1 + } else { + failed += 1 + } + } + + console.log(`\nPassed: ${passed}`) + console.log(`Failed: ${failed}`) + process.exit(failed > 0 ? 1 : 0) +} + +main() diff --git a/yarn.lock b/yarn.lock index 2849371a..62f82ffe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -169,6 +169,33 @@ __metadata: languageName: node linkType: hard +"@opencode-ai/plugin@npm:^1.0.0": + version: 1.3.15 + resolution: "@opencode-ai/plugin@npm:1.3.15" + dependencies: + "@opencode-ai/sdk": "npm:1.3.15" + zod: "npm:4.1.8" + peerDependencies: + "@opentui/core": ">=0.1.96" + "@opentui/solid": ">=0.1.96" + peerDependenciesMeta: + "@opentui/core": + optional: true + "@opentui/solid": + optional: true + checksum: 10c0/1a662ff700812223310612f3c8c7fd4465eda5763d726ec4d29d0eae26babf344ef176c9b987d79fe1e29c8a498178881a47d7080bb9f4db3e70dad59eb8cd9e + languageName: node + linkType: hard + +"@opencode-ai/sdk@npm:1.3.15": + version: 1.3.15 + resolution: "@opencode-ai/sdk@npm:1.3.15" + dependencies: + cross-spawn: "npm:7.0.6" + checksum: 10c0/3957ae62e0ec1e339d9493e03a2440c95afdd64a608a2dc9db8383338650318a294280b2142305db5b0147badacbefa0d07e949d31167e5a4a49c9d057d016fa + languageName: node + linkType: hard + "@types/debug@npm:^4.0.0": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -213,6 +240,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.19.24": + version: 20.19.39 + resolution: "@types/node@npm:20.19.39" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/1d16da7b5f47a7415b827fcf3b94d279febf4c14671afec74a03e47856b5270023d9beb1b9aeab4d3b622fd97d61a60206cfc2cca588663181331bc592468289 + languageName: node + linkType: hard + "@types/unist@npm:^2.0.0": version: 2.0.11 resolution: "@types/unist@npm:2.0.11" @@ -444,7 +480,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.6": +"cross-spawn@npm:7.0.6, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -512,12 +548,15 @@ __metadata: dependencies: "@eslint/js": "npm:^9.39.2" "@iarna/toml": "npm:^2.2.5" + "@opencode-ai/plugin": "npm:^1.0.0" + "@types/node": "npm:^20.19.24" ajv: "npm:^8.18.0" c8: "npm:^11.0.0" eslint: "npm:^9.39.2" globals: "npm:^17.1.0" markdownlint-cli: "npm:^0.48.0" sql.js: "npm:^1.14.1" + typescript: "npm:^5.9.3" bin: ecc: scripts/ecc.js ecc-install: scripts/install-apply.js @@ -1744,6 +1783,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430 + languageName: node + linkType: hard + "uc.micro@npm:^2.0.0, uc.micro@npm:^2.1.0": version: 2.1.0 resolution: "uc.micro@npm:2.1.0" @@ -1751,6 +1810,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -1835,3 +1901,10 @@ __metadata: checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard + +"zod@npm:4.1.8": + version: 4.1.8 + resolution: "zod@npm:4.1.8" + checksum: 10c0/5eae39da09d7bd0564a30dfd2348811e4e2e7dd15955d8f3444f8e196f35e5422b1482eda234b722fafb0738f4a8b718adb042b860936bfdd2cc19cdbdac8a9a + languageName: node + linkType: hard