lgit-cli 3.7.0__py3-none-any.whl

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 (54) hide show
  1. lgit/__init__.py +75 -0
  2. lgit/__main__.py +8 -0
  3. lgit/analysis.py +326 -0
  4. lgit/api.py +1077 -0
  5. lgit/cache.py +338 -0
  6. lgit/changelog.py +523 -0
  7. lgit/cli.py +1104 -0
  8. lgit/compose.py +2110 -0
  9. lgit/config.py +437 -0
  10. lgit/diffing.py +384 -0
  11. lgit/errors.py +137 -0
  12. lgit/git.py +852 -0
  13. lgit/map_reduce.py +508 -0
  14. lgit/markdown_output.py +709 -0
  15. lgit/models.py +924 -0
  16. lgit/normalization.py +411 -0
  17. lgit/patch.py +784 -0
  18. lgit/profile.py +426 -0
  19. lgit/py.typed +0 -0
  20. lgit/repo.py +287 -0
  21. lgit/resources/__init__.py +1 -0
  22. lgit/resources/commit_types.json +242 -0
  23. lgit/resources/prompts/analysis/default.md +237 -0
  24. lgit/resources/prompts/analysis/markdown.md +112 -0
  25. lgit/resources/prompts/changelog/default.md +89 -0
  26. lgit/resources/prompts/changelog/markdown.md +60 -0
  27. lgit/resources/prompts/compose-bind/default.md +40 -0
  28. lgit/resources/prompts/compose-bind/markdown.md +41 -0
  29. lgit/resources/prompts/compose-intent/default.md +63 -0
  30. lgit/resources/prompts/compose-intent/markdown.md +59 -0
  31. lgit/resources/prompts/fast/default.md +46 -0
  32. lgit/resources/prompts/fast/markdown.md +51 -0
  33. lgit/resources/prompts/map/default.md +67 -0
  34. lgit/resources/prompts/map/markdown.md +63 -0
  35. lgit/resources/prompts/reduce/default.md +81 -0
  36. lgit/resources/prompts/reduce/markdown.md +68 -0
  37. lgit/resources/prompts/summary/default.md +74 -0
  38. lgit/resources/prompts/summary/markdown.md +77 -0
  39. lgit/resources/validation_data.json +1 -0
  40. lgit/rewrite.py +392 -0
  41. lgit/style.py +295 -0
  42. lgit/templates.py +385 -0
  43. lgit/testing/__init__.py +62 -0
  44. lgit/testing/compare.py +57 -0
  45. lgit/testing/fixture.py +386 -0
  46. lgit/testing/report.py +201 -0
  47. lgit/testing/runner.py +256 -0
  48. lgit/tokens.py +90 -0
  49. lgit/validation.py +545 -0
  50. lgit_cli-3.7.0.dist-info/METADATA +288 -0
  51. lgit_cli-3.7.0.dist-info/RECORD +54 -0
  52. lgit_cli-3.7.0.dist-info/WHEEL +4 -0
  53. lgit_cli-3.7.0.dist-info/entry_points.txt +2 -0
  54. lgit_cli-3.7.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,288 @@
