🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

动画宠物画廊 crafter-station/petdex

DeepSeek Harnessv1.4.0
crafter-station23 天前有提交已提供中文文档扫描:含敏感能力

Codex 动画伙伴的公开画廊。

70.4/100
综合分
4,225
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add crafter-station/petdex
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 23 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包petdex @ 1.4.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/28 11:41:28

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 74 处,展示前 73 条)
  • 读取密钥环境变量
    packages/discord-bot/src/bot.ts:12
    const token = process.env.DISCORD_TOKEN;
  • 发起网络请求
    packages/discord-bot/src/commands.ts:53
    const res = await fetch(url);
  • 发起网络请求
    packages/discord-bot/src/commands.ts:83
    const res = await fetch(`${PETDEX_API_BASE}/api/manifest`);
  • 读取密钥环境变量
    packages/discord-bot/src/register-commands.ts:12
    const token = process.env.DISCORD_TOKEN;
  • 读取密钥环境变量
    packages/discord-bot/src/webhook.ts:10
    const SECRET = process.env.PETDEX_WEBHOOK_SECRET;
  • 发起网络请求
    packages/petdex-cli/src/collections.ts:344
    const res = await fetch(url, {
  • 写入本地文件
    packages/petdex-cli/src/edit-assets.test.ts:68
    await writeFile(spritePath, Buffer.from([0xff, 0xd8, 0xff, 0xe0]));
  • 删除本地文件递归
    packages/petdex-cli/src/edit-assets.test.ts:73
    await rm(dir, { recursive: true, force: true });
  • 读取本地文件
    packages/petdex-cli/src/edit-assets.ts:350
    const file = await stat(filePath);
  • 读取本地文件
    packages/petdex-cli/src/edit-assets.ts:357
    const buffer = await readFile(filePath);
  • 写入本地文件
    packages/petdex-cli/src/telemetry.test.ts:28
    mkdirSync(join(tmpHome, ".petdex"), { recursive: true });
  • 写入本地文件
    packages/petdex-cli/src/telemetry.test.ts:29
    writeFileSync(petdexConfigPath(), "{ corrupt", "utf8");
  • 删除本地文件递归
    packages/petdex-cli/src/telemetry.test.ts:42
    rmSync(tmpHome, { recursive: true, force: true });
  • 读取本地文件
    packages/petdex-cli/src/telemetry.test.ts:53
    expect(existsSync(petdexConfigPath())).toBe(false);
  • 读取本地文件
    packages/petdex-cli/src/telemetry.test.ts:66
    expect(readFileSync(petdexConfigPath(), "utf8")).toBe("{ corrupt");
  • 读取本地文件
    packages/petdex-cli/src/telemetry.ts:79
    if (!existsSync(telemetryFile())) return { kind: "missing" };
  • 读取本地文件
    packages/petdex-cli/src/telemetry.ts:82
    raw = readFileSync(telemetryFile(), "utf8");
  • 写入本地文件
    packages/petdex-cli/src/telemetry.ts:101
    mkdirSync(path.dirname(telemetryFile()), { recursive: true });
  • 写入本地文件
    packages/petdex-cli/src/telemetry.ts:102
    writeFileSync(telemetryFile(), `${JSON.stringify(config, null, 2)}\n`);
  • 执行外部命令来自配置/变量
    packages/petdex-cli/src/telemetry.ts:233
    const child = spawn(process.execPath, ["-e", worker], {
  • 读取本地文件
    src/i18n/client-messages.test.ts:46
    const source = readFileSync(file, "utf8");
  • 读取本地文件
    src/i18n/client-messages.test.ts:56
    for (const entry of readdirSync(dir)) {
  • 读取本地文件
    src/i18n/client-messages.test.ts:58
    const stat = statSync(path);
  • 读取密钥环境变量
    src/lib/aliyun-oss.ts:7
    const accessKeyId = process.env.ALIYUN_OSS_ACCESS_KEY_ID;
  • 读取密钥环境变量
    src/lib/aliyun-oss.ts:8
    const accessKeySecret = process.env.ALIYUN_OSS_ACCESS_KEY_SECRET;
  • 发起网络请求
    src/lib/cli-auth.ts:27
    const res = await fetch(url, {
  • 发起网络请求
    src/lib/color-extract.ts:34
    const res = await fetch(spriteUrl);
  • 发起网络请求
    src/lib/download-pet-zip.ts:21
    const response = await fetch(zipUrl, {
  • 读取密钥环境变量
    src/lib/edit-policy.ts:77
    if (!process.env.OPENAI_API_KEY && !process.env.AI_API_KEY) return true;
  • 发起网络请求
    src/lib/pet-metrics-client.ts:37
    const promise = fetch(`/api/pets/${slug}/metrics`, {
  • 写入本地文件
    src/lib/pet-sound.ts:217
    await writeFile(rawPath, rawBytes);
  • 删除本地文件
    src/lib/pet-sound.ts:220
    await rm(rawPath, { force: true });
  • 读取本地文件
    src/lib/pet-sound.ts:222
    const normalizedStats = await stat(normalizedPath);
  • 删除本地文件
    src/lib/pet-sound.ts:224
    await rm(normalizedPath, { force: true });
  • 删除本地文件
    src/lib/pet-sound.ts:242
    await rm(bestCandidate.normalizedPath, { force: true });
  • 删除本地文件
    src/lib/pet-sound.ts:246
    await rm(normalizedPath, { force: true });
  • 删除本地文件
    src/lib/pet-sound.ts:262
    await rm(bestCandidate.normalizedPath, { force: true });
  • 读取本地文件
    src/lib/pet-sound.ts:267
    const body = await readFile(bestCandidate.normalizedPath);
  • 删除本地文件递归
    src/lib/pet-sound.ts:294
    await rm(tmpRoot, { recursive: true, force: true });
  • 请求外部主机api.elevenlabs.io
    src/lib/pet-sound.ts:336
    const res = await fetch("https://api.elevenlabs.io/v1/sound-generation", {
  • 发起网络请求
    src/lib/pet-sound.ts:336
    const res = await fetch("https://api.elevenlabs.io/v1/sound-generation", {
  • 读取密钥环境变量
    src/lib/query-embed.ts:16
    process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN
  • 发起网络请求
    src/lib/r2-fetch.ts:17
    return fetch(target, { ...init, headers });
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:144
    const previousSecret = process.env.PETDEX_ROUTE_COST_SECRET;
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:145
    const previousTelemetrySecret = process.env.TELEMETRY_RATELIMIT_SECRET;
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:146
    const previousUpstashToken = process.env.UPSTASH_REDIS_REST_TOKEN;
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:150
    process.env.PETDEX_ROUTE_COST_SECRET = "";
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:151
    process.env.TELEMETRY_RATELIMIT_SECRET = " telemetry-secret ";
  • 读取密钥环境变量
    src/lib/route-cost.test.ts:152
    process.env.UPSTASH_REDIS_REST_TOKEN = "upstash-token";
  • 读取密钥环境变量
    src/lib/route-cost.ts:143
    return firstNonEmpty(process.env.PETDEX_ROUTE_COST_SECRET);
  • 执行外部命令固定命令
    src/lib/security.test.ts:231
    const shAvailable = spawnSync("sh", ["-c", "exit 0"]).status === 0;
  • 执行外部命令固定命令
    src/lib/security.test.ts:250
    const r = spawnSync("sh", ["-n"], { input: script, encoding: "utf8" });
  • 写入本地文件
    src/lib/security.test.ts:276
    mkdirSync(binDir);
  • 写入本地文件
    src/lib/security.test.ts:278
    writeFileSync(
  • 写入本地文件
    src/lib/security.test.ts:295
    chmodSync(curlPath, 0o755);
  • 执行外部命令固定命令
    src/lib/security.test.ts:301
    const result = spawnSync("sh", [], {
  • 读取本地文件
    src/lib/security.test.ts:313
    expect(existsSync(marker)).toBe(false);
  • 读取本地文件
    src/lib/security.test.ts:314
    expect(existsSync(backtickMarker)).toBe(false);
  • 删除本地文件递归
    src/lib/security.test.ts:316
    rmSync(tempDir, { recursive: true, force: true });
  • 读取本地文件
    src/lib/seo-canonical.test.ts:75
    const source = readFileSync(join(REPO_ROOT, rel), "utf8");
  • 发起网络请求
    src/lib/similarity.ts:34
    const res = await fetch(spriteUrl);
  • 读取本地文件
    src/lib/sql-statements.test.ts:21
    const migration = readFileSync(
  • 读取密钥环境变量
    src/lib/submission-decisions.ts:355
    if (!row.ownerEmail || !process.env.RESEND_API_KEY) return;
  • 读取密钥环境变量
    src/lib/submission-decisions.ts:358
    const resend = new Resend(process.env.RESEND_API_KEY);
  • 发起网络请求
    src/lib/submission-review.ts:971
    const res = await fetch(url, {
  • 读取密钥环境变量
    src/lib/submissions.ts:124
    const resendKey = process.env.RESEND_API_KEY;
  • 读取密钥环境变量
    src/lib/takedown.ts:228
    if (pet.ownerEmail && process.env.RESEND_API_KEY) {
  • 读取密钥环境变量
    src/lib/takedown.ts:230
    const resend = new Resend(process.env.RESEND_API_KEY);
  • 读取密钥环境变量
    src/lib/wechat-qr-validator.ts:3
    const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
  • 读取本地文件
    src/proxy.test.ts:9
    const source = readFileSync(new URL("./proxy.ts", import.meta.url), "utf8")
  • 读取本地文件
    src/proxy.test.ts:48
    const body = readFileSync(route, "utf8");
  • 发起网络请求
    src/proxy.ts:267
    fetch(new URL("/api/internal/route-cost", req.url), {
  • 发起网络请求
    workers/petdex-assets.ts:71
    async fetch(request: Request, env: Env): Promise<Response> {
扫描于 2026/11/2(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.elevenlabs.io

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 动画宠物公开画廊

README

由 DeepSeek 最新模型翻译生成
Petdex Codex 动画伙伴的公开画廊。 一条命令就能浏览、安装和提交宠物。 petdex.dev · Built with Petdex · Discord · npm Petdex 是什么 Petdex 由三部分协同组成: 1. 网页画廊,位于 petdex.dev,社区在这里提交、评审并展示 Codex sprite 格式的动画宠物。 2. 命令行工具,一条命令就能把任意宠物装到你的机器上,并直接送进 Codex。 3. 桌面应用,让宠物漂浮在屏幕上,实时响应你编码智能体的活动。 每只宠物就是一个文件夹。每个文件夹就是一条宝可梦图鉴条目。每条条目距离 npx petdex install 只差一步。 快速开始 按这份清单操作,就能装好宠物、在 Codex 里看到它,并连上桌面应用。 1. 安装一只现成的宠物: npx petdex install boba 你应该会看到 ~/.petdex/pets/boba/,里面有 pet.json 和一张 spritesheet。 2. 从 petdex.dev/download 获取桌面应用。它支持 macOS、Linux 和 Windows。 3. 打开它,然后在宠物上按 Cmd+, 打开 Settings。 在 Pets 下选择你的宠物,在 Agents 下逐个点击连接你的编码智能体。
展开完整文档(README 剩余 1 节)
Petdex

Codex 动画伙伴的公开画廊。

一条命令就能浏览、安装和提交宠物。

petdex.dev
· Built with Petdex · Discord · npm

Petdex 是什么

Petdex 由三部分协同组成:

1. 网页画廊,位于 petdex.dev,社区在这里提交、评审并展示 Codex sprite 格式的动画宠物。
2. 命令行工具,一条命令就能把任意宠物装到你的机器上,并直接送进 Codex。
3. 桌面应用,让宠物漂浮在屏幕上,实时响应你编码智能体的活动。

每只宠物就是一个文件夹。每个文件夹就是一条宝可梦图鉴条目。每条条目距离 npx petdex install 只差一步。

快速开始

按这份清单操作,就能装好宠物、在 Codex 里看到它,并连上桌面应用。

1. 安装一只现成的宠物:

npx petdex install boba

你应该会看到 ~/.petdex/pets/boba/,里面有 pet.json 和一张 spritesheet。

2. 从 petdex.dev/download 获取桌面应用。它支持 macOS、Linux 和 Windows。

3. 打开它,然后在宠物上按 Cmd+, 打开 Settings。
在 Pets 下选择你的宠物,在 Agents 下逐个点击连接你的编码智能体。全程不用碰终端。

宠物会漂浮在工作区上方,你的智能体每调用一次工具,它就播放一次动画。

已登录的创作者还能把审核通过的宠物归入个人合集,入口在个人主页的 Collections 标签页,或者用命令行:

npx petdex collection create --title "My pets" --pets boba,mochi

面向用户

| 你想…… | 这样做 |
| 浏览宠物 | 访问 petdex.dev |
| 安装宠物 | npx petdex install <slug> |
| 切换当前吉祥物 | 打开桌面应用里的 Settings(Cmd+,) |
| 运行桌面悬浮宠物 | 从 petdex.dev/download 下载 |
| 制作宠物 | 在 Codex 里使用 hatch-pet 技能,或用 Petdex 创作工具 自己做一个 |
| 提交宠物 | npx petdex submit ./my-pet/,或通过网页提交器上传 |
| 管理合集 | npx petdex collection list,或使用个人资料页的 Collections 标签页 |
| 加入社区 | Discord |

完整命令行参考:packages/petdex-cli/README.md。

个人合集每个账号上限 10 个。24 只宠物的上限限制的是增长,而不是已存储的行,所以在上限出现之前创建的合集仍然可以改名或缩减,但不能扩充。命令行支持列出、创建、编辑、删除,以及输出 JSON 供自动化使用。

面向构建者

如果你想在 Petdex 之上做东西(桌面客户端、可穿戴设备、SDK、Discord 机器人,什么都行),有两个稳定的接口面:

- HTTP API。 petdex.dev/api/manifest 返回所有已审核通过的宠物,包含 slug、精灵图 URL、动画状态和元数据。
- 宠物包格式。 每只宠物都是一个 pet.json 加一个 spritesheet.{webp,png},按 8x9 网格渲染,每帧 192x208,或使用 v2 的 8x11 网格。

已有 21 个开源和源码可得的项目构建在这两个接口面之上。目录见 petdex.dev/built-with,然后通过 issue 模板提交你的项目。

架构

crafter-station/petdex
├── src/
│ ├── app/[locale]/ Public site: gallery, /pets/<slug>, /collections, /built-with, /community, /create, /download, /submit, /u/<handle>, ...
│ ├── app/api/cli/ CLI endpoints: OAuth config, submit (zip → presigned R2), collection management, dedup check, register
│ ├── app/api/manifest/ Public manifest: every approved pet with its spritesheet URL
│ ├── app/api/admin/ Admin review surface for submissions, edits, collection requests
│ └── lib/db/schema.ts Drizzle schema (Postgres)
├── packages/
│ ├── petdex-cli/ npm petdex catalog client (auth, list, install, submit, edit, collection management)
│ ├── petdex-desktop-native/ Native SDK floating mascot for macOS, Linux and Windows
│ ├── petdex-desktop-windows/ Legacy Tauri Windows implementation (not the release path)
│ └── discord-bot/ Discord.js bot for the Petdex server
├── public/built-with/ Screenshots for the community page
├── public/brand/ Logos, OS icons, Discord icon
└── drizzle/ SQL migrations (Postgres schema history)

Web 技术栈:Next.js 16、React 19、Tailwind、Drizzle、Postgres、Redis、Clerk、R2。
命令行:Bun + TypeScript,以单个 npm 二进制文件发布。通过 Clerk OAuth + PKCE 认证。
桌面端:原生 SDK 应用,内置进程内 Zig 钩子服务器,监听 127.0.0.1:7777。当前发布路径不含 WebView,也不含 Node sidecar。

本地开发

支持两条路径。

| 目标 | 命令 | 准备 |
| 本地全栈 | bun run dev:docker | 需要 Docker 或 Podman,预热约 30s。 |
| 对接真实服务 | bun run dev | 填好 .env.local(仅维护者)。 |

git clone https://github.com/crafter-station/petdex.git
cd petdex
bun install
bun run dev:docker

打开 localhost:3000。完整指南见 CONTRIBUTING.md。

宠物包格式

每只宠物由两个文件组成:

my-pet/
├── pet.json Metadata: name, slug, tags, vibes, kind, frame size, animation states
└── spritesheet.webp 8x9 or v2 8x11 frame grid of 192x208 px each (or .png)

原生渲染器支持九行状态:idle、running-right、running-left、waving、jumping、failed、waiting、running、review。Codex 和受支持的编码智能体会把各自的活动钩子映射到这些状态。v2 8x11 图集还留出两行,供接入的客户端自行使用。

参与贡献

- 提交宠物: petdex.dev/submit 或 npx petdex submit <path>。
- 收录你的项目: 提一个 Built with Petdex issue。
- 修 bug 或加功能: 先读 CONTRIBUTING.md,再提 PR。
- 来聊聊: Discord 有发布频道(#wip、#ship-or-sink)、反馈频道(#cli-feedback)和展示频道(#showcase)。

宠物 IP 与下架

宠物是用户提交的同人作品。Petdex 不对任何底层 IP 主张权利。如果你持有某个角色的权利,希望下架某只宠物,请提交下架请求,我们会在 48 小时内审核。

协议

源代码采用 MIT。宠物素材归提交者所有,遵循其自行声明的协议。

Made by Crafter Station.
Lead: @RaillyHugo.
预览分享卡片长什么样 ↓crafter-station/petdex
分享 · DeepSeek Harness Hub
crafter-station/petdex

Codex 动画伙伴的公开画廊。

回到顶部