From 116dafd3cf0397ecb822c31295cb2b5225e646b6 Mon Sep 17 00:00:00 2001 From: g1nation Date: Mon, 8 Jun 2026 10:29:03 +0900 Subject: [PATCH] =?UTF-8?q?feat(settings):=20Settings=20=ED=8C=A8=EB=84=90?= =?UTF-8?q?=204-=ED=83=AD=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20(v2.2.206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 9개 섹션을 모델·연결 / 지식·기억 / 연동 / 동작·고급 4탭으로 그룹핑. 표현 계층만 추가(탭 네비 + show/hide) — ID/data-save/리스너/renderState/ provider 무수정. 좁은 사이드뷰 줄바꿈, 활성 탭 setState 기억. Co-Authored-By: Claude Opus 4.8 --- PATCHNOTES.md | 6 ++++++ media/settings-panel.css | 32 ++++++++++++++++++++++++++++++++ media/settings-panel.html | 25 ++++++++++++++++--------- media/settings-panel.js | 19 +++++++++++++++++++ package.json | 2 +- 5 files changed, 74 insertions(+), 10 deletions(-) diff --git a/PATCHNOTES.md b/PATCHNOTES.md index 4d4e804..52208ac 100644 --- a/PATCHNOTES.md +++ b/PATCHNOTES.md @@ -1,5 +1,11 @@ # Astra Patch Notes +## v2.2.206 (2026-06-08) +### 🗂️ Settings 패널 카테고리 탭 정리 +- 길게 나열되던 9개 설정 섹션을 **4개 탭**으로 그룹핑 — **모델·연결**(연결+Cloud Providers) / **지식·기억**(메모리+두뇌) / **연동**(Datacollect+Telegram+Google) / **동작·고급**(Devil+고급). +- 표현 계층만 추가(탭 네비 + show/hide) — 요소 ID·`data-save`·리스너·`renderState`·provider 전부 무수정이라 저장 동작 그대로. 좁은 사이드뷰 대응(탭 줄바꿈), 활성 탭 기억(setState). +- 변경: [settings-panel.html](media/settings-panel.html) · [settings-panel.css](media/settings-panel.css) · [settings-panel.js](media/settings-panel.js). + ## v2.2.205 (2026-06-05) ### 🧹 백엔드 분리 준비 — Bridge 타깃 토글(로컬/NAS) + /research 제거 - **Datacollect Bridge 타깃 설정** 추가 — Astra Settings 패널에서 `로컬/NAS` 전환 + NAS URL/토큰(`x-bridge-token`). 기본 `로컬` = 현행 동작 그대로. ([bridgeClient.ts](src/features/datacollect/bridgeClient.ts) · [settings-panel](media/settings-panel.html) · [settingsPanelProvider.ts](src/features/settings/settingsPanelProvider.ts)) diff --git a/media/settings-panel.css b/media/settings-panel.css index aa77d96..eb084c7 100644 --- a/media/settings-panel.css +++ b/media/settings-panel.css @@ -42,6 +42,38 @@ body { opacity: 0.7; } +/* ─── Tabs (카테고리 네비) ─── */ +.tabs { + display: flex; + gap: 6px; + flex-wrap: wrap; /* 좁은 사이드뷰에서 자동 줄바꿈 */ + margin-bottom: 14px; +} +.tab { + padding: 6px 12px; + border-radius: 6px; + border: 1px solid var(--vscode-panel-border); + background: transparent; + color: var(--vscode-descriptionForeground); + font-size: 12px; + font-weight: 600; + cursor: pointer; + white-space: nowrap; +} +.tab:hover { + color: var(--vscode-foreground); + background: var(--vscode-list-hoverBackground); +} +.tab.active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border-color: var(--vscode-button-background); +} +/* 비활성 탭 섹션 숨김 — DOM 에는 그대로 두고 표시만 끈다(JS refs/state 무영향). */ +.section[hidden] { + display: none !important; +} + .hint { color: var(--vscode-descriptionForeground); font-size: 11px; diff --git a/media/settings-panel.html b/media/settings-panel.html index 0bf76e0..883bf9b 100644 --- a/media/settings-panel.html +++ b/media/settings-panel.html @@ -14,9 +14,16 @@ + +
-
+

연결

로컬 AI 엔진(Ollama 또는 LM Studio) 위치와 기본 모델을 설정합니다.

@@ -46,7 +53,7 @@
-
+

Datacollect (slash 명령)

채팅에서 /research · /benchmark · /youtube 를 입력하면 Datacollect Bridge로 위임됩니다. 타깃으로 로컬(npm run bridge) 또는 NAS의 경량 Bridge 중 어디를 호출할지 선택합니다.

@@ -118,7 +125,7 @@
-
+

메모리

대화 응답 전에 주입되는 단기/중기/장기 메모리의 양을 조정합니다.

@@ -148,7 +155,7 @@
-
+

두뇌 (지식 폴더)

현재 활성 두뇌 프로필 정보입니다. 추가·수정은 사이드바의 [변경 ▾ → 두뇌] 또는 VS Code Settings에서 처리합니다.

@@ -165,7 +172,7 @@
-
+

Telegram 봇

텔레그램으로 Astra와 대화하고 싶다면 BotFather에서 봇을 만들고 토큰을 여기에 저장하세요. Astra의 다른 기능에는 영향이 없습니다.

@@ -205,7 +212,7 @@
-
+

Google (Calendar · Sheets)

회의록·할일을 Google Calendar 에 자동 등록하고 Sheets 를 읽고 쓰려면 OAuth 가 필요합니다. Google Cloud Console 에서 Desktop OAuth Client 만들고 Client ID/Secret 을 아래에 붙여넣으세요.

@@ -285,7 +292,7 @@
-
+

Cloud LLM Providers

Ollama / LM Studio 로컬 외에 cloud API 를 붙여서 모델 선택지를 확장. API key 는 모두 Secret Storage 에 저장 (settings.json 침범 X). 사이드바 모델 dropdown 에서 활성 provider 의 모델이 함께 표시됩니다.

@@ -357,7 +364,7 @@
-
+

🎭 Devil's Advocate (도현)

매 답변 직후 별도 LLM 호출로 *비판적 sparring partner* 가 한 문단 반박. 사용자의 사고를 능동적 방어로 전환. 같은 모델 재사용 (~10-15% 추가 비용).

@@ -369,7 +376,7 @@
-
+

고급

대부분의 사용자는 건드릴 필요 없습니다.

diff --git a/media/settings-panel.js b/media/settings-panel.js index 5196c03..f778c95 100644 --- a/media/settings-panel.js +++ b/media/settings-panel.js @@ -482,5 +482,24 @@ } } + // ---- Tabs (카테고리 네비) — 표현 계층만. 기존 refs/리스너/state 에 무영향 ---- + (function initTabs() { + const tabButtons = Array.from(document.querySelectorAll('.tab')); + const sections = Array.from(document.querySelectorAll('.section')); + if (tabButtons.length === 0) return; + const valid = new Set(tabButtons.map((b) => b.dataset.tab)); + function setActiveTab(tab) { + tabButtons.forEach((b) => b.classList.toggle('active', b.dataset.tab === tab)); + // 숨김만(hidden) — DOM 제거 X. renderState 는 숨겨진 입력에도 값을 채운다. + sections.forEach((s) => { s.hidden = s.dataset.tab !== tab; }); + try { const st = vscode.getState() || {}; vscode.setState({ ...st, activeTab: tab }); } catch (e) { /* noop */ } + } + tabButtons.forEach((b) => b.addEventListener('click', () => setActiveTab(b.dataset.tab))); + let initial = 'model'; + try { const saved = (vscode.getState() || {}).activeTab; if (saved && valid.has(saved)) initial = saved; } catch (e) { /* noop */ } + if (!valid.has(initial)) initial = tabButtons[0].dataset.tab; + setActiveTab(initial); + })(); + vscode.postMessage({ type: 'ready' }); })(); diff --git a/package.json b/package.json index c07c028..16794b2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "astra", "displayName": "Astra", "description": "The personal intelligence layer for Antigravity and VS Code. A private cognitive partner for deep project context, memory, and proactive strategic decision-making.", - "version": "2.2.205", + "version": "2.2.206", "publisher": "g1nation", "license": "MIT", "icon": "assets/icon.png",