@xelauvas/xela-cli 0.1.4 → 0.2.0

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 (36) 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/CondensedLogo.tsx +1 -1
  13. package/src/components/LogoV2/GuestPassesUpsell.tsx +1 -1
  14. package/src/components/LogoV2/LogoV2.tsx +2 -2
  15. package/src/components/LogoV2/WelcomeV2.tsx +3 -3
  16. package/src/components/LogoV2/feedConfigs.tsx +3 -3
  17. package/src/components/Onboarding.tsx +3 -3
  18. package/src/components/PromptInput/PromptInput.tsx +1 -1
  19. package/src/components/ResumeTask.tsx +2 -2
  20. package/src/components/TeleportError.tsx +1 -1
  21. package/src/components/mcp/ElicitationDialog.tsx +2 -2
  22. package/src/components/mcp/MCPRemoteServerMenu.tsx +4 -4
  23. package/src/components/mcp/MCPSettings.tsx +1 -1
  24. package/src/constants/github-app.ts +10 -10
  25. package/src/constants/product.ts +1 -1
  26. package/src/constants/prompts.ts +5 -5
  27. package/src/constants/system.ts +2 -2
  28. package/src/main.tsx +1 -1
  29. package/src/screens/REPL.tsx +3 -3
  30. package/src/services/mcp/auth.ts +1 -1
  31. package/src/services/mcp/client.ts +6 -6
  32. package/src/services/notifier.ts +1 -1
  33. package/src/services/tips/tipRegistry.ts +5 -5
  34. package/src/tools/WebFetchTool/utils.ts +1 -1
  35. package/src/utils/git.ts +1 -1
  36. package/src/utils/model/model.ts +5 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xelauvas/xela-cli",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
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];
@@ -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()
@@ -192,6 +192,11 @@ export function getRuntimeMainLoopModel(params: {
192
192
  * @returns The default model setting to use
193
193
  */
194
194
  export function getDefaultMainLoopModelSetting(): ModelName | ModelAlias {
195
+ // OpenAI-compatible backend: use OPENAI_MODEL
196
+ if (process.env.OPENAI_API_KEY) {
197
+ return process.env.OPENAI_MODEL || 'gpt-4o'
198
+ }
199
+
195
200
  // Ants default to defaultModel from flag config, or Opus 1M if not configured
196
201
  if (process.env.USER_TYPE === 'ant') {
197
202
  return (