Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.
Coding
publish-skills
Try itPublish SKILL.md files to ClawHub (clawhub.ai) and diagnose publish failures across the three skill repos (history, ai-custom-skills, ai-thoughts). Use when the user wants to publish skills to ClawHub, manually trigger a publish, check why a publish failed or was skipped, or understand the ClawHub skill sync pipeline.
What it does
Publish and maintain the ClawHub skill registry. All skills are published to a single ClawHub account () through GitHub Actions; skills are never published manually.
The skill document
ClawHub Skill Publish
Publish and maintain the ClawHub skill registry. All skills are published to a single ClawHub account (j3ffyang) through GitHub Actions; skills are never published manually.
Scope
Skills come from three repos under the negtivSpace superproject. Each repo has its own .github/workflows/clawhub-skill-sync.yml that publishes its skills to ClawHub:
history/— publishes only.opencode/skills/chinese-history-literature-culture(via askill_pathentry). Theastro-syncskill inhistory/.opencode/skills/is local-only: it stays in the repo for opencode to load, but is not published to ClawHub.ai-thoughts/.opencode/skills/—astro-sync,custom-infographic,publish-skills,resize-for-banner,translate-to-chn. All are published via a glob over.opencode/skills/*/SKILL.md, sopublish-skillsself-publishes like any other skill.ai-custom-skills/— rootsopenclaw/,hermes/,claude-code/, plus the nestedclaude-code/perplexity-downloader/perplexity-downloaderhandled via a matrixskill_pathentry. Data folders without aSKILL.md(e.g.openclaw/twitter-bookmarks-exporter) are skipped automatically.
Single-source rule — read before anything else
- Only the
j3ffyang/*copies of these repos publish. Thenegtivspace/*copies keep the same workflow file (mirrors stay in sync) but are a no-op: every job is guarded withgithub.repository_owner == 'j3ffyang'. - Both copies are pushed on every change, so both repos run the workflow on push. Without the owner guard they would both publish to the same ClawHub account and race, producing
Version X already existscollisions. - Never create or run a manual publish path that could double-publish to ClawHub. If a skill edit is needed, edit it in the working repo, push to both remotes, and let the workflow publish once.
clawhub_token(thej3ffyangClawHub token) is set as a repo secret in all six repo copies; only thej3ffyangones ever use it.
Pipeline
- Workflow per repo:
clawhub-skill-sync.ymlwith adry-runjob (pull requests only) and apublishjob (pushes / workflow_dispatch), both calling the reusable workflowopenclaw/clawhub/.github/workflows/skill-publish.ymlpinned to tagv0.23.3(no@v1tag exists). - Both jobs need
permissions: {contents: read, id-token: write}; callers of the reusable workflow fail withstartup_failure(id-token: none) if the job-level permission is missing. - Publishing uses the caller repo's checkout; a new or changed skill is detected by fingerprint. Unchanged skills are skipped (
alreadySynced).
Status & version semantics
unchanged/alreadySynced— fingerprint matches ClawHub; nothing to do.- New skill — first publish is version
1.0.0. - Changed skill — next patch version of the latest published version.
Error: Version X.Y.Z already exists. Increment the version number...— the skill is already on ClawHub at that version (usually from a prior publish or a dual-remote race). Do not re-publish; the workflow will report italreadySyncedon the next run.Invalid publish output: 'pending-publication'— a false alarm. The publish actually succeeded; the upstream workflow's status map (v0.23.3) does not recognize thepending-publicationstatus string and reports it as failed. Verify with the skills API before assuming a problem.
Procedure
- Add or edit a skill: create/update the
SKILL.md(and sibling files) in the correct root of the correct repo. Respect that repo's conventions (e.g.history/AGENTS.mdfilename rules). Do not rename or convert skills; publish them as-is. - Push to both remotes of the submodule (
j3ffyangandnegtivspace). The push toj3ffyang/*triggers the publish; thenegtivspace/*run is a no-op by design. - Wait for the
j3ffyang/*workflow run to finish; check the publish summary for the affected slug. - Manually trigger a publish (e.g. after a failed run) via
workflow_dispatchon thej3ffyang/*repo. - Verify on ClawHub (read-only, API):
curl -s -H "Authorization: Bearer $CLH_TOKEN" https://clawhub.ai/api/v1/skills/— thelatestVersionandowner.handlefields confirm what is live.
Error Handling
Version X.Y.Z already exists— confirm the skill already exists (skills API) and let the next run mark italreadySynced; if the local content is genuinely newer, the workflow's next-patch bump handles it on its own.pending-publicationreported as failure — treat as success; verify via the skills API.startup_failure/id-token: none— the caller job is missingpermissions: {contents: read, id-token: write}; add it.- Nested skill not found — the matrix
skill_pathmust point at the folder containing theSKILL.md(double-nested folders need the full path). - Slug collision —
astro-syncexists in bothhistoryandai-thoughtswith different content.ai-thoughtspublishes it (canonical);history's copy is local-only, kept out of ClawHub viaskill_path. Never publish the same slug from two repos to the same owner. - Protected slug namespace — ClawHub rejects any slug starting with
clawhub-or ending with-clawhub(Error: "... uses the protected "clawhub" slug namespace"). This skill wentskill-publish→clawhub-publish(rejected) →publish-skills. The originalskill-publishslug is ambiguous across owners (other users have their own), sopublish-skillsis the canonical, unique slug; the legacy@j3ffyang/skill-publishstays on ClawHub (no delete-via-push). - Token missing — publish fails without
clawhub_token; it must be set as a secret on thej3ffyang/*repo.
Verification
- All three workflow files carry
github.repository_owner == 'j3ffyang'guards on both jobs. actionlintpasses on everyclawhub-skill-sync.yml.- Every expected slug appears in the
j3ffyang/*run's publish summary asalreadySyncedorpublished. - Skills API returns
owner.handle == 'j3ffyang'and the expectedlatestVersionfor every published skill.
Related skills
Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.
Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.
Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.
Write, debug, and tune Playwright specs with locator strategy, trace diagnosis, and CI-aware timeouts.
More from j3ffyang
Browse all skillsPolish a technical blog draft into an 800–1000 word, 3–4 section zh-CN article, preserve technical terms/code, and generate consistent hero + per-section image prompts when the user asks to polish and translate a blog with images.
Generate video from supplied image using Veo-3.0 async API. Gemini vision analyzes image, Veo creates video via predictLongRunning. All outputs in ~/.openclaw/workspace/tibetanProc/ with yymmddHHMM prefix.
Read a plain Markdown file (e.g. 260321_openclawConfig.md), generate header and section images using the default OpenClaw image model and API key from ~/openclaw/.env, create a new *_img.md copy with embedded PNGs, and move all generated images into an img/ folder next to the original file.
Polish a technical blog draft into a 1000–1200 word, 4–5 section en-US article, preserve technical terms/code, and generate one consistent hero image prompt.
Help the user draft, review, and polish blog posts in Markdown, keeping the original languages and informal tone.
Generate a daily AI news newsletter from fresh web sources. Use when the user asks for a current AI digest, AI news roundup, curated newsletter, or daily AI...