Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/minds/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Internal type-checker compatibility fix for the workspace dependency refresh: the newer `click` release annotates `ClickException.exit_code` as a `ClassVar`, so `ImbueCloudCliError`'s deliberate per-instance `exit_code` override is now marked as an intentional override. No behavior change.
5 changes: 4 additions & 1 deletion apps/minds/imbue/minds/desktop_client/imbue_cloud_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ class ImbueCloudCliError(MindError):
that only want the message can use the regular MindError signature.
"""

exit_code: int = 1
# click's ClickException declares exit_code as a ClassVar; we deliberately
# override it as a per-instance attribute so each raised error carries the
# wrapped subprocess's own exit code (set by the helpers that raise this).
exit_code: int = 1 # ty: ignore[invalid-attribute-override]
stdout: str = ""
stderr: str = ""

Expand Down
1 change: 1 addition & 0 deletions dev/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Advance the `exclude-newer` supply-chain cooldown in the root `pyproject.toml` from 2026-06-04 to 2026-06-27 (two weeks before the current date) so the workspace can resolve `azure-mgmt-resource` 26.0.0. This normally advances automatically at release time; it was stale because the last release predated the 26.0.0 dependency. Re-resolves `uv.lock` accordingly.
5 changes: 5 additions & 0 deletions libs/mngr/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
`mngr config` and `mngr plugin` now require a subcommand, matching every other command group. Previously each was `invoke_without_command`, so running it bare printed help and exited 0. Now a bare `mngr config` / `mngr plugin` prints the standard usage/help listing and exits with the usual usage-error code (2), exactly like `mngr snapshot` and friends. The full man-page-style help is still available via `mngr config --help` / `mngr plugin --help`.

Regenerated the `config`, `plugin`, and `usage` command reference docs. `config`/`plugin` now render `COMMAND` (required) instead of `[COMMAND]`; the `usage` doc reflects a rendering change in the newer `click` release pulled in by the workspace dependency refresh (`usage` remains runnable bare -- it prints the usage snapshot).

Internal type-annotation touch-up in a create test to satisfy the updated type checker.
2 changes: 1 addition & 1 deletion libs/mngr/docs/commands/secondary/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Per-source aggregation:
**Usage:**

```text
mngr usage [OPTIONS] COMMAND [ARGS]...
mngr usage [OPTIONS] [COMMAND] [ARGS]...
```
**Options:**

Expand Down
31 changes: 29 additions & 2 deletions libs/mngr/imbue/mngr/api/create_test.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from collections.abc import Generator
from collections.abc import Mapping
from collections.abc import Sequence
from contextlib import contextmanager
from pathlib import Path

Expand All @@ -25,6 +27,7 @@
from imbue.mngr.interfaces.cleanup_failures import CleanupFailedGroup
from imbue.mngr.interfaces.data_types import CleanupFailure
from imbue.mngr.interfaces.data_types import CleanupFailureCategory
from imbue.mngr.interfaces.data_types import HostLifecycleOptions
from imbue.mngr.interfaces.host import AgentLabelOptions
from imbue.mngr.interfaces.host import CreateAgentOptions
from imbue.mngr.interfaces.host import HostEnvironmentOptions
Expand All @@ -39,8 +42,10 @@
from imbue.mngr.primitives import HostId
from imbue.mngr.primitives import HostName
from imbue.mngr.primitives import HostNameStyle
from imbue.mngr.primitives import ImageReference
from imbue.mngr.primitives import LOCAL_PROVIDER_NAME
from imbue.mngr.primitives import ProviderInstanceName
from imbue.mngr.primitives import SnapshotName
from imbue.mngr.primitives import TransferMode
from imbue.mngr.providers.local.instance import LOCAL_HOST_NAME
from imbue.mngr.providers.local.instance import LocalProviderInstance
Expand Down Expand Up @@ -293,12 +298,34 @@ def test_create_new_host_retries_on_name_conflict(
create_count = 0
original_create_host = LocalProviderInstance.create_host

def create_host_that_conflicts_once(self: LocalProviderInstance, name: HostName, **kwargs: object) -> Host:
def create_host_that_conflicts_once(
self: LocalProviderInstance,
name: HostName,
image: ImageReference | None = None,
tags: Mapping[str, str] | None = None,
build_args: Sequence[str] | None = None,
start_args: Sequence[str] | None = None,
lifecycle: HostLifecycleOptions | None = None,
known_hosts: Sequence[str] | None = None,
authorized_keys: Sequence[str] | None = None,
snapshot: SnapshotName | None = None,
) -> Host:
nonlocal create_count
create_count += 1
if create_count == 1:
raise HostNameConflictError(self.name, name)
return original_create_host(self, name=name, **kwargs)
return original_create_host(
self,
name=name,
image=image,
tags=tags,
build_args=build_args,
start_args=start_args,
lifecycle=lifecycle,
known_hosts=known_hosts,
authorized_keys=authorized_keys,
snapshot=snapshot,
)

test_provider_cls = type(
"_ConflictTestProvider",
Expand Down
14 changes: 5 additions & 9 deletions libs/mngr/imbue/mngr/cli/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
from imbue.mngr.cli.common_opts import setup_command_context
from imbue.mngr.cli.help_formatter import CommandHelpMetadata
from imbue.mngr.cli.help_formatter import add_pager_help_option
from imbue.mngr.cli.help_formatter import show_help_with_pager
from imbue.mngr.cli.output_helpers import AbortError
from imbue.mngr.cli.output_helpers import emit_format_template_lines
from imbue.mngr.cli.output_helpers import write_human_line
Expand Down Expand Up @@ -171,7 +170,7 @@ def _flatten_config(config: dict[str, Any], prefix: str = "") -> list[tuple[str,
return result


@click.group(name="config", invoke_without_command=True)
@click.group(name="config")
@click.option(
"--scope",
type=click.Choice(["user", "project", "local"], case_sensitive=False),
Expand All @@ -180,13 +179,10 @@ def _flatten_config(config: dict[str, Any], prefix: str = "") -> list[tuple[str,
@add_common_options
@click.pass_context
def config(ctx: click.Context, **kwargs: Any) -> None:
if ctx.invoked_subcommand is None:
mngr_ctx, _, _ = setup_command_context(
ctx=ctx,
command_name="config",
command_class=ConfigCliOptions,
)
show_help_with_pager(ctx, ctx.command, mngr_ctx.config)
# A subcommand is required; running this group bare prints its help/usage
# listing and exits with a usage error (like snapshot/git), so this group
# callback has nothing to do itself.
pass


@config.command(name="list")
Expand Down
9 changes: 5 additions & 4 deletions libs/mngr/imbue/mngr/cli/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
from imbue.mngr.cli.config import get_config_path
from imbue.mngr.cli.help_formatter import CommandHelpMetadata
from imbue.mngr.cli.help_formatter import add_pager_help_option
from imbue.mngr.cli.help_formatter import show_help_with_pager
from imbue.mngr.cli.output_helpers import AbortError
from imbue.mngr.cli.output_helpers import emit_format_template_lines
from imbue.mngr.cli.output_helpers import write_human_line
Expand Down Expand Up @@ -336,12 +335,14 @@ def _emit_plugin_remove_result(
assert_never(unreachable)


@click.group(name="plugin", invoke_without_command=True)
@click.group(name="plugin")
@add_common_options
@click.pass_context
def plugin(ctx: click.Context, **kwargs: Any) -> None:
if ctx.invoked_subcommand is None:
show_help_with_pager(ctx, ctx.command, None)
# A subcommand is required; running this group bare prints its help/usage
# listing and exits with a usage error (like snapshot/git), so this group
# callback has nothing to do itself.
pass


@plugin.command(name="list")
Expand Down
9 changes: 5 additions & 4 deletions libs/mngr/imbue/mngr/cli/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,11 @@ def test_plugin_without_subcommand_shows_help(
cli_runner: CliRunner,
plugin_manager: pluggy.PluginManager,
) -> None:
"""Test that invoking plugin with no subcommand shows help text.
"""Invoking plugin with no subcommand is a usage error that shows help.

Help output goes through show_help_with_pager, which writes to stdout
in non-interactive mode (as used by CliRunner).
``plugin`` requires a subcommand (it is not ``invoke_without_command``), so
click renders the usage/help listing and exits with the standard usage-error
code, exactly like every other required-subcommand group.
"""
result = cli_runner.invoke(
plugin,
Expand All @@ -135,7 +136,7 @@ def test_plugin_without_subcommand_shows_help(
catch_exceptions=False,
)

assert result.exit_code == 0
assert result.exit_code == 2
assert "list" in result.output.lower()


Expand Down
2 changes: 1 addition & 1 deletion libs/mngr/imbue/mngr/utils/test_ratchets.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def test_prevent_bare_except() -> None:


def test_prevent_broad_exception_catch() -> None:
rc.check_broad_exception_catch(_DIR, snapshot(8))
rc.check_broad_exception_catch(_DIR, snapshot(7))


def test_prevent_base_exception_catch() -> None:
Expand Down
1 change: 1 addition & 0 deletions libs/mngr_azure/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix the azure plugin to work with `azure-mgmt-resource` 26. Version 26.0.0 made `azure.mgmt.resource` a namespace package and moved `ResourceManagementClient` into `azure.mgmt.resource.resources`, so the old `from azure.mgmt.resource import ResourceManagementClient` raised `ImportError` on import and crashed every `mngr` invocation once the plugin was installed. The import now uses `azure.mgmt.resource.resources`, and the dependency pin is raised to `azure-mgmt-resource>=26`.
2 changes: 1 addition & 1 deletion libs/mngr_azure/imbue/mngr_azure/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from azure.mgmt.compute import models as compute_models
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.network import models as network_models
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.resource.resources import ResourceManagementClient
from azure.mgmt.resource.resources.models import ResourceGroup
from loguru import logger
from pydantic import ConfigDict
Expand Down
2 changes: 1 addition & 1 deletion libs/mngr_azure/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ dependencies = [
"azure-identity>=1.25",
"azure-mgmt-compute>=37",
"azure-mgmt-network>=30",
"azure-mgmt-resource>=25",
"azure-mgmt-resource>=26",
"azure-mgmt-authorization>=4",
"azure-core>=1.41",
"azure-storage-blob>=12.28",
Expand Down
1 change: 1 addition & 0 deletions libs/mngr_kanpan/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Internal type-checker compatibility fixes for the workspace dependency refresh: the OSC 8 hyperlink canvas wrapper's `coords`/`translate_coords` now return `Mapping` (matching urwid's read-only coords) and its `content` signature matches urwid's `int` column/row parameters. No behavior change.
9 changes: 4 additions & 5 deletions libs/mngr_kanpan/imbue/mngr_kanpan/tui.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import time
from collections.abc import Callable
from collections.abc import Hashable
from collections.abc import Mapping
from collections.abc import Sequence
from concurrent.futures import Future
from concurrent.futures import ThreadPoolExecutor
Expand Down Expand Up @@ -239,7 +240,7 @@ def widget_info(self) -> Any:
return self._widget_info

@property
def coords(self) -> dict[str, Any]:
def coords(self) -> Mapping[str, Any]:
return self.inner.coords

@property
Expand All @@ -263,12 +264,10 @@ def rows(self) -> int:
def cols(self) -> int:
return self.inner.cols()

def translate_coords(self, dx: int, dy: int) -> dict[str, Any]:
def translate_coords(self, dx: int, dy: int) -> Mapping[str, Any]:
return self.inner.translate_coords(dx, dy)

def content(
self, trim_left: int = 0, trim_top: int = 0, cols: int | None = 0, rows: int | None = 0, attr: Any = None
) -> Any:
def content(self, trim_left: int = 0, trim_top: int = 0, cols: int = 0, rows: int = 0, attr: Any = None) -> Any:
osc_open = f"\033]8;;{self.url}\033\\".encode()
osc_close = b"\033]8;;\033\\"
return _osc8_wrap_content(self.inner.content(trim_left, trim_top, cols, rows, attr), osc_open, osc_close)
Expand Down
1 change: 1 addition & 0 deletions libs/resource_guards/changelog/ev-azure-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Internal test cleanup for the workspace dependency refresh: removed a `ty: ignore` directive that the updated type checker no longer needs. No behavior change.
Original file line number Diff line number Diff line change
Expand Up @@ -1297,7 +1297,7 @@ def guarded_send(self, data: str) -> str:

def install() -> None:
originals["send"] = FakeClient.send
FakeClient.send = guarded_send # ty: ignore[invalid-assignment]
FakeClient.send = guarded_send

def cleanup() -> None:
if "send" in originals:
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies = [
# only ever forward -- pushing it back would re-exclude a deliberately-pinned
# fresh dep and break resolution. This only buys a detection delay;
# it can't catch a compromise that stays undetected past the window.
exclude-newer = "2026-06-04T00:00:00Z"
exclude-newer = "2026-06-27T00:00:00Z"

[tool.uv.sources]
imbue-common = { workspace = true }
Expand Down
Loading
Loading