@cosmicstack/mercury-agent 1.1.9 → 1.1.11

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 (114) hide show
  1. package/README.md +101 -1
  2. package/README.zh-CN.md +265 -140
  3. package/dist/index.js +4442 -1838
  4. package/dist/index.js.map +1 -1
  5. package/dist/web/ui/assets/{Chat-DCFkzIwn.js → Chat-DXSn2dY8.js} +2 -2
  6. package/dist/web/ui/assets/{Chat-DCFkzIwn.js.map → Chat-DXSn2dY8.js.map} +1 -1
  7. package/dist/web/ui/assets/{Dashboard-B81ollv8.js → Dashboard-1rlAqQ-Y.js} +2 -2
  8. package/dist/web/ui/assets/{Dashboard-B81ollv8.js.map → Dashboard-1rlAqQ-Y.js.map} +1 -1
  9. package/dist/web/ui/assets/{Goals-D0cR8yIP.js → Goals-CgSUAXLH.js} +2 -2
  10. package/dist/web/ui/assets/{Goals-D0cR8yIP.js.map → Goals-CgSUAXLH.js.map} +1 -1
  11. package/dist/web/ui/assets/{Graph-C3eHp3_J.js → Graph-DnlOWkay.js} +2 -2
  12. package/dist/web/ui/assets/{Graph-C3eHp3_J.js.map → Graph-DnlOWkay.js.map} +1 -1
  13. package/dist/web/ui/assets/{Kanban-DrkTRyni.js → Kanban-DRlNiNRF.js} +2 -2
  14. package/dist/web/ui/assets/{Kanban-DrkTRyni.js.map → Kanban-DRlNiNRF.js.map} +1 -1
  15. package/dist/web/ui/assets/{Login-GRQ-LjgN.js → Login-BP5524pC.js} +2 -2
  16. package/dist/web/ui/assets/{Login-GRQ-LjgN.js.map → Login-BP5524pC.js.map} +1 -1
  17. package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js → MarkdownRenderer-B9KGVD0X.js} +2 -2
  18. package/dist/web/ui/assets/{MarkdownRenderer-Dvh1jwyj.js.map → MarkdownRenderer-B9KGVD0X.js.map} +1 -1
  19. package/dist/web/ui/assets/{Memory-dAZsKmWz.js → Memory-BOQEY0H8.js} +2 -2
  20. package/dist/web/ui/assets/{Memory-dAZsKmWz.js.map → Memory-BOQEY0H8.js.map} +1 -1
  21. package/dist/web/ui/assets/{Permissions-DCiyUUfI.js → Permissions-jbFH-toa.js} +2 -2
  22. package/dist/web/ui/assets/{Permissions-DCiyUUfI.js.map → Permissions-jbFH-toa.js.map} +1 -1
  23. package/dist/web/ui/assets/{PersonDetail-iZgApJog.js → PersonDetail-Ca8B9io8.js} +2 -2
  24. package/dist/web/ui/assets/{PersonDetail-iZgApJog.js.map → PersonDetail-Ca8B9io8.js.map} +1 -1
  25. package/dist/web/ui/assets/{Persons-Bs_HhYjC.js → Persons-epdmUeBM.js} +2 -2
  26. package/dist/web/ui/assets/{Persons-Bs_HhYjC.js.map → Persons-epdmUeBM.js.map} +1 -1
  27. package/dist/web/ui/assets/{Providers-CL6wMWni.js → Providers-Bm8sZNZo.js} +2 -2
  28. package/dist/web/ui/assets/{Providers-CL6wMWni.js.map → Providers-Bm8sZNZo.js.map} +1 -1
  29. package/dist/web/ui/assets/{Schedules-BQwE1hP5.js → Schedules-BZKhm9R7.js} +2 -2
  30. package/dist/web/ui/assets/{Schedules-BQwE1hP5.js.map → Schedules-BZKhm9R7.js.map} +1 -1
  31. package/dist/web/ui/assets/{Settings-26SF-okR.js → Settings-Hii-5oku.js} +2 -2
  32. package/dist/web/ui/assets/{Settings-26SF-okR.js.map → Settings-Hii-5oku.js.map} +1 -1
  33. package/dist/web/ui/assets/Skills-BHJp2CgD.js +17 -0
  34. package/dist/web/ui/assets/Skills-BHJp2CgD.js.map +1 -0
  35. package/dist/web/ui/assets/{Tasks-DbwRozzx.js → Tasks-D36pqkro.js} +2 -2
  36. package/dist/web/ui/assets/{Tasks-DbwRozzx.js.map → Tasks-D36pqkro.js.map} +1 -1
  37. package/dist/web/ui/assets/{Usage-i_q6Ri4s.js → Usage-CmjaYrsT.js} +2 -2
  38. package/dist/web/ui/assets/{Usage-i_q6Ri4s.js.map → Usage-CmjaYrsT.js.map} +1 -1
  39. package/dist/web/ui/assets/{Workspace-ZR5syf-9.js → Workspace-BYLf-wTJ.js} +2 -2
  40. package/dist/web/ui/assets/{Workspace-ZR5syf-9.js.map → Workspace-BYLf-wTJ.js.map} +1 -1
  41. package/dist/web/ui/assets/{activity-CIP1IzSg.js → activity-MOTqH8zM.js} +2 -2
  42. package/dist/web/ui/assets/{activity-CIP1IzSg.js.map → activity-MOTqH8zM.js.map} +1 -1
  43. package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js → alert-dialog-MbYSbZx5.js} +2 -2
  44. package/dist/web/ui/assets/{alert-dialog-CW-j2nG4.js.map → alert-dialog-MbYSbZx5.js.map} +1 -1
  45. package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js → arrow-left-CtqQsBC6.js} +2 -2
  46. package/dist/web/ui/assets/{arrow-left-D2YO-iMS.js.map → arrow-left-CtqQsBC6.js.map} +1 -1
  47. package/dist/web/ui/assets/{avatar-BLsf3GhK.js → avatar-BIYaY7pR.js} +2 -2
  48. package/dist/web/ui/assets/{avatar-BLsf3GhK.js.map → avatar-BIYaY7pR.js.map} +1 -1
  49. package/dist/web/ui/assets/{badge-DfDJNUtd.js → badge-CUJiWF1y.js} +2 -2
  50. package/dist/web/ui/assets/{badge-DfDJNUtd.js.map → badge-CUJiWF1y.js.map} +1 -1
  51. package/dist/web/ui/assets/{button-TaFPR-zy.js → button-CNasMlFE.js} +2 -2
  52. package/dist/web/ui/assets/{button-TaFPR-zy.js.map → button-CNasMlFE.js.map} +1 -1
  53. package/dist/web/ui/assets/{card-DAYo4Zl5.js → card-BdsEOP7t.js} +2 -2
  54. package/dist/web/ui/assets/{card-DAYo4Zl5.js.map → card-BdsEOP7t.js.map} +1 -1
  55. package/dist/web/ui/assets/{chevron-down-CQi0yuay.js → chevron-down-CB9J_vvZ.js} +2 -2
  56. package/dist/web/ui/assets/{chevron-down-CQi0yuay.js.map → chevron-down-CB9J_vvZ.js.map} +1 -1
  57. package/dist/web/ui/assets/{circle-check-DweDcOkA.js → circle-check-DvGSe1uZ.js} +2 -2
  58. package/dist/web/ui/assets/{circle-check-DweDcOkA.js.map → circle-check-DvGSe1uZ.js.map} +1 -1
  59. package/dist/web/ui/assets/{circle-x-BmL20etA.js → circle-x-CyaGJ_BM.js} +2 -2
  60. package/dist/web/ui/assets/{circle-x-BmL20etA.js.map → circle-x-CyaGJ_BM.js.map} +1 -1
  61. package/dist/web/ui/assets/{dialog-DovgkMhT.js → dialog-Bd1rELXb.js} +2 -2
  62. package/dist/web/ui/assets/{dialog-DovgkMhT.js.map → dialog-Bd1rELXb.js.map} +1 -1
  63. package/dist/web/ui/assets/{download-_QBatDio.js → download-C8RvlFqO.js} +2 -2
  64. package/dist/web/ui/assets/{download-_QBatDio.js.map → download-C8RvlFqO.js.map} +1 -1
  65. package/dist/web/ui/assets/{eye-Wpgtfmgw.js → eye-BJ0NucMz.js} +2 -2
  66. package/dist/web/ui/assets/{eye-Wpgtfmgw.js.map → eye-BJ0NucMz.js.map} +1 -1
  67. package/dist/web/ui/assets/{file-text-2EGFNyc1.js → file-text-BWWBuD_N.js} +2 -2
  68. package/dist/web/ui/assets/{file-text-2EGFNyc1.js.map → file-text-BWWBuD_N.js.map} +1 -1
  69. package/dist/web/ui/assets/{folder-open-C-OiZn9P.js → folder-open-BwjemFy7.js} +2 -2
  70. package/dist/web/ui/assets/{folder-open-C-OiZn9P.js.map → folder-open-BwjemFy7.js.map} +1 -1
  71. package/dist/web/ui/assets/{git-branch-BT9gCKgG.js → git-branch-D9JVASpC.js} +2 -2
  72. package/dist/web/ui/assets/{git-branch-BT9gCKgG.js.map → git-branch-D9JVASpC.js.map} +1 -1
  73. package/dist/web/ui/assets/{index-BhxU0YlT.js → index-C3YiF4qv.js} +6 -6
  74. package/dist/web/ui/assets/index-C3YiF4qv.js.map +1 -0
  75. package/dist/web/ui/assets/{index-CUT6Fr2C.js → index-CaqLZNof.js} +2 -2
  76. package/dist/web/ui/assets/{index-CUT6Fr2C.js.map → index-CaqLZNof.js.map} +1 -1
  77. package/dist/web/ui/assets/index-CuhiuVab.css +1 -0
  78. package/dist/web/ui/assets/{input-L1uz5xAQ.js → input-CH3dmo9r.js} +2 -2
  79. package/dist/web/ui/assets/{input-L1uz5xAQ.js.map → input-CH3dmo9r.js.map} +1 -1
  80. package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js → loader-circle-DbYKk0_Q.js} +2 -2
  81. package/dist/web/ui/assets/{loader-circle-BTFgt3hG.js.map → loader-circle-DbYKk0_Q.js.map} +1 -1
  82. package/dist/web/ui/assets/{pencil-uxK07iYy.js → pencil-gNDEMhav.js} +2 -2
  83. package/dist/web/ui/assets/{pencil-uxK07iYy.js.map → pencil-gNDEMhav.js.map} +1 -1
  84. package/dist/web/ui/assets/{plus-DcWFYr4m.js → plus-7rbHkByr.js} +2 -2
  85. package/dist/web/ui/assets/{plus-DcWFYr4m.js.map → plus-7rbHkByr.js.map} +1 -1
  86. package/dist/web/ui/assets/{power-DVIqVIMj.js → power-BS7gCDWs.js} +2 -2
  87. package/dist/web/ui/assets/{power-DVIqVIMj.js.map → power-BS7gCDWs.js.map} +1 -1
  88. package/dist/web/ui/assets/{progress-DMwOdxli.js → progress-ZzhsBV2v.js} +2 -2
  89. package/dist/web/ui/assets/{progress-DMwOdxli.js.map → progress-ZzhsBV2v.js.map} +1 -1
  90. package/dist/web/ui/assets/{search-D1OOxb1X.js → search-BZsbhO0B.js} +2 -2
  91. package/dist/web/ui/assets/{search-D1OOxb1X.js.map → search-BZsbhO0B.js.map} +1 -1
  92. package/dist/web/ui/assets/{select-Dnx_bUgy.js → select-vRSgBrHz.js} +2 -2
  93. package/dist/web/ui/assets/{select-Dnx_bUgy.js.map → select-vRSgBrHz.js.map} +1 -1
  94. package/dist/web/ui/assets/{send-D4uxqmyH.js → send-BkyTIUtJ.js} +2 -2
  95. package/dist/web/ui/assets/{send-D4uxqmyH.js.map → send-BkyTIUtJ.js.map} +1 -1
  96. package/dist/web/ui/assets/{sparkles-DLSJA4xU.js → sparkles-DcP24GEL.js} +2 -2
  97. package/dist/web/ui/assets/{sparkles-DLSJA4xU.js.map → sparkles-DcP24GEL.js.map} +1 -1
  98. package/dist/web/ui/assets/{switch-CvDDbCUA.js → switch-LRN9wWy2.js} +2 -2
  99. package/dist/web/ui/assets/{switch-CvDDbCUA.js.map → switch-LRN9wWy2.js.map} +1 -1
  100. package/dist/web/ui/assets/{terminal-DI3J3W_z.js → terminal-CWG62zdD.js} +2 -2
  101. package/dist/web/ui/assets/{terminal-DI3J3W_z.js.map → terminal-CWG62zdD.js.map} +1 -1
  102. package/dist/web/ui/assets/{textarea-CXLsr8tf.js → textarea-CXh3tmJ1.js} +2 -2
  103. package/dist/web/ui/assets/{textarea-CXLsr8tf.js.map → textarea-CXh3tmJ1.js.map} +1 -1
  104. package/dist/web/ui/assets/{zap-C-0oH5gt.js → zap-BEfqVtvZ.js} +2 -2
  105. package/dist/web/ui/assets/{zap-C-0oH5gt.js.map → zap-BEfqVtvZ.js.map} +1 -1
  106. package/dist/web/ui/index.html +2 -2
  107. package/package.json +9 -4
  108. package/dist/web/ui/assets/Skills-DANyYK_d.js +0 -7
  109. package/dist/web/ui/assets/Skills-DANyYK_d.js.map +0 -1
  110. package/dist/web/ui/assets/index-BhxU0YlT.js.map +0 -1
  111. package/dist/web/ui/assets/index-DOw1nKre.css +0 -1
  112. package/dist/web/ui/sw.js.map +0 -1
  113. package/dist/web/ui/workbox-0bb07689.js +0 -3
  114. package/dist/web/ui/workbox-0bb07689.js.map +0 -1
