jinzd-ai-cli 0.4.321 → 0.4.322

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.
Files changed (34) hide show
  1. package/README.md +2 -2
  2. package/README.zh-CN.md +2 -2
  3. package/dist/{batch-EW6QTSE6.js → batch-IMC6Q63Y.js} +2 -2
  4. package/dist/{chunk-6XXHAS5B.js → chunk-3TWEKDHH.js} +1 -1
  5. package/dist/{chunk-ZDO3XCXL.js → chunk-FHBV5EUM.js} +3 -3
  6. package/dist/{chunk-I3GEFCKP.js → chunk-G46THFJN.js} +1 -1
  7. package/dist/{chunk-2GOBINY4.js → chunk-HVVDGSUN.js} +3 -3
  8. package/dist/{chunk-7QW3DFYV.js → chunk-NX72SBGU.js} +1 -1
  9. package/dist/{chunk-COHKPZ2E.js → chunk-OR46O57D.js} +1 -1
  10. package/dist/{chunk-VS43QMR2.js → chunk-RO67VWKW.js} +1 -1
  11. package/dist/{chunk-JHSULP5D.js → chunk-RSWCASRV.js} +1 -1
  12. package/dist/{chunk-4MO2I5JB.js → chunk-SYK2TDKV.js} +23 -16
  13. package/dist/{chunk-LEA4AMXE.js → chunk-W7D4M4KV.js} +1 -1
  14. package/dist/{chunk-VEO2MILP.js → chunk-X5ZC4TI4.js} +1 -1
  15. package/dist/{chunk-6RCGQQFM.js → chunk-ZSR2UIRD.js} +4 -4
  16. package/dist/{chunk-2R6Y5SJH.js → chunk-ZUONW7FS.js} +1 -1
  17. package/dist/{ci-EZZD7CMS.js → ci-74EPK5JN.js} +4 -4
  18. package/dist/{ci-format-ZWECV6XI.js → ci-format-QADWGCX7.js} +2 -2
  19. package/dist/{constants-HF5AYLBR.js → constants-P5JJ6FO4.js} +1 -1
  20. package/dist/{constants-F2ULZ6W2.js → constants-SSVJCBAT.js} +1 -1
  21. package/dist/{doctor-cli-QAKYBWLG.js → doctor-cli-KJT5HMQB.js} +4 -4
  22. package/dist/electron-server.js +36 -29
  23. package/dist/{hub-OYH2UGER.js → hub-5CPMJQVG.js} +1 -1
  24. package/dist/index.js +17 -17
  25. package/dist/{persistent-memory-WNPZSVE4.js → persistent-memory-BOUJARIV.js} +2 -2
  26. package/dist/{persistent-memory-EVZX7SLR.js → persistent-memory-H5MUAC4X.js} +2 -2
  27. package/dist/{pr-XPQVXG2G.js → pr-BU2FN7CO.js} +4 -4
  28. package/dist/{run-tests-3SYXE2PJ.js → run-tests-6JKF6JJZ.js} +2 -2
  29. package/dist/{run-tests-MFXQ76ZJ.js → run-tests-WJJW77HK.js} +2 -2
  30. package/dist/{server-AF5PIBUD.js → server-GFL7MYAP.js} +5 -5
  31. package/dist/{server-VOGBRYA5.js → server-XGY6OUUT.js} +13 -13
  32. package/dist/{task-orchestrator-QHJEDRDS.js → task-orchestrator-EETPUWBK.js} +5 -5
  33. package/dist/{usage-EZOW27TR.js → usage-BVHFDNRW.js} +2 -2
  34. package/package.json +3 -2
package/README.md CHANGED
@@ -44,7 +44,7 @@
44
44
  - **Web UI Memory Panel** *(v0.4.90+, B4)* — new 🧠 Memory sidebar tab with semantic search across past chats; each hit has **➕ Inject** (quotes the snippet into the chat input as a markdown blockquote so you can review/edit before sending — no silent context injection) and **↗ Load** (jumps to source session). Bulk "Inject top 3" for recall bundles
45
45
  - **Streaming Tool Use** — Real-time streaming of AI reasoning and tool calls as they happen
46
46
  - **Sub-Agents** — Delegate complex subtasks to isolated child agents with independent tool loops
47
- - **Extended Thinking** — Claude deep reasoning mode with `/think` toggle
47
+ - **Thinking control** — `/think on|off|low|high|max` across Claude, DeepSeek, GLM-5, Ollama thinking models (off by default where the API allows it)
48
48
  - **Plan Mode** — Read-only planning phase (`/plan`) where AI analyzes before executing, with loop detection
49
49
  - **Auto-Pause** — Automatically pauses every 10 rounds for user review and redirection
50
50
  - **MCP Protocol** — Connect external MCP servers for dynamic tool discovery
@@ -206,7 +206,7 @@ AI autonomously invokes these 30 tools during conversations:
206
206
  | `/provider` | Switch AI provider |
207
207
  | `/model` | Switch model; `/model refresh [provider]` refreshes live model cache |
208
208
  | `/plan` | Enter read-only planning mode |
209
- | `/think` | Toggle Claude extended thinking |
209
+ | `/think` | Thinking on/off and effort (`on\|off\|low\|high\|max\|status`) |
210
210
  | `/test` | Auto-detect and run project tests |
211
211
  | `/review` | AI code review of current git diff |
212
212
  | `/security-review` | Security vulnerability scan on git diff |
package/README.zh-CN.md CHANGED
@@ -34,7 +34,7 @@
34
34
  - **Web UI Memory 面板**(v0.4.90+,B4)— sidebar 新增 🧠 Memory 标签页,跨 session 语义搜索;每条 hit 带 **➕ Inject**(把片段作为 markdown 引用块塞进聊天输入框,用户可在上面继续打字编辑——不是静默注入上下文)和 **↗ Load**(跳转对应 session);顶部"➕ Inject top 3"一键批量
35
35
  - **流式工具调用** — 实时流式展示 AI 推理过程和工具调用
36
36
  - **子代理系统** — 将复杂子任务委派给独立子代理执行
37
- - **深度推理** — Claude Extended Thinking,`/think` 一键切换
37
+ - **思考控制** — `/think on|off|low|high|max`,覆盖 Claude、DeepSeek、GLM-5、Ollama 思考模型(API 允许关闭的默认关闭)
38
38
  - **规划模式** — `/plan` 进入只读规划,AI 先分析后执行,内置死循环检测
39
39
  - **自动暂停** — 每 10 轮自动暂停,用户可审查进度或重定向 AI
40
40
  - **MCP 协议** — 接入外部 MCP 服务器,动态发现工具
@@ -203,7 +203,7 @@ AI 在对话中可自主调用 30 个工具:
203
203
  | `/provider` | 切换 AI Provider |
204
204
  | `/model` | 切换模型 |
205
205
  | `/plan` | 进入只读规划模式 |
206
- | `/think` | 切换 Claude 深度推理 |
206
+ | `/think` | 思考开关与档位(`on\|off\|low\|high\|max\|status`) |
207
207
  | `/test` | 自动检测并运行测试 |
208
208
  | `/review` | AI 代码审查 git diff |
209
209
  | `/security-review` | 安全漏洞扫描 git diff |
@@ -4,12 +4,12 @@ import {
4
4
  } from "./chunk-RS7SKYTS.js";
5
5
  import {
6
6
  ConfigManager
7
- } from "./chunk-COHKPZ2E.js";
7
+ } from "./chunk-OR46O57D.js";
8
8
  import "./chunk-TU3L3PW7.js";
9
9
  import {
10
10
  atomicWriteFileSync
11
11
  } from "./chunk-BMLQPSHP.js";
12
- import "./chunk-2R6Y5SJH.js";
12
+ import "./chunk-ZUONW7FS.js";
13
13
 
14
14
  // src/cli/batch.ts
15
15
  import Anthropic from "@anthropic-ai/sdk";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  TEST_TIMEOUT
