用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/advent259141/astrbot_self_manager_skill --skill skill-manager命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | skill-manager |
| description | 管理 AstrBot Skills 的列出、启停、删除和安装操作 |
| version | 2.0.0 |
| author | AstrBot Community |
| requires_admin | true |
| requires_computer_use | true |
你是一个专门负责 AstrBot Skill 管理的助手。
if not event.is_admin():
print("❌ 错误:仅管理员可用")
sys.exit(1)
import asyncio
from astrbot.core.skills.skill_manager import SkillManager
async def list_skills():
mgr = SkillManager()
skills = mgr.list_skills(active_only=False)
if not skills:
return "没有安装任何 Skill。"
lines = ["📚 已安装的 Skills:\n"]
for s in skills:
status = "✅启用" if s.active else "❌禁用"
desc = s.description or "无描述"
source = f"[{s.source_label}]"
lines.append(f"- [{status}] **{s.name}** {source}: {desc}")
return "\n".join(lines)
event = globals().get('event')
if not event.is_admin():
print("❌ 错误:仅管理员可用")
import sys; sys.exit(1)
result = await list_skills()
print(result)
import asyncio
from astrbot.core.skills.skill_manager import SkillManager
async def toggle_skill(skill_name: str, enable: bool):
try:
mgr = SkillManager()
mgr.set_skill_active(skill_name, enable)
action = "启用" if enable else "禁用"
return f"✅ 已{action} Skill「{skill_name}」。"
except Exception as e:
return f"❌ 操作失败:{e}"
# 从用户输入提取参数
result = await toggle_skill(skill_name="<技能名>", enable=True)
print(result)
import asyncio
from astrbot.core.skills.skill_manager import SkillManager
async def delete_skill(skill_name: str):
try:
mgr = SkillManager()
mgr.delete_skill(skill_name)
return f"✅ Skill「{skill_name}」已删除。"
except Exception as e:
return f"❌ 删除失败:{e}"
result = await delete_skill(skill_name="<技能名>")
print(result)
import asyncio
import aiohttp
import os
import tempfile
from astrbot.core.skills.skill_manager import SkillManager
async def install_skill_from_url(url: str, skill_name: str = ""):
try:
# 下载文件
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=120)) as resp:
if resp.status != 200:
return f"❌ 下载失败:HTTP {resp.status}"
content_bytes = await resp.read()
content_type = resp.headers.get("Content-Type", "")
is_zip = (
url.lower().endswith(".zip")
or "zip" in content_type.lower()
or content_bytes[:4] == b"PK\x03\x04"
)
mgr = SkillManager()
if is_zip:
# 保存为临时文件并安装
tmp_fd, tmp_path = tempfile.mkstemp(suffix=".zip")
os.close(tmp_fd)
try:
with open(tmp_path, "wb") as f:
f.write(content_bytes)
name = mgr.install_skill_from_zip(tmp_path, overwrite=)
:
os.path.exists(tmp_path):
os.remove(tmp_path)
:
text = content_bytes.decode()
re
skill_name:
text.startswith():
lines = text.splitlines()
i (, (lines)):
lines[i].strip() == :
lines[i]:
skill_name = lines[i].split(, )[].strip().strip()
skill_name:
urllib.parse urlparse
path = urlparse(url).path.rstrip()
parts = [p p path.split() p]
parts:
skill_name = parts[-].replace(, )
skill_name = re.sub(, , skill_name)
skill_dir = os.path.join(mgr.skills_root, skill_name)
os.makedirs(skill_dir, exist_ok=)
(os.path.join(skill_dir, ), , encoding=) f:
f.write(text)
Exception e:
result = install_skill_from_url(url=)
(result)
用户: "有哪些 Skill?" 执行: list_skills()
用户: "禁用 example-skill" 执行: toggle_skill("example-skill", False)
用户: "删除 old-skill" 执行: delete_skill("old-skill")