sticker-cli

module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 6, 2026 License: MIT

README

sticker-cli

面向 AI Agent 的本地表情包 CLI,让聊天更有趣

CI Go 1.26.8 MIT License

sticker-cli 是一个面向 AI Agent 的本地表情包 CLI,让 Agent 能在聊天中按场景搜索、选择和展示表情包。它把程序、表情包素材和个人收藏分开管理,在本地完成选包、搜索、原图校验、预览和收藏整理,不要求微信账号、MCP 服务或常驻网络连接;人也可以直接运行同一套命令。

默认策略是安装 CLI 时不下载原图;首次执行 sticker setup 会安装 curated 精选表情包。只有显式传入 --pack all 才下载全量素材。安装器始终安装 sticker Skill,避免出现“命令已安装但 Agent 不会触发”的半成品状态。

Agent 可以用它做什么

  • 按需安装精选表情包或全量表情包;setup 默认精选,避免一次下载完整素材集。
  • 用宽泛的场景词搜索,返回多个候选;描述用于帮助选择,不把一个词绑定到唯一情绪。
  • 返回经过 MD5/SHA-256 校验的本地原图路径。静态 WebP 可以按需生成 PNG 预览,动图仍保留原图。
  • 从本地原图或标准 v1 表情包目录添加、导入、导出个人收藏,公共包更新不会覆盖收藏原图。
  • 像整理收藏夹一样创建分组、筛选四种排序方式,并原子地批量移动、重排或移出条目。

CLI 与表情包素材仓库是两个独立项目:

快速开始

1. 安装 CLI

推荐:一键安装 CLI 和 Agent Skill

Linux 和 macOS:

curl --proto '=https' --tlsv1.2 -fsSL \
  https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.sh | bash

Windows PowerShell:

irm https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.ps1 | iex

要在安装时同时初始化精选表情包:

$installer = irm https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.ps1
& ([scriptblock]::Create($installer)) -Pack curated

Windows 使用本地素材源时,把 -Source 传给同一个入口:

$installer = irm https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.ps1
& ([scriptblock]::Create($installer)) -Pack curated -Source C:\path\to\sticker-ext

一键入口会校验并安装当前稳定版 CLI,同时把 sticker Skill 安装到支持的 Agent 客户端;默认不会下载表情原图。已有 Skill 会保留。想在同一条命令中完成精选包初始化时,显式传入 --pack curated

curl --proto '=https' --tlsv1.2 -fsSL \
  https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.sh | bash -s -- --pack curated

--pack all 会下载完整素材;也可以配合 --source /path/to/sticker-ext 使用本地 素材源,例如:

curl --proto '=https' --tlsv1.2 -fsSL \
  https://raw.githubusercontent.com/9Ashwin/sticker-cli/main/scripts/install.sh | \
  bash -s -- --pack curated --source /path/to/sticker-ext

Skill 始终会安装或保留。

Agent 快速开始

安装完成后,Agent 首次使用时初始化精选表情包即可开始工作:

sticker setup --pack curated
sticker search "回应" --limit 8

之后可以直接说“发个表情包给我”或“找个调皮的表情”,Skill 会把请求路由到 search → get → 展示;全量表情包仍需显式执行 sticker setup --pack all

从源码安装

准备 Go 1.26.8 或更新版本:

git clone https://github.com/9Ashwin/sticker-cli.git
cd sticker-cli
make build
./bin/sticker version

Linux 和 macOS 可以把构建结果放入用户目录:

install -m 0755 bin/sticker "$HOME/.local/bin/sticker"
sticker version

也可以在 Go 环境中直接安装主线版本:

go install github.com/9Ashwin/sticker-cli/cmd/sticker@main

源码构建和 go install 只安装二进制。要给 Agent 加上 Skill,可以使用通用的 Skill 管理器:

npx --yes skills add https://github.com/9Ashwin/sticker-cli/tree/main \
  --skill sticker --global --yes --copy

也可以把仓库中的 Skill 复制到指定客户端目录:

./scripts/install-skill.sh /path/to/agent/skills/sticker

scripts/install.shscripts/install.ps1 支持 --skill-dir/-SkillDirSTICKER_SKILL_DIR 指定直接安装位置;安装器不会覆盖已有的 sticker Skill。

