Metadata-Version: 2.4
Name: patch-chat
Version: 0.1.0
Summary: Patch is AI pair programming in your terminal
Project-URL: Homepage, https://github.com/PierrunoYT/patch
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
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: 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: async-timeout==5.0.1; python_full_version < "3.11"
Requires-Dist: attrs==25.4.0
Requires-Dist: audioop-lts==0.2.2; python_full_version >= "3.13"
Requires-Dist: babel==2.18.0
Requires-Dist: backoff==2.2.1
Requires-Dist: beautifulsoup4==4.14.3
Requires-Dist: certifi==2026.2.25
Requires-Dist: cffi==2.0.0
Requires-Dist: charset-normalizer==3.4.6
Requires-Dist: click==8.3.1
Requires-Dist: colorama==0.4.6; sys_platform == "win32"
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: exceptiongroup==1.3.1; python_full_version < "3.11"
Requires-Dist: fastuuid==0.14.0
Requires-Dist: filelock==3.25.2
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; platform_machine == "AMD64" or platform_machine == "aarch64" or platform_machine == "amd64" or platform_machine == "arm64" or platform_machine == "x86_64"
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: 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: numpy==1.26.4; python_full_version < "3.11"
Requires-Dist: numpy==2.4.3; python_full_version >= "3.11"
Requires-Dist: openai==2.28.0
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: pycparser==3.0; implementation_name != "PyPy"
Requires-Dist: pydantic==2.12.5
Requires-Dist: pydantic-core==2.41.5
Requires-Dist: pydub==0.25.1
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: scipy==1.15.3; python_full_version < "3.11"
Requires-Dist: scipy==1.17.1; python_full_version >= "3.11"
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: sounddevice==0.5.5
Requires-Dist: soundfile==0.13.1
Requires-Dist: soupsieve==2.8.3
Requires-Dist: tiktoken==0.12.0
Requires-Dist: tokenizers==0.22.2
Requires-Dist: tqdm==4.67.3
Requires-Dist: tree-sitter==0.25.2
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: ast-serialize==0.8.0; extra == "dev"
Requires-Dist: build==1.4.0; extra == "dev"
Requires-Dist: certifi==2026.2.25; extra == "dev"
Requires-Dist: cffi==2.0.0; platform_python_implementation != "PyPy" and 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; (os_name == "nt" or sys_platform == "win32") and extra == "dev"
Requires-Dist: contourpy==1.3.2; python_full_version < "3.11" and extra == "dev"
Requires-Dist: contourpy==1.3.3; python_full_version >= "3.11" and 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: exceptiongroup==1.3.1; python_full_version < "3.11" and extra == "dev"
Requires-Dist: filelock==3.25.2; extra == "dev"
Requires-Dist: flake8==7.3.0; 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: importlib-metadata==7.2.1; python_full_version < "3.10.2" and extra == "dev"
Requires-Dist: iniconfig==2.3.0; extra == "dev"
Requires-Dist: kiwisolver==1.5.0; extra == "dev"
Requires-Dist: librt==0.15.0; platform_python_implementation != "PyPy" and 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: mccabe==0.7.0; extra == "dev"
Requires-Dist: mdurl==0.1.2; extra == "dev"
Requires-Dist: mypy==2.3.1; extra == "dev"
Requires-Dist: mypy-extensions==1.1.0; extra == "dev"
Requires-Dist: nodeenv==1.10.0; extra == "dev"
Requires-Dist: numpy==1.26.4; python_full_version < "3.11" and extra == "dev"
Requires-Dist: numpy==2.4.3; python_full_version >= "3.11" and extra == "dev"
Requires-Dist: packaging==26.0; extra == "dev"
Requires-Dist: pandas==2.3.3; extra == "dev"
Requires-Dist: pathspec==1.0.4; 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: pycodestyle==2.14.0; extra == "dev"
Requires-Dist: pycparser==3.0; (implementation_name != "PyPy" and platform_python_implementation != "PyPy") and extra == "dev"
Requires-Dist: pyflakes==3.4.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: tomli==2.4.1; python_full_version <= "3.11" and 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"
Requires-Dist: zipp==3.23.0; python_full_version < "3.10.2" and extra == "dev"
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; sys_platform == "win32" and 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==1.26.4; python_full_version < "3.11" and extra == "browser"
Requires-Dist: numpy==2.4.3; python_full_version >= "3.11" and 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; sys_platform != "darwin" and 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"
Dynamic: license-file

