jinzd-ai-cli 0.2.12 → 0.2.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 +44 -0
- package/README.zh-CN.md +44 -0
- package/dist/{chunk-GGAA3JRD.js → chunk-EVOOSNVZ.js} +1 -1
- package/dist/{chunk-IGZDXYIX.js → chunk-S6ZN53TH.js} +1 -1
- package/dist/index.js +42 -9
- package/dist/{run-tests-R2BHDFGB.js → run-tests-Y6KJ7XIU.js} +1 -1
- package/dist/{server-Z3UV3EZB.js → server-QEAEWP4S.js} +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -237,6 +237,50 @@ Configuration is stored at `~/.aicli/config.json`. Run `aicli config` for the in
|
|
|
237
237
|
}
|
|
238
238
|
```
|
|
239
239
|
|
|
240
|
+
### Permission Rules
|
|
241
|
+
|
|
242
|
+
Control when tools require confirmation. Rules are checked in order — first match wins:
|
|
243
|
+
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"permissionRules": [
|
|
247
|
+
{ "tool": "read_file", "action": "auto-approve" },
|
|
248
|
+
{ "tool": "list_dir", "action": "auto-approve" },
|
|
249
|
+
{ "tool": "grep_files", "action": "auto-approve" },
|
|
250
|
+
{ "tool": "glob_files", "action": "auto-approve" },
|
|
251
|
+
{ "tool": "write_todos", "action": "auto-approve" },
|
|
252
|
+
{ "tool": "bash", "action": "auto-approve", "when": { "dangerLevel": "safe" } },
|
|
253
|
+
{ "tool": "write_file", "action": "auto-approve", "when": { "pathPattern": "src/" } },
|
|
254
|
+
{ "tool": "bash", "action": "deny", "when": { "pathPattern": "rm -rf" } },
|
|
255
|
+
{ "tool": "*", "action": "confirm" }
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
| Field | Description |
|
|
261
|
+
|-------|-------------|
|
|
262
|
+
| `tool` | Tool name, or `*` for all tools |
|
|
263
|
+
| `action` | `auto-approve` (skip confirmation), `deny` (block), `confirm` (ask user) |
|
|
264
|
+
| `when.dangerLevel` | Only match when danger level is `safe`, `write`, or `destructive` |
|
|
265
|
+
| `when.pathPattern` | Substring match against tool's `path` or `command` argument |
|
|
266
|
+
|
|
267
|
+
**Recommended minimal config** — auto-approve all read-only tools to reduce y/N prompts:
|
|
268
|
+
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"permissionRules": [
|
|
272
|
+
{ "tool": "read_file", "action": "auto-approve" },
|
|
273
|
+
{ "tool": "list_dir", "action": "auto-approve" },
|
|
274
|
+
{ "tool": "grep_files", "action": "auto-approve" },
|
|
275
|
+
{ "tool": "glob_files", "action": "auto-approve" },
|
|
276
|
+
{ "tool": "web_fetch", "action": "auto-approve" },
|
|
277
|
+
{ "tool": "write_todos", "action": "auto-approve" },
|
|
278
|
+
{ "tool": "ask_user", "action": "auto-approve" },
|
|
279
|
+
{ "tool": "run_tests", "action": "auto-approve" }
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
240
284
|
### Environment Variables
|
|
241
285
|
|
|
242
286
|
Environment variables take precedence over config file values:
|
package/README.zh-CN.md
CHANGED
|
@@ -252,6 +252,50 @@ aicli
|
|
|
252
252
|
HTTPS_PROXY=http://127.0.0.1:10809 aicli
|
|
253
253
|
```
|
|
254
254
|
|
|
255
|
+
### 权限规则(Permission Rules)
|
|
256
|
+
|
|
257
|
+
控制工具何时需要用户确认。规则按顺序匹配,第一条命中的生效:
|
|
258
|
+
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"permissionRules": [
|
|
262
|
+
{ "tool": "read_file", "action": "auto-approve" },
|
|
263
|
+
{ "tool": "list_dir", "action": "auto-approve" },
|
|
264
|
+
{ "tool": "grep_files", "action": "auto-approve" },
|
|
265
|
+
{ "tool": "glob_files", "action": "auto-approve" },
|
|
266
|
+
{ "tool": "write_todos", "action": "auto-approve" },
|
|
267
|
+
{ "tool": "bash", "action": "auto-approve", "when": { "dangerLevel": "safe" } },
|
|
268
|
+
{ "tool": "write_file", "action": "auto-approve", "when": { "pathPattern": "src/" } },
|
|
269
|
+
{ "tool": "bash", "action": "deny", "when": { "pathPattern": "rm -rf" } },
|
|
270
|
+
{ "tool": "*", "action": "confirm" }
|
|
271
|
+
]
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
| 字段 | 说明 |
|
|
276
|
+
|------|------|
|
|
277
|
+
| `tool` | 工具名,`*` 匹配所有工具 |
|
|
278
|
+
| `action` | `auto-approve`(跳过确认自动执行)、`deny`(拒绝)、`confirm`(需用户确认) |
|
|
279
|
+
| `when.dangerLevel` | 仅当危险级别为 `safe`、`write` 或 `destructive` 时匹配 |
|
|
280
|
+
| `when.pathPattern` | 子串匹配工具的 `path` 或 `command` 参数 |
|
|
281
|
+
|
|
282
|
+
**推荐配置** — 自动放行所有只读工具,减少 y/N 确认次数:
|
|
283
|
+
|
|
284
|
+
```json
|
|
285
|
+
{
|
|
286
|
+
"permissionRules": [
|
|
287
|
+
{ "tool": "read_file", "action": "auto-approve" },
|
|
288
|
+
{ "tool": "list_dir", "action": "auto-approve" },
|
|
289
|
+
{ "tool": "grep_files", "action": "auto-approve" },
|
|
290
|
+
{ "tool": "glob_files", "action": "auto-approve" },
|
|
291
|
+
{ "tool": "web_fetch", "action": "auto-approve" },
|
|
292
|
+
{ "tool": "write_todos", "action": "auto-approve" },
|
|
293
|
+
{ "tool": "ask_user", "action": "auto-approve" },
|
|
294
|
+
{ "tool": "run_tests", "action": "auto-approve" }
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
255
299
|
### 环境变量
|
|
256
300
|
|
|
257
301
|
| 变量 | 说明 |
|
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
theme,
|
|
36
36
|
truncateOutput,
|
|
37
37
|
undoStack
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-S6ZN53TH.js";
|
|
39
39
|
import {
|
|
40
40
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
41
41
|
AUTHOR,
|
|
@@ -55,7 +55,7 @@ import {
|
|
|
55
55
|
REPO_URL,
|
|
56
56
|
SKILLS_DIR_NAME,
|
|
57
57
|
VERSION
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-EVOOSNVZ.js";
|
|
59
59
|
|
|
60
60
|
// src/index.ts
|
|
61
61
|
import { program } from "commander";
|
|
@@ -1904,7 +1904,7 @@ ${hint}` : "")
|
|
|
1904
1904
|
description: "Run project tests and show structured report",
|
|
1905
1905
|
usage: "/test [command|filter]",
|
|
1906
1906
|
async execute(args, _ctx) {
|
|
1907
|
-
const { executeTests } = await import("./run-tests-
|
|
1907
|
+
const { executeTests } = await import("./run-tests-Y6KJ7XIU.js");
|
|
1908
1908
|
const argStr = args.join(" ").trim();
|
|
1909
1909
|
let testArgs = {};
|
|
1910
1910
|
if (argStr) {
|
|
@@ -4812,11 +4812,22 @@ Session '${this.resumeSessionId}' not found.
|
|
|
4812
4812
|
const apiMessages = [...messages];
|
|
4813
4813
|
const extraMessages = [];
|
|
4814
4814
|
const baseSystemPrompt = (this.buildCurrentSystemPrompt() ?? "") + TOOL_CALL_REMINDER;
|
|
4815
|
-
const roundBudgetHint = `
|
|
4815
|
+
const roundBudgetHint = this.planMode ? `
|
|
4816
|
+
|
|
4817
|
+
[Tool Round Budget \u2014 Plan Mode]
|
|
4818
|
+
You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds. You are in READ-ONLY Plan Mode:
|
|
4819
|
+
- Only use: read_file, list_dir, grep_files, glob_files, ask_user, write_todos
|
|
4820
|
+
- Do NOT attempt to call bash, write_file, edit_file \u2014 they are disabled
|
|
4821
|
+
- Do NOT write shell commands or code blocks as a substitute for tool calls
|
|
4822
|
+
- Do NOT read the same file more than once
|
|
4823
|
+
- Call write_todos ONCE to present your plan, then give a text summary
|
|
4824
|
+
- If the user asks you to execute anything, respond: "Please type /plan execute to switch to execute mode."
|
|
4825
|
+
- Every ${AUTO_PAUSE_INTERVAL} rounds the user will be asked whether to continue.` : `
|
|
4816
4826
|
|
|
4817
4827
|
[Tool Round Budget]
|
|
4818
4828
|
You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds for this task. Plan efficiently:
|
|
4819
4829
|
- Prefer batch operations (e.g. global find-and-replace) over repetitive single edits.
|
|
4830
|
+
- Do NOT read the same file more than once \u2014 use the content from previous reads.
|
|
4820
4831
|
- Prioritize the most critical tasks first in case rounds run out.
|
|
4821
4832
|
- When remaining rounds are low (\u22645), focus on completing the current task and summarizing.
|
|
4822
4833
|
- Every ${AUTO_PAUSE_INTERVAL} rounds the user will be asked whether to continue \u2014 use this as a natural checkpoint to report progress.`;
|
|
@@ -5052,10 +5063,32 @@ You have a maximum of ${MAX_TOOL_ROUNDS} tool call rounds for this task. Plan ef
|
|
|
5052
5063
|
process.stdin.removeListener("data", this._interjectionHandler);
|
|
5053
5064
|
}
|
|
5054
5065
|
const toolResults = await this.toolExecutor.executeAll(result.toolCalls);
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5066
|
+
const thisRoundTools = result.toolCalls.map((tc) => tc.name);
|
|
5067
|
+
roundToolHistory.push({ round: round + 1, tools: thisRoundTools });
|
|
5068
|
+
const readFileCalls = result.toolCalls.filter((tc) => tc.name === "read_file");
|
|
5069
|
+
for (const rfc of readFileCalls) {
|
|
5070
|
+
const filePath = rfc.arguments?.path;
|
|
5071
|
+
if (filePath) {
|
|
5072
|
+
const key = `read_file:${filePath}`;
|
|
5073
|
+
const prevCount = roundToolHistory.flat().length > 0 ? roundToolHistory.filter((rh) => rh.tools.includes("read_file")).length : 0;
|
|
5074
|
+
const fileReadCount = extraMessages.filter((msg) => {
|
|
5075
|
+
const m = msg;
|
|
5076
|
+
if (m.role !== "assistant") return false;
|
|
5077
|
+
const tcs = m.tool_calls;
|
|
5078
|
+
if (!Array.isArray(tcs)) return false;
|
|
5079
|
+
return tcs.some((tc) => {
|
|
5080
|
+
const fn = tc.function;
|
|
5081
|
+
return fn?.name === "read_file" && JSON.stringify(fn?.arguments ?? "").includes(filePath);
|
|
5082
|
+
});
|
|
5083
|
+
}).length;
|
|
5084
|
+
if (fileReadCount >= 2) {
|
|
5085
|
+
extraMessages.push({
|
|
5086
|
+
role: "user",
|
|
5087
|
+
content: `\u26A0\uFE0F You have read the file "${filePath}" ${fileReadCount + 1} times already. The content hasn't changed \u2014 do NOT read it again. Use the information you already have.`
|
|
5088
|
+
});
|
|
5089
|
+
}
|
|
5090
|
+
}
|
|
5091
|
+
}
|
|
5059
5092
|
if (this._interjectionHandler) {
|
|
5060
5093
|
process.stdin.on("data", this._interjectionHandler);
|
|
5061
5094
|
process.stdin.resume();
|
|
@@ -5474,7 +5507,7 @@ program.command("web").description("Start Web UI server with browser-based chat
|
|
|
5474
5507
|
console.error("Error: Invalid port number. Must be between 1 and 65535.");
|
|
5475
5508
|
process.exit(1);
|
|
5476
5509
|
}
|
|
5477
|
-
const { startWebServer } = await import("./server-
|
|
5510
|
+
const { startWebServer } = await import("./server-QEAEWP4S.js");
|
|
5478
5511
|
await startWebServer({ port, host: options.host });
|
|
5479
5512
|
});
|
|
5480
5513
|
program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | migrate <name>)").action(async (action, username) => {
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
setupProxy,
|
|
24
24
|
spawnAgentContext,
|
|
25
25
|
truncateOutput
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-S6ZN53TH.js";
|
|
27
27
|
import {
|
|
28
28
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
29
29
|
CONTEXT_FILE_CANDIDATES,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
PLAN_MODE_SYSTEM_ADDON,
|
|
36
36
|
SKILLS_DIR_NAME,
|
|
37
37
|
VERSION
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-EVOOSNVZ.js";
|
|
39
39
|
import {
|
|
40
40
|
AuthManager
|
|
41
41
|
} from "./chunk-CPLT6CD3.js";
|