1
+ Metadata-Version: 2.4
2
+ Name: lgit-cli
3
+ Version: 3.7.0
4
+ Summary: AI-powered git commit message generator using Claude and other LLMs via OpenAI-compatible APIs
5
+ Project-URL: Homepage, https://github.com/can1357/llm-git
6
+ Project-URL: Repository, https://github.com/can1357/llm-git
7
+ Project-URL: Documentation, https://github.com/can1357/llm-git
8
+ Project-URL: Issues, https://github.com/can1357/llm-git/issues
9
+ Author-email: can1357 <me@can.ac>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: ai,claude,commit,git,llm
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Software Development :: Version Control :: Git
18
+ Classifier: Topic :: Utilities
19
+ Requires-Python: >=3.14
20
+ Requires-Dist: blake3
21
+ Requires-Dist: httpx
22
+ Requires-Dist: jinja2
23
+ Description-Content-Type: text/markdown
24
+
25
+ <p align="center">
26
+ <img src="https://raw.githubusercontent.com/can1357/llm-git/main/assets/banner.png" alt="lgit">
27
+ </p>
28
+
29
+ <p align="center">
30
+ <strong>LLM-powered git commit message generator</strong>
31
+ </p>
32
+
33
+ <p align="center">
34
+ <a href="https://github.com/can1357/llm-git/actions"><img src="https://img.shields.io/github/actions/workflow/status/can1357/llm-git/ci.yml?style=flat&colorA=222222&colorB=3FB950" alt="CI"></a>
35
+ <a href="https://pypi.org/project/llm-git/"><img src="https://img.shields.io/pypi/v/llm-git?style=flat&colorA=222222&colorB=3FB950" alt="PyPI"></a>
36
+ <a href="https://github.com/can1357/llm-git/blob/main/LICENSE"><img src="https://img.shields.io/github/license/can1357/llm-git?style=flat&colorA=222222&colorB=58A6FF" alt="License"></a>
37
+ <a href="https://www.python.org"><img src="https://img.shields.io/badge/Python-3.14%2B-3FB950?style=flat&colorA=222222&logo=python&logoColor=white" alt="Python"></a>
38
+ </p>
39
+
40
+ <p align="center">
41
+ Generates <a href="https://www.conventionalcommits.org">conventional commits</a> from git diffs using Claude AI or any OpenAI-compatible API.<br>
42
+ Automatic changelog maintenance, multi-commit composition, and full history rewriting.
43
+ </p>
44
+
45
+ ---
46
+
47
+ ## Features
48
+
49
+ - **Conventional commits** — Generates properly formatted commit messages with type, scope, and past-tense summary (≤72 chars)
50
+ - **Automatic changelogs** — Maintains `CHANGELOG.md` following [Keep a Changelog](https://keepachangelog.com) format with monorepo support
51
+ - **Compose mode** — Splits large staged changes into multiple logical atomic commits
52
+ - **Rewrite mode** — Converts entire git history to conventional commits (with automatic backup)
53
+ - **Map-reduce analysis** — Parallel per-file analysis for large commits without truncation
54
+ - **Any LLM provider** — Works with Anthropic, OpenAI, OpenRouter, or any OpenAI-compatible API
55
+
56
+ ## Quick Start
57
+
58
+ ```bash
59
+ # Install
60
+ uv tool install llm-git
61
+
62
+ # Configure (pick one)
63
+ export LLM_GIT_API_KEY=your_anthropic_key # Direct Anthropic
64
+ export LLM_GIT_API_URL=https://openrouter.ai/api/v1 # OpenRouter
65
+ litellm --port 4000 # Local proxy (default)
66
+
67
+ # Use
68
+ git add .
69
+ lgit # Analyze, update changelog, commit
70
+ lgit --dry-run # Preview without committing
71
+ lgit --compose # Split into multiple commits
72
+ ```
73
+
74
+ ## Usage
75
+
76
+ ### Basic Commands
77
+
78
+ ```bash
79
+ lgit # Analyze staged changes and commit
80
+ lgit --dry-run # Preview message without committing
81
+ lgit --copy # Copy message to clipboard
82
+ lgit -p # Commit and push
83
+ lgit -S # GPG sign the commit
84
+ lgit -s # Add Signed-off-by trailer
85
+ lgit --amend # Amend the previous commit
86
+ lgit > msg.txt # Save raw message to file (auto-detected pipe mode)
87
+ lgit --dry-run | git commit -F - # Generate message and commit with custom git flags
88
+
89
+ # Modes
90
+ lgit --mode=unstaged # Preview unstaged changes (no commit)
91
+ lgit --mode=commit --target=HEAD~1 # Analyze a specific commit
92
+
93
+ # Models
94
+ lgit -m opus # Use Opus for analysis (more capable)
95
+ lgit -m sonnet # Use Sonnet (default)
96
+
97
+ # Context
98
+ lgit Fixed regression from PR #123 # Add context via trailing text
99
+ lgit --fixes 123 456 # Add "Fixes #123, #456" to body
100
+ lgit --breaking # Mark as breaking change
101
+ ```
102
+
103
+ ### Compose Mode
104
+
105
+ Split staged changes into multiple logical commits:
106
+
107
+ ```bash
108
+ lgit --compose # Propose and create atomic commits
109
+ lgit --compose --compose-preview # Preview splits without committing
110
+ lgit --compose --compose-max-commits 5
111
+ lgit --compose --compose-test-after-each
112
+ ```
113
+
114
+ ### Rewrite Mode
115
+
116
+ Convert repository history to conventional commits:
117
+
118
+ ```bash
119
+ lgit --rewrite # Rewrite full history (creates backup)
120
+ lgit --rewrite --rewrite-preview 10 # Preview first 10 commits
121
+ lgit --rewrite --rewrite-dry-run # Show all changes without applying
122
+ lgit --rewrite --rewrite-start main~50 # Rewrite last 50 commits only
123
+ lgit --rewrite --rewrite-parallel 20 # 20 concurrent API calls
124
+ ```
125
+
126
+ ### Profiling Trace
127
+
128
+ Write detailed tracing spans and HTTP timing events to a JSONL file:
129
+
130
+ ```bash
131
+ lgit --trace-output /tmp/lgit-profile.jsonl --dry-run
132
+ LLM_GIT_TRACE_FILE=/tmp/lgit-profile.jsonl lgit --compose
133
+ ```
134
+
135
+ Each span close event includes busy/idle timing from `tracing-subscriber`; API events also record TTFT, total response time, status, and response size.
136
+
137
+ ## Automatic Changelog
138
+
139
+ lgit automatically maintains `CHANGELOG.md` files when committing:
140
+
141
+ - **Auto-detection** — Finds all `CHANGELOG.md` files in your repository
142
+ - **Monorepo support** — Routes changes to the correct changelog based on file paths
143
+ - **Deduplication** — Skips entries semantically similar to existing ones
144
+ - **Category mapping** — Maps commit types to sections (Added, Fixed, Changed, etc.)
145
+
146
+ ```
147
+ project/
148
+ ├── CHANGELOG.md ← covers: src/, docs/
149
+ ├── packages/
150
+ │ ├── core/
151
+ │ │ └── CHANGELOG.md ← covers: packages/core/**
152
+ │ └── cli/
153
+ │ └── CHANGELOG.md ← covers: packages/cli/**
154
+ ```
155
+
156
+ Disable with `--no-changelog` or `changelog_enabled = false` in config.
157
+
158
+ ## Configuration
159
+
160
+ Create `~/.config/llm-git/config.toml`:
161
+
162
+ ```toml
163
+ # API
164
+ api_base_url = "http://localhost:4000" # Default: LiteLLM proxy
165
+ api_key = "sk-..." # Or use LLM_GIT_API_KEY env var
166
+
167
+ # Model
168
+ analysis_model = "claude-sonnet-4.5" # Diff analysis / classification
169
+ summary_model = "claude-haiku-4-5" # Summary line generation
170
+
171
+ # Commit message limits
172
+ summary_guideline = 72 # Target length
173
+ summary_soft_limit = 96 # Triggers retry
174
+ summary_hard_limit = 128 # Absolute max
175
+
176
+ # Features
177
+ changelog_enabled = true
178
+ auto_fast_threshold_lines = 200 # Auto-use fast mode for small diffs; 0 disables
179
+ map_reduce_enabled = true # Parallel analysis for large commits
180
+ disable_git_background_features = true # Disables fsmonitor/untrackedCache for lgit subprocesses
181
+
182
+ # Commit signing
183
+ gpg_sign = false # GPG sign commits by default (-S)
184
+ signoff = false # Add Signed-off-by trailer by default (-s)
185
+ ```
186
+
187
+ ### Provider Examples
188
+
189
+ **Anthropic Direct:**
190
+ ```toml
191
+ api_base_url = "https://api.anthropic.com/v1"
192
+ api_key = "sk-ant-..."
193
+ ```
194
+
195
+ **OpenRouter:**
196
+ ```toml
197
+ api_base_url = "https://openrouter.ai/api/v1"
198
+ api_key = "sk-or-..."
199
+ analysis_model = "anthropic/claude-sonnet-4.5"
200
+ summary_model = "anthropic/claude-haiku-4-5"
201
+ ```
202
+
203
+ **OpenAI:**
204
+ ```toml
205
+ api_base_url = "https://api.openai.com/v1"
206
+ api_key = "sk-..."
207
+ analysis_model = "gpt-4o"
208
+ summary_model = "gpt-4o-mini"
209
+ ```
210
+
211
+ The client uses tool calling for all models, falling back to parsing JSON content from the model response when a provider ignores `tool_choice`. This works across OpenRouter, LiteLLM, Anthropic, and OpenAI endpoints.
212
+
213
+ ### Commit Types
214
+
215
+ Customize commit type classification:
216
+
217
+ ```toml
218
+ [types.feat]
219
+ description = "New public API or user-observable behavior change"
220
+ diff_indicators = ["pub fn", "pub struct", "export function"]
221
+
222
+ [types.fix]
223
+ description = "Fixes incorrect behavior"
224
+ diff_indicators = ["unwrap() → ?", "bounds check", "error handling"]
225
+
226
+ [types.refactor]
227
+ description = "Internal restructuring with unchanged behavior"
228
+ hint = "If behavior changes, use feat instead."
229
+ ```
230
+
231
+ ### Changelog Categories
232
+
233
+ ```toml
234
+ [[categories]]
235
+ name = "Breaking"
236
+ header = "Breaking Changes"
237
+ match.body_contains = ["breaking", "incompatible"]
238
+
239
+ [[categories]]
240
+ name = "Added"
241
+ match.types = ["feat"]
242
+
243
+ [[categories]]
244
+ name = "Fixed"
245
+ match.types = ["fix"]
246
+
247
+ [[categories]]
248
+ name = "Changed"
249
+ default = true
250
+ ```
251
+
252
+ ## Environment Variables
253
+
254
+ | Variable | Description | Default |
255
+ |----------|-------------|---------|
256
+ | `LLM_GIT_API_URL` | API endpoint | `http://localhost:4000` |
257
+ | `LLM_GIT_API_KEY` | API key | none |
258
+ | `LLM_GIT_CONFIG` | Config file path | `~/.config/llm-git/config.toml` |
259
+ | `LLM_GIT_VERBOSE` | Debug output | `false` |
260
+ | `LLM_GIT_TRACE_FILE` | JSONL profiling trace output path | none |
261
+
262
+ ## Installation
263
+
264
+ ### From PyPI
265
+
266
+ ```bash
267
+ uv tool install llm-git # recommended
268
+ pipx install llm-git # or
269
+ pip install llm-git
270
+ ```
271
+
272
+ ### From source
273
+
274
+ ```bash
275
+ git clone https://github.com/can1357/llm-git.git
276
+ cd llm-git
277
+ uv tool install .
278
+ ```
279
+
280
+ ### Prerequisites
281
+
282
+ - Python 3.14+
283
+ - Git
284
+ - API access (Anthropic, OpenAI, OpenRouter, or local LiteLLM proxy)
285
+
286
+ ## License
287
+
288
+ MIT
@@ -0,0 +1,54 @@
1
+ lgit/__init__.py,sha256=_7jJNTyZZre2Ce8oWaihORAX-2uysmkN6jxTIpaD7UQ,1766
2
+ lgit/__main__.py,sha256=VbaRO8-0ehWv7zA27BpyHYWTQVvt5M-aG5HnWr7ws0U,165
3
+ lgit/analysis.py,sha256=O-y9F9KTd2mjdYMEGShKS3Gjcm-KHC465FBnYyQsSlo,11115
4
+ lgit/api.py,sha256=LneFOGGFm4_8vECfnwlldb6YTzRuoq_BuR3h0WQqI1I,42899
5
+ lgit/cache.py,sha256=nSmQPVCYx1IJjSHeK6N7RrSvOHrTLHHOBrqvr3cLcxg,11064
6
+ lgit/changelog.py,sha256=prnmXTzmk1UF92OYPdRXxswKVU0Ppc8DyhZDXlAWeZg,18573
7
+ lgit/cli.py,sha256=zuKuKKRz3zSm9jg-FGBbspb9R_p8e7VUmgcDcDyPG5A,45309
8
+ lgit/compose.py,sha256=AI5Q5hRR95kiszUUK5rvfHg-J4rZS7mygpWJbNChQWE,82560
9
+ lgit/config.py,sha256=Rwca_jxllmthdubi8evM21yyJrfybrtsfrINkwDjQF8,14259
10
+ lgit/diffing.py,sha256=rak6qhGPZvs5tTitav4O6FmTEDdT2Coxp2hWC_OIK94,12882
11
+ lgit/errors.py,sha256=KJXkXDfy0Qy3RfqoeMrvnolIokhGnv6fVVGXByz7fFg,3266
12
+ lgit/git.py,sha256=u3mHYCRtokJnPQqgiJ6lA_p5VHSlyZCJj5ZCfGIWG90,29462
13
+ lgit/map_reduce.py,sha256=xz4wDrHrtXYhYuH6e7Ys0OdhDczem41cu-lzj5bH6cs,19862
14
+ lgit/markdown_output.py,sha256=4VW_omDZDtOLuKOqcV2XWqzt_xRYSQmBymxnx63cULI,26340
15
+ lgit/models.py,sha256=H_inXOZEDIagDyXXd6TgmWh7D10RSHZATZX8h45E8dA,29873
16
+ lgit/normalization.py,sha256=ki17fHAlQI24gB4LwcxeBxxWx7mMAOrz4--0TPhQN3o,11869
17
+ lgit/patch.py,sha256=N9zXWgb9CXa9irssZKCf1bJkGO38nskRvdHFKNoX-Bs,29506
18
+ lgit/profile.py,sha256=QAR5jEuS6za6iNjDapRcSjlSuREZDlYAB1gpPQOq1G0,12977
19
+ lgit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ lgit/repo.py,sha256=EFV-_8O5g19v5Q3W9BkaGebddri3qSxwbl2MwqWO9Sk,8924
21
+ lgit/rewrite.py,sha256=9MMJlDzLMrRtLXbLSd_JhM3lHwYsWxhHfzcWcsWg0Ks,13518
22
+ lgit/style.py,sha256=IY7B6nfxuX85mIfnOVs4vGYzItRuoKH2lXC_4AdEvT8,7502
23
+ lgit/templates.py,sha256=Qd4rMEtTnAFuoU_um-HltmFiUTATySQ8Dj4zcLzkTyQ,12930
24
+ lgit/tokens.py,sha256=OXy6H-ooK6niZ1cNnHBN7Hhe5j1OJZzQrelNhKG2b7c,3123
25
+ lgit/validation.py,sha256=v0eV5YltBDM0aBDiqaCvdfbw3d1GALdMuDbHQ2GCNDE,18719
26
+ lgit/resources/__init__.py,sha256=w6eXZjQeAp_h24IJu_GhNIZelcSMuM3qk8GOmWLQPaQ,53
27
+ lgit/resources/commit_types.json,sha256=IPtUig1U8UAIFnfMVaszQFI_LOZIiaZ2yyE20J1FG1E,11900
28
+ lgit/resources/validation_data.json,sha256=PJ1Iocq2qPKvh-zC1V_WyPrlDFFsXyTdnIxa2bokK5I,14634
29
+ lgit/resources/prompts/analysis/default.md,sha256=Bna4Q4ego2EWiPmZ-ptUxVbjefMai41J0Zw95Ee3ONs,7154
30
+ lgit/resources/prompts/analysis/markdown.md,sha256=71iQx--s9BDlgeAAjtqdOrg5Qo4HAyfAUsxzP0SHveI,3689
31
+ lgit/resources/prompts/changelog/default.md,sha256=oWbGQvrMWID-t4mVIL8pyCrleIC5S4lOmihFHZ-Zk8g,2958
32
+ lgit/resources/prompts/changelog/markdown.md,sha256=3L4FfGt7n--J1P2QpwrNi8YeF10lvHhnpsxhTAQiMqo,2040
33
+ lgit/resources/prompts/compose-bind/default.md,sha256=mLnSXoawvqOxxKYRLTRTTLDEsdnNktlKsuSQenzb_5I,1425
34
+ lgit/resources/prompts/compose-bind/markdown.md,sha256=DEiDJjq7DdWFSov94djHPnWAwq0rjj9kNZjEq4BbFZo,836
35
+ lgit/resources/prompts/compose-intent/default.md,sha256=aeYNjgOhzYGsCGjqARGbkj4ZBT67kXPdULbo6xz_NmU,1976
36
+ lgit/resources/prompts/compose-intent/markdown.md,sha256=0FA7lq6OkmyUrsHg5H26Yme0FiZJFgRHCN7plmgvH0E,1489
37
+ lgit/resources/prompts/fast/default.md,sha256=1TgCxO5CmzG8w7IDlp52Md3i4vj6eXSgOpkp5_glPGA,2173
38
+ lgit/resources/prompts/fast/markdown.md,sha256=8SBaCmaWHebTcNSgeyzQZI-vb4FU3BEuea1DejuoHrg,2213
39
+ lgit/resources/prompts/map/default.md,sha256=fpRVRVbqJegPHB-rig7xh_gouknlC8_1FzwPslRBAjc,2043
40
+ lgit/resources/prompts/map/markdown.md,sha256=d_gBZiVtIq1uUQBqOC5ELXTqmxJAdPOLJgEkVTxJw18,2005
41
+ lgit/resources/prompts/reduce/default.md,sha256=Wwx8U4pxglo5XCR-YhPry1rf_vp55g7Hu9Uwxozdhus,3377
42
+ lgit/resources/prompts/reduce/markdown.md,sha256=ooOA4U3IAsEPUBDNfs9dAnomn2vDzEj44JGhuXXzA3g,2568
43
+ lgit/resources/prompts/summary/default.md,sha256=yzqzEMH83vVKEZqjH_Lkmj59n4VuP7puFxP95OBnEKw,3077
44
+ lgit/resources/prompts/summary/markdown.md,sha256=1piWMzRc4lrqEr6zxBtALynMb3KqXzVVhS_rg1pnA5I,3142
45
+ lgit/testing/__init__.py,sha256=_NQxrUIOQIQLKUP6Zerh2oNoJ7GVLAiWKFj9K2Vkhls,1373
46
+ lgit/testing/compare.py,sha256=jRY98uLclVPyQ7e1TMqFVz2cjUi6kwwn2dkQyR_xsgY,1834
47
+ lgit/testing/fixture.py,sha256=Hl8kTPuNg_I5PMTef0SvLBa4TnAAlB7v8JUYQIb9ggo,13544
48
+ lgit/testing/report.py,sha256=wb7YnP_lsYwsg5OIFtsIC1bMHtK42Mttul_zQcwRNpk,9036
49
+ lgit/testing/runner.py,sha256=yczDXUHYsN2KyTJtIQeiDuYGgQZZfHn6QT70gpsxvEg,9321
50
+ lgit_cli-3.7.0.dist-info/METADATA,sha256=-uPYM2Y5VagdKZ3KIKkhT_WRgWQ_8ls3kaR4TzLDX6s,9615
51
+ lgit_cli-3.7.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
52
+ lgit_cli-3.7.0.dist-info/entry_points.txt,sha256=CUSsokc0V3oVHQ2Z1ocL09wV7Krhm0SSfLZpnRMBdA0,39
53
+ lgit_cli-3.7.0.dist-info/licenses/LICENSE,sha256=6dqVzjngLuIcUMd4wWLXPLpv-Pi8gySZAEE3hSN5iKw,1076
54
+ lgit_cli-3.7.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.30.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ lgit = lgit.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 can1357 <me@can.ac>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.