v2.2.299~307: 아키텍처 수렴 + 채팅 정리 + 벤치마킹 강화 + Claude 구독 엔진
- v2.2.299 아키텍처 수렴: coreChat 통일(엔진 휴리스틱 3벌 제거), 기업 모드 검색 오케스트레이터 승격, lib/execUtil(실행 래퍼 6곳·Python 탐지 3벌 단일화), lib/kstSchedule(워처 4개 nowInKst 통합), estimateTokens 통합, 설정 접근 규칙 명문화 - v2.2.300 채팅 화면 정리: LiveReasoningFilter(스트리밍 중 <think>/Harmony 추론 토큰 단위 차단), 확신도·검토요청 footer 기본 숨김(계산·Reflection 은 유지) - v2.2.301 문맥·의도 이해: [답변 전 이해 원칙] 상시 주입, 워크플로우 의도 브리핑, Report QA 루프(규칙 레지스트리+실측치+회귀 게이트, 블로그_v3 개념 이식) - v2.2.302 /benchmark 비즈니스 렌즈(가격·수익·운영)+빌드 프롬프트 모드+QA 연계 - v2.2.303 handoff 모드(측정치 무손실 인수인계 문서)+/claude(Claude Code 터미널 위임) - v2.2.304 이식성: 지식 경로 두뇌-상대 규약(pickWikiDir 상대 해석), 이사 체크리스트 - v2.2.305 Claude 구독 엔진: claude: 프로바이더(CLI 위임, 모델 드롭다운 자동 노출, coreChat 지원 — 워크플로우·QA도 구독 모델 가능) - v2.2.306 Tone Guard: AI 상투어 금지 레지스트리(상담사 화법 실사례 8종+대조 예시) - v2.2.307 /benchmark 레이아웃 골격(sectionRoles 결정론 분석, 롤링 배너 즉답), 파트별 실패 격리, 합성 타임아웃 120→300초 검증: tsc 무오류 + jest 888 통과 + esbuild 정상 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import { buildSynthesisPrompt } from '../src/features/datacollect/prompts/synthesisPrompt';
|
||||
|
||||
// handlers.ts 는 vscode·bridge 의존이 커서 순수 함수만 골라 검증한다
|
||||
// (vscode 는 전역 moduleNameMapper mock 이 처리 — 로컬 jest.mock 금지).
|
||||
import { parseBenchmarkArgs, BENCHMARK_MODE_PARTS } from '../src/features/datacollect/handlers';
|
||||
|
||||
const SCAN = {
|
||||
url: 'https://interiorai.com',
|
||||
meta: { title: 'InteriorAI', description: 'Fire your interior designer', lang: 'en' },
|
||||
design: { colors: { palette: [{ value: 'rgb(10,10,10)', count: 40 }] }, typography: { primaryFont: 'Inter' } },
|
||||
microcopy: { headline: 'Fire your interior designer', ctaSamples: ['Get started $29/mo'] },
|
||||
structure: { h1: 'Fire your interior designer' },
|
||||
sitemap: { totalPages: 3, crawlDepth: 1, ascii: '/', pages: [] },
|
||||
};
|
||||
|
||||
describe('parseBenchmarkArgs — 모드 파싱', () => {
|
||||
test('기본 모드는 full (디자인+비즈니스)', () => {
|
||||
const r = parseBenchmarkArgs('https://a.com depth=2 pages=10 부동산 쪽 변형');
|
||||
expect(r).toMatchObject({ url: 'https://a.com', depth: 2, pages: 10, mode: 'full', userContent: '부동산 쪽 변형' });
|
||||
});
|
||||
test('bare 키워드와 mode= 표기를 모두 받는다', () => {
|
||||
expect(parseBenchmarkArgs('https://a.com build').mode).toBe('build');
|
||||
expect(parseBenchmarkArgs('https://a.com mode=biz').mode).toBe('biz');
|
||||
expect(parseBenchmarkArgs('https://a.com mode:design').mode).toBe('design');
|
||||
});
|
||||
test('모드 키워드는 보조 설명에 섞이지 않는다', () => {
|
||||
const r = parseBenchmarkArgs('https://a.com biz 인테리어 시장 분석');
|
||||
expect(r.mode).toBe('biz');
|
||||
expect(r.userContent).toBe('인테리어 시장 분석');
|
||||
});
|
||||
test('URL 없으면 url 빈 문자열', () => {
|
||||
expect(parseBenchmarkArgs('design').url).toBe('');
|
||||
});
|
||||
});
|
||||
|
||||
describe('BENCHMARK_MODE_PARTS — 모드별 파트 구성', () => {
|
||||
test('full=1~4, design=1~3, biz=4만, build=1~5', () => {
|
||||
expect(BENCHMARK_MODE_PARTS.full).toEqual([1, 2, 3, 4]);
|
||||
expect(BENCHMARK_MODE_PARTS.design).toEqual([1, 2, 3]);
|
||||
expect(BENCHMARK_MODE_PARTS.biz).toEqual([4]);
|
||||
expect(BENCHMARK_MODE_PARTS.build).toEqual([1, 2, 3, 4, 5]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('buildSynthesisPrompt — 파트 4·5 템플릿', () => {
|
||||
test('파트 4는 비즈니스 렌즈 섹션(포지셔닝·가격·MVP·운영)을 요구한다', () => {
|
||||
const p = buildSynthesisPrompt(SCAN, '', 4);
|
||||
expect(p).toContain('10. 서비스 정의 & 포지셔닝');
|
||||
expect(p).toContain('11. 가격 & 수익 구조');
|
||||
expect(p).toContain('12. 기능 인벤토리');
|
||||
expect(p).toContain('13. 운영 & 방향성 제안');
|
||||
expect(p).toContain('MVP 컷');
|
||||
expect(p).toContain('손익분기');
|
||||
// 날조 금지 — 스캔에 없는 가격을 지어내지 않도록.
|
||||
expect(p).toContain('스캔 데이터 부족');
|
||||
});
|
||||
test('파트 4에서만 사용자 컨텍스트 결합 변형을 지시한다', () => {
|
||||
const p4 = buildSynthesisPrompt(SCAN, '부동산 중개용으로 변형', 4);
|
||||
expect(p4).toContain('사용자 컨텍스트 결합 변형');
|
||||
expect(p4).toContain('부동산 중개용으로 변형');
|
||||
const p3 = buildSynthesisPrompt(SCAN, '부동산 중개용으로 변형', 3);
|
||||
expect(p3).toContain('재해석·확장·전환하지 말 것'); // 원본 복원 원칙은 그대로
|
||||
});
|
||||
test('파트 5는 자기완결적 스텝 프롬프트와 실측 토큰 명시를 요구한다', () => {
|
||||
const p = buildSynthesisPrompt(SCAN, '', 5);
|
||||
expect(p).toContain('단계별 빌드 프롬프트');
|
||||
expect(p).toContain('STEP 1');
|
||||
expect(p).toContain('STEP 4');
|
||||
expect(p).toContain('자기완결적');
|
||||
expect(p).toContain('빌드 순서 요약');
|
||||
});
|
||||
test('파트 1~3 기존 템플릿은 변하지 않았다', () => {
|
||||
expect(buildSynthesisPrompt(SCAN, '', 1)).toContain('1. 시각적 정체성');
|
||||
expect(buildSynthesisPrompt(SCAN, '', 2)).toContain('8. 페이지 템플릿 맵');
|
||||
expect(buildSynthesisPrompt(SCAN, '', 3)).toContain('9. 원본 사이트 재구축 명세');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user