# James Blog

> Generates Hexo Markdown posts for James的成长之路 at I:\Blog\source\_posts, creates cover images (AI, public web, or SVG fallback), converts Mermaid diagrams to PNG, watermarks images at the bottom-right, and uploads them to Cloudflare R2 using locally stored PicGo credentials. Use when the user asks to write a blog post, 写博客, 发文章, Hexo, 封面, mermaid 转图片, PicGo, Cloudflare R2, or 图床上传.

- Skill: `aiziyou918/james-blog` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add aiziyou918/james-blog`
- Raw SKILL.md: https://api.skillmd.com/api/skills/aiziyou918/james-blog/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: Aiziyou918 (https://skillmd.com/u/aiziyou918)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/aiziyou918/james-blog

---


# James 博客写作 Skill

为 Hexo 博客 **James的成长之路**（`I:\Blog`）写新文章。密钥只保存在本机 `~/.james-blog/config.json`，禁止写入仓库、禁止在回复里打印 Secret。

`SKILL_DIR` = 本文件所在目录。脚本：`python {SKILL_DIR}/scripts/james_blog.py <cmd>`

## 每次开始

1. `python {SKILL_DIR}/scripts/james_blog.py doctor`
2. 若缺少配置：`python {SKILL_DIR}/scripts/james_blog.py init --from-picgo`
3. PicGo 不存在时，向用户要 R2 的 Access Key / Secret / Endpoint / Bucket，然后：

```bash
python {SKILL_DIR}/scripts/james_blog.py init --access-key-id ... --secret-access-key ... --endpoint ... --bucket ...
```

不要把密钥回显到对话里。缺依赖时：`pip install -r {SKILL_DIR}/scripts/requirements.txt`

写作风格见 [STYLE.md](STYLE.md)。

## 工作流

复制并勾选：

```text
- [ ] doctor / init 通过
- [ ] 确定标题、tags、categories、文件名
- [ ] next-abbrlink
- [ ] 写正文（可含 mermaid 草稿）
- [ ] 封面：知名图 / GenerateImage / SVG
- [ ] mermaid → PNG → 上传 → 替换
- [ ] 所有图片水印后上传 R2
- [ ] 写入 I:\Blog\source\_posts\<slug>.md
```

### 1. 元数据

```bash
python {SKILL_DIR}/scripts/james_blog.py next-abbrlink
```

Frontmatter 必须与现有文章一致：

```yaml
---
title: <中文标题>
tags:
  - AI Infra
  - <专题>
categories:
  - AI Infra
  - <专题>
cover: 'https://imgs.james-blog.top/imgs/<md5>.png'
toc: true
mathjax: true
abbrlink: <next>
date: YYYY-MM-DD HH:mm:ss
description: <通常与 title 相同>
---
```

- 文件名：英文 kebab-case，如 `mini-sglang-1-core-concepts-tech.md`。中文文件名仅在用户明确要求时使用。
- 输出路径：`I:\Blog\source\_posts\<slug>.md`
- 时区：Asia/Shanghai，用当天日期。
- 不要改已有文章，除非用户明确要求。

### 2. 封面（三选一，按优先级）

| 情况 | 做法 |
|------|------|
| 公众熟知的 Logo / 架构图 / 产品图（CUDA、PyTorch、NVIDIA、Wikipedia 词条等） | 用官方文档或 Wikimedia 的 **可公开使用** 图片。`python {SKILL_DIR}/scripts/james_blog.py fetch URL --upload` |
| 抽象主题、需要原创插画 | 调用 Cursor `GenerateImage`：`aspect_ratio=16:9`，文件名 `cover.png`，风格偏深色技术插画，**不要在图里写长段中文** |
| 没有生图工具，或生图失败 | `python {SKILL_DIR}/scripts/james_blog.py cover --title "标题" --subtitle "专题" --out cover.png --upload` |

`fetch` / `cover --upload` / `upload` 都会打右下角水印再上传，标准输出只有 CDN URL，填进 `cover:`。

禁止使用来源不明、明显侵权或带内部信息的图。Wikimedia 优先于随机谷歌结果。

### 3. Mermaid → 图片

博客 **不支持** 文中 mermaid。草稿里可以先写 ` ```mermaid `，定稿前必须转成图：

```bash
python {SKILL_DIR}/scripts/james_blog.py mermaid --file draft.md
```

或单张：

```bash
python {SKILL_DIR}/scripts/james_blog.py mermaid --code "graph TD; A-->B" --out diagram.png --upload
```

替换为 `![](https://imgs.james-blog.top/imgs/....png)`。最终 `.md` 里不能留下 mermaid 代码块。

### 4. 其它图片

本地文件：

```bash
python {SKILL_DIR}/scripts/james_blog.py upload path/to/image.png
```

正文用 `![](url)` 或 `![简短 alt](url)`。不要把图片拷进 `source/`。

## 配置与密钥

- 本地配置：`~/.james-blog/config.json`（Windows：`C:\Users\<user>\.james-blog\config.json`）
- 默认从 `%APPDATA%\picgo\data.json` 的 `picBed.aws-s3` + `picgo-plugin-watermark` 导入
- 图床：Cloudflare R2，对象键 `imgs/{md5}.{ext}`，公开域 `https://imgs.james-blog.top/{path}`
- 水印：文字 `James的成长之路`，字体 `C:\Windows\Fonts\FZSTK.TTF`，右下角 `rb`，最小 `50*50`。大图会按宽度放大字号；深色角落自动改浅色，保证看得见
- `show` 命令只打印脱敏后的 AccessKey
- **永远不要**把 `config.json`、Access Key、Secret、Endpoint 账号 ID 提交到 git 或写进文章

改配置：编辑 `~/.james-blog/config.json`，或重新 `init --from-picgo`。

## 正文要求

- 中文，技术深度对齐现有 `_posts`（RDMA / Mini-SGLang / Mooncake 那一档）
- 公式用 `$...$` / `$$...$$`（`mathjax: true`）
- 代码块标语言；引用论文或仓库用 blockquote
- 结构用 `## 一、` 或 `## 1.`，开头可有 3–8 句导读
- 不编造未核实的性能数字、集群规模、内部实现
- 写完后确认：frontmatter 完整、封面是 CDN、无 mermaid、无本地路径图片、无密钥

## 命令速查

```bash
python {SKILL_DIR}/scripts/james_blog.py init --from-picgo
python {SKILL_DIR}/scripts/james_blog.py doctor
python {SKILL_DIR}/scripts/james_blog.py next-abbrlink
python {SKILL_DIR}/scripts/james_blog.py upload image.png
python {SKILL_DIR}/scripts/james_blog.py cover --title "标题" --subtitle "AI Infra" --out cover.png --upload
python {SKILL_DIR}/scripts/james_blog.py mermaid --file post.md
python {SKILL_DIR}/scripts/james_blog.py fetch https://example.com/logo.png --upload
```

