chore: rebrand user-facing copy to OpenClaude (#851)

* chore: rebrand user-facing copy to OpenClaude

Replace lingering Claude Code branding in CLI, tips, and runtime UI with OpenClaude/openclaude, including the startup tip Gitlawb mention.

Co-Authored-By: Claude GPT-5.4 <noreply@openclaude.dev>

* chore: address branding-sweep review feedback

- PermissionRequest.tsx: rebrand the two remaining "Claude needs your
  approval/permission" notifications to OpenClaude (review-artifact and
  generic tool permission paths).
- main.tsx, teleport.tsx, session.tsx, WebFetchTool/utils.ts,
  skills/bundled/{debug,updateConfig}.ts: replace leftover `claude --…`
  CLI hints and "Claude Code" labels missed by the original sweep.
- main.tsx: drop the inline gitlawb.com marketing copy from the
  stale-prompt tip; keep it a pure rebrand.
- auth.ts: finish the half-rename so both `claude setup-token` and
  `claude auth login` references in the same error block now read
  `openclaude …`.
- mcp/client.ts: keep `name: 'claude-code'` for MCP server allowlist
  compatibility (now explicit via comment) and replace the
  "Anthropic's agentic coding tool" description with an OpenClaude one.
- MCPSettings.tsx: point the empty-server-list hint at
  https://github.com/Gitlawb/openclaude instead of code.claude.com.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: replace help link with OpenClaude repo URL

Replace https://code.claude.com/docs/en/overview with
https://github.com/Gitlawb/openclaude in the help screen.

Co-Authored-By: OpenClaude <openclaude@gitlawb.com>

---------

Co-authored-by: Claude GPT-5.4 <noreply@openclaude.dev>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: OpenClaude <openclaude@gitlawb.com>
This commit is contained in:
Kevin Codex
2026-04-26 22:14:36 +08:00
committed by GitHub
parent 2586a9cddb
commit 46a9d3eec4
85 changed files with 223 additions and 219 deletions

View File

