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
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:
npm stage list omniroute— temukan id tahap (juga dicetak dalam ringkasan workflow).- Verifikasi byte yang disiapkan (direkomendasikan):
npm stage download <id>, lalu instal tarball yang diunduh ke prefix sementara dan jalankan boot (npm run check:pack-bootmengotomatiskan putusan pack→install→boot yang sama di CI). npm stage approve <id>— permintaan 2FA ADALAH proses penerbitan.npm stage reject <id>membuangnya.- 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):
- Tingkat keparahan: produksi rusak — artefak yang dipublikasikan mengalami crash saat boot / perbaikan keamanan / setiap pengguna rilis terdampak. "Penting" tidak berarti "rusak".
- Wewenang: hanya pemilik repositori yang menerapkan label
hotfix. Label tersebut ADALAH persetujuan — jangan pernah menerapkannya sendiri pada PR kampanye. - 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.
- 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.mddari commit git sejak tag terakhir - Memperbarui badge README.md
- Menaikkan versi
- Tinjau CHANGELOG.md secara manual dan rapikan pesan commit jika diperlukan
- Pastikan bagian semver terbaru dalam
CHANGELOG.mdsama dengan versipackage.json - Pertahankan
## [Unreleased]sebagai bagian changelog pertama untuk pekerjaan mendatang - Perbarui
docs/openapi.yaml→info.versionharus sama dengan versipackage.json
Kualitas Kode
npm run lint— 0 error (peringatan sudah ada sebelumnya)npm run typecheck:core— bersihnpm run typecheck:noimplicit:core— bersih (ketat)npm run check:cycles— tidak ada dependensi sikliknpm run check:any-budget:t11— dalam batas anggarannpm run check:route-validation:t06— bersihnpm run check:node-runtime— batas minimum runtime yang didukung terpenuhi (>=22.22.2 <23,>=24.0.0 <27, sesuaiSUPPORTED_NODE_RANGEdalamsrc/shared/utils/nodeRuntimeSupport.ts; selaras denganenginespadapackage.json)
Pengujian
npm run test:unit— berhasilnpm 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:live— opsional/manual (smoke test real-upstream dengan gate; mengambil snapshot DB hanya-baca dari VPSroot@192.168.0.15; mengakses provider nyata, menghabiskan kredit; tidak pernah berjalan di CI; dilewati dengan bersih tanpa gate)npm run test:combo:live:vps— opsional/manual (smoke test langsung VPS Fase-3: 7 skenario HTTP terhadap server.15langsung melalui Node ESM biasa; memerlukanssh 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 menyertakantest:unit(lambat; dicakup oleh job CItest-unit).- Jalankan
npm run test:unitsecara manual sebelum melakukan push pada branch rilis.
- Jalankan
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-syncberhasil (dijalankan otomatis oleh pre-commit)npm run check:docs-allberhasil (payung: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links)npm run check:env-doc-synckeluar dengan kode 0 — kontrak env antara kode ↔.env.example↔docs/reference/ENVIRONMENT.mdtetap utuhnpm run check:doc-linkskeluar dengan kode 0 — tidak ada referensi markdown internal yang rusak setelah restrukturisasidocs/architecture/ARCHITECTURE.mdditinjau untuk mendeteksi penyimpangan penyimpanan/runtimedocs/guides/TROUBLESHOOTING.mdditinjau untuk mendeteksi penyimpangan variabel env dan operasional- Jika
.env.exampleberubah:docs/reference/ENVIRONMENT.mddiperbarui - Jika fitur baru memiliki UI:
docs/guides/USER_GUIDE.mdmenyebutkannya - Jika fitur baru memiliki API:
docs/reference/API_REFERENCE.md+docs/openapi.yamldiperbarui - Jika fitur baru merupakan modul: tersedia
docs/<MODULE>.mdkhusus - Jika terdapat perubahan yang merusak kompatibilitas:
docs/guides/TROUBLESHOOTING.mdmemiliki catatan migrasi
i18n
npm run i18n:checkkeluar 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-coveragekeluar dengan kode 0 — setiap locale UI berada pada atau di atas batas minimum cakupan 80%npm run i18n:sync-ui:drymelaporkan 0 kunci yang hilang di seluruh 42 locale- Jika dokumentasi sumber berbahasa Inggris berubah, jalankan
npm run i18n:run(memerlukanOMNIROUTE_TRANSLATION_API_KEYdi.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)
- Setiap migrasi bersifat idempoten (
- Uji pada instalasi baru: hapus
~/.omniroute/omniroute.dbdan jalankannpm 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.tsvalid saat dimuat- Semua penyedia memiliki bidang wajib (
id,label,kind, dll.) freeNotedisediakan untuk penyedia gratis baru- Penyedia OAuth memiliki
oauthConfigyang terdaftar disrc/lib/oauth/constants/oauth.ts
- Semua penyedia memiliki bidang wajib (
- 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:packagedberhasil- Build diuji setidaknya untuk salah satu dari
:win,:mac,:linux - Sertifikat penandatanganan kode belum kedaluwarsa (jika melakukan penandatanganan)
- Versi
electron/package.jsoncocok denganpackage.jsonroot - 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 isidist/ke direktoriapp/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:releaseberhasil dandist/BUILD_SHA==git rev-parse --short HEADnpm run check:pack-artifactbersih — tidak adaapp.__qa_backup,scripts/scratch,package-lock.json, atau residu lokal lainnyadist/server.jstersedia 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)
- Membuat tag
- 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_modulesbenar-benar tersedia (checkout utama atau worktree yang telah menjalankannpm 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/completionsterhadap penyedia yang diketahui - Verifikasi
/api/monitoring/healthmengembalikan circuit breakerCLOSED - Konfirmasikan transport MCP merespons (
/mcpHTTP,/mcp-sseSSE)
- Buka
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.jsonuntuk 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_ENABLEDtetap nonaktif secara default - Lakukan uji asap pada
GET /planos,/termos,/privacidade, dan/reembolsodi 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.jsonyang 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 selesaicurl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'mengembalikan"9router"(BUKAN 404, BUKAN 500). Mengonfirmasi bahwa migrasi071_services.sqlditerapkan + 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 bahwa070_webhooks_kind_metadata.sqlditerapkan).node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tsberhasil — mencegah benturan di masa mendatang.
9Router
POST /api/services/9router/installmengembalikan 200 denganinstalledVersiondalam waktu kurang dari 2 mntPOST /api/services/9router/startmengembalikan 200 danstate: "running"dalam waktu kurang dari 30 dtkGET /api/services/9router/statusmelaporkanhealth: "healthy"POST /v1/chat/completionsdengan"model": "9router/auto/..."mengembalikan 200 (perutean menyeluruh melalui 9Router)GET /dashboard/providers/services/9router/embed/dashboardmerender UI native 9Router di dalam proxy (tanpa iframe langsung127.0.0.1:port)POST /api/services/9router/rotate-keymengembalikan{ keyRotated: true }dan layanan dimulai ulang dengan baikPOST /api/services/9router/stopmengembalikan 200 danstate: "stopped"GET /api/services/9router/logs?tail=50mengembalikan stream SSE dengan peristiwasnapshotyang berisi baris-baris terbaru- Instalasi di lingkungan tanpa
npmdi PATH mengembalikan 500 dengan pesan kesalahan yang mudah dipahami (bukan stack trace)
CLIProxyAPI
POST /api/services/cliproxy/installmengembalikan 200 dalam waktu kurang dari 2 mntPOST /api/services/cliproxy/startmengembalikan 200 danstate: "running"dalam waktu kurang dari 30 dtkGET /api/services/cliproxy/statusmelaporkanhealth: "healthy"POST /api/services/cliproxy/stopmengembalikan 200 danstate: "stopped"GET /api/services/cliproxy/logs?tail=50mengembalikan stream SSE
Regresi keamanan
curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/startmengembalikan403 LOCAL_ONLYcurl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/startmengembalikan403 LOCAL_ONLY- Respons kesalahan dari
/api/services/*tidak berisierr.stackatau path file absolut
Pemeriksaan v3.8.0+
Sebelum merilis versi v3.8.x apa pun, verifikasi item tambahan berikut:
omniroute --trayberhasil di-boot pada macOS (systray2 terinstal ke~/.omniroute/runtime/)omniroute --trayberhasil di-boot pada Linux (memerlukan DISPLAY; menampilkan kesalahan dengan baik jika tidak ditetapkan)omniroute --trayberhasil di-boot pada Windows (PowerShell NotifyIcon, tanpa biner tambahan)omniroute config tray enablemembuat entri mulai otomatis; penonaktifan menghapusnyanpm install -g omniroute@<this-version>menjalankan postinstall tanpa keluar secara fatal- Jalur pembaruan mempertahankan dependensi opsional:
omniroute update --applydan pembaru otomatis menjalankannpm install -g … --include=optionalagaroptionalDependencies(better-sqlite3, keytar, tls-client, dan stack SLM llmlingua:@atjsh/llmlingua-2@2.0.5,js-tiktoken) tetap tersedia setelah pembaruan. Tingkat SLM ultramodelPathjuga memerlukan model tinybert, yang diunduh secara otomatis ke${DATA_DIR}/models/llmlinguasaat pertama kali digunakan. Postinstall (scripts/build/colocateOptionals.mjs) kemudian menempatkan closure opsional SLM bersama-sama ke dalamdist/node_modulesagar 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 statusberfungsi tanpa.env(jalur token CLI, hanya loopback)curl http://localhost:20128/api/shutdownmengembalikan 401 (rute yang selalu dilindungi)curl -H "host: evil.com" http://localhost:20128/api/mcp/ssemengembalikan 401 (pengaman loopback)- Runtime SQLite di-resolve ke
bundledsaat pertama kali dijalankan (biner yang dibundel valid untuk platform) - Runtime SQLite beralih ke
runtimeketikanode_modules/better-sqlite3dihapus - Filter MCP pintar mengompresi output nyata
playwright-mcp browser_snapshot(pengurangan ≥50%) - Semua 10 file
skills/omniroute*/SKILL.mddapat 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:
gh release edit vX.Y.Z --prerelease(menandainya sebagai bukan versi terbaru)git tag -d vX.Y.Z && git push --delete origin vX.Y.Z(hanya jika belum digunakan oleh pengguna)- Atau: lakukan hotfix pada
release/vX.Y.0→ rilis patchvX.Y.(Z+1) - Segera komunikasikan di GitHub Discussions dan Discord
Aturan Ketat
- Jangan pernah melakukan commit langsung ke
main - Jangan pernah menggunakan
git push --forceke branchmainataurelease/* - 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/, ataubin/
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).