版本 tag 触发发布工作流后,会为 Linux amd64/arm64、macOS amd64/arm64 和 Windows amd64 生成带 SHA-256 校验的归档;归档只含程序、版本/校验文件和许可证,不包含原图。当前稳定版是 v0.1.0,一键脚本会自动选择最新稳定版。

2. 选择表情包素材

可以使用官方 HTTPS 源,也可以显式指定本地素材仓库。指定本地源便于离线使用和导入你刚整理的素材描述:

git clone https://github.com/9Ashwin/sticker-ext.git
sticker packs list --source /path/to/sticker-ext
sticker setup --source /path/to/sticker-ext

如果本机无法访问默认 HTTPS 源,可以把本地 checkout 固定为默认来源,之后不必重复传参:

export STICKER_PACK_SOURCE=/path/to/sticker-ext
sticker setup

--source 优先于 STICKER_PACK_SOURCE;安装成功后,更新命令还会使用已保存的来源。

setup 默认安装 curated 精选包(120 张,约 20.7 MiB)。需要完整素材时必须显式选择 all(2,638 张,约 1 GiB):

sticker setup --pack all --source /path/to/sticker-ext

正式安装命令和初始化命令使用同一套来源、修订、校验和原子提交逻辑:

sticker packs install curated --source /path/to/sticker-ext
sticker packs update curated
sticker packs remove curated --dry-run
sticker packs repair curated --dry-run

只想查看将要发生的变化时,加上 --dry-run;它不会写入本地素材库。

如果旧版本或手工操作留下了损坏的包状态,packs update 或重新安装可能返回 integrity/invalid_collection。先运行 sticker packs repair <id> 清理该包的损坏状态, 再用原来的素材源执行 sticker packs install <id> --source /path/to/sticker-ext。 修复只移除 .sticker/packs/<id>.json,不会删除原图或个人收藏;可先加 --dry-run 查看计划。

3. 搜索并取得表情包

默认输出 JSON,Agent 应从返回结果读取 ID 和绝对路径,不要自行拼接文件名:

sticker search "调皮" --limit 8
sticker search "工作" --pack curated --limit 8
sticker get <id>

全新数据目录第一次搜索会在成功包络中返回 data.setup_required: true。Agent 应按提示 执行 sticker setup(默认精选),再重试原始搜索;这不会把“没有匹配结果”和“还没有素材包”混在一起。

get 会先验证文件内容,再返回 data.item.path。静态 WebP 需要兼容预览时:

sticker get <id> --preview

这会在本地生成或复用 data.item.preview_path(PNG),不会改变 WebP 原图、MD5 或 SHA-256。GIF 和动画表情包应使用原图路径交给支持动图的客户端渲染。CLI 只返回本地路径,不代表已经把表情包发送到外部聊天。

4. 添加和导入表情包收藏

从本地原图添加,或复制一个已经安装的条目:

sticker favorites add /path/to/original.gif --caption '调皮回应'
sticker favorites add --id <id>
sticker favorites list --limit 20

素材库格式就是交换格式。导入目录只需要 manifest.json 和其中引用的 emoticons/ 原图,packs.json 可选;重复内容按 MD5 去重:

sticker favorites import /path/to/v1-pack
sticker favorites import /path/to/v1-pack --dry-run

导出结果仍然是 manifest.json + emoticons/,可以作为另一个素材源再次导入:

sticker favorites export /path/to/shared-pack

5. 分组、排序和整理

默认分组是 favorites。自定义分组只保存成员关系和顺序,不复制原图:

sticker favorites collections create work
sticker favorites collections rename work 工作
sticker favorites list --collection work --sort manual
sticker favorites list --collection work --sort added
sticker favorites list --collection work --sort caption
sticker favorites list --collection work --sort md5

批量操作可以移动、给出完整顺序,或从当前分组移出。建议先用 --dry-run 检查计划:

sticker favorites organize \
  --collection favorites \
  --ids <id1>,<id2> \
  --move-to work \
  --dry-run

sticker favorites organize \
  --collection work \
  --order <id2>,<id1>

