docs: document trusted skill symlink targets

This commit is contained in:
Peter Steinberger
2026-05-09 14:59:27 +01:00
parent b21414e49e
commit 50cb027a88
3 changed files with 95 additions and 0 deletions

View File

@@ -447,6 +447,7 @@ Save to `~/.openclaw/openclaw.json` and you can DM the bot from that number.
allowBundled: ["gemini", "peekaboo"],
load: {
extraDirs: ["~/Projects/agent-scripts/skills"],
allowSymlinkTargets: ["~/Projects/agent-scripts/skills"],
},
install: {
preferBrew: true,
@@ -464,6 +465,26 @@ Save to `~/.openclaw/openclaw.json` and you can DM the bot from that number.
}
```
### Symlinked sibling skill repo
Use this when a built-in skill root contains a symlink into a sibling repo, for
example `~/.agents/skills/manager -> ~/Projects/manager/skills`.
```json5
{
skills: {
load: {
extraDirs: ["~/Projects/manager/skills"],
allowSymlinkTargets: ["~/Projects/manager/skills"],
},
},
}
```
- `extraDirs` scans the sibling repo as an explicit skill root.
- `allowSymlinkTargets` lets symlinked skill folders resolve into that trusted
real target root without allowing arbitrary symlink escapes.
## Common patterns
### Shared skill baseline with one override

View File

@@ -62,6 +62,53 @@ openclaw config get meta.lastTouchedVersion
For intentional downgrade or emergency recovery only, set `OPENCLAW_ALLOW_OLDER_BINARY_DESTRUCTIVE_ACTIONS=1` for the single command. Leave it unset for normal operation.
</Warning>
## Skill symlink skipped as path escape
Use this when logs include:
```text
Skipping escaped skill path outside its configured root: ... reason=symlink-escape
```
OpenClaw treats every skill root as a containment boundary. A symlink under
`~/.agents/skills`, `<workspace>/.agents/skills`, `<workspace>/skills`, or
`~/.openclaw/skills` is skipped when its real target resolves outside that root
unless the target is explicitly trusted.
Inspect the link:
```bash
ls -l ~/.agents/skills/<name>
realpath ~/.agents/skills/<name>
openclaw config get skills.load
```
If the target is intentional, configure both the direct skill root and the
allowed symlink target:
```json5
{
skills: {
load: {
extraDirs: ["~/Projects/manager/skills"],
allowSymlinkTargets: ["~/Projects/manager/skills"],
},
},
}
```
Then start a new session or wait for the skills watcher to refresh. Restart the
gateway if the running process predates the config change.
Do not use broad targets such as `~`, `/`, or a whole synced project folder.
Keep `allowSymlinkTargets` scoped to the real skill root that contains trusted
`SKILL.md` directories.
Related:
- [Skills config](/tools/skills-config#symlinked-sibling-repos)
- [Configuration examples](/gateway/configuration-examples#symlinked-sibling-skill-repo)
## Anthropic 429 extra usage required for long context
Use this when logs/errors include: `HTTP 429: rate_limit_error: Extra usage is required for long context requests`.

View File

@@ -107,6 +107,33 @@ Rules:
- `agents.list[].skills`: optional per-agent final skill allowlist; explicit
lists replace inherited defaults instead of merging.
## Symlinked sibling repos
By default, each skill root is a containment boundary. If a skill folder under
`~/.agents/skills` is a symlink that resolves outside `~/.agents/skills`,
OpenClaw skips it and logs `Skipping escaped skill path outside its configured
root`.
Keep the symlink layout and allow only the trusted target root:
```json5
{
skills: {
load: {
extraDirs: ["~/Projects/manager/skills"],
allowSymlinkTargets: ["~/Projects/manager/skills"],
},
},
}
```
With this config, a symlink such as
`~/.agents/skills/manager -> ~/Projects/manager/skills` is accepted after
realpath resolution. `extraDirs` also scans the sibling repo directly, while
`allowSymlinkTargets` preserves the symlinked path for existing agent-skill
layouts. Keep target entries narrow; do not point at broad roots such as `~` or
`~/Projects` unless every skill tree under that root is trusted.
Per-skill fields:
- `enabled`: set `false` to disable a skill even if it's bundled/installed.