From 518eb5a90e62f4eee0dea121dbca61062991f919 Mon Sep 17 00:00:00 2001 From: enoch Date: Mon, 22 Jun 2026 21:51:56 +0800 Subject: [PATCH] Add Oh My Pi and improve dev container config - Install @oh-my-pi/pi-coding-agent and move Go binaries to /usr/local/bin - Add omp-data volume and make web port configurable via PORT_WEB - Replace aider self-check with omp in Makefile - Harden entrypoint: avoid exporting API keys to SSH env and overwrite mounted public key into authorized_keys - Add .dockerignore, simplify .env.example, and document omp in README --- vibe-dev/.dockerignore | 30 ++++++++++++++++ vibe-dev/.env.example | 72 ++++++++++++++------------------------ vibe-dev/Dockerfile.fedora | 11 +++--- vibe-dev/Dockerfile.ubuntu | 7 ++-- vibe-dev/Makefile | 2 +- vibe-dev/README.md | 23 +++++++++++- vibe-dev/compose.yml | 7 ++-- vibe-dev/entrypoint.sh | 20 ++++++----- 8 files changed, 106 insertions(+), 66 deletions(-) create mode 100644 vibe-dev/.dockerignore diff --git a/vibe-dev/.dockerignore b/vibe-dev/.dockerignore new file mode 100644 index 0000000..8a75a03 --- /dev/null +++ b/vibe-dev/.dockerignore @@ -0,0 +1,30 @@ +# 版本控制 +.git +.gitignore + +# 敏感文件 (防止意外打入镜像) +.env +.env.* +!.env.example +*.pem +id_rsa* +authorized_keys + +# 构建产物 +/target/ +node_modules/ +/dist/ +/build/ + +# 编辑器与系统 +.vscode/ +.idea/ +*.swp +*.swo +.DS_Store +Thumbnails.db + +# 日志与临时 +*.log +tmp/ +temp/ diff --git a/vibe-dev/.env.example b/vibe-dev/.env.example index 1618ca0..45fdc03 100644 --- a/vibe-dev/.env.example +++ b/vibe-dev/.env.example @@ -1,51 +1,33 @@ -# ================================================================= -# Vibe Coding 开发环境 - 环境变量模板 -# 使用说明: -# 1. 复制此文件并重命名为 .env -# 2. 在 .env 中填写你真实的 API Key 和配置 -# 3. 注意:不要将 .env 文件上传到 Git 仓库! -# ================================================================= +# ======================================== +# Vibe Coding 环境配置模板 +# ======================================== +# 使用方法: cp .env.example .env,然后填入实际值 -# --- [SSH 配置] --- -# 宿主机连接容器时使用的端口 -SSH_PORT=2222 - -# --- [AI 工具 API Keys] --- -# Aider / OpenCode-AI 需要使用的模型密钥 -# 常用模型提供商:Anthropic (Claude), OpenAI (GPT), 智谱AI (GLM) - -# Anthropic API (用于 Claude 3.5 Sonnet, Aider 强烈推荐) -ANTHROPIC_API_KEY=your_anthropic_key_here - -# OpenAI API (用于 GPT-4o 等) -OPENAI_API_KEY=your_openai_key_here - -# OpenCode-AI 专用 (例如智谱 AI Key) -OPENCODE_API_KEY=your_opencode_provider_key_here - -# --- [开发环境设置 (可选)] --- -# 你可以在这里指定镜像构建时使用的版本(如果 Dockerfile 支持 args) -RUST_VERSION=stable -BUN_VERSION=latest - -# --- [其他工具配置] --- -# 例如某些工具需要的环境变量 -# GITHUB_TOKEN=your_github_pat_here - - -# 开发者信息 -# GIT_USER_NAME=YourName -# GIT_USER_EMAIL=youremail@example.com - -# --- [路径配置] --- -# 宿主机项目代码目录 (默认为当前目录 .) +# --- 工作区路径 --- +# 宿主机项目路径 (会被挂载到容器的 /workspace) HOST_PROJECT_PATH=. -# 容器内的工作目录绝对路径 (建议保持为 /workspace) +# 容器内工作目录 CONTAINER_WORKSPACE_PATH=/workspace -# --- [SSH 密钥配置] --- -# 指定你宿主机上的私钥文件名 (例如 id_ed25519 或 id_rsa) -SSH_KEY_NAME=id_ed25519 -# 宿主机上公钥的完整路径 (用于 Compose 挂载) +# --- SSH 配置 --- +# SSH 端口映射 (宿主机:容器) +SSH_PORT=2222 + +# 宿主机公钥路径 (会被自动注入到容器 authorized_keys) +# 持久化公钥请通过此变量配置,手动 make add-key 添加的公钥重启后会丢失 SSH_PUB_KEY_PATH=~/.ssh/id_ed25519.pub + +# --- 服务端口 --- +# Web 服务端口映射 (宿主机:容器,容器内默认监听 3000) +PORT_WEB=6300 + +# --- AI Provider API Keys (按需填写,全部默认注释) --- +# Anthropic (Claude) - opencode / omp 支持 +# ANTHROPIC_API_KEY=sk-ant-xxx + +# OpenAI - opencode / omp 支持 +# OPENAI_API_KEY=sk-xxx + +# OpenCode 自定义配置 +# OPENCODE_API_KEY=xxx diff --git a/vibe-dev/Dockerfile.fedora b/vibe-dev/Dockerfile.fedora index 4d7db89..c86ad96 100644 --- a/vibe-dev/Dockerfile.fedora +++ b/vibe-dev/Dockerfile.fedora @@ -2,8 +2,8 @@ FROM fedora:latest # 1. 系统工具与编译环境 RUN dnf update -y && dnf install -y \ - curl git wget unzip procps-ng shellcheck\ - gcc gcc-c++ make cmake openssl-devel jq tmux vim\ + curl git wget unzip procps-ng shellcheck \ + gcc gcc-c++ make cmake openssl-devel jq tmux vim \ zsh sudo python3 python3-pip \ openssh-server tar gzip \ && dnf clean all @@ -23,10 +23,11 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y RUN curl -fsSL https://bun.sh/install | bash RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \ && go install golang.org/x/tools/gopls@latest \ - && go install github.com/go-delve/delve/cmd/dlv@latest + && go install github.com/go-delve/delve/cmd/dlv@latest \ + && mv /root/go/bin/* /usr/local/bin/ -# 4. 全局安装 AI 工具 (Vibe Coding 核心) -RUN bun install -g opencode-ai +# 4. 全局安装 AI 工具 (Vibe Coding 核心: opencode + oh-my-pi) +RUN bun install -g opencode-ai @oh-my-pi/pi-coding-agent # 5. SSH & ZSH 配置 RUN ssh-keygen -A && \ diff --git a/vibe-dev/Dockerfile.ubuntu b/vibe-dev/Dockerfile.ubuntu index 0a65ae4..ca22397 100644 --- a/vibe-dev/Dockerfile.ubuntu +++ b/vibe-dev/Dockerfile.ubuntu @@ -20,10 +20,11 @@ RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y RUN curl -fsSL https://bun.sh/install | bash RUN curl -fsSL https://go.dev/dl/go1.24.4.linux-amd64.tar.gz | tar -C /usr/local -xzf - \ && go install golang.org/x/tools/gopls@latest \ - && go install github.com/go-delve/delve/cmd/dlv@latest + && go install github.com/go-delve/delve/cmd/dlv@latest \ + && mv /root/go/bin/* /usr/local/bin/ -# 4. 全局安装 AI 工具 -RUN bun install -g opencode-ai +# 4. 全局安装 AI 工具 (opencode + oh-my-pi) +RUN bun install -g opencode-ai @oh-my-pi/pi-coding-agent # 5. SSH & 目录预设 (为 Zed 准备) RUN ssh-keygen -A && \ diff --git a/vibe-dev/Makefile b/vibe-dev/Makefile index 23658f4..9e41d64 100644 --- a/vibe-dev/Makefile +++ b/vibe-dev/Makefile @@ -67,8 +67,8 @@ check: @docker exec -it $(CONTAINER_NAME) rustc --version || echo "❌ Rust 未就绪" @docker exec -it $(CONTAINER_NAME) go version || echo "❌ Go 未就绪" @docker exec -it $(CONTAINER_NAME) bun --version || echo "❌ Bun 未就绪" - @docker exec -it $(CONTAINER_NAME) aider --version || echo "❌ Aider 未就绪" @docker exec -it $(CONTAINER_NAME) opencode version || echo "❌ OpenCode 未就绪" + @docker exec -it $(CONTAINER_NAME) omp --version || echo "❌ Oh My Pi 未就绪" @echo "✨ 自检完成!" add-key: diff --git a/vibe-dev/README.md b/vibe-dev/README.md index c816b6f..7a93813 100644 --- a/vibe-dev/README.md +++ b/vibe-dev/README.md @@ -72,6 +72,28 @@ opencode "优化当前目录下 main.rs 的错误处理逻辑" ``` +### 使用 Oh My Pi (交互式 AI Coding Agent) + +[oh-my-pi](https://github.com/can1357/oh-my-pi)(命令名 `omp`)是一个终端优先的 AI Coding Agent,内置 LSP / DAP / 浏览器 / 子代理 / Hindsight 记忆等能力,与 Zed 通过 ACP 协议深度集成。 + +```bash +# 首次使用:登录某个 provider (Anthropic / OpenAI / Codex / Cursor 等) +omp /login + +# 交互式启动 (默认进入 TUI) +omp + +# 单次指令模式 +omp -p "为当前 Cargo 项目补全 unit test" + +# 指定模型 +omp --model anthropic/sonnet-4.5 + +``` + +* 配置与登录态保存在 `/root/.omp`(已挂载为命名卷 `omp-data`),`docker compose down` 后不会丢失。 +* 若已在 `.env` 中配置了 `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`,omp 会自动识别,可跳过 `/login`。 + --- ## 🚀 性能说明 @@ -89,7 +111,6 @@ opencode "优化当前目录下 main.rs 的错误处理逻辑" | 任务 | 命令 | | --- | --- | | **彻底重启环境** | `docker compose restart` | -| **更新 AI 工具 (Aider)** | `pip install --upgrade aider-chat` (容器内运行) | | **更换基础镜像 (OS)** | 修改 `docker-compose.yml` 中的 `dockerfile` 后运行 `docker compose up --build` | | **清理所有构建缓存** | `docker compose down -v` (警告:这将清空 Cargo/Bun 缓存) | diff --git a/vibe-dev/compose.yml b/vibe-dev/compose.yml index 731a1c1..5ecbc75 100644 --- a/vibe-dev/compose.yml +++ b/vibe-dev/compose.yml @@ -17,8 +17,8 @@ services: - TERM=xterm-256color ports: - "${SSH_PORT:-2222}:22" - - "6300:3000" - - "6173-6175:5173-5175" + - "${PORT_WEB:-6300}:3000" + - "6173-6179:5173-5179" volumes: - ${HOST_PROJECT_PATH:-.}:${CONTAINER_WORKSPACE_PATH:-/workspace}:cached # 1. 使用命名卷持久化整个 .ssh 目录 @@ -31,6 +31,8 @@ services: # --- 新增:Zed 远程开发缓存 --- - zed-server:/root/.zed_server - zed-share:/root/.local/share/zed + # --- 新增:Oh My Pi 配置/记忆/OAuth 登录态持久化 --- + - omp-data:/root/.omp stdin_open: true tty: true restart: always @@ -42,3 +44,4 @@ volumes: go-cache: zed-server: zed-share: + omp-data: diff --git a/vibe-dev/entrypoint.sh b/vibe-dev/entrypoint.sh index 2fdd295..154caf2 100644 --- a/vibe-dev/entrypoint.sh +++ b/vibe-dev/entrypoint.sh @@ -7,17 +7,19 @@ chmod 700 /root/.ssh touch /root/.ssh/authorized_keys touch /root/.ssh/environment -printenv | grep -E '^(PATH|BUN|CARGO|RUST|ANTHROPIC|OPENAI|OPENCODE|TERM|SHELL|WORKSPACE)' > /root/.ssh/environment -# 2. 动态注入挂载的公钥 (解决只读冲突的核心逻辑) +# 仅同步非敏感环境变量到 SSH environment +# (API Keys 通过 compose env_file 注入进程环境,不落盘,避免明文泄露) +printenv | grep -E '^(PATH|BUN|CARGO|RUST|TERM|SHELL|WORKSPACE)' > /root/.ssh/environment + +# 2. 动态注入挂载的公钥 (每次启动重建 authorized_keys,避免旧公钥残留) +# 持久化公钥请通过 .env 的 SSH_PUB_KEY_PATH 配置 if [ -f /tmp/host_id_ed25519.pub ]; then echo "检测到挂载的公钥,正在注入..." - # 仅当公钥不存在时才追加,避免重复 - if ! grep -qf /tmp/host_id_ed25519.pub /root/.ssh/authorized_keys 2>/dev/null; then - cat /tmp/host_id_ed25519.pub >> /root/.ssh/authorized_keys - echo "✅ 公钥注入成功" - else - echo "ℹ️ 公钥已存在,无需重复注入" - fi + cp /tmp/host_id_ed25519.pub /root/.ssh/authorized_keys + echo "✅ 公钥注入成功" +else + # 没有挂载公钥时保留已有 authorized_keys (用户可能用 make add-key 手动加过) + touch /root/.ssh/authorized_keys fi # 3. 强制修复权限 (SSH 对此非常敏感)