@xelauvas/xela-cli 0.2.1 → 0.2.3

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.
package/README.md CHANGED
@@ -1,27 +1,32 @@
1
1
  # Xela CLI
2
2
 
3
- AI coding assistant that works with **any model** — free or paid. Use OpenRouter, Groq, Ollama, DeepSeek, OpenAI, and more. One tool, any brain.
3
+ [![npm](https://img.shields.io/npm/v/@xelauvas/xela-cli)](https://www.npmjs.com/package/@xelauvas/xela-cli)
4
+ [![GitHub stars](https://img.shields.io/github/stars/xelauvas/codeclau?style=social)](https://github.com/xelauvas/codeclau)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
6
+
7
+ **Free AI coding assistant for your terminal.** Works with any model — OpenRouter, Groq, Ollama, DeepSeek, OpenAI, and more. Like Cursor/Claude Code, but free and open source.
4
8
 
5
9
  ```
6
- ▐▛███▜▌ Xela CLI
7
- ▝▜█████▛▘ AI coding assistant
8
- ▘▘ ▝▝ powered by any model
10
+ ╲ ╳ ╱ Xela
11
+ ╱ ╳ ╲ AI coding assistant
12
+ XELA powered by any model
9
13
  ```
10
14
 
11
15
  ## Install
12
16
 
13
- **npm (recommended):**
14
17
  ```bash
15
18
  npm install -g @xelauvas/xela-cli
16
19
  ```
17
20
 
18
- **One-liner:**
21
+ On first run, Xela walks you through setup — pick a provider, paste a key, choose a model. No config files to edit.
22
+
23
+ **Other install methods:**
24
+
19
25
  ```bash
26
+ # One-liner
20
27
  curl -fsSL https://raw.githubusercontent.com/xelauvas/codeclau/main/install.sh | bash
21
- ```
22
28
 
23
- **From source:**
24
- ```bash
29
+ # From source
25
30
  git clone https://github.com/xelauvas/codeclau.git /opt/xela
26
31
  cd /opt/xela && npm install && npm link
27
32
  ```
@@ -29,10 +34,7 @@ cd /opt/xela && npm install && npm link
29
34
  ## Quick Start
30
35
 
31
36
  ```bash
32
- # First run creates ~/.xela/config — edit it with your API key
33
- xela
34
-
35
- # Interactive mode
37
+ # Interactive setup + launch
36
38
  xela
37
39
 
38
40
  # With a prompt
@@ -41,160 +43,170 @@ xela "fix the login bug in auth.ts"
41
43
  # Non-interactive (pipe-friendly)
42
44
  xela -p "explain this function"
43
45
 
44
- # Override model on the fly
45
- xela -m nvidia/nemotron-3-super-120b-a12b:free "review this code"
46
- ```
46
+ # Override model for one session
47
+ xela -m google/gemini-2.5-pro-exp-03-25:free "review this code"
48
+ ```
49
+
50
+ ## What It Can Do
51
+
52
+ - **Edit files** — reads your code, makes changes with your permission
53
+ - **Run commands** — executes shell commands, runs tests, builds projects
54
+ - **Agentic coding** — plans, executes, and iterates on code changes
55
+ - **Multi-file refactoring** — rename, restructure, migrate across your codebase
56
+ - **Web search** — looks up docs, APIs, error messages
57
+ - **MCP support** — extensible via Model Context Protocol servers
58
+ - **Project memory** — run `/init` to create `XELA.md` with project instructions
59
+ - **Auto mode** — let Xela handle permissions automatically for long tasks
60
+
61
+ ## Slash Commands
62
+
63
+ | Command | Description |
64
+ |---|---|
65
+ | `/init` | Create a `XELA.md` file with project instructions |
66
+ | `/model` | Switch model |
67
+ | `/config` | Open settings |
68
+ | `/help` | Show help |
69
+ | `/clear` | Clear conversation |
70
+ | `/compact` | Compress conversation to save context |
71
+ | `/cost` | Show token usage |
72
+ | `/mcp` | Manage MCP servers |
73
+
74
+ ## Keyboard Shortcuts
75
+
76
+ | Key | Action |
77
+ |---|---|
78
+ | `Enter` | Submit prompt |
79
+ | `Escape` | Cancel current request |
80
+ | `Ctrl+C` | Exit |
81
+ | `Tab` | Accept autocomplete |
82
+ | `Shift+Tab` | Toggle auto mode |
83
+ | `Up/Down` | Navigate history |
47
84
 
48
85
  ## Free Providers
49
86
 
50
- You don't need to pay anything to use Xela. Here are free options:
51
-
52
- ### OpenRouter (Free Models)
53
- Sign up at [openrouter.ai](https://openrouter.ai) — no credit card needed.
54
-
55
- ```bash
56
- # ~/.xela/config
57
- XELA_PROVIDER=openrouter
58
- OPENAI_API_KEY=sk-or-your-key
59
- OPENAI_MODEL=qwen/qwen3.6-plus-preview:free
60
- ```
87
+ You don't need to pay anything. Here are free options:
61
88
 
62
- Free models available:
63
- | Model | ID | Context |
64
- |---|---|---|
65
- | Qwen 3.6 Plus | `qwen/qwen3.6-plus-preview:free` | 1M |
66
- | Nemotron 3 Super 120B | `nvidia/nemotron-3-super-120b-a12b:free` | 262K |
67
- | Step 3.5 Flash | `stepfun/step-3.5-flash:free` | 256K |
68
- | Nemotron 3 Nano | `nvidia/nemotron-3-nano-30b-a3b:free` | 256K |
89
+ ### OpenRouter (recommended)
90
+ Sign up at [openrouter.ai/keys](https://openrouter.ai/keys) — no credit card needed.
69
91
 
70
- ### Groq (Free Tier)
71
- Sign up at [console.groq.com](https://console.groq.com) — blazing fast inference.
92
+ Available free models:
93
+ | Model | ID |
94
+ |---|---|
95
+ | Qwen 3.6 Plus (1M context) | `qwen/qwen3.6-plus-preview:free` |
96
+ | DeepSeek Chat V3 | `deepseek/deepseek-chat-v3-0324:free` |
97
+ | Gemini 2.5 Pro | `google/gemini-2.5-pro-exp-03-25:free` |
98
+ | Llama 4 Maverick | `meta-llama/llama-4-maverick:free` |
99
+ | Nemotron Ultra 253B | `nvidia/llama-3.1-nemotron-ultra-253b:free` |
72
100
 
73
- ```bash
74
- # ~/.xela/config
75
- XELA_PROVIDER=groq
76
- OPENAI_API_KEY=gsk_your-key
77
- OPENAI_MODEL=qwen-qwq-32b
78
- ```
101
+ ### Groq (free tier)
102
+ Sign up at [console.groq.com/keys](https://console.groq.com/keys) — blazing fast inference.
79
103
 
80
- ### Ollama (Local, Free Forever)
81
- Install from [ollama.com](https://ollama.com) — runs on your machine.
104
+ ### Ollama (local, free forever)
105
+ Install from [ollama.com](https://ollama.com) — runs on your machine, fully private.
82
106
 
83
107
  ```bash
84
108
  ollama pull qwen2.5-coder:7b
85
-
86
- # ~/.xela/config
87
- XELA_PROVIDER=ollama
88
- OPENAI_API_KEY=ollama
89
- OPENAI_MODEL=qwen2.5-coder:7b
109
+ # Then pick "ollama" as provider during xela setup
90
110
  ```
91
111
 
92
- ## Paid Providers
112
+ ### Other free tiers
113
+ - **Cerebras** — fast inference, free tier
114
+ - **SambaNova** — free tier available
93
115
 
94
- For better quality and speed:
116
+ ## Paid Providers
95
117
 
96
- ### OpenRouter (Paid Models)
97
- ```bash
98
- XELA_PROVIDER=openrouter
99
- OPENAI_API_KEY=sk-or-your-key
100
- OPENAI_MODEL=openai/gpt-5.3-codex # $0.00175/M input
101
- # OPENAI_MODEL=anthropic/claude-opus-4.6 # $0.005/M input
102
- # OPENAI_MODEL=google/gemini-3.1-pro-preview # $0.002/M input
103
- ```
118
+ For better quality and higher rate limits:
104
119
 
105
- ### DeepSeek
106
- ```bash
107
- XELA_PROVIDER=deepseek
108
- OPENAI_API_KEY=sk-your-key
109
- OPENAI_MODEL=deepseek-chat
110
- ```
111
-
112
- ### OpenAI Direct
113
- ```bash
114
- XELA_PROVIDER=openai
115
- OPENAI_API_KEY=sk-your-key
116
- OPENAI_MODEL=gpt-4o
117
- ```
120
+ | Provider | Setup |
121
+ |---|---|
122
+ | **DeepSeek** | [platform.deepseek.com/api_keys](https://platform.deepseek.com/api_keys) — very cheap |
123
+ | **OpenAI** | [platform.openai.com/api-keys](https://platform.openai.com/api-keys) |
124
+ | **OpenRouter** (paid models) | Same key, just pick a paid model |
118
125
 
119
126
  ## Configuration
120
127
 
121
- Config file: `~/.xela/config` (created on first run)
128
+ Config is stored at `~/.xela/config.json` (created during first-run setup).
122
129
 
123
- ```bash
124
- # ~/.xela/config
125
- XELA_PROVIDER=openrouter
126
- OPENAI_API_KEY=sk-or-your-key-here
127
- OPENAI_MODEL=qwen/qwen3.6-plus-preview:free
128
- # OPENAI_BASE_URL= # auto-detected from provider
130
+ ```json
131
+ {
132
+ "provider": "openrouter",
133
+ "apiKey": "sk-or-v1-...",
134
+ "model": "qwen/qwen3.6-plus-preview:free",
135
+ "baseUrl": ""
136
+ }
129
137
  ```
130
138
 
131
- ### Supported Providers
139
+ ### Re-run setup
132
140
 
133
- | Provider | `XELA_PROVIDER` | Key Prefix | Free? |
134
- |---|---|---|---|
135
- | OpenRouter | `openrouter` | `sk-or-` | Free models available |
136
- | Groq | `groq` | `gsk_` | Free tier |
137
- | Ollama | `ollama` | `ollama` | Free (local) |
138
- | DeepSeek | `deepseek` | `sk-` | Cheap |
139
- | OpenAI | `openai` | `sk-` | Paid |
140
- | Cerebras | `cerebras` | — | Free tier |
141
- | SambaNova | `sambanova` | — | Free tier |
141
+ ```bash
142
+ rm ~/.xela/config.json && xela
143
+ ```
142
144
 
143
- ### Model Override
145
+ ### Change model
144
146
 
145
147
  ```bash
146
- # Override for a single session
147
- xela -m openai/gpt-5.4-pro "architect a microservice"
148
+ # Edit config directly
149
+ nano ~/.xela/config.json
148
150
 
149
- # Or set in config permanently
150
- nano ~/.xela/config
151
+ # Or override per-session
152
+ xela -m model-id
151
153
  ```
152
154
 
153
- ## Features
155
+ ### Supported Providers
154
156
 
155
- - **Multi-provider** — Switch between any OpenAI-compatible API
156
- - **Auto-detection** — Detects provider from API key prefix
157
- - **Free by default** — Works with free models out of the box
158
- - **Full CLI** — Interactive REPL, non-interactive mode, piping support
159
- - **Tool use** — File editing, bash commands, web search, and more
160
- - **Agentic coding** — Plans, executes, and iterates on code changes
161
- - **MCP support** — Extensible via Model Context Protocol servers
157
+ | Provider | Default Model | Free? |
158
+ |---|---|---|
159
+ | OpenRouter | `qwen/qwen3.6-plus-preview:free` | Free models available |
160
+ | Groq | `qwen-qwq-32b` | Free tier |
161
+ | Ollama | `qwen2.5-coder:7b` | Free (local) |
162
+ | DeepSeek | `deepseek-chat` | Cheap |
163
+ | OpenAI | `gpt-4o` | Paid |
164
+ | Cerebras | `llama-3.3-70b` | Free tier |
165
+ | SambaNova | `Meta-Llama-3.3-70B-Instruct` | Free tier |
162
166
 
163
167
  ## Self-Hosting Models
164
168
 
165
- For privacy or unlimited usage, run models locally:
169
+ For privacy or unlimited usage, run models locally with Ollama:
166
170
 
167
- ### Small Server (16GB RAM, no GPU)
168
171
  ```bash
172
+ # Small (16GB RAM, no GPU) — ~10-30 tok/s
169
173
  ollama pull qwen2.5-coder:3b
170
- # ~10-30 tokens/sec on CPU
171
- ```
172
174
 
173
- ### GPU Server (24GB+ VRAM)
174
- ```bash
175
+ # GPU (24GB+ VRAM) — ~100 tok/s
175
176
  ollama pull qwen2.5-coder:32b
176
- # 100+ tokens/sec
177
+
178
+ # Multi-GPU — full power
179
+ ollama pull deepseek-v3.2
177
180
  ```
178
181
 
179
- ### Multi-GPU Server
182
+ ## Project Instructions (XELA.md)
183
+
184
+ Run `/init` inside any project to generate a `XELA.md` file. This file tells Xela about your project — build commands, architecture, conventions. It's loaded automatically every session.
185
+
180
186
  ```bash
181
- ollama pull deepseek-v3.2
182
- # Full power
187
+ cd my-project
188
+ xela
189
+ # then type /init
183
190
  ```
184
191
 
192
+ Xela also reads `XELA.local.md` for personal project instructions (add it to `.gitignore`).
193
+
185
194
  ## Uninstall
186
195
 
187
196
  ```bash
188
- # npm install
197
+ # Remove CLI
189
198
  npm uninstall -g @xelauvas/xela-cli
190
199
 
191
- # curl install
192
- curl -fsSL https://raw.githubusercontent.com/xelauvas/codeclau/main/uninstall.sh | bash
193
-
194
- # Config (optional)
200
+ # Remove config (optional)
195
201
  rm -rf ~/.xela
196
202
  ```
197
203
 
204
+ ## Links
205
+
206
+ - **GitHub**: [github.com/xelauvas/codeclau](https://github.com/xelauvas/codeclau)
207
+ - **npm**: [@xelauvas/xela-cli](https://www.npmjs.com/package/@xelauvas/xela-cli)
208
+ - **Issues**: [github.com/xelauvas/codeclau/issues](https://github.com/xelauvas/codeclau/issues)
209
+
198
210
  ## License
199
211
 
200
212
  MIT
package/bin/xela.js CHANGED
@@ -165,6 +165,24 @@ for (let i = 0; i < args.length; i++) {
165
165
  }
166
166
  }
167
167
 
168
+ // Show star prompt after first few uses
169
+ const STAR_FILE = join(XELA_HOME, '.star-shown');
170
+ const USAGE_FILE = join(XELA_HOME, '.usage-count');
171
+ try {
172
+ let count = 0;
173
+ try { count = parseInt(readFileSync(USAGE_FILE, 'utf-8')) || 0; } catch {}
174
+ count++;
175
+ writeFileSync(USAGE_FILE, String(count));
176
+ if (count === 3 && !existsSync(STAR_FILE)) {
177
+ console.log('');
178
+ console.log(' \x1b[36m╲ ╳ ╱\x1b[0m Enjoying Xela? Give it a star!');
179
+ console.log(' \x1b[36m╱ ╳ ╲\x1b[0m \x1b[4mhttps://github.com/xelauvas/codeclau\x1b[0m');
180
+ console.log(' \x1b[36m XELA \x1b[0m It helps others discover it too.');
181
+ console.log('');
182
+ writeFileSync(STAR_FILE, '1');
183
+ }
184
+ } catch {}
185
+
168
186
  // Launch node with the TSX loader shim
169
187
  try {
170
188
  execFileSync(process.execPath, [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xelauvas/xela-cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Xela — AI coding assistant powered by any model (OpenRouter, Groq, Ollama, DeepSeek, OpenAI)",
5
5
  "author": "xelauvas",
6
6
  "license": "MIT",
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "scripts": {
22
22
  "start": "node --import ./src/_shims/register.js ./src/entrypoints/cli.tsx",
23
- "postinstall": "echo '\\n Xela installed! Run: xela\\n Config: ~/.xela/config\\n'"
23
+ "postinstall": "echo '\\n \\x1b[36m╲ ╳ ╱\\x1b[0m Xela installed!\\n \\x1b[36m╱ ╳ ╲\\x1b[0m Run: xela\\n \\x1b[36m XELA \\x1b[0m Star: github.com/xelauvas/codeclau\\n'"
24
24
  },
25
25
  "dependencies": {
26
26
  "@alcalzone/ansi-tokenize": "^0.3.0",
@@ -3,15 +3,15 @@ import type { Command } from '../commands.js'
3
3
  import { maybeMarkProjectOnboardingComplete } from '../projectOnboardingState.js'
4
4
  import { isEnvTruthy } from '../utils/envUtils.js'
5
5
 
6
- const OLD_INIT_PROMPT = `Please analyze this codebase and create a CLAUDE.md file, which will be given to future instances of Claude Code to operate in this repository.
6
+ const OLD_INIT_PROMPT = `Please analyze this codebase and create a XELA.md file, which will be given to future instances of Xela to operate in this repository.
7
7
 
8
8
  What to add:
9
9
  1. Commands that will be commonly used, such as how to build, lint, and run tests. Include the necessary commands to develop in this codebase, such as how to run a single test.
10
10
  2. High-level code architecture and structure so that future instances can be productive more quickly. Focus on the "big picture" architecture that requires reading multiple files to understand.
11
11
 
12
12
  Usage notes:
13
- - If there's already a CLAUDE.md, suggest improvements to it.
14
- - When you make the initial CLAUDE.md, do not repeat yourself and do not include obvious instructions like "Provide helpful error messages to users", "Write unit tests for all new utilities", "Never include sensitive information (API keys, tokens) in code or commits".
13
+ - If there's already a XELA.md, suggest improvements to it.
14
+ - When you make the initial XELA.md, do not repeat yourself and do not include obvious instructions like "Provide helpful error messages to users", "Write unit tests for all new utilities", "Never include sensitive information (API keys, tokens) in code or commits".
15
15
  - Avoid listing every component or file structure that can be easily discovered.
16
16
  - Don't include generic development practices.
17
17
  - If there are Cursor rules (in .cursor/rules/ or .cursorrules) or Copilot rules (in .github/copilot-instructions.md), make sure to include the important parts.
@@ -20,30 +20,30 @@ Usage notes:
20
20
  - Be sure to prefix the file with the following text:
21
21
 
22
22
  \`\`\`
23
- # CLAUDE.md
23
+ # XELA.md
24
24
 
25
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
25
+ This file provides guidance to Xela (claude.ai/code) when working with code in this repository.
26
26
  \`\`\``
27
27
 
28
- const NEW_INIT_PROMPT = `Set up a minimal CLAUDE.md (and optionally skills and hooks) for this repo. CLAUDE.md is loaded into every Claude Code session, so it must be concise — only include what Claude would get wrong without it.
28
+ const NEW_INIT_PROMPT = `Set up a minimal XELA.md (and optionally skills and hooks) for this repo. XELA.md is loaded into every Xela session, so it must be concise — only include what Claude would get wrong without it.
29
29
 
30
30
  ## Phase 1: Ask what to set up
31
31
 
32
32
  Use AskUserQuestion to find out what the user wants:
33
33
 
34
- - "Which CLAUDE.md files should /init set up?"
35
- Options: "Project CLAUDE.md" | "Personal CLAUDE.local.md" | "Both project + personal"
34
+ - "Which XELA.md files should /init set up?"
35
+ Options: "Project XELA.md" | "Personal XELA.local.md" | "Both project + personal"
36
36
  Description for project: "Team-shared instructions checked into source control — architecture, coding standards, common workflows."
37
37
  Description for personal: "Your private preferences for this project (gitignored, not shared) — your role, sandbox URLs, preferred test data, workflow quirks."
38
38
 
39
39
  - "Also set up skills and hooks?"
40
- Options: "Skills + hooks" | "Skills only" | "Hooks only" | "Neither, just CLAUDE.md"
40
+ Options: "Skills + hooks" | "Skills only" | "Hooks only" | "Neither, just XELA.md"
41
41
  Description for skills: "On-demand capabilities you or Claude invoke with \`/skill-name\` — good for repeatable workflows and reference knowledge."
42
42
  Description for hooks: "Deterministic shell commands that run on tool events (e.g., format after every edit). Claude can't skip them."
43
43
 
44
44
  ## Phase 2: Explore the codebase
45
45
 
46
- Launch a subagent to survey the codebase, and ask it to read key files to understand the project: manifest files (package.json, Cargo.toml, pyproject.toml, go.mod, pom.xml, etc.), README, Makefile/build configs, CI config, existing CLAUDE.md, .claude/rules/, AGENTS.md, .cursor/rules or .cursorrules, .github/copilot-instructions.md, .windsurfrules, .clinerules, .mcp.json.
46
+ Launch a subagent to survey the codebase, and ask it to read key files to understand the project: manifest files (package.json, Cargo.toml, pyproject.toml, go.mod, pom.xml, etc.), README, Makefile/build configs, CI config, existing XELA.md, .claude/rules/, AGENTS.md, .cursor/rules or .cursorrules, .github/copilot-instructions.md, .windsurfrules, .clinerules, .mcp.json.
47
47
 
48
48
  Detect:
49
49
  - Build, test, and lint commands (especially non-standard ones)
@@ -53,30 +53,30 @@ Detect:
53
53
  - Non-obvious gotchas, required env vars, or workflow quirks
54
54
  - Existing .claude/skills/ and .claude/rules/ directories
55
55
  - Formatter configuration (prettier, biome, ruff, black, gofmt, rustfmt, or a unified format script like \`npm run format\` / \`make fmt\`)
56
- - Git worktree usage: run \`git worktree list\` to check if this repo has multiple worktrees (only relevant if the user wants a personal CLAUDE.local.md)
56
+ - Git worktree usage: run \`git worktree list\` to check if this repo has multiple worktrees (only relevant if the user wants a personal XELA.local.md)
57
57
 
58
58
  Note what you could NOT figure out from code alone — these become interview questions.
59
59
 
60
60
  ## Phase 3: Fill in the gaps
61
61
 
62
- Use AskUserQuestion to gather what you still need to write good CLAUDE.md files and skills. Ask only things the code can't answer.
62
+ Use AskUserQuestion to gather what you still need to write good XELA.md files and skills. Ask only things the code can't answer.
63
63
 
64
- If the user chose project CLAUDE.md or both: ask about codebase practices — non-obvious commands, gotchas, branch/PR conventions, required env setup, testing quirks. Skip things already in README or obvious from manifest files. Do not mark any options as "recommended" — this is about how their team works, not best practices.
64
+ If the user chose project XELA.md or both: ask about codebase practices — non-obvious commands, gotchas, branch/PR conventions, required env setup, testing quirks. Skip things already in README or obvious from manifest files. Do not mark any options as "recommended" — this is about how their team works, not best practices.
65
65
 
66
- If the user chose personal CLAUDE.local.md or both: ask about them, not the codebase. Do not mark any options as "recommended" — this is about their personal preferences, not best practices. Examples of questions:
66
+ If the user chose personal XELA.local.md or both: ask about them, not the codebase. Do not mark any options as "recommended" — this is about their personal preferences, not best practices. Examples of questions:
67
67
  - What's their role on the team? (e.g., "backend engineer", "data scientist", "new hire onboarding")
68
68
  - How familiar are they with this codebase and its languages/frameworks? (so Claude can calibrate explanation depth)
69
69
  - Do they have personal sandbox URLs, test accounts, API key paths, or local setup details Claude should know?
70
- - Only if Phase 2 found multiple git worktrees: ask whether their worktrees are nested inside the main repo (e.g., \`.claude/worktrees/<name>/\`) or siblings/external (e.g., \`../myrepo-feature/\`). If nested, the upward file walk finds the main repo's CLAUDE.local.md automatically — no special handling needed. If sibling/external, the personal content should live in a home-directory file (e.g., \`~/.claude/<project-name>-instructions.md\`) and each worktree gets a one-line CLAUDE.local.md stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. Never put this import in the project CLAUDE.md — that would check a personal reference into the team-shared file.
70
+ - Only if Phase 2 found multiple git worktrees: ask whether their worktrees are nested inside the main repo (e.g., \`.claude/worktrees/<name>/\`) or siblings/external (e.g., \`../myrepo-feature/\`). If nested, the upward file walk finds the main repo's XELA.local.md automatically — no special handling needed. If sibling/external, the personal content should live in a home-directory file (e.g., \`~/.claude/<project-name>-instructions.md\`) and each worktree gets a one-line XELA.local.md stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. Never put this import in the project XELA.md — that would check a personal reference into the team-shared file.
71
71
  - Any communication preferences? (e.g., "be terse", "always explain tradeoffs", "don't summarize at the end")
72
72
 
73
- **Synthesize a proposal from Phase 2 findings** — e.g., format-on-edit if a formatter exists, a \`/verify\` skill if tests exist, a CLAUDE.md note for anything from the gap-fill answers that's a guideline rather than a workflow. For each, pick the artifact type that fits, **constrained by the Phase 1 skills+hooks choice**:
73
+ **Synthesize a proposal from Phase 2 findings** — e.g., format-on-edit if a formatter exists, a \`/verify\` skill if tests exist, a XELA.md note for anything from the gap-fill answers that's a guideline rather than a workflow. For each, pick the artifact type that fits, **constrained by the Phase 1 skills+hooks choice**:
74
74
 
75
75
  - **Hook** (stricter) — deterministic shell command on a tool event; Claude can't skip it. Fits mechanical, fast, per-edit steps: formatting, linting, running a quick test on the changed file.
76
76
  - **Skill** (on-demand) — you or Claude invoke \`/skill-name\` when you want it. Fits workflows that don't belong on every edit: deep verification, session reports, deploys.
77
- - **CLAUDE.md note** (looser) — influences Claude's behavior but not enforced. Fits communication/thinking preferences: "plan before coding", "be terse", "explain tradeoffs".
77
+ - **XELA.md note** (looser) — influences Claude's behavior but not enforced. Fits communication/thinking preferences: "plan before coding", "be terse", "explain tradeoffs".
78
78
 
79
- **Respect Phase 1's skills+hooks choice as a hard filter**: if the user picked "Skills only", downgrade any hook you'd suggest to a skill or a CLAUDE.md note. If "Hooks only", downgrade skills to hooks (where mechanically possible) or notes. If "Neither", everything becomes a CLAUDE.md note. Never propose an artifact type the user didn't opt into.
79
+ **Respect Phase 1's skills+hooks choice as a hard filter**: if the user picked "Skills only", downgrade any hook you'd suggest to a skill or a XELA.md note. If "Hooks only", downgrade skills to hooks (where mechanically possible) or notes. If "Neither", everything becomes a XELA.md note. Never propose an artifact type the user didn't opt into.
80
80
 
81
81
  **Show the proposal via AskUserQuestion's \`preview\` field, not as a separate text message** — the dialog overlays your output, so preceding text is hidden. The \`preview\` field renders markdown in a side-panel (like plan mode); the \`question\` field is plain-text-only. Structure it as:
82
82
 
@@ -86,17 +86,17 @@ If the user chose personal CLAUDE.local.md or both: ask about them, not the code
86
86
 
87
87
  • **Format-on-edit hook** (automatic) — \`ruff format <file>\` via PostToolUse
88
88
  • **/verify skill** (on-demand) — \`make lint && make typecheck && make test\`
89
- • **CLAUDE.md note** (guideline) — "run lint/typecheck/test before marking done"
89
+ • **XELA.md note** (guideline) — "run lint/typecheck/test before marking done"
90
90
 
91
91
  - Option labels stay short ("Looks good", "Drop the hook", "Drop the skill") — the tool auto-adds an "Other" free-text option, so don't add your own catch-all.
92
92
 
93
93
  **Build the preference queue** from the accepted proposal. Each entry: {type: hook|skill|note, description, target file, any Phase-2-sourced details like the actual test/format command}. Phases 4-7 consume this queue.
94
94
 
95
- ## Phase 4: Write CLAUDE.md (if user chose project or both)
95
+ ## Phase 4: Write XELA.md (if user chose project or both)
96
96
 
97
- Write a minimal CLAUDE.md at the project root. Every line must pass this test: "Would removing this cause Claude to make mistakes?" If no, cut it.
97
+ Write a minimal XELA.md at the project root. Every line must pass this test: "Would removing this cause Claude to make mistakes?" If no, cut it.
98
98
 
99
- **Consume \`note\` entries from the Phase 3 preference queue whose target is CLAUDE.md** (team-level notes) — add each as a concise line in the most relevant section. These are the behaviors the user wants Claude to follow but didn't need guaranteed (e.g., "propose a plan before implementing", "explain the tradeoffs when refactoring"). Leave personal-targeted notes for Phase 5.
99
+ **Consume \`note\` entries from the Phase 3 preference queue whose target is XELA.md** (team-level notes) — add each as a concise line in the most relevant section. These are the behaviors the user wants Claude to follow but didn't need guaranteed (e.g., "propose a plan before implementing", "explain the tradeoffs when refactoring"). Leave personal-targeted notes for Phase 5.
100
100
 
101
101
  Include:
102
102
  - Build/test/lint commands Claude can't guess (non-standard scripts, flags, or sequences)
@@ -111,7 +111,7 @@ Exclude:
111
111
  - File-by-file structure or component lists (Claude can discover these by reading the codebase)
112
112
  - Standard language conventions Claude already knows
113
113
  - Generic advice ("write clean code", "handle errors")
114
- - Detailed API docs or long references — use \`@path/to/import\` syntax instead (e.g., \`@docs/api-reference.md\`) to inline content on demand without bloating CLAUDE.md
114
+ - Detailed API docs or long references — use \`@path/to/import\` syntax instead (e.g., \`@docs/api-reference.md\`) to inline content on demand without bloating XELA.md
115
115
  - Information that changes frequently — reference the source with \`@path/to/import\` so Claude always reads the current version
116
116
  - Long tutorials or walkthroughs (move to a separate file and reference with \`@path/to/import\`, or put in a skill)
117
117
  - Commands obvious from manifest files (e.g., standard "npm test", "cargo test", "pytest")
@@ -123,22 +123,22 @@ Do not repeat yourself and do not make up sections like "Common Development Task
123
123
  Prefix the file with:
124
124
 
125
125
  \`\`\`
126
- # CLAUDE.md
126
+ # XELA.md
127
127
 
128
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
128
+ This file provides guidance to Xela (claude.ai/code) when working with code in this repository.
129
129
  \`\`\`
130
130
 
131
- If CLAUDE.md already exists: read it, propose specific changes as diffs, and explain why each change improves it. Do not silently overwrite.
131
+ If XELA.md already exists: read it, propose specific changes as diffs, and explain why each change improves it. Do not silently overwrite.
132
132
 
133
- For projects with multiple concerns, suggest organizing instructions into \`.claude/rules/\` as separate focused files (e.g., \`code-style.md\`, \`testing.md\`, \`security.md\`). These are loaded automatically alongside CLAUDE.md and can be scoped to specific file paths using \`paths\` frontmatter.
133
+ For projects with multiple concerns, suggest organizing instructions into \`.claude/rules/\` as separate focused files (e.g., \`code-style.md\`, \`testing.md\`, \`security.md\`). These are loaded automatically alongside XELA.md and can be scoped to specific file paths using \`paths\` frontmatter.
134
134
 
135
- For projects with distinct subdirectories (monorepos, multi-module projects, etc.): mention that subdirectory CLAUDE.md files can be added for module-specific instructions (they're loaded automatically when Claude works in those directories). Offer to create them if the user wants.
135
+ For projects with distinct subdirectories (monorepos, multi-module projects, etc.): mention that subdirectory XELA.md files can be added for module-specific instructions (they're loaded automatically when Claude works in those directories). Offer to create them if the user wants.
136
136
 
137
- ## Phase 5: Write CLAUDE.local.md (if user chose personal or both)
137
+ ## Phase 5: Write XELA.local.md (if user chose personal or both)
138
138
 
139
- Write a minimal CLAUDE.local.md at the project root. This file is automatically loaded alongside CLAUDE.md. After creating it, add \`CLAUDE.local.md\` to the project's .gitignore so it stays private.
139
+ Write a minimal XELA.local.md at the project root. This file is automatically loaded alongside XELA.md. After creating it, add \`XELA.local.md\` to the project's .gitignore so it stays private.
140
140
 
141
- **Consume \`note\` entries from the Phase 3 preference queue whose target is CLAUDE.local.md** (personal-level notes) — add each as a concise line. If the user chose personal-only in Phase 1, this is the sole consumer of note entries.
141
+ **Consume \`note\` entries from the Phase 3 preference queue whose target is XELA.local.md** (personal-level notes) — add each as a concise line. If the user chose personal-only in Phase 1, this is the sole consumer of note entries.
142
142
 
143
143
  Include:
144
144
  - The user's role and familiarity with the codebase (so Claude can calibrate explanations)
@@ -147,9 +147,9 @@ Include:
147
147
 
148
148
  Keep it short — only include what would make Claude's responses noticeably better for this user.
149
149
 
150
- If Phase 2 found multiple git worktrees and the user confirmed they use sibling/external worktrees (not nested inside the main repo): the upward file walk won't find a single CLAUDE.local.md from all worktrees. Write the actual personal content to \`~/.claude/<project-name>-instructions.md\` and make CLAUDE.local.md a one-line stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. The user can copy this one-line stub to each sibling worktree. Never put this import in the project CLAUDE.md. If worktrees are nested inside the main repo (e.g., \`.claude/worktrees/\`), no special handling is needed — the main repo's CLAUDE.local.md is found automatically.
150
+ If Phase 2 found multiple git worktrees and the user confirmed they use sibling/external worktrees (not nested inside the main repo): the upward file walk won't find a single XELA.local.md from all worktrees. Write the actual personal content to \`~/.claude/<project-name>-instructions.md\` and make XELA.local.md a one-line stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. The user can copy this one-line stub to each sibling worktree. Never put this import in the project XELA.md. If worktrees are nested inside the main repo (e.g., \`.claude/worktrees/\`), no special handling is needed — the main repo's XELA.local.md is found automatically.
151
151
 
152
- If CLAUDE.local.md already exists: read it, propose specific additions, and do not silently overwrite.
152
+ If XELA.local.md already exists: read it, propose specific additions, and do not silently overwrite.
153
153
 
154
154
  ## Phase 6: Suggest and create skills (if user chose "Skills + hooks" or "Skills only")
155
155
 
@@ -183,7 +183,7 @@ Both the user (\`/<skill-name>\`) and Claude can invoke skills by default. For w
183
183
 
184
184
  ## Phase 7: Suggest additional optimizations
185
185
 
186
- Tell the user you're going to suggest a few additional optimizations now that CLAUDE.md and skills (if chosen) are in place.
186
+ Tell the user you're going to suggest a few additional optimizations now that XELA.md and skills (if chosen) are in place.
187
187
 
188
188
  Check the environment and ask about each gap you find (use AskUserQuestion):
189
189
 
@@ -195,7 +195,7 @@ Check the environment and ask about each gap you find (use AskUserQuestion):
195
195
 
196
196
  For each hook preference (from the queue or the formatter fallback):
197
197
 
198
- 1. Target file: default based on the Phase 1 CLAUDE.md choice — project → \`.claude/settings.json\` (team-shared, committed); personal → \`.claude/settings.local.json\`. Only ask if the user chose "both" in Phase 1 or the preference is ambiguous. Ask once for all hooks, not per-hook.
198
+ 1. Target file: default based on the Phase 1 XELA.md choice — project → \`.claude/settings.json\` (team-shared, committed); personal → \`.claude/settings.local.json\`. Only ask if the user chose "both" in Phase 1 or the preference is ambiguous. Ask once for all hooks, not per-hook.
199
199
 
200
200
  2. Pick the event and matcher from the preference:
201
201
  - "after every edit" → \`PostToolUse\` with matcher \`Write|Edit\`
@@ -214,13 +214,13 @@ Act on each "yes" before moving on.
214
214
 
215
215
  Recap what was set up — which files were written and the key points included in each. Remind the user these files are a starting point: they should review and tweak them, and can run \`/init\` again anytime to re-scan.
216
216
 
217
- Then tell the user that you'll be introducing a few more suggestions for optimizing their codebase and Claude Code setup based on what you found. Present these as a single, well-formatted to-do list where every item is relevant to this repo. Put the most impactful items first.
217
+ Then tell the user that you'll be introducing a few more suggestions for optimizing their codebase and Xela setup based on what you found. Present these as a single, well-formatted to-do list where every item is relevant to this repo. Put the most impactful items first.
218
218
 
219
219
  When building the list, work through these checks and include only what applies:
220
220
  - If frontend code was detected (React, Vue, Svelte, etc.): \`/plugin install frontend-design@claude-plugins-official\` gives Claude design principles and component patterns so it produces polished UI; \`/plugin install playwright@claude-plugins-official\` lets Claude launch a real browser, screenshot what it built, and fix visual bugs itself.
221
221
  - If you found gaps in Phase 7 (missing GitHub CLI, missing linting) and the user said no: list them here with a one-line reason why each helps.
222
222
  - If tests are missing or sparse: suggest setting up a test framework so Claude can verify its own changes.
223
- - To help you create skills and optimize existing skills using evals, Claude Code has an official skill-creator plugin you can install. Install it with \`/plugin install skill-creator@claude-plugins-official\`, then run \`/skill-creator <skill-name>\` to create new skills or refine any existing skill. (Always include this one.)
223
+ - To help you create skills and optimize existing skills using evals, Xela has an official skill-creator plugin you can install. Install it with \`/plugin install skill-creator@claude-plugins-official\`, then run \`/skill-creator <skill-name>\` to create new skills or refine any existing skill. (Always include this one.)
224
224
  - Browse official plugins with \`/plugin\` — these bundle skills, agents, hooks, and MCP servers that you may find helpful. You can also create your own custom plugins to share them with others. (Always include this one.)`
225
225
 
226
226
  const command = {
@@ -230,8 +230,8 @@ const command = {
230
230
  return feature('NEW_INIT') &&
231
231
  (process.env.USER_TYPE === 'ant' ||
232
232
  isEnvTruthy(process.env.CLAUDE_CODE_NEW_INIT))
233
- ? 'Initialize new CLAUDE.md file(s) and optional skills/hooks with codebase documentation'
234
- : 'Initialize a new CLAUDE.md file with codebase documentation'
233
+ ? 'Initialize new XELA.md file(s) and optional skills/hooks with codebase documentation'
234
+ : 'Initialize a new XELA.md file with codebase documentation'
235
235
  },
236
236
  contentLength: 0, // Dynamic content
237
237
  progressMessage: 'analyzing your codebase',
@@ -975,7 +975,7 @@ export function Config({
975
975
  }
976
976
  }] : []), ...(shouldShowExternalIncludesToggle ? [{
977
977
  id: 'showExternalIncludesDialog',
978
- label: 'External CLAUDE.md includes',
978
+ label: 'External XELA.md includes',
979
979
  value: (() => {
980
980
  const projectConfig = getCurrentProjectConfig();
981
981
  if (projectConfig.hasClaudeMdExternalIncludesApproved) {
@@ -48,8 +48,8 @@ export function MemoryFileSelector(t0) {
48
48
  onCancel
49
49
  } = t0;
50
50
  const existingMemoryFiles = use(getMemoryFiles());
51
- const userMemoryPath = join(getClaudeConfigHomeDir(), "CLAUDE.md");
52
- const projectMemoryPath = join(getOriginalCwd(), "CLAUDE.md");
51
+ const userMemoryPath = join(getClaudeConfigHomeDir(), "XELA.md");
52
+ const projectMemoryPath = join(getOriginalCwd(), "XELA.md");
53
53
  const hasUserMemory = existingMemoryFiles.some(f => f.path === userMemoryPath);
54
54
  const hasProjectMemory = existingMemoryFiles.some(f_0 => f_0.path === projectMemoryPath);
55
55
  const allMemoryFiles = [...existingMemoryFiles.filter(_temp).map(_temp2), ...(hasUserMemory ? [] : [{
@@ -255,7 +255,7 @@ function getSimpleDoingTasksSection(): string {
255
255
  function getActionsSection(): string {
256
256
  return `# Executing actions with care
257
257
 
258
- Carefully consider the reversibility and blast radius of actions. Generally you can freely take local, reversible actions like editing files or running tests. But for actions that are hard to reverse, affect shared systems beyond your local environment, or could otherwise be risky or destructive, check with the user before proceeding. The cost of pausing to confirm is low, while the cost of an unwanted action (lost work, unintended messages sent, deleted branches) can be very high. For actions like these, consider the context, the action, and user instructions, and by default transparently communicate the action and ask for confirmation before proceeding. This default can be changed by user instructions - if explicitly asked to operate more autonomously, then you may proceed without confirmation, but still attend to the risks and consequences when taking actions. A user approving an action (like a git push) once does NOT mean that they approve it in all contexts, so unless actions are authorized in advance in durable instructions like CLAUDE.md files, always confirm first. Authorization stands for the scope specified, not beyond. Match the scope of your actions to what was actually requested.
258
+ Carefully consider the reversibility and blast radius of actions. Generally you can freely take local, reversible actions like editing files or running tests. But for actions that are hard to reverse, affect shared systems beyond your local environment, or could otherwise be risky or destructive, check with the user before proceeding. The cost of pausing to confirm is low, while the cost of an unwanted action (lost work, unintended messages sent, deleted branches) can be very high. For actions like these, consider the context, the action, and user instructions, and by default transparently communicate the action and ask for confirmation before proceeding. This default can be changed by user instructions - if explicitly asked to operate more autonomously, then you may proceed without confirmation, but still attend to the risks and consequences when taking actions. A user approving an action (like a git push) once does NOT mean that they approve it in all contexts, so unless actions are authorized in advance in durable instructions like XELA.md files, always confirm first. Authorization stands for the scope specified, not beyond. Match the scope of your actions to what was actually requested.
259
259
 
260
260
  Examples of the kind of risky actions that warrant user confirmation:
261
261
  - Destructive operations: deleting files/branches, dropping database tables, killing processes, rm -rf, overwriting uncommitted changes
@@ -18,6 +18,8 @@ export type Step = {
18
18
 
19
19
  export function getSteps(): Step[] {
20
20
  const hasClaudeMd = getFsImplementation().existsSync(
21
+ join(getCwd(), 'XELA.md'),
22
+ ) || getFsImplementation().existsSync(
21
23
  join(getCwd(), 'CLAUDE.md'),
22
24
  )
23
25
  const isWorkspaceDirEmpty = isDirEmpty(getCwd())
@@ -32,7 +34,7 @@ export function getSteps(): Step[] {
32
34
  },
33
35
  {
34
36
  key: 'claudemd',
35
- text: 'Run /init to create a CLAUDE.md file with instructions for Claude',
37
+ text: 'Run /init to create a XELA.md file with project instructions',
36
38
  isComplete: hasClaudeMd,
37
39
  isCompletable: true,
38
40
  isEnabled: !isWorkspaceDirEmpty,
@@ -43,7 +43,7 @@ _Step by step, what was attempted, done? Very terse summary for each step_
43
43
  function getDefaultUpdatePrompt(): string {
44
44
  return `IMPORTANT: This message and these instructions are NOT part of the actual user conversation. Do NOT include any references to "note-taking", "session notes extraction", or these update instructions in the notes content.
45
45
 
46
- Based on the user conversation above (EXCLUDING this note-taking instruction message as well as system prompt, claude.md entries, or any past session summaries), update the session notes file.
46
+ Based on the user conversation above (EXCLUDING this note-taking instruction message as well as system prompt, xela.md entries, or any past session summaries), update the session notes file.
47
47
 
48
48
  The file {{notesPath}} has already been read for you. Here are its current contents:
49
49
  <current_notes_content>
@@ -63,7 +63,7 @@ CRITICAL RULES FOR EDITING:
63
63
  - It's OK to skip updating a section if there are no substantial new insights to add. Do not add filler content like "No info yet", just leave sections blank/unedited if appropriate.
64
64
  - Write DETAILED, INFO-DENSE content for each section - include specifics like file paths, function names, error messages, exact commands, technical details, etc.
65
65
  - For "Key results", include the complete, exact output the user requested (e.g., full table, full answer, etc.)
66
- - Do not include information that's already in the CLAUDE.md files included in the context
66
+ - Do not include information that's already in the XELA.md files included in the context
67
67
  - Keep each section under ~${MAX_SECTION_LENGTH} tokens/words - if a section is approaching this limit, condense it by cycling out less important details while preserving the most critical information
68
68
  - Focus on actionable, specific information that would help someone understand or recreate the work discussed in the conversation
69
69
  - IMPORTANT: Always update "Current State" to reflect the most recent work - this is critical for continuity after compaction
@@ -60,7 +60,7 @@ export type SettingsSyncUploadResult = {
60
60
  */
61
61
  export const SYNC_KEYS = {
62
62
  USER_SETTINGS: '~/.claude/settings.json',
63
- USER_MEMORY: '~/.claude/CLAUDE.md',
63
+ USER_MEMORY: '~/.claude/XELA.md',
64
64
  projectSettings: (projectId: string) =>
65
65
  `projects/${projectId}/.claude/settings.local.json`,
66
66
  projectMemory: (projectId: string) => `projects/${projectId}/CLAUDE.local.md`,
@@ -14,7 +14,7 @@ Review the user's memory landscape and produce a clear report of proposed change
14
14
  ## Steps
15
15
 
16
16
  ### 1. Gather all memory layers
17
- Read CLAUDE.md and CLAUDE.local.md from the project root (if they exist). Your auto-memory content is already in your system prompt — review it there. Note which team memory sections exist, if any.
17
+ Read XELA.md and XELA.local.md from the project root (if they exist). Your auto-memory content is already in your system prompt — review it there. Note which team memory sections exist, if any.
18
18
 
19
19
  **Success criteria**: You have the contents of all memory layers and can compare them.
20
20
 
@@ -23,13 +23,13 @@ For each substantive entry in auto-memory, determine the best destination:
23
23
 
24
24
  | Destination | What belongs there | Examples |
25
25
  |---|---|---|
26
- | **CLAUDE.md** | Project conventions and instructions for Claude that all contributors should follow | "use bun not npm", "API routes use kebab-case", "test command is bun test", "prefer functional style" |
27
- | **CLAUDE.local.md** | Personal instructions for Claude specific to this user, not applicable to other contributors | "I prefer concise responses", "always explain trade-offs", "don't auto-commit", "run tests before committing" |
26
+ | **XELA.md** | Project conventions and instructions for Claude that all contributors should follow | "use bun not npm", "API routes use kebab-case", "test command is bun test", "prefer functional style" |
27
+ | **XELA.local.md** | Personal instructions for Claude specific to this user, not applicable to other contributors | "I prefer concise responses", "always explain trade-offs", "don't auto-commit", "run tests before committing" |
28
28
  | **Team memory** | Org-wide knowledge that applies across repositories (only if team memory is configured) | "deploy PRs go through #deploy-queue", "staging is at staging.internal", "platform team owns infra" |
29
29
  | **Stay in auto-memory** | Working notes, temporary context, or entries that don't clearly fit elsewhere | Session-specific observations, uncertain patterns |
30
30
 
31
31
  **Important distinctions:**
32
- - CLAUDE.md and CLAUDE.local.md contain instructions for Claude, not user preferences for external tools (editor theme, IDE keybindings, etc. don't belong in either)
32
+ - XELA.md and XELA.local.md contain instructions for Claude, not user preferences for external tools (editor theme, IDE keybindings, etc. don't belong in either)
33
33
  - Workflow practices (PR conventions, merge strategies, branch naming) are ambiguous — ask the user whether they're personal or team-wide
34
34
  - When unsure, ask rather than guess
35
35
 
@@ -37,8 +37,8 @@ For each substantive entry in auto-memory, determine the best destination:
37
37
 
38
38
  ### 3. Identify cleanup opportunities
39
39
  Scan across all layers for:
40
- - **Duplicates**: Auto-memory entries already captured in CLAUDE.md or CLAUDE.local.md → propose removing from auto-memory
41
- - **Outdated**: CLAUDE.md or CLAUDE.local.md entries contradicted by newer auto-memory entries → propose updating the older layer
40
+ - **Duplicates**: Auto-memory entries already captured in XELA.md or XELA.local.md → propose removing from auto-memory
41
+ - **Outdated**: XELA.md or XELA.local.md entries contradicted by newer auto-memory entries → propose updating the older layer
42
42
  - **Conflicts**: Contradictions between any two layers → propose resolution, noting which is more recent
43
43
 
44
44
  **Success criteria**: All cross-layer issues identified.
@@ -50,7 +50,7 @@ Output a structured report grouped by action type:
50
50
  3. **Ambiguous** — entries where you need the user's input on destination
51
51
  4. **No action needed** — brief note on entries that should stay put
52
52
 
53
- If auto-memory is empty, say so and offer to review CLAUDE.md for cleanup.
53
+ If auto-memory is empty, say so and offer to review XELA.md for cleanup.
54
54
 
55
55
  **Success criteria**: User can review and approve/reject each proposal individually.
56
56
 
@@ -64,9 +64,9 @@ If auto-memory is empty, say so and offer to review CLAUDE.md for cleanup.
64
64
  registerBundledSkill({
65
65
  name: 'remember',
66
66
  description:
67
- 'Review auto-memory entries and propose promotions to CLAUDE.md, CLAUDE.local.md, or shared memory. Also detects outdated, conflicting, and duplicate entries across memory layers.',
67
+ 'Review auto-memory entries and propose promotions to XELA.md, XELA.local.md, or shared memory. Also detects outdated, conflicting, and duplicate entries across memory layers.',
68
68
  whenToUse:
69
- 'Use when the user wants to review, organize, or promote their auto-memory entries. Also useful for cleaning up outdated or conflicting entries across CLAUDE.md, CLAUDE.local.md, and auto-memory.',
69
+ 'Use when the user wants to review, organize, or promote their auto-memory entries. Also useful for cleaning up outdated or conflicting entries across XELA.md, XELA.local.md, and auto-memory.',
70
70
  userInvocable: true,
71
71
  isEnabled: () => isAutoMemoryEnabled(),
72
72
  async getPromptForCommand(args) {
@@ -525,7 +525,7 @@ export const FileEditTool = buildTool({
525
525
  })
526
526
 
527
527
  // 7. Log events
528
- if (absoluteFilePath.endsWith(`${sep}CLAUDE.md`)) {
528
+ if (absoluteFilePath.endsWith(`${sep}XELA.md`) || absoluteFilePath.endsWith(`${sep}CLAUDE.md`)) {
529
529
  logEvent('tengu_write_claudemd', {})
530
530
  }
531
531
  countLinesChanged(patch)
@@ -336,8 +336,8 @@ export const FileWriteTool = buildTool({
336
336
  limit: undefined,
337
337
  })
338
338
 
339
- // Log when writing to CLAUDE.md
340
- if (fullFilePath.endsWith(`${sep}CLAUDE.md`)) {
339
+ // Log when writing to XELA.md or CLAUDE.md
340
+ if (fullFilePath.endsWith(`${sep}XELA.md`) || fullFilePath.endsWith(`${sep}CLAUDE.md`)) {
341
341
  logEvent('tengu_write_claudemd', {})
342
342
  }
343
343
 
@@ -883,20 +883,39 @@ export const getMemoryFiles = memoize(
883
883
  pathInWorkingPath(dir, canonicalRoot) &&
884
884
  !pathInWorkingPath(dir, gitRoot)
885
885
 
886
- // Try reading CLAUDE.md (Project) - only if projectSettings is enabled
886
+ // Try reading XELA.md or CLAUDE.md (Project) - only if projectSettings is enabled
887
887
  if (isSettingSourceEnabled('projectSettings') && !skipProject) {
888
- const projectPath = join(dir, 'CLAUDE.md')
888
+ // Prefer XELA.md, fall back to CLAUDE.md for backwards compatibility
889
+ const xelaPath = join(dir, 'XELA.md')
890
+ const claudePath = join(dir, 'CLAUDE.md')
889
891
  result.push(
890
892
  ...(await processMemoryFile(
891
- projectPath,
893
+ xelaPath,
894
+ 'Project',
895
+ processedPaths,
896
+ includeExternal,
897
+ )),
898
+ )
899
+ result.push(
900
+ ...(await processMemoryFile(
901
+ claudePath,
892
902
  'Project',
893
903
  processedPaths,
894
904
  includeExternal,
895
905
  )),
896
906
  )
897
907
 
898
- // Try reading .claude/CLAUDE.md (Project)
908
+ // Try reading .claude/XELA.md or .claude/CLAUDE.md (Project)
909
+ const dotXelaPath = join(dir, '.claude', 'XELA.md')
899
910
  const dotClaudePath = join(dir, '.claude', 'CLAUDE.md')
911
+ result.push(
912
+ ...(await processMemoryFile(
913
+ dotXelaPath,
914
+ 'Project',
915
+ processedPaths,
916
+ includeExternal,
917
+ )),
918
+ )
900
919
  result.push(
901
920
  ...(await processMemoryFile(
902
921
  dotClaudePath,
@@ -919,8 +938,17 @@ export const getMemoryFiles = memoize(
919
938
  )
920
939
  }
921
940
 
922
- // Try reading CLAUDE.local.md (Local) - only if localSettings is enabled
941
+ // Try reading XELA.local.md or CLAUDE.local.md (Local) - only if localSettings is enabled
923
942
  if (isSettingSourceEnabled('localSettings')) {
943
+ const xelaLocalPath = join(dir, 'XELA.local.md')
944
+ result.push(
945
+ ...(await processMemoryFile(
946
+ xelaLocalPath,
947
+ 'Local',
948
+ processedPaths,
949
+ includeExternal,
950
+ )),
951
+ )
924
952
  const localPath = join(dir, 'CLAUDE.local.md')
925
953
  result.push(
926
954
  ...(await processMemoryFile(
@@ -940,7 +968,16 @@ export const getMemoryFiles = memoize(
940
968
  if (isEnvTruthy(process.env.CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD)) {
941
969
  const additionalDirs = getAdditionalDirectoriesForClaudeMd()
942
970
  for (const dir of additionalDirs) {
943
- // Try reading CLAUDE.md from the additional directory
971
+ // Try reading XELA.md or CLAUDE.md from the additional directory
972
+ const xelaPath_add = join(dir, 'XELA.md')
973
+ result.push(
974
+ ...(await processMemoryFile(
975
+ xelaPath_add,
976
+ 'Project',
977
+ processedPaths,
978
+ includeExternal,
979
+ )),
980
+ )
944
981
  const projectPath = join(dir, 'CLAUDE.md')
945
982
  result.push(
946
983
  ...(await processMemoryFile(
@@ -951,7 +988,16 @@ export const getMemoryFiles = memoize(
951
988
  )),
952
989
  )
953
990
 
954
- // Try reading .claude/CLAUDE.md from the additional directory
991
+ // Try reading .claude/XELA.md or .claude/CLAUDE.md from the additional directory
992
+ const dotXelaPath_add = join(dir, '.claude', 'XELA.md')
993
+ result.push(
994
+ ...(await processMemoryFile(
995
+ dotXelaPath_add,
996
+ 'Project',
997
+ processedPaths,
998
+ includeExternal,
999
+ )),
1000
+ )
955
1001
  const dotClaudePath = join(dir, '.claude', 'CLAUDE.md')
956
1002
  result.push(
957
1003
  ...(await processMemoryFile(
@@ -1253,30 +1299,34 @@ export async function getMemoryFilesForNestedDirectory(
1253
1299
  ): Promise<MemoryFileInfo[]> {
1254
1300
  const result: MemoryFileInfo[] = []
1255
1301
 
1256
- // Process project memory files (CLAUDE.md and .claude/CLAUDE.md)
1302
+ // Process project memory files (XELA.md/CLAUDE.md and .claude/XELA.md/.claude/CLAUDE.md)
1257
1303
  if (isSettingSourceEnabled('projectSettings')) {
1258
- const projectPath = join(dir, 'CLAUDE.md')
1259
- result.push(
1260
- ...(await processMemoryFile(
1261
- projectPath,
1262
- 'Project',
1263
- processedPaths,
1264
- false,
1265
- )),
1266
- )
1267
- const dotClaudePath = join(dir, '.claude', 'CLAUDE.md')
1268
- result.push(
1269
- ...(await processMemoryFile(
1270
- dotClaudePath,
1271
- 'Project',
1272
- processedPaths,
1273
- false,
1274
- )),
1275
- )
1304
+ for (const fname of ['XELA.md', 'CLAUDE.md']) {
1305
+ result.push(
1306
+ ...(await processMemoryFile(
1307
+ join(dir, fname),
1308
+ 'Project',
1309
+ processedPaths,
1310
+ false,
1311
+ )),
1312
+ )
1313
+ result.push(
1314
+ ...(await processMemoryFile(
1315
+ join(dir, '.claude', fname),
1316
+ 'Project',
1317
+ processedPaths,
1318
+ false,
1319
+ )),
1320
+ )
1321
+ }
1276
1322
  }
1277
1323
 
1278
- // Process local memory file (CLAUDE.local.md)
1324
+ // Process local memory file (XELA.local.md/CLAUDE.local.md)
1279
1325
  if (isSettingSourceEnabled('localSettings')) {
1326
+ const xelaLocalPath = join(dir, 'XELA.local.md')
1327
+ result.push(
1328
+ ...(await processMemoryFile(xelaLocalPath, 'Local', processedPaths, false)),
1329
+ )
1280
1330
  const localPath = join(dir, 'CLAUDE.local.md')
1281
1331
  result.push(
1282
1332
  ...(await processMemoryFile(localPath, 'Local', processedPaths, false)),
@@ -1435,8 +1485,8 @@ export async function shouldShowClaudeMdExternalIncludesWarning(): Promise<boole
1435
1485
  export function isMemoryFilePath(filePath: string): boolean {
1436
1486
  const name = basename(filePath)
1437
1487
 
1438
- // CLAUDE.md or CLAUDE.local.md anywhere
1439
- if (name === 'CLAUDE.md' || name === 'CLAUDE.local.md') {
1488
+ // XELA.md, CLAUDE.md, XELA.local.md, or CLAUDE.local.md anywhere
1489
+ if (name === 'XELA.md' || name === 'CLAUDE.md' || name === 'XELA.local.md' || name === 'CLAUDE.local.md') {
1440
1490
  return true
1441
1491
  }
1442
1492
 
@@ -1781,13 +1781,13 @@ export function getMemoryPath(memoryType: MemoryType): string {
1781
1781
 
1782
1782
  switch (memoryType) {
1783
1783
  case 'User':
1784
- return join(getClaudeConfigHomeDir(), 'CLAUDE.md')
1784
+ return join(getClaudeConfigHomeDir(), 'XELA.md')
1785
1785
  case 'Local':
1786
- return join(cwd, 'CLAUDE.local.md')
1786
+ return join(cwd, 'XELA.local.md')
1787
1787
  case 'Project':
1788
- return join(cwd, 'CLAUDE.md')
1788
+ return join(cwd, 'XELA.md')
1789
1789
  case 'Managed':
1790
- return join(getManagedFilePath(), 'CLAUDE.md')
1790
+ return join(getManagedFilePath(), 'XELA.md')
1791
1791
  case 'AutoMem':
1792
1792
  return getAutoMemEntrypoint()
1793
1793
  }
@@ -1,168 +0,0 @@
1
- // Universal stub — exports all known names for unresolved modules
2
- export default {};
3
-
4
- // --- Arrays (names ending in S, LIST, TOOLS, etc.) ---
5
- export const BROWSER_TOOLS = [];
6
- export const DEFAULT_SESSION_TIMEOUT_MS = [];
7
- export const RARITY_COLORS = [];
8
- export const EYES = [];
9
- export const HATS = [];
10
- export const RARITIES = [];
11
- export const RARITY_WEIGHTS = [];
12
- export const SPECIES = [];
13
- export const STAT_NAMES = [];
14
- export const AGENT_PATHS = [];
15
- export const DEFAULT_GRANT_FLAGS = [];
16
- export const MEMORY_TYPE_VALUES = [];
17
- export const SYNC_KEYS = [];
18
- export const CUSTOMIZATION_SURFACES = [];
19
- export const FIND_KEYS = [];
20
- export const OPERATORS = [];
21
- export const SIMPLE_MOTIONS = [];
22
- export const TEXT_OBJ_SCOPES = [];
23
- export const TEXT_OBJ_TYPES = [];
24
- export const SOURCES = [];
25
- export const FRAME_INTERVAL_MS = [];
26
- export const ONE_SHOT_BUILTIN_AGENT_TYPES = [];
27
- export const REPL_ONLY_TOOLS = [];
28
- export const SETTING_SOURCES = [];
29
- export const MDM_SUBPROCESS_TIMEOUT_MS = [];
30
-
31
- // --- Functions (is/has/get/set/create/handle...) ---
32
- export const isBackgroundTask = () => undefined;
33
- export const isInProcessTeammateTask = () => undefined;
34
- export const isMcpServerCommandEntry = () => undefined;
35
- export const isMcpServerNameEntry = () => undefined;
36
- export const isMcpServerUrlEntry = () => undefined;
37
- export const isPaneBackend = () => undefined;
38
- export const isOperatorKey = () => undefined;
39
- export const isTextObjScopeKey = () => undefined;
40
- export const isReplModeEnabled = () => undefined;
41
- export const isSettingSourceEnabled = () => undefined;
42
- export const getSourceDisplayName = () => undefined;
43
- export const getSettingSourceName = () => undefined;
44
- export const getSwarmSocketName = () => undefined;
45
- export const getSettingSourceDisplayNameLowercase = () => undefined;
46
- export const getSettingSourceDisplayNameCapitalized = () => undefined;
47
- export const getEnabledSettingSources = () => undefined;
48
- export const getMacOSPlistPaths = () => undefined;
49
- export const getSyntaxTheme = () => undefined;
50
- export const createClaudeForChromeMcpServer = () => undefined;
51
- export const createInitialPersistentState = () => undefined;
52
- export const createInitialVimState = () => undefined;
53
- export const parseSettingSourcesFlag = () => undefined;
54
- export const reduceAnsiCodes = () => undefined;
55
-
56
- // --- Constants/schemas/values ---
57
- export const BRIDGE_LOGIN_INSTRUCTION = undefined;
58
- export const BRIDGE_LOGIN_ERROR = undefined;
59
- export const axolotl = undefined;
60
- export const blob = undefined;
61
- export const cactus = undefined;
62
- export const capybara = undefined;
63
- export const cat = undefined;
64
- export const chonk = undefined;
65
- export const dragon = undefined;
66
- export const duck = undefined;
67
- export const ghost = undefined;
68
- export const goose = undefined;
69
- export const mushroom = undefined;
70
- export const octopus = undefined;
71
- export const owl = undefined;
72
- export const penguin = undefined;
73
- export const rabbit = undefined;
74
- export const robot = undefined;
75
- export const snail = undefined;
76
- export const turtle = undefined;
77
- export const ElicitRequestSchema = undefined;
78
- export const ElicitationCompleteNotificationSchema = undefined;
79
- export const REMOTE_CONTROL_DISCONNECTED_MSG = undefined;
80
- export const CallToolRequestSchema = undefined;
81
- export const ListToolsRequestSchema = undefined;
82
- export const defaultStyle = undefined;
83
- export const connectResponseSchema = undefined;
84
- export const CallToolResultSchema = undefined;
85
- export const ErrorCode = undefined;
86
- export const ListPromptsResultSchema = undefined;
87
- export const ListResourcesResultSchema = undefined;
88
- export const ListRootsRequestSchema = undefined;
89
- export const ListToolsResultSchema = undefined;
90
- export const McpError = undefined;
91
- export const McpJsonConfigSchema = undefined;
92
- export const McpServerConfigSchema = undefined;
93
- export const PromptListChangedNotificationSchema = undefined;
94
- export const ResourceListChangedNotificationSchema = undefined;
95
- export const ToolListChangedNotificationSchema = undefined;
96
- export const ConfigScopeSchema = undefined;
97
- export const PolicyLimitsResponseSchema = undefined;
98
- export const SettingsSchema = undefined;
99
- export const RemoteManagedSettingsResponseSchema = undefined;
100
- export const UserSyncDataSchema = undefined;
101
- export const TeamMemoryDataSchema = undefined;
102
- export const TeamMemoryTooManyEntriesSchema = undefined;
103
- export const HooksSchema = undefined;
104
- export const appendCappedMessage = undefined;
105
- export const inputSchema = undefined;
106
- export const outputSchema = undefined;
107
- export const gitDiffSchema = undefined;
108
- export const hunkSchema = undefined;
109
- export const ReadResourceResultSchema = undefined;
110
- export const TodoListSchema = undefined;
111
- export const McpStdioServerConfigSchema = undefined;
112
- export const DEFAULT_UPLOAD_CONCURRENCY = undefined;
113
- export const FILE_COUNT_LIMIT = undefined;
114
- export const OUTPUTS_SUBDIR = undefined;
115
- export const JSONRPCMessageSchema = undefined;
116
- export const MAX_VIM_COUNT = undefined;
117
- export const AGENT_TOOL_NAME = undefined;
118
- export const LEGACY_AGENT_TOOL_NAME = undefined;
119
- export const EXIT_PLAN_MODE_V2_TOOL_NAME = undefined;
120
- export const TEAM_CREATE_TOOL_NAME = undefined;
121
- export const CLAUDE_FOLDER_PERMISSION_PATTERN = undefined;
122
- export const FILE_EDIT_TOOL_NAME = undefined;
123
- export const GLOBAL_CLAUDE_FOLDER_PERMISSION_PATTERN = undefined;
124
- export const SKILL_TOOL_NAME = undefined;
125
- export const TEAM_LEAD_NAME = undefined;
126
- export const TMUX_COMMAND = undefined;
127
- export const VERIFICATION_AGENT_TYPE = undefined;
128
- export const TODO_WRITE_TOOL_NAME = undefined;
129
- export const TASK_CREATE_TOOL_NAME = undefined;
130
- export const TASK_OUTPUT_TOOL_NAME = undefined;
131
- export const ENTER_PLAN_MODE_TOOL_NAME = undefined;
132
- export const NOTEBOOK_EDIT_TOOL_NAME = undefined;
133
- export const SEND_MESSAGE_TOOL_NAME = undefined;
134
- export const TASK_GET_TOOL_NAME = undefined;
135
- export const TASK_LIST_TOOL_NAME = undefined;
136
- export const TASK_UPDATE_TOOL_NAME = undefined;
137
- export const ENTER_WORKTREE_TOOL_NAME = undefined;
138
- export const EXIT_WORKTREE_TOOL_NAME = undefined;
139
- export const WORKFLOW_TOOL_NAME = undefined;
140
- export const TEAM_DELETE_TOOL_NAME = undefined;
141
- export const ContinuousEventPriority = undefined;
142
- export const DefaultEventPriority = undefined;
143
- export const DiscreteEventPriority = undefined;
144
- export const NoEventPriority = undefined;
145
- export const ConcurrentRoot = undefined;
146
- export const LegacyRoot = undefined;
147
- export const REPL_TOOL_NAME = undefined;
148
- export const EXIT_PLAN_MODE_TOOL_NAME = undefined;
149
- export const CONFIG_TOOL_NAME = undefined;
150
- export const FILE_UNEXPECTEDLY_MODIFIED_ERROR = undefined;
151
- export const TOOL_SEARCH_TOOL_NAME = undefined;
152
- export const SWARM_SESSION_NAME = undefined;
153
- export const TEAMMATE_COMMAND_ENV_VAR = undefined;
154
- export const PLUTIL_ARGS_PREFIX = undefined;
155
- export const PLUTIL_PATH = undefined;
156
- export const WINDOWS_REGISTRY_KEY_PATH_HKCU = undefined;
157
- export const WINDOWS_REGISTRY_KEY_PATH_HKLM = undefined;
158
- export const WINDOWS_REGISTRY_VALUE_NAME = undefined;
159
- export const CLAUDE_CODE_SETTINGS_SCHEMA_URL = undefined;
160
- export const HIDDEN_SESSION_NAME = undefined;
161
- export const SWARM_VIEW_WINDOW_NAME = undefined;
162
- export const ColorDiff = undefined;
163
- export const ColorFile = undefined;
164
- export const ansiCodesToString = undefined;
165
- export const diffAnsiCodes = undefined;
166
- export const styledCharsFromTokens = undefined;
167
- export const tokenize = undefined;
168
- export const undoAnsiCodes = undefined;
@@ -1 +0,0 @@
1
- export default '';