所有 ID 和顺序会先完整校验,再一次性提交;失败不会留下半完成的整理结果。分组元数据写在 .sticker/collections.json,不会把扩展字段写入标准 v1 清单。

给 Agent 的使用方式

CLI 默认返回以下形式的 JSON 包络:

{
  "ok": true,
  "data": {},
  "meta": {"schema_version": 1}
}

需要机器读取命令合同时使用:

sticker schema
sticker schema packs install
sticker --help

跨客户端的使用指引在 skills/sticker/SKILL.md。可以复制到任意支持 SKILL.md 的 Agent 技能目录;安装器不会覆盖已有目录:

./scripts/install-skill.sh /path/to/agent/skills/sticker

安装 Skill 后,用户可以直接说“发个表情包给我”“来个调皮的表情”或“把这张加入收藏”;Agent 会按 search → get → 展示/收藏 路由调用 CLI,不需要用户记住子命令。

一个典型的 Agent 流程是:安装精选包 → 用场景词搜索多个候选 → 对选中的 ID 调用 get → 展示返回的本地路径 → 用 favorites add 或标准 v1 目录导入 → 创建分组并用 organize --dry-run 预览整理。

实际效果

安装 Skill 后,Agent 可以根据聊天内容直接选出并展示表情包:

Agent 在聊天中展示表情包

根据聊天上下文自然地发出表情包

Agent 安装 CLI 和精选表情包并展示结果

安装 CLI、初始化精选包并展示结果

本地数据和素材边界

默认数据目录是 --homeSTICKER_HOME 或系统用户配置目录下的 sticker,优先级从左到右。个人素材库的标准结构为:

<home>/
├── manifest.json             # 标准 v1 个人清单
├── emoticons/<md5>.<format>  # 原图,只保存一份
└── .sticker/
    ├── packs/<id>.json       # 已安装包状态
    ├── collections.json      # 分组、成员和顺序
    ├── previews/<sha256>.png # 静态 WebP 的派生预览
    └── catalogs/              # 来源目录缓存

标准 JSON 清单和原图是跨工具交换格式;SQLite 和 JSONL 都不是当前素材库格式。CLI 不把原图编译进二进制,也不把私人收藏提交到代码仓库。

项目状态

主线已完成以下本地闭环:

  • packs list/install/update/remove/repairsetup 的精选/全量选择、来源校验、缓存和 dry-run。
  • 离线 search、完整性校验后的 get、静态 WebP PNG 预览。
  • 收藏的添加、描述修改、取消、标准 v1 导入/导出。
  • 收藏分组的创建、重命名、删除、筛选、手动/时间/描述/MD5 排序和批量整理。
  • Agent Skill 与 Linux/macOS 离线端到端验收。

项目仍把“在外部聊天中发送表情包”交给调用方的客户端;CLI 的职责是返回可验证的本地路径。后续版本会按实际使用需求继续完善素材目录和发布归档。

源码开发

固定工具链为 Go 1.26.8、Cobra 1.10.2 和 golangci-lint 2.13.2。常用检查:

需求、设计和实现拆分记录在 PRD技术 SPECIssue 清单 中。

make quality          # 格式、测试、vet、lint、构建和跨平台构建
go test -race ./...   # 并发与文件提交回归
make e2e-agent        # 本地 fixture 的 Agent 离线流程

代码入口在 cmd/sticker,命令适配在 internal/cli,素材库、包管理、搜索、预览和收藏分别位于对应的 internal/ 包。提交前请保留与当前改动无关的本地文件,不要提交配置、密钥、解码后的私有素材或个人数据。

许可证

CLI 代码使用 MIT License。公共素材的版权和使用条件以 sticker-ext 中的声明为准。

Directories

Path Synopsis
cmd
sticker command
internal
cli
Package cli exposes the local image library command line.
Package cli exposes the local image library command line.
favorites
Package favorites manages the personal standard image library.
Package favorites manages the personal standard image library.
preview
Package preview creates bounded, local previews for image formats that a client may not display directly.
Package preview creates bounded, local previews for image formats that a client may not display directly.
search
Package search provides offline caption search over the personal library and installed pack manifests.
Package search provides offline caption search over the personal library and installed pack manifests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL