morx-gms2-mcp 0.4.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.
- morx_gms2_mcp-0.4.0/.github/workflows/release.yml +63 -0
- morx_gms2_mcp-0.4.0/.github/workflows/tests.yml +23 -0
- morx_gms2_mcp-0.4.0/.gitignore +22 -0
- morx_gms2_mcp-0.4.0/CHANGELOG.md +62 -0
- morx_gms2_mcp-0.4.0/CONTRIBUTING.md +41 -0
- morx_gms2_mcp-0.4.0/LICENSE +21 -0
- morx_gms2_mcp-0.4.0/MANIFEST.in +8 -0
- morx_gms2_mcp-0.4.0/PKG-INFO +404 -0
- morx_gms2_mcp-0.4.0/README.md +378 -0
- morx_gms2_mcp-0.4.0/SECURITY.md +31 -0
- morx_gms2_mcp-0.4.0/examples/check_connection.py +46 -0
- morx_gms2_mcp-0.4.0/examples/claude.mcp.json +11 -0
- morx_gms2_mcp-0.4.0/examples/codex.config.toml +9 -0
- morx_gms2_mcp-0.4.0/examples/create_demo.py +118 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/__init__.py +2 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/__main__.py +3 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/animation.py +117 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/cli.py +98 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/display.py +98 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/resources.py +1007 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/runtime.py +727 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/runtime_bridge.py +267 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/schemas.py +136 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/server.py +366 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/storage.py +275 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/validation.py +232 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp/win_mouse.py +241 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/PKG-INFO +404 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/SOURCES.txt +42 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/dependency_links.txt +1 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/entry_points.txt +2 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/requires.txt +2 -0
- morx_gms2_mcp-0.4.0/morx_gms2_mcp.egg-info/top_level.txt +1 -0
- morx_gms2_mcp-0.4.0/pyproject.toml +37 -0
- morx_gms2_mcp-0.4.0/scripts/build_release.py +34 -0
- morx_gms2_mcp-0.4.0/scripts/check_public_files.py +92 -0
- morx_gms2_mcp-0.4.0/setup.cfg +4 -0
- morx_gms2_mcp-0.4.0/tests/__init__.py +0 -0
- morx_gms2_mcp-0.4.0/tests/test_core.py +112 -0
- morx_gms2_mcp-0.4.0/tests/test_display.py +248 -0
- morx_gms2_mcp-0.4.0/tests/test_operations.py +250 -0
- morx_gms2_mcp-0.4.0/tests/test_protocol.py +131 -0
- morx_gms2_mcp-0.4.0/tests/test_runtime.py +558 -0
- morx_gms2_mcp-0.4.0/tests/test_sprites.py +220 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
name: release
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ['v*']
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
jobs:
|
|
9
|
+
build:
|
|
10
|
+
if: github.repository == 'MKTLMORX/morx-gms2-mcp'
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: '3.12'
|
|
17
|
+
- run: python -m pip install build
|
|
18
|
+
- name: Verify tag matches package version
|
|
19
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
20
|
+
run: |
|
|
21
|
+
python - <<'PY'
|
|
22
|
+
import os
|
|
23
|
+
import pathlib
|
|
24
|
+
import re
|
|
25
|
+
source = pathlib.Path('morx_gms2_mcp/__init__.py').read_text(encoding='utf-8')
|
|
26
|
+
version = re.search(r"__version__\s*=\s*['\"]([^'\"]+)", source).group(1)
|
|
27
|
+
tag = os.environ['GITHUB_REF_NAME']
|
|
28
|
+
if tag != 'v' + version:
|
|
29
|
+
raise SystemExit(f'tag {tag} does not match package version {version}')
|
|
30
|
+
PY
|
|
31
|
+
- run: python -m build
|
|
32
|
+
- uses: actions/upload-artifact@v4
|
|
33
|
+
with:
|
|
34
|
+
name: dist
|
|
35
|
+
path: dist/
|
|
36
|
+
publish:
|
|
37
|
+
needs: build
|
|
38
|
+
if: github.repository == 'MKTLMORX/morx-gms2-mcp'
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
permissions:
|
|
41
|
+
id-token: write
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/download-artifact@v4
|
|
44
|
+
with:
|
|
45
|
+
name: dist
|
|
46
|
+
path: dist/
|
|
47
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
48
|
+
with:
|
|
49
|
+
packages-dir: dist/
|
|
50
|
+
github-release:
|
|
51
|
+
needs: publish
|
|
52
|
+
if: github.repository == 'MKTLMORX/morx-gms2-mcp' && startsWith(github.ref, 'refs/tags/')
|
|
53
|
+
runs-on: ubuntu-latest
|
|
54
|
+
permissions:
|
|
55
|
+
contents: write
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/download-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: dist
|
|
60
|
+
path: dist/
|
|
61
|
+
- env:
|
|
62
|
+
GH_TOKEN: ${{ github.token }}
|
|
63
|
+
run: gh release create "${{ github.ref_name }}" dist/* --generate-notes --verify-tag
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
windows:
|
|
7
|
+
runs-on: windows-latest
|
|
8
|
+
strategy:
|
|
9
|
+
fail-fast: false
|
|
10
|
+
matrix:
|
|
11
|
+
python: ['3.10', '3.12']
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
fetch-depth: 0
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: ${{ matrix.python }}
|
|
19
|
+
- run: python -m pip install . build
|
|
20
|
+
- run: python scripts/check_public_files.py
|
|
21
|
+
- run: python -m unittest discover -s tests -t . -v
|
|
22
|
+
- run: python -m build
|
|
23
|
+
- run: python scripts/build_release.py
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*.egg-info/
|
|
4
|
+
.venv/
|
|
5
|
+
build/
|
|
6
|
+
dist/
|
|
7
|
+
.codex/
|
|
8
|
+
.mcp.json
|
|
9
|
+
.mcp-demo-inputs/
|
|
10
|
+
.env
|
|
11
|
+
.env.*
|
|
12
|
+
!.env.example
|
|
13
|
+
.claude/
|
|
14
|
+
CLAUDE.local.md
|
|
15
|
+
*.pem
|
|
16
|
+
*.key
|
|
17
|
+
*.p12
|
|
18
|
+
*.pfx
|
|
19
|
+
*.log
|
|
20
|
+
*.stackdump
|
|
21
|
+
.mcp-backups/
|
|
22
|
+
.gm_cache/
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 更新记录
|
|
2
|
+
|
|
3
|
+
## 0.4.0 — 2026-10-17
|
|
4
|
+
|
|
5
|
+
- 运行桥接新增未处理异常捕获;`get_runtime_errors` 按游标返回最多 20 条异常或桥接命令错误,并在 `runtime_status`/`stop_game` 中给出数量。
|
|
6
|
+
- 新增 `trigger_game_event`:通过桥接数据执行 Keyboard/KeyPress/KeyRelease、Mouse、Collision、Alarm、User、Step/Other 等事件代码,不需要物理键鼠或前台焦点;Draw 事件不支持。它只执行事件代码,不更新真实按键、鼠标坐标或碰撞状态。
|
|
7
|
+
- 新增 `send_game_mouse`:默认 `mode='message'` 通过窗口消息投递 move/click/wheel,不移动真实光标、不要求前台焦点;`mode='physical'` 才使用系统级注入。
|
|
8
|
+
- 新增 `run_game_sequence`:组合最多 32 个 wait/input/state/capture/event 动作,总帧数上限 1800,截图最多 4 张,失败时返回已完成步骤。
|
|
9
|
+
- 事件制作支持碰撞目标 `collision_object`、Keyboard/KeyPress/KeyRelease、鼠标事件编号及 DrawResize、GameStart、GameEnd 等 Other 事件。
|
|
10
|
+
- 新增瓦片集与瓦片图层:`create_tileset`、`inspect_tileset`、`create_tile_layer`、`set_tilemap_cells`、`inspect_tilemap`;支持空瓦片及翻转/旋转标记。
|
|
11
|
+
- 桥接新增 `event` 命令,按 `object_name` 和可选 `instance_id` 选择目标;省略 `instance_id` 时最多触发 `limit` 个实例。
|
|
12
|
+
- 修正模拟键盘的语义说明:`keyboard_key_press` 只更新按住状态,不产生 KeyPress/KeyRelease 事件;事件测试改用 `trigger_game_event`。
|
|
13
|
+
- 真实验收通过:瓦片值、碰撞事件、KeyPress 数据事件、窗口消息鼠标、批量序列和未处理异常捕获;默认路径不再移动真实光标或发送系统级按键。
|
|
14
|
+
- 自动测试增至 88 项并全部通过;工具数增至 44。
|
|
15
|
+
|
|
16
|
+
## 0.3.0.dev1 — 未发布
|
|
17
|
+
|
|
18
|
+
- 新增运行观察:读取及哈希保护修改 GML、安装测试桥接、隔离 Windows VM 构建运行、游戏截图、实例状态、运行日志和按键测试,工具数增至 35。
|
|
19
|
+
- 桥接控制文件改为单行 JSON,GML 侧完整读取整个文件,修复多行 JSON 无法解析的问题。
|
|
20
|
+
- 桥接安装会校验并修复启动房间实例、事件列表、常驻标记及行尾/BOM 差异;启动房间变化后自动迁移桥接实例;同名普通物体给出明确错误。
|
|
21
|
+
- 运行副本和存档移至用户目录,停止或过期后清理;再次运行前必须先停止并读取旧会话日志。
|
|
22
|
+
- 运行响应异常会清理挂起请求,`runtime_status` 返回诊断而不是抛出内部错误;等待帧数按帧数计算超时。
|
|
23
|
+
- 日志脱敏改为大小写不敏感,并覆盖存档目录和用户目录;截图读取后删除临时 PNG。
|
|
24
|
+
- `inspect_game` 不再用源项目校验运行副本,桥接返回的错误按失败处理。
|
|
25
|
+
- 移除测试用 `.mcp-probe-project` 绑定绕过;统一事件编号校验和实例结构;`client-config` 的 Codex 环境变量改为从同一份配置生成。
|
|
26
|
+
- `client-config` 生成的单次工具调用上限改为 180 秒(Codex `tool_timeout_sec`、Claude Code `timeout`),避免 `wait_game_frames` 等待较多帧时被默认 60 秒截断。
|
|
27
|
+
- 修正 Igor `Windows Run` 命令:不传 `/of`,由 Igor 在运行目录生成输出;传 `/of` 会导致 Runner 加载错误文件并退出。
|
|
28
|
+
- 运行的链接检查改为 Windows reparse point 判断,覆盖控制文件、项目复制和清理,避免 GitHub Actions 临时目录的短路径被 `resolve()` 误判。
|
|
29
|
+
- 新增运行、桥接修复、脱敏、清理和绑定测试,共 80 项通过。
|
|
30
|
+
- 在 IDE 2026.0.0.16 / Runtime 2026.0.0.23 完成真实验收:MCP 创建控制器和桥接,Igor 编译运行,桥接就绪,截图包含 DrawGUI 内容,实例状态可读,等待 30 帧和发送方向键生效,停止后构建副本与存档均已清理。IDE 图形界面未参与本轮验收。
|
|
31
|
+
|
|
32
|
+
## 0.2.0.dev2 — 未发布
|
|
33
|
+
|
|
34
|
+
- 新增显示配置查询、Windows 启动显示选项、房间/相机/视口配置,工具数增至 24。
|
|
35
|
+
- 支持显示名称、启动全屏、无边框、窗口大小调整许可、全屏切换许可、光标、垂直同步和像素插值。
|
|
36
|
+
- 房间尺寸、相机范围和视口位置/尺寸独立设置,保留其他视口、实例和未知字段;继承显示配置拒绝修改。
|
|
37
|
+
- 仅将现有 Windows 配置文件加入固定写入白名单,沿用预览、备份撤销和可选 SHA-256 检查。
|
|
38
|
+
- 新增 15 项显示设置测试,扩展真实 stdio 验证,共 54 项测试通过。
|
|
39
|
+
- 在 IDE 2026.0.0.16 / Runtime 2026.0.0.23 完成显示配置保存比对,以及窗口、启动全屏和无边框三种 Windows VM 场景的编译运行验收。
|
|
40
|
+
|
|
41
|
+
## 0.2.0.dev1 — 未发布
|
|
42
|
+
|
|
43
|
+
- 新增精灵动画查询、已有精灵速度与原点配置、帧重排和逐帧时长设置,工具数增至 21。
|
|
44
|
+
- 编辑保留帧 ID、图像与未知字段,沿用预览、事务备份和撤销;可用描述文件 SHA-256 拒绝过期操作。
|
|
45
|
+
- 首轮支持普通位图连续时间轴;含广播消息或时刻时不重排、不调整时长,复杂布局拒绝修改。
|
|
46
|
+
- 新增精灵编辑测试,并扩展真实 stdio 协议测试。
|
|
47
|
+
- 在 IDE 2026.0.0.16 / Runtime 2026.0.0.23 完成隔离项目保存及 Windows VM 编译运行;普通、小数时长及两种速度单位的实际像素采样通过。
|
|
48
|
+
|
|
49
|
+
## 0.1.1 — 2026-10-17
|
|
50
|
+
|
|
51
|
+
- 绑定前统一解析项目路径,修复 Windows 短路径/路径别名被误判为目录联接的问题。
|
|
52
|
+
- 新增路径规范化回归测试;CI 保留两种 Python 版本的独立结果。
|
|
53
|
+
- 打包日志兼容英文 Windows 的 cp1252 输出编码,避免中文日志导致构建失败。
|
|
54
|
+
|
|
55
|
+
## 0.1.0 — 2026-10-17
|
|
56
|
+
|
|
57
|
+
- 首个可安装版本,采用 MIT 许可证。
|
|
58
|
+
- 首次公开名称确定为 MORX GMS2 MCP;安装包、命令和服务标识为 `morx-gms2-mcp`。
|
|
59
|
+
- 18 个 stdio MCP 工具,支持脚本、物体、事件、房间、PNG 精灵、PCM WAV、GLSL ES 及中文分组。
|
|
60
|
+
- 固定项目绑定、默认只读服务、默认预览、备份撤销、冲突检查和跨进程锁。
|
|
61
|
+
- 提供 Codex / Claude Code 配置生成、独立验收场景及协议测试。
|
|
62
|
+
- 已完成指定 GameMaker 2026 版本的隔离项目编译运行验收;适用边界见 README。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 贡献指南
|
|
2
|
+
|
|
3
|
+
欢迎提交问题和改进。报告时注明操作系统、Python、MCP SDK、IDE、Runtime 版本,以及脱敏后的最小复现;不要上传完整私有游戏或事务备份。
|
|
4
|
+
|
|
5
|
+
资源描述由 GameMaker 生成的最小空白样例核对。扩展格式时保留已有字段、尾逗号兼容性和原生磁盘结构,避免依赖某个个人游戏。新操作应包含预览、实际执行、重复/无效输入测试及必要的撤销验证;涉及协议时补充真实 stdio 测试。
|
|
6
|
+
|
|
7
|
+
运行相关测试使用假的构建进程和文件桥接,不会真正编译 GML。修改 `runtime.py`、`runtime_bridge.py` 或桥接安装逻辑后,还应在独立项目上用实际 Igor 编译运行一次,记录 Runtime 版本、构建日志、截图和清理结果。注意 `Windows Run` 不应传 `/of`;Igor 会在运行目录生成输出,传 `/of` 会导致 Runner 加载错误文件。没有实际打开 IDE 时,不要把命令行构建写成 IDE 图形界面验收。
|
|
8
|
+
|
|
9
|
+
在仓库根目录执行测试及构建:
|
|
10
|
+
|
|
11
|
+
```powershell
|
|
12
|
+
python -m pip install . build
|
|
13
|
+
python scripts/check_public_files.py
|
|
14
|
+
python -m unittest discover -s tests -t . -v
|
|
15
|
+
python -m build
|
|
16
|
+
python scripts/build_release.py
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
wheel、sdist 和按白名单生成的公开源码 ZIP 位于 `dist/`。涉及新资源格式时另在独立项目中打开、保存、编译和运行,记录实际版本及可观察结果。勿把 JSON 检查通过写成 IDE 验收通过。
|
|
20
|
+
|
|
21
|
+
`examples/create_demo.py --project <已绑定的空测试项目>` 可通过真实 MCP 创建验收场景,只应对独立测试项目运行;重复运行会拒绝覆盖。
|
|
22
|
+
|
|
23
|
+
提交前运行 `python scripts/check_public_files.py` 并人工查看暂存差异。使用 GitHub noreply 提交邮箱;不要提交本机路径、密钥、个人配置、日志、完整游戏或实验备份。CI 同时检查已跟踪文件与提交历史,`.gitignore` 不会自动移除已经跟踪的内容。
|
|
24
|
+
|
|
25
|
+
代码使用英文标识符,注释和说明优先中文。修改保持聚焦;可复用模块分为 CLI、MCP 接口、资源操作、格式、存储事务与校验。贡献须有权以本项目 MIT 许可证提供。
|
|
26
|
+
|
|
27
|
+
## 发布
|
|
28
|
+
|
|
29
|
+
版本号同时写在 `pyproject.toml` 和 `morx_gms2_mcp/__init__.py`,发布前更新 `CHANGELOG.md`,然后运行测试、`python -m build` 和 `python scripts/build_release.py`。
|
|
30
|
+
|
|
31
|
+
PyPI 发布使用 GitHub Actions 的 OpenID Connect(Trusted Publishing),不需要保存 API token。首次发布前,在 PyPI 的 **Publishing** 页面添加一个 pending publisher:
|
|
32
|
+
|
|
33
|
+
| 字段 | 值 |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| PyPI Project Name | `morx-gms2-mcp` |
|
|
36
|
+
| Owner | `MKTLMORX` |
|
|
37
|
+
| Repository name | `morx-gms2-mcp` |
|
|
38
|
+
| Workflow name | `release.yml` |
|
|
39
|
+
| Environment name | 留空 |
|
|
40
|
+
|
|
41
|
+
配置完成后推送版本标签,例如 `v0.4.0`。`.github/workflows/release.yml` 会构建 wheel/sdist,通过 OIDC 发布到 PyPI,并创建同名 GitHub Release。也可以在 GitHub Actions 页面手动运行 `release` 工作流;手动运行只发布 PyPI,不创建 Release。工作流只申请 `id-token: write`,不读取或保存 PyPI 凭据。标签必须与包版本一致(`v0.4.0` 对应 `0.4.0`),否则构建任务会失败。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 morx-gms2-mcp contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
include LICENSE README.md CHANGELOG.md CONTRIBUTING.md SECURITY.md
|
|
2
|
+
include .gitignore
|
|
3
|
+
recursive-include tests *.py
|
|
4
|
+
recursive-include examples *.py *.json *.toml
|
|
5
|
+
recursive-include scripts *.py
|
|
6
|
+
recursive-include .github *.yml
|
|
7
|
+
global-exclude *.pyc
|
|
8
|
+
prune __pycache__
|