|
| 1 | +import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs' |
| 2 | +import os from 'os' |
| 3 | +import path from 'path' |
| 4 | + |
1 | 5 | import { describe, expect, test, beforeEach } from 'bun:test' |
2 | 6 | import { z } from 'zod/v4' |
3 | 7 |
|
@@ -310,6 +314,62 @@ describe('Initial Session State', () => { |
310 | 314 | expect(sessionState.fileContext.systemInfo.cpus).toBeGreaterThan(0) |
311 | 315 | }) |
312 | 316 |
|
| 317 | + test('loads skills from skillsDir when provided', async () => { |
| 318 | + const tmpDir = mkdtempSync(path.join(os.tmpdir(), 'sdk-skills-test-')) |
| 319 | + try { |
| 320 | + const skillDir = path.join(tmpDir, 'my-skill') |
| 321 | + mkdirSync(skillDir, { recursive: true }) |
| 322 | + writeFileSync( |
| 323 | + path.join(skillDir, 'SKILL.md'), |
| 324 | + [ |
| 325 | + '---', |
| 326 | + 'name: my-skill', |
| 327 | + 'description: A test skill', |
| 328 | + '---', |
| 329 | + '', |
| 330 | + '# My Skill', |
| 331 | + '', |
| 332 | + 'Some instructions here.', |
| 333 | + ].join('\n'), |
| 334 | + ) |
| 335 | + |
| 336 | + const sessionState = await initialSessionState({ |
| 337 | + cwd: '/test-project', |
| 338 | + skillsDir: tmpDir, |
| 339 | + projectFiles: { 'src/index.ts': 'console.log("hello");' }, |
| 340 | + fs: mockFs, |
| 341 | + logger: mockLogger, |
| 342 | + }) |
| 343 | + |
| 344 | + expect(sessionState.fileContext.skills).toBeDefined() |
| 345 | + expect(sessionState.fileContext.skills!['my-skill']).toBeDefined() |
| 346 | + expect(sessionState.fileContext.skills!['my-skill'].name).toBe('my-skill') |
| 347 | + expect(sessionState.fileContext.skills!['my-skill'].description).toBe( |
| 348 | + 'A test skill', |
| 349 | + ) |
| 350 | + } finally { |
| 351 | + rmSync(tmpDir, { recursive: true, force: true }) |
| 352 | + } |
| 353 | + }) |
| 354 | + |
| 355 | + test('skillsDir with no valid skills results in empty skills map', async () => { |
| 356 | + const tmpDir = mkdtempSync(path.join(os.tmpdir(), 'sdk-skills-test-')) |
| 357 | + try { |
| 358 | + const sessionState = await initialSessionState({ |
| 359 | + cwd: '/test-project', |
| 360 | + skillsDir: tmpDir, |
| 361 | + projectFiles: { 'src/index.ts': 'console.log("hello");' }, |
| 362 | + fs: mockFs, |
| 363 | + logger: mockLogger, |
| 364 | + }) |
| 365 | + |
| 366 | + expect(sessionState.fileContext.skills).toBeDefined() |
| 367 | + expect(Object.keys(sessionState.fileContext.skills!)).toHaveLength(0) |
| 368 | + } finally { |
| 369 | + rmSync(tmpDir, { recursive: true, force: true }) |
| 370 | + } |
| 371 | + }) |
| 372 | + |
313 | 373 | test('initializes empty agent state correctly', async () => { |
314 | 374 | const projectFiles = { |
315 | 375 | 'src/index.ts': 'console.log("Hello world");', |
|
0 commit comments