English | ็ฎไฝไธญๆ
Source of truth for the public syscity marketplace catalog. Every expert and skill lives in its own directory under entries/<id>/; merging to main makes CI pack and publish it to the live marketplace.
Live catalog: https://api.syscity.net/catalog.json ยท consumed by the syscity app's built-in marketplace
entries/<id>/ โ source of truth โ humans only edit here (one PR per entry)
โ scripts/pack.mjs + publish.mjs (CI on merge)
โผ
R2 archives + D1 catalog_entries โ runtime store (catalog.json + /archives routes)
โ
โโโ index/catalog.json โ generated aggregate for humans (never hand-edited)
- The repo owns content: SOUL/SKILL bodies, names and descriptions (including Chinese), categories, licenses, provenance.
- Runtime fields stay out of the repo:
visibility,credits_per_use,required_planare managed in the cloud viaops catalog setโ PRs don't touch them. - The live
catalog.jsoncontract is unchanged (engine full-sync);index/catalog.jsonin this repo is only a mirror view.
entries/ws-backend-architect/
โโโ meta.yaml # catalog metadata (id/type/version/category/license/source/zh i18n)
โโโ SOUL.md # expert body (frontmatter: name/persona/voice/โฆ + role prompt)
โ โโโ or SKILL.md # skill body (frontmatter: name/description + usage) + references/
โโโ LICENSE # upstream license, verbatim
โโโ ATTRIBUTION.md # upstream paths, commit, license
Field reference in CONTRIBUTING.md; templates in templates/entry/.
- Fork โ branch โ copy
templates/entry/โ fill it in - Optional local check (CI runs it anyway):
node scripts/validate.mjs - Open a PR โ review (license and content review are the gate) โ merge
- CI automatically: validate โ reproducible pack โ upload R2 โ D1 upsert โ verify โ regenerate index
Deleting an entry does not go through a PR (no automatic takedown) โ contact a maintainer. Licenses must be on the allowlist (MIT / Apache-2.0 / BSD / ISC / MPL-2.0 / CC0 / CC-BY-4.0).
| Command | Purpose |
|---|---|
node scripts/validate.mjs |
Validate all entries (layout / metadata / license / hygiene) |
node scripts/pack.mjs [--only RE] |
Reproducible packing โ .build/ (GNU tar fixed mtime + gzip -n) |
node scripts/publish.mjs [--dry-run] [--changed] |
Publish to R2+D1 (content columns only) + verify |
node scripts/gen-index.mjs |
Regenerate index/catalog.json |
Publishing needs CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID (CI secrets); a macOS-local pack is a smoke test only, never the publishing baseline.
Repo tooling (scripts, workflows, docs) is Apache-2.0. Each entry's content belongs to its upstream license โ see the LICENSE and meta.yaml in its directory.