release: v2.0.6 - Intelligence & UX Optimization (2026-05-14)

This commit is contained in:
g1nation
2026-05-14 00:13:54 +09:00
parent 39386f90b5
commit f1d5dbf031
18 changed files with 592 additions and 59 deletions
+31 -2
View File
@@ -469,7 +469,7 @@
.company-phase-card .cph-meta { color: var(--text-dim); font-size: 10px; }
.company-phase-card.report .cph-head { color: var(--accent); }
/* Project Architecture chip — sits just above the input when project mode is on. */
/* Project Architecture chip — three-state surface above the input. */
.arch-chip {
display: none;
align-items: center;
@@ -481,7 +481,20 @@
border-radius: 8px;
font-size: 11px;
}
.arch-chip[data-active="true"] { display: flex; }
.arch-chip[data-state="active"],
.arch-chip[data-state="inactive"] { display: flex; }
/* Inactive state has a muted look so it doesn't compete with active chips. */
.arch-chip[data-state="inactive"] {
background: var(--bg-secondary);
border-style: dashed;
}
.arch-chip[data-state="inactive"] .arch-chip-title { color: var(--text-dim); }
/* Per-state button visibility — JS only flips the chip's data-state. */
.arch-chip[data-state="active"] .arch-chip-inactive-only { display: none; }
.arch-chip[data-state="inactive"] .arch-chip-active-only { display: none; }
.arch-chip[data-state="inactive"] #archAttachBtn {
color: var(--accent); border-color: var(--accent);
}
.arch-chip-icon { font-size: 14px; flex-shrink: 0; }
.arch-chip-info { flex: 1; min-width: 0; line-height: 1.3; }
.arch-chip-title {
@@ -505,6 +518,22 @@
border-color: var(--border-bright);
}
/* Inline refresh-result card so the user sees what the refresh did. */
.arch-refresh-card {
border: 1px solid var(--border);
background: var(--surface);
border-radius: 8px;
padding: 6px 10px;
margin: 4px 0;
font-size: 10.5px;
color: var(--text-primary);
}
.arch-refresh-card .arc-head {
color: var(--text-bright); font-weight: 600; margin-bottom: 2px;
}
.arch-refresh-card .arc-meta { color: var(--text-dim); font-size: 9.5px; }
.arch-refresh-card.no-changes { border-style: dashed; }
/* Inline model picker that lives in the input footer, next to the attach
button. Replaces the (now-removed) bottom model row + the separate
"Model: ..." status text — one surface, click to change. */
+18 -6
View File
@@ -292,16 +292,28 @@
message with active=true. Click "Open" / "Refresh" / "Detach" to
route back to the chatHandlers cases.
-->
<div id="archChip" class="arch-chip" data-active="false">
<!--
Three-state chip:
data-state="hidden" → completely collapsed
data-state="active" → full info + Open / Refresh / Detach
data-state="inactive" → project name + Attach (or Re-attach) only
JS switches the state attribute on every `architectureStatus`
event so the user always has a one-click path back into project
mode after a Detach.
-->
<div id="archChip" class="arch-chip" data-state="hidden">
<span class="arch-chip-icon">📋</span>
<div class="arch-chip-info">
<div class="arch-chip-title" id="archChipTitle"></div>
<div class="arch-chip-meta" id="archChipMeta">Auto-load Off</div>
<div class="arch-chip-meta" id="archChipMeta"></div>
</div>
<div class="arch-chip-actions">
<button class="arch-chip-btn" id="archOpenBtn" title="Architecture 문서 열기">Open</button>
<button class="arch-chip-btn" id="archRefreshBtn" title="지금 다시 스캔">Refresh</button>
<button class="arch-chip-btn" id="archDetachBtn" title="자동 첨부 끄기">Detach</button>
<div class="arch-chip-actions" id="archChipActions">
<!-- active state buttons -->
<button class="arch-chip-btn arch-chip-active-only" id="archOpenBtn" title="Architecture 문서 열기">Open</button>
<button class="arch-chip-btn arch-chip-active-only" id="archRefreshBtn" title="지금 다시 스캔">Refresh</button>
<button class="arch-chip-btn arch-chip-active-only" id="archDetachBtn" title="자동 첨부 끄기">Detach</button>
<!-- inactive state button -->
<button class="arch-chip-btn arch-chip-inactive-only" id="archAttachBtn" title="이 프로젝트에 architecture 자동 첨부 켜기">Attach</button>
</div>
</div>
<div id="agentConfigPanel" class="panel">
+48 -9
View File
@@ -804,21 +804,28 @@
break;
}
case 'architectureStatus': {
// Show / hide the chip + reflect current state.
// Three-state chip:
// active — full info + Open/Refresh/Detach
// inactive — name + [Attach] button (user previously detached, OR doc not yet generated)
// hidden — no project + no workspace
const chip = document.getElementById('archChip');
const title = document.getElementById('archChipTitle');
const meta = document.getElementById('archChipMeta');
if (!chip || !title || !meta) break;
const v = msg.value || {};
if (!v.active) {
chip.setAttribute('data-active', 'false');
break;
if (v.active) {
chip.setAttribute('data-state', 'active');
title.textContent = `${v.projectName || 'Project'} architecture`;
const updatedLabel = v.lastUpdated ? `updated ${formatRelativeTime(v.lastUpdated)}` : 'just attached';
const autoLabel = v.autoUpdate === false ? 'Auto-update Off' : 'Auto-update On';
meta.textContent = `${updatedLabel} · ${autoLabel}`;
} else if (v.canAttach && v.projectName) {
chip.setAttribute('data-state', 'inactive');
title.textContent = `${v.projectName} architecture`;
meta.textContent = v.detached ? 'detached — click Attach to re-enable' : 'not yet activated';
} else {
chip.setAttribute('data-state', 'hidden');
}
chip.setAttribute('data-active', 'true');
title.textContent = `${v.projectName || 'Project'} architecture`;
const updatedLabel = v.lastUpdated ? `updated ${formatRelativeTime(v.lastUpdated)}` : 'just attached';
const autoLabel = v.autoUpdate === false ? 'Auto-update Off' : 'Auto-update On';
meta.textContent = `${updatedLabel} · ${autoLabel}`;
break;
}
case 'architectureRefreshFailed': {
@@ -830,6 +837,34 @@
}
break;
}
case 'architectureRefreshResult': {
// Trust-building stats card: shows exactly what the
// refresh did so users don't have to guess whether the
// 0.1s click actually accomplished anything.
const v = msg.value || {};
const card = document.createElement('div');
card.className = 'arch-refresh-card';
const noChanges = (v.newlyAnalyzed | 0) === 0 && (v.deleted | 0) === 0;
if (noChanges) card.classList.add('no-changes');
const head = noChanges
? `📋 ${escAttr(v.projectName || 'Project')} architecture — 변경 사항 없음`
: `📋 ${escAttr(v.projectName || 'Project')} architecture refreshed`;
const parts = [
`${v.newlyAnalyzed | 0} newly analysed`,
`${v.cached | 0} cached`,
];
if ((v.deleted | 0) > 0) parts.push(`${v.deleted | 0} deleted`);
parts.push(`${v.durationMs | 0}ms`);
card.innerHTML =
`<div class="arc-head">${head}</div>` +
`<div class="arc-meta">${parts.join(' · ')}</div>`;
const chatEl = document.getElementById('chat');
if (chatEl) {
chatEl.appendChild(card);
chatEl.scrollTop = chatEl.scrollHeight;
}
break;
}
case 'knowledgeMix': {
// Initial sync: reflect whatever weight is currently in settings.
if (msg.value && typeof msg.value.weight === 'number') {
@@ -1386,6 +1421,10 @@
if (_archOpenBtn) _archOpenBtn.onclick = () => vscode.postMessage({ type: 'openArchitectureDoc' });
if (_archRefreshBtn) _archRefreshBtn.onclick = () => vscode.postMessage({ type: 'refreshArchitecture' });
if (_archDetachBtn) _archDetachBtn.onclick = () => vscode.postMessage({ type: 'detachArchitecture' });
// [Attach] is visible only in the inactive chip state; clicking it
// re-enables architecture mode for the current workspace's project.
const _archAttachBtn = document.getElementById('archAttachBtn');
if (_archAttachBtn) _archAttachBtn.onclick = () => vscode.postMessage({ type: 'attachArchitecture' });
// ── 1인 기업 (Company) Mode chip + manage overlay ─────────────────────
// The chip itself toggles enabled/disabled. The ▾ button opens the