Files
OmniRoute/docs/i18n/id/docs/ops/RELEASE_CHECKLIST.md
Diego Rodrigues de Sa e Souza b637350680 fix(docs): re-sync the 65 documentation mirror sets; section-level docs pipeline; drift gate blocking (#13940)
1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors.

⚠️ base-red inherited: #12732
2026-09-17 02:55:31 -03:00

29 KiB

Release Checklist (Bahasa Indonesia)

🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW


Terakhir diperbarui: 2026-08-28 — v3.8.51 Alur rilis yang disederhanakan dengan memanfaatkan keterampilan Claude Code untuk otomatisasi.

Pastikan antrean/cabang tetap hijau di antara rilis: lihat RELEASE_GREEN.md (keluarga /green-prs + npm run check:release-green + /babysit + proses setiap malam). Menjalankan ini secara berkala — dan terutama sebelum daftar periksa ini — membuat PR rilis dimulai dalam keadaan hijau.

Ringkasannya

# 1. Naikkan versi + hasilkan CHANGELOG (keterampilan)
/version-bump-cc patch    # atau minor/major

# 2. Jalankan gerbang kualitas secara lokal
npm run check              # lint + pengujian
npm run test:coverage      # gerbang cakupan penuh (60/60/60/60)

# 3. Build & uji asap
npm run build
npm run test:e2e           # opsional tetapi direkomendasikan

# 4. Hasilkan rilis (keterampilan)
/generate-release-cc

# 5. Lakukan deployment (keterampilan)
/deploy-vps-both-cc        # atau akamai-cc / local-cc

# 6. Ambil bukti rilis (keterampilan)
/capture-release-evidences-cc

npm Trusted Publishing (default sejak v3.8.51) — bertahap berdasarkan permintaan, langsung sebagai fallback

npm-publish.yml menerbitkan melalui npm Trusted Publishing (OIDC) secara default: job stage-npm (dihosting GitHub) menukarkan id-token GitHub dengan kredensial npm berumur pendek untuk proses tersebut — tanpa token npm berumur panjang dalam secret repositori, tanpa permintaan 2FA, dengan provenance terlampir. Itulah bypass yang kini didukung npm karena token yang melewati 2FA sedang dihentikan; mekanisme ini memulihkan alur otomatis penuh yang dimiliki proyek hingga v3.8.48 sekaligus mempertahankan jaminan WS1.3 (token yang bocor tidak dapat menerbitkan sendiri — karena memang tidak ada token).

Penyiapan satu kali (pemilik): npmjs.com → package omniroute → Settings → Trusted Publisher → GitHub: owner diegosouzapw, repo OmniRoute, workflow npm-publish.yml (environment: none). Hingga konfigurasi tersebut tersedia, langkah otomatis akan gagal dengan ENEEDAUTH: jalankan ulang dengan publish_mode=staged (di bawah) atau direct.

Penerbitan bertahap (berdasarkan permintaan — publish_mode=staged)

Workflow npm-publish tidak lagi menerbitkan secara langsung: workflow tersebut menjalankan boot pada tarball yang telah dikemas (check:pack-boot), lalu menjalankan npm stage publish — byte yang persis sama ditempatkan di registry, tetapi tidak dapat diinstal hingga pemilik menyetujuinya. Gerbang 2FA manusia dipindahkan ke SETELAH pembuktian, bukan sebelumnya.

Alur pemilik setelah workflow berstatus hijau:

  1. npm stage list omniroute — temukan id tahap (juga dicetak dalam ringkasan workflow).
  2. Verifikasi byte yang disiapkan (direkomendasikan): npm stage download <id>, lalu instal tarball yang diunduh ke prefix sementara dan jalankan boot (npm run check:pack-boot mengotomatiskan putusan pack→install→boot yang sama di CI).
  3. npm stage approve <id> — permintaan 2FA ADALAH proses penerbitan. npm stage reject <id> membuangnya.
  4. Jaring pengaman pascapenerbitan: verifier pascapenerbitan (WS1.4 dari rencana v3.8.49) menginstal versi yang diterbitkan dari registry publik dalam container bersih dan menjalankan boot.

Fallback darurat: workflow_dispatch dengan publish_mode=direct memulihkan npm publish langsung versi lama (gunakan hanya jika staging itu sendiri bermasalah; catat alasannya).

Penguatan satu kali (pemilik, npmjs.com): konfigurasikan Trusted Publisher untuk omniroute dalam mode khusus tahap agar token berumur panjang yang bocor tidak dapat menjalankan npm publish secara langsung dari mana pun — CI hanya dapat menyiapkan tahap; hanya 2FA pemilik yang dapat merilis.

Panduan artefak rusak (tidak berubah): npm deprecate omniroute@<bad> "<reason> — use <fixed>" sebagai tindakan refleks default (beberapa menit, dapat dipulihkan); npm unpublish hanya dalam jendela 72 jam/tanpa-dependen dan jangan pernah sebagai tindakan pertama. Docker: jangan pernah menimpa tag versi — rollback dilakukan dengan mengarahkan kembali latest ke digest terakhir yang baik.

Docker Hub latest (wajib pada setiap penerbitan SemVer stabil): workflow docker-publish harus memberi tag keduanya, yaitu X.Y.Z dan, ketika should-promote-latest.sh menyatakan bahwa ini adalah SemVer stabil tertinggi, :latest, dengan digest yang sama. Setelah job selesai: digest latest di Hub sama dengan digest SemVer baru dan last_updated telah berubah. Jangan biarkan :latest tetap mengarah ke build yang lebih lama sementara catatan rilis membahas perbaikan yang hanya ada di git. Panduan mulai cepat Compose menggunakan :latest; GitOps harus tetap menyematkan X.Y.Z. Lihat Saluran rilis Docker dan #10317.

Jalur Cepat Hotfix (label hotfix)

PR yang diberi label hotfix melewati matriks CI yang berat (E2E 9 shard, ratchet cakupan, quality-gate, quality-extended) dan mempertahankan pemeriksaan yang cepat dan bersinyal tinggi: build, shard unit, integrasi, vitest, lint/typecheck, docs-sync, check:pack-artifact, serta pengujian boot-smoke tarball (check:pack-boot). Target: hijau dalam ≤15 menit, bukan ~33 menit.

Kebijakan penggunaan — keempatnya wajib dipenuhi (dimodelkan berdasarkan jalur darurat Chromium/VS Code/Node):

  1. Tingkat keparahan: produksi rusak — artefak yang dipublikasikan mengalami crash saat boot / perbaikan keamanan / setiap pengguna rilis terdampak. "Penting" tidak berarti "rusak".
  2. Wewenang: hanya pemilik repositori yang menerapkan label hotfix. Label tersebut ADALAH persetujuan — jangan pernah menerapkannya sendiri pada PR kampanye.
  3. Bukti: isi PR menautkan proses berat sebelumnya yang sepenuhnya hijau (suite yang akan divalidasi ulang oleh job yang dilewati) beserta pengujian milik perbaikan tersebut yang awalnya gagal lalu berhasil.
  4. Cakupan: khusus cherry-pick — perbaikan minimal, tanpa refactor, tanpa perubahan tambahan yang ikut disertakan.

Permukaan cakupan/ratchet yang dilewati divalidasi ulang oleh proses penuh berikutnya pada branch rilis (rilis hijau berkelanjutan) — jalur ini hanya melewati PENANTIAN, bukan validasi. Diff khusus pengujian (semua file berada di bawah tests/, tidak ada yang berada di bawah tests/e2e/) melewati matriks E2E secara otomatis, tanpa label apa pun.

Daftar Periksa Terperinci

Pra-rilis

  • Semua PR yang ditargetkan untuk rilis ini telah digabungkan ke release/vX.Y.0
  • Semua item Linear/issue yang masih terbuka untuk versi ini telah ditutup atau dipindahkan ke milestone berikutnya
  • CI hijau pada branch release/vX.Y.0
  • Tidak ada penanda TODO(release) dalam kode: grep -r "TODO(release)" src/ open-sse/
  • Image dasar Docker sudah terbaru (saat ini node:24.15.0-trixie-slim)

Versi & Changelog

  • Jalankan /version-bump-cc <patch|minor|major> (skill Claude Code)
    • Menaikkan versi package.json, electron/package.json
    • Membuat ulang CHANGELOG.md dari commit git sejak tag terakhir
    • Memperbarui badge README.md
  • Tinjau CHANGELOG.md secara manual dan rapikan pesan commit jika diperlukan
  • Pastikan bagian semver terbaru dalam CHANGELOG.md sama dengan versi package.json
  • Pertahankan ## [Unreleased] sebagai bagian changelog pertama untuk pekerjaan mendatang
  • Perbarui docs/openapi.yamlinfo.version harus sama dengan versi package.json

Kualitas Kode

  • npm run lint — 0 error (peringatan sudah ada sebelumnya)
  • npm run typecheck:core — bersih
  • npm run typecheck:noimplicit:core — bersih (ketat)
  • npm run check:cycles — tidak ada dependensi siklik
  • npm run check:any-budget:t11 — dalam batas anggaran
  • npm run check:route-validation:t06 — bersih
  • npm run check:node-runtime — batas minimum runtime yang didukung terpenuhi (>=22.22.2 <23, >=24.0.0 <27, sesuai SUPPORTED_NODE_RANGE dalam src/shared/utils/nodeRuntimeSupport.ts; selaras dengan engines pada package.json)

Pengujian

  • npm run test:unit — berhasil
  • npm run test:vitest — berhasil (server MCP, autoCombo, cache)
  • npm run test:coverage — ambang 60/60/60/60 terpenuhi (statement/baris/fungsi/branch)
  • npm run test:integration — berhasil (jika perubahan menyentuh DB / handler)
  • npm run test:combo:matrix — berhasil (matriks strategi combo: membuktikan keputusan pemilihan untuk seluruh 19 strategi routing publik secara deterministik; jalankan saat menyentuh routing combo, resolusi strategi, atau logika fallback)
  • RUN_COMBO_LIVE=1 npm run test:combo:liveopsional/manual (smoke test real-upstream dengan gate; mengambil snapshot DB hanya-baca dari VPS root@192.168.0.15; mengakses provider nyata, menghabiskan kredit; tidak pernah berjalan di CI; dilewati dengan bersih tanpa gate)
  • npm run test:combo:live:vpsopsional/manual (smoke test langsung VPS Fase-3: 7 skenario HTTP terhadap server .15 langsung melalui Node ESM biasa; memerlukan ssh root@192.168.0.15; hanya membuat/menghapus combo __live_test__*; mengakses provider nyata; tidak pernah berjalan di CI)
  • npm run test:e2e — berhasil (perubahan UI)
  • npm run test:protocols:e2e — berhasil (perubahan MCP/A2A)
  • npm run test:ecosystem — berhasil

Hook (Divalidasi Husky)

Hook Husky berada di .husky/ dan berjalan secara otomatis saat operasi git.

  • pre-commit: npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11
  • pre-push: pemeriksaan deterministik yang cepat — npm run check:any-budget:t11 && npm run check:tracked-artifacts (diaktifkan 2026-06-13). Sengaja tidak menyertakan test:unit (lambat; dicakup oleh job CI test-unit).
    • Jalankan npm run test:unit secara manual sebelum melakukan push pada branch rilis.

Jika hook gagal: perbaiki masalah yang mendasarinya, jangan melewatinya dengan --no-verify.

Conventional Commits

Semua commit yang ditujukan untuk rilis harus mengikuti format type(scope): subject.

Tipe yang valid: feat, fix, refactor, docs, test, chore, perf, style, ci

Scope yang valid: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz

Perubahan breaking: tambahkan footer BREAKING CHANGE: atau ! setelah scope (misalnya feat(api)!: drop /v0).

Dokumentasi

  • npm run check:docs-sync berhasil (dijalankan otomatis oleh pre-commit)
  • npm run check:docs-all berhasil (payung: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)
  • npm run check:env-doc-sync keluar dengan kode 0 — kontrak env antara kode ↔ .env.exampledocs/reference/ENVIRONMENT.md tetap utuh
  • npm run check:doc-links keluar dengan kode 0 — tidak ada referensi markdown internal yang rusak setelah restrukturisasi
  • docs/architecture/ARCHITECTURE.md ditinjau untuk mendeteksi penyimpangan penyimpanan/runtime
  • docs/guides/TROUBLESHOOTING.md ditinjau untuk mendeteksi penyimpangan variabel env dan operasional
  • Jika .env.example berubah: docs/reference/ENVIRONMENT.md diperbarui
  • Jika fitur baru memiliki UI: docs/guides/USER_GUIDE.md menyebutkannya
  • Jika fitur baru memiliki API: docs/reference/API_REFERENCE.md + docs/openapi.yaml diperbarui
  • Jika fitur baru merupakan modul: tersedia docs/<MODULE>.md khusus
  • Jika terdapat perubahan yang merusak kompatibilitas: docs/guides/TROUBLESHOOTING.md memiliki catatan migrasi

i18n

  • npm run i18n:check keluar dengan kode 0 — status terjemahan (.i18n-state.json) sinkron dengan dokumentasi sumber (tidak ada sumber yang menyimpang dalam mode ketat; peringatan dalam mode peringatan dapat diterima untuk perbaikan dokumentasi pada menit terakhir, tetapi harus 0 sebelum pemberian tag)
  • npm run i18n:check-ui-coverage keluar dengan kode 0 — setiap locale UI berada pada atau di atas batas minimum cakupan 80%
  • npm run i18n:sync-ui:dry melaporkan 0 kunci yang hilang di seluruh 42 locale
  • Jika dokumentasi sumber berbahasa Inggris berubah, jalankan npm run i18n:run (memerlukan OMNIROUTE_TRANSLATION_API_KEY di .env) sebelum pemberian tag
  • Kontribusi terjemahan dapat ditunda ke rilis berikutnya jika bersifat minor (lacak di CHANGELOG)

Migrasi Database

  • Jika src/lib/db/migrations/ memiliki file baru:
    • Setiap migrasi bersifat idempoten (CREATE TABLE IF NOT EXISTS, dll.)
    • Migrasi dibungkus dalam transaksi
    • Diberi nomor dengan benar (tidak ada celah dalam urutan)
  • Uji pada instalasi baru: hapus ~/.omniroute/omniroute.db dan jalankan npm run dev
  • Uji pada instalasi yang sudah ada: cadangkan DB, jalankan migrasi, verifikasi skema
  • File WAL (-wal, -shm) ditangani dengan benar jika migrasi menulis ulang tabel

Katalog Penyedia (Divalidasi Zod)

  • Skema Zod src/shared/constants/providers.ts valid saat dimuat
    • Semua penyedia memiliki bidang wajib (id, label, kind, dll.)
    • freeNote disediakan untuk penyedia gratis baru
    • Penyedia OAuth memiliki oauthConfig yang terdaftar di src/lib/oauth/constants/oauth.ts
  • Jika penyedia baru ditambahkan: tersedia executor yang sesuai di open-sse/executors/
  • Jika formatnya bukan OpenAI: tersedia penerjemah di open-sse/translator/
  • Model terdaftar di open-sse/config/providerRegistry.ts
  • Pengujian unit di tests/unit/ mencakup klasifikasi dan perutean penyedia

Desktop (Electron)

Jika electron/ berubah:

  • npm run electron:smoke:packaged berhasil
  • Build diuji setidaknya untuk salah satu dari :win, :mac, :linux
  • Sertifikat penandatanganan kode belum kedaluwarsa (jika melakukan penandatanganan)
  • Versi electron/package.json cocok dengan package.json root
  • Pointer kanal pembaruan otomatis diperbarui jika merilis ke stable

Tata Letak Build

Repositori menggunakan tiga direktori output yang berbeda — jangan pernah tertukar:

Direktori Tujuan Dilacak?
src/ Sumber aplikasi (TypeScript / TSX) Ya
.build/ Perantara build — output next build (distDir) Tidak (diabaikan git)
dist/ Bundel npm siap dikirim — dirakit oleh assembleStandalone Tidak (diabaikan git)

Catatan operator: direktori image VPS jarak jauh tetap /usr/lib/node_modules/omniroute/app/. Hanya output build di dalam repositori yang dipindahkan (app/dist/). Skill deploy melakukan rsync terhadap isi dist/ ke direktori app/ jarak jauh — tidak diperlukan perubahan path VPS.

Alur build tunggal:

npm run build:release
  └─ rm -rf .build dist          (bersihkan)
  └─ next build → .build/next/   (perantara)
  └─ assembleStandalone          (menyalin standalone + static + public + native → dist/)
  └─ menulis dist/BUILD_SHA      (sentinel HEAD)

JANGAN jalankan npm run build yang diikuti oleh npm run build:cli terpisah untuk deploy — gunakan npm run build:release yang melakukan build ulang bersih + sentinel dalam satu perintah.

Validasi Artefak

  • npm run build:release berhasil dan dist/BUILD_SHA == git rev-parse --short HEAD
  • npm run check:pack-artifact bersih — tidak ada app.__qa_backup, scripts/scratch, package-lock.json, atau residu lokal lainnya
  • dist/server.js tersedia setelah build

Pemberian Tag & Rilis

  • Jalankan /generate-release-cc (skill Claude Code):
    • Membuat tag vX.Y.Z
    • Mendorong tag dan branch
    • Membuka GitHub Release dengan isi changelog
    • Melampirkan installer Electron (jika dibuat)
  • Atau secara manual:
    git tag -a vX.Y.Z -m "Release vX.Y.Z"
    git push origin vX.Y.Z
    gh release create vX.Y.Z --notes-from-tag
    

Deploy

Skill deploy menggunakan alur rsync ringan — tanpa npm pack, tanpa npm i -g:

  • Gunakan skill deploy yang sesuai dengan target:
    • /deploy-vps-local-cc — VPS lokal (192.168.0.15)
    • /deploy-vps-akamai-cc — VPS Akamai (69.164.221.35)
    • /deploy-vps-both-cc — keduanya
  • Sebelum melakukan deploy, konfirmasikan dist/BUILD_SHA == git rev-parse --short HEAD
  • Build harus dijalankan di tempat node_modules benar-benar tersedia (checkout utama atau worktree yang telah menjalankan npm ci — BUKAN worktree yang menggunakan symlink)
  • Lakukan smoke test pada instance yang telah di-deploy:
    • Buka /dashboard/health → periksa apakah string versi cocok dengan rilis
    • Jalankan permintaan /v1/chat/completions terhadap penyedia yang diketahui
    • Verifikasi /api/monitoring/health mengembalikan circuit breaker CLOSED
    • Konfirmasikan transport MCP merespons (/mcp HTTP, /mcp-sse SSE)

Pascarilis

  • Jalankan /capture-release-evidences-cc (skill Claude Code)
    • Mengambil tangkapan layar/rekaman WebP dari fitur-fitur baru
    • Melampirkannya ke catatan rilis / postingan blog
  • Perbarui GitHub Discussions / Discord dengan pengumuman rilis
  • Buka milestone untuk versi berikutnya
  • Jika kritis: sematkan diskusi atau posting di news.json untuk banner dalam aplikasi

Gerbang peluncuran publik Radar

Pengumuman Radar sengaja di-commit dengan active: false. Aktivasi merupakan perubahan terpisah setelah bukti untuk setiap item di bawah ini tersedia:

  • Semua PR Radar bertumpuk telah di-merge dan CI release-tip berstatus hijau
  • Deploy dan lakukan uji asap pada rute Radar OSS dengan RADAR_ENABLED tetap nonaktif secara default
  • Lakukan uji asap pada GET /planos, /termos, /privacidade, dan /reembolso di host Radar yang ditentukan
  • Catat identitas/kontak/alamat operator dan tinjauan hukum yang disetujui pemilik di layanan privat
  • Uji Stripe Checkout dan webhook bertanda tangan hanya dalam mode pengujian
  • Uji satu pengiriman email transaksional terenkripsi dengan pengirim/domain yang disetujui
  • Buktikan pemulihan cadangan dan satu proses riset yang diawasi serta dibatasi anggaran
  • Setujui kebijakan peninjauan BRL/PIX sebelum menerima bukti donasi
  • Aktifkan Checkout publik hanya setelah gerbang sebelumnya terpenuhi, lalu aktifkan ID news.json yang baru
  • Verifikasi bahwa banner Home menggunakan teks yang dilokalkan dan ID baru muncul kembali setelah ID lama ditutup

Smoke test Layanan Tertanam (v3.8.4+)

Sebelum merilis versi apa pun yang menyertakan perubahan layanan tertanam, verifikasi:

Boot DB baru (mendeteksi benturan migrasi — ditambahkan setelah hotfix v3.8.4)

  • DATA_DIR=$(mktemp -d) npm start & — tunggu 10 dtk hingga boot selesai
  • curl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool' mengembalikan "9router" (BUKAN 404, BUKAN 500). Mengonfirmasi bahwa migrasi 071_services.sql diterapkan + baris data awal dibuat.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at" mengembalikan 3 baris.
  • sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted" mengembalikan 2 baris (memvalidasi bahwa 070_webhooks_kind_metadata.sql diterapkan).
  • node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.ts berhasil — mencegah benturan di masa mendatang.

9Router

  • POST /api/services/9router/install mengembalikan 200 dengan installedVersion dalam waktu kurang dari 2 mnt
  • POST /api/services/9router/start mengembalikan 200 dan state: "running" dalam waktu kurang dari 30 dtk
  • GET /api/services/9router/status melaporkan health: "healthy"
  • POST /v1/chat/completions dengan "model": "9router/auto/..." mengembalikan 200 (perutean menyeluruh melalui 9Router)
  • GET /dashboard/providers/services/9router/embed/dashboard merender UI native 9Router di dalam proxy (tanpa iframe langsung 127.0.0.1:port)
  • POST /api/services/9router/rotate-key mengembalikan { keyRotated: true } dan layanan dimulai ulang dengan baik
  • POST /api/services/9router/stop mengembalikan 200 dan state: "stopped"
  • GET /api/services/9router/logs?tail=50 mengembalikan stream SSE dengan peristiwa snapshot yang berisi baris-baris terbaru
  • Instalasi di lingkungan tanpa npm di PATH mengembalikan 500 dengan pesan kesalahan yang mudah dipahami (bukan stack trace)

CLIProxyAPI

  • POST /api/services/cliproxy/install mengembalikan 200 dalam waktu kurang dari 2 mnt
  • POST /api/services/cliproxy/start mengembalikan 200 dan state: "running" dalam waktu kurang dari 30 dtk
  • GET /api/services/cliproxy/status melaporkan health: "healthy"
  • POST /api/services/cliproxy/stop mengembalikan 200 dan state: "stopped"
  • GET /api/services/cliproxy/logs?tail=50 mengembalikan stream SSE

Regresi keamanan

  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/start mengembalikan 403 LOCAL_ONLY
  • curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/start mengembalikan 403 LOCAL_ONLY
  • Respons kesalahan dari /api/services/* tidak berisi err.stack atau path file absolut

Pemeriksaan v3.8.0+

Sebelum merilis versi v3.8.x apa pun, verifikasi item tambahan berikut:

  • omniroute --tray berhasil di-boot pada macOS (systray2 terinstal ke ~/.omniroute/runtime/)
  • omniroute --tray berhasil di-boot pada Linux (memerlukan DISPLAY; menampilkan kesalahan dengan baik jika tidak ditetapkan)
  • omniroute --tray berhasil di-boot pada Windows (PowerShell NotifyIcon, tanpa biner tambahan)
  • omniroute config tray enable membuat entri mulai otomatis; penonaktifan menghapusnya
  • npm install -g omniroute@<this-version> menjalankan postinstall tanpa keluar secara fatal
  • Jalur pembaruan mempertahankan dependensi opsional: omniroute update --apply dan pembaru otomatis menjalankan npm install -g … --include=optional agar optionalDependencies (better-sqlite3, keytar, tls-client, dan stack SLM llmlingua: @atjsh/llmlingua-2@2.0.5, js-tiktoken) tetap tersedia setelah pembaruan. Tingkat SLM ultra modelPath juga memerlukan model tinybert, yang diunduh secara otomatis ke ${DATA_DIR}/models/llmlingua saat pertama kali digunakan. Postinstall (scripts/build/colocateOptionals.mjs) kemudian menempatkan closure opsional SLM bersama-sama ke dalam dist/node_modules agar worker me-resolve SATU instans @huggingface/transformers ^4.2.0 — trace mandiri hanya membundel transformers, bukan dependensi opsional yang diimpor secara dinamis, sehingga tanpanya worker akan memuat llmlingua-2 menggunakan transformers milik root dan tingkat SLM akan diam-diam beralih ke mode fail-open.
  • omniroute status berfungsi tanpa .env (jalur token CLI, hanya loopback)
  • curl http://localhost:20128/api/shutdown mengembalikan 401 (rute yang selalu dilindungi)
  • curl -H "host: evil.com" http://localhost:20128/api/mcp/sse mengembalikan 401 (pengaman loopback)
  • Runtime SQLite di-resolve ke bundled saat pertama kali dijalankan (biner yang dibundel valid untuk platform)
  • Runtime SQLite beralih ke runtime ketika node_modules/better-sqlite3 dihapus
  • Filter MCP pintar mengompresi output nyata playwright-mcp browser_snapshot (pengurangan ≥50%)
  • Semua 10 file skills/omniroute*/SKILL.md dapat diambil secara publik melalui URL mentah GitHub
  • Wizard orientasi menampilkan langkah tur tingkat "Cara Kerjanya" pada penyiapan baru
  • Widget cakupan tingkat pada dasbor Beranda menampilkan jumlah yang dikonfigurasi/aktif

Rollback

Jika rilis memiliki masalah kritis:

  1. gh release edit vX.Y.Z --prerelease (menandainya sebagai bukan versi terbaru)
  2. git tag -d vX.Y.Z && git push --delete origin vX.Y.Z (hanya jika belum digunakan oleh pengguna)
  3. Atau: lakukan hotfix pada release/vX.Y.0 → rilis patch vX.Y.(Z+1)
  4. Segera komunikasikan di GitHub Discussions dan Discord

Aturan Ketat

  • Jangan pernah melakukan commit langsung ke main
  • Jangan pernah menggunakan git push --force ke branch main atau release/*
  • Jangan pernah melewati hook Husky (--no-verify)
  • Jangan pernah melakukan commit terhadap secret, kredensial, atau file .env
  • Coverage harus tetap ≥60/60/60/60 (statement/baris/fungsi/branch)
  • Selalu sertakan atau perbarui pengujian saat mengubah kode produksi di src/, open-sse/, electron/, atau bin/

Pemeriksaan Sinkronisasi Otomatis

Jalankan pemeriksaan sinkronisasi dokumentasi secara lokal sebelum membuka PR:

npm run check:docs-sync

CI juga menjalankan pemeriksaan ini di .github/workflows/ci.yml (job lint).