4
- } from "./chunk-2R6Y5SJH.js";
4
+ } from "./chunk-ZUONW7FS.js";
5
5
  import {
6
6
  getExecutionConfigDir,
7
7
  getExecutionSignal
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  evaluateCiGate,
4
4
  normalizeCiThresholds
5
- } from "./chunk-LEA4AMXE.js";
5
+ } from "./chunk-W7D4M4KV.js";
6
6
  import {
7
7
  buildReviewPrompt,
8
8
  buildSecurityReviewPrompt,
@@ -16,10 +16,10 @@ import {
16
16
  } from "./chunk-XVB4RARX.js";
17
17
  import {
18
18
  ConfigManager
19
- } from "./chunk-COHKPZ2E.js";
19
+ } from "./chunk-OR46O57D.js";
20
20
  import {
21
21
  VERSION
22
- } from "./chunk-2R6Y5SJH.js";
22
+ } from "./chunk-ZUONW7FS.js";
23
23
 
24
24
  // src/cli/ci.ts
25
25
  import { execFileSync } from "child_process";
@@ -13,7 +13,7 @@ import {
13
13
  MEMORY_FILE_NAME,
14
14
  MEMORY_MAX_CHARS,
15
15
  MEMORY_STORE_FILE_NAME
16
- } from "./chunk-2R6Y5SJH.js";
16
+ } from "./chunk-ZUONW7FS.js";
17
17
 
18
18
  // src/memory/persistent-memory.ts
19
19
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -8,13 +8,13 @@ import {
8
8
  listHooks,
9
9
  listInstalledPlugins,
10
10
  resetStats
11
- } from "./chunk-VS43QMR2.js";
11
+ } from "./chunk-RO67VWKW.js";
12
12
  import {
13
13
  ProviderRegistry
14
14
  } from "./chunk-XVB4RARX.js";
15
15
  import {
16
16
  ConfigManager
17
- } from "./chunk-COHKPZ2E.js";
17
+ } from "./chunk-OR46O57D.js";
18
18
  import {
19
19
  getGitRoot
20
20
  } from "./chunk-HOSJZMQS.js";
@@ -26,7 +26,7 @@ import {
26
26
  MCP_PROJECT_CONFIG_NAME,
27
27
  MEMORY_FILE_NAME,
28
28
  VERSION
29
- } from "./chunk-2R6Y5SJH.js";
29
+ } from "./chunk-ZUONW7FS.js";
30
30
 
31
31
  // src/diagnostics/doctor-report.ts
32
32
  import { existsSync as existsSync3, statSync as statSync2 } from "fs";
@@ -12,7 +12,7 @@ import {
12
12
  MEMORY_FILE_NAME,
13
13
  MEMORY_MAX_CHARS,
14
14
  MEMORY_STORE_FILE_NAME
15
- } from "./chunk-VEO2MILP.js";
15
+ } from "./chunk-X5ZC4TI4.js";
16
16
 
17
17
  // src/memory/persistent-memory.ts
18
18
  import { copyFileSync, existsSync, mkdirSync, readFileSync, statSync } from "fs";
@@ -11,7 +11,7 @@ import {
11
11
  CONFIG_FILE_NAME,
12
12
  HISTORY_DIR_NAME,
13
13
  PLUGINS_DIR_NAME
14
- } from "./chunk-2R6Y5SJH.js";
14
+ } from "./chunk-ZUONW7FS.js";
15
15
 
16
16
  // src/config/config-manager.ts
17
17
  import { readFileSync, existsSync, mkdirSync } from "fs";
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  CONFIG_DIR_NAME,
10
10
  PLUGINS_DIR_NAME
11
- } from "./chunk-2R6Y5SJH.js";
11
+ } from "./chunk-ZUONW7FS.js";
12
12
 
13
13
  // src/diagnostics/tool-stats.ts
14
14
  import { mkdirSync } from "fs";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-QMFMST2T.js";
5
5
  import {
6
6
  TEST_TIMEOUT
7
- } from "./chunk-VEO2MILP.js";
7
+ } from "./chunk-X5ZC4TI4.js";
8
8
 
9
9
  // src/tools/builtin/run-tests.ts
10
10
  import { spawn as spawn2 } from "child_process";
@@ -16,7 +16,7 @@ import {
16
16
  setPreferredAgentName,
17
17
  truncateForPersist,
18
18
  undoStack
19
- } from "./chunk-6RCGQQFM.js";
19
+ } from "./chunk-ZSR2UIRD.js";
20
20
  import {
21
21
  buildReviewPrompt,
22
22
  buildSecurityReviewPrompt
@@ -51,7 +51,7 @@ import {
51
51
  touchMemoryReferences,
52
52
  updateMemoryApproval,
53
53
  updateMemoryEntry
54
- } from "./chunk-I3GEFCKP.js";
54
+ } from "./chunk-G46THFJN.js";
55
55
  import {
56
56
  theme
57
57
  } from "./chunk-5C76XDDF.js";
@@ -65,7 +65,7 @@ import {
65
65
  import {
66
66
  buildDoctorReport,
67
67
  formatDoctorReport
68
- } from "./chunk-2GOBINY4.js";
68
+ } from "./chunk-HVVDGSUN.js";
69
69
  import {
70
70
  describePlugin,
71
71
  getActivePluginAssets,
@@ -80,7 +80,7 @@ import {
80
80
  trustHook,
81
81
  trustPlugin,
82
82
  untrustHook
83
- } from "./chunk-VS43QMR2.js";
83
+ } from "./chunk-RO67VWKW.js";
84
84
  import {
85
85
  isCleanDocumentBody,
86
86
  stripOuterCodeFence
@@ -109,11 +109,11 @@ import {
109
109
  MCP_TOOL_PREFIX,
110
110
  REPO_URL,
111
111
  VERSION
112
- } from "./chunk-2R6Y5SJH.js";
112
+ } from "./chunk-ZUONW7FS.js";
113
113
 
114
114
  // src/skills/manager.ts
115
115
  import { existsSync, readdirSync, mkdirSync, statSync } from "fs";
116
- import { join } from "path";
116
+ import { basename as basename2, dirname, join } from "path";
117
117
 
118
118
  // src/skills/types.ts
119
119
  import { readFileSync } from "fs";
@@ -253,7 +253,14 @@ var SkillManager = class {
253
253
  }
254
254
  /** 获取激活技能的 prompt 内容(null 表示无激活技能) */
255
255
  getActivePromptContent() {
256
- return this.activeSkill?.content ?? null;
256
+ const skill = this.activeSkill;
257
+ if (!skill) return null;
258
+ if (basename2(skill.filePath) === "SKILL.md") {
259
+ return `Skill directory (SKILL_DIR, \u6280\u80FD\u76EE\u5F55): ${dirname(skill.filePath)}
260
+
261
+ ${skill.content}`;
262
+ }
263
+ return skill.content;
257
264
  }
258
265
  /** 获取激活技能的工具白名单 Set(null 表示无限制) */
