惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
DataBreaches.Net
S
SegmentFault 最新的问题
P
Proofpoint News Feed
A
About on SuperTechFans
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
小众软件
小众软件
博客园 - Franky
有赞技术团队
有赞技术团队
D
Docker
T
Tailwind CSS Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
爱范儿
爱范儿

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
refactor: prune legacy plugin dependency debris on postin...
steipete · 2026-05-02 · via Recent Commits to openclaw:main

@@ -61,27 +61,6 @@ describe("bundled plugin postinstall", () => {

6161

).toBe(true);

6262

});

636364-

it("does not install bundled plugin package deps outside of source checkouts by default", async () => {

65-

const extensionsDir = await createExtensionsDir();

66-

const packageRoot = path.dirname(path.dirname(extensionsDir));

67-

await writePluginPackage(extensionsDir, "acpx", {

68-

dependencies: {

69-

acpx: "0.4.1",

70-

},

71-

});

72-

const spawnSync = vi.fn();

73-74-

runBundledPluginPostinstall({

75-

env: { HOME: "/tmp/home" },

76-

extensionsDir,

77-

packageRoot,

78-

spawnSync,

79-

log: { log: vi.fn(), warn: vi.fn() },

80-

});

81-82-

expect(spawnSync).not.toHaveBeenCalled();

83-

});

84-8564

it("prunes Node versioned compile cache dirs during package postinstall", () => {

8665

const configuredBase = path.join("/tmp", "openclaw-cache");

8766

const defaultBase = path.join(tmpdir(), "node-compile-cache");

@@ -173,19 +152,15 @@ describe("bundled plugin postinstall", () => {

173152

path.join(extensionsDir, "acpx", "node_modules", "acpx", "package.json"),

174153

JSON.stringify({ name: "acpx", version: "0.4.1" }),

175154

);

176-

const spawnSync = vi.fn();

177-178155

runBundledPluginPostinstall({

179156

env: { HOME: "/tmp/home" },

180157

packageRoot,

181-

spawnSync,

182158

log: { log: vi.fn(), warn: vi.fn() },

183159

});

184160185161

await expect(fs.stat(path.join(extensionsDir, "acpx", "node_modules"))).rejects.toMatchObject({

186162

code: "ENOENT",

187163

});

188-

expect(spawnSync).not.toHaveBeenCalled();

189164

});

190165191166

it("keeps source-checkout prune non-fatal", async () => {

@@ -419,7 +394,6 @@ describe("bundled plugin postinstall", () => {

419394420395

runBundledPluginPostinstall({

421396

packageRoot,

422-

spawnSync: vi.fn(),

423397

log: { log: vi.fn(), warn: vi.fn() },

424398

});

425399

@@ -529,11 +503,20 @@ describe("bundled plugin postinstall", () => {

529503

).toThrow("unsafe dist entry: dist/escape");

530504

});

531505532-

it("ignores staged bundled plugin node_modules when pruning packaged dist", async () => {

506+

it("prunes stale bundled plugin dependency debris from packaged dist", async () => {

533507

const packageRoot = await createTempDirAsync("openclaw-packaged-install-dist-prune-");

534508

const staleFile = path.join(packageRoot, "dist", "stale-runtime.js");

535509

const packageJson = path.join(packageRoot, "dist", "extensions", "slack", "package.json");

536510

const binDir = path.join(packageRoot, "dist", "extensions", "slack", "node_modules", ".bin");

511+

const dependencyFile = path.join(

512+

packageRoot,

513+

"dist",

514+

"extensions",

515+

"slack",

516+

"node_modules",

517+

"typebox",

518+

"package.json",

519+

);

537520

const installStageFile = path.join(

538521

packageRoot,

539522

"dist",

@@ -561,10 +544,12 @@ describe("bundled plugin postinstall", () => {

561544

await fs.mkdir(path.dirname(staleFile), { recursive: true });

562545

await fs.mkdir(path.dirname(packageJson), { recursive: true });

563546

await fs.mkdir(binDir, { recursive: true });

547+

await fs.mkdir(path.dirname(dependencyFile), { recursive: true });

564548

await fs.mkdir(path.dirname(installStageFile), { recursive: true });

565549

await fs.mkdir(path.dirname(retryInstallStageFile), { recursive: true });

566550

await fs.writeFile(staleFile, "export {};\n");

567551

await fs.writeFile(packageJson, "{}\n");

552+

await fs.writeFile(dependencyFile, "{}\n");

568553

await fs.writeFile(installStageFile, "export {};\n");

569554

await fs.writeFile(retryInstallStageFile, "export {};\n");

570555

await fs.symlink("../fxparser/bin.js", path.join(binDir, "fxparser"));

@@ -576,8 +561,15 @@ describe("bundled plugin postinstall", () => {

576561

log: { log: vi.fn(), warn: vi.fn() },

577562

}),

578563

).toEqual(["dist/stale-runtime.js"]);

579-

await expect(fs.stat(installStageFile)).resolves.toBeDefined();

580-

await expect(fs.stat(retryInstallStageFile)).resolves.toBeDefined();

564+

await expect(

565+

fs.stat(path.join(packageRoot, "dist", "extensions", "slack", "node_modules")),

566+

).rejects.toMatchObject({ code: "ENOENT" });

567+

await expect(fs.stat(path.dirname(installStageFile))).rejects.toMatchObject({

568+

code: "ENOENT",

569+

});

570+

await expect(fs.stat(path.dirname(retryInstallStageFile))).rejects.toMatchObject({

571+

code: "ENOENT",

572+

});

581573

});

582574583575

it("unlinks stale files instead of recursive pruning them", () => {

@@ -614,32 +606,6 @@ describe("bundled plugin postinstall", () => {

614606

expect(unlinkSync).toHaveBeenCalledWith("/pkg/dist/stale.js");

615607

});

616608617-

it("skips reinstall when the bundled sentinel package already exists", async () => {

618-

const extensionsDir = await createExtensionsDir();

619-

const packageRoot = path.dirname(path.dirname(extensionsDir));

620-

await writePluginPackage(extensionsDir, "acpx", {

621-

dependencies: {

622-

acpx: "0.4.1",

623-

},

624-

});

625-

await fs.mkdir(path.join(packageRoot, "node_modules", "acpx"), { recursive: true });

626-

await fs.writeFile(

627-

path.join(packageRoot, "node_modules", "acpx", "package.json"),

628-

"{}\n",

629-

"utf8",

630-

);

631-

const spawnSync = vi.fn();

632-633-

runBundledPluginPostinstall({

634-

env: { npm_config_global: "true" },

635-

extensionsDir,

636-

packageRoot,

637-

spawnSync,

638-

});

639-640-

expect(spawnSync).not.toHaveBeenCalled();

641-

});

642-643609

it("prunes only bundled plugin package node_modules in source checkouts", async () => {

644610

const packageRoot = await createTempDirAsync("openclaw-source-prune-");

645611

const extensionsDir = path.join(packageRoot, "extensions");