#!/usr/bin/env node import assert from "node:assert/strict"; import { spawnSync } from "node:child_process"; import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import path from "node:path"; const repoRoot = process.cwd(); const tempRoot = mkdtempSync(path.join(tmpdir(), "kitchen-sink-install-")); const keepTemp = process.env.KEEP_KITCHEN_INSTALL_SMOKE === "1"; let lastStdout = ""; try { const packDir = path.join(tempRoot, "pack"); mkdirSync(packDir, { recursive: true }); run("npm", ["pack", "--json", "--pack-destination", packDir], { cwd: repoRoot }); const packOutput = JSON.parse(lastStdout); const tarball = path.join(packDir, packOutput[0].filename); const projectDir = path.join(tempRoot, "consumer"); mkdirSync(projectDir, { recursive: true }); run("npm", ["init", "-y"], { cwd: tempRoot }); run("npm", ["install", "--prefix", projectDir, "--package-lock=false", "--ignore-scripts", "--no-audit", "--no-fund", tarball], { cwd: tempRoot, }); const packageDir = path.join(projectDir, "node_modules", "@openclaw", "kitchen-sink"); const installedPackageJson = JSON.parse(readFileSync(path.join(packageDir, "package.json"), "utf8")); assert.equal(installedPackageJson.name, "@openclaw/kitchen-sink"); assert.equal(installedPackageJson.version, JSON.parse(readFileSync("package.json", "utf8")).version); const probeFile = path.join(projectDir, "probe.mjs"); writeFileSync(probeFile, readFileSync(new URL("./fixtures/installed-consumer-probe.mjs", import.meta.url), "utf8")); run(process.execPath, [probeFile], { cwd: projectDir }); const inspectorBin = path.join(repoRoot, "node_modules", ".bin", "plugin-inspector"); run(inspectorBin, ["check", "--config", "plugin-inspector.config.json", "--no-openclaw", "--runtime", "--mock-sdk"], { cwd: packageDir, env: { ...process.env, PLUGIN_INSPECTOR_EXECUTE_ISOLATED: "1", }, }); console.log(`Installed package smoke OK: ${installedPackageJson.name}@${installedPackageJson.version}`); } finally { if (!keepTemp) { rmSync(tempRoot, { recursive: true, force: true }); } else { console.log(`Kept install smoke temp dir: ${tempRoot}`); } } function run(command, args, options = {}) { const result = spawnSync(command, args, { cwd: options.cwd, env: options.env || process.env, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], }); lastStdout = result.stdout; if (result.status !== 0) { process.stdout.write(result.stdout); process.stderr.write(result.stderr); process.exit(result.status ?? 1); } }