84 lines
3.6 KiB
Text
84 lines
3.6 KiB
Text
<!-- task=01_cli_capabilities_real_profiles plan=0 tag=REFACTOR -->
|
|
|
|
# CLI Capabilities를 실제 등록된 프로파일만 노출하도록 수정
|
|
|
|
## 이 파일을 읽는 구현 에이전트에게
|
|
|
|
아래 체크리스트를 순서대로 완료하고, 각 항목의 중간 검증과 최종 검증을 실제로 실행하세요. 구현이 끝나면 `agent-task/01_cli_capabilities_real_profiles/CODE_REVIEW.md`의 모든 섹션을 실제 구현 내용과 명령 출력으로 채우세요. `CODE_REVIEW.md`의 `이 파일을 읽는 리뷰 에이전트에게` 섹션에 있는 아카이브 지시(`*.log`로 이름 변경, `complete.log` 작성)는 구현 에이전트가 수행하면 안 되며, 리뷰 스킬 전용입니다.
|
|
|
|
## 배경
|
|
|
|
`apps/node/internal/adapters/cli/cli.go:25`의 `knownAgents`는 `claude/gemini/codex/opencode/cline`을 하드코딩으로 들고 있고, `Capabilities`(`cli.go:74-89`)는 이 목록을 `models`에 강제로 추가합니다. 그 결과 사용자가 실제로 등록하지 않은 agent도 capabilities로 광고되며, 그 agent로 실행을 시도하면 `unknown agent` 에러로 실패합니다. capabilities는 어댑터가 실제로 처리 가능한 모델만 반환해야 합니다.
|
|
|
|
### [REFACTOR-1] knownAgents 제거 및 Capabilities 단순화
|
|
|
|
#### 문제
|
|
|
|
`apps/node/internal/adapters/cli/cli.go:24-26`:
|
|
```go
|
|
// known agents — must match CLI tool names
|
|
var knownAgents = []string{"claude", "gemini", "codex", "opencode", "cline"}
|
|
```
|
|
|
|
`apps/node/internal/adapters/cli/cli.go:74-89`의 `Capabilities`가 위 목록을 무조건 `models`에 추가한다.
|
|
|
|
#### 해결 방법
|
|
|
|
`knownAgents` 변수와 그 처리 루프를 모두 제거하고, `Capabilities.Models`는 `c.profiles`의 키만 정렬해 반환한다.
|
|
|
|
```go
|
|
func (c *CLI) Capabilities(_ context.Context) (runtime.Capabilities, error) {
|
|
models := make([]string, 0, len(c.profiles))
|
|
for name := range c.profiles {
|
|
models = append(models, name)
|
|
}
|
|
sort.Strings(models)
|
|
return runtime.Capabilities{
|
|
AdapterName: Name,
|
|
Models: models,
|
|
MaxConcurrency: 4,
|
|
}, nil
|
|
}
|
|
```
|
|
|
|
`MaxConcurrency: 4`는 별도 작업이 없는 한 그대로 둔다(다른 어댑터와 일관).
|
|
|
|
#### 수정 파일 및 체크리스트
|
|
|
|
- [ ] `apps/node/internal/adapters/cli/cli.go`에서 `knownAgents` 변수 선언과 주석을 삭제한다.
|
|
- [ ] `Capabilities` 본체에서 `knownAgents` 루프를 제거하고 정렬된 profile 키만 반환하도록 단순화한다.
|
|
- [ ] `sort` import는 이미 존재하므로 그대로 사용한다(필요 시 확인).
|
|
|
|
#### 테스트 작성
|
|
|
|
`apps/node/internal/adapters/cli/lifecycle_blackbox_test.go`(layout cleanup 후 위치) 또는 현 위치에 다음 케이스 추가:
|
|
|
|
- `TestCapabilities_OnlyConfiguredProfiles`: 프로파일을 `{"foo": ..., "bar": ...}`로만 구성한 CLI에 대해 `Capabilities().Models`가 `["bar","foo"]`인지 단언.
|
|
- `TestCapabilities_EmptyProfilesReturnsEmptyModels`: 빈 profiles에 대해 `len(Models) == 0`인지 단언.
|
|
|
|
기존 테스트가 `knownAgents`에 있는 모델을 단언하고 있다면 모두 갱신.
|
|
|
|
#### 중간 검증
|
|
|
|
```bash
|
|
go test ./apps/node/internal/adapters/cli/...
|
|
```
|
|
|
|
예상 결과: 신규 케이스 포함 PASS.
|
|
|
|
## 수정 파일 요약
|
|
|
|
| 파일 | 항목 |
|
|
|------|------|
|
|
| `apps/node/internal/adapters/cli/cli.go` | REFACTOR-1 |
|
|
| `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go` (또는 현 위치) | REFACTOR-1 |
|
|
|
|
## 최종 검증
|
|
|
|
```bash
|
|
go build ./...
|
|
go test ./apps/node/...
|
|
rg -n 'knownAgents' apps/node/
|
|
```
|
|
|
|
예상 결과: build/test PASS, `rg`는 매치 없음.
|