[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81510":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},81510,"standboy","mfbz\u002Fstandboy","mfbz","A Game Boy that wakes up while your agent works.",null,"TypeScript",29,3,28,0,1,42.41,"MIT License",false,"main",true,[],"2026-06-12 04:01:34","\u003Cp align=\"center\">\n  \u003Cimg src=\"media\u002Ficon-512.png\" alt=\"Standboy\" width=\"256\" height=\"256\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">Standboy\u003C\u002Fh1>\n\n\u003Cp align=\"center\">A Game Boy that wakes up while your agent works.\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=mfbzme.standboy\">\u003Cimg alt=\"VS Code Marketplace\" src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fpackage-json\u002Fv\u002Fmfbz\u002Fstandboy?label=VS%20Code%20Marketplace&color=332c50&labelColor=332c50\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fopen-vsx.org\u002Fextension\u002Fmfbzme\u002Fstandboy\">\u003Cimg alt=\"Open VSX\" src=\"https:\u002F\u002Fimg.shields.io\u002Fopen-vsx\u002Fv\u002Fmfbzme\u002Fstandboy?label=Open%20VSX&color=94e344&labelColor=332c50\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg alt=\"License: MIT\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-e2f3e4?labelColor=332c50\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"media\u002Fpreview.gif\" alt=\"Standboy auto-expanding when an agent starts working, and tucking back down when it finishes\" width=\"800\" \u002F>\n\u003C\u002Fp>\n\nWhen your AI coding agent starts generating, Standboy auto-expands a sidebar Game Boy emulator. When the agent finishes, Standboy tucks back down and the emulator pauses. He resumes mid-frame the next time your agent wakes him up.\n\nThe hidden cost of agent wait time isn't boredom — it's the tab-switch to Twitter, Reddit, or Slack, where ten minutes evaporate before you remember the agent finished. A built-in micro-distraction with a hard pause boundary keeps you in the IDE.\n\n## Features\n\n- **Auto-show on agent activity, auto-hide when idle.** Hooks into Cursor's native agent and Claude Code via their official lifecycle APIs (one toggle in the panel's menu wires it up). Falls back to an edit-burst heuristic for agents we don't have specific support for. The panel pops up only when the agent has actually been working for a few seconds, and tucks back after a similar idle window — never strobes on quick \"let me check\" turns.\n- **Resumes mid-frame.** The webview is retained when hidden — Standboy pauses in place and picks up exactly where he left off.\n- **Persistent ROM library and saves.** Loaded ROMs are copied into a managed library; in-game saves mirror to disk on panel hide, page unload, and before Export — between writes the live state lives in IndexedDB so you never lose progress. Both survive VSCode restarts.\n- **Auto-identified covers and titles.** ROM dumps are matched by SHA-1 against a bundled No-Intro database — the same approach RetroArch uses — so the library grid shows real box art and the canonical title regardless of what the file is named on disk.\n- **Game Boy, Game Boy Color, and Game Boy Advance.** Loads `.gb`, `.gbc`, and `.gba` ROMs. Platform auto-detected from the file extension.\n- **User-supplied ROMs only.** No bundled games, no links to ROM sources. You bring your own legally-obtained file from disk.\n- **Five built-in palettes**, plus a custom 4-hex array. Palette changes apply only to the chrome — the game itself renders at native fidelity.\n- **Keyboard controls, fully rebindable.** Arrow keys drive the D-pad; A, B, Start, and Select can be bound to any key from the in-panel menu.\n- **No telemetry.** The only outbound network calls are one-shot cover-art fetches against [libretro-thumbnails](https:\u002F\u002Fthumbnails.libretro.com) — performed by the extension host (not the iframe), cached locally, never repeated for the same ROM. The emulator ([EmulatorJS](https:\u002F\u002Femulatorjs.org)) and the No-Intro database are bundled and run offline.\n\n## Install\n\n**VS Code** — open the Extensions panel and search for **Standboy**, or:\n\n```bash\ncode --install-extension mfbzme.standboy\n```\n\n**Cursor and other VS Code forks** — install from the Extensions panel. Cursor uses Open VSX as its registry by default.\n\n**From a `.vsix`** (pre-release builds):\n\n```bash\ncode --install-extension standboy-x.y.z.vsix\n```\n\n## First launch\n\nThe first time Standboy activates, it auto-opens the panel — no modal. You'll see:\n\n- An empty header (`STANDBOY` activity dot, ROM title slot, `⋯` menu, mute icon)\n- A blank screen frame with the words **`no cartridge`**\n- A small **Auto-show during AI activity** card above the library grid, prompting you to connect whichever agent is detected (Claude Code if `~\u002F.claude\u002Fsettings.json` exists, or Cursor if you're running inside Cursor). Click **Connect** to wire up the lifecycle hooks, or the **×** to dismiss it — you can always toggle the same thing later from the `⋯` menu under **Detection**.\n- An empty library grid showing only a dashed **+ Add ROM** tile\n\nAfter your first successful connect, a one-shot footnote reminds you to disconnect Detection before uninstalling Standboy (VSCode has no reliable uninstall hook). The footnote auto-dismisses after a few seconds, and there's an **×** to close it sooner.\n\nFrom here:\n\n1. Click the **+ Add ROM** tile (or **Load ROM…** from the menu drawer).\n2. Pick a `.gb`, `.gbc`, or `.gba` file from disk. Standboy copies it into your library, identifies it against the bundled No-Intro database, and starts playing.\n3. Cover art appears in the library grid a few seconds later as the libretro lookup completes (or a letter-tile fallback for homebrew\u002Fhacks).\n4. Next time you launch VSCode, Standboy auto-resumes the last ROM you played, with your save data restored.\n\n## Usage\n\nClick into the panel and the emulator takes keyboard input. Default bindings (right-hand on the arrows, left-hand on the action keys):\n\n| Key        | Action |\n| ---------- | ------ |\n| Arrow keys | D-pad  |\n| `Z`        | A      |\n| `X`        | B      |\n| `Enter`    | Start  |\n| `Shift`    | Select |\n\nOpen the menu (`⋯` → drawer drops down from the top) and click any of the four action chips (`A`, `B`, `Start`, `Sel`) to rebind — Standboy listens for the next keystroke and assigns it. Bindings persist to `\u003ClibraryRoot>\u002Fconfig.json` and roam with your library.\n\n### The menu\n\nThe `⋯` icon at the top-right opens a drawer that slides down from the top. Four sections inside:\n\n- **Audio** — a single Sound row with an `On \u002F Off` pill. Click anywhere on the row to toggle. Browser autoplay policies mean audio actually starts on the first click after the panel mounts; subsequent toggles are instant.\n- **Controls** — keyboard reference for the D-pad (arrows) and a row of four chips for `B`, `A`, `Start`, `Sel`. Click a chip → it turns green and listens for your next keystroke → assigns and saves. Press Esc to cancel.\n- **Detection** — one row per detected AI agent (Claude Code, Cursor) with an `On \u002F Off` pill. Click to install or remove the lifecycle hooks for that agent. Connections are **mutually exclusive**: turning one agent On automatically turns the other Off, so the two can never race over the same activity sentinel. If neither agent is detected on this system, you'll see a short message instead — Standboy still works as a manual emulator, the auto-show feature just stays off.\n- **Library** — Load ROM, Export save, Import save, Open library folder, Delete ROM, Show logs.\n\nClick the `×` in the drawer's top-right (or anywhere outside it) to close. Esc also closes.\n\n### Switching ROMs\n\nClick any cover in the library grid to switch to that ROM. The currently-playing ROM is highlighted with a green ring; clicking a different cover while a game is running brings up a confirmation prompt (the new game starts only after you confirm — your in-progress save has already been flushed by then, so cancelling is non-destructive). On confirm, Standboy persists which ROM is active and reloads — the new game's save is loaded automatically.\n\nThe **+ Add ROM** tile at the end of the grid opens the file picker.\n\n## Auto-show during AI activity\n\nStandboy wires itself into your agent's lifecycle hooks from the **Detection** section in the menu drawer. Once connected, the panel auto-appears the moment the agent starts thinking and tucks back when it stops — using the editor's own first-class signal, not edit-pattern guessing.\n\nOpen the panel's `⋯` menu, scroll to **Detection**, and turn on the agent you want connected. Detection is **mutually exclusive** — exactly one agent has Standboy hooks installed at a time, so a stop event from one can't accidentally hide the panel while the other is still working.\n\n- **Claude Code** (CLI or [VSCode extension](https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=anthropic.claude-code)) — appears in the Detection section if `~\u002F.claude\u002Fsettings.json` or `~\u002F.claude\u002Fprojects\u002F` exists. Toggling **On** adds entries for `UserPromptSubmit` and `PreToolUse` (start) and `Stop` (stop) to `~\u002F.claude\u002Fsettings.json`, merging non-destructively with whatever you already have.\n- **Cursor's native agent** — appears if you're running Standboy inside Cursor. Toggling **On** writes `beforeSubmitPrompt` (start), `afterAgentResponse` and `sessionEnd` (stop, with a safety-net) entries to `~\u002F.cursor\u002Fhooks\u002Fhooks.json`, preserving existing hooks alongside ours.\n\nBoth hook configs invoke a tiny Node script Standboy installs at `~\u002F.standboy\u002Fmarker.cjs`. The script touches `~\u002F.standboy\u002Fagent-active` while the agent runs and deletes it when the agent stops; Standboy watches that file and flips panel state to match. No polling, no heuristics — strictly the editor's own lifecycle.\n\nToggling is **idempotent** — flipping **On** again only adds anything that's missing; flipping **Off** strips only Standboy's entries from the config file, leaving everything else intact. If neither agent is detected on this system, the Detection section shows a short note and auto-show stays off; Standboy still runs fine as a manual emulator.\n\n> **Before uninstalling Standboy, toggle Detection Off here.** That's the cleanup step. VSCode doesn't expose a reliable uninstall lifecycle ([microsoft\u002Fvscode#155561](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fissues\u002F155561), [#102260](https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode\u002Fissues\u002F102260)), so we don't try to clean up automatically — every comparable extension takes the same approach. If you forgot, see the [Troubleshooting](#troubleshooting) entry for manual cleanup.\n\nFor agents we don't have specific hook support for (Aider, Cline, GitHub Copilot Edits, etc.), an edit-burst heuristic still runs as a fallback — less precise, but the panel still pops up during obvious agent bursts.\n\n### Show \u002F hide timing\n\nBoth edges of the auto-show transition are debounced so trivial \"let me check\" agent turns don't strobe the panel:\n\n- **5-second show delay.** The agent has to be working for at least 5 seconds before the panel actually focuses. Quick chat-only responses never open it.\n- **5-second hide delay.** When the agent stops, Standboy waits 5 seconds before sending focus back. A back-to-back follow-up turn keeps the panel up uninterrupted; only a real lull triggers the auto-collapse.\n- **Visible countdown.** When the hide timer is running, a thin progress bar in the palette's accent green shrinks across the top of the panel over those 5 seconds — so you can see the auto-collapse coming and aren't surprised by the focus shift.\n\nIf you'd rather Standboy never auto-show and stay strictly manual, open the panel's `⋯` menu and flip **Auto-show** off (equivalent to setting `standboy.autoShow` to `false`). The activity dot still pulses while an agent is working, so you can glance at the activity bar to see the agent's state — but focus never moves on its own.\n\n## Data and storage\n\nStandboy keeps your ROMs and saves in a managed library on disk. Everything is plain files — back up, sync, or move the folder however you like.\n\n### Where things live\n\nBy default, the library sits under VSCode's `globalStorage` directory:\n\n| OS      | Default library path                                                     |\n| ------- | ------------------------------------------------------------------------ |\n| macOS   | `~\u002FLibrary\u002FApplication Support\u002FCode\u002FUser\u002FglobalStorage\u002Fmfbzme.standboy\u002F` |\n| Linux   | `~\u002F.config\u002FCode\u002FUser\u002FglobalStorage\u002Fmfbzme.standboy\u002F`                     |\n| Windows | `%APPDATA%\\Code\\User\\globalStorage\\mfbzme.standboy\\`                     |\n\nInside that folder:\n\n```\nlibrary.json     ← index: hash → { name, canonicalName, ext, size, addedAt, lastPlayedAt }\nconfig.json      ← user settings (key bindings; future global prefs)\nroms\u002F\n  \u003Chash>.gba     ← copy of every ROM you've loaded\n  \u003Chash>.gbc\n  \u003Chash>.gb\nsaves\u002F\n  \u003Chash>.sav     ← in-game battery save (Pokémon-style save slot)\ncovers\u002F\n  \u003Chash>.png     ← cached box art (fetched once from libretro-thumbnails)\n  \u003Chash>.miss    ← zero-byte marker: this ROM has no cover, don't refetch\n```\n\n`\u003Chash>` is the first 16 hex chars of SHA-256 of the ROM bytes. Renaming or moving the original ROM doesn't lose anything — Standboy has its own copy and indexes by content, not filename. `canonicalName`, when present, is the No-Intro title resolved by SHA-1 lookup against the bundled database — that's what feeds the library grid's display name and cover lookup.\n\n### What persists, what doesn't\n\n| State                              | Across panel hide | Across VSCode restart | Across machine  |\n| ---------------------------------- | ----------------- | --------------------- | --------------- |\n| ROM library + in-game saves        | ✓                 | ✓                     | ✓ (copy folder) |\n| Currently-loaded ROM (auto-resume) | ✓                 | ✓                     | ✓               |\n| Mid-frame emulator state           | ✓                 | ✗                     | ✗               |\n\nIn-game saves are mirrored to disk on real lifecycle events — when the panel becomes hidden, when VSCode reloads or quits, and right before Export Save \u002F Import Save (which force-flush so the file always reflects the latest state). Between those events the live SRAM lives in the browser's IndexedDB (auto-persisted by EmulatorJS), so you never lose progress even if no disk write has fired yet. Mid-frame emulator state (program counter, register file, in-flight audio buffers) lives only in the webview and is lost on restart — but in-game saves cover the cases that matter.\n\n### Backing up\n\nCopy the library folder. That's all of it: ROMs, saves, the index. Restore by copying it back.\n\n```bash\n# macOS example: back up the whole library to iCloud Drive\ncp -r ~\u002FLibrary\u002FApplication\\ Support\u002FCode\u002FUser\u002FglobalStorage\u002Fmfbzme.standboy\u002F \\\n      ~\u002FLibrary\u002FMobile\\ Documents\u002Fcom~apple~CloudDocs\u002FStandboy\u002F\n```\n\nOr change `standboy.libraryDirectory` (see [Configuration](#configuration) below) to point at a synced folder directly.\n\n### Managing the library\n\nEvery action lives in the panel's menu drawer (`⋯` at the top-right):\n\n| Menu item               | What it does                                                                                                 |\n| ----------------------- | ------------------------------------------------------------------------------------------------------------ |\n| **Load ROM…**           | Pick a ROM from disk; copy into the library; start playing                                                   |\n| **Export save**         | Save the current ROM's `.sav` to a location of your choosing                                                 |\n| **Import save**         | Load a `.sav` file into the current ROM (the game reloads with it)                                           |\n| **Open library folder** | Reveal the library folder in Finder\u002FExplorer\u002FFiles                                                           |\n| **Delete ROM…**         | Quick-pick → confirm → remove ROM file, save file, cover, and index entry                                    |\n| **Show logs**           | Reveal the Standboy output channel (where the extension's logs go) — first stop when something behaves oddly |\n\nSwitching ROMs is one click in the library grid. Connecting\u002Fdisconnecting AI agents lives in the **Detection** section of the same menu (see [Auto-show](#auto-show-during-ai-activity)).\n\n## Configuration\n\n| Setting                     | Type       | Default    | Description                                                                                                                       |\n| --------------------------- | ---------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------- |\n| `standboy.palette`          | enum       | `kirokaze` | Chrome palette: `kirokaze`, `dmg`, `pocket`, `bgb`, `mist`.                                                                       |\n| `standboy.customPalette`    | `string[]` | `[]`       | Optional 4 hex codes (dark → light). Overrides `standboy.palette` when valid.                                                     |\n| `standboy.libraryDirectory` | `string`   | `\"\"`       | Override the library location (empty = VSCode's `globalStorage`). Useful for iCloud\u002FDropbox sync.                                 |\n| `standboy.autoShow`         | `boolean`  | `true`     | Auto-expand the panel during AI activity (5s show delay, 5s hide delay). Disable to keep it manual-only — click the icon to play. |\n\nPalettes apply live — no reload required. Changing `libraryDirectory` takes effect immediately for new ROM loads and saves; existing ROMs in the old location aren't moved automatically. Toggling `autoShow` takes effect on the next agent transition.\n\n## Troubleshooting\n\nOpen the menu (`⋯`) and click **Show logs** first when anything misbehaves — the output channel logs every state transition. The lines starting with `agent: sentinel present\u002Fabsent` tell you whether the hooks are firing. Common issues:\n\n| Symptom                                                        | Cause and fix                                                                                                                                                                                                                                                                                                                           |\n| -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Panel doesn't auto-show during agent activity                  | The hooks aren't installed. Open the menu (`⋯`) → **Detection** and toggle your agent **On**. Verify with `cat ~\u002F.claude\u002Fsettings.json` (or `~\u002F.cursor\u002Fhooks\u002Fhooks.json`) — you should see entries pointing at `~\u002F.standboy\u002Fmarker.cjs`.                                                                                                |\n| Panel auto-shows for _every_ tiny agent turn                   | Show delay is meant to filter these. If you're still seeing them, the agent is taking longer than 5s — that's \"real work\" by our heuristic. Set `standboy.autoShow: false` to disable auto-show entirely while keeping the activity dot indicator.                                                                                      |\n| Panel never hides                                              | Agent crashed without firing its `Stop` hook. `rm ~\u002F.standboy\u002Fagent-active` to manually clear, or reload the editor.                                                                                                                                                                                                                    |\n| Cover art is blank or wrong                                    | ROMs not in the No-Intro database (homebrew, hacks, betas) have no entry and fall back to a letter tile. To retry a transient libretro fetch, delete the `\u003Chash>.miss` markers under `\u003ClibraryRoot>\u002Fcovers\u002F` and reload.                                                                                                                |\n| `Z` triggers B instead of A (or vice versa)                    | Defaults are Z=A, X=B. If the bindings on disk look wrong, click the chip in the menu's Controls section and press the key you want.                                                                                                                                                                                                    |\n| Saves don't appear in iCloud Drive after a session             | The default library path is local-only. Set `standboy.libraryDirectory` to your sync folder (e.g. `~\u002FLibrary\u002FMobile Documents\u002Fcom~apple~CloudDocs\u002FStandboy\u002F`). Existing ROMs aren't moved automatically — copy them over once.                                                                                                          |\n| `Continue` works in-game but **Export Save** says no save data | Edge case: the disk mirror was empty when you exported. Click **Export Save** in the menu — it force-flushes SRAM before reading, so the bytes will be there.                                                                                                                                                                           |\n| Standboy icon is at the bottom of the activity bar             | VSCode places new extensions there by default. Right-click and drag to reorder, or move it to the secondary side bar (right edge) if you'd rather it not compete with Files \u002F Search.                                                                                                                                                   |\n| Audio doesn't play even after clicking Sound: On               | Browser autoplay policy needs a user gesture inside the iframe. Click directly on the game screen once — audio resumes from there. Subsequent toggles are instant.                                                                                                                                                                      |\n| Panel goes blank or \"Standboy\" loading dot persists            | First mount of a webview can race with VSCode's iframe init. Reload the window once (`Cmd+Shift+P → Developer: Reload Window`). If it persists, the menu's **Show logs** entry will say what failed.                                                                                                                                    |\n| Uninstalled Standboy but the agent feels slower                | Hook entries we added still fire, spawning a Node process per agent prompt \u002F tool call. Open `~\u002F.claude\u002Fsettings.json` and `~\u002F.cursor\u002Fhooks\u002Fhooks.json` and remove every block whose `command` contains `marker.cjs`. Optionally `rm -rf ~\u002F.standboy\u002F`. Avoid this in future by toggling Detection Off in the menu before uninstalling. |\n\nIf something's not in this table, the menu's **Show logs** entry plus a [GitHub issue](https:\u002F\u002Fgithub.com\u002Fmfbz\u002Fstandboy\u002Fissues) is the right path. Include the log output and your editor (VSCode \u002F Cursor) + version.\n\n## License\n\n[MIT](LICENSE).\n\n## Disclaimer\n\nStandboy is not affiliated with or endorsed by Nintendo. Game Boy is a trademark of Nintendo Co., Ltd. This project does not distribute, link to, or recommend any source for copyrighted ROMs.\n","Standboy 是一个在你的AI编码代理工作时自动展开的Game Boy模拟器。其核心功能包括根据代理活动自动显示和隐藏，支持Game Boy、Game Boy Color及Game Boy Advance游戏，并且能够在代理暂停工作时保存进度。技术上，它使用TypeScript编写，通过监听Cursor或Claude Code等编码助手的状态变化来触发行为。此外，项目还提供了持久化的ROM库管理、自动识别封面与标题等功能，确保用户可以在不离开IDE的情况下享受短暂的游戏娱乐。适用于需要长时间等待代码生成结果的开发者，帮助他们保持专注的同时提供轻松的休息方式。",2,"2026-06-11 04:05:19","CREATED_QUERY"]