openclaw-agent-dashboard 1.0.21 → 1.0.23

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 (135) hide show
  1. package/README.md +55 -321
  2. package/frontend-dist/assets/index-B7XqKAxm.css +1 -0
  3. package/frontend-dist/assets/index-CxJaSYyo.js +24 -0
  4. package/{frontend → frontend-dist}/index.html +2 -1
  5. package/{plugin/openclaw.plugin.json → openclaw.plugin.json} +2 -2
  6. package/package.json +21 -13
  7. package/.github/workflows/release.yml +0 -56
  8. package/VERSION_DISPLAY_delivery.md +0 -242
  9. package/VERSION_DISPLAY_implementation_summary.md +0 -315
  10. package/design_manifest.md +0 -100
  11. package/docs/CHANGELOG_AGENT_MODIFICATIONS.md +0 -132
  12. package/docs/MAINTAINER_RELEASE_WORKFLOW.md +0 -211
  13. package/docs/Openclaw-Agent-Dashboard/345/217/221/345/270/203/344/270/216/346/233/264/346/226/260.md +0 -147
  14. package/docs/RELEASE-LATEST.md +0 -189
  15. package/docs/RELEASE-MODEL-CONFIG.md +0 -95
  16. package/docs/WINDOWS_INSTALL_TROUBLESHOOTING.md +0 -171
  17. package/docs/design/.gitkeep +0 -0
  18. package/docs/design/VERSION_DISPLAY_design.md +0 -1236
  19. package/docs/release-guide.md +0 -259
  20. package/docs/release-operations-manual.md +0 -167
  21. package/docs/reviews/.gitkeep +0 -0
  22. package/docs/reviews/approval_history.json +0 -14
  23. package/docs/reviews/cr_VERSION_DISPLAY.md +0 -397
  24. package/docs/reviews/traceability_manifest.json +0 -279
  25. package/docs/specs/VERSION_DISPLAY_spec.md +0 -371
  26. package/docs/specs/tr3-install-system.md +0 -580
  27. package/docs/windows-collaboration-model-paths-troubleshooting.md +0 -0
  28. package/frontend/package-lock.json +0 -1240
  29. package/frontend/package.json +0 -19
  30. package/frontend/src/App.vue +0 -355
  31. package/frontend/src/components/AgentCard.vue +0 -796
  32. package/frontend/src/components/AgentConfigPanel.vue +0 -539
  33. package/frontend/src/components/AgentDetailPanel.vue +0 -738
  34. package/frontend/src/components/ErrorAnalysisView.vue +0 -546
  35. package/frontend/src/components/ErrorCenterPanel.vue +0 -844
  36. package/frontend/src/components/PerformanceMonitor.vue +0 -515
  37. package/frontend/src/components/SettingsPanel.vue +0 -236
  38. package/frontend/src/components/TokenAnalysisPanel.vue +0 -683
  39. package/frontend/src/components/chain/ChainEdge.vue +0 -85
  40. package/frontend/src/components/chain/ChainNode.vue +0 -166
  41. package/frontend/src/components/chain/TaskChainView.vue +0 -425
  42. package/frontend/src/components/chain/index.ts +0 -3
  43. package/frontend/src/components/chain/types.ts +0 -70
  44. package/frontend/src/components/collaboration/CollaborationFlowSection.vue +0 -1032
  45. package/frontend/src/components/collaboration/CollaborationFlowWrapper.vue +0 -113
  46. package/frontend/src/components/common/VersionDisplay.vue +0 -187
  47. package/frontend/src/components/performance/PerformancePanel.vue +0 -119
  48. package/frontend/src/components/performance/PerformanceSection.vue +0 -1137
  49. package/frontend/src/components/tasks/TaskStatusSection.vue +0 -973
  50. package/frontend/src/components/timeline/TimelineConnector.vue +0 -31
  51. package/frontend/src/components/timeline/TimelineRound.vue +0 -135
  52. package/frontend/src/components/timeline/TimelineStep.vue +0 -691
  53. package/frontend/src/components/timeline/TimelineToolLink.vue +0 -109
  54. package/frontend/src/components/timeline/TimelineView.vue +0 -540
  55. package/frontend/src/components/timeline/index.ts +0 -5
  56. package/frontend/src/components/timeline/types.ts +0 -120
  57. package/frontend/src/composables/index.ts +0 -7
  58. package/frontend/src/composables/useDebounce.ts +0 -48
  59. package/frontend/src/composables/useRealtime.ts +0 -52
  60. package/frontend/src/composables/useState.ts +0 -52
  61. package/frontend/src/composables/useThrottle.ts +0 -46
  62. package/frontend/src/composables/useVirtualScroll.ts +0 -106
  63. package/frontend/src/main.ts +0 -4
  64. package/frontend/src/managers/EventDispatcher.ts +0 -127
  65. package/frontend/src/managers/RealtimeDataManager.ts +0 -302
  66. package/frontend/src/managers/StateManager.ts +0 -128
  67. package/frontend/src/managers/index.ts +0 -5
  68. package/frontend/src/types/collaboration.ts +0 -135
  69. package/frontend/src/types/index.ts +0 -20
  70. package/frontend/src/types/performance.ts +0 -105
  71. package/frontend/src/types/task.ts +0 -38
  72. package/frontend/vite.config.ts +0 -18
  73. package/legacy_code_anatomy.md +0 -518
  74. package/plugin/README.md +0 -99
  75. package/plugin/config.json.example +0 -1
  76. package/plugin/package.json +0 -26
  77. package/scripts/build-plugin.js +0 -81
  78. package/scripts/bundle.sh +0 -62
  79. package/scripts/install-plugin.sh +0 -162
  80. package/scripts/install-python-deps.sh +0 -226
  81. package/scripts/install.js +0 -684
  82. package/scripts/install.sh +0 -367
  83. package/scripts/lib/common.sh +0 -137
  84. package/scripts/release-pack.sh +0 -110
  85. package/scripts/start.js +0 -50
  86. package/scripts/test_available_models.py +0 -284
  87. package/scripts/test_version_display.sh +0 -128
  88. package/scripts/test_websocket_ping.py +0 -44
  89. package/session_registry.json +0 -58
  90. package/tests/.gitkeep +0 -0
  91. package/tests/qa_regression_report.md +0 -359
  92. package/tests/qa_version_display_report.md +0 -598
  93. /package/{src/backend → dashboard}/agents.py +0 -0
  94. /package/{src/backend → dashboard}/api/__init__.py +0 -0
  95. /package/{src/backend → dashboard}/api/agent_config_api.py +0 -0
  96. /package/{src/backend → dashboard}/api/agents.py +0 -0
  97. /package/{src/backend → dashboard}/api/agents_config.py +0 -0
  98. /package/{src/backend → dashboard}/api/chains.py +0 -0
  99. /package/{src/backend → dashboard}/api/collaboration.py +0 -0
  100. /package/{src/backend → dashboard}/api/debug_paths.py +0 -0
  101. /package/{src/backend → dashboard}/api/error_analysis.py +0 -0
  102. /package/{src/backend → dashboard}/api/errors.py +0 -0
  103. /package/{src/backend → dashboard}/api/performance.py +0 -0
  104. /package/{src/backend → dashboard}/api/subagents.py +0 -0
  105. /package/{src/backend → dashboard}/api/timeline.py +0 -0
  106. /package/{src/backend → dashboard}/api/version.py +0 -0
  107. /package/{src/backend → dashboard}/api/websocket.py +0 -0
  108. /package/{src/backend → dashboard}/collaboration.py +0 -0
  109. /package/{src/backend → dashboard}/data/__init__.py +0 -0
  110. /package/{src/backend → dashboard}/data/agent_config_manager.py +0 -0
  111. /package/{src/backend → dashboard}/data/chain_reader.py +0 -0
  112. /package/{src/backend → dashboard}/data/config_reader.py +0 -0
  113. /package/{src/backend → dashboard}/data/error_analyzer.py +0 -0
  114. /package/{src/backend → dashboard}/data/session_reader.py +0 -0
  115. /package/{src/backend → dashboard}/data/subagent_reader.py +0 -0
  116. /package/{src/backend → dashboard}/data/task_history.py +0 -0
  117. /package/{src/backend → dashboard}/data/timeline_reader.py +0 -0
  118. /package/{src/backend → dashboard}/data/version_info_reader.py +0 -0
  119. /package/{src/backend → dashboard}/errors.py +0 -0
  120. /package/{src/backend → dashboard}/main.py +0 -0
  121. /package/{src/backend → dashboard}/mechanism_reader.py +0 -0
  122. /package/{src/backend → dashboard}/mechanisms.py +0 -0
  123. /package/{src/backend → dashboard}/performance.py +0 -0
  124. /package/{src/backend → dashboard}/requirements.txt +0 -0
  125. /package/{src/backend → dashboard}/session_reader.py +0 -0
  126. /package/{src/backend → dashboard}/status/__init__.py +0 -0
  127. /package/{src/backend → dashboard}/status/change_tracker.py +0 -0
  128. /package/{src/backend → dashboard}/status/error_detector.py +0 -0
  129. /package/{src/backend → dashboard}/status/status_cache.py +0 -0
  130. /package/{src/backend → dashboard}/status/status_calculator.py +0 -0
  131. /package/{src/backend → dashboard}/status_calculator.py +0 -0
  132. /package/{src/backend → dashboard}/subagent_reader.py +0 -0
  133. /package/{src/backend → dashboard}/watchers/__init__.py +0 -0
  134. /package/{src/backend → dashboard}/watchers/file_watcher.py +0 -0
  135. /package/{plugin/index.js → index.js} +0 -0
