diff --git a/.github/workflows/skill-release.yml b/.github/workflows/skill-release.yml index d2afadf..f194ad0 100644 --- a/.github/workflows/skill-release.yml +++ b/.github/workflows/skill-release.yml @@ -1716,11 +1716,6 @@ jobs: if: needs.release-tag.outputs.publish_clawhub == 'true' && env.CLAWHUB_TOKEN != '' run: bash scripts/ci/install_clawhub_cli.sh - - name: Patch clawhub publish payload workaround - # Temporary: clawhub@0.7.0 publish payload is missing acceptLicenseTerms. - if: needs.release-tag.outputs.publish_clawhub == 'true' && env.CLAWHUB_TOKEN != '' - run: node scripts/ci/patch_clawhub_publish_payload.mjs - - name: Login to ClawHub if: needs.release-tag.outputs.publish_clawhub == 'true' && env.CLAWHUB_TOKEN != '' run: | @@ -1871,10 +1866,6 @@ jobs: - name: Install clawhub CLI run: bash scripts/ci/install_clawhub_cli.sh - - name: Patch clawhub publish payload workaround - # Temporary: clawhub@0.7.0 publish payload is missing acceptLicenseTerms. - run: node scripts/ci/patch_clawhub_publish_payload.mjs - - name: Login to ClawHub run: | set -euo pipefail diff --git a/package-lock.json b/package-lock.json index 08d97d5..fba6f62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,11 +31,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -44,27 +45,29 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.29.0", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -89,12 +92,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.0", - "integrity": "sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==", + "version": "7.29.7", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -104,12 +108,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -127,33 +132,36 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -163,79 +171,84 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.7", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@babel/types": "^7.29.7" }, + "bin": "./bin/babel-parser.js", "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/template": { - "version": "7.28.6", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -243,12 +256,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -3092,10 +3106,20 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/scripts/ci/patch_clawhub_publish_payload.mjs b/scripts/ci/patch_clawhub_publish_payload.mjs deleted file mode 100644 index ee962c8..0000000 --- a/scripts/ci/patch_clawhub_publish_payload.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -const workspace = process.env.GITHUB_WORKSPACE || process.cwd(); -const npmRoot = path.join(workspace, ".github", "clawhub-cli", "node_modules"); -const publishScriptPath = path.join( - npmRoot, - "clawhub", - "dist", - "cli", - "commands", - "publish.js", -); - -if (!fs.existsSync(publishScriptPath)) { - throw new Error(`clawhub publish script not found: ${publishScriptPath}`); -} - -const original = fs.readFileSync(publishScriptPath, "utf8"); -if (original.includes("acceptLicenseTerms: true")) { - console.log(`[patch-clawhub] Already patched: ${publishScriptPath}`); - process.exit(0); -} - -const payloadPattern = /changelog,\r?\n(\s*)tags,/; -if (!payloadPattern.test(original)) { - throw new Error(`[patch-clawhub] Could not find expected publish payload pattern in ${publishScriptPath}`); -} - -const patched = original.replace( - payloadPattern, - (_, indent) => `changelog,\n${indent}acceptLicenseTerms: true,\n${indent}tags,`, -); -fs.writeFileSync(publishScriptPath, patched, "utf8"); -console.log(`[patch-clawhub] Patched: ${publishScriptPath}`); diff --git a/scripts/ci/resolve_clawhub_slug.mjs b/scripts/ci/resolve_clawhub_slug.mjs index 3be1c43..d49a4de 100644 --- a/scripts/ci/resolve_clawhub_slug.mjs +++ b/scripts/ci/resolve_clawhub_slug.mjs @@ -4,6 +4,7 @@ import path from "node:path"; import { collectDeclaredPlatforms, PLATFORM_KEYS } from "./skill_platforms.mjs"; const EXPLICIT_SLUGS = new Map([ + ["clawsec-suite", "clawsec"], ["openclaw-traffic-guardian", "clawsec-openclaw-traffic-guardian"], ["openclaw-audit-watchdog", "clawsec-openclaw-audit-watchdog"], ["soul-guardian", "clawsec-openclaw-soul-guardian"], @@ -43,14 +44,14 @@ export function resolveClawHubSlug({ name, platforms = [] }) { throw new Error(`Invalid skill name for ClawHub slug mapping: ${name}`); } - if (name.startsWith("clawsec-")) { - return name; - } - if (EXPLICIT_SLUGS.has(name)) { return EXPLICIT_SLUGS.get(name); } + if (name.startsWith("clawsec-")) { + return name; + } + if (PLATFORM_KEYS.some((platform) => name.startsWith(`${platform}-`))) { return `clawsec-${name}`; } diff --git a/scripts/test-skill-clawhub-slug.mjs b/scripts/test-skill-clawhub-slug.mjs index cfc6b69..286df16 100644 --- a/scripts/test-skill-clawhub-slug.mjs +++ b/scripts/test-skill-clawhub-slug.mjs @@ -14,7 +14,7 @@ const cases = [ ["picoclaw-traffic-guardian", ["picoclaw"], "clawsec-picoclaw-traffic-guardian"], ["clawtributor", ["openclaw", "nanoclaw", "hermes", "picoclaw"], "clawsec-clawtributor"], ["clawsec-feed", ["openclaw"], "clawsec-feed"], - ["clawsec-suite", ["openclaw"], "clawsec-suite"], + ["clawsec-suite", ["openclaw"], "clawsec"], ]; for (const [name, platforms, expected] of cases) { diff --git a/scripts/test-skill-release-workflow.mjs b/scripts/test-skill-release-workflow.mjs index f87276a..e85b2d1 100644 --- a/scripts/test-skill-release-workflow.mjs +++ b/scripts/test-skill-release-workflow.mjs @@ -5,12 +5,10 @@ const workflowPath = new URL('../.github/workflows/skill-release.yml', import.me const ciWorkflowPath = new URL('../.github/workflows/ci.yml', import.meta.url); const validateSkillInstallDocsPath = new URL('./ci/validate_skill_install_docs.mjs', import.meta.url); const installClawhubCliPath = new URL('./ci/install_clawhub_cli.sh', import.meta.url); -const patchClawhubPayloadPath = new URL('./ci/patch_clawhub_publish_payload.mjs', import.meta.url); const workflow = await readFile(workflowPath, 'utf8'); const ciWorkflow = await readFile(ciWorkflowPath, 'utf8'); const validateSkillInstallDocs = await readFile(validateSkillInstallDocsPath, 'utf8'); const installClawhubCli = await readFile(installClawhubCliPath, 'utf8'); -const patchClawhubPayload = await readFile(patchClawhubPayloadPath, 'utf8'); assert.match( workflow, @@ -341,18 +339,18 @@ assert.match( 'ClawHub publish must use the resolved ClawHub slug', ); +assert.match( + workflow, + /clawhub publish "\$SKILL_PATH"[\s\S]*--slug "\$CLAWHUB_SLUG"/, + 'ClawHub publish must use the resolved ClawHub slug', +); + assert.equal( workflow.match(/bash scripts\/ci\/install_clawhub_cli\.sh/g)?.length, 2, 'ClawHub publish and republish jobs must share the same pinned CLI installer', ); -assert.equal( - workflow.match(/node scripts\/ci\/patch_clawhub_publish_payload\.mjs/g)?.length, - 2, - 'ClawHub publish and republish jobs must share the same payload patch helper', -); - assert.doesNotMatch( workflow, /npm ci --prefix \.github\/clawhub-cli/, @@ -365,6 +363,12 @@ assert.doesNotMatch( 'ClawHub payload patching must not be duplicated inline in the workflow', ); +assert.doesNotMatch( + workflow, + /patch_clawhub_publish_payload\.mjs|Patch clawhub publish payload workaround/, + 'Current ClawHub CLI publish flow must not rely on the retired acceptLicenseTerms payload patch workaround', +); + for (const secret of ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN']) { assert.match( workflow, @@ -391,18 +395,6 @@ assert.match( 'ClawHub CLI installer must expose the pinned clawhub binary on GITHUB_PATH', ); -assert.match( - patchClawhubPayload, - /const payloadPattern = \/changelog,\\r\?\\n\(\\s\*\)tags,\/;/, - 'ClawHub payload patch helper must target the expected publish payload shape', -); - -assert.match( - patchClawhubPayload, - /acceptLicenseTerms: true/, - 'ClawHub payload patch helper must preserve the acceptLicenseTerms workaround', -); - assert.doesNotMatch( workflow, /clawhub inspect "\$SKILL_NAME" --version "\$VERSION" --json/,