docs(#114): upgrade DevHarness workflow baseline

This commit is contained in:
QiuSW
2026-08-27 17:44:39 +08:00
parent bc9c637522
commit 2a44b50a53
10 changed files with 324 additions and 52 deletions
+36 -14
View File
@@ -3,8 +3,8 @@
子命令:
check 检查必需文件、核心文档和既有任务快照结构
sync 从 Gitea Wiki 单向导出或校验核心 docs 镜像
archive 按用户明确要求在 Gitea Wiki 创建历史任务快照
export 人工按需把历史任务快照导出到 docs/task
archive 按用户明确要求在 Gitea Wiki 创建可选任务快照
export 人工按需把已有任务快照导出到 docs/task
各子命令的实现逻辑取自原来的 check_harness.py、sync_wiki_docs.py、
new_task_archive.py 和 export_task_archives.py,行为未改变。
@@ -51,6 +51,7 @@ CORE_PAGE_PATHS = {
"PDD-Detail-Rule-Migration-Analysis": (
"docs/11-pdd-detail-rule-migration-analysis.md"
),
"Deployment-Template": "docs/templates/deployment.md",
"Task-Archive-Template": "docs/templates/task-archive.md",
}
# 按 GoAuto 实际文档结构定义,不照抄 DevHarness 模板章节名。
@@ -75,9 +76,10 @@ CORE_DOCUMENT_REQUIREMENTS = {
"docs/01-workflow.md": (
"## 事实来源",
"## 权威源与事实边界",
"## Gitea 交互与工单最小读取",
"## 新项目 Wiki 初始化门禁",
"## 工单与设计证据双门禁",
"### 本地 HTML 审核快照",
"### 线上原型审核与按需导出",
"## 任务层级与状态",
"## 单元任务闭环",
"## 标准任务节奏",
@@ -99,6 +101,7 @@ CORE_DOCUMENT_REQUIREMENTS = {
"## 术语",
),
"docs/04-local-development-and-verification.md": (
"## Windows PowerShell 与 UTF-8",
"## 通用检查",
"## 服务端验证",
"## Web 验证",
@@ -123,6 +126,7 @@ REQUIRED_FILES = (
"README.md",
"docs/00-project-profile.md",
"docs/01-workflow.md",
"docs/templates/deployment.md",
"docs/templates/task-archive.md",
*CORE_DOCUMENT_REQUIREMENTS,
"wiki-docs.json",
@@ -225,10 +229,10 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
"## 设计与原型门禁",
"- 修改类型:纯显示文案 / 小范围 UI / 新组件 / 新页面或独立用户功能 / 重大交互或导航 / 非 UI / 恢复既有行为的 Bug",
"- 所需设计证据:无 / 标注截图 / 低保真图 / 已确认原型 / 架构、API、数据、状态或流程设计 / 原设计或复现证据",
"- 可编辑设计源链接、版本或事实来源:",
"- 本地 HTML 审核快照路径和版本(不适用时说明原因):",
"- 本地浏览方式和资源完整性检查:",
"- 版本、revision 或确认日期:",
"- 可编辑设计源、线上原型链接和访问检查:",
"- 审核版本、revision、复制版本或确认日期及识别方式:",
"- 本地 HTML 导出:未要求 / 用户明确要求 / 项目规则要求",
"- 本地 HTML 路径、版本和资源检查(仅显式导出时填写):",
"- 状态:无 / 草稿 / 已确认 / 已废弃",
"- 确认人、确认时间和覆盖范围:",
"- 无需 UI 原型或无需任何原型的原因:",
@@ -244,6 +248,11 @@ def check_task_template(errors: list[str], root: Path = ROOT) -> None:
"- [ ] 更新已有交付文档,受众与页面:",
"- [ ] 新增交付文档,受众与页面:",
"- [ ] 需要目标岗位或客户代表验证:是 / 否;验证方式:",
"## 任务记录与可选快照",
"- 单次任务事实来源:当前 Gitea 工单正文与评论",
"- [ ] 默认不创建任务快照",
"- [ ] 用户明确要求专项快照;用途和范围:",
"- [ ] 项目专用规则要求任务快照;规则入口:",
)
for section in missing_sections(content, required):
errors.append(f"单元任务模板缺少:{section}")
@@ -268,16 +277,27 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"Wiki 同步由长期事实变化触发,不由任务完成触发",
"标准流程不创建 Wiki 任务归档",
"工单默认只在开始实施、集中回写待验收、验收关闭三个节点更新",
"### Gitea 交互与工单最小读取",
"查询、创建、更新、评论、状态变更及关闭操作",
"优先关注当前状态、最新评论和首个未完成步骤",
"连接器不支持评论分页或增量读取时允许读取完整工单",
"不得为规避完整读取而新增本地工单、缓存或第二事实来源",
"「当前实现」",
"「目标契约」",
"### 新项目 Wiki 初始化门禁",
"`Home` 不存在时必须先创建 `Home`",
"不得把模板自带的本地 `docs/` 当作新项目 Wiki 已初始化的证据",
"提交只包含当前工单相关文件",
"不得仅为设置编码重复启动一层 PowerShell",
"文件解码和控制台输出分别处理",
"不得默认使用 `-ExecutionPolicy Bypass`",
"### 工单与设计证据双门禁",
"新页面、独立用户功能、重大交互或导航变化",
"`prototypes/<工单号>/<版本>/index.html`",
"已确认的 HTML 快照不得原位覆盖",
"默认直接通过 QuantUX 或其他设计工具的线上链接审核",
"已确认的本地快照不得原位覆盖",
"`导出原型 #N`",
"`导出全部原型`",
"代码组件名、类名、变量、国际化键、API 字段和数据库字段不是显示文案",
"### 自然语言快捷指令",
"`只分析`",
@@ -287,6 +307,8 @@ def check_agent_efficiency_rules(errors: list[str], root: Path = ROOT) -> None:
"`继续工单 #N`",
"`检查工单 #N`",
"`同步文档`",
"`导出原型 #N`",
"`导出全部原型`",
"`导出任务归档`",
"`导出全部任务归档`",
"`#N 验收通过`",
@@ -400,7 +422,7 @@ def check_wiki_mirrors(errors: list[str]) -> None:
errors.append(f"{mapping.path} 缺少 synchronized_at")
# ---------------------------------------------------------------- 按需历史任务快照
# ---------------------------------------------------------------- 按需任务快照
def safe_title(title: str) -> str:
"""把标题转换为适合 Wiki 页面名和 Windows 文件名的短文本。"""
@@ -425,7 +447,7 @@ def build_archive(
return content.replace("<页面名>", page_name, 1)
# ---------------------------------------------------------------- 历史任务快照导出
# ---------------------------------------------------------------- 任务快照导出
TASK_PAGE_PATTERN = re.compile(r"^Task-(?P<number>\d+)-(?P<title>.+)$")
@@ -602,7 +624,7 @@ def run_archive(args: argparse.Namespace) -> int:
return 1
print(f"已创建 Wiki:{page.html_url}")
print("未导出本地历史快照;用户明确要求时运行 harness.py export")
print("未导出本地任务快照;用户明确要求时运行 harness.py export")
return 0
@@ -615,7 +637,7 @@ def run_export(args: argparse.Namespace) -> int:
return 1
for message in messages:
print(message)
print("历史任务快照全量导出完成" if args.all else "历史任务快照增量导出完成")
print("任务快照全量导出完成" if args.all else "任务快照增量导出完成")
return 0
@@ -643,7 +665,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(
@@ -651,7 +673,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",