723558ff22
- 新增 Skill 类型定义和加载器,支持 YAML/JSON/Markdown 格式 - 实现 Skill 注册表,支持搜索、分类和优先级覆盖 - 添加 8 个内置 Skills: code-review, explain-code, generate-docs 等 - 创建 skill 和 skill_search 工具供 Agent 调用 - 支持从用户目录和项目目录加载自定义 Skills - 添加完整的单元测试覆盖
123 lines
3.9 KiB
TypeScript
123 lines
3.9 KiB
TypeScript
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { skillSearchTool } from '../../../../src/tools/skill/skill_search.js';
|
|
import { getSkillRegistry, resetSkillRegistry } from '../../../../src/skills/registry.js';
|
|
|
|
// Mock loader to prevent file system access
|
|
vi.mock('../../../../src/skills/loader.js', () => ({
|
|
skillLoader: {
|
|
loadFromDirectory: vi.fn().mockResolvedValue([]),
|
|
getUserSkillsDir: vi.fn().mockReturnValue('/mock/user/skills'),
|
|
getProjectSkillsDir: vi.fn().mockReturnValue('/mock/project/skills'),
|
|
},
|
|
}));
|
|
|
|
// Mock builtin skills
|
|
vi.mock('../../../../src/skills/builtin/index.js', () => ({
|
|
builtinSkills: [
|
|
{
|
|
name: 'code-review',
|
|
description: '代码审查',
|
|
promptTemplate: '审查代码',
|
|
keywords: ['review', 'quality'],
|
|
category: 'development',
|
|
source: 'builtin',
|
|
enabled: true,
|
|
},
|
|
{
|
|
name: 'generate-tests',
|
|
description: '生成测试',
|
|
promptTemplate: '生成测试',
|
|
keywords: ['test', 'unit'],
|
|
category: 'testing',
|
|
source: 'builtin',
|
|
enabled: true,
|
|
},
|
|
{
|
|
name: 'explain-code',
|
|
description: '解释代码功能',
|
|
promptTemplate: '解释代码',
|
|
category: 'development',
|
|
source: 'builtin',
|
|
enabled: true,
|
|
},
|
|
],
|
|
}));
|
|
|
|
describe('skillSearchTool - Skill 搜索工具', () => {
|
|
beforeEach(async () => {
|
|
vi.clearAllMocks();
|
|
resetSkillRegistry();
|
|
const registry = getSkillRegistry();
|
|
await registry.initialize();
|
|
});
|
|
|
|
describe('工具定义', () => {
|
|
it('有正确的名称', () => {
|
|
expect(skillSearchTool.name).toBe('skill_search');
|
|
});
|
|
|
|
it('有正确的元数据', () => {
|
|
expect(skillSearchTool.metadata.category).toBe('agent');
|
|
expect(skillSearchTool.metadata.keywords).toContain('search');
|
|
});
|
|
|
|
it('所有参数都是可选的', () => {
|
|
expect(skillSearchTool.parameters.query.required).toBe(false);
|
|
expect(skillSearchTool.parameters.category.required).toBe(false);
|
|
expect(skillSearchTool.parameters.list_all.required).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('execute - 执行', () => {
|
|
it('list_all 列出所有 Skills', async () => {
|
|
const result = await skillSearchTool.execute({ list_all: true });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('code-review');
|
|
expect(result.output).toContain('generate-tests');
|
|
expect(result.output).toContain('explain-code');
|
|
expect(result.output).toContain('development');
|
|
expect(result.output).toContain('testing');
|
|
});
|
|
|
|
it('按关键词搜索', async () => {
|
|
const result = await skillSearchTool.execute({ query: 'review' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('code-review');
|
|
expect(result.metadata?.query).toBe('review');
|
|
});
|
|
|
|
it('按分类筛选', async () => {
|
|
const result = await skillSearchTool.execute({ category: 'testing' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('generate-tests');
|
|
expect(result.output).not.toContain('code-review');
|
|
});
|
|
|
|
it('分类不存在时显示可用分类', async () => {
|
|
const result = await skillSearchTool.execute({ category: 'non-existent' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('没有 Skills');
|
|
expect(result.output).toContain('可用分类');
|
|
});
|
|
|
|
it('搜索无结果时提示', async () => {
|
|
const result = await skillSearchTool.execute({ query: 'xxxxxxxxx' });
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('没有找到');
|
|
});
|
|
|
|
it('无参数时显示概览', async () => {
|
|
const result = await skillSearchTool.execute({});
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.output).toContain('概览');
|
|
expect(result.output).toContain('使用方法');
|
|
});
|
|
});
|
|
});
|