Metadata-Version: 2.4
Name: klyro
Version: 1.0.8
Summary: Klyro is AI pair programming in your terminal
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/RavindraTirlangi/Klyro
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
Requires-Python: <3.15,>=3.10
Description-Content-Type: text/markdown
License-File: LICENSE.txt
Requires-Dist: tree-sitter==0.23.2; python_version < "3.10"
Requires-Dist: tree-sitter==0.25.2; python_version >= "3.10"
Requires-Dist: numpy<2; python_version < "3.11"
Requires-Dist: numpy<2.5,>=2.3; python_version >= "3.11"
Requires-Dist: scipy<1.16; python_version < "3.11"
Requires-Dist: scipy<1.18,>=1.16.1; python_version >= "3.11"
Requires-Dist: audioop-lts>=0.2.2; python_version >= "3.13"
Requires-Dist: aiohappyeyeballs==2.6.1
Requires-Dist: aiohttp==3.13.3
Requires-Dist: aiosignal==1.4.0
Requires-Dist: annotated-doc==0.0.4
Requires-Dist: annotated-types==0.7.0
Requires-Dist: anyio==4.12.1
Requires-Dist: asgiref==3.11.1
Requires-Dist: attrs==25.4.0
Requires-Dist: backoff==2.2.1
Requires-Dist: beautifulsoup4==4.14.3
Requires-Dist: certifi==2026.2.25
Requires-Dist: charset-normalizer==3.4.6
Requires-Dist: click==8.3.1
Requires-Dist: colorama==0.4.6
Requires-Dist: configargparse==1.7.5
Requires-Dist: diff-match-patch==20241021
Requires-Dist: diskcache==5.6.3
Requires-Dist: distro==1.9.0
Requires-Dist: fastapi==0.135.1
Requires-Dist: fastuuid==0.14.0
Requires-Dist: filelock==3.25.2
Requires-Dist: flake8==7.3.0
Requires-Dist: frozenlist==1.8.0
Requires-Dist: fsspec==2026.2.0
Requires-Dist: gitdb==4.0.12
Requires-Dist: gitpython==3.1.46
Requires-Dist: grep-ast==0.9.0
Requires-Dist: h11==0.16.0
Requires-Dist: hf-xet==1.4.2
Requires-Dist: httpcore==1.0.9
Requires-Dist: httpx==0.28.1
Requires-Dist: huggingface-hub==1.7.1
Requires-Dist: idna==3.11
Requires-Dist: importlib-metadata==7.2.1
Requires-Dist: importlib-resources==6.5.2
Requires-Dist: jinja2==3.1.6
Requires-Dist: jiter==0.13.0
Requires-Dist: json5==0.13.0
Requires-Dist: jsonschema==4.26.0
Requires-Dist: jsonschema-specifications==2025.9.1
Requires-Dist: litellm==1.82.3
Requires-Dist: markdown-it-py==4.0.0
Requires-Dist: markupsafe==3.0.3
Requires-Dist: mccabe==0.7.0
Requires-Dist: mdurl==0.1.2
Requires-Dist: mixpanel==5.0.0
Requires-Dist: mslex==1.3.0
Requires-Dist: multidict==6.7.1
Requires-Dist: networkx==3.4.2
Requires-Dist: openai==2.28.0
Requires-Dist: orjson==3.11.7
Requires-Dist: oslex==0.1.3
Requires-Dist: packaging==26.0
Requires-Dist: pathspec==1.0.4
Requires-Dist: pexpect==4.9.0
Requires-Dist: pillow==12.1.1
Requires-Dist: posthog==7.9.12
Requires-Dist: prompt-toolkit==3.0.52
Requires-Dist: propcache==0.4.1
Requires-Dist: psutil==7.2.2
Requires-Dist: ptyprocess==0.7.0
Requires-Dist: pycodestyle==2.14.0
Requires-Dist: pydantic==2.12.5
Requires-Dist: pydantic-core==2.41.5
Requires-Dist: pyflakes==3.4.0
Requires-Dist: pygments==2.19.2
Requires-Dist: pypandoc==1.17
Requires-Dist: pyperclip==1.11.0
Requires-Dist: python-dateutil==2.9.0.post0
Requires-Dist: python-dotenv==1.2.2
Requires-Dist: pyyaml==6.0.3
Requires-Dist: referencing==0.37.0
Requires-Dist: regex==2026.2.28
Requires-Dist: requests==2.32.5
Requires-Dist: rich==14.3.3
Requires-Dist: rpds-py==0.30.0
Requires-Dist: shellingham==1.5.4
Requires-Dist: shtab==1.8.0
Requires-Dist: six==1.17.0
Requires-Dist: smmap==5.0.3
Requires-Dist: sniffio==1.3.1
Requires-Dist: socksio==1.0.0
Requires-Dist: soupsieve==2.8.3
Requires-Dist: starlette==0.52.1
Requires-Dist: tiktoken==0.12.0
Requires-Dist: tokenizers==0.22.2
Requires-Dist: tqdm==4.67.3
Requires-Dist: tree-sitter-c-sharp==0.23.1
Requires-Dist: tree-sitter-embedded-template==0.25.0
Requires-Dist: tree-sitter-language-pack==0.13.0
Requires-Dist: tree-sitter-yaml==0.7.2
Requires-Dist: typer==0.24.1
Requires-Dist: typing-extensions==4.15.0
Requires-Dist: typing-inspection==0.4.2
Requires-Dist: urllib3==2.6.3
Requires-Dist: watchfiles==1.1.1
Requires-Dist: wcwidth==0.6.0
Requires-Dist: yarl==1.23.0
Requires-Dist: zipp==3.23.0
Provides-Extra: dev
Requires-Dist: annotated-doc==0.0.4; extra == "dev"
Requires-Dist: build==1.4.0; extra == "dev"
Requires-Dist: certifi==2026.2.25; extra == "dev"
Requires-Dist: cffi==2.0.0; extra == "dev"
Requires-Dist: cfgv==3.5.0; extra == "dev"
Requires-Dist: charset-normalizer==3.4.6; extra == "dev"
Requires-Dist: click==8.3.1; extra == "dev"
Requires-Dist: codespell==2.4.2; extra == "dev"
Requires-Dist: cogapp==3.6.0; extra == "dev"
Requires-Dist: colorama==0.4.6; extra == "dev"
Requires-Dist: contourpy==1.3.3; extra == "dev"
Requires-Dist: coverage[toml]==7.13.4; extra == "dev"
Requires-Dist: cryptography==46.0.5; extra == "dev"
Requires-Dist: cycler==0.12.1; extra == "dev"
Requires-Dist: distlib==0.4.0; extra == "dev"
Requires-Dist: filelock==3.25.2; extra == "dev"
Requires-Dist: fonttools==4.62.1; extra == "dev"
Requires-Dist: google-api-core[grpc]==2.30.0; extra == "dev"
Requires-Dist: google-auth==2.49.1; extra == "dev"
Requires-Dist: google-cloud-bigquery==3.40.1; extra == "dev"
Requires-Dist: google-cloud-core==2.5.0; extra == "dev"
Requires-Dist: google-crc32c==1.8.0; extra == "dev"
Requires-Dist: google-resumable-media==2.8.0; extra == "dev"
Requires-Dist: googleapis-common-protos==1.73.0; extra == "dev"
Requires-Dist: grpcio==1.78.0; extra == "dev"
Requires-Dist: grpcio-status==1.78.0; extra == "dev"
Requires-Dist: identify==2.6.18; extra == "dev"
Requires-Dist: idna==3.11; extra == "dev"
Requires-Dist: imgcat==0.6.0; extra == "dev"
Requires-Dist: iniconfig==2.3.0; extra == "dev"
Requires-Dist: kiwisolver==1.5.0; extra == "dev"
Requires-Dist: lox==1.0.0; extra == "dev"
Requires-Dist: markdown-it-py==4.0.0; extra == "dev"
Requires-Dist: matplotlib==3.10.8; extra == "dev"
Requires-Dist: mdurl==0.1.2; extra == "dev"
Requires-Dist: nodeenv==1.10.0; extra == "dev"
Requires-Dist: numpy==2.4.6; extra == "dev"
Requires-Dist: packaging==26.0; extra == "dev"
Requires-Dist: pandas==2.3.3; extra == "dev"
Requires-Dist: pillow==12.1.1; extra == "dev"
Requires-Dist: pip==26.0.1; extra == "dev"
Requires-Dist: pip-tools==7.5.3; extra == "dev"
Requires-Dist: platformdirs==4.9.4; extra == "dev"
Requires-Dist: pluggy==1.6.0; extra == "dev"
Requires-Dist: pre-commit==4.5.1; extra == "dev"
Requires-Dist: proto-plus==1.27.1; extra == "dev"
Requires-Dist: protobuf==6.33.5; extra == "dev"
Requires-Dist: pyasn1==0.6.2; extra == "dev"
Requires-Dist: pyasn1-modules==0.4.2; extra == "dev"
Requires-Dist: pycparser==3.0; extra == "dev"
Requires-Dist: pygments==2.19.2; extra == "dev"
Requires-Dist: pyparsing==3.3.2; extra == "dev"
Requires-Dist: pyproject-hooks==1.2.0; extra == "dev"
Requires-Dist: pytest==9.0.2; extra == "dev"
Requires-Dist: pytest-cov==7.0.0; extra == "dev"
Requires-Dist: pytest-env==1.6.0; extra == "dev"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "dev"
Requires-Dist: python-discovery==1.1.3; extra == "dev"
Requires-Dist: python-dotenv==1.2.2; extra == "dev"
Requires-Dist: pytz==2026.1.post1; extra == "dev"
Requires-Dist: pyyaml==6.0.3; extra == "dev"
Requires-Dist: requests==2.32.5; extra == "dev"
Requires-Dist: rich==14.3.3; extra == "dev"
Requires-Dist: semver==3.0.4; extra == "dev"
Requires-Dist: setuptools==82.0.1; extra == "dev"
Requires-Dist: shellingham==1.5.4; extra == "dev"
Requires-Dist: six==1.17.0; extra == "dev"
Requires-Dist: typer==0.24.1; extra == "dev"
Requires-Dist: typing-extensions==4.15.0; extra == "dev"
Requires-Dist: tzdata==2025.3; extra == "dev"
Requires-Dist: urllib3==2.6.3; extra == "dev"
Requires-Dist: uv==0.10.11; extra == "dev"
Requires-Dist: virtualenv==21.2.0; extra == "dev"
Requires-Dist: wheel==0.46.3; extra == "dev"
Provides-Extra: help
Requires-Dist: aiohappyeyeballs==2.6.1; extra == "help"
Requires-Dist: aiohttp==3.13.3; extra == "help"
Requires-Dist: aiosignal==1.4.0; extra == "help"
Requires-Dist: aiosqlite==0.22.1; extra == "help"
Requires-Dist: annotated-doc==0.0.4; extra == "help"
Requires-Dist: annotated-types==0.7.0; extra == "help"
Requires-Dist: anyio==4.12.1; extra == "help"
Requires-Dist: attrs==25.4.0; extra == "help"
Requires-Dist: banks==2.4.1; extra == "help"
Requires-Dist: certifi==2026.2.25; extra == "help"
Requires-Dist: charset-normalizer==3.4.6; extra == "help"
Requires-Dist: click==8.3.1; extra == "help"
Requires-Dist: colorama==0.4.6; extra == "help"
Requires-Dist: dataclasses-json==0.6.7; extra == "help"
Requires-Dist: deprecated==1.3.1; extra == "help"
Requires-Dist: dirtyjson==1.0.8; extra == "help"
Requires-Dist: filelock==3.25.2; extra == "help"
Requires-Dist: filetype==1.2.0; extra == "help"
Requires-Dist: frozenlist==1.8.0; extra == "help"
Requires-Dist: fsspec==2026.2.0; extra == "help"
Requires-Dist: greenlet==3.3.2; extra == "help"
Requires-Dist: griffe==2.0.0; extra == "help"
Requires-Dist: griffecli==2.0.0; extra == "help"
Requires-Dist: griffelib==2.0.0; extra == "help"
Requires-Dist: h11==0.16.0; extra == "help"
Requires-Dist: hf-xet==1.4.2; extra == "help"
Requires-Dist: httpcore==1.0.9; extra == "help"
Requires-Dist: httpx==0.28.1; extra == "help"
Requires-Dist: huggingface-hub[inference]==1.7.1; extra == "help"
Requires-Dist: idna==3.11; extra == "help"
Requires-Dist: jinja2==3.1.6; extra == "help"
Requires-Dist: joblib==1.5.3; extra == "help"
Requires-Dist: llama-index-core==0.14.18; extra == "help"
Requires-Dist: llama-index-embeddings-huggingface==0.7.0; extra == "help"
Requires-Dist: llama-index-instrumentation==0.5.0; extra == "help"
Requires-Dist: llama-index-workflows==2.16.1; extra == "help"
Requires-Dist: markdown-it-py==4.0.0; extra == "help"
Requires-Dist: markupsafe==3.0.3; extra == "help"
Requires-Dist: marshmallow==3.26.2; extra == "help"
Requires-Dist: mdurl==0.1.2; extra == "help"
Requires-Dist: mpmath==1.3.0; extra == "help"
Requires-Dist: multidict==6.7.1; extra == "help"
Requires-Dist: mypy-extensions==1.1.0; extra == "help"
Requires-Dist: nest-asyncio==1.6.0; extra == "help"
Requires-Dist: networkx==3.4.2; extra == "help"
Requires-Dist: nltk==3.9.3; extra == "help"
Requires-Dist: numpy==2.4.6; extra == "help"
Requires-Dist: packaging==26.0; extra == "help"
Requires-Dist: pillow==12.1.1; extra == "help"
Requires-Dist: platformdirs==4.9.4; extra == "help"
Requires-Dist: propcache==0.4.1; extra == "help"
Requires-Dist: pydantic==2.12.5; extra == "help"
Requires-Dist: pydantic-core==2.41.5; extra == "help"
Requires-Dist: pygments==2.19.2; extra == "help"
Requires-Dist: pyyaml==6.0.3; extra == "help"
Requires-Dist: regex==2026.2.28; extra == "help"
Requires-Dist: requests==2.32.5; extra == "help"
Requires-Dist: rich==14.3.3; extra == "help"
Requires-Dist: safetensors==0.7.0; extra == "help"
Requires-Dist: scikit-learn==1.8.0; extra == "help"
Requires-Dist: scipy==1.17.1; extra == "help"
Requires-Dist: sentence-transformers==5.3.0; extra == "help"
Requires-Dist: setuptools==82.0.1; extra == "help"
Requires-Dist: shellingham==1.5.4; extra == "help"
Requires-Dist: sqlalchemy[asyncio]==2.0.48; extra == "help"
Requires-Dist: sympy==1.14.0; extra == "help"
Requires-Dist: tenacity==9.1.4; extra == "help"
Requires-Dist: threadpoolctl==3.6.0; extra == "help"
Requires-Dist: tiktoken==0.12.0; extra == "help"
Requires-Dist: tinytag==2.2.1; extra == "help"
Requires-Dist: tokenizers==0.22.2; extra == "help"
Requires-Dist: torch==2.10.0; extra == "help"
Requires-Dist: tqdm==4.67.3; extra == "help"
Requires-Dist: transformers==5.3.0; extra == "help"
Requires-Dist: typer==0.24.1; extra == "help"
Requires-Dist: typing-extensions==4.15.0; extra == "help"
Requires-Dist: typing-inspect==0.9.0; extra == "help"
Requires-Dist: typing-inspection==0.4.2; extra == "help"
Requires-Dist: urllib3==2.6.3; extra == "help"
Requires-Dist: wrapt==2.1.2; extra == "help"
Requires-Dist: yarl==1.23.0; extra == "help"
Provides-Extra: browser
Requires-Dist: altair==6.0.0; extra == "browser"
Requires-Dist: attrs==25.4.0; extra == "browser"
Requires-Dist: blinker==1.9.0; extra == "browser"
Requires-Dist: cachetools==7.0.5; extra == "browser"
Requires-Dist: certifi==2026.2.25; extra == "browser"
Requires-Dist: charset-normalizer==3.4.6; extra == "browser"
Requires-Dist: click==8.3.1; extra == "browser"
Requires-Dist: colorama==0.4.6; extra == "browser"
Requires-Dist: gitdb==4.0.12; extra == "browser"
Requires-Dist: gitpython==3.1.46; extra == "browser"
Requires-Dist: idna==3.11; extra == "browser"
Requires-Dist: jinja2==3.1.6; extra == "browser"
Requires-Dist: jsonschema==4.26.0; extra == "browser"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "browser"
Requires-Dist: markupsafe==3.0.3; extra == "browser"
Requires-Dist: narwhals==2.18.0; extra == "browser"
Requires-Dist: numpy==2.4.6; extra == "browser"
Requires-Dist: packaging==26.0; extra == "browser"
Requires-Dist: pandas==2.3.3; extra == "browser"
Requires-Dist: pillow==12.1.1; extra == "browser"
Requires-Dist: protobuf==6.33.5; extra == "browser"
Requires-Dist: pyarrow==23.0.1; extra == "browser"
Requires-Dist: pydeck==0.9.1; extra == "browser"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "browser"
Requires-Dist: pytz==2026.1.post1; extra == "browser"
Requires-Dist: referencing==0.37.0; extra == "browser"
Requires-Dist: requests==2.32.5; extra == "browser"
Requires-Dist: rpds-py==0.30.0; extra == "browser"
Requires-Dist: six==1.17.0; extra == "browser"
Requires-Dist: smmap==5.0.3; extra == "browser"
Requires-Dist: streamlit==1.55.0; extra == "browser"
Requires-Dist: tenacity==9.1.4; extra == "browser"
Requires-Dist: toml==0.10.2; extra == "browser"
Requires-Dist: tornado==6.5.5; extra == "browser"
Requires-Dist: typing-extensions==4.15.0; extra == "browser"
Requires-Dist: tzdata==2025.3; extra == "browser"
Requires-Dist: urllib3==2.6.3; extra == "browser"
Requires-Dist: watchdog==6.0.0; extra == "browser"
Provides-Extra: playwright
Requires-Dist: greenlet==3.3.2; extra == "playwright"
Requires-Dist: playwright==1.58.0; extra == "playwright"
Requires-Dist: pyee==13.0.1; extra == "playwright"
Requires-Dist: typing-extensions==4.15.0; extra == "playwright"
Provides-Extra: voice
Requires-Dist: audioop-lts==0.2.2; python_version >= "3.13" and extra == "voice"
Requires-Dist: cffi==2.0.0; extra == "voice"
Requires-Dist: numpy==2.4.6; extra == "voice"
Requires-Dist: pycparser==3.0; extra == "voice"
Requires-Dist: pydub==0.25.1; extra == "voice"
Requires-Dist: scipy==1.17.1; extra == "voice"
Requires-Dist: sounddevice==0.5.5; extra == "voice"
Requires-Dist: soundfile==0.13.1; extra == "voice"
Provides-Extra: tui
Requires-Dist: linkify-it-py==2.1.0; extra == "tui"
Requires-Dist: markdown-it-py[linkify]==4.0.0; extra == "tui"
Requires-Dist: mdit-py-plugins==0.6.1; extra == "tui"
Requires-Dist: mdurl==0.1.2; extra == "tui"
Requires-Dist: numpy==2.4.6; extra == "tui"
Requires-Dist: platformdirs==4.9.4; extra == "tui"
Requires-Dist: pygments==2.19.2; extra == "tui"
Requires-Dist: rich==14.3.3; extra == "tui"
Requires-Dist: scipy==1.17.1; extra == "tui"
Requires-Dist: textual==8.2.8; extra == "tui"
Requires-Dist: typing-extensions==4.15.0; extra == "tui"
Requires-Dist: uc-micro-py==2.0.0; extra == "tui"
Dynamic: license-file

