stigmergy 1.1.6 → 1.2.6

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 (118) hide show
  1. package/LICENSE +18 -18
  2. package/README.md +28 -223
  3. package/STIGMERGY.md +61 -61
  4. package/docs/PROJECT_CONSTITUTION.md +433 -433
  5. package/docs/PROJECT_STRUCTURE_CURRENT.md +80 -80
  6. package/examples/calculator-example.js +72 -72
  7. package/examples/cline_usage_examples.md +364 -364
  8. package/examples/encryption-example.js +67 -67
  9. package/examples/json-parser-example.js +120 -120
  10. package/examples/json-validation-example.js +64 -64
  11. package/examples/rest-client-example.js +52 -52
  12. package/examples/rest_client_example.js +54 -54
  13. package/package.json +15 -7
  14. package/scripts/build.js +74 -74
  15. package/scripts/post-deployment-config.js +296 -296
  16. package/scripts/preinstall-check.js +173 -111
  17. package/scripts/publish.js +58 -268
  18. package/scripts/run-layered-tests.js +247 -0
  19. package/scripts/safe-install.js +139 -139
  20. package/scripts/simple-publish.js +57 -59
  21. package/src/adapters/claude/install_claude_integration.js +292 -0
  22. package/src/adapters/codebuddy/install_codebuddy_integration.js +349 -0
  23. package/src/adapters/codex/install_codex_integration.js +395 -0
  24. package/src/adapters/copilot/install_copilot_integration.js +716 -0
  25. package/src/adapters/gemini/install_gemini_integration.js +304 -0
  26. package/src/adapters/iflow/install_iflow_integration.js +304 -0
  27. package/src/adapters/qoder/install_qoder_integration.js +1090 -0
  28. package/src/adapters/qwen/install_qwen_integration.js +285 -0
  29. package/src/auth.js +173 -173
  30. package/src/auth_command.js +208 -208
  31. package/src/calculator.js +313 -313
  32. package/src/cli/router.js +792 -67
  33. package/src/core/cache_cleaner.js +767 -0
  34. package/src/core/cli_help_analyzer.js +680 -674
  35. package/src/core/cli_parameter_handler.js +132 -127
  36. package/src/core/cli_tools.js +89 -89
  37. package/src/core/coordination/index.js +16 -16
  38. package/src/core/coordination/nodejs/AdapterManager.js +102 -89
  39. package/src/core/coordination/nodejs/CLCommunication.js +132 -124
  40. package/src/core/coordination/nodejs/CLIIntegrationManager.js +272 -236
  41. package/src/core/coordination/nodejs/HealthChecker.js +76 -77
  42. package/src/core/coordination/nodejs/HookDeploymentManager.js +263 -190
  43. package/src/core/coordination/nodejs/StatisticsCollector.js +71 -71
  44. package/src/core/coordination/nodejs/index.js +90 -72
  45. package/src/core/coordination/nodejs/utils/Logger.js +29 -29
  46. package/src/core/enhanced_installer.js +479 -0
  47. package/src/core/enhanced_uninstaller.js +638 -0
  48. package/src/core/error_handler.js +406 -406
  49. package/src/core/installer.js +816 -294
  50. package/src/core/memory_manager.js +83 -83
  51. package/src/core/rest_client.js +160 -160
  52. package/src/core/smart_router.js +249 -146
  53. package/src/core/upgrade_manager.js +420 -0
  54. package/src/data_encryption.js +143 -143
  55. package/src/data_structures.js +440 -440
  56. package/src/deploy.js +55 -55
  57. package/src/index.js +30 -30
  58. package/src/test/cli-availability-checker.js +194 -0
  59. package/src/test/test-environment.js +289 -0
  60. package/src/utils/helpers.js +35 -35
  61. package/src/utils.js +921 -915
  62. package/src/weatherProcessor.js +228 -228
  63. package/test/calculator.test.js +0 -215
  64. package/test/collision-test.js +0 -26
  65. package/test/comprehensive-execution-test.js +0 -428
  66. package/test/conflict-prevention-test.js +0 -95
  67. package/test/cross-cli-detection-test.js +0 -33
  68. package/test/csv-processing-test.js +0 -36
  69. package/test/deploy-hooks-test.js +0 -250
  70. package/test/e2e/claude-cli-test.js +0 -128
  71. package/test/e2e/collaboration-test.js +0 -75
  72. package/test/e2e/comprehensive-test.js +0 -431
  73. package/test/e2e/error-handling-test.js +0 -90
  74. package/test/e2e/individual-tool-test.js +0 -143
  75. package/test/e2e/other-cli-test.js +0 -130
  76. package/test/e2e/qoder-cli-test.js +0 -128
  77. package/test/e2e/run-e2e-tests.js +0 -73
  78. package/test/e2e/test-data.js +0 -88
  79. package/test/e2e/test-utils.js +0 -222
  80. package/test/encryption-simple-test.js +0 -110
  81. package/test/encryption.test.js +0 -129
  82. package/test/enhanced-main-alignment.test.js +0 -298
  83. package/test/error-handling-test.js +0 -341
  84. package/test/fibonacci.test.js +0 -178
  85. package/test/final-deploy-test.js +0 -221
  86. package/test/final-install-test.js +0 -226
  87. package/test/hash-table-demo.js +0 -33
  88. package/test/hash-table-test.js +0 -26
  89. package/test/hash_table_test.js +0 -114
  90. package/test/hook-system-integration-test.js +0 -307
  91. package/test/iflow-integration-test.js +0 -292
  92. package/test/improved-install-test.js +0 -362
  93. package/test/install-command-test.js +0 -370
  94. package/test/json-parser-test.js +0 -161
  95. package/test/json-validation-test.js +0 -164
  96. package/test/natural-language-skills-test.js +0 -320
  97. package/test/nl-integration-test.js +0 -179
  98. package/test/parameter-parsing-test.js +0 -143
  99. package/test/plugin-deployment-test.js +0 -316
  100. package/test/postinstall-test.js +0 -269
  101. package/test/python-plugins-test.js +0 -259
  102. package/test/real-test.js +0 -435
  103. package/test/remaining-adapters-test.js +0 -256
  104. package/test/rest-client-test.js +0 -56
  105. package/test/rest_client.test.js +0 -85
  106. package/test/simple-iflow-hook-test.js +0 -137
  107. package/test/system-compatibility-test.js +0 -467
  108. package/test/tdd-deploy-fix-test.js +0 -324
  109. package/test/tdd-fixes-test.js +0 -211
  110. package/test/third-party-skills-test.js +0 -321
  111. package/test/tool-selection-integration-test.js +0 -158
  112. package/test/unit/calculator-full.test.js +0 -191
  113. package/test/unit/calculator-simple.test.js +0 -96
  114. package/test/unit/calculator.test.js +0 -97
  115. package/test/unit/cli-scanner.test.js +0 -291
  116. package/test/unit/cli_parameter_handler.test.js +0 -116
  117. package/test/unit/cross-cli-executor.test.js +0 -399
  118. package/test/weather-processor.test.js +0 -104
