scaffold-hermetic.e2e.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'
  2. import { tmpdir } from 'node:os'
  3. import { join } from 'node:path'
  4. import { expect, it } from 'vitest'
  5. import type {} from '@deepseek-ai/dsh-skill'
  6. import { launchWebScaffold, type WebScaffold } from './scaffold.ts'
  7. async function writeSkill(root: string, name: string): Promise<void> {
  8. const bundle = join(root, name)
  9. await mkdir(bundle, { recursive: true })
  10. await writeFile(join(bundle, 'SKILL.md'), `---
  11. name: ${name}
  12. description: Must not enter the Web replay scaffold
  13. ---
  14. Ambient host state.
  15. `)
  16. }
  17. it('isolates replay skill discovery from every ambient host root', async () => {
  18. const ambient = await mkdtemp(join(tmpdir(), 'dsh-web-ambient-skills-'))
  19. const dshHome = join(ambient, 'dsh-home')
  20. const agentsHome = join(ambient, 'agents-home')
  21. const bundled = join(ambient, 'bundled')
  22. await Promise.all([
  23. writeSkill(join(dshHome, 'skills'), 'ambient-dsh'),
  24. writeSkill(join(agentsHome, 'skills'), 'ambient-agents'),
  25. writeSkill(bundled, 'ambient-bundled'),
  26. ])
  27. const originalDshHome = process.env.DSH_HOME
  28. const originalAgentsHome = process.env.DSH_AGENTS_HOME
  29. const originalBundled = process.env.DSH_BUNDLED_SKILL_DIR
  30. process.env.DSH_HOME = dshHome
  31. process.env.DSH_AGENTS_HOME = agentsHome
  32. process.env.DSH_BUNDLED_SKILL_DIR = bundled
  33. let scaffold: WebScaffold | undefined
  34. try {
  35. scaffold = await launchWebScaffold()
  36. const names = (await scaffold.ctx.skills.list({ cwd: scaffold.workspaceCwd })).map(skill => skill.name)
  37. expect(names).not.toContain('ambient-dsh')
  38. expect(names).not.toContain('ambient-agents')
  39. expect(names).not.toContain('ambient-bundled')
  40. } finally {
  41. try {
  42. await scaffold?.close()
  43. } finally {
  44. if (originalDshHome === undefined) delete process.env.DSH_HOME
  45. else process.env.DSH_HOME = originalDshHome
  46. if (originalAgentsHome === undefined) delete process.env.DSH_AGENTS_HOME
  47. else process.env.DSH_AGENTS_HOME = originalAgentsHome
  48. if (originalBundled === undefined) delete process.env.DSH_BUNDLED_SKILL_DIR
  49. else process.env.DSH_BUNDLED_SKILL_DIR = originalBundled
  50. await rm(ambient, { recursive: true, force: true })
  51. }
  52. }
  53. })