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,395 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CodeBuddy Skills Integration
|
|
3
|
+
技能系统集成模块,提供技能发现、加载和管理功能
|
|
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 SkillConfig, Skill, HookType
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class SkillMetadata:
|
|
22
|
+
"""技能元数据"""
|
|
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
|
+
config_schema: Dict[str, Any] = None
|
|
32
|
+
|
|
33
|
+
def __post_init__(self):
|
|
34
|
+
if self.tags is None:
|
|
35
|
+
self.tags = []
|
|
36
|
+
if self.dependencies is None:
|
|
37
|
+
self.dependencies = []
|
|
38
|
+
if self.config_schema is None:
|
|
39
|
+
self.config_schema = {}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class SkillLoader:
|
|
43
|
+
"""技能加载器"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, skills_directory: str = None):
|
|
46
|
+
self.skills_directory = Path(skills_directory) if skills_directory else Path(__file__).parent / "skills"
|
|
47
|
+
self.loaded_skills = {}
|
|
48
|
+
self.skill_registry = {}
|
|
49
|
+
|
|
50
|
+
# 确保技能目录存在
|
|
51
|
+
self.skills_directory.mkdir(exist_ok=True)
|
|
52
|
+
|
|
53
|
+
async def discover_skills(self) -> List[SkillMetadata]:
|
|
54
|
+
"""发现所有可用技能"""
|
|
55
|
+
skills = []
|
|
56
|
+
|
|
57
|
+
# 扫描技能目录
|
|
58
|
+
if self.skills_directory.exists():
|
|
59
|
+
for skill_dir in self.skills_directory.iterdir():
|
|
60
|
+
if skill_dir.is_dir():
|
|
61
|
+
skill_metadata = await self._load_skill_metadata(skill_dir)
|
|
62
|
+
if skill_metadata:
|
|
63
|
+
skills.append(skill_metadata)
|
|
64
|
+
|
|
65
|
+
# 扫描配置文件中的技能
|
|
66
|
+
config_skills = await self._load_config_skills()
|
|
67
|
+
skills.extend(config_skills)
|
|
68
|
+
|
|
69
|
+
logger.info(f"发现 {len(skills)} 个技能")
|
|
70
|
+
return skills
|
|
71
|
+
|
|
72
|
+
async def _load_skill_metadata(self, skill_dir: Path) -> Optional[SkillMetadata]:
|
|
73
|
+
"""加载技能元数据"""
|
|
74
|
+
try:
|
|
75
|
+
# 查找技能配置文件
|
|
76
|
+
config_files = [
|
|
77
|
+
skill_dir / "skill.json",
|
|
78
|
+
skill_dir / "config.json",
|
|
79
|
+
skill_dir / "metadata.json"
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
config_file = None
|
|
83
|
+
for file_path in config_files:
|
|
84
|
+
if file_path.exists():
|
|
85
|
+
config_file = file_path
|
|
86
|
+
break
|
|
87
|
+
|
|
88
|
+
if not config_file:
|
|
89
|
+
logger.warning(f"技能目录 {skill_dir} 没有配置文件")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
with open(config_file, 'r', encoding='utf-8') as f:
|
|
93
|
+
config = json.load(f)
|
|
94
|
+
|
|
95
|
+
return SkillMetadata(
|
|
96
|
+
name=config.get("name", skill_dir.name),
|
|
97
|
+
version=config.get("version", "1.0.0"),
|
|
98
|
+
author=config.get("author", ""),
|
|
99
|
+
description=config.get("description", ""),
|
|
100
|
+
category=config.get("category", ""),
|
|
101
|
+
tags=config.get("tags", []),
|
|
102
|
+
dependencies=config.get("dependencies", []),
|
|
103
|
+
entry_point=config.get("entry_point", "main.py"),
|
|
104
|
+
config_schema=config.get("config_schema", {})
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
except Exception as e:
|
|
108
|
+
logger.error(f"加载技能元数据失败 {skill_dir}: {e}")
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
async def _load_config_skills(self) -> List[SkillMetadata]:
|
|
112
|
+
"""从配置文件加载技能"""
|
|
113
|
+
try:
|
|
114
|
+
config_path = Path(__file__).parent / "config.json"
|
|
115
|
+
if not config_path.exists():
|
|
116
|
+
return []
|
|
117
|
+
|
|
118
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
119
|
+
config = json.load(f)
|
|
120
|
+
|
|
121
|
+
skills_config = config.get("external_skills", [])
|
|
122
|
+
skills = []
|
|
123
|
+
|
|
124
|
+
for skill_config in skills_config:
|
|
125
|
+
metadata = SkillMetadata(
|
|
126
|
+
name=skill_config.get("name", ""),
|
|
127
|
+
version=skill_config.get("version", "1.0.0"),
|
|
128
|
+
author=skill_config.get("author", ""),
|
|
129
|
+
description=skill_config.get("description", ""),
|
|
130
|
+
category=skill_config.get("category", ""),
|
|
131
|
+
tags=skill_config.get("tags", []),
|
|
132
|
+
dependencies=skill_config.get("dependencies", []),
|
|
133
|
+
entry_point=skill_config.get("entry_point", ""),
|
|
134
|
+
config_schema=skill_config.get("config_schema", {})
|
|
135
|
+
)
|
|
136
|
+
skills.append(metadata)
|
|
137
|
+
|
|
138
|
+
return skills
|
|
139
|
+
|
|
140
|
+
except Exception as e:
|
|
141
|
+
logger.error(f"从配置加载技能失败: {e}")
|
|
142
|
+
return []
|
|
143
|
+
|
|
144
|
+
async def load_skill(self, metadata: SkillMetadata) -> Optional[Skill]:
|
|
145
|
+
"""加载单个技能"""
|
|
146
|
+
try:
|
|
147
|
+
# 检查依赖
|
|
148
|
+
await self._check_dependencies(metadata)
|
|
149
|
+
|
|
150
|
+
# 创建技能配置
|
|
151
|
+
skill_config = SkillConfig(
|
|
152
|
+
name=metadata.name,
|
|
153
|
+
description=metadata.description,
|
|
154
|
+
capabilities=metadata.tags,
|
|
155
|
+
priority=50,
|
|
156
|
+
protocols=["chinese", "english"]
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# 创建技能实例
|
|
160
|
+
skill = Skill(skill_config)
|
|
161
|
+
|
|
162
|
+
# 加载技能代码
|
|
163
|
+
await self._load_skill_code(skill, metadata)
|
|
164
|
+
|
|
165
|
+
# 注册到已加载技能
|
|
166
|
+
self.loaded_skills[metadata.name] = skill
|
|
167
|
+
self.skill_registry[metadata.name] = metadata
|
|
168
|
+
|
|
169
|
+
logger.info(f"技能 {metadata.name} 加载成功")
|
|
170
|
+
return skill
|
|
171
|
+
|
|
172
|
+
except Exception as e:
|
|
173
|
+
logger.error(f"加载技能失败 {metadata.name}: {e}")
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
async def _check_dependencies(self, metadata: SkillMetadata):
|
|
177
|
+
"""检查技能依赖"""
|
|
178
|
+
for dep in metadata.dependencies:
|
|
179
|
+
try:
|
|
180
|
+
importlib.import_module(dep)
|
|
181
|
+
except ImportError:
|
|
182
|
+
logger.error(f"技能 {metadata.name} 依赖缺失: {dep}")
|
|
183
|
+
raise
|
|
184
|
+
|
|
185
|
+
async def _load_skill_code(self, skill: Skill, metadata: SkillMetadata):
|
|
186
|
+
"""加载技能代码"""
|
|
187
|
+
try:
|
|
188
|
+
if metadata.entry_point:
|
|
189
|
+
# 从文件加载
|
|
190
|
+
entry_path = self.skills_directory / metadata.name / metadata.entry_point
|
|
191
|
+
if entry_path.exists():
|
|
192
|
+
spec = importlib.util.spec_from_file_location(f"skill_{metadata.name}", entry_path)
|
|
193
|
+
module = importlib.util.module_from_spec(spec)
|
|
194
|
+
spec.loader.exec_module(module)
|
|
195
|
+
|
|
196
|
+
# 调用技能初始化函数
|
|
197
|
+
if hasattr(module, 'initialize_skill'):
|
|
198
|
+
await module.initialize_skill(skill, metadata)
|
|
199
|
+
|
|
200
|
+
# 从配置加载钩子处理器
|
|
201
|
+
await self._load_hook_handlers(skill, metadata)
|
|
202
|
+
|
|
203
|
+
except Exception as e:
|
|
204
|
+
logger.error(f"加载技能代码失败 {metadata.name}: {e}")
|
|
205
|
+
raise
|
|
206
|
+
|
|
207
|
+
async def _load_hook_handlers(self, skill: Skill, metadata: SkillMetadata):
|
|
208
|
+
"""从配置加载钩子处理器"""
|
|
209
|
+
try:
|
|
210
|
+
config_path = self.skills_directory / metadata.name / "hooks.json"
|
|
211
|
+
if not config_path.exists():
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
with open(config_path, 'r', encoding='utf-8') as f:
|
|
215
|
+
hooks_config = json.load(f)
|
|
216
|
+
|
|
217
|
+
for hook_config in hooks_config.get("hooks", []):
|
|
218
|
+
hook_type = HookType(hook_config.get("type"))
|
|
219
|
+
handler_code = hook_config.get("handler")
|
|
220
|
+
|
|
221
|
+
if handler_code:
|
|
222
|
+
# 创建简单的处理器函数
|
|
223
|
+
async def handler(event, code=handler_code):
|
|
224
|
+
# 这里可以执行简单的代码或调用外部脚本
|
|
225
|
+
return f"执行钩子处理器: {code[:50]}..."
|
|
226
|
+
|
|
227
|
+
skill.register_hook(hook_type, handler)
|
|
228
|
+
|
|
229
|
+
except Exception as e:
|
|
230
|
+
logger.error(f"加载钩子处理器失败 {metadata.name}: {e}")
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class SkillManager:
|
|
234
|
+
"""技能管理器"""
|
|
235
|
+
|
|
236
|
+
def __init__(self, adapter, skills_directory: str = None):
|
|
237
|
+
self.adapter = adapter
|
|
238
|
+
self.loader = SkillLoader(skills_directory)
|
|
239
|
+
self.active_skills = {}
|
|
240
|
+
self.skill_stats = {}
|
|
241
|
+
|
|
242
|
+
async def initialize(self):
|
|
243
|
+
"""初始化技能管理器"""
|
|
244
|
+
try:
|
|
245
|
+
# 发现所有技能
|
|
246
|
+
discovered_skills = await self.loader.discover_skills()
|
|
247
|
+
|
|
248
|
+
# 加载所有技能
|
|
249
|
+
for metadata in discovered_skills:
|
|
250
|
+
skill = await self.loader.load_skill(metadata)
|
|
251
|
+
if skill:
|
|
252
|
+
await self.register_skill(skill)
|
|
253
|
+
|
|
254
|
+
logger.info(f"技能管理器初始化完成,加载了 {len(self.active_skills)} 个技能")
|
|
255
|
+
|
|
256
|
+
except Exception as e:
|
|
257
|
+
logger.error(f"技能管理器初始化失败: {e}")
|
|
258
|
+
|
|
259
|
+
async def register_skill(self, skill: Skill) -> bool:
|
|
260
|
+
"""注册技能到适配器"""
|
|
261
|
+
try:
|
|
262
|
+
# 激活技能
|
|
263
|
+
await skill.activate()
|
|
264
|
+
|
|
265
|
+
# 注册到适配器
|
|
266
|
+
success = await self.adapter.register_external_skill(
|
|
267
|
+
skill.config.name,
|
|
268
|
+
{
|
|
269
|
+
"description": skill.config.description,
|
|
270
|
+
"capabilities": skill.config.capabilities,
|
|
271
|
+
"priority": skill.config.priority,
|
|
272
|
+
"hooks": [hook.value for hook in skill.config.hooks]
|
|
273
|
+
}
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
if success:
|
|
277
|
+
self.active_skills[skill.config.name] = skill
|
|
278
|
+
self.skill_stats[skill.config.name] = {
|
|
279
|
+
"registered_at": asyncio.get_event_loop().time(),
|
|
280
|
+
"hooks_triggered": 0,
|
|
281
|
+
"errors": 0
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return success
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
logger.error(f"注册技能失败 {skill.config.name}: {e}")
|
|
288
|
+
return False
|
|
289
|
+
|
|
290
|
+
async def unregister_skill(self, skill_name: str) -> bool:
|
|
291
|
+
"""注销技能"""
|
|
292
|
+
try:
|
|
293
|
+
if skill_name in self.active_skills:
|
|
294
|
+
skill = self.active_skills[skill_name]
|
|
295
|
+
await skill.deactivate()
|
|
296
|
+
del self.active_skills[skill_name]
|
|
297
|
+
del self.skill_stats[skill_name]
|
|
298
|
+
|
|
299
|
+
logger.info(f"技能 {skill_name} 注销成功")
|
|
300
|
+
return True
|
|
301
|
+
|
|
302
|
+
except Exception as e:
|
|
303
|
+
logger.error(f"注销技能失败 {skill_name}: {e}")
|
|
304
|
+
|
|
305
|
+
return False
|
|
306
|
+
|
|
307
|
+
def get_skill_stats(self, skill_name: str) -> Dict[str, Any]:
|
|
308
|
+
"""获取技能统计"""
|
|
309
|
+
return self.skill_stats.get(skill_name, {})
|
|
310
|
+
|
|
311
|
+
def get_all_stats(self) -> Dict[str, Any]:
|
|
312
|
+
"""获取所有技能统计"""
|
|
313
|
+
return {
|
|
314
|
+
"total_skills": len(self.active_skills),
|
|
315
|
+
"skill_stats": dict(self.skill_stats)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
async def reload_skill(self, skill_name: str) -> bool:
|
|
319
|
+
"""重新加载技能"""
|
|
320
|
+
try:
|
|
321
|
+
# 注销旧技能
|
|
322
|
+
await self.unregister_skill(skill_name)
|
|
323
|
+
|
|
324
|
+
# 重新发现和加载
|
|
325
|
+
discovered_skills = await self.loader.discover_skills()
|
|
326
|
+
for metadata in discovered_skills:
|
|
327
|
+
if metadata.name == skill_name:
|
|
328
|
+
skill = await self.loader.load_skill(metadata)
|
|
329
|
+
if skill:
|
|
330
|
+
return await self.register_skill(skill)
|
|
331
|
+
break
|
|
332
|
+
|
|
333
|
+
except Exception as e:
|
|
334
|
+
logger.error(f"重新加载技能失败 {skill_name}: {e}")
|
|
335
|
+
|
|
336
|
+
return False
|
|
337
|
+
|
|
338
|
+
async def enable_skill(self, skill_name: str) -> bool:
|
|
339
|
+
"""启用技能"""
|
|
340
|
+
if skill_name in self.active_skills:
|
|
341
|
+
await self.active_skills[skill_name].activate()
|
|
342
|
+
return True
|
|
343
|
+
return False
|
|
344
|
+
|
|
345
|
+
async def disable_skill(self, skill_name: str) -> bool:
|
|
346
|
+
"""禁用技能"""
|
|
347
|
+
if skill_name in self.active_skills:
|
|
348
|
+
await self.active_skills[skill_name].deactivate()
|
|
349
|
+
return True
|
|
350
|
+
return False
|
|
351
|
+
|
|
352
|
+
def list_skills(self) -> List[Dict[str, Any]]:
|
|
353
|
+
"""列出所有技能"""
|
|
354
|
+
skills = []
|
|
355
|
+
for name, skill in self.active_skills.items():
|
|
356
|
+
skills.append({
|
|
357
|
+
"name": name,
|
|
358
|
+
"description": skill.config.description,
|
|
359
|
+
"capabilities": skill.config.capabilities,
|
|
360
|
+
"priority": skill.config.priority,
|
|
361
|
+
"active": skill.active,
|
|
362
|
+
"hooks": [hook.value for hook in skill.config.hooks],
|
|
363
|
+
"stats": self.skill_stats.get(name, {})
|
|
364
|
+
})
|
|
365
|
+
return skills
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def create_skill_from_config(skill_config: Dict[str, Any]) -> Skill:
|
|
369
|
+
"""从配置创建技能"""
|
|
370
|
+
config = SkillConfig(
|
|
371
|
+
name=skill_config.get("name", "unnamed_skill"),
|
|
372
|
+
description=skill_config.get("description", ""),
|
|
373
|
+
capabilities=skill_config.get("capabilities", []),
|
|
374
|
+
priority=skill_config.get("priority", 50),
|
|
375
|
+
protocols=skill_config.get("protocols", ["chinese", "english"]),
|
|
376
|
+
hooks=[HookType(hook) for hook in skill_config.get("hooks", [])]
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
skill = Skill(config)
|
|
380
|
+
|
|
381
|
+
# 添加钩子处理器
|
|
382
|
+
handlers = skill_config.get("handlers", {})
|
|
383
|
+
for hook_name, handler_code in handlers.items():
|
|
384
|
+
try:
|
|
385
|
+
hook_type = HookType(hook_name)
|
|
386
|
+
|
|
387
|
+
async def handler(event, code=handler_code):
|
|
388
|
+
# 简单的处理器实现
|
|
389
|
+
return f"Skill {config.name} handling {hook_name}"
|
|
390
|
+
|
|
391
|
+
skill.register_hook(hook_type, handler)
|
|
392
|
+
except ValueError:
|
|
393
|
+
logger.warning(f"无效的钩子类型: {hook_name}")
|
|
394
|
+
|
|
395
|
+
return skill
|