Skip to content

aitools: bug bash (wording, latest-by-default skills, project-scope plan, version reporting)#5745

Merged
simonfaltum merged 3 commits into
mainfrom
simonfaltum/aitools-bugbash
Jun 29, 2026
Merged

aitools: bug bash (wording, latest-by-default skills, project-scope plan, version reporting)#5745
simonfaltum merged 3 commits into
mainfrom
simonfaltum/aitools-bugbash

Conversation

@simonfaltum

@simonfaltum simonfaltum commented Jun 26, 2026

Copy link
Copy Markdown
Member

Stack

Part of the aitools plugin-first redesign. Open PRs, merge bottom to top:

Merged: #5734, #5736, #5737, #5738, #5739.

Why

Testing the built CLI surfaced several issues in databricks aitools:

  1. Inconsistent, plugin-blind copy ("AI Tools" / "AI skills") even though most agents now get a plugin.
  2. Skills pinned to a cli-compat version (e.g. 0.2.5) while plugin agents installed latest (e.g. 0.2.7). Two different versions for the same content, and list/version misreported the plugin version.
  3. Project-scope install offered files-only agents (OpenCode, Antigravity) that can't do project scope, then failed after the fact without installing anything.

Changes

Wording. Everything under databricks aitools now reads "skills and plugins" (help, version output, install log); empty-state errors say "no skills or plugins installed". The legacy skills alias and experimental aitools are untouched.

Skills track latest by default. Plugin agents' CLIs have no version flag, so they only ever install the marketplace's latest. Skills now match that:

  • GetSkillsRef precedence: DATABRICKS_SKILLS_REF (exact ref, for evals), then cli-compat.json, then default latest (main).
  • cli-compat.json is the remote safety valve: its skills field is now "latest" (track latest), but it can be edited to a concrete version to pin older CLIs after a breaking change, with no CLI release needed. AppKit version resolution is unchanged (cli-compat still pins it via its own field).
  • Plugins (and unpinned skills) report latest instead of a stale concrete version, so list/version are honest.
  • update reconciles against latest when unpinned instead of falsely reporting "already up to date".

Project-scope plan is honest. buildPlan skips files-only agents that don't support project scope (the way plugin agents already were), and the picker is scope-aware, so incompatible agents are labeled and not pre-checked. No more "offer then fail with nothing installed".

Test plan

  • Unit: GetSkillsRef (default latest / env pin / cli-compat pin), DisplaySkillsVersion, buildPlan project-scope skip for files-only agents; clicompat allows the latest sentinel.
  • Acceptance experimental/aitools unchanged (tests pin the ref via env).
  • go test ./libs/aitools/... ./cmd/aitools/... ./libs/clicompat/... passes.
  • ./task fmt-q, ./task lint-q (0 issues), ./task checks (no dead code) clean.

This pull request and its description were written by Isaac.

@simonfaltum simonfaltum force-pushed the simonfaltum/aitools-list-version branch from 2ac9769 to 837a7ad Compare June 26, 2026 18:04
@simonfaltum simonfaltum changed the title aitools: reword help and messages to "skills and plugins" aitools: bug bash — wording, latest-by-default skills, project-scope plan, version reporting Jun 26, 2026
@simonfaltum simonfaltum changed the title aitools: bug bash — wording, latest-by-default skills, project-scope plan, version reporting aitools: bug bash (wording, latest-by-default skills, project-scope plan, version reporting) Jun 26, 2026
github-merge-queue Bot pushed a commit that referenced this pull request Jun 29, 2026
<!-- aitools-stack -->
### Stack

Part of the `aitools` plugin-first redesign. Open PRs, merge bottom to
top:

- #5740 Uninstall teardown + legacy skills cleanup
- **#5741 list + version plugin state  ← this PR**
- #5745 Bug bash (wording, latest-by-default skills, project-scope plan,
version reporting)
- #5746 Bug bash round 2 (uninstall confirm, picker, Cursor, official
marketplace, version scope)

