From f21045c4ec381777eb4ee163c2a052f885fd89a3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 29 May 2026 14:23:04 +0000 Subject: [PATCH 1/4] =?UTF-8?q?refactor(tui):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=BA=8C=E7=BA=A7=E9=A1=B5=E5=86=97=E4=BD=99=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=8F=8F=E8=BF=B0=20subtitle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 标题已表意,进入二级页后重复展示 *Desc 描述属噪音。去掉 save/init/rules/doctor/trash/add-rm(home) 的描述性 subtitle, 并清理 ManifestPathPicker 中随之失效的 screenTitle/homeTitle。 i18n 的 *Desc key 仍被主菜单使用,故保留。 Co-authored-by: LiuSir --- src/tui/screens/ManifestPathPicker.tsx | 8 +------- src/tui/screens/ScreenDoctor.tsx | 1 - src/tui/screens/ScreenInit.tsx | 6 +----- src/tui/screens/ScreenRules.tsx | 1 - src/tui/screens/ScreenSave.tsx | 6 +----- src/tui/screens/ScreenTrash.tsx | 1 - 6 files changed, 3 insertions(+), 20 deletions(-) diff --git a/src/tui/screens/ManifestPathPicker.tsx b/src/tui/screens/ManifestPathPicker.tsx index 86a9d73..1ba6dad 100644 --- a/src/tui/screens/ManifestPathPicker.tsx +++ b/src/tui/screens/ManifestPathPicker.tsx @@ -74,9 +74,7 @@ export function ManifestPathPicker({ mode }: { mode: ManifestPathPickerMode }) { }); } - const screenTitle = mode === 'add' ? 'add' : 'rm'; const screenLabel = mode === 'add' ? copy.add : copy.rm; - const homeTitle = mode === 'add' ? copy.addDesc : copy.rmDesc; const reviewTitle = mode === 'add' ? 'confirm add to manifest' : 'confirm remove from manifest'; const reviewYes = mode === 'add' ? 'Yes — add these paths' : 'Yes — remove these manifest paths'; @@ -106,11 +104,7 @@ export function ManifestPathPicker({ mode }: { mode: ManifestPathPickerMode }) { if (phase === 'home') { return ( - + Project root: {projectRoot} + {end && ( diff --git a/src/tui/screens/ScreenRules.tsx b/src/tui/screens/ScreenRules.tsx index 626c334..89ae221 100644 --- a/src/tui/screens/ScreenRules.tsx +++ b/src/tui/screens/ScreenRules.tsx @@ -17,7 +17,6 @@ export function ScreenRules() { return ( r.isDefault).length }, { label: copy.customRule, value: rules.filter((r) => !r.isDefault).length }, diff --git a/src/tui/screens/ScreenSave.tsx b/src/tui/screens/ScreenSave.tsx index addc718..57eb7f7 100644 --- a/src/tui/screens/ScreenSave.tsx +++ b/src/tui/screens/ScreenSave.tsx @@ -42,11 +42,7 @@ export function ScreenSave() { }, [db, cwd, reporter]); return ( - + {end && ( diff --git a/src/tui/screens/ScreenTrash.tsx b/src/tui/screens/ScreenTrash.tsx index c356e4a..d04634c 100644 --- a/src/tui/screens/ScreenTrash.tsx +++ b/src/tui/screens/ScreenTrash.tsx @@ -18,7 +18,6 @@ export function ScreenTrash() { return ( sum + row.files.length, 0) }]} footer={`${ESCAPE_LIKE_HINT} → main menu`} > From 746064a3cb22c28777205dff70709cbf7502f20f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 29 May 2026 14:23:18 +0000 Subject: [PATCH 2/4] =?UTF-8?q?refactor(tui):=20status=20=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=8A=98=E5=8F=A0=E6=9C=AA=E5=8F=98=E6=9B=B4=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未变更文件逐行铺满屏幕属噪音。改为只列出 created/changed/untracked, 未变更数量仍保留在顶部 stats 中;工作区干净时显示「✓ 未变」提示。 Co-authored-by: LiuSir --- src/tui/screens/ScreenStatus.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/tui/screens/ScreenStatus.tsx b/src/tui/screens/ScreenStatus.tsx index adcb417..c987950 100644 --- a/src/tui/screens/ScreenStatus.tsx +++ b/src/tui/screens/ScreenStatus.tsx @@ -1,4 +1,4 @@ -import { Box, Text, useInput } from 'ink'; +import { Text, useInput } from 'ink'; import { useEffect, useState } from 'react'; import { status } from '../../commands/status.js'; import { ScreenFrame } from '../components/ScreenFrame.js'; @@ -30,11 +30,11 @@ export function ScreenStatus() { missing: c.created.length, unchanged: c.unchanged.length, }); + // 仅列出有变化的条目;未变更文件只在顶部计数中体现,避免刷屏。 const out: string[] = []; for (const p of c.created) out.push(`! ${p}`); for (const p of c.changed) out.push(`~ ${p}`); for (const p of c.untracked) out.push(`? ${p}`); - for (const p of c.unchanged) out.push(` ${p}`); setLines(out); } catch (e) { setErr((e as Error).message); @@ -69,7 +69,13 @@ export function ScreenStatus() { } footer={`${ESCAPE_LIKE_HINT} → main menu`} > - {err ? {err} : lines.map((l) => {l})} + {err ? ( + {err} + ) : lines.length === 0 ? ( + {`✓ ${copy.unchanged}`} + ) : ( + lines.map((l) => {l}) + )} ); } From 0f971d2332aea0537d9a22d294efb57105b5dab2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 29 May 2026 14:23:18 +0000 Subject: [PATCH 3/4] =?UTF-8?q?refactor(tui):=20projects=20=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E6=97=B6=E9=97=B4=E6=88=B3=E4=B8=8E=20remote?= =?UTF-8?q?=20=E7=98=A6=E8=BA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit last save 由完整 ISO 改为 YYYY-MM-DD HH:mm 短格式; 过长 remote URL 中段省略;三行副标题精简为「受管 N · 时间」+ 可选 remote。 Co-authored-by: LiuSir --- src/tui/screens/ScreenProjects.tsx | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/tui/screens/ScreenProjects.tsx b/src/tui/screens/ScreenProjects.tsx index 62df67c..1768723 100644 --- a/src/tui/screens/ScreenProjects.tsx +++ b/src/tui/screens/ScreenProjects.tsx @@ -11,6 +11,20 @@ import { ESCAPE_LIKE_HINT, wantsEscapeLike } from '../escapeLike.js'; type Phase = 'list' | 'detail'; +/** 短时间戳:YYYY-MM-DD HH:mm(UTC),去掉秒与毫秒,避免详情页被长 ISO 串占满。 */ +function shortTimestamp(ms: number): string { + return new Date(ms).toISOString().slice(0, 16).replace('T', ' '); +} + +/** 过长字符串中段省略,保留首尾以便辨认(如长 remote URL)。 */ +function truncateMiddle(s: string, max: number): string { + if (s.length <= max) return s; + const keep = max - 1; + const head = Math.ceil(keep / 2); + const tail = Math.floor(keep / 2); + return `${s.slice(0, head)}…${s.slice(s.length - tail)}`; +} + export function ScreenProjects() { const { db, setScreen, copy } = useTui(); const [phase, setPhase] = useState('list'); @@ -41,17 +55,16 @@ export function ScreenProjects() { }, [phase, detail, db]); if (phase === 'detail' && detail) { - const lastSaved = - detail.lastSavedAt != null ? new Date(detail.lastSavedAt).toISOString() : 'never'; + const lastSaved = detail.lastSavedAt != null ? shortTimestamp(detail.lastSavedAt) : 'never'; + const subtitles = [`${copy.managed}: ${detail.fileCount} · ${lastSaved}`]; + if (detail.remote_url) { + subtitles.push(`${copy.remote}: ${truncateMiddle(detail.remote_url, 48)}`); + } return ( { setDetail(null); setPhase('list'); @@ -64,7 +77,6 @@ export function ScreenProjects() { return ( Date: Fri, 29 May 2026 14:23:18 +0000 Subject: [PATCH 4/4] =?UTF-8?q?refactor(tui):=20ls=20=E5=9B=BE=E4=BE=8B?= =?UTF-8?q?=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 去掉冗长的「implicit folder (no own row)」说明,仅保留核心符号图例。 Co-authored-by: LiuSir --- src/tui/screens/ScreenLs.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tui/screens/ScreenLs.tsx b/src/tui/screens/ScreenLs.tsx index 2cf090d..e890559 100644 --- a/src/tui/screens/ScreenLs.tsx +++ b/src/tui/screens/ScreenLs.tsx @@ -77,10 +77,7 @@ export function ScreenLs() { setScreen('main')} backTarget="main menu" />