Add support for multiple AI coding assistants with multi-select - #20
Conversation
… tool options Convert AI coding assistant selection from single-choice (Claude Code / OpenCode / Both) to multi-select, matching the editor and SDK selection pattern. All three new tools are npm-based and auto-install Node.js if needed. Legacy config values are migrated automatically. https://claude.ai/code/session_017RbipnT7DQyQGYqZRDhgRE
There was a problem hiding this comment.
Pull request overview
Extends setup.sh’s AI coding assistant selection from a single-choice model to a multi-select model, and adds installation support for additional npm-based assistants so users can configure multiple tools in one environment.
Changes:
- Updated interactive (gum) and non-interactive prompts to support selecting multiple AI tools and storing them as comma-separated config values.
- Added install flow for GitHub Copilot CLI, Google Gemini CLI, and OpenAI Codex CLI (npm-based), including on-demand Node.js installation via nvm.
- Updated documentation to reflect multi-select behavior, new tools, alias behavior, and size/security notes.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
setup.sh |
Implements multi-select AI tool selection, loops tool installs, adds npm-based installers + Node-on-demand, and updates alias generation. |
README.md |
Documents new AI tool options, c alias behavior, disk usage estimates, and npm integrity note. |
CLAUDE.md |
Updates setup step documentation to reflect multi-tool AI assistant selection. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| done | ||
| [ -n "$c_target" ] && echo "alias c='$c_target'" | ||
| } > ~/.squarebox-ai-aliases |
There was a problem hiding this comment.
c_target is set to the config key (e.g. copilot), but Copilot is installed/detected as github-copilot-cli (command -v github-copilot-cli). If Copilot is the first selected tool, alias c='copilot' will point to a non-existent command. Map AI keys to their actual executable names (e.g. make c point to github-copilot-cli), or install/provide a copilot wrapper executable for consistency.
There was a problem hiding this comment.
@copilot can you open a github issue for this so i can explore the best fix
There was a problem hiding this comment.
I wasn't able to create the issue programmatically (the token doesn't have issues: write permission), but here's the content ready to paste into a new issue:
Title: Fix: 'c' alias for GitHub Copilot CLI points to non-existent 'copilot' command
Body:
## Bug
When GitHub Copilot CLI is selected as the highest-priority AI tool, `setup.sh` generates:
alias c='copilot'
But the executable installed by `npm install -g @githubnext/github-copilot-cli` is
`github-copilot-cli`, not `copilot`. Running `c` will fail with "command not found: copilot".
## Root Cause
`setup.sh` lines 305–315 use the internal config key (`copilot`) directly as the alias target,
without mapping it to the real executable name.
## Fix Options
1. **Map keys to executables** – add a lookup so `copilot` → `github-copilot-cli`
(e.g. a `case` statement before `echo "alias c='$c_target'"`).
2. **Install a thin `copilot` wrapper** – create `/usr/local/bin/copilot` that delegates
to `github-copilot-cli "$@"`.
3. **Detect at shell startup** – generate the alias lazily with `command -v` so it resolves
the right binary at runtime.
## Steps to Reproduce
1. Run `setup.sh` and choose only GitHub Copilot CLI (or rank it first).
2. Open a new shell.
3. Type `c` — it fails with "command not found: copilot".
Once the issue is open, option 1 (a case statement mapping keys to executable names) is the most straightforward fix and I'm happy to implement it.
| if [[ ",$sdk_current," != *",node,"* ]] && [ "$sdk_current" != "node" ]; then | ||
| echo "${sdk_current:+$sdk_current,}node" > "$sdk_cfg" | ||
| fi |
There was a problem hiding this comment.
ensure_node_for_npm mutates /workspace/.squarebox/sdks here, but later in the script the SDK selection flow overwrites the same file based on user input. That can drop the persisted node entry even when npm-based AI tools were selected/installed. Consider merging node into the final sdk_list when any npm-based AI tool is chosen, or defer writing until after the SDK prompt to avoid clobbering.
| All binary tools are pinned to specific versions and verified against SHA256 | ||
| checksums at build time. Third-party install scripts (Claude Code, uv, .NET) | ||
| manage their own binary verification. | ||
| manage their own binary verification. npm-based AI tools (Copilot CLI, Gemini | ||
| CLI, Codex CLI) use npm's built-in integrity verification. |
There was a problem hiding this comment.
The Security section still states “All binary tools are pinned to specific versions…”, but the new npm-based AI tools are installed without version pinning (e.g. npm install -g @google/gemini-cli). This makes the statement misleading. Either pin npm package versions (and document update process) or narrow the wording to distinguish pinned checksum-verified downloads from npm-installed packages.
There was a problem hiding this comment.
@copilot apply changes based on this feedback
|
Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details. Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
When GitHub Copilot CLI is selected as an AI tool (and is the highest-priority selection), alias c='copilot'However, the actual executable installed by
|
Summary
Extends the AI coding assistant setup to support selecting multiple tools simultaneously, rather than just one. Adds three new npm-based AI tools (GitHub Copilot CLI, Google Gemini CLI, OpenAI Codex CLI) alongside the existing Claude Code and OpenCode options.
Key Changes
install_node()function earlier in setup to support npm-based tools; addedensure_node_for_npm()helper to install Node.js on-demandai_choicevaluescto the first selected tool in priority order (claude → copilot → gemini → codex → opencode)Implementation Details
calias intelligently selects the first available tool from a priority orderhttps://claude.ai/code/session_017RbipnT7DQyQGYqZRDhgRE