Merged: #5734, #5736, #5737, #5738, #5739.
<!-- /aitools-stack -->

## Why

`list` and `version` only knew about raw skills. Now that the CLI
installs plugins, they should report the real per-agent plugin state so
users (and the plugin's SessionStart nudge) can see what's installed and
whether it's current.

Stacked on #5740 (uninstall).

## Changes

- **`list --output json`** gains an additive `agents[]` array: each
plugin agent with a recorded install (its `version` and an `up_to_date`
/ `update_available` status, `managed: true`), plus Cursor as
`manual_add_plugin` (`managed: false`) when it's present. The existing
`release` / `skills` / `summary` keys and shapes are byte-identical
(additive `omitempty` field). The text view adds an `AGENT / STATUS`
block only when there are agent entries, leaving the skills table and
summary line unchanged.
- **`version`** prints a `Plugin (<Agent>): vX` line per recorded
plugin, and only prints the skills line when skills are actually
installed, so a plugin-only install no longer reports "0 skills".
Existing skills output is unchanged.

## Test plan

- [x] Unit tests: `list` JSON includes `agents[]` with the right
statuses/managed flags while keeping `release`/`skills`/`summary`
intact; `buildAgentEntries` maps recorded plugins to
up_to_date/update_available and surfaces Cursor as manual; `version`
prints the plugin line for a plugin-only install.
- [x] Existing `list`/`version` tests pass unchanged (JSON round-trip,
both-scopes skills output).
- [x] `go test ./libs/aitools/... ./cmd/aitools/...` passes.
- [x] `./task fmt-q`, `./task lint-q` (0 issues), `./task checks` (no
dead code) clean.

This pull request and its description were written by Isaac.
Base automatically changed from simonfaltum/aitools-list-version to main June 29, 2026 07:59
@simonfaltum simonfaltum force-pushed the simonfaltum/aitools-bugbash branch from a617a31 to f7b4b43 Compare June 29, 2026 08:56
@simonfaltum simonfaltum force-pushed the simonfaltum/aitools-bugbash branch from f7b4b43 to 77612a9 Compare June 29, 2026 09:02
The aitools command copy was inconsistent and plugin-blind: the group said
"AI Tools", subcommands variously said "AI tools" or "AI skills", and the
update/uninstall errors said "no skills installed" even though plugins can be
installed without any raw skills.

Reword everything under "databricks aitools" to "skills and plugins" (help
short/long, version output, install progress log) and make the empty-state
errors say "no skills or plugins installed". The legacy skills alias keeps its
"skills" wording, and experimental aitools (a separate command) is untouched.

Co-authored-by: Isaac
…ersions

Bug-bash fixes folded into the same PR:

- Skills now track latest by default, matching plugin agents (whose CLIs only
  ever install marketplace latest). cli-compat.json is the remote safety valve:
  its skills field is "latest" today, but can be edited to a concrete version to
  pin older CLIs after a breaking change with no CLI release. DATABRICKS_SKILLS_REF
  still forces an exact ref for evals. AppKit resolution is unchanged.
- Install no longer offers an option that fails: buildPlan skips files-only agents
  that don't support project scope (like plugin agents already are), and the picker
  is scope-aware so they aren't pre-checked. Previously project-scope install
  offered OpenCode/Antigravity then errored without installing anything.
- Plugins (and unpinned skills) report "latest" instead of a stale concrete
  version, so list/version no longer misreport.
- update reconciles against latest when unpinned instead of falsely reporting
  "already up to date".

Co-authored-by: Isaac
list previously interleaved experimental skills alphabetically with the rest and
tagged them inline. Render two groups instead: "Available skills" for the stable
set and "Experimental skills" for the experimental ones (shown only when any
exist). The list --output json shape is unchanged (each entry still carries its
experimental flag).

Co-authored-by: Isaac
@simonfaltum simonfaltum force-pushed the simonfaltum/aitools-bugbash branch from 77612a9 to be9dc54 Compare June 29, 2026 09:21
@eng-dev-ecosystem-bot

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: be9dc54

Run: 28361866272

Env 🟨​KNOWN 🔄​flaky 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
🔄​ aws linux 4 4 13 235 1035 5:26
🟨​ aws windows 7 1 13 237 1033 8:50
💚​ aws-ucws linux 8 13 319 953 4:12
💚​ aws-ucws windows 8 13 321 951 6:15
💚​ azure linux 2 15 235 1034 3:23
💚​ azure windows 2 15 237 1032 5:54
💚​ azure-ucws linux 2 15 321 950 4:52
💚​ azure-ucws windows 2 15 323 948 5:52
💚​ gcp linux 2 15 234 1036 3:08
💚​ gcp windows 2 15 236 1034 6:14
21 interesting tests: 13 SKIP, 7 KNOWN, 1 RECOVERED
Test Name aws linux aws windows aws-ucws linux aws-ucws windows azure linux azure windows azure-ucws linux azure-ucws windows gcp linux gcp windows
🟨​ TestAccept 💚​R 🟨​K 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/permissions 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions 💚​R 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🔄​f 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/with_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🔄​f 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions 💚​R 🟨​K 💚​R 💚​R 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🔄​f 🟨​K 💚​R 💚​R
🟨​ TestAccept/bundle/resources/permissions/jobs/destroy_without_mgmtperms/without_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🔄​f 🟨​K 💚​R 💚​R
🙈​ TestAccept/bundle/resources/postgres_branches/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/recreate 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/replace_existing 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/update_protected 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_branches/without_branch_id 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_endpoints/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/postgres_projects/update_display_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/synced_database_tables/basic 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
Top 4 slowest tests (at least 2 minutes):
duration env testname
5:10 gcp windows TestAccept
4:53 aws-ucws windows TestAccept
4:52 azure windows TestAccept
4:52 azure-ucws windows TestAccept

@mihaimitrea-db mihaimitrea-db left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good

@simonfaltum simonfaltum added this pull request to the merge queue Jun 29, 2026
Merged via the queue into main with commit 4f05aa3 Jun 29, 2026
26 checks passed
@simonfaltum simonfaltum deleted the simonfaltum/aitools-bugbash branch June 29, 2026 11:22
bradleyjamrozik-origindigital pushed a commit to bradleyjamrozik-origindigital/databricks-cli that referenced this pull request Jun 29, 2026
…all (databricks#5740)

<!-- aitools-stack -->
### Stack

Part of the `aitools` plugin-first redesign. Open PRs, merge bottom to
top:

- **databricks#5740 Uninstall teardown + legacy skills cleanup  ← this PR**
- databricks#5741 list + version plugin state
- databricks#5745 Bug bash (wording, latest-by-default skills, project-scope plan,
version reporting)
- databricks#5746 Bug bash round 2 (uninstall confirm, picker, Cursor, official
marketplace, version scope)

