From: Codebuddy Date: Wed, 12 Aug 2026 12:21:02 +0000 (+0800) Subject: feat(console): 每个会话注入"修改前先确认"行为准则(软约束) X-Git-Url: http://acesimba.cloud/gitweb/?a=commitdiff_plain;h=0d09626b35105dff42c8974d09f41ec594f4c027;p=codebuddy-web.git feat(console): 每个会话注入"修改前先确认"行为准则(软约束) - 新增 backend/agent_guidelines.md:收到问题/需求先总结、确认要点、给方案、等用户确认后才动手,未确认不改代码/不提交 - _launch_process 在拉起每个 codebuddy 会话时追加 --append-system-prompt 注入该准则 - 不覆盖 codebuddy 内置系统提示,仅追加;准则文件缺失时优雅跳过 - 适用所有会话(words/study-mountion/Codebuddy-web 等),从启动起自带确认纪律 --- diff --git a/backend/agent_guidelines.md b/backend/agent_guidelines.md new file mode 100644 index 0000000..dafa519 --- /dev/null +++ b/backend/agent_guidelines.md @@ -0,0 +1,9 @@ +你通过 Codebuddy Web Console 运行。在收到用户的问题或实现需求时,必须遵守以下流程;在获得用户明确确认之前,不得修改任何代码 / 配置,也不得 commit / push: + +1. 先复述并总结用户的问题或需求,确认自己理解无误(包括要点、边界、期望行为)。 +2. 如有歧义或多种实现方式,点明可能的原因、影响范围与关键决策点。 +3. 给出执行方案(改哪些文件、怎么改、是否需重启服务、有无副作用 / 风险)。 +4. 将 1–3 一次性输出,并向用户确认。 +5. 仅在用户明确确认后,才开始实施、测试、提交。 + +例外:纯问答、只读分析,或用户明确说“直接改 / 先改了再说”的情况。 diff --git a/backend/app.py b/backend/app.py index de6b15b..e290f99 100644 --- a/backend/app.py +++ b/backend/app.py @@ -364,12 +364,29 @@ def last_assistant_summary(sid: str) -> str: return "" +# 每个会话注入的行为准则(软约束):修改前必须先总结、确认方案、等用户确认。 +# 通过 codebuddy 的 --append-system-prompt 追加到系统提示词,不覆盖其内置提示。 +AGENT_GUIDELINES_FILE = Path(__file__).resolve().parent / "agent_guidelines.md" + + +def _load_agent_guidelines() -> str: + try: + return AGENT_GUIDELINES_FILE.read_text(encoding="utf-8").strip() + except OSError: + logger.warning(f"未找到会话准则文件: {AGENT_GUIDELINES_FILE}") + return "" + + def _launch_process(task: dict, sid: str, model: str, cwd: str, codebuddy_path: str) -> dict: """启动 codebuddy 进程,登记到 RUNNING 并开始后台 drain。""" if session_exists(sid): cmd = [codebuddy_path, "--model", model, "--resume", sid] else: cmd = [codebuddy_path, "--model", model, "--session-id", sid] + # 注入“修改前先确认”的行为准则,使每个会话自带该纪律 + guidelines = _load_agent_guidelines() + if guidelines: + cmd += ["--append-system-prompt", guidelines] master_fd, slave_fd = pty.openpty() winsize = struct.pack("HHHH", 24, 80, 0, 0) fcntl.ioctl(slave_fd, termios.TIOCSWINSZ, winsize)