release: v2.0.6 - Intelligence & UX Optimization (2026-05-14)
This commit is contained in:
+31
-2
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user