datapack-emulator 0.2.0__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 (207) hide show
  1. datapack_emulator-0.2.0/CONTRIBUTING.md +87 -0
  2. datapack_emulator-0.2.0/LICENSE +674 -0
  3. datapack_emulator-0.2.0/MANIFEST.in +15 -0
  4. datapack_emulator-0.2.0/PKG-INFO +183 -0
  5. datapack_emulator-0.2.0/docs/README.md +19 -0
  6. datapack_emulator-0.2.0/docs/agents.md +269 -0
  7. datapack_emulator-0.2.0/docs/architecture.md +181 -0
  8. datapack_emulator-0.2.0/docs/cli.md +690 -0
  9. datapack_emulator-0.2.0/docs/costs.md +50 -0
  10. datapack_emulator-0.2.0/docs/emulation.md +324 -0
  11. datapack_emulator-0.2.0/docs/engine.md +103 -0
  12. datapack_emulator-0.2.0/docs/getting-started.md +82 -0
  13. datapack_emulator-0.2.0/docs/plans.md +78 -0
  14. datapack_emulator-0.2.0/docs/projects.md +158 -0
  15. datapack_emulator-0.2.0/docs/releases.md +165 -0
  16. datapack_emulator-0.2.0/docs/ui.md +436 -0
  17. datapack_emulator-0.2.0/docs/vanilla-assets.md +96 -0
  18. datapack_emulator-0.2.0/docs/versions.md +149 -0
  19. datapack_emulator-0.2.0/packaging/datapack-emulator.spec +92 -0
  20. datapack_emulator-0.2.0/pyproject.toml +110 -0
  21. datapack_emulator-0.2.0/readme.md +141 -0
  22. datapack_emulator-0.2.0/requirements-dev.txt +2 -0
  23. datapack_emulator-0.2.0/requirements.txt +6 -0
  24. datapack_emulator-0.2.0/samples/hat/data/hat/function/load.mcfunction +2 -0
  25. datapack_emulator-0.2.0/samples/hat/data/hat/function/tick.mcfunction +14 -0
  26. datapack_emulator-0.2.0/samples/hat/data/hat/functions/load.mcfunction +2 -0
  27. datapack_emulator-0.2.0/samples/hat/data/hat/functions/tick.mcfunction +14 -0
  28. datapack_emulator-0.2.0/samples/hat/data/minecraft/tags/function/load.json +5 -0
  29. datapack_emulator-0.2.0/samples/hat/data/minecraft/tags/function/tick.json +5 -0
  30. datapack_emulator-0.2.0/samples/hat/data/minecraft/tags/functions/load.json +5 -0
  31. datapack_emulator-0.2.0/samples/hat/data/minecraft/tags/functions/tick.json +5 -0
  32. datapack_emulator-0.2.0/samples/hat/pack.mcmeta +33 -0
  33. datapack_emulator-0.2.0/samples/hat/pack.png +0 -0
  34. datapack_emulator-0.2.0/samples/hat_v2/data/hat/functions/load.mcfunction +2 -0
  35. datapack_emulator-0.2.0/samples/hat_v2/data/hat/functions/swap_legacy.mcfunction +15 -0
  36. datapack_emulator-0.2.0/samples/hat_v2/data/hat/functions/tick.mcfunction +11 -0
  37. datapack_emulator-0.2.0/samples/hat_v2/data/hat/functions/tick_legacy.mcfunction +6 -0
  38. datapack_emulator-0.2.0/samples/hat_v2/data/hat/functions/tick_modern.mcfunction +7 -0
  39. datapack_emulator-0.2.0/samples/hat_v2/data/minecraft/loot_tables/blocks/shulker_box.json +70 -0
  40. datapack_emulator-0.2.0/samples/hat_v2/data/minecraft/tags/functions/load.json +5 -0
  41. datapack_emulator-0.2.0/samples/hat_v2/data/minecraft/tags/functions/tick.json +5 -0
  42. datapack_emulator-0.2.0/samples/hat_v2/overlay_18/data/hat/functions/tick.mcfunction +9 -0
  43. datapack_emulator-0.2.0/samples/hat_v2/overlay_41/data/minecraft/loot_tables/blocks/shulker_box.json +28 -0
  44. datapack_emulator-0.2.0/samples/hat_v2/overlay_48/data/hat/function/load.mcfunction +2 -0
  45. datapack_emulator-0.2.0/samples/hat_v2/overlay_48/data/hat/function/tick.mcfunction +14 -0
  46. datapack_emulator-0.2.0/samples/hat_v2/overlay_48/data/minecraft/loot_table/blocks/shulker_box.json +28 -0
  47. datapack_emulator-0.2.0/samples/hat_v2/overlay_48/data/minecraft/tags/function/load.json +5 -0
  48. datapack_emulator-0.2.0/samples/hat_v2/overlay_48/data/minecraft/tags/function/tick.json +5 -0
  49. datapack_emulator-0.2.0/samples/hat_v2/pack.mcmeta +64 -0
  50. datapack_emulator-0.2.0/samples/hat_v2/pack.png +0 -0
  51. datapack_emulator-0.2.0/setup.cfg +4 -0
  52. datapack_emulator-0.2.0/src/datapack_emulator/__init__.py +19 -0
  53. datapack_emulator-0.2.0/src/datapack_emulator/__main__.py +5 -0
  54. datapack_emulator-0.2.0/src/datapack_emulator/agent.py +758 -0
  55. datapack_emulator-0.2.0/src/datapack_emulator/app.py +114 -0
  56. datapack_emulator-0.2.0/src/datapack_emulator/cli/__init__.py +82 -0
  57. datapack_emulator-0.2.0/src/datapack_emulator/cli/__main__.py +3 -0
  58. datapack_emulator-0.2.0/src/datapack_emulator/cli/check.py +166 -0
  59. datapack_emulator-0.2.0/src/datapack_emulator/cli/common.py +406 -0
  60. datapack_emulator-0.2.0/src/datapack_emulator/cli/debug.py +330 -0
  61. datapack_emulator-0.2.0/src/datapack_emulator/cli/inspect.py +480 -0
  62. datapack_emulator-0.2.0/src/datapack_emulator/cli/jars.py +62 -0
  63. datapack_emulator-0.2.0/src/datapack_emulator/cli/junit.py +91 -0
  64. datapack_emulator-0.2.0/src/datapack_emulator/cli/projects.py +617 -0
  65. datapack_emulator-0.2.0/src/datapack_emulator/cli/runs.py +776 -0
  66. datapack_emulator-0.2.0/src/datapack_emulator/cli/schemas.py +192 -0
  67. datapack_emulator-0.2.0/src/datapack_emulator/cli/world.py +1134 -0
  68. datapack_emulator-0.2.0/src/datapack_emulator/emulator/__init__.py +87 -0
  69. datapack_emulator-0.2.0/src/datapack_emulator/emulator/__main__.py +9 -0
  70. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/__init__.py +4 -0
  71. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/completion.py +262 -0
  72. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/explain.py +413 -0
  73. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/graph.py +272 -0
  74. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/inspector.py +226 -0
  75. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/problems.py +704 -0
  76. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/profiler.py +611 -0
  77. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/registry_names.py +200 -0
  78. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/rename.py +308 -0
  79. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/schema.py +580 -0
  80. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/search.py +47 -0
  81. datapack_emulator-0.2.0/src/datapack_emulator/emulator/analysis/world_view.py +311 -0
  82. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/__init__.py +21 -0
  83. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/blocks.py +456 -0
  84. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/bossbar.py +188 -0
  85. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/chat.py +131 -0
  86. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/conditions.py +251 -0
  87. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/control.py +106 -0
  88. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/data.py +290 -0
  89. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/entities.py +167 -0
  90. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/execute.py +380 -0
  91. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/handlers.py +129 -0
  92. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/helpers.py +107 -0
  93. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/items.py +761 -0
  94. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/living.py +566 -0
  95. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/misc.py +12 -0
  96. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/parser.py +406 -0
  97. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/players.py +469 -0
  98. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/registry.py +96 -0
  99. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/result.py +26 -0
  100. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/scoreboard.py +506 -0
  101. datapack_emulator-0.2.0/src/datapack_emulator/emulator/commands/state.py +584 -0
  102. datapack_emulator-0.2.0/src/datapack_emulator/emulator/common.py +560 -0
  103. datapack_emulator-0.2.0/src/datapack_emulator/emulator/costs.py +169 -0
  104. datapack_emulator-0.2.0/src/datapack_emulator/emulator/datapack.py +898 -0
  105. datapack_emulator-0.2.0/src/datapack_emulator/emulator/engine.py +449 -0
  106. datapack_emulator-0.2.0/src/datapack_emulator/emulator/namespace.py +216 -0
  107. datapack_emulator-0.2.0/src/datapack_emulator/emulator/resources.py +196 -0
  108. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/__init__.py +6 -0
  109. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/advancements.py +208 -0
  110. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/blocks.py +438 -0
  111. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/context.py +115 -0
  112. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/debugger.py +478 -0
  113. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/emulator.py +556 -0
  114. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/inventory.py +689 -0
  115. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/library.py +302 -0
  116. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/living.py +735 -0
  117. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/loot.py +709 -0
  118. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/messages.py +606 -0
  119. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/output.py +219 -0
  120. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/predicates.py +673 -0
  121. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/snapshot.py +264 -0
  122. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/state.py +138 -0
  123. datapack_emulator-0.2.0/src/datapack_emulator/emulator/runtime/world.py +647 -0
  124. datapack_emulator-0.2.0/src/datapack_emulator/emulator/testing.py +564 -0
  125. datapack_emulator-0.2.0/src/datapack_emulator/emulator/vanilla.py +468 -0
  126. datapack_emulator-0.2.0/src/datapack_emulator/emulator/version_data.py +215 -0
  127. datapack_emulator-0.2.0/src/datapack_emulator/emulator/versions.py +270 -0
  128. datapack_emulator-0.2.0/src/datapack_emulator/project.py +479 -0
  129. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/data/minecraft/tags/function/load.json +3 -0
  130. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/data/minecraft/tags/function/tick.json +3 -0
  131. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/data/starter/function/every_five_seconds.mcfunction +2 -0
  132. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/data/starter/function/load.mcfunction +3 -0
  133. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/data/starter/function/tick.mcfunction +3 -0
  134. datapack_emulator-0.2.0/src/datapack_emulator/samples/starter/pack.mcmeta +12 -0
  135. datapack_emulator-0.2.0/src/datapack_emulator/settings/__init__.py +3 -0
  136. datapack_emulator-0.2.0/src/datapack_emulator/settings/main.py +79 -0
  137. datapack_emulator-0.2.0/src/datapack_emulator/window/__init__.py +4 -0
  138. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/__init__.py +40 -0
  139. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/base.py +29 -0
  140. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/console.py +138 -0
  141. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/datapacks.py +330 -0
  142. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/debug.py +536 -0
  143. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/editor.py +324 -0
  144. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/environment.py +365 -0
  145. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/jars.py +84 -0
  146. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/logs.py +211 -0
  147. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/navigation.py +495 -0
  148. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/notes.py +53 -0
  149. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/problems.py +215 -0
  150. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/projects.py +236 -0
  151. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/runs.py +389 -0
  152. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/session.py +242 -0
  153. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/snapshots.py +184 -0
  154. datapack_emulator-0.2.0/src/datapack_emulator/window/controllers/world.py +394 -0
  155. datapack_emulator-0.2.0/src/datapack_emulator/window/download.ui +124 -0
  156. datapack_emulator-0.2.0/src/datapack_emulator/window/download_dialog.py +186 -0
  157. datapack_emulator-0.2.0/src/datapack_emulator/window/engine.ui +467 -0
  158. datapack_emulator-0.2.0/src/datapack_emulator/window/engine_window.py +460 -0
  159. datapack_emulator-0.2.0/src/datapack_emulator/window/main.py +383 -0
  160. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/__init__.py +50 -0
  161. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/explorer.py +97 -0
  162. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/graph.py +237 -0
  163. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/highlight.py +165 -0
  164. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/logs.py +203 -0
  165. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/profile.py +73 -0
  166. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/results.py +121 -0
  167. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/source.py +236 -0
  168. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/uiloader.py +42 -0
  169. datapack_emulator-0.2.0/src/datapack_emulator/window/panels/world.py +250 -0
  170. datapack_emulator-0.2.0/src/datapack_emulator/window/score_graph.py +62 -0
  171. datapack_emulator-0.2.0/src/datapack_emulator/window/score_graph.ui +62 -0
  172. datapack_emulator-0.2.0/src/datapack_emulator/window/search.ui +76 -0
  173. datapack_emulator-0.2.0/src/datapack_emulator/window/search_dialog.py +80 -0
  174. datapack_emulator-0.2.0/src/datapack_emulator/window/window.ui +2916 -0
  175. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/PKG-INFO +183 -0
  176. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/SOURCES.txt +205 -0
  177. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/dependency_links.txt +1 -0
  178. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/entry_points.txt +3 -0
  179. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/requires.txt +16 -0
  180. datapack_emulator-0.2.0/src/datapack_emulator.egg-info/top_level.txt +1 -0
  181. datapack_emulator-0.2.0/tests/conftest.py +123 -0
  182. datapack_emulator-0.2.0/tests/test_agent.py +236 -0
  183. datapack_emulator-0.2.0/tests/test_blocks.py +455 -0
  184. datapack_emulator-0.2.0/tests/test_cli.py +1528 -0
  185. datapack_emulator-0.2.0/tests/test_conditions.py +540 -0
  186. datapack_emulator-0.2.0/tests/test_datapack.py +169 -0
  187. datapack_emulator-0.2.0/tests/test_datapack_set.py +162 -0
  188. datapack_emulator-0.2.0/tests/test_debugger.py +187 -0
  189. datapack_emulator-0.2.0/tests/test_editing.py +373 -0
  190. datapack_emulator-0.2.0/tests/test_emulator.py +466 -0
  191. datapack_emulator-0.2.0/tests/test_engine_and_graph.py +150 -0
  192. datapack_emulator-0.2.0/tests/test_explain.py +64 -0
  193. datapack_emulator-0.2.0/tests/test_inventory.py +363 -0
  194. datapack_emulator-0.2.0/tests/test_living.py +337 -0
  195. datapack_emulator-0.2.0/tests/test_parser.py +96 -0
  196. datapack_emulator-0.2.0/tests/test_problems.py +246 -0
  197. datapack_emulator-0.2.0/tests/test_project.py +277 -0
  198. datapack_emulator-0.2.0/tests/test_regressions.py +749 -0
  199. datapack_emulator-0.2.0/tests/test_samples.py +70 -0
  200. datapack_emulator-0.2.0/tests/test_schema.py +365 -0
  201. datapack_emulator-0.2.0/tests/test_snapshots.py +156 -0
  202. datapack_emulator-0.2.0/tests/test_state.py +281 -0
  203. datapack_emulator-0.2.0/tests/test_testing.py +260 -0
  204. datapack_emulator-0.2.0/tests/test_vanilla.py +122 -0
  205. datapack_emulator-0.2.0/tests/test_versions.py +70 -0
  206. datapack_emulator-0.2.0/tests/test_window.py +2154 -0
  207. datapack_emulator-0.2.0/tools/generate_version_data.py +184 -0
