From a1ad51e77513a0c09af68acf007cbaa3f279b4ca Mon Sep 17 00:00:00 2001 From: Antony Prasad Thevaraj <280810845+antonyprasad-db@users.noreply.github.com> Date: Sun, 30 Aug 2026 17:07:43 -0400 Subject: [PATCH 1/3] Add Kiro to `databricks aitools install` Kiro reads agent skills from ~/.kiro/skills (user-level) and /.kiro/skills (workspace-level), each skill a directory holding a SKILL.md. Its loader requires frontmatter name and description, rejects a name longer than 64 characters or a description longer than 1024, and requires the name to match its directory. That is already what this repo emits, so Kiro needs only a registry entry. Verified on macOS with Kiro 1.0.182: all 29 stable skills written to ~/.kiro/skills are accepted by Kiro's loader. The only rejections in that directory were two deliberately malformed probes and two unrelated pre-existing skills whose frontmatter name does not match their directory. Kiro is IDE-first, so the `kiro` binary is frequently absent from PATH. Detection then falls back to ConfigDir and reports files-only, which is the correct state for a skills-only agent (Plugin nil). Also adds the telemetry enum and agentType case so Kiro installs are not logged as TYPE_UNSPECIFIED, keeping TestAgentTypeCoversRegistry green. Note the matching AitoolsAgentType value is still needed in enum.proto on the Universe side; only the CLI half is in this change. Follows the same shape as Goose (#6214), Gemini CLI (#6204) and Pi (#6199). --- cmd/aitools/telemetry.go | 2 ++ libs/aitools/agents/agents.go | 14 ++++++++++++++ libs/aitools/agents/agents_test.go | 1 + libs/aitools/agents/registry_test.go | 5 +++-- libs/aitools/installer/installer_test.go | 1 + libs/telemetry/protos/aitools_install.go | 1 + 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/cmd/aitools/telemetry.go b/cmd/aitools/telemetry.go index 09eed34f3b2..8ecf0c46542 100644 --- a/cmd/aitools/telemetry.go +++ b/cmd/aitools/telemetry.go @@ -117,6 +117,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 } diff --git a/libs/aitools/agents/agents.go b/libs/aitools/agents/agents.go index 1e54492d65e..0c6cdfcbfb2 100644 --- a/libs/aitools/agents/agents.go +++ b/libs/aitools/agents/agents.go @@ -132,6 +132,7 @@ const ( NamePi = "pi" NameGemini = "gemini" NameGoose = "goose" + NameKiro = "kiro" ) // Databricks plugin identity, shared across the agents that ship a plugin. @@ -254,6 +255,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. + }, } // claudeConfigDir follows Claude Code's configuration directory override. diff --git a/libs/aitools/agents/agents_test.go b/libs/aitools/agents/agents_test.go index 90562cf5d98..79cc0b79f58 100644 --- a/libs/aitools/agents/agents_test.go +++ b/libs/aitools/agents/agents_test.go @@ -49,6 +49,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 { diff --git a/libs/aitools/agents/registry_test.go b/libs/aitools/agents/registry_test.go index f94e2ddcc6f..20eca404cdf 100644 --- a/libs/aitools/agents/registry_test.go +++ b/libs/aitools/agents/registry_test.go @@ -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 { @@ -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)) } @@ -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) } diff --git a/libs/aitools/installer/installer_test.go b/libs/aitools/installer/installer_test.go index a0846c67fa7..47138e543fc 100644 --- a/libs/aitools/installer/installer_test.go +++ b/libs/aitools/installer/installer_test.go @@ -1032,6 +1032,7 @@ func TestSupportsProjectScopeSetCorrectly(t *testing.T) { "pi": true, "gemini": true, "goose": true, + "kiro": true, } for _, agent := range agents.Registry { diff --git a/libs/telemetry/protos/aitools_install.go b/libs/telemetry/protos/aitools_install.go index 152d599671d..a90cc22d4df 100644 --- a/libs/telemetry/protos/aitools_install.go +++ b/libs/telemetry/protos/aitools_install.go @@ -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 From 5863ce635af2ccd96d44de865b8d2f2a687cf52b Mon Sep 17 00:00:00 2001 From: Antony Prasad Thevaraj <280810845+antonyprasad-db@users.noreply.github.com> Date: Wed, 30 Sep 2026 16:51:46 -0400 Subject: [PATCH 2/3] Add the changelog fragment and Kiro coverage in the install/update tests The Goose (#6214) and Gemini CLI (#6204) precedents each ship a .nextchanges fragment plus a Kiro-equivalent assertion in cmd/aitools/install_test.go and cmd/aitools/update_test.go. This branch was missing all three. The update test also needed its fixture extended, not just an assertion: it creates .pi, .gemini and .goose project skill dirs, so DetectProjectInstalled correctly reported no Kiro until .kiro was created alongside them. The production path was never at fault. libs/aitools/agents/detect_test.go is deliberately left alone. Goose and Gemini CLI have custom config-dir resolution worth covering there (XDG_CONFIG_HOME, GOOSE_PATH_ROOT); Kiro uses a plain ~/.kiro with no env override, and registry_test.go already pins both its global and project skills paths. Co-authored-by: Isaac --- .nextchanges/cli/aitools-kiro.md | 1 + cmd/aitools/install_test.go | 1 + cmd/aitools/update_test.go | 2 ++ 3 files changed, 4 insertions(+) create mode 100644 .nextchanges/cli/aitools-kiro.md diff --git a/.nextchanges/cli/aitools-kiro.md b/.nextchanges/cli/aitools-kiro.md new file mode 100644 index 00000000000..9221cdcc338 --- /dev/null +++ b/.nextchanges/cli/aitools-kiro.md @@ -0,0 +1 @@ +* `databricks aitools install` now supports Kiro, installing Databricks agent skills into its skills directory. ([#6436](https://github.com/databricks/cli/pull/6436)) diff --git a/cmd/aitools/install_test.go b/cmd/aitools/install_test.go index 8be4b4b150a..deb25154472 100644 --- a/cmd/aitools/install_test.go +++ b/cmd/aitools/install_test.go @@ -185,6 +185,7 @@ func TestAgentChoicesOnlyOffersActionableAgents(t *testing.T) { assert.Contains(t, names, agents.NamePi) assert.Contains(t, names, agents.NameGemini) assert.Contains(t, names, agents.NameGoose) + assert.Contains(t, names, agents.NameKiro) assert.NotContains(t, names, agents.NameCursor) assert.NotContains(t, names, agents.NameCodex) assert.NotContains(t, names, agents.NameOpenCode) diff --git a/cmd/aitools/update_test.go b/cmd/aitools/update_test.go index 0167d9d751b..183cbc0205a 100644 --- a/cmd/aitools/update_test.go +++ b/cmd/aitools/update_test.go @@ -400,6 +400,7 @@ func TestUpdateProjectIncludesProjectSkillAgents(t *testing.T) { require.NoError(t, os.MkdirAll(filepath.Join(projectRoot, ".pi", "skills", "databricks-core"), 0o755)) require.NoError(t, os.MkdirAll(filepath.Join(projectRoot, ".gemini", "skills", "databricks-core"), 0o755)) require.NoError(t, os.MkdirAll(filepath.Join(projectRoot, ".goose", "skills", "databricks-core"), 0o755)) + require.NoError(t, os.MkdirAll(filepath.Join(projectRoot, ".kiro", "skills", "databricks-core"), 0o755)) ctx := cmdio.MockDiscard(t.Context()) dir, err := installer.ProjectSkillsDir(ctx) @@ -433,4 +434,5 @@ func TestUpdateProjectIncludesProjectSkillAgents(t *testing.T) { assert.Contains(t, names, agents.NamePi) assert.Contains(t, names, agents.NameGemini) assert.Contains(t, names, agents.NameGoose) + assert.Contains(t, names, agents.NameKiro) } From 071db954dcfa7a58642069ff8041e2370d1bfd86 Mon Sep 17 00:00:00 2001 From: Grigory Panov Date: Fri, 2 Oct 2026 08:27:39 +0200 Subject: [PATCH 3/3] Point changelog fragment at #6908 The nextchanges validator requires the fragment's trailing PR link to reference the PR that ships it. This branch supersedes the fork PR #6436. Co-authored-by: Isaac --- .nextchanges/cli/aitools-kiro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nextchanges/cli/aitools-kiro.md b/.nextchanges/cli/aitools-kiro.md index 9221cdcc338..a442974a2c1 100644 --- a/.nextchanges/cli/aitools-kiro.md +++ b/.nextchanges/cli/aitools-kiro.md @@ -1 +1 @@ -* `databricks aitools install` now supports Kiro, installing Databricks agent skills into its skills directory. ([#6436](https://github.com/databricks/cli/pull/6436)) +* `databricks aitools install` now supports Kiro, installing Databricks agent skills into its skills directory. ([#6908](https://github.com/databricks/cli/pull/6908))