fix(welcome): gate Claude and Opencode buttons on CLI availability too

Extends the Gemini gating from bb7fb9e to the other welcome-screen
buttons that had the same problem: shown unconditionally even when the
underlying CLI isn't installed.

- Add isClaudeAvailable() (claude-cli-resolver.ts) and GET
  /api/claude/status, mirroring the existing opencode/codex/gemini
  resolvers and status endpoints.
- Opencode already had a working /api/opencode/status the welcome
  screen just wasn't checking; wire it up the same way.
- Refactor loadGeminiAvailability() into a shared
  _loadCliAvailability(buttonId, statusUrl) helper instead of
  duplicating the fetch/try-catch three times.

Run-mode dropdown entries (Opencode/Codex) are intentionally left
unconditional here — follow-up PR.
This commit is contained in:
timkjr
2026-08-04 16:22:21 -05:00
parent 62008fb408
commit 3ea1ea28f0
5 changed files with 38 additions and 5 deletions
+14 -2
View File
@@ -695,10 +695,22 @@ Object.assign(CodemanApp.prototype, {
},
async loadGeminiAvailability() {
const btn = document.getElementById('welcomeGeminiBtn');
await this._loadCliAvailability('welcomeGeminiBtn', '/api/gemini/status');
},
async loadClaudeAvailability() {
await this._loadCliAvailability('welcomeClaudeBtn', '/api/claude/status');
},
async loadOpencodeAvailability() {
await this._loadCliAvailability('welcomeOpencodeBtn', '/api/opencode/status');
},
async _loadCliAvailability(buttonId, statusUrl) {
const btn = document.getElementById(buttonId);
if (!btn) return;
try {
const res = await fetch('/api/gemini/status');
const res = await fetch(statusUrl);
const env = await res.json();
const status = env?.success === true ? env.data : env;
btn.style.display = status?.available ? 'flex' : 'none';