stigmergy 1.0.68 → 1.0.70
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/README.en.md +306 -300
- package/README.md +469 -301
- package/package.json +97 -81
- package/scripts/publish.js +268 -0
- package/scripts/simple-publish.js +59 -0
- package/src/index.js +12 -0
- package/test/enhanced-main-alignment.test.js +298 -0
- package/test/hook-system-integration-test.js +307 -0
- package/test/natural-language-skills-test.js +320 -0
- package/test/nl-integration-test.js +179 -0
- package/test/parameter-parsing-test.js +143 -0
- package/test/real-test.js +435 -0
- package/test/system-compatibility-test.js +447 -0
- package/test/tdd-fixes-test.js +211 -0
- package/test/third-party-skills-test.js +321 -0
- package/test/tool-selection-integration-test.js +157 -0
- package/test/unit/cli-scanner.test.js +291 -0
- package/test/unit/cross-cli-executor.test.js +399 -0
- package/src/adapters/claude/__init__.py +0 -13
- package/src/adapters/claude/claude_skills_integration.py +0 -609
- package/src/adapters/claude/hook_adapter.py +0 -663
- package/src/adapters/claude/install_claude_integration.py +0 -265
- package/src/adapters/claude/skills_hook_adapter.py +0 -841
- package/src/adapters/claude/standalone_claude_adapter.py +0 -384
- package/src/adapters/cline/__init__.py +0 -20
- package/src/adapters/cline/config.py +0 -108
- package/src/adapters/cline/install_cline_integration.py +0 -617
- package/src/adapters/cline/mcp_server.py +0 -713
- package/src/adapters/cline/standalone_cline_adapter.py +0 -459
- package/src/adapters/codebuddy/__init__.py +0 -13
- package/src/adapters/codebuddy/buddy_adapter.py +0 -1125
- package/src/adapters/codebuddy/install_codebuddy_integration.py +0 -279
- package/src/adapters/codebuddy/skills_hook_adapter.py +0 -672
- package/src/adapters/codebuddy/skills_integration.py +0 -395
- package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +0 -403
- package/src/adapters/codex/__init__.py +0 -11
- package/src/adapters/codex/base.py +0 -46
- package/src/adapters/codex/install_codex_integration.py +0 -311
- package/src/adapters/codex/mcp_server.py +0 -493
- package/src/adapters/codex/natural_language_parser.py +0 -82
- package/src/adapters/codex/slash_command_adapter.py +0 -326
- package/src/adapters/codex/standalone_codex_adapter.py +0 -362
- package/src/adapters/copilot/__init__.py +0 -13
- package/src/adapters/copilot/install_copilot_integration.py +0 -564
- package/src/adapters/copilot/mcp_adapter.py +0 -772
- package/src/adapters/copilot/mcp_server.py +0 -168
- package/src/adapters/copilot/standalone_copilot_adapter.py +0 -114
- package/src/adapters/gemini/__init__.py +0 -13
- package/src/adapters/gemini/extension_adapter.py +0 -690
- package/src/adapters/gemini/install_gemini_integration.py +0 -257
- package/src/adapters/gemini/standalone_gemini_adapter.py +0 -366
- package/src/adapters/iflow/__init__.py +0 -7
- package/src/adapters/iflow/hook_adapter.py +0 -1038
- package/src/adapters/iflow/hook_installer.py +0 -536
- package/src/adapters/iflow/install_iflow_integration.py +0 -271
- package/src/adapters/iflow/official_hook_adapter.py +0 -1272
- package/src/adapters/iflow/standalone_iflow_adapter.py +0 -48
- package/src/adapters/iflow/workflow_adapter.py +0 -793
- package/src/adapters/qoder/hook_installer.py +0 -732
- package/src/adapters/qoder/install_qoder_integration.py +0 -265
- package/src/adapters/qoder/notification_hook_adapter.py +0 -863
- package/src/adapters/qoder/standalone_qoder_adapter.py +0 -48
- package/src/adapters/qwen/__init__.py +0 -17
- package/src/adapters/qwencode/__init__.py +0 -13
- package/src/adapters/qwencode/inheritance_adapter.py +0 -818
- package/src/adapters/qwencode/install_qwencode_integration.py +0 -276
- package/src/adapters/qwencode/standalone_qwencode_adapter.py +0 -399
- package/src/atomic_collaboration_handler.py +0 -461
- package/src/cli_collaboration_agent.py +0 -697
- package/src/collaboration/hooks.py +0 -315
- package/src/core/__init__.py +0 -21
- package/src/core/ai_environment_scanner.py +0 -331
- package/src/core/base_adapter.py +0 -220
- package/src/core/cli_hook_integration.py +0 -406
- package/src/core/cross_cli_executor.py +0 -713
- package/src/core/cross_cli_mapping.py +0 -1165
- package/src/core/cross_platform_encoding.py +0 -365
- package/src/core/cross_platform_safe_cli.py +0 -894
- package/src/core/direct_cli_executor.py +0 -805
- package/src/core/direct_cli_hook_system.py +0 -958
- package/src/core/enhanced_init_processor.py +0 -467
- package/src/core/graceful_cli_executor.py +0 -912
- package/src/core/md_enhancer.py +0 -342
- package/src/core/md_generator.py +0 -619
- package/src/core/models.py +0 -218
- package/src/core/parser.py +0 -108
- package/src/core/real_cli_hook_system.py +0 -852
- package/src/core/real_cross_cli_system.py +0 -925
- package/src/core/verified_cross_cli_system.py +0 -961
- package/src/deploy.js +0 -737
- package/src/enhanced-main.js +0 -626
- package/src/enhanced_deploy.js +0 -303
- package/src/enhanced_universal_cli_setup.py +0 -930
- package/src/kimi_wrapper.py +0 -104
- package/src/main.js +0 -1309
- package/src/shell_integration.py +0 -398
- package/src/simple-main.js +0 -315
- package/src/smart_router_creator.py +0 -323
- package/src/universal_cli_setup.py +0 -1289
- package/src/utils/__init__.py +0 -12
- package/src/utils/cli_detector.py +0 -445
- package/src/utils/file_utils.py +0 -246
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
独立 CodeBuddy CLI 适配器 - 完全无抽象层
|
|
3
|
-
|
|
4
|
-
基于 CodeBuddy CLI 官方 Skills Hook 系统的原生集成:
|
|
5
|
-
- 使用 CodeBuddy CLI 官方 Skills Hook 机制
|
|
6
|
-
- 无任何抽象基类或 Factory 系统
|
|
7
|
-
- 不改变 CLI 启动和使用方式
|
|
8
|
-
- 纯粹的原生扩展实现
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import os
|
|
12
|
-
import json
|
|
13
|
-
import logging
|
|
14
|
-
import asyncio
|
|
15
|
-
import re
|
|
16
|
-
from typing import Dict, Any, Optional, List
|
|
17
|
-
from datetime import datetime
|
|
18
|
-
|
|
19
|
-
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class CodeBuddySkillsContext:
|
|
23
|
-
"""CodeBuddy CLI Skills Hook 上下文 - 独立实现"""
|
|
24
|
-
|
|
25
|
-
def __init__(self, skill_name: str = "", parameters: Dict[str, Any] = None, metadata: Optional[Dict] = None):
|
|
26
|
-
self.skill_name = skill_name
|
|
27
|
-
self.parameters = parameters or {}
|
|
28
|
-
self.metadata = metadata or {}
|
|
29
|
-
self.session_id = self.metadata.get('session_id', 'unknown')
|
|
30
|
-
self.user_id = self.metadata.get('user_id', 'unknown')
|
|
31
|
-
self.timestamp = datetime.now()
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class StandaloneCodeBuddyAdapter:
|
|
35
|
-
"""
|
|
36
|
-
独立的 CodeBuddy CLI Skills Hook 适配器
|
|
37
|
-
|
|
38
|
-
直接基于 CodeBuddy CLI 官方 Skills Hook 系统,无任何抽象层:
|
|
39
|
-
- Skills Hook 系统集成
|
|
40
|
-
- Buddy 适配器模式
|
|
41
|
-
- 原生技能调用
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
def __init__(self):
|
|
45
|
-
"""初始化 - 纯实现,无抽象"""
|
|
46
|
-
self.cli_name = "codebuddy"
|
|
47
|
-
self.version = "1.0.0"
|
|
48
|
-
self.buddy_name = "CrossCLI Buddy"
|
|
49
|
-
|
|
50
|
-
# Skills Hook 配置
|
|
51
|
-
self.skills_config_file = os.path.expanduser("~/.config/codebuddy/skills_hooks.json")
|
|
52
|
-
self.skills_registered = False
|
|
53
|
-
|
|
54
|
-
# 统计信息
|
|
55
|
-
self.execution_count = 0
|
|
56
|
-
self.error_count = 0
|
|
57
|
-
self.skill_calls_count = 0
|
|
58
|
-
self.cross_cli_calls_count = 0
|
|
59
|
-
self.processed_skills: List[Dict[str, Any]] = []
|
|
60
|
-
self.last_execution: Optional[datetime] = None
|
|
61
|
-
|
|
62
|
-
# 直接跨CLI处理器 - 无Factory
|
|
63
|
-
self._cli_handlers = {}
|
|
64
|
-
self._init_cli_handlers()
|
|
65
|
-
|
|
66
|
-
# 配置
|
|
67
|
-
self.config = self._load_config()
|
|
68
|
-
|
|
69
|
-
logger.info("独立 CodeBuddy CLI Skills Hook 适配器初始化完成")
|
|
70
|
-
|
|
71
|
-
def _load_config(self) -> Dict[str, Any]:
|
|
72
|
-
"""加载配置"""
|
|
73
|
-
config_file = os.path.join(os.path.dirname(__file__), "config.json")
|
|
74
|
-
try:
|
|
75
|
-
with open(config_file, 'r', encoding='utf-8') as f:
|
|
76
|
-
return json.load(f)
|
|
77
|
-
except Exception as e:
|
|
78
|
-
logger.warning(f"配置加载失败: {e}")
|
|
79
|
-
return {"skills": [], "integration_settings": {"enable_cross_cli": True}}
|
|
80
|
-
|
|
81
|
-
def _init_cli_handlers(self):
|
|
82
|
-
"""初始化跨CLI处理器 - 直接导入,无Factory"""
|
|
83
|
-
try:
|
|
84
|
-
# 可以直接添加其他CLI处理器
|
|
85
|
-
# from ..claude.standalone_claude_adapter import get_standalone_claude_adapter
|
|
86
|
-
# self._cli_handlers['claude'] = get_standalone_claude_adapter()
|
|
87
|
-
logger.info("跨CLI处理器初始化完成")
|
|
88
|
-
except Exception as e:
|
|
89
|
-
logger.warning(f"跨CLI处理器初始化失败: {e}")
|
|
90
|
-
|
|
91
|
-
def is_available(self) -> bool:
|
|
92
|
-
"""检查是否可用 - 直接检查 CodeBuddy CLI"""
|
|
93
|
-
try:
|
|
94
|
-
# 检查CodeBuddy CLI是否可用
|
|
95
|
-
import subprocess
|
|
96
|
-
result = subprocess.run(['codebuddy', '--version'], capture_output=True, text=True, timeout=10)
|
|
97
|
-
return result.returncode == 0
|
|
98
|
-
except Exception:
|
|
99
|
-
return False
|
|
100
|
-
|
|
101
|
-
async def execute_task(self, task: str, context: Dict[str, Any] = None) -> str:
|
|
102
|
-
"""
|
|
103
|
-
执行任务 - 纯实现,无抽象层
|
|
104
|
-
|
|
105
|
-
Args:
|
|
106
|
-
task: 任务内容
|
|
107
|
-
context: 执行上下文
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
str: 执行结果
|
|
111
|
-
"""
|
|
112
|
-
if context is None:
|
|
113
|
-
context = {}
|
|
114
|
-
|
|
115
|
-
try:
|
|
116
|
-
self.execution_count += 1
|
|
117
|
-
self.last_execution = datetime.now()
|
|
118
|
-
|
|
119
|
-
# 创建 Skills Hook 上下文
|
|
120
|
-
skills_context = CodeBuddySkillsContext(
|
|
121
|
-
skill_name="cross_cli_task",
|
|
122
|
-
parameters={"task": task},
|
|
123
|
-
metadata=context.get('metadata', {})
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# 通过 Skills Hook 处理
|
|
127
|
-
result = await self.handle_cross_cli_skill(skills_context)
|
|
128
|
-
|
|
129
|
-
# 如果 Skills Hook 没有处理,则本地处理
|
|
130
|
-
if result is None:
|
|
131
|
-
# 检测跨CLI调用
|
|
132
|
-
cross_cli_intent = self._detect_cross_cli_intent(task)
|
|
133
|
-
if cross_cli_intent:
|
|
134
|
-
return await self._handle_cross_cli_call(cross_cli_intent, context)
|
|
135
|
-
|
|
136
|
-
# 本地 CodeBuddy 处理
|
|
137
|
-
result = f"[CodeBuddy CLI 本地处理] {task}"
|
|
138
|
-
|
|
139
|
-
return result
|
|
140
|
-
|
|
141
|
-
except Exception as e:
|
|
142
|
-
self.error_count += 1
|
|
143
|
-
logger.error(f"任务执行失败: {task}, 错误: {e}")
|
|
144
|
-
return f"[错误] {task} 执行失败: {str(e)}"
|
|
145
|
-
|
|
146
|
-
def _detect_cross_cli_intent(self, text: str) -> Optional[str]:
|
|
147
|
-
"""检测跨CLI调用意图 - 简单实现,无抽象"""
|
|
148
|
-
# 中文模式
|
|
149
|
-
cn_patterns = [
|
|
150
|
-
r'请用(\w+)\s*帮我?([^。!?\n]*)',
|
|
151
|
-
r'调用(\w+)\s*来([^。!?\n]*)',
|
|
152
|
-
r'用(\w+)\s*帮我?([^。!?\n]*)'
|
|
153
|
-
]
|
|
154
|
-
|
|
155
|
-
for pattern in cn_patterns:
|
|
156
|
-
match = re.search(pattern, text, re.IGNORECASE)
|
|
157
|
-
if match:
|
|
158
|
-
cli_name = match.group(1).lower()
|
|
159
|
-
task = match.group(2).strip()
|
|
160
|
-
if cli_name != self.cli_name: # 避免自我调用
|
|
161
|
-
return f"{cli_name} {task}"
|
|
162
|
-
|
|
163
|
-
# 英文模式
|
|
164
|
-
en_patterns = [
|
|
165
|
-
r'use\s+(\w+)\s+to\s+([^.\n!?]*)',
|
|
166
|
-
r'call\s+(\w+)\s+to\s+([^.\n!?]*)',
|
|
167
|
-
r'ask\s+(\w+)\s+for\s+([^.\n!?]*)'
|
|
168
|
-
]
|
|
169
|
-
|
|
170
|
-
for pattern in en_patterns:
|
|
171
|
-
match = re.search(pattern, text, re.IGNORECASE)
|
|
172
|
-
if match:
|
|
173
|
-
cli_name = match.group(1).lower()
|
|
174
|
-
task = match.group(2).strip()
|
|
175
|
-
if cli_name != self.cli_name: # 避免自我调用
|
|
176
|
-
return f"{cli_name} {task}"
|
|
177
|
-
|
|
178
|
-
return None
|
|
179
|
-
|
|
180
|
-
async def _handle_cross_cli_call(self, command: str, context: Dict[str, Any]) -> str:
|
|
181
|
-
"""处理跨CLI调用 - 直接实现,无抽象层"""
|
|
182
|
-
if ' ' not in command:
|
|
183
|
-
return "跨CLI命令格式错误,请使用: <CLI> <任务>"
|
|
184
|
-
|
|
185
|
-
cli_name, task = command.split(' ', 1)
|
|
186
|
-
cli_name = cli_name.lower()
|
|
187
|
-
|
|
188
|
-
try:
|
|
189
|
-
self.cross_cli_calls_count += 1
|
|
190
|
-
|
|
191
|
-
# 直接调用目标CLI - 无抽象层
|
|
192
|
-
if cli_name in self._cli_handlers:
|
|
193
|
-
handler = self._cli_handlers[cli_name]
|
|
194
|
-
if hasattr(handler, 'execute_task'):
|
|
195
|
-
result = await handler.execute_task(task, {'source_cli': 'codebuddy'})
|
|
196
|
-
return self._format_cross_cli_result(cli_name, task, result)
|
|
197
|
-
|
|
198
|
-
# 模拟跨CLI调用结果
|
|
199
|
-
result = f"[{cli_name.upper()} CLI 处理结果] {task}"
|
|
200
|
-
return self._format_cross_cli_result(cli_name, task, result)
|
|
201
|
-
|
|
202
|
-
except Exception as e:
|
|
203
|
-
logger.error(f"跨CLI调用失败: {cli_name}, {e}")
|
|
204
|
-
return f"跨CLI调用失败: {cli_name} - {str(e)}"
|
|
205
|
-
|
|
206
|
-
def _format_cross_cli_result(self, target_cli: str, task: str, result: str) -> str:
|
|
207
|
-
"""格式化跨CLI调用结果"""
|
|
208
|
-
return f"""## 🔗 跨CLI调用结果
|
|
209
|
-
|
|
210
|
-
**源工具**: CodeBuddy CLI (Skills Hook 系统)
|
|
211
|
-
**目标工具**: {target_cli.upper()}
|
|
212
|
-
**任务**: {task}
|
|
213
|
-
**执行时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
{result}
|
|
218
|
-
|
|
219
|
-
---
|
|
220
|
-
|
|
221
|
-
*CodeBuddy Skills Hook 系统原生集成 - 无抽象层*"""
|
|
222
|
-
|
|
223
|
-
# Skills Hook 处理方法 - 基于 CodeBuddy CLI 官方 Skills Hook 机制
|
|
224
|
-
async def handle_cross_cli_skill(self, context: CodeBuddySkillsContext) -> Optional[str]:
|
|
225
|
-
"""
|
|
226
|
-
处理跨CLI技能调用
|
|
227
|
-
|
|
228
|
-
这是基于 CodeBuddy CLI 官方 Skills Hook 系统的原生实现。
|
|
229
|
-
"""
|
|
230
|
-
try:
|
|
231
|
-
self.skill_calls_count += 1
|
|
232
|
-
task = context.parameters.get('task', '')
|
|
233
|
-
|
|
234
|
-
# 记录技能调用
|
|
235
|
-
self.processed_skills.append({
|
|
236
|
-
'skill_type': 'cross_cli_task',
|
|
237
|
-
'skill_name': context.skill_name,
|
|
238
|
-
'parameters': context.parameters,
|
|
239
|
-
'metadata': context.metadata,
|
|
240
|
-
'timestamp': datetime.now().isoformat()
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
# 检测跨CLI调用
|
|
244
|
-
cross_cli_intent = self._detect_cross_cli_intent(task)
|
|
245
|
-
if cross_cli_intent:
|
|
246
|
-
return await self._handle_cross_cli_call(cross_cli_intent, context.metadata)
|
|
247
|
-
|
|
248
|
-
# 不是跨CLI调用,让 CodeBuddy 正常处理
|
|
249
|
-
return None
|
|
250
|
-
|
|
251
|
-
except Exception as e:
|
|
252
|
-
logger.error(f"Skills Hook 处理失败: {e}")
|
|
253
|
-
self.error_count += 1
|
|
254
|
-
return None # 错误时让 CodeBuddy 继续正常处理
|
|
255
|
-
|
|
256
|
-
async def handle_buddy_request(self, request: str, context: CodeBuddySkillsContext) -> Optional[str]:
|
|
257
|
-
"""
|
|
258
|
-
处理 Buddy 请求
|
|
259
|
-
|
|
260
|
-
基于 CodeBuddy CLI 官方 Buddy 适配器模式的原生实现。
|
|
261
|
-
"""
|
|
262
|
-
try:
|
|
263
|
-
# 记录 Buddy 请求
|
|
264
|
-
self.processed_skills.append({
|
|
265
|
-
'skill_type': 'buddy_request',
|
|
266
|
-
'request': request,
|
|
267
|
-
'context': context.__dict__,
|
|
268
|
-
'timestamp': datetime.now().isoformat()
|
|
269
|
-
})
|
|
270
|
-
|
|
271
|
-
# 检测跨CLI调用
|
|
272
|
-
cross_cli_intent = self._detect_cross_cli_intent(request)
|
|
273
|
-
if cross_cli_intent:
|
|
274
|
-
return await self._handle_cross_cli_call(cross_cli_intent, context.metadata)
|
|
275
|
-
|
|
276
|
-
# 不是跨CLI调用,让 CodeBuddy 正常处理
|
|
277
|
-
return None
|
|
278
|
-
|
|
279
|
-
except Exception as e:
|
|
280
|
-
logger.error(f"Buddy 请求处理失败: {e}")
|
|
281
|
-
self.error_count += 1
|
|
282
|
-
return None
|
|
283
|
-
|
|
284
|
-
async def initialize(self) -> bool:
|
|
285
|
-
"""初始化适配器"""
|
|
286
|
-
try:
|
|
287
|
-
# 检查 CodeBuddy CLI 环境
|
|
288
|
-
if not self.is_available():
|
|
289
|
-
logger.warning("CodeBuddy CLI 不可用")
|
|
290
|
-
return False
|
|
291
|
-
|
|
292
|
-
# 注册 Skills Hook 到 CodeBuddy CLI
|
|
293
|
-
await self._register_skills_hooks()
|
|
294
|
-
|
|
295
|
-
# 创建配置目录
|
|
296
|
-
os.makedirs(os.path.dirname(self.skills_config_file), exist_ok=True)
|
|
297
|
-
|
|
298
|
-
self.skills_registered = True
|
|
299
|
-
logger.info("CodeBuddy Skills Hook 适配器初始化成功 - 独立模式")
|
|
300
|
-
return True
|
|
301
|
-
|
|
302
|
-
except Exception as e:
|
|
303
|
-
logger.error(f"适配器初始化失败: {e}")
|
|
304
|
-
return False
|
|
305
|
-
|
|
306
|
-
async def _register_skills_hooks(self) -> bool:
|
|
307
|
-
"""注册 Skills Hook 到 CodeBuddy CLI"""
|
|
308
|
-
try:
|
|
309
|
-
# 读取现有 skills 配置
|
|
310
|
-
skills_config = self._load_skills_config()
|
|
311
|
-
|
|
312
|
-
# 添加跨CLI Skills Hook
|
|
313
|
-
cross_cli_skills_hook = {
|
|
314
|
-
"name": "cross-cli-skills-hook",
|
|
315
|
-
"version": "1.0.0",
|
|
316
|
-
"description": "跨CLI调用集成Skills Hook系统",
|
|
317
|
-
"author": "Smart CLI Router",
|
|
318
|
-
"module": "src.adapters.codebuddy.standalone_codebuddy_adapter",
|
|
319
|
-
"class": "StandaloneCodeBuddyAdapter",
|
|
320
|
-
"enabled": True,
|
|
321
|
-
"priority": 100,
|
|
322
|
-
"skills": [
|
|
323
|
-
{
|
|
324
|
-
"name": "cross_cli_task",
|
|
325
|
-
"description": "执行跨CLI任务",
|
|
326
|
-
"parameters": ["task"]
|
|
327
|
-
}
|
|
328
|
-
]
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
# 检查是否已存在
|
|
332
|
-
existing_skills = skills_config.get('skills_hooks', [])
|
|
333
|
-
skill_exists = any(
|
|
334
|
-
skill['name'] == cross_cli_skills_hook['name']
|
|
335
|
-
for skill in existing_skills
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
if not skill_exists:
|
|
339
|
-
existing_skills.append(cross_cli_skills_hook)
|
|
340
|
-
skills_config['skills_hooks'] = existing_skills
|
|
341
|
-
await self._save_skills_config(skills_config)
|
|
342
|
-
logger.info(f"注册 Skills Hook: {cross_cli_skills_hook['name']}")
|
|
343
|
-
else:
|
|
344
|
-
logger.info("Skills Hook 已存在,跳过注册")
|
|
345
|
-
|
|
346
|
-
return True
|
|
347
|
-
|
|
348
|
-
except Exception as e:
|
|
349
|
-
logger.error(f"Skills Hook 注册失败: {e}")
|
|
350
|
-
return False
|
|
351
|
-
|
|
352
|
-
def _load_skills_config(self) -> Dict[str, Any]:
|
|
353
|
-
"""加载 Skills 配置"""
|
|
354
|
-
if os.path.exists(self.skills_config_file):
|
|
355
|
-
try:
|
|
356
|
-
with open(self.skills_config_file, 'r', encoding='utf-8') as f:
|
|
357
|
-
return json.load(f)
|
|
358
|
-
except Exception as e:
|
|
359
|
-
logger.warning(f"加载 Skills 配置失败: {e}")
|
|
360
|
-
|
|
361
|
-
return {"version": "1.0", "skills_hooks": []}
|
|
362
|
-
|
|
363
|
-
async def _save_skills_config(self, config: Dict[str, Any]) -> bool:
|
|
364
|
-
"""保存 Skills 配置"""
|
|
365
|
-
try:
|
|
366
|
-
with open(self.skills_config_file, 'w', encoding='utf-8') as f:
|
|
367
|
-
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
368
|
-
return True
|
|
369
|
-
except Exception as e:
|
|
370
|
-
logger.error(f"保存 Skills 配置失败: {e}")
|
|
371
|
-
return False
|
|
372
|
-
|
|
373
|
-
def get_statistics(self) -> Dict[str, Any]:
|
|
374
|
-
"""获取统计信息 - 直接实现"""
|
|
375
|
-
success_rate = ((self.execution_count - self.error_count) / self.execution_count) if self.execution_count > 0 else 1.0
|
|
376
|
-
|
|
377
|
-
return {
|
|
378
|
-
'cli_name': self.cli_name,
|
|
379
|
-
'version': self.version,
|
|
380
|
-
'buddy_name': self.buddy_name,
|
|
381
|
-
'skills_registered': self.skills_registered,
|
|
382
|
-
'execution_count': self.execution_count,
|
|
383
|
-
'skill_calls_count': self.skill_calls_count,
|
|
384
|
-
'cross_cli_calls_count': self.cross_cli_calls_count,
|
|
385
|
-
'error_count': self.error_count,
|
|
386
|
-
'success_rate': success_rate,
|
|
387
|
-
'last_execution': self.last_execution.isoformat() if self.last_execution else None,
|
|
388
|
-
'design': 'standalone_skills_hook_native',
|
|
389
|
-
'no_abstraction': True,
|
|
390
|
-
'skills_config_file': self.skills_config_file
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
# 便捷函数 - 无抽象层
|
|
395
|
-
def get_standalone_codebuddy_adapter() -> StandaloneCodeBuddyAdapter:
|
|
396
|
-
"""获取独立的 CodeBuddy CLI 适配器实例"""
|
|
397
|
-
return StandaloneCodeBuddyAdapter()
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
# 保持向后兼容的函数名
|
|
401
|
-
def get_codebuddy_skills_adapter() -> StandaloneCodeBuddyAdapter:
|
|
402
|
-
"""获取 CodeBuddy Skills 适配器实例(向后兼容)"""
|
|
403
|
-
return get_standalone_codebuddy_adapter()
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Codex CLI 适配器包
|
|
3
|
-
|
|
4
|
-
基于 OpenAI Codex API 的斜杠命令和 MCP 扩展系统
|
|
5
|
-
支持原生集成和跨 CLI 调用功能
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from .slash_command_adapter import CodexSlashCommandAdapter
|
|
9
|
-
from .mcp_server import CrossCliMCPServer
|
|
10
|
-
|
|
11
|
-
__all__ = ['CodexSlashCommandAdapter', 'CrossCliMCPServer']
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Codex CLI 适配器基础类
|
|
3
|
-
简化设计,专注于直接原生集成,无抽象层
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from abc import ABC, abstractmethod
|
|
7
|
-
from typing import Dict, Any, Optional
|
|
8
|
-
from datetime import datetime
|
|
9
|
-
import logging
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class BaseCodexAdapter(ABC):
|
|
15
|
-
"""Codex CLI 适配器基础类 - 最简设计"""
|
|
16
|
-
|
|
17
|
-
def __init__(self, cli_name: str):
|
|
18
|
-
self.cli_name = cli_name.lower().strip()
|
|
19
|
-
self.version = "1.0.0"
|
|
20
|
-
self.last_execution_time: Optional[datetime] = None
|
|
21
|
-
self.execution_count = 0
|
|
22
|
-
self.error_count = 0
|
|
23
|
-
|
|
24
|
-
@abstractmethod
|
|
25
|
-
async def execute_task(self, task: str, context: Dict[str, Any]) -> str:
|
|
26
|
-
"""执行任务 - 直接实现"""
|
|
27
|
-
pass
|
|
28
|
-
|
|
29
|
-
@abstractmethod
|
|
30
|
-
def is_available(self) -> bool:
|
|
31
|
-
"""检查可用性 - 直接检查"""
|
|
32
|
-
pass
|
|
33
|
-
|
|
34
|
-
def record_error(self):
|
|
35
|
-
"""记录错误"""
|
|
36
|
-
self.error_count += 1
|
|
37
|
-
|
|
38
|
-
def get_statistics(self) -> Dict[str, Any]:
|
|
39
|
-
"""获取统计信息"""
|
|
40
|
-
return {
|
|
41
|
-
'cli_name': self.cli_name,
|
|
42
|
-
'version': self.version,
|
|
43
|
-
'execution_count': self.execution_count,
|
|
44
|
-
'error_count': self.error_count,
|
|
45
|
-
'last_execution_time': self.last_execution_time.isoformat() if self.last_execution_time else None
|
|
46
|
-
}
|