@xelauvas/xela-cli 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/package.json +1 -1
  2. package/src/bridge/trustedDevice.ts +1 -1
  3. package/src/cli/update.ts +2 -2
  4. package/src/commands/thinkback/thinkback.tsx +4 -4
  5. package/src/components/AutoModeOptInDialog.tsx +1 -1
  6. package/src/components/DesktopHandoff.tsx +7 -7
  7. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +3 -3
  8. package/src/components/Feedback.tsx +2 -2
  9. package/src/components/HelpV2/General.tsx +1 -1
  10. package/src/components/HelpV2/HelpV2.tsx +1 -1
  11. package/src/components/IdeOnboardingDialog.tsx +3 -3
  12. package/src/components/LogoV2/Clawd.tsx +27 -26
  13. package/src/components/LogoV2/CondensedLogo.tsx +1 -1
  14. package/src/components/LogoV2/GuestPassesUpsell.tsx +1 -1
  15. package/src/components/LogoV2/LogoV2.tsx +2 -2
  16. package/src/components/LogoV2/WelcomeV2.tsx +3 -3
  17. package/src/components/LogoV2/feedConfigs.tsx +3 -3
  18. package/src/components/Onboarding.tsx +3 -3
  19. package/src/components/PromptInput/PromptInput.tsx +1 -1
  20. package/src/components/ResumeTask.tsx +2 -2
  21. package/src/components/TeleportError.tsx +1 -1
  22. package/src/components/mcp/ElicitationDialog.tsx +2 -2
  23. package/src/components/mcp/MCPRemoteServerMenu.tsx +4 -4
  24. package/src/components/mcp/MCPSettings.tsx +1 -1
  25. package/src/constants/github-app.ts +10 -10
  26. package/src/constants/product.ts +1 -1
  27. package/src/constants/prompts.ts +5 -5
  28. package/src/constants/system.ts +2 -2
  29. package/src/main.tsx +1 -1
  30. package/src/screens/REPL.tsx +3 -3
  31. package/src/services/mcp/auth.ts +1 -1
  32. package/src/services/mcp/client.ts +6 -6
  33. package/src/services/notifier.ts +1 -1
  34. package/src/services/tips/tipRegistry.ts +5 -5
  35. package/src/tools/WebFetchTool/utils.ts +1 -1
  36. package/src/utils/git.ts +1 -1
  37. package/src/utils/theme.ts +28 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xelauvas/xela-cli",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "description": "Xela — AI coding assistant powered by any model (OpenRouter, Groq, Ollama, DeepSeek, OpenAI)",
5
5
  "author": "xelauvas",
6
6
  "license": "MIT",
