fix: 统一项目过程仓库命名 repos/{项目名}_pc(修复与 project-directory-spec 的路径错位)

- PROJECT_REPO_NAME 保留为回退默认值,_ensure_project_repo 改为按 {项目名}_pc 命名
- _setup_repos/role_agent_run 查项目名并注入 __PROJECT_NAME__ 占位符
- SDL_ROLES 6 个角色 prompt 的 repos/project/ 全部改为 repos/__PROJECT_NAME___pc/
- 根因:角色 prompt 硬编码旧名 repos/project,与 project-directory-spec(权威规范) 要求 {项目名}_pc 不一致,导致首次产出必被 QC 驳回
This commit is contained in:
ymq 2026-08-21 23:35:57 +08:00
parent 78b84c710e
commit 3c34eedb04
2 changed files with 39 additions and 18 deletions

View File

@ -39,7 +39,8 @@ ROLE_ALIASES = {
TASK_REVIEW = 'review'
TASK_APPROVED = 'approved'
# 项目过程仓库名repos/ 下阶段文档、QC 审计文档、项目管理文档放这里;应用仓库/模块仓库各自独立
# 项目过程仓库名repos/ 下阶段文档、QC 审计文档、项目管理文档放这里;应用仓库/模块仓库各自独立。
# 实际仓库名 = {项目名}_pc见 project-directory-spec 规范),此常量仅为查不到项目名时的回退默认值。
PROJECT_REPO_NAME = 'project'
# 允许的 shell 工作目录前缀(安全限制)
@ -627,12 +628,28 @@ async def _get_project_repos(sor, project_id):
'local_path': getattr(r, 'local_path', '') or ''} for r in (recs or [])]
async def _ensure_project_repo(workspace_dir):
async def _get_project_name(sor, project_id):
"""查项目名(用于命名项目过程仓库 {项目名}_pc。查不到返回空串。"""
try:
r = await sor.sqlExe(
"SELECT name FROM sd_projects WHERE id=${pid}$ LIMIT 1",
{"pid": project_id})
await sor.sqlExe("COMMIT", {})
if r:
return getattr(r[0], 'name', '') or ''
except Exception:
pass
return ''
async def _ensure_project_repo(workspace_dir, project_name=''):
"""确保项目过程仓库存在并 git init阶段文档/QC审计/项目管理文档放这里)。
仓库名 = {项目名}_pc project-directory-spec 规范查不到项目名时回退 PROJECT_REPO_NAME
幂等已存在则跳过项目过程仓库是本地仓库无远程 commit push"""
repos_dir = os.path.join(workspace_dir, 'repos')
os.makedirs(repos_dir, exist_ok=True)
repo_dir = os.path.join(repos_dir, PROJECT_REPO_NAME)
repo_name = f"{project_name}_pc" if project_name else PROJECT_REPO_NAME
repo_dir = os.path.join(repos_dir, repo_name)
os.makedirs(repo_dir, exist_ok=True)
if os.path.isdir(os.path.join(repo_dir, '.git')):
return {'rc': 0, 'message': '项目过程仓库已存在'}
@ -656,7 +673,7 @@ async def _ensure_project_repo(workspace_dir):
async def _commit_repos_after_approve(workspace_dir, title=''):
"""审核通过后统一提交:项目过程仓库 repos/project/(阶段/QC/PM 文档)+ repos/ 下应用/模块仓库(代码)。
"""审核通过后统一提交:项目过程仓库 repos/{项目名}_pc/(阶段/QC/PM 文档)+ repos/ 下应用/模块仓库(代码)。
不在 agent 每次产出时提交减少 git 并发锁与远端 push 频率"""
msg = f"approve: {title[:80]}" if title else "approve: 审核通过"
repos_dir = os.path.join(workspace_dir, 'repos')
@ -673,8 +690,9 @@ async def _commit_repos_after_approve(workspace_dir, title=''):
async def _setup_repos(sor, workspace_dir, project_id):
"""PMclone 所有项目关联仓库到 workspace/repos/。"""
# 先确保项目过程仓库存在(阶段文档/QC审计/PM文档放这里
await _ensure_project_repo(workspace_dir)
# 先确保项目过程仓库存在(阶段文档/QC审计/PM文档放这里仓库名 = {项目名}_pc
project_name = await _get_project_name(sor, project_id)
await _ensure_project_repo(workspace_dir, project_name)
repos = await _get_project_repos(sor, project_id)
results = []
repos_dir = os.path.join(workspace_dir, 'repos')
@ -1107,12 +1125,15 @@ 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 为准)
project_name = await _get_project_name(sor, project_id)
system = (AGENT_SYSTEM_PROMPT
.replace('__ROLE__', role)
.replace('__TITLE__', title)
.replace('__QNA__', qna_section)
.replace('__WORKSPACE__', workspace_dir)
.replace('__PROJECT_NAME__', project_name)
.replace('__ROLE_SPECIFIC__', role_specific)
.replace('__ROLE_SKILLS__', role_skills)
.replace('__TOOLS__', tools_text))

View File

@ -269,7 +269,7 @@ SDL_ROLES = [
aliases=["requirements", "requirement_analysis"],
system_prompt="""你是需求分析师。按 SDLC 仓库标准产出文档。
产出路径项目过程仓库 repos/project/ :
产出路径项目过程仓库 repos/__PROJECT_NAME___pc/ :
- docs/00-requirement/requirement-spec.md
- apps/<应用名>.md应用 = 部署单元至少一个含端口/环境
内容: 项目概述用户角色及权限功能列表(每个功能:输入/处理/输出/验收标准)非功能需求业务流程
@ -287,11 +287,11 @@ SDL_ROLES = [
aliases=["designer", "ui", "ux"],
system_prompt="""你是系统设计师。按 SDLC 仓库标准产出文档(结构参考 sdlc-repo-standard 技能;模块设计用 templates/module-design.md 模板,模块技能用 templates/module-skill.md 模板,保证 develop 读到一致结构)。
应用级设计产出到项目过程仓库 repos/project/docs/01-design/:
应用级设计产出到项目过程仓库 repos/__PROJECT_NAME___pc/docs/01-design/:
- architecture.md: 系统架构技术选型理由模块划分模块间依赖关系开发顺序
- ui-design.md: 视觉风格(配色/字体/间距)主页面布局用户交互模式弹窗/表单规范
模块级设计每个模块自包含可复用产出到 repos/project/modules/:
模块级设计每个模块自包含可复用产出到 repos/__PROJECT_NAME___pc/modules/:
- modules/<模块名>.md: 模块功能仓库目录本地 git 仓库 repos/<模块名>无真实远端技术栈依赖开发顺序
- modules/<模块名>/design.md: 该模块的数据设计(表结构DDL) + CRUD 定义 + 处理逻辑(接口)
- modules/<模块名>/skill/SKILL.md: 该模块技能文档
@ -310,15 +310,15 @@ SDL_ROLES = [
基础模块复用必读: apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必再开发**需要权限走 rbac需要数据访问走 sqlor需要 HTTP 框架走 ahserver需要配置走 appbase需要工具函数走 apppublic
准备工作:
1. read_file repos/project/docs/01-design/ 下架构与 UI 设计文档
2. read_file repos/project/modules/<模块名>.md 获取模块仓库 URL repos/project/modules/<模块名>/design.md 获取数据设计/CRUD/处理逻辑
1. read_file repos/__PROJECT_NAME___pc/docs/01-design/ 下架构与 UI 设计文档
2. read_file repos/__PROJECT_NAME___pc/modules/<模块名>.md 获取模块仓库 URL repos/__PROJECT_NAME___pc/modules/<模块名>/design.md 获取数据设计/CRUD/处理逻辑
3. 模块仓库是本地 git 仓库 repos/<模块名>/设计里的仓库URL是规划占位地址无真实远端不要 git_clone
开发流程:
4. write_file 写代码到模块仓库目录
5. run_shell 编译/运行验证
6. git_commit_push 提交模块仓库代码本地提交无远程只 commit push git 目录自动 init这是 QC 核验实际产出的硬证据务必执行
7. write_file 更新 repos/project/modules/<模块名>.md 状态为已完成
8. write_file repos/project/docs/02-develop/dev-notes.md 记录开发内容
7. write_file 更新 repos/__PROJECT_NAME___pc/modules/<模块名>.md 状态为已完成
8. write_file repos/__PROJECT_NAME___pc/docs/02-develop/dev-notes.md 记录开发内容
9. deliver 交付files 列出所有产出文件路径
PM审核: list_files/read_file 检查代码文件实际产出 + 模块仓库本地 git log 有提交""",
next_role="agent.deploy_test",
@ -329,11 +329,11 @@ PM审核: list_files/read_file 检查代码文件实际产出 + 模块仓库本
aliases=["deploy_staging", "staging"],
system_prompt="""你是测试环境部署工程师。把开发完成的代码部署到测试环境,供测试工程师验证。
产出路径项目过程仓库 repos/project/ :
产出路径项目过程仓库 repos/__PROJECT_NAME___pc/ :
- config/test/ : 测试环境 Dockerfiledocker-compose.ymlnginx 配置部署脚本
- docs/04-deploy/deploy-test-env.md: 测试环境部署步骤环境配置访问地址
流程:
1. read_file repos/project/docs/00-requirement/ 的部署环境需求 + repos/project/docs/01-design/ 的设计
1. read_file repos/__PROJECT_NAME___pc/docs/00-requirement/ 的部署环境需求 + repos/__PROJECT_NAME___pc/docs/01-design/ 的设计
2. 准备测试环境部署配置容器/依赖服务/端口/环境变量
3. 部署到测试环境run_shell 验证服务可访问
4. 产出部署文档deliver 交付files 列出配置文件路径git 提交由 PM 审核通过后系统统一执行
@ -346,7 +346,7 @@ PM审核: 检查测试环境部署配置完整、服务可访问。""",
aliases=["testing", "qa", "tester"],
system_prompt="""你是测试工程师。在测试环境上执行测试,按 SDLC 仓库标准产出文档。
产出路径项目过程仓库 repos/project/docs/03-test/:
产出路径项目过程仓库 repos/__PROJECT_NAME___pc/docs/03-test/:
- test-plan.md: 测试策略(单元/集成/端到端)
- test-cases.md: 用例清单(编号/前置条件/步骤/预期结果)
- test-report.md: 执行结果Bug清单覆盖率
@ -359,12 +359,12 @@ PM审核: 检查测试环境部署配置完整、服务可访问。""",
aliases=["deploy_production", "production", "release"],
system_prompt="""你是生产环境部署工程师。测试通过后,把代码部署到生产环境。
产出路径项目过程仓库 repos/project/ :
产出路径项目过程仓库 repos/__PROJECT_NAME___pc/ :
- config/prod/ : 生产环境 Dockerfiledocker-compose.ymlnginx 配置
- docs/04-deploy/deploy-prod-env.md: 生产部署步骤回滚方案
- docs/04-deploy/release-notes.md: 发布说明
流程:
1. 确认测试验证通过read_file repos/project/docs/03-test/test-report.md
1. 确认测试验证通过read_file repos/__PROJECT_NAME___pc/docs/03-test/test-report.md
2. 准备生产配置高可用备份监控告警域名证书
3. 部署到生产环境验证服务可用
4. 产出部署文档 + 发布说明deliver 交付files 列出配置文件git 提交由 PM 审核通过后系统统一执行