259
266
  getActiveToolFilter() {
@@ -2426,7 +2433,7 @@ No tools match "${filter}".
2426
2433
  const { join: join6 } = await import("path");
2427
2434
  const { existsSync: existsSync6 } = await import("fs");
2428
2435
  const { getGitRoot } = await import("./git-context-EXOEHQSF.js");
2429
- const { MCP_PROJECT_CONFIG_NAME } = await import("./constants-F2ULZ6W2.js");
2436
+ const { MCP_PROJECT_CONFIG_NAME } = await import("./constants-SSVJCBAT.js");
2430
2437
  const { approveProject, hashMcpFile } = await import("./project-trust-KGG2BWKC.js");
2431
2438
  const cwd = process.cwd();
2432
2439
  const projectRoot = getGitRoot(cwd) ?? cwd;
@@ -3534,7 +3541,7 @@ function createReviewCommands() {
3534
3541
  usage: "/test [command|filter]",
3535
3542
  async execute(args, ctx) {
3536
3543
  try {
3537
- const { executeTests } = await import("./run-tests-MFXQ76ZJ.js");
3544
+ const { executeTests } = await import("./run-tests-WJJW77HK.js");
3538
3545
  const argStr = args.join(" ").trim();
3539
3546
  let testArgs = {};
3540
3547
  if (argStr) {
@@ -4391,7 +4398,7 @@ ${view.chatHeading}
4391
4398
 
4392
4399
  // src/repl/commands/session-commands.ts
4393
4400
  import { writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "fs";
4394
- import { resolve, dirname } from "path";
4401
+ import { resolve, dirname as dirname2 } from "path";
4395
4402
  import chalk2 from "chalk";
4396
4403
 
4397
4404
  // src/core/session-cost.ts
@@ -4718,7 +4725,7 @@ function createSessionCommands() {
4718
4725
  const exported = buildSessionExport(session, format, outFile);
4719
4726
  const absPath = resolve(process.cwd(), exported.filename);
4720
4727
  try {
4721
- mkdirSync2(dirname(absPath), { recursive: true });
4728
+ mkdirSync2(dirname2(absPath), { recursive: true });
4722
4729
  writeFileSync2(absPath, exported.content, "utf-8");
4723
4730
  ctx.renderer.printSuccess(`Exported ${exported.messageCount} messages \u2192 ${absPath}`);
4724
4731
  } catch (err) {
@@ -4885,7 +4892,7 @@ function createSessionCommands() {
4885
4892
  }
4886
4893
 
4887
4894
  // src/repl/commands/misc-commands.ts
4888
- import { basename as basename2 } from "path";
4895
+ import { basename as basename3 } from "path";
4889
4896
  import { platform as platform3 } from "os";
4890
4897
  function createMiscCommands() {
4891
4898
  return [
@@ -5142,7 +5149,7 @@ ${hint}` : "")
5142
5149
  return;
5143
5150
  }
5144
5151
  const description = args.join(" ").trim() || "Please describe this image";
5145
- ctx.renderer.printSuccess(`\u{1F4CB} Image loaded: ${basename2(imgPath)}`);
5152
+ ctx.renderer.printSuccess(`\u{1F4CB} Image loaded: ${basename3(imgPath)}`);
5146
5153
  await ctx.sendAsChat(`@${imgPath} ${description}`);
5147
5154
  }
5148
5155
  },
@@ -5587,7 +5594,7 @@ function clearDevState() {
5587
5594
 
5588
5595
  // src/tools/deferred-save.ts
5589
5596
  import { statSync as statSync4 } from "fs";
5590
- import { basename as basename3 } from "path";
5597
+ import { basename as basename4 } from "path";
5591
5598
  function snapshotFile(path) {
5592
5599
  try {
5593
5600
  const st = statSync4(path);
@@ -5608,7 +5615,7 @@ var SAVE_CLAIM_PATTERNS = [
5608
5615
  /\b(?:saved|written|created|generated)\s+(?:to|at|as|into)\b/i
5609
5616
  ];
5610
5617
  function narratesSavedTarget(content, path) {
5611
- const base = basename3(path);
5618
+ const base = basename4(path);
5612
5619
  if (!base || !content.includes(base)) return null;
5613
5620
  for (const re of SAVE_CLAIM_PATTERNS) {
5614
5621
  if (re.test(content)) return re.source;
@@ -5630,7 +5637,7 @@ function decideDeferredSave(params) {
5630
5637
  return {
5631
5638
  kind: "skip",
5632
5639
  reason: "narrates-target",
5633
- message: `\u21AA \u8DF3\u8FC7 deferred \u843D\u76D8\uFF1A\u6700\u7EC8\u56DE\u590D\u662F\u5173\u4E8E ${basename3(path)} \u7684\u6C47\u62A5\u800C\u975E\u6587\u6863\u6B63\u6587\uFF08matched: ${narrated}\uFF09\u3002`
5640
+ message: `\u21AA \u8DF3\u8FC7 deferred \u843D\u76D8\uFF1A\u6700\u7EC8\u56DE\u590D\u662F\u5173\u4E8E ${basename4(path)} \u7684\u6C47\u62A5\u800C\u975E\u6587\u6863\u6B63\u6587\uFF08matched: ${narrated}\uFF09\u3002`
5634
5641
  };
5635
5642
  }
5636
5643
  if (!isCleanDocumentBody(body)) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  VERSION
4
- } from "./chunk-2R6Y5SJH.js";
4
+ } from "./chunk-ZUONW7FS.js";
5
5
 
6
6
  // src/cli/ci-format.ts
7
7
  var DEFAULT_CI_THRESHOLDS = {
@@ -1,5 +1,5 @@
1
1
  // src/core/constants.ts
2
- var VERSION = "0.4.321";
2
+ var VERSION = "0.4.322";
3
3
  var APP_NAME = "ai-cli";
4
4
  var CONFIG_DIR_NAME = ".aicli";
5
5
  var CONFIG_FILE_NAME = "config.json";
@@ -11,7 +11,7 @@ import {
11
11
  searchPersistentMemories,
12
12
  touchMemoryReferences,
13
13
  updateMemoryEntry
14
- } from "./chunk-I3GEFCKP.js";
14
+ } from "./chunk-G46THFJN.js";
15
15
  import {
16
16
  indexProject
17
17
  } from "./chunk-RWRZVQCB.js";
@@ -30,7 +30,7 @@ import {
30
30
  runHook,
31
31
  runLifecycleHooks,
32
32
  runTool
33
- } from "./chunk-VS43QMR2.js";
33
+ } from "./chunk-RO67VWKW.js";
34
34
  import {
35
35
  buildTruncatedArgumentsError,
36
36
  getDangerLevel,
@@ -64,7 +64,7 @@ import {
64
64
  recoverGbkMojibake,
65
65
  runTestsTool,
66
66
  shellInvocation
67
- } from "./chunk-6XXHAS5B.js";
67
+ } from "./chunk-3TWEKDHH.js";
68
68
  import {
69
69
  CONFIG_DIR_NAME,
70
70
  DEFAULT_MAX_TOOL_OUTPUT_CHARS_CAP,
@@ -73,7 +73,7 @@ import {
73
73
  SUBAGENT_ALLOWED_TOOLS,
74
74
  SUBAGENT_DEFAULT_MAX_ROUNDS,
75
75
  SUBAGENT_MAX_ROUNDS_LIMIT
76
- } from "./chunk-2R6Y5SJH.js";
76
+ } from "./chunk-ZUONW7FS.js";
77
77
  import {
78
78
  getCurrentSessionKey,
79
79
  getExecutionConfigDir,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/core/constants.ts
4
- var VERSION = "0.4.321";
4
+ var VERSION = "0.4.322";
5
5
  var APP_NAME = "ai-cli";
6
6
  var CONFIG_DIR_NAME = ".aicli";
7
7
  var CONFIG_FILE_NAME = "config.json";
@@ -3,16 +3,16 @@ import {
3
3
  CI_COMMENT_MARKER,
4
4
  countSeverity,
5
5
  runCi
6
- } from "./chunk-ZDO3XCXL.js";
7
- import "./chunk-LEA4AMXE.js";
6
+ } from "./chunk-FHBV5EUM.js";
7
+ import "./chunk-W7D4M4KV.js";
8
8
  import "./chunk-HLWUDRBO.js";
9
9
  import "./chunk-6YZEZFX5.js";
10
10
  import "./chunk-XVB4RARX.js";
11
- import "./chunk-COHKPZ2E.js";
11
+ import "./chunk-OR46O57D.js";
12
12
  import "./chunk-E2W2MI6H.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-2R6Y5SJH.js";
15
+ import "./chunk-ZUONW7FS.js";
16
16
  export {
17
17
  CI_COMMENT_MARKER,
18
18
  countSeverity,
@@ -6,8 +6,8 @@ import {
6
6
  formatCiResult,
7
7
  formatCiSarif,
8
8
  normalizeCiThresholds
9
- } from "./chunk-LEA4AMXE.js";
10
- import "./chunk-2R6Y5SJH.js";
9
+ } from "./chunk-W7D4M4KV.js";
10
+ import "./chunk-ZUONW7FS.js";
11
11
  export {
12
12
  DEFAULT_CI_THRESHOLDS,
13
13
  detectCiGateSignals,
@@ -38,7 +38,7 @@ import {
38
38
  TEST_TIMEOUT,
39
39
  VERSION,
40
40
  buildUserIdentityPrompt
41
- } from "./chunk-VEO2MILP.js";
41
+ } from "./chunk-X5ZC4TI4.js";
42
42
  export {
43
43
  AGENTIC_BEHAVIOR_GUIDELINE,
44
44
  APP_NAME,
@@ -39,7 +39,7 @@ import {
39
39
  TEST_TIMEOUT,
40
40
  VERSION,
41
41
  buildUserIdentityPrompt
42
- } from "./chunk-2R6Y5SJH.js";
42
+ } from "./chunk-ZUONW7FS.js";
43
43
  export {
44
44
  AGENTIC_BEHAVIOR_GUIDELINE,
45
45
  APP_NAME,
@@ -2,16 +2,16 @@
2
2
  import {
3
3
  formatDoctorReport,
4
4
  runDoctorCli
5
- } from "./chunk-2GOBINY4.js";
6
- import "./chunk-VS43QMR2.js";
5
+ } from "./chunk-HVVDGSUN.js";
6
+ import "./chunk-RO67VWKW.js";
7
7
  import "./chunk-RS7SKYTS.js";
8
8
  import "./chunk-XVB4RARX.js";
9
- import "./chunk-COHKPZ2E.js";
9
+ import "./chunk-OR46O57D.js";
10
10
  import "./chunk-E2W2MI6H.js";
11
11
  import "./chunk-TU3L3PW7.js";
12
12
  import "./chunk-HOSJZMQS.js";
13
13
  import "./chunk-BMLQPSHP.js";
14
- import "./chunk-2R6Y5SJH.js";
14
+ import "./chunk-ZUONW7FS.js";
15
15
  export {
16
16
  formatDoctorReport,
17
17
  runDoctorCli
@@ -55,7 +55,7 @@ import {
55
55
  touchMemoryReferences,
56
56
  updateMemoryApproval,
57
57
  updateMemoryEntry
58
- } from "./chunk-7QW3DFYV.js";
58
+ } from "./chunk-NX72SBGU.js";
59
59
  import {
60
60
  DEFAULT_PATTERNS,
61
61
  redactJson,
@@ -81,7 +81,7 @@ import {
81
81
  recoverGbkMojibake,
82
82
  runTestsTool,
83
83
  shellInvocation
84
- } from "./chunk-JHSULP5D.js";
84
+ } from "./chunk-RSWCASRV.js";
85
85
  import {
86
86
  getCurrentSessionKey,
87
87
  getExecutionConfigDir,
@@ -123,7 +123,7 @@ import {
123
123
  SUBAGENT_MAX_ROUNDS_LIMIT,
124
124
  VERSION,
125
125
  buildUserIdentityPrompt
126
- } from "./chunk-VEO2MILP.js";
126
+ } from "./chunk-X5ZC4TI4.js";
127
127
 
128
128
  // src/web/access.ts
129
129
  import { randomBytes, timingSafeEqual } from "crypto";
@@ -205,7 +205,7 @@ function imageValidationError(images) {
205
205
  }
206
206
 
207
207
  // src/web/server.ts
208
- import { join as join25, dirname as dirname11, resolve as resolve12, relative as relative6, sep as sep5, extname as extname3, resolve as resolvePath } from "path";
208
+ import { join as join25, dirname as dirname12, resolve as resolve12, relative as relative6, sep as sep5, extname as extname3, resolve as resolvePath } from "path";
209
209
  import { existsSync as existsSync31, readFileSync as readFileSync22, readdirSync as readdirSync15, statSync as statSync16, realpathSync as realpathSync3, createReadStream } from "fs";
210
210
  import { networkInterfaces as networkInterfaces2 } from "os";
211
211
 
@@ -2714,12 +2714,12 @@ function findPhantomClaims(content, extraMessages) {
2714
2714
  const claimed = extractClaimedFilePaths(content);
2715
2715
  if (claimed.length === 0) return [];
2716
2716
  const normalize = (p) => p.replace(/\\/g, "/").toLowerCase().replace(/^\.\//, "");
2717
- const basename10 = (p) => {
2717
+ const basename11 = (p) => {
2718
2718
  const parts = normalize(p).split("/");
2719
2719
  return parts[parts.length - 1] ?? "";
2720
2720
  };
2721
2721
  const written = extractWrittenFilePaths(extraMessages).map(normalize);
2722
- const writtenBases = new Set(written.map(basename10));
2722
+ const writtenBases = new Set(written.map(basename11));
2723
2723
  const writtenFull = new Set(written);
2724
2724
  const bashText = extractBashCommands(extraMessages).map((c) => c.replace(/\\/g, "/").toLowerCase()).join("\n");
2725
2725
  return claimed.filter((raw) => {
@@ -2728,8 +2728,8 @@ function findPhantomClaims(content, extraMessages) {
2728
2728
  for (const w of writtenFull) {
2729
2729
  if (w.endsWith("/" + norm2) || norm2.endsWith("/" + w)) return false;
2730
2730
  }
2731
- if (writtenBases.has(basename10(norm2))) return false;
2732
- const base = basename10(norm2);
2731
+ if (writtenBases.has(basename11(norm2))) return false;
2732
+ const base = basename11(norm2);
2733
2733
  if (base && bashText.includes(base)) return false;
2734
2734
  return true;
2735
2735
  });
@@ -14353,7 +14353,7 @@ var McpManager = class {
14353
14353
 
14354
14354
  // src/skills/manager.ts
14355
14355
  import { existsSync as existsSync20, readdirSync as readdirSync10, mkdirSync as mkdirSync10, statSync as statSync9 } from "fs";
14356
- import { join as join14 } from "path";
14356
+ import { basename as basename8, dirname as dirname8, join as join14 } from "path";
14357
14357
 
14358
14358
  // src/skills/types.ts
14359
14359
  import { readFileSync as readFileSync13 } from "fs";
@@ -14493,7 +14493,14 @@ var SkillManager = class {
14493
14493
  }
14494
14494
  /** 获取激活技能的 prompt 内容(null 表示无激活技能) */
14495
14495
  getActivePromptContent() {
14496
- return this.activeSkill?.content ?? null;
14496
+ const skill = this.activeSkill;
14497
+ if (!skill) return null;
14498
+ if (basename8(skill.filePath) === "SKILL.md") {
14499
+ return `Skill directory (SKILL_DIR, \u6280\u80FD\u76EE\u5F55): ${dirname8(skill.filePath)}
14500
+
14501
+ ${skill.content}`;
14502
+ }
14503
+ return skill.content;
14497
14504
  }
14498
14505
  /** 获取激活技能的工具白名单 Set(null 表示无限制) */
14499
14506
  getActiveToolFilter() {
@@ -15485,7 +15492,7 @@ function loadContextFiles(options) {
15485
15492
 
15486
15493
  // src/tools/deferred-save.ts
15487
15494
  import { statSync as statSync10 } from "fs";
15488
- import { basename as basename8 } from "path";
15495
+ import { basename as basename9 } from "path";
15489
15496
  function snapshotFile(path3) {
15490
15497
  try {
15491
15498
  const st = statSync10(path3);
@@ -15506,7 +15513,7 @@ var SAVE_CLAIM_PATTERNS = [
15506
15513
  /\b(?:saved|written|created|generated)\s+(?:to|at|as|into)\b/i
15507
15514
  ];
15508
15515
  function narratesSavedTarget(content, path3) {
15509
- const base = basename8(path3);
15516
+ const base = basename9(path3);
15510
15517
  if (!base || !content.includes(base)) return null;
15511
15518
  for (const re of SAVE_CLAIM_PATTERNS) {
15512
15519
  if (re.test(content)) return re.source;
@@ -15528,7 +15535,7 @@ function decideDeferredSave(params) {
15528
15535
  return {
15529
15536
  kind: "skip",
15530
15537
  reason: "narrates-target",
15531
- message: `\u21AA \u8DF3\u8FC7 deferred \u843D\u76D8\uFF1A\u6700\u7EC8\u56DE\u590D\u662F\u5173\u4E8E ${basename8(path3)} \u7684\u6C47\u62A5\u800C\u975E\u6587\u6863\u6B63\u6587\uFF08matched: ${narrated}\uFF09\u3002`
15538
+ message: `\u21AA \u8DF3\u8FC7 deferred \u843D\u76D8\uFF1A\u6700\u7EC8\u56DE\u590D\u662F\u5173\u4E8E ${basename9(path3)} \u7684\u6C47\u62A5\u800C\u975E\u6587\u6863\u6B63\u6587\uFF08matched: ${narrated}\uFF09\u3002`
15532
15539
  };
15533
15540
  }
15534
15541
  if (!isCleanDocumentBody(body)) {
@@ -15543,7 +15550,7 @@ function decideDeferredSave(params) {
15543
15550
 
15544
15551
  // src/web/session-handler.ts
15545
15552
  import { mkdirSync as mkdirSync15, createWriteStream as createWriteStream2 } from "fs";
15546
- import { dirname as dirname10 } from "path";
15553
+ import { dirname as dirname11 } from "path";
15547
15554
 
15548
15555
  // src/repl/commands/project-init.ts
15549
15556
  import { existsSync as existsSync24, readFileSync as readFileSync17, readdirSync as readdirSync11, statSync as statSync11 } from "fs";
@@ -16922,7 +16929,7 @@ function costSourceNote(source2) {
16922
16929
 
16923
16930
  // src/web/commands/_shared.ts
16924
16931
  import { existsSync as existsSync27, readFileSync as readFileSync19, writeFileSync as writeFileSync3, mkdirSync as mkdirSync13, readdirSync as readdirSync13, statSync as statSync14, createWriteStream } from "fs";
16925
- import { join as join21, resolve as resolve9, dirname as dirname8 } from "path";
16932
+ import { join as join21, resolve as resolve9, dirname as dirname9 } from "path";
16926
16933
 
16927
16934
  // src/cli/review-prompts.ts
16928
16935
  function buildReviewPrompt(diff, gitContextStr, detailed) {
@@ -17709,7 +17716,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
17709
17716
  Cost: ${formatCost(cost)}` : "";
17710
17717
  let memoryLine = "";
17711
17718
  try {
17712
- const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-EVZX7SLR.js");
17719
+ const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-H5MUAC4X.js");
17713
17720
  const pending = countPendingMemories2(ctx.config.getConfigDir());
17714
17721
  if (pending > 0) memoryLine = `
17715
17722
  Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
@@ -18697,7 +18704,7 @@ async function handleTest(args, ctx) {
18697
18704
  const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
18698
18705
  testArgs = isCommand ? { command: argStr } : { filter: argStr };
18699
18706
  }
18700
- const runTests = ctx.runTests ?? (await import("./run-tests-3SYXE2PJ.js")).executeTests;
18707
+ const runTests = ctx.runTests ?? (await import("./run-tests-6JKF6JJZ.js")).executeTests;
18701
18708
  const report = await runTests(testArgs);
18702
18709
  ctx.send({ type: "info", message: report });
18703
18710
  } catch (err) {
@@ -19088,7 +19095,7 @@ async function handleMemory(args, ctx) {
19088
19095
  }
19089
19096
  if (intent.kind === "status") {
19090
19097
  const { getChatIndexStatus: getChatIndexStatus2 } = await import("./chat-index-RLVLQRRC.js");
19091
- const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-EVZX7SLR.js");
19098
+ const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-H5MUAC4X.js");
19092
19099
  const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
19093
19100
  const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
19094
19101
  const view = buildMemoryStatusView({
@@ -19111,7 +19118,7 @@ async function handleMemory(args, ctx) {
19111
19118
  return;
19112
19119
  }
19113
19120
  if (intent.kind === "recall") {
19114
- const { searchPersistentMemories: searchPersistentMemories2, touchMemoryReferences: touchMemoryReferences2 } = await import("./persistent-memory-EVZX7SLR.js");
19121
+ const { searchPersistentMemories: searchPersistentMemories2, touchMemoryReferences: touchMemoryReferences2 } = await import("./persistent-memory-H5MUAC4X.js");
19115
19122
  const { searchChatMemory: searchChatMemory2 } = await import("./chat-index-RLVLQRRC.js");
19116
19123
  const persistentHits = searchPersistentMemories2(configDir, intent.query, process.cwd(), 3);
19117
19124
  if (persistentHits.length > 0) {
@@ -19232,7 +19239,7 @@ async function handleMemory(args, ctx) {
19232
19239
  ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
19233
19240
  } else if (intent.kind === "export") {
19234
19241
  if (args[1] === "md") {
19235
- const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-EVZX7SLR.js");
19242
+ const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-H5MUAC4X.js");
19236
19243
  ctx.send({
19237
19244
  type: "export_data",
19238
19245
  format: "md",
@@ -20237,7 +20244,7 @@ No tools match "${filter}".
20237
20244
  const { join: join26 } = await import("path");
20238
20245
  const { existsSync: existsSync32 } = await import("fs");
20239
20246
  const { getGitRoot: getGitRoot2 } = await import("./git-context-VNCA2GU7.js");
20240
- const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-HF5AYLBR.js");
20247
+ const { MCP_PROJECT_CONFIG_NAME: MCP_PROJECT_CONFIG_NAME2 } = await import("./constants-P5JJ6FO4.js");
20241
20248
  const { approveProject, hashMcpFile } = await import("./project-trust-6CJB5ZMX.js");
20242
20249
  const cwd = process.cwd();
20243
20250
  const projectRoot = getGitRoot2(cwd) ?? cwd;
@@ -21156,7 +21163,7 @@ function createReviewCommands() {
21156
21163
  usage: "/test [command|filter]",
21157
21164
  async execute(args, ctx) {
21158
21165
  try {
21159
- const { executeTests } = await import("./run-tests-3SYXE2PJ.js");
21166
+ const { executeTests } = await import("./run-tests-6JKF6JJZ.js");
21160
21167
  const argStr = args.join(" ").trim();
21161
21168
  let testArgs = {};
21162
21169
  if (argStr) {
@@ -21898,7 +21905,7 @@ ${view.chatHeading}
21898
21905
 
21899
21906
  // src/repl/commands/session-commands.ts
21900
21907
  import { writeFileSync as writeFileSync5, mkdirSync as mkdirSync14 } from "fs";
21901
- import { resolve as resolve11, dirname as dirname9 } from "path";
21908
+ import { resolve as resolve11, dirname as dirname10 } from "path";
21902
21909
  import chalk7 from "chalk";
21903
21910
  function createSessionCommands() {
21904
21911
  return [
@@ -22188,7 +22195,7 @@ function createSessionCommands() {
22188
22195
  const exported = buildSessionExport(session, format, outFile);
22189
22196
  const absPath = resolve11(process.cwd(), exported.filename);
22190
22197
  try {
22191
- mkdirSync14(dirname9(absPath), { recursive: true });
22198
+ mkdirSync14(dirname10(absPath), { recursive: true });
22192
22199
  writeFileSync5(absPath, exported.content, "utf-8");
22193
22200
  ctx.renderer.printSuccess(`Exported ${exported.messageCount} messages \u2192 ${absPath}`);
22194
22201
  } catch (err) {
@@ -22355,7 +22362,7 @@ function createSessionCommands() {
22355
22362
  }
22356
22363
 
22357
22364
  // src/repl/commands/misc-commands.ts
22358
- import { basename as basename9 } from "path";
22365
+ import { basename as basename10 } from "path";
22359
22366
  import { platform as platform8 } from "os";
22360
22367
 
22361
22368
  // src/repl/clipboard.ts
@@ -22701,7 +22708,7 @@ ${hint}` : "")
22701
22708
  return;
22702
22709
  }
22703
22710
  const description = args.join(" ").trim() || "Please describe this image";
22704
- ctx.renderer.printSuccess(`\u{1F4CB} Image loaded: ${basename9(imgPath)}`);
22711
+ ctx.renderer.printSuccess(`\u{1F4CB} Image loaded: ${basename10(imgPath)}`);
22705
22712
  await ctx.sendAsChat(`@${imgPath} ${description}`);
22706
22713
  }
22707
22714
  },
@@ -23908,7 +23915,7 @@ Try: /compact to reduce context, /clear to reset, or switch to a larger-context
23908
23915
  });
23909
23916
  if (decision.kind === "save") {
23910
23917
  try {
23911
- mkdirSync15(dirname10(target), { recursive: true });
23918
+ mkdirSync15(dirname11(target), { recursive: true });
23912
23919
  atomicWriteFileSync(target, decision.body);
23913
23920
  undoStack.push(target, `save_last_response (deferred): ${target}`);
23914
23921
  const lines = decision.body.split("\n").length;
@@ -24086,7 +24093,7 @@ ${summaryContent}`,
24086
24093
  let isError = false;
24087
24094
  let summary;
24088
24095
  try {
24089
- mkdirSync15(dirname10(saveToFile), { recursive: true });
24096
+ mkdirSync15(dirname11(saveToFile), { recursive: true });
24090
24097
  fileStream = createWriteStream2(saveToFile);
24091
24098
  const teeSystemPrompt = stripToolCallReminder(systemPrompt ?? "") + CONTENT_ONLY_STREAM_REMINDER;
24092
24099
  const teeExtraMessages = extraMessages.length > 0 ? [...extraMessages, { role: "user", content: TEE_FINAL_USER_NUDGE }] : [{ role: "user", content: TEE_FINAL_USER_NUDGE }];
@@ -25121,7 +25128,7 @@ function getModuleDir() {
25121
25128
  if (typeof import.meta?.url === "string") {
25122
25129
  const url = new URL(import.meta.url);
25123
25130
  const filePath = url.pathname.replace(/^\/([A-Z]:)/i, "$1");
25124
- return dirname11(filePath);
25131
+ return dirname12(filePath);
25125
25132
  }
25126
25133
  } catch {
25127
25134
  }
@@ -158,7 +158,7 @@ ${content}`);
158
158
  }
159
159
  }
160
160
  async function runTaskMode(config, providers, configManager, topic) {
161
- const { TaskOrchestrator } = await import("./task-orchestrator-QHJEDRDS.js");
161
+ const { TaskOrchestrator } = await import("./task-orchestrator-EETPUWBK.js");
162
162
  const orchestrator = new TaskOrchestrator(config, providers, configManager);
163
163
  let interrupted = false;
164
164
  const onSigint = () => {
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  setupProxy,
25
25
  snapshotFile,
26
26
  stripRoutingTags
27
- } from "./chunk-4MO2I5JB.js";
27
+ } from "./chunk-SYK2TDKV.js";
28
28
  import {
29
29
  CostTracker,
30
30
  getPricing,
@@ -47,7 +47,7 @@ import {
47
47
  setMaxOutputCap,
48
48
  spawnAgentContext,
49
49
  undoStack
50
- } from "./chunk-6RCGQQFM.js";
50
+ } from "./chunk-ZSR2UIRD.js";
51
51
  import "./chunk-HLWUDRBO.js";
52
52
  import {
53
53
  NO_THINKING,
@@ -60,7 +60,7 @@ import {
60
60
  countPendingMemories,
61
61
  detectStaleLegacyMarkdownEdit,
62
62
  formatMemoryForPrompt
63
- } from "./chunk-I3GEFCKP.js";
63
+ } from "./chunk-G46THFJN.js";
64
64
  import "./chunk-RWRZVQCB.js";
65
65
  import "./chunk-B3MPYI4E.js";
66
66
  import "./chunk-M6HLYG33.js";
@@ -81,14 +81,14 @@ import {
81
81
  import {
82
82
  loadContextFiles,
83
83
  writeCrashLog
84
- } from "./chunk-2GOBINY4.js";
84
+ } from "./chunk-HVVDGSUN.js";
85
85
  import {
86
86
  getActivePluginAssets,
87
87
  getPendingHookTrust,
88
88
  installFlushOnExit,
89
89
  mergePluginHooks,
90
90
  runLifecycleHooks
91
- } from "./chunk-VS43QMR2.js";
91
+ } from "./chunk-RO67VWKW.js";
92
92
  import "./chunk-RS7SKYTS.js";
93
93
  import {
94
94
  ProviderRegistry,
@@ -96,7 +96,7 @@ import {
96
96
  } from "./chunk-XVB4RARX.js";
97
97
  import {
98
98
  ConfigManager
99
- } from "./chunk-COHKPZ2E.js";
99
+ } from "./chunk-OR46O57D.js";
100
100
  import {
101
101
  CONTENT_ONLY_STREAM_REMINDER,
102
102
  TEE_FINAL_USER_NUDGE,
@@ -134,7 +134,7 @@ import {
134
134
  isInterrupted,
135
135
  requestInterrupt,
136
136
  resetInterrupt
137
- } from "./chunk-6XXHAS5B.js";
137
+ } from "./chunk-3TWEKDHH.js";
138
138
  import {
139
139
  AGENTIC_BEHAVIOR_GUIDELINE,
140
140
  AUTHOR,
@@ -152,7 +152,7 @@ import {
152
152
  SKILLS_DIR_NAME,
153
153
  VERSION,
154
154
  buildUserIdentityPrompt
155
- } from "./chunk-2R6Y5SJH.js";
155
+ } from "./chunk-ZUONW7FS.js";
156
156
  import "./chunk-SXIJLSVF.js";
157
157
 
158
158
  // src/index.ts
@@ -4116,7 +4116,7 @@ program.command("web").description("Start Web UI server with browser-based chat
4116
4116
  console.error("Error: Invalid port number. Must be between 1 and 65535.");
4117
4117
  process.exit(1);
4118
4118
  }
4119
- const { startWebServer } = await import("./server-VOGBRYA5.js");
4119
+ const { startWebServer } = await import("./server-XGY6OUUT.js");
4120
4120
  await startWebServer({ port, host: options.host, externalOrigin: options.externalOrigin });
4121
4121
  });
4122
4122
  program.command("user [action] [username]").description("Manage Web UI users (list | create <name> | delete <name> | reset-password <name> | logout-all <name> | migrate <name>)").action(async (action, username) => {
@@ -4283,11 +4283,11 @@ program.command("sessions").description("List recent conversation sessions").opt
4283
4283
  console.log(footer + "\n");
4284
4284
  });
4285
4285
  program.command("usage").description("Show token + cost usage grouped by provider/model (cross-session)").option("--days <n>", "Only the last N days (inclusive of today)").option("--month <ym>", "Only a specific month, format YYYY-MM (e.g. 2026-06)").option("--json", "Output as JSON (for scripting)").action(async (options) => {
4286
- const { runUsageCli } = await import("./usage-EZOW27TR.js");
4286
+ const { runUsageCli } = await import("./usage-BVHFDNRW.js");
4287
4287
  await runUsageCli(options);
4288
4288
  });
4289
4289
  program.command("doctor").description("Health check: API keys, config, MCP, recent crashes, tool usage, disk usage").option("--json", "Output as JSON (for scripting)").option("--reset-stats", "Reset accumulated tool usage statistics").action(async (options) => {
4290
- const { runDoctorCli } = await import("./doctor-cli-QAKYBWLG.js");
4290
+ const { runDoctorCli } = await import("./doctor-cli-KJT5HMQB.js");
4291
4291
  const argv = process.argv.slice(2);
4292
4292
  await runDoctorCli({
4293
4293
  json: !!options.json || argv.includes("--json"),
@@ -4296,7 +4296,7 @@ program.command("doctor").description("Health check: API keys, config, MCP, rece
4296
4296
  });
4297
4297
  program.command("batch <action> [arg] [arg2]").description("Anthropic Message Batches: submit | list | status <id> | results <id> [out] | cancel <id>").option("--dry-run", "Parse and validate input without submitting (submit only)").action(async (action, arg, arg2, options) => {
4298
4298
  try {
4299
- const batch = await import("./batch-EW6QTSE6.js");
4299
+ const batch = await import("./batch-IMC6Q63Y.js");
4300
4300
  switch (action) {
4301
4301
  case "submit":
4302
4302
  if (!arg) {
@@ -4339,7 +4339,7 @@ program.command("batch <action> [arg] [arg2]").description("Anthropic Message Ba
4339
4339
  }
4340
4340
  });
4341
4341
  program.command("mcp-serve").description("Start an MCP server over STDIO, exposing aicli's built-in tools to Claude Desktop / Cursor / other MCP clients").option("--allow-destructive", "Allow bash / run_interactive / task_create (always destructive in MCP mode)").option("--allow-outside-cwd", "Allow tool path arguments to escape the sandbox root \u2014 disabled by default").option("--tools <list>", "Comma-separated whitelist of tools to expose (default: all eligible tools)").option("--cwd <path>", "Working directory AND sandbox root (default: current directory)").action(async (options) => {
4342
- const { startMcpServer } = await import("./server-AF5PIBUD.js");
4342
+ const { startMcpServer } = await import("./server-GFL7MYAP.js");
4343
4343
  await startMcpServer({
4344
4344
  allowDestructive: !!options.allowDestructive,
4345
4345
  allowOutsideCwd: !!options.allowOutsideCwd,
@@ -4352,7 +4352,7 @@ program.command("pr <action> [target]").description("PR review helpers: review |
4352
4352
  console.error(`Unknown pr action: ${action}. Use review | security-review | summarize.`);
4353
4353
  process.exit(1);
4354
4354
  }
4355
- const { runPrCli } = await import("./pr-XPQVXG2G.js");
4355
+ const { runPrCli } = await import("./pr-BU2FN7CO.js");
4356
4356
  const result = await runPrCli({
4357
4357
  action,
4358
4358
  target,
@@ -4372,8 +4372,8 @@ program.command("pr <action> [target]").description("PR review helpers: review |
4372
4372
  process.exit(result.exitCode);
4373
4373
  });
4374
4374
  program.command("ci").description("Headless PR review (code + security) \u2014 reads git/gh diff, optionally posts to PR. Designed for GitHub Actions.").option("--pr <num>", "PR number or URL; diff fetched via gh pr diff <value>", (v) => /^#?\d+$/.test(v) ? parseInt(v.replace(/^#/, ""), 10) : v).option("--base <ref>", "Base ref for git diff <ref>...HEAD (ignored when --pr set)").option("--post", "Post review as a PR comment (requires gh CLI + GH_TOKEN, needs --pr)").option("--no-update", "Always create a new comment instead of updating the previous aicli review").option("--skip-code", "Skip the code review section").option("--skip-security", "Skip the security review section").option("--detailed", "Use the detailed code-review prompt").option("--max-diff <n>", "Max diff chars sent to the model (default 30000)", (v) => parseInt(v, 10)).option("--provider <id>", "Override provider (default: config.defaultProvider)").option("--model <id>", "Override model").option("--dry-run", "Print result to stdout instead of posting (overrides --post)").option("--json", "Output a structured JSON report").option("--markdown", "Output Markdown report (default)").option("--sarif", "Output SARIF 2.1.0 for code scanning artifacts").option("--fail-on-security-high", "Fail when the security review contains HIGH/CRITICAL findings (default)").option("--no-fail-on-security-high", "Do not fail on security HIGH/CRITICAL findings").option("--fail-on-test-failure", "Fail when the report mentions test failures (default)").option("--no-fail-on-test-failure", "Do not fail on test failure findings").option("--fail-on-lint-failure", "Fail when the report mentions lint/typecheck failures (default)").option("--no-fail-on-lint-failure", "Do not fail on lint/typecheck failure findings").action(async (options) => {
4375
- const { runCi } = await import("./ci-EZZD7CMS.js");
4376
- const { formatCiResult } = await import("./ci-format-ZWECV6XI.js");
4375
+ const { runCi } = await import("./ci-74EPK5JN.js");
4376
+ const { formatCiResult } = await import("./ci-format-QADWGCX7.js");
4377
4377
  const formats = [options.json, options.markdown, options.sarif].filter(Boolean).length;
4378
4378
  if (formats > 1) {
4379
4379
  console.error("Choose only one output format: --json, --markdown, or --sarif.");
@@ -4532,7 +4532,7 @@ program.command("hub [topic]").description("Start multi-agent hub (discuss / bra
4532
4532
  config.get("customProviders"),
4533
4533
  config.getConfigDir()
4534
4534
  );
4535
- const { startHub } = await import("./hub-OYH2UGER.js");
4535
+ const { startHub } = await import("./hub-5CPMJQVG.js");
4536
4536
  await startHub(
4537
4537
  {
4538
4538
  topic: topic ?? "",
@@ -28,11 +28,11 @@ import {
28
28
  touchMemoryReferences,
29
29
  updateMemoryApproval,
30
30
  updateMemoryEntry
31
- } from "./chunk-I3GEFCKP.js";
31
+ } from "./chunk-G46THFJN.js";
32
32
  import "./chunk-3FEZSLGI.js";
33
33
  import "./chunk-HOSJZMQS.js";
34
34
  import "./chunk-BMLQPSHP.js";
35
- import "./chunk-2R6Y5SJH.js";
35
+ import "./chunk-ZUONW7FS.js";
36
36
  export {
37
37
  addMemoryEntry,
38
38
  backupMemoryStore,
@@ -27,11 +27,11 @@ import {
27
27
  touchMemoryReferences,
28
28
  updateMemoryApproval,
29
29
  updateMemoryEntry
30
- } from "./chunk-7QW3DFYV.js";
30
+ } from "./chunk-NX72SBGU.js";
31
31
  import "./chunk-FSC6KEWU.js";
32
32
  import "./chunk-2XMUCC42.js";
33
33
  import "./chunk-CGLYJRFA.js";
34
- import "./chunk-VEO2MILP.js";
34
+ import "./chunk-X5ZC4TI4.js";
35
35
  export {
36
36
  addMemoryEntry,
37
37
  backupMemoryStore,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  countSeverity,
4
4
  runCi
5
- } from "./chunk-ZDO3XCXL.js";
6
- import "./chunk-LEA4AMXE.js";
5
+ } from "./chunk-FHBV5EUM.js";
6
+ import "./chunk-W7D4M4KV.js";
7
7
  import {
8
8
  buildReviewPrompt,
9
9
  buildSecurityReviewPrompt,
@@ -17,13 +17,13 @@ import {
17
17
  } from "./chunk-XVB4RARX.js";
18
18
  import {
19
19
  ConfigManager
20
- } from "./chunk-COHKPZ2E.js";
20
+ } from "./chunk-OR46O57D.js";
21
21
  import "./chunk-E2W2MI6H.js";
22
22
  import "./chunk-TU3L3PW7.js";
23
23
  import "./chunk-BMLQPSHP.js";
24
24
  import {
25
25
  VERSION
26
- } from "./chunk-2R6Y5SJH.js";
26
+ } from "./chunk-ZUONW7FS.js";
27
27
 
28
28
  // src/cli/pr.ts
29
29
  import { execFileSync } from "child_process";
@@ -2,9 +2,9 @@ import {
2
2
  executeTests,
3
3
  runTestProcess,
4
4
  runTestsTool
5
- } from "./chunk-JHSULP5D.js";
5
+ } from "./chunk-RSWCASRV.js";
6
6
  import "./chunk-QMFMST2T.js";
7
- import "./chunk-VEO2MILP.js";
7
+ import "./chunk-X5ZC4TI4.js";
8
8
  export {
9
9
  executeTests,
10
10
  runTestProcess,
@@ -3,8 +3,8 @@ import {
3
3
  executeTests,
4
4
  runTestProcess,
5
5
  runTestsTool
6
- } from "./chunk-6XXHAS5B.js";
7
- import "./chunk-2R6Y5SJH.js";
6
+ } from "./chunk-3TWEKDHH.js";
7
+ import "./chunk-ZUONW7FS.js";
8
8
  import "./chunk-SXIJLSVF.js";
9
9
  export {
10
10
  executeTests,
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ToolRegistry
4
- } from "./chunk-6RCGQQFM.js";
4
+ } from "./chunk-ZSR2UIRD.js";
5
5
  import "./chunk-6JHACXB3.js";
6
- import "./chunk-I3GEFCKP.js";
6
+ import "./chunk-G46THFJN.js";
7
7
  import "./chunk-RWRZVQCB.js";
8
8
  import "./chunk-B3MPYI4E.js";
9
9
  import "./chunk-M6HLYG33.js";
@@ -14,7 +14,7 @@ import "./chunk-JL44HGZC.js";
14
14
  import "./chunk-3FEZSLGI.js";
15
15
  import {
16
16
  runTool
17
- } from "./chunk-VS43QMR2.js";
17
+ } from "./chunk-RO67VWKW.js";
18
18
  import "./chunk-RS7SKYTS.js";
19
19
  import {
20
20
  getDangerLevel,
@@ -24,10 +24,10 @@ import "./chunk-TU3L3PW7.js";
24
24
  import "./chunk-HOSJZMQS.js";
25
25
  import "./chunk-BMLQPSHP.js";
26
26
  import "./chunk-JJFJWD35.js";
27
- import "./chunk-6XXHAS5B.js";
27
+ import "./chunk-3TWEKDHH.js";
28
28
  import {
29
29
  VERSION
30
- } from "./chunk-2R6Y5SJH.js";
30
+ } from "./chunk-ZUONW7FS.js";
31
31
  import "./chunk-SXIJLSVF.js";
32
32
 
33
33
  // src/mcp/server.ts
@@ -86,7 +86,7 @@ import {
86
86
  skillHistoryNote,
87
87
  snapshotFile,
88
88
  stripRoutingTags
89
- } from "./chunk-4MO2I5JB.js";
89
+ } from "./chunk-SYK2TDKV.js";
90
90
  import {
91
91
  CNY_PER_USD,
92
92
  CostTracker,
@@ -130,7 +130,7 @@ import {
130
130
  spawnAgentContext,
131
131
  truncateOutput,
132
132
  undoStack
133
- } from "./chunk-6RCGQQFM.js";
133
+ } from "./chunk-ZSR2UIRD.js";
134
134
  import {
135
135
  buildReviewPrompt,
136
136
  buildSecurityReviewPrompt
@@ -157,7 +157,7 @@ import {
157
157
  restoreMemoryEntries,
158
158
  updateMemoryApproval,
159
159
  updateMemoryEntry
160
- } from "./chunk-I3GEFCKP.js";
160
+ } from "./chunk-G46THFJN.js";
161
161
  import "./chunk-RWRZVQCB.js";
162
162
  import "./chunk-B3MPYI4E.js";
163
163
  import "./chunk-M6HLYG33.js";
@@ -176,7 +176,7 @@ import {
176
176
  buildDoctorReport,
177
177
  formatDoctorReport,
178
178
  loadContextFiles
179
- } from "./chunk-2GOBINY4.js";
179
+ } from "./chunk-HVVDGSUN.js";
180
180
  import {
181
181
  describePlugin,
182
182
  getActivePluginAssets,
@@ -191,14 +191,14 @@ import {
191
191
  runTool,
192
192
  setPluginEnabled,
193
193
  trustPlugin
194
- } from "./chunk-VS43QMR2.js";
194
+ } from "./chunk-RO67VWKW.js";
195
195
  import "./chunk-RS7SKYTS.js";
196
196
  import {
197
197
  ProviderRegistry
198
198
  } from "./chunk-XVB4RARX.js";
199
199
  import {
200
200
  ConfigManager
201
- } from "./chunk-COHKPZ2E.js";
201
+ } from "./chunk-OR46O57D.js";
202
202
  import {
203
203
  CONTENT_ONLY_STREAM_REMINDER,
204
204
  TEE_FINAL_USER_NUDGE,
@@ -231,7 +231,7 @@ import {
231
231
  import {
232
232
  assertReadablePath
233
233
  } from "./chunk-JJFJWD35.js";
234
- import "./chunk-6XXHAS5B.js";
234
+ import "./chunk-3TWEKDHH.js";
235
235
  import {
236
236
  AGENTIC_BEHAVIOR_GUIDELINE,
237
237
  AUTHOR,
@@ -247,7 +247,7 @@ import {
247
247
  SKILLS_DIR_NAME,
248
248
  VERSION,
249
249
  buildUserIdentityPrompt
250
- } from "./chunk-2R6Y5SJH.js";
250
+ } from "./chunk-ZUONW7FS.js";
251
251
  import {
252
252
  runWithExecutionContext,
253
253
  runWithSessionKey
@@ -978,7 +978,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
978
978
  Cost: ${formatCost(cost)}` : "";
979
979
  let memoryLine = "";
980
980
  try {
981
- const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-WNPZSVE4.js");
981
+ const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-BOUJARIV.js");
982
982
  const pending = countPendingMemories2(ctx.config.getConfigDir());
983
983
  if (pending > 0) memoryLine = `
984
984
  Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
@@ -1907,7 +1907,7 @@ async function handleTest(args, ctx) {
1907
1907
  const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
1908
1908
  testArgs = isCommand ? { command: argStr } : { filter: argStr };
1909
1909
  }
1910
- const runTests = ctx.runTests ?? (await import("./run-tests-MFXQ76ZJ.js")).executeTests;
1910
+ const runTests = ctx.runTests ?? (await import("./run-tests-WJJW77HK.js")).executeTests;
1911
1911
  const report = await runTests(testArgs);
1912
1912
  ctx.send({ type: "info", message: report });
1913
1913
  } catch (err) {
@@ -2183,7 +2183,7 @@ async function handleMemory(args, ctx) {
2183
2183
  }
2184
2184
  if (intent.kind === "status") {
2185
2185
  const { getChatIndexStatus } = await import("./chat-index-7CLR4CBG.js");
2186
- const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-WNPZSVE4.js");
2186
+ const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-BOUJARIV.js");
2187
2187
  const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
2188
2188
  const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
2189
2189
  const view = buildMemoryStatusView({
@@ -2206,7 +2206,7 @@ async function handleMemory(args, ctx) {
2206
2206
  return;
2207
2207
  }
2208
2208
  if (intent.kind === "recall") {
2209
- const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-WNPZSVE4.js");
2209
+ const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-BOUJARIV.js");
2210
2210
  const { searchChatMemory } = await import("./chat-index-7CLR4CBG.js");
2211
2211
  const persistentHits = searchPersistentMemories(configDir, intent.query, process.cwd(), 3);
2212
2212
  if (persistentHits.length > 0) {
@@ -2327,7 +2327,7 @@ async function handleMemory(args, ctx) {
2327
2327
  ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
2328
2328
  } else if (intent.kind === "export") {
2329
2329
  if (args[1] === "md") {
2330
- const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-WNPZSVE4.js");
2330
+ const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-BOUJARIV.js");
2331
2331
  ctx.send({
2332
2332
  type: "export_data",
2333
2333
  format: "md",
@@ -4,9 +4,9 @@ import {
4
4
  googleSearchContext,
5
5
  isToolCapableProvider,
6
6
  truncateOutput
7
- } from "./chunk-6RCGQQFM.js";
7
+ } from "./chunk-ZSR2UIRD.js";
8
8
  import "./chunk-6JHACXB3.js";
9
- import "./chunk-I3GEFCKP.js";
9
+ import "./chunk-G46THFJN.js";
10
10
  import "./chunk-RWRZVQCB.js";
11
11
  import "./chunk-B3MPYI4E.js";
12
12
  import "./chunk-M6HLYG33.js";
@@ -17,7 +17,7 @@ import "./chunk-JL44HGZC.js";
17
17
  import "./chunk-3FEZSLGI.js";
18
18
  import {
19
19
  runTool
20
- } from "./chunk-VS43QMR2.js";
20
+ } from "./chunk-RO67VWKW.js";
21
21
  import "./chunk-RS7SKYTS.js";
22
22
  import {
23
23
  getDangerLevel,
@@ -29,10 +29,10 @@ import {
29
29
  atomicWriteFileSync
30
30
  } from "./chunk-BMLQPSHP.js";
31
31
  import "./chunk-JJFJWD35.js";
32
- import "./chunk-6XXHAS5B.js";
32
+ import "./chunk-3TWEKDHH.js";
33
33
  import {
34
34
  SUBAGENT_ALLOWED_TOOLS
35
- } from "./chunk-2R6Y5SJH.js";
35
+ } from "./chunk-ZUONW7FS.js";
36
36
  import "./chunk-SXIJLSVF.js";
37
37
 
38
38
  // src/hub/task-orchestrator.ts
@@ -9,10 +9,10 @@ import {
9
9
  import "./chunk-RS7SKYTS.js";
10
10
  import {
11
11
  ConfigManager
12
- } from "./chunk-COHKPZ2E.js";
12
+ } from "./chunk-OR46O57D.js";
13
13
  import "./chunk-TU3L3PW7.js";
14
14
  import "./chunk-BMLQPSHP.js";
15
- import "./chunk-2R6Y5SJH.js";
15
+ import "./chunk-ZUONW7FS.js";
16
16
 
17
17
  // src/cli/usage.ts
18
18
  function classifyRowCost(row) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jinzd-ai-cli",
3
- "version": "0.4.321",
3
+ "version": "0.4.322",
4
4
  "description": "Cross-platform REPL-style AI CLI with multi-provider support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,6 +21,7 @@
21
21
  "test:providers": "vitest run --config vitest.providers.config.ts tests/integration/provider-smoke.test.ts",
22
22
  "test:watch": "vitest",
23
23
  "test:coverage": "vitest run --coverage",
24
+ "test:load-bearing": "node scripts/load-bearing.mjs",
24
25
  "test:dist": "npm run build && vitest run tests/unit/cli/version-drift.test.ts",
25
26
  "typecheck": "tsc --noEmit",
26
27
  "lint": "eslint src --max-warnings=0",
@@ -132,7 +133,7 @@
132
133
  "overrides": {
133
134
  "adm-zip": "0.6.1",
134
135
  "esbuild": "0.28.1",
135
- "fast-uri": "3.1.7",
136
+ "fast-uri": "3.1.8",
136
137
  "js-yaml": "4.3.2",
137
138
  "nanoid": "3.3.18",
138
139
  "qs": "6.16.0",