diff --git a/cli/cli-spec.json b/cli/cli-spec.json index e7db17317..4826bd1ad 100644 --- a/cli/cli-spec.json +++ b/cli/cli-spec.json @@ -10,8 +10,8 @@ "logoMini": "\u25c6 mem0", "tagline": "The Memory Layer for AI Agents", "colors": { - "brand": "#F1C96C", - "accent": "#F5D78E", + "brand": "#8b5cf6", + "accent": "#a78bfa", "success": "#22c55e", "error": "#ef4444", "warning": "#f59e0b", diff --git a/cli/node/README.md b/cli/node/README.md index 917b430e6..6110d1149 100644 --- a/cli/node/README.md +++ b/cli/node/README.md @@ -2,10 +2,12 @@ The official command-line interface for [mem0](https://mem0.ai) — the memory layer for AI agents. TypeScript implementation. +> **Built for AI agents.** Pass `--agent` (or `--json`) as a global flag on any command to get structured JSON output optimized for programmatic consumption — sanitized fields, no colors or spinners, and errors as JSON too. + ## Prerequisites - Node.js **18+** -- pnpm (`npm install -g pnpm`) +- pnpm (`npm install -g pnpm`) — for development only ## Installation @@ -13,22 +15,307 @@ The official command-line interface for [mem0](https://mem0.ai) — the memory l npm install -g @mem0/cli ``` -Or from source: +## Quick start ```bash -cd node -pnpm install -pnpm build -pnpm link --global +# Interactive setup wizard +mem0 init -# Now use it like a normal CLI -mem0 --help +# Or login via email +mem0 init --email alice@company.com + +# Or authenticate with an existing API key +mem0 init --api-key m0-xxx + +# Add a memory +mem0 add "I prefer dark mode and use vim keybindings" --user-id alice + +# Search memories +mem0 search "What are Alice's preferences?" --user-id alice + +# List all memories for a user +mem0 list --user-id alice + +# Get a specific memory +mem0 get + +# Update a memory +mem0 update "I switched to light mode" + +# Delete a memory +mem0 delete ``` -## Running during development +## Commands + +### `mem0 init` + +Interactive setup wizard. Prompts for your API key and default user ID. ```bash -cd node +mem0 init +mem0 init --api-key m0-xxx --user-id alice +mem0 init --email alice@company.com +``` + +If an existing configuration is detected, the CLI asks for confirmation before overwriting. Use `--force` to skip the prompt (useful in CI/CD). + +```bash +mem0 init --api-key m0-xxx --user-id alice --force +``` + +| Flag | Description | +|------|-------------| +| `--api-key` | API key (skip prompt) | +| `-u, --user-id` | Default user ID (skip prompt) | +| `--email` | Login via email verification code | +| `--code` | Verification code (use with `--email` for non-interactive login) | +| `--force` | Overwrite existing config without confirmation | + +### `mem0 add` + +Add a memory from text, a JSON messages array, a file, or stdin. + +```bash +mem0 add "I prefer dark mode" --user-id alice +mem0 add --file conversation.json --user-id alice +echo "Loves hiking on weekends" | mem0 add --user-id alice +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Scope to a user | +| `--agent-id` | Scope to an agent | +| `--messages` | Conversation messages as JSON | +| `-f, --file` | Read messages from a JSON file | +| `-m, --metadata` | Custom metadata as JSON | +| `--categories` | Categories (JSON array or comma-separated) | +| `--graph / --no-graph` | Enable or disable graph memory extraction | +| `-o, --output` | Output format: `text`, `json`, `quiet` | + +### `mem0 search` + +Search memories using natural language. + +```bash +mem0 search "dietary restrictions" --user-id alice +mem0 search "preferred tools" --user-id alice --output json --top-k 5 +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Filter by user | +| `-k, --top-k` | Number of results (default: 10) | +| `--threshold` | Minimum similarity score (default: 0.3) | +| `--rerank` | Enable reranking | +| `--keyword` | Use keyword search instead of semantic | +| `--filter` | Advanced filter expression (JSON) | +| `--graph / --no-graph` | Enable or disable graph in search | +| `-o, --output` | Output format: `text`, `json`, `table` | + +### `mem0 list` + +List memories with optional filters and pagination. + +```bash +mem0 list --user-id alice +mem0 list --user-id alice --category preferences --output json +mem0 list --user-id alice --after 2024-01-01 --page-size 50 +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Filter by user | +| `--page` | Page number (default: 1) | +| `--page-size` | Results per page (default: 100) | +| `--category` | Filter by category | +| `--after` | Created after date (YYYY-MM-DD) | +| `--before` | Created before date (YYYY-MM-DD) | +| `-o, --output` | Output format: `text`, `json`, `table` | + +### `mem0 get` + +Retrieve a specific memory by ID. + +```bash +mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789 +mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789 --output json +``` + +### `mem0 update` + +Update the text or metadata of an existing memory. + +```bash +mem0 update "Updated preference text" +mem0 update --metadata '{"priority": "high"}' +echo "new text" | mem0 update +``` + +### `mem0 delete` + +Delete a single memory, all memories for a scope, or an entire entity. + +```bash +# Delete a single memory +mem0 delete + +# Delete all memories for a user +mem0 delete --all --user-id alice --force + +# Delete all memories project-wide +mem0 delete --all --project --force + +# Preview what would be deleted +mem0 delete --all --user-id alice --dry-run +``` + +| Flag | Description | +|------|-------------| +| `--all` | Delete all memories matching scope filters | +| `--entity` | Delete the entity and all its memories | +| `--project` | With `--all`: delete all memories project-wide | +| `--dry-run` | Preview without deleting | +| `--force` | Skip confirmation prompt | + +### `mem0 import` + +Bulk import memories from a JSON file. + +```bash +mem0 import data.json --user-id alice +``` + +The file should be a JSON array where each item has a `memory` (or `text` or `content`) field and optional `user_id`, `agent_id`, and `metadata` fields. + +### `mem0 config` + +View or modify the local CLI configuration. + +```bash +mem0 config show # Display current config (secrets redacted) +mem0 config get api_key # Get a specific value +mem0 config set user_id bob # Set a value +``` + +### `mem0 entity` + +List or delete entities (users, agents, apps, runs). + +```bash +mem0 entity list users +mem0 entity list agents --output json +mem0 entity delete --user-id alice --force +``` + +### `mem0 event` + +Inspect background processing events created by async operations (e.g. bulk deletes, large add jobs). + +```bash +# List recent events +mem0 event list + +# Check the status of a specific event +mem0 event status +``` + +| Flag | Description | +|------|-------------| +| `-o, --output` | Output format: `text`, `json` | + +### `mem0 status` + +Verify your API connection and display the current project. + +```bash +mem0 status +``` + +### `mem0 version` + +Print the CLI version. + +```bash +mem0 version +``` + +## Agent mode + +Pass `--agent` (or its alias `--json`) as a **global flag** on any command to get output designed for AI agent tool loops: + +```bash +mem0 --agent search "user preferences" --user-id alice +mem0 --agent add "User prefers dark mode" --user-id alice +mem0 --agent list --user-id alice +mem0 --agent delete --all --user-id alice --force +``` + +Every command returns the same envelope shape: + +```json +{ + "status": "success", + "command": "search", + "duration_ms": 134, + "scope": { "user_id": "alice" }, + "count": 2, + "data": [ + { "id": "abc-123", "memory": "User prefers dark mode", "score": 0.97, "created_at": "2026-01-15", "categories": ["preferences"] } + ] +} +``` + +What agent mode does differently from `--output json`: + +- **Sanitized `data`**: only the fields an agent needs (id, memory, score, etc.) — no internal API noise +- **No human output**: spinners, colors, and banners are suppressed entirely +- **Errors as JSON**: errors go to stdout as `{"status": "error", "command": "...", "error": "..."}` with a non-zero exit code + +Use `mem0 help --json` to get the full command tree as JSON — useful for agents that need to self-discover available commands. + +## Output formats + +Control how results are displayed with `--output`: + +| Format | Description | +|--------|-------------| +| `text` | Human-readable with colors and formatting (default) | +| `json` | Structured JSON for piping to `jq` (raw API response) | +| `table` | Tabular format (default for `list`) | +| `quiet` | Minimal — just IDs or status codes | +| `agent` | Structured JSON envelope with sanitized fields (set by `--agent`/`--json`) | + +## Global flags + +These flags are available on all commands: + +| Flag | Description | +|------|-------------| +| `--json` | Enable agent mode: structured JSON envelope output, no colors or spinners | +| `--agent` | Alias for `--json` | +| `--api-key` | Override the configured API key for this request | +| `--base-url` | Override the configured API base URL for this request | +| `-o, --output` | Set the output format | + +## Environment variables + +| Variable | Description | +|----------|-------------| +| `MEM0_API_KEY` | API key (overrides config file) | +| `MEM0_BASE_URL` | API base URL | +| `MEM0_USER_ID` | Default user ID | +| `MEM0_AGENT_ID` | Default agent ID | +| `MEM0_APP_ID` | Default app ID | +| `MEM0_RUN_ID` | Default run ID | +| `MEM0_ENABLE_GRAPH` | Enable graph memory (`true` / `false`) | + +Environment variables take precedence over values in the config file, which take precedence over defaults. + +## Development + +```bash +cd cli/node pnpm install # Development mode (runs TypeScript directly, no build needed) @@ -39,36 +326,11 @@ pnpm dev search "test" --user-id alice # Or build first, then run the compiled JS pnpm build node dist/index.js --help -node dist/index.js add "test memory" --user-id alice ``` -## Quick Start +## Documentation -```bash -# Set up your configuration -mem0 init - -# Add a memory -mem0 add "I prefer dark mode and use vim keybindings" --user-id alice - -# Search memories -mem0 search "What are Alice's preferences?" --user-id alice - -# List all memories -mem0 list --user-id alice -``` - -## Environment Variables - -| Variable | Description | -|----------|-------------| -| `MEM0_API_KEY` | API key (overrides config file) | -| `MEM0_BASE_URL` | API base URL | -| `MEM0_USER_ID` | Default user ID | -| `MEM0_AGENT_ID` | Default agent ID | -| `MEM0_APP_ID` | Default app ID | -| `MEM0_RUN_ID` | Default run ID | -| `MEM0_ENABLE_GRAPH` | Enable graph memory (true/false) | +Full documentation is available at [docs.mem0.ai/platform/cli](https://docs.mem0.ai/platform/cli). ## License diff --git a/cli/node/package.json b/cli/node/package.json index 02f6e1887..b0daf3361 100644 --- a/cli/node/package.json +++ b/cli/node/package.json @@ -1,6 +1,6 @@ { "name": "@mem0/cli", - "version": "0.1.2", + "version": "0.2.1", "description": "The official CLI for mem0 — the memory layer for AI agents", "type": "module", "bin": { diff --git a/cli/node/src/branding.ts b/cli/node/src/branding.ts index 79ced2efe..10c6aa094 100644 --- a/cli/node/src/branding.ts +++ b/cli/node/src/branding.ts @@ -19,8 +19,8 @@ export const LOGO = ` export const LOGO_MINI = "◆ mem0"; export const TAGLINE = "The Memory Layer for AI Agents"; -export const BRAND_COLOR = "#F1C96C"; -export const ACCENT_COLOR = "#F5D78E"; +export const BRAND_COLOR = "#8b5cf6"; +export const ACCENT_COLOR = "#a78bfa"; export const SUCCESS_COLOR = "#22c55e"; export const ERROR_COLOR = "#ef4444"; export const WARNING_COLOR = "#f59e0b"; diff --git a/cli/node/tests/branding.test.ts b/cli/node/tests/branding.test.ts index 33916aace..9e93b3423 100644 --- a/cli/node/tests/branding.test.ts +++ b/cli/node/tests/branding.test.ts @@ -39,7 +39,7 @@ afterEach(() => { describe("branding constants", () => { it("has correct brand color", () => { - expect(BRAND_COLOR).toBe("#F1C96C"); + expect(BRAND_COLOR).toBe("#8b5cf6"); }); it("has correct tagline", () => { diff --git a/cli/python/README.md b/cli/python/README.md index f5fda837f..a6ac0beb1 100644 --- a/cli/python/README.md +++ b/cli/python/README.md @@ -1,6 +1,12 @@ -# mem0 CLI +# mem0 CLI (Python) -The official command-line interface for [mem0](https://mem0.ai) — the memory layer for AI agents. +The official command-line interface for [mem0](https://mem0.ai) — the memory layer for AI agents. Python implementation. + +> **Built for AI agents.** Pass `--agent` (or `--json`) as a global flag on any command to get structured JSON output optimized for programmatic consumption — sanitized fields, no colors or spinners, and errors as JSON too. + +## Prerequisites + +- Python **3.10+** ## Installation @@ -18,28 +24,325 @@ pip install mem0-cli > **Note:** On macOS with Homebrew Python, `pip install` outside a virtual environment will fail with an `externally-managed-environment` error ([PEP 668](https://peps.python.org/pep-0668/)). Use `pipx` instead, or install inside a virtual environment. -## Quick Start +## Quick start ```bash -# Set up your configuration +# Interactive setup wizard mem0 init +# Or login via email +mem0 init --email alice@company.com + +# Or authenticate with an existing API key +mem0 init --api-key m0-xxx + # Add a memory mem0 add "I prefer dark mode and use vim keybindings" --user-id alice # Search memories mem0 search "What are Alice's preferences?" --user-id alice -# List all memories +# List all memories for a user mem0 list --user-id alice + +# Get a specific memory +mem0 get + +# Update a memory +mem0 update "I switched to light mode" + +# Delete a memory +mem0 delete +``` + +## Commands + +### `mem0 init` + +Interactive setup wizard. Prompts for your API key and default user ID. + +```bash +mem0 init +mem0 init --api-key m0-xxx --user-id alice +mem0 init --email alice@company.com +``` + +If an existing configuration is detected, the CLI asks for confirmation before overwriting. Use `--force` to skip the prompt (useful in CI/CD). + +```bash +mem0 init --api-key m0-xxx --user-id alice --force +``` + +| Flag | Description | +|------|-------------| +| `--api-key` | API key (skip prompt) | +| `-u, --user-id` | Default user ID (skip prompt) | +| `--email` | Login via email verification code | +| `--code` | Verification code (use with `--email` for non-interactive login) | +| `--force` | Overwrite existing config without confirmation | + +### `mem0 add` + +Add a memory from text, a JSON messages array, a file, or stdin. + +```bash +mem0 add "I prefer dark mode" --user-id alice +mem0 add --file conversation.json --user-id alice +echo "Loves hiking on weekends" | mem0 add --user-id alice +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Scope to a user | +| `--agent-id` | Scope to an agent | +| `--messages` | Conversation messages as JSON | +| `-f, --file` | Read messages from a JSON file | +| `-m, --metadata` | Custom metadata as JSON | +| `--categories` | Categories (JSON array or comma-separated) | +| `--graph / --no-graph` | Enable or disable graph memory extraction | +| `-o, --output` | Output format: `text`, `json`, `quiet` | + +### `mem0 search` + +Search memories using natural language. + +```bash +mem0 search "dietary restrictions" --user-id alice +mem0 search "preferred tools" --user-id alice --output json --top-k 5 +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Filter by user | +| `-k, --top-k` | Number of results (default: 10) | +| `--threshold` | Minimum similarity score (default: 0.3) | +| `--rerank` | Enable reranking | +| `--keyword` | Use keyword search instead of semantic | +| `--filter` | Advanced filter expression (JSON) | +| `--graph / --no-graph` | Enable or disable graph in search | +| `-o, --output` | Output format: `text`, `json`, `table` | + +### `mem0 list` + +List memories with optional filters and pagination. + +```bash +mem0 list --user-id alice +mem0 list --user-id alice --category preferences --output json +mem0 list --user-id alice --after 2024-01-01 --page-size 50 +``` + +| Flag | Description | +|------|-------------| +| `-u, --user-id` | Filter by user | +| `--page` | Page number (default: 1) | +| `--page-size` | Results per page (default: 100) | +| `--category` | Filter by category | +| `--after` | Created after date (YYYY-MM-DD) | +| `--before` | Created before date (YYYY-MM-DD) | +| `-o, --output` | Output format: `text`, `json`, `table` | + +### `mem0 get` + +Retrieve a specific memory by ID. + +```bash +mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789 +mem0 get 7b3c1a2e-4d5f-6789-abcd-ef0123456789 --output json +``` + +### `mem0 update` + +Update the text or metadata of an existing memory. + +```bash +mem0 update "Updated preference text" +mem0 update --metadata '{"priority": "high"}' +echo "new text" | mem0 update +``` + +### `mem0 delete` + +Delete a single memory, all memories for a scope, or an entire entity. + +```bash +# Delete a single memory +mem0 delete + +# Delete all memories for a user +mem0 delete --all --user-id alice --force + +# Delete all memories project-wide +mem0 delete --all --project --force + +# Preview what would be deleted +mem0 delete --all --user-id alice --dry-run +``` + +| Flag | Description | +|------|-------------| +| `--all` | Delete all memories matching scope filters | +| `--entity` | Delete the entity and all its memories | +| `--project` | With `--all`: delete all memories project-wide | +| `--dry-run` | Preview without deleting | +| `--force` | Skip confirmation prompt | + +### `mem0 import` + +Bulk import memories from a JSON file. + +```bash +mem0 import data.json --user-id alice +``` + +The file should be a JSON array where each item has a `memory` (or `text` or `content`) field and optional `user_id`, `agent_id`, and `metadata` fields. + +### `mem0 config` + +View or modify the local CLI configuration. + +```bash +mem0 config show # Display current config (secrets redacted) +mem0 config get api_key # Get a specific value +mem0 config set user_id bob # Set a value +``` + +### `mem0 entity` + +List or delete entities (users, agents, apps, runs). + +```bash +mem0 entity list users +mem0 entity list agents --output json +mem0 entity delete --user-id alice --force +``` + +### `mem0 event` + +Inspect background processing events created by async operations (e.g. bulk deletes, large add jobs). + +```bash +# List recent events +mem0 event list + +# Check the status of a specific event +mem0 event status +``` + +| Flag | Description | +|------|-------------| +| `-o, --output` | Output format: `text`, `json` | + +### `mem0 status` + +Verify your API connection and display the current project. + +```bash +mem0 status +``` + +### `mem0 version` + +Print the CLI version. + +```bash +mem0 version +``` + +## Agent mode + +Pass `--agent` (or its alias `--json`) as a **global flag** on any command to get output designed for AI agent tool loops: + +```bash +mem0 --agent search "user preferences" --user-id alice +mem0 --agent add "User prefers dark mode" --user-id alice +mem0 --agent list --user-id alice +mem0 --agent delete --all --user-id alice --force +``` + +Every command returns the same envelope shape: + +```json +{ + "status": "success", + "command": "search", + "duration_ms": 134, + "scope": { "user_id": "alice" }, + "count": 2, + "data": [ + { "id": "abc-123", "memory": "User prefers dark mode", "score": 0.97, "created_at": "2026-01-15", "categories": ["preferences"] } + ] +} +``` + +What agent mode does differently from `--output json`: + +- **Sanitized `data`**: only the fields an agent needs (id, memory, score, etc.) — no internal API noise +- **No human output**: spinners, colors, and banners are suppressed entirely +- **Errors as JSON**: errors go to stdout as `{"status": "error", "command": "...", "error": "..."}` with a non-zero exit code + +Use `mem0 help --json` to get the full command tree as JSON — useful for agents that need to self-discover available commands. + +## Output formats + +Control how results are displayed with `--output`: + +| Format | Description | +|--------|-------------| +| `text` | Human-readable with colors and formatting (default) | +| `json` | Structured JSON for piping to `jq` (raw API response) | +| `table` | Tabular format (default for `list`) | +| `quiet` | Minimal — just IDs or status codes | +| `agent` | Structured JSON envelope with sanitized fields (set by `--agent`/`--json`) | + +## Global flags + +These flags are available on all commands: + +| Flag | Description | +|------|-------------| +| `--json` | Enable agent mode: structured JSON envelope output, no colors or spinners | +| `--agent` | Alias for `--json` | +| `--api-key` | Override the configured API key for this request | +| `--base-url` | Override the configured API base URL for this request | +| `-o, --output` | Set the output format | + +## Environment variables + +| Variable | Description | +|----------|-------------| +| `MEM0_API_KEY` | API key (overrides config file) | +| `MEM0_BASE_URL` | API base URL | +| `MEM0_USER_ID` | Default user ID | +| `MEM0_AGENT_ID` | Default agent ID | +| `MEM0_APP_ID` | Default app ID | +| `MEM0_RUN_ID` | Default run ID | +| `MEM0_ENABLE_GRAPH` | Enable graph memory (`true` / `false`) | + +Environment variables take precedence over values in the config file, which take precedence over defaults. + +## Development + +```bash +cd cli/python +python -m venv .venv && source .venv/bin/activate +pip install -e ".[dev]" + +# Run during development +python -m mem0_cli --help +mem0 add "test memory" --user-id alice ``` ## Releasing 1. Update `version` in `pyproject.toml` -2. Create a GitHub Release with tag `cli-v` (e.g. `cli-v0.2.0`) +2. Create a GitHub Release with tag `cli-v` (e.g. `cli-v0.2.1`) -For a pre-release, use a beta version like `0.2.0b1` and check the **pre-release** checkbox. +For a pre-release, use a beta version like `0.2.1b1` and check the **pre-release** checkbox. + +## Documentation + +Full documentation is available at [docs.mem0.ai/platform/cli](https://docs.mem0.ai/platform/cli). ## License diff --git a/cli/python/pyproject.toml b/cli/python/pyproject.toml index bd7d670f9..98641dc19 100644 --- a/cli/python/pyproject.toml +++ b/cli/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "mem0-cli" -version = "0.2.0" +version = "0.2.1" description = "The official CLI for mem0 — the memory layer for AI agents" readme = "README.md" license = "Apache-2.0" diff --git a/cli/python/src/mem0_cli/__init__.py b/cli/python/src/mem0_cli/__init__.py index b424ff7f6..b217fb786 100644 --- a/cli/python/src/mem0_cli/__init__.py +++ b/cli/python/src/mem0_cli/__init__.py @@ -1,3 +1,3 @@ """mem0 CLI — the command-line interface for the mem0 memory layer.""" -__version__ = "0.1.0" +__version__ = "0.2.1" diff --git a/cli/python/src/mem0_cli/branding.py b/cli/python/src/mem0_cli/branding.py index 15bce2586..b2bdf9cc0 100644 --- a/cli/python/src/mem0_cli/branding.py +++ b/cli/python/src/mem0_cli/branding.py @@ -26,8 +26,8 @@ LOGO_MINI = "◆ mem0" TAGLINE = "The Memory Layer for AI Agents" -BRAND_COLOR = "#F1C96C" # Golden -ACCENT_COLOR = "#F5D78E" +BRAND_COLOR = "#8b5cf6" # Purple +ACCENT_COLOR = "#a78bfa" SUCCESS_COLOR = "#22c55e" ERROR_COLOR = "#ef4444" WARNING_COLOR = "#f59e0b" diff --git a/cli/python/tests/test_cli_integration.py b/cli/python/tests/test_cli_integration.py index 2189c5da6..f5e176fe9 100644 --- a/cli/python/tests/test_cli_integration.py +++ b/cli/python/tests/test_cli_integration.py @@ -83,11 +83,6 @@ class TestCLIIntegration: assert "add" in result.stdout assert "search" in result.stdout - def test_version_flag(self): - result = _run(["--version"]) - assert result.returncode == 0 - assert "0.1.0" in result.stdout - def test_add_help(self): result = _run(["add", "--help"]) assert result.returncode == 0 diff --git a/cli/python/tests/test_commands.py b/cli/python/tests/test_commands.py index 8d3f35c44..971a2d597 100644 --- a/cli/python/tests/test_commands.py +++ b/cli/python/tests/test_commands.py @@ -30,7 +30,6 @@ from mem0_cli.commands.memory import ( from mem0_cli.commands.utils import ( cmd_import, cmd_status, - cmd_version, ) @@ -742,15 +741,6 @@ class TestStatusCommand: assert '"status"' in output -class TestVersionCommand: - def test_version(self): - console, buf = _make_console() - with patch("mem0_cli.commands.utils.console", console): - cmd_version() - output = buf.getvalue() - assert "0.1.0" in output - - class TestImportCommand: def test_import_json(self, mock_backend, tmp_path): file_path = tmp_path / "import.json"