Контекст
Метод versionInfo в packages/nocodb/src/services/utils.service.ts получает список тегов nocodb через https://api.github.com/repos/nocodb/nocodb/tags и берёт поле name из каждого элемента ответа:
// utils.service.ts:99 const nonBetaTags = await axios .get('https://api.github.com/repos/nocodb/nocodb/tags', { timeout: 5000 }) .then((response) => { return response.data .map((x) => x.name) .filter((v) => validate(v) && v.match(/^\d+.\d+.\d+$/)) .sort((x, y) => compareVersions(y, x)); }) .catch(() => null);
С 2026-01 GitHub изменил формат ответа /repos/{owner}/{repo}/tags: к каждому элементу добавлены поля commit.protection и commit.sha, а сам тег теперь приходит в tag.ref вместо name, в формате refs/tags/X.Y.Z. Старое поле name помечено deprecated и удалено в этой версии API.
Изменения API
Старый формат:
[{ "name": "0.260.0", "commit": { "sha": "...", "url": "..." } }]
Новый формат:
[{ "ref": "refs/tags/0.260.0", "commit": { "sha": "...", "url": "...", "protection": { "required_status_checks": { ... } } } }]
Acceptance criteria
Контекст
Метод
versionInfoвpackages/nocodb/src/services/utils.service.tsполучает список тегов nocodb через https://api.github.com/repos/nocodb/nocodb/tags и берёт поле name из каждого элемента ответа:// utils.service.ts:99 const nonBetaTags = await axios .get('https://api.github.com/repos/nocodb/nocodb/tags', { timeout: 5000 }) .then((response) => { return response.data .map((x) => x.name) .filter((v) => validate(v) && v.match(/^\d+.\d+.\d+$/)) .sort((x, y) => compareVersions(y, x)); }) .catch(() => null);С 2026-01 GitHub изменил формат ответа
/repos/{owner}/{repo}/tags: к каждому элементу добавлены поляcommit.protectionиcommit.sha, а сам тег теперь приходит вtag.refвместо name, в форматеrefs/tags/X.Y.Z. Старое поле name помечено deprecated и удалено в этой версии API.Изменения API
Старый формат:
[{ "name": "0.260.0", "commit": { "sha": "...", "url": "..." } }]Новый формат:
[{ "ref": "refs/tags/0.260.0", "commit": { "sha": "...", "url": "...", "protection": { "required_status_checks": { ... } } } }]Acceptance criteria
versionInfoвutils.service.tsпарсит тег изref(refs/tags/X.Y.Z→X.Y.Z), а не из name./^\d+\.\d+\.\d+$/остаётся, фильтр beta/preview не трогается.commit.sha(защищённый протекшеном), он отбрасывается.pnpm run build(илиbootstrap) проходит, типы корректны.