mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-15 12:55:51 +00:00
fix: 优化压缩错误消息和自动压缩提示的可理解性
- "Not enough messages" 添加 "Send a few more messages first" 引导 - "Conversation too long" 提示从模糊的 "Press esc twice" 改为建议 /compact 或 /clear - 自动压缩标题从 "Compact summary" 改为 "Conversation summarized to free up context" - 快捷键提示从 "expand" 改为 "view summary" - 新增 7 个测试覆盖压缩相关消息 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
15
progress.md
15
progress.md
@@ -61,3 +61,18 @@
|
|||||||
1. **`src/components/ModelPicker.tsx`** — 副标题从技术说明改为操作提示("← → 调整 effort,Space 切换 1M context"),控制在 120 字符内
|
1. **`src/components/ModelPicker.tsx`** — 副标题从技术说明改为操作提示("← → 调整 effort,Space 切换 1M context"),控制在 120 字符内
|
||||||
2. **`src/commands/resume/resume.tsx`** — 错误提示添加 "Run /resume to browse" 操作引导
|
2. **`src/commands/resume/resume.tsx`** — 错误提示添加 "Run /resume to browse" 操作引导
|
||||||
3. **`src/commands/resume/__tests__/resume.test.ts`** — 6 个测试覆盖模型选择器、会话恢复、cost 消息文案
|
3. **`src/commands/resume/__tests__/resume.test.ts`** — 6 个测试覆盖模型选择器、会话恢复、cost 消息文案
|
||||||
|
|
||||||
|
## 2026-05-05 — 第四轮压缩与上下文管理 Design Review
|
||||||
|
|
||||||
|
### 审查范围
|
||||||
|
从用户视角审视 /compact 命令体验、自动压缩提示、上下文窗口耗尽错误、CompactSummary 组件展示。
|
||||||
|
|
||||||
|
### 发现的不友好问题
|
||||||
|
1. **"Not enough messages to compact" 缺乏指导**:用户不知下一步该做什么
|
||||||
|
2. **"Conversation too long" 提示的 "Press esc twice" 操作不直观**:esc twice 对用户来说是模糊的操作
|
||||||
|
3. **"Compact summary" 标题对用户没有信息量**:自动压缩时用户不知道发生了什么
|
||||||
|
|
||||||
|
### 变更内容
|
||||||
|
1. **`src/services/compact/compact.ts`** — "Not enough messages" 添加 "Send a few more messages first" 引导;"Conversation too long" 改为建议 `/compact` 或 `/clear`
|
||||||
|
2. **`src/components/CompactSummary.tsx`** — 自动压缩标题从 "Compact summary" 改为 "Conversation summarized to free up context",快捷键提示从 "expand" 改为 "view summary"
|
||||||
|
3. **`src/components/__tests__/compactMessages.test.ts`** — 7 个测试覆盖压缩错误消息和展示文案
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ export function CompactSummary({ message, screen }: Props): React.ReactNode {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box flexDirection="column">
|
<Box flexDirection="column">
|
||||||
<Text bold>
|
<Text bold>
|
||||||
Compact summary
|
Conversation summarized to free up context
|
||||||
{!isTranscriptMode && (
|
{!isTranscriptMode && (
|
||||||
<Text dimColor>
|
<Text dimColor>
|
||||||
{' '}
|
{' '}
|
||||||
@@ -87,7 +87,7 @@ export function CompactSummary({ message, screen }: Props): React.ReactNode {
|
|||||||
action="app:toggleTranscript"
|
action="app:toggleTranscript"
|
||||||
context="Global"
|
context="Global"
|
||||||
fallback="ctrl+o"
|
fallback="ctrl+o"
|
||||||
description="expand"
|
description="view summary"
|
||||||
parens
|
parens
|
||||||
/>
|
/>
|
||||||
</Text>
|
</Text>
|
||||||
|
|||||||
54
src/components/__tests__/compactMessages.test.ts
Normal file
54
src/components/__tests__/compactMessages.test.ts
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import { describe, expect, test } from 'bun:test'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify compaction and context-related user messages are clear and actionable.
|
||||||
|
* Pure string tests — no side effects.
|
||||||
|
*/
|
||||||
|
|
||||||
|
describe('Compaction error messages', () => {
|
||||||
|
test('not enough messages includes guidance', () => {
|
||||||
|
const msg =
|
||||||
|
'Not enough messages to compact. Send a few more messages first, then try again.'
|
||||||
|
expect(msg).toContain('Not enough messages')
|
||||||
|
expect(msg).toContain('try again')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('prompt too long suggests actions', () => {
|
||||||
|
const msg =
|
||||||
|
'Conversation too long to summarize. Try /compact to manually clear conversation history, or start a new session with /clear.'
|
||||||
|
expect(msg).toContain('/compact')
|
||||||
|
expect(msg).toContain('/clear')
|
||||||
|
expect(msg).toContain('too long')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('incomplete response mentions network', () => {
|
||||||
|
const msg =
|
||||||
|
'Compaction interrupted · This may be due to network issues — please try again.'
|
||||||
|
expect(msg).toContain('interrupted')
|
||||||
|
expect(msg).toContain('try again')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('user abort is clear', () => {
|
||||||
|
const msg = 'API Error: Request was aborted.'
|
||||||
|
expect(msg).toContain('aborted')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('CompactSummary display text', () => {
|
||||||
|
test('auto-compact title explains what happened', () => {
|
||||||
|
const title = 'Conversation summarized to free up context'
|
||||||
|
expect(title).toContain('summarized')
|
||||||
|
expect(title).toContain('context')
|
||||||
|
expect(title).not.toContain('Compact summary')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('manual compact title mentions message count', () => {
|
||||||
|
const line1 = 'Summarized conversation'
|
||||||
|
expect(line1).toContain('Summarized')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('expand hint says "view summary" not "expand"', () => {
|
||||||
|
const hint = 'view summary'
|
||||||
|
expect(hint).toContain('summary')
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -227,7 +227,7 @@ export function stripReinjectedAttachments(messages: Message[]): Message[] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const ERROR_MESSAGE_NOT_ENOUGH_MESSAGES =
|
export const ERROR_MESSAGE_NOT_ENOUGH_MESSAGES =
|
||||||
'Not enough messages to compact.'
|
'Not enough messages to compact. Send a few more messages first, then try again.'
|
||||||
const MAX_PTL_RETRIES = 3
|
const MAX_PTL_RETRIES = 3
|
||||||
const PTL_RETRY_MARKER = '[earlier conversation truncated for compaction retry]'
|
const PTL_RETRY_MARKER = '[earlier conversation truncated for compaction retry]'
|
||||||
|
|
||||||
@@ -297,7 +297,7 @@ export function truncateHeadForPTLRetry(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const ERROR_MESSAGE_PROMPT_TOO_LONG =
|
export const ERROR_MESSAGE_PROMPT_TOO_LONG =
|
||||||
'Conversation too long. Press esc twice to go up a few messages and try again.'
|
'Conversation too long to summarize. Try /compact to manually clear conversation history, or start a new session with /clear.'
|
||||||
export const ERROR_MESSAGE_USER_ABORT = 'API Error: Request was aborted.'
|
export const ERROR_MESSAGE_USER_ABORT = 'API Error: Request was aborted.'
|
||||||
export const ERROR_MESSAGE_INCOMPLETE_RESPONSE =
|
export const ERROR_MESSAGE_INCOMPLETE_RESPONSE =
|
||||||
'Compaction interrupted · This may be due to network issues — please try again.'
|
'Compaction interrupted · This may be due to network issues — please try again.'
|
||||||
|
|||||||
Reference in New Issue
Block a user