---
type: reference
title: Manifest caputchin.json
summary: Setiap bidang manifest caputchin.json yang mendeskripsikan game marketplace, blok marketplace, penunjuk distribusi, artefak run putar-ulang, blok preset, dan berkas split .caputchin.
---

`caputchin.json` di akar repositori-mu adalah sumber kebenaran penulis dan pengindeks untuk sebuah game marketplace. Pengindeks membacanya di sisi-server untuk mempelajari identitas game, di mana bundel-nya berada, preset mana yang ia tawarkan, dan cara memutarnya-ulang. Ia **tak pernah** dibaca di peramban; SDK tak memuatnya saat runtime.

Halaman ini adalah referensi bidang. Untuk build, lihat [Bangun game marketplace](/docs/marketplace-game-development/build-a-marketplace-game); untuk penerbitan, lihat [Terbitkan ke marketplace](/docs/marketplace-game-development/publish-to-the-marketplace). Tipe persisnya diekspor dari SDK sebagai `GameManifest` (lihat [referensi SDK](/docs/marketplace-game-development/game-sdk-reference)).

## Game tunggal minimal

```json
{
  "terms_accepted": true,
  "license": "MIT",
  "marketplace": {
    "name": "Leaf Memory",
    "description": "Match pairs of tropical leaves before the timer runs out.",
    "preview": "preview.png"
  },
  "npm": "@your-org/leaf-memory",
  "entry": "dist/leaf-memory.js"
}
```

## Bidang tingkat-atas

