Skip to content

weekbin/octopus-pet

v1.0.0MIT

Coral-pink octopus desktop pet that lives in your Mac. Auto-spawned by spec-conformant agent clients as a stdio MCP server; reacts to agent task state with idle / working / error / ... animations. Reuses assets from the octopus-meme skill.

๐Ÿ™ Octopus Pet

A coral-pink octopus desktop pet for mcode (MiniMax Code / Mavis) โ€” built as an agent-plugins.org v1.0.0 plugin.

mcode ๅฏๅŠจๆ—ถ่‡ชๅŠจ spawn ็ซ ้ฑผ .app๏ผŒ14 ไธช"ๆ‰“ๅทฅไบบ"ๅœบๆ™ฏ 8s ่‡ชๅŠจ่ฝฎ่ฝฌ๏ผŒๅ•ๅ‡ปๅผนๆฐ”ๆณกใ€ๅณ้”ฎๆ‘ธๅคด (+ไบฒๅฏ†ๅบฆ)ใ€ๆ‹–ๅŠจๆขไฝ็ฝฎ๏ผŒ6 ไธช MCP tools ่ฎฉ mcode Agent ่ฟœ็จ‹ๆŽงๅˆถใ€‚่ทจ 8 ๅฎขๆˆท็ซฏ portable (mcode / Cursor / Claude Code / VS Code / Codex / Kiro / Antigravity / Gemini CLI)ใ€‚repo ๆœฌ่บซๅณๆ’ไปถ๏ผšbin/octopus-pet.bin ๆไบค่ฟ› git๏ผŒclone ้›ถๆž„ๅปบๅณๅฏๅŠ ่ฝฝใ€‚


็Šถๆ€ (2026-08-18, ๆžถๆž„้‡ๆž„ๅŽ)

้˜ถๆฎต็Šถๆ€ๅค‡ๆณจ
W1 D1โœ… ๅฎŒๆˆ14 spritesheet + 6 scripts + plugin ไธ‰ไปถๅฅ— + GitHub repo
W1 D2โœ… ๅฎŒๆˆTauri 2 scaffold + ้€ๆ˜Ž 192ร—192 ็ช—ๅฃ + React mount + MCP stdio stub
W1 D3โœ… ๅฎŒๆˆXState 14 ็Šถๆ€ FSM + 8s ่ฝฎ่ฝฌ + 14 spritesheet ๆธฒๆŸ“ + ๅ•ๅ‡ป/ๅณ้”ฎๆ‘ธๅคด/ๆ‹–ๅŠจ
W1 D4โœ… ๅฎŒๆˆๅ•ๅฎžไพ‹ๆ’ไปถ + ็Šถๆ€ๆƒๅจๆ”ถๆ•› (XState ๅ”ฏไธ€ๆƒๅจ, sync_state ้•œๅƒๅ›žๅ†™) + HTTP ๆ–ญ้“พไฟฎๅค
W2โœ… ๅฎŒๆˆRust MCP server ๅฎŒๆ•ดๅŒ– (6 tools, 8 roundtrip tests, headless ็›ดๅ†™)
W1.1+โณmcode ไปปๅŠกไบ‹ไปถ โ†’ ๅœบๆ™ฏ ๆ˜ ๅฐ„ (mcode ้’ฉๅญ) / ๅคš session ๅ…ฑไบซ (UDS ่ฝฌๅ‘)
W3โณmcode ้›†ๆˆ้ชŒ่ฏ (spawn โ†’ ้€šไฟก) + ่ทจๅฎขๆˆท็ซฏ portable ้ชŒ่ฏ
W4/W5โณไบคไบ’ๆ‰“็ฃจ + ๆ€ง่ƒฝ (ๅฏๅŠจ < 3s, ไฝ“็งฏ < 30MB) + GitHub release