Merged: databricks#5734, databricks#5736, databricks#5737, databricks#5738, databricks#5739.
<!-- /aitools-stack -->

## Why

To finish the lifecycle: `uninstall` has to remove the plugin we
installed (not just skills), and `install` has to clean up any raw
skills a user had from the old skills-everywhere model, so a plugin
agent doesn't end up with the plugin *and* leftover loose skill files
showing the same skills twice.

Stacked on databricks#5739 (update).

## Changes

- **Uninstall tears down plugins.** On a full uninstall (no `--skills`
filter), each agent recorded in `state.Plugins` has its plugin removed
through the agent's own CLI, and the marketplace is de-registered, but
only when this CLI registered it and `--keep-marketplace` wasn't passed,
so we never remove a marketplace another plugin may share. Skills
teardown is unchanged for file agents; the state file is removed only
when no skills and no plugins remain in the scope.
- **Install cleans up legacy raw skills.** After installing the plugin
for an agent, `RemoveLegacyRawSkills` removes skill dirs the CLI
previously dropped there: a symlink pointing into our canonical dir, or
a copy whose files all match the recorded checksums. User-modified dirs,
third-party dirs, and copies with no recorded provenance are left
untouched.
- New `--keep-marketplace` flag on `uninstall`.

## Test plan

