Adding a marketplace entry

The marketplace catalog is plain JSON in this repo — one file per entry at content/marketplace/<family-dir>/<slug>.json, grouped by family:

content/marketplace/
  schema.ts
  tools/       family: "tool"      e.g. tools/issue.json
  channels/    family: "channel"   e.g. channels/telegram.json
  skills/      family: "skill"     e.g. skills/weather.json

No build step, no database.

Steps

  1. Copy an existing entry that's close to what you're adding, e.g. content/marketplace/tools/issue.json for a tool or content/marketplace/skills/weather.json for a skill.
  2. Rename it to <slug>.json and place it in the folder matching its family (see the layout above). The slug field inside the file must equal the filename without .json, and the file must live under the folder for its family — the loader throws a build error otherwise.
  3. Fill in the fields (see the schema below).
  4. Run pnpm dev and open http://localhost:3000/marketplace/<slug> to check the card and detail page.
  5. pnpm lint and pnpm build must both pass.

Schema

The full type lives in content/marketplace/schema.ts.

FieldRequiredNotes
slugkebab-case; equals the filename and the URL segment
namedisplay name
familytool | channel | skill
typefiner label: action, query, messaging, coredash, utility, …
summaryone line, shown on cards
descriptionmarkdown, shown on the detail page
tagsstring array
sourcePathpath inside the koris repo, e.g. plugins/tools/issue
sourceUrlfull GitHub URL to sourcePath
toolNametoolsthe LLM-facing name, e.g. issue
paramstools{ name, type, required, description, enum? }[]
readWhenskillsthe read_when triggers from SKILL.md
hintschannelsguidance strings { uninstalled?, inactive?, active?, pairing?, botNumber?, allowUnlisted?, whitelist? }; per-locale overrides go in i18n.<locale>.hints
configFieldschannelssetup-wizard form inputs { name, label, type, placeholder?, description?, required? }[]; type is text | password | boolean | number
requiresConfirmationtrue if the plugin needs explicit user confirmation
defaultEnabledenablement state in a fresh koris install
capturedFromoptional koris git ref this snapshot came from

Keeping it in sync

The JSON files are the source of truth — they're written and reviewed by hand. A sketch helper, scripts/generate-catalog.ts, can re-derive params / readWhen from a local koris checkout and merge them into the existing files without clobbering the hand-written prose. Source parsing is brittle, so always review its output.