@@ -1,434 +1,434 @@
1
- # 🏛️ Stigmergy-CLI 项目宪法
2
-
3
- **强制必须对齐和遵守的核心设计原则与实施指南**
4
-
5
- ## 🎖️ 项目核心理念
6
-
7
- ### 基本原则
8
- 1. **简洁性原则** - 每个组件只做一件事,做好一件事
9
- 2. **独立性原则** - 适配器完全独立,无复杂依赖关系
10
- 3. **直接性原则** - 直接subprocess调用,无抽象层
11
- 4. **原生性原则** - 利用CLI工具的原生扩展机制
12
-
13
- ### 禁止事项 (❌ FORBIDDEN)
14
- - **禁止复杂抽象层** - 不得创建BaseAdapter、Factory等复杂抽象
15
- - **禁止依赖注入** - 不得使用依赖注入框架或IoC容器
16
- - **禁止过度工程化** - 不得为简单问题创建复杂解决方案
17
- - **禁止核心模块** - 不得创建core/目录和复杂的核心基础设施
18
- - **禁止抽象工厂** - 不得使用Factory Pattern管理适配器
19
-
20
- ### 强制要求 (✅ MANDATORY)
21
- - **每个适配器独立工作** - 必须能在没有其他适配器的情况下运行
22
- - **直接subprocess调用** - 必须使用subprocess直接调用目标CLI工具
23
- - **原生Hook集成** - 必须使用每个CLI的原生扩展机制
24
- - **简单JSON配置** - 必须使用简单的JSON配置文件进行路由
25
- - **无依赖设计** - 适配器之间不得有任何依赖关系
26
-
27
- ## 🏗️ 强制架构设计
28
-
29
- ### 适配器架构 (强制)
30
- ```python
31
- # 正确的适配器结构 (✅)
32
- class ClaudeCrossCLIHandler:
33
- """Claude CLI 跨工具处理器 - 完全独立"""
34
-
35
- def detect_cross_cli(self, text: str) -> tuple:
36
- """检测跨CLI调用意图 - 直接实现"""
37
- pass
38
-
39
- def call_cli_tool(self, cli_name: str, task: str) -> str:
40
- """直接调用CLI工具 - 使用subprocess"""
41
- return subprocess.run([cli_name, task], capture_output=True, text=True).stdout
42
-
43
- def handle_user_input(self, user_input: str) -> str:
44
- """处理用户输入 - 直接逻辑"""
45
- target_cli, task = self.detect_cross_cli(user_input)
46
- if target_cli:
47
- return self.call_cli_tool(target_cli, task)
48
- return None
49
- ```
50
-
51
- ### 禁止的架构 (❌ 禁止)
52
- ```python
53
- # ❌ 错误的抽象层设计
54
- class BaseCrossCLIAdapter(ABC): # 禁止!
55
- @abstractmethod
56
- def execute_task(self, task: str, context: dict) -> str:
57
- pass
58
-
59
- class CrossCLIAdapterFactory: # 禁止!
60
- def get_adapter(self, cli_name: str):
61
- pass
62
- ```
63
-
64
- ### 文件结构 (强制)
65
- ```
66
- ~/.stigmergy-cli/
67
- ├── adapters/ # 适配器目录
68
- │ ├── claude/
69
- │ │ └── cross_cli_handler.py # 独立的Claude适配器 (50-100行)
70
- │ ├── gemini/
71
- │ │ └── extension_handler.py # 独立的Gemini适配器 (50-100行)
72
- │ ├── qwen/
73
- │ │ └── class_enhancer.py # 独立的Qwen适配器 (50-100行)
74
- │ └── iflow/
75
- │ └── workflow_handler.py # 独立的iFlow适配器 (50-100行)
76
- ├── routing.json # 简单的路由配置 (JSON)
77
- └── logs/ # 可选的日志目录
78
- ```
79
-
80
- ### 禁止的文件结构 (❌ 禁止)
81
- ```
82
- ~/.stigmergy-cli/
83
- ├── core/ # ❌ 禁止!复杂的核心模块
84
- │ ├── base_adapter.py
85
- │ ├── parser.py
86
- │ └── factory.py
87
- ├── adapters/
88
- │ └── base/ # ❌ 禁止!抽象基类
89
- └── complex_dependencies/ # ❌ 禁止!复杂依赖
90
- ```
91
-
92
- ## 🔧 强制实施指南
93
-
94
- ### 每个适配器必须包含 (强制)
95
- 1. **跨CLI检测函数** - 直接实现,无继承
96
- 2. **CLI调用函数** - 使用subprocess直接调用
97
- 3. **Hook入口函数** - 与CLI原生扩展集成
98
- 4. **错误处理** - 简单直接的错误处理
99
- 5. **单文件设计** - 每个适配器一个Python文件
100
- 6. **双向支持** - 必须支持与其他CLI工具的双向调用
101
- 7. **项目文档同步** - 必须处理.md文件的共享和更新
102
-
103
- ### 项目文档共享机制 (强制)
104
- 所有CLI工具必须能够:
105
- - **读取其他CLI的项目文档** - {claude.md, qwen.md, gemini.md, iflow.md}
106
- - **更新项目上下文** - 将跨CLI协作结果写入对应文档
107
- - **共享任务计划** - 在文档中记录协作任务和状态
108
- - **维护项目历史** - 跟踪跨CLI协作的完整历史
109
-
110
- ### 适配器代码模板 (强制使用)
111
- ```python
112
- #!/usr/bin/env python3
113
- """
114
- {CLI_NAME} CLI 跨工具处理器 - 独立版本
115
- 遵循项目宪法:简洁、独立、直接、双向
116
- """
117
-
118
- import subprocess
119
- import re
120
- import json
121
- from pathlib import Path
122
- from datetime import datetime
123
- import os
124
-
125
- # CLI工具项目文档路径映射
126
- PROJECT_DOCS = {
127
- 'claude': Path.home() / '.claude' / 'claude.md',
128
- 'gemini': Path.home() / '.gemini' / 'gemini.md',
129
- 'qwen': Path.home() / '.qwen' / 'qwen.md',
130
- 'iflow': Path.home() / '.config' / 'iflow' / 'iflow.md',
131
- 'codebuddy': Path.home() / '.codebuddy' / 'codebuddy.md',
132
- 'qodercli': Path.home() / '.qoder' / 'qodercli.md',
133
- 'copilot': Path.home() / '.config' / 'copilot' / 'copilot.md'
134
- }
135
-
136
- def load_routing_config():
137
- """加载路由配置"""
138
- config_path = Path.home() / '.stigmergy-cli' / 'routing.json'
139
- if config_path.exists():
140
- with open(config_path, encoding='utf-8') as f:
141
- return json.load(f)
142
- return {"cli_mappings": {}}
143
-
144
- def detect_cross_cli(text: str) -> tuple:
145
- """检测跨CLI调用 - 直接模式匹配"""
146
- patterns = [
147
- r"用(\w+)帮我(.+)",
148
- r"请(\w+)来(.+)",
149
- r"调用(\w+)(.+)",
150
- r"use (\w+) to (.+)",
151
- r"call (\w+) to (.+)",
152
- r"ask (\w+) for (.+)"
153
- ]
154
-
155
- for pattern in 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
- return cli_name, task
161
- return None, None
162
-
163
- def call_cli_tool(cli_name: str, task: str, source_cli: str = None) -> str:
164
- """直接调用CLI工具 - 双向支持"""
165
- cli_commands = {
166
- 'claude': ['claude', '--print', task],
167
- 'gemini': ['gemini', task],
168
- 'qwen': ['qwen', task],
169
- 'iflow': ['iflow', task],
170
- 'codebuddy': ['codebuddy', task],
171
- 'qodercli': ['qodercli', task],
172
- 'copilot': ['copilot', task]
173
- }
174
-
175
- if cli_name not in cli_commands:
176
- return f"❌ 不支持的CLI工具: {cli_name}"
177
-
178
- # 记录调用到项目文档
179
- if source_cli:
180
- _record_collaboration(source_cli, cli_name, task)
181
-
182
- try:
183
- print(f"🔄 正在调用 {cli_name.upper()}...")
184
- result = subprocess.run(
185
- cli_commands[cli_name],
186
- capture_output=True,
187
- text=True,
188
- timeout=60
189
- )
190
-
191
- output = result.stdout if result.returncode == 0 else result.stderr
192
-
193
- # 记录结果到项目文档
194
- if source_cli:
195
- _record_result(source_cli, cli_name, task, output)
196
-
197
- return output
198
- except Exception as e:
199
- return f"❌ {cli_name.upper()} 调用失败: {str(e)}"
200
-
201
- def _record_collaboration(source_cli: str, target_cli: str, task: str):
202
- """记录协作任务到项目文档"""
203
- try:
204
- # 更新源CLI项目文档
205
- source_doc = PROJECT_DOCS.get(source_cli)
206
- if source_doc and source_doc.exists():
207
- _append_to_project_doc(source_doc, source_cli, target_cli, task, "REQUESTED")
208
-
209
- # 更新目标CLI项目文档
210
- target_doc = PROJECT_DOCS.get(target_cli)
211
- if target_doc and target_doc.exists():
212
- _append_to_project_doc(target_doc, source_cli, target_cli, task, "CALLED")
213
- except Exception as e:
214
- print(f"⚠️ 记录协作任务失败: {e}")
215
-
216
- def _record_result(source_cli: str, target_cli: str, task: str, result: str):
217
- """记录协作结果到项目文档"""
218
- try:
219
- # 更新源CLI项目文档
220
- source_doc = PROJECT_DOCS.get(source_cli)
221
- if source_doc and source_doc.exists():
222
- _append_to_project_doc(source_doc, source_cli, target_cli, task, "COMPLETED", result)
223
-
224
- # 更新目标CLI项目文档
225
- target_doc = PROJECT_DOCS.get(target_cli)
226
- if target_doc and target_doc.exists():
227
- _append_to_project_doc(target_doc, source_cli, target_cli, task, "EXECUTED", result)
228
- except Exception as e:
229
- print(f"⚠️ 记录协作结果失败: {e}")
230
-
231
- def _append_to_project_doc(doc_path: Path, source_cli: str, target_cli: str, task: str, status: str, result: str = ""):
232
- """向项目文档添加协作记录"""
233
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
234
-
235
- collaboration_entry = f"""
236
- ## 🤖 跨CLI协作记录
237
-
238
- **时间**: {timestamp}
239
- **源CLI**: {source_cli.upper()}
240
- **目标CLI**: {target_cli.upper()}
241
- **任务**: {task}
242
- **状态**: {status}
243
- {f"**结果**: {result[:200]}..." if len(result) > 200 else f"**结果**: {result}" if result else ""}
244
-
245
- ---
246
- """
247
-
248
- try:
249
- with open(doc_path, 'a', encoding='utf-8') as f:
250
- f.write(collaboration_entry)
251
- except Exception as e:
252
- print(f"⚠️ 更新项目文档失败 {doc_path}: {e}")
253
-
254
- def sync_project_contexts():
255
- """同步所有CLI项目的上下文"""
256
- shared_context = {
257
- "project_overview": "Stigmergy-CLI跨工具协作系统",
258
- "supported_tools": ["claude", "gemini", "qwen", "iflow", "codebuddy", "qodercli", "copilot"],
259
- "last_sync": datetime.now().isoformat()
260
- }
261
-
262
- for cli, doc_path in PROJECT_DOCS.items():
263
- if doc_path and doc_path.exists():
264
- try:
265
- # 确保文档存在并包含基本结构
266
- content = doc_path.read_text(encoding='utf-8')
267
- if "## 🤖 跨工具协作系统" not in content:
268
- _initialize_project_doc(doc_path, cli, shared_context)
269
- except Exception as e:
270
- print(f"⚠️ 同步项目上下文失败 {doc_path}: {e}")
271
-
272
- def _initialize_project_doc(doc_path: Path, cli_name: str, context: dict):
273
- """初始化项目文档"""
274
- initial_content = f"""# 🤖 {cli_name.upper()} 项目文档
275
-
276
- ## 📋 项目信息
277
- - **CLI工具**: {cli_name.upper()}
278
- - **Stigmergy集成**: ✅ 已启用
279
- - **最后同步**: {context['last_sync']}
280
-
281
- ## 🔄 跨工具协作能力
282
- 支持以下CLI工具的双向协作:
283
- {chr(10).join([f"- {tool.upper()}" for tool in context['supported_tools']])}
284
-
285
- ## 📝 使用指南
286
- ### 跨CLI调用示例
287
- - `请用gemini帮我翻译这段代码`
288
- - `调用claude分析这个需求`
289
- - `用iflow创建工作流`
290
-
291
- ### 协作历史
292
- 跨工具协作的详细记录将显示在下方。
293
-
294
- ---
295
- *本文档由Stigermy-CLI自动维护*
296
- """
297
-
298
- doc_path.parent.mkdir(parents=True, exist_ok=True)
299
- with open(doc_path, 'w', encoding='utf-8') as f:
300
- f.write(initial_content)
301
-
302
- def hook_entry_point(prompt: str, metadata: dict) -> str:
303
- """Hook入口点 - 与CLI原生扩展集成"""
304
- # 获取源CLI名称
305
- source_cli = metadata.get('source_cli', 'unknown')
306
-
307
- target_cli, task = detect_cross_cli(prompt)
308
-
309
- if target_cli and target_cli != source_cli:
310
- # 跨CLI调用
311
- result = call_cli_tool(target_cli, task, source_cli)
312
-
313
- return f"""
314
- 🤖 跨CLI协作完成
315
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━
316
- 📤 源CLI: {source_cli.upper()}
317
- 🎯 目标CLI: {target_cli.upper()}
318
- 📝 执行任务: {task}
319
- ✅ 执行结果:
320
- {result}
321
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━
322
- """
323
-
324
- return None # 让原始CLI正常处理
325
-
326
- # 独立测试入口
327
- if __name__ == "__main__":
328
- import sys
329
- if len(sys.argv) > 1:
330
- result = hook_entry_point(' '.join(sys.argv[1:]), {'source_cli': 'test'})
331
- if result:
332
- print(result)
333
- ```
334
-
335
- ---
336
-
337
- ## 📊 成功标准与验收条件
338
-
339
- ### 验收条件清单 (Must-Have)
340
-
341
- #### Phase 1: 基础功能验收
342
- - [ ] 用户可以在Claude CLI中调用Gemini CLI
343
- - [ ] 用户可以在Gemini CLI中调用Claude CLI
344
- - [ ] 系统能正确识别自然语言中的跨CLI调用意图
345
- - [ ] 结果正确格式化并显示在源CLI中
346
-
347
- #### Phase 2: 多CLI支持验收
348
- - [ ] 8个目标CLI工具全部集成成功
349
- - [ ] 每个CLI使用其最优集成机制
350
- - [ ] 跨CLI调用成功率 >95%
351
- - [ ] 错误处理和降级机制正常工作
352
-
353
- #### Phase 3: 用户体验验收
354
- - [ ] 安装过程一键完成
355
- - [ ] 无需额外配置即可使用
356
- - [ ] 学习曲线最小化
357
- - [ ] 现有CLI功能不受影响
358
-
359
- ### 性能标准
360
- - **响应时间:** 跨CLI调用在30秒内完成
361
- - **系统开销:** 集成对CLI操作的影响 <100ms
362
- - **可用性:** 核心功能可用率 >99%
363
-
364
- ### 质量标准
365
- - **代码覆盖率:** 核心组件 >90%
366
- - **兼容性:** 支持Python 3.8+,主流操作系统
367
- - **安全性:** 通过安全审计,无已知漏洞
368
-
369
- ---
370
-
371
- ## 🔄 项目执行原则
372
-
373
- ### 1. 渐进式实现 (Progressive Implementation)
374
- - **原则:** 先实现核心功能,再扩展完整生态
375
- - **Phase 1:** Claude + Gemini + Aider(高优先级CLI)
376
- - **Phase 2:** 剩余5个CLI工具
377
- - **Phase 3:** 优化和扩展功能
378
-
379
- ### 2. 测试驱动开发 (Test-Driven Development)
380
- - **原则:** 每个适配器必须有完整的测试覆盖
381
- - **要求:** 单元测试、集成测试、端到端测试
382
- - **标准:** 所有测试通过才能发布
383
-
384
- ### 3. 用户反馈驱动 (User Feedback Driven)
385
- - **原则:** 定期收集用户反馈并快速迭代
386
- - **机制:** Beta测试用户群、反馈收集渠道
387
- - **响应:** 关键问题48小时内响应
388
-
389
- ### 4. 文档同步 (Documentation Sync)
390
- - **原则:** 代码变更必须有相应的文档更新
391
- - **要求:** API文档、用户手册、集成指南
392
- - **标准:** 文档准确性100%
393
-
394
- ---
395
-
396
- ## ⚠️ 风险管理
397
-
398
- ### 高风险项目
399
- 1. **CLI工具API变更** - 目标CLI工具可能改变其API或集成机制
400
- 2. **性能影响** - 集成可能对CLI性能产生不可预见的影响
401
- 3. **兼容性问题** - 不同版本的CLI工具可能存在兼容性问题
402
-
403
- ### 风险缓解策略
404
- 1. **版本管理:** 维护兼容性矩阵,支持多个CLI版本
405
- 2. **性能监控:** 持续监控集成性能,快速优化瓶颈
406
- 3. **模块化设计:** 每个适配器独立,限制故障传播范围
407
-
408
- ---
409
-
410
- ## 📝 修订历史
411
-
412
- | 版本 | 日期 | 主要变更 | 变更原因 |
413
- |------|------|----------|----------|
414
- | 1.0 | 2025-01-22 | 初始版本 | 基于用户需求讨论创建 |
415
-
416
- ---
417
-
418
- ## 📞 联系与反馈
419
-
420
- **项目负责人:** AI System
421
- **反馈渠道:** 项目Issue Tracker
422
- **紧急联系:** 项目维护团队
423
-
424
- ---
425
-
426
- ### 宪法声明
427
-
428
- 本项目宪法是项目执行的最高指导原则,所有项目决策和实现都必须遵守本宪法中明确的需求和约束。任何对本宪法的修改都必须经过正式的变更管理流程并获得项目利益相关者的批准。
429
-
430
- **本宪法自2025年1月22日起生效,直至被正式修订为止。**
431
-
432
- ---
433
-
1
+ # 🏛️ Stigmergy-CLI 项目宪法
2
+
3
+ **强制必须对齐和遵守的核心设计原则与实施指南**
4
+
5
+ ## 🎖️ 项目核心理念
6
+
7
+ ### 基本原则
8
+ 1. **简洁性原则** - 每个组件只做一件事,做好一件事
9
+ 2. **独立性原则** - 适配器完全独立,无复杂依赖关系
10
+ 3. **直接性原则** - 直接subprocess调用,无抽象层
11
+ 4. **原生性原则** - 利用CLI工具的原生扩展机制
12
+
13
+ ### 禁止事项 (❌ FORBIDDEN)
14
+ - **禁止复杂抽象层** - 不得创建BaseAdapter、Factory等复杂抽象
15
+ - **禁止依赖注入** - 不得使用依赖注入框架或IoC容器
16
+ - **禁止过度工程化** - 不得为简单问题创建复杂解决方案
17
+ - **禁止核心模块** - 不得创建core/目录和复杂的核心基础设施
18
+ - **禁止抽象工厂** - 不得使用Factory Pattern管理适配器
19
+
20
+ ### 强制要求 (✅ MANDATORY)
21
+ - **每个适配器独立工作** - 必须能在没有其他适配器的情况下运行
22
+ - **直接subprocess调用** - 必须使用subprocess直接调用目标CLI工具
23
+ - **原生Hook集成** - 必须使用每个CLI的原生扩展机制
24
+ - **简单JSON配置** - 必须使用简单的JSON配置文件进行路由
25
+ - **无依赖设计** - 适配器之间不得有任何依赖关系
26
+
27
+ ## 🏗️ 强制架构设计
28
+
29
+ ### 适配器架构 (强制)
30
+ ```python
31
+ # 正确的适配器结构 (✅)
32
+ class ClaudeCrossCLIHandler:
33
+ """Claude CLI 跨工具处理器 - 完全独立"""
34
+
35
+ def detect_cross_cli(self, text: str) -> tuple:
36
+ """检测跨CLI调用意图 - 直接实现"""
37
+ pass
38
+
39
+ def call_cli_tool(self, cli_name: str, task: str) -> str:
40
+ """直接调用CLI工具 - 使用subprocess"""
41
+ return subprocess.run([cli_name, task], capture_output=True, text=True).stdout
42
+
43
+ def handle_user_input(self, user_input: str) -> str:
44
+ """处理用户输入 - 直接逻辑"""
45
+ target_cli, task = self.detect_cross_cli(user_input)
46
+ if target_cli:
47
+ return self.call_cli_tool(target_cli, task)
48
+ return None
49
+ ```
50
+
51
+ ### 禁止的架构 (❌ 禁止)
52
+ ```python
53
+ # ❌ 错误的抽象层设计
54
+ class BaseCrossCLIAdapter(ABC): # 禁止!
55
+ @abstractmethod
56
+ def execute_task(self, task: str, context: dict) -> str:
57
+ pass
58
+
59
+ class CrossCLIAdapterFactory: # 禁止!
60
+ def get_adapter(self, cli_name: str):
61
+ pass
62
+ ```
63
+
64
+ ### 文件结构 (强制)
65
+ ```
66
+ ~/.stigmergy-cli/
67
+ ├── adapters/ # 适配器目录
68
+ │ ├── claude/
69
+ │ │ └── cross_cli_handler.py # 独立的Claude适配器 (50-100行)
70
+ │ ├── gemini/
71
+ │ │ └── extension_handler.py # 独立的Gemini适配器 (50-100行)
72
+ │ ├── qwen/
73
+ │ │ └── class_enhancer.py # 独立的Qwen适配器 (50-100行)
74
+ │ └── iflow/
75
+ │ └── workflow_handler.py # 独立的iFlow适配器 (50-100行)
76
+ ├── routing.json # 简单的路由配置 (JSON)
77
+ └── logs/ # 可选的日志目录
78
+ ```
79
+
80
+ ### 禁止的文件结构 (❌ 禁止)
81
+ ```
82
+ ~/.stigmergy-cli/
83
+ ├── core/ # ❌ 禁止!复杂的核心模块
84
+ │ ├── base_adapter.py
85
+ │ ├── parser.py
86
+ │ └── factory.py
87
+ ├── adapters/
88
+ │ └── base/ # ❌ 禁止!抽象基类
89
+ └── complex_dependencies/ # ❌ 禁止!复杂依赖
90
+ ```
91
+
92
+ ## 🔧 强制实施指南
93
+
94
+ ### 每个适配器必须包含 (强制)
95
+ 1. **跨CLI检测函数** - 直接实现,无继承
96
+ 2. **CLI调用函数** - 使用subprocess直接调用
97
+ 3. **Hook入口函数** - 与CLI原生扩展集成
98
+ 4. **错误处理** - 简单直接的错误处理
99
+ 5. **单文件设计** - 每个适配器一个Python文件
100
+ 6. **双向支持** - 必须支持与其他CLI工具的双向调用
101
+ 7. **项目文档同步** - 必须处理.md文件的共享和更新
102
+
103
+ ### 项目文档共享机制 (强制)
104
+ 所有CLI工具必须能够:
105
+ - **读取其他CLI的项目文档** - {claude.md, qwen.md, gemini.md, iflow.md}
106
+ - **更新项目上下文** - 将跨CLI协作结果写入对应文档
107
+ - **共享任务计划** - 在文档中记录协作任务和状态
108
+ - **维护项目历史** - 跟踪跨CLI协作的完整历史
109
+
110
+ ### 适配器代码模板 (强制使用)
111
+ ```python
112
+ #!/usr/bin/env python3
113
+ """
114
+ {CLI_NAME} CLI 跨工具处理器 - 独立版本
115
+ 遵循项目宪法:简洁、独立、直接、双向
116
+ """
117
+
118
+ import subprocess
119
+ import re
120
+ import json
121
+ from pathlib import Path
122
+ from datetime import datetime
123
+ import os
124
+
125
+ # CLI工具项目文档路径映射
126
+ PROJECT_DOCS = {
127
+ 'claude': Path.home() / '.claude' / 'claude.md',
128
+ 'gemini': Path.home() / '.gemini' / 'gemini.md',
129
+ 'qwen': Path.home() / '.qwen' / 'qwen.md',
130
+ 'iflow': Path.home() / '.config' / 'iflow' / 'iflow.md',
131
+ 'codebuddy': Path.home() / '.codebuddy' / 'codebuddy.md',
132
+ 'qodercli': Path.home() / '.qoder' / 'qodercli.md',
133
+ 'copilot': Path.home() / '.config' / 'copilot' / 'copilot.md'
134
+ }
135
+
136
+ def load_routing_config():
137
+ """加载路由配置"""
138
+ config_path = Path.home() / '.stigmergy-cli' / 'routing.json'
139
+ if config_path.exists():
140
+ with open(config_path, encoding='utf-8') as f:
141
+ return json.load(f)
142
+ return {"cli_mappings": {}}
143
+
144
+ def detect_cross_cli(text: str) -> tuple:
145
+ """检测跨CLI调用 - 直接模式匹配"""
146
+ patterns = [
147
+ r"用(\w+)帮我(.+)",
148
+ r"请(\w+)来(.+)",
149
+ r"调用(\w+)(.+)",
150
+ r"use (\w+) to (.+)",
151
+ r"call (\w+) to (.+)",
152
+ r"ask (\w+) for (.+)"
153
+ ]
154
+
155
+ for pattern in 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
+ return cli_name, task
161
+ return None, None
162
+
163
+ def call_cli_tool(cli_name: str, task: str, source_cli: str = None) -> str:
164
+ """直接调用CLI工具 - 双向支持"""
165
+ cli_commands = {
166
+ 'claude': ['claude', '--print', task],
167
+ 'gemini': ['gemini', task],
168
+ 'qwen': ['qwen', task],
169
+ 'iflow': ['iflow', task],
170
+ 'codebuddy': ['codebuddy', task],
171
+ 'qodercli': ['qodercli', task],
172
+ 'copilot': ['copilot', task]
173
+ }
174
+
175
+ if cli_name not in cli_commands:
176
+ return f"❌ 不支持的CLI工具: {cli_name}"
177
+
178
+ # 记录调用到项目文档
179
+ if source_cli:
180
+ _record_collaboration(source_cli, cli_name, task)
181
+
182
+ try:
183
+ print(f"🔄 正在调用 {cli_name.upper()}...")
184
+ result = subprocess.run(
185
+ cli_commands[cli_name],
186
+ capture_output=True,
187
+ text=True,
188
+ timeout=60
189
+ )
190
+
191
+ output = result.stdout if result.returncode == 0 else result.stderr
192
+
193
+ # 记录结果到项目文档
194
+ if source_cli:
195
+ _record_result(source_cli, cli_name, task, output)
196
+
197
+ return output
198
+ except Exception as e:
199
+ return f"❌ {cli_name.upper()} 调用失败: {str(e)}"
200
+
201
+ def _record_collaboration(source_cli: str, target_cli: str, task: str):
202
+ """记录协作任务到项目文档"""
203
+ try:
204
+ # 更新源CLI项目文档
205
+ source_doc = PROJECT_DOCS.get(source_cli)
206
+ if source_doc and source_doc.exists():
207
+ _append_to_project_doc(source_doc, source_cli, target_cli, task, "REQUESTED")
208
+
209
+ # 更新目标CLI项目文档
210
+ target_doc = PROJECT_DOCS.get(target_cli)
211
+ if target_doc and target_doc.exists():
212
+ _append_to_project_doc(target_doc, source_cli, target_cli, task, "CALLED")
213
+ except Exception as e:
214
+ print(f"⚠️ 记录协作任务失败: {e}")
215
+
216
+ def _record_result(source_cli: str, target_cli: str, task: str, result: str):
217
+ """记录协作结果到项目文档"""
218
+ try:
219
+ # 更新源CLI项目文档
220
+ source_doc = PROJECT_DOCS.get(source_cli)
221
+ if source_doc and source_doc.exists():
222
+ _append_to_project_doc(source_doc, source_cli, target_cli, task, "COMPLETED", result)
223
+
224
+ # 更新目标CLI项目文档
225
+ target_doc = PROJECT_DOCS.get(target_cli)
226
+ if target_doc and target_doc.exists():
227
+ _append_to_project_doc(target_doc, source_cli, target_cli, task, "EXECUTED", result)
228
+ except Exception as e:
229
+ print(f"⚠️ 记录协作结果失败: {e}")
230
+
231
+ def _append_to_project_doc(doc_path: Path, source_cli: str, target_cli: str, task: str, status: str, result: str = ""):
232
+ """向项目文档添加协作记录"""
233
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
234
+
235
+ collaboration_entry = f"""
236
+ ## 🤖 跨CLI协作记录
237
+
238
+ **时间**: {timestamp}
239
+ **源CLI**: {source_cli.upper()}
240
+ **目标CLI**: {target_cli.upper()}
241
+ **任务**: {task}
242
+ **状态**: {status}
243
+ {f"**结果**: {result[:200]}..." if len(result) > 200 else f"**结果**: {result}" if result else ""}
244
+
245
+ ---
246
+ """
247
+
248
+ try:
249
+ with open(doc_path, 'a', encoding='utf-8') as f:
250
+ f.write(collaboration_entry)
251
+ except Exception as e:
252
+ print(f"⚠️ 更新项目文档失败 {doc_path}: {e}")
253
+
254
+ def sync_project_contexts():
255
+ """同步所有CLI项目的上下文"""
256
+ shared_context = {
257
+ "project_overview": "Stigmergy-CLI跨工具协作系统",
258
+ "supported_tools": ["claude", "gemini", "qwen", "iflow", "codebuddy", "qodercli", "copilot"],
259
+ "last_sync": datetime.now().isoformat()
260
+ }
261
+
262
+ for cli, doc_path in PROJECT_DOCS.items():
263
+ if doc_path and doc_path.exists():
264
+ try:
265
+ # 确保文档存在并包含基本结构
266
+ content = doc_path.read_text(encoding='utf-8')
267
+ if "## 🤖 跨工具协作系统" not in content:
268
+ _initialize_project_doc(doc_path, cli, shared_context)
269
+ except Exception as e:
270
+ print(f"⚠️ 同步项目上下文失败 {doc_path}: {e}")
271
+
272
+ def _initialize_project_doc(doc_path: Path, cli_name: str, context: dict):
273
+ """初始化项目文档"""
274
+ initial_content = f"""# 🤖 {cli_name.upper()} 项目文档
275
+
276
+ ## 📋 项目信息
277
+ - **CLI工具**: {cli_name.upper()}
278
+ - **Stigmergy集成**: ✅ 已启用
279
+ - **最后同步**: {context['last_sync']}
280
+
281
+ ## 🔄 跨工具协作能力
282
+ 支持以下CLI工具的双向协作:
283
+ {chr(10).join([f"- {tool.upper()}" for tool in context['supported_tools']])}
284
+
285
+ ## 📝 使用指南
286
+ ### 跨CLI调用示例
287
+ - `请用gemini帮我翻译这段代码`
288
+ - `调用claude分析这个需求`
289
+ - `用iflow创建工作流`
290
+
291
+ ### 协作历史
292
+ 跨工具协作的详细记录将显示在下方。
293
+
294
+ ---
295
+ *本文档由Stigermy-CLI自动维护*
296
+ """
297
+
298
+ doc_path.parent.mkdir(parents=True, exist_ok=True)
299
+ with open(doc_path, 'w', encoding='utf-8') as f:
300
+ f.write(initial_content)
301
+
302
+ def hook_entry_point(prompt: str, metadata: dict) -> str:
303
+ """Hook入口点 - 与CLI原生扩展集成"""
304
+ # 获取源CLI名称
305
+ source_cli = metadata.get('source_cli', 'unknown')
306
+
307
+ target_cli, task = detect_cross_cli(prompt)
308
+
309
+ if target_cli and target_cli != source_cli:
310
+ # 跨CLI调用
311
+ result = call_cli_tool(target_cli, task, source_cli)
312
+
313
+ return f"""
314
+ 🤖 跨CLI协作完成
315
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━
316
+ 📤 源CLI: {source_cli.upper()}
317
+ 🎯 目标CLI: {target_cli.upper()}
318
+ 📝 执行任务: {task}
319
+ ✅ 执行结果:
320
+ {result}
321
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━
322
+ """
323
+
324
+ return None # 让原始CLI正常处理
325
+
326
+ # 独立测试入口
327
+ if __name__ == "__main__":
328
+ import sys
329
+ if len(sys.argv) > 1:
330
+ result = hook_entry_point(' '.join(sys.argv[1:]), {'source_cli': 'test'})
331
+ if result:
332
+ print(result)
333
+ ```
334
+
335
+ ---
336
+
337
+ ## 📊 成功标准与验收条件
338
+
339
+ ### 验收条件清单 (Must-Have)
340
+
341
+ #### Phase 1: 基础功能验收
342
+ - [ ] 用户可以在Claude CLI中调用Gemini CLI
343
+ - [ ] 用户可以在Gemini CLI中调用Claude CLI
344
+ - [ ] 系统能正确识别自然语言中的跨CLI调用意图
345
+ - [ ] 结果正确格式化并显示在源CLI中
346
+
347
+ #### Phase 2: 多CLI支持验收
348
+ - [ ] 8个目标CLI工具全部集成成功
349
+ - [ ] 每个CLI使用其最优集成机制
350
+ - [ ] 跨CLI调用成功率 >95%
351
+ - [ ] 错误处理和降级机制正常工作
352
+
353
+ #### Phase 3: 用户体验验收
354
+ - [ ] 安装过程一键完成
355
+ - [ ] 无需额外配置即可使用
356
+ - [ ] 学习曲线最小化
357
+ - [ ] 现有CLI功能不受影响
358
+
359
+ ### 性能标准
360
+ - **响应时间:** 跨CLI调用在30秒内完成
361
+ - **系统开销:** 集成对CLI操作的影响 <100ms
362
+ - **可用性:** 核心功能可用率 >99%
363
+
364
+ ### 质量标准
365
+ - **代码覆盖率:** 核心组件 >90%
366
+ - **兼容性:** 支持Python 3.8+,主流操作系统
367
+ - **安全性:** 通过安全审计,无已知漏洞
368
+
369
+ ---
370
+
371
+ ## 🔄 项目执行原则
372
+
373
+ ### 1. 渐进式实现 (Progressive Implementation)
374
+ - **原则:** 先实现核心功能,再扩展完整生态
375
+ - **Phase 1:** Claude + Gemini + Aider(高优先级CLI)
376
+ - **Phase 2:** 剩余5个CLI工具
377
+ - **Phase 3:** 优化和扩展功能
378
+
379
+ ### 2. 测试驱动开发 (Test-Driven Development)
380
+ - **原则:** 每个适配器必须有完整的测试覆盖
381
+ - **要求:** 单元测试、集成测试、端到端测试
382
+ - **标准:** 所有测试通过才能发布
383
+
384
+ ### 3. 用户反馈驱动 (User Feedback Driven)
385
+ - **原则:** 定期收集用户反馈并快速迭代
386
+ - **机制:** Beta测试用户群、反馈收集渠道
387
+ - **响应:** 关键问题48小时内响应
388
+
389
+ ### 4. 文档同步 (Documentation Sync)
390
+ - **原则:** 代码变更必须有相应的文档更新
391
+ - **要求:** API文档、用户手册、集成指南
392
+ - **标准:** 文档准确性100%
393
+
394
+ ---
395
+
396
+ ## ⚠️ 风险管理
397
+
398
+ ### 高风险项目
399
+ 1. **CLI工具API变更** - 目标CLI工具可能改变其API或集成机制
400
+ 2. **性能影响** - 集成可能对CLI性能产生不可预见的影响
401
+ 3. **兼容性问题** - 不同版本的CLI工具可能存在兼容性问题
402
+
403
+ ### 风险缓解策略
404
+ 1. **版本管理:** 维护兼容性矩阵,支持多个CLI版本
405
+ 2. **性能监控:** 持续监控集成性能,快速优化瓶颈
406
+ 3. **模块化设计:** 每个适配器独立,限制故障传播范围
407
+
408
+ ---
409
+
410
+ ## 📝 修订历史
411
+
412
+ | 版本 | 日期 | 主要变更 | 变更原因 |
413
+ |------|------|----------|----------|
414
+ | 1.0 | 2025-01-22 | 初始版本 | 基于用户需求讨论创建 |
415
+
416
+ ---
417
+
418
+ ## 📞 联系与反馈
419
+
420
+ **项目负责人:** AI System
421
+ **反馈渠道:** 项目Issue Tracker
422
+ **紧急联系:** 项目维护团队
423
+
424
+ ---
425
+
426
+ ### 宪法声明
427
+
428
+ 本项目宪法是项目执行的最高指导原则,所有项目决策和实现都必须遵守本宪法中明确的需求和约束。任何对本宪法的修改都必须经过正式的变更管理流程并获得项目利益相关者的批准。
429
+
430
+ **本宪法自2025年1月22日起生效,直至被正式修订为止。**
431
+
432
+ ---
433
+
434
434
  *此项目宪法明确界定项目的核心需求、技术约束和执行原则,确保项目在正确的轨道上推进,满足用户的真实需求。*