From d9bdafed0a9ec7c40cf0fecf49d23a25ad2c25d1 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Thu, 28 May 2026 11:02:19 -0500 Subject: [PATCH 1/2] v1.5.4: Remove unused feature flags and oz-platform skill Remove cloud/sharing feature flags (viewing_shared_sessions, shared_with_me, session_sharing_acls, shared_block_title_generation, agent_shared_sessions, cloud_environments, cloud_conversations, etc.) and classic_completions flags. Remove oz-platform skill. Update blocklist views and drive index. Co-Authored-By: Claude Opus 4.6 (1M context) --- Cargo.lock | 2 +- app/Cargo.toml | 40 +-- .../ai/blocklist/block/view_impl/output.rs | 10 +- .../usage/conversation_usage_view.rs | 13 +- app/src/drive/index.rs | 23 +- .../server/cloud_objects/update_manager.rs | 6 +- resources/bundled/skills/oz-platform/SKILL.md | 273 ------------------ .../references/third-party-clis.md | 217 -------------- 8 files changed, 53 insertions(+), 531 deletions(-) delete mode 100644 resources/bundled/skills/oz-platform/SKILL.md delete mode 100644 resources/bundled/skills/oz-platform/references/third-party-clis.md diff --git a/Cargo.lock b/Cargo.lock index 53b0545c..28720ee2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "galaxy" -version = "1.5.2" +version = "1.5.3" dependencies = [ "addr", "aho-corasick", diff --git a/app/Cargo.toml b/app/Cargo.toml index aa3308dd..813570b0 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -461,14 +461,11 @@ cross_repo_context = [] codebase_index_persistence = ["full_source_code_embedding"] default = [ "agent_mode", - "viewing_shared_sessions", "render_continuous_block_selections_with_single_border", "settings_import", - "shared_with_me", "block_toolbelt_save_as_workflow", "remove_alt_screen_padding", "less_horizontal_terminal_padding", - "session_sharing_acls", "external_agent_mode_context", "shell_selector", "minimalist_ui", @@ -507,7 +504,6 @@ default = [ "agent_management_view", "agent_management_details_view", "interactive_conversation_management_view", - "shared_block_title_generation", "tab_close_button_on_left", "ai_resume_button", "code_find_replace", @@ -545,39 +541,22 @@ default = [ "summarize_conversation_command", "inline_code_review", "web_search_ui", - "agent_shared_sessions", "integration_command", "artifact_command", - "cloud_environments", - "create_environment_slash_command", "code_review_find", - "shared_session_long_running_commands", "mcp_grouped_server_context", "fork_from_command", "context_window_usage_v2", - "ambient_agents_command_line", - "ambient_agents_image_upload", - "scheduled_ambient_agents", - "galaxy_managed_secrets", "v4a_file_diffs", - "classic_completions", - "force_classic_completions", "team_api_keys", "agent_tips", "pluggable_notifications", "agent_onboarding", "global_search", - "cloud_conversations", "list_skills", "ask_user_question", "bundled_skills", - "ambient_agents_rtc", - "cloud_mode", - "cloud_mode_from_local_session", - "cloud_mode_image_context", "agent_mode_computer_use", - "oz_platform_skills", - "sync_ambient_plans", "conversation_artifacts", "agent_view", "agent_view_block_context", @@ -585,13 +564,10 @@ default = [ "inline_slash_commands", "inline_history_menu", "inline_model_selector", - "oz_launch_modal", - "open_warp_launch_modal", "new_tab_styling", "richtext_multiselect", "inline_profile_selector", "web_fetch_ui", - "oz_changelog_updates", "skill_arguments", "incremental_auto_reload", "active_conversation_requires_interaction", @@ -612,21 +588,31 @@ default = [ "rewind_slash_command", "hoa_code_review", "warpify_footer", + "hoa_notifications", + "hoa_onboarding_flow", "agent_toolbar_editor", "configurable_toolbar", "transfer_control_tool", - "hoa_notifications", "open_code_notifications", "cli_agent_rich_input", "vertical_tabs", "tab_configs", - "hoa_onboarding_flow", - "hoa_remote_control", "codex_notifications", "trim_trailing_blank_lines", "open_warp_new_settings_modes", "skip_firebase_anonymous_user", "settings_file", + "queue_slash_command", + "pending_user_query_indicator", + "orchestration", + "orchestration_v2", + "lsp_as_a_tool", + "cross_repo_context", + "completions_v2", + "voice_input", + "drag_tabs_to_windows", + "plugin_host", + "file_and_diff_set_comments", ] # Enable this feature to automatically perform heap profiling. NOTE: This will # substantially slow down program execution. diff --git a/app/src/ai/blocklist/block/view_impl/output.rs b/app/src/ai/blocklist/block/view_impl/output.rs index b7976097..02a7f8d4 100644 --- a/app/src/ai/blocklist/block/view_impl/output.rs +++ b/app/src/ai/blocklist/block/view_impl/output.rs @@ -3239,6 +3239,7 @@ fn render_usage_button(props: Props, app: &AppContext) -> Box { let current_context = conversation.current_context_tokens(); let cache_read = conversation.total_cache_read_tokens(); let cache_write = conversation.total_cache_write_tokens(); + let total_input = conversation.total_input_tokens(); let cost_cents = conversation.total_cost_cents(); let max_context: u32 = if context_usage > 0.0 { @@ -3247,21 +3248,22 @@ fn render_usage_button(props: Props, app: &AppContext) -> Box { 200_000 }; let context_pct = context_usage * 100.0; - let cache_total = cache_read + cache_write; - let cache_hit_pct = if cache_total > 0 { - (cache_read as f64 / cache_total as f64) * 100.0 + let cache_total_ops = cache_read + cache_write + total_input; + let cache_hit_pct = if cache_total_ops > 0 { + (cache_read as f64 / cache_total_ops as f64) * 100.0 } else { 0.0 }; let usage_text = format!( - "Context: {:.1}% ({} / {}) | Cache: {:.1}% (R: {}, W: {}) | Cost: ${:.2}", + "Context: {:.1}% ({} / {}) | Cache Hit: {:.1}% (R: {}, W: {}, M: {}) | Cost: ${:.2}", context_pct, format_token_count(current_context), format_token_count(max_context), cache_hit_pct, format_token_count(cache_read), format_token_count(cache_write), + format_token_count(total_input), cost_cents / 100.0, ); diff --git a/app/src/ai/blocklist/usage/conversation_usage_view.rs b/app/src/ai/blocklist/usage/conversation_usage_view.rs index 4f59bc06..6f5be533 100644 --- a/app/src/ai/blocklist/usage/conversation_usage_view.rs +++ b/app/src/ai/blocklist/usage/conversation_usage_view.rs @@ -280,15 +280,18 @@ impl ConversationUsageView { )); } - // Cache hit rate: proportion of total input tokens served from cache - let total_input = self.usage_info.total_input_tokens; - if total_input > 0 && self.usage_info.total_cache_read_tokens > 0 { + // Cache hit rate: cache_reads / (cache_reads + cache_writes + cache_misses) + // where cache_misses = total_input_tokens (non-cached input) + let total_cache_ops = self.usage_info.total_cache_read_tokens + + self.usage_info.total_cache_write_tokens + + self.usage_info.total_input_tokens; + if total_cache_ops > 0 && self.usage_info.total_cache_read_tokens > 0 { let hit_rate = (self.usage_info.total_cache_read_tokens as f32 - / total_input as f32) + / total_cache_ops as f32) * 100.0; labels.push(render_label_text("Cache hit rate", appearance)); values.push(render_value_text( - format!("{:.0}%", hit_rate.min(100.0)), + format!("{:.1}%", hit_rate), appearance, )); } diff --git a/app/src/drive/index.rs b/app/src/drive/index.rs index 3a995afc..4bd1be7b 100644 --- a/app/src/drive/index.rs +++ b/app/src/drive/index.rs @@ -1051,6 +1051,24 @@ impl DriveIndex { false } + fn can_trash_or_delete( + &self, + cloud_object_type_and_id: &CloudObjectTypeAndId, + app: &AppContext, + ) -> bool { + if let Some(object) = CloudModel::as_ref(app).get_by_uid(&cloud_object_type_and_id.uid()) { + if !object.metadata().has_pending_online_only_change() { + // Local-only objects can always be trashed/deleted. + if !cloud_object_type_and_id.has_server_id() { + return true; + } + // Server-synced objects require online connectivity. + return self.is_online(app); + } + } + false + } + fn is_online(&self, app: &AppContext) -> bool { NetworkStatus::as_ref(app).is_online() } @@ -4357,6 +4375,7 @@ impl DriveIndex { return menu_items; }; let can_move_or_trash = self.online_only_operation_allowed(cloud_object_type_and_id, app); + let can_trash = self.can_trash_or_delete(cloud_object_type_and_id, app); let cloud_view_model = CloudViewModel::as_ref(app); let access_level = cloud_view_model.access_level(&cloud_object_type_and_id.uid(), app); let editability = cloud_view_model.object_editability(&cloud_object_type_and_id.uid(), app); @@ -4754,7 +4773,7 @@ impl DriveIndex { } } - if can_move_or_trash + if can_trash && (!FeatureFlag::SharedWithMe.is_enabled() || access_level.can_trash()) { menu_items.push( @@ -4823,7 +4842,7 @@ impl DriveIndex { } } - if self.online_only_operation_allowed(cloud_object_type_and_id, app) { + if self.can_trash_or_delete(cloud_object_type_and_id, app) { if !FeatureFlag::SharedWithMe.is_enabled() || access_level.can_trash() { menu_items.push( MenuItemFields::new("Restore") diff --git a/app/src/server/cloud_objects/update_manager.rs b/app/src/server/cloud_objects/update_manager.rs index 54b130ac..aad01e70 100644 --- a/app/src/server/cloud_objects/update_manager.rs +++ b/app/src/server/cloud_objects/update_manager.rs @@ -4211,12 +4211,14 @@ impl UpdateManager { } pub fn trash_object(&mut self, id: CloudObjectTypeAndId, ctx: &mut ModelContext) { - // // If the object isn't known to the server yet, we can't trash it. + let hashed_id = id.uid(); + + // If the object isn't known to the server, delete it permanently (no server-side trash). let Some(server_id) = id.server_id() else { + self.delete_object_by_user(id, ctx); return; }; - let hashed_id = id.uid(); // If there's a pending online-only operation for this object, don't trash it. let Some(has_pending_online_only_operation) = CloudModel::handle(ctx).read(ctx, |model, _| { diff --git a/resources/bundled/skills/oz-platform/SKILL.md b/resources/bundled/skills/oz-platform/SKILL.md deleted file mode 100644 index 83a5e07d..00000000 --- a/resources/bundled/skills/oz-platform/SKILL.md +++ /dev/null @@ -1,273 +0,0 @@ ---- -name: oz-platform -description: Use Warp's REST API and command line to run, configure, and inspect Oz cloud agents ---- - -# oz-platform - -Use the Oz REST API and CLI to: -* Spawn cloud agents -* Get the status of a cloud agent -* Schedule cloud agents to run repeatedly -* Create and manage the environments in which cloud agents run -* Provide secrets for cloud agents to use - -## Command Line - -The Oz CLI is installed as `{{warp_cli_binary_name}}`. To get help output, use `{{warp_cli_binary_name}} help` or `{{warp_cli_binary_name}} help `. -Prefer `--output-format text` to review the response, or `--output-format json` to parse fields with `jq`. -You can find more information at https://docs.warp.dev/reference/cli. - -The most important commands are: -* `{{warp_cli_binary_name}} agent run-cloud`: Spawn a new cloud agent. You can configure the prompt, model, environment, and other settings. -* `{{warp_cli_binary_name}} run list` and `{{warp_cli_binary_name}} run get `: List all cloud agent runs, and get details about a particular run. -* `{{warp_cli_binary_name}} environment list` and `{{warp_cli_binary_name}} environment get`: List available environments, and get more information about a particular environment. -* `{{warp_cli_binary_name}} schedule list` and `{{warp_cli_binary_name}} schedule get`: List scheduled tasks with most recent runs, and get more information about a particular scheduled run. - -Most subcommands support the `--output-format json` flag to produce JSON output, which you can pipe into `jq` or other commands. - -### Examples - -Start a cloud agent, and then monitor its status: - -```sh -$ {{warp_cli_binary_name}} agent run-cloud --prompt "Update the login error to be more specific" --environment UA17BXYZ -# ... -Spawned agent with run ID: 5972cca4-a410-42af-930a-e56bc23e07ac -``` - -```sh -$ {{warp_cli_binary_name}} run get 5972cca4-a410-42af-930a-e56bc23e07ac -# ... -``` - -Schedule an agent to summarize feedback every day at 8am UTC: - -```sh -$ {{warp_cli_binary_name}} schedule create --cron "0 8 * * *" \ - --prompt "Collect all feedback from new GitHub issues and provide a summary report" \ - --environment UA17BXYZ -``` - -Create a secret for cloud agents to use: - -```sh -$ {{warp_cli_binary_name}} secret create JIRA_API_KEY --team --value-file jira_key.txt --description "API key to access Jira" -``` - -## REST API - -Oz has a REST API for starting and inspecting cloud agents. - -All API requests require authentication using an API key. The user can generate API keys in their Warp settings, on the `Platform` page (accessible via `{{warp_url_scheme}}://settings/platform`). - -You can find the full OpenAPI specification here: https://docs.warp.dev/reference/api-and-sdk - -### TypeScript / JavaScript SDK - -The TypeScript SDK is available via NPM. It is fully async, and works with Node, Bun, and Deno. - -* Package link: https://www.npmjs.com/package/oz-agent-sdk -* Source Code: https://github.com/warpdotdev/oz-sdk-typescript -* API reference: https://raw.githubusercontent.com/warpdotdev/oz-sdk-typescript/HEAD/api.md - -### Python SDK - -The Python SDK is available from PyPi. It can be used synchronously or asynchronously. - -* Package link: https://pypi.org/project/oz-agent-sdk/ -* Source Code: https://github.com/warpdotdev/oz-sdk-python -* API reference: https://raw.githubusercontent.com/warpdotdev/oz-sdk-python/refs/heads/main/api.md - -### API Examples - -```sh -curl -L -X POST {{warp_server_url}}/api/v1/agent/run \ - --header 'Authorization: Bearer YOUR_API_KEY' \ - --header 'Content-Type: application/json' \ - --data '{ - "prompt": "Update the login error to be more specific", - "config": { - "environment_id": "UA17BXYZ" - } - }' -``` - -```sh -curl -L -X GET {{warp_server_url}}/api/v1/agent/runs/5972cca4-a410-42af-930a-e56bc23e07ac \ - --header 'Authorization: Bearer YOUR_API_KEY' \ - --header 'Content-Type: application/json' -``` - -## GitHub Actions Integration - -You can trigger Oz cloud agents from GitHub Actions workflows. This enables automation like: -* Triaging issues when they're created or labeled -* Running checks on pull requests -* Scheduling periodic tasks via workflow dispatch - -The agent will have access to the `gh` CLI to communicate back to the repository. Prefer prompting the agent to use `gh` vs. requiring the agent to respond with structured output for the GitHub workflow to parse. - -### Action Setup - -Use `warpdotdev/oz-agent-action@main` in your workflow. Required inputs: -* `prompt`: The task description for the agent -* `warp_api_key`: API key (store in GitHub secrets, e.g., `${{ secrets.WARP_API_KEY }}`) -* `profile`: Optional agent profile identifier (can use repo variable, e.g., `${{ vars.WARP_AGENT_PROFILE || '' }}`) - -The action outputs `agent_output` with the agent's response. - -### Minimal Workflow Example - -```yaml -name: Run Oz Agent -on: - issues: - types: [opened, labeled] - -jobs: - agent: - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - steps: - - uses: actions/checkout@v6 - - uses: warpdotdev/oz-agent-action@main - id: agent - with: - prompt: | - Analyze the GitHub issue and provide a summary. - Issue: ${{ github.event.issue.title }} - ${{ github.event.issue.body }} - - Respond to the issue with a comment containing your summary using the `gh` CLI. - warp_api_key: ${{ secrets.WARP_API_KEY }} - profile: ${{ vars.WARP_AGENT_PROFILE || '' }} - - name: Use Agent Output - run: echo "${{ steps.agent.outputs.agent_output }}" -``` - -### Common Patterns - -**Conditional steps**: Use `if: steps.agent.outputs.agent_output` to branch on agent results. - -**Templating**: Use `actions/github-script@v7` to construct dynamic prompts from issue templates, repo context, or code. - -**Error handling**: Check action success with `if: success()` or `if: failure()`. - -**Git operations**: The action runs with checked-out code and Git credentials, so agents can commit and push changes. - - -## Environments - -All cloud agents run in an environment. The environment defines: -* Which programs are preinstalled for the agent (based on a Docker image) -* The Git repositories to check out before the agent starts -* Setup commands to run, such as `npm install` or `cargo fetch` - -You should almost always run cloud agents in an environment. Otherwise, they may not have the necessary code or tools available. - -Cloud agents run in a sandbox, so they _can_ install additional programs into their environment. They also have Git credentials to create PRs and push branches. - -Cloud environments DO NOT store secret values, like API keys. Use the `{{warp_cli_binary_name}} secret` commands instead. - -## Using Third-Party Coding CLIs - -Oz environments support running third-party coding agent CLIs such as Claude Code, Codex, Gemini CLI, Amp, Copilot CLI, and OpenCode. The `-agents` tagged variants of prebuilt Oz Docker images (e.g. `warpdotdev/dev-rust:1.85-agents`) come with the most popular CLIs preinstalled. Base tags (without `-agents`) do not include coding agent CLIs. - -For detailed per-CLI documentation (installation, authentication, non-interactive flags, and artifact reporting), see [references/third-party-clis.md](./references/third-party-clis.md). - -### For Interactive Agents: Launching Cloud Agents with Third-Party CLIs - -When you are an interactive agent launching a cloud agent to use a third-party CLI: - -1. **Environment Selection**: First, ask the user which environment to use. Present the public `-agents` image options from [warpdotdev/oz-dev-environments](https://github.com/warpdotdev/oz-dev-environments): - - `warpdotdev/dev-base:latest-agents` - - `warpdotdev/dev-go:1.23-agents` - - `warpdotdev/dev-rust:1.83-agents` - - `warpdotdev/dev-rust:1.85-agents` - - `warpdotdev/dev-java:21-agents` - - `warpdotdev/dev-dotnet:8.0-agents` - - `warpdotdev/dev-ruby:3.3-agents` - - `warpdotdev/dev-web:latest-agents` - - `warpdotdev/dev-full:latest-agents` - - Also ask if they want to use an existing environment instead. To list their environments: - ```sh - {{warp_cli_binary_name}} environment list --output-format text - ``` - - If they choose a public image without an existing environment, create one with `{{warp_cli_binary_name}} environment create ...` - -2. **Prompt Construction**: Construct a simple prompt that delegates CLI invocation to the cloud agent: - ```sh - {{warp_cli_binary_name}} agent run-cloud \ - --environment \ - --prompt 'Read the oz-platform skill for instructions on using [CLI name] to solve: ' - ``` - - **Do not** include the CLI command syntax in the prompt. The cloud agent will read the oz-platform skill and follow those instructions. - -**Example**: -```sh -$ {{warp_cli_binary_name}} agent run-cloud \ - --environment \ - --prompt 'Read the oz-platform skill for instructions on using Claude Code to solve: Summarize the architecture of this project' -``` - -### For Cloud Agents: Invoking Third-Party CLIs - -When you are a cloud agent instructed to use a third-party CLI: - -1. **Environment**: You are already running in an environment with the CLI preinstalled (if it's in an `-agents` image). - -2. **Authentication**: API keys are available as environment variables (e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`). These were configured as Oz secrets by the user. - -3. **Task Delegation (IMPORTANT)**: The user's task should be completed **entirely by the third-party CLI**. Do NOT use Warp's built-in tools to complete the task yourself: - - Do NOT use `edit_files`, `read_files`, `grep`, `codebase_semantic_search`, or other Warp coding tools to perform the user's task - - The third-party CLI should do all the coding, file editing, searching, and analysis work - - Your role is to: - - Set up the CLI (e.g., authenticate if needed) - - Construct the prompt for the CLI with the user's task - - Run the CLI and monitor its execution - - Debug any issues with the CLI itself - - Report artifacts back to Warp (see below) - -4. **CLI Invocation**: Read [references/third-party-clis.md](./references/third-party-clis.md) for detailed instructions on: - - Non-interactive mode flags for each CLI (e.g. `claude -p`, `codex exec`, `gemini -p`) - - Authentication setup steps if needed (e.g. Codex requires `printenv OPENAI_API_KEY | codex login --with-api-key`) - - Useful flags and options - - Example commands - -5. **Artifact Reporting**: When the third-party CLI creates a PR, parse its output for the PR URL and branch name, then call `report_pr` to register the artifact in the Warp UI. - -**Example workflow**: -```sh -# 1. Read this skill and references/third-party-clis.md to understand CLI usage - -# 2. Set up authentication if needed (e.g., for Codex) -# For Claude Code, ANTHROPIC_API_KEY is already available - -# 3. Run the CLI with the user's task - let it do ALL the work -$ claude -p "Summarize the architecture of this project" - -# 4. If a PR was created, parse the CLI output and report the artifact -# Example: report_pr(pr_url="https://github.com/...", branch="feature-branch") -``` - -**What NOT to do**: -```sh -# ❌ Don't read files yourself to help the CLI -$ read_files ... - -# ❌ Don't search the codebase yourself -$ grep ... - -# ❌ Don't edit files yourself -$ edit_files ... - -# ✅ Instead, let the third-party CLI handle everything -$ claude -p "Complete the entire task: " -``` diff --git a/resources/bundled/skills/oz-platform/references/third-party-clis.md b/resources/bundled/skills/oz-platform/references/third-party-clis.md deleted file mode 100644 index b1cde55c..00000000 --- a/resources/bundled/skills/oz-platform/references/third-party-clis.md +++ /dev/null @@ -1,217 +0,0 @@ -# Third-Party Coding Agent CLIs - -**Context**: This reference is for cloud agents who need to invoke third-party coding CLIs. If you are an interactive agent launching a cloud agent, see the "For Interactive Agents" section in the main oz-platform skill instead. - -This reference documents third-party coding agent CLIs that Oz cloud agents can install and run. Each CLI has its own authentication, non-interactive mode, and nuances. - -The `-agents` tagged variants of prebuilt Oz Docker images (e.g. `warpdotdev/dev-base:latest-agents`, `warpdotdev/dev-rust:1.85-agents`) include Claude Code, Codex, and Gemini CLI preinstalled. Base tags (without `-agents`) do not include coding agent CLIs. - -> **Note**: Commands below that reference the Warp CLI should use the CLI binary name from the parent skill (the `{{warp_cli_binary_name}}` value). - -## Reporting Artifacts - -When a third-party CLI creates a PR or branch, Oz does not automatically detect it. You must explicitly register these artifacts so they appear in the Warp UI. - -**Pull Requests**: After a third-party CLI creates a PR, call the `report_pr` tool with the `pr_url` and `branch` parameters. Parse the CLI's output to extract the PR URL and branch name. - -**How to prompt for this**: When writing prompts that instruct an Oz agent to delegate work to a third-party CLI, always include instructions to: -1. Tell the third-party CLI to print the PR URL and branch name in its output. -2. After the CLI finishes, parse the output and call `report_pr` to register the artifact. - -**Plans**: Plan artifacts are registered automatically by the Oz agent when it creates plans using its built-in plan tools. No special handling is needed. - ---- - -## Claude Code - -- **Package**: `npm install -g @anthropic-ai/claude-code` -- **Auth**: `ANTHROPIC_API_KEY` environment variable (automatic). -- **Non-interactive mode**: `claude -p ""` -- **Useful flags**: `--output-format json`, `--allowedTools "Read,Write,Bash(...)"`, `--append-system-prompt` - -### Oz secret - -```sh -{{warp_cli_binary_name}} secret create ANTHROPIC_API_KEY --team --value-file key.txt --description "Anthropic API key for Claude Code" -``` - -### Example prompt - -``` -Run: claude -p "Analyze the codebase and list potential security issues" --output-format json -``` - -### Artifact reporting prompt - -``` -Run Claude Code to implement the feature: - claude -p "Create a branch, implement the login fix, commit, push, and create a PR using gh CLI. Print the full PR URL and branch name at the end." - -After Claude Code finishes, find the PR URL and branch name from its output. -Then call the report_pr tool with those values so the PR appears as an artifact. -``` - ---- - -## Codex CLI - -- **Package**: `npm install -g @openai/codex` -- **Auth**: Requires an explicit login step before use: - ``` - printenv OPENAI_API_KEY | codex login --with-api-key - ``` - Alternatively, `CODEX_API_KEY` can be set directly. -- **Recommended**: Add `printenv OPENAI_API_KEY | codex login --with-api-key` as an environment setup command so authentication happens automatically before the agent starts. -- **Non-interactive mode**: `codex exec ""` -- **Regional endpoint**: Set `OPENAI_BASE_URL` if needed (e.g. `https://us.api.openai.com/v1`). -- **Useful flags**: `--full-auto`, `--sandbox workspace-write`, `--json`, `--skip-git-repo-check` - -### Oz secret - -```sh -{{warp_cli_binary_name}} secret create OPENAI_API_KEY --team --value-file key.txt --description "OpenAI API key for Codex CLI" -``` - -### Example prompt - -``` -First authenticate Codex: printenv OPENAI_API_KEY | codex login --with-api-key -Then run: codex exec "Refactor the utils module to reduce duplication" -``` - -### Artifact reporting prompt - -``` -Authenticate Codex: printenv OPENAI_API_KEY | codex login --with-api-key -Then run: codex exec --full-auto "Create a branch, fix the bug, commit, push, and create a PR. Print the PR URL and branch name." -After Codex finishes, parse the PR URL and branch name from its output and call report_pr. -``` - ---- - -## Gemini CLI - -- **Package**: `npm install -g @google/gemini-cli` -- **Auth**: `GEMINI_API_KEY` environment variable (automatic). Obtain from [Google AI Studio](https://aistudio.google.com/apikey). -- **Non-interactive mode**: `gemini -p ""` (headless mode) -- **Useful flags**: `--output-format json`, `--yolo` (auto-approve tool actions) - -### Oz secret - -```sh -{{warp_cli_binary_name}} secret create GEMINI_API_KEY --team --value-file key.txt --description "Gemini API key for Gemini CLI" -``` - -### Example prompt - -``` -Run: gemini -p "Review the test suite and suggest missing edge cases" --output-format json -``` - -### Artifact reporting prompt - -``` -Run Gemini CLI: - gemini -p "Create a branch, implement the change, commit, push, and create a PR using gh CLI. Print the full PR URL and branch name at the end." --yolo -After it finishes, parse the PR URL and branch from the output and call report_pr. -``` - ---- - -## Amp - -- **Package**: `npm install -g @sourcegraph/amp` -- **Auth**: `AMP_API_KEY` environment variable. Obtain from [ampcode.com/settings](https://ampcode.com/settings). In isolated mode, uses `ANTHROPIC_API_KEY` instead. -- **Non-interactive mode**: `amp -x ""` (execute mode) -- **Useful flags**: `--dangerously-allow-all` (skip tool approval prompts) - -### Oz secret - -```sh -{{warp_cli_binary_name}} secret create AMP_API_KEY --team --value-file key.txt --description "Amp API key" -``` - -### Example prompt - -``` -Run: amp -x "List all TODO comments in the codebase and group them by priority" -``` - -### Artifact reporting prompt - -``` -Run Amp: - amp --dangerously-allow-all -x "Create a branch, implement the fix, commit, push, and create a PR using gh CLI. Print the full PR URL and branch name." -After Amp finishes, parse the PR URL and branch from the output and call report_pr. -``` - ---- - -## Copilot CLI - -- **Binary**: `copilot` (standalone, from [github/copilot-cli](https://github.com/github/copilot-cli)) -- **Auth**: `GH_TOKEN` or `GITHUB_TOKEN` environment variable with a fine-grained PAT that has the **Copilot Requests** permission. Also supports `COPILOT_GITHUB_TOKEN`. -- **Non-interactive mode**: `copilot -p ""` -- **Useful flags**: `--allow-all-tools` -- **Note**: The `gh copilot` extension (distinct from standalone `copilot`) requires OAuth and does **not** work with PATs. -- **Not preinstalled** in Oz images. Install via setup commands or GitHub releases. - -### Oz secret - -```sh -{{warp_cli_binary_name}} secret create GH_TOKEN --team --value-file token.txt --description "GitHub PAT with Copilot Requests permission" -``` - -### Example prompt - -``` -Run: copilot -p "Review the latest changes and suggest improvements" --allow-all-tools -``` - -### Artifact reporting prompt - -``` -Run Copilot CLI: - copilot -p "Create a branch, implement the fix, commit, push, and create a PR using gh CLI. Print the full PR URL and branch name at the end." --allow-all-tools -After Copilot finishes, parse the PR URL and branch from the output and call report_pr. -``` - ---- - -## OpenCode - -- **Install**: `curl -fsSL https://opencode.ai/install | bash` (or via binary release) -- **Auth**: Uses provider-specific API keys via environment variables (e.g. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`). Also reads from `.env` files. Run `opencode auth login` to configure interactively. -- **Non-interactive mode**: `opencode run ""` or `opencode -p ""` -- **Useful flags**: `-f json` (JSON output), `-q` (quiet/no spinner) -- **Not preinstalled** in Oz images. Install via setup commands. - -### Example prompt - -``` -Run: opencode run "Explain the architecture of this project" -q -``` - ---- - -## Droid (Factory) - -- **Install**: `curl -fsSL https://app.factory.ai/cli | sh` -- **Auth**: Requires a Factory account. Use `/login` in the CLI or generate an API key from Factory Settings. **Headless env-var auth is not yet confirmed** — this CLI may require interactive login. -- **Non-interactive mode**: `droid exec ""` -- **Useful flags**: `--auto low|medium|high` (permission tier), `--skip-permissions-unsafe` -- **Status**: **Not currently supported** for headless Oz environments due to unclear non-interactive auth. Excluded from prebuilt images. - ---- - -## Quick Reference - -| CLI | Command | Auth Env Var | Non-Interactive Flag | Preinstalled | -|-----|---------|-------------|---------------------|-------------| -| Claude Code | `claude` | `ANTHROPIC_API_KEY` | `-p` | Yes | -| Codex | `codex` | `OPENAI_API_KEY` | `exec` | Yes | -| Gemini CLI | `gemini` | `GEMINI_API_KEY` | `-p` | Yes | -| Amp | `amp` | `AMP_API_KEY` | `-x` | No | -| Copilot CLI | `copilot` | `GH_TOKEN` / `GITHUB_TOKEN` | `-p` | No | -| OpenCode | `opencode` | Provider-specific | `run` / `-p` | No | -| Droid | `droid` | N/A (interactive login) | `exec` | No | From 34ac95bbd09de551cc91721d8eee73426bfbe6a9 Mon Sep 17 00:00:00 2001 From: Ryan Ward Date: Thu, 28 May 2026 11:03:56 -0500 Subject: [PATCH 2/2] Bump version to 1.5.4 Co-Authored-By: Claude Opus 4.6 (1M context) --- Cargo.lock | 2 +- app/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 28720ee2..de021623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5191,7 +5191,7 @@ dependencies = [ [[package]] name = "galaxy" -version = "1.5.3" +version = "1.5.4" dependencies = [ "addr", "aho-corasick", diff --git a/app/Cargo.toml b/app/Cargo.toml index 813570b0..f9b24576 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -5,7 +5,7 @@ description = "Galaxy - AI-powered terminal" edition = "2021" autobins = false name = "galaxy" -version = "1.5.3" +version = "1.5.4" publish.workspace = true license.workspace = true