@@ -302,7 +302,7 @@ export function getRequestTooLargeErrorMessage(): string {
: `Request too large (${limits}). Double press esc to go back and try with a smaller file.`
}
export const OAUTH_ORG_NOT_ALLOWED_ERROR_MESSAGE =
'Your account does not have access to Claude Code. Please run /login.'
'Your account does not have access to OpenClaude. Please run /login.'
export function getTokenRevokedErrorMessage(): string {
return getIsNonInteractiveSession()
@@ -1346,8 +1346,8 @@ export function getErrorMessageIfRefusal(
: "your provider's acceptable use policy"
const baseMessage = getIsNonInteractiveSession()
? `${API_ERROR_MESSAGE_PREFIX}: Claude Code is unable to respond to this request, which appears to violate our Usage Policy (${usagePolicyUrl}). Try rephrasing the request or attempting a different approach.`
: `${API_ERROR_MESSAGE_PREFIX}: Claude Code is unable to respond to this request, which appears to violate our Usage Policy (${usagePolicyUrl}). Please double press esc to edit your last message or start a new session for Claude Code to assist with a different task.`
? `${API_ERROR_MESSAGE_PREFIX}: OpenClaude is unable to respond to this request, which appears to violate our Usage Policy (${usagePolicyUrl}). Try rephrasing the request or attempting a different approach.`
: `${API_ERROR_MESSAGE_PREFIX}: OpenClaude is unable to respond to this request, which appears to violate our Usage Policy (${usagePolicyUrl}). Please double press esc to edit your last message or start a new session for OpenClaude to assist with a different task.`
const modelSuggestion =
model !== 'claude-sonnet-4-20250514'

View File

@@ -343,13 +343,13 @@ export async function checkGroveForNonInteractive(): Promise<void> {
if (config === null || config.notice_is_grace_period) {
// Grace period is still active - show informational message and continue
writeToStderr(
'\nAn update to our Consumer Terms and Privacy Policy will take effect on October 8, 2025. Run `claude` to review the updated terms.\n\n',
'\nAn update to our Consumer Terms and Privacy Policy will take effect on October 8, 2025. Run `openclaude` to review the updated terms.\n\n',
)
await markGroveNoticeViewed()
} else {
// Grace period has ended - show error message and exit
writeToStderr(
'\n[ACTION REQUIRED] An update to our Consumer Terms and Privacy Policy has taken effect on October 8, 2025. You must run `claude` to review the updated terms.\n\n',
'\n[ACTION REQUIRED] An update to our Consumer Terms and Privacy Policy has taken effect on October 8, 2025. You must run `openclaude` to review the updated terms.\n\n',
)
await gracefulShutdown(1)
}

View File

@@ -1209,7 +1209,7 @@ export async function performMCPOAuthFlow(
res.writeHead(200, { 'Content-Type': 'text/html' })
res.end(
`<h1>Authentication Successful</h1><p>You can close this window. Return to Claude Code.</p>`,
`<h1>Authentication Successful</h1><p>You can close this window. Return to OpenClaude.</p>`,
)
cleanup()
resolveOnce(result.code)

View File

@@ -1001,10 +1001,12 @@ export const connectToServer = memoize(
const client = new Client(
{
// name stays 'claude-code' for compatibility with MCP servers that
// gate features on the upstream client identifier.
name: 'claude-code',
title: 'Open Claude',
title: 'OpenClaude',
version: MACRO.VERSION ?? 'unknown',
description: "Anthropic's agentic coding tool",
description: 'OpenClaude — coding-agent CLI for any LLM provider',
websiteUrl: PRODUCT_URL,
},
{
@@ -3329,10 +3331,12 @@ export async function setupSdkMcpClients(
const client = new Client(
{
// name stays 'claude-code' for compatibility with MCP servers that
// gate features on the upstream client identifier.
name: 'claude-code',
title: 'Open Claude',
title: 'OpenClaude',
version: MACRO.VERSION ?? 'unknown',
description: "Anthropic's agentic coding tool",
description: 'OpenClaude — coding-agent CLI for any LLM provider',
websiteUrl: PRODUCT_URL,
},
{

View File

@@ -35,7 +35,7 @@ export async function sendNotification(
})
}
const DEFAULT_TITLE = 'Open Claude'
const DEFAULT_TITLE = 'OpenClaude'
async function sendToChannel(
channel: string,

View File

@@ -279,7 +279,7 @@ function getWarningUpsellText(
// Pro/Max users: prompt to upgrade
if (subscriptionType === 'pro' || subscriptionType === 'max') {
return '/upgrade to keep using Claude Code'
return '/upgrade to keep using OpenClaude'
}
}

View File

@@ -96,7 +96,7 @@ const externalTips: Tip[] = [
{
id: 'new-user-warmup',
content: async () =>
`Start with small features or bug fixes, tell Claude to propose a plan, and verify its suggested edits`,
`Start with small features or bug fixes, tell OpenClaude to propose a plan, and verify its suggested edits`,
cooldownSessions: 3,
async isRelevant() {
const config = getGlobalConfig()
@@ -142,7 +142,7 @@ const externalTips: Tip[] = [
{
id: 'git-worktrees',
content: async () =>
'Use git worktrees to run multiple Claude sessions in parallel.',
'Use git worktrees to run multiple OpenClaude sessions in parallel.',
cooldownSessions: 10,
isRelevant: async () => {
try {
@@ -157,7 +157,7 @@ const externalTips: Tip[] = [
{
id: 'color-when-multi-clauding',
content: async () =>
'Running multiple Claude sessions? Use /color and /rename to tell them apart at a glance.',
'Running multiple OpenClaude sessions? Use /color and /rename to tell them apart at a glance.',
cooldownSessions: 10,
isRelevant: async () => {
if (getCurrentSessionAgentColor()) return false
@@ -215,7 +215,7 @@ const externalTips: Tip[] = [
},
{
id: 'memory-command',
content: async () => 'Use /memory to view and manage Claude memory',
content: async () => 'Use /memory to view and manage OpenClaude memory',
cooldownSessions: 15,
async isRelevant() {
const config = getGlobalConfig()
@@ -254,7 +254,7 @@ const externalTips: Tip[] = [
{
id: 'prompt-queue',
content: async () =>
'Hit Enter to queue up additional messages while Claude is working.',
'Hit Enter to queue up additional messages while OpenClaude is working.',
cooldownSessions: 5,
async isRelevant() {
const config = getGlobalConfig()
@@ -264,14 +264,14 @@ const externalTips: Tip[] = [
{
id: 'enter-to-steer-in-relatime',
content: async () =>
'Send messages to Claude while it works to steer Claude in real-time',
'Send messages to OpenClaude while it works to steer OpenClaude in real-time',
cooldownSessions: 20,
isRelevant: async () => true,
},
{
id: 'todo-list',
content: async () =>
'Ask Claude to create a todo list when working on complex tasks to track progress and remain on track',
'Ask OpenClaude to create a todo list when working on complex tasks to track progress and remain on track',
cooldownSessions: 20,
isRelevant: async () => true,
},
@@ -304,7 +304,7 @@ const externalTips: Tip[] = [
},
{
id: 'ide-upsell-external-terminal',
content: async () => 'Connect Claude to your IDE · /ide',
content: async () => 'Connect OpenClaude to your IDE · /ide',
cooldownSessions: 4,
async isRelevant() {
if (isSupportedTerminal()) {
@@ -324,13 +324,13 @@ const externalTips: Tip[] = [
{
id: 'install-github-app',
content: async () =>
'Run /install-github-app to tag @claude right from your Github issues and PRs',
'Run /install-github-app to enable GitHub issue and PR tagging from OpenClaude',
cooldownSessions: 10,
isRelevant: async () => !getGlobalConfig().githubActionSetupCount,
},
{
id: 'install-slack-app',
content: async () => 'Run /install-slack-app to use Claude in Slack',
content: async () => 'Run /install-slack-app to use OpenClaude in Slack',
cooldownSessions: 10,
isRelevant: async () => !getGlobalConfig().slackAppInstallCount,
},
@@ -354,7 +354,7 @@ const externalTips: Tip[] = [
{
id: 'paste-images-mac',
content: async () =>
'Paste images into Claude Code using control+v (not cmd+v!)',
'Paste images into OpenClaude using control+v (not cmd+v!)',
cooldownSessions: 10,
isRelevant: async () => getPlatform() === 'macos',
},
@@ -375,7 +375,7 @@ const externalTips: Tip[] = [
{
id: 'continue',
content: async () =>
'Run claude --continue or claude --resume to resume a conversation',
'Run openclaude --continue or openclaude --resume to resume a conversation',
cooldownSessions: 10,
isRelevant: async () => true,
},
@@ -434,7 +434,7 @@ const externalTips: Tip[] = [
{
id: 'desktop-app',
content: async () =>
'Run Claude Code locally or remotely using the Claude desktop app: clau.de/desktop',
'Run OpenClaude locally or remotely with /desktop',
cooldownSessions: 15,
isRelevant: async () => getPlatform() !== 'linux',
},
@@ -442,7 +442,7 @@ const externalTips: Tip[] = [
id: 'desktop-shortcut',
content: async ctx => {
const blue = color('suggestion', ctx.theme)
return `Continue your session in Claude Code Desktop with ${blue('/desktop')}`
return `Continue your session with ${blue('/desktop')}`
},
cooldownSessions: 15,
isRelevant: async () => {
@@ -456,21 +456,21 @@ const externalTips: Tip[] = [
{
id: 'web-app',
content: async () =>
'Run tasks in the cloud while you keep coding locally · clau.de/web',
'Run tasks in the cloud while you keep coding locally · /web',
cooldownSessions: 15,
isRelevant: async () => true,
},
{
id: 'mobile-app',
content: async () =>
'/mobile to use Claude Code from the Claude app on your phone',
'/mobile to continue from your phone',
cooldownSessions: 15,
isRelevant: async () => true,
},
{
id: 'opusplan-mode-reminder',
content: async () =>
`Your default model setting is Opus Plan Mode. Press ${getShortcutDisplay('chat:cycleMode', 'Chat', 'shift+tab')} twice to activate Plan Mode and plan with Claude Opus.`,
`Your default model setting is Opus Plan Mode. Press ${getShortcutDisplay('chat:cycleMode', 'Chat', 'shift+tab')} twice to activate Plan Mode and plan with Opus.`,
cooldownSessions: 2,
async isRelevant() {
const config = getGlobalConfig()
@@ -517,7 +517,7 @@ const externalTips: Tip[] = [
'off' | 'copy_a' | 'copy_b'
>('tengu_tide_elm', 'off')
return variant === 'copy_b'
? `Use ${cmd} for better one-shot answers. Claude thinks it through first.`
? `Use ${cmd} for better one-shot answers. OpenClaude thinks it through first.`
: `Working on something tricky? ${cmd} gives better first answers`
},
cooldownSessions: 3,
@@ -546,8 +546,8 @@ const externalTips: Tip[] = [
'off' | 'copy_a' | 'copy_b'
>('tengu_tern_alloy', 'off')
return variant === 'copy_b'
? `For big tasks, tell Claude to ${blue('use subagents')}. They work in parallel and keep your main thread clean.`
: `Say ${blue('"fan out subagents"')} and Claude sends a team. Each one digs deep so nothing gets missed.`
? `For big tasks, tell OpenClaude to ${blue('use subagents')}. They work in parallel and keep your main thread clean.`
: `Say ${blue('"fan out subagents"')} and OpenClaude sends a team. Each one digs deep so nothing gets missed.`
},
cooldownSessions: 3,
isRelevant: async () => {
@@ -589,7 +589,7 @@ const externalTips: Tip[] = [
const claude = color('claude', ctx.theme)
const reward = getCachedReferrerReward()
return reward
? `Share Claude Code and earn ${claude(formatCreditAmount(reward))} of extra usage · ${claude('/passes')}`
? `Share OpenClaude and earn ${claude(formatCreditAmount(reward))} of extra usage · ${claude('/passes')}`
: `You have free guest passes to share · ${claude('/passes')}`
},
cooldownSessions: 3,

View File

@@ -262,7 +262,7 @@ export async function checkRecordingAvailability(): Promise<RecordingAvailabilit
return {
available: false,
reason:
'Voice mode requires microphone access, but no audio device is available in this environment.\n\nTo use voice mode, run Claude Code locally instead.',
'Voice mode requires microphone access, but no audio device is available in this environment.\n\nTo use voice mode, run OpenClaude locally instead.',
}
}
@@ -282,7 +282,7 @@ export async function checkRecordingAvailability(): Promise<RecordingAvailabilit
}
const wslNoAudioReason =
'Voice mode could not access an audio device in WSL.\n\nWSL2 with WSLg (Windows 11) provides audio via PulseAudio — if you are on Windows 10 or WSL1, run Claude Code in native Windows instead.'
'Voice mode could not access an audio device in WSL.\n\nWSL2 with WSLg (Windows 11) provides audio via PulseAudio — if you are on Windows 10 or WSL1, run OpenClaude in native Windows instead.'
// On Linux (including WSL), probe arecord. hasCommand() is insufficient:
// the binary can exist while the device open() fails (WSL1, Win10-WSL2,