ForcePilot/src/repositories/skill_repository.py
肖泽涛 46b676db07 feat(skills): add skills management module
实现 Skills 管理功能,支持超级管理员导入、编辑、导出和删除技能包。

- 新增 Skill 数据模型(元数据存数据库,内容存文件系统)
- 新增 /api/system/skills/* 路由(权限分级:admin 可列表,superadmin 可管理)
- 新增 SelectedSkillsReadonlyBackend,运行时只读挂载到 /skills
- Agent 配置新增 skills 字段,运行时注入技能提示词
- 前端新增 Skills 管理页面(设置弹窗 + 独立路由)
- 新增测试覆盖:service/router/backend 单测

未实现功能:
 - 关联使用其他技能
 - 沙箱执行代码
 - 在技能中绑定工具
2026-02-21 02:48:20 +08:00

69 lines
1.9 KiB
Python

from __future__ import annotations
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from src.storage.postgres.models_business import Skill
from src.utils.datetime_utils import utc_now_naive
class SkillRepository:
def __init__(self, db_session: AsyncSession):
self.db = db_session
async def list_all(self) -> list[Skill]:
result = await self.db.execute(select(Skill).order_by(Skill.updated_at.desc(), Skill.id.desc()))
return list(result.scalars().all())
async def get_by_slug(self, slug: str) -> Skill | None:
result = await self.db.execute(select(Skill).where(Skill.slug == slug))
return result.scalar_one_or_none()
async def exists_slug(self, slug: str) -> bool:
return (await self.get_by_slug(slug)) is not None
async def create(
self,
*,
slug: str,
name: str,
description: str,
dir_path: str,
created_by: str | None,
) -> Skill:
now = utc_now_naive()
item = Skill(
slug=slug,
name=name,
description=description,
dir_path=dir_path,
created_by=created_by,
updated_by=created_by,
created_at=now,
updated_at=now,
)
self.db.add(item)
await self.db.commit()
await self.db.refresh(item)
return item
async def update_metadata(
self,
item: Skill,
*,
name: str,
description: str,
updated_by: str | None,
) -> Skill:
item.name = name
item.description = description
item.updated_by = updated_by
item.updated_at = utc_now_naive()
await self.db.commit()
await self.db.refresh(item)
return item
async def delete(self, item: Skill) -> None:
await self.db.delete(item)
await self.db.commit()