Checklist Maintainer — Schema, Rilis & Situs
Empat permukaan yang di-publish FormSpec, dan cara memperbarui masing-masing:
| Permukaan | Yang live | Cara update |
|---|---|---|
Rilis CLI — binary formspec | GitHub Releases | §B — make set-version-auto → make release → make release-upload |
| Website — landing page | formspec.dev | §C — edit site/ → commit → push |
| Web-docs — dokumentasi | docs.formspec.dev | §D — edit docs/ → commit → push |
| Schema — JSON Schema registry | schemas.formspec.dev | §A — make publish-schemas → commit → push |
Tiga dari empat memakai pemicu yang sama: push ke
main. Yang berbeda adalah apa yang harus ikut di-commit sebelum push. Cloudflare Pages auto-build per project dari repo ini (github.com/primadi/formspec), dengan Build watch paths membatasi pemicu per project — lihat../architecture/09-domain-map.md.
Halaman ini adalah checklist ringkas + penunjuk ke prosedur lengkap. Ia sengaja tidak menduplikasi rincian: sumber kebenaran tetap Makefile, scripts/publish-schemas.sh, scripts/git-push-and-tag.sh, ../../schemas/README.md, ../kind/README.md, dan releasing.md.
A. Kalau ada perubahan schema
Kontrak FormSpec punya satu sumber kode: pkg/spec/*.go. Tiga artefak di-generate darinya dan di-commit ke repo — jangan pernah mengedit artefaknya langsung, karena regenerate berikutnya akan menghapusnya.
| Artefak | Generator | Konsumen |
|---|---|---|
schemas/formspec.schema.json + schemas/kinds/*.schema.json | make generate-schema | VS Code YAML editor, formspec validate |
schemas/dist/<versi>/ (registry) | make publish-schemas | schemas.formspec.dev |
docs/kind/<grup>/*.md — tabel Atribut | make generate-kind-docs | docs-site |
Urutannya:
- Ubah sumber, bukan hasil generate. Edit
pkg/spec/*.go— struct Go + godoc + annotation// @schema {...}(description, enum, pattern, dll). make generate-schema— regenerasischemas/(root + per-kind) daripkg/spec. Opsional secara eksplisit: langkah 4 memanggilnya juga.make generate-kind-docs— regenerasi tabel Atribut didocs/kind/. Region manual (Kapan Memakai,Contoh Manifest,Gotchas) tidak tersentuh; jangan edit apa pun di antara marker<!-- generated:… -->.make publish-schemas— stage layout versi keschemas/dist/<versi>/+ aliaslatest/. Script ini men-generate ulang schema lebih dulu, dan punya guard anti-gitignore(kind baru yang ter-ignore → exit 1).git status --short schemas/dist— pastikan tidak kosong. File kind BARU pernah terlewat senyap karena poladist/di.gitignorejuga mencocokischemas/dist/; kini sudah dinegasi (!schemas/dist/) + dijaga guard, tetapi langkah ini tetap jadi jaring pengaman.- Tinjau dokumen naratif yang menyebut field/kind yang berubah:
docs/spec/…— kontrak normatif (perilaku yang dijanjikan ke user);docs/kind/…— narasi manual per kind (bila kind baru atau peran berubah);docs/reference/— glossary istilah kanonik;ai_skills/— skill yang di-embed ke binary lalu ditulisformspec init(manual, bukan generated) — perbarui bilapkg/specberubah;.github/skills/— skill agent repo ini, bila menyentuh DX/backend/frontend.
- Commit bersama dalam satu commit:
pkg/spec+schemas/+docs/kind/+schemas/dist/(+ docs manual). Commit message menyebut plan didocs_internal/plan/yang relevan (workflow discipline). git push— inilah langkah deploy-nya.make publish-schemashanya men-stage; yang membuatschemas.formspec.devberubah adalah push kemain(Cloudflare auto-build projectformspec-schemas).
Verifikasi:
go test ./...go run ./cmd/formspec validate --spec examples/kafe/spec --schema schemas→0 problem- opsional, tanpa push: uji registry-mirror lokal —
cd schemas/dist && python3 -m http.server 8791, laluFORMSPEC_SCHEMA_REGISTRY=http://127.0.0.1:8791 go run ./cmd/formspec validate --spec examples/kafe/spec(hapus cache dulu bila perlu). - setelah push:
curl -I https://schemas.formspec.dev/v1/formspec.schema.json
Rincian registry (layout versi,
latest/, konsumsi CLI, opsi R2 cadangan):../../schemas/README.md. Generator ini deterministik — regenerasi tanpa perubahanpkg/specmenghasilkan diff kosong. Jadi setiap baris yang muncul dischemas/ataudocs/kind/adalah perubahan nyata, bukan churn; jangan dibuang dengangit checkout.
B. Kalau ingin release tag build formspec
Prosedur lengkap (prasyarat, verifikasi artifact, rollback, hapus draft): releasing.md. Yang di bawah ini urutan cepatnya.
Jalur satu perintah — scripts/git-push-and-tag.sh merangkai semuanya: sinkron versi contoh di docs/site → regenerate + commit schema & kind docs → go test → tag + push → make release → make release-upload (draft).
scripts/git-push-and-tag.sh v0.4.2 # semua langkah
scripts/git-push-and-tag.sh v0.4.2 --skip-tests # bila test sudah dijalankan manualBertahap — tiga target Makefile, VERSION= tidak perlu diisi di langkah 2–3:
make set-version-auto # versi + tag di HEAD (PUSH=1 untuk push tag)
make release # versi dibaca dari tag yang menunjuk HEAD
make release-upload # draft di GitHub → review → PublishManual, per langkah:
git checkout main && git pull origin main— working tree harus bersih; tag harus menunjuk commit yang di-build.- Perbarui versi contoh di
site/+docs/(lihat §B.1 di bawah) — harus masuk commit sebelum tag dibuat, kalau tidak tag menunjuk commit yang masih menampilkan versi lama.scripts/git-push-and-tag.shmelakukannya otomatis; jalur bertahap tidak. go test ./...— harus hijau.- Tentukan versi:
make set-version-auto(patch-bump dari tag semver tertinggi, guard lengkap, tag dibuat di HEAD), atau eksplisitmake set-version-auto VERSION=v0.5.0untuk bump minor/major. Wajib semver murni (v1.2.3) — bukan stringgit describe— dan tidak boleh mundur dari tag tertinggi yang sudah ada. - Push tag:
make set-version-auto PUSH=1(ataugit push origin <tag>). Satu tag = satu release, tidak bisa dipakai ulang. make release— cross-compile 6 target (linux/darwin/windows×amd64/arm64) + packaging →dist/release/.make release-upload— membuat draft release; review lalu klik Publish.- Verifikasi pasca-publish:
curl -fsSL https://formspec.dev/install.sh | sh && formspec version.
B.1 Versi contoh di site/ + docs/
Dua tempat memuat angka versi hardcoded sebagai contoh (bukan di-resolve saat runtime), jadi keduanya harus ikut ter-commit di rilis:
| File | Isi |
|---|---|
site/src/components/Install.tsx | preview output formspec version |
docs/guides/install.md | contoh --version / FORMSPEC_VERSION |
Installer (site/public/install.sh, install.ps1) tidak perlu diubah — ia meresolve versi terbaru via GitHub API saat runtime.
# ganti <lama> → <versi baru> di kedua file, lalu commit
sed -i 's/v0\.0\.9/v0\.0\.10/g' site/src/components/Install.tsx docs/guides/install.md
git add site/src/components/Install.tsx docs/guides/install.md
git commit -m "chore: bump contoh versi installer → v0.0.10"Perubahan ini ikut ter-deploy otomatis: menyentuh site/ → rebuild formspec.dev, menyentuh docs/ → rebuild docs.formspec.dev (§C, §D).
Perhatikan urutannya — commit versi contoh dulu, baru
make set-version-auto, supaya tag menunjuk commit yang sudah memuat versi benar. Ini juga alasanscripts/git-push-and-tag.shmelakukannya di langkah 0 (sebelum tag).
Catatan penting:
make releasetidak membuat tag (tag = keputusan sadar maintainer) —make set-version-autoyang melakukannya. Urutan tag ↔ build tidak saling bergantung, asal tag menunjuk commit yang dibangun;make releasemembaca tag semver yang menunjuk HEAD, jadi hasilset-version-autolangsung dipakai.make release-uploadidempotent — boleh diulang bila upload terputus. Release yang sudah published ditolak (satu tag = satu release).- Build SPA + brotli terjadi sekali di
build-spa; jangan meng-copyrenderers/react-shadcn/dist/sebelum kompresi selesai. - GitHub Actions yang men-trigger on tag push belum ada (sengaja ditunda) — lihat releasing.md §"Belum otomatis (deferred)".
C. Kalau ingin update website (formspec.dev)
Landing page ada di site/ (Vite + React + Tailwind). Tidak ada langkah staging atau upload: Cloudflare Pages project formspec-site membangun dari sumber saat push ke main menyentuh site/*.
- Edit
site/src/**(section/komponen disite/src/components/). make site-dev— verifikasi lokal dihttp://localhost:5198/(make site-dev PORT=5300untuk port lain).make site-build— typecheck + build produksi kesite/dist/(make site-typecheckbila hanya ingin typecheck).site/dist/di-gitignore; ini hanya verifikasi lokal, bukan artefak yang di-deploy.git add site && git commit && git push— inilah deploy-nya.
Verifikasi: curl -I https://formspec.dev → 200.
Catatan:
- Redirect & header statis hidup di
site/public/(_redirects,_headers,.well-known/security.txt) — ikut ter-deploy sebagai aset. - Redirect
www.formspec.dev → apextidak lewat_redirects(domain redirect tidak didukung) — dikelola sebagai Redirect Rule di dashboard Cloudflare. - Build watch paths membatasi rebuild:
formspec-sitehanya dibangun ulang saat push menyentuhsite/*,formspec-docssaatdocs/*ataudocs-site/*. Jadi perubahandocs/tidak memicu rebuild landing page. Rincian & alternatif (GitHub Actions + Deployment Hook):../architecture/09-domain-map.md.
D. Kalau ingin update web-docs (docs.formspec.dev)
Dokumentasi publik = isi docs/ di repo ini, dirender VitePress oleh docs-site/. Satu sumber, tanpa salinan: docs-site/docs adalah symlink ke ../docs, jadi cukup edit docs/ — tidak ada langkah sinkronisasi konten.
- Edit
docs/**/*.md(spesifikasi, kind, guides, architecture, dst). make docs-serve— pratinjau lokal dihttp://localhost:8000/docs/. Alternatif setara dengan tampilan produksi:cd docs-site && npm run dev.git add docs && git commit && git push— inilah deploy-nya.
Verifikasi: curl -I https://docs.formspec.dev → 200.
Catatan:
- Cloudflare Pages project
formspec-docsmembangun dari root directorydocs-sitedengan build commandnpm install && ln -sfn ../docs docs && npm run build. Symlink itu di-gitignore, jadi build command wajib membuatnya ulang — jangan menghapusln -sfndari konfigurasi project. docs_internal/tidak ikut ter-publish (ia di luardocs/). Lihat../README.mduntuk aturan apa yang boleh masukdocs/.- Menambah/memindahkan halaman: perbarui juga indeksnya (
docs/README.md,docs/*/README.md) dan tautan relatifnya. - Bila perubahan docs ikut rilis,
docs/guides/install.mdjuga bagian dari §B.1 (versi contoh hardcoded).
E. Kalau semuanya dalam satu rilis
Perubahan pkg/spec yang ikut ter-rilis harus masuk tag dalam keadaan sudah diregenerasi. Urutan yang benar untuk rilis yang menyentuh banyak permukaan:
- §A —
make generate-schema/generate-kind-docs/publish-schemas, lalu commitpkg/spec+schemas/+docs/kind/+schemas/dist/. - §B.1 — perbarui versi contoh di
site/+docs/, commit. - §B —
make set-version-auto→make release→make release-upload. - §C / §D — bila ada perubahan landing page atau docs yang belum di-commit, commit lalu push.
Satu git push ke main lalu memicu tiga build Cloudflare (site, docs, schema) sesuai Build watch paths — tidak ada langkah deploy manual untuk ketiganya. Tag + release-upload terpisah: ia tidak membaca push, ia membaca ref/tag dan dist/release/.
Jalur scripts/git-push-and-tag.sh melakukan langkah 1–3 secara otomatis (regenerate + commit di langkah 0.5, versi contoh di langkah 0) sebelum tag dibuat — sehingga tag tidak pernah membawa schema/kind docs atau versi contoh yang basi.
Ringkasan yang mudah diingat
| Yang berubah | Perintah |
|---|---|
Kontrak pkg/spec | make generate-schema → make generate-kind-docs → make publish-schemas → commit+push |
| Rilis binary CLI | make set-version-auto → make release → make release-upload |
Landing page site/ | edit → make site-build (verifikasi) → commit+push |
Dokumentasi docs/ | edit → make docs-serve (verifikasi) → commit+push |
Semua push ke
main; semua deploy Cloudflare otomatis; tidak ada perintahwrangler deploymanual di alur normal.wranglerhanya dipakai Cloudflare di sisi build (lihatsite/wrangler.toml,docs-site/wrangler.toml,schemas/wrangler.toml).