Skip to content

[Bug]: Plugin manifest skills field not published to agent skill discovery paths #77296

@100yenadmin

Description

@100yenadmin

Bug type

Behavior bug (incorrect output/state without crash)

Beta release blocker

No

Summary

When a plugin manifest declares "skills": [...], those skills are not published to the global skill-discovery paths the agent SDK reads from (~/.agents/skills/ and ~/.openclaw/skills/). The agent gets ENOENT when it tries to read the SKILL.md, so plugin tools that depend on the SKILL.md prompt never appear in the agent's tool palette.

Steps to reproduce

  1. Install a plugin that declares skills in its manifest. Example: lossless-claw at ~/.openclaw/extensions/lossless-claw/ with openclaw.plugin.json:
    {
      "id": "lossless-claw",
      "kind": "context-engine",
      "skills": ["skills/lossless-claw"]
    }
  2. Confirm the actual SKILL.md exists on disk: ~/.openclaw/extensions/lossless-claw/skills/lossless-claw/SKILL.md (a real 3275-byte file).
  3. Start a session. The agent (running inside the gateway) tries to load the LCM skill using the agent SDK convention path ~/.agents/skills/lossless-claw/SKILL.md.
  4. Observe gateway log:
    [tools] read failed: ENOENT: no such file or directory, access '/Users/lume/.agents/skills/lossless-claw/SKILL.md' raw_params={"path":"/Users/lume/.agents/skills/lossless-claw/SKILL.md"}
    
  5. Confirm neither ~/.agents/skills/lossless-claw/ nor ~/.openclaw/skills/lossless-claw/ exists. The plugin's skill is unreachable from the agent.

Expected behavior

When a plugin manifest declares "skills": [...], OpenClaw's plugin loader should publish those skills so the agent SDK can find them — for example by symlinking into ~/.openclaw/skills/<skill-id>/, by registering them into the agent skill-discovery search path, or by some equivalent mechanism. This is what the manifest.skills field implies.

The same pattern affects every stock plugin that ships skills (browser, memory-wiki, tavily, open-prose, irc, matrix, telegram, slack) — none of them appear under ~/.agents/skills/ or ~/.openclaw/skills/ either, so the same defect blocks any plugin from shipping a usable skill.

Actual behavior

The plugin's tools (e.g. lcm_grep, lcm_describe, lcm_expand, lcm_expand_query, lcm_recent for lossless-claw) are correctly registered at runtime, but the SKILL.md is unreachable. As a result the agent never reads the skill prompt, so:

  • The plugin's tools don't surface in the agent's tool palette.
  • The agent appears to "not know about" tools that are actually registered.
  • The user only sees a confusing ENOENT in gateway logs (if they look).

The manifest skills field is effectively dead — declared but unreachable.

Looking at src/agents/skills/plugin-skills.ts, resolvePluginSkillDirs() returns the resolved on-disk paths inside the plugin root, but those paths are never published to the agent SDK's discovery paths. Issue #64816 (closed by bc24b547d088) wired plugin skills into the workspace skill snapshot for <available_skills> prompt rendering, but the agent SDK file-based discovery paths (~/.agents/skills/, ~/.openclaw/skills/) are still not populated, which is why the agent-side ENOENT still fires.

OpenClaw version

2026.5.3-1 (2eae30e)

Operating system

macOS 25.4.0 (Darwin arm64)

Install method

npm global

Model

anthropic/claude-opus-4.5 (effective for the failing agent run)

Provider / routing chain

openclaw -> anthropic

Logs, screenshots, and evidence

[tools] read failed: ENOENT: no such file or directory, access '/Users/lume/.agents/skills/lossless-claw/SKILL.md' raw_params={"path":"/Users/lume/.agents/skills/lossless-claw/SKILL.md"}

Filesystem state confirming the manifest declares the skill but the discovery path is empty:

$ cat ~/.openclaw/extensions/lossless-claw/openclaw.plugin.json | jq '.skills'
[
  "skills/lossless-claw"
]

$ ls ~/.openclaw/extensions/lossless-claw/skills/lossless-claw/SKILL.md
~/.openclaw/extensions/lossless-claw/skills/lossless-claw/SKILL.md   (3275 bytes)

$ ls ~/.agents/skills/lossless-claw/SKILL.md
ls: cannot access '~/.agents/skills/lossless-claw/SKILL.md': No such file or directory

$ ls ~/.openclaw/skills/ | grep lossless-claw
(no result — the entry that does exist is a manual user symlink, not auto-published)

Impact and severity

Affected: every plugin that declares "skills" in openclaw.plugin.json — confirmed for lossless-claw and all stock plugins that ship skills (browser, memory-wiki, tavily, open-prose, irc, matrix, telegram, slack).

Severity: High. Plugin-shipped skill prompts never reach the agent, so any tool palette that depends on the SKILL.md is silently incomplete. The plugin appears installed and tools are registered, but the agent does not behave as documented.

Frequency: Always (every session, for every plugin that ships skills).

Consequence: Plugin authors cannot reliably ship a skill alongside their plugin. Users hit confusing symptoms — tools registered but agent unaware — with the only signal being an ENOENT line in gateway logs. Manual workaround: symlink each plugin's skill directory into ~/.openclaw/skills/, which defeats the purpose of the manifest field.

Additional information

Suggested fixes (any one would resolve the user-visible defect):

  1. Auto-publish plugin-declared skills into ~/.openclaw/skills/<skill-id>/ (symlink) at plugin registration time. Preferred — single source of truth, no API change.
  2. Extend the agent SDK's skill-discovery search path at registration time to include each enabled plugin's <plugin>/skills/ directory.
  3. If manifest.skills is intentionally informational only, document that explicitly and give plugin authors a supported install hook to publish skills themselves.

Related: #64816 (closed) addressed CLI-vs-<available_skills> parity for bundled plugin skills. This issue is the remaining gap on the agent SDK file-discovery side.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions