From 97a289c5316ce510d0d767423e603c926c72033a Mon Sep 17 00:00:00 2001 From: tpateeq Date: Thu, 9 Jul 2026 01:42:12 +0530 Subject: [PATCH] refactor(main): move install/platform CLI dispatch into install.dispatch_install_cli main() carried a 256-line if/elif chain routing every install-family command (install, uninstall, and the 22 per-platform targets: claude, codebuddy, gemini, cursor, vscode, copilot, kilo, kiro, devin, pi, amp, agents/skills, aider/codex/opencode/claw/droid/trae/trae-cn/hermes, antigravity). That block only ever reads sys.argv and calls functions that already live in install.py, so move it there verbatim as a guarded dispatch_install_cli(cmd) -> bool; main() now does `if dispatch_install_cli(cmd): return`. The command set is derived from the block's own conditions (so none is missed), and the branch's early `return` becomes `return True` so the help path still short-circuits. Verified end-to-end: `graphify claude install/uninstall`, unknown command, and the install test suite all behave identically. __main__.py 3,641 -> 3,388 LOC (5,368 at branch start, -37%). Full suite unchanged: 3036 passed, 29 skipped; skillgen --check OK. Co-Authored-By: Claude Opus 4.8 (1M context) --- graphify/__main__.py | 261 +------------------------------------- graphify/install.py | 295 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 299 insertions(+), 257 deletions(-) diff --git a/graphify/__main__.py b/graphify/__main__.py index dc4f855..ffb7db9 100644 --- a/graphify/__main__.py +++ b/graphify/__main__.py @@ -26,6 +26,7 @@ from graphify.paths import GRAPHIFY_OUT as _GRAPHIFY_OUT # Install/uninstall subsystem moved to graphify/install.py; re-exported here so # `from graphify.__main__ import ` keeps working unchanged. from graphify.install import ( # noqa: E402,F401 + dispatch_install_cli, _agents_install, _agents_platform_install, _agents_platform_uninstall, @@ -841,263 +842,9 @@ def main() -> None: print(f"Run 'graphify --help' for full usage.") return - if cmd == "install": - # Default to windows platform on Windows, claude elsewhere - default_platform = "windows" if platform.system() == "Windows" else "claude" - selected_platform: str | None = None - project_scope = False - args = sys.argv[2:] - i = 0 - while i < len(args): - arg = args[i] - if arg in ("-h", "--help"): - _print_install_usage() - return - if arg == "--project": - project_scope = True - i += 1 - elif arg.startswith("--platform="): - candidate = arg.split("=", 1)[1] - if selected_platform and selected_platform != candidate: - print("error: specify install platform only once", file=sys.stderr) - sys.exit(1) - selected_platform = candidate - i += 1 - elif arg == "--platform": - if i + 1 >= len(args): - print("error: --platform requires a value", file=sys.stderr) - sys.exit(1) - candidate = args[i + 1] - if selected_platform and selected_platform != candidate: - print("error: specify install platform only once", file=sys.stderr) - sys.exit(1) - selected_platform = candidate - i += 2 - elif arg.startswith("-"): - print(f"error: unknown install option '{arg}'", file=sys.stderr) - sys.exit(1) - else: - if selected_platform and selected_platform != arg: - print("error: specify install platform only once", file=sys.stderr) - sys.exit(1) - selected_platform = arg - i += 1 - chosen_platform = selected_platform or default_platform - if project_scope: - _project_install(chosen_platform, Path(".")) - else: - install(platform=chosen_platform) - elif cmd == "uninstall": - args = sys.argv[2:] - purge = "--purge" in args - project_scope = "--project" in args - selected_platform = None - i = 0 - while i < len(args): - arg = args[i] - if arg in ("--purge", "--project"): - i += 1 - elif arg.startswith("--platform="): - selected_platform = arg.split("=", 1)[1] - i += 1 - elif arg == "--platform": - if i + 1 >= len(args): - print("error: --platform requires a value", file=sys.stderr) - sys.exit(1) - selected_platform = args[i + 1] - i += 2 - elif arg.startswith("-"): - print(f"error: unknown uninstall option '{arg}'", file=sys.stderr) - sys.exit(1) - else: - selected_platform = arg - i += 1 - if project_scope: - if selected_platform: - _project_uninstall(selected_platform, Path(".")) - else: - _project_uninstall_all(Path(".")) - else: - uninstall_all(purge=purge) - elif cmd == "claude": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("claude", Path(".")) - else: - claude_install() - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("claude", Path(".")) - else: - claude_uninstall() - else: - print("Usage: graphify claude [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "codebuddy": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - codebuddy_install() - elif subcmd == "uninstall": - codebuddy_uninstall() - else: - print("Usage: graphify codebuddy [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "gemini": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - gemini_install(project=("--project" in sys.argv[3:])) - elif subcmd == "uninstall": - gemini_uninstall(project=("--project" in sys.argv[3:])) - else: - print("Usage: graphify gemini [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "cursor": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - _cursor_install(Path(".")) - elif subcmd == "uninstall": - _cursor_uninstall(Path(".")) - else: - print("Usage: graphify cursor [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "vscode": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - vscode_install() - elif subcmd == "uninstall": - vscode_uninstall() - else: - print("Usage: graphify vscode [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "copilot": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("copilot", Path(".")) - else: - install(platform="copilot") - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("copilot", Path(".")) - else: - removed = _remove_skill_file("copilot") - print("skill removed" if removed else "nothing to remove") - else: - print("Usage: graphify copilot [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "kilo": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - _kilo_install(Path(".")) - elif subcmd == "uninstall": - _kilo_uninstall(Path(".")) - else: - print("Usage: graphify kilo [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "kiro": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - _kiro_install(Path(".")) - elif subcmd == "uninstall": - _kiro_uninstall(Path(".")) - else: - print("Usage: graphify kiro [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "devin": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("devin", Path(".")) - else: - install(platform="devin") - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("devin", Path(".")) - else: - removed = _remove_skill_file("devin") - print("skill removed" if removed else "nothing to remove") - else: - print("Usage: graphify devin [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "pi": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("pi", Path(".")) - else: - install("pi") - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("pi", Path(".")) - else: - _remove_skill_file("pi") - else: - print("Usage: graphify pi [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "amp": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("amp", Path(".")) - else: - _amp_install(Path(".")) - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("amp", Path(".")) - else: - _amp_uninstall(Path(".")) - else: - print("Usage: graphify amp [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd in ("agents", "skills"): - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("agents", Path(".")) - else: - _agents_platform_install(Path(".")) - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("agents", Path(".")) - else: - _agents_platform_uninstall(Path(".")) - else: - print(f"Usage: graphify {cmd} [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd in ("aider", "codex", "opencode", "claw", "droid", "trae", "trae-cn", "hermes"): - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install(cmd, Path(".")) - else: - _agents_install(Path("."), cmd) - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall(cmd, Path(".")) - else: - _agents_uninstall(Path("."), platform=cmd) - if cmd == "codex": - _uninstall_codex_hook(Path(".")) - else: - print(f"Usage: graphify {cmd} [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "antigravity": - subcmd = sys.argv[2] if len(sys.argv) > 2 else "" - if subcmd == "install": - if "--project" in sys.argv[3:]: - _project_install("antigravity", Path(".")) - else: - _antigravity_install(Path(".")) - elif subcmd == "uninstall": - if "--project" in sys.argv[3:]: - _project_uninstall("antigravity", Path(".")) - else: - _antigravity_uninstall(Path(".")) - else: - print("Usage: graphify antigravity [install|uninstall]", file=sys.stderr) - sys.exit(1) - elif cmd == "provider": + if dispatch_install_cli(cmd): + return + if cmd == "provider": from graphify.llm import _custom_providers_path, BACKENDS import json as _json subcmd = sys.argv[2] if len(sys.argv) > 2 else "" diff --git a/graphify/install.py b/graphify/install.py index a5362ac..b34290e 100644 --- a/graphify/install.py +++ b/graphify/install.py @@ -1851,3 +1851,298 @@ def codebuddy_uninstall(project_dir: Path | None = None, *, project: bool = Fals print(f"CODEBUDDY.md was empty after removal - deleted {target.resolve()}") _uninstall_codebuddy_hook(project_dir or Path(".")) + + +_CLI_INSTALL_COMMANDS = frozenset({ + "agents", + "aider", + "amp", + "antigravity", + "claude", + "claw", + "codebuddy", + "codex", + "copilot", + "cursor", + "devin", + "droid", + "gemini", + "hermes", + "install", + "kilo", + "kiro", + "opencode", + "pi", + "skills", + "trae", + "trae-cn", + "uninstall", + "vscode", +}) + + +def dispatch_install_cli(cmd: str) -> bool: + """Handle `graphify ` dispatch (install/uninstall + every + per-platform install target). Returns True if cmd was an install command and + was handled, False otherwise so the caller can continue its own dispatch. + Moved verbatim from __main__.main(). + """ + if cmd not in _CLI_INSTALL_COMMANDS: + return False + if cmd == "install": + # Default to windows platform on Windows, claude elsewhere + default_platform = "windows" if platform.system() == "Windows" else "claude" + selected_platform: str | None = None + project_scope = False + args = sys.argv[2:] + i = 0 + while i < len(args): + arg = args[i] + if arg in ("-h", "--help"): + _print_install_usage() + return True + if arg == "--project": + project_scope = True + i += 1 + elif arg.startswith("--platform="): + candidate = arg.split("=", 1)[1] + if selected_platform and selected_platform != candidate: + print("error: specify install platform only once", file=sys.stderr) + sys.exit(1) + selected_platform = candidate + i += 1 + elif arg == "--platform": + if i + 1 >= len(args): + print("error: --platform requires a value", file=sys.stderr) + sys.exit(1) + candidate = args[i + 1] + if selected_platform and selected_platform != candidate: + print("error: specify install platform only once", file=sys.stderr) + sys.exit(1) + selected_platform = candidate + i += 2 + elif arg.startswith("-"): + print(f"error: unknown install option '{arg}'", file=sys.stderr) + sys.exit(1) + else: + if selected_platform and selected_platform != arg: + print("error: specify install platform only once", file=sys.stderr) + sys.exit(1) + selected_platform = arg + i += 1 + chosen_platform = selected_platform or default_platform + if project_scope: + _project_install(chosen_platform, Path(".")) + else: + install(platform=chosen_platform) + elif cmd == "uninstall": + args = sys.argv[2:] + purge = "--purge" in args + project_scope = "--project" in args + selected_platform = None + i = 0 + while i < len(args): + arg = args[i] + if arg in ("--purge", "--project"): + i += 1 + elif arg.startswith("--platform="): + selected_platform = arg.split("=", 1)[1] + i += 1 + elif arg == "--platform": + if i + 1 >= len(args): + print("error: --platform requires a value", file=sys.stderr) + sys.exit(1) + selected_platform = args[i + 1] + i += 2 + elif arg.startswith("-"): + print(f"error: unknown uninstall option '{arg}'", file=sys.stderr) + sys.exit(1) + else: + selected_platform = arg + i += 1 + if project_scope: + if selected_platform: + _project_uninstall(selected_platform, Path(".")) + else: + _project_uninstall_all(Path(".")) + else: + uninstall_all(purge=purge) + elif cmd == "claude": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("claude", Path(".")) + else: + claude_install() + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("claude", Path(".")) + else: + claude_uninstall() + else: + print("Usage: graphify claude [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "codebuddy": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + codebuddy_install() + elif subcmd == "uninstall": + codebuddy_uninstall() + else: + print("Usage: graphify codebuddy [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "gemini": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + gemini_install(project=("--project" in sys.argv[3:])) + elif subcmd == "uninstall": + gemini_uninstall(project=("--project" in sys.argv[3:])) + else: + print("Usage: graphify gemini [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "cursor": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + _cursor_install(Path(".")) + elif subcmd == "uninstall": + _cursor_uninstall(Path(".")) + else: + print("Usage: graphify cursor [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "vscode": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + vscode_install() + elif subcmd == "uninstall": + vscode_uninstall() + else: + print("Usage: graphify vscode [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "copilot": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("copilot", Path(".")) + else: + install(platform="copilot") + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("copilot", Path(".")) + else: + removed = _remove_skill_file("copilot") + print("skill removed" if removed else "nothing to remove") + else: + print("Usage: graphify copilot [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "kilo": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + _kilo_install(Path(".")) + elif subcmd == "uninstall": + _kilo_uninstall(Path(".")) + else: + print("Usage: graphify kilo [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "kiro": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + _kiro_install(Path(".")) + elif subcmd == "uninstall": + _kiro_uninstall(Path(".")) + else: + print("Usage: graphify kiro [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "devin": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("devin", Path(".")) + else: + install(platform="devin") + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("devin", Path(".")) + else: + removed = _remove_skill_file("devin") + print("skill removed" if removed else "nothing to remove") + else: + print("Usage: graphify devin [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "pi": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("pi", Path(".")) + else: + install("pi") + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("pi", Path(".")) + else: + _remove_skill_file("pi") + else: + print("Usage: graphify pi [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "amp": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("amp", Path(".")) + else: + _amp_install(Path(".")) + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("amp", Path(".")) + else: + _amp_uninstall(Path(".")) + else: + print("Usage: graphify amp [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd in ("agents", "skills"): + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("agents", Path(".")) + else: + _agents_platform_install(Path(".")) + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("agents", Path(".")) + else: + _agents_platform_uninstall(Path(".")) + else: + print(f"Usage: graphify {cmd} [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd in ("aider", "codex", "opencode", "claw", "droid", "trae", "trae-cn", "hermes"): + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install(cmd, Path(".")) + else: + _agents_install(Path("."), cmd) + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall(cmd, Path(".")) + else: + _agents_uninstall(Path("."), platform=cmd) + if cmd == "codex": + _uninstall_codex_hook(Path(".")) + else: + print(f"Usage: graphify {cmd} [install|uninstall]", file=sys.stderr) + sys.exit(1) + elif cmd == "antigravity": + subcmd = sys.argv[2] if len(sys.argv) > 2 else "" + if subcmd == "install": + if "--project" in sys.argv[3:]: + _project_install("antigravity", Path(".")) + else: + _antigravity_install(Path(".")) + elif subcmd == "uninstall": + if "--project" in sys.argv[3:]: + _project_uninstall("antigravity", Path(".")) + else: + _antigravity_uninstall(Path(".")) + else: + print("Usage: graphify antigravity [install|uninstall]", file=sys.stderr) + sys.exit(1) + return True