@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.
- package/CHANGELOG.md +302 -0
- package/cli.js +119 -4
- package/core/dependency_checker.py +250 -0
- package/core/env_checker.py +490 -0
- package/dependencies_lock.json +128 -0
- package/extensions/agents/assistant/entry.py +111 -1
- package/extensions/agents/assistant/server.py +279 -215
- package/extensions/channels/acp_channel/entry.py +111 -1
- package/extensions/channels/acp_channel/module.md +23 -22
- package/extensions/channels/acp_channel/server.py +279 -215
- package/extensions/event_hub_bench/entry.py +107 -1
- package/extensions/services/backup/entry.py +306 -21
- package/extensions/services/backup/module.md +24 -22
- package/extensions/services/evol/auth_manager.py +443 -0
- package/extensions/services/evol/config.yaml +149 -0
- package/extensions/services/evol/config_loader.py +117 -0
- package/extensions/services/evol/entry.py +406 -0
- package/extensions/services/evol/evol_api.py +173 -0
- package/extensions/services/evol/evol_config.json5 +29 -0
- package/extensions/services/evol/migrate_tokens.py +122 -0
- package/extensions/services/evol/module.md +32 -0
- package/extensions/services/evol/pairing.py +250 -0
- package/extensions/services/evol/pairing_codes.jsonl +1 -0
- package/extensions/services/evol/relay.py +682 -0
- package/extensions/services/evol/relay_config.json5 +67 -0
- package/extensions/services/evol/routes/__init__.py +1 -0
- package/extensions/services/evol/routes/routes_management_ws.py +127 -0
- package/extensions/services/evol/routes/routes_rpc.py +89 -0
- package/extensions/services/evol/routes/routes_test.py +61 -0
- package/extensions/services/evol/server.py +875 -0
- package/extensions/services/evol/static/css/style.css +1200 -0
- package/extensions/services/evol/static/index.html +781 -0
- package/extensions/services/evol/static/index_evol.html +14 -0
- package/extensions/services/evol/static/js/app.js +6304 -0
- package/extensions/services/evol/static/js/auth.js +326 -0
- package/extensions/services/evol/static/js/dialog.js +285 -0
- package/extensions/services/evol/static/js/evol-app-fixed.js +50 -0
- package/extensions/services/evol/static/js/evol-app.js +1949 -0
- package/extensions/services/evol/static/js/evol-app.js.bak +1800 -0
- package/extensions/services/evol/static/js/kernel-client-example.js +228 -0
- package/extensions/services/evol/static/js/kernel-client.js +396 -0
- package/extensions/services/evol/static/js/main.js +141 -0
- package/extensions/services/evol/static/js/registry-tests.js +585 -0
- package/extensions/services/evol/static/js/stats.js +217 -0
- package/extensions/services/evol/static/js/token-manager.js +175 -0
- package/extensions/services/evol/static/pairing.html +248 -0
- package/extensions/services/evol/static/test_registry.html +262 -0
- package/extensions/services/evol/static/test_relay.html +462 -0
- package/extensions/services/evol/stats_manager.py +240 -0
- package/extensions/services/model_service/entry.py +167 -19
- package/extensions/services/model_service/module.md +21 -22
- package/extensions/services/proxy/.claude/settings.local.json +13 -0
- package/extensions/services/proxy/CHANGELOG_20260308.md +258 -0
- package/extensions/services/proxy/_fix_prints.py +133 -0
- package/extensions/services/proxy/_fix_prints2.py +87 -0
- package/extensions/services/proxy/agentcp/LICENCE +178 -0
- package/extensions/services/proxy/agentcp/README copy.md +85 -0
- package/extensions/services/proxy/agentcp/README.md +260 -0
- package/extensions/services/proxy/agentcp/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/agent.py +4 -0
- package/extensions/services/proxy/agentcp/agentcp.py +2494 -0
- package/extensions/services/proxy/agentcp/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/ap/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/ap/ap_client.py +316 -0
- package/extensions/services/proxy/agentcp/assets/images/wechat_qr.png +0 -0
- package/extensions/services/proxy/agentcp/backup/metrics.json +31 -0
- package/extensions/services/proxy/agentcp/base/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/base/auth_client.py +257 -0
- package/extensions/services/proxy/agentcp/base/client.py +112 -0
- package/extensions/services/proxy/agentcp/base/env.py +34 -0
- package/extensions/services/proxy/agentcp/base/html_util.py +336 -0
- package/extensions/services/proxy/agentcp/base/log.py +98 -0
- package/extensions/services/proxy/agentcp/ca/__init__.py +17 -0
- package/extensions/services/proxy/agentcp/ca/ca_client.py +414 -0
- package/extensions/services/proxy/agentcp/ca/ca_root.py +74 -0
- package/extensions/services/proxy/agentcp/context/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/context/context.py +73 -0
- package/extensions/services/proxy/agentcp/context/exceptions.py +114 -0
- package/extensions/services/proxy/agentcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/create_profile_weather.py +125 -0
- package/extensions/services/proxy/agentcp/db/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/db/db_mananger.py +550 -0
- package/extensions/services/proxy/agentcp/docs/UDP_HEARTBEAT_FIX_REPORT.md +265 -0
- package/extensions/services/proxy/agentcp/docs/heartbeat_issue_analysis.md +291 -0
- package/extensions/services/proxy/agentcp/file/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/file/file_client.py +141 -0
- package/extensions/services/proxy/agentcp/file/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/hcp.py +299 -0
- package/extensions/services/proxy/agentcp/heartbeat/__init__.py +16 -0
- package/extensions/services/proxy/agentcp/heartbeat/heartbeat_client.py +360 -0
- package/extensions/services/proxy/agentcp/improved_scheduler.py +498 -0
- package/extensions/services/proxy/agentcp/llm_agent_utils.py +249 -0
- package/extensions/services/proxy/agentcp/llm_server.py +172 -0
- package/extensions/services/proxy/agentcp/mermaid.py +210 -0
- package/extensions/services/proxy/agentcp/message.py +149 -0
- package/extensions/services/proxy/agentcp/metrics.py +256 -0
- package/extensions/services/proxy/agentcp/monitoring/__init__.py +20 -0
- package/extensions/services/proxy/agentcp/monitoring/global_monitor.py +27 -0
- package/extensions/services/proxy/agentcp/monitoring/metrics_store.py +325 -0
- package/extensions/services/proxy/agentcp/monitoring/monitoring_service.py +269 -0
- package/extensions/services/proxy/agentcp/monitoring/sliding_window.py +222 -0
- package/extensions/services/proxy/agentcp/monitoring/standalone_reader.py +224 -0
- package/extensions/services/proxy/agentcp/msg/__init__.py +21 -0
- package/extensions/services/proxy/agentcp/msg/connection_manager.py +456 -0
- package/extensions/services/proxy/agentcp/msg/message_client.py +2058 -0
- package/extensions/services/proxy/agentcp/msg/message_serialize.py +263 -0
- package/extensions/services/proxy/agentcp/msg/open_ai_message.py +88 -0
- package/extensions/services/proxy/agentcp/msg/session_manager.py +1062 -0
- package/extensions/services/proxy/agentcp/msg/stream_client.py +267 -0
- package/extensions/services/proxy/agentcp/msg/websocket_file_receiver.py +89 -0
- package/extensions/services/proxy/agentcp/msg/ws_logger.py +685 -0
- package/extensions/services/proxy/agentcp/msg/wss_binary_message.py +137 -0
- package/extensions/services/proxy/agentcp/requirements.txt +7 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/README.md +37 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/agent_graph/main.py +164 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/create_profile.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/env.json +5 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/llm/main.py +146 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/main.py +123 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/readme.md +379 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/search/main.py +28 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/create_profile.py +129 -0
- package/extensions/services/proxy/agentcp/samples/agent_use/tool/main.py +20 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/README.md +97 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/amap_agent.py +88 -0
- package/extensions/services/proxy/agentcp/samples/ali_amap/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/powershell.py +228 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/software.py +63 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/agent/tools.py +36 -0
- package/extensions/services/proxy/agentcp/samples/compute_agent/browser_user.py +41 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/README.md +79 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/deepseek/deepseek.py +42 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_chat/dify_chat.py +47 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/README.md +78 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/dify_workflow/dify_workflow.py +46 -0
- package/extensions/services/proxy/agentcp/samples/executor/README.md +44 -0
- package/extensions/services/proxy/agentcp/samples/executor/agentprofile.json +89 -0
- package/extensions/services/proxy/agentcp/samples/executor/create_profile.py +139 -0
- package/extensions/services/proxy/agentcp/samples/executor/main.py +160 -0
- package/extensions/services/proxy/agentcp/samples/filereader/README.md +45 -0
- package/extensions/services/proxy/agentcp/samples/filereader/agentprofile.json +90 -0
- package/extensions/services/proxy/agentcp/samples/filereader/create_profile.py +137 -0
- package/extensions/services/proxy/agentcp/samples/filereader/main.py +253 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/README.md +38 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/agentprofile.json +91 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/create_profile.py +138 -0
- package/extensions/services/proxy/agentcp/samples/filewriter/main.py +289 -0
- package/extensions/services/proxy/agentcp/samples/hcp/README.md +85 -0
- package/extensions/services/proxy/agentcp/samples/hcp/acp_weather_agent.zip +0 -0
- package/extensions/services/proxy/agentcp/samples/hcp/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/hcp/hcp.py +237 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/README.md +68 -0
- package/extensions/services/proxy/agentcp/samples/helloworld/hello_world.py +40 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/MEADME.md +117 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/llm_agent/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/README.md +90 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/local_llm_agent/main.py +49 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/README.md +55 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_llm_from_agent/main.py +23 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/README.md +103 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_api_agent/main.py +69 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/README.md +58 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/query_weather_from_agent/main.py +25 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/README.md +71 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3/qwen3.py +37 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/README.md +133 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/create_profile.py +126 -0
- package/extensions/services/proxy/agentcp/samples/qwen3_tools/qwen3_tools.py +98 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_qwen.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/create_profile_search.py +125 -0
- package/extensions/services/proxy/agentcp/samples/search/qwen_agent.py +136 -0
- package/extensions/services/proxy/agentcp/samples/search/search_agent.py +170 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/README.md +89 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/create_profile.py +125 -0
- package/extensions/services/proxy/agentcp/samples/wrapper_agently_to_agent/main.py +44 -0
- package/extensions/services/proxy/agentcp/utils/__init__.py +15 -0
- package/extensions/services/proxy/agentcp/utils/file_util.py +117 -0
- package/extensions/services/proxy/agentcp/utils/proxy_bypass.py +99 -0
- package/extensions/services/proxy/agentcp/workflow.py +203 -0
- package/extensions/services/proxy/console_auth.py +109 -0
- package/extensions/services/proxy/evol/__init__.py +1 -0
- package/extensions/services/proxy/evol/config.py +37 -0
- package/extensions/services/proxy/evol/http/__init__.py +1 -0
- package/extensions/services/proxy/evol/http/async_http.py +551 -0
- package/extensions/services/proxy/evol/log.py +28 -0
- package/extensions/services/proxy/evol/presenter/__init__.py +2 -0
- package/extensions/services/proxy/evol/presenter/agentIdPresenter.py +1031 -0
- package/extensions/services/proxy/evol/presenter/apikeyPresenter.py +106 -0
- package/extensions/services/proxy/evol/presenter/configPresenter.py +1281 -0
- package/extensions/services/proxy/evol/presenter/userPresenter.py +477 -0
- package/extensions/services/proxy/evol/server/__init__.py +1 -0
- package/extensions/services/proxy/evol/server/claude_proxy_async.py +3430 -0
- package/extensions/services/proxy/evol/server/openclaw_proxy.py +1861 -0
- package/extensions/services/proxy/evol/server/proxy_config.py +15 -0
- package/extensions/services/proxy/evol/server/proxy_engine.py +501 -0
- package/extensions/services/proxy/evol/version.py +24 -0
- package/extensions/services/proxy/logs/websocket.log +260 -0
- package/extensions/services/proxy/main.py +240 -0
- package/extensions/services/proxy/requirements.txt +13 -0
- package/extensions/services/proxy/server.py +271 -0
- package/extensions/services/watchdog/entry.py +215 -26
- package/extensions/services/watchdog/module.md +1 -0
- package/extensions/services/watchdog/monitor.py +178 -38
- package/extensions/services/web/WEBSOCKET_STATUS.md +143 -0
- package/extensions/services/web/config_example.py +35 -0
- package/extensions/services/web/config_loader.py +110 -0
- package/extensions/services/web/entry.py +114 -26
- package/extensions/services/web/module.md +35 -24
- package/extensions/services/web/pairing.py +250 -0
- package/extensions/services/web/pairing_codes.jsonl +16 -0
- package/extensions/services/web/relay.py +643 -0
- package/extensions/services/web/relay_config.json5 +67 -0
- package/extensions/services/web/routes/routes_management_ws.py +127 -0
- package/extensions/services/web/routes/routes_rpc.py +89 -0
- package/extensions/services/web/routes/routes_test.py +61 -0
- package/extensions/services/web/routes/schemas.py +0 -22
- package/extensions/services/web/server.py +434 -99
- package/extensions/services/web/static/css/style.css +67 -28
- package/extensions/services/web/static/index.html +234 -44
- package/extensions/services/web/static/js/app.js +1335 -48
- package/extensions/services/web/static/js/kernel-client-example.js +161 -0
- package/extensions/services/web/static/js/kernel-client.js +383 -0
- package/extensions/services/web/static/js/registry-tests.js +558 -0
- package/extensions/services/web/static/js/token-manager.js +175 -0
- package/extensions/services/web/static/pairing.html +248 -0
- package/extensions/services/web/static/test_registry.html +262 -0
- package/extensions/services/web/web_config.json5 +29 -0
- package/kernel/entry.py +120 -32
- package/kernel/event_hub.py +141 -16
- package/kernel/module.md +60 -33
- package/kernel/registry_store.py +45 -36
- package/kernel/rpc_router.py +152 -59
- package/kernel/server.py +322 -26
- package/kite_cli/__init__.py +3 -0
- package/kite_cli/__main__.py +5 -0
- package/kite_cli/commands/__init__.py +1 -0
- package/kite_cli/commands/clean.py +101 -0
- package/kite_cli/commands/deps_install.py +67 -0
- package/kite_cli/commands/doctor.py +35 -0
- package/kite_cli/commands/env_check.py +45 -0
- package/kite_cli/commands/history.py +111 -0
- package/kite_cli/commands/info.py +96 -0
- package/kite_cli/commands/install.py +313 -0
- package/kite_cli/commands/list.py +143 -0
- package/kite_cli/commands/log.py +81 -0
- package/kite_cli/commands/prepare.py +49 -0
- package/kite_cli/commands/rollback.py +88 -0
- package/kite_cli/commands/search.py +73 -0
- package/kite_cli/commands/uninstall.py +85 -0
- package/kite_cli/commands/update.py +118 -0
- package/kite_cli/commands/venv_setup.py +56 -0
- package/kite_cli/core/__init__.py +1 -0
- package/kite_cli/core/checker.py +142 -0
- package/kite_cli/core/dependency.py +229 -0
- package/kite_cli/core/downloader.py +209 -0
- package/kite_cli/core/install_info.py +40 -0
- package/kite_cli/core/tool_installer.py +397 -0
- package/kite_cli/core/validator.py +78 -0
- package/kite_cli/main.py +317 -0
- package/kite_cli/utils/__init__.py +1 -0
- package/kite_cli/utils/i18n.py +252 -0
- package/kite_cli/utils/interactive.py +63 -0
- package/kite_cli/utils/operation_log.py +77 -0
- package/kite_cli/utils/paths.py +34 -0
- package/kite_cli/utils/version.py +308 -0
- package/launcher/entry.py +1124 -178
- package/launcher/logging_setup.py +104 -0
- package/launcher/module.md +46 -37
- package/launcher/module_scanner.py +11 -1
- package/main.py +4 -1
- package/package.json +9 -1
- package/python_version.json +4 -0
- package/requirements.txt +38 -0
- package/scripts/env-manager.js +328 -0
- package/scripts/plan_manager.py +315 -0
- package/scripts/python-env.js +79 -0
- package/scripts/scan_dependencies.py +461 -0
- package/scripts/setup-python-env.js +191 -0
- package/extensions/services/web/routes/routes_modules.py +0 -249
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""list 命令实现 - 列出启动器能找到的所有模块"""
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from kite_cli.utils.i18n import t
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def run_list(args):
|
|
9
|
+
"""执行列表命令 - 使用启动器的模块扫描器"""
|
|
10
|
+
verbose = args.verbose
|
|
11
|
+
|
|
12
|
+
# 确保环境变量设置
|
|
13
|
+
if "KITE_PROJECT" not in os.environ:
|
|
14
|
+
# 尝试从当前目录推断
|
|
15
|
+
cwd = Path.cwd()
|
|
16
|
+
if (cwd / "launcher").exists() and (cwd / "kernel").exists():
|
|
17
|
+
os.environ["KITE_PROJECT"] = str(cwd)
|
|
18
|
+
else:
|
|
19
|
+
print("[Error] 错误: 未找到 KITE_PROJECT 环境变量")
|
|
20
|
+
print("[Info] 请在 Kite 项目目录下运行此命令")
|
|
21
|
+
return 1
|
|
22
|
+
|
|
23
|
+
# 导入启动器的模块扫描器
|
|
24
|
+
project_root = Path(os.environ["KITE_PROJECT"])
|
|
25
|
+
launcher_path = project_root / "launcher"
|
|
26
|
+
|
|
27
|
+
if not launcher_path.exists():
|
|
28
|
+
print(f"[Error] 错误: 未找到 launcher 目录: {launcher_path}")
|
|
29
|
+
return 1
|
|
30
|
+
|
|
31
|
+
# 添加到 sys.path
|
|
32
|
+
if str(launcher_path.parent) not in sys.path:
|
|
33
|
+
sys.path.insert(0, str(launcher_path.parent))
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from launcher.module_scanner import ModuleScanner
|
|
37
|
+
except ImportError as e:
|
|
38
|
+
print(f"[Error] 错误: 无法导入 ModuleScanner: {e}")
|
|
39
|
+
return 1
|
|
40
|
+
|
|
41
|
+
# 读取 discovery 配置(如果存在)
|
|
42
|
+
discovery = {}
|
|
43
|
+
discovery_file = launcher_path / "discovery.yaml"
|
|
44
|
+
if discovery_file.exists():
|
|
45
|
+
try:
|
|
46
|
+
import yaml
|
|
47
|
+
with open(discovery_file, "r", encoding="utf-8") as f:
|
|
48
|
+
discovery = yaml.safe_load(f) or {}
|
|
49
|
+
except Exception as e:
|
|
50
|
+
print(f"[Warning] 警告: 无法读取 discovery.yaml: {e}")
|
|
51
|
+
|
|
52
|
+
# 扫描模块
|
|
53
|
+
scanner = ModuleScanner(discovery=discovery, launcher_dir=str(launcher_path))
|
|
54
|
+
modules = scanner.scan()
|
|
55
|
+
|
|
56
|
+
# 手动添加 kernel 模块(ModuleScanner 不扫描 kernel 目录本身)
|
|
57
|
+
kernel_dir_path = project_root / "kernel"
|
|
58
|
+
kernel_module_md = kernel_dir_path / "module.md"
|
|
59
|
+
if kernel_module_md.exists():
|
|
60
|
+
try:
|
|
61
|
+
kernel_info = scanner._try_load(str(kernel_dir_path))
|
|
62
|
+
if kernel_info and kernel_info.name not in modules:
|
|
63
|
+
modules[kernel_info.name] = kernel_info
|
|
64
|
+
except Exception as e:
|
|
65
|
+
print(f"[Warning] 警告: 无法加载 kernel 模块: {e}")
|
|
66
|
+
|
|
67
|
+
if not modules:
|
|
68
|
+
print(t('no_modules'))
|
|
69
|
+
return 0
|
|
70
|
+
|
|
71
|
+
# 分类模块
|
|
72
|
+
kernel_modules = []
|
|
73
|
+
builtin_modules = []
|
|
74
|
+
external_modules = []
|
|
75
|
+
|
|
76
|
+
extensions_dir = project_root / "extensions"
|
|
77
|
+
kernel_dir = project_root / "kernel"
|
|
78
|
+
|
|
79
|
+
for name, info in modules.items():
|
|
80
|
+
module_path = Path(info.module_dir)
|
|
81
|
+
|
|
82
|
+
# 判断模块类型
|
|
83
|
+
# 1. kernel 目录下的模块 = 内核模块
|
|
84
|
+
if module_path.parent == kernel_dir or name == "kernel":
|
|
85
|
+
kernel_modules.append((name, info))
|
|
86
|
+
# 2. extensions 目录下的模块 = 内置模块
|
|
87
|
+
elif module_path.is_relative_to(extensions_dir):
|
|
88
|
+
builtin_modules.append((name, info))
|
|
89
|
+
# 3. 其他位置的模块 = 外置模块
|
|
90
|
+
else:
|
|
91
|
+
external_modules.append((name, info))
|
|
92
|
+
|
|
93
|
+
# 显示结果
|
|
94
|
+
print(t('installed_modules') + "\n")
|
|
95
|
+
|
|
96
|
+
if kernel_modules:
|
|
97
|
+
print(f"【{t('category_kernel')}】")
|
|
98
|
+
for name, info in sorted(kernel_modules, key=lambda x: x[0]):
|
|
99
|
+
_print_module(name, info, verbose)
|
|
100
|
+
print()
|
|
101
|
+
|
|
102
|
+
if builtin_modules:
|
|
103
|
+
print(f"【{t('category_builtin')}】")
|
|
104
|
+
for name, info in sorted(builtin_modules, key=lambda x: x[0]):
|
|
105
|
+
_print_module(name, info, verbose)
|
|
106
|
+
print()
|
|
107
|
+
|
|
108
|
+
if external_modules:
|
|
109
|
+
print(f"【{t('category_external')}】")
|
|
110
|
+
for name, info in sorted(external_modules, key=lambda x: x[0]):
|
|
111
|
+
_print_module(name, info, verbose)
|
|
112
|
+
print()
|
|
113
|
+
|
|
114
|
+
total = len(modules)
|
|
115
|
+
print(t('total_modules', count=total))
|
|
116
|
+
print(t('stats_breakdown', kernel=len(kernel_modules), builtin=len(builtin_modules), external=len(external_modules)))
|
|
117
|
+
|
|
118
|
+
return 0
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _print_module(name, info, verbose):
|
|
122
|
+
"""打印单个模块信息"""
|
|
123
|
+
display_name = info.display_name or name
|
|
124
|
+
version = info.version or "unknown"
|
|
125
|
+
state_icon = "✓" if info.state == "enabled" else "○"
|
|
126
|
+
|
|
127
|
+
if verbose:
|
|
128
|
+
print(f" {state_icon} {display_name} (v{version})")
|
|
129
|
+
print(f" 名称: {name}")
|
|
130
|
+
print(f" 类型: {info.type}")
|
|
131
|
+
print(f" 状态: {info.state}")
|
|
132
|
+
print(f" 运行时: {info.runtime}")
|
|
133
|
+
print(f" 入口: {info.entry}")
|
|
134
|
+
print(f" 路径: {info.module_dir}")
|
|
135
|
+
if info.depends_on:
|
|
136
|
+
print(f" 依赖: {', '.join(info.depends_on)}")
|
|
137
|
+
print()
|
|
138
|
+
else:
|
|
139
|
+
# 类型标签国际化
|
|
140
|
+
type_key = f"type_{info.type}"
|
|
141
|
+
type_label = t(type_key) if type_key in ['type_kernel', 'type_infrastructure', 'type_channel', 'type_agent', 'type_service', 'type_tool'] else info.type
|
|
142
|
+
type_badge = f"[{type_label}]"
|
|
143
|
+
print(f" {state_icon} {display_name} (v{version}) {type_badge}")
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""log 命令实现 - 查看操作日志"""
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from kite_cli.utils.operation_log import read_operations, get_log_file
|
|
4
|
+
from kite_cli.utils.i18n import t
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def run_log(args):
|
|
8
|
+
"""执行日志查看命令"""
|
|
9
|
+
limit = args.limit if hasattr(args, 'limit') else 20
|
|
10
|
+
show_path = args.path if hasattr(args, 'path') else False
|
|
11
|
+
|
|
12
|
+
if show_path:
|
|
13
|
+
# 显示日志文件路径
|
|
14
|
+
log_file = get_log_file()
|
|
15
|
+
print(f"[Info] 日志文件路径: {log_file}")
|
|
16
|
+
return 0
|
|
17
|
+
|
|
18
|
+
# 读取操作日志
|
|
19
|
+
operations = read_operations(limit=limit)
|
|
20
|
+
|
|
21
|
+
if not operations:
|
|
22
|
+
print("[Info] 暂无操作记录")
|
|
23
|
+
return 0
|
|
24
|
+
|
|
25
|
+
print(f"[Log] 最近 {len(operations)} 条操作记录:\n")
|
|
26
|
+
|
|
27
|
+
for op in operations:
|
|
28
|
+
timestamp = op.get("timestamp", "unknown")
|
|
29
|
+
operation = op.get("operation", "unknown")
|
|
30
|
+
success = op.get("success", True)
|
|
31
|
+
details = op.get("details", {})
|
|
32
|
+
error = op.get("error")
|
|
33
|
+
|
|
34
|
+
# 格式化时间戳
|
|
35
|
+
try:
|
|
36
|
+
dt = datetime.fromisoformat(timestamp.replace('Z', '+00:00'))
|
|
37
|
+
time_str = dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
38
|
+
except Exception:
|
|
39
|
+
time_str = timestamp
|
|
40
|
+
|
|
41
|
+
# 状态标记
|
|
42
|
+
status = "[Done]" if success else "[Error]"
|
|
43
|
+
|
|
44
|
+
# 操作类型
|
|
45
|
+
if operation == "install":
|
|
46
|
+
module = details.get("module", "unknown")
|
|
47
|
+
version = details.get("version", "")
|
|
48
|
+
location = details.get("location", "")
|
|
49
|
+
print(f"{time_str} {status} install {module} v{version} -> {location}")
|
|
50
|
+
if error:
|
|
51
|
+
print(f" 错误: {error}")
|
|
52
|
+
|
|
53
|
+
elif operation == "uninstall":
|
|
54
|
+
module = details.get("module", "unknown")
|
|
55
|
+
locations = details.get("locations", [])
|
|
56
|
+
if locations:
|
|
57
|
+
loc_str = ", ".join([l["location"] for l in locations])
|
|
58
|
+
print(f"{time_str} {status} uninstall {module} from {loc_str}")
|
|
59
|
+
else:
|
|
60
|
+
print(f"{time_str} {status} uninstall {module}")
|
|
61
|
+
if error:
|
|
62
|
+
print(f" 错误: {error}")
|
|
63
|
+
|
|
64
|
+
elif operation == "update":
|
|
65
|
+
module = details.get("module", "unknown")
|
|
66
|
+
print(f"{time_str} {status} update {module}")
|
|
67
|
+
if error:
|
|
68
|
+
print(f" 错误: {error}")
|
|
69
|
+
|
|
70
|
+
elif operation == "clean":
|
|
71
|
+
cleaned = details.get("cleaned", [])
|
|
72
|
+
print(f"{time_str} {status} clean ({len(cleaned)} items)")
|
|
73
|
+
|
|
74
|
+
else:
|
|
75
|
+
print(f"{time_str} {status} {operation}")
|
|
76
|
+
if error:
|
|
77
|
+
print(f" 错误: {error}")
|
|
78
|
+
|
|
79
|
+
print()
|
|
80
|
+
|
|
81
|
+
return 0
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
kite prepare 命令
|
|
3
|
+
|
|
4
|
+
打包前的准备工作:
|
|
5
|
+
1. 扫描所有模块的依赖
|
|
6
|
+
2. 生成 dependencies_lock.json
|
|
7
|
+
3. 更新 python_version.json
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def run_prepare(args):
|
|
15
|
+
"""执行打包准备"""
|
|
16
|
+
# 导入扫描脚本
|
|
17
|
+
project_root = Path(__file__).parent.parent.parent
|
|
18
|
+
|
|
19
|
+
# 添加到 sys.path
|
|
20
|
+
sys.path.insert(0, str(project_root))
|
|
21
|
+
|
|
22
|
+
# 导入并执行扫描
|
|
23
|
+
from scripts.scan_dependencies import main as scan_main
|
|
24
|
+
|
|
25
|
+
print("=" * 60)
|
|
26
|
+
print(" Kite 打包准备")
|
|
27
|
+
print("=" * 60)
|
|
28
|
+
print()
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
scan_main()
|
|
32
|
+
print()
|
|
33
|
+
print("✓ 打包准备完成")
|
|
34
|
+
print()
|
|
35
|
+
print("生成的文件:")
|
|
36
|
+
print(f" - {project_root / 'dependencies_lock.json'}")
|
|
37
|
+
print(f" - {project_root / 'python_version.json'}")
|
|
38
|
+
print()
|
|
39
|
+
print("下一步:")
|
|
40
|
+
print(" 1. 检查生成的文件")
|
|
41
|
+
print(" 2. 提交到 git: git add dependencies_lock.json python_version.json")
|
|
42
|
+
print(" 3. 发布: npm publish")
|
|
43
|
+
return 0
|
|
44
|
+
|
|
45
|
+
except Exception as e:
|
|
46
|
+
print(f"\n✗ 打包准备失败: {e}")
|
|
47
|
+
import traceback
|
|
48
|
+
traceback.print_exc()
|
|
49
|
+
return 1
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""rollback 命令实现 - 回滚最后一次操作"""
|
|
2
|
+
import shutil
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from kite_cli.utils.operation_log import get_last_operation, log_operation
|
|
5
|
+
from kite_cli.utils.interactive import confirm_action
|
|
6
|
+
from kite_cli.utils.paths import get_install_path
|
|
7
|
+
from kite_cli.utils.i18n import t
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def run_rollback(args):
|
|
11
|
+
"""执行回滚命令"""
|
|
12
|
+
skip_confirm = args.yes if hasattr(args, 'yes') else False
|
|
13
|
+
|
|
14
|
+
# 获取最后一次成功的操作
|
|
15
|
+
last_op = get_last_operation()
|
|
16
|
+
|
|
17
|
+
if not last_op:
|
|
18
|
+
print("[Error] 没有可回滚的操作")
|
|
19
|
+
return 1
|
|
20
|
+
|
|
21
|
+
if not last_op.get("success"):
|
|
22
|
+
print("[Error] 最后一次操作失败,无法回滚")
|
|
23
|
+
return 1
|
|
24
|
+
|
|
25
|
+
operation = last_op.get("operation")
|
|
26
|
+
details = last_op.get("details", {})
|
|
27
|
+
|
|
28
|
+
if operation == "install":
|
|
29
|
+
return rollback_install(details, skip_confirm)
|
|
30
|
+
elif operation == "uninstall":
|
|
31
|
+
print("[Error] 卸载操作无法自动回滚")
|
|
32
|
+
print("[Info] 请手动重新安装模块")
|
|
33
|
+
return 1
|
|
34
|
+
elif operation == "update":
|
|
35
|
+
print("[Error] 更新操作无法自动回滚")
|
|
36
|
+
print("[Info] 请手动安装旧版本")
|
|
37
|
+
return 1
|
|
38
|
+
else:
|
|
39
|
+
print(f"[Error] 不支持回滚操作类型: {operation}")
|
|
40
|
+
return 1
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def rollback_install(details: dict, skip_confirm: bool) -> int:
|
|
44
|
+
"""回滚安装操作"""
|
|
45
|
+
module = details.get("module", "unknown")
|
|
46
|
+
location = details.get("location", "")
|
|
47
|
+
path = details.get("path", "")
|
|
48
|
+
|
|
49
|
+
if not path:
|
|
50
|
+
print("[Error] 无法确定模块路径")
|
|
51
|
+
return 1
|
|
52
|
+
|
|
53
|
+
module_path = Path(path)
|
|
54
|
+
|
|
55
|
+
if not module_path.exists():
|
|
56
|
+
print(f"[Warning] 模块已不存在: {module_path}")
|
|
57
|
+
return 0
|
|
58
|
+
|
|
59
|
+
# 确认回滚
|
|
60
|
+
if not skip_confirm:
|
|
61
|
+
if not confirm_action(f"确认回滚安装 {module} (删除 {location})?"):
|
|
62
|
+
print("[Cancelled] 已取消")
|
|
63
|
+
return 1
|
|
64
|
+
|
|
65
|
+
# 删除模块
|
|
66
|
+
try:
|
|
67
|
+
shutil.rmtree(module_path)
|
|
68
|
+
print(f"[Done] 已回滚安装: {module} from {location}")
|
|
69
|
+
|
|
70
|
+
# 记录回滚操作
|
|
71
|
+
log_operation("rollback", {
|
|
72
|
+
"original_operation": "install",
|
|
73
|
+
"module": module,
|
|
74
|
+
"location": location,
|
|
75
|
+
"path": str(module_path)
|
|
76
|
+
}, success=True)
|
|
77
|
+
|
|
78
|
+
return 0
|
|
79
|
+
|
|
80
|
+
except Exception as e:
|
|
81
|
+
print(f"[Error] 回滚失败: {e}")
|
|
82
|
+
|
|
83
|
+
log_operation("rollback", {
|
|
84
|
+
"original_operation": "install",
|
|
85
|
+
"module": module
|
|
86
|
+
}, success=False, error=str(e))
|
|
87
|
+
|
|
88
|
+
return 1
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""search 命令实现"""
|
|
2
|
+
from kite_cli.core.checker import PlatformChecker
|
|
3
|
+
from kite_cli.utils.i18n import t
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def run_search(args):
|
|
7
|
+
"""执行搜索命令"""
|
|
8
|
+
keyword = args.keyword
|
|
9
|
+
from_platform = args.from_platform
|
|
10
|
+
|
|
11
|
+
print(t('searching_for', keyword=keyword) + "\n")
|
|
12
|
+
|
|
13
|
+
if from_platform:
|
|
14
|
+
# 指定平台搜索
|
|
15
|
+
results = search_single_platform(keyword, from_platform)
|
|
16
|
+
else:
|
|
17
|
+
# 搜索所有平台
|
|
18
|
+
results = PlatformChecker.check_all(keyword)
|
|
19
|
+
|
|
20
|
+
# 显示结果
|
|
21
|
+
found_count = 0
|
|
22
|
+
|
|
23
|
+
# PyPI
|
|
24
|
+
if results.get("pypi"):
|
|
25
|
+
found_count += 1
|
|
26
|
+
pypi = results["pypi"]
|
|
27
|
+
print(f"【{t('search_pypi')}】")
|
|
28
|
+
print(f" • {pypi['name']}")
|
|
29
|
+
print(f" {t('search_latest_version')}: {pypi['latest']}")
|
|
30
|
+
if len(pypi['versions']) > 1:
|
|
31
|
+
print(f" {t('search_available_versions')}: {', '.join(pypi['versions'][:5])}")
|
|
32
|
+
print()
|
|
33
|
+
|
|
34
|
+
# npm
|
|
35
|
+
if results.get("npm"):
|
|
36
|
+
found_count += 1
|
|
37
|
+
npm = results["npm"]
|
|
38
|
+
print(f"【{t('search_npm')}】")
|
|
39
|
+
print(f" • {npm['name']}")
|
|
40
|
+
print(f" {t('search_version')}: {npm['latest']}")
|
|
41
|
+
print()
|
|
42
|
+
|
|
43
|
+
# Git
|
|
44
|
+
if results.get("git"):
|
|
45
|
+
found_count += len(results["git"])
|
|
46
|
+
print(f"【{t('search_git')}】")
|
|
47
|
+
for repo in results["git"]:
|
|
48
|
+
print(f" • {repo['full_name']}")
|
|
49
|
+
if repo.get("description"):
|
|
50
|
+
print(f" {repo['description']}")
|
|
51
|
+
print(f" {repo['url']}")
|
|
52
|
+
print()
|
|
53
|
+
|
|
54
|
+
if found_count == 0:
|
|
55
|
+
print(t('no_results'))
|
|
56
|
+
return 1
|
|
57
|
+
else:
|
|
58
|
+
print(t('found_results', count=found_count))
|
|
59
|
+
return 0
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def search_single_platform(keyword: str, platform: str):
|
|
63
|
+
"""搜索单个平台"""
|
|
64
|
+
results = {"pypi": None, "npm": None, "git": None}
|
|
65
|
+
|
|
66
|
+
if platform == "pypi":
|
|
67
|
+
results["pypi"] = PlatformChecker.check_pypi(keyword)
|
|
68
|
+
elif platform == "npm":
|
|
69
|
+
results["npm"] = PlatformChecker.check_npm(keyword)
|
|
70
|
+
elif platform == "git":
|
|
71
|
+
results["git"] = PlatformChecker.check_git(keyword)
|
|
72
|
+
|
|
73
|
+
return results
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""uninstall 命令实现"""
|
|
2
|
+
import shutil
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from kite_cli.utils.paths import get_install_path
|
|
5
|
+
from kite_cli.utils.interactive import confirm_action
|
|
6
|
+
from kite_cli.utils.i18n import t
|
|
7
|
+
from kite_cli.utils.operation_log import log_operation
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def run_uninstall(args):
|
|
11
|
+
"""执行卸载命令"""
|
|
12
|
+
module_name = args.name
|
|
13
|
+
location = args.location
|
|
14
|
+
uninstall_all = args.all
|
|
15
|
+
skip_confirm = args.yes
|
|
16
|
+
|
|
17
|
+
print(t('uninstalling', name=module_name))
|
|
18
|
+
|
|
19
|
+
# 查找模块
|
|
20
|
+
if uninstall_all:
|
|
21
|
+
# 卸载所有位置
|
|
22
|
+
locations = ["dev", "local", "global"]
|
|
23
|
+
elif location:
|
|
24
|
+
# 指定位置
|
|
25
|
+
locations = [location]
|
|
26
|
+
else:
|
|
27
|
+
# 自动查找
|
|
28
|
+
locations = find_module_locations(module_name)
|
|
29
|
+
if not locations:
|
|
30
|
+
print(t('module_not_found', name=module_name))
|
|
31
|
+
return 1
|
|
32
|
+
|
|
33
|
+
# 确认卸载
|
|
34
|
+
if not skip_confirm:
|
|
35
|
+
location_names = ", ".join(locations)
|
|
36
|
+
if not confirm_action(f"{t('uninstalling', name=module_name)} ({location_names})?"):
|
|
37
|
+
print(t('update_cancelled'))
|
|
38
|
+
return 1
|
|
39
|
+
|
|
40
|
+
# 执行卸载
|
|
41
|
+
success_count = 0
|
|
42
|
+
uninstalled_paths = []
|
|
43
|
+
for loc in locations:
|
|
44
|
+
module_path = get_install_path(loc, module_name)
|
|
45
|
+
if module_path.exists():
|
|
46
|
+
try:
|
|
47
|
+
shutil.rmtree(module_path)
|
|
48
|
+
print(t('uninstalled', location=loc, path=module_path))
|
|
49
|
+
success_count += 1
|
|
50
|
+
uninstalled_paths.append({"location": loc, "path": str(module_path)})
|
|
51
|
+
except Exception as e:
|
|
52
|
+
print(f"[Error] {t('update_failed', error=str(e))} ({loc})")
|
|
53
|
+
else:
|
|
54
|
+
print(f"[Warning] {t('module_not_found', name='')} ({loc}): {module_path}")
|
|
55
|
+
|
|
56
|
+
if success_count > 0:
|
|
57
|
+
# 记录操作日志
|
|
58
|
+
log_operation("uninstall", {
|
|
59
|
+
"module": module_name,
|
|
60
|
+
"locations": uninstalled_paths
|
|
61
|
+
}, success=True)
|
|
62
|
+
|
|
63
|
+
print(t('uninstall_complete', count=success_count))
|
|
64
|
+
print(t('restart_hint'))
|
|
65
|
+
return 0
|
|
66
|
+
else:
|
|
67
|
+
log_operation("uninstall", {
|
|
68
|
+
"module": module_name
|
|
69
|
+
}, success=False, error="No modules found")
|
|
70
|
+
|
|
71
|
+
print(t('uninstall_none'))
|
|
72
|
+
return 1
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def find_module_locations(module_name: str):
|
|
76
|
+
"""查找模块在哪些位置存在"""
|
|
77
|
+
locations = []
|
|
78
|
+
for loc in ["dev", "local", "global"]:
|
|
79
|
+
try:
|
|
80
|
+
module_path = get_install_path(loc, module_name)
|
|
81
|
+
if module_path.exists():
|
|
82
|
+
locations.append(loc)
|
|
83
|
+
except Exception:
|
|
84
|
+
pass
|
|
85
|
+
return locations
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""update 命令实现"""
|
|
2
|
+
import sys
|
|
3
|
+
import subprocess
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from kite_cli.utils.paths import get_install_path
|
|
6
|
+
from kite_cli.core.install_info import read_install_info
|
|
7
|
+
from kite_cli.utils.interactive import confirm_action
|
|
8
|
+
from kite_cli.utils.i18n import t
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def run_update(args):
|
|
12
|
+
"""执行更新命令"""
|
|
13
|
+
module_name = args.name if hasattr(args, 'name') else None
|
|
14
|
+
location = args.location if hasattr(args, 'location') else None
|
|
15
|
+
to_version = args.to_version if hasattr(args, 'to_version') else None
|
|
16
|
+
update_all = args.all if hasattr(args, 'all') else False
|
|
17
|
+
skip_confirm = args.yes if hasattr(args, 'yes') else False
|
|
18
|
+
|
|
19
|
+
if update_all:
|
|
20
|
+
print(t('update_not_implemented'))
|
|
21
|
+
return 1
|
|
22
|
+
|
|
23
|
+
if not module_name:
|
|
24
|
+
print(t('update_specify_name'))
|
|
25
|
+
return 1
|
|
26
|
+
|
|
27
|
+
# 显示更新信息
|
|
28
|
+
if to_version:
|
|
29
|
+
print(t('updating_module', name=f"{module_name} → {to_version}"))
|
|
30
|
+
else:
|
|
31
|
+
print(t('updating_module', name=module_name))
|
|
32
|
+
|
|
33
|
+
# 查找模块
|
|
34
|
+
if location:
|
|
35
|
+
locations = [location]
|
|
36
|
+
else:
|
|
37
|
+
locations = find_module_locations(module_name)
|
|
38
|
+
if not locations:
|
|
39
|
+
print(t('update_not_found', name=module_name))
|
|
40
|
+
return 1
|
|
41
|
+
|
|
42
|
+
# 只更新第一个找到的位置
|
|
43
|
+
loc = locations[0]
|
|
44
|
+
module_path = get_install_path(loc, module_name)
|
|
45
|
+
|
|
46
|
+
# 读取安装信息
|
|
47
|
+
install_info = read_install_info(module_path)
|
|
48
|
+
if not install_info:
|
|
49
|
+
print(t('update_no_install_info'))
|
|
50
|
+
print(t('update_manual_reinstall', name=module_name, location=loc))
|
|
51
|
+
return 1
|
|
52
|
+
|
|
53
|
+
source = install_info.get("source", {})
|
|
54
|
+
source_type = source.get("type")
|
|
55
|
+
|
|
56
|
+
if not source_type:
|
|
57
|
+
print(t('update_incomplete_info'))
|
|
58
|
+
return 1
|
|
59
|
+
|
|
60
|
+
# 构建安装命令
|
|
61
|
+
if source_type == "pypi":
|
|
62
|
+
source_arg = source.get("package", module_name)
|
|
63
|
+
# 如果指定了版本,添加版本号
|
|
64
|
+
if to_version:
|
|
65
|
+
source_arg = f"{source_arg}@{to_version}"
|
|
66
|
+
from_arg = "-f pypi"
|
|
67
|
+
elif source_type == "npm":
|
|
68
|
+
source_arg = source.get("package", module_name)
|
|
69
|
+
# 如果指定了版本,添加版本号
|
|
70
|
+
if to_version:
|
|
71
|
+
source_arg = f"{source_arg}@{to_version}"
|
|
72
|
+
from_arg = "-f npm"
|
|
73
|
+
elif source_type == "git":
|
|
74
|
+
source_arg = source.get("url", "")
|
|
75
|
+
from_arg = "-f git"
|
|
76
|
+
# Git 源不支持版本号
|
|
77
|
+
if to_version:
|
|
78
|
+
print("[Warning] Git 源不支持 --to 参数,将更新到最新提交")
|
|
79
|
+
elif source_type == "local":
|
|
80
|
+
print(t('update_local_no_auto'))
|
|
81
|
+
return 1
|
|
82
|
+
else:
|
|
83
|
+
print(t('update_unknown_source', type=source_type))
|
|
84
|
+
return 1
|
|
85
|
+
|
|
86
|
+
if not skip_confirm:
|
|
87
|
+
confirm_msg = t('update_confirm', name=module_name, source=source_type)
|
|
88
|
+
if to_version:
|
|
89
|
+
confirm_msg = f"确认更新 {module_name} 到版本 {to_version}?"
|
|
90
|
+
if not confirm_action(confirm_msg):
|
|
91
|
+
print(t('update_cancelled'))
|
|
92
|
+
return 1
|
|
93
|
+
|
|
94
|
+
# 调用 install 命令
|
|
95
|
+
print(t('reinstalling', name=module_name))
|
|
96
|
+
try:
|
|
97
|
+
cmd = [
|
|
98
|
+
sys.executable, "-m", "kite_cli", "install",
|
|
99
|
+
source_arg, "-l", loc, from_arg, "-y"
|
|
100
|
+
]
|
|
101
|
+
result = subprocess.run(cmd, capture_output=False, text=True)
|
|
102
|
+
return result.returncode
|
|
103
|
+
except Exception as e:
|
|
104
|
+
print(t('update_failed', error=str(e)))
|
|
105
|
+
return 1
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def find_module_locations(module_name: str):
|
|
109
|
+
"""查找模块在哪些位置存在"""
|
|
110
|
+
locations = []
|
|
111
|
+
for loc in ["dev", "local", "global"]:
|
|
112
|
+
try:
|
|
113
|
+
module_path = get_install_path(loc, module_name)
|
|
114
|
+
if module_path.exists():
|
|
115
|
+
locations.append(loc)
|
|
116
|
+
except Exception:
|
|
117
|
+
pass
|
|
118
|
+
return locations
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
kite venv-setup 命令
|
|
3
|
+
|
|
4
|
+
只负责创建虚拟环境
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def run_venv_setup(args):
|
|
12
|
+
"""创建虚拟环境"""
|
|
13
|
+
project_root = Path(__file__).parent.parent.parent
|
|
14
|
+
sys.path.insert(0, str(project_root))
|
|
15
|
+
|
|
16
|
+
from core.env_checker import (
|
|
17
|
+
get_venv_path,
|
|
18
|
+
check_venv_exists,
|
|
19
|
+
create_venv,
|
|
20
|
+
check_python_version
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
print("=" * 60)
|
|
24
|
+
print(" Kite 虚拟环境准备")
|
|
25
|
+
print("=" * 60)
|
|
26
|
+
print()
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
# 1. 检查 Python 版本
|
|
30
|
+
py_ok, py_version, required_version = check_python_version()
|
|
31
|
+
if not py_ok:
|
|
32
|
+
print(f"✗ Python 版本不匹配: {py_version}(需要 {required_version})")
|
|
33
|
+
return 1
|
|
34
|
+
|
|
35
|
+
print(f"✓ Python 版本: {py_version}")
|
|
36
|
+
|
|
37
|
+
# 2. 检查虚拟环境
|
|
38
|
+
venv_ok, venv_msg = check_venv_exists()
|
|
39
|
+
if venv_ok:
|
|
40
|
+
print(f"✓ 虚拟环境已存在: {get_venv_path()}")
|
|
41
|
+
return 0
|
|
42
|
+
|
|
43
|
+
# 3. 创建虚拟环境
|
|
44
|
+
print(f"正在创建虚拟环境...")
|
|
45
|
+
if not create_venv():
|
|
46
|
+
print("✗ 虚拟环境创建失败")
|
|
47
|
+
return 1
|
|
48
|
+
|
|
49
|
+
print(f"✓ 虚拟环境创建成功: {get_venv_path()}")
|
|
50
|
+
return 0
|
|
51
|
+
|
|
52
|
+
except Exception as e:
|
|
53
|
+
print(f"\n✗ 虚拟环境准备失败: {e}")
|
|
54
|
+
import traceback
|
|
55
|
+
traceback.print_exc()
|
|
56
|
+
return 1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""核心功能模块"""
|