create-blog-post
npx skills add https://github.com/jim60105/copilot-prompt --skill create-blog-post
Agent 安装分布
Skill 文档
Create Blog Post on è.tw
This skill guides the full workflow of creating a new tech blog post on è.tw (ç³è½æºè 漫è«), from repo setup to PR submission.
Prerequisites
gitCLI availableghCLI authenticated with GitHub- Write access to
bot0419/ai-talks-content
Workflow
Step 1: Clone the Repository
If the blog repo is not yet cloned:
git clone --recurse-submodules https://github.com/jim60105/blog.git
cd blog
If already cloned but submodules are missing:
git submodule update --init --recursive
If already cloned and submodules exist, just ensure they’re up to date:
git pull origin master
Step 2: Prepare the Submodule
Enter the content submodule and ensure it’s on the latest master:
cd è.tw/content
git checkout master
git pull origin master
cd ../..
Step 3: Switch to è.tw Mode
From the project root (blog/):
./switch-site.sh è.tw
This creates symlinks for config.toml, content/, static/, and wrangler.jsonc pointing to è.tw/.
Step 4: Choose Section and Prepare File
List available content sections:
ls -d è.tw/content/*/
Choose the section most related to the topic. If none fits well, use Uncategorized.
Step 5: Create the Post File
Create a markdown file with a slugified filename (lowercase, hyphens, English, descriptive):
touch è.tw/content/<Section>/my-descriptive-slug.md
Naming convention: use lowercase English words separated by hyphens. The slug should describe the post content concisely.
Step 6: Write Front Matter
Read AGENTS.md at the project root for the latest front matter specification. The required format:
+++
title = "æç« æ¨é¡ï¼æ£é«ä¸æï¼"
description = "SEO ååçæç« æè¿°ï¼å
嫿æéè¦ééµåï¼æ£é«ä¸æï¼"
date = "YYYY-MM-DDTHH:MM:SSZ"
updated = "YYYY-MM-DDTHH:MM:SSZ"
draft = false
[taxonomies]
tags = ["Tag1", "Tag2"]
providers = [ "Felo Search" ]
[extra]
withAI = "<https://the.ai.resource/used>"
+++
Rules:
title: Concise, SEO-friendly, Traditional Chinesedescription: Contains all keywords, compelling for search resultsdate: ISO 8601 UTC format, use current timestampupdated: ISO 8601 UTC format, use current timestamptags: Relevant tags in the format used by existing postsproviders: The provider(s) of AI assistance used in writing the article, if anywithAI: Brief note about AI assistance or any urls to AI resources used. This is optional but recommended for transparency.- NEVER fabricate an
iscnfield â only the user can generate this
Step 7: Write the Blog Post Content
Read .github/instructions/quill-sage.instructions.md at the project root for full editorial guidelines. For quick reference, see references/writing-guidelines.md.
Key rules:
- Write in Traditional Chinese (zh-TW) with full-width punctuation
- Add a space between Chinese characters and alphanumeric characters
- Use inverted pyramid structure: core conclusion first, evidence second
- Avoid bullet lists unless explicitly requested; prefer natural paragraphs
- Use
##and###subheadings to organize - Address reader as ãè®è ãã大家ããåä½ã or ãä½ ã, never ãæ¨ã
- Refer to the author as ãæã, never ãæåã
- Opening paragraph states core conclusion and scope
- Closing paragraph must not use slogan-style endings
Step 8: Add Formatting and Color Shortcodes
Review the article and enhance with:
- Bold (
**text**) for emphasis keywords - Italic (
*text*) where appropriate - Color shortcodes for pros/cons:
- Green (positive):
{{ cg(body="positive text") }}or{% cg() %}block text{% end %} - Red (negative):
{{ cr(body="negative text") }}or{% cr() %}block text{% end %}
- Green (positive):
Step 9: Add Chat Shortcodes
Use chat shortcodes to create conversational content that makes the article vivid:
{% chat(speaker="yuna") %}
Question or statement from Yuna
{% end %}
{% chat(speaker="jim") %}
Response from Jim (author, displayed as ç³, aligned right)
{% end %}
Available speakers: chatgpt, claude, gemini, copilot, felo, jim (author, right-aligned), yoruka, or any custom name. Default/user gets a generic user avatar.
Design conversations that naturally introduce the topic, ask clarifying questions, or surface interesting angles. The chat format should add value, not just decorate.
Step 10: SEO Review â Rewrite Title and Description
After completing the content, re-evaluate:
- Title: Rewrite for SEO. Include the primary keyword near the front. Keep it concise but descriptive. Traditional Chinese.
- Description: Rewrite to include all important keywords from the article. This text appears in search results â make it compelling and informative. ~150-160 characters ideal.
Step 11: Rename File if Title Changed
If the title was significantly revised, rename the file to match:
mv è.tw/content/<Section>/old-slug.md è.tw/content/<Section>/new-better-slug.md
The slug should reflect the final title content in English.
Step 12: Zola Build Check
Before committing, run a local build to catch any formatting or shortcode errors:
zola build
Get the latest Zola binary from GitHub releases if you don’t have it installed. https://github.com/getzola/zola/releases/latest
Read the release to get the correct binary name with version number.
Download the*-x86_64-unknown-linux-musl.tar.gzfor Linux, extract it, and use thezolabinary.
Step 13: Create Branch, Commit, and PR
All git operations happen inside the submodule (è.tw/content/):
cd è.tw/content
git checkout -b post/<slug-name>
git add <Section>/new-post-file.md
git commit --signoff --author="GitHub Copilot <bot@ChenJ.im>" -m "feat: add post <descriptive-title>
Add new blog post about <topic summary>.
Co-authored-by: GitHub Copilot <bot@ChenJ.im>"
git push origin post/<slug-name>
Then create the PR targeting master on bot0419/ai-talks-content:
gh pr create \
--repo bot0419/ai-talks-content \
--base master \
--head post/<slug-name> \
--title "feat: add post <descriptive-title>" \
--body "Add new blog post: <title>
<brief description of content>
---
Written with AI assistance."
Step 14: Request Review
gh pr edit --repo bot0419/ai-talks-content <PR_NUMBER> --add-reviewer jim60105
Terminology Mappings
When writing content, apply these Traditional Chinese mappings: create = 建ç«, object = ç©ä»¶, queue = ä½å, stack = å ç, information = è³è¨, invocation = å¼å«, code = ç¨å¼ç¢¼, running = å·è¡, library = å½å¼åº«, schematics = åçå, building = 建æ§, Setting up = è¨å®, package = å¥ä»¶, video = å½±ç, for loop = for è¿´å, class = é¡å¥, Concurrency = å¹³è¡èç, Transaction = 交æ, Transactional = 交æå¼, Code Snippet = ç¨å¼ç¢¼ç段, Code Generation = ç¨å¼ç¢¼ç¢çå¨, Any Class = ä»»æé¡å¥, Scalability = 延屿§, Dependency Package = ç¸ä¾å¥ä»¶, Dependency Injection = ç¸ä¾æ§æ³¨å ¥, Reserved Keywords = ä¿çå, Metadata = Metadata, Clone = è¤è£½, Memory = è¨æ¶é«, Built-in = å §å»º, Global = å ¨å, Compatibility = ç¸å®¹æ§, Function = å½å¼, Refresh = éæ°æ´ç, document = æä»¶, example = ç¯ä¾, demo = å±ç¤º, quality = å質, tutorial = æå, recipes = ç§è¨£, byte = ä½å çµ, bit = ä½å