From 7f92e87bfcc727f51f7b568ba6f69f327fe8ace7 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sat, 2 May 2026 18:22:01 -0700 Subject: [PATCH] fix: publish valid install metadata (#15) --- openclaw.plugin.json | 38 +++++++++++++++++++++++++++++++++- package-lock.json | 4 ++-- package.json | 4 ++-- scripts/check-pack-payload.mjs | 9 ++++++-- scripts/sync-surface.mjs | 25 +++++++++++++++++++++- src/index.js | 2 +- src/personality.js | 16 ++++++++++++++ 7 files changed, 89 insertions(+), 9 deletions(-) diff --git a/openclaw.plugin.json b/openclaw.plugin.json index 111aedf..adada1d 100644 --- a/openclaw.plugin.json +++ b/openclaw.plugin.json @@ -1,7 +1,7 @@ { "id": "openclaw-kitchen-sink-fixture", "name": "OpenClaw Kitchen Sink", - "version": "0.2.4", + "version": "0.2.5", "description": "Generated kitchen-sink fixture for OpenClaw plugin API surface 2026.5.2.", "enabledByDefault": false, "kind": [ @@ -57,6 +57,42 @@ "hook" ] }, + "channelConfigs": { + "kitchen-sink-channel": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "configured": { + "type": "boolean", + "default": true + }, + "disabled": { + "type": "boolean", + "default": false + }, + "enabled": { + "type": "boolean", + "default": true + }, + "token": { + "type": "string" + } + } + }, + "uiHints": { + "token": { + "sensitive": true + } + }, + "label": "Kitchen Sink", + "description": "Credential-free channel fixture for deterministic Kitchen Sink conversations.", + "commands": { + "nativeCommandsAutoEnabled": true, + "nativeSkillsAutoEnabled": true + } + } + }, "setup": { "providers": [ { diff --git a/package-lock.json b/package-lock.json index d34b209..1f752df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@openclaw/kitchen-sink", - "version": "0.2.4", + "version": "0.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@openclaw/kitchen-sink", - "version": "0.2.4", + "version": "0.2.5", "license": "MIT", "dependencies": { "openclaw": "2026.5.2" diff --git a/package.json b/package.json index 64486e2..e7c6c2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@openclaw/kitchen-sink", - "version": "0.2.4", + "version": "0.2.5", "private": false, "description": "Credential-free kitchen-sink OpenClaw plugin fixture covering the public plugin API surface.", "type": "module", @@ -50,7 +50,7 @@ "clawhubSpec": "clawhub:@openclaw/kitchen-sink", "npmSpec": "@openclaw/kitchen-sink", "defaultChoice": "clawhub", - "minHostVersion": "2026.5.2" + "minHostVersion": ">=2026.5.2" }, "release": { "publishToClawHub": true, diff --git a/scripts/check-pack-payload.mjs b/scripts/check-pack-payload.mjs index eb409c9..41a2f49 100644 --- a/scripts/check-pack-payload.mjs +++ b/scripts/check-pack-payload.mjs @@ -51,6 +51,7 @@ const requiredFiles = [ const missingFiles = requiredFiles.filter((file) => !files.has(file)); const packageJson = JSON.parse(fs.readFileSync("package.json", "utf8")); +const pluginManifest = JSON.parse(fs.readFileSync("openclaw.plugin.json", "utf8")); const issues = []; function sameStringArray(actual, expected) { @@ -109,8 +110,12 @@ if (packageJson.openclaw?.install?.npmSpec !== "@openclaw/kitchen-sink") { if (packageJson.openclaw?.install?.defaultChoice !== "clawhub") { issues.push('openclaw.install.defaultChoice must be "clawhub"'); } -if (packageJson.openclaw?.install?.minHostVersion !== buildOpenClawVersion) { - issues.push("openclaw.install.minHostVersion must match openclaw.build.openclawVersion"); +if (packageJson.openclaw?.install?.minHostVersion !== `>=${buildOpenClawVersion}`) { + issues.push("openclaw.install.minHostVersion must be a semver floor for openclaw.build.openclawVersion"); +} +const kitchenSinkChannelConfig = pluginManifest.channelConfigs?.["kitchen-sink-channel"]; +if (!kitchenSinkChannelConfig?.schema || kitchenSinkChannelConfig.schema.type !== "object") { + issues.push("openclaw.plugin.json must declare channelConfigs.kitchen-sink-channel.schema"); } if (packageJson.openclaw?.release?.publishToClawHub !== true) { issues.push("openclaw.release.publishToClawHub must be true"); diff --git a/scripts/sync-surface.mjs b/scripts/sync-surface.mjs index 0b01046..0301f09 100644 --- a/scripts/sync-surface.mjs +++ b/scripts/sync-surface.mjs @@ -215,6 +215,29 @@ function renderManifest({ manifestContracts, packageVersion }) { onCommands: ["kitchen", "kitchen-sink"], onCapabilities: ["provider", "channel", "tool", "hook"], }, + channelConfigs: { + "kitchen-sink-channel": { + schema: { + type: "object", + additionalProperties: false, + properties: { + configured: { type: "boolean", default: true }, + disabled: { type: "boolean", default: false }, + enabled: { type: "boolean", default: true }, + token: { type: "string" }, + }, + }, + uiHints: { + token: { sensitive: true }, + }, + label: "Kitchen Sink", + description: "Credential-free channel fixture for deterministic Kitchen Sink conversations.", + commands: { + nativeCommandsAutoEnabled: true, + nativeSkillsAutoEnabled: true, + }, + }, + }, setup: { providers: [ { id: "kitchen-sink-provider", authMethods: ["none"], envVars: [] }, @@ -256,7 +279,7 @@ function renderPackageJson({ packageVersion }) { clawhubSpec: "clawhub:@openclaw/kitchen-sink", npmSpec: "@openclaw/kitchen-sink", defaultChoice: "clawhub", - minHostVersion: packageVersion, + minHostVersion: `>=${packageVersion}`, }; packageJson.openclaw.release = { ...(packageJson.openclaw.release ?? {}), diff --git a/src/index.js b/src/index.js index 17f92ae..ce0f454 100644 --- a/src/index.js +++ b/src/index.js @@ -10,7 +10,7 @@ import { export const plugin = { id: PLUGIN_ID, name: "OpenClaw Kitchen Sink", - version: "0.2.4", + version: "0.2.5", description: "Credential-free fixture covering OpenClaw plugin API seams.", expectedDiagnostics: KITCHEN_SINK_EXPECTED_DIAGNOSTICS, register(api) { diff --git a/src/personality.js b/src/personality.js index 50cc61c..0f8ec19 100644 --- a/src/personality.js +++ b/src/personality.js @@ -5,28 +5,44 @@ export const DEFAULT_KITCHEN_SINK_PERSONALITY = "full"; export const KITCHEN_SINK_EXPECTED_DIAGNOSTICS = { full: [ "only bundled plugins can register agent tool result middleware", + "agent event subscription registration requires id and handle", 'agent harness "kitchen-sink-agent-harness" registration missing required runtime methods', 'channel "kitchen-sink-channel-probe" registration missing required config helpers', "cli registration missing explicit commands metadata", "only bundled plugins can register Codex app-server extension factories", 'compaction provider "kitchen-sink-compaction-provider" registration missing summarize', "context engine registration missing id", + "control UI descriptor registration requires id, surface, label, and valid optional fields", "http route registration missing or invalid auth: /kitchen-sink/http-route", + "node invoke policy registration missing commands", + "only bundled plugins can register trusted tool policies", + "plugin must declare contracts.tools for: kitchen-sink-tool", "plugin must own memory slot or declare contracts.memoryEmbeddingProviders for adapter: kitchen-sink-memory-embedding-provider", "memory prompt supplement registration missing builder", + "session extension registration requires namespace and description", + "session scheduler job registration requires unique id, sessionKey, and kind", + "tool metadata registration missing toolName", ], conformance: [], adversarial: [ "only bundled plugins can register agent tool result middleware", + "agent event subscription registration requires id and handle", 'agent harness "kitchen-sink-agent-harness" registration missing required runtime methods', 'channel "kitchen-sink-channel-probe" registration missing required config helpers', "cli registration missing explicit commands metadata", "only bundled plugins can register Codex app-server extension factories", 'compaction provider "kitchen-sink-compaction-provider" registration missing summarize', "context engine registration missing id", + "control UI descriptor registration requires id, surface, label, and valid optional fields", "http route registration missing or invalid auth: /kitchen-sink/http-route", + "node invoke policy registration missing commands", + "only bundled plugins can register trusted tool policies", + "plugin must declare contracts.tools for: kitchen-sink-tool", "plugin must own memory slot or declare contracts.memoryEmbeddingProviders for adapter: kitchen-sink-memory-embedding-provider", "memory prompt supplement registration missing builder", + "session extension registration requires namespace and description", + "session scheduler job registration requires unique id, sessionKey, and kind", + "tool metadata registration missing toolName", ], };