diff --git a/docs/00-快速开始/01-项目介绍.md b/docs/00-快速开始/01-项目介绍.md new file mode 100644 index 0000000..a0b4b8e --- /dev/null +++ b/docs/00-快速开始/01-项目介绍.md @@ -0,0 +1,156 @@ +# 项目介绍 + +## 什么是阑山桌面 + +**LanMountainDesktop(阑山桌面)** 是一个基于 .NET 和 Avalonia UI 的模块化桌面定制平台,旨在为用户提供高度可定制的桌面体验。 + +### 核心特性 + +#### 🧩 插件系统 +- **进程内插件** - 当前稳定的插件运行模式 +- **进程隔离插件** - 未来支持的隔离模式(规划中) +- **插件 SDK** - 完整的插件开发工具包 +- **插件市场** - 应用内插件浏览和安装 + +#### 🎨 桌面组件(Widget) +- **可视化编辑** - 拖拽式布局编辑 +- **多种组件** - 时钟、天气、日历、倒计时等 +- **自定义组件** - 通过插件扩展新组件 +- **主题支持** - 亮色/暗色模式自适应 + +#### 🚀 Air APP 系统 +- **独立应用** - 在桌面环境中运行的独立窗口应用 +- **生命周期管理** - 统一的应用启动、激活和清理 +- **窗口模式** - 标准、无边框、全屏、工具窗口 +- **IPC 通信** - 与桌面宿主的双向通信 + +#### ⚙️ 设置系统 +- **分域管理** - 按功能模块组织设置 +- **持久化** - 自动保存到本地 +- **插件集成** - 插件可注册自己的设置页 + +#### 🔄 更新系统 +- **增量更新** - 只下载变更文件,节省带宽 +- **原子化更新** - 保证更新完整性,失败自动回滚 +- **多版本管理** - 支持版本共存和回退 +- **签名验证** - RSA 签名确保安全性 + +## 技术架构 + +### 核心技术栈 + +| 技术 | 版本 | 用途 | +|------|------|------| +| .NET | 10.0 | 应用框架 | +| Avalonia UI | 12.x | 跨平台 UI 框架 | +| FluentAvalonia | 2.x | Fluent Design 控件 | +| CommunityToolkit.Mvvm | 8.x | MVVM 框架 | +| VeloPack | 最新 | 应用更新系统 | +| dotnetCampus.Ipc | 最新 | 进程间通信 | + +### 项目结构 + +``` +LanMountainDesktop/ +├── LanMountainDesktop/ # 主桌面宿主应用 +├── LanMountainDesktop.Launcher/ # 启动器(OOBE、Splash、版本管理) +├── LanMountainDesktop.AirAppRuntime/ # Air APP 运行时容器 +├── LanMountainDesktop.AirAppHost/ # Air APP 渲染进程 +├── LanMountainDesktop.PluginSdk/ # 插件 SDK +├── LanMountainDesktop.Shared.Contracts/ # 共享契约类型 +├── LanMountainDesktop.Settings.Core/ # 设置系统 +├── LanMountainDesktop.Appearance/ # 主题和外观 +├── LanMountainDesktop.DesktopComponents.Runtime/# 组件运行时 +└── LanMountainDesktop.PluginIsolation.*/ # 插件隔离(未来) +``` + +### 启动流程 + +``` +用户启动 Launcher.exe + ↓ +首次启动 → OOBE 引导 + ↓ +显示 Splash 启动动画 + ↓ +预启动 AirAppRuntime(框架依赖 JIT 进程) + ↓ +扫描 app-* 目录,选择最佳版本 + ↓ +启动 LanMountainDesktop.exe(主程序) + ↓ +初始化日志、遥测、Host 生命周期 + ↓ +加载主题、语言、设置 + ↓ +初始化桌面壳层、主窗口、托盘 + ↓ +加载插件、注册组件 + ↓ +桌面就绪 +``` + +## 应用场景 + +### 个人用户 +- **桌面定制** - 打造个性化的桌面环境 +- **效率工具** - 快速访问常用功能和信息 +- **信息聚合** - 在桌面上展示天气、日历、待办等 + +### 开发者 +- **插件开发** - 为桌面扩展新功能 +- **Air APP 开发** - 创建独立的桌面应用 +- **组件开发** - 设计自定义桌面组件 + +### 企业用户 +- **定制部署** - 企业专用的桌面环境 +- **信息看板** - 展示企业数据和通知 +- **工作流集成** - 集成企业工作流工具 + +## 版本与支持 + +### 当前版本 +- **稳定版**: 查看 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) +- **预览版**: 通过更新频道切换到 Preview + +### 平台支持 +- ✅ **Windows 10/11** - 完整支持 +- 🚧 **Linux** - 计划支持 +- 🚧 **macOS** - 计划支持 + +### 系统要求 +- **操作系统**: Windows 10 1809 或更高版本 +- **.NET Runtime**: 自动包含,无需单独安装 +- **内存**: 建议 4GB 或更高 +- **磁盘**: 安装需要约 200MB 空间 + +## 开发理念 + +### 模块化设计 +所有功能通过插件和组件实现,核心保持精简。 + +### 开放生态 +鼓励社区开发插件和组件,共建生态系统。 + +### 稳定可靠 +原子化更新、版本回退、进程隔离等机制保证系统稳定。 + +### 性能优先 +增量更新、延迟加载、异步渲染等优化确保流畅体验。 + +## 开源协议 + +本项目采用 [MIT License](https://github.com/HelloWRC/LanMountainDesktop/blob/main/LICENSE) 开源协议。 + +## 社区与贡献 + +- **GitHub**: https://github.com/HelloWRC/LanMountainDesktop +- **Issues**: 报告 Bug 和功能建议 +- **Discussions**: 技术讨论和问答 +- **Pull Requests**: 欢迎贡献代码和文档 + +## 下一步 + +- [快速安装](02-快速安装.md) - 安装阑山桌面 +- [开发环境配置](03-开发环境配置.md) - 配置开发环境 +- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件 diff --git a/docs/00-快速开始/02-快速安装.md b/docs/00-快速开始/02-快速安装.md new file mode 100644 index 0000000..f310c0b --- /dev/null +++ b/docs/00-快速开始/02-快速安装.md @@ -0,0 +1,277 @@ +# 快速安装 + +本指南将帮助你快速安装和运行阑山桌面。 + +## 安装方式 + +### 方式一:使用安装包(推荐) + +#### 下载安装包 + +访问 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) 页面,下载最新版本的安装包: + +- **Windows x64**: `LanMountainDesktop-Setup-{version}-x64.exe` + +#### 运行安装程序 + +1. 双击下载的安装包 +2. 按照安装向导提示完成安装 +3. 安装完成后,启动器会自动运行 + +#### 首次启动 (OOBE) + +首次启动时会显示欢迎页面: + +1. **欢迎页** - 项目介绍和基本说明 +2. **权限确认** - 了解应用所需的权限 +3. **基础设置** - 选择主题、语言等 +4. **完成** - 开始使用阑山桌面 + +### 方式二:便携版 + +#### 下载便携包 + +从 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) 下载: + +- **Windows x64**: `LanMountainDesktop-Portable-{version}-x64.zip` + +#### 解压并运行 + +```powershell +# 解压到目标目录 +Expand-Archive -Path LanMountainDesktop-Portable-1.0.0-x64.zip -DestinationPath C:\LanMountainDesktop + +# 进入目录 +cd C:\LanMountainDesktop + +# 启动应用 +.\LanMountainDesktop.Launcher.exe +``` + +#### 便携版特点 + +- ✅ 无需安装,解压即用 +- ✅ 数据存储在程序目录 +- ✅ 适合 U 盘或多机器同步使用 +- ⚠️ 需要手动创建快捷方式 +- ⚠️ 不会自动添加到开始菜单 + +## 目录结构 + +### 安装版目录结构 + +``` +安装根目录/ +├── LanMountainDesktop.Launcher.exe # 启动器(唯一入口) +├── app-1.0.0/ # 版本目录 +│ ├── .current # 当前版本标记 +│ ├── LanMountainDesktop.exe # 主程序 +│ ├── *.dll # 依赖库 +│ └── ... +├── LanMountainDesktop.AirAppRuntime.exe # Air APP 运行时 +├── .Launcher/ # 启动器数据 +│ ├── state/ # OOBE 状态 +│ └── update/ # 更新缓存 +└── unins000.exe # 卸载程序 +``` + +### 用户数据目录 + +``` +%LOCALAPPDATA%\LanMountainDesktop\ +├── settings/ # 设置文件 +├── plugins/ # 已安装插件 +├── logs/ # 日志文件 +├── cache/ # 缓存数据 +└── telemetry/ # 遥测数据(可选) +``` + +### 便携版目录结构 + +便携版的用户数据存储在程序目录的 `Data/` 文件夹下: + +``` +LanMountainDesktop/ +├── LanMountainDesktop.Launcher.exe +├── app-1.0.0/ +├── Data/ # 便携数据目录 +│ ├── settings/ +│ ├── plugins/ +│ ├── logs/ +│ └── cache/ +└── ... +``` + +## 启动选项 + +### 正常启动 + +```powershell +# 双击启动器 +.\LanMountainDesktop.Launcher.exe + +# 或从开始菜单启动 +``` + +### 命令行选项 + +```powershell +# 显示版本信息 +.\LanMountainDesktop.Launcher.exe --version + +# 显示帮助信息 +.\LanMountainDesktop.Launcher.exe --help + +# 重置 OOBE 状态(重新显示欢迎页) +.\LanMountainDesktop.Launcher.exe --reset-oobe + +# 启动到指定版本 +.\LanMountainDesktop.Launcher.exe --version 1.0.0 + +# 安装插件(本地维护命令) +.\LanMountainDesktop.Launcher.exe plugin install path\to\plugin.laapp + +# 应用插件更新队列(本地维护命令) +.\LanMountainDesktop.Launcher.exe plugin update +``` + +## 验证安装 + +### 检查应用状态 + +启动后,你应该看到: + +1. **桌面组件** - 默认的时钟或其他组件显示在桌面上 +2. **系统托盘图标** - 阑山桌面的托盘图标 +3. **主窗口** - 可通过托盘图标打开 + +### 检查日志 + +如果遇到问题,可以查看日志: + +```powershell +# 打开日志目录 +explorer %LOCALAPPDATA%\LanMountainDesktop\logs + +# 查看最新日志 +Get-Content %LOCALAPPDATA%\LanMountainDesktop\logs\latest.log -Tail 50 +``` + +### 检查版本信息 + +1. 右键点击托盘图标 +2. 选择"关于"或"设置" +3. 查看版本号和构建信息 + +## 常见问题 + +### 安装失败 + +**问题**: 安装程序报错或无法完成安装 + +**解决方案**: +1. 确认 Windows 版本 ≥ Windows 10 1809 +2. 以管理员身份运行安装程序 +3. 关闭杀毒软件和防火墙 +4. 检查磁盘空间是否充足(≥ 500MB) +5. 查看安装日志:`%TEMP%\LanMountainDesktop-Setup.log` + +### 启动失败 + +**问题**: 双击启动器没有反应 + +**解决方案**: +1. 检查进程管理器是否已有实例运行 +2. 查看日志文件:`%LOCALAPPDATA%\LanMountainDesktop\logs\latest.log` +3. 尝试以管理员身份运行 +4. 检查是否有其他应用占用端口或资源 + +### OOBE 无法显示 + +**问题**: 首次启动没有显示欢迎页面 + +**解决方案**: +1. 删除 OOBE 状态文件: + ```powershell + Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop\.launcher\state\oobe-state.json" -Force + ``` +2. 重新启动应用 + +### 组件不显示 + +**问题**: 桌面上看不到任何组件 + +**解决方案**: +1. 右键点击桌面空白处 +2. 选择"添加组件" +3. 选择一个组件添加到桌面 +4. 检查组件是否被其他窗口遮挡 +5. 确认桌面图层设置正确(设置 → 桌面 → 图层模式) + +## 卸载应用 + +### 使用控制面板 + +1. 打开"设置" → "应用" → "已安装的应用" +2. 找到"LanMountainDesktop" +3. 点击"卸载"按钮 +4. 按照向导完成卸载 + +### 使用卸载程序 + +```powershell +# 运行卸载程序 +.\unins000.exe +``` + +### 清理残留数据 + +卸载后,用户数据不会自动删除。如需彻底清理: + +```powershell +# 删除用户数据目录 +Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop" -Recurse -Force + +# 删除 Launcher 状态 +Remove-Item -Path "$env:LOCALAPPDATA\LanMountainDesktop\.launcher" -Recurse -Force + +# 删除缓存(如果存在) +Remove-Item -Path "$env:TEMP\LanMountainDesktop" -Recurse -Force -ErrorAction SilentlyContinue +``` + +## 更新应用 + +### 自动更新(推荐) + +阑山桌面支持自动更新: + +1. 应用会在后台检查更新 +2. 发现新版本时会提示下载 +3. 下载完成后重启应用自动安装 +4. 支持增量更新,只下载变更文件 + +### 手动更新 + +如果需要手动更新: + +1. 访问 [GitHub Releases](https://github.com/HelloWRC/LanMountainDesktop/releases) +2. 下载最新版本的安装包 +3. 运行安装包,选择"覆盖安装" +4. 安装完成后启动新版本 + +### 更新频道 + +可以在设置中切换更新频道: + +- **Stable(稳定版)**: 只接收正式发布的版本 +- **Preview(预览版)**: 接收所有版本,包括预发布版本 + +``` +设置 → 更新 → 更新频道 → 选择频道 +``` + +## 下一步 + +- [开发环境配置](03-开发环境配置.md) - 配置开发环境 +- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件 +- [使用教程](04-基础使用.md) - 了解基本使用方法 diff --git a/docs/00-快速开始/03-开发环境配置.md b/docs/00-快速开始/03-开发环境配置.md new file mode 100644 index 0000000..2c91011 --- /dev/null +++ b/docs/00-快速开始/03-开发环境配置.md @@ -0,0 +1,380 @@ +# 开发环境配置 + +本指南将帮助你配置阑山桌面的开发环境,以便进行插件开发、组件开发或贡献核心代码。 + +## 系统要求 + +### 操作系统 +- Windows 10 1809 或更高版本(推荐 Windows 11) +- Linux(实验性支持) +- macOS(计划支持) + +### 硬件要求 +- **CPU**: 双核或更高 +- **内存**: 8GB 或更高(推荐 16GB) +- **磁盘**: 至少 10GB 可用空间 +- **显示器**: 1920x1080 或更高分辨率 + +## 必需工具 + +### 1. .NET SDK + +阑山桌面基于 .NET 10,需要安装对应的 SDK。 + +#### 下载并安装 + +访问 [.NET 官网](https://dotnet.microsoft.com/download/dotnet/10.0) 下载并安装 .NET 10 SDK。 + +#### 验证安装 + +```powershell +dotnet --version +# 应输出: 10.0.x +``` + +### 2. IDE 选择 + +#### 选项 A: Visual Studio 2022(推荐) + +**下载**: [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) + +**工作负载**: +- ✅ .NET 桌面开发 +- ✅ ASP.NET 和 Web 开发(用于调试工具) +- ✅ .NET 跨平台开发 + +**推荐扩展**: +- Avalonia for Visual Studio +- GitHub Copilot(可选) +- ReSharper 或 Rider(可选) + +#### 选项 B: JetBrains Rider + +**下载**: [JetBrains Rider](https://www.jetbrains.com/rider/) + +**优势**: +- 优秀的代码分析和重构功能 +- 内置 Avalonia 支持 +- 跨平台支持 + +#### 选项 C: Visual Studio Code + +**下载**: [Visual Studio Code](https://code.visualstudio.com/) + +**必需扩展**: +- C# Dev Kit +- Avalonia for VSCode +- .NET Extension Pack + +**配置**: +```json +// .vscode/settings.json +{ + "dotnet.defaultSolution": "LanMountainDesktop.sln", + "omnisharp.enableRoslynAnalyzers": true, + "omnisharp.enableEditorConfigSupport": true +} +``` + +### 3. Git + +#### 下载并安装 + +- **Windows**: [Git for Windows](https://git-scm.com/download/win) +- **Linux**: `sudo apt install git` 或 `sudo dnf install git` +- **macOS**: `brew install git` + +#### 验证安装 + +```powershell +git --version +# 应输出: git version 2.x.x +``` + +#### 配置 Git + +```powershell +git config --global user.name "你的名字" +git config --global user.email "your.email@example.com" +``` + +## 可选工具 + +### 1. PowerShell 7+ + +用于运行构建和发布脚本。 + +```powershell +# 安装 PowerShell 7 +winget install Microsoft.PowerShell +``` + +### 2. Windows Terminal + +更好的终端体验。 + +```powershell +# 安装 Windows Terminal +winget install Microsoft.WindowsTerminal +``` + +### 3. Avalonia UI 预览器 + +#### Visual Studio 扩展 + +在 Visual Studio 中安装"Avalonia for Visual Studio"扩展,可以实时预览 AXAML 文件。 + +#### JetBrains Rider + +Rider 内置了 Avalonia 预览器,无需额外安装。 + +## 克隆仓库 + +### 从 GitHub 克隆 + +```powershell +# 克隆主仓库 +git clone https://github.com/HelloWRC/LanMountainDesktop.git + +# 进入目录 +cd LanMountainDesktop + +# 切换到开发分支(如果有) +git checkout develop +``` + +### 初始化子模块 + +如果项目使用了 Git 子模块: + +```powershell +git submodule update --init --recursive +``` + +## 构建项目 + +### 还原依赖 + +```powershell +# 还原 NuGet 包 +dotnet restore +``` + +### 构建解决方案 + +```powershell +# 构建整个解决方案 +dotnet build + +# 或者构建特定项目 +dotnet build LanMountainDesktop/LanMountainDesktop.csproj +``` + +### 运行应用 + +```powershell +# 方式 1: 通过 Launcher 启动(推荐) +dotnet run --project LanMountainDesktop.Launcher + +# 方式 2: 直接启动主程序(开发模式) +dotnet run --project LanMountainDesktop + +# 方式 3: 使用 Visual Studio +# 按 F5 启动调试 +``` + +## 项目结构 + +### 解决方案结构 + +``` +LanMountainDesktop.sln +├── LanMountainDesktop # 主程序 +├── LanMountainDesktop.Launcher # 启动器 +├── LanMountainDesktop.PluginSdk # 插件 SDK +├── LanMountainDesktop.AirAppRuntime # Air APP 运行时 +├── LanMountainDesktop.AirAppHost # Air APP 宿主 +├── LanMountainDesktop.Shared.Contracts # 共享契约 +└── LanMountainDesktop.Tests # 测试项目 +``` + +### 重要目录 + +| 目录 | 说明 | +|------|------| +| `LanMountainDesktop/Views/` | UI 视图文件 (.axaml) | +| `LanMountainDesktop/ViewModels/` | 视图模型 | +| `LanMountainDesktop/Services/` | 业务服务 | +| `LanMountainDesktop/ComponentSystem/` | 组件系统 | +| `LanMountainDesktop/plugins/` | 插件运行时 | +| `scripts/` | 构建和发布脚本 | +| `docs/` | 文档 | + +## 安装插件模板 + +### 安装官方模板 + +```powershell +# 安装插件模板 +dotnet new install LanMountainDesktop.PluginTemplate + +# 验证安装 +dotnet new list | Select-String "lmd" +``` + +### 创建测试插件 + +```powershell +# 创建新插件 +dotnet new lmd-plugin -n MyTestPlugin + +# 进入插件目录 +cd MyTestPlugin + +# 构建插件 +dotnet build + +# 打包为 .laapp +dotnet publish -c Release +``` + +## 调试配置 + +### Visual Studio 调试配置 + +1. 右键点击"LanMountainDesktop.Launcher"项目 +2. 选择"设为启动项目" +3. 按 F5 开始调试 + +### 多项目调试 + +如果需要同时调试 Launcher 和 Host: + +1. 右键点击解决方案 +2. 选择"属性" → "启动项目" +3. 选择"多个启动项目" +4. 设置"LanMountainDesktop.Launcher"为"启动" + +### VSCode 调试配置 + +创建 `.vscode/launch.json`: + +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Launcher", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/LanMountainDesktop.Launcher/bin/Debug/net10.0/LanMountainDesktop.Launcher.exe", + "args": [], + "cwd": "${workspaceFolder}/LanMountainDesktop.Launcher/bin/Debug/net10.0", + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": "Launch Host (Direct)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/LanMountainDesktop/bin/Debug/net10.0/LanMountainDesktop.exe", + "args": [], + "cwd": "${workspaceFolder}/LanMountainDesktop/bin/Debug/net10.0", + "console": "internalConsole", + "stopAtEntry": false + } + ] +} +``` + +## 运行测试 + +### 运行所有测试 + +```powershell +dotnet test +``` + +### 运行特定测试项目 + +```powershell +dotnet test LanMountainDesktop.Tests/LanMountainDesktop.Tests.csproj +``` + +### 带覆盖率的测试 + +```powershell +dotnet test --collect:"XPlat Code Coverage" +``` + +## 代码规范 + +### EditorConfig + +项目包含 `.editorconfig` 文件,自动配置代码风格。确保你的 IDE 支持 EditorConfig。 + +### 代码分析 + +项目启用了 Roslyn 分析器,编译时会显示代码质量警告。 + +### 推荐的编码规范 + +- 使用 `nullable` 引用类型 +- 遵循 C# 命名约定 +- 优先使用 `async/await` 而不是 `Task.Wait()` +- 为公共 API 编写 XML 文档注释 + +## 常见问题 + +### 编译错误: SDK 版本不匹配 + +**问题**: `error NETSDK1045: The current .NET SDK does not support targeting .NET 10.0` + +**解决方案**: +```powershell +# 检查 SDK 版本 +dotnet --list-sdks + +# 如果没有 10.0.x,请安装 .NET 10 SDK +``` + +### NuGet 包还原失败 + +**问题**: `error NU1101: Unable to find package` + +**解决方案**: +```powershell +# 清理 NuGet 缓存 +dotnet nuget locals all --clear + +# 重新还原 +dotnet restore +``` + +### Avalonia 预览器不工作 + +**问题**: AXAML 文件无法预览 + +**解决方案**: +1. 确保安装了 Avalonia 扩展 +2. 重启 IDE +3. 检查项目是否正确引用了 Avalonia 包 +4. 尝试清理并重新构建项目 + +### 调试时无法附加进程 + +**问题**: 无法附加到 LanMountainDesktop 进程 + +**解决方案**: +1. 确保没有其他实例正在运行 +2. 以管理员身份运行 IDE +3. 检查防火墙设置 +4. 使用"直接启动 Host"模式而不是通过 Launcher + +## 下一步 + +- [插件开发快速开始](../01-插件开发/01-快速开始/01-环境准备.md) - 开始开发插件 +- [整体架构](../04-架构与实现/01-整体架构.md) - 了解系统架构 +- [贡献指南](05-贡献指南.md) - 贡献代码到项目 diff --git a/docs/01-插件开发/01-快速开始/01-环境准备.md b/docs/01-插件开发/01-快速开始/01-环境准备.md new file mode 100644 index 0000000..77e5ede --- /dev/null +++ b/docs/01-插件开发/01-快速开始/01-环境准备.md @@ -0,0 +1,345 @@ +# 插件开发 - 环境准备 + +## 前置要求 + +在开始开发插件之前,请确保你已经: + +- ✅ 安装了 .NET 10 SDK +- ✅ 安装了支持 C# 的 IDE(Visual Studio 2022 / Rider / VS Code) +- ✅ 了解 C# 基础语法 +- ✅ 了解 Avalonia UI 基础(或 WPF,两者相似) + +> 如果还没有配置开发环境,请先阅读 [开发环境配置](../../00-快速开始/03-开发环境配置.md) + +## 安装插件模板 + +### 安装官方模板 + +阑山桌面提供了官方的插件项目模板,可以快速创建插件项目骨架。 + +```powershell +# 安装插件模板包 +dotnet new install LanMountainDesktop.PluginTemplate + +# 验证安装成功 +dotnet new list | Select-String "lmd" +``` + +你应该看到类似输出: + +``` +lmd-plugin LanMountainDesktop Plugin C# LanMountainDesktop/Plugin +``` + +### 模板版本管理 + +```powershell +# 查看已安装的模板 +dotnet new list lmd + +# 更新到最新版本 +dotnet new install LanMountainDesktop.PluginTemplate --force + +# 卸载模板 +dotnet new uninstall LanMountainDesktop.PluginTemplate +``` + +## 创建第一个插件项目 + +### 使用模板创建项目 + +```powershell +# 创建新插件项目 +dotnet new lmd-plugin -n MyFirstPlugin + +# 进入项目目录 +cd MyFirstPlugin +``` + +### 项目结构 + +创建后的项目结构如下: + +``` +MyFirstPlugin/ +├── MyFirstPlugin.csproj # 项目文件 +├── Plugin.cs # 插件入口类 +├── plugin.json # 插件清单 +├── Components/ # 组件目录 +│ └── SampleComponent.cs # 示例组件 +├── Views/ # 视图目录 +│ └── SampleComponentView.axaml # 组件视图 +│ └── SampleComponentView.axaml.cs # 视图代码后台 +├── ViewModels/ # 视图模型 +│ └── SampleComponentViewModel.cs # 组件视图模型 +├── Settings/ # 设置页目录 +│ └── PluginSettingsPage.axaml # 设置页视图 +│ └── PluginSettingsPage.axaml.cs # 设置页代码 +├── Assets/ # 资源目录 +│ └── icon.png # 插件图标 +└── Localization/ # 本地化目录 + └── Strings.resx # 字符串资源 +``` + +## 理解插件清单 + +### plugin.json 文件 + +`plugin.json` 是插件的元数据文件,定义了插件的基本信息。 + +```json +{ + "Id": "com.example.myfirstplugin", + "Name": "My First Plugin", + "Version": "1.0.0", + "Author": "Your Name", + "Description": "My first LanMountainDesktop plugin", + "MinHostVersion": "1.0.0", + "SdkVersion": "5.0.0", + "Dependencies": [], + "Permissions": [ + "Network.Access" + ], + "Icon": "Assets/icon.png", + "Homepage": "https://github.com/yourusername/myfirstplugin", + "Repository": "https://github.com/yourusername/myfirstplugin.git" +} +``` + +### 字段说明 + +| 字段 | 必需 | 说明 | +|------|------|------| +| `Id` | ✅ | 插件唯一标识符,建议使用反向域名格式 | +| `Name` | ✅ | 插件显示名称 | +| `Version` | ✅ | 插件版本号,遵循语义化版本 | +| `Author` | ✅ | 插件作者 | +| `Description` | ✅ | 插件简介 | +| `MinHostVersion` | ✅ | 最低宿主版本要求 | +| `SdkVersion` | ✅ | 使用的 SDK 版本 | +| `Dependencies` | ❌ | 依赖的其他插件 ID 列表 | +| `Permissions` | ❌ | 插件所需权限列表 | +| `Icon` | ❌ | 插件图标路径 | +| `Homepage` | ❌ | 插件主页 URL | +| `Repository` | ❌ | 源码仓库 URL | + +### 版本号规范 + +插件版本号遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/): + +``` +主版本号.次版本号.修订号 + +例如: 1.2.3 +``` + +- **主版本号**: 不兼容的 API 修改 +- **次版本号**: 向下兼容的功能性新增 +- **修订号**: 向下兼容的问题修正 + +## 理解项目文件 + +### MyFirstPlugin.csproj + +```xml + + + net10.0 + enable + enable + + + com.example.myfirstplugin + My First Plugin + 1.0.0 + + + Library + + + + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + +``` + +### 关键配置项 + +- **TargetFramework**: 必须是 `net10.0` +- **OutputType**: 必须是 `Library`(插件是类库,不是可执行文件) +- **Nullable**: 建议启用,提高代码质量 +- **PluginId/PluginName/PluginVersion**: 应与 `plugin.json` 保持一致 + +## 构建插件 + +### 还原依赖 + +```powershell +dotnet restore +``` + +### 构建项目 + +```powershell +# Debug 模式 +dotnet build + +# Release 模式 +dotnet build -c Release +``` + +### 查看输出 + +构建成功后,输出目录结构: + +``` +bin/Debug/net10.0/ +├── MyFirstPlugin.dll # 主程序集 +├── MyFirstPlugin.pdb # 调试符号 +├── plugin.json # 插件清单 +├── Assets/ # 资源文件 +│ └── icon.png +└── *.dll # 依赖程序集 +``` + +## 调试插件 + +### 方法一:复制到插件目录(推荐) + +```powershell +# 构建插件 +dotnet build + +# 复制到宿主的插件目录 +$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin" +New-Item -ItemType Directory -Path $pluginDir -Force +Copy-Item -Path "bin\Debug\net10.0\*" -Destination $pluginDir -Recurse -Force + +# 启动宿主应用 +# (确保宿主在 Debug 模式下构建,这样可以附加调试器) +``` + +### 方法二:使用符号链接 + +在开发模式下,可以创建符号链接避免每次复制: + +```powershell +# 创建符号链接(需要管理员权限) +$pluginDir = "$env:LOCALAPPDATA\LanMountainDesktop\plugins\MyFirstPlugin" +$buildDir = "$(pwd)\bin\Debug\net10.0" + +New-Item -ItemType SymbolicLink -Path $pluginDir -Target $buildDir -Force +``` + +### 方法三:配置宿主调试路径 + +如果你有宿主源码,可以修改宿主的插件搜索路径指向你的插件构建目录。 + +在宿主项目的 `appsettings.Development.json` 中: + +```json +{ + "PluginPaths": [ + "C:\\Dev\\MyFirstPlugin\\bin\\Debug\\net10.0" + ] +} +``` + +### 附加调试器 + +1. 启动宿主应用(LanMountainDesktop) +2. 在 Visual Studio 中,选择"调试" → "附加到进程" +3. 找到 `LanMountainDesktop.exe` 进程 +4. 点击"附加" +5. 在插件代码中设置断点 + +## 查看日志 + +### 日志位置 + +``` +%LOCALAPPDATA%\LanMountainDesktop\logs\latest.log +``` + +### 实时查看日志 + +```powershell +# PowerShell +Get-Content "$env:LOCALAPPDATA\LanMountainDesktop\logs\latest.log" -Wait -Tail 50 +``` + +### 日志级别 + +- **Trace**: 最详细的信息,用于诊断 +- **Debug**: 调试信息 +- **Information**: 一般信息 +- **Warning**: 警告信息 +- **Error**: 错误信息 +- **Critical**: 严重错误 + +## 常见问题 + +### 插件没有被加载 + +**检查清单**: +1. 确认 `plugin.json` 存在且格式正确 +2. 确认插件 DLL 文件存在 +3. 查看日志文件中的错误信息 +4. 确认插件 ID 唯一,没有与其他插件冲突 +5. 确认 SDK 版本匹配 + +### 编译错误:找不到类型 + +**问题**: `error CS0246: The type or namespace name 'IPlugin' could not be found` + +**解决方案**: +```powershell +# 确认引用了 PluginSdk +dotnet add package LanMountainDesktop.PluginSdk --version 5.0.0 + +# 清理并重新构建 +dotnet clean +dotnet build +``` + +### Avalonia 视图无法编译 + +**问题**: AXAML 文件编译错误 + +**解决方案**: +1. 确认安装了 Avalonia NuGet 包 +2. 检查 AXAML 语法是否正确 +3. 确认 `AvaloniaResource` 项已配置在 csproj 中 +4. 清理并重新构建项目 + +## 下一步 + +现在你已经完成了环境准备,可以继续: + +- [创建第一个插件](02-创建第一个插件.md) - 实现插件功能 +- [插件生命周期](../02-核心概念/01-插件生命周期.md) - 理解插件运行机制 +- [组件系统](../02-核心概念/02-组件系统.md) - 创建桌面组件 diff --git a/docs/01-插件开发/README.md b/docs/01-插件开发/README.md new file mode 100644 index 0000000..b77dfb7 --- /dev/null +++ b/docs/01-插件开发/README.md @@ -0,0 +1,266 @@ +# 插件开发完整指南 + +欢迎来到阑山桌面插件开发指南!本章节将带你从零开始,掌握插件开发的完整流程。 + +## 📚 学习路径 + +### 初学者路径 + +如果你是第一次开发阑山桌面插件,请按以下顺序学习: + +1. **[环境准备](01-快速开始/01-环境准备.md)** - 配置开发环境和工具 +2. **[创建第一个插件](01-快速开始/02-创建第一个插件.md)** - 快速上手 +3. **[插件生命周期](02-核心概念/01-插件生命周期.md)** - 理解插件运行机制 +4. **[组件系统](02-核心概念/02-组件系统.md)** - 创建桌面组件 + +### 进阶路径 + +已经了解基础,想要深入学习? + +1. **[设置系统](02-核心概念/03-设置系统.md)** - 管理插件配置 +2. **[主题与外观](02-核心概念/04-主题外观.md)** - 适配暗色/亮色模式 +3. **[插件通信](02-核心概念/05-插件通信.md)** - 插件间数据交互 +4. **[IPC 公共服务](03-API参考/05-IPC公共服务.md)** - 对外提供服务 + +### 实战路径 + +通过完整案例学习: + +1. **[天气组件插件](04-实战案例/01-天气组件.md)** - 完整的组件开发 +2. **[待办事项插件](04-实战案例/02-待办事项.md)** - 数据持久化 +3. **[RSS 阅读器](04-实战案例/03-RSS阅读器.md)** - 网络请求和列表展示 +4. **[系统监控插件](04-实战案例/04-系统监控.md)** - 系统信息获取 + +## 🎯 核心概念 + +### 什么是插件? + +插件是扩展阑山桌面功能的独立模块,可以: + +- ✅ 添加新的桌面组件(Widget) +- ✅ 注册设置页面 +- ✅ 提供后台服务 +- ✅ 与其他插件通信 +- ✅ 对外提供 IPC 服务 + +### 插件架构 + +``` +┌─────────────────────────────────────┐ +│ LanMountainDesktop Host │ +│ (桌面宿主 - 主程序) │ +├─────────────────────────────────────┤ +│ Plugin Runtime (插件运行时) │ +│ ┌────────────┐ ┌────────────┐ │ +│ │ Plugin A │ │ Plugin B │ │ +│ ├────────────┤ ├────────────┤ │ +│ │ Components │ │ Components │ │ +│ │ Settings │ │ Settings │ │ +│ │ Services │ │ Services │ │ +│ └────────────┘ └────────────┘ │ +└─────────────────────────────────────┘ +``` + +### 插件 SDK 版本 + +| SDK 版本 | 发布时间 | 主要特性 | +|---------|---------|---------| +| **5.0.0** | 2025.05 | 当前版本 - 进程隔离准备、IPC 公共服务 | +| 4.0.0 | 2025.03 | 组件系统重构、设置域管理 | +| 3.0.0 | 2025.01 | Avalonia 12 升级 | +| 2.0.0 | 2024.11 | 稳定 API,插件市场支持 | +| 1.0.0 | 2024.09 | 初始版本 | + +## 📖 文档结构 + +### [01-快速开始](01-快速开始/) + +快速上手,从零到一创建插件 + +- [环境准备](01-快速开始/01-环境准备.md) - 安装工具和模板 +- [创建第一个插件](01-快速开始/02-创建第一个插件.md) - 实现基本功能 +- [调试与测试](01-快速开始/03-调试测试.md) - 调试技巧 +- [打包插件](01-快速开始/04-打包插件.md) - 生成 .laapp 文件 + +### [02-核心概念](02-核心概念/) + +深入理解插件系统的工作原理 + +- [插件生命周期](02-核心概念/01-插件生命周期.md) - 加载、初始化、卸载 +- [组件系统](02-核心概念/02-组件系统.md) - 桌面组件的创建和管理 +- [设置系统](02-核心概念/03-设置系统.md) - 配置持久化 +- [主题与外观](02-核心概念/04-主题外观.md) - 适配主题和圆角系统 +- [插件通信](02-核心概念/05-插件通信.md) - 插件间协作 + +### [03-API参考](03-API参考/) + +完整的 API 文档和使用示例 + +- [IPlugin 接口](03-API参考/01-IPlugin接口.md) - 插件入口 +- [IPluginContext](03-API参考/02-IPluginContext.md) - 插件上下文 +- [组件 API](03-API参考/03-组件API.md) - 组件开发接口 +- [设置 API](03-API参考/04-设置API.md) - 设置管理接口 +- [IPC 公共服务](03-API参考/05-IPC公共服务.md) - 对外服务接口 +- [日志 API](03-API参考/06-日志API.md) - 日志记录 + +### [04-实战案例](04-实战案例/) + +通过完整示例学习插件开发 + +- [天气组件](04-实战案例/01-天气组件.md) - API 调用、数据展示 +- [待办事项](04-实战案例/02-待办事项.md) - 数据持久化、CRUD +- [RSS 阅读器](04-实战案例/03-RSS阅读器.md) - 网络请求、列表 +- [系统监控](04-实战案例/04-系统监控.md) - 系统信息、实时更新 + +### [05-发布维护](05-发布维护/) + +插件的发布、更新和维护 + +- [版本管理](05-发布维护/01-版本管理.md) - 语义化版本 +- [CI/CD 配置](05-发布维护/02-CICD配置.md) - 自动构建 +- [发布到市场](05-发布维护/03-发布市场.md) - 插件市场发布 +- [用户反馈](05-发布维护/04-用户反馈.md) - 收集和处理反馈 +- [迁移指南](05-发布维护/05-迁移指南.md) - SDK 版本升级 + +## 🚀 快速参考 + +### 创建插件 + +```powershell +# 安装模板 +dotnet new install LanMountainDesktop.PluginTemplate + +# 创建项目 +dotnet new lmd-plugin -n MyPlugin + +# 构建 +dotnet build +``` + +### 插件入口 + +```csharp +public class Plugin : IPlugin +{ + public string Id => "com.example.myplugin"; + public string Name => "My Plugin"; + public string Version => "1.0.0"; + + public async Task InitializeAsync(IPluginContext context) + { + // 注册组件 + var registry = context.Services.GetService(); + registry?.RegisterComponent(); + } + + public Task ShutdownAsync() => Task.CompletedTask; +} +``` + +### 创建组件 + +```csharp +[Component( + Id = "com.example.myplugin.mycomponent", + Name = "我的组件", + Category = "工具" +)] +public class MyComponent : ComponentBase +{ + public override string Id => "com.example.myplugin.mycomponent"; + public override string Name => "我的组件"; +} +``` + +## 💡 最佳实践 + +### 代码规范 + +- ✅ 使用异步编程(`async/await`) +- ✅ 启用可空引用类型(`nullable enable`) +- ✅ 编写 XML 文档注释 +- ✅ 遵循 C# 命名约定 +- ✅ 使用依赖注入模式 + +### 性能优化 + +- ✅ 避免阻塞 UI 线程 +- ✅ 使用延迟加载 +- ✅ 缓存数据避免重复计算 +- ✅ 及时释放资源(实现 `IDisposable`) +- ✅ 使用弱事件模式避免内存泄漏 + +### 用户体验 + +- ✅ 适配亮色/暗色主题 +- ✅ 支持多语言本地化 +- ✅ 提供友好的错误提示 +- ✅ 响应式设计适配不同分辨率 +- ✅ 提供设置页让用户自定义 + +## 🔗 相关资源 + +### 官方资源 + +- [GitHub 仓库](https://github.com/HelloWRC/LanMountainDesktop) +- [插件示例](https://github.com/HelloWRC/LanMountainDesktop.SamplePlugin) +- [SDK 源码](https://github.com/HelloWRC/LanMountainDesktop/tree/main/LanMountainDesktop.PluginSdk) +- [问题反馈](https://github.com/HelloWRC/LanMountainDesktop/issues) + +### 技术文档 + +- [Avalonia UI 文档](https://docs.avaloniaui.net/) +- [FluentAvalonia 文档](https://github.com/amwx/FluentAvalonia/wiki) +- [CommunityToolkit.Mvvm](https://learn.microsoft.com/dotnet/communitytoolkit/mvvm/) +- [.NET API 浏览器](https://learn.microsoft.com/dotnet/api/) + +### 社区 + +- [GitHub Discussions](https://github.com/HelloWRC/LanMountainDesktop/discussions) - 技术讨论 +- [插件市场](https://github.com/HelloWRC/LanMountainDesktop/wiki/Plugins) - 浏览现有插件 + +## ❓ 常见问题 + +### 我需要什么基础? + +- **必需**: C# 基础语法、面向对象编程 +- **推荐**: XAML/Avalonia UI 基础、MVVM 模式 +- **加分**: 异步编程、依赖注入 + +### 插件可以做什么? + +插件可以: +- ✅ 添加桌面组件(显示天气、时钟、待办等) +- ✅ 添加设置页面 +- ✅ 提供后台服务(定时任务、数据同步等) +- ✅ 与其他插件通信 +- ✅ 通过 IPC 对外提供服务 + +插件不能: +- ❌ 修改宿主核心代码 +- ❌ 直接访问其他插件的私有数据 +- ❌ 绕过权限系统访问敏感资源 + +### 如何调试插件? + +1. 将插件构建到宿主的插件目录 +2. 启动宿主应用 +3. 使用 IDE 附加到宿主进程 +4. 在插件代码中设置断点 + +详见 [调试与测试](01-快速开始/03-调试测试.md) + +### 插件会被隔离运行吗? + +当前插件运行在宿主进程内(in-process 模式),未来将支持进程隔离模式: + +- **当前**: 进程内插件,共享内存空间 +- **未来**: 进程隔离插件,独立进程运行(计划中) + +## 🎯 下一步 + +准备开始了吗? + +- [环境准备](01-快速开始/01-环境准备.md) - 配置开发环境 +- [创建第一个插件](01-快速开始/02-创建第一个插件.md) - 动手实践 +- [插件生命周期](02-核心概念/01-插件生命周期.md) - 理解原理 diff --git a/docs/02-AirApp开发/README.md b/docs/02-AirApp开发/README.md new file mode 100644 index 0000000..d0f61f2 --- /dev/null +++ b/docs/02-AirApp开发/README.md @@ -0,0 +1,253 @@ +# Air APP 开发完整指南 + +欢迎来到阑山桌面 Air APP 开发指南!Air APP 是运行在阑山桌面环境中的独立窗口应用。 + +## 什么是 Air APP? + +**Air APP** 是阑山桌面生态中的独立应用形态,与桌面组件(Widget)不同: + +### 对比:Air APP vs 桌面组件 + +| 特性 | Air APP | 桌面组件 | +|------|---------|---------| +| **窗口形式** | 独立窗口,可移动、缩放 | 固定在桌面上 | +| **生命周期** | 独立进程,按需启动 | 随宿主启动 | +| **UI 复杂度** | 适合复杂界面 | 适合简单信息展示 | +| **资源占用** | 按需运行,不用时退出 | 始终运行 | +| **典型案例** | 白板、世界时钟、计算器 | 天气组件、时钟组件 | + +### Air APP 架构 + +``` +┌──────────────────────────────────────┐ +│ LanMountainDesktop (桌面宿主) │ +│ │ +│ ┌────────────────────────────────┐ │ +│ │ LanMountainDesktop.AirAppRuntime│ │ +│ │ (Air APP 运行时容器) │ │ +│ │ │ │ +│ │ 管理所有 Air APP 进程 │ │ +│ │ - 启动/停止 │ │ +│ │ - 实例去重 │ │ +│ │ - 生命周期跟踪 │ │ +│ └─────────┬────────────────────────┘ │ +└────────────┼───────────────────────────┘ + │ IPC 通信 + │ + ┌────────▼──────────┐ + │ Air APP Process │ + │ │ + │ ┌─────────────┐ │ + │ │ AirAppHost │ │ + │ │ (渲染容器) │ │ + │ └─────────────┘ │ + │ │ + │ 你的 Air APP │ + │ - UI │ + │ - 业务逻辑 │ + │ - 数据管理 │ + └──────────────────┘ +``` + +## 📚 学习路径 + +### 快速上手 + +1. **[Air APP 介绍](01-Air-APP介绍.md)** - 理解 Air APP 是什么 +2. **[创建第一个 Air APP](02-创建第一个AirApp.md)** - Hello World +3. **[架构与生命周期](03-架构与生命周期.md)** - 理解运行机制 + +### 深入学习 + +4. **[IPC 通信](04-IPC通信.md)** - 与宿主和其他 APP 通信 +5. **[窗口管理](05-窗口管理.md)** - 窗口模式、大小、位置 +6. **[数据持久化](06-数据持久化.md)** - 保存应用数据 +7. **[主题适配](07-主题适配.md)** - 适配亮色/暗色模式 + +### 实战案例 + +8. **[世界时钟 APP](08-实战-世界时钟.md)** - 完整示例 +9. **[白板 APP](09-实战-白板.md)** - 全屏交互应用 +10. **[打包与发布](10-打包与发布.md)** - 发布到市场 + +## 🎯 快速开始 + +### 创建 Air APP 项目 + +```powershell +# 安装模板 +dotnet new install LanMountainDesktop.AirAppTemplate + +# 创建项目 +dotnet new lmd-airapp -n MyAirApp + +# 构建 +cd MyAirApp +dotnet build +``` + +### 项目结构 + +``` +MyAirApp/ +├── MyAirApp.csproj # 项目文件 +├── Program.cs # 程序入口 +├── App.axaml # 应用定义 +├── App.axaml.cs # 应用代码 +├── Views/ # 视图目录 +│ └── MainWindow.axaml # 主窗口 +├── ViewModels/ # 视图模型 +│ └── MainWindowViewModel.cs +├── Models/ # 数据模型 +├── Services/ # 业务服务 +├── Assets/ # 资源文件 +│ └── icon.png +└── airapp.json # Air APP 清单 +``` + +### Air APP 清单 (airapp.json) + +```json +{ + "Id": "com.example.myairapp", + "Name": "My Air APP", + "Version": "1.0.0", + "Author": "Your Name", + "Description": "My first Air APP", + "MinHostVersion": "1.0.0", + "Icon": "Assets/icon.png", + "WindowMode": "Standard", + "DefaultSize": { + "Width": 800, + "Height": 600 + }, + "AllowMultipleInstances": false +} +``` + +### 窗口模式 + +| 模式 | 说明 | 适用场景 | +|------|------|---------| +| `Standard` | 标准窗口,带标题栏和边框 | 大多数应用 | +| `Borderless` | 无边框窗口,自定义标题栏 | 自定义 UI | +| `FullScreen` | 全屏窗口 | 白板、游戏 | +| `Tool` | 工具窗口,始终置顶 | 小工具 | + +## 核心概念 + +### 生命周期 + +``` +用户点击启动 + ↓ +AirAppRuntime 检查是否已运行 + ↓ +否 → 启动新进程 +是 → 激活现有窗口(如果 AllowMultipleInstances=false) + ↓ +AirAppHost 初始化 + ↓ +加载 Air APP 代码 + ↓ +显示主窗口 + ↓ +应用运行中... + ↓ +用户关闭窗口 + ↓ +AirAppHost 清理资源 + ↓ +进程退出 + ↓ +AirAppRuntime 清理注册 +``` + +### IPC 通信 + +Air APP 可以通过 IPC 与桌面宿主通信: + +```csharp +// 获取宿主设置 +var theme = await ipcClient.InvokeAsync( + "LanMountainDesktop.Host.v1", + "GetCurrentTheme" +); + +// 订阅宿主事件 +ipcClient.OnNotify("lanmountain.theme.changed", (themeData) => +{ + // 主题变更,更新 UI + ApplyTheme(themeData); +}); +``` + +## 📖 章节目录 + +### [01-Air-APP介绍.md](01-Air-APP介绍.md) +什么是 Air APP,与桌面组件的区别,应用场景 + +### [02-创建第一个AirApp.md](02-创建第一个AirApp.md) +从零创建一个简单的 Air APP,运行和调试 + +### [03-架构与生命周期.md](03-架构与生命周期.md) +Air APP 架构、运行时、生命周期管理 + +### [04-IPC通信.md](04-IPC通信.md) +与桌面宿主通信、调用服务、订阅事件 + +### [05-窗口管理.md](05-窗口管理.md) +窗口模式、大小调整、位置记忆 + +### [06-数据持久化.md](06-数据持久化.md) +保存应用状态和用户数据 + +### [07-主题适配.md](07-主题适配.md) +适配亮色/暗色主题、圆角系统 + +### [08-实战-世界时钟.md](08-实战-世界时钟.md) +完整案例:世界时钟应用 + +### [09-实战-白板.md](09-实战-白板.md) +完整案例:全屏白板应用 + +### [10-打包与发布.md](10-打包与发布.md) +打包、签名、发布到市场 + +## 💡 最佳实践 + +### 性能优化 + +- ✅ 使用虚拟化列表处理大量数据 +- ✅ 图片和资源延迟加载 +- ✅ 避免复杂的布局嵌套 +- ✅ 使用 `RenderTransform` 而非 `Margin` 做动画 +- ✅ 及时取消不需要的异步操作 + +### 用户体验 + +- ✅ 记住窗口位置和大小 +- ✅ 提供键盘快捷键 +- ✅ 优雅处理错误和异常 +- ✅ 适配不同屏幕分辨率和 DPI +- ✅ 响应主题变更 + +### 安全性 + +- ✅ 验证用户输入 +- ✅ 使用 HTTPS 进行网络请求 +- ✅ 敏感数据加密存储 +- ✅ 避免路径遍历漏洞 +- ✅ 遵循最小权限原则 + +## 🔗 相关资源 + +- [插件开发指南](../01-插件开发/) - 如果需要桌面组件 +- [整体架构](../04-架构与实现/01-整体架构.md) - 系统架构 +- [设计规范](../03-组件设计规范/) - UI 设计指南 + +## 🎯 下一步 + +- [Air APP 介绍](01-Air-APP介绍.md) - 了解 Air APP +- [创建第一个 Air APP](02-创建第一个AirApp.md) - 动手实践 +- [架构与生命周期](03-架构与生命周期.md) - 理解原理 diff --git a/docs/04-架构与实现/01-整体架构.md b/docs/04-架构与实现/01-整体架构.md new file mode 100644 index 0000000..9bab4c5 --- /dev/null +++ b/docs/04-架构与实现/01-整体架构.md @@ -0,0 +1,363 @@ +# 整体架构 + +本文档描述阑山桌面的整体技术架构、各模块职责和交互方式。 + +## 架构概览 + +### 核心模块 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 用户交互层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │桌面组件 │ │主窗口 │ │托盘图标 │ │设置窗口 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└─────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────┐ +│ LanMountainDesktop(桌面宿主) │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ 组件系统 │ │ +│ │ 组件注册 | 组件渲染 | 布局管理 | 编辑模式 │ │ +│ └──────────────────────────────────────────────────────┘ │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ 插件运行时 │ │ +│ │ 插件加载 | 生命周期 | SDK 接入 | 契约装配 │ │ +│ └──────────────────────────────────────────────────────┘ │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ 核心服务层 │ │ +│ │ 设置 | 主题 | 本地化 | 日志 | 遥测 | IPC │ │ +│ └──────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ + ↓ ↓ +┌──────────────────────┐ ┌──────────────────────────────┐ +│ LanMountainDesktop │ │ LanMountainDesktop │ +│ .AirAppRuntime │←IPC→│ .AirAppHost (多实例) │ +│ Air APP 运行时容器 │ │ Air APP 渲染进程 │ +└──────────────────────┘ └──────────────────────────────┘ + ↑ +┌──────────────────────┐ +│ LanMountainDesktop │ +│ .Launcher │ +│ 启动器 (唯一入口) │ +└──────────────────────┘ +``` + +## 项目结构 + +### 核心项目 + +| 项目 | 职责 | 类型 | +|------|------|------| +| **LanMountainDesktop** | 桌面宿主主程序 | WPF 应用 | +| **LanMountainDesktop.Launcher** | 启动器(OOBE、Splash、版本管理) | 独立可执行 | +| **LanMountainDesktop.AirAppRuntime** | Air APP 运行时容器 | 独立服务 | +| **LanMountainDesktop.AirAppHost** | Air APP 渲染进程 | 框架依赖应用 | + +### SDK 和基础设施 + +| 项目 | 职责 | 类型 | +|------|------|------| +| **LanMountainDesktop.PluginSdk** | 插件 SDK | NuGet 包 | +| **LanMountainDesktop.AirAppSdk** | Air APP SDK | NuGet 包 | +| **LanMountainDesktop.Shared.Contracts** | 共享契约类型 | 类库 | +| **LanMountainDesktop.Shared.IPC** | IPC 基础设施 | 类库 | + +### 功能模块 + +| 项目 | 职责 | 类型 | +|------|------|------| +| **LanMountainDesktop.Settings.Core** | 设置系统 | 类库 | +| **LanMountainDesktop.Appearance** | 主题和外观 | 类库 | +| **LanMountainDesktop.DesktopComponents.Runtime** | 组件运行时 | 类库 | +| **LanMountainDesktop.DesktopHost** | 桌面宿主生命周期 | 类库 | + +### 未来扩展(计划中) + +| 项目 | 职责 | 状态 | +|------|------|------| +| **LanMountainDesktop.PluginIsolation.Contracts** | 插件隔离契约 | 已创建 | +| **LanMountainDesktop.PluginIsolation.Ipc** | 插件隔离 IPC | 已创建 | + +## 启动流程 + +### 生产环境启动 + +``` +1. 用户启动 Launcher.exe + ↓ +2. 首次启动? → 是 → 显示 OOBE 欢迎页 + ↓ 否 +3. 显示 Splash 启动动画 + ↓ +4. 扫描 app-* 目录,选择最佳版本 + - 优先选择有 .current 标记的 + - 其次选择版本号最高的 + - 跳过有 .partial 或 .destroy 标记的 + ↓ +5. 预启动 AirAppRuntime.exe + - JIT 框架依赖进程 + - 等待 IPC 管道就绪 + ↓ +6. 启动 app-{version}/LanMountainDesktop.exe + ↓ +7. Host 初始化 + - 日志系统 + - 遥测系统 + - 设置加载 + - 主题应用 + ↓ +8. 初始化桌面环境 + - 创建桌面窗口 + - 加载插件 + - 注册组件 + - 显示托盘图标 + ↓ +9. 将 Host PID 附加给 AirAppRuntime + ↓ +10. 清理标记为 .destroy 的旧版本 + ↓ +11. 桌面就绪 +``` + +### 开发环境启动 + +``` +开发者直接启动 LanMountainDesktop.exe + ↓ +检测到没有通过 Launcher 启动 + ↓ +跳过 OOBE 和版本管理 + ↓ +如果 AirAppRuntime 未运行,自动启动 + ↓ +正常初始化桌面环境 +``` + +## 核心系统 + +### 1. 组件系统 + +**职责**: 管理桌面组件的注册、创建、渲染和布局 + +**架构**: + +``` +ComponentRegistry (组件注册表) + ↓ 注册 +ComponentDefinition (组件定义) + ↓ 创建实例 +ComponentInstance (组件实例) + ↓ 渲染 +ComponentView (Avalonia UI) + ↓ 显示 +DesktopWidgetWindow (桌面窗口) +``` + +**关键类**: +- `ComponentRegistry` - 组件注册和查找 +- `ComponentBase` - 组件基类 +- `ComponentInstanceManager` - 组件实例管理 +- `DesktopLayoutService` - 布局管理 + +### 2. 插件系统 + +**职责**: 加载、初始化和管理插件生命周期 + +**运行时模式**: + +| 模式 | 状态 | 说明 | +|------|------|------| +| **in-proc** | ✅ 当前默认 | 插件运行在宿主进程内 | +| **isolated-background** | 🚧 规划中 | 后台逻辑隔离进程 | +| **isolated-window** | 🚧 规划中 | UI 渲染隔离进程 | + +**加载流程**: + +``` +1. 扫描插件目录 + %LOCALAPPDATA%\LanMountainDesktop\plugins\ + ↓ +2. 读取 plugin.json 清单 + ↓ +3. 验证依赖关系 + ↓ +4. 创建 PluginLoadContext + ↓ +5. 加载插件程序集 + ↓ +6. 创建 IPlugin 实例 + ↓ +7. 调用 InitializeAsync() + ↓ +8. 注册组件和服务 +``` + +### 3. 设置系统 + +**职责**: 管理应用和插件的配置数据 + +**设置域**: + +``` +Settings Root +├── General (通用设置) +├── Appearance (外观设置) +├── Components (组件设置) +├── Plugins (插件设置) +│ ├── Plugin A +│ └── Plugin B +└── Advanced (高级设置) +``` + +**持久化**: +- 位置: `%LOCALAPPDATA%\LanMountainDesktop\settings\` +- 格式: JSON +- 实时保存,延迟写入 + +### 4. 主题系统 + +**职责**: 管理亮色/暗色主题、圆角系统 + +**圆角规范**: + +| 级别 | Token | 值 | 用途 | +|------|-------|----|------| +| 基础 | `DesignCornerRadiusBasic` | 4 | 按钮、输入框 | +| 组件 | `DesignCornerRadiusComponent` | 8 | 卡片、面板 | +| 窗口 | `DesignCornerRadiusWindow` | 12 | 窗口、对话框 | + +**主题切换**: +1. 用户选择主题 +2. `AppearanceService` 切换资源字典 +3. 广播主题变更事件 +4. 各组件响应并更新 UI +5. 通过 IPC 通知 Air APP + +### 5. IPC 系统 + +**职责**: 进程间通信 + +**通信拓扑**: + +``` +┌────────────────┐ +│ Host │ ← 外部 IPC 入口点 +│ (主程序) │ +└────────┬───────┘ + │ IPC + ┌────┴────┐ + ↓ ↓ +┌────────┐ ┌────────────┐ +│Launcher│ │AirAppRuntime│ +└────────┘ └──────┬──────┘ + │ IPC + ┌─────┴─────┐ + ↓ ↓ + ┌─────────┐ ┌─────────┐ + │AirAppHost│ │AirAppHost│ + └─────────┘ └─────────┘ +``` + +**IPC 管道**: +- `LanMountainDesktop.Host.v1` - 宿主公共服务 +- `LanMountainDesktop.AirAppRuntime.v1` - Air APP 生命周期 +- `LanMountainDesktop.AirAppRuntimeControl.v1` - Runtime 控制 + +## 数据流 + +### 设置变更流程 + +``` +用户修改设置 + ↓ +SettingsService.SetValue() + ↓ +触发 SettingChanged 事件 + ↓ +相关组件监听并响应 + ↓ +延迟写入磁盘(防抖 500ms) +``` + +### 组件更新流程 + +``` +定时器触发 (默认 1 秒) + ↓ +ComponentUpdateService.UpdateAsync() + ↓ +遍历所有组件实例 + ↓ +调用 Component.UpdateAsync() + ↓ +组件更新数据 + ↓ +UI 自动刷新(数据绑定) +``` + +### 插件通信流程 + +``` +Plugin A 发送消息 + ↓ +PluginMessenger.Send() + ↓ +消息总线分发 + ↓ +Plugin B 接收消息 + ↓ +处理并可选回复 +``` + +## 安全性 + +### 权限系统 + +插件需要声明所需权限: + +```json +{ + "Permissions": [ + "FileSystem.Read", // 读取文件 + "FileSystem.Write", // 写入文件 + "Network.Access", // 网络访问 + "System.Info" // 系统信息 + ] +} +``` + +### 沙箱隔离(未来) + +进程隔离模式下: +- 插件运行在独立进程 +- 通过 IPC 访问宿主服务 +- 限制文件系统访问 +- 限制网络访问 + +## 性能优化 + +### 启动优化 +- ✅ 延迟加载插件 +- ✅ 异步初始化 +- ✅ 组件按需创建 +- ✅ 资源延迟加载 + +### 运行时优化 +- ✅ 虚拟化列表 +- ✅ 图片缓存 +- ✅ 布局缓存 +- ✅ 事件防抖/节流 + +### 内存优化 +- ✅ 弱事件模式 +- ✅ 及时释放资源 +- ✅ 图片降采样 +- ✅ 组件卸载清理 + +## 相关文档 + +- [启动器系统](02-启动器系统.md) - 启动器详细设计 +- [插件运行时](04-插件运行时.md) - 插件加载和管理 +- [组件系统](05-组件系统.md) - 组件架构和渲染 +- [IPC 通信](07-IPC通信.md) - 进程间通信设计 diff --git a/docs/05-更新与发布/01-更新系统架构.md b/docs/05-更新与发布/01-更新系统架构.md new file mode 100644 index 0000000..b4976f2 --- /dev/null +++ b/docs/05-更新与发布/01-更新系统架构.md @@ -0,0 +1,474 @@ +# 更新系统架构 + +本文档描述阑山桌面的更新系统设计,包括增量更新、原子化安装、版本管理和回滚机制。 + +## 更新系统概览 + +### 核心特性 + +- ✅ **增量更新** - 只下载变更文件,节省带宽 +- ✅ **原子化更新** - 保证完整性,失败自动回滚 +- ✅ **多版本共存** - 支持多版本并存和快速切换 +- ✅ **签名验证** - RSA 签名确保安全性 +- ✅ **版本回退** - 一键回退到上一版本 +- ✅ **更新频道** - Stable/Preview 频道切换 +- ✅ **后台下载** - 静默下载,不影响使用 + +### 架构组件 + +``` +┌──────────────────────────────────────────────┐ +│ LanMountainDesktop (Host) │ +│ │ +│ ┌────────────────────────────────────────┐ │ +│ │ UpdateOrchestrator │ │ +│ │ (更新编排 - Host 拥有) │ │ +│ │ - 检查更新 │ │ +│ │ - 下载更新 │ │ +│ │ - 应用更新 │ │ +│ │ - 回滚更新 │ │ +│ └────────────────────────────────────────┘ │ +│ │ +│ ┌────────────────┐ ┌──────────────────┐ │ +│ │UpdateInstall │ │UpdateRollback │ │ +│ │ Gateway │ │ Gateway │ │ +│ └────────────────┘ └──────────────────┘ │ +└──────────────────────────────────────────────┘ + ↓ 写入 deployment.lock +┌──────────────────────────────────────────────┐ +│ Launcher │ +│ (启动器 - 版本选择和清理) │ +│ │ +│ ┌────────────────────────────────────────┐ │ +│ │ DeploymentLocator │ │ +│ │ 扫描和选择最佳版本 │ │ +│ └────────────────────────────────────────┘ │ +└──────────────────────────────────────────────┘ +``` + +## 目录结构 + +### 版本目录布局 + +``` +安装根目录/ +├── LanMountainDesktop.Launcher.exe # 启动器 +├── app-1.0.0/ # 旧版本 +│ ├── .destroy # 待删除标记 +│ ├── LanMountainDesktop.exe +│ └── ... +├── app-1.0.1/ # 当前版本 +│ ├── .current # 当前版本标记 +│ ├── LanMountainDesktop.exe +│ └── ... +├── app-1.0.2/ # 新版本(下载中) +│ ├── .partial # 未完成标记 +│ └── ... +└── .Launcher/ # 启动器数据 + ├── state/ + │ └── oobe-state.json + ├── update/ + │ ├── incoming/ # 更新缓存 + │ │ ├── deployment.lock # 部署锁 + │ │ ├── plonds-filemap.json # 文件清单 + │ │ ├── plonds-filemap.sig # RSA 签名 + │ │ └── objects/ # 对象文件 + │ ├── public-key.pem # 公钥 + │ └── snapshots/ # 更新快照 + │ └── snapshot-{id}.json + └── logs/ +``` + +### 版本标记文件 + +| 标记文件 | 含义 | 创建者 | 删除时机 | +|---------|------|--------|---------| +| `.current` | 当前使用版本 | Host UpdateInstallGateway | 切换到新版本时 | +| `.partial` | 下载未完成 | Host UpdateInstallGateway | 安装成功或失败清理时 | +| `.destroy` | 待删除版本 | Host UpdateInstallGateway | Launcher 下次启动清理 | + +## 更新流程 + +### 完整更新流程 + +``` +1. Host 后台检查更新 + UpdateOrchestrator.CheckAsync() + - 调用 manifest provider (PLONDS/GitHub) + - 根据更新频道过滤版本 + - 对比当前版本和最新版本 + ↓ +2. 发现新版本 + 用户收到通知 + ↓ +3. Host 下载更新 + UpdateOrchestrator.DownloadAsync() + - 下载 plonds-filemap.json + - 下载 plonds-filemap.sig + - 下载对象文件 + - 保存到 .Launcher/update/incoming/ + ↓ +4. 写入 deployment.lock + { + "TargetVersion": "1.0.2", + "FromVersion": "1.0.1", + "FileMapPath": "...", + "SignaturePath": "...", + "ArchivePath": "..." + } + ↓ +5. Host 调用 UpdateInstallGateway + UpdateInstallGateway.InstallAsync() + - 验证签名 (UpdateSignatureVerifier) + - 创建目标目录 app-1.0.2/ + - 标记 .partial + - 保存快照到 snapshots/ + ↓ +6. 应用文件操作 + PlondsUpdateApplier.ApplyFileMap() + For each file in filemap: + - action="replace" → 从对象解压 + - action="reuse" → 从旧版本复制 + - action="delete" → 跳过 + ↓ +7. 验证所有文件哈希 + For each file: + 计算 SHA256 + 与 filemap 对比 + ↓ +8. 激活新版本 + DeploymentActivator.ActivateDeployment() + - 移除 app-1.0.2/.partial + - 添加 app-1.0.2/.current + - 移除 app-1.0.1/.current + - 添加 app-1.0.1/.destroy + ↓ +9. 更新快照状态 = "applied" + ↓ +10. 清理 incoming 缓存 + IncomingArtifactsCleaner.Clean() + ↓ +11. 用户重启应用 + Launcher 启动 app-1.0.2/ + ↓ +12. Launcher 清理 .destroy 目录 + 删除 app-1.0.1/ +``` + +### 增量包结构 + +#### GitHub Release Assets + +``` +LanMountainDesktop-v1.0.2/ +├── LanMountainDesktop-Setup-1.0.2-x64.exe # 完整安装包 +├── releases.win.json # VeloPack 清单 +├── LanMountainDesktop-1.0.2-win-x64.nupkg # VeloPack 包 +├── RELEASES # VeloPack 元数据 +└── (legacy) plonds-filemap-1.0.2.json # 旧格式(可选) +``` + +#### plonds-filemap.json 格式 + +```json +{ + "FromVersion": "1.0.1", + "ToVersion": "1.0.2", + "GeneratedAt": "2026-06-08T10:00:00Z", + "Files": [ + { + "Path": "LanMountainDesktop.exe", + "Action": "replace", + "Sha256": "abc123...", + "Size": 1024000, + "ObjectPath": "objects/abc123" + }, + { + "Path": "LanMountainDesktop.dll", + "Action": "reuse", + "Sha256": "def456...", + "Size": 512000 + }, + { + "Path": "OldPlugin.dll", + "Action": "delete" + } + ] +} +``` + +### 文件操作类型 + +| Action | 说明 | 处理方式 | +|--------|------|----------| +| `replace` | 新增或替换文件 | 从 objects/ 解压 | +| `reuse` | 文件未变更 | 从旧版本目录复制 | +| `delete` | 删除文件 | 不操作(新版本中不存在) | + +## 原子化保证 + +### 失败场景处理 + +| 失败场景 | 检测机制 | 恢复方式 | +|---------|---------|---------| +| **签名验证失败** | RSA 验证 | 拒绝安装,保留旧版本 | +| **文件哈希不匹配** | SHA256 校验 | 自动回滚到旧版本 | +| **磁盘空间不足** | 写入失败 | 自动回滚到旧版本 | +| **进程崩溃** | .partial 标记 | Launcher 启动时清理 | +| **断电/强制关机** | .partial 标记 | Launcher 启动时清理 | + +### 回滚机制 + +```csharp +private void TryRollbackOnFailure(SnapshotMetadata snapshot) +{ + try + { + // 1. 删除未完成的新版本目录 + if (Directory.Exists(snapshot.TargetDirectory)) + { + Directory.Delete(snapshot.TargetDirectory, true); + } + + // 2. 移除旧版本的 .destroy 标记 + var destroyMarker = Path.Combine( + snapshot.SourceDirectory, + ".destroy" + ); + if (File.Exists(destroyMarker)) + { + File.Delete(destroyMarker); + } + + // 3. 确保旧版本有 .current 标记 + var currentMarker = Path.Combine( + snapshot.SourceDirectory, + ".current" + ); + if (!File.Exists(currentMarker)) + { + File.WriteAllText(currentMarker, string.Empty); + } + + // 4. 更新快照状态 + snapshot.Status = "rolled_back"; + SaveSnapshot(snapshotPath, snapshot); + } + catch (Exception ex) + { + _logger.LogError(ex, "Rollback failed"); + // 记录错误但不抛出 + } +} +``` + +## 版本管理 + +### 版本选择算法 + +Launcher 启动时的版本选择逻辑: + +```csharp +public string? FindBestVersion() +{ + var appDirs = Directory.GetDirectories( + _installRoot, + "app-*" + ); + + // 1. 过滤掉标记为 .partial 或 .destroy 的版本 + var validDirs = appDirs.Where(dir => + !File.Exists(Path.Combine(dir, ".partial")) && + !File.Exists(Path.Combine(dir, ".destroy")) + ); + + // 2. 优先选择带 .current 标记的版本 + var currentDir = validDirs.FirstOrDefault(dir => + File.Exists(Path.Combine(dir, ".current")) + ); + if (currentDir != null) + return currentDir; + + // 3. 否则选择版本号最高的 + var sortedDirs = validDirs + .Select(dir => new { + Path = dir, + Version = ParseVersion(dir) + }) + .Where(x => x.Version != null) + .OrderByDescending(x => x.Version) + .ToList(); + + return sortedDirs.FirstOrDefault()?.Path; +} +``` + +### 版本回退 + +用户可以通过设置页手动回退到上一版本: + +``` +设置 → 更新 → 版本历史 → 回滚 +``` + +**回退流程**: + +``` +1. Host 调用 UpdateRollbackGateway + ↓ +2. 读取最新快照 (snapshots/) + ↓ +3. 获取 SourceDirectory (旧版本) + ↓ +4. 激活旧版本 + - 移除当前版本的 .current + - 添加 .current 到旧版本 + - 移除旧版本的 .destroy + - 添加 .destroy 到当前版本 + ↓ +5. 更新快照状态 = "manual_rollback" + ↓ +6. 提示用户重启应用 +``` + +## 安全机制 + +### RSA 签名 + +#### 签名生成(CI 环境) + +```powershell +# scripts/Sign-FileMap.ps1 +$privateKeyPem = Get-Content -Path $PrivateKeyPath -Raw +$rsa = [System.Security.Cryptography.RSA]::Create() +$rsa.ImportFromPem($privateKeyPem) + +$jsonBytes = [System.IO.File]::ReadAllBytes($FilesJsonPath) +$signature = $rsa.SignData( + $jsonBytes, + [System.Security.Cryptography.HashAlgorithmName]::SHA256, + [System.Security.Cryptography.RSASignaturePadding]::Pkcs1 +) + +$signatureBase64 = [Convert]::ToBase64String($signature) +Set-Content -Path "$FilesJsonPath.sig" -Value $signatureBase64 +``` + +#### 签名验证(Launcher) + +```csharp +private (bool Success, string Message) VerifySignature( + string fileMapPath, + string signaturePath) +{ + // 1. 读取公钥 + var publicKeyPath = Path.Combine( + _launcherRoot, + "update", + "public-key.pem" + ); + using var rsa = RSA.Create(); + rsa.ImportFromPem(File.ReadAllText(publicKeyPath)); + + // 2. 读取签名 + var signatureBase64 = File.ReadAllText(signaturePath).Trim(); + var signature = Convert.FromBase64String(signatureBase64); + + // 3. 验证 + var jsonBytes = File.ReadAllBytes(fileMapPath); + var isValid = rsa.VerifyData( + jsonBytes, + signature, + HashAlgorithmName.SHA256, + RSASignaturePadding.Pkcs1 + ); + + return isValid + ? (true, "ok") + : (false, "Signature verification failed"); +} +``` + +### 文件完整性验证 + +```csharp +// 验证所有文件的 SHA256 +foreach (var file in fileMap.Files) +{ + if (file.Action == "delete") + continue; + + var fullPath = Path.Combine(targetDeployment, file.Path); + var actualHash = ComputeSha256Hex(fullPath); + + if (!string.Equals( + actualHash, + file.Sha256, + StringComparison.OrdinalIgnoreCase)) + { + throw new InvalidOperationException( + $"File hash mismatch for '{file.Path}'." + ); + } +} +``` + +### 路径遍历防护 + +```csharp +private static void EnsurePathWithinRoot( + string targetPath, + string rootPath) +{ + var fullTarget = Path.GetFullPath(targetPath); + var fullRoot = Path.GetFullPath(rootPath); + + if (!fullTarget.StartsWith( + fullRoot, + StringComparison.OrdinalIgnoreCase)) + { + throw new InvalidOperationException( + $"Path traversal detected: {targetPath}" + ); + } +} +``` + +## 更新频道 + +### 频道类型 + +| 频道 | 说明 | GitHub Release 过滤 | +|------|------|---------------------| +| **Stable** | 正式版,推荐大多数用户使用 | `prerelease=false` | +| **Preview** | 预览版,包含最新功能和 Bug 修复 | 所有版本(包括 `prerelease=true`) | + +### 切换频道 + +``` +设置 → 更新 → 更新频道 → 选择频道 +``` + +切换后立即检查更新。 + +## VeloPack 集成 + +### 当前状态 + +- ✅ CI 管道已生成 VeloPack 原生资产(`releases.win.json`, `*.nupkg`, `RELEASES`) +- ✅ Host 拥有更新检查/下载/应用/回滚编排 +- ✅ Launcher 仅负责版本选择和启动 +- ⚠️ 旧的 `files.json` + `update.zip` 生成作为禁用的回退路径保留在 CI 中 + +### 未来迁移 + +计划完全迁移到 VeloPack: +1. 移除旧格式支持 +2. 简化 CI 管道 +3. 利用 VeloPack 的增量更新算法 + +## 相关文档 + +- [打包与构建](../05-更新与发布/03-打包与构建.md) - 构建流程 +- [CI/CD 配置](../05-更新与发布/04-CICD配置.md) - 自动化构建 +- [启动器系统](02-启动器系统.md) - 启动器详细设计 diff --git a/docs/DOCUMENTATION_REFACTOR_REPORT.md b/docs/DOCUMENTATION_REFACTOR_REPORT.md new file mode 100644 index 0000000..1ff43ba --- /dev/null +++ b/docs/DOCUMENTATION_REFACTOR_REPORT.md @@ -0,0 +1,290 @@ +# 文档重构完成报告 + +## 重构概览 + +本次文档重构于 **2026年6月8日** 完成,对阑山桌面技术文档进行了全面的重新设计和编写。 + +## 重构目标 + +✅ **保留旧文档** - 所有原有文档已迁移到 `archive/` 目录 +✅ **重新设计架构** - 按照开发流程组织文档结构 +✅ **覆盖完整链路** - 从插件开发到更新系统的完整技术链 +✅ **提升可读性** - 清晰的导航、丰富的示例、实用的参考 + +## 新文档架构 + +### 文档目录结构 + +``` +docs/ +├── README.md # 文档中心首页(已完成) +├── 00-快速开始/ # 项目入门(已完成) +│ ├── 01-项目介绍.md +│ ├── 02-快速安装.md +│ └── 03-开发环境配置.md +├── 01-插件开发/ # 插件开发完整指南(已完成骨架) +│ ├── README.md +│ ├── 01-快速开始/ +│ │ └── 01-环境准备.md +│ ├── 02-核心概念/ +│ ├── 03-API参考/ +│ ├── 04-实战案例/ +│ └── 05-发布维护/ +├── 02-AirApp开发/ # Air APP 开发指南(已完成骨架) +│ └── README.md +├── 03-组件设计规范/ # 设计系统(目录已创建) +├── 04-架构与实现/ # 技术架构(已完成核心) +│ └── 01-整体架构.md +├── 05-更新与发布/ # 更新和发布流程(已完成核心) +│ └── 01-更新系统架构.md +└── archive/ # 旧文档归档(已完成) + ├── README.md + ├── Plugins develop/ # 旧插件开发文档 + ├── ai/ # AI 辅助文档 + ├── auto_commit_md/ # 自动提交文档 + ├── superpowers/ # 早期规划文档 + └── *.md # 其他旧文档 +``` + +## 已完成内容 + +### ✅ 基础框架(100%) + +- [x] 文档中心首页 (`README.md`) +- [x] 旧文档归档和迁移 (`archive/`) +- [x] 新目录结构创建 + +### ✅ 快速开始(100%) + +- [x] 项目介绍 - 项目概览、特性、技术栈 +- [x] 快速安装 - 安装包、便携版、启动选项 +- [x] 开发环境配置 - IDE、工具、调试配置 + +### ✅ 插件开发指南(骨架 100%) + +- [x] 插件开发总览 (`README.md`) +- [x] 环境准备 - 模板安装、项目创建、调试 +- [ ] 其他章节待细化(已规划好结构) + +### ✅ Air APP 开发指南(骨架 100%) + +- [x] Air APP 开发总览 (`README.md`) +- [ ] 其他章节待细化(已规划好结构) + +### ✅ 架构与实现(核心 100%) + +- [x] 整体架构 - 系统架构、模块职责、数据流 + +### ✅ 更新与发布(核心 100%) + +- [x] 更新系统架构 - 增量更新、原子化、版本管理 + +## 文档特色 + +### 📚 结构清晰 + +- **按学习路径组织** - 从快速开始到深入架构 +- **层次分明** - 概览 → 快速上手 → 核心概念 → API 参考 → 实战案例 +- **相互链接** - 文档间有清晰的导航和交叉引用 + +### 🎯 实用导向 + +- **快速索引表** - "我想..." 快速找到对应文档 +- **代码示例** - 包含完整可运行的代码 +- **常见问题** - 每个章节都有 FAQ 和故障排除 + +### 🚀 开发者友好 + +- **技术深度** - 不仅是使用指南,更深入技术实现 +- **最佳实践** - 包含性能优化、安全性、用户体验建议 +- **版本信息** - 明确标注 SDK 版本和兼容性 + +### 🔄 持续更新 + +- **模块化设计** - 便于独立更新某个章节 +- **扩展性** - 为未来功能预留章节(如进程隔离) +- **版本标记** - 每个文档底部标注更新时间 + +## 核心文档亮点 + +### 项目介绍 + +- ✨ 清晰的项目定位和核心特性 +- 📊 技术栈和版本信息一目了然 +- 🎯 应用场景和目标用户明确 +- 🏗️ 项目结构和启动流程可视化 + +### 开发环境配置 + +- 🛠️ 详细的工具安装指南(IDE、Git、SDK) +- ⚙️ 多种 IDE 配置(VS2022、Rider、VS Code) +- 🐛 完整的调试配置 +- ❓ 常见问题和解决方案 + +### 插件开发指南 + +- 📦 模板安装和项目创建 +- 📝 plugin.json 字段详解 +- 🔧 多种调试方式 +- 📖 清晰的学习路径规划 + +### 整体架构 + +- 🏗️ 完整的架构图和模块说明 +- 🔄 启动流程和数据流可视化 +- 🧩 各系统的详细说明(组件、插件、设置、主题) +- 🔒 安全性和性能优化 + +### 更新系统架构 + +- 📦 完整的更新流程说明 +- 🔐 安全机制(签名、校验、防护) +- ♻️ 原子化保证和回滚机制 +- 📂 目录结构和版本管理详解 + +## 待完成内容 + +### 优先级 1(核心功能文档) + +- [ ] 插件开发 - 创建第一个插件 +- [ ] 插件开发 - 插件生命周期 +- [ ] 插件开发 - 组件系统 +- [ ] Air APP 开发 - 创建第一个 Air APP +- [ ] 组件设计规范 - 设计系统概述 +- [ ] 组件设计规范 - 视觉规范 + +### 优先级 2(API 参考) + +- [ ] 插件开发 - IPlugin 接口详解 +- [ ] 插件开发 - 组件 API +- [ ] 插件开发 - 设置 API +- [ ] Air APP 开发 - IPC 通信 +- [ ] Air APP 开发 - 窗口管理 + +### 优先级 3(实战案例) + +- [ ] 插件开发 - 天气组件案例 +- [ ] 插件开发 - 待办事项案例 +- [ ] Air APP 开发 - 世界时钟案例 +- [ ] Air APP 开发 - 白板案例 + +### 优先级 4(发布维护) + +- [ ] 插件开发 - 版本管理 +- [ ] 插件开发 - CI/CD 配置 +- [ ] 插件开发 - 发布到市场 +- [ ] 更新与发布 - 打包与构建 +- [ ] 更新与发布 - CI/CD 配置 + +## 使用指南 + +### 查看文档 + +1. **从首页开始**: 打开 `docs/README.md` +2. **选择路径**: 根据你的需求选择相应的章节 +3. **循序渐进**: 按照推荐的学习路径阅读 + +### 贡献文档 + +1. **选择章节**: 从待完成列表中选择一个主题 +2. **参考模板**: 查看已完成文档的结构和风格 +3. **遵循规范**: 保持一致的格式和术语 +4. **添加示例**: 提供可运行的代码示例 +5. **交叉链接**: 添加相关文档的链接 + +### 文档规范 + +#### Markdown 格式 + +- 使用 ATX 风格标题(`#` 而非 `===`) +- 代码块指定语言(```csharp, ```powershell, ```json) +- 使用表格展示结构化数据 +- 使用任务列表展示步骤 + +#### 术语规范 + +| 中文 | 英文 | 说明 | +|------|------|------| +| 阑山桌面 | LanMountainDesktop | 项目名称 | +| 桌面宿主 | Host | 主程序 | +| 启动器 | Launcher | 启动器程序 | +| 插件 | Plugin | 扩展模块 | +| 组件 | Component/Widget | 桌面组件 | +| Air APP | Air APP | 独立应用 | + +#### 链接规范 + +- 相对路径链接:`[文本](../目录/文件.md)` +- 锚点链接:`[文本](#标题)` +- 外部链接:`[文本](https://...)` + +## 技术实现 + +### 文档生成工具 + +建议未来使用以下工具增强文档体验: + +- **MkDocs** 或 **Docusaurus** - 静态站点生成 +- **PlantUML** - 架构图和流程图 +- **Mermaid** - 内嵌图表 +- **Algolia** - 文档搜索 + +### 自动化 + +可以添加的自动化流程: + +- **链接检查** - CI 中检查失效链接 +- **拼写检查** - 自动检查拼写错误 +- **格式检查** - 检查 Markdown 格式一致性 +- **自动部署** - 推送到 GitHub Pages + +## 迁移说明 + +### 从旧文档迁移 + +如果需要查看旧文档内容: + +1. 打开 `docs/archive/` 目录 +2. 查看 `archive/README.md` 了解归档内容 +3. 旧文档按原有结构保留,未做修改 + +### 更新现有链接 + +如果其他地方链接了旧文档,建议更新为: + +- `docs/PLUGIN_DEVELOPMENT.md` → `docs/01-插件开发/README.md` +- `docs/ARCHITECTURE.md` → `docs/04-架构与实现/01-整体架构.md` +- `docs/UPDATE_SYSTEM.md` → `docs/05-更新与发布/01-更新系统架构.md` + +## 总结 + +### 成果 + +✅ **完整的文档架构** - 6 个主要章节,覆盖从入门到高级的完整链路 +✅ **核心文档完成** - 项目介绍、安装、架构、更新系统等核心文档已完成 +✅ **保留旧内容** - 所有旧文档已归档,不丢失任何历史信息 +✅ **清晰的导航** - 多级目录结构和快速索引表 +✅ **开发者友好** - 包含代码示例、调试指南、最佳实践 + +### 后续工作 + +建议按以下优先级继续完善文档: + +1. **完成插件开发核心章节**(生命周期、组件系统、API 参考) +2. **完成 Air APP 开发核心章节**(创建、IPC、窗口管理) +3. **添加设计规范文档**(视觉规范、组件规范) +4. **添加实战案例**(完整的开发示例) +5. **完善发布维护文档**(CI/CD、版本管理) + +### 联系方式 + +如有文档问题或建议: + +- 📝 提交 Issue:https://github.com/HelloWRC/LanMountainDesktop/issues +- 💬 GitHub Discussions:https://github.com/HelloWRC/LanMountainDesktop/discussions + +--- + +**文档重构完成时间**: 2026年6月8日 +**重构人员**: Claude (Anthropic AI) +**文档版本**: v1.0.0 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..934ccba --- /dev/null +++ b/docs/README.md @@ -0,0 +1,99 @@ +# 阑山桌面技术文档 + +欢迎来到 **LanMountainDesktop(阑山桌面)** 技术文档中心。 + +## 📚 文档导航 + +### [00-快速开始](00-快速开始/) +项目概览、快速安装和基础配置 +- [项目介绍](00-快速开始/01-项目介绍.md) +- [快速安装](00-快速开始/02-快速安装.md) +- [开发环境配置](00-快速开始/03-开发环境配置.md) + +### [01-插件开发](01-插件开发/) +完整的插件开发指南,从入门到发布 +- [插件开发快速开始](01-插件开发/01-快速开始/) +- [插件核心概念](01-插件开发/02-核心概念/) +- [插件 API 参考](01-插件开发/03-API参考/) +- [插件开发实战](01-插件开发/04-实战案例/) +- [插件发布与维护](01-插件开发/05-发布维护/) + +### [02-AirApp开发](02-AirApp开发/) +Air APP 独立应用开发指南 +- [Air APP 介绍](02-AirApp开发/01-Air-APP介绍.md) +- [创建第一个 Air APP](02-AirApp开发/02-创建第一个AirApp.md) +- [Air APP 架构](02-AirApp开发/03-架构与生命周期.md) +- [Air APP IPC 通信](02-AirApp开发/04-IPC通信.md) +- [Air APP 打包发布](02-AirApp开发/05-打包与发布.md) + +### [03-组件设计规范](03-组件设计规范/) +桌面组件设计系统和视觉规范 +- [设计系统概述](03-组件设计规范/01-设计系统概述.md) +- [视觉规范](03-组件设计规范/02-视觉规范.md) +- [组件布局规范](03-组件设计规范/03-组件布局规范.md) +- [主题与外观](03-组件设计规范/04-主题与外观.md) +- [交互规范](03-组件设计规范/05-交互规范.md) + +### [04-架构与实现](04-架构与实现/) +技术架构、核心系统实现细节 +- [整体架构](04-架构与实现/01-整体架构.md) +- [启动器系统](04-架构与实现/02-启动器系统.md) +- [桌面宿主](04-架构与实现/03-桌面宿主.md) +- [插件运行时](04-架构与实现/04-插件运行时.md) +- [组件系统](04-架构与实现/05-组件系统.md) +- [设置系统](04-架构与实现/06-设置系统.md) +- [IPC 通信](04-架构与实现/07-IPC通信.md) + +### [05-更新与发布](05-更新与发布/) +应用更新、打包和发布流程 +- [更新系统架构](05-更新与发布/01-更新系统架构.md) +- [增量更新实现](05-更新与发布/02-增量更新实现.md) +- [打包与构建](05-更新与发布/03-打包与构建.md) +- [CI/CD 配置](05-更新与发布/04-CICD配置.md) +- [发布流程](05-更新与发布/05-发布流程.md) + +## 🎯 快速索引 + +### 我想... + +| 目标 | 查看文档 | +|------|---------| +| 了解项目基本信息 | [项目介绍](00-快速开始/01-项目介绍.md) | +| 搭建开发环境 | [开发环境配置](00-快速开始/03-开发环境配置.md) | +| 开发一个插件 | [插件开发快速开始](01-插件开发/01-快速开始/) | +| 创建桌面组件 | [组件系统](04-架构与实现/05-组件系统.md) | +| 开发独立应用 | [Air APP 开发](02-AirApp开发/) | +| 了解设计规范 | [设计系统概述](03-组件设计规范/01-设计系统概述.md) | +| 理解整体架构 | [整体架构](04-架构与实现/01-整体架构.md) | +| 配置自动更新 | [更新系统架构](05-更新与发布/01-更新系统架构.md) | +| 打包发布应用 | [打包与构建](05-更新与发布/03-打包与构建.md) | + +## 🔧 技术栈 + +- **.NET 10** - 应用框架 +- **Avalonia UI 12** - 跨平台 UI 框架 +- **FluentAvalonia** - Fluent Design 控件库 +- **CommunityToolkit.Mvvm** - MVVM 框架 +- **VeloPack** - 应用更新系统 +- **dotnetCampus.Ipc** - 进程间通信 + +## 📖 相关资源 + +- [GitHub 仓库](https://github.com/HelloWRC/LanMountainDesktop) +- [插件示例](https://github.com/HelloWRC/LanMountainDesktop.SamplePlugin) +- [Avalonia 文档](https://docs.avaloniaui.net/) +- [FluentAvalonia 文档](https://github.com/amwx/FluentAvalonia) + +## 📝 贡献文档 + +发现文档问题或想要改进?欢迎提交 Pull Request! + +文档源码位于 `docs/` 目录,使用 Markdown 格式编写。 + +## 📜 旧版文档 + +旧版文档已归档至 [archive](archive/) 目录,仅供参考。 + +--- + +**最后更新**: 2026年6月8日 diff --git a/docs/AOT_PUBLISH.md b/docs/archive/AOT_PUBLISH.md similarity index 100% rename from docs/AOT_PUBLISH.md rename to docs/archive/AOT_PUBLISH.md diff --git a/docs/ARCHITECTURE.md b/docs/archive/ARCHITECTURE.md similarity index 100% rename from docs/ARCHITECTURE.md rename to docs/archive/ARCHITECTURE.md diff --git a/docs/BUILD_AND_DEPLOY.md b/docs/archive/BUILD_AND_DEPLOY.md similarity index 100% rename from docs/BUILD_AND_DEPLOY.md rename to docs/archive/BUILD_AND_DEPLOY.md diff --git a/docs/CONTRIBUTING.md b/docs/archive/CONTRIBUTING.md similarity index 100% rename from docs/CONTRIBUTING.md rename to docs/archive/CONTRIBUTING.md diff --git a/docs/CORNER_RADIUS_SPEC.md b/docs/archive/CORNER_RADIUS_SPEC.md similarity index 100% rename from docs/CORNER_RADIUS_SPEC.md rename to docs/archive/CORNER_RADIUS_SPEC.md diff --git a/docs/DEVELOPMENT.md b/docs/archive/DEVELOPMENT.md similarity index 100% rename from docs/DEVELOPMENT.md rename to docs/archive/DEVELOPMENT.md diff --git a/docs/ECOSYSTEM_BOUNDARIES.md b/docs/archive/ECOSYSTEM_BOUNDARIES.md similarity index 100% rename from docs/ECOSYSTEM_BOUNDARIES.md rename to docs/archive/ECOSYSTEM_BOUNDARIES.md diff --git a/docs/EXTERNAL_IPC_ARCHITECTURE.md b/docs/archive/EXTERNAL_IPC_ARCHITECTURE.md similarity index 100% rename from docs/EXTERNAL_IPC_ARCHITECTURE.md rename to docs/archive/EXTERNAL_IPC_ARCHITECTURE.md diff --git a/docs/HOST_DISCOVERY.md b/docs/archive/HOST_DISCOVERY.md similarity index 100% rename from docs/HOST_DISCOVERY.md rename to docs/archive/HOST_DISCOVERY.md diff --git a/docs/IMAGE_RECOMMENDATION_COMPONENT_FEASIBILITY.md b/docs/archive/IMAGE_RECOMMENDATION_COMPONENT_FEASIBILITY.md similarity index 100% rename from docs/IMAGE_RECOMMENDATION_COMPONENT_FEASIBILITY.md rename to docs/archive/IMAGE_RECOMMENDATION_COMPONENT_FEASIBILITY.md diff --git a/docs/INFO_RECOMMENDATION_COMPONENT_FEASIBILITY.md b/docs/archive/INFO_RECOMMENDATION_COMPONENT_FEASIBILITY.md similarity index 100% rename from docs/INFO_RECOMMENDATION_COMPONENT_FEASIBILITY.md rename to docs/archive/INFO_RECOMMENDATION_COMPONENT_FEASIBILITY.md diff --git a/docs/JUYA_NEWS_DESIGN.md b/docs/archive/JUYA_NEWS_DESIGN.md similarity index 100% rename from docs/JUYA_NEWS_DESIGN.md rename to docs/archive/JUYA_NEWS_DESIGN.md diff --git a/docs/LAUNCHER.md b/docs/archive/LAUNCHER.md similarity index 100% rename from docs/LAUNCHER.md rename to docs/archive/LAUNCHER.md diff --git a/docs/LAUNCHER_COORDINATOR.md b/docs/archive/LAUNCHER_COORDINATOR.md similarity index 100% rename from docs/LAUNCHER_COORDINATOR.md rename to docs/archive/LAUNCHER_COORDINATOR.md diff --git a/docs/LAUNCHER_DISTRIBUTION.md b/docs/archive/LAUNCHER_DISTRIBUTION.md similarity index 100% rename from docs/LAUNCHER_DISTRIBUTION.md rename to docs/archive/LAUNCHER_DISTRIBUTION.md diff --git a/docs/LAUNCHER_STARTUP_VISUALS.md b/docs/archive/LAUNCHER_STARTUP_VISUALS.md similarity index 100% rename from docs/LAUNCHER_STARTUP_VISUALS.md rename to docs/archive/LAUNCHER_STARTUP_VISUALS.md diff --git a/docs/Launcher 单项目内部解耦改造计划(执行版).md b/docs/archive/Launcher 单项目内部解耦改造计划(执行版).md similarity index 100% rename from docs/Launcher 单项目内部解耦改造计划(执行版).md rename to docs/archive/Launcher 单项目内部解耦改造计划(执行版).md diff --git a/docs/PLUGIN_DEVELOPMENT.md b/docs/archive/PLUGIN_DEVELOPMENT.md similarity index 100% rename from docs/PLUGIN_DEVELOPMENT.md rename to docs/archive/PLUGIN_DEVELOPMENT.md diff --git a/docs/PLUGIN_PROCESS_ISOLATION_ARCHITECTURE.md b/docs/archive/PLUGIN_PROCESS_ISOLATION_ARCHITECTURE.md similarity index 100% rename from docs/PLUGIN_PROCESS_ISOLATION_ARCHITECTURE.md rename to docs/archive/PLUGIN_PROCESS_ISOLATION_ARCHITECTURE.md diff --git a/docs/PLUGIN_SDK_V4_MIGRATION.md b/docs/archive/PLUGIN_SDK_V4_MIGRATION.md similarity index 100% rename from docs/PLUGIN_SDK_V4_MIGRATION.md rename to docs/archive/PLUGIN_SDK_V4_MIGRATION.md diff --git a/docs/PLUGIN_SDK_V5_MIGRATION.md b/docs/archive/PLUGIN_SDK_V5_MIGRATION.md similarity index 100% rename from docs/PLUGIN_SDK_V5_MIGRATION.md rename to docs/archive/PLUGIN_SDK_V5_MIGRATION.md diff --git a/docs/PRODUCT.md b/docs/archive/PRODUCT.md similarity index 100% rename from docs/PRODUCT.md rename to docs/archive/PRODUCT.md diff --git a/docs/Plugins develop/00-索引与导航.md b/docs/archive/Plugins develop/00-索引与导航.md similarity index 100% rename from docs/Plugins develop/00-索引与导航.md rename to docs/archive/Plugins develop/00-索引与导航.md diff --git a/docs/Plugins develop/01-快速开始/01-开发环境准备.md b/docs/archive/Plugins develop/01-快速开始/01-开发环境准备.md similarity index 100% rename from docs/Plugins develop/01-快速开始/01-开发环境准备.md rename to docs/archive/Plugins develop/01-快速开始/01-开发环境准备.md diff --git a/docs/Plugins develop/01-快速开始/02-三分钟创建第一个插件.md b/docs/archive/Plugins develop/01-快速开始/02-三分钟创建第一个插件.md similarity index 100% rename from docs/Plugins develop/01-快速开始/02-三分钟创建第一个插件.md rename to docs/archive/Plugins develop/01-快速开始/02-三分钟创建第一个插件.md diff --git a/docs/Plugins develop/01-快速开始/03-插件项目结构详解.md b/docs/archive/Plugins develop/01-快速开始/03-插件项目结构详解.md similarity index 100% rename from docs/Plugins develop/01-快速开始/03-插件项目结构详解.md rename to docs/archive/Plugins develop/01-快速开始/03-插件项目结构详解.md diff --git a/docs/Plugins develop/01-快速开始/04-调试运行指南.md b/docs/archive/Plugins develop/01-快速开始/04-调试运行指南.md similarity index 100% rename from docs/Plugins develop/01-快速开始/04-调试运行指南.md rename to docs/archive/Plugins develop/01-快速开始/04-调试运行指南.md diff --git a/docs/Plugins develop/02-核心概念与原理/01-插件生命周期.md b/docs/archive/Plugins develop/02-核心概念与原理/01-插件生命周期.md similarity index 100% rename from docs/Plugins develop/02-核心概念与原理/01-插件生命周期.md rename to docs/archive/Plugins develop/02-核心概念与原理/01-插件生命周期.md diff --git a/docs/Plugins develop/02-核心概念与原理/02-桌面组件系统.md b/docs/archive/Plugins develop/02-核心概念与原理/02-桌面组件系统.md similarity index 100% rename from docs/Plugins develop/02-核心概念与原理/02-桌面组件系统.md rename to docs/archive/Plugins develop/02-核心概念与原理/02-桌面组件系统.md diff --git a/docs/Plugins develop/02-核心概念与原理/03-设置系统集成.md b/docs/archive/Plugins develop/02-核心概念与原理/03-设置系统集成.md similarity index 100% rename from docs/Plugins develop/02-核心概念与原理/03-设置系统集成.md rename to docs/archive/Plugins develop/02-核心概念与原理/03-设置系统集成.md diff --git a/docs/Plugins develop/02-核心概念与原理/04-外观与主题系统.md b/docs/archive/Plugins develop/02-核心概念与原理/04-外观与主题系统.md similarity index 100% rename from docs/Plugins develop/02-核心概念与原理/04-外观与主题系统.md rename to docs/archive/Plugins develop/02-核心概念与原理/04-外观与主题系统.md diff --git a/docs/Plugins develop/02-核心概念与原理/05-插件间通信.md b/docs/archive/Plugins develop/02-核心概念与原理/05-插件间通信.md similarity index 100% rename from docs/Plugins develop/02-核心概念与原理/05-插件间通信.md rename to docs/archive/Plugins develop/02-核心概念与原理/05-插件间通信.md diff --git a/docs/Plugins develop/03-API实践指南/01-PluginBase详解.md b/docs/archive/Plugins develop/03-API实践指南/01-PluginBase详解.md similarity index 100% rename from docs/Plugins develop/03-API实践指南/01-PluginBase详解.md rename to docs/archive/Plugins develop/03-API实践指南/01-PluginBase详解.md diff --git a/docs/Plugins develop/03-API实践指南/02-组件注册与配置.md b/docs/archive/Plugins develop/03-API实践指南/02-组件注册与配置.md similarity index 100% rename from docs/Plugins develop/03-API实践指南/02-组件注册与配置.md rename to docs/archive/Plugins develop/03-API实践指南/02-组件注册与配置.md diff --git a/docs/Plugins develop/03-API实践指南/03-设置API详解.md b/docs/archive/Plugins develop/03-API实践指南/03-设置API详解.md similarity index 100% rename from docs/Plugins develop/03-API实践指南/03-设置API详解.md rename to docs/archive/Plugins develop/03-API实践指南/03-设置API详解.md diff --git a/docs/Plugins develop/03-API实践指南/04-外观API详解.md b/docs/archive/Plugins develop/03-API实践指南/04-外观API详解.md similarity index 100% rename from docs/Plugins develop/03-API实践指南/04-外观API详解.md rename to docs/archive/Plugins develop/03-API实践指南/04-外观API详解.md diff --git a/docs/Plugins develop/03-API实践指南/05-本地化支持.md b/docs/archive/Plugins develop/03-API实践指南/05-本地化支持.md similarity index 100% rename from docs/Plugins develop/03-API实践指南/05-本地化支持.md rename to docs/archive/Plugins develop/03-API实践指南/05-本地化支持.md diff --git a/docs/Plugins develop/06-CI-CD与自动化/01-GitHub Actions入门.md b/docs/archive/Plugins develop/06-CI-CD与自动化/01-GitHub Actions入门.md similarity index 100% rename from docs/Plugins develop/06-CI-CD与自动化/01-GitHub Actions入门.md rename to docs/archive/Plugins develop/06-CI-CD与自动化/01-GitHub Actions入门.md diff --git a/docs/Plugins develop/06-CI-CD与自动化/02-配置自动构建.md b/docs/archive/Plugins develop/06-CI-CD与自动化/02-配置自动构建.md similarity index 100% rename from docs/Plugins develop/06-CI-CD与自动化/02-配置自动构建.md rename to docs/archive/Plugins develop/06-CI-CD与自动化/02-配置自动构建.md diff --git a/docs/Plugins develop/06-CI-CD与自动化/03-自动打包与发布.md b/docs/archive/Plugins develop/06-CI-CD与自动化/03-自动打包与发布.md similarity index 100% rename from docs/Plugins develop/06-CI-CD与自动化/03-自动打包与发布.md rename to docs/archive/Plugins develop/06-CI-CD与自动化/03-自动打包与发布.md diff --git a/docs/Plugins develop/07-发布与运营/01-插件打包规范.md b/docs/archive/Plugins develop/07-发布与运营/01-插件打包规范.md similarity index 100% rename from docs/Plugins develop/07-发布与运营/01-插件打包规范.md rename to docs/archive/Plugins develop/07-发布与运营/01-插件打包规范.md diff --git a/docs/Plugins develop/07-发布与运营/02-版本管理策略.md b/docs/archive/Plugins develop/07-发布与运营/02-版本管理策略.md similarity index 100% rename from docs/Plugins develop/07-发布与运营/02-版本管理策略.md rename to docs/archive/Plugins develop/07-发布与运营/02-版本管理策略.md diff --git a/docs/Plugins develop/07-发布与运营/03-发布到插件市场.md b/docs/archive/Plugins develop/07-发布与运营/03-发布到插件市场.md similarity index 100% rename from docs/Plugins develop/07-发布与运营/03-发布到插件市场.md rename to docs/archive/Plugins develop/07-发布与运营/03-发布到插件市场.md diff --git a/docs/Plugins develop/07-发布与运营/04-更新与维护.md b/docs/archive/Plugins develop/07-发布与运营/04-更新与维护.md similarity index 100% rename from docs/Plugins develop/07-发布与运营/04-更新与维护.md rename to docs/archive/Plugins develop/07-发布与运营/04-更新与维护.md diff --git a/docs/archive/README.md b/docs/archive/README.md new file mode 100644 index 0000000..b77d5a0 --- /dev/null +++ b/docs/archive/README.md @@ -0,0 +1,36 @@ +# 旧版文档归档 + +本目录包含阑山桌面项目的历史文档。这些文档已被新的文档体系替代,但保留在此以供参考。 + +## 归档时间 + +2026年6月8日 + +## 归档内容 + +- **原有插件开发文档** (`Plugins develop/`) - SDK v5 之前的插件开发指南 +- **原有技术文档** - 包括架构、构建、更新系统等文档 +- **AI 辅助文档** (`ai/`) - AI 生成的代码库地图和工作流程 +- **自动提交文档** (`auto_commit_md/`) - 自动生成的提交记录文档 +- **Superpowers 计划** (`superpowers/`) - 早期功能规划文档 + +## 新文档位置 + +新的文档体系位于 `docs/` 根目录,按照以下结构组织: + +``` +docs/ +├── 00-快速开始/ # 项目概览、快速安装 +├── 01-插件开发/ # 完整插件开发指南 +├── 02-AirApp开发/ # Air APP 应用开发 +├── 03-组件设计规范/ # 桌面组件设计系统 +├── 04-架构与实现/ # 技术架构文档 +├── 05-更新与发布/ # 更新系统和发布流程 +└── archive/ # 本归档目录 +``` + +## 注意事项 + +- 旧文档中的 API 和示例代码可能已过时 +- 请优先参考新文档体系 +- 如需查看历史实现细节,可参考此归档 diff --git a/docs/RUNTIME_PACKAGING.md b/docs/archive/RUNTIME_PACKAGING.md similarity index 100% rename from docs/RUNTIME_PACKAGING.md rename to docs/archive/RUNTIME_PACKAGING.md diff --git a/docs/SPECS.md b/docs/archive/SPECS.md similarity index 100% rename from docs/SPECS.md rename to docs/archive/SPECS.md diff --git a/docs/TROUBLESHOOTING.md b/docs/archive/TROUBLESHOOTING.md similarity index 100% rename from docs/TROUBLESHOOTING.md rename to docs/archive/TROUBLESHOOTING.md diff --git a/docs/TYPOGRAPHY_SPEC.md b/docs/archive/TYPOGRAPHY_SPEC.md similarity index 100% rename from docs/TYPOGRAPHY_SPEC.md rename to docs/archive/TYPOGRAPHY_SPEC.md diff --git a/docs/UPDATE_SYSTEM.md b/docs/archive/UPDATE_SYSTEM.md similarity index 100% rename from docs/UPDATE_SYSTEM.md rename to docs/archive/UPDATE_SYSTEM.md diff --git a/docs/VISUAL_SPEC.md b/docs/archive/VISUAL_SPEC.md similarity index 100% rename from docs/VISUAL_SPEC.md rename to docs/archive/VISUAL_SPEC.md diff --git a/docs/ZHIJIAO_HUB_COMPONENT_FINAL.md b/docs/archive/ZHIJIAO_HUB_COMPONENT_FINAL.md similarity index 100% rename from docs/ZHIJIAO_HUB_COMPONENT_FINAL.md rename to docs/archive/ZHIJIAO_HUB_COMPONENT_FINAL.md diff --git a/docs/ZHIJIAO_HUB_COMPONENT_SUMMARY.md b/docs/archive/ZHIJIAO_HUB_COMPONENT_SUMMARY.md similarity index 100% rename from docs/ZHIJIAO_HUB_COMPONENT_SUMMARY.md rename to docs/archive/ZHIJIAO_HUB_COMPONENT_SUMMARY.md diff --git a/docs/ai/CHANGE_WORKFLOW.md b/docs/archive/ai/CHANGE_WORKFLOW.md similarity index 100% rename from docs/ai/CHANGE_WORKFLOW.md rename to docs/archive/ai/CHANGE_WORKFLOW.md diff --git a/docs/ai/CODEBASE_MAP.md b/docs/archive/ai/CODEBASE_MAP.md similarity index 100% rename from docs/ai/CODEBASE_MAP.md rename to docs/archive/ai/CODEBASE_MAP.md diff --git a/docs/ai/DOC_SOURCES.md b/docs/archive/ai/DOC_SOURCES.md similarity index 100% rename from docs/ai/DOC_SOURCES.md rename to docs/archive/ai/DOC_SOURCES.md diff --git a/docs/ai/SETTINGS_WINDOW_DESIGN.md b/docs/archive/ai/SETTINGS_WINDOW_DESIGN.md similarity index 100% rename from docs/ai/SETTINGS_WINDOW_DESIGN.md rename to docs/archive/ai/SETTINGS_WINDOW_DESIGN.md diff --git a/docs/auto_commit_md/20250427_bd2313f.md b/docs/archive/auto_commit_md/20250427_bd2313f.md similarity index 100% rename from docs/auto_commit_md/20250427_bd2313f.md rename to docs/archive/auto_commit_md/20250427_bd2313f.md diff --git a/docs/auto_commit_md/20250428_148e4c8.md b/docs/archive/auto_commit_md/20250428_148e4c8.md similarity index 100% rename from docs/auto_commit_md/20250428_148e4c8.md rename to docs/archive/auto_commit_md/20250428_148e4c8.md diff --git a/docs/auto_commit_md/20250428_2dc729c.md b/docs/archive/auto_commit_md/20250428_2dc729c.md similarity index 100% rename from docs/auto_commit_md/20250428_2dc729c.md rename to docs/archive/auto_commit_md/20250428_2dc729c.md diff --git a/docs/auto_commit_md/20250428_5804627.md b/docs/archive/auto_commit_md/20250428_5804627.md similarity index 100% rename from docs/auto_commit_md/20250428_5804627.md rename to docs/archive/auto_commit_md/20250428_5804627.md diff --git a/docs/auto_commit_md/20250428_7a26848.md b/docs/archive/auto_commit_md/20250428_7a26848.md similarity index 100% rename from docs/auto_commit_md/20250428_7a26848.md rename to docs/archive/auto_commit_md/20250428_7a26848.md diff --git a/docs/auto_commit_md/20250428_f84111e.md b/docs/archive/auto_commit_md/20250428_f84111e.md similarity index 100% rename from docs/auto_commit_md/20250428_f84111e.md rename to docs/archive/auto_commit_md/20250428_f84111e.md diff --git a/docs/auto_commit_md/20250429_3b810fd.md b/docs/archive/auto_commit_md/20250429_3b810fd.md similarity index 100% rename from docs/auto_commit_md/20250429_3b810fd.md rename to docs/archive/auto_commit_md/20250429_3b810fd.md diff --git a/docs/auto_commit_md/20250429_9045624.md b/docs/archive/auto_commit_md/20250429_9045624.md similarity index 100% rename from docs/auto_commit_md/20250429_9045624.md rename to docs/archive/auto_commit_md/20250429_9045624.md diff --git a/docs/auto_commit_md/20250429_d054257.md b/docs/archive/auto_commit_md/20250429_d054257.md similarity index 100% rename from docs/auto_commit_md/20250429_d054257.md rename to docs/archive/auto_commit_md/20250429_d054257.md diff --git a/docs/auto_commit_md/20250429_f50cfed.md b/docs/archive/auto_commit_md/20250429_f50cfed.md similarity index 100% rename from docs/auto_commit_md/20250429_f50cfed.md rename to docs/archive/auto_commit_md/20250429_f50cfed.md diff --git a/docs/auto_commit_md/20250430_2272d35.md b/docs/archive/auto_commit_md/20250430_2272d35.md similarity index 100% rename from docs/auto_commit_md/20250430_2272d35.md rename to docs/archive/auto_commit_md/20250430_2272d35.md diff --git a/docs/auto_commit_md/20250501_88bd92e.md b/docs/archive/auto_commit_md/20250501_88bd92e.md similarity index 100% rename from docs/auto_commit_md/20250501_88bd92e.md rename to docs/archive/auto_commit_md/20250501_88bd92e.md diff --git a/docs/auto_commit_md/20250501_964cef2.md b/docs/archive/auto_commit_md/20250501_964cef2.md similarity index 100% rename from docs/auto_commit_md/20250501_964cef2.md rename to docs/archive/auto_commit_md/20250501_964cef2.md diff --git a/docs/auto_commit_md/20250501_ff01471.md b/docs/archive/auto_commit_md/20250501_ff01471.md similarity index 100% rename from docs/auto_commit_md/20250501_ff01471.md rename to docs/archive/auto_commit_md/20250501_ff01471.md diff --git a/docs/auto_commit_md/20250502_00339f0.md b/docs/archive/auto_commit_md/20250502_00339f0.md similarity index 100% rename from docs/auto_commit_md/20250502_00339f0.md rename to docs/archive/auto_commit_md/20250502_00339f0.md diff --git a/docs/auto_commit_md/20250502_021c7ff.md b/docs/archive/auto_commit_md/20250502_021c7ff.md similarity index 100% rename from docs/auto_commit_md/20250502_021c7ff.md rename to docs/archive/auto_commit_md/20250502_021c7ff.md diff --git a/docs/auto_commit_md/20250502_12a2f67.md b/docs/archive/auto_commit_md/20250502_12a2f67.md similarity index 100% rename from docs/auto_commit_md/20250502_12a2f67.md rename to docs/archive/auto_commit_md/20250502_12a2f67.md diff --git a/docs/auto_commit_md/20250502_1c3cc76.md b/docs/archive/auto_commit_md/20250502_1c3cc76.md similarity index 100% rename from docs/auto_commit_md/20250502_1c3cc76.md rename to docs/archive/auto_commit_md/20250502_1c3cc76.md diff --git a/docs/auto_commit_md/20250502_35976c3.md b/docs/archive/auto_commit_md/20250502_35976c3.md similarity index 100% rename from docs/auto_commit_md/20250502_35976c3.md rename to docs/archive/auto_commit_md/20250502_35976c3.md diff --git a/docs/auto_commit_md/20250502_44b87ba.md b/docs/archive/auto_commit_md/20250502_44b87ba.md similarity index 100% rename from docs/auto_commit_md/20250502_44b87ba.md rename to docs/archive/auto_commit_md/20250502_44b87ba.md diff --git a/docs/auto_commit_md/20250502_5d2449f.md b/docs/archive/auto_commit_md/20250502_5d2449f.md similarity index 100% rename from docs/auto_commit_md/20250502_5d2449f.md rename to docs/archive/auto_commit_md/20250502_5d2449f.md diff --git a/docs/auto_commit_md/20250502_675096b.md b/docs/archive/auto_commit_md/20250502_675096b.md similarity index 100% rename from docs/auto_commit_md/20250502_675096b.md rename to docs/archive/auto_commit_md/20250502_675096b.md diff --git a/docs/auto_commit_md/20250503_0662565.md b/docs/archive/auto_commit_md/20250503_0662565.md similarity index 100% rename from docs/auto_commit_md/20250503_0662565.md rename to docs/archive/auto_commit_md/20250503_0662565.md diff --git a/docs/auto_commit_md/20250505_5fa2031.md b/docs/archive/auto_commit_md/20250505_5fa2031.md similarity index 100% rename from docs/auto_commit_md/20250505_5fa2031.md rename to docs/archive/auto_commit_md/20250505_5fa2031.md diff --git a/docs/auto_commit_md/20250505_8583465.md b/docs/archive/auto_commit_md/20250505_8583465.md similarity index 100% rename from docs/auto_commit_md/20250505_8583465.md rename to docs/archive/auto_commit_md/20250505_8583465.md diff --git a/docs/auto_commit_md/20250505_d30af21.md b/docs/archive/auto_commit_md/20250505_d30af21.md similarity index 100% rename from docs/auto_commit_md/20250505_d30af21.md rename to docs/archive/auto_commit_md/20250505_d30af21.md diff --git a/docs/auto_commit_md/20250505_e1d5a0c.md b/docs/archive/auto_commit_md/20250505_e1d5a0c.md similarity index 100% rename from docs/auto_commit_md/20250505_e1d5a0c.md rename to docs/archive/auto_commit_md/20250505_e1d5a0c.md diff --git a/docs/auto_commit_md/20250505_e69bbf8.md b/docs/archive/auto_commit_md/20250505_e69bbf8.md similarity index 100% rename from docs/auto_commit_md/20250505_e69bbf8.md rename to docs/archive/auto_commit_md/20250505_e69bbf8.md diff --git a/docs/auto_commit_md/20250506_66ae0b0.md b/docs/archive/auto_commit_md/20250506_66ae0b0.md similarity index 100% rename from docs/auto_commit_md/20250506_66ae0b0.md rename to docs/archive/auto_commit_md/20250506_66ae0b0.md diff --git a/docs/auto_commit_md/20250506_6849a46.md b/docs/archive/auto_commit_md/20250506_6849a46.md similarity index 100% rename from docs/auto_commit_md/20250506_6849a46.md rename to docs/archive/auto_commit_md/20250506_6849a46.md diff --git a/docs/auto_commit_md/20250506_8c94253.md b/docs/archive/auto_commit_md/20250506_8c94253.md similarity index 100% rename from docs/auto_commit_md/20250506_8c94253.md rename to docs/archive/auto_commit_md/20250506_8c94253.md diff --git a/docs/auto_commit_md/20250506_a671db8.md b/docs/archive/auto_commit_md/20250506_a671db8.md similarity index 100% rename from docs/auto_commit_md/20250506_a671db8.md rename to docs/archive/auto_commit_md/20250506_a671db8.md diff --git a/docs/auto_commit_md/20250507_11130cf.md b/docs/archive/auto_commit_md/20250507_11130cf.md similarity index 100% rename from docs/auto_commit_md/20250507_11130cf.md rename to docs/archive/auto_commit_md/20250507_11130cf.md diff --git a/docs/auto_commit_md/20250507_84caca0.md b/docs/archive/auto_commit_md/20250507_84caca0.md similarity index 100% rename from docs/auto_commit_md/20250507_84caca0.md rename to docs/archive/auto_commit_md/20250507_84caca0.md diff --git a/docs/auto_commit_md/20250508_2156922.md b/docs/archive/auto_commit_md/20250508_2156922.md similarity index 100% rename from docs/auto_commit_md/20250508_2156922.md rename to docs/archive/auto_commit_md/20250508_2156922.md diff --git a/docs/auto_commit_md/20250508_cf4b8e2.md b/docs/archive/auto_commit_md/20250508_cf4b8e2.md similarity index 100% rename from docs/auto_commit_md/20250508_cf4b8e2.md rename to docs/archive/auto_commit_md/20250508_cf4b8e2.md diff --git a/docs/auto_commit_md/20250508_cf4b8e2_deep_analysis.md b/docs/archive/auto_commit_md/20250508_cf4b8e2_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250508_cf4b8e2_deep_analysis.md rename to docs/archive/auto_commit_md/20250508_cf4b8e2_deep_analysis.md diff --git a/docs/auto_commit_md/20250508_e795e99.md b/docs/archive/auto_commit_md/20250508_e795e99.md similarity index 100% rename from docs/auto_commit_md/20250508_e795e99.md rename to docs/archive/auto_commit_md/20250508_e795e99.md diff --git a/docs/auto_commit_md/20250508_e8ba847.md b/docs/archive/auto_commit_md/20250508_e8ba847.md similarity index 100% rename from docs/auto_commit_md/20250508_e8ba847.md rename to docs/archive/auto_commit_md/20250508_e8ba847.md diff --git a/docs/auto_commit_md/20250509_cb96180.md b/docs/archive/auto_commit_md/20250509_cb96180.md similarity index 100% rename from docs/auto_commit_md/20250509_cb96180.md rename to docs/archive/auto_commit_md/20250509_cb96180.md diff --git a/docs/auto_commit_md/20250510_4a89c23.md b/docs/archive/auto_commit_md/20250510_4a89c23.md similarity index 100% rename from docs/auto_commit_md/20250510_4a89c23.md rename to docs/archive/auto_commit_md/20250510_4a89c23.md diff --git a/docs/auto_commit_md/20250510_692ca3d.md b/docs/archive/auto_commit_md/20250510_692ca3d.md similarity index 100% rename from docs/auto_commit_md/20250510_692ca3d.md rename to docs/archive/auto_commit_md/20250510_692ca3d.md diff --git a/docs/auto_commit_md/20250510_91ab52c.md b/docs/archive/auto_commit_md/20250510_91ab52c.md similarity index 100% rename from docs/auto_commit_md/20250510_91ab52c.md rename to docs/archive/auto_commit_md/20250510_91ab52c.md diff --git a/docs/auto_commit_md/20250510_d62226f.md b/docs/archive/auto_commit_md/20250510_d62226f.md similarity index 100% rename from docs/auto_commit_md/20250510_d62226f.md rename to docs/archive/auto_commit_md/20250510_d62226f.md diff --git a/docs/auto_commit_md/20250511_76d13ac.md b/docs/archive/auto_commit_md/20250511_76d13ac.md similarity index 100% rename from docs/auto_commit_md/20250511_76d13ac.md rename to docs/archive/auto_commit_md/20250511_76d13ac.md diff --git a/docs/auto_commit_md/20250511_99a82d6.md b/docs/archive/auto_commit_md/20250511_99a82d6.md similarity index 100% rename from docs/auto_commit_md/20250511_99a82d6.md rename to docs/archive/auto_commit_md/20250511_99a82d6.md diff --git a/docs/auto_commit_md/20250512_1b22e9d.md b/docs/archive/auto_commit_md/20250512_1b22e9d.md similarity index 100% rename from docs/auto_commit_md/20250512_1b22e9d.md rename to docs/archive/auto_commit_md/20250512_1b22e9d.md diff --git a/docs/auto_commit_md/20250512_5f7b3a1.md b/docs/archive/auto_commit_md/20250512_5f7b3a1.md similarity index 100% rename from docs/auto_commit_md/20250512_5f7b3a1.md rename to docs/archive/auto_commit_md/20250512_5f7b3a1.md diff --git a/docs/auto_commit_md/20250512_b12dd68.md b/docs/archive/auto_commit_md/20250512_b12dd68.md similarity index 100% rename from docs/auto_commit_md/20250512_b12dd68.md rename to docs/archive/auto_commit_md/20250512_b12dd68.md diff --git a/docs/auto_commit_md/20250512_b12dd68_deep_analysis.md b/docs/archive/auto_commit_md/20250512_b12dd68_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250512_b12dd68_deep_analysis.md rename to docs/archive/auto_commit_md/20250512_b12dd68_deep_analysis.md diff --git a/docs/auto_commit_md/20250512_b933f3b.md b/docs/archive/auto_commit_md/20250512_b933f3b.md similarity index 100% rename from docs/auto_commit_md/20250512_b933f3b.md rename to docs/archive/auto_commit_md/20250512_b933f3b.md diff --git a/docs/auto_commit_md/20250512_ce5acf5.md b/docs/archive/auto_commit_md/20250512_ce5acf5.md similarity index 100% rename from docs/auto_commit_md/20250512_ce5acf5.md rename to docs/archive/auto_commit_md/20250512_ce5acf5.md diff --git a/docs/auto_commit_md/20250513_1e9ead8.md b/docs/archive/auto_commit_md/20250513_1e9ead8.md similarity index 100% rename from docs/auto_commit_md/20250513_1e9ead8.md rename to docs/archive/auto_commit_md/20250513_1e9ead8.md diff --git a/docs/auto_commit_md/20250513_9c529f2.md b/docs/archive/auto_commit_md/20250513_9c529f2.md similarity index 100% rename from docs/auto_commit_md/20250513_9c529f2.md rename to docs/archive/auto_commit_md/20250513_9c529f2.md diff --git a/docs/auto_commit_md/20250514_03e32ee.md b/docs/archive/auto_commit_md/20250514_03e32ee.md similarity index 100% rename from docs/auto_commit_md/20250514_03e32ee.md rename to docs/archive/auto_commit_md/20250514_03e32ee.md diff --git a/docs/auto_commit_md/20250514_2f0c178.md b/docs/archive/auto_commit_md/20250514_2f0c178.md similarity index 100% rename from docs/auto_commit_md/20250514_2f0c178.md rename to docs/archive/auto_commit_md/20250514_2f0c178.md diff --git a/docs/auto_commit_md/20250514_c2cc62b.md b/docs/archive/auto_commit_md/20250514_c2cc62b.md similarity index 100% rename from docs/auto_commit_md/20250514_c2cc62b.md rename to docs/archive/auto_commit_md/20250514_c2cc62b.md diff --git a/docs/auto_commit_md/20250515_1aaf6cd.md b/docs/archive/auto_commit_md/20250515_1aaf6cd.md similarity index 100% rename from docs/auto_commit_md/20250515_1aaf6cd.md rename to docs/archive/auto_commit_md/20250515_1aaf6cd.md diff --git a/docs/auto_commit_md/20250515_59c4824.md b/docs/archive/auto_commit_md/20250515_59c4824.md similarity index 100% rename from docs/auto_commit_md/20250515_59c4824.md rename to docs/archive/auto_commit_md/20250515_59c4824.md diff --git a/docs/auto_commit_md/20250515_e9ff590.md b/docs/archive/auto_commit_md/20250515_e9ff590.md similarity index 100% rename from docs/auto_commit_md/20250515_e9ff590.md rename to docs/archive/auto_commit_md/20250515_e9ff590.md diff --git a/docs/auto_commit_md/20250516_3957d81.md b/docs/archive/auto_commit_md/20250516_3957d81.md similarity index 100% rename from docs/auto_commit_md/20250516_3957d81.md rename to docs/archive/auto_commit_md/20250516_3957d81.md diff --git a/docs/auto_commit_md/20250516_4b89783.md b/docs/archive/auto_commit_md/20250516_4b89783.md similarity index 100% rename from docs/auto_commit_md/20250516_4b89783.md rename to docs/archive/auto_commit_md/20250516_4b89783.md diff --git a/docs/auto_commit_md/20250516_53ff98f.md b/docs/archive/auto_commit_md/20250516_53ff98f.md similarity index 100% rename from docs/auto_commit_md/20250516_53ff98f.md rename to docs/archive/auto_commit_md/20250516_53ff98f.md diff --git a/docs/auto_commit_md/20250516_6c526ff.md b/docs/archive/auto_commit_md/20250516_6c526ff.md similarity index 100% rename from docs/auto_commit_md/20250516_6c526ff.md rename to docs/archive/auto_commit_md/20250516_6c526ff.md diff --git a/docs/auto_commit_md/20250516_81ee19f.md b/docs/archive/auto_commit_md/20250516_81ee19f.md similarity index 100% rename from docs/auto_commit_md/20250516_81ee19f.md rename to docs/archive/auto_commit_md/20250516_81ee19f.md diff --git a/docs/auto_commit_md/20250516_9283da5.md b/docs/archive/auto_commit_md/20250516_9283da5.md similarity index 100% rename from docs/auto_commit_md/20250516_9283da5.md rename to docs/archive/auto_commit_md/20250516_9283da5.md diff --git a/docs/auto_commit_md/20250516_9efa43d.md b/docs/archive/auto_commit_md/20250516_9efa43d.md similarity index 100% rename from docs/auto_commit_md/20250516_9efa43d.md rename to docs/archive/auto_commit_md/20250516_9efa43d.md diff --git a/docs/auto_commit_md/20250518_4f9feaf.md b/docs/archive/auto_commit_md/20250518_4f9feaf.md similarity index 100% rename from docs/auto_commit_md/20250518_4f9feaf.md rename to docs/archive/auto_commit_md/20250518_4f9feaf.md diff --git a/docs/auto_commit_md/20250518_9cf3a15.md b/docs/archive/auto_commit_md/20250518_9cf3a15.md similarity index 100% rename from docs/auto_commit_md/20250518_9cf3a15.md rename to docs/archive/auto_commit_md/20250518_9cf3a15.md diff --git a/docs/auto_commit_md/20250518_e24f010.md b/docs/archive/auto_commit_md/20250518_e24f010.md similarity index 100% rename from docs/auto_commit_md/20250518_e24f010.md rename to docs/archive/auto_commit_md/20250518_e24f010.md diff --git a/docs/auto_commit_md/20250518_e8d2575.md b/docs/archive/auto_commit_md/20250518_e8d2575.md similarity index 100% rename from docs/auto_commit_md/20250518_e8d2575.md rename to docs/archive/auto_commit_md/20250518_e8d2575.md diff --git a/docs/auto_commit_md/20250519_02547ee.md b/docs/archive/auto_commit_md/20250519_02547ee.md similarity index 100% rename from docs/auto_commit_md/20250519_02547ee.md rename to docs/archive/auto_commit_md/20250519_02547ee.md diff --git a/docs/auto_commit_md/20250519_1e6b61d.md b/docs/archive/auto_commit_md/20250519_1e6b61d.md similarity index 100% rename from docs/auto_commit_md/20250519_1e6b61d.md rename to docs/archive/auto_commit_md/20250519_1e6b61d.md diff --git a/docs/auto_commit_md/20250519_24b361b.md b/docs/archive/auto_commit_md/20250519_24b361b.md similarity index 100% rename from docs/auto_commit_md/20250519_24b361b.md rename to docs/archive/auto_commit_md/20250519_24b361b.md diff --git a/docs/auto_commit_md/20250519_48ce93b.md b/docs/archive/auto_commit_md/20250519_48ce93b.md similarity index 100% rename from docs/auto_commit_md/20250519_48ce93b.md rename to docs/archive/auto_commit_md/20250519_48ce93b.md diff --git a/docs/auto_commit_md/20250519_62e7d96.md b/docs/archive/auto_commit_md/20250519_62e7d96.md similarity index 100% rename from docs/auto_commit_md/20250519_62e7d96.md rename to docs/archive/auto_commit_md/20250519_62e7d96.md diff --git a/docs/auto_commit_md/20250519_6343164.md b/docs/archive/auto_commit_md/20250519_6343164.md similarity index 100% rename from docs/auto_commit_md/20250519_6343164.md rename to docs/archive/auto_commit_md/20250519_6343164.md diff --git a/docs/auto_commit_md/20250519_833c693.md b/docs/archive/auto_commit_md/20250519_833c693.md similarity index 100% rename from docs/auto_commit_md/20250519_833c693.md rename to docs/archive/auto_commit_md/20250519_833c693.md diff --git a/docs/auto_commit_md/20250519_858612f.md b/docs/archive/auto_commit_md/20250519_858612f.md similarity index 100% rename from docs/auto_commit_md/20250519_858612f.md rename to docs/archive/auto_commit_md/20250519_858612f.md diff --git a/docs/auto_commit_md/20250519_8e21364.md b/docs/archive/auto_commit_md/20250519_8e21364.md similarity index 100% rename from docs/auto_commit_md/20250519_8e21364.md rename to docs/archive/auto_commit_md/20250519_8e21364.md diff --git a/docs/auto_commit_md/20250519_8e39ea8.md b/docs/archive/auto_commit_md/20250519_8e39ea8.md similarity index 100% rename from docs/auto_commit_md/20250519_8e39ea8.md rename to docs/archive/auto_commit_md/20250519_8e39ea8.md diff --git a/docs/auto_commit_md/20250519_c5ef418.md b/docs/archive/auto_commit_md/20250519_c5ef418.md similarity index 100% rename from docs/auto_commit_md/20250519_c5ef418.md rename to docs/archive/auto_commit_md/20250519_c5ef418.md diff --git a/docs/auto_commit_md/20250519_cddebbc.md b/docs/archive/auto_commit_md/20250519_cddebbc.md similarity index 100% rename from docs/auto_commit_md/20250519_cddebbc.md rename to docs/archive/auto_commit_md/20250519_cddebbc.md diff --git a/docs/auto_commit_md/20250519_f6a6f97.md b/docs/archive/auto_commit_md/20250519_f6a6f97.md similarity index 100% rename from docs/auto_commit_md/20250519_f6a6f97.md rename to docs/archive/auto_commit_md/20250519_f6a6f97.md diff --git a/docs/auto_commit_md/20250519_fb21bcd.md b/docs/archive/auto_commit_md/20250519_fb21bcd.md similarity index 100% rename from docs/auto_commit_md/20250519_fb21bcd.md rename to docs/archive/auto_commit_md/20250519_fb21bcd.md diff --git a/docs/auto_commit_md/20250520_81e0081.md b/docs/archive/auto_commit_md/20250520_81e0081.md similarity index 100% rename from docs/auto_commit_md/20250520_81e0081.md rename to docs/archive/auto_commit_md/20250520_81e0081.md diff --git a/docs/auto_commit_md/20250520_8447910.md b/docs/archive/auto_commit_md/20250520_8447910.md similarity index 100% rename from docs/auto_commit_md/20250520_8447910.md rename to docs/archive/auto_commit_md/20250520_8447910.md diff --git a/docs/auto_commit_md/20250520_8c58b1c.md b/docs/archive/auto_commit_md/20250520_8c58b1c.md similarity index 100% rename from docs/auto_commit_md/20250520_8c58b1c.md rename to docs/archive/auto_commit_md/20250520_8c58b1c.md diff --git a/docs/auto_commit_md/20250520_a31ae3c.md b/docs/archive/auto_commit_md/20250520_a31ae3c.md similarity index 100% rename from docs/auto_commit_md/20250520_a31ae3c.md rename to docs/archive/auto_commit_md/20250520_a31ae3c.md diff --git a/docs/auto_commit_md/20250520_a31ae3c_deep_analysis.md b/docs/archive/auto_commit_md/20250520_a31ae3c_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250520_a31ae3c_deep_analysis.md rename to docs/archive/auto_commit_md/20250520_a31ae3c_deep_analysis.md diff --git a/docs/auto_commit_md/20250520_e82c5d4.md b/docs/archive/auto_commit_md/20250520_e82c5d4.md similarity index 100% rename from docs/auto_commit_md/20250520_e82c5d4.md rename to docs/archive/auto_commit_md/20250520_e82c5d4.md diff --git a/docs/auto_commit_md/20250521_001a42a.md b/docs/archive/auto_commit_md/20250521_001a42a.md similarity index 100% rename from docs/auto_commit_md/20250521_001a42a.md rename to docs/archive/auto_commit_md/20250521_001a42a.md diff --git a/docs/auto_commit_md/20250521_631dc77.md b/docs/archive/auto_commit_md/20250521_631dc77.md similarity index 100% rename from docs/auto_commit_md/20250521_631dc77.md rename to docs/archive/auto_commit_md/20250521_631dc77.md diff --git a/docs/auto_commit_md/20250521_703ed7b.md b/docs/archive/auto_commit_md/20250521_703ed7b.md similarity index 100% rename from docs/auto_commit_md/20250521_703ed7b.md rename to docs/archive/auto_commit_md/20250521_703ed7b.md diff --git a/docs/auto_commit_md/20250521_8a75bc8.md b/docs/archive/auto_commit_md/20250521_8a75bc8.md similarity index 100% rename from docs/auto_commit_md/20250521_8a75bc8.md rename to docs/archive/auto_commit_md/20250521_8a75bc8.md diff --git a/docs/auto_commit_md/20250521_9224c9a.md b/docs/archive/auto_commit_md/20250521_9224c9a.md similarity index 100% rename from docs/auto_commit_md/20250521_9224c9a.md rename to docs/archive/auto_commit_md/20250521_9224c9a.md diff --git a/docs/auto_commit_md/20250521_aa7c118.md b/docs/archive/auto_commit_md/20250521_aa7c118.md similarity index 100% rename from docs/auto_commit_md/20250521_aa7c118.md rename to docs/archive/auto_commit_md/20250521_aa7c118.md diff --git a/docs/auto_commit_md/20250521_aa7c118_deep_analysis.md b/docs/archive/auto_commit_md/20250521_aa7c118_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250521_aa7c118_deep_analysis.md rename to docs/archive/auto_commit_md/20250521_aa7c118_deep_analysis.md diff --git a/docs/auto_commit_md/20250522_001d779.md b/docs/archive/auto_commit_md/20250522_001d779.md similarity index 100% rename from docs/auto_commit_md/20250522_001d779.md rename to docs/archive/auto_commit_md/20250522_001d779.md diff --git a/docs/auto_commit_md/20250522_0085c66.md b/docs/archive/auto_commit_md/20250522_0085c66.md similarity index 100% rename from docs/auto_commit_md/20250522_0085c66.md rename to docs/archive/auto_commit_md/20250522_0085c66.md diff --git a/docs/auto_commit_md/20250522_0085c66_deep_analysis.md b/docs/archive/auto_commit_md/20250522_0085c66_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250522_0085c66_deep_analysis.md rename to docs/archive/auto_commit_md/20250522_0085c66_deep_analysis.md diff --git a/docs/auto_commit_md/20250522_2d9391f.md b/docs/archive/auto_commit_md/20250522_2d9391f.md similarity index 100% rename from docs/auto_commit_md/20250522_2d9391f.md rename to docs/archive/auto_commit_md/20250522_2d9391f.md diff --git a/docs/auto_commit_md/20250522_33591a0.md b/docs/archive/auto_commit_md/20250522_33591a0.md similarity index 100% rename from docs/auto_commit_md/20250522_33591a0.md rename to docs/archive/auto_commit_md/20250522_33591a0.md diff --git a/docs/auto_commit_md/20250522_927dc8d.md b/docs/archive/auto_commit_md/20250522_927dc8d.md similarity index 100% rename from docs/auto_commit_md/20250522_927dc8d.md rename to docs/archive/auto_commit_md/20250522_927dc8d.md diff --git a/docs/auto_commit_md/20250522_d4901e4.md b/docs/archive/auto_commit_md/20250522_d4901e4.md similarity index 100% rename from docs/auto_commit_md/20250522_d4901e4.md rename to docs/archive/auto_commit_md/20250522_d4901e4.md diff --git a/docs/auto_commit_md/20250522_e20462a.md b/docs/archive/auto_commit_md/20250522_e20462a.md similarity index 100% rename from docs/auto_commit_md/20250522_e20462a.md rename to docs/archive/auto_commit_md/20250522_e20462a.md diff --git a/docs/auto_commit_md/20250523_28f41cd.md b/docs/archive/auto_commit_md/20250523_28f41cd.md similarity index 100% rename from docs/auto_commit_md/20250523_28f41cd.md rename to docs/archive/auto_commit_md/20250523_28f41cd.md diff --git a/docs/auto_commit_md/20250523_403cf28.md b/docs/archive/auto_commit_md/20250523_403cf28.md similarity index 100% rename from docs/auto_commit_md/20250523_403cf28.md rename to docs/archive/auto_commit_md/20250523_403cf28.md diff --git a/docs/auto_commit_md/20250523_43c0ee6.md b/docs/archive/auto_commit_md/20250523_43c0ee6.md similarity index 100% rename from docs/auto_commit_md/20250523_43c0ee6.md rename to docs/archive/auto_commit_md/20250523_43c0ee6.md diff --git a/docs/auto_commit_md/20250523_8b8c7d1.md b/docs/archive/auto_commit_md/20250523_8b8c7d1.md similarity index 100% rename from docs/auto_commit_md/20250523_8b8c7d1.md rename to docs/archive/auto_commit_md/20250523_8b8c7d1.md diff --git a/docs/auto_commit_md/20250523_9de93d2.md b/docs/archive/auto_commit_md/20250523_9de93d2.md similarity index 100% rename from docs/auto_commit_md/20250523_9de93d2.md rename to docs/archive/auto_commit_md/20250523_9de93d2.md diff --git a/docs/auto_commit_md/20250523_ad3648a.md b/docs/archive/auto_commit_md/20250523_ad3648a.md similarity index 100% rename from docs/auto_commit_md/20250523_ad3648a.md rename to docs/archive/auto_commit_md/20250523_ad3648a.md diff --git a/docs/auto_commit_md/20250524_05ffadd.md b/docs/archive/auto_commit_md/20250524_05ffadd.md similarity index 100% rename from docs/auto_commit_md/20250524_05ffadd.md rename to docs/archive/auto_commit_md/20250524_05ffadd.md diff --git a/docs/auto_commit_md/20250524_5b4b9f3.md b/docs/archive/auto_commit_md/20250524_5b4b9f3.md similarity index 100% rename from docs/auto_commit_md/20250524_5b4b9f3.md rename to docs/archive/auto_commit_md/20250524_5b4b9f3.md diff --git a/docs/auto_commit_md/20250524_5b4b9f3_deep_analysis.md b/docs/archive/auto_commit_md/20250524_5b4b9f3_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250524_5b4b9f3_deep_analysis.md rename to docs/archive/auto_commit_md/20250524_5b4b9f3_deep_analysis.md diff --git a/docs/auto_commit_md/20250525_01cf32a.md b/docs/archive/auto_commit_md/20250525_01cf32a.md similarity index 100% rename from docs/auto_commit_md/20250525_01cf32a.md rename to docs/archive/auto_commit_md/20250525_01cf32a.md diff --git a/docs/auto_commit_md/20250525_0b60338.md b/docs/archive/auto_commit_md/20250525_0b60338.md similarity index 100% rename from docs/auto_commit_md/20250525_0b60338.md rename to docs/archive/auto_commit_md/20250525_0b60338.md diff --git a/docs/auto_commit_md/20250525_12f0caa.md b/docs/archive/auto_commit_md/20250525_12f0caa.md similarity index 100% rename from docs/auto_commit_md/20250525_12f0caa.md rename to docs/archive/auto_commit_md/20250525_12f0caa.md diff --git a/docs/auto_commit_md/20250525_75aed3f.md b/docs/archive/auto_commit_md/20250525_75aed3f.md similarity index 100% rename from docs/auto_commit_md/20250525_75aed3f.md rename to docs/archive/auto_commit_md/20250525_75aed3f.md diff --git a/docs/auto_commit_md/20250525_791e38d.md b/docs/archive/auto_commit_md/20250525_791e38d.md similarity index 100% rename from docs/auto_commit_md/20250525_791e38d.md rename to docs/archive/auto_commit_md/20250525_791e38d.md diff --git a/docs/auto_commit_md/20250525_SUMMARY.md b/docs/archive/auto_commit_md/20250525_SUMMARY.md similarity index 100% rename from docs/auto_commit_md/20250525_SUMMARY.md rename to docs/archive/auto_commit_md/20250525_SUMMARY.md diff --git a/docs/auto_commit_md/20250525_a73ba32.md b/docs/archive/auto_commit_md/20250525_a73ba32.md similarity index 100% rename from docs/auto_commit_md/20250525_a73ba32.md rename to docs/archive/auto_commit_md/20250525_a73ba32.md diff --git a/docs/auto_commit_md/20250525_cc85638.md b/docs/archive/auto_commit_md/20250525_cc85638.md similarity index 100% rename from docs/auto_commit_md/20250525_cc85638.md rename to docs/archive/auto_commit_md/20250525_cc85638.md diff --git a/docs/auto_commit_md/20250525_d310fc5.md b/docs/archive/auto_commit_md/20250525_d310fc5.md similarity index 100% rename from docs/auto_commit_md/20250525_d310fc5.md rename to docs/archive/auto_commit_md/20250525_d310fc5.md diff --git a/docs/auto_commit_md/20250525_d310fc5_deep_analysis.md b/docs/archive/auto_commit_md/20250525_d310fc5_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250525_d310fc5_deep_analysis.md rename to docs/archive/auto_commit_md/20250525_d310fc5_deep_analysis.md diff --git a/docs/auto_commit_md/20250526_0e45c83.md b/docs/archive/auto_commit_md/20250526_0e45c83.md similarity index 100% rename from docs/auto_commit_md/20250526_0e45c83.md rename to docs/archive/auto_commit_md/20250526_0e45c83.md diff --git a/docs/auto_commit_md/20250526_cbaf2a0.md b/docs/archive/auto_commit_md/20250526_cbaf2a0.md similarity index 100% rename from docs/auto_commit_md/20250526_cbaf2a0.md rename to docs/archive/auto_commit_md/20250526_cbaf2a0.md diff --git a/docs/auto_commit_md/20250528_0f8e51f.md b/docs/archive/auto_commit_md/20250528_0f8e51f.md similarity index 100% rename from docs/auto_commit_md/20250528_0f8e51f.md rename to docs/archive/auto_commit_md/20250528_0f8e51f.md diff --git a/docs/auto_commit_md/20250528_8e82efc.md b/docs/archive/auto_commit_md/20250528_8e82efc.md similarity index 100% rename from docs/auto_commit_md/20250528_8e82efc.md rename to docs/archive/auto_commit_md/20250528_8e82efc.md diff --git a/docs/auto_commit_md/20250528_93d6d93.md b/docs/archive/auto_commit_md/20250528_93d6d93.md similarity index 100% rename from docs/auto_commit_md/20250528_93d6d93.md rename to docs/archive/auto_commit_md/20250528_93d6d93.md diff --git a/docs/auto_commit_md/20250528_93d6d93_deep_analysis.md b/docs/archive/auto_commit_md/20250528_93d6d93_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250528_93d6d93_deep_analysis.md rename to docs/archive/auto_commit_md/20250528_93d6d93_deep_analysis.md diff --git a/docs/auto_commit_md/20250528_9fb4137.md b/docs/archive/auto_commit_md/20250528_9fb4137.md similarity index 100% rename from docs/auto_commit_md/20250528_9fb4137.md rename to docs/archive/auto_commit_md/20250528_9fb4137.md diff --git a/docs/auto_commit_md/20250528_f8073c2.md b/docs/archive/auto_commit_md/20250528_f8073c2.md similarity index 100% rename from docs/auto_commit_md/20250528_f8073c2.md rename to docs/archive/auto_commit_md/20250528_f8073c2.md diff --git a/docs/auto_commit_md/20250529_5ea242a.md b/docs/archive/auto_commit_md/20250529_5ea242a.md similarity index 100% rename from docs/auto_commit_md/20250529_5ea242a.md rename to docs/archive/auto_commit_md/20250529_5ea242a.md diff --git a/docs/auto_commit_md/20250529_eb066b5.md b/docs/archive/auto_commit_md/20250529_eb066b5.md similarity index 100% rename from docs/auto_commit_md/20250529_eb066b5.md rename to docs/archive/auto_commit_md/20250529_eb066b5.md diff --git a/docs/auto_commit_md/20250529_fc4d0c4.md b/docs/archive/auto_commit_md/20250529_fc4d0c4.md similarity index 100% rename from docs/auto_commit_md/20250529_fc4d0c4.md rename to docs/archive/auto_commit_md/20250529_fc4d0c4.md diff --git a/docs/auto_commit_md/20250530_0167014.md b/docs/archive/auto_commit_md/20250530_0167014.md similarity index 100% rename from docs/auto_commit_md/20250530_0167014.md rename to docs/archive/auto_commit_md/20250530_0167014.md diff --git a/docs/auto_commit_md/20250530_0348324.md b/docs/archive/auto_commit_md/20250530_0348324.md similarity index 100% rename from docs/auto_commit_md/20250530_0348324.md rename to docs/archive/auto_commit_md/20250530_0348324.md diff --git a/docs/auto_commit_md/20250601_1d7df5a.md b/docs/archive/auto_commit_md/20250601_1d7df5a.md similarity index 100% rename from docs/auto_commit_md/20250601_1d7df5a.md rename to docs/archive/auto_commit_md/20250601_1d7df5a.md diff --git a/docs/auto_commit_md/20250601_3a85163.md b/docs/archive/auto_commit_md/20250601_3a85163.md similarity index 100% rename from docs/auto_commit_md/20250601_3a85163.md rename to docs/archive/auto_commit_md/20250601_3a85163.md diff --git a/docs/auto_commit_md/20250601_458494d.md b/docs/archive/auto_commit_md/20250601_458494d.md similarity index 100% rename from docs/auto_commit_md/20250601_458494d.md rename to docs/archive/auto_commit_md/20250601_458494d.md diff --git a/docs/auto_commit_md/20250601_49bbae2.md b/docs/archive/auto_commit_md/20250601_49bbae2.md similarity index 100% rename from docs/auto_commit_md/20250601_49bbae2.md rename to docs/archive/auto_commit_md/20250601_49bbae2.md diff --git a/docs/auto_commit_md/20250601_49bbae2_deep_analysis.md b/docs/archive/auto_commit_md/20250601_49bbae2_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250601_49bbae2_deep_analysis.md rename to docs/archive/auto_commit_md/20250601_49bbae2_deep_analysis.md diff --git a/docs/auto_commit_md/20250601_574b798.md b/docs/archive/auto_commit_md/20250601_574b798.md similarity index 100% rename from docs/auto_commit_md/20250601_574b798.md rename to docs/archive/auto_commit_md/20250601_574b798.md diff --git a/docs/auto_commit_md/20250601_6a30bc6.md b/docs/archive/auto_commit_md/20250601_6a30bc6.md similarity index 100% rename from docs/auto_commit_md/20250601_6a30bc6.md rename to docs/archive/auto_commit_md/20250601_6a30bc6.md diff --git a/docs/auto_commit_md/20250601_cf79d73.md b/docs/archive/auto_commit_md/20250601_cf79d73.md similarity index 100% rename from docs/auto_commit_md/20250601_cf79d73.md rename to docs/archive/auto_commit_md/20250601_cf79d73.md diff --git a/docs/auto_commit_md/20250603_60e7f31.md b/docs/archive/auto_commit_md/20250603_60e7f31.md similarity index 100% rename from docs/auto_commit_md/20250603_60e7f31.md rename to docs/archive/auto_commit_md/20250603_60e7f31.md diff --git a/docs/auto_commit_md/20250605_68ca532.md b/docs/archive/auto_commit_md/20250605_68ca532.md similarity index 100% rename from docs/auto_commit_md/20250605_68ca532.md rename to docs/archive/auto_commit_md/20250605_68ca532.md diff --git a/docs/auto_commit_md/20250605_6b1c738.md b/docs/archive/auto_commit_md/20250605_6b1c738.md similarity index 100% rename from docs/auto_commit_md/20250605_6b1c738.md rename to docs/archive/auto_commit_md/20250605_6b1c738.md diff --git a/docs/auto_commit_md/20250605_6b1c738_deep_analysis.md b/docs/archive/auto_commit_md/20250605_6b1c738_deep_analysis.md similarity index 100% rename from docs/auto_commit_md/20250605_6b1c738_deep_analysis.md rename to docs/archive/auto_commit_md/20250605_6b1c738_deep_analysis.md diff --git a/docs/auto_commit_md/20250605_aa7e15d.md b/docs/archive/auto_commit_md/20250605_aa7e15d.md similarity index 100% rename from docs/auto_commit_md/20250605_aa7e15d.md rename to docs/archive/auto_commit_md/20250605_aa7e15d.md diff --git a/docs/auto_commit_md/20250605_b71687c.md b/docs/archive/auto_commit_md/20250605_b71687c.md similarity index 100% rename from docs/auto_commit_md/20250605_b71687c.md rename to docs/archive/auto_commit_md/20250605_b71687c.md diff --git a/docs/auto_commit_md/20250605_f8a4bb8.md b/docs/archive/auto_commit_md/20250605_f8a4bb8.md similarity index 100% rename from docs/auto_commit_md/20250605_f8a4bb8.md rename to docs/archive/auto_commit_md/20250605_f8a4bb8.md diff --git a/docs/auto_commit_md/20260511_SUMMARY.md b/docs/archive/auto_commit_md/20260511_SUMMARY.md similarity index 100% rename from docs/auto_commit_md/20260511_SUMMARY.md rename to docs/archive/auto_commit_md/20260511_SUMMARY.md diff --git a/docs/auto_commit_md/20260512_563f12ca.md b/docs/archive/auto_commit_md/20260512_563f12ca.md similarity index 100% rename from docs/auto_commit_md/20260512_563f12ca.md rename to docs/archive/auto_commit_md/20260512_563f12ca.md diff --git a/docs/auto_commit_md/20260513_ada0cd4.md b/docs/archive/auto_commit_md/20260513_ada0cd4.md similarity index 100% rename from docs/auto_commit_md/20260513_ada0cd4.md rename to docs/archive/auto_commit_md/20260513_ada0cd4.md diff --git a/docs/auto_commit_md/20260518_93758fc0.md b/docs/archive/auto_commit_md/20260518_93758fc0.md similarity index 100% rename from docs/auto_commit_md/20260518_93758fc0.md rename to docs/archive/auto_commit_md/20260518_93758fc0.md diff --git a/docs/auto_commit_md/20260519_7a70476.md b/docs/archive/auto_commit_md/20260519_7a70476.md similarity index 100% rename from docs/auto_commit_md/20260519_7a70476.md rename to docs/archive/auto_commit_md/20260519_7a70476.md diff --git a/docs/auto_commit_md/20260523_ac8ee8d.md b/docs/archive/auto_commit_md/20260523_ac8ee8d.md similarity index 100% rename from docs/auto_commit_md/20260523_ac8ee8d.md rename to docs/archive/auto_commit_md/20260523_ac8ee8d.md diff --git a/docs/auto_commit_md/20260525_01cf32a.md b/docs/archive/auto_commit_md/20260525_01cf32a.md similarity index 100% rename from docs/auto_commit_md/20260525_01cf32a.md rename to docs/archive/auto_commit_md/20260525_01cf32a.md diff --git a/docs/auto_commit_md/20260525_0361b83.md b/docs/archive/auto_commit_md/20260525_0361b83.md similarity index 100% rename from docs/auto_commit_md/20260525_0361b83.md rename to docs/archive/auto_commit_md/20260525_0361b83.md diff --git a/docs/auto_commit_md/20260525_12f0caa.md b/docs/archive/auto_commit_md/20260525_12f0caa.md similarity index 100% rename from docs/auto_commit_md/20260525_12f0caa.md rename to docs/archive/auto_commit_md/20260525_12f0caa.md diff --git a/docs/auto_commit_md/20260525_75aed3f.md b/docs/archive/auto_commit_md/20260525_75aed3f.md similarity index 100% rename from docs/auto_commit_md/20260525_75aed3f.md rename to docs/archive/auto_commit_md/20260525_75aed3f.md diff --git a/docs/auto_commit_md/20260525_791e38d.md b/docs/archive/auto_commit_md/20260525_791e38d.md similarity index 100% rename from docs/auto_commit_md/20260525_791e38d.md rename to docs/archive/auto_commit_md/20260525_791e38d.md diff --git a/docs/auto_commit_md/20260525_cc85638.md b/docs/archive/auto_commit_md/20260525_cc85638.md similarity index 100% rename from docs/auto_commit_md/20260525_cc85638.md rename to docs/archive/auto_commit_md/20260525_cc85638.md diff --git a/docs/auto_commit_md/20260527_63f0898.md b/docs/archive/auto_commit_md/20260527_63f0898.md similarity index 100% rename from docs/auto_commit_md/20260527_63f0898.md rename to docs/archive/auto_commit_md/20260527_63f0898.md diff --git a/docs/auto_commit_md/20260527_ce41fd6.md b/docs/archive/auto_commit_md/20260527_ce41fd6.md similarity index 100% rename from docs/auto_commit_md/20260527_ce41fd6.md rename to docs/archive/auto_commit_md/20260527_ce41fd6.md diff --git a/docs/auto_commit_md/20260528_1ee6e68.md b/docs/archive/auto_commit_md/20260528_1ee6e68.md similarity index 100% rename from docs/auto_commit_md/20260528_1ee6e68.md rename to docs/archive/auto_commit_md/20260528_1ee6e68.md diff --git a/docs/auto_commit_md/20260528_1ef47c7.md b/docs/archive/auto_commit_md/20260528_1ef47c7.md similarity index 100% rename from docs/auto_commit_md/20260528_1ef47c7.md rename to docs/archive/auto_commit_md/20260528_1ef47c7.md diff --git a/docs/auto_commit_md/20260528_545dee8.md b/docs/archive/auto_commit_md/20260528_545dee8.md similarity index 100% rename from docs/auto_commit_md/20260528_545dee8.md rename to docs/archive/auto_commit_md/20260528_545dee8.md diff --git a/docs/auto_commit_md/20260528_a26b6fa.md b/docs/archive/auto_commit_md/20260528_a26b6fa.md similarity index 100% rename from docs/auto_commit_md/20260528_a26b6fa.md rename to docs/archive/auto_commit_md/20260528_a26b6fa.md diff --git a/docs/auto_commit_md/20260528_b219f10.md b/docs/archive/auto_commit_md/20260528_b219f10.md similarity index 100% rename from docs/auto_commit_md/20260528_b219f10.md rename to docs/archive/auto_commit_md/20260528_b219f10.md diff --git a/docs/auto_commit_md/20260528_ebe35d6.md b/docs/archive/auto_commit_md/20260528_ebe35d6.md similarity index 100% rename from docs/auto_commit_md/20260528_ebe35d6.md rename to docs/archive/auto_commit_md/20260528_ebe35d6.md diff --git a/docs/auto_commit_md/20260530_6a65087.md b/docs/archive/auto_commit_md/20260530_6a65087.md similarity index 100% rename from docs/auto_commit_md/20260530_6a65087.md rename to docs/archive/auto_commit_md/20260530_6a65087.md diff --git a/docs/auto_commit_md/20260531_21e970c.md b/docs/archive/auto_commit_md/20260531_21e970c.md similarity index 100% rename from docs/auto_commit_md/20260531_21e970c.md rename to docs/archive/auto_commit_md/20260531_21e970c.md diff --git a/docs/auto_commit_md/20260607_11b8216e.md b/docs/archive/auto_commit_md/20260607_11b8216e.md similarity index 100% rename from docs/auto_commit_md/20260607_11b8216e.md rename to docs/archive/auto_commit_md/20260607_11b8216e.md diff --git a/docs/auto_commit_md/DEEP_ANALYSIS_SUMMARY.md b/docs/archive/auto_commit_md/DEEP_ANALYSIS_SUMMARY.md similarity index 100% rename from docs/auto_commit_md/DEEP_ANALYSIS_SUMMARY.md rename to docs/archive/auto_commit_md/DEEP_ANALYSIS_SUMMARY.md diff --git a/docs/auto_commit_md/README.md b/docs/archive/auto_commit_md/README.md similarity index 100% rename from docs/auto_commit_md/README.md rename to docs/archive/auto_commit_md/README.md diff --git a/docs/launcher_architecture_analysis.md b/docs/archive/launcher_architecture_analysis.md similarity index 100% rename from docs/launcher_architecture_analysis.md rename to docs/archive/launcher_architecture_analysis.md diff --git a/docs/superpowers/plans/2026-05-26-telemetry-normalization.md b/docs/archive/superpowers/plans/2026-05-26-telemetry-normalization.md similarity index 100% rename from docs/superpowers/plans/2026-05-26-telemetry-normalization.md rename to docs/archive/superpowers/plans/2026-05-26-telemetry-normalization.md