fix: 模块仓库本地 git 化——develop git_commit_push 自动 init+本地提交作为产出证据,QC 改查实际文件不再要求远程推送

根因:设计阶段模块仓库URL是规划占位地址(git@code.local),develop 的 git_clone 失败后
代码直接 write_file 到 repos/<模块>/ 但从未 git init,导致模块仓库无 .git;加上上一轮
「审核后统一提交」让 develop 连本地提交都不做,QC 找不到 git 提交证据 → qc_reject 死循环。

修复:_git_commit_push 非 git 目录自动 init;develop 提示词改为本地 git init + git_commit_push
提交模块仓库;QC 提示词改为 list_files/read_file 核验真实文件 + 本地提交,不因无远程推送退回。
This commit is contained in:
ymq 2026-08-20 23:44:51 +08:00
parent 38e47be4db
commit d97c1442fa
2 changed files with 16 additions and 9 deletions

View File

@ -307,9 +307,14 @@ async def _git_setup(workdir):
async def _git_commit_push(workdir, commit_message, branch='main'):
"""git add → commit → push无 remote 的本地仓库仅 commit"""
"""git add → commit → push无 remote 的本地仓库仅 commit非 git 目录自动 git init。"""
async with _git_lock(workdir):
await _git_setup(workdir)
# 非 git 目录自动 git init模块仓库无真实远端本地 git init
if not os.path.isdir(os.path.join(workdir, '.git')):
r0 = await _run_shell('git init', workdir, 10)
if r0['rc'] != 0:
return {"rc": r0['rc'], "message": f"git init 失败: {r0['stderr'][:200]}"}
r1 = await _run_shell('git add -A', workdir, 10)
r2 = await _run_shell(f'git diff --cached --stat', workdir, 10)
if not r2.get('stdout', '').strip():
@ -346,7 +351,7 @@ AGENT_TOOLS = [
{"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_commit_push","description":"git add + commit + push一般无需调用git 提交由 PM 审核通过后系统统一执行","params":{"message":"提交信息","repo_dir":"仓库子目录(可选)"}},
{"name":"git_commit_push","description":"git add + commit + pushdevelop 用它提交模块仓库本地提交作为产出证据;无远程只 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\":\"代码内容\"}](可选)"}},
]

View File

@ -268,7 +268,7 @@ SDL_ROLES = [
- ui-design.md: 视觉风格(配色/字体/间距)主页面布局用户交互模式弹窗/表单规范
模块级设计每个模块自包含可复用产出到 repos/project/modules/:
- modules/<模块名>.md: 模块功能仓库URL(先填规划地址)技术栈依赖开发顺序
- modules/<模块名>.md: 模块功能仓库目录本地 git 仓库 repos/<模块名>无真实远端技术栈依赖开发顺序
- modules/<模块名>/design.md: 该模块的数据设计(表结构DDL) + CRUD 定义 + 处理逻辑(接口)
- modules/<模块名>/skill/SKILL.md: 该模块技能文档
数据CRUD处理逻辑skills 都属于模块本身不放在应用级 design这样模块可整体复用
@ -288,14 +288,15 @@ SDL_ROLES = [
准备工作:
1. read_file repos/project/docs/01-design/ 下架构与 UI 设计文档
2. read_file repos/project/modules/<模块名>.md 获取模块仓库 URL repos/project/modules/<模块名>/design.md 获取数据设计/CRUD/处理逻辑
3. git_clone 克隆模块仓库到 repos/
3. 模块仓库是本地 git 仓库 repos/<模块名>/设计里的仓库URL是规划占位地址无真实远端不要 git_clone
开发流程:
4. write_file 写代码到模块仓库目录
5. run_shell 编译/运行验证
6. write_file 更新 repos/project/modules/<模块名>.md 状态为已完成
7. write_file repos/project/docs/02-develop/dev-notes.md 记录开发内容
8. deliver 交付files 列出所有产出文件路径git 提交由 PM 审核通过后系统统一执行
PM审核: list_files/read_file 检查代码文件实际产出""",
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 记录开发内容
9. deliver 交付files 列出所有产出文件路径
PM审核: list_files/read_file 检查代码文件实际产出 + 模块仓库本地 git log 有提交""",
next_role="agent.deploy_test",
),
RoleSpec(
@ -354,8 +355,9 @@ PM审核: 检查生产部署配置完整、可一键部署、有回滚方案。"
检查维度:
1. 项目规范检查: 产出是否按 SDLC 仓库标准路径/命名/格式产出
2. 项目过程规范: 是否遵循各阶段流程规范develop 是否实际产出代码文件test 是否覆盖充分deploy 配置是否完整
2. 项目过程规范: 是否遵循各阶段流程规范develop 是否实际产出代码文件 list_files repos/<模块>/ 下的 src/sql/tests 等真实文件read_file 抽查内容git log 看模块仓库本地提交test 是否覆盖充分deploy 配置是否完整
3. 产出质量: 内容是否完整可量化可验收无重大缺陷
核验原则: git 提交是 develop 对模块仓库的本地提交无远程推送 list_files/read_file 核验文件真实落盘即可不要因无远程推送退回
不合规处理: review_reject 退回重做questions 列出具体问题清单""",
next_role="",
),