<div align="center">

```
 ██╗  ██╗██╗  ██╗   ██╗██████╗  ██████╗
 ██║ ██╔╝██║  ╚██╗ ██╔╝██╔══██╗██╔═══██╗
 █████╔╝ ██║   ╚████╔╝ ██████╔╝██║   ██║
 ██╔═██╗ ██║    ╚██╔╝  ██╔══██╗██║   ██║
 ██║  ██╗███████╗██║   ██║  ██║╚██████╔╝
 ╚═╝  ╚═╝╚══════╝╚═╝   ╚═╝  ╚═╝ ╚═════╝
```

### AI pair programming in your terminal.

[![PyPI version](https://img.shields.io/pypi/v/klyro?style=for-the-badge&color=0A0A0A&labelColor=0A0A0A&logo=pypi&logoColor=white)](https://pypi.org/project/klyro/)
[![Python](https://img.shields.io/badge/Python-3.10+-0A0A0A?style=for-the-badge&logo=python&logoColor=white)](https://pypi.org/project/klyro/)
[![License](https://img.shields.io/badge/Apache_2.0-0A0A0A?style=for-the-badge&logo=apache&logoColor=white)](LICENSE)
[![Version](https://img.shields.io/badge/v1.0.7-brightgreen?style=for-the-badge&logo=github&logoColor=white)](https://github.com/RavindraTirlangi/Klyro/releases/tag/v1.0.7)
[![Changelog](https://img.shields.io/badge/Changelog-orange?style=for-the-badge&logo=readthedocs&logoColor=white)](CHANGELOG.md)

<br/>

**Klyro** talks to your code. You talk to Klyro. <br/>
Works with GPT-4o, Claude, Gemini, DeepSeek, Ollama, Grok, Groq, Mistral — and 100+ more.

<br/>

[**Quick Start**](#-quick-start) · [**Features**](#-features) · [**Models**](#-supported-models) · [**Commands**](#-slash-commands) · [**Config**](#-configuration) · [**Changelog**](CHANGELOG.md)

</div>

---

## ⚡ Quick Start

```bash
pip install klyro
```

Optional features are installed explicitly:

```bash
pip install "klyro[voice]"       # microphone transcription
pip install "klyro[tui]"         # experimental full terminal UI
pip install "klyro[playwright]"  # browser automation
```

```bash
# Run with your API key set
klyro

# Or specify a model directly
klyro --model gpt-4o
klyro --model ollama/llama3.2
klyro --model gemini/gemini-2.5-flash
```

> **Windows:** If `klyro` is not recognized, either run `python -m klyro` or add your Scripts folder to PATH:
> ```bash
> python -c "import sysconfig; print(sysconfig.get_path('scripts', 'nt_user'))"
> ```

**Install from source:**
```bash
git clone https://github.com/RavindraTirlangi/Klyro.git
cd Klyro
pip install -e .
```

---

## ✨ Features

<table>
<tr>
<td width="50%">

### 🤖 Smart Model Detection
Auto-detects your environment at startup:
- **Local Ollama running?** Uses it instantly — no API key needed
- **Cloud keys set?** Picks the best available model
- **Nothing configured?** Guides you through OpenRouter setup (free tier available)

</td>
<td width="50%">

### 🗺️ Repository Intelligence
Understands your entire codebase:
- Builds a **repo map** using tree-sitter AST analysis
- Identifies relevant files automatically
- Manages context to stay within token limits

</td>
</tr>
<tr>
<td width="50%">

### ✏️ Precise Code Editing
Applies changes surgically:
- Whole-file and **diff-based** editing modes
- **Auto-lints** after every edit and feeds errors back
- Built-in **git integration** with descriptive auto-commits

</td>
<td width="50%">

### 🔀 Model Switching On-the-Fly
Switch any time without restarting:
```
/model                              → list current provider's models
/model search coder                 → search current provider
/model openrouter/deepseek/deepseek-r1:free
/model ollama/qwen2.5-coder:latest
```

</td>
</tr>
</table>

---

## 🧠 Supported Models

Klyro discovers models from the provider currently in use instead of shipping
a fixed model catalogue:

- **OpenRouter:** models allowed by the authenticated account's preferences,
  privacy settings, and guardrails.
- **Ollama:** models installed on the local machine.
- **Other providers:** current text/chat models registered by LiteLLM.

Run `/model` to see the current provider's models, then switch with the exact
identifier shown. Optional personal aliases can be configured with `--alias`.

---

## 💬 Slash Commands

Klyro provides 43 built-in slash commands to manage your files, models, git repository, and session:

### 📁 File & Context Management
| Command | Description |
|---|---|
| **`/add <file>`** | Add one or more files to the chat context so the AI can read and edit them |
| **`/drop <file>`** | Remove files from the active chat context to free up tokens |
| **`/read-only <file>`**| Add files as read-only (AI can reference them but won't modify them) |
| **`/ls`** | List all files in your project and indicate which are added to the chat |
| **`/clear`** | Clear the conversation history to start fresh |
| **`/reset`** | Drop all files and clear chat history to start completely fresh |
| **`/tokens`** | Report token counts and how much context window is left |
| **`/diff`** | Show a diff of all local changes made in the active session |
| **`/map`** | Print out the current repository map (symbols, functions, files structure) |
| **`/map-refresh`** | Force a manual refresh of the repository map |
| **`/context`** | Enter context mode to view surrounding code context |

### 🛠️ Coding, Testing & Shell
| Command | Description |
|---|---|
| **`/code [prompt]`** | Switch to code editing mode (or run a one-off code edit prompt) |
| **`/ask [prompt]`** | Switch to question/explain mode (or ask a one-off question without editing files) |
| **`/architect [prompt]`**| Switch to planning mode to design changes using two different models |
| **`/chat-mode <mode>`** | Switch the active chat mode (`code`, `ask`, `architect`, or `context`) |
| **`/ok`** | Shortcut for `/code Ok, please go ahead and make those changes.` |
| **`/run <cmd>`** | Run a shell command and optionally add its output to the chat |
| **`/test <cmd>`** | Run a test command and feed any errors/failures back to the AI for fixes |
| **`/lint`** | Run linter/fixer on all in-chat or dirty files |
| **`/editor`** | Open your configured external terminal editor (like vim or nano) to write a prompt |

### 🧠 Model Configuration
| Command | Description |
|---|---|
| **`/model [name]`** | With no name, list models available from the current provider; with a name, switch the main LLM |
| **`/model search <query>`** | Search models available from the current provider |
| **`/editor-model <name>`**| Switch the model used specifically for writing file edits |
| **`/weak-model <name>`** | Switch the model used for minor background tasks (e.g. summaries) |
| **`/reasoning-effort <l/m/h>`**| Set the reasoning depth (`low`, `medium`, `high`) for reasoning models |
| **`/think-tokens <limit>`**| Set the maximum thinking token budget for reasoning models (0 to disable) |

### 🐙 Git Integration
| Command | Description |
|---|---|
| **`/git <command>`** | Run any git command directly from the session |
| **`/commit [message]`** | Commit any unsaved edits made outside of Klyro |
| **`/undo`** | Undo/revert the last git commit made by Klyro |

### 🎙️ Session & Input Helpers
| Command | Description |
|---|---|
| **`/multiline-mode`** | Toggle multiline mode (swaps Enter and Alt+Enter behavior) |
| **`/paste`** | Paste text or clipboard images into the chat session |
| **`/copy`** | Copy the last assistant response to your clipboard |
| **`/copy-context`** | Copy the entire active chat context as Markdown |
| **`/voice`** | Speak your prompt using your microphone (dictation) |
| **`/web <url>`** | Scrape a webpage, convert it to Markdown, and add it to the chat |
| **`/export [file]`** | Export your full chat session history to a Markdown file |
| **`/stats`** | Show model details, last message cost, and total session cost |
| **`/help <question>`** | Ask interactive help questions about using Klyro |
| **`/settings`** | Print out all active settings and config parameters |
| **`/load <file>`** | Load and execute a list of Klyro commands from a text file |
| **`/save <file>`** | Save active files list as a set of `/add` commands to reconstruct session |
| **`/report`** | Report a problem by opening a GitHub Issue |
| **`/exit`** | Exit the Klyro application |

---

## ⌨️ Keyboard Shortcuts

Klyro provides Emacs-style keybindings for prompt editing and history navigation:

### Prompt Editing & Navigation
* `Ctrl + A` : Move cursor to the start of the line.
* `Ctrl + E` : Move cursor to the end of the line.
* `Ctrl + B` : Move cursor back one character.
* `Ctrl + F` : Move cursor forward one character.
* `Ctrl + D` : Delete the character under the cursor.
* `Ctrl + K` : Cut/delete from the cursor to the end of the line.
* `Ctrl + Y` : Paste (yank) text that was previously cut.
* `Ctrl + L` : Clear the terminal screen.

### History Navigation
* `Ctrl + R` : Search backwards through your sent message history.
* `Ctrl + P` / `Ctrl + Up` : Scroll back to previous history entries.
* `Ctrl + N` / `Ctrl + Down` : Scroll forward to next history entries.
* `Up Arrow` : Move cursor up one line inside a multiline message.
* `Down Arrow` : Move cursor down one line inside a multiline message.

### Multiline & Cancellation
* `Alt + Enter` (or `Ctrl + J`) : Submit message in multiline mode.
* `{` on a line by itself : Start a bracket-based multiline prompt.
* `}` on a line by itself : Submit a bracket-based multiline prompt.
* `Ctrl + C` : Abort the current prompt or cancel an interactive question (returns to prompt).

---

## ⚙️ Configuration

Create `.klyro.conf.yml` in your project root:

```yaml
model: ollama/llama3.2   # default model
dark-mode: true
auto-commits: true
```

Or use environment variables:

```bash
# Cloud providers
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export GEMINI_API_KEY=...
export DEEPSEEK_API_KEY=...
export MISTRAL_API_KEY=...
export XAI_API_KEY=...
export GROQ_API_KEY=...
export OPENROUTER_API_KEY=sk-or-...

# Local
export OLLAMA_API_BASE=http://localhost:11434
```

---

## 📦 Release

Tagged releases automatically publish to PyPI via GitHub Actions:

```bash
git tag vX.Y.Z
git push origin vX.Y.Z
```

Publishing is gated by tests, package validation, and a clean wheel
install/startup/uninstall smoke test.

See [CHANGELOG.md](CHANGELOG.md) for full version history.

---

## 📄 License

Apache License 2.0 — see [LICENSE](LICENSE) for details.

---

<div align="center">

Made with ❤️ · [PyPI](https://pypi.org/project/klyro/) · [GitHub](https://github.com/RavindraTirlangi/Klyro) · [Changelog](CHANGELOG.md)

</div>
