






















@@ -5,6 +5,7 @@ import path from "node:path";
55import { Type } from "typebox";
66import { beforeAll, describe, expect, it } from "vitest";
77import { defineToolPlugin, getToolPluginMetadata } from "../plugin-sdk/tool-plugin.js";
8+import { VERSION } from "../version.js";
89import {
910buildToolPluginManifest,
1011buildToolPluginPackageManifest,
@@ -342,6 +343,7 @@ describe("plugin authoring commands", () => {
342343scripts: {
343344"plugin:build": "npm run build && openclaw plugins build --entry ./dist/index.js",
344345"plugin:validate": "npm run build && openclaw plugins validate --entry ./dist/index.js",
346+test: "vitest run --config ./vitest.config.ts",
345347},
346348openclaw: {
347349extensions: ["./dist/index.js"],
@@ -362,5 +364,110 @@ describe("plugin authoring commands", () => {
362364expect(fs.readFileSync(path.join(projectDir, "src/index.test.ts"), "utf8")).toContain(
363365"getToolPluginMetadata",
364366);
367+expect(fs.readFileSync(path.join(projectDir, "vitest.config.ts"), "utf8")).toContain(
368+'include: ["src/**/*.test.ts"]',
369+);
370+});
371+372+it("scaffolds a provider plugin project with ClawHub validation and release metadata", async () => {
373+const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-provider-init-"));
374+const projectDir = path.join(tmpDir, "plugin-init-test");
375+376+await runPluginsInitCommand("plugin-init-test", {
377+directory: projectDir,
378+name: "Plugin Init Test",
379+type: "provider",
380+});
381+382+const packageManifest = JSON.parse(
383+fs.readFileSync(path.join(projectDir, "package.json"), "utf8"),
384+);
385+expect(packageManifest).toMatchObject({
386+name: "openclaw-plugin-plugin-init-test",
387+scripts: {
388+build: "tsc -p tsconfig.json",
389+test: "vitest run --config ./vitest.config.ts",
390+validate: "npm run build && clawhub package validate . --out .clawhub-validation",
391+},
392+peerDependencies: {
393+openclaw: `>=${VERSION}`,
394+},
395+devDependencies: {
396+clawhub: "latest",
397+openclaw: "latest",
398+typescript: "^5.9.0",
399+vitest: "^3.2.0",
400+},
401+openclaw: {
402+extensions: ["./dist/index.js"],
403+install: {
404+clawhubSpec: "clawhub:openclaw-plugin-plugin-init-test",
405+defaultChoice: "clawhub",
406+minHostVersion: `>=${VERSION}`,
407+},
408+compat: {
409+pluginApi: `>=${VERSION}`,
410+},
411+build: {
412+openclawVersion: VERSION,
413+},
414+release: {
415+publishToClawHub: true,
416+},
417+},
418+});
419+expect(packageManifest.scripts).not.toHaveProperty("plugin:build");
420+expect(packageManifest.scripts).not.toHaveProperty("plugin:validate");
421+422+const manifest = JSON.parse(
423+fs.readFileSync(path.join(projectDir, "openclaw.plugin.json"), "utf8"),
424+);
425+expect(manifest).toMatchObject({
426+id: "plugin-init-test",
427+name: "Plugin Init Test",
428+version: "0.1.0",
429+providers: ["plugin-init-test"],
430+setup: {
431+providers: [
432+{
433+id: "plugin-init-test",
434+envVars: ["PLUGIN_INIT_TEST_API_KEY"],
435+},
436+],
437+},
438+configSchema: {
439+type: "object",
440+additionalProperties: false,
441+properties: {},
442+},
443+});
444+445+const indexSource = fs.readFileSync(path.join(projectDir, "src/index.ts"), "utf8");
446+expect(indexSource).toContain("definePluginEntry");
447+expect(indexSource).toContain("api.registerProvider");
448+expect(indexSource).toContain("buildSingleProviderApiKeyCatalog");
449+450+expect(fs.readFileSync(path.join(projectDir, "src/index.test.ts"), "utf8")).toContain(
451+"OpenClawPluginApi",
452+);
453+expect(fs.readFileSync(path.join(projectDir, "vitest.config.ts"), "utf8")).toContain(
454+'include: ["src/**/*.test.ts"]',
455+);
456+const readme = fs.readFileSync(path.join(projectDir, "README.md"), "utf8");
457+expect(readme).toContain("npm run validate");
458+expect(readme).toContain("npm exec clawhub -- login");
459+expect(readme).toContain("npm exec clawhub -- package publish .");
460+expect(readme).toContain("npm exec clawhub -- package trusted-publisher set");
461+462+const workflow = fs.readFileSync(
463+path.join(projectDir, ".github/workflows/clawhub-publish.yml"),
464+"utf8",
465+);
466+expect(workflow).not.toContain("release:");
467+expect(workflow).not.toContain("secrets: inherit");
468+expect(workflow).toContain("workflow_dispatch:");
469+expect(workflow).toContain(
470+"openclaw/clawhub/.github/workflows/package-publish.yml@9d49df109d4ad3dc8a6ecf05d26b39f46d294721",
471+);
365472});
366473});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。