A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.
# Mycli
Rich MySQL terminal client with auto-completion, syntax highlighting, and dataframes.
## Project Structure
/ # repository root
โโโ .github/ # GitHub Actions and configuration
โโโ pyproject.toml # project configuration
โโโ doc/ # documentation
โโโ doc/cookbook.md # recipes for how to configure and use mycli
โโโ doc/key_bindings.md # documentation of key binding behaviors
โโโ doc/known_bugs.md # documentation of known bugs and limitations
โโโ doc/llm.md # documentation on how to use LLM features
โโโ doc/transforms.md # documentation on how to use dataframe transform/plot features
โโโ doc/screenshots/ # screenshots for documentation
โโโ mycli/ # application source
โโโ mycli/__init__.py # provides version number
โโโ mycli/app_state.py # `AppStateMixin` application state mixin and related functions
โโโ mycli/cli_runner.py # connects and dispatches main modes based on CLI arguments
โโโ mycli/client_commands.py # special commands which must be registered separately
โโโ mycli/client_connection.py # `ClientConnectionMixin` mixin for establishing the database connection
โโโ mycli/client_query.py # `ClientQueryMixin` mixin for running queries and refreshing completions
โโโ mycli/client.py # the `MyCli` "god class"
โโโ mycli/compat.py # OS compatibility helpers
โโโ mycli/config.py # configuration file readers and utilities
โโโ mycli/constants.py # shared constants
โโโ mycli/main.py # processes CLI arguments
โโโ mycli/main_modes/ # main execution paths
โโโ mycli/main_modes/batch.py # `--batch` mode
โโโ mycli/main_modes/checkup.py # `--checkup` mode
โโโ mycli/main_modes/completions.py # `--completions` mode
โโโ mycli/main_modes/execute.py # `--execute` mode
โโโ mycli/main_modes/list_dsn.py # `--list-dsn` mode
โโโ mycli/main_modes/repl.py # interactive REPL mode
โโโ mycli/myclirc # project-level configuration file
โโโ mycli/output.py # `OutputMixin` mixin for feedback and output of query results
โโโ mycli/packages/ # application packages
โโโ mycli/packages/completion/completion_engine.py # implementation of completion suggestions
โโโ mycli/packages/completion/completion_refresher.py # populates a `SQLCompleter` object in a background thread
โโโ mycli/packages/completion/schema_prefetcher.py # background prefetcher for multi-schema auto-completion
โโโ mycli/packages/completion/sql_completer.py # finds SQL completion candidates
โโโ mycli/packages/credentials/password_sources.py # password sources and precedence
โโโ mycli/packages/dataframes/completion.py # completions for `.|` transforms
โโโ mycli/packages/dataframes/transform.py # implements `.|` transforms
โโโ mycli/packages/execution/background_runner.py # run queries in the background, with query state and timing updates
โโโ mycli/packages/execution/sql_execute.py # `SQLExecute` class and friends
โโโ mycli/packages/integrations/ # integrations with fzf, Boundary, Kubernetes, macOS, OpenSSH, and Vault
โโโ mycli/packages/prompt_toolkit/fzf_history.py # uses fzf integration to serach the prompt_toolkit history
โโโ mycli/packages/prompt_toolkit/history.py # extends the prompt_toolkit history class
โโโ mycli/packages/prompt_toolkit/key_bindings.py # prompt_toolkit key bindings
โโโ mycli/packages/prompt_toolkit/multiline.py # prompt_toolkit multiline input
โโโ mycli/packages/prompt_toolkit/style.py # prompt_toolkit (and Pygments) styles
โโโ mycli/packages/prompt_toolkit/toolbar.py # prompt_toolkit bottom toolbar
โโโ mycli/packages/prompt_toolkit/utils.py # general utility functions for prompt_toolkit
โโโ mycli/packages/pygments/mycli_lexer.py # extends `MySqlLexer` from Pygments
โโโ mycli/packages/redirection/ # implementation of shell-style redirects
โโโ mycli/packages/special_commands/ # implementation of mycli special commands
โโโ mycli/packages/sql_result/sql_result.py # the `SQLResult` dataclass for holding responses
โโโ mycli/packages/tabular_output/ # extends cli_helper with additional output formats
โโโ mycli/packages/utils/batch_utils.py # utilities for `--batch` mode
โโโ mycli/packages/utils/cli_utils.py # utilities for parsing CLI arguments
โโโ mycli/packages/utils/interactive_utils.py # utilities for confirming on destructive statements
โโโ mycli/packages/utils/key_binding_utils.py # handlers for key bindings and related special commands
โโโ mycli/packages/utils/keyring_utils.py # saved credential utilities
โโโ mycli/packages/utils/path_utils.py # utilities for files, including completion suggestions
โโโ mycli/packages/utils/sql_utils.py # utilities for parsing SQL statements
โโโ mycli/packages/utils/string_utils.py # generic string utilities
โโโ mycli/resources/completions/ # shell completions for CLI interface
โโโ mycli/types.py # shared types
โโโ mycli_test/features/ # behave tests
โโโ mycli_test/myclirc # mycli configuration used for tests
โโโ mycli_test/mylogin.cnf # `mylogin.cnf` example used for tests
โโโ mycli_test/pytests/ # pytest tests
โโโ mycli_test/pytests/conftest.py # pytest configuration
โโโ mycli_test/utils.py # shared utilities for tests
## Development
### Python
#### Python Dependency Management
This repo uses `uv` for dependency management. **Always** prefix Python
commands with `uv run`. Example:
```bash
env -u PYTHONPATH uv run -- python script.py
```
#### Python Typing
This repo uses type annotations which are checked by `mypy`. **Always** add
type annotations, and always check new code with `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive script.py`.
Use lower-case type annotations such as `tuple`, not upper-case type
annotations such as `Tuple`.
Use `Type | None` instead of `Optional[Type]`.
#### Python Testing
Tests are coordinated by `tox`, and include both `pytest` and `behave` tests.
To run the full test suite, execute `env -u PYTHONPATH uv run -- tox`.
#### Python Compatibility
Use Python features available from Python 3.11 through Python 3.15.
Compatibility with Python 3.9 is not needed. Compatibility with Python
3.10 is not needed.
#### Python Style
Import style: prefer `from package import name` over `import package.name as name`.
Quoting style: prefer single quotes for new code, but do not remove double quotes
from existing code.
#### Python Environment
* Package manager: `uv` (not pip)
* Formatter: `env -u PYTHONPATH uv run -- ruff format`
* Linter: `env -u PYTHONPATH uv run -- ruff check`
* Type checker: `env -u PYTHONPATH uv run -- mypy --install-types --non-interactive`
### Git Workflows
#### Git Commit Messages
* Use the present tense.
* Keep the first line under 50 characters in length.
* Keep the second line blank.
* Keep all other lines under 72 characters in length.
* Reference issue numbers when available.
#### Generating PRs
When generating a PR, follow the instructions in `.github/PULL_REQUEST_TEMPLATE.md`:
* Add new author names to `mycli/AUTHORS.txt`.
* Add a new entry to `changelog.md`.
### Code Comments
Keep comments concise and direct. Use full sentences, ending with a period.
### See Also
See also the file `CONTRIBUTING.md`.