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.
Files changed (52) hide show
  1. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/PKG-INFO +97 -20
  2. minecode_mcp-0.2.0/readme.md → minecode_mcp-0.2.2/README.md +96 -19
  3. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/pyproject.toml +9 -3
  4. minecode_mcp-0.2.0/scripts/readme.md +0 -22
  5. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/.gitignore +0 -0
  6. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/LICENSE +0 -0
  7. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/README.md +0 -0
  8. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/dimension/crystal_void.json +0 -0
  9. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/dimension_type/crystal_void.json +0 -0
  10. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/build_tower.mcfunction +0 -0
  11. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/give_kit.mcfunction +0 -0
  12. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/help.mcfunction +0 -0
  13. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/load.mcfunction +0 -0
  14. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/return.mcfunction +0 -0
  15. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/spawn_boss.mcfunction +0 -0
  16. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/teleport.mcfunction +0 -0
  17. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/function/tick.mcfunction +0 -0
  18. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/biome/crystal_plains.json +0 -0
  19. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/amethyst_clusters.json +0 -0
  20. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/crystal_spikes.json +0 -0
  21. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/ore_crystal_diamond.json +0 -0
  22. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/configured_feature/ore_crystal_emerald.json +0 -0
  23. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/noise_settings/crystal_void.json +0 -0
  24. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/amethyst_clusters.json +0 -0
  25. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/crystal_spikes.json +0 -0
  26. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/ore_crystal_diamond.json +0 -0
  27. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/crystal/worldgen/placed_feature/ore_crystal_emerald.json +0 -0
  28. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/minecraft/tags/function/load.json +0 -0
  29. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/data/minecraft/tags/function/tick.json +0 -0
  30. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/example/crystal_dimension/pack.mcmeta +0 -0
  31. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/__init__.py +0 -0
  32. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/brigadier.py +0 -0
  33. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/cache.py +0 -0
  34. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/config/config.json +0 -0
  35. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/config/prompt_config.json +0 -0
  36. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/handlers.py +0 -0
  37. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/knowledge/__init__.py +0 -0
  38. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/knowledge/migrations.json +0 -0
  39. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/packmeta.py +0 -0
  40. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/preprompts/assistant_preprompt.txt +0 -0
  41. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/__init__.py +0 -0
  42. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/minecraft_logs.py +0 -0
  43. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/minecraftwiki.py +0 -0
  44. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/misode.py +0 -0
  45. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/mojira.py +0 -0
  46. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/scrappers/spyglass.py +0 -0
  47. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/server.py +0 -0
  48. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/minecode/tools.py +0 -0
  49. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_knowledge.py +0 -0
  50. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_live.py +0 -0
  51. {minecode_mcp-0.2.0 → minecode_mcp-0.2.2}/tests/test_registry.py +0 -0
  52. {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.0
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
- # 🎮 MineCode MCP
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
- **MCP Server for Minecraft Datapack Development**
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
- 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.
41
+ # MineCode MCP
42
+
43
+ **Version-accurate Minecraft data for AI assistants**
35
44
 
36
- [![PyPI](https://img.shields.io/pypi/v/minecode-mcp)](https://pypi.org/project/minecode-mcp/)
37
- [![Python](https://img.shields.io/badge/Python-3.10+-blue)](https://python.org)
45
+ [![PyPI](https://img.shields.io/pypi/v/minecode-mcp?logo=pypi&logoColor=white)](https://pypi.org/project/minecode-mcp/)
46
+ [![Python](https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white)](https://python.org)
38
47
  [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)
48
+ [![Tests](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml)
49
+
50
+ [![MseeP.ai Security Assessment](https://mseep.net/pr/ancarsenat-minecode-mcp-badge.png)](https://mseep.ai/app/ancarsenat-minecode-mcp)
51
+ [![Verified on MseeP](https://mseep.ai/badge.svg)](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
  ![example](https://github.com/AnCarsenat/minecode-mcp/raw/main/assets/readme/example6.png)
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. Use the same Python you installed into — in a venv, use its absolute path in the client config |
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
- > On Windows use `"command": "py"`. `py` is the Windows launcher and does not exist on macOS or Linux.
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.0"
598
- git tag v0.2.0
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 fires on the tag and will:
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
- 1. Verify the tag matches `pyproject.toml` (a mismatch fails the build rather than shipping a mislabelled release)
605
- 2. Run the offline test suite
606
- 3. Build the wheel and sdist
607
- 4. Check the metadata with `twine check`
608
- 5. Verify the preprompt, config, and migration table are actually inside the wheel
609
- 6. Publish to PyPI
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
- If you enabled required reviewers, approve the run in the **Actions** tab.
688
+ This is safe precisely *because* nothing was published.
612
689
 
613
690
  ### Optional: TestPyPI first
614
691
 
@@ -1,15 +1,32 @@
1
- # 🎮 MineCode MCP
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
- **MCP Server for Minecraft Datapack Development**
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
- 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.
12
+ # MineCode MCP
13
+
14
+ **Version-accurate Minecraft data for AI assistants**
6
15
 
7
- [![PyPI](https://img.shields.io/pypi/v/minecode-mcp)](https://pypi.org/project/minecode-mcp/)
8
- [![Python](https://img.shields.io/badge/Python-3.10+-blue)](https://python.org)
16
+ [![PyPI](https://img.shields.io/pypi/v/minecode-mcp?logo=pypi&logoColor=white)](https://pypi.org/project/minecode-mcp/)
17
+ [![Python](https://img.shields.io/badge/Python-3.10+-blue?logo=python&logoColor=white)](https://python.org)
9
18
  [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)
19
+ [![Tests](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml/badge.svg)](https://github.com/AnCarsenat/minecode-mcp/actions/workflows/test.yml)
20
+
21
+ [![MseeP.ai Security Assessment](https://mseep.net/pr/ancarsenat-minecode-mcp-badge.png)](https://mseep.ai/app/ancarsenat-minecode-mcp)
22
+ [![Verified on MseeP](https://mseep.ai/badge.svg)](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
  ![example](https://github.com/AnCarsenat/minecode-mcp/raw/main/assets/readme/example6.png)
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. Use the same Python you installed into — in a venv, use its absolute path in the client config |
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
- > On Windows use `"command": "py"`. `py` is the Windows launcher and does not exist on macOS or Linux.
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.0"
569
- git tag v0.2.0
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 fires on the tag and will:
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
- 1. Verify the tag matches `pyproject.toml` (a mismatch fails the build rather than shipping a mislabelled release)
576
- 2. Run the offline test suite
577
- 3. Build the wheel and sdist
578
- 4. Check the metadata with `twine check`
579
- 5. Verify the preprompt, config, and migration table are actually inside the wheel
580
- 6. Publish to PyPI
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
- If you enabled required reviewers, approve the run in the **Actions** tab.
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
- version = "0.2.0"
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 = "readme.md"
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
- "readme.md",
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