[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HSEBSRF9712GE9F3TAMGPH":3,"skill-same:01M6HSEBSRF9712GE9F3TAMGPH":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":30,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6HSEBSRF9712GE9F3TAMGPH","godot-dev",null,"**Godot 游戏开发统一入口（4.23 三场景分流总 Skill）**。当用户用自然语言提出 任何与「做游戏 \u002F 开发游戏 \u002F 加玩法 \u002F 写 Godot 脚本 \u002F 改场景 \u002F 改节点 \u002F 做关卡 \u002F 做 UI \u002F 做角色 \u002F 做敌人 \u002F 做菜单 \u002F 做 2D \u002F 做 3D \u002F 做 RPG \u002F 做平台跳跃 \u002F 做贪吃蛇 \u002F make a game \u002F build a game \u002F add gameplay \u002F godot script \u002F godot scene」相关的请求时激活。 本 Skill **必须自己执行环境检测、意图判别、流程编排**（4.23.md 明确规定 Skill 负责所有匹配\u002F流程\u002F资源\u002F命令逻辑，不能甩给 MCP），并按照 4.23.md 的 三个场景把控制权分别移交给 [godot-deploy](..\u002Fgodot-deploy\u002FSKILL.md) \u002F [godot-new](..\u002Fgodot-new\u002FSKILL.md) 子流程，或直接用唯一的 MCP 编辑器单元 工具 `build_godot_scene` 完成场景修改。 —— 仅当用户「只想部署 \u002F 重连 MCP，不开发」时让位给 godot-deploy； 仅当用户报告「运行报错 \u002F 编译错误 \u002F 崩溃」时让位给 [godot-debug](..\u002Fgodot-debug\u002FSKILL.md)。 **不要**因为「工作区还没有 project.godot」就拒绝触发——本 Skill 自己会判断 并切到场景 1 走部署 + 新建流程。","welflau\u002Fai-dev-system","welflau","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7010385?v=4","01M6HPTDGF18RFY07M229P8CTM","01M6HPTDMRMZCJPYBFEA9XVVYT",3,"MIT","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002FSKILL.md",[17,22,25],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":26,"categoryName":27,"taxonomyType":28,"taxonomyTypeDesc":29},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"dev","godot dev","godot","new","MCP","报告","2d","工具","script","rpg","make","add","project","build","gameplay","game","3D","ui","debug","deploy","2026-11-10 10:12:30",false,"---\nname: godot-dev\ndescription: >\n  **Godot 游戏开发统一入口（4.23 三场景分流总 Skill）**。当用户用自然语言提出\n  任何与「做游戏 \u002F 开发游戏 \u002F 加玩法 \u002F 写 Godot 脚本 \u002F 改场景 \u002F 改节点 \u002F\n  做关卡 \u002F 做 UI \u002F 做角色 \u002F 做敌人 \u002F 做菜单 \u002F 做 2D \u002F 做 3D \u002F 做 RPG \u002F\n  做平台跳跃 \u002F 做贪吃蛇 \u002F make a game \u002F build a game \u002F add gameplay \u002F\n  godot script \u002F godot scene」相关的请求时激活。\n  本 Skill **必须自己执行环境检测、意图判别、流程编排**（4.23.md 明确规定\n  Skill 负责所有匹配\u002F流程\u002F资源\u002F命令逻辑，不能甩给 MCP），并按照 4.23.md 的\n  三个场景把控制权分别移交给 [godot-deploy](..\u002Fgodot-deploy\u002FSKILL.md) \u002F\n  [godot-new](..\u002Fgodot-new\u002FSKILL.md) 子流程，或直接用唯一的 MCP 编辑器单元\n  工具 `build_godot_scene` 完成场景修改。\n  ——\n  仅当用户「只想部署 \u002F 重连 MCP，不开发」时让位给 godot-deploy；\n  仅当用户报告「运行报错 \u002F 编译错误 \u002F 崩溃」时让位给\n  [godot-debug](..\u002Fgodot-debug\u002FSKILL.md)。\n  **不要**因为「工作区还没有 project.godot」就拒绝触发——本 Skill 自己会判断\n  并切到场景 1 走部署 + 新建流程。\n---\n\n# Godot 开发统一入口（4.23 三场景分流）\n\n> 严格遵循 [docs\u002F需求文档\u002F4.23.md](..\u002F..\u002Fdocs\u002F需求文档\u002F4.23.md)：\n> **Skill 负责所有匹配逻辑、流程管理、资源下载、命令运行；\n> MCP 只负责对 Godot 编辑器的单元操作。**\n> 所以本文件里**必须**真实地跑 shell 命令、读文件、写 `active-game.json`，\n> **不要**幻想存在某个 MCP 路由工具会替你判断（旧的 `godot_dev_router` 已删除）。\n\n---\n\n## 工作区目录契约（4.23.md 强制约定，所有子 Skill 必须遵守）\n\n`${WORKSPACE}` 的最终结构 **永远** 是平铺的：\n\n```\n${WORKSPACE}\u002F\n├── godot-editor\u002F          ← Godot 编辑器二进制（由 godot-deploy 下载\u002F解压）\n│   └── Godot_v4.6-stable_win64.exe\n├── active-game.json       ← 全局唯一的「当前操作游戏目录」标记（由 godot-new 写入）\n├── game1\u002F                 ← 第 1 个游戏项目（由 godot-new 创建）\n│   ├── project.godot\n│   ├── addons\u002Fgodot_mcp\u002F\n│   ├── scenes\u002F  scripts\u002F  assets\u002F  data\u002F  docs\u002F\n│   └── .vscode\u002F\n├── game2\u002F                 ← 用户「再做一个」时由 godot-new 新建的第 2 个项目\n│   └── ...\n└── （用户可能存在的其他无关文件，本插件不动）\n```\n\n强约束：\n- **`godot-editor\u002F` 必须落在 `${WORKSPACE}\u002Fgodot-editor\u002F`**，不是插件目录、\n  不是用户目录、不是嵌套在某个 game 里\n- **`active-game.json` 必须放在 `${WORKSPACE}\u002Factive-game.json`**，与所有\n  game 目录、godot-editor 平铺同级\n- **每个游戏是 `${WORKSPACE}` 的一级子目录**，不嵌套、不带前缀\n- 所有路径推断（gameDir \u002F 编辑器可执行文件位置 \u002F addons 注入位置）都基于\n  此结构；任何子 Skill（godot-deploy \u002F godot-new \u002F godot-debug）都**不得**\n  把这些资产放到其他位置\n\n`active-game.json` 的字段：\n\n```jsonc\n{\n  \"gameDir\":       \"\u003Cabsolute path, 例如 D:\u002Fwork\u002F${WORKSPACE}\u002Fgame1>\",\n  \"projectName\":   \"game1\",\n  \"template\":      \"default\" | \"2d-platformer\" | \"3d-fps\" | \"empty\",\n  \"createdAt\":     \"\u003CISO8601>\",\n  \"pluginVersion\": \"2.0.0\"\n}\n```\n\n---\n\n## 第 0 步：环境探测（每次激活的第一件事，必做，不可省略）\n\n用一段 PowerShell 一次性收集 4 个标志位，**不要**反问用户。\n\n```powershell\n$ws = \"${WORKSPACE}\"   # Agent 已知的当前工作区绝对路径\n\n# 0.1 active-game.json\n$agJson = Join-Path $ws \"active-game.json\"\n$active = $null\nif (Test-Path $agJson) { $active = Get-Content $agJson -Raw | ConvertFrom-Json }\n$hasActiveGame = [bool]$active\n\n# 0.2 gameDir 与 project.godot\n$gameDir = if ($hasActiveGame) { $active.gameDir } else { $null }\n$hasProject = $false\nif ($gameDir -and (Test-Path (Join-Path $gameDir \"project.godot\"))) {\n    $hasProject = $true\n} elseif (-not $hasActiveGame) {\n    # fallback：扫一级子目录找任意 project.godot；只用于诊断展示，不自动写 active-game.json\n    $cand = Get-ChildItem -Path $ws -Directory -ErrorAction SilentlyContinue |\n            Where-Object { Test-Path (Join-Path $_.FullName \"project.godot\") } |\n            Select-Object -First 1\n    if ($cand) { $gameDir = $cand.FullName; $hasProject = $true }\n}\n\n# 0.3 godot-editor 是否已下载到工作区\n$editorDir = Join-Path $ws \"godot-editor\"\n$hasEditor = (Test-Path $editorDir) -and `\n             ((Get-ChildItem -Path $editorDir -Filter \"Godot_v*.exe\" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1) -ne $null)\n\n# 0.4 9080 端口探测（Godot 插件是否启用）\n$probe = Test-NetConnection -ComputerName 127.0.0.1 -Port 9080 `\n         -InformationLevel Quiet -WarningAction SilentlyContinue\n$editorListening = [bool]$probe\n\nWrite-Host \"ENV: hasActiveGame=$hasActiveGame hasProject=$hasProject hasEditor=$hasEditor editorListening=$editorListening gameDir=$gameDir\"\n```\n\n汇总四个标志位：\n\n| 变量 | 含义 |\n|------|------|\n| `hasActiveGame` | `${WORKSPACE}\u002Factive-game.json` 是否存在 |\n| `hasProject`    | active 游戏目录（或 fallback 子目录）下是否有 `project.godot` |\n| `hasEditor`     | `${WORKSPACE}\u002Fgodot-editor\u002F` 下是否有 `Godot_v*.exe` |\n| `editorListening` | 9080 是否在监听（即插件是否启用） |\n\n---\n\n## 第 1 步：意图判别（不要反问用户，按优先级直接判定）\n\n把用户原话简单做关键词匹配：\n\n| intent | 触发关键词 |\n|--------|-----------|\n| `new_game`     | 「再来一个 \u002F 另一个 \u002F 新游戏 \u002F 再做一个 \u002F 换一个游戏 \u002F new game \u002F another game」|\n| `modify_game`  | 「加 \u002F 改 \u002F 删 \u002F 优化 \u002F 调整 \u002F 修复 \u002F 增加 \u002F 替换」+ 节点\u002F场景\u002F脚本\u002FUI\u002F角色\u002F敌人\u002F关卡\u002F菜单 |\n| `make_game`    | 「做一个 X \u002F 帮我做个 X \u002F 想要个 X \u002F make a X \u002F build a X」（X 是游戏类型）|\n\n按以下优先级直接判定（**禁止**反问用户）：\n\n1. `hasProject == false`        → 一律 **场景 1 = make_game**\n2. `hasProject == true` 且原话出现 `new_game` 关键词 → **场景 2 = new_game**\n3. 其他                         → **场景 3 = modify_game**\n\n---\n\n## 第 2 步：按 4.23.md 三场景分流\n\n### ? 场景 1 — `make_game`：空环境，全套部署 + 建项目\n\n> 4.23.md：「环境为空或者只有无关文件，就按照旧的 deploy command 流程：\n> 下载 godot 编辑器，创建游戏，**还需要在根目录添加一个 json 文件，\n> 说明当前操作的游戏文件夹是哪个**」。\n\n明确告诉用户：「正在按 4.23 场景 1 处理：先部署环境，再创建项目。」\n\n执行顺序（**不要跳步**）：\n\n1. **部署阶段**：执行\n   [godot-deploy\u002FSKILL.md](..\u002Fgodot-deploy\u002FSKILL.md) 的 5 步流程\n   （Node 检查、Server 构建、`.mcp.json` 注册、把 Godot 编辑器下载到\n   `${WORKSPACE}\u002Fgodot-editor\u002F`、9080 探测）。\n   - 步骤 5（9080 探测）通常会 `[WAIT]`，因为此时还没有项目可被编辑器打开。\n     这是**正常**的——继续走步骤 2 创建项目，再让用户去打开编辑器即可。\n2. **新建项目**：执行 [godot-new\u002FSKILL.md](..\u002Fgodot-new\u002FSKILL.md)：\n   - 根据用户原话推断 `projectName` \u002F `template`（推不出 → `empty`）\n   - 复制模板 → `${WORKSPACE}\u002F\u003CprojectName>`\n   - 注入 `addons\u002Fgodot_mcp\u002F`\n   - 写入 `${WORKSPACE}\u002Factive-game.json`\n3. **引导用户**用 `${WORKSPACE}\u002Fgodot-editor\u002F` 下的 `Godot_v*.exe` 打开\n   `${WORKSPACE}\u002F\u003CprojectName>` 并启用 GodotMCP 插件。**不要**自动启动\n   editor.exe（启用插件需要 GUI 操作）。\n4. 用户回来再次说话时，会落到场景 3 走 `build_godot_scene` 完成首批游戏内容。\n\n### ? 场景 2 — `new_game`：已有编辑器，仅新建另一个游戏\n\n> 4.23.md：「当前环境已有 godot 编辑器，而且明确要一个新的游戏。则按照旧的\n> new command 流程：仅新建游戏。如果用户的游戏需求明确，可以通过游戏推断出\n> 哪个游戏模板合适，否则用空模板」。\n\n明确告诉用户：「正在按 4.23 场景 2 处理：仅新建另一个游戏。」\n\n1. **直接执行** [godot-new\u002FSKILL.md](..\u002Fgodot-new\u002FSKILL.md)：\n   - 推断模板（推不出 → `empty`）\n   - 复制模板到 `${WORKSPACE}\u002F\u003CprojectName>`（与现有 game1\u002Fgame2 平铺）\n   - 注入 `addons\u002Fgodot_mcp\u002F`\n   - **覆盖**写入 `active-game.json`，把 `gameDir` 切换到新项目\n2. 引导用户在 Godot 编辑器中关闭旧项目、打开新项目目录、启用插件\n3. **不要**重跑 godot-deploy（编辑器已就绪）；**不要**删除旧 game 目录\n\n### ? 场景 3 — `modify_game`：修改当前游戏内容\n\n> 4.23.md：「mcp 对项目的修改，所有场景的修改合并为一个工具，需要传递完整的\n> 最终需要的场景树结构，然后内部用单元的方法实现。其他代码、策划案、表格，\n> 以及图片、模型等资源，都直接在当前操作的游戏目录里修改」。\n\n明确告诉用户：「正在按 4.23 场景 3 处理：修改 `\u003CgameDir>` 内容。」\n\n#### 前置条件检查\n\n- `hasActiveGame == false` → 告诉用户先用「做一个 …」(场景 1) 或\n  「再做一个 …」(场景 2) 创建项目；**不要**自己创建\n- `hasProject == false`    → 同上\n- `editorListening == false` → **让位给 godot-deploy** 把端口探起来后再说\n\n#### 修改类型分流（基于 `gameDir = $active.gameDir`）\n\n| 修改对象 | 处理方式 |\n|----------|---------|\n| **场景 \u002F 节点 \u002F 节点属性 \u002F 节点附着的脚本** | 把\"最终想要的场景树\"完整地翻译成 `build_godot_scene` 的 root 树参数，**一次性调用 `build_godot_scene`**。**禁止**多次原子调用，**禁止**自己手写 `.tscn` |\n| **独立 GDScript（autoload \u002F 工具脚本，不挂节点）** | 直接用 Write\u002FEdit 工具在 `${gameDir}\u002Fscripts\u002F...` 里读写 `.gd` |\n| **策划案 \u002F 表格 \u002F Markdown 文档** | 直接在 `${gameDir}\u002Fdocs\u002F`、`${gameDir}\u002Fdata\u002F` 里读写 |\n| **图片 \u002F 模型 \u002F 音频等二进制资源** | `Copy-Item` \u002F `Invoke-WebRequest` 到 `${gameDir}\u002Fassets\u002F...`，由 Godot 编辑器自动 reimport |\n\n#### `build_godot_scene` 调用约定\n\n这是 4.23.md 场景 3 唯一允许的「场景修改」MCP 工具：\n\n```\nbuild_godot_scene({\n  scenePath: \"res:\u002F\u002Fscenes\u002F\u003C场景名>.tscn\",\n  root: {\n    name: \"\u003C根节点名>\",\n    type: \"\u003CGodot 节点类型，如 Node2D \u002F CharacterBody2D \u002F Control>\",\n    properties: { ... },          \u002F\u002F Vector2 用 [x,y]；Color 用 [r,g,b,a] (0-1)；rotation 单位为弧度\n    script: { path: \"res:\u002F\u002Fscripts\u002F\u003Cx>.gd\", content: \"\u003C完整 GDScript>\" },\n    children: [ ... ]             \u002F\u002F 递归，每个子节点同样的结构\n  },\n  saveAfter:    true,             \u002F\u002F 默认 true\n  openInEditor: true              \u002F\u002F 默认 true\n})\n```\n\n把用户的开发需求**一次性**翻译成上面这个声明式 root 树，调一次\n`build_godot_scene`，再把返回的 report **原样**展示给用户。\n\n---\n\n## Godot 4 路径与类型约定（写 `build_godot_scene` 参数时遵守）\n\n| 类型 | 格式 | 示例 |\n|------|------|------|\n| 资源路径 | `res:\u002F\u002F...` | `res:\u002F\u002Fscenes\u002Fmain.tscn` |\n| 节点类型 | Godot 4 类名 | `Node2D` \u002F `CharacterBody2D` \u002F `Control` \u002F `Camera2D` |\n| 脚本扩展名 | `.gd`（GDScript） | `res:\u002F\u002Fscripts\u002Fplayer.gd` |\n| 场景扩展名 | `.tscn`（文本格式） | `res:\u002F\u002Fscenes\u002Fmain.tscn` |\n| Vector2 \u002F Vector3 | 数组 | `[100, 200]` \u002F `[1, 2, 3]` |\n| Color | RGBA 数组 0–1 | `[1, 0.5, 0.5, 1]` |\n| 旋转单位 | 弧度（radians） | `1.5708` |\n\n---\n\n## 严禁行为\n\n- ❌ **不要**调用任何不在「`build_godot_scene` + 三个 debug 工具」之外的 MCP\n  工具（旧的 `godot_deploy` \u002F `godot_dev_router` \u002F `init_godot_project` \u002F\n  `operate_node` \u002F `operate_scene` \u002F `operate_script` \u002F `run_project` \u002F\n  `manage_project` \u002F `scan_project_modules` \u002F `get_project_info` \u002F\n  `list_templates` 等已经从 MCP 中**移除**，调用它们会失败）\n- ❌ **不要**在 Skill 里写「我先调 router 让它告诉我下一步」——4.23.md 已经\n  把路由职责放回 Skill，**这个文件本身就是路由**\n- ❌ **不要**在没有 `active-game.json` 的情况下自己手写 `project.godot`\n- ❌ **不要**为「修改场景」而做多次原子调用——必须一次 `build_godot_scene`\n  传完整树\n- ❌ **不要**做\"自动 run_project → 自动再 debug\"循环（本 MCP 已无 run_project）\n- ❌ **不要**反复反问用户「你是要新建还是修改？」——按第 1 步优先级判定\n- ❌ **不要**把 godot-editor 或 game 目录放到 `${WORKSPACE}` 之外或嵌套位置\n\n---\n\n## MCP 连接异常时的处理\n\n调用 `build_godot_scene` \u002F `get_debug_errors` \u002F `get_script_errors` \u002F\n`get_editor_output` 时若收到 **「工具不存在 \u002F 未注册 \u002F connection refused \u002F\nECONNREFUSED \u002F WebSocket」** 类错误：\n\n→ 立刻让位给 [godot-deploy](..\u002Fgodot-deploy\u002FSKILL.md) 完成连接修复\n（**不要**自己跑 npm \u002F 改 `.mcp.json`），修复后让用户重新触发本 Skill。\n\n---\n\n## 输出格式\n\n- **场景切换**：每次激活，第一行明确说「正在按 4.23 场景 X 处理：…」\n- **MCP 工具结果**：原样展示返回的 report 文本，**不要复述、不要总结**\n- **失败**：把错误信息和下一步建议简短给出，等待用户处理后重新触发\n","# Godot 开发统一入口（4.23 三场景分流）\n\n> 严格遵循 [docs\u002F需求文档\u002F4.23.md](..\u002F..\u002Fdocs\u002F需求文档\u002F4.23.md)：\n> **Skill 负责所有匹配逻辑、流程管理、资源下载、命令运行；\n> MCP 只负责对 Godot 编辑器的单元操作。**\n> 所以本文件里**必须**真实地跑 shell 命令、读文件、写 `active-game.json`，\n> **不要**幻想存在某个 MCP 路由工具会替你判断（旧的 `godot_dev_router` 已删除）。\n\n---\n\n## 工作区目录契约（4.23.md 强制约定，所有子 Skill 必须遵守）\n\n`${WORKSPACE}` 的最终结构 **永远** 是平铺的：\n\n```\n${WORKSPACE}\u002F\n├── godot-editor\u002F          ← Godot 编辑器二进制（由 godot-deploy 下载\u002F解压）\n│   └── Godot_v4.6-stable_win64.exe\n├── active-game.json       ← 全局唯一的「当前操作游戏目录」标记（由 godot-new 写入）\n├── game1\u002F                 ← 第 1 个游戏项目（由 godot-new 创建）\n│   ├── project.godot\n│   ├── addons\u002Fgodot_mcp\u002F\n│   ├── scenes\u002F  scripts\u002F  assets\u002F  data\u002F  docs\u002F\n│   └── .vscode\u002F\n├── game2\u002F                 ← 用户「再做一个」时由 godot-new 新建的第 2 个项目\n│   └── ...\n└── （用户可能存在的其他无关文件，本插件不动）\n```\n\n强约束：\n- **`godot-editor\u002F` 必须落在 `${WORKSPACE}\u002Fgodot-editor\u002F`**，不是插件目录、\n  不是用户目录、不是嵌套在某个 game 里\n- **`active-game.json` 必须放在 `${WORKSPACE}\u002Factive-game.json`**，与所有\n  game 目录、godot-editor 平铺同级\n- **每个游戏是 `${WORKSPACE}` 的一级子目录**，不嵌套、不带前缀\n- 所有路径推断（gameDir \u002F 编辑器可执行文件位置 \u002F addons 注入位置）都基于\n  此结构；任何子 Skill（godot-deploy \u002F godot-new \u002F godot-debug）都**不得**\n  把这些资产放到其他位置\n\n`active-game.json` 的字段：\n\n```jsonc\n{\n  \"gameDir\":       \"\u003Cabsolute path, 例如 D:\u002Fwork\u002F${WORKSPACE}\u002Fgame1>\",\n  \"projectName\":   \"game1\",\n  \"template\":      \"default\" | \"2d-platformer\" | \"3d-fps\" | \"empty\",\n  \"createdAt\":     \"\u003CISO8601>\",\n  \"pluginVersion\": \"2.0.0\"\n}\n```\n\n---\n\n## 第 0 步：环境探测（每次激活的第一件事，必做，不可省略）\n\n用一段 PowerShell 一次性收集 4 个标志位，**不要**反问用户。\n\n```powershell\n$ws = \"${WORKSPACE}\"   # Agent 已知的当前工作区绝对路径\n\n# 0.1 active-game.json\n$agJson = Join-Path $ws \"active-game.json\"\n$active = $null\nif (Test-Path $agJson) { $active = Get-Content $agJson -Raw | ConvertFrom-Json }\n$hasActiveGame = [bool]$active\n\n# 0.2 gameDir 与 project.godot\n$gameDir = if ($hasActiveGame) { $active.gameDir } else { $null }\n$hasProject = $false\nif ($gameDir -and (Test-Path (Join-Path $gameDir \"project.godot\"))) {\n    $hasProject = $true\n} elseif (-not $hasActiveGame) {\n    # fallback：扫一级子目录找任意 project.godot；只用于诊断展示，不自动写 active-game.json\n    $cand = Get-ChildItem -Path $ws -Directory -ErrorAction SilentlyContinue |\n            Where-Object { Test-Path (Join-Path $_.FullName \"project.godot\") } |\n            Select-Object -First 1\n    if ($cand) { $gameDir = $cand.FullName; $hasProject = $true }\n}\n\n# 0.3 godot-editor 是否已下载到工作区\n$editorDir = Join-Path $ws \"godot-editor\"\n$hasEditor = (Test-Path $editorDir) -and `\n             ((Get-ChildItem -Path $editorDir -Filter \"Godot_v*.exe\" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1) -ne $null)\n\n# 0.4 9080 端口探测（Godot 插件是否启用）\n$probe = Test-NetConnection -ComputerName 127.0.0.1 -Port 9080 `\n         -InformationLevel Quiet -WarningAction SilentlyContinue\n$editorListening = [bool]$probe\n\nWrite-Host \"ENV: hasActiveGame=$hasActiveGame hasProject=$hasProject hasEditor=$hasEditor editorListening=$editorListening gameDir=$gameDir\"\n```\n\n汇总四个标志位：\n\n| 变量 | 含义 |\n|------|------|\n| `hasActiveGame` | `${WORKSPACE}\u002Factive-game.json` 是否存在 |\n| `hasProject`    | active 游戏目录（或 fallback 子目录）下是否有 `project.godot` |\n| `hasEditor`     | `${WORKSPACE}\u002Fgodot-editor\u002F` 下是否有 `Godot_v*.exe` |\n| `editorListening` | 9080 是否在监听（即插件是否启用） |\n\n---\n\n## 第 1 步：意图判别（不要反问用户，按优先级直接判定）\n\n把用户原话简单做关键词匹配：\n\n| intent | 触发关键词 |\n|--------|-----------|\n| `new_game`     | 「再来一个 \u002F 另一个 \u002F 新游戏 \u002F 再做一个 \u002F 换一个游戏 \u002F new game \u002F another game」|\n| `modify_game`  | 「加 \u002F 改 \u002F 删 \u002F 优化 \u002F 调整 \u002F 修复 \u002F 增加 \u002F 替换」+ 节点\u002F场景\u002F脚本\u002FUI\u002F角色\u002F敌人\u002F关卡\u002F菜单 |\n| `make_game`    | 「做一个 X \u002F 帮我做个 X \u002F 想要个 X \u002F make a X \u002F build a X」（X 是游戏类型）|\n\n按以下优先级直接判定（**禁止**反问用户）：\n\n1. `hasProject == false`        → 一律 **场景 1 = make_game**\n2. `hasProject == true` 且原话出现 `new_game` 关键词 → **场景 2 = new_game**\n3. 其他                         → **场景 3 = modify_game**\n\n---\n\n## 第 2 步：按 4.23.md 三场景分流\n\n### ? 场景 1 — `make_game`：空环境，全套部署 + 建项目\n\n> 4.23.md：「环境为空或者只有无关文件，就按照旧的 deploy command 流程：\n> 下载 godot 编辑器，创建游戏，**还需要在根目录添加一个 json 文件，\n> 说明当前操作的游戏文件夹是哪个**」。\n\n明确告诉用户：「正在按 4.23 场景 1 处理：先部署环境，再创建项目。」\n\n执行顺序（**不要跳步**）：\n\n1. **部署阶段**：执行\n   [godot-deploy\u002FSKILL.md](..\u002Fgodot-deploy\u002FSKILL.md) 的 5 步流程\n   （Node 检查、Server 构建、`.mcp.json` 注册、把 Godot 编辑器下载到\n   `${WORKSPACE}\u002Fgodot-editor\u002F`、9080 探测）。\n   - 步骤 5（9080 探测）通常会 `[WAIT]`，因为此时还没有项目可被编辑器打开。\n     这是**正常**的——继续走步骤 2 创建项目，再让用户去打开编辑器即可。\n2. **新建项目**：执行 [godot-new\u002FSKILL.md](..\u002Fgodot-new\u002FSKILL.md)：\n   - 根据用户原话推断 `projectName` \u002F `template`（推不出 → `empty`）\n   - 复制模板 → `${WORKSPACE}\u002F\u003CprojectName>`\n   - 注入 `addons\u002Fgodot_mcp\u002F`\n   - 写入 `${WORKSPACE}\u002Factive-game.json`\n3. **引导用户**用 `${WORKSPACE}\u002Fgodot-editor\u002F` 下的 `Godot_v*.exe` 打开\n   `${WORKSPACE}\u002F\u003CprojectName>` 并启用 GodotMCP 插件。**不要**自动启动\n   editor.exe（启用插件需要 GUI 操作）。\n4. 用户回来再次说话时，会落到场景 3 走 `build_godot_scene` 完成首批游戏内容。\n\n### ? 场景 2 — `new_game`：已有编辑器，仅新建另一个游戏\n\n> 4.23.md：「当前环境已有 godot 编辑器，而且明确要一个新的游戏。则按照旧的\n> new command 流程：仅新建游戏。如果用户的游戏需求明确，可以通过游戏推断出\n> 哪个游戏模板合适，否则用空模板」。\n\n明确告诉用户：「正在按 4.23 场景 2 处理：仅新建另一个游戏。」\n\n1. **直接执行** [godot-new\u002FSKILL.md](..\u002Fgodot-new\u002FSKILL.md)：\n   - 推断模板（推不出 → `empty`）\n   - 复制模板到 `${WORKSPACE}\u002F\u003CprojectName>`（与现有 game1\u002Fgame2 平铺）\n   - 注入 `addons\u002Fgodot_mcp\u002F`\n   - **覆盖**写入 `active-game.json`，把 `gameDir` 切换到新项目\n2. 引导用户在 Godot 编辑器中关闭旧项目、打开新项目目录、启用插件\n3. **不要**重跑 godot-deploy（编辑器已就绪）；**不要**删除旧 game 目录\n\n### ? 场景 3 — `modify_game`：修改当前游戏内容\n\n> 4.23.md：「mcp 对项目的修改，所有场景的修改合并为一个工具，需要传递完整的\n> 最终需要的场景树结构，然后内部用单元的方法实现。其他代码、策划案、表格，\n> 以及图片、模型等资源，都直接在当前操作的游戏目录里修改」。\n\n明确告诉用户：「正在按 4.23 场景 3 处理：修改 `\u003CgameDir>` 内容。」\n\n#### 前置条件检查\n\n- `hasActiveGame == false` → 告诉用户先用「做一个 …」(场景 1) 或\n  「再做一个 …」(场景 2) 创建项目；**不要**自己创建\n- `hasProject == false`    → 同上\n- `editorListening == false` → **让位给 godot-deploy** 把端口探起来后再说\n\n#### 修改类型分流（基于 `gameDir = $active.gameDir`）\n\n| 修改对象 | 处理方式 |\n|----------|---------|\n| **场景 \u002F 节点 \u002F 节点属性 \u002F 节点附着的脚本** | 把\"最终想要的场景树\"完整地翻译成 `build_godot_scene` 的 root 树参数，**一次性调用 `build_godot_scene`**。**禁止**多次原子调用，**禁止**自己手写 `.tscn` |\n| **独立 GDScript（autoload \u002F 工具脚本，不挂节点）** | 直接用 Write\u002FEdit 工具在 `${gameDir}\u002Fscripts\u002F...` 里读写 `.gd` |\n| **策划案 \u002F 表格 \u002F Markdown 文档** | 直接在 `${gameDir}\u002Fdocs\u002F`、`${gameDir}\u002Fdata\u002F` 里读写 |\n| **图片 \u002F 模型 \u002F 音频等二进制资源** | `Copy-Item` \u002F `Invoke-WebRequest` 到 `${gameDir}\u002Fassets\u002F...`，由 Godot 编辑器自动 reimport |\n\n#### `build_godot_scene` 调用约定\n\n这是 4.23.md 场景 3 唯一允许的「场景修改」MCP 工具：\n\n```\nbuild_godot_scene({\n  scenePath: \"res:\u002F\u002Fscenes\u002F\u003C场景名>.tscn\",\n  root: {\n    name: \"\u003C根节点名>\",\n    type: \"\u003CGodot 节点类型，如 Node2D \u002F CharacterBody2D \u002F Control>\",\n    properties: { ... },          \u002F\u002F Vector2 用 [x,y]；Color 用 [r,g,b,a] (0-1)；rotation 单位为弧度\n    script: { path: \"res:\u002F\u002Fscripts\u002F\u003Cx>.gd\", content: \"\u003C完整 GDScript>\" },\n    children: [ ... ]             \u002F\u002F 递归，每个子节点同样的结构\n  },\n  saveAfter:    true,             \u002F\u002F 默认 true\n  openInEditor: true              \u002F\u002F 默认 true\n})\n```\n\n把用户的开发需求**一次性**翻译成上面这个声明式 root 树，调一次\n`build_godot_scene`，再把返回的 report **原样**展示给用户。\n\n---\n\n## Godot 4 路径与类型约定（写 `build_godot_scene` 参数时遵守）\n\n| 类型 | 格式 | 示例 |\n|------|------|------|\n| 资源路径 | `res:\u002F\u002F...` | `res:\u002F\u002Fscenes\u002Fmain.tscn` |\n| 节点类型 | Godot 4 类名 | `Node2D` \u002F `CharacterBody2D` \u002F `Control` \u002F `Camera2D` |\n| 脚本扩展名 | `.gd`（GDScript） | `res:\u002F\u002Fscripts\u002Fplayer.gd` |\n| 场景扩展名 | `.tscn`（文本格式） | `res:\u002F\u002Fscenes\u002Fmain.tscn` |\n| Vector2 \u002F Vector3 | 数组 | `[100, 200]` \u002F `[1, 2, 3]` |\n| Color | RGBA 数组 0–1 | `[1, 0.5, 0.5, 1]` |\n| 旋转单位 | 弧度（radians） | `1.5708` |\n\n---\n\n## 严禁行为\n\n- ❌ **不要**调用任何不在「`build_godot_scene` + 三个 debug 工具」之外的 MCP\n  工具（旧的 `godot_deploy` \u002F `godot_dev_router` \u002F `init_godot_project` \u002F\n  `operate_node` \u002F `operate_scene` \u002F `operate_script` \u002F `run_project` \u002F\n  `manage_project` \u002F `scan_project_modules` \u002F `get_project_info` \u002F\n  `list_templates` 等已经从 MCP 中**移除**，调用它们会失败）\n- ❌ **不要**在 Skill 里写「我先调 router 让它告诉我下一步」——4.23.md 已经\n  把路由职责放回 Skill，**这个文件本身就是路由**\n- ❌ **不要**在没有 `active-game.json` 的情况下自己手写 `project.godot`\n- ❌ **不要**为「修改场景」而做多次原子调用——必须一次 `build_godot_scene`\n  传完整树\n- ❌ **不要**做\"自动 run_project → 自动再 debug\"循环（本 MCP 已无 run_project）\n- ❌ **不要**反复反问用户「你是要新建还是修改？」——按第 1 步优先级判定\n- ❌ **不要**把 godot-editor 或 game 目录放到 `${WORKSPACE}` 之外或嵌套位置\n\n---\n\n## MCP 连接异常时的处理\n\n调用 `build_godot_scene` \u002F `get_debug_errors` \u002F `get_script_errors` \u002F\n`get_editor_output` 时若收到 **「工具不存在 \u002F 未注册 \u002F connection refused \u002F\nECONNREFUSED \u002F WebSocket」** 类错误：\n\n→ 立刻让位给 [godot-deploy](..\u002Fgodot-deploy\u002FSKILL.md) 完成连接修复\n（**不要**自己跑 npm \u002F 改 `.mcp.json`），修复后让用户重新触发本 Skill。\n\n---\n\n## 输出格式\n\n- **场景切换**：每次激活，第一行明确说「正在按 4.23 场景 X 处理：…」\n- **MCP 工具结果**：原样展示返回的 report 文本，**不要复述、不要总结**\n- **失败**：把错误信息和下一步建议简短给出，等待用户处理后重新触发\n",{"name":5,"description":7},"main","18d0e63d1313ca87098f614aa7c1e2dcf6de79c7","backend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev",1,"https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system","https:\u002F\u002Fgithub.com\u002Fwelflau","2026-11-12 14:55:20",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add welflau\u002Fai-dev-system --skill godot-dev",{"tool":69,"command":70},"bunx","bunx skills add welflau\u002Fai-dev-system --skill godot-dev",{"tool":72,"command":73},"pnpm","pnpm dlx skills add welflau\u002Fai-dev-system --skill godot-dev","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fgodot-mcp\u002Fskills\u002Fgodot-dev\u002FSKILL.md",true,[],[78,111,141,166,191,212],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":82,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":51},"01M6HSTDP4M3JFXEBK91VFB4PA","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Fweb-artifacts-builder\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000009","前端开发",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"web artifacts builder","web","artifacts","artifacts builder","builder","frontend","css","components","react","routing","state management","state","file","Tailwind","use","single-file","simple","ui components","multi","for","single",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":82,"licenseFileUrl":115,"sourceHtmlUrl":116,"categories":117,"keywords":125,"publishedAt":51},"01M6HSDXH0JSP8R3QTNY9XZ8HN","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Ffrontend-design\u002FSKILL.md",[118,119,122],{"categoryNo":87,"categoryName":88,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":120,"categoryName":121,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":123,"categoryName":124,"taxonomyType":28,"taxonomyTypeDesc":29},"01JBSEEDCAT000000000000032","设计师",[95,126,127,96,91,97,98,128,129,130,92,131,132,133,104,134,135,136,137,138,139,140],"design","frontend design","react components","create","code","examples","applications","landing","ui design","pages","aesthetics","web ui","with","generic","when",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":82,"licenseFileUrl":145,"sourceHtmlUrl":146,"categories":147,"keywords":149,"publishedAt":51},"01M6HSA77QYVP7A72HREGTDN2C","algorithmic-art","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fplugins\u002Falgorithmic-art\u002FSKILL.md",[148],{"categoryNo":120,"categoryName":121,"taxonomyType":20,"taxonomyTypeDesc":21},[150,151,152,129,130,153,154,155,156,104,157,158,159,160,138,161,162,163,164,165,140],"algorithmic art","Art","algorithmic","flow","js","work","interactive","generative art","exploration","systems","users","Existing","request","generative","copyright","fields",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":82,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":51},"01M6HS9HE0X390Y6RQKTY1YNGJ","theme-factory","Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors\u002Ffonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Ftheme-factory\u002FSKILL.md",[173],{"categoryNo":120,"categoryName":121,"taxonomyType":20,"taxonomyTypeDesc":21},[175,176,177,178,179,180,92,181,182,183,133,184,185,135,186,138,187,188,189,109,190,34],"theme factory","factory","theme","docs","toolkit","generate","SET","fly","slides","styling","artifact","themes","you","fonts","can","apply",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":198,"publishedAt":51},"01M6HS74GASM6FJ77F83EY679E","browsing","Use when you need direct browser control - teaches Chrome DevTools Protocol for controlling existing browser sessions, multi-tab management, form automation, and content extraction via use_browser MCP tool","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fsuperpowers-chrome\u002Fskills\u002Fbrowsing\u002FSKILL.md",[197],{"categoryNo":23,"categoryName":24,"taxonomyType":20,"taxonomyTypeDesc":21},[193,35,199,200,201,202,203,204,205,206,207,104,208,209,210,211,108,187,109,161],"automation","chrome","sessions","protocol","browser","devtools","chrome devtools","tool","direct","browser control","control","via","form",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":82,"licenseFileUrl":216,"sourceHtmlUrl":217,"categories":218,"keywords":225,"publishedAt":51},"01M6HS6BZT2CKDNQ6YF20DXN4T","slack-gif-creator","Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like \"make me a GIF of X doing Y for Slack.\"","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fwelflau\u002Fai-dev-system\u002Fblob\u002Fmain\u002Fbackend\u002Fskills\u002Fmarketplace\u002Fcodebuddy-plugins-official\u002Fexternal_plugins\u002Fslack-gif-creator\u002FSKILL.md",[219,222],{"categoryNo":220,"categoryName":221,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":223,"categoryName":224,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",[226,227,228,229,230,231,232,233,234,104,235,160,41,236,237,109,162,140],"slack gif creator","slack","gif","creator","validation","Tools","constraints","Animation","knowledge","me","Utilities","concepts"]