diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index 77f3072..40aa061 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -2253,7 +2253,7 @@ async def role_agent_run(project_id, role, agent_id=None, model_name=None): role_skills = await _build_role_skills_block(sor, project_id, role, org_id) # 项目目录名(英文 slug,用于 projects/{项目}/ 路径;产出路径以 project-directory-spec 为准) project_name = await _get_project_name(sor, project_id) - project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else space_dir + project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else os.path.join(space_dir, 'projects', project_id) # 能力工具上下文(project_id/iteration_id/who/agent_id 自动注入,LLM 不可见) _iter = None try: @@ -2782,7 +2782,7 @@ async def pm_review_run(project_id, agent_id=None, model_name=None): workspace_dir = await _get_workspace_dir(sor, project_id) space_dir = await _get_space_dir(sor, project_id) project_name = await _get_project_name(sor, project_id) - project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else space_dir + project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else os.path.join(space_dir, 'projects', project_id) try: await sor.sqlExe("COMMIT", {}) @@ -3335,7 +3335,7 @@ async def retrospective_run(project_id, agent_id=None, model_name=None): space_dir = await _get_space_dir(sor, project_id) project_name = await _get_project_name(sor, project_id) - project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else space_dir + project_dir = os.path.join(space_dir, 'projects', project_name) if project_name else os.path.join(space_dir, 'projects', project_id) await sor.sqlExe("COMMIT", {}) # 问题素材(代码统一收集,PM 不重复实现查询) @@ -3407,7 +3407,8 @@ async def retrospective_run(project_id, agent_id=None, model_name=None): # 报告优先取 LLM write_file 已写的完整版(工具轮写盘),deliver 摘要仅作兜底—— # 否则完整报告被摘要覆盖、五段结构丢失。 result_text = deliverable.get("result") or deliverable.get("summary") or "" - report_rel = os.path.join('projects', project_name or '', 'docs', '02-retrospective', 'retrospective.md') + # 输出文件必须在项目空间内:项目名缺失时用 project_id 兜底目录名(不再落 projects/ 根) + report_rel = os.path.join('projects', project_name or project_id, 'docs', '02-retrospective', 'retrospective.md') report_abs = os.path.join(space_dir, report_rel) try: if os.path.isfile(report_abs):