@agentunion/kite 1.3.2 → 1.5.0

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 (293) hide show
  1. package/CHANGELOG.md +302 -0
  2. package/cli.js +119 -4
  3. package/core/dependency_checker.py +250 -0
  4. package/core/env_checker.py +490 -0
  5. package/dependencies_lock.json +128 -0
  6. package/extensions/agents/assistant/entry.py +111 -1
  7. package/extensions/agents/assistant/server.py +279 -215
  8. package/extensions/channels/acp_channel/entry.py +111 -1
  9. package/extensions/channels/acp_channel/module.md +23 -22
  10. package/extensions/channels/acp_channel/server.py +279 -215
  11. package/extensions/event_hub_bench/entry.py +107 -1
  12. package/extensions/services/backup/entry.py +306 -21
  13. package/extensions/services/backup/module.md +24 -22
  14. package/extensions/services/evol/auth_manager.py +443 -0
  15. package/extensions/services/evol/config.yaml +149 -0
  16. package/extensions/services/evol/config_loader.py +117 -0
  17. package/extensions/services/evol/entry.py +406 -0
  18. package/extensions/services/evol/evol_api.py +173 -0
  19. package/extensions/services/evol/evol_config.json5 +29 -0
  20. package/extensions/services/evol/migrate_tokens.py +122 -0
  21. package/extensions/services/evol/module.md +32 -0
  22. package/extensions/services/evol/pairing.py +250 -0
  23. package/extensions/services/evol/pairing_codes.jsonl +1 -0
  24. package/extensions/services/evol/relay.py +682 -0
  25. package/extensions/services/evol/relay_config.json5 +67 -0
  26. package/extensions/services/evol/routes/__init__.py +1 -0
  27. package/extensions/services/evol/routes/routes_management_ws.py +127 -0
  28. package/extensions/services/evol/routes/routes_rpc.py +89 -0
  29. package/extensions/services/evol/routes/routes_test.py +61 -0
  30. package/extensions/services/evol/server.py +875 -0
  31. package/extensions/services/evol/static/css/style.css +1200 -0
  32. package/extensions/services/evol/static/index.html +781 -0
  33. package/extensions/services/evol/static/index_evol.html +14 -0
  34. package/extensions/services/evol/static/js/app.js +6304 -0
  35. package/extensions/services/evol/static/js/auth.js +326 -0
  36. package/extensions/services/evol/static/js/dialog.js +285 -0
  37. package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
  38. package/extensions/services/evol/static/js/evol-app.js +1949 -0
  39. package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
  40. package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
  41. package/extensions/services/evol/static/js/kernel-client.js +396 -0
  42. package/extensions/services/evol/static/js/main.js +141 -0
  43. package/extensions/services/evol/static/js/registry-tests.js +585 -0
  44. package/extensions/services/evol/static/js/stats.js +217 -0
  45. package/extensions/services/evol/static/js/token-manager.js +175 -0
  46. package/extensions/services/evol/static/pairing.html +248 -0
  47. package/extensions/services/evol/static/test_registry.html +262 -0
  48. package/extensions/services/evol/static/test_relay.html +462 -0
  49. package/extensions/services/evol/stats_manager.py +240 -0
  50. package/extensions/services/model_service/entry.py +167 -19
  51. package/extensions/services/model_service/module.md +21 -22
  52. package/extensions/services/proxy/.claude/settings.local.json +13 -0
  53. package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
  54. package/extensions/services/proxy/_fix_prints.py +133 -0
  55. package/extensions/services/proxy/_fix_prints2.py +87 -0
  56. package/extensions/services/proxy/agentcp/LICENCE +178 -0
  57. package/extensions/services/proxy/agentcp/README copy.md +85 -0
  58. package/extensions/services/proxy/agentcp/README.md +260 -0
  59. package/extensions/services/proxy/agentcp/__init__.py +16 -0
  60. package/extensions/services/proxy/agentcp/agent.py +4 -0
  61. package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
  62. package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
  63. package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
  64. package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
  65. package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
  66. package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
  67. package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
  68. package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
  69. package/extensions/services/proxy/agentcp/base/client.py +112 -0
  70. package/extensions/services/proxy/agentcp/base/env.py +34 -0
  71. package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
  72. package/extensions/services/proxy/agentcp/base/log.py +98 -0
  73. package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
  74. package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
  75. package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
  76. package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
  77. package/extensions/services/proxy/agentcp/context/context.py +73 -0
  78. package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
  79. package/extensions/services/proxy/agentcp/create_profile.py +125 -0
  80. package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
  81. package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
  82. package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
  83. package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
  84. package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
  85. package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
  86. package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
  87. package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
  88. package/extensions/services/proxy/agentcp/hcp.py +299 -0
  89. package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
  90. package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
  91. package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
  92. package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
  93. package/extensions/services/proxy/agentcp/llm_server.py +172 -0
  94. package/extensions/services/proxy/agentcp/mermaid.py +210 -0
  95. package/extensions/services/proxy/agentcp/message.py +149 -0
  96. package/extensions/services/proxy/agentcp/metrics.py +256 -0
  97. package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
  98. package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
  99. package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
  100. package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
  101. package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
  102. package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
  103. package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
  104. package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
  105. package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
  106. package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
  107. package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
  108. package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
  109. package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
  110. package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
  111. package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
  112. package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
  113. package/extensions/services/proxy/agentcp/requirements.txt +7 -0
  114. package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
  115. package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
  116. package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
  117. package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
  118. package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
  119. package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
  120. package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
  121. package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
  122. package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
  123. package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
  124. package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
  125. package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
  126. package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
  127. package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
  128. package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
  129. package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
  130. package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
  131. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
  132. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
  133. package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
  134. package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
  135. package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
  136. package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
  137. package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
  138. package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
  139. package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
  140. package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
  141. package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
  142. package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
  143. package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
  144. package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
  145. package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
  146. package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
  147. package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
  148. package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
  149. package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
  150. package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
  151. package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
  152. package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
  153. package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
  154. package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
  155. package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
  156. package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
  157. package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
  158. package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
  159. package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
  160. package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
  161. package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
  162. package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
  163. package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
  164. package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
  165. package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
  166. package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
  167. package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
  168. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
  169. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
  170. package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
  171. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
  172. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
  173. package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
  174. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
  175. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
  176. package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
  177. package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
  178. package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
  179. package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
  180. package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
  181. package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
  182. package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
  183. package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
  184. package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
  185. package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
  186. package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
  187. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
  188. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
  189. package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
  190. package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
  191. package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
  192. package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
  193. package/extensions/services/proxy/agentcp/workflow.py +203 -0
  194. package/extensions/services/proxy/console_auth.py +109 -0
  195. package/extensions/services/proxy/evol/__init__.py +1 -0
  196. package/extensions/services/proxy/evol/config.py +37 -0
  197. package/extensions/services/proxy/evol/http/__init__.py +1 -0
  198. package/extensions/services/proxy/evol/http/async_http.py +551 -0
  199. package/extensions/services/proxy/evol/log.py +28 -0
  200. package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
  201. package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
  202. package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
  203. package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
  204. package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
  205. package/extensions/services/proxy/evol/server/__init__.py +1 -0
  206. package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
  207. package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
  208. package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
  209. package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
  210. package/extensions/services/proxy/evol/version.py +24 -0
  211. package/extensions/services/proxy/logs/websocket.log +260 -0
  212. package/extensions/services/proxy/main.py +240 -0
  213. package/extensions/services/proxy/requirements.txt +13 -0
  214. package/extensions/services/proxy/server.py +271 -0
  215. package/extensions/services/watchdog/entry.py +215 -26
  216. package/extensions/services/watchdog/module.md +1 -0
  217. package/extensions/services/watchdog/monitor.py +178 -38
  218. package/extensions/services/web/WEBSOCKET_STATUS.md +143 -0
  219. package/extensions/services/web/config_example.py +35 -0
  220. package/extensions/services/web/config_loader.py +110 -0
  221. package/extensions/services/web/entry.py +114 -26
  222. package/extensions/services/web/module.md +35 -24
  223. package/extensions/services/web/pairing.py +250 -0
  224. package/extensions/services/web/pairing_codes.jsonl +16 -0
  225. package/extensions/services/web/relay.py +643 -0
  226. package/extensions/services/web/relay_config.json5 +67 -0
  227. package/extensions/services/web/routes/routes_management_ws.py +127 -0
  228. package/extensions/services/web/routes/routes_rpc.py +89 -0
  229. package/extensions/services/web/routes/routes_test.py +61 -0
  230. package/extensions/services/web/routes/schemas.py +0 -22
  231. package/extensions/services/web/server.py +434 -99
  232. package/extensions/services/web/static/css/style.css +67 -28
  233. package/extensions/services/web/static/index.html +234 -44
  234. package/extensions/services/web/static/js/app.js +1335 -48
  235. package/extensions/services/web/static/js/kernel-client-example.js +161 -0
  236. package/extensions/services/web/static/js/kernel-client.js +383 -0
  237. package/extensions/services/web/static/js/registry-tests.js +558 -0
  238. package/extensions/services/web/static/js/token-manager.js +175 -0
  239. package/extensions/services/web/static/pairing.html +248 -0
  240. package/extensions/services/web/static/test_registry.html +262 -0
  241. package/extensions/services/web/web_config.json5 +29 -0
  242. package/kernel/entry.py +120 -32
  243. package/kernel/event_hub.py +141 -16
  244. package/kernel/module.md +60 -33
  245. package/kernel/registry_store.py +45 -36
  246. package/kernel/rpc_router.py +152 -59
  247. package/kernel/server.py +322 -26
  248. package/kite_cli/__init__.py +3 -0
  249. package/kite_cli/__main__.py +5 -0
  250. package/kite_cli/commands/__init__.py +1 -0
  251. package/kite_cli/commands/clean.py +101 -0
  252. package/kite_cli/commands/deps_install.py +67 -0
  253. package/kite_cli/commands/doctor.py +35 -0
  254. package/kite_cli/commands/env_check.py +45 -0
  255. package/kite_cli/commands/history.py +111 -0
  256. package/kite_cli/commands/info.py +96 -0
  257. package/kite_cli/commands/install.py +313 -0
  258. package/kite_cli/commands/list.py +143 -0
  259. package/kite_cli/commands/log.py +81 -0
  260. package/kite_cli/commands/prepare.py +49 -0
  261. package/kite_cli/commands/rollback.py +88 -0
  262. package/kite_cli/commands/search.py +73 -0
  263. package/kite_cli/commands/uninstall.py +85 -0
  264. package/kite_cli/commands/update.py +118 -0
  265. package/kite_cli/commands/venv_setup.py +56 -0
  266. package/kite_cli/core/__init__.py +1 -0
  267. package/kite_cli/core/checker.py +142 -0
  268. package/kite_cli/core/dependency.py +229 -0
  269. package/kite_cli/core/downloader.py +209 -0
  270. package/kite_cli/core/install_info.py +40 -0
  271. package/kite_cli/core/tool_installer.py +397 -0
  272. package/kite_cli/core/validator.py +78 -0
  273. package/kite_cli/main.py +317 -0
  274. package/kite_cli/utils/__init__.py +1 -0
  275. package/kite_cli/utils/i18n.py +252 -0
  276. package/kite_cli/utils/interactive.py +63 -0
  277. package/kite_cli/utils/operation_log.py +77 -0
  278. package/kite_cli/utils/paths.py +34 -0
  279. package/kite_cli/utils/version.py +308 -0
  280. package/launcher/entry.py +1124 -178
  281. package/launcher/logging_setup.py +104 -0
  282. package/launcher/module.md +46 -37
  283. package/launcher/module_scanner.py +11 -1
  284. package/main.py +4 -1
  285. package/package.json +9 -1
  286. package/python_version.json +4 -0
  287. package/requirements.txt +38 -0
  288. package/scripts/env-manager.js +328 -0
  289. package/scripts/plan_manager.py +315 -0
  290. package/scripts/python-env.js +79 -0
  291. package/scripts/scan_dependencies.py +461 -0
  292. package/scripts/setup-python-env.js +191 -0
  293. package/extensions/services/web/routes/routes_modules.py +0 -249
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env python3
2
+ """Kite CLI 主入口"""
3
+ import sys
4
+ import argparse
5
+ from kite_cli import __version__
6
+ from kite_cli.utils.i18n import t
7
+
8
+
9
+ KNOWN_COMMANDS = ["install", "uninstall", "update", "list", "search", "info", "log", "rollback", "clean", "doctor", "history", "prepare", "env-check", "venv-setup", "deps-install"]
10
+
11
+
12
+ class SilentArgumentParser(argparse.ArgumentParser):
13
+ """覆盖默认错误处理,输出友好提示"""
14
+ def error(self, message):
15
+ cmd = self.prog.replace("kite ", "").strip()
16
+ if cmd == "kite":
17
+ # 顶层命令错误
18
+ bad = sys.argv[1] if len(sys.argv) > 1 else ""
19
+ print(t('error_unknown_command', cmd=bad))
20
+ print(t('run_help'))
21
+ else:
22
+ # 子命令参数错误
23
+ bad_args = [a for a in sys.argv[2:] if a.startswith("-") and a not in self._option_string_actions]
24
+ if bad_args:
25
+ print(t('error_invalid_args', args=' '.join(bad_args)))
26
+ else:
27
+ print(f"{t('error_invalid_args', args='')}: {message}")
28
+ print(t('run_cmd_help', cmd=cmd))
29
+ sys.exit(1)
30
+
31
+ HELP_TEXT = f"""
32
+ Kite CLI v{__version__} — 模块安装管理工具
33
+
34
+ 用法:
35
+ kite <命令> [参数] [选项]
36
+
37
+ 命令:
38
+ install <source> 安装模块
39
+ uninstall <name> 卸载模块
40
+ update <name> 更新模块(使用安装时记录的来源)
41
+ list 列出已安装的模块
42
+ search <keyword> 搜索可用模块
43
+ info <name> 显示模块详细信息
44
+ log 查看操作日志
45
+ history 查看最近安装的模块
46
+ rollback 回滚最后一次操作
47
+ clean 清理临时文件和缓存
48
+ doctor 检查下载工具状态
49
+ prepare 打包前准备(扫描依赖,生成锁定文件)
50
+ env-check 环境检查(虚拟环境和依赖库)
51
+ venv-setup 创建虚拟环境
52
+ deps-install 安装依赖库
53
+
54
+ 全局选项:
55
+ -h, -H, --help 显示此帮助信息
56
+ -v, -V, --version 显示版本号
57
+
58
+ 安装位置 (-l):
59
+ dev 开发环境,安装到 {{KITE_PROJECT}}/extensions/
60
+ local 本地实例,安装到 {{KITE_INSTANCE_DIR}}/extensions/
61
+ global 全局共享,安装到 {{KITE_MODULES}}(默认 ~/.kite/modules/)
62
+
63
+ 来源平台 (-f):
64
+ pypi 从 PyPI 下载(pip download)
65
+ npm 从 npm 下载(npm pack)
66
+ git 从 Git 仓库克隆
67
+ local 从本地路径复制
68
+
69
+ 详细用法:
70
+
71
+ kite install <source> [选项]
72
+ -l, --location <dev|local|global> 安装位置(未指定则交互选择)
73
+ -f, --from <pypi|npm|git|local> 指定平台(未指定则自动检测所有平台)
74
+ -y, --yes 跳过确认提示
75
+ --no-deps 不安装依赖
76
+
77
+ <source> 可以是:
78
+ - 模块名(如 watchdog-plus)
79
+ - 模块名@版本(如 requests@2.28.0)
80
+ - Git URL(如 https://github.com/user/mod.git)
81
+ - 本地路径(如 ./my-module 或 .)
82
+ - 省略(在模块目录下自动安装当前目录)
83
+
84
+ 示例:
85
+ kite install # 在模块目录下安装当前目录
86
+ kite install watchdog-plus # 自动搜索所有平台
87
+ kite install requests@2.28.0 # 安装指定版本
88
+ kite install watchdog-plus -l global # 安装到全局
89
+ kite install watchdog-plus -f pypi -l global # 指定平台和位置
90
+ kite install https://github.com/user/mod.git -f git
91
+ kite install ./my-module -f local -l dev
92
+ kite install . -l global # 安装当前目录到全局
93
+
94
+ kite uninstall <name> [选项]
95
+ -l, --location <dev|local|global> 指定位置(未指定则自动查找)
96
+ --all 卸载所有位置的同名模块
97
+ -y, --yes 跳过确认提示
98
+
99
+ 示例:
100
+ kite uninstall watchdog-plus
101
+ kite uninstall watchdog-plus -l global
102
+ kite uninstall watchdog-plus --all
103
+
104
+ kite update <name> [选项]
105
+ -l, --location <dev|local|global> 指定位置
106
+ --to <version> 更新到指定版本
107
+ --all 更新所有已安装模块
108
+ -y, --yes 跳过确认提示
109
+
110
+ 示例:
111
+ kite update watchdog-plus
112
+ kite update watchdog-plus --to 2.0.0
113
+ kite update --all
114
+
115
+ kite list [选项]
116
+ -l, --location <dev|local|global> 只显示指定位置
117
+ --all 显示所有位置(默认)
118
+ -v, --verbose 显示详细信息(路径、来源)
119
+
120
+ 示例:
121
+ kite list
122
+ kite list -l global -v
123
+
124
+ kite search <keyword> [选项]
125
+ -f, --from <pypi|npm|git> 只在指定平台搜索
126
+
127
+ 示例:
128
+ kite search watchdog
129
+ kite search backup -f pypi
130
+
131
+ kite info <name> [选项]
132
+ -l, --location <dev|local|global> 指定位置
133
+
134
+ 示例:
135
+ kite info watchdog-plus
136
+ """
137
+
138
+
139
+ def print_help():
140
+ print(HELP_TEXT)
141
+
142
+
143
+ def main():
144
+ # 手动处理 -H / -h / --help / -V / --version,在 argparse 之前
145
+ if len(sys.argv) > 1 and sys.argv[1] in ("-H", "-h", "--help", "help"):
146
+ print_help()
147
+ return 0
148
+
149
+ if len(sys.argv) > 1 and sys.argv[1] in ("-V", "-v", "--version", "version"):
150
+ print(f"kite-cli {__version__}")
151
+ return 0
152
+
153
+ parser = SilentArgumentParser(
154
+ prog="kite",
155
+ description="Kite 模块安装管理工具",
156
+ add_help=False # 禁用默认 help,使用自定义
157
+ )
158
+
159
+ parser.add_argument("-h", "-H", "--help", action="store_true", help="显示帮助信息")
160
+ parser.add_argument("-v", "-V", "--version", action="store_true", help="显示版本号")
161
+
162
+ subparsers = parser.add_subparsers(dest="command", parser_class=SilentArgumentParser)
163
+
164
+ # install 命令
165
+ install_parser = subparsers.add_parser("install", help="安装模块", add_help=True)
166
+ install_parser.add_argument("source", nargs="?", help="模块名或下载源(省略则安装当前目录)")
167
+ install_parser.add_argument("-l", "--location", choices=["dev", "local", "global"], help="安装位置")
168
+ install_parser.add_argument("-f", "--from", dest="from_platform", choices=["pypi", "npm", "git", "local"], help="指定平台")
169
+ install_parser.add_argument("-y", "--yes", action="store_true", help="跳过确认")
170
+ install_parser.add_argument("--no-deps", action="store_true", help="不安装依赖")
171
+
172
+ # uninstall 命令
173
+ uninstall_parser = subparsers.add_parser("uninstall", help="卸载模块", add_help=True)
174
+ uninstall_parser.add_argument("name", help="模块名")
175
+ uninstall_parser.add_argument("-l", "--location", choices=["dev", "local", "global"], help="安装位置")
176
+ uninstall_parser.add_argument("--all", action="store_true", help="卸载所有位置")
177
+ uninstall_parser.add_argument("-y", "--yes", action="store_true", help="跳过确认")
178
+
179
+ # list 命令
180
+ list_parser = subparsers.add_parser("list", help="列出已安装模块", add_help=True)
181
+ list_parser.add_argument("-l", "--location", choices=["dev", "local", "global"], help="筛选位置")
182
+ list_parser.add_argument("--all", action="store_true", help="所有位置")
183
+ list_parser.add_argument("-v", "--verbose", action="store_true", help="详细信息")
184
+
185
+ # search 命令
186
+ search_parser = subparsers.add_parser("search", help="搜索可用模块", add_help=True)
187
+ search_parser.add_argument("keyword", help="搜索关键词")
188
+ search_parser.add_argument("-f", "--from", dest="from_platform", choices=["pypi", "npm", "git"], help="指定平台")
189
+
190
+ # update 命令
191
+ update_parser = subparsers.add_parser("update", help="更新模块", add_help=True)
192
+ update_parser.add_argument("name", nargs="?", help="模块名")
193
+ update_parser.add_argument("-l", "--location", choices=["dev", "local", "global"], help="安装位置")
194
+ update_parser.add_argument("--to", dest="to_version", help="更新到指定版本")
195
+ update_parser.add_argument("--all", action="store_true", help="更新所有模块")
196
+ update_parser.add_argument("-y", "--yes", action="store_true", help="跳过确认")
197
+
198
+ # info 命令
199
+ info_parser = subparsers.add_parser("info", help="显示模块详细信息", add_help=True)
200
+ info_parser.add_argument("name", help="模块名")
201
+ info_parser.add_argument("-l", "--location", choices=["dev", "local", "global"], help="指定位置")
202
+
203
+ # log 命令
204
+ log_parser = subparsers.add_parser("log", help="查看操作日志", add_help=True)
205
+ log_parser.add_argument("-n", "--limit", type=int, default=20, help="显示条数(默认 20)")
206
+ log_parser.add_argument("--path", action="store_true", help="显示日志文件路径")
207
+
208
+ # history 命令
209
+ history_parser = subparsers.add_parser("history", help="查看最近安装的模块", add_help=True)
210
+ history_parser.add_argument("-n", "--limit", type=int, default=6, help="显示条数(默认 6)")
211
+ history_parser.add_argument("--all", action="store_true", help="显示所有记录(包括已卸载)")
212
+
213
+ # rollback 命令
214
+ rollback_parser = subparsers.add_parser("rollback", help="回滚最后一次操作", add_help=True)
215
+ rollback_parser.add_argument("-y", "--yes", action="store_true", help="跳过确认")
216
+
217
+ # clean 命令
218
+ clean_parser = subparsers.add_parser("clean", help="清理临时文件和缓存", add_help=True)
219
+ clean_parser.add_argument("--all", action="store_true", help="清理所有模块依赖环境")
220
+ clean_parser.add_argument("-y", "--yes", action="store_true", help="跳过确认")
221
+
222
+ # doctor 命令
223
+ doctor_parser = subparsers.add_parser("doctor", help="检查下载工具状态", add_help=True)
224
+
225
+ # prepare 命令
226
+ prepare_parser = subparsers.add_parser("prepare", help="打包前准备(扫描依赖)", add_help=True)
227
+
228
+ # env-check 命令
229
+ env_check_parser = subparsers.add_parser("env-check", help="环境检查(虚拟环境和依赖库)", add_help=True)
230
+
231
+ # venv-setup 命令
232
+ venv_setup_parser = subparsers.add_parser("venv-setup", help="创建虚拟环境", add_help=True)
233
+
234
+ # deps-install 命令
235
+ deps_install_parser = subparsers.add_parser("deps-install", help="安装依赖库", add_help=True)
236
+
237
+ args, unknown = parser.parse_known_args()
238
+
239
+ # 处理全局 --help / --version
240
+ if args.help:
241
+ print_help()
242
+ return 0
243
+ if args.version:
244
+ print(f"kite-cli {__version__}")
245
+ return 0
246
+
247
+ # 没有命令 → 显示帮助
248
+ if not args.command:
249
+ # 如果有未知参数,说明用户输入了非法命令
250
+ if unknown:
251
+ bad = " ".join(unknown)
252
+ print(f"错误: 未知命令或参数 '{bad}'")
253
+ print(f"运行 'kite -h' 查看可用命令")
254
+ return 1
255
+ print_help()
256
+ return 0
257
+
258
+ # 子命令有未识别参数
259
+ if unknown:
260
+ bad = " ".join(unknown)
261
+ print(f"错误: 无效参数 '{bad}'")
262
+ print(f"运行 'kite {args.command} --help' 查看用法")
263
+ return 1
264
+
265
+ # 路由到具体命令
266
+ if args.command == "install":
267
+ from kite_cli.commands.install import run_install
268
+ return run_install(args)
269
+ elif args.command == "uninstall":
270
+ from kite_cli.commands.uninstall import run_uninstall
271
+ return run_uninstall(args)
272
+ elif args.command == "list":
273
+ from kite_cli.commands.list import run_list
274
+ return run_list(args)
275
+ elif args.command == "search":
276
+ from kite_cli.commands.search import run_search
277
+ return run_search(args)
278
+ elif args.command == "update":
279
+ from kite_cli.commands.update import run_update
280
+ return run_update(args)
281
+ elif args.command == "info":
282
+ from kite_cli.commands.info import run_info
283
+ return run_info(args)
284
+ elif args.command == "log":
285
+ from kite_cli.commands.log import run_log
286
+ return run_log(args)
287
+ elif args.command == "history":
288
+ from kite_cli.commands.history import run_history
289
+ return run_history(args)
290
+ elif args.command == "rollback":
291
+ from kite_cli.commands.rollback import run_rollback
292
+ return run_rollback(args)
293
+ elif args.command == "clean":
294
+ from kite_cli.commands.clean import run_clean
295
+ return run_clean(args)
296
+ elif args.command == "doctor":
297
+ from kite_cli.commands.doctor import run_doctor
298
+ return run_doctor(args)
299
+ elif args.command == "prepare":
300
+ from kite_cli.commands.prepare import run_prepare
301
+ return run_prepare(args)
302
+ elif args.command == "env-check":
303
+ from kite_cli.commands.env_check import run_env_check
304
+ return run_env_check(args)
305
+ elif args.command == "venv-setup":
306
+ from kite_cli.commands.venv_setup import run_venv_setup
307
+ return run_venv_setup(args)
308
+ elif args.command == "deps-install":
309
+ from kite_cli.commands.deps_install import run_deps_install
310
+ return run_deps_install(args)
311
+ else:
312
+ print(f"未知命令: {args.command}")
313
+ return 1
314
+
315
+
316
+ if __name__ == "__main__":
317
+ sys.exit(main())
@@ -0,0 +1 @@
1
+ """工具函数模块"""
@@ -0,0 +1,252 @@
1
+ """国际化支持 - 根据系统语言自动切换"""
2
+ import os
3
+ import locale
4
+
5
+
6
+ def get_system_language():
7
+ """获取系统语言"""
8
+ try:
9
+ # 尝试从环境变量获取
10
+ lang = os.environ.get('LANG', '')
11
+ if lang:
12
+ return lang.split('.')[0].split('_')[0].lower()
13
+
14
+ # 尝试从 locale 获取
15
+ lang, _ = locale.getdefaultlocale()
16
+ if lang:
17
+ return lang.split('_')[0].lower()
18
+ except Exception:
19
+ pass
20
+
21
+ return 'en'
22
+
23
+
24
+ # 当前语言
25
+ CURRENT_LANG = get_system_language()
26
+
27
+
28
+ # 翻译字典
29
+ TRANSLATIONS = {
30
+ 'en': {
31
+ 'help_title': 'Kite CLI v{version} — Module Installation Manager',
32
+ 'usage': 'Usage',
33
+ 'commands': 'Commands',
34
+ 'global_options': 'Global Options',
35
+ 'install_locations': 'Install Locations',
36
+ 'source_platforms': 'Source Platforms',
37
+ 'detailed_usage': 'Detailed Usage',
38
+ 'examples': 'Examples',
39
+ 'show_help': 'Show this help message',
40
+ 'show_version': 'Show version number',
41
+ 'error_unknown_command': "Error: Unknown command '{cmd}'",
42
+ 'error_invalid_args': "Error: Invalid argument '{args}'",
43
+ 'run_help': "Run 'kite -h' to see available commands",
44
+ 'run_cmd_help': "Run 'kite {cmd} --help' for usage",
45
+ 'searching_module': '[Search] Searching for module: {name}',
46
+ 'module_not_found': '[Error] Module not found: {name}',
47
+ 'select_source': '[Select] Selected source: {platform} - {name}',
48
+ 'downloading': '[Download] Downloading...',
49
+ 'download_complete': '[Done] Download complete: {path}',
50
+ 'download_failed': '[Error] Download failed',
51
+ 'validating': '[Validate] Validating module.md...',
52
+ 'validation_failed': '[Error] Validation failed: {error}',
53
+ 'validation_passed': '[Done] Validation passed: {name} v{version}',
54
+ 'installing_deps': '[Install] Installing dependencies...',
55
+ 'deps_failed': '[Error] Dependency installation failed',
56
+ 'installing_to': '[Install] Installing to: {path}',
57
+ 'install_complete': '[Done] Installation complete!',
58
+ 'restart_hint': '[Info] Restart Kite to load the new module: python main.py',
59
+ 'uninstalling': '[Uninstall] Uninstalling module: {name}',
60
+ 'uninstalled': '[Done] Uninstalled: {location} - {path}',
61
+ 'uninstall_complete': '[Done] Uninstall complete! Uninstalled {count} location(s)',
62
+ 'uninstall_none': '[Error] No modules uninstalled',
63
+ 'installed_modules': '[List] Installed modules:',
64
+ 'total_modules': 'Total {count} module(s)',
65
+ 'no_modules': ' (No installed modules)',
66
+ 'location_dev': 'Development',
67
+ 'location_local': 'Local Instance',
68
+ 'location_global': 'Global Shared',
69
+ 'module_info': '[Info] Module info: {name}',
70
+ 'searching_for': '[Search] Searching for: {keyword}',
71
+ 'found_results': 'Found {count} result(s)',
72
+ 'no_results': ' No modules found',
73
+ 'updating_module': '[Update] Updating module: {name}',
74
+ 'reinstalling': '[Install] Reinstalling {name}...',
75
+ 'skip_deps_warning': '[Warning] Skipping dependency installation (--no-deps)',
76
+ 'no_deps': '[Info] No dependencies to install',
77
+ 'reserved_name_error': "[Error] Cannot install '{name}' as a module",
78
+ 'reserved_name_hint': "[Info] '{name}' is a reserved name for Kite framework",
79
+ 'update_framework_hint': "[Info] To update Kite framework, use: npm update -g @kite/cli",
80
+ 'category_kernel': 'Kernel Modules',
81
+ 'category_builtin': 'Built-in Modules',
82
+ 'category_external': 'External Modules',
83
+ 'type_kernel': 'Kernel',
84
+ 'type_infrastructure': 'Infrastructure',
85
+ 'type_channel': 'Channel',
86
+ 'type_agent': 'Agent',
87
+ 'type_service': 'Service',
88
+ 'type_tool': 'Tool',
89
+ 'stats_breakdown': 'Kernel: {kernel} | Built-in: {builtin} | External: {external}',
90
+ 'info_location_dev': 'Development Environment',
91
+ 'info_location_local': 'Local Instance',
92
+ 'info_location_global': 'Global Shared',
93
+ 'info_path': 'Path',
94
+ 'info_name': 'Name',
95
+ 'info_display_name': 'Display Name',
96
+ 'info_version': 'Version',
97
+ 'info_type': 'Type',
98
+ 'info_runtime': 'Runtime',
99
+ 'info_entry': 'Entry',
100
+ 'info_state': 'State',
101
+ 'info_dependencies': 'Dependencies',
102
+ 'info_install_info': 'Installation Info',
103
+ 'info_source': 'Source',
104
+ 'info_package': 'Package',
105
+ 'info_url': 'URL',
106
+ 'info_installed_at': 'Installed At',
107
+ 'info_no_module_md': '[Warning] module.md not found',
108
+ 'info_parse_failed': '[Warning] Failed to parse module.md',
109
+ 'search_pypi': 'PyPI',
110
+ 'search_npm': 'npm',
111
+ 'search_git': 'Git / GitHub',
112
+ 'search_latest_version': 'Latest Version',
113
+ 'search_available_versions': 'Available Versions',
114
+ 'search_version': 'Version',
115
+ 'update_not_implemented': '[Warning] Update all modules feature not implemented yet',
116
+ 'update_specify_name': '[Error] Please specify module name',
117
+ 'update_not_found': '[Error] Module not found: {name}',
118
+ 'update_no_install_info': '[Error] Installation info not found, cannot update',
119
+ 'update_manual_reinstall': '[Info] Please reinstall manually: kite install {name} -l {location}',
120
+ 'update_incomplete_info': '[Error] Installation info incomplete, cannot update',
121
+ 'update_local_no_auto': '[Error] Locally installed modules cannot be auto-updated',
122
+ 'update_unknown_source': '[Error] Unknown source type: {type}',
123
+ 'update_confirm': 'Confirm update {name} (source: {source})?',
124
+ 'update_cancelled': '[Cancelled] Cancelled',
125
+ 'update_failed': '[Error] Update failed: {error}',
126
+ 'tool_installing': '[Install] {tool} not installed, installing...',
127
+ 'tool_install_success': '[Done] {tool} installed successfully',
128
+ 'tool_install_failed': '[Error] {tool} installation failed',
129
+ 'tool_manual_install': '[Info] Please install {tool} manually',
130
+ 'tool_install_url': '[Info] Visit: {url}',
131
+ 'tool_install_cmd': '[Info] Or use: {cmd}',
132
+ },
133
+ 'zh': {
134
+ 'help_title': 'Kite CLI v{version} — 模块安装管理工具',
135
+ 'usage': '用法',
136
+ 'commands': '命令',
137
+ 'global_options': '全局选项',
138
+ 'install_locations': '安装位置',
139
+ 'source_platforms': '来源平台',
140
+ 'detailed_usage': '详细用法',
141
+ 'examples': '示例',
142
+ 'show_help': '显示此帮助信息',
143
+ 'show_version': '显示版本号',
144
+ 'error_unknown_command': "错误: 未知命令 '{cmd}'",
145
+ 'error_invalid_args': "错误: 无效参数 '{args}'",
146
+ 'run_help': "运行 'kite -h' 查看可用命令",
147
+ 'run_cmd_help': "运行 'kite {cmd} --help' 查看用法",
148
+ 'searching_module': '[搜索] 正在搜索模块: {name}',
149
+ 'module_not_found': '[错误] 未找到模块: {name}',
150
+ 'select_source': '[选择] 选择来源: {platform} - {name}',
151
+ 'downloading': '[下载] 正在下载...',
152
+ 'download_complete': '[完成] 下载完成: {path}',
153
+ 'download_failed': '[错误] 下载失败',
154
+ 'validating': '[验证] 验证 module.md...',
155
+ 'validation_failed': '[错误] 验证失败: {error}',
156
+ 'validation_passed': '[完成] 验证通过: {name} v{version}',
157
+ 'installing_deps': '[安装] 安装依赖...',
158
+ 'deps_failed': '[错误] 依赖安装失败',
159
+ 'installing_to': '[安装] 安装到: {path}',
160
+ 'install_complete': '[完成] 安装完成!',
161
+ 'restart_hint': '[提示] 重启 Kite 以加载新模块: python main.py',
162
+ 'uninstalling': '[卸载] 卸载模块: {name}',
163
+ 'uninstalled': '[完成] 已卸载: {location} - {path}',
164
+ 'uninstall_complete': '[完成] 卸载完成!共卸载 {count} 个位置',
165
+ 'uninstall_none': '[错误] 未卸载任何模块',
166
+ 'installed_modules': '[列表] 已安装的模块:',
167
+ 'total_modules': '共 {count} 个模块',
168
+ 'no_modules': ' (无已安装模块)',
169
+ 'location_dev': '开发环境',
170
+ 'location_local': '本地实例',
171
+ 'location_global': '全局共享',
172
+ 'module_info': '[信息] 模块信息: {name}',
173
+ 'searching_for': '[搜索] 搜索模块: {keyword}',
174
+ 'found_results': '共找到 {count} 个结果',
175
+ 'no_results': ' 未找到相关模块',
176
+ 'updating_module': '[更新] 更新模块: {name}',
177
+ 'reinstalling': '[安装] 重新安装 {name}...',
178
+ 'skip_deps_warning': '[警告] 跳过依赖安装 (--no-deps)',
179
+ 'no_deps': '[提示] 无依赖需要安装',
180
+ 'reserved_name_error': "[错误] 不能将 '{name}' 作为模块安装",
181
+ 'reserved_name_hint': "[提示] '{name}' 是 Kite 框架的保留名称",
182
+ 'update_framework_hint': "[提示] 如需更新 Kite 框架,请使用: npm update -g @kite/cli",
183
+ 'category_kernel': '内核模块',
184
+ 'category_builtin': '内置模块',
185
+ 'category_external': '外置模块',
186
+ 'type_kernel': '核心',
187
+ 'type_infrastructure': '基础',
188
+ 'type_channel': '通道',
189
+ 'type_agent': '代理',
190
+ 'type_service': '服务',
191
+ 'type_tool': '工具',
192
+ 'stats_breakdown': '内核: {kernel} | 内置: {builtin} | 外置: {external}',
193
+ 'info_location_dev': '开发环境',
194
+ 'info_location_local': '本地实例',
195
+ 'info_location_global': '全局共享',
196
+ 'info_path': '路径',
197
+ 'info_name': '名称',
198
+ 'info_display_name': '显示名',
199
+ 'info_version': '版本',
200
+ 'info_type': '类型',
201
+ 'info_runtime': '运行时',
202
+ 'info_entry': '入口',
203
+ 'info_state': '状态',
204
+ 'info_dependencies': '依赖',
205
+ 'info_install_info': '安装信息',
206
+ 'info_source': '来源',
207
+ 'info_package': '包名',
208
+ 'info_url': 'URL',
209
+ 'info_installed_at': '安装时间',
210
+ 'info_no_module_md': '[警告] 未找到 module.md',
211
+ 'info_parse_failed': '[警告] 无法解析 module.md',
212
+ 'search_pypi': 'PyPI',
213
+ 'search_npm': 'npm',
214
+ 'search_git': 'Git / GitHub',
215
+ 'search_latest_version': '最新版本',
216
+ 'search_available_versions': '可用版本',
217
+ 'search_version': '版本',
218
+ 'update_not_implemented': '[警告] 更新所有模块功能尚未实现',
219
+ 'update_specify_name': '[错误] 请指定模块名',
220
+ 'update_not_found': '[错误] 未找到模块: {name}',
221
+ 'update_no_install_info': '[错误] 未找到安装信息,无法更新',
222
+ 'update_manual_reinstall': '[提示] 请手动重新安装: kite install {name} -l {location}',
223
+ 'update_incomplete_info': '[错误] 安装信息不完整,无法更新',
224
+ 'update_local_no_auto': '[错误] 本地安装的模块无法自动更新',
225
+ 'update_unknown_source': '[错误] 未知的来源类型: {type}',
226
+ 'update_confirm': '确认更新 {name} (来源: {source})?',
227
+ 'update_cancelled': '[取消] 已取消',
228
+ 'update_failed': '[错误] 更新失败: {error}',
229
+ 'tool_installing': '[安装] {tool} 未安装,正在安装...',
230
+ 'tool_install_success': '[完成] {tool} 安装成功',
231
+ 'tool_install_failed': '[错误] {tool} 安装失败',
232
+ 'tool_manual_install': '[提示] 请手动安装 {tool}',
233
+ 'tool_install_url': '[提示] 访问: {url}',
234
+ 'tool_install_cmd': '[提示] 或使用: {cmd}',
235
+ }
236
+ }
237
+
238
+
239
+ def t(key, **kwargs):
240
+ """翻译函数"""
241
+ lang = CURRENT_LANG if CURRENT_LANG in TRANSLATIONS else 'en'
242
+ text = TRANSLATIONS[lang].get(key, TRANSLATIONS['en'].get(key, key))
243
+ if kwargs:
244
+ return text.format(**kwargs)
245
+ return text
246
+
247
+
248
+ def set_language(lang):
249
+ """手动设置语言"""
250
+ global CURRENT_LANG
251
+ if lang in TRANSLATIONS:
252
+ CURRENT_LANG = lang
@@ -0,0 +1,63 @@
1
+ """交互式问答工具"""
2
+
3
+
4
+ def select_source(candidates: list) -> dict:
5
+ """让用户选择来源"""
6
+ print("\n找到多个来源:")
7
+ for i, candidate in enumerate(candidates, 1):
8
+ platform = candidate["platform"]
9
+ name = candidate.get("name", "")
10
+ version = candidate.get("latest", candidate.get("version", ""))
11
+ desc = candidate.get("description", "")
12
+
13
+ if platform == "pypi":
14
+ print(f" [{i}] PyPI: {name} v{version}")
15
+ elif platform == "npm":
16
+ print(f" [{i}] npm: {name} v{version}")
17
+ elif platform == "git":
18
+ full_name = candidate.get("full_name", name)
19
+ print(f" [{i}] Git: {full_name}")
20
+ if desc:
21
+ print(f" {desc}")
22
+ elif platform == "local":
23
+ print(f" [{i}] 本地: {candidate.get('path', '')}")
24
+
25
+ while True:
26
+ try:
27
+ choice = input("\n? 选择来源 [1]: ").strip() or "1"
28
+ index = int(choice) - 1
29
+ if 0 <= index < len(candidates):
30
+ return candidates[index]
31
+ print("无效选择,请重试")
32
+ except (ValueError, KeyboardInterrupt):
33
+ return None
34
+
35
+
36
+ def select_location() -> str:
37
+ """让用户选择安装位置"""
38
+ print("\n? 选择安装位置:")
39
+ print(" [1] 开发环境 (Kite/extensions/) — 用于模块开发")
40
+ print(" [2] 本地实例 (~/.kite/workspace/Kite/extensions/) — 当前实例专用")
41
+ print(" [3] 全局共享 (~/.kite/modules/) — 所有实例共享")
42
+
43
+ while True:
44
+ try:
45
+ choice = input("\n选择 [3]: ").strip() or "3"
46
+ if choice == "1":
47
+ return "dev"
48
+ elif choice == "2":
49
+ return "local"
50
+ elif choice == "3":
51
+ return "global"
52
+ print("无效选择,请重试")
53
+ except KeyboardInterrupt:
54
+ return None
55
+
56
+
57
+ def confirm_action(message: str) -> bool:
58
+ """确认操作"""
59
+ try:
60
+ answer = input(f"{message} [y/N]: ").strip().lower()
61
+ return answer in ("y", "yes")
62
+ except KeyboardInterrupt:
63
+ return False