ๆžถๆž„ (็Šถๆ€ๆƒๅจๆจกๅž‹, 2026-08-18 ้‡ๆž„)

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  mcode ๆกŒ้ข็ซฏ (v3.0.65+)                                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”     โ”‚
โ”‚  โ”‚ Plugin loader (spec ยง6.1 ๅ›บๅฎšไฝ็ฝฎๅ‘็Žฐ)                       โ”‚     โ”‚
โ”‚  โ”‚   plugin.json โ†’ mcp.json โ†’ command=./bin/octopus-pet       โ”‚     โ”‚
โ”‚  โ”‚   spawn ่ฟ›็จ‹, args=[--mcp-stdio]                            โ”‚     โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜     โ”‚
โ”‚                          โ”‚ stdio (JSON-RPC 2.0)                      โ”‚
โ”‚                          โ–ผ                                           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Octopus Pet (Tauri 2 + Rust) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚  Rust ่ฟ›็จ‹                                                       โ”‚ โ”‚
โ”‚  โ”‚  MCP stdio โ”€โ”€โ”                                                  โ”‚ โ”‚
โ”‚  โ”‚  HTTP :9527 โ”€โ”€โ”ผโ†’ actions.rs (ๅ”ฏไธ€้€ป่พ‘็‚น) โ”€โ†’ emit ไบ‹ไปถ            โ”‚ โ”‚
โ”‚  โ”‚  (dev-only)  โ”‚    apply_show / apply_ask / apply_pet            โ”‚ โ”‚
โ”‚  โ”‚               โ”‚                                                 โ”‚ โ”‚
โ”‚  โ”‚  SharedState โ”€โ”€โ† sync_state (invoke) โ†โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”‚ โ”‚
โ”‚  โ”‚  (ๅช่ฏป้•œๅƒ)                                              โ”‚        โ”‚ โ”‚
โ”‚  โ”‚                                                         โ”‚        โ”‚ โ”‚
โ”‚  โ”‚  WebView (React 19)                                     โ”‚        โ”‚ โ”‚
โ”‚  โ”‚  XState FSM (ๅ”ฏไธ€็Šถๆ€ๆƒๅจ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ”‚ โ”‚
โ”‚  โ”‚    14 ๅœบๆ™ฏ 8s ่ฝฎ่ฝฌ ยท ๆฐ”ๆณก ยท ไบฒๅฏ†ๅบฆ ยท ไฝ็ฝฎ                         โ”‚ โ”‚
โ”‚  โ”‚    ๅ•ๅ‡ป/ๅณ้”ฎๆ‘ธๅคด/ๆ‹–ๅŠจ + 14 spritesheet ๆธฒๆŸ“                       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ ˆ: Tauri 2 (Rust + React 19 + Vite 6 + XState 5)
็ช—ๅฃ: 192ร—192 (= ็ด ๆๅฐบๅฏธ, ้›ถ่พน่ท), transparent, no decorations, alwaysOnTop, skipTaskbar
็Šถๆ€ๆƒๅจ: XState (ๅ‰็ซฏ FSM) โ†’ sync_state ๅ›žๅ†™ Rust SharedState ้•œๅƒ;ๅ่ฎฎๅ…ฅๅฃ (MCP/HTTP) ๅช่ฐƒ actions.rs ๅ‘ไบ‹ไปถ
ๅœบๆ™ฏ: 14 (pretend-busy, stay-late, breakdown, lying-flat, multi-tasking, payday, salary-rejected, treat-milk-tea, friday-5pm, toilet-slacking, touch-fish, waiting-m3pro, soul-leaving, multitask)


14 ๅœบๆ™ฏ (verified 2026-08-18)

#ๅœบๆ™ฏOctopusSceneๆ–‡ๆกˆ็คบไพ‹ๅธงๆ•ฐ
1ๅ‡่ฃ…ๅพˆๅฟ™pretend-busy"ๅฟ™ๆญปไบ†" "ๆ”นๅฎŒ่ฟ™็‰ˆๅฐฑไผ‘ๆฏ"141
2ๅ†็†ฌไธ€ไผšstay-late"ๅ†็†ฌไธ€ไผš" "ๅคœๅฎตๆ—ถ้—ด"141
3ๆˆ‘่ฃ‚ๅผ€ไบ†breakdown"ๆˆ‘่ฃ‚ๅผ€ไบ†" "ๆฑ‚ๆ•‘ไฟกๅท"141
4ๆ‘†็ƒ‚่บบๅนณlying-flat"ๆ‘†็ƒ‚ไธญ" "ๅ……็”ตๆจกๅผ"141
5ๅคšไปปๅŠกmulti-tasking"ไธ€ๅฟƒๅคš็”จ" "5 ไธช tab"141
6ๅ‘ๅทฅ่ต„payday"ๅ‘ๅทฅ่ต„!" "ไปŠๅคฉๅƒๅฅฝ"141
7ๅทฅ่ต„่ขซๆ‹’salary-rejected"้€€ๆฌพไธญ" "็ณป็ปŸๆŠฝ้ฃŽ"141
8ๅฅถ่Œถtreat-milk-tea"ๅฅถ่Œถ็ฌฌไธ€" "ๅŠ ็็ "141
9ๅ‘จไบ” 5 ็‚นfriday-5pm"TGIF" "ๅ‘จๆœซๅฟซไน"141
10ๅธฆ่–ช่นฒๅ‘toilet-slacking"่นฒๅ‘ไธญ" "ๅธฆ่–ชไผ‘ๆฏ"141
11ๆ‘ธ้ฑผtouch-fish"ๅ‡่ฃ…ๅœจๅทฅไฝœ" "็”ฉ้”…ไธญ"141
12็ญ‰ M3 Prowaiting-m3pro"็ญ‰ๆ–ฐ็”ต่„‘" "ๆธฒๆŸ“ไธญ"141
13็ต้ญ‚ๅ‡บ็ชsoul-leaving"็ต้ญ‚ๅ‡บ็ช" "ๆ„่ฏ†ๆผ‚ๆตฎ"141
14ๅคšไปปๅŠก v2multitask"ไธ‰ๅฑๆจกๅผ" "CPU ๆปก่ฝฝ"141

ๆฏไธช spritesheet = 13632ร—384 px (71ร—2 cells ร— 192px, WebP lossy q80)ใ€‚14 ๆ–‡ไปถๆ€ป 9.1MBใ€‚


Spec ๅˆ่ง„ (per agent-plugins.org v1.0.0)

  • โœ… plugin.json ๅœจ plugin ๆ น (spec ยง5.1)
  • โœ… plugin.json ๅซ $schema ๅญ—ๆฎต (spec ยง5.3)
  • โœ… mcp.json ๅœจ plugin ๆ น (spec ยง7)
  • โœ… mcp.json ๅซ $schema ๅญ—ๆฎต (spec ยง7.2)
  • โœ… mcp.json.mcpServers[].type = "stdio" (spec ยง7.2.1, closed union)
  • โœ… ๆ‰€ๆœ‰ plugin-relative path ไปฅ ./ ๅผ€ๅคด (spec ยง4.1)
  • โœ… command ๆ˜ฏ single token, ไธๅธฆ shell metachars (spec ยง9.2)
  • โœ… args/env ๆœชไฝฟ็”จ spec ไปฅๅค–็š„ๅ ไฝ็ฌฆ (spec ยง9.2, closed set: ไป… ${PLUGIN_ROOT} + ${PLUGIN_DATA})
  • โœ… skills/octopus-pet/SKILL.md ๅซ agentskills.io frontmatter (name + description)
  • โœ… ๆ— ๅฎขๆˆท็ซฏๆ‰ฉๅฑ• (extensions / reverse-domain ็›ฎๅฝ•), ไฟๆŒ่ทจๅฎขๆˆท็ซฏ portable (spec ยง8 ๆ˜ฏ OPTIONAL)

16/16 lint checks pass (scripts/lint-octopus-plugin.sh)ใ€‚


ๅทฒ็Ÿฅ V1 ้™ๅˆถ (็•™ V2 ๅขž้‡)

  • ๅ•ๅฎžไพ‹ only (tauri-plugin-single-instance): ๅคš mcode session ๅœบๆ™ฏไธ‹, ้ฆ–ไธช session ๅฏๅŠจ็š„็ซ ้ฑผ .app ่ตขไบ†, ๅŽ็ปญ session ็š„ .app ็ซ‹ๅณ่ขซ kill, ๅŽ็ปญ session ็š„ MCP tool call ๅคฑ่ดฅ (ๆฒกๆœ‰ stdio ๆŽฅ). ็œŸๆญฃ็š„ๅคš session ๅ…ฑไบซ็•™ V1.1+ (่ตฐ Unix domain socket ่ฝฌๅ‘).
  • RGB ๆ—  alpha: 14/14 ๅœบๆ™ฏ PNG ๆ˜ฏ 720ร—720 RGB (่ƒŒๆ™ฏๆ˜ฏๅฎž่‰ฒ), ไธๆ˜ฏ้€ๆ˜Ž. Tauri ้€ๆ˜Ž็ช—ๅฃ้‡Œ็ซ ้ฑผๆ˜พ็คบๆˆ RGB ็Ÿฉๅฝข, ไธไผš่ทŸๆกŒ้ข่žๅˆ. V2 ็”จๅ›พๅƒๅˆ†ๅ‰ฒ / chroma key ๅŠ  alpha.
  • 141 ๅธง (3ร— ่ฎกๅˆ’ๅ€ผ): ็Šถๆ€ๆœบ 8s ่ฝฎ่ฝฌไผšๅŠๆˆชๅˆ‡ๆขๅœบๆ™ฏ (ๅ•ๅพช็Žฏ ~11.75s). V1 ๆŽฅๅ—, V2 ่ฐƒๅธง็އ.
  • mcode ไบ‹ไปถ โ†’ ็ซ ้ฑผ ๅˆ‡็Šถๆ€ ไธๅš: mcode ๆš‚ๆ—ถๆฒกๅฅฝ้’ฉๅญ, V1 ็ฎ€ๅ• timer ่ฝฎ่ฝฌ. V1.1+ ๆŽฅ mcode ้’ฉๅญ.
  • macOS only: V1 ไธๆ”ฏๆŒ Windows / Linux. V2 ๅขž้‡.
  • ้Ÿณ้ข‘ไธๅš: ๆ‘ธๅคด/ๅˆ‡็Šถๆ€ ้Ÿณๆ•ˆ V1 ไธๅš, V2 ๅขž้‡.
  • ้ผ ๆ ‡ๅณ้”ฎ่œๅ• ็ฎ€ๅŒ–: V1 ๅชๆœ‰"ๆ‘ธๅคด", ๆฒกๆœ‰"่ฎพ็ฝฎ/้€€ๅ‡บ/ๅ…ณไบŽ". V2 ๅขž้‡.
  • ๅผ€ๆœบ่‡ชๅฏ ไธๅš: V1 ไธๅš, V2 ๅขž้‡.
  • ๅคšๅฑๅน• / ้ผ ๆ ‡็ฉฟ้€ ไธๅš: V1 ไธๅš, V2 ๅขž้‡.

ไป“ๅบ“็ป“ๆž„ (ๅ››ๅˆ†็ฑป)

็ป„ไปถ้ข = spec ๅฅ‘็บฆ (ๆ’ไปถ่ขซๅ‘็Žฐ/ๅŠ ่ฝฝ) ยท ๅผ€ๅ‘้ข = ๆบ็  (่ฟ› git) ยท ไบง็‰ฉ้ข = ๆไบค็š„่ฟ่กŒ็‰ฉ (repo ๅณๆ’ไปถ) ยท ไธญ้—ดไบง็‰ฉ = ๅฏ้‡ๅปบ (gitignored)

ๅˆ†็ฑป็›ฎๅฝ•/ๆ–‡ไปถ่ฏดๆ˜Ž
็ป„ไปถ้ขplugin.json / mcp.json / skills/ / bin/octopus-petspec ๅ›บๅฎšไฝ็ฝฎ (ยง4.2 ยง6.1 ยง7.2)
ไบง็‰ฉ้ขbin/octopus-pet.binrelease ไบŒ่ฟ›ๅˆถ (~13MB, ๅ†…ๅตŒ spritesheet), ๆไบค่ฟ› git, clone ๅณๆ’ไปถๅฏๅŠ ่ฝฝ
ๅผ€ๅ‘้ขapp/Tauri webview ๅ‰็ซฏ (React 19 + XState 5)
ๅผ€ๅ‘้ขsrc-tauri/Rust ๅŽ็ซฏ (actions.rs = ็Šถๆ€้€ป่พ‘ๅ•็‚น; state_bridge = ้•œๅƒๅ›žๅ†™)
ๅผ€ๅ‘้ขscripts/ / docs/ๆž„ๅปบ/ๆ ก้ชŒ/ๅ‘ๅธƒ่„šๆœฌ + ๆ–‡ๆกฃ
ไธญ้—ดไบง็‰ฉapp/dist/ src-tauri/target/ src-tauri/gen/ dist/gitignored, ๅฏ้‡ๅปบ
octopus-pet/
โ”œโ”€โ”€ plugin.json                    # spec ยง5
โ”œโ”€โ”€ mcp.json                       # spec ยง7
โ”œโ”€โ”€ README.md                      # this file
โ”œโ”€โ”€ AGENTS.md                      # AI agent ๅไฝœ็บฆๅฎš
โ”œโ”€โ”€ LICENSE                        # MIT 2026 weekbin
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ skills/
โ”‚   โ””โ”€โ”€ octopus-pet/
โ”‚       โ””โ”€โ”€ SKILL.md               # agentskills.io
โ”œโ”€โ”€ bin/
โ”‚   โ”œโ”€โ”€ octopus-pet                # entrypoint ๆกฅ (spec ยง9.2): ๆœฌๅœฐๆž„ๅปบไผ˜ๅ…ˆ, .bin ๅ…œๅบ•
โ”‚   โ””โ”€โ”€ octopus-pet.bin            # release ไบŒ่ฟ›ๅˆถ (ๆไบค, clone ๅณ็”จ)
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ audit-octopus-assets.sh    # 14 ๅœบๆ™ฏ็›˜็‚น
โ”‚   โ”œโ”€โ”€ check-scenes-sync.sh       # 14 ๅœบๆ™ฏไธ‰ๆบไธ€่‡ด (types.ts/manifest/mcp_stdio.rs)
โ”‚   โ”œโ”€โ”€ extract-and-link-octopus-frames.sh  # ffmpeg ๆŠฝ 01-04 + symlink archive
โ”‚   โ”œโ”€โ”€ generate-spritesheet-manifest.sh    # ๅ”ฏไธ€ manifest โ†’ app/src/data/
โ”‚   โ”œโ”€โ”€ lint-octopus-plugin.sh     # spec ๅˆ่ง„ๆ ก้ชŒ (16/16)
โ”‚   โ”œโ”€โ”€ release-plugin.sh          # ๅ‘ๅธƒ: ไบŒ่ฟ›ๅˆถ + ๆ’ไปถ็›ฎๅฝ• + ๅ†’็ƒŸ
โ”‚   โ””โ”€โ”€ spritesheet-builder.sh     # 14 .webp ๆ‹ผๅ›พ
โ”œโ”€โ”€ docs/
โ”‚   โ””โ”€โ”€ octopus-assets-audit.md    # 14 ๅœบๆ™ฏ็›˜็‚นๆ–‡ๆกฃ
โ”œโ”€โ”€ app/                           # Tauri webview (React + Vite)
โ”‚   โ”œโ”€โ”€ package.json / vite.config.ts / index.html
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ”œโ”€โ”€ main.tsx / App.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ components/            # OctopusPet.tsx (192ร—192 ็ช—ๅฃ root, ็ด ๆ้“บๆปก) / Bubble.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ state/                 # types.ts (14 ๅœบๆ™ฏ) / octopus-fsm.ts (XState v5) / scenes.ts
โ”‚   โ”‚   โ”œโ”€โ”€ hooks/                 # useMcpBridge / useTauriWindowDrag / useStateSync (้•œๅƒๅ›žๅ†™)
โ”‚   โ”‚   โ”œโ”€โ”€ data/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ spritesheet-manifest.json   # ๅ”ฏไธ€ manifest (import ๆ‰“ๅŒ…)
โ”‚   โ”‚   โ””โ”€โ”€ styles/global.css
โ”‚   โ””โ”€โ”€ public/
โ”‚       โ””โ”€โ”€ assets/octopus/        # 14 spritesheet-*.webp (9.1MB total)
โ”œโ”€โ”€ src-tauri/                     # Tauri Rust backend
โ”‚   โ”œโ”€โ”€ Cargo.toml / Cargo.lock / build.rs / tauri.conf.json
โ”‚   โ”œโ”€โ”€ capabilities/default.json
โ”‚   โ”œโ”€โ”€ icons/                     # 32x32, 128x128, icon.png (RGBA)
โ”‚   โ”œโ”€โ”€ tests/mcp_roundtrip.rs     # 8 MCP stdio roundtrip tests
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ main.rs                # --mcp-stdio headless / GUI ๅŒๆจกๅผๅ…ฅๅฃ
โ”‚       โ”œโ”€โ”€ lib.rs                 # Builder + single-instance + HTTP fallback
โ”‚       โ”œโ”€โ”€ actions.rs             # ็Šถๆ€้€ป่พ‘ๅ•็‚น (apply_show/ask/pet + emit)
โ”‚       โ”œโ”€โ”€ mcp_stdio.rs           # MCP 2024-11-05 server (6 tools, ๅง”ๆ‰˜ actions)
โ”‚       โ”œโ”€โ”€ state_bridge.rs        # get_state / sync_state (้•œๅƒ)
โ”‚       โ””โ”€โ”€ http_fallback.rs       # HTTP :9527 (dev-only, ๅง”ๆ‰˜ actions)
โ””โ”€โ”€ dist/                          # ๅ‘ๅธƒ็ป„่ฃ…็›ฎๅฝ• (gitignored)
    โ””โ”€โ”€ octopus-pet-plugin/        # release-plugin.sh ไบงๅ‡บ, ๅฏ็‹ฌ็ซ‹ๅŠ ่ฝฝ

ๅผ€ๅ‘

ๅ‰็ฝฎไพ่ต–

  • Node.js 22+ + npm 10+
  • Rust 1.77+ (via rustup ๆˆ– brew install rust)
  • Tauri 2 CLI: cargo install tauri-cli --version "^2" (ๆˆ– npm install -g @tauri-apps/cli)

ๆœฌๅœฐๅผ€ๅ‘ (Tauri dev mode)

# ไธ€ๆฌกๆ€ง: ่ฃ…ไพ่ต–
cd app && npm install
cd ../src-tauri && cargo build
cd ..

# ๅฏๅŠจ (Vite dev server ่‡ชๅŠจ่ตท + Tauri ็ช—ๅฃ)
cd src-tauri && cargo tauri dev
# ๆˆ–ไปŽ app/ ็›ฎๅฝ•: npm run tauri:dev (่„šๆœฌๅ†…้ƒจ cd ๅˆฐ src-tauri)

ๆณจๆ„: tauri.conf.json ๅœจ src-tauri/, tauri CLI ๅฟ…้กปไปŽ src-tauri/ ่ท‘ (ๆˆ–็ป app/package.json ็š„ tauri:dev ่„šๆœฌ, ๅฎƒๅ†…้ƒจ cd ../src-tauri)ใ€‚

ๆž„ๅปบๅ‘ๅธƒ็‰ˆ

# macOS .app (็ป™ๆ™ฎ้€š็”จๆˆท)
cd src-tauri && cargo tauri build
# ไบง็‰ฉ: src-tauri/target/release/bundle/macos/Octopus Pet.app
#       src-tauri/target/release/octopus-pet (่ฃธไบŒ่ฟ›ๅˆถ)

# ๆ’ไปถๅ‘ๅธƒ็‰ฉ (็ป™ mcode ็ญ‰ agent ๅฎขๆˆท็ซฏ) โ€” ๆŽจ่
bash scripts/release-plugin.sh
# ไบง็‰ฉ:
#   bin/octopus-pet.bin       โ† release ไบŒ่ฟ›ๅˆถ (~13MB, ๆไบค่ฟ› git)
#   dist/octopus-pet-plugin/  โ† ๅฏ็‹ฌ็ซ‹ๅŠ ่ฝฝ็š„ๆ’ไปถ็›ฎๅฝ• (ๅฏ้€‰ๅˆ†ๅ‘)
# ๆณจๆ„: ๅ‘ๅธƒๅŽ git add bin/octopus-pet.bin ้š commit ๆไบค (repo ๅณๆ’ไปถ)

ไฝœไธบๆ’ไปถๅŠ ่ฝฝ (ไธค็งๆ–นๅผ)

ๆ–นๅผ A: ็›ดๆŽฅๅŠ ่ฝฝ repo(ๅผ€ๅ‘/ๅ‘ๅธƒ้€š็”จ)

  1. mcode ่ฎพ็ฝฎ โ†’ Plugins โ†’ "Add local plugin" โ†’ ้€‰ ~/Documents/cute/
  2. mcode ้‡ๅฏ โ†’ ็ซ ้ฑผ .app ่‡ชๅŠจ spawn
  3. ๅœจ mcode Agent ้‡Œ: mcp__octopus-pet__pet_list_states ๅบ”่ฟ”ๅ›ž 14 ๅœบๆ™ฏ
  4. ไบŒ่ฟ›ๅˆถ่งฃๆž: ๆœฌๅœฐ cargo build ไบง็‰ฉไผ˜ๅ…ˆ, ๆ— ๆœฌๅœฐๆž„ๅปบๆ—ถ็”จๆไบค็š„ bin/octopus-pet.bin(clone ้›ถๆž„ๅปบๅฏๅŠ ่ฝฝ)

ๆ–นๅผ B: ๅŠ ่ฝฝๅ‘ๅธƒๅŒ…(ๅนฒๅ‡€ๅˆ†ๅ‘)

  1. bash scripts/release-plugin.sh โ†’ ๆŒ‡ๅ‘ dist/octopus-pet-plugin/
  2. ่ฏฅ็›ฎๅฝ•ๆ˜ฏ spec ๅˆ่ง„ๆ’ไปถๆ น(plugin.json + mcp.json + skills/ + bin/ ไบŒ่ฟ›ๅˆถ), ๅฏๆ‹ท่ดๅˆ†ๅ‘

bin/octopus-pet.bin ๆ˜ฏ author ๆœบๅ™จ็ผ–่ฏ‘็š„ macOS arm64 ไบง็‰ฉใ€‚ๅ…ถไป–ๆžถๆž„ / ๆƒณ็”จๆœ€ๆ–ฐไปฃ็ : ๆœฌๅœฐ cargo build --release ๅŽ่ฆ†็›–, ๆˆ–็›ดๆŽฅไพ่ต–ๆœฌๅœฐๆž„ๅปบไผ˜ๅ…ˆ้€ป่พ‘ใ€‚


้‡ๆ–ฐ็”Ÿๆˆ็ด ๆ (W1 D1 ๅทฒๅฎŒๆˆ, ้€šๅธธไธ้œ€่ฆ้‡่ท‘)

# 1. ๆŠฝ 01-04 ๅธง + symlink archive ๅœบๆ™ฏ (ffmpeg)
OCTOPUS_SOURCE_ROOT=~/Works/octopus-worker-meme scripts/extract-and-link-octopus-frames.sh

# 2. ๆ‹ผ 14 ๅผ  spritesheet (ImageMagick)
scripts/spritesheet-builder.sh --all

# 3. ็”Ÿๆˆ React ็”จ็š„ manifest
scripts/generate-spritesheet-manifest.sh

ๅผ•็”จ (ไธš็•Œๅ…ฑ่ฏ†)


License

MIT ยฉ 2026 weekbin โ€” see LICENSE.