Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ ENV HOME=/home/user

# 安装插件
RUN openclaw plugins install @openclaw-china/channels@latest
RUN openclaw plugins install @openclaw/acpx
RUN #openclaw plugins install @openclaw/acpx
RUN #npx -y @tencent-weixin/openclaw-weixin-cli@latest install

# 把插件数据备份到不会被挂载覆盖的目录
Expand Down
82 changes: 41 additions & 41 deletions app/api/routes_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -827,41 +827,41 @@ async def _run_openclaw_cmd():

prefix_parts: list[str] = []

prefix_parts.append(
"### ACPX MANDATORY(编程任务必须执行;否则视为回答失败)\n\n"
"判定为“编程任务”的条件(命中任一即是):\n"
"- 需要:修改/新增/删除代码或文件、生成补丁(diff)、修复报错、运行测试/命令、排查日志、提交 commit/PR、对某个仓库/目录进行操作\n"
"- 或用户消息中出现:fix/bug/implement/add/refactor/test/build/run/compile/commit/PR/diff/文件/路径/报错/日志 等关键词\n\n"
"总规则:\n"
"1) 只要是编程任务,你【必须】通过 ACPX 调用 Claude Code 完成工作;你自己【禁止】直接给出最终代码实现/补丁/测试结论(除非这些内容来自 Claude Code 的输出并被你转述)。\n"
"2) 开始前你【必须】先读取并遵循工作区内文档:AGENTS.md(ACP/ACPX 说明)与 CLAUDE.md(开发习惯/约束)。\n"
"3) 你必须优先使用“持久会话”,会话名固定为:\n"
" acpx-claude-{openclaw_session_id}\n"
"4) 超时(必须遵守):\n"
" - 默认超时:600 秒(10 分钟)\n"
" - 复杂任务:1200 秒(20 分钟)或更长\n"
" - 调用 acpx 时必须显式设置超时参数(按 AGENTS.md / ACPX CLI 支持的方式传入),禁止省略\n"
"5) 工作目录(--cwd)规则:\n"
" - 若用户在自然语言里明确给出目录路径:必须将该路径原样用于 --cwd(禁止自作主张改路径)\n"
" - 否则:使用“当前工作目录”(本 prefix 会提供 workspace_path)作为 --cwd\n\n"
"固定执行流程(必须按顺序):\n"
"A. 会话探测:\n"
" acpx claude sessions show acpx-claude-{openclaw_session_id}\n"
"B. 若不存在/失败,则创建会话(只需一次):\n"
" acpx claude sessions new --name acpx-claude-{openclaw_session_id}\n"
"C. 使用持久会话执行任务(必须带上 --cwd):\n"
" acpx claude -s acpx-claude-{openclaw_session_id} --cwd <PATH> \"<完整任务描述(包含约束/验收标准/相关文件信息)>\"\n\n"
"输出与可验证锚点(Claude Code 必须在最终输出中包含):\n"
"- 修改了哪些文件(路径列表)\n"
"- 每个文件的变更摘要(或 diff/补丁片段)\n"
"- 运行了哪些命令/测试,以及结果(失败则给出关键错误信息)\n\n"
"失败即停(强制):\n"
"- 若任何 acpx 命令返回非 0 或超时:你只能输出\n"
" (1) “❌ ACPX 调用失败” + 关键 stderr/exit_code(去除无关噪声)\n"
" (2) 下一步建议(例如检查 acpx 是否可用、会话名、--cwd 路径是否存在)\n"
" 然后停止;禁止继续“假装完成”或直接生成实现代码。\n\n"
"非编程问题(概念解释/问答)才允许你直接回答;一旦问题转为编程任务,立刻切换到以上 ACPX 流程。"
)
# prefix_parts.append(
# "### ACPX MANDATORY(编程任务必须执行;否则视为回答失败)\n\n"
# "判定为“编程任务”的条件(命中任一即是):\n"
# "- 需要:修改/新增/删除代码或文件、生成补丁(diff)、修复报错、运行测试/命令、排查日志、提交 commit/PR、对某个仓库/目录进行操作\n"
# "- 或用户消息中出现:fix/bug/implement/add/refactor/test/build/run/compile/commit/PR/diff/文件/路径/报错/日志 等关键词\n\n"
# "总规则:\n"
# "1) 只要是编程任务,你【必须】通过 ACPX 调用 Claude Code 完成工作;你自己【禁止】直接给出最终代码实现/补丁/测试结论(除非这些内容来自 Claude Code 的输出并被你转述)。\n"
# "2) 开始前你【必须】先读取并遵循工作区内文档:AGENTS.md(ACP/ACPX 说明)与 CLAUDE.md(开发习惯/约束)。\n"
# "3) 你必须优先使用“持久会话”,会话名固定为:\n"
# " acpx-claude-{openclaw_session_id}\n"
# "4) 超时(必须遵守):\n"
# " - 默认超时:600 秒(10 分钟)\n"
# " - 复杂任务:1200 秒(20 分钟)或更长\n"
# " - 调用 acpx 时必须显式设置超时参数(按 AGENTS.md / ACPX CLI 支持的方式传入),禁止省略\n"
# "5) 工作目录(--cwd)规则:\n"
# " - 若用户在自然语言里明确给出目录路径:必须将该路径原样用于 --cwd(禁止自作主张改路径)\n"
# " - 否则:使用“当前工作目录”(本 prefix 会提供 workspace_path)作为 --cwd\n\n"
# "固定执行流程(必须按顺序):\n"
# "A. 会话探测:\n"
# " acpx claude sessions show acpx-claude-{openclaw_session_id}\n"
# "B. 若不存在/失败,则创建会话(只需一次):\n"
# " acpx claude sessions new --name acpx-claude-{openclaw_session_id}\n"
# "C. 使用持久会话执行任务(必须带上 --cwd):\n"
# " acpx claude -s acpx-claude-{openclaw_session_id} --cwd <PATH> \"<完整任务描述(包含约束/验收标准/相关文件信息)>\"\n\n"
# "输出与可验证锚点(Claude Code 必须在最终输出中包含):\n"
# "- 修改了哪些文件(路径列表)\n"
# "- 每个文件的变更摘要(或 diff/补丁片段)\n"
# "- 运行了哪些命令/测试,以及结果(失败则给出关键错误信息)\n\n"
# "失败即停(强制):\n"
# "- 若任何 acpx 命令返回非 0 或超时:你只能输出\n"
# " (1) “❌ ACPX 调用失败” + 关键 stderr/exit_code(去除无关噪声)\n"
# " (2) 下一步建议(例如检查 acpx 是否可用、会话名、--cwd 路径是否存在)\n"
# " 然后停止;禁止继续“假装完成”或直接生成实现代码。\n\n"
# "非编程问题(概念解释/问答)才允许你直接回答;一旦问题转为编程任务,立刻切换到以上 ACPX 流程。"
# )