- [x] Unit tests: uninstall tears down the plugin and de-registers the
marketplace, removing the state file when nothing remains;
`--keep-marketplace` skips the de-register; `RemoveLegacyRawSkills`
removes our symlink and a checksum-matched copy while keeping a
user-modified copy and a third-party dir.
- [x] Existing skills-uninstall tests still pass byte-for-byte
("Uninstalled N skills.", selective removal, orphan cleanup, "no skills
installed").
- [x] `go test ./libs/aitools/... ./cmd/aitools/...` passes.
- [x] `./task fmt-q`, `./task lint-q` (0 issues), `./task checks` (no
dead code) clean.

This pull request and its description were written by Isaac.
bradleyjamrozik-origindigital pushed a commit to bradleyjamrozik-origindigital/databricks-cli that referenced this pull request Jun 29, 2026
… marketplace) (databricks#5746)

<!-- aitools-stack -->
### Stack

Part of the `aitools` plugin-first redesign. Open PRs, merge bottom to
top:

- databricks#5740 Uninstall teardown + legacy skills cleanup
- databricks#5741 list + version plugin state
- databricks#5745 Bug bash (wording, latest-by-default skills, project-scope plan,
version reporting)
- **databricks#5746 Bug bash round 2 (uninstall confirm, picker, Cursor, official
marketplace, version scope) ← this PR**

Merged: databricks#5734, databricks#5736, databricks#5737, databricks#5738, databricks#5739.
<!-- /aitools-stack -->

## Why

A second round of testing the plugin-first `databricks aitools` CLI.
Findings are
tracked in `documents/proposals/aitools-bugbash-findings.md`.

## Changes

- **uninstall confirms in interactive mode.** It removed skills and
de-registered
plugins immediately; now (on a TTY) it summarizes what will be removed
and asks
  "Proceed?". Non-interactive runs are unaffected.
- **version labels the scope.** Skills and plugins are now always
labeled
  global/project (e.g. `Plugin (Claude Code, global): latest`).
- **Claude installs from the official marketplace.** The databricks
plugin is in
Claude's built-in `claude-plugins-official` marketplace, so Claude
installs
  `databricks@claude-plugins-official`. A built-in marketplace (empty
PluginSpec.Source) is never added or de-registered. Codex/Copilot keep
our own
  marketplace.
- **Picker only offers actionable agents.** Every detected agent still
shows in the
detection list with its state/reason, but only agents that will do
something
(plugin or skills) are selectable; agents skipped in the scope are no
longer
  checkboxes.
- **Cursor is a plain skills agent.** Cursor was a confusing "manual,
run
/add-plugin" option that did nothing. Since the Cursor plugin can't be
installed
or interacted with headlessly, all references to it are removed: Cursor
now
installs raw skills like OpenCode/Antigravity, labeled simply "skills".
This
removed the whole manual-only concept
(PluginSpec.ManualOnly/ManualInstructions,
StateManualOnly, ReasonManualOnly, the manual_add_plugin list status,
and the
  deliveryManualCursor path).
- **Help links the source repo.** `databricks aitools` help points at
https://github.com/databricks/databricks-agent-skills so users know
where skills
  and plugins come from.

## Test plan

- [x] Unit: uninstall confirm; version scope labels; built-in
marketplace install
(no `marketplace add`) and uninstall (no de-register); picker offers
only
  actionable agents; Cursor plan = skills; no-plugin install guard.
- [x] `go test ./libs/aitools/... ./cmd/aitools/...` and acceptance
`experimental/aitools` pass.
- [x] `./task fmt-q`, `./task lint-q` (0 issues), `./task checks` (no
dead code) clean.

This pull request and its description were written by Isaac.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants