aitools: add --scope flag, deprecate --project/--global#5234
Conversation
526cd9c to
a7e3d03
Compare
a7e3d03 to
37cf784
Compare
8f0319a to
7666312
Compare
|
👋 @simonfaltum — Claude here on James's behalf. #4917 merged earlier today, so this PR is now stacked on Ready for a re-review whenever you've got a moment. (comment posted by Claude) |
|
👋 @simonfaltum — Claude here on James's behalf. All three of your should-fix items are addressed in
(comment posted by Claude) |
Teaches list to render as a structured {release, skills[...], summary{}}
document when --output json is passed. Text rendering is unchanged.
Stacked on jb/aitools-interface (#5234). Original branch was rebased
onto current main + that PR's tip; layout drift from #4917's pre-merge
shape was reconciled (cmd/aitools/* paths, unexported listSkillsFn,
3-value installer.GetSkillsRef signature).
Co-authored-by: Isaac
simonfaltum
left a comment
There was a problem hiding this comment.
Fresh re-review after the fixup. The original findings look addressed, but I found one new update regression plus a couple of follow-ups around the deprecated flag UX.
| if scopeFlag == "" { | ||
| // Preserve the pre-refactor behavior: combining the two deprecated flags | ||
| // is always wrong, regardless of allowBoth. Users who want both scopes | ||
| // should use --scope=both (where supported). | ||
| if projectFlag && globalFlag { | ||
| return false, false, errors.New("cannot use --global and --project together") | ||
| } | ||
| return projectFlag, globalFlag, nil |
There was a problem hiding this comment.
Should-fix: this creates a new regression for aitools update --project --global. On main, resolveScopeForUpdate(ctx, true, true, ...) is the supported "update both scopes" path, and the existing resolver tests still cover that behavior. With this shared rejection in front of resolveScopeForUpdate, existing update scripts using the two deprecated flags now fail, even though the PR says the deprecated flags continue to function. Can we preserve legacy both-flag behavior for update until those flags are removed, while still rejecting it for install/list/uninstall?
| // markScopeBoolsDeprecated hides --project and --global from help and emits a | ||
| // stderr warning pointing at --scope when they're used. The booleans are kept | ||
| // so existing scripts and the experimental backward-compat aliases keep | ||
| // working through the next release. | ||
| func markScopeBoolsDeprecated(cmd *cobra.Command) { | ||
| cmd.Flags().Lookup("project").Deprecated = "use --scope=project" | ||
| cmd.Flags().Lookup("project").Hidden = true | ||
| cmd.Flags().Lookup("global").Deprecated = "use --scope=global" | ||
| cmd.Flags().Lookup("global").Hidden = true | ||
| } |
There was a problem hiding this comment.
Since this hides --project and --global, the remaining user-facing guidance should stop recommending those hidden deprecated flags. The auto-detect and not-installed errors below still say things like use --global, --project, or both flags, install --project, install --global, and Run without --project. Those should point users at --scope=project, --scope=global, or --scope=both instead, so the error messages match the new public surface.
| } | ||
| // For list: no flag = show both scopes (empty string). | ||
|
|
||
| // list: empty scope = show both. Both flags set is equivalent. |
There was a problem hiding this comment.
Nit: this comment is stale after the fixup. Both deprecated flags are now rejected by parseScopeFlag; the "both" behavior is only the empty/default scope or explicit --scope=both.
- Move the legacy `--project --global` rejection out of parseScopeFlag
and into list.go's RunE only. update preserves the supported
"update both scopes" path through resolveScopeForUpdate; install relies
on its existing resolveScope check (same error); uninstall errors
downstream via resolveScopeForUninstall.
- Rewrite user-facing error/hint messages in scope.go to point at the
new public surface (--scope=project / --scope=global / --scope=both)
instead of the now-hidden --project / --global flags.
- Fix the stale comment in list.go ("Both flags set is equivalent" was
no longer accurate after the fixup).
- Update affected tests: revert TestParseScopeFlag's legacy-both case
to passthrough; rewrite TestCrossScopeHint and the
TestScopeNotInstalledError* asserts to the new flag spellings; change
TestUpdateScopeFlag's legacy-both case to a non-error (falls through
to global without state); update TestUninstallScopeFlag's expected
error to come from resolveScopeForUninstall.
Co-authored-by: Isaac
|
👋 @simonfaltum — Claude here on James's behalf. R2 fixup in
Tests updated to match:
(comment posted by Claude) |
## Summary Promotes the **aitools skills-management surface** out of `experimental/` so the stable half lives at `databricks aitools …` and slots in next to the other top-level command groups. The matching **interface changes** (`--scope` enum, `--project`/`--global` deprecation, `--agents` auto-detect doc) live in a stacked follow-up: **#5234**. This is mostly a move, but it is not move-only — see [Non-move changes](#non-move-changes) below. - Source files for `install`, `update`, `uninstall`, `list`, `version` (and the agents/installer libs they depend on) physically move from `experimental/aitools/` to `cmd/aitools/` + `libs/aitools/`, matching the existing `cmd/apps/` + `libs/apps/` layout. OWNERS, Taskfile, and the pr-checklist skill are updated to match. - The top-level command is registered at `databricks aitools …`. - **Keeps the `tools` subtree under `experimental/aitools/`** — `query`, `discover-schema`, `get-default-warehouse`, `statement …` — because `tools.go` still says "There are no stability guarantees for these tools". - The old paths under `databricks experimental aitools install/update/uninstall/list/version` and `databricks experimental aitools skills install/list` keep working as **deprecated backward-compat aliases** that print a notice pointing at the new path (via cobra's `Deprecated` field). The aitools skills-management surface is feature-complete after the 5-PR series (#4810–#4814) that added state tracking, lifecycle commands, and project scope support. The `tools` subtree is functionally useful but its shape is still in flux, so promoting only the stable half. ## Non-move changes In addition to the file moves, this PR: - Removes the redundant `aitools/README.md` (apps/pipelines don't carry one); the same info lives in the command's Long description. - Rewrites the Long description on the new top-level `databricks aitools` command. - Adds a deprecation notice to every legacy alias under `databricks experimental aitools` (Lennart's review ask — they used to forward silently). - Refactors how the legacy `experimental aitools skills install [name]` wrapper is wired: the wrapper now lives in `cmd/aitools/legacy_skills.go` alongside the install code it wraps, and the previously-exported test-injection vars (`InstallSkillsForAgentsFn`, `ListSkillsFn`, `PromptAgentSelection`) are back to unexported. The two now-empty experimental files (`experimental/aitools/cmd/skills.go` and `skills_test.go`) are deleted. ## What's not in this PR These are deliberately separated and reviewed independently: - **#5234** — `--scope=project|global|both` flag, deprecation of `--project`/`--global` via `cobra.Deprecated`, `--agents` auto-detect help text. - **#5233** (draft) — `--output json` on `databricks aitools list`. ## Command shape after this PR ``` # Stable, top-level databricks aitools install # use --skills <name>[,<name>...] for specific skills databricks aitools update databricks aitools uninstall databricks aitools list databricks aitools version # Backward-compat aliases (print deprecation notice; point at the new paths) databricks experimental aitools install/update/uninstall/list/version databricks experimental aitools skills {list,install} # Experimental, unchanged path databricks experimental aitools tools query databricks experimental aitools tools discover-schema databricks experimental aitools tools get-default-warehouse databricks experimental aitools tools statement {submit,get,status,cancel} ``` ## Test plan - [x] `databricks aitools --help` shows install/update/uninstall/list/version (no `tools`) - [x] `databricks --help` lists `aitools` in the output - [x] `databricks experimental aitools install` prints a deprecation notice and still forwards - [x] `databricks experimental aitools tools query …` runs as before - [x] `databricks experimental aitools tools --help` lists query/discover-schema/get-default-warehouse/statement - [x] Existing aitools tests pass; the legacy-wrapper tests moved with the wrapper to `cmd/aitools/legacy_skills_test.go` This pull request was AI-assisted by Isaac. --------- Co-authored-by: simon <simon.faltum@databricks.com> Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com>
simonfaltum
left a comment
There was a problem hiding this comment.
Looks good. The earlier findings are addressed, and the changelog now preserves the unrelated main entry while documenting the new scope flag.
Teaches list to render as a structured {release, skills[...], summary{}}
document when --output json is passed. Text rendering is unchanged.
Stacked-on-#5234 rebased onto main now that #5234 has merged. The branch
state was carrying stale rehashes of the scope-flag work; squashed onto
current main to keep only the JSON-output delta.
Co-authored-by: Isaac
#5234 added a deprecation message when --global is passed; regenerate the affected aitools install goldens so the acceptance tests pass after the merge from main. Co-authored-by: Isaac
Summary
Split out from #4917. While that PR keeps responsibility for moving the aitools skills-management surface out of
experimental/, this PR makes the user-facing interface changes that should land at the same moment:--scope=project|globalflag oninstall/update/uninstall/list, with--scope=bothaccepted byupdateandlist.--projectand--globalare marked deprecated via cobra'sDeprecatedproperty: hidden from--help, emit a stderr deprecation warning when used, continue to function so existing scripts don't break. They're slated for removal in a later release.--scopecombined with--project/--globalis rejected up front with an actionable error.install's--helpnow documents the non-interactive--agentsauto-detect contract so callers know what gets picked.Stacked on #4917. Base will rebase to
mainonce that lands. Splitting because (a) #4917 is otherwise a pure file move and reviewers asked to keep it that way, and (b) the interface change has its own product question (boolean pair vs. enum) worth landing as a discrete unit.Why land this with the rename
aitools is being declared a stable top-level surface in #4917. This is the cheapest moment to fix the two-boolean shape before external scripts depend on it. An enum is also better for agent-driven invocations than two booleans with implicit precedence:
--scope=project|global|bothis one flag with valid values, not two flags with order-dependent semantics.Surface
Test plan
databricks aitools install --scope=projectand--scope=globalgo to the right destinationdatabricks aitools install --scope=botherrors with a clear messagedatabricks aitools install --projectstill works and prints the deprecation warning to stderrdatabricks aitools install --scope=global --projecterrors with the conflict messagedatabricks aitools list --scope=bothshows both scopes (equivalent to no flag)databricks aitools install --helpno longer shows--project/--global;--scopeis documented;--agentsauto-detect behavior is describedTestParseScopeFlag(table-driven on the translation),TestInstallScopeFlag,TestListScopeFlag— all greenThis pull request was AI-assisted by Isaac.