Files
rea/tests/boundary/filesystem/pluginPackage.test.ts
T
gensokyo-dev 0cd7ef456b feat(plugins): make Claude Code and Codex installs self-contained (#7514)
Ship Claude Code and Codex from one release-pinned npm artifact with bundled runtime dependencies, extraction-only MCP qualification, plugin-aware recovery, and synchronized release metadata.

Integrates #2815 and the original proposal #1977. The original commits remain available on the PR branch; retain their author and assistant credit in this squash.

Validation: required CI passed, real Codex/Claude loading verified, and reviewed packaging/recovery findings addressed.

Co-authored-by: GamerDubz <themastergamerplays24.7@gmail.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
Co-authored-by: OpenAI Codex <openai-codex@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:13:17 +00:00

84 lines
2.6 KiB
TypeScript

import { expect, it } from "vitest";
import { pluginPackageMetadata } from "../../../scripts/lib/plugin-package.mjs";
const fixture = () => ({
manifest: {
name: "rea-agents",
version: "6.8.0",
dependencies: { runtime: "1.0.0" },
devDependencies: { builder: "1.0.0" },
overrides: { builder: { nested: "2.0.0" } },
},
lock: {
name: "rea-agents",
version: "6.8.0",
lockfileVersion: 3,
packages: {
"": {
name: "rea-agents",
version: "6.8.0",
dependencies: { runtime: "1.0.0" },
devDependencies: { builder: "1.0.0" },
},
"node_modules/runtime": { version: "1.0.0", integrity: "source digest" },
"node_modules/builder": { version: "1.0.0", dev: true },
"node_modules/builder/node_modules/nested": {
version: "2.0.0",
dev: true,
},
"node_modules/optional": {
version: "1.0.0",
devOptional: true,
optional: true,
},
},
},
});
it("preserves locked runtime facts and optional dependencies without mutating source metadata", () => {
const source = fixture();
const before = structuredClone(source);
const packed = pluginPackageMetadata(source.manifest, source.lock);
expect(source).toEqual(before);
expect(packed.packageJson).toEqual({
name: "rea-agents",
version: "6.8.0",
dependencies: { runtime: "1.0.0" },
bundleDependencies: ["runtime"],
});
expect(packed.shrinkwrap.packages).toEqual({
"": {
name: "rea-agents",
version: "6.8.0",
dependencies: { runtime: "1.0.0" },
},
"node_modules/runtime": source.lock.packages["node_modules/runtime"],
"node_modules/optional": source.lock.packages["node_modules/optional"],
});
});
it("refuses to discard a security override when the package is also used at runtime", () => {
const { manifest, lock } = fixture();
lock.packages["node_modules/builder"].dev = false;
expect(() => pluginPackageMetadata(manifest, lock)).toThrow(
"runtime or unresolved override: builder",
);
});
it("fails when an override cannot be attributed to the locked development tree", () => {
const { manifest, lock } = fixture();
delete (lock.packages as Record<string, unknown>)["node_modules/builder"];
expect(() => pluginPackageMetadata(manifest, lock)).toThrow(
"runtime or unresolved override: builder",
);
});
it("refuses a stale lock before producing a release artifact", () => {
const { manifest, lock } = fixture();
lock.packages[""].version = "6.7.0";
expect(() => pluginPackageMetadata(manifest, lock)).toThrow(
"matching v3 package lock",
);
});