diff --git a/pipeline_service/agent_loop.py b/pipeline_service/agent_loop.py index d12a935..aab3fc0 100644 --- a/pipeline_service/agent_loop.py +++ b/pipeline_service/agent_loop.py @@ -431,11 +431,11 @@ AGENT_TOOLS = [ {"name":"write_file","description":"写入文件(自动创建父目录)","params":{"path":"相对路径","content":"文件内容"}}, {"name":"list_files","description":"列出目录内容","params":{"path":"相对路径(可选,默认工作空间根)"}}, {"name":"run_shell","description":"在工作空间中执行shell命令","params":{"command":"命令"}}, - {"name":"git_clone","description":"克隆git仓库到工作空间repos/下","params":{"repo_url":"仓库URL","repo_name":"仓库目录名(可选,默认从URL推断)","branch":"分支(可选,默认main)"}}, - {"name":"git_status","description":"查看git仓库状态","params":{"repo_dir":"仓库子目录(可选,默认repos下第一个)"}}, + {"name":"git_clone","description":"克隆git仓库到机构工作空间(应用→apps/、模块→modules/)","params":{"repo_url":"仓库URL","repo_name":"仓库目录名(可选,默认从URL推断,_app后缀→apps/)","branch":"分支(可选,默认main)"}}, + {"name":"git_status","description":"查看git仓库状态","params":{"repo_dir":"仓库子目录(可选,默认 apps/modules 下第一个)"}}, {"name":"git_commit_push","description":"git add + commit + push(develop 用它提交模块仓库本地提交作为产出证据;无远程只 commit 不 push,非 git 目录自动 init)","params":{"message":"提交信息","repo_dir":"仓库子目录(可选)"}}, {"name":"ask_question","description":"向用户提问(缺少信息时使用)","params":{"question":"问题"}}, - {"name":"deliver","description":"提交最终交付件(代码/文档文件已用write_file写好时调用)","params":{"deliverable_type":"交付件类型(如code_files/design_doc)","summary":"概述","result":"交付件正文","files":"JSON数组[{\"path\":\"repos/仓库/src/x.py\",\"content\":\"代码内容\"}](可选)"}}, + {"name":"deliver","description":"提交最终交付件(代码/文档文件已用write_file写好时调用)","params":{"deliverable_type":"交付件类型(如code_files/design_doc)","summary":"概述","result":"交付件正文","files":"JSON数组[{\"path\":\"modules/{模块}/src/x.py\",\"content\":\"代码内容\"}](可选)"}}, ] AGENT_SYSTEM_PROMPT = """你是软件开发产线中的「__ROLE__」角色Agent。 @@ -459,7 +459,7 @@ __TOOLS__ ## 工作流 1. 先用 read_file/list_files 了解现有代码 -2. 用 write_file 产出代码文件到 repos/ 下 +2. 用 write_file 产出文件到 projects/{项目}/、apps/、modules/ 下(路径基准是上方「工作空间」= 机构工作空间) 3. 用 run_shell 验证(编译/测试) 4. 用 deliver 提交最终交付件(git 提交由 PM 审核通过后系统统一执行,无需你提交) @@ -468,7 +468,7 @@ __TOOLS__ {"action":"tool_call","tool":"工具名","params":{}} 提交交付件: -{"action":"deliver","deliverable_type":"code_files","summary":"概述","result":"文档内容","files":[{"path":"repos/仓库/src/file.py","content":"代码"}]} +{"action":"deliver","deliverable_type":"code_files","summary":"概述","result":"文档内容","files":[{"path":"modules/{模块}/src/file.py","content":"代码"}]} 提问: {"action":"ask","question":"问题"} @@ -561,7 +561,7 @@ __ROLE_SKILLS__ QC_SYSTEM_PROMPT = """你是质量控制工程师(QC)。对交付件做合规检查和质量检查,不合规直接退回重做。 ## 检查维度 -1. 项目规范检查:产出是否按 SDLC 仓库标准路径/命名/格式产出——先用 load_skill 加载 project-directory-spec 拿到权威目录结构与路径,再据此检查(交付文件都在 repos/ 下,不要凭记忆在工作空间根找 docs/、apps/ 等目录) +1. 项目规范检查:产出是否按 SDLC 仓库标准路径/命名/格式产出——先用 load_skill 加载 project-directory-spec 拿到权威目录结构与路径,再据此检查(交付文件在机构工作空间的 projects/{项目}/docs/、apps/、modules/ 下,不要凭记忆找旧 repos/ 目录) 2. 项目过程规范:是否遵循各阶段流程规范(develop 是否实际产出代码文件、test 是否覆盖充分、deploy 配置是否完整、requirement 是否明确部署环境需求) 3. 产出质量:内容是否完整、可量化、可验收、无重大缺陷、无空泛套话 @@ -1290,7 +1290,7 @@ async def _build_role_skills_block(sor, project_id, role, org_id=""): for s in skills[:60]: tag = SCOPE_TAG.get(getattr(s, 'scope', ''), getattr(s, 'scope', '')) lines.append(f"- [{tag}] {s.name}: {(s.description or '')[:100]}") - # 项目模块技能:workspace repos/*/skill/SKILL.md(模块怎么用——架构/数据模型/挂载函数/坑位), + # 项目模块技能:机构工作空间 modules/*/skill + apps/*/skill/SKILL.md(模块怎么用——架构/数据模型/挂载函数/坑位), # 运行时扫描注入,让项目角色知道引用了哪些模块、每个模块怎么挂载(load_xxx 入口/库名/坑)。 try: ws = await _get_space_dir(sor, project_id) @@ -1358,7 +1358,7 @@ async def _load_skill_by_name(sor, project_id, role, org_id, name, file_path=Non merged = loader.get_merged(pipeline_id=pid, role=role, project_id=project_id, org_id=org_id or '0') if name not in merged: - # 项目模块技能(workspace repos/*/skill/SKILL.md)不在 skill_loader 静态树里,运行时补查。 + # 项目模块技能(机构工作空间 modules/*/skill + apps/*/skill)不在 skill_loader 静态树里,运行时补查。 # 全文层对齐 skill_loader.to_prompt_block:剥离 frontmatter 只返回正文(body)。 try: ws = await _get_space_dir(sor, project_id) @@ -1435,7 +1435,7 @@ async def role_agent_run(project_id, role, agent_id=None, model_name=None): # 注入角色技能(角色专属技能全量 + 其余 scope 目录层,优先级 角色>项目>产线>组织>通用) role_skills = await _build_role_skills_block(sor, project_id, role, org_id) - # 项目名(用于 prompt 里 {项目名}_pc 占位符替换,角色产出路径以 project-directory-spec 为准) + # 项目目录名(英文 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_id/iteration_id/who/agent_id 自动注入,LLM 不可见) diff --git a/pipeline_service/sdlc_ability.py b/pipeline_service/sdlc_ability.py index e534bdd..2c8d939 100644 --- a/pipeline_service/sdlc_ability.py +++ b/pipeline_service/sdlc_ability.py @@ -130,7 +130,7 @@ SDL_TOOLS = [ ), ToolDefinition( name="clone_repo", - description="克隆项目关联的仓库到工作空间repos/下(不传url则clone全部,传则clone指定)", + description="克隆项目关联的仓库到机构工作空间 apps/modules 下(不传url则clone全部,传则clone指定)", parameters={"repo_url": "仓库URL(可选)"}, category="repo", ),