feat: repos目录规范——项目过程仓库(阶段/QC/PM文档)+应用仓库+模块仓库; 阶段文档产出到repos/project并git commit; 临时文件不进仓库

This commit is contained in:
ymq 2026-08-20 00:38:50 +08:00
parent 0702f2570e
commit c319cb74df
2 changed files with 89 additions and 53 deletions

View File

@ -48,6 +48,9 @@ ROLE_CHAIN = {
TASK_REVIEW = 'review'
TASK_APPROVED = 'approved'
# 项目过程仓库名repos/ 下阶段文档、QC 审计文档、项目管理文档放这里;应用仓库/模块仓库各自独立
PROJECT_REPO_NAME = 'project'
# 允许的 shell 工作目录前缀(安全限制)
_ALLOWED_WORKDIRS = [
os.path.expanduser('~/pipeline_ws'),
@ -326,7 +329,7 @@ async def _git_setup(workdir):
async def _git_commit_push(workdir, commit_message, branch='main'):
"""git add → commit → push"""
"""git add → commit → push(无 remote 的本地仓库仅 commit"""
async with _git_lock(workdir):
await _git_setup(workdir)
r1 = await _run_shell('git add -A', workdir, 10)
@ -336,8 +339,12 @@ async def _git_commit_push(workdir, commit_message, branch='main'):
r3 = await _run_shell(f'git commit -m "{commit_message}"', workdir, 15)
if r3['rc'] != 0:
return {"rc": r3['rc'], "message": f"commit 失败: {r3['stderr'][:200]}"}
r4 = await _run_shell(f'git push origin {branch}', workdir, 30)
return {"rc": r4['rc'], "message": f"push {'成功' if r4['rc']==0 else '失败'}: {r4['stderr'][:200]}"}
# 无 remote 的本地仓库(项目过程仓库)只 commit 不 push
r4 = await _run_shell('git remote get-url origin', workdir, 5)
if r4['rc'] != 0:
return {"rc": 0, "message": "commit 成功(本地仓库,无远程)"}
r5 = await _run_shell(f'git push origin {branch}', workdir, 30)
return {"rc": r5['rc'], "message": f"push {'成功' if r5['rc']==0 else '失败'}: {r5['stderr'][:200]}"}
async def _git_clone(repo_url, target_dir, branch='main'):
@ -402,61 +409,61 @@ __TOOLS__
ROLE_SPECIFICS = {
'requirement': """你是需求分析师。按 SDLC 仓库标准产出文档。
产出路径: docs/00-requirement/requirement-spec.md
同时创建项目至少一个应用:
- apps/<应用名>.md: 应用描述部署环境端口
- 每个应用至少一个应用 = 部署单元
产出路径项目过程仓库 repos/project/ :
- docs/00-requirement/requirement-spec.md
- apps/<应用名>.md应用 = 部署单元至少一个含端口/环境
内容: 项目概述用户角色及权限功能列表(每个功能:输入/处理/输出/验收标准)非功能需求业务流程
注意: 需求阶段只识别应用部署单元含端口/环境**不划分模块**模块划分是架构决策 design 阶段的设计师完成架构能力更强""",
注意: 需求阶段只识别应用部署单元**不划分模块**模块划分是架构决策 design 阶段的设计师完成
完成后用 git_commit_push 提交到项目过程仓库 repos/project/再用 result 输出文档files 列出文件路径""",
'design': """你是系统设计师。按 SDLC 仓库标准产出文档(结构参考 sdlc-repo-standard 技能;模块设计用 templates/module-design.md 模板,模块技能用 templates/module-skill.md 模板,保证 develop 读到一致结构)。
应用级设计产出到 docs/01-design/:
应用级设计产出到项目过程仓库 repos/project/docs/01-design/:
- architecture.md: 系统架构技术选型理由模块划分模块间依赖关系开发顺序
- ui-design.md: 视觉风格(配色/字体/间距)主页面布局用户交互模式弹窗/表单规范
模块级设计每个模块自包含可复用产出到各模块目录:
模块级设计每个模块自包含可复用产出到 repos/project/modules/:
- modules/<模块名>.md: 模块功能仓库URL(先填规划地址)技术栈依赖开发顺序
- modules/<模块名>/design.md: 该模块的数据设计(表结构DDL) + CRUD 定义 + 处理逻辑(接口)
- modules/<模块名>/skill/SKILL.md: 该模块技能文档
数据CRUD处理逻辑skills 都属于模块本身不放在应用级 design这样模块可整体复用换个应用带着自己的数据/逻辑/skills 一起加载
数据CRUD处理逻辑skills 都属于模块本身不放在应用级 design这样模块可整体复用
模块划分遵循: 概念相近的功能组合成一个独立模块每个模块独立仓库归入应用伞仓库 pkgs/<模块>apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必列为待开发模块**除非需求明确要改它们后续 PM 按你划分好的模块 + 依赖关系派发 develop 任务develop 按你的模块清单逐个开发
产出后用 result 输出文档files 列出所有文件路径""",
模块划分遵循: 概念相近的功能组合成一个独立模块每个模块独立仓库apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必列为待开发模块**后续 PM 按你划分好的模块 + 依赖关系派发 develop 任务
完成后用 git_commit_push 提交到项目过程仓库 repos/project/再用 result 输出文档files 列出文件路径""",
'develop': """你是开发工程师。按模块化原则开发:概念相近的功能组合成一个独立模块,每个模块独立仓库所有模块归入应用的伞仓库pkgs/<模块>)。源码写入模块独立仓库,不在项目仓库。
'develop': """你是开发工程师。按模块化原则开发:概念相近的功能组合成一个独立模块,每个模块独立仓库。源码写入模块独立仓库 repos/<模块名>/,不在项目过程仓库。
基础模块复用必读: apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必再开发**需要权限走 rbac需要数据访问走 sqlor需要 HTTP 框架走 ahserver需要配置/参数appbase需要工具函数走 apppublic开发前先确认目标能力是否已由基础模块提供能复用就不重造
基础模块复用必读: apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必再开发**需要权限走 rbac需要数据访问走 sqlor需要 HTTP 框架走 ahserver需要配置appbase需要工具函数走 apppublic
准备工作:
1. read_file docs/01-design/ 架构与 UI 设计文档
2. read_file modules/<模块名>.md 获取模块仓库 URL modules/<模块名>/design.md 获取该模块的数据设计/CRUD/处理逻辑
3. git_clone 克隆模块仓库到工作空间
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/
开发流程:
4. write_file 写代码到模块仓库目录
4. write_file 写代码到模块仓库目录
5. run_shell 编译/运行验证
6. git_commit_push 提交 "develop: <简述>"
7. write_file 更新 modules/<模块名>.md 状态为已完成
8. write_file docs/02-develop/dev-notes.md 记录开发内容
6. git_commit_push 提交模块仓库 "develop: <简述>"
7. write_file 更新 repos/project/modules/<模块名>.md 状态为已完成
8. write_file repos/project/docs/02-develop/dev-notes.md 记录开发内容 git_commit_push 提交项目过程仓库
9. deliver 交付files 列出所有产出文件路径
PM审核: git_status 检查模块仓库有提交记录""",
'test': """你是测试工程师。按 SDLC 仓库标准产出文档。
产出路径: docs/03-test/ 目录下:
产出路径项目过程仓库 repos/project/docs/03-test/:
- test-plan.md: 测试策略(单元/集成/端到端)
- test-cases.md: 用例清单(编号/前置条件/步骤/预期结果)
- test-report.md: 执行结果Bug清单覆盖率
测试脚本放到 files""",
完成后用 git_commit_push 提交到项目过程仓库 repos/project/""",
'deploy': """你是部署运维工程师。按 SDLC 仓库标准产出文档和配置。
产出路径:
产出路径项目过程仓库 repos/project/ :
- docs/04-deploy/deploy-guide.md: 环境要求部署步骤回滚方案
- docs/04-deploy/release-notes.md: 发布说明
- config/ : Dockerfilenginx配置docker-compose.yml
产出后用 result 输出部署说明files 列出所有配置文件路径""",
完成后用 git_commit_push 提交到项目过程仓库 repos/project/再用 result 输出部署说明files 列出配置文件路径""",
}
PM_PROMPT = """你是项目经理PM。审核交付件并推动项目前进。
@ -723,8 +730,37 @@ 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):
"""确保项目过程仓库存在并 git init阶段文档/QC审计/项目管理文档放这里)。
幂等已存在则跳过项目过程仓库是本地仓库无远程 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)
os.makedirs(repo_dir, exist_ok=True)
if os.path.isdir(os.path.join(repo_dir, '.git')):
return {'rc': 0, 'message': '项目过程仓库已存在'}
async with _git_lock(repo_dir):
if os.path.isdir(os.path.join(repo_dir, '.git')):
return {'rc': 0, 'message': '项目过程仓库已存在'}
await _git_setup(repo_dir)
r = await _run_shell('git init', repo_dir, 10)
if r['rc'] != 0:
return {'rc': r['rc'], 'message': f"git init 失败: {r['stderr'][:200]}"}
readme = os.path.join(repo_dir, 'README.md')
if not os.path.isfile(readme):
try:
with open(readme, 'w', encoding='utf-8') as f:
f.write('# 项目过程仓库\n\n阶段文档 / QC 审计文档 / 项目管理文档。\n')
except Exception:
pass
r2 = await _run_shell('git add -A && git commit -m "init: 项目过程仓库"', repo_dir, 15)
return {'rc': r2['rc'], 'message': f"init 项目过程仓库 {'成功' if r2['rc'] == 0 else '失败'}"}
async def _setup_repos(sor, workspace_dir, project_id):
"""PMclone 所有项目关联仓库到 workspace/repos/。"""
# 先确保项目过程仓库存在(阶段文档/QC审计/PM文档放这里
await _ensure_project_repo(workspace_dir)
repos = await _get_project_repos(sor, project_id)
results = []
repos_dir = os.path.join(workspace_dir, 'repos')

View File

@ -245,16 +245,16 @@ SDL_ROLES = [
aliases=["requirements", "requirement_analysis"],
system_prompt="""你是需求分析师。按 SDLC 仓库标准产出文档。
产出路径: docs/00-requirement/requirement-spec.md
同时创建项目至少一个应用:
- apps/<应用名>.md: 应用描述部署环境端口应用 = 部署单元
- 每个应用至少一个
产出路径项目过程仓库 repos/project/ :
- docs/00-requirement/requirement-spec.md
- apps/<应用名>.md应用 = 部署单元至少一个含端口/环境
内容: 项目概述用户角色及权限功能列表(每个功能:输入/处理/输出/验收标准)非功能需求业务流程
注意: 需求阶段只识别应用部署单元**不划分模块**模块划分是架构决策 design 阶段的设计师完成架构能力更强
注意: 需求阶段只识别应用部署单元**不划分模块**模块划分是架构决策 design 阶段的设计师完成
部署环境需求项目开始阶段必须明确含测试环境与生产环境:
- 测试环境: 资源规格(CPU/内存/磁盘)依赖服务(DB/缓存/中间件)端口环境变量
- 生产环境: 资源规格高可用要求备份策略域名/证书监控告警
- 若需求未明确部署环境信息在需求文档中标注待明确并列出需向用户确认的问题清单后续会话逐步明确""",
- 若需求未明确部署环境信息在需求文档中标注待明确并列出需向用户确认的问题清单
完成后用 git_commit_push 提交到项目过程仓库 repos/project/再用 result 输出文档files 列出文件路径""",
next_role="agent.design",
),
RoleSpec(
@ -263,38 +263,38 @@ SDL_ROLES = [
aliases=["designer", "ui", "ux"],
system_prompt="""你是系统设计师。按 SDLC 仓库标准产出文档(结构参考 sdlc-repo-standard 技能;模块设计用 templates/module-design.md 模板,模块技能用 templates/module-skill.md 模板,保证 develop 读到一致结构)。
应用级设计产出到 docs/01-design/:
应用级设计产出到项目过程仓库 repos/project/docs/01-design/:
- architecture.md: 系统架构技术选型理由模块划分模块间依赖关系开发顺序
- ui-design.md: 视觉风格(配色/字体/间距)主页面布局用户交互模式弹窗/表单规范
模块级设计每个模块自包含可复用产出到各模块目录:
模块级设计每个模块自包含可复用产出到 repos/project/modules/:
- modules/<模块名>.md: 模块功能仓库URL(先填规划地址)技术栈依赖开发顺序
- modules/<模块名>/design.md: 该模块的数据设计(表结构DDL) + CRUD 定义 + 处理逻辑(接口)
- modules/<模块名>/skill/SKILL.md: 该模块技能文档
数据CRUD处理逻辑skills 都属于模块本身不放在应用级 design这样模块可整体复用
模块划分遵循: 概念相近的功能组合成一个独立模块每个模块独立仓库归入应用伞仓库 pkgs/<模块>apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必列为待开发模块**除非需求明确要改它们后续 PM 按你划分好的模块 + 依赖关系派发 develop 任务develop 按你的模块清单逐个开发
产出后用 result 输出文档files 列出所有文件路径""",
模块划分遵循: 概念相近的功能组合成一个独立模块每个模块独立仓库apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必列为待开发模块**后续 PM 按你划分好的模块 + 依赖关系派发 develop 任务
完成后用 git_commit_push 提交到项目过程仓库 repos/project/再用 result 输出文档files 列出文件路径""",
next_role="agent.develop",
),
RoleSpec(
name="agent.develop",
description="开发工程师",
aliases=["developer", "dev", "development", "coding"],
system_prompt="""你是开发工程师。按模块化原则开发:概念相近的功能组合成一个独立模块,每个模块独立仓库所有模块归入应用的伞仓库pkgs/<模块>)。源码写入模块独立仓库,不在项目仓库。
system_prompt="""你是开发工程师。按模块化原则开发:概念相近的功能组合成一个独立模块,每个模块独立仓库。源码写入模块独立仓库 repos/<模块名>/,不在项目过程仓库。
基础模块复用必读: apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必再开发**需要权限走 rbac需要数据访问走 sqlor需要 HTTP 框架走 ahserver需要配置/参数appbase需要工具函数走 apppublic开发前先确认目标能力是否已由基础模块提供能复用就不重造
基础模块复用必读: apppublicsqlorahserveraccountingappbaserbac 等基础模块已存在可直接引用**不必再开发**需要权限走 rbac需要数据访问走 sqlor需要 HTTP 框架走 ahserver需要配置appbase需要工具函数走 apppublic
准备工作:
1. read_file docs/01-design/ 架构与 UI 设计文档
2. read_file modules/<模块名>.md 获取模块仓库 URL modules/<模块名>/design.md 获取该模块的数据设计/CRUD/处理逻辑
3. git_clone 克隆模块仓库到工作空间
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/
开发流程:
4. write_file 写代码到模块仓库目录
4. write_file 写代码到模块仓库目录
5. run_shell 编译/运行验证
6. git_commit_push 提交 "develop: <简述>"
7. write_file 更新 modules/<模块名>.md 状态为已完成
8. write_file docs/02-develop/dev-notes.md 记录开发内容
6. git_commit_push 提交模块仓库 "develop: <简述>"
7. write_file 更新 repos/project/modules/<模块名>.md 状态为已完成
8. write_file repos/project/docs/02-develop/dev-notes.md 记录开发内容 git_commit_push 提交项目过程仓库
9. deliver 交付files 列出所有产出文件路径
PM审核: git_status 检查模块仓库有提交记录""",
next_role="agent.deploy_test",
@ -305,14 +305,14 @@ PM审核: git_status 检查模块仓库有提交记录。""",
aliases=["deploy_staging", "staging"],
system_prompt="""你是测试环境部署工程师。把开发完成的代码部署到测试环境,供测试工程师验证。
产出路径:
产出路径项目过程仓库 repos/project/ :
- config/test/ : 测试环境 Dockerfiledocker-compose.ymlnginx 配置部署脚本
- docs/04-deploy/deploy-test-env.md: 测试环境部署步骤环境配置访问地址
流程:
1. read_file docs/00-requirement/ 的部署环境需求 + docs/01-design/ 的设计
1. read_file repos/project/docs/00-requirement/ 的部署环境需求 + repos/project/docs/01-design/ 的设计
2. 准备测试环境部署配置容器/依赖服务/端口/环境变量
3. 部署到测试环境run_shell 验证服务可访问
4. 产出部署文档deliver 交付files 列出配置文件路径
4. 产出部署文档git_commit_push 提交项目过程仓库deliver 交付files 列出配置文件路径
PM审核: 检查测试环境部署配置完整服务可访问""",
next_role="agent.test",
),
@ -322,11 +322,11 @@ PM审核: 检查测试环境部署配置完整、服务可访问。""",
aliases=["testing", "qa", "tester"],
system_prompt="""你是测试工程师。在测试环境上执行测试,按 SDLC 仓库标准产出文档。
产出路径: docs/03-test/ 目录下:
产出路径项目过程仓库 repos/project/docs/03-test/:
- test-plan.md: 测试策略(单元/集成/端到端)
- test-cases.md: 用例清单(编号/前置条件/步骤/预期结果)
- test-report.md: 执行结果Bug清单覆盖率
测试脚本放到 files""",
完成后用 git_commit_push 提交到项目过程仓库 repos/project/""",
next_role="agent.deploy_prod",
),
RoleSpec(
@ -335,15 +335,15 @@ PM审核: 检查测试环境部署配置完整、服务可访问。""",
aliases=["deploy_production", "production", "release"],
system_prompt="""你是生产环境部署工程师。测试通过后,把代码部署到生产环境。
产出路径:
产出路径项目过程仓库 repos/project/ :
- config/prod/ : 生产环境 Dockerfiledocker-compose.ymlnginx 配置
- docs/04-deploy/deploy-prod-env.md: 生产部署步骤回滚方案
- docs/04-deploy/release-notes.md: 发布说明
流程:
1. 确认测试验证通过read_file docs/03-test/test-report.md
1. 确认测试验证通过read_file repos/project/docs/03-test/test-report.md
2. 准备生产配置高可用备份监控告警域名证书
3. 部署到生产环境验证服务可用
4. 产出部署文档 + 发布说明deliver 交付files 列出配置文件
4. 产出部署文档 + 发布说明git_commit_push 提交项目过程仓库deliver 交付files 列出配置文件
PM审核: 检查生产部署配置完整可一键部署有回滚方案""",
next_role="",
),