@funnycode/myclaude 0.1.305 → 0.1.307

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.zh-CN.md CHANGED
@@ -1,321 +1,321 @@
1
- # 🎭 myclaude
2
-
3
- > **你的终端 AI 编程搭档——更聪明地写代码,更快地交付。**
4
-
5
- ```bash
6
- npx @funnycode/myclaude
7
- ```
8
-
9
- [![npm](https://img.shields.io/npm/v/@funnycode/myclaude)](https://www.npmjs.com/package/@funnycode/myclaude)
10
- [![License](https://img.shields.io/npm/l/@funnycode/myclaude)](LICENSE)
11
-
12
- ---
13
-
14
- ## ✨ myclaude 的独特之处
15
-
16
- | | 功能 | 为什么你会爱上它 |
17
- |---|------|----------------|
18
- | 🐾 | **BUDDY 伙伴** | 终端电子宠物,随编码成长。孵化、喂食、玩耍。18 个物种、传说稀有度、闪光变异。 |
19
- | 🏆 | **成就系统** | 20+ 成就,连续使用打卡、里程碑解锁——编码之旅的游戏化体验。 |
20
- | 🎯 | **前端 TDD** | `/frontend-tdd` — 内置 Red-Green-Refactor 工作流,前端测试驱动开发。 |
21
- | 🧪 | **Agentic TDD** | `/agentic-tdd` — 面向任意代码库的自主测试驱动开发循环。 |
22
- | 🌊 | **Git Flow** | `/new-feature`、`/finish-release`、`/new-hotfix` — 完整的 Git Flow 斜杠命令。 |
23
- | 🤖 | **ECC 内置** | 启动时自动注册 76+ 命令和 246+ 技能,零配置开箱即用。 |
24
- | 🧠 | **AI 对话** | 编写、重构、调试、解释代码。多模型支持(Anthropic、Bedrock、Vertex、Foundry)。 |
25
- | 🎙️ | **语音模式** | `/voice` — 语音输入,解放双手编码。 |
26
- | 🌐 | **浏览器自动化** | 网页搜索、抓取与浏览器自动化,实时获取信息。 |
27
- | 🖥️ | **开发服务器** | `/dev-server` — 启动本地开发服务器并实时预览。 |
28
- | 🎨 | **精美 TUI** | React Ink 终端界面,支持主题切换、Vim 模式、语法高亮。 |
29
- | 🔌 | **插件 & MCP** | 通过插件、MCP 服务器、自定义技能无限扩展。 |
30
-
31
- ---
32
-
33
- ## 🚀 10 秒快速开始
34
-
35
- ```bash
36
- # 设置 API 密钥
37
- export ANTHROPIC_API_KEY=sk-ant-...
38
-
39
- # 立即运行(无需安装)
40
- npx @funnycode/myclaude
41
-
42
- # 或全局安装
43
- npm install -g @funnycode/myclaude
44
- myclaude
45
- ```
46
-
47
- **环境要求:** Bun ≥ 1.3.5(或 Node.js ≥ 22.17)· Git
48
-
49
- ---
50
-
51
- ## 🎮 斜杠命令一览
52
-
53
- ### 📍 核心
54
- | 命令 | 功能 |
55
- |------|------|
56
- | `/help` | 帮助 |
57
- | `/config` | 配置设置 |
58
- | `/doctor` | 诊断与验证 |
59
- | `/model` | 切换 AI 模型 |
60
- | `/effort` | 设置努力级别 |
61
-
62
- ### 🧪 测试与质量
63
- | 命令 | 功能 |
64
- |------|------|
65
- | **`/frontend-tdd <描述>`** | **前端 TDD 红绿重构循环** |
66
- | **`/agentic-tdd <描述>`** | **面向任意代码库的自主 TDD 循环** |
67
- | `/review` | 代码审查 |
68
- | `/security-review` | 安全专项代码审查 |
69
- | `/plan` | 创建实施计划 |
70
-
71
- ### 🌊 Git Flow
72
- | 命令 | 功能 |
73
- |------|------|
74
- | `/new-feature <name> [来源]` | 从 `main` 创建功能分支 |
75
- | `/finish-feature [目标]` | 合并功能到 `main` |
76
- | `/new-release <version> [来源]` | 创建发布分支 |
77
- | `/finish-release` | 合并发布到 `main` & `develop` |
78
- | `/new-hotfix <name> [来源]` | 创建热修复分支 |
79
- | `/finish-hotfix` | 合并热修复到 `main` & `develop` |
80
- | `/commit` | 生成 Git 提交信息 |
81
-
82
- ### 🐾 伙伴 & 成就
83
- | 命令 | 功能 |
84
- |------|------|
85
- | `/buddy hatch` | 孵化伙伴 |
86
- | `/buddy pet` | 抚摸伙伴(+5 XP ❤️) |
87
- | `/buddy feed` | 喂食伙伴(+15 XP) |
88
- | `/buddy play` | 与伙伴玩耍(+20 XP) |
89
- | `/buddy card` | 查看属性与里程碑 |
90
- | `/achievements` | 查看成就进度 |
91
-
92
- ### 🔌 集成
93
- | 命令 | 功能 |
94
- |------|------|
95
- | `/mcp` | 管理 MCP 服务器 |
96
- | `/plugin` | 安装管理插件 |
97
- | `/hooks` | 管理钩子 |
98
- | `/skills` | 查看可用技能 |
99
- | `/codegraph` | 语义代码智能(自动检测) |
100
-
101
- ### 🎙️ 语音与开发
102
- | 命令 | 功能 |
103
- |------|------|
104
- | `/voice` | 切换语音输入模式(解放双手编码) |
105
- | `/dev-server` | 启动本地开发服务器并实时预览 |
106
-
107
- ### ⚙️ 系统
108
- | 命令 | 功能 |
109
- |------|------|
110
- | `/status` | 会话与认证状态 |
111
- | `/vim` | 切换 Vim 模式 |
112
- | `/theme` | 切换 UI 主题 |
113
- | `/keybindings` | 自定义快捷键 |
114
- | `/memory` | 管理 AI 记忆 |
115
- | `/feedback` | 提交反馈 |
116
-
117
- ---
118
-
119
- ## 🐾 BUDDY — 你的终端宠物
120
-
121
- myclaude 有一个生活在终端里的 **电子宠物**。它根据你的用户 ID **确定性生成**——每一只都独一无二。
122
-
123
- ### 18 个物种
124
-
125
- 🦆 鸭子 · 🪿 鹅 · 🫧 果冻 · 🐱 猫 · 🐉 龙 · 🐙 章鱼 · 🦉 猫头鹰
126
- 🐧 企鹅 · 🐢 乌龟 · 🐌 蜗牛 · 👻 幽灵 · 🦎 六角恐龙 · 🦫 水豚
127
- 🌵 仙人掌 · 🤖 机器人 · 🐰 兔子 · 🍄 蘑菇 · 🐈 胖猫
128
-
129
- ### 稀有度与属性
130
-
131
- | 稀有度 | 概率 | 星级 |
132
- |--------|------|------|
133
- | 普通 | 60% | ★ |
134
- | 非凡 | 25% | ★★ |
135
- | 稀有 | 10% | ★★★ |
136
- | 史诗 | 4% | ★★★★ |
137
- | 传说 | **1%** | ★★★★★ |
138
- | ✨ 闪光 | **1%**(独立概率)| 闪闪发光! |
139
-
140
- 每只伙伴有 5 项属性:`DEBUGGING`(调试)、`PATIENCE`(耐心)、`CHAOS`(混乱)、`WISDOM`(智慧)、`SNARK`(毒舌)。通过互动获得经验值,最高 50 级,**进化**为全新形态。
141
-
142
- ---
143
-
144
- ## 🎯 前端 TDD
145
-
146
- ```bash
147
- /frontend-tdd 实现一个带邮箱验证的用户登录表单
148
- ```
149
-
150
- 这个命令引导 AI 遵循 **红-绿-重构** 循环进行前端测试驱动开发:
151
-
152
- 🔴 **红** → 先写一个会失败的测试
153
- 🟢 **绿** → 编写最少代码让测试通过
154
- 🔵 **重构** → 优化代码,保持测试绿色
155
-
156
- 内置前端测试最佳实践:Testing Library 行为查询、`user-event` 替代 `fireEvent`、异步 `waitFor`/`findBy*`、MSW API 模拟、无障碍优先选择器。
157
-
158
- ---
159
-
160
- ## 🌊 Git Flow 工作流
161
-
162
- ```bash
163
- /new-feature user-auth # feature/user-auth 从 main 创建
164
- /new-feature api-rate-limit develop # feature/api-rate-limit 从 develop 创建
165
- /finish-feature # 合并到 main
166
- /finish-feature develop # 合并到 develop
167
- /new-release 1.2.0 # release/1.2.0 从 main 创建
168
- /new-hotfix security-patch # hotfix/security-patch 从 main 创建
169
- /finish-hotfix # 合并到 main & develop
170
- ```
171
-
172
- 所有命令默认以 `main` 为基准,支持可选的 `[来源]` 或 `[目标]` 参数。
173
-
174
- ---
175
-
176
- ## 🔌 内置集成
177
-
178
- ### CodeGraph — 语义代码智能
179
- 自动检测 `codegraph` CLI 并注册为内置插件,提供精确的代码上下文。
180
-
181
- ```bash
182
- npm i -g @colbymchenry/codegraph
183
- cd your-project
184
- codegraph init
185
- /plugin enable codegraph
186
- ```
187
-
188
- ### ECC — 跨平台代理操作系统
189
- **76+ 命令和 246+ 技能**在启动时自动加载——无需安装、无需配置。直接敲 `/` 即可用。
190
-
191
- ---
192
-
193
- ## ⚙️ 环境变量
194
-
195
- 支持 `MYCLAUDE_*` 或 `CLAUDE_CODE_*`(后者优先级更高)。
196
-
197
- | 关键变量 | 说明 |
198
- |---------|------|
199
- | `ANTHROPIC_API_KEY` / `MYCLAUDE_API_KEY` | API 密钥(必填) |
200
- | `ANTHROPIC_BASE_URL` | 自定义 API 地址 |
201
- | `MYCLAUDE_MODEL` | 覆盖模型 |
202
- | `MYCLAUDE_SIMPLE` | 简洁模式(无 TUI) |
203
- | `MYCLAUDE_DISABLE_THINKING` | 禁用扩展思考 |
204
- | `MYCLAUDE_USE_BEDROCK` | AWS Bedrock 提供商 |
205
- | `MYCLAUDE_USE_VERTEX` | Google Vertex AI 提供商 |
206
- | `MYCLAUDE_USE_FOUNDRY` | Microsoft Foundry 提供商 |
207
- | `MYCLAUDE_SYNTAX_HIGHLIGHT` | 语法高亮主题 |
208
- | `MYCLAUDE_IDLE_THRESHOLD_MINUTES` | 空闲超时(默认 75 分钟) |
209
- | `MYCLAUDE_EFFORT_LEVEL` | 努力级别 |
210
-
211
- ---
212
-
213
- ## 🔧 自定义模型
214
-
215
- myclaude 支持接入第三方模型(兼容 Anthropic API 格式的任意提供商)或本地模型。
216
-
217
- ### 基本配置
218
-
219
- | 环境变量 | 说明 | 示例 |
220
- |---------|------|------|
221
- | `ANTHROPIC_BASE_URL` | 自定义 API 端点地址 | `https://your-api.example.com` |
222
- | `MYCLAUDE_MODEL` / `CLAUDE_CODE_MODEL` | 指定模型名称 | `claude-sonnet-4-20250514`、`gemini-2.5-pro` |
223
-
224
- > 支持 `MYCLAUDE_*` 或 `CLAUDE_CODE_*` 两种前缀,后者优先级更高,完全兼容 Claude Code 的环境变量命名。
225
-
226
- ### 常见场景示例
227
-
228
- **使用代理/中转 API:**
229
- ```bash
230
- export ANTHROPIC_BASE_URL=https://your-proxy.com/v1
231
- export ANTHROPIC_API_KEY=your-proxy-key
232
- export MYCLAUDE_MODEL=claude-sonnet-4-20250514
233
- npx @funnycode/myclaude
234
- ```
235
-
236
- **使用 Ollama 本地模型(通过兼容层):**
237
- ```bash
238
- # 先启动 Ollama 并拉取模型
239
- # ollama pull llama3.2
240
-
241
- # 使用 llm-cluster 或 litellm 等工具提供 Anthropic 兼容接口
242
- export ANTHROPIC_BASE_URL=http://localhost:8000/v1
243
- export ANTHROPIC_API_KEY=sk-local
244
- export MYCLAUDE_MODEL=llama3.2
245
- npx @funnycode/myclaude
246
- ```
247
-
248
- **使用 Google Vertex AI:**
249
- ```bash
250
- export MYCLAUDE_USE_VERTEX=true
251
- export CLOUD_ML_REGION=us-central1
252
- gcloud auth application-default login
253
- npx @funnycode/myclaude
254
- ```
255
-
256
- **使用 AWS Bedrock:**
257
- ```bash
258
- export MYCLAUDE_USE_BEDROCK=true
259
- export AWS_REGION=us-east-1
260
- # AWS 凭证通过环境变量或 ~/.aws/credentials 配置
261
- npx @funnycode/myclaude
262
- ```
263
-
264
- **使用 Microsoft Foundry:**
265
- ```bash
266
- export MYCLAUDE_USE_FOUNDRY=true
267
- export AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
268
- export AZURE_OPENAI_API_KEY=your-azure-key
269
- npx @funnycode/myclaude
270
- ```
271
-
272
- > 💡 运行时也可通过 `/model` 命令在支持的模型之间快速切换。
273
-
274
- ---
275
-
276
- ## 🛠 开发
277
-
278
- ```bash
279
- git clone https://github.com/thomaslwq/myclaude.git
280
- cd myclaude
281
- bun install
282
- bun run dev # 开发模式
283
- bun run build # 构建到 dist/myclaude.mjs
284
- bun run version # 验证 CLI 启动
285
- ```
286
-
287
- ### 目录结构
288
-
289
- ```
290
- src/
291
- ├── achievements/ # 成就系统
292
- ├── buddy/ # BUDDY 伙伴(精灵图、进化)
293
- ├── commands/ # 所有斜杠命令
294
- ├── components/ # React Ink UI
295
- ├── events/ # 日历与节日彩蛋
296
- ├── services/ # API、MCP、分析
297
- ├── tools/ # 工具实现
298
- ├── utils/ # 共享工具函数
299
- ├── entrypoints/ # CLI 入口
300
- └── main.tsx # TUI 主入口
301
- ```
302
-
303
- ---
304
-
305
- ## 🤝 贡献
306
-
307
- 欢迎 PR!Fork → 创建分支 → 保持聚焦 → 测试 → 提交 PR。
308
-
309
- ---
310
-
311
- ## 📎 相关链接
312
-
313
- - **GitHub**: [github.com/thomaslwq/myclaude](https://github.com/thomaslwq/myclaude)
314
- - **Gitee**: [gitee.com/thomaslwq/myclaude](https://gitee.com/thomaslwq/myclaude)
315
- - **npm**: [npmjs.com/package/@funnycode/myclaude](https://www.npmjs.com/package/@funnycode/myclaude)
316
-
317
- ---
318
-
319
- ## 📄 许可证
320
-
321
- MIT
1
+ # 🎭 myclaude
2
+
3
+ > **你的终端 AI 编程搭档——更聪明地写代码,更快地交付。**
4
+
5
+ ```bash
6
+ npx @funnycode/myclaude
7
+ ```
8
+
9
+ [![npm](https://img.shields.io/npm/v/@funnycode/myclaude)](https://www.npmjs.com/package/@funnycode/myclaude)
10
+ [![License](https://img.shields.io/npm/l/@funnycode/myclaude)](LICENSE)
11
+
12
+ ---
13
+
14
+ ## ✨ myclaude 的独特之处
15
+
16
+ | | 功能 | 为什么你会爱上它 |
17
+ |---|------|----------------|
18
+ | 🐾 | **BUDDY 伙伴** | 终端电子宠物,随编码成长。孵化、喂食、玩耍。18 个物种、传说稀有度、闪光变异。 |
19
+ | 🏆 | **成就系统** | 20+ 成就,连续使用打卡、里程碑解锁——编码之旅的游戏化体验。 |
20
+ | 🎯 | **前端 TDD** | `/frontend-tdd` — 内置 Red-Green-Refactor 工作流,前端测试驱动开发。 |
21
+ | 🧪 | **Agentic TDD** | `/agentic-tdd` — 面向任意代码库的自主测试驱动开发循环。 |
22
+ | 🌊 | **Git Flow** | `/new-feature`、`/finish-release`、`/new-hotfix` — 完整的 Git Flow 斜杠命令。 |
23
+ | 🤖 | **ECC 内置** | 启动时自动注册 76+ 命令和 246+ 技能,零配置开箱即用。 |
24
+ | 🧠 | **AI 对话** | 编写、重构、调试、解释代码。多模型支持(Anthropic、Bedrock、Vertex、Foundry)。 |
25
+ | 🎙️ | **语音模式** | `/voice` — 语音输入,解放双手编码。 |
26
+ | 🌐 | **浏览器自动化** | 网页搜索、抓取与浏览器自动化,实时获取信息。 |
27
+ | 🖥️ | **开发服务器** | `/dev-server` — 启动本地开发服务器并实时预览。 |
28
+ | 🎨 | **精美 TUI** | React Ink 终端界面,支持主题切换、Vim 模式、语法高亮。 |
29
+ | 🔌 | **插件 & MCP** | 通过插件、MCP 服务器、自定义技能无限扩展。 |
30
+
31
+ ---
32
+
33
+ ## 🚀 10 秒快速开始
34
+
35
+ ```bash
36
+ # 设置 API 密钥
37
+ export ANTHROPIC_API_KEY=sk-ant-...
38
+
39
+ # 立即运行(无需安装)
40
+ npx @funnycode/myclaude
41
+
42
+ # 或全局安装
43
+ npm install -g @funnycode/myclaude
44
+ myclaude
45
+ ```
46
+
47
+ **环境要求:** Bun ≥ 1.3.5(或 Node.js ≥ 22.17)· Git
48
+
49
+ ---
50
+
51
+ ## 🎮 斜杠命令一览
52
+
53
+ ### 📍 核心
54
+ | 命令 | 功能 |
55
+ |------|------|
56
+ | `/help` | 帮助 |
57
+ | `/config` | 配置设置 |
58
+ | `/doctor` | 诊断与验证 |
59
+ | `/model` | 切换 AI 模型 |
60
+ | `/effort` | 设置努力级别 |
61
+
62
+ ### 🧪 测试与质量
63
+ | 命令 | 功能 |
64
+ |------|------|
65
+ | **`/frontend-tdd <描述>`** | **前端 TDD 红绿重构循环** |
66
+ | **`/agentic-tdd <描述>`** | **面向任意代码库的自主 TDD 循环** |
67
+ | `/review` | 代码审查 |
68
+ | `/security-review` | 安全专项代码审查 |
69
+ | `/plan` | 创建实施计划 |
70
+
71
+ ### 🌊 Git Flow
72
+ | 命令 | 功能 |
73
+ |------|------|
74
+ | `/new-feature <name> [来源]` | 从 `main` 创建功能分支 |
75
+ | `/finish-feature [目标]` | 合并功能到 `main` |
76
+ | `/new-release <version> [来源]` | 创建发布分支 |
77
+ | `/finish-release` | 合并发布到 `main` & `develop` |
78
+ | `/new-hotfix <name> [来源]` | 创建热修复分支 |
79
+ | `/finish-hotfix` | 合并热修复到 `main` & `develop` |
80
+ | `/commit` | 生成 Git 提交信息 |
81
+
82
+ ### 🐾 伙伴 & 成就
83
+ | 命令 | 功能 |
84
+ |------|------|
85
+ | `/buddy hatch` | 孵化伙伴 |
86
+ | `/buddy pet` | 抚摸伙伴(+5 XP ❤️) |
87
+ | `/buddy feed` | 喂食伙伴(+15 XP) |
88
+ | `/buddy play` | 与伙伴玩耍(+20 XP) |
89
+ | `/buddy card` | 查看属性与里程碑 |
90
+ | `/achievements` | 查看成就进度 |
91
+
92
+ ### 🔌 集成
93
+ | 命令 | 功能 |
94
+ |------|------|
95
+ | `/mcp` | 管理 MCP 服务器 |
96
+ | `/plugin` | 安装管理插件 |
97
+ | `/hooks` | 管理钩子 |
98
+ | `/skills` | 查看可用技能 |
99
+ | `/codegraph` | 语义代码智能(自动检测) |
100
+
101
+ ### 🎙️ 语音与开发
102
+ | 命令 | 功能 |
103
+ |------|------|
104
+ | `/voice` | 切换语音输入模式(解放双手编码) |
105
+ | `/dev-server` | 启动本地开发服务器并实时预览 |
106
+
107
+ ### ⚙️ 系统
108
+ | 命令 | 功能 |
109
+ |------|------|
110
+ | `/status` | 会话与认证状态 |
111
+ | `/vim` | 切换 Vim 模式 |
112
+ | `/theme` | 切换 UI 主题 |
113
+ | `/keybindings` | 自定义快捷键 |
114
+ | `/memory` | 管理 AI 记忆 |
115
+ | `/feedback` | 提交反馈 |
116
+
117
+ ---
118
+
119
+ ## 🐾 BUDDY — 你的终端宠物
120
+
121
+ myclaude 有一个生活在终端里的 **电子宠物**。它根据你的用户 ID **确定性生成**——每一只都独一无二。
122
+
123
+ ### 18 个物种
124
+
125
+ 🦆 鸭子 · 🪿 鹅 · 🫧 果冻 · 🐱 猫 · 🐉 龙 · 🐙 章鱼 · 🦉 猫头鹰
126
+ 🐧 企鹅 · 🐢 乌龟 · 🐌 蜗牛 · 👻 幽灵 · 🦎 六角恐龙 · 🦫 水豚
127
+ 🌵 仙人掌 · 🤖 机器人 · 🐰 兔子 · 🍄 蘑菇 · 🐈 胖猫
128
+
129
+ ### 稀有度与属性
130
+
131
+ | 稀有度 | 概率 | 星级 |
132
+ |--------|------|------|
133
+ | 普通 | 60% | ★ |
134
+ | 非凡 | 25% | ★★ |
135
+ | 稀有 | 10% | ★★★ |
136
+ | 史诗 | 4% | ★★★★ |
137
+ | 传说 | **1%** | ★★★★★ |
138
+ | ✨ 闪光 | **1%**(独立概率)| 闪闪发光! |
139
+
140
+ 每只伙伴有 5 项属性:`DEBUGGING`(调试)、`PATIENCE`(耐心)、`CHAOS`(混乱)、`WISDOM`(智慧)、`SNARK`(毒舌)。通过互动获得经验值,最高 50 级,**进化**为全新形态。
141
+
142
+ ---
143
+
144
+ ## 🎯 前端 TDD
145
+
146
+ ```bash
147
+ /frontend-tdd 实现一个带邮箱验证的用户登录表单
148
+ ```
149
+
150
+ 这个命令引导 AI 遵循 **红-绿-重构** 循环进行前端测试驱动开发:
151
+
152
+ 🔴 **红** → 先写一个会失败的测试
153
+ 🟢 **绿** → 编写最少代码让测试通过
154
+ 🔵 **重构** → 优化代码,保持测试绿色
155
+
156
+ 内置前端测试最佳实践:Testing Library 行为查询、`user-event` 替代 `fireEvent`、异步 `waitFor`/`findBy*`、MSW API 模拟、无障碍优先选择器。
157
+
158
+ ---
159
+
160
+ ## 🌊 Git Flow 工作流
161
+
162
+ ```bash
163
+ /new-feature user-auth # feature/user-auth 从 main 创建
164
+ /new-feature api-rate-limit develop # feature/api-rate-limit 从 develop 创建
165
+ /finish-feature # 合并到 main
166
+ /finish-feature develop # 合并到 develop
167
+ /new-release 1.2.0 # release/1.2.0 从 main 创建
168
+ /new-hotfix security-patch # hotfix/security-patch 从 main 创建
169
+ /finish-hotfix # 合并到 main & develop
170
+ ```
171
+
172
+ 所有命令默认以 `main` 为基准,支持可选的 `[来源]` 或 `[目标]` 参数。
173
+
174
+ ---
175
+
176
+ ## 🔌 内置集成
177
+
178
+ ### CodeGraph — 语义代码智能
179
+ 自动检测 `codegraph` CLI 并注册为内置插件,提供精确的代码上下文。
180
+
181
+ ```bash
182
+ npm i -g @colbymchenry/codegraph
183
+ cd your-project
184
+ codegraph init
185
+ /plugin enable codegraph
186
+ ```
187
+
188
+ ### ECC — 跨平台代理操作系统
189
+ **76+ 命令和 246+ 技能**在启动时自动加载——无需安装、无需配置。直接敲 `/` 即可用。
190
+
191
+ ---
192
+
193
+ ## ⚙️ 环境变量
194
+
195
+ 支持 `MYCLAUDE_*` 或 `CLAUDE_CODE_*`(后者优先级更高)。
196
+
197
+ | 关键变量 | 说明 |
198
+ |---------|------|
199
+ | `ANTHROPIC_API_KEY` / `MYCLAUDE_API_KEY` | API 密钥(必填) |
200
+ | `ANTHROPIC_BASE_URL` | 自定义 API 地址 |
201
+ | `MYCLAUDE_MODEL` | 覆盖模型 |
202
+ | `MYCLAUDE_SIMPLE` | 简洁模式(无 TUI) |
203
+ | `MYCLAUDE_DISABLE_THINKING` | 禁用扩展思考 |
204
+ | `MYCLAUDE_USE_BEDROCK` | AWS Bedrock 提供商 |
205
+ | `MYCLAUDE_USE_VERTEX` | Google Vertex AI 提供商 |
206
+ | `MYCLAUDE_USE_FOUNDRY` | Microsoft Foundry 提供商 |
207
+ | `MYCLAUDE_SYNTAX_HIGHLIGHT` | 语法高亮主题 |
208
+ | `MYCLAUDE_IDLE_THRESHOLD_MINUTES` | 空闲超时(默认 75 分钟) |
209
+ | `MYCLAUDE_EFFORT_LEVEL` | 努力级别 |
210
+
211
+ ---
212
+
213
+ ## 🔧 自定义模型
214
+
215
+ myclaude 支持接入第三方模型(兼容 Anthropic API 格式的任意提供商)或本地模型。
216
+
217
+ ### 基本配置
218
+
219
+ | 环境变量 | 说明 | 示例 |
220
+ |---------|------|------|
221
+ | `ANTHROPIC_BASE_URL` | 自定义 API 端点地址 | `https://your-api.example.com` |
222
+ | `MYCLAUDE_MODEL` / `CLAUDE_CODE_MODEL` | 指定模型名称 | `claude-sonnet-4-20250514`、`gemini-2.5-pro` |
223
+
224
+ > 支持 `MYCLAUDE_*` 或 `CLAUDE_CODE_*` 两种前缀,后者优先级更高,完全兼容 Claude Code 的环境变量命名。
225
+
226
+ ### 常见场景示例
227
+
228
+ **使用代理/中转 API:**
229
+ ```bash
230
+ export ANTHROPIC_BASE_URL=https://your-proxy.com/v1
231
+ export ANTHROPIC_API_KEY=your-proxy-key
232
+ export MYCLAUDE_MODEL=claude-sonnet-4-20250514
233
+ npx @funnycode/myclaude
234
+ ```
235
+
236
+ **使用 Ollama 本地模型(通过兼容层):**
237
+ ```bash
238
+ # 先启动 Ollama 并拉取模型
239
+ # ollama pull llama3.2
240
+
241
+ # 使用 llm-cluster 或 litellm 等工具提供 Anthropic 兼容接口
242
+ export ANTHROPIC_BASE_URL=http://localhost:8000/v1
243
+ export ANTHROPIC_API_KEY=sk-local
244
+ export MYCLAUDE_MODEL=llama3.2
245
+ npx @funnycode/myclaude
246
+ ```
247
+
248
+ **使用 Google Vertex AI:**
249
+ ```bash
250
+ export MYCLAUDE_USE_VERTEX=true
251
+ export CLOUD_ML_REGION=us-central1
252
+ gcloud auth application-default login
253
+ npx @funnycode/myclaude
254
+ ```
255
+
256
+ **使用 AWS Bedrock:**
257
+ ```bash
258
+ export MYCLAUDE_USE_BEDROCK=true
259
+ export AWS_REGION=us-east-1
260
+ # AWS 凭证通过环境变量或 ~/.aws/credentials 配置
261
+ npx @funnycode/myclaude
262
+ ```
263
+
264
+ **使用 Microsoft Foundry:**
265
+ ```bash
266
+ export MYCLAUDE_USE_FOUNDRY=true
267
+ export AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
268
+ export AZURE_OPENAI_API_KEY=your-azure-key
269
+ npx @funnycode/myclaude
270
+ ```
271
+
272
+ > 💡 运行时也可通过 `/model` 命令在支持的模型之间快速切换。
273
+
274
+ ---
275
+
276
+ ## 🛠 开发
277
+
278
+ ```bash
279
+ git clone https://github.com/thomaslwq/myclaude.git
280
+ cd myclaude
281
+ bun install
282
+ bun run dev # 开发模式
283
+ bun run build # 构建到 dist/myclaude.mjs
284
+ bun run version # 验证 CLI 启动
285
+ ```
286
+
287
+ ### 目录结构
288
+
289
+ ```
290
+ src/
291
+ ├── achievements/ # 成就系统
292
+ ├── buddy/ # BUDDY 伙伴(精灵图、进化)
293
+ ├── commands/ # 所有斜杠命令
294
+ ├── components/ # React Ink UI
295
+ ├── events/ # 日历与节日彩蛋
296
+ ├── services/ # API、MCP、分析
297
+ ├── tools/ # 工具实现
298
+ ├── utils/ # 共享工具函数
299
+ ├── entrypoints/ # CLI 入口
300
+ └── main.tsx # TUI 主入口
301
+ ```
302
+
303
+ ---
304
+
305
+ ## 🤝 贡献
306
+
307
+ 欢迎 PR!Fork → 创建分支 → 保持聚焦 → 测试 → 提交 PR。
308
+
309
+ ---
310
+
311
+ ## 📎 相关链接
312
+
313
+ - **GitHub**: [github.com/thomaslwq/myclaude](https://github.com/thomaslwq/myclaude)
314
+ - **Gitee**: [gitee.com/thomaslwq/myclaude](https://gitee.com/thomaslwq/myclaude)
315
+ - **npm**: [npmjs.com/package/@funnycode/myclaude](https://www.npmjs.com/package/@funnycode/myclaude)
316
+
317
+ ---
318
+
319
+ ## 📄 许可证
320
+
321
+ MIT
package/dist/myclaude.js CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.305",
8
- BUILD_TIME: "2026-09-03T06:41:04.794Z",
7
+ VERSION: "0.1.307",
8
+ BUILD_TIME: "2026-09-04T17:37:17.738Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -120027,7 +120027,7 @@ var package_default;
120027
120027
  var init_package = __esm(() => {
120028
120028
  package_default = {
120029
120029
  name: "@funnycode/myclaude",
120030
- version: "0.1.305",
120030
+ version: "0.1.307",
120031
120031
  private: false,
120032
120032
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
120033
120033
  license: "MIT",
@@ -344994,7 +344994,7 @@ class DiagnosticTrackingService {
344994
344994
  static instance;
344995
344995
  baseline = new Map;
344996
344996
  initialized = false;
344997
- mcpClient;
344997
+ clients = [];
344998
344998
  lastProcessedTimestamps = new Map;
344999
344999
  rightFileDiagnosticsState = new Map;
345000
345000
  static getInstance() {
@@ -345003,15 +345003,19 @@ class DiagnosticTrackingService {
345003
345003
  }
345004
345004
  return DiagnosticTrackingService.instance;
345005
345005
  }
345006
+ getIdeClient() {
345007
+ return getConnectedIdeClient(this.clients);
345008
+ }
345006
345009
  initialize(mcpClient) {
345007
345010
  if (this.initialized) {
345008
345011
  return;
345009
345012
  }
345010
- this.mcpClient = mcpClient;
345013
+ this.clients = [mcpClient];
345011
345014
  this.initialized = true;
345012
345015
  }
345013
345016
  async shutdown() {
345014
345017
  this.initialized = false;
345018
+ this.clients = [];
345015
345019
  this.baseline.clear();
345016
345020
  this.rightFileDiagnosticsState.clear();
345017
345021
  this.lastProcessedTimestamps.clear();
@@ -345037,7 +345041,8 @@ class DiagnosticTrackingService {
345037
345041
  return normalizePathForComparison(normalized);
345038
345042
  }
345039
345043
  async ensureFileOpened(fileUri) {
345040
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345044
+ const ideClient = this.getIdeClient();
345045
+ if (!this.initialized || !ideClient) {
345041
345046
  return;
345042
345047
  }
345043
345048
  try {
@@ -345048,18 +345053,19 @@ class DiagnosticTrackingService {
345048
345053
  endText: "",
345049
345054
  selectToEndOfLine: false,
345050
345055
  makeFrontmost: false
345051
- }, this.mcpClient);
345056
+ }, ideClient);
345052
345057
  } catch (error52) {
345053
345058
  logError2(error52);
345054
345059
  }
345055
345060
  }
345056
345061
  async beforeFileEdited(filePath) {
345057
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345062
+ const ideClient = this.getIdeClient();
345063
+ if (!this.initialized || !ideClient) {
345058
345064
  return;
345059
345065
  }
345060
345066
  const timestamp = Date.now();
345061
345067
  try {
345062
- const result = await callIdeRpc("getDiagnostics", { uri: `file://${filePath}` }, this.mcpClient);
345068
+ const result = await callIdeRpc("getDiagnostics", { uri: `file://${filePath}` }, ideClient);
345063
345069
  const diagnosticFile = this.parseDiagnosticResult(result)[0];
345064
345070
  if (diagnosticFile) {
345065
345071
  if (!pathsEqual(this.normalizeFileUri(filePath), this.normalizeFileUri(diagnosticFile.uri))) {
@@ -345077,12 +345083,13 @@ class DiagnosticTrackingService {
345077
345083
  } catch (_error) {}
345078
345084
  }
345079
345085
  async getNewDiagnostics() {
345080
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345086
+ const ideClient = this.getIdeClient();
345087
+ if (!this.initialized || !ideClient) {
345081
345088
  return [];
345082
345089
  }
345083
345090
  let allDiagnosticFiles = [];
345084
345091
  try {
345085
- const result = await callIdeRpc("getDiagnostics", {}, this.mcpClient);
345092
+ const result = await callIdeRpc("getDiagnostics", {}, ideClient);
345086
345093
  allDiagnosticFiles = this.parseDiagnosticResult(result);
345087
345094
  } catch (_error) {
345088
345095
  return [];
@@ -345135,10 +345142,10 @@ class DiagnosticTrackingService {
345135
345142
  return a2.every((diagA) => b3.some((diagB) => this.areDiagnosticsEqual(diagA, diagB))) && b3.every((diagB) => a2.some((diagA) => this.areDiagnosticsEqual(diagA, diagB)));
345136
345143
  }
345137
345144
  async handleQueryStart(clients) {
345145
+ this.clients = clients;
345138
345146
  if (!this.initialized) {
345139
- const connectedIdeClient = getConnectedIdeClient(clients);
345140
- if (connectedIdeClient) {
345141
- this.initialize(connectedIdeClient);
345147
+ if (getConnectedIdeClient(clients)) {
345148
+ this.initialized = true;
345142
345149
  }
345143
345150
  } else {
345144
345151
  this.reset();
package/dist/myclaude.mjs CHANGED
@@ -4,8 +4,8 @@
4
4
  // MACRO - build-time constants (injected by build.ts)
5
5
  // MACRO injected by build script
6
6
  globalThis.MACRO = {
7
- VERSION: "0.1.305",
8
- BUILD_TIME: "2026-09-03T06:41:04.794Z",
7
+ VERSION: "0.1.307",
8
+ BUILD_TIME: "2026-09-04T17:37:17.738Z",
9
9
  PACKAGE_URL: "@funnycode/myclaude",
10
10
  NATIVE_PACKAGE_URL: "@funnycode/myclaude",
11
11
  VERSION_CHANGELOG: '',
@@ -120027,7 +120027,7 @@ var package_default;
120027
120027
  var init_package = __esm(() => {
120028
120028
  package_default = {
120029
120029
  name: "@funnycode/myclaude",
120030
- version: "0.1.305",
120030
+ version: "0.1.307",
120031
120031
  private: false,
120032
120032
  description: "An open-source AI coding assistant in your terminal - powered by Claude",
120033
120033
  license: "MIT",
@@ -344994,7 +344994,7 @@ class DiagnosticTrackingService {
344994
344994
  static instance;
344995
344995
  baseline = new Map;
344996
344996
  initialized = false;
344997
- mcpClient;
344997
+ clients = [];
344998
344998
  lastProcessedTimestamps = new Map;
344999
344999
  rightFileDiagnosticsState = new Map;
345000
345000
  static getInstance() {
@@ -345003,15 +345003,19 @@ class DiagnosticTrackingService {
345003
345003
  }
345004
345004
  return DiagnosticTrackingService.instance;
345005
345005
  }
345006
+ getIdeClient() {
345007
+ return getConnectedIdeClient(this.clients);
345008
+ }
345006
345009
  initialize(mcpClient) {
345007
345010
  if (this.initialized) {
345008
345011
  return;
345009
345012
  }
345010
- this.mcpClient = mcpClient;
345013
+ this.clients = [mcpClient];
345011
345014
  this.initialized = true;
345012
345015
  }
345013
345016
  async shutdown() {
345014
345017
  this.initialized = false;
345018
+ this.clients = [];
345015
345019
  this.baseline.clear();
345016
345020
  this.rightFileDiagnosticsState.clear();
345017
345021
  this.lastProcessedTimestamps.clear();
@@ -345037,7 +345041,8 @@ class DiagnosticTrackingService {
345037
345041
  return normalizePathForComparison(normalized);
345038
345042
  }
345039
345043
  async ensureFileOpened(fileUri) {
345040
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345044
+ const ideClient = this.getIdeClient();
345045
+ if (!this.initialized || !ideClient) {
345041
345046
  return;
345042
345047
  }
345043
345048
  try {
@@ -345048,18 +345053,19 @@ class DiagnosticTrackingService {
345048
345053
  endText: "",
345049
345054
  selectToEndOfLine: false,
345050
345055
  makeFrontmost: false
345051
- }, this.mcpClient);
345056
+ }, ideClient);
345052
345057
  } catch (error52) {
345053
345058
  logError2(error52);
345054
345059
  }
345055
345060
  }
345056
345061
  async beforeFileEdited(filePath) {
345057
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345062
+ const ideClient = this.getIdeClient();
345063
+ if (!this.initialized || !ideClient) {
345058
345064
  return;
345059
345065
  }
345060
345066
  const timestamp = Date.now();
345061
345067
  try {
345062
- const result = await callIdeRpc("getDiagnostics", { uri: `file://${filePath}` }, this.mcpClient);
345068
+ const result = await callIdeRpc("getDiagnostics", { uri: `file://${filePath}` }, ideClient);
345063
345069
  const diagnosticFile = this.parseDiagnosticResult(result)[0];
345064
345070
  if (diagnosticFile) {
345065
345071
  if (!pathsEqual(this.normalizeFileUri(filePath), this.normalizeFileUri(diagnosticFile.uri))) {
@@ -345077,12 +345083,13 @@ class DiagnosticTrackingService {
345077
345083
  } catch (_error) {}
345078
345084
  }
345079
345085
  async getNewDiagnostics() {
345080
- if (!this.initialized || !this.mcpClient || this.mcpClient.type !== "connected") {
345086
+ const ideClient = this.getIdeClient();
345087
+ if (!this.initialized || !ideClient) {
345081
345088
  return [];
345082
345089
  }
345083
345090
  let allDiagnosticFiles = [];
345084
345091
  try {
345085
- const result = await callIdeRpc("getDiagnostics", {}, this.mcpClient);
345092
+ const result = await callIdeRpc("getDiagnostics", {}, ideClient);
345086
345093
  allDiagnosticFiles = this.parseDiagnosticResult(result);
345087
345094
  } catch (_error) {
345088
345095
  return [];
@@ -345135,10 +345142,10 @@ class DiagnosticTrackingService {
345135
345142
  return a2.every((diagA) => b3.some((diagB) => this.areDiagnosticsEqual(diagA, diagB))) && b3.every((diagB) => a2.some((diagA) => this.areDiagnosticsEqual(diagA, diagB)));
345136
345143
  }
345137
345144
  async handleQueryStart(clients) {
345145
+ this.clients = clients;
345138
345146
  if (!this.initialized) {
345139
- const connectedIdeClient = getConnectedIdeClient(clients);
345140
- if (connectedIdeClient) {
345141
- this.initialize(connectedIdeClient);
345147
+ if (getConnectedIdeClient(clients)) {
345148
+ this.initialized = true;
345142
345149
  }
345143
345150
  } else {
345144
345151
  this.reset();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funnycode/myclaude",
3
- "version": "0.1.305",
3
+ "version": "0.1.307",
4
4
  "private": false,
5
5
  "description": "An open-source AI coding assistant in your terminal - powered by Claude",
6
6
  "license": "MIT",