hatch-xclam 0.7.0__py3-none-any.whl → 0.7.0.dev11__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.
- hatch_xclam-0.7.0.dev11.dist-info/METADATA +103 -0
- {hatch_xclam-0.7.0.dist-info → hatch_xclam-0.7.0.dev11.dist-info}/RECORD +65 -6
- hatch_xclam-0.7.0.dev11.dist-info/top_level.txt +3 -0
- node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py +45 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSNew.py +365 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSProject.py +206 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings.py +1272 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSSettings_test.py +1547 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSToolFile.py +59 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUserFile.py +152 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSUtil.py +270 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/MSVSVersion.py +574 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/__init__.py +704 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common.py +709 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/common_test.py +173 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml.py +169 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/easy_xml_test.py +113 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/flock_tool.py +55 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/__init__.py +0 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/analyzer.py +805 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py +1172 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/cmake.py +1319 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/compile_commands_json.py +128 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/dump_dependency_json.py +104 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/eclipse.py +462 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypd.py +89 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py +56 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/make.py +2745 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py +3976 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs_test.py +44 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja.py +2965 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/ninja_test.py +67 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode.py +1391 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/generator/xcode_test.py +26 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input.py +3112 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/input_test.py +99 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/mac_tool.py +767 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py +1260 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/ninja_syntax.py +174 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/simple_copy.py +61 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/win_tool.py +373 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py +1939 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation_test.py +54 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcode_ninja.py +303 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xcodeproj_file.py +3196 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/gyp/xml_fix.py +65 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/__init__.py +15 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_elffile.py +108 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_manylinux.py +252 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_musllinux.py +83 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_parser.py +359 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_structures.py +61 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/_tokenizer.py +192 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/markers.py +252 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/metadata.py +825 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/py.typed +0 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/requirements.py +90 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/specifiers.py +1030 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/tags.py +553 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/utils.py +172 -0
- node_modules/npm/node_modules/node-gyp/gyp/pylib/packaging/version.py +563 -0
- node_modules/npm/node_modules/node-gyp/gyp/test_gyp.py +261 -0
- hatch_xclam-0.7.0.dist-info/METADATA +0 -150
- hatch_xclam-0.7.0.dist-info/top_level.txt +0 -2
- {hatch_xclam-0.7.0.dist-info → hatch_xclam-0.7.0.dev11.dist-info}/WHEEL +0 -0
- {hatch_xclam-0.7.0.dist-info → hatch_xclam-0.7.0.dev11.dist-info}/entry_points.txt +0 -0
- {hatch_xclam-0.7.0.dist-info → hatch_xclam-0.7.0.dev11.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright (c) 2012 Google Inc. All rights reserved.
|
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be
|
|
4
|
+
# found in the LICENSE file.
|
|
5
|
+
|
|
6
|
+
"""gyptest.py -- test runner for GYP tests."""
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import os
|
|
11
|
+
import platform
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
import time
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def is_test_name(f):
|
|
18
|
+
return f.startswith("gyptest") and f.endswith(".py")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def find_all_gyptest_files(directory):
|
|
22
|
+
result = []
|
|
23
|
+
for root, dirs, files in os.walk(directory):
|
|
24
|
+
result.extend([os.path.join(root, f) for f in files if is_test_name(f)])
|
|
25
|
+
result.sort()
|
|
26
|
+
return result
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def main(argv=None):
|
|
30
|
+
if argv is None:
|
|
31
|
+
argv = sys.argv
|
|
32
|
+
|
|
33
|
+
parser = argparse.ArgumentParser()
|
|
34
|
+
parser.add_argument("-a", "--all", action="store_true", help="run all tests")
|
|
35
|
+
parser.add_argument("-C", "--chdir", action="store", help="change to directory")
|
|
36
|
+
parser.add_argument(
|
|
37
|
+
"-f",
|
|
38
|
+
"--format",
|
|
39
|
+
action="store",
|
|
40
|
+
default="",
|
|
41
|
+
help="run tests with the specified formats",
|
|
42
|
+
)
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"-G",
|
|
45
|
+
"--gyp_option",
|
|
46
|
+
action="append",
|
|
47
|
+
default=[],
|
|
48
|
+
help="Add -G options to the gyp command line",
|
|
49
|
+
)
|
|
50
|
+
parser.add_argument(
|
|
51
|
+
"-l", "--list", action="store_true", help="list available tests and exit"
|
|
52
|
+
)
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"-n",
|
|
55
|
+
"--no-exec",
|
|
56
|
+
action="store_true",
|
|
57
|
+
help="no execute, just print the command line",
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"--path", action="append", default=[], help="additional $PATH directory"
|
|
61
|
+
)
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"-q",
|
|
64
|
+
"--quiet",
|
|
65
|
+
action="store_true",
|
|
66
|
+
help="quiet, don't print anything unless there are failures",
|
|
67
|
+
)
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
"-v",
|
|
70
|
+
"--verbose",
|
|
71
|
+
action="store_true",
|
|
72
|
+
help="print configuration info and test results.",
|
|
73
|
+
)
|
|
74
|
+
parser.add_argument("tests", nargs="*")
|
|
75
|
+
args = parser.parse_args(argv[1:])
|
|
76
|
+
|
|
77
|
+
if args.chdir:
|
|
78
|
+
os.chdir(args.chdir)
|
|
79
|
+
|
|
80
|
+
if args.path:
|
|
81
|
+
extra_path = [os.path.abspath(p) for p in args.path]
|
|
82
|
+
extra_path = os.pathsep.join(extra_path)
|
|
83
|
+
os.environ["PATH"] = extra_path + os.pathsep + os.environ["PATH"]
|
|
84
|
+
|
|
85
|
+
if not args.tests:
|
|
86
|
+
if not args.all:
|
|
87
|
+
sys.stderr.write("Specify -a to get all tests.\n")
|
|
88
|
+
return 1
|
|
89
|
+
args.tests = ["test"]
|
|
90
|
+
|
|
91
|
+
tests = []
|
|
92
|
+
for arg in args.tests:
|
|
93
|
+
if os.path.isdir(arg):
|
|
94
|
+
tests.extend(find_all_gyptest_files(os.path.normpath(arg)))
|
|
95
|
+
else:
|
|
96
|
+
if not is_test_name(os.path.basename(arg)):
|
|
97
|
+
print(arg, "is not a valid gyp test name.", file=sys.stderr)
|
|
98
|
+
sys.exit(1)
|
|
99
|
+
tests.append(arg)
|
|
100
|
+
|
|
101
|
+
if args.list:
|
|
102
|
+
for test in tests:
|
|
103
|
+
print(test)
|
|
104
|
+
sys.exit(0)
|
|
105
|
+
|
|
106
|
+
os.environ["PYTHONPATH"] = os.path.abspath("test/lib")
|
|
107
|
+
|
|
108
|
+
if args.verbose:
|
|
109
|
+
print_configuration_info()
|
|
110
|
+
|
|
111
|
+
if args.gyp_option and not args.quiet:
|
|
112
|
+
print("Extra Gyp options: %s\n" % args.gyp_option)
|
|
113
|
+
|
|
114
|
+
if args.format:
|
|
115
|
+
format_list = args.format.split(",")
|
|
116
|
+
else:
|
|
117
|
+
format_list = {
|
|
118
|
+
"aix5": ["make"],
|
|
119
|
+
"os400": ["make"],
|
|
120
|
+
"freebsd7": ["make"],
|
|
121
|
+
"freebsd8": ["make"],
|
|
122
|
+
"openbsd5": ["make"],
|
|
123
|
+
"cygwin": ["msvs"],
|
|
124
|
+
"win32": ["msvs", "ninja"],
|
|
125
|
+
"linux": ["make", "ninja"],
|
|
126
|
+
"linux2": ["make", "ninja"],
|
|
127
|
+
"linux3": ["make", "ninja"],
|
|
128
|
+
# TODO: Re-enable xcode-ninja.
|
|
129
|
+
# https://bugs.chromium.org/p/gyp/issues/detail?id=530
|
|
130
|
+
# 'darwin': ['make', 'ninja', 'xcode', 'xcode-ninja'],
|
|
131
|
+
"darwin": ["make", "ninja", "xcode"],
|
|
132
|
+
}[sys.platform]
|
|
133
|
+
|
|
134
|
+
gyp_options = []
|
|
135
|
+
for option in args.gyp_option:
|
|
136
|
+
gyp_options += ["-G", option]
|
|
137
|
+
|
|
138
|
+
runner = Runner(format_list, tests, gyp_options, args.verbose)
|
|
139
|
+
runner.run()
|
|
140
|
+
|
|
141
|
+
if not args.quiet:
|
|
142
|
+
runner.print_results()
|
|
143
|
+
|
|
144
|
+
return 1 if runner.failures else 0
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def print_configuration_info():
|
|
148
|
+
print("Test configuration:")
|
|
149
|
+
if sys.platform == "darwin":
|
|
150
|
+
sys.path.append(os.path.abspath("test/lib"))
|
|
151
|
+
import TestMac
|
|
152
|
+
|
|
153
|
+
print(f" Mac {platform.mac_ver()[0]} {platform.mac_ver()[2]}")
|
|
154
|
+
print(f" Xcode {TestMac.Xcode.Version()}")
|
|
155
|
+
elif sys.platform == "win32":
|
|
156
|
+
sys.path.append(os.path.abspath("pylib"))
|
|
157
|
+
import gyp.MSVSVersion
|
|
158
|
+
|
|
159
|
+
print(" Win %s %s\n" % platform.win32_ver()[0:2])
|
|
160
|
+
print(" MSVS %s" % gyp.MSVSVersion.SelectVisualStudioVersion().Description())
|
|
161
|
+
elif sys.platform in ("linux", "linux2"):
|
|
162
|
+
print(" Linux %s" % " ".join(platform.linux_distribution()))
|
|
163
|
+
print(f" Python {platform.python_version()}")
|
|
164
|
+
print(f" PYTHONPATH={os.environ['PYTHONPATH']}")
|
|
165
|
+
print()
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class Runner:
|
|
169
|
+
def __init__(self, formats, tests, gyp_options, verbose):
|
|
170
|
+
self.formats = formats
|
|
171
|
+
self.tests = tests
|
|
172
|
+
self.verbose = verbose
|
|
173
|
+
self.gyp_options = gyp_options
|
|
174
|
+
self.failures = []
|
|
175
|
+
self.num_tests = len(formats) * len(tests)
|
|
176
|
+
num_digits = len(str(self.num_tests))
|
|
177
|
+
self.fmt_str = "[%%%dd/%%%dd] (%%s) %%s" % (num_digits, num_digits)
|
|
178
|
+
self.isatty = sys.stdout.isatty() and not self.verbose
|
|
179
|
+
self.env = os.environ.copy()
|
|
180
|
+
self.hpos = 0
|
|
181
|
+
|
|
182
|
+
def run(self):
|
|
183
|
+
run_start = time.time()
|
|
184
|
+
|
|
185
|
+
i = 1
|
|
186
|
+
for fmt in self.formats:
|
|
187
|
+
for test in self.tests:
|
|
188
|
+
self.run_test(test, fmt, i)
|
|
189
|
+
i += 1
|
|
190
|
+
|
|
191
|
+
if self.isatty:
|
|
192
|
+
self.erase_current_line()
|
|
193
|
+
|
|
194
|
+
self.took = time.time() - run_start
|
|
195
|
+
|
|
196
|
+
def run_test(self, test, fmt, i):
|
|
197
|
+
if self.isatty:
|
|
198
|
+
self.erase_current_line()
|
|
199
|
+
|
|
200
|
+
msg = self.fmt_str % (i, self.num_tests, fmt, test)
|
|
201
|
+
self.print_(msg)
|
|
202
|
+
|
|
203
|
+
start = time.time()
|
|
204
|
+
cmd = [sys.executable, test] + self.gyp_options
|
|
205
|
+
self.env["TESTGYP_FORMAT"] = fmt
|
|
206
|
+
proc = subprocess.Popen(
|
|
207
|
+
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env=self.env
|
|
208
|
+
)
|
|
209
|
+
proc.wait()
|
|
210
|
+
took = time.time() - start
|
|
211
|
+
|
|
212
|
+
stdout = proc.stdout.read().decode("utf8")
|
|
213
|
+
if proc.returncode == 2:
|
|
214
|
+
res = "skipped"
|
|
215
|
+
elif proc.returncode:
|
|
216
|
+
res = "failed"
|
|
217
|
+
self.failures.append(f"({test}) {fmt}")
|
|
218
|
+
else:
|
|
219
|
+
res = "passed"
|
|
220
|
+
res_msg = f" {res} {took:.3f}s"
|
|
221
|
+
self.print_(res_msg)
|
|
222
|
+
|
|
223
|
+
if stdout and not stdout.endswith(("PASSED\n", "NO RESULT\n")):
|
|
224
|
+
print()
|
|
225
|
+
print("\n".join(f" {line}" for line in stdout.splitlines()))
|
|
226
|
+
elif not self.isatty:
|
|
227
|
+
print()
|
|
228
|
+
|
|
229
|
+
def print_(self, msg):
|
|
230
|
+
print(msg, end="")
|
|
231
|
+
index = msg.rfind("\n")
|
|
232
|
+
if index == -1:
|
|
233
|
+
self.hpos += len(msg)
|
|
234
|
+
else:
|
|
235
|
+
self.hpos = len(msg) - index
|
|
236
|
+
sys.stdout.flush()
|
|
237
|
+
|
|
238
|
+
def erase_current_line(self):
|
|
239
|
+
print("\b" * self.hpos + " " * self.hpos + "\b" * self.hpos, end="")
|
|
240
|
+
sys.stdout.flush()
|
|
241
|
+
self.hpos = 0
|
|
242
|
+
|
|
243
|
+
def print_results(self):
|
|
244
|
+
num_failures = len(self.failures)
|
|
245
|
+
if num_failures:
|
|
246
|
+
print()
|
|
247
|
+
if num_failures == 1:
|
|
248
|
+
print("Failed the following test:")
|
|
249
|
+
else:
|
|
250
|
+
print("Failed the following %d tests:" % num_failures)
|
|
251
|
+
print("\t" + "\n\t".join(sorted(self.failures)))
|
|
252
|
+
print()
|
|
253
|
+
print(
|
|
254
|
+
"Ran %d tests in %.3fs, %d failed."
|
|
255
|
+
% (self.num_tests, self.took, num_failures)
|
|
256
|
+
)
|
|
257
|
+
print()
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
if __name__ == "__main__":
|
|
261
|
+
sys.exit(main())
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: hatch-xclam
|
|
3
|
-
Version: 0.7.0
|
|
4
|
-
Summary: Package manager for the Cracking Shells ecosystem
|
|
5
|
-
Author: Cracking Shells Team
|
|
6
|
-
Project-URL: Homepage, https://github.com/CrackingShells/Hatch
|
|
7
|
-
Project-URL: Bug Tracker, https://github.com/CrackingShells/Hatch/issues
|
|
8
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
9
|
-
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Requires-Python: >=3.12
|
|
12
|
-
Description-Content-Type: text/markdown
|
|
13
|
-
License-File: LICENSE
|
|
14
|
-
Requires-Dist: jsonschema>=4.0.0
|
|
15
|
-
Requires-Dist: requests>=2.25.0
|
|
16
|
-
Requires-Dist: packaging>=20.0
|
|
17
|
-
Requires-Dist: docker>=7.1.0
|
|
18
|
-
Requires-Dist: pydantic>=2.0.0
|
|
19
|
-
Requires-Dist: hatch-validator>=0.8.0
|
|
20
|
-
Provides-Extra: docs
|
|
21
|
-
Requires-Dist: mkdocs>=1.4.0; extra == "docs"
|
|
22
|
-
Requires-Dist: mkdocstrings[python]>=0.20.0; extra == "docs"
|
|
23
|
-
Provides-Extra: dev
|
|
24
|
-
Requires-Dist: wobble>=0.2.0; extra == "dev"
|
|
25
|
-
Dynamic: license-file
|
|
26
|
-
|
|
27
|
-
# Hatch
|
|
28
|
-
|
|
29
|
-

