chore(branding): replace Claude/Anthropic references with CoStrict in UI strings

This commit is contained in:
yhangf 2026-04-21 20:13:14 +08:00
parent 19112528d5
commit bd150468b0
9 changed files with 44 additions and 16 deletions

View File

@ -0,0 +1,28 @@
# csc 项目 UI 文案可直接替换清单
- 目的:筛选出**只需要替换展示文案**、即可让 UI 页面显示 `CoStrict` 而不是 `Claude` / `Claude Code` / `Anthropic` 的内容。
- 筛选原则:
1. 仅保留用户可见文案,例如 `title`、`subtitle`、`message`、`placeholder`、`label`、`aria-label`、`<Text>` 文本。
2. 不纳入命令、包名、环境变量、URL、路径、主题 token、埋点名、注释说明。
3. 对账号体系、订阅体系、Desktop/Chrome 集成等文案,标记为“**可替换但需谨慎**”。
---
## 一、高置信:可直接文本替换的 UI 文案
这部分基本都属于纯展示文本,直接替换后主要影响界面显示,不会直接触发命令、配置或协议变更。
| 文件 | 行号 | 原文 | 建议替换为 |
| --- | ---: | --- | --- |
| `packages/remote-control-server/web/index.html` | L6 | `Remote Control — Claude Code` | `Remote Control — CoStrict` |
| `packages/remote-control-server/web/automation.js` | L280 | `Claude Code is in proactive mode and currently sleeping until the next wake-up or user message.` | `CoStrict is in proactive mode and currently sleeping until the next wake-up or user message.` |
| `packages/remote-control-server/web/automation.js` | L290 | `Claude Code is in proactive mode and waiting for the next scheduled check-in.` | `CoStrict is in proactive mode and waiting for the next scheduled check-in.` |
| `packages/remote-control-server/web/automation.js` | L299 / L309 | `Claude Code is in proactive mode and may continue working between user messages.` | `CoStrict is in proactive mode and may continue working between user messages.` |
| `packages/remote-control-server/web/automation.js` | L319 | `Claude Code is processing an automatic background trigger.` | `CoStrict is processing an automatic background trigger.` |
| `packages/remote-control-server/web/automation.js` | L361 | `aria-label="Claude Code status"` | `aria-label="CoStrict status"` |
| `packages/@ant/ink/src/theme/LoadingState.tsx` | L45 | `Fetching your Claude Code sessions...` | `Fetching your CoStrict sessions...` |
| `src/components/FeedbackSurvey/FeedbackSurveyView.tsx` | L26 | `How is Claude doing this session? (optional)` | `How is CoStrict doing this session? (optional)` |
| `src/components/FeedbackSurvey/TranscriptSharePrompt.tsx` | L43 | `Can Anthropic look at your session transcript to help us improve` | `Can CoStrict look at your session transcript to help us improve` |
| `src/components/CostThresholdDialog.tsx` | L12 | `You've spent $5 on the Anthropic API this session.` | `You've spent $5 on the CoStrict API this session.` |
| `src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx` | L47 | `Description (tell Claude when to use this agent)` | `Description (tell CoStrict when to use this agent)` |
| `src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx` | L68 | `When should Claude use this agent?` | `When should CoStrict use this agent?` |

View File

