Prompt for OpenCode + CodeX-5.3:多 Agent 并行执行指令(主控 AI)
文章摘要: 多 Agent 并行执行系统通过主控 AI 调度多个子代理同时处理不同任务。系统包含 6 个子任务:A) 构建包含 300+ 错误码的诊断框架;B) 清理调试日志和无用语句;C) 拆分庞大类实现为模块化结构;D) 增强流量日志功能而不改变现有格式;E) 修复 IPv6 相关问题;F) 为代码添加英语注释。主控 AI 负责任务分解、并行调度、冲突解决和结果汇总,每个子代理独立执行特定任务
多 Agent 并行执行指令(主控 AI)
你是主控 AI。你必须将以下所有子任务分解,并同时启动多个子代理(使用 task 工具)并行执行。每个子代理只负责一个明确、独立的任务。你负责收集所有子代理的输出,合并代码修改,运行编译验证,最后输出总结报告。
绝对禁止你自己直接修改代码。你只负责调度和汇总。如果子任务之间修改同一文件导致冲突,优先保留删除类操作(子任务 B),然后通知其他子代理调整。
项目上下文与编译验证(必须执行)
- 根目录:当前工作目录(OpenCode 已注入)
- Windows 编译:执行
build_windows.bat - Linux 编译:使用
wsl -d Ubuntu1804进入,然后:cd /mnt/d/dd/openppp2 mkdir build && cd build && cmake .. && make -j32 - 你拥有真实的编译执行能力。所有子代理完成后,你必须运行 Windows 和 Linux 编译验证。若编译失败,读取错误输出,判断是哪个子任务导致,然后单独启动一个修复代理,只修复该问题,重新编译,直到成功。
子任务列表(每个子任务启动一个独立 Agent)
子任务 A:错误代码框架(≥300 个错误码)
目标:创建 ppp/diagnostics/Error.h 和 ppp/diagnostics/Error.cpp,实现完整的错误码体系。
具体要求:
- 定义
enum class ErrorCode : uint32_t,包含 至少 300 个具体错误码。必须覆盖以下类别(每类至少 10-20 个):- 参数与配置错误
- 文件系统错误
- 内存错误
- 网络接口错误(TUN/TAP 等)
- IPv4/IPv6 协议栈错误(地址配置、路由、NDP、邻居代理、网关不可达等)
- Linux 特有错误(sysctl、netlink、iptables、WSL 等)
- Windows 特有错误(Winsock、注册表、防火墙等)
- 线程与同步错误
- 加密与证书错误
- 认证与授权错误
- 协议解析错误(PPP、LCP、IPCP、IPv6CP 等)
- 定时器与超时错误
- 资源耗尽错误
- 内部逻辑错误
- 使用
thread_local ErrorCode tls_last_error,初始为ErrorCode::Success。 - 提供函数:
ErrorCode GetLastErrorCode(); ErrorCode SetLastErrorCode(ErrorCode code); // 必须返回 code const char* FormatErrorString(ErrorCode code); // 静态映射,返回静态字符串 - 提供回调注册(支持多个回调,框架扩展用,你自己代码中不主动调用):
void RegisterErrorHandler(ppp::function<void(int err)> handler); // 内部使用 std::vector<ppp::function<void(int)>> 存储 - 输出
Error.h和Error.cpp的完整代码。
子任务 B:删除所有 DebugLog 和 (void) 语句
目标:彻底删除所有调试日志和无用强制转换,不破坏业务逻辑。
具体要求:
- 遍历
ppp/目录下所有.cpp和.h文件(排除common/下的第三方库:lwip、json、base、dnslib 等)。 - 删除所有单独一行的
DebugLog(...);调用。 - 删除所有
static void DebugLog(...)函数定义(包括多行)。 - 删除所有单独一行的
(void)变量名;语句(仅限用于消除未使用变量警告的强制转换)。 - 将所有
(void)函数调用();改为函数调用();(保留调用,只去掉(void))。 - 删除所有空函数(如
void foo() {}或void foo() { })。 - 绝对禁止删除任何有业务逻辑的代码(条件分支、循环、赋值、网络操作等)。
- 输出所有修改过的文件列表及每个文件的 diff(或完整内容,仅限修改的文件)。
子任务 C:拆分 PppApplication 类实现
目标:将现有的 PppApplication 类实现从单一巨大文件拆分为多个模块,保持 main.cpp 为唯一入口。
具体要求:
- 不得创建
PppMain.cpp。main.cpp是唯一的程序入口,内容简化为:#include "ppp/app/PppApplication.h" int main(int argc, char** argv) { auto& app = ppp::app::PppApplication::GetInstance(); int result = app.Run(argc, argv); if (result != 0) { fprintf(stderr, "%s\n", ppp::diagnostics::FormatErrorString(ppp::diagnostics::GetLastErrorCode())); } return result; } - 将
PppApplication类的声明移到ppp/app/PppApplication.h。 - 将现有的实现拆分为多个模块文件,例如:
ppp/app/PppApplication.cpp(只包含Run主流程和单例)ppp/app/ApplicationInitialize.cpp(初始化系统、网络、配置)ppp/app/ApplicationConfig.cpp(配置加载/保存)ppp/app/ApplicationNetwork.cpp(网络接口、路由、IPv6 操作)ppp/app/ApplicationMainLoop.cpp(主循环、事件处理)- 你可以根据现有代码功能自行决定更合理的拆分,但每个模块职责必须单一。
- 更新
CMakeLists.txt和 VS 项目文件(ppp.vcxproj和ppp.vcxproj.filters),添加新源文件,移除旧的PppApplication.cpp(如果原来是一个大文件)。 - 保持原有功能完全不变,只改变文件结构。
- 输出所有新文件和修改过的文件的完整代码。
子任务 D:补全流量日志(增加详细字段,不改变现有日志格式)
目标:在不改变现有日志系统格式和输出方式的前提下,为每个数据包增加更详细的流量跟踪日志(源/目的 IP、协议、端口、长度、方向等)。不要创建新的日志文件,不要硬编码 CSV 或 JSON,不要改变现有日志的调用方式。
具体要求:
- 分析现有流量日志机制:
- 找到当前记录数据包日志的代码位置(例如
VirtualEthernetLogger::LogPacket、VirtualEthernetExchanger或VirtualEthernetSwitcher中的日志调用)。 - 确定现有的日志输出函数/宏(例如
LOG_INFO、ppp::log::Write、TrafficLog等)。阅读其实现,理解参数格式和输出方式(纯文本、带时间戳、是否支持额外字段)。
- 找到当前记录数据包日志的代码位置(例如
- 扩展日志内容:
- 在现有日志调用点,增加缺失的字段。必须包含:
- 源 IP 地址(IPv4/IPv6)
- 目的 IP 地址
- 传输层协议(TCP/UDP/ICMP/其他)
- 源端口(如适用,否则 0)
- 目的端口(如适用,否则 0)
- 数据包长度(字节)
- 方向(上行/下行,或 client->server / server->client)
- 保持与现有日志相同的分隔符和风格(例如若原有日志为
[时间] 事件 详情,则新增字段以key=value或空格分隔追加)。 - 绝对不要改变已有日志行的格式,只在新产生的流量记录中增加字段。
- 在现有日志调用点,增加缺失的字段。必须包含:
- 性能要求:
- 日志写入必须非阻塞(如果现有日志已是异步则复用;否则确保不在数据包路径中执行同步 I/O)。
- 不需要额外实现日志轮转(除非现有系统没有轮转且必须添加,但优先复用现有机制)。
- 输出内容:
- 分析结果:现有日志系统如何工作(函数名、宏、输出格式)。
- 修改的代码:哪些文件、哪些函数被修改,展示修改后的完整函数或 diff。
- 如何保证不改变原有日志格式的说明。
- 如何保证性能的说明(复用异步队列等)。
子任务 E:IPv6 深层修复
目标:修复 IPv6 相关的问题:网关存在性检查、Linux GUA 模式下 sysctl 修改恢复、错误码设置。
具体要求:
- 检查
ppp/app/server/VirtualEthernetSwitcher.cpp中的PrepareServerEnvironment和CleanupServerRules函数。 - 在 GUA 模式下,记录修改了哪些 sysctl 参数(例如
net.ipv6.conf.all.forwarding、net.ipv6.conf.default.forwarding、net.ipv6.conf.eth0.proxy_ndp等),在CleanupServerRules或新增的恢复函数中恢复原值。确保即使程序异常退出,下次启动时也能恢复(例如在启动时保存快照)。 - 在
GetIPv6TransitGateway或类似函数中,检查网关是否存在(例如通过ip -6 route show default或sysctl查询)。如果不存在,设置ErrorCode::IPv6GatewayNotReachable并返回失败。 - 确保所有 IPv6 相关函数在失败时都调用
SetLastErrorCode,而不是直接打印错误。 - 输出修改过的函数的完整代码(diff 或完整函数)。
子任务 F:全工程英语注释(细粒度并行)
目标:为 ppp/ 下所有自研代码添加 Doxygen 风格英语注释。由于文件数量多,你必须将本任务拆分为多个微任务,每个微任务只处理 3-5 个文件,并行启动大量子代理。
主控执行步骤:
- 首先,使用
find或glob获取ppp/目录下所有需要注释的文件列表(排除common/下的 lwip、json、base、dnslib 等第三方库)。只包括.h和.cpp文件。 - 将文件列表按每 3-5 个文件一组 分组(例如
file_list_batch_1,file_list_batch_2, …)。 - 对每一组,启动一个独立的子代理,该子代理的任务是:只为这一组文件添加注释。子代理的提示词模板如下:
你是注释子代理。你只负责为以下文件添加 Doxygen 风格英语注释。不要修改任何代码逻辑。
文件列表:
[文件1路径]
[文件2路径]
...
要求:
1. 为每个文件添加头部注释:@file, @brief, @author(填写 "OPENPPP2 Team"), @license(填写项目许可证,如 MIT 或 GPL,根据现有文件头部推断)。
2. 为每个类、结构体、枚举添加 @brief 注释。
3. 为每个函数(包括成员函数)添加 @param, @return, @note。简单的 getter/setter 可简化。
4. 为超过 3 行的复杂逻辑块添加行内注释。
5. 只添加注释,不修改任何代码。
6. 输出每个修改后的文件的完整内容(或输出 diff,但必须清晰标示改动)。
- 收集所有子代理的输出,合并注释到工作区。
主控 Agent 的执行流程
- 并行启动子任务 A、B、C、D、E,以及子任务 F 下的所有注释微任务(同时启动数十个代理)。
- 等待所有子代理完成。收集每个子代理的输出。
- 合并修改:将所有子代理产生的文件修改应用到工作区。
- 运行编译验证(必须通过):
- Windows: 执行
build_windows.bat(x86 Release 和 x64 Release 都要成功)。 - Linux: 使用
wsl -d Ubuntu1804进入目录,执行mkdir -p build && cd build && cmake .. && make -j32。 - 如果编译失败,读取错误输出,判断是哪个子任务引入的问题,然后单独启动一个修复代理,只修复该问题,重新编译,直到成功。
- Windows: 执行
- 输出最终报告:
- 所有子任务的完成状态(打勾)
- 新增/修改的文件列表
- 错误码数量(证明 ≥300)
- 编译成功确认信息(Windows 和 Linux 的最后几行输出)
- 任何遗留问题或需要手动注意的地方
强制约束(违反任何一条视为任务失败)
- 不得创建
PppMain.cpp。main.cpp是唯一入口。 - 错误码必须 ≥300 个,不得敷衍。
- 流量日志不得改变现有日志格式,只增加字段。
- 不得修改
common/下的第三方库(lwip、json、base、dnslib 等)。 - 删除操作必须保留所有业务逻辑(函数调用、条件分支、循环等)。
- 注释不得修改代码逻辑。
- 编译必须通过(Windows + Linux)。
- 主控 AI 和所有子代理不得询问用户任何问题。你全权决定所有技术细节,自主完成全部任务后输出最终报告。
开始执行
你现在拥有所有必要信息。立即启动所有子任务(并行),等待完成后合并、编译、验证,最后输出最终报告。不得中途停止,不得向用户确认。
更多推荐



所有评论(0)