diff --git a/CHANGELOG.md b/CHANGELOG.md index 7962be4..6c78901 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.6.2] - 2026-05-11 + +### Fixed + +- Fixed the published `memory-diag` npm bin by compiling the diagnostics CLI before packing and launching the compiled JavaScript runtime instead of type-stripping TypeScript under `node_modules`. + +### Added + +- Added a pack/npx smoke test that runs `memory-diag --help` from a packed tarball outside the repository. + ## [1.6.1] - 2026-05-08 ### Added diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 7a2701f..b45e122 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,5 +1,40 @@ # Release Notes +## 1.6.2 (2026-05-11) + +### Published `memory-diag` Bin Fix + +This patch release fixes the published npm package path for `memory-diag`. In v1.6.1 the source-tree CLI tests passed, but the installed package could fail under `npx --package opencode-working-memory memory-diag` because Node refuses TypeScript type stripping for files inside `node_modules`. + +v1.6.2 compiles the diagnostics CLI during packing and makes the npm bin launch the compiled JavaScript runtime. + +### What Changed + +- **Compiled diagnostics runtime**: `prepack` now builds `dist/scripts/memory-diag.js` before the package is packed or published. +- **Safer npm bin wrapper**: `memory-diag` no longer runs published `.ts` files through `--experimental-strip-types`; it launches the compiled JS artifact and reports a clear reinstall/build message if the artifact is missing. +- **Packaged-bin smoke test**: release verification now includes a pack/npx smoke test from a temp consumer project outside the repository. + +### Upgrade Notes + +- No config changes are required. +- Existing OpenCode server and TUI plugin entry points are unchanged. +- If you hit the v1.6.1 bin failure, upgrade and rerun: + +```bash +npx --package opencode-working-memory@1.6.2 memory-diag --help +``` + +### Validation + +- `npm run build` — `BUILD_PASS` +- `node ./scripts/memory-diag-bin.cjs --help` +- `npm run test:pack:memory-diag` — packed tarball smoke test passed +- `npm run typecheck` — `TYPECHECK_PASS` +- `npm test` — 421 tests passing, `TEST_PASS` +- `npm pack --dry-run` — includes compiled `dist/` diagnostics artifacts + +--- + ## 1.6.1 (2026-05-08) ### Native TUI Memory Menu diff --git a/package.json b/package.json index 08759cb..52cd7f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opencode-working-memory", - "version": "1.6.1", + "version": "1.6.2", "description": "Three-layer memory architecture for OpenCode with workspace memory and hot session state", "type": "module", "main": "index.ts", @@ -18,12 +18,17 @@ "scripts/memory-diag.ts", "scripts/memory-diag/", "scripts/memory-diag-bin.cjs", + "dist/", "README.md", "LICENSE" ], "scripts": { - "build": "node -e \"console.log('No build step required: OpenCode loads index.ts directly')\"", - "diag": "node --experimental-strip-types scripts/memory-diag.ts", + "clean:dist": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"", + "build:memory-diag": "npm run clean:dist && tsc -p tsconfig.memory-diag.json", + "build": "npm run build:memory-diag && node -e \"console.log('BUILD_PASS')\"", + "prepack": "npm run build", + "diag": "npm run --silent build:memory-diag && node ./scripts/memory-diag-bin.cjs", + "test:pack:memory-diag": "node --test --experimental-strip-types tests/smoke/memory-diag-packaging.test.ts", "typecheck": "tsc --noEmit && node -e \"console.log('TYPECHECK_PASS')\"", "test": "node --import ./tests/setup-xdg-data-home.ts --test --experimental-strip-types tests/*.test.ts && node -e \"console.log('TEST_PASS')\"", "check:compat": "npm install --no-save @opencode-ai/plugin@latest && npm run typecheck && npm test" diff --git a/scripts/memory-diag-bin.cjs b/scripts/memory-diag-bin.cjs index 6ebfef7..dc1fc46 100755 --- a/scripts/memory-diag-bin.cjs +++ b/scripts/memory-diag-bin.cjs @@ -1,5 +1,6 @@ #!/usr/bin/env node const { execFileSync } = require("child_process"); +const { existsSync } = require("fs"); const path = require("path"); function isSupportedNodeVersion(version) { @@ -9,13 +10,19 @@ function isSupportedNodeVersion(version) { } if (!isSupportedNodeVersion(process.versions.node)) { - process.stderr.write(`memory-diag requires Node >=22.6.0 because it runs TypeScript with --experimental-strip-types. Current Node: v${process.versions.node}.\n`); + process.stderr.write(`memory-diag requires Node >=22.6.0 per opencode-working-memory package engines. Current Node: v${process.versions.node}.\n`); process.exit(1); } const binDir = __dirname; -const tsScript = path.join(binDir, "memory-diag.ts"); -const args = ["--experimental-strip-types", tsScript, ...process.argv.slice(2)]; +const compiledScript = path.join(binDir, "..", "dist", "scripts", "memory-diag.js"); + +if (!existsSync(compiledScript)) { + process.stderr.write("memory-diag package is missing dist/scripts/memory-diag.js. Reinstall opencode-working-memory or run npm run build before using the local package.\n"); + process.exit(1); +} + +const args = [compiledScript, ...process.argv.slice(2)]; try { execFileSync(process.execPath, args, { stdio: "inherit" }); process.exit(0); diff --git a/tests/smoke/memory-diag-packaging.test.ts b/tests/smoke/memory-diag-packaging.test.ts new file mode 100644 index 0000000..1aa3c20 --- /dev/null +++ b/tests/smoke/memory-diag-packaging.test.ts @@ -0,0 +1,51 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { execFile } from "node:child_process"; +import { mkdir, mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), "../.."); +const maxBuffer = 10 * 1024 * 1024; + +function executable(name: "npm" | "npx"): string { + return process.platform === "win32" ? `${name}.cmd` : name; +} + +test("packed memory-diag bin runs from a temp consumer project", async () => { + const tempRoot = await mkdtemp(join(tmpdir(), "opencode-memory-diag-packaging-")); + const packDir = join(tempRoot, "pack"); + const consumerDir = join(tempRoot, "consumer"); + + try { + await mkdir(packDir, { recursive: true }); + await mkdir(consumerDir, { recursive: true }); + + const packResult = await execFileAsync(executable("npm"), [ + "pack", + repoRoot, + "--pack-destination", + packDir, + "--silent", + ], { cwd: tempRoot, maxBuffer }); + const tarballName = packResult.stdout.trim().split(/\r?\n/).filter(Boolean).at(-1); + assert.ok(tarballName, `npm pack did not report a tarball name. stdout:\n${packResult.stdout}\nstderr:\n${packResult.stderr}`); + + const tarballPath = join(packDir, tarballName); + const runResult = await execFileAsync(executable("npx"), [ + "--yes", + "--package", + tarballPath, + "memory-diag", + "--help", + ], { cwd: consumerDir, maxBuffer }); + + assert.match(runResult.stdout, /Usage:/); + assert.match(runResult.stdout, /memory-diag \[status\]/); + } finally { + await rm(tempRoot, { recursive: true, force: true }); + } +}); diff --git a/tsconfig.memory-diag.json b/tsconfig.memory-diag.json new file mode 100644 index 0000000..5d329f5 --- /dev/null +++ b/tsconfig.memory-diag.json @@ -0,0 +1,27 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowImportingTsExtensions": true, + "noEmit": false, + "outDir": "dist", + "rootDir": ".", + "declaration": false, + "sourceMap": false, + "rewriteRelativeImportExtensions": true, + "tsBuildInfoFile": "dist/.tsbuildinfo" + }, + "include": ["scripts/memory-diag.ts", "scripts/memory-diag/**/*.ts", "src/**/*.ts"], + "exclude": [ + "node_modules", + "dist", + "tests", + "src/plugin.ts", + "src/tui-plugin.ts", + "src/opencode.ts", + "src/session-state.ts", + "src/extractors.ts", + "src/pending-journal.ts", + "src/promotion-accounting.ts", + "src/memory-visibility.ts" + ] +}