xuanzhu 0.2.0 → 0.4.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.
Files changed (52) hide show
  1. package/README.md +230 -5
  2. package/dist/cli.js +627 -213
  3. package/dist/skills/autojs6/SKILL.md +129 -0
  4. package/dist/skills/autojs6/references/api.md +111 -0
  5. package/dist/skills/autojs6/references/input.md +70 -0
  6. package/dist/skills/autojs6/references/patterns.md +136 -0
  7. package/dist/skills/autojs6/references/screenshot.md +68 -0
  8. package/dist/skills/autojs6/references/troubleshooting.md +31 -0
  9. package/dist/skills/aws/SKILL.md +3 -34
  10. package/dist/skills/datadog/SKILL.md +10 -194
  11. package/dist/skills/datadog/references/commands.md +155 -0
  12. package/dist/skills/datadog/references/datadog-ci.md +19 -0
  13. package/dist/skills/elasticsearch/SKILL.md +4 -24
  14. package/dist/skills/email/SKILL.md +7 -28
  15. package/dist/skills/github/SKILL.md +27 -36
  16. package/dist/skills/gitlab/SKILL.md +9 -32
  17. package/dist/skills/jira/SKILL.md +23 -35
  18. package/dist/skills/kubernetes/SKILL.md +2 -30
  19. package/dist/skills/linear/SKILL.md +2 -22
  20. package/dist/skills/mongodb/SKILL.md +3 -21
  21. package/dist/skills/mysql/SKILL.md +16 -37
  22. package/dist/skills/officecli/SKILL.md +10 -309
  23. package/dist/skills/officecli/references/element-types.md +12 -0
  24. package/dist/skills/officecli/references/l1-read.md +57 -0
  25. package/dist/skills/officecli/references/l2-edit.md +154 -0
  26. package/dist/skills/officecli/references/subskills.md +39 -0
  27. package/dist/skills/officecli/references/watch-selection.md +47 -0
  28. package/dist/skills/playwright/SKILL.md +15 -65
  29. package/dist/skills/playwright/references/browser-choice.md +52 -0
  30. package/dist/skills/playwright/references/node-script.md +22 -0
  31. package/dist/skills/postgres/SKILL.md +3 -13
  32. package/dist/skills/redis/SKILL.md +3 -26
  33. package/dist/skills/sentry/SKILL.md +3 -29
  34. package/dist/skills/telegram/SKILL.md +5 -85
  35. package/dist/skills/telegram/references/commands.md +68 -0
  36. package/docs/ARCHITECTURE.md +379 -13
  37. package/docs/README.en.md +214 -5
  38. package/package.json +7 -3
  39. package/dist/skills/elasticsearch/install.sh +0 -91
  40. package/dist/skills/gitlab/install.sh +0 -74
  41. package/dist/skills/gmail/README.md +0 -139
  42. package/dist/skills/gmail/SECURITY.md +0 -552
  43. package/dist/skills/gmail/SETUP.md +0 -258
  44. package/dist/skills/gmail/activate-gmail-cli.sh +0 -15
  45. package/dist/skills/gmail/generate-hashes.sh +0 -82
  46. package/dist/skills/gmail/gmail-cli-secure.py +0 -599
  47. package/dist/skills/gmail/install.sh +0 -313
  48. package/dist/skills/gmail/requirements.txt +0 -38
  49. package/dist/skills/gmail/skill.md +0 -225
  50. package/dist/skills/mysql/install.sh +0 -74
  51. package/dist/skills/postgres/install.sh +0 -73
  52. package/dist/skills/redis/install.sh +0 -39
package/README.md CHANGED
@@ -32,6 +32,21 @@ xzh # 启动
32
32
  - **默认全自动**:`autoApprove` 默认为 `true`,**所有工具都直接执行、不做任何确认** —— 包括写文件、执行命令、读取工作区之外的文件,以及读取凭据类文件(`~/.ssh`、`.env`、`~/.xzh/config.json` 等)。开箱即用,不打断。`/auto off` 可切换为写文件与执行命令逐项确认。
