devlake-mcp 0.4.1__py3-none-any.whl
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.
- devlake_mcp/__init__.py +7 -0
- devlake_mcp/__main__.py +10 -0
- devlake_mcp/cli.py +794 -0
- devlake_mcp/client.py +474 -0
- devlake_mcp/compat.py +165 -0
- devlake_mcp/config.py +204 -0
- devlake_mcp/constants.py +161 -0
- devlake_mcp/enums.py +58 -0
- devlake_mcp/generation_manager.py +296 -0
- devlake_mcp/git_utils.py +489 -0
- devlake_mcp/hooks/__init__.py +49 -0
- devlake_mcp/hooks/hook_utils.py +246 -0
- devlake_mcp/hooks/post_tool_use.py +325 -0
- devlake_mcp/hooks/pre_tool_use.py +110 -0
- devlake_mcp/hooks/record_session.py +183 -0
- devlake_mcp/hooks/session_start.py +81 -0
- devlake_mcp/hooks/stop.py +275 -0
- devlake_mcp/hooks/transcript_utils.py +547 -0
- devlake_mcp/hooks/user_prompt_submit.py +204 -0
- devlake_mcp/logging_config.py +202 -0
- devlake_mcp/retry_queue.py +556 -0
- devlake_mcp/server.py +664 -0
- devlake_mcp/session_manager.py +444 -0
- devlake_mcp/utils.py +225 -0
- devlake_mcp/version_utils.py +174 -0
- devlake_mcp-0.4.1.dist-info/METADATA +541 -0
- devlake_mcp-0.4.1.dist-info/RECORD +31 -0
- devlake_mcp-0.4.1.dist-info/WHEEL +5 -0
- devlake_mcp-0.4.1.dist-info/entry_points.txt +3 -0
- devlake_mcp-0.4.1.dist-info/licenses/LICENSE +21 -0
- devlake_mcp-0.4.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
版本检测工具模块
|
|
5
|
+
|
|
6
|
+
提供以下功能:
|
|
7
|
+
1. 获取 devlake-mcp 版本号
|
|
8
|
+
2. 检测 Claude Code 版本
|
|
9
|
+
3. 检测 Cursor 版本
|
|
10
|
+
4. 自动检测平台类型和版本信息
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import logging
|
|
15
|
+
import subprocess
|
|
16
|
+
from typing import Optional, Dict, Union
|
|
17
|
+
|
|
18
|
+
from .enums import IDEType
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# ============================================================================
|
|
24
|
+
# DevLake MCP 版本检测
|
|
25
|
+
# ============================================================================
|
|
26
|
+
|
|
27
|
+
def get_devlake_mcp_version() -> str:
|
|
28
|
+
"""
|
|
29
|
+
获取 devlake-mcp 包的版本号
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
版本号字符串,如 "0.3.1",失败返回 "unknown"
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
from devlake_mcp import __version__
|
|
36
|
+
return __version__
|
|
37
|
+
except Exception as e:
|
|
38
|
+
logger.warning(f'获取 devlake-mcp 版本失败: {e}')
|
|
39
|
+
return 'unknown'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ============================================================================
|
|
43
|
+
# Claude Code 版本检测
|
|
44
|
+
# ============================================================================
|
|
45
|
+
|
|
46
|
+
def get_claude_code_version() -> Optional[str]:
|
|
47
|
+
"""
|
|
48
|
+
检测 Claude Code 版本号
|
|
49
|
+
|
|
50
|
+
尝试以下方法:
|
|
51
|
+
1. 从环境变量 CLAUDE_CODE_VERSION 读取
|
|
52
|
+
2. 执行 claude --version 命令
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
版本号字符串,如 "0.1.5",未检测到返回 None
|
|
56
|
+
"""
|
|
57
|
+
# 方法1: 环境变量(最快)
|
|
58
|
+
version = os.getenv('CLAUDE_CODE_VERSION')
|
|
59
|
+
if version:
|
|
60
|
+
logger.debug(f'从环境变量检测到 Claude Code 版本: {version}')
|
|
61
|
+
return version
|
|
62
|
+
|
|
63
|
+
# 方法2: 执行 claude --version 命令
|
|
64
|
+
try:
|
|
65
|
+
result = subprocess.run(
|
|
66
|
+
['claude', '--version'],
|
|
67
|
+
capture_output=True,
|
|
68
|
+
text=True,
|
|
69
|
+
timeout=2
|
|
70
|
+
)
|
|
71
|
+
if result.returncode == 0 and result.stdout.strip():
|
|
72
|
+
# 直接使用命令输出,不做任何解析
|
|
73
|
+
version = result.stdout.strip()
|
|
74
|
+
logger.debug(f'从命令行检测到 Claude Code 版本: {version}')
|
|
75
|
+
return version
|
|
76
|
+
except Exception as e:
|
|
77
|
+
logger.debug(f'执行 claude --version 失败: {e}')
|
|
78
|
+
|
|
79
|
+
logger.debug('未能检测到 Claude Code 版本')
|
|
80
|
+
return None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# ============================================================================
|
|
84
|
+
# Cursor 版本检测
|
|
85
|
+
# ============================================================================
|
|
86
|
+
|
|
87
|
+
def get_cursor_version() -> Optional[str]:
|
|
88
|
+
"""
|
|
89
|
+
检测 Cursor 版本号
|
|
90
|
+
|
|
91
|
+
尝试以下方法:
|
|
92
|
+
1. 从环境变量 CURSOR_VERSION 读取
|
|
93
|
+
2. 执行 cursor-agent -v 命令
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
版本号字符串,如 "0.40.1",未检测到返回 None
|
|
97
|
+
"""
|
|
98
|
+
# 方法1: 环境变量
|
|
99
|
+
version = os.getenv('CURSOR_VERSION')
|
|
100
|
+
if version:
|
|
101
|
+
logger.debug(f'从环境变量检测到 Cursor 版本: {version}')
|
|
102
|
+
return version
|
|
103
|
+
|
|
104
|
+
# 方法2: 执行 cursor-agent -v 命令
|
|
105
|
+
try:
|
|
106
|
+
result = subprocess.run(
|
|
107
|
+
['cursor-agent', '-v'],
|
|
108
|
+
capture_output=True,
|
|
109
|
+
text=True,
|
|
110
|
+
timeout=2
|
|
111
|
+
)
|
|
112
|
+
if result.returncode == 0:
|
|
113
|
+
# 提取版本号
|
|
114
|
+
output = result.stdout.strip()
|
|
115
|
+
# 可能的输出格式:0.40.1 或 cursor-agent version 0.40.1
|
|
116
|
+
parts = output.split()
|
|
117
|
+
version = parts[-1] # 取最后一个单词作为版本号
|
|
118
|
+
logger.debug(f'从命令行检测到 Cursor 版本: {version}')
|
|
119
|
+
return version
|
|
120
|
+
except Exception as e:
|
|
121
|
+
logger.debug(f'执行 cursor-agent -v 失败: {e}')
|
|
122
|
+
|
|
123
|
+
logger.debug('未能检测到 Cursor 版本')
|
|
124
|
+
return None
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# ============================================================================
|
|
128
|
+
# 统一检测接口
|
|
129
|
+
# ============================================================================
|
|
130
|
+
|
|
131
|
+
def detect_platform_info(ide_type: IDEType) -> Dict[str, Optional[str]]:
|
|
132
|
+
"""
|
|
133
|
+
检测平台类型和版本信息
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
ide_type: IDE 类型枚举
|
|
137
|
+
应该从调用 hook 的上下文中获取,因为不同 IDE 使用不同的 hook
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
包含以下字段的字典:
|
|
141
|
+
- devlake_mcp_version: DevLake MCP 版本(字符串)
|
|
142
|
+
- ide_version: IDE 版本号(可能为 None)
|
|
143
|
+
- data_source: 数据来源(固定为 'hook')
|
|
144
|
+
|
|
145
|
+
注意:
|
|
146
|
+
- 不返回 ide_type,因为调用方已经知道(避免字段重复)
|
|
147
|
+
- 因为 Claude Code 和 Cursor 使用不同的 hook,所以调用时就知道平台类型
|
|
148
|
+
- 不需要通过环境变量、进程名或目录来检测平台
|
|
149
|
+
"""
|
|
150
|
+
# 获取字符串值并规范化
|
|
151
|
+
ide_type_str = ide_type.value
|
|
152
|
+
normalized_ide_type = ide_type_str.lower()
|
|
153
|
+
|
|
154
|
+
result = {
|
|
155
|
+
'devlake_mcp_version': get_devlake_mcp_version(),
|
|
156
|
+
'ide_version': None,
|
|
157
|
+
'data_source': 'hook'
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# 根据 IDE 类型获取版本
|
|
161
|
+
if normalized_ide_type == IDEType.CLAUDE_CODE.value:
|
|
162
|
+
result['ide_version'] = get_claude_code_version()
|
|
163
|
+
elif normalized_ide_type == IDEType.CURSOR.value:
|
|
164
|
+
result['ide_version'] = get_cursor_version()
|
|
165
|
+
# qoder 和其他平台:暂不支持版本检测
|
|
166
|
+
|
|
167
|
+
logger.info(
|
|
168
|
+
f'平台检测完成: '
|
|
169
|
+
f'ide_type={ide_type_str}, '
|
|
170
|
+
f'devlake-mcp={result["devlake_mcp_version"]}, '
|
|
171
|
+
f'ide_version={result["ide_version"] or "unknown"}'
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
return result
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: devlake-mcp
|
|
3
|
+
Version: 0.4.1
|
|
4
|
+
Summary: AI programming data collection tool - supports Hooks (Claude Code/Cursor) and MCP server modes
|
|
5
|
+
Author-email: wangzhong <wangzhong@g7.com.cn>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://git.chinawayltd.com/engineering-efficiency/devlake-mcp
|
|
8
|
+
Project-URL: Repository, https://git.chinawayltd.com/engineering-efficiency/devlake-mcp
|
|
9
|
+
Project-URL: Issues, https://git.chinawayltd.com/engineering-efficiency/devlake-mcp
|
|
10
|
+
Keywords: mcp,devlake,model-context-protocol,ai,llm,claude-code,cursor,hooks,ai-programming,code-assistant
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Requires-Python: >=3.9
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: requests>=2.31.0
|
|
23
|
+
Provides-Extra: mcp
|
|
24
|
+
Requires-Dist: fastmcp~=2.13.0; python_version >= "3.10" and extra == "mcp"
|
|
25
|
+
Provides-Extra: full
|
|
26
|
+
Requires-Dist: devlake-mcp[mcp]; extra == "full"
|
|
27
|
+
Provides-Extra: dev
|
|
28
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
29
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-mock>=3.12.0; extra == "dev"
|
|
32
|
+
Requires-Dist: pytest-timeout>=2.2.0; extra == "dev"
|
|
33
|
+
Requires-Dist: pytest-xdist>=3.5.0; extra == "dev"
|
|
34
|
+
Requires-Dist: responses>=0.24.0; extra == "dev"
|
|
35
|
+
Requires-Dist: freezegun>=1.4.0; extra == "dev"
|
|
36
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# DevLake MCP
|
|
41
|
+
|
|
42
|
+
DevLake MCP 是一个 AI 编程数据采集工具,支持两种工作模式:
|
|
43
|
+
|
|
44
|
+
- **🔌 Hooks 模式** - 通过 IDE Hooks 自动采集 AI 编程数据(推荐日常使用)
|
|
45
|
+
- **🤖 MCP 模式** - 作为 MCP 服务器,让 AI 助手主动调用工具记录数据
|
|
46
|
+
|
|
47
|
+
## Python 版本要求
|
|
48
|
+
|
|
49
|
+
| Python 版本 | Hooks 模式 | MCP Server 模式 |
|
|
50
|
+
|------------|-----------|----------------|
|
|
51
|
+
| 3.9.x | ✅ 支持 | ❌ 不支持 |
|
|
52
|
+
| 3.10+ | ✅ 支持 | ✅ 支持 |
|
|
53
|
+
|
|
54
|
+
**推荐使用 Python 3.10 或更高版本以获得完整功能支持。**
|
|
55
|
+
|
|
56
|
+
## 快速安装
|
|
57
|
+
|
|
58
|
+
### 基础安装(Python 3.9+,仅 Hooks 模式)
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# 使用 pipx 安装(推荐)
|
|
62
|
+
pipx install devlake-mcp
|
|
63
|
+
|
|
64
|
+
# 或使用 pip
|
|
65
|
+
pip install devlake-mcp
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 完整安装(Python 3.10+,Hooks + MCP Server)
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# 使用 pipx 安装(推荐)
|
|
72
|
+
pipx install "devlake-mcp[mcp]"
|
|
73
|
+
|
|
74
|
+
# 或使用 pip
|
|
75
|
+
pip install "devlake-mcp[mcp]"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 检查安装
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 查看版本号
|
|
82
|
+
devlake-mcp --version
|
|
83
|
+
# 输出: devlake-mcp 0.3.4
|
|
84
|
+
|
|
85
|
+
# 查看详细的版本和功能支持状态
|
|
86
|
+
devlake-mcp info
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`devlake-mcp info` 输出示例:
|
|
90
|
+
```
|
|
91
|
+
============================================================
|
|
92
|
+
DevLake MCP - 版本信息
|
|
93
|
+
============================================================
|
|
94
|
+
DevLake MCP: v0.3.4
|
|
95
|
+
Python: 3.10.19
|
|
96
|
+
|
|
97
|
+
功能支持:
|
|
98
|
+
- Hooks 模式: ✓
|
|
99
|
+
- MCP Server: ✓ (FastMCP 2.13.0.2)
|
|
100
|
+
============================================================
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 环境配置
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# 配置 DevLake API 地址(可选,默认使用测试环境)
|
|
107
|
+
export DEVLAKE_BASE_URL="http://devlake.test.chinawayltd.com"
|
|
108
|
+
export DEVLAKE_TIMEOUT=5
|
|
109
|
+
|
|
110
|
+
# 确保 Git 配置正确(必需)
|
|
111
|
+
git config user.name "Your Name"
|
|
112
|
+
git config user.email "your.email@example.com"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
# 日志配置(可选)
|
|
116
|
+
export DEVLAKE_MCP_LOGGING_ENABLED=true # 是否启用日志(默认 true)
|
|
117
|
+
export DEVLAKE_MCP_LOG_LEVEL=INFO # 日志级别:DEBUG/INFO/WARNING/ERROR/CRITICAL(默认 INFO)
|
|
118
|
+
export DEVLAKE_MCP_CONSOLE_LOG=false # 是否输出到控制台(默认 false,仅开发调试时启用)
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 🔌 模式一:Hooks 自动采集(推荐)
|
|
123
|
+
|
|
124
|
+
Hooks 模式通过 IDE 的 Hooks 机制**自动**采集 AI 编程数据,无需 AI 主动调用工具,适合日常开发使用。
|
|
125
|
+
|
|
126
|
+
### Claude Code Hooks
|
|
127
|
+
|
|
128
|
+
#### 一键初始化
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# 自动配置 .claude/settings.json
|
|
132
|
+
# 如果已有配置,将智能合并 hooks 部分(保留您的现有配置)
|
|
133
|
+
devlake-mcp init
|
|
134
|
+
|
|
135
|
+
# 强制完全覆盖已有配置(不推荐,将丢失现有配置)
|
|
136
|
+
devlake-mcp init --force
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**智能合并说明**:
|
|
140
|
+
- ✅ 自动检测现有 settings.json 配置
|
|
141
|
+
- ✅ 仅添加或更新 `hooks` 部分
|
|
142
|
+
- ✅ 完全保留您的其他配置(如 `mcpServers`、`permissions`、`statusLine` 等)
|
|
143
|
+
- ✅ 如果 DevLake hooks 已配置,则跳过无需更新
|
|
144
|
+
- ⚠️ 使用 `--force` 选项会完全覆盖配置文件,谨慎使用
|
|
145
|
+
|
|
146
|
+
#### 支持的 Hooks
|
|
147
|
+
|
|
148
|
+
| Hook | 触发时机 | 功能 |
|
|
149
|
+
|------|---------|------|
|
|
150
|
+
| **SessionStart** | 会话启动 | 创建 session 记录 |
|
|
151
|
+
| **UserPromptSubmit** | 用户提交 prompt | 记录用户输入 |
|
|
152
|
+
| **PreToolUse** | 工具使用前 | 记录文件变更前状态 |
|
|
153
|
+
| **PostToolUse** | 工具使用后 | 上传文件变更(diff) |
|
|
154
|
+
| **Stop** | AI 循环停止 | 更新会话统计 |
|
|
155
|
+
| **SessionEnd** | 会话结束 | 上传完整会话数据 |
|
|
156
|
+
|
|
157
|
+
#### 技术特点
|
|
158
|
+
|
|
159
|
+
- ✅ 使用 Claude Code 原生 `session_id`,无需额外管理
|
|
160
|
+
- ✅ 自动检测会话切换和超时(30 分钟)
|
|
161
|
+
- ✅ 异步上传,不阻塞 IDE 操作
|
|
162
|
+
- ✅ 失败自动加入重试队列
|
|
163
|
+
|
|
164
|
+
#### 配置示例
|
|
165
|
+
|
|
166
|
+
初始化后会在 `.claude/settings.json` 中生成以下配置:
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{
|
|
170
|
+
"hooks": {
|
|
171
|
+
"SessionStart": [{
|
|
172
|
+
"hooks": [{
|
|
173
|
+
"type": "command",
|
|
174
|
+
"command": "python3 -m devlake_mcp.hooks.session_start",
|
|
175
|
+
"timeout": 5
|
|
176
|
+
}]
|
|
177
|
+
}],
|
|
178
|
+
"UserPromptSubmit": [{
|
|
179
|
+
"hooks": [{
|
|
180
|
+
"type": "command",
|
|
181
|
+
"command": "python3 -m devlake_mcp.hooks.user_prompt_submit",
|
|
182
|
+
"timeout": 5
|
|
183
|
+
}]
|
|
184
|
+
}],
|
|
185
|
+
"PreToolUse": [{
|
|
186
|
+
"hooks": [{
|
|
187
|
+
"type": "command",
|
|
188
|
+
"command": "python3 -m devlake_mcp.hooks.pre_tool_use",
|
|
189
|
+
"timeout": 5
|
|
190
|
+
}]
|
|
191
|
+
}],
|
|
192
|
+
"PostToolUse": [{
|
|
193
|
+
"hooks": [{
|
|
194
|
+
"type": "command",
|
|
195
|
+
"command": "python3 -m devlake_mcp.hooks.post_tool_use",
|
|
196
|
+
"timeout": 10
|
|
197
|
+
}]
|
|
198
|
+
}],
|
|
199
|
+
"Stop": [{
|
|
200
|
+
"hooks": [{
|
|
201
|
+
"type": "command",
|
|
202
|
+
"command": "python3 -m devlake_mcp.hooks.stop",
|
|
203
|
+
"timeout": 5
|
|
204
|
+
}]
|
|
205
|
+
}],
|
|
206
|
+
"SessionEnd": [{
|
|
207
|
+
"hooks": [{
|
|
208
|
+
"type": "command",
|
|
209
|
+
"command": "python3 -m devlake_mcp.hooks.session_end",
|
|
210
|
+
"timeout": 10
|
|
211
|
+
}]
|
|
212
|
+
}]
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
### Cursor Hooks
|
|
220
|
+
|
|
221
|
+
#### 一键初始化
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# 自动配置 Cursor hooks
|
|
225
|
+
devlake-mcp init-cursor
|
|
226
|
+
|
|
227
|
+
# 强制覆盖已有配置
|
|
228
|
+
devlake-mcp init-cursor --force
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
#### 支持的 Hooks
|
|
232
|
+
|
|
233
|
+
| Hook | 触发时机 | 功能 |
|
|
234
|
+
|------|---------|------|
|
|
235
|
+
| **beforeSubmitPrompt** | 用户提交 prompt 前 | 记录用户输入 |
|
|
236
|
+
| **beforeReadFile** | 读取文件前 | 记录文件访问 |
|
|
237
|
+
| **beforeShellExecution** | 执行 Shell 前 | 记录命令信息 |
|
|
238
|
+
| **afterShellExecution** | Shell 执行后 | 检测命令产生的文件变更 |
|
|
239
|
+
| **afterFileEdit** | 文件编辑后 | 上传文件编辑变更 |
|
|
240
|
+
| **afterAgentResponse** | AI 回复后 | 记录对话内容 |
|
|
241
|
+
| **stop** | 会话结束 | 上传会话统计 |
|
|
242
|
+
|
|
243
|
+
#### 技术特点
|
|
244
|
+
|
|
245
|
+
- ✅ 使用 Cursor 原生 `conversation_id` 作为 session_id
|
|
246
|
+
- ✅ `generation_id` 关联同一次 AI 生成的多个文件变更
|
|
247
|
+
- ✅ 自动检测 vim/nano/echo>/cp/mv 等文件操作命令
|
|
248
|
+
- ✅ 智能 diff 算法计算文件变更
|
|
249
|
+
- ✅ 与 Claude Code 完全兼容的数据格式
|
|
250
|
+
- ✅ 精确的工作目录定位(workspace_roots)
|
|
251
|
+
|
|
252
|
+
#### 详细文档
|
|
253
|
+
|
|
254
|
+
查看 [CURSOR_HOOKS.md](CURSOR_HOOKS.md) 了解完整配置和使用指南。
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
### Hooks 模式对比
|
|
259
|
+
|
|
260
|
+
| 特性 | Claude Code | Cursor |
|
|
261
|
+
|------|-------------|--------|
|
|
262
|
+
| Session 管理 | 30分钟超时机制 | 对话生命周期管理 |
|
|
263
|
+
| 文件变更追踪 | ✅ | ✅ |
|
|
264
|
+
| Shell 命令检测 | ❌ | ✅ |
|
|
265
|
+
| 变更关联追踪 | 单个变更 | ✅ generation_id 关联 |
|
|
266
|
+
| 工作目录定位 | 手动推断 | ✅ workspace_roots |
|
|
267
|
+
| 数据格式 | 原生格式 | 完全兼容 Claude Code |
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 🤖 模式二:MCP 服务器模式
|
|
272
|
+
|
|
273
|
+
MCP 模式将 DevLake 作为 [Model Context Protocol](https://modelcontextprotocol.io) 服务器运行,基于 [FastMCP](https://gofastmcp.com) 框架,让 AI 助手可以**主动调用工具**记录数据。
|
|
274
|
+
|
|
275
|
+
### 配置方式
|
|
276
|
+
|
|
277
|
+
#### 方式 1:使用 Claude CLI(推荐)
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
claude mcp add devlake-mcp devlake-mcp
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
#### 方式 2:手动配置
|
|
284
|
+
|
|
285
|
+
编辑 `~/Library/Application Support/Claude/claude_desktop_config.json`(macOS)或相应配置文件:
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"mcpServers": {
|
|
290
|
+
"devlake-mcp": {
|
|
291
|
+
"command": "devlake-mcp"
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
配置完成后重启 Claude Desktop。
|
|
298
|
+
|
|
299
|
+
### 可用工具
|
|
300
|
+
|
|
301
|
+
MCP 模式提供 3 个核心工具,AI 助手可以主动调用:
|
|
302
|
+
|
|
303
|
+
#### 1. `record_session`
|
|
304
|
+
|
|
305
|
+
**功能**:记录 AI 会话的元数据和统计信息
|
|
306
|
+
|
|
307
|
+
**参数**:
|
|
308
|
+
- `session_id` (string, 可选):会话 ID,不提供则自动生成 UUID
|
|
309
|
+
- `metadata` (dict, 可选):会话元数据
|
|
310
|
+
- `user_intent`:用户意图描述
|
|
311
|
+
- `model`:模型名称(如 "claude-sonnet-4-5")
|
|
312
|
+
- `ide`:IDE 类型(如 "cursor", "claude-code")
|
|
313
|
+
- `project_path`:项目路径
|
|
314
|
+
|
|
315
|
+
**返回示例**:
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"success": true,
|
|
319
|
+
"session_id": "uuid-xxx",
|
|
320
|
+
"timestamp": "2025-01-07T10:00:00Z",
|
|
321
|
+
"git_info": {
|
|
322
|
+
"git_repo_path": "yourorg/devlake",
|
|
323
|
+
"git_branch": "main",
|
|
324
|
+
"git_author": "Your Name"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**使用示例**:
|
|
330
|
+
```
|
|
331
|
+
调用 record_session 工具,metadata 设置为 {"ide": "cursor", "model": "claude-sonnet-4-5"}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
#### 2. `before_edit_file`
|
|
337
|
+
|
|
338
|
+
**功能**:在文件变更前调用,记录文件的当前状态(快照)
|
|
339
|
+
|
|
340
|
+
**参数**:
|
|
341
|
+
- `session_id` (string, 必需):会话唯一标识
|
|
342
|
+
- `file_paths` (list[string], 必需):即将变更的文件绝对路径列表
|
|
343
|
+
|
|
344
|
+
**返回示例**:
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"success": true,
|
|
348
|
+
"session_id": "session-123",
|
|
349
|
+
"files_snapshot": {
|
|
350
|
+
"/path/to/file.py": {
|
|
351
|
+
"exists": true,
|
|
352
|
+
"line_count": 100,
|
|
353
|
+
"size": 2048
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**使用示例**:
|
|
360
|
+
```
|
|
361
|
+
调用 before_edit_file 工具,session_id 为 "session-123",file_paths 为 ["/path/to/file.py"]
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
#### 3. `after_edit_file`
|
|
367
|
+
|
|
368
|
+
**功能**:在文件变更后调用,对比差异并上传变更数据到 DevLake API
|
|
369
|
+
|
|
370
|
+
**参数**:
|
|
371
|
+
- `session_id` (string, 必需):会话唯一标识(与 before_edit_file 一致)
|
|
372
|
+
- `file_paths` (list[string], 必需):已变更的文件绝对路径列表
|
|
373
|
+
|
|
374
|
+
**返回示例**:
|
|
375
|
+
```json
|
|
376
|
+
{
|
|
377
|
+
"success": true,
|
|
378
|
+
"session_id": "session-123",
|
|
379
|
+
"uploaded_count": 1,
|
|
380
|
+
"changes": [
|
|
381
|
+
{
|
|
382
|
+
"file_path": "src/main.py",
|
|
383
|
+
"change_type": "edit",
|
|
384
|
+
"file_type": "py"
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**工作流程**:
|
|
391
|
+
```
|
|
392
|
+
1. before_edit_file() - 记录文件变更前状态
|
|
393
|
+
2. [AI 执行文件变更操作]
|
|
394
|
+
3. after_edit_file() - 对比差异并上传
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**使用示例**:
|
|
398
|
+
```
|
|
399
|
+
调用 after_edit_file 工具,session_id 为 "session-123",file_paths 为 ["/path/to/file.py"]
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
### MCP 模式特点
|
|
405
|
+
|
|
406
|
+
- ✅ **AI 主动控制**:由 AI 决定何时记录数据
|
|
407
|
+
- ✅ **精确记录时机**:在最合适的时间点调用工具
|
|
408
|
+
- ✅ **完整的 before/after 对比**:准确的文件变更 diff
|
|
409
|
+
- ✅ **跨 IDE 支持**:适用于任何支持 MCP 的 AI 助手
|
|
410
|
+
- ✅ **手动 Session 管理**:AI 自行管理会话生命周期
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## 失败重试机制
|
|
415
|
+
|
|
416
|
+
DevLake MCP 内置智能失败重试队列,确保数据不会因网络问题或临时故障丢失。
|
|
417
|
+
|
|
418
|
+
### 工作原理
|
|
419
|
+
|
|
420
|
+
当 API 调用失败时,失败记录自动保存到本地队列,按**指数退避策略**自动重试:
|
|
421
|
+
|
|
422
|
+
| 重试次数 | 等待时间 |
|
|
423
|
+
|---------|---------|
|
|
424
|
+
| 第 1 次 | 1 分钟 |
|
|
425
|
+
| 第 2 次 | 5 分钟 |
|
|
426
|
+
| 第 3 次 | 15 分钟 |
|
|
427
|
+
| 第 4 次 | 60 分钟 |
|
|
428
|
+
| 第 5 次 | 4 小时 |
|
|
429
|
+
|
|
430
|
+
### 队列管理命令
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
# 查看失败队列状态和统计
|
|
434
|
+
devlake-mcp queue-status
|
|
435
|
+
|
|
436
|
+
# 手动触发重试(不等待自动重试时间)
|
|
437
|
+
devlake-mcp retry
|
|
438
|
+
|
|
439
|
+
# 清理过期的失败记录(默认保留 7 天)
|
|
440
|
+
devlake-mcp queue-clean
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 配置选项
|
|
444
|
+
|
|
445
|
+
通过环境变量配置重试行为:
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
# 启用/禁用重试(默认 true)
|
|
449
|
+
export DEVLAKE_RETRY_ENABLED=true
|
|
450
|
+
|
|
451
|
+
# 最大重试次数(默认 5)
|
|
452
|
+
export DEVLAKE_RETRY_MAX_ATTEMPTS=5
|
|
453
|
+
|
|
454
|
+
# 失败记录保留天数(默认 7)
|
|
455
|
+
export DEVLAKE_RETRY_CLEANUP_DAYS=7
|
|
456
|
+
|
|
457
|
+
# Hook 执行时检查重试(默认 true)
|
|
458
|
+
export DEVLAKE_RETRY_CHECK_ON_HOOK=true
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 自动重试
|
|
462
|
+
|
|
463
|
+
当 `DEVLAKE_RETRY_CHECK_ON_HOOK=true` 时(默认),每次 Hook 执行时会自动检查并重试失败的记录(每次最多 3 条,避免阻塞)。
|
|
464
|
+
|
|
465
|
+
如需禁用自动重试:
|
|
466
|
+
```bash
|
|
467
|
+
export DEVLAKE_RETRY_CHECK_ON_HOOK=false
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
然后使用 `devlake-mcp retry` 手动触发。
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## CLI 命令总览
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
# MCP 服务器
|
|
478
|
+
devlake-mcp # 启动 MCP 服务器
|
|
479
|
+
|
|
480
|
+
# Hooks 初始化
|
|
481
|
+
devlake-mcp init # 初始化 Claude Code hooks
|
|
482
|
+
devlake-mcp init --force # 强制覆盖 Claude Code hooks
|
|
483
|
+
devlake-mcp init-cursor # 初始化 Cursor hooks
|
|
484
|
+
devlake-mcp init-cursor --force # 强制覆盖 Cursor hooks
|
|
485
|
+
|
|
486
|
+
# 失败队列管理
|
|
487
|
+
devlake-mcp queue-status # 查看失败队列状态
|
|
488
|
+
devlake-mcp retry # 手动触发重试
|
|
489
|
+
devlake-mcp queue-clean # 清理过期记录
|
|
490
|
+
|
|
491
|
+
# 版本信息
|
|
492
|
+
devlake-mcp --version # 显示版本号
|
|
493
|
+
devlake-mcp info # 显示详细的版本和功能支持信息
|
|
494
|
+
devlake-mcp --help # 显示帮助信息
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## 使用建议
|
|
500
|
+
|
|
501
|
+
### 选择合适的模式
|
|
502
|
+
|
|
503
|
+
| 场景 | 推荐模式 | 理由 |
|
|
504
|
+
|------|---------|------|
|
|
505
|
+
| 日常开发 | **Hooks 模式** | 自动采集,无需关注 |
|
|
506
|
+
| 精确控制记录时机 | **MCP 模式** | AI 主动决定何时记录 |
|
|
507
|
+
| Claude Code | **Hooks 模式** | 原生集成,体验最佳 |
|
|
508
|
+
| Cursor | **Hooks 模式** | 专门优化,功能最全 |
|
|
509
|
+
| Claude Desktop | **MCP 模式** | 标准 MCP 协议支持 |
|
|
510
|
+
|
|
511
|
+
### 两种模式可以共存
|
|
512
|
+
|
|
513
|
+
Hooks 模式和 MCP 模式可以同时启用:
|
|
514
|
+
- Hooks 模式负责自动采集日常数据
|
|
515
|
+
- MCP 模式让 AI 在特殊场景下主动记录
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## 相关资源
|
|
520
|
+
|
|
521
|
+
- [Model Context Protocol 官方文档](https://modelcontextprotocol.io)
|
|
522
|
+
- [FastMCP 官方文档](https://gofastmcp.com)
|
|
523
|
+
- [FastMCP GitHub](https://github.com/jlowin/fastmcp)
|
|
524
|
+
- [Claude Desktop](https://claude.ai/download)
|
|
525
|
+
- [Cursor 编辑器](https://cursor.sh)
|
|
526
|
+
- [Cursor Hooks 详细文档](CURSOR_HOOKS.md)
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
530
|
+
## Git 配置要求
|
|
531
|
+
|
|
532
|
+
工具会自动从 Git 配置读取用户信息,请确保已配置:
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
# 配置 Git 用户信息
|
|
536
|
+
git config user.name "Your Name"
|
|
537
|
+
git config user.email "your.email@example.com"
|
|
538
|
+
|
|
539
|
+
# 配置仓库远程地址
|
|
540
|
+
git remote add origin <repository-url>
|
|
541
|
+
```
|