guardskills
v1.2.1
Published
Security wrapper around skills add
Maintainers
Readme
guardskills
guardskills is a security wrapper around skill installation CLIs (skills, playbooks, openskills, skillkit).
GitHub: https://github.com/felixondesk/guardskills
Instead of:
npx skills add https://github.com/vercel-labs/skills --skill find-skillsuse:
npx guardskills add https://github.com/vercel-labs/skills --skill find-skillsOr provider-prefixed wrappers:
npx guardskills skills add https://github.com/vercel-labs/skills --skill find-skills
npx guardskills skills add planetscale/database-skills
npx guardskills playbooks add skill anthropics/skills --skill frontend-design
npx guardskills openskills install anthropics/skills frontend-design
npx guardskills openskills install anthropics/skills
npx guardskills skillkit install rohitg00/skillkit dev-tools
npx guardskills skillkit install rohitg00/skillkitWhat It Does
- Resolves a skill from GitHub.
- Scans resolved files for malicious patterns.
- Computes a risk decision (
SAFE,WARNING,UNSAFE,CRITICAL,UNVERIFIABLE). - Proceeds to the selected installer CLI only if gate policy allows.
Security Notice
guardskills is an additional security layer on top of skills.sh, not a replacement for your own review process.
guardskillsdoes not maintain, control, or guarantee the safety ofskills.shor third-party skill repositories.- Static analysis reduces risk but cannot detect every threat.
- A
SAFEresult means "no known high-risk pattern detected," not "guaranteed safe."
Current Readiness
- Current stage: stable (v1.2.1).
- Suitable for production use with standard security review practices.
Implemented Features
guardskills add <repo> --skill <name>(legacy alias forguardskills skills add)guardskills skills add <repo> --skill <name>guardskills skills add <repo>(scan all discovered skills, then skills.sh interactive selection)guardskills playbooks add skill <repo> --skill <name>guardskills openskills install <repo> <skill>guardskills openskills install <repo>(scan all discovered skills, then openskills interactive selection)guardskills skillkit install <repo> <skill>guardskills skillkit install <repo>(scan all discovered skills, then skillkit install flow)guardskills scan-local <path>guardskills scan-clawhub <identifier>- GitHub resolver (
owner/repoandhttps://github.com/...) - Deterministic static scanner with rule matrix in
RULES.md - Score-based decision engine with hard-block guardrails
- Gate controls:
--yes(accept warning)--force(accept unsafe)--allow-unverifiable
- Modes:
--dry-run(scan + decision only)--ci(deterministic gate mode, no install handoff)
- Config file support:
- auto-load
guardskills.config.jsonfrom current directory - or specify explicit path with
--config <path>
- auto-load
- Resolver safety controls:
--github-timeout-ms--github-retries--github-retry-base-ms--max-file-bytes--max-aux-files--max-total-files
- Installer handoff to
npx skills|playbooks|openskills|skillkit ...when allowed - Structured resolver error taxonomy + retry/backoff
- Tests:
- fixture scanner tests (
safe,warning,malicious,prose-only) - gate behavior tests
- command install-handoff integration tests
- fixture scanner tests (
- Release hardening baseline:
.github/workflows/ci.yml.github/workflows/release.yml(npm provenance publish)SECURITY.md
False-Positive Controls
- Markdown is scanned as executable content only:
- fenced code blocks
- command-like inline snippets
- command-style lines
- Prose-only markdown is ignored for high-risk matching.
Quick Start
Install dependencies and validate:
npm install
npm run ci
npm run audit:prodScan Skills by Source
Use this section as the clean reference for supported scan sources.
1. Local Skills
Scan a skill folder on disk:
guardskills scan-local C:\path\to\skill-folderIf the path contains multiple skills:
guardskills scan-local C:\path\to\skills --skill <skill-folder-name>JSON output:
guardskills scan-local C:\path\to\skill-folder --json2. GitHub Skills
Scan a GitHub-hosted skill without installing:
guardskills add owner/repo --skill <skill-name> --dry-runAlso supported:
guardskills add https://github.com/owner/repo --skill <skill-name> --dry-runCI/machine-readable output:
guardskills add owner/repo --skill <skill-name> --ci --json3. skills.sh Skills
For skills.sh installs, run the same guarded GitHub scan flow first:
guardskills add owner/repo --skill <skill-name> --dry-runThen, only if acceptable, run the guarded install handoff:
guardskills add owner/repo --skill <skill-name>Never run skills add ... directly before guardskills.
4. ClawHub Skills
Scan by ClawHub identifier:
guardskills scan-clawhub owner/skill-slugScan by full ClawHub link:
guardskills scan-clawhub https://clawhub.ai/owner/skill-slugJSON output:
guardskills scan-clawhub https://clawhub.ai/owner/skill-slug --jsonResolver Controls
guardskills add owner/repo --skill name \
--github-timeout-ms 15000 \
--github-retries 2 \
--github-retry-base-ms 300 \
--max-file-bytes 250000 \
--max-aux-files 40 \
--max-total-files 120Configuration File
guardskills supports repository-local policy and default settings via guardskills.config.json.
- Default lookup:
./guardskills.config.json - Explicit path:
--config <path> - CLI flags always override config values.
Starter template:
{
"defaults": {
"strict": false,
"ci": false,
"json": false,
"yes": false,
"dryRun": false,
"force": false,
"allowUnverifiable": false
},
"resolver": {
"githubTimeoutMs": 15000,
"githubRetries": 2,
"githubRetryBaseMs": 300,
"maxFileBytes": 250000,
"maxAuxFiles": 40,
"maxTotalFiles": 120
},
"policy": {
"allowForce": true,
"allowUnverifiableOverride": true,
"allowedOwners": [],
"blockedOwners": [],
"allowedRepos": [],
"blockedRepos": []
}
}Template files are included as:
guardskills.config.json(baseline default)guardskills.config.example.json(copy/reference template)
OpenClaw Bot Instructions
Use this section as instructions for OpenClaw so it runs guardskills before installing any skill.
Purpose
guardskills is a security gate for skill installs. It scans skill content first, then decides if install should proceed.
Rule for OpenClaw
Before any skill install, always run a guardskills scan first.
1. Local Skills
guardskills scan-local <path-to-skill-folder>If multiple skills are found:
guardskills scan-local <path-to-skills-root> --skill <skill-folder-name>2. GitHub Skills
guardskills add owner/repo --skill <skill-name> --dry-runAlso supported:
guardskills add https://github.com/owner/repo --skill <skill-name> --dry-run3. skills.sh Skills
Use the same guarded GitHub flow before install:
guardskills add owner/repo --skill <skill-name> --dry-runIf allowed:
guardskills add owner/repo --skill <skill-name>4. ClawHub Skills
Use scan-clawhub with either identifier or full URL:
guardskills scan-clawhub owner/skill-slugguardskills scan-clawhub https://clawhub.ai/owner/skill-slugFor machine output:
guardskills scan-clawhub https://clawhub.ai/owner/skill-slug --jsonIf the ClawHub API does not expose GitHub source metadata, guardskills falls back to scanning the downloadable ClawHub archive payload.
How OpenClaw Should Interpret Results
SAFE: proceed.WARNING: require confirmation before proceed (or explicit--yesbehavior).UNSAFE: block unless user explicitly asks for override (--force).CRITICAL: block.UNVERIFIABLE: block unless user explicitly allows override (--allow-unverifiable).
Recommended Install Workflow
- Run scan for source type:
guardskills add owner/repo --skill <skill-name> --dry-runor
guardskills scan-local <path>or
guardskills scan-clawhub https://clawhub.ai/owner/skill-slug- Only if decision is acceptable, run install through guardskills (GitHub/skills.sh flow):
guardskills add owner/repo --skill <skill-name>Do not run skills add directly first.
Copy/Paste Bot Instruction Block
Before installing any skill, always run guardskills first.
For local skills, run: guardskills scan-local <path>
For GitHub or skills.sh skills, run: guardskills add owner/repo --skill <skill-name> --dry-run
For ClawHub skills, run: guardskills scan-clawhub <owner/slug-or-full-url>
If SAFE, proceed.
If WARNING, ask for confirmation.
If UNSAFE/CRITICAL, block.
If UNVERIFIABLE, block unless user explicitly requests override.
Never run skills add directly before a guardskills check.Exit Codes
0: allowed/success10: warning not confirmed20: blocked (UNSAFE,CRITICAL, orUNVERIFIABLEwithout override)30: runtime/internal error
Scoring Logic (v3)
Two-layer model:
- Hard-block guardrails
- Weighted risk score (
0-100)
Formula:
risk_score = clamp(
sum(base_points * confidence_multiplier)
+ chain_bonuses
- trust_credits,
0, 100
)Severity base points:
CRITICAL = 50HIGH = 25MEDIUM = 12LOW = 5INFO = 0
Confidence multipliers:
high = 1.0medium = 0.7low = 0.4
Standard thresholds:
0-29 SAFE30-59 WARNING60-79 UNSAFE80-100 CRITICAL
Strict thresholds (--strict):
0-19 SAFE20-39 WARNING40-59 UNSAFE60-100 CRITICAL
UNVERIFIABLE is non-scored and blocked by default unless --allow-unverifiable.
References
RULES.md(scanner matrix, chain bonuses, tuning workflow)PROJECT_PLAN.md(project roadmap)PRODUCTION_READINESS.md(production checklist/status)SECURITY.md(vulnerability reporting policy)
Support this project: https://buymeacoffee.com/felixondess