package/README.md CHANGED
@@ -32,11 +32,25 @@
32
32
 
33
33
  ## Quick Start
34
34
 
35
+ **One-liner install (no Node.js required)** — downloads the latest standalone binary for your OS:
36
+
37
+ ```bash
38
+ # macOS / Linux
39
+ curl -fsSL https://mercuryagent.sh/install.sh | sh
40
+ ```
41
+
42
+ ```powershell
43
+ # Windows
44
+ irm https://mercuryagent.sh/install.ps1 | iex
45
+ ```
46
+
47
+ Or via npm if you already have Node.js 20+:
48
+
35
49
  ```bash
36
50
  npx @cosmicstack/mercury-agent
37
51
  ```
38
52
 
39
- Or install globally:
53
+ Or install the npm package globally:
40
54
 
41
55
  ```bash
42
56
  npm i -g @cosmicstack/mercury-agent
@@ -179,6 +193,41 @@ Type these during a conversation — they don't consume API tokens. Work on both
179
193
  | **Scheduler** | `schedule_task`, `list_scheduled_tasks`, `cancel_scheduled_task` |
180
194
  | **System** | `budget_status` |
181
195
 
196
+ ## Installing Skills
197
+
198
+ Mercury can pull community-contributed skills from the registry at
199
+ **[skills.mercuryagent.sh](https://skills.mercuryagent.sh)** (126+ skills, no auth required).
200
+
201
+ ```bash
202
+ mercury skills search prompt # search the registry
203
+ mercury skills browse ai-ml # browse by category
204
+ mercury skills view ai-ml/prompt-engineering # render SKILL.md in the terminal
205
+ mercury skills view ai-ml/prompt-engineering --web # open the registry page
206
+ mercury skills install ai-ml/prompt-engineering # install to ~/.mercury/skills/
207
+ mercury skills list # show installed skills
208
+ mercury skills update # refresh all installed skills
209
+ mercury skills remove ai-ml/prompt-engineering
210
+ mercury skills doctor # check install root + registry
211
+ ```
212
+
213
+ Installed skills land at `~/.mercury/skills/<category>/<slug>/SKILL.md` and are
214
+ picked up by the agent on the next boot — they're treated identically to
215
+ built-in skills.
216
+
217
+ > **Review before you ship.** Skills are community-contributed and unaudited.
218
+ > Run `mercury skills view <id>` before installing.
219
+
220
+ Overrides: `--registry <url>` (or `MERCURY_SKILLS_REGISTRY`) for self-hosted
221
+ registries, `MERCURY_SKILLS_INSTALL_ROOT` for an alternate install path,
222
+ `--json` for machine-readable output.
223
+
224
+ **Also installable from:**
225
+
226
+ - **Web dashboard** — `http://127.0.0.1:6174/skills` has a registry installer (paste `category/slug`) and a URL installer side by side.
227
+ - **Telegram** — `/skills`, `/skills search <q>`, `/skills view <id>`, `/skills install <id>` (admin-only). Every result includes the registry URL so you can review before installing.
228
+
229
+ See the [Skills reference](https://mercuryagent.sh/docs/reference/skills) for the full command surface, frontmatter spec, and API endpoints.
230
+
182
231
  ## Web Dashboard
183
232
 
184
233
  Mercury includes a built-in web UI at `http://127.0.0.1:6174`:
@@ -316,6 +365,57 @@ When a provider fails, Mercury automatically tries the next one. It remembers th
316
365
  - **Daemon manager** — Background spawn + PID file + watchdog crash recovery
317
366
  - **System services** — macOS LaunchAgent, Linux systemd, Windows Task Scheduler
318
367
 
368
+ ## Build From Source
369
+
370
+ You can build Mercury yourself from source — either the standard Node bundle (for `npm link` / local development) or a **standalone executable** that bundles the entire runtime, so end-users don't need Node.js installed at all.
371
+
372
+ ### Prerequisites
373
+
374
+ - **Node.js ≥ 20** (for the build toolchain)
375
+ - **[Bun](https://bun.sh) ≥ 1.3** (only required for standalone binaries; install with `curl -fsSL https://bun.sh/install | bash`)
376
+
377
+ ### Standard build (ESM bundle)
378
+
379
+ ```bash
380
+ git clone https://github.com/cosmicstack-labs/mercury-agent.git
381
+ cd mercury-agent
382
+ npm install
383
+ npm run build # builds dist/ via tsup + post-build (UI, static assets)
384
+ npm start # node dist/index.js
385
+ ```
386
+
387
+ ### Standalone executable (no Node.js required for end users)
388
+
389
+ Mercury can be compiled into a single self-contained binary using `bun build --compile`. The resulting file embeds the Bun runtime and the full Mercury bundle.
390
+
391
+ ```bash
392
+ npm run build:bin # host platform only
393
+ npm run build:bin:all # all 5 targets (macOS arm64/x64, Linux x64/arm64, Windows x64)
394
+ npm run build:bin:force # rebuild (overwrite existing binary for the same version)
395
+ npm run build:bin:all:force # rebuild all targets
396
+ ```
397
+
398
+ Output is **versioned** so older builds are never overwritten:
399
+
400
+ ```
401
+ release/
402
+ ├── latest → symlink to most-recent version
403
+ ├── v1.1.9/
404
+ │ ├── mercury-macos-arm64
405
+ │ ├── mercury-macos-x64
406
+ │ ├── mercury-linux-x64
407
+ │ ├── mercury-linux-arm64
408
+ │ ├── mercury-win-x64.exe
409
+ │ └── checksums.txt (SHA-256 for every binary)
410
+ └── v1.2.0/ …
411
+ ```
412
+
413
+ The version is read from `package.json` — bump it before building to produce a fresh folder. Re-running for the same version skips already-built targets unless `--force` is passed.
414
+
415
+ **Cross-compilation**: Bun produces binaries for every target from a single host. Native modules (`better-sqlite3`) can't cross-compile, but Mercury gracefully falls back to `sql.js` (pure JS + wasm) so the cross-compiled binaries still work end-to-end.
416
+
417
+ **macOS Gatekeeper**: unsigned binaries trigger a warning on first launch. For distribution, sign with `codesign --sign "Developer ID" release/v<version>/mercury-macos-arm64` and notarize.
418
+
319
419
  ## License
320
420
 
321
421
  MIT © [Cosmic Stack](https://github.com/cosmicstack-labs)
package/README.zh-CN.md CHANGED
@@ -1,14 +1,38 @@
1
- # Mercury Agent 中文文档
1
+ # Mercury — 以灵魂驱动的 AI Agent
2
2
 
3
- > 一个以“灵魂”为中心的 AI Agent,内置权限加固工具、Token 预算、多渠道访问和 SQLite 支持的 Second Brain 记忆。
3
+ <p align="center">
4
+ <picture>
5
+ <source media="(prefers-color-scheme: dark)" srcset="docs/img/card-dark.png">
6
+ <source media="(prefers-color-scheme: light)" srcset="docs/img/card-light.png">
7
+ <img alt="Mercury — Soul-Driven AI Agent" src="docs/img/card-light.png" width="600">
8
+ </picture>
9
+ </p>
4
10
 
5
- [English](README.md) | 简体中文
11
+ <p align="center">
12
+ <strong>以灵魂驱动、内置权限加固工具、Token 预算和多渠道访问的 AI Agent。</strong>
13
+ </p>
6
14
 
7
- Mercury 会记住重要信息,在执行有风险的操作前先请求确认,并且可以通过 CLI 或 Telegram 以 24/7 后台进程运行。它适合需要本地文件操作、命令执行、长期记忆、定时任务和多模型兜底能力的个人 AI 助手场景。
15
+ <p align="center">
16
+ 记住重要信息。行动前先请求确认。通过 CLI 或 Telegram 全天候运行。31 个内置工具、可扩展的 Skills、基于 SQLite 的第二大脑记忆。
17
+ </p>
8
18
 
9
- ## 快速开始
19
+ <p align="center">
20
+ <a href="https://www.npmjs.com/package/@cosmicstack/mercury-agent"><img src="https://img.shields.io/npm/v/@cosmicstack/mercury-agent" alt="npm"></a>
21
+ <a href="https://github.com/cosmicstack-labs/mercury-agent"><img src="https://img.shields.io/github/license/cosmicstack-labs/mercury-agent" alt="license"></a>
22
+ <a href="https://nodejs.org/"><img src="https://img.shields.io/node/v/@cosmicstack/mercury-agent" alt="node"></a>
23
+ </p>
24
+
25
+ <p align="center">
26
+ <strong>🔖 当前稳定版:v1.1.6</strong>
27
+ </p>
28
+
29
+ <p align="center">
30
+ <a href="README.md">English</a> | 简体中文
31
+ </p>
10
32
 
11
- 直接运行:
33
+ ---
34
+
35
+ ## 快速开始
12
36
 
13
37
  ```bash
14
38
  npx @cosmicstack/mercury-agent
@@ -21,223 +45,324 @@ npm i -g @cosmicstack/mercury-agent
21
45
  mercury
22
46
  ```
23
47
 
24
- 首次运行会启动配置向导(姓名、模型、可选 Telegram)。完成后会进入 Ink TUI 启动画面,并在进入聊天前让你选择权限模式(`Ask Me` / `Allow All`)。之后如需重新配置:
48
+ 首次运行会触发设置向导(姓名、Provider、可选 Telegram)。设置完成后,Mercury 打开 Ink TUI 启动画面,并在聊天开始前请求权限模式(`Ask Me` `Allow All`)。
49
+
50
+ 之后重新配置(更改 key、名称、设置):
25
51
 
26
52
  ```bash
27
53
  mercury doctor
54
+ mercury doctor --platform
28
55
  ```
29
56
 
30
- ## 为什么选择 Mercury
57
+ ## 为什么选择 Mercury
58
+
59
+ 每个 AI Agent 都能读写文件、运行命令和获取 URL。大多数默默做这些事。**Mercury 先询问 — 并且记住重要的事。**
60
+
61
+ - **权限加固** — Shell 黑名单(`sudo`、`rm -rf /` 等永不执行)。目录级读/写作用域。待批准流程。会话级"问我"或"全部允许"。无意外。
62
+ - **第二大脑** — 基于 SQLite + FTS5 全文搜索的持久化结构化记忆。10 种记忆类型、自动提取、冲突解决、自动整合。Mercury 无需手动输入即可学习你的偏好、目标和习惯。
63
+ - **灵魂驱动** — 人格由你拥有的 Markdown 文件定义(`soul.md`、`persona.md`、`taste.md`、`heartbeat.md`)。无企业包装。
64
+ - **Token 感知** — 每日预算强制执行。超过 70% 时自动简洁。`/budget` 命令查看、重置或覆盖。
65
+ - **实时流式输出** — CLI 实时 Token 流式输出,带光标保存/恢复和 markdown 重渲染。Telegram 流式输出配合可编辑状态消息。
66
+ - **全天候运行** — 在任何操作系统上作为后台守护进程运行。崩溃后自动重启。开机自启。Crontab 调度、心跳监控和主动通知。
67
+ - **可扩展** — 一条命令安装社区 Skills。将 Skills 调度为循环任务。基于 [Agent Skills](https://agentskills.io) 规范。
31
68
 
32
- - **权限优先**:Shell 命令有阻止列表,文件读写受目录作用域限制,危险操作会进入待审批流程。
33
- - **Second Brain 记忆**:基于 SQLite 和 FTS5 的结构化持久记忆,支持自动提取、相关召回、冲突处理和自动整理。
34
- - **灵魂驱动**:人格由你拥有的 Markdown 文件定义,包括 `soul.md`、`persona.md`、`taste.md` 和 `heartbeat.md`。
35
- - **Token 感知**:内置每日 Token 预算,超过阈值后自动简洁回复,并支持 `/budget` 查看、重置或临时覆盖。
36
- - **实时流式输出**:CLI 支持实时 Token 流和 Markdown 重渲染,Telegram 支持可编辑状态消息。
37
- - **持续运行**:可作为后台守护进程运行,崩溃后自动重启,并支持开机自启、定时任务和主动通知。
38
- - **可扩展**:支持安装社区 Skill、调度 Skill 定时运行,并兼容 [Agent Skills](https://agentskills.io) 规范。
69
+ Mercury 现在在首次运行时在 `~/.mercury/skills/web-search/SKILL.md` 中植入默认 `web-search` Skill。
39
70
 
40
71
  ## 守护进程模式
41
72
 
42
- 推荐使用:
73
+ **一条命令让 Mercury 持久化:**
43
74
 
44
75
  ```bash
45
76
  mercury up
46
77
  ```
47
78
 
48
- 该命令会安装系统服务、启动后台守护进程,并确保 Mercury 正在运行。如果 Mercury 已经运行,它只会确认状态并显示 PID。
79
+ 这会安装系统服务(如果未安装)、启动后台守护进程,并确保 Mercury 正在运行。将此作为你的常用命令。
49
80
 
50
- 常用命令:
81
+ 如果 Mercury 已在运行,`mercury up` 仅确认状态并显示 PID。
82
+
83
+ ### 其他守护进程命令
51
84
 
52
85
  ```bash
53
86
  mercury restart # 重启后台进程
54
87
  mercury stop # 停止后台进程
55
- mercury start -d # 后台启动,不安装系统服务
88
+ mercury start -d # 后台启动(不安装服务)
56
89
  mercury logs # 查看近期守护进程日志
57
- mercury status # 查看运行状态
90
+ mercury status # 显示守护进程是否运行
91
+ ```
92
+
93
+ 守护进程模式内置崩溃恢复 — 如果进程崩溃,它会自动重启并使用指数退避(最高每分钟 10 次重启)。
94
+
95
+ ### 系统服务(开机自启)
96
+
97
+ `mercury up` 自动安装此服务。你也可以直接管理它:
98
+
99
+ ```bash
100
+ mercury service install
58
101
  ```
59
102
 
60
- 系统服务支持:
103
+ | 平台 | 方式 | 需要管理员 |
104
+ |------|------|-----------|
105
+ | **macOS** | LaunchAgent (`~/Library/LaunchAgents/`) | 否 |
106
+ | **Linux** | systemd user unit (`~/.config/systemd/user/`) | 否(开机自启可能需要 linger) |
107
+ | **Windows** | Task Scheduler (`schtasks`) | 否 |
61
108
 
62
- | 平台 | 方式 | 是否需要管理员权限 |
63
- |------|------|--------------------|
64
- | macOS | LaunchAgent (`~/Library/LaunchAgents/`) | 否 |
65
- | Linux | systemd user unit (`~/.config/systemd/user/`) | 否,开机启动可能需要 linger |
66
- | Windows | Task Scheduler (`schtasks`) | 否 |
109
+ ```bash
110
+ mercury service status # 检查服务是否运行
111
+ mercury service uninstall # 移除系统服务
112
+ ```
113
+
114
+ 在守护进程模式下,Telegram 成为主要渠道 — CLI 是纯日志,因为没有终端输入。
67
115
 
68
116
  ## CLI 命令
69
117
 
70
- | 命令 | 说明 |
118
+ | 命令 | 描述 |
71
119
  |------|------|
72
- | `mercury up` | 推荐命令:安装服务、启动守护进程并确保运行 |
73
- | `mercury` | 启动 Agent,等同于 `mercury start` |
120
+ | `mercury up` | **推荐。** 安装服务 + 启动守护进程 + 确保运行 |
121
+ | `mercury` | 启动 Agent(等同于 `mercury start`) |
74
122
  | `mercury start` | 前台启动 |
75
- | `mercury start -d` | 后台启动 |
123
+ | `mercury start -d` | 后台启动(守护进程模式) |
76
124
  | `mercury restart` | 重启后台进程 |
77
125
  | `mercury stop` | 停止后台进程 |
78
- | `mercury logs` | 查看近期日志 |
79
- | `mercury doctor` | 重新配置 Mercury(姓名、Provider、频道、权限默认项) |
80
- | `mercury setup` | 重新运行配置向导 |
81
- | `mercury status` | 查看配置和守护进程状态 |
82
- | `mercury help` | 查看完整手册 |
126
+ | `mercury logs` | 查看近期守护进程日志 |
127
+ | `mercury doctor` | 重新配置(姓名、Provider、渠道、权限默认项) |
128
+ | `mercury doctor --platform` | 显示跨平台终端/守护进程兼容性诊断 |
129
+ | `mercury setup` | 重新运行设置向导 |
130
+ | `mercury status` | 显示配置和守护进程状态 |
131
+ | `mercury help` | 显示完整手册 |
83
132
  | `mercury upgrade` | 升级到最新版本 |
84
- | `mercury telegram list` | 查看已批准和待处理的 Telegram 用户 |
133
+ | `mercury telegram list` | 列出已批准和待处理的 Telegram 用户 |
85
134
  | `mercury telegram approve <code\|id>` | 批准配对码或待处理请求 |
86
- | `mercury telegram reject <id>` | 拒绝 Telegram 访问请求 |
87
- | `mercury telegram remove <id>` | 移除已批准用户 |
88
- | `mercury telegram promote <id>` | 将 Telegram 成员提升为管理员 |
135
+ | `mercury telegram reject <id>` | 拒绝待处理的 Telegram 访问请求 |
136
+ | `mercury telegram remove <id>` | 移除已批准的 Telegram 用户 |
137
+ | `mercury telegram promote <id>` | 将 Telegram 成员晋升为管理员 |
89
138
  | `mercury telegram demote <id>` | 将 Telegram 管理员降级为成员 |
90
- | `mercury telegram reset` | 清空 Telegram 访问状态并重新开始 |
91
- | `mercury service install` | 安装开机自启系统服务 |
139
+ | `mercury telegram reset` | 清除所有 Telegram 访问并重新开始 |
140
+ | `mercury service install` | 安装为系统服务(开机自启) |
92
141
  | `mercury service uninstall` | 卸载系统服务 |
93
- | `mercury service status` | 查看系统服务状态 |
142
+ | `mercury service status` | 显示系统服务状态 |
94
143
  | `mercury --verbose` | 使用调试日志启动 |
95
144
 
96
145
  ## 对话内命令
97
146
 
98
- 这些命令可在 CLI Telegram 对话中输入,不消耗 API Token。
147
+ 在对话中输入这些 它们不消耗 API Token。CLI 和 Telegram 都适用。
99
148
 
100
- | 命令 | 说明 |
149
+ | 命令 | 描述 |
101
150
  |------|------|
102
- | `/help` | 查看完整手册 |
103
- | `/status` | 查看 Agent 配置、预算和用量 |
104
- | `/tools` | 列出已加载工具 |
105
- | `/skills` | 列出已安装 Skill |
151
+ | `/help` | 显示完整手册 |
152
+ | `/status` | 显示 Agent 配置、预算和用量 |
153
+ | `/tools` | 列出所有已加载的工具 |
154
+ | `/skills` | 列出已安装的 Skills |
106
155
  | `/stream` | 切换 Telegram 文本流式输出 |
107
- | `/stream off` | 关闭流式输出,改为单条消息 |
108
- | `/budget` | 查看 Token 预算状态 |
109
- | `/budget override` | 为单次请求临时覆盖预算 |
156
+ | `/stream off` | 禁用流式输出(单条消息) |
157
+ | `/budget` | 显示 Token 预算状态 |
158
+ | `/budget override` | 单次请求覆盖预算 |
110
159
  | `/budget reset` | 将用量重置为零 |
111
- | `/budget set <n>` | 修改每日 Token 预算 |
112
- | `/permissions` | 修改权限模式 |
113
- | `/view` | 切换进度视图(balanced/detailed) |
114
- | `/view balanced` | 使用精简进度视图 |
115
- | `/view detailed` | 使用详细进度视图 |
116
- | `/tasks` | 列出定时任务 |
117
- | `/memory` | 查看和管理 Second Brain 记忆 |
160
+ | `/budget set <n>` | 更改每日 Token 预算 |
161
+ | `/permissions` | 更改权限模式(问我 / 全部允许) |
162
+ | `/view` | 切换进度视图(平衡 / 详细) |
163
+ | `/view balanced` | 设置精简进度视图 |
164
+ | `/view detailed` | 设置完整进度视图 |
165
+ | `/code agent <task>` | 将编码任务委托给后台子 Agent |
166
+ | `/ws exit` | 退出工作区 IDE 模式回到常规聊天 |
167
+ | `/tasks` | 列出调度任务 |
168
+ | `/memory` | 查看和管理第二大脑记忆 |
118
169
  | `/unpair` | Telegram:重置所有访问 |
119
170
 
120
171
  ## 内置工具
121
172
 
122
173
  | 分类 | 工具 |
123
174
  |------|------|
124
- | 文件系统 | `read_file`, `write_file`, `create_file`, `edit_file`, `list_dir`, `delete_file`, `send_file`, `approve_scope` |
125
- | Shell | `run_command`, `cd`, `approve_command` |
126
- | 消息 | `send_message` |
127
- | Git | `git_status`, `git_diff`, `git_log`, `git_add`, `git_commit`, `git_push` |
128
- | Web | `fetch_url` |
129
- | Skills | `install_skill`, `list_skills`, `use_skill` |
130
- | 调度 | `schedule_task`, `list_scheduled_tasks`, `cancel_scheduled_task` |
131
- | 系统 | `budget_status` |
175
+ | **文件系统** | `read_file`、`write_file`、`create_file`、`edit_file`、`list_dir`、`delete_file`、`send_file`、`approve_scope` |
176
+ | **Shell** | `run_command`、`cd`、`approve_command` |
177
+ | **消息** | `send_message` |
178
+ | **Git** | `git_status`、`git_diff`、`git_log`、`git_add`、`git_commit`、`git_push` |
179
+ | **Web** | `fetch_url` |
180
+ | **Skills** | `install_skill`、`list_skills`、`use_skill` |
181
+ | **调度器** | `schedule_task`、`list_scheduled_tasks`、`cancel_scheduled_task` |
182
+ | **系统** | `budget_status` |
132
183
 
133
184
  ## 渠道
134
185
 
135
- | 渠道 | 能力 |
186
+ | 渠道 | 特性 |
136
187
  |------|------|
137
- | CLI | Ink TUI、启动权限模式选择、交互式权限审批(方向键 + Enter,支持 Y/N/A 快捷键)、balanced/detailed 进度视图、实时文本流 |
138
- | Telegram | HTML 格式化、可编辑流式消息、文件上传、输入状态、多用户访问和管理员/成员角色 |
188
+ | **CLI** | Ink TUI、启动权限模式选择器、交互式权限提示(方向键 + EnterY/N/A 快捷键)、进度视图(平衡/详细)、实时流式输出 |
189
+ | **Telegram** | HTML 格式化、可编辑流式消息、文件上传、输入状态指示器、多用户访问与管理员/成员角色 |
190
+
191
+ ### 工作区/编码快捷键(CLI)
192
+
193
+ - `Ctrl+P` → 切换到计划模式
194
+ - `Ctrl+X` → 切换到执行模式
195
+ - `Esc` 或 `Ctrl+Q` → 退出工作区回到常规聊天
196
+ - `Ctrl+V` → 切换进度视图(当终端拦截 Ctrl+V 时 `/view` 作为后备)
139
197
 
140
- ### Telegram 访问模型
198
+ ### Spotify UI 注意事项(CLI)
141
199
 
142
- Mercury 使用组织式访问模型,包含管理员和成员。
200
+ - Spotify 面板支持键盘快捷键:`N` 下一曲、`P` 上一曲、`+/-` 音量、`Z` 正在播放。
201
+ - 内联专辑封面是可选的且安全屏蔽:
202
+ - 用 `MERCURY_SPOTIFY_ART=1` 启用
203
+ - 目前仅在本地 iTerm 会话中渲染
204
+ - 在 SSH/移动端/轻量终端中自动回退到纯文本 UI
143
205
 
144
- - 首次设置:向你的 Bot 发送 `/start`,获取配对码,然后在 CLI 中执行 `mercury telegram approve <code>`。你会成为首位管理员。
145
- - 新用户:发送 `/start` 请求访问,由管理员在 CLI 中批准或拒绝。
146
- - 角色:管理员可以批准、拒绝、提升、降级和重置访问;成员可以与 Mercury 对话。
147
- - 重置:管理员可在 Telegram 发送 `/unpair`,或在 CLI 中执行 `mercury telegram reset`。
148
- - 仅支持私聊,群聊消息会被忽略。
206
+ ### Telegram 访问
207
+
208
+ Mercury 使用**组织访问模型**,包含管理员和成员。
209
+
210
+ - **首次设置:** 向你的 Bot 发送 `/start`,收到配对码,然后在 CLI 中输入 `mercury telegram approve <code>`。你成为首位管理员。
211
+ - **其他用户:** 发送 `/start` 请求访问。管理员从 CLI 批准或拒绝。
212
+ - **角色:** 管理员可以批准/拒绝请求、晋升/降级用户和重置访问。成员可以与 Mercury 聊天。
213
+ - **重置:** 管理员可以在 Telegram 发送 `/unpair`,或在 CLI 中运行 `mercury telegram reset` 清除所有访问并重新开始。
214
+ - 仅限私聊 — 群组消息始终被忽略。
215
+
216
+ CLI 命令:`mercury telegram list|approve|reject|remove|promote|demote|reset`
149
217
 
150
218
  ## 调度器
151
219
 
152
- - **周期任务**:使用 cron 表达式,例如 `0 9 * * *` 表示每天 9 点。
153
- - **一次性任务**:使用 `delay_seconds`,例如 15 秒后执行。
154
- - 任务会持久化到 `~/.mercury/schedules.yaml`,重启后自动恢复。
155
- - 执行结果会返回到创建任务时所在的渠道。
220
+ - **循环**:使用 cron 表达式的 `schedule_task`(`0 9 * * *` 每天 9 点)
221
+ - **一次性**:使用 `delay_seconds` 的 `schedule_task`(例如 15 秒)
222
+ - 任务持久化到 `~/.mercury/schedules.yaml`,重启后恢复
223
+ - 响应路由回创建任务的渠道
156
224
 
157
- ## Second Brain
225
+ ## 第二大脑
158
226
 
159
- Mercury 默认启用结构化持久记忆,并会在对话后自动提取、存储和召回与你有关的重要事实。
227
+ Mercury 构建一个结构化、持久化的记忆,随每次对话增长。默认启用,自动提取、存储和召回关于你的事实。
160
228
 
161
- - 10 种记忆类型:identity、preference、goal、project、habit、decision、constraint、relationship、episode、reflection
162
- - 自动提取:每轮对话后提取 0 3 条事实,并记录置信度、重要性和持久性。
163
- - 相关召回:每次消息前注入最相关的前 5 条记忆,默认预算 900 字符。
164
- - 自动整理:每 60 分钟生成个人资料摘要、活跃状态摘要和反思。
165
- - 冲突处理:按置信度和时间新旧处理相互冲突的记忆。
166
- - 自动修剪:活跃作用域记忆 21 天后过期,推断记忆会衰减,低置信持久记忆 120 天后撤销。
167
- - 用户控制:通过 `/memory` 查看、搜索、暂停、恢复和清空。
168
- - 禁用方式:设置 `SECOND_BRAIN_ENABLED=false`,或在配置中设置 `memory.secondBrain.enabled: false`。
229
+ - **10 种记忆类型** — identity、preference、goal、project、habit、decision、constraint、relationship、episode、reflection
230
+ - **自动提取** 每轮对话后,Mercury 提取 0–3 条带置信度、重要性和持久性分数的事实
231
+ - **相关召回** — 每次消息前,将最匹配的 5 条记忆(900 字符预算)注入上下文
232
+ - **自动整合** — 每 60 分钟,Mercury 构建个人资料摘要、活跃状态摘要,并从模式生成反思
233
+ - **冲突解决** — 对立记忆按置信度(更高者胜出)或新旧(更新者胜出)解决
234
+ - **自动修剪** — 活跃作用域记忆 21 天后过期;推断记忆会衰减;低置信度持久记忆 120 天后清除
235
+ - **用户控制** `/memory` 用于概览、搜索、暂停、恢复和清除
236
+ - **禁用** `SECOND_BRAIN_ENABLED=false` 环境变量或配置中的 `memory.secondBrain.enabled: false`
169
237
 
170
- 所有数据都保存在本机 `~/.mercury/memory/second-brain/second-brain.db`,不会上传到云端。
238
+ 所有数据保留在你机器的 `~/.mercury/memory/second-brain/second-brain.db`(SQLite + FTS5)。不上云。
171
239
 
172
- ## 配置位置
240
+ ## 配置
173
241
 
174
- 运行时数据保存在 `~/.mercury/`,不会写入你的项目目录。
242
+ 所有运行时数据位于 `~/.mercury/` — 不在你的项目目录中。
175
243
 
176
244
  | 路径 | 用途 |
177
245
  |------|------|
178
- | `~/.mercury/mercury.yaml` | 主配置,包括提供商、渠道和预算 |
179
- | `~/.mercury/.env` | API Key 和 Token |
180
- | `~/.mercury/soul/*.md` | Agent 人格文件 |
246
+ | `~/.mercury/mercury.yaml` | 主配置(Provider、渠道、预算) |
247
+ | `~/.mercury/.env` | API key 和 Token(与项目 .env 一起加载) |
248
+ | `~/.mercury/soul/*.md` | Agent 人格(soul、persona、taste、heartbeat) |
181
249
  | `~/.mercury/permissions.yaml` | 能力和审批规则 |
182
- | `~/.mercury/skills/` | 已安装 Skill |
183
- | `~/.mercury/schedules.yaml` | 定时任务 |
184
- | `~/.mercury/token-usage.json` | 每日 Token 用量 |
185
- | `~/.mercury/memory/short-term/` | 每段对话的短期记忆 JSON 文件 |
186
- | `~/.mercury/memory/long-term/` | 自动提取事实,JSONL 格式 |
187
- | `~/.mercury/memory/episodic/` | 带时间戳的事件日志,JSONL 格式 |
188
- | `~/.mercury/memory/second-brain/` | 结构化记忆数据库 |
250
+ | `~/.mercury/skills/` | 已安装的 Skills |
251
+ | `~/.mercury/schedules.yaml` | 调度任务 |
252
+ | `~/.mercury/token-usage.json` | 每日 Token 用量跟踪 |
253
+ | `~/.mercury/memory/short-term/` | 每段对话的 JSON 文件 |
254
+ | `~/.mercury/memory/long-term/` | 自动提取的事实(JSONL |
255
+ | `~/.mercury/memory/episodic/` | 带时间戳的事件日志(JSONL |
256
+ | `~/.mercury/memory/second-brain/` | 结构化记忆数据库(SQLite + FTS5) |
189
257
  | `~/.mercury/daemon.pid` | 后台进程 PID |
190
- | `~/.mercury/daemon.log` | 守护进程日志 |
258
+ | `~/.mercury/daemon.log` | 守护进程模式日志 |
259
+
260
+ ## Provider 兜底
261
+
262
+ 配置多个 LLM Provider。Mercury 按顺序尝试并自动兜底:
191
263
 
192
- ## 模型提供商兜底
264
+ | Provider | 默认模型 | API Key | 备注 |
265
+ |----------|----------|---------|------|
266
+ | **DeepSeek** | deepseek-chat | `DEEPSEEK_API_KEY` | 默认,成本效益高 |
267
+ | **OpenAI** | gpt-4o-mini | `OPENAI_API_KEY` | GPT-4o、o3 等 |
268
+ | **Anthropic** | claude-sonnet-4 | `ANTHROPIC_API_KEY` | Claude Sonnet、Haiku、Opus |
269
+ | **Grok (xAI)** | grok-4 | `GROK_API_KEY` | OpenAI 兼容端点 |
270
+ | **Ollama Cloud** | gpt-oss:120b | `OLLAMA_CLOUD_API_KEY` | 通过 API 的远程 Ollama |
271
+ | **Ollama Local** | gpt-oss:20b | 无需 Key | 本地 Ollama 实例 |
193
272
 
194
- Mercury 可以配置多个 LLM 提供商,并按顺序自动尝试。如果某个提供商失败,会切换到下一个。
273
+ 当 Provider 失败时,Mercury 自动尝试下一个。它记住最后一个成功的 Provider,并在下次请求时从那里开始。
195
274
 
196
- | 提供商 | 默认模型 | API Key | 说明 |
197
- |--------|----------|---------|------|
198
- | DeepSeek | `deepseek-chat` | `DEEPSEEK_API_KEY` | 默认、成本较低 |
199
- | OpenAI | `gpt-4o-mini` | `OPENAI_API_KEY` | 支持 GPT-4o、o3 等 |
200
- | Anthropic | `claude-sonnet-4` | `ANTHROPIC_API_KEY` | Claude Sonnet、Haiku、Opus |
201
- | Grok (xAI) | `grok-4` | `GROK_API_KEY` | OpenAI 兼容接口 |
202
- | Ollama Cloud | `gpt-oss:120b` | `OLLAMA_CLOUD_API_KEY` | 远程 Ollama API |
203
- | Ollama Local | `gpt-oss:20b` | 无需 Key | 本地 Ollama 实例 |
275
+ > **更多 Provider 即将到来** Google Gemini、Mistral 等已在路线图上。Mercury OpenAI 兼容架构也支持通过 base URL 配置自定义端点。
204
276
 
205
277
  ## 架构
206
278
 
207
- - TypeScript + Node.js 20+
208
- - Vercel AI SDK v4,支持 `generateText`、`streamText` 和多步 Agent 循环
209
- - grammY Telegram Bot
210
- - SQLite + FTS5 Second Brain
211
- - JSONL 短期、长期和情景记忆
212
- - 后台守护进程、PID 文件和崩溃恢复
213
- - macOS、Linux、Windows 系统服务
279
+ - **TypeScript + Node.js 18+** — ESM,tsup 构建
280
+ - **Vercel AI SDK v4** `generateText` + `streamText`,10 步 Agent 循环,Provider 兜底
281
+ - **grammY** Telegram Bot,带输入指示器、可编辑流式输出和文件上传
282
+ - **SQLite + FTS5** 第二大脑,带全文搜索、冲突解决、自动整合
283
+ - **JSONL** — 短期、长期和情景对话记忆
284
+ - **守护进程管理器** — 后台生成 + PID 文件 + 看门狗崩溃恢复
285
+ - **系统服务** — macOS LaunchAgent、Linux systemd、Windows Task Scheduler
214
286
 
215
- ## 参与贡献
287
+ ## 许可证
216
288
 
217
- 欢迎贡献修复、工具、记忆能力、渠道能力或文档改进。请保持 PR 聚焦,并在提交前运行:
289
+ MIT © [Cosmic Stack](https://github.com/cosmicstack-labs)
218
290
 
219
- ```bash
220
- npm install
221
- npm run build
222
- ```
291
+ ---
223
292
 
224
- 贡献 Mercury 时请特别注意:
293
+ ## 免责声明
225
294
 
226
- - 工具必须走权限系统,不能绕过审批。
227
- - 面向 Agent 循环设计,尽量保持幂等。
228
- - 避免冗长输出和过度日志,Token 预算是核心约束。
229
- - CLI 和 Telegram 行为应尽量一致。
230
- - 新增依赖、破坏性变更和 soul/persona 系统调整应先讨论。
295
+ **这是 AI 软件 — 有时可能会出问题,请自行评估风险后使用。**
231
296
 
232
- ## 许可证
297
+ ---
233
298
 
234
- MIT © [Cosmic Stack](https://github.com/cosmicstack-labs)
299
+ ## 参与贡献
235
300
 
236
- ## 社区
301
+ 我们欢迎贡献!Mercury 是为演进而构建的,我们欢迎社区的帮助。无论是修复 bug、添加工具、改善记忆还是改进 soul — 所有高质量的贡献都受欢迎。
237
302
 
238
- - Discord:[加入 Mercury Agent Discord](https://discord.gg/5emMpMJy5J)
239
- - 邮箱:[mercury@cosmicstack.org](mailto:mercury@cosmicstack.org)
303
+ ### 🎯 Agent 专业知识 — 贡献者必读
240
304
 
241
- ## 免责声明
305
+ Mercury 不只是一个开源项目 — 它是一个**以灵魂驱动的 Agent**,全天候运行,管理权限,记住上下文,并在多个渠道间交互。如果你正在贡献,你必须像 Agent 构建者一样思考,而不只是库贡献者。这些是每个贡献者都应该内化的不可协商的原则:
306
+
307
+ | 原则 | 含义 |
308
+ |------|------|
309
+ | 🧠 **以循环思维** | Mercury 在 10 步 Agent 循环中运行。你的工具或功能每轮对话会被调用多次。尽可能保持幂等。 |
310
+ | 🔐 **权限优先** | 每个触碰外部世界的行为(文件、shell、网络、git)必须经过权限系统。永远不要假设批准。 |
311
+ | 💾 **记忆感知** | 如果你的功能生成关于用户的事实,考虑接入第二大脑。如果它读取用户数据,先检查记忆。 |
312
+ | 📏 **Token 意识** | Mercury 有每日 Token 预算。日志、冗长输出和大上下文转储会快速消耗 Token。保持精简。 |
313
+ | 🔌 **渠道无关** | 工具应该在 CLI 和 Telegram 上表现一致。不要假设终端、键盘,甚至另一端是人。 |
314
+ | 🔁 **优雅降级** | 如果 Provider 失败、工具出错或文件不存在 — Mercury 应该恢复,而不是崩溃。始终处理边缘情况。 |
315
+ | 📋 **自文档化** | 你的工具的名称和描述是 Mercury 决定何时使用它的依据。让它们清晰、具体和面向行动。 |
316
+ | 🧪 **测试循环,不只是函数** | 在隔离中工作的工具在 Agent 循环中可能失败(例如,返回太多数据,阻塞下一步)。端到端测试。 |
317
+
318
+ ### 代码质量 — 做
319
+
320
+ | 做 | 为什么 |
321
+ |---|--------|
322
+ | ✅ 写干净的、可读的带显式类型的 TypeScript | Mercury's codebase 是类型安全的 — 保持这样 |
323
+ | ✅ 在公共函数和工具上添加 JSDoc 注释 | 帮助其他贡献者和 Agent 理解意图 |
324
+ | ✅ 保持函数小而单一职责 | 更易于测试、审查和推理 |
325
+ | ✅ 使用 async/await 而不是原始 Promise | 一致的错误处理和可读性 |
326
+ | ✅ 为新工具和记忆功能写测试 | 对 24/7 Agent 来说可靠性很重要 |
327
+ | ✅ 遵循现有项目结构(`src/tools/`、`src/memory/`、`src/channels/`) | 保持代码库可导航 |
328
+ | ✅ 使用 Agent Skills 规范用于新的基于 skill 的功能 | 确保与 skills 生态系统的兼容性 |
329
+ | ✅ 在 PR 描述中记录破坏性变更 | 帮助维护者正确版本管理 |
330
+
331
+ ### 代码质量 — 不做
332
+
333
+ | 不做 | 为什么 |
334
+ |------|--------|
335
+ | ❌ 未经讨论不添加依赖 | Mercury 很精简 — 每个依赖增加表面积 |
336
+ | ❌ 不硬编码 API key、Token 或路径 | 像代码库其他部分一样使用 config/env 变量 |
337
+ | ❌ 不绕过权限系统 | 工具必须先请求再行动 — 这是 Mercury 的核心承诺 |
338
+ | ❌ 不在热路径中引入同步/阻塞 I/O | Mercury 是异步优先的,有原因 |
339
+ | ❌ 不提交大二进制文件或 secrets | 使用 `.gitignore` 和 env 文件 |
340
+ | ❌ 未经讨论不更改 soul/persona 系统 | 它是 Mercury 的核心 — 更改需要谨慎 |
341
+ | ❌ 不提交未测试的 Telegram 或守护进程更改 | 这些在合并后很难调试 |
342
+ | ❌ 不忽略 Token 预算系统 | 每个工具都应该注意 Token 消耗 |
343
+
344
+ ### 开始
345
+
346
+ 1. Fork 仓库
347
+ 2. 运行 `npm install`
348
+ 3. 进行更改
349
+ 4. 运行 `npm run build` 验证编译
350
+ 5. 本地使用 `mercury` 测试
351
+ 6. 打开 PR,清晰描述你更改了什么和为什么
352
+
353
+ ### PR 指南
354
+
355
+ - 保持 PR 聚焦 — 每个 PR 一个功能/修复
356
+ - 在描述中包含前/后行为
357
+ - 适当时标记相关 issues
358
+ - 对审查反馈响应迅速
359
+
360
+ ### 需要帮助?
361
+
362
+ 打开 issue 或联系 [mercury@cosmicstack.org](mailto:mercury@cosmicstack.org)。我们很友好。
363
+
364
+ ---
365
+
366
+ ## 社区
242
367
 
243
- 这是 AI 软件,可能出现错误。请自行评估风险后使用。
368
+ 1. **Discord** — [加入 Mercury Agent Discord](https://discord.gg/5emMpMJy5J) 获取实时聊天、支持和小社区讨论。