@contextzip/cli-linux-arm64 0.0.0-stage → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -2
  3. package/bin/contextzip/_internal/base_library.zip +0 -0
  4. package/bin/contextzip/_internal/certifi/cacert.pem +3885 -0
  5. package/bin/contextzip/_internal/certifi/py.typed +0 -0
  6. package/bin/contextzip/_internal/click-8.5.0.dist-info/INSTALLER +1 -0
  7. package/bin/contextzip/_internal/click-8.5.0.dist-info/METADATA +83 -0
  8. package/bin/contextzip/_internal/click-8.5.0.dist-info/RECORD +40 -0
  9. package/bin/contextzip/_internal/click-8.5.0.dist-info/WHEEL +4 -0
  10. package/bin/contextzip/_internal/click-8.5.0.dist-info/licenses/LICENSE.txt +28 -0
  11. package/bin/contextzip/_internal/contextzip.egg-info/PKG-INFO +493 -0
  12. package/bin/contextzip/_internal/contextzip.egg-info/SOURCES.txt +86 -0
  13. package/bin/contextzip/_internal/contextzip.egg-info/dependency_links.txt +1 -0
  14. package/bin/contextzip/_internal/contextzip.egg-info/entry_points.txt +3 -0
  15. package/bin/contextzip/_internal/contextzip.egg-info/requires.txt +4 -0
  16. package/bin/contextzip/_internal/contextzip.egg-info/top_level.txt +6 -0
  17. package/bin/contextzip/_internal/libbz2.so.1.0 +0 -0
  18. package/bin/contextzip/_internal/libcrypto.so.3 +0 -0
  19. package/bin/contextzip/_internal/libffi.so.8 +0 -0
  20. package/bin/contextzip/_internal/liblzma.so.5 +0 -0
  21. package/bin/contextzip/_internal/libpython3.12.so.1.0 +0 -0
  22. package/bin/contextzip/_internal/libssl.so.3 +0 -0
  23. package/bin/contextzip/_internal/libuuid.so.1 +0 -0
  24. package/bin/contextzip/_internal/libz.so.1 +0 -0
  25. package/bin/contextzip/_internal/python3.12/lib-dynload/_asyncio.cpython-312-aarch64-linux-gnu.so +0 -0
  26. package/bin/contextzip/_internal/python3.12/lib-dynload/_bisect.cpython-312-aarch64-linux-gnu.so +0 -0
  27. package/bin/contextzip/_internal/python3.12/lib-dynload/_blake2.cpython-312-aarch64-linux-gnu.so +0 -0
  28. package/bin/contextzip/_internal/python3.12/lib-dynload/_bz2.cpython-312-aarch64-linux-gnu.so +0 -0
  29. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_cn.cpython-312-aarch64-linux-gnu.so +0 -0
  30. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_hk.cpython-312-aarch64-linux-gnu.so +0 -0
  31. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_iso2022.cpython-312-aarch64-linux-gnu.so +0 -0
  32. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_jp.cpython-312-aarch64-linux-gnu.so +0 -0
  33. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_kr.cpython-312-aarch64-linux-gnu.so +0 -0
  34. package/bin/contextzip/_internal/python3.12/lib-dynload/_codecs_tw.cpython-312-aarch64-linux-gnu.so +0 -0
  35. package/bin/contextzip/_internal/python3.12/lib-dynload/_contextvars.cpython-312-aarch64-linux-gnu.so +0 -0
  36. package/bin/contextzip/_internal/python3.12/lib-dynload/_csv.cpython-312-aarch64-linux-gnu.so +0 -0
  37. package/bin/contextzip/_internal/python3.12/lib-dynload/_ctypes.cpython-312-aarch64-linux-gnu.so +0 -0
  38. package/bin/contextzip/_internal/python3.12/lib-dynload/_datetime.cpython-312-aarch64-linux-gnu.so +0 -0
  39. package/bin/contextzip/_internal/python3.12/lib-dynload/_decimal.cpython-312-aarch64-linux-gnu.so +0 -0
  40. package/bin/contextzip/_internal/python3.12/lib-dynload/_hashlib.cpython-312-aarch64-linux-gnu.so +0 -0
  41. package/bin/contextzip/_internal/python3.12/lib-dynload/_heapq.cpython-312-aarch64-linux-gnu.so +0 -0
  42. package/bin/contextzip/_internal/python3.12/lib-dynload/_json.cpython-312-aarch64-linux-gnu.so +0 -0
  43. package/bin/contextzip/_internal/python3.12/lib-dynload/_lzma.cpython-312-aarch64-linux-gnu.so +0 -0
  44. package/bin/contextzip/_internal/python3.12/lib-dynload/_md5.cpython-312-aarch64-linux-gnu.so +0 -0
  45. package/bin/contextzip/_internal/python3.12/lib-dynload/_multibytecodec.cpython-312-aarch64-linux-gnu.so +0 -0
  46. package/bin/contextzip/_internal/python3.12/lib-dynload/_multiprocessing.cpython-312-aarch64-linux-gnu.so +0 -0
  47. package/bin/contextzip/_internal/python3.12/lib-dynload/_opcode.cpython-312-aarch64-linux-gnu.so +0 -0
  48. package/bin/contextzip/_internal/python3.12/lib-dynload/_pickle.cpython-312-aarch64-linux-gnu.so +0 -0
  49. package/bin/contextzip/_internal/python3.12/lib-dynload/_posixshmem.cpython-312-aarch64-linux-gnu.so +0 -0
  50. package/bin/contextzip/_internal/python3.12/lib-dynload/_posixsubprocess.cpython-312-aarch64-linux-gnu.so +0 -0
  51. package/bin/contextzip/_internal/python3.12/lib-dynload/_queue.cpython-312-aarch64-linux-gnu.so +0 -0
  52. package/bin/contextzip/_internal/python3.12/lib-dynload/_random.cpython-312-aarch64-linux-gnu.so +0 -0
  53. package/bin/contextzip/_internal/python3.12/lib-dynload/_sha1.cpython-312-aarch64-linux-gnu.so +0 -0
  54. package/bin/contextzip/_internal/python3.12/lib-dynload/_sha2.cpython-312-aarch64-linux-gnu.so +0 -0
  55. package/bin/contextzip/_internal/python3.12/lib-dynload/_sha3.cpython-312-aarch64-linux-gnu.so +0 -0
  56. package/bin/contextzip/_internal/python3.12/lib-dynload/_socket.cpython-312-aarch64-linux-gnu.so +0 -0
  57. package/bin/contextzip/_internal/python3.12/lib-dynload/_ssl.cpython-312-aarch64-linux-gnu.so +0 -0
  58. package/bin/contextzip/_internal/python3.12/lib-dynload/_statistics.cpython-312-aarch64-linux-gnu.so +0 -0
  59. package/bin/contextzip/_internal/python3.12/lib-dynload/_struct.cpython-312-aarch64-linux-gnu.so +0 -0
  60. package/bin/contextzip/_internal/python3.12/lib-dynload/_uuid.cpython-312-aarch64-linux-gnu.so +0 -0
  61. package/bin/contextzip/_internal/python3.12/lib-dynload/array.cpython-312-aarch64-linux-gnu.so +0 -0
  62. package/bin/contextzip/_internal/python3.12/lib-dynload/binascii.cpython-312-aarch64-linux-gnu.so +0 -0
  63. package/bin/contextzip/_internal/python3.12/lib-dynload/fcntl.cpython-312-aarch64-linux-gnu.so +0 -0
  64. package/bin/contextzip/_internal/python3.12/lib-dynload/grp.cpython-312-aarch64-linux-gnu.so +0 -0
  65. package/bin/contextzip/_internal/python3.12/lib-dynload/math.cpython-312-aarch64-linux-gnu.so +0 -0
  66. package/bin/contextzip/_internal/python3.12/lib-dynload/mmap.cpython-312-aarch64-linux-gnu.so +0 -0
  67. package/bin/contextzip/_internal/python3.12/lib-dynload/pyexpat.cpython-312-aarch64-linux-gnu.so +0 -0
  68. package/bin/contextzip/_internal/python3.12/lib-dynload/resource.cpython-312-aarch64-linux-gnu.so +0 -0
  69. package/bin/contextzip/_internal/python3.12/lib-dynload/select.cpython-312-aarch64-linux-gnu.so +0 -0
  70. package/bin/contextzip/_internal/python3.12/lib-dynload/termios.cpython-312-aarch64-linux-gnu.so +0 -0
  71. package/bin/contextzip/_internal/python3.12/lib-dynload/unicodedata.cpython-312-aarch64-linux-gnu.so +0 -0
  72. package/bin/contextzip/_internal/python3.12/lib-dynload/zlib.cpython-312-aarch64-linux-gnu.so +0 -0
  73. package/bin/contextzip/contextzip +0 -0
  74. package/package.json +20 -4
