Feature: Database URL sanitisation — credentials must never be exposed As a CleverAgents operator I want database URLs in CLI output to have their credentials masked So that running ``agents info`` never leaks passwords or API tokens @tdd_bug_8395 Scenario Outline: PostgreSQL URL with user and password — all are masked Given the database url is "" When I run sanitise_db_url Then the sanitised database url should be "" Examples: | url | expected | | postgresql://user:secret@localhost/mydb | postgresql://***:***@localhost/mydb | | postgresql://admin:p%40ssw0rd@db.example.com:5432/agents | postgresql://***:***@db.example.com:5432/agents | | postgresql://readonly:r0ad_only@pg.cluster.internal:5433/production | postgresql://***:***@pg.cluster.internal:5433/production | Scenario Outline: MySQL URL with credentials — all are masked Given the database url is "" When I run sanitise_db_url Then the sanitised database url should be "" Examples: | url | expected | | mysql://app:s3cret@mysql.internal:3306/agents | mysql://***:***@mysql.internal:3306/agents | | mysql+pymysql://root:toor@localhost/testdb | mysql+pymysql://***:***@localhost/testdb | Scenario Outline: SQLite URLs — remain unchanged (no credentials) Given the database url is "" When I run sanitise_db_url Then the sanitised database url should be "" Examples: | url | expected | | sqlite:///data/cleveragents.db | sqlite:///data/cleveragents.db | | sqlite:////absolute/path/to/db.sqlite | sqlite:////absolute/path/to/db.sqlite | | memory | memory | Scenario: Username-only URL — password is still masked Given the database url is "postgres://deploy@db.example.com/prod" When I run sanitise_db_url Then the sanitised database url should be "postgres://***:***@db.example.com/prod" Scenario: SQLite URL without credentials remains unchanged Given the database url is "sqlite:///test.db" When I run sanitise_db_url Then the sanitised database url should be "sqlite:///test.db" Scenario: build_info_data returns sanitised database URL Given a mock settings object with database url "postgresql://admin:supersecret@host.example.com:5432/mydb" When I call build_info_data Then the database field in info data should be "postgresql://***:***@host.example.com:5432/mydb"