refactor: 合并 dev_scripts 入口为单一 harness.py (#23)

原有 4 个命令行入口(check_harness、sync_wiki_docs、new_task_archive、
export_task_archives)需要在多处文档分别描述,同步核心镜像还要按顺序跑 3 条命令。

合并为 dev_scripts/harness.py,提供 check / sync / archive / export 四个子命令,
各命令实现逻辑逐字取自原脚本,行为未改变;新增 sync --verify 一次完成
导出 → check --strict → 一致性校验。wiki_docs.py 作为库保持不变。

破坏性变更:4 个旧入口已删除,不保留兼容转发。已采用 DevHarness 的业务项目
升级基线时必须同步修改自己的命令与文档。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
ila
2026-08-18 21:36:15 +08:00
co-authored by Claude Opus 5
parent 65ead42f36
commit bfc0726c33
8 changed files with 295 additions and 296 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "dev_scripts"))
from check_harness import ( # noqa: E402
from harness import ( # noqa: E402
CORE_DOCUMENT_REQUIREMENTS,
CORE_PAGE_PATHS,
REQUIRED_FILES,
+10 -11
View File
@@ -12,14 +12,12 @@ from unittest.mock import Mock, patch
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT / "dev_scripts"))
from new_task_archive import ( # noqa: E402
from harness import ( # noqa: E402
build_archive,
main as new_archive_main,
safe_title,
)
from export_task_archives import ( # noqa: E402
existing_task_mirrors,
export_task_archives,
main as harness_main,
safe_title,
task_target,
)
from wiki_docs import ( # noqa: E402
@@ -167,7 +165,7 @@ class ArchiveTests(unittest.TestCase):
self.assertIn("Task-12-login", result)
self.assertNotIn("YYYY-MM-DD", result)
@patch("new_task_archive.WikiClient")
@patch("harness.WikiClient")
def test_create_archive_does_not_change_core_mapping(self, client_class) -> None:
with tempfile.TemporaryDirectory() as directory:
config_path = Path(directory) / "wiki-docs.json"
@@ -203,14 +201,15 @@ class ArchiveTests(unittest.TestCase):
sys,
"argv",
[
"new_task_archive.py",
"harness.py",
"archive",
"14",
"按需导出",
"--config",
str(config_path),
],
):
result = new_archive_main()
result = harness_main()
self.assertEqual(config_path.read_text(encoding="utf-8"), original)
self.assertEqual(result, 0)
client.create_page.assert_called_once()
@@ -239,7 +238,7 @@ class ArchiveTests(unittest.TestCase):
"2-初级维护者文档体系.md",
)
@patch("export_task_archives.dirty_paths", return_value=[])
@patch("harness.dirty_paths", return_value=[])
def test_incremental_export_skips_same_revision(self, _dirty) -> None:
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
@@ -266,7 +265,7 @@ class ArchiveTests(unittest.TestCase):
client.get_page_from_metadata.assert_not_called()
@patch(
"export_task_archives.dirty_paths",
"harness.dirty_paths",
return_value=[" M docs/task/14-按需导出.md"],
)
def test_export_stops_before_wiki_read_when_task_mirror_is_dirty(
@@ -277,7 +276,7 @@ class ArchiveTests(unittest.TestCase):
export_task_archives(client)
client.list_pages.assert_not_called()
@patch("export_task_archives.dirty_paths", return_value=[])
@patch("harness.dirty_paths", return_value=[])
def test_full_export_reads_all_and_never_deletes_extra_file(self, _dirty) -> None:
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)