Batch 1 of the locale expansion: Greek, Croatian, Serbian, Lithuanian, Estonian, Latvian, Slovenian, Maltese and Irish across the dashboard catalog, docs mirrors, CLI catalog, README, locale index and the site. 42 → 51 locales. Also fixes the ICU literal escape the translation backend dropped around angle placeholders, four translations that invented or renamed a placeholder, the language bars that linked to mirrors that do not exist, and the migration count drift (171 → 172). ⚠️ base-red inherited: #12732 — the four unit shards and Fast Quality Gates fail identically on unrelated PRs cut from the same base.
39 KiB
RELEASE_CHECKLIST (Ελληνικά)
🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN · 🇹🇼 zh-TW
title: "Λίστα Ελέγχου Έκδοσης" version: 3.8.51 lastUpdated: 2026-08-28
Λίστα Ελέγχου Έκδοσης
Τελευταία ενημέρωση: 2026-08-28 — v3.8.51 Βελτιωμένη ροή έκδοσης που αξιοποιεί τις δεξιότητες του Claude Code για αυτοματισμό.
Διατηρείτε την ουρά/κλάδο σε πράσινη κατάσταση μεταξύ εκδόσεων: δείτε RELEASE_GREEN.md (οικογένεια
/green-prs+npm run check:release-green+/babysit+ νυχτερινό). Η εκτέλεση αυτού περιοδικά — και ιδιαίτερα πριν από αυτή τη λίστα ελέγχου — κάνει το PR έκδοσης να ξεκινά σε πράσινη κατάσταση.
Σύνοψη
# 1. Αύξηση έκδοσης + δημιουργία CHANGELOG (δεξιότητα)
/version-bump-cc patch # ή minor/major
# 2. Εκτέλεση τοπικής πύλης ποιότητας
npm run check # lint + tests
npm run test:coverage # πλήρης έλεγχος κάλυψης (60/60/60/60)
# 3. Κατασκευή & smoke test
npm run build
npm run test:e2e # προαιρετικό αλλά συνιστάται
# 4. Δημιουργία έκδοσης (δεξιότητα)
/generate-release-cc
# 5. Ανάπτυξη (δεξιότητα)
/deploy-vps-both-cc # ή akamai-cc / local-cc
# 6. Καταγραφή αποδεικτικών έκδοσης (δεξιότητα)
/capture-release-evidences-cc
Αξιόπιστη Δημοσίευση npm (προεπιλογή από v3.8.51) — σταδιακή κατόπιν αιτήματος, άμεση ως εφεδρική
Το npm-publish.yml δημοσιεύει μέσω Αξιόπιστης Δημοσίευσης npm (OIDC) από προεπιλογή: το
job stage-npm (φιλοξενούμενο στο github) ανταλλάσσει το id-token του GitHub με ένα βραχύβιο διαπιστευτήριο npm
για εκείνη την εκτέλεση — χωρίς μακροχρόνιο token npm στα μυστικά του αποθετηρίου, χωρίς προτροπή 2FA, με επισυναπτόμενη προέλευση.
Αυτός είναι ο τρόπος παράκαμψης των κυρώσεων npm τώρα που τα tokens που παρακάμπτουν το 2FA αποσύρονται·
αποκαθιστά την πλήρως αυτόματη ροή που είχε το έργο έως τη v3.8.48 διατηρώντας παράλληλα
την εγγύηση WS1.3 (ένα διαρρευσμένο token δεν μπορεί να δημοσιεύσει μόνο του — δεν υπάρχει token).
Εφάπαξ ρύθμιση (ιδιοκτήτης): npmjs.com → πακέτο omniroute → Ρυθμίσεις → Trusted
Publisher → GitHub: ιδιοκτήτης diegosouzapw, αποθετήριο OmniRoute, workflow npm-publish.yml
(περιβάλλον: κανένα). Μέχρι να υπάρχει αυτό, το αυτόματο βήμα αποτυγχάνει με ENEEDAUTH:
επανεκκινήστε με publish_mode=staged (παρακάτω) ή direct.
Σταδιακή δημοσίευση (κατόπιν αιτήματος — publish_mode=staged)
Το workflow npm-publish δεν δημοσιεύει πλέον άμεσα: εκκινεί το συμπιεσμένο tarball
(check:pack-boot) και στη συνέχεια εκτελεί το npm stage publish — τα ακριβή bytes παρκάρονται στο
μητρώο, μη εγκαταστάσιμα μέχρι να εγκρίνει ο ιδιοκτήτης. Η ανθρώπινη πύλη 2FA μετακινήθηκε
ΜΕΤΆ την απόδειξη, όχι πριν.
Ροή ιδιοκτήτη αφού το workflow γίνει πράσινο:
npm stage list omniroute— βρείτε το αναγνωριστικό σταδίου (εκτυπώνεται επίσης στην περίληψη του workflow).- Επαληθεύστε τα bytes σταδίου (συνιστάται):
npm stage download <id>, στη συνέχεια εγκαταστήστε το ληφθέν tarball σε ένα προσωρινό πρόθεμα και εκκινήστε το (npm run check:pack-bootαυτοματοποιεί την ίδια κρίση pack→install→boot στο CI). npm stage approve <id>— η προτροπή 2FA ΕΙΝΑΙ η δημοσίευση. Τοnpm stage reject <id>την απορρίπτει.- Δίκτυο μετά τη δημοσίευση: ο επαληθευτής μετά τη δημοσίευση (WS1.4 του σχεδίου v3.8.49) εγκαθιστά την δημοσιευμένη έκδοση από το δημόσιο μητρώο σε ένα καθαρό container και την εκκινεί.
Εφεδρική διαδικασία έκτακτης ανάγκης: workflow_dispatch με publish_mode=direct αποκαθιστά το
παλαιό άμεσο npm publish (χρησιμοποιήστε μόνο αν το ίδιο το staging δυσλειτουργεί· καταγράψτε τον λόγο).
Εφάπαξ σκλήρυνση (ιδιοκτήτης, npmjs.com): ρυθμίστε τον Αξιόπιστο Εκδότη για
το omniroute σε λειτουργία μόνο-σταδίου, ώστε ένα διαρρευσμένο μακροχρόνιο token να μην μπορεί να εκτελέσει npm publish
άμεσα από οπουδήποτε — το CI μπορεί μόνο να κάνει stage· μόνο το 2FA του ιδιοκτήτη δημοσιεύει.
Εγχειρίδιο κατεστραμμένου artifact (αμετάβλητο): npm deprecate omniroute@<bad> "<reason> — use <fixed>"
ως η προεπιλεγμένη άμεση αντίδραση (λεπτά, αναστρέψιμη)· npm unpublish μόνο εντός του παραθύρου 72ω/χωρίς-εξαρτήσεις
και ποτέ ως πρώτη κίνηση. Docker: ποτέ μην ξαναγράφετε ετικέτα έκδοσης — η επαναφορά γίνεται με
επαναστόχευση του latest στην τελευταία καλή κατάσταση digest.
Docker Hub latest (απαιτείται σε κάθε σταθερή δημοσίευση SemVer): το
workflow docker-publish πρέπει να επισημαίνει και τα δύο X.Y.Z και, όταν
το should-promote-latest.sh συμφωνεί ότι πρόκειται για την υψηλότερη σταθερή SemVer, :latest
με το ίδιο digest. Μετά το job: το digest latest του Hub ισούται με το νέο
digest SemVer και το last_updated ενημερώθηκε. Μην αφήνετε το :latest σε μια παλαιότερη
κατασκευή ενώ οι σημειώσεις έκδοσης αναφέρουν διορθώσεις που υπάρχουν μόνο στο git. Τα quickstarts Compose
χρησιμοποιούν :latest· το GitOps πρέπει να συνεχίσει να καρφιτσώνει X.Y.Z. Δείτε
Κανάλια έκδοσης Docker και #10317.
Γρήγορη Διαδρομή Hotfix (ετικέτα hotfix)
Ένα PR με ετικέτα hotfix παρακάμπτει τη βαριά μήτρα CI (9-shard E2E, coverage ratchet,
quality-gate, quality-extended) και διατηρεί τις γρήγορες, υψηλής αξιοπιστίας πύλες: build,
unit shards, integration, vitest, lint/typecheck, docs-sync, check:pack-artifact
και το tarball boot-smoke (check:pack-boot). Στόχος: πράσινο σε ≤15 λεπτά αντί για ~33 λεπτά.
Πολιτική εισόδου — και τα τέσσερα απαιτούνται (βασισμένα στις έκτακτες διαδρομές Chromium/VS Code/Node):
- Σοβαρότητα: η παραγωγή είναι χαλασμένη — ένα δημοσιευμένο artifact κολλάει κατά την εκκίνηση / μια διόρθωση ασφαλείας / κάθε χρήστης της έκδοσης επηρεάζεται. Το «Σημαντικό» δεν είναι «Χαλασμένο».
- Εξουσιοδότηση: μόνο ο ιδιοκτήτης του αποθετηρίου εφαρμόζει την ετικέτα
hotfix. Η ετικέτα ΕΙΝΑΙ η έγκριση — ποτέ μη χρησιμοποιείτε αυτοεξυπηρέτηση σε ένα PR εκστρατείας. - Τεκμηρίωση: το σώμα του PR συνδέει την προηγούμενη πλήρως πράσινη βαριά εκτέλεση (η σουίτα που τα παρακαμφθέντα jobs θα επαναεπικύρωναν) καθώς και το δικό του τεστ που αρχικά απέτυχε και μετά πέρασε.
- Εύρος: μόνο cherry-pick — η ελάχιστη διόρθωση, χωρίς αναδιαμορφώσεις, χωρίς επιπλέον αλλαγές.
Η παρακαμφθείσα επιφάνεια coverage/ratchet επαναεπικυρώνεται από την επόμενη πλήρη εκτέλεση στον
κλάδο έκδοσης (συνεχής πράσινη έκδοση) — η διαδρομή παρακάμπτει την ΑΝΑΜΟΝΗ, ποτέ την επικύρωση.
Οι διαφορές μόνο τεστ (όλα τα αρχεία κάτω από tests/, κανένα κάτω από tests/e2e/) παρακάμπτουν τη
μήτρα E2E αυτόματα, χωρίς καμία ετικέτα.
Λεπτομερής Λίστα Ελέγχου
Πριν την έκδοση
- Όλα τα PRs που στοχεύουν αυτή την έκδοση έχουν συγχωνευτεί στο
release/vX.Y.0 - Όλα τα ανοιχτά Linear/issue για αυτή την έκδοση είναι κλειστά ή έχουν μεταφερθεί στο επόμενο milestone
- CI πράσινο στον κλάδο
release/vX.Y.0 - Δεν υπάρχουν σημαδάκια
TODO(release)στον κώδικα:grep -r "TODO(release)" src/ open-sse/ - Η βασική εικόνα Docker είναι ενημερωμένη (τρέχουσα
node:24.15.0-trixie-slim)
Έκδοση & Αρχείο Αλλαγών
- Εκτελέστε
/version-bump-cc <patch|minor|major>(Claude Code skill)- Ανεβάζει
package.json,electron/package.json - Αναγεννά
CHANGELOG.mdαπό τα git commits από την τελευταία ετικέτα - Ενημερώνει τα badges README.md
- Ανεβάζει
- Ελέγξτε χειροκίνητα το CHANGELOG.md και καθαρίστε τα μηνύματα commits αν χρειάζεται
- Βεβαιωθείτε ότι η τελευταία ενότητα semver στο
CHANGELOG.mdισούται με την έκδοσηpackage.json - Διατηρήστε το
## [Unreleased]ως την πρώτη ενότητα changelog για επερχόμενη εργασία - Ενημερώστε
docs/openapi.yaml→ τοinfo.versionπρέπει να ισούται με την έκδοσηpackage.json
Ποιότητα Κώδικα
npm run lint— 0 σφάλματα (οι προειδοποιήσεις είναι προϋπάρχουσες)npm run typecheck:core— καθαρόnpm run typecheck:noimplicit:core— καθαρό (strict)npm run check:cycles— χωρίς κυκλικές εξαρτήσειςnpm run check:any-budget:t11— εντός προϋπολογισμούnpm run check:route-validation:t06— καθαρόnpm run check:node-runtime— το υποστηριζόμενο runtime floor πληρούται (>=22.22.2 <23,>=24.0.0 <27, ανάSUPPORTED_NODE_RANGEστοsrc/shared/utils/nodeRuntimeSupport.ts; ευθυγραμμισμένο μεenginesτουpackage.json)
Δοκιμές
npm run test:unit— επιτυχίαnpm run test:vitest— επιτυχία (MCP server, autoCombo, cache)npm run test:coverage— η πύλη 60/60/60/60 ικανοποιείται (statements/lines/functions/branches)npm run test:integration— επιτυχία (αν οι αλλαγές αφορούν DB / handlers)npm run test:combo:matrix— επιτυχία (μήτρα στρατηγικής combo: αποδεικνύει ντετερμινιστικά τις αποφάσεις επιλογής όλων των 19 δημόσιων στρατηγικών δρομολόγησης· εκτελέστε όταν αγγίζετε combo routing, στρατηγική resolution ή fallback logic)RUN_COMBO_LIVE=1 npm run test:combo:live— προαιρετικό/χειροκίνητο (πραγματικό smoke με πραγματικά upstream· χρησιμοποιεί ένα read-only DB snapshot από VPSroot@192.168.0.15· χτυπά πραγματικούς παρόχους, κοστίζει credits· δεν εκτελείται ποτέ στο CI· παρακάμπτεται καθαρά χωρίς την πύλη)npm run test:combo:live:vps— προαιρετικό/χειροκίνητο (Phase-3 VPS live smoke: 7 σενάρια HTTP έναντι του ζωντανού διακομιστή.15μέσω plain Node ESM· απαιτείssh root@192.168.0.15· δημιουργεί/διαγράφει μόνο__live_test__*combos· χτυπά πραγματικούς παρόχους· δεν εκτελείται ποτέ στο CI)npm run test:e2e— επιτυχία (αλλαγές UI)npm run test:protocols:e2e— επιτυχία (αλλαγές MCP/A2A)npm run test:ecosystem— επιτυχία
Hooks (Επικυρωμένα από Husky)
Τα Husky hooks βρίσκονται στο .husky/ και εκτελούνται αυτόματα σε git λειτουργίες.
- pre-commit:
npx lint-staged + node scripts/check/check-docs-sync.mjs + npm run check:any-budget:t11 - pre-push: γρήγορες ντετερμινιστικές πύλες —
npm run check:any-budget:t11 && npm run check:tracked-artifacts(ενεργοποιήθηκε 2026-06-13). Σκόπιμα εξαιρεί τοtest:unit(αργό· καλύπτεται από το CI jobtest-unit).- Εκτελέστε
npm run test:unitχειροκίνητα πριν κάνετε push κλάδους έκδοσης.
- Εκτελέστε
Αν ένα hook αποτύχει: διορθώστε το υποκείμενο πρόβλημα, μην παρακάμψετε με --no-verify.
Συμβατικές Δεσμεύσεις
Όλες οι δεσμεύσεις για έκδοση πρέπει να ακολουθούν τη μορφή type(scope): subject.
Έγκυροι τύποι: feat, fix, refactor, docs, test, chore, perf, style, ci
Έγκυρα scopes: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills, cloud-agent, guardrails, compression, auto-combo, resilience, providers, executors, translator, domain, authz
Αλλαγές που σπάνε συμβατότητα: προσθέστε υποσέλιδο BREAKING CHANGE: ή ! μετά το scope (π.χ. feat(api)!: drop /v0).
Τεκμηρίωση
- Το
npm run check:docs-syncπερνά (εκτελείται αυτόματα από pre-commit) - Το
npm run check:docs-allπερνά (ομπρέλα: docs-sync + docs-counts + env-doc-sync + deprecated-versions + doc-links) - Το
npm run check:env-doc-syncτερματίζει με 0 — η σύμβαση env κώδικα ↔.env.example↔docs/reference/ENVIRONMENT.mdείναι άθικτη - Το
npm run check:doc-linksτερματίζει με 0 — δεν υπάρχουν σπασμένες εσωτερικές αναφορές markdown μετά από αναδιάρθρωση - Το
docs/architecture/ARCHITECTURE.mdελέγχθηκε για αποκλίσεις storage/runtime - Το
docs/guides/TROUBLESHOOTING.mdελέγχθηκε για αποκλίσεις env var και λειτουργικές αποκλίσεις - Αν το
.env.exampleάλλαξε: τοdocs/reference/ENVIRONMENT.mdενημερώθηκε - Αν το νέο χαρακτηριστικό έχει UI: το
docs/guides/USER_GUIDE.mdτο αναφέρει - Αν το νέο χαρακτηριστικό έχει API: το
docs/reference/API_REFERENCE.md+docs/openapi.yamlενημερώθηκαν - Αν το νέο χαρακτηριστικό είναι module: υπάρχει αφιερωμένο
docs/<MODULE>.md - Αν υπάρχει αλλαγή που σπάει συμβατότητα: το
docs/guides/TROUBLESHOOTING.mdέχει σημείωση μετάβασης
i18n
- Το
npm run i18n:checkτερματίζει με 0 — η κατάσταση μετάφρασης (.i18n-state.json) είναι συγχρονισμένη με τα πηγαία έγγραφα (χωρίς αποκλιμένες πηγές σε strict mode· η advisory warn-mode είναι αποδεκτή για τελευταία στιγμή doc touch-ups, αλλά πρέπει να είναι 0 πριν το tagging) - Το
npm run i18n:check-ui-coverageτερματίζει με 0 — κάθε locale UI βρίσκεται πάνω ή στο όριο κάλυψης 80% - Το
npm run i18n:sync-ui:dryαναφέρει 0 ελλείποντα κλειδιά σε όλα τα 42 locales - Αν τα πηγαία αγγλικά έγγραφα άλλαξαν, εκτελέστε
npm run i18n:run(απαιτείOMNIROUTE_TRANSLATION_API_KEYστο.env) πριν το tagging - Οι συνεισφορές μετάφρασης μπορούν να αναβληθούν στην επόμενη έκδοση αν είναι μικρές (παρακολουθήστε στο CHANGELOG)
Μεταναστεύσεις Βάσης Δεδομένων
- Αν το
src/lib/db/migrations/έχει νέα αρχεία:- Κάθε μετανάστευση είναι idempotent (
CREATE TABLE IF NOT EXISTS, κ.λπ.) - Οι μεταναστεύσεις τυλιγμένες σε transactions
- Αριθμημένες σωστά (χωρίς κενά στην ακολουθία)
- Κάθε μετανάστευση είναι idempotent (
- Δοκιμή σε νέα εγκατάσταση: διαγράψτε
~/.omniroute/omniroute.dbκαι εκτελέστεnpm run dev - Δοκιμή σε υπάρχουσα εγκατάσταση: δημιουργία αντιγράφου ασφαλείας DB, εκτέλεση μετανάστευσης, επαλήθευση schema
- Τα αρχεία WAL (
-wal,-shm) χειρίζονται σωστά αν η μετανάστευση ξαναγράφει πίνακες
Κατάλογος Παρόχων (Επικυρωμένος από Zod)
- Το Zod schema του
src/shared/constants/providers.tsείναι έγκυρο κατά τη φόρτωση- Όλοι οι πάροχοι έχουν τα απαιτούμενα πεδία (
id,label,kind, κ.λπ.) - Παρέχεται
freeNoteγια νέους δωρεάν παρόχους - Οι πάροχοι OAuth έχουν
oauthConfigεγγεγραμμένο στοsrc/lib/oauth/constants/oauth.ts
- Όλοι οι πάροχοι έχουν τα απαιτούμενα πεδία (
- Αν προστέθηκε νέος πάροχος: αντίστοιχος executor στο
open-sse/executors/ - Αν δεν είναι μορφή OpenAI: translator στο
open-sse/translator/ - Τα μοντέλα είναι εγγεγραμμένα στο
open-sse/config/providerRegistry.ts - Τα unit tests στο
tests/unit/καλύπτουν ταξινόμηση παρόχου και δρομολόγηση
Desktop (Electron)
Αν το electron/ άλλαξε:
- Το
npm run electron:smoke:packagedπερνά - Builds δοκιμασμένα για τουλάχιστον ένα από
:win,:mac,:linux - Τα πιστοποιητικά υπογραφής κώδικα δεν έχουν λήξει (αν υπογράφετε)
- Η έκδοση
electron/package.jsonταιριάζει με την έκδοση rootpackage.json - Ο δείκτης καναλιού auto-update ενημερώθηκε αν εκδίδεται στο
stable
Διάταξη Build
Το αποθετήριο χρησιμοποιεί τρεις ξεχωριστούς καταλόγους εξόδου — μην τους μπερδεύετε:
| Κατάλογος | Σκοπός | Παρακολουθείται; |
|---|---|---|
src/ |
Πηγαίος κώδικας εφαρμογής (TypeScript / TSX) | Ναι |
.build/ |
Ενδιάμεσα build — έξοδος next build (distDir) |
Όχι (gitignored) |
dist/ |
Δέσμη npm για αποστολή — συναρμολογείται από assembleStandalone |
Όχι (gitignored) |
Σημείωση χειριστή: ο κατάλογος εικόνων στο απομακρυσμένο VPS παραμένει
/usr/lib/node_modules/omniroute/app/. Μόνο η έξοδος build εντός αποθετηρίου μετακινήθηκε (app/→dist/). Τα deploy skills rsync περιεχόμεναdist/στον απομακρυσμένο κατάλογοapp/— δεν απαιτούνται αλλαγές VPS path.
Ροή μονής κατασκευής:
npm run build:release
└─ rm -rf .build dist (καθαρισμός)
└─ next build → .build/next/ (ενδιάμεσα)
└─ assembleStandalone (αντιγράφει standalone + static + public + natives → dist/)
└─ γράφει dist/BUILD_SHA (sentinel HEAD)
ΜΗΝ εκτελέσετε npm run build ακολουθούμενο από ξεχωριστό npm run build:cli για deploy — χρησιμοποιήστε
npm run build:release που κάνει καθαρή ανακατασκευή + sentinel σε μία εντολή.
Επικύρωση Artifact
- Το
npm run build:releaseεπιτυγχάνει καιdist/BUILD_SHA==git rev-parse --short HEAD - Το
npm run check:pack-artifactκαθαρό — χωρίςapp.__qa_backup,scripts/scratch,package-lock.jsonή άλλα τοπικά υπολείμματα - Το
dist/server.jsυπάρχει μετά το build
Tagging & Έκδοση
- Εκτελέστε
/generate-release-cc(Claude Code skill):- Δημιουργεί ετικέτα
vX.Y.Z - Κάνει push ετικέτα και κλάδο
- Ανοίγει GitHub Release με σώμα changelog
- Επισυνάπτει installers Electron (αν κατασκευάστηκαν)
- Δημιουργεί ετικέτα
- Ή χειροκίνητα:
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
Τα deploy skills χρησιμοποιούν τη ελαφριά ροή rsync — χωρίς npm pack, χωρίς npm i -g:
- Χρησιμοποιήστε το deploy skill που ταιριάζει στον στόχο:
/deploy-vps-local-cc— τοπικό VPS (192.168.0.15)/deploy-vps-akamai-cc— Akamai VPS (69.164.221.35)/deploy-vps-both-cc— και τα δύο
- Πριν το deploy, επιβεβαιώστε ότι
dist/BUILD_SHA==git rev-parse --short HEAD - Το build πρέπει να εκτελείται εκεί που το
node_modulesείναι πραγματικό (κύρια checkout ή worktree μεnpm ci— ΟΧΙ symlinked worktree) - Smoke test της αναπτυγμένης περίπτωσης:
- Ανοίξτε
/dashboard/health→ ελέγξτε ότι το string έκδοσης ταιριάζει με την έκδοση - Εκτελέστε αίτημα
/v1/chat/completionsέναντι γνωστού παρόχου - Επαληθεύστε ότι το
/api/monitoring/healthεπιστρέφειCLOSEDcircuit breakers - Επιβεβαιώστε ότι τα MCP transports ανταποκρίνονται (
/mcpHTTP,/mcp-sseSSE)
- Ανοίξτε
Μετά την Έκδοση
- Εκτελέστε
/capture-release-evidences-cc(Claude Code skill)- Λαμβάνει WebP screenshots/recordings νέων χαρακτηριστικών
- Επισυνάπτει στις σημειώσεις έκδοσης / ανάρτηση blog
- Ενημερώστε GitHub Discussions / Discord με ανακοίνωση έκδοσης
- Ανοίξτε milestone για την επόμενη έκδοση
- Αν κρίσιμο: καρφιτσώστε συζήτηση ή δημοσιεύστε στο
news.jsonγια in-app banner
Πύλη δημόσιας έναρξης Radar
Η ανακοίνωση Radar δεσμεύεται σκόπιμα με active: false. Η ενεργοποίηση είναι ξεχωριστή
αλλαγή αφού κάθε στοιχείο παρακάτω τεκμηριωθεί:
- Όλα τα στοιβαγμένα Radar PRs έχουν συγχωνευτεί και το CI tip έκδοσης είναι πράσινο
- Αναπτύξτε και κάντε smoke τις OSS Radar routes με το
RADAR_ENABLEDακόμα απενεργοποιημένο από προεπιλογή - Smoke
GET /planos,/termos,/privacidade, και/reembolsoστον ονοματοδοτημένο Radar host - Καταγράψτε ταυτότητα/επικοινωνία/διεύθυνση χειριστή και εγκεκριμένη νομική ανασκόπηση από τον ιδιοκτήτη στην ιδιωτική υπηρεσία
- Δοκιμάστε Stripe Checkout και υπογεγραμμένο webhook σε test mode μόνο
- Δοκιμάστε μία κρυπτογραφημένη συναλλακτική αποστολή email με τον εγκεκριμένο αποστολέα/domain
- Αποδείξτε επαναφορά αντιγράφου ασφαλείας και μία εποπτευόμενη εκτέλεση έρευνας με περιορισμό προϋπολογισμού
- Εγκρίνετε την πολιτική ανασκόπησης BRL/PIX πριν αποδεχτείτε αποδεικτικά δωρεάς
- Ενεργοποιήστε δημόσιο Checkout μόνο μετά τις προηγούμενες πύλες, έπειτα ενεργοποιήστε το νέο ID
news.json - Επαληθεύστε ότι το Home banner χρησιμοποιεί τοπικοποιημένο αντίγραφο και ότι ένα νέο ID εμφανίζεται ξανά αφού ένα παλαιότερο ID απορριφθεί
Καπνός ενσωματωμένων υπηρεσιών (v3.8.4+)
Πριν από την αποστολή οποιασδήποτε έκδοσης που περιλαμβάνει αλλαγές σε ενσωματωμένες υπηρεσίες, επαληθεύστε:
Εκκίνηση από νέα βάση δεδομένων (εντοπίζει συγκρούσεις μεταναστεύσεων — προστέθηκε μετά από hotfix v3.8.4)
DATA_DIR=$(mktemp -d) npm start &— περιμένετε 10 δ για εκκίνησηcurl -s http://127.0.0.1:20128/api/services/9router/status | jq '.tool'επιστρέφει"9router"(ΟΧΙ 404, ΟΧΙ 500). Επιβεβαιώνει ότι η μετανάστευση071_services.sqlεφαρμόστηκε + η σειρά τοποθετήθηκε.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(version_manager);" | grep -E "provider_expose|logs_buffer_path|last_sync_at"επιστρέφει 3 σειρές.sqlite3 $DATA_DIR/storage.sqlite "PRAGMA table_info(webhooks);" | grep -E "kind|metadata_encrypted"επιστρέφει 2 σειρές (επικυρώνει ότι το070_webhooks_kind_metadata.sqlεφαρμόστηκε).node --import tsx/esm --test tests/unit/db/no-migration-collisions.test.tsπερνά — προστατεύει από μελλοντικές συγκρούσεις.
9Router
POST /api/services/9router/installεπιστρέφει 200 μεinstalledVersionσε λιγότερο από 2 λεπτάPOST /api/services/9router/startεπιστρέφει 200 καιstate: "running"σε λιγότερο από 30 δGET /api/services/9router/statusαναφέρειhealth: "healthy"POST /v1/chat/completionsμε"model": "9router/auto/..."επιστρέφει 200 (ολοκληρωμένη δρομολόγηση μέσω 9Router)GET /dashboard/providers/services/9router/embed/dashboardαποδίδει το εγγενές UI του 9Router εντός του proxy (χωρίς άμεσο iframe127.0.0.1:port)POST /api/services/9router/rotate-keyεπιστρέφει{ keyRotated: true }και η υπηρεσία επανεκκινεί ομαλάPOST /api/services/9router/stopεπιστρέφει 200 καιstate: "stopped"GET /api/services/9router/logs?tail=50επιστρέφει ροή SSE με συμβάνsnapshotπου περιέχει πρόσφατες γραμμές- Εγκατάσταση σε περιβάλλον χωρίς
npmστο PATH επιστρέφει 500 με φιλικό μήνυμα σφάλματος (χωρίς stack trace)
CLIProxyAPI
POST /api/services/cliproxy/installεπιστρέφει 200 σε λιγότερο από 2 λεπτάPOST /api/services/cliproxy/startεπιστρέφει 200 καιstate: "running"σε λιγότερο από 30 δGET /api/services/cliproxy/statusαναφέρειhealth: "healthy"POST /api/services/cliproxy/stopεπιστρέφει 200 καιstate: "stopped"GET /api/services/cliproxy/logs?tail=50επιστρέφει ροή SSE
Παλινδρόμηση ασφάλειας
curl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/9router/startεπιστρέφει403 LOCAL_ONLYcurl -H "X-Forwarded-For: 1.2.3.4" http://localhost:20128/api/services/cliproxy/startεπιστρέφει403 LOCAL_ONLY- Οι αποκρίσεις σφάλματος από το
/api/services/*δεν περιέχουνerr.stackή απόλυτες διαδρομές αρχείων
Έλεγχοι v3.8.0+
Πριν από την αποστολή οποιασδήποτε έκδοσης v3.8.x, επαληθεύστε αυτά τα επιπλέον στοιχεία:
omniroute --trayεκκινεί στο macOS (το systray2 εγκαθίσταται στο~/.omniroute/runtime/)omniroute --trayεκκινεί στο Linux (απαιτεί DISPLAY· ομαλό σφάλμα εάν δεν έχει οριστεί)omniroute --trayεκκινεί στα Windows (PowerShell NotifyIcon, χωρίς επιπλέον δυαδικά αρχεία)omniroute config tray enableδημιουργεί καταχώρηση αυτόματης εκκίνησης· το disable την αφαιρείnpm install -g omniroute@<this-version>εκτελεί το postinstall χωρίς εξαναγκαστική έξοδο- Η διαδρομή ενημέρωσης διατηρεί τις προαιρετικές εξαρτήσεις: τα
omniroute update --applyκαι ο αυτόματος ενημερωτής εκτελούνnpm install -g … --include=optionalώστε ταoptionalDependencies(better-sqlite3, keytar, tls-client, και η στοίβα SLM llmlingua:@atjsh/llmlingua-2@2.0.5,js-tiktoken) να επιβιώνουν μετά από ενημέρωση. Το επίπεδο SLM ultramodelPathχρειάζεται επίσης το μοντέλο tinybert, που λαμβάνεται αυτόματα στο${DATA_DIR}/models/llmlinguaκατά την πρώτη χρήση. Στη συνέχεια το Postinstall (scripts/build/colocateOptionals.mjs) τοποθετεί συνεντοπισμένα την προαιρετική κλωστή SLM στοdist/node_modulesώστε ο worker να επιλύει ΕΝΑ ΜΟΝΟ instance@huggingface/transformers^4.2.0 — τα αυτόνομα bundle ίχνους μεταφέρουν μόνο το transformers, όχι τα δυναμικά εισαγόμενα optionals, επομένως χωρίς αυτό ο worker θα φόρτωνε το llmlingua-2 έναντι του transformers της ρίζας και το επίπεδο SLM θα αποτύγχανε αθόρυβα. omniroute statusλειτουργεί χωρίς.env(διαδρομή token CLI, μόνο loopback)curl http://localhost:20128/api/shutdownεπιστρέφει 401 (διαρκώς προστατευμένη διαδρομή)curl -H "host: evil.com" http://localhost:20128/api/mcp/sseεπιστρέφει 401 (φύλακας loopback)- Το runtime SQLite επιλύεται σε
bundledκατά την πρώτη εκτέλεση (το bundled δυαδικό αρχείο είναι έγκυρο για την πλατφόρμα) - Το runtime SQLite υποχωρεί σε
runtimeόταν διαγραφεί τοnode_modules/better-sqlite3 - Το έξυπνο φίλτρο MCP συμπιέζει πραγματική έξοδο
playwright-mcp browser_snapshot(μείωση ≥50%) - Όλα τα 10 αρχεία
skills/omniroute*/SKILL.mdείναι δημοσίως προσβάσιμα μέσω raw URL GitHub - Ο οδηγός εισαγωγής εμφανίζει το βήμα περιήγησης "How It Works" κατά την αρχική ρύθμιση
- Το widget κάλυψης επιπέδου στον κεντρικό πίνακα εμφανίζει τους αριθμούς ρυθμισμένων/ενεργών
Επαναφορά (Rollback)
Εάν μια έκδοση έχει κρίσιμο πρόβλημα:
gh release edit vX.Y.Z --prerelease(την επισημαίνει ως μη τελευταία)git tag -d vX.Y.Z && git push --delete origin vX.Y.Z(μόνο εάν δεν έχει ακόμη υιοθετηθεί από χρήστες)- Ή: hotfix στο
release/vX.Y.0→ patch έκδοσηvX.Y.(Z+1) - Άμεση ενημέρωση στα GitHub Discussions και Discord
Αυστηροί Κανόνες
- Ποτέ μην κάνετε commit απευθείας στο
main - Ποτέ μην χρησιμοποιείτε
git push --forceστοmainή σε κλάδουςrelease/* - Ποτέ μην παρακάμπτετε τα Husky hooks (
--no-verify) - Ποτέ μην κάνετε commit μυστικά, διαπιστευτήρια ή αρχεία
.env - Η κάλυψη πρέπει να παραμένει ≥60/60/60/60 (εντολές/γραμμές/συναρτήσεις/κλάδοι)
- Πάντα να συμπεριλαμβάνετε ή να ενημερώνετε τα tests όταν αλλάζετε κώδικα παραγωγής στα
src/,open-sse/,electron/ήbin/
Αυτοματοποιημένος Έλεγχος Συγχρονισμού
Εκτελέστε τον φρουρό συγχρονισμού τεκμηρίωσης τοπικά πριν ανοίξετε ένα PR:
npm run check:docs-sync
Το CI εκτελεί επίσης αυτόν τον έλεγχο στο .github/workflows/ci.yml (εργασία lint).