Merge pull request #572 from oksusucha/feat/add-kiro-cli-agent

feat: add Kiro CLI as AI agent

Co-authored-by: oksusucha <sol4877@gmail.com>
This commit is contained in:
lucaronin
2026-05-18 13:55:43 +02:00
17 changed files with 559 additions and 47 deletions

View File

@@ -1,6 +1,7 @@
import { ArrowUpRight, CheckCircle as CheckCircle2, CircleNotch as Loader2, Cloud, HardDrive, Robot as Bot, Terminal } from '@phosphor-icons/react'
import {
AI_AGENT_DEFINITIONS,
getAiAgentAvailability,
getAiAgentDefinition,
hasAnyInstalledAiAgent,
isAiAgentsStatusChecking,
@@ -81,7 +82,7 @@ function AgentStatusList({ statuses }: { statuses: AiAgentsStatus }) {
return (
<div className="space-y-3">
{AI_AGENT_DEFINITIONS.map((definition) => {
const status = statuses[definition.id]
const status = getAiAgentAvailability(statuses, definition.id)
const ready = status.status === 'installed'
return (
<div
@@ -113,8 +114,8 @@ export function AiAgentsOnboardingPrompt({
onContinue,
}: AiAgentsOnboardingPromptProps) {
const copy = getPromptCopy(statuses)
const showLegacyClaudeCompatibility = statuses.claude_code.status !== 'installed'
const missingAgents = AI_AGENT_DEFINITIONS.filter((definition) => statuses[definition.id].status === 'missing')
const showLegacyClaudeCompatibility = getAiAgentAvailability(statuses, 'claude_code').status !== 'installed'
const missingAgents = AI_AGENT_DEFINITIONS.filter((definition) => getAiAgentAvailability(statuses, definition.id).status === 'missing')
return (
<OnboardingShell

View File

@@ -2,6 +2,7 @@ import { Copy, Cube, Monitor, Moon, Sun, X } from '@phosphor-icons/react'
import {
AI_AGENT_DEFINITIONS,
createMissingAiAgentsStatus,
getAiAgentAvailability,
getAiAgentDefinition,
resolveDefaultAiAgent,
type AiAgentId,
@@ -939,7 +940,7 @@ function buildDefaultAiTargetOptions(
t: Translate,
): Array<{ value: string; label: string }> {
const agentOptions = AI_AGENT_DEFINITIONS.map((definition) => {
const status = aiAgentsStatus[definition.id]
const status = getAiAgentAvailability(aiAgentsStatus, definition.id)
const suffix = status.status === 'installed'
? ` (${t('settings.aiAgents.installed')}${status.version ? ` ${status.version}` : ''})`
: ` (${t('settings.aiAgents.missing')})`
@@ -1110,7 +1111,7 @@ function AiAgentsInstalledSection({
<div className="mt-1 text-xs leading-5 text-muted-foreground">{t('settings.aiAgents.installedDescription')}</div>
<div className="mt-3 grid grid-cols-2 gap-2">
{AI_AGENT_DEFINITIONS.map((definition) => {
const status = aiAgentsStatus[definition.id]
const status = getAiAgentAvailability(aiAgentsStatus, definition.id)
const installed = status.status === 'installed'
return (
<div key={definition.id} className="rounded-md border border-border bg-background px-3 py-2">
@@ -1133,7 +1134,7 @@ function AiAgentsInstalledSection({
function renderDefaultAiAgentSummary(defaultAiAgent: AiAgentId, aiAgentsStatus: AiAgentsStatus, t: Translate): string {
const definition = getAiAgentDefinition(defaultAiAgent)
const status = Reflect.get(aiAgentsStatus, defaultAiAgent) as AiAgentsStatus[AiAgentId]
const status = getAiAgentAvailability(aiAgentsStatus, defaultAiAgent)
if (status.status === 'installed') {
return t('settings.aiAgents.ready', {
agent: definition.label,

View File

@@ -2,6 +2,7 @@ import { CaretUpDown as ChevronsUpDown, Sparkle, Warning as AlertTriangle } from
import { Button } from '@/components/ui/button'
import {
AI_AGENT_DEFINITIONS,
getAiAgentAvailability,
getAiAgentDefinition,
hasAnyInstalledAiAgent,
isAiAgentInstalled,
@@ -65,7 +66,7 @@ function badgeTooltip(
if (!isAiAgentInstalled(statuses, defaultAgent)) {
return translate(locale, 'status.ai.selectedMissing', { agent: definition.label })
}
const version = (Reflect.get(statuses, defaultAgent) as AiAgentsStatus[AiAgentId]).version
const version = getAiAgentAvailability(statuses, defaultAgent).version
const base = translate(locale, 'status.ai.defaultAgent', { agent: definition.label, version: version ? ` ${version}` : '' })
if (!guidanceSummary) return base
if (vaultAiGuidanceNeedsRestore(guidanceStatus!)) {
@@ -101,7 +102,7 @@ function menuHeading(locale: AppLocale, selectedTarget: AiTarget, selectedAgentR
}
function statusText(statuses: AiAgentsStatus, definition: AiAgentDefinition): string {
const version = statuses[definition.id].version
const version = getAiAgentAvailability(statuses, definition.id).version
return version ? `${definition.label} ${version}` : definition.label
}