diff --git a/README.md b/README.md index 57a6abd7e..8374c13d2 100644 --- a/README.md +++ b/README.md @@ -479,7 +479,7 @@ multi-word ones. Bare `- [[Target]]` and prose `- Worth checking out [[Target]]` index as `links_to`. Full reference in the -[docs](https://docs.basicmemory.com/getting-started/note-formatting/?utm_source=github&utm_medium=referral&utm_campaign=readme). +[docs](https://docs.basicmemory.com/concepts/knowledge-format?utm_source=github&utm_medium=referral&utm_campaign=readme). ## MCP tools @@ -525,7 +525,7 @@ basic-memory import memory-json Routing flags (`--local` / `--cloud`) force a target when you're in mixed mode. Full CLI reference in the -[docs](https://docs.basicmemory.com/guides/cli-reference/?utm_source=github&utm_medium=referral&utm_campaign=readme). +[docs](https://docs.basicmemory.com/reference/cli-reference?utm_source=github&utm_medium=referral&utm_campaign=readme). ## Auto-updates diff --git a/docs/cloud-cli.md b/docs/cloud-cli.md index ae93ed357..5ba501520 100644 --- a/docs/cloud-cli.md +++ b/docs/cloud-cli.md @@ -32,7 +32,7 @@ The transfer commands fall into two groups: Before using Basic Memory Cloud, you need: - **Active Subscription**: An active Basic Memory Cloud subscription is required to access cloud features -- **Subscribe**: Visit [https://basicmemory.com/subscribe](https://basicmemory.com/subscribe) to sign up +- **Subscribe**: Visit [https://basicmemory.com/pricing](https://basicmemory.com/pricing) to sign up - **Optional**: Cloud is optional. Local-first open-source usage continues without cloud. - **OSS Discount**: Use code `{{OSS_DISCOUNT_CODE}}` for 20% off for 3 months. diff --git a/src/basic_memory/cli/commands/cloud/api_client.py b/src/basic_memory/cli/commands/cloud/api_client.py index 98dacc2f7..bd2ec55e7 100644 --- a/src/basic_memory/cli/commands/cloud/api_client.py +++ b/src/basic_memory/cli/commands/cloud/api_client.py @@ -121,7 +121,7 @@ async def make_api_request( ): message = detail_obj.get("message", "Active subscription required") subscribe_url = detail_obj.get( - "subscribe_url", "https://basicmemory.com/subscribe" + "subscribe_url", "https://basicmemory.com/pricing" ) raise SubscriptionRequiredError( message=message, subscribe_url=subscribe_url diff --git a/tests/cli/test_cloud_authentication.py b/tests/cli/test_cloud_authentication.py index 34c96807b..40dca09af 100644 --- a/tests/cli/test_cloud_authentication.py +++ b/tests/cli/test_cloud_authentication.py @@ -101,6 +101,31 @@ async def handler(request: httpx.Request) -> httpx.Response: assert err.status_code == 403 assert err.subscribe_url == "https://basicmemory.com/subscribe" + @pytest.mark.asyncio + async def test_subscription_required_error_defaults_to_pricing(self): + async def handler(request: httpx.Request) -> httpx.Response: + return httpx.Response( + 403, + json={ + "detail": { + "error": "subscription_required", + "message": "Active subscription required", + } + }, + request=request, + ) + + auth = _StubAuth() + with pytest.raises(SubscriptionRequiredError) as exc_info: + await make_api_request( + "GET", + "https://test.com/api/endpoint", + auth=_auth(auth), + http_client_factory=_make_http_client_factory(handler), + ) + + assert exc_info.value.subscribe_url == "https://basicmemory.com/pricing" + @pytest.mark.asyncio async def test_parse_generic_403_error(self): async def handler(request: httpx.Request) -> httpx.Response: