feat: force folder selection before brain pack injection or github sync

This commit is contained in:
Jay
2026-04-22 11:21:57 +09:00
parent 691bf16da2
commit f731b4735b
2 changed files with 51 additions and 2 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "connect-ai-lab",
"displayName": "Connect AI",
"description": "100% 로컬 AI 코딩 에이전트 — 파일 생성, 코드 편집, 터미널 실행을 오프라인으로. Ollama + Gemma/Llama/DeepSeek 지원.",
"version": "2.2.14",
"version": "2.2.15",
"publisher": "connectailab",
"license": "MIT",
"icon": "assets/icon.png",
+50 -1
View File
@@ -37,6 +37,35 @@ function _getBrainDir(): string {
return path.join(os.homedir(), '.connect-ai-brain');
}
function _isBrainDirExplicitlySet(): boolean {
const { localBrainPath } = getConfig();
return !!(localBrainPath && localBrainPath.trim() !== '');
}
async function _ensureBrainDir(): Promise<string | null> {
if (_isBrainDirExplicitlySet()) {
return _getBrainDir();
}
// 폴더 미설정 → 사용자에게 강제 선택 요청
const result = await vscode.window.showInformationMessage(
'📁 지식을 저장할 폴더를 먼저 선택해주세요! (내 지식이 저장될 곳입니다)',
'폴더 선택하기'
);
if (result !== '폴더 선택하기') return null;
const folders = await vscode.window.showOpenDialog({
canSelectFolders: true, canSelectFiles: false, canSelectMany: false,
openLabel: '이 폴더를 내 지식 폴더로 사용',
title: '🧠 내 지식 폴더 선택'
});
if (!folders || folders.length === 0) return null;
const selectedPath = folders[0].fsPath;
await vscode.workspace.getConfiguration('connectAiLab').update('localBrainPath', selectedPath, vscode.ConfigurationTarget.Global);
vscode.window.showInformationMessage(`✅ 지식 폴더가 설정되었습니다: ${selectedPath}`);
return selectedPath;
}
const EXCLUDED_DIRS = new Set([
'node_modules', '.git', '.vscode', 'out', 'dist', 'build',
'.next', '.cache', '__pycache__', '.DS_Store', 'coverage',
@@ -350,7 +379,21 @@ export function activate(context: vscode.ExtensionContext) {
req.on('end', async () => {
try {
const parsed = JSON.parse(body);
const brainDir = _getBrainDir();
// 폴더 미설정 시 강제 선택 요청
let brainDir: string;
if (!_isBrainDirExplicitlySet()) {
const ensured = await _ensureBrainDir();
if (!ensured) {
res.writeHead(400, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: '지식 폴더를 먼저 선택해주세요.' }));
return;
}
brainDir = ensured;
} else {
brainDir = _getBrainDir();
}
if (!fs.existsSync(brainDir)) {
fs.mkdirSync(brainDir, { recursive: true });
}
@@ -1111,6 +1154,12 @@ class SidebarChatProvider implements vscode.WebviewViewProvider {
return;
}
// 폴더 미설정 시 먼저 폴더 선택 강제
if (!_isBrainDirExplicitlySet()) {
const ensured = await _ensureBrainDir();
if (!ensured) { return; }
}
let secondBrainRepo = vscode.workspace.getConfiguration('connectAiLab').get<string>('secondBrainRepo', '');
// UX 극대화: 안 채워져 있으면 에러 내뱉지 말고 입력창 띄우기!