diff --git a/.claude/index.json b/.claude/index.json
index aec7387..e2beede 100644
--- a/.claude/index.json
+++ b/.claude/index.json
@@ -1,96 +1,187 @@
{
"meta": {
"project": "PVE-Tools-9",
- "description": "Proxmox VE 9.x 一键运维脚本与文档站",
- "version": "7.2.0",
+ "description": "Proxmox VE 9.x 模块化 Bash 运维工具集",
+ "version": "9.0.0",
"license": "GPL-3.0",
- "generated_at": "2026-04-28T20:59:34+08:00",
+ "generated_at": "2026-07-08T10:41:03+08:00",
"generator": "claude-init 自适应架构师",
- "truncated": false
+ "truncated": false,
+ "major_changes_since_last_scan": "项目完成模块化重构:430KB 单文件拆分为 lib/ (4文件) + src/modules/ (10子模块, 66文件)。新增 build.sh/dev.sh 构建系统。Web/ VitePress 文档站已移除。"
},
"scan_coverage": {
- "estimated_total_files": 75,
- "scanned_files": 62,
- "coverage_percent": 82.7,
- "skipped_by_ignore": 8,
- "skipped_binary_large": 2,
- "skipped_other": 3,
+ "estimated_total_files": 140,
+ "scanned_files": 80,
+ "coverage_percent": 57.1,
+ "skipped_by_ignore": 20,
+ "skipped_binary_large": 28,
+ "skipped_other": 12,
"skip_reasons": {
"binary_large": [
"Modules/VGPU/libvgpu_unlock_rs_20230207_44d5bb3.so",
- "Web/assets/images/Proxmox-Corporate-Brandguideline.pdf"
+ "images/ 下 27 个 PNG/JPG/SVG 文件(仅记录路径)",
+ "dist/PVE-Tools.sh(构建产物,已忽略)"
],
"ignore_rules": [
- "Web/bun.lock (类似 bun.lockb)",
- "Web/.vitepress/dist/ (构建产物)",
- "Web/.vitepress/cache/ (缓存)",
- "node_modules/ (依赖)",
- ".codebuddy/ (项目忽略)",
- ".cache/ (缓存)",
- ".spec-workflow/ (项目忽略)",
- ".claude/ (项目忽略)"
+ "dist/ (构建产物)",
+ "node_modules/ (不存在于当前仓库)",
+ ".git/ (版本控制)",
+ "test.txt"
],
- "too_large_full_read": [
- "PVE-Tools.sh (430KB,使用分段读取,覆盖率约60%)"
+ "too_large_or_not_prioritized": [
+ "src/modules/ 下 ~56 个非 init.sh 文件(仅 init.sh 已读,实现文件通过重构计划文档交叉验证)",
+ "Tools/ 下 13 个 .sh 脚本(仅记录文件名,内容已在上次扫描中确认来自 tteck 社区)"
]
}
},
"modules": [
{
"path": "/",
- "name": "根模块 (主脚本)",
+ "name": "根模块 (入口脚本)",
"language": "Bash",
"claude_md": "CLAUDE.md",
- "entry_points": ["PVE-Tools.sh"],
- "interfaces": ["主菜单 (9个一级选项,多个二级/三级子菜单)"],
- "dependencies": ["bash", "curl/wget", "qm/pct/pvesh (PVE CLI)"],
- "data_models": ["VERSION文件", "legal_acceptance marker文件", "/var/lib/pve-tools/ 运行时数据"],
- "tests": ["CI: shellcheck, bash -n, 版本一致性检查"],
+ "entry_points": ["PVE-Tools.sh (169行)", "build.sh", "dev.sh"],
+ "interfaces": [
+ "pve_tools_entry_source_tree() -- 本地模块加载",
+ "pve_tools_entry_prepare_remote_tree() -- 远程模块下载",
+ "main() -- 脚本主入口 (lib/runtime.sh)"
+ ],
+ "dependencies": ["bash", "curl/wget", "find", "sort"],
+ "data_models": ["VERSION", "legalese acceptance marker"],
+ "tests": ["CI: shellcheck, bash -n (入口+构建产物), 版本一致性检查"],
"config_files": ["VERSION", "UPDATE"],
"scanned_sections": [
- "颜色系统 (lines 23-55)",
- "日志函数 (lines 103-137)",
- "许可与风险体系 (lines 209-241)",
- "配置文件管理 (lines 244-331)",
- "GRUB 管理 (lines 333-410)",
- "主菜单 (lines 5480-5499)",
- "VM 高级运维 (lines 6065+)",
- "宿主机网络 (lines 7873+)"
+ "PVE-Tools.sh 完整读取 (169行)",
+ "build.sh 完整读取 (50行)",
+ "dev.sh 完整读取 (22行)",
+ "AGENTS.md 完整读取"
],
"scan_gaps": [
- "RDM/NVMe 直通完整逻辑 (lines 1954-2240 仅部分阅读)",
- "引导配置辅助 (lines 2669+ 仅部分阅读)",
- "所有子菜单实现函数体 (数量庞大,仅了解入口)",
- "GPU 直通各子功能详细实现",
- "存储/磁盘维护二级菜单实现"
- ],
- "coverage": "medium"
- },
- {
- "path": "Web/",
- "name": "Web 文档站",
- "language": "TypeScript/Vue/Markdown",
- "claude_md": "Web/CLAUDE.md",
- "entry_points": ["Web/index.md", "Web/.vitepress/config.mts"],
- "interfaces": ["VitePress 配置 (nav/sidebar)", "5个自定义Vue组件", "18个Markdown页面"],
- "dependencies": ["vitepress ^1.6.4", "vue ^3.5.27", "lucide-vue-next ^0.563.0", "bun"],
- "data_models": ["todo-data.json (开发计划+时间线)"],
- "tests": ["构建验证 (bun run build)"],
- "config_files": ["package.json", "wrangler.jsonc", ".vitepress/config.mts"],
- "scanned_files": [
- "index.md", "guide.md", "features.md", "faq.md", "update.md",
- "todo.md", "submit-plugin.md", "ula.md", "sponsor.md", "pay.md",
- "config.mts", "theme/index.ts", "theme/custom.css",
- "Announcement.vue", "CopyCodeBox.vue", "Giscus.vue",
- "HomeFeaturesWithTimeline.vue", "TodoList.vue",
- "package.json", "bun.lock", "wrangler.jsonc", "index.js",
- "todo-data.json", "advanced/index.md"
- ],
- "scan_gaps": [
- "advanced/ 下 10 篇 Markdown 教程详情(仅读取了索引,未逐篇阅读内容)"
+ "README.md / README_EN.md / REAMDE-JP.md 未读取(项目说明文档)",
+ "UPDATE 文件未读取",
+ "proxmoxlib.js 未读取(Proxmox Web UI 补丁)"
],
"coverage": "high"
},
+ {
+ "path": "lib/",
+ "name": "基础设施层",
+ "language": "Bash",
+ "claude_md": "lib/CLAUDE.md",
+ "entry_points": ["config.sh", "core.sh", "network.sh", "runtime.sh"],
+ "interfaces": [
+ "config.sh -- 全局变量(版本/镜像/URL/路径)",
+ "core.sh -- 颜色/日志/UI/确认/备份/GRUB(28个函数)",
+ "network.sh -- 网络检测/镜像选择/横幅(21个函数)",
+ "runtime.sh -- root守卫/调试/PVE检测/main()(8个函数)"
+ ],
+ "dependencies": ["bash", "curl/wget", "pveversion (运行时)"],
+ "data_models": ["legal_acceptance marker 文件"],
+ "tests": ["CI: shellcheck, bash -n"],
+ "config_files": ["config.sh (全局变量定义)"],
+ "scanned_files": [
+ "config.sh 完整读取 (254行)",
+ "core.sh 完整读取 (507行)",
+ "network.sh 头部读取 (50行, 函数签名已确认)",
+ "runtime.sh 完整读取 (235行)"
+ ],
+ "scan_gaps": [
+ "network.sh 后半部分 (~170行未读,包含镜像选择UI函数体,但函数签名已从重构计划获取)"
+ ],
+ "coverage": "high"
+ },
+ {
+ "path": "src/modules/",
+ "name": "功能模块层",
+ "language": "Bash",
+ "claude_md": "src/CLAUDE.md",
+ "entry_points": ["各子模块的 init.sh"],
+ "interfaces": [
+ "10 个子模块的菜单入口函数",
+ "menu_optimization() / menu_sources_updates() / menu_boot_kernel() / ...",
+ "main() 中的 case 分发 (lib/runtime.sh)"
+ ],
+ "dependencies": ["lib/config.sh", "lib/core.sh", "lib/network.sh (部分模块)"],
+ "data_models": ["无独立数据模型,操作 PVE 系统配置"],
+ "tests": ["CI: shellcheck, bash -n (通过构建产物)"],
+ "config_files": [],
+ "sub_modules": [
+ {
+ "path": "src/modules/01-optimization/",
+ "files": 6,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "日常优化与通知:弹窗/温度/电源/邮件"
+ },
+ {
+ "path": "src/modules/02-sources/",
+ "files": 4,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "软件源与系统升级:换源/更新/PVE8->9升级"
+ },
+ {
+ "path": "src/modules/03-boot-kernel/",
+ "files": 3,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "启动与内核管理:内核切换/清理/GRUB"
+ },
+ {
+ "path": "src/modules/04-gpu-passthrough/",
+ "files": 12,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "硬件直通与显卡:Intel/AMD/NVIDIA GPU/RDM/NVMe",
+ "scan_gaps": ["11个非init.sh文件未逐文件读取,函数归属已通过重构计划文档交叉验证"]
+ },
+ {
+ "path": "src/modules/05-vm-container/",
+ "files": 15,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "虚拟机运维与导入:备份/恢复/克隆/Cloud-Init/快照/磁盘/迁移",
+ "scan_gaps": ["14个非init.sh文件未逐文件读取,函数归属已通过重构计划文档交叉验证"]
+ },
+ {
+ "path": "src/modules/06-networking/",
+ "files": 10,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "宿主机网络与防火墙:网桥/VLAN/Bond/MAC绑定/防火墙/IPv6",
+ "scan_gaps": ["9个非init.sh文件未逐文件读取,函数归属已通过重构计划文档交叉验证"]
+ },
+ {
+ "path": "src/modules/07-storage-disk/",
+ "files": 6,
+ "init_read": true,
+ "coverage": "medium",
+ "description": "存储与磁盘维护:查询/挂载/LVM/Ceph/Swap"
+ },
+ {
+ "path": "src/modules/08-tools-about/",
+ "files": 3,
+ "init_read": true,
+ "coverage": "high",
+ "description": "诊断工具与项目信息:系统信息/救砖/更新/卸载"
+ },
+ {
+ "path": "src/modules/09-security/",
+ "files": 3,
+ "init_read": true,
+ "coverage": "high",
+ "description": "安全中心:风险检查/SSH加固"
+ },
+ {
+ "path": "src/modules/10-third-party/",
+ "files": 4,
+ "init_read": true,
+ "coverage": "high",
+ "description": "第三方工具:插件市场/CoolerControl/社区脚本"
+ }
+ ],
+ "coverage": "medium"
+ },
{
"path": "Tools/",
"name": "第三方工具集",
@@ -102,9 +193,9 @@
"data_models": ["无持久化数据模型"],
"tests": ["无CI覆盖,由tteck社区人工验证"],
"config_files": ["Tools/README.md"],
- "scanned_files": ["README.md"],
+ "scanned_files": ["README.md (上次扫描)", "CLAUDE.md (本次更新)"],
"scan_gaps": [
- "13个.sh脚本均未读取详细内容(仅记录文件名和来源)"
+ "13个.sh脚本均未读取详细内容(仅记录文件名和来源,未发生变化)"
],
"coverage": "low"
},
@@ -119,9 +210,9 @@
"data_models": ["插件元信息 (name/author/version/github)"],
"tests": ["无自动化测试"],
"config_files": [],
- "scanned_files": ["install-zsh.sh (前30行)"],
+ "scanned_files": ["install-zsh.sh (上次扫描前30行)", "CLAUDE.md (本次更新)"],
"scan_gaps": [
- "install-zsh.sh 完整实现 (仅读了前30行)",
+ "install-zsh.sh 完整实现 (未变化)",
"VGPU/*.so 二进制文件 (仅记录路径)"
],
"coverage": "low"
@@ -131,94 +222,137 @@
"name": "补充文档",
"language": "Markdown",
"claude_md": null,
- "entry_points": ["Docs/future-guide.md", "Docs/README-EN.md"],
- "interfaces": ["2个 Markdown 文档"],
+ "entry_points": [
+ "Docs/重构计划-PVE-Tools模块化拆分.md",
+ "Docs/future-guide.md",
+ "Docs/README-EN.md"
+ ],
+ "interfaces": ["3个 Markdown 文档"],
"dependencies": [],
"data_models": [],
"tests": [],
"config_files": [],
- "scanned_files": [],
+ "scanned_files": [
+ "重构计划-PVE-Tools模块化拆分.md (完整读取, 1362行 -- 关键架构文档)"
+ ],
"scan_gaps": [
"future-guide.md 和 README-EN.md 均未读取"
],
- "coverage": "none"
+ "coverage": "medium"
},
{
"path": ".github/",
"name": "CI/CD 与社区",
"language": "YAML",
- "claude_md": null,
- "entry_points": ["workflows/release.yml", "workflows/beta-release.yml", "workflows/pr-validation.yml"],
- "interfaces": ["release流水线 (shc编译+GitHub Release)", "beta-release流水线", "PR验证 (shellcheck+版本检查+安全扫描)"],
- "dependencies": ["GitHub Actions", "shc", "shellcheck"],
+ "claude_md": ".github/CLAUDE.md",
+ "entry_points": [
+ "workflows/release.yml",
+ "workflows/beta-release.yml",
+ "workflows/pr-validation.yml"
+ ],
+ "interfaces": [
+ "release流水线 (build.sh + shc编译 + GitHub Release)",
+ "beta-release流水线",
+ "PR验证 (shellcheck + bash -n + 版本检查 + 安全扫描)"
+ ],
+ "dependencies": ["GitHub Actions", "shc", "shellcheck", "build.sh"],
"data_models": [],
"tests": ["PR验证流水线自动执行"],
- "config_files": ["FUNDING.yml", "ISSUE_TEMPLATE/*.yml"],
+ "config_files": ["FUNDING.yml", "ISSUE_TEMPLATE/config.yml"],
"scanned_files": [
- "release.yml (前60行)", "beta-release.yml (前40行)", "pr-validation.yml (前50行)"
+ "release.yml (前50行)",
+ "pr-validation.yml (前50行)",
+ "FUNDING.yml",
+ "5个 Issue 模板文件"
],
"scan_gaps": [
- "FUNDING.yml 未读取",
- "4个 Issue 模板未读取"
+ "beta-release.yml 未读取",
+ "release.yml 后半部分 (release notes生成+上传逻辑)"
],
"coverage": "medium"
+ },
+ {
+ "path": "images/",
+ "name": "截图与图片资源",
+ "language": "二进制 (PNG/JPG/SVG)",
+ "claude_md": null,
+ "entry_points": [],
+ "interfaces": ["27个图片文件,用于 README 和文档"],
+ "dependencies": [],
+ "data_models": [],
+ "tests": [],
+ "config_files": [],
+ "scanned_files": [],
+ "scan_gaps": ["全部为二进制图片,不读取内容"],
+ "coverage": "none (intentionally skipped)"
+ }
+ ],
+ "modules_removed_since_last_scan": [
+ {
+ "path": "Web/",
+ "reason": "VitePress 文档站已从仓库移除 (git log: 'Web文档站移除'),相关 CLAUDE.md 成为孤立文件"
}
],
"next_steps": {
"priority": [
{
- "module": "根模块",
- "action": "深度扫描 PVE-Tools.sh 未覆盖区域",
+ "module": "src/modules/04-gpu-passthrough",
+ "action": "逐文件扫描非 init.sh 实现文件",
"paths": [
- "RDM 裸磁盘映射完整实现 (约1954-2240行)",
- "PCIe/NVMe 控制器直通 (约2240-2669行)",
- "GPU 直通各子菜单 (Intel/NVIDIA/AMD)",
- "存储与磁盘维护二级菜单",
- "软件源与系统升级二级菜单",
- "诊断工具与项目信息菜单"
+ "src/modules/04-gpu-passthrough/nvidia.sh",
+ "src/modules/04-gpu-passthrough/iommu.sh",
+ "src/modules/04-gpu-passthrough/controller.sh"
],
- "reason": "主脚本是项目的核心,但目前仅覆盖了约60%的关键区域"
+ "reason": "GPU 直通是高风险功能域,且文件最多(12个)、内部依赖最复杂"
},
{
- "module": "Tools",
- "action": "抽样阅读代表性脚本",
+ "module": "src/modules/05-vm-container",
+ "action": "逐文件扫描非 init.sh 实现文件",
"paths": [
- "Tools/post-pve-install.sh",
- "Tools/kernel-clean.sh",
- "Tools/netdata.sh"
+ "src/modules/05-vm-container/backup.sh",
+ "src/modules/05-vm-container/garbage-cleanup.sh",
+ "src/modules/05-vm-container/disk.sh"
],
- "reason": "了解第三方脚本的代码风格和风险等级"
+ "reason": "VM 运维为第二大模块(15文件),涉及数据安全"
},
{
- "module": "Web",
- "action": "补充阅读高级教程内容",
+ "module": "src/modules/06-networking",
+ "action": "逐文件扫描非 init.sh 实现文件",
"paths": [
- "Web/advanced/gpu-passthrough.md",
- "Web/advanced/host-network-firewall-ipv6.md",
- "Web/advanced/vm-backup-migration-cloudinit.md"
+ "src/modules/06-networking/firewall.sh",
+ "src/modules/06-networking/addressing.sh",
+ "src/modules/06-networking/interface.sh"
],
- "reason": "这些教程直接对应主脚本的高风险功能区域"
+ "reason": "网络模块文件最多(10文件)、子模块交叉引用最密"
},
{
- "module": "Docs",
- "action": "首次读取",
+ "module": "lib/",
+ "action": "完整读取 network.sh 后半部分",
"paths": [
- "Docs/future-guide.md",
- "Docs/README-EN.md"
+ "lib/network.sh (offset: 50)"
],
- "reason": "此前未覆盖,含项目发展路线和英文文档"
+ "reason": "镜像选择UI函数体尚未完整读取"
}
],
"optional": [
{
- "module": "Modules",
- "action": "完整阅读 install-zsh.sh",
- "reason": "作为插件规范参考示例"
+ "module": "Docs",
+ "action": "读取 future-guide.md 和 README-EN.md",
+ "reason": "了解项目发展路线和英文文档内容"
+ },
+ {
+ "module": "Tools",
+ "action": "抽样读取代表性脚本",
+ "paths": [
+ "Tools/post-pve-install.sh",
+ "Tools/kernel-clean.sh"
+ ],
+ "reason": "验证脚本是否随项目模块化有所变化"
},
{
"module": ".github",
- "action": "阅读 FUNDING.yml 和 Issue 模板",
- "reason": "了解社区治理流程"
+ "action": "读取 beta-release.yml 和 ISSUE_TEMPLATE 文件",
+ "reason": "完整理解 CI/CD 和社区治理流程"
}
]
}
diff --git a/.github/CLAUDE.md b/.github/CLAUDE.md
new file mode 100644
index 0000000..eaa3d85
--- /dev/null
+++ b/.github/CLAUDE.md
@@ -0,0 +1,117 @@
+[根目录](../CLAUDE.md) > **.github**
+
+# .github -- CI/CD 工作流与社区治理
+
+## 模块职责
+
+管理项目的持续集成/持续部署流水线和社区 Issue 模板。三条工作流覆盖 PR 验证、正式发布和测试版发布。
+
+## 入口与启动
+
+| 项目 | 说明 |
+|---|---|
+| 触发方式 | GitHub Actions,由 push/pull_request 事件触发 |
+| 运行环境 | `ubuntu-latest` |
+| 权限 | `contents: write`(Release 工作流需要) |
+
+## 工作流清单
+
+### release.yml -- 正式发布工作流
+
+**触发条件**: 推送版本标签 (`v*.*.*`, `*.*.*`, `v*.*.*-stable`, `*.*.*-stable`)
+
+**步骤**:
+1. `actions/checkout@v4`(fetch-depth: 0 以获取完整历史)
+2. 从 tag 提取版本号
+3. **`bash build.sh`** -- 将 lib/ + src/modules/ 组装为 `dist/PVE-Tools.sh`
+4. 安装 `shc`(via neurobin/ppa)
+5. `shc -f dist/PVE-Tools.sh -o pve-tools` -- 编译为二进制
+6. 生成 release notes(基于 git 提交历史)
+7. `softprops/action-gh-release@v2` 创建 GitHub Release,上传 `pve-tools` + `dist/PVE-Tools.sh`
+
+**构建产物**:
+- `pve-tools` -- 编译后的二进制文件
+- `dist/PVE-Tools.sh` -- 拼接后的单文件脚本
+
+### beta-release.yml -- 测试版发布工作流
+
+**触发条件**: 推送 beta/alpha 标签
+
+功能与 release.yml 类似,但标记为 prerelease。
+
+### pr-validation.yml -- PR 验证工作流
+
+**触发条件**: PR 合并到 `main` 或 `beta` 分支
+
+**检查项**:
+
+| 检查 | 命令 | 说明 |
+|---|---|---|
+| Shellcheck | `shellcheck -f gcc PVE-Tools.sh` | 静态分析,有 error/warning 则失败 |
+| 语法检查 | `bash -n PVE-Tools.sh`、`bash -n dev.sh`、`bash -n dist/PVE-Tools.sh` | 先运行 `bash build.sh` 构建再检查 |
+| 构建验证 | `bash build.sh` | 验证构建不报错 |
+| 版本一致性 | 比较 `lib/config.sh` 中的 `CURRENT_VERSION` 与 `VERSION` 文件 | 不一致则失败 |
+| 安全扫描 | grep 检测 `eval`/`source` 使用 | 发现则告警 |
+
+## Issue 模板
+
+| 文件 | 用途 |
+|---|---|
+| `fast-bugs-report.md` | 快速 Bug 报告 |
+| `feature-request.md` | 功能请求 |
+| `plugin-submit.md` | 插件提交 |
+| `report-bugs.md` | 详细 Bug 报告 |
+| `config.yml` | Issue 模板配置 |
+
+## 其他文件
+
+| 文件 | 用途 |
+|---|---|
+| `FUNDING.yml` | GitHub Sponsors 赞助配置 |
+
+## 关键依赖与配置
+
+- **GitHub Actions**: 免费额度,`ubuntu-latest` runner
+- **shc**: 来自 `ppa:neurobin/ppa`,用于 Bash 编译
+- **softprops/action-gh-release@v2**: 第三方 GitHub Action,用于创建 Release
+- **shellcheck**: Ubuntu 自带或通过 apt 安装
+
+## 测试与质量
+
+CI/CD 本身即为项目的测试与质量保障体系:
+- 每次 PR 自动执行静态分析、语法检查、版本一致性校验、安全扫描
+- Release 前自动构建并验证构建产物
+
+## 常见问题 (FAQ)
+
+**Q: 为什么 Release 要用 shc 编译?**
+shc 将 Bash 脚本编译为二进制文件,提供基础的源码保护,同时便于分发。构建产物 `dist/PVE-Tools.sh` 同时发布以保持 `bash <(curl ...)` 兼容性。
+
+**Q: PR 验证中 build.sh 会失败怎么办?**
+检查 lib/ 和 src/modules/ 中的文件是否存在、语法是否正确。`bash -n` 仅检查语法不执行代码。
+
+**Q: 如何添加新的 Issue 模板?**
+在 `ISSUE_TEMPLATE/` 目录添加 `.md` 文件并更新 `config.yml` 即可,GitHub 会自动识别。
+
+## 相关文件清单
+
+```
+.github/
+ workflows/
+ release.yml # 正式发布工作流
+ beta-release.yml # 测试版发布工作流
+ pr-validation.yml # PR 验证工作流
+ ISSUE_TEMPLATE/
+ fast-bugs-report.md # 快速 Bug 报告模板
+ feature-request.md # 功能请求模板
+ plugin-submit.md # 插件提交模板
+ report-bugs.md # 详细 Bug 报告模板
+ config.yml # Issue 模板配置
+ FUNDING.yml # 赞助配置
+```
+
+## 变更记录 (Changelog)
+
+| 日期 | 变更 |
+|---|---|
+| 2026-07-08 | 初始化 .github 模块 CLAUDE.md。PR 验证已适配模块化(build.sh/build -n dist)。Release 已添加 build.sh 步骤。 |
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
index 44adcab..4c1d090 100644
--- a/.github/workflows/pr-validation.yml
+++ b/.github/workflows/pr-validation.yml
@@ -21,10 +21,13 @@ jobs:
- name: Shell syntax check
run: |
bash -n PVE-Tools.sh
+ bash -n dev.sh
+ bash build.sh
+ bash -n dist/PVE-Tools.sh
- name: Version consistency check
run: |
- SCRIPT_VERSION=$(grep "CURRENT_VERSION=" PVE-Tools.sh | cut -d'"' -f2)
+ SCRIPT_VERSION=$(grep "CURRENT_VERSION=" lib/config.sh | cut -d'"' -f2)
VERSION_FILE_VERSION=$(cat VERSION 2>/dev/null)
if [ "$SCRIPT_VERSION" != "$VERSION_FILE_VERSION" ]; then
echo "Version inconsistency: script($SCRIPT_VERSION) != version file($VERSION_FILE_VERSION)"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 75676e4..34ab676 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -25,6 +25,9 @@ jobs:
VERSION=${TAG#v}
echo "TAG=$TAG" >> $GITHUB_OUTPUT
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
+
+ - name: Build single script from modules
+ run: bash build.sh
- name: Install shc
run: |
@@ -34,7 +37,7 @@ jobs:
- name: Compile script to binary
run: |
- shc -f PVE-Tools.sh -o pve-tools
+ shc -f dist/PVE-Tools.sh -o pve-tools
chmod +x pve-tools
- name: Generate release notes
@@ -81,7 +84,7 @@ jobs:
```
files: |
pve-tools
- PVE-Tools.sh
+ dist/PVE-Tools.sh
draft: false
prerelease: false
env:
diff --git a/.gitignore b/.gitignore
index 51104fa..3d1459f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,3 +43,6 @@ _bmad/
_bmad-output/
test.txt
+
+# ignore docs
+Docs/
diff --git a/CLAUDE.md b/CLAUDE.md
index 8a52c78..a226065 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -8,38 +8,12 @@ PVE Tools Pro 是一个面向 Proxmox VE 9.x 的交互式 Bash 运维工具集
## 架构总览
-```mermaid
-graph TD
- A["(根) PVE Tools Pro"] --> B["PVE-Tools.sh (主脚本)"]
- A --> C["Web"]
- A --> D["Tools"]
- A --> E["Modules"]
- A --> F["Docs"]
- A --> G[".github"]
+项目已完成模块化重构(v9.0.0),从单一 430KB 脚本拆分为基础设施层(lib/)与功能模块层(src/modules/),通过 build.sh 组装为单文件发布,用户侧零感知。
- C --> C1["VitePress 文档站"]
- C --> C2["Vue 组件 (5个)"]
- C --> C3["高级教程 (10篇)"]
-
- D --> D1["PVE 后安装配置"]
- D --> D2["LXC 容器管理"]
- D --> D3["系统维护工具"]
- D --> D4["监控工具"]
-
- E --> E1["插件市场"]
- E --> E2["VGPU .so"]
-
- G --> G1["CI/CD Workflows"]
- G --> G2["Issue Templates"]
-
- click B "./PVE-Tools.sh" "主入口脚本"
- click C "./Web/CLAUDE.md" "查看 Web 模块文档"
- click D "./Tools/CLAUDE.md" "查看 Tools 模块文档"
- click E "./Modules/CLAUDE.md" "查看 Modules 模块文档"
-```
-
-- **核心入口**: `PVE-Tools.sh`(约 430KB,单一 Bash 脚本),通过 `bash <(curl -sSL ...)` 方式分发执行。
-- **文档站**: `Web/` 目录承载 VitePress 构建的官方文档网站,部署于 Cloudflare Pages。
+- **入口层**: `PVE-Tools.sh`(169 行)-- 本地开发时 source lib/ + src/modules/;远程 curl 运行时自动下载 dist/ 构建产物或逐个下载源码模块。
+- **基础设施层**: `lib/` -- 全局变量(config.sh)、日志/UI/备份/GRUB(core.sh)、网络检测/镜像选择(network.sh)、运行时守卫(runtime.sh)。
+- **功能模块层**: `src/modules/` -- 10 个子目录对应主菜单 1-10 项,每个子目录内按功能拆分文件(init.sh 为菜单入口)。
+- **构建系统**: `build.sh` 按顺序拼接 lib/*.sh + src/modules/**/*.sh 为 `dist/PVE-Tools.sh`;`dev.sh` 直接 source 全部源码供开发调试。
- **辅助工具集**: `Tools/` 集成来自 tteck 社区的 13 个系统维护脚本。
- **插件市场**: `Modules/` 提供第三方脚本的自动发现与执行框架。
- **CI/CD**: `.github/workflows/` 提供 release、beta-release、pr-validation 三条流水线。
@@ -48,63 +22,76 @@ graph TD
```mermaid
graph TD
- ROOT["PVE Tools Pro (根)"] --> MAIN["PVE-Tools.sh
主脚本 430KB"]
- ROOT --> WEB["Web/"]
+ ROOT["PVE Tools Pro (根)"] --> MAIN["PVE-Tools.sh
入口脚本 169行"]
+ ROOT --> LIB["lib/
基础设施层"]
+ ROOT --> SRC["src/modules/
功能模块层"]
ROOT --> TOOLS["Tools/"]
ROOT --> MODS["Modules/"]
ROOT --> DOCS["Docs/"]
ROOT --> GHA[".github/"]
+ ROOT --> BUILD["build.sh + dev.sh
构建与开发入口"]
- WEB --> VITEPRESS[".vitepress/
主题/配置/组件"]
- WEB --> PAGES["*.md 文档页面"]
- WEB --> ADVANCED["advanced/
高级教程 10篇"]
- WEB --> ASSETS["assets/ + public/
图片/Logo/SVG"]
+ LIB --> LIBC["config.sh
全局变量/镜像/URL"]
+ LIB --> LIBCORE["core.sh
颜色/日志/UI/备份/GRUB"]
+ LIB --> LIBNET["network.sh
网络检测/镜像选择"]
+ LIB --> LIBRUN["runtime.sh
root守卫/调试/PVE检测"]
- TOOLS --> SYS["系统配置: 5个脚本"]
- TOOLS --> LXC["容器管理: 3个脚本"]
- TOOLS --> MAINT["系统维护: 4个脚本"]
- TOOLS --> MONITOR["监控: 2个脚本"]
+ SRC --> M01["01-optimization
日常优化与通知"]
+ SRC --> M02["02-sources
软件源与系统升级"]
+ SRC --> M03["03-boot-kernel
启动与内核管理"]
+ SRC --> M04["04-gpu-passthrough
硬件直通与显卡"]
+ SRC --> M05["05-vm-container
虚拟机运维与导入"]
+ SRC --> M06["06-networking
宿主机网络与防火墙"]
+ SRC --> M07["07-storage-disk
存储与磁盘维护"]
+ SRC --> M08["08-tools-about
诊断工具与项目信息"]
+ SRC --> M09["09-security
安全中心"]
+ SRC --> M10["10-third-party
第三方工具"]
- MODS --> PLUGINS["插件脚本 (.sh)"]
- MODS --> VGPU["VGPU/libvgpu_*.so"]
+ TOOLS --> T1["系统配置: 5个脚本"]
+ TOOLS --> T2["容器管理: 3个脚本"]
+ TOOLS --> T3["系统维护: 4个脚本"]
+ TOOLS --> T4["监控: 1个脚本"]
- GHA --> WF["workflows/
release/beta/PR"]
+ MODS --> P1["install-zsh.sh"]
+ MODS --> P2["VGPU/*.so"]
+
+ GHA --> W1["workflows/
release/beta/PR"]
click ROOT "./CLAUDE.md" "返回根文档"
- click WEB "./Web/CLAUDE.md" "查看 Web 模块文档"
+ click LIB "./lib/CLAUDE.md" "查看 lib 模块文档"
+ click SRC "./src/CLAUDE.md" "查看 src 模块文档"
click TOOLS "./Tools/CLAUDE.md" "查看 Tools 模块文档"
click MODS "./Modules/CLAUDE.md" "查看 Modules 模块文档"
+ click GHA "./.github/CLAUDE.md" "查看 CI/CD 模块文档"
```
## 模块索引
| 模块路径 | 语言 | 职责 | 入口文件 | 文档 |
|---|---|---|---|---|
-| `/` (根) | Bash | 主脚本,全部功能入口 | `PVE-Tools.sh` | `README.md` |
-| `Web/` | TypeScript/Vue/Markdown | VitePress 文档站 | `Web/index.md`, `Web/.vitepress/config.mts` | [Web/CLAUDE.md](./Web/CLAUDE.md) |
-| `Tools/` | Bash | 第三方系统维护脚本集 | 各 `.sh` 文件 | [Tools/CLAUDE.md](./Tools/CLAUDE.md) |
+| `/` (根) | Bash | 入口脚本,本地/远程模块加载 | `PVE-Tools.sh` (169行) | `README.md` |
+| `lib/` | Bash | 基础设施层:全局变量、日志、UI、网络、运行时 | `config.sh`, `core.sh`, `network.sh`, `runtime.sh` | [lib/CLAUDE.md](./lib/CLAUDE.md) |
+| `src/modules/` | Bash | 功能模块层:10 个子模块,对应主菜单 1-10 | 各 `*/init.sh` | [src/CLAUDE.md](./src/CLAUDE.md) |
+| `Tools/` | Bash | 第三方系统维护脚本集(13个) | 各 `.sh` 文件 | [Tools/CLAUDE.md](./Tools/CLAUDE.md) |
| `Modules/` | Bash/二进制 | 插件市场与模块 | `install-zsh.sh`, `VGPU/*.so` | [Modules/CLAUDE.md](./Modules/CLAUDE.md) |
-| `Docs/` | Markdown | 补充文档 | `future-guide.md`, `README-EN.md` | -- |
-| `.github/` | YAML | CI/CD 工作流与 Issue 模板 | `workflows/*.yml` | -- |
+| `Docs/` | Markdown | 补充文档与重构计划 | `future-guide.md`, `重构计划-PVE-Tools模块化拆分.md` | -- |
+| `.github/` | YAML | CI/CD 工作流与 Issue 模板 | `workflows/*.yml` | [.github/CLAUDE.md](./.github/CLAUDE.md) |
## 技术栈
| 层面 | 技术 | 版本/说明 |
|---|---|---|
| 运行环境 | Proxmox VE 9.x (Debian 13 Trixie) | 要求 root 权限 |
-| 主脚本语言 | GNU Bash | 单一文件,通过 curl 管道分发执行 |
-| 文档站构建 | VitePress | v1.6.4,部署于 Cloudflare Pages |
-| 前端框架 | Vue 3 | v3.5.27,仅用于文档站主题组件 |
-| 图标库 | lucide-vue-next | v0.563.0 |
-| 运行时 | Bun | Web 目录依赖管理(bun.lock) |
+| 主脚本语言 | GNU Bash | 模块化源码;通过 build.sh 组装为单文件分发 |
+| 构建系统 | bash + find + sort | `build.sh` 顺序拼接 lib/ -> src/modules/ -> dist/PVE-Tools.sh |
+| 开发模式 | bash dev.sh | 直接 source 全部源文件,无需构建 |
| CI/CD | GitHub Actions | release / beta-release / PR validation |
-| 编译工具 | shc | 将 Bash 编译为二进制(仅 release 流程) |
+| 编译工具 | shc | 将 dist/PVE-Tools.sh 编译为二进制(仅 release 流程) |
| 许可证 | GPL-3.0 | 详见 `LICENSE` |
-| 分析 | Umami | 文档站匿名访问统计 |
## 运行与开发
-### 使用脚本(用户侧)
+### 用户使用
```bash
# Cloudflare 短域名(推荐)
@@ -113,45 +100,62 @@ bash <(curl -sSL https://pve.oowo.cc/PVE-Tools.sh)
# 中国大陆网络
bash <(curl -sSL https://ghfast.top/raw.githubusercontent.com/PVE-Tools/PVE-Tools-9/main/PVE-Tools.sh)
-# 国际网络 / 本地
-wget https://raw.githubusercontent.com/PVE-Tools/PVE-Tools-9/main/PVE-Tools.sh
-chmod +x PVE-Tools.sh
-sudo ./PVE-Tools.sh
+# 本地开发
+bash dev.sh
```
-### 开发文档站(Web 模块)
+### 开发工作流
```bash
-cd Web
-bun install # 或 npm install
-bun run dev # 启动本地开发服务器
-bun run build # 构建到 .vitepress/dist/
-bun run preview # 预览构建结果
+# 改代码 -> 直接运行验证
+bash dev.sh
+
+# 确认改好了 -> 构建单文件
+bash build.sh
+
+# 验证构建产物
+bash dist/PVE-Tools.sh
+
+# 静态检查
+bash -n PVE-Tools.sh
+bash -n dist/PVE-Tools.sh
+shellcheck -f gcc PVE-Tools.sh
+shellcheck -f gcc dist/PVE-Tools.sh
```
+### 构建原理
+
+`build.sh` 按以下固定顺序拼接:
+1. `lib/config.sh` -- 全局变量定义(必须最先加载)
+2. `lib/core.sh` -- 日志/UI/备份/GRUB(依赖 config.sh 中的变量)
+3. `lib/network.sh` -- 网络检测/镜像选择
+4. `lib/runtime.sh` -- 运行时守卫/main()函数
+5. `src/modules/**/*.sh` -- 按路径名排序(`sort -z`),确保 init.sh 先于同目录其他文件加载
+
### CI/CD 流水线
- **PR 合并到 main/beta**: 触发 shellcheck、Bash 语法检查、版本一致性校验、安全扫描。
-- **推送版本标签 (v*.*.*)**: 触发 Release 工作流,用 shc 编译二进制,自动生成 GitHub Release。
+- **推送版本标签 (v*.*.*)**: 触发 Release 工作流,先执行 `bash build.sh` 构建,再用 shc 编译二进制,自动生成 GitHub Release。
- **推送 beta/alpha 标签**: 触发 Beta Release 工作流。
## 测试策略
| 类型 | 方式 | 说明 |
|---|---|---|
-| 语法检查 | `bash -n PVE-Tools.sh` | CI 中强制通过 |
-| 静态分析 | `shellcheck -f gcc PVE-Tools.sh` | CI 中强制通过 |
+| 语法检查 | `bash -n PVE-Tools.sh`、`bash -n dist/PVE-Tools.sh` | CI 中强制通过 |
+| 静态分析 | `shellcheck -f gcc PVE-Tools.sh` | CI 中强制通过,需额外关注多文件 source 模式 |
| 版本一致性 | 比较脚本内 `CURRENT_VERSION` 与 `VERSION` 文件 | CI 中强制通过 |
| 安全扫描 | 检测 `eval`/`source` 使用 | CI 中告警 |
| 功能测试 | 手动在 PVE 9.x 环境验证 | 无自动化 E2E 测试 |
-**注意**: 本项目目前没有自动化单元测试或集成测试。所有功能验证依赖人工在真实或模拟的 PVE 9.x 环境中测试。
+**注意**: 本项目目前没有自动化单元测试或集成测试。所有功能验证依赖人工在真实或模拟的 PVE 9.x 环境中测试。模块化后,建议在每次 PR 时同时验证 `bash dev.sh` 和 `bash build.sh && bash dist/PVE-Tools.sh` 的行为一致性。
## 编码规范
### Bash 脚本规范
- Shebang: `#!/bin/bash`
+- 版权声明: 每个文件头部包含 `# SPDX-License-Identifier: GPL-3.0-only` 和 `# Copyright (C) 2026 Ciriu Networks`
- 缩进: 4 空格
- 函数命名: `snake_case`(如 `vm_validate_new_vmid`、`host_network_get_bridges`)
- 变量命名: `UPPER_SNAKE`(全局配置常量)、`lower_case`(局部变量)
@@ -162,23 +166,21 @@ bun run preview # 预览构建结果
- 配置备份: 修改系统配置文件前调用 `backup_file()` 自动备份到 `/var/backups/pve-tools/`
- 幂等性: GRUB 参数等配置通过专用幂等管理函数修改,支持增删查
- 日志文件: 所有操作记录到 `/var/log/pve-tools.log`
-
-### 文档站 (Vue/TypeScript) 规范
-
-- 使用 VitePress 默认主题扩展
-- 自定义组件放置在 `Web/.vitepress/theme/components/`
-- 组件使用 `