agent-box-tool 1.0.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.
- agent_box_tool-1.0.0/AGENTS.md +174 -0
- agent_box_tool-1.0.0/CHANGELOG.md +25 -0
- agent_box_tool-1.0.0/LICENSE +21 -0
- agent_box_tool-1.0.0/MANIFEST.in +4 -0
- agent_box_tool-1.0.0/PKG-INFO +166 -0
- agent_box_tool-1.0.0/README.md +142 -0
- agent_box_tool-1.0.0/agent_box/.containerignore +2 -0
- agent_box_tool-1.0.0/agent_box/Containerfile +798 -0
- agent_box_tool-1.0.0/agent_box/__init__.py +1 -0
- agent_box_tool-1.0.0/agent_box/__main__.py +8 -0
- agent_box_tool-1.0.0/agent_box/agent_profiles.py +152 -0
- agent_box_tool-1.0.0/agent_box/api_models.py +151 -0
- agent_box_tool-1.0.0/agent_box/atomicio.py +38 -0
- agent_box_tool-1.0.0/agent_box/branch_cleanup.py +267 -0
- agent_box_tool-1.0.0/agent_box/channel.py +271 -0
- agent_box_tool-1.0.0/agent_box/claude_settings.py +234 -0
- agent_box_tool-1.0.0/agent_box/cli.py +1066 -0
- agent_box_tool-1.0.0/agent_box/cloud.py +248 -0
- agent_box_tool-1.0.0/agent_box/codex_settings.py +57 -0
- agent_box_tool-1.0.0/agent_box/completion.bash +68 -0
- agent_box_tool-1.0.0/agent_box/completion.py +251 -0
- agent_box_tool-1.0.0/agent_box/completion.zsh +55 -0
- agent_box_tool-1.0.0/agent_box/config.py +1516 -0
- agent_box_tool-1.0.0/agent_box/config_menu.py +1426 -0
- agent_box_tool-1.0.0/agent_box/config_proposal.py +82 -0
- agent_box_tool-1.0.0/agent_box/container-launcher +9 -0
- agent_box_tool-1.0.0/agent_box/delegation.py +115 -0
- agent_box_tool-1.0.0/agent_box/errors.py +2 -0
- agent_box_tool-1.0.0/agent_box/external_config.py +382 -0
- agent_box_tool-1.0.0/agent_box/external_launch.py +385 -0
- agent_box_tool-1.0.0/agent_box/git_workflow.py +544 -0
- agent_box_tool-1.0.0/agent_box/github_review.py +529 -0
- agent_box_tool-1.0.0/agent_box/github_workflow.py +343 -0
- agent_box_tool-1.0.0/agent_box/host_podman.py +229 -0
- agent_box_tool-1.0.0/agent_box/host_session.py +22 -0
- agent_box_tool-1.0.0/agent_box/identity.py +72 -0
- agent_box_tool-1.0.0/agent_box/k3s.py +417 -0
- agent_box_tool-1.0.0/agent_box/keeper.sh +47 -0
- agent_box_tool-1.0.0/agent_box/kubeconfigs.py +268 -0
- agent_box_tool-1.0.0/agent_box/launch_options.py +299 -0
- agent_box_tool-1.0.0/agent_box/links.py +612 -0
- agent_box_tool-1.0.0/agent_box/local_workflow.py +94 -0
- agent_box_tool-1.0.0/agent_box/migrations.py +164 -0
- agent_box_tool-1.0.0/agent_box/model_catalog.py +116 -0
- agent_box_tool-1.0.0/agent_box/mounts.py +120 -0
- agent_box_tool-1.0.0/agent_box/nested_podman.py +127 -0
- agent_box_tool-1.0.0/agent_box/notify.py +690 -0
- agent_box_tool-1.0.0/agent_box/paths.py +210 -0
- agent_box_tool-1.0.0/agent_box/plan_sync.py +205 -0
- agent_box_tool-1.0.0/agent_box/podman_doctor.py +87 -0
- agent_box_tool-1.0.0/agent_box/project_config.py +185 -0
- agent_box_tool-1.0.0/agent_box/provider_runner.py +435 -0
- agent_box_tool-1.0.0/agent_box/registries.py +456 -0
- agent_box_tool-1.0.0/agent_box/remote_control.py +446 -0
- agent_box_tool-1.0.0/agent_box/repo_binding.py +247 -0
- agent_box_tool-1.0.0/agent_box/review_results.py +217 -0
- agent_box_tool-1.0.0/agent_box/routing.py +58 -0
- agent_box_tool-1.0.0/agent_box/runtime.py +3706 -0
- agent_box_tool-1.0.0/agent_box/runtime_bundle.py +50 -0
- agent_box_tool-1.0.0/agent_box/selftest.py +170 -0
- agent_box_tool-1.0.0/agent_box/sessions.py +83 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-adopt/SKILL.md +17 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-config/SKILL.md +19 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-interview/SKILL.md +14 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-land/SKILL.md +17 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-normalize/SKILL.md +12 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-plan/SKILL.md +13 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-pr/SKILL.md +18 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-review/SKILL.md +17 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-setup/SKILL.md +13 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-sync/SKILL.md +19 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-tracker/SKILL.md +31 -0
- agent_box_tool-1.0.0/agent_box/skills/ab-work/SKILL.md +17 -0
- agent_box_tool-1.0.0/agent_box/speed.py +29 -0
- agent_box_tool-1.0.0/agent_box/statusline.py +142 -0
- agent_box_tool-1.0.0/agent_box/tmux.conf +34 -0
- agent_box_tool-1.0.0/agent_box/tracker/__init__.py +1 -0
- agent_box_tool-1.0.0/agent_box/tracker/adoption.py +314 -0
- agent_box_tool-1.0.0/agent_box/tracker/audit.py +133 -0
- agent_box_tool-1.0.0/agent_box/tracker/cli.py +502 -0
- agent_box_tool-1.0.0/agent_box/tracker/core.py +250 -0
- agent_box_tool-1.0.0/agent_box/tracker/extensions.py +162 -0
- agent_box_tool-1.0.0/agent_box/tracker/github.py +721 -0
- agent_box_tool-1.0.0/agent_box/tracker/github_api.py +388 -0
- agent_box_tool-1.0.0/agent_box/tracker/github_extensions.py +35 -0
- agent_box_tool-1.0.0/agent_box/tracker/registry.py +46 -0
- agent_box_tool-1.0.0/agent_box/tracker/vikunja.py +624 -0
- agent_box_tool-1.0.0/agent_box/tracker/vikunja_api.py +1370 -0
- agent_box_tool-1.0.0/agent_box/tracker/vikunja_clone.py +212 -0
- agent_box_tool-1.0.0/agent_box/tracker/vikunja_relations.py +100 -0
- agent_box_tool-1.0.0/agent_box/upgrades.py +70 -0
- agent_box_tool-1.0.0/agent_box/usage.py +528 -0
- agent_box_tool-1.0.0/agent_box/usage_auth.py +125 -0
- agent_box_tool-1.0.0/agent_box/workflow.py +1851 -0
- agent_box_tool-1.0.0/agent_box/workflow_state.py +43 -0
- agent_box_tool-1.0.0/agent_box/workspace.py +77 -0
- agent_box_tool-1.0.0/agent_box/workspaces.py +262 -0
- agent_box_tool-1.0.0/agent_box_tool.egg-info/PKG-INFO +166 -0
- agent_box_tool-1.0.0/agent_box_tool.egg-info/SOURCES.txt +257 -0
- agent_box_tool-1.0.0/agent_box_tool.egg-info/dependency_links.txt +1 -0
- agent_box_tool-1.0.0/agent_box_tool.egg-info/entry_points.txt +2 -0
- agent_box_tool-1.0.0/agent_box_tool.egg-info/top_level.txt +1 -0
- agent_box_tool-1.0.0/docs/README.md +34 -0
- agent_box_tool-1.0.0/docs/compatibility.md +98 -0
- agent_box_tool-1.0.0/docs/configuration.md +214 -0
- agent_box_tool-1.0.0/docs/design/integrations.md +183 -0
- agent_box_tool-1.0.0/docs/design/native-launch.md +87 -0
- agent_box_tool-1.0.0/docs/design/third-party-notices.md +81 -0
- agent_box_tool-1.0.0/docs/design/tracker.md +184 -0
- agent_box_tool-1.0.0/docs/design/workflow-references.md +141 -0
- agent_box_tool-1.0.0/docs/design/workflow.md +342 -0
- agent_box_tool-1.0.0/docs/image.md +59 -0
- agent_box_tool-1.0.0/docs/installation.md +153 -0
- agent_box_tool-1.0.0/docs/integrations/README.md +31 -0
- agent_box_tool-1.0.0/docs/integrations/audio.md +42 -0
- agent_box_tool-1.0.0/docs/integrations/browser.md +164 -0
- agent_box_tool-1.0.0/docs/integrations/cloud-profiles.md +103 -0
- agent_box_tool-1.0.0/docs/integrations/external-providers.md +314 -0
- agent_box_tool-1.0.0/docs/integrations/git.md +57 -0
- agent_box_tool-1.0.0/docs/integrations/k3s.md +200 -0
- agent_box_tool-1.0.0/docs/integrations/kubeconfigs.md +108 -0
- agent_box_tool-1.0.0/docs/integrations/links.md +136 -0
- agent_box_tool-1.0.0/docs/integrations/registries.md +65 -0
- agent_box_tool-1.0.0/docs/integrations/remote-control.md +52 -0
- agent_box_tool-1.0.0/docs/integrations/skills.md +27 -0
- agent_box_tool-1.0.0/docs/integrations/telegram.md +74 -0
- agent_box_tool-1.0.0/docs/integrations/tracker.md +240 -0
- agent_box_tool-1.0.0/docs/integrations/workflow.md +306 -0
- agent_box_tool-1.0.0/docs/nested-podman.md +118 -0
- agent_box_tool-1.0.0/docs/releasing.md +101 -0
- agent_box_tool-1.0.0/docs/security.md +50 -0
- agent_box_tool-1.0.0/docs/troubleshooting.md +58 -0
- agent_box_tool-1.0.0/docs/usage.md +218 -0
- agent_box_tool-1.0.0/pyproject.toml +41 -0
- agent_box_tool-1.0.0/setup.cfg +4 -0
- agent_box_tool-1.0.0/tests/__init__.py +0 -0
- agent_box_tool-1.0.0/tests/api_model_samples/anthropic-page1.json +56 -0
- agent_box_tool-1.0.0/tests/api_model_samples/anthropic-page2.json +56 -0
- agent_box_tool-1.0.0/tests/api_model_samples/deepseek.json +60 -0
- agent_box_tool-1.0.0/tests/api_model_samples/openai.json +17 -0
- agent_box_tool-1.0.0/tests/api_model_samples/openrouter.json +215 -0
- agent_box_tool-1.0.0/tests/fixtures/compatibility/1.0.0/config.json +7 -0
- agent_box_tool-1.0.0/tests/fixtures/compatibility/1.0.0/import-state.json +7 -0
- agent_box_tool-1.0.0/tests/fixtures/compatibility/1.0.0/project.json +5 -0
- agent_box_tool-1.0.0/tests/fixtures/compatibility/1.0.0/review-budget.json +10 -0
- agent_box_tool-1.0.0/tests/github_fixtures.py +357 -0
- agent_box_tool-1.0.0/tests/live_github_tracker.py +107 -0
- agent_box_tool-1.0.0/tests/live_vikunja_adoption.py +177 -0
- agent_box_tool-1.0.0/tests/run_suite.py +72 -0
- agent_box_tool-1.0.0/tests/smoke_browser.py +141 -0
- agent_box_tool-1.0.0/tests/smoke_codex_sandbox.py +72 -0
- agent_box_tool-1.0.0/tests/test_agent_profiles.py +224 -0
- agent_box_tool-1.0.0/tests/test_agent_tree_mounts.py +230 -0
- agent_box_tool-1.0.0/tests/test_api_models.py +177 -0
- agent_box_tool-1.0.0/tests/test_apply.py +326 -0
- agent_box_tool-1.0.0/tests/test_audio.py +100 -0
- agent_box_tool-1.0.0/tests/test_branch_cleanup.py +1069 -0
- agent_box_tool-1.0.0/tests/test_browser.py +495 -0
- agent_box_tool-1.0.0/tests/test_claude_channel.py +646 -0
- agent_box_tool-1.0.0/tests/test_claude_settings.py +330 -0
- agent_box_tool-1.0.0/tests/test_cli.py +306 -0
- agent_box_tool-1.0.0/tests/test_cloud.py +246 -0
- agent_box_tool-1.0.0/tests/test_codex_settings.py +88 -0
- agent_box_tool-1.0.0/tests/test_completion.py +363 -0
- agent_box_tool-1.0.0/tests/test_config.py +352 -0
- agent_box_tool-1.0.0/tests/test_config_ai.py +124 -0
- agent_box_tool-1.0.0/tests/test_config_describe.py +212 -0
- agent_box_tool-1.0.0/tests/test_config_menu.py +990 -0
- agent_box_tool-1.0.0/tests/test_config_proposal.py +190 -0
- agent_box_tool-1.0.0/tests/test_config_set.py +113 -0
- agent_box_tool-1.0.0/tests/test_containerfile.py +417 -0
- agent_box_tool-1.0.0/tests/test_docs_links.py +294 -0
- agent_box_tool-1.0.0/tests/test_expand_user_paths.py +92 -0
- agent_box_tool-1.0.0/tests/test_external_config.py +277 -0
- agent_box_tool-1.0.0/tests/test_external_launch.py +376 -0
- agent_box_tool-1.0.0/tests/test_external_models.py +474 -0
- agent_box_tool-1.0.0/tests/test_external_workflow.py +156 -0
- agent_box_tool-1.0.0/tests/test_git_credentials.py +208 -0
- agent_box_tool-1.0.0/tests/test_github_review.py +726 -0
- agent_box_tool-1.0.0/tests/test_github_workflow.py +643 -0
- agent_box_tool-1.0.0/tests/test_host_exposure.py +307 -0
- agent_box_tool-1.0.0/tests/test_host_home.py +174 -0
- agent_box_tool-1.0.0/tests/test_host_podman.py +187 -0
- agent_box_tool-1.0.0/tests/test_host_sessions.py +421 -0
- agent_box_tool-1.0.0/tests/test_identity.py +55 -0
- agent_box_tool-1.0.0/tests/test_image_tools.py +136 -0
- agent_box_tool-1.0.0/tests/test_k3s.py +480 -0
- agent_box_tool-1.0.0/tests/test_k3s_runtime.py +289 -0
- agent_box_tool-1.0.0/tests/test_kubeconfigs.py +352 -0
- agent_box_tool-1.0.0/tests/test_launch_options.py +245 -0
- agent_box_tool-1.0.0/tests/test_links.py +462 -0
- agent_box_tool-1.0.0/tests/test_local_workflow.py +906 -0
- agent_box_tool-1.0.0/tests/test_managed_skills.py +311 -0
- agent_box_tool-1.0.0/tests/test_migrations.py +243 -0
- agent_box_tool-1.0.0/tests/test_model_catalog.py +187 -0
- agent_box_tool-1.0.0/tests/test_mounts.py +116 -0
- agent_box_tool-1.0.0/tests/test_nested_launch.py +177 -0
- agent_box_tool-1.0.0/tests/test_nested_podman.py +345 -0
- agent_box_tool-1.0.0/tests/test_nested_podman_data.py +263 -0
- agent_box_tool-1.0.0/tests/test_notify.py +765 -0
- agent_box_tool-1.0.0/tests/test_paths.py +146 -0
- agent_box_tool-1.0.0/tests/test_plan_sync.py +464 -0
- agent_box_tool-1.0.0/tests/test_podman_doctor.py +92 -0
- agent_box_tool-1.0.0/tests/test_project_config.py +443 -0
- agent_box_tool-1.0.0/tests/test_provider_runner.py +491 -0
- agent_box_tool-1.0.0/tests/test_registries.py +391 -0
- agent_box_tool-1.0.0/tests/test_release.py +64 -0
- agent_box_tool-1.0.0/tests/test_remote_control.py +405 -0
- agent_box_tool-1.0.0/tests/test_review_results.py +489 -0
- agent_box_tool-1.0.0/tests/test_review_routing.py +195 -0
- agent_box_tool-1.0.0/tests/test_reviewer_routes.py +90 -0
- agent_box_tool-1.0.0/tests/test_routing.py +141 -0
- agent_box_tool-1.0.0/tests/test_runtime.py +1065 -0
- agent_box_tool-1.0.0/tests/test_runtime_bundle.py +76 -0
- agent_box_tool-1.0.0/tests/test_runtime_isolation.py +64 -0
- agent_box_tool-1.0.0/tests/test_selftest.py +40 -0
- agent_box_tool-1.0.0/tests/test_speed.py +179 -0
- agent_box_tool-1.0.0/tests/test_statusline.py +294 -0
- agent_box_tool-1.0.0/tests/test_suite_runner.py +56 -0
- agent_box_tool-1.0.0/tests/test_tmux_sessions.py +270 -0
- agent_box_tool-1.0.0/tests/test_tracker_access.py +118 -0
- agent_box_tool-1.0.0/tests/test_tracker_adapter.py +97 -0
- agent_box_tool-1.0.0/tests/test_tracker_adoption.py +262 -0
- agent_box_tool-1.0.0/tests/test_tracker_config.py +66 -0
- agent_box_tool-1.0.0/tests/test_tracker_github.py +294 -0
- agent_box_tool-1.0.0/tests/test_tracker_github_setup.py +157 -0
- agent_box_tool-1.0.0/tests/test_tracker_github_workflow.py +112 -0
- agent_box_tool-1.0.0/tests/test_tracker_github_write.py +239 -0
- agent_box_tool-1.0.0/tests/test_tracker_imports.py +849 -0
- agent_box_tool-1.0.0/tests/test_tracker_lifecycle.py +117 -0
- agent_box_tool-1.0.0/tests/test_tracker_maintenance.py +556 -0
- agent_box_tool-1.0.0/tests/test_tracker_normalization.py +140 -0
- agent_box_tool-1.0.0/tests/test_tracker_priority.py +42 -0
- agent_box_tool-1.0.0/tests/test_tracker_resolution.py +235 -0
- agent_box_tool-1.0.0/tests/test_tracker_setup.py +154 -0
- agent_box_tool-1.0.0/tests/test_tracker_staging.py +749 -0
- agent_box_tool-1.0.0/tests/test_tracker_transport.py +187 -0
- agent_box_tool-1.0.0/tests/test_tracker_workflow.py +130 -0
- agent_box_tool-1.0.0/tests/test_uninstall.py +265 -0
- agent_box_tool-1.0.0/tests/test_upgrades.py +139 -0
- agent_box_tool-1.0.0/tests/test_usage.py +258 -0
- agent_box_tool-1.0.0/tests/test_usage_auth.py +386 -0
- agent_box_tool-1.0.0/tests/test_usage_blocks.py +101 -0
- agent_box_tool-1.0.0/tests/test_user_env.py +206 -0
- agent_box_tool-1.0.0/tests/test_workflow_branches.py +272 -0
- agent_box_tool-1.0.0/tests/test_workflow_config.py +264 -0
- agent_box_tool-1.0.0/tests/test_workflow_delegate.py +352 -0
- agent_box_tool-1.0.0/tests/test_workflow_delta_review.py +140 -0
- agent_box_tool-1.0.0/tests/test_workflow_finish.py +941 -0
- agent_box_tool-1.0.0/tests/test_workflow_git.py +201 -0
- agent_box_tool-1.0.0/tests/test_workflow_inspect.py +274 -0
- agent_box_tool-1.0.0/tests/test_workflow_review.py +776 -0
- agent_box_tool-1.0.0/tests/test_working_language.py +238 -0
- agent_box_tool-1.0.0/tests/test_workspace.py +135 -0
- agent_box_tool-1.0.0/tests/test_workspace_container.py +801 -0
- agent_box_tool-1.0.0/tests/test_workspaces.py +261 -0
- agent_box_tool-1.0.0/tests/tracker_fixtures.py +273 -0
- agent_box_tool-1.0.0/tests/workflow_fixtures.py +220 -0
- agent_box_tool-1.0.0/tools/release.py +166 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
<!-- BEGIN AGENT-BOX workflow sha256=92395bc8ed359eb4df1606ec6a97757e1ee9c2ef82532f1c2614f912651942a4 -->
|
|
2
|
+
Read the tracked task before work; .agent-box.json binds this repository to its tracker project.
|
|
3
|
+
Use agent-box tracker for task state, progress and dependencies; read related history when context is missing.
|
|
4
|
+
Use ab-interview, ab-plan, ab-work, ab-sync, ab-review, ab-pr, and ab-land as needed. ab-setup maintains this binding and ab-adopt brings an existing project in line with the workflow; ab-normalize processes unmarked tasks in a bound project.
|
|
5
|
+
The coordinator owns branches, commits, lifecycle, dependencies, and GitHub actions. Delegate implementation sequentially and research to scouts, which may run in parallel, when their model lists are configured; with an empty list the coordinator does that work itself.
|
|
6
|
+
A worker changes project files and answers; scouts and a fresh reviewer only read. Plan sync reads the repository and updates tracker descriptions and comments through agent-box tracker; it never changes project files, Git or lifecycle. The coordinator verifies answers and findings and commits what it accepts.
|
|
7
|
+
Tracker comments are a human journal. Branch, base branch, and pull request come from Git and GitHub; lifecycle comes from the tracker's own fields, never from comment text.
|
|
8
|
+
Use the user's language for all coordinator messages to them: progress updates, questions, option explanations and final answers. Literal project labels may stay quoted in the project language. Write tracker text, GitHub text, commit messages, code comments and documentation in the `language` that `agent-box tracker status` and `workflow inspect` report; when it is null, use the task's language in the tracker and English for implementation. Agent-to-agent handoffs and reports stay English; agent-box CLI output, errors and help stay English.
|
|
9
|
+
Complete subtasks only after validation and integration into the parent branch; complete parents only after merge into the base branch.
|
|
10
|
+
<!-- END AGENT-BOX workflow -->
|
|
11
|
+
|
|
12
|
+
# agent-box — notes for agents working on this repository
|
|
13
|
+
|
|
14
|
+
## What this is
|
|
15
|
+
|
|
16
|
+
A launcher. `agent-box` runs Claude Code and Codex CLI inside rootless Podman
|
|
17
|
+
workspace boxes. Python standard library at runtime, packaged as `agent-box-tool` with no
|
|
18
|
+
runtime dependencies. Install editable for development; uv/pipx own the public
|
|
19
|
+
`agent-box` command and package updates.
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
pyproject.toml package metadata and agent-box -> agent_box.cli:main
|
|
23
|
+
agent_box/cli.py argument parsing and command dispatch
|
|
24
|
+
agent_box/config_menu.py stdlib curses configuration menu
|
|
25
|
+
agent_box/tracker/ portable task contract and product adapters
|
|
26
|
+
agent_box/workflow.py deterministic workflow boundaries; skills orchestrate
|
|
27
|
+
agent_box/runtime.py container lifecycle, mounts, launches, doctor
|
|
28
|
+
agent_box/config.py the whole config schema; flat dataclasses, no framework
|
|
29
|
+
agent_box/paths.py every host-side path; nothing else may hardcode a home layout
|
|
30
|
+
agent_box/runtime_bundle.py immutable package copies for running boxes
|
|
31
|
+
agent_box/skills/ skills agent-box ships and installs (owned, checked in)
|
|
32
|
+
agent_box/Containerfile the workspace image, with optional tool groups
|
|
33
|
+
tests/ unittest, no plugins
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Rules that are not negotiable
|
|
37
|
+
|
|
38
|
+
**Semantic Versioning from 1.0.0.** Use SemVer: PATCH fixes bugs compatibly,
|
|
39
|
+
MINOR adds backward-compatible functionality, and breaking changes to the
|
|
40
|
+
documented public contract require MAJOR. Describe breaking changes and their
|
|
41
|
+
upgrade path in release notes. Package versions and persisted schema versions
|
|
42
|
+
are separate; see `docs/compatibility.md` for the public surface and formats.
|
|
43
|
+
|
|
44
|
+
**Every public version upgrades directly to every later version.** Keep forward
|
|
45
|
+
migrations, including across major releases; users never install intermediate
|
|
46
|
+
packages. Before changing a persisted format or owned integration layout, assess
|
|
47
|
+
migration impact, retain published fixtures, add the required conversion and
|
|
48
|
+
test skipped versions, failure/retry and data preservation. Reject future schemas
|
|
49
|
+
before parsing or writing; preserve the original before migration commits. Do
|
|
50
|
+
not invent migrations for unpublished layouts. Running workspace runtimes stay
|
|
51
|
+
immutable; adopting a new runtime may require an explicit stop/relaunch.
|
|
52
|
+
|
|
53
|
+
**Paths come from `paths.py`.** Use `HOST_HOME` (passwd-derived), never
|
|
54
|
+
`Path.home()`, `os.path.expanduser`, or `$HOME`. A poisoned environment must not
|
|
55
|
+
be able to move a bind mount, a state directory or the container's home.
|
|
56
|
+
|
|
57
|
+
**Off by default.** Anything that exposes a credential or widens what an agent
|
|
58
|
+
can reach starts disabled. The exceptions are documented in the dataclass that
|
|
59
|
+
defines them, with the reason.
|
|
60
|
+
|
|
61
|
+
**Apply once after a package update.** `runtime.apply_config` is the single
|
|
62
|
+
integration writer. Configuration commands apply explicit changes; the first
|
|
63
|
+
host launch after a package update automatically migrates data and refreshes
|
|
64
|
+
already configured integrations under a lock, recording the package identity
|
|
65
|
+
only after success. Unchanged launches and read-only commands do not reapply.
|
|
66
|
+
Rendered sessions never infer or rewrite unavailable host settings. Preserve
|
|
67
|
+
user-owned content and opt-ins; keep `config apply` for manual edits and retry,
|
|
68
|
+
and `uninstall` for removing owned integrations.
|
|
69
|
+
|
|
70
|
+
On-demand Claude usage may renew and atomically save its OAuth credentials;
|
|
71
|
+
this is authentication maintenance, not integration application. Status-line
|
|
72
|
+
reads never renew tokens. Coordinate credential writes with Claude's locks.
|
|
73
|
+
|
|
74
|
+
**Installation belongs to the installer.** uv/pipx own the command and shell
|
|
75
|
+
PATH setup. agent-box never edits shell startup files or installer entry points.
|
|
76
|
+
After upgrading the package, the next host launch refreshes integrations;
|
|
77
|
+
run `agent-box uninstall` before removing the package through its installer.
|
|
78
|
+
|
|
79
|
+
**agent-box owns its integrations.** An integration configured somewhere else,
|
|
80
|
+
that the user has to assemble first, is not an integration. Settings live in
|
|
81
|
+
`config.json`; skills are shipped in `agent_box/skills/` and installed by
|
|
82
|
+
agent-box; the container gets a rendered, minimal artifact, never `config.json`
|
|
83
|
+
itself.
|
|
84
|
+
|
|
85
|
+
**Derived, not stored.** A fact that Git, GitHub or the tracker already owns is
|
|
86
|
+
read back from there. Branch names come from the task's `ab/<id>-` namespace,
|
|
87
|
+
the base branch from origin's default, the pull request from a head/base lookup,
|
|
88
|
+
the lifecycle from the board's own columns. `.agent-box.json` names the tracker
|
|
89
|
+
project and holds the allowed project configuration overrides. Nothing machine-readable is written into a tracker
|
|
90
|
+
comment: a comment is a human journal, and lifecycle is read from the tracker's
|
|
91
|
+
own fields.
|
|
92
|
+
|
|
93
|
+
**Role ownership.** Plan sync may update tracker descriptions and comments through
|
|
94
|
+
`agent-box tracker`, reading project files without changing them. The coordinator
|
|
95
|
+
owns Git, lifecycle, dependencies and GitHub. Other roles keep their existing limits.
|
|
96
|
+
|
|
97
|
+
**The coordinator accepts implementation.** A delegated worker reads its brief and
|
|
98
|
+
the code, changes project files in the working tree, and answers in Markdown;
|
|
99
|
+
a reviewer or scout reads and reports, changing nothing at all. The
|
|
100
|
+
coordinator decides from that answer what to commit and what to record in the
|
|
101
|
+
tracker and on GitHub. This is a contract, not credential isolation: a
|
|
102
|
+
delegation runs either as a native subagent of the coordinator's own session or
|
|
103
|
+
as a managed `codex exec` / `claude -p`, the first of which inherits the
|
|
104
|
+
coordinator's workspace, `.git` and credentials, so the two backends
|
|
105
|
+
deliberately share one contract rather than one of them acquiring private
|
|
106
|
+
restrictions. Workers and scouts are therefore only launched (`workflow
|
|
107
|
+
delegate`), never tracked: guards that only existed because the contract was
|
|
108
|
+
wide belong deleted, not tightened. A reviewer round is still bound to its
|
|
109
|
+
repository, project, task and scope by the descriptor workflow keeps beside the
|
|
110
|
+
round's input, which is plain readable JSON and is deliberately not treated as
|
|
111
|
+
unforgeable; a native reviewer's model and context are taken on trust.
|
|
112
|
+
|
|
113
|
+
**Secrets travel by name.** `--env=NAME` (Podman inherits the value) for
|
|
114
|
+
anything secret; `--env=NAME=VALUE` puts the value in an argv that `/proc`
|
|
115
|
+
exposes to other processes. `notify.sync_credentials` and
|
|
116
|
+
`runtime.sync_tracker_runtime` are the pattern for rendered credential files.
|
|
117
|
+
|
|
118
|
+
**Never overwrite what a user owns.** Skill directories carry a marker; ones
|
|
119
|
+
without it are the user's. Claude's `statusLine` slot is filled only when empty.
|
|
120
|
+
Hook removal only ever touches agent-box's own commands.
|
|
121
|
+
|
|
122
|
+
## Working in the code
|
|
123
|
+
|
|
124
|
+
- **All text an agent may read must be functionally compact.** Skills, instructions,
|
|
125
|
+
handoffs, messages, errors, hints, CLI help and command output need enough context,
|
|
126
|
+
exact commands and necessary constraints to act without guessing; remove filler
|
|
127
|
+
and repetition without cryptic compression.
|
|
128
|
+
- **Comments explain why, not what.** The existing docstrings state the decision
|
|
129
|
+
and the alternative that was rejected. Match that; do not add narration.
|
|
130
|
+
- **Tests are the specification.** Every test's name and docstring says what
|
|
131
|
+
behaviour is being protected and why it would be wrong otherwise. A test that
|
|
132
|
+
restates the implementation is noise.
|
|
133
|
+
- **Structural vs per-exec.** Anything in `container_lifetime_args` is part of
|
|
134
|
+
the box's identity: changing it recreates the box. Per-invocation values go
|
|
135
|
+
through `invocation_env`. Choose deliberately.
|
|
136
|
+
- **Diagnostics are returned, not printed**, so both the launch path and
|
|
137
|
+
`agent-box config` can render them (`tracker_warnings` is the pattern).
|
|
138
|
+
|
|
139
|
+
## Commands
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
python3 tests/run_suite.py # full suite; isolated paths, no outer PTY
|
|
143
|
+
python3 -m agent_box selftest # fast, no Podman
|
|
144
|
+
uvx ruff check --select E4,E9,F agent_box/ tests/ # what CI lints
|
|
145
|
+
python3 -m agent_box config show # inspect the live config, tokens redacted
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The runner uses unittest discovery, temporary state/integration paths and piped
|
|
149
|
+
stdio. For focused runs: `python3 tests/run_suite.py discover -s tests -p test_browser.py`.
|
|
150
|
+
Test modules import each other by bare name, so keep discovery.
|
|
151
|
+
|
|
152
|
+
## Gotchas
|
|
153
|
+
|
|
154
|
+
- `tests/` must never touch the developer's real `~/.claude` or `~/.agents`.
|
|
155
|
+
Anything that calls `config_interactive` or `apply_config` has to patch
|
|
156
|
+
`runtime.CLAUDE_HOME`, `runtime.CODEX_HOME`, `runtime.AGENT_SKILLS_DIR`, `runtime.MANAGED_SKILLS_SOURCE`
|
|
157
|
+
and the credential paths. This has bitten before.
|
|
158
|
+
- Module-level constants derived from `paths.py` (`AGENTS_DIR`, `TRACKER_RUNTIME_DIR`,
|
|
159
|
+
`CONTAINER_TRACKER_RUNTIME_DIR`) are resolved at import; tests patch them on `runtime`,
|
|
160
|
+
not on `paths`.
|
|
161
|
+
- `tests/run_suite.py` and `selftest` drop every inherited `AGENT_BOX_*` variable,
|
|
162
|
+
so they pass inside a workspace box as is; a bare `python3 -m unittest` does not,
|
|
163
|
+
and reads the session's `AGENT_BOX_RUNTIME_CONFIG` instead of its fixtures.
|
|
164
|
+
- The image label `io.agent-box.tools` records the built tool groups. A missing
|
|
165
|
+
label means *unknown*, not *empty* — never report it as drift.
|
|
166
|
+
- Inside a workspace box the saved configuration is not mounted: `config apply`
|
|
167
|
+
then applies only the skills and profiles the rendered session snapshot
|
|
168
|
+
describes and leaves host-only sections (notifications, hooks, status line,
|
|
169
|
+
credentials, Claude links) alone; the global `agent-box config` menu
|
|
170
|
+
refuses because it edits a file that is not there.
|
|
171
|
+
- `agent_box/skills/` contains short owned `ab-*` skills. Maintain them directly
|
|
172
|
+
and keep their command/role contracts consistent with the Python helpers.
|
|
173
|
+
- `.gitignore` ignores `/skills/` at the repo root only — `agent_box/skills/` is
|
|
174
|
+
checked in on purpose.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Release notes
|
|
2
|
+
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
First public release of **agent-box**, distributed on PyPI as `agent-box-tool`.
|
|
6
|
+
The command remains `agent-box`; Python 3.11+ and Linux are required, with no
|
|
7
|
+
Python runtime dependencies. Workspace containers require rootless Podman 5+.
|
|
8
|
+
|
|
9
|
+
- Run Claude Code and Codex CLI in reusable per-project workspaces, with
|
|
10
|
+
detachable sessions, selected host mounts and opt-in credential forwarding.
|
|
11
|
+
- Configure owned integrations, skills, native agent profiles and portable
|
|
12
|
+
tracker/workflow support from the built-in configuration interface.
|
|
13
|
+
- Install through uv tool or pipx from PyPI or the public Git repository.
|
|
14
|
+
- Use SemVer and direct forward data migrations across all later releases,
|
|
15
|
+
including major versions. This release establishes the first supported
|
|
16
|
+
public data formats and regression fixtures.
|
|
17
|
+
- Refresh configured integrations automatically on the first host launch after
|
|
18
|
+
a package update. Failed application remains retryable; `config apply` is
|
|
19
|
+
available for manual edits and recovery.
|
|
20
|
+
- Preserve running workspaces on their immutable runtime until explicit
|
|
21
|
+
stop/relaunch. Package upgrades preserve saved choices and workspace data.
|
|
22
|
+
|
|
23
|
+
See [installation](docs/installation.md) and
|
|
24
|
+
[compatibility](docs/compatibility.md) for the supported upgrade boundaries.
|
|
25
|
+
AUR packaging is separate follow-up work.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Alexander Mirgorod
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agent-box-tool
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Run coding agents in rootless Podman workspace boxes
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/rus364/agent-box
|
|
7
|
+
Project-URL: Documentation, https://github.com/rus364/agent-box/blob/main/docs/README.md
|
|
8
|
+
Project-URL: Repository, https://github.com/rus364/agent-box
|
|
9
|
+
Project-URL: Issues, https://github.com/rus364/agent-box/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/rus364/agent-box/blob/main/CHANGELOG.md
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
<div align="center">
|
|
26
|
+
|
|
27
|
+
# agent-box
|
|
28
|
+
|
|
29
|
+
**Run Claude Code and Codex CLI in isolated, reusable Podman workspaces.**
|
|
30
|
+
|
|
31
|
+
One project. One shared container. Your agents, shell, tools, state, and detachable sessions stay together without giving the container your whole host.
|
|
32
|
+
|
|
33
|
+
[](https://github.com/rus364/agent-box/actions/workflows/ci.yml)
|
|
34
|
+

|
|
35
|
+

|
|
36
|
+

|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Why agent-box?
|
|
44
|
+
|
|
45
|
+
AI coding agents are useful, but running them directly on your workstation
|
|
46
|
+
gives them the same files, credentials, tools and processes that you have.
|
|
47
|
+
agent-box runs Claude Code and Codex CLI inside a rootless Podman container
|
|
48
|
+
while keeping the workflow close to local development:
|
|
49
|
+
|
|
50
|
+
- **Workspace isolation** — only the project root and the mounts you ask for are exposed.
|
|
51
|
+
- **One box per project** — Claude, Codex and `agent-box shell` share the same container.
|
|
52
|
+
- **Same paths as the host** — `/home/you/code/project` is `/home/you/code/project` inside the box too.
|
|
53
|
+
- **Persistent agent state** — logins, settings and history stay in your host's `~/.claude` and `~/.codex`.
|
|
54
|
+
- **Detachable sessions** — sessions run under tmux and survive a closed terminal or a dropped SSH connection.
|
|
55
|
+
- **Nothing exposed by accident** — every credential, host directory and optional capability is a switch you turn on.
|
|
56
|
+
|
|
57
|
+
> [!IMPORTANT]
|
|
58
|
+
> A workspace box is one trust boundary. Claude, Codex, shells, hooks and
|
|
59
|
+
> daemons inside the same box share the same Unix user and PID namespace.
|
|
60
|
+
|
|
61
|
+
## Requirements
|
|
62
|
+
|
|
63
|
+
- Linux
|
|
64
|
+
- Python 3.11 or newer (standard library only)
|
|
65
|
+
- Rootless Podman 5.0 or newer — agent-box does not fall back to Docker
|
|
66
|
+
- Git
|
|
67
|
+
- Optional: `gh`, to pass a GitHub token into the box
|
|
68
|
+
|
|
69
|
+
agent-box checks all of this before starting a box and prints the command that
|
|
70
|
+
fixes anything missing. Details: [Installation](docs/installation.md#requirements).
|
|
71
|
+
|
|
72
|
+
## Installation
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 1. Install from PyPI.
|
|
76
|
+
uv tool install agent-box-tool
|
|
77
|
+
uv tool update-shell # if the installer reports PATH setup is needed
|
|
78
|
+
|
|
79
|
+
# 2. Reopen the shell if PATH changed, then configure integrations.
|
|
80
|
+
agent-box config
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The distribution is `agent-box-tool`; the command stays `agent-box`.
|
|
84
|
+
[pipx, public Git and editable installs](docs/installation.md) are also supported.
|
|
85
|
+
|
|
86
|
+
3. Log in with `claude` and `codex` on the host; agent-box reuses those logins.
|
|
87
|
+
4. Start a session in your project. The workspace image is built automatically
|
|
88
|
+
the first time, which takes a few minutes once.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
cd ~/code/my-project
|
|
92
|
+
agent-box claude # or: agent-box codex
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Shell completion, updating and uninstalling are covered in
|
|
96
|
+
[Installation](docs/installation.md).
|
|
97
|
+
|
|
98
|
+
## Quick start
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
agent-box # the default agent (Claude unless you choose Codex)
|
|
102
|
+
agent-box shell # a shell in this project's box
|
|
103
|
+
agent-box attach # reattach a detached session (detach with Ctrl-\ d)
|
|
104
|
+
agent-box stop # end the box and every session in it
|
|
105
|
+
agent-box --host codex # run the host's CLI directly, without a container
|
|
106
|
+
agent-box doctor # check the box and its integrations
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Options before the agent apply to one launch, for example
|
|
110
|
+
`agent-box --mount ~/specs:ro --env DATABASE_URL claude`. See
|
|
111
|
+
[Usage](docs/usage.md) for all of them.
|
|
112
|
+
|
|
113
|
+
## How it works
|
|
114
|
+
|
|
115
|
+
```mermaid
|
|
116
|
+
flowchart LR
|
|
117
|
+
Host["Host workspace"] --> Launcher["agent-box"]
|
|
118
|
+
Launcher --> Box["Rootless Podman workspace box"]
|
|
119
|
+
|
|
120
|
+
Box --> Claude["Claude Code"]
|
|
121
|
+
Box --> Codex["Codex CLI"]
|
|
122
|
+
Box --> Shell["Shell"]
|
|
123
|
+
|
|
124
|
+
Claude --> Tmux["tmux sessions"]
|
|
125
|
+
Codex --> Tmux
|
|
126
|
+
Shell --> Tmux
|
|
127
|
+
|
|
128
|
+
State["~/.claude / ~/.codex"] -. host-backed state .-> Box
|
|
129
|
+
Project["Project root\nsame absolute path"] -. explicit bind mount .-> Box
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Workspace box.** The first command in a project creates its box; later
|
|
133
|
+
commands join it. A different project gets a different box, and a box with no
|
|
134
|
+
workload left exits and is removed. The box mounts the Git top level of the
|
|
135
|
+
current directory and your agent state; any other host path, credential or
|
|
136
|
+
device only when you enable it.
|
|
137
|
+
|
|
138
|
+
**Host mode.** `--host` runs your installed `claude` or `codex` directly, with
|
|
139
|
+
your own environment and credentials. Tracker, workflow and model routing
|
|
140
|
+
behave the same; container-only features such as mounts and the agent browser
|
|
141
|
+
do not apply.
|
|
142
|
+
|
|
143
|
+
**Configuration.** Built-in defaults, then your global
|
|
144
|
+
`~/.config/agent-box/config.json`, then the repository's `.agent-box.json`.
|
|
145
|
+
`agent-box config` edits settings and applies integrations. The first host launch
|
|
146
|
+
after a package update refreshes configured integrations automatically; unchanged
|
|
147
|
+
launches leave them alone. See [compatibility and upgrades](docs/compatibility.md).
|
|
148
|
+
|
|
149
|
+
## Documentation
|
|
150
|
+
|
|
151
|
+
| Page | What it covers |
|
|
152
|
+
| --- | --- |
|
|
153
|
+
| [Installation](docs/installation.md) | Requirements, setup, shell completion, updating, uninstalling |
|
|
154
|
+
| [Usage](docs/usage.md) | Sessions, options, mounts, environment, host mode, usage limits and status line |
|
|
155
|
+
| [Configuration](docs/configuration.md) | The menu, defaults, project configuration, `config ai` |
|
|
156
|
+
| [Workspace image](docs/image.md) | Included tools, optional groups, building and refreshing |
|
|
157
|
+
| [Security model](docs/security.md) | What a box can reach and how it is hardened |
|
|
158
|
+
| [Integrations](docs/integrations/README.md) | Tracker and workflow, browser, k3s, Telegram, credentials and more — all optional |
|
|
159
|
+
| [Troubleshooting](docs/troubleshooting.md) | Diagnostics, common problems, known limitations |
|
|
160
|
+
|
|
161
|
+
The full index, including design records for contributors, is in
|
|
162
|
+
[docs/](docs/README.md).
|
|
163
|
+
|
|
164
|
+
## License
|
|
165
|
+
|
|
166
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# agent-box
|
|
4
|
+
|
|
5
|
+
**Run Claude Code and Codex CLI in isolated, reusable Podman workspaces.**
|
|
6
|
+
|
|
7
|
+
One project. One shared container. Your agents, shell, tools, state, and detachable sessions stay together without giving the container your whole host.
|
|
8
|
+
|
|
9
|
+
[](https://github.com/rus364/agent-box/actions/workflows/ci.yml)
|
|
10
|
+

|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Why agent-box?
|
|
20
|
+
|
|
21
|
+
AI coding agents are useful, but running them directly on your workstation
|
|
22
|
+
gives them the same files, credentials, tools and processes that you have.
|
|
23
|
+
agent-box runs Claude Code and Codex CLI inside a rootless Podman container
|
|
24
|
+
while keeping the workflow close to local development:
|
|
25
|
+
|
|
26
|
+
- **Workspace isolation** — only the project root and the mounts you ask for are exposed.
|
|
27
|
+
- **One box per project** — Claude, Codex and `agent-box shell` share the same container.
|
|
28
|
+
- **Same paths as the host** — `/home/you/code/project` is `/home/you/code/project` inside the box too.
|
|
29
|
+
- **Persistent agent state** — logins, settings and history stay in your host's `~/.claude` and `~/.codex`.
|
|
30
|
+
- **Detachable sessions** — sessions run under tmux and survive a closed terminal or a dropped SSH connection.
|
|
31
|
+
- **Nothing exposed by accident** — every credential, host directory and optional capability is a switch you turn on.
|
|
32
|
+
|
|
33
|
+
> [!IMPORTANT]
|
|
34
|
+
> A workspace box is one trust boundary. Claude, Codex, shells, hooks and
|
|
35
|
+
> daemons inside the same box share the same Unix user and PID namespace.
|
|
36
|
+
|
|
37
|
+
## Requirements
|
|
38
|
+
|
|
39
|
+
- Linux
|
|
40
|
+
- Python 3.11 or newer (standard library only)
|
|
41
|
+
- Rootless Podman 5.0 or newer — agent-box does not fall back to Docker
|
|
42
|
+
- Git
|
|
43
|
+
- Optional: `gh`, to pass a GitHub token into the box
|
|
44
|
+
|
|
45
|
+
agent-box checks all of this before starting a box and prints the command that
|
|
46
|
+
fixes anything missing. Details: [Installation](docs/installation.md#requirements).
|
|
47
|
+
|
|
48
|
+
## Installation
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 1. Install from PyPI.
|
|
52
|
+
uv tool install agent-box-tool
|
|
53
|
+
uv tool update-shell # if the installer reports PATH setup is needed
|
|
54
|
+
|
|
55
|
+
# 2. Reopen the shell if PATH changed, then configure integrations.
|
|
56
|
+
agent-box config
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The distribution is `agent-box-tool`; the command stays `agent-box`.
|
|
60
|
+
[pipx, public Git and editable installs](docs/installation.md) are also supported.
|
|
61
|
+
|
|
62
|
+
3. Log in with `claude` and `codex` on the host; agent-box reuses those logins.
|
|
63
|
+
4. Start a session in your project. The workspace image is built automatically
|
|
64
|
+
the first time, which takes a few minutes once.
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
cd ~/code/my-project
|
|
68
|
+
agent-box claude # or: agent-box codex
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Shell completion, updating and uninstalling are covered in
|
|
72
|
+
[Installation](docs/installation.md).
|
|
73
|
+
|
|
74
|
+
## Quick start
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
agent-box # the default agent (Claude unless you choose Codex)
|
|
78
|
+
agent-box shell # a shell in this project's box
|
|
79
|
+
agent-box attach # reattach a detached session (detach with Ctrl-\ d)
|
|
80
|
+
agent-box stop # end the box and every session in it
|
|
81
|
+
agent-box --host codex # run the host's CLI directly, without a container
|
|
82
|
+
agent-box doctor # check the box and its integrations
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Options before the agent apply to one launch, for example
|
|
86
|
+
`agent-box --mount ~/specs:ro --env DATABASE_URL claude`. See
|
|
87
|
+
[Usage](docs/usage.md) for all of them.
|
|
88
|
+
|
|
89
|
+
## How it works
|
|
90
|
+
|
|
91
|
+
```mermaid
|
|
92
|
+
flowchart LR
|
|
93
|
+
Host["Host workspace"] --> Launcher["agent-box"]
|
|
94
|
+
Launcher --> Box["Rootless Podman workspace box"]
|
|
95
|
+
|
|
96
|
+
Box --> Claude["Claude Code"]
|
|
97
|
+
Box --> Codex["Codex CLI"]
|
|
98
|
+
Box --> Shell["Shell"]
|
|
99
|
+
|
|
100
|
+
Claude --> Tmux["tmux sessions"]
|
|
101
|
+
Codex --> Tmux
|
|
102
|
+
Shell --> Tmux
|
|
103
|
+
|
|
104
|
+
State["~/.claude / ~/.codex"] -. host-backed state .-> Box
|
|
105
|
+
Project["Project root\nsame absolute path"] -. explicit bind mount .-> Box
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Workspace box.** The first command in a project creates its box; later
|
|
109
|
+
commands join it. A different project gets a different box, and a box with no
|
|
110
|
+
workload left exits and is removed. The box mounts the Git top level of the
|
|
111
|
+
current directory and your agent state; any other host path, credential or
|
|
112
|
+
device only when you enable it.
|
|
113
|
+
|
|
114
|
+
**Host mode.** `--host` runs your installed `claude` or `codex` directly, with
|
|
115
|
+
your own environment and credentials. Tracker, workflow and model routing
|
|
116
|
+
behave the same; container-only features such as mounts and the agent browser
|
|
117
|
+
do not apply.
|
|
118
|
+
|
|
119
|
+
**Configuration.** Built-in defaults, then your global
|
|
120
|
+
`~/.config/agent-box/config.json`, then the repository's `.agent-box.json`.
|
|
121
|
+
`agent-box config` edits settings and applies integrations. The first host launch
|
|
122
|
+
after a package update refreshes configured integrations automatically; unchanged
|
|
123
|
+
launches leave them alone. See [compatibility and upgrades](docs/compatibility.md).
|
|
124
|
+
|
|
125
|
+
## Documentation
|
|
126
|
+
|
|
127
|
+
| Page | What it covers |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| [Installation](docs/installation.md) | Requirements, setup, shell completion, updating, uninstalling |
|
|
130
|
+
| [Usage](docs/usage.md) | Sessions, options, mounts, environment, host mode, usage limits and status line |
|
|
131
|
+
| [Configuration](docs/configuration.md) | The menu, defaults, project configuration, `config ai` |
|
|
132
|
+
| [Workspace image](docs/image.md) | Included tools, optional groups, building and refreshing |
|
|
133
|
+
| [Security model](docs/security.md) | What a box can reach and how it is hardened |
|
|
134
|
+
| [Integrations](docs/integrations/README.md) | Tracker and workflow, browser, k3s, Telegram, credentials and more — all optional |
|
|
135
|
+
| [Troubleshooting](docs/troubleshooting.md) | Diagnostics, common problems, known limitations |
|
|
136
|
+
|
|
137
|
+
The full index, including design records for contributors, is in
|
|
138
|
+
[docs/](docs/README.md).
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
MIT — see [LICENSE](LICENSE).
|