Install
openclaw skills install skills-forgeDetect repeated capability gaps, convert recurring user needs into candidate skills, scaffold new OpenClaw-compatible skills, and validate them before installation. Use when an agent repeatedly fails the same task, sees recurring feature requests, notices repetitive manual workflows, or wants to propose a new skill instead of solving the same problem ad hoc.
openclaw skills install skills-forgeUse this skill to turn repeated demand into a reviewed skill candidate.
Current version: v1.4.0 "Evolve First".
.learnings, and feature requests.academic, product, integration, script, or workflow.SKILL.md, agents/openai.yaml, and profile-specific resources.scripts/skill_forge.py) so agents can run doctor checks, demos, forge flows, evolution, feedback capture, replay, and release gates from one entry point.Use this skill when the user or agent mentions:
--prefer-evolve is set, route the opportunity through decide_skill_action.py first; if it matches an installed skill, evolve that skill instead of forging a new one.Keep this SKILL.md focused on the operating path. Load bundled references only when the current task needs them:
references/heuristics.md when deciding whether a repeated need deserves a skill.references/skill-quality-rubric.md when reviewing candidate quality or explaining a validation score.references/milestone-architecture.md when changing install gates, replay gates, or evolution flow.references/forge-console.md when using or modifying the product console.Use medium freedom for planning and candidate design, but low freedom for install, uninstall, release checks, signed approval, replay regression, and file mutation paths.
Prefer the product console for normal use:
python3 {baseDir}/scripts/skill_forge.py doctor --json
python3 {baseDir}/scripts/skill_forge.py demo --json
python3 {baseDir}/scripts/skill_forge.py forge --output ./generated --install plan --json
python3 {baseDir}/scripts/skill_forge.py release-check --json
From the source repository, make package-check runs the same release gate plus secret scanning.
Use lower-level scripts only when a workflow needs exact control over one stage.
Run:
python3 {baseDir}/scripts/detect_skill_opportunities.py --json
Add --source paths when a specific workspace or learnings file should be analyzed.
After detect, ask whether the opportunity should evolve an existing installed skill or forge a new one. Use this to prevent skill sprawl when a request is really just a new trigger surface for something the user already installed.
python3 {baseDir}/scripts/skill_forge.py decide \
--skill-name "literature-review-helper" \
--triggers "APA format, MLA format, literature review, source metadata" \
--template academic \
--reason "user keeps asking for APA literature reviews" \
--json
Output is one of evolve / forge / ambiguous plus per-candidate fitness scores. To run the full pipeline with auto-routing, pass --prefer-evolve to forge:
python3 {baseDir}/scripts/skill_forge.py forge \
--output ./generated --install plan --prefer-evolve --json
Profile mismatch is a hard gate (fitness 0). The replay non-regression gate downstream catches any mis-routed evolution that would degrade the installed baseline.
Only create a skill when the pattern is:
If the need is too narrow, keep it as a note or workflow rule instead.
Run:
python3 {baseDir}/scripts/generate_skill_scaffold.py \
--skill-name my-skill \
--output ./generated \
--goal "What the skill should achieve." \
--triggers "keyword1, keyword2" \
--template auto
Run:
python3 {baseDir}/scripts/validate_skill_candidate.py ./generated/my-skill
Plan only (safe to run anywhere, no Telegram, no secrets):
python3 {baseDir}/scripts/propose_skill_install.py ./generated/my-skill --json
--apply is gated by a signed approval token. Direct invocation without a token is blocked. Use the full pipeline (forge_pipeline.py --install telegram) for the normal install path, or call telegram_approval.py first and pass its approval_token to propose_skill_install.py --apply --approval-token <token>. The token is HMAC-bound to the skill name, target path, install method, source path, and a hash of the source directory's contents, so any post-approval edit invalidates it. Token issuance and install apply both require the source to be an existing skill directory containing SKILL.md.
Run:
python3 {baseDir}/scripts/record_skill_feedback.py \
--skill my-skill \
--agent-name StudyAgent \
--rating negative \
--feedback "触发词: literature review. The skill should handle literature review planning better." \
--json
Run:
python3 {baseDir}/scripts/evolve_skill_pipeline.py \
--skill my-skill \
--output ./generated-updates \
--install plan \
--replay hidden \
--min-replay-improvement 0 \
--agent-name StudyAgent \
--json
When an installed copy of my-skill exists under --target-root, the candidate and the installed baseline are scored against the same redacted replay cases. The pipeline blocks the install when candidate_score - baseline_score < --min-replay-improvement (default 0, i.e. no regression). Pass --min-replay-improvement -100 to disable the regression check.
Run:
python3 {baseDir}/scripts/replay/collect_replay_cases.py \
--feedback-file ~/.openclaw/workspace/.learnings/skill-feedback.jsonl \
--skill my-skill \
--json
python3 {baseDir}/scripts/replay/run_replay_eval.py \
--skill-dir ./generated-updates/my-skill \
--skill my-skill \
--json
Somnia is now packaged as its own skill for scheduled maintenance. These compatibility commands remain available from Skill Forge:
python3 {baseDir}/scripts/nightly_skill_review.py \
--scope managed \
--propose-updates \
--replay hidden \
--update-install plan \
--json
Install a macOS daily sleep-hour schedule, defaulting to 03:00 local time:
python3 {baseDir}/scripts/schedule_nightly_review.py \
--hour 3 \
--minute 0 \
--scope managed \
--propose-updates \
--update-install plan \
--apply \
--json
Use --telegram-report with --env-file ~/.openclaw/skill-forge.env when scheduled runs should send a summary report to Telegram. The env file should define TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID.
Uninstall or rollback a generated skill. Like install, --uninstall --apply requires a signed approval token issued by telegram_approval.py for the same skill, target, and method. Plan-only (no --apply) works without a token and just prints what would happen:
# Plan (no token, no mutation)
python3 {baseDir}/scripts/propose_skill_install.py my-skill --uninstall --json
# Apply (requires a fresh approval token bound to the same skill/target/method)
python3 {baseDir}/scripts/install/telegram_approval.py \
--skill my-skill \
--profile workflow \
--validation-score 100 --validation-grade milestone \
--evaluation-score 100 --evaluation-passed \
--target "$HOME/.openclaw/workspace/skills/my-skill" \
--method symlink \
--json > approval.json
APPROVAL_TOKEN="$(python3 -c 'import json; print(json.load(open("approval.json"))["approval_token"])')"
python3 {baseDir}/scripts/propose_skill_install.py my-skill \
--uninstall --apply \
--approval-token "$APPROVAL_TOKEN" \
--restore-backup \
--json
For one-shot operation:
python3 {baseDir}/scripts/forge_pipeline.py \
--source ~/.openclaw/workspace/.learnings/FEATURE_REQUESTS.md \
--source ~/.openclaw/workspace/.learnings/ERRORS.md \
--output ./generated \
--eval hidden \
--json
Ask through Telegram before installing:
export TELEGRAM_BOT_TOKEN="..."
export TELEGRAM_CHAT_ID="..."
python3 {baseDir}/scripts/forge_pipeline.py \
--source ~/.openclaw/workspace/.learnings/FEATURE_REQUESTS.md \
--source ~/.openclaw/workspace/.learnings/ERRORS.md \
--output ./generated \
--install telegram \
--agent-name StudyAgent \
--json
references/ when the skill mainly teaches structure and judgment.scripts/ when the same code would otherwise be rewritten repeatedly.--install plan; use --install telegram for any mutation.--install ask and --install auto as blocked compatibility aliases.propose_skill_install.py --apply directly; --apply requires a signed approval token issued by telegram_approval.py and bound to the skill name, target, method, source path, and source content hash. The HMAC secret is SKILL_FORGE_APPROVAL_SECRET if set, otherwise derived from the bot token. Tokens default to a 30-minute TTL.mode=dry-run) cannot mutate state. The pipeline reports install_status=dry-run-blocked and only --allow-dry-run-install on the install script lets it through, in which case the audit field is approved_by=dry-run.--eval hidden for user-facing flows so simulated checks and prompts are not exposed.--agent-name before installation when a specific agent will receive the skill.score - baseline < --min-replay-improvement (default 0). Use --min-replay-improvement -100 to disable. When no installed baseline exists the gate falls back to a single-skill coverage check.managed; use --scope all only for explicit full inventory audits.The skill-forge output should include:
Before proposing installation, confirm:
grade=milestone is preferred before sharing externallyRead references/skill-quality-rubric.md when evaluating a draft.
References:
references/heuristics.mdreferences/skill-quality-rubric.mdreferences/milestone-architecture.mdreferences/forge-console.mdScripts:
scripts/detect_skill_opportunities.pyscripts/evaluate_skill_candidate.pyscripts/generate_skill_scaffold.pyscripts/validate_skill_candidate.pyscripts/forge_pipeline.pyscripts/skill_forge.pyscripts/install/propose_skill_install.pyscripts/install/telegram_approval.pyscripts/evolve/evolve_skill_pipeline.pyscripts/evolve/propose_skill_update.pyscripts/evolve/record_skill_feedback.pyscripts/replay/collect_replay_cases.pyscripts/replay/compare_replay_outputs.pyscripts/replay/redact_replay_case.pyscripts/replay/replay_report.pyscripts/replay/run_replay_eval.pyscripts/somnia/nightly_skill_review.pyscripts/somnia/schedule_nightly_review.pyCompatibility wrappers:
scripts/propose_skill_install.pyscripts/telegram_approval.pyscripts/evolve_skill_pipeline.pyscripts/propose_skill_update.pyscripts/record_skill_feedback.pyscripts/nightly_skill_review.pyscripts/schedule_nightly_review.py