github-figure-bed

Uploads images to GitHub and gives you links to use them anywhere, with one-time setup.

Installation
Run `npx skills add "https://github.com/wu529778790/shenzjd-skills" --skill "github-figure-bed"` to install this skill, then follow its SKILL.md instructions for my next request.

Paste this into Claude Code, Cursor, or any agent that can run commands.

What this skill does
What it does: - Uploads images from your computer to a GitHub repository to use as a figure bed - Generates web links to your images that you can paste into documents or websites - Supports multiple content delivery networks to speed up image loading - Lets you delete or list images you have already uploaded - Sets up automatically the first time you use it with one simple command When to use it: - You have images on your computer that you want to host online for a blog or website - You need to create markdown links for images to use in documents - You want to organize and manage images stored in a GitHub repository - You need fast image links using a content delivery network like jsdelivr
SKILL.mdShow the author's original SKILL.md (not in English)
---
name: github-figure-bed
description: "Upload images to any GitHub repo as a figure bed and get CDN/markdown links (jsdelivr/jsdmirror/raw). One-time setup.sh guides gh login, auto-detects the owner, creates the default repo (img.shenzjd.com) if missing, and syncs config with the img.shenzjd.com web app via the repo's .img.shenzjd.com/config.json — upload with zero manual configuration. Use for uploading images to GitHub, generating CDN links, deleting/listing hosted images, or setting up a figure bed. Keywords: github figure bed, image host, CDN link, jsdelivr, jsdmirror, upload image to GitHub, 图床, 上传图片, CDN 链接, 初始化图床."
---

# GitHub Figure Bed

把本地图片上传到任意 GitHub 仓库(图床),生成可直接粘贴的 CDN 链接
(Markdown / 纯 URL),并支持删除、列表管理。不依赖前端,任何环境(含整理素材时)都能用。

## Overview

图床 = 任意 GitHub 仓库 + 一个图片目录(默认 `blog/`)。本 skill 通过
`gh api` 调用 GitHub Contents API(与网页版图床同一接口),把图片上传到目标仓库,
并返回 CDN 加速链接。支持多 CDN、多文件、子目录、重名保护。

**零配置体验**:首次使用运行 `scripts/setup.sh` 一键初始化 —— 自动引导登录、
检测/创建仓库、**读取仓库配置并与 img.shenzjd.com 项目网页端联动**、探测分支、
生成本地缓存。之后用户只需对 AI 说「上传 xxx.png 到图床」,无需手动配置任何东西。

**配置路径**:远程配置固定读取仓库 `.img.shenzjd.com/config.json`(与 img.shenzjd.com
网页端一致);旧仓库的 `.imgx-config/config.json` 仍兼容读取,但新写入一律用新路径。

