Goal: Add first-class gemini-cli connector support to Apple Flow with default model gemini-3-flash-preview, wired through config, daemon...
Gemini CLI Connector Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Add first-class gemini-cli connector support to Apple Flow with default model gemini-3-flash-preview, wired through config, daemon selection, setup tooling, scripts, docs, and tests.
Architecture: Add a new stateless connector module (GeminiCliConnector) following the existing CodexCliConnector/ClaudeCliConnector design: per-turn subprocess execution, per-sender context buffer, and consistent error handling. Wire it into connector-selection surfaces (config.py, daemon.py, setup CLI tooling, and shell setup scripts) so users can choose apple_flow_connector=gemini-cli end-to-end.
Tech Stack: Python 3.11, pytest, subprocess CLI integration, Apple Flow config/daemon architecture.
Objective
Implement complete Gemini CLI support in /codex-flow so users can run Apple Flow with:
apple_flow_connector=gemini-cliapple_flow_gemini_cli_model=gemini-3-flash-preview(default)apple_flow_gemini_cli_command=gemini
while preserving existing safety, approval, and workspace constraints.
Scope Assumptions
- Gemini CLI binary exists and supports non-interactive mode via
-p/--prompt. - No due date was provided (
[due: missing value]), so this plan is prioritized as next-up but unscheduled.
Steps
- Add Gemini connector implementation
- Create:
src/apple_flow/gemini_cli_connector.py - Pattern-match behavior from:
src/apple_flow/codex_cli_connector.pysrc/apple_flow/claude_cli_connector.py
- Command shape target:
gemini --yolo -m <model> -p <prompt>
- Include:
- per-sender context window
set_soul_prompt(...)support- consistent timeout/not-found/exit-code error handling
- streaming method parity (
run_turn_streaming) with safe fallback torun_turn
- Add config fields and connector enum support
- Modify:
src/apple_flow/config.py - Add fields:
gemini_cli_command: str = "gemini"gemini_cli_context_window: int = 10gemini_cli_model: str = "gemini-3-flash-preview"
- Update connector comments/options to include
gemini-cli.
- Wire daemon connector selection and startup intro
- Modify:
src/apple_flow/daemon.py - Add import and selection branch for
gemini-cli. - Update
known_connectorsset. - Add startup intro rendering branch in
send_startup_intro():- engine line for Gemini
- model line from
settings.gemini_cli_model
- Wire setup and doctor/config tooling
- Modify:
src/apple_flow/setup_wizard.py- add Gemini in
_choose_connector() - add
apple_flow_gemini_cli_commandingenerate_env()overrides
- add Gemini in
- Modify:
src/apple_flow/cli_control.py- include
gemini-cliin_connector_command_key() - include default command mapping
- include validation allowlist and error text
- include
- Wire shell setup scripts
- Modify:
scripts/setup_autostart.shscripts/start_beginner.sh
- Add
gemini-clicase mapping:- key:
apple_flow_gemini_cli_command - default cmd:
gemini
- key:
- Update unsupported-connector messages and install/auth hints.
- Update config templates and docs
- Modify:
.env.exampleREADME.mddocs/ENV_SETUP.mddocs/QUICKSTART.md
- Add
gemini-clias a selectable connector and document default modelgemini-3-flash-preview.
- Add/extend tests
- Create:
tests/test_gemini_cli_connector.py - Mirror coverage from existing connector tests:
- protocol conformance
- command construction with/without model
- context handling and pruning
- timeout/not-found/non-zero/empty output behavior
- streaming fallback behavior
- Modify tests where connector allowlists are asserted:
tests/test_cli_control.pytests/test_setup_wizard.py
- Add config default assertions for Gemini fields in:
tests/test_config.pytests/test_config_env.py(if needed)
- Verification run
- Run:
pytest -q
- Optional smoke test (local):
- set
.envconnector to Gemini - run
python -m apple_flow daemon - verify startup intro reports Gemini engine/model.
- set
Risks
- Gemini CLI output mode variations
- Risk: output may include formatting/metadata depending on CLI version.
- Mitigation: normalize output text, handle empty output, and keep robust fallback messages.
- CLI version drift
- Risk: flags or behaviors can change across Gemini CLI versions.
- Mitigation: pin/test against current local CLI (
gemini 0.28.2) and isolate command build in one helper.
- Setup/tooling miss paths
- Risk: connector name added in daemon but missed in scripts/wizard leads to broken onboarding.
- Mitigation: update all connector allowlists in same PR and add tests for validation paths.
- Prompt/system-context parity
- Risk: Gemini lacks a dedicated system-prompt flag; behavior may differ from Claude.
- Mitigation: prepend SOUL/tools context in prompt assembly and validate with unit tests.
Done Criteria
apple_flow_connector=gemini-clistarts successfully and routes all turns throughGeminiCliConnector.- Default model is
gemini-3-flash-previewunless explicitly overridden in.env. - Setup flows (
setup_wizard,cli_control,setup_autostart.sh,start_beginner.sh) fully support Gemini selection and binary pinning. - Docs and
.env.exampleclearly document Gemini as a first-class connector option. - Connector/unit/config/tooling test coverage includes Gemini paths and
pytest -qpasses.