chore: 升级 DevHarness 工作流基线 (#70)

This commit is contained in:
ila
2026-08-26 20:40:21 +08:00
parent 3cc98f2984
commit fb8e787ece
10 changed files with 262 additions and 169 deletions
+36 -22
View File
@@ -1,10 +1,10 @@
"""DevHarness 单一命令行入口。
子命令:
check 检查必需文件、核心文档和已有历史任务快照结构
check 检查必需文件、核心文档和已有任务快照结构
sync 从 Gitea Wiki 单向导出或校验核心 docs 镜像
archive 按用户明确要求在 Gitea Wiki 创建历史任务快照
export 按用户明确要求把 Wiki 历史任务快照导出到 docs/task
archive 显式在 Gitea Wiki 创建可选任务快照
export 人工按需把已有 Wiki 任务快照导出到 docs/task
各子命令的实现逻辑取自原来的 check_harness.py、sync_wiki_docs.py、
new_task_archive.py 和 export_task_archives.py,行为未改变。
@@ -76,16 +76,17 @@ CORE_DOCUMENT_REQUIREMENTS = {
"## 环境、配置与凭据",
),
"docs/01-workflow.md": (
"## Gitea 交互与工单最小读取",
"## 新项目 Wiki 初始化门禁",
"## 工单与设计证据双门禁",
"### 先判断是否需要工单",
"### 再判断设计证据",
"### 本地 HTML 审核快照",
"### 线上原型审核与按需导出",
"### 记录和重新确认",
"## 面向初级维护者的修改边界",
"## 每个任务的文档影响",
"## 需求记录与流转",
"## 稳定文档与历史任务快照",
"## 稳定文档与可选历史快照",
"## 自然语言快捷指令",
"## 效率与范围控制",
"### 严格控制范围",
@@ -125,6 +126,7 @@ CORE_DOCUMENT_REQUIREMENTS = {
"## 初始化顺序",
"#### 需求总览启用条件",
"### 2. 选择建设基线",
"#### 工程基线裁剪",
"#### 判断案例",
"### 3. 识别子项目与交付单元",
"### 7. 确定交付对象和文档",
@@ -157,7 +159,7 @@ CORE_DOCUMENT_REQUIREMENTS = {
"## 登记规则",
"## 原型与设计资产",
"### 原型门禁",
"### 本地 HTML 审核快照",
"### 线上原型与按需 HTML 快照",
"### 原型确认记录",
"## 状态规则",
"## 更新时机",
@@ -289,10 +291,10 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
"## 设计与原型门禁",
"- 修改类型:纯显示文案 / 小范围 UI / 新组件 / 新页面或独立用户功能 / 重大交互或导航 / 非 UI / 恢复既有行为的 Bug",
"- 所需设计证据:无 / 标注截图 / 低保真图 / 已确认原型 / 架构、API、数据、状态或流程设计 / 原设计或复现证据",
"- 可编辑设计源链接、版本或事实来源:",
"- 本地 HTML 审核快照路径和版本(不适用时说明原因):",
"- 本地浏览方式和资源完整性检查:",
"- 版本、revision 或确认日期:",
"- 可编辑设计源、线上原型链接和访问检查:",
"- 审核版本、revision、复制版本或确认日期及识别方式:",
"- 本地 HTML 导出:未要求 / 用户明确要求 / 项目规则要求",
"- 本地 HTML 路径、版本和资源检查(仅显式导出时填写):",
"- 状态:无 / 草稿 / 已确认 / 已废弃",
"- 确认人、确认时间和覆盖范围:",
"- 无需 UI 原型或无需任何原型的原因:",
@@ -306,12 +308,11 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
"- [ ] 更新已有交付文档,受众与页面:",
"- [ ] 新增交付文档,受众与页面:",
"- [ ] 需要目标岗位或客户代表验证:是 / 否;验证方式:",
"## 完成证据",
"- 最终差异:",
"- 测试结果:",
"- 未验证部分:",
"- 提交哈希:",
"- 长期 Wiki 页面与 revision(无长期文档影响时填“无”):",
"## 任务记录与可选快照",
"- 单次任务事实来源:当前 Gitea 工单正文与评论",
"- [ ] 默认不创建任务快照",
"- [ ] 用户明确要求专项快照;用途和范围:",
"- [ ] 项目专用规则要求任务快照;规则入口:",
)
for section in missing_sections(content, required):
errors.append(f"单元任务模板缺少:{section}")
@@ -331,7 +332,14 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"单元任务是唯一正式实施单位",
"高风险修改必须停止",
"用户没有明确验收通过前不得关闭",
"只有长期事实变化时才更新核心文档",
"只有长期事实变化时才修改 Wiki",
"Gitea 工单是单次任务需求、变化、实现、测试、提交和验收的事实来源",
"默认不创建任务归档",
"### Gitea 交互与工单最小读取",
"查询、创建、更新、评论、状态变更及关闭操作",
"优先关注当前状态、最新评论和首个未完成步骤",
"连接器不支持评论分页或增量读取时允许读取完整工单",
"不得为规避完整读取而新增本地工单、缓存或第二事实来源",
"### 新项目 Wiki 初始化门禁",
"`Home` 不存在时必须先创建 `Home`",
"不得把模板自带的本地 `docs/` 当作新项目 Wiki 已初始化的证据",
@@ -339,7 +347,10 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"### 工单与设计证据双门禁",
"新页面、独立用户功能、重大交互或导航变化",
"`prototypes/<工单号>/<版本>/index.html`",
"已确认的 HTML 快照不得原位覆盖",
"默认直接通过 Quant-UX 或其他设计工具的线上链接审核",
"已确认的本地快照不得原位覆盖",
"`导出原型 #N`",
"`导出全部原型`",
"代码组件名、类名、变量、国际化键、API 字段和数据库字段不是显示文案",
"### 自然语言快捷指令",
"`只分析`",
@@ -349,6 +360,8 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"`继续工单 #N`",
"`检查工单 #N`",
"`同步文档`",
"`导出原型 #N`",
"`导出全部原型`",
"`导出任务归档`",
"`导出全部任务归档`",
"`#N 验收通过`",
@@ -356,7 +369,6 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"不得臆造用户原话",
"不复制完整聊天",
"Gitea 工单全文不导出到仓库",
"新任务默认不创建 Wiki 任务归档",
)
for section in missing_sections(content, required):
errors.append(f"AGENTS.md 缺少:{section}")
@@ -375,6 +387,8 @@ def check_repository_readme(errors: list[str], root: Path = ROOT) -> None:
"`Home` 不存在时先创建并回读 `Home`",
"本地 `docs/` 的存在不能证明线上 Wiki 已初始化",
"python dev_scripts/harness.py sync --verify",
"Gitea 工单是单次任务唯一事实来源",
"默认不创建任务归档",
)
for section in missing_sections(content, required):
errors.append(f"README.md 缺少:{section}")
@@ -682,7 +696,7 @@ def run_export(args: argparse.Namespace) -> int:
def main() -> int:
parser = argparse.ArgumentParser(description="DevHarness 检查、同步与历史快照兼容工具")
parser = argparse.ArgumentParser(description="DevHarness 检查、同步与归档工具")
sub = parser.add_subparsers(dest="command", required=True)
p_check = sub.add_parser("check", help="检查 DevHarness 项目结构")
@@ -705,7 +719,7 @@ def main() -> int:
)
p_sync.set_defaults(func=run_sync)
p_archive = sub.add_parser("archive", help="按明确要求在 Gitea Wiki 创建历史任务快照")
p_archive = sub.add_parser("archive", help="显式在 Gitea Wiki 创建可选任务快照")
p_archive.add_argument("issue_number", help="Gitea 工单号,例如 123")
p_archive.add_argument("title", help="简短任务标题")
p_archive.add_argument(
@@ -713,7 +727,7 @@ def main() -> int:
)
p_archive.set_defaults(func=run_archive)
p_export = sub.add_parser("export", help="按明确要求导出 Gitea Wiki 历史任务快照")
p_export = sub.add_parser("export", help="人工按需导出 Gitea Wiki 任务归档")
p_export.add_argument(
"--all",
action="store_true",