diff --git a/.aide/branches.json b/.aide/branches.json new file mode 100644 index 0000000..8bd9883 --- /dev/null +++ b/.aide/branches.json @@ -0,0 +1,15 @@ +{ + "next_number": 2, + "branches": [ + { + "number": 1, + "branch_name": "aide/001", + "source_branch": "master", + "start_commit": "bd723629c5b471637a69c68dd5cdb6e4e4dee238", + "task_id": "2025-12-17T04-54-31", + "task_summary": "开始任务准备: 创建环境安装 Command", + "started_at": "2025-12-17T04:54:31+08:00", + "status": "active" + } + ] +} diff --git a/.aide/branches.md b/.aide/branches.md new file mode 100644 index 0000000..d6b059a --- /dev/null +++ b/.aide/branches.md @@ -0,0 +1,10 @@ +# Git 分支概况 + +## aide/001 + +- **任务**: 开始任务准备: 创建环境安装 Command +- **任务ID**: 2025-12-17T04-54-31 +- **源分支**: master +- **起始提交**: bd72362 +- **状态**: active +- **时间**: 2025-12-17 04:54 diff --git a/.aide/decisions/2025-12-17T04-59-10.json b/.aide/decisions/2025-12-17T04-59-10.json new file mode 100644 index 0000000..2bb62bb --- /dev/null +++ b/.aide/decisions/2025-12-17T04-59-10.json @@ -0,0 +1,155 @@ +{ + "input": { + "task": "创建环境安装 Command", + "source": "task-now.md", + "items": [ + { + "id": 1, + "title": "离线安装程序是否需要实现?", + "options": [ + { + "value": "defer", + "label": "暂不实现,作为后续迭代", + "score": 85.0, + "pros": [ + "聚焦核心需求", + "减少本次工作量", + "可以先验证 Command 方案的有效性" + ], + "cons": [ + "无法处理完全无网络的环境" + ] + }, + { + "value": "implement", + "label": "本次一并实现离线安装程序", + "score": 60.0, + "pros": [ + "一次性完整覆盖所有场景", + "支持企业内网环境" + ], + "cons": [ + "工作量大", + "维护成本高", + "需要处理多平台二进制分发" + ] + }, + { + "value": "resource_list_only", + "label": "仅提供资源清单和手动指南", + "score": 70.0, + "pros": [ + "折中方案", + "用户可自行下载" + ], + "cons": [ + "离线体验不完整", + "用户需手动操作较多" + ] + } + ], + "location": { + "file": "task-now.md", + "start": 17, + "end": 21 + }, + "context": "任务文档中询问是否可以实现离线安装方案:先提供资源清单,用户下载资源后通过程序完成安装。这是一个独立的功能模块,与 Command 是两种不同的实现方式。", + "recommend": "defer" + }, + { + "id": 2, + "title": "是否需要支持 macOS?", + "options": [ + { + "value": "no_macos", + "label": "仅支持 Windows 和 Linux", + "score": 75.0, + "pros": [ + "严格按任务要求", + "减少工作量" + ], + "cons": [ + "macOS 用户无法使用" + ] + }, + { + "value": "include_macos", + "label": "增加 macOS 支持", + "score": 80.0, + "pros": [ + "覆盖主流开发平台", + "macOS 与 Linux 安装方式相似" + ], + "cons": [ + "增加一定工作量", + "需要测试验证" + ] + } + ], + "location": { + "file": "task-now.md", + "start": 5, + "end": 5 + }, + "context": "任务文档明确提到需要为 Windows 和 Linux 创建专用 command,但未提及 macOS。macOS 在开发者群体中使用广泛,需要确认是否纳入本次实现范围。", + "recommend": "include_macos" + }, + { + "id": 3, + "title": "Command 命名和组织方式", + "options": [ + { + "value": "unified", + "label": "/aide:install(统一命令,自动检测系统)", + "score": 90.0, + "pros": [ + "用户体验统一", + "自动适配系统", + "一个命令解决问题" + ], + "cons": [ + "Command 文件会较长" + ] + }, + { + "value": "separated", + "label": "/aide:install-win 和 /aide:install-linux(分离命令)", + "score": 65.0, + "pros": [ + "文件结构清晰", + "平台逻辑隔离" + ], + "cons": [ + "用户需要知道自己的系统", + "维护多个文件" + ] + } + ], + "location": { + "file": "task-now.md", + "start": 5, + "end": 5 + }, + "context": "任务提到「为 Windows 和 Linux 单独创建专用的完整 command」,这可以理解为两种组织方式:统一命令自动检测系统,或分离命令让用户选择。", + "recommend": "unified" + } + ] + }, + "output": { + "decisions": [ + { + "id": 1, + "chosen": "implement" + }, + { + "id": 2, + "chosen": "no_macos" + }, + { + "id": 3, + "chosen": "separated" + } + ] + }, + "completed_at": "2025-12-17T05:00:32+08:00" +} diff --git a/.aide/decisions/pending.json b/.aide/decisions/pending.json index 159ba45..1bf2adf 100644 --- a/.aide/decisions/pending.json +++ b/.aide/decisions/pending.json @@ -1,292 +1,140 @@ { - "task": "Aide 工具 Git 分支管理和任务细则强制确认功能", + "task": "创建环境安装 Command", "source": "task-now.md", "items": [ { "id": 1, - "title": "分支命名规则", + "title": "离线安装程序是否需要实现?", "options": [ { - "value": "aide_taskid", - "label": "aide/", - "score": 90.0, + "value": "defer", + "label": "暂不实现,作为后续迭代", + "score": 85.0, "pros": [ - "与 task_id 直接关联,易于追溯", - "格式规范,避免冲突", - "示例:aide/2025-12-17T10-30-00" + "聚焦核心需求", + "减少本次工作量", + "可以先验证 Command 方案的有效性" ], "cons": [ - "分支名较长" + "无法处理完全无网络的环境" ] }, { - "value": "task_taskid", - "label": "task/", - "score": 75.0, + "value": "implement", + "label": "本次一并实现离线安装程序", + "score": 60.0, "pros": [ - "简洁明了", - "与任务概念直接对应" + "一次性完整覆盖所有场景", + "支持企业内网环境" ], "cons": [ - "可能与其他工具的分支命名冲突" + "工作量大", + "维护成本高", + "需要处理多平台二进制分发" ] }, { - "value": "custom_prefix", - "label": "可配置前缀", + "value": "resource_list_only", + "label": "仅提供资源清单和手动指南", "score": 70.0, "pros": [ - "灵活性高,用户可自定义" + "折中方案", + "用户可自行下载" ], "cons": [ - "增加配置复杂度" + "离线体验不完整", + "用户需手动操作较多" ] } ], "location": { "file": "task-now.md", - "start": 15, - "end": 16 + "start": 17, + "end": 21 }, - "context": "用户希望在任务开始时创建新分支,需要确定分支命名规则。分支名将用于区分不同任务的工作内容。", - "recommend": "aide_taskid" + "context": "任务文档中询问是否可以实现离线安装方案:先提供资源清单,用户下载资源后通过程序完成安装。这是一个独立的功能模块,与 Command 是两种不同的实现方式。", + "recommend": "defer" }, { "id": 2, - "title": "分支概况文档格式", + "title": "是否需要支持 macOS?", "options": [ { - "value": "json", - "label": "JSON 格式 (.aide/branches.json)", - "score": 85.0, + "value": "no_macos", + "label": "仅支持 Windows 和 Linux", + "score": 75.0, "pros": [ - "结构化数据,易于程序处理", - "可精确存储多条记录", - "与现有 flow-status.json 风格一致" + "严格按任务要求", + "减少工作量" ], "cons": [ - "人工阅读不够直观" + "macOS 用户无法使用" ] }, { - "value": "markdown", - "label": "Markdown 格式 (.aide/branches.md)", - "score": 70.0, + "value": "include_macos", + "label": "增加 macOS 支持", + "score": 80.0, "pros": [ - "人工阅读友好", - "可直接在编辑器中查看" + "覆盖主流开发平台", + "macOS 与 Linux 安装方式相似" ], "cons": [ - "解析复杂,数据提取不便" + "增加一定工作量", + "需要测试验证" ] } ], "location": { "file": "task-now.md", - "start": 11, - "end": 12 + "start": 5, + "end": 5 }, - "context": "需要维护一份记录 git 分支概况的文档,存储分支名、起始提交、源分支、结束提交等信息。需确定文档格式。", - "recommend": "json" + "context": "任务文档明确提到需要为 Windows 和 Linux 创建专用 command,但未提及 macOS。macOS 在开发者群体中使用广泛,需要确认是否纳入本次实现范围。", + "recommend": "include_macos" }, { "id": 3, - "title": "合并冲突处理策略", + "title": "Command 命名和组织方式", "options": [ { - "value": "abort_warning", - "label": "检测冲突时中止并警告", - "score": 85.0, - "pros": [ - "安全,不会意外覆盖代码", - "用户有完全控制权" - ], - "cons": [ - "需要用户手动解决" - ] - }, - { - "value": "squash_merge", - "label": "使用 squash 合并(避免大部分冲突)", - "score": 75.0, - "pros": [ - "减少冲突可能性", - "生成单一提交" - ], - "cons": [ - "某些场景仍可能冲突" - ] - }, - { - "value": "force_override", - "label": "强制覆盖(任务分支优先)", - "score": 40.0, - "pros": [ - "总能完成合并" - ], - "cons": [ - "可能丢失原分支的其他更改", - "风险较高" - ] - } - ], - "location": { - "file": "task-now.md", - "start": 18, - "end": 21 - }, - "context": "任务结束时需要将任务分支合并回原分支。如果原分支在任务期间有其他提交,可能产生合并冲突。需确定处理策略。", - "recommend": "abort_warning" - }, - { - "id": 4, - "title": "任务中断恢复策略", - "options": [ - { - "value": "manual_cleanup", - "label": "保留分支,用户手动处理", - "score": 80.0, - "pros": [ - "保留所有工作成果", - "用户完全控制" - ], - "cons": [ - "可能积累废弃分支" - ] - }, - { - "value": "abort_command", - "label": "提供 aide flow abort 命令", + "value": "unified", + "label": "/aide:install(统一命令,自动检测系统)", "score": 90.0, "pros": [ - "提供标准化的清理方式", - "可选择保留或删除分支" + "用户体验统一", + "自动适配系统", + "一个命令解决问题" ], "cons": [ - "需要额外开发" + "Command 文件会较长" ] }, { - "value": "auto_cleanup", - "label": "下次 start 时自动清理", - "score": 60.0, + "value": "separated", + "label": "/aide:install-win 和 /aide:install-linux(分离命令)", + "score": 65.0, "pros": [ - "无需用户干预" + "文件结构清晰", + "平台逻辑隔离" ], "cons": [ - "可能意外删除有价值的工作" + "用户需要知道自己的系统", + "维护多个文件" ] } ], "location": { "file": "task-now.md", - "start": 21, - "end": 21 + "start": 5, + "end": 5 }, - "context": "如果任务在执行过程中被中断(非正常 finish),需要确定如何处理遗留的任务分支和状态。", - "recommend": "abort_command" - }, - { - "id": 5, - "title": "任务细则确认机制", - "options": [ - { - "value": "ask_user_question", - "label": "使用 AskUserQuestion 工具", - "score": 85.0, - "pros": [ - "利用现有工具,无需改 aide 代码", - "交互式确认,体验好" - ], - "cons": [ - "依赖 LLM 遵守流程" - ] - }, - { - "value": "aide_decide", - "label": "使用 aide decide 提交确认", - "score": 75.0, - "pros": [ - "复用现有工具", - "有 Web 界面" - ], - "cons": [ - "流程较重,适合复杂决策" - ] - }, - { - "value": "aide_confirm", - "label": "新增 aide confirm 命令", - "score": 70.0, - "pros": [ - "专用命令,语义清晰", - "可程序化强制" - ], - "cons": [ - "需要额外开发 aide 代码" - ] - } - ], - "location": { - "file": "task-now.md", - "start": 30, - "end": 34 - }, - "context": "用户要求待定项处理和细则文档保存都必须经用户确认才能继续。需确定确认机制的实现方式。", - "recommend": "ask_user_question" - }, - { - "id": 6, - "title": "任务细则文档存储位置", - "options": [ - { - "value": "aide_task_spec", - "label": ".aide/task-spec.md", - "score": 85.0, - "pros": [ - "与 .aide 目录结构一致", - "每次任务覆盖,保持简洁" - ], - "cons": [ - "历史细则不保留" - ] - }, - { - "value": "aide_specs_dir", - "label": ".aide/specs/.md", - "score": 80.0, - "pros": [ - "保留历史细则", - "可追溯" - ], - "cons": [ - "可能积累大量文件" - ] - }, - { - "value": "configurable", - "label": "可配置路径(默认 task.spec)", - "score": 90.0, - "pros": [ - "灵活性高", - "用户可自定义" - ], - "cons": [ - "增加配置项" - ] - } - ], - "location": { - "file": "task-now.md", - "start": 32, - "end": 32 - }, - "context": "任务分析优化后需要生成并保存任务细则文档。需确定文档存储位置。", - "recommend": "configurable" + "context": "任务提到「为 Windows 和 Linux 单独创建专用的完整 command」,这可以理解为两种组织方式:统一命令自动检测系统,或分离命令让用户选择。", + "recommend": "unified" } ], "_meta": { - "created_at": "2025-12-17T03:16:37+08:00", - "session_id": "2025-12-17T03-16-37" + "created_at": "2025-12-17T04:59:10+08:00", + "session_id": "2025-12-17T04-59-10" } } diff --git a/.aide/diagrams/install-linux-logic.png b/.aide/diagrams/install-linux-logic.png new file mode 100644 index 0000000..536299a Binary files /dev/null and b/.aide/diagrams/install-linux-logic.png differ diff --git a/.aide/diagrams/install-linux-logic.puml b/.aide/diagrams/install-linux-logic.puml new file mode 100644 index 0000000..720f2d8 --- /dev/null +++ b/.aide/diagrams/install-linux-logic.puml @@ -0,0 +1,166 @@ +@startuml install-linux-logic +title /aide:install-linux 命令执行逻辑 + +start + +:检测操作系统; +if (是 Linux?) then (是) + :继续执行; +else (否) + :提示用户使用 /aide:install-win; + stop +endif + +partition "系统识别" { + :检测 Linux 发行版; + note right + /etc/os-release + lsb_release -a + end note + + switch (发行版类型) + case (Debian/Ubuntu) + :包管理器 = apt; + case (RHEL/Fedora) + :包管理器 = dnf; + case (Arch) + :包管理器 = pacman; + case (其他) + :包管理器 = 手动; + endswitch +} + +partition "环境检测" { + :检测 uv 是否可用; + note right: uv --version + + :检测 Python 是否可用; + note right: python3 --version 或 uv python list + + :检测 Java 是否可用; + note right: java -version + + :汇总检测结果; +} + +if (所有工具都已安装?) then (是) + :显示环境状态; + :跳转到 aide PATH 配置; +else (否) + :生成缺失工具列表; +endif + +partition "安装模式选择" { + :询问用户选择安装模式; + + switch (用户选择) + case (模式 A: 自动安装) + :进入自动安装流程; + case (模式 B: 手动指南) + :进入手动指南流程; + endswitch +} + +partition "模式 A: 自动安装" { + :=== 生成安装报告 ===; + + :列出将要执行的操作; + :说明安装位置; + :说明可能的副作用; + :说明潜在风险; + + :请求用户确认; + + if (用户确认?) then (是) + :=== 执行安装 ===; + + if (需要安装 uv?) then (是) + :执行 uv 安装; + note right + curl -LsSf https://astral.sh/uv/install.sh | sh + end note + :重新加载 shell 环境; + :验证 uv 安装; + endif + + if (需要安装 Python?) then (是) + :通过 uv 安装 Python; + note right: uv python install 3.11 + :验证 Python 安装; + endif + + if (需要安装 Java?) then (是) + switch (包管理器) + case (apt) + :sudo apt install openjdk-17-jre; + case (dnf) + :sudo dnf install java-17-openjdk-headless; + case (pacman) + :sudo pacman -S jre17-openjdk-headless; + case (手动) + :提供 Adoptium 下载链接; + :指导手动安装; + endswitch + :验证 Java 安装; + endif + + :汇报安装结果; + else (否) + :取消安装; + stop + endif +} + +partition "模式 B: 手动指南" { + :=== 生成操作指南 ===; + + :生成 Markdown 文档; + note right + 包含: + - 各发行版的安装命令 + - 官方下载链接 + - PATH 配置方法 + - 常见问题解答 + end note + + :生成 Shell 脚本; + note right + aide-install.sh + 包含完整注释 + 自动检测发行版 + end note + + :保存到当前工作目录; + :告知用户文件位置; +} + +partition "aide PATH 配置" { + :检测 aide-program 位置; + + if (aide 已在 PATH?) then (是) + :显示当前配置; + else (否) + :检测 shell 类型; + note right: bash, zsh, fish + + :生成 PATH 配置命令; + note right + 添加到 ~/.bashrc 或 ~/.zshrc + export PATH="$PATH:/path/to/aide-program/bin" + end note + :指导用户执行配置; + endif +} + +:=== 最终验证 ===; +:运行 aide env ensure --runtime; + +if (验证通过?) then (是) + :显示成功信息; +else (否) + :显示问题诊断; + :提供解决建议; +endif + +stop +@enduml diff --git a/.aide/diagrams/install-win-logic.png b/.aide/diagrams/install-win-logic.png new file mode 100644 index 0000000..ff595e9 Binary files /dev/null and b/.aide/diagrams/install-win-logic.png differ diff --git a/.aide/diagrams/install-win-logic.puml b/.aide/diagrams/install-win-logic.puml new file mode 100644 index 0000000..bc8a551 --- /dev/null +++ b/.aide/diagrams/install-win-logic.puml @@ -0,0 +1,140 @@ +@startuml install-win-logic +title /aide:install-win 命令执行逻辑 + +start + +:检测操作系统; +if (是 Windows?) then (是) + :继续执行; +else (否) + :提示用户使用 /aide:install-linux; + stop +endif + +partition "环境检测" { + :检测 uv 是否可用; + note right: uv --version + + :检测 Python 是否可用; + note right: python --version 或 uv python list + + :检测 Java 是否可用; + note right: java -version + + :汇总检测结果; +} + +if (所有工具都已安装?) then (是) + :显示环境状态; + :跳转到 aide PATH 配置; +else (否) + :生成缺失工具列表; +endif + +partition "安装模式选择" { + :询问用户选择安装模式; + + switch (用户选择) + case (模式 A: 自动安装) + :进入自动安装流程; + case (模式 B: 手动指南) + :进入手动指南流程; + endswitch +} + +partition "模式 A: 自动安装" { + :=== 生成安装报告 ===; + + :列出将要执行的操作; + :说明安装位置; + :说明可能的副作用; + :说明潜在风险; + + :请求用户确认; + + if (用户确认?) then (是) + :=== 执行安装 ===; + + if (需要安装 uv?) then (是) + :执行 uv 安装; + note right + irm https://astral.sh/uv/install.ps1 | iex + end note + :验证 uv 安装; + endif + + if (需要安装 Python?) then (是) + :通过 uv 安装 Python; + note right: uv python install 3.11 + :验证 Python 安装; + endif + + if (需要安装 Java?) then (是) + :检测可用的包管理器; + note right: winget, scoop, chocolatey + + if (有包管理器?) then (是) + :使用包管理器安装 JRE; + else (否) + :提供 Adoptium 下载链接; + :指导手动安装; + endif + :验证 Java 安装; + endif + + :汇报安装结果; + else (否) + :取消安装; + stop + endif +} + +partition "模式 B: 手动指南" { + :=== 生成操作指南 ===; + + :生成 Markdown 文档; + note right + 包含: + - 每个工具的安装步骤 + - 官方下载链接 + - 环境变量配置 + - 常见问题解答 + end note + + :生成 PowerShell 脚本; + note right + aide-install.ps1 + 包含完整注释 + end note + + :保存到当前工作目录; + :告知用户文件位置; +} + +partition "aide PATH 配置" { + :检测 aide-program 位置; + + if (aide 已在 PATH?) then (是) + :显示当前配置; + else (否) + :生成 PATH 配置命令; + note right + 添加到用户环境变量 + 或修改 $PROFILE + end note + :指导用户执行配置; + endif +} + +:=== 最终验证 ===; +:运行 aide env ensure --runtime; + +if (验证通过?) then (是) + :显示成功信息; +else (否) + :显示问题诊断; + :提供解决建议; +endif + +stop +@enduml diff --git a/.aide/diagrams/offline-installer-logic.png b/.aide/diagrams/offline-installer-logic.png new file mode 100644 index 0000000..7c8aa66 Binary files /dev/null and b/.aide/diagrams/offline-installer-logic.png differ diff --git a/.aide/diagrams/offline-installer-logic.puml b/.aide/diagrams/offline-installer-logic.puml new file mode 100644 index 0000000..dbbecd2 --- /dev/null +++ b/.aide/diagrams/offline-installer-logic.puml @@ -0,0 +1,116 @@ +@startuml offline-installer-logic +title 离线安装程序执行逻辑 + +start + +:读取程序所在目录; + +partition "资源检查" { + :读取 resources.json; + note right + 包含: + - uv 安装包路径 + - Java JRE 安装包路径 + - 校验和信息 + end note + + :检查必需资源文件; + + if (所有资源存在?) then (是) + :验证文件校验和; + if (校验通过?) then (是) + :继续安装; + else (否) + :报告损坏的文件; + :提示重新下载; + stop + endif + else (否) + :列出缺失的资源; + :显示下载链接; + stop + endif +} + +partition "安装模式" { + if (有 --silent 参数?) then (是) + :静默安装模式; + :使用默认配置; + else (否) + :交互式安装; + :显示安装选项; + :等待用户确认; + endif +} + +partition "执行安装" { + :=== 安装 uv ===; + + if (Windows?) then (是) + :解压 uv Windows 包; + :添加到用户 PATH; + else (Linux) + :解压 uv Linux 包; + :安装到 ~/.local/bin; + :更新 shell 配置; + endif + + :验证 uv 可用; + + :=== 安装 Python ===; + :运行 uv python install; + note right: 使用 uv 管理 Python + :验证 Python 可用; + + :=== 安装 Java JRE ===; + + if (Windows?) then (是) + if (MSI 安装包?) then (是) + :运行 MSI 静默安装; + else (ZIP 包) + :解压到指定目录; + :配置 JAVA_HOME; + :添加到 PATH; + endif + else (Linux) + :解压 tarball 到 /opt/java; + :创建符号链接; + :更新 alternatives; + endif + + :验证 Java 可用; +} + +partition "aide 配置" { + :检测 aide-program 位置; + :添加 aide 到 PATH; + + if (Windows?) then (是) + :更新用户环境变量; + else (Linux) + :追加到 shell 配置文件; + endif +} + +:=== 安装验证 ===; + +:显示安装结果; +note right + - uv 版本 + - Python 版本 + - Java 版本 + - aide 路径 +end note + +:运行 aide env ensure --runtime; + +if (全部通过?) then (是) + :安装成功; + :显示后续使用提示; +else (否) + :显示失败项; + :提供故障排除建议; +endif + +stop +@enduml diff --git a/.aide/flow-status.json b/.aide/flow-status.json new file mode 100644 index 0000000..b2a1b6a --- /dev/null +++ b/.aide/flow-status.json @@ -0,0 +1,123 @@ +{ + "task_id": "2025-12-17T04-54-31", + "current_phase": "docs", + "current_step": 14, + "started_at": "2025-12-17T04:54:31+08:00", + "history": [ + { + "timestamp": "2025-12-17T04:54:31+08:00", + "action": "start", + "phase": "task-optimize", + "step": 1, + "summary": "开始任务准备: 创建环境安装 Command", + "git_commit": "a133bc29347c0ba6aeb05a231a1cf85854494081" + }, + { + "timestamp": "2025-12-17T05:01:30+08:00", + "action": "next-step", + "phase": "task-optimize", + "step": 2, + "summary": "用户完成待定项确认", + "git_commit": "14a514f9828820afff9c48c0302195e6fffcee95" + }, + { + "timestamp": "2025-12-17T05:05:31+08:00", + "action": "next-step", + "phase": "task-optimize", + "step": 3, + "summary": "任务细则已确认", + "git_commit": "b14cf211e9c220883fe1614a8f8201d81b35cd58" + }, + { + "timestamp": "2025-12-17T05:05:46+08:00", + "action": "next-part", + "phase": "flow-design", + "step": 4, + "summary": "进入流程设计环节", + "git_commit": "182c933abcf8c193c31629fb12180f22a9d243f5" + }, + { + "timestamp": "2025-12-17T05:08:07+08:00", + "action": "next-step", + "phase": "flow-design", + "step": 5, + "summary": "流程图设计完成", + "git_commit": "eaeb46e4184449f45dd8d855d5dec768a9e3e02e" + }, + { + "timestamp": "2025-12-17T05:08:36+08:00", + "action": "next-part", + "phase": "impl", + "step": 6, + "summary": "流程设计完成,进入实现环节", + "git_commit": "9f2870a53f350eac5476ed4b3c6d4ae010929ed7" + }, + { + "timestamp": "2025-12-17T05:10:40+08:00", + "action": "next-step", + "phase": "impl", + "step": 7, + "summary": "子计划 1 完成: Windows Command 已创建", + "git_commit": "16e9deed2e79e7b779f7dc78925351863ce1fbc0" + }, + { + "timestamp": "2025-12-17T05:12:22+08:00", + "action": "next-step", + "phase": "impl", + "step": 8, + "summary": "子计划 2 完成: Linux Command 已创建", + "git_commit": "9d56a76decea6fadd798a31f74ab49c8429f6f9d" + }, + { + "timestamp": "2025-12-17T05:14:45+08:00", + "action": "next-step", + "phase": "impl", + "step": 9, + "summary": "子计划 3 完成: Windows 离线安装程序已创建", + "git_commit": "c44fbe38e654a193a3b70c8352d21ac3adefc73c" + }, + { + "timestamp": "2025-12-17T05:17:39+08:00", + "action": "next-step", + "phase": "impl", + "step": 10, + "summary": "子计划 4 完成: Linux 离线安装程序已创建", + "git_commit": "c2e093c5bff64f11672aa4611a903f18a9c8c781" + }, + { + "timestamp": "2025-12-17T05:17:57+08:00", + "action": "next-part", + "phase": "verify", + "step": 11, + "summary": "实现完成,进入验证环节", + "git_commit": "94e77203baa878c126591a8614fb397769a63fcb" + }, + { + "timestamp": "2025-12-17T05:18:52+08:00", + "action": "next-step", + "phase": "verify", + "step": 12, + "summary": "验证完成: 所有文件已创建,流程图已生成", + "git_commit": "38cbbc12b5028a035aad9b621aefb32920b44cca" + }, + { + "timestamp": "2025-12-17T05:19:10+08:00", + "action": "next-part", + "phase": "docs", + "step": 13, + "summary": "验证通过,进入文档环节", + "git_commit": "6c23555d78e01e1f7208f8598766033cfb7e038a" + }, + { + "timestamp": "2025-12-17T05:19:53+08:00", + "action": "next-step", + "phase": "docs", + "step": 14, + "summary": "文档更新完成", + "git_commit": "e892c01e1a4a811793a4ce56d391d0f84b30322f" + } + ], + "source_branch": "master", + "start_commit": "bd723629c5b471637a69c68dd5cdb6e4e4dee238", + "task_branch": "aide/001" +} diff --git a/.aide/flow-status.lock b/.aide/flow-status.lock deleted file mode 100755 index 8edd3b0..0000000 --- a/.aide/flow-status.lock +++ /dev/null @@ -1 +0,0 @@ -29495 \ No newline at end of file diff --git a/.aide/pending-items.json b/.aide/pending-items.json index 2adc193..9af8fb2 100644 --- a/.aide/pending-items.json +++ b/.aide/pending-items.json @@ -1,203 +1,94 @@ { - "task": "Aide 工具 Git 分支管理和任务细则强制确认功能", + "task": "创建环境安装 Command", "source": "task-now.md", "items": [ { "id": 1, - "title": "分支命名规则", + "title": "离线安装程序是否需要实现?", "location": { "file": "task-now.md", - "start": 15, - "end": 16 + "start": 17, + "end": 21 }, - "context": "用户希望在任务开始时创建新分支,需要确定分支命名规则。分支名将用于区分不同任务的工作内容。", + "context": "任务文档中询问是否可以实现离线安装方案:先提供资源清单,用户下载资源后通过程序完成安装。这是一个独立的功能模块,与 Command 是两种不同的实现方式。", "options": [ { - "value": "aide_taskid", - "label": "aide/", - "score": 90, - "pros": ["与 task_id 直接关联,易于追溯", "格式规范,避免冲突", "示例:aide/2025-12-17T10-30-00"], - "cons": ["分支名较长"] + "value": "defer", + "label": "暂不实现,作为后续迭代", + "score": 85, + "pros": ["聚焦核心需求", "减少本次工作量", "可以先验证 Command 方案的有效性"], + "cons": ["无法处理完全无网络的环境"] }, { - "value": "task_taskid", - "label": "task/", - "score": 75, - "pros": ["简洁明了", "与任务概念直接对应"], - "cons": ["可能与其他工具的分支命名冲突"] + "value": "implement", + "label": "本次一并实现离线安装程序", + "score": 60, + "pros": ["一次性完整覆盖所有场景", "支持企业内网环境"], + "cons": ["工作量大", "维护成本高", "需要处理多平台二进制分发"] }, { - "value": "custom_prefix", - "label": "可配置前缀", + "value": "resource_list_only", + "label": "仅提供资源清单和手动指南", "score": 70, - "pros": ["灵活性高,用户可自定义"], - "cons": ["增加配置复杂度"] + "pros": ["折中方案", "用户可自行下载"], + "cons": ["离线体验不完整", "用户需手动操作较多"] } ], - "recommend": "aide_taskid" + "recommend": "defer" }, { "id": 2, - "title": "分支概况文档格式", + "title": "是否需要支持 macOS?", "location": { "file": "task-now.md", - "start": 11, - "end": 12 + "start": 5, + "end": 5 }, - "context": "需要维护一份记录 git 分支概况的文档,存储分支名、起始提交、源分支、结束提交等信息。需确定文档格式。", + "context": "任务文档明确提到需要为 Windows 和 Linux 创建专用 command,但未提及 macOS。macOS 在开发者群体中使用广泛,需要确认是否纳入本次实现范围。", "options": [ { - "value": "json", - "label": "JSON 格式 (.aide/branches.json)", - "score": 85, - "pros": ["结构化数据,易于程序处理", "可精确存储多条记录", "与现有 flow-status.json 风格一致"], - "cons": ["人工阅读不够直观"] + "value": "no_macos", + "label": "仅支持 Windows 和 Linux", + "score": 75, + "pros": ["严格按任务要求", "减少工作量"], + "cons": ["macOS 用户无法使用"] }, { - "value": "markdown", - "label": "Markdown 格式 (.aide/branches.md)", - "score": 70, - "pros": ["人工阅读友好", "可直接在编辑器中查看"], - "cons": ["解析复杂,数据提取不便"] + "value": "include_macos", + "label": "增加 macOS 支持", + "score": 80, + "pros": ["覆盖主流开发平台", "macOS 与 Linux 安装方式相似"], + "cons": ["增加一定工作量", "需要测试验证"] } ], - "recommend": "json" + "recommend": "include_macos" }, { "id": 3, - "title": "合并冲突处理策略", + "title": "Command 命名和组织方式", "location": { "file": "task-now.md", - "start": 18, - "end": 21 + "start": 5, + "end": 5 }, - "context": "任务结束时需要将任务分支合并回原分支。如果原分支在任务期间有其他提交,可能产生合并冲突。需确定处理策略。", + "context": "任务提到「为 Windows 和 Linux 单独创建专用的完整 command」,这可以理解为两种组织方式:统一命令自动检测系统,或分离命令让用户选择。", "options": [ { - "value": "abort_warning", - "label": "检测冲突时中止并警告", - "score": 85, - "pros": ["安全,不会意外覆盖代码", "用户有完全控制权"], - "cons": ["需要用户手动解决"] - }, - { - "value": "squash_merge", - "label": "使用 squash 合并(避免大部分冲突)", - "score": 75, - "pros": ["减少冲突可能性", "生成单一提交"], - "cons": ["某些场景仍可能冲突"] - }, - { - "value": "force_override", - "label": "强制覆盖(任务分支优先)", - "score": 40, - "pros": ["总能完成合并"], - "cons": ["可能丢失原分支的其他更改", "风险较高"] - } - ], - "recommend": "abort_warning" - }, - { - "id": 4, - "title": "任务中断恢复策略", - "location": { - "file": "task-now.md", - "start": 21, - "end": 21 - }, - "context": "如果任务在执行过程中被中断(非正常 finish),需要确定如何处理遗留的任务分支和状态。", - "options": [ - { - "value": "manual_cleanup", - "label": "保留分支,用户手动处理", - "score": 80, - "pros": ["保留所有工作成果", "用户完全控制"], - "cons": ["可能积累废弃分支"] - }, - { - "value": "abort_command", - "label": "提供 aide flow abort 命令", + "value": "unified", + "label": "/aide:install(统一命令,自动检测系统)", "score": 90, - "pros": ["提供标准化的清理方式", "可选择保留或删除分支"], - "cons": ["需要额外开发"] + "pros": ["用户体验统一", "自动适配系统", "一个命令解决问题"], + "cons": ["Command 文件会较长"] }, { - "value": "auto_cleanup", - "label": "下次 start 时自动清理", - "score": 60, - "pros": ["无需用户干预"], - "cons": ["可能意外删除有价值的工作"] + "value": "separated", + "label": "/aide:install-win 和 /aide:install-linux(分离命令)", + "score": 65, + "pros": ["文件结构清晰", "平台逻辑隔离"], + "cons": ["用户需要知道自己的系统", "维护多个文件"] } ], - "recommend": "abort_command" - }, - { - "id": 5, - "title": "任务细则确认机制", - "location": { - "file": "task-now.md", - "start": 30, - "end": 34 - }, - "context": "用户要求待定项处理和细则文档保存都必须经用户确认才能继续。需确定确认机制的实现方式。", - "options": [ - { - "value": "ask_user_question", - "label": "使用 AskUserQuestion 工具", - "score": 85, - "pros": ["利用现有工具,无需改 aide 代码", "交互式确认,体验好"], - "cons": ["依赖 LLM 遵守流程"] - }, - { - "value": "aide_decide", - "label": "使用 aide decide 提交确认", - "score": 75, - "pros": ["复用现有工具", "有 Web 界面"], - "cons": ["流程较重,适合复杂决策"] - }, - { - "value": "aide_confirm", - "label": "新增 aide confirm 命令", - "score": 70, - "pros": ["专用命令,语义清晰", "可程序化强制"], - "cons": ["需要额外开发 aide 代码"] - } - ], - "recommend": "ask_user_question" - }, - { - "id": 6, - "title": "任务细则文档存储位置", - "location": { - "file": "task-now.md", - "start": 32, - "end": 32 - }, - "context": "任务分析优化后需要生成并保存任务细则文档。需确定文档存储位置。", - "options": [ - { - "value": "aide_task_spec", - "label": ".aide/task-spec.md", - "score": 85, - "pros": ["与 .aide 目录结构一致", "每次任务覆盖,保持简洁"], - "cons": ["历史细则不保留"] - }, - { - "value": "aide_specs_dir", - "label": ".aide/specs/.md", - "score": 80, - "pros": ["保留历史细则", "可追溯"], - "cons": ["可能积累大量文件"] - }, - { - "value": "configurable", - "label": "可配置路径(默认 task.spec)", - "score": 90, - "pros": ["灵活性高", "用户可自定义"], - "cons": ["增加配置项"] - } - ], - "recommend": "configurable" + "recommend": "unified" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 224afb6..e338817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,19 @@ ### 新增功能 +**环境安装 Commands** +- 新增 `/aide:install-win` - Windows 环境安装命令 +- 新增 `/aide:install-linux` - Linux 环境安装命令 +- 支持两种安装模式:自动安装(报告→确认→执行)和手动指南(markdown + 脚本) +- 自动检测并安装 uv、Python(via uv)、Java JRE +- 包含 aide PATH 配置指导 + +**离线安装程序** +- 新增 `aide-program/offline-installer/windows/` - Windows 离线安装程序 +- 新增 `aide-program/offline-installer/linux/` - Linux 离线安装程序 +- 提供资源清单(resources.json)、安装脚本和使用说明 +- 支持在无网络环境下安装 aide 所需的环境依赖 + **aide flow 自动 Git 分支管理** - 任务开始时自动创建 `aide/NNN` 分支(三位递增编号) - 任务结束时自动合并并压缩提交 diff --git a/aide-marketplace/aide-plugin/commands/install-linux.md b/aide-marketplace/aide-plugin/commands/install-linux.md new file mode 100644 index 0000000..b8c6be8 --- /dev/null +++ b/aide-marketplace/aide-plugin/commands/install-linux.md @@ -0,0 +1,691 @@ +# Aide Linux 环境安装 + +你正在执行 Aide Linux 环境安装流程。这是一个**独立运行**的命令,用于在 Linux 系统上安装 aide 所需的全部环境依赖。 + +## 概述 + +本命令将检测并安装以下工具: +- **uv** - Python 包管理器(用于管理 Python 和依赖) +- **Python** - aide 运行时环境(通过 uv 安装) +- **Java JRE** - PlantUML 运行依赖(用于生成流程图) + +--- + +## 开始 + +### 1. 系统检测 + +首先确认当前系统是 Linux: + +```bash +uname -s +``` + +如果不是 Linux 系统,请提示用户使用 `/aide:install-win` 命令。 + +### 2. 发行版识别 + +检测 Linux 发行版类型: + +```bash +# 读取发行版信息 +cat /etc/os-release 2>/dev/null || lsb_release -a 2>/dev/null +``` + +根据发行版确定包管理器: +- **Debian/Ubuntu**: apt +- **RHEL/Fedora/CentOS**: dnf (或 yum) +- **Arch/Manjaro**: pacman +- **openSUSE**: zypper +- **其他**: 手动安装 + +### 3. 环境检测 + +检测当前环境中各工具的可用性: + +#### 3.1 检测 uv + +```bash +uv --version 2>/dev/null +``` + +#### 3.2 检测 Python + +```bash +# 先尝试 uv 管理的 Python +uv python list 2>/dev/null + +# 如果 uv 不可用,检测系统 Python +python3 --version 2>/dev/null +python --version 2>/dev/null +``` + +#### 3.3 检测 Java + +```bash +java -version 2>&1 +``` + +#### 3.4 汇总检测结果 + +根据检测结果,列出: +- 已安装的工具及版本 +- 缺失的工具 + +如果所有工具都已安装,跳转到「aide PATH 配置」章节。 + +--- + +### 4. 安装模式选择 + +向用户询问安装模式: + +**模式 A:自动安装** +- 生成安装报告,用户确认后自动执行安装 +- 适合希望快速完成的用户 + +**模式 B:手动指南** +- 生成详细的操作指南和自动化脚本 +- 用户可以自行选择执行 +- 适合需要完全控制安装过程的用户 + +使用 AskUserQuestion 工具询问用户选择。 + +--- + +### 5. 模式 A:自动安装 + +#### 5.1 生成安装报告 + +在执行任何安装操作前,必须先生成安装报告,内容包括: + +**将要执行的操作**: +- 列出每个需要安装的工具 +- 说明安装命令 + +**安装位置**: +- uv: `~/.local/bin/` 或 `~/.cargo/bin/` +- Python: 由 uv 管理,位于 `~/.local/share/uv/python/` +- Java: 系统包管理器默认位置或 `/opt/java/` + +**可能的副作用**: +- 会修改 shell 配置文件 (~/.bashrc, ~/.zshrc) +- Java 安装可能需要 sudo 权限 + +**潜在风险**: +- 如果已有其他 Python 安装,可能产生版本冲突 +- 需要网络连接下载安装包 + +#### 5.2 请求用户确认 + +使用 AskUserQuestion 工具,展示报告并请求用户确认。 + +如果用户不确认,取消安装并退出。 + +#### 5.3 执行安装 + +##### 安装 uv(如需要) + +```bash +# 使用官方安装脚本 +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +安装后重新加载 shell 环境: +```bash +# 加载新的 PATH +source ~/.bashrc 2>/dev/null || source ~/.zshrc 2>/dev/null + +# 或者直接添加到当前会话 +export PATH="$HOME/.local/bin:$PATH" + +# 验证安装 +uv --version +``` + +##### 安装 Python(如需要) + +```bash +# 使用 uv 安装 Python 3.11 +uv python install 3.11 + +# 验证安装 +uv python list +``` + +##### 安装 Java JRE(如需要) + +根据发行版使用对应的包管理器: + +**Debian/Ubuntu (apt)**: +```bash +sudo apt update +sudo apt install -y openjdk-17-jre-headless +``` + +**RHEL/Fedora (dnf)**: +```bash +sudo dnf install -y java-17-openjdk-headless +``` + +**CentOS (yum)**: +```bash +sudo yum install -y java-17-openjdk-headless +``` + +**Arch (pacman)**: +```bash +sudo pacman -S --noconfirm jre17-openjdk-headless +``` + +**openSUSE (zypper)**: +```bash +sudo zypper install -y java-17-openjdk-headless +``` + +**无包管理器或其他发行版**: +提供 Adoptium Temurin JRE 下载链接: +- https://adoptium.net/temurin/releases/?os=linux&arch=x64&package=jre + +指导用户下载 tarball 并手动安装: +```bash +# 下载后解压 +tar -xzf OpenJDK17U-jre_x64_linux_*.tar.gz -C /opt/ + +# 创建符号链接 +sudo ln -sf /opt/jdk-17*/bin/java /usr/local/bin/java +``` + +安装后验证: +```bash +java -version +``` + +#### 5.4 汇报安装结果 + +列出每个工具的安装状态和版本。 + +--- + +### 6. 模式 B:手动指南 + +#### 6.1 生成 Markdown 操作指南 + +创建文件 `aide-install-guide.md`,内容包括: + +```markdown +# Aide 环境安装指南 (Linux) + +## 1. 安装 uv + +uv 是 Astral 开发的高性能 Python 包管理器。 + +### 方法一:官方脚本(推荐) + +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +安装后重新加载 shell: +```bash +source ~/.bashrc # 或 source ~/.zshrc +``` + +### 方法二:手动下载 + +1. 访问 https://github.com/astral-sh/uv/releases +2. 下载 `uv-x86_64-unknown-linux-gnu.tar.gz` +3. 解压到 `~/.local/bin/` +4. 确保 `~/.local/bin` 在 PATH 中 + +### 验证安装 + +```bash +uv --version +``` + +## 2. 安装 Python + +使用 uv 安装受管理的 Python: + +```bash +uv python install 3.11 +``` + +### 验证安装 + +```bash +uv python list +``` + +## 3. 安装 Java JRE + +Java 用于运行 PlantUML 生成流程图。 + +### Debian/Ubuntu + +```bash +sudo apt update +sudo apt install openjdk-17-jre-headless +``` + +### RHEL/Fedora + +```bash +sudo dnf install java-17-openjdk-headless +``` + +### Arch Linux + +```bash +sudo pacman -S jre17-openjdk-headless +``` + +### 手动安装(通用) + +1. 访问 https://adoptium.net/temurin/releases/?os=linux&arch=x64&package=jre +2. 下载 tarball +3. 解压并配置: + +```bash +tar -xzf OpenJDK17U-jre_x64_linux_*.tar.gz -C /opt/ +sudo ln -sf /opt/jdk-17*/bin/java /usr/local/bin/java +``` + +### 验证安装 + +```bash +java -version +``` + +## 4. 配置 aide PATH + +将 aide-program 添加到 PATH: + +### Bash 用户 + +```bash +echo 'export PATH="$PATH:/path/to/aide-program/bin"' >> ~/.bashrc +source ~/.bashrc +``` + +### Zsh 用户 + +```bash +echo 'export PATH="$PATH:/path/to/aide-program/bin"' >> ~/.zshrc +source ~/.zshrc +``` + +### Fish 用户 + +```fish +set -Ua fish_user_paths /path/to/aide-program/bin +``` + +## 5. 验证安装 + +```bash +aide env ensure --runtime +``` + +## 常见问题 + +### Q: uv 安装后命令找不到? +A: 运行 `source ~/.bashrc` 或重新打开终端。 + +### Q: Python 版本冲突? +A: uv 管理的 Python 独立于系统 Python,不会冲突。 + +### Q: sudo 权限问题? +A: Java 安装需要 root 权限,或使用 Adoptium tarball 安装到用户目录。 +``` + +#### 6.2 生成 Shell 安装脚本 + +创建文件 `aide-install.sh`: + +```bash +#!/bin/bash +# +# Aide 环境自动安装脚本 (Linux) +# +# 此脚本用于安装 aide 工具所需的环境依赖: +# - uv (Python 包管理器) +# - Python (通过 uv 安装) +# - Java JRE (用于 PlantUML) +# +# 用法: +# chmod +x aide-install.sh +# ./aide-install.sh [--aide-path /path/to/aide-program] +# +# 选项: +# --aide-path PATH 指定 aide-program 目录路径 +# --skip-uv 跳过 uv 安装 +# --skip-python 跳过 Python 安装 +# --skip-java 跳过 Java 安装 +# -h, --help 显示帮助信息 +# + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# 输出函数 +success() { echo -e "${GREEN}✓${NC} $1"; } +warning() { echo -e "${YELLOW}⚠${NC} $1"; } +error() { echo -e "${RED}✗${NC} $1"; } +info() { echo -e "${CYAN}→${NC} $1"; } + +# 默认值 +AIDE_PATH="" +SKIP_UV=false +SKIP_PYTHON=false +SKIP_JAVA=false + +# 解析参数 +while [[ $# -gt 0 ]]; do + case $1 in + --aide-path) + AIDE_PATH="$2" + shift 2 + ;; + --skip-uv) + SKIP_UV=true + shift + ;; + --skip-python) + SKIP_PYTHON=true + shift + ;; + --skip-java) + SKIP_JAVA=true + shift + ;; + -h|--help) + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " --aide-path PATH 指定 aide-program 目录路径" + echo " --skip-uv 跳过 uv 安装" + echo " --skip-python 跳过 Python 安装" + echo " --skip-java 跳过 Java 安装" + echo " -h, --help 显示帮助信息" + exit 0 + ;; + *) + error "未知选项: $1" + exit 1 + ;; + esac +done + +# 检测命令是否可用 +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# 检测发行版 +detect_distro() { + if [ -f /etc/os-release ]; then + . /etc/os-release + echo "$ID" + elif command_exists lsb_release; then + lsb_release -is | tr '[:upper:]' '[:lower:]' + else + echo "unknown" + fi +} + +# 获取包管理器 +get_package_manager() { + local distro=$(detect_distro) + case $distro in + ubuntu|debian|linuxmint|pop) + echo "apt" + ;; + fedora|rhel|centos|rocky|almalinux) + if command_exists dnf; then + echo "dnf" + else + echo "yum" + fi + ;; + arch|manjaro|endeavouros) + echo "pacman" + ;; + opensuse*) + echo "zypper" + ;; + *) + echo "unknown" + ;; + esac +} + +echo "========================================" +echo " Aide 环境安装脚本 (Linux) " +echo "========================================" +echo "" + +DISTRO=$(detect_distro) +PKG_MANAGER=$(get_package_manager) +info "检测到发行版: $DISTRO" +info "包管理器: $PKG_MANAGER" +echo "" + +# 1. 安装 uv +if [ "$SKIP_UV" = false ]; then + info "检测 uv..." + if command_exists uv; then + UV_VERSION=$(uv --version 2>&1) + success "uv 已安装: $UV_VERSION" + else + info "安装 uv..." + curl -LsSf https://astral.sh/uv/install.sh | sh + + # 加载新的 PATH + export PATH="$HOME/.local/bin:$PATH" + + if command_exists uv; then + success "uv 安装成功" + else + warning "uv 安装后需要重启终端" + fi + fi +fi + +# 2. 安装 Python +if [ "$SKIP_PYTHON" = false ]; then + info "检测 Python..." + if command_exists uv; then + PYTHON_LIST=$(uv python list 2>&1 || true) + if echo "$PYTHON_LIST" | grep -q "3\."; then + success "Python 已通过 uv 安装" + else + info "通过 uv 安装 Python 3.11..." + uv python install 3.11 + success "Python 3.11 安装成功" + fi + else + warning "uv 不可用,无法安装 Python" + fi +fi + +# 3. 安装 Java +if [ "$SKIP_JAVA" = false ]; then + info "检测 Java..." + if command_exists java; then + JAVA_VERSION=$(java -version 2>&1 | head -n 1) + success "Java 已安装: $JAVA_VERSION" + else + info "安装 Java JRE..." + + case $PKG_MANAGER in + apt) + sudo apt update + sudo apt install -y openjdk-17-jre-headless + ;; + dnf) + sudo dnf install -y java-17-openjdk-headless + ;; + yum) + sudo yum install -y java-17-openjdk-headless + ;; + pacman) + sudo pacman -S --noconfirm jre17-openjdk-headless + ;; + zypper) + sudo zypper install -y java-17-openjdk-headless + ;; + *) + warning "未检测到支持的包管理器,请手动安装 Java JRE" + info "下载地址: https://adoptium.net/temurin/releases/?os=linux&arch=x64&package=jre" + ;; + esac + + if command_exists java; then + success "Java 安装成功" + fi + fi +fi + +# 4. 配置 aide PATH +if [ -n "$AIDE_PATH" ]; then + BIN_PATH="$AIDE_PATH/bin" + if [ -d "$BIN_PATH" ]; then + # 检测当前 shell + SHELL_NAME=$(basename "$SHELL") + case $SHELL_NAME in + bash) + RC_FILE="$HOME/.bashrc" + ;; + zsh) + RC_FILE="$HOME/.zshrc" + ;; + *) + RC_FILE="$HOME/.profile" + ;; + esac + + if ! grep -q "$BIN_PATH" "$RC_FILE" 2>/dev/null; then + info "添加 aide 到 PATH ($RC_FILE)..." + echo "" >> "$RC_FILE" + echo "# Aide" >> "$RC_FILE" + echo "export PATH=\"\$PATH:$BIN_PATH\"" >> "$RC_FILE" + export PATH="$PATH:$BIN_PATH" + success "aide 已添加到 PATH" + else + success "aide 已在 PATH 中" + fi + else + warning "aide-program/bin 目录不存在: $BIN_PATH" + fi +fi + +echo "" +echo "========================================" +echo " 安装完成!请重启终端后使用 " +echo "========================================" +``` + +#### 6.3 保存文件 + +将上述两个文件保存到当前工作目录,并告知用户文件位置。 + +同时设置脚本执行权限: +```bash +chmod +x aide-install.sh +``` + +--- + +### 7. aide PATH 配置 + +检测 aide-program 的位置(通常是本仓库的 `aide-program/bin` 目录)。 + +#### 7.1 检测当前 PATH + +```bash +echo $PATH | tr ':' '\n' | grep -i aide +``` + +#### 7.2 如果 aide 不在 PATH 中 + +检测用户的 shell 类型: +```bash +echo $SHELL +``` + +根据 shell 类型生成配置命令: + +**Bash**: +```bash +echo 'export PATH="$PATH:/完整路径/aide-program/bin"' >> ~/.bashrc +source ~/.bashrc +``` + +**Zsh**: +```bash +echo 'export PATH="$PATH:/完整路径/aide-program/bin"' >> ~/.zshrc +source ~/.zshrc +``` + +**Fish**: +```fish +set -Ua fish_user_paths /完整路径/aide-program/bin +``` + +#### 7.3 验证配置 + +```bash +which aide +aide --help +``` + +--- + +### 8. 最终验证 + +运行 aide 环境检测: + +```bash +aide env ensure --runtime +``` + +如果验证通过,显示成功信息。 + +如果验证失败,显示问题诊断和解决建议。 + +--- + +## 完成 + +安装完成后,向用户汇报: + +``` +环境安装完成: +- uv: [版本] +- Python: [版本] +- Java: [版本] +- aide: [PATH 状态] +- 发行版: [检测到的发行版] + +下一步: +- 运行 /aide:setup 配置项目环境 +- 或直接使用 /aide:run 执行任务 +``` + +--- + +## 注意事项 + +- 此命令是**独立运行**的,通常在首次使用 aide 前执行一次 +- 所有安装操作都需要用户确认,不会静默修改系统 +- Java 安装可能需要 sudo 权限 +- 如果安装过程中断,可以重新运行此命令继续 +- 建议在安装完成后重启终端以确保环境变量生效 diff --git a/aide-marketplace/aide-plugin/commands/install-win.md b/aide-marketplace/aide-plugin/commands/install-win.md new file mode 100644 index 0000000..4690df3 --- /dev/null +++ b/aide-marketplace/aide-plugin/commands/install-win.md @@ -0,0 +1,535 @@ +# Aide Windows 环境安装 + +你正在执行 Aide Windows 环境安装流程。这是一个**独立运行**的命令,用于在 Windows 系统上安装 aide 所需的全部环境依赖。 + +## 概述 + +本命令将检测并安装以下工具: +- **uv** - Python 包管理器(用于管理 Python 和依赖) +- **Python** - aide 运行时环境(通过 uv 安装) +- **Java JRE** - PlantUML 运行依赖(用于生成流程图) + +--- + +## 开始 + +### 1. 系统检测 + +首先确认当前系统是 Windows: + +```powershell +# 检测操作系统 +$env:OS +``` + +如果不是 Windows 系统,请提示用户使用 `/aide:install-linux` 命令。 + +### 2. 环境检测 + +检测当前环境中各工具的可用性: + +#### 2.1 检测 uv + +```powershell +uv --version +``` + +#### 2.2 检测 Python + +```powershell +# 先尝试 uv 管理的 Python +uv python list 2>$null + +# 如果 uv 不可用,检测系统 Python +python --version 2>$null +python3 --version 2>$null +``` + +#### 2.3 检测 Java + +```powershell +java -version 2>&1 +``` + +#### 2.4 汇总检测结果 + +根据检测结果,列出: +- 已安装的工具及版本 +- 缺失的工具 + +如果所有工具都已安装,跳转到「aide PATH 配置」章节。 + +--- + +### 3. 安装模式选择 + +向用户询问安装模式: + +**模式 A:自动安装** +- 生成安装报告,用户确认后自动执行安装 +- 适合希望快速完成的用户 + +**模式 B:手动指南** +- 生成详细的操作指南和自动化脚本 +- 用户可以自行选择执行 +- 适合需要完全控制安装过程的用户 + +使用 AskUserQuestion 工具询问用户选择。 + +--- + +### 4. 模式 A:自动安装 + +#### 4.1 生成安装报告 + +在执行任何安装操作前,必须先生成安装报告,内容包括: + +**将要执行的操作**: +- 列出每个需要安装的工具 +- 说明安装命令 + +**安装位置**: +- uv: `%USERPROFILE%\.local\bin\` 或 `%USERPROFILE%\.cargo\bin\` +- Python: 由 uv 管理,位于 `%USERPROFILE%\.local\share\uv\python\` +- Java: 取决于安装方式(winget/scoop/手动) + +**可能的副作用**: +- 会修改用户 PATH 环境变量 +- 可能需要重启终端生效 + +**潜在风险**: +- 如果已有其他 Python 安装,可能产生版本冲突 +- 需要网络连接下载安装包 + +#### 4.2 请求用户确认 + +使用 AskUserQuestion 工具,展示报告并请求用户确认。 + +如果用户不确认,取消安装并退出。 + +#### 4.3 执行安装 + +##### 安装 uv(如需要) + +```powershell +# 使用官方安装脚本 +irm https://astral.sh/uv/install.ps1 | iex +``` + +安装后验证: +```powershell +# 刷新环境变量 +$env:Path = [System.Environment]::GetEnvironmentVariable("Path","User") + ";" + [System.Environment]::GetEnvironmentVariable("Path","Machine") + +# 验证安装 +uv --version +``` + +##### 安装 Python(如需要) + +```powershell +# 使用 uv 安装 Python 3.11 +uv python install 3.11 + +# 验证安装 +uv python list +``` + +##### 安装 Java JRE(如需要) + +检测可用的包管理器: + +```powershell +# 检测 winget +winget --version 2>$null + +# 检测 scoop +scoop --version 2>$null + +# 检测 chocolatey +choco --version 2>$null +``` + +根据可用的包管理器选择安装方式: + +**使用 winget(推荐)**: +```powershell +winget install EclipseAdoptium.Temurin.17.JRE +``` + +**使用 scoop**: +```powershell +scoop bucket add java +scoop install temurin17-jre +``` + +**使用 chocolatey**: +```powershell +choco install temurin17jre -y +``` + +**无包管理器**: +提供 Adoptium Temurin JRE 下载链接: +- https://adoptium.net/temurin/releases/?os=windows&arch=x64&package=jre + +指导用户下载并手动安装 MSI 包。 + +安装后验证: +```powershell +java -version +``` + +#### 4.4 汇报安装结果 + +列出每个工具的安装状态和版本。 + +--- + +### 5. 模式 B:手动指南 + +#### 5.1 生成 Markdown 操作指南 + +创建文件 `aide-install-guide.md`,内容包括: + +```markdown +# Aide 环境安装指南 (Windows) + +## 1. 安装 uv + +uv 是 Astral 开发的高性能 Python 包管理器。 + +### 方法一:PowerShell 脚本(推荐) + +```powershell +irm https://astral.sh/uv/install.ps1 | iex +``` + +### 方法二:手动下载 + +1. 访问 https://github.com/astral-sh/uv/releases +2. 下载 `uv-x86_64-pc-windows-msvc.zip` +3. 解压到 `%USERPROFILE%\.local\bin\` +4. 将该目录添加到 PATH + +### 验证安装 + +```powershell +uv --version +``` + +## 2. 安装 Python + +使用 uv 安装受管理的 Python: + +```powershell +uv python install 3.11 +``` + +### 验证安装 + +```powershell +uv python list +``` + +## 3. 安装 Java JRE + +Java 用于运行 PlantUML 生成流程图。 + +### 方法一:使用 winget(推荐) + +```powershell +winget install EclipseAdoptium.Temurin.17.JRE +``` + +### 方法二:使用 scoop + +```powershell +scoop bucket add java +scoop install temurin17-jre +``` + +### 方法三:手动下载 + +1. 访问 https://adoptium.net/temurin/releases/?os=windows&arch=x64&package=jre +2. 下载 MSI 安装包 +3. 运行安装程序 + +### 验证安装 + +```powershell +java -version +``` + +## 4. 配置 aide PATH + +将 aide-program 添加到系统 PATH: + +```powershell +# 获取 aide-program 路径(根据实际位置调整) +$aidePath = "C:\path\to\aide-program\bin" + +# 添加到用户 PATH +$currentPath = [Environment]::GetEnvironmentVariable("Path", "User") +if ($currentPath -notlike "*$aidePath*") { + [Environment]::SetEnvironmentVariable("Path", "$currentPath;$aidePath", "User") +} +``` + +## 5. 验证安装 + +```powershell +# 重启终端后运行 +aide env ensure --runtime +``` + +## 常见问题 + +### Q: uv 安装后命令找不到? +A: 重启终端或手动刷新环境变量。 + +### Q: Python 版本冲突? +A: uv 管理的 Python 独立于系统 Python,不会冲突。 + +### Q: Java 安装后仍然找不到? +A: 检查 JAVA_HOME 和 PATH 是否正确配置。 +``` + +#### 5.2 生成 PowerShell 安装脚本 + +创建文件 `aide-install.ps1`: + +```powershell +#Requires -Version 5.1 +<# +.SYNOPSIS + Aide 环境自动安装脚本 (Windows) + +.DESCRIPTION + 此脚本用于安装 aide 工具所需的环境依赖: + - uv (Python 包管理器) + - Python (通过 uv 安装) + - Java JRE (用于 PlantUML) + +.PARAMETER AideProgramPath + aide-program 目录的路径 + +.PARAMETER SkipUv + 跳过 uv 安装 + +.PARAMETER SkipPython + 跳过 Python 安装 + +.PARAMETER SkipJava + 跳过 Java 安装 + +.EXAMPLE + .\aide-install.ps1 -AideProgramPath "C:\projects\aide-program" + +.NOTES + 作者: aide + 版本: 1.0 +#> + +param( + [string]$AideProgramPath, + [switch]$SkipUv, + [switch]$SkipPython, + [switch]$SkipJava +) + +# 颜色输出函数 +function Write-Success { Write-Host "✓ $args" -ForegroundColor Green } +function Write-Warning { Write-Host "⚠ $args" -ForegroundColor Yellow } +function Write-Error { Write-Host "✗ $args" -ForegroundColor Red } +function Write-Info { Write-Host "→ $args" -ForegroundColor Cyan } + +# 检测工具是否可用 +function Test-Command { + param([string]$Command) + $null -ne (Get-Command $Command -ErrorAction SilentlyContinue) +} + +# 刷新环境变量 +function Update-Path { + $env:Path = [System.Environment]::GetEnvironmentVariable("Path","User") + ";" + [System.Environment]::GetEnvironmentVariable("Path","Machine") +} + +Write-Host "========================================" -ForegroundColor Cyan +Write-Host " Aide 环境安装脚本 (Windows) " -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "" + +# 1. 安装 uv +if (-not $SkipUv) { + Write-Info "检测 uv..." + if (Test-Command "uv") { + $uvVersion = uv --version 2>&1 + Write-Success "uv 已安装: $uvVersion" + } else { + Write-Info "安装 uv..." + try { + Invoke-RestMethod https://astral.sh/uv/install.ps1 | Invoke-Expression + Update-Path + if (Test-Command "uv") { + Write-Success "uv 安装成功" + } else { + Write-Error "uv 安装后仍无法找到,请重启终端后重试" + } + } catch { + Write-Error "uv 安装失败: $_" + } + } +} + +# 2. 安装 Python +if (-not $SkipPython) { + Write-Info "检测 Python..." + if (Test-Command "uv") { + $pythonList = uv python list 2>&1 + if ($pythonList -match "3\.\d+") { + Write-Success "Python 已通过 uv 安装" + } else { + Write-Info "通过 uv 安装 Python 3.11..." + uv python install 3.11 + Write-Success "Python 3.11 安装成功" + } + } else { + Write-Warning "uv 不可用,无法安装 Python" + } +} + +# 3. 安装 Java +if (-not $SkipJava) { + Write-Info "检测 Java..." + if (Test-Command "java") { + $javaVersion = java -version 2>&1 | Select-Object -First 1 + Write-Success "Java 已安装: $javaVersion" + } else { + Write-Info "安装 Java JRE..." + + if (Test-Command "winget") { + Write-Info "使用 winget 安装..." + winget install EclipseAdoptium.Temurin.17.JRE --silent + Update-Path + } elseif (Test-Command "scoop") { + Write-Info "使用 scoop 安装..." + scoop bucket add java + scoop install temurin17-jre + } elseif (Test-Command "choco") { + Write-Info "使用 chocolatey 安装..." + choco install temurin17jre -y + Update-Path + } else { + Write-Warning "未检测到包管理器,请手动安装 Java JRE" + Write-Info "下载地址: https://adoptium.net/temurin/releases/?os=windows&arch=x64&package=jre" + } + + if (Test-Command "java") { + Write-Success "Java 安装成功" + } + } +} + +# 4. 配置 aide PATH +if ($AideProgramPath) { + $binPath = Join-Path $AideProgramPath "bin" + if (Test-Path $binPath) { + $currentPath = [Environment]::GetEnvironmentVariable("Path", "User") + if ($currentPath -notlike "*$binPath*") { + Write-Info "添加 aide 到 PATH..." + [Environment]::SetEnvironmentVariable("Path", "$currentPath;$binPath", "User") + Update-Path + Write-Success "aide 已添加到 PATH" + } else { + Write-Success "aide 已在 PATH 中" + } + } else { + Write-Warning "aide-program/bin 目录不存在: $binPath" + } +} + +Write-Host "" +Write-Host "========================================" -ForegroundColor Cyan +Write-Host " 安装完成!请重启终端后使用 " -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +``` + +#### 5.3 保存文件 + +将上述两个文件保存到当前工作目录,并告知用户文件位置。 + +--- + +### 6. aide PATH 配置 + +检测 aide-program 的位置(通常是本仓库的 `aide-program/bin` 目录)。 + +#### 6.1 检测当前 PATH + +```powershell +$env:Path -split ";" | Where-Object { $_ -like "*aide*" } +``` + +#### 6.2 如果 aide 不在 PATH 中 + +生成配置命令: + +```powershell +# 获取 aide-program 完整路径 +$aidePath = "完整路径\aide-program\bin" + +# 方法一:临时添加(当前会话) +$env:Path += ";$aidePath" + +# 方法二:永久添加(用户级别) +$currentPath = [Environment]::GetEnvironmentVariable("Path", "User") +[Environment]::SetEnvironmentVariable("Path", "$currentPath;$aidePath", "User") +``` + +#### 6.3 验证配置 + +```powershell +# 重启终端后 +aide --help +``` + +--- + +### 7. 最终验证 + +运行 aide 环境检测: + +```powershell +aide env ensure --runtime +``` + +如果验证通过,显示成功信息。 + +如果验证失败,显示问题诊断和解决建议。 + +--- + +## 完成 + +安装完成后,向用户汇报: + +``` +环境安装完成: +- uv: [版本] +- Python: [版本] +- Java: [版本] +- aide: [PATH 状态] + +下一步: +- 运行 /aide:setup 配置项目环境 +- 或直接使用 /aide:run 执行任务 +``` + +--- + +## 注意事项 + +- 此命令是**独立运行**的,通常在首次使用 aide 前执行一次 +- 所有安装操作都需要用户确认,不会静默修改系统 +- 如果安装过程中断,可以重新运行此命令继续 +- 建议在安装完成后重启终端以确保环境变量生效 diff --git a/aide-program/offline-installer/linux/README.md b/aide-program/offline-installer/linux/README.md new file mode 100644 index 0000000..23d1c14 --- /dev/null +++ b/aide-program/offline-installer/linux/README.md @@ -0,0 +1,209 @@ +# Aide 离线安装程序 (Linux) + +本目录包含 Aide 工具的 Linux 离线安装程序,用于在无网络或受限网络环境下安装所需的环境依赖。 + +## 概述 + +此离线安装程序可以安装以下组件: +- **uv** - 高性能 Python 包管理器 +- **Java JRE 17** - PlantUML 运行依赖 +- **Python 3.11** - Aide 运行时(通过 uv 安装,需要网络) + +## 使用步骤 + +### 第 1 步:下载资源文件 + +参考 `resources.json` 中的下载链接,下载以下文件到本目录: + +| 文件名 | 说明 | 下载链接 | +|--------|------|----------| +| `uv-x86_64-unknown-linux-gnu.tar.gz` | uv 安装包 | [GitHub Releases](https://github.com/astral-sh/uv/releases/latest) | +| `OpenJDK17U-jre_x64_linux_hotspot_*.tar.gz` | Java JRE 17 | [Adoptium](https://adoptium.net/temurin/releases/?os=linux&arch=x64&package=jre&version=17) | + +> **注意**:Java JRE 的版本号可能会更新,请下载最新的 JRE 17 版本。脚本会自动识别 `OpenJDK17U-jre_x64_linux_*.tar.gz` 格式的文件。 + +### 第 2 步:运行安装脚本 + +```bash +# 添加执行权限 +chmod +x install.sh + +# 运行安装脚本 +./install.sh +``` + +### 第 3 步:配置 aide PATH(可选) + +如果要将 aide 添加到系统 PATH,运行时指定 aide-program 路径: + +```bash +./install.sh --aide-path /path/to/aide-program +``` + +### 第 4 步:安装 Python + +由于 Python 需要通过 uv 下载,离线安装无法自动完成。请在有网络的环境下运行: + +```bash +uv python install 3.11 +``` + +> **提示**:如果需要完全离线安装,可以在有网络的机器上提前运行此命令,然后复制 `~/.local/share/uv/python/` 目录到目标机器。 + +### 第 5 步:刷新环境并验证 + +```bash +# 刷新 shell 环境 +source ~/.bashrc # 或 source ~/.zshrc + +# 检查各组件版本 +uv --version +java -version + +# 验证 aide 环境 +aide env ensure --runtime +``` + +## 命令行选项 + +```bash +./install.sh [选项] +``` + +| 选项 | 说明 | +|------|------| +| `--aide-path PATH` | 指定 aide-program 目录路径,自动添加到 PATH | +| `--java-path PATH` | 指定 Java 安装路径(默认 `~/.local/java/jre-17`) | +| `--system-java` | 安装 Java 到 `/opt/java/jre-17`(需要 sudo) | +| `--silent` | 静默安装模式,不显示交互提示 | +| `--skip-uv` | 跳过 uv 安装 | +| `--skip-java` | 跳过 Java 安装 | +| `-h, --help` | 显示帮助信息 | + +## 示例 + +### 交互式安装(用户目录) + +```bash +./install.sh +``` + +### 静默安装 + +```bash +./install.sh --silent +``` + +### 系统级安装(需要 sudo) + +```bash +./install.sh --system-java +``` + +### 完整安装(包含 aide PATH 配置) + +```bash +./install.sh --aide-path ~/projects/ccoptimize/aide-program +``` + +### 仅安装 uv + +```bash +./install.sh --skip-java +``` + +## 安装位置 + +### 用户级安装(默认) + +| 组件 | 安装位置 | +|------|----------| +| uv | `~/.local/bin/` | +| Java JRE | `~/.local/java/jre-17/` | +| Python | `~/.local/share/uv/python/` (通过 uv 管理) | + +### 系统级安装(--system-java) + +| 组件 | 安装位置 | +|------|----------| +| uv | `~/.local/bin/` | +| Java JRE | `/opt/java/jre-17/` | + +## 环境变量 + +安装程序会自动在 shell 配置文件中添加以下内容: + +```bash +# ~/.bashrc 或 ~/.zshrc +export PATH="$PATH:~/.local/bin" +export PATH="$PATH:~/.local/java/jre-17/bin" # 或 /opt/java/jre-17/bin +export JAVA_HOME="~/.local/java/jre-17" # 或 /opt/java/jre-17 +``` + +## 支持的 Shell + +- Bash (`~/.bashrc`) +- Zsh (`~/.zshrc`) +- Fish (`~/.config/fish/config.fish`) +- 其他 (`~/.profile`) + +## 故障排除 + +### Q: 运行脚本时提示"权限不足"? + +A: 确保脚本有执行权限: +```bash +chmod +x install.sh +``` + +### Q: 安装后命令找不到? + +A: 刷新 shell 环境: +```bash +source ~/.bashrc # 或 source ~/.zshrc +``` + +或者重新打开终端。 + +### Q: 系统安装 Java 失败? + +A: 使用 `--system-java` 选项需要 sudo 权限。或者使用默认的用户级安装。 + +### Q: uv python install 失败? + +A: 此命令需要网络连接。如果在完全离线环境,请在有网络的机器上提前下载 Python,然后复制缓存目录。 + +### Q: 如何完全卸载? + +A: 删除以下目录和配置: +```bash +# 删除安装的文件 +rm -f ~/.local/bin/uv ~/.local/bin/uvx +rm -rf ~/.local/java/jre-17 # 或 sudo rm -rf /opt/java/jre-17 + +# 编辑 shell 配置文件,移除相关的 PATH 和 JAVA_HOME 设置 +nano ~/.bashrc # 或 ~/.zshrc +``` + +## 文件清单 + +``` +linux/ +├── README.md # 本说明文件 +├── resources.json # 资源清单(含下载链接) +├── install.sh # 主安装脚本 +├── uv-x86_64-unknown-linux-gnu.tar.gz # [需下载] +└── OpenJDK17U-jre_x64_linux_*.tar.gz # [需下载] +``` + +## 不同发行版说明 + +此离线安装程序适用于所有 Linux 发行版(x86_64 架构),包括: + +- Ubuntu / Debian +- Fedora / RHEL / CentOS +- Arch Linux / Manjaro +- openSUSE +- 其他 x64 Linux 发行版 + +如果您的系统是 ARM 架构(如 Raspberry Pi),请从发布页面下载对应架构的资源文件。 diff --git a/aide-program/offline-installer/linux/install.sh b/aide-program/offline-installer/linux/install.sh new file mode 100755 index 0000000..85611df --- /dev/null +++ b/aide-program/offline-installer/linux/install.sh @@ -0,0 +1,470 @@ +#!/bin/bash +# +# Aide 离线环境安装脚本 (Linux) +# +# 此脚本从本地资源文件安装 aide 工具所需的环境依赖: +# - uv (Python 包管理器) +# - Java JRE (用于 PlantUML) +# +# 运行前请确保已下载所有必需的资源文件到脚本所在目录。 +# 参见 resources.json 获取资源下载链接。 +# +# 用法: +# chmod +x install.sh +# ./install.sh [选项] +# +# 选项: +# --aide-path PATH 指定 aide-program 目录路径 +# --java-path PATH 指定 Java 安装路径(默认 ~/.local/java/jre-17) +# --system-java 使用 /opt/java/jre-17(需要 sudo) +# --silent 静默安装模式 +# --skip-uv 跳过 uv 安装 +# --skip-java 跳过 Java 安装 +# -h, --help 显示帮助信息 +# +# 作者: Aide Team +# 版本: 1.0.0 +# + +set -e + +# ============================================================ +# 配置 +# ============================================================ + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 资源文件名 +UV_TAR_FILE="uv-x86_64-unknown-linux-gnu.tar.gz" +JAVA_TAR_FILE="OpenJDK17U-jre_x64_linux_hotspot_17.0.9_9.tar.gz" + +# 默认安装路径 +UV_INSTALL_PATH="$HOME/.local/bin" +JAVA_INSTALL_PATH="$HOME/.local/java/jre-17" + +# 默认选项 +AIDE_PATH="" +SILENT=false +SKIP_UV=false +SKIP_JAVA=false +SYSTEM_JAVA=false + +# ============================================================ +# 颜色定义 +# ============================================================ + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# ============================================================ +# 辅助函数 +# ============================================================ + +success() { echo -e "${GREEN}✓${NC} $1"; } +warning() { echo -e "${YELLOW}⚠${NC} $1"; } +error() { echo -e "${RED}✗${NC} $1"; } +info() { echo -e "${CYAN}→${NC} $1"; } + +header() { + echo "" + echo -e "${CYAN}========================================${NC}" + echo -e "${CYAN} $1${NC}" + echo -e "${CYAN}========================================${NC}" + echo "" +} + +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +get_shell_rc() { + case "$(basename "$SHELL")" in + bash) echo "$HOME/.bashrc" ;; + zsh) echo "$HOME/.zshrc" ;; + fish) echo "$HOME/.config/fish/config.fish" ;; + *) echo "$HOME/.profile" ;; + esac +} + +add_to_path() { + local path_to_add="$1" + local rc_file + rc_file=$(get_shell_rc) + + if [[ "$SHELL" == *"fish"* ]]; then + if ! grep -q "$path_to_add" "$rc_file" 2>/dev/null; then + echo "set -gx PATH \$PATH $path_to_add" >> "$rc_file" + return 0 + fi + else + if ! grep -q "$path_to_add" "$rc_file" 2>/dev/null; then + echo "" >> "$rc_file" + echo "# Added by Aide installer" >> "$rc_file" + echo "export PATH=\"\$PATH:$path_to_add\"" >> "$rc_file" + return 0 + fi + fi + return 1 +} + +set_java_home() { + local java_path="$1" + local rc_file + rc_file=$(get_shell_rc) + + if [[ "$SHELL" == *"fish"* ]]; then + if ! grep -q "JAVA_HOME" "$rc_file" 2>/dev/null; then + echo "set -gx JAVA_HOME $java_path" >> "$rc_file" + fi + else + if ! grep -q "JAVA_HOME" "$rc_file" 2>/dev/null; then + echo "export JAVA_HOME=\"$java_path\"" >> "$rc_file" + fi + fi +} + +show_help() { + echo "用法: $0 [选项]" + echo "" + echo "Aide 离线环境安装脚本 (Linux)" + echo "" + echo "选项:" + echo " --aide-path PATH 指定 aide-program 目录路径" + echo " --java-path PATH 指定 Java 安装路径(默认 ~/.local/java/jre-17)" + echo " --system-java 使用 /opt/java/jre-17(需要 sudo)" + echo " --silent 静默安装模式" + echo " --skip-uv 跳过 uv 安装" + echo " --skip-java 跳过 Java 安装" + echo " -h, --help 显示帮助信息" + echo "" + echo "示例:" + echo " $0 # 交互式安装" + echo " $0 --silent # 静默安装" + echo " $0 --aide-path /path/to/aide # 配置 aide PATH" + echo " $0 --system-java # 安装 Java 到 /opt(需要 sudo)" +} + +# ============================================================ +# 解析参数 +# ============================================================ + +while [[ $# -gt 0 ]]; do + case $1 in + --aide-path) + AIDE_PATH="$2" + shift 2 + ;; + --java-path) + JAVA_INSTALL_PATH="$2" + shift 2 + ;; + --system-java) + SYSTEM_JAVA=true + JAVA_INSTALL_PATH="/opt/java/jre-17" + shift + ;; + --silent) + SILENT=true + shift + ;; + --skip-uv) + SKIP_UV=true + shift + ;; + --skip-java) + SKIP_JAVA=true + shift + ;; + -h|--help) + show_help + exit 0 + ;; + *) + error "未知选项: $1" + echo "运行 '$0 --help' 查看帮助" + exit 1 + ;; + esac +done + +# ============================================================ +# 主逻辑 +# ============================================================ + +header "Aide 离线安装程序 (Linux)" + +# 检查资源文件 +info "检查资源文件..." + +missing_resources=() + +if [ "$SKIP_UV" = false ]; then + uv_tar_path="$SCRIPT_DIR/$UV_TAR_FILE" + if [ ! -f "$uv_tar_path" ]; then + missing_resources+=("$UV_TAR_FILE") + fi +fi + +if [ "$SKIP_JAVA" = false ]; then + java_tar_path="$SCRIPT_DIR/$JAVA_TAR_FILE" + if [ ! -f "$java_tar_path" ]; then + # 尝试匹配通配符 + java_tar_path=$(find "$SCRIPT_DIR" -name "OpenJDK17U-jre_x64_linux_*.tar.gz" 2>/dev/null | head -n 1) + if [ -z "$java_tar_path" ]; then + missing_resources+=("$JAVA_TAR_FILE (或任意 OpenJDK17U-jre_x64_linux_*.tar.gz)") + else + JAVA_TAR_FILE=$(basename "$java_tar_path") + fi + fi +fi + +if [ ${#missing_resources[@]} -gt 0 ]; then + error "缺少以下资源文件:" + for resource in "${missing_resources[@]}"; do + echo " - $resource" + done + echo "" + info "请参考 resources.json 下载所需文件后重新运行此脚本" + exit 1 +fi + +success "所有资源文件已就绪" + +# 确认安装 +if [ "$SILENT" = false ]; then + echo "" + info "将要安装以下组件:" + if [ "$SKIP_UV" = false ]; then + echo " - uv (Python 包管理器) -> $UV_INSTALL_PATH" + fi + if [ "$SKIP_JAVA" = false ]; then + echo " - Java JRE 17 -> $JAVA_INSTALL_PATH" + fi + echo "" + + read -p "是否继续? (Y/n) " -n 1 -r + echo + if [[ $REPLY =~ ^[Nn]$ ]]; then + info "安装已取消" + exit 0 + fi +fi + +# ============================================================ +# 安装 uv +# ============================================================ + +if [ "$SKIP_UV" = false ]; then + echo "" + info "安装 uv..." + + if command_exists uv; then + uv_version=$(uv --version 2>&1) + success "uv 已安装: $uv_version" + else + uv_tar_path="$SCRIPT_DIR/$UV_TAR_FILE" + + # 创建安装目录 + mkdir -p "$UV_INSTALL_PATH" + + # 解压 + info "解压 uv..." + temp_dir=$(mktemp -d) + tar -xzf "$uv_tar_path" -C "$temp_dir" + + # 查找并复制 uv 可执行文件 + uv_exe=$(find "$temp_dir" -name "uv" -type f | head -n 1) + if [ -n "$uv_exe" ]; then + cp "$uv_exe" "$UV_INSTALL_PATH/" + chmod +x "$UV_INSTALL_PATH/uv" + + # 同时复制 uvx(如果存在) + uvx_exe=$(find "$temp_dir" -name "uvx" -type f | head -n 1) + if [ -n "$uvx_exe" ]; then + cp "$uvx_exe" "$UV_INSTALL_PATH/" + chmod +x "$UV_INSTALL_PATH/uvx" + fi + + success "uv 已解压到 $UV_INSTALL_PATH" + else + error "在压缩包中找不到 uv 可执行文件" + rm -rf "$temp_dir" + exit 1 + fi + + # 清理临时目录 + rm -rf "$temp_dir" + + # 添加到 PATH + if add_to_path "$UV_INSTALL_PATH"; then + success "已添加 $UV_INSTALL_PATH 到 PATH" + else + info "uv 路径已在 shell 配置中" + fi + + # 更新当前会话的 PATH + export PATH="$PATH:$UV_INSTALL_PATH" + + # 验证 + if command_exists uv; then + success "uv 安装成功" + else + warning "uv 安装完成,但需要重启终端或运行 'source $(get_shell_rc)'" + fi + fi +fi + +# ============================================================ +# 安装 Java JRE +# ============================================================ + +if [ "$SKIP_JAVA" = false ]; then + echo "" + info "安装 Java JRE..." + + if command_exists java; then + java_version=$(java -version 2>&1 | head -n 1) + success "Java 已安装: $java_version" + else + java_tar_path="$SCRIPT_DIR/$JAVA_TAR_FILE" + + # 创建安装目录 + if [ "$SYSTEM_JAVA" = true ]; then + sudo mkdir -p "$(dirname "$JAVA_INSTALL_PATH")" + else + mkdir -p "$(dirname "$JAVA_INSTALL_PATH")" + fi + + # 解压 + info "解压 Java JRE..." + temp_dir=$(mktemp -d) + tar -xzf "$java_tar_path" -C "$temp_dir" + + # 查找解压后的 JRE 目录 + jre_dir=$(find "$temp_dir" -maxdepth 1 -type d -name "jdk-*-jre" | head -n 1) + if [ -z "$jre_dir" ]; then + jre_dir=$(find "$temp_dir" -maxdepth 1 -type d | tail -n 1) + fi + + if [ -n "$jre_dir" ] && [ "$jre_dir" != "$temp_dir" ]; then + # 移动到目标位置 + if [ "$SYSTEM_JAVA" = true ]; then + sudo rm -rf "$JAVA_INSTALL_PATH" 2>/dev/null || true + sudo mv "$jre_dir" "$JAVA_INSTALL_PATH" + else + rm -rf "$JAVA_INSTALL_PATH" 2>/dev/null || true + mv "$jre_dir" "$JAVA_INSTALL_PATH" + fi + success "Java JRE 已安装到 $JAVA_INSTALL_PATH" + else + error "在压缩包中找不到 JRE 目录" + rm -rf "$temp_dir" + exit 1 + fi + + # 清理临时目录 + rm -rf "$temp_dir" + + # 配置 JAVA_HOME + set_java_home "$JAVA_INSTALL_PATH" + export JAVA_HOME="$JAVA_INSTALL_PATH" + info "已设置 JAVA_HOME = $JAVA_INSTALL_PATH" + + # 添加到 PATH + java_bin_path="$JAVA_INSTALL_PATH/bin" + if add_to_path "$java_bin_path"; then + success "已添加 Java bin 到 PATH" + else + info "Java bin 路径已在 shell 配置中" + fi + + # 更新当前会话的 PATH + export PATH="$PATH:$java_bin_path" + + # 创建符号链接(仅系统安装) + if [ "$SYSTEM_JAVA" = true ]; then + sudo ln -sf "$java_bin_path/java" /usr/local/bin/java 2>/dev/null || true + fi + + # 验证 + if command_exists java; then + java_version=$(java -version 2>&1 | head -n 1) + success "Java 安装成功: $java_version" + else + warning "Java 安装完成,但需要重启终端或运行 'source $(get_shell_rc)'" + fi + fi +fi + +# ============================================================ +# 安装 Python (通过 uv) +# ============================================================ + +echo "" +info "配置 Python..." + +if command_exists uv; then + python_list=$(uv python list 2>&1 || true) + if echo "$python_list" | grep -q "3\."; then + success "Python 已通过 uv 安装" + else + info "通过 uv 安装 Python 3.11..." + if uv python install 3.11 2>/dev/null; then + success "Python 3.11 安装成功" + else + warning "Python 安装需要网络连接,请稍后手动运行: uv python install 3.11" + fi + fi +else + warning "uv 不可用,无法安装 Python。请重启终端后运行: uv python install 3.11" +fi + +# ============================================================ +# 配置 aide PATH +# ============================================================ + +if [ -n "$AIDE_PATH" ]; then + echo "" + info "配置 aide PATH..." + + aide_bin_path="$AIDE_PATH/bin" + if [ -d "$aide_bin_path" ]; then + if add_to_path "$aide_bin_path"; then + success "已添加 aide 到 PATH: $aide_bin_path" + else + info "aide 已在 PATH 中" + fi + export PATH="$PATH:$aide_bin_path" + else + warning "aide-program/bin 目录不存在: $aide_bin_path" + fi +fi + +# ============================================================ +# 完成 +# ============================================================ + +header "安装完成" + +info "已安装组件:" +if command_exists uv; then + echo -e " ${GREEN}✓${NC} uv: $(uv --version 2>&1)" +else + echo -e " ${YELLOW}⚠${NC} uv: 需要重启终端" +fi + +if command_exists java; then + echo -e " ${GREEN}✓${NC} Java: $(java -version 2>&1 | head -n 1)" +else + echo -e " ${YELLOW}⚠${NC} Java: 需要重启终端" +fi + +echo "" +info "下一步:" +echo " 1. 重启终端或运行: source $(get_shell_rc)" +echo " 2. 运行 'uv python install 3.11' 安装 Python(如尚未安装)" +echo " 3. 运行 'aide env ensure --runtime' 验证安装" +echo "" diff --git a/aide-program/offline-installer/linux/resources.json b/aide-program/offline-installer/linux/resources.json new file mode 100644 index 0000000..dfead80 --- /dev/null +++ b/aide-program/offline-installer/linux/resources.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Aide 离线安装资源清单 (Linux)", + "description": "包含所有需要下载的资源文件信息", + "version": "1.0.0", + "platform": "linux", + "arch": "x64", + "resources": [ + { + "id": "uv", + "name": "uv (Python 包管理器)", + "version": "latest", + "required": true, + "filename": "uv-x86_64-unknown-linux-gnu.tar.gz", + "url": "https://github.com/astral-sh/uv/releases/latest/download/uv-x86_64-unknown-linux-gnu.tar.gz", + "checksum": { + "algorithm": "sha256", + "value": "请从发布页面获取" + }, + "install_path": "~/.local/bin", + "notes": "解压后将 uv 可执行文件放入安装路径" + }, + { + "id": "java_jre", + "name": "Eclipse Temurin JRE 17", + "version": "17", + "required": true, + "filename": "OpenJDK17U-jre_x64_linux_hotspot_17.0.9_9.tar.gz", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_x64_linux_hotspot_17.0.9_9.tar.gz", + "checksum": { + "algorithm": "sha256", + "value": "请从发布页面获取" + }, + "install_path": "/opt/java/jre-17 或 ~/.local/java/jre-17", + "notes": "解压后配置 JAVA_HOME 和 PATH" + } + ], + "download_instructions": { + "zh": [ + "1. 访问上述每个资源的 url 下载文件", + "2. 将下载的文件保存到此目录(与本文件同目录)", + "3. 确保文件名与 filename 字段一致", + "4. 运行 chmod +x install.sh && ./install.sh" + ], + "en": [ + "1. Visit the url for each resource and download the file", + "2. Save the downloaded files to this directory", + "3. Ensure filenames match the filename field", + "4. Run chmod +x install.sh && ./install.sh" + ] + }, + "post_install": { + "python": { + "note": "Python 将通过 uv python install 命令安装", + "offline_option": "如需完全离线安装 Python,请提前运行 'uv python install 3.11' 下载 Python 到本地缓存" + }, + "aide": { + "note": "安装完成后需要将 aide-program/bin 添加到 PATH", + "path_variable": "$PATH" + } + } +} diff --git a/aide-program/offline-installer/windows/README.md b/aide-program/offline-installer/windows/README.md new file mode 100644 index 0000000..df99bff --- /dev/null +++ b/aide-program/offline-installer/windows/README.md @@ -0,0 +1,167 @@ +# Aide 离线安装程序 (Windows) + +本目录包含 Aide 工具的 Windows 离线安装程序,用于在无网络或受限网络环境下安装所需的环境依赖。 + +## 概述 + +此离线安装程序可以安装以下组件: +- **uv** - 高性能 Python 包管理器 +- **Java JRE 17** - PlantUML 运行依赖 +- **Python 3.11** - Aide 运行时(通过 uv 安装,需要网络) + +## 使用步骤 + +### 第 1 步:下载资源文件 + +参考 `resources.json` 中的下载链接,下载以下文件到本目录: + +| 文件名 | 说明 | 下载链接 | +|--------|------|----------| +| `uv-x86_64-pc-windows-msvc.zip` | uv 安装包 | [GitHub Releases](https://github.com/astral-sh/uv/releases/latest) | +| `OpenJDK17U-jre_x64_windows_hotspot_17.0.9_9.zip` | Java JRE 17 | [Adoptium](https://adoptium.net/temurin/releases/?os=windows&arch=x64&package=jre&version=17) | + +> **注意**:Java JRE 的版本号可能会更新,请下载最新的 JRE 17 版本,并相应修改 `resources.json` 中的文件名。 + +### 第 2 步:运行安装脚本 + +1. 以管理员身份打开 PowerShell +2. 导航到本目录 +3. 运行安装脚本: + +```powershell +# 设置执行策略(如需要) +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +# 运行安装脚本 +.\install.ps1 +``` + +### 第 3 步:配置 aide PATH(可选) + +如果要将 aide 添加到系统 PATH,运行时指定 aide-program 路径: + +```powershell +.\install.ps1 -AideProgramPath "C:\path\to\aide-program" +``` + +### 第 4 步:安装 Python + +由于 Python 需要通过 uv 下载,离线安装无法自动完成。请在有网络的环境下运行: + +```powershell +uv python install 3.11 +``` + +> **提示**:如果需要完全离线安装,可以在有网络的机器上提前运行此命令,然后复制 `~/.local/share/uv/python/` 目录到目标机器。 + +### 第 5 步:验证安装 + +重启终端后运行: + +```powershell +# 检查各组件版本 +uv --version +java -version + +# 验证 aide 环境 +aide env ensure --runtime +``` + +## 命令行选项 + +```powershell +.\install.ps1 [-AideProgramPath ] [-Silent] [-SkipJava] [-SkipUv] +``` + +| 选项 | 说明 | +|------|------| +| `-AideProgramPath` | 指定 aide-program 目录路径,自动添加到 PATH | +| `-Silent` | 静默安装模式,不显示交互提示 | +| `-SkipJava` | 跳过 Java JRE 安装 | +| `-SkipUv` | 跳过 uv 安装 | + +## 示例 + +### 交互式安装 + +```powershell +.\install.ps1 +``` + +### 静默安装 + +```powershell +.\install.ps1 -Silent +``` + +### 完整安装(包含 aide PATH 配置) + +```powershell +.\install.ps1 -AideProgramPath "C:\projects\ccoptimize\aide-program" +``` + +### 仅安装 uv + +```powershell +.\install.ps1 -SkipJava +``` + +## 安装位置 + +| 组件 | 安装位置 | +|------|----------| +| uv | `%USERPROFILE%\.local\bin\` | +| Java JRE | `%LOCALAPPDATA%\Programs\Java\jre-17\` | +| Python | `%USERPROFILE%\.local\share\uv\python\` (通过 uv 管理) | + +## 环境变量 + +安装程序会自动配置以下环境变量: + +| 变量 | 值 | +|------|-----| +| `PATH` | 添加 uv 和 Java bin 目录 | +| `JAVA_HOME` | Java JRE 安装路径 | + +## 故障排除 + +### Q: 运行脚本时提示"无法加载文件,因为在此系统上禁止运行脚本"? + +A: 运行以下命令修改执行策略: +```powershell +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +``` + +### Q: 安装后命令找不到? + +A: 重启 PowerShell 或手动刷新环境变量: +```powershell +$env:Path = [System.Environment]::GetEnvironmentVariable("Path","User") + ";" + [System.Environment]::GetEnvironmentVariable("Path","Machine") +``` + +### Q: Java 安装后 java 命令仍然找不到? + +A: 检查 JAVA_HOME 和 PATH 是否正确设置: +```powershell +$env:JAVA_HOME +$env:Path -split ";" | Where-Object { $_ -like "*java*" } +``` + +### Q: 如何完全卸载? + +A: 删除以下目录和环境变量: +1. 删除 `%USERPROFILE%\.local\bin\uv.exe` +2. 删除 `%LOCALAPPDATA%\Programs\Java\jre-17\` +3. 从用户 PATH 中移除相关路径 +4. 删除 JAVA_HOME 环境变量 + +## 文件清单 + +``` +windows/ +├── README.md # 本说明文件 +├── resources.json # 资源清单(含下载链接) +├── install.ps1 # 主安装脚本 +├── uv-x86_64-pc-windows-msvc.zip # [需下载] +└── OpenJDK17U-jre_x64_windows_*.zip # [需下载] +``` diff --git a/aide-program/offline-installer/windows/install.ps1 b/aide-program/offline-installer/windows/install.ps1 new file mode 100644 index 0000000..842dfd5 --- /dev/null +++ b/aide-program/offline-installer/windows/install.ps1 @@ -0,0 +1,405 @@ +#Requires -Version 5.1 +<# +.SYNOPSIS + Aide 离线环境安装脚本 (Windows) + +.DESCRIPTION + 此脚本从本地资源文件安装 aide 工具所需的环境依赖: + - uv (Python 包管理器) + - Java JRE (用于 PlantUML) + + 运行前请确保已下载所有必需的资源文件到脚本所在目录。 + 参见 resources.json 获取资源下载链接。 + +.PARAMETER AideProgramPath + aide-program 目录的路径(可选,用于配置 PATH) + +.PARAMETER Silent + 静默安装模式,不显示交互提示 + +.PARAMETER SkipJava + 跳过 Java 安装 + +.PARAMETER SkipUv + 跳过 uv 安装 + +.EXAMPLE + .\install.ps1 + 交互式安装 + +.EXAMPLE + .\install.ps1 -Silent -AideProgramPath "C:\aide\aide-program" + 静默安装并配置 aide PATH + +.NOTES + 作者: Aide Team + 版本: 1.0.0 + 要求: Windows 10/11, PowerShell 5.1+ +#> + +param( + [string]$AideProgramPath, + [switch]$Silent, + [switch]$SkipJava, + [switch]$SkipUv +) + +# ============================================================ +# 配置 +# ============================================================ + +$ErrorActionPreference = "Stop" +$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path + +# 资源文件名 +$UvZipFile = "uv-x86_64-pc-windows-msvc.zip" +$JavaZipFile = "OpenJDK17U-jre_x64_windows_hotspot_17.0.9_9.zip" + +# 安装路径 +$UvInstallPath = "$env:USERPROFILE\.local\bin" +$JavaInstallPath = "$env:LOCALAPPDATA\Programs\Java\jre-17" + +# ============================================================ +# 辅助函数 +# ============================================================ + +function Write-Success { + param([string]$Message) + Write-Host "✓ $Message" -ForegroundColor Green +} + +function Write-Warning { + param([string]$Message) + Write-Host "⚠ $Message" -ForegroundColor Yellow +} + +function Write-Error { + param([string]$Message) + Write-Host "✗ $Message" -ForegroundColor Red +} + +function Write-Info { + param([string]$Message) + Write-Host "→ $Message" -ForegroundColor Cyan +} + +function Write-Header { + param([string]$Message) + Write-Host "" + Write-Host "========================================" -ForegroundColor Cyan + Write-Host " $Message" -ForegroundColor Cyan + Write-Host "========================================" -ForegroundColor Cyan + Write-Host "" +} + +function Test-Command { + param([string]$Command) + $null -ne (Get-Command $Command -ErrorAction SilentlyContinue) +} + +function Update-PathEnvironment { + # 刷新当前会话的 PATH + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "User") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "Machine") +} + +function Add-ToUserPath { + param([string]$PathToAdd) + + $currentPath = [Environment]::GetEnvironmentVariable("Path", "User") + if ($currentPath -notlike "*$PathToAdd*") { + [Environment]::SetEnvironmentVariable("Path", "$currentPath;$PathToAdd", "User") + Update-PathEnvironment + return $true + } + return $false +} + +function Test-FileChecksum { + param( + [string]$FilePath, + [string]$ExpectedHash, + [string]$Algorithm = "SHA256" + ) + + if ([string]::IsNullOrWhiteSpace($ExpectedHash) -or $ExpectedHash -eq "请从发布页面获取") { + Write-Warning "跳过校验和验证(未提供预期值)" + return $true + } + + $actualHash = (Get-FileHash -Path $FilePath -Algorithm $Algorithm).Hash + return $actualHash -eq $ExpectedHash +} + +function Expand-ArchiveToPath { + param( + [string]$ZipPath, + [string]$DestinationPath, + [switch]$CreateIfNotExists + ) + + if ($CreateIfNotExists -and -not (Test-Path $DestinationPath)) { + New-Item -ItemType Directory -Path $DestinationPath -Force | Out-Null + } + + Expand-Archive -Path $ZipPath -DestinationPath $DestinationPath -Force +} + +# ============================================================ +# 主逻辑 +# ============================================================ + +Write-Header "Aide 离线安装程序 (Windows)" + +# 检查资源文件 +Write-Info "检查资源文件..." + +$missingResources = @() + +if (-not $SkipUv) { + $uvZipPath = Join-Path $ScriptDir $UvZipFile + if (-not (Test-Path $uvZipPath)) { + $missingResources += $UvZipFile + } +} + +if (-not $SkipJava) { + $javaZipPath = Join-Path $ScriptDir $JavaZipFile + if (-not (Test-Path $javaZipPath)) { + $missingResources += $JavaZipFile + } +} + +if ($missingResources.Count -gt 0) { + Write-Error "缺少以下资源文件:" + foreach ($resource in $missingResources) { + Write-Host " - $resource" -ForegroundColor Red + } + Write-Host "" + Write-Info "请参考 resources.json 下载所需文件后重新运行此脚本" + exit 1 +} + +Write-Success "所有资源文件已就绪" + +# 确认安装 +if (-not $Silent) { + Write-Host "" + Write-Info "将要安装以下组件:" + if (-not $SkipUv) { + Write-Host " - uv (Python 包管理器) -> $UvInstallPath" + } + if (-not $SkipJava) { + Write-Host " - Java JRE 17 -> $JavaInstallPath" + } + Write-Host "" + + $confirm = Read-Host "是否继续? (Y/n)" + if ($confirm -eq "n" -or $confirm -eq "N") { + Write-Info "安装已取消" + exit 0 + } +} + +# ============================================================ +# 安装 uv +# ============================================================ + +if (-not $SkipUv) { + Write-Host "" + Write-Info "安装 uv..." + + # 检查是否已安装 + if (Test-Command "uv") { + $uvVersion = uv --version 2>&1 + Write-Success "uv 已安装: $uvVersion" + } else { + $uvZipPath = Join-Path $ScriptDir $UvZipFile + + # 创建安装目录 + if (-not (Test-Path $UvInstallPath)) { + New-Item -ItemType Directory -Path $UvInstallPath -Force | Out-Null + Write-Info "创建目录: $UvInstallPath" + } + + # 解压 + Write-Info "解压 uv..." + $tempDir = Join-Path $env:TEMP "uv-extract-$(Get-Random)" + Expand-ArchiveToPath -ZipPath $uvZipPath -DestinationPath $tempDir -CreateIfNotExists + + # 复制 uv.exe + $uvExe = Get-ChildItem -Path $tempDir -Filter "uv.exe" -Recurse | Select-Object -First 1 + if ($uvExe) { + Copy-Item -Path $uvExe.FullName -Destination $UvInstallPath -Force + + # 同时复制 uvx.exe (如果存在) + $uvxExe = Get-ChildItem -Path $tempDir -Filter "uvx.exe" -Recurse | Select-Object -First 1 + if ($uvxExe) { + Copy-Item -Path $uvxExe.FullName -Destination $UvInstallPath -Force + } + + Write-Success "uv 已解压到 $UvInstallPath" + } else { + Write-Error "在压缩包中找不到 uv.exe" + exit 1 + } + + # 清理临时目录 + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + + # 添加到 PATH + if (Add-ToUserPath $UvInstallPath) { + Write-Success "已添加 $UvInstallPath 到 PATH" + } else { + Write-Info "uv 路径已在 PATH 中" + } + + # 验证 + Update-PathEnvironment + if (Test-Command "uv") { + Write-Success "uv 安装成功" + } else { + Write-Warning "uv 安装完成,但需要重启终端后才能使用" + } + } +} + +# ============================================================ +# 安装 Java JRE +# ============================================================ + +if (-not $SkipJava) { + Write-Host "" + Write-Info "安装 Java JRE..." + + # 检查是否已安装 + if (Test-Command "java") { + $javaVersion = java -version 2>&1 | Select-Object -First 1 + Write-Success "Java 已安装: $javaVersion" + } else { + $javaZipPath = Join-Path $ScriptDir $JavaZipFile + + # 创建安装目录的父目录 + $javaParentDir = Split-Path $JavaInstallPath -Parent + if (-not (Test-Path $javaParentDir)) { + New-Item -ItemType Directory -Path $javaParentDir -Force | Out-Null + } + + # 解压 + Write-Info "解压 Java JRE..." + $tempDir = Join-Path $env:TEMP "java-extract-$(Get-Random)" + Expand-ArchiveToPath -ZipPath $javaZipPath -DestinationPath $tempDir -CreateIfNotExists + + # 找到解压后的 JRE 目录 + $jreDir = Get-ChildItem -Path $tempDir -Directory | Where-Object { $_.Name -like "jdk-*-jre" -or $_.Name -like "jre*" } | Select-Object -First 1 + if (-not $jreDir) { + $jreDir = Get-ChildItem -Path $tempDir -Directory | Select-Object -First 1 + } + + if ($jreDir) { + # 移动到目标位置 + if (Test-Path $JavaInstallPath) { + Remove-Item -Path $JavaInstallPath -Recurse -Force + } + Move-Item -Path $jreDir.FullName -Destination $JavaInstallPath -Force + Write-Success "Java JRE 已安装到 $JavaInstallPath" + } else { + Write-Error "在压缩包中找不到 JRE 目录" + exit 1 + } + + # 清理临时目录 + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + + # 配置 JAVA_HOME + [Environment]::SetEnvironmentVariable("JAVA_HOME", $JavaInstallPath, "User") + $env:JAVA_HOME = $JavaInstallPath + Write-Info "已设置 JAVA_HOME = $JavaInstallPath" + + # 添加到 PATH + $javaBinPath = Join-Path $JavaInstallPath "bin" + if (Add-ToUserPath $javaBinPath) { + Write-Success "已添加 Java bin 到 PATH" + } else { + Write-Info "Java bin 路径已在 PATH 中" + } + + # 验证 + Update-PathEnvironment + if (Test-Command "java") { + $javaVersion = java -version 2>&1 | Select-Object -First 1 + Write-Success "Java 安装成功: $javaVersion" + } else { + Write-Warning "Java 安装完成,但需要重启终端后才能使用" + } + } +} + +# ============================================================ +# 安装 Python (通过 uv) +# ============================================================ + +Write-Host "" +Write-Info "配置 Python..." + +if (Test-Command "uv") { + $pythonList = uv python list 2>&1 + if ($pythonList -match "3\.\d+") { + Write-Success "Python 已通过 uv 安装" + } else { + Write-Info "通过 uv 安装 Python 3.11..." + try { + uv python install 3.11 + Write-Success "Python 3.11 安装成功" + } catch { + Write-Warning "Python 安装需要网络连接,请稍后手动运行: uv python install 3.11" + } + } +} else { + Write-Warning "uv 不可用,无法安装 Python。请重启终端后运行: uv python install 3.11" +} + +# ============================================================ +# 配置 aide PATH +# ============================================================ + +if ($AideProgramPath) { + Write-Host "" + Write-Info "配置 aide PATH..." + + $aideBinPath = Join-Path $AideProgramPath "bin" + if (Test-Path $aideBinPath) { + if (Add-ToUserPath $aideBinPath) { + Write-Success "已添加 aide 到 PATH: $aideBinPath" + } else { + Write-Info "aide 已在 PATH 中" + } + } else { + Write-Warning "aide-program/bin 目录不存在: $aideBinPath" + } +} + +# ============================================================ +# 完成 +# ============================================================ + +Write-Header "安装完成" + +Write-Info "已安装组件:" +if (Test-Command "uv") { + Write-Host " ✓ uv: $(uv --version 2>&1)" -ForegroundColor Green +} else { + Write-Host " ⚠ uv: 需要重启终端" -ForegroundColor Yellow +} + +if (Test-Command "java") { + Write-Host " ✓ Java: $(java -version 2>&1 | Select-Object -First 1)" -ForegroundColor Green +} else { + Write-Host " ⚠ Java: 需要重启终端" -ForegroundColor Yellow +} + +Write-Host "" +Write-Info "下一步:" +Write-Host " 1. 重启终端使环境变量生效" +Write-Host " 2. 运行 'uv python install 3.11' 安装 Python(如尚未安装)" +Write-Host " 3. 运行 'aide env ensure --runtime' 验证安装" +Write-Host "" diff --git a/aide-program/offline-installer/windows/resources.json b/aide-program/offline-installer/windows/resources.json new file mode 100644 index 0000000..06d510e --- /dev/null +++ b/aide-program/offline-installer/windows/resources.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Aide 离线安装资源清单 (Windows)", + "description": "包含所有需要下载的资源文件信息", + "version": "1.0.0", + "platform": "windows", + "arch": "x64", + "resources": [ + { + "id": "uv", + "name": "uv (Python 包管理器)", + "version": "latest", + "required": true, + "filename": "uv-x86_64-pc-windows-msvc.zip", + "url": "https://github.com/astral-sh/uv/releases/latest/download/uv-x86_64-pc-windows-msvc.zip", + "checksum": { + "algorithm": "sha256", + "value": "请从发布页面获取" + }, + "install_path": "%USERPROFILE%\\.local\\bin", + "notes": "解压后将 uv.exe 放入安装路径" + }, + { + "id": "java_jre", + "name": "Eclipse Temurin JRE 17", + "version": "17", + "required": true, + "filename": "OpenJDK17U-jre_x64_windows_hotspot_17.0.9_9.zip", + "url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jre_x64_windows_hotspot_17.0.9_9.zip", + "checksum": { + "algorithm": "sha256", + "value": "请从发布页面获取" + }, + "install_path": "%LOCALAPPDATA%\\Programs\\Java\\jre-17", + "notes": "解压后配置 JAVA_HOME 和 PATH" + } + ], + "download_instructions": { + "zh": [ + "1. 访问上述每个资源的 url 下载文件", + "2. 将下载的文件保存到此目录(与本文件同目录)", + "3. 确保文件名与 filename 字段一致", + "4. 以管理员身份运行 install.ps1" + ], + "en": [ + "1. Visit the url for each resource and download the file", + "2. Save the downloaded files to this directory", + "3. Ensure filenames match the filename field", + "4. Run install.ps1 as Administrator" + ] + }, + "post_install": { + "python": { + "note": "Python 将通过 uv python install 命令安装", + "offline_option": "如需完全离线安装 Python,请提前运行 'uv python install 3.11' 下载 Python 到本地缓存" + }, + "aide": { + "note": "安装完成后需要将 aide-program/bin 添加到 PATH", + "path_variable": "%PATH%" + } + } +} diff --git a/task-spec.md b/task-spec.md new file mode 100644 index 0000000..7877127 --- /dev/null +++ b/task-spec.md @@ -0,0 +1,157 @@ +# 任务细则:环境安装 Command 与离线安装程序 + +> 生成时间:2025-12-17 +> 任务来源:task-now.md + +## 任务概述 + +为 aide 工具创建完整的环境安装解决方案,包括: +1. Windows 环境安装 Command (`/aide:install-win`) +2. Linux 环境安装 Command (`/aide:install-linux`) +3. 离线安装程序(支持 Windows 和 Linux) + +## 用户决策记录 + +| 决策项 | 用户选择 | +|--------|----------| +| 离线安装程序 | 本次一并实现 | +| macOS 支持 | 不支持(仅 Windows/Linux) | +| Command 组织 | 分离命令 | + +## 需要安装的工具 + +| 工具 | 用途 | 安装方式 | +|------|------|----------| +| uv | Python 包管理器 | 官方安装脚本 | +| Python | aide 运行时 | 通过 `uv python install` | +| Java (JRE) | PlantUML 依赖 | 系统包管理器或 Adoptium | + +## 子计划拆分 + +本任务拆分为 4 个子计划: + +### 子计划 1:Windows 环境安装 Command + +**目标**:创建 `/aide:install-win` command + +**产出**: +- `aide-marketplace/aide-plugin/commands/install-win.md` + +**功能要求**: +1. 检测当前环境状态(uv、Python、Java) +2. 对于缺失的工具,提供两种安装模式: + - **模式 A(自动安装)**:生成安装报告,用户确认后执行安装 + - **模式 B(手动指南)**:生成 markdown 操作指南 + PowerShell 脚本 +3. 安装完成后验证工具可用性 +4. 指导用户将 aide-program 添加到 PATH + +**技术要点**: +- uv 安装:`irm https://astral.sh/uv/install.ps1 | iex` +- Python 安装:`uv python install 3.11` +- Java 安装:winget/scoop 或 Adoptium MSI +- PATH 配置:修改用户环境变量 + +### 子计划 2:Linux 环境安装 Command + +**目标**:创建 `/aide:install-linux` command + +**产出**: +- `aide-marketplace/aide-plugin/commands/install-linux.md` + +**功能要求**: +1. 检测当前环境状态(uv、Python、Java) +2. 检测 Linux 发行版(Debian/Ubuntu、RHEL/Fedora、Arch) +3. 对于缺失的工具,提供两种安装模式: + - **模式 A(自动安装)**:生成安装报告,用户确认后执行安装 + - **模式 B(手动指南)**:生成 markdown 操作指南 + Shell 脚本 +4. 安装完成后验证工具可用性 +5. 指导用户将 aide-program 添加到 PATH + +**技术要点**: +- uv 安装:`curl -LsSf https://astral.sh/uv/install.sh | sh` +- Python 安装:`uv python install 3.11` +- Java 安装:apt/dnf/pacman 或 Adoptium tarball +- PATH 配置:修改 ~/.bashrc 或 ~/.zshrc + +### 子计划 3:离线安装程序 - Windows 版 + +**目标**:创建 Windows 离线安装程序 + +**产出**: +- `aide-program/offline-installer/windows/` 目录 +- `install.ps1` - 主安装脚本 +- `resources.json` - 资源清单 +- `README.md` - 使用说明 + +**功能要求**: +1. 生成资源清单(下载链接列表) +2. 用户下载资源到指定目录 +3. 运行安装脚本,从本地文件完成安装 +4. 支持静默安装和交互式安装 + +**资源清单内容**: +- uv 安装包(Windows x64) +- Python 安装包(通过 uv 管理,可选预下载) +- Java JRE(Adoptium Temurin) + +### 子计划 4:离线安装程序 - Linux 版 + +**目标**:创建 Linux 离线安装程序 + +**产出**: +- `aide-program/offline-installer/linux/` 目录 +- `install.sh` - 主安装脚本 +- `resources.json` - 资源清单 +- `README.md` - 使用说明 + +**功能要求**: +1. 生成资源清单(下载链接列表) +2. 用户下载资源到指定目录 +3. 运行安装脚本,从本地文件完成安装 +4. 支持多种 Linux 发行版 + +**资源清单内容**: +- uv 安装包(Linux x64) +- Python 安装包(通过 uv 管理,可选预下载) +- Java JRE(Adoptium Temurin tarball) + +## 执行顺序 + +``` +子计划 1 (Windows Command) + ↓ +子计划 2 (Linux Command) + ↓ +子计划 3 (Windows 离线安装) + ↓ +子计划 4 (Linux 离线安装) +``` + +## 成功标准 + +1. **Command 功能验证**: + - 能正确检测环境状态 + - 自动安装模式能成功安装所有工具 + - 手动指南清晰可执行 + - aide 命令在 PATH 中可用 + +2. **离线安装验证**: + - 资源清单完整且链接有效 + - 安装脚本能从本地文件完成安装 + - 安装后环境检测通过 + +## 风险与缓解 + +| 风险 | 缓解措施 | +|------|----------| +| 系统权限不足 | 明确提示所需权限,提供非管理员替代方案 | +| 网络环境受限 | 离线安装程序作为备选 | +| 版本兼容性 | 指定明确的版本要求,提供版本检测 | +| 安装失败回滚 | 记录安装前状态,提供回滚指南 | + +## 约束条件 + +1. 不修改 aide-program 核心代码(仅添加离线安装器目录) +2. Command 遵循现有 aide-marketplace 格式规范 +3. 所有脚本需包含完整注释 +4. 安装过程需用户确认,不得静默修改系统