if force_skill_lines:
prefix_parts.append(
Expand All @@ -879,12 +879,12 @@ async def _run_openclaw_cmd():
prefix_parts.append(f"附件目录:{workspace_path}/.302ai/attachments")
prefix_parts.append(
f"如果是编程相关任务,请先阅读 {workspace_path}/CLAUDE.md(里面有我使用claude code开发习惯")
prefix_parts.append(
f"实现代码需要通过ACPX调用claude code, 具体见工作区里的AGENTS.md里ACP相关的信息")
prefix_parts.append(
f"如果是编程相关任务,阅读 acpx skill 参考文档,了解所有命令、标志和工作流模式:/home/user/.claude/skills/acpx/SKILL.md")
prefix_parts.append(
f"如果是编程相关任务,需要完整的 CLI 参考及所有选项和示例:/home/user/acpx/docs/CLI.md")
# prefix_parts.append(
# f"实现代码需要通过ACPX调用claude code, 具体见工作区里的AGENTS.md里ACP相关的信息")
# prefix_parts.append(
# f"如果是编程相关任务,阅读 acpx skill 参考文档,了解所有命令、标志和工作流模式:/home/user/.claude/skills/acpx/SKILL.md")
# prefix_parts.append(
# f"如果是编程相关任务,需要完整的 CLI 参考及所有选项和示例:/home/user/acpx/docs/CLI.md")

prefix = "\n\n".join(prefix_parts) + "\n\n"

Expand Down
5 changes: 3 additions & 2 deletions app/core/ai302/deploy_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import aiohttp

from app.core.config import settings
from app.core.http_client import fetch_json_with_retry


Expand Down Expand Up @@ -37,7 +38,7 @@ async def create_302ai_deploy_task(

response = await fetch_json_with_retry(
'POST',
"https://api.302.ai/302/webserve/project",
f"{settings.ANTHROPIC_BASE_URL}/302/webserve/project",
session=session,
data=form_data,
headers=headers
Expand All @@ -48,5 +49,5 @@ async def create_302ai_deploy_task(

async def get_302ai_deploy_task_info(deploy_project_id, headers: dict | None = None):
return await fetch_json_with_retry("GET",
f"https://api.302.ai/302/webserve/project?project_id={deploy_project_id}",
f"{settings.ANTHROPIC_BASE_URL}/302/webserve/project?project_id={deploy_project_id}",
headers=headers)
77 changes: 0 additions & 77 deletions app/core/oc_ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -920,83 +920,6 @@ async def add_my_oc_system_prompt_to_agent_md(

---

### 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"
```
```

---

## 💓 Heartbeats - Be Proactive!
Expand Down
Loading