experimental/ssh: improve --help copy and surface serverless flags#5156
experimental/ssh: improve --help copy and surface serverless flags#5156TanishqDatabricks wants to merge 145 commits into
Conversation
Updates the help text for `databricks ssh`, `databricks ssh connect`, and `databricks ssh setup` based on the May 1 2026 Remote Development CUJ. - `databricks ssh`: common-workflows examples now lead with serverless (no flags), with the dedicated-cluster path as a follow-up. - `databricks ssh connect`: Long description groups example invocations by serverless vs dedicated. Unhides --name, --accelerator, --ide, --environment-version so users can discover them via --help. - `databricks ssh setup`: tightened Short/Long to clarify it's for dedicated clusters; users on serverless should just use connect. Co-authored-by: Isaac
Approval status: pending
|
…ands Co-authored-by: Isaac
…ting principal (databricks#5151) ## Summary The invariant test config used \`user_name: viewer@example.com\`, which doesn't exist in the cloud workspaces. The Permissions Set API silently drops the unknown user, so a Read after deploy returns an ACL without that entry — the no_drift invariant then sees a phantom update and the test fails on aws-prod-ucws. Pre-existing bug from databricks#4887, not caught earlier because deploy itself was failing on the 50-char endpoint name limit (databricks#5108) before reaching the no_drift check. ### Failure shape (before this fix) \`\`\` "resources.vector_search_endpoints.bar.permissions": { "action": "update", "new_state": { "value": { "__embed__": [ { "level": "CAN_USE", "user_name": "viewer@example.com" }, { "level": "CAN_MANAGE", "service_principal_name": "[USERNAME]" } ] } }, "remote_state": { "__embed__": [ { "level": "CAN_MANAGE", "service_principal_name": "[USERNAME]" } ] }, ... } \`\`\` ### Change Use \`group_name: users\` (always present in every workspace) to match the pattern used by the other \`*_with_permissions\` invariant configs (\`job_with_permissions\`, \`model_with_permissions\`, \`secret_scope_with_permissions\`). ## Test plan - [x] Local: \`go test ./acceptance -run 'TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint'\` passes - [x] Cloud: same target passes on aws-prod-ucws This pull request was AI-assisted by Isaac.
## Changes
<!-- Brief summary of your changes that is easy to understand -->
When config-remote-sync patches YAML files with remote changes, it now
restores variable references rather than always hardcoding values. This
prevents configs from losing `${var.X}` references after UI edits.
Note: There is a lot of ambiguity in how to restore the variables,
because it's not always clear what the user's intent is, and this is
hard to describe with a simple heuristic. In this PR, we make a
best-effort deterministic attempt as a first step.
Supported use cases:
1. If any field that contains a variable was changed, and new values
match this variable, we restore it. Safe guard
2. string template `/bundle/${bundle.target}/{var.foo}` case is also
supported
3. new list item of the same type is added (job param / job task) -> if
variables are used in existing items , and the field value matches the
variable, we use this variable
## Why
Improve the config-remote-sync experience for customers. We have
received feedback that customers usually have their job parameteres
defined as variables, and this PR aims to address some gaps there
## Tests
<!-- How have you tested the changes? -->
Added acceptance tests + tested integration in the workspace
<!-- If your PR needs to be included in the release notes for next
release,
add a separate entry in NEXT_CHANGELOG.md as part of your PR. -->
…atabricks#5168) ## Summary `SelectWarehouse` in `libs/databrickscfg/cfgpickers/warehouses.go` contains: ```go promptui.SearchPrompt = "Search: " ``` This assigns the package-level global to its own default. promptui declares it [here](https://github.com/manifoldco/promptui/blob/v0.9.0/select.go#L184) as `var SearchPrompt = "Search: "` — byte-identical to what we set. The line is the only write to `promptui.SearchPrompt` in the repo. It was introduced in databricks#4170 alongside the template-init warehouse picker. The original warehouse picker (`AskForWarehouse`, added in databricks#956) never had it, which suggests it's copy-paste residue rather than a deliberate override. ## Test plan - [x] `go build ./libs/databrickscfg/cfgpickers/` - [x] No behavior change expected — value matches promptui's default This pull request and its description were written by Isaac.
…databricks#5163) Bumps [github.com/google/jsonschema-go](https://github.com/google/jsonschema-go) from 0.4.2 to 0.4.3. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/google/jsonschema-go/releases">github.com/google/jsonschema-go's releases</a>.</em></p> <blockquote> <h2>v0.4.3</h2> <h2>What's Changed</h2> <ul> <li>improve anyOf errors by <a href="https://github.com/jba"><code>@jba</code></a> in <a href="https://redirect.github.com/google/jsonschema-go/pull/61">google/jsonschema-go#61</a></li> <li>fix: infer - support map with non-string key type by <a href="https://github.com/rafaeljusto"><code>@rafaeljusto</code></a> in <a href="https://redirect.github.com/google/jsonschema-go/pull/70">google/jsonschema-go#70</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/google/jsonschema-go/compare/v0.4.2...0.4.3">https://github.com/google/jsonschema-go/compare/v0.4.2...0.4.3</a></p> <h2>v0.4.3</h2> <h2>What's Changed</h2> <ul> <li>improve anyOf errors by <a href="https://github.com/jba"><code>@jba</code></a> in <a href="https://redirect.github.com/google/jsonschema-go/pull/61">google/jsonschema-go#61</a></li> <li>fix: infer - support map with non-string key type by <a href="https://github.com/rafaeljusto"><code>@rafaeljusto</code></a> in <a href="https://redirect.github.com/google/jsonschema-go/pull/70">google/jsonschema-go#70</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/google/jsonschema-go/compare/v0.4.2...v0.4.3">https://github.com/google/jsonschema-go/compare/v0.4.2...v0.4.3</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/google/jsonschema-go/commit/8c4ab4f02ef64dcea5502e47a6113e8292944087"><code>8c4ab4f</code></a> fix: infer - support map with non-string key type (<a href="https://redirect.github.com/google/jsonschema-go/issues/70">#70</a>)</li> <li><a href="https://github.com/google/jsonschema-go/commit/8bd57428bbbea55d718267fa5b20bbb59b4f9fbd"><code>8bd5742</code></a> improve anyOf errors (<a href="https://redirect.github.com/google/jsonschema-go/issues/61">#61</a>)</li> <li>See full diff in <a href="https://github.com/google/jsonschema-go/compare/v0.4.2...0.4.3">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#5086) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.35.0 to 0.36.0. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/golang/text/commit/8577a70117e110160c45f32af0e0df84eef844f7"><code>8577a70</code></a> go.mod: update golang.org/x dependencies</li> <li>See full diff in <a href="https://github.com/golang/text/compare/v0.35.0...v0.36.0">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…5085) Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.34.0 to 0.35.0. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/golang/mod/commit/03901d351deb5bd95deb90714fb75bf8e232cb22"><code>03901d3</code></a> go.mod: update golang.org/x dependencies</li> <li>See full diff in <a href="https://github.com/golang/mod/compare/v0.34.0...v0.35.0">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…atabricks#5087) Bumps [github.com/mattn/go-isatty](https://github.com/mattn/go-isatty) from 0.0.20 to 0.0.21. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mattn/go-isatty/commit/4237fb15069af3284b50e5d91bcdd5403e584605"><code>4237fb1</code></a> Update Go test matrix to current versions (1.24-1.26)</li> <li><a href="https://github.com/mattn/go-isatty/commit/433c12b4c9fae46e4a42ac50d6d716325dc1dfba"><code>433c12b</code></a> Update GitHub Actions to latest versions</li> <li><a href="https://github.com/mattn/go-isatty/commit/1cf5589a67b03170478da248b107c10185ec558c"><code>1cf5589</code></a> Add wasip1 and wasip2 to build constraints in isatty_others.go</li> <li><a href="https://github.com/mattn/go-isatty/commit/1237245029e6b02f17caa944c946c6f51d384e8b"><code>1237245</code></a> Update dependencies: go 1.15 -> 1.21, golang.org/x/sys v0.6.0 -> v0.28.0</li> <li><a href="https://github.com/mattn/go-isatty/commit/ac9c88d7970a4a6690f8560b6ff20b595beb4e34"><code>ac9c88d</code></a> Fix typo in comment: undocomented -> undocumented</li> <li><a href="https://github.com/mattn/go-isatty/commit/8b7124ee585ccf9c0b3b3246b7c6a27bce54ab6f"><code>8b7124e</code></a> Add availability check for NtQueryObject in init</li> <li><a href="https://github.com/mattn/go-isatty/commit/08d031358be30f9ba82961c1971e22ae4a584f98"><code>08d0313</code></a> Fix isCygwinPipeName to reject names with extra trailing tokens</li> <li>See full diff in <a href="https://github.com/mattn/go-isatty/compare/v0.0.20...v0.0.21">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…ks#5084) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.49.0 to 0.50.0. <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/golang/crypto/commit/03ca0dcccbd37ba6be80adf74dde8d78a4d72817"><code>03ca0dc</code></a> go.mod: update golang.org/x dependencies</li> <li><a href="https://github.com/golang/crypto/commit/8400f4a938077a7a7817ab7d163d148e371b320b"><code>8400f4a</code></a> ssh: respect signer's algorithm preference in pickSignatureAlgorithm</li> <li><a href="https://github.com/golang/crypto/commit/81c6cb34a8fc386ed53293cd79e3c0c232ee7366"><code>81c6cb3</code></a> ssh: swap cbcMinPaddingSize to cbcMinPacketSize to get encLength</li> <li>See full diff in <a href="https://github.com/golang/crypto/compare/v0.49.0...v0.50.0">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…actions/setup-build-environment (databricks#5157) Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/setup-uv/releases">astral-sh/setup-uv's releases</a>.</em></p> <blockquote> <h2>v8.1.0 🌈 New input <code>no-project</code></h2> <h2>Changes</h2> <p>This add the a new boolean input <code>no-project</code>. It only makes sense to use in combination with <code>activate-environment: true</code> and will append <code>--no project</code> to the <code>uv venv</code> call. This is for example useful <a href="https://redirect.github.com/astral-sh/setup-uv/issues/854">if you have a pyproject.toml file with parts unparseable by uv</a></p> <h2>🚀 Enhancements</h2> <ul> <li>Add input no-project in combination with activate-environment <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/856">#856</a>)</li> </ul> <h2>🧰 Maintenance</h2> <ul> <li>fix: grant contents:write to validate-release job <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/860">#860</a>)</li> <li>Add a release-gate step to the release workflow <a href="https://github.com/zanieb"><code>@zanieb</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/859">#859</a>)</li> <li>Draft commitish releases <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/858">#858</a>)</li> <li>Add action-types.yml to instructions <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/857">#857</a>)</li> <li>chore: update known checksums for 0.11.7 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/853">#853</a>)</li> <li>Refactor version resolving <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/852">#852</a>)</li> <li>chore: update known checksums for 0.11.6 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/850">#850</a>)</li> <li>chore: update known checksums for 0.11.5 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/845">#845</a>)</li> <li>chore: update known checksums for 0.11.4 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/843">#843</a>)</li> <li>Add a release workflow <a href="https://github.com/zanieb"><code>@zanieb</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/839">#839</a>)</li> <li>chore: update known checksums for 0.11.3 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/836">#836</a>)</li> </ul> <h2>📚 Documentation</h2> <ul> <li>Update ignore-nothing-to-cache documentation <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/833">#833</a>)</li> <li>Pin setup-uv docs to v8 <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/829">#829</a>)</li> </ul> <h2>⬆️ Dependency updates</h2> <ul> <li>chore(deps): bump release-drafter/release-drafter from 7.1.1 to 7.2.0 @<a href="https://github.com/apps/dependabot">dependabot[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/855">#855</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/setup-uv/commit/08807647e7069bb48b6ef5acd8ec9567f424441b"><code>0880764</code></a> fix: grant contents:write to validate-release job (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/860">#860</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/717d6aba0f15312f509f5c4999e34d71ecbab8a9"><code>717d6ab</code></a> Add a release-gate step to the release workflow (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/859">#859</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/5a911eb3a3983b5e650f2dad95c1ce698ca94378"><code>5a911eb</code></a> Draft commitish releases (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/858">#858</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/080c31e04cd7155b0ca676d08c7bc260a4476a23"><code>080c31e</code></a> Add action-types.yml to instructions (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/857">#857</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/b3e97d2ba1a1eed7e9d1f8456dd06c3b725bc3a6"><code>b3e97d2</code></a> Add input no-project in combination with activate-environment (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/856">#856</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/7dd591db9557f680290587fcc578372813b9ff64"><code>7dd591d</code></a> chore(deps): bump release-drafter/release-drafter from 7.1.1 to 7.2.0 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/855">#855</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/1541b7762698877904805605192ecd63d0e4787a"><code>1541b77</code></a> chore: update known checksums for 0.11.7 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/853">#853</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/cdfb2ee6dde255817c739680168ad81e184c4bfb"><code>cdfb2ee</code></a> Refactor version resolving (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/852">#852</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/cb84d12dc6a0d495b82fcae14fa4559b90698660"><code>cb84d12</code></a> chore: update known checksums for 0.11.6 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/850">#850</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/1912cc65f2e839707d7a16f2372f30b57d35fd80"><code>1912cc6</code></a> chore: update known checksums for 0.11.5 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/845">#845</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/setup-uv/compare/cec208311dfd045dd5311c1add060b2062131d57...08807647e7069bb48b6ef5acd8ec9567f424441b">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…workflows (databricks#5161) Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.0.0 to 8.1.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/setup-uv/releases">astral-sh/setup-uv's releases</a>.</em></p> <blockquote> <h2>v8.1.0 🌈 New input <code>no-project</code></h2> <h2>Changes</h2> <p>This add the a new boolean input <code>no-project</code>. It only makes sense to use in combination with <code>activate-environment: true</code> and will append <code>--no project</code> to the <code>uv venv</code> call. This is for example useful <a href="https://redirect.github.com/astral-sh/setup-uv/issues/854">if you have a pyproject.toml file with parts unparseable by uv</a></p> <h2>🚀 Enhancements</h2> <ul> <li>Add input no-project in combination with activate-environment <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/856">#856</a>)</li> </ul> <h2>🧰 Maintenance</h2> <ul> <li>fix: grant contents:write to validate-release job <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/860">#860</a>)</li> <li>Add a release-gate step to the release workflow <a href="https://github.com/zanieb"><code>@zanieb</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/859">#859</a>)</li> <li>Draft commitish releases <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/858">#858</a>)</li> <li>Add action-types.yml to instructions <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/857">#857</a>)</li> <li>chore: update known checksums for 0.11.7 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/853">#853</a>)</li> <li>Refactor version resolving <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/852">#852</a>)</li> <li>chore: update known checksums for 0.11.6 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/850">#850</a>)</li> <li>chore: update known checksums for 0.11.5 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/845">#845</a>)</li> <li>chore: update known checksums for 0.11.4 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/843">#843</a>)</li> <li>Add a release workflow <a href="https://github.com/zanieb"><code>@zanieb</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/839">#839</a>)</li> <li>chore: update known checksums for 0.11.3 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/836">#836</a>)</li> </ul> <h2>📚 Documentation</h2> <ul> <li>Update ignore-nothing-to-cache documentation <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/833">#833</a>)</li> <li>Pin setup-uv docs to v8 <a href="https://github.com/eifinger"><code>@eifinger</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/829">#829</a>)</li> </ul> <h2>⬆️ Dependency updates</h2> <ul> <li>chore(deps): bump release-drafter/release-drafter from 7.1.1 to 7.2.0 @<a href="https://github.com/apps/dependabot">dependabot[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/855">#855</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/setup-uv/commit/08807647e7069bb48b6ef5acd8ec9567f424441b"><code>0880764</code></a> fix: grant contents:write to validate-release job (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/860">#860</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/717d6aba0f15312f509f5c4999e34d71ecbab8a9"><code>717d6ab</code></a> Add a release-gate step to the release workflow (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/859">#859</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/5a911eb3a3983b5e650f2dad95c1ce698ca94378"><code>5a911eb</code></a> Draft commitish releases (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/858">#858</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/080c31e04cd7155b0ca676d08c7bc260a4476a23"><code>080c31e</code></a> Add action-types.yml to instructions (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/857">#857</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/b3e97d2ba1a1eed7e9d1f8456dd06c3b725bc3a6"><code>b3e97d2</code></a> Add input no-project in combination with activate-environment (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/856">#856</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/7dd591db9557f680290587fcc578372813b9ff64"><code>7dd591d</code></a> chore(deps): bump release-drafter/release-drafter from 7.1.1 to 7.2.0 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/855">#855</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/1541b7762698877904805605192ecd63d0e4787a"><code>1541b77</code></a> chore: update known checksums for 0.11.7 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/853">#853</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/cdfb2ee6dde255817c739680168ad81e184c4bfb"><code>cdfb2ee</code></a> Refactor version resolving (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/852">#852</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/cb84d12dc6a0d495b82fcae14fa4559b90698660"><code>cb84d12</code></a> chore: update known checksums for 0.11.6 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/850">#850</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/1912cc65f2e839707d7a16f2372f30b57d35fd80"><code>1912cc6</code></a> chore: update known checksums for 0.11.5 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/845">#845</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/setup-uv/compare/cec208311dfd045dd5311c1add060b2062131d57...08807647e7069bb48b6ef5acd8ec9567f424441b">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… in /.github/workflows (databricks#5158) Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 8.1.0 to 8.1.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/peter-evans/create-pull-request/releases">peter-evans/create-pull-request's releases</a>.</em></p> <blockquote> <h2>Create Pull Request v8.1.1</h2> <h2>What's Changed</h2> <ul> <li>build(deps-dev): bump the npm group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4305">peter-evans/create-pull-request#4305</a></li> <li>build(deps): bump minimatch by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4311">peter-evans/create-pull-request#4311</a></li> <li>build(deps): bump the github-actions group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4316">peter-evans/create-pull-request#4316</a></li> <li>build(deps): bump <code>@tootallnate/once</code> and jest-environment-jsdom by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4323">peter-evans/create-pull-request#4323</a></li> <li>build(deps-dev): bump undici from 6.23.0 to 6.24.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4328">peter-evans/create-pull-request#4328</a></li> <li>build(deps-dev): bump flatted from 3.3.1 to 3.4.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4334">peter-evans/create-pull-request#4334</a></li> <li>build(deps): bump picomatch by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4339">peter-evans/create-pull-request#4339</a></li> <li>build(deps-dev): bump handlebars from 4.7.8 to 4.7.9 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4344">peter-evans/create-pull-request#4344</a></li> <li>build(deps-dev): bump the npm group with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4349">peter-evans/create-pull-request#4349</a></li> <li>fix: retry post-creation API calls on 422 eventual consistency errors by <a href="https://github.com/peter-evans"><code>@peter-evans</code></a> in <a href="https://redirect.github.com/peter-evans/create-pull-request/pull/4356">peter-evans/create-pull-request#4356</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/peter-evans/create-pull-request/compare/v8.1.0...v8.1.1">https://github.com/peter-evans/create-pull-request/compare/v8.1.0...v8.1.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/peter-evans/create-pull-request/commit/5f6978faf089d4d20b00c7766989d076bb2fc7f1"><code>5f6978f</code></a> fix: retry post-creation API calls on 422 eventual consistency errors (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4356">#4356</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/d32e88dac789dcc7906e7d26f69f24116fa9c97d"><code>d32e88d</code></a> build(deps-dev): bump the npm group with 3 updates (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4349">#4349</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/8170bccad11c0df62542c04dcaefe36d342dfd39"><code>8170bcc</code></a> build(deps-dev): bump handlebars from 4.7.8 to 4.7.9 (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4344">#4344</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/00418193b417f888dbf1d993c5c0d31d27fdc7de"><code>0041819</code></a> build(deps): bump picomatch (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4339">#4339</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/b993918c8536b6d44706130734d5456879762b27"><code>b993918</code></a> build(deps-dev): bump flatted from 3.3.1 to 3.4.2 (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4334">#4334</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/36d7c8468b48f9c2f8f29e260e82f10d4b90d2bd"><code>36d7c84</code></a> build(deps-dev): bump undici from 6.23.0 to 6.24.0 (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4328">#4328</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/a45d1fb447fcaf601166e405fd4f335cde1a8aa8"><code>a45d1fb</code></a> build(deps): bump <code>@tootallnate/once</code> and jest-environment-jsdom (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4323">#4323</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/3499eb61835cc0015c0b786e203d74b1e8f55e43"><code>3499eb6</code></a> build(deps): bump the github-actions group with 2 updates (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4316">#4316</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/3f3b473b8c148f5a7520efb4d1f9a70eea3d9d1f"><code>3f3b473</code></a> build(deps): bump minimatch (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4311">#4311</a>)</li> <li><a href="https://github.com/peter-evans/create-pull-request/commit/6699836a213cf8b28c4f0408a404a6ac79d4458a"><code>6699836</code></a> build(deps-dev): bump the npm group with 2 updates (<a href="https://redirect.github.com/peter-evans/create-pull-request/issues/4305">#4305</a>)</li> <li>See full diff in <a href="https://github.com/peter-evans/create-pull-request/compare/c0f553fe549906ede9cf27b5156039d195d2ece0...5f6978faf089d4d20b00c7766989d076bb2fc7f1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… /.github/workflows (databricks#5159) Bumps [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) from 7.0.0 to 7.1.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/goreleaser/goreleaser-action/releases">goreleaser/goreleaser-action's releases</a>.</em></p> <blockquote> <h2>v7.1.0</h2> <h2>What's Changed</h2> <ul> <li>feat: verify release checksum and cosign signature by <a href="https://github.com/caarlos0"><code>@caarlos0</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/550">goreleaser/goreleaser-action#550</a></li> <li>docs: document cosign verification in README by <a href="https://github.com/caarlos0"><code>@caarlos0</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/553">goreleaser/goreleaser-action#553</a></li> <li>docs: Upgrade import GPG action version by <a href="https://github.com/flecno"><code>@flecno</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/547">goreleaser/goreleaser-action#547</a></li> <li>ci: drop docker-bake in favor of plain npm by <a href="https://github.com/caarlos0"><code>@caarlos0</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/551">goreleaser/goreleaser-action#551</a></li> <li>ci: add release-major-tag workflow by <a href="https://github.com/caarlos0"><code>@caarlos0</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/552">goreleaser/goreleaser-action#552</a></li> <li>ci: drop pre-cosign-v3 goreleaser versions from tests by <a href="https://github.com/caarlos0"><code>@caarlos0</code></a> in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/554">goreleaser/goreleaser-action#554</a></li> <li>ci(deps): bump the actions group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/543">goreleaser/goreleaser-action#543</a></li> <li>ci(deps): bump the actions group with 5 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/546">goreleaser/goreleaser-action#546</a></li> <li>chore(deps): bump undici from 6.23.0 to 6.24.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/545">goreleaser/goreleaser-action#545</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/flecno"><code>@flecno</code></a> made their first contribution in <a href="https://redirect.github.com/goreleaser/goreleaser-action/pull/547">goreleaser/goreleaser-action#547</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/goreleaser/goreleaser-action/compare/v7...v7.1.0">https://github.com/goreleaser/goreleaser-action/compare/v7...v7.1.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/e24998b8b67b290c2fa8b7c14fcfa7de2c5c9b8c"><code>e24998b</code></a> ci: drop pre-cosign-v3 goreleaser versions from tests (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/554">#554</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/be2e8a39ba2f6daed623e98e8b6662f008cffc8d"><code>be2e8a3</code></a> docs: document cosign verification in README (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/553">#553</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/5e53f8eea2783e9a9b5963dafae20a7e5320618c"><code>5e53f8e</code></a> ci: add release-major-tag workflow (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/552">#552</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/4068afa2f0763491214b56d83686409cb4549b8c"><code>4068afa</code></a> build: drop docker-bake in favor of plain npm (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/551">#551</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/213ec80f5629fd53743a07c81b86deb4c540955f"><code>213ec80</code></a> docs: add CONTRIBUTING with pre-commit workflow</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/4b462d3d1d45d4d31bca90093b38fe2a060674ef"><code>4b462d3</code></a> feat: verify release checksum and cosign signature (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/550">#550</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/01cbe076be10ba0af7b0b9319ac490a93d3d2fcd"><code>01cbe07</code></a> docs: Upgrade import GPG action version (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/547">#547</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/2a473d70e30d651e68b912d1e1d86e01f3a558b4"><code>2a473d7</code></a> ci(deps): bump the actions group with 5 updates (<a href="https://redirect.github.com/goreleaser/goreleaser-action/issues/546">#546</a>)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/fdcf0b9df926c8dd93d4e7f15c508dd346e09eb1"><code>fdcf0b9</code></a> clean: leftover files from node 22(?)</li> <li><a href="https://github.com/goreleaser/goreleaser-action/commit/9881cc53763f713ec5df8d0f4ed575fa41085847"><code>9881cc5</code></a> fix: use new static URL</li> <li>Additional commits viewable in <a href="https://github.com/goreleaser/goreleaser-action/compare/ec59f474b9834571250b370d4735c50f8e2d1e29...e24998b8b67b290c2fa8b7c14fcfa7de2c5c9b8c">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…thub/workflows (databricks#5160) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.0 to 7.0.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/upload-artifact/releases">actions/upload-artifact's releases</a>.</em></p> <blockquote> <h2>v7.0.1</h2> <h2>What's Changed</h2> <ul> <li>Update the readme with direct upload details by <a href="https://github.com/danwkennedy"><code>@danwkennedy</code></a> in <a href="https://redirect.github.com/actions/upload-artifact/pull/795">actions/upload-artifact#795</a></li> <li>Readme: bump all the example versions to v7 by <a href="https://github.com/danwkennedy"><code>@danwkennedy</code></a> in <a href="https://redirect.github.com/actions/upload-artifact/pull/796">actions/upload-artifact#796</a></li> <li>Include changes in typespec/ts-http-runtime 0.3.5 by <a href="https://github.com/yacaovsnc"><code>@yacaovsnc</code></a> in <a href="https://redirect.github.com/actions/upload-artifact/pull/797">actions/upload-artifact#797</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/upload-artifact/compare/v7...v7.0.1">https://github.com/actions/upload-artifact/compare/v7...v7.0.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/upload-artifact/commit/043fb46d1a93c77aae656e7c1c64a875d1fc6a0a"><code>043fb46</code></a> Merge pull request <a href="https://redirect.github.com/actions/upload-artifact/issues/797">#797</a> from actions/yacaovsnc/update-dependency</li> <li><a href="https://github.com/actions/upload-artifact/commit/634250c1388765ea7ed0f053e636f1f399000b94"><code>634250c</code></a> Include changes in typespec/ts-http-runtime 0.3.5</li> <li><a href="https://github.com/actions/upload-artifact/commit/e454baaac2be505c9450e11b8f3215c6fc023ce8"><code>e454baa</code></a> Readme: bump all the example versions to v7 (<a href="https://redirect.github.com/actions/upload-artifact/issues/796">#796</a>)</li> <li><a href="https://github.com/actions/upload-artifact/commit/74fad66b98a6d799dc004d3353ccd0e6f6b2530e"><code>74fad66</code></a> Update the readme with direct upload details (<a href="https://redirect.github.com/actions/upload-artifact/issues/795">#795</a>)</li> <li>See full diff in <a href="https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
## Why
`databricks api` always sent the workspace routing identifier
(`X-Databricks-Org-Id`) when the profile had one, even when the path was
an account API. On unified hosts (one host serving both workspace and
account APIs) this misrouted account calls. There was also no way to
explicitly route a call to the account API or override the identifier
per call.
## Changes
Before: routing was decided once from the profile and applied to every
call.
Now: routing is decided per call from the path being requested.
- Paths under `/accounts/{id}/` are auto-detected as account-scope; the
routing identifier is dropped.
- A small hand-written list in `cmd/api/paths.go` carves out
workspace-routed proxy APIs that happen to live under `/accounts/`, so
they keep the identifier.
- `--account` forces account-scope on a non-`/accounts/` path.
- `--workspace-id <id>` overrides the identifier per call. Mutually
exclusive with `--account`.
- `?o=<id>` on the path (the SPOG URL convention used by the Databricks
UI) is recognized as a per-call workspace override, so URLs pasted from
the browser route correctly.
- The CLI-only `workspace_id = none` sentinel is stripped before the
routing decision so the literal "none" never goes on the wire.
Routing logic lives in pure functions (`hasAccountSegment`,
`extractOrgIDFromQuery`, `resolveOrgID`, `normalizeWorkspaceID`,
`isWorkspaceProxyPath`) that take primitives. The cobra `RunE` is a thin
adapter that resolves config and calls them.
## Test plan
- [x] `go test ./cmd/api` covers the helpers with table-driven cases:
deny-list hits and misses, query/fragment edge cases, mutual-exclusion
errors, sentinel stripping, `?o=` extraction.
- [x] `go test ./acceptance -run TestAccept/cmd/api` exercises seven
variants end to end against terraform and direct engines: workspace
path, account path, deny-listed proxy under `/accounts/`, `--account`,
`--workspace-id`, `?o=` query, `workspace_id = none`. Each test asserts
header presence/absence explicitly via `print_requests.py |
contains.py`.
- [x] `make checks`
## Changes Drop `github.com/nwidger/jsoncolor` and replace `fancyJSON` with a small in-tree colorizer over `json.MarshalIndent` output. Same ANSI palette as before (green strings, cyan numbers, bold-green `true`, red `false`, magenta `null`, bold-blue keys). `defaultRenderer.renderJson` now gates colorization on cmdio TTY/color capabilities; `pretty_json` template helper stays on `!color.NoColor` for parity with the other helpers in `renderFuncMap`. ## Why `fancyJSON` was the last caller of `nwidger/jsoncolor`, and it was the only thing forcing `fatih/color.Color` values across a package boundary. Removing it unblocks a future `fatih/color` migration and replaces the incidental "color is off because fatih's package init saw stdout isn't a TTY" gating with explicit cmdio capability checks. ## Tests - Unit tests in `libs/cmdio/jsoncolor_test.go` cover string/number/literal tokens, escape sequences, key vs value, empty containers, and a round-trip property test (stripping ANSI yields the original bytes). - Manual smoke: `databricks current-user me -o json` on a TTY shows the same colors as before; piped or `NO_COLOR=1` produces plain JSON. _PR description drafted with Claude Code._
## PR Stack 1. **PR 1 (this PR)** — [databricks#5135](databricks#5135) — scaffold + autoscaling targeting + text output 2. [databricks#5136](databricks#5136) — PR 2: provisioned + JSON/CSV streaming + typed values 3. [databricks#5138](databricks#5138) — PR 3: multi-input + multi-statement rejection + error formatting 4. [databricks#5143](databricks#5143) — PR 4: cancellation + timeout + TUI ## Why Talking to Lakebase Postgres from a script today goes through one of two unpleasant paths: 1. **Shell out to `databricks psql -- -c "SQL"`.** Works on macOS / Linux when psql is installed. Fails on Windows 11 by default and on minimal containers / sandboxed CI. No JSON / CSV. 2. **Write Python with `psycopg`.** Forces every consumer to manage OAuth tokens, SSL mode, autocommit, etc. This series adds a third path: a native CLI command that runs SQL against any Lakebase endpoint, returns results in text/JSON/CSV (later PRs), and works without a system psql. `databricks psql` keeps owning the interactive REPL surface; this PR does **not** touch psql. ## Changes **Before:** No CLI command runs SQL against Lakebase from Go. Users either shell out to `psql` (requires the system binary) or write `psycopg` glue. **Now:** `databricks experimental postgres query --target projects/foo/branches/main/endpoints/primary "SELECT 1"` returns a text-rendered result. Provisioned instances and richer output formats land in follow-up PRs. The experimental command is fully contained under `experimental/postgres/cmd/`: - `experimental/postgres/cmd/cmd.go`, `query.go`, `targeting.go`, `connect.go`, `execute.go`, `render.go` — command implementation. - `experimental/postgres/cmd/internal/target/` — Lakebase target resolution helpers (parsing, SDK wrappers, auto-select-when-exactly-one). Internal sub-package so it can't accidentally be imported from outside the experiment. When/if this command graduates from experimental, that's the right time to consider extracting to `libs/`. Single positional SQL, autoscaling targeting only (`--target`, `--project`, `--branch`, `--endpoint`), `--max-retries`, `--connect-timeout`, `--database`. Driver is `github.com/jackc/pgx/v5 v5.9.1` (MIT). Connect retry uses a typed predicate (08xxx SQLSTATE family + `57P03` cannot_connect_now + `net.OpError` with `Op == "dial"`); auth (28xxx) and permission (42501) errors do not retry. Text rendering is buffered (no streaming yet); rows-producing vs command-only is decided at runtime via `FieldDescriptions()`. Outside the experimental tree, this PR only: - Registers the command in `cmd/experimental/experimental.go` (2 lines). - Adds the pgx direct dependency (`go.mod` SPDX annotation, `NOTICE` entry, `NEXT_CHANGELOG.md` dependency-updates entry). `pgx` is already a direct dep of the universe monorepo's Lakebase services; aligning here keeps the SDK surface consistent. ## Test plan - [x] `go test ./experimental/postgres/...` (target parsing, validateTargeting, retry classification, render) - [x] `go test ./internal/build/...` (license + NOTICE completeness) - [x] `go tool ... golangci-lint run ./experimental/postgres/...` (0 issues) - [x] `./task checks` (whitespace, links, deadcode)
…g + types (databricks#5136) ## PR Stack 1. [databricks#5135](databricks#5135) — PR 1: scaffold + autoscaling targeting + text output 2. **PR 2 (this PR)** — [databricks#5136](databricks#5136) — provisioned + JSON/CSV streaming + typed values + `experimental/libs/sqlcli` for output handling 3. [databricks#5138](databricks#5138) — PR 3: multi-input + multi-statement rejection + error formatting 4. [databricks#5143](databricks#5143) — PR 4: cancellation + timeout + TUI Stacked on PR 1. ## Why Two things in this PR. The user-facing one: postgres query learns JSON/CSV streaming and provisioned-instance support. The architectural one: aitools query and postgres query had near-identical output-mode handling (same env var, same flag/env precedence, same threshold). Promote the duplication to a shared `experimental/libs/sqlcli` package before the second consumer ossifies the divergence. ## Changes **Architectural:** `experimental/libs/sqlcli/` is a new package under `experimental/libs/` (not `libs/`) so it inherits the experimental-stability guarantee of its consumers. Exposes: - `sqlcli.EnvOutputFormat`, `sqlcli.StaticTableThreshold` constants. - `sqlcli.Format` typedef + `sqlcli.OutputText/JSON/CSV` consts + `sqlcli.AllFormats`. - `sqlcli.ResolveFormat` — flag > env > default precedence with the explicit-text-on-pipe-is-honoured rule. aitools query migrates to use sqlcli (pure refactor, no behavior change). postgres query was about to add its own copy of all of this; instead it uses sqlcli from day one. **User-facing changes for postgres query:** - `--target my-instance` now resolves a provisioned instance. - `--output json` streams typed values: numbers stay numeric, jsonb stays nested, NaN/Inf/bigints-outside-2^53 become strings. - `--output csv` streams (no buffering). - `DATABRICKS_OUTPUT_FORMAT` honoured. - Auto-fallback to JSON when stdout is piped. - Duplicate column names get deterministic `__N` suffixes with a stderr warning. Also adds `cmdio.IsOutputTTY` (a small public wrapper around the existing private `isTTY`) so commands can ask "is stdout a terminal?" without folding in `NO_COLOR` / `TERM=dumb` (both of which `cmdio.SupportsColor` ANDs in for the colour-rendering decision). ## Test plan - [x] `go test ./experimental/aitools/... ./experimental/postgres/... ./experimental/libs/...` (unit, sinks, value mapping, format selection, aitools tests still pass after migration) - [x] `go tool ... golangci-lint run ./experimental/...` (0 issues)
…atabricks#5138) ## PR Stack 1. [databricks#5135](databricks#5135) — PR 1: scaffold + autoscaling targeting + text output 2. [databricks#5136](databricks#5136) — PR 2: provisioned + JSON/CSV streaming + types + `sqlcli.ResolveFormat` 3. **PR 3 (this PR)** — [databricks#5138](databricks#5138) — multi-input + multi-statement rejection + error formatting + `sqlcli.Collect` 4. [databricks#5143](databricks#5143) — PR 4: cancellation + timeout + TUI Stacked on PR 2. ## Why PR 2 shipped a single-statement, single-input command. Real workflows want multi-input (set-then-query, file-then-stdin), multi-statement rejection with a friendly hint, and rich pg error formatting. This PR also extends `experimental/libs/sqlcli` with input-collection logic shared by aitools and postgres. Same architectural principle as PR 2: instead of postgres growing its own duplicate of aitools' resolveSQLs, both commands now call `sqlcli.Collect`. ## Changes **Architectural:** `experimental/libs/sqlcli/input.go` adds: - `sqlcli.SQLFileExtension` const (.sql). - `sqlcli.Input{SQL, Source}` type — Source is the human-readable origin label ("--file PATH", "argv[N]", "stdin"). - `sqlcli.CollectOptions{Cleaner func(string) string}` — aitools passes its `cleanSQL` (strips comments+quotes); postgres passes the default `TrimSpace` because its multi-statement scanner needs comments preserved. - `sqlcli.Collect` — files-first then positionals, stdin only when neither is present, .sql autodetect on positionals. aitools' resolveSQLs collapses to a thin wrapper around sqlcli.Collect (drops the SQL strings, ignores Source). The "SQL statement #N is empty after removing comments" wording is replaced with sqlcli's `argv[N] is empty`; aitools tests updated. **User-facing changes for postgres query:** - Variadic positionals + repeatable `--file` + stdin fallback. - Multi-statement strings rejected up front with a hint (the hand-written conservative scanner ignores `;` inside string literals, identifiers, line/block comments, and dollar-quoted bodies; tag must be a valid unquoted identifier so `$1` and `$foo-bar$` are correctly NOT treated as tags). - Multi-input output: per-unit blocks for text; canonical-shape JSON array `{"source","sql","kind","elapsed_ms",...}` for json; csv rejected pre-flight when N>1. - Rich pg error formatting (`SEVERITY: message (SQLSTATE XXXXX)` with DETAIL/HINT lines), applied on both single-input and multi-input paths. Single-input keeps streaming. `runUnitBuffered` is a thin wrapper around `executeOne` + a `bufferSink`, so the row-loop and error-wrapping logic stays in one place. ## Test plan - [x] `go test ./experimental/...` (multistatement scanner: 28 cases including dollar-tag punctuation rejection, sqlcli.Collect: 12 cases including a custom-cleaner test, error formatting, multi-input renderers including byte-equal canonical-shape and first-unit-fails framing) - [x] `go tool ... golangci-lint run ./experimental/...` (0 issues)
…abricks#5143) ## PR Stack 1. [databricks#5135](databricks#5135) — PR 1: scaffold + autoscaling targeting + text output 2. [databricks#5136](databricks#5136) — PR 2: provisioned + JSON/CSV streaming + types 3. [databricks#5138](databricks#5138) — PR 3: multi-input + multi-statement rejection + error formatting 4. **PR 4 (this PR)** — [databricks#5143](databricks#5143) — cancellation + timeout + TUI for >30 rows Stacked on PR 3. ## Why PR 3 finished the input ergonomics. The remaining commitments before this command earns the "experimental" label: - A long SELECT shouldn't survive Ctrl+C. Today the pgx default closes the TCP socket but leaves the server-side query running. - CI scripts want `--timeout` so a single statement can't pin a runner. - Interactive users with >30 rows benefit from a scrollable browser instead of a wall of text. ## Changes **Before:** Ctrl+C tears down TCP but the query runs to completion server-side. `--timeout` doesn't exist. >30 rows scroll past in the terminal. **Now:** Ctrl+C cancels the in-flight query at the server. `--timeout 30s` enforces a per-statement deadline. >30 rows on a TTY open the libs/tableview viewer. Specifically: - **Cancellation watcher.** `buildPgxConfig` now installs `CancelRequestContextWatcherHandler` with `CancelRequestDelay=0, DeadlineDelay=5s`. Zero `DeadlineDelay` would race the cancel-request and could leave the connection unusable; 5s gives the cancel round-trip time to land. - **Signal handler.** Per-invocation goroutine watches SIGINT and SIGTERM. Calls cancel; defer'd stop drains the channel. - **--timeout flag.** Per-statement `context.WithTimeout` child of the signal-scoped ctx. `reportCancellation` distinguishes Ctrl+C ("Query cancelled."), timeout ("Query timed out after Xs."), and plain query errors. Returns `(msg, invocationScoped)` so the multi-input loop can drop the source prefix on user-cancel. - **TUI for >30 rows.** `textSink` now has an `interactive` mode; `runQuery` enables it when stdout is a prompt-capable TTY. Static tabwriter table for small results and pipes; libs/tableview for big interactive ones. If `tableview.Run` fails (TUI startup, terminal resize race) the sink falls through to the static tabwriter path so the user still sees the rows. Integration tests aren't included: aitools (the other experimental command) doesn't have them either. Acceptance + unit tests cover argument validation, targeting resolution (SDK-mocked), and output shapes; cancellation/timeout are unit-tested via the seam in `cancel_test.go`. Real-wire integration tests are the right addition when this command graduates from experimental. ## Test plan - [x] `go test ./experimental/postgres/...` (cancel/timeout/signal helpers, race-precedence pinning) - [x] `go test ./acceptance -run TestAccept/cmd/(psql|experimental/postgres)` (no regressions) - [x] `go tool ... golangci-lint run ./experimental/postgres/...` (0 issues) - [x] Manual: Ctrl+C during `SELECT pg_sleep(60)` cancels the server-side query within ~5s. (Smoked on `chatbot-lakebase-dev-simon-faltum` (e2-dogfood): SIGINT to `SELECT pg_sleep(60)` exited the client in 0.53s with `Error: Query cancelled.`; subsequent `pg_stat_activity` query returned zero rows.)
## Summary - Drops `github.com/fatih/color` as a direct dependency by migrating its ~14 call sites (bundle render, bundle run, cfgpickers, logstream, cmd/labs, experimental/aitools, experimental/ssh, python_mutator) to a small ANSI helper set. - Adds `libs/cmdio/color.go` with `cmdio.Red(ctx, msg)`-style helpers and a `RenderFuncMap(ctx)` for templates. The gate matches fatih/color's historical stdout-TTY decision and degrades to plain text when ctx has no cmdIO attached. - Stacks on top of databricks#5170. ANSI constants shared across both colorizers now live in `libs/cmdio/color.go`. No user-visible output changes — the new helpers emit byte-identical SGR sequences. ## Test plan - [ ] Manual smoke: `databricks bundle validate` against a bundle with errors and warnings (colored summary on TTY, uncolored when piped) and `databricks current-user me -o json` (colored on TTY, uncolored when piped through `jq`). This pull request and its description were written by Isaac.
…s#5174) ## Summary - Add `cmdio.SelectOptions`/`RunSelect` and `cmdio.PromptOptions`/`RunPrompt` as a neutral surface around promptui. - Migrate 4 `RunSelect` callers and 6 `Prompt` callers across `cmd/auth`, `cmd/configure`, and `libs/databrickscfg`. After this change, promptui is only imported under `libs/cmdio`, making a future swap of the prompt library a one-package change. - Behavior is unchanged. This pull request and its description were written by Isaac.
…bricks#5106) ## Summary The Workspace files import-file API used to return `Path (<path>) already exists.` for notebook conflicts. The format has changed on some workspaces to `RESOURCE_ALREADY_EXISTS: <path> already exists. ...`. The original regex no longer matched the new format, so `fs.ErrExist` was not returned — breaking `TestImportDirDoesNotOverwrite` and 8 `TestFilerWorkspaceNotebook` subtests on every cloud. The new format might not have been rolled out to all workspaces yet (see [databricks-sdk-go#1639](databricks/databricks-sdk-go#1639)), and the JSON `error_code` is empty in both. Both messages end with `already exists.`, so we anchor on that substring and return the request `absPath` in the error rather than parsing the message. The integration test assertion is updated to expect the path with extension (`tc.name`) instead of without (`tc.nameWithoutExt`), since `absPath` is the request path. ## Test plan - [x] `go test ./libs/filer/...` passes locally - [x] `TestFilerWorkspaceNotebook` passes on aws-prod-ucws (new format) - [ ] Verify a workspace still emitting the old format also passes (best-effort — single substring match handles both) This pull request was AI-assisted by Isaac.
…abricks#5152) ## Summary The `wrapper` and `wrapper_custom_params` tests pin Spark to `12.2.x-scala2.12` to exercise the trampoline workaround for DBR <13.1 ([PR databricks#635](databricks#635)). The AWS test workspaces have disabled legacy access, so 12.2.x is rejected at job submission time: ``` INVALID_PARAMETER_VALUE: Spark version 12.2.x-scala2.12 isn't supported because legacy access is disabled in your workspace. Please use Databricks Runtime 13.3 LTS or above when any legacy features are disabled. ``` Bumping the runtime would defeat the purpose of the test (the trampoline only triggers for DBR <13.1). Restrict the test matrix to Azure where 12.2.x is still bookable. GCP was already excluded for an unrelated DBR release issue. The trampoline itself is covered by unit tests in `bundle/trampoline/` and acceptance tests under `acceptance/bundle/trampoline/`. ## Test plan - [ ] Confirm next nightly: wrapper and wrapper_custom_params no longer in the failures list on aws-prod-is or aws-prod-ucws-is. - [ ] They continue to pass on Azure (azure-prod-is, azure-prod-ucws-is) where they had been passing before. This pull request was AI-assisted by Isaac.
## Summary `AllowEdit` only affects how `promptui` renders a non-empty `Default`: with `AllowEdit:true` the default pre-fills the buffer; with `AllowEdit:false` it appears as a placeholder that's wiped on first keystroke. No caller in the repo sets `Default`, so the field has been a no-op everywhere it was passed. Drop it rather than carry an option that does nothing. ## Test plan - [x] `go build ./...` - [x] `go vet ./cmd/configure/... ./cmd/auth/... ./libs/cmdio/...` - [x] `go test ./libs/cmdio/... ./cmd/configure/... ./cmd/auth/...` This pull request and its description were written by Isaac.
…bricks#5107) ## Summary The Lakebase postgres API now returns `\"default_branch\": \"<project>/branches/production\"` in `ProjectStatus`. Update the testserver mock to populate the field on project create and regenerate the affected acceptance test outputs (basic, recreate, update_display_name) so the tests pass against both the local testserver and a real cloud workspace. This was failing in nightly runs on aws-prod-ucws. ## Test plan - [x] \`go test ./acceptance -run TestAccept/bundle/resources/postgres_projects\` passes locally - [x] Verified all 8 subtests pass on aws-prod-ucws This pull request was AI-assisted by Isaac.
) ## Changes Every time we update a state, we now write resource entry to resources.json.wal. At the end of the deployment, we read those entries, merge them into state and write state file. Internally, the state file can be opened in two modes: read and write. In write mode we only track IDs in memory but not full state. This ensures that when we merge .wal file into state in-memory representation, the .wal file is source of truth, so normal state update is not different from recovery state-update. ## Why If "bundle deploy" is killed, we don't lose state changes. Next time any bundle command runs, we'll recover the updates. ## Tests Modified testserver kill API to be more flexible. Instead of being configured via test.toml, it's a separate endpoint that can add kill middleware on any other endpoint. So you can dynamically insert kill action during script execution. --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Varun Deep Saini <varun.23bcs10048@ms.sst.scaler.com> Signed-off-by: Varun Deep Saini <deepsainivarun@gmail.com> Co-authored-by: Andrew Nester <andrew.nester@databricks.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Varun Deep Saini <varun.23bcs10048@ms.sst.scaler.com> Co-authored-by: Varun Deep Saini <deepsainivarun@gmail.com>
## Why
Part of CLI GA. Storing long-lived OAuth refresh tokens for interactive
logins (`auth_type = databricks-cli`) in a plain JSON file in the user's
home directory is a security weakness: any process with home-directory
access can read them. The CLI is increasingly the entry point for local
agent workflows, so we want tokens in the OS-native secure store by
default.
The flip has to handle one big "but": not every system has a usable OS
keyring. Linux containers, headless SSH sessions, WSL1, and some CI
runners do not have a D-Bus session bus. On those systems the keyring is
not merely empty, it is not reachable at all. If we shipped the default
flip alone, every command on those systems would error out with a
cryptic backend message ("Cannot autolaunch D-Bus without X11 $DISPLAY",
etc.) until the user manually set `DATABRICKS_AUTH_STORAGE=plaintext` or
re-ran `databricks auth login`. That is a real support burden for the GA
window.
This PR ships the default flip together with the supporting UX. Three
pieces, each scoped narrowly:
1. **Pin-on-success** after a successful login on the default-secure
path, so a later transient keyring failure cannot silently demote a
working secure-storage user back to plaintext.
2. **Read-path fallback for unavailable keyrings only.** When the
keyring backend itself is unreachable (no D-Bus, no Secret Service
daemon, etc.), reads fall through to the file cache so pre-upgrade
`token-cache.json` entries stay accessible without manual configuration.
**This does not fire when the keyring is reachable but empty** — that is
the normal post-upgrade case, where we still surface a clear "run
`databricks auth login` to sign in" nudge so the user moves their tokens
into the secure store rather than silently keeping them in plaintext.
3. **Friendlier `ErrNotFound` messages** that tell the user what to do,
with upgrade-specific copy when a legacy `token-cache.json` is present.
## Behavior matrix
The distinction between "keyring not available" and "keyring available
but empty" drives most of the design:
| Scenario | Read-path behavior |
| --- | --- |
| Keyring reachable, has token for profile | Return token from keyring.
|
| Keyring reachable, no token for profile | `ErrNotFound` wrapped with
"no cached credentials; run `databricks auth login` to sign in" (or
upgrade copy if `token-cache.json` exists). User re-authenticates and
writes the new token to the keyring. |
| Keyring NOT reachable, default-secure mode | Silent fall-back to file
cache. Pre-upgrade tokens keep working. **No nudge, no error.** |
| Keyring NOT reachable, user explicitly chose secure (env / config) |
Return the keyring cache anyway. The actual `Lookup` surfaces the
unreachability rather than being silently downgraded against the user's
stated intent. |
| Keyring probe times out | Stay on the keyring. A locked keyring being
unlocked is the common timeout case; misdiagnosing it as "unavailable"
would silently route reads to a different backend. |
## Changes
Before: tokens were written to `~/.databricks/token-cache.json`. Setting
`DATABRICKS_AUTH_STORAGE=secure` opted in to the OS keyring.
Now:
- Default storage is the OS keyring (Keychain / Credential Manager /
Secret Service). Users re-run `databricks auth login` once after
upgrade.
- `DATABRICKS_AUTH_STORAGE=plaintext` or `[__settings__].auth_storage =
plaintext` opts back to the file cache. Env wins over config.
- After a successful login on the default-secure path, the CLI writes
`auth_storage = secure` to `[__settings__]`. Pins the choice so a later
transient probe failure cannot silently demote the user.
- Read paths cheap-probe the keyring with a read-only `Get` on a
non-existent account. If the backend is unreachable on the
default-secure path, the file cache is returned instead. The probe and
fall-back are scoped strictly to backend-unavailability, not to empty
results. Read-path fallback does NOT pin; pinning stays exclusive to
login, which has the stronger write-probe signal and an explicit user
action.
- `ErrNotFound` from `Lookup` is wrapped with actionable copy: generic
case "no cached credentials; run `databricks auth login` to sign in";
upgrade case (mode=secure AND `~/.databricks/token-cache.json` has
entries) "stored credentials from older CLI versions are no longer used;
run `databricks auth login` to sign in again, or set
`DATABRICKS_AUTH_STORAGE=plaintext` to keep using the file cache".
- Non-`ErrNotFound` keyring errors get wrapped with the same actionable
hint so users on no-keyring systems who somehow bypass the probe (e.g.
explicit-secure callers) see "OS keyring unreachable: ... (set
`DATABRICKS_AUTH_STORAGE=plaintext` or run `databricks auth login`)"
instead of a raw D-Bus message.
- Login-time silent fallback (already on `main` as dormant
infrastructure) activates and pins.
Implementation:
- `libs/auth/storage/mode.go`: resolver default flips from
`StorageModePlaintext` to `StorageModeSecure`. Constant doc comments
updated.
- `libs/auth/storage/cache.go`: drops "dormant today" comments. New
`PinSecureMode` (login-side pin) and `applyReadFallback` (read-side
fallback). `cacheFactories` gains `probeKeyringRead`.
`persistPlaintextFallback` now logs internally at debug for
shape-consistency with `PinSecureMode`.
- `libs/auth/storage/keyring.go`: new `ProbeKeyringRead` (read-only
probe). `Lookup` wraps non-`ErrNotFound` errors with the unreachability
hint.
- `libs/auth/storage/not_found_hint.go` (new): `notFoundHintCache` wraps
`ResolveCache` / `ResolveCacheForLogin` so `ErrNotFound` from `Lookup`
carries an actionable hint without getting sandwiched between the SDK's
`cache:` prefix and `ErrNotFound`'s tail.
- `cmd/auth/login.go`, `cmd/auth/token.go`: call `storage.PinSecureMode`
after each `persistentAuth.Challenge()`. `login.go` also moves
`ResolveCacheForLogin` to run after input validation so
trivially-invalid commands no longer probe the keyring.
- Unit tests cover all of the above (`PinSecureMode` cases,
`applyReadFallback` cases, `ProbeKeyringRead`, `notFoundHintCache`,
`legacyCacheHasTokens`).
- `acceptance/script.prepare` forces `DATABRICKS_AUTH_STORAGE=plaintext`
at the root so existing auth acceptance tests keep exercising the
file-backed path. Tests that want the resolver default override it.
- `acceptance/cmd/auth/describe/u2m-plaintext-default` renamed to
`u2m-secure-default`; its `test.toml` adds a `[[Repls]]` regex
normalizing the platform-dependent keyring lookup error.
- `acceptance/cmd/auth/describe/u2m-json-output`, `u2m-plaintext-env`,
`u2m-plaintext-config`: regenerated to match the new error copy.
- `cmd/auth/auth_test.go`: `TestProfileHostCompatibleViaCobra` copies
the fixture into a temp directory so the resolver's writes can never
dirty the checked-in file.
- `NEXT_CHANGELOG.md`: breaking-change entry under Notable Changes
covering the flip, the re-login requirement, both opt-out paths, and the
read-path fallback for systems without a usable keyring.
## Test plan
- [x] `task checks` clean
- [x] `task lint-q` clean
- [x] `go test ./libs/auth/... ./cmd/auth/... ./libs/databrickscfg/...`
passes
- [x] `go test ./acceptance -run 'TestAccept/cmd/auth'` passes on macOS
- [x] `go test ./acceptance -run 'TestAccept/cmd/configure'` passes
(covers a `databricks-cli` auth path outside `cmd/auth`)
- [ ] Linux CI is the real test for the `[[Repls]]` regex in
`u2m-secure-default/test.toml` (macOS clean miss vs. Linux backend
error).
- [ ] Manual: with `DATABRICKS_AUTH_STORAGE` unset, `databricks auth
login --profile X` writes to the keyring and persists `auth_storage =
secure` to `[__settings__]`.
- [ ] Manual: `DATABRICKS_AUTH_STORAGE=plaintext databricks auth login
--profile X` continues to write to `~/.databricks/token-cache.json` with
the host-key dual-write entry; `[__settings__]` is not modified.
- [ ] Manual: keyring reachable but empty for the current profile, an
auth command produces the "run `databricks auth login` to sign in" nudge
(not a silent fall-back).
- [ ] Manual: keyring NOT reachable (Linux container, headless SSH), an
auth command silently uses the file cache; a populated pre-upgrade
`token-cache.json` keeps working.
This pull request and its description were written by Isaac.
…cks.com (databricks#5283) ## Why The discovery login flow (`databricks auth login` without `--host`) opens `https://login.databricks.com`. That host is hardcoded in the CLI, so there is no way to point the flow at a non-production login instance during testing or development. The SDK already exposes `u2m.WithDiscoveryHost` (added in databricks-sdk-go databricks#1640, on the CLI's pinned v0.132.0). This PR wires it up. ## Changes **Before:** No way to override the discovery host. `databricks auth login` always opens `https://login.databricks.com`. **Now:** If `DATABRICKS_DISCOVERY_HOST` is set, the CLI passes it through to `u2m.WithDiscoveryHost(...)`. When unset, behavior is identical to before. The "Opening ... in your browser..." log line reflects the override host so it's clear which host is being opened. Intended for testing and development against non-production login instances; unset for normal use. ## Test plan - [x] New unit test `TestDiscoveryLogin_OverridesHostFromEnv` confirms the env var is read and the log message reflects the override host - [x] `go test ./cmd/auth/...` passes - [x] `./task checks` passes - [x] `./task lint-q` passes
) ## Summary Split out from databricks#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: - New `--scope=project|global` flag on `install`/`update`/`uninstall`/`list`, with `--scope=both` accepted by `update` and `list`. - `--project` and `--global` are marked deprecated via cobra's `Deprecated` property: 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. - `--scope` combined with `--project`/`--global` is rejected up front with an actionable error. - `install`'s `--help` now documents the non-interactive `--agents` auto-detect contract so callers know what gets picked. **Stacked on databricks#4917.** Base will rebase to `main` once that lands. Splitting because (a) databricks#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 databricks#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|both` is one flag with valid values, not two flags with order-dependent semantics. ## Surface ``` databricks aitools install --scope=project|global (--scope=both rejected) databricks aitools uninstall --scope=project|global (--scope=both rejected) databricks aitools update --scope=project|global|both databricks aitools list --scope=project|global|both (default: both) databricks aitools install --project # warns: use --scope=project databricks aitools install --global # warns: use --scope=global ``` ## Test plan - [ ] `databricks aitools install --scope=project` and `--scope=global` go to the right destination - [ ] `databricks aitools install --scope=both` errors with a clear message - [ ] `databricks aitools install --project` still works and prints the deprecation warning to stderr - [ ] `databricks aitools install --scope=global --project` errors with the conflict message - [ ] `databricks aitools list --scope=both` shows both scopes (equivalent to no flag) - [ ] `databricks aitools install --help` no longer shows `--project`/`--global`; `--scope` is documented; `--agents` auto-detect behavior is described - [ ] Unit: `TestParseScopeFlag` (table-driven on the translation), `TestInstallScopeFlag`, `TestListScopeFlag` — all green This pull request was AI-assisted by Isaac. --------- Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com> Co-authored-by: simon <simon.faltum@databricks.com>
) ## Summary `databricks postgres create-role`'s `--json` flag binds to the inner `Role` object (`CreateRoleRequest.Role`, JSON-tagged `"role"`), so users must supply `spec` / `name` / etc. directly. Without an example this isn't obvious — the auto-generated help leaves the spec fields unflagged (`// TODO: complex arg: spec` in the generator), and the server's error when the body is wrong is vague: ``` Field 'role' is required and must contain at least one subfield with a non-default value ``` That fires whenever the inner `Role` has no recognized fields, which most commonly happens when a user wraps the body in `{"role": ...}` (matching the wire format the SDK marshals to). The CLI strips the unknown outer key with `Warning: unknown field: role` and ships an empty body. Walking out of that loop currently requires reading the SDK source. This adds a curated override (`cmd/workspace/postgres/overrides.go`) that appends a concrete service-principal-role example to `cmd.Long`, plus a short note on the wrapping pitfall. ### Help output (after) ``` Arguments: PARENT: The Branch where this Role is created. Format: projects/{project_id}/branches/{branch_id} Body shape (passed via --json): fields go directly on the Role object. Do not wrap them in '{"role": ...}' — the CLI will strip the unknown outer key and the server will reject the empty body with "Field 'role' is required". Example — create a service-principal-backed role: databricks postgres create-role projects/<PROJECT_ID>/branches/<BRANCH_ID> \ --role-id <SP_CLIENT_ID> \ --json '{"spec": {"identity_type": "SERVICE_PRINCIPAL", "postgres_role": "<SP_CLIENT_ID>", "auth_method": "LAKEBASE_OAUTH_V1", "membership_roles": ["DATABRICKS_SUPERUSER"]}}' ``` ### Scope This PR only touches `create-role`. The same shape gap (`// TODO: complex arg: spec` + opaque error) exists for `create-endpoint`, `create-branch`, `create-project`, and `create-database`. Happy to extend if the approach is right; left them out so reviewers can decide on the pattern first. ## Test plan - [x] `go build ./cmd/workspace/postgres/...` - [x] `databricks postgres create-role --help` shows the new section (output above) - [x] `make fmt` clean - [x] Reproduced the original confusion with a service-principal payload before the change; with this PR the example would have led me straight to the working body shape This pull request and its description were written by Isaac. --------- Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com> Co-authored-by: simon <simon.faltum@databricks.com>
## Summary The skills manifest in `databricks/databricks-agent-skills` is gaining experimental skills sourced from a new `experimental/` directory in the repo (see paired [d-a-s PR databricks#73](databricks/databricks-agent-skills#73), which imports the ai-dev-kit skill catalog into `experimental/`). This wires the parsing through the aitools installer: - `Manifest.Skills` is a **single map** holding both stable and experimental entries; the per-skill `repo_dir` field ("skills" or "experimental") is the source of truth for whether a skill is experimental. `SkillMeta.IsExperimental()` derives state from `RepoDir`. - Experimental skills get a `-experimental` suffix on their install-side key during `normalizeManifest`; `SourceName` preserves the unsuffixed name for fetch URLs. - The existing `--experimental` flag (already wired in `cmd/skills.go`) now has experimental skills to install; without it, `resolveSkills` filters them out as before. ## UX ``` # default — only stable skills databricks experimental aitools skills install # all experimental skills, plus stable databricks experimental aitools skills install --experimental # one experimental skill by name (--experimental still required by resolveSkills) databricks experimental aitools skills install databricks-iceberg-experimental --experimental ``` ## TODOs / caveats for iteration 1. ~~**`DATABRICKS_SKILLS_REF` pin.**~~ **Partially resolved.** The default ref is still the latest stable release tag (sourced from `experimental/aitools/lib/installer/SKILLS_VERSION`); experimental entries won't exist there until d-a-s cuts a release with [PR databricks#73](databricks/databricks-agent-skills#73) merged. The default ref bump is a follow-up automated by the SKILLS_VERSION file. **UX fix shipped in this PR**: if `--experimental` is passed but the manifest at the resolved ref exposes no experimental skills, a warning is logged pointing users at `DATABRICKS_SKILLS_REF=main`. 2. ~~**Collision handling is naive.**~~ **Resolved.** Every experimental skill gets a `-experimental` suffix on its install-side key during `normalizeManifest`. The manifest key + install dir both carry the suffix; the `SourceName` field on `SkillMeta` preserves the upstream repo dir name for fetch URLs. Users see at a glance which installed skills are experimental. Also handled: **experimental↔stable transitions**. If a skill flips its experimental status upstream (the same logical skill changes manifest key), `install` removes the stale variant on disk + state before installing the new one, and `uninstall` accepts either variant name (and removes both if both are present). Helper: `alternateVariantKey()`. Covered by tests `TestInstallReplacesAlternateVariant`, `TestUninstallByEitherVariantRemovesBoth`, `TestUninstallByAlternateNameWhenOnlyOneVariantInstalled`. 3. ~~**`list` UX.**~~ **Resolved.** `aitools skills list` shows experimental skills with an `[experimental]` tag in the NAME column (driven by `meta.IsExperimental()`). Combined with the TODO databricks#2 resolution (`-experimental` suffix in the manifest key), every experimental row reads e.g. `databricks-iceberg-experimental [experimental]` — slightly redundant but a clear visual anchor. Hide-by-default was considered but rejected: users running `list` are usually looking for what's available, and silently omitting experimental skills makes them un-discoverable. 4. ~~**State tracking.**~~ **Resolved — kept additive semantics.** `InstallState.IncludeExperimental` records what was last requested but is not used to drive retroactive removal. Running `install` without `--experimental` leaves previously-installed experimental skills in place. Rationale: (a) users running `install` are typically adding/updating, not declaring set membership; (b) silently uninstalling things the user previously asked for is surprising; (c) the transition cleanup shipped under TODO databricks#2 handles the actual drift case (skill's experimental status flipping upstream). Removal is what `uninstall` is for. 5. ~~**No acceptance test yet.**~~ **Resolved.** Added acceptance tests under `acceptance/experimental/aitools/skills/install*/` covering the install flow against a mocked manifest server: - Stable-only install (no flag) → 1 skill installed - `--experimental` install adds the experimental skill (with `-experimental` suffix per the install-path model) → 2 skills total - Re-running `--experimental` is idempotent - Specific-skill install (`install --skills <name>`) for both stable and experimental - `--experimental` against a manifest with no experimental entries logs a nudge To make these reachable, exposed a new env-var override `DATABRICKS_SKILLS_BASE_URL` that overrides the hard-coded `raw.githubusercontent.com` base URL used by `GitHubManifestSource.FetchManifest` and `fetchSkillFile`. Defaults to the canonical URL when unset, so no production behavior change. Updated `Taskfile.yml`'s `test-exp-aitools` task to include `acceptance/experimental/aitools/**`. Variants left as follow-up acceptance tests (the structure is now in place): - Variant transition cleanup (stable → experimental, experimental → stable) - Uninstall flow (with both variants installed) 6. ~~**`--experimental` flag scope.**~~ **Resolved — kept current scope.** Each command has internally consistent behavior: - `install --experimental` → explicit opt-in (required to install experimental skills). - `update` → state-driven (honors `InstallState.IncludeExperimental` from the last `install`). If you opted in once, future updates refresh experimentals; otherwise they're skipped. - `list` → shows all skills with an `[experimental]` tag (no filtering — discovery first, opt-in to install). Adding `--experimental` / `--no-experimental` to `update` for one-off overrides was considered but rejected: the natural workflow is to re-run `install --experimental` (or just `install`), which already sets the desired state. Follow-up if real users hit a use case for the override. 7. ~~**Manifest shape.**~~ **Resolved.** Replaced the original two-map design (`skills` + `experimental_skills` + a per-skill `experimental` bool) with a single `skills` map where each entry's `repo_dir` (`"skills"` or `"experimental"`) is the source of truth. The cli derives experimental state from `RepoDir` via `SkillMeta.IsExperimental()`. Collisions between stable and experimental skills with the same repo dir name must be resolved upstream in d-a-s (which they already are — d-a-s PR databricks#73's TODO #1a merged the only known collision into stable). The d-a-s manifest generator should be updated to emit `repo_dir` per skill; until then `normalizeManifest` defaults a missing `RepoDir` to `"skills"` so older manifests still parse. ## Test plan - [x] `go build ./...` passes. - [x] `go test ./experimental/aitools/...` passes (`source_test.go` covers the normalize/IsExperimental cases). - [x] `go test ./acceptance -run TestAccept/experimental/aitools` passes (a pre-existing flake intermittently surfaces an `lstat` warning during copyDir, ~10% of multi-test runs; unrelated to this refactor). - [ ] Run `./task lint` and `./task fmt` before merge. - [ ] Manual: against a d-a-s ref containing experimental entries with `repo_dir`, verify the four UX cases above behave correctly. This pull request and its description were written by Claude. --------- Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com> Co-authored-by: simon <simon.faltum@databricks.com>
…databricks#5118) ## Summary `databricks workspace import-dir` walks the source tree and copies every entry into the workspace verbatim — it has no awareness of `.gitignore` or default exclusions. This change adds a name-based skip for `.git`, `.databricks`, and `node_modules` directories during the walk. `.gitignore` and other dotfiles at the root remain copied. If a user explicitly passes `.git` (or any of the others) as the source root, that root is still copied — the skip rule applies to entries encountered during recursion. ## Motivation: align `import-dir` with `sync`'s existing defaults `databricks sync` already hard-codes skips for the same two directories that cause the most trouble: - `libs/git/repository.go` — `// Always ignore root .git directory.` adds `.git` to the default ignore rules unconditionally. - `libs/git/view.go` (`SetupDefaults`) — `// Hard code .databricks ignore pattern so that we never sync it (irrespective of .gitignore patterns)`. So `sync` and `import-dir` currently produce different workspace contents for the same source tree: `sync` skips `.git/` and `.databricks/`, `import-dir` copies them. This PR closes that gap for `import-dir` so the two commands behave consistently. `node_modules` is the one entry that goes beyond what `sync` does by default. For any project with a typical `.gitignore`, `sync` would already skip it via gitignore rules; `import-dir` ignores `.gitignore` entirely, so adding it to the name-based skip list keeps the behavior aligned with what users get from `sync`. ## Why this matters in practice `databricks workspace import-dir` is commonly reached for as the inverse of `databricks workspace export-dir`. Without these defaults, the imported tree carries: 1. The local repo's `.git/` directory, including its config and history. 2. The local `.databricks/` bundle cache, which can clobber state that bundle commands maintain remotely. 3. `node_modules/` for JS/TS projects — large, slow to upload, and recreated by the runtime install step anyway. The canonical answer is `databricks sync`, which respects `.gitignore` and already excludes the first two by default. This PR is not a substitute for `sync` — it just brings `import-dir`'s defaults into line for users who reach for it anyway. ## Test plan - [x] Unit tests covering: root `.git/` skipped, nested `.git/` skipped, `.databricks/` skipped, `node_modules/` skipped, `.gitignore` file kept, explicit `.git` root copied (escape hatch). - [x] `go test ./cmd/workspace/workspace/` — pass - [x] `golangci-lint run ./cmd/workspace/workspace/` — clean - [ ] Existing integration `TestImportDir` — unchanged, no `.git` in its testdata so behavior is identical. This pull request and its description were written by Isaac. --------- Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com> Co-authored-by: simon <simon.faltum@databricks.com>
) > Replaces databricks#4820 — re-opened from an upstream branch (was previously from a fork, which blocked CI from running properly). ## Summary - Replace the opaque `accepts 1 arg(s), received 0` error with a clear message explaining that `APP_NAME` is required - Show usage, mention the `databricks.yml` auto-detect alternative, and suggest an app name inferred from the current directory name ## Test plan - [x] `go test ./cmd/apps/ -run TestMakeArgsOptional` passes - [x] `go build ./cmd/apps/` succeeds This pull request was AI-assisted by Isaac. --------- Signed-off-by: James Broadhead <jamesbroadhead@gmail.com> Co-authored-by: simon <4305831+simonfaltum@users.noreply.github.com> Co-authored-by: simon <simon.faltum@databricks.com>
## Summary `databricks aitools list` learns `--output json`, emitting a structured document so coding agents and CI can consume the skill/version/installation matrix without scraping the tabwriter text output. Text rendering is unchanged. **Stacked on databricks#4917** (uses `--scope` and the moved-to-top-level `aitools/` package). Base will rebase to `main` once databricks#4917 merges. ## JSON shape ```json { "release": "0.1.0", "skills": [ { "name": "databricks-jobs", "latest_version": "1.0.0", "experimental": false, "installed": { "global": "1.0.0", "project": "0.9.0" } } ], "summary": { "global": { "installed": 5, "total": 10 }, "project": { "installed": 3, "total": 10 } } } ``` - `installed` is keyed by scope; absent key = not installed in that scope; empty map = not installed anywhere. - `summary` only includes scopes that were queried, so `--scope=global` narrows it to one key. - `release` is the version string without the `v` prefix. This is the documented public contract — field names and types should not change without a major version bump. ## Why `aitools list` is one of the surfaces an agent reaches for first ("what's installed, what's available, what's stale"). Scraping tabwriter columns from stderr is fragile; a stable JSON contract makes the command declarative for non-human callers. Matches the convention used by other CLI commands that already honor `--output json` (`bundle validate`, `pipelines run`, etc.). ## Test plan - [ ] `databricks aitools list --output json` against a workspace with a mix of installed/uninstalled skills, both scopes — JSON validates against the shape above. - [ ] `databricks aitools list --output json --scope=global` — `summary` only contains `global`. - [ ] `databricks aitools list` (no `--output`) — output is byte-for-byte unchanged from main. - [ ] Unit: `TestRenderListJSON`, `TestRenderListJSONScopeFiltersSummary`, `TestInstalledStatusFromEntry` cover the rendering paths. This pull request was AI-assisted by Isaac.
## Changes New `postgres_synced_tables` resource that syncs a Unity Catalog Delta table into a Postgres table on a Lakebase Autoscaling branch. Supported on both direct and terraform deployment engines. ## Tests Acceptance coverage: `basic` and `recreate` exercise each engine, plus the existing `no_drift` and `migrate` invariants pick up the new resource. Both engines produce identical human-readable output and identical wire bodies. Verified end to end on a live workspace: the bundle deploys a project, lakebase catalog, pipeline-storage schema, and synced table; the pipeline materializes in under a minute; `SELECT` against the destination through the UC federated view returns the rows from the source Delta table; and `bundle destroy` cleans up the full chain. This pull request and its description were written by Isaac.
Adds a Stability Policy section to README covering feature stability, SemVer versioning rules, and security patches; documents extended support for the 0.299.x line in SECURITY.md; and updates NEXT_CHANGELOG.md for the v1.0.0 release.
…icks#5280) ## Why `databricks auth login --profile DEFAULT --host ...` followed by a no-flag `databricks auth describe` (or any other command that needs the U2M token) fails when secure storage is in use: ``` Unable to authenticate: A new access token could not be retrieved because the refresh token is invalid. ``` `databricks auth describe --profile DEFAULT` works. Running the same flow under `DATABRICKS_AUTH_STORAGE=plaintext` also works. So the bug is specific to secure storage + the implicit DEFAULT fallback. Root cause is a cache-key mismatch between login and read: - `cmd/auth/login.go:222` hardcodes `profileName = "DEFAULT"` when no `--profile` is given, so the OAuthArgument's cache key is the literal string `"DEFAULT"`. The token lands in the keyring under account `"DEFAULT"`. - On the read path, `cfg.Profile` starts empty, `resolveDefaultProfile` only consults `[__settings__].default_profile` (so it stays empty), and the SDK's `configFileLoader.Configure` (`config_file.go:103-105`) loads `[DEFAULT]`'s values but **deliberately leaves `cfg.Profile` empty** when it falls back (`isFallback=true`). `CLICredentials.Configure` then builds an OAuthArgument with `profile=""`, so `GetCacheKey()` falls back to `GetHostCacheKey()` and the lookup goes to the host URL, not `"DEFAULT"`. Miss. plaintext mode masks the same mismatch with `DualWritingTokenCache`, which mirrors every write under the host key — so reads via host URL still find the token. secure mode does not dual-write, so the bug surfaces. This is a pre-existing bug independent of toggling secure-storage by default, but doing so turns a corner case into the default experience. The fix here is targeted enough to land standalone. A defense-in-depth followup in `databricks-sdk-go` will drop the SDK-side `if !isFallback` gate so all SDK consumers benefit from the same self-consistency. The CLI fix lands first so secure-storage users are unblocked without waiting on an SDK release cycle. ## Changes - `cmd/root/auth.go`: `resolveDefaultProfile` swaps `databrickscfg.ResolveDefaultProfile` (settings-only) for `databrickscfg.GetDefaultProfile`, which already does the full 4-step resolution: `[__settings__].default_profile` → the only profile in the file → `[DEFAULT]` → empty. The SDK then sees a non-empty `cfg.Profile`, takes the `isFallback=false` branch, and the name flows through to `CLICredentials.Configure`. OAuthArgument's cache key now matches what login wrote. - `cmd/root/bundle.go` is intentionally NOT touched: bundles deliberately limit their fallback to `[__settings__].default_profile` so a hostless bundle does not get silently routed at a `[DEFAULT]` profile pointing at the wrong workspace. That comment in `bundle.go:74-80` stays load-bearing. - `cmd/root/auth_test.go`: - `TestMustWorkspaceClientWithoutConfiguredDefaultFallsBackToDefaultSection` now asserts `cfg.Profile == "DEFAULT"` (was `""`). The previous assertion documented the bug; the new one documents the contract. - New table-driven `TestResolveDefaultProfile` covers the full resolution order: preset `cfg.Profile`, `DATABRICKS_CONFIG_PROFILE` env, `[__settings__].default_profile`, single profile, `[DEFAULT]` section among many, no fallback, missing file. - `NEXT_CHANGELOG.md`: one-line entry describing the fix and the mismatch it removes. ## Test plan - [x] `task checks` clean - [x] `task lint-q` clean - [x] `go test ./cmd/root/... ./cmd/auth/... ./libs/databrickscfg/...` passes - [x] `go test ./acceptance -run 'TestAccept/cmd/auth'` passes - [ ] Manual repro of Pieter's case (`auth login --profile DEFAULT --host ...` then `auth describe` with no flag under secure storage) succeeds after this PR; the same flow on `main` fails. - [ ] Verify bundle resolution is unaffected: a bundle without `workspace.host` and no `--profile` still uses `[__settings__].default_profile` only (no silent DEFAULT routing). This pull request and its description were written by Isaac.
## Release v1.0.0 ### Notable Changes * The Databricks CLI is now generally available with version v1.0.0 as the first major release 🚀. From this version on, the CLI follows semantic versioning (see [README](README.md)). This change does not impact DABs or other existing commands beyond the changes listed below. * The 0.299.x line continues to receive security-critical patches through May 20, 2027; see [SECURITY](SECURITY.md) for the support policy. * Starting with v1.0.0, the CLI will use [immutable release tags](https://docs.github.com/en/code-security/concepts/supply-chain-security/immutable-releases) to increase security against supply chain attacks. * Breaking change: OAuth tokens for interactive logins (`auth_type = databricks-cli`) are now stored in the OS-native secure store by default (Keychain on macOS, Credential Manager on Windows, Secret Service on Linux) instead of `~/.databricks/token-cache.json`. After upgrading, run `databricks auth login` once per profile to re-authenticate; cached tokens from older versions are not migrated. To keep the previous file-backed storage, set `DATABRICKS_AUTH_STORAGE=plaintext` or add `auth_storage = plaintext` under `[__settings__]` in `~/.databrickscfg` (the env var takes precedence over the config setting), then re-run `databricks auth login`. On systems where the OS keyring is not reachable (e.g. Linux containers without a D-Bus session bus), the CLI transparently falls back to the file cache when reading tokens so legacy `token-cache.json` entries remain accessible without manual configuration. ### CLI * Added `databricks aitools` command group for installing Databricks skills into your coding agents (Claude Code, Cursor, Codex CLI, OpenCode, GitHub Copilot, Antigravity). Skills are fetched from [github.com/databricks/databricks-agent-skills](https://github.com/databricks/databricks-agent-skills) and either symlinked into each agent's skills directory or copied into the current project. Use `databricks aitools install` to set up, `update` to pull newer versions, `list` to see what's available, and `uninstall` to remove them. Pick where they go with `--scope=project|global` (`--scope=both` is accepted on `update` and `list`). * `[__settings__].default_profile` is now consulted as a fallback by `databricks api`, `databricks auth token`, and bundle commands when neither `--profile` nor `DATABRICKS_CONFIG_PROFILE` is set. `databricks auth token` continues to give precedence to `DATABRICKS_HOST` over `default_profile`. For bundle commands, `default_profile` only applies when the bundle does not pin its own `workspace.host`. * Fixed bug where auth commands did not load the DEFAULT profile properly during auth where type is `databricks-cli`. * `databricks workspace import-dir` now skips `.git`, `.databricks`, and `node_modules` directories during recursive imports. To import one of these directories deliberately, pass it as `SOURCE_PATH` ([databricks#5118](databricks#5118)). * `databricks postgres create-role --help` now documents the `--json` body shape and rejects the common mistake of wrapping the body in `{"role": ...}` client-side with a hint pointing at the correct shape ([databricks#5111](databricks#5111)). * `databricks aitools list` honors `--output json`, emitting a structured `{release, skills[...], summary{}}` document so coding agents and CI can consume the skill/version/installation matrix without scraping the tabular text output ([databricks#5233](databricks#5233)). ### Bundles * Make sure warnings asking for approval are understood by agents ([databricks#5239](databricks#5239)) * Support `replace_existing: true` on `postgres_branches` and `postgres_endpoints` so bundles can manage the implicitly-created production branch and primary read-write endpoint of a Lakebase project. * Add `postgres_catalogs` resource to bind a Unity Catalog catalog to a Postgres database on a Lakebase Autoscaling branch ([databricks#5265](databricks#5265)). * Add `postgres_synced_tables` resource to sync a Unity Catalog Delta table into a Postgres table on a Lakebase Autoscaling branch ([databricks#5268](databricks#5268)). * engine/direct: Changes to state file now persisted to .wal file right away instead of being saved in the end ([databricks#5149](databricks#5149))
Enables no-git-provider test on local. Follow up to databricks#5287
…ricks#5294) The `acceptance/bundle/templates/pydabs/test.toml` replacement regex only matched `databricks-bundles==0.x.y`, so after the v1.0.0 release the wheel version `1.0.0` slipped through unredacted and the recorded output (`databricks-bundles==x.y.z`) no longer matched. Broaden the regex to `\d+\.\d+\.\d+` (and escape the dots) so any future version is normalized.
## Changes
Extend `linguist-generated=true` coverage so generated files don't
pollute language stats or show up as hand-written code in review.
Follows the existing convention of one local `.gitattributes` per
generated folder (alongside `bundle/schema/`, `bundle/internal/tf/`,
`bundle/internal/validation/generated/`, `acceptance/`, `integration/`).
New / updated local files:
| Generator | `.gitattributes` location | Pattern |
|---|---|---|
| `./task generate-direct` | `bundle/direct/dresources/` |
`*.generated.yml` |
| `./task generate-schema-docs` | `bundle/schema/` (extended) |
`jsonschema_for_docs.json` |
| `./task generate-schema` | `bundle/internal/schema/` |
`annotations_openapi.yml` |
| `./task generate-docs` | `bundle/docsgen/output/` | `*.md` |
| `mockery` | `internal/mocks/` | `*.go` |
| `./task pydabs-codegen` | `python/databricks/bundles/` |
`{catalogs,jobs,pipelines,schemas,volumes}/**` |
Excluded by request from review:
- `internal/genkit/tagging.py{,.lock}` and
`.github/workflows/tagging.yml` — kept visible because changes there can
affect the release process (@andrewnester).
- `acceptance/**/out*` and `acceptance/**/output/**` — kept visible
because acceptance-output diffs are how reviewers detect behavior
changes (@pietern, @andrewnester).
## Why
`bundle/direct/dresources/apitypes.generated.yml` (and
`resources.generated.yml`) were showing up as human-authored code on
GitHub. The genkit-managed section of the root `.gitattributes` only
covers `cmd/account/**` and `cmd/workspace/**`, so the rest of the
auto-generated tree was unmarked. This brings linguist's view in line
with `.agent/rules/auto-generated-files.md`.
## Tests
Verified each pattern with `git check-attr linguist-generated <path>`:
- Intended generated files resolve to `true`.
- Adjacent manually-maintained files stay `unspecified`:
`bundle/direct/dresources/apitypes.yml`,
`bundle/internal/schema/annotations.yml`,
`bundle/internal/schema/annotations_openapi_overrides.yml`,
`bundle/docsgen/{main.go,README.md}`, `bundle/schema/schema.go`,
`internal/mocks/README.md`,
`python/databricks/bundles/{__init__.py,build.py,core/**}`.
- Pre-existing local `.gitattributes` files (TF schema, validation
generated, `bundle/schema/jsonschema.json`, acceptance `out.test.toml`)
still resolve correctly.
`./task ws` passes.
_This PR was written by Claude Code._
…atabricks#5293) The backend returns `enable_pg_native_login: false` by default on project creation, causing integration test divergence in `postgres_projects/*`. Match the backend in testserver: set the default to `false` and add it to `ForceSendFields` so the field is emitted explicitly (the real API includes it in the response rather than omitting the zero value). Regenerated acceptance fixtures accordingly. This pull request and its description were written by Isaac.
The Postgres GET API now echoes the leaf id on the Status payload (`BranchStatus.BranchId`, `EndpointStatus.EndpointId`, `ProjectStatus.ProjectId`). Drop the regex-based `ParsePostgresName` recovery in the three `make*Remote` helpers and read the id directly from Status. The component helper and its unit test go with it; the one remaining call site in `all_test.go` now uses the project id literal it just created. Fields added in SDK v0.129.0 (databricks/databricks-sdk-go#1644); available in the CLI since databricks#5237 bumped the SDK to v0.132.0. The testserver was taught to populate these fields in the companion PR databricks#5246, so local acceptance fixtures are unchanged. Stacked on databricks#5273 — base will retarget to `main` once that merges. This pull request and its description were written by Isaac.
…ricks#5270) ## Summary Follow-up to databricks#5214 (per [pietern's review comment](databricks#5214 (comment))). Replace the inline heredocs in `acceptance/auth/bundle_default_profile/script` with three committed templates: - `databricks.yml.no-host.tmpl` — bundle with neither `workspace.host` nor `workspace.profile`. Used for the "default_profile is honored" and "`--profile` overrides" phases. - `databricks.yml.with-host.tmpl` — pins `workspace.host: $DATABRICKS_HOST`. `envsubst` fills in the test server URL before each invocation. - `databricks.yml.with-profile.tmpl` — pins `workspace.profile: other`. Before each phase the script overwrites the active `databricks.yml` from the relevant template. The per-scenario subdirectories (`./bundle-with-host`, `./bundle-with-profile`) and the `cd` calls are gone — the active bundle is always at the test root. Stacked on databricks#5266 (sethome-absolute fix). The base will auto-retarget to `main` once databricks#5266 merges. `output.txt` is unchanged across the refactor: both engine variants (`terraform` and `direct`) produce byte-identical output to the pre-refactor run. ## Test plan - [x] `go test ./acceptance -run TestAccept/auth/bundle_default_profile -v` passes for both `DATABRICKS_BUNDLE_ENGINE=terraform` and `=direct`. - [x] `./task fmt-q` and `./task lint-q` clean. This pull request and its description were written by Isaac.
databricks#5295) ## Changes Update the error emitted by `ValidateDirectOnlyResources` (raised when a direct-only resource type — catalogs, external locations, vector search endpoints — is declared while running with the terraform engine) to mention both ways of switching to the direct engine: > Please set the `DATABRICKS_BUNDLE_ENGINE` environment variable to 'direct' **or set `bundle.engine: direct` in your databricks.yml** to use ... resources. ## Why The previous wording only pointed users at the env var. `bundle.engine` is the equivalent (and usually more durable) configuration knob, so mentioning it makes the error actionable for users who prefer to declare engine choice in `databricks.yml` instead of plumbing an env var through their workflow. ## Tests - `go test ./bundle/config/mutator/ -run TestValidateDirectOnlyResources` — unit tests updated to assert the new message. - `go test ./acceptance -run TestAccept/bundle/validate/catalog_requires_direct_mode` — acceptance snapshot updated. - `./task fmt`, `./task checks`, `./task lint` — clean. _This PR was written by Claude Code._
Fail any acceptance test whose `test.toml` parses to an empty table (zero-byte or comment-only). The check lives in the acceptance test runner's config loader. Deletes 20 pre-existing offenders -- 4 zero-byte placeholders and 16 comment-only files. None of the comments in those files are relevant for the test. This codifies a review comment that shows up from time to time and thereby removes ambiguity/overhead. This pull request and its description were written by Isaac.
## Why The CLI is GA, so the "This project is in Public Preview" line at the top of the README is no longer accurate. ## Changes Before: README opens with a "This project is in Public Preview." line. Now: That line is gone; the README jumps from the build badge straight to the documentation link. ## Test plan - [x] `./task checks` passes
## Changes <!-- Brief summary of your changes that is easy to understand --> ## Why <!-- Why are these changes needed? Provide the context that the reviewer might be missing. For example, were there any decisions behind the change that are not reflected in the code itself? --> ## Tests <!-- How have you tested the changes? --> <!-- If your PR needs to be included in the release notes for next release, add a separate entry in NEXT_CHANGELOG.md as part of your PR. --> Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com> Co-authored-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Bumps `go` to `1.26.0` and `toolchain` to `go1.26.3` across all four
modules (root, `tools/`, `tools/task/`, `bundle/internal/tf/codegen/`),
and folds in the `golangci-lint --fix` output that the new minor version
requires.
Bumping the `go` directive to 1.26 unlocks two `modernize` analyzers
(already enabled in `.golangci.yaml`) that were silent on 1.25:
- `stditerators` — prefer `reflect.Type.Fields()`/`Methods()` and
`reflect.Value.Fields()`/`Methods()` over the `NumField()`/`Field(i)`
loop pattern.
- `newexpr` — replace local `*T` helpers like `func intPtr(v int) *int {
return &v }` (and their callers) with Go 1.26's `new(expr)`.
These fixes are in the same PR so CI doesn't fail the moment the bump
lands. A manual fixup commit removes the redundant `field := field`
shadows and the now-dead `*Ptr` helpers the auto-fix left behind
(including rewriting 20 `int64Ptr(N)` callers to `new(int64(N))`).
Release notes: https://go.dev/doc/go1.26
## Test plan
- `go build ./...` and `go vet ./...` clean on all four modules
- `go tool -modfile=tools/go.mod golangci-lint run ./...` — 0 issues
- Unit tests pass on all packages touched by the `--fix` and cleanup
This pull request and its description were written by Isaac.
Updates `github.com/golangci/golangci-lint/v2` from v2.11.4 to v2.12.2 in `tools/go.mod`. Release notes: https://github.com/golangci/golangci-lint/releases/tag/v2.12.2 Replaces the deprecated `reflect.Ptr` with `reflect.Pointer` across 12 files (auto-fixed by the new govet `inline` analyzer). This pull request and its description were written by Isaac.
## Why
Pulls in four releases of the Go SDK (v0.133 through v0.136).
## Changes
**Before:** CLI pinned `databricks-sdk-go` at `v0.132.0` and OpenAPI
spec at SHA `a499dda0`.
**Now:** Pinned at `v0.136.0` / OpenAPI SHA `0555d6a5`.
Most of the diff is regenerated output from `./task generate` (CLI
command stubs, JSON schema, bundle docs, Python bindings, acceptance
goldens). Notable in this batch:
- **New `cmd/workspace/bundle/`** — the auto-generated `databricks
bundle` workspace commands fronting the DMS service (`CreateDeployment`,
`CreateVersion`, `CreateResource`, `CreateOperation`, `Heartbeat`,
`CompleteVersion`, etc.). The interface is currently marked `Deprecated`
in the SDK; this is a generator artifact, not a real deprecation.
- Refreshed pydabs models for new SDK types (`pipelines.Transformer*`,
`pipelines.JsonTransformerOptions`, `pipelines.KafkaOptions`,
`jobs.PythonOperatorTask*`).
Hand-written changes:
- **`CurrentUser.Me` signature:** v0.136 changed it from `Me(ctx)` to
`Me(ctx, iam.MeRequest{})`. Updated 14 production callsites (`cmd/auth`,
`cmd/apps`, `cmd/psql`, `cmd/sync`, `bundle/config/mutator`,
`libs/template`, `libs/sync`, `libs/databrickscfg/cfgpickers`,
`experimental/postgres`,
`experimental/ssh/internal/{client,keys,workspace}`,
`integration/internal/acc`, `acceptance/internal/prepare_server.go`,
`acceptance/dbr_test.go`) plus 3 mocked test expectations in
`cmd/auth/describe_test.go` (`Me(mock.Anything)` -> `Me(mock.Anything,
mock.Anything)`).
<details><summary>SDK v0.132 -> v0.136 changelog summary</summary>
- **v0.133:** WorkspaceAssignmentDetails methods on `a.AccountIamV2` /
`w.WorkspaceIamV2`. `jobs.PythonOperatorTask` on
`RunTask`/`SubmitTask`/`Task`.
`pipelines.ConnectorOptions.KafkaOptions`. Several Postgres / settings
additions. [Breaking] `ml.ListFeaturesRequest` argument order changes;
`postgres.RequestedResource.UnspecifiedResourceName` removed.
- **v0.134:** Jobs `PipelineParams` / `PipelineTask` gained
`FullRefreshSelection`, `RefreshFlowSelection`, `RefreshSelection`,
`ResetCheckpointSelection`. `settingsv2.Setting` gained
`OperationalEmailCustomRecipient` fields.
- **v0.135:** **Added `bundle` package** and `w.Bundle` workspace-level
service. `ml.AuthConfig.MtlsConfig`.
- **v0.136:** Postgres `UndeleteBranch` + branch delete/purge plumbing.
`iam.MeRequest.{Attributes,ExcludedAttributes}` (the `CurrentUser.Me`
signature change). [Breaking] `bundle.Operation.{ActionType,ResourceId}`
and `bundle.Version.CliVersion` made required. [Breaking]
`marketplace.ListListingsRequest.Tags` retyped to `ListingTag`.
[Breaking] `ClustersAPI.Events` pagination shape changed (genkit
absorbed this).
</details>
## Test plan
- [x] `go build ./...`
- [x] `go vet ./...`
- [x] `go test ./internal/build ./bundle/internal/schema
./bundle/direct/dresources ./bundle/config/resources ./libs/template
./bundle/config/mutator`
- [x] `TestConsistentDatabricksSdkVersion` confirms SDK version and
OpenAPI SHA match
- [x] Pydabs codegen tests (8 passed)
- [ ] CI on this PR
---
Replaces databricks#5298 -- moved branch from my fork to upstream so the
JFrog/OIDC token exchange in the test setup works (`id-token: write` is
denied to fork PRs by GitHub Actions).
## Summary - Update `cli-compat.json` to point CLI version `1.0.0` at AppKit `0.38.0` (from `0.37.0`) ## Test plan - [ ] CI passes (`go test ./libs/clicompat/...`) This pull request and its description were written by Isaac.
…MENTAL] tag Co-authored-by: Isaac
|
An authorized user can trigger integration tests manually by following the instructions below: Trigger: Inputs:
Checks will be approved automatically on success. |
Summary
databricks ssh: common-workflows examples now lead with serverless (no flags), with the dedicated-cluster path as a follow-up.databricks ssh connect: Long description groups example invocations by serverless vs dedicated. Unhides--name,--accelerator,--ide,--environment-versionso users can discover them via--help.databricks ssh setup: tightened Short/Long to clarify it's for dedicated clusters; users on serverless should just useconnect.CUJ: https://docs.google.com/document/d/1WnIg2vrnPR98cMay8OTY1zJ4yWcKBAHdZUXi5AhYylU/edit?tab=t.7erhv6e67uw#heading=h.kj99al6d2ch
Tracked at DECO-27026 (under epic DECO-27015 FY27Q2 P0 [IDE-Remote] CLI UX).
Test plan
databricks ssh --helpand verify serverless examples appear firstdatabricks ssh connect --helpand verify--name,--accelerator,--ide,--environment-versionare visible (not hidden)databricks ssh setup --helpand verify it references dedicated clusters and points users toconnectfor serverlessThis pull request and its description were written by Isaac.