You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Browse filesBrowse the repository at this point in the historyBrowse files
authored and
王超
committed
feat(chat): UltraPlan input tag + distinct menu/modal icons (v1.7.4)
- ui(chat): show a small inline blue "UltraPlan" tag in the user-bubble
label row (right after the view-request button) when the input was an
UltraPlan submission. Detection via new isUltraplanText() matching the
<system-reminder>[SCOPED INSTRUCTION] marker anchored inside one reminder
block, plus a message-level `ultraplan` flag from classifyUserContent(),
threaded through both ChatView user-render branches into ChatMessage.
- ui(menu): distinct icons for the log / prompt / messaging entries —
日志管理工具 -> FileTextOutlined, 查看用户 Prompt -> MessageOutlined,
通讯软件接入 + MessagingModal title -> new DialogueIcon (two-bubble dialogue).
- ui(retry-config): hide the retry-config menu entry unless proxy mode is
confirmed (change was already staged in the working tree).
- test: add test/ultraplan-detection.test.js (isUltraplanText + classify flag).
- chore: bump version 1.7.3 -> 1.7.4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: history.md
+5Lines changed: 5 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,11 @@
2
2
3
3
## Unreleased
4
4
5
+
- ui(chat): **`[UltraPlan]` tag above UltraPlan user bubbles** — when a chat user message was submitted via UltraPlan (`UltraPlanModal`/`buildLocalUltraplan`) or CLI `/ultraplan`, a small blue tag now appears above the user bubble so these special inputs stand out. Detection lives in the user-input classifier: new `isUltraplanText()` in `src/utils/contentFilter.js` matches the `<system-reminder>[SCOPED INSTRUCTION]…` marker (emitted only by `ultraplanTemplates.js`) on the **raw** text before `stripSystemTags` removes it — anchored inside a single reminder block (negative-lookahead on the close tag) to avoid tagging prose that merely mentions the phrase after an unrelated reminder. `classifyUserContent()` now returns a message-level `ultraplan` flag (additive key); `ChatView` threads it through both the array and string user-render branches (never on `plan-prompt`), and `ChatMessage.renderUserMessage()` renders the tag via new `.ultraplanTag`/`.ultraplanTagRow` classes (blue = `var(--color-primary)`, no `!important`). Reuses the existing `ui.ultraplan` label. New `test/ultraplan-detection.test.js` covers the detector (codeExpert/researchExpert/custom/seedPlan-prefixed + prose-mention / after-closed-reminder negatives) and the `classifyUserContent` flag (incl. non-first block via `.some`).
6
+
- ui(menu): **distinct icons for the log/prompt/messaging entries** — the hamburger「日志管理工具」now uses a notepad (`FileTextOutlined`) and「查看用户 Prompt」a single speech bubble (`MessageOutlined`), replacing the near-identical import/export box-arrow glyphs. The「通讯软件接入」entry and the MessagingModal title use a new two-bubble dialogue icon (`src/components/common/DialogueIcon.jsx`, lucide *messages-square*, `.anticon`-wrapped `currentColor` stroke) so the two-party IM integration reads differently from the single-bubble prompt entry.
7
+
8
+
- ui(retry-config): **hide the「代理重试配置」menu entry unless proxy mode is confirmed** — the hamburger entry (and its pinned shortcut / Electron tab-bar pin, which all derive from the same menu descriptors) now only renders when a non-built-in proxy profile is active, or the built-in Default points at a non-official endpoint (reuses ProxyModal's `api.anthropic.com` origin test). On an official subscription — or before `/api/proxy-profiles` has loaded — the entry is hidden, since retry orchestration only targets proxy gateways.
9
+
5
10
### Fix: `which claude` still shows the ccv wrapper after `ccv --uninstall` + `npm uninstall -g cc-viewer` (stale shell function → `command not found: ccv`)
6
11
7
12
-**Root cause:** the rc-file cleanup in `removeShellHook()` works — the marker block IS removed from disk — but every already-open shell keeps the `claude()` wrapper function loaded in memory (a child process cannot `unset -f` in the parent shell). Once `npm uninstall -g cc-viewer` deletes the `ccv` bin, the stale function's tail `ccv run -- claude --ccv-internal "$@"` hard-fails with `command not found: ccv`. The existing `unset -f claude` hint printed by `--uninstall` was one dim line immediately buried by the louder "done" message.
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "cc-viewer",
3
-
"version": "1.7.3",
3
+
"version": "1.7.4",
4
4
"description": "Claude Code logging, visualization, and management toolkit — launch a web viewer alongside Claude Code with full request/response tracing, proxy, and mobile support",
0 commit comments