diff --git a/README.md b/README.md index 6b05082..6732f93 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ [项目主页](https://github.com/weidonglang/DevEnv-Manager) · [Release 下载](https://github.com/weidonglang/DevEnv-Manager/releases) · [完整操作手册](docs/user-guide.md) · [环境可靠性设计](docs/env-reliability.md) · [安全说明](docs/safety-and-disclaimer.md) · [问题反馈](https://github.com/weidonglang/DevEnv-Manager/issues) -面向 Windows 的开发环境诊断器与安全操作面板。当前版本:**1.6 Stable**。 +面向 Windows 的开发环境诊断器与安全操作面板。当前版本:**1.6.1 Stable**。 -1.6 是基于 v1.5.x 真实复测后的正式稳定版,重点补齐高风险后端确认闭环、页面说明去重与细化、桌面/下载目录分页明细、端口与服务安全保护、MySQL 修复执行保护和正式更新链路。 +1.6.1 是 v1.6 实机验收后的收口版,继续完善页面指南模块化、发布链路和 issue 收尾状态;核心功能保持 v1.6 的高风险确认、桌面/下载分页明细、端口与服务安全保护和 MySQL 修复执行保护。 适合: @@ -37,6 +37,10 @@ DevEnv Manager 解决的是 Windows 上多个开发生态互相影响的问题 - 不适合希望软件自动接管整台机器、清理任意个人文件或替代专业包管理器的场景。 - 熟练使用 mise/asdf/Scoop/Chocolatey 且环境已经稳定的用户,可以只使用诊断能力。 +## 1.6.1 Stable + +1.6.1 是 v1.6 通过实机验收后的收口发布:补强前端帮助模块拆分,确认 QA Gate 相关 issue 已覆盖,并同步更新 Release、manifest 与 README。 + ## 1.6 Stable 1.6 是 v1.5.x QA 收口后的正式稳定版,重点不是扩展“系统管家”能力,而是把已经验证过的开发环境诊断、安全确认、页面说明和发布链路打通到可公开下载状态。 diff --git a/tauri/package-lock.json b/tauri/package-lock.json index 3cee230..f4e8555 100644 --- a/tauri/package-lock.json +++ b/tauri/package-lock.json @@ -1,12 +1,12 @@ { "name": "dailytools-tauri", - "version": "1.6.0", + "version": "1.6.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dailytools-tauri", - "version": "1.6.0", + "version": "1.6.1", "dependencies": { "@tauri-apps/api": "^2.11.1", "@tauri-apps/plugin-dialog": "^2.7.1", diff --git a/tauri/package.json b/tauri/package.json index 46d3238..6fc40e7 100644 --- a/tauri/package.json +++ b/tauri/package.json @@ -1,7 +1,7 @@ { "name": "dailytools-tauri", "private": true, - "version": "1.6.0", + "version": "1.6.1", "type": "module", "scripts": { "dev": "vite --host 127.0.0.1 --port 1420", diff --git a/tauri/src-tauri/Cargo.lock b/tauri/src-tauri/Cargo.lock index b9333f3..db4a4d2 100644 --- a/tauri/src-tauri/Cargo.lock +++ b/tauri/src-tauri/Cargo.lock @@ -480,7 +480,7 @@ checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" [[package]] name = "dailytools-tauri" -version = "1.6.0" +version = "1.6.1" dependencies = [ "dirs", "reqwest 0.12.28", diff --git a/tauri/src-tauri/Cargo.toml b/tauri/src-tauri/Cargo.toml index 19ac4a5..5ff7d42 100644 --- a/tauri/src-tauri/Cargo.toml +++ b/tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dailytools-tauri" -version = "1.6.0" +version = "1.6.1" description = "A lightweight Tauri rewrite of DevEnv Manager." authors = ["weidonglang"] edition = "2021" diff --git a/tauri/src-tauri/tauri.conf.json b/tauri/src-tauri/tauri.conf.json index 410b0fc..ad75e88 100644 --- a/tauri/src-tauri/tauri.conf.json +++ b/tauri/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "DevEnv Manager", - "version": "1.6.0", + "version": "1.6.1", "identifier": "com.weidonglang.dailytools", "build": { "beforeDevCommand": "npm run dev", diff --git a/tauri/src/features/help/index.ts b/tauri/src/features/help/index.ts new file mode 100644 index 0000000..f9908ba --- /dev/null +++ b/tauri/src/features/help/index.ts @@ -0,0 +1,156 @@ +import type { FeatureRiskInfo } from "../../types"; + +type GuideDefinition = { + title: string; + intro: string; + steps: string[]; + readonly: string[]; + writes: string[]; + safety: string[]; +}; + +const VIEW_FEATURE_MAP: Record = { + overview: "overview", + doctor: "doctor", + ports: "ports", + runtimes: "runtime-switch", + environment: "environment", + project: "project", + toolchains: "toolchains", + platforms: "toolchains", + learning: "learning", + maintenance: "cleanup", + toolbox: "command-panel", +}; + +const VIEW_GUIDES: Record = { + overview: { + title: "总览", + intro: "总览用于快速判断这台 Windows 开发机当前是否健康:它聚合当前生效运行时、PATH 风险、端口数量、版本更新状态和关键提醒。适合刚打开软件时先看一眼,再决定去环境医生、端口、项目或空间分析页面继续排查。", + steps: ["先点“刷新”读取最新快照。", "如果看到 PATH、JAVA_HOME、端口或更新异常,再跳转到对应页面。", "需要给别人描述问题时,优先复制总览和环境医生报告。"], + readonly: ["读取当前配置、受管运行时清单、版本更新清单和本机状态。", "不会安装软件、修改环境变量、停止进程或清理文件。"], + writes: ["总览页本身没有写入动作;更新下载/安装会跳到工具箱更新流程处理。"], + safety: ["如果检查失败,不影响其它页面继续使用。", "更新检查失败通常是网络或 GitHub 访问问题,可以复制错误后稍后重试。"], + }, + doctor: { + title: "环境医生", + intro: "环境医生把 PATH、JAVA_HOME、Python/pip、端口、缓存和常见配置问题整理成可解释的证据。适合“不知道哪里坏了”的场景,用它先定位原因,再决定是否执行安全修复。", + steps: ["先点“一键诊断”。", "逐条查看警告和建议,优先处理影响当前项目启动的问题。", "执行修复前先看页面里的 diff、备份名和风险等级。"], + readonly: ["诊断、导出报告、复制建议和网络/端口检查是只读。", "报告会脱敏本机用户名、令牌和敏感路径片段。"], + writes: ["安全修复可能写入当前用户 PATH 或受管环境变量。", "PATH 清理会移除重复、失效或旧 DevEnv 受管残留项。"], + safety: ["修改类动作需要后端 confirmation token,并在执行前建立可恢复记录。", "失败后先重新诊断,再从备份列表恢复,不要反复点击同一个修复按钮。"], + }, + ports: { + title: "端口管理", + intro: "端口管理用于识别本机监听端口、进程身份、冲突证据、父进程、Windows 服务和历史记录。适合排查 8080、3306、5173、6379 等端口被占用或误判的问题。", + steps: ["先点“扫描”。", "点击冲突徽标或详情按钮查看证据来源。", "用搜索、排序和快捷筛选缩小到数据库、Web、桌面应用或未知进程。"], + readonly: ["扫描、详情、复制 curl/连接命令、打开进程位置都是只读。", "端口身份不会只凭端口号下结论,会结合进程名、路径、命令行、服务名和冲突证据。"], + writes: ["安全结束进程、停止服务会改变运行状态。", "系统关键进程、PID 过低或高风险进程不会显示结束入口。"], + safety: ["结束进程和停止服务都需要后端 token。", "如果端口属于数据库或系统服务,优先用服务管理入口停止,不建议直接杀进程。"], + }, + runtimes: { + title: "运行时", + intro: "运行时页面用于发现、验证和切换 JDK、Node.js、Python、Maven、Gradle、Go 等开发工具。它区分 DevEnv 受管版本、系统安装版本、IDE 自带版本和外部手动路径。", + steps: ["先点“发现版本”刷新受管和外部候选。", "JDK 问题优先点“检查当前 JDK”或对外部 JDK 做只读验证。", "确认 java/javac/jar 都可用后,再生成 JAVA_HOME 稳定计划。"], + readonly: ["发现版本、外部 JDK 验证、java/javac/jar 检查是只读。", "外部 JDK 不会被卸载、移动或接管。"], + writes: ["切换受管运行时会更新 current 指针,并可能配合环境页写入用户环境变量。", "安装受管版本会下载到 DevEnv 管理目录。"], + safety: ["写入环境变量前会先生成计划和备份。", "IDE 捆绑运行时默认只展示和验证,不作为卸载目标。"], + }, + environment: { + title: "环境变量", + intro: "环境变量页面专门检查用户级 JAVA_HOME、DEVENV_HOME、PATH 顺序、java/javac/pip 命中和 Maven/Gradle 使用的 Java。适合处理终端里版本和软件界面看到的不一致。", + steps: ["先点“检查可靠性”。", "确认冲突来源后再生成修复计划。", "应用计划前核对 diff、备份名和是否需要重启终端。"], + readonly: ["可靠性检查、修复计划预览、备份列表查看、报告导出是只读。", "页面会展示 raw 值、展开后的路径和命令验证结果。"], + writes: ["应用计划会写当前用户环境变量。", "恢复环境会用最近备份替换用户级配置。"], + safety: ["应用、恢复和 PATH 清理都需要后端 token。", "如果预览后环境变量发生变化,后端会拒绝写入并要求重新预览。"], + }, + project: { + title: "项目", + intro: "项目页用于识别项目类型、读取 IDE 配置、验证 Java 消费者、生成 VS Code/IDEA 配置预览,以及备份后修改项目端口。适合启动项目、接手项目或排查端口冲突前使用。", + steps: ["先选择项目目录;默认不会自动填本机路径。", "点击“分析”识别项目类型和运行建议。", "需要写配置或改端口时,先生成预览并核对文件内容。"], + readonly: ["项目分析、IDEA 配置读取、Nacos/Nexus Java 验证和端口配置扫描是只读。", "页面只读取常见安全配置文件,不深扫源码内容。"], + writes: ["应用项目配置会写 VS Code/IDEA 等项目配置文件。", "修改端口会备份原文件并只替换识别到的端口项。"], + safety: ["写项目文件和端口修改都需要 token。", "后端会限制写入路径,避免越界修改项目外文件。"], + }, + toolchains: { + title: "工具链", + intro: "工具链页面向 Git、SSH、Node 包管理器、Python/pip 和常用 CLI 配置。适合首次配置开发机、修复 pip/npm 源或确认命令是否可用。", + steps: ["先点“全面检查”。", "Git 身份、SSH key、pip/npm 源按页面提示逐项处理。", "执行前阅读会写入哪些用户配置文件。"], + readonly: ["检查命令版本、读取配置状态、复制建议命令是只读。", "命令输出会做基础脱敏。"], + writes: ["保存 Git 身份、生成 SSH key、切换 pip/npm/chsrc 源会写用户配置。", "受管 pip 修复会先生成计划再执行。"], + safety: ["写配置前会提示影响范围,必要时生成备份。", "失败后优先复制错误和命令输出,不要手动删除配置目录。"], + }, + platforms: { + title: "平台与镜像", + intro: "平台页用于检查 Go、Rust、.NET、chsrc 和镜像源配置。它更像开发平台体检,不替代各生态成熟包管理器。", + steps: ["先点“全面检查”。", "根据生态选择 Go/Rust/.NET 或 chsrc 操作。", "切换镜像前确认团队或项目是否有固定要求。"], + readonly: ["版本检查、镜像测速和配置读取是只读。", "不会自动安装或卸载生态运行时。"], + writes: ["镜像切换会写对应工具的用户配置文件。", "chsrc 操作会调用受控白名单命令。"], + safety: ["写入前会备份或提示可恢复路径。", "如果公司网络有代理/内网源,先复制现有配置再改。"], + }, + learning: { + title: "学习中心", + intro: "学习中心只运行固定白名单里的只读检查命令,帮助你理解 where、version、doctor 等命令输出。适合学习排查思路,而不是执行修复。", + steps: ["选择预置命令或输入只读命令。", "运行后看 stdout/stderr 和安全评估。", "把输出带到其它页面决定下一步。"], + readonly: ["允许的命令只用于查看版本、路径和诊断信息。", "被拒绝的命令会说明原因。"], + writes: ["学习中心不安装工具、不改配置、不清理文件、不结束进程。"], + safety: ["PowerShell/cmd、破坏性 Git、磁盘/注册表/权限类命令会被拦截。", "不要粘贴看不懂的网页命令。"], + }, + maintenance: { + title: "空间分析", + intro: "空间分析用于做 C 盘只读体检、扫描低风险缓存、查看桌面/下载目录大文件、重复文件、常见应用占用,并在确认后生成清理或归档计划。适合先找证据,再少量、安全地释放空间。", + steps: ["先点“开始体检”看总体风险。", "桌面急救和下载目录先用“只读分析”,分页查看分类占用和 Top 文件。", "只把确认不需要的项目加入计划,再预览清理或归档。"], + readonly: ["体检、扫描、文件定位、复制路径、重复候选分析和应用占用统计都是只读。", "桌面/下载明细只展示文件名、路径、目录、大小、修改时间、类型和定位状态。"], + writes: ["清理会重新校验选中项,普通文件进入回收站或调用官方缓存命令。", "归档/搬家会先生成计划,展示源、目标、估算大小、风险和回滚信息。"], + safety: ["不会自动删除未选择文件,不会读取数据库正文或浏览器凭据。", "执行清理、搬家、回滚和扩容计划都需要 token;失败后先重新扫描。"], + }, + toolbox: { + title: "工具箱", + intro: "工具箱承载命令面板、更新、本地服务、Docker/WSL 和卸载等高级入口。它适合有明确目标时使用,不建议把这里当作一键系统管家。", + steps: ["先展开对应高级区并阅读说明。", "服务和 Docker/WSL 操作前确认目标名称、端口和当前状态。", "更新前先检查版本,再下载并校验安装包。"], + readonly: ["服务检查、日志读取、Docker/WSL 状态检查、更新检查是只读。", "打开系统位置或复制日志不会修改状态。"], + writes: ["启动/停止服务、Docker/WSL 安装更新、下载更新、自卸载会改变系统状态或打开系统工具。", "自卸载只打开 Windows 卸载器并关闭程序,不主动删除项目、数据库或运行时目录。"], + safety: ["系统级动作折叠在高级区,并要求 token 或明确确认。", "失败后不要连续重复点击,先复制日志或错误信息。"], + }, +}; + +function activeView() { + return document.querySelector(".nav-item.active")?.getAttribute("data-view") || "overview"; +} + +function riskInfoForView(view: string, featureRisks: FeatureRiskInfo[]) { + const featureId = VIEW_FEATURE_MAP[view] || "overview"; + return featureRisks.find((item) => item.featureId === featureId); +} + +export function renderViewGuide( + view = activeView(), + featureRisks: FeatureRiskInfo[] = [], + escapeHtml: (value: string) => string, +) { + const guide = document.querySelector("#view-guide-text"); + if (!guide) return; + const definition = VIEW_GUIDES[view] || VIEW_GUIDES.overview; + const info = riskInfoForView(view, featureRisks); + const riskHtml = info + ? `

风险与边界

    +
  • 风险等级:${escapeHtml(info.riskLevel)};确认级别:${escapeHtml(info.confirmationLevel === "none" ? "无需确认" : info.confirmationLevel === "triple" ? "三次确认" : "二次确认")}。
  • +
  • ${info.requiresBackup ? "执行前需要备份或生成可恢复记录。" : "主要是只读或低风险动作,通常不需要备份。"}
  • + ${info.whatItDoes.map((item) => `
  • 能做:${escapeHtml(item)}
  • `).join("")} + ${info.whatItDoesNotDo.map((item) => `
  • 不会做:${escapeHtml(item)}
  • `).join("")} +
` + : ""; + guide.innerHTML = ` +

${escapeHtml(definition.title)}

${escapeHtml(definition.intro)}

+

建议流程

    ${definition.steps.map((item) => `
  1. ${escapeHtml(item)}
  2. `).join("")}
+

只读能力

    ${definition.readonly.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
+

会修改什么

    ${definition.writes.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
+

安全与失败处理

    ${definition.safety.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
+ ${riskHtml} + `; +} + +export function clearFeatureHelp() { + const slot = document.querySelector("#feature-help-slot"); + if (slot) slot.innerHTML = ""; +} diff --git a/tauri/src/main.ts b/tauri/src/main.ts index 2ed0f44..daef718 100644 --- a/tauri/src/main.ts +++ b/tauri/src/main.ts @@ -27,6 +27,7 @@ import { import { envReliabilityIntro } from "./envReliability"; import { askForConfirmation, confirmRisk, disclaimerPanel } from "./features/safety"; import { fileDirectory } from "./features/cleanup"; +import { clearFeatureHelp, renderViewGuide } from "./features/help"; import { projectConfigurationPlanId } from "./features/jdk"; import { MYSQL_PERMISSION_UNKNOWN_HELP, mysqlPathValue } from "./features/mysql"; import { canShowKillPortAction } from "./features/ports"; @@ -2270,8 +2271,8 @@ async function refreshBase() { renderDuplicates(); renderAppUsage(); renderPorts(); - renderViewGuide(); - renderFeatureHelp(); + renderViewGuide(undefined, state.featureRisks, escapeHtml); + clearFeatureHelp(); const autoCheckUpdates = document.querySelector("#auto-check-updates"); if (autoCheckUpdates) autoCheckUpdates.checked = config.settings.autoCheckUpdate; } @@ -3232,8 +3233,8 @@ function activateView(view: string) { document.querySelectorAll(".view").forEach((item) => { item.classList.toggle("active", item.id === `view-${view}`); }); - renderViewGuide(view); - renderFeatureHelp(view); + renderViewGuide(view, state.featureRisks, escapeHtml); + clearFeatureHelp(); } async function pickDirectoryInto(inputId: string, autoAnalyze = false) { @@ -3261,158 +3262,6 @@ async function pickDirectoryInto(inputId: string, autoAnalyze = false) { } } -const VIEW_FEATURE_MAP: Record = { - overview: "overview", - doctor: "doctor", - ports: "ports", - runtimes: "runtime-switch", - environment: "environment", - project: "project", - toolchains: "toolchains", - platforms: "toolchains", - learning: "learning", - maintenance: "cleanup", - toolbox: "command-panel", -}; - -function currentView() { - return document.querySelector(".nav-item.active")?.getAttribute("data-view") || "overview"; -} - -type GuideDefinition = { - title: string; - intro: string; - steps: string[]; - readonly: string[]; - writes: string[]; - safety: string[]; -}; - -const VIEW_GUIDES: Record = { - overview: { - title: "总览", - intro: "总览用于快速判断这台 Windows 开发机当前是否健康:它聚合当前生效运行时、PATH 风险、端口数量、版本更新状态和关键提醒。适合刚打开软件时先看一眼,再决定去环境医生、端口、项目或空间分析页面继续排查。", - steps: ["先点“刷新”读取最新快照。", "如果看到 PATH、JAVA_HOME、端口或更新异常,再跳转到对应页面。", "需要给别人描述问题时,优先复制总览和环境医生报告。"], - readonly: ["读取当前配置、受管运行时清单、版本更新清单和本机状态。", "不会安装软件、修改环境变量、停止进程或清理文件。"], - writes: ["总览页本身没有写入动作;更新下载/安装会跳到工具箱更新流程处理。"], - safety: ["如果检查失败,不影响其它页面继续使用。", "更新检查失败通常是网络或 GitHub 访问问题,可以复制错误后稍后重试。"], - }, - doctor: { - title: "环境医生", - intro: "环境医生把 PATH、JAVA_HOME、Python/pip、端口、缓存和常见配置问题整理成可解释的证据。适合“不知道哪里坏了”的场景,用它先定位原因,再决定是否执行安全修复。", - steps: ["先点“一键诊断”。", "逐条查看警告和建议,优先处理影响当前项目启动的问题。", "执行修复前先看页面里的 diff、备份名和风险等级。"], - readonly: ["诊断、导出报告、复制建议和网络/端口检查是只读。", "报告会脱敏本机用户名、令牌和敏感路径片段。"], - writes: ["安全修复可能写入当前用户 PATH 或受管环境变量。", "PATH 清理会移除重复、失效或旧 DevEnv 受管残留项。"], - safety: ["修改类动作需要后端 confirmation token,并在执行前建立可恢复记录。", "失败后先重新诊断,再从备份列表恢复,不要反复点击同一个修复按钮。"], - }, - ports: { - title: "端口管理", - intro: "端口管理用于识别本机监听端口、进程身份、冲突证据、父进程、Windows 服务和历史记录。适合排查 8080、3306、5173、6379 等端口被占用或误判的问题。", - steps: ["先点“扫描”。", "点击冲突徽标或详情按钮查看证据来源。", "用搜索、排序和快捷筛选缩小到数据库、Web、桌面应用或未知进程。"], - readonly: ["扫描、详情、复制 curl/连接命令、打开进程位置都是只读。", "端口身份不会只凭端口号下结论,会结合进程名、路径、命令行、服务名和冲突证据。"], - writes: ["安全结束进程、停止服务会改变运行状态。", "系统关键进程、PID 过低或高风险进程不会显示结束入口。"], - safety: ["结束进程和停止服务都需要后端 token。", "如果端口属于数据库或系统服务,优先用服务管理入口停止,不建议直接杀进程。"], - }, - runtimes: { - title: "运行时", - intro: "运行时页面用于发现、验证和切换 JDK、Node.js、Python、Maven、Gradle、Go 等开发工具。它区分 DevEnv 受管版本、系统安装版本、IDE 自带版本和外部手动路径。", - steps: ["先点“发现版本”刷新受管和外部候选。", "JDK 问题优先点“检查当前 JDK”或对外部 JDK 做只读验证。", "确认 java/javac/jar 都可用后,再生成 JAVA_HOME 稳定计划。"], - readonly: ["发现版本、外部 JDK 验证、java/javac/jar 检查是只读。", "外部 JDK 不会被卸载、移动或接管。"], - writes: ["切换受管运行时会更新 current 指针,并可能配合环境页写入用户环境变量。", "安装受管版本会下载到 DevEnv 管理目录。"], - safety: ["写入环境变量前会先生成计划和备份。", "IDE 捆绑运行时默认只展示和验证,不作为卸载目标。"], - }, - environment: { - title: "环境变量", - intro: "环境变量页面专门检查用户级 JAVA_HOME、DEVENV_HOME、PATH 顺序、java/javac/pip 命中和 Maven/Gradle 使用的 Java。适合处理终端里版本和软件界面看到的不一致。", - steps: ["先点“检查可靠性”。", "确认冲突来源后再生成修复计划。", "应用计划前核对 diff、备份名和是否需要重启终端。"], - readonly: ["可靠性检查、修复计划预览、备份列表查看、报告导出是只读。", "页面会展示 raw 值、展开后的路径和命令验证结果。"], - writes: ["应用计划会写当前用户环境变量。", "恢复环境会用最近备份替换用户级配置。"], - safety: ["应用、恢复和 PATH 清理都需要后端 token。", "如果预览后环境变量发生变化,后端会拒绝写入并要求重新预览。"], - }, - project: { - title: "项目", - intro: "项目页用于识别项目类型、读取 IDE 配置、验证 Java 消费者、生成 VS Code/IDEA 配置预览,以及备份后修改项目端口。适合启动项目、接手项目或排查端口冲突前使用。", - steps: ["先选择项目目录;默认不会自动填本机路径。", "点击“分析”识别项目类型和运行建议。", "需要写配置或改端口时,先生成预览并核对文件内容。"], - readonly: ["项目分析、IDEA 配置读取、Nacos/Nexus Java 验证和端口配置扫描是只读。", "页面只读取常见安全配置文件,不深扫源码内容。"], - writes: ["应用项目配置会写 VS Code/IDEA 等项目配置文件。", "修改端口会备份原文件并只替换识别到的端口项。"], - safety: ["写项目文件和端口修改都需要 token。", "后端会限制写入路径,避免越界修改项目外文件。"], - }, - toolchains: { - title: "工具链", - intro: "工具链页面向 Git、SSH、Node 包管理器、Python/pip 和常用 CLI 配置。适合首次配置开发机、修复 pip/npm 源或确认命令是否可用。", - steps: ["先点“全面检查”。", "Git 身份、SSH key、pip/npm 源按页面提示逐项处理。", "执行前阅读会写入哪些用户配置文件。"], - readonly: ["检查命令版本、读取配置状态、复制建议命令是只读。", "命令输出会做基础脱敏。"], - writes: ["保存 Git 身份、生成 SSH key、切换 pip/npm/chsrc 源会写用户配置。", "受管 pip 修复会先生成计划再执行。"], - safety: ["写配置前会提示影响范围,必要时生成备份。", "失败后优先复制错误和命令输出,不要手动删除配置目录。"], - }, - platforms: { - title: "平台与镜像", - intro: "平台页用于检查 Go、Rust、.NET、chsrc 和镜像源配置。它更像开发平台体检,不替代各生态成熟包管理器。", - steps: ["先点“全面检查”。", "根据生态选择 Go/Rust/.NET 或 chsrc 操作。", "切换镜像前确认团队或项目是否有固定要求。"], - readonly: ["版本检查、镜像测速和配置读取是只读。", "不会自动安装或卸载生态运行时。"], - writes: ["镜像切换会写对应工具的用户配置文件。", "chsrc 操作会调用受控白名单命令。"], - safety: ["写入前会备份或提示可恢复路径。", "如果公司网络有代理/内网源,先复制现有配置再改。"], - }, - learning: { - title: "学习中心", - intro: "学习中心只运行固定白名单里的只读检查命令,帮助你理解 where、version、doctor 等命令输出。适合学习排查思路,而不是执行修复。", - steps: ["选择预置命令或输入只读命令。", "运行后看 stdout/stderr 和安全评估。", "把输出带到其它页面决定下一步。"], - readonly: ["允许的命令只用于查看版本、路径和诊断信息。", "被拒绝的命令会说明原因。"], - writes: ["学习中心不安装工具、不改配置、不清理文件、不结束进程。"], - safety: ["PowerShell/cmd、破坏性 Git、磁盘/注册表/权限类命令会被拦截。", "不要粘贴看不懂的网页命令。"], - }, - maintenance: { - title: "空间分析", - intro: "空间分析用于做 C 盘只读体检、扫描低风险缓存、查看桌面/下载目录大文件、重复文件、常见应用占用,并在确认后生成清理或归档计划。适合先找证据,再少量、安全地释放空间。", - steps: ["先点“开始体检”看总体风险。", "桌面急救和下载目录先用“只读分析”,分页查看分类占用和 Top 文件。", "只把确认不需要的项目加入计划,再预览清理或归档。"], - readonly: ["体检、扫描、文件定位、复制路径、重复候选分析和应用占用统计都是只读。", "桌面/下载明细只展示文件名、路径、目录、大小、修改时间、类型和定位状态。"], - writes: ["清理会重新校验选中项,普通文件进入回收站或调用官方缓存命令。", "归档/搬家会先生成计划,展示源、目标、估算大小、风险和回滚信息。"], - safety: ["不会自动删除未选择文件,不会读取数据库正文或浏览器凭据。", "执行清理、搬家、回滚和扩容计划都需要 token;失败后先重新扫描。"], - }, - toolbox: { - title: "工具箱", - intro: "工具箱承载命令面板、更新、本地服务、Docker/WSL 和卸载等高级入口。它适合有明确目标时使用,不建议把这里当作一键系统管家。", - steps: ["先展开对应高级区并阅读说明。", "服务和 Docker/WSL 操作前确认目标名称、端口和当前状态。", "更新前先检查版本,再下载并校验安装包。"], - readonly: ["服务检查、日志读取、Docker/WSL 状态检查、更新检查是只读。", "打开系统位置或复制日志不会修改状态。"], - writes: ["启动/停止服务、Docker/WSL 安装更新、下载更新、自卸载会改变系统状态或打开系统工具。", "自卸载只打开 Windows 卸载器并关闭程序,不主动删除项目、数据库或运行时目录。"], - safety: ["系统级动作折叠在高级区,并要求 token 或明确确认。", "失败后不要连续重复点击,先复制日志或错误信息。"], - }, -}; - -function riskInfoForView(view: string) { - const featureId = VIEW_FEATURE_MAP[view] || "overview"; - return state.featureRisks.find((item) => item.featureId === featureId); -} - -function renderViewGuide(view = currentView()) { - const guide = document.querySelector("#view-guide-text"); - if (!guide) return; - const definition = VIEW_GUIDES[view] || VIEW_GUIDES.overview; - const info = riskInfoForView(view); - const riskHtml = info - ? `

风险与边界

    -
  • 风险等级:${escapeHtml(info.riskLevel)};确认级别:${escapeHtml(info.confirmationLevel === "none" ? "无需确认" : info.confirmationLevel === "triple" ? "三次确认" : "二次确认")}。
  • -
  • ${info.requiresBackup ? "执行前需要备份或生成可恢复记录。" : "主要是只读或低风险动作,通常不需要备份。"}
  • - ${info.whatItDoes.map((item) => `
  • 能做:${escapeHtml(item)}
  • `).join("")} - ${info.whatItDoesNotDo.map((item) => `
  • 不会做:${escapeHtml(item)}
  • `).join("")} -
` - : ""; - guide.innerHTML = ` -

${escapeHtml(definition.title)}

${escapeHtml(definition.intro)}

-

建议流程

    ${definition.steps.map((item) => `
  1. ${escapeHtml(item)}
  2. `).join("")}
-

只读能力

    ${definition.readonly.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
-

会修改什么

    ${definition.writes.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
-

安全与失败处理

    ${definition.safety.map((item) => `
  • ${escapeHtml(item)}
  • `).join("")}
- ${riskHtml} - `; -} - -function renderFeatureHelp(_view = currentView()) { - const slot = document.querySelector("#feature-help-slot"); - if (!slot) return; - slot.innerHTML = ""; -} - function escapeHtml(value: string) { return value.replace(/[&<>"']/g, (char) => { const map: Record = { diff --git a/update-manifest.json b/update-manifest.json index b28dd3f..c6ed596 100644 --- a/update-manifest.json +++ b/update-manifest.json @@ -1,9 +1,9 @@ { - "version": "1.6.0", - "date": "2026-06-28", + "version": "1.6.1", + "date": "2026-06-30", "notes": [ - "1.6 Stable:补齐高风险后端确认闭环,优化页面使用指南、桌面/下载分页明细、端口与服务安全保护、MySQL 修复执行保护和右下角提示生命周期。" + "1.6.1 Stable:实机验收后的收口版,继续完善页面帮助模块拆分、v1.6 QA Gate 收尾和 issue 关闭状态;保留 1.6 的高风险确认、桌面/下载分页明细和发布链路。" ], - "downloadUrl": "https://github.com/weidonglang/DevEnv-Manager/releases/download/v1.6/DevEnv.Manager_1.6_x64-setup.exe", - "sha256": "0224a9a6cc3b2004296d2b7c01d6c252a628e9f8fad3254e3dcb9d5bbd2df013" + "downloadUrl": "https://github.com/weidonglang/DevEnv-Manager/releases/download/v1.6.1/DevEnv.Manager_1.6.1_x64-setup.exe", + "sha256": "4980e5c33e3ab0a070fe50f35af8d20f7826b4757c30b232fb26fe26b10e8dce" }