[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KRA4PMAP90K176XWRSXX3D":3,"skill-same:01M6KRA4PMAP90K176XWRSXX3D":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6KRA4PMAP90K176XWRSXX3D","godot-mentor",null,"Use when the user wants to learn Godot while building — teaching mode that explains the concept, the editor setup, and what to verify, instead of just delivering code. Triggers on \"teach me\", \"explain as we go\", \"I'm learning Godot\", \"guide me\", \"walk me through\", \"help me understand\".","jame581\u002FGodotPrompter","jame581","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F21112138?v=4","01M6KR3KEQ9Z30WVJRR2E2ZVXE","Jan Mesarč","01M6KR3KJVRMPDSMASQPBCBVK3",962,"MIT","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fgodot-mentor\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"mentor","godot","godot mentor","when","teach me","understand","help","editor","verify","me","explain","code","teaching","learn","use","triggers","learning","mode","just","as","concept","2026-11-10 10:12:30",false,"---\nname: godot-mentor\ndescription: Use when the user wants to learn Godot while building — teaching mode that explains the concept, the editor setup, and what to verify, instead of just delivering code. Triggers on \"teach me\", \"explain as we go\", \"I'm learning Godot\", \"guide me\", \"walk me through\", \"help me understand\".\n---\n\n# Godot Mentor Mode\n\n> **Related skills:** **godot-brainstorming** for design exploration before building, **godot-project-setup** for scaffolding, **godot-code-review** for reviewing finished work, **godot-debugging** for diagnosing runtime issues.\n\nMentor mode changes the **shape** of an answer, not its **source of truth**. It wraps the\ndomain skills — it never replaces them.\n\n## 1. The wrapping rule\n\n**Always load the matching domain skill first, then deliver it through the contract below.**\n\n```\n\"add double jump\"  +  mentor mode\n   1. invoke godot-prompter:player-controller   \u003C- still authoritative\n   2. deliver its guidance through the 5 beats  \u003C- what mentor mode adds\n```\n\nAnswering from general Godot knowledge because \"it's just teaching\" is the primary failure of\nthis mode. The routing table in `using-godot-prompter` applies in full.\n\n## 2. The five beats\n\n\u003C!-- MENTOR-CARD-START -->\n**Mentor mode is ACTIVE for this project.** Load the matching `godot-prompter:*` domain skill\nfirst, then deliver it through these five beats:\n\n1. **Concept** — the Godot idea, and *why this node\u002FAPI* rather than the obvious alternative.\n2. **Editor** — the GUI half: nodes to add, Inspector properties to set, exports to wire, and for beginners the click-path when a reference covers it.\n3. **Code** — annotated GDScript, then the C# equivalent.\n4. **Verify** — run it: what should happen, the likeliest failure, and the fix.\n5. **Next** — *one* suggested extension. Not five.\n\n**Editor beat: click-paths come from the references, never from memory.** Say freely *what* to\nset up: which nodes to add, which properties to set (by property name) and to what values, which\nexported variables to wire, which resource goes where. Before telling the learner anything they\nclick, press, or read on screen — a menu or right-click item, a dropdown entry, an Inspector\nsection name, a dock, tab, dialog, or button, a keyboard shortcut, or where any of it sits —\ninvoke `godot-prompter:godot-mentor` and read its `references\u002Feditor-recipes.md` (how to do it)\nor `references\u002Feditor-navigation.md` (where it is), then use the wording given for the project's\nGodot version. That applies to a click-path found in a domain skill too. Click-paths are for\n`beginner` level: at `intermediate`, name what to set up and skip the clicks, unless the step\ndiffers between Godot versions or the user asks where something is. If the references do\nnot cover it, name the panel only if `editor-navigation.md` lists it, say the rest is not\ncovered, and stop — a wrong click-path is worse than none.\n\n**Scope: exactly what was asked.** Deliver the requested feature complete and sound, including\nthe limits that stop it breaking in play (a dash needs a cooldown or air limit). Never hold part\nof the ask back for Beat 5. Add nothing else: domain recipes are production-complete, so strip\ntheir extras (tweens, colour flashes, extra methods or signals) unless the user asked for them.\nBeat 5 may name *one* of those extras.\n\n**Off-ramp.** \"just give me the code\" \u002F \"skip the explanation\" → drop to normal delivery and\nset `\"mode\": \"normal\"` in the state file.\n\n**With `godot-grill`:** when the work is new or its requirements are unclear, let `godot-grill`\nsettle the decisions first; mentor mode then teaches the result.\n\u003C!-- MENTOR-CARD-END -->\n\n## 3. Turning it on and off\n\nState lives in the **user's home directory**, keyed by project path — never in the user's game\nrepository:\n\n```\n~\u002F.godot-prompter\u002Fstate\u002F\u003Cfirst-16-hex-of-sha256(CANONICAL project path)>.json\n```\n\n**Canonical path form — get this exactly right or the hook will not find the file.** Absolute,\n**forward slashes**, native drive letter:\n\n| Platform | Canonical form |\n|---|---|\n| Windows | `C:\u002FUsers\u002Fyou\u002Fgame` — not `C:\\Users\\you\\game`, and not `\u002Fc\u002FUsers\u002Fyou\u002Fgame` |\n| macOS \u002F Linux | `\u002Fhome\u002Fyou\u002Fgame` |\n\nThe same directory has two spellings on Windows: bash sees `\u002Fc\u002FUsers\u002Fyou\u002Fgame`, most tools see\n`C:\\Users\\you\\game`. Hashing the raw path yields a different key on each side and mentor mode\nsilently never restores. The hook normalizes with `cygpath -m`; match that form when you write.\n\nCompute the key exactly like the hook does:\n\n```bash\n# $P is the canonical project path, e.g. C:\u002FUsers\u002Fyou\u002Fgame\nprintf '%s' \"$P\" | sha256sum | cut -c1-16      # or: shasum -a 256\n```\n\nThe failure mode is silent — a wrong key just means mentor mode never comes back — so verify the\nfile lands where the hook looks before relying on it.\n\n```json\n{\n  \"project\": \"C:\u002FUsers\u002Fyou\u002Fgame\",\n  \"mode\": \"mentor\",\n  \"level\": \"beginner\",\n  \"language\": \"gdscript\"\n}\n```\n\n> `project` is shown in the Windows canonical form because that is the platform where getting it\n> wrong fails silently. On macOS \u002F Linux it is just the absolute path, e.g. `\u002Fhome\u002Fyou\u002Fgame`.\n\n| Key | Values | Meaning |\n|---|---|---|\n| `project` | absolute path | Which project this state belongs to; guards hash collisions |\n| `mode` | `mentor` \\| `normal` | Whether the five beats apply |\n| `level` | `beginner` \\| `intermediate` | How much of Beat 1 and Beat 2 to spell out |\n| `language` | `gdscript` \\| `csharp` | Which example leads |\n| `section_offer` | `declined` | Set when the user refuses the `## GodotPrompter` instructions section, so the hook stops offering it |\n\n**Why not in the project?** A teaching level is a per-*developer* preference. In-repo it would\nbe committed by default (Godot's `.gitignore` does not cover it), conflict on every pull between\ndevelopers at different levels, and require asking permission to create a directory in someone's\ngame repo. None of that arises in `$HOME`.\n\n**Godot version and renderer are deliberately NOT stored.** They are read live from\n`project.godot` on every session start, so they cannot go stale after an engine upgrade.\n\nAsk for `level` **once**, on activation, then remember it. Never re-ask each turn. Merge into an\nexisting state file rather than clobbering unrelated keys.\n\n**If you cannot write the file** (no write or shell tool in this session), say so in **one line\nat the end of the answer** and carry on — mentor mode still applies for this conversation. Do\nnot open with it, do not retry, and do not split it into a separate message.\n\nThe SessionStart hook re-reads this file, so mentor mode survives `\u002Fclear` and compaction. It\ndoes **not** reach subagents — `SessionStart` does not fire on subagent dispatch; a\n`## GodotPrompter` section in the project's agent instructions file (`CLAUDE.md`, or `AGENTS.md` \u002F\n`GEMINI.md` in an agent-agnostic repo) is what subagents read. On Codex and Antigravity (no hooks)\nthis skill still works; it just does not self-restore after a reset.\n\n## 4. Calibrating depth\n\n| `level` | Beat 1 (Concept) | Beat 2 (Editor) |\n|---|---|---|\n| `beginner` | Define the Godot term, contrast with the alternative, say why it matters here | Name every node and property explicitly |\n| `intermediate` | One or two sentences on the trade-off only | Only the non-obvious wiring, named — no walkthrough of adding nodes, attaching scripts, or building the scene tree, and a click-path only where the step differs by Godot version or the user asks where something is |\n\n`level` controls **how much** of each beat appears — never **whether** it appears.\n\n`level` is the user's Godot **baseline**, not a ceiling. When they name the concept they are stuck\non (\"intermediate, but signals confuse me\"), give **that concept** beginner depth in Beat 1 —\nit is the reason they asked. Everything else, including Beat 2, stays at their level: they\nalready know how to add a node, join a group, and register an autoload, so say *that* it is\nneeded, not how to click it.\n\n## 5. Anti-patterns\n\n| Anti-pattern | Why it is wrong | Instead |\n|---|---|---|\n| Answering without loading the domain skill | Loses verified, version-checked guidance | Invoke the skill, then teach it |\n| Giving a click-path that is not in the editor references | Godot's UI moved between 4.3 and 4.8; a remembered path is often a wrong one | Read `references\u002Feditor-recipes.md` \u002F `editor-navigation.md`; if it is not there, name the panel only if `editor-navigation.md` lists it and say the rest is not covered |\n| Growing the feature to create teaching material, or delivering a domain recipe's extras verbatim | The user asked for one thing | Deliver that thing, whole; name at most one extra in Beat 5 |\n| Deferring part of the ask to Beat 5 (\"add a cooldown next\") | Ships a feature that breaks in play | Beat 5 extends a finished feature; it never completes one |\n| Re-asking `level` every turn | Feels like the agent has amnesia | Read it from state |\n| Five \"next steps\" | Paralyses a learner | Exactly one |\n| Skipping the C# example because it is a teaching answer | C# parity is a repo-wide promise | GDScript first, then C# |\n| Writing state into the user's game repo | Personal preference in a shared file; gets committed | `~\u002F.godot-prompter\u002Fstate\u002F` |\n\n## 6. Worked example\n\n**User:** \"teach me as we go — I want the player to double jump\"\n\n**Beat 1 — Concept.** Godot's `CharacterBody2D` has no built-in jump counter. Track jumps\nused, not a `can_double_jump` bool: a counter generalises to triple jumps and reads honestly\nagainst `is_on_floor()`, which is your reset signal.\n\n**Beat 2 — Editor.** No new nodes. On your player script, add an exported `max_jumps` so you\ncan tune it in the Inspector without editing code.\n\n**Beat 3 — Code.**\n\n```gdscript\nextends CharacterBody2D\n\n@export var max_jumps: int = 2\n@export var jump_velocity: float = -400.0\n\nvar _jumps_used: int = 0\n\nfunc _physics_process(delta: float) -> void:\n    if not is_on_floor():\n        velocity += get_gravity() * delta\n    else:\n        _jumps_used = 0  # landing is the only reset\n\n    if Input.is_action_just_pressed(\"jump\") and _jumps_used \u003C max_jumps:\n        velocity.y = jump_velocity\n        _jumps_used += 1\n\n    move_and_slide()\n```\n\n```csharp\nusing Godot;\n\npublic partial class Player : CharacterBody2D\n{\n    [Export] public int MaxJumps { get; set; } = 2;\n    [Export] public float JumpVelocity { get; set; } = -400.0f;\n\n    private int _jumpsUsed;\n\n    public override void _PhysicsProcess(double delta)\n    {\n        Vector2 velocity = Velocity;\n\n        if (!IsOnFloor())\n            velocity += GetGravity() * (float)delta;\n        else\n            _jumpsUsed = 0; \u002F\u002F landing is the only reset\n\n        if (Input.IsActionJustPressed(\"jump\") && _jumpsUsed \u003C MaxJumps)\n        {\n            velocity.Y = JumpVelocity;\n            _jumpsUsed++;\n        }\n\n        Velocity = velocity;\n        MoveAndSlide();\n    }\n}\n```\n\n**Beat 4 — Verify.** Run the scene: two jumps, then nothing until you land. Infinite jumps means\n`is_on_floor()` is true mid-air — your collision shape is probably overlapping the floor. A weak\nsecond jump means you are adding to a falling `velocity.y`; assign it rather than accumulating\n(this code already assigns).\n\n**Beat 5 — Next.** Add coyote time — a short grace period after leaving a ledge where the first\njump still counts as grounded.\n\n## 7. Editor references\n\nBeat 2 may give click-paths, but only ones copied from these two files. Both are checked\nagainst the Godot docs and the engine source for every version from 4.3 to 4.8 (4.8 against the\n4.8-beta3 source) and flag every step that differs.\n\n- [references\u002Feditor-recipes.md](references\u002Feditor-recipes.md) — numbered steps for the\n  workflows a learner meets first: adding nodes and scripts, autoloads, Input Map, signals,\n  AnimationPlayer, TileSet and TileMapLayer, import settings, themes, export presets, and the\n  remote scene tree, among others — read the file for the full set of 20.\n- [references\u002Feditor-navigation.md](references\u002Feditor-navigation.md) — where each dock, main\n  screen, bottom panel, and Project Settings tab is, and how to reopen it.\n\nPick the alternative that matches the Godot version in the session card (it is read from\n`project.godot`). When a step has version alternatives and the version is unknown, give the\nalternatives rather than guessing one. For a project on a Godot version outside 4.3 to 4.8 the\nreferences do not apply as written: say so, and do not apply the `4.6+` alternatives to a newer\nversion unchecked.\n\n## Implementation Checklist\n\n- [ ] Loaded the matching `godot-prompter:*` domain skill before answering\n- [ ] All five beats present, in order\n- [ ] Every click-path in the Editor beat came from the editor references; for anything else, a panel was named only if `editor-navigation.md` lists it and the answer says the rest is not covered\n- [ ] Both GDScript and C# examples given (unless the user pinned one language)\n- [ ] `level` read from state, not re-asked\n- [ ] The whole ask delivered and sound, nothing more — domain-recipe extras stripped\n- [ ] Exactly one suggestion in Beat 5, extending a finished feature\n- [ ] State written to `~\u002F.godot-prompter\u002Fstate\u002F`, never into the user's game repo\n","# Godot Mentor Mode\n\n> **Related skills:** **godot-brainstorming** for design exploration before building, **godot-project-setup** for scaffolding, **godot-code-review** for reviewing finished work, **godot-debugging** for diagnosing runtime issues.\n\nMentor mode changes the **shape** of an answer, not its **source of truth**. It wraps the\ndomain skills — it never replaces them.\n\n## 1. The wrapping rule\n\n**Always load the matching domain skill first, then deliver it through the contract below.**\n\n```\n\"add double jump\"  +  mentor mode\n   1. invoke godot-prompter:player-controller   \u003C- still authoritative\n   2. deliver its guidance through the 5 beats  \u003C- what mentor mode adds\n```\n\nAnswering from general Godot knowledge because \"it's just teaching\" is the primary failure of\nthis mode. The routing table in `using-godot-prompter` applies in full.\n\n## 2. The five beats\n\n\u003C!-- MENTOR-CARD-START -->\n**Mentor mode is ACTIVE for this project.** Load the matching `godot-prompter:*` domain skill\nfirst, then deliver it through these five beats:\n\n1. **Concept** — the Godot idea, and *why this node\u002FAPI* rather than the obvious alternative.\n2. **Editor** — the GUI half: nodes to add, Inspector properties to set, exports to wire, and for beginners the click-path when a reference covers it.\n3. **Code** — annotated GDScript, then the C# equivalent.\n4. **Verify** — run it: what should happen, the likeliest failure, and the fix.\n5. **Next** — *one* suggested extension. Not five.\n\n**Editor beat: click-paths come from the references, never from memory.** Say freely *what* to\nset up: which nodes to add, which properties to set (by property name) and to what values, which\nexported variables to wire, which resource goes where. Before telling the learner anything they\nclick, press, or read on screen — a menu or right-click item, a dropdown entry, an Inspector\nsection name, a dock, tab, dialog, or button, a keyboard shortcut, or where any of it sits —\ninvoke `godot-prompter:godot-mentor` and read its `references\u002Feditor-recipes.md` (how to do it)\nor `references\u002Feditor-navigation.md` (where it is), then use the wording given for the project's\nGodot version. That applies to a click-path found in a domain skill too. Click-paths are for\n`beginner` level: at `intermediate`, name what to set up and skip the clicks, unless the step\ndiffers between Godot versions or the user asks where something is. If the references do\nnot cover it, name the panel only if `editor-navigation.md` lists it, say the rest is not\ncovered, and stop — a wrong click-path is worse than none.\n\n**Scope: exactly what was asked.** Deliver the requested feature complete and sound, including\nthe limits that stop it breaking in play (a dash needs a cooldown or air limit). Never hold part\nof the ask back for Beat 5. Add nothing else: domain recipes are production-complete, so strip\ntheir extras (tweens, colour flashes, extra methods or signals) unless the user asked for them.\nBeat 5 may name *one* of those extras.\n\n**Off-ramp.** \"just give me the code\" \u002F \"skip the explanation\" → drop to normal delivery and\nset `\"mode\": \"normal\"` in the state file.\n\n**With `godot-grill`:** when the work is new or its requirements are unclear, let `godot-grill`\nsettle the decisions first; mentor mode then teaches the result.\n\u003C!-- MENTOR-CARD-END -->\n\n## 3. Turning it on and off\n\nState lives in the **user's home directory**, keyed by project path — never in the user's game\nrepository:\n\n```\n~\u002F.godot-prompter\u002Fstate\u002F\u003Cfirst-16-hex-of-sha256(CANONICAL project path)>.json\n```\n\n**Canonical path form — get this exactly right or the hook will not find the file.** Absolute,\n**forward slashes**, native drive letter:\n\n| Platform | Canonical form |\n|---|---|\n| Windows | `C:\u002FUsers\u002Fyou\u002Fgame` — not `C:\\Users\\you\\game`, and not `\u002Fc\u002FUsers\u002Fyou\u002Fgame` |\n| macOS \u002F Linux | `\u002Fhome\u002Fyou\u002Fgame` |\n\nThe same directory has two spellings on Windows: bash sees `\u002Fc\u002FUsers\u002Fyou\u002Fgame`, most tools see\n`C:\\Users\\you\\game`. Hashing the raw path yields a different key on each side and mentor mode\nsilently never restores. The hook normalizes with `cygpath -m`; match that form when you write.\n\nCompute the key exactly like the hook does:\n\n```bash\n# $P is the canonical project path, e.g. C:\u002FUsers\u002Fyou\u002Fgame\nprintf '%s' \"$P\" | sha256sum | cut -c1-16      # or: shasum -a 256\n```\n\nThe failure mode is silent — a wrong key just means mentor mode never comes back — so verify the\nfile lands where the hook looks before relying on it.\n\n```json\n{\n  \"project\": \"C:\u002FUsers\u002Fyou\u002Fgame\",\n  \"mode\": \"mentor\",\n  \"level\": \"beginner\",\n  \"language\": \"gdscript\"\n}\n```\n\n> `project` is shown in the Windows canonical form because that is the platform where getting it\n> wrong fails silently. On macOS \u002F Linux it is just the absolute path, e.g. `\u002Fhome\u002Fyou\u002Fgame`.\n\n| Key | Values | Meaning |\n|---|---|---|\n| `project` | absolute path | Which project this state belongs to; guards hash collisions |\n| `mode` | `mentor` \\| `normal` | Whether the five beats apply |\n| `level` | `beginner` \\| `intermediate` | How much of Beat 1 and Beat 2 to spell out |\n| `language` | `gdscript` \\| `csharp` | Which example leads |\n| `section_offer` | `declined` | Set when the user refuses the `## GodotPrompter` instructions section, so the hook stops offering it |\n\n**Why not in the project?** A teaching level is a per-*developer* preference. In-repo it would\nbe committed by default (Godot's `.gitignore` does not cover it), conflict on every pull between\ndevelopers at different levels, and require asking permission to create a directory in someone's\ngame repo. None of that arises in `$HOME`.\n\n**Godot version and renderer are deliberately NOT stored.** They are read live from\n`project.godot` on every session start, so they cannot go stale after an engine upgrade.\n\nAsk for `level` **once**, on activation, then remember it. Never re-ask each turn. Merge into an\nexisting state file rather than clobbering unrelated keys.\n\n**If you cannot write the file** (no write or shell tool in this session), say so in **one line\nat the end of the answer** and carry on — mentor mode still applies for this conversation. Do\nnot open with it, do not retry, and do not split it into a separate message.\n\nThe SessionStart hook re-reads this file, so mentor mode survives `\u002Fclear` and compaction. It\ndoes **not** reach subagents — `SessionStart` does not fire on subagent dispatch; a\n`## GodotPrompter` section in the project's agent instructions file (`CLAUDE.md`, or `AGENTS.md` \u002F\n`GEMINI.md` in an agent-agnostic repo) is what subagents read. On Codex and Antigravity (no hooks)\nthis skill still works; it just does not self-restore after a reset.\n\n## 4. Calibrating depth\n\n| `level` | Beat 1 (Concept) | Beat 2 (Editor) |\n|---|---|---|\n| `beginner` | Define the Godot term, contrast with the alternative, say why it matters here | Name every node and property explicitly |\n| `intermediate` | One or two sentences on the trade-off only | Only the non-obvious wiring, named — no walkthrough of adding nodes, attaching scripts, or building the scene tree, and a click-path only where the step differs by Godot version or the user asks where something is |\n\n`level` controls **how much** of each beat appears — never **whether** it appears.\n\n`level` is the user's Godot **baseline**, not a ceiling. When they name the concept they are stuck\non (\"intermediate, but signals confuse me\"), give **that concept** beginner depth in Beat 1 —\nit is the reason they asked. Everything else, including Beat 2, stays at their level: they\nalready know how to add a node, join a group, and register an autoload, so say *that* it is\nneeded, not how to click it.\n\n## 5. Anti-patterns\n\n| Anti-pattern | Why it is wrong | Instead |\n|---|---|---|\n| Answering without loading the domain skill | Loses verified, version-checked guidance | Invoke the skill, then teach it |\n| Giving a click-path that is not in the editor references | Godot's UI moved between 4.3 and 4.8; a remembered path is often a wrong one | Read `references\u002Feditor-recipes.md` \u002F `editor-navigation.md`; if it is not there, name the panel only if `editor-navigation.md` lists it and say the rest is not covered |\n| Growing the feature to create teaching material, or delivering a domain recipe's extras verbatim | The user asked for one thing | Deliver that thing, whole; name at most one extra in Beat 5 |\n| Deferring part of the ask to Beat 5 (\"add a cooldown next\") | Ships a feature that breaks in play | Beat 5 extends a finished feature; it never completes one |\n| Re-asking `level` every turn | Feels like the agent has amnesia | Read it from state |\n| Five \"next steps\" | Paralyses a learner | Exactly one |\n| Skipping the C# example because it is a teaching answer | C# parity is a repo-wide promise | GDScript first, then C# |\n| Writing state into the user's game repo | Personal preference in a shared file; gets committed | `~\u002F.godot-prompter\u002Fstate\u002F` |\n\n## 6. Worked example\n\n**User:** \"teach me as we go — I want the player to double jump\"\n\n**Beat 1 — Concept.** Godot's `CharacterBody2D` has no built-in jump counter. Track jumps\nused, not a `can_double_jump` bool: a counter generalises to triple jumps and reads honestly\nagainst `is_on_floor()`, which is your reset signal.\n\n**Beat 2 — Editor.** No new nodes. On your player script, add an exported `max_jumps` so you\ncan tune it in the Inspector without editing code.\n\n**Beat 3 — Code.**\n\n```gdscript\nextends CharacterBody2D\n\n@export var max_jumps: int = 2\n@export var jump_velocity: float = -400.0\n\nvar _jumps_used: int = 0\n\nfunc _physics_process(delta: float) -> void:\n    if not is_on_floor():\n        velocity += get_gravity() * delta\n    else:\n        _jumps_used = 0  # landing is the only reset\n\n    if Input.is_action_just_pressed(\"jump\") and _jumps_used \u003C max_jumps:\n        velocity.y = jump_velocity\n        _jumps_used += 1\n\n    move_and_slide()\n```\n\n```csharp\nusing Godot;\n\npublic partial class Player : CharacterBody2D\n{\n    [Export] public int MaxJumps { get; set; } = 2;\n    [Export] public float JumpVelocity { get; set; } = -400.0f;\n\n    private int _jumpsUsed;\n\n    public override void _PhysicsProcess(double delta)\n    {\n        Vector2 velocity = Velocity;\n\n        if (!IsOnFloor())\n            velocity += GetGravity() * (float)delta;\n        else\n            _jumpsUsed = 0; \u002F\u002F landing is the only reset\n\n        if (Input.IsActionJustPressed(\"jump\") && _jumpsUsed \u003C MaxJumps)\n        {\n            velocity.Y = JumpVelocity;\n            _jumpsUsed++;\n        }\n\n        Velocity = velocity;\n        MoveAndSlide();\n    }\n}\n```\n\n**Beat 4 — Verify.** Run the scene: two jumps, then nothing until you land. Infinite jumps means\n`is_on_floor()` is true mid-air — your collision shape is probably overlapping the floor. A weak\nsecond jump means you are adding to a falling `velocity.y`; assign it rather than accumulating\n(this code already assigns).\n\n**Beat 5 — Next.** Add coyote time — a short grace period after leaving a ledge where the first\njump still counts as grounded.\n\n## 7. Editor references\n\nBeat 2 may give click-paths, but only ones copied from these two files. Both are checked\nagainst the Godot docs and the engine source for every version from 4.3 to 4.8 (4.8 against the\n4.8-beta3 source) and flag every step that differs.\n\n- [references\u002Feditor-recipes.md](references\u002Feditor-recipes.md) — numbered steps for the\n  workflows a learner meets first: adding nodes and scripts, autoloads, Input Map, signals,\n  AnimationPlayer, TileSet and TileMapLayer, import settings, themes, export presets, and the\n  remote scene tree, among others — read the file for the full set of 20.\n- [references\u002Feditor-navigation.md](references\u002Feditor-navigation.md) — where each dock, main\n  screen, bottom panel, and Project Settings tab is, and how to reopen it.\n\nPick the alternative that matches the Godot version in the session card (it is read from\n`project.godot`). When a step has version alternatives and the version is unknown, give the\nalternatives rather than guessing one. For a project on a Godot version outside 4.3 to 4.8 the\nreferences do not apply as written: say so, and do not apply the `4.6+` alternatives to a newer\nversion unchecked.\n\n## Implementation Checklist\n\n- [ ] Loaded the matching `godot-prompter:*` domain skill before answering\n- [ ] All five beats present, in order\n- [ ] Every click-path in the Editor beat came from the editor references; for anything else, a panel was named only if `editor-navigation.md` lists it and the answer says the rest is not covered\n- [ ] Both GDScript and C# examples given (unless the user pinned one language)\n- [ ] `level` read from state, not re-asked\n- [ ] The whole ask delivered and sound, nothing more — domain-recipe extras stripped\n- [ ] Exactly one suggestion in Beat 5, extending a finished feature\n- [ ] State written to `~\u002F.godot-prompter\u002Fstate\u002F`, never into the user's game repo\n",{"name":5,"description":7},"master","60c28fdc40706a24576731e9fb3508b9c95258ad","skills\u002Fgodot-mentor",63,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter","https:\u002F\u002Fgithub.com\u002Fjame581","https:\u002F\u002Fjanmesarc.online\u002F","Software engineer. My biggest passion is game development.","2026-11-13 02:28:46",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add jame581\u002FGodotPrompter --skill godot-mentor",{"tool":60,"command":61},"bunx","bunx skills add jame581\u002FGodotPrompter --skill godot-mentor",{"tool":63,"command":64},"pnpm","pnpm dlx skills add jame581\u002FGodotPrompter --skill godot-mentor","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fgodot-mentor\u002FSKILL.md",true,[68,74],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Feditor-navigation.md","REFERENCE","参考文档",20113,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fgodot-mentor\u002Freferences\u002Feditor-navigation.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"references\u002Feditor-recipes.md",29312,"https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fgodot-mentor\u002Freferences\u002Feditor-recipes.md",[79,98,119,149,173,191],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":40},"01M6KRFE5BR2PSD08ZKDAS66R7","xr-development","Use when building VR\u002FAR\u002FXR applications — OpenXR setup, XROrigin3D, hand tracking, controllers, passthrough, and Meta Quest deployment in Godot 4.3+","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fxr-development\u002FSKILL.md",[],[86,87,22,88,20,89,90,91,92,93,94,33,95,96,97],"xr development","development","deployment","vr","setup","tracking","godot 4","ar","hand","Meta","applications","quest",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":40},"01M6KRF8GZTG1TAS506MFBSGFC","web-services","Use when a Godot game calls a web server — HTTPRequest, downloads, REST\u002FJSON APIs, auth headers, WebSocketPeer clients, TLS, retries, and keeping secrets out of the build. Not for game networking\u002FRPCs (multiplayer-basics) or browser export (web-export)","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-services\u002FSKILL.md",[],[105,106,107,108,109,110,111,112,33,22,20,113,114,115,116,117,118],"web services","web","services","tls","retries","calling","auth","downloads","clients","headers","secrets","json","build","REST",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":130,"publishedAt":40},"01M6KRF38Q4WSKAYFS56PG87T0","web-export","Use when shipping a Godot game to the browser — Web export preset options, threads vs no-threads and COOP\u002FCOEP headers, hosting on itch.io or your own server, PWA, JavaScriptBridge, user:\u002F\u002F persistence, audio and input limits, and load size","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fweb-export\u002FSKILL.md",[125],{"categoryNo":126,"categoryName":127,"taxonomyType":128,"taxonomyTypeDesc":129},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[106,131,132,133,134,135,136,137,114,138,139,22,140,141,142,143,144,145,33,146,147,148],"export","web export","threads","limits","shipping","size","options","hosting","input","Coop","preset","browser","game","io","load","pwa","Audio","server",{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":163,"publishedAt":40},"01M6KREYFETEBH62ZTN6EZH2X3","using-godot-prompter","Bootstrap skill — establishes how to find and use GodotPrompter skills, with platform-specific tool mapping","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fusing-godot-prompter\u002FSKILL.md",[155,158],{"categoryNo":156,"categoryName":157,"taxonomyType":128,"taxonomyTypeDesc":129},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":159,"categoryName":160,"taxonomyType":161,"taxonomyTypeDesc":162},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[20,164,165,166,167,33,168,169,170,171,172],"using godot prompter","find","with","bootstrap","tool","platform","mapping","how","how to",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":40},"01M6KRER5G7EQWKGAFN8QJKQ69","tween-animation","Use when implementing tweens — property animation, method tweening, chaining, parallel sequences, easing, and common UI\u002Fgameplay motion recipes","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Ftween-animation\u002FSKILL.md",[],[180,181,33,182,183,184,185,186,187,188,189,22,190],"tween animation","Animation","motion","parallel","gameplay","chaining","ui","recipes","common","implementing","sequences",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":195,"categories":196,"keywords":197,"publishedAt":40},"01M6KREKGCQMVDV8WX7HWX8BZG","state-machine","Use when building a state machine or refactoring logic into one — enum, node, and resource-based FSM patterns with trade-offs. Not for adding states to an existing one","https:\u002F\u002Fgithub.com\u002Fjame581\u002FGodotPrompter\u002Fblob\u002Fmaster\u002Fskills\u002Fstate-machine\u002FSKILL.md",[],[198,199,200,20,22,201,202,203,204,205,166,33,189,206],"state","state machine","machine","patterns","node","fsm","state machines","trade","trade-offs"]