context-gatekeeper 0.3.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.
- package/LICENSE +21 -0
- package/README.md +774 -0
- package/README.zh.md +765 -0
- package/bin/context-gatekeeper-cli.js +60 -0
- package/dist/api/gdpr.d.ts +104 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +229 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/api/health-check.d.ts +13 -0
- package/dist/api/health-check.d.ts.map +1 -0
- package/dist/api/health-check.js +2 -0
- package/dist/api/health-check.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/observability.d.ts +39 -0
- package/dist/api/observability.d.ts.map +1 -0
- package/dist/api/observability.js +132 -0
- package/dist/api/observability.js.map +1 -0
- package/dist/api/session-manager.d.ts +41 -0
- package/dist/api/session-manager.d.ts.map +1 -0
- package/dist/api/session-manager.js +129 -0
- package/dist/api/session-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +613 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/configure-llm.d.ts +26 -0
- package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
- package/dist/mcp/tools/configure-llm.js +32 -0
- package/dist/mcp/tools/configure-llm.js.map +1 -0
- package/dist/mcp/tools/context-compress.d.ts +15 -0
- package/dist/mcp/tools/context-compress.d.ts.map +1 -0
- package/dist/mcp/tools/context-compress.js +15 -0
- package/dist/mcp/tools/context-compress.js.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.js +299 -0
- package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +19 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +20 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
- package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
- package/dist/mcp/tools/intelligent-recall.js +208 -0
- package/dist/mcp/tools/intelligent-recall.js.map +1 -0
- package/dist/mcp/tools/memory-anchor.d.ts +13 -0
- package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
- package/dist/mcp/tools/memory-anchor.js +16 -0
- package/dist/mcp/tools/memory-anchor.js.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.js +26 -0
- package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
- package/dist/mcp/tools/memory-extract.d.ts +68 -0
- package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
- package/dist/mcp/tools/memory-extract.js +280 -0
- package/dist/mcp/tools/memory-extract.js.map +1 -0
- package/dist/mcp/tools/memory-recall.d.ts +42 -0
- package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recall.js +37 -0
- package/dist/mcp/tools/memory-recall.js.map +1 -0
- package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
- package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
- package/dist/mcp/tools/memory-report-usage.js +15 -0
- package/dist/mcp/tools/memory-report-usage.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +43 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +38 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/memory-session.d.ts +118 -0
- package/dist/mcp/tools/memory-session.d.ts.map +1 -0
- package/dist/mcp/tools/memory-session.js +113 -0
- package/dist/mcp/tools/memory-session.js.map +1 -0
- package/dist/mcp/tools/memory-stats.d.ts +10 -0
- package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
- package/dist/mcp/tools/memory-stats.js +35 -0
- package/dist/mcp/tools/memory-stats.js.map +1 -0
- package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
- package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store-batch.js +48 -0
- package/dist/mcp/tools/memory-store-batch.js.map +1 -0
- package/dist/mcp/tools/memory-store.d.ts +37 -0
- package/dist/mcp/tools/memory-store.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store.js +34 -0
- package/dist/mcp/tools/memory-store.js.map +1 -0
- package/dist/mcp/tools/project-create.d.ts +16 -0
- package/dist/mcp/tools/project-create.d.ts.map +1 -0
- package/dist/mcp/tools/project-create.js +14 -0
- package/dist/mcp/tools/project-create.js.map +1 -0
- package/dist/models/types.d.ts +88 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +19 -0
- package/dist/models/types.js.map +1 -0
- package/dist/schema/compression.d.ts +7 -0
- package/dist/schema/compression.d.ts.map +1 -0
- package/dist/schema/compression.js +66 -0
- package/dist/schema/compression.js.map +1 -0
- package/dist/schema/fulltext-search.d.ts +10 -0
- package/dist/schema/fulltext-search.d.ts.map +1 -0
- package/dist/schema/fulltext-search.js +73 -0
- package/dist/schema/fulltext-search.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/knowledge-graph.d.ts +108 -0
- package/dist/schema/knowledge-graph.d.ts.map +1 -0
- package/dist/schema/knowledge-graph.js +372 -0
- package/dist/schema/knowledge-graph.js.map +1 -0
- package/dist/schema/memory-session.d.ts +62 -0
- package/dist/schema/memory-session.d.ts.map +1 -0
- package/dist/schema/memory-session.js +258 -0
- package/dist/schema/memory-session.js.map +1 -0
- package/dist/schema/memory.d.ts +84 -0
- package/dist/schema/memory.d.ts.map +1 -0
- package/dist/schema/memory.js +622 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/project.d.ts +8 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +68 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/schema-init.d.ts +2 -0
- package/dist/schema/schema-init.d.ts.map +1 -0
- package/dist/schema/schema-init.js +199 -0
- package/dist/schema/schema-init.js.map +1 -0
- package/dist/schema/vector-index.d.ts +28 -0
- package/dist/schema/vector-index.d.ts.map +1 -0
- package/dist/schema/vector-index.js +179 -0
- package/dist/schema/vector-index.js.map +1 -0
- package/dist/scripts/agents/base.d.ts +89 -0
- package/dist/scripts/agents/base.d.ts.map +1 -0
- package/dist/scripts/agents/base.js +148 -0
- package/dist/scripts/agents/base.js.map +1 -0
- package/dist/scripts/agents/base.ts +193 -0
- package/dist/scripts/agents/claude-code.d.ts +21 -0
- package/dist/scripts/agents/claude-code.d.ts.map +1 -0
- package/dist/scripts/agents/claude-code.js +33 -0
- package/dist/scripts/agents/claude-code.js.map +1 -0
- package/dist/scripts/agents/claude-code.ts +36 -0
- package/dist/scripts/agents/claude-desktop.d.ts +25 -0
- package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
- package/dist/scripts/agents/claude-desktop.js +36 -0
- package/dist/scripts/agents/claude-desktop.js.map +1 -0
- package/dist/scripts/agents/claude-desktop.ts +39 -0
- package/dist/scripts/agents/cline.d.ts +22 -0
- package/dist/scripts/agents/cline.d.ts.map +1 -0
- package/dist/scripts/agents/cline.js +35 -0
- package/dist/scripts/agents/cline.js.map +1 -0
- package/dist/scripts/agents/cline.ts +38 -0
- package/dist/scripts/agents/continue.d.ts +20 -0
- package/dist/scripts/agents/continue.d.ts.map +1 -0
- package/dist/scripts/agents/continue.js +35 -0
- package/dist/scripts/agents/continue.js.map +1 -0
- package/dist/scripts/agents/continue.ts +38 -0
- package/dist/scripts/agents/cursor.d.ts +27 -0
- package/dist/scripts/agents/cursor.d.ts.map +1 -0
- package/dist/scripts/agents/cursor.js +38 -0
- package/dist/scripts/agents/cursor.js.map +1 -0
- package/dist/scripts/agents/cursor.ts +41 -0
- package/dist/scripts/cli/config-gen.d.ts +59 -0
- package/dist/scripts/cli/config-gen.d.ts.map +1 -0
- package/dist/scripts/cli/config-gen.js +156 -0
- package/dist/scripts/cli/config-gen.js.map +1 -0
- package/dist/scripts/cli/config-gen.ts +164 -0
- package/dist/scripts/cli/detect.d.ts +42 -0
- package/dist/scripts/cli/detect.d.ts.map +1 -0
- package/dist/scripts/cli/detect.js +131 -0
- package/dist/scripts/cli/detect.js.map +1 -0
- package/dist/scripts/cli/detect.ts +162 -0
- package/dist/scripts/cli/install.d.ts +31 -0
- package/dist/scripts/cli/install.d.ts.map +1 -0
- package/dist/scripts/cli/install.js +125 -0
- package/dist/scripts/cli/install.js.map +1 -0
- package/dist/scripts/cli/install.ts +157 -0
- package/dist/scripts/cli/status.d.ts +8 -0
- package/dist/scripts/cli/status.d.ts.map +1 -0
- package/dist/scripts/cli/status.js +39 -0
- package/dist/scripts/cli/status.js.map +1 -0
- package/dist/scripts/cli/status.ts +48 -0
- package/dist/scripts/cli/uninstall.d.ts +22 -0
- package/dist/scripts/cli/uninstall.d.ts.map +1 -0
- package/dist/scripts/cli/uninstall.js +141 -0
- package/dist/scripts/cli/uninstall.js.map +1 -0
- package/dist/scripts/cli/uninstall.ts +157 -0
- package/dist/scripts/cli.d.ts +23 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +166 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/scripts/cli.ts +173 -0
- package/dist/services/classifier/index.d.ts +36 -0
- package/dist/services/classifier/index.d.ts.map +1 -0
- package/dist/services/classifier/index.js +104 -0
- package/dist/services/classifier/index.js.map +1 -0
- package/dist/services/classifier/llm.d.ts +37 -0
- package/dist/services/classifier/llm.d.ts.map +1 -0
- package/dist/services/classifier/llm.js +119 -0
- package/dist/services/classifier/llm.js.map +1 -0
- package/dist/services/classifier/rules.d.ts +22 -0
- package/dist/services/classifier/rules.d.ts.map +1 -0
- package/dist/services/classifier/rules.js +98 -0
- package/dist/services/classifier/rules.js.map +1 -0
- package/dist/services/compressor/index.d.ts +3 -0
- package/dist/services/compressor/index.d.ts.map +1 -0
- package/dist/services/compressor/index.js +3 -0
- package/dist/services/compressor/index.js.map +1 -0
- package/dist/services/compressor/threshold.d.ts +35 -0
- package/dist/services/compressor/threshold.d.ts.map +1 -0
- package/dist/services/compressor/threshold.js +60 -0
- package/dist/services/compressor/threshold.js.map +1 -0
- package/dist/services/compressor/trigger.d.ts +24 -0
- package/dist/services/compressor/trigger.d.ts.map +1 -0
- package/dist/services/compressor/trigger.js +91 -0
- package/dist/services/compressor/trigger.js.map +1 -0
- package/dist/services/constraint-extractor.d.ts +25 -0
- package/dist/services/constraint-extractor.d.ts.map +1 -0
- package/dist/services/constraint-extractor.js +97 -0
- package/dist/services/constraint-extractor.js.map +1 -0
- package/dist/services/database-health.d.ts +22 -0
- package/dist/services/database-health.d.ts.map +1 -0
- package/dist/services/database-health.js +122 -0
- package/dist/services/database-health.js.map +1 -0
- package/dist/services/embedding-fixed.d.ts +9 -0
- package/dist/services/embedding-fixed.d.ts.map +1 -0
- package/dist/services/embedding-fixed.js +70 -0
- package/dist/services/embedding-fixed.js.map +1 -0
- package/dist/services/embedding-provider.d.ts +79 -0
- package/dist/services/embedding-provider.d.ts.map +1 -0
- package/dist/services/embedding-provider.js +229 -0
- package/dist/services/embedding-provider.js.map +1 -0
- package/dist/services/embedding.d.ts +17 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +99 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/hnsw-index.d.ts +76 -0
- package/dist/services/hnsw-index.d.ts.map +1 -0
- package/dist/services/hnsw-index.js +301 -0
- package/dist/services/hnsw-index.js.map +1 -0
- package/dist/services/llm.d.ts +39 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +207 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/services/memory-tiers.d.ts +75 -0
- package/dist/services/memory-tiers.d.ts.map +1 -0
- package/dist/services/memory-tiers.js +275 -0
- package/dist/services/memory-tiers.js.map +1 -0
- package/dist/services/memory.d.ts +33 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +209 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/multi-agent-sharing.d.ts +83 -0
- package/dist/services/multi-agent-sharing.d.ts.map +1 -0
- package/dist/services/multi-agent-sharing.js +278 -0
- package/dist/services/multi-agent-sharing.js.map +1 -0
- package/dist/services/reranker.d.ts +88 -0
- package/dist/services/reranker.d.ts.map +1 -0
- package/dist/services/reranker.js +234 -0
- package/dist/services/reranker.js.map +1 -0
- package/dist/services/triple-extractor.d.ts +35 -0
- package/dist/services/triple-extractor.d.ts.map +1 -0
- package/dist/services/triple-extractor.js +293 -0
- package/dist/services/triple-extractor.js.map +1 -0
- package/dist/services/vector-provider.d.ts +40 -0
- package/dist/services/vector-provider.d.ts.map +1 -0
- package/dist/services/vector-provider.js +225 -0
- package/dist/services/vector-provider.js.map +1 -0
- package/dist/utils/after-chain-executor.d.ts +26 -0
- package/dist/utils/after-chain-executor.d.ts.map +1 -0
- package/dist/utils/after-chain-executor.js +135 -0
- package/dist/utils/after-chain-executor.js.map +1 -0
- package/dist/utils/after-chain.d.ts +94 -0
- package/dist/utils/after-chain.d.ts.map +1 -0
- package/dist/utils/after-chain.js +155 -0
- package/dist/utils/after-chain.js.map +1 -0
- package/dist/utils/db.d.ts +29 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/db.js +201 -0
- package/dist/utils/db.js.map +1 -0
- package/dist/utils/encryption.d.ts +87 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +175 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +56 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +177 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/priority.d.ts +26 -0
- package/dist/utils/priority.d.ts.map +1 -0
- package/dist/utils/priority.js +43 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/watchdog.d.ts +57 -0
- package/dist/utils/watchdog.d.ts.map +1 -0
- package/dist/utils/watchdog.js +164 -0
- package/dist/utils/watchdog.js.map +1 -0
- package/package.json +78 -0
package/README.zh.md
ADDED
|
@@ -0,0 +1,765 @@
|
|
|
1
|
+
# Context Gatekeeper
|
|
2
|
+
|
|
3
|
+
MCP 上下文管理服务 - 让 AI Agent 始终保持在 **100k token 聪明区** 高效运行。
|
|
4
|
+
|
|
5
|
+
通用安装 - 兼容**所有 MCP 智能体**:Cursor、Claude Desktop、Cline、Continue、Claude Code 等。
|
|
6
|
+
|
|
7
|
+
## 目录
|
|
8
|
+
|
|
9
|
+
- [快速开始](#快速开始)
|
|
10
|
+
- [功能特性](#功能特性)
|
|
11
|
+
- [安装配置](#安装配置)
|
|
12
|
+
- [环境变量](#环境变量)
|
|
13
|
+
- [工具参考](#工具参考)
|
|
14
|
+
- [跨智能体兼容性测试](#跨智能体兼容性测试)
|
|
15
|
+
- [架构设计](#架构设计)
|
|
16
|
+
- [故障排查](#故障排查)
|
|
17
|
+
- [最佳实践](#最佳实践)
|
|
18
|
+
- [开发指南](#开发指南)
|
|
19
|
+
|
|
20
|
+
## 快速开始
|
|
21
|
+
|
|
22
|
+
### 1. 通过 CLI 一键安装
|
|
23
|
+
|
|
24
|
+
CLI 自动检测本机所有支持的智能体,并把配置写入每个智能体期望的位置。无需手写 JSON。
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 安装到所有检测到的智能体(推荐)
|
|
28
|
+
npx -y context-gatekeeper-cli install --all
|
|
29
|
+
|
|
30
|
+
# 也可以指定单个或多个智能体
|
|
31
|
+
npx -y context-gatekeeper-cli install cursor claude-desktop claude-code
|
|
32
|
+
|
|
33
|
+
# 查看 CLI 会写入哪些位置
|
|
34
|
+
npx -y context-gatekeeper-cli status
|
|
35
|
+
|
|
36
|
+
# 稍后卸载
|
|
37
|
+
npx -y context-gatekeeper-cli uninstall --all
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
支持的智能体:`cursor`、`claude-desktop`、`cline`、`continue`、`claude-code`。
|
|
41
|
+
加 `--local` 改为写入项目级配置(如 `./.cursor/mcp.json`);`claude-desktop` 始终只能全局。
|
|
42
|
+
|
|
43
|
+
### 2. 手动配置(进阶)
|
|
44
|
+
|
|
45
|
+
如果想自己写 JSON,所有智能体都接受同一启动命令(`npx -y context-gatekeeper`)。
|
|
46
|
+
|
|
47
|
+
**Cursor**(`.cursor/mcp.json`):
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"context-gatekeeper": {
|
|
52
|
+
"command": "npx",
|
|
53
|
+
"args": ["-y", "context-gatekeeper"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Claude Desktop**(`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"context-gatekeeper": {
|
|
64
|
+
"command": "npx",
|
|
65
|
+
"args": ["-y", "context-gatekeeper"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Claude Code**(`.mcp.json`):
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"mcpServers": {
|
|
75
|
+
"context-gatekeeper": {
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "context-gatekeeper"]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Windows 上 GUI 程序(Cursor、Claude Desktop)可能不继承 shell PATH。
|
|
84
|
+
若 `npx` 找不到,可用 `cmd /c` 包裹,或使用 `where npx` 返回的绝对路径。
|
|
85
|
+
|
|
86
|
+
### 3. 设置环境变量(可选)
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# 认证(Watchdog 安全)
|
|
90
|
+
export CG_READ_TOKEN="your-read-only-token"
|
|
91
|
+
export CG_WRITE_TOKEN="your-write-token"
|
|
92
|
+
export CG_WATCHDOG_TOKEN="your-watchdog-token"
|
|
93
|
+
|
|
94
|
+
# 语义搜索(可选,默认为 TF-IDF)
|
|
95
|
+
export OPENAI_API_KEY="your-openai-key"
|
|
96
|
+
# 或使用 Cohere
|
|
97
|
+
export COHERE_API_KEY="your-cohere-key"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 4. 开始使用
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
// 存储一条约束
|
|
104
|
+
memory_store({
|
|
105
|
+
content: "所有新文件必须使用 TypeScript 严格模式",
|
|
106
|
+
priority: "constraint",
|
|
107
|
+
project_tags: ["typescript", "code-style"]
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// 检索相关记忆
|
|
111
|
+
memory_recall({
|
|
112
|
+
query: "TypeScript 配置",
|
|
113
|
+
limit: 5,
|
|
114
|
+
search_mode: "hybrid"
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 功能特性
|
|
119
|
+
|
|
120
|
+
- **通用 MCP**:兼容所有 MCP 智能体
|
|
121
|
+
- **14+ 工具**:存储、检索、搜索、锚定、压缩、批量操作、智能检索、双模式执行
|
|
122
|
+
- **智能搜索**:关键词 + 语义(TF-IDF/OpenAI/Cohere)+ 混合 + BM25 搜索
|
|
123
|
+
- **优先级系统**:anchored > constraint > decision > preference > fact
|
|
124
|
+
- **自动去重**:基于 SHA256 哈希的重复检测
|
|
125
|
+
- **上下文压缩**:自动清理低优先级记忆
|
|
126
|
+
- **Watchdog 安全**:基于 Token 的工具权限控制
|
|
127
|
+
- **After-Chain 自动化**:工具执行后自动触发后续工具
|
|
128
|
+
- **纯 JavaScript**:无需原生编译(sql.js)
|
|
129
|
+
- **结构化日志**:JSON 格式输出,便于日志聚合
|
|
130
|
+
|
|
131
|
+
### Phase 1:AutoSkill 风格约束提取
|
|
132
|
+
|
|
133
|
+
从对话轮次中分析提取持久化约束:
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
memory_extract({
|
|
137
|
+
conversation_turns: [
|
|
138
|
+
{ role: "user", content: "我始终偏好使用 TypeScript 严格模式。" },
|
|
139
|
+
{ role: "assistant", content: "我将启用严格模式。" }
|
|
140
|
+
],
|
|
141
|
+
extract_mode: "all",
|
|
142
|
+
min_confidence: 0.5
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Phase 2:MemGate 风格智能检索
|
|
147
|
+
|
|
148
|
+
语义相似度 + 学习到的相关性模式:
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
intelligent_recall({
|
|
152
|
+
query: "API 实现指南",
|
|
153
|
+
conversation_context: "构建新的 REST 服务",
|
|
154
|
+
relevance_threshold: 0.07,
|
|
155
|
+
enable_soft_guidance: true
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Phase 3:MPR 风格双模式执行
|
|
160
|
+
|
|
161
|
+
软引导 + 硬可接受性检查:
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
dual_mode_execute({
|
|
165
|
+
action: "使用 var 关键字定义这个变量",
|
|
166
|
+
context: "编写 JavaScript 代码",
|
|
167
|
+
mode: "dual",
|
|
168
|
+
soft_guidance_style: "concise"
|
|
169
|
+
});
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 安装配置
|
|
173
|
+
|
|
174
|
+
### 一行命令通过 CLI 安装
|
|
175
|
+
|
|
176
|
+
包自带 `context-gatekeeper-cli` 二进制,会自动检测本机所有支持的 MCP 智能体并把配置写入对应的配置文件。具体命令见 [快速开始](#快速开始)。卸载时运行 `context-gatekeeper-cli uninstall`。
|
|
177
|
+
|
|
178
|
+
### 全局安装
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npm install -g context-gatekeeper
|
|
182
|
+
npm run build
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### 本地安装
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm install context-gatekeeper
|
|
189
|
+
npm run build
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 验证安装
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
node dist/mcp/server.js --help
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### CLI 参考
|
|
199
|
+
|
|
200
|
+
`context-gatekeeper-cli` 支持的子命令:
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
context-gatekeeper-cli install [agent ...] [--all] [--local] [--cwd <dir>]
|
|
204
|
+
context-gatekeeper-cli uninstall [agent ...] [--all] [--local] [--cwd <dir>]
|
|
205
|
+
context-gatekeeper-cli status [--local] [--cwd <dir>]
|
|
206
|
+
context-gatekeeper-cli help
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
支持的智能体:`cursor`、`claude-desktop`、`cline`、`continue`、`claude-code`。
|
|
210
|
+
|
|
211
|
+
- `--all` 作用于所有智能体;没有传位置参数且没有 `--all` 时会报错。
|
|
212
|
+
- `--local` 写入项目级配置(如 `./.cursor/mcp.json`);`claude-desktop` 仅全局,会被跳过。
|
|
213
|
+
- `--cwd <dir>` 覆盖 `--local` 使用的项目根目录,便于在 CI 或 pre-commit hook 中脚本化安装。
|
|
214
|
+
|
|
215
|
+
## 环境变量
|
|
216
|
+
|
|
217
|
+
### 认证(Watchdog 安全)
|
|
218
|
+
|
|
219
|
+
| 变量 | 描述 | 必填 |
|
|
220
|
+
|------|------|------|
|
|
221
|
+
| `CG_READ_TOKEN` | 只读操作的 Token | 否 |
|
|
222
|
+
| `CG_WRITE_TOKEN` | 读写操作的 Token | 否 |
|
|
223
|
+
| `CG_WATCHDOG_TOKEN` | 完全访问 Token(绕过所有限制) | 否 |
|
|
224
|
+
|
|
225
|
+
如果不设置 Token,服务器以宽容模式运行(所有工具可访问)。
|
|
226
|
+
|
|
227
|
+
### 向量嵌入提供商
|
|
228
|
+
|
|
229
|
+
| 变量 | 描述 | 默认值 |
|
|
230
|
+
|------|------|--------|
|
|
231
|
+
| `OPENAI_API_KEY` | OpenAI API Key | - |
|
|
232
|
+
| `COHERE_API_KEY` | Cohere API Key | - |
|
|
233
|
+
| `OPENAI_EMBEDDING_BASE_URL` | 自定义 OpenAI 兼容端点 | https://api.openai.com/v1 |
|
|
234
|
+
| `CG_EMBEDDING_PROVIDER` | 嵌入提供商:`tfidf`、`openai`、`cohere` | `tfidf` |
|
|
235
|
+
|
|
236
|
+
### 日志配置
|
|
237
|
+
|
|
238
|
+
| 变量 | 描述 | 默认值 |
|
|
239
|
+
|------|------|--------|
|
|
240
|
+
| `CG_LOG_LEVEL` | 最小日志级别:`trace`、`debug`、`info`、`warn`、`error` | `info` |
|
|
241
|
+
| `CG_LOG_PRETTY` | 格式化 JSON 输出(`true` 或 `1`) | - |
|
|
242
|
+
| `CG_LOG_TO_FILE` | 启用文件日志(`true` 或 `1`) | - |
|
|
243
|
+
| `CG_LOG_FILE_PATH` | 自定义日志文件路径 | `context-gatekeeper.log` |
|
|
244
|
+
|
|
245
|
+
日志示例输出:
|
|
246
|
+
```json
|
|
247
|
+
{"level":"info","timestamp":"2026-06-25T14:00:00.000Z","message":"Tool completed","data":{"tool":"memory_store","latencyMs":42,"success":true}}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 数据库配置
|
|
251
|
+
|
|
252
|
+
| 变量 | 描述 | 默认值 |
|
|
253
|
+
|------|------|--------|
|
|
254
|
+
| `DATA_DIR` | 数据库文件位置 | 平台相关 |
|
|
255
|
+
| `CG_DB_FLUSH_INTERVAL_MS` | 定期刷新到磁盘的间隔(毫秒) | 30000 |
|
|
256
|
+
|
|
257
|
+
默认 `DATA_DIR` 位置:
|
|
258
|
+
- **Windows**:`%APPDATA%/context-gatekeeper`
|
|
259
|
+
- **macOS**:`~/Library/Application Support/context-gatekeeper`
|
|
260
|
+
- **Linux**:`~/.context-gatekeeper`
|
|
261
|
+
|
|
262
|
+
### 运行时配置
|
|
263
|
+
|
|
264
|
+
使用 `configure_llm` 工具在运行时设置 LLM:
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
// 配置 OpenAI
|
|
268
|
+
configure_llm({
|
|
269
|
+
provider: "openai",
|
|
270
|
+
apiKey: "sk-...",
|
|
271
|
+
model: "gpt-4"
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// 配置 Ollama(本地)
|
|
275
|
+
configure_llm({
|
|
276
|
+
provider: "ollama",
|
|
277
|
+
model: "llama3.2",
|
|
278
|
+
baseUrl: "http://localhost:11434"
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// 配置 Anthropic
|
|
282
|
+
configure_llm({
|
|
283
|
+
provider: "anthropic",
|
|
284
|
+
apiKey: "sk-ant-...",
|
|
285
|
+
model: "claude-3-haiku"
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## 工具参考
|
|
290
|
+
|
|
291
|
+
### 记忆操作
|
|
292
|
+
|
|
293
|
+
| 工具 | 描述 | 所需权限 |
|
|
294
|
+
|------|------|----------|
|
|
295
|
+
| `memory_store` | 存储新记忆(带优先级) | write |
|
|
296
|
+
| `memory_recall` | 检索记忆(4 种搜索模式) | read |
|
|
297
|
+
| `memory_search` | 全文搜索记忆 | read |
|
|
298
|
+
| `memory_anchor` | 永久锚定记忆 | write |
|
|
299
|
+
| `memory_stats` | 获取记忆统计 | read |
|
|
300
|
+
|
|
301
|
+
### 批量操作
|
|
302
|
+
|
|
303
|
+
| 工具 | 描述 | 所需权限 |
|
|
304
|
+
|------|------|----------|
|
|
305
|
+
| `memory_store_batch` | 批量存储记忆 | write |
|
|
306
|
+
| `memory_delete_batch` | 批量删除记忆 | write |
|
|
307
|
+
|
|
308
|
+
### 上下文管理
|
|
309
|
+
|
|
310
|
+
| 工具 | 描述 | 所需权限 |
|
|
311
|
+
|------|------|----------|
|
|
312
|
+
| `memory_report_usage` | 报告 Token 使用量 | read |
|
|
313
|
+
| `context_compress` | 触发上下文压缩 | write |
|
|
314
|
+
|
|
315
|
+
### Phase 2 智能检索
|
|
316
|
+
|
|
317
|
+
| 工具 | 描述 | 所需权限 |
|
|
318
|
+
|------|------|----------|
|
|
319
|
+
| `intelligent_recall` | MemGate 风格相关性检索 | read |
|
|
320
|
+
|
|
321
|
+
### Phase 1 约束提取
|
|
322
|
+
|
|
323
|
+
| 工具 | 描述 | 所需权限 |
|
|
324
|
+
|------|------|----------|
|
|
325
|
+
| `memory_extract` | 从对话中提取约束 | read |
|
|
326
|
+
|
|
327
|
+
### Phase 3 双模式执行
|
|
328
|
+
|
|
329
|
+
| 工具 | 描述 | 所需权限 |
|
|
330
|
+
|------|------|----------|
|
|
331
|
+
| `dual_mode_execute` | 双模式验证操作 | read(软)/ write(硬) |
|
|
332
|
+
|
|
333
|
+
### 会话管理
|
|
334
|
+
|
|
335
|
+
| 工具 | 描述 | 所需权限 |
|
|
336
|
+
|------|------|----------|
|
|
337
|
+
| `session_store` | 存储会话数据 | write |
|
|
338
|
+
| `session_get` | 获取会话数据 | read |
|
|
339
|
+
| `session_list` | 列出会话键 | read |
|
|
340
|
+
| `session_delete` | 删除会话数据 | write |
|
|
341
|
+
|
|
342
|
+
### 配置与基础设施
|
|
343
|
+
|
|
344
|
+
| 工具 | 描述 | 所需权限 |
|
|
345
|
+
|------|------|----------|
|
|
346
|
+
| `configure_llm` | 配置 LLM 提供商 | write |
|
|
347
|
+
| `after_chain_configure` | 配置 After-Chain 编排 | write |
|
|
348
|
+
| `project_create` | 创建项目 | write |
|
|
349
|
+
| `db_flush` | 刷新内存数据库到磁盘 | write |
|
|
350
|
+
| `watchdog_manage` | 管理 Watchdog Token | write |
|
|
351
|
+
|
|
352
|
+
### GDPR 合规
|
|
353
|
+
|
|
354
|
+
| 工具 | 描述 | 所需权限 |
|
|
355
|
+
|------|------|----------|
|
|
356
|
+
| `gdpr_export` | 导出所有记忆为 JSON | write |
|
|
357
|
+
| `gdpr_delete` | 删除记忆 | write |
|
|
358
|
+
| `data_summary` | 获取数据摘要 | read |
|
|
359
|
+
|
|
360
|
+
### 搜索模式
|
|
361
|
+
|
|
362
|
+
`memory_recall` 工具支持 4 种搜索模式:
|
|
363
|
+
|
|
364
|
+
| 模式 | 描述 | 适用场景 |
|
|
365
|
+
|------|------|----------|
|
|
366
|
+
| `keyword` | 简单子字符串匹配 | 快速、精确匹配 |
|
|
367
|
+
| `semantic` | TF-IDF/OpenAI/Cohere 嵌入向量 | 基于语义的检索 |
|
|
368
|
+
| `hybrid` | 关键词 + 语义组合 | 平衡准确性 |
|
|
369
|
+
| `bm25` | Okapi BM25 排序 | 文本检索 |
|
|
370
|
+
|
|
371
|
+
### After-Chain 配置
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
// 列出所有链
|
|
375
|
+
after_chain_configure({ action: "list_chains" });
|
|
376
|
+
|
|
377
|
+
// 禁用某个链
|
|
378
|
+
after_chain_configure({
|
|
379
|
+
action: "toggle_chain",
|
|
380
|
+
chain_name: "store-then-extract",
|
|
381
|
+
enabled: false
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
// 注册自定义链
|
|
385
|
+
after_chain_configure({
|
|
386
|
+
action: "register_chain",
|
|
387
|
+
chain_config: {
|
|
388
|
+
name: "store-then-recall",
|
|
389
|
+
triggerTool: "memory_store",
|
|
390
|
+
followupTool: "memory_recall",
|
|
391
|
+
async: true
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
## 跨智能体兼容性测试
|
|
397
|
+
|
|
398
|
+
除了单元测试,Context Gatekeeper 还附带一个端到端兼容性测试框架,在**与每个受支持的智能体运行时完全一致的 JSON-RPC 契约**下验证 MCP 服务器的行为。
|
|
399
|
+
|
|
400
|
+
### 测试范围
|
|
401
|
+
|
|
402
|
+
针对每个受支持的智能体,框架对全新 spawn 的 MCP 服务器进程执行四类场景:
|
|
403
|
+
|
|
404
|
+
| 类别 | 覆盖内容 | 重要性 |
|
|
405
|
+
|------|---------|--------|
|
|
406
|
+
| **协议握手** | `initialize` + `tools/list` + 读工具调用 | 确认 MCP 服务器能启动、暴露 24 个工具、正确响应 JSON-RPC |
|
|
407
|
+
| **CRUD** | `memory_store` -> `memory_recall` 往返、4 种搜索模式(`keyword`、`semantic`、`hybrid`、`auto`)、`memory_delete_batch`、`memory_anchor` | 验证智能体 stdio 传输下的核心存储路径 |
|
|
408
|
+
| **After-Chain** | `after_chain_configure` list/toggle + `memory_store` 触发 `memory_extract` 后续 | 确认进程内链式执行器在跨智能体场景下正确连接 |
|
|
409
|
+
| **Watchdog** | 4x4 权限矩阵:`no-token-strict`、`read-token`、`write-token`、`watchdog-token` 对读写探针 | 确保 Token 强制符合安全模型 |
|
|
410
|
+
|
|
411
|
+
### 受支持的智能体
|
|
412
|
+
|
|
413
|
+
- **Cursor** - 使用 `.cursor/mcp.json` 配置格式
|
|
414
|
+
- **Claude Desktop** - 使用 `claude_desktop_config.json` 配置格式
|
|
415
|
+
- **Cline** - VSCode workspace MCP 服务器配置
|
|
416
|
+
- **Continue.dev** - 使用 `experimental.modelContextProtocolServers` 配置格式
|
|
417
|
+
- **Claude Code** - 使用 `.mcp.json` 配置格式
|
|
418
|
+
|
|
419
|
+
### 运行测试
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
# 对全部 5 个智能体运行
|
|
423
|
+
npm run test:agents
|
|
424
|
+
|
|
425
|
+
# 对单个智能体运行
|
|
426
|
+
npm run test:agents -- cursor
|
|
427
|
+
|
|
428
|
+
# 对子集运行
|
|
429
|
+
npm run test:agents -- cursor cline claude-code
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### 工作原理
|
|
433
|
+
|
|
434
|
+
每个适配器将智能体的精确 MCP 配置 JSON 写入临时目录,然后使用智能体运行时使用的相同 `command` + `args` spawn MCP 服务器。框架通过 stdio 发送真实的 MCP JSON-RPC 消息 - 与 Cursor、Claude Desktop 等内部使用的线协议完全相同。
|
|
435
|
+
|
|
436
|
+
关键设计选择:
|
|
437
|
+
|
|
438
|
+
- **每个场景一个进程**:每个测试用例 spawn 新的 MCP 服务器,因此失败指向具体场景,而非共享状态
|
|
439
|
+
- **隔离的 `DATA_DIR`**:每个智能体拥有独立的数据库目录,消除跨测试污染
|
|
440
|
+
- **通过环境变量注入 Token**:`CG_READ_TOKEN`、`CG_WRITE_TOKEN`、`CG_WATCHDOG_TOKEN` 作为环境变量传递,与生产部署一致
|
|
441
|
+
- **两种报告格式**:JSON 用于 CI 集成,Markdown 用于人工审查
|
|
442
|
+
|
|
443
|
+
### 报告输出
|
|
444
|
+
|
|
445
|
+
运行结束后,`scripts/reports/` 下生成两个文件:
|
|
446
|
+
|
|
447
|
+
```
|
|
448
|
+
scripts/reports/report-<timestamp>.json # 机器可读
|
|
449
|
+
scripts/reports/report-<timestamp>.md # 人类可读
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
Markdown 报告按智能体分组:
|
|
453
|
+
|
|
454
|
+
```
|
|
455
|
+
## cursor
|
|
456
|
+
Status: 14/14 passed
|
|
457
|
+
|
|
458
|
+
| Tool | Success | Latency (ms) | Error |
|
|
459
|
+
|------|---------|--------------|-------|
|
|
460
|
+
| initialize+memory_stats | OK | 528 | |
|
|
461
|
+
| memory_store | OK | 9 | |
|
|
462
|
+
...
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### 运行示例
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
[cursor] handshake ... handshakeOk=true tools=24 sampleOk=true 528ms
|
|
469
|
+
[cursor] CRUD ... 8/8 scenarios passed (2508ms)
|
|
470
|
+
[cursor] after-chain ... allOk=true 479ms
|
|
471
|
+
[cursor] watchdog ... 4/4 cells ok (9985ms)
|
|
472
|
+
|
|
473
|
+
[cross-agent-test] Summary:
|
|
474
|
+
Total: 70
|
|
475
|
+
Passed: 70
|
|
476
|
+
Failed: 0
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 添加新智能体
|
|
480
|
+
|
|
481
|
+
1. 创建 `scripts/agents/my-agent.ts`,继承 `BaseAgentAdapter`
|
|
482
|
+
2. 实现 `name` 和 `buildSpawnCommand()`(或重写 `spawnAgent()`)
|
|
483
|
+
3. 添加静态 `buildMcpConfig(mcpBin)` 返回智能体的精确配置格式
|
|
484
|
+
4. 在 `scripts/cross-agent-test.ts` 注册适配器
|
|
485
|
+
|
|
486
|
+
框架通过 `buildAdapters()` 自动接入任何新适配器。
|
|
487
|
+
|
|
488
|
+
## 架构设计
|
|
489
|
+
|
|
490
|
+
### 系统概览
|
|
491
|
+
|
|
492
|
+
```
|
|
493
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
494
|
+
│ MCP 智能体(Cursor / Claude / Cline / Continue / Claude Code) │
|
|
495
|
+
└─────────────────────────┬───────────────────────────────────────┘
|
|
496
|
+
│ MCP 协议
|
|
497
|
+
▼
|
|
498
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
499
|
+
│ Context Gatekeeper MCP 服务器 │
|
|
500
|
+
│ │
|
|
501
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
502
|
+
│ │ Watchdog 安全 │ │
|
|
503
|
+
│ │ Token 验证 → 权限检查 → 工具执行 │ │
|
|
504
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
505
|
+
│ │
|
|
506
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
|
|
507
|
+
│ │ After-Chain │ │ LLM │ │ 嵌入向量提供商 │ │
|
|
508
|
+
│ │ 执行器 │ │ 服务 │ │ (TF-IDF/OpenAI/Cohere) │ │
|
|
509
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────────┘ │
|
|
510
|
+
│ │
|
|
511
|
+
│ ┌──────────────────────────────────────────────────────────┐ │
|
|
512
|
+
│ │ 记忆服务 / 约束提取器 / 智能检索 / 双模式执行 │ │
|
|
513
|
+
│ └──────────────────────────────────────────────────────────┘ │
|
|
514
|
+
└─────────────────────────┬───────────────────────────────────────┘
|
|
515
|
+
│
|
|
516
|
+
▼
|
|
517
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
518
|
+
│ SQLite 数据库(sql.js) │
|
|
519
|
+
│ WAL 模式 + 定期刷新 │
|
|
520
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
### Watchdog 架构
|
|
524
|
+
|
|
525
|
+
Watchdog 安全模型提供基于 Token 的访问控制:
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
┌──────────────────────────────────────────────────────────────────┐
|
|
529
|
+
│ Token 类型: │
|
|
530
|
+
├──────────────────────────────────────────────────────────────────┤
|
|
531
|
+
│ ┌────────────┬────────────┬──────────────────────┐ │
|
|
532
|
+
│ │ read │ write │ watchdog │ │
|
|
533
|
+
│ ├────────────┼────────────┼──────────────────────┤ │
|
|
534
|
+
│ │ recall │ store │ 所有操作 │ │
|
|
535
|
+
│ │ search │ anchor │ (绕过所有 │ │
|
|
536
|
+
│ │ stats │ compress │ 限制) │ │
|
|
537
|
+
│ │ intelligent│ batch │ │ │
|
|
538
|
+
│ │ recall │ delete │ │ │
|
|
539
|
+
│ │ (软模式)│ create │ │ │
|
|
540
|
+
│ └────────────┴────────────┴──────────────────────┘ │
|
|
541
|
+
└──────────────────────────────────────────────────────────────────┘
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
### 目录结构
|
|
545
|
+
|
|
546
|
+
```
|
|
547
|
+
src/
|
|
548
|
+
├── mcp/ # MCP 服务器实现
|
|
549
|
+
│ ├── server.ts # 主入口
|
|
550
|
+
│ └── tools/ # 工具实现
|
|
551
|
+
│ ├── memory-store.ts
|
|
552
|
+
│ ├── memory-recall.ts
|
|
553
|
+
│ ├── memory-extract.ts # Phase 1: AutoSkill
|
|
554
|
+
│ ├── intelligent-recall.ts # Phase 2: MemGate
|
|
555
|
+
│ ├── dual-mode-execute.ts # Phase 3: MPR
|
|
556
|
+
│ └── ...
|
|
557
|
+
├── schema/ # 数据库 Schema 和操作
|
|
558
|
+
├── services/ # 业务逻辑
|
|
559
|
+
│ ├── embedding-provider.ts # 多提供商支持
|
|
560
|
+
│ ├── llm.ts # LLM 总结
|
|
561
|
+
│ └── compressor/ # 上下文压缩
|
|
562
|
+
├── utils/
|
|
563
|
+
│ ├── db.ts # 数据库包装(sql.js)
|
|
564
|
+
│ ├── watchdog.ts # 基于 Token 的安全
|
|
565
|
+
│ ├── after-chain.ts # 工具链编排
|
|
566
|
+
│ └── logger.ts # 结构化 JSON 日志
|
|
567
|
+
└── models/ # 类型定义
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
## 故障排查
|
|
571
|
+
|
|
572
|
+
### "Permission denied" 错误
|
|
573
|
+
|
|
574
|
+
**原因**:使用只读 Token 调用写操作工具。
|
|
575
|
+
|
|
576
|
+
**解决方案**:
|
|
577
|
+
1. 检查智能体使用的 Token 类型
|
|
578
|
+
2. 升级到写操作 Token
|
|
579
|
+
3. 或使用 watchdog Token 获取完全访问权限
|
|
580
|
+
|
|
581
|
+
### "Database not initialized" 错误
|
|
582
|
+
|
|
583
|
+
**原因**:数据库在使用前未正确初始化。
|
|
584
|
+
|
|
585
|
+
**解决方案**:
|
|
586
|
+
```bash
|
|
587
|
+
export DATA_DIR="/path/to/writable/directory"
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
### 记忆去重不生效
|
|
591
|
+
|
|
592
|
+
**原因**:语义相同的记忆内容产生了不同的哈希值。
|
|
593
|
+
|
|
594
|
+
**解决方案**:
|
|
595
|
+
1. 使用完全相同的措辞存储重复记忆
|
|
596
|
+
2. 哈希基于标准化后的内容计算——细微差异会产生不同哈希
|
|
597
|
+
|
|
598
|
+
### 搜索返回意外结果
|
|
599
|
+
|
|
600
|
+
**原因**:搜索模式或嵌入提供商选择不当。
|
|
601
|
+
|
|
602
|
+
**解决方案**:
|
|
603
|
+
```typescript
|
|
604
|
+
// 精确匹配,使用 keyword 模式
|
|
605
|
+
memory_recall({
|
|
606
|
+
query: "精确短语",
|
|
607
|
+
search_mode: "keyword"
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// 语义检索,使用 hybrid 或 semantic
|
|
611
|
+
memory_recall({
|
|
612
|
+
query: "认证相关",
|
|
613
|
+
search_mode: "hybrid"
|
|
614
|
+
});
|
|
615
|
+
```
|
|
616
|
+
|
|
617
|
+
### LLM 提取失败
|
|
618
|
+
|
|
619
|
+
**原因**:LLM 提供商未配置或 API 错误。
|
|
620
|
+
|
|
621
|
+
**解决方案**:
|
|
622
|
+
```typescript
|
|
623
|
+
// 先配置 LLM
|
|
624
|
+
configure_llm({
|
|
625
|
+
provider: "openai",
|
|
626
|
+
apiKey: "your-key",
|
|
627
|
+
model: "gpt-3.5-turbo"
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
// LLM 不可用时,回退到规则提取
|
|
631
|
+
memory_extract({
|
|
632
|
+
conversation_turns: [...],
|
|
633
|
+
min_confidence: 0.3 // 降低阈值
|
|
634
|
+
});
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
## 最佳实践
|
|
638
|
+
|
|
639
|
+
### 优先级分配
|
|
640
|
+
|
|
641
|
+
| 优先级 | 使用场景 |
|
|
642
|
+
|--------|----------|
|
|
643
|
+
| `anchored` | 绝对不能违反的关键规则 |
|
|
644
|
+
| `constraint` | API 约定、编码规范 |
|
|
645
|
+
| `decision` | 架构选择、已确定的方案 |
|
|
646
|
+
| `preference` | 代码风格、工作流偏好 |
|
|
647
|
+
| `fact` | 项目详情、历史上下文 |
|
|
648
|
+
|
|
649
|
+
```typescript
|
|
650
|
+
// 好:关键的全项目约束
|
|
651
|
+
memory_store({
|
|
652
|
+
content: "永远不要直接提交到 main 分支",
|
|
653
|
+
priority: "anchored",
|
|
654
|
+
project_tags: ["git-workflow"]
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
// 避免:常识性知识
|
|
658
|
+
memory_store({
|
|
659
|
+
content: "JavaScript 使用 camelCase",
|
|
660
|
+
priority: "fact"
|
|
661
|
+
});
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
### 项目标签策略
|
|
665
|
+
|
|
666
|
+
使用一致的、分层的标签:
|
|
667
|
+
|
|
668
|
+
```typescript
|
|
669
|
+
memory_store({
|
|
670
|
+
content: "新功能使用 React 18",
|
|
671
|
+
project_tags: ["frontend:react", "version:18"]
|
|
672
|
+
});
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Token 预算管理
|
|
676
|
+
|
|
677
|
+
定期监控和压缩上下文:
|
|
678
|
+
|
|
679
|
+
```typescript
|
|
680
|
+
// 接近上限时报告 Token 使用量
|
|
681
|
+
memory_report_usage({
|
|
682
|
+
used_tokens: 85000,
|
|
683
|
+
max_tokens: 100000
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
// 需要时触发压缩
|
|
687
|
+
context_compress({
|
|
688
|
+
target_ratio: 0.6 // 目标占用上限的 60%
|
|
689
|
+
});
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
### Watchdog Token 安全
|
|
693
|
+
|
|
694
|
+
遵循最小权限原则:
|
|
695
|
+
|
|
696
|
+
```bash
|
|
697
|
+
# 主智能体:只读 Token
|
|
698
|
+
CG_READ_TOKEN="agent-read-token"
|
|
699
|
+
|
|
700
|
+
# 管理员智能体:写 Token
|
|
701
|
+
CG_WRITE_TOKEN="admin-write-token"
|
|
702
|
+
|
|
703
|
+
# 紧急情况:watchdog Token(仅限可信进程)
|
|
704
|
+
CG_WATCHDOG_TOKEN="emergency-token"
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### 搜索模式选择
|
|
708
|
+
|
|
709
|
+
| 场景 | 推荐模式 |
|
|
710
|
+
|------|----------|
|
|
711
|
+
| 精确代码片段 | `keyword` |
|
|
712
|
+
| 已知约束文本 | `keyword` |
|
|
713
|
+
| 通用概念检索 | `semantic` 或 `hybrid` |
|
|
714
|
+
| 多样化知识检索 | `bm25` |
|
|
715
|
+
| 意图驱动的检索 | `hybrid` |
|
|
716
|
+
|
|
717
|
+
### After-Chain 使用
|
|
718
|
+
|
|
719
|
+
启用自动工具链以减少手动工具调用:
|
|
720
|
+
|
|
721
|
+
```typescript
|
|
722
|
+
// 存储记忆后自动提取约束
|
|
723
|
+
after_chain_configure({
|
|
724
|
+
action: "toggle_chain",
|
|
725
|
+
chain_name: "store-then-extract",
|
|
726
|
+
enabled: true
|
|
727
|
+
});
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
## 开发指南
|
|
731
|
+
|
|
732
|
+
```bash
|
|
733
|
+
# 安装依赖
|
|
734
|
+
npm install
|
|
735
|
+
|
|
736
|
+
# 构建 TypeScript
|
|
737
|
+
npm run build
|
|
738
|
+
|
|
739
|
+
# 运行单元测试
|
|
740
|
+
npm test
|
|
741
|
+
|
|
742
|
+
# 跨智能体兼容性测试(在所有受支持的智能体中 spawn MCP 服务器)
|
|
743
|
+
npm run test:agents
|
|
744
|
+
|
|
745
|
+
# 针对单个智能体的跨智能体测试
|
|
746
|
+
npm run test:agents -- cursor
|
|
747
|
+
|
|
748
|
+
# 监视模式(自动重构建)
|
|
749
|
+
npm run dev
|
|
750
|
+
|
|
751
|
+
# 类型检查
|
|
752
|
+
npm run lint
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
详情参见[跨智能体兼容性测试](#跨智能体兼容性测试),了解 `scripts/agents/` 和 `scripts/tests/` 下的测试框架。
|
|
756
|
+
|
|
757
|
+
## 技术灵感
|
|
758
|
+
|
|
759
|
+
- **AutoSkill**:从对话中提取经验的技能
|
|
760
|
+
- **MemGate**:推理时通过学习到的相关性过滤记忆
|
|
761
|
+
- **Meta-Policy Reflexion (MPR)**:软引导 + 硬可接受性检查
|
|
762
|
+
|
|
763
|
+
## 许可证
|
|
764
|
+
|
|
765
|
+
MIT
|