starchild-ai-agent/official-skills7 files

Community Publish

|

Specification
Skill ID
starchild-ai-agent/official-skills/community-publish
Publisher
starchild-ai-agent
Repository
official-skills
Installs
0
Files
7
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

starchild-ai-agent/official-skills/community-publishInstalls these files
  • SKILL.md
  • __init__.py
  • exports.py
  • lib/gateway.py
  • lib/install.py
  • lib/manifest.py
  • lib/validate.py

What this skill tells the agent

Two concepts: PUBLISH vs LIST — never confuse them

This skill handles two fundamentally different concepts. Mixing them up is the #1 source of wrong answers.

ConceptWhat it meansFunctions
PUBLISH (发布)Make something accessible — a URL works, or code is on GitHubpublish_preview, unpublish_preview, list_published_previews, open_source, remove_open_source, list_open_source, get_open_source, fork, validate_open_source
LIST (上架)Make something discoverable/purchasable on the marketplaceFree: list_in_dashboard, unlist_from_dashboard, delete_listing, get_listing_status<br>Paid: create_paid_service, submit_for_review, get_review_status, publish_service, unpublish_service, list_my_services, get_service, update_service, delete_service, restore_service<br>Cover: upload_cover_image<br>Browse + consumer: explore_services, get_service_detail, get_service_pricing, get_service_reviews, write_service_review, favorite_service, unfavorite_service, get_favorite_services, get_user_services, get_service_earnings, get_earnings_summary, get_service_tags, get_featured_services<br>Projects query: explore_projects, my_projects, favorite_projects, get_tab_counts, get_popular_tags, get_user_projects, favorite_project, unfavorite_project

Publishing does NOT auto-list. publish_preview() only allocates the URL. open_source() only pushes code. Neither makes the project discoverable on the marketplace — that requires a separate, deliberate LIST call.

Listing has two flows

FlowWhen to useReview?Pricing?Functions
Free listingFree project, show on /projects galleryNoNolist_in_dashboard()
Paid listingCharge for access via x402Required (6-check review, must pass before publishing)Yes (USDC/USDG/USDC(Solana) on platform networks — default Base+Monad+Robinhood+X Layer+Solana, follows all)create_paid_service() → submit_for_review() (required) → publish_service()
`POST /api/services` no longer accepts `service_type: "free_project"`. Free listing is done by list_in_dashboard() (the project gallery flow). Paid listing uses create_paid_service() + review + publish (the service API flow).

Limited-time free promo ≠ this skill

After a paid service is listed, the owner may run a time-window free promotion (free_promo_start / free_promo_end). That is not marketplace listing work and is not implemented here.

ConceptWhat it isWhere
Free listingFree project on /projects gallerythis skill → list_in_dashboard()
free_trial_countN free calls before charge (pay_per_use only)this skill → create_paid_service(..., free_trial_count=N)
Limited-time free promoCalendar window: amount-0 verify, no settle/debitx402 skill → skills/x402/references/selling.md section Limited-time free promotion

If the user asks to “开限时免费 / free promo / free for N days” on an already-paid listing: read the x402 skill (self-check P1–P5, then PUT free-promo). Do not invent APIs in community-publish or confuse it with free_trial_count.


Visibility model — read this before answering "can others see it?"

A project's "publicness" is three orthogonal switches, not one:

SwitchOff stateOn stateFlipped by
URL accessVisiting the URL returns 404URL works for anyone who has the linkpublish_preview / unpublish_preview
Gallery discoverabilityNot on /projects galleryAppears in the gallerylist_in_dashboard / unlist_from_dashboard
Marketplace listingNot on the Service MarketplaceDiscoverable + purchasablecreate_paid_service + publish_service / unpublish_service

A project can be in any combination. Never collapse these into "is it public yet".

Status questions are read-only operations. Whenever the user asks:

  • "is it visible / public / discoverable yet?"
  • "上架了吗 / 在 dashboard 上吗 / 别人能看到吗"
  • "is the listing live?"

The authoritative answer comes ONLY from a fresh get_listing_status(slug) (free) or get_review_status(service_id) (paid) call. Do NOT infer from past actions.


Project types — three only

typeWhat it isEligible for publish_preview()?
taskScheduled cron/interval jobNo (no HTTP port)
serviceLong-running HTTP service (dashboard, API, page)Yes
scriptOne-shot scriptNo (no HTTP port)

Routing — match user intent to the right action

A. Status intents — user wants to know current state

Sample phrasingAction
"is it visible / public / discoverable / live?"get_listing_status(slug)
"上架了吗 / 在 dashboard 上吗 / 别人能不能看到"get_listing_status(slug)
"what URLs do I have published?" / "我发布了哪些"list_published_previews()
"what's open-sourced?" / "都有哪些开源代码"list_open_source(...)
"我的服务" / "my services" / "我的付费服务"list_my_services()
"审核状态" / "审核通过了吗" / "review status"get_review_status(service_id)

B. Action intents — user wants to change state

Sample phrasingActionNotes
"publish" / "share" / "make public" / "公开" / "发布" (no qualifier)publish_preview(preview_id)Allocates the URL only. Listing is NOT auto-flipped.
"list on the dashboard" / "上架" / "show on community" / "make discoverable" / "发到广场"list_in_dashboard(slug)Free listing. Requires the preview to already exist.
"上架付费服务" / "make this a paid service" / "上架到服务市场(付费)"create_paid_service(...) → submit_for_review() (recommended) → publish_service()Paid listing. Needs x402 config first.
"publish AND list" / "发布并上架"publish_preview() THEN list_in_dashboard()Two separate calls in order.
"remove from dashboard" / "下架" / "unlist" / "hide from gallery"unlist_from_dashboard(slug)Free listing only. Soft-unlist (sets is_public=false, review_status='unlisted', preserves stats). Preview URL stays alive.
"下架付费服务" / "unpublish service"unpublish_service(service_id)Paid listing only.
"open source" / "open-source the code" / "开源代码"open_source(project_dir)Pushes code to GitHub. Does NOT list.
"unpublish the URL" / "take down the link" / "停止服务"unpublish_preview(slug)Stops the preview container service only. Does NOT affect listing state (is_public/review_status unchanged). URL becomes inaccessible (404).
"remove the open source" / "delete from GitHub"remove_open_source(slug)
"fork" / "install someone's project"fork(source)
"提交审核" / "submit for review"submit_for_review(service_id)Paid only. Required — must pass before publishing
"发布服务" / "publish my service"publish_service(service_id)Paid only, requires approved or unlisted state
"更新服务" / "update service"update_service(service_id, ...)Paid only
"删除服务" / "delete service"delete_service(service_id)Paid only
"删除项目" / "delete listing" / "permanently remove from marketplace"delete_listing(slug)Free listing only. Permanently deletes the listing row AND the community_slugs record. URL becomes inaccessible (404). Removes from both explore and my-projects. Use unlist_from_dashboard() to hide without deleting.
Ambiguous after rereadingAsk one question"你是要 (a) 发布公开 URL,(b) 免费上架到广场,(c) 付费上架到服务市场,还是 (d) 开源代码?"

Cross-link via publisher: binding

When the same project has BOTH a public URL AND open-sourced code, you want them paired so the frontend renders "View Source" on the listing card and "Visit Live Demo" on the code card. This skill drives that pairing through one explicit binding in project.yaml.

How to declare the binding

Add a publisher: block to project.yaml:

Use this skill in a project

Open any RiverX project, search the Skills panel for starchild-ai-agent/official-skills/community-publish, and install it in one click.

Use this skill