- 审计记录:2026-04-06__v1-cleanup-ddl-consolidation.md - 刷新审计一览表(125 条记录) - 修复 repo_root.py:.kiro 已删除后改用 pyproject.toml + CLAUDE.md 检测 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
86 lines
2.4 KiB
Python
86 lines
2.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""仓库根目录校验工具 — 全仓共享。
|
||
|
||
所有使用相对路径(docs/、export/、.kiro/ 等)的脚本,
|
||
应在入口处调用 ensure_repo_root() 确保 cwd 正确。
|
||
|
||
用法:
|
||
from neozqyy_shared.repo_root import ensure_repo_root
|
||
ensure_repo_root()
|
||
|
||
行为:
|
||
1. cwd 已是仓库根 → 直接返回
|
||
2. cwd 不是根但能通过 __main__.__file__ 或调用栈推断 → 自动 chdir + 警告
|
||
3. 无法定位 → 抛出 RuntimeError
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
import os
|
||
import warnings
|
||
from pathlib import Path
|
||
|
||
# 仓库根的标志文件组合(pyproject.toml 必须存在 + 至少一个辅助标志)
|
||
_REQUIRED = "pyproject.toml"
|
||
_AUX_MARKERS = ("CLAUDE.md", ".claude", ".kiro")
|
||
|
||
|
||
def _is_repo_root(p: Path) -> bool:
|
||
if not (p / _REQUIRED).is_file():
|
||
return False
|
||
return any((p / m).exists() for m in _AUX_MARKERS)
|
||
|
||
|
||
def _find_root_from_file(anchor: Path, max_depth: int = 8) -> Path | None:
|
||
"""从给定文件路径向上搜索仓库根。"""
|
||
current = anchor.resolve().parent
|
||
for _ in range(max_depth):
|
||
if _is_repo_root(current):
|
||
return current
|
||
parent = current.parent
|
||
if parent == current:
|
||
break
|
||
current = parent
|
||
return None
|
||
|
||
|
||
def ensure_repo_root() -> Path:
|
||
"""校验并确保 cwd 为仓库根目录。
|
||
|
||
Returns:
|
||
仓库根目录的 Path 对象。
|
||
|
||
Raises:
|
||
RuntimeError: 无法定位仓库根目录。
|
||
"""
|
||
cwd = Path.cwd()
|
||
if _is_repo_root(cwd):
|
||
return cwd
|
||
|
||
# 策略 1:通过 __main__.__file__ 推断(脚本直接运行时可用)
|
||
import __main__
|
||
main_file = getattr(__main__, "__file__", None)
|
||
if main_file:
|
||
root = _find_root_from_file(Path(main_file))
|
||
if root:
|
||
os.chdir(root)
|
||
warnings.warn(
|
||
f"cwd 不是仓库根目录,已自动切换: {cwd} → {root}",
|
||
stacklevel=2,
|
||
)
|
||
return root
|
||
|
||
# 策略 2:通过本文件位置推断(packages/shared/src/neozqyy_shared/repo_root.py)
|
||
root = _find_root_from_file(Path(__file__))
|
||
if root:
|
||
os.chdir(root)
|
||
warnings.warn(
|
||
f"cwd 不是仓库根目录,已自动切换: {cwd} → {root}",
|
||
stacklevel=2,
|
||
)
|
||
return root
|
||
|
||
raise RuntimeError(
|
||
f"无法定位仓库根目录。当前 cwd={cwd}。"
|
||
f"请在仓库根目录下运行脚本。"
|
||
)
|