Ctrl K
ComunidadGuías…

scripts/xkb_init.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env python3
"""
XKB 首次設定 — 記下資料放在哪

程式放在哪不用問,腳本自己知道(見 xkb_paths.py)。
要問的只有一件事:卡片、書籤、wiki 這些資料放在哪個資料夾。
答案寫進 skill 目錄下的 .xkb.json,之後所有腳本讀同一份。

Usage:
  python3 scripts/xkb_init.py                     # 互動式
  python3 scripts/xkb_init.py --data-dir /path    # 直接指定
  python3 scripts/xkb_init.py --show              # 只看目前設定
"""
from __future__ import annotations

import argparse
import json
import sys
from datetime import datetime, timezone
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))

import xkb_paths

SUBDIRS = ["cards", "bookmarks", "x-knowledge-base"]


def _describe(data_dir: Path) -> list[str]:
    """回報資料目錄裡有什麼,讓使用者確認自己指到對的地方。"""
    lines = []
    for name in SUBDIRS:
        path = data_dir / name
        if not path.exists():
            lines.append(f"    ❌  {name}/  不存在")
            continue
        if name == "cards":
            count = len(list(path.glob("*.md")))
            lines.append(f"    ✅  {name}/  {count} 張卡片")
        elif name == "x-knowledge-base":
            topics = list((path / "wiki" / "topics").glob("*.md"))
            lines.append(f"    ✅  {name}/  {len(topics)} 個 wiki topic")
        else:
            lines.append(f"    ✅  {name}/")
    return lines


def write_config(data_dir: Path) -> Path:
    config_file = xkb_paths.CONFIG_FILE
    existing = xkb_paths.load_config()
    existing["data_dir"] = str(data_dir)
    existing.setdefault("created", datetime.now(timezone.utc).isoformat())
    existing["updated"] = datetime.now(timezone.utc).isoformat()
    with config_file.open("w", encoding="utf-8") as fh:
        json.dump(existing, fh, ensure_ascii=False, indent=2)
        fh.write("\n")
    return config_file


def show() -> int:
    print(f"skill dir   : {xkb_paths.SKILL_DIR}")
    print(f"設定檔      : {xkb_paths.CONFIG_FILE}"
          f"{'' if xkb_paths.CONFIG_FILE.exists() else '  (尚未建立)'}")
    print(f"資料目錄    : {xkb_paths.DATA_DIR}  (來源:{xkb_paths.DATA_DIR_SOURCE})")
    print()
    for line in _describe(xkb_paths.DATA_DIR):
        print(line)
    return 0


def main() -> int:
    parser = argparse.ArgumentParser(description="XKB first-run setup")
    parser.add_argument("--data-dir", help="資料目錄(cards / bookmarks / wiki 的上層)")
    parser.add_argument("--show", action="store_true", help="只顯示目前設定,不寫入")
    args = parser.parse_args()

    if args.show:
        return show()

    print("XKB 設定")
    print(f"  skill dir : {xkb_paths.SKILL_DIR}  (自動偵測)")
    print()

    default = xkb_paths.DATA_DIR
    if args.data_dir:
        data_dir = Path(args.data_dir).expanduser()
    elif sys.stdin.isatty():
        answer = input(f"  資料目錄 [{default}]: ").strip()
        data_dir = Path(answer).expanduser() if answer else default
    else:
        data_dir = default
        print(f"  資料目錄 : {data_dir}  (非互動模式,使用預設)")

    data_dir = data_dir.resolve()
    print()
    print(f"  資料目錄 : {data_dir}")
    for line in _describe(data_dir):
        print(line)
    print()

    if not data_dir.exists():
        print(f"  ❌  資料目錄不存在:{data_dir}")
        print("      確認路徑是否正確,或先把資料放進去再跑一次。")
        return 1

    missing = [name for name in SUBDIRS if not (data_dir / name).exists()]
    if missing:
        print(f"  ⚠️   缺少 {', '.join(missing)} — 確認這是不是正確的資料目錄。")

    config_file = write_config(data_dir)
    print(f"  ✅  已寫入 {config_file}")
    print()
    print("  下一步:python3 scripts/health_check_pipeline.py")
    return 0


import xkb_usage  # noqa: E402  — 量測誰在跑,見 scripts/xkb_usage.py

if __name__ == "__main__":
    xkb_usage.record(__file__)
    raise SystemExit(main())