github / github/spec-kit

Add `cli_executable` property to `IntegrationBase` for agents whose executable differs from their key

Ouverte
#2,558 1 commentaire 1 réaction 2 personnes assignées Réclamée par @mnriem Voir sur GitHub
enhancement integrations stale
Langage dominant
Python
Étoiles
137k
Forks
12.3k
Merge moyen
2 j 7 h
PR mergées (30 j)
155

Description

**Blocked by:** #2539

## Problem

The integration framework assumes `key == CLI executable name` — `shutil.which(impl.key)` is used at three detection sites. This breaks for agents like Rovo Dev where the key is `rovodev` but the executable is `acli` (invoked as `acli rovodev`).

Today there are two hardcoded special cases in `check_tool()` for similar mismatches:

- **Claude** — checks `~/.claude/local/claude` and npm-local paths outside PATH
- **kiro-cli** — falls back to `shutil.which("kiro")` when `kiro-cli` isn't found

Adding more special cases is not sustainable.

## Proposed Solution

Add a `cli_executable` property to `IntegrationBase`:

```python
@property
def cli_executable(self) -> str:
"""Executable name for CLI detection. Defaults to key."""
return self.key
```

Update the three detection sites to use it:

- `src/specify_cli/workflows/steps/command/__init__.py` — `shutil.which(impl.cli_executable)`
- `src/specify_cli/workflows/steps/prompt/__init__.py` — `shutil.which(impl.cli_executable)`
- `src/specify_cli/_utils.py` `check_tool()` — resolve integration, use `impl.cli_executable`

## Integration Overrides

**Rovodev** — executable is `acli`:
```python
@property
def cli_executable(self) -> str:
return "acli"
```

**Kiro-CLI** — override to try both names, removing the hardcoded branch in `check_tool()`:
```python
@property
def cli_executable(self) -> str:
return "kiro-cli"
```

**Claude** — local path checks move into the integration class (e.g. override an `is_cli_available()` method), removing the hardcoded branch in `check_tool()`.

## Design Note

If kiro-cli's dual-binary case and Claude's non-PATH local installs are awkward to express with a single `cli_executable` string, consider either:

- A `cli_executables` list property (check any match)
- An `is_cli_available() -> bool` method that integrations override for custom detection, with the default implementation doing `shutil.which(self.cli_executable)`

The latter is more flexible and handles Claude's path checks cleanly.

## Acceptance Criteria

- [ ] #2539 merged first (rovodev integration scaffolding)
- [ ] `cli_executable` property (or `is_cli_available()`) on `IntegrationBase`
- [ ] Three detection sites use the new mechanism
- [ ] Rovodev dispatch works with `acli` executable
- [ ] Claude and kiro-cli special cases removed from `check_tool()`
- [ ] Existing tests pass; new tests cover the override behavior
- [ ] `AGENTS.md` updated to document `cli_executable` / `is_cli_available()` override

## Context

Follow-up from #2539 (rovodev integration). The integration scaffolding merged without dispatch support; this consolidates all CLI detection into a single extensible mechanism.

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.