| 123456789101112131415161718192021222324252627282930 |
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
- import { tmpdir } from 'node:os'
- import { join } from 'node:path'
- import { afterEach, describe, expect, it } from 'vitest'
- import { collectConfigSourceOwnershipViolations } from './verify-config-source-ownership.ts'
- const roots: string[] = []
- afterEach(() => {
- for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true })
- })
- describe('configuration source ownership gate', () => {
- it('rejects inline endpoints in shipped bundle patches', () => {
- const root = mkdtempSync(join(tmpdir(), 'dsh-config-source-ownership-'))
- roots.push(root)
- const directory = join(root, 'packages/subagent/subagent-claude-code')
- mkdirSync(directory, { recursive: true })
- writeFileSync(
- join(directory, 'cordis.patch.yml'),
- 'config:\n baseURL: !!js process.env.DEEPSEEK_SEARCH_BASE_URL\n',
- )
- expect(collectConfigSourceOwnershipViolations(root)).toEqual([
- 'packages/subagent/subagent-claude-code/cordis.patch.yml:2: inlines a credential or endpoint from the environment.'
- + ' The adapter resolves apiKeyEnv through ctx.credentials and the endpoint through the'
- + ' environment snapshot; inlining here bypasses both ladders.',
- ])
- })
- })
|