Files
opsxshell/PROJECT_EVALUATION.md
T

14 KiB
Raw Blame History

PROJECT_EVALUATION.md - 项目评估和质量指标

本文档定义 OpsXShell 的质量标准、评估指标和改进目标。


版本历史

日期 版本 评分 主要变更
2026-04-04 v0.1.0 56/100 初始骨架
2026-04-05 v0.5.0 72/100 SFTP 传输队列优化
2026-04-06 v0.10.0 78/100 核心功能实现发布
2026-04-18 v1.0.0-audit 58/100 独立代码审计(本次)

评分说明: 此前评分(95-99)为开发过程自评,缺少客观基准。本次基于 7 维度独立审计重新评估,结果显著低于历史记录。这是正常的——自评往往偏高,独立审计才能暴露真实问题。


v1.0.0 独立审计评估 (2026-04-18)

整体评分

维度 分数 权重 加权分 说明
功能完成度 82/100 25% 20.5 SSH/SFTP/端口转发主体完成,SFTP 上传为简化实现
代码质量 45/100 20% 9.0 调试日志残留严重,组件过大,Mock 数据残留
测试覆盖 15/100 20% 3.0 仅 34 测试用例,核心模块零覆盖
架构设计 72/100 15% 10.8 IPC 分层合理,Store 有耦合,组件拆分不足
安全合规 55/100 10% 5.5 加密实现优秀,但密码明文传输风险、CSP 不严格
依赖管理 50/100 5% 2.5 Electron v28 过旧,better-sqlite3 严重过时
构建配置 75/100 5% 3.75 配置合理,dev 脚本跨平台兼容性差

综合评分: 58/100 — 功能原型阶段,距生产可用尚有差距

评分对比

功能完成度 ████████████████████░░░░░ 82%  功能基本齐全
代码质量   ██████████░░░░░░░░░░░░░░░ 45%  调试代码残留严重
测试覆盖   ███░░░░░░░░░░░░░░░░░░░░░░ 15%  核心模块零测试
架构设计   █████████████████░░░░░░░░ 72%  IPC 分层好,Store 有耦合
安全合规   █████████████░░░░░░░░░░░░ 55%  加密好,传输链路有风险
依赖管理   ████████████░░░░░░░░░░░░░ 50%  多个依赖严重过时
构建配置   ██████████████████░░░░░░░ 75%  基本合理

代码统计

总量

目录 文件数 代码行数 占比
electron/ 17 2,862 25.3%
src/ 55 7,480 66.0%
shared/ 5 441 3.9%
test/ 4 475 4.2%
总计 81 11,258 100%

需重点关注的文件

文件 行数 问题
src/components/TerminalView.tsx 645 🔴 单组件过大,含 30+ console.log
electron/services/ssh-service.ts 685 🔴 核心服务,20+ console.log
src/hooks/useSFTP.ts 510 🟡 Mock 数据残留,上传未实现
src/stores/connection/poolStore.ts 402 🟡 合理但与 lifecycleStore 耦合

SWOT 分析

Strengths (优势)

  • 加密实现专业: AES-256-GCM + PBKDF2(100K迭代) + 随机 Salt/IV,业界最佳实践
  • IPC 架构清晰: 8 个模块化 IPC Handler,通道常量统一管理
  • 连接管理设计: 状态机 + 连接池 + LRU 淘汰 + 保活,架构先进
  • 错误处理体系: 统一错误码 + 错误推断 + ErrorBoundary + 高阶包装函数
  • 共享类型: shared/types/ 主进程/渲染进程共用类型

Weaknesses (劣势)

  • 调试代码残留: TerminalView.tsx 有 const DEBUG = true,50+ 处彩色调试函数
  • 测试严重不足: 11,258 行代码仅 34 个测试用例,估算覆盖率 10-15%
  • 组件过大: TerminalView 645 行承担终端初始化、连接、Shell 数据、快照恢复全部逻辑
  • 依赖过时: Electron v28(当前v33+)、better-sqlite3 v9(当前v11)、ESLint v8(已停止维护)
  • SFTP 上传未完成: useSFTP.ts:399 标注 "Actual upload implementation would go here"

Opportunities (机会)

  • Electron 升级: v33+ 性能提升 30%+,内存占用更低
  • Zustand v5: 细粒度订阅,减少不必要的重渲染
  • XTerm.js 插件生态: Image addon、Web Links addon 可增强终端功能
  • 打包优化: electron-builder + asar 可显著减小安装包体积

Threats (威胁)

  • 安全风险: 密码可能通过 IPC 明文传输;sandbox: false 降低安全性
  • 竞品压力: Electerm、Tabby、Termius 等成熟竞品功能更完善
  • 跨平台兼容: dev 脚本用 & 后台运行,Windows 不可用
  • 依赖锁定: ssh2、socksv5 版本锁定,存在已知漏洞风险