@ -42,7 +42,7 @@ type LoadingStateProps = {
* <LoadingState
* message="Loading sessions"
* bold
* subtitle="Fetching your Claude Code sessions..."
* subtitle="Fetching your CoStrict sessions..."
* />
*/
export function LoadingState({

View File

@ -277,7 +277,7 @@ export function getAutomationIndicator(state) {
visible: true,
label: "Autopilot",
tone: "sleeping",
title: "Claude Code is in proactive mode and currently sleeping until the next wake-up or user message.",
title: "CoStrict is in proactive mode and currently sleeping until the next wake-up or user message.",
iconVariant: "sleeping",
};
}
@ -287,7 +287,7 @@ export function getAutomationIndicator(state) {
visible: true,
label: "Autopilot",
tone: "proactive",
title: "Claude Code is in proactive mode and waiting for the next scheduled check-in.",
title: "CoStrict is in proactive mode and waiting for the next scheduled check-in.",
iconVariant: "standby",
};
}
@ -296,7 +296,7 @@ export function getAutomationIndicator(state) {
visible: true,
label: "Autopilot",
tone: "proactive",
title: "Claude Code is in proactive mode and may continue working between user messages.",
title: "CoStrict is in proactive mode and may continue working between user messages.",
iconVariant: "active",
};
}
@ -306,7 +306,7 @@ export function getAutomationIndicator(state) {
visible: true,
label: "Autopilot",
tone: "proactive",
title: "Claude Code is in proactive mode and may continue working between user messages.",
title: "CoStrict is in proactive mode and may continue working between user messages.",
iconVariant: "active",
};
}
@ -316,7 +316,7 @@ export function getAutomationIndicator(state) {
visible: true,
label: "Auto Run",
tone: "auto-run",
title: "Claude Code is processing an automatic background trigger.",
title: "CoStrict is processing an automatic background trigger.",
iconVariant: "active",
};
}
@ -358,7 +358,7 @@ export function getAutomationActivity(state) {
export function renderAutomationIcon(variant = "active", { className = "", decorative = true } = {}) {
const classes = ["clawd-icon", `clawd-icon-${variant}`, className].filter(Boolean).join(" ");
const ariaAttrs = decorative ? 'aria-hidden="true"' : 'role="img" aria-label="Claude Code status"';
const ariaAttrs = decorative ? 'aria-hidden="true"' : 'role="img" aria-label="CoStrict status"';
return `
<span class="${classes}" ${ariaAttrs}>

View File

@ -96,7 +96,7 @@ describe("automation helpers", () => {
visible: true,
label: "Autopilot",
tone: "proactive",
title: "Claude Code is in proactive mode and may continue working between user messages.",
title: "CoStrict is in proactive mode and may continue working between user messages.",
iconVariant: "active",
});
@ -154,7 +154,7 @@ describe("automation helpers", () => {
visible: true,
label: "Autopilot",
tone: "proactive",
title: "Claude Code is in proactive mode and waiting for the next scheduled check-in.",
title: "CoStrict is in proactive mode and waiting for the next scheduled check-in.",
iconVariant: "standby",
});
expect(getAutomationActivity(state)).toEqual({

View File

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Remote Control — Claude Code</title>
<title>Remote Control — CoStrict</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700&family=Figtree:wght@300;400;500;600;700&family=Fira+Code:wght@400;500&display=swap" />

View File

@ -9,7 +9,7 @@ type Props = {
export function CostThresholdDialog({ onDone }: Props): React.ReactNode {
return (
<Dialog
title="You've spent $5 on the Anthropic API this session."
title="You've spent $5 on the CoStrict API this session."
onCancel={onDone}
>
<Box flexDirection="column">

View File

@ -23,7 +23,7 @@ const inputToResponse: Record<ResponseInput, FeedbackSurveyResponse> = {
export const isValidResponseInput = (input: string): input is ResponseInput =>
(RESPONSE_INPUTS as readonly string[]).includes(input)
const DEFAULT_MESSAGE = 'How is Claude doing this session? (optional)'
const DEFAULT_MESSAGE = 'How is CoStrict doing this session? (optional)'
export function FeedbackSurveyView({
onSelect,

View File

@ -40,8 +40,8 @@ export function TranscriptSharePrompt({
<Box>
<Text color="ansi:cyan">{BLACK_CIRCLE} </Text>
<Text bold>
Can Anthropic look at your session transcript to help us improve
CoStrict?
Can the CoStrict team look at your session transcript to help us
improve CoStrict?
</Text>
</Box>

View File

@ -44,7 +44,7 @@ export function DescriptionStep(): ReactNode {
return (
<WizardDialogLayout
subtitle="Description (tell Claude when to use this agent)"
subtitle="Description (tell CoStrict when to use this agent)"
footerText={
<Byline>
<KeyboardShortcutHint shortcut="Type" action="enter text" />
@ -65,7 +65,7 @@ export function DescriptionStep(): ReactNode {
}
>
<Box flexDirection="column">
<Text>When should Claude use this agent?</Text>
<Text>When should CoStrict use this agent?</Text>
<Box marginTop={1}>
<TextInput