stigmergy 1.0.57
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 +19 -0
- package/README.de.md +301 -0
- package/README.en.md +301 -0
- package/README.es.md +301 -0
- package/README.fr.md +301 -0
- package/README.ja.md +301 -0
- package/README.ko.md +301 -0
- package/README.md +301 -0
- package/README.ru.md +301 -0
- package/README.zh.md +301 -0
- package/package.json +82 -0
- package/src/adapters/claude/__init__.py +13 -0
- package/src/adapters/claude/claude_skills_integration.py +609 -0
- package/src/adapters/claude/hook_adapter.py +663 -0
- package/src/adapters/claude/install_claude_integration.py +265 -0
- package/src/adapters/claude/skills_hook_adapter.py +841 -0
- package/src/adapters/claude/standalone_claude_adapter.py +384 -0
- package/src/adapters/cline/__init__.py +20 -0
- package/src/adapters/cline/config.py +108 -0
- package/src/adapters/cline/install_cline_integration.py +617 -0
- package/src/adapters/cline/mcp_server.py +713 -0
- package/src/adapters/cline/standalone_cline_adapter.py +459 -0
- package/src/adapters/codebuddy/__init__.py +13 -0
- package/src/adapters/codebuddy/buddy_adapter.py +1125 -0
- package/src/adapters/codebuddy/install_codebuddy_integration.py +279 -0
- package/src/adapters/codebuddy/skills_hook_adapter.py +672 -0
- package/src/adapters/codebuddy/skills_integration.py +395 -0
- package/src/adapters/codebuddy/standalone_codebuddy_adapter.py +403 -0
- package/src/adapters/codex/__init__.py +11 -0
- package/src/adapters/codex/base.py +46 -0
- package/src/adapters/codex/install_codex_integration.py +311 -0
- package/src/adapters/codex/mcp_server.py +493 -0
- package/src/adapters/codex/natural_language_parser.py +82 -0
- package/src/adapters/codex/slash_command_adapter.py +326 -0
- package/src/adapters/codex/standalone_codex_adapter.py +362 -0
- package/src/adapters/copilot/__init__.py +13 -0
- package/src/adapters/copilot/install_copilot_integration.py +564 -0
- package/src/adapters/copilot/mcp_adapter.py +772 -0
- package/src/adapters/copilot/mcp_server.py +168 -0
- package/src/adapters/copilot/standalone_copilot_adapter.py +114 -0
- package/src/adapters/gemini/__init__.py +13 -0
- package/src/adapters/gemini/extension_adapter.py +690 -0
- package/src/adapters/gemini/install_gemini_integration.py +257 -0
- package/src/adapters/gemini/standalone_gemini_adapter.py +366 -0
- package/src/adapters/iflow/__init__.py +7 -0
- package/src/adapters/iflow/hook_adapter.py +1038 -0
- package/src/adapters/iflow/hook_installer.py +536 -0
- package/src/adapters/iflow/install_iflow_integration.py +271 -0
- package/src/adapters/iflow/official_hook_adapter.py +1272 -0
- package/src/adapters/iflow/standalone_iflow_adapter.py +48 -0
- package/src/adapters/iflow/workflow_adapter.py +793 -0
- package/src/adapters/qoder/hook_installer.py +732 -0
- package/src/adapters/qoder/install_qoder_integration.py +265 -0
- package/src/adapters/qoder/notification_hook_adapter.py +863 -0
- package/src/adapters/qoder/standalone_qoder_adapter.py +48 -0
- package/src/adapters/qwen/__init__.py +17 -0
- package/src/adapters/qwencode/__init__.py +13 -0
- package/src/adapters/qwencode/inheritance_adapter.py +818 -0
- package/src/adapters/qwencode/install_qwencode_integration.py +276 -0
- package/src/adapters/qwencode/standalone_qwencode_adapter.py +399 -0
- package/src/atomic_collaboration_handler.py +461 -0
- package/src/cli_collaboration_agent.py +697 -0
- package/src/collaboration/hooks.py +315 -0
- package/src/core/__init__.py +21 -0
- package/src/core/ai_environment_scanner.py +331 -0
- package/src/core/base_adapter.py +220 -0
- package/src/core/cli_hook_integration.py +406 -0
- package/src/core/cross_cli_executor.py +713 -0
- package/src/core/cross_cli_mapping.py +1163 -0
- package/src/core/cross_platform_encoding.py +365 -0
- package/src/core/cross_platform_safe_cli.py +894 -0
- package/src/core/direct_cli_executor.py +805 -0
- package/src/core/direct_cli_hook_system.py +958 -0
- package/src/core/enhanced_init_processor.py +427 -0
- package/src/core/graceful_cli_executor.py +912 -0
- package/src/core/md_enhancer.py +342 -0
- package/src/core/md_generator.py +619 -0
- package/src/core/models.py +218 -0
- package/src/core/parser.py +108 -0
- package/src/core/real_cli_hook_system.py +852 -0
- package/src/core/real_cross_cli_system.py +925 -0
- package/src/core/verified_cross_cli_system.py +961 -0
- package/src/deploy.js +737 -0
- package/src/enhanced_deploy.js +303 -0
- package/src/enhanced_universal_cli_setup.py +930 -0
- package/src/kimi_wrapper.py +104 -0
- package/src/main.js +1309 -0
- package/src/shell_integration.py +398 -0
- package/src/simple-main.js +315 -0
- package/src/smart_router_creator.py +323 -0
- package/src/universal_cli_setup.py +1289 -0
- package/src/utils/__init__.py +12 -0
- package/src/utils/cli_detector.py +445 -0
- package/src/utils/file_utils.py +246 -0
|
@@ -0,0 +1,609 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Claude Skills Integration
|
|
3
|
+
Claude技能系统集成模块,提供Claude特化的技能发现、加载和管理功能
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import json
|
|
8
|
+
import asyncio
|
|
9
|
+
import importlib.util
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Dict, List, Optional, Any, Callable
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
import logging
|
|
14
|
+
|
|
15
|
+
from .skills_hook_adapter import ClaudeSkill, SkillConfig, HookType
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class ClaudeSkillMetadata:
|
|
22
|
+
"""Claude技能元数据"""
|
|
23
|
+
name: str
|
|
24
|
+
version: str = "1.0.0"
|
|
25
|
+
author: str = ""
|
|
26
|
+
description: str = ""
|
|
27
|
+
category: str = ""
|
|
28
|
+
tags: List[str] = None
|
|
29
|
+
dependencies: List[str] = None
|
|
30
|
+
entry_point: str = ""
|
|
31
|
+
claude_features: List[str] = None
|
|
32
|
+
intelligence_level: str = "standard" # basic, standard, advanced
|
|
33
|
+
learning_enabled: bool = True
|
|
34
|
+
config_schema: Dict[str, Any] = None
|
|
35
|
+
|
|
36
|
+
def __post_init__(self):
|
|
37
|
+
if self.tags is None:
|
|
38
|
+
self.tags = []
|
|
39
|
+
if self.dependencies is None:
|
|
40
|
+
self.dependencies = []
|
|
41
|
+
if self.claude_features is None:
|
|
42
|
+
self.claude_features = []
|
|
43
|
+
if self.config_schema is None:
|
|
44
|
+
self.config_schema = {}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class ClaudeSkillLoader:
|
|
48
|
+
"""Claude技能加载器"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, skills_directory: str = None):
|
|
51
|
+
self.skills_directory = Path(skills_directory) if skills_directory else Path(__file__).parent / "claude_skills"
|
|
52
|
+
self.loaded_skills = {}
|
|
53
|
+
self.skill_registry = {}
|
|
54
|
+
self.claude_feature_registry = {}
|
|
55
|
+
|
|
56
|
+
# 确保技能目录存在
|
|
57
|
+
self.skills_directory.mkdir(exist_ok=True)
|
|
58
|
+
|
|
59
|
+
async def discover_claude_skills(self) -> List[ClaudeSkillMetadata]:
|
|
60
|
+
"""发现所有可用Claude技能"""
|
|
61
|
+
skills = []
|
|
62
|
+
|
|
63
|
+
# 扫描Claude技能目录
|
|
64
|
+
if self.skills_directory.exists():
|
|
65
|
+
for skill_dir in self.skills_directory.iterdir():
|
|
66
|
+
if skill_dir.is_dir():
|
|
67
|
+
skill_metadata = await self._load_claude_skill_metadata(skill_dir)
|
|
68
|
+
if skill_metadata:
|
|
69
|
+
skills.append(skill_metadata)
|
|
70
|
+
|
|
71
|
+
# 扫描配置文件中的Claude技能
|
|
72
|
+
config_skills = await self._load_config_claude_skills()
|
|
73
|
+
skills.extend(config_skills)
|
|
74
|
+
|
|
75
|
+
# 注册Claude特性
|
|
76
|
+
self._register_claude_features(skills)
|
|
77
|
+
|
|
78
|
+
logger.info(f"发现 {len(skills)} 个Claude技能")
|
|
79
|
+
return skills
|
|
80
|
+
|
|
81
|
+
async def _load_claude_skill_metadata(self, skill_dir: Path) -> Optional[ClaudeSkillMetadata]:
|
|
82
|
+
"""加载Claude技能元数据"""
|
|
83
|
+
try:
|
|
84
|
+
# 查找Claude技能配置文件
|
|
85
|
+
config_files = [
|
|
86
|
+
skill_dir / "claude_skill.json",
|
|
87
|
+
skill_dir / "skill.json",
|
|
88
|
+
skill_dir / "config.json",
|
|
89
|
+
skill_dir / "metadata.json"
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
config_file = None
|
|
93
|
+
for file_path in config_files:
|
|
94
|
+
if file_path.exists():
|
|
95
|
+
config_file = file_path
|
|
96
|
+
break
|
|
97
|
+
|
|
98
|
+
if not config_file:
|
|
99
|
+
logger.warning(f"Claude技能目录 {skill_dir} 没有配置文件")
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
with open(config_file, 'r', encoding='utf-8') as f:
|
|
103
|
+
config = json.load(f)
|
|
104
|
+
|
|
105
|
+
return ClaudeSkillMetadata(
|
|
106
|
+
name=config.get("name", skill_dir.name),
|
|
107
|
+
version=config.get("version", "1.0.0"),
|
|
108
|
+
author=config.get("author", ""),
|
|
109
|
+
description=config.get("description", ""),
|
|
110
|
+
category=config.get("category", ""),
|
|
111
|
+
tags=config.get("tags", []),
|
|
112
|
+
dependencies=config.get("dependencies", []),
|
|
113
|
+
entry_point=config.get("entry_point", "main.py"),
|
|
114
|
+
claude_features=config.get("claude_features", []),
|
|
115
|
+
intelligence_level=config.get("intelligence_level", "standard"),
|
|
116
|
+
learning_enabled=config.get("learning_enabled", True),
|
|
117
|
+
config_schema=config.get("config_schema", {})
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
except Exception as e:
|
|
121
|
+
logger.error(f"加载Claude技能元数据失败 {skill_dir}: {e}")
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
async def _load_config_claude_skills(self) -> List[ClaudeSkillMetadata]:
|
|
125
|
+
"""从配置文件加载Claude技能"""
|
|
126
|
+
try:
|
|
127
|
+
config_path = Path(__file__).parent / "claude_skills_config.json"
|
|
128
|
+
if not config_path.exists():
|
|
129
|
+
return []
|
|
130
|
+
|
|
131
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
132
|
+
config = json.load(f)
|
|
133
|
+
|
|
134
|
+
skills_config = config.get("claude_skills", [])
|
|
135
|
+
skills = []
|
|
136
|
+
|
|
137
|
+
for skill_config in skills_config:
|
|
138
|
+
metadata = ClaudeSkillMetadata(
|
|
139
|
+
name=skill_config.get("name", ""),
|
|
140
|
+
version=skill_config.get("version", "1.0.0"),
|
|
141
|
+
author=skill_config.get("author", ""),
|
|
142
|
+
description=skill_config.get("description", ""),
|
|
143
|
+
category=skill_config.get("category", ""),
|
|
144
|
+
tags=skill_config.get("tags", []),
|
|
145
|
+
dependencies=skill_config.get("dependencies", []),
|
|
146
|
+
entry_point=skill_config.get("entry_point", ""),
|
|
147
|
+
claude_features=skill_config.get("claude_features", []),
|
|
148
|
+
intelligence_level=skill_config.get("intelligence_level", "standard"),
|
|
149
|
+
learning_enabled=skill_config.get("learning_enabled", True),
|
|
150
|
+
config_schema=skill_config.get("config_schema", {})
|
|
151
|
+
)
|
|
152
|
+
skills.append(metadata)
|
|
153
|
+
|
|
154
|
+
return skills
|
|
155
|
+
|
|
156
|
+
except Exception as e:
|
|
157
|
+
logger.error(f"从配置加载Claude技能失败: {e}")
|
|
158
|
+
return []
|
|
159
|
+
|
|
160
|
+
def _register_claude_features(self, skills: List[ClaudeSkillMetadata]):
|
|
161
|
+
"""注册Claude特性"""
|
|
162
|
+
self.claude_feature_registry.clear()
|
|
163
|
+
|
|
164
|
+
for skill in skills:
|
|
165
|
+
for feature in skill.claude_features:
|
|
166
|
+
if feature not in self.claude_feature_registry:
|
|
167
|
+
self.claude_feature_registry[feature] = []
|
|
168
|
+
self.claude_feature_registry[feature].append(skill.name)
|
|
169
|
+
|
|
170
|
+
logger.info(f"注册Claude特性: {list(self.claude_feature_registry.keys())}")
|
|
171
|
+
|
|
172
|
+
async def load_claude_skill(self, metadata: ClaudeSkillMetadata) -> Optional[ClaudeSkill]:
|
|
173
|
+
"""加载单个Claude技能"""
|
|
174
|
+
try:
|
|
175
|
+
# 检查依赖
|
|
176
|
+
await self._check_dependencies(metadata)
|
|
177
|
+
|
|
178
|
+
# 创建技能配置
|
|
179
|
+
skill_config = SkillConfig(
|
|
180
|
+
name=metadata.name,
|
|
181
|
+
description=metadata.description,
|
|
182
|
+
capabilities=metadata.tags + metadata.claude_features,
|
|
183
|
+
priority=self._calculate_priority(metadata),
|
|
184
|
+
protocols=["chinese", "english"],
|
|
185
|
+
category=metadata.category,
|
|
186
|
+
author=metadata.author
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# 创建Claude技能实例
|
|
190
|
+
skill = ClaudeSkill(skill_config)
|
|
191
|
+
|
|
192
|
+
# 设置Claude特有属性
|
|
193
|
+
skill.intelligence_level = metadata.intelligence_level
|
|
194
|
+
skill.learning_enabled = metadata.learning_enabled
|
|
195
|
+
skill.claude_features = metadata.claude_features
|
|
196
|
+
|
|
197
|
+
# 加载技能代码
|
|
198
|
+
await self._load_claude_skill_code(skill, metadata)
|
|
199
|
+
|
|
200
|
+
# 注册到已加载技能
|
|
201
|
+
self.loaded_skills[metadata.name] = skill
|
|
202
|
+
self.skill_registry[metadata.name] = metadata
|
|
203
|
+
|
|
204
|
+
logger.info(f"Claude技能 {metadata.name} 加载成功")
|
|
205
|
+
return skill
|
|
206
|
+
|
|
207
|
+
except Exception as e:
|
|
208
|
+
logger.error(f"加载Claude技能失败 {metadata.name}: {e}")
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
def _calculate_priority(self, metadata: ClaudeSkillMetadata) -> int:
|
|
212
|
+
"""计算技能优先级"""
|
|
213
|
+
base_priority = 50
|
|
214
|
+
|
|
215
|
+
# 根据智能等级调整优先级
|
|
216
|
+
intelligence_bonus = {
|
|
217
|
+
"basic": 0,
|
|
218
|
+
"standard": 10,
|
|
219
|
+
"advanced": 25
|
|
220
|
+
}
|
|
221
|
+
base_priority += intelligence_bonus.get(metadata.intelligence_level, 0)
|
|
222
|
+
|
|
223
|
+
# 根据Claude特性数量调整优先级
|
|
224
|
+
base_priority += len(metadata.claude_features) * 5
|
|
225
|
+
|
|
226
|
+
# 根据学习功能调整优先级
|
|
227
|
+
if metadata.learning_enabled:
|
|
228
|
+
base_priority += 15
|
|
229
|
+
|
|
230
|
+
return min(base_priority, 100) # 最大优先级100
|
|
231
|
+
|
|
232
|
+
async def _check_dependencies(self, metadata: ClaudeSkillMetadata):
|
|
233
|
+
"""检查技能依赖"""
|
|
234
|
+
for dep in metadata.dependencies:
|
|
235
|
+
try:
|
|
236
|
+
importlib.import_module(dep)
|
|
237
|
+
except ImportError:
|
|
238
|
+
logger.error(f"Claude技能 {metadata.name} 依赖缺失: {dep}")
|
|
239
|
+
raise
|
|
240
|
+
|
|
241
|
+
async def _load_claude_skill_code(self, skill: ClaudeSkill, metadata: ClaudeSkillMetadata):
|
|
242
|
+
"""加载Claude技能代码"""
|
|
243
|
+
try:
|
|
244
|
+
if metadata.entry_point:
|
|
245
|
+
# 从文件加载
|
|
246
|
+
entry_path = self.skills_directory / metadata.name / metadata.entry_point
|
|
247
|
+
if entry_path.exists():
|
|
248
|
+
spec = importlib.util.spec_from_file_location(f"claude_skill_{metadata.name}", entry_path)
|
|
249
|
+
module = importlib.util.module_from_spec(spec)
|
|
250
|
+
spec.loader.exec_module(module)
|
|
251
|
+
|
|
252
|
+
# 调用Claude技能初始化函数
|
|
253
|
+
if hasattr(module, 'initialize_claude_skill'):
|
|
254
|
+
await module.initialize_claude_skill(skill, metadata)
|
|
255
|
+
|
|
256
|
+
# 从配置加载钩子处理器
|
|
257
|
+
await self._load_claude_hook_handlers(skill, metadata)
|
|
258
|
+
|
|
259
|
+
# 加载Claude特性
|
|
260
|
+
await self._load_claude_features(skill, metadata)
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
logger.error(f"加载Claude技能代码失败 {metadata.name}: {e}")
|
|
264
|
+
raise
|
|
265
|
+
|
|
266
|
+
async def _load_claude_hook_handlers(self, skill: ClaudeSkill, metadata: ClaudeSkillMetadata):
|
|
267
|
+
"""从配置加载Claude钩子处理器"""
|
|
268
|
+
try:
|
|
269
|
+
config_path = self.skills_directory / metadata.name / "claude_hooks.json"
|
|
270
|
+
if not config_path.exists():
|
|
271
|
+
return
|
|
272
|
+
|
|
273
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
274
|
+
hooks_config = json.load(f)
|
|
275
|
+
|
|
276
|
+
for hook_config in hooks_config.get("claude_hooks", []):
|
|
277
|
+
hook_type = HookType(hook_config.get("type"))
|
|
278
|
+
handler_code = hook_config.get("handler")
|
|
279
|
+
claude_enhanced = hook_config.get("claude_enhanced", False)
|
|
280
|
+
|
|
281
|
+
if handler_code:
|
|
282
|
+
# 创建Claude增强的处理器函数
|
|
283
|
+
async def claude_handler(event, code=handler_code, enhanced=claude_enhanced):
|
|
284
|
+
if enhanced:
|
|
285
|
+
# Claude增强处理
|
|
286
|
+
return f"🧠 Claude增强处理: {code[:50]}..."
|
|
287
|
+
else:
|
|
288
|
+
# 标准处理
|
|
289
|
+
return f"Claude处理: {code[:50]}..."
|
|
290
|
+
|
|
291
|
+
skill.register_hook(hook_type, claude_handler)
|
|
292
|
+
|
|
293
|
+
except Exception as e:
|
|
294
|
+
logger.error(f"加载Claude钩子处理器失败 {metadata.name}: {e}")
|
|
295
|
+
|
|
296
|
+
async def _load_claude_features(self, skill: ClaudeSkill, metadata: ClaudeSkillMetadata):
|
|
297
|
+
"""加载Claude特性"""
|
|
298
|
+
try:
|
|
299
|
+
for feature in metadata.claude_features:
|
|
300
|
+
# 根据特性类型设置相应的功能
|
|
301
|
+
if feature == "intelligent_analysis":
|
|
302
|
+
skill.has_intelligent_analysis = True
|
|
303
|
+
elif feature == "context_awareness":
|
|
304
|
+
skill.has_context_awareness = True
|
|
305
|
+
elif feature == "learning_optimization":
|
|
306
|
+
skill.has_learning_optimization = True
|
|
307
|
+
elif feature == "semantic_understanding":
|
|
308
|
+
skill.has_semantic_understanding = True
|
|
309
|
+
elif feature == "natural_language_processing":
|
|
310
|
+
skill.has_natural_language_processing = True
|
|
311
|
+
|
|
312
|
+
except Exception as e:
|
|
313
|
+
logger.error(f"加载Claude特性失败 {metadata.name}: {e}")
|
|
314
|
+
|
|
315
|
+
def get_skills_by_feature(self, feature: str) -> List[str]:
|
|
316
|
+
"""根据特性获取技能列表"""
|
|
317
|
+
return self.claude_feature_registry.get(feature, [])
|
|
318
|
+
|
|
319
|
+
def get_all_features(self) -> List[str]:
|
|
320
|
+
"""获取所有Claude特性"""
|
|
321
|
+
return list(self.claude_feature_registry.keys())
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
class ClaudeSkillManager:
|
|
325
|
+
"""Claude技能管理器"""
|
|
326
|
+
|
|
327
|
+
def __init__(self, adapter, skills_directory: str = None):
|
|
328
|
+
self.adapter = adapter
|
|
329
|
+
self.loader = ClaudeSkillLoader(skills_directory)
|
|
330
|
+
self.active_skills = {}
|
|
331
|
+
self.skill_stats = {}
|
|
332
|
+
self.learning_data = {}
|
|
333
|
+
|
|
334
|
+
async def initialize(self):
|
|
335
|
+
"""初始化Claude技能管理器"""
|
|
336
|
+
try:
|
|
337
|
+
# 发现所有Claude技能
|
|
338
|
+
discovered_skills = await self.loader.discover_claude_skills()
|
|
339
|
+
|
|
340
|
+
# 加载所有Claude技能
|
|
341
|
+
for metadata in discovered_skills:
|
|
342
|
+
skill = await self.loader.load_claude_skill(metadata)
|
|
343
|
+
if skill:
|
|
344
|
+
await self.register_claude_skill(skill)
|
|
345
|
+
|
|
346
|
+
logger.info(f"Claude技能管理器初始化完成,加载了 {len(self.active_skills)} 个技能")
|
|
347
|
+
|
|
348
|
+
except Exception as e:
|
|
349
|
+
logger.error(f"Claude技能管理器初始化失败: {e}")
|
|
350
|
+
|
|
351
|
+
async def register_claude_skill(self, skill: ClaudeSkill) -> bool:
|
|
352
|
+
"""注册Claude技能到适配器"""
|
|
353
|
+
try:
|
|
354
|
+
# 激活技能
|
|
355
|
+
await skill.activate()
|
|
356
|
+
|
|
357
|
+
# 注册到适配器
|
|
358
|
+
success = await self.adapter.register_external_skill(
|
|
359
|
+
skill.config.name,
|
|
360
|
+
{
|
|
361
|
+
"description": skill.config.description,
|
|
362
|
+
"capabilities": skill.config.capabilities,
|
|
363
|
+
"priority": skill.config.priority,
|
|
364
|
+
"hooks": [hook.value for hook in skill.config.hooks],
|
|
365
|
+
"category": skill.config.category,
|
|
366
|
+
"author": skill.config.author,
|
|
367
|
+
"claude_features": getattr(skill, 'claude_features', []),
|
|
368
|
+
"intelligence_level": getattr(skill, 'intelligence_level', 'standard'),
|
|
369
|
+
"learning_enabled": getattr(skill, 'learning_enabled', True)
|
|
370
|
+
}
|
|
371
|
+
)
|
|
372
|
+
|
|
373
|
+
if success:
|
|
374
|
+
self.active_skills[skill.config.name] = skill
|
|
375
|
+
self.skill_stats[skill.config.name] = {
|
|
376
|
+
"registered_at": asyncio.get_event_loop().time(),
|
|
377
|
+
"hooks_triggered": 0,
|
|
378
|
+
"errors": 0,
|
|
379
|
+
"learning_updates": 0,
|
|
380
|
+
"claude_features_used": set()
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
# 初始化学习数据
|
|
384
|
+
if getattr(skill, 'learning_enabled', False):
|
|
385
|
+
self.learning_data[skill.config.name] = {
|
|
386
|
+
"performance_history": [],
|
|
387
|
+
"optimization_suggestions": [],
|
|
388
|
+
"usage_patterns": {}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
return success
|
|
392
|
+
|
|
393
|
+
except Exception as e:
|
|
394
|
+
logger.error(f"注册Claude技能失败 {skill.config.name}: {e}")
|
|
395
|
+
return False
|
|
396
|
+
|
|
397
|
+
async def update_learning_data(self, skill_name: str, performance_data: Dict[str, Any]):
|
|
398
|
+
"""更新学习数据"""
|
|
399
|
+
if skill_name in self.learning_data:
|
|
400
|
+
learning_data = self.learning_data[skill_name]
|
|
401
|
+
|
|
402
|
+
# 添加性能历史
|
|
403
|
+
learning_data["performance_history"].append({
|
|
404
|
+
"timestamp": asyncio.get_event_loop().time(),
|
|
405
|
+
"performance": performance_data
|
|
406
|
+
})
|
|
407
|
+
|
|
408
|
+
# 限制历史记录数量
|
|
409
|
+
if len(learning_data["performance_history"]) > 100:
|
|
410
|
+
learning_data["performance_history"] = learning_data["performance_history"][-50:]
|
|
411
|
+
|
|
412
|
+
# 更新使用模式
|
|
413
|
+
self._update_usage_patterns(skill_name, performance_data)
|
|
414
|
+
|
|
415
|
+
# 生成优化建议
|
|
416
|
+
suggestions = self._generate_optimization_suggestions(skill_name, learning_data)
|
|
417
|
+
learning_data["optimization_suggestions"] = suggestions
|
|
418
|
+
|
|
419
|
+
# 更新统计
|
|
420
|
+
self.skill_stats[skill_name]["learning_updates"] += 1
|
|
421
|
+
|
|
422
|
+
logger.info(f"Claude技能 {skill_name} 学习数据已更新")
|
|
423
|
+
|
|
424
|
+
def _update_usage_patterns(self, skill_name: str, performance_data: Dict[str, Any]):
|
|
425
|
+
"""更新使用模式"""
|
|
426
|
+
if skill_name in self.learning_data:
|
|
427
|
+
patterns = self.learning_data[skill_name]["usage_patterns"]
|
|
428
|
+
|
|
429
|
+
# 记录使用频率
|
|
430
|
+
current_hour = int(time.time()) // 3600 % 24
|
|
431
|
+
patterns.setdefault("hourly_usage", {})
|
|
432
|
+
patterns["hourly_usage"][current_hour] = patterns["hourly_usage"].get(current_hour, 0) + 1
|
|
433
|
+
|
|
434
|
+
# 记录成功模式
|
|
435
|
+
if performance_data.get("success", False):
|
|
436
|
+
patterns.setdefault("successful_patterns", [])
|
|
437
|
+
patterns["successful_patterns"].append(performance_data.get("context", {}))
|
|
438
|
+
|
|
439
|
+
def _generate_optimization_suggestions(self, skill_name: str, learning_data: Dict) -> List[str]:
|
|
440
|
+
"""生成优化建议"""
|
|
441
|
+
suggestions = []
|
|
442
|
+
performance_history = learning_data.get("performance_history", [])
|
|
443
|
+
patterns = learning_data.get("usage_patterns", {})
|
|
444
|
+
|
|
445
|
+
if len(performance_history) >= 10:
|
|
446
|
+
# 分析性能趋势
|
|
447
|
+
recent_performance = performance_history[-10:]
|
|
448
|
+
success_rate = sum(1 for p in recent_performance if p.get("performance", {}).get("success", False)) / len(recent_performance)
|
|
449
|
+
|
|
450
|
+
if success_rate < 0.7:
|
|
451
|
+
suggestions.append("成功率较低,建议检查技能配置或增加错误处理")
|
|
452
|
+
|
|
453
|
+
if success_rate > 0.9:
|
|
454
|
+
suggestions.append("表现优秀,可以考虑增加更多功能")
|
|
455
|
+
|
|
456
|
+
# 分析使用模式
|
|
457
|
+
hourly_usage = patterns.get("hourly_usage", {})
|
|
458
|
+
if hourly_usage:
|
|
459
|
+
peak_hour = max(hourly_usage, key=hourly_usage.get)
|
|
460
|
+
suggestions.append(f"使用高峰时段:{peak_hour}:00,可以考虑在此时段优化性能")
|
|
461
|
+
|
|
462
|
+
return suggestions
|
|
463
|
+
|
|
464
|
+
def get_learning_insights(self, skill_name: str) -> Dict[str, Any]:
|
|
465
|
+
"""获取学习洞察"""
|
|
466
|
+
if skill_name not in self.learning_data:
|
|
467
|
+
return {}
|
|
468
|
+
|
|
469
|
+
learning_data = self.learning_data[skill_name]
|
|
470
|
+
insights = {
|
|
471
|
+
"total_learning_updates": self.skill_stats[skill_name]["learning_updates"],
|
|
472
|
+
"optimization_suggestions": learning_data.get("optimization_suggestions", []),
|
|
473
|
+
"usage_patterns": learning_data.get("usage_patterns", {}),
|
|
474
|
+
"performance_summary": self._summarize_performance(learning_data.get("performance_history", []))
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return insights
|
|
478
|
+
|
|
479
|
+
def _summarize_performance(self, performance_history: List[Dict]) -> Dict[str, Any]:
|
|
480
|
+
"""总结性能数据"""
|
|
481
|
+
if not performance_history:
|
|
482
|
+
return {}
|
|
483
|
+
|
|
484
|
+
recent_data = performance_history[-20:] # 最近20次记录
|
|
485
|
+
success_count = sum(1 for p in recent_data if p.get("performance", {}).get("success", False))
|
|
486
|
+
|
|
487
|
+
return {
|
|
488
|
+
"recent_success_rate": success_count / len(recent_data),
|
|
489
|
+
"total_executions": len(recent_data),
|
|
490
|
+
"average_response_time": sum(p.get("performance", {}).get("response_time", 0) for p in recent_data) / len(recent_data)
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
def get_claude_feature_stats(self) -> Dict[str, Any]:
|
|
494
|
+
"""获取Claude特性统计"""
|
|
495
|
+
feature_usage = {}
|
|
496
|
+
feature_effectiveness = {}
|
|
497
|
+
|
|
498
|
+
for skill_name, skill in self.active_skills.items():
|
|
499
|
+
claude_features = getattr(skill, 'claude_features', [])
|
|
500
|
+
stats = self.skill_stats.get(skill_name, {})
|
|
501
|
+
used_features = stats.get("claude_features_used", set())
|
|
502
|
+
|
|
503
|
+
for feature in claude_features:
|
|
504
|
+
feature_usage[feature] = feature_usage.get(feature, 0) + 1
|
|
505
|
+
if feature in used_features:
|
|
506
|
+
feature_effectiveness[feature] = feature_effectiveness.get(feature, 0) + 1
|
|
507
|
+
|
|
508
|
+
return {
|
|
509
|
+
"feature_usage": feature_usage,
|
|
510
|
+
"feature_effectiveness": feature_effectiveness,
|
|
511
|
+
"total_features": len(self.loader.get_all_features()),
|
|
512
|
+
"most_used_features": sorted(feature_usage.items(), key=lambda x: x[1], reverse=True)[:5]
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
async def optimize_skill_performance(self, skill_name: str) -> bool:
|
|
516
|
+
"""优化技能性能"""
|
|
517
|
+
if skill_name not in self.active_skills:
|
|
518
|
+
return False
|
|
519
|
+
|
|
520
|
+
try:
|
|
521
|
+
skill = self.active_skills[skill_name]
|
|
522
|
+
learning_data = self.learning_data.get(skill_name, {})
|
|
523
|
+
|
|
524
|
+
# 基于学习数据优化技能
|
|
525
|
+
suggestions = learning_data.get("optimization_suggestions", [])
|
|
526
|
+
|
|
527
|
+
# 应用优化建议
|
|
528
|
+
for suggestion in suggestions:
|
|
529
|
+
if "成功率较低" in suggestion:
|
|
530
|
+
# 增加重试机制
|
|
531
|
+
if hasattr(skill, 'retry_count'):
|
|
532
|
+
skill.retry_count = min(skill.retry_count + 1, 5)
|
|
533
|
+
elif "使用高峰时段" in suggestion:
|
|
534
|
+
# 在高峰时段优先处理
|
|
535
|
+
if hasattr(skill, 'priority'):
|
|
536
|
+
skill.priority += 10
|
|
537
|
+
|
|
538
|
+
logger.info(f"Claude技能 {skill_name} 性能优化完成")
|
|
539
|
+
return True
|
|
540
|
+
|
|
541
|
+
except Exception as e:
|
|
542
|
+
logger.error(f"优化Claude技能性能失败 {skill_name}: {e}")
|
|
543
|
+
return False
|
|
544
|
+
|
|
545
|
+
def get_skill_stats(self, skill_name: str) -> Dict[str, Any]:
|
|
546
|
+
"""获取技能统计"""
|
|
547
|
+
stats = self.skill_stats.get(skill_name, {})
|
|
548
|
+
learning_insights = self.get_learning_insights(skill_name)
|
|
549
|
+
|
|
550
|
+
return {
|
|
551
|
+
**stats,
|
|
552
|
+
"learning_insights": learning_insights,
|
|
553
|
+
"claude_features": getattr(self.active_skills.get(skill_name), 'claude_features', []),
|
|
554
|
+
"intelligence_level": getattr(self.active_skills.get(skill_name), 'intelligence_level', 'standard')
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
def get_all_stats(self) -> Dict[str, Any]:
|
|
558
|
+
"""获取所有技能统计"""
|
|
559
|
+
base_stats = {
|
|
560
|
+
"total_skills": len(self.active_skills),
|
|
561
|
+
"skill_stats": {},
|
|
562
|
+
"learning_enabled_skills": len([s for s in self.active_skills.values() if getattr(s, 'learning_enabled', False)]),
|
|
563
|
+
"claude_feature_stats": self.get_claude_feature_stats()
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
for skill_name in self.active_skills:
|
|
567
|
+
base_stats["skill_stats"][skill_name] = self.get_skill_stats(skill_name)
|
|
568
|
+
|
|
569
|
+
return base_stats
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
def create_claude_skill_from_config(skill_config: Dict[str, Any]) -> ClaudeSkill:
|
|
573
|
+
"""从配置创建Claude技能"""
|
|
574
|
+
config = SkillConfig(
|
|
575
|
+
name=skill_config.get("name", "unnamed_claude_skill"),
|
|
576
|
+
description=skill_config.get("description", ""),
|
|
577
|
+
capabilities=skill_config.get("capabilities", []),
|
|
578
|
+
priority=skill_config.get("priority", 50),
|
|
579
|
+
protocols=skill_config.get("protocols", ["chinese", "english"]),
|
|
580
|
+
hooks=[HookType(hook) for hook in skill_config.get("hooks", [])],
|
|
581
|
+
category=skill_config.get("category", ""),
|
|
582
|
+
author=skill_config.get("author", "")
|
|
583
|
+
)
|
|
584
|
+
|
|
585
|
+
skill = ClaudeSkill(config)
|
|
586
|
+
|
|
587
|
+
# 设置Claude特有属性
|
|
588
|
+
skill.intelligence_level = skill_config.get("intelligence_level", "standard")
|
|
589
|
+
skill.learning_enabled = skill_config.get("learning_enabled", True)
|
|
590
|
+
skill.claude_features = skill_config.get("claude_features", [])
|
|
591
|
+
|
|
592
|
+
# 添加钩子处理器
|
|
593
|
+
handlers = skill_config.get("handlers", {})
|
|
594
|
+
for hook_name, handler_code in handlers.items():
|
|
595
|
+
try:
|
|
596
|
+
hook_type = HookType(hook_name)
|
|
597
|
+
claude_enhanced = handlers.get("claude_enhanced", False)
|
|
598
|
+
|
|
599
|
+
async def claude_handler(event, code=handler_code, enhanced=claude_enhanced):
|
|
600
|
+
if enhanced:
|
|
601
|
+
return f"🧠 Claude增强 {config.name} 处理 {hook_name}"
|
|
602
|
+
else:
|
|
603
|
+
return f"Claude {config.name} 处理 {hook_name}"
|
|
604
|
+
|
|
605
|
+
skill.register_hook(hook_type, claude_handler)
|
|
606
|
+
except ValueError:
|
|
607
|
+
logger.warning(f"无效的钩子类型: {hook_name}")
|
|
608
|
+
|
|
609
|
+
return skill
|