aitools: bug bash (wording, latest-by-default skills, project-scope plan, version reporting)#5745
Merged
Merged
Conversation
2ac9769 to
837a7ad
Compare
This was referenced 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.
a617a31 to
f7b4b43
Compare
f7b4b43 to
77612a9
Compare
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
77612a9 to
be9dc54
Compare
Collaborator
Integration test reportCommit: be9dc54
21 interesting tests: 13 SKIP, 7 KNOWN, 1 RECOVERED
Top 4 slowest tests (at least 2 minutes):
|
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack
Part of the
aitoolsplugin-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: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.Changes
Wording. Everything under
databricks aitoolsnow reads "skills and plugins" (help, version output, install log); empty-state errors say "no skills or plugins installed". The legacy skills alias andexperimental aitoolsare 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:
GetSkillsRefprecedence:DATABRICKS_SKILLS_REF(exact ref, for evals), then cli-compat.json, then default latest (main).skillsfield 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).latestinstead of a stale concrete version, so list/version are honest.updatereconciles against latest when unpinned instead of falsely reporting "already up to date".Project-scope plan is honest.
buildPlanskips 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
GetSkillsRef(default latest / env pin / cli-compat pin),DisplaySkillsVersion,buildPlanproject-scope skip for files-only agents; clicompat allows thelatestsentinel.experimental/aitoolsunchanged (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.