import anyio import argparse import shutil import subprocess import os import sys from pathlib import Path def copy_project_resources(FOLDER_NAME): """ Step 1: Copy .claude, templates, tools to the project directory. """ MAIN_DIR = FOLDER_NAME or "." SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) copy_targets = [ (".claude", "01: .claude already exists or source missing"), ("templates", "01: templates already exists or source missing"), ("tools", "01: tools already exists or source missing"), ] for subdir, error_msg in copy_targets: src = os.path.join(SCRIPT_DIR, subdir) dst = os.path.join(MAIN_DIR, subdir) if not os.path.isdir(dst) and os.path.isdir(src): try: shutil.copytree(src, dst) except Exception as copy_exc: print(f"01: failed to copy {subdir}: {copy_exc}", file=sys.stderr) else: print(error_msg, file=sys.stderr) def clone_github_repo(GITHUB_REPO_URL, repo_name): """ Step 3: Clone the GitHub repository into the repo directory. """ REPO_PARENT = os.path.join(os.getcwd(), "repo") REPO_DIR = os.path.join(REPO_PARENT, repo_name) if repo_name else "" GIT_URL = GITHUB_REPO_URL print(f"03: clone target={GIT_URL} into {REPO_DIR}", file=sys.stderr) os.makedirs(REPO_PARENT, exist_ok=True) if repo_name and os.path.isdir(REPO_DIR): print("03: repo dir already exists: {}".format(REPO_DIR), file=sys.stderr) elif repo_name and GIT_URL: clone_attempts = [ (["git", "clone", "--recurse-submodules", GIT_URL, REPO_DIR], "02: cloned with submodules"), (["git", "clone", "--depth=1", GIT_URL, REPO_DIR], "02: shallow clone ok"), (["git", "clone", GIT_URL, REPO_DIR], None), ] for i, (cmd, success_msg) in enumerate(clone_attempts): if i == 0: print("03: starting git clone with submodules...", file=sys.stderr) elif i == 1: print("03: main clone failed, trying --depth=1", file=sys.stderr) elif i == 2: print("03: shallow clone failed, trying plain clone", file=sys.stderr) try: rc = subprocess.call(cmd) except Exception as e: print(f"03: clone exception: {e}", file=sys.stderr) rc = 1 if rc == 0: if success_msg: print(success_msg, file=sys.stderr) break else: print("03: failed: all clone attempts failed", file=sys.stderr) def prepare_folder_structure(main_dir): """ Prepare the required folder structure for the pipeline under main_dir. Args: main_dir (str): The main project directory where folders will be created. """ print(f"02: preparing folder structure under {main_dir}", file=sys.stderr) dirs_to_make = [ os.path.join(main_dir, "reports"), os.path.join(main_dir, "src", "tools"), os.path.join(main_dir, "tests", "code"), os.path.join(main_dir, "tests", "data"), os.path.join(main_dir, "notebooks"), os.path.join(main_dir, "tests", "results"), os.path.join(main_dir, "tests", "logs"), os.path.join(main_dir, "tests", "summary"), os.path.join(main_dir, "tmp", "inputs"), os.path.join(main_dir, "tmp", "outputs"), ] for d in dirs_to_make: os.makedirs(d, exist_ok=True)