Skills
การกำหนดค่า Skills
การกำหนดค่าส่วนใหญ่ของสกิลอยู่ใต้ skills ใน
~/.openclaw/openclaw.json การมองเห็นเฉพาะเอเจนต์อยู่ใต้
agents.defaults.skills และ agents.list[].skills.
{ skills: { allowBundled: ["gemini", "peekaboo"], load: { extraDirs: ["~/Projects/agent-scripts/skills"], allowSymlinkTargets: ["~/Projects/manager/skills"], watch: true, watchDebounceMs: 250, }, install: { preferBrew: true, nodeManager: "npm", allowUploadedArchives: false, }, workshop: { autonomous: { enabled: false }, allowSymlinkTargetWrites: false, approvalPolicy: "pending", maxPending: 50, maxSkillBytes: 40000, }, entries: { "image-lab": { enabled: true, apiKey: { source: "env", provider: "default", id: "GEMINI_API_KEY" }, env: { GEMINI_API_KEY: "GEMINI_KEY_HERE" }, }, peekaboo: { enabled: true }, sag: { enabled: false }, }, },}การโหลด (skills.load)
skills.load.extraDirsstring[]ไดเรกทอรีสกิลเพิ่มเติมที่จะสแกน โดยมีลำดับความสำคัญต่ำที่สุด (หลังสกิลที่บันเดิลมา
และสกิลจาก Plugin) พาธจะถูกขยายโดยรองรับ ~
skills.load.allowSymlinkTargetsstring[]ไดเรกทอรีเป้าหมายจริงที่เชื่อถือได้ ซึ่งโฟลเดอร์สกิลที่เป็น symlink อาจ resolve ไปหาได้
แม้ symlink จะอยู่นอก root ที่กำหนดค่าไว้ ใช้ค่านี้สำหรับเลย์เอาต์ sibling repo
ที่ตั้งใจไว้ เช่น
<workspace>/skills/manager -> ~/Projects/manager/skills จำกัดรายการนี้ให้แคบ
อย่าชี้ไปยัง root กว้าง ๆ เช่น ~ หรือ ~/Projects
skills.load.watchbooleandefault: trueเฝ้าดูโฟลเดอร์สกิลและรีเฟรช snapshot ของสกิลเมื่อไฟล์ SKILL.md
เปลี่ยนแปลง ครอบคลุมไฟล์ซ้อนภายใน root ของสกิลแบบกลุ่ม
skills.load.watchDebounceMsnumberdefault: 250หน้าต่าง debounce สำหรับเหตุการณ์ watcher ของสกิล หน่วยเป็นมิลลิวินาที
การติดตั้ง (skills.install)
skills.install.preferBrewbooleandefault: trueเลือกใช้ตัวติดตั้ง Homebrew เมื่อมี brew
skills.install.nodeManager"npm" | "pnpm" | "yarn" | "bun"default: "npm"ค่ากำหนดตัวจัดการแพ็กเกจ Node สำหรับการติดตั้งสกิล ค่านี้มีผลเฉพาะกับการติดตั้งสกิลเท่านั้น
runtime ของ Gateway ยังควรใช้ Node (ไม่แนะนำ Bun
สำหรับ WhatsApp/Telegram) ใช้ openclaw setup --node-manager สำหรับ npm, pnpm,
หรือ bun; ตั้งค่า "yarn" ด้วยตนเองสำหรับการติดตั้งสกิลที่อิง Yarn
skills.install.allowUploadedArchivesbooleandefault: falseอนุญาตให้ไคลเอนต์ Gateway operator.admin ที่เชื่อถือได้ติดตั้งไฟล์ zip
ส่วนตัวที่ staging ผ่าน skills.upload.* การติดตั้ง ClawHub ปกติไม่จำเป็นต้องใช้
การตั้งค่านี้
นโยบายการติดตั้งของผู้ปฏิบัติงาน (security.installPolicy)
ใช้ security.installPolicy เมื่อผู้ปฏิบัติงานต้องการคำสั่ง local ที่เชื่อถือได้เพื่อ
อนุมัติหรือบล็อกการติดตั้งสกิลและ Plugin ด้วยนโยบายเฉพาะ host นโยบายนี้
ทำงานหลังจาก OpenClaw staging วัสดุต้นทางแล้ว และก่อนที่การติดตั้งหรืออัปเดต
จะดำเนินต่อไป นโยบายนี้ใช้กับสกิล ClawHub, สกิลที่อัปโหลด, สกิล Git/local,
ตัวติดตั้ง dependency ของสกิล และแหล่งติดตั้ง/อัปเดต Plugin
{ security: { installPolicy: { enabled: true, // Omit targets to cover every supported target. targets: ["skill", "plugin"], exec: { source: "exec", command: "/usr/local/bin/openclaw-install-policy", args: ["--json"], timeoutMs: 10000, noOutputTimeoutMs: 10000, maxOutputBytes: 1048576, passEnv: ["OPENCLAW_STATE_DIR", "PATH"], env: { POLICY_MODE: "strict" }, trustedDirs: ["/usr/local/bin"], }, }, },}security.installPolicy.enabledbooleandefault: falseเปิดใช้นโยบายการติดตั้งที่ผู้ปฏิบัติงานเป็นเจ้าของ เมื่อเปิดใช้โดยไม่มีคำสั่ง exec
ที่ถูกต้อง การติดตั้งจะล้มเหลวแบบปิดกั้น
security.installPolicy.targets("skill" | "plugin")[]ตัวกรองเป้าหมายแบบไม่บังคับ เมื่อไม่ระบุ นโยบายจะใช้กับทุกเป้าหมายที่รองรับ เพื่อให้การติดตั้งใหม่ไม่เปิดให้ผ่านโดยไม่คาดคิด
security.installPolicy.exec.commandstringพาธแบบ absolute ไปยัง executable ของนโยบายที่เชื่อถือได้ OpenClaw เรียกใช้โดยไม่ผ่าน shell และตรวจสอบพาธก่อนใช้งาน
security.installPolicy.exec.argsstring[]อาร์กิวเมนต์แบบคงที่ที่ส่งหลัง command
security.installPolicy.exec.timeoutMsnumberdefault: 10000runtime ตามเวลาจริงสูงสุดสำหรับการตัดสินใจของนโยบายหนึ่งครั้ง
security.installPolicy.exec.noOutputTimeoutMsnumberdefault: timeoutMsเวลาสูงสุดที่ไม่มีเอาต์พุต stdout หรือ stderr ก่อนที่นโยบายจะล้มเหลวแบบปิดกั้น
security.installPolicy.exec.maxOutputBytesnumberdefault: 1048576จำนวนไบต์รวมสูงสุดของ stdout และ stderr ที่ยอมรับจาก process ของนโยบาย
security.installPolicy.exec.env"Record<string,security.installPolicy.exec.passEnvstring[]ชื่อตัวแปรสภาพแวดล้อมที่คัดลอกจาก process ของ OpenClaw ไปยัง process ของนโยบาย ส่งผ่านเฉพาะตัวแปรที่ระบุชื่อเท่านั้น
security.installPolicy.exec.trustedDirsstring[]allowlist แบบไม่บังคับของไดเรกทอรีที่อาจมี executable ของนโยบาย
security.installPolicy.exec.allowInsecurePathbooleandefault: falseข้ามการตรวจสอบเจ้าของและสิทธิ์ของพาธคำสั่ง ใช้เฉพาะเมื่อพาธ ได้รับการป้องกันโดยกลไกอื่น
security.installPolicy.exec.allowSymlinkCommandbooleandefault: falseอนุญาตให้พาธคำสั่งที่กำหนดค่าเป็น symlink ได้ เป้าหมายที่ resolve แล้วต้อง ยังผ่านการตรวจสอบพาธอื่น ๆ อาร์กิวเมนต์สคริปต์ interpreter ต้องเป็น ไฟล์ปกติโดยตรง ไม่ใช่ symlink
นโยบายจะรับออบเจ็กต์ JSON หนึ่งรายการทาง stdin พร้อม protocolVersion: 1,
openclawVersion, targetType, targetName, sourcePath, sourcePathKind,
source แบบมีโครงสร้างที่ไม่บังคับ, origin แบบมีโครงสร้าง และ request นโยบายต้องเขียน
ออบเจ็กต์ JSON หนึ่งรายการทาง stdout: { "protocolVersion": 1, "decision": "allow" } หรือ
{ "protocolVersion": 1, "decision": "block", "reason": "..." } การออกด้วยค่าไม่เป็นศูนย์,
timeout, JSON ผิดรูปแบบ, ฟิลด์ขาดหาย หรือเวอร์ชันโปรโตคอลที่ไม่รองรับ
จะล้มเหลวแบบปิดกั้น
OpenClaw ไม่เรียกใช้นโยบายการติดตั้งระหว่างการเริ่มต้น Gateway ตามปกติ การติดตั้ง
และการอัปเดตจะล้มเหลวแบบปิดกั้นเมื่อนโยบายเปิดใช้อยู่แต่ไม่พร้อมใช้งาน openclaw doctor
ทำการตรวจสอบแบบ static และ openclaw doctor --deep เรียกใช้โพรบการติดตั้งจำลอง
กับคำสั่งที่กำหนดค่าไว้
การอัปเดตเป็นชุดใช้นโยบายแยกตามเป้าหมาย: การอัปเดตสกิลหรือ Plugin ที่ถูกบล็อกจะล้มเหลว เฉพาะเป้าหมายนั้น โดยไม่ปิดใช้นโยบายหรือข้ามเป้าหมายถัดไปในชุด
ตัวอย่าง stdin:
{ "protocolVersion": 1, "openclawVersion": "2026.6.1", "targetType": "skill", "targetName": "weather", "sourcePath": "/var/folders/.../openclaw-skill-clawhub/root", "sourcePathKind": "directory", "source": { "kind": "clawhub", "authority": "openclaw", "mutable": false, "network": true }, "origin": { "type": "clawhub", "registry": "https://clawhub.openclaw.ai", "slug": "weather", "version": "1.0.0" }, "request": { "kind": "skill-install", "mode": "install", "requestedSpecifier": "clawhub:weather@1.0.0" }, "skill": { "installId": "clawhub" }}คำสั่งนโยบายขั้นต่ำ:
#!/usr/bin/env node let input = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => { input += chunk;});process.stdin.on("end", () => { const request = JSON.parse(input); if (request.targetType === "plugin" && request.source?.kind === "local-path") { process.stdout.write( JSON.stringify({ protocolVersion: 1, decision: "block", reason: "local plugin paths are not approved on this host", }), ); return; } process.stdout.write(JSON.stringify({ protocolVersion: 1, decision: "allow" }));});allowlist ของสกิลที่บันเดิลมา
skills.allowBundledstring[]allowlist แบบไม่บังคับสำหรับสกิลที่ บันเดิลมา เท่านั้น เมื่อตั้งค่าแล้ว เฉพาะสกิลที่บันเดิลมา ในรายการเท่านั้นที่จะมีสิทธิ์ใช้งาน สกิลแบบจัดการ, ระดับเอเจนต์ และ workspace จะไม่ได้รับผลกระทบ
รายการรายสกิล (skills.entries)
คีย์ใต้ entries จะตรงกับ name ของสกิลโดยค่าเริ่มต้น หากสกิลกำหนด
metadata.openclaw.skillKey ให้ใช้คีย์นั้นแทน ใส่เครื่องหมายคำพูดครอบชื่อที่มีขีดกลาง
(JSON5 อนุญาตให้ใช้คีย์ที่มีเครื่องหมายคำพูด)
OPENCLAW_DOCS_MARKER:paramOpen:IHBhdGg9InNraWxscy5lbnRyaWVzLjxrZXk
.enabled" type="boolean">
false ปิดใช้งานสกิลแม้จะถูกบันเดิลหรือติดตั้งแล้ว สกิลที่บันเดิลมา coding-agent
เป็นแบบ opt-in ตั้งค่าเป็น true และตรวจสอบให้แน่ใจว่ามี CLI อย่างใดอย่างหนึ่งจาก claude,
codex, opencode หรือ CLI อื่นที่รองรับติดตั้งและผ่านการยืนยันตัวตนแล้ว
OPENCLAW_DOCS_MARKER:paramOpen:IHBhdGg9InNraWxscy5lbnRyaWVzLjxrZXk
.apiKey" type='string | { source, provider, id }'>
ฟิลด์อำนวยความสะดวกสำหรับสกิลที่ประกาศ metadata.openclaw.primaryEnv
รองรับสตริง plaintext หรือ SecretRef: { source: "env", provider: "default", id: "VAR_NAME" }
"skills.entries.<key�����r�"skills.entries.<key�w₫��ܩallowlist ของเอเจนต์ (agents)
ใช้การกำหนดค่าเอเจนต์เมื่อคุณต้องการ root สกิลของเครื่อง/workspace เดียวกัน แต่มี ชุดสกิลที่มองเห็นได้แตกต่างกันต่อเอเจนต์
{ agents: { defaults: { skills: ["github", "weather"], // shared baseline }, list: [ { id: "writer" }, // inherits github, weather { id: "docs", skills: ["docs-search"] }, // replaces defaults entirely { id: "locked-down", skills: [] }, // no skills ], },}agents.defaults.skillsstring[]allowlist baseline ที่ใช้ร่วมกัน ซึ่งเอเจนต์ที่ละเว้น agents.list[].skills จะสืบทอด
ละเว้นทั้งหมดเพื่อให้สกิลไม่ถูกจำกัดโดยค่าเริ่มต้น
agents.list[].skillsstring[]ชุดสกิลสุดท้ายที่ระบุชัดเจนสำหรับเอเจนต์นั้น รายการที่ระบุชัดเจนจะ แทนที่ ค่าเริ่มต้นที่สืบทอดมา
โดยไม่ merge กัน ตั้งเป็น [] เพื่อไม่เปิดเผยสกิลใด ๆ สำหรับเอเจนต์นั้น
Workshop (skills.workshop)
skills.workshop.autonomous.enabledbooleandefault: falseเมื่อเป็น true เอเจนต์สามารถสร้างข้อเสนอที่รอพิจารณาจากสัญญาณการสนทนาที่คงทน
หลังจากเทิร์นสำเร็จ การสร้างสกิลที่ผู้ใช้ร้องขอจะผ่าน Skill Workshop เสมอ
ไม่ว่าการตั้งค่านี้จะเป็นอย่างไร
skills.workshop.approvalPolicy"pending" | "auto"default: "pending"pending ต้องได้รับการอนุมัติจากผู้ปฏิบัติงานก่อนการ apply, reject หรือ
quarantine ที่เอเจนต์เริ่มต้น auto อนุญาตการกระทำเหล่านั้นโดยไม่ต้องอนุมัติ
skills.workshop.allowSymlinkTargetWritesbooleandefault: falseอนุญาตให้การ apply ของ Skill Workshop เขียนผ่าน symlink สกิลของ workspace ซึ่ง
เป้าหมายจริงได้รับความเชื่อถือแล้วโดย skills.load.allowSymlinkTargets ปิดค่านี้ไว้
เว้นแต่การ apply ข้อเสนอที่สร้างขึ้นควรแก้ไข root สกิลที่ใช้ร่วมกันนั้น
skills.workshop.maxPendingnumberdefault: 50จำนวนข้อเสนอที่รอดำเนินการและถูกกักกันสูงสุดที่เก็บไว้ต่อ workspace
skills.workshop.maxSkillBytesnumberdefault: 40000ขนาดสูงสุดของเนื้อหาข้อเสนอเป็นไบต์ คำอธิบายข้อเสนอถูกจำกัดแบบตายตัวไว้ที่ 160 ไบต์ เพราะจะแสดงในเอาต์พุตการค้นพบและการแสดงรายการ
รูท Skills แบบ symlink
โดยค่าเริ่มต้น รูท Skills ของ workspace, project-agent, extra-dir และแบบ bundled
เป็นขอบเขตการกักกัน โฟลเดอร์ Skills แบบ symlink ใต้ <workspace>/skills
ที่ resolve ออกไปนอกรูทจะถูกข้ามพร้อมข้อความ log
หากต้องการอนุญาตเลย์เอาต์ symlink โดยตั้งใจ ให้ประกาศเป้าหมายที่เชื่อถือได้:
{ skills: { load: { extraDirs: ["~/Projects/manager/skills"], allowSymlinkTargets: ["~/Projects/manager/skills"], }, },}ด้วย config นี้ <workspace>/skills/manager -> ~/Projects/manager/skills จะได้รับการยอมรับ
หลังจาก resolve realpath แล้ว extraDirs จะสแกน repo พี่น้องโดยตรง;
allowSymlinkTargets จะคง path แบบ symlink ไว้สำหรับเลย์เอาต์ที่มีอยู่
การ apply ของ Skill Workshop จะไม่เขียนผ่าน symlink เหล่านั้นโดยค่าเริ่มต้น หากต้องการให้ Workshop apply แก้ไข Skills ใต้เป้าหมาย symlink ที่เชื่อถือแล้ว ให้เลือกเปิดใช้ แยกต่างหาก:
{ skills: { load: { allowSymlinkTargets: ["~/Projects/manager/skills"], }, workshop: { allowSymlinkTargetWrites: true, }, },}ไดเรกทอรี ~/.openclaw/skills ที่จัดการโดยระบบและไดเรกทอรีส่วนตัว ~/.agents/skills
ยอมรับ symlink ของไดเรกทอรี Skills อยู่แล้ว (การกักกัน SKILL.md ต่อ Skill ยังคง
มีผล)
Skills แบบ sandbox และ env vars
ส่ง secrets เข้าไปใน Docker sandbox ด้วย:
{ agents: { defaults: { sandbox: { docker: { env: { GEMINI_API_KEY: "your-key-here" }, }, }, }, },}การเตือนลำดับการโหลด
workspace/skills (highest)workspace/.agents/skills~/.agents/skills~/.openclaw/skillsbundled skillsskills.load.extraDirs (lowest)การเปลี่ยนแปลง Skills และ config จะมีผลใน session ใหม่ถัดไปเมื่อเปิดใช้ watcher หรือใน agent turn ถัดไปเมื่อ watcher ตรวจพบการเปลี่ยนแปลง