minecode-mcp 0.2.0__tar.gz → 0.2.2__tar.gz
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.
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/PKG-INFO +97 -20
- minecode_mcp-0.2.0/readme.md → minecode_mcp-0.2.2/README.md +96 -19
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/pyproject.toml +9 -3
- minecode_mcp-0.2.0/scripts/readme.md +0 -22
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/.gitignore +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/LICENSE +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/README.md +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/dimension/crystal_void.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/dimension_type/crystal_void.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/build_tower.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/give_kit.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/help.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/load.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/return.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/spawn_boss.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/teleport.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/tick.mcfunction +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/biome/crystal_plains.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/amethyst_clusters.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/crystal_spikes.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/ore_crystal_diamond.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/ore_crystal_emerald.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/noise_settings/crystal_void.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/amethyst_clusters.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/crystal_spikes.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/ore_crystal_diamond.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/ore_crystal_emerald.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/minecraft/tags/function/load.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/minecraft/tags/function/tick.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/pack.mcmeta +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/__init__.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/brigadier.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/cache.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/config/config.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/config/prompt_config.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/handlers.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/knowledge/__init__.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/knowledge/migrations.json +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/packmeta.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/preprompts/assistant_preprompt.txt +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/__init__.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/minecraft_logs.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/minecraftwiki.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/misode.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/mojira.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/spyglass.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/server.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/tools.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_knowledge.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_live.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_registry.py +0 -0
- {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_regressions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: minecode-mcp
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: MCP Server for Minecraft datapack development with wiki, Spyglass, Misode, and Mojira integrations
|
|
5
5
|
Project-URL: Homepage, https://github.com/AnCarsenat/minecode-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/AnCarsenat/minecode-mcp
|
|
@@ -27,18 +27,35 @@ Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
|
27
27
|
Requires-Dist: twine>=5.0; extra == 'dev'
|
|
28
28
|
Description-Content-Type: text/markdown
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
<!--
|
|
31
|
+
Absolute raw URLs, not relative paths: this file is also the PyPI long
|
|
32
|
+
description, and PyPI does not resolve repo-relative image paths.
|
|
33
|
+
Points at the 256x256 export and displays at 128, so the browser scales
|
|
34
|
+
DOWN rather than up. GitHub strips style attributes, so image-rendering
|
|
35
|
+
cannot be set -- downscaling is what keeps the block art from smearing.
|
|
36
|
+
-->
|
|
37
|
+
<div align="center">
|
|
31
38
|
|
|
32
|
-
|
|
39
|
+
<img src="https://github.com/AnCarsenat/minecode-mcp/raw/main/assets/readme/logo_256x256.png" alt="MineCode logo" width="128" height="128">
|
|
33
40
|
|
|
34
|
-
|
|
41
|
+
# MineCode MCP
|
|
42
|
+
|
|
43
|
+
**Version-accurate Minecraft data for AI assistants**
|
|
35
44
|
|
|
36
|
-
[](https://pypi.org/project/minecode-mcp/)
|
|
37
|
-
[](https://python.org)
|
|
45
|
+
[](https://pypi.org/project/minecode-mcp/)
|
|
46
|
+
[](https://python.org)
|
|
38
47
|
[](LICENSE)
|
|
48
|
+
[](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml)
|
|
49
|
+
|
|
50
|
+
[](https://mseep.ai/app/ancarsenat-minecode-mcp)
|
|
51
|
+
[](https://mseep.ai/app/5b3391b1-6799-4fd5-8496-308849e8a8c7)
|
|
52
|
+
|
|
53
|
+
</div>
|
|
39
54
|
|
|
40
55
|
MineCode is a **local** [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that gives AI assistants like **GitHub Copilot** and **Claude** real-time access to version-accurate Minecraft data, documentation, vanilla presets, and your Minecraft logs.
|
|
41
56
|
|
|
57
|
+
Written for a hackathon about MCP sponsored by dust, alpic, and others. Please star if you'd like to help out, and open issues for anything broken.
|
|
58
|
+
|
|
42
59
|

|
|
43
60
|
|
|
44
61
|
---
|
|
@@ -227,7 +244,8 @@ Configure your client (next section), then restart it. The client spawns the ser
|
|
|
227
244
|
| Symptom | Cause and fix |
|
|
228
245
|
|---------|---------------|
|
|
229
246
|
| `command not found: minecode` | The script isn't on PATH. Use `python -m minecode.server`, or check `pip show -f minecode-mcp` |
|
|
230
|
-
| `No module named minecode` | Wrong interpreter.
|
|
247
|
+
| `No module named minecode` | Wrong interpreter. The client's `python` isn't the one you installed into — classic with pipx and venv installs. Use `"command": "minecode"` in the client config, or the interpreter's absolute path |
|
|
248
|
+
| `Error while finding module specification for 'minecode'` | `-m minecode` is not a valid entry point. The module form is `-m minecode.server` |
|
|
231
249
|
| `AttributeError: 'Server' object has no attribute 'list_tools'` | You have mcp 2.x. Run `pip install "mcp>=1.25.0,<2"` |
|
|
232
250
|
| Server starts, client shows no tools | Client config points at a different Python or a stale install. Restart the client fully — most only read MCP config at startup |
|
|
233
251
|
| Everything hangs with no output | Expected when run directly, see above. If it happens *inside a client*, check the client's MCP logs |
|
|
@@ -260,6 +278,23 @@ Configure your client (next section), then restart it. The client spawns the ser
|
|
|
260
278
|
|
|
261
279
|
Add to **User Settings** (`Ctrl+Shift+P` → "MCP: Open User Configuration"), or create `.vscode/mcp.json` in your workspace:
|
|
262
280
|
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"servers": {
|
|
284
|
+
"minecode": {
|
|
285
|
+
"type": "stdio",
|
|
286
|
+
"command": "minecode",
|
|
287
|
+
"args": []
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"inputs": []
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
The `minecode` script is installed alongside the package and already points at the right interpreter, so this form works for pipx, venv, and `--user` installs alike.
|
|
295
|
+
|
|
296
|
+
The module form is equivalent **only if the package is importable from whichever `python` the client resolves**:
|
|
297
|
+
|
|
263
298
|
```json
|
|
264
299
|
{
|
|
265
300
|
"servers": {
|
|
@@ -273,7 +308,9 @@ Add to **User Settings** (`Ctrl+Shift+P` → "MCP: Open User Configuration"), or
|
|
|
273
308
|
}
|
|
274
309
|
```
|
|
275
310
|
|
|
276
|
-
>
|
|
311
|
+
> ⚠️ VS Code spawns the server with a bare `python` from `PATH` — **not** your selected Python interpreter, and not a pipx or venv environment. With a pipx install this fails with `No module named minecode`, since the package lives in pipx's own venv. Use `"command": "minecode"` above, or the absolute interpreter path from the next section.
|
|
312
|
+
|
|
313
|
+
> On Windows use `"command": "py"` for the module form. `py` is the Windows launcher and does not exist on macOS or Linux.
|
|
277
314
|
|
|
278
315
|
### If `minecode` isn't on PATH
|
|
279
316
|
|
|
@@ -590,25 +627,65 @@ That's it. No token is generated and nothing is pasted into GitHub.
|
|
|
590
627
|
|
|
591
628
|
### Releasing
|
|
592
629
|
|
|
630
|
+
> **⚠️ Step 1 is bumping the version in `pyproject.toml`. Do not skip it.**
|
|
631
|
+
>
|
|
632
|
+
> A version number on PyPI is **permanent**. Once `0.2.0` is published, that
|
|
633
|
+
> number can never be reused or overwritten — even if you delete the release.
|
|
634
|
+
> A bad publish can only be followed by a *new* version, never a replacement.
|
|
635
|
+
> Re-tagging an already-published version fails at the upload step.
|
|
636
|
+
|
|
637
|
+
**1. Bump the version.** Edit `version` in `pyproject.toml`:
|
|
638
|
+
|
|
639
|
+
```toml
|
|
640
|
+
version = "0.2.1" # was 0.2.0
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
Which digit to move:
|
|
644
|
+
|
|
645
|
+
| Change | Bump | Example |
|
|
646
|
+
|--------|------|---------|
|
|
647
|
+
| Bug fix, docs, internals — nothing user-visible breaks | patch | `0.2.0` → `0.2.1` |
|
|
648
|
+
| New tools, new parameters — existing setups keep working | minor | `0.2.0` → `0.3.0` |
|
|
649
|
+
| Tools removed or renamed, parameters removed — existing configs break | major-ish | `0.2.0` → `0.3.0` before 1.0, `1.x` → `2.0` after |
|
|
650
|
+
|
|
651
|
+
(`0.2.0` was a minor bump because it removed two tools and renamed one.)
|
|
652
|
+
|
|
653
|
+
**2. Commit, tag, and push.** The tag must be `v` + the exact version:
|
|
654
|
+
|
|
593
655
|
```bash
|
|
594
|
-
# 1. Bump the version in pyproject.toml, e.g. 0.1.9 -> 0.2.0
|
|
595
|
-
# 2. Commit, tag, push
|
|
596
656
|
git add pyproject.toml
|
|
597
|
-
git commit -m "Release 0.2.
|
|
598
|
-
git tag v0.2.
|
|
657
|
+
git commit -m "Release 0.2.1"
|
|
658
|
+
git tag v0.2.1
|
|
599
659
|
git push origin main --tags
|
|
600
660
|
```
|
|
601
661
|
|
|
602
|
-
The workflow
|
|
662
|
+
**3. Approve the deployment.** The workflow builds, then pauses. Go to the
|
|
663
|
+
**Actions** tab → the running **Publish to PyPI** run → **Review deployments**
|
|
664
|
+
→ tick `pypi` → **Approve and deploy**. GitHub also emails you an approve link.
|
|
665
|
+
|
|
666
|
+
Publishing takes about 30 seconds after approval.
|
|
667
|
+
|
|
668
|
+
#### What the workflow checks before it will publish
|
|
669
|
+
|
|
670
|
+
1. **The tag matches `pyproject.toml`** — this is the safety net for a forgotten bump. Tagging `v0.2.1` while `pyproject.toml` still says `0.2.0` fails the build with `Tag v0.2.1 does not match pyproject.toml version 0.2.0`, and nothing is published
|
|
671
|
+
2. Offline test suite passes
|
|
672
|
+
3. Wheel and sdist build
|
|
673
|
+
4. `twine check` on the metadata
|
|
674
|
+
5. The preprompt, config, and migration table are actually inside the wheel
|
|
675
|
+
|
|
676
|
+
If any of these fail, the approval button never appears — there is nothing to approve.
|
|
603
677
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
678
|
+
#### If you forgot to bump
|
|
679
|
+
|
|
680
|
+
The build fails at step 1 and nothing ships. Recover by deleting the tag, bumping properly, and re-tagging:
|
|
681
|
+
|
|
682
|
+
```bash
|
|
683
|
+
git tag -d v0.2.1
|
|
684
|
+
git push origin :refs/tags/v0.2.1
|
|
685
|
+
# bump pyproject.toml, commit, then tag again
|
|
686
|
+
```
|
|
610
687
|
|
|
611
|
-
|
|
688
|
+
This is safe precisely *because* nothing was published.
|
|
612
689
|
|
|
613
690
|
### Optional: TestPyPI first
|
|
614
691
|
|
|
@@ -1,15 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
<!--
|
|
2
|
+
Absolute raw URLs, not relative paths: this file is also the PyPI long
|
|
3
|
+
description, and PyPI does not resolve repo-relative image paths.
|
|
4
|
+
Points at the 256x256 export and displays at 128, so the browser scales
|
|
5
|
+
DOWN rather than up. GitHub strips style attributes, so image-rendering
|
|
6
|
+
cannot be set -- downscaling is what keeps the block art from smearing.
|
|
7
|
+
-->
|
|
8
|
+
<div align="center">
|
|
2
9
|
|
|
3
|
-
|
|
10
|
+
<img src="https://github.com/AnCarsenat/minecode-mcp/raw/main/assets/readme/logo_256x256.png" alt="MineCode logo" width="128" height="128">
|
|
4
11
|
|
|
5
|
-
|
|
12
|
+
# MineCode MCP
|
|
13
|
+
|
|
14
|
+
**Version-accurate Minecraft data for AI assistants**
|
|
6
15
|
|
|
7
|
-
[](https://pypi.org/project/minecode-mcp/)
|
|
8
|
-
[](https://python.org)
|
|
16
|
+
[](https://pypi.org/project/minecode-mcp/)
|
|
17
|
+
[](https://python.org)
|
|
9
18
|
[](LICENSE)
|
|
19
|
+
[](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml)
|
|
20
|
+
|
|
21
|
+
[](https://mseep.ai/app/ancarsenat-minecode-mcp)
|
|
22
|
+
[](https://mseep.ai/app/5b3391b1-6799-4fd5-8496-308849e8a8c7)
|
|
23
|
+
|
|
24
|
+
</div>
|
|
10
25
|
|
|
11
26
|
MineCode is a **local** [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that gives AI assistants like **GitHub Copilot** and **Claude** real-time access to version-accurate Minecraft data, documentation, vanilla presets, and your Minecraft logs.
|
|
12
27
|
|
|
28
|
+
Written for a hackathon about MCP sponsored by dust, alpic, and others. Please star if you'd like to help out, and open issues for anything broken.
|
|
29
|
+
|
|
13
30
|

|
|
14
31
|
|
|
15
32
|
---
|
|
@@ -198,7 +215,8 @@ Configure your client (next section), then restart it. The client spawns the ser
|
|
|
198
215
|
| Symptom | Cause and fix |
|
|
199
216
|
|---------|---------------|
|
|
200
217
|
| `command not found: minecode` | The script isn't on PATH. Use `python -m minecode.server`, or check `pip show -f minecode-mcp` |
|
|
201
|
-
| `No module named minecode` | Wrong interpreter.
|
|
218
|
+
| `No module named minecode` | Wrong interpreter. The client's `python` isn't the one you installed into — classic with pipx and venv installs. Use `"command": "minecode"` in the client config, or the interpreter's absolute path |
|
|
219
|
+
| `Error while finding module specification for 'minecode'` | `-m minecode` is not a valid entry point. The module form is `-m minecode.server` |
|
|
202
220
|
| `AttributeError: 'Server' object has no attribute 'list_tools'` | You have mcp 2.x. Run `pip install "mcp>=1.25.0,<2"` |
|
|
203
221
|
| Server starts, client shows no tools | Client config points at a different Python or a stale install. Restart the client fully — most only read MCP config at startup |
|
|
204
222
|
| Everything hangs with no output | Expected when run directly, see above. If it happens *inside a client*, check the client's MCP logs |
|
|
@@ -231,6 +249,23 @@ Configure your client (next section), then restart it. The client spawns the ser
|
|
|
231
249
|
|
|
232
250
|
Add to **User Settings** (`Ctrl+Shift+P` → "MCP: Open User Configuration"), or create `.vscode/mcp.json` in your workspace:
|
|
233
251
|
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"servers": {
|
|
255
|
+
"minecode": {
|
|
256
|
+
"type": "stdio",
|
|
257
|
+
"command": "minecode",
|
|
258
|
+
"args": []
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
"inputs": []
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
The `minecode` script is installed alongside the package and already points at the right interpreter, so this form works for pipx, venv, and `--user` installs alike.
|
|
266
|
+
|
|
267
|
+
The module form is equivalent **only if the package is importable from whichever `python` the client resolves**:
|
|
268
|
+
|
|
234
269
|
```json
|
|
235
270
|
{
|
|
236
271
|
"servers": {
|
|
@@ -244,7 +279,9 @@ Add to **User Settings** (`Ctrl+Shift+P` → "MCP: Open User Configuration"), or
|
|
|
244
279
|
}
|
|
245
280
|
```
|
|
246
281
|
|
|
247
|
-
>
|
|
282
|
+
> ⚠️ VS Code spawns the server with a bare `python` from `PATH` — **not** your selected Python interpreter, and not a pipx or venv environment. With a pipx install this fails with `No module named minecode`, since the package lives in pipx's own venv. Use `"command": "minecode"` above, or the absolute interpreter path from the next section.
|
|
283
|
+
|
|
284
|
+
> On Windows use `"command": "py"` for the module form. `py` is the Windows launcher and does not exist on macOS or Linux.
|
|
248
285
|
|
|
249
286
|
### If `minecode` isn't on PATH
|
|
250
287
|
|
|
@@ -561,25 +598,65 @@ That's it. No token is generated and nothing is pasted into GitHub.
|
|
|
561
598
|
|
|
562
599
|
### Releasing
|
|
563
600
|
|
|
601
|
+
> **⚠️ Step 1 is bumping the version in `pyproject.toml`. Do not skip it.**
|
|
602
|
+
>
|
|
603
|
+
> A version number on PyPI is **permanent**. Once `0.2.0` is published, that
|
|
604
|
+
> number can never be reused or overwritten — even if you delete the release.
|
|
605
|
+
> A bad publish can only be followed by a *new* version, never a replacement.
|
|
606
|
+
> Re-tagging an already-published version fails at the upload step.
|
|
607
|
+
|
|
608
|
+
**1. Bump the version.** Edit `version` in `pyproject.toml`:
|
|
609
|
+
|
|
610
|
+
```toml
|
|
611
|
+
version = "0.2.1" # was 0.2.0
|
|
612
|
+
```
|
|
613
|
+
|
|
614
|
+
Which digit to move:
|
|
615
|
+
|
|
616
|
+
| Change | Bump | Example |
|
|
617
|
+
|--------|------|---------|
|
|
618
|
+
| Bug fix, docs, internals — nothing user-visible breaks | patch | `0.2.0` → `0.2.1` |
|
|
619
|
+
| New tools, new parameters — existing setups keep working | minor | `0.2.0` → `0.3.0` |
|
|
620
|
+
| Tools removed or renamed, parameters removed — existing configs break | major-ish | `0.2.0` → `0.3.0` before 1.0, `1.x` → `2.0` after |
|
|
621
|
+
|
|
622
|
+
(`0.2.0` was a minor bump because it removed two tools and renamed one.)
|
|
623
|
+
|
|
624
|
+
**2. Commit, tag, and push.** The tag must be `v` + the exact version:
|
|
625
|
+
|
|
564
626
|
```bash
|
|
565
|
-
# 1. Bump the version in pyproject.toml, e.g. 0.1.9 -> 0.2.0
|
|
566
|
-
# 2. Commit, tag, push
|
|
567
627
|
git add pyproject.toml
|
|
568
|
-
git commit -m "Release 0.2.
|
|
569
|
-
git tag v0.2.
|
|
628
|
+
git commit -m "Release 0.2.1"
|
|
629
|
+
git tag v0.2.1
|
|
570
630
|
git push origin main --tags
|
|
571
631
|
```
|
|
572
632
|
|
|
573
|
-
The workflow
|
|
633
|
+
**3. Approve the deployment.** The workflow builds, then pauses. Go to the
|
|
634
|
+
**Actions** tab → the running **Publish to PyPI** run → **Review deployments**
|
|
635
|
+
→ tick `pypi` → **Approve and deploy**. GitHub also emails you an approve link.
|
|
636
|
+
|
|
637
|
+
Publishing takes about 30 seconds after approval.
|
|
638
|
+
|
|
639
|
+
#### What the workflow checks before it will publish
|
|
640
|
+
|
|
641
|
+
1. **The tag matches `pyproject.toml`** — this is the safety net for a forgotten bump. Tagging `v0.2.1` while `pyproject.toml` still says `0.2.0` fails the build with `Tag v0.2.1 does not match pyproject.toml version 0.2.0`, and nothing is published
|
|
642
|
+
2. Offline test suite passes
|
|
643
|
+
3. Wheel and sdist build
|
|
644
|
+
4. `twine check` on the metadata
|
|
645
|
+
5. The preprompt, config, and migration table are actually inside the wheel
|
|
646
|
+
|
|
647
|
+
If any of these fail, the approval button never appears — there is nothing to approve.
|
|
574
648
|
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
649
|
+
#### If you forgot to bump
|
|
650
|
+
|
|
651
|
+
The build fails at step 1 and nothing ships. Recover by deleting the tag, bumping properly, and re-tagging:
|
|
652
|
+
|
|
653
|
+
```bash
|
|
654
|
+
git tag -d v0.2.1
|
|
655
|
+
git push origin :refs/tags/v0.2.1
|
|
656
|
+
# bump pyproject.toml, commit, then tag again
|
|
657
|
+
```
|
|
581
658
|
|
|
582
|
-
|
|
659
|
+
This is safe precisely *because* nothing was published.
|
|
583
660
|
|
|
584
661
|
### Optional: TestPyPI first
|
|
585
662
|
|
|
@@ -4,9 +4,15 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "minecode-mcp"
|
|
7
|
-
|
|
7
|
+
# To release: bump this, commit, then tag with a matching "v" prefix.
|
|
8
|
+
# version = "0.2.1" -> git tag v0.2.1 && git push origin main --tags
|
|
9
|
+
# The publish workflow refuses to build if the tag and this value disagree,
|
|
10
|
+
# so a forgotten bump fails loudly instead of shipping a mislabelled release.
|
|
11
|
+
# PyPI version numbers are permanent -- a published version can never be
|
|
12
|
+
# replaced, only superseded. See "Releasing" in README.md.
|
|
13
|
+
version = "0.2.2"
|
|
8
14
|
description = "MCP Server for Minecraft datapack development with wiki, Spyglass, Misode, and Mojira integrations"
|
|
9
|
-
readme = "
|
|
15
|
+
readme = "README.md"
|
|
10
16
|
license = "MIT"
|
|
11
17
|
authors = [
|
|
12
18
|
{ name = "AnCarsenat" }
|
|
@@ -65,7 +71,7 @@ artifacts = [
|
|
|
65
71
|
include = [
|
|
66
72
|
"minecode/",
|
|
67
73
|
"tests/",
|
|
68
|
-
"
|
|
74
|
+
"README.md",
|
|
69
75
|
"LICENSE",
|
|
70
76
|
"example/",
|
|
71
77
|
]
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
---
|
|
3
|
-
|
|
4
|
-
**Release**
|
|
5
|
-
- **Script**: `scripts/release.ps1` — full release workflow (clean, bump, build, push, publish).
|
|
6
|
-
- **Token**: `pip_token.txt` or environment variable `PYPI_API_TOKEN` (the script sets `TWINE_USERNAME=__token__` and `TWINE_PASSWORD` from the token).
|
|
7
|
-
- **Behavior**: removes `dist/`, `build/` and any `*.egg-info`, bumps the patch number in `pyproject.toml` (when `-Bump`), commits, tags `vX.Y.Z`, pushes, builds sdist/wheel, and uploads the release.
|
|
8
|
-
- **Python**: prefers `venv\Scripts\python.exe` if present, otherwise uses `python` on PATH.
|
|
9
|
-
- **Examples**:
|
|
10
|
-
|
|
11
|
-
```powershell
|
|
12
|
-
# Bump, build, push tag, and publish
|
|
13
|
-
.\scripts\release.ps1 -Bump -Publish
|
|
14
|
-
|
|
15
|
-
# Build and publish without bump
|
|
16
|
-
.\scripts\release.ps1 -Publish
|
|
17
|
-
|
|
18
|
-
# Just build (no bump, no publish)
|
|
19
|
-
.\scripts\release.ps1
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
- **Notes**: the older `scripts/bump_version.*` utilities were consolidated into `release.ps1`; keep your PyPI API token in `pip_token.txt` or set `PYPI_API_TOKEN` for CI.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|