gitwise-cli 0.24.2__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.
- gitwise/__init__.py +11 -0
- gitwise/__main__.py +113 -0
- gitwise/_cli_completions.py +88 -0
- gitwise/_cli_dispatch.py +469 -0
- gitwise/_cli_introspection.py +275 -0
- gitwise/_cli_parser.py +345 -0
- gitwise/_cli_setup_agents.py +439 -0
- gitwise/_i18n_data.json +1934 -0
- gitwise/_paths.py +22 -0
- gitwise/_runtime_config.py +246 -0
- gitwise/audit.py +338 -0
- gitwise/branches.py +183 -0
- gitwise/clean.py +197 -0
- gitwise/commit.py +142 -0
- gitwise/conflicts.py +112 -0
- gitwise/context.py +163 -0
- gitwise/design.py +383 -0
- gitwise/diff.py +309 -0
- gitwise/doctor.py +116 -0
- gitwise/git.py +254 -0
- gitwise/health.py +345 -0
- gitwise/i18n.py +99 -0
- gitwise/log.py +329 -0
- gitwise/merge.py +193 -0
- gitwise/optimize.py +212 -0
- gitwise/output.py +652 -0
- gitwise/pick.py +102 -0
- gitwise/pr.py +543 -0
- gitwise/py.typed +0 -0
- gitwise/schema.py +49 -0
- gitwise/setup.py +551 -0
- gitwise/setup_agents/__init__.py +36 -0
- gitwise/setup_agents/adapters/__init__.py +17 -0
- gitwise/setup_agents/adapters/aider.py +5 -0
- gitwise/setup_agents/adapters/base.py +5 -0
- gitwise/setup_agents/adapters/codex.py +5 -0
- gitwise/setup_agents/adapters/continue_adapter.py +5 -0
- gitwise/setup_agents/adapters/cursor.py +5 -0
- gitwise/setup_agents/adapters/opencode.py +5 -0
- gitwise/setup_agents/adapters/pi.py +5 -0
- gitwise/setup_agents/exec.py +449 -0
- gitwise/setup_agents/format.py +164 -0
- gitwise/setup_agents/plan.py +254 -0
- gitwise/setup_agents/plan_gitfiles.py +167 -0
- gitwise/setup_agents/plan_skills.py +256 -0
- gitwise/setup_agents/providers/__init__.py +96 -0
- gitwise/setup_agents/providers/aider.py +11 -0
- gitwise/setup_agents/providers/base.py +79 -0
- gitwise/setup_agents/providers/claude.py +408 -0
- gitwise/setup_agents/providers/codex.py +11 -0
- gitwise/setup_agents/providers/continue_adapter.py +11 -0
- gitwise/setup_agents/providers/cursor.py +11 -0
- gitwise/setup_agents/providers/opencode.py +11 -0
- gitwise/setup_agents/providers/pi.py +11 -0
- gitwise/setup_agents/state.py +141 -0
- gitwise/setup_agents/types.py +48 -0
- gitwise/share/agents/skills/git-audit/SKILL.md +25 -0
- gitwise/share/agents/skills/git-clean/SKILL.md +22 -0
- gitwise/share/agents/skills/git-optimize/SKILL.md +21 -0
- gitwise/share/aider/CONVENTIONS.md.template +8 -0
- gitwise/share/aider/aider.conf.yml.template +4 -0
- gitwise/share/claude/CLAUDE.md.template +9 -0
- gitwise/share/claude/rules/gitwise.md +16 -0
- gitwise/share/claude/settings.json.template +47 -0
- gitwise/share/claude/skills/git-audit/SKILL.md +25 -0
- gitwise/share/claude/skills/git-clean/SKILL.md +22 -0
- gitwise/share/claude/skills/git-optimize/SKILL.md +21 -0
- gitwise/share/codex/agents/gitwise.toml.template +18 -0
- gitwise/share/continue/rules/gitwise.md.template +14 -0
- gitwise/share/cursor/rules/gitwise.mdc.template +16 -0
- gitwise/share/git-config-modern.txt +48 -0
- gitwise/share/hooks/commit-msg +22 -0
- gitwise/share/hooks/pre-commit +19 -0
- gitwise/share/opencode/agents/gitwise.md.template +14 -0
- gitwise/share/pi/skills/gitwise.md.template +14 -0
- gitwise/share/schemas/v1/input/audit.json +40 -0
- gitwise/share/schemas/v1/input/branches.json +51 -0
- gitwise/share/schemas/v1/input/clean.json +52 -0
- gitwise/share/schemas/v1/input/commands.json +36 -0
- gitwise/share/schemas/v1/input/commit.json +63 -0
- gitwise/share/schemas/v1/input/completions.json +51 -0
- gitwise/share/schemas/v1/input/conflicts.json +46 -0
- gitwise/share/schemas/v1/input/context.json +36 -0
- gitwise/share/schemas/v1/input/diff.json +56 -0
- gitwise/share/schemas/v1/input/doctor.json +36 -0
- gitwise/share/schemas/v1/input/health.json +36 -0
- gitwise/share/schemas/v1/input/log.json +71 -0
- gitwise/share/schemas/v1/input/merge.json +63 -0
- gitwise/share/schemas/v1/input/optimize.json +44 -0
- gitwise/share/schemas/v1/input/pick.json +63 -0
- gitwise/share/schemas/v1/input/pr.json +51 -0
- gitwise/share/schemas/v1/input/schema.json +48 -0
- gitwise/share/schemas/v1/input/setup-agents.json +108 -0
- gitwise/share/schemas/v1/input/setup.json +55 -0
- gitwise/share/schemas/v1/input/show.json +46 -0
- gitwise/share/schemas/v1/input/snapshot.json +36 -0
- gitwise/share/schemas/v1/input/stash.json +68 -0
- gitwise/share/schemas/v1/input/status.json +36 -0
- gitwise/share/schemas/v1/input/suggest.json +36 -0
- gitwise/share/schemas/v1/input/summarize.json +44 -0
- gitwise/share/schemas/v1/input/sync.json +55 -0
- gitwise/share/schemas/v1/input/tag.json +73 -0
- gitwise/share/schemas/v1/input/undo.json +60 -0
- gitwise/share/schemas/v1/input/update.json +40 -0
- gitwise/share/schemas/v1/input/worktree.json +50 -0
- gitwise/show.py +118 -0
- gitwise/snapshot.py +110 -0
- gitwise/stash.py +188 -0
- gitwise/status.py +93 -0
- gitwise/suggest.py +148 -0
- gitwise/summarize.py +202 -0
- gitwise/sync.py +257 -0
- gitwise/tag.py +252 -0
- gitwise/undo.py +145 -0
- gitwise/update.py +42 -0
- gitwise/utils/__init__.py +1 -0
- gitwise/utils/git_output.py +51 -0
- gitwise/utils/json_envelope.py +58 -0
- gitwise/utils/parsing.py +34 -0
- gitwise/worktree.py +182 -0
- gitwise_cli-0.24.2.dist-info/METADATA +151 -0
- gitwise_cli-0.24.2.dist-info/RECORD +125 -0
- gitwise_cli-0.24.2.dist-info/WHEEL +4 -0
- gitwise_cli-0.24.2.dist-info/entry_points.txt +2 -0
- gitwise_cli-0.24.2.dist-info/licenses/LICENSE +21 -0
gitwise/worktree.py
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Worktree helpers for multi-agent Claude Code workflows."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from .git import require_root, validate_branch_name
|
|
7
|
+
from .git import run as git_run
|
|
8
|
+
from .i18n import t
|
|
9
|
+
from .output import (
|
|
10
|
+
error,
|
|
11
|
+
info,
|
|
12
|
+
ok,
|
|
13
|
+
print_bracket,
|
|
14
|
+
print_dim,
|
|
15
|
+
print_header,
|
|
16
|
+
print_json,
|
|
17
|
+
)
|
|
18
|
+
from .utils.json_envelope import ok_envelope, passthrough_envelope
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _list_worktrees(cwd: Path) -> list[dict]:
|
|
22
|
+
r = git_run(["worktree", "list", "--porcelain"], cwd=cwd, check=False)
|
|
23
|
+
if r.returncode != 0:
|
|
24
|
+
return []
|
|
25
|
+
worktrees: list[dict] = []
|
|
26
|
+
current: dict = {}
|
|
27
|
+
for line in r.stdout.splitlines():
|
|
28
|
+
if line.startswith("worktree "):
|
|
29
|
+
if current:
|
|
30
|
+
worktrees.append(current)
|
|
31
|
+
current = {
|
|
32
|
+
"path": line.removeprefix("worktree "),
|
|
33
|
+
"branch": None,
|
|
34
|
+
"locked": False,
|
|
35
|
+
"prunable": False,
|
|
36
|
+
}
|
|
37
|
+
elif line.startswith("branch refs/heads/"):
|
|
38
|
+
current["branch"] = line.removeprefix("branch refs/heads/")
|
|
39
|
+
elif line == "locked":
|
|
40
|
+
current["locked"] = True
|
|
41
|
+
elif line.startswith("prunable"):
|
|
42
|
+
current["prunable"] = True
|
|
43
|
+
if current:
|
|
44
|
+
worktrees.append(current)
|
|
45
|
+
return worktrees
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _find_orphaned(cwd: Path) -> list[dict]:
|
|
49
|
+
"""Worktrees registered in git but whose directory no longer exists."""
|
|
50
|
+
return [wt for wt in _list_worktrees(cwd) if not Path(wt["path"]).exists()]
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _worktree_create(branch: str, root: Path) -> tuple[int, str | None, dict]:
|
|
54
|
+
"""Core worktree creation logic. Returns (rc, path, error_or_data)."""
|
|
55
|
+
if branch.startswith("/") or branch.startswith("../") or "/../" in branch:
|
|
56
|
+
return 1, None, {"ok": False, "error": t("invalid_branch_name", name=branch)}
|
|
57
|
+
|
|
58
|
+
safe_name = re.sub(r"^\.+", "", branch.replace("/", "-"))
|
|
59
|
+
wt_path = root.parent / (safe_name or "worktree")
|
|
60
|
+
|
|
61
|
+
if not validate_branch_name(branch):
|
|
62
|
+
return 1, None, {"ok": False, "error": t("invalid_branch_name", name=branch)}
|
|
63
|
+
|
|
64
|
+
if wt_path.exists():
|
|
65
|
+
return 1, None, {"ok": False, "error": t("directory_exists", path=str(wt_path))}
|
|
66
|
+
|
|
67
|
+
branch_exists = (
|
|
68
|
+
git_run(
|
|
69
|
+
["rev-parse", "--verify", f"refs/heads/{branch}"],
|
|
70
|
+
cwd=root,
|
|
71
|
+
check=False,
|
|
72
|
+
).returncode
|
|
73
|
+
== 0
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if branch_exists:
|
|
77
|
+
r = git_run(["worktree", "add", "--", str(wt_path), branch], cwd=root, check=False)
|
|
78
|
+
else:
|
|
79
|
+
r = git_run(["worktree", "add", "-b", branch, "--", str(wt_path)], cwd=root, check=False)
|
|
80
|
+
|
|
81
|
+
if r.returncode != 0:
|
|
82
|
+
return 1, None, {"ok": False, "error": r.stderr.strip()}
|
|
83
|
+
|
|
84
|
+
return 0, str(wt_path), {"ok": True, "path": str(wt_path), "branch": branch}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _worktree_new(branch: str, root: Path) -> int:
|
|
88
|
+
rc, path, data = _worktree_create(branch, root)
|
|
89
|
+
if rc != 0:
|
|
90
|
+
error(data.get("error", t("worktree_failed", error="unknown")))
|
|
91
|
+
return rc
|
|
92
|
+
ok(t("worktree_created", path=path or ""))
|
|
93
|
+
print_header(t("worktree_branch_msg", branch=branch))
|
|
94
|
+
print_dim(t("worktree_to_use", path=path or ""))
|
|
95
|
+
return 0
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _worktree_new_json(branch: str, root: Path) -> tuple[int, dict]:
|
|
99
|
+
rc, _path, data = _worktree_create(branch, root)
|
|
100
|
+
return rc, data
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def _worktree_clean(cwd: Path, *, dry_run: bool = False, as_json: bool = False) -> int:
|
|
104
|
+
# git worktree prune removes stale admin files
|
|
105
|
+
prune_args = ["worktree", "prune"]
|
|
106
|
+
if dry_run:
|
|
107
|
+
prune_args.append("--dry-run")
|
|
108
|
+
prune_r = git_run(prune_args, cwd=cwd, check=False)
|
|
109
|
+
|
|
110
|
+
pruned_lines = prune_r.stdout.strip().splitlines() if prune_r.stdout.strip() else []
|
|
111
|
+
|
|
112
|
+
# Detect orphaned worktrees (missing directory)
|
|
113
|
+
orphaned = _find_orphaned(cwd)
|
|
114
|
+
|
|
115
|
+
if not orphaned and not pruned_lines:
|
|
116
|
+
if as_json:
|
|
117
|
+
print_json(ok_envelope(cleaned=0, orphaned=0, dry_run=dry_run))
|
|
118
|
+
else:
|
|
119
|
+
ok(t("no_orphaned_worktrees", suffix=" (dry-run)" if dry_run else ""))
|
|
120
|
+
return 0
|
|
121
|
+
|
|
122
|
+
if as_json:
|
|
123
|
+
print_json(
|
|
124
|
+
ok_envelope(
|
|
125
|
+
pruned=len(pruned_lines),
|
|
126
|
+
orphaned=len(orphaned),
|
|
127
|
+
orphaned_branches=[wt["branch"] for wt in orphaned],
|
|
128
|
+
dry_run=dry_run,
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
return 0
|
|
132
|
+
|
|
133
|
+
if pruned_lines:
|
|
134
|
+
print_bracket(t("worktrees_to_clean"))
|
|
135
|
+
for line in pruned_lines:
|
|
136
|
+
print_dim(f" {line}")
|
|
137
|
+
|
|
138
|
+
info(t("orphaned_worktrees", count=str(len(orphaned))))
|
|
139
|
+
for wt in orphaned:
|
|
140
|
+
print_bracket(wt["path"], t("branch_label", branch=wt["branch"] or t("unknown_branch")))
|
|
141
|
+
|
|
142
|
+
if dry_run:
|
|
143
|
+
print_dim(t("dry_run_no_clean"))
|
|
144
|
+
return 0
|
|
145
|
+
|
|
146
|
+
git_run(["worktree", "prune"], cwd=cwd, check=False)
|
|
147
|
+
ok(t("worktrees_cleaned", count=str(len(orphaned))))
|
|
148
|
+
return 0
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def run_worktree(
|
|
152
|
+
action: str | None,
|
|
153
|
+
branch: str | None,
|
|
154
|
+
*,
|
|
155
|
+
dry_run: bool = False,
|
|
156
|
+
as_json: bool = False,
|
|
157
|
+
) -> int:
|
|
158
|
+
root, err = require_root()
|
|
159
|
+
if err:
|
|
160
|
+
return err
|
|
161
|
+
if root is None:
|
|
162
|
+
return 1
|
|
163
|
+
|
|
164
|
+
if action == "new":
|
|
165
|
+
if not branch:
|
|
166
|
+
error(t("worktree_usage"))
|
|
167
|
+
return 1
|
|
168
|
+
if as_json:
|
|
169
|
+
rc, data = _worktree_new_json(branch, root)
|
|
170
|
+
if rc == 0:
|
|
171
|
+
print_json(ok_envelope(payload=data))
|
|
172
|
+
else:
|
|
173
|
+
print_json(passthrough_envelope(payload=data))
|
|
174
|
+
return rc
|
|
175
|
+
return _worktree_new(branch, root)
|
|
176
|
+
|
|
177
|
+
elif action == "clean":
|
|
178
|
+
return _worktree_clean(root, dry_run=dry_run, as_json=as_json)
|
|
179
|
+
|
|
180
|
+
else:
|
|
181
|
+
error(t("worktree_usage_full"))
|
|
182
|
+
return 1
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gitwise-cli
|
|
3
|
+
Version: 0.24.2
|
|
4
|
+
Summary: Python CLI for optimizing git workflows and Claude Code integration
|
|
5
|
+
Author-email: Deiner <drzioner@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: automation,claude-code,cli,developer-tools,git
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Operating System :: MacOS
|
|
14
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Requires-Dist: rich-argparse<2,>=1.8.0
|
|
26
|
+
Requires-Dist: rich<15,>=13.0
|
|
27
|
+
Requires-Dist: shtab<2,>=1.8.0
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# gitwise
|
|
31
|
+
|
|
32
|
+
[English](README.md) | [Español](README.es.md)
|
|
33
|
+
|
|
34
|
+
Python CLI for optimized Git workflows and coding agents integration.
|
|
35
|
+
|
|
36
|
+
[](https://github.com/drzioner/gitwise/actions/workflows/ci.yml)
|
|
37
|
+
[](https://codecov.io/gh/drzioner/gitwise)
|
|
38
|
+
[](https://github.com/drzioner/gitwise/releases)
|
|
39
|
+
[](https://opensource.org/licenses/MIT)
|
|
40
|
+
[](https://www.python.org/downloads/)
|
|
41
|
+
[](docs/README.md)
|
|
42
|
+
|
|
43
|
+
gitwise addresses three daily pain points:
|
|
44
|
+
|
|
45
|
+
1. AI context bloat from raw `git diff`
|
|
46
|
+
2. Slow repositories without modern Git maintenance settings
|
|
47
|
+
3. Unsafe commit flows that bypass GPG signing rules
|
|
48
|
+
|
|
49
|
+
## Requirements
|
|
50
|
+
|
|
51
|
+
- Python >= 3.10
|
|
52
|
+
- git >= 2.29
|
|
53
|
+
- macOS or Linux
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git clone https://github.com/drzioner/gitwise.git ~/.local/share/gitwise
|
|
59
|
+
bash ~/.local/share/gitwise/install.sh
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Update an existing installation:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
gitwise update
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Quick Start
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
gitwise doctor
|
|
72
|
+
gitwise setup --dry-run
|
|
73
|
+
gitwise setup-agents --local --dry-run
|
|
74
|
+
gitwise summarize
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Most Used Commands
|
|
78
|
+
|
|
79
|
+
| Command | Purpose |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `gitwise doctor` | Check Python, git, platform, optional tools |
|
|
82
|
+
| `gitwise setup` | Apply modern Git defaults safely |
|
|
83
|
+
| `gitwise setup-agents` | Install canonical agents layout + optional provider config |
|
|
84
|
+
| `gitwise audit` | Detect stale branches, graph/cache gaps, large blobs |
|
|
85
|
+
| `gitwise summarize` | Compact context for humans and AI |
|
|
86
|
+
| `gitwise diff` | Focused changed-file view (`--stat`, `--staged`, `--patch`) |
|
|
87
|
+
| `gitwise worktree` | Create and clean worktree-based branch setups |
|
|
88
|
+
| `gitwise status` | Enhanced status with staged/unstaged and ahead/behind |
|
|
89
|
+
| `gitwise commands --json` | List subcommands with aliases and metadata |
|
|
90
|
+
| `gitwise schema <command> --json` | Return versioned JSON Schema for command inputs |
|
|
91
|
+
| `gitwise completions <shell>` | Generate shell completion scripts (bash/zsh/fish) |
|
|
92
|
+
| `gitwise pr` | List/check/view PRs via GitHub CLI |
|
|
93
|
+
|
|
94
|
+
For all commands, examples, aliases, and JSON usage, see:
|
|
95
|
+
|
|
96
|
+
- [Command reference (English)](docs/reference/commands.md)
|
|
97
|
+
- [Referencia de comandos (Español)](docs/es/reference/commands.md)
|
|
98
|
+
|
|
99
|
+
## Documentation
|
|
100
|
+
|
|
101
|
+
- [Documentation index (English)](docs/README.md)
|
|
102
|
+
- [Indice de documentacion (Español)](docs/es/README.md)
|
|
103
|
+
- [Contributing guide](CONTRIBUTING.md)
|
|
104
|
+
- [Guia de contribucion](CONTRIBUTING.es.md)
|
|
105
|
+
- [Security policy](SECURITY.md)
|
|
106
|
+
- [Politica de seguridad](SECURITY.es.md)
|
|
107
|
+
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
108
|
+
- [Código de conducta](CODE_OF_CONDUCT.es.md)
|
|
109
|
+
- [Git conventions](CONVENTIONS.md)
|
|
110
|
+
- [Convenciones Git](CONVENTIONS.es.md)
|
|
111
|
+
|
|
112
|
+
## GPG and Safety Model
|
|
113
|
+
|
|
114
|
+
`setup` and `setup-agents` never modify `commit.gpgsign` or `user.signingkey`.
|
|
115
|
+
|
|
116
|
+
- Git layer: `setup` manages hooks safely (`--hooks-mode preserve|native|legacy|skip`) to validate signing key availability and conventional commits.
|
|
117
|
+
- Agent layer: deny-rules block `--no-gpg-sign`, `--no-verify`, and `-c commit.gpgsign=false`.
|
|
118
|
+
|
|
119
|
+
## Environment Variables
|
|
120
|
+
|
|
121
|
+
| Variable | Description |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `GITWISE_DEBUG=1` | Print each `git` subprocess command to stderr |
|
|
124
|
+
| `GITWISE_LOG_JSON=1` | Emit structured stderr logs as JSON lines |
|
|
125
|
+
| `GITWISE_JSON_PRETTY=1` | Pretty-print JSON output by default |
|
|
126
|
+
| `GITWISE_LANG=es` / `GITWISE_LANG=en` | Force output locale |
|
|
127
|
+
| `GITWISE_THEME=dark` / `GITWISE_THEME=light` / `GITWISE_THEME=auto` | Override color theme selection |
|
|
128
|
+
| `GITWISE_NO_COLOR=1` | Disable ANSI color output |
|
|
129
|
+
| `GITWISE_OUTPUT=agent` | Force machine-oriented output mode |
|
|
130
|
+
| `GITWISE_AGENT=1` | Alias to enable agent output mode |
|
|
131
|
+
| `GITWISE_GIT_TIMEOUT=<seconds>` | Override git subprocess timeout |
|
|
132
|
+
| `GITWISE_WIDTH=<columns>` | Override output width |
|
|
133
|
+
| `GITWISE_BIN_DIR` | Install location (default: `~/.local/bin`) |
|
|
134
|
+
|
|
135
|
+
## Shell Completions
|
|
136
|
+
|
|
137
|
+
Generate completions script per shell:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
gitwise completions bash > ~/.local/share/bash-completion/completions/gitwise
|
|
141
|
+
gitwise completions zsh > ~/.zsh/completions/_gitwise
|
|
142
|
+
gitwise completions fish > ~/.config/fish/completions/gitwise.fish
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Demo
|
|
146
|
+
|
|
147
|
+
[](https://asciinema.org/a/6tm4TnYMygEQT7ef)
|
|
148
|
+
|
|
149
|
+
## License
|
|
150
|
+
|
|
151
|
+
[MIT](LICENSE) - Deiner
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
gitwise/__init__.py,sha256=7L7HnP5tooOOvzruNgV0VpHfWdXuT88cUiYwqKeAX-8,267
|
|
2
|
+
gitwise/__main__.py,sha256=2GuRJ3LysuDIHrMYryXqJCKFe6EtxgmGwg7nXQEmGyw,2897
|
|
3
|
+
gitwise/_cli_completions.py,sha256=85-aF5I-SFFehbSDvrj22eFb3DYiHiNxpwr6GxW0B4Q,3091
|
|
4
|
+
gitwise/_cli_dispatch.py,sha256=x75GaHWYS_Hcem0XvKVL1cB-dS0Q_d6_u3k00KZk6GU,12150
|
|
5
|
+
gitwise/_cli_introspection.py,sha256=wlRMcRrGpitUGs5Sm1g-Eyf0avLeHpYhsBs48PCC2eI,9112
|
|
6
|
+
gitwise/_cli_parser.py,sha256=eN-LCksh-Fhp4UUyDTLaHJlC7YviFPcf4PamRQLTrdM,13702
|
|
7
|
+
gitwise/_cli_setup_agents.py,sha256=kgMnzIZ4t9r-YV3ANCAQhx8cKxdkK_pkopCtFq14ew8,13419
|
|
8
|
+
gitwise/_i18n_data.json,sha256=VJjWJXIdKi0PFJgBPTQ6WH0TEkOj8ums_Ea7ryLUVrM,60751
|
|
9
|
+
gitwise/_paths.py,sha256=VRkql9HQ5_OjwbpcX-18fwe_lMpuQffP4AiBV6suSFg,658
|
|
10
|
+
gitwise/_runtime_config.py,sha256=G3MqJwPoKWMak3dZkPHXqCeJPph2_9KBEomQ5YT2RHI,7176
|
|
11
|
+
gitwise/audit.py,sha256=mdovDdJ2PQ4dSTBBNujA0KrYzdqZaOQZt6GrbSW7vfA,10507
|
|
12
|
+
gitwise/branches.py,sha256=6YBZh3QkNPSxPEHoWxsnO0nR17zkD8y9LhPia60gBCk,5627
|
|
13
|
+
gitwise/clean.py,sha256=HdoMTzY2GHiSmyjQnwA6FmItfdCYA_7wfQ8WA1zuTHA,5637
|
|
14
|
+
gitwise/commit.py,sha256=9CUrogVrDtlTGXINIC67oab0Jyl_Bnn5X-KLbQ8c5uA,3926
|
|
15
|
+
gitwise/conflicts.py,sha256=LKnPLvhCdkaNv9QCBywpQTvInLboNsug3upi7XK-4uo,3620
|
|
16
|
+
gitwise/context.py,sha256=rxeZNso-BfqTpYTMomGzx2Q85nojJpoHfMk3CYmV2Vw,5454
|
|
17
|
+
gitwise/design.py,sha256=lr7R6PaUTOGNyY8bPHU-soG8FV0Zsf3cBkRZkyUWuBk,11156
|
|
18
|
+
gitwise/diff.py,sha256=jXG02qu4pNjae9scGnrs27cNpz1BEYB8hLTvrXuYxW4,8843
|
|
19
|
+
gitwise/doctor.py,sha256=z6EpxrBbdXtb1kMiCT1qPBiqwZCrmXjkik0gnUvHp-g,3848
|
|
20
|
+
gitwise/git.py,sha256=OY4FNeP-RZbC8vda-5d9zzvSKJBgM05uCJWnlrEzWIo,7259
|
|
21
|
+
gitwise/health.py,sha256=02PFdcP0Mb67M4fVdBI7rEYbknVMHKUdHisTQYjE-Uw,9562
|
|
22
|
+
gitwise/i18n.py,sha256=9tEI-xs6lUdku3NnqMGwtM7Ck6AlUSm7nrPd95yzXcg,2448
|
|
23
|
+
gitwise/log.py,sha256=gaPTDW12ZVDR1dPSdJbCx7d9hhyg5HPsUs85WC4ErHo,9149
|
|
24
|
+
gitwise/merge.py,sha256=DHqxqRmfToOu-j8qo2DP16xtist4e4-tJhozHalIQh0,5711
|
|
25
|
+
gitwise/optimize.py,sha256=Eqka6u2s-eSMKfkhWynAYlEwjjAL4rOwEHoPikxXew8,5955
|
|
26
|
+
gitwise/output.py,sha256=fuyu2L0K8-l6A4NHSZGt-SLS5Km6_bFKoUNM7V9T5m8,18668
|
|
27
|
+
gitwise/pick.py,sha256=2JNkcaL4D7z0dRfFyoDRQsa7_2vGtkBV22MMxHFIYG4,2985
|
|
28
|
+
gitwise/pr.py,sha256=Kbv8WhC3esRS3lI34HU9oFNbDqpTQNJn3Yl2CvAw8TM,16730
|
|
29
|
+
gitwise/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
gitwise/schema.py,sha256=IWPnx8Yv6ubt8E57AHz94hbKu0Jnwxm2zbPigxQZSbk,1418
|
|
31
|
+
gitwise/setup.py,sha256=CbOc8wyRytLQza-v1XkVr0bV29Es6UbDWrh2lQDUfSs,16625
|
|
32
|
+
gitwise/show.py,sha256=QY_4-sJjS_Q6rInzkalDXiZIHw2Sw7ir0zNQJ3S6RKs,3729
|
|
33
|
+
gitwise/snapshot.py,sha256=sXzWlkjjhuHokD3wNjNkC5QJus0kr09_qf4ftHVRJ_8,3415
|
|
34
|
+
gitwise/stash.py,sha256=dGyurYTVYB5I1KBLvVR-WAAHSD8oqyYp9HlchSPTvws,5325
|
|
35
|
+
gitwise/status.py,sha256=Th13IFi9z35muy8avzmbMb38ZaenVstKAoLpivXW3nk,2792
|
|
36
|
+
gitwise/suggest.py,sha256=5abkVvFnIISRToSt4jP6qHh6Fg8G_K3fo10G--EuRB0,4484
|
|
37
|
+
gitwise/summarize.py,sha256=qgR4teozwtS3AOI1rc24QUtkoeYJvXPagXlKBjtHtH8,6600
|
|
38
|
+
gitwise/sync.py,sha256=kpnToYTdwRvdh6NDx-ZCgpqU2Ayz7_uKnudJYAxIV_o,7420
|
|
39
|
+
gitwise/tag.py,sha256=af6hEFHlngWh5XA2Gxd0sIV_VVvO_NdJToWL3jJ1tgw,6397
|
|
40
|
+
gitwise/undo.py,sha256=MoeeFVETDJNtREx_tR6j8yWYnyYHH3n1EmVUuHjJNOg,3988
|
|
41
|
+
gitwise/update.py,sha256=4GuUFzNxQEsVqpKngJ59Md0zodTmDKHNl8xtNl6R4pE,1581
|
|
42
|
+
gitwise/worktree.py,sha256=yRUB5QUMpntarsqpXJJD0Zha701Vim4DC1daHZ_1h3I,5640
|
|
43
|
+
gitwise/setup_agents/__init__.py,sha256=P5IrjTxvT8kZUNNPqIyN9rMvlcNuyckFRyL02ZFuCic,1001
|
|
44
|
+
gitwise/setup_agents/exec.py,sha256=ziunMi10dicfpd7Tc5Npp-uWyKcLtq3RBwakchwdRLk,16205
|
|
45
|
+
gitwise/setup_agents/format.py,sha256=j1oLr6pw8_1H03sftFAl1UZP8mEUNRTuDE-iBKexLX8,4634
|
|
46
|
+
gitwise/setup_agents/plan.py,sha256=GKi1nijhZSG1y5ZgWTKtbDfwb73l8VijjP-mrfD_UGI,7971
|
|
47
|
+
gitwise/setup_agents/plan_gitfiles.py,sha256=M7Pqluyv-rI3sJ3F0oftADC3VKgyxttZCqlTYKRdYEE,5517
|
|
48
|
+
gitwise/setup_agents/plan_skills.py,sha256=HBtfBKitw30N6D_DQLjSfAPBybOjMxW-6NNoHHcMtHU,9549
|
|
49
|
+
gitwise/setup_agents/state.py,sha256=O1ENeoJRcb8za3HIa7DLmsRbah8_y1P_jEogCju9kso,4431
|
|
50
|
+
gitwise/setup_agents/types.py,sha256=rPUg5vu9XDA6Ldoc5uE_xv_6Pxl8ocHNitdobb8RnRk,1258
|
|
51
|
+
gitwise/setup_agents/adapters/__init__.py,sha256=PTC3aqJuXQBLjO4ExsfCJp-ZB1JdyT2HAR7DyP1jQ1Y,396
|
|
52
|
+
gitwise/setup_agents/adapters/aider.py,sha256=m3um9Mfz8gQ027LIl_hb-0ELTAjpCNbNxjUN_7hpKMc,132
|
|
53
|
+
gitwise/setup_agents/adapters/base.py,sha256=S4vAj2yDQ4tuMmQEK2L_TsMLtv4uAG2L38mrbMWlzhY,148
|
|
54
|
+
gitwise/setup_agents/adapters/codex.py,sha256=tlcrpO1mKx0T6YPafvw1vVRSdbXVLsrUYV9G-nuIur4,132
|
|
55
|
+
gitwise/setup_agents/adapters/continue_adapter.py,sha256=-peFhw1biwGBt5ib1ObRpnd8Gv0uOj1tFzZwpOawTrQ,146
|
|
56
|
+
gitwise/setup_agents/adapters/cursor.py,sha256=WI5RxwbBgwJDhKrC71jcEQgENY9j8sjyQbIwQ6hq52A,134
|
|
57
|
+
gitwise/setup_agents/adapters/opencode.py,sha256=FZfBO2hbChsxWfU9l4u8qpk9NIp-_G3NNXV83m04Ai4,138
|
|
58
|
+
gitwise/setup_agents/adapters/pi.py,sha256=2Zi6Oz0_OU7Hkr0_8-7UIaONBLfkF8CpGLjFDuBRlPw,126
|
|
59
|
+
gitwise/setup_agents/providers/__init__.py,sha256=CkGy-1SAkTTcSZ3WdBAqB2fD5w8lzLNPliVvnsKCtYo,3095
|
|
60
|
+
gitwise/setup_agents/providers/aider.py,sha256=QVGU99vYtaD0axixVIE_pntfaZGJ-hWGkIRPKp98hXs,357
|
|
61
|
+
gitwise/setup_agents/providers/base.py,sha256=1St3SzePio_DhUhDreAtptStZKrGujMwisrWo59Iwg4,2595
|
|
62
|
+
gitwise/setup_agents/providers/claude.py,sha256=3SHA1KJ30zA0BBsSwuhz2ErFsDQQlvDQR0EwikGqUMg,13724
|
|
63
|
+
gitwise/setup_agents/providers/codex.py,sha256=HAyFNy3MYfNr1a4ifBOIBoIIT8q-_O1XK3Yb4TgUvIk,327
|
|
64
|
+
gitwise/setup_agents/providers/continue_adapter.py,sha256=6eokEzOyeH_hzUQGQHrtrjA6covnoh0R5eVNvZHXhws,327
|
|
65
|
+
gitwise/setup_agents/providers/cursor.py,sha256=bz2_AboPIFc1gkvsEon6JP659ksgtFiWlzasxtEMFZg,353
|
|
66
|
+
gitwise/setup_agents/providers/opencode.py,sha256=ZfA18EP9Pcqn-wStBcBAmFwHcu7PO_mJ68ErztaKZXM,330
|
|
67
|
+
gitwise/setup_agents/providers/pi.py,sha256=-sj_Ufa25OhBbhZ6P3QlKBTLcIVRdKrgCZ6I8NYJ4OM,312
|
|
68
|
+
gitwise/utils/__init__.py,sha256=sW1hu0zxDj57_wkxhxLce2ZRGgHPtn3ey0IBeIw69Xg,42
|
|
69
|
+
gitwise/utils/git_output.py,sha256=KJOTuB_ce5fHWvkwRYoYQcXsCU2wKABt1YT2eP02cnc,1741
|
|
70
|
+
gitwise/utils/json_envelope.py,sha256=3lQF2_CxJtqYsarGwBa49d8ycF7-Eq2mvRZqe28yVz0,1320
|
|
71
|
+
gitwise/utils/parsing.py,sha256=2rm-b6Hd1QqA0WlPVzFburFIP8QWMPhhHpr0mhX59R0,939
|
|
72
|
+
gitwise/share/git-config-modern.txt,sha256=CwIu4xVZuGrujWioHq6yjmjfzPNFgSfWHXtL0EmREIs,875
|
|
73
|
+
gitwise/share/agents/skills/git-audit/SKILL.md,sha256=ItlLBBKUcug11dC2_ftRcp1eRSmNHaJpBtMGQXMksFA,1079
|
|
74
|
+
gitwise/share/agents/skills/git-clean/SKILL.md,sha256=vNxY4KJ6hYvSknTiZsTuJx8fZJFdhJ0VwXLJ49PU_6U,930
|
|
75
|
+
gitwise/share/agents/skills/git-optimize/SKILL.md,sha256=zuPfPlvu-_XJ2AbYho6vJh65gTMHo0jROQvbOhgtUiE,886
|
|
76
|
+
gitwise/share/aider/CONVENTIONS.md.template,sha256=yy34J9bvbo053SFYu3d0qqNwTet3VJNuExPTilwRBIQ,426
|
|
77
|
+
gitwise/share/aider/aider.conf.yml.template,sha256=S95dRmqO79JQyPVuB6FolmzjblkZZ_UBaTTamSD9sOY,95
|
|
78
|
+
gitwise/share/claude/CLAUDE.md.template,sha256=cEwWJ2UdtZ1BkrZB6s_BNzMsVAakoWPmmxpfsMJjlMs,524
|
|
79
|
+
gitwise/share/claude/settings.json.template,sha256=sFSKLz00oMi3k3WGMNvp5V_1abqUdpW7rHIhI0bsl4E,1262
|
|
80
|
+
gitwise/share/claude/rules/gitwise.md,sha256=bh_TVoh6kc7zHh4W58mrdAjyhH4VnNg-7Dk8FA_0vCY,557
|
|
81
|
+
gitwise/share/claude/skills/git-audit/SKILL.md,sha256=ItlLBBKUcug11dC2_ftRcp1eRSmNHaJpBtMGQXMksFA,1079
|
|
82
|
+
gitwise/share/claude/skills/git-clean/SKILL.md,sha256=vNxY4KJ6hYvSknTiZsTuJx8fZJFdhJ0VwXLJ49PU_6U,930
|
|
83
|
+
gitwise/share/claude/skills/git-optimize/SKILL.md,sha256=zuPfPlvu-_XJ2AbYho6vJh65gTMHo0jROQvbOhgtUiE,886
|
|
84
|
+
gitwise/share/codex/agents/gitwise.toml.template,sha256=whClCeFfF2hpfI-hr5DMoDMYWj1P-0nDVk9BKjTT5fw,643
|
|
85
|
+
gitwise/share/continue/rules/gitwise.md.template,sha256=qpHNHs-yYDx0TuO0ztQshcMIa_j_yBw1DBJZHW7acZs,619
|
|
86
|
+
gitwise/share/cursor/rules/gitwise.mdc.template,sha256=63l2MWe6bQXL253x09O7CgM7_Ws9JUgrUOtNB9Zhag4,641
|
|
87
|
+
gitwise/share/hooks/commit-msg,sha256=XYO1M8yr-dg6RIW1EsbURTPniz_P5NnDAy2g9iyVm4c,967
|
|
88
|
+
gitwise/share/hooks/pre-commit,sha256=ArwF0ObjO-yrHUS2E0SztH4ya1h9ERww2uQBvGjLXl8,826
|
|
89
|
+
gitwise/share/opencode/agents/gitwise.md.template,sha256=qpHNHs-yYDx0TuO0ztQshcMIa_j_yBw1DBJZHW7acZs,619
|
|
90
|
+
gitwise/share/pi/skills/gitwise.md.template,sha256=qpHNHs-yYDx0TuO0ztQshcMIa_j_yBw1DBJZHW7acZs,619
|
|
91
|
+
gitwise/share/schemas/v1/input/audit.json,sha256=VRggwo8B-qUPUdWnVlrnTKCRrHAFk6Z-ZbSZOA_tVas,907
|
|
92
|
+
gitwise/share/schemas/v1/input/branches.json,sha256=WhUMBibXZRghx7zOf0AEar2oUWavEg1dcQZlhujUsaU,1232
|
|
93
|
+
gitwise/share/schemas/v1/input/clean.json,sha256=PQX0I00cnbrrb7nGgYVF3Ls-Z0-1CGbU1IBcdQCUQ7Y,1119
|
|
94
|
+
gitwise/share/schemas/v1/input/commands.json,sha256=cY-gQK_k-KpYd1xSeo-9QaD-H5-MQ0CydMEht4QAWg0,843
|
|
95
|
+
gitwise/share/schemas/v1/input/commit.json,sha256=yuQljkmno1ZnLng7D3Pex03HFI2uJoEOw3uLbwIOeA4,1451
|
|
96
|
+
gitwise/share/schemas/v1/input/completions.json,sha256=94L2h3uFzuVn7H_U2tAkGM3Tua7suz31D6ijsQbhMx4,1207
|
|
97
|
+
gitwise/share/schemas/v1/input/conflicts.json,sha256=IBpEgZiTMefwAQRNfG7NPl6JviKVp1ndp69qC1oAyz0,1101
|
|
98
|
+
gitwise/share/schemas/v1/input/context.json,sha256=EmHb_SewW6xxDAZ_InJq76_lrAAD_HWlQmGC-V6Zq1o,841
|
|
99
|
+
gitwise/share/schemas/v1/input/diff.json,sha256=QAuq15XR3M3UE3dTfSSMd3Dvq2TYz79TdbGefRawlFM,1332
|
|
100
|
+
gitwise/share/schemas/v1/input/doctor.json,sha256=qkR-oY8jlNyur8USc62o8g8EmUFA0q3t5sVCSfHO8vE,839
|
|
101
|
+
gitwise/share/schemas/v1/input/health.json,sha256=ujZmveZ8un8DhgKGan79A_MOTxu0rjXXUmDlSAeU7oM,839
|
|
102
|
+
gitwise/share/schemas/v1/input/log.json,sha256=6sWO7QUKaSMEofNgZPDQZ_bv89SkNkExqkz9awO0hPU,1634
|
|
103
|
+
gitwise/share/schemas/v1/input/merge.json,sha256=K9vlpkfDeHTDIRBNbu8VPJQDD11ivS6JdveMKyVRWkE,1438
|
|
104
|
+
gitwise/share/schemas/v1/input/optimize.json,sha256=cymFwU8RuHbR54RUh40F__rkHupqYLJb60L6J5hCzNg,983
|
|
105
|
+
gitwise/share/schemas/v1/input/pick.json,sha256=JMuEkIj64ntvXzoXYAh8PA3w6dgO-p0sOS7P0xEFFkE,1472
|
|
106
|
+
gitwise/share/schemas/v1/input/pr.json,sha256=FG_KrZj09f9bQMQOxfnR7_P4IOlIY-jZkbX4_unweOE,1152
|
|
107
|
+
gitwise/share/schemas/v1/input/schema.json,sha256=vARP4FbVhP43V99H5FdRH1KENlOY8JYdN8G-nQNJJ8k,1094
|
|
108
|
+
gitwise/share/schemas/v1/input/setup-agents.json,sha256=kdQfy6PBOv12t03fshHRz2pNjk_0jf3Mff-RO47LMuQ,2921
|
|
109
|
+
gitwise/share/schemas/v1/input/setup.json,sha256=0vVCWAIsMTkReJZNJT5vWpS3rS65pItAwcubgdb20Xo,1236
|
|
110
|
+
gitwise/share/schemas/v1/input/show.json,sha256=mnoU5_6jaULPnVNPL4Eu28uO3dC1aZIHLAbsknB6Qxw,1061
|
|
111
|
+
gitwise/share/schemas/v1/input/snapshot.json,sha256=Pt5oIEwRHEYaM0cUcFC1JAcUNPCjeUPlsVuYoE2S6lg,843
|
|
112
|
+
gitwise/share/schemas/v1/input/stash.json,sha256=ZdCRx2ZDqUrWnNkYSQp7alwvdWklNTGtwqdrwkv1Tbc,1493
|
|
113
|
+
gitwise/share/schemas/v1/input/status.json,sha256=TBeVq8zUl99OkOntjSLAz2K3CuFpBdgxraXhTZGwDAU,839
|
|
114
|
+
gitwise/share/schemas/v1/input/suggest.json,sha256=WhahOh7tJQxmsr596Y6Z3HYfk7rhRQUQjA3Y8OtuxEo,841
|
|
115
|
+
gitwise/share/schemas/v1/input/summarize.json,sha256=HsCLmZ8yBXYQeyqGdWk0JMIqaZt9UBP1WhiVgCegObk,987
|
|
116
|
+
gitwise/share/schemas/v1/input/sync.json,sha256=j96-lgPR29-7a9mpOAFE47tZMJJ_94PKJ0r23tmpTvs,1288
|
|
117
|
+
gitwise/share/schemas/v1/input/tag.json,sha256=KmrCyqcJsJU_uDhNba_KYpAkYg7vIlQacnqaXUHJlZo,1577
|
|
118
|
+
gitwise/share/schemas/v1/input/undo.json,sha256=PRab96r2e1iU2FN8yBV_njgly_-7lm7Vy4KcMh3NMQ4,1406
|
|
119
|
+
gitwise/share/schemas/v1/input/update.json,sha256=OmuSgSp_USg2f45mywnSpxUB0NMSn_lQDLC4yDzCopo,911
|
|
120
|
+
gitwise/share/schemas/v1/input/worktree.json,sha256=rKKOtWyAgARIa-b-Raw7ZNPqKkO7DlPd7PE1c0flRDs,1063
|
|
121
|
+
gitwise_cli-0.24.2.dist-info/METADATA,sha256=_HjfNbOXGsycMAlZb2DjjA7UHn05PMViWIxcf3ZG5lI,5714
|
|
122
|
+
gitwise_cli-0.24.2.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
|
|
123
|
+
gitwise_cli-0.24.2.dist-info/entry_points.txt,sha256=rGwxSDmUHtzlY6yp7KeMJhRARijXkSE6OKuOJ8PF51E,50
|
|
124
|
+
gitwise_cli-0.24.2.dist-info/licenses/LICENSE,sha256=vfJO-ThMtWhZOD9MsArN2yul1EJmxAXxfeGHKnEk9QQ,1063
|
|
125
|
+
gitwise_cli-0.24.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Deiner
|
|
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.
|