|
|
30
|
-
|
|
31
|
-
## Introduction
|
|
32
|
-
|
|
33
|
-
Hatch is the package manager for managing Model Context Protocol (MCP) servers with environment isolation, multi-type dependency resolution, and multi-host deployment. Deploy MCP servers to Claude Desktop, VS Code, Cursor, and other platforms with automatic dependency management.
|
|
34
|
-
|
|
35
|
-
The canonical documentation is at `docs/index.md` and published at <https://hatch.readthedocs.io/en/latest/>.
|
|
36
|
-
|
|
37
|
-
## Key Features
|
|
38
|
-
|
|
39
|
-
- **Environment Isolation** — Create separate, isolated workspaces for different projects without conflicts
|
|
40
|
-
- **Multi-Type Dependency Resolution** — Automatically resolve and install system packages, Python packages, Docker containers, and Hatch packages
|
|
41
|
-
- **Multi-Host Deployment** — Deploy MCP servers to Claude Desktop, Claude Code, VS Code, Cursor, LM Studio, and Google Gemini CLI
|
|
42
|
-
- **Package Validation** — Ensure packages meet schema requirements before distribution
|
|
43
|
-
- **Development-Focused** — Optimized for rapid development and testing of MCP server ecosystems
|
|
44
|
-
|
|
45
|
-
## Supported MCP Hosts
|
|
46
|
-
|
|
47
|
-
Hatch supports deployment to the following MCP host platforms:
|
|
48
|
-
|
|
49
|
-
- **Claude Desktop** — Anthropic's desktop application for Claude with native MCP support
|
|
50
|
-
- **Claude Code** — Claude integration for VS Code with MCP capabilities
|
|
51
|
-
- **VS Code** — Visual Studio Code with the MCP extension for tool integration
|
|
52
|
-
- **Cursor** — AI-first code editor with built-in MCP server support
|
|
53
|
-
- **LM Studio** — Local LLM inference platform with MCP server integration
|
|
54
|
-
- **Google Gemini CLI** — Command-line interface for Google's Gemini model with MCP support
|
|
55
|
-
|
|
56
|
-
## Quick Start
|
|
57
|
-
|
|
58
|
-
### Install from PyPI
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
pip install hatch-xclam
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Verify installation:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
hatch --version
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Install from source
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
git clone https://github.com/CrackingShells/Hatch.git
|
|
74
|
-
cd Hatch
|
|
75
|
-
pip install -e .
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Create your first environment and *Hatch!* MCP server package
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
# Create an isolated environment
|
|
82
|
-
hatch env create my_project
|
|
83
|
-
|
|
84
|
-
# Switch to it
|
|
85
|
-
hatch env use my_project
|
|
86
|
-
|
|
87
|
-
# Create a package template
|
|
88
|
-
hatch create my_mcp_server --description "My MCP server"
|
|
89
|
-
|
|
90
|
-
# Validate the package
|
|
91
|
-
hatch validate ./my_mcp_server
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Deploy MCP servers to your tools
|
|
95
|
-
|
|
96
|
-
**Package-First Deployment (Recommended)** — Add a Hatch package and automatically configure it on Claude Desktop and Cursor:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
hatch package add ./my_mcp_server --host claude-desktop,cursor
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Direct Configuration (Advanced)** — Configure arbitrary MCP servers on your hosts:
|
|
103
|
-
|
|
104
|
-
```bash
|
|
105
|
-
# Remote server example: GitHub MCP Server with authentication
|
|
106
|
-
export GIT_PAT_TOKEN=your_github_personal_access_token
|
|
107
|
-
hatch mcp configure github-mcp --host gemini \
|
|
108
|
-
--httpUrl https://api.github.com/mcp \
|
|
109
|
-
--header Authorization="Bearer $GIT_PAT_TOKEN"
|
|
110
|
-
|
|
111
|
-
# Local server example: Context7 via npx
|
|
112
|
-
hatch mcp configure context7 --host vscode \
|
|
113
|
-
--command npx --args "-y @upstash/context7-mcp"
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## Documentation
|
|
117
|
-
|
|
118
|
-
- **[Full Documentation](https://hatch.readthedocs.io/en/latest/)** — Complete reference and guides
|
|
119
|
-
- **[Getting Started](./docs/articles/users/GettingStarted.md)** — Quick start for users
|
|
120
|
-
- **[CLI Reference](./docs/articles/users/CLIReference.md)** — All commands and options
|
|
121
|
-
- **[Tutorials](./docs/articles/users/tutorials/)** — Step-by-step guides from installation to package authoring
|
|
122
|
-
- **[MCP Host Configuration](./docs/articles/users/MCPHostConfiguration.md)** — Deploy to multiple platforms
|
|
123
|
-
- **[Developer Docs](./docs/articles/devs/)** — Architecture, implementation guides, and contribution guidelines
|
|
124
|
-
- **[Troubleshooting](./docs/articles/users/Troubleshooting/ReportIssues.md)** — Common issues and solutions
|
|
125
|
-
|
|
126
|
-
## Contributing
|
|
127
|
-
|
|
128
|
-
We welcome contributions! See the [How to Contribute](./docs/articles/devs/contribution_guides/how_to_contribute.md) guide for details.
|
|
129
|
-
|
|
130
|
-
### Quick start for developers
|
|
131
|
-
|
|
132
|
-
1. **Fork and clone** the repository
|
|
133
|
-
2. **Install dependencies**: `pip install -e .` and `npm install`
|
|
134
|
-
3. **Create a feature branch**: `git checkout -b feat/your-feature`
|
|
135
|
-
4. **Make changes** and add tests
|
|
136
|
-
5. **Use conventional commits**: `npm run commit` for guided commits
|
|
137
|
-
6. **Run tests**: `wobble`
|
|
138
|
-
7. **Create a pull request**
|
|
139
|
-
|
|
140
|
-
We use [Conventional Commits](https://www.conventionalcommits.org/) for automated versioning. Use `npm run commit` for guided commit messages.
|
|
141
|
-
|
|
142
|
-
## Getting Help
|
|
143
|
-
|
|
144
|
-
- Search existing [GitHub Issues](https://github.com/CrackingShells/Hatch/issues)
|
|
145
|
-
- Read [Troubleshooting](./docs/articles/users/Troubleshooting/ReportIssues.md) for common problems
|
|
146
|
-
- Check [Developer Onboarding](./docs/articles/devs/development_processes/developer_onboarding.md) for setup help
|
|
147
|
-
|
|
148
|
-
## License
|
|
149
|
-
|
|
150
|
-
This project is licensed under the GNU Affero General Public License v3 — see `LICENSE` for details.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|