codemini-cli 0.1.12 → 0.1.14
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 +58 -0
- package/package.json +1 -1
- package/src/core/agent-loop.js +46 -0
- package/src/core/chat-runtime.js +364 -44
- package/src/core/config-store.js +49 -3
- package/src/core/reply-language.js +25 -0
- package/src/core/shell-profile.js +1 -1
- package/src/core/shell.js +135 -9
- package/src/core/soul.js +3 -1
- package/src/core/tools.js +1284 -10
- package/src/tui/chat-app.js +295 -36
package/README.md
CHANGED
|
@@ -23,6 +23,10 @@ It is designed for teams that want a coding assistant that feels practical, cont
|
|
|
23
23
|
- Windows-aware shell profile with PowerShell-focused defaults
|
|
24
24
|
- Safe mode enabled by default
|
|
25
25
|
- Built-in lite skills for planning, execution, and collaboration
|
|
26
|
+
- Configurable reply language through `ui.reply_language` (`zh` / `en`)
|
|
27
|
+
- Richer slash completion with priority sorting, inline descriptions, and left/right paging
|
|
28
|
+
- Structured code tools for small models: `locate`, `open_target`, `edit_target`
|
|
29
|
+
- More conservative `plan auto` acceptance checks with reviewer/tester goal checklists
|
|
26
30
|
- Tone presets through `soul`, without changing plans or code behavior
|
|
27
31
|
- Sub-agents for planning, coding, review, and testing
|
|
28
32
|
|
|
@@ -32,6 +36,7 @@ It is designed for teams that want a coding assistant that feels practical, cont
|
|
|
32
36
|
codemini config set gateway.base_url http://your-internal-gateway/v1
|
|
33
37
|
codemini config set gateway.api_key your_token
|
|
34
38
|
codemini config set shell.default powershell
|
|
39
|
+
codemini config set ui.reply_language zh
|
|
35
40
|
codemini config set model.name your-30b-model
|
|
36
41
|
codemini doctor
|
|
37
42
|
codemini
|
|
@@ -54,6 +59,30 @@ codemini doctor
|
|
|
54
59
|
codemini skill list|install|enable|disable|inspect|reindex
|
|
55
60
|
```
|
|
56
61
|
|
|
62
|
+
### Notable Workflow Features
|
|
63
|
+
|
|
64
|
+
- `ui.reply_language` controls the assistant reply language at the prompt layer and also nudges generated docs and code comments to match
|
|
65
|
+
- Slash completion now prioritizes important commands and config keys, shows short descriptions, and supports `←/→` page switching
|
|
66
|
+
- `plan auto` now turns the original goal into an acceptance checklist, uses a lighter chain only for truly tiny tasks, and treats unmet checklist items as failure signals
|
|
67
|
+
- Structured code tools reduce shell-noise for small models by preferring `locate -> open_target -> edit_target`
|
|
68
|
+
|
|
69
|
+
### Skill Loading
|
|
70
|
+
|
|
71
|
+
CodeMini CLI loads skills from these locations:
|
|
72
|
+
|
|
73
|
+
- Bundled repo skills: `skills/<name>/SKILL.md`
|
|
74
|
+
- Installed global skills: `<base-config-dir>/skills/<name>/SKILL.md`
|
|
75
|
+
- Project-scoped legacy skills: `.coder/skills/<name>/SKILL.md`
|
|
76
|
+
|
|
77
|
+
The base config directory is resolved in this order:
|
|
78
|
+
|
|
79
|
+
- `CODEMINI_CONFIG_DIR`
|
|
80
|
+
- `COMPANY_CODER_CONFIG_DIR`
|
|
81
|
+
- Windows: `%APPDATA%\\codemini-cli\\`
|
|
82
|
+
- macOS: `~/Library/Preferences/codemini-cli`
|
|
83
|
+
- Linux/XDG: `$XDG_CONFIG_HOME/codemini-cli`
|
|
84
|
+
- Fallback in restricted environments: `.codemini-cli/`
|
|
85
|
+
|
|
57
86
|
### Documentation
|
|
58
87
|
|
|
59
88
|
- Operator guide and common command patterns: [OPERATIONS.md](/mnt/e/Git%20Projects/qurio-coder/OPERATIONS.md)
|
|
@@ -95,6 +124,10 @@ CodeMini CLI 是一个为小模型工作流优化过的代码助手 CLI,重点
|
|
|
95
124
|
- 面向 Windows 的 PowerShell 默认配置
|
|
96
125
|
- safe mode 默认开启
|
|
97
126
|
- 内置 lite skills,覆盖规划、执行和协作
|
|
127
|
+
- 支持通过 `ui.reply_language` 配置回复语言,当前支持 `zh` / `en`
|
|
128
|
+
- slash 补全支持优先级排序、右侧简短说明和左右分页
|
|
129
|
+
- 为小模型补了结构化代码工具:`locate`、`open_target`、`edit_target`
|
|
130
|
+
- `plan auto` 会基于原始目标生成验收清单,并更保守地处理 reviewer/tester 结果
|
|
98
131
|
- `soul` 只影响语气,不影响计划和代码行为
|
|
99
132
|
- 支持 planner、coder、reviewer、tester 多角色 sub-agent
|
|
100
133
|
|
|
@@ -104,6 +137,7 @@ CodeMini CLI 是一个为小模型工作流优化过的代码助手 CLI,重点
|
|
|
104
137
|
codemini config set gateway.base_url http://your-internal-gateway/v1
|
|
105
138
|
codemini config set gateway.api_key your_token
|
|
106
139
|
codemini config set shell.default powershell
|
|
140
|
+
codemini config set ui.reply_language zh
|
|
107
141
|
codemini config set model.name your-30b-model
|
|
108
142
|
codemini doctor
|
|
109
143
|
codemini
|
|
@@ -126,6 +160,30 @@ codemini doctor
|
|
|
126
160
|
codemini skill list|install|enable|disable|inspect|reindex
|
|
127
161
|
```
|
|
128
162
|
|
|
163
|
+
### 近期工作流增强
|
|
164
|
+
|
|
165
|
+
- `ui.reply_language` 通过 prompt 层控制模型回复语言,也会尽量让生成文档和代码注释跟随该语言
|
|
166
|
+
- slash 补全会优先展示更重要的命令和配置项,显示简短说明,并支持 `←/→` 翻页
|
|
167
|
+
- `plan auto` 会先把原始目标展开成验收清单;只有真正很小的任务才会走轻量链路;如果 reviewer 或 tester 标记了未满足或未验证的验收项,就不会按成功处理
|
|
168
|
+
- 为了减少小模型被 shell 原始输出干扰,新增了 `locate -> open_target -> edit_target` 这套结构化代码工具流
|
|
169
|
+
|
|
170
|
+
### Skill 加载位置
|
|
171
|
+
|
|
172
|
+
CodeMini CLI 会从这些位置读取 skill:
|
|
173
|
+
|
|
174
|
+
- 仓库内置 skill:`skills/<name>/SKILL.md`
|
|
175
|
+
- 全局已安装 skill:`<base-config-dir>/skills/<name>/SKILL.md`
|
|
176
|
+
- 项目级旧式 skill:`.coder/skills/<name>/SKILL.md`
|
|
177
|
+
|
|
178
|
+
`base-config-dir` 的解析顺序是:
|
|
179
|
+
|
|
180
|
+
- `CODEMINI_CONFIG_DIR`
|
|
181
|
+
- `COMPANY_CODER_CONFIG_DIR`
|
|
182
|
+
- Windows:`%APPDATA%\\codemini-cli\\`
|
|
183
|
+
- macOS:`~/Library/Preferences/codemini-cli`
|
|
184
|
+
- Linux / XDG:`$XDG_CONFIG_HOME/codemini-cli`
|
|
185
|
+
- 受限环境回退:`.codemini-cli/`
|
|
186
|
+
|
|
129
187
|
### 文档入口
|
|
130
188
|
|
|
131
189
|
- 操作手册与常见命令组合:[OPERATIONS.md](/mnt/e/Git%20Projects/qurio-coder/OPERATIONS.md)
|
package/package.json
CHANGED
package/src/core/agent-loop.js
CHANGED
|
@@ -61,6 +61,24 @@ function summarizeToolResult(result) {
|
|
|
61
61
|
if (stderr) return `${lead}exit ${obj.code ?? 0}\nstderr: ${stderr}`;
|
|
62
62
|
return `${lead}exit ${obj.code ?? 0}`;
|
|
63
63
|
}
|
|
64
|
+
if ('task_id' in obj && 'startup_confirmed' in obj) {
|
|
65
|
+
const status = trimInline(obj.status || 'unknown', 32);
|
|
66
|
+
const taskId = trimInline(obj.task_id || '', 24);
|
|
67
|
+
const source = trimInline(obj.startup_source || '', 24);
|
|
68
|
+
const logs = Array.isArray(obj.recent_logs) ? trimInline(obj.recent_logs.slice(-1)[0] || '', 96) : '';
|
|
69
|
+
return `${taskId || 'service'} ${status}${source ? ` (${source})` : ''}${logs ? `\n${logs}` : ''}`;
|
|
70
|
+
}
|
|
71
|
+
if ('services' in obj && Array.isArray(obj.services)) {
|
|
72
|
+
const count = obj.services.length;
|
|
73
|
+
const first = obj.services[0];
|
|
74
|
+
const lead = first?.task_id ? `${trimInline(first.task_id, 24)} ${trimInline(first.status || 'unknown', 24)}` : '';
|
|
75
|
+
return `services(${count})${lead ? `\n${lead}` : ''}`;
|
|
76
|
+
}
|
|
77
|
+
if ('task_id' in obj && 'recent_logs' in obj) {
|
|
78
|
+
const taskId = trimInline(obj.task_id || '', 24);
|
|
79
|
+
const logs = Array.isArray(obj.recent_logs) ? trimInline(obj.recent_logs.slice(-1)[0] || '', 96) : '';
|
|
80
|
+
return `${taskId || 'service logs'}${logs ? `\n${logs}` : ''}`;
|
|
81
|
+
}
|
|
64
82
|
if ('created' in obj && Array.isArray(obj.created)) {
|
|
65
83
|
return `created ${obj.created.length} task(s)`;
|
|
66
84
|
}
|
|
@@ -96,6 +114,34 @@ function formatToolDisplayName(name, args) {
|
|
|
96
114
|
const command = trimInline(args?.command || '', 96);
|
|
97
115
|
return command ? `${name}(${command})` : name;
|
|
98
116
|
}
|
|
117
|
+
if (name === 'start_service') {
|
|
118
|
+
const command = trimInline(args?.command || args?.cmd || '', 96);
|
|
119
|
+
return command ? `${name}(${command})` : name;
|
|
120
|
+
}
|
|
121
|
+
if (name === 'list_services') {
|
|
122
|
+
return name;
|
|
123
|
+
}
|
|
124
|
+
if (name === 'get_service_status' || name === 'get_service_logs' || name === 'stop_service') {
|
|
125
|
+
const taskId = trimInline(args?.task_id || args?.taskId || '', 96);
|
|
126
|
+
return taskId ? `${name}(${taskId})` : name;
|
|
127
|
+
}
|
|
128
|
+
if (
|
|
129
|
+
name === 'locate' ||
|
|
130
|
+
name === 'open_target' ||
|
|
131
|
+
name === 'edit_target' ||
|
|
132
|
+
name === 'search_code' ||
|
|
133
|
+
name === 'read_block' ||
|
|
134
|
+
name === 'read_symbol_context' ||
|
|
135
|
+
name === 'validate_edit' ||
|
|
136
|
+
name === 'replace_block' ||
|
|
137
|
+
name === 'replace_text' ||
|
|
138
|
+
name === 'insert_before' ||
|
|
139
|
+
name === 'insert_after' ||
|
|
140
|
+
name === 'generate_diff'
|
|
141
|
+
) {
|
|
142
|
+
const target = trimInline(args?.path || args?.query || args?.symbol || '', 96);
|
|
143
|
+
return target ? `${name}(${target})` : name;
|
|
144
|
+
}
|
|
99
145
|
return name;
|
|
100
146
|
}
|
|
101
147
|
|