"""
示例6:从URL安装skills
演示如何从GitHub等Git仓库直接安装skills:
1. 从GitHub安装单个skill
2. 从GitHub安装仓库中的特定skill
3. 使用便捷方法install_from_github
4. 处理安装错误
"""
from pathlib import Path
from akg_agents.core_v2.skill import SkillInstaller, SkillRegistry
def example_1_install_from_github():
"""示例1:从GitHub安装Vercel的skill"""
print("=" * 60)
print("示例1:从GitHub安装Vercel的skill")
print("=" * 60)
installer = SkillInstaller()
try:
print("从GitHub安装 react-best-practices...")
result = installer.install_from_github(
repo="vercel-labs/agent-skills",
skill_path="skills/react-best-practices"
)
print(f"[OK] 安装成功: {result['skill_name']}")
print(f" 目标位置: {result['target_dir']}")
print(f" 文件统计: 复制{result['stats']['copied']}个, "
f"更新{result['stats']['updated']}个, "
f"跳过{result['stats']['skipped']}个")
print(f" 总文件数: {result['total_files']}")
print(f" 源URL: {result['source_url']}")
except Exception as e:
print(f"[错误] 安装失败: {e}")
print(" 提示:需要安装git命令行工具")
print()
def example_2_install_from_url():
"""示例2:从完整URL安装"""
print("=" * 60)
print("示例2:从完整URL安装")
print("=" * 60)
installer = SkillInstaller()
try:
print("从URL安装skill...")
result = installer.install_from_url(
url="https://github.com/vercel-labs/agent-skills.git",
skill_path="skills/react-best-practices",
branch="main"
)
print(f"[OK] 安装成功: {result['skill_name']}")
print(f" 从: {result['source_url']}")
print(f" 路径: {result.get('source_path', 'N/A')}")
except Exception as e:
print(f"[错误] 安装失败: {e}")
print()
def example_3_verify_installed():
"""示例3:验证已安装的skill"""
print("=" * 60)
print("示例3:验证已安装的skill")
print("=" * 60)
installer = SkillInstaller()
skill_name = "vercel-react-best-practices"
if installer.is_installed(skill_name):
print(f"[OK] {skill_name} 已安装")
skill_path = installer.get_skill_path(skill_name)
print(f" 安装路径: {skill_path}")
is_valid, error = installer.verify(skill_name)
if is_valid:
print(f" 验证状态: 通过")
else:
print(f" 验证状态: 失败 - {error}")
info = installer.get_install_info(skill_name)
if info:
print(f" 版本: {info.get('version', 'N/A')}")
print(f" 安装时间: {info.get('installed_at', 'N/A')[:19]}")
print(f" 文件数: {len(info.get('files', {}))}")
print(f" 源路径: {info.get('source', 'N/A')}")
else:
print(f"[提示] {skill_name} 未安装")
print()
def example_4_use_installed_skill():
"""示例4:使用已安装的skill"""
print("=" * 60)
print("示例4:使用已安装的skill")
print("=" * 60)
installer = SkillInstaller()
registry = SkillRegistry()
count = registry.load_from_directory(installer.install_root)
print(f"[OK] 从安装位置加载了 {count} 个skills")
print()
skill = registry.get("vercel-react-best-practices")
if skill:
print(f"[OK] 找到skill: {skill.name}")
print(f" 描述: {skill.description[:80]}...")
print(f" 路径: {skill.skill_path}")
print()
skill_dir = installer.get_skill_path(skill.name)
if skill_dir:
rules_dir = skill_dir / "rules"
if rules_dir.exists():
rules = list(rules_dir.glob("*.md"))
print(f"[OK] 包含 {len(rules)} 个规则文件")
if rules:
print(" 前3个规则:")
for rule in rules[:3]:
print(f" - {rule.name}")
else:
print("[提示] 未找到skill,请先运行示例1安装")
print()
def example_5_resource_resolution():
"""示例5:解析Vercel skill的资源"""
print("=" * 60)
print("示例5:解析Vercel skill的资源")
print("=" * 60)
installer = SkillInstaller()
skill_name = "vercel-react-best-practices"
if not installer.is_installed(skill_name):
print(f"[提示] {skill_name} 未安装")
print()
return
agents_md = installer.resolve_resource(skill_name, "AGENTS.md")
if agents_md and agents_md.exists():
print(f"[OK] 找到AGENTS.md:")
print(f" 路径: {agents_md}")
print(f" 大小: {agents_md.stat().st_size} 字节")
skill_path = installer.get_skill_path(skill_name)
if skill_path:
rules_dir = skill_path / "rules"
if rules_dir.exists():
print(f"\n[OK] Rules目录:")
print(f" 路径: {rules_dir}")
async_parallel = rules_dir / "async-parallel.md"
if async_parallel.exists():
print(f"\n[示例] 读取规则文件:")
print(f" 文件: async-parallel.md")
content = async_parallel.read_text(encoding='utf-8')
print(f" 内容长度: {len(content)} 字符")
print(f" 内容预览:")
print(f" {content[:200]}...")
print()
def example_6_error_handling():
"""示例6:错误处理"""
print("=" * 60)
print("示例6:错误处理")
print("=" * 60)
installer = SkillInstaller()
print("[测试1] 安装不存在的仓库:")
try:
installer.install_from_github(
repo="invalid-user/invalid-repo",
skill_path="some-skill"
)
except Exception as e:
print(f" [预期错误] {type(e).__name__}: {str(e)[:100]}")
print()
print("[测试2] 安装不存在的skill路径:")
try:
installer.install_from_github(
repo="vercel-labs/agent-skills",
skill_path="skills/non-existent-skill"
)
except Exception as e:
print(f" [预期错误] {type(e).__name__}: {str(e)[:100]}")
print()
print("[测试3] 说明:")
print(" 如果目标目录没有SKILL.md,安装会失败")
print(" 这确保了只安装有效的skills")
print()
def run_all_examples():
"""运行所有示例"""
print("\n")
print("=" * 60)
print("从URL安装Skills - 完整示例")
print("=" * 60)
print()
print("注意:需要安装git命令行工具")
print("Windows: https://git-scm.com/download/win")
print("Linux: sudo apt-get install git")
print("Mac: brew install git")
print()
installer = SkillInstaller()
before_install = set(installer.list_installed().keys())
examples = [
example_1_install_from_github,
example_2_install_from_url,
example_3_verify_installed,
example_4_use_installed_skill,
example_5_resource_resolution,
example_6_error_handling,
]
try:
for example in examples:
try:
example()
except Exception as e:
print(f"[错误] {example.__name__}: {e}")
import traceback
traceback.print_exc()
print()
print("=" * 60)
print("所有示例运行完成")
print("=" * 60)
print()
finally:
after_install = set(installer.list_installed().keys())
new_skills = list(after_install - before_install)
if new_skills:
print("=" * 60)
print("清理本次示例安装的skills")
print("=" * 60)
success_count = 0
for skill_name in new_skills:
try:
if installer.uninstall(skill_name):
success_count += 1
print(f" [OK] 卸载: {skill_name}")
except Exception as e:
print(f" [错误] 卸载 {skill_name} 失败: {e}")
print(f"\n[OK] 清理完成: 成功卸载 {success_count}/{len(new_skills)} 个skills")
print()
else:
print("\n[OK] 没有需要清理的新安装skills\n")
if __name__ == "__main__":
run_all_examples()