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.
Files changed (102) hide show
  1. package/README.en.md +306 -300
  2. package/README.md +469 -301
  3. package/package.json +97 -81
  4. package/scripts/publish.js +268 -0
  5. package/scripts/simple-publish.js +59 -0
  6. package/src/index.js +12 -0
  7. package/test/enhanced-main-alignment.test.js +298 -0
  8. package/test/hook-system-integration-test.js +307 -0
  9. package/test/natural-language-skills-test.js +320 -0
  10. package/test/nl-integration-test.js +179 -0
  11. package/test/parameter-parsing-test.js +143 -0
  12. package/test/real-test.js +435 -0
  13. package/test/system-compatibility-test.js +447 -0
  14. package/test/tdd-fixes-test.js +211 -0
  15. package/test/third-party-skills-test.js +321 -0
  16. package/test/tool-selection-integration-test.js +157 -0
  17. package/test/unit/cli-scanner.test.js +291 -0
  18. package/test/unit/cross-cli-executor.test.js +399 -0
  19. package/src/adapters/claude/__init__.py +0 -13
  20. package/src/adapters/claude/claude_skills_integration.py +0 -609
  21. package/src/adapters/claude/hook_adapter.py +0 -663
  22. package/src/adapters/claude/install_claude_integration.py +0 -265
  23. package/src/adapters/claude/skills_hook_adapter.py +0 -841
  24. package/src/adapters/claude/standalone_claude_adapter.py +0 -384
  25. package/src/adapters/cline/__init__.py +0 -20
  26. package/src/adapters/cline/config.py +0 -108
  27. package/src/adapters/cline/install_cline_integration.py +0 -617
  28. package/src/adapters/cline/mcp_server.py +0 -713
  29. package/src/adapters/cline/standalone_cline_adapter.py +0 -459
  30. package/src/adapters/codebuddy/__init__.py +0 -13
  31. package/src/adapters/codebuddy/buddy_adapter.py +0 -1125
  32. package/src/adapters/codebuddy/install_codebuddy_integration.py +0 -279
  33. package/src/adapters/codebuddy/skills_hook_adapter.py +0 -672
  34. package/src/adapters/codebuddy/skills_integration.py +0 -395
  35. package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +0 -403
  36. package/src/adapters/codex/__init__.py +0 -11
  37. package/src/adapters/codex/base.py +0 -46
  38. package/src/adapters/codex/install_codex_integration.py +0 -311
  39. package/src/adapters/codex/mcp_server.py +0 -493
  40. package/src/adapters/codex/natural_language_parser.py +0 -82
  41. package/src/adapters/codex/slash_command_adapter.py +0 -326
  42. package/src/adapters/codex/standalone_codex_adapter.py +0 -362
  43. package/src/adapters/copilot/__init__.py +0 -13
  44. package/src/adapters/copilot/install_copilot_integration.py +0 -564
  45. package/src/adapters/copilot/mcp_adapter.py +0 -772
  46. package/src/adapters/copilot/mcp_server.py +0 -168
  47. package/src/adapters/copilot/standalone_copilot_adapter.py +0 -114
  48. package/src/adapters/gemini/__init__.py +0 -13
  49. package/src/adapters/gemini/extension_adapter.py +0 -690
  50. package/src/adapters/gemini/install_gemini_integration.py +0 -257
  51. package/src/adapters/gemini/standalone_gemini_adapter.py +0 -366
  52. package/src/adapters/iflow/__init__.py +0 -7
  53. package/src/adapters/iflow/hook_adapter.py +0 -1038
  54. package/src/adapters/iflow/hook_installer.py +0 -536
  55. package/src/adapters/iflow/install_iflow_integration.py +0 -271
  56. package/src/adapters/iflow/official_hook_adapter.py +0 -1272
  57. package/src/adapters/iflow/standalone_iflow_adapter.py +0 -48
  58. package/src/adapters/iflow/workflow_adapter.py +0 -793
  59. package/src/adapters/qoder/hook_installer.py +0 -732
  60. package/src/adapters/qoder/install_qoder_integration.py +0 -265
  61. package/src/adapters/qoder/notification_hook_adapter.py +0 -863
  62. package/src/adapters/qoder/standalone_qoder_adapter.py +0 -48
  63. package/src/adapters/qwen/__init__.py +0 -17
  64. package/src/adapters/qwencode/__init__.py +0 -13
  65. package/src/adapters/qwencode/inheritance_adapter.py +0 -818
  66. package/src/adapters/qwencode/install_qwencode_integration.py +0 -276
  67. package/src/adapters/qwencode/standalone_qwencode_adapter.py +0 -399
  68. package/src/atomic_collaboration_handler.py +0 -461
  69. package/src/cli_collaboration_agent.py +0 -697
  70. package/src/collaboration/hooks.py +0 -315
  71. package/src/core/__init__.py +0 -21
  72. package/src/core/ai_environment_scanner.py +0 -331
  73. package/src/core/base_adapter.py +0 -220
  74. package/src/core/cli_hook_integration.py +0 -406
  75. package/src/core/cross_cli_executor.py +0 -713
  76. package/src/core/cross_cli_mapping.py +0 -1165
  77. package/src/core/cross_platform_encoding.py +0 -365
  78. package/src/core/cross_platform_safe_cli.py +0 -894
  79. package/src/core/direct_cli_executor.py +0 -805
  80. package/src/core/direct_cli_hook_system.py +0 -958
  81. package/src/core/enhanced_init_processor.py +0 -467
  82. package/src/core/graceful_cli_executor.py +0 -912
  83. package/src/core/md_enhancer.py +0 -342
  84. package/src/core/md_generator.py +0 -619
  85. package/src/core/models.py +0 -218
  86. package/src/core/parser.py +0 -108
  87. package/src/core/real_cli_hook_system.py +0 -852
  88. package/src/core/real_cross_cli_system.py +0 -925
  89. package/src/core/verified_cross_cli_system.py +0 -961
  90. package/src/deploy.js +0 -737
  91. package/src/enhanced-main.js +0 -626
  92. package/src/enhanced_deploy.js +0 -303
  93. package/src/enhanced_universal_cli_setup.py +0 -930
  94. package/src/kimi_wrapper.py +0 -104
  95. package/src/main.js +0 -1309
  96. package/src/shell_integration.py +0 -398
  97. package/src/simple-main.js +0 -315
  98. package/src/smart_router_creator.py +0 -323
  99. package/src/universal_cli_setup.py +0 -1289
  100. package/src/utils/__init__.py +0 -12
  101. package/src/utils/cli_detector.py +0 -445
  102. 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
- }