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()
|