| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #!/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));
- }
|