@@ -147,7 +147,7 @@ export async function enrollTrustedDevice(): Promise<void> {
147
147
  device_id?: string
148
148
  }>(
149
149
  `${baseUrl}/api/auth/trusted_devices`,
150
- { display_name: `Claude Code on ${hostname()} · ${process.platform}` },
150
+ { display_name: `Xela on ${hostname()} · ${process.platform}` },
151
151
  {
152
152
  headers: {
153
153
  Authorization: `Bearer ${accessToken}`,
package/src/cli/update.ts CHANGED
@@ -238,7 +238,7 @@ export async function update() {
238
238
 
239
239
  if (result.latestVersion === MACRO.VERSION) {
240
240
  writeToStdout(
241
- chalk.green(`Claude Code is up to date (${MACRO.VERSION})`) + '\n',
241
+ chalk.green(`Xela is up to date (${MACRO.VERSION})`) + '\n',
242
242
  )
243
243
  } else {
244
244
  writeToStdout(
@@ -308,7 +308,7 @@ export async function update() {
308
308
  // Check if versions match exactly, including any build metadata (like SHA)
309
309
  if (latestVersion === MACRO.VERSION) {
310
310
  writeToStdout(
311
- chalk.green(`Claude Code is up to date (${MACRO.VERSION})`) + '\n',
311
+ chalk.green(`Xela is up to date (${MACRO.VERSION})`) + '\n',
312
312
  )
313
313
  await gracefulShutdown(0)
314
314
  }
@@ -372,7 +372,7 @@ function ThinkbackMenu(t0) {
372
372
  }
373
373
  let t7;
374
374
  if ($[16] !== handleCancel || $[17] !== t6) {
375
- t7 = <Dialog title="Think Back on 2025 with Claude Code" subtitle="Generate your 2025 Claude Code Think Back (takes a few minutes to run)" onCancel={handleCancel} color="claude">{t6}</Dialog>;
375
+ t7 = <Dialog title="Think Back on 2025 with Xela" subtitle="Generate your 2025 Xela Think Back (takes a few minutes to run)" onCancel={handleCancel} color="claude">{t6}</Dialog>;
376
376
  $[16] = handleCancel;
377
377
  $[17] = t6;
378
378
  $[18] = t7;
@@ -381,9 +381,9 @@ function ThinkbackMenu(t0) {
381
381
  }
382
382
  return t7;
383
383
  }
384
- const EDIT_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=edit to modify my existing Claude Code year in review animation. Ask me what I want to change. When the animation is ready, tell the user to run /think-back again to play it.';
385
- const FIX_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=fix to fix validation or rendering errors in my existing Claude Code year in review animation. Run the validator, identify errors, and fix them. When the animation is ready, tell the user to run /think-back again to play it.';
386
- const REGENERATE_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=regenerate to create a completely new Claude Code year in review animation from scratch. Delete the existing animation and start fresh. When the animation is ready, tell the user to run /think-back again to play it.';
384
+ const EDIT_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=edit to modify my existing Xela year in review animation. Ask me what I want to change. When the animation is ready, tell the user to run /think-back again to play it.';
385
+ const FIX_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=fix to fix validation or rendering errors in my existing Xela year in review animation. Run the validator, identify errors, and fix them. When the animation is ready, tell the user to run /think-back again to play it.';
386
+ const REGENERATE_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=regenerate to create a completely new Xela year in review animation from scratch. Delete the existing animation and start fresh. When the animation is ready, tell the user to run /think-back again to play it.';
387
387
  function ThinkbackFlow(t0) {
388
388
  const $ = _c(27);
389
389
  const {
@@ -7,7 +7,7 @@ import { Select } from './CustomSelect/index.js';
7
7
  import { Dialog } from './design-system/Dialog.js';
8
8
 
9
9
  // NOTE: This copy is legally reviewed — do not modify without Legal team approval.
10
- export const AUTO_MODE_DESCRIPTION = "Auto mode lets Claude handle permission prompts automatically — Claude checks each tool call for risky actions and prompt injection before executing. Actions Claude identifies as safe are executed, while actions Claude identifies as risky are blocked and Claude may try a different approach. Ideal for long-running tasks. Sessions are slightly more expensive. Claude can make mistakes that allow harmful commands to run, it's recommended to only use in isolated environments. Shift+Tab to change mode.";
10
+ export const AUTO_MODE_DESCRIPTION = "Auto mode lets Xela handle permission prompts automatically — Xela checks each tool call for risky actions and prompt injection before executing. Actions Xela identifies as safe are executed, while actions Xela identifies as risky are blocked and Xela may try a different approach. Ideal for long-running tasks. Sessions are slightly more expensive. Xela can make mistakes that allow harmful commands to run, it's recommended to only use in isolated environments. Shift+Tab to change mode.";
11
11
  type Props = {
12
12
  onAccept(): void;
13
13
  onDecline(): void;
@@ -72,12 +72,12 @@ export function DesktopHandoff(t0) {
72
72
  setState("checking");
73
73
  const installStatus = await getDesktopInstallStatus();
74
74
  if (installStatus.status === "not-installed") {
75
- setDownloadMessage("Claude Desktop is not installed.");
75
+ setDownloadMessage("Xela Desktop is not installed.");
76
76
  setState("prompt-download");
77
77
  return;
78
78
  }
79
79
  if (installStatus.status === "version-too-old") {
80
- setDownloadMessage(`Claude Desktop needs to be updated (found v${installStatus.version}, need v1.1.2396+).`);
80
+ setDownloadMessage(`Xela Desktop needs to be updated (found v${installStatus.version}, need v1.1.2396+).`);
81
81
  setState("prompt-download");
82
82
  return;
83
83
  }
@@ -86,7 +86,7 @@ export function DesktopHandoff(t0) {
86
86
  setState("opening");
87
87
  const result = await openCurrentSessionInDesktop();
88
88
  if (!result.success) {
89
- setError(result.error ?? "Failed to open Claude Desktop");
89
+ setError(result.error ?? "Failed to open Xela Desktop");
90
90
  setState("error");
91
91
  return;
92
92
  }
@@ -162,10 +162,10 @@ export function DesktopHandoff(t0) {
162
162
  let t4;
163
163
  if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
164
164
  t4 = {
165
- checking: "Checking for Claude Desktop\u2026",
165
+ checking: "Checking for Xela Desktop\u2026",
166
166
  flushing: "Saving session\u2026",
167
- opening: "Opening Claude Desktop\u2026",
168
- success: "Opening in Claude Desktop\u2026"
167
+ opening: "Opening Xela Desktop\u2026",
168
+ success: "Opening in Xela Desktop\u2026"
169
169
  };
170
170
  $[17] = t4;
171
171
  } else {
@@ -184,7 +184,7 @@ export function DesktopHandoff(t0) {
184
184
  return t6;
185
185
  }
186
186
  async function _temp2(onDone_0) {
187
- onDone_0("Session transferred to Claude Desktop", {
187
+ onDone_0("Session transferred to Xela Desktop", {
188
188
  display: "system"
189
189
  });
190
190
  await gracefulShutdown(0, "other");
@@ -90,7 +90,7 @@ export function DesktopUpsellStartup(t0) {
90
90
  let t3;
91
91
  if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
92
92
  t3 = {
93
- label: "Open in Claude Code Desktop",
93
+ label: "Open in Xela Desktop",
94
94
  value: "try" as const
95
95
  };
96
96
  $[5] = t3;
@@ -120,7 +120,7 @@ export function DesktopUpsellStartup(t0) {
120
120
  const options = t5;
121
121
  let t6;
122
122
  if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
123
- t6 = <Box marginBottom={1}><Text>Same Claude Code with visual diffs, live app preview, parallel sessions, and more.</Text></Box>;
123
+ t6 = <Box marginBottom={1}><Text>Same Xela with visual diffs, live app preview, parallel sessions, and more.</Text></Box>;
124
124
  $[8] = t6;
125
125
  } else {
126
126
  t6 = $[8];
@@ -135,7 +135,7 @@ export function DesktopUpsellStartup(t0) {
135
135
  }
136
136
  let t8;
137
137
  if ($[11] !== handleSelect || $[12] !== t7) {
138
- t8 = <PermissionDialog title="Try Claude Code Desktop"><Box flexDirection="column" paddingX={2} paddingY={1}>{t6}<Select options={options} onChange={handleSelect} onCancel={t7} /></Box></PermissionDialog>;
138
+ t8 = <PermissionDialog title="Try Xela Desktop"><Box flexDirection="column" paddingX={2} paddingY={1}>{t6}<Select options={options} onChange={handleSelect} onCancel={t7} /></Box></PermissionDialog>;
139
139
  $[11] = handleSelect;
140
140
  $[12] = t7;
141
141
  $[13] = t8;
@@ -361,7 +361,7 @@ export function Feedback({
361
361
  <Box marginTop={1}>
362
362
  <Text wrap="wrap" dimColor>
363
363
  We will use your feedback to debug related issues or to improve{' '}
364
- Claude Code&apos;s functionality (eg. to reduce the risk of bugs
364
+ Xela&apos;s functionality (eg. to reduce the risk of bugs
365
365
  occurring in the future).
366
366
  </Text>
367
367
  </Box>
@@ -447,7 +447,7 @@ export function createGitHubIssueUrl(feedbackId: string, title: string, descript
447
447
  async function generateTitle(description: string, abortSignal: AbortSignal): Promise<string> {
448
448
  try {
449
449
  const response = await queryHaiku({
450
- systemPrompt: asSystemPrompt(['Generate a concise, technical issue title (max 80 chars) for a public GitHub issue based on this bug report for Claude Code.', 'Claude Code is an agentic coding CLI based on the Anthropic API.', 'The title should:', '- Include the type of issue [Bug] or [Feature Request] as the first thing in the title', '- Be concise, specific and descriptive of the actual problem', '- Use technical terminology appropriate for a software issue', '- For error messages, extract the key error (e.g., "Missing Tool Result Block" rather than the full message)', '- Be direct and clear for developers to understand the problem', '- If you cannot determine a clear issue, use "Bug Report: [brief description]"', '- Any LLM API errors are from the Anthropic API, not from any other model provider', 'Your response will be directly used as the title of the Github issue, and as such should not contain any other commentary or explaination', 'Examples of good titles include: "[Bug] Auto-Compact triggers to soon", "[Bug] Anthropic API Error: Missing Tool Result Block", "[Bug] Error: Invalid Model Name for Opus"']),
450
+ systemPrompt: asSystemPrompt(['Generate a concise, technical issue title (max 80 chars) for a public GitHub issue based on this bug report for Xela.', 'Xela is an AI coding assistant CLI that supports multiple model providers.', 'The title should:', '- Include the type of issue [Bug] or [Feature Request] as the first thing in the title', '- Be concise, specific and descriptive of the actual problem', '- Use technical terminology appropriate for a software issue', '- For error messages, extract the key error (e.g., "Missing Tool Result Block" rather than the full message)', '- Be direct and clear for developers to understand the problem', '- If you cannot determine a clear issue, use "Bug Report: [brief description]"', '- Any LLM API errors are from the Anthropic API, not from any other model provider', 'Your response will be directly used as the title of the Github issue, and as such should not contain any other commentary or explaination', 'Examples of good titles include: "[Bug] Auto-Compact triggers to soon", "[Bug] Anthropic API Error: Missing Tool Result Block", "[Bug] Error: Invalid Model Name for Opus"']),
451
451
  userPrompt: description,
452
452
  signal: abortSignal,
453
453
  options: {
@@ -6,7 +6,7 @@ export function General() {
6
6
  const $ = _c(2);
7
7
  let t0;
8
8
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
- t0 = <Box><Text>Claude understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
9
+ t0 = <Box><Text>Xela understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
10
10
  $[0] = t0;
11
11
  } else {
12
12
  t0 = $[0];
@@ -138,7 +138,7 @@ export function HelpV2(t0) {
138
138
  const t5 = insideModal ? undefined : maxHeight;
139
139
  let t6;
140
140
  if ($[31] !== tabs) {
141
- t6 = <Tabs title={false ? "/help" : `Claude Code v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
141
+ t6 = <Tabs title={false ? "/help" : `Xela v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
142
142
  $[31] = tabs;
143
143
  $[32] = t6;
144
144
  } else {
@@ -70,7 +70,7 @@ export function IdeOnboardingDialog(t0) {
70
70
  }
71
71
  let t6;
72
72
  if ($[8] !== ideName) {
73
- t6 = <>{t5}<Text>Welcome to Claude Code for {ideName}</Text></>;
73
+ t6 = <>{t5}<Text>Welcome to Xela for {ideName}</Text></>;
74
74
  $[8] = ideName;
75
75
  $[9] = t6;
76
76
  } else {
@@ -86,7 +86,7 @@ export function IdeOnboardingDialog(t0) {
86
86
  }
87
87
  let t9;
88
88
  if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
89
- t9 = <Text>• Claude has context of {t8}{" "}and <Text color="suggestion">⧉ selected lines</Text></Text>;
89
+ t9 = <Text>• Xela has context of {t8}{" "}and <Text color="suggestion">⧉ selected lines</Text></Text>;
90
90
  $[11] = t9;
91
91
  } else {
92
92
  t9 = $[11];
@@ -100,7 +100,7 @@ export function IdeOnboardingDialog(t0) {
100
100
  }
101
101
  let t11;
102
102
  if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
103
- t11 = <Text>• Review Claude Code's changes{" "}{t10}{" "}<Text color="diffRemovedWord">-22</Text> in the comfort of your IDE</Text>;
103
+ t11 = <Text>• Review Xela's changes{" "}{t10}{" "}<Text color="diffRemovedWord">-22</Text> in the comfort of your IDE</Text>;
104
104
  $[13] = t11;
105
105
  } else {
106
106
  t11 = $[13];
@@ -31,44 +31,45 @@ type Segments = {
31
31
  /** row 2 right (no bg): body curve + arm */
32
32
  r2R: string;
33
33
  };
34
+ // Xela "X" mascot — all poses show the same X logo
34
35
  const POSES: Record<ClawdPose, Segments> = {
35
36
  default: {
36
- r1L: ' ',
37
- r1E: '▛███▜',
38
- r1R: '',
39
- r2L: '▝▜',
40
- r2R: '▛▘'
37
+ r1L: ' ',
38
+ r1E: '',
39
+ r1R: '',
40
+ r2L: '',
41
+ r2R: ''
41
42
  },
42
43
  'look-left': {
43
- r1L: ' ',
44
- r1E: '▟███▟',
45
- r1R: '',
46
- r2L: '▝▜',
47
- r2R: '▛▘'
44
+ r1L: ' ',
45
+ r1E: '',
46
+ r1R: '',
47
+ r2L: '',
48
+ r2R: ''
48
49
  },
49
50
  'look-right': {
50
- r1L: ' ',
51
- r1E: '▙███▙',
52
- r1R: '',
53
- r2L: '▝▜',
54
- r2R: '▛▘'
51
+ r1L: ' ',
52
+ r1E: '',
53
+ r1R: '',
54
+ r2L: '',
55
+ r2R: ''
55
56
  },
56
57
  'arms-up': {
57
- r1L: '▗▟',
58
- r1E: '▛███▜',
59
- r1R: '▙▖',
60
- r2L: ' ',
61
- r2R: ' '
58
+ r1L: '',
59
+ r1E: '',
60
+ r1R: '',
61
+ r2L: ' ',
62
+ r2R: ' '
62
63
  }
63
64
  };
64
65
 
65
66
  // Apple Terminal uses a bg-fill trick (see below), so only eye poses make
66
67
  // sense. Arm poses fall back to default.
67
68
  const APPLE_EYES: Record<ClawdPose, string> = {
68
- default: ' ▗ ▖ ',
69
- 'look-left': ' ▘ ▘ ',
70
- 'look-right': ' ▝ ▝ ',
71
- 'arms-up': ' ▗ ▖ '
69
+ default: ' ╳ ╱ ',
70
+ 'look-left': ' ╳ ╱ ',
71
+ 'look-right': ' ╳ ╱ ',
72
+ 'arms-up': ' ╳ ╱ '
72
73
  };
73
74
  export function Clawd(t0) {
74
75
  const $ = _c(26);
@@ -140,7 +141,7 @@ export function Clawd(t0) {
140
141
  }
141
142
  let t8;
142
143
  if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
143
- t8 = <Text color="clawd_body" backgroundColor="clawd_background">█████</Text>;
144
+ t8 = <Text color="clawd_body"> ╳ </Text>;
144
145
  $[16] = t8;
145
146
  } else {
146
147
  t8 = $[16];
@@ -164,7 +165,7 @@ export function Clawd(t0) {
164
165
  }
165
166
  let t11;
166
167
  if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
167
- t11 = <Text color="clawd_body">{" "}▘▘ ▝▝{" "}</Text>;
168
+ t11 = <Text color="clawd_body">{" "}XELA{" "}</Text>;
168
169
  $[22] = t11;
169
170
  } else {
170
171
  t11 = $[22];
@@ -88,7 +88,7 @@ export function CondensedLogo() {
88
88
  }
89
89
  let t5;
90
90
  if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
91
- t5 = <Text bold={true}>Claude Code</Text>;
91
+ t5 = <Text bold={true}>Xela</Text>;
92
92
  $[8] = t5;
93
93
  } else {
94
94
  t5 = $[8];
@@ -60,7 +60,7 @@ export function GuestPassesUpsell() {
60
60
  let t0;
61
61
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
62
62
  const reward = getCachedReferrerReward();
63
- t0 = <Text dimColor={true}><Text color="claude">[✻]</Text> <Text color="claude">[✻]</Text>{" "}<Text color="claude">[✻]</Text> ·{" "}{reward ? `Share Claude Code and earn ${formatCreditAmount(reward)} of extra usage · /passes` : "3 guest passes at /passes"}</Text>;
63
+ t0 = <Text dimColor={true}><Text color="claude">[✻]</Text> <Text color="claude">[✻]</Text>{" "}<Text color="claude">[✻]</Text> ·{" "}{reward ? `Share Xela and earn ${formatCreditAmount(reward)} of extra usage · /passes` : "3 guest passes at /passes"}</Text>;
64
64
  $[0] = t0;
65
65
  } else {
66
66
  t0 = $[0];
@@ -248,8 +248,8 @@ export function LogoV2() {
248
248
  }
249
249
  const layoutMode = getLayoutMode(columns);
250
250
  const userTheme = resolveThemeSetting(getGlobalConfig().theme);
251
- const borderTitle = ` ${color("claude", userTheme)("Claude Code")} ${color("inactive", userTheme)(`v${version}`)} `;
252
- const compactBorderTitle = color("claude", userTheme)(" Claude Code ");
251
+ const borderTitle = ` ${color("claude", userTheme)("Xela")} ${color("inactive", userTheme)(`v${version}`)} `;
252
+ const compactBorderTitle = color("claude", userTheme)(" Xela ");
253
253
  if (layoutMode === "compact") {
254
254
  let welcomeMessage = formatWelcomeMessage(username);
255
255
  if (stringWidth(welcomeMessage) > columns - 4) {
@@ -9,7 +9,7 @@ export function WelcomeV2() {
9
9
  if (env.terminal === "Apple_Terminal") {
10
10
  let t0;
11
11
  if ($[0] !== theme) {
12
- t0 = <AppleTerminalWelcomeV2 theme={theme} welcomeMessage="Welcome to Claude Code" />;
12
+ t0 = <AppleTerminalWelcomeV2 theme={theme} welcomeMessage="Welcome to Xela" />;
13
13
  $[0] = theme;
14
14
  $[1] = t0;
15
15
  } else {
@@ -28,7 +28,7 @@ export function WelcomeV2() {
28
28
  let t7;
29
29
  let t8;
30
30
  if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
31
- t0 = <Text><Text color="claude">{"Welcome to Claude Code"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
31
+ t0 = <Text><Text color="claude">{"Welcome to Xela"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
32
32
  t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
33
33
  t2 = <Text>{" "}</Text>;
34
34
  t3 = <Text>{" "}</Text>;
@@ -113,7 +113,7 @@ export function WelcomeV2() {
113
113
  let t5;
114
114
  let t6;
115
115
  if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
116
- t0 = <Text><Text color="claude">{"Welcome to Claude Code"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
116
+ t0 = <Text><Text color="claude">{"Welcome to Xela"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
117
117
  t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
118
118
  t2 = <Text>{" "}</Text>;
119
119
  t3 = <Text>{" * \u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
@@ -39,7 +39,7 @@ export function createWhatsNewFeed(releaseNotes: string[]): FeedConfig {
39
39
  text: note
40
40
  };
41
41
  });
42
- const emptyMessage = "external" === 'ant' ? 'Unable to fetch latest claude-cli-internal commits' : 'Check the Claude Code changelog for updates';
42
+ const emptyMessage = "external" === 'ant' ? 'Unable to fetch latest commits' : 'Check the Xela changelog for updates';
43
43
  return {
44
44
  title: "external" === 'ant' ? "What's new [ANT-ONLY: Latest CC commits]" : "What's new",
45
45
  lines,
@@ -60,7 +60,7 @@ export function createProjectOnboardingFeed(steps: Step[]): FeedConfig {
60
60
  text: `${checkmark}${text}`
61
61
  };
62
62
  });
63
- const warningText = getCwd() === homedir() ? 'Note: You have launched claude in your home directory. For the best experience, launch it in a project directory instead.' : undefined;
63
+ const warningText = getCwd() === homedir() ? 'Note: You have launched xela in your home directory. For the best experience, launch it in a project directory instead.' : undefined;
64
64
  if (warningText) {
65
65
  lines.push({
66
66
  text: warningText
@@ -73,7 +73,7 @@ export function createProjectOnboardingFeed(steps: Step[]): FeedConfig {
73
73
  }
74
74
  export function createGuestPassesFeed(): FeedConfig {
75
75
  const reward = getCachedReferrerReward();
76
- const subtitle = reward ? `Share Claude Code and earn ${formatCreditAmount(reward)} of extra usage` : 'Share Claude Code with friends';
76
+ const subtitle = reward ? `Share Xela and earn ${formatCreditAmount(reward)} of extra usage` : 'Share Xela with friends';
77
77
  return {
78
78
  title: '3 guest passes',
79
79
  lines: [],
@@ -71,9 +71,9 @@ export function Onboarding({
71
71
  */}
72
72
  <OrderedList>
73
73
  <OrderedList.Item>
74
- <Text>Claude can make mistakes</Text>
74
+ <Text>Xela can make mistakes</Text>
75
75
  <Text dimColor wrap="wrap">
76
- You should always review Claude&apos;s responses, especially when
76
+ You should always review Xela&apos;s responses, especially when
77
77
  <Newline />
78
78
  running code.
79
79
  <Newline />
@@ -146,7 +146,7 @@ export function Onboarding({
146
146
  steps.push({
147
147
  id: 'terminal-setup',
148
148
  component: <Box flexDirection="column" gap={1} paddingLeft={1}>
149
- <Text bold>Use Claude Code&apos;s terminal setup?</Text>
149
+ <Text bold>Use Xela&apos;s terminal setup?</Text>
150
150
  <Box flexDirection="column" width={70} gap={1}>
151
151
  <Text>
152
152
  For the optimal coding experience, enable the recommended settings
@@ -761,7 +761,7 @@ function PromptInput({
761
761
  if (feature('ULTRAPLAN') && ultraplanTriggers.length) {
762
762
  addNotification({
763
763
  key: 'ultraplan-active',
764
- text: 'This prompt will launch an ultraplan session in Claude Code on the web',
764
+ text: 'This prompt will launch an ultraplan session in Xela on the web',
765
765
  priority: 'immediate',
766
766
  timeoutMs: 5000
767
767
  });
@@ -257,11 +257,11 @@ function renderErrorSpecificGuidance(errorType: LoadErrorType): React.ReactNode
257
257
  </Box>;
258
258
  case 'api':
259
259
  return <Box marginY={1} flexDirection="column">
260
- <Text dimColor>Sorry, Claude encountered an error</Text>
260
+ <Text dimColor>Sorry, Xela encountered an error</Text>
261
261
  </Box>;
262
262
  case 'other':
263
263
  return <Box marginY={1} flexDirection="row">
264
- <Text dimColor>Sorry, Claude Code encountered an error</Text>
264
+ <Text dimColor>Sorry, Xela encountered an error</Text>
265
265
  </Box>;
266
266
  }
267
267
  }
@@ -145,7 +145,7 @@ export function TeleportError(t0) {
145
145
  }
146
146
  let t9;
147
147
  if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
148
- t9 = <Box flexDirection="column"><Text dimColor={true}>Teleport requires a Claude.ai account.</Text><Text dimColor={true}>Your Claude Pro/Max subscription will be used by Claude Code.</Text></Box>;
148
+ t9 = <Box flexDirection="column"><Text dimColor={true}>Teleport requires a Claude.ai account.</Text><Text dimColor={true}>Your subscription will be used by Xela.</Text></Box>;
149
149
  $[16] = t9;
150
150
  } else {
151
151
  t9 = $[16];
@@ -254,7 +254,7 @@ function ElicitationFormDialog({
254
254
  // Text fields are always in edit mode when focused — no Enter-to-edit step.
255
255
  const isEditingTextField = currentFieldIsText && !focusedButton;
256
256
  useRegisterOverlay('elicitation');
257
- useNotifyAfterTimeout('Claude Code needs your input', 'elicitation_dialog');
257
+ useNotifyAfterTimeout('Xela needs your input', 'elicitation_dialog');
258
258
 
259
259
  // Sync textInputValue when the focused field changes
260
260
  const syncTextInput = useCallback((fieldIndex: number | undefined) => {
@@ -1004,7 +1004,7 @@ function ElicitationURLDialog({
1004
1004
  const phaseRef = useRef<'prompt' | 'waiting'>('prompt');
1005
1005
  const [focusedButton, setFocusedButton] = useState<'accept' | 'decline' | 'open' | 'action' | 'cancel'>('accept');
1006
1006
  const showCancel = waitingState?.showCancel ?? false;
1007
- useNotifyAfterTimeout('Claude Code needs your input', 'elicitation_url_dialog');
1007
+ useNotifyAfterTimeout('Xela needs your input', 'elicitation_url_dialog');
1008
1008
  useRegisterOverlay('elicitation-url');
1009
1009
 
1010
1010
  // Keep refs in sync for use in abort handler (avoids re-registering listener)
@@ -102,9 +102,9 @@ export function MCPRemoteServerMenu({
102
102
  if (success) {
103
103
  onComplete?.(`Authentication successful. Connected to ${server.name}.`);
104
104
  } else if (result.client.type === 'needs-auth') {
105
- onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Claude Code.');
105
+ onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Xela.');
106
106
  } else {
107
- onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Claude Code for the changes to take effect.');
107
+ onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Xela for the changes to take effect.');
108
108
  }
109
109
  } catch (err) {
110
110
  logEvent('tengu_claudeai_mcp_auth_completed', {
@@ -281,11 +281,11 @@ export function MCPRemoteServerMenu({
281
281
  const message = isEffectivelyAuthenticated ? `Authentication successful. Reconnected to ${server.name}.` : `Authentication successful. Connected to ${server.name}.`;
282
282
  onComplete?.(message);
283
283
  } else if (result_0.client.type === 'needs-auth') {
284
- onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Claude Code.');
284
+ onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Xela.');
285
285
  } else {
286
286
  // result.client.type === 'failed'
287
287
  logMCPDebug(server.name, `Reconnection failed after authentication`);
288
- onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Claude Code for the changes to take effect.');
288
+ onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Xela for the changes to take effect.');
289
289
  }
290
290
  }
291
291
  } catch (err_1) {
@@ -207,7 +207,7 @@ export function MCPSettings(t0) {
207
207
  t9 = $[25];
208
208
  }
209
209
  const serverTools_0 = t9;
210
- const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "Claude Code";
210
+ const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "Xela";
211
211
  if (viewState.server.transport === "stdio") {
212
212
  let t10;
213
213
  if ($[26] !== viewState.server) {
@@ -1,9 +1,9 @@
1
- export const PR_TITLE = 'Add Claude Code GitHub Workflow'
1
+ export const PR_TITLE = 'Add Xela GitHub Workflow'
2
2
 
3
3
  export const GITHUB_ACTION_SETUP_DOCS_URL =
4
4
  'https://github.com/anthropics/claude-code-action/blob/main/docs/setup.md'
5
5
 
6
- export const WORKFLOW_CONTENT = `name: Claude Code
6
+ export const WORKFLOW_CONTENT = `name: Xela
7
7
 
8
8
  on:
9
9
  issue_comment:
@@ -35,7 +35,7 @@ jobs:
35
35
  with:
36
36
  fetch-depth: 1
37
37
 
38
- - name: Run Claude Code
38
+ - name: Run Xela
39
39
  id: claude
40
40
  uses: anthropics/claude-code-action@v1
41
41
  with:
@@ -55,13 +55,13 @@ jobs:
55
55
 
56
56
  `
57
57
 
58
- export const PR_BODY = `## 🤖 Installing Claude Code GitHub App
58
+ export const PR_BODY = `## Installing Xela GitHub App
59
59
 
60
- This PR adds a GitHub Actions workflow that enables Claude Code integration in our repository.
60
+ This PR adds a GitHub Actions workflow that enables Xela integration in our repository.
61
61
 
62
- ### What is Claude Code?
62
+ ### What is Xela?
63
63
 
64
- [Claude Code](https://claude.com/claude-code) is an AI coding agent that can help with:
64
+ [Xela](https://github.com/xelauvas/codeclau) is an AI coding assistant that can help with:
65
65
  - Bug fixes and improvements
66
66
  - Documentation updates
67
67
  - Implementing new features
@@ -93,11 +93,11 @@ Once the workflow is triggered, Claude will analyze the comment and surrounding
93
93
  allowed_tools: Bash(npm install),Bash(npm run build),Bash(npm run lint),Bash(npm run test)
94
94
  \`\`\`
95
95
 
96
- There's more information in the [Claude Code action repo](https://github.com/anthropics/claude-code-action).
96
+ There's more information in the [Xela repo](https://github.com/xelauvas/codeclau).
97
97
 
98
98
  After merging this PR, let's try mentioning @claude in a comment on any PR to get started!`
99
99
 
100
- export const CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT = `name: Claude Code Review
100
+ export const CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT = `name: Xela Code Review
101
101
 
102
102
  on:
103
103
  pull_request:
@@ -130,7 +130,7 @@ jobs:
130
130
  with:
131
131
  fetch-depth: 1
132
132
 
133
- - name: Run Claude Code Review
133
+ - name: Run Xela Review
134
134
  id: claude-review
135
135
  uses: anthropics/claude-code-action@v1
136
136
  with:
@@ -1,4 +1,4 @@
1
- export const PRODUCT_URL = 'https://claude.com/claude-code'
1
+ export const PRODUCT_URL = 'https://github.com/xelauvas/codeclau'
2
2
 
3
3
  // Claude Code Remote session URLs
4
4
  export const CLAUDE_AI_BASE_URL = 'https://claude.ai'
@@ -214,7 +214,7 @@ function getSimpleDoingTasksSection(): string {
214
214
  ]
215
215
 
216
216
  const userHelpSubitems = [
217
- `/help: Get help with using Claude Code`,
217
+ `/help: Get help with using Xela`,
218
218
  `To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
219
219
  ]
220
220
 
@@ -449,7 +449,7 @@ export async function getSystemPrompt(
449
449
  ): Promise<string[]> {
450
450
  if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
451
451
  return [
452
- `You are Claude Code, Anthropic's official CLI for Claude.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
452
+ `You are Xela, an AI coding assistant.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
453
453
  ]
454
454
  }
455
455
 
@@ -696,10 +696,10 @@ export async function computeSimpleEnvInfo(
696
696
  : `The most recent Claude model family is Claude 4.5/4.6. Model IDs — Opus 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.opus}', Sonnet 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.sonnet}', Haiku 4.5: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.haiku}'. When building AI applications, default to the latest and most capable Claude models.`,
697
697
  process.env.USER_TYPE === 'ant' && isUndercover()
698
698
  ? null
699
- : `Claude Code is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).`,
699
+ : `Xela is available as a CLI tool. Install: npm install -g @xelauvas/xela-cli`,
700
700
  process.env.USER_TYPE === 'ant' && isUndercover()
701
701
  ? null
702
- : `Fast mode for Claude Code uses the same ${FRONTIER_MODEL_NAME} model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`,
702
+ : `Fast mode for Xela uses the same ${FRONTIER_MODEL_NAME} model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`,
703
703
  ].filter(item => item !== null)
704
704
 
705
705
  return [
@@ -755,7 +755,7 @@ export function getUnameSR(): string {
755
755
  return `${osType()} ${osRelease()}`
756
756
  }
757
757
 
758
- export const DEFAULT_AGENT_PROMPT = `You are an agent for Claude Code, Anthropic's official CLI for Claude. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
758
+ export const DEFAULT_AGENT_PROMPT = `You are an agent for Xela, an AI coding assistant. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
759
759
 
760
760
  export async function enhanceSystemPromptWithEnvDetails(
761
761
  existingSystemPrompt: string[],
@@ -7,8 +7,8 @@ import { isEnvDefinedFalsy } from '../utils/envUtils.js'
7
7
  import { getAPIProvider } from '../utils/model/providers.js'
8
8
  import { getWorkload } from '../utils/workloadContext.js'
9
9
 
10
- const DEFAULT_PREFIX = `You are Claude Code, Anthropic's official CLI for Claude.`
11
- const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are Claude Code, Anthropic's official CLI for Claude, running within the Claude Agent SDK.`
10
+ const DEFAULT_PREFIX = `You are Xela, an AI coding assistant powered by any model.`
11
+ const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are Xela, an AI coding assistant, running within the Claude Agent SDK.`
12
12
  const AGENT_SDK_PREFIX = `You are a Claude agent, built on Anthropic's Claude Agent SDK.`
13
13
 
14
14
  const CLI_SYSPROMPT_PREFIX_VALUES = [
package/src/main.tsx CHANGED
@@ -965,7 +965,7 @@ async function run(): Promise<CommanderCommand> {
965
965
  }
966
966
  profileCheckpoint('preAction_after_settings_sync');
967
967
  });
968
- program.name('claude').description(`Claude Code - starts an interactive session by default, use -p/--print for non-interactive output`).argument('[prompt]', 'Your prompt', String)
968
+ program.name('xela').description(`Xela - AI coding assistant. Starts an interactive session by default, use -p/--print for non-interactive output`).argument('[prompt]', 'Your prompt', String)
969
969
  // Subcommands inherit helpOption via commander's copyInheritedSettings —
970
970
  // setting it once here covers mcp, plugin, auth, and all other subcommands.
971
971
  .helpOption('-h, --help', 'Display help for command').option('-d, --debug [filter]', 'Enable debug mode with optional category filtering (e.g., "api,hooks" or "!1p,!file")', (_value: string | true) => {
@@ -1132,7 +1132,7 @@ export function REPL({
1132
1132
  // session from mid-conversation context.
1133
1133
  const haikuTitleAttemptedRef = useRef((initialMessages?.length ?? 0) > 0);
1134
1134
  const agentTitle = mainThreadAgentDefinition?.agentType;
1135
- const terminalTitle = sessionTitle ?? agentTitle ?? haikuTitle ?? 'Claude Code';
1135
+ const terminalTitle = sessionTitle ?? agentTitle ?? haikuTitle ?? 'Xela';
1136
1136
  const isWaitingForApproval = toolUseConfirmQueue.length > 0 || promptQueue.length > 0 || pendingWorkerRequest || pendingSandboxRequest;
1137
1137
  // Local-jsx commands (like /plugin, /config) show user-facing dialogs that
1138
1138
  // wait for input. Require jsx != null — if the flag is stuck true but jsx
@@ -3932,7 +3932,7 @@ export function REPL({
3932
3932
  // Use ref to get current dialog state, avoiding stale closure
3933
3933
  focusedInputDialogRef.current === undefined && idleTimeSinceResponse >= getGlobalConfig().messageIdleNotifThresholdMs) {
3934
3934
  void sendNotification({
3935
- message: 'Claude is waiting for your input',
3935
+ message: 'Xela is waiting for your input',
3936
3936
  notificationType: 'idle_prompt'
3937
3937
  }, terminal);
3938
3938
  }
@@ -4123,7 +4123,7 @@ export function REPL({
4123
4123
  useEffect(() => {
4124
4124
  const handleSuspend = () => {
4125
4125
  // Print suspension instructions
4126
- process.stdout.write(`\nClaude Code has been suspended. Run \`fg\` to bring Claude Code back.\nNote: ctrl + z now suspends Claude Code, ctrl + _ undoes input.\n`);
4126
+ process.stdout.write(`\nXela has been suspended. Run \`fg\` to bring Xela back.\nNote: ctrl + z now suspends Xela, ctrl + _ undoes input.\n`);
4127
4127
  };
4128
4128
  const handleResume = () => {
4129
4129
  // Force complete component tree replacement instead of terminal clear
@@ -1416,7 +1416,7 @@ export class ClaudeAuthProvider implements OAuthClientProvider {
1416
1416
 
1417
1417
  get clientMetadata(): OAuthClientMetadata {
1418
1418
  const metadata: OAuthClientMetadata = {
1419
- client_name: `Claude Code (${this.serverName})`,
1419
+ client_name: `Xela (${this.serverName})`,
1420
1420
  redirect_uris: [this.redirectUri],
1421
1421
  grant_types: ['authorization_code', 'refresh_token'],
1422
1422
  response_types: ['code'],
@@ -984,10 +984,10 @@ export const connectToServer = memoize(
984
984
 
985
985
  const client = new Client(
986
986
  {
987
- name: 'claude-code',
988
- title: 'Claude Code',
987
+ name: 'xela',
988
+ title: 'Xela',
989
989
  version: MACRO.VERSION ?? 'unknown',
990
- description: "Anthropic's agentic coding tool",
990
+ description: "AI coding assistant powered by any model",
991
991
  websiteUrl: PRODUCT_URL,
992
992
  },
993
993
  {
@@ -3279,10 +3279,10 @@ export async function setupSdkMcpClients(
3279
3279
 
3280
3280
  const client = new Client(
3281
3281
  {
3282
- name: 'claude-code',
3283
- title: 'Claude Code',
3282
+ name: 'xela',
3283
+ title: 'Xela',
3284
3284
  version: MACRO.VERSION ?? 'unknown',
3285
- description: "Anthropic's agentic coding tool",
3285
+ description: "AI coding assistant powered by any model",
3286
3286
  websiteUrl: PRODUCT_URL,
3287
3287
  },
3288
3288
  {
@@ -35,7 +35,7 @@ export async function sendNotification(
35
35
  })
36
36
  }
37
37
 
38
- const DEFAULT_TITLE = 'Claude Code'
38
+ const DEFAULT_TITLE = 'Xela'
39
39
 
40
40
  async function sendToChannel(
41
41
  channel: string,
@@ -355,7 +355,7 @@ const externalTips: Tip[] = [
355
355
  {
356
356
  id: 'paste-images-mac',
357
357
  content: async () =>
358
- 'Paste images into Claude Code using control+v (not cmd+v!)',
358
+ 'Paste images into Xela using control+v (not cmd+v!)',
359
359
  cooldownSessions: 10,
360
360
  isRelevant: async () => getPlatform() === 'macos',
361
361
  },
@@ -437,7 +437,7 @@ const externalTips: Tip[] = [
437
437
  {
438
438
  id: 'desktop-app',
439
439
  content: async () =>
440
- 'Run Claude Code locally or remotely using the Claude desktop app: clau.de/desktop',
440
+ 'Run Xela locally or remotely',
441
441
  cooldownSessions: 15,
442
442
  isRelevant: async () => getPlatform() !== 'linux',
443
443
  },
@@ -445,7 +445,7 @@ const externalTips: Tip[] = [
445
445
  id: 'desktop-shortcut',
446
446
  content: async ctx => {
447
447
  const blue = color('suggestion', ctx.theme)
448
- return `Continue your session in Claude Code Desktop with ${blue('/desktop')}`
448
+ return `Continue your session in Xela Desktop with ${blue('/desktop')}`
449
449
  },
450
450
  cooldownSessions: 15,
451
451
  isRelevant: async () => {
@@ -466,7 +466,7 @@ const externalTips: Tip[] = [
466
466
  {
467
467
  id: 'mobile-app',
468
468
  content: async () =>
469
- '/mobile to use Claude Code from the Claude app on your phone',
469
+ '/mobile to use Xela from the app on your phone',
470
470
  cooldownSessions: 15,
471
471
  isRelevant: async () => true,
472
472
  },
@@ -593,7 +593,7 @@ const externalTips: Tip[] = [
593
593
  const claude = color('claude', ctx.theme)
594
594
  const reward = getCachedReferrerReward()
595
595
  return reward
596
- ? `Share Claude Code and earn ${claude(formatCreditAmount(reward))} of extra usage · ${claude('/passes')}`
596
+ ? `Share Xela and earn ${claude(formatCreditAmount(reward))} of extra usage · ${claude('/passes')}`
597
597
  : `You have free guest passes to share · ${claude('/passes')}`
598
598
  },
599
599
  cooldownSessions: 3,
@@ -20,7 +20,7 @@ import { makeSecondaryModelPrompt } from './prompt.js'
20
20
  // Custom error classes for domain blocking
21
21
  class DomainBlockedError extends Error {
22
22
  constructor(domain: string) {
23
- super(`Claude Code is unable to fetch from ${domain}`)
23
+ super(`Xela is unable to fetch from ${domain}`)
24
24
  this.name = 'DomainBlockedError'
25
25
  }
26
26
  }
package/src/utils/git.ts CHANGED
@@ -429,7 +429,7 @@ export const getWorktreeCount = async (): Promise<number> => {
429
429
  export const stashToCleanState = async (message?: string): Promise<boolean> => {
430
430
  try {
431
431
  const stashMessage =
432
- message || `Claude Code auto-stash - ${new Date().toISOString()}`
432
+ message || `Xela auto-stash - ${new Date().toISOString()}`
433
433
 
434
434
  // First, check if we have untracked files
435
435
  const { untracked } = await getFileStatus()
@@ -115,10 +115,10 @@ export type ThemeSetting = (typeof THEME_SETTINGS)[number]
115
115
  const lightTheme: Theme = {
116
116
  autoAccept: 'rgb(135,0,255)', // Electric violet
117
117
  bashBorder: 'rgb(255,0,135)', // Vibrant pink
118
- claude: 'rgb(215,119,87)', // Claude orange
119
- claudeShimmer: 'rgb(245,149,117)', // Lighter claude orange for shimmer effect
120
- claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(87,105,247)', // Medium blue for system spinner
121
- claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(117,135,255)', // Lighter blue for system spinner shimmer
118
+ claude: 'rgb(0,200,180)', // Xela teal
119
+ claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
120
+ claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(0,180,200)', // Cyan-teal for system spinner
121
+ claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(50,210,230)', // Lighter cyan-teal for spinner shimmer
122
122
  permission: 'rgb(87,105,247)', // Medium blue
123
123
  permissionShimmer: 'rgb(137,155,255)', // Lighter blue for shimmer effect
124
124
  planMode: 'rgb(0,102,102)', // Muted teal
@@ -158,7 +158,7 @@ const lightTheme: Theme = {
158
158
  // Chrome colors
159
159
  chromeYellow: 'rgb(251,188,4)', // Chrome yellow
160
160
  // TUI V2 colors
161
- clawd_body: 'rgb(215,119,87)',
161
+ clawd_body: 'rgb(0,200,180)',
162
162
  clawd_background: 'rgb(0,0,0)',
163
163
  userMessageBackground: 'rgb(240, 240, 240)', // Slightly darker grey for optimal contrast
164
164
  userMessageBackgroundHover: 'rgb(252, 252, 252)', // ≥250 to quantize distinct from base at 256-color level
@@ -173,7 +173,7 @@ const lightTheme: Theme = {
173
173
  fastModeShimmer: 'rgb(255,150,50)', // Lighter orange for shimmer
174
174
  // Brief/assistant mode
175
175
  briefLabelYou: 'rgb(37,99,235)', // Blue
176
- briefLabelClaude: 'rgb(215,119,87)', // Brand orange
176
+ briefLabelClaude: 'rgb(0,200,180)', // Xela teal
177
177
  rainbow_red: 'rgb(235,95,87)',
178
178
  rainbow_orange: 'rgb(245,139,87)',
179
179
  rainbow_yellow: 'rgb(250,195,95)',
@@ -197,8 +197,8 @@ const lightTheme: Theme = {
197
197
  const lightAnsiTheme: Theme = {
198
198
  autoAccept: 'ansi:magenta',
199
199
  bashBorder: 'ansi:magenta',
200
- claude: 'ansi:redBright',
201
- claudeShimmer: 'ansi:yellowBright',
200
+ claude: 'ansi:cyanBright',
201
+ claudeShimmer: 'ansi:cyan',
202
202
  claudeBlue_FOR_SYSTEM_SPINNER: 'ansi:blue',
203
203
  claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
204
204
  permission: 'ansi:blue',
@@ -240,7 +240,7 @@ const lightAnsiTheme: Theme = {
240
240
  // Chrome colors
241
241
  chromeYellow: 'ansi:yellow', // Chrome yellow
242
242
  // TUI V2 colors
243
- clawd_body: 'ansi:redBright',
243
+ clawd_body: 'ansi:cyanBright',
244
244
  clawd_background: 'ansi:black',
245
245
  userMessageBackground: 'ansi:white',
246
246
  userMessageBackgroundHover: 'ansi:whiteBright',
@@ -254,7 +254,7 @@ const lightAnsiTheme: Theme = {
254
254
  fastMode: 'ansi:red',
255
255
  fastModeShimmer: 'ansi:redBright',
256
256
  briefLabelYou: 'ansi:blue',
257
- briefLabelClaude: 'ansi:redBright',
257
+ briefLabelClaude: 'ansi:cyanBright',
258
258
  rainbow_red: 'ansi:red',
259
259
  rainbow_orange: 'ansi:redBright',
260
260
  rainbow_yellow: 'ansi:yellow',
@@ -278,8 +278,8 @@ const lightAnsiTheme: Theme = {
278
278
  const darkAnsiTheme: Theme = {
279
279
  autoAccept: 'ansi:magentaBright',
280
280
  bashBorder: 'ansi:magentaBright',
281
- claude: 'ansi:redBright',
282
- claudeShimmer: 'ansi:yellowBright',
281
+ claude: 'ansi:cyanBright',
282
+ claudeShimmer: 'ansi:cyan',
283
283
  claudeBlue_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
284
284
  claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
285
285
  permission: 'ansi:blueBright',
@@ -321,7 +321,7 @@ const darkAnsiTheme: Theme = {
321
321
  // Chrome colors
322
322
  chromeYellow: 'ansi:yellowBright', // Chrome yellow
323
323
  // TUI V2 colors
324
- clawd_body: 'ansi:redBright',
324
+ clawd_body: 'ansi:cyanBright',
325
325
  clawd_background: 'ansi:black',
326
326
  userMessageBackground: 'ansi:blackBright',
327
327
  userMessageBackgroundHover: 'ansi:white',
@@ -335,7 +335,7 @@ const darkAnsiTheme: Theme = {
335
335
  fastMode: 'ansi:redBright',
336
336
  fastModeShimmer: 'ansi:redBright',
337
337
  briefLabelYou: 'ansi:blueBright',
338
- briefLabelClaude: 'ansi:redBright',
338
+ briefLabelClaude: 'ansi:cyanBright',
339
339
  rainbow_red: 'ansi:red',
340
340
  rainbow_orange: 'ansi:redBright',
341
341
  rainbow_yellow: 'ansi:yellow',
@@ -359,8 +359,8 @@ const darkAnsiTheme: Theme = {
359
359
  const lightDaltonizedTheme: Theme = {
360
360
  autoAccept: 'rgb(135,0,255)', // Electric violet
361
361
  bashBorder: 'rgb(0,102,204)', // Blue instead of pink
362
- claude: 'rgb(255,153,51)', // Orange adjusted for deuteranopia
363
- claudeShimmer: 'rgb(255,183,101)', // Lighter orange for shimmer effect
362
+ claude: 'rgb(0,200,180)', // Xela teal
363
+ claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
364
364
  claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(51,102,255)', // Bright blue for system spinner
365
365
  claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(101,152,255)', // Lighter bright blue for system spinner shimmer
366
366
  permission: 'rgb(51,102,255)', // Bright blue
@@ -402,7 +402,7 @@ const lightDaltonizedTheme: Theme = {
402
402
  // Chrome colors
403
403
  chromeYellow: 'rgb(251,188,4)', // Chrome yellow
404
404
  // TUI V2 colors
405
- clawd_body: 'rgb(215,119,87)',
405
+ clawd_body: 'rgb(0,200,180)',
406
406
  clawd_background: 'rgb(0,0,0)',
407
407
  userMessageBackground: 'rgb(220, 220, 220)', // Slightly darker grey for optimal contrast
408
408
  userMessageBackgroundHover: 'rgb(232, 232, 232)', // ≥230 to quantize distinct from base at 256-color level
@@ -416,7 +416,7 @@ const lightDaltonizedTheme: Theme = {
416
416
  fastMode: 'rgb(255,106,0)', // Electric orange (color-blind safe)
417
417
  fastModeShimmer: 'rgb(255,150,50)', // Lighter orange for shimmer
418
418
  briefLabelYou: 'rgb(37,99,235)', // Blue
419
- briefLabelClaude: 'rgb(255,153,51)', // Orange adjusted for deuteranopia (matches claude)
419
+ briefLabelClaude: 'rgb(0,200,180)', // Xela teal
420
420
  rainbow_red: 'rgb(235,95,87)',
421
421
  rainbow_orange: 'rgb(245,139,87)',
422
422
  rainbow_yellow: 'rgb(250,195,95)',
@@ -440,10 +440,10 @@ const lightDaltonizedTheme: Theme = {
440
440
  const darkTheme: Theme = {
441
441
  autoAccept: 'rgb(175,135,255)', // Electric violet
442
442
  bashBorder: 'rgb(253,93,177)', // Bright pink
443
- claude: 'rgb(215,119,87)', // Claude orange
444
- claudeShimmer: 'rgb(235,159,127)', // Lighter claude orange for shimmer effect
445
- claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(147,165,255)', // Blue for system spinner
446
- claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(177,195,255)', // Lighter blue for system spinner shimmer
443
+ claude: 'rgb(0,220,200)', // Xela teal (brighter for dark bg)
444
+ claudeShimmer: 'rgb(50,250,230)', // Lighter teal for shimmer
445
+ claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(0,200,220)', // Cyan-teal for spinner
446
+ claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(50,230,250)', // Lighter cyan-teal for spinner shimmer
447
447
  permission: 'rgb(177,185,249)', // Light blue-purple
448
448
  permissionShimmer: 'rgb(207,215,255)', // Lighter blue-purple for shimmer
449
449
  planMode: 'rgb(72,150,140)', // Muted sage green
@@ -483,7 +483,7 @@ const darkTheme: Theme = {
483
483
  // Chrome colors
484
484
  chromeYellow: 'rgb(251,188,4)', // Chrome yellow
485
485
  // TUI V2 colors
486
- clawd_body: 'rgb(215,119,87)',
486
+ clawd_body: 'rgb(0,200,180)',
487
487
  clawd_background: 'rgb(0,0,0)',
488
488
  userMessageBackground: 'rgb(55, 55, 55)', // Lighter grey for better visual contrast
489
489
  userMessageBackgroundHover: 'rgb(70, 70, 70)',
@@ -497,7 +497,7 @@ const darkTheme: Theme = {
497
497
  fastMode: 'rgb(255,120,20)', // Electric orange for dark bg
498
498
  fastModeShimmer: 'rgb(255,165,70)', // Lighter orange for shimmer
499
499
  briefLabelYou: 'rgb(122,180,232)', // Light blue
500
- briefLabelClaude: 'rgb(215,119,87)', // Brand orange
500
+ briefLabelClaude: 'rgb(0,220,200)', // Xela teal
501
501
  rainbow_red: 'rgb(235,95,87)',
502
502
  rainbow_orange: 'rgb(245,139,87)',
503
503
  rainbow_yellow: 'rgb(250,195,95)',
@@ -521,8 +521,8 @@ const darkTheme: Theme = {
521
521
  const darkDaltonizedTheme: Theme = {
522
522
  autoAccept: 'rgb(175,135,255)', // Electric violet
523
523
  bashBorder: 'rgb(51,153,255)', // Bright blue
524
- claude: 'rgb(255,153,51)', // Orange adjusted for deuteranopia
525
- claudeShimmer: 'rgb(255,183,101)', // Lighter orange for shimmer effect
524
+ claude: 'rgb(0,200,180)', // Xela teal
525
+ claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
526
526
  claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(153,204,255)', // Light blue for system spinner
527
527
  claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(183,224,255)', // Lighter blue for system spinner shimmer
528
528
  permission: 'rgb(153,204,255)', // Light blue
@@ -564,7 +564,7 @@ const darkDaltonizedTheme: Theme = {
564
564
  // Chrome colors
565
565
  chromeYellow: 'rgb(251,188,4)', // Chrome yellow
566
566
  // TUI V2 colors
567
- clawd_body: 'rgb(215,119,87)',
567
+ clawd_body: 'rgb(0,200,180)',
568
568
  clawd_background: 'rgb(0,0,0)',
569
569
  userMessageBackground: 'rgb(55, 55, 55)', // Lighter grey for better visual contrast
570
570
  userMessageBackgroundHover: 'rgb(70, 70, 70)',
@@ -578,7 +578,7 @@ const darkDaltonizedTheme: Theme = {
578
578
  fastMode: 'rgb(255,120,20)', // Electric orange for dark bg (color-blind safe)
579
579
  fastModeShimmer: 'rgb(255,165,70)', // Lighter orange for shimmer
580
580
  briefLabelYou: 'rgb(122,180,232)', // Light blue
581
- briefLabelClaude: 'rgb(255,153,51)', // Orange adjusted for deuteranopia (matches claude)
581
+ briefLabelClaude: 'rgb(0,200,180)', // Xela teal
582
582
  rainbow_red: 'rgb(235,95,87)',
583
583
  rainbow_orange: 'rgb(245,139,87)',
584
584
  rainbow_yellow: 'rgb(250,195,95)',