agent-ecosystem/test/main/services/extensions/SkillMetadataParser.test.ts

69 lines
2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { SkillMetadataParser } from '@main/services/extensions/skills/SkillMetadataParser';
describe('SkillMetadataParser', () => {
const parser = new SkillMetadataParser();
const root = {
scope: 'project' as const,
rootKind: 'claude' as const,
projectRoot: '/tmp/project',
rootPath: '/tmp/project/.claude/skills',
};
it('parses valid frontmatter and derives warnings', () => {
const item = parser.parseCatalogItem({
skillDir: '/tmp/project/.claude/skills/demo-skill',
folderName: 'demo-skill',
skillFile: '/tmp/project/.claude/skills/demo-skill/Skill.md',
rawContent: `---
name: demo-skill
description: Test skill
version: 1.2.3
allowed-tools:
- Read
compatibility: Requires network and API key
unknown-key: true
---
# Demo`,
modifiedAt: 1,
flags: { hasScripts: true, hasReferences: false, hasAssets: false },
root,
});
expect(item.isValid).toBe(true);
expect(item.issues.map((issue) => issue.code)).toEqual(
expect.arrayContaining([
'nonstandard-file-name',
'unknown-frontmatter-keys',
'has-scripts',
'allowed-tools-advisory',
'compatibility-advisory',
])
);
expect(item.issues).not.toContainEqual(
expect.objectContaining({
code: 'unknown-frontmatter-keys',
message: expect.stringContaining('version'),
})
);
});
it('marks missing frontmatter as invalid', () => {
const item = parser.parseCatalogItem({
skillDir: '/tmp/project/.claude/skills/demo-skill',
folderName: 'demo-skill',
skillFile: '/tmp/project/.claude/skills/demo-skill/SKILL.md',
rawContent: '# No frontmatter',
modifiedAt: 1,
flags: { hasScripts: false, hasReferences: false, hasAssets: false },
root,
});
expect(item.isValid).toBe(false);
expect(item.issues.map((issue) => issue.code)).toEqual(
expect.arrayContaining(['missing-frontmatter', 'missing-name', 'missing-description'])
);
});
});