@@ -1,26 +0,0 @@
1
- {
2
- "name": "openclaw-agent-dashboard",
3
- "version": "1.0.20",
4
- "description": "多 Agent 可视化看板 - OpenClaw 插件",
5
- "main": "index.js",
6
- "openclaw": {
7
- "extensions": ["./index.js"]
8
- },
9
- "keywords": ["openclaw", "dashboard", "agent", "monitoring"],
10
- "license": "MIT",
11
- "repository": {
12
- "type": "git",
13
- "url": "https://github.com/Umarchen/openclaw-agent-dashboard.git"
14
- },
15
- "files": [
16
- "openclaw.plugin.json",
17
- "index.js",
18
- "dashboard",
19
- "frontend-dist",
20
- "scripts"
21
- ],
22
- "scripts": {
23
- "pack": "node ../scripts/build-plugin.js",
24
- "prepublishOnly": "npm run pack"
25
- }
26
- }
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 插件打包脚本
4
- * 1. 构建前端
5
- * 2. 复制 backend 到 plugin/dashboard
6
- * 3. 复制 frontend/dist 到 plugin/frontend-dist
7
- */
8
- const fs = require('fs');
9
- const path = require('path');
10
- const { execSync } = require('child_process');
11
-
12
- const ROOT = path.join(__dirname, '..');
13
- const PLUGIN_DIR = path.join(ROOT, 'plugin');
14
- const BACKEND_SRC = path.join(ROOT, 'src', 'backend');
15
- const FRONTEND_DIR = path.join(ROOT, 'frontend');
16
- const DASHBOARD_DEST = path.join(PLUGIN_DIR, 'dashboard');
17
- const FRONTEND_DEST = path.join(PLUGIN_DIR, 'frontend-dist');
18
-
19
- function rmrf(dir) {
20
- if (fs.existsSync(dir)) {
21
- fs.rmSync(dir, { recursive: true });
22
- }
23
- }
24
-
25
- function copyDir(src, dest, exclude = []) {
26
- fs.mkdirSync(dest, { recursive: true });
27
- const entries = fs.readdirSync(src, { withFileTypes: true });
28
- for (const entry of entries) {
29
- if (exclude.includes(entry.name)) continue;
30
- if (entry.name.endsWith('.pyc') || entry.name.endsWith('.log')) continue;
31
- const srcPath = path.join(src, entry.name);
32
- const destPath = path.join(dest, entry.name);
33
- if (entry.isDirectory()) {
34
- copyDir(srcPath, destPath, exclude);
35
- } else {
36
- fs.copyFileSync(srcPath, destPath);
37
- }
38
- }
39
- }
40
-
41
- console.log('[pack] 1. 构建前端...');
42
- // 检查是否需要安装依赖:无 node_modules 或缺少 .bin(如 Windows 下 .bin 未生成)时都执行 install
43
- const nodeModulesPath = path.join(FRONTEND_DIR, 'node_modules');
44
- const binVite = path.join(nodeModulesPath, '.bin', 'vite');
45
- const binViteCmd = path.join(nodeModulesPath, '.bin', 'vite.cmd'); // Windows
46
- const needInstall = !fs.existsSync(nodeModulesPath) ||
47
- !(fs.existsSync(binVite) || fs.existsSync(binViteCmd));
48
- if (needInstall) {
49
- console.log('[pack] 安装前端依赖...');
50
- execSync('npm install --no-audit', { cwd: FRONTEND_DIR, stdio: 'inherit', env: process.env });
51
- }
52
- execSync('npm run build', { cwd: FRONTEND_DIR, stdio: 'inherit', env: process.env });
53
-
54
- console.log('[pack] 2. 复制 backend -> plugin/dashboard');
55
- rmrf(DASHBOARD_DEST);
56
- copyDir(BACKEND_SRC, DASHBOARD_DEST, ['__pycache__', '.pytest_cache']);
57
-
58
- console.log('[pack] 3. 复制 frontend/dist -> plugin/frontend-dist');
59
- rmrf(FRONTEND_DEST);
60
- const frontendDist = path.join(FRONTEND_DIR, 'dist');
61
- if (fs.existsSync(frontendDist)) {
62
- copyDir(frontendDist, FRONTEND_DEST);
63
- } else {
64
- console.warn('[pack] frontend/dist 不存在,跳过');
65
- }
66
-
67
- console.log('[pack] 4. 复制 Python 依赖安装脚本 -> plugin/scripts(供 npm 包与 openclaw plugins install 使用)');
68
- const SCRIPTS_SRC = path.join(ROOT, 'scripts');
69
- const SCRIPTS_DEST = path.join(PLUGIN_DIR, 'scripts');
70
- rmrf(SCRIPTS_DEST);
71
- fs.mkdirSync(path.join(SCRIPTS_DEST, 'lib'), { recursive: true });
72
- fs.copyFileSync(
73
- path.join(SCRIPTS_SRC, 'install-python-deps.js'),
74
- path.join(SCRIPTS_DEST, 'install-python-deps.js'),
75
- );
76
- fs.copyFileSync(
77
- path.join(SCRIPTS_SRC, 'lib', 'common.js'),
78
- path.join(SCRIPTS_DEST, 'lib', 'common.js'),
79
- );
80
-
81
- console.log('[pack] 完成');
package/scripts/bundle.sh DELETED
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # 打包项目为可分发的压缩包
4
- # 用法: npm run bundle
5
- #
6
- set -e
7
- cd "$(dirname "$0")/.."
8
- ROOT=$(pwd)
9
-
10
- VERSION=$(grep '"version"' "$ROOT/plugin/openclaw.plugin.json" | sed 's/.*"version": *"\([^"]*\)".*/\1/')
11
- OUTPUT="openclaw-agent-dashboard-v$VERSION.tar.gz"
12
-
13
- echo "=== 打包分发文件 ==="
14
- echo ""
15
- echo " 版本: $VERSION"
16
- echo " 输出: $OUTPUT"
17
- echo ""
18
-
19
- # 临时目录
20
- TMPDIR=$(mktemp -d)
21
- DISTDIR="$TMPDIR/openclaw-agent-dashboard"
22
-
23
- mkdir -p "$DISTDIR"
24
-
25
- # 复制需要的文件
26
- echo ">>> 复制文件..."
27
- cp -r "$ROOT/frontend" "$DISTDIR/"
28
- cp -r "$ROOT/src" "$DISTDIR/"
29
- cp -r "$ROOT/plugin" "$DISTDIR/"
30
- cp -r "$ROOT/scripts" "$DISTDIR/"
31
- cp "$ROOT/package.json" "$DISTDIR/"
32
- cp "$ROOT/README.md" "$DISTDIR/"
33
-
34
- # 清理不需要的文件
35
- echo ">>> 清理 node_modules..."
36
- rm -rf "$DISTDIR/frontend/node_modules"
37
- rm -rf "$DISTDIR/frontend/dist"
38
- rm -rf "$DISTDIR/plugin/frontend-dist"
39
- rm -rf "$DISTDIR/plugin/dashboard"
40
- find "$DISTDIR" -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
41
- find "$DISTDIR" -name ".pytest_cache" -type d -exec rm -rf {} + 2>/dev/null || true
42
-
43
- # 打包
44
- echo ">>> 压缩..."
45
- cd "$TMPDIR"
46
- tar -czf "$ROOT/$OUTPUT" openclaw-agent-dashboard
47
-
48
- # 清理临时目录
49
- rm -rf "$TMPDIR"
50
-
51
- # 显示结果
52
- echo ""
53
- echo "=== 打包完成 ==="
54
- echo ""
55
- echo " 文件: $OUTPUT"
56
- echo " 大小: $(du -h "$ROOT/$OUTPUT" | cut -f1)"
57
- echo ""
58
- echo "分发使用说明:"
59
- echo " 1. 解压: tar -xzf $OUTPUT"
60
- echo " 2. 进入: cd openclaw-agent-dashboard"
61
- echo " 3. 安装: npm run deploy"
62
- echo ""
@@ -1,162 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # OpenClaw Agent Dashboard 插件 - 安装/升级脚本
4
- # 用法: npm run deploy(推荐)或 ./scripts/install-plugin.sh
5
- #
6
- # 选项:
7
- # VERBOSE=1 显示详细输出(包括 npm/pip 的错误信息)
8
- # DRY_RUN=1 仅预览,不执行实际安装
9
- #
10
- # 配置目录与 OpenClaw 一致:OPENCLAW_STATE_DIR > OPENCLAW_HOME > HOME
11
- #
12
- set -euo pipefail
13
-
14
- cd "$(dirname "$0")/.."
15
- ROOT=$(pwd)
16
- SCRIPT_DIR="$ROOT/scripts"
17
-
18
- # 引入公共库
19
- source "$SCRIPT_DIR/lib/common.sh"
20
-
21
- # 环境变量
22
- VERBOSE="${VERBOSE:-0}"
23
- DRY_RUN="${DRY_RUN:-0}"
24
-
25
- # ============================================
26
- # 本脚本特有函数
27
- # ============================================
28
-
29
- # 获取已安装版本
30
- get_installed_version() {
31
- local plugin_path="$1"
32
- if [ -f "$plugin_path/openclaw.plugin.json" ]; then
33
- parse_json_version "$plugin_path/openclaw.plugin.json"
34
- else
35
- echo ""
36
- fi
37
- }
38
-
39
- # 检查命令是否存在
40
- check_cmd() {
41
- if ! command -v "$1" &>/dev/null; then
42
- log_error "未找到 $1,请先安装: $2"
43
- exit 1
44
- fi
45
- }
46
-
47
- # ============================================
48
- # 主流程
49
- # ============================================
50
-
51
- OPENCLAW_CONFIG_DIR=$(resolve_openclaw_config_dir)
52
- PLUGIN_PATH="${OPENCLAW_CONFIG_DIR}/extensions/openclaw-agent-dashboard"
53
- NEW_VERSION=$(parse_json_version "$ROOT/plugin/openclaw.plugin.json")
54
- OLD_VERSION=$(get_installed_version "$PLUGIN_PATH")
55
-
56
- log_info "[安装] 配置目录: $OPENCLAW_CONFIG_DIR"
57
- log_info "[安装] 插件路径: $PLUGIN_PATH"
58
- echo ""
59
-
60
- # 显示标题(区分安装/升级)
61
- if [ -n "$OLD_VERSION" ] && [ -d "$PLUGIN_PATH" ]; then
62
- log_info "=== OpenClaw Agent Dashboard 插件升级 ==="
63
- echo ""
64
- log_info " $OLD_VERSION → $NEW_VERSION"
65
- else
66
- log_info "=== OpenClaw Agent Dashboard 插件安装 ==="
67
- echo ""
68
- log_info " 版本: $NEW_VERSION"
69
- fi
70
-
71
- # dry-run 模式:仅预览
72
- if [ "$DRY_RUN" = "1" ]; then
73
- echo ""
74
- log_info "[DRY-RUN] 将执行以下操作:"
75
- log_info " - 安装插件到: $PLUGIN_PATH"
76
- log_info " - 安装 Python 依赖到 venv 或 --user"
77
- log_ok "预览完成,未执行实际安装"
78
- exit 0
79
- fi
80
-
81
- # 1. 检查前置条件
82
- check_cmd node "https://nodejs.org"
83
- check_cmd python3 "https://www.python.org"
84
- check_cmd openclaw "npm install -g openclaw"
85
-
86
- echo ""
87
- log_ok "前置条件检查通过"
88
-
89
- # 2. 构建前端(若通过 npm run deploy 调用,pack 已构建,跳过)
90
- if [ -d "$ROOT/frontend/dist" ] && [ -n "$(ls -A "$ROOT/frontend/dist" 2>/dev/null)" ]; then
91
- log_step "1/4 前端已构建,跳过"
92
- else
93
- log_step "1/4 构建前端..."
94
- (cd frontend && run_silent npm install && npm run build)
95
- fi
96
-
97
- # 3. 打包插件(若通过 npm run deploy 调用,pack 已完成,跳过)
98
- if [ -d "$ROOT/plugin/dashboard" ] && [ -f "$ROOT/plugin/dashboard/main.py" ]; then
99
- log_step "2/4 插件已打包,跳过"
100
- else
101
- log_step "2/4 打包插件..."
102
- node scripts/build-plugin.js
103
- fi
104
-
105
- # 4. 安装插件(升级时用 uninstall 清理配置+目录,避免 plugins.allow 引用已删目录导致校验失败)
106
- PLUGIN_ID="openclaw-agent-dashboard"
107
- if [ -d "$PLUGIN_PATH" ]; then
108
- log_step "3/4 移除旧版本后安装..."
109
- log_info " 执行: openclaw plugins uninstall $PLUGIN_ID"
110
- if run_silent openclaw plugins uninstall "$PLUGIN_ID" --force; then
111
- log_ok " 已卸载(配置记录)"
112
- else
113
- log_warn " uninstall 失败(可能未注册)"
114
- fi
115
- # uninstall 只删除配置记录,需要手动删除物理目录
116
- rm -rf "$PLUGIN_PATH"
117
- log_ok " 已删除旧目录"
118
- else
119
- log_step "3/4 安装插件..."
120
- fi
121
- log_info " 目标: $PLUGIN_PATH"
122
- log_info " 执行: openclaw plugins install ./plugin"
123
- if ! openclaw plugins install ./plugin; then
124
- log_error "插件安装失败"
125
- exit 1
126
- fi
127
- log_ok " 插件已安装"
128
-
129
- # 5. 安装 Python 依赖
130
- # 详见 docs/python-environment-compatibility.md
131
- if [ -f "$PLUGIN_PATH/dashboard/requirements.txt" ]; then
132
- if [ -n "$OLD_VERSION" ]; then
133
- log_step "4/4 检查 Python 依赖..."
134
- else
135
- log_step "4/4 安装 Python 依赖..."
136
- fi
137
-
138
- # 调用独立的 Python 依赖安装脚本
139
- DEPS_OPTS=""
140
- [ "$VERBOSE" = "1" ] && DEPS_OPTS="--verbose"
141
-
142
- if ! bash "$SCRIPT_DIR/install-python-deps.sh" "$PLUGIN_PATH" $DEPS_OPTS; then
143
- exit 1
144
- fi
145
- else
146
- log_warn "插件未正确安装(缺少 requirements.txt)"
147
- fi
148
-
149
- # 完成
150
- echo ""
151
- if [ -n "$OLD_VERSION" ]; then
152
- log_ok "=== 升级完成 ($OLD_VERSION → $NEW_VERSION) ==="
153
- else
154
- log_ok "=== 安装完成 (v$NEW_VERSION) ==="
155
- fi
156
- echo ""
157
- log_info "执行任意 openclaw 命令(如 openclaw tui)时,Dashboard 会自动启动。"
158
- log_info "访问地址: http://localhost:38271"
159
- echo ""
160
- log_info "若端口被占用,可创建 ~/.openclaw-agent-dashboard/config.json 设置端口:"
161
- log_info ' {"port": 38271}'
162
- echo ""
@@ -1,226 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # Python 依赖安装脚本
4
- # 用法: ./install-python-deps.sh <plugin_dir> [options]
5
- #
6
- # 选项:
7
- # --verbose 显示详细输出
8
- # --venv-only 仅使用 venv,不回退 pip
9
- # --skip-create 跳过创建 venv (已存在)
10
- #
11
- # 环境变量:
12
- # VERBOSE=1 显示详细输出
13
- #
14
- set -euo pipefail
15
-
16
- # ============================================
17
- # 参数解析
18
- # ============================================
19
-
20
- if [ $# -lt 1 ]; then
21
- echo "用法: $0 <plugin_dir> [--verbose] [--venv-only] [--skip-create]"
22
- echo ""
23
- echo "参数:"
24
- echo " plugin_dir 插件安装目录 (必须)"
25
- echo ""
26
- echo "选项:"
27
- echo " --verbose 显示详细输出"
28
- echo " --venv-only 仅使用 venv,不回退 pip"
29
- echo " --skip-create 跳过创建 venv (已存在)"
30
- exit 1
31
- fi
32
-
33
- PLUGIN_DIR="$1"
34
- shift
35
-
36
- # 解析选项
37
- VERBOSE="${VERBOSE:-0}"
38
- VENV_ONLY=0
39
- SKIP_CREATE=0
40
-
41
- while [ $# -gt 0 ]; do
42
- case "$1" in
43
- --verbose) VERBOSE=1 ;;
44
- --venv-only) VENV_ONLY=1 ;;
45
- --skip-create) SKIP_CREATE=1 ;;
46
- *) echo "未知选项: $1" >&2; exit 1 ;;
47
- esac
48
- shift
49
- done
50
-
51
- # ============================================
52
- # 日志辅助函数
53
- # ============================================
54
-
55
- log_info() { echo "$1"; }
56
- log_ok() { echo "✓ $1"; }
57
- log_warn() { echo "⚠ $1"; }
58
- log_error() { echo "❌ $1" >&2; }
59
-
60
- run_silent() {
61
- if [ "$VERBOSE" = "1" ]; then
62
- "$@"
63
- else
64
- "$@" 2>/dev/null
65
- fi
66
- }
67
-
68
- # ============================================
69
- # 系统依赖检测
70
- # ============================================
71
-
72
- check_python() {
73
- if ! command -v python3 &>/dev/null; then
74
- log_error "未找到 python3 命令"
75
- echo ""
76
- echo "请先安装 Python 3:"
77
- echo " Debian/Ubuntu: sudo apt install python3"
78
- echo " macOS: brew install python3"
79
- echo " Windows: 从 https://www.python.org 下载安装"
80
- return 1
81
- fi
82
- return 0
83
- }
84
-
85
- check_venv_module() {
86
- if ! python3 -c "import venv" 2>/dev/null; then
87
- return 1
88
- fi
89
- return 0
90
- }
91
-
92
- check_pip_module() {
93
- if python3 -m pip --version &>/dev/null; then
94
- return 0
95
- fi
96
- if command -v pip3 &>/dev/null; then
97
- return 0
98
- fi
99
- if command -v pip &>/dev/null; then
100
- return 0
101
- fi
102
- return 1
103
- }
104
-
105
- # ============================================
106
- # 验证
107
- # ============================================
108
-
109
- REQ_FILE="$PLUGIN_DIR/dashboard/requirements.txt"
110
- VENV_DIR="$PLUGIN_DIR/dashboard/.venv"
111
-
112
- if [ ! -f "$REQ_FILE" ]; then
113
- log_error "未找到 requirements.txt: $REQ_FILE"
114
- exit 1
115
- fi
116
-
117
- # ============================================
118
- # 安装 Python 依赖
119
- # ============================================
120
-
121
- PYTHON_DEPS_OK=""
122
-
123
- # 策略 1: venv(推荐,不受 PEP 668 影响,跨平台一致)
124
- if check_venv_module; then
125
- log_info " 尝试: venv(推荐,不受 PEP 668 影响)"
126
-
127
- VENV_PYTHON=""
128
- # 检查现有 venv
129
- [ -x "$VENV_DIR/bin/python" ] && VENV_PYTHON="$VENV_DIR/bin/python"
130
- [ -z "$VENV_PYTHON" ] && [ -x "$VENV_DIR/Scripts/python.exe" ] && VENV_PYTHON="$VENV_DIR/Scripts/python.exe"
131
-
132
- # 创建新 venv
133
- if [ -z "$VENV_PYTHON" ] && [ "$SKIP_CREATE" != "1" ]; then
134
- rm -rf "$VENV_DIR"
135
- if ! python3 -m venv "$VENV_DIR" 2>/dev/null; then
136
- log_warn " venv 创建失败,尝试其他方式..."
137
- else
138
- [ -x "$VENV_DIR/bin/python" ] && VENV_PYTHON="$VENV_DIR/bin/python"
139
- [ -z "$VENV_PYTHON" ] && [ -x "$VENV_DIR/Scripts/python.exe" ] && VENV_PYTHON="$VENV_DIR/Scripts/python.exe"
140
- fi
141
- fi
142
-
143
- # 安装依赖
144
- if [ -n "$VENV_PYTHON" ]; then
145
- if run_silent "$VENV_PYTHON" -m pip install --upgrade pip -q 2>/dev/null; then
146
- if run_silent "$VENV_PYTHON" -m pip install -r "$REQ_FILE" -q; then
147
- PYTHON_DEPS_OK="venv"
148
- fi
149
- fi
150
- fi
151
- fi
152
-
153
- # 策略 2: pip --user 兜底(Debian 12/Ubuntu 23.04+ 等 PEP 668 环境)
154
- if [ -z "$PYTHON_DEPS_OK" ] && [ "$VENV_ONLY" != "1" ]; then
155
- log_info " 尝试: pip --user(PEP 668 兜底)"
156
-
157
- if run_silent python3 -m pip install -r "$REQ_FILE" -q --user; then
158
- PYTHON_DEPS_OK="pip --user"
159
- elif run_silent python3 -m pip install -r "$REQ_FILE" -q; then
160
- PYTHON_DEPS_OK="pip"
161
- elif run_silent pip install -r "$REQ_FILE" -q --user; then
162
- PYTHON_DEPS_OK="pip --user"
163
- elif run_silent pip3 install -r "$REQ_FILE" -q --user; then
164
- PYTHON_DEPS_OK="pip3 --user"
165
- fi
166
- fi
167
-
168
- # ============================================
169
- # 结果
170
- # ============================================
171
-
172
- if [ -n "$PYTHON_DEPS_OK" ]; then
173
- log_ok "Python 依赖已就绪 ($PYTHON_DEPS_OK)"
174
- exit 0
175
- else
176
- log_error "Python 依赖安装失败"
177
- echo ""
178
- echo "========================================"
179
- echo "请检查以下系统依赖是否已安装:"
180
- echo "========================================"
181
- echo ""
182
-
183
- # 检测系统并给出针对性建议
184
- if [ -f /etc/debian_version ]; then
185
- echo "检测到 Debian/Ubuntu 系统,请执行:"
186
- echo ""
187
- echo " sudo apt update"
188
- echo " sudo apt install python3 python3-pip python3-venv"
189
- echo ""
190
- elif [ -f /etc/redhat-release ]; then
191
- echo "检测到 RedHat/CentOS/Fedora 系统,请执行:"
192
- echo ""
193
- echo " sudo dnf install python3 python3-pip"
194
- echo ""
195
- elif [[ "$(uname -s)" == "Darwin" ]]; then
196
- echo "检测到 macOS 系统,请执行:"
197
- echo ""
198
- echo " brew install python3"
199
- echo ""
200
- else
201
- echo "请确保已安装:"
202
- echo " - Python 3"
203
- echo " - pip (python3-pip)"
204
- echo " - venv 模块 (python3-venv,Linux 通常需要单独安装)"
205
- echo ""
206
- fi
207
-
208
- echo "========================================"
209
- echo "安装系统依赖后,重新执行:"
210
- echo "========================================"
211
- echo ""
212
- echo " npm run deploy"
213
- echo ""
214
- echo "或手动安装 Python 依赖:"
215
- echo ""
216
- echo " python3 -m pip install -r $REQ_FILE --user"
217
- echo ""
218
- echo "========================================"
219
- echo "调试模式:"
220
- echo "========================================"
221
- echo ""
222
- echo " VERBOSE=1 npm run deploy"
223
- echo ""
224
-
225
- exit 1
226
- fi