<h1 align="center">
Patch
</h1>

<p align="center">
<strong>AI pair programming in your terminal</strong>
</p>

<p align="center">
  <a href="https://getpatch.dev">Website</a> ·
  <a href="https://github.com/PierrunoYT/patch">GitHub</a>
</p>

<p align="center">
  <a href="https://github.com/PierrunoYT/patch"><img alt="GitHub Stars" src="https://img.shields.io/github/stars/PierrunoYT/patch?style=flat-square&logo=github&color=f1c40f&labelColor=555555"></a>
  <a href="https://github.com/PierrunoYT/patch/blob/main/LICENSE.txt"><img alt="License" src="https://img.shields.io/github/license/PierrunoYT/patch?style=flat-square&labelColor=555555"></a>
</p>

Patch lets you pair program with LLMs to start a new project or build on an existing
codebase.

## Features

### Cloud and local LLMs

Patch connects to cloud and local LLMs, giving you the flexibility to use the models that work best for you.

### Maps your codebase

Patch maps your entire codebase, which helps it work well in larger projects.

### 100+ code languages

Patch works with Python, JavaScript, TypeScript, Rust, Ruby, Go, C++, PHP, HTML, CSS, and dozens more.

### Git integration

Patch automatically commits changes with sensible commit messages. Use familiar Git tools to diff, manage, and undo AI changes.

### Use in your IDE

Use Patch from within your favorite IDE or editor. Ask for changes by adding comments to your code and Patch will get to work.

### Images & web pages

Add images and web pages to the chat to provide visual context, screenshots, reference docs, etc.

### Voice-to-code

Speak with Patch about your code. Request new features, test cases, or bug fixes using your voice and let Patch implement the changes.

### Linting & testing

Automatically lint and test your code every time Patch makes changes. Patch can fix problems detected by your linters and test suites.

### Copy/paste to web chat

Work with any LLM via its web chat interface. Patch streamlines copying code context and edits between your terminal and browser.

## Getting Started

Install Patch from source and run the `patch` command:

```bash
git clone https://github.com/PierrunoYT/patch.git
cd patch
python -m pip install -e .

# Start Patch in your codebase
cd /to/your/project
patch
```

## Security Boundaries

Patch treats both model output and the repository under edit as untrusted input.

**Writes stay inside the repository.** Every model-supplied path is resolved canonically and
must land inside the repository root before anything is created or modified. Absolute paths,
`..` traversal, and symlinks pointing outside the tree are refused, including under `--no-git`
and `--yes`, and including the `patch` format's `Move to:` target. Files added with
`--read` are exempt: they are supplied by you, not the model, and are never written to.

**The repository's own config is not trusted.** A `.patch.conf.yml` or `.env` discovered inside
the repository cannot set execution-capable options (`test`, `test-cmd`, `lint-cmd`, `load`,
`notifications-command`, `editor`, `verify-ssl`, `git-commit-verify`) or environment variables
that redirect API endpoints or proxies (`*_API_BASE`, `*_BASE_URL`, `HTTP(S)_PROXY`,
`REQUESTS_CA_BUNDLE`, ...). Ignored settings are reported at startup. Your home-directory
config and any file you pass explicitly with `--config` / `--env-file` are trusted as usual.

Pass `--trust-repo-config` to opt back in for a repository you trust. You can also set
`PATCH_TRUST_REPO_CONFIG` in your shell. The setting is ignored when it comes from the repository's
own config or `.env`, so a repository cannot grant itself trust.

## Development

See [CONTRIBUTING.md](CONTRIBUTING.md) for local development instructions. Amp orbs use the
repository's executable [`.agents/setup`](.agents/setup) script to provision the complete
development and optional-feature toolchain automatically on fresh remote machines.

## More Information

### Documentation
- [Installation and quick start](#getting-started)
- [Security boundaries](#security-boundaries)
- [Development guide](CONTRIBUTING.md)
- Run `patch --help` for all command-line and configuration options
- [Report a problem or request a feature](https://github.com/PierrunoYT/patch/issues)

### Community & Resources
- [Patch website](https://getpatch.dev)
- [Patch on GitHub](https://github.com/PierrunoYT/patch)
- [Release notes](CHANGELOG.md)
