@bysking/b-code 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/cli.mjs +483 -0
- package/package.json +62 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 bysking
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# B Code (bcode)
|
|
2
|
+
|
|
3
|
+
一个从零构建的编码 Agent CLI —— 你自己的 Claude Code。
|
|
4
|
+
|
|
5
|
+
在终端里用自然语言下达任务:读代码、改文件、跑命令、写计划,全程可见工具调用与权限审批。
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm i -g @bysking/b-code # 全局安装
|
|
9
|
+
# 或
|
|
10
|
+
npx -y @bysking/b-code # 免安装直接使用
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# 从 npm 全局安装(推荐)
|
|
17
|
+
npm i -g @bysking/b-code
|
|
18
|
+
|
|
19
|
+
# 或从本仓库安装(需要先构建,见「开发」)
|
|
20
|
+
npm run build && npm i -g .
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
安装后得到 `bcode` 命令。开发模式直接运行:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm run dev # 相当于 tsx src/index.ts
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 快速开始
|
|
30
|
+
|
|
31
|
+
**One-shot(执行一条指令后退出):**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
bcode "Read the README and summarize what this project does"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**REPL(交互式多轮对话,每轮自动保存):**
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
bcode
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## 命令行参数
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
| 参数 | 说明 |
|
|
47
|
+
| ------------------------------ | ----------------------------------------------------- |
|
|
48
|
+
| `bcode "指令"` | One-shot:执行单条指令后保存退出(可含权限确认) |
|
|
49
|
+
| `bcode` | REPL:交互式多轮对话 |
|
|
50
|
+
| `bcode --resume` | REPL 并恢复上次会话 |
|
|
51
|
+
| `bcode --session <id>` | 恢复指定会话(配合`--resume`) |
|
|
52
|
+
| `bcode --plan "指令"` | Plan 模式:写 / 编辑 / shell 全部拦截,只读规划 |
|
|
53
|
+
| `bcode --yolo "指令"` | Bypass 模式:跳过 confirm(危险命令 deny 仍拦得住) |
|
|
54
|
+
| `bcode --auto "指令"` | Auto 模式:用分类器代替确认框 |
|
|
55
|
+
| `bcode --goal <条件> "指令"` | Auto 追目标:无人值守循环,直到条件达成 |
|
|
56
|
+
| `bcode --loop <秒> "指令"` | 定时重投:每隔 N 秒重复执行指令(Ctrl-C 停止) |
|
|
57
|
+
|
|
58
|
+
退出时会打印恢复命令,例如:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
想恢复本次会话,执行:
|
|
62
|
+
bcode --resume --session <id>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 交互界面(TTY)
|
|
66
|
+
|
|
67
|
+
TTY 下使用 Ink 渲染:思考过程、工具调用块、Markdown 回复、权限确认、斜杠菜单均为声明式 UI。
|
|
68
|
+
|
|
69
|
+
**斜杠命令(输入 `/` 可唤起补全菜单):**
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
| 命令 | 说明 |
|
|
73
|
+
| -------------------- | ---------------------------------------------- |
|
|
74
|
+
| `/clear` | 清空当前对话历史(并重置"本轮自动审批"标记) |
|
|
75
|
+
| `/plan` | 切换 Plan(只读)模式 |
|
|
76
|
+
| `/yolo` | 切换 Bypass 模式 |
|
|
77
|
+
| `/default` | 切换回默认模式 |
|
|
78
|
+
| `/skills` | 列出可用技能 |
|
|
79
|
+
| `/remember <事实>` | 保存一条长期记忆 |
|
|
80
|
+
| `exit` / `quit` | 退出 |
|
|
81
|
+
|
|
82
|
+
**快捷键:**
|
|
83
|
+
|
|
84
|
+
- `Esc`:软中断当前对话(可继续输入新指令)
|
|
85
|
+
|
|
86
|
+
非 TTY(管道 / CI / 脚本)下自动退化为 readline 交互,语义保持一致;权限确认只消费 `y/n` 行。
|
|
87
|
+
|
|
88
|
+
## 权限与模式
|
|
89
|
+
|
|
90
|
+
四种模式:`default` / `plan` / `bypass` / `auto`。
|
|
91
|
+
|
|
92
|
+
权限判定三态:**allow(放行)/ deny(拦截)/ confirm(询问)**,遵循三个原则:
|
|
93
|
+
|
|
94
|
+
1. **deny 优先** —— 危险命令在任何模式(含 `--yolo`)下都拦得住;
|
|
95
|
+
2. **fail-closed** —— 未声明模式的工具默认 confirm,不默认放行;
|
|
96
|
+
3. **plan 只读由权限层强制** —— 不靠提示词"求"模型别动。
|
|
97
|
+
|
|
98
|
+
以下危险命令直接 deny(连 `--yolo` 也绕不过):
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
rm -rf / git push / git reset --hard / sudo / mkfs
|
|
102
|
+
> /dev/ 设备写入 / dd / kill / reboot / shutdown
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 技能(Skills)
|
|
106
|
+
|
|
107
|
+
把常用提示词包装成 `/name 参数` 命令。技能文件 = frontmatter + 正文:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+
---
|
|
111
|
+
name: commit
|
|
112
|
+
description: 用规范格式提交代码
|
|
113
|
+
user-invocable: true
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
按以下规范提交:$ARGUMENTS
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
正文里的 `$ARGUMENTS` 会被替换为调用时传入的参数。技能调用优先于普通对话:
|
|
120
|
+
`/commit 修复登录 bug` → 命中 `commit` 技能并替换参数。
|
|
121
|
+
|
|
122
|
+
**搜索链(越靠前优先级越高,同名技能前者生效):**
|
|
123
|
+
|
|
124
|
+
1. `{cwd}/.claude/skills` —— 项目级
|
|
125
|
+
2. `$B_CODE_SKILLS_DIR` —— 显式覆盖(CI / 多环境)
|
|
126
|
+
3. `$B_CODE_HOME/skills` —— 用户级,随数据根迁移
|
|
127
|
+
4. `~/.claude/skills` —— 兼容既有 Claude 生态的兜底
|
|
128
|
+
|
|
129
|
+
## 记忆(Memory)
|
|
130
|
+
|
|
131
|
+
跨会话长期记忆。模型通过 `save_memory` 工具主动沉淀(经用户确认后落盘),也可以在 REPL 里用 `/remember` 手动保存。
|
|
132
|
+
|
|
133
|
+
- **存储**:`{B_CODE_HOME}/projects/{sha256(cwd)前16位}/memory/*.md`
|
|
134
|
+
- **召回**:关键词重叠打分,纯确定性、不调模型;top3 注入 system prompt 末尾
|
|
135
|
+
- **隔离**:同一目录的工作区各自独立记忆
|
|
136
|
+
|
|
137
|
+
## MCP
|
|
138
|
+
|
|
139
|
+
启动时自动挂载配置的 MCP 服务器(失败仅记日志,不阻塞)。
|
|
140
|
+
|
|
141
|
+
**配置搜索链(env 最高优先,同名 server 后者胜):**
|
|
142
|
+
|
|
143
|
+
1. `$B_CODE_MCP_CONFIG` —— 显式覆盖
|
|
144
|
+
2. `{cwd}/.claude/mcp.json` —— 项目级
|
|
145
|
+
3. `{B_CODE_HOME}/mcp.json` —— 用户级
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{
|
|
149
|
+
"mcpServers": {
|
|
150
|
+
"demo": {
|
|
151
|
+
"mode": "read",
|
|
152
|
+
"command": "node",
|
|
153
|
+
"args": ["/path/to/server.cjs"]
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`mode: "read"` 声明该 server 所有工具按只读放行(免确认);缺省 fail-closed → 需要确认。
|
|
160
|
+
|
|
161
|
+
## 配置
|
|
162
|
+
|
|
163
|
+
### settings.json
|
|
164
|
+
|
|
165
|
+
配置文件位于 `{B_CODE_HOME}/settings.json`(`B_CODE_CONFIG` 可覆盖路径),复制 `settings.example.json` 后按需填写。
|
|
166
|
+
|
|
167
|
+
**合并原则:真实环境变量优先,配置只是缺省值** —— 已 export 的键不会被覆盖。
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
| 字段 | 说明 |
|
|
171
|
+
| ------------ | --------------------------------------------------------- |
|
|
172
|
+
| `provider` | `"anthropic"` 或 `"openai"`(缺省按 endpoint 智能判断) |
|
|
173
|
+
| `apiKey` | 对应 provider 的密钥 |
|
|
174
|
+
| `baseUrl` | 对应 provider 的端点(支持 OpenAI 兼容端点) |
|
|
175
|
+
| `model` | 覆盖默认模型名(等价`B_CODE_MODEL`) |
|
|
176
|
+
| `env` | `{ KEY: value }` 注入环境变量 |
|
|
177
|
+
|
|
178
|
+
### 环境变量
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
| 变量 | 说明 |
|
|
182
|
+
| ------------------------------------------ | ----------------------------------------------- |
|
|
183
|
+
| `B_CODE_HOME` | 数据根目录(必须绝对路径;缺省`~/.b-code`) |
|
|
184
|
+
| `B_CODE_CONFIG` | 配置文件路径覆盖 |
|
|
185
|
+
| `B_CODE_MODEL` | 模型名覆盖 |
|
|
186
|
+
| `B_CODE_MAX_TOKENS` | 单次输出上限 token(缺省 4096) |
|
|
187
|
+
| `B_CODE_THINKING` | 正整数时开启 extended thinking(预算 token) |
|
|
188
|
+
| `B_CODE_HTTP_TIMEOUT` | OpenAI 兼容后端流式空闲超时 ms(缺省 120000) |
|
|
189
|
+
| `B_CODE_SHELL_TIMEOUT` | `run_shell` 命令超时 ms(缺省 30000) |
|
|
190
|
+
| `B_CODE_SKILLS_DIR` | 技能目录覆盖 |
|
|
191
|
+
| `B_CODE_MCP_CONFIG` | MCP 配置文件覆盖 |
|
|
192
|
+
| `B_CODE_LOG_LEVEL` | 日志级别:`debug` / `info` / `warn` / `error` |
|
|
193
|
+
| `B_CODE_LOG_FILE` | `true` 时输出日志到文件 |
|
|
194
|
+
| `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` | 对应 provider 的密钥 |
|
|
195
|
+
| `ANTHROPIC_BASE_URL` / `OPENAI_BASE_URL` | 对应 provider 的端点 |
|
|
196
|
+
|
|
197
|
+
## 数据目录
|
|
198
|
+
|
|
199
|
+
启动时自动创建(对齐 Claude Code 的约定目录):
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
{B_CODE_HOME}/
|
|
203
|
+
├── sessions/ # 会话持久化
|
|
204
|
+
├── logs/ # 调试日志
|
|
205
|
+
├── projects/ # 跨项目记忆(按项目哈希隔离)
|
|
206
|
+
├── skills/ # 用户级技能
|
|
207
|
+
├── plans/ # Plan 文件
|
|
208
|
+
├── session.json # 最近一次会话
|
|
209
|
+
└── mcp.json # 用户级 MCP 配置
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 开发
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
npm install # 安装依赖
|
|
216
|
+
npm run dev # 开发运行(tsx 直跑 TS 源码)
|
|
217
|
+
npm run typecheck # 类型检查
|
|
218
|
+
npm test # 单元测试
|
|
219
|
+
npm run build # esbuild 打包 → dist/cli.mjs(单文件,含全部依赖)
|
|
220
|
+
node dist/cli.mjs # 验证产物
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
发布前 `prepublishOnly` 会自动执行 `npm run build && npm test`。
|
|
224
|
+
|
|
225
|
+
## License
|
|
226
|
+
|
|
227
|
+
MIT
|