diff --git a/.dockerignore b/.dockerignore index 1f110a5..aafb70b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,11 @@ .claude +__pycache__ .git +.github +.idea .venv app.db* docker-compose.yml +docker-compose.yml* .gitignore diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 2d9c0ab..724a92a 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -10,10 +10,13 @@ on: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} + # 阿里云镜像仓库地址 + ALIYUN_REGISTRY: ${{ secrets.ALIYUN_REGISTRY }} + ALIYUN_IMAGE: ${{ secrets.ALIYUN_REGISTRY }}/${{ secrets.ALIYUN_NAMESPACE }}/local_agent jobs: push_to_registry: - name: Push Docker image to GHCR + name: Push Docker image to GHCR and Aliyun runs-on: ubuntu-latest permissions: contents: read @@ -22,6 +25,7 @@ jobs: - name: Check out the repo uses: actions/checkout@v4 + # ✅ 登录 GHCR - name: Log in to GHCR uses: docker/login-action@v3 with: @@ -29,8 +33,17 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker - id: meta + # ✅ 登录阿里云容器镜像服务 + - name: Log in to Aliyun Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ secrets.ALIYUN_REGISTRY }} + username: ${{ secrets.ALIYUN_USERNAME }} + password: ${{ secrets.ALIYUN_PASSWORD }} + + # ✅ 为 GHCR 提取 metadata + - name: Extract metadata for GHCR + id: meta-ghcr uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} @@ -38,12 +51,23 @@ jobs: type=ref,event=tag type=ref,event=branch + # ✅ 为阿里云提取 metadata + - name: Extract metadata for Aliyun + id: meta-aliyun + uses: docker/metadata-action@v5 + with: + images: ${{ env.ALIYUN_IMAGE }} + tags: | + type=ref,event=tag + type=ref,event=branch + - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + # ✅ 同时推送到 GHCR 和阿里云 - name: Build and push Docker image uses: docker/build-push-action@v5 with: @@ -51,8 +75,11 @@ jobs: file: Dockerfile platforms: linux/amd64,linux/arm64 push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} + # 合并两个仓库的 tags + tags: | + ${{ steps.meta-ghcr.outputs.tags }} + ${{ steps.meta-aliyun.outputs.tags }} + labels: ${{ steps.meta-ghcr.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max shm-size: 2g diff --git a/app/core/oc_ops.py b/app/core/oc_ops.py index 5cdf6d7..33cad28 100644 --- a/app/core/oc_ops.py +++ b/app/core/oc_ops.py @@ -918,6 +918,91 @@ async def add_my_oc_system_prompt_to_agent_md( - 即使代码很长,也必须完整展示(可以分段展示,标注"第X部分") - 这条规则适用于所有代码生成任务 +--- + +### ACPX + Claude Code 工作流 + +**触发条件**: OpenClaw 收到编程相关任务时 + +**执行方式**: 通过 `acpx` CLI 调用 Claude Code,而非原生 subagent 或 PTY + +#### 会话命名规则 +``` +acpx-claude-{openclaw_session_id} +``` + +#### 超时设置 +- 默认超时: 600秒 (10分钟) +- 复杂任务: 1200秒 (20分钟) 或更长 + +#### 输出过滤(只显示给用户的内容) +需要过滤的元信息前缀: + +| 前缀 | 含义 | 处理方式 | +|------|------|----------| +| `[client] initialize` | 客户端初始化 | 隐藏 | +| `[tool] ...` | 工具调用日志 | 隐藏 | +| `[thinking] ...` | 思考过程 | 隐藏 | +| `[done] end_turn` | 回复完成 | 隐藏 | + +#### 错误处理模板 +```bash +${ACPX_CMD} claude exec "任务描述" || echo "❌ 任务执行失败" +``` + +#### 会话管理(推荐:优先使用持久会话) + +**首次创建会话**(每个项目/任务只做一次): +```bash +acpx claude sessions new --name acpx-claude-{session_id} +``` + +**后续使用持久会话**(保留上下文): +```bash +acpx claude -s acpx-claude-{session_id} "任务描述" +``` + +**查看会话状态**: +```bash +acpx claude sessions show acpx-claude-{session_id} +``` + +**关闭会话**: +```bash +acpx claude sessions close acpx-claude-{session_id} +``` + +#### 一次性执行(仅用于简单、无需上下文的任务) +```bash +acpx claude exec "任务描述" +``` + +#### 工作目录处理(--cwd) + +acpx 支持 `--cwd` 参数指定工作目录。 + +**⚠️ 重要规则**:如果用户在自然语言任务描述中**明确提及了工作区路径**,必须: +1. 将该路径通过 `--cwd` 参数原样传入 +2. **严格使用用户提及的原路径**,禁止传入自以为"正确"的路径 +3. 路径优先级:用户明确指定的路径 > 当前 OpenClaw 工作区 + +**示例**: +```bash +# 用户说:"在 /home/user/projects/myapp 目录下修复 bug" +# ✅ 正确做法: +acpx claude -s acpx-claude-{session_id} --cwd /home/user/projects/myapp "修复 bug" + +# ❌ 错误做法(禁止这样做): +# acpx claude -s acpx-claude-{session_id} --cwd /home/user/.openclaw/workspace "修复 bug" +``` + +#### 二进制路径 +```bash +ACPX_CMD="acpx" # 已全局安装 +``` + +--- + ## 💓 Heartbeats - Be Proactive! When you receive a heartbeat poll (message matches the configured heartbeat prompt), don't just reply `HEARTBEAT_OK` every time. Use heartbeats productively!