File without changes
@@ -0,0 +1,83 @@
1
+ Metadata-Version: 2.4
2
+ Name: click
3
+ Version: 8.5.0
4
+ Summary: Composable command line interface toolkit
5
+ Maintainer-email: Pallets <contact@palletsprojects.com>
6
+ Requires-Python: >=3.10
7
+ Description-Content-Type: text/markdown
8
+ License-Expression: BSD-3-Clause
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Typing :: Typed
14
+ License-File: LICENSE.txt
15
+ Project-URL: Changes, https://click.palletsprojects.com/page/changes/
16
+ Project-URL: Chat, https://discord.gg/pallets
17
+ Project-URL: Documentation, https://click.palletsprojects.com/
18
+ Project-URL: Donate, https://palletsprojects.com/donate
19
+ Project-URL: Source, https://github.com/pallets/click/
20
+
21
+ <div align="center"><img src="https://raw.githubusercontent.com/pallets/click/refs/heads/stable/docs/_static/click-name.svg" alt="" height="150"></div>
22
+
23
+ # Click
24
+
25
+ Click is a Python package for creating beautiful command line interfaces
26
+ in a composable way with as little code as necessary. It's the "Command
27
+ Line Interface Creation Kit". It's highly configurable but comes with
28
+ sensible defaults out of the box.
29
+
30
+ It aims to make the process of writing command line tools quick and fun
31
+ while also preventing any frustration caused by the inability to
32
+ implement an intended CLI API.
33
+
34
+ Click in three points:
35
+
36
+ - Arbitrary nesting of commands
37
+ - Automatic help page generation
38
+ - Supports lazy loading of subcommands at runtime
39
+
40
+
41
+ ## A Simple Example
42
+
43
+ ```python
44
+ import click
45
+
46
+ @click.command()
47
+ @click.option("--count", default=1, help="Number of greetings.")
48
+ @click.option("--name", prompt="Your name", help="The person to greet.")
49
+ def hello(count, name):
50
+ """Simple program that greets NAME for a total of COUNT times."""
51
+ for _ in range(count):
52
+ click.echo(f"Hello, {name}!")
53
+
54
+ if __name__ == '__main__':
55
+ hello()
56
+ ```
57
+
58
+ ```
59
+ $ python hello.py --count=3
60
+ Your name: Click
61
+ Hello, Click!
62
+ Hello, Click!
63
+ Hello, Click!
64
+ ```
65
+
66
+
67
+ ## Donate
68
+
69
+ The Pallets organization develops and supports Click and other popular
70
+ packages. In order to grow the community of contributors and users, and
71
+ allow the maintainers to devote more time to the projects, [please
72
+ donate today][].
73
+
74
+ [please donate today]: https://palletsprojects.com/donate
75
+
76
+ ## Contributing
77
+
78
+ See our [detailed contributing documentation][contrib] for many ways to
79
+ contribute, including reporting issues, requesting features, asking or answering
80
+ questions, and making PRs.
81
+
82
+ [contrib]: https://palletsprojects.com/contributing/
83
+
@@ -0,0 +1,40 @@
1
+ click-8.5.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ click-8.5.0.dist-info/METADATA,sha256=6HvOC9GU3nDfuOcI4KawSDAJ8lYRgE6vh7_rY-bCBQE,2567
3
+ click-8.5.0.dist-info/RECORD,,
4
+ click-8.5.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
5
+ click-8.5.0.dist-info/licenses/LICENSE.txt,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475
6
+ click/__init__.py,sha256=Wr_FTTfUfMeIt-egXpUUeH-MWgt9tCnQ8k10isiZZMo,5145
7
+ click/__pycache__/__init__.cpython-312.pyc,,
8
+ click/__pycache__/_compat.cpython-312.pyc,,
9
+ click/__pycache__/_termui_impl.cpython-312.pyc,,
10
+ click/__pycache__/_textwrap.cpython-312.pyc,,
11
+ click/__pycache__/_utils.cpython-312.pyc,,
12
+ click/__pycache__/_winconsole.cpython-312.pyc,,
13
+ click/__pycache__/core.cpython-312.pyc,,
14
+ click/__pycache__/decorators.cpython-312.pyc,,
15
+ click/__pycache__/exceptions.cpython-312.pyc,,
16
+ click/__pycache__/formatting.cpython-312.pyc,,
17
+ click/__pycache__/globals.cpython-312.pyc,,
18
+ click/__pycache__/parser.cpython-312.pyc,,
19
+ click/__pycache__/shell_completion.cpython-312.pyc,,
20
+ click/__pycache__/termui.cpython-312.pyc,,
21
+ click/__pycache__/testing.cpython-312.pyc,,
22
+ click/__pycache__/types.cpython-312.pyc,,
23
+ click/__pycache__/utils.cpython-312.pyc,,
24
+ click/_compat.py,sha256=jbHaKWXPPl3GbGxTgzy8YT6hzSRAudDraqg2DrRtSRM,17939
25
+ click/_termui_impl.py,sha256=iLl9m3pblHsQoW2KsmmDe8hMflXCi6cupfL7M5ESM2o,32805
26
+ click/_textwrap.py,sha256=7Z0N7Vmn-66TNSTUwp6OXJbcUXRmYET9h9c2ucD8oQQ,6270
27
+ click/_utils.py,sha256=eCZCtwJtsYD5QYkkNWJ8MY_8ABIjy8MczgMMyVY32rQ,996
28
+ click/_winconsole.py,sha256=KSxfNbMlYRa6GOJuCLgsg2Pb3dVkgJNPqLJPae-Pa10,8543
29
+ click/core.py,sha256=TGWmE8HEB9zpB6ThI7Es7F_g9iCIqLn4b6vUtgxLbXg,147845
30
+ click/decorators.py,sha256=FgaTV2FWkfzfyceUu1FfYAnrNarW96dsAXvc4G2ujVU,21680
31
+ click/exceptions.py,sha256=HvSY34G4auj_bYRR8-T8CU8Jwq_1-OcsRU4ezfozeEk,11862
32
+ click/formatting.py,sha256=8SW2KGkvjfz9Q1NbeojMHuZBN0cfnQJDs4mqDP6oXms,10444
33
+ click/globals.py,sha256=gM-Nh6A4M0HB_SgkaF5M4ncGGMDHc_flHXu9_oh4GEU,1923
34
+ click/parser.py,sha256=oJ-fU_3mvxugIuNtHaCATZ56lgEmHRggjJiSqEgYrjA,19052
35
+ click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ click/shell_completion.py,sha256=GFIvdd3_5lXpQ5eNGVMlXER4QoZ9P9Z_vcFUPT332gk,26172
37
+ click/termui.py,sha256=jsgCK45FKPhz7EExlKXRYU6W2lC2xKcfYmCzJnYqfpw,35370
38
+ click/testing.py,sha256=dvTmSbxTAA1mfIwN7_FZGXD6A0sPCFogcWWDmyMBAZo,27584
39
+ click/types.py,sha256=HpiJBKen9oq61jDH-5wDikNF-i5nAcl2puUfEL37Ut0,46842
40
+ click/utils.py,sha256=9D1XQ9wHJA5hL-76CmnSsWl7aQAUn4-An_zZfstILb8,21483
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: flit 3.12.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,28 @@
1
+ Copyright 2014 Pallets
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions are
5
+ met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ 3. Neither the name of the copyright holder nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,493 @@
1
+ Metadata-Version: 2.4
2
+ Name: contextzip
3
+ Version: 0.5.4
4
+ Summary: Intelligently package your codebase for AI tools
5
+ Author-email: Deepesh <akadeepesh@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://www.contextzipcli.com
8
+ Project-URL: Documentation, https://www.contextzipcli.com/getting-started
9
+ Project-URL: Repository, https://github.com/akadeepesh/contextzip
10
+ Project-URL: Issues, https://github.com/akadeepesh/contextzip/issues
11
+ Keywords: ai,cli,developer-tools,context,zip,llm,claude,chatgpt,code-packaging
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.9
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Software Development :: Build Tools
21
+ Classifier: Topic :: Utilities
22
+ Requires-Python: >=3.9
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: click>=8.1
26
+ Requires-Dist: rich>=13.0
27
+ Requires-Dist: pathspec>=0.12
28
+ Requires-Dist: httpx>=0.27
29
+ Dynamic: license-file
30
+
31
+ <div align="center">
32
+
33
+ # contextzip
34
+
35
+ **Package exactly the right parts of your codebase for any AI tool, in one command.**
36
+
37
+ [![PyPI](https://img.shields.io/pypi/v/contextzip?color=blue)](https://pypi.org/project/contextzip/)
38
+ [![Python](https://img.shields.io/pypi/pyversions/contextzip)](https://pypi.org/project/contextzip/)
39
+ [![PyPI Downloads](https://static.pepy.tech/personalized-badge/contextzip?period=total&units=INTERNATIONAL_SYSTEM&left_color=BLACK&right_color=GREEN&left_text=downloads)](https://pepy.tech/projects/contextzip)
40
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/akadeepesh/contextzip/blob/main/LICENSE)
41
+
42
+ [Documentation](https://www.contextzipcli.com) ·
43
+ [CLI reference](https://github.com/akadeepesh/contextzip/blob/main/CLI.md) ·
44
+ [Changelog](https://github.com/akadeepesh/contextzip/blob/main/CHANGELOG.md) ·
45
+ [Report a bug](https://github.com/akadeepesh/contextzip/issues/new/choose)
46
+
47
+ </div>
48
+
49
+ https://github.com/user-attachments/assets/91913ad6-6161-430d-9075-b0fa76498021
50
+
51
+ <div align="center">
52
+
53
+ [![Watch the 72-second walkthrough: cz, then cz apply-zip](https://i.ytimg.com/vi/9FnYfyB3qd8/maxresdefault.jpg)](https://youtu.be/9FnYfyB3qd8)
54
+
55
+ **[Watch the 72-second walkthrough on YouTube](https://youtu.be/9FnYfyB3qd8)**: package a project with `cz`, paste it into Claude, and write the reply back with `cz apply-zip`.
56
+
57
+ </div>
58
+
59
+ ---
60
+
61
+ ## Why contextzip?
62
+
63
+ Every AI coding session starts the same way. You hunt down the relevant files, skip `node_modules` and build output by hand, zip it all, find the zip and upload it. Next session, you do it again.
64
+
65
+ contextzip does all of that for you. Run it from your project root and it:
66
+
67
+ 1. **Detects your stack** (Node.js, Next.js, Python, Django, FastAPI, Rust, Go, Ruby, monorepos included).
68
+ 2. **Excludes the noise**: dependencies, build output, caches, binaries, logs, and anything in your `.gitignore`.
69
+ 3. **Keeps secrets out**: `.env` files, private keys, cloud credentials and Terraform state are left out by default. If you include your `.env` on purpose, its values are redacted.
70
+ 4. **Puts the ZIP on your clipboard** as a real file, so you can paste it straight into Claude, ChatGPT, Gemini or any other upload box.
71
+
72
+ When the AI sends changed files back, `contextzip apply-zip` writes them into your project safely, and warns you before touching anything you've edited since.
73
+
74
+ ## Table of contents
75
+
76
+ - [Installation](#installation)
77
+ - ["`cz` is not recognized"](#cz-is-not-recognized--command-not-found)
78
+ - [Quick start](#quick-start)
79
+ - [Features](#features)
80
+ - [Smart packaging](#smart-packaging)
81
+ - [Package only what changed](#package-only-what-changed)
82
+ - [Package a GitHub repo](#package-a-github-repo)
83
+ - [AI-powered file selection](#ai-powered-file-selection)
84
+ - [Applying AI changes back](#applying-ai-changes-back)
85
+ - [Terminal error watcher](#terminal-error-watcher)
86
+ - [Visual config UI](#visual-config-ui)
87
+ - [Command reference](#command-reference)
88
+ - [Configuration](#configuration)
89
+ - [What is always excluded](#what-is-always-excluded)
90
+ - [Where files go](#where-files-go)
91
+ - [Python API](#python-api)
92
+ - [Privacy & security](#privacy--security)
93
+ - [Platform support](#platform-support)
94
+ - [Contributing](#contributing)
95
+ - [License](#license)
96
+
97
+ ## Installation
98
+
99
+ **With Python** (3.9 or newer):
100
+
101
+ ```bash
102
+ pip install contextzip
103
+ ```
104
+
105
+ Installing with [pipx](https://pipx.pypa.io/) or [uv](https://docs.astral.sh/uv/) keeps it isolated from your projects:
106
+
107
+ ```bash
108
+ pipx install contextzip
109
+ # or
110
+ uv tool install contextzip
111
+ ```
112
+
113
+ **Without Python.** These install a standalone build of the same tool:
114
+
115
+ ```bash
116
+ npm install -g @contextzip/cli # Node.js 16+, any OS
117
+ brew install akadeepesh/tap/contextzip # macOS / Linux (Homebrew)
118
+ scoop bucket add contextzip https://github.com/akadeepesh/scoop-bucket
119
+ scoop install contextzip # Windows (Scoop)
120
+ ```
121
+
122
+ Or download an archive for your platform from the [latest release](https://github.com/akadeepesh/contextzip/releases/latest), unpack it, and put the `contextzip` folder on your PATH. Builds are made for Windows x64, macOS (Apple Silicon and Intel) and Linux x64/arm64 (glibc 2.35 or newer).
123
+
124
+ **In VS Code, Cursor or Windsurf**, install the **contextzip** extension. It bundles the CLI, adds "Package for AI" to the Explorer, and offers to apply an AI's ZIP as soon as it lands in your Downloads. See [vscode/README.md](vscode/README.md).
125
+
126
+ **Just trying it?** Nothing stays installed with these:
127
+
128
+ ```bash
129
+ npx @contextzip/cli # Node.js
130
+ uvx contextzip # uv
131
+ pipx run contextzip # pipx
132
+ ```
133
+
134
+ Every method installs two commands that do the same thing: `contextzip` and the shorter `cz`.
135
+
136
+ To update later, run `contextzip update`. It works out whether you installed with pip, pipx or uv and upgrades the right one. A standalone build tells you the npm, Homebrew or Scoop command to run instead.
137
+
138
+ ### "`cz` is not recognized" / "command not found"
139
+
140
+ pip installed contextzip, but put the `cz` command in a folder your terminal doesn't search. This is common with Python from the Microsoft Store or the Python install manager on Windows, and with `pip install --user` on macOS and Linux. Look for pip's `WARNING: The scripts cz.exe and contextzip.exe are installed in '…' which is not on PATH.`
141
+
142
+ Python itself always works, so run contextzip through it and let it fix PATH for you:
143
+
144
+ ```bash
145
+ python -m contextzip setup-path # macOS / Linux: python3 -m contextzip setup-path
146
+ ```
147
+
148
+ On Windows this adds the folder to your user PATH (no admin needed). On macOS and Linux it adds one line to your shell's startup file. Open a new terminal and `cz` works. Until then, `python -m contextzip` does everything `cz` does.
149
+
150
+ If you installed with pipx, run `pipx ensurepath`. With uv, run `uv tool update-shell`.
151
+
152
+ ## Quick start
153
+
154
+ ```bash
155
+ cd ~/projects/my-app
156
+ contextzip
157
+ ```
158
+
159
+ You don't need any flags. contextzip detects your framework, excludes the noise, writes `codebase.zip` into `.contextzip/output/codebase/` and copies it to your clipboard. Paste it into your AI tool.
160
+
161
+ Some other common runs:
162
+
163
+ ```bash
164
+ contextzip --dry-run --verbose # preview every included/excluded file, write nothing
165
+ contextzip --git-changes # only what you've changed
166
+ contextzip --prompt "fix the login redirect bug" # let AI pick the relevant files
167
+ contextzip include src/ app/ # only these folders
168
+ contextzip include src/ .env # .env too, values redacted
169
+ contextzip --here # only the folder you're in (monorepos)
170
+ contextzip github.com/user/repo # a GitHub repo, without cloning it
171
+ contextzip exclude tests/ '*.snap' # everything except these
172
+ contextzip apply-zip # write the AI's changes back
173
+ ```
174
+
175
+ ## Features
176
+
177
+ ### Smart packaging
178
+
179
+ contextzip scans your project and recognises its stack from marker files such as `package.json`, `next.config.*`, `pyproject.toml`, `manage.py`, `Cargo.toml`, `go.mod` and `Gemfile`. It looks a couple of levels deep, so a monorepo with a Next.js frontend and a FastAPI backend gets **both** rule sets applied.
180
+
181
+ | Ecosystem | Examples of what's excluded |
182
+ |---|---|
183
+ | **Node.js / Next.js** | `node_modules/`, `.next/`, `dist/`, `build/`, `coverage/`, lockfiles, `*.min.js` |
184
+ | **Python / Django / FastAPI** | `__pycache__/`, `.venv/`, `*.pyc`, `.pytest_cache/`, `*.egg-info/` |
185
+ | **Rust** | `target/`, `Cargo.lock`, `*.rlib` |
186
+ | **Go** | `vendor/`, `bin/`, `go.sum` |
187
+ | **Ruby / Rails** | `vendor/bundle/`, `tmp/`, `log/`, `storage/`, built gems |
188
+
189
+ On top of the stack rules, contextzip also:
190
+
191
+ - respects your `.gitignore` (turn this off with `--no-gitignore`),
192
+ - flags large files (1 MB or more by default) and binary files before packaging,
193
+ - skips dangling symlinks and unreadable files, and tells you why,
194
+ - writes a plain-text report next to every ZIP listing what went in and what was left out,
195
+ - estimates the token count of what it packed (`≈ 46k tokens`), so you know whether it'll fit before you upload.
196
+
197
+ ### Package only what changed
198
+
199
+ ```bash
200
+ contextzip --git-changes
201
+ ```
202
+
203
+ This packages only the files git reports as **staged, modified or untracked**. It's ideal for code review or "here's what I changed, what's wrong?" prompts. Deleted files, submodules and monorepo roots are handled for you, and the secret-exclusion rules still apply to files git tracks.
204
+
205
+ ### Package a GitHub repo
206
+
207
+ ```bash
208
+ contextzip github.com/pallets/click
209
+ contextzip https://github.com/pallets/click/tree/main/src # one branch, one folder
210
+ contextzip gh:you/private-repo --ref dev
211
+ ```
212
+
213
+ No clone and no git needed: contextzip downloads one commit through the GitHub API into a local cache and packages it like any other project, with the same stack detection, exclusions and redaction. `include` and `exclude` work as usual, and a `/tree/<branch>/<folder>` link packages just that folder.
214
+
215
+ - **Private repos:** set `GITHUB_TOKEN`, or sign in with the GitHub CLI (`gh auth login`) and contextzip uses that. The token is only ever sent to `api.github.com`.
216
+ - **Cache:** a commit is downloaded once and reused. Override the location with `CONTEXTZIP_CACHE_DIR`; downloads over 250 MB are refused unless you raise `CONTEXTZIP_REMOTE_MAX_MB`.
217
+
218
+ ### AI-powered file selection
219
+
220
+ ```bash
221
+ contextzip --prompt "add rate limiting to the login endpoint"
222
+ ```
223
+
224
+ Describe your task in plain language and [Gemini](https://ai.google.dev/) picks only the files that matter. The ZIP also includes a `prompt.txt` describing the task, so the AI tool you paste it into knows what you want.
225
+
226
+ - **Setup:** you need a free Gemini API key. contextzip walks you through it the first time you use `--prompt`, or you can set the `GEMINI_API_KEY` environment variable.
227
+ - **What is sent:** only the list of file **paths and sizes** that already passed the exclusion rules, plus your prompt. File contents never leave your machine.
228
+ - **Fallback:** if Gemini is rate-limited, a local keyword-based selector takes over, so `--prompt` keeps working. Other errors (a bad key, no network) stop with a clear message.
229
+ - **Model:** `gemini-2.5-flash-lite` by default.
230
+
231
+ ### Applying AI changes back
232
+
233
+ ```bash
234
+ contextzip apply-zip # picks up a ZIP from .contextzip/inbox/
235
+ contextzip apply-zip fix.zip # or point at one directly
236
+ contextzip apply-zip --dry-run # preview without writing anything
237
+ ```
238
+
239
+ AI tools return ZIPs in every shape: wrapped in an extra folder, relative to a subfolder, flattened, with Windows separators. `apply-zip` matches each file to its real place in your project anyway, and new files follow their siblings.
240
+
241
+ Every ZIP contextzip makes gets a **local snapshot** (a hash of each file, never uploaded). `apply-zip` picks the snapshot that best matches the returned ZIP and compares three versions of each file: what you sent, what's on disk now, and what came back.
242
+
243
+ | Status | Meaning | Default |
244
+ |---|---|---|
245
+ | **New** / **Modified** | New file, or only the AI changed it | Written |
246
+ | **Merged** | You both changed it, in different places | Written (three-way merge) |
247
+ | **Unchanged** | Already matches — including changes you already applied | Skipped |
248
+ | **Conflict** | You both changed the same or neighbouring lines | Needs your call |
249
+ | **Partial** | The AI returned a cut-down file (`// ... rest unchanged`) | Needs your call |
250
+ | **Moved** | The AI moved or renamed it | Written at the new path; the old file is kept unless you say otherwise |
251
+ | **Drifted** / **Deleted** / **Untracked** / **Ambiguous** / **Delete requested** | Can't be applied safely without you | Needs your call |
252
+
253
+ When something needs a decision you choose: apply the safe changes now, **review side by side in your browser** (`--review`), **resolve in VS Code's merge editor** (`--editor`), or apply everything. Line endings never count as a change, redacted secrets are never overwritten with placeholders, and **files are only removed with your explicit OK** — never one you've changed since.
254
+
255
+ ### Snapshots and CONTEXTZIP.md
256
+
257
+ Every package is kept locally as a numbered **snapshot** (`#14`), so a reply can be merged against exactly what you sent, even after you've packaged again. Each ZIP also carries a short **`CONTEXTZIP.md`** for the AI: the snapshot ID, and how to reply so the answer applies cleanly (complete files, same paths, secrets left as `[REDACTED]`, moves and deletions listed). When the reply echoes it back, `apply-zip` knows the exact snapshot. `contextzip snapshots` lists them; turn the file off with `"zip_guide": false`.
258
+
259
+ ### Terminal error watcher
260
+
261
+ ```bash
262
+ contextzip watch -- npm run dev
263
+ contextzip watch -- python manage.py runserver
264
+ contextzip watch -- python -m pytest --tb=short
265
+ ```
266
+
267
+ contextzip runs your command and watches its output. When a stack trace appears (Python, Django and Node.js/Next.js errors are recognised), it asks whether to package debug context. Press `D` and you get `debug-context.zip` containing:
268
+
269
+ - `prompt.txt`: an auto-generated description of the problem
270
+ - `terminal-error.txt`: the error output with ANSI codes and noise stripped out
271
+ - `source-files.zip`: the source files named in the stack trace
272
+
273
+ If you press Ctrl+C before packaging anything, you get one last chance to capture the whole session.
274
+
275
+ ### Visual config UI
276
+
277
+ ```bash
278
+ contextzip config --ui
279
+ ```
280
+
281
+ This opens a local browser tab where you can tick files and folders to always include or exclude, with a live preview of what the ZIP will contain. It saves to `.contextzip/config.json`. The server binds to `127.0.0.1` only, needs a random one-time session token and shuts itself down when you're done.
282
+
283
+ ## Command reference
284
+
285
+ | Command | What it does |
286
+ |---|---|
287
+ | `contextzip` | Detect the stack, exclude noise and package the project |
288
+ | `contextzip github.com/user/repo` | Package a GitHub repository without cloning it |
289
+ | `contextzip include PATH…` | Package **only** these paths |
290
+ | `contextzip exclude PATTERN…` | Package everything **except** these patterns |
291
+ | `contextzip --prompt "task"` | Let Gemini pick only the files relevant to a task |
292
+ | `contextzip --git-changes` | Package only modified, staged and untracked files |
293
+ | `contextzip apply-zip [ZIP]` | Write an AI-returned ZIP back into your project, safely |
294
+ | `contextzip watch -- COMMAND` | Run a command and package debug context when an error appears |
295
+ | `contextzip config …` | Gemini key, workspace location and the visual config UI |
296
+ | `contextzip update` | Check PyPI for a newer release and update in place |
297
+
298
+ **Run flags** work on `contextzip`, `include` and `exclude`:
299
+
300
+ | Flag | Short | Description |
301
+ |---|---|---|
302
+ | `--include PATH` | `-i` | Only include files under these paths. Naming an excluded path (like `.env`) brings it back. Repeatable. |
303
+ | `--exclude PATTERN` | `-e` | Extra exclusion patterns (gitignore syntax). Repeatable. |
304
+ | `--prompt TEXT` | `-p` | Let Gemini select files relevant to this task. |
305
+ | `--git-changes` | | Only include files git reports as changed. |
306
+ | `--dry-run` | `-n` | Show what would be included without creating the ZIP. |
307
+ | `--output FILE` | `-o` | Write the ZIP to this exact path. |
308
+ | `--no-clipboard` | | Don't copy the ZIP to the clipboard. |
309
+ | `--no-gitignore` | | Ignore `.gitignore` and use only the built-in rules. |
310
+ | `--verbose` | `-v` | List every included and excluded file. |
311
+ | `--from REPO` | | Package a GitHub repository instead of the local project (or just put the repo first: `contextzip github.com/user/repo`). |
312
+ | `--ref REF` | | Branch, tag or commit for `--from`. |
313
+ | `--json` | | Print one JSON object instead of terminal output, for editors and scripts. Also on `apply-zip` and `snapshots`. |
314
+
315
+ Every command supports `-h` / `--help`, and `contextzip --version` prints the installed version.
316
+
317
+ For every flag of every subcommand (`apply-zip`, `watch`, `config`, `update`), see **[CLI.md](https://github.com/akadeepesh/contextzip/blob/main/CLI.md)** or the [online CLI reference](https://www.contextzipcli.com/cli).
318
+
319
+ ## Configuration
320
+
321
+ contextzip has two config files, and both are optional.
322
+
323
+ ### Project config: `.contextzip/config.json`
324
+
325
+ This holds per-project settings. Edit it by hand or with `contextzip config --ui`. Every key is optional:
326
+
327
+ ```jsonc
328
+ {
329
+ "always_include": ["docs/architecture.md"], // force-include, even if a rule or .gitignore excludes it
330
+ "always_exclude": ["*.snap", "fixtures/"], // a standing --exclude on every run
331
+ "workspace_location": "git-root", // "git-root" | "cwd" | "/some/path"
332
+ "ai": {
333
+ "enabled": true,
334
+ "max_files": 10, // cap on files the AI may select
335
+ "prompt_template": "We use pytest, not unittest." // prepended to every prompt.txt
336
+ },
337
+ "limits": {
338
+ "max_file_size_mb": 1, // threshold for "large file" warnings
339
+ "redact_secrets": false // scan included files and mask secret-looking values
340
+ },
341
+ "applied_zip_retention": 1, // past apply-zip archives to keep
342
+ "cleanup": { "enabled": true, "keep_recent": 1 },
343
+ "snapshots": { "keep": 10, "max_age_days": 14 }, // history apply-zip merges against
344
+ "zip_guide": true, // add CONTEXTZIP.md to every ZIP
345
+ "webui": { "auto_open": true, "port": null }
346
+ }
347
+ ```
348
+
349
+ `.contextzip/` is fully gitignored by default. If your team wants to share these settings, commit the file explicitly with `git add -f .contextzip/config.json`.
350
+
351
+ ### Personal config
352
+
353
+ Your Gemini API key and personal defaults live outside the project, so they're never committed:
354
+
355
+ | OS | Location |
356
+ |---|---|
357
+ | Linux / macOS | `~/.config/contextzip/config.json` (or `$XDG_CONFIG_HOME/contextzip/`) |
358
+ | Windows | `%APPDATA%\contextzip\config.json` |
359
+
360
+ ```bash
361
+ contextzip config # show the current configuration
362
+ contextzip config --reset-key # clear the Gemini key and set it up again
363
+ contextzip config --set-workspace cwd # put .contextzip/ in the current directory
364
+ contextzip config --show-key-path # print the config file location
365
+ ```
366
+
367
+ The full option-by-option guide is at [contextzipcli.com/configuration](https://www.contextzipcli.com/configuration).
368
+
369
+ ## What is always excluded
370
+
371
+ These patterns apply to **every** project, whatever its stack or `.gitignore` says, and in `--git-changes` mode too:
372
+
373
+ - **Secrets & credentials:** `.env`, `.env.*`, `*.pem`, `*.key`, `*.p12`, `*.pfx`, `*.jks`, `*.keystore`, `*.ppk`, SSH private keys (`id_rsa`, `id_ed25519`, …), `.npmrc`, `.netrc`, `.pypirc`, `.pgpass`, Docker auth config, `.aws/credentials`, service-account and `*credentials*.json` files, kubeconfigs
374
+ - **Infrastructure state:** `*.tfstate`, `.terraform/`
375
+ - **Version control & editors:** `.git/`, `.svn/`, `.hg/`, `.vscode/`, `.idea/`, swap files, `.DS_Store`
376
+ - **Logs, caches & temp files:** `*.log`, `logs/`, `.cache/`, `tmp/`, `*.tmp`, `*.bak`
377
+ - **Binaries & media:** executables, shared libraries, images, video, audio and archives
378
+ - **Project boilerplate:** `CHANGELOG`, `LICENSE`, `CONTRIBUTING`, `SECURITY.md`, `CODE_OF_CONDUCT.md`, GitHub issue/PR templates
379
+
380
+ To bring one back, name it explicitly with `contextzip include .env`, list it under `always_include` in the project config, or tick it in `contextzip config --ui`. `--exclude` and `.gitignore` can't bring them back, and naming a folder like `src/` doesn't pull in the secret files inside it.
381
+
382
+ **Secret files you include on purpose are always redacted.** If you include your `.env` so the AI can see which variables your app expects, every key and comment is kept but every value becomes `[REDACTED]`:
383
+
384
+ ```bash
385
+ # .env on disk # .env in the ZIP
386
+ DATABASE_URL=postgres://u:pw@db/app DATABASE_URL=[REDACTED]
387
+ export API_KEY="sk-live-…" # prod export API_KEY="[REDACTED]" # prod
388
+ ```
389
+
390
+ Other secret files (private keys, credential files) get a secret-pattern scan. Binary ones like `.p12` can't be redacted, so they're left out. All of this happens whatever your other settings say.
391
+
392
+ For extra safety, set `limits.redact_secrets: true` to also mask API keys, tokens, JWTs and private-key blocks hardcoded inside ordinary files that get included. Every run's report lists what was redacted.
393
+
394
+ > **Tip:** before sharing a sensitive project, run `contextzip --dry-run --verbose` to see exactly what will go into the ZIP.
395
+
396
+ ## Where files go
397
+
398
+ contextzip keeps everything in a `.contextzip/` folder at your git root (change this with `contextzip config --set-workspace`):
399
+
400
+ ```text
401
+ .contextzip/
402
+ ├── output/
403
+ │ ├── codebase/ codebase.zip + manifest + report (contextzip)
404
+ │ ├── git-changes/ changes.zip + manifest + report (--git-changes)
405
+ │ ├── prompt/ vibe.zip + manifest + report (--prompt)
406
+ │ └── watch/ debug-context.zip (contextzip watch)
407
+ ├── snapshots/ numbered copies of what you sent (contextzip snapshots)
408
+ ├── inbox/ drop AI-returned ZIPs here for apply-zip
409
+ └── config.json project config (optional)
410
+ ```
411
+
412
+ Old outputs are cleaned up automatically: `output/` keeps the latest ZIP per mode (`cleanup`), and `snapshots/` keeps the newest 10 or anything under 14 days old (`snapshots`) — never one a reply in the inbox is waiting on.
413
+
414
+ ## Python API
415
+
416
+ contextzip is also a library. The functions behave like the CLI but return plain Python objects and raise exceptions instead of printing.
417
+
418
+ ```python
419
+ from contextzip import get_files, get_git_changes, create_zip, apply_zip, detect_ecosystem, fetch_remote
420
+
421
+ # All project files, filtered by .gitignore and the built-in rules
422
+ collection = get_files(include=["src/"], exclude=["*.log"])
423
+ for path in collection.files: # plain pathlib.Path objects
424
+ print(path)
425
+
426
+ # Only git-changed files, zipped
427
+ changes = get_git_changes()
428
+ pkg = create_zip(changes, output="/tmp/changes.zip")
429
+ print(f"Packed {pkg.file_count} files → {pkg.zip_path}")
430
+
431
+ # What stack is this?
432
+ print(detect_ecosystem("."))
433
+
434
+ # A GitHub repository, without cloning it
435
+ repo = fetch_remote("github.com/pallets/click")
436
+ pkg = create_zip(get_files(repo.project_dir), output=repo.zip_path)
437
+ ```
438
+
439
+ | Function | Returns |
440
+ |---|---|
441
+ | `get_files(path=None, *, include=None, exclude=None, …)` | `FileCollection` of all project files after filtering |
442
+ | `get_git_changes(path=None, *, use_project_config=True)` | `FileCollection` of staged, modified and untracked files |
443
+ | `create_zip(collection, output=…)` | `PackageResult` with the ZIP path, file count and sizes |
444
+ | `apply_zip(zip_path=None, …)` | `ApplyResult` describing what was written |
445
+ | `detect_ecosystem(path=None)` | Detected ecosystem information |
446
+ | `fetch_remote(target, ref=None)` | `FetchedRemote`: a GitHub repo unpacked into the cache (`project_dir`, `sha`, `zip_path`) |
447
+ | `web.run(args, cwd=None)` | Any CLI command's `--json` result as a dict, without printing or prompting (used in the browser via Pyodide, and on servers) |
448
+
449
+ All exceptions inherit from `ContextzipError`: `NotARepositoryError`, `GitNotFoundError`, `GitCommandError`, `NoFilesError`, `ZipNotFoundError` and `RemoteFetchError`.
450
+
451
+ For full signatures, see [contextzipcli.com/cli#python-api](https://www.contextzipcli.com/cli#python-api).
452
+
453
+ ## Privacy & security
454
+
455
+ - **Local by default.** Packaging, `apply-zip`, `watch` and the config UI never make network requests.
456
+ - **Network use is opt-in and limited to three features:**
457
+ - `--prompt` sends file paths, sizes and your prompt to the Gemini API. File contents are never sent.
458
+ - Packaging a GitHub repo (`contextzip github.com/user/repo`) downloads it from GitHub. Your token, if any, is sent only to `api.github.com`.
459
+ - `contextzip update` asks PyPI for the latest version number.
460
+ - **No telemetry.** Nothing is collected or phoned home.
461
+ - **Manifests stay local.** `apply-zip` manifests are written next to the ZIP and never inside it.
462
+ - **Secrets are excluded or redacted.** See [What is always excluded](#what-is-always-excluded).
463
+
464
+ Found a vulnerability? Please follow [SECURITY.md](https://github.com/akadeepesh/contextzip/blob/main/SECURITY.md) and report it privately rather than in a public issue.
465
+
466
+ ## Platform support
467
+
468
+ | | Windows | macOS | Linux |
469
+ |---|---|---|---|
470
+ | Packaging, `apply-zip`, config | ✅ | ✅ | ✅ |
471
+ | ZIP copied to clipboard as a file | ✅ native (`CF_HDROP`) | ✅ via Finder | ✅ built-in X11 owner (works under XWayland), or `wl-copy` / `xclip` |
472
+ | `contextzip watch` | ✅ (best in Windows Terminal / VS Code) | ✅ | ✅ |
473
+ | Standalone build (no Python: npm, Homebrew, Scoop, download) | ✅ x64 | ✅ Apple Silicon and Intel | ✅ x64 and arm64, glibc 2.35+ |
474
+
475
+ If the clipboard can't be used, contextzip opens the output folder with the ZIP selected and tells you why. Use `--no-clipboard` to skip this step entirely.
476
+
477
+ ## Contributing
478
+
479
+ Contributions are welcome, especially **new framework rule sets** and edge-case fixes. Not up for writing code? [Request a feature](https://www.contextzipcli.com/request-feature) or [request your language](https://www.contextzipcli.com/request-language). Both turn into GitHub issues ranked by 👍. To set up a local copy:
480
+
481
+ ```bash
482
+ git clone https://github.com/akadeepesh/contextzip
483
+ cd contextzip
484
+ python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
485
+ pip install -e .
486
+ contextzip --version
487
+ ```
488
+
489
+ Adding a new language takes three small steps: a `PATTERNS` list in `contextzip/rules/`, one registry entry and one detection rule. [CONTRIBUTING.md](https://github.com/akadeepesh/contextzip/blob/main/CONTRIBUTING.md) walks through it, along with PR conventions. Please open an issue before starting a large PR.
490
+
491
+ ## License
492
+
493
+ [MIT](https://github.com/akadeepesh/contextzip/blob/main/LICENSE) © Deepesh