102 lines
2.7 KiB
TypeScript
102 lines
2.7 KiB
TypeScript
import { mkdtemp, rm } from 'node:fs/promises'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
import {
|
|
CapabilityService,
|
|
type CapabilityCipher
|
|
} from './capability-service'
|
|
import {
|
|
BrowserProfileService,
|
|
MemoryBrowserProfileStore
|
|
} from './browser-profile-service'
|
|
|
|
const builtinSkillsRoot = join(
|
|
process.cwd(),
|
|
'resources',
|
|
'skills'
|
|
)
|
|
|
|
const cipher: CapabilityCipher = {
|
|
isAvailable: () => true,
|
|
encrypt: (value) => Buffer.from(`encrypted:${value}`),
|
|
decrypt: (value) => value.toString().replace(/^encrypted:/u, '')
|
|
}
|
|
|
|
const temporaryDirectories: string[] = []
|
|
|
|
async function createService(): Promise<CapabilityService> {
|
|
const directory = await mkdtemp(join(tmpdir(), 'goodbuddy-builtin-'))
|
|
temporaryDirectories.push(directory)
|
|
return new CapabilityService(
|
|
join(directory, 'capabilities.json'),
|
|
builtinSkillsRoot,
|
|
join(directory, 'imported'),
|
|
cipher,
|
|
{
|
|
platform: 'win32',
|
|
architecture: 'x64',
|
|
electronTarget: true,
|
|
browserProfiles: new BrowserProfileService(
|
|
new MemoryBrowserProfileStore()
|
|
)
|
|
}
|
|
)
|
|
}
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(
|
|
temporaryDirectories
|
|
.splice(0)
|
|
.map((directory) => rm(directory, { recursive: true, force: true }))
|
|
)
|
|
})
|
|
|
|
describe('bundled skills', () => {
|
|
it('parses every bundled SKILL.md', async () => {
|
|
const snapshot = await (await createService()).getSnapshot()
|
|
|
|
expect(snapshot.skills.length).toBeGreaterThan(0)
|
|
expect(snapshot.skills.every((skill) => skill.source === 'builtin')).toBe(
|
|
true
|
|
)
|
|
expect(snapshot.skills.map((skill) => skill.id)).toContain(
|
|
'product-marketing'
|
|
)
|
|
expect(snapshot.skills).toContainEqual(
|
|
expect.objectContaining({
|
|
id: 'web-3d-game',
|
|
name: 'Web 3D Game',
|
|
assignments: expect.arrayContaining(['deepseek-harness'])
|
|
})
|
|
)
|
|
})
|
|
|
|
it('injects every enabled bundled skill with its resolved directory', async () => {
|
|
const service = await createService()
|
|
const snapshot = await service.getSnapshot()
|
|
|
|
const instructions = await service.getSkillInstructions('continue')
|
|
|
|
expect(instructions).not.toContain('因超出注入上限未加载')
|
|
for (const skill of snapshot.skills) {
|
|
expect(instructions).toContain(join(builtinSkillsRoot, skill.id))
|
|
}
|
|
})
|
|
|
|
it('exposes the 3D game Skill as a native Harness package', async () => {
|
|
const service = await createService()
|
|
|
|
await expect(
|
|
service.getRuntimeSkillContext('deepseek-harness')
|
|
).resolves.toMatchObject({
|
|
packages: expect.arrayContaining([
|
|
{
|
|
id: 'web-3d-game',
|
|
directory: join(builtinSkillsRoot, 'web-3d-game')
|
|
}
|
|
])
|
|
})
|
|
})
|
|
})
|