/** * v2.2.278 — 위키 문서 포맷 통일 (봉투 + 공용 빌더). */ import { ensureFrontmatter, hasFrontmatter, slugifyId, buildKnowledgeWikiPrompt } from '../src/features/datacollect/wikiFormat'; import { buildWikifyPrompt, buildEmailCanonicalWikifyPrompt } from '../src/features/datacollect/prompts/wikifyPrompt'; describe('ensureFrontmatter — 봉투 통일', () => { test('frontmatter 없는 보고서형 문서에 정본 봉투 부착', () => { const out = ensureFrontmatter('회의록 주간회의 2026-07-03', '# 회의록\n내용…', { docType: 'meeting', sources: ['transcript.txt'], }); expect(out.startsWith('---')).toBe(true); expect(out).toContain('title: "회의록 주간회의 2026-07-03"'); expect(out).toContain('category: "meeting"'); expect(out).toContain('tags: ["meeting", "astra"]'); expect(out).toContain('raw_sources: ["transcript.txt"]'); expect(out).toContain('# 회의록'); // 본문 보존 expect(out).toContain('## 📝 변경 이력'); }); test('이미 frontmatter 있는 문서(정본 프롬프트 산출물)는 그대로', () => { const doc = '---\nid: x\n---\n본문'; expect(ensureFrontmatter('t', doc, { docType: 'wikify' })).toBe(doc); }); test('코드펜스로 감싼 frontmatter 도 인식 (LLM 출력 변형 대응)', () => { expect(hasFrontmatter('```markdown\n---\nid: x\n---\n```')).toBe(true); expect(hasFrontmatter('# 그냥 제목')).toBe(false); }); test('slugifyId — 한글 유지·특수문자 제거·80자 캡', () => { expect(slugifyId('회의록 A/B 테스트!', 'x')).toBe('회의록-ab-테스트'); expect(slugifyId('', 'fallback')).toBe('fallback'); }); }); describe('buildKnowledgeWikiPrompt — 단일 정본 빌더', () => { test('kind별 규칙 주입 + 정본 골격', () => { const p = buildKnowledgeWikiPrompt({ kind: 'slack', topic: '배포 논의', body: 'BODY', meta: { 채널: '#dev' }, sourceRef: 'slack:#dev', extraRules: ['슬랙 특수 규칙 X'], trustHint: '내부 교신이므로 A~B 로', }, null); expect(p).toContain("주제: '배포 논의'"); expect(p).toContain('5. 슬랙 특수 규칙 X'); // extraRules 번호 이어붙임 expect(p).toContain('6. 이 문서의 출처는 slack'); // trust 규칙이 그 다음 번호 expect(p).toContain('- 채널: #dev'); expect(p).toContain('## 🎯 한 줄 통찰'); expect(p).toContain('## 🔗 지식 그래프'); expect(p).toContain('raw_sources: ["slack:#dev"]'); }); test('web·email 래퍼가 같은 정본 골격을 공유 (파편화 종료)', () => { const web = buildWikifyPrompt({ url: 'https://x.com', title: 'T', text: 'B' }, '', null); const email = buildEmailCanonicalWikifyPrompt('T', 'B', {}, null); for (const marker of ['[필수 규칙]', '[소스 메타]', '[소스 본문]', '## 🎯 한 줄 통찰', '## 📚 출처', 'P-Reinforce v3.1']) { expect(web).toContain(marker); expect(email).toContain(marker); } // 종류별 특수 규칙은 각자 유지 expect(web).toContain('JSON Schema'); expect(email).toContain('누가·언제·무엇을'); }); });