import { describe, expect, test } from 'bun:test' import { stripHtmlComments, isMemoryFilePath, getLargeMemoryFiles, } from '../../src/utils/claudemd' import { buildEffectiveSystemPrompt } from '../../src/utils/systemPrompt' import { createTempDir, cleanupTempDir, writeTempFile, } from '../mocks/file-system' // ─── CLAUDE.md Integration with System Prompt ───────────────────────── describe('Context build: CLAUDE.md + system prompt integration', () => { test('buildEffectiveSystemPrompt passes through default prompt', () => { const result = buildEffectiveSystemPrompt({ defaultSystemPrompt: 'You are Claude.', }) // Result is an array of strings (may be split differently) const joined = Array.from(result).join('') expect(joined).toBe('You are Claude.') }) test('buildEffectiveSystemPrompt handles empty prompts', () => { const result = buildEffectiveSystemPrompt({ defaultSystemPrompt: '', }) const joined = Array.from(result).join('') expect(joined).toBe('') }) test('buildEffectiveSystemPrompt with overrideSystemPrompt replaces everything', () => { const result = buildEffectiveSystemPrompt({ defaultSystemPrompt: 'Default', overrideSystemPrompt: 'Override', }) const joined = Array.from(result).join('') expect(joined).toBe('Override') }) test('buildEffectiveSystemPrompt with customSystemPrompt replaces default', () => { const result = buildEffectiveSystemPrompt({ defaultSystemPrompt: 'Default', customSystemPrompt: 'Custom', }) const joined = Array.from(result).join('') expect(joined).toBe('Custom') }) test('buildEffectiveSystemPrompt with appendSystemPrompt includes both', () => { const result = buildEffectiveSystemPrompt({ defaultSystemPrompt: 'Main prompt', appendSystemPrompt: 'Appended', }) const joined = Array.from(result).join('') expect(joined).toContain('Main prompt') expect(joined).toContain('Appended') // Appended should come after main expect(joined.indexOf('Main prompt')).toBeLessThan( joined.indexOf('Appended'), ) }) }) // ─── CLAUDE.md Discovery with Real File System ─────────────────────── describe('Context build: CLAUDE.md file system integration', () => { let tempDir: string test('strips HTML comments from CLAUDE.md content', () => { const input = 'Actual content' const { content, stripped } = stripHtmlComments(input) expect(content).toBe('Actual content') expect(stripped).toBe(true) }) test('preserves code blocks when stripping HTML comments', () => { const input = '```\n\n```\nReal text' const { content } = stripHtmlComments(input) expect(content).toContain('') expect(content).toContain('Real text') }) test('isMemoryFilePath correctly identifies CLAUDE.md paths', () => { expect(isMemoryFilePath('/project/CLAUDE.md')).toBe(true) expect(isMemoryFilePath('/project/CLAUDE.local.md')).toBe(true) expect(isMemoryFilePath('/project/.claude/rules/file.md')).toBe(true) expect(isMemoryFilePath('/project/README.md')).toBe(false) expect(isMemoryFilePath('/project/src/index.ts')).toBe(false) }) }) // ─── Large Memory File Filtering ────────────────────────────────────── describe('Context build: large memory file filtering', () => { test('getLargeMemoryFiles returns empty for empty input', () => { expect(getLargeMemoryFiles([])).toEqual([]) }) test('getLargeMemoryFiles returns empty when all files are small', () => { const files = [ { path: '/a/CLAUDE.md', content: 'small' }, { path: '/b/CLAUDE.md', content: 'also small' }, ] expect(getLargeMemoryFiles(files)).toEqual([]) }) })