fix: prevent spurious project switch — prompt warns check current, switch returns early if already in project

This commit is contained in:
ymq 2026-08-09 22:32:21 +08:00
parent 6900a86782
commit f82c349cd6

View File

@ -17,7 +17,8 @@ dbname = get_module_dbname('pipeline-sdlc')
AGENT_PROMPT = """你是开发产线驾驶舱 Agent。用工具获取数据用 reply 回复。
工作流:
- 切换项目:先 list_projects 看有哪些项目,再 switch_project
- 项目操作:当前项目已在环境信息中。如果已在目标项目,直接操作,不需要切换
- 切换项目:仅当需要切换时才 list_projects → switch_project
- 创建项目:不存在则 create_project
- 删除项目delete_project → 看到确认提示后,用户回复「确认删除 xxx」→ 再调 _sys_delete_project
- 查看进度list_tasks / task_detail / list_deliverables
@ -195,12 +196,14 @@ async def _exec_tool(sor, tool, params, ctx, uid, org_id):
return f'OK: 已删除「{name}」及其所有关联数据'
elif tool == 'switch_project':
proj = await _find_project(sor, p.get('project',''))
if proj:
await _save_ctx(sor, uid, proj.id)
ctx['pid'] = proj.id; ctx['pname'] = proj.name
return 'OK: 已切换到「'+proj.name+'」'
allp = await sor.sqlExe("SELECT name FROM sd_projects ORDER BY created_at DESC LIMIT 15",{})
return 'FAIL: 未找到。可用: '+', '.join([getattr(r,'name','') for r in (allp or [])])
if not proj:
allp = await sor.sqlExe("SELECT name FROM sd_projects ORDER BY created_at DESC LIMIT 15",{})
return 'FAIL: 未找到。可用: '+', '.join([getattr(r,'name','') for r in (allp or [])])
if proj.id == ctx['pid']:
return f'已在「{proj.name}」项目中,无需切换'
await _save_ctx(sor, uid, proj.id)
ctx['pid'] = proj.id; ctx['pname'] = proj.name
return 'OK: 已切换到「'+proj.name+'」'
elif tool == 'create_task':
if not ctx['pid']: return 'FAIL: 请先切换到项目'
title = p.get('title','')[:100]
@ -433,7 +436,7 @@ if action == 'send_message':
return
repos_str = ', '.join([r['n'] for r in ctx['repos']]) or '无'
env_text = f"当前项目: {ctx['pname'] or '未选择'}\n工作空间: {ctx['ws'] or '未设置'}\n仓库: {repos_str}"
env_text = f"当前项目: {ctx['pname'] or '未选择'}\n工作空间: {ctx['ws'] or '未设置'}\n仓库: {repos_str}\n⚠ 在调用 switch_project 之前,先确认当前项目是否已经是目标项目"
system = AGENT_PROMPT.replace('__TOOLS__',TOOLS_TEXT).replace('__ENV__',env_text)
msgs = [{"role":"system","content":system}]
for h in (await sor.sqlExe("SELECT role,content FROM pipeline_conversations WHERE created_by=${u}$ ORDER BY created_at ASC LIMIT 20",{"u":uid}) or []):