feat: Premium UI overhaul, brain management, history persistence, and IME fix

This commit is contained in:
Wonseok Jung
2026-04-28 00:09:39 +09:00
parent 42ca873d45
commit 72666ea0bc
4 changed files with 554 additions and 866 deletions
+43 -31
View File
@@ -465,25 +465,32 @@ export class AgentExecutor {
return [
`제가 실제로 \`${projectPath}\` 폴더를 읽고 1차 분석했습니다.`,
'',
'**제품 설명**',
pkg?.name
? `- 이 프로젝트는 \`${pkg.name}\`${pkg.description ? ` (${pkg.description})` : ''}로 식별됩니다.`
: '- `package.json` 기준의 제품명은 확인되지 않았습니다.',
readmeSummary ? `- README 기준 핵심 설명: ${readmeSummary}` : '- README 기반 제품 설명은 부족합니다. 제품 소개 문서를 보강하는 편이 좋습니다.',
stack.length ? `- 감지된 기술 스택: ${stack.join(', ')}` : '- 기술 스택은 파일 구조만으로는 명확하지 않습니다.',
'### 📋 제품 개요',
'| 항목 | 내용 |',
'| :--- | :--- |',
pkg?.name ? `| **제품명** | \`${pkg.name}\` |` : '| **제품명** | 식별되지 않음 |',
pkg?.description ? `| **설명** | ${pkg.description} |` : '| **설명** | - |',
stack.length ? `| **기술 스택** | ${stack.join(', ')} |` : '| **기술 스택** | 파악 중 |',
readmeSummary ? `| **핵심 요약** | ${readmeSummary} |` : '| **핵심 요약** | README 정보 부족 |',
'',
'**설계 구조**',
topDirs.length ? topDirs.map(item => `- ${item}`).join('\n') : '- 상위 디렉구조가 단순하거나 비어 있습니다.',
entryPoints.length ? `- 주요 진입점 후보: ${entryPoints.join(', ')}` : '- 명확한 앱 진입점은 아직 식별되지 않았습니다.',
configFiles.length ? `- 주요 설정 파일: ${configFiles.slice(0, 12).join(', ')}` : '- 주요 설정 파일이 많지 않습니다.',
'### 🏗️ 설계 구조',
'| 디렉| 파일 수 |',
'| :--- | :--- |',
...(topDirs.length ? topDirs : ['| - | - |']),
'',
'**코드 리뷰 관점의 1차 소견**',
reviewFindings.join('\n'),
'**주요 진입점 및 설정**',
entryPoints.length ? `- 진입점: ${entryPoints.map(e => `\`${e}\``).join(', ')}` : '- 명확한 진입점 미식별',
configFiles.length ? `- 설정: ${configFiles.slice(0, 8).map(f => `\`${f}\``).join(', ')}` : '- 주요 설정 파일 없음',
'',
'**다음에 더 깊게 볼 부분**',
'- 실제 비즈니스 플로우는 `src`, `app`, `lib`, `components` 내부 핵심 파일을 2차로 읽어야 정확히 판단할 수 있습니다.',
'- 지금 단계에서는 “아무것도 안 하고 말만 하는” 답변이 아니라, 실제 파일 시스템을 기준으로 프로젝트 형태를 먼저 파악한 결과입니다.',
'- 원하시면 다음 턴에서 제가 핵심 소스 파일을 더 읽어 아키텍처 다이어그램 수준으로 이어서 정리하겠습니다.'
'### 🔍 코드 리뷰 1차 소견',
...reviewFindings.map(f => f.startsWith('-') ? f : `- ${f}`),
'',
'### 🚀 향후 분석 제안',
'1. **비즈니스 로직 분석**: `src`, `app`, `lib` 내부의 핵심 비즈니스 흐름 파악',
'2. **아키텍처 시각화**: 파일 간 의존성 및 데이터 흐름 다이어그램 작성',
'3. **상세 코드 리뷰**: 특정 파일이나 기능에 대한 심층 분석',
'',
'*분석을 계속하시려면 궁금한 파일이나 모듈을 말씀해 주세요.*'
].join('\n');
}
@@ -521,7 +528,7 @@ export class AgentExecutor {
.slice(0, 12)
.map(entry => {
const count = this.collectProjectFiles(path.join(projectPath, entry.name), 200, projectPath).length;
return `\`${entry.name}/\`:${count}파일`;
return `| \`${entry.name}/\` |${count}|`;
});
}
@@ -638,27 +645,32 @@ export class AgentExecutor {
.map((entry) => {
const dirPath = path.join(brainDir, entry.name);
const count = findBrainFiles(dirPath).length;
return `- ${entry.name}/: ${count}개 문서`;
return `| \`${entry.name}/\` | ${count}개 문서 |`;
});
const fileSummaries = entries
.filter((entry) => entry.isFile() && entry.name.endsWith('.md'))
.slice(0, 8)
.slice(0, 10)
.map((entry) => `- ${entry.name}`);
const sampleFiles = files
.slice(0, 10)
.map((file) => `- ${path.relative(brainDir, file)}`);
const sections = [
`현재 연결된 제2뇌 **${activeBrain.name}**입니다.`,
`경로: \`${brainDir}\``,
`총 Markdown 지식 문서: **${files.length}개**`,
activeBrain.description ? `설명: ${activeBrain.description}` : '',
directorySummaries.length ? `\n상위 폴더 구조는 이렇게 보입니다.\n${directorySummaries.join('\n')}` : '',
fileSummaries.length ? `\n루트에 있는 주요 문서는 이런 것들이 있습니다.\n${fileSummaries.join('\n')}` : '',
sampleFiles.length ? `\n제가 우선 참고할 수 있는 샘플 문서는 다음과 같습니다.\n${sampleFiles.join('\n')}` : '',
`\n이 자료는 충분히 도움이 됩니다. 앞으로 질문을 받으면 먼저 이 제2뇌에서 관련 기준이나 맥락을 찾고, 부족할 때만 제 일반 지식으로 보완하겠습니다.`
`현재 연결된 제2뇌 **${activeBrain.name}**의 개요입니다.`,
'',
'### 🧠 지식 베이스 현황',
'| 항목 | 정보 |',
'| :--- | :--- |',
`| **위치** | \`${brainDir}\` |`,
`| **문서 총계** | **${files.length}개** |`,
activeBrain.description ? `| **설명** | ${activeBrain.description} |` : '| **설명** | 설정된 설명 없음 |',
'',
'### 📂 주요 카테고리',
'| 폴더명 | 문서 수 |',
'| :--- | :--- |',
...(directorySummaries.length ? directorySummaries : ['| - | - |']),
'',
fileSummaries.length ? `### 📄 최근/주요 문서\n${fileSummaries.join('\n')}` : '',
'',
'이 자료들을 기반으로 답변을 최적화하겠습니다. 특정 주제에 대해 깊이 있는 분석이 필요하시면 말씀해 주세요.'
].filter(Boolean);
return sections.join('\n');