mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-21 15:55:50 +00:00
* feat: 适配 zed acp 协议 * docs: 完善 acp 文档 * feat: integrate feature branches + daemon/job 命令层级化 + 跨平台后台引擎 Cherry-picked from origin/lint/preview (637c908), excluding lint-only changes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: correct detectMimeFromBase64 to decode raw bytes from base64 Cherry-picked from origin/lint/preview (ee36954). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: daemon 子进程 spawn 跨平台修复 + CliLaunchSpec 集中化重构 Cherry-picked from origin/lint/preview (c5f52cd), excluding lint-only formatting changes. - 新建 src/utils/cliLaunch.ts: 集中化 CLI 子进程启动层 - 修复 --daemon-worker=kind 等号格式解析 - 修复 daemon/bg fast path 缺少 setShellIfWindows() - 修复 checkPathExists 用 existsSync 替代 execSync('dir') - 7 个 spawn 站点迁移到 CliLaunchSpec Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: merge tsconfig.base.json into tsconfig.json with full compiler options The cherry-pick from637c908dropped jsx/strict/etc settings when removing tsconfig.base.json. This commit restores them in a single tsconfig.json. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
88 lines
3.0 KiB
TypeScript
88 lines
3.0 KiB
TypeScript
/**
|
|
* Tests for src/jobs/templates.ts
|
|
*
|
|
* Uses real temp directories and CLAUDE_CONFIG_DIR env var
|
|
* instead of mocking fs, to avoid cross-test mock pollution.
|
|
*/
|
|
import { describe, expect, test, beforeEach, afterAll } from 'bun:test'
|
|
import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'fs'
|
|
import { join } from 'path'
|
|
import { tmpdir } from 'os'
|
|
|
|
// ─── setup: real temp dir via env var ──────────────────────────────────────
|
|
|
|
const tempBase = mkdtempSync(join(tmpdir(), 'jobs-templates-test-'))
|
|
|
|
beforeEach(() => {
|
|
const tempHome = mkdtempSync(join(tempBase, 'home-'))
|
|
process.env.CLAUDE_CONFIG_DIR = tempHome
|
|
})
|
|
|
|
afterAll(() => {
|
|
delete process.env.CLAUDE_CONFIG_DIR
|
|
try {
|
|
rmSync(tempBase, { recursive: true, force: true })
|
|
} catch {
|
|
// best-effort cleanup
|
|
}
|
|
})
|
|
|
|
// ─── import ─────────────────────────────────────────────────────────────────
|
|
|
|
const { listTemplates, loadTemplate } = await import('../templates.js')
|
|
|
|
// ─── tests ──────────────────────────────────────────────────────────────────
|
|
|
|
describe('listTemplates', () => {
|
|
test('returns empty array when no template dirs exist', () => {
|
|
const result = listTemplates()
|
|
expect(result).toEqual([])
|
|
})
|
|
|
|
test('discovers templates from user-level dir', () => {
|
|
const userDir = join(process.env.CLAUDE_CONFIG_DIR!, 'templates')
|
|
mkdirSync(userDir, { recursive: true })
|
|
writeFileSync(
|
|
join(userDir, 'greeting.md'),
|
|
'---\ndescription: A greeting template\n---\nHello {{name}}',
|
|
'utf-8',
|
|
)
|
|
|
|
const result = listTemplates()
|
|
expect(result.length).toBe(1)
|
|
expect(result[0]!.name).toBe('greeting')
|
|
expect(result[0]!.description).toBe('A greeting template')
|
|
expect(result[0]!.content).toBe('Hello {{name}}')
|
|
})
|
|
|
|
test('skips non-md files', () => {
|
|
const userDir = join(process.env.CLAUDE_CONFIG_DIR!, 'templates')
|
|
mkdirSync(userDir, { recursive: true })
|
|
writeFileSync(join(userDir, 'notes.txt'), 'not a template', 'utf-8')
|
|
writeFileSync(join(userDir, 'data.json'), '{}', 'utf-8')
|
|
|
|
const result = listTemplates()
|
|
expect(result).toEqual([])
|
|
})
|
|
})
|
|
|
|
describe('loadTemplate', () => {
|
|
test('returns null when template not found', () => {
|
|
expect(loadTemplate('nonexistent')).toBeNull()
|
|
})
|
|
|
|
test('returns template by name', () => {
|
|
const userDir = join(process.env.CLAUDE_CONFIG_DIR!, 'templates')
|
|
mkdirSync(userDir, { recursive: true })
|
|
writeFileSync(
|
|
join(userDir, 'deploy.md'),
|
|
'---\ndescription: Deploy script\n---\nrun deploy',
|
|
'utf-8',
|
|
)
|
|
|
|
const result = loadTemplate('deploy')
|
|
expect(result).not.toBeNull()
|
|
expect(result!.name).toBe('deploy')
|
|
})
|
|
})
|