vibepod 0.1.0__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.
- vibepod-0.1.0/PKG-INFO +61 -0
- vibepod-0.1.0/PLAN.md +189 -0
- vibepod-0.1.0/README.md +43 -0
- vibepod-0.1.0/pyproject.toml +52 -0
- vibepod-0.1.0/specs/00-INDEX.md +202 -0
- vibepod-0.1.0/specs/01-OVERVIEW.md +157 -0
- vibepod-0.1.0/specs/02-CLI-COMMANDS.md +646 -0
- vibepod-0.1.0/specs/03-PROJECT-STRUCTURE.md +598 -0
- vibepod-0.1.0/specs/04-CONFIGURATION.md +602 -0
- vibepod-0.1.0/specs/05-DOCKER-INTEGRATION.md +604 -0
- vibepod-0.1.0/specs/06-LOGGING-DATASETTE.md +744 -0
- vibepod-0.1.0/specs/07-CICD-WORKFLOWS.md +511 -0
- vibepod-0.1.0/specs/08-INSTALLATION.md +672 -0
- vibepod-0.1.0/specs/09-README.md +230 -0
- vibepod-0.1.0/src/vibepod/__init__.py +3 -0
- vibepod-0.1.0/src/vibepod/cli.py +79 -0
- vibepod-0.1.0/src/vibepod/commands/__init__.py +1 -0
- vibepod-0.1.0/src/vibepod/commands/config.py +58 -0
- vibepod-0.1.0/src/vibepod/commands/list_cmd.py +67 -0
- vibepod-0.1.0/src/vibepod/commands/logs.py +43 -0
- vibepod-0.1.0/src/vibepod/commands/run.py +118 -0
- vibepod-0.1.0/src/vibepod/commands/stop.py +39 -0
- vibepod-0.1.0/src/vibepod/commands/update.py +41 -0
- vibepod-0.1.0/src/vibepod/constants.py +68 -0
- vibepod-0.1.0/src/vibepod/core/__init__.py +1 -0
- vibepod-0.1.0/src/vibepod/core/agents.py +108 -0
- vibepod-0.1.0/src/vibepod/core/config.py +149 -0
- vibepod-0.1.0/src/vibepod/core/docker.py +221 -0
- vibepod-0.1.0/src/vibepod/utils/__init__.py +1 -0
- vibepod-0.1.0/src/vibepod/utils/console.py +23 -0
- vibepod-0.1.0/tests/test_agents.py +24 -0
- vibepod-0.1.0/tests/test_cli.py +21 -0
- vibepod-0.1.0/tests/test_config.py +12 -0
vibepod-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: vibepod
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: One CLI for containerized AI coding agents
|
|
5
|
+
Author: VibePod
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: docker>=7.0.0
|
|
9
|
+
Requires-Dist: platformdirs>=4.0.0
|
|
10
|
+
Requires-Dist: pyyaml>=6.0.0
|
|
11
|
+
Requires-Dist: rich>=13.0.0
|
|
12
|
+
Requires-Dist: typer>=0.12.0
|
|
13
|
+
Provides-Extra: dev
|
|
14
|
+
Requires-Dist: mypy>=1.11.0; extra == 'dev'
|
|
15
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
16
|
+
Requires-Dist: ruff>=0.6.0; extra == 'dev'
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# VibePod
|
|
20
|
+
|
|
21
|
+
VibePod is a unified CLI (`vp`) for running AI coding agents in Docker containers.
|
|
22
|
+
|
|
23
|
+
## Current Status
|
|
24
|
+
|
|
25
|
+
This repository contains an initial v1 implementation with:
|
|
26
|
+
|
|
27
|
+
- `vp run <agent>`
|
|
28
|
+
- `vp stop <agent|--all>`
|
|
29
|
+
- `vp list`
|
|
30
|
+
- `vp logs ui`
|
|
31
|
+
- `vp config show`
|
|
32
|
+
- `vp config path`
|
|
33
|
+
- `vp version`
|
|
34
|
+
|
|
35
|
+
## Image Namespace
|
|
36
|
+
|
|
37
|
+
By default, agent images use the `nezhar` namespace (for example `nezhar/claude-container:latest`).
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
Current defaults are aligned to existing container repos:
|
|
41
|
+
|
|
42
|
+
- `claude` -> `nezhar/claude-container:latest` ([repo](https://github.com/nezhar/claude-container))
|
|
43
|
+
- `gemini` -> `nezhar/gemini-container:latest` ([repo](https://github.com/nezhar/gemini-container))
|
|
44
|
+
- `opencode` -> `nezhar/opencode-cli:latest` ([repo](https://github.com/nezhar/opencode-container))
|
|
45
|
+
- `devstral` -> `nezhar/devstral-cli:latest` ([repo](https://github.com/nezhar/devstral-container))
|
|
46
|
+
- `auggie` -> `nezhar/auggie-cli:latest` ([repo](https://github.com/nezhar/auggie-container))
|
|
47
|
+
- `copilot` -> `nezhar/copilot-cli:latest` ([repo](https://github.com/nezhar/copilot-container))
|
|
48
|
+
- `codex` -> `nezhar/codex-cli:latest` ([repo](https://github.com/nezhar/codex-container))
|
|
49
|
+
|
|
50
|
+
You can override any single image directly:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
VP_IMAGE_CLAUDE=nezhar/claude-container:latest vp run claude
|
|
54
|
+
VP_IMAGE_GEMINI=nezhar/gemini-container:latest vp run gemini
|
|
55
|
+
VP_IMAGE_OPENCODE=nezhar/opencode-cli:latest vp run opencode
|
|
56
|
+
VP_IMAGE_DEVSTRAL=nezhar/devstral-cli:latest vp run devstral
|
|
57
|
+
VP_IMAGE_AUGGIE=nezhar/auggie-cli:latest vp run auggie
|
|
58
|
+
VP_IMAGE_COPILOT=nezhar/copilot-cli:latest vp run copilot
|
|
59
|
+
VP_IMAGE_CODEX=nezhar/codex-cli:latest vp run codex
|
|
60
|
+
VP_DATASETTE_IMAGE=nezhar/opencode-datasette:latest vp logs ui
|
|
61
|
+
```
|
vibepod-0.1.0/PLAN.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# VibePod Implementation Plan
|
|
2
|
+
|
|
3
|
+
## Objective
|
|
4
|
+
|
|
5
|
+
Build a practical v1 of `vp` that unifies running agent CLIs in Docker with a consistent interface, while keeping the initial scope small and reliable.
|
|
6
|
+
|
|
7
|
+
## Guiding Principles
|
|
8
|
+
|
|
9
|
+
- Ship a thin, stable core before broad feature coverage.
|
|
10
|
+
- Keep agent-specific behavior behind adapters.
|
|
11
|
+
- Prefer clear UX and predictable defaults over cleverness.
|
|
12
|
+
- Make all state locations explicit and inspectable.
|
|
13
|
+
|
|
14
|
+
## v1 Scope
|
|
15
|
+
|
|
16
|
+
### In Scope
|
|
17
|
+
|
|
18
|
+
- Project scaffold (`pyproject.toml`, `src/`, `tests/`, basic tooling).
|
|
19
|
+
- Core commands:
|
|
20
|
+
- `vp run <agent>`
|
|
21
|
+
- `vp stop <agent|--all>`
|
|
22
|
+
- `vp list`
|
|
23
|
+
- `vp logs ui`
|
|
24
|
+
- `vp config show`
|
|
25
|
+
- `vp config path`
|
|
26
|
+
- `vp version`
|
|
27
|
+
- Supported agents in registry: `claude`, `gemini`, `opencode`, `devstral`, `auggie`.
|
|
28
|
+
- Docker lifecycle management via Docker SDK (no shelling out to docker CLI).
|
|
29
|
+
- Config loading/merging: defaults + global + project + env overrides.
|
|
30
|
+
- Container labels and naming conventions for reliable discovery.
|
|
31
|
+
|
|
32
|
+
### Out of Scope (Post-v1)
|
|
33
|
+
|
|
34
|
+
- Full `vp auth` flows.
|
|
35
|
+
- Full `vp skills` integration and MCP management.
|
|
36
|
+
- `vp logs query/export/stats`.
|
|
37
|
+
- Auto-update command, installers, and release automation.
|
|
38
|
+
|
|
39
|
+
## Architecture Decisions
|
|
40
|
+
|
|
41
|
+
### 1) Agent Adapter Contract
|
|
42
|
+
|
|
43
|
+
Each agent implements a small adapter interface:
|
|
44
|
+
|
|
45
|
+
- `image(config) -> str`
|
|
46
|
+
- `config_mounts(paths) -> list[MountSpec]`
|
|
47
|
+
- `env(config, runtime) -> dict[str, str]`
|
|
48
|
+
- `command(runtime) -> list[str]`
|
|
49
|
+
- `healthcheck(container) -> AdapterStatus`
|
|
50
|
+
|
|
51
|
+
This keeps `run/stop/list` generic and avoids hardcoding agent quirks.
|
|
52
|
+
|
|
53
|
+
### 2) Container Identity
|
|
54
|
+
|
|
55
|
+
Use both predictable names and labels:
|
|
56
|
+
|
|
57
|
+
- Name: `vibepod-{agent}-{shortid}`
|
|
58
|
+
- Labels:
|
|
59
|
+
- `vibepod.managed=true`
|
|
60
|
+
- `vibepod.agent=<agent>`
|
|
61
|
+
- `vibepod.workspace=<absolute-path>`
|
|
62
|
+
- `vibepod.version=<vp-version>`
|
|
63
|
+
|
|
64
|
+
All operational commands (`list`, `stop`, future logs) discover containers via labels.
|
|
65
|
+
|
|
66
|
+
### 3) Config Paths
|
|
67
|
+
|
|
68
|
+
- Global config dir: `~/.config/vibepod` (platformdirs-backed)
|
|
69
|
+
- Global file: `~/.config/vibepod/config.yaml`
|
|
70
|
+
- Project file: `.vibepod/config.yaml`
|
|
71
|
+
- Env prefix: `VP_`
|
|
72
|
+
|
|
73
|
+
Precedence: env > project > global > defaults.
|
|
74
|
+
|
|
75
|
+
## Milestones
|
|
76
|
+
|
|
77
|
+
## M0 - Repository Bootstrap
|
|
78
|
+
|
|
79
|
+
Deliverables:
|
|
80
|
+
|
|
81
|
+
- `pyproject.toml` with runtime + dev dependencies.
|
|
82
|
+
- Source layout under `src/vibepod`.
|
|
83
|
+
- Test scaffold (`pytest`, basic CLI smoke tests).
|
|
84
|
+
- Lint/format/type config (`ruff`, `mypy`).
|
|
85
|
+
|
|
86
|
+
Acceptance Criteria:
|
|
87
|
+
|
|
88
|
+
- `vp --help` runs locally.
|
|
89
|
+
- `pytest` runs with at least one passing smoke test.
|
|
90
|
+
- `ruff check` and `ruff format --check` pass.
|
|
91
|
+
|
|
92
|
+
## M1 - Core Domain Layer
|
|
93
|
+
|
|
94
|
+
Deliverables:
|
|
95
|
+
|
|
96
|
+
- `constants.py` for defaults and agent metadata.
|
|
97
|
+
- `core/config.py` with merge logic and env overrides.
|
|
98
|
+
- `core/agents.py` with adapter registry and validation.
|
|
99
|
+
- `core/docker.py` wrapper for Docker SDK interactions.
|
|
100
|
+
|
|
101
|
+
Acceptance Criteria:
|
|
102
|
+
|
|
103
|
+
- Unit tests for config merge precedence.
|
|
104
|
+
- Agent lookup validates known/unknown agents.
|
|
105
|
+
- Docker wrapper can detect daemon availability.
|
|
106
|
+
|
|
107
|
+
## M2 - Command MVP
|
|
108
|
+
|
|
109
|
+
Deliverables:
|
|
110
|
+
|
|
111
|
+
- `vp run`, `vp stop`, `vp list`, `vp version`.
|
|
112
|
+
- Common output helpers with Rich.
|
|
113
|
+
- Error-to-exit-code mapping.
|
|
114
|
+
|
|
115
|
+
Acceptance Criteria:
|
|
116
|
+
|
|
117
|
+
- `vp run claude` starts a managed container (when Docker daemon available).
|
|
118
|
+
- `vp list` shows running managed containers with agent + workspace.
|
|
119
|
+
- `vp stop claude` stops the correct container.
|
|
120
|
+
- `vp stop --all` stops all managed containers only.
|
|
121
|
+
|
|
122
|
+
## M3 - Logging UI + Config UX
|
|
123
|
+
|
|
124
|
+
Deliverables:
|
|
125
|
+
|
|
126
|
+
- `vp logs ui` starts/reuses Datasette container.
|
|
127
|
+
- `vp config show` and `vp config path`.
|
|
128
|
+
- Config directory first-run setup.
|
|
129
|
+
|
|
130
|
+
Acceptance Criteria:
|
|
131
|
+
|
|
132
|
+
- `vp logs ui` launches Datasette bound to configured port.
|
|
133
|
+
- `vp config show` displays effective merged config.
|
|
134
|
+
- `vp config path` prints global/project paths consistently across OS.
|
|
135
|
+
|
|
136
|
+
## M4 - Hardening + Docs
|
|
137
|
+
|
|
138
|
+
Deliverables:
|
|
139
|
+
|
|
140
|
+
- Robust error messages and troubleshooting hints.
|
|
141
|
+
- README aligned with actual v1 capabilities.
|
|
142
|
+
- Basic manual test checklist.
|
|
143
|
+
|
|
144
|
+
Acceptance Criteria:
|
|
145
|
+
|
|
146
|
+
- Clear errors for Docker unavailable, image missing, invalid agent.
|
|
147
|
+
- End-to-end smoke tests documented and reproducible.
|
|
148
|
+
|
|
149
|
+
## Work Breakdown (File-by-File)
|
|
150
|
+
|
|
151
|
+
1. `pyproject.toml`
|
|
152
|
+
2. `src/vibepod/__init__.py`
|
|
153
|
+
3. `src/vibepod/constants.py`
|
|
154
|
+
4. `src/vibepod/core/config.py`
|
|
155
|
+
5. `src/vibepod/core/agents.py`
|
|
156
|
+
6. `src/vibepod/core/docker.py`
|
|
157
|
+
7. `src/vibepod/utils/console.py`
|
|
158
|
+
8. `src/vibepod/commands/run.py`
|
|
159
|
+
9. `src/vibepod/commands/stop.py`
|
|
160
|
+
10. `src/vibepod/commands/list.py`
|
|
161
|
+
11. `src/vibepod/commands/logs.py`
|
|
162
|
+
12. `src/vibepod/commands/config.py`
|
|
163
|
+
13. `src/vibepod/commands/update.py` (version command only for v1)
|
|
164
|
+
14. `src/vibepod/cli.py`
|
|
165
|
+
15. `tests/test_cli.py`
|
|
166
|
+
16. `tests/test_config.py`
|
|
167
|
+
17. `tests/test_agents.py`
|
|
168
|
+
|
|
169
|
+
## Risks and Mitigations
|
|
170
|
+
|
|
171
|
+
- Docker SDK behavior differences by platform
|
|
172
|
+
- Mitigation: keep a thin wrapper and centralize exception handling.
|
|
173
|
+
- Agent image runtime differences
|
|
174
|
+
- Mitigation: adapter interface + per-agent env/mount defaults.
|
|
175
|
+
- Config drift as features expand
|
|
176
|
+
- Mitigation: keep schema versioning and add migration hooks early.
|
|
177
|
+
- Logs may contain sensitive content
|
|
178
|
+
- Mitigation: default body logging off; document explicitly.
|
|
179
|
+
|
|
180
|
+
## Definition of Done (v1)
|
|
181
|
+
|
|
182
|
+
- All in-scope commands implemented and documented.
|
|
183
|
+
- Unit tests cover config merge + command routing + agent validation.
|
|
184
|
+
- Manual smoke test passes on Linux/macOS with Docker Desktop/Engine.
|
|
185
|
+
- README reflects only implemented behavior.
|
|
186
|
+
|
|
187
|
+
## Immediate Next Step
|
|
188
|
+
|
|
189
|
+
Start M0 by scaffolding the package and wiring a minimal Typer app that exposes `vp --help` and `vp version`.
|
vibepod-0.1.0/README.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# VibePod
|
|
2
|
+
|
|
3
|
+
VibePod is a unified CLI (`vp`) for running AI coding agents in Docker containers.
|
|
4
|
+
|
|
5
|
+
## Current Status
|
|
6
|
+
|
|
7
|
+
This repository contains an initial v1 implementation with:
|
|
8
|
+
|
|
9
|
+
- `vp run <agent>`
|
|
10
|
+
- `vp stop <agent|--all>`
|
|
11
|
+
- `vp list`
|
|
12
|
+
- `vp logs ui`
|
|
13
|
+
- `vp config show`
|
|
14
|
+
- `vp config path`
|
|
15
|
+
- `vp version`
|
|
16
|
+
|
|
17
|
+
## Image Namespace
|
|
18
|
+
|
|
19
|
+
By default, agent images use the `nezhar` namespace (for example `nezhar/claude-container:latest`).
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Current defaults are aligned to existing container repos:
|
|
23
|
+
|
|
24
|
+
- `claude` -> `nezhar/claude-container:latest` ([repo](https://github.com/nezhar/claude-container))
|
|
25
|
+
- `gemini` -> `nezhar/gemini-container:latest` ([repo](https://github.com/nezhar/gemini-container))
|
|
26
|
+
- `opencode` -> `nezhar/opencode-cli:latest` ([repo](https://github.com/nezhar/opencode-container))
|
|
27
|
+
- `devstral` -> `nezhar/devstral-cli:latest` ([repo](https://github.com/nezhar/devstral-container))
|
|
28
|
+
- `auggie` -> `nezhar/auggie-cli:latest` ([repo](https://github.com/nezhar/auggie-container))
|
|
29
|
+
- `copilot` -> `nezhar/copilot-cli:latest` ([repo](https://github.com/nezhar/copilot-container))
|
|
30
|
+
- `codex` -> `nezhar/codex-cli:latest` ([repo](https://github.com/nezhar/codex-container))
|
|
31
|
+
|
|
32
|
+
You can override any single image directly:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
VP_IMAGE_CLAUDE=nezhar/claude-container:latest vp run claude
|
|
36
|
+
VP_IMAGE_GEMINI=nezhar/gemini-container:latest vp run gemini
|
|
37
|
+
VP_IMAGE_OPENCODE=nezhar/opencode-cli:latest vp run opencode
|
|
38
|
+
VP_IMAGE_DEVSTRAL=nezhar/devstral-cli:latest vp run devstral
|
|
39
|
+
VP_IMAGE_AUGGIE=nezhar/auggie-cli:latest vp run auggie
|
|
40
|
+
VP_IMAGE_COPILOT=nezhar/copilot-cli:latest vp run copilot
|
|
41
|
+
VP_IMAGE_CODEX=nezhar/codex-cli:latest vp run codex
|
|
42
|
+
VP_DATASETTE_IMAGE=nezhar/opencode-datasette:latest vp logs ui
|
|
43
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "vibepod"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "One CLI for containerized AI coding agents"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [{ name = "VibePod" }]
|
|
9
|
+
dependencies = [
|
|
10
|
+
"typer>=0.12.0",
|
|
11
|
+
"rich>=13.0.0",
|
|
12
|
+
"docker>=7.0.0",
|
|
13
|
+
"pyyaml>=6.0.0",
|
|
14
|
+
"platformdirs>=4.0.0",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
[project.optional-dependencies]
|
|
18
|
+
dev = [
|
|
19
|
+
"pytest>=8.0.0",
|
|
20
|
+
"ruff>=0.6.0",
|
|
21
|
+
"mypy>=1.11.0",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
[project.scripts]
|
|
25
|
+
vp = "vibepod.cli:app"
|
|
26
|
+
vibepod = "vibepod.cli:app"
|
|
27
|
+
|
|
28
|
+
[build-system]
|
|
29
|
+
requires = ["hatchling>=1.24.0"]
|
|
30
|
+
build-backend = "hatchling.build"
|
|
31
|
+
|
|
32
|
+
[tool.hatch.build]
|
|
33
|
+
exclude = ["venv", "venv/**"]
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.wheel]
|
|
36
|
+
packages = ["src/vibepod"]
|
|
37
|
+
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
testpaths = ["tests"]
|
|
40
|
+
|
|
41
|
+
[tool.ruff]
|
|
42
|
+
line-length = 100
|
|
43
|
+
target-version = "py310"
|
|
44
|
+
|
|
45
|
+
[tool.ruff.lint]
|
|
46
|
+
select = ["E", "F", "I", "W", "UP", "B"]
|
|
47
|
+
|
|
48
|
+
[tool.mypy]
|
|
49
|
+
python_version = "3.10"
|
|
50
|
+
strict = true
|
|
51
|
+
warn_return_any = true
|
|
52
|
+
warn_unused_ignores = true
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# VibePod Specification Index
|
|
2
|
+
|
|
3
|
+
**Project:** VibePod
|
|
4
|
+
**Domain:** vibepod.dev
|
|
5
|
+
**CLI:** `vp`
|
|
6
|
+
**Version:** 1.0.0
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Document Index
|
|
11
|
+
|
|
12
|
+
| # | Document | Description |
|
|
13
|
+
|---|----------|-------------|
|
|
14
|
+
| 01 | [OVERVIEW.md](01-OVERVIEW.md) | Project overview, goals, architecture |
|
|
15
|
+
| 02 | [CLI-COMMANDS.md](02-CLI-COMMANDS.md) | Complete CLI reference |
|
|
16
|
+
| 03 | [PROJECT-STRUCTURE.md](03-PROJECT-STRUCTURE.md) | Python project structure, pyproject.toml |
|
|
17
|
+
| 04 | [CONFIGURATION.md](04-CONFIGURATION.md) | Config files, schema, management |
|
|
18
|
+
| 05 | [DOCKER-INTEGRATION.md](05-DOCKER-INTEGRATION.md) | Docker SDK, containers, volumes |
|
|
19
|
+
| 06 | [LOGGING-DATASETTE.md](06-LOGGING-DATASETTE.md) | SQLite logging, Datasette UI |
|
|
20
|
+
| 07 | [CICD-WORKFLOWS.md](07-CICD-WORKFLOWS.md) | GitHub Actions, releases |
|
|
21
|
+
| 08 | [INSTALLATION.md](08-INSTALLATION.md) | Install scripts, Homebrew |
|
|
22
|
+
| 09 | [README.md](09-README.md) | Repository README template |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Quick Reference
|
|
27
|
+
|
|
28
|
+
### Brand Assets
|
|
29
|
+
|
|
30
|
+
| Asset | Value |
|
|
31
|
+
|-------|-------|
|
|
32
|
+
| Domain | vibepod.dev |
|
|
33
|
+
| GitHub Org | github.com/VibePod |
|
|
34
|
+
| Docker Hub | hub.docker.com/u/vibepod |
|
|
35
|
+
| X/Twitter | @vibepod_dev |
|
|
36
|
+
| Discord | (server created) |
|
|
37
|
+
|
|
38
|
+
### Repositories
|
|
39
|
+
|
|
40
|
+
| Repository | Purpose |
|
|
41
|
+
|------------|---------|
|
|
42
|
+
| `VibePod/vibepod` | Main CLI (Python/Typer) |
|
|
43
|
+
| `VibePod/docs` | Documentation site |
|
|
44
|
+
| `VibePod/skills` | Official skills |
|
|
45
|
+
| `nezhar/claude-container` | → `vibepod/claude` |
|
|
46
|
+
| `nezhar/gemini-container` | → `vibepod/gemini` |
|
|
47
|
+
| `nezhar/opencode-container` | → `vibepod/opencode` |
|
|
48
|
+
| `nezhar/devstral-container` | → `vibepod/devstral` |
|
|
49
|
+
| `nezhar/auggie-container` | → `vibepod/auggie` |
|
|
50
|
+
|
|
51
|
+
### Tech Stack
|
|
52
|
+
|
|
53
|
+
| Component | Technology |
|
|
54
|
+
|-----------|------------|
|
|
55
|
+
| Language | Python 3.10+ |
|
|
56
|
+
| CLI Framework | Typer |
|
|
57
|
+
| Docker | docker-py SDK |
|
|
58
|
+
| Config | YAML (PyYAML) |
|
|
59
|
+
| Output | Rich |
|
|
60
|
+
| Skills | AGENTS.lock |
|
|
61
|
+
| Logging | SQLite + Datasette |
|
|
62
|
+
| CI/CD | GitHub Actions |
|
|
63
|
+
| Package | PyPI + PyInstaller binaries |
|
|
64
|
+
|
|
65
|
+
### Docker Images
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
vibepod/claude
|
|
69
|
+
vibepod/gemini
|
|
70
|
+
vibepod/opencode
|
|
71
|
+
vibepod/devstral
|
|
72
|
+
vibepod/auggie
|
|
73
|
+
vibepod/datasette
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Core Commands
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
vp run <agent> # Start agent
|
|
80
|
+
vp stop --all # Stop all
|
|
81
|
+
vp list # List agents
|
|
82
|
+
vp logs ui # Datasette
|
|
83
|
+
vp skills sync # AGENTS.lock
|
|
84
|
+
vp config show # Configuration
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Aliases
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
vp c # → vp run claude
|
|
91
|
+
vp g # → vp run gemini
|
|
92
|
+
vp o # → vp run opencode
|
|
93
|
+
vp d # → vp run devstral
|
|
94
|
+
vp a # → vp run auggie
|
|
95
|
+
vp ui # → vp logs ui
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Implementation Checklist
|
|
101
|
+
|
|
102
|
+
### Phase 1: Core CLI
|
|
103
|
+
|
|
104
|
+
- [ ] Project setup (pyproject.toml, structure)
|
|
105
|
+
- [ ] Basic CLI with Typer
|
|
106
|
+
- [ ] `vp run` command
|
|
107
|
+
- [ ] `vp stop` command
|
|
108
|
+
- [ ] `vp list` command
|
|
109
|
+
- [ ] Docker integration
|
|
110
|
+
- [ ] Configuration loading
|
|
111
|
+
- [ ] Aliases support
|
|
112
|
+
|
|
113
|
+
### Phase 2: Skills & Logging
|
|
114
|
+
|
|
115
|
+
- [ ] AGENTS.lock integration (`vp skills`)
|
|
116
|
+
- [ ] SQLite logging
|
|
117
|
+
- [ ] Datasette container (`vp logs ui`)
|
|
118
|
+
- [ ] `vp logs stats` command
|
|
119
|
+
|
|
120
|
+
### Phase 3: Polish
|
|
121
|
+
|
|
122
|
+
- [ ] `vp auth` commands
|
|
123
|
+
- [ ] Shell completions
|
|
124
|
+
- [ ] Error handling
|
|
125
|
+
- [ ] Tests
|
|
126
|
+
- [ ] Documentation
|
|
127
|
+
|
|
128
|
+
### Phase 4: Release
|
|
129
|
+
|
|
130
|
+
- [ ] GitHub Actions workflows
|
|
131
|
+
- [ ] PyPI publishing
|
|
132
|
+
- [ ] Binary builds
|
|
133
|
+
- [ ] Install scripts
|
|
134
|
+
- [ ] Homebrew formula
|
|
135
|
+
- [ ] vibepod.dev website
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Development Commands
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Setup
|
|
143
|
+
git clone https://github.com/VibePod/vibepod
|
|
144
|
+
cd vibepod
|
|
145
|
+
pip install -e ".[dev]"
|
|
146
|
+
|
|
147
|
+
# Development
|
|
148
|
+
pytest # Run tests
|
|
149
|
+
ruff check src tests # Lint
|
|
150
|
+
ruff format src tests # Format
|
|
151
|
+
mypy src # Type check
|
|
152
|
+
|
|
153
|
+
# Build
|
|
154
|
+
python -m build # Build package
|
|
155
|
+
pyinstaller ... # Build binary
|
|
156
|
+
|
|
157
|
+
# Release
|
|
158
|
+
git tag v1.0.0
|
|
159
|
+
git push --tags # Triggers CI release
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## External Dependencies
|
|
165
|
+
|
|
166
|
+
| Package | Version | Purpose |
|
|
167
|
+
|---------|---------|---------|
|
|
168
|
+
| typer | >=0.12.0 | CLI framework |
|
|
169
|
+
| docker | >=7.0.0 | Docker SDK |
|
|
170
|
+
| pyyaml | >=6.0 | Config parsing |
|
|
171
|
+
| rich | >=13.0 | Terminal output |
|
|
172
|
+
| platformdirs | >=4.0 | Cross-platform paths |
|
|
173
|
+
| agentslock | >=0.1.0 | AGENTS.lock integration |
|
|
174
|
+
| httpx | >=0.27.0 | HTTP client |
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Notes for Claude Code
|
|
179
|
+
|
|
180
|
+
When building VibePod:
|
|
181
|
+
|
|
182
|
+
1. **Start with project structure** - Create pyproject.toml and directory layout first
|
|
183
|
+
2. **Build incrementally** - Get `vp run claude` working before adding other features
|
|
184
|
+
3. **Test Docker early** - Ensure Docker SDK works before building commands
|
|
185
|
+
4. **Use the specs** - Reference these documents for implementation details
|
|
186
|
+
5. **Keep it simple** - Python readability over performance
|
|
187
|
+
|
|
188
|
+
The specs are designed to be self-contained. Each document has enough detail to implement that component.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Questions?
|
|
193
|
+
|
|
194
|
+
If anything is unclear in these specs, the intent is:
|
|
195
|
+
|
|
196
|
+
- **Simple over complex** - Choose the straightforward solution
|
|
197
|
+
- **Python conventions** - Follow standard Python patterns
|
|
198
|
+
- **Docker SDK** - Use docker-py, not subprocess
|
|
199
|
+
- **Typer patterns** - Follow Typer's recommended CLI structure
|
|
200
|
+
- **YAML config** - Simple, readable configuration
|
|
201
|
+
|
|
202
|
+
Good luck building VibePod! 🎵
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# VibePod Specification
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0.0
|
|
4
|
+
**Date:** February 2026
|
|
5
|
+
**Language:** Python 3.10+
|
|
6
|
+
**CLI Framework:** Typer
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Project Overview
|
|
11
|
+
|
|
12
|
+
VibePod is a unified CLI tool for running AI coding agents in isolated Docker containers.
|
|
13
|
+
|
|
14
|
+
### Goals
|
|
15
|
+
|
|
16
|
+
1. **Unified interface** - One CLI (`vp`) for all agents
|
|
17
|
+
2. **Container isolation** - Each agent runs in Docker
|
|
18
|
+
3. **Skills management** - Via AGENTS.lock integration
|
|
19
|
+
4. **API logging** - Datasette-powered analytics
|
|
20
|
+
5. **Cross-platform** - macOS, Linux, Windows
|
|
21
|
+
|
|
22
|
+
### Non-Goals
|
|
23
|
+
|
|
24
|
+
- Building the container images (handled by nezhar/*-container repos)
|
|
25
|
+
- Replacing AGENTS.lock (we integrate, not reimplement)
|
|
26
|
+
- Performance optimization (readability over speed)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Brand Assets
|
|
31
|
+
|
|
32
|
+
| Platform | Namespace | Status |
|
|
33
|
+
|----------|-----------|--------|
|
|
34
|
+
| Domain | vibepod.dev | ✅ |
|
|
35
|
+
| GitHub | github.com/VibePod | ✅ |
|
|
36
|
+
| Docker Hub | hub.docker.com/u/vibepod | ✅ |
|
|
37
|
+
| X/Twitter | @vibepod_dev | ✅ |
|
|
38
|
+
| Discord | VibePod server | ✅ |
|
|
39
|
+
| Bluesky | @vibepod.dev (via DNS) | 🔒 |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Architecture
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
47
|
+
│ User │
|
|
48
|
+
│ │ │
|
|
49
|
+
│ ▼ │
|
|
50
|
+
│ ┌───────────┐ │
|
|
51
|
+
│ │ vp CLI │ (Python/Typer) │
|
|
52
|
+
│ └─────┬─────┘ │
|
|
53
|
+
│ │ │
|
|
54
|
+
│ ┌───────────────┼───────────────┐ │
|
|
55
|
+
│ ▼ ▼ ▼ │
|
|
56
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
57
|
+
│ │ Docker │ │ AGENTS. │ │ Datasette │ │
|
|
58
|
+
│ │ SDK │ │ lock │ │ (logging) │ │
|
|
59
|
+
│ │ (Python) │ │ (Python) │ │ (Python) │ │
|
|
60
|
+
│ └──────┬──────┘ └─────────────┘ └─────────────┘ │
|
|
61
|
+
│ │ │
|
|
62
|
+
│ ▼ │
|
|
63
|
+
│ ┌─────────────────────────────────────────────┐ │
|
|
64
|
+
│ │ Docker Hub: vibepod/* │ │
|
|
65
|
+
│ │ │ │
|
|
66
|
+
│ │ vibepod/claude vibepod/gemini │ │
|
|
67
|
+
│ │ vibepod/opencode vibepod/devstral │ │
|
|
68
|
+
│ │ vibepod/auggie vibepod/datasette │ │
|
|
69
|
+
│ └─────────────────────────────────────────────┘ │
|
|
70
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Repository Structure
|
|
76
|
+
|
|
77
|
+
### VibePod Organization
|
|
78
|
+
|
|
79
|
+
| Repository | Purpose |
|
|
80
|
+
|------------|---------|
|
|
81
|
+
| `VibePod/vibepod` | Main CLI tool (this spec) |
|
|
82
|
+
| `VibePod/docs` | Documentation site (vibepod.dev) |
|
|
83
|
+
| `VibePod/skills` | Official skills collection |
|
|
84
|
+
|
|
85
|
+
### Container Repositories
|
|
86
|
+
|
|
87
|
+
| Repository | Docker Image |
|
|
88
|
+
|------------|--------------|
|
|
89
|
+
| `nezhar/claude-container` | `vibepod/claude` |
|
|
90
|
+
| `nezhar/gemini-container` | `vibepod/gemini` |
|
|
91
|
+
| `nezhar/opencode-container` | `vibepod/opencode` |
|
|
92
|
+
| `nezhar/devstral-container` | `vibepod/devstral` |
|
|
93
|
+
| `nezhar/auggie-container` | `vibepod/auggie` |
|
|
94
|
+
|
|
95
|
+
### External Dependencies
|
|
96
|
+
|
|
97
|
+
| Package | Purpose |
|
|
98
|
+
|---------|---------|
|
|
99
|
+
| `luml-ai/AGENTS.lock` | Skills & config sync |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Supported Agents
|
|
104
|
+
|
|
105
|
+
| Agent | Provider | Image | Config Dir |
|
|
106
|
+
|-------|----------|-------|------------|
|
|
107
|
+
| claude | Anthropic | `vibepod/claude` | `~/.config/vibepod/agents/claude` |
|
|
108
|
+
| gemini | Google | `vibepod/gemini` | `~/.config/vibepod/agents/gemini` |
|
|
109
|
+
| opencode | OpenAI | `vibepod/opencode` | `~/.config/vibepod/agents/opencode` |
|
|
110
|
+
| devstral | Mistral | `vibepod/devstral` | `~/.config/vibepod/agents/devstral` |
|
|
111
|
+
| auggie | Augment | `vibepod/auggie` | `~/.config/vibepod/agents/auggie` |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Installation Methods
|
|
116
|
+
|
|
117
|
+
### Primary: pipx
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
pipx install vibepod
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Secondary: pip
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
pip install vibepod
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Tertiary: Binary (via PyInstaller)
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# macOS/Linux
|
|
133
|
+
curl -fsSL https://vibepod.dev/install.sh | bash
|
|
134
|
+
|
|
135
|
+
# Windows
|
|
136
|
+
irm https://vibepod.dev/install.ps1 | iex
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Development
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git clone https://github.com/VibePod/vibepod
|
|
143
|
+
cd vibepod
|
|
144
|
+
pip install -e ".[dev]"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Links
|
|
150
|
+
|
|
151
|
+
| Resource | URL |
|
|
152
|
+
|----------|-----|
|
|
153
|
+
| Website | https://vibepod.dev |
|
|
154
|
+
| GitHub | https://github.com/VibePod/vibepod |
|
|
155
|
+
| Docker Hub | https://hub.docker.com/u/vibepod |
|
|
156
|
+
| PyPI | https://pypi.org/project/vibepod |
|
|
157
|
+
| AGENTS.lock | https://github.com/luml-ai/AGENTS.lock |
|