LEGACY_CLI = re.compile(r"(?<![\w-])gemini\s+(generate|chat|config|mcp)\b")SCAN_SUFFIXES = {".sh", ".bash", ".yml", ".yaml", ".mjs", ".py"}def check_no_legacy_cli() -> str: """EOL 済みの旧 gemini CLI 呼び出しがコードに残っていないか走査する。""" hits = [] for path in REPO_ROOT.rglob("*"): if path.suffix.lower() not in SCAN_SUFFIXES: continue if any(part in {".git", "node_modules", ".next"} for part in path.parts): continue try: text = path.read_text(encoding="utf-8", errors="ignore") except OSError: continue for i, line in enumerate(text.splitlines(), 1): if line.lstrip().startswith("#"): continue # コメント行は除外 if LEGACY_CLI.search(line): hits.append(f"{path.relative_to(REPO_ROOT)}:{i}") if hits: raise Violation( "EOL 済みの旧 Gemini CLI 呼び出しを検出しました: " + ", ".join(hits[:8]) ) return "no legacy CLI"
三つ目は、Interactions API への一本化に向けて「まだ旧 generateContent を直叩きしているコールサイト」を数え、しきい値を超えたら警告として立てる検査です。これは即時の障害ではなく移行の負債なので、FAIL ではなく WARN として扱い、移行の進捗を可視化します。
LEGACY_CALL = re.compile(r"\.generate_content\(|\.generateContent\(")def audit_migration_debt(max_allowed: int = 0) -> str: """旧 generateContent コールサイト数を数え、しきい値超過を WARN する。""" count = 0 sites = [] for path in REPO_ROOT.rglob("*"): if path.suffix.lower() not in {".py", ".ts", ".js", ".mjs"}: continue if any(p in {".git", "node_modules", ".next"} for p in path.parts): continue try: text = path.read_text(encoding="utf-8", errors="ignore") except OSError: continue for i, line in enumerate(text.splitlines(), 1): if LEGACY_CALL.search(line): count += 1 sites.append(f"{path.relative_to(REPO_ROOT)}:{i}") if count > max_allowed: print(f"::warning:: Interactions API 未移行のコールサイト {count} 件 " f"(上限 {max_allowed}): {', '.join(sites[:5])}") return f"migration debt: {count}"