mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-23 00:35:51 +00:00
Feat/integrate lint preview (#285)
* 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>
This commit is contained in:
87
src/jobs/__tests__/templates.test.ts
Normal file
87
src/jobs/__tests__/templates.test.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* 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')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user