关键问题清单

🔴 Critical — 必须修复

ID 问题 位置 影响
C-1 生产代码中 DEBUG = true + 50+ 调试函数 TerminalView.tsx:16 控制台信息泄露、性能损耗
C-2 核心模块零测试(SSH/加密/IPC) electron/services/* 重构/修改无安全网
C-3 SFTP 上传功能为占位实现 useSFTP.ts:399 核心功能不可用
C-4 密码可能明文通过 IPC 传输 preload.ts, session.types.ts 安全漏洞
C-5 Mock 数据残留生产代码 useSFTP.ts:154-161 生产环境显示假文件

🟡 Warning — 建议修复

ID 问题 位置 影响
W-1 TerminalView 645 行,职责过多 TerminalView.tsx 可维护性差
W-2 Store 间直接耦合 lifecycleStore.ts:39 改一处动全局
W-3 Electron v28 严重过时 package.json 性能和安全更新缺失
W-4 better-sqlite3 v9 过时 package.json 功能和性能缺失
W-5 react-router-dom 未使用 package.json 无用依赖增大包体积
W-6 IPC 通道名硬编码 preload.ts 未引用 IPC_CHANNELS 常量
W-7 Math.random() 生成 ID TerminalView.tsx:383 非唯一,应用 uuid
W-8 disconnect() 几乎空实现 useSFTP.ts:359-373 资源不释放
W-9 CSP 允许 unsafe-inline index.html:7 削弱 XSS 防护
W-10 主进程 tsconfig 无未使用检查 electron/tsconfig.json 坏代码无编译警告

🟢 Good — 做得好的

ID 实践 位置
G-1 AES-256-GCM 加密 + PBKDF2 密钥派生 crypto.ts
G-2 IPC Handler 按领域分 8 个模块 electron/ipc/*
G-3 共享类型定义 main/renderer 共用 shared/types/*
G-4 contextIsolation: true, nodeIntegration: false main.ts
G-5 统一错误码系统 + 错误推断 error-handler.ts
G-6 连接状态机 6 状态 + LRU 淘汰 connectionPool.ts

依赖评估

依赖 当前 最新 状态 风险
electron ^28.3.3 v33+ 🔴 严重过时 性能、安全、API 兼容
better-sqlite3 ^9.4.0 v11.x 🟡 过时 性能改进
zustand ^4.4.7 v5.x 🟡 非最新 细粒度订阅改进
lucide-react ^0.294.0 0.4xx 🟡 过时 图标缺失
socksv5 ^0.0.6 — 🟡 不稳定 0.0.x 版本
react-router-dom ^6.21.0 6.x 🟢 未使用 死依赖
eslint ^8.55.0 v9.x 🟡 已停维 flat config 迁移
react / react-dom ^18.2.0 18.3.x 🟢 稳定 —
@xterm/xterm ^5.5.0 5.5.x 🟢 最新 —
ssh2 ^1.15.0 1.15.x 🟢 稳定 —

测试评估

现状

测试文件 用例数 覆盖模块
test/stores/tabStore.test.ts 15 tabStore(完整)
test/stores/connectionPool.test.ts 7 poolStore(仅接口验证)
test/components/sftp/utils.test.ts 12 sftp/utils.ts(完整)
总计 34 —

未覆盖的关键模块

模块 代码行数 优先级 说明
ssh-service.ts 685 P0 SSH 连接/Shell/端口转发核心
crypto.ts ~100 P0 加密/解密必须验证正确性
database-service.ts 310 P1 数据持久化
TerminalView.tsx 645 P1 核心终端组件
useSFTP.ts 510 P1 SFTP 全部操作
ipc/*.ts (8个) ~600 P1 IPC 通道处理
error-handler.ts 330 P2 错误处理工具
poolStore.ts 402 P2 连接池逻辑
lifecycleStore.ts 235 P2 生命周期管理

估算覆盖率: ~10-15%(vitest.config.ts 设定 50% 阈值,实际远未达到)


安全评估

加密实现 ✅ 优秀

评估项 状态 说明
AES-256-GCM ✅ 认证加密,防篡改
PBKDF2 密钥派生 ✅ 100,000 迭代
随机 Salt + IV ✅ 每次加密独立
Master Key 文件权限 ✅ 0o600
Auth Tag 验证 ✅ 解密时校验完整性

安全隐患 ⚠️

问题 严重性 说明
密码可能明文通过 IPC 🔴 Session 类型含 password 字段,需确认传输时是否加密
SSH 私钥通过 IPC 明文 🟡 sshConnect(config: any) 私钥内容明文传递
sandbox: false 🟡 preload 未启用沙箱
CSP unsafe-inline 🟡 削弱 XSS 防护
IPC 无输入验证 🟡 所有 IPC 调用参数无 schema 验证

性能指标

指标 当前值 目标值 达标
冷启动时间 ~3s <2s ❌
SSH 连接速度 ~1s <500ms ❌
终端输入延迟 <16ms <10ms ✅
内存占用(10标签) ~200MB <150MB ❌
标签切换延迟 <50ms <100ms ✅
包体积 ~120MB <100MB ❌

优化方向与目标

v1.1.0 — 代码质量清理 (预计 1 周)

目标: 清除生产代码中的调试残留,提升代码质量评分至 70+

任务 优先级 影响文件 预计工时
移除所有 console.log / 调试函数 P0 TerminalView.tsx, useSFTP.ts, ssh-service.ts 4h
移除 DEBUG = true 硬编码 P0 TerminalView.tsx:16 0.5h
移除 Mock 数据 P0 useSFTP.ts:154-161 1h
补全 SFTP 上传功能 P0 useSFTP.ts 4h
补全 disconnect() 资源释放 P1 useSFTP.ts:359-373 2h
Math.random → uuid P1 TerminalView.tsx 1h
IPC 通道名引用常量 P2 preload.ts 2h
移除未使用依赖 react-router-dom P2 package.json 0.5h

验收标准:

  • grep -r "console.log" src/ electron/ 返回 0 结果
  • grep -r "DEBUG = true" src/ 返回 0 结果
  • SFTP 上传功能端到端可用

v1.2.0 — 组件拆分重构 (预计 1.5 周)

目标: TerminalView 拆分为可维护的模块,架构评分提升至 80+

任务 优先级 说明
TerminalView → useTerminal Hook P0 提取连接管理、Shell 数据处理
TerminalView → useTerminalSnapshot Hook P0 提取快照保存/恢复逻辑
TerminalView → useZmodem Hook P1 提取 rz/sz 文件传输逻辑
useSFTP → useSFTPNavigation + useSFTPTransfer P1 分离导航和传输职责
App.tsx → 导入/导出逻辑抽到 service P2 分离业务逻辑
Store 解耦 P2 lifecycleStore 不直接操作 poolStore

验收标准:

  • 单文件不超过 300 行
  • Hook 职责单一,可独立测试

v1.3.0 — 测试覆盖达标 (预计 2 周)

目标: 核心模块测试覆盖率 60%+,测试评分提升至 50+

阶段 目标模块 用例目标
第一批(P0) crypto.ts, ssh-service.ts(mock ssh2) 30+
第二批(P1) database-service.ts, error-handler.ts, poolStore.ts 40+
第三批(P1) IPC handlers(8个), TerminalView(组件测试) 50+
第四批(P2) useSFTP, lifecycleStore, tabStore补充 30+

验收标准:

  • npm test -- --coverage 总覆盖率 ≥ 50%
  • 核心模块(crypto, ssh-service) 覆盖率 ≥ 80%

v1.4.0 — 依赖升级 + 安全加固 (预计 1 周)

目标: 依赖更新到稳定版本,安全评分提升至 75+

任务 优先级 风险
Electron v28 → v33+ P0 Breaking changes 需逐一适配
better-sqlite3 v9 → v11 P0 API 有变化
ESLint v8 → v9 flat config P1 配置迁移
Zustand v4 → v5 P2 订阅 API 变化
启用 sandbox 模式 P1 preload 需适配
CSP 移除 unsafe-inline P1 Tailwind 需配置
IPC 参数 schema 验证 P2 引入 zod 或类似库

v1.5.0 — 功能补全 + 性能优化 (预计 2 周)

目标: 补全缺失功能,性能指标全面达标

任务 优先级 说明
SFTP 拖拽上传/下载 P1 界面就绪,补全事件处理
SFTP 断点续传 P2 大文件传输可靠性
会话分组树形显示 P2 侧边栏优化
终端分屏 P3 水平/垂直分屏
安装包体积优化 P1 asar + tree-shaking + 依赖瘦身
冷启动优化 P1 延迟加载非核心模块

里程碑总览

v1.1.0 代码质量清理    (1 周)   → 代码质量 45→70
v1.2.0 组件拆分重构    (1.5 周) → 架构 72→85
v1.3.0 测试覆盖达标    (2 周)   → 测试 15→50
v1.4.0 依赖升级+安全   (1 周)   → 安全 55→75
v1.5.0 功能补全+性能   (2 周)   → 功能 82→95

总计: ~7.5 周 → 综合评分 58→80+

成功指标

指标 v1.0 当前 v1.5 目标
综合评分 58/100 80+/100
测试覆盖率 ~10% ≥50%
代码质量(零console.log) 50+ 处 0 处
单文件最大行数 685 ≤300
Electron 版本 v28 v33+
安全评分 55 75+
包体积 ~120MB <100MB