33
33
  - 如果希望读取凭据类文件时确认一次(防止密钥被读进上下文后转交给模型服务商),把 `confirmSensitiveRead` 设为 `true`,默认关闭。
34
34
  - **多轮自主执行**:自动串联工具调用完成任务,可随时 `Ctrl+C` 中断。
35
+ - **任务拆分**:3 步以上的复杂任务会先用 `todo_write` 列出计划并逐步更新,
36
+ 顶部信息区实时显示进度条(`任务 2/5` 与当前进行项)。
37
+ - **子代理协作(可并行)**:需要大范围调研(跨多个文件 / 目录 / 命名约定)时,用 `task`
38
+ 派生 `code-explorer` 子代理独立完成,**只把结论带回主对话** —— 中间过程不会挤占主上下文;
39
+ 改完代码后可派 `test-runner` 跑测试并带回「通过/失败清单 + 失败原因 + 可复跑命令」,
40
+ 测试日志同样不进主上下文。
41
+ 一轮里并列发出多个 `task` 时会**并发执行**(默认最多 4 个,见 `maxParallelAgents`)。
42
+ 子代理定义集中在 `src/subagents/`,可继续扩展。
43
+ - **长期记忆自动精简**:`MEMORY.md` 只追加、会越写越长;**达到阈值(默认 6000 字符)
44
+ 自动触发** —— 先去重,仍超限就裁剪最旧的条目(最新结论优先保留),无需模型同意。
45
+ - **图片输入**:`Ctrl+V`(或 `/image`)读取系统剪贴板里的图片作为附件发给模型,
46
+ 也支持拖拽图片文件路径;Linux / Windows / macOS 均可用。
47
+ - **手机设备桥**:把脚本推到手机上的 **AutoJs6** / AutoX.js 运行并回收日志,等价于 VSCode 插件的
48
+ `Run` / `Save`,但不需要 VSCode —— Agent 也能自己操作(`device_run` 等工具)。推荐 AutoJs6
49
+ (`xzh device connect <手机IP>`,手机开服务器模式);手机上的日志实时进右侧终端面板。
35
50
 
36
51
  ## 环境要求
37
52
 
@@ -145,7 +160,16 @@ xzh
145
160
  | `xzh config edit` | 使用 `nano` 编辑配置文件 |
146
161
  | `xzh config path` | 打印配置文件路径 |
147
162
  | `xzh config init` | 生成默认配置文件 |
148
- | `xzh setup` | 检查并自动安装技能依赖(playwright / officecli 等) |
163
+ | `xzh setup` | 检查并自动安装依赖(玄猪自身 + 技能:playwright / officecli / 剪贴板工具等) |
164
+ | `xzh skill` | 交互式管理技能:启用 / 禁用 / 删除(禁用的技能对模型不可见) |
165
+ | `xzh skill list` | 列出全部技能(来源与状态,含已禁用项) |
166
+ | `xzh skill enable/disable <名称>` | 启用 / 禁用技能 |
167
+ | `xzh skill delete <名称> [--yes]` | 删除技能(仅限用户技能;内置技能请用 disable) |
168
+ | `xzh device connect <手机IP>` | 连接手机上的 AutoJs6(服务器模式)并常驻 |
169
+ | `xzh device serve` | 反向:等手机上的 AutoX.js 连过来 |
170
+ | `xzh device run <文件>` | 把脚本推到手机并运行(`push` 则只保存不运行) |
171
+ | `xzh device logs` | 查看手机上的脚本日志 |
172
+ | `xzh device apk` | 该装哪个 AutoJs6 安装包、去哪里下载 |
149
173
  | `xzh --help` | 查看帮助 |
150
174
  | `xzh --version` | 查看版本 |
151
175
 
@@ -173,6 +197,8 @@ XZH_HOME=/path/to/dir xzh # 改用 /path/to/dir/config.json
173
197
  "temperature": 0.2,
174
198
  "maxToolRounds": 200,
175
199
  "autoApprove": true,
200
+ "memoryMaxChars": 6000,
201
+ "maxParallelAgents": 4,
176
202
  "intent": { "enabled": false },
