codehydra 2026.1.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,66 @@
1
+ Metadata-Version: 2.4
2
+ Name: codehydra
3
+ Version: 2026.1.13
4
+ Summary: Multi-workspace IDE for parallel AI agent development
5
+ Keywords: ai,agent,ide,vscode,git,worktree
6
+ Author: Stefan Hoelzl
7
+ License-Expression: MIT
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: MacOS
13
+ Classifier: Operating System :: Microsoft :: Windows
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Requires-Python: >=3.10
21
+ Project-URL: Homepage, https://github.com/stefanhoelzl/codehydra
22
+ Project-URL: Issues, https://github.com/stefanhoelzl/codehydra/issues
23
+ Project-URL: Repository, https://github.com/stefanhoelzl/codehydra
24
+ Description-Content-Type: text/markdown
25
+
26
+ # CodeHydra
27
+
28
+ Multi-workspace IDE for parallel AI agent development.
29
+
30
+ ## Installation
31
+
32
+ ```bash
33
+ # Run directly without installation
34
+ uvx codehydra
35
+
36
+ # Or install globally
37
+ pip install codehydra
38
+ codehydra
39
+ ```
40
+
41
+ ## Features
42
+
43
+ - Run multiple AI agents simultaneously in isolated git worktrees
44
+ - Real-time status monitoring across all workspaces
45
+ - Keyboard-driven navigation (Alt+X shortcut mode)
46
+ - Full VS Code integration via code-server
47
+ - Built-in voice dictation
48
+
49
+ ## How It Works
50
+
51
+ This package downloads the appropriate CodeHydra binary for your platform from GitHub Releases on first run, caches it locally, and executes it with any passed arguments.
52
+
53
+ Supported platforms:
54
+
55
+ - Linux x64
56
+ - macOS x64 and arm64
57
+ - Windows x64
58
+
59
+ ## Links
60
+
61
+ - [GitHub Repository](https://github.com/stefanhoelzl/codehydra)
62
+ - [Releases](https://github.com/stefanhoelzl/codehydra/releases)
63
+
64
+ ## License
65
+
66
+ MIT
@@ -0,0 +1,41 @@
1
+ # CodeHydra
2
+
3
+ Multi-workspace IDE for parallel AI agent development.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Run directly without installation
9
+ uvx codehydra
10
+
11
+ # Or install globally
12
+ pip install codehydra
13
+ codehydra
14
+ ```
15
+
16
+ ## Features
17
+
18
+ - Run multiple AI agents simultaneously in isolated git worktrees
19
+ - Real-time status monitoring across all workspaces
20
+ - Keyboard-driven navigation (Alt+X shortcut mode)
21
+ - Full VS Code integration via code-server
22
+ - Built-in voice dictation
23
+
24
+ ## How It Works
25
+
26
+ This package downloads the appropriate CodeHydra binary for your platform from GitHub Releases on first run, caches it locally, and executes it with any passed arguments.
27
+
28
+ Supported platforms:
29
+
30
+ - Linux x64
31
+ - macOS x64 and arm64
32
+ - Windows x64
33
+
34
+ ## Links
35
+
36
+ - [GitHub Repository](https://github.com/stefanhoelzl/codehydra)
37
+ - [Releases](https://github.com/stefanhoelzl/codehydra/releases)
38
+
39
+ ## License
40
+
41
+ MIT
@@ -0,0 +1,35 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.9.23,<0.10"]
3
+ build-backend = "uv_build"
4
+
5
+ [project]
6
+ name = "codehydra"
7
+ version = "2026.1.13"
8
+ description = "Multi-workspace IDE for parallel AI agent development"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ requires-python = ">=3.10"
12
+ authors = [{ name = "Stefan Hoelzl" }]
13
+ keywords = ["ai", "agent", "ide", "vscode", "git", "worktree"]
14
+ classifiers = [
15
+ "Development Status :: 4 - Beta",
16
+ "Environment :: Console",
17
+ "Intended Audience :: Developers",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Operating System :: MacOS",
20
+ "Operating System :: Microsoft :: Windows",
21
+ "Operating System :: POSIX :: Linux",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.10",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Programming Language :: Python :: 3.13",
27
+ ]
28
+
29
+ [project.urls]
30
+ Homepage = "https://github.com/stefanhoelzl/codehydra"
31
+ Repository = "https://github.com/stefanhoelzl/codehydra"
32
+ Issues = "https://github.com/stefanhoelzl/codehydra/issues"
33
+
34
+ [project.scripts]
35
+ codehydra = "codehydra:main"
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env python3
2
+ """CodeHydra launcher for PyPI - Downloads and caches the appropriate binary from GitHub Releases."""
3
+
4
+ import os
5
+ import platform
6
+ import stat
7
+ import subprocess
8
+ import sys
9
+ import zipfile
10
+ from importlib.metadata import version as get_version
11
+ from pathlib import Path
12
+ from urllib.request import Request, urlopen
13
+
14
+ REPO = "stefanhoelzl/codehydra"
15
+
16
+ ASSET_MAP = {
17
+ ("Linux", "x86_64"): "CodeHydra-linux-x64.AppImage",
18
+ ("Darwin", "x86_64"): "CodeHydra-darwin-x64.zip",
19
+ ("Darwin", "arm64"): "CodeHydra-darwin-arm64.zip",
20
+ ("Windows", "AMD64"): "CodeHydra-win-portable-x64.zip",
21
+ }
22
+
23
+
24
+ def get_cache_dir(pkg_version: str) -> Path:
25
+ """Get the platform-specific cache directory."""
26
+ system = platform.system()
27
+ if system == "Linux":
28
+ base = Path(os.environ.get("XDG_DATA_HOME", Path.home() / ".local" / "share"))
29
+ return base / "codehydra" / "releases" / pkg_version
30
+ elif system == "Darwin":
31
+ return Path.home() / "Library" / "Application Support" / "Codehydra" / "releases" / pkg_version
32
+ elif system == "Windows":
33
+ base = Path(os.environ.get("LOCALAPPDATA", Path.home() / "AppData" / "Local"))
34
+ return base / "Codehydra" / "releases" / pkg_version
35
+ raise RuntimeError(f"Unsupported platform: {system}")
36
+
37
+
38
+ def get_asset_name() -> str:
39
+ """Get the GitHub release asset name for the current platform."""
40
+ key = (platform.system(), platform.machine())
41
+ asset = ASSET_MAP.get(key)
42
+ if not asset:
43
+ raise RuntimeError(f"Unsupported platform: {key[0]}-{key[1]}")
44
+ return asset
45
+
46
+
47
+ def get_binary_path(cache_dir: Path, asset_name: str) -> Path:
48
+ """Get the path to the executable binary."""
49
+ system = platform.system()
50
+ if system == "Windows":
51
+ return cache_dir / "CodeHydra-win-portable-x64" / "CodeHydra.exe"
52
+ elif system == "Darwin":
53
+ app_name = asset_name.replace(".zip", "")
54
+ return cache_dir / app_name / "CodeHydra.app" / "Contents" / "MacOS" / "CodeHydra"
55
+ return cache_dir / asset_name
56
+
57
+
58
+ def download(url: str, dest_path: Path, pkg_version: str) -> None:
59
+ """Download a file from URL to destination path."""
60
+ tmp_path = dest_path.with_suffix(dest_path.suffix + ".tmp")
61
+ request = Request(url, headers={"User-Agent": f"codehydra-pypi/{pkg_version}"})
62
+ with urlopen(request) as response:
63
+ with open(tmp_path, "wb") as f:
64
+ while chunk := response.read(8192):
65
+ f.write(chunk)
66
+ tmp_path.rename(dest_path)
67
+
68
+
69
+ def main() -> None:
70
+ """Main entry point for the launcher."""
71
+ pkg_version = get_version("codehydra")
72
+ cache_dir = get_cache_dir(pkg_version)
73
+ asset_name = get_asset_name()
74
+ binary_path = get_binary_path(cache_dir, asset_name)
75
+
76
+ if not binary_path.exists():
77
+ print(f"Downloading CodeHydra {pkg_version}...")
78
+ cache_dir.mkdir(parents=True, exist_ok=True)
79
+
80
+ download_url = f"https://github.com/{REPO}/releases/download/v{pkg_version}/{asset_name}"
81
+ download_path = cache_dir / asset_name
82
+ download(download_url, download_path, pkg_version)
83
+
84
+ if asset_name.endswith(".zip"):
85
+ print("Extracting...")
86
+ with zipfile.ZipFile(download_path, "r") as zf:
87
+ zf.extractall(cache_dir)
88
+ download_path.unlink()
89
+
90
+ if platform.system() != "Windows":
91
+ binary_path.chmod(binary_path.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
92
+
93
+ print("Done!\n")
94
+
95
+ if platform.system() == "Windows":
96
+ sys.exit(subprocess.run([str(binary_path)] + sys.argv[1:]).returncode)
97
+ else:
98
+ os.execv(str(binary_path), [str(binary_path)] + sys.argv[1:])
99
+
100
+
101
+ if __name__ == "__main__":
102
+ main()