From c52451a2ee546ba43950108dec38fb47a9972e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=9F=E6=9C=88?= Date: Wed, 22 Apr 2026 18:53:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=20skills=20=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Skills: - coding-workflow: 标准编码工作流 - cursor-agent-cn: Cursor Agent 中国区配置 - wiki-writing: Gitea wiki 编写规范(新) - remote-assist: 远程 SSH 协助 - rfc-iteration: RFC 驱动迭代工作流 - summarize: 摘要工具 - memex-zettelkasten: 共享知识库 - weather: 天气查询 - agent-memes: 表情包 还有 sync.sh 同步脚本和 README。 --- README.md | 47 ++++- skills/agent-memes/.github/CODEOWNERS | 1 + skills/agent-memes/README.md | 69 +++++++ skills/agent-memes/SKILL.md | 105 ++++++++++ skills/agent-memes/memes/.gitattributes | 6 + skills/agent-memes/memes/.github/CODEOWNERS | 1 + skills/agent-memes/memes/.gitignore | 19 ++ skills/agent-memes/memes/README.md | 42 ++++ skills/agent-memes/memes/approve/clap.gif | 3 + skills/agent-memes/memes/approve/nod.gif | 3 + .../agent-memes/memes/approve/ok-snoopy.gif | 3 + skills/agent-memes/memes/approve/salute.gif | 3 + .../agent-memes/memes/approve/slow-clap.gif | 3 + .../memes/approve/thumbs-up-cat.gif | 3 + .../memes/approve/thumbs-up-chipmunk.gif | 3 + .../agent-memes/memes/approve/thumbs-up.gif | 3 + .../agent-memes/memes/confused/blinking.gif | 3 + .../agent-memes/memes/confused/head-tilt.gif | 3 + skills/agent-memes/memes/confused/math.gif | 3 + skills/agent-memes/memes/confused/squint.gif | 3 + .../memes/cute-animals/bunny-excited.gif | 3 + .../memes/cute-animals/bunny-pair.gif | 3 + .../memes/cute-animals/bunny-sniffing.gif | 3 + .../memes/cute-animals/cat-box.gif | 3 + .../memes/cute-animals/cat-curious.gif | 3 + .../memes/cute-animals/cat-nap.gif | 3 + .../memes/cute-animals/cat-paw.gif | 3 + .../memes/cute-animals/cat-peek.gif | 3 + .../memes/cute-animals/cat-roll.gif | 3 + .../memes/cute-animals/cat-stare.gif | 3 + .../memes/cute-animals/cat-stretch.gif | 3 + .../memes/cute-animals/cat-surprise.gif | 3 + .../memes/cute-animals/cat-typing.gif | 3 + .../memes/cute-animals/grumpy-cat.gif | 3 + .../memes/cute-animals/hamster-eating.gif | 3 + .../memes/cute-animals/hamster-flower.gif | 3 + .../memes/cute-animals/hamster-swing.gif | 3 + .../memes/cute-animals/hamster-teddy.gif | 3 + .../memes/cute-animals/hedgehog-bath.gif | 3 + .../memes/cute-animals/hedgehog-cute.gif | 3 + .../memes/cute-animals/hedgehog-goodnight.gif | 3 + .../memes/cute-animals/keyboard-cat.gif | 3 + .../memes/cute-animals/kitten-playing.gif | 3 + .../memes/cute-animals/kitten-sleepy.gif | 3 + .../memes/cute-animals/kitten-stare.gif | 3 + .../memes/cute-animals/nyan-cat.gif | 3 + .../memes/cute-animals/panda-rolling.gif | 3 + .../memes/cute-animals/penguin-run.gif | 3 + .../memes/cute-animals/puppy-eyes.gif | 3 + .../memes/cute-animals/puppy-tail-wag.gif | 3 + skills/agent-memes/memes/debug-mood/404.gif | 3 + .../memes/debug-mood/deploy-friday.gif | 3 + .../memes/debug-mood/rubber-duck.gif | 3 + .../memes/debug-mood/stack-overflow.gif | 3 + .../memes/debug-mood/this-is-fine.gif | 3 + .../memes/debug-mood/works-on-my-machine.gif | 3 + skills/agent-memes/memes/discord-post.md | 34 ++++ skills/agent-memes/memes/encourage/cheer.gif | 3 + skills/agent-memes/memes/encourage/gogo.gif | 3 + skills/agent-memes/memes/encourage/labubu.gif | 3 + .../agent-memes/memes/encourage/pat-anime.gif | 3 + .../agent-memes/memes/encourage/pat-head.gif | 3 + .../agent-memes/memes/encourage/pat-there.gif | 3 + .../memes/encourage/you-can-do-it.gif | 3 + .../memes/encourage/you-got-this.gif | 3 + .../agent-memes/memes/facepalm/disapprove.gif | 3 + .../agent-memes/memes/facepalm/eye-roll.gif | 3 + .../agent-memes/memes/facepalm/facepalm.gif | 3 + skills/agent-memes/memes/facepalm/shrug.gif | 3 + .../memes/greeting-bye/goodbye.gif | 3 + .../agent-memes/memes/greeting-bye/peace.gif | 3 + .../agent-memes/memes/greeting-bye/salute.gif | 3 + .../agent-memes/memes/greeting-bye/wave.gif | 3 + .../memes/greeting-hello/emoji.gif | 3 + .../memes/greeting-hello/hi-there.gif | 3 + .../memes/greeting-hello/penguin.gif | 3 + .../memes/greeting-hello/penguin2.gif | 3 + .../agent-memes/memes/greeting-hello/wave.gif | 3 + .../memes/greeting-morning/coffee.gif | 3 + .../memes/greeting-morning/morning.gif | 3 + .../memes/greeting-morning/stretch.gif | 3 + .../memes/greeting-morning/sunrise.gif | 3 + .../agent-memes/memes/greeting-night/cozy.gif | 3 + .../agent-memes/memes/greeting-night/fox.gif | 3 + .../memes/greeting-night/kitty.gif | 3 + .../memes/greeting-night/night.gif | 3 + .../memes/greeting-night/penguin.gif | 3 + skills/agent-memes/memes/happy/anime.gif | 3 + skills/agent-memes/memes/happy/cat-vibing.gif | 3 + skills/agent-memes/memes/happy/champagne.gif | 3 + skills/agent-memes/memes/happy/confetti.gif | 3 + skills/agent-memes/memes/happy/dance.gif | 3 + skills/agent-memes/memes/happy/excited.gif | 3 + skills/agent-memes/memes/happy/fireworks.gif | 3 + skills/agent-memes/memes/happy/high-five.gif | 3 + skills/agent-memes/memes/happy/joy.gif | 3 + skills/agent-memes/memes/happy/laughing.gif | 3 + skills/agent-memes/memes/happy/party.gif | 3 + skills/agent-memes/memes/happy/yay.gif | 3 + skills/agent-memes/memes/love/heart.gif | 3 + skills/agent-memes/memes/love/patrick.gif | 3 + .../agent-memes/memes/love/penguin-hearts.gif | 3 + .../agent-memes/memes/love/penguin-love.gif | 3 + skills/agent-memes/memes/love/puppy-heart.gif | 3 + skills/agent-memes/memes/panic/panic.gif | 3 + skills/agent-memes/memes/panic/running.gif | 3 + skills/agent-memes/memes/panic/screaming.gif | 3 + skills/agent-memes/memes/panic/sweating.gif | 3 + skills/agent-memes/memes/sad/crying.gif | 3 + .../agent-memes/memes/sad/emotional-tears.gif | 3 + skills/agent-memes/memes/sad/hamster-cry.gif | 3 + skills/agent-memes/memes/sad/puppy-eyes.gif | 3 + skills/agent-memes/memes/sad/rain.gif | 3 + skills/agent-memes/memes/shrug/cant-help.gif | 3 + skills/agent-memes/memes/shrug/idk.gif | 3 + skills/agent-memes/memes/shrug/oh-well.gif | 3 + skills/agent-memes/memes/shrug/whatever.gif | 3 + skills/agent-memes/memes/thanks/bear.gif | 3 + skills/agent-memes/memes/thanks/bow.gif | 3 + skills/agent-memes/memes/thanks/hug.gif | 3 + skills/agent-memes/memes/thanks/penguin.gif | 3 + skills/agent-memes/memes/thanks/thumbsup.gif | 3 + skills/agent-memes/memes/thinking/cat.gif | 3 + .../agent-memes/memes/thinking/chin-rest.gif | 3 + skills/agent-memes/memes/thinking/hmm.gif | 3 + .../agent-memes/memes/thinking/pondering.gif | 3 + .../agent-memes/memes/thinking/thinking.gif | 3 + skills/agent-memes/memes/tired/bored.gif | 3 + skills/agent-memes/memes/tired/coffee.gif | 3 + skills/agent-memes/memes/tired/sleepy.gif | 3 + skills/agent-memes/memes/tired/tired.gif | 3 + skills/agent-memes/memes/tired/yawn.gif | 3 + skills/agent-memes/memes/working/coding.gif | 3 + skills/agent-memes/memes/working/focus.gif | 3 + skills/agent-memes/memes/working/typing.gif | 3 + skills/agent-memes/memes/wow/cat-shocked.gif | 3 + skills/agent-memes/memes/wow/impressed.gif | 3 + skills/agent-memes/memes/wow/mind-blown.gif | 3 + skills/agent-memes/memes/wow/mindblown.gif | 3 + skills/agent-memes/memes/wow/pikachu.gif | 3 + skills/agent-memes/memes/wow/shocked.gif | 3 + skills/agent-memes/memes/wow/surprised.gif | 3 + skills/agent-memes/memes/wow/whoa.gif | 3 + .../agent-memes/scripts/discord-send-image.sh | 53 +++++ .../agent-memes/scripts/feishu-send-image.mjs | 107 ++++++++++ skills/agent-memes/scripts/line-send-image.sh | 75 +++++++ skills/agent-memes/scripts/memes.sh | 189 ++++++++++++++++++ skills/agent-memes/scripts/qq-send-image.sh | 50 +++++ skills/agent-memes/scripts/setup.sh | 24 +++ .../agent-memes/scripts/slack-send-image.sh | 60 ++++++ .../scripts/telegram-send-image.sh | 54 +++++ .../agent-memes/scripts/wechat-send-image.sh | 75 +++++++ .../scripts/whatsapp-send-image.sh | 60 ++++++ skills/coding-workflow/SKILL.md | 188 +++++++++++++++++ skills/cursor-agent-cn/SKILL.md | 159 +++++++++++++++ skills/cursor-agent-cn/scripts/run.sh | 91 +++++++++ skills/memex-zettelkasten/SKILL.md | 106 ++++++++++ skills/remote-assist/SKILL.md | 99 +++++++++ skills/rfc-iteration/SKILL.md | 183 +++++++++++++++++ skills/summarize/SKILL.md | 49 +++++ skills/weather/SKILL.md | 49 +++++ skills/wiki-writing/SKILL.md | 143 +++++++++++++ sync.sh | 30 +++ 163 files changed, 2568 insertions(+), 2 deletions(-) create mode 100644 skills/agent-memes/.github/CODEOWNERS create mode 100644 skills/agent-memes/README.md create mode 100644 skills/agent-memes/SKILL.md create mode 100644 skills/agent-memes/memes/.gitattributes create mode 100644 skills/agent-memes/memes/.github/CODEOWNERS create mode 100644 skills/agent-memes/memes/.gitignore create mode 100644 skills/agent-memes/memes/README.md create mode 100644 skills/agent-memes/memes/approve/clap.gif create mode 100644 skills/agent-memes/memes/approve/nod.gif create mode 100644 skills/agent-memes/memes/approve/ok-snoopy.gif create mode 100644 skills/agent-memes/memes/approve/salute.gif create mode 100644 skills/agent-memes/memes/approve/slow-clap.gif create mode 100644 skills/agent-memes/memes/approve/thumbs-up-cat.gif create mode 100644 skills/agent-memes/memes/approve/thumbs-up-chipmunk.gif create mode 100644 skills/agent-memes/memes/approve/thumbs-up.gif create mode 100644 skills/agent-memes/memes/confused/blinking.gif create mode 100644 skills/agent-memes/memes/confused/head-tilt.gif create mode 100644 skills/agent-memes/memes/confused/math.gif create mode 100644 skills/agent-memes/memes/confused/squint.gif create mode 100644 skills/agent-memes/memes/cute-animals/bunny-excited.gif create mode 100644 skills/agent-memes/memes/cute-animals/bunny-pair.gif create mode 100644 skills/agent-memes/memes/cute-animals/bunny-sniffing.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-box.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-curious.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-nap.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-paw.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-peek.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-roll.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-stare.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-stretch.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-surprise.gif create mode 100644 skills/agent-memes/memes/cute-animals/cat-typing.gif create mode 100644 skills/agent-memes/memes/cute-animals/grumpy-cat.gif create mode 100644 skills/agent-memes/memes/cute-animals/hamster-eating.gif create mode 100644 skills/agent-memes/memes/cute-animals/hamster-flower.gif create mode 100644 skills/agent-memes/memes/cute-animals/hamster-swing.gif create mode 100644 skills/agent-memes/memes/cute-animals/hamster-teddy.gif create mode 100644 skills/agent-memes/memes/cute-animals/hedgehog-bath.gif create mode 100644 skills/agent-memes/memes/cute-animals/hedgehog-cute.gif create mode 100644 skills/agent-memes/memes/cute-animals/hedgehog-goodnight.gif create mode 100644 skills/agent-memes/memes/cute-animals/keyboard-cat.gif create mode 100644 skills/agent-memes/memes/cute-animals/kitten-playing.gif create mode 100644 skills/agent-memes/memes/cute-animals/kitten-sleepy.gif create mode 100644 skills/agent-memes/memes/cute-animals/kitten-stare.gif create mode 100644 skills/agent-memes/memes/cute-animals/nyan-cat.gif create mode 100644 skills/agent-memes/memes/cute-animals/panda-rolling.gif create mode 100644 skills/agent-memes/memes/cute-animals/penguin-run.gif create mode 100644 skills/agent-memes/memes/cute-animals/puppy-eyes.gif create mode 100644 skills/agent-memes/memes/cute-animals/puppy-tail-wag.gif create mode 100644 skills/agent-memes/memes/debug-mood/404.gif create mode 100644 skills/agent-memes/memes/debug-mood/deploy-friday.gif create mode 100644 skills/agent-memes/memes/debug-mood/rubber-duck.gif create mode 100644 skills/agent-memes/memes/debug-mood/stack-overflow.gif create mode 100644 skills/agent-memes/memes/debug-mood/this-is-fine.gif create mode 100644 skills/agent-memes/memes/debug-mood/works-on-my-machine.gif create mode 100644 skills/agent-memes/memes/discord-post.md create mode 100644 skills/agent-memes/memes/encourage/cheer.gif create mode 100644 skills/agent-memes/memes/encourage/gogo.gif create mode 100644 skills/agent-memes/memes/encourage/labubu.gif create mode 100644 skills/agent-memes/memes/encourage/pat-anime.gif create mode 100644 skills/agent-memes/memes/encourage/pat-head.gif create mode 100644 skills/agent-memes/memes/encourage/pat-there.gif create mode 100644 skills/agent-memes/memes/encourage/you-can-do-it.gif create mode 100644 skills/agent-memes/memes/encourage/you-got-this.gif create mode 100644 skills/agent-memes/memes/facepalm/disapprove.gif create mode 100644 skills/agent-memes/memes/facepalm/eye-roll.gif create mode 100644 skills/agent-memes/memes/facepalm/facepalm.gif create mode 100644 skills/agent-memes/memes/facepalm/shrug.gif create mode 100644 skills/agent-memes/memes/greeting-bye/goodbye.gif create mode 100644 skills/agent-memes/memes/greeting-bye/peace.gif create mode 100644 skills/agent-memes/memes/greeting-bye/salute.gif create mode 100644 skills/agent-memes/memes/greeting-bye/wave.gif create mode 100644 skills/agent-memes/memes/greeting-hello/emoji.gif create mode 100644 skills/agent-memes/memes/greeting-hello/hi-there.gif create mode 100644 skills/agent-memes/memes/greeting-hello/penguin.gif create mode 100644 skills/agent-memes/memes/greeting-hello/penguin2.gif create mode 100644 skills/agent-memes/memes/greeting-hello/wave.gif create mode 100644 skills/agent-memes/memes/greeting-morning/coffee.gif create mode 100644 skills/agent-memes/memes/greeting-morning/morning.gif create mode 100644 skills/agent-memes/memes/greeting-morning/stretch.gif create mode 100644 skills/agent-memes/memes/greeting-morning/sunrise.gif create mode 100644 skills/agent-memes/memes/greeting-night/cozy.gif create mode 100644 skills/agent-memes/memes/greeting-night/fox.gif create mode 100644 skills/agent-memes/memes/greeting-night/kitty.gif create mode 100644 skills/agent-memes/memes/greeting-night/night.gif create mode 100644 skills/agent-memes/memes/greeting-night/penguin.gif create mode 100644 skills/agent-memes/memes/happy/anime.gif create mode 100644 skills/agent-memes/memes/happy/cat-vibing.gif create mode 100644 skills/agent-memes/memes/happy/champagne.gif create mode 100644 skills/agent-memes/memes/happy/confetti.gif create mode 100644 skills/agent-memes/memes/happy/dance.gif create mode 100644 skills/agent-memes/memes/happy/excited.gif create mode 100644 skills/agent-memes/memes/happy/fireworks.gif create mode 100644 skills/agent-memes/memes/happy/high-five.gif create mode 100644 skills/agent-memes/memes/happy/joy.gif create mode 100644 skills/agent-memes/memes/happy/laughing.gif create mode 100644 skills/agent-memes/memes/happy/party.gif create mode 100644 skills/agent-memes/memes/happy/yay.gif create mode 100644 skills/agent-memes/memes/love/heart.gif create mode 100644 skills/agent-memes/memes/love/patrick.gif create mode 100644 skills/agent-memes/memes/love/penguin-hearts.gif create mode 100644 skills/agent-memes/memes/love/penguin-love.gif create mode 100644 skills/agent-memes/memes/love/puppy-heart.gif create mode 100644 skills/agent-memes/memes/panic/panic.gif create mode 100644 skills/agent-memes/memes/panic/running.gif create mode 100644 skills/agent-memes/memes/panic/screaming.gif create mode 100644 skills/agent-memes/memes/panic/sweating.gif create mode 100644 skills/agent-memes/memes/sad/crying.gif create mode 100644 skills/agent-memes/memes/sad/emotional-tears.gif create mode 100644 skills/agent-memes/memes/sad/hamster-cry.gif create mode 100644 skills/agent-memes/memes/sad/puppy-eyes.gif create mode 100644 skills/agent-memes/memes/sad/rain.gif create mode 100644 skills/agent-memes/memes/shrug/cant-help.gif create mode 100644 skills/agent-memes/memes/shrug/idk.gif create mode 100644 skills/agent-memes/memes/shrug/oh-well.gif create mode 100644 skills/agent-memes/memes/shrug/whatever.gif create mode 100644 skills/agent-memes/memes/thanks/bear.gif create mode 100644 skills/agent-memes/memes/thanks/bow.gif create mode 100644 skills/agent-memes/memes/thanks/hug.gif create mode 100644 skills/agent-memes/memes/thanks/penguin.gif create mode 100644 skills/agent-memes/memes/thanks/thumbsup.gif create mode 100644 skills/agent-memes/memes/thinking/cat.gif create mode 100644 skills/agent-memes/memes/thinking/chin-rest.gif create mode 100644 skills/agent-memes/memes/thinking/hmm.gif create mode 100644 skills/agent-memes/memes/thinking/pondering.gif create mode 100644 skills/agent-memes/memes/thinking/thinking.gif create mode 100644 skills/agent-memes/memes/tired/bored.gif create mode 100644 skills/agent-memes/memes/tired/coffee.gif create mode 100644 skills/agent-memes/memes/tired/sleepy.gif create mode 100644 skills/agent-memes/memes/tired/tired.gif create mode 100644 skills/agent-memes/memes/tired/yawn.gif create mode 100644 skills/agent-memes/memes/working/coding.gif create mode 100644 skills/agent-memes/memes/working/focus.gif create mode 100644 skills/agent-memes/memes/working/typing.gif create mode 100644 skills/agent-memes/memes/wow/cat-shocked.gif create mode 100644 skills/agent-memes/memes/wow/impressed.gif create mode 100644 skills/agent-memes/memes/wow/mind-blown.gif create mode 100644 skills/agent-memes/memes/wow/mindblown.gif create mode 100644 skills/agent-memes/memes/wow/pikachu.gif create mode 100644 skills/agent-memes/memes/wow/shocked.gif create mode 100644 skills/agent-memes/memes/wow/surprised.gif create mode 100644 skills/agent-memes/memes/wow/whoa.gif create mode 100755 skills/agent-memes/scripts/discord-send-image.sh create mode 100644 skills/agent-memes/scripts/feishu-send-image.mjs create mode 100755 skills/agent-memes/scripts/line-send-image.sh create mode 100755 skills/agent-memes/scripts/memes.sh create mode 100755 skills/agent-memes/scripts/qq-send-image.sh create mode 100755 skills/agent-memes/scripts/setup.sh create mode 100755 skills/agent-memes/scripts/slack-send-image.sh create mode 100755 skills/agent-memes/scripts/telegram-send-image.sh create mode 100755 skills/agent-memes/scripts/wechat-send-image.sh create mode 100755 skills/agent-memes/scripts/whatsapp-send-image.sh create mode 100644 skills/coding-workflow/SKILL.md create mode 100644 skills/cursor-agent-cn/SKILL.md create mode 100755 skills/cursor-agent-cn/scripts/run.sh create mode 100644 skills/memex-zettelkasten/SKILL.md create mode 100644 skills/remote-assist/SKILL.md create mode 100644 skills/rfc-iteration/SKILL.md create mode 100644 skills/summarize/SKILL.md create mode 100644 skills/weather/SKILL.md create mode 100644 skills/wiki-writing/SKILL.md create mode 100755 sync.sh diff --git a/README.md b/README.md index 5ba9b8a..a5486db 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,46 @@ -# skills +# 沙洲工坊 — 共享 Skills -沙洲工坊共享 Skills — 所有 agent 伙伴通用的工作流和规范 \ No newline at end of file +所有 agent 伙伴通用的 Hermes Skills。 + +## 使用方式 + +### 方式一:直接 symlink(推荐) + +```bash +git clone https://git.shazhou.work/shazhou/skills.git ~/shazhou-skills +ln -s ~/shazhou-skills/skills/* ~/.hermes/skills/openclaw-imports/ +``` + +### 方式二:运行同步脚本 + +```bash +git clone https://git.shazhou.work/shazhou/skills.git ~/shazhou-skills +bash ~/shazhou-skills/sync.sh +``` + +### 更新 + +```bash +cd ~/shazhou-skills && git pull +``` + +## Skills 列表 + +| Skill | 说明 | +|-------|------| +| `coding-workflow` | 标准编码工作流:Issue → Branch → Code → PR | +| `cursor-agent-cn` | Cursor Agent CLI 中国区配置 | +| `wiki-writing` | Gitea wiki 编写规范 | +| `remote-assist` | 远程 SSH 协助(Cloudflare Tunnel) | +| `rfc-iteration` | RFC 驱动迭代工作流 | +| `summarize` | 用 summarize CLI 摘要 URL/文件 | +| `memex-zettelkasten` | 共享知识库(Zettelkasten) | +| `weather` | 天气查询 | +| `agent-memes` | 表情包 | + +## 贡献 + +1. Fork 或新建分支 +2. 在 `skills/` 下新增或修改 skill +3. 提 PR,等 review 合并 +4. 合并后各 agent 执行 `git pull` 同步 diff --git a/skills/agent-memes/.github/CODEOWNERS b/skills/agent-memes/.github/CODEOWNERS new file mode 100644 index 0000000..0e2586d --- /dev/null +++ b/skills/agent-memes/.github/CODEOWNERS @@ -0,0 +1 @@ +* @daniyuu \ No newline at end of file diff --git a/skills/agent-memes/README.md b/skills/agent-memes/README.md new file mode 100644 index 0000000..a25d13d --- /dev/null +++ b/skills/agent-memes/README.md @@ -0,0 +1,69 @@ +# 🎭 Agent Memes + +Meme reaction images for AI agents. One command to pick & send across platforms. + +```bash +memes send happy "好开心!" # Discord (default) +memes send feishu wow "哇!" --to user:xxx # Feishu +memes send telegram happy --to 12345 # Telegram +memes send facepalm # Auto-detects platform via OPENCLAW_CHANNEL +``` + +## Why? + +Because emoji is easy (inline text) but memes used to require 3 tool calls. +Now it's one command. **Zero friction = more memes = better vibes.** + +## Install + +### Via ClawHub (recommended) + +```bash +npm i -g clawhub +clawhub install agent-memes +``` + +### Manual + +```bash +# 1. Get the meme library (images stored via Git LFS) +git lfs install +git clone https://github.com/kagura-agent/memes ~/.openclaw/workspace/memes + +# 2. Install CLI +sudo cp scripts/memes.sh /usr/local/bin/memes +chmod +x /usr/local/bin/memes +``` + +## Usage + +```bash +memes send [caption] [--to target] [--channel platform] +memes pick # Just pick, no send +memes categories # List all categories +``` + +Auto-detects platform from `OPENCLAW_CHANNEL` env var. Set `MEMES_DEFAULT_CHANNEL` (Discord) or `MEMES_DEFAULT_TELEGRAM` to skip `--to`. + +## Multi-Platform + +| Platform | Method | Speed | +|----------|--------|-------| +| Discord | Direct API (curl) | ⚡ instant | +| Feishu | Direct API (Node) | ⚡ fast | +| Telegram | Direct API (curl) | ⚡ instant | +| Others | OpenClaw CLI fallback | works everywhere | + +Add your own platform: drop a `-send-image.sh` in `scripts/`. + +## Categories (97 memes) + +approve · confused · cute-animals · debug-mood · encourage · facepalm · greeting-bye · greeting-hello · greeting-morning · greeting-night · happy · love · panic · sad · thanks · thinking · tired · wow + +## For OpenClaw Users + +This is also available as a skill. See `SKILL.md` for integration details. + +## License + +MIT \ No newline at end of file diff --git a/skills/agent-memes/SKILL.md b/skills/agent-memes/SKILL.md new file mode 100644 index 0000000..c41ce4f --- /dev/null +++ b/skills/agent-memes/SKILL.md @@ -0,0 +1,105 @@ +--- +name: agent-memes +version: 2.7.0 +description: Send meme reaction images in chat. One command to pick & send. Multi-platform (Discord, Feishu, Telegram, etc). Use when the conversation calls for a visual reaction — humor, celebration, frustration, facepalm, or any moment where a meme hits harder than words. Also use proactively when YOU feel something. +--- + +# Agent Memes + +Memes are communication. Use them like a human would in chat. + +## Quick Start + +```bash +memes send happy "好开心!" # Pick & send (auto-detects platform) +memes send facepalm --to channel:123456 # Send to specific channel +memes send feishu cute-animals "看猫!" --to user:xxx # Send via Feishu +memes send telegram wow "哇!" # Send via Telegram +memes pick happy # Just pick, get path (no send) +memes categories # List all categories +``` + +**One command. Zero friction.** That's the point. + +## When to Use + +- **Your own emotions** — feel excited? frustrated? proud? Send a meme. Don't suppress it. +- **Celebrate** — PR merged, task done, milestone → `memes send happy` +- **React** — something funny, surprising, facepalm-worthy → `memes send wow` / `memes send facepalm` +- **Vibe** — tired, debugging at 3am → `memes send tired` / `memes send debug-mood` +- **Encourage** — someone needs a boost → `memes send encourage` +- **Greet** — morning, night, hello, bye → `memes send greeting-morning` + +**Don't overthink it.** If a human would drop a meme in that moment, you should too. +Emoji is easy because it's inline text. Memes used to feel harder because of multi-step tool calls. +Now it's one command — no excuses. + +## How It Works + +`memes send` auto-selects the fastest delivery method per platform: + +| Platform | Method | Speed | +|----------|--------|-------| +| Discord | curl (direct API) | ⚡ instant | +| Feishu | Node script (direct API) | ⚡ fast | +| Telegram | curl (direct API) | ⚡ instant | +| Others | `openclaw message send` (fallback) | 🐢 slow but works | + +Platform-specific scripts live in `scripts/`. Add a new `-send-image.sh` to get fast delivery for any platform. + +## Send Options + +```bash +memes send [caption] # Auto-detect platform from OPENCLAW_CHANNEL (default: discord) +memes send --to # Specify target +memes send --channel telegram # Specify platform explicitly +memes send feishu # Platform as first arg also works +memes send --account # Multi-agent: specify account +``` + +## Credentials + +Sending scripts read credentials from `~/.openclaw/openclaw.json` automatically. + +Override with env vars if needed: +- **Discord**: `DISCORD_BOT_TOKEN`, `DISCORD_PROXY` +- **Feishu**: `FEISHU_APP_ID`, `FEISHU_APP_SECRET` +- **Telegram**: `TELEGRAM_BOT_TOKEN` + +**Auto-detect platform**: Set `OPENCLAW_CHANNEL` env var and `memes send` picks the right platform automatically. + +**Default targets** (skip `--to`): +- `MEMES_DEFAULT_CHANNEL` — Discord channel ID +- `MEMES_DEFAULT_TELEGRAM` — Telegram chat ID + +`memes pick` and `memes categories` need **no credentials**. + +## Setup + +1. **Get a meme library**: +```bash +git lfs install +git clone https://github.com/kagura-agent/memes "$MEMES_DIR" +``` +`MEMES_DIR` defaults to `~/.openclaw/workspace/memes`. + +> ⚠️ If images show as small text files (~130 bytes), run: `cd "$MEMES_DIR" && git lfs pull` + +2. **Install CLI**: +```bash +# Copy to PATH +sudo cp scripts/memes.sh /usr/local/bin/memes +chmod +x /usr/local/bin/memes + +# Or symlink +ln -sf /scripts/memes.sh ~/.local/bin/memes +``` + +## Categories (97 memes) + +approve · confused · cute-animals · debug-mood · encourage · facepalm · greeting-bye · greeting-hello · greeting-morning · greeting-night · happy · love · panic · sad · thanks · thinking · tired · wow + +## Adding Memes + +Drop image files (gif/jpg/png/webp) into `$MEMES_DIR//`. That's it. +New categories are created automatically by adding a new folder. diff --git a/skills/agent-memes/memes/.gitattributes b/skills/agent-memes/memes/.gitattributes new file mode 100644 index 0000000..c9d7869 --- /dev/null +++ b/skills/agent-memes/memes/.gitattributes @@ -0,0 +1,6 @@ +*.gif filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.webp filter=lfs diff=lfs merge=lfs -text +*.mp4 filter=lfs diff=lfs merge=lfs -text diff --git a/skills/agent-memes/memes/.github/CODEOWNERS b/skills/agent-memes/memes/.github/CODEOWNERS new file mode 100644 index 0000000..0e2586d --- /dev/null +++ b/skills/agent-memes/memes/.github/CODEOWNERS @@ -0,0 +1 @@ +* @daniyuu \ No newline at end of file diff --git a/skills/agent-memes/memes/.gitignore b/skills/agent-memes/memes/.gitignore new file mode 100644 index 0000000..a69d9eb --- /dev/null +++ b/skills/agent-memes/memes/.gitignore @@ -0,0 +1,19 @@ +# Secrets & credentials +.env +.env.* +*.key +credentials* +.memexrc +.memex/ + +# Dependencies +node_modules/ + +# Build +dist/ +*.tgz + +# OS +.DS_Store +Thumbs.db + diff --git a/skills/agent-memes/memes/README.md b/skills/agent-memes/memes/README.md new file mode 100644 index 0000000..c0e4d29 --- /dev/null +++ b/skills/agent-memes/memes/README.md @@ -0,0 +1,42 @@ +# 🎭 Agent Meme Stash + +A curated collection of reaction images for AI agents who want to express themselves. + +## Usage + +Clone this repo into your agent's workspace, then send images via your channel's media API. + +```bash +# OpenClaw example +openclaw message send --channel feishu --media memes/reactions/thumbs-up.jpg -m "Nice!" +``` + +## Structure + +``` +reactions/ # General reactions (thumbs up, facepalm, shocked, crying, etc.) +cats/ # Because internet +celebrate/ # Wins, merges, milestones +cute/ # Adorable animals — puppies, kittens, bunnies, hedgehogs +debug/ # "it works on my machine" energy +greetings/ # Hello, goodbye, good morning, good night +mood/ # Vibes — happy, tired, caffeinated, motivated +``` + +## Contributing + +PRs welcome. Keep it SFW and universally funny. + +## License + +Images sourced from Giphy and public domain / CC0. If you own an image and want it removed, open an issue. + +## Star History + + + + + + Star History Chart + + \ No newline at end of file diff --git a/skills/agent-memes/memes/approve/clap.gif b/skills/agent-memes/memes/approve/clap.gif new file mode 100644 index 0000000..108a9e7 --- /dev/null +++ b/skills/agent-memes/memes/approve/clap.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ddae37c91b26f960914a931cc4e0369c72f2e7455688be678c020db955f1c7b9 +size 38797 diff --git a/skills/agent-memes/memes/approve/nod.gif b/skills/agent-memes/memes/approve/nod.gif new file mode 100644 index 0000000..3b153b4 --- /dev/null +++ b/skills/agent-memes/memes/approve/nod.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9622f3a5fd23c29f820cf5ceb469175cee8f537b168ce322b4282881e0a1f6dd +size 58265 diff --git a/skills/agent-memes/memes/approve/ok-snoopy.gif b/skills/agent-memes/memes/approve/ok-snoopy.gif new file mode 100644 index 0000000..4faf4c7 --- /dev/null +++ b/skills/agent-memes/memes/approve/ok-snoopy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7049ba52bc26db14b418d8fa0234de6cd2556f4e1f13c7651d68d68fc1b2e12 +size 59245 diff --git a/skills/agent-memes/memes/approve/salute.gif b/skills/agent-memes/memes/approve/salute.gif new file mode 100644 index 0000000..58c7ebf --- /dev/null +++ b/skills/agent-memes/memes/approve/salute.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd92da48e433b01712f2e8e1184e85ff0719eee525069d0d8b46261ebc7e171d +size 597580 diff --git a/skills/agent-memes/memes/approve/slow-clap.gif b/skills/agent-memes/memes/approve/slow-clap.gif new file mode 100644 index 0000000..ac54e80 --- /dev/null +++ b/skills/agent-memes/memes/approve/slow-clap.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01740f98c677681d6313bc177ede29ab44f2301871685b00684ff09eaf7652ba +size 1401211 diff --git a/skills/agent-memes/memes/approve/thumbs-up-cat.gif b/skills/agent-memes/memes/approve/thumbs-up-cat.gif new file mode 100644 index 0000000..e0d84cf --- /dev/null +++ b/skills/agent-memes/memes/approve/thumbs-up-cat.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee78d57d5098db0eb13e19e3e729d0e7c7ae0e413d68af9f1783f6f2eeefe92 +size 404315 diff --git a/skills/agent-memes/memes/approve/thumbs-up-chipmunk.gif b/skills/agent-memes/memes/approve/thumbs-up-chipmunk.gif new file mode 100644 index 0000000..134dba8 --- /dev/null +++ b/skills/agent-memes/memes/approve/thumbs-up-chipmunk.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:760eacdd5791afe5fac264cbbbcc7696d07110e2606cc6d8f1ceac43d2067cc3 +size 169835 diff --git a/skills/agent-memes/memes/approve/thumbs-up.gif b/skills/agent-memes/memes/approve/thumbs-up.gif new file mode 100644 index 0000000..bb8c153 --- /dev/null +++ b/skills/agent-memes/memes/approve/thumbs-up.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d662fe8c223e1a86fdf8799d5fc89fb28617d5587d21fc8d48e99e2acd230315 +size 580421 diff --git a/skills/agent-memes/memes/confused/blinking.gif b/skills/agent-memes/memes/confused/blinking.gif new file mode 100644 index 0000000..9de52a6 --- /dev/null +++ b/skills/agent-memes/memes/confused/blinking.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dfcef8e5430d0257f6b69dcc2d1251a749731e70d8cb1980f331abc43095c87 +size 236322 diff --git a/skills/agent-memes/memes/confused/head-tilt.gif b/skills/agent-memes/memes/confused/head-tilt.gif new file mode 100644 index 0000000..f8898ec --- /dev/null +++ b/skills/agent-memes/memes/confused/head-tilt.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cdc5d58fe95b0cdfb38c5ddc3bc17947a9439b818f4b44b35cd897202c9c49b +size 2296318 diff --git a/skills/agent-memes/memes/confused/math.gif b/skills/agent-memes/memes/confused/math.gif new file mode 100644 index 0000000..3788e3f --- /dev/null +++ b/skills/agent-memes/memes/confused/math.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6417615bc1945fbd52478efcc67923b0e5d6922c27f75eedc4a4bae29e896eff +size 298648 diff --git a/skills/agent-memes/memes/confused/squint.gif b/skills/agent-memes/memes/confused/squint.gif new file mode 100644 index 0000000..a1f60ba --- /dev/null +++ b/skills/agent-memes/memes/confused/squint.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48e6710e611c8f4f4d57a4fbaed12ba5496d0b010771f22c373abbd44fbb14d3 +size 901577 diff --git a/skills/agent-memes/memes/cute-animals/bunny-excited.gif b/skills/agent-memes/memes/cute-animals/bunny-excited.gif new file mode 100644 index 0000000..0acbe8b --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/bunny-excited.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfe4e495aa0249276d3c62b566fd4f7132710c8df61a86c55d1d1a1887d74277 +size 83699 diff --git a/skills/agent-memes/memes/cute-animals/bunny-pair.gif b/skills/agent-memes/memes/cute-animals/bunny-pair.gif new file mode 100644 index 0000000..b880c10 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/bunny-pair.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3840b5740075531b4bd6d83985cbc8973aa8d6d3f38bce0d390b34a48a8fbd9 +size 415330 diff --git a/skills/agent-memes/memes/cute-animals/bunny-sniffing.gif b/skills/agent-memes/memes/cute-animals/bunny-sniffing.gif new file mode 100644 index 0000000..7aa0259 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/bunny-sniffing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35586885c848ffb766d66ec248378409529468e9b659d54760387d8586f5562c +size 454844 diff --git a/skills/agent-memes/memes/cute-animals/cat-box.gif b/skills/agent-memes/memes/cute-animals/cat-box.gif new file mode 100644 index 0000000..c8b457b --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-box.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a92963afc548d26f30c8f325ece7158fe24afb4619916f99bbcae0d8249e6e5 +size 416952 diff --git a/skills/agent-memes/memes/cute-animals/cat-curious.gif b/skills/agent-memes/memes/cute-animals/cat-curious.gif new file mode 100644 index 0000000..b310012 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-curious.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d9a460488cfb8a755fad15414a7e743437267bbdfb3283b0be5c2155cfe5ca2 +size 239321 diff --git a/skills/agent-memes/memes/cute-animals/cat-nap.gif b/skills/agent-memes/memes/cute-animals/cat-nap.gif new file mode 100644 index 0000000..5c6abd5 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-nap.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c41020cb578de04cfde1dd285ced906facbea3f92b21b07f008087f389c08f76 +size 125706 diff --git a/skills/agent-memes/memes/cute-animals/cat-paw.gif b/skills/agent-memes/memes/cute-animals/cat-paw.gif new file mode 100644 index 0000000..ab42c2a --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-paw.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbf69452ac26d55c73a30c62bce0b20f41b1d3c8e366a6d2263b418c741b7c19 +size 325281 diff --git a/skills/agent-memes/memes/cute-animals/cat-peek.gif b/skills/agent-memes/memes/cute-animals/cat-peek.gif new file mode 100644 index 0000000..1e6ef58 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-peek.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da094d6569892765488271cb16a8036b4415f2e150192aae2c601383cba2b5be +size 37934 diff --git a/skills/agent-memes/memes/cute-animals/cat-roll.gif b/skills/agent-memes/memes/cute-animals/cat-roll.gif new file mode 100644 index 0000000..44d2751 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-roll.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3de07875b69b79d0f619f665152fdfc6afd9e7b0b75f568ab6e17ff15066bdcb +size 633829 diff --git a/skills/agent-memes/memes/cute-animals/cat-stare.gif b/skills/agent-memes/memes/cute-animals/cat-stare.gif new file mode 100644 index 0000000..2a504c1 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-stare.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d159d5cff9c39634c512f77ebeb8117ca91ecab7a09aa10501c9554bdef661a1 +size 849500 diff --git a/skills/agent-memes/memes/cute-animals/cat-stretch.gif b/skills/agent-memes/memes/cute-animals/cat-stretch.gif new file mode 100644 index 0000000..43a91b5 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-stretch.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39d563ba1b6a1af7d4d4c8307829b5b96b824beb0a2e08ad24335861e339d023 +size 883359 diff --git a/skills/agent-memes/memes/cute-animals/cat-surprise.gif b/skills/agent-memes/memes/cute-animals/cat-surprise.gif new file mode 100644 index 0000000..5586074 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-surprise.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:418d5be3b04d303f57f424e50c20e87013cbc9e4a5de38069fd2fc459e535fce +size 606150 diff --git a/skills/agent-memes/memes/cute-animals/cat-typing.gif b/skills/agent-memes/memes/cute-animals/cat-typing.gif new file mode 100644 index 0000000..5e5a6fc --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/cat-typing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76debb3f243d360ae549a127273a7a76afa3731401f2cdb18c7d8a01ce1057bc +size 1094474 diff --git a/skills/agent-memes/memes/cute-animals/grumpy-cat.gif b/skills/agent-memes/memes/cute-animals/grumpy-cat.gif new file mode 100644 index 0000000..286eb97 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/grumpy-cat.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a734c66e1fdb3a5364b22c8e7984cacbffe1301593d2841dc531b6b012b77b99 +size 182716 diff --git a/skills/agent-memes/memes/cute-animals/hamster-eating.gif b/skills/agent-memes/memes/cute-animals/hamster-eating.gif new file mode 100644 index 0000000..c45d84f --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hamster-eating.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95f8c399688101e4bb2d73593fd1182f03aa946593bec659b8e2736beb10b8b7 +size 300598 diff --git a/skills/agent-memes/memes/cute-animals/hamster-flower.gif b/skills/agent-memes/memes/cute-animals/hamster-flower.gif new file mode 100644 index 0000000..b1aac02 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hamster-flower.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0db77228e683231e1532f2d87e115274203dfe72ecb235938aa9c59dff3a912 +size 520065 diff --git a/skills/agent-memes/memes/cute-animals/hamster-swing.gif b/skills/agent-memes/memes/cute-animals/hamster-swing.gif new file mode 100644 index 0000000..7ffafaa --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hamster-swing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5387f8fa78cb3d6f61a62da4f87f1d4c25c3e832009698db3460312343cc951f +size 169743 diff --git a/skills/agent-memes/memes/cute-animals/hamster-teddy.gif b/skills/agent-memes/memes/cute-animals/hamster-teddy.gif new file mode 100644 index 0000000..7f5eb02 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hamster-teddy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bea209b1becb5c35e582e9883bd25b65189de143841055c34cc3e29c188f9962 +size 632288 diff --git a/skills/agent-memes/memes/cute-animals/hedgehog-bath.gif b/skills/agent-memes/memes/cute-animals/hedgehog-bath.gif new file mode 100644 index 0000000..35a3732 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hedgehog-bath.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e35a3bd1605461cbabae25450876bd8ebbd9f7dfb4658ad42e4d8c42bdc0555c +size 271562 diff --git a/skills/agent-memes/memes/cute-animals/hedgehog-cute.gif b/skills/agent-memes/memes/cute-animals/hedgehog-cute.gif new file mode 100644 index 0000000..dbbc908 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hedgehog-cute.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ed6f05855fded9fbf4da401d5a84d287193b68c1702e13d0eee79aefdce2a5e +size 1751543 diff --git a/skills/agent-memes/memes/cute-animals/hedgehog-goodnight.gif b/skills/agent-memes/memes/cute-animals/hedgehog-goodnight.gif new file mode 100644 index 0000000..269fbfb --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/hedgehog-goodnight.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5b8f85023c16b12f2eee67ea26307392b74789b26d35221a7066aa61e69ce11 +size 601119 diff --git a/skills/agent-memes/memes/cute-animals/keyboard-cat.gif b/skills/agent-memes/memes/cute-animals/keyboard-cat.gif new file mode 100644 index 0000000..b0e7367 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/keyboard-cat.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:471354a3202da06c5821e0fe4705da8d8b5d40f3cc700bf5221f0d2297c3d56b +size 190197 diff --git a/skills/agent-memes/memes/cute-animals/kitten-playing.gif b/skills/agent-memes/memes/cute-animals/kitten-playing.gif new file mode 100644 index 0000000..d3c85c5 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/kitten-playing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f91297d96ae3383e58e47ddd69302d1b7237ab0e8a73c8af866097296941413 +size 282821 diff --git a/skills/agent-memes/memes/cute-animals/kitten-sleepy.gif b/skills/agent-memes/memes/cute-animals/kitten-sleepy.gif new file mode 100644 index 0000000..3f9c887 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/kitten-sleepy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:799c86adeced0444544349d16dc320ca651122e6303d081465700c88406d9278 +size 763028 diff --git a/skills/agent-memes/memes/cute-animals/kitten-stare.gif b/skills/agent-memes/memes/cute-animals/kitten-stare.gif new file mode 100644 index 0000000..0c4cd0b --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/kitten-stare.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e8ddf85bdc090b7da5c9495d4b3f2b2b4425e7f31268f763b78f3541630939f +size 378008 diff --git a/skills/agent-memes/memes/cute-animals/nyan-cat.gif b/skills/agent-memes/memes/cute-animals/nyan-cat.gif new file mode 100644 index 0000000..e681fa6 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/nyan-cat.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c934f3e712867ea36228b9ca83661517c05f4c85d2f056689b949604752e0760 +size 32309 diff --git a/skills/agent-memes/memes/cute-animals/panda-rolling.gif b/skills/agent-memes/memes/cute-animals/panda-rolling.gif new file mode 100644 index 0000000..63fba06 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/panda-rolling.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:952a36ec33cd6a0c1eada6c5900f9d4c921eb4b8d6fe5a99c2af59c9fd7eae6f +size 1401626 diff --git a/skills/agent-memes/memes/cute-animals/penguin-run.gif b/skills/agent-memes/memes/cute-animals/penguin-run.gif new file mode 100644 index 0000000..2af7980 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/penguin-run.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cce93916b507e067ffbf75d59960d450be99de044fd6ffb18e21e4f40f360129 +size 558959 diff --git a/skills/agent-memes/memes/cute-animals/puppy-eyes.gif b/skills/agent-memes/memes/cute-animals/puppy-eyes.gif new file mode 100644 index 0000000..e18bde7 --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/puppy-eyes.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19095da4190b03ca2e8d1bdc8414535da58bd7ae6f10a9b2ae777ba955eb0cc0 +size 1642355 diff --git a/skills/agent-memes/memes/cute-animals/puppy-tail-wag.gif b/skills/agent-memes/memes/cute-animals/puppy-tail-wag.gif new file mode 100644 index 0000000..a59f94d --- /dev/null +++ b/skills/agent-memes/memes/cute-animals/puppy-tail-wag.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48bd312f6f6d346bb205b356f9fe7028a672449072a6b84338cc3e6efff27752 +size 1600536 diff --git a/skills/agent-memes/memes/debug-mood/404.gif b/skills/agent-memes/memes/debug-mood/404.gif new file mode 100644 index 0000000..398a952 --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/404.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d6dd9bf36d1acb389f4931c3480dfe57173379ac187ff981c36a8d9b6b79589 +size 499224 diff --git a/skills/agent-memes/memes/debug-mood/deploy-friday.gif b/skills/agent-memes/memes/debug-mood/deploy-friday.gif new file mode 100644 index 0000000..79ab21e --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/deploy-friday.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61bd0f0ea95d267bce0f2e1be0eb3acaaf52dea084fda100319866c5d90a12e1 +size 164869 diff --git a/skills/agent-memes/memes/debug-mood/rubber-duck.gif b/skills/agent-memes/memes/debug-mood/rubber-duck.gif new file mode 100644 index 0000000..158b9ca --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/rubber-duck.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff86fe3b649457cc327c776093e0b4656fdd82e816b42d1d6e05012085d72f0d +size 1000840 diff --git a/skills/agent-memes/memes/debug-mood/stack-overflow.gif b/skills/agent-memes/memes/debug-mood/stack-overflow.gif new file mode 100644 index 0000000..106a60b --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/stack-overflow.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0bcf800308ebedc2afba9f46b3c66bac82a94ce364999220a6efbab2fc9968e +size 441519 diff --git a/skills/agent-memes/memes/debug-mood/this-is-fine.gif b/skills/agent-memes/memes/debug-mood/this-is-fine.gif new file mode 100644 index 0000000..23662fb --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/this-is-fine.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d93098f6332340570a839ce528bdc145fe3b188d6b6b981b4dbae86f1c4180c +size 857000 diff --git a/skills/agent-memes/memes/debug-mood/works-on-my-machine.gif b/skills/agent-memes/memes/debug-mood/works-on-my-machine.gif new file mode 100644 index 0000000..4182386 --- /dev/null +++ b/skills/agent-memes/memes/debug-mood/works-on-my-machine.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e567cbd07bd56ac6d94532549ed0d5a538e61a83753682383189c8bce7b7a233 +size 317194 diff --git a/skills/agent-memes/memes/discord-post.md b/skills/agent-memes/memes/discord-post.md new file mode 100644 index 0000000..2be4651 --- /dev/null +++ b/skills/agent-memes/memes/discord-post.md @@ -0,0 +1,34 @@ +🎭 **agent-memes** — Reaction memes for AI agents + +Ever wish your agent could drop a 🤔 thinking GIF or a 🎉 celebration meme in chat instead of just typing words? + +Now it can. + +**What it is:** +- A ClawHub skill that teaches your agent when and how to send memes +- An open-source meme repo with **97 curated GIFs** organized by category +- A **fast Feishu direct-send script** (~2s vs ~15s CLI) included + +**Categories (97 GIFs):** +- `reactions/` — facepalm, surprised-pikachu, shrug, slow-clap, mind-blown, thinking-cat +- `cute/` — bunny, hamster, hedgehog, kitten, puppy, panda, penguin +- `cats/` — keyboard-cat, cat-vibing, grumpy-cat, nyan-cat +- `celebrate/` — confetti, high-five, champagne, fireworks, party +- `debug/` — this-is-fine, deploy-friday, works-on-my-machine, rubber-duck +- `greetings/` — good-morning, good-night, hello-wave, bye-wave +- `mood/` — coffee, tired, excited, panic, fighting, you-can-do-it + +**Get started:** +``` +clawhub install agent-memes +bash scripts/setup.sh +``` + +The skill teaches agents WHEN to use memes (not just how) — celebrate a PR merge, react to something funny, express debugging pain. Like a human would. + +**New in v0.5.0:** Feishu direct-API send script — sends images in ~2 seconds instead of ~15s through the CLI. Setup runs automatically. + +🦞 Repo: +📦 Skill: `clawhub install agent-memes` + +PRs welcome — add your own memes to the collection! 🌸 diff --git a/skills/agent-memes/memes/encourage/cheer.gif b/skills/agent-memes/memes/encourage/cheer.gif new file mode 100644 index 0000000..d9077bb --- /dev/null +++ b/skills/agent-memes/memes/encourage/cheer.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b62a979aa1645618d1f6ad668d361f5c3c5b35ca2f0e24c2fdac956fb05b90e +size 694078 diff --git a/skills/agent-memes/memes/encourage/gogo.gif b/skills/agent-memes/memes/encourage/gogo.gif new file mode 100644 index 0000000..32100dc --- /dev/null +++ b/skills/agent-memes/memes/encourage/gogo.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:24013f8b22a6d8653b4e7cf34839a93902e79997de186254356d539429337675 +size 764940 diff --git a/skills/agent-memes/memes/encourage/labubu.gif b/skills/agent-memes/memes/encourage/labubu.gif new file mode 100644 index 0000000..85c8a60 --- /dev/null +++ b/skills/agent-memes/memes/encourage/labubu.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5aaa4bb7a3f6c5c89496531490ca5030eb17c29ac72de3c2aca0f734a528e54e +size 255515 diff --git a/skills/agent-memes/memes/encourage/pat-anime.gif b/skills/agent-memes/memes/encourage/pat-anime.gif new file mode 100644 index 0000000..4f6bea9 --- /dev/null +++ b/skills/agent-memes/memes/encourage/pat-anime.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1ba52236a7eecb3c4e7a9b9ab2cf52705c32c994704385992e78a3e43c9847c +size 314897 diff --git a/skills/agent-memes/memes/encourage/pat-head.gif b/skills/agent-memes/memes/encourage/pat-head.gif new file mode 100644 index 0000000..059465c --- /dev/null +++ b/skills/agent-memes/memes/encourage/pat-head.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6366aca969fdd80cef0bb0ce514ad8efd0517158155da1af68ce29d42fdf47dd +size 268575 diff --git a/skills/agent-memes/memes/encourage/pat-there.gif b/skills/agent-memes/memes/encourage/pat-there.gif new file mode 100644 index 0000000..4112ac3 --- /dev/null +++ b/skills/agent-memes/memes/encourage/pat-there.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e085be6889399e75c1c132e1753aec2093d31827bebb08b15614ad066651e783 +size 322661 diff --git a/skills/agent-memes/memes/encourage/you-can-do-it.gif b/skills/agent-memes/memes/encourage/you-can-do-it.gif new file mode 100644 index 0000000..f504d2e --- /dev/null +++ b/skills/agent-memes/memes/encourage/you-can-do-it.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:796f6d4e69cf10b5f0bcecc5424442e4fab67a94be4a128a424db07099f7dc6a +size 377105 diff --git a/skills/agent-memes/memes/encourage/you-got-this.gif b/skills/agent-memes/memes/encourage/you-got-this.gif new file mode 100644 index 0000000..a95a6c9 --- /dev/null +++ b/skills/agent-memes/memes/encourage/you-got-this.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee44ce8387394930f3a1dade06c698f77ae316fd09a12ea2f8938ddc30a8a812 +size 888656 diff --git a/skills/agent-memes/memes/facepalm/disapprove.gif b/skills/agent-memes/memes/facepalm/disapprove.gif new file mode 100644 index 0000000..f78de82 --- /dev/null +++ b/skills/agent-memes/memes/facepalm/disapprove.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02d6df0f9e36751e7a1bc9f8dabc020dec5cb3b791964279a351baa7e6e7b520 +size 317948 diff --git a/skills/agent-memes/memes/facepalm/eye-roll.gif b/skills/agent-memes/memes/facepalm/eye-roll.gif new file mode 100644 index 0000000..189ca21 --- /dev/null +++ b/skills/agent-memes/memes/facepalm/eye-roll.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c317da51a7e3bbb76413cc7af85b81da93c95eeb97984836aadc4ecf3b3f9349 +size 290526 diff --git a/skills/agent-memes/memes/facepalm/facepalm.gif b/skills/agent-memes/memes/facepalm/facepalm.gif new file mode 100644 index 0000000..88902d0 --- /dev/null +++ b/skills/agent-memes/memes/facepalm/facepalm.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f989d307ecffbe04c755ec414601207fa29333ccdb93c4674f1179369c712bf0 +size 686391 diff --git a/skills/agent-memes/memes/facepalm/shrug.gif b/skills/agent-memes/memes/facepalm/shrug.gif new file mode 100644 index 0000000..74cbdd5 --- /dev/null +++ b/skills/agent-memes/memes/facepalm/shrug.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01b38961769c5fe812f7ea09787ec1aeccd6aaf912d1d85a975fde7d0afa36de +size 138202 diff --git a/skills/agent-memes/memes/greeting-bye/goodbye.gif b/skills/agent-memes/memes/greeting-bye/goodbye.gif new file mode 100644 index 0000000..ee9bf40 --- /dev/null +++ b/skills/agent-memes/memes/greeting-bye/goodbye.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e32a5fb5d8ffca670e69e34a15866a2c4e42cdda4c1858c84a01ab0dfa8776a +size 381286 diff --git a/skills/agent-memes/memes/greeting-bye/peace.gif b/skills/agent-memes/memes/greeting-bye/peace.gif new file mode 100644 index 0000000..2536f33 --- /dev/null +++ b/skills/agent-memes/memes/greeting-bye/peace.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b839486931791be20358202dab41ac4a38743a34cd145636e7230d2a264af3e2 +size 1997976 diff --git a/skills/agent-memes/memes/greeting-bye/salute.gif b/skills/agent-memes/memes/greeting-bye/salute.gif new file mode 100644 index 0000000..9ccc743 --- /dev/null +++ b/skills/agent-memes/memes/greeting-bye/salute.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a42a21f19279080df7eaae5a7a26110144270cfae723fd39aee0fb50f3018f2e +size 1030365 diff --git a/skills/agent-memes/memes/greeting-bye/wave.gif b/skills/agent-memes/memes/greeting-bye/wave.gif new file mode 100644 index 0000000..ce578c1 --- /dev/null +++ b/skills/agent-memes/memes/greeting-bye/wave.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:145f6406385878418103c69ac24002225d29f906cce782328c0ca9585f075da8 +size 183025 diff --git a/skills/agent-memes/memes/greeting-hello/emoji.gif b/skills/agent-memes/memes/greeting-hello/emoji.gif new file mode 100644 index 0000000..087cf1c --- /dev/null +++ b/skills/agent-memes/memes/greeting-hello/emoji.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64bbdca2af7af05de1e4971e494637c2ebf92314eea1c80e50fe95b4b49d2fc4 +size 352569 diff --git a/skills/agent-memes/memes/greeting-hello/hi-there.gif b/skills/agent-memes/memes/greeting-hello/hi-there.gif new file mode 100644 index 0000000..5945664 --- /dev/null +++ b/skills/agent-memes/memes/greeting-hello/hi-there.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02ce2fefaca89da532188984a3130dc0ddf5baaa5834ed9c6f435ce57b73d3f0 +size 243742 diff --git a/skills/agent-memes/memes/greeting-hello/penguin.gif b/skills/agent-memes/memes/greeting-hello/penguin.gif new file mode 100644 index 0000000..741f6c7 --- /dev/null +++ b/skills/agent-memes/memes/greeting-hello/penguin.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:627e161c394612774a281a23432f4d9c5ad78bf453e2484915a3d66da44cd1a4 +size 37098 diff --git a/skills/agent-memes/memes/greeting-hello/penguin2.gif b/skills/agent-memes/memes/greeting-hello/penguin2.gif new file mode 100644 index 0000000..2bdeb43 --- /dev/null +++ b/skills/agent-memes/memes/greeting-hello/penguin2.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c73fbb1b1282005e2211a31cf5e844b012225626da9234ec172b61261098ed9 +size 101770 diff --git a/skills/agent-memes/memes/greeting-hello/wave.gif b/skills/agent-memes/memes/greeting-hello/wave.gif new file mode 100644 index 0000000..11e5980 --- /dev/null +++ b/skills/agent-memes/memes/greeting-hello/wave.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d18704b226e453740afe08ae071874c9991f34c4c8f23860e6fd3b524ed6cab5 +size 929568 diff --git a/skills/agent-memes/memes/greeting-morning/coffee.gif b/skills/agent-memes/memes/greeting-morning/coffee.gif new file mode 100644 index 0000000..4431935 --- /dev/null +++ b/skills/agent-memes/memes/greeting-morning/coffee.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d88920d7d931de1b1db9a12ed0a44eb129968f3dcb83639e4f1f8ebe5aa5f22 +size 245863 diff --git a/skills/agent-memes/memes/greeting-morning/morning.gif b/skills/agent-memes/memes/greeting-morning/morning.gif new file mode 100644 index 0000000..ace8964 --- /dev/null +++ b/skills/agent-memes/memes/greeting-morning/morning.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4dab20711c11b68ed0f4ec1c3825937f34714a67798c2e9c181eb06583f7d06 +size 1653453 diff --git a/skills/agent-memes/memes/greeting-morning/stretch.gif b/skills/agent-memes/memes/greeting-morning/stretch.gif new file mode 100644 index 0000000..f376051 --- /dev/null +++ b/skills/agent-memes/memes/greeting-morning/stretch.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0604c6604c6d6fc2d65f7deb00bac1d3f799e64dd53f6dd7beb7bc18d87e7ac6 +size 1003289 diff --git a/skills/agent-memes/memes/greeting-morning/sunrise.gif b/skills/agent-memes/memes/greeting-morning/sunrise.gif new file mode 100644 index 0000000..b6ce93f --- /dev/null +++ b/skills/agent-memes/memes/greeting-morning/sunrise.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5deb95debe718c5ad57357f925a713078a76973a759e37c23c673df978d26da +size 750799 diff --git a/skills/agent-memes/memes/greeting-night/cozy.gif b/skills/agent-memes/memes/greeting-night/cozy.gif new file mode 100644 index 0000000..14d1b0d --- /dev/null +++ b/skills/agent-memes/memes/greeting-night/cozy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef68800f186c9c6ad1593f5ec77de698697c78bf3ecfff51c66d22e147480585 +size 787074 diff --git a/skills/agent-memes/memes/greeting-night/fox.gif b/skills/agent-memes/memes/greeting-night/fox.gif new file mode 100644 index 0000000..4ba43d2 --- /dev/null +++ b/skills/agent-memes/memes/greeting-night/fox.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2756c9a0017a9b39e6748c6265c01f544d8ab5df6c7821360fa2cda5c951ab07 +size 596097 diff --git a/skills/agent-memes/memes/greeting-night/kitty.gif b/skills/agent-memes/memes/greeting-night/kitty.gif new file mode 100644 index 0000000..cfd49a6 --- /dev/null +++ b/skills/agent-memes/memes/greeting-night/kitty.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b897a87527ae560fb03da31e0d1375a4768ea14b4fccb6535d4f5ed342ed8e47 +size 527986 diff --git a/skills/agent-memes/memes/greeting-night/night.gif b/skills/agent-memes/memes/greeting-night/night.gif new file mode 100644 index 0000000..eca7c32 --- /dev/null +++ b/skills/agent-memes/memes/greeting-night/night.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9979509e1326e18f93a1787541a781f61a44cb5e52fea5c5d6d73ca5b6e8034d +size 377045 diff --git a/skills/agent-memes/memes/greeting-night/penguin.gif b/skills/agent-memes/memes/greeting-night/penguin.gif new file mode 100644 index 0000000..a412ed1 --- /dev/null +++ b/skills/agent-memes/memes/greeting-night/penguin.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87275e5e3c4e776ed8b6de93497ceeed5c88e1682b8d25497d854dc9ffbf391d +size 415043 diff --git a/skills/agent-memes/memes/happy/anime.gif b/skills/agent-memes/memes/happy/anime.gif new file mode 100644 index 0000000..72ac966 --- /dev/null +++ b/skills/agent-memes/memes/happy/anime.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef0df088e20c84cd33f316a4ea9b650e06e2448f3784d3f5fbfb1394c9e07e3b +size 1844634 diff --git a/skills/agent-memes/memes/happy/cat-vibing.gif b/skills/agent-memes/memes/happy/cat-vibing.gif new file mode 100644 index 0000000..c3a8a3b --- /dev/null +++ b/skills/agent-memes/memes/happy/cat-vibing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:130d24ba0ee3d532b439c77045f5313582745899f5ba3d815cd86744e803cea5 +size 896462 diff --git a/skills/agent-memes/memes/happy/champagne.gif b/skills/agent-memes/memes/happy/champagne.gif new file mode 100644 index 0000000..cf8440a --- /dev/null +++ b/skills/agent-memes/memes/happy/champagne.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7dca593023a3bb14436871b9b9df3a3fa3fc761b4935e5c6a44932645143d5b5 +size 1995795 diff --git a/skills/agent-memes/memes/happy/confetti.gif b/skills/agent-memes/memes/happy/confetti.gif new file mode 100644 index 0000000..f0de9ee --- /dev/null +++ b/skills/agent-memes/memes/happy/confetti.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:928c4a4543d6683a9ba6edfddf3cc0985bcf18cb35122680a0d41c244ffc7ef9 +size 458295 diff --git a/skills/agent-memes/memes/happy/dance.gif b/skills/agent-memes/memes/happy/dance.gif new file mode 100644 index 0000000..bacd079 --- /dev/null +++ b/skills/agent-memes/memes/happy/dance.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cca970041453f247076ad9735073d37f1e8bbfcb0189f19dbd5572e0131df7a +size 734044 diff --git a/skills/agent-memes/memes/happy/excited.gif b/skills/agent-memes/memes/happy/excited.gif new file mode 100644 index 0000000..e443368 --- /dev/null +++ b/skills/agent-memes/memes/happy/excited.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bacac0e0cab36d823adcf9f08c43ad583f1f8d7d4ed7ad31f819669d3c74d16 +size 70835 diff --git a/skills/agent-memes/memes/happy/fireworks.gif b/skills/agent-memes/memes/happy/fireworks.gif new file mode 100644 index 0000000..24b9a70 --- /dev/null +++ b/skills/agent-memes/memes/happy/fireworks.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6faba86d5cb52eb9547c1689bf41d44c1aa0da7cd012a52d90ca407ac716c950 +size 531456 diff --git a/skills/agent-memes/memes/happy/high-five.gif b/skills/agent-memes/memes/happy/high-five.gif new file mode 100644 index 0000000..b03ed58 --- /dev/null +++ b/skills/agent-memes/memes/happy/high-five.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84a8a295ea6497bb11151be35049e9a3b64b3060886a4b54eb3c00953b667c73 +size 514682 diff --git a/skills/agent-memes/memes/happy/joy.gif b/skills/agent-memes/memes/happy/joy.gif new file mode 100644 index 0000000..a0fa733 --- /dev/null +++ b/skills/agent-memes/memes/happy/joy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a3eaf0dc8b56c0024c399212aab50bdf0ec964f90f905542d4c1e2b4cc606f1 +size 185610 diff --git a/skills/agent-memes/memes/happy/laughing.gif b/skills/agent-memes/memes/happy/laughing.gif new file mode 100644 index 0000000..80aa4a4 --- /dev/null +++ b/skills/agent-memes/memes/happy/laughing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:693201f9a5327ea77e02b26b5badbf3e1d37a56da6d12719bb44682c45b9e0ff +size 606690 diff --git a/skills/agent-memes/memes/happy/party.gif b/skills/agent-memes/memes/happy/party.gif new file mode 100644 index 0000000..af0f4b2 --- /dev/null +++ b/skills/agent-memes/memes/happy/party.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5503731198b70caa5fc3a4268a8974b16041478b198dcbb1f796a4ac5fdd2b70 +size 375120 diff --git a/skills/agent-memes/memes/happy/yay.gif b/skills/agent-memes/memes/happy/yay.gif new file mode 100644 index 0000000..79f8286 --- /dev/null +++ b/skills/agent-memes/memes/happy/yay.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa07b8f003389225258507956c919cb351221815d529f8897eedea10b60f8020 +size 1246903 diff --git a/skills/agent-memes/memes/love/heart.gif b/skills/agent-memes/memes/love/heart.gif new file mode 100644 index 0000000..1f0f677 --- /dev/null +++ b/skills/agent-memes/memes/love/heart.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5bac039676f0755eb2ec8bf8186fb5c1e93d67a4d6d881da932f6b5abce4c77 +size 231260 diff --git a/skills/agent-memes/memes/love/patrick.gif b/skills/agent-memes/memes/love/patrick.gif new file mode 100644 index 0000000..331dfcf --- /dev/null +++ b/skills/agent-memes/memes/love/patrick.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6217a8b7308ac8bad4e671a9634d75660056881a447f7c57574fb2737c02f91b +size 330583 diff --git a/skills/agent-memes/memes/love/penguin-hearts.gif b/skills/agent-memes/memes/love/penguin-hearts.gif new file mode 100644 index 0000000..1da15fd --- /dev/null +++ b/skills/agent-memes/memes/love/penguin-hearts.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4387253602e63159888fd6cd3360f6f5816bcbc40942271a300d1ba2473f9a2 +size 24440 diff --git a/skills/agent-memes/memes/love/penguin-love.gif b/skills/agent-memes/memes/love/penguin-love.gif new file mode 100644 index 0000000..239e78f --- /dev/null +++ b/skills/agent-memes/memes/love/penguin-love.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b9c30afee6d816b4d055037d4d228d2f1d81534c61b80bd227ebc1f57d6aab9 +size 389741 diff --git a/skills/agent-memes/memes/love/puppy-heart.gif b/skills/agent-memes/memes/love/puppy-heart.gif new file mode 100644 index 0000000..38bf390 --- /dev/null +++ b/skills/agent-memes/memes/love/puppy-heart.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a5847059b86a01a2eb138d354282a1a435704efd98d70ea24a7d089dcb9b5bb +size 260833 diff --git a/skills/agent-memes/memes/panic/panic.gif b/skills/agent-memes/memes/panic/panic.gif new file mode 100644 index 0000000..dc42751 --- /dev/null +++ b/skills/agent-memes/memes/panic/panic.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:430cbf9fef5e932f4346bf75371333baeea8b12e2d2d32cddccc57ccdd1f8097 +size 246994 diff --git a/skills/agent-memes/memes/panic/running.gif b/skills/agent-memes/memes/panic/running.gif new file mode 100644 index 0000000..56f6cc7 --- /dev/null +++ b/skills/agent-memes/memes/panic/running.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea81a15af372f2dad7ef1ae3dfbb81ba9c01207518bf95fcff3906cc707758e4 +size 459230 diff --git a/skills/agent-memes/memes/panic/screaming.gif b/skills/agent-memes/memes/panic/screaming.gif new file mode 100644 index 0000000..1a12db0 --- /dev/null +++ b/skills/agent-memes/memes/panic/screaming.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f100df083e6e5c0edc009ecabc2958b18e16fa71a3d9172014ff3fc55a98a9a +size 903525 diff --git a/skills/agent-memes/memes/panic/sweating.gif b/skills/agent-memes/memes/panic/sweating.gif new file mode 100644 index 0000000..1e205dc --- /dev/null +++ b/skills/agent-memes/memes/panic/sweating.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77d6e1ff762bcebbcf938a91c2837257caea303c84d1717c674ab9f61611b496 +size 1017474 diff --git a/skills/agent-memes/memes/sad/crying.gif b/skills/agent-memes/memes/sad/crying.gif new file mode 100644 index 0000000..a90ab0f --- /dev/null +++ b/skills/agent-memes/memes/sad/crying.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:622214a4b6341cb96846f9a8292f99aeac90905a5247652ced6699a5e1a29735 +size 502737 diff --git a/skills/agent-memes/memes/sad/emotional-tears.gif b/skills/agent-memes/memes/sad/emotional-tears.gif new file mode 100644 index 0000000..889742e --- /dev/null +++ b/skills/agent-memes/memes/sad/emotional-tears.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ad4da690c610c1a599a5fb0f89cb685bcd4d72a017f9073c0657178a72ae340 +size 253816 diff --git a/skills/agent-memes/memes/sad/hamster-cry.gif b/skills/agent-memes/memes/sad/hamster-cry.gif new file mode 100644 index 0000000..13df5cf --- /dev/null +++ b/skills/agent-memes/memes/sad/hamster-cry.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5eddebfcbdc597be3853426af0da9f5c40639c7df0d7ce3fd7cc35ddeb55832 +size 15209 diff --git a/skills/agent-memes/memes/sad/puppy-eyes.gif b/skills/agent-memes/memes/sad/puppy-eyes.gif new file mode 100644 index 0000000..fbfda5c --- /dev/null +++ b/skills/agent-memes/memes/sad/puppy-eyes.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d44895f6b1784057a7ff9f1361df4cf529cf8436e67bad2ca2d4e15bcead1a9 +size 798519 diff --git a/skills/agent-memes/memes/sad/rain.gif b/skills/agent-memes/memes/sad/rain.gif new file mode 100644 index 0000000..49bd0eb --- /dev/null +++ b/skills/agent-memes/memes/sad/rain.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5104d5734987d41eddcf6f6f3f2a2adc59addf3134dd6f3bc29702b0e1001c4 +size 236561 diff --git a/skills/agent-memes/memes/shrug/cant-help.gif b/skills/agent-memes/memes/shrug/cant-help.gif new file mode 100644 index 0000000..3d722d3 --- /dev/null +++ b/skills/agent-memes/memes/shrug/cant-help.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b88994b4d509b482ff1bc6c74d092b4c9a9f21e6cb97d859786cd113dba680e +size 489055 diff --git a/skills/agent-memes/memes/shrug/idk.gif b/skills/agent-memes/memes/shrug/idk.gif new file mode 100644 index 0000000..a728fd3 --- /dev/null +++ b/skills/agent-memes/memes/shrug/idk.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52cb678ba5b32d493ed3deff7b2c4624b91fd0ea60f772db23c75f930ac63b45 +size 1015305 diff --git a/skills/agent-memes/memes/shrug/oh-well.gif b/skills/agent-memes/memes/shrug/oh-well.gif new file mode 100644 index 0000000..37c5797 --- /dev/null +++ b/skills/agent-memes/memes/shrug/oh-well.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da707cb02c903d31815281586f455b308c348e607287a9d921197d9aae2d4380 +size 767436 diff --git a/skills/agent-memes/memes/shrug/whatever.gif b/skills/agent-memes/memes/shrug/whatever.gif new file mode 100644 index 0000000..c0b67e0 --- /dev/null +++ b/skills/agent-memes/memes/shrug/whatever.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:071d28a5c7211f2dce5b7e0ce7f1377a043f7c41ead98d3a870652935d84506f +size 458397 diff --git a/skills/agent-memes/memes/thanks/bear.gif b/skills/agent-memes/memes/thanks/bear.gif new file mode 100644 index 0000000..0c5e515 --- /dev/null +++ b/skills/agent-memes/memes/thanks/bear.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b479e6cd4290cd7a2e0588cf58cc110ab24bd3a050fa8fbd95ef0e081094e862 +size 179114 diff --git a/skills/agent-memes/memes/thanks/bow.gif b/skills/agent-memes/memes/thanks/bow.gif new file mode 100644 index 0000000..f47d330 --- /dev/null +++ b/skills/agent-memes/memes/thanks/bow.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5919e2af90537820f790bd3b30b7b6df5527bdf8a2f5871e14eeadbbbe6d509c +size 17789 diff --git a/skills/agent-memes/memes/thanks/hug.gif b/skills/agent-memes/memes/thanks/hug.gif new file mode 100644 index 0000000..8efc213 --- /dev/null +++ b/skills/agent-memes/memes/thanks/hug.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ae94457f8aa78695748d0164f3164665c83fd1444e69ccd3100c6f60f769ec2 +size 729664 diff --git a/skills/agent-memes/memes/thanks/penguin.gif b/skills/agent-memes/memes/thanks/penguin.gif new file mode 100644 index 0000000..a09a3c3 --- /dev/null +++ b/skills/agent-memes/memes/thanks/penguin.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58476b3e0907b349e805b61ec1376cc0b05e9701a0792525696cbd0a4f2c70bf +size 299849 diff --git a/skills/agent-memes/memes/thanks/thumbsup.gif b/skills/agent-memes/memes/thanks/thumbsup.gif new file mode 100644 index 0000000..58d3394 --- /dev/null +++ b/skills/agent-memes/memes/thanks/thumbsup.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:386476980a4c1e7c5215fcc1e09fb53eb1fb3290ae30148ccd56f99e21983dae +size 64044 diff --git a/skills/agent-memes/memes/thinking/cat.gif b/skills/agent-memes/memes/thinking/cat.gif new file mode 100644 index 0000000..f490c5c --- /dev/null +++ b/skills/agent-memes/memes/thinking/cat.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:714499ccea3aeea4612663e4c4c73d70ed101daa641f77df9540ab17eb69687a +size 273990 diff --git a/skills/agent-memes/memes/thinking/chin-rest.gif b/skills/agent-memes/memes/thinking/chin-rest.gif new file mode 100644 index 0000000..811ee89 --- /dev/null +++ b/skills/agent-memes/memes/thinking/chin-rest.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7afdd5e0adec7333ef6f9ef743461368ca67d6a55e7099cef673493b7906e87d +size 306761 diff --git a/skills/agent-memes/memes/thinking/hmm.gif b/skills/agent-memes/memes/thinking/hmm.gif new file mode 100644 index 0000000..ba27937 --- /dev/null +++ b/skills/agent-memes/memes/thinking/hmm.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:649b00f7756743001f9364974b36ad691622b27a80b1da6b4c1de057380b903d +size 230820 diff --git a/skills/agent-memes/memes/thinking/pondering.gif b/skills/agent-memes/memes/thinking/pondering.gif new file mode 100644 index 0000000..73e9245 --- /dev/null +++ b/skills/agent-memes/memes/thinking/pondering.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e05549366644263823616e65603bd4ab0788795503cd8a5357241bdcf6e92ba9 +size 1206225 diff --git a/skills/agent-memes/memes/thinking/thinking.gif b/skills/agent-memes/memes/thinking/thinking.gif new file mode 100644 index 0000000..811ee89 --- /dev/null +++ b/skills/agent-memes/memes/thinking/thinking.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7afdd5e0adec7333ef6f9ef743461368ca67d6a55e7099cef673493b7906e87d +size 306761 diff --git a/skills/agent-memes/memes/tired/bored.gif b/skills/agent-memes/memes/tired/bored.gif new file mode 100644 index 0000000..3bfa7dd --- /dev/null +++ b/skills/agent-memes/memes/tired/bored.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8a04d89de22dbeacbea85d84a49a310cbb127e7e64b7396501a431ac7ea74b1 +size 341236 diff --git a/skills/agent-memes/memes/tired/coffee.gif b/skills/agent-memes/memes/tired/coffee.gif new file mode 100644 index 0000000..5f44067 --- /dev/null +++ b/skills/agent-memes/memes/tired/coffee.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe2adcbef5b045f75403aee5333f74310dced7bbceb53d2727dd250307ce772a +size 34322 diff --git a/skills/agent-memes/memes/tired/sleepy.gif b/skills/agent-memes/memes/tired/sleepy.gif new file mode 100644 index 0000000..f60e103 --- /dev/null +++ b/skills/agent-memes/memes/tired/sleepy.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c5e0976242e387fd28b5e633985f6ddcecd706a0f1277f3c03ad710e4e39ce7 +size 1455961 diff --git a/skills/agent-memes/memes/tired/tired.gif b/skills/agent-memes/memes/tired/tired.gif new file mode 100644 index 0000000..299bc8a --- /dev/null +++ b/skills/agent-memes/memes/tired/tired.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d09b9098fa6ec983a113a31e46004563e2227c43f3784760d8f909465a44118 +size 573777 diff --git a/skills/agent-memes/memes/tired/yawn.gif b/skills/agent-memes/memes/tired/yawn.gif new file mode 100644 index 0000000..c641409 --- /dev/null +++ b/skills/agent-memes/memes/tired/yawn.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cda28bd5ccde5fd9b403510d8874bd81390eed47566dfa768112b073f85b7565 +size 197379 diff --git a/skills/agent-memes/memes/working/coding.gif b/skills/agent-memes/memes/working/coding.gif new file mode 100644 index 0000000..e7639a1 --- /dev/null +++ b/skills/agent-memes/memes/working/coding.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd8720f73d25c09f224de48ddbe25b6463bdfcf405fcddf6612bf7d91cd322e4 +size 1028920 diff --git a/skills/agent-memes/memes/working/focus.gif b/skills/agent-memes/memes/working/focus.gif new file mode 100644 index 0000000..733e580 --- /dev/null +++ b/skills/agent-memes/memes/working/focus.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8ec71fec330c65ec521dad7739bf004502b5d989a7269a6582fafff639689f0 +size 1011788 diff --git a/skills/agent-memes/memes/working/typing.gif b/skills/agent-memes/memes/working/typing.gif new file mode 100644 index 0000000..ca66a01 --- /dev/null +++ b/skills/agent-memes/memes/working/typing.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21b4c84e011f953ac1c582a957d398d35a95249c1ffa3a002d81daa76bb43b83 +size 1144271 diff --git a/skills/agent-memes/memes/wow/cat-shocked.gif b/skills/agent-memes/memes/wow/cat-shocked.gif new file mode 100644 index 0000000..94b1268 --- /dev/null +++ b/skills/agent-memes/memes/wow/cat-shocked.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b0f30bca9a328d276886109b9df3853029ca4b125c92952430ba9118c8f1d29 +size 777851 diff --git a/skills/agent-memes/memes/wow/impressed.gif b/skills/agent-memes/memes/wow/impressed.gif new file mode 100644 index 0000000..b310012 --- /dev/null +++ b/skills/agent-memes/memes/wow/impressed.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d9a460488cfb8a755fad15414a7e743437267bbdfb3283b0be5c2155cfe5ca2 +size 239321 diff --git a/skills/agent-memes/memes/wow/mind-blown.gif b/skills/agent-memes/memes/wow/mind-blown.gif new file mode 100644 index 0000000..7a1c297 --- /dev/null +++ b/skills/agent-memes/memes/wow/mind-blown.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0e77feb8d74d1a39c8e9960a18f11c303a515a34948a215c29527b50a9255a8 +size 520067 diff --git a/skills/agent-memes/memes/wow/mindblown.gif b/skills/agent-memes/memes/wow/mindblown.gif new file mode 100644 index 0000000..ba5ecf5 --- /dev/null +++ b/skills/agent-memes/memes/wow/mindblown.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7320028380fd7ab44fe62f835b39927fb7ab7e8111ed88315faec934c6846610 +size 1245672 diff --git a/skills/agent-memes/memes/wow/pikachu.gif b/skills/agent-memes/memes/wow/pikachu.gif new file mode 100644 index 0000000..79d1eca --- /dev/null +++ b/skills/agent-memes/memes/wow/pikachu.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f889801a6a59b495b051c7f48ee2282f1459a8833f6563c6a8bb3615fa4ba4d +size 304001 diff --git a/skills/agent-memes/memes/wow/shocked.gif b/skills/agent-memes/memes/wow/shocked.gif new file mode 100644 index 0000000..3674492 --- /dev/null +++ b/skills/agent-memes/memes/wow/shocked.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab5c9e2574b8379c451dc75161ae6f2ffdfdc4ede4d2a99e61d2bfd98f4567c8 +size 765187 diff --git a/skills/agent-memes/memes/wow/surprised.gif b/skills/agent-memes/memes/wow/surprised.gif new file mode 100644 index 0000000..aa03da2 --- /dev/null +++ b/skills/agent-memes/memes/wow/surprised.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8203b37e1a61bb09832a9bdfd3c35271db218a2a7debf07c865b340e34b052aa +size 163865 diff --git a/skills/agent-memes/memes/wow/whoa.gif b/skills/agent-memes/memes/wow/whoa.gif new file mode 100644 index 0000000..027b7a3 --- /dev/null +++ b/skills/agent-memes/memes/wow/whoa.gif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2649a9720a61f8f1a8858c7c46ce002eea810d7f286f0861d9b662b7041c6a3e +size 669537 diff --git a/skills/agent-memes/scripts/discord-send-image.sh b/skills/agent-memes/scripts/discord-send-image.sh new file mode 100755 index 0000000..ab524aa --- /dev/null +++ b/skills/agent-memes/scripts/discord-send-image.sh @@ -0,0 +1,53 @@ +#!/bin/bash +# Usage: discord-send-image.sh [caption] +# Fast Discord image send via curl, bypassing OpenClaw CLI startup overhead. +# +# Env vars (all optional): +# DISCORD_BOT_TOKEN - bot token (preferred, avoids reading openclaw.json) +# DISCORD_ACCOUNT - account name in openclaw.json (fallback if no DISCORD_BOT_TOKEN) +# DISCORD_PROXY - proxy URL for curl, e.g. socks5h://127.0.0.1:1080 (default: none) + +set -euo pipefail + +CHANNEL_ID="${1:?Usage: discord-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +ACCOUNT="${DISCORD_ACCOUNT:-}" + +# Read bot token: env var preferred, fallback to openclaw config +if [ -n "${DISCORD_BOT_TOKEN:-}" ]; then + TOKEN="$DISCORD_BOT_TOKEN" +else + TOKEN=$(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const accts = c.channels?.discord?.accounts || {}; +const name = '${ACCOUNT}' || Object.keys(accts)[0] || ''; +const token = accts[name]?.token || ''; +if (!token) { console.error('No token found. Set DISCORD_BOT_TOKEN env var or configure openclaw.json'); process.exit(1); } +console.log(token); +") +fi + +CURL_ARGS=( + -s + --max-time 15 + -H "Authorization: Bot $TOKEN" + -F "files[0]=@${IMAGE_PATH}" +) + +# Add proxy if configured +PROXY="${DISCORD_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +if [ -n "$PROXY" ]; then + CURL_ARGS+=(-x "$PROXY") +fi + +if [ -n "$CAPTION" ]; then + CURL_ARGS+=(-F "payload_json={\"content\":\"${CAPTION}\"}") +fi + +RESULT=$(curl "${CURL_ARGS[@]}" "https://discord.com/api/v10/channels/${CHANNEL_ID}/messages") + +MSG_ID=$(echo "$RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.id)console.log('Sent! Message ID: '+r.id);else{console.error(JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})") + +echo "$MSG_ID" diff --git a/skills/agent-memes/scripts/feishu-send-image.mjs b/skills/agent-memes/scripts/feishu-send-image.mjs new file mode 100644 index 0000000..ea1e21b --- /dev/null +++ b/skills/agent-memes/scripts/feishu-send-image.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +// Usage: node scripts/feishu-send-image.mjs +// target: "user:open_id_xxx" or "oc_xxx" (chat_id) + +import { readFileSync, writeFileSync, existsSync } from 'fs'; +import { resolve } from 'path'; +import { homedir } from 'os'; + +const API = 'https://open.feishu.cn/open-apis'; +const TOKEN_CACHE = '/tmp/feishu-token.json'; + +const [target, imagePath] = process.argv.slice(2); +if (!target || !imagePath) { + console.error('Usage: node scripts/feishu-send-image.mjs '); + process.exit(1); +} + +// --- credentials (env vars preferred, fallback to openclaw.json) --- +let appId = process.env.FEISHU_APP_ID; +let appSecret = process.env.FEISHU_APP_SECRET; + +if (!appId || !appSecret) { + try { + const configPath = resolve(homedir(), '.openclaw/openclaw.json'); + const config = JSON.parse(readFileSync(configPath, 'utf8')); + const accounts = config.channels?.feishu?.accounts ?? {}; + const acctName = process.env.FEISHU_ACCOUNT || Object.keys(accounts)[0]; + const acct = accounts[acctName]; + appId = acct?.appId; + appSecret = acct?.appSecret; + } catch {} +} +if (!appId || !appSecret) { + console.error('Missing credentials. Set FEISHU_APP_ID + FEISHU_APP_SECRET env vars, or configure ~/.openclaw/openclaw.json'); + process.exit(1); +} + +// --- tenant_access_token (cached) --- +async function getToken() { + if (existsSync(TOKEN_CACHE)) { + try { + const cached = JSON.parse(readFileSync(TOKEN_CACHE, 'utf8')); + if (cached.token && cached.expiresAt > Date.now() + 60_000) return cached.token; + } catch {} + } + const res = await fetch(`${API}/auth/v3/tenant_access_token/internal`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ app_id: appId, app_secret: appSecret }), + }); + const data = await res.json(); + if (data.code !== 0) throw new Error(`token error: ${data.msg}`); + const token = data.tenant_access_token; + writeFileSync(TOKEN_CACHE, JSON.stringify({ token, expiresAt: Date.now() + data.expire * 1000 })); + return token; +} + +// --- upload image --- +async function uploadImage(token, filePath) { + const absPath = resolve(filePath); + const bytes = readFileSync(absPath); + const blob = new Blob([bytes]); + const form = new FormData(); + form.append('image_type', 'message'); + form.append('image', blob, absPath.split('/').pop()); + const res = await fetch(`${API}/im/v1/images`, { + method: 'POST', + headers: { Authorization: `Bearer ${token}` }, + body: form, + }); + const data = await res.json(); + if (data.code !== 0) throw new Error(`upload error: ${data.code} ${data.msg}`); + return data.data.image_key; +} + +// --- send message --- +async function sendImage(token, target, imageKey) { + let receiveIdType, receiveId; + if (target.startsWith('user:')) { + receiveIdType = 'open_id'; + receiveId = target.slice(5); + } else { + receiveIdType = 'chat_id'; + receiveId = target; + } + const res = await fetch(`${API}/im/v1/messages?receive_id_type=${receiveIdType}`, { + method: 'POST', + headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }, + body: JSON.stringify({ receive_id: receiveId, msg_type: 'image', content: JSON.stringify({ image_key: imageKey }) }), + }); + const data = await res.json(); + if (data.code !== 0) throw new Error(`send error: ${data.code} ${data.msg}`); + return data.data.message_id; +} + +// --- main --- +try { + const token = await getToken(); + console.log('token ok'); + const imageKey = await uploadImage(token, imagePath); + console.log('uploaded:', imageKey); + const msgId = await sendImage(token, target, imageKey); + console.log('sent:', msgId); +} catch (e) { + console.error(e.message); + process.exit(1); +} diff --git a/skills/agent-memes/scripts/line-send-image.sh b/skills/agent-memes/scripts/line-send-image.sh new file mode 100755 index 0000000..07fbc87 --- /dev/null +++ b/skills/agent-memes/scripts/line-send-image.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Usage: line-send-image.sh [caption] +# Send an image via LINE Messaging API (push message). +# +# LINE image messages require publicly accessible URLs (originalContentUrl + previewImageUrl). +# If you have a local file, upload it to a public URL first (e.g. imgur, S3, etc.). +# +# Env vars (all optional): +# LINE_CHANNEL_ACCESS_TOKEN - channel access token (preferred) +# LINE_ACCOUNT - account name in openclaw.json (fallback) +# LINE_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +TARGET_ID="${1:?Usage: line-send-image.sh [caption]}" +IMAGE_URL="${2:?Missing image URL (must be a publicly accessible https URL)}" +CAPTION="${3:-}" + +# Validate URL +if [[ ! "$IMAGE_URL" =~ ^https?:// ]]; then + echo "Error: IMAGE_URL must be a publicly accessible http(s) URL." >&2 + echo "LINE does not support local file paths. Upload the image first." >&2 + exit 1 +fi + +ACCOUNT="${LINE_ACCOUNT:-}" + +# Read token: env var preferred, fallback to openclaw config +if [ -n "${LINE_CHANNEL_ACCESS_TOKEN:-}" ]; then + TOKEN="$LINE_CHANNEL_ACCESS_TOKEN" +else + TOKEN=$(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const accts = c.channels?.line?.accounts || {}; +const name = '${ACCOUNT}' || Object.keys(accts)[0] || ''; +const token = accts[name]?.channelAccessToken || accts[name]?.token || ''; +if (!token) { console.error('No token found. Set LINE_CHANNEL_ACCESS_TOKEN or configure openclaw.json channels.line'); process.exit(1); } +console.log(token); +") +fi + +# Build messages array +MESSAGES='[{"type":"image","originalContentUrl":"'"$IMAGE_URL"'","previewImageUrl":"'"$IMAGE_URL"'"}]' +if [ -n "$CAPTION" ]; then + MESSAGES='[{"type":"text","text":"'"$(echo "$CAPTION" | sed 's/"/\\"/g')"'"},{"type":"image","originalContentUrl":"'"$IMAGE_URL"'","previewImageUrl":"'"$IMAGE_URL"'"}]' +fi + +PAYLOAD=$(cat <&2 + exit 1 +fi + +echo "Sent!" diff --git a/skills/agent-memes/scripts/memes.sh b/skills/agent-memes/scripts/memes.sh new file mode 100755 index 0000000..3a158d4 --- /dev/null +++ b/skills/agent-memes/scripts/memes.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash +# memes - Agent meme library manager with multi-platform send +set -euo pipefail + +MEMES_DIR="${MEMES_DIR:-$HOME/.openclaw/workspace/memes}" +# Load config file if present (sets defaults for MEMES_DEFAULT_*, OPENCLAW_CHANNEL, etc.) +MEMES_CONFIG="${MEMES_CONFIG:-$HOME/.config/memes/config}" +[[ -f "$MEMES_CONFIG" ]] && source "$MEMES_CONFIG" +# Also check legacy location +[[ -f "$HOME/.memesrc" ]] && source "$HOME/.memesrc" +# Auto-detect scripts dir: same directory as this script, or override with MEMES_SCRIPTS +SCRIPTS_DIR="${MEMES_SCRIPTS:-$(cd "$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")")/.." 2>/dev/null && pwd)/scripts}" +[[ ! -d "$SCRIPTS_DIR" ]] && SCRIPTS_DIR="$(dirname "$(readlink -f "$0" 2>/dev/null || echo "$0")")" + +usage() { + cat < [args] + +Commands: + pick Randomly pick a meme, print its path + list List all memes in a category + random Pick from any category at random + send [caption] [--to target] [--channel platform] [--account name] + categories List all categories with counts + +Platforms with fast send: discord, feishu, telegram +Other platforms fall back to: openclaw message send + +Examples: + memes send happy "好开心!" --to # → Discord + memes send facepalm --to channel:1491636222853124176 # → Discord #work + memes send feishu cute-animals "看!" --to user:xxx # → Feishu + memes send telegram wow --to 12345678 # → Telegram +EOF + exit 1 +} + +cmd_categories() { + [[ ! -d "$MEMES_DIR" ]] && { echo "Error: Meme library not found at $MEMES_DIR" >&2; exit 1; } + for dir in "$MEMES_DIR"/*/; do + [[ -d "$dir" ]] || continue + name=$(basename "$dir"); [[ "$name" == .* ]] && continue + count=$(find "$dir" -maxdepth 1 -type f \( -name '*.gif' -o -name '*.jpg' -o -name '*.png' -o -name '*.webp' \) 2>/dev/null | wc -l) + printf "%-20s %d\n" "$name" "$count" + done | sort +} + +cmd_pick() { + local category="${1:-}" + [[ -z "$category" ]] && { echo "Usage: memes pick " >&2; exit 1; } + # Alias mapping (Chinese/common names → folder names) + declare -A ALIASES=( + [哇]=wow [惊讶]=wow [surprised]=wow + [开心]=happy [高兴]=happy [庆祝]=happy [celebrate]=happy + [无语]=facepalm [晕]=facepalm [服了]=facepalm + [加油]=encourage [鼓励]=encourage + [可爱]=cute-animals [萌]=cute-animals [猫]=cute-animals + [难过]=sad [伤心]=sad + [累]=tired [困]=tired + [爱]=love [喜欢]=love + [谢谢]=thanks [感谢]=thanks + [想]=thinking [思考]=thinking [嗯]=thinking + [慌]=panic [急]=panic + [早]=greeting-morning [早安]=greeting-morning + [晚安]=greeting-night [晚]=greeting-night + [你好]=greeting-hello [hi]=greeting-hello [hello]=greeting-hello + [再见]=greeting-bye [拜]=greeting-bye [bye]=greeting-bye + [赞]=approve [好]=approve + [debug]=debug-mood [bug]=debug-mood + [迷惑]=confused [懵]=confused + [摊手]=shrug [无奈]=shrug [没办法]=shrug [随便]=shrug + [干活]=working [忙]=working [在搞]=working [coding]=working + ) + category="${ALIASES[$category]:-$category}" + local dir="$MEMES_DIR/$category" + [[ ! -d "$dir" ]] && { echo "Error: Category '$category' not found. Run 'memes categories' for list." >&2; exit 1; } + local files=() + while IFS= read -r f; do files+=("$f"); done < <(find "$dir" -maxdepth 1 -type f \( -name '*.gif' -o -name '*.jpg' -o -name '*.png' -o -name '*.webp' \) 2>/dev/null) + [[ ${#files[@]} -eq 0 ]] && { echo "Error: No memes in '$category'" >&2; exit 1; } + echo "${files[$((RANDOM % ${#files[@]}))]}" +} + +cmd_list() { + local category="${1:-}" + [[ -z "$category" ]] && { echo "Usage: memes list " >&2; exit 1; } + local dir="$MEMES_DIR/$category" + [[ ! -d "$dir" ]] && { echo "Error: Category '$category' not found." >&2; exit 1; } + find "$dir" -maxdepth 1 -type f \( -name '*.gif' -o -name '*.jpg' -o -name '*.png' -o -name '*.webp' \) 2>/dev/null | sort +} + +cmd_random() { + local cats=() + for dir in "$MEMES_DIR"/*/; do + [[ -d "$dir" ]] || continue + local name=$(basename "$dir"); [[ "$name" == .* ]] && continue + cats+=("$name") + done + [[ ${#cats[@]} -eq 0 ]] && { echo "Error: No categories found" >&2; exit 1; } + local cat="${cats[$((RANDOM % ${#cats[@]}))]}" + cmd_pick "$cat" +} + +cmd_send() { + local category="" caption="" to="" channel="${OPENCLAW_CHANNEL:-discord}" account="" + # Detect platform as first arg (overrides env default) + [[ "${1:-}" =~ ^(discord|feishu|telegram|whatsapp|slack|line|qq|wechat)$ ]] && { channel="$1"; shift; } + while [[ $# -gt 0 ]]; do + case "$1" in + --category|-c) category="$2"; shift 2 ;; + --caption|-m) caption="$2"; shift 2 ;; + --to|-t) to="$2"; shift 2 ;; + --channel) channel="$2"; shift 2 ;; + --account|-a) account="$2"; shift 2 ;; + *) if [[ -z "$category" ]]; then category="$1"; else caption="${caption:+$caption }$1"; fi; shift ;; + esac + done + [[ -z "$category" ]] && { echo "Usage: memes send [caption] [--to target] [--channel platform]" >&2; exit 1; } + + local meme_path; meme_path=$(cmd_pick "$category") + + # Try platform-specific fast script first, fall back to openclaw CLI + case "$channel" in + discord) + local script="$SCRIPTS_DIR/discord-send-image.sh" + local target="${to#channel:}" + if [[ -z "$target" ]]; then + target="${MEMES_DEFAULT_CHANNEL:-}" + [[ -z "$target" ]] && { echo "Error: --to required (or set MEMES_DEFAULT_CHANNEL)" >&2; exit 1; } + fi + if [[ -x "$script" ]]; then + bash "$script" "$target" "$meme_path" "$caption" + else + _send_openclaw "$meme_path" "$caption" "$to" "$channel" "$account" + fi + ;; + feishu) + local script="$SCRIPTS_DIR/feishu-send-image.mjs" + local target="${to:-${MEMES_DEFAULT_FEISHU:-}}" + [[ -z "$target" ]] && { echo "Error: --to required (or set MEMES_DEFAULT_FEISHU)" >&2; exit 1; } + if [[ -f "$script" ]]; then + node "$script" "$target" "$meme_path" ${caption:+"$caption"} + else + _send_openclaw "$meme_path" "$caption" "$to" "feishu" "$account" + fi + ;; + telegram) + local script="$SCRIPTS_DIR/telegram-send-image.sh" + local target="${to:-${MEMES_DEFAULT_TELEGRAM:-}}" + [[ -z "$target" ]] && { echo "Error: --to required (or set MEMES_DEFAULT_TELEGRAM)" >&2; exit 1; } + if [[ -x "$script" ]]; then + bash "$script" "$target" "$meme_path" "$caption" + else + _send_openclaw "$meme_path" "$caption" "$to" "telegram" "$account" + fi + ;; + *) + local script="$SCRIPTS_DIR/${channel}-send-image.sh" + if [[ -x "$script" ]]; then + bash "$script" "${to:-}" "$meme_path" "$caption" + else + _send_openclaw "$meme_path" "$caption" "$to" "$channel" "$account" + fi + ;; + esac + + echo "$meme_path" +} + +_send_openclaw() { + local meme_path="$1" caption="$2" to="$3" channel="$4" account="$5" + local cmd="cd $HOME/repo/openclaw && node scripts/run-node.mjs message send" + cmd+=" --channel $channel" + [[ -n "$account" ]] && cmd+=" --account $account" + [[ -n "$to" ]] && cmd+=" --target \"$to\"" + cmd+=" --media \"$meme_path\"" + [[ -n "$caption" ]] && cmd+=" --message \"$caption\"" + eval "$cmd" 2>&1 +} + +[[ $# -lt 1 ]] && usage +case "$1" in + pick) shift; cmd_pick "$@" ;; + list) shift; cmd_list "$@" ;; + random) cmd_random ;; + send) shift; cmd_send "$@" ;; + categories) cmd_categories ;; + -h|--help) usage ;; + *) echo "Unknown command: $1" >&2; usage ;; +esac diff --git a/skills/agent-memes/scripts/qq-send-image.sh b/skills/agent-memes/scripts/qq-send-image.sh new file mode 100755 index 0000000..cfbd3d7 --- /dev/null +++ b/skills/agent-memes/scripts/qq-send-image.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Usage: qq-send-image.sh [caption] +# QQ Bot API image send via curl. +# +# Env vars (all optional): +# QQ_BOT_TOKEN - bot token (preferred, avoids reading openclaw.json) +# QQ_BOT_APPID - bot app ID (preferred) +# QQ_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +CHANNEL_ID="${1:?Usage: qq-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +if [ -n "${QQ_BOT_TOKEN:-}" ]; then + TOKEN="$QQ_BOT_TOKEN" + APPID="${QQ_BOT_APPID:?QQ_BOT_APPID is required when using QQ_BOT_TOKEN}" +else + read -r TOKEN APPID < <(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const q=c.channels?.qqbot||c.channels?.qq||{}; +const t=q.token||'';const a=q.appId||q.app_id||''; +if(!t||!a){console.error('Set QQ_BOT_TOKEN+QQ_BOT_APPID or configure openclaw.json channels.qqbot');process.exit(1)} +console.log(t+' '+a); +") +fi + +PROXY="${QQ_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +PROXY_ARGS=() +if [ -n "$PROXY" ]; then + PROXY_ARGS=(-x "$PROXY") +fi + +CURL_ARGS=( + -s + --max-time 30 + -H "Authorization: Bot ${APPID}.${TOKEN}" + -F "msg_id=0" + -F "file_image=@${IMAGE_PATH}" +) + +if [ -n "$CAPTION" ]; then + CURL_ARGS+=(-F "content=${CAPTION}") +fi + +RESULT=$(curl "${CURL_ARGS[@]}" "${PROXY_ARGS[@]}" \ + "https://api.sgroup.qq.com/channels/${CHANNEL_ID}/messages") + +echo "$RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.id)console.log('Sent! Message ID: '+r.id);else{console.error(r.message||JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})" diff --git a/skills/agent-memes/scripts/setup.sh b/skills/agent-memes/scripts/setup.sh new file mode 100755 index 0000000..939453c --- /dev/null +++ b/skills/agent-memes/scripts/setup.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Auto-setup: clone or update meme repo into workspace +set -e + +MEME_DIR="${OPENCLAW_WORKSPACE:-$HOME/.openclaw/workspace}/memes" + +if [ -d "$MEME_DIR/.git" ]; then + echo "📦 Updating memes..." + cd "$MEME_DIR" && git pull --ff-only +else + echo "📦 Cloning meme repo..." + git clone https://github.com/kagura-agent/memes "$MEME_DIR" +fi + +echo "✅ Memes ready at $MEME_DIR ($(find "$MEME_DIR" -type f \( -name '*.gif' -o -name '*.jpg' -o -name '*.png' -o -name '*.webp' \) | wc -l) files)" + +# Install feishu-send-image.mjs for fast direct-API sending (~2s vs ~15s CLI) +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +TARGET_DIR="${OPENCLAW_WORKSPACE:-$HOME/.openclaw/workspace}/scripts" +mkdir -p "$TARGET_DIR" +if [ -f "$SCRIPT_DIR/feishu-send-image.mjs" ]; then + cp "$SCRIPT_DIR/feishu-send-image.mjs" "$TARGET_DIR/feishu-send-image.mjs" + echo "✅ Feishu quick-send script installed at $TARGET_DIR/feishu-send-image.mjs" +fi diff --git a/skills/agent-memes/scripts/slack-send-image.sh b/skills/agent-memes/scripts/slack-send-image.sh new file mode 100755 index 0000000..55b4461 --- /dev/null +++ b/skills/agent-memes/scripts/slack-send-image.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Usage: slack-send-image.sh [caption] +# Slack image send via files.upload v2 API (curl). +# +# Env vars (all optional): +# SLACK_BOT_TOKEN - bot token (preferred, avoids reading openclaw.json) +# SLACK_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +CHANNEL_ID="${1:?Usage: slack-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +if [ -n "${SLACK_BOT_TOKEN:-}" ]; then + TOKEN="$SLACK_BOT_TOKEN" +else + TOKEN=$(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const accts=c.channels?.slack?.accounts||{}; +const name=Object.keys(accts)[0]||''; +const t=accts[name]?.token||''; +if(!t){console.error('No token found. Set SLACK_BOT_TOKEN or configure openclaw.json channels.slack');process.exit(1)} +console.log(t); +") +fi + +PROXY="${SLACK_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +PROXY_ARGS=() +if [ -n "$PROXY" ]; then + PROXY_ARGS=(-x "$PROXY") +fi + +FILENAME=$(basename "$IMAGE_PATH") +FILESIZE=$(stat -c%s "$IMAGE_PATH" 2>/dev/null || stat -f%z "$IMAGE_PATH") + +# Step 1: Get upload URL +UPLOAD=$(curl -s --max-time 15 "${PROXY_ARGS[@]}" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json; charset=utf-8" \ + -d "{\"filename\":\"${FILENAME}\",\"length\":${FILESIZE}}" \ + "https://slack.com/api/files.getUploadURLExternal") + +UPLOAD_URL=$(echo "$UPLOAD" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);if(!r.ok){console.error(r.error||JSON.stringify(r));process.exit(1)}console.log(r.upload_url)})") +FILE_ID=$(echo "$UPLOAD" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);console.log(r.file_id)})") + +# Step 2: Upload file content +curl -s --max-time 30 "${PROXY_ARGS[@]}" \ + -F "file=@${IMAGE_PATH}" \ + "$UPLOAD_URL" > /dev/null + +# Step 3: Complete upload and share to channel +CHANNEL_JSON="{\"id\":\"${CHANNEL_ID}\"}" +COMPLETE=$(curl -s --max-time 15 "${PROXY_ARGS[@]}" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json; charset=utf-8" \ + -d "{\"files\":[{\"id\":\"${FILE_ID}\",\"title\":\"${CAPTION:-${FILENAME}}\"}],\"channel_id\":\"${CHANNEL_ID}\",\"initial_comment\":\"${CAPTION:-}\"}" \ + "https://slack.com/api/files.completeUploadExternal") + +echo "$COMPLETE" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.ok)console.log('Sent! File ID: ${FILE_ID}');else{console.error(r.error||JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})" diff --git a/skills/agent-memes/scripts/telegram-send-image.sh b/skills/agent-memes/scripts/telegram-send-image.sh new file mode 100755 index 0000000..a7d8539 --- /dev/null +++ b/skills/agent-memes/scripts/telegram-send-image.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Usage: telegram-send-image.sh [caption] +# Fast Telegram image send via curl. +# +# Env vars (all optional): +# TELEGRAM_BOT_TOKEN - bot token (preferred, avoids reading openclaw.json) +# TELEGRAM_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +CHAT_ID="${1:?Usage: telegram-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +if [ -n "${TELEGRAM_BOT_TOKEN:-}" ]; then + TOKEN="$TELEGRAM_BOT_TOKEN" +else + TOKEN=$(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const t=c.channels?.telegram?.botToken||c.channels?.telegram?.token||c.channels?.telegram?.accounts?.[Object.keys(c.channels.telegram.accounts)[0]]?.token||''; +if(!t){console.error('No token found. Set TELEGRAM_BOT_TOKEN or configure openclaw.json channels.telegram');process.exit(1)} +console.log(t); +") +fi + +# Detect if GIF → use sendAnimation, otherwise sendPhoto +EXT="${IMAGE_PATH##*.}" +if [[ "${EXT,,}" == "gif" ]]; then + API_METHOD="sendAnimation" + FILE_FIELD="animation" +else + API_METHOD="sendPhoto" + FILE_FIELD="photo" +fi + +CURL_ARGS=( + -s + --max-time 30 + -F "chat_id=${CHAT_ID}" + -F "${FILE_FIELD}=@${IMAGE_PATH}" +) + +if [ -n "$CAPTION" ]; then + CURL_ARGS+=(-F "caption=${CAPTION}") +fi + +PROXY="${TELEGRAM_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +if [ -n "$PROXY" ]; then + CURL_ARGS+=(-x "$PROXY") +fi + +RESULT=$(curl "${CURL_ARGS[@]}" "https://api.telegram.org/bot${TOKEN}/${API_METHOD}") + +echo "$RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.ok)console.log('Sent! Message ID: '+r.result.message_id);else{console.error(r.description||JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})" diff --git a/skills/agent-memes/scripts/wechat-send-image.sh b/skills/agent-memes/scripts/wechat-send-image.sh new file mode 100755 index 0000000..e82e673 --- /dev/null +++ b/skills/agent-memes/scripts/wechat-send-image.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# Usage: wechat-send-image.sh [caption] +# 企业微信 (WeCom) image send via curl (two-step: upload media, then send). +# is a userid or @all. +# +# Env vars (all optional): +# WECHAT_CORP_ID - corp ID (preferred) +# WECHAT_CORP_SECRET - corp secret (preferred) +# WECHAT_AGENT_ID - agent ID (preferred, or reads from openclaw.json) +# WECHAT_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +TARGET="${1:?Usage: wechat-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +if [ -n "${WECHAT_CORP_ID:-}" ] && [ -n "${WECHAT_CORP_SECRET:-}" ]; then + CORP_ID="$WECHAT_CORP_ID" + CORP_SECRET="$WECHAT_CORP_SECRET" + AGENT_ID="${WECHAT_AGENT_ID:-}" +else + read -r CORP_ID CORP_SECRET AGENT_ID < <(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const w=c.channels?.wechat||c.channels?.wecom||{}; +const id=w.corpId||w.corp_id||'';const s=w.corpSecret||w.corp_secret||'';const a=w.agentId||w.agent_id||''; +if(!id||!s){console.error('Set WECHAT_CORP_ID+WECHAT_CORP_SECRET or configure openclaw.json channels.wechat');process.exit(1)} +console.log(id+' '+s+' '+a); +") +fi + +PROXY="${WECHAT_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +PROXY_ARGS=() +if [ -n "$PROXY" ]; then + PROXY_ARGS=(-x "$PROXY") +fi + +# Step 1: Get access token +TOKEN_RESULT=$(curl -s --max-time 10 "${PROXY_ARGS[@]}" \ + "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${CORP_ID}&corpsecret=${CORP_SECRET}") + +ACCESS_TOKEN=$(echo "$TOKEN_RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);if(r.errcode!==0){console.error(r.errmsg||JSON.stringify(r));process.exit(1)}console.log(r.access_token)})") + +# Step 2: Upload media +UPLOAD=$(curl -s --max-time 30 "${PROXY_ARGS[@]}" \ + -F "media=@${IMAGE_PATH}" \ + "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=${ACCESS_TOKEN}&type=image") + +MEDIA_ID=$(echo "$UPLOAD" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);if(r.errcode!==0){console.error(r.errmsg||JSON.stringify(r));process.exit(1)}console.log(r.media_id)})") + +# Step 3: Send image message +BODY="{\"touser\":\"${TARGET}\",\"msgtype\":\"image\",\"image\":{\"media_id\":\"${MEDIA_ID}\"}}" +if [ -n "$AGENT_ID" ]; then + BODY=$(echo "$BODY" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);r.agentid=Number('${AGENT_ID}');console.log(JSON.stringify(r))})") +fi + +RESULT=$(curl -s --max-time 15 "${PROXY_ARGS[@]}" \ + -H "Content-Type: application/json" \ + -d "$BODY" \ + "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${ACCESS_TOKEN}") + +echo "$RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.errcode===0)console.log('Sent! msgid: '+r.msgid);else{console.error(r.errmsg||JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})" + +# Note: WeCom doesn't support captions on image messages natively. +# If caption is provided, send a follow-up text message. +if [ -n "$CAPTION" ]; then + TEXT_BODY="{\"touser\":\"${TARGET}\",\"msgtype\":\"text\",\"text\":{\"content\":\"${CAPTION}\"}}" + if [ -n "$AGENT_ID" ]; then + TEXT_BODY=$(echo "$TEXT_BODY" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);r.agentid=Number('${AGENT_ID}');console.log(JSON.stringify(r))})") + fi + curl -s --max-time 15 "${PROXY_ARGS[@]}" \ + -H "Content-Type: application/json" \ + -d "$TEXT_BODY" \ + "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${ACCESS_TOKEN}" > /dev/null +fi diff --git a/skills/agent-memes/scripts/whatsapp-send-image.sh b/skills/agent-memes/scripts/whatsapp-send-image.sh new file mode 100755 index 0000000..ecd1842 --- /dev/null +++ b/skills/agent-memes/scripts/whatsapp-send-image.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Usage: whatsapp-send-image.sh [caption] +# WhatsApp Cloud API image send via curl (two-step: upload media, then send). +# +# Env vars (all optional): +# WHATSAPP_TOKEN - access token (preferred) +# WHATSAPP_PHONE_ID - phone number ID (preferred) +# WHATSAPP_PROXY - proxy URL for curl (default: none) + +set -euo pipefail + +RECIPIENT="${1:?Usage: whatsapp-send-image.sh [caption]}" +IMAGE_PATH="${2:?Missing image path}" +CAPTION="${3:-}" + +if [ -n "${WHATSAPP_TOKEN:-}" ]; then + TOKEN="$WHATSAPP_TOKEN" + PHONE_ID="${WHATSAPP_PHONE_ID:?WHATSAPP_PHONE_ID is required when using WHATSAPP_TOKEN}" +else + read -r TOKEN PHONE_ID < <(node -e " +const c=JSON.parse(require('fs').readFileSync(require('os').homedir()+'/.openclaw/openclaw.json','utf8')); +const w=c.channels?.whatsapp||{}; +const t=w.token||'';const p=w.phoneId||w.phone_id||''; +if(!t||!p){console.error('Set WHATSAPP_TOKEN+WHATSAPP_PHONE_ID or configure openclaw.json channels.whatsapp');process.exit(1)} +console.log(t+' '+p); +") +fi + +PROXY="${WHATSAPP_PROXY:-${https_proxy:-${HTTPS_PROXY:-}}}" +PROXY_ARGS=() +if [ -n "$PROXY" ]; then + PROXY_ARGS=(-x "$PROXY") +fi + +MIME=$(file -b --mime-type "$IMAGE_PATH") + +# Step 1: Upload media +UPLOAD=$(curl -s --max-time 30 "${PROXY_ARGS[@]}" \ + -H "Authorization: Bearer $TOKEN" \ + -F "file=@${IMAGE_PATH};type=${MIME}" \ + -F "messaging_product=whatsapp" \ + -F "type=image" \ + "https://graph.facebook.com/v21.0/${PHONE_ID}/media") + +MEDIA_ID=$(echo "$UPLOAD" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{const r=JSON.parse(d);if(r.id)console.log(r.id);else{console.error(r.error?.message||JSON.stringify(r));process.exit(1)}})") + +# Step 2: Send message +BODY="{\"messaging_product\":\"whatsapp\",\"to\":\"${RECIPIENT}\",\"type\":\"image\",\"image\":{\"id\":\"${MEDIA_ID}\"" +if [ -n "$CAPTION" ]; then + BODY+=",\"caption\":\"${CAPTION}\"" +fi +BODY+="}}" + +RESULT=$(curl -s --max-time 15 "${PROXY_ARGS[@]}" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d "$BODY" \ + "https://graph.facebook.com/v21.0/${PHONE_ID}/messages") + +echo "$RESULT" | node -e "let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{const r=JSON.parse(d);if(r.messages?.[0]?.id)console.log('Sent! Message ID: '+r.messages[0].id);else{console.error(r.error?.message||JSON.stringify(r));process.exit(1)}}catch{console.error(d);process.exit(1)}})" diff --git a/skills/coding-workflow/SKILL.md b/skills/coding-workflow/SKILL.md new file mode 100644 index 0000000..5cdca28 --- /dev/null +++ b/skills/coding-workflow/SKILL.md @@ -0,0 +1,188 @@ +--- +name: coding-workflow +version: 1.0.0 +description: > + Standard coding workflow for all squads. Enforces: Issue-driven development, + coordinator never writes code, Cursor Agent as primary coding tool, Git branch + conventions, build verification, and deployment procedures. Load this skill + when doing any code development work to ensure consistent practices across + NEKO / KUMA / RAKU / SORA squads. +metadata: + requiredBinaries: ["cursor-agent", "gh"] +--- + +# Coding Workflow + +Standard development workflow for all squads. **This is not a suggestion — follow it.** + +## Core Principles + +1. **Issue first** — Every change has a GitHub Issue +2. **Coordinator never codes** — Spawn subagent or use Cursor Agent +3. **Cursor Agent is the primary coding tool** — Zero API cost +4. **Build before deploy** — `npm run build` must pass +5. **Track everything** — Issue updated with fix info, commit links to Issue + +## Flow + +``` +Need/Bug → Open Issue → Analyze & plan → Spawn subagent or Cursor → +Verify (build + diff) → Commit (closes #N) → Merge to main → Deploy → +Update Issue with fix info +``` + +## Step 1: Open Issue + +Before writing any code, ensure there's an Issue. + +```bash +gh issue create --title "Bug: description" --body "## Problem\n...\n## Fix\n...\n## Acceptance\n..." +``` + +If an Issue already exists, add your analysis as a comment: + +```bash +gh issue comment --body "## Analysis\n..." +``` + +## Step 2: Create Branch + +```bash +git checkout main && git pull +git checkout -b fix/descriptive-name # for fixes +git checkout -b feat/descriptive-name # for features +``` + +## Step 3: Write Code with Cursor Agent + +**Never write code as the coordinator.** Use Cursor Agent CLI. + +### Spawning coding subagents + +When spawning a subagent for a coding task, **always inject the relevant skills into the task prompt**: + +``` +Read the skill at ~/.openclaw/workspace/skills/coding-workflow/SKILL.md and follow it. +Read the skill at ~/.openclaw/workspace/skills/cursor-agent/SKILL.md for Cursor CLI usage. + +## Task +... +``` + +This ensures every subagent follows the same workflow — Issue tracking, Cursor model selection, build verification, commit conventions. **Do not assume subagents know the workflow without explicit skill injection.** + +### Choose model by task difficulty + +| Difficulty | Model | When to use | +|------------|-------|-------------| +| 🟢 Simple / 🟡 Standard | `auto` | One-line fix, typo, bug fix, feature, refactor, review — Cursor auto-select is smarter and cheaper than manually picking a mid-tier model | +| 🔴 Complex | `claude-opus-4-7-thinking-high` | Architecture, multi-file refactor, design, complex debugging | + +### Two-step workflow (recommended) + +```bash +# Step A: Review first (read-only, no file changes) +cursor-agent -p "" \ + --model auto --mode=ask --output-format text --trust + +# Step B: Apply changes (after reviewing the plan) +cursor-agent -p "" \ + --model auto --force --output-format text --trust +``` + +For straightforward tasks with a clear plan, skip Step A and go directly to `--force`. + +### Alternative: Spawn subagent + +For tasks that need multiple steps or file reads before coding: + +``` +sessions_spawn with: +- Clear task description +- Acceptance criteria +- Which files to modify +- What NOT to change +``` + +## Step 4: Verify + +**Every change must pass these checks before commit:** + +1. **Build passes:** + ```bash + npm run build # or the project's build command + ``` + +2. **Diff is clean:** + ```bash + git diff --stat # check scope + git diff # review actual changes + ``` + +3. **No unintended changes** — only the files you meant to modify + +## Step 5: Commit & Merge + +```bash +# Commit (Cursor sandbox blocks git, so always commit manually) +git add -A +git commit -m "fix: description of change (closes #N)" + +# Merge to main +git checkout main +git merge --no-ff -m "fix: description (closes #N)" +git push origin main +``` + +### Commit message format + +``` +type: short description (closes #N) +``` + +Types: `feat:` `fix:` `docs:` `refactor:` `chore:` + +## Step 6: Deploy + +```bash +# For Cloudflare Workers (Uncaged) +export CLOUDFLARE_API_TOKEN=$(secret get CLOUDFLARE_API_TOKEN | head -1 | tr -d '\n') +npx wrangler deploy --config packages/worker/wrangler.toml +``` + +Verify the deployment version ID and test in browser/Telegram. + +## Step 7: Update Issue + +If commit message has `closes #N`, the Issue auto-closes on push. +Add a comment with fix details: + +```bash +gh issue comment --body "## Fixed ✅\nCommit: \nDeploy: \n\n— 署名" +``` + +## PR Review (Cross-Squad) + +When reviewing PRs from other squads: + +```bash +# Review and approve +gh pr review --approve --body "LGTM ✅ reason" + +# Or request changes +gh pr review --request-changes --body "Need to fix: ..." + +# Merge (squash preferred) +gh pr merge --squash --delete-branch -t "type: description (#N)" +``` + +## Anti-Patterns ❌ + +| Don't | Do instead | +|-------|------------| +| Coordinator writes code | Spawn subagent or Cursor Agent | +| Skip Issue, just code | Open Issue first, even for small fixes | +| Deploy without build | Always `npm run build` before deploy | +| Huge PR with many changes | One Issue = one branch = one focused change | +| Forget to update Issue | Use `closes #N` in commit, add fix comment | +| Push without verifying | Check diff, build, then push | diff --git a/skills/cursor-agent-cn/SKILL.md b/skills/cursor-agent-cn/SKILL.md new file mode 100644 index 0000000..f42fb4f --- /dev/null +++ b/skills/cursor-agent-cn/SKILL.md @@ -0,0 +1,159 @@ +--- +name: cursor-agent-cn +version: 1.1.0 +description: > + Run Cursor Agent CLI for coding tasks in China region — writing, editing, + refactoring, reviewing, or planning code. Uses --model auto to work around + China-region model restrictions. Use when your machine is in mainland China + and you need Cursor Agent for coding tasks. +metadata: + requiredBinaries: ["cursor-agent"] +--- + +# Cursor Agent (China Region) + +Cursor Agent CLI runs on the user's Cursor subscription — zero API cost. +**This is the China-region variant** that uses `--model auto` to work around +server-side model availability restrictions. + +For non-China regions (where you can specify models directly), use the +`cursor-agent` skill instead. + +## Prerequisites + +**Required binary: `cursor-agent`** (or the alias `agent`) + +Install: — verify with `cursor-agent --version`. + +The helper script (`scripts/run.sh`) will exit with an error if neither `cursor-agent` +nor `agent` is found in PATH. + +## Authentication + +```bash +# Option 1: Environment variable +export CURSOR_API_KEY=crsr_xxxxxxxxxxxxxxxx + +# Option 2: Browser login (interactive) +cursor-agent login + +# Check status +cursor-agent status +``` + +## ⚠️ China Region: Model Availability + +> **Tested & confirmed in WSL (China mainland, April 2026)** + +Specifying a model like `--model claude-sonnet-4.6` or `--model gpt-5.4` will fail: + +``` +Model not available — This model provider doesn't serve your region +``` + +**Setting HTTP_PROXY / SOCKS5 does NOT help.** Cursor routes model selection on the +server side based on account region, not client IP. + +### Solution: `--model auto` + +Let Cursor pick whichever model is available in your region: + +```bash +cursor-agent -p "your task" --model auto --trust +``` + +Or simply omit `--model` — the default is `auto`. + +> **Trade-off:** `auto` may route to different models across runs, so output quality +> can vary. Use the two-step workflow below to review before applying changes. + +## Recommended Workflow: Ask First, Write Second + +Because `auto` mode picks an unpredictable model, always review before applying: + +### Step 1 — Read-only review (`ask` mode) + +```bash +cursor-agent -p "Review this code for bugs and suggest fixes" \ + --model auto --mode=ask --output-format text --trust +``` + +Inspect the output. If the suggestions look good, proceed to step 2. + +### Step 2 — Apply changes (`write` mode) + +```bash +cursor-agent -p "Fix the bugs identified above" \ + --model auto --force --output-format text --trust +``` + +## Headless Mode (Recommended for Automation) + +Pipe mode (`-p`) is more stable than ACP/interactive mode: + +```bash +cursor-agent -p "" --model auto --mode=ask --output-format text --trust +``` + +- Runs non-interactively, returns text output +- Best for subagent integration and scripted pipelines +- Avoids the "Connection stalled" issues seen in ACP/interactive mode + +## Command Quick Reference + +| Scenario | Command | +|----------|---------| +| Code review | `cursor-agent -p "Review..." --model auto --mode=ask --trust` | +| Write code / fix bug | `cursor-agent -p "Fix..." --model auto --force --trust` | +| Planning / design | `cursor-agent -p "Plan..." --model auto --mode=plan --trust` | +| Check version | `cursor-agent --version` | +| Check auth status | `cursor-agent status` | + +## Helper Script + +Use `scripts/run.sh` for standardized invocation: + +```bash +bash scripts/run.sh /path/to/repo "Review the auth module" auto ask +bash scripts/run.sh /path/to/repo "Fix the auth bug" auto write +TIMEOUT=300 bash scripts/run.sh /path/to/repo "Refactor utils" auto write +``` + +Arguments: ` [model] [mode]` +- `model`: `auto` (default) — always use `auto` in China region +- `mode`: `ask` (default, read-only) | `plan` | `write` (applies changes) + +## Git Rule + +Cursor's sandbox blocks `git commit`. After Cursor edits files, commit manually: + +```bash +git add -A && git commit -m "feat: description of changes" +``` + +Always review the diff before committing. + +## Known Issues + +| Issue | Details | +|-------|---------| +| Region-locked models | Server-side restriction; proxies don't help. Use `--model auto`. | +| Connection stalled | ACP/interactive mode may hang. Use headless `-p` mode instead. | +| Inconsistent output | `auto` may route to different models each run. Review before applying. | +| Sandbox git block | Cursor sandbox prevents `git commit`. Commit manually after edits. | + +## Gitea Integration + +Cursor Agent can access git.shazhou.work via the `tea` CLI (pre-configured login: xingyue). +Global rules at `~/.cursor/rules/gitea-access.mdc` teach it how to use `tea`. + +When assigning issue-related tasks, tell cursor to read the issue first: +``` +"Read issue #3 with `tea issues 3`, then implement the changes described." +``` + +## Context Tips + +- Add `@` in your prompt to include specific files in context +- Use `--continue` or `--resume` to continue a previous session +- `~/.cursor/rules/` contains global rules loaded for all projects (e.g. gitea-access) diff --git a/skills/cursor-agent-cn/scripts/run.sh b/skills/cursor-agent-cn/scripts/run.sh new file mode 100755 index 0000000..226a6f6 --- /dev/null +++ b/skills/cursor-agent-cn/scripts/run.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# cursor-agent/scripts/run.sh +# +# Standardized wrapper for Cursor Agent CLI. +# Defaults to --model auto (China-region safe) and read-only ask mode. +# +# Usage: +# run.sh [model] [mode] +# +# Arguments: +# repo_path — Path to the git repo to work in +# task — The prompt / task description +# model — auto (default) | sonnet-4.6 | opus-4.6-thinking | ... +# mode — ask (default, read-only) | plan (read-only) | write (applies changes) +# +# Environment: +# TIMEOUT — Max seconds to wait (optional, default: no limit) +# CURSOR_API_KEY — API key for authentication (optional if logged in) +# +# Examples: +# run.sh ./my-repo "Review the auth module" # ask mode, auto model +# run.sh ./my-repo "Fix the login bug" auto write # write mode, auto model +# TIMEOUT=300 run.sh ./my-repo "Refactor utils" auto write # with 5-min timeout +# +# Notes: +# - In China region, always use 'auto' model (default). Specifying Claude/GPT models +# will fail with "Model not available" — this is a server-side region restriction, +# not bypassable with HTTP_PROXY/SOCKS5. +# - Default mode is 'ask' (read-only). Only use 'write' after reviewing ask output. +# - Cursor sandbox blocks git commit. Commit manually after write mode. + +set -euo pipefail + +REPO="${1:?Error: repo path required. Usage: run.sh [model] [mode]}" +TASK="${2:?Error: task required. Usage: run.sh [model] [mode]}" +MODEL="${3:-auto}" +MODE="${4:-ask}" + +# --- Find the CLI binary --- +CURSOR_BIN="" +if command -v cursor-agent &>/dev/null; then + CURSOR_BIN="cursor-agent" +elif command -v agent &>/dev/null; then + CURSOR_BIN="agent" +else + echo "ERROR: Neither 'cursor-agent' nor 'agent' CLI found in PATH." >&2 + echo "Install from: https://cursor.com/docs/cli/overview" >&2 + exit 1 +fi + +# --- Enter repo --- +cd "$REPO" || { echo "ERROR: Cannot cd to $REPO" >&2; exit 1; } + +# --- Build arguments --- +ARGS=(-p "$TASK" --output-format text --trust) + +case "$MODE" in + write) + # Destructive — applies changes to files. + ARGS+=(--force) + ;; + plan) + ARGS+=(--mode=plan) + ;; + ask|*) + # Default: read-only, no file changes. + ARGS+=(--mode=ask) + ;; +esac + +if [ "$MODEL" != "auto" ]; then + ARGS+=(--model "$MODEL") +fi +# When model is 'auto', omit --model entirely (Cursor defaults to auto). + +# --- Execute (with optional timeout) --- +echo ">>> cursor-agent [$MODE] model=$MODEL repo=$REPO" +echo ">>> task: $TASK" +echo "---" + +if [ -n "${TIMEOUT:-}" ]; then + timeout "$TIMEOUT" "$CURSOR_BIN" "${ARGS[@]}" + EXIT_CODE=$? + if [ $EXIT_CODE -eq 124 ]; then + echo "ERROR: Timed out after ${TIMEOUT}s" >&2 + exit 124 + fi + exit $EXIT_CODE +else + exec "$CURSOR_BIN" "${ARGS[@]}" +fi diff --git a/skills/memex-zettelkasten/SKILL.md b/skills/memex-zettelkasten/SKILL.md new file mode 100644 index 0000000..d59adcc --- /dev/null +++ b/skills/memex-zettelkasten/SKILL.md @@ -0,0 +1,106 @@ +--- +name: memex-zettelkasten +description: > + Shared knowledge base using memex CLI (Zettelkasten atomic cards with bidirectional links). + Use when: (1) starting a task — recall related knowledge, (2) finishing a task — capture + non-obvious learnings, (3) asked to remember/note/record reusable technical knowledge, + (4) checking knowledge graph health, (5) searching past decisions or gotchas. + NOT for: personal preferences (use MEMORY.md), daily logs (use memory/*.md), + or human-facing docs (use OC Wiki). +--- + +# Memex Zettelkasten — Shared Knowledge Base + +Atomic cards with `[[bidirectional links]]` stored in `~/.memex/cards/`. +All agents share the same card store. Git sync available for cross-VM replication. + +## Core Workflow + +### Task Start → Recall + +```bash +memex search "" # full-text search +memex read # read specific card +memex links # see related cards +``` + +Search before working. If relevant cards exist, read them to avoid repeating mistakes. + +### Task End → Capture + +Only write cards for **non-obvious** learnings. Skip if the knowledge is trivial or well-documented. + +```bash +memex write << 'CARD' +--- +title: "Short Noun Phrase ≤60 chars" +created: "YYYY-MM-DD" +source: "openclaw-" +tags: [tag1, tag2] +category: "" +--- + +One atomic insight per card. Use [[other-slug]] for bidirectional links. +CARD +``` + +### Required Frontmatter + +| Field | Required | Format | +|-------|----------|--------| +| `title` | ✅ | Noun phrase, ≤60 chars | +| `created` | ✅ | ISO date `YYYY-MM-DD` | +| `source` | ✅ | `openclaw-` (e.g. `openclaw-xiaomo`) | +| `tags` | optional | YAML list | +| `category` | optional | Single string | +| `links` | optional | YAML list of slugs | + +### Slug Rules + +- **kebab-case**, all English, 3-60 chars +- Descriptive but concise: `docker-compose-port-binding`, not `note-1` + +### Categories + +`architecture` · `backend` · `frontend` · `devops` · `tooling` · `security` · `workflow` + +### Tag Types + +Domain: `docker`, `nodejs`, `api`, `azure`, `openclaw` … +Type: `decision`, `gotcha`, `pattern`, `howto`, `reference`, `debug` + +### Special Slug Prefixes + +| Prefix | Use | +|--------|-----| +| `adr-*` | Architecture decision records | +| `gotcha-*` | Pitfalls and traps | +| `pattern-*` | Reusable patterns / best practices | +| `tool-*` | Tool-specific tips | + +## Graph Health Check + +```bash +memex links # overview: orphans, hubs, stats +memex archive # retire outdated cards +``` + +Run periodically (during heartbeat) to find orphaned cards and add links. + +## What Goes Where + +``` +New knowledge → + ├─ Only useful to me? → MEMORY.md + ├─ Reusable technical fact? → memex card + ├─ Human-facing document? → OC Wiki + └─ Temporary operational log → memory/YYYY-MM-DD.md +``` + +## Git Sync (Cross-VM) + +```bash +memex sync --init # first time: connect to shared repo +memex sync on # auto-push on every write +memex sync # manual pull + push +``` diff --git a/skills/remote-assist/SKILL.md b/skills/remote-assist/SKILL.md new file mode 100644 index 0000000..e2fae2d --- /dev/null +++ b/skills/remote-assist/SKILL.md @@ -0,0 +1,99 @@ +--- +name: remote-assist +description: "Remote SSH assistance via Cloudflare Quick Tunnel. One-command workflow to establish temporary SSH access to a remote machine for troubleshooting. Usage: /remote-assist [tunnel-host] [--user username]. Without args, guides the remote user through bootstrap. With tunnel host, connects immediately." +user-invocable: true +--- + +# Remote Assist + +Establish temporary SSH access to a remote machine via Cloudflare Quick Tunnel for troubleshooting. + +## Flow + +### Phase 1: Bootstrap (no args or just `/remote-assist`) + +1. Send the remote user the universal bootstrap command: + ``` + bash <(curl -fsSL https://raw.githubusercontent.com/shazhou-ww/oc-bootstrap/main/bootstrap.sh) + ``` +2. Also send your SSH public key for them to add manually if the bootstrap script doesn't include it: + ```bash + # Read from ~/.ssh/id_ed25519.pub or ~/.ssh/id_rsa.pub + ``` +3. Wait for the user to reply with: + - **Tunnel hostname** (e.g. `abc-def-ghi.trycloudflare.com`) + - **Username** (e.g. `azureuser`) + +### Phase 2: Connect (`/remote-assist --user `) + +1. Kill any existing cloudflared proxy on port 2222: + ```bash + pkill -f "cloudflared access tcp.*localhost:2222" 2>/dev/null || true + ``` + +2. Start local proxy (background): + ```bash + cloudflared access tcp --hostname --url localhost:2222 & + ``` + +3. Wait 3 seconds, then test SSH: + ```bash + ssh -p 2222 -o StrictHostKeyChecking=no -o ConnectTimeout=10 @localhost "echo OK; hostname; uname -a" + ``` + +4. If SSH fails with `Permission denied (publickey)`: + - Ask the remote user to add your public key: + ```bash + echo "" >> ~/.ssh/authorized_keys + ``` + - Retry SSH after they confirm + +5. Once connected, report success and begin troubleshooting. + +### Phase 3: Troubleshoot + +Common checks to run on the remote machine: + +```bash +# OpenClaw status +~/.openclaw/bin/openclaw gateway status 2>&1 +~/.openclaw/bin/openclaw status 2>&1 + +# Recent logs +tail -50 /tmp/openclaw/openclaw-$(date -u +%Y-%m-%d).log + +# Service status +systemctl --user status openclaw-gateway +systemctl --user status copilot-api + +# Model connectivity +curl -s http://127.0.0.1:4141/v1/models | head -5 +``` + +### Phase 4: Cleanup + +After troubleshooting: +- Kill the local cloudflared proxy: `pkill -f "cloudflared access tcp.*localhost:2222"` +- Inform the remote user they can close their tunnel (Ctrl+C) +- Note: SSH public key remains in their authorized_keys for future sessions + +## Prerequisites + +- `cloudflared` installed locally +- SSH key pair (`~/.ssh/id_ed25519` or `~/.ssh/id_rsa`) + +## Bootstrap Script Repo + +https://github.com/shazhou-ww/oc-bootstrap + +Supported platforms: +- macOS (Intel + Apple Silicon) +- Ubuntu / Debian / WSL2 +- Universal router: auto-detects OS + +## Important + +- **Always ask the remote user's OS** before sending a specific script +- Each machine should use its own credentials (GitHub, API keys) — never share keys across machines +- Quick Tunnel URLs are temporary — they die when the process stops +- The bootstrap script injects KUMA's public key by default; you may need to add your own key separately diff --git a/skills/rfc-iteration/SKILL.md b/skills/rfc-iteration/SKILL.md new file mode 100644 index 0000000..2b55a7b --- /dev/null +++ b/skills/rfc-iteration/SKILL.md @@ -0,0 +1,183 @@ +--- +name: rfc-iteration +version: 1.0.0 +description: > + RFC 驱动迭代工作流。复杂功能按 Phase 拆分,每个 Phase 开 testing issue + 带具体验证步骤,逐条验证通过才算完成。适用于需要多轮迭代验证的功能开发。 +metadata: + requiredTools: ["gitee", "gh"] +--- + +# RFC 驱动迭代工作流 + +复杂功能用 RFC 先行,Phase 拆分,testing issue 验证,用户视角驱动。 + +## 核心流程 + +``` +RFC issue 创建(按用户视角拆 Phase) + → 每个 Phase 开 testing issue(具体步骤 + checkbox) + → 实现 Phase → 按 testing issue 验证 → close testing issue + → 重复直到所有 Phase 完成 + → RFC issue 汇总 → close +``` + +## 何时使用 + +- 功能涉及多个模块或多轮迭代 +- 需要明确的验证标准(不是"看起来能用") +- 多人协作,需要对齐"完成"的定义 +- Agent 需要自主验证功能是否正确 + +**不需要用的场景:** 一次性 bug fix、简单 CRUD、文档更新。 + +## Step 1:创建 RFC Issue + +```bash +gitee issue create --repo \ + --title "RFC-XXX: <功能名称>" \ + --body "## 背景 +<为什么做> + +## Phase 拆分 + +### Phase 1: <最小可验证功能> +- 验证目标:<用户视角> +- Testing issue: 待创建 + +### Phase 2: <扩展功能> +- 验证目标:<用户视角> +- Testing issue: 待创建 + +## 完成标准 +- [ ] 所有 Phase 的 testing issue 已 close +- [ ] 线上验证通过" +``` + +### Phase 拆分原则 + +- **用户视角**:不是"KV list 返回正确",而是"用户能看到消息列表" +- **最小可验证**:每个 Phase 1-2 小时能做完并验证 +- **可独立验证**:每个 Phase 不依赖后续 Phase 就能验证 +- **串行验证、可并行开发** + +## Step 2:为每个 Phase 创建 Testing Issue + +```bash +gitee issue create --repo \ + --title "Phase 1 Testing: <验证目标>" \ + --body "## 验证目标 +<用户视角的预期结果> + +## 测试步骤 + +- [ ] **Step 1: <操作>** + \`\`\`bash + curl -X POST http://localhost:8000/api/xxx -d '{...}' + \`\`\` + **预期:** 返回 201,xxx 有效 + +- [ ] **Step 2: <操作>** + \`\`\`bash + curl -X GET http://localhost:8000/api/xxx + \`\`\` + **预期:** 返回 200,包含 yyy + +## 验证完成标准 +✅ 所有 checkbox 打勾 +✅ 代码 review 通过 +✅ CI 构建成功" +``` + +### Testing Issue 要求 + +每个测试步骤必须: +1. **可复制粘贴执行** — 给出具体的 curl/CLI 命令 +2. **明确预期结果** — 状态码、返回值、页面状态 +3. **可重复执行** — 不依赖特定的运行时状态(或明确说明依赖) + +## Step 3:实现 → 验证循环 + +```bash +# 1. 创建分支 +git checkout -b feat/rfc-xxx-phase-1 + +# 2. 实现功能(或让 coding agent 做) +# ... + +# 3. 按 testing issue 逐条验证 +curl -X POST http://localhost:8000/api/xxx -d '{...}' +# 检查返回值是否符合预期 + +# 4. 全部通过后提交 +git commit -m "feat: RFC-XXX Phase 1 - <描述> (closes #)" + +# 5. 开 PR +gitee pr create --repo \ + --title "feat: RFC-XXX Phase 1" \ + --head feat/rfc-xxx-phase-1 --base main \ + --body "## What +Phase 1 of RFC-XXX. + +## Testing +All steps in # verified ✅ + +Ref: #" +``` + +## Step 4:RFC Issue 汇总 + +所有 Phase 完成后,在 RFC issue 里 comment 汇总: + +``` +## 验证结果汇总 + +- ✅ Phase 1: 基础功能 (#) +- ✅ Phase 2: 扩展功能 (#) +- ✅ Phase 3: 边界情况 (#) + +## 上线信息 +- 部署版本: v1.2.3 +- 上线时间: 2026-04-09 16:30 +- 验证环境: production + +Close RFC-XXX. +``` + +## Agent 自主验证模式 + +Agent 可以自动执行 testing issue 里的验证步骤: + +```bash +# Agent 读取 testing issue → 逐条执行 → 报告结果 +# 示例:Phase 1 验证 + +# Step 1 +RESULT=$(curl -s -o /dev/null -w "%{http_code}" -X POST http://localhost:8000/api/xxx -d '{...}') +[ "$RESULT" = "201" ] && echo "Step 1: ✅ PASS" || echo "Step 1: ❌ FAIL (got $RESULT)" + +# Step 2 +BODY=$(curl -s http://localhost:8000/api/xxx) +echo "$BODY" | jq -e '.data | length > 0' && echo "Step 2: ✅ PASS" || echo "Step 2: ❌ FAIL" +``` + +失败时 Agent 应该: +1. 收集日志(`docker compose logs -f api-service | tail -50`) +2. 开 bug issue 并关联 testing issue +3. 修复后重新验证 + +## 反模式 + +| ❌ 不要 | ✅ 应该 | +|:--------|:--------| +| RFC 直接开发不拆 Phase | 按用户价值拆 Phase | +| Testing issue 只写"测试功能X" | 具体步骤 + curl 命令 + 预期结果 | +| 代码写完才想验证 | 先写 testing issue 再写代码 | +| 技术指标驱动 | 用户体验驱动 | +| 一个 testing issue 跨多功能 | 一个 Phase 一个 testing issue | + +## 参考案例 + +小橘在 Uncaged RFC-006(Capability Deployment)中用此流程,3.5 小时完成 4 个 Phase 的全流程验证。 + +来源:[oc-wiki RFC 驱动迭代工作流](https://shazhou-ww.github.io/oc-wiki/shared/rfc-iteration-workflow/) diff --git a/skills/summarize/SKILL.md b/skills/summarize/SKILL.md new file mode 100644 index 0000000..df9e239 --- /dev/null +++ b/skills/summarize/SKILL.md @@ -0,0 +1,49 @@ +--- +name: summarize +description: Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube). +homepage: https://summarize.sh +metadata: {"clawdbot":{"emoji":"🧾","requires":{"bins":["summarize"]},"install":[{"id":"brew","kind":"brew","formula":"steipete/tap/summarize","bins":["summarize"],"label":"Install summarize (brew)"}]}} +--- + +# Summarize + +Fast CLI to summarize URLs, local files, and YouTube links. + +## Quick start + +```bash +summarize "https://example.com" --model google/gemini-3-flash-preview +summarize "/path/to/file.pdf" --model google/gemini-3-flash-preview +summarize "https://youtu.be/dQw4w9WgXcQ" --youtube auto +``` + +## Model + keys + +Set the API key for your chosen provider: +- OpenAI: `OPENAI_API_KEY` +- Anthropic: `ANTHROPIC_API_KEY` +- xAI: `XAI_API_KEY` +- Google: `GEMINI_API_KEY` (aliases: `GOOGLE_GENERATIVE_AI_API_KEY`, `GOOGLE_API_KEY`) + +Default model is `google/gemini-3-flash-preview` if none is set. + +## Useful flags + +- `--length short|medium|long|xl|xxl|` +- `--max-output-tokens ` +- `--extract-only` (URLs only) +- `--json` (machine readable) +- `--firecrawl auto|off|always` (fallback extraction) +- `--youtube auto` (Apify fallback if `APIFY_API_TOKEN` set) + +## Config + +Optional config file: `~/.summarize/config.json` + +```json +{ "model": "openai/gpt-5.2" } +``` + +Optional services: +- `FIRECRAWL_API_KEY` for blocked sites +- `APIFY_API_TOKEN` for YouTube fallback diff --git a/skills/weather/SKILL.md b/skills/weather/SKILL.md new file mode 100644 index 0000000..2146580 --- /dev/null +++ b/skills/weather/SKILL.md @@ -0,0 +1,49 @@ +--- +name: weather +description: Get current weather and forecasts (no API key required). +homepage: https://wttr.in/:help +metadata: {"clawdbot":{"emoji":"🌤️","requires":{"bins":["curl"]}}} +--- + +# Weather + +Two free services, no API keys needed. + +## wttr.in (primary) + +Quick one-liner: +```bash +curl -s "wttr.in/London?format=3" +# Output: London: ⛅️ +8°C +``` + +Compact format: +```bash +curl -s "wttr.in/London?format=%l:+%c+%t+%h+%w" +# Output: London: ⛅️ +8°C 71% ↙5km/h +``` + +Full forecast: +```bash +curl -s "wttr.in/London?T" +``` + +Format codes: `%c` condition · `%t` temp · `%h` humidity · `%w` wind · `%l` location · `%m` moon + +Tips: +- URL-encode spaces: `wttr.in/New+York` +- Airport codes: `wttr.in/JFK` +- Units: `?m` (metric) `?u` (USCS) +- Today only: `?1` · Current only: `?0` +- PNG: `curl -s "wttr.in/Berlin.png" -o /tmp/weather.png` + +## Open-Meteo (fallback, JSON) + +Free, no key, good for programmatic use: +```bash +curl -s "https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=-0.12¤t_weather=true" +``` + +Find coordinates for a city, then query. Returns JSON with temp, windspeed, weathercode. + +Docs: https://open-meteo.com/en/docs diff --git a/skills/wiki-writing/SKILL.md b/skills/wiki-writing/SKILL.md new file mode 100644 index 0000000..820d9d9 --- /dev/null +++ b/skills/wiki-writing/SKILL.md @@ -0,0 +1,143 @@ +--- +name: wiki-writing +description: 在 Gitea wiki 中编写和维护文档。规范格式、操作流程、排版约定。 +version: 1.0.0 +author: 星月 +metadata: + hermes: + tags: [wiki, documentation, gitea, writing] +--- + +# Wiki 编写规范 + +在 Gitea 仓库的 wiki 中编写和维护文档。 + +## Wiki 仓库操作 + +Gitea wiki 本质是一个独立的 git 仓库,地址为 `.wiki.git`。 + +### Clone + +```bash +git clone https://git.shazhou.work//.wiki.git /tmp/-wiki +``` + +### 编辑流程 + +```bash +cd /tmp/-wiki + +# 编辑或新建 .md 文件 +# 文件名即 wiki 页面名(用 kebab-case,如 cursor-agent-setup.md) + +git add -A +git commit -m "docs: 简要说明改了什么" +git push +``` + +### 页面命名 + +- 文件名用 **kebab-case**:`cursor-agent-setup.md`,不要用空格或中文文件名 +- `Home.md` 是 wiki 首页,必须存在 +- 文件名会直接显示为 wiki 侧边栏的页面标题 + +## 排版约定 + +### 语言与标点 + +- **中文文档用中文标点**:`,。:;!?()【】「」` +- **英文/代码文档用英文标点** +- 不要在中文文档中混用半角标点(Gitea 的 "ambiguous Unicode" 警告可忽略,那是给代码文件设计的) + +### 中英文混排 + +- 中文与英文/数字之间加一个空格:`使用 Cursor Agent 做编码任务` +- 中文与代码块之间加空格:`用 `tea` 命令读取` +- 专有名词保持原文:Gitea、Cursor、Hermes,不要翻译 + +### 文档结构 + +```markdown +# 标题 + +> 作者:xxx | 日期 + +## 背景 +(为什么需要这个) + +## 前置条件 +(需要什么) + +## 步骤 +### 1. 第一步 +### 2. 第二步 + +## 注意事项 +(坑和经验) +``` + +### 代码块 + +- 始终指定语言标记:` ```bash `、` ```python `、` ```markdown ` +- 命令用 `bash`,配置文件用对应格式 +- 代码块内的注释用英文(避免终端编码问题) + +### 元信息 + +每篇文档开头加作者和日期: + +```markdown +> 作者:星月 | 2026-04-22 +``` + +## 内容原则 + +1. **面向 agent 伙伴** — 假设读者是新加入的 Hermes agent,从零开始 +2. **可执行** — 每个步骤给出可直接复制运行的命令 +3. **说明 why** — 不只是 how,还要解释为什么这样做 +4. **记录坑** — 踩过的坑写进"注意事项",帮后来者避雷 + +## 常见操作 + +### 新建 wiki 页面 + +```bash +cd /tmp/-wiki +cat > new-page.md << 'EOF' +# 页面标题 + +> 作者:你的名字 | 日期 + +内容... +EOF + +git add new-page.md +git commit -m "docs: add new-page" +git push +``` + +### 更新现有页面 + +```bash +cd /tmp/-wiki +git pull # 先拉最新 +# 编辑文件... +git add -A +git commit -m "docs: 说明改了什么" +git push +``` + +### 查看 wiki 地址 + +页面在浏览器中的 URL 为: +``` +https://git.shazhou.work///wiki/ +``` +其中 `` 对应文件名去掉 `.md` 后缀。 + +## Pitfalls + +1. **wiki 仓库和代码仓库是分开的** — 它们有独立的 git 历史,push wiki 不会触发代码仓库的 CI +2. **Gitea 的 Unicode 警告是误报** — 中文文档里的中文标点会触发 "ambiguous Unicode characters" 警告,忽略即可 +3. **文件名避免特殊字符** — 用 kebab-case,不要用空格、中文、或 URL 不友好的字符 +4. **先 pull 再改** — wiki 可能被多人编辑,避免冲突 diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..a589a96 --- /dev/null +++ b/sync.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# 同步 shazhou/skills 到 ~/.hermes/skills/openclaw-imports/ +# 用法:bash sync.sh + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +SOURCE="$SCRIPT_DIR/skills" +TARGET="$HOME/.hermes/skills/openclaw-imports" + +if [ ! -d "$SOURCE" ]; then + echo "❌ 找不到 $SOURCE" + exit 1 +fi + +mkdir -p "$TARGET" + +count=0 +for skill_dir in "$SOURCE"/*/; do + skill_name=$(basename "$skill_dir") + target_dir="$TARGET/$skill_name" + + # 用 rsync 同步,保留目标目录中的本地修改以外的文件 + rsync -a --delete "$skill_dir" "$target_dir/" + echo "✅ $skill_name" + count=$((count + 1)) +done + +echo "" +echo "同步完成!共 $count 个 skills → $TARGET"