| Bidang | Diwajibkan | Tujuan |
|---|---|---|
| `terms_accepted` | untuk pengindeksan | Harus literal `true` untuk memastikan kamu menerima [Ketentuan Pengajuan Marketplace](/legal/submission-terms). Nilai lain (atau hilang) membuang manifest dari indeks. Manifest khusus-swahosting boleh menghilangkannya. |
| `license` | untuk pengindeksan | Sebuah pengenal atau ekspresi SPDX yang mencakup kodemu dan aset terbundel. Harus mengevaluasi ke pengenal yang disetujui (lihat [referensi galat terbit](/docs/marketplace-game-development/publish-failed-reference#approved-licenses)). |
| `marketplace` | untuk pengindeksan | Kehadiran adalah sinyal "indeks aku". Absen berarti game [swahosting](/docs/custom-game-development/overview) yang sah yang diabaikan marketplace. Lihat [Blok marketplace](#the-marketplace-block). |
| `npm` | dengan `entry` | Koordinat paket npm yang diselesaikan pengindeks ke URL jsDelivr. |
| `entry` | dengan `npm` | Path relatif-repo ke bundel terbangun. `entry`, `npm`, atau keduanya harus hadir untuk game yang bisa dijalankan. |
| `games` | untuk koleksi | Path sub-manifest untuk pembungkus koleksi. Saling eksklusif dengan `entry` / `npm`. Lihat [Koleksi](#collections). |
| `run` | opsional | Artefak putar-ulang headless khusus. Lihat [Artefak run](#the-run-artifact). |
| `preferred` | opsional | Petunjuk presentasi yang host BOLEH hormati. Lihat [Blok preferred](#the-preferred-block). |
| `locales` / `skins` / `configurations` | opsional | Blok preset yang dikonsumsi SDK di iframe. Lihat [Blok preset](#preset-blocks). |

Tak ada bidang `version`: pengindeks memin bundel ke ref tak-berubah sendiri (versi npm yang diterbitkan atau SHA commit yang diselesaikan).

## Blok marketplace [#the-marketplace-block]

| Bidang | Tujuan |
|---|---|
| `name` | Judul kartu. Jatuh ke nama repo (tunggal / pembungkus) atau nama leaf-dir (anak koleksi). |
| `description` | Subjudul kartu dan body halaman-detail. |
| `preview` | Path gambar (relatif ke akar repo) atau URL absolut. Sekitar 600x315, subjek terpusat. |
| `version` | String versi hanya-tampilan untuk halaman detail. Opsional. |
| `support` | Flag kompatibilitas yang dideklarasikan-penulis (`responsive`, `touch`, `accessible`, `audio`, ...), tak pernah diverifikasi platform; dimunculkan sebagai filter dan ikon kartu. |
| `author` | `{ name?, url?, email? }` opsional. `name` / `url` dirender sebagai byline penulis di halaman detail; `email` tak pernah ditunjukkan dan adalah **opt-in** untuk [email kegagalan-terbit](/docs/marketplace-game-development/publish-to-the-marketplace#get-notified-when-a-publish-fails). Ketiga subbidang independen. |

Blok sepenuhnya opsional. Hilangkan `name` / `url` dan halaman detail sekadar tak menunjukkan byline penulis (pemilik GitHub yang ditunjukkan di tempat lain di halaman adalah identitas terpisah yang selalu-hadir, bukan cadangan untuk byline ini). Hilangkan `email` dan kamu tak menerima notifikasi kegagalan-terbit. Setel hanya subbidang yang kamu mau.

## Penunjuk distribusi

Pengindeks memin bundel tiap game ke ref tak-berubah agar hash integritas tersimpan tetap sah, dan menyelesaikan-ulang pada setiap run (cron harian plus "Terbitkan atau perbarui" manual):

- `entry` + `npm` diselesaikan ke `cdn.jsdelivr.net/npm/<npm>@<resolved-version>/<entry>`.
- `entry` saja diselesaikan ke `cdn.jsdelivr.net/gh/<owner>/<repo>@<commit-sha>/<entry>`.
- `npm` saja diselesaikan ke entri default paket pada versi yang dipin.

Tak ada penyematan-versi sisi-pengguna; untuk membekukan sebuah build, pengguna menghosting-sendiri ia lewat `game-src` widget ([game kustom](/docs/custom-game-development/self-hosted-game)).

## Artefak run [#the-run-artifact]

Secara baku pemeriksaan-diri putar-ulang menjalankan bundel `entry` live-mu. Saat game-mu besar atau berbasis-framework atau WASM, kirim artefak `run` headless lean khusus sebagai gantinya:

```json
{
  "run": {
    "entry": "dist/run.js",
    "modules": [
      { "name": "sim.wasm", "type": "wasm", "path": "dist/sim.wasm" }
    ]
  }
}
```

| Bidang | Makna |
|---|---|
| `run.entry` | Path relatif-repo ke bundel `run` headless (ekspor `run` [kontrak putar-ulang](/docs/marketplace-game-development/replay-contract)). |
| `run.modules` | Array opsional entri modul yang diimpor run lewat `name`. |

### Kendala yang ditegakkan pengindeks

Ini divalidasi saat-indeks; pelanggaran menggagalkan penerbitan dengan `manifest-error` (lihat [referensi galat terbit](/docs/marketplace-game-development/publish-failed-reference)).

**`run.entry`:**

- Harus **JavaScript**: basename harus cocok `[a-zA-Z0-9_-]+.js`. Artefak run selalu JS (WASM dikirim sebagai modul, di bawah).
- Harus path relatif-repo yang bersih: tanpa slash awal, tanpa traversal `..`, tanpa spasi, tanpa `?` / `#`, tanpa awalan `scheme://`.

**Tiap entri `run.modules[]`** adalah `{ name, type, path }`:

- `name` harus cocok `[a-zA-Z0-9_-]+.(wasm|js)`, sebuah modul entah **JS atau WASM**, tak lebih. `name` adalah penentu impor yang dipakai entri.
- `type` harus sepakat dengan ekstensi: `wasm` untuk nama `.wasm`, `js` untuk nama `.js`.
- `name` tak boleh berupa nama **tercadang** (`entry.js`, `artifact.js`) yang dipakai host putar-ulang secara internal.
- `name` harus **unik** dalam array (tanpa duplikat).
- `path` harus path relatif-repo yang bersih (aturan sama dengan `run.entry`).
- Paling banyak **16** modul.

Hilangkan `run` untuk memutar-ulang `entry` live langsung. Lihat [kontrak putar-ulang](/docs/marketplace-game-development/replay-contract) untuk apa yang harus diekspor artefak.

## Blok preferred [#the-preferred-block]

Blok `preferred` opsional membawa petunjuk presentasi. Setiap kunci bersifat advisori: host BOLEH menghormatinya, dan ia tak pernah menimpa atribut sematan eksplisit.

```json
{
  "preferred": { "width": 360, "height": 480, "layout": "modal" }
}
```

Game responsif yang seharusnya membentang kontainer-nya secara baku bisa mendeklarasikan `"full"` di salah satu sumbu:

```json
{
  "preferred": { "width": "full", "height": 480 }
}
```

| Bidang | Makna |
|---|---|
| `width` / `height` | Jejak piksel, atau literal `"full"`. Widget menerapkannya saat sematan membiarkan `width` / `height` tak-disetel (nilai sematan eksplisit, termasuk `full`, menang sebagai gantinya). Nilai piksel mengukur iframe ke hitungan itu; `"full"` meregangkan sumbu itu untuk mengisi induk, efek sama yang dimiliki `width="full"` sematan. Hilangkan untuk jatuh ke jejak baku bawaan widget. |
| `layout` | Shell yang dibangun widget di sekitar game: `inline`, `modal`, atau `fullscreen`. Dipakai hanya saat sematan membiarkan `layout` tak-disetel (default-nya `auto`). Urutan penyelesaian: atribut `layout` sematan, lalu layout preferred ini, lalu `inline`. |

Petunjuk ini dihormati hanya untuk game yang diselesaikan platform di sisi-server (game marketplace, atau id game yang diberikan tanpa kunci situs). Bundel `game-src` swahosting yang tak bisa dibaca platform sebelum mount mengabaikan baik jejak maupun petunjuk layout.

## Blok preset [#preset-blocks]

`locales`, `skins`, dan `configurations` masing-masing mendeklarasikan `schema` opsional (tipe dan dokumentasi per-kunci) plus `presets` (bank opsi bernama). Widget menyelesaikan pilihan pengunjung terhadap ini dan menyerahkan game-mu hasil yang diratakan sebagai [`ctx`](/docs/marketplace-game-development/game-sdk-reference). Katalog tipe-bidang penuhnya adalah [referensi skema kustomisasi](/docs/references/customization-schema) bersama; tipe yang sama menggerakkan [skema dasbor game kustom](/docs/custom-game-development/dashboard-schema).

Sebuah bidang `skins.schema` boleh berupa `color`, sebuah aset (`image` / `audio` / `video`), atau skalar (`boolean`, `number`, `range`, `list`) memakai bentuk kendala yang sama dengan `configurations` (`{ "type": "range", "min": 0, "max": 24 }`, `["dots","stripes"]`, dan seterusnya). Nilai skin skalar diselesaikan ke nilai bertipenya di `ctx.skin` (sebuah `number` adalah angka nyata), persis seperti nilai konfigurasi; nilai warna dan aset diselesaikan ke string.

`_theme` sebuah preset skin mendeklarasikan mode yang ia berfungsi di dalamnya: `light`, `dark`, atau `any` (menghilangkannya berarti `any`). Preset `light` atau `dark` muncul hanya di mode itu; preset `any` terbaca di kedua latar dan layak untuk keduanya. Ada satu default per mode. Preset yang ditandai `_default: true` adalah default untuk mode mana pun yang ia layak, jadi default `any` mencakup keduanya; saat beberapa preset layak ditandai default untuk sebuah mode, yang pertama dalam urutan deklarasi memenangkannya. Daftar preset spesifik-mode di atas yang `any` untuk memberi mode itu skin khusus sementara preset `any` jatuh ke yang lain.

## Berkas split `.caputchin/`

Blok preset (terutama set locale penuh) membuat `caputchin.json` panjang. Pindahkan sumbu mana pun ke berkasnya sendiri di bawah folder `.caputchin/`, membiarkan manifest pendek:

```
caputchin.json
.caputchin/locales.json
.caputchin/skins.json
.caputchin/configurations.json
```

Objek tingkat-atas tiap berkas **adalah** blok sumbu itu (`{ schema?, presets }`). Ketiganya opsional. Presedensi adalah penggantian seluruh-sumbu, `caputchin.json` menang: jika sebuah sumbu dideklarasikan baik inline maupun sebagai berkas, blok inline dipakai dan berkas diabaikan (penerbitan memperingatkan agar kamu tahu ia mati). Jaga tiap sumbu di persis satu tempat.

## Koleksi [#collections]

Sebuah repo bisa mengirim beberapa game. Pembungkus koleksi mendeklarasikan path anak alih-alih `entry` / `npm`:

```json
{
  "marketplace": { "name": "Caputchin Core Pack", "description": "The official pack." },
  "games": ["./packages/leaf-memory", "./packages/dino-runner"]
}
```

Tiap path menunjuk ke direktori anak yang menahan `caputchin.json`-nya sendiri. Id anak adalah `owner/repo/<leaf-dir>`. Hilangkan blok `marketplace` pembungkus untuk mengindeks anak tanpa halaman koleksi.

## Lihat juga

- [Bangun game marketplace](/docs/marketplace-game-development/build-a-marketplace-game): menghasilkan bundel yang ditunjuk manifest ini.
- [Kontrak putar-ulang](/docs/marketplace-game-development/replay-contract): apa yang harus diekspor artefak `run`.
- [Referensi galat terbit](/docs/marketplace-game-development/publish-failed-reference): setiap galat validasi manifest dan daftar lisensi yang disetujui.
- [Referensi skema kustomisasi](/docs/references/customization-schema): tipe bidang yang dipakai blok preset.
