DeepSeek Harness plugin

Awesome-DSH-Pet

Extensible desktop-pet plugin for the DSH Web GUI, with feed / play / character-switch menus and Codex 8x9 spritesheet characters.

Jump to install

Source facts

Repository
Awesome-AI-Pedia/Awesome-DSH-Pet
Latest update
Aug 19, 2026
Category
Just for Fun
GitHub stars
1

Install

Start with a prompt that asks an agent to read the source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to read the page and repository first.

Do not install anything yet. Read this DeepSeek Harness plugin and explain what it does, which files, networks, or credentials it can access, and how to install and remove it.

Plugin page: https://deepseekplugins.org/plugins/Awesome-AI-Pedia/Awesome-DSH-Pet
GitHub: https://github.com/Awesome-AI-Pedia/Awesome-DSH-Pet
Plugin: Awesome-DSH-Pet
Author: Awesome-AI-Pedia
Install command: dsh plugin --profile web add github:Awesome-AI-Pedia/Awesome-DSH-Pet

Do not run the install command until I confirm.

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

Awesome DSH Pet

DSH Web GUI 内的可扩展桌面宠物插件。

  • jingyu-zongcai:鲸鱼总裁
  • lulu-capybara:噜噜

安装

dsh plugin --profile web add /Users/icourt/Desktop/DSH-plugin/Awesome-DSH-Pet

安装或更新后重启 web。插件会在页面右下角显示桌面宠物,菜单里可以投喂、玩耍、切换角色。

配置

settings.yaml 中使用 awesome-dsh-pet: section:

awesome-dsh-pet:
  enabled: true
  size: 110
  opacity: 1
  walk:
    enabled: true
  sleepAfterMs: 60000

快速添加你自己的宠物

三步走:放素材 → 改 manifest → 跑门禁

1. 起个角色 id 并放素材

角色 id 只允许 [a-z0-9-](会当 URL 路径用)。示例用 my-cat

把 Codex 标准 8×9 spritesheet 放到:

lib/assets/characters/my-cat/spritesheet.webp

Codex atlas 规范:8 列 × 9 行,每格 192×208(像素)。行含义:

row用途
0idle
1running-right / walk / drag
2running-left
3waving / welcome / celebrate
4jumping / play
5failed / error / disappointed
6waiting
7running / working
8review / think

> 如果你手里只有一堆单行动作 sheet(不是 atlas),也支持——见下方"素材两种形式"。

2. 在 lib/assets/manifest.json 增加角色

characters 下加一个 key:

{
  "characters": {
    "my-cat": {
      "name": "我的猫",
      "credit": "你的名字",
      "description": "一句话人设。",
      "meta": {
        "stageSize": 110,
        "atlas": { "columns": 8, "rows": 9, "cellWidth": 192, "cellHeight": 208 }
      },
      "states": {
        "idle":         { "sheet": "spritesheet.webp", "row": 0, "rows": 9, "frames": 8, "fps": 4, "playback": "blink" },
        "working":      { "sheet": "spritesheet.webp", "row": 7, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "celebrate":    { "sheet": "spritesheet.webp", "row": 3, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "error":        { "sheet": "spritesheet.webp", "row": 5, "rows": 9, "frames": 8, "fps": 8, "motion": "shake", "playback": "once" },
        "disappointed": { "sheet": "spritesheet.webp", "row": 5, "rows": 9, "frames": 8, "fps": 4, "playback": "loop" },
        "joy":          { "sheet": "spritesheet.webp", "row": 3, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "eat":          { "sheet": "spritesheet.webp", "row": 3, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "play":         { "sheet": "spritesheet.webp", "row": 4, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "drag":         { "sheet": "spritesheet.webp", "row": 1, "rows": 9, "frames": 8, "fps": 8, "playback": "loop" },
        "walk":         { "sheet": "spritesheet.webp", "row": 1, "rows": 9, "frames": 8, "fps": 8, "playback": "pingpong" },
        "sleep":        { "sheet": "spritesheet.webp", "row": 0, "rows": 9, "frames": 8, "fps": 2, "playback": "loop" },
        "wake":         { "sheet": "spritesheet.webp", "row": 3, "rows": 9, "frames": 8, "fps": 6, "playback": "once" },
        "welcome":      { "sheet": "spritesheet.webp", "row": 3, "rows": 9, "frames": 8, "fps": 6, "playback": "loop" },
        "think":        { "sheet": "spritesheet.webp", "row": 8, "rows": 9, "frames": 8, "fps": 4, "playback": "loop" },
        "wait":         { "sheet": "spritesheet.webp", "row": 6, "rows": 9, "frames": 8, "fps": 4, "playback": "loop" }
      }
    }
  }
}

必备 15 状态一个都不能少idle / working / celebrate / error / disappointed / joy / eat / play / drag / walk / sleep / wake / welcome / think / wait

上面的 atlas 行映射是通用模板,直接复制改角色 id 即可跑起来。想让某个状态换动作(例如 eat 走单独的表情),改对应条目的 rowsheet 即可。

想把新角色作为默认,把顶层的 "default": "jingyu-zongcai" 改成 "my-cat"

3. 校验并重装

node scripts/gates/verify-assets.mjs   # 门禁:素材完整性 + manifest 一致性
node --test 'tests/*.test.mjs'         # 单测
dsh plugin --profile web add /Users/icourt/Desktop/DSH-plugin/Awesome-DSH-Pet   # 更新后重启 web

门禁会告诉你缺哪个状态、sheet 文件不存在、frames/fps 不合法等——按报错逐条修就行。

素材两种形式

  • Codex atlas 行(推荐):{ "sheet": "spritesheet.webp", "row": 0, "rows": 9, "frames": 8, "fps": 4, "playback": "loop" }
  • 单行动作 sheet{ "sheet": "idle.png", "frames": 3, "fps": 4, "playback": "loop" }

字段速查

字段说明
sheet相对 lib/assets/characters/<id>/ 的文件名。允许 .png / .webp / .svg / .jpg / .jpeg / .gif / .json
frames帧数(正整数)。PNG 多帧图必须满足 宽度 = frames × 高度(横排帧图)
fps播放帧率
row / rowsatlas 行索引与总行数;row < rows
playbackloop / pingpong / once / blink。最小帧数:pingpong≥2blink≥2,其他 ≥1
motion可选运动配方:bob / wiggle / squash / shake / sigh / hop / tilt / float / wave要求 frames === 1error 是唯一例外,可以多帧 + 运动叠加)

开发

node scripts/build-client.mjs
node scripts/gates/verify-assets.mjs
node --test 'tests/*.test.mjs'

lib/client.js 是构建产物,改 lib/client/index.mjs 后运行 node scripts/build-client.mjs 重新生成。