@@ -0,0 +1,87 @@
1
+ # Contributing
2
+
3
+ Contributions are welcome — bug reports, new command handlers, UI work, docs.
4
+
5
+ ## Setup
6
+
7
+ ```sh
8
+ git clone git@github.com:AnCarsenat/Datapack-Emulator.git && cd Datapack-Emulator
9
+ python -m venv .venv
10
+ .venv/bin/pip install -r requirements-dev.txt # editable install with the gui and dev extras
11
+ .venv/bin/datapack-emulator
12
+ ```
13
+
14
+ The package is `datapack_emulator`, in `src/` (the standard src layout).
15
+ Imports are absolute: `from datapack_emulator.emulator import Datapack`. The
16
+ editable install means edits take effect without reinstalling; pytest finds
17
+ the package without it.
18
+
19
+ ## Ground rules
20
+
21
+ Read [docs/architecture.md](docs/architecture.md) first. In short:
22
+
23
+ 1. **Version logic goes through `src/datapack_emulator/emulator/versions.py`.** Don't compare
24
+ version strings or pack formats anywhere else.
25
+ 2. **Don't hardcode base-game facts.** Command availability comes from the
26
+ generated `version_data.py`; ids, tags and message strings come from a
27
+ client jar via `src/datapack_emulator/emulator/vanilla.py`.
28
+ 3. **Never edit `src/datapack_emulator/emulator/version_data.py` by hand.** Regenerate it with
29
+ `python tools/generate_version_data.py` and commit the result.
30
+ 4. **All layout lives in `src/datapack_emulator/window/*.ui`.** Add widgets and actions in Qt
31
+ Designer, then find them by object name in Python.
32
+ 5. **Keep `src/datapack_emulator/emulator` free of Qt.**
33
+ 6. **Keep game output and diagnostics apart.** A handler reports what
34
+ Minecraft would say with `context.game_error("<real.translation.key>", …)`;
35
+ what the emulator notices goes through `context.note(…)`.
36
+ 7. **Keep the command line as capable as the window.** A window feature
37
+ comes with its `datapack-emulator-cli` subcommand or option; shared logic
38
+ goes in `emulator/` or `project.py`, not in a controller.
39
+ 8. **Say when something is a model.** Cost numbers and anything approximated
40
+ must be labelled as such in code and docs.
41
+
42
+ ## Adding a command
43
+
44
+ 1. Write `cmd_<name>(command, context) -> CommandResult` in the module of
45
+ its group under `src/datapack_emulator/emulator/commands/` (`chat.py`,
46
+ `scoreboard.py`, `entities.py`, `data.py`, `execute.py`, `items.py`, … —
47
+ shared helpers are in `helpers.py`); report failures with vanilla
48
+ translation keys (add missing ones to `runtime/messages.py`).
49
+ 2. Register it in `HANDLERS` (`commands/handlers.py`). Availability per
50
+ version is already known.
51
+ 3. Give it a cost in `src/datapack_emulator/emulator/costs.py` if the default does not fit.
52
+ 4. Document it in [docs/emulation.md](docs/emulation.md).
53
+
54
+ ## Before opening a pull request
55
+
56
+ ```sh
57
+ .venv/bin/ruff check .
58
+ .venv/bin/ruff format --check .
59
+ .venv/bin/mypy # the Qt-free code (see pyproject.toml)
60
+ .venv/bin/coverage run -m pytest && .venv/bin/coverage report
61
+ ```
62
+
63
+ CI runs the same checks (plus the window tests offscreen and a CLI smoke run)
64
+ on every pull request, and puts the coverage table in the run's summary.
65
+ Every Monday a scheduled workflow regenerates `version_data.py` and opens a
66
+ pull request when a release or pre-release changed it (a draft when the
67
+ tests fail on the new table). The generator writes the file exactly as ruff
68
+ would format it, so a refresh differs only where the data did.
69
+
70
+ * lint and format clean, tests green
71
+ * new behaviour comes with a test in `tests/` — the fixtures in
72
+ `tests/conftest.py` build synthetic datapacks and a synthetic client jar,
73
+ so no test needs the network or a Minecraft install
74
+ * if you touched the window, launch it and exercise what you changed
75
+ * update `docs/` and `readme.md` in the same pull request whenever behaviour,
76
+ options or commands change
77
+ * one topic per pull request and per commit; commit messages follow
78
+ [Conventional Commits](https://www.conventionalcommits.org/)
79
+ (`feat`, `fix`, `docs`, `refactor`, `test`, `ci`, `chore`)
80
+ * branch from `main`, open a pull request, fill in the template
81
+
82
+ ## Reporting a bug
83
+
84
+ Use the *Bug report* issue template. It asks for the Minecraft version
85
+ selected, whether a client jar was loaded, the smallest datapack that
86
+ reproduces it, and the output of
87
+ `datapack-emulator-cli run <pack> --version <v> --level debug`.