**可视化后台**:不想用命令行时,直接打开 [img.shenzjd.com](https://img.shenzjd.com)
网页端 —— 同一个图床仓库,拖拽上传(压缩/水印/WebP)、图片管理(预览/删除/链接复制)、
可视化设置(分支/目录/CDN)。网页端改配置后,重跑 `setup.sh` 即可同步到 AI 侧。

## When to Use

- User wants to upload local images to a GitHub-hosted figure bed and get CDN links
- User wants a markdown image link like `![name](https://cdn.jsdelivr.net/gh/...@main/...)` for blog/docs
- User wants to delete an image from the figure bed repo
- User wants to list/search images already in the figure bed repo
- User mentions 图床 / 上传图片 / CDN 链接 / jsdelivr / jsdmirror / 图片托管
- User asks to organize assets and host them (AI cannot use the web UI, this skill covers that gap)

**When NOT to Use:**
- User has a figure bed web app with its own upload flow and can use it directly
- Target repo is not a GitHub repo (e.g. local-only or other platforms)
- `gh` CLI is not installed or not authenticated (install and `gh auth login` first)

## Core Pattern

### Step 0: 首次使用 — 一键初始化 (setup.sh)

新用户首次使用(或不确定配置是否就绪时),先运行:

```bash
scripts/setup.sh
```

它会自动完成,**全程不需要用户手动配置**:

1. **登录引导**:检测到未登录时运行 `gh auth login`,把输出的授权链接和
   one-time code 展示给用户,引导在浏览器完成授权(只需一次)
2. **自动获取 Owner**:取当前登录的 GitHub 用户名,无需手填
3. **仓库就绪**:检测默认仓库 `img.shenzjd.com`;不存在则自动创建(public),
   并写入宣传/使用说明 README
4. **配置联动(核心)**:读取仓库的 `.img.shenzjd.com/config.json`(与 img.shenzjd.com
   项目网页端**共用同一份配置**),自动继承 branch/directory/cdn;
   仓库没有配置时,初始化一份项目格式配置写回仓库(网页端即可直接使用)
5. **分支探测**:自动找出图片目录实际所在分支(规避 default_branch 与图片分支不一致的坑)
6. **配置落盘**:写入本地缓存 `~/.config/github-figure-bed/config.env`,
   三个操作脚本自动读取,之后**零参数直接使用**
7. **自测**:上传一张 1x1 测试图并删除,验证全链路

可选参数:`--repo <仓库名>` 换仓库名;`--cdn <cdn>` 换默认 CDN;
`--no-test` 跳过自测;`--force-readme` 强制重写宣传 README。

### Step 1: 确定目标仓库与配置

优先级(高→低):**命令行参数 > 环境变量 `IMGX_*` > 本地缓存 `~/.config/github-figure-bed/config.env`(setup.sh 从远程同步) > 脚本内 `DEFAULT_*` 默认区**。

**配置联动**:远程配置源为仓库 `.img.shenzjd.com/config.json`(与 img.shenzjd.com
项目网页端共用),setup.sh 自动读取并同步到本地缓存;项目网页端修改配置后,
重跑 `setup.sh` 即可刷新本地。

- 仓库:setup.sh 已自动配置(默认 `img.shenzjd.com`);上传到其他仓库时再传 `--owner/--repo`
- 分支:不指定时自动检测仓库 `default_branch`(一般就是 `main`,零配置)
- CDN:默认 `jsdelivr`;大陆用户推荐 `jsdmirror`;本地调试可用 `raw`
- 基础目录:默认 `blog/`,可用 `--dir` 或环境变量 `IMGX_DIR` 改

若用户没给仓库且未运行过 setup,先跑 `scripts/setup.sh`(或让用户设置
`IMGX_OWNER` / `IMGX_REPO`)。

### Step 2: 上传图片

```bash
scripts/upload.sh <文件1> [文件2 ...] \
  [--owner O] [--repo R] [--branch B] [--cdn jsdelivr|jsdmirror|jsd-onmicrosoft|statically|raw] \
  [--dir 子目录] [--force] [--silent]
```

- 支持多文件一次上传;`--dir` 追加子目录(如 `--dir 2026/08` → `blog/2026/08/`)
- **重名保护(默认)**:目标文件已存在时自动改为 `<时间戳>_<原文件名>`,
  不覆盖已有文件 —— 图床场景覆盖会破坏线上已发布的引用;`--force` 才覆盖
- 输出 JSON 数组,每项含 `{file, path, cdn_url, markdown, html_url, action}`:
  - `cdn_url`:CDN 链接(含正确分支)
  - `markdown`:可直接粘贴的 `![文件名](链接)`
  - `action`:`created` / `renamed`(自动换名)/ `replaced`

**上传后向用户展示**:Markdown 格式 + 纯 URL,例如:

```markdown
![photo.png](https://cdn.jsdelivr.net/gh/alice/my-figure-bed@main/blog/photo.png)
```
纯 URL:`https://cdn.jsdelivr.net/gh/alice/my-figure-bed@main/blog/photo.png`

### Step 3: 删除图片

```bash
scripts/delete.sh <文件名1> [文件名2 ...] [--owner O] [--repo R] [--branch B] [--dir 子目录] [--silent]
```

- 文件名指基础目录下的文件名(不含 `blog/` 前缀)
- 不确定是否存在时,先 `scripts/list.sh <关键词>` 确认

### Step 4: 列出图片

```bash
scripts/list.sh [关键词] [--owner O] [--repo R] [--branch B] [--dir 子目录] [--limit N] [--full]
```

- 无参数列出文件(默认 50 条);传关键词做文件名模糊过滤(如 `list.sh 响应性`)
- `--full` 输出完整 JSON(含 size);默认只输出文件名列表

## Quick Reference

| 操作 | 命令 | 说明 |
|------|------|------|
| 首次初始化 | `setup.sh` | 登录引导 + 自动配置 + 仓库就绪(零手动配置) |
| 上传 | `upload.sh img.png` | 返回 CDN + Markdown 链接(setup 后无需参数) |
| 上传(多) | `upload.sh a.png b.png c.png --dir 2026/08` | 批量 + 子目录 |
| 删除 | `delete.sh a.png` | 按文件名删除 |
| 列表 | `list.sh` / `list.sh 关键词 --full` | 列出/搜索图床文件 |
| 覆盖 | `upload.sh img.png --force` | 已存在时覆盖更新 |
| 环境变量 | `IMGX_OWNER IMGX_REPO IMGX_BRANCH IMGX_CDN IMGX_DIR` | 免重复传参 |

## Common Mistakes

- **分支错误导致 404**:jsDelivr 系默认找 `main`。脚本会自动检测默认分支,但若图片实际在
  非默认分支(如 `master`),必须 `--branch master` 显式指定。
- **给 jsdmirror/jsdelivr 链接加 `?format=webp`**:这两个 CDN 无动态转换,加参数必 404。
- **覆盖已有文件**:默认重名会自动换名保护;确认要更新同一链接内容才用 `--force`。
- **忘记指定仓库**:`owner/repo` 由 setup.sh 自动写入配置文件,无需手填;
  未 setup 时需传参或设 `IMGX_OWNER`/`IMGX_REPO`,脚本无法凭空推断目标仓库。
- **从未运行 setup 就上传**:会因 owner/repo 为空而报错,先跑 `setup.sh`。
- **网页端改配置后本地未同步**:远程配置(`.img.shenzjd.com/config.json`)变化后,
  重跑 `setup.sh` 刷新本地缓存。
- **大图失败**:脚本已用临时文件拼 JSON payload 规避命令行长度限制,若仍失败检查
  GitHub 仓库 100MB 单文件限制与网络。
- **上传后立即访问 404**:CDN 有缓存,通常数秒~数分钟生效,稍后重试。
- **文件名带空格/特殊字符**:会破坏链接,上传前重命名(中文可用)。

## References

- `references/cdn-links.md`:CDN 链接格式、全部踩坑清单、仓库 API 参考
- 脚本内部:`scripts/setup.sh`(一键初始化)/ `scripts/upload.sh` / `scripts/delete.sh` / `scripts/list.sh`

Ships with 6 supporting files:

  • README.md
  • references/cdn-links.md
  • scripts/delete.sh
  • scripts/list.sh
  • scripts/setup.sh
  • scripts/upload.sh

Mirrored from the author's public source. Install counts from the open skills registry.

The systems behind these skills get built for partners every week.

Partner with us