177
203
  "providers": {
178
204
  "deepseek": {
@@ -206,6 +232,7 @@ xzh model all # 查看所有内置可用模型
206
232
  xzh model add openai gpt-4o 20 # 新增(权重 20)
207
233
  xzh model weight openai/gpt-4o 5 # 调整权重
208
234
  xzh model context openai/gpt-4o 128000 # 调整上下文窗口(留空则自动推断)
235
+ xzh model vision openai/gpt-4o on # 标注支持图片输入(推断不出来时用)
209
236
  xzh model remove openai/gpt-4o # 删除(id / 模型名 / 序号均可)
210
237
  xzh model reset # 全部恢复默认权重
211
238
  ```
@@ -230,6 +257,11 @@ xzh model reset # 全部恢复默认权重
230
257
  > 裁剪依据是**估算**的 token 数(中文约 1 字符/token,英文与代码约 3.5 字符/token),
231
258
  > 不依赖 tokenizer,属保守近似。项目规则(`.xuanzhu/rules.md`)与 `systemPromptExtra`
232
259
  > 会全文进入系统提示词,写得过长会挤占历史额度 —— 占去窗口一半以上时界面会给出提示。
260
+ >
261
+ > 估算偏差还会被**真实用量回填**逐步校正:每次请求结束后,玄猪拿服务端返回的
262
+ > **实际 prompt token 数**与本次估算相比,发现系统性偏低(实际比估的多)就把下一次的
263
+ > 历史额度相应收紧,而不是等到撞上 400 才补救。估算偏高时**不做调整** ——
264
+ > 保守余量必须留住(放宽反而更容易撞窗口)。
233
265
 
234
266
  若估算偏差导致仍然超限(服务端返回 `context_length_exceeded` 一类错误),玄猪会
235
267
  **把预算收敛到一半再自动重试一次**,而不会把它当成模型故障去降权或切换模型 ——
@@ -294,7 +326,10 @@ API Key 也可以来自环境变量,优先级低于配置文件:
294
326
  | `list_skills` | 列出玄猪可用的全部技能 | 否 |
295
327
  | `load_skill` | 加载指定技能的完整指南 | 否 |
296
328
  | `memory_read` | 读取项目记忆(长期记忆 + 最近日志) | 否 |
297
- | `memory_write` | 写入项目记忆(长期记忆 / 当日日志) | 否 |
329
+ | `memory_write` | 写入项目记忆(长期记忆 / 当日日志),长期记忆超限时自动精简 | 否 |
330
+ | `memory_compact` | 用精简后的完整内容重写长期记忆(语义压缩) | 否 |
331
+ | `todo_write` | 创建 / 更新任务列表(每次提交完整列表) | 否 |
332
+ | `task` | 派生子代理(默认 `code-explorer`)执行子任务,只返回结论;一轮内多个调用**并行**执行 | 否 |
298
333
  | `read_file` | 读取文件(带行号,支持偏移与行数限制) | 否 |
299
334
  | `list_dir` | 列出目录内容 | 否 |
300
335
  | `glob` | 按 `**` / `*` / `?` 模式查找文件 | 否 |
@@ -302,6 +337,188 @@ API Key 也可以来自环境变量,优先级低于配置文件:
302
337
  | `write_file` | 覆盖写入文件 | 是 |
303
338
  | `edit_file` | 精确文本替换 | 是 |
304
339
  | `bash` | 执行 shell 命令 | 是 |
340
+ | `device_list` | 列出已连接的手机设备 | 否 |
341
+ | `device_push` | 把脚本保存到手机(不运行) | 是 |
342
+ | `device_run` | 把脚本推到手机并立即运行 | 是 |
343
+ | `device_stop` | 停止手机上的脚本(默认全部) | 是 |
344
+ | `device_logs` | 读取手机上的脚本日志 | 否 |
345
+
346
+ ## 任务拆分与子代理
347
+
348
+ **任务拆分**:任务需要 3 步以上、或用户一次提出多项要求时,玄猪会先用 `todo_write`
349
+ 把计划写成结构化列表,每完成一步就更新状态。列表显示在顶部信息区(`任务 2/5` +
350
+ 进行中项),比"它说自己做到哪了"更可靠。
351
+
352
+ **子代理**:`task` 工具会**新建一个独立的 Agent 实例**去完成一件子任务,只有最终结论
353
+ 回到主对话。用途是把"翻几十个文件"这类调研的中间过程隔离出去,避免主上下文被塞满。
354
+
355
+ **并行执行**:一轮回复里并列发出**多个** `task` 调用时,这些子代理会**并发运行**,
356
+ 结果按原调用顺序回灌 —— 多路调研的总耗时取决于最慢的一路,而不是各条相加。
357
+ 并发上限由 `maxParallelAgents`(默认 `4`)控制,设为 `1` 即退化为串行;硬上限 16。
358
+ 有先后依赖的任务应分轮发起(下一轮才能看到上一轮结论)。
359
+
360
+ > 只有声明了 `parallelSafe` 的工具会进入并行批次(目前仅 `task`)。写文件、编辑、
361
+ > 执行命令这类工具有副作用且可能互相依赖,始终按顺序串行执行,不会被并行化。
362
+
363
+ 内置一个子代理,通过 `subagent_name` 指定(默认即它):
364
+
365
+ | 子代理 | 能力 | 何时用 |
366
+ | --- | --- | --- |
367
+ | `code-explorer` | **只读**(`read_file` / `list_dir` / `glob` / `grep` / `list_skills` / `load_skill`) | 跨多个文件、目录或命名约定的搜索;单次 `read_file` / `grep` 覆盖不了的探索 |
368
+
369
+ `task` 的参数:
370
+
371
+ | 参数 | 说明 |
372
+ | --- | --- |
373
+ | `description` | 子任务的一句话说明(界面显示 + 结果摘要) |
374
+ | `prompt` | 交给子代理的完整任务描述。**子代理看不到主对话**,必须自包含;`code-explorer` 还应在其中写明探索力度(`quick` / `medium` / `very thorough`) |
375
+ | `subagent_name` | 要派生的子代理名称,默认 `code-explorer` |
376
+
377
+ 约束:子代理恒不提供 `task`(禁止无界递归)、`todo_write` 与 `memory_write` / `memory_compact`
378
+ (任务列表与记忆由主代理统一维护)。它的工具活动以 `[code-explorer: <任务说明>]` 前缀显示在
379
+ 输出区 —— 并行时会交错,前缀里的任务说明用于区分是谁在输出;危险操作确认仍会转发给你
380
+ (并行时多个确认会**排队**逐个弹出,不会互相覆盖)。
381
+
382
+ > **扩展新的子代理**:在 `src/subagents/` 下实现 `SubAgentDefinition`(名称、给主代理看的
383
+ > 描述、工具白名单、系统提示词),再加进 `src/subagents/index.ts` 的 `SUBAGENTS` 数组即可。
384
+ > `task` 的参数枚举、可用工具与提示词都会自动跟随,无需改别处。
385
+
386
+ **触发时机不需要配置**:`task` 与其他工具一样**每次请求都会发给模型**(没有开关)。
387
+ 但只靠提示词写「大范围调研时用它」是不够的 —— 模型判定不了「多大算大」,实测就是不调用。
388
+ 因此除了把触发条件写成可判定的阈值("预计要读 3 个以上文件 / 要反复 glob grep"),还加了一道
389
+ **确定性提醒**:当本轮只读调研累计达到 **8 次**或 **4 万字符**时,会在工具结果末尾追加一条
390
+ `[系统提醒]`(整轮只提醒一次,已在用子代理时不提醒),把「该委托了」直接摆到模型面前。
391
+
392
+ 想确认某个工具到底有没有发出去:`/tools` 会列出本轮发给模型的全部工具及其说明。
393
+
394
+ **长期记忆自动精简**:`MEMORY.md` 只追加、会无界增长,而它每次启动都要注入提示词。
395
+ 因此**达到 `memoryMaxChars`(默认 6000)就自动触发**,不需要模型同意:
396
+
397
+ - 先去除正文完全相同的重复块(无损);
398
+ - 仍超限则**从最旧的块开始裁剪**(最新的结论优先保留);
399
+ - 触发时机:会话启动、`/switch` 切换目录、以及每次 `memory_write`(scope=long)之后;
400
+ 精简结果会在输出区提示(如"长期记忆已自动精简(去除 2 条重复记录、裁剪 1 条最旧记录)")。
401
+ - 设 `memoryMaxChars: 0` 表示不限制长度(此时只去重、不裁剪)。
402
+ - 自动裁剪无法解决"单条记录本身过长"(再裁就整条丢),这种情况会在提示词里要求模型用
403
+ `memory_compact` 做语义压缩。
404
+
405
+ ## 图片输入(Ctrl+V)
406
+
407
+ 在输入框按 **Ctrl+V**(或 `/image`、`/paste`)会把**系统剪贴板里的图片**加为本轮附件,
408
+ 输入框显示 `[图片1]` 占位;回车连同正文一起发给模型。退格删掉占位即取消该图片。
409
+
410
+ > **为什么不能"直接右键粘贴"**:终端与程序之间只有字节流,粘贴只能传**文本** ——
411
+ > 剪贴板里只有图片时,绝大多数终端在粘贴时**什么都不发送**,程序无从感知。
412
+ > 所以改由玄猪**主动读取系统剪贴板**。
413
+
414
+ | 平台 | 用到的工具 | 缺依赖时 |
415
+ | --- | --- | --- |
416
+ | Linux | `wl-paste`(Wayland,`wl-clipboard` 包)或 `xclip`(X11) | **自动安装**(弹一次确认;支持 apt / dnf / yum / pacman / zypper / apk) |
417
+ | Windows | 内置 PowerShell | 无需安装 |
418
+ | macOS | `pngpaste`,否则内置 `osascript` | 无需安装(有内置退路) |
419
+
420
+ Linux 上缺少剪贴板工具时,Ctrl+V 会**弹出确认框并自动安装**(会临时离开界面,以便输入 sudo
421
+ 密码,装完自动回到界面)。也可以提前一次性装好:`xzh setup`(同时覆盖玄猪自身依赖与技能 CLI)。
422
+
423
+ - 终端把 Ctrl+V 当成自己的粘贴键时(如 Windows Terminal),`\x16` 到不了玄猪 —— 改用 `/image`。
424
+ - 剪贴板里没有图片时会**退化为普通文本粘贴**,不会吞掉内容。
425
+ - **拖拽图片文件到终端**同样支持:只要某一行**只有一个图片文件路径**,提交时会自动转成附件。
426
+ 这条通路不依赖任何终端协议,覆盖面最广。
427
+ - 单张图片上限 **5 MB**;超过则忽略并提示。
428
+ - **模型必须支持视觉**:`glm-4v` / `qwen-vl` / `gpt-4o` / `claude` / `gemini` 等。
429
+ `xzh model list` 会给支持的模型标上「视觉」;推断不出来时用
430
+ `xzh model vision <id> on` 手动标注。模型不支持时玄猪会**拒绝附加**,
431
+ 而不是发出去换一个 400(那会把整轮正文一起作废)。
432
+ - **自定义端点默认按"支持图片"处理**:`custom` provider 的模型名由你自己填,
433
+ 按名字推断必然失效 —— 若也拒绝,等于"自定义模型永远用不了图片"。
434
+ 若该端点其实不支持,请求会被服务端拒绝,此时玄猪会**识别出来并自动去掉图片重试一次**,
435
+ 你的正文不会被作废,并提示你 `xzh model vision <id> off` 彻底关掉(避免每次都白试一次)。
436
+ `xzh model add` 会就这一点询问一次,也可以用第 5 个位置参数直接指定:
437
+ `xzh model add custom my-model 10 128000 off`。
438
+ - 图片只在**本轮**随请求发送;历史里的旧图片会自动降级为 `[图片已省略:image/png]`,
439
+ 避免 base64 把上下文撑爆。
440
+
441
+ ## 手机设备桥(AutoJs6 / AutoX.js)
442
+
443
+ 把脚本推到**手机**上运行、并把手机上的输出收回来 —— 相当于 VSCode 插件
444
+ Auto.js-Autox.js-VSCodeExt 的 `Run` / `Save` / 日志面板,但不需要 VSCode,
445
+ 而且 **Agent 也能自己操作**(`device_run` / `device_logs` 等工具)。
446
+
447
+ 支持两种手机端 App,**推荐 AutoJs6**:
448
+
449
+ | 手机端 | 连接方向 | 说明 |
450
+ | --- | --- | --- |
451
+ | **AutoJs6**(推荐) | 手机 → xzh | 手机点「连接电脑 → **客户端模式**」填 xzh 打印的地址(默认 `6347`)。**这是手机端 UI 支持最好的方向**,也是 AutoJs6 官方 VSCode 扩展走的那条路 —— 等于用 xzh 顶替那个扩展 |
452
+ | AutoJs6(备选) | xzh → 手机 | 手机开「连接电脑 → 服务器模式」(`7347`),再 `xzh device connect <手机IP>` |
453
+ | AutoX.js | 手机 → xzh | `xzh device serve` 监听 `9317`,手机端填 xzh 打印的 `ws://` 地址 |
454
+
455
+ 两者可以**同时连在同一个 xzh 上**(一次推送会同时到达全部设备),指令按各自协议分别编码。
456
+
457
+ ```bash
458
+ xzh device serve # 常驻:同时监听 AutoJs6(6347) 与 AutoX.js(9317),等手机连过来
459
+ xzh device run 你的脚本.js # 推到手机并立即运行
460
+ xzh device logs -n 50 # 看手机上的输出
461
+ xzh device stop # 停止全部脚本
462
+
463
+ xzh device connect 192.168.1.20 # 备选方向:xzh 主动连手机的 AutoJs6 服务器模式
464
+ xzh device apk # 该装哪个 AutoJs6 安装包、去哪里下载
465
+ ```
466
+
467
+ 界面内等价命令:`/device connect <手机IP>` → `/device run <文件>` → `/device logs`。
468
+ 桥跑在 xzh 进程里时,**手机日志实时显示在右侧终端面板**(Shift+Tab 切过去),
469
+ 不会把对话区刷掉;`/device logs` 可以把最近若干行打回对话区。
470
+
471
+ | 子命令 | 说明 |
472
+ | --- | --- |
473
+ | `xzh device connect <手机IP>[:端口]` | 连接 AutoJs6 服务器模式并常驻(默认 `7347`) |
474
+ | `xzh device serve [--port N]` | 反向:等 AutoX.js 连过来(手机端填它打印的 `ws://`) |
475
+ | `xzh device apk` | 探测该用哪个 ABI、给出官方下载地址 |
476
+ | `xzh device check` | 体检:无障碍是否就绪、能否操作手机(首次连接后先跑它) |
477
+ | `xzh device shot [文件]` | 截取手机当前屏幕保存为 JPEG(系统授权框由内置脚本自动点掉) |
478
+ | `xzh device status` / `list` | 桥状态 / 已连接设备(含来源 App) |
479
+ | `xzh device push <文件>` | 保存到手机(不运行) |
480
+ | `xzh device run <文件>` | 保存并立即运行 |
481
+ | `xzh device stop [<文件>] [--all]` | 停止脚本(默认停止全部) |
482
+ | `xzh device logs [-n 50]` | 最近的设备日志 |
483
+
484
+ 通用参数:`--port <端口>`(控制通道 / 监听端口)、`--device <设备名>`(只对某一台下发);
485
+ AutoX.js 那侧也可用环境变量 `XZH_DEVICE_PORT` 指定端口。
486
+
487
+ ### 首次使用
488
+
489
+ 手机上需要装 AutoJs6(它提供无障碍能力,xzh 通过它操作手机)。玄猪**不打包安装包** ——
490
+ 每个 ABI 约 130 MB,两个就 270 MB,塞进 npm 包会让所有用户平白多下几百 MB,
491
+ 而绝大多数人只需要其中一个。因此 `xzh device apk` 只做三件事:
492
+
493
+ 1. **探测该用哪个 ABI**:`adb` 能读到设备就精确判断(`ro.product.cpu.abi`),
494
+ 否则默认 `arm64-v8a`(2018 年后的手机几乎都是 64 位 ARM,`x86_64` 基本只出现在模拟器);
495
+ 2. **给出官方下载页**:<https://github.com/SuperMonster003/AutoJs6/releases/>;
496
+ 3. **顺带看一眼本机缓存**:`~/.xzh/apks/` 里有匹配的包就直接给出路径(不联网也能装)。
497
+
498
+ `xzh device connect` 连不上时,会把「装 App → 开服务器模式 → 填 IP」的完整引导打出来,
499
+ 并**停止无谓的重试**(连续失败 3 次即放弃,避免对着填错的地址无限刷屏)。
500
+
501
+ **首次连上后先跑 `xzh device check`**:它推一段带超时的探测脚本,回报无障碍状态、机型分辨率、
502
+ 当前前台界面 —— 因为"能不能操作手机"取决于**手机侧的无障碍服务是否真的在运行**,
503
+ 从连接信息里看不出来。没就绪时会给出处理办法(含实测遇到的"已启用但未运行"要关掉再打开)。
504
+
505
+ **要操作手机时,Agent 会先加载内置的 `autojs6` 技能**:里面有 AutoJs6 的 API 速查
506
+ (`auto.*` / 选择器 / UiObject 动作 / 全局动作 / app / device / 输入 / 截图)与必须遵守的约定
507
+ (脚本在手机上跑、**返回值拿不到**,所以每步都要 `toastLog` 回报再 `device_logs` 读;
508
+ `device_run` 是发出即返回、日志异步回来;需要 UI 操作的脚本必须用 `auto.waitFor(8000)` 开头)。
509
+
510
+ - 连不上的常见原因:AutoJs6 开的是「客户端模式」而不是「服务器模式」;手机与电脑不在同一网段;
511
+ 路由器开了 **AP 隔离**(同 WiFi 下设备互相不通,最常见);手机系统限制 AutoJs6 后台运行
512
+ (OPPO / 小米等需允许后台运行)。
513
+ - **端口冲突**:`serve` 会同时监听两个端口 —— `6347`(AutoJs6 客户端模式)与 `9317`(AutoX.js)。
514
+ 它们分别与 VSCode 的 **AutoJs6 扩展**(`003.autojs6-vscode-ext`)和 **Auto.js/AutoX.js 插件**
515
+ 相同,**各自不能同时开**。xzh 是"哪个端口被占就只提示那个、另一边照常用",
516
+ 不会因为一个端口冲突就整个起不来。
517
+ - 只做**单文件**推送(运行 / 保存 / 停止 / 日志);「整个项目打包 zip 同步」没有实现。
518
+ - AutoX.js 侧若手机提示**「握手失败」**:手机端会校验握手应答里的 PC 端版本号,只认
519
+ 「Auto.js-Autox.js-VSCodeExt」那套版本序列 —— 玄猪按插件协议版本(默认 `1.110.0`)回报,
520
+ 可用环境变量 `XZH_DEVICE_PLUGIN_VERSION` 覆盖,无需改代码。
521
+ - 设备操作**不对子代理开放**(手机只有一台,多个子代理并行推脚本会互相打断)。
305
522
 
306
523
  ## 项目目录(.xuanzhu/)
307
524
 
@@ -320,6 +537,11 @@ API Key 也可以来自环境变量,优先级低于配置文件:
320
537
  - 需要更多历史时调用 `memory_read`;**每完成一件实质工作后**必须调用 `memory_write` 记录结论
321
538
  (技术方案、项目约定、踩过的坑、重要发现)。这条要求同时写在系统提示词的「核心原则」里,
322
539
  明确要求**在给出最终答复前先写记忆** —— 此前措辞偏弱(「可调用」),实测几乎不会触发
540
+ - 长期记忆是**只追加**的,长期使用会越写越长,而它每次启动都要注入提示词(节选 1500 字符),
541
+ 过长会让重要结论被截断。因此**达到 `memoryMaxChars`(默认 6000 字符)即自动触发精简**
542
+ (无需模型发起,时机见上面的"长期记忆自动精简"):先去重,仍超限则裁剪最旧的块。
543
+ - 只有当**单条记录本身就超过上限**(自动裁剪删无可删)时,提示词才会要求模型
544
+ `memory_read` 读全文、再用 `memory_compact` 重写为精简版本(合并同主题、删除过时条目)。
323
545
  - `.xuanzhu` **始终**位于当前项目路径之下,**不做任何向上查找**:在 `/a/b/c` 工作就只用
324
546
  `/a/b/c/.xuanzhu`,即使 `/a` 或 `/a/b` 下已有 `.xuanzhu` 也不会复用
325
547
  - **启动时**与 **`/switch` 切换目录时**,若该目录下尚无 `.xuanzhu`,会自动创建
@@ -340,19 +562,21 @@ API Key 也可以来自环境变量,优先级低于配置文件:
340
562
  | --- | --- | --- |
341
563
  | `playwright` | 浏览器自动化、端到端测试、网页验证(**默认用系统已安装的 Chrome**,减少反爬拦截) | `playwright-cli`(`npm i -g @playwright/cli@latest`) |
342
564
  | `officecli` | Word / Excel / PowerPoint 文档创建与读写 | `officecli`(单二进制,见技能内安装说明) |
565
+ | `autojs6` | **操作真实 Android 手机**:点击、滑动、输入、读界面、启动应用(脚本由设备桥推到手机上执行) | 无(手机需装 AutoJs6,见「手机设备桥」) |
343
566
  | `github` / `gitlab` | 仓库、Issue、PR / MR | `gh` / `glab` |
344
567
  | `jira` / `linear` | 项目管理 | 对应 CLI |
345
568
  | `aws` / `kubernetes` | 云资源与容器编排 | `aws` / `kubectl` |
346
569
  | `postgres` / `mysql` / `mongodb` / `redis` / `elasticsearch` | 数据库 | 对应客户端 |
347
570
  | `sentry` / `datadog` | 监控与告警 | 对应 CLI |
348
- | `gmail` / `email` / `telegram` | 邮件与消息 | 对应 CLI |
571
+ | `email` / `telegram` | 邮件与消息 | 对应 CLI |
349
572
 
350
573
  ### 依赖自动安装
351
574
 
352
575
  上表中的 CLI 由玄猪负责安装,**无需用户单独安装**:
353
576
 
354
577
  - 在对话中加载技能时(`load_skill`),玄猪会先检测依赖;若缺失,请求一次确认后自动安装并验证。
355
- - 也可主动运行 `xzh setup`,一次性检查并安装所有内置技能的依赖。
578
+ - 也可主动运行 `xzh setup`,一次性检查并安装**玄猪自身依赖(剪贴板工具)与全部内置技能的依赖**。
579
+ `xzh setup` 把终端交给安装命令,因此 `sudo` 能正常提示输入密码。
356
580
 
357
581
  ### 自定义技能
358
582
 
@@ -447,7 +671,7 @@ description: 一句话说明该技能的用途与适用场景
447
671
  kitty / Ghostty 会把该 xterm 兼容序列映射成「所有按键都用转义码上报」而破坏普通输入,
448
672
  故玄猪对这两类终端不发送请求,请改用 `Alt+Enter` 或在终端侧自行配置。
449
673
 
450
- 界面内命令:`/help`、`/clear`、`/copy [N|all]`、`/mouse`、`/reset`、`/cwd`、`/switch <目录>`、`/term`、`/model`、`/auto [on|off]`、`/intent [on|off]`、`/exit`。
674
+ 界面内命令:`/help`、`/clear`、`/tools`、`/image`、`/copy [N|all]`、`/mouse`、`/reset`、`/cwd`、`/switch <目录>`、`/term`、`/model`、`/auto [on|off]`、`/intent [on|off]`、`/exit`。
451
675
 
452
676
  ### 选中与复制
453
677
 
@@ -533,6 +757,7 @@ src/
533
757
  npm run build # 打包到 dist/cli.js
534
758
  npm run dev # 监听模式
535
759
  npm run typecheck # 类型检查
760
+ npm run test # 运行测试(vitest)
536
761
  node bin/xzh.js # 本地运行
537
762
  ```
538
763