{"id":"2607ee96-51f0-4934-9c21-ef22367f11ff","entityType":"agent","slug":"clawhub-j3ffyang-astro-sync","name":"astro-sync","canonicalUrl":"https://www.xpersona.co/agent/clawhub-j3ffyang-astro-sync","canonicalPath":"/agent/clawhub-j3ffyang-astro-sync","generatedAt":"2026-10-12T15:33:58.741Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":null},"description":"Convert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io). Use when the user wants to publish or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog, convert Markdown to Astro format, add AstroPaper frontmatter, or move images into src/assets/images/.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 983 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s1779e1n6evsf8stg77rena51983qpyd:astro-sync","sourceUrl":"https://clawhub.ai/j3ffyang/astro-sync","homepage":"https://clawhub.ai/j3ffyang/skills/astro-sync","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/j3ffyang/astro-sync","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/j3ffyang/skills/astro-sync","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"astro-sync technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":null},"stars":null,"forks":null,"downloads":983,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.11","tractionLabel":"983 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:37:10.792Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T22:37:10.855Z","lastCrawledAt":"2026-10-11T22:37:10.792Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T22:37:10.792Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.11","createdAt":"2026-10-11T08:21:31.617Z","changelog":"astro-sync 1.0.11 - Removed the obsolete skill-card.md file for simplicity. - Updated documentation in SKILL.md: - Expanded the instructions for modDatetime: only set when an existing post's content actually changes; not for minor housekeeping. - Clarified sorting rules and when to leave modDatetime untouched. - Added more precise YAML quoting guidance in frontmatter. - No functional changes to commands or workflow.","fileCount":3,"zipByteSize":5453},{"version":"1.0.10","createdAt":"2026-10-11T07:54:03.031Z","changelog":"astro-sync 1.0.10 - Added: When syncing a post from `history/`, always include the base tags `chinese`, `history`, `culture`, and `literature` in addition to the topic tags. - Updated: SKILL.md instructions to clarify this tagging requirement and verification. - Removed: skill-card.md.","fileCount":3,"zipByteSize":5272},{"version":"1.0.9","createdAt":"2026-10-10T03:24:17.379Z","changelog":"- Clarified that the 6-digit `yymmdd` filename prefix is only a file-creation record and must not be used as the post's publish date. - Updated procedure: always use the current time as `pubDatetime` when publishing, not the date from the filename. - Expanded explanations about the risks of setting a future `pubDatetime` (post will be hidden). - Minor clarifications and tighter instructions in the frontmatter and validation steps. - Removed `skill-card.md` (no impact on functionality).","fileCount":3,"zipByteSize":5281},{"version":"1.0.8","createdAt":"2026-10-07T13:49:58.794Z","changelog":"astro-sync 1.0.8 - Updated references in documentation to use the new translation filename convention `*-zh-hans.md` (legacy: `*-chn.md`). - Removed redundant file: `skill-card.md`. - No changes to core logic or functionality.","fileCount":3,"zipByteSize":5187},{"version":"1.0.7","createdAt":"2026-09-22T09:18:18.323Z","changelog":"- Clarified criteria for setting the `featured` flag on posts: reference to AGENTS.md, explicit user approval required, and rotation rules summarized. - Removed `skill-card.md` for a leaner skill bundle. - No changes to workflow, API, or outputs—minor documentation improvements only.","fileCount":3,"zipByteSize":5178},{"version":"1.0.6","createdAt":"2026-09-21T02:52:20.437Z","changelog":"astro-sync 1.0.6 - Enforces double-quoting of any frontmatter values (especially in `description` or `title`) containing YAML-special characters like `: `, preventing build failures. - Updates verification to check for quoted YAML values and switches the recommended verification step to `npx astro build` for reliable error detection. - Removes `skill-card.md` (no longer needed). - Expands documentation and error notes related to YAML frontmatter quoting and blog build reliability.","fileCount":3,"zipByteSize":5077},{"version":"1.0.5","createdAt":"2026-08-24T10:04:07.880Z","changelog":"astro-sync 1.0.5 - Added support for syncing articles from both ai-thoughts and history sources. - Introduced new blog category: culture. - Updated input and error handling to recognize history/docs/ sources and culture category. - For history/culture, added fact-checking and corrections handling before syncing. - Improved image copying logic to handle both source directories. - Removed obsolete skill-card.md file.","fileCount":3,"zipByteSize":4774},{"version":"1.0.4","createdAt":"2026-08-17T09:03:40.584Z","changelog":"- Added requirement that pubDatetime in frontmatter must always use a UTC time that has already passed, to ensure posts appear on the homepage and in recent posts (prevents accidental \"future post\" hiding). - Updated SKILL.md instructions to clarify this time handling; no other logic or capability changes. - Removed the legacy skill-card.md file.","fileCount":3,"zipByteSize":4463}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1779e1n6evsf8stg77rena51983qpyd:astro-sync","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s1779e1n6evsf8stg77rena51983qpyd:astro-sync` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/j3ffyang/astro-sync before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T15:33:58.739Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-j3ffyang-astro-sync/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":null},"readme":"Skill: astro-sync\n\nOwner: j3ffyang\n\nSummary: Convert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io). Use when the user wants to publish or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog, convert Markdown to Astro format, add AstroPaper frontmatter, or move images into src/assets/images/.\n\nTags: latest:1.0.11\n\nVersion history:\n\nv1.0.11 | 2026-10-11T08:21:31.617Z | auto\n\nastro-sync 1.0.11\n\n- Removed the obsolete skill-card.md file for simplicity.\n- Updated documentation in SKILL.md:\n  - Expanded the instructions for modDatetime: only set when an existing post's content actually changes; not for minor housekeeping.\n  - Clarified sorting rules and when to leave modDatetime untouched.\n  - Added more precise YAML quoting guidance in frontmatter.\n- No functional changes to commands or workflow.\n\nv1.0.10 | 2026-10-11T07:54:03.031Z | auto\n\nastro-sync 1.0.10\n\n- Added: When syncing a post from `history/`, always include the base tags `chinese`, `history`, `culture`, and `literature` in addition to the topic tags.\n- Updated: SKILL.md instructions to clarify this tagging requirement and verification.\n- Removed: skill-card.md.\n\nv1.0.9 | 2026-10-10T03:24:17.379Z | auto\n\n- Clarified that the 6-digit `yymmdd` filename prefix is only a file-creation record and must not be used as the post's publish date.\n- Updated procedure: always use the current time as `pubDatetime` when publishing, not the date from the filename.\n- Expanded explanations about the risks of setting a future `pubDatetime` (post will be hidden).\n- Minor clarifications and tighter instructions in the frontmatter and validation steps.\n- Removed `skill-card.md` (no impact on functionality).\n\nv1.0.8 | 2026-10-07T13:49:58.794Z | auto\n\nastro-sync 1.0.8\n\n- Updated references in documentation to use the new translation filename convention `*-zh-hans.md` (legacy: `*-chn.md`).\n- Removed redundant file: `skill-card.md`.\n- No changes to core logic or functionality.\n\nv1.0.7 | 2026-09-22T09:18:18.323Z | auto\n\n- Clarified criteria for setting the `featured` flag on posts: reference to AGENTS.md, explicit user approval required, and rotation rules summarized.\n- Removed `skill-card.md` for a leaner skill bundle.\n- No changes to workflow, API, or outputs—minor documentation improvements only.\n\nv1.0.6 | 2026-09-21T02:52:20.437Z | auto\n\nastro-sync 1.0.6\n\n- Enforces double-quoting of any frontmatter values (especially in `description` or `title`) containing YAML-special characters like `: `, preventing build failures.\n- Updates verification to check for quoted YAML values and switches the recommended verification step to `npx astro build` for reliable error detection.\n- Removes `skill-card.md` (no longer needed).\n- Expands documentation and error notes related to YAML frontmatter quoting and blog build reliability.\n\nv1.0.5 | 2026-08-24T10:04:07.880Z | auto\n\nastro-sync 1.0.5\n\n- Added support for syncing articles from both ai-thoughts and history sources.\n- Introduced new blog category: culture.\n- Updated input and error handling to recognize history/docs/ sources and culture category.\n- For history/culture, added fact-checking and corrections handling before syncing.\n- Improved image copying logic to handle both source directories.\n- Removed obsolete skill-card.md file.\n\nv1.0.4 | 2026-08-17T09:03:40.584Z | auto\n\n- Added requirement that pubDatetime in frontmatter must always use a UTC time that has already passed, to ensure posts appear on the homepage and in recent posts (prevents accidental \"future post\" hiding).\n- Updated SKILL.md instructions to clarify this time handling; no other logic or capability changes.\n- Removed the legacy skill-card.md file.\n\nv1.0.3 | 2026-08-13T03:31:28.012Z | auto\n\n- Switched Astro project check command to npx: use `npx astro check` instead of `pnpm run astro -- check`, as `pnpm` is not installed on this machine.\n- Removed references to `pnpm` for local dev commands.\n- No behavioral changes to sync, conversion, or approval processes.\n- Removed the unused skill-card.md file.\n\nv1.0.2 | 2026-08-08T08:33:55.715Z | auto\n\nastro-sync 1.0.2\n\n- Documentation updated: SKILL.md revised for conciseness and formatting; content unchanged.\n- Obsolete/duplicate documentation removed: skill-card.md deleted.\n\nv1.0.1 | 2026-08-08T06:31:51.778Z | auto\n\n- Source and image directories updated from history/docs/ and history/imgs/ to ai-thoughts/docs/ and ai-thoughts/imgs/.\n- Fact-checking and corrections cross-referencing removed; historical claim verification steps are no longer required.\n- Added expanded definition and procedure for the featured flag, clarifying homepage-worthy post criteria and usage frequency.\n- Minor error handling and input/output path adjustments to reflect the new source folder names.\n\nv1.0.0 | 2026-08-08T06:12:55.784Z | auto\n\nAstro Sync 1.0.0 – Initial release\n\n- Converts Markdown articles into AstroPaper-compatible blog posts for the astro_journal blog.\n- Adds and normalizes AstroPaper frontmatter, including title, publication date, tags, and metadata.\n- Copies images referenced in the article, renaming and relocating them to match blog conventions.\n- Enforces a user approval workflow for publishing, committing, and pushing changes.\n- Integrates fact-checking against corrections documents and requires source verification for historical/literary claims.\n- Handles naming, category assignment, and error cases (missing sources, images, or category mismatches) interactively.\n\nArchive index:\n\nArchive v1.0.11: 3 files, 5453 bytes\n\nFiles: skill-card.md (1776b), SKILL.md (9370b), _meta.json (130b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-zh-hans.md` (legacy `*-chn.md`) translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n  - See `astro_journal/AGENTS.md` → \"Featured posts\" for the full criteria, cap, and rotation rule; never flip `featured` without the user's explicit approval.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic. **When the source is from `history/`** (Chinese history / literature / culture), always also include the four base tags `chinese`, `history`, `culture`, `literature` alongside the topic-specific tags; dedupe against tags already present.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading. The `yymmdd` prefix in the filename is only a **file-creation record** — it does **not** set the publish date (see step 9).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` is the moment the post is **published** — use the current time when astro-sync runs, not the filename date. The `yymmdd` prefix in the filename is only a **file-creation record** and must **not** be used as `pubDatetime`. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when an existing post's **substantive content** actually changes — never for housekeeping-only re-syncs (adding `繁体版` cross-links, formatting, or tag edits). The blog sorts by `modDatetime ?? pubDatetime` (`src/utils/getSortedPosts.ts`), so a fresh `modDatetime` on an old post pushes it to the top of the listing. When in doubt, leave `modDatetime` untouched.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- For a `history/`-sourced post, the `tags` list includes `chinese`, `history`, `culture`, and `literature` (alongside any topic tags).\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1791706891617\n}\n\nFile v1.0.11:skill-card.md\n\n## Description:\n\nConverts a user-selected Markdown article into an AstroPaper blog post with frontmatter and properly linked images for the astro_journal blog.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nBlog authors and developers use this skill to adapt approved Markdown drafts for publication in the astro_journal AstroPaper blog, including frontmatter and image references.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Unreviewed content or image changes could be published to the blog.\n\nMitigation: Confirm the selected article and publishing plan before writing; review the generated post and images, and require separate approval before commit or push.\n\nRisk: Malformed frontmatter or missing images could break a post or leave a deployment unchanged.\n\nMitigation: Check frontmatter quoting and image paths, then run the build using the blog repository's locked local dependencies before publishing.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Guidance]\n\n**Output Format:** [AstroPaper Markdown post with YAML frontmatter, copied images, and a path and image summary]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports postPath and imagesCopied; requires explicit approval before writing or committing and pushing.]\n\n## Skill Version(s):\n\n1.0.11 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.10: 3 files, 5272 bytes\n\nFiles: skill-card.md (1755b), SKILL.md (9033b), _meta.json (130b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-zh-hans.md` (legacy `*-chn.md`) translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n  - See `astro_journal/AGENTS.md` → \"Featured posts\" for the full criteria, cap, and rotation rule; never flip `featured` without the user's explicit approval.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic. **When the source is from `history/`** (Chinese history / literature / culture), always also include the four base tags `chinese`, `history`, `culture`, `literature` alongside the topic-specific tags; dedupe against tags already present.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading. The `yymmdd` prefix in the filename is only a **file-creation record** — it does **not** set the publish date (see step 9).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` is the moment the post is **published** — use the current time when astro-sync runs, not the filename date. The `yymmdd` prefix in the filename is only a **file-creation record** and must **not** be used as `pubDatetime`. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when updating an existing post.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- For a `history/`-sourced post, the `tags` list includes `chinese`, `history`, `culture`, and `literature` (alongside any topic tags).\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1791705243031\n}\n\nFile v1.0.10:skill-card.md\n\n## Description:\n\nConverts a selected Markdown article into an AstroPaper-compatible post for the astro_journal blog, including frontmatter and image references.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nBlog authors and developers use this skill to prepare approved Markdown articles for the astro_journal AstroPaper blog, copy images, and optionally commit and push the resulting post after separate approval.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: An incorrect post or image could be published to the named blog.\n\nMitigation: Review the generated post and copied images before separately approving any commit or push.\n\nRisk: The optional build runs dependencies from the blog checkout.\n\nMitigation: Run the build only in a trusted checkout with expected dependencies.\n\n## Reference(s):\n\n- [astro-sync on ClawHub](https://clawhub.ai/j3ffyang/skills/astro-sync)\n- [Publisher profile](https://clawhub.ai/user/j3ffyang)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Guidance]\n\n**Output Format:** [AstroPaper Markdown post with YAML frontmatter, copied images, and a summary of file paths]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires approval before writing and separate approval before committing or pushing.]\n\n## Skill Version(s):\n\n1.0.10 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.9: 3 files, 5281 bytes\n\nFiles: skill-card.md (2053b), SKILL.md (8659b), _meta.json (129b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-zh-hans.md` (legacy `*-chn.md`) translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n  - See `astro_journal/AGENTS.md` → \"Featured posts\" for the full criteria, cap, and rotation rule; never flip `featured` without the user's explicit approval.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading. The `yymmdd` prefix in the filename is only a **file-creation record** — it does **not** set the publish date (see step 9).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` is the moment the post is **published** — use the current time when astro-sync runs, not the filename date. The `yymmdd` prefix in the filename is only a **file-creation record** and must **not** be used as `pubDatetime`. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when updating an existing post.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1791602657379\n}\n\nFile v1.0.9:skill-card.md\n\n## Description:\n\nConverts and polishes a Markdown article into an AstroPaper-compatible post for the astro_journal blog, including frontmatter and image references.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nBlog authors and developers use this skill to prepare an explicitly selected Markdown article for the astro_journal AstroPaper blog, copy its images, and optionally commit and publish it after approval.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Publishing the wrong article or settings, or pushing content before it is ready.\n\nMitigation: Confirm the target article, category, draft status, featured status, and tags before writing; require separate approval before committing or pushing.\n\nRisk: A future publication timestamp can hide a post from the blog's recent-post views.\n\nMitigation: Use the actual current UTC publication time rather than the date in the source filename, and check the resulting frontmatter.\n\nRisk: An Astro build via npx may resolve packages unexpectedly.\n\nMitigation: Prefer a repository-local build command or skip the optional build if package-resolution risk is unacceptable.\n\n## Reference(s):\n\n- [astro-sync ClawHub release](https://clawhub.ai/j3ffyang/skills/astro-sync)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Guidance]\n\n**Output Format:** [AstroPaper Markdown post with YAML frontmatter, copied image files, and a summary of their paths]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports the post path and copied images; commit and push require separate user approval.]\n\n## Skill Version(s):\n\n1.0.9 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.8: 3 files, 5187 bytes\n\nFiles: skill-card.md (2032b), SKILL.md (8409b), _meta.json (129b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-zh-hans.md` (legacy `*-chn.md`) translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n  - See `astro_journal/AGENTS.md` → \"Featured posts\" for the full criteria, cap, and rotation rule; never flip `featured` without the user's explicit approval.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when updating an existing post.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1791380998794\n}\n\nFile v1.0.8:skill-card.md\n\n## Description:\n\nConverts and lightly polishes a chosen Markdown article into an AstroPaper-compatible blog post, including frontmatter and image references.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nBlog authors and editors use this skill to prepare a selected Markdown article for the astro_journal AstroPaper blog, including post metadata and locally referenced images. It requires approval before writing or publishing.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: An incorrect category, tags, or draft and featured settings could publish a post in the wrong form or location.\n\nMitigation: Confirm the chosen article and publishing settings with the user and review changed files before approving writes.\n\nRisk: Committing or pushing before review could publish unintended changes.\n\nMitigation: Require separate approval for commit and push, and inspect the post and images first.\n\nRisk: Invalid frontmatter or broken image references could prevent the post from appearing correctly.\n\nMitigation: Check frontmatter and image paths, then run the local locked project build where possible.\n\n## Reference(s):\n\n- [Astro Sync on ClawHub](https://clawhub.ai/j3ffyang/skills/astro-sync)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Image files, Text guidance]\n\n**Output Format:** [AstroPaper Markdown post with YAML frontmatter, copied images, and a text summary of the resulting paths]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Writes only after approval; committing and pushing require separate approval.]\n\n## Skill Version(s):\n\n1.0.8 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.7: 3 files, 5178 bytes\n\nFiles: skill-card.md (2069b), SKILL.md (8385b), _meta.json (129b)\n\nFile v1.0.7:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n  - See `astro_journal/AGENTS.md` → \"Featured posts\" for the full criteria, cap, and rotation rule; never flip `featured` without the user's explicit approval.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when updating an existing post.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1790068698323\n}\n\nFile v1.0.7:skill-card.md\n\n## Description:\n\nConverts and polishes Markdown articles into AstroPaper-compatible blog posts for the astro_journal site, including frontmatter and image handling.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use this skill to sync approved Markdown drafts into an AstroPaper blog while applying required naming, frontmatter, image, and publication conventions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can modify the configured Astro blog repository by creating post files and copying images.\n\nMitigation: Review the proposed target path, frontmatter, body, and copied images before approving any write.\n\nRisk: Publishing changes could be committed and pushed after files are written.\n\nMitigation: Require a separate explicit approval before staging, committing, or pushing changes.\n\nRisk: Incorrect frontmatter, filenames, or image references can prevent the blog post from appearing correctly.\n\nMitigation: Verify category, filename, required AstroPaper frontmatter, quoted YAML values, image paths, and the optional Astro build before release.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/j3ffyang/skills/astro-sync)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Shell commands, Guidance]\n\n**Output Format:** [Markdown post files with AstroPaper YAML frontmatter, copied image assets, and concise status guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports the created post path and copied images; requires explicit approval before writing, committing, or pushing.]\n\n## Skill Version(s):\n\n1.0.7 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.6: 3 files, 5077 bytes\n\nFiles: skill-card.md (2002b), SKILL.md (8223b), _meta.json (129b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it. `modDatetime` is optional and only set when updating an existing post.\n\n   **MUST quote any frontmatter value containing YAML-special characters — especially `: ` (colon + space).** An unquoted `description: Foo: bar` is parsed as a mapping and fails the build at content sync (`bad indentation of a mapping entry` / `mapping values are not allowed in this context`); Cloudflare then keeps the **previous** deployment, so the post never appears and search can't find it. Wrap the whole value in double quotes: `description: \"Foo: bar\"`. Applies to every field (`title`, `description`, …). This has recurred several times.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Any frontmatter value containing `: ` (or other YAML-special characters) is double-quoted.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional but recommended: run `npx astro build` in the blog repo — it reproduces content-sync/YAML errors (which `astro check` can miss) and confirms the post renders into `dist/`. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789959140437\n}\n\nFile v1.0.6:skill-card.md\n\n## Description:\n\nConvert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io), including Astro frontmatter and image path handling.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use this skill to convert approved Markdown drafts into AstroPaper blog posts, copy and rewrite referenced images, and prepare the post for review before publishing.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill edits a named blog repository and may prepare content for publication.\n\nMitigation: Use it only for the intended AstroPaper blog workflow, require explicit user approval before writing, and require separate approval before any commit or push.\n\nRisk: Generated posts or copied images may contain formatting, frontmatter, or content issues.\n\nMitigation: Review generated posts and images before publishing, and run the blog build with trusted locked dependencies where possible.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/j3ffyang/skills/astro-sync)\n- [Publisher profile](https://clawhub.ai/user/j3ffyang)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with generated AstroPaper-compatible post content, file paths, and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces a created post path and copied image list; commits and pushes only after explicit user approval.]\n\n## Skill Version(s):\n\n1.0.6 (source: release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.5: 3 files, 4774 bytes\n\nFiles: skill-card.md (2036b), SKILL.md (7481b), _meta.json (129b)\n\nFile v1.0.5:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Fact-check before sync (for history/culture articles).** If syncing from `history/docs/` and a matching corrections doc exists (e.g. `docs/260808-corrections-by-citation.md`), confirm the article's 已修正 (confirmed fixes) are already applied, and surface any 待核实 (unverified) items to the user. Historical/literary claims must be verified against at least two independent reliable sources.\n6. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n7. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n8. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `imgs/` (in `ai-thoughts` or `history`) into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n9. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it.\n   `modDatetime` is optional and only set when updating an existing post.\n10. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n11. **Report** `postPath` and `imagesCopied` to the user.\n12. **Commit & push (only after approval):** ask the user explicitly whether\n    to commit. On approval, stage the post and any new images in\n    `astro_journal`, commit with a concise message, and push to `origin`.\n    Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional: run `npx astro check` in the blog repo to confirm no content/config errors. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy`, `culture` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1787565847880\n}\n\nFile v1.0.5:skill-card.md\n\n## Description:\n\nConvert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog, including AstroPaper frontmatter and local image handling.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use this skill to sync approved Markdown drafts into an AstroPaper blog, lightly polish content, add required frontmatter, and copy referenced images into the blog asset tree.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can read local article drafts and write posts or images into a named Astro blog repository.\n\nMitigation: Install only for the intended blog workflow, require explicit user approval before writes, and review the generated post before approving any commit or push.\n\nRisk: History or culture posts may contain factual or citation-sensitive claims.\n\nMitigation: Use the skill's fact-checking and corrections-handling steps for history/culture sources before syncing content.\n\nRisk: Optional Astro validation may execute project-local tooling.\n\nMitigation: Run checks only in a locked local Astro installation when validation is needed.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Shell commands, Configuration]\n\n**Output Format:** [Markdown guidance with file paths, generated AstroPaper post content, image-copy results, and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires explicit user approval before writing, committing, or pushing blog changes.]\n\n## Skill Version(s):\n\n1.0.5 (source: server release evidence and release changelog)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.4: 3 files, 4463 bytes\n\nFiles: skill-card.md (1915b), SKILL.md (6983b), _meta.json (129b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/) to the Astro blog, convert\n  Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish from `ai-thoughts` to `astro_journal` and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md`). Required. If the user only names an article, locate it in `ai-thoughts/docs/` by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, or `philosophy`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n6. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n7. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `ai-thoughts/imgs/` into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n8. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n   - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now. **Always use a UTC time that has already passed** — the blog's `postFilter` hides posts whose `pubDatetime` is in the future (even by minutes). A future time means the post won't appear on the homepage or in recent posts, though search may still index it.\n   `modDatetime` is optional and only set when updating an existing post.\n9. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n 10. **Report** `postPath` and `imagesCopied` to the user.\n 11. **Commit & push (only after approval):** ask the user explicitly whether\n     to commit. On approval, stage the post and any new images in\n     `astro_journal`, commit with a concise message, and push to `origin`.\n     Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional: run `npx astro check` in the blog repo to confirm no content/config errors. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files in `ai-thoughts/docs/` and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1786957420584\n}\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nConvert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io).\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use this skill to convert an explicitly approved Markdown draft into an AstroPaper blog post, including frontmatter, image copying, path rewriting, and publication-ready verification steps.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can write blog files and prepare publication changes in a local Astro repository.\n\nMitigation: Require explicit user approval before writing, committing, or pushing, and review the target category, tags, draft/featured state, generated post path, and copied images.\n\nRisk: A future pubDatetime can prevent a published post from appearing in recent-post listings.\n\nMitigation: Use a UTC pubDatetime that has already passed and verify the generated frontmatter before publication.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/j3ffyang/skills/astro-sync)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with file paths, frontmatter, verification steps, and optional shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports the created post path and copied image files; commits and pushes only after explicit user approval.]\n\n## Skill Version(s):\n\n1.0.4 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.3: 3 files, 4250 bytes\n\nFiles: skill-card.md (1726b), SKILL.md (6727b), _meta.json (129b)\n\nFile v1.0.3:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/) to the Astro blog, convert\n  Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish from `ai-thoughts` to `astro_journal` and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md`). Required. If the user only names an article, locate it in `ai-thoughts/docs/` by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, or `philosophy`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n6. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n7. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `ai-thoughts/imgs/` into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n8. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T12:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now.\n   `modDatetime` is optional and only set when updating an existing post.\n9. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n 10. **Report** `postPath` and `imagesCopied` to the user.\n 11. **Commit & push (only after approval):** ask the user explicitly whether\n     to commit. On approval, stage the post and any new images in\n     `astro_journal`, commit with a concise message, and push to `origin`.\n     Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional: run `npx astro check` in the blog repo to confirm no content/config errors. Use `npx` directly — `pnpm` is not installed on this machine and `pnpm run ...` fails with \"command not found\"; `npx` resolves the local `astro` binary fine.\n\n## Error Handling\n\n- **Source not found**: list candidate files in `ai-thoughts/docs/` and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1786591888012\n}\n\nFile v1.0.3:skill-card.md\n\n## Description:\n\nConvert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io).\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use this skill to convert approved Markdown drafts into AstroPaper blog posts, add required frontmatter, copy referenced images, and prepare publication changes after explicit user approval.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can write blog post files and image assets to a specific Astro blog checkout.\n\nMitigation: Confirm that the configured astro_journal and source article paths are the intended repositories before allowing writes.\n\nRisk: The skill can commit and push publication changes after approval.\n\nMitigation: Review the generated post, copied images, and staged changes before approving commit or push.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [markdown, files, shell commands, guidance]\n\n**Output Format:** [Markdown files, copied image files, and concise status messages with approval prompts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports the created post path and copied or missing images; commit and push commands are approval-gated.]\n\n## Skill Version(s):\n\n1.0.3 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.2: 3 files, 4190 bytes\n\nFiles: skill-card.md (1781b), SKILL.md (6575b), _meta.json (129b)\n\nFile v1.0.2:SKILL.md\n\n---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/) to the Astro blog, convert\n  Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish from `ai-thoughts` to `astro_journal` and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md`). Required. If the user only names an article, locate it in `ai-thoughts/docs/` by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, or `philosophy`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-chn.md` translations of an already-published post.\n  - When the user doesn't specify, ask which it is (per Procedure step 2);\n    never auto-pick `true`.\n- `tags` — List of lowercase hyphen-separated tags. Optional. Default derived from the article topic.\n\n## Outputs\n\n- `postPath` — Path to the created post, e.g. `src/data/blog/tech/260803-ollama-to-llamacpp.md`.\n- `imagesCopied` — List of image files copied into `src/assets/images/`.\n\n## Procedure\n\n1. **Wait for the user to point out the article** to sync. Do not start until they name it explicitly.\n2. **Confirm the plan** with the user: target category, `draft`/`featured`, and tags. Get their go-ahead before writing anything to `astro_journal`.\n3. **Locate the blog**: confirm `astro_journal` is checked out at `/home/jeff/pool/git/astro_journal`.\n4. **Read the source** article from `source`. If it has no frontmatter, infer the title from the first `#`/`##` heading and the date from the filename (or today if none).\n5. **Determine the filename**: `yymmdd-lowercase-slug.md`. Normalize the slug: lowercase, hyphens only, strip underscores/camelCase and any existing date prefix/timestamp. Keep the 6-digit `yymmdd` date prefix.\n6. **Polish** (light): fix grammar/spelling/clarity in English; preserve code blocks, inline code, and technical terms verbatim. Do not rewrite substance.\n7. **Copy images**: for every `../imgs/<file>` reference in the source, copy the image from `ai-thoughts/imgs/` into `src/assets/images/`, normalizing the filename to lowercase-hyphens with a 6-digit `yymmdd` prefix. Rewrite the reference in the post to `../../../assets/images/<file>`.\n8. **Write frontmatter** (AstroPaper schema):\n\n   ```yaml\n   ---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T12:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---\n   ```\n\n   `pubDatetime` comes from the source date if present, otherwise now.\n   `modDatetime` is optional and only set when updating an existing post.\n9. **Write the post** to `src/data/blog/<category>/<filename>` with the frontmatter followed by the polished body.\n 10. **Report** `postPath` and `imagesCopied` to the user.\n 11. **Commit & push (only after approval):** ask the user explicitly whether\n     to commit. On approval, stage the post and any new images in\n     `astro_journal`, commit with a concise message, and push to `origin`.\n     Without approval, leave the changes uncommitted and say so.\n\n## Verification\n\n- File is in `src/data/blog/<category>/` and named `yymmdd-lowercase-slug.md` (lowercase, hyphens only, 6-digit date prefix).\n- Frontmatter contains at least `author`, `pubDatetime`, `title`, `tags`, `description`; `draft`/`featured` present when applicable.\n- Every image reference in the post points to an existing file in `src/assets/images/` (verify with a glob/ls).\n- No `../imgs/` references remain in the post.\n- No hardcoded `/posts/...` links were introduced.\n- If committed: the post and new images are staged together, and `origin/main` is up to date.\n- Optional: run `pnpm run astro -- check` in the blog repo to confirm no content/config errors.\n\n## Error Handling\n\n- **Source not found**: list candidate files in `ai-thoughts/docs/` and ask which to use.\n- **Image missing**: skip it, note it in `imagesCopied` as missing, and tell the user the reference will be broken.\n- **Category invalid**: list `tech`, `travel`, `photo`, `philosophy` and ask.\n- **Filename collision**: if a post already exists at the target path, stop and ask whether to overwrite, use `modDatetime`, or pick a new slug.\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1786178035715\n}\n\nFile v1.0.2:skill-card.md\n\n## Description:\n\nConvert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io).\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and blog maintainers use astro-sync to convert an explicitly selected Markdown article into an AstroPaper-compatible blog post, including frontmatter, filename normalization, and image relocation for a local Astro journal repository.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Generated post or image changes may publish or update public blog content if committed and pushed.\n\nMitigation: Review the generated post and image changes before approving any commit or push.\n\nRisk: An incorrect source article, category, draft status, featured status, or tag set could place content in the wrong publishing context.\n\nMitigation: Confirm the selected article, category, draft status, featured status, and tags before writing to the blog repository.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Shell commands, Guidance]\n\n**Output Format:** [Markdown files with YAML frontmatter, copied image assets, and concise status guidance.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires explicit user approval before writing, committing, or pushing.]\n\n## Skill Version(s):\n\n1.0.2 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.","readmeExcerpt":"Skill: astro-sync Owner: j3ffyang Summary: Convert and polish a Markdown article into AstroPaper-compatible post format for the astro_journal blog (everbox.io). Use when the user wants to publish or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog, convert Markdown to Astro format, add AstroPaper frontmatter, or move images into src/assets/images/. Tags: latest:1.0.11 Version history: ","codeSnippets":[],"executableExamples":[{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"},{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"},{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 publish time, e.g. 2026-10-10T03:22:32.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"},{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"},{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"},{"language":"yaml","snippet":"---\n   author: Jeff Yang\n   pubDatetime: <ISO-8601 datetime, e.g. 2026-08-03T08:00:00.000Z>\n   title: <Post title>\n   tags:\n     - <tag1>\n     - <tag2>\n   description: <One-line summary>\n   featured: false\n   draft: false\n   ---"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: astro-sync\ndescription: >\n  Convert and polish a Markdown article into AstroPaper-compatible post format\n  for the astro_journal blog (everbox.io). Use when the user wants to publish\n  or sync an article (e.g. from ai-thoughts/docs/ or history/docs/) to the Astro blog,\n  convert Markdown to Astro format, add AstroPaper frontmatter, or move images into\n  src/assets/images/.\n---\n\n# Astro Sync\n\nConvert a polished Markdown draft into a ready-to-publish AstroPaper post in the `astro_journal` repo (`/home/jeff/pool/git/astro_journal`), copying and rewriting image references to match the blog's conventions.\n\n## Approval gate — read before anything else\n\n- **Never sync, write, or publish anything without explicit user approval.** This skill converts on demand only; it does not run automatically.\n- The **user decides which article** is ready to sync and publish (from `ai-thoughts` or `history` to `astro_journal`) and **points it out explicitly**. Do not guess, propose candidates, or sync articles on your own.\n- When the user names an article, still confirm the plan (target category, draft/featured, tags) before writing to the blog repo.\n- **Never commit or push without explicit user approval.** After writing the post, ask for go-ahead first; only then stage the post + new images, commit, and push. The blog repo (`astro_journal`) has a single remote `origin`.\n\n## Blog conventions (source of truth: astro_journal/AGENTS.md)\n\n- Posts live in `src/data/blog/<category>/` — categories: `tech`, `travel`, `photo`, `philosophy`, `culture`. **Not** `src/content/`.\n- Filenames: `yymmdd-lowercase-slug.md` — 6-digit date prefix, lowercase, hyphens only. No underscores, camelCase, or 10-digit timestamps.\n- URLs derive from the filename; never hardcode `/posts/...` links.\n- Frontmatter follows the AstroPaper schema (see below).\n- Images live in `src/assets/images/`, referenced by literal relative path `../../../assets/images/<file>` from a post in `src/data/blog/<category>/`.\n- Renaming a **published** post requires adding a redirect (old URL → new URL) to `postRedirects` in `astro.config.ts`.\n- `.orig` files anywhere in the repo are intentional references — never modify or delete them.\n\n## Inputs\n\n- `source` — Path to the source Markdown article (e.g. `ai-thoughts/docs/260803-ollama-to-llamacpp.md` or `history/docs/260629-luoshenfu-literary-analysis.md`). Required. If the user only names an article, locate it by slug or date.\n- `category` — Blog category: `tech`, `travel`, `photo`, `philosophy`, or `culture`. Optional. Default `tech`.\n- `draft` — `true`/`false`. Optional. Default `false` (published).\n- `featured` — `true`/`false`. Optional. Default `false`.\n  - `true`: homepage-worthy — a signature/opinion essay, deep dive, or\n    milestone post that defines the blog's voice. Use sparingly (aim ≤ 20%\n    of posts) so the homepage stays curated.\n  - `false`: everything else — how-tos, quick notes, release/changelog\n    posts, and `*-zh-hans.md` (legacy `*-chn.m"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn712ccqddtt62rq2w5tw18rr5825299\",\n  \"slug\": \"astro-sync\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1791706891617\n}"},{"path":"skill-card.md","content":"## Description:\n\nConverts a user-selected Markdown article into an AstroPaper blog post with frontmatter and properly linked images for the astro_journal blog.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[j3ffyang](https://clawhub.ai/user/j3ffyang)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nBlog authors and developers use this skill to adapt approved Markdown drafts for publication in the astro_journal AstroPaper blog, including frontmatter and image references.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Unreviewed content or image changes could be published to the blog.\n\nMitigation: Confirm the selected article and publishing plan before writing; review the generated post and images, and require separate approval before commit or push.\n\nRisk: Malformed frontmatter or missing images could break a post or leave a deployment unchanged.\n\nMitigation: Check frontmatter quoting and image paths, then run the build using the blog repository's locked local dependencies before publishing.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Files, Guidance]\n\n**Output Format:** [AstroPaper Markdown post with YAML frontmatter, copied images, and a path and image summary]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Reports postPath and imagesCopied; requires explicit approval before writing or committing and pushing.]\n\n## Skill Version(s):\n\n1.0.11 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1514,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T22:37:10.855Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T15:33:58.741Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}