diff --git a/skills/baoyu-post-to-wechat/SKILL.md b/skills/baoyu-post-to-wechat/SKILL.md index 3abaf24..4a293eb 100644 --- a/skills/baoyu-post-to-wechat/SKILL.md +++ b/skills/baoyu-post-to-wechat/SKILL.md @@ -44,10 +44,37 @@ test -f "$HOME/.baoyu-skills/baoyu-post-to-wechat/EXTEND.md" && echo "user" ├───────────┼───────────────────────────────────────────────────────────────────────────┤ │ Found │ Read, parse, apply settings │ ├───────────┼───────────────────────────────────────────────────────────────────────────┤ -│ Not found │ Use defaults │ +│ Not found │ Run first-time setup ([references/config/first-time-setup.md](references/config/first-time-setup.md)) → Save → Continue │ └───────────┴───────────────────────────────────────────────────────────────────────────┘ -**EXTEND.md Supports**: Default theme | Default publishing method (api/browser) | Default author | Chrome profile path +**EXTEND.md Supports**: Default theme | Default publishing method (api/browser) | Default author | Default open-comment switch | Default fans-only-comment switch | Chrome profile path + +First-time setup: [references/config/first-time-setup.md](references/config/first-time-setup.md) + +**Minimum supported keys** (case-insensitive, accept `1/0` or `true/false`): + +| Key | Default | Mapping | +|-----|---------|---------| +| `default_author` | empty | Fallback for `author` when CLI/frontmatter not provided | +| `need_open_comment` | `1` | `articles[].need_open_comment` in `draft/add` request | +| `only_fans_can_comment` | `0` | `articles[].only_fans_can_comment` in `draft/add` request | + +**Recommended EXTEND.md example**: + +```md +default_theme: default +default_publish_method: api +default_author: 宝玉 +need_open_comment: 1 +only_fans_can_comment: 0 +chrome_profile_path: /path/to/chrome/profile +``` + +**Value priority**: +1. CLI arguments +2. Frontmatter +3. EXTEND.md +4. Skill defaults ## Image-Text Posting (图文) @@ -70,7 +97,7 @@ Publishing Progress: - [ ] Step 1: Determine input type - [ ] Step 2: Check markdown-to-html skill - [ ] Step 3: Convert to HTML -- [ ] Step 4: Validate metadata (title, summary) +- [ ] Step 4: Validate metadata (title, summary, cover) - [ ] Step 5: Select method and configure credentials - [ ] Step 6: Publish to WeChat - [ ] Step 7: Report completion @@ -80,6 +107,13 @@ Publishing Progress: Check and load EXTEND.md settings (see Preferences section above). +**CRITICAL**: If not found, complete first-time setup BEFORE any other steps or questions. + +Resolve and store these defaults for later steps: +- `default_author` +- `need_open_comment` (default `1`) +- `only_fans_can_comment` (default `0`) + ### Step 1: Determine Input Type | Input Type | Detection | Action | @@ -162,11 +196,19 @@ Check extracted metadata from Step 3 (or HTML meta tags if direct HTML input). |-------|------------| | Title | Prompt: "Enter title, or press Enter to auto-generate from content" | | Summary | Prompt: "Enter summary, or press Enter to auto-generate (recommended for SEO)" | +| Author | Use fallback chain: CLI `--author` → frontmatter `author` → EXTEND.md `default_author` | **Auto-Generation Logic**: - **Title**: First H1/H2 heading, or first sentence - **Summary**: First paragraph, truncated to 120 characters +**Cover Image Check** (required for `article_type=news`): +1. Use CLI `--cover` if provided. +2. Else use frontmatter (`featureImage`, `coverImage`, `cover`, `image`). +3. Else check article directory default path: `imgs/cover.png`. +4. Else fallback to first inline content image. +5. If still missing, stop and request a cover image before publishing. + ### Step 5: Select Publishing Method and Configure **Ask publishing method** (unless specified in EXTEND.md or CLI): @@ -213,9 +255,20 @@ WECHAT_APP_SECRET= **API method**: ```bash -npx -y bun ${SKILL_DIR}/scripts/wechat-api.ts [--title ] [--summary <summary>] +npx -y bun ${SKILL_DIR}/scripts/wechat-api.ts <html_file> [--title <title>] [--summary <summary>] [--author <author>] [--cover <cover_path>] ``` +**`draft/add` payload rules**: +- Use endpoint: `POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN` +- `article_type`: `news` (default) or `newspic` +- For `news`, include `thumb_media_id` (cover is required) +- Always resolve and send: + - `need_open_comment` (default `1`) + - `only_fans_can_comment` (default `0`) +- `author` resolution: CLI `--author` → frontmatter `author` → EXTEND.md `default_author` + +If script parameters do not expose the two comment fields, still ensure final API request body includes resolved values. + **Browser method**: ```bash @@ -237,6 +290,7 @@ Article: • Title: [title] • Summary: [summary] • Images: [N] inline images +• Comments: [open/closed], [fans-only/all users] Result: ✓ Draft saved to WeChat Official Account @@ -289,6 +343,8 @@ Files created: | Multiple images | ✓ (up to 9) | ✓ (inline) | ✓ (inline) | | Themes | ✗ | ✓ | ✓ | | Auto-generate metadata | ✗ | ✓ | ✓ | +| Default cover fallback (`imgs/cover.png`) | ✗ | ✓ | ✗ | +| Comment control (`need_open_comment`, `only_fans_can_comment`) | ✗ | ✓ | ✗ | | Requires Chrome | ✓ | ✗ | ✓ | | Requires API credentials | ✗ | ✓ | ✗ | | Speed | Medium | Fast | Slow | @@ -322,6 +378,8 @@ Files created: | Not logged in (browser) | First run opens browser - scan QR to log in | | Chrome not found | Set `WECHAT_BROWSER_CHROME_PATH` env var | | Title/summary missing | Use auto-generation or provide manually | +| No cover image | Add frontmatter cover or place `imgs/cover.png` in article directory | +| Wrong comment defaults | Check `EXTEND.md` keys `need_open_comment` and `only_fans_can_comment` | | Paste fails | Check system clipboard permissions | ## Extension Support diff --git a/skills/baoyu-post-to-wechat/references/config/first-time-setup.md b/skills/baoyu-post-to-wechat/references/config/first-time-setup.md new file mode 100644 index 0000000..94c50d7 --- /dev/null +++ b/skills/baoyu-post-to-wechat/references/config/first-time-setup.md @@ -0,0 +1,146 @@ +--- +name: first-time-setup +description: First-time setup flow for baoyu-post-to-wechat preferences +--- + +# First-Time Setup + +## Overview + +When no EXTEND.md is found, guide user through preference setup. + +**BLOCKING OPERATION**: This setup MUST complete before ANY other workflow steps. Do NOT: +- Ask about content or files to publish +- Ask about themes or publishing methods +- Proceed to content conversion or publishing + +ONLY ask the questions in this setup flow, save EXTEND.md, then continue. + +## Setup Flow + +``` +No EXTEND.md found + | + v ++---------------------+ +| AskUserQuestion | +| (all questions) | ++---------------------+ + | + v ++---------------------+ +| Create EXTEND.md | ++---------------------+ + | + v + Continue to Step 1 +``` + +## Questions + +**Language**: Use user's input language or saved language preference. + +Use AskUserQuestion with ALL questions in ONE call: + +### Question 1: Default Theme + +```yaml +header: "Theme" +question: "Default theme for article conversion?" +options: + - label: "default (Recommended)" + description: "Classic layout - centered title with border, white-on-color H2" + - label: "grace" + description: "Elegant - text shadows, rounded cards, refined blockquotes" + - label: "simple" + description: "Minimal modern - asymmetric rounded corners, clean whitespace" +``` + +### Question 2: Default Publishing Method + +```yaml +header: "Method" +question: "Default publishing method?" +options: + - label: "api (Recommended)" + description: "Fast, requires API credentials (AppID + AppSecret)" + - label: "browser" + description: "Slow, requires Chrome and login session" +``` + +### Question 3: Default Author + +```yaml +header: "Author" +question: "Default author name for articles?" +options: + - label: "No default" + description: "Leave empty, specify per article" +``` + +Note: User will likely choose "Other" to type their author name. + +### Question 4: Open Comments + +```yaml +header: "Comments" +question: "Enable comments on articles by default?" +options: + - label: "Yes (Recommended)" + description: "Allow readers to comment on articles" + - label: "No" + description: "Disable comments by default" +``` + +### Question 5: Fans-Only Comments + +```yaml +header: "Fans only" +question: "Restrict comments to followers only?" +options: + - label: "No (Recommended)" + description: "All readers can comment" + - label: "Yes" + description: "Only followers can comment" +``` + +### Question 6: Save Location + +```yaml +header: "Save" +question: "Where to save preferences?" +options: + - label: "Project (Recommended)" + description: ".baoyu-skills/ (this project only)" + - label: "User" + description: "~/.baoyu-skills/ (all projects)" +``` + +## Save Locations + +| Choice | Path | Scope | +|--------|------|-------| +| Project | `.baoyu-skills/baoyu-post-to-wechat/EXTEND.md` | Current project | +| User | `~/.baoyu-skills/baoyu-post-to-wechat/EXTEND.md` | All projects | + +## After Setup + +1. Create directory if needed +2. Write EXTEND.md +3. Confirm: "Preferences saved to [path]" +4. Continue to Step 0 (load the saved preferences) + +## EXTEND.md Template + +```md +default_theme: [default/grace/simple] +default_publish_method: [api/browser] +default_author: [author name or empty] +need_open_comment: [1/0] +only_fans_can_comment: [1/0] +chrome_profile_path: +``` + +## Modifying Preferences Later + +Users can edit EXTEND.md directly or delete it to trigger setup again.