Grades are a hygiene check, not a security guarantee.

Claude Code, Skill

Skills

Skills, a skill listed in the PlugVet directory.

Compatibility: Not stated.

Grade D

Two or more Medium findings, or a High. Only try it in a sandbox.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

INSTALL_LIFECYCLE_HOOK NETWORK_HOST_FROM_INPUT

Why this grade

  • INSTALL_LIFECYCLE_HOOK Medium

    A package install hook (preinstall, install, postinstall or prepare) runs a script.

    package.json, line 57 postinstall

  • NETWORK_HOST_FROM_INPUT Medium

    A file takes a URL or endpoint as input and has no fixed host list.

    clawhub/api-guide/SKILL.md, line 77 curl -X POST https://api.acedata.cloud/serp/google \

Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.

If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.

Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.

What was checked

Plain notes from the hygiene checks.

  • Permissions

    Concern

    can delete files.

    PERMISSION_DELETE_FILES

    scripts/build_clawhub_catalog.py, line 186

    commit = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=REPO, text=True).strip()

    scripts/build_clawhub_catalog.py, line 188

    dirty = subprocess.check_output(["git", "status", "--porcelain", "--untracked-files=all", "--", *inputs], cwd=REPO, text=True).strip()

    scripts/build_clawhub_catalog.py, line 205

    result = subprocess.run(command, text=True, capture_output=True)

    Show more

    scripts/publish_clawhub.py, line 17

    result = subprocess.run(args, cwd=cwd, text=True, capture_output=True)

    skills/apple-notes/scripts/notes.py, line 226

    proc = subprocess.run(

    skills/onepage-pdf/scripts/onepage_pdf.py, line 112

    subprocess.run(cmd, check=True, timeout=180,

    skills/onepage-pdf/scripts/onepage_pdf.py, line 283

    shutil.rmtree(workdir, ignore_errors=True)

    skills/telegram/scripts/tg.py, line 72

    os.remove(path)

    skills/tencentcloud-tke/SKILL.md, line 133

    return subprocess.run(

    skills/tencentcloud-tke/scripts/tke.py, line 214

    result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)

  • Install and update

    Concern

    runs a script at install time.

    INSTALL_LIFECYCLE_HOOK

    package.json, line 57

    postinstall

  • Network

    Serious

    accepts a host from input, with no fixed list in this file.

    NETWORK_HOST_FROM_INPUT

    clawhub/api-guide/SKILL.md, line 77

    curl -X POST https://api.acedata.cloud/serp/google \

    scripts/build_clawhub_catalog.py, line 158

    tibility:.*$", "compatibility: Requires curl and an Ace service API key. OpenClaw nat

    skills/_shared/async-tasks.md, line 13

    curl -X POST https://api.acedata.cloud/<service>/<resource> \

    Show more

    skills/_shared/async-tasks.md, line 27

    curl -X POST https://api.acedata.cloud/<service>/tasks \

    skills/_shared/async-tasks.md, line 36

    curl -X POST https://api.acedata.cloud/<service>/tasks \

    skills/_shared/authentication.md, line 48

    curl -X POST https://api.acedata.cloud/<endpoint> \

    skills/acedatacloud/SKILL.md, line 55

    curl -H "authorization: Bearer $ACEDATACLOUD_PLATFORM_TOKEN" \

    skills/acedatacloud/SKILL.md, line 139

    curl -H "authorization: Bearer $ACEDATACLOUD_PLATFORM_TOKEN" \

    skills/acedatacloud/scripts/acedatacloud.py, line 57

    with urllib.request.urlopen(req, timeout=args.timeout) as resp:

    skills/ai-chat/SKILL.md, line 41

    curl -X POST https://api.acedata.cloud/aichat2/conversations \

    skills/ai-chat/SKILL.md, line 180

    curl -X POST https://api.acedata.cloud/v1/messages \

    skills/bilibili/scripts/bilibili.py, line 143

    with urllib.request.urlopen(req, timeout=30) as resp:

    skills/bilibili/scripts/bilibili.py, line 414

    with urllib.request.urlopen(req, timeout=60) as r:

    skills/blogger/SKILL.md, line 30

    curl -sS -H "Authorization: Bearer $GOOGLE_BLOGGER_TOKEN" \

    skills/blogger/SKILL.md, line 47

    | curl -sS -X POST \

    skills/cos-upload/SKILL.md, line 18

    curl -s -X POST https://platform.acedata.cloud/api/v1/files/ \

    skills/personal-wechat/scripts/personal_wechat.py, line 58

    with urllib.request.urlopen(req, timeout=45) as response:

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    scripts/build_clawhub_catalog.py, line 70

    也可以只在 `~/.openclaw/.env` 设置 `ACEDATACLOUD_API_TOKEN=你的服务密钥`。选择一种方式,保护文件权限(例如 `chmod 600`),重启 Gateway 并开始新会话。

    scripts/build_clawhub_catalog.py, line 126

    _TOKEN=your_service_key` in `~/.openclaw/.env`. Choose one method, protect file permi

    skills/_shared/tencentcloud.md, line 34

    set -a; source .env; set +a

    Show more

    skills/_shared/wecom.md, line 59

    set -a; source .env; set +a

    skills/acedatacloud/scripts/acedatacloud.py, line 47

    token = args.token or os.environ.get("ACEDATACLOUD_PLATFORM_TOKEN", "")

    skills/cnblogs/scripts/cnblogs.py, line 48

    token = os.environ.get("CNBLOGS_TOKEN", "").strip()

    skills/didi-ride/scripts/didi.py, line 34

    MCP_KEY = os.environ.get("DIDI_MCP_KEY", "").strip()

    skills/discord/scripts/discord_user.py, line 54

    tok = os.environ.get("DISCORD_USER_TOKEN")

    skills/discordbot/scripts/discordbot.py, line 61

    token = os.environ.get("DISCORDBOT_TOKEN", "").strip()

    skills/ghost/scripts/ghost.py, line 55

    key = os.environ.get("GHOST_ADMIN_API_KEY", "").strip()

    skills/kuaishou/scripts/kuaishou.py, line 58

    token = os.environ.get("KUAISHOU_TOKEN", "").strip()

    skills/linkedin-company-page/scripts/linkedin_company_page.py, line 70

    token = os.environ.get("LINKEDIN_COMPANY_PAGE_TOKEN", "")

    README.md, line 36

    Follow the selected service's guide: **Ace registration/sign-in → Applications / General application → check service access, balance and current price → copy or create a dedicated

    README.md, line 72

    Put this line in `~/.openclaw/.env` on the machine running the OpenClaw Gateway, replacing the placeholder with your key:

    README.md, line 78

    OpenClaw [loads this global `.env` file](https://docs.openclaw.ai/help/faq/env-vars#how-does-openclaw-load-environment-variables) even when its Gateway runs as a service. Restart t

    claude-plugins/gpt-image-by-ace-data-cloud/README.md, line 34

    Enable the plugin. In `/plugin` → **Installed** → **gpt-image-by-ace-data-cloud** → **Configure options**, paste the raw token into **Ace Data Cloud API Token**. Current Claude plu

  • Agent instructions

    Pass

    No instruction to ignore earlier instructions or to hide a step.

  • Obfuscation

    Pass

    No encoded or minified payload found.

  • Licence

    Pass

    A licence file is present (LICENSE).

  • Maintainer activity

    Pass

    The latest commit is within the last 365 days.

Note

Hygiene check of commit c3d1703f0bc9. can delete files. runs a script at install time. accepts a host from input, with no fixed list in this file. reads a credential or environment file.

Date and source

Date checked:

View source

github.com

Commit graded: c3d1703f0bc9a76c9cd9a1a8efc3a0a63b2edd36

This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.

Read how this letter is chosen