Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmd/aitools/telemetry.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ func agentType(name string) protos.AitoolsAgentType {
return protos.AitoolsAgentTypeGemini
case agents.NameGoose:
return protos.AitoolsAgentTypeGoose
case agents.NameKiro:
return protos.AitoolsAgentTypeKiro
default:
return protos.AitoolsAgentTypeUnspecified
}
Expand Down
14 changes: 14 additions & 0 deletions libs/aitools/agents/agents.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ const (
NamePi = "pi"
NameGemini = "gemini"
NameGoose = "goose"
NameKiro = "kiro"
)

// Databricks plugin identity, shared across the agents that ship a plugin.
Expand Down Expand Up @@ -257,6 +258,19 @@ var Registry = []*Agent{
// Goose reads agent skills (SKILL.md) but has no databricks plugin, so it is
// skills-only (Plugin nil).
},
{
Name: NameKiro,
DisplayName: "Kiro",
ConfigDir: homeSubdir(".kiro"),
SupportsProjectScope: true,
ProjectConfigDir: ".kiro",
Binary: "kiro",
// Kiro reads agent skills (SKILL.md) but has no databricks plugin, so it is
// skills-only (Plugin nil). Kiro's own picker text documents both scopes:
// "Skills can be added to ~/.kiro/skills/ (user-level) or .kiro/skills/
// (workspace-level)". Kiro is IDE-first, so `kiro` is frequently absent from
// PATH; detection then falls back to ConfigDir and reports files-only.
},
}

// piConfigDir returns Pi's agent config directory: PI_CODING_AGENT_DIR when set,
Expand Down
1 change: 1 addition & 0 deletions libs/aitools/agents/agents_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ func TestSkillsOnlyNamesMatchesRegistry(t *testing.T) {
assert.Contains(t, names, "Pi")
assert.Contains(t, names, "Gemini CLI")
assert.Contains(t, names, "Goose")
assert.Contains(t, names, "Kiro")
assert.NotContains(t, names, "Claude Code")
for _, a := range Registry {
if a.Plugin != nil {
Expand Down
5 changes: 3 additions & 2 deletions libs/aitools/agents/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ func TestSkillAgentRegistryPaths(t *testing.T) {
{NamePi, "pi", "Pi", filepath.Join(home, ".pi", "agent", "skills"), filepath.Join(cwd, ".pi", "skills")},
{NameGemini, "gemini", "Gemini CLI", filepath.Join(home, ".gemini", "skills"), filepath.Join(cwd, ".gemini", "skills")},
{NameGoose, "goose", "Goose", gooseGlobalDir, filepath.Join(cwd, ".goose", "skills")},
{NameKiro, "kiro", "Kiro", filepath.Join(home, ".kiro", "skills"), filepath.Join(cwd, ".kiro", "skills")},
}

for _, tc := range tests {
Expand All @@ -54,7 +55,7 @@ func TestSkillAgentRegistryPaths(t *testing.T) {

func TestDetectProjectInstalled(t *testing.T) {
cwd := t.TempDir()
for _, name := range []string{NamePi, NameGemini, NameGoose} {
for _, name := range []string{NamePi, NameGemini, NameGoose, NameKiro} {
dir := filepath.Join(ByName(name).ProjectSkillsDir(cwd), "databricks-core")
require.NoError(t, os.MkdirAll(dir, 0o755))
}
Expand All @@ -65,5 +66,5 @@ func TestDetectProjectInstalled(t *testing.T) {
for _, a := range DetectProjectInstalled(cwd) {
names = append(names, a.Name)
}
assert.ElementsMatch(t, []string{NamePi, NameGemini, NameGoose}, names)
assert.ElementsMatch(t, []string{NamePi, NameGemini, NameGoose, NameKiro}, names)
}
1 change: 1 addition & 0 deletions libs/aitools/installer/installer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1032,6 +1032,7 @@ func TestSupportsProjectScopeSetCorrectly(t *testing.T) {
"pi": true,
"gemini": true,
"goose": true,
"kiro": true,
}

for _, agent := range agents.Registry {
Expand Down
1 change: 1 addition & 0 deletions libs/telemetry/protos/aitools_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const (
AitoolsAgentTypePi AitoolsAgentType = "PI"
AitoolsAgentTypeGemini AitoolsAgentType = "GEMINI_CLI"
AitoolsAgentTypeGoose AitoolsAgentType = "GOOSE"
AitoolsAgentTypeKiro AitoolsAgentType = "KIRO"
)

// AitoolsInstallScope mirrors AitoolsInstallScope.Type in the databricks_cli
Expand Down