#!/usr/bin/env node import assert from "node:assert/strict"; import { execFile } from "node:child_process"; import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { promisify } from "node:util"; import { okResult } from "../mcp/src/core/result-envelope.mjs"; import { sha256, signState, verifyState } from "../mcp/src/core/run-state-integrity.mjs"; import { buildValidPlan } from "./test-plan-fixture.mjs"; const execFileAsync = promisify(execFile); export async function smokePackage() { const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const packageJson = JSON.parse(await readFile(join(root, "package.json"), "utf8")); const pluginJson = JSON.parse(await readFile(join(root, ".claude-plugin", "plugin.json"), "utf8")); const manifest = JSON.parse(await readFile(join(root, "skill-package-manifest.json"), "utf8")); assert.equal(packageJson.version, pluginJson.version); assert.equal(pluginJson.version, manifest.version); assert.equal(manifest.entrySkill, "fmode-image-set"); const envelope = okResult({ assistantMessage: "ok" }); assert.equal(envelope.status, "ok"); assert.equal(envelope.assistantMessage, "ok"); const state = { run_id: "run-20260729000000-abcdef", status: "running" }; const secret = "package-smoke-secret"; const signed = signState(state, secret); assert.equal(verifyState(signed, secret), true); assert.equal(sha256("image-set").length, 64); const temp = await mkdtemp(join(tmpdir(), "fmode-image-set-")); try { const planPath = join(temp, "prompt-plan.json"); await writeFile(planPath, `${JSON.stringify(buildValidPlan( "generic consumer product", "https://images.example.test/product.jpg", "run-20260729000000-abcdef", ), null, 2)}\n`, "utf8"); const validator = join(root, "mcp", "src", "features", "image-set", "validate-plan.mjs"); const { stdout } = await execFileAsync(process.execPath, [validator, planPath]); const validation = JSON.parse(stdout); assert.equal(validation.valid, true); assert.equal(validation.images, 7); } finally { await rm(temp, { recursive: true, force: true }); } return { status: "ok", version: packageJson.version, checks: ["version-sync", "result-envelope", "state-integrity", "plan-validation"], }; } if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { console.log(JSON.stringify(await smokePackage(), null, 2)); }