agent-cli 0.87.0__tar.gz → 0.88.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_cli-0.87.0/agent_cli/dev/skill → agent_cli-0.88.0/.claude/skills/agent-cli-dev}/SKILL.md +27 -10
- {agent_cli-0.87.0/.claude → agent_cli-0.88.0/.claude-plugin}/skills/agent-cli-dev/SKILL.md +27 -10
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.pre-commit-config.yaml +1 -1
- agent_cli-0.88.0/LLAMA_SERVER_USAGE.md +90 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/PKG-INFO +1 -1
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/cleanup.py +48 -9
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/cli.py +54 -13
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/base.py +1 -1
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/launch.py +11 -5
- {agent_cli-0.87.0/.claude-plugin/skills/agent-cli-dev → agent_cli-0.88.0/agent_cli/dev/skill}/SKILL.md +27 -10
- agent_cli-0.88.0/agent_cli/dev/terminals/tmux.py +340 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/dev.md +27 -8
- agent_cli-0.88.0/reddit.md +624 -0
- agent_cli-0.88.0/tests/dev/test_cleanup.py +100 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_cli.py +207 -8
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_launch.py +96 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_terminals.py +169 -2
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_verification.py +3 -2
- agent_cli-0.87.0/agent_cli/dev/terminals/tmux.py +0 -167
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.claude/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.claude-plugin/README.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.claude-plugin/marketplace.json +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.claude-plugin/plugin.json +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.claude-plugin/skills/agent-cli-dev/examples.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.cursorrules +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.dockerignore +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.env.example +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/logo.svg +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/release-drafter.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/renovate.json +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/scripts/check_extras_sync.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/scripts/check_plugin_skill_sync.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/scripts/sync_extras.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/scripts/sync_requirements.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/automerge.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/docker.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/docs.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/markdown-code-runner.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/pytest.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/release-drafter.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/release.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.github/workflows/toc.yaml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.gitignore +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.jscpd.json +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.prompts/docs-review.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/.prompts/pr-review.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/CLAUDE.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/LICENSE +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/README.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/__main__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_extras.json +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/.gitkeep +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/audio.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/faster-whisper.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/kokoro.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/llm.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/memory.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/mlx-whisper.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/piper.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/rag.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/server.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/speed.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/vad.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/vectordb.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/whisper-transformers.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_requirements/wyoming.txt +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/_tools.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/_voice_agent_common.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/assistant.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/autocorrect.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/chat.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/memory/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/memory/add.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/memory/proxy.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/rag_proxy.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/speak.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/transcribe.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/transcribe_live.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/agents/voice_edit.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/cli.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/config.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/config_cmd.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/constants.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/audio.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/audio_format.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/chroma.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/deps.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/openai_proxy.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/process.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/reranker.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/sse.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/transcription_logger.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/vad.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/core/watch.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/daemon/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/daemon/cli.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/_branch_name.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/_config.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/_output.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/aider.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/claude.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/codex.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/continue_dev.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/copilot.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/cursor_agent.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/gemini.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/opencode.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/coding_agents/registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/base.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/cursor.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/emacs.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/jetbrains.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/nano.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/neovim.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/sublime.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/vim.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/vscode.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/editors/zed.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/hooks.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/project.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/skill/examples.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/apple_terminal.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/base.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/gnome.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/iterm2.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/kitty.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/warp.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/terminals/zellij.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/dev/worktree.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/docs_gen.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/example-config.toml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/common.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/extras.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/hotkeys.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/launchd.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/service_config.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/services.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/install/systemd.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_files.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_filters.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_git.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_indexer.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_ingest.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_persistence.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_prompt.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_retrieval.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_store.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_streaming.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/_tasks.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/client.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/engine.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/entities.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/memory/models.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/opts.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/py.typed +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_indexer.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_indexing.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_prompt.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_retriever.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_store.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/client.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/engine.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/rag/models.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/.runtime/.gitkeep +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/linux-hotkeys/README.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/linux-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/linux-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/linux-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/macos-hotkeys/README.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/macos-hotkeys/skhd-config-example +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/macos-hotkeys/toggle-autocorrect.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/macos-hotkeys/toggle-transcription.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/macos-hotkeys/toggle-voice-edit.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/nvidia-asr-server/README.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/nvidia-asr-server/pyproject.toml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/nvidia-asr-server/server.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/nvidia-asr-server/shell.nix +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/nvidia-asr-server/uv.lock +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/run-openwakeword.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/setup-linux-hotkeys.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/setup-linux.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/setup-macos-hotkeys.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/setup-macos.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/setup-windows.ps1 +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/start-all-services-windows.ps1 +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/scripts/start-all-services.sh +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/cli.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/common.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/model_manager.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/model_registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/proxy/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/proxy/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/streaming.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/backends/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/backends/base.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/backends/kokoro.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/backends/piper.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/model_manager.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/model_registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/tts/wyoming_handler.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/backends/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/backends/base.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/backends/faster_whisper.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/backends/mlx.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/backends/transformers.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/languages.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/model_manager.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/model_registry.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/server/whisper/wyoming_handler.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/_wyoming_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/asr.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/llm.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/tts.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/agent_cli/services/wake_word.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/docker-compose.yml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/memory-proxy.Dockerfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/rag-proxy.Dockerfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/transcribe-proxy.Dockerfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/tts.Dockerfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docker/whisper.Dockerfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/CNAME +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/architecture/index.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/architecture/memory.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/architecture/rag.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/assistant.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/autocorrect.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/chat.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/config.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/daemon.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/index.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/install-extras.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/install-hotkeys.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/install-services.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/memory.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/rag-proxy.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/server/index.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/server/transcribe-proxy.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/server/tts.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/server/whisper.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/speak.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/start-services.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/transcribe-live.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/transcribe.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/commands/voice-edit.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/configuration.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/getting-started.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/iOS_Shortcut_Guide.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/index.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/docker.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/index.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/linux.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/macos.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/nixos.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/installation/windows.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/logo-clean.svg +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/overrides/partials/integrations/analytics/custom.html +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/run_markdown_code_runner.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/docs/system-integration.md +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/example.agent-cli-config.toml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/justfile +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/pyproject.toml +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/shell.nix +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_fix_my_text.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_interactive.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_interactive_extra.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_memory_add.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_speak.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_speak_e2e.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_transcribe.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_transcribe_agent.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_transcribe_e2e.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_transcribe_live.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_transcribe_recovery.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_tts_common.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_tts_common_extra.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_voice_agent_common.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_voice_edit.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_voice_edit_e2e.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/agents/test_wake_word_assistant.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/conftest.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_audio.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_audio_format.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_chroma.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_sse.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_vad.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/core/test_watch.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_coding_agents.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_editors.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_hooks.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_project.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/dev/test_worktree.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/install/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/install/test_extras.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_api_health.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_api_integration_liveish.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_client.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_engine.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_files.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_filters.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_git_integration.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_indexer.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_memory_integration.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_proxy_passthrough.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_store.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/memory/test_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/mocks/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/mocks/audio.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/mocks/llm.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/mocks/wyoming.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/__init__.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_engine.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_history.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_indexer.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_indexing.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_rag_client.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_rag_integration_liveish.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_rag_proxy_passthrough.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_retriever.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_store.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/rag/test_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_api.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_api_integration.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_asr.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_asr_recovery.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_audio_e2e.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_cli.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_config.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_config_cmd.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_daemon.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_docs_gen.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_env_vars.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_json_output.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_llm.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_llm_gemini.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_memory_tools.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_mlx_backend.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_process_manager.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_requires_extras.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_server_streaming.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_server_tts.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_server_whisper.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_services.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_tools.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_transformers_backend.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_tts.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_wake_word.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/tests/test_wyoming_utils.py +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/uv.lock +0 -0
- {agent_cli-0.87.0 → agent_cli-0.88.0}/zensical.toml +0 -0
{agent_cli-0.87.0/agent_cli/dev/skill → agent_cli-0.88.0/.claude/skills/agent-cli-dev}/SKILL.md
RENAMED
|
@@ -9,7 +9,7 @@ This skill teaches you how to spawn parallel AI coding agents in isolated git wo
|
|
|
9
9
|
|
|
10
10
|
`agent-cli dev` supports two complementary patterns:
|
|
11
11
|
- Separate worktrees for isolated implementation/review tasks
|
|
12
|
-
- Multiple agents on the same worktree using `dev agent -m tmux`
|
|
12
|
+
- Multiple agents on the same worktree using `dev agent --tmux-session <unique-name>` for autonomous launches, or `-m tmux` when a human explicitly wants shared tmux windows
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|
|
@@ -136,17 +136,26 @@ Use this when several agents should inspect or validate the same code at once wi
|
|
|
136
136
|
# Create the worktree once. This step only prepares the shared workspace.
|
|
137
137
|
agent-cli dev new review-auth --from HEAD
|
|
138
138
|
|
|
139
|
-
# Then launch the actual agents with prompts.
|
|
140
|
-
agent-cli dev agent review-auth
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
# Then launch the actual agents with prompts. Give each agent its own tmux session.
|
|
140
|
+
agent-cli dev agent review-auth \
|
|
141
|
+
--tmux-session review-auth-security-20260402-1530 \
|
|
142
|
+
--prompt-file .claude/review-security.md
|
|
143
|
+
agent-cli dev agent review-auth \
|
|
144
|
+
--tmux-session review-auth-performance-20260402-1530 \
|
|
145
|
+
--prompt-file .claude/review-performance.md
|
|
146
|
+
agent-cli dev agent review-auth \
|
|
147
|
+
--tmux-session review-auth-tests-20260402-1530 \
|
|
148
|
+
--prompt-file .claude/review-tests.md
|
|
143
149
|
```
|
|
144
150
|
|
|
145
151
|
Key rules for same-worktree launches:
|
|
146
152
|
- Use `dev agent`, not `dev new`, after the worktree already exists
|
|
147
153
|
- Use `dev agent --agent <agent>` to select a specific agent for an existing worktree; `--with-agent` remains a deprecated alias on this subcommand
|
|
148
|
-
-
|
|
149
|
-
-
|
|
154
|
+
- For autonomous agents, prefer `--tmux-session <unique-name>` and use a different session name for each launch
|
|
155
|
+
- Reserve bare `-m tmux` for human-driven grouped windows or when the user explicitly wants agents to share one tmux session
|
|
156
|
+
- Outside tmux, bare `-m tmux` joins the deterministic repo-scoped tmux session
|
|
157
|
+
- Inside tmux, bare `-m tmux` opens a new window in the current session unless you pass `--tmux-session <name>`, which reuses or creates a specific tmux session and also implies `-m tmux`
|
|
158
|
+
- tmux session names cannot contain `.` or `:`
|
|
150
159
|
- Ask each agent to write to a unique report path such as `.claude/REPORT-security-<run-id>.md` or `.claude/REPORT-tests-<run-id>.md`
|
|
151
160
|
- If you rerun the same prompt repeatedly, include a timestamp or other run id in the report filename so later runs do not overwrite earlier ones
|
|
152
161
|
- Each agent launch gets its own unique task file in `.claude/` (e.g., `TASK-{timestamp}-{hex}.md`), so parallel launches do not overwrite each other
|
|
@@ -168,14 +177,21 @@ When complete, write findings to .claude/REPORT-security-20260319-153045-123.md
|
|
|
168
177
|
|
|
169
178
|
## Headless/scripted orchestration
|
|
170
179
|
|
|
171
|
-
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with
|
|
180
|
+
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with `--tmux-session`:
|
|
172
181
|
|
|
173
182
|
```bash
|
|
174
|
-
agent-cli dev new validation-a --from HEAD --agent codex
|
|
183
|
+
agent-cli dev new validation-a --from HEAD --agent codex \
|
|
184
|
+
--tmux-session validation-a-20260402-1530 \
|
|
175
185
|
--prompt-file .claude/validation-a.md
|
|
176
186
|
```
|
|
177
187
|
|
|
178
|
-
This works without an attached terminal.
|
|
188
|
+
This works without an attached terminal. For autonomous or scripted launches, prefer a unique `--tmux-session` per agent so separate runs do not trample each other by sharing one tmux session. Use bare `-m tmux` only when you explicitly want shared tmux grouping. Launches may also run pre-launch preparation by default; use `--no-hooks` only when you explicitly need to bypass that behavior.
|
|
189
|
+
|
|
190
|
+
## Cleanup behavior
|
|
191
|
+
|
|
192
|
+
- `dev rm` and `dev clean` also clean up tmux windows that `agent-cli` tagged for the worktree
|
|
193
|
+
- If git worktree removal succeeds but tmux cleanup is partial, the command warns and still removes the worktree
|
|
194
|
+
- Session isolation prevents agents from interfering with each other's tmux windows during execution, but cleanup still applies to all tagged windows for the worktree
|
|
179
195
|
|
|
180
196
|
## Example: Multi-feature implementation
|
|
181
197
|
|
|
@@ -200,5 +216,6 @@ Each agent works independently in its own branch. Results can be reviewed and me
|
|
|
200
216
|
| `--from` / `-f` | Base ref (default: origin/main). **Use `--from HEAD` when reviewing/testing current branch!** |
|
|
201
217
|
| `--agent` | Specific agent (or `auto`): claude, aider, codex, gemini |
|
|
202
218
|
| `--agent-args` | Extra arguments for the agent |
|
|
219
|
+
| `--tmux-session` | Reuse or create a specific tmux session. For autonomous agents, prefer a unique name per launch |
|
|
203
220
|
|
|
204
221
|
@examples.md
|
|
@@ -9,7 +9,7 @@ This skill teaches you how to spawn parallel AI coding agents in isolated git wo
|
|
|
9
9
|
|
|
10
10
|
`agent-cli dev` supports two complementary patterns:
|
|
11
11
|
- Separate worktrees for isolated implementation/review tasks
|
|
12
|
-
- Multiple agents on the same worktree using `dev agent -m tmux`
|
|
12
|
+
- Multiple agents on the same worktree using `dev agent --tmux-session <unique-name>` for autonomous launches, or `-m tmux` when a human explicitly wants shared tmux windows
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|
|
@@ -136,17 +136,26 @@ Use this when several agents should inspect or validate the same code at once wi
|
|
|
136
136
|
# Create the worktree once. This step only prepares the shared workspace.
|
|
137
137
|
agent-cli dev new review-auth --from HEAD
|
|
138
138
|
|
|
139
|
-
# Then launch the actual agents with prompts.
|
|
140
|
-
agent-cli dev agent review-auth
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
# Then launch the actual agents with prompts. Give each agent its own tmux session.
|
|
140
|
+
agent-cli dev agent review-auth \
|
|
141
|
+
--tmux-session review-auth-security-20260402-1530 \
|
|
142
|
+
--prompt-file .claude/review-security.md
|
|
143
|
+
agent-cli dev agent review-auth \
|
|
144
|
+
--tmux-session review-auth-performance-20260402-1530 \
|
|
145
|
+
--prompt-file .claude/review-performance.md
|
|
146
|
+
agent-cli dev agent review-auth \
|
|
147
|
+
--tmux-session review-auth-tests-20260402-1530 \
|
|
148
|
+
--prompt-file .claude/review-tests.md
|
|
143
149
|
```
|
|
144
150
|
|
|
145
151
|
Key rules for same-worktree launches:
|
|
146
152
|
- Use `dev agent`, not `dev new`, after the worktree already exists
|
|
147
153
|
- Use `dev agent --agent <agent>` to select a specific agent for an existing worktree; `--with-agent` remains a deprecated alias on this subcommand
|
|
148
|
-
-
|
|
149
|
-
-
|
|
154
|
+
- For autonomous agents, prefer `--tmux-session <unique-name>` and use a different session name for each launch
|
|
155
|
+
- Reserve bare `-m tmux` for human-driven grouped windows or when the user explicitly wants agents to share one tmux session
|
|
156
|
+
- Outside tmux, bare `-m tmux` joins the deterministic repo-scoped tmux session
|
|
157
|
+
- Inside tmux, bare `-m tmux` opens a new window in the current session unless you pass `--tmux-session <name>`, which reuses or creates a specific tmux session and also implies `-m tmux`
|
|
158
|
+
- tmux session names cannot contain `.` or `:`
|
|
150
159
|
- Ask each agent to write to a unique report path such as `.claude/REPORT-security-<run-id>.md` or `.claude/REPORT-tests-<run-id>.md`
|
|
151
160
|
- If you rerun the same prompt repeatedly, include a timestamp or other run id in the report filename so later runs do not overwrite earlier ones
|
|
152
161
|
- Each agent launch gets its own unique task file in `.claude/` (e.g., `TASK-{timestamp}-{hex}.md`), so parallel launches do not overwrite each other
|
|
@@ -168,14 +177,21 @@ When complete, write findings to .claude/REPORT-security-20260319-153045-123.md
|
|
|
168
177
|
|
|
169
178
|
## Headless/scripted orchestration
|
|
170
179
|
|
|
171
|
-
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with
|
|
180
|
+
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with `--tmux-session`:
|
|
172
181
|
|
|
173
182
|
```bash
|
|
174
|
-
agent-cli dev new validation-a --from HEAD --agent codex
|
|
183
|
+
agent-cli dev new validation-a --from HEAD --agent codex \
|
|
184
|
+
--tmux-session validation-a-20260402-1530 \
|
|
175
185
|
--prompt-file .claude/validation-a.md
|
|
176
186
|
```
|
|
177
187
|
|
|
178
|
-
This works without an attached terminal.
|
|
188
|
+
This works without an attached terminal. For autonomous or scripted launches, prefer a unique `--tmux-session` per agent so separate runs do not trample each other by sharing one tmux session. Use bare `-m tmux` only when you explicitly want shared tmux grouping. Launches may also run pre-launch preparation by default; use `--no-hooks` only when you explicitly need to bypass that behavior.
|
|
189
|
+
|
|
190
|
+
## Cleanup behavior
|
|
191
|
+
|
|
192
|
+
- `dev rm` and `dev clean` also clean up tmux windows that `agent-cli` tagged for the worktree
|
|
193
|
+
- If git worktree removal succeeds but tmux cleanup is partial, the command warns and still removes the worktree
|
|
194
|
+
- Session isolation prevents agents from interfering with each other's tmux windows during execution, but cleanup still applies to all tagged windows for the worktree
|
|
179
195
|
|
|
180
196
|
## Example: Multi-feature implementation
|
|
181
197
|
|
|
@@ -200,5 +216,6 @@ Each agent works independently in its own branch. Results can be reviewed and me
|
|
|
200
216
|
| `--from` / `-f` | Base ref (default: origin/main). **Use `--from HEAD` when reviewing/testing current branch!** |
|
|
201
217
|
| `--agent` | Specific agent (or `auto`): claude, aider, codex, gemini |
|
|
202
218
|
| `--agent-args` | Extra arguments for the agent |
|
|
219
|
+
| `--tmux-session` | Reuse or create a specific tmux session. For autonomous agents, prefer a unique name per launch |
|
|
203
220
|
|
|
204
221
|
@examples.md
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Using agent-cli with llama-server (llama-cpp)
|
|
2
|
+
|
|
3
|
+
This guide explains how to use agent-cli with llama-server, which provides an OpenAI-compatible API for running local LLM models.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
1. Install and set up llama-cpp with llama-server support
|
|
8
|
+
2. Download a compatible GGUF model file
|
|
9
|
+
|
|
10
|
+
## Starting llama-server
|
|
11
|
+
|
|
12
|
+
Start the llama-server with your model:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Example with a 3B parameter model
|
|
16
|
+
llama-server \
|
|
17
|
+
-m /path/to/your/model.gguf \
|
|
18
|
+
-c 2048 \
|
|
19
|
+
--host 0.0.0.0 \
|
|
20
|
+
--port 8080
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Configuration
|
|
24
|
+
|
|
25
|
+
### Option 1: Using Configuration File
|
|
26
|
+
|
|
27
|
+
Add to your `~/.config/agent-cli/config.toml` or `./agent-cli-config.toml`:
|
|
28
|
+
|
|
29
|
+
```toml
|
|
30
|
+
[defaults]
|
|
31
|
+
llm-provider = "openai"
|
|
32
|
+
llm-openai-model = "your-model-name" # Can be anything, llama-server ignores this
|
|
33
|
+
openai-base-url = "http://localhost:8080/v1"
|
|
34
|
+
# openai-api-key is not required for llama-server
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Option 2: Using Command Line
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Example: Autocorrect text
|
|
41
|
+
agent-cli autocorrect \
|
|
42
|
+
--llm-provider openai \
|
|
43
|
+
--llm-openai-model llama-3.2-3b \
|
|
44
|
+
--openai-base-url http://localhost:8080/v1
|
|
45
|
+
|
|
46
|
+
# Example: Transcribe and process audio
|
|
47
|
+
agent-cli transcribe \
|
|
48
|
+
--llm-provider openai \
|
|
49
|
+
--llm-openai-model llama-3.2-3b \
|
|
50
|
+
--openai-base-url http://localhost:8080/v1 \
|
|
51
|
+
--llm
|
|
52
|
+
|
|
53
|
+
# Example: Chat assistant
|
|
54
|
+
agent-cli chat \
|
|
55
|
+
--llm-provider openai \
|
|
56
|
+
--llm-openai-model llama-3.2-3b \
|
|
57
|
+
--openai-base-url http://localhost:8080/v1
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Notes
|
|
61
|
+
|
|
62
|
+
- The `--llm-openai-model` parameter is sent to llama-server but typically ignored (the model is already loaded)
|
|
63
|
+
- No API key is required when using llama-server
|
|
64
|
+
- Make sure the base URL includes the `/v1` suffix for OpenAI API compatibility
|
|
65
|
+
- Performance depends on your hardware and the model size
|
|
66
|
+
|
|
67
|
+
## Advantages
|
|
68
|
+
|
|
69
|
+
- Complete privacy - all processing happens locally
|
|
70
|
+
- No API costs
|
|
71
|
+
- No internet connection required (after model download)
|
|
72
|
+
- Full control over the model and parameters
|
|
73
|
+
- Can use any GGUF-compatible model
|
|
74
|
+
|
|
75
|
+
## Troubleshooting
|
|
76
|
+
|
|
77
|
+
If you encounter issues:
|
|
78
|
+
|
|
79
|
+
1. Verify llama-server is running: `curl http://localhost:8080/v1/models`
|
|
80
|
+
2. Check the llama-server logs for errors
|
|
81
|
+
3. Ensure the base URL includes `/v1` at the end
|
|
82
|
+
4. Try a simple curl test:
|
|
83
|
+
```bash
|
|
84
|
+
curl http://localhost:8080/v1/chat/completions \
|
|
85
|
+
-H "Content-Type: application/json" \
|
|
86
|
+
-d '{
|
|
87
|
+
"model": "test",
|
|
88
|
+
"messages": [{"role": "user", "content": "Hello"}]
|
|
89
|
+
}'
|
|
90
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.88.0
|
|
4
4
|
Summary: A suite of AI-powered command-line tools for text correction, audio transcription, and voice assistance.
|
|
5
5
|
Project-URL: Homepage, https://github.com/basnijholt/agent-cli
|
|
6
6
|
Author-email: Bas Nijholt <bas@nijho.lt>
|
|
@@ -4,14 +4,26 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
6
|
import subprocess
|
|
7
|
+
from dataclasses import dataclass, field
|
|
7
8
|
from typing import TYPE_CHECKING
|
|
8
9
|
|
|
9
10
|
from . import worktree
|
|
11
|
+
from .terminals.tmux import Tmux
|
|
10
12
|
|
|
11
13
|
if TYPE_CHECKING:
|
|
12
14
|
from pathlib import Path
|
|
13
15
|
|
|
14
16
|
|
|
17
|
+
@dataclass
|
|
18
|
+
class RemoveWorktreeResult:
|
|
19
|
+
"""Outcome of removing a worktree and any tagged tmux windows."""
|
|
20
|
+
|
|
21
|
+
name: str
|
|
22
|
+
success: bool
|
|
23
|
+
error: str | None = None
|
|
24
|
+
warnings: list[str] = field(default_factory=list)
|
|
25
|
+
|
|
26
|
+
|
|
15
27
|
def find_worktrees_with_no_commits(repo_root: Path) -> list[worktree.WorktreeInfo]:
|
|
16
28
|
"""Find worktrees whose branches have no commits ahead of the default branch."""
|
|
17
29
|
worktrees_list = worktree.list_worktrees()
|
|
@@ -95,18 +107,45 @@ def remove_worktrees(
|
|
|
95
107
|
repo_root: Path,
|
|
96
108
|
*,
|
|
97
109
|
force: bool = False,
|
|
98
|
-
) -> list[
|
|
110
|
+
) -> list[RemoveWorktreeResult]:
|
|
99
111
|
"""Remove a list of worktrees.
|
|
100
112
|
|
|
101
|
-
Returns
|
|
113
|
+
Returns a result for each worktree removal attempt.
|
|
102
114
|
"""
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
115
|
+
return [
|
|
116
|
+
remove_worktree(
|
|
117
|
+
wt,
|
|
118
|
+
repo_root,
|
|
107
119
|
force=force,
|
|
108
120
|
delete_branch=True,
|
|
109
|
-
repo_path=repo_root,
|
|
110
121
|
)
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
for wt in worktrees_to_remove
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def remove_worktree(
|
|
127
|
+
wt: worktree.WorktreeInfo,
|
|
128
|
+
repo_root: Path,
|
|
129
|
+
*,
|
|
130
|
+
force: bool = False,
|
|
131
|
+
delete_branch: bool = False,
|
|
132
|
+
) -> RemoveWorktreeResult:
|
|
133
|
+
"""Remove one worktree and then clean up any tagged tmux windows."""
|
|
134
|
+
removed, error = worktree.remove_worktree(
|
|
135
|
+
wt.path,
|
|
136
|
+
force=force,
|
|
137
|
+
delete_branch=delete_branch,
|
|
138
|
+
repo_path=repo_root,
|
|
139
|
+
)
|
|
140
|
+
result = RemoveWorktreeResult(
|
|
141
|
+
name=wt.branch or wt.path.name,
|
|
142
|
+
success=removed,
|
|
143
|
+
error=error,
|
|
144
|
+
)
|
|
145
|
+
if not removed:
|
|
146
|
+
return result
|
|
147
|
+
|
|
148
|
+
tmux = Tmux()
|
|
149
|
+
tmux_cleanup = tmux.kill_windows_for_worktree(wt.path)
|
|
150
|
+
result.warnings.extend(tmux_cleanup.errors)
|
|
151
|
+
return result
|
|
@@ -157,6 +157,23 @@ def _resolve_prompt_text(
|
|
|
157
157
|
return prompt
|
|
158
158
|
|
|
159
159
|
|
|
160
|
+
def _normalize_tmux_session(
|
|
161
|
+
tmux_session: str | None,
|
|
162
|
+
multiplexer: Literal["tmux"] | None,
|
|
163
|
+
) -> tuple[str | None, Literal["tmux"] | None]:
|
|
164
|
+
"""Normalize `--tmux-session` and make it imply tmux launches."""
|
|
165
|
+
if tmux_session is None:
|
|
166
|
+
return None, multiplexer
|
|
167
|
+
|
|
168
|
+
normalized_session = tmux_session.strip()
|
|
169
|
+
if not normalized_session:
|
|
170
|
+
error("--tmux-session cannot be empty")
|
|
171
|
+
if "." in normalized_session or ":" in normalized_session:
|
|
172
|
+
error("tmux session names cannot contain '.' or ':'")
|
|
173
|
+
|
|
174
|
+
return normalized_session, "tmux"
|
|
175
|
+
|
|
176
|
+
|
|
160
177
|
def _resolve_dev_new_agent_request(
|
|
161
178
|
*,
|
|
162
179
|
start_agent: bool,
|
|
@@ -440,6 +457,13 @@ def new(
|
|
|
440
457
|
help="Launch the agent in a specific multiplexer. Currently supported: tmux. When started outside tmux, creates or reuses a detached session and reports the pane handle",
|
|
441
458
|
),
|
|
442
459
|
] = None,
|
|
460
|
+
tmux_session: Annotated[
|
|
461
|
+
str | None,
|
|
462
|
+
typer.Option(
|
|
463
|
+
"--tmux-session",
|
|
464
|
+
help="Reuse or create a specific tmux session for the agent. Implies --multiplexer tmux",
|
|
465
|
+
),
|
|
466
|
+
] = None,
|
|
443
467
|
hooks: Annotated[
|
|
444
468
|
bool,
|
|
445
469
|
typer.Option(
|
|
@@ -489,6 +513,7 @@ def new(
|
|
|
489
513
|
agent_name_deprecated=agent_name_deprecated,
|
|
490
514
|
prompt=prompt,
|
|
491
515
|
)
|
|
516
|
+
tmux_session, multiplexer = _normalize_tmux_session(tmux_session, multiplexer)
|
|
492
517
|
|
|
493
518
|
repo_root = _ensure_git_repo()
|
|
494
519
|
|
|
@@ -571,6 +596,7 @@ def new(
|
|
|
571
596
|
task_file,
|
|
572
597
|
agent_env,
|
|
573
598
|
multiplexer_name=multiplexer,
|
|
599
|
+
tmux_session=tmux_session,
|
|
574
600
|
)
|
|
575
601
|
|
|
576
602
|
# Print summary
|
|
@@ -873,17 +899,19 @@ def remove(
|
|
|
873
899
|
if not typer.confirm("Continue?"):
|
|
874
900
|
raise typer.Abort
|
|
875
901
|
|
|
876
|
-
|
|
877
|
-
wt
|
|
902
|
+
result = cleanup.remove_worktree(
|
|
903
|
+
wt,
|
|
904
|
+
repo_root,
|
|
878
905
|
force=force,
|
|
879
906
|
delete_branch=delete_branch,
|
|
880
|
-
repo_path=repo_root,
|
|
881
907
|
)
|
|
882
908
|
|
|
883
|
-
if
|
|
909
|
+
if result.success:
|
|
884
910
|
success(f"Removed worktree: {wt.path}")
|
|
911
|
+
for cleanup_warning in result.warnings:
|
|
912
|
+
warn(cleanup_warning)
|
|
885
913
|
else:
|
|
886
|
-
error(
|
|
914
|
+
error(result.error or "Failed to remove worktree")
|
|
887
915
|
|
|
888
916
|
|
|
889
917
|
@app.command("path")
|
|
@@ -1018,6 +1046,13 @@ def start_agent(
|
|
|
1018
1046
|
help="Launch the agent in a specific multiplexer instead of the current terminal. Currently supported: tmux",
|
|
1019
1047
|
),
|
|
1020
1048
|
] = None,
|
|
1049
|
+
tmux_session: Annotated[
|
|
1050
|
+
str | None,
|
|
1051
|
+
typer.Option(
|
|
1052
|
+
"--tmux-session",
|
|
1053
|
+
help="Reuse or create a specific tmux session for the agent. Implies --multiplexer tmux",
|
|
1054
|
+
),
|
|
1055
|
+
] = None,
|
|
1021
1056
|
hooks: Annotated[
|
|
1022
1057
|
bool,
|
|
1023
1058
|
typer.Option(
|
|
@@ -1043,6 +1078,7 @@ def start_agent(
|
|
|
1043
1078
|
agent_name = agent_name or agent_name_deprecated
|
|
1044
1079
|
|
|
1045
1080
|
prompt = _resolve_prompt_text(prompt, prompt_file=prompt_file)
|
|
1081
|
+
tmux_session, multiplexer = _normalize_tmux_session(tmux_session, multiplexer)
|
|
1046
1082
|
|
|
1047
1083
|
repo_root = _ensure_git_repo()
|
|
1048
1084
|
|
|
@@ -1090,6 +1126,7 @@ def start_agent(
|
|
|
1090
1126
|
task_file,
|
|
1091
1127
|
agent_env,
|
|
1092
1128
|
multiplexer_name=multiplexer,
|
|
1129
|
+
tmux_session=tmux_session,
|
|
1093
1130
|
)
|
|
1094
1131
|
if handle:
|
|
1095
1132
|
info(
|
|
@@ -1367,11 +1404,13 @@ def _clean_merged_worktrees(
|
|
|
1367
1404
|
info("[dry-run] Would remove the above worktrees")
|
|
1368
1405
|
elif yes or typer.confirm("\nRemove these worktrees?"):
|
|
1369
1406
|
results = cleanup.remove_worktrees([wt for wt, _ in to_remove], repo_root, force=force)
|
|
1370
|
-
for
|
|
1371
|
-
if
|
|
1372
|
-
success(f"Removed {
|
|
1407
|
+
for result in results:
|
|
1408
|
+
if result.success:
|
|
1409
|
+
success(f"Removed {result.name}")
|
|
1410
|
+
for cleanup_warning in result.warnings:
|
|
1411
|
+
warn(cleanup_warning)
|
|
1373
1412
|
else:
|
|
1374
|
-
warn(f"Failed to remove {
|
|
1413
|
+
warn(f"Failed to remove {result.name}: {result.error}")
|
|
1375
1414
|
|
|
1376
1415
|
|
|
1377
1416
|
def _clean_no_commits_worktrees(
|
|
@@ -1401,11 +1440,13 @@ def _clean_no_commits_worktrees(
|
|
|
1401
1440
|
info("[dry-run] Would remove the above worktrees")
|
|
1402
1441
|
elif yes or typer.confirm("\nRemove these worktrees?"):
|
|
1403
1442
|
results = cleanup.remove_worktrees(to_remove, repo_root, force=force)
|
|
1404
|
-
for
|
|
1405
|
-
if
|
|
1406
|
-
success(f"Removed {
|
|
1443
|
+
for result in results:
|
|
1444
|
+
if result.success:
|
|
1445
|
+
success(f"Removed {result.name}")
|
|
1446
|
+
for cleanup_warning in result.warnings:
|
|
1447
|
+
warn(cleanup_warning)
|
|
1407
1448
|
else:
|
|
1408
|
-
warn(f"Failed to remove {
|
|
1449
|
+
warn(f"Failed to remove {result.name}: {result.error}")
|
|
1409
1450
|
|
|
1410
1451
|
|
|
1411
1452
|
@app.command("clean")
|
|
@@ -143,7 +143,7 @@ def _get_parent_process_names() -> list[str]:
|
|
|
143
143
|
- CLI tools that set process.title (like Claude) show their name directly
|
|
144
144
|
"""
|
|
145
145
|
try:
|
|
146
|
-
import psutil # noqa: PLC0415
|
|
146
|
+
import psutil # type: ignore[import-untyped] # noqa: PLC0415
|
|
147
147
|
|
|
148
148
|
process = psutil.Process(os.getpid())
|
|
149
149
|
names = []
|
|
@@ -280,6 +280,7 @@ def _launch_in_tmux(
|
|
|
280
280
|
tab_name: str,
|
|
281
281
|
repo_root: Path | None,
|
|
282
282
|
multiplexer_name: str | None,
|
|
283
|
+
tmux_session: str | None,
|
|
283
284
|
) -> TerminalHandle | None:
|
|
284
285
|
"""Launch an agent via tmux and return its pane handle."""
|
|
285
286
|
from .terminals.tmux import Tmux # noqa: PLC0415
|
|
@@ -289,8 +290,8 @@ def _launch_in_tmux(
|
|
|
289
290
|
return None
|
|
290
291
|
|
|
291
292
|
requested_tmux = multiplexer_name == "tmux"
|
|
292
|
-
session_name =
|
|
293
|
-
if requested_tmux and not terminal.detect():
|
|
293
|
+
session_name = tmux_session
|
|
294
|
+
if session_name is None and requested_tmux and not terminal.detect():
|
|
294
295
|
session_name = terminal.session_name_for_repo(repo_root or path)
|
|
295
296
|
|
|
296
297
|
handle = terminal.open_in_session(
|
|
@@ -305,7 +306,7 @@ def _launch_in_tmux(
|
|
|
305
306
|
|
|
306
307
|
session_label = (
|
|
307
308
|
f" in tmux session {handle.session_name}"
|
|
308
|
-
if requested_tmux and handle.session_name
|
|
309
|
+
if (requested_tmux or tmux_session is not None) and handle.session_name
|
|
309
310
|
else " in new tmux tab"
|
|
310
311
|
)
|
|
311
312
|
success(f"Started {agent.name}{session_label}")
|
|
@@ -320,6 +321,7 @@ def _launch_in_terminal(
|
|
|
320
321
|
tab_name: str,
|
|
321
322
|
repo_root: Path | None,
|
|
322
323
|
multiplexer_name: str | None,
|
|
324
|
+
tmux_session: str | None,
|
|
323
325
|
) -> tuple[bool, TerminalHandle | None]:
|
|
324
326
|
"""Launch an agent in the resolved terminal."""
|
|
325
327
|
if terminal.name == "tmux":
|
|
@@ -331,6 +333,7 @@ def _launch_in_terminal(
|
|
|
331
333
|
tab_name,
|
|
332
334
|
repo_root,
|
|
333
335
|
multiplexer_name,
|
|
336
|
+
tmux_session,
|
|
334
337
|
)
|
|
335
338
|
return handle is not None, handle
|
|
336
339
|
|
|
@@ -350,13 +353,15 @@ def launch_agent(
|
|
|
350
353
|
task_file: Path | None = None,
|
|
351
354
|
env: dict[str, str] | None = None,
|
|
352
355
|
multiplexer_name: str | None = None,
|
|
356
|
+
tmux_session: str | None = None,
|
|
353
357
|
) -> TerminalHandle | None:
|
|
354
358
|
"""Launch agent in a new terminal tab.
|
|
355
359
|
|
|
356
360
|
Agents are interactive TUIs that need a proper terminal.
|
|
357
361
|
Priority: tmux/zellij tab > terminal tab > print instructions.
|
|
358
362
|
"""
|
|
359
|
-
|
|
363
|
+
effective_multiplexer_name = "tmux" if tmux_session is not None else multiplexer_name
|
|
364
|
+
terminal = _resolve_launch_terminal(effective_multiplexer_name)
|
|
360
365
|
full_cmd = _build_agent_launch_command(
|
|
361
366
|
path, agent, extra_args, prompt, task_file, env, terminal
|
|
362
367
|
)
|
|
@@ -370,7 +375,8 @@ def launch_agent(
|
|
|
370
375
|
full_cmd,
|
|
371
376
|
tab_name,
|
|
372
377
|
repo_root,
|
|
373
|
-
|
|
378
|
+
effective_multiplexer_name,
|
|
379
|
+
tmux_session,
|
|
374
380
|
)
|
|
375
381
|
if launched:
|
|
376
382
|
return handle
|
|
@@ -9,7 +9,7 @@ This skill teaches you how to spawn parallel AI coding agents in isolated git wo
|
|
|
9
9
|
|
|
10
10
|
`agent-cli dev` supports two complementary patterns:
|
|
11
11
|
- Separate worktrees for isolated implementation/review tasks
|
|
12
|
-
- Multiple agents on the same worktree using `dev agent -m tmux`
|
|
12
|
+
- Multiple agents on the same worktree using `dev agent --tmux-session <unique-name>` for autonomous launches, or `-m tmux` when a human explicitly wants shared tmux windows
|
|
13
13
|
|
|
14
14
|
## Installation
|
|
15
15
|
|
|
@@ -136,17 +136,26 @@ Use this when several agents should inspect or validate the same code at once wi
|
|
|
136
136
|
# Create the worktree once. This step only prepares the shared workspace.
|
|
137
137
|
agent-cli dev new review-auth --from HEAD
|
|
138
138
|
|
|
139
|
-
# Then launch the actual agents with prompts.
|
|
140
|
-
agent-cli dev agent review-auth
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
# Then launch the actual agents with prompts. Give each agent its own tmux session.
|
|
140
|
+
agent-cli dev agent review-auth \
|
|
141
|
+
--tmux-session review-auth-security-20260402-1530 \
|
|
142
|
+
--prompt-file .claude/review-security.md
|
|
143
|
+
agent-cli dev agent review-auth \
|
|
144
|
+
--tmux-session review-auth-performance-20260402-1530 \
|
|
145
|
+
--prompt-file .claude/review-performance.md
|
|
146
|
+
agent-cli dev agent review-auth \
|
|
147
|
+
--tmux-session review-auth-tests-20260402-1530 \
|
|
148
|
+
--prompt-file .claude/review-tests.md
|
|
143
149
|
```
|
|
144
150
|
|
|
145
151
|
Key rules for same-worktree launches:
|
|
146
152
|
- Use `dev agent`, not `dev new`, after the worktree already exists
|
|
147
153
|
- Use `dev agent --agent <agent>` to select a specific agent for an existing worktree; `--with-agent` remains a deprecated alias on this subcommand
|
|
148
|
-
-
|
|
149
|
-
-
|
|
154
|
+
- For autonomous agents, prefer `--tmux-session <unique-name>` and use a different session name for each launch
|
|
155
|
+
- Reserve bare `-m tmux` for human-driven grouped windows or when the user explicitly wants agents to share one tmux session
|
|
156
|
+
- Outside tmux, bare `-m tmux` joins the deterministic repo-scoped tmux session
|
|
157
|
+
- Inside tmux, bare `-m tmux` opens a new window in the current session unless you pass `--tmux-session <name>`, which reuses or creates a specific tmux session and also implies `-m tmux`
|
|
158
|
+
- tmux session names cannot contain `.` or `:`
|
|
150
159
|
- Ask each agent to write to a unique report path such as `.claude/REPORT-security-<run-id>.md` or `.claude/REPORT-tests-<run-id>.md`
|
|
151
160
|
- If you rerun the same prompt repeatedly, include a timestamp or other run id in the report filename so later runs do not overwrite earlier ones
|
|
152
161
|
- Each agent launch gets its own unique task file in `.claude/` (e.g., `TASK-{timestamp}-{hex}.md`), so parallel launches do not overwrite each other
|
|
@@ -168,14 +177,21 @@ When complete, write findings to .claude/REPORT-security-20260319-153045-123.md
|
|
|
168
177
|
|
|
169
178
|
## Headless/scripted orchestration
|
|
170
179
|
|
|
171
|
-
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with
|
|
180
|
+
For non-interactive contexts (scripts, cron jobs, other assistants), combine `--prompt-file` with `--tmux-session`:
|
|
172
181
|
|
|
173
182
|
```bash
|
|
174
|
-
agent-cli dev new validation-a --from HEAD --agent codex
|
|
183
|
+
agent-cli dev new validation-a --from HEAD --agent codex \
|
|
184
|
+
--tmux-session validation-a-20260402-1530 \
|
|
175
185
|
--prompt-file .claude/validation-a.md
|
|
176
186
|
```
|
|
177
187
|
|
|
178
|
-
This works without an attached terminal.
|
|
188
|
+
This works without an attached terminal. For autonomous or scripted launches, prefer a unique `--tmux-session` per agent so separate runs do not trample each other by sharing one tmux session. Use bare `-m tmux` only when you explicitly want shared tmux grouping. Launches may also run pre-launch preparation by default; use `--no-hooks` only when you explicitly need to bypass that behavior.
|
|
189
|
+
|
|
190
|
+
## Cleanup behavior
|
|
191
|
+
|
|
192
|
+
- `dev rm` and `dev clean` also clean up tmux windows that `agent-cli` tagged for the worktree
|
|
193
|
+
- If git worktree removal succeeds but tmux cleanup is partial, the command warns and still removes the worktree
|
|
194
|
+
- Session isolation prevents agents from interfering with each other's tmux windows during execution, but cleanup still applies to all tagged windows for the worktree
|
|
179
195
|
|
|
180
196
|
## Example: Multi-feature implementation
|
|
181
197
|
|
|
@@ -200,5 +216,6 @@ Each agent works independently in its own branch. Results can be reviewed and me
|
|
|
200
216
|
| `--from` / `-f` | Base ref (default: origin/main). **Use `--from HEAD` when reviewing/testing current branch!** |
|
|
201
217
|
| `--agent` | Specific agent (or `auto`): claude, aider, codex, gemini |
|
|
202
218
|
| `--agent-args` | Extra arguments for the agent |
|
|
219
|
+
| `--tmux-session` | Reuse or create a specific tmux session. For autonomous agents, prefer a unique name per launch |
|
|
203
220
|
|
|
204
221
|
@examples.md
|