letopis 0.20.1 → 0.20.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -10
- package/package.json +1 -1
- package/scripts/release-notes.mjs +76 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,57 @@
|
|
|
2
2
|
|
|
3
3
|
Формат: [Keep a Changelog](https://keepachangelog.com/), версии — semver.
|
|
4
4
|
|
|
5
|
+
## [0.20.3] — 2026-07-31
|
|
6
|
+
|
|
7
|
+
### Fixed — релиз доезжает до npm
|
|
8
|
+
|
|
9
|
+
0.20.2 опубликовался на GitHub, но в npm **не уехал**: шаг заметок падал, а из-за `set -e`
|
|
10
|
+
вместе с ним пропускался `npm publish`.
|
|
11
|
+
|
|
12
|
+
Причина оказалась не в правах, а в том, откуда GitHub берёт workflow: для события `release`
|
|
13
|
+
файл читается **из коммита, на который указывает тег**, а не из `main`. Тег `v0.20.2` был
|
|
14
|
+
создан до правки, поэтому все перевыпуски крутили старую версию шага — тот, что ходил в PR-API
|
|
15
|
+
и получал `Resource not accessible by integration`. Исправление доехало только с новым тегом.
|
|
16
|
+
|
|
17
|
+
Сам шаг переписан: тело релиза берётся из `lib/CHANGELOG.md` тем же `scripts/release-notes.mjs`,
|
|
18
|
+
которым собирается описание релизного PR. Зависимости от PR-API нет, из прав нужен только
|
|
19
|
+
`contents: write`. Релиз 0.20.2 удалён как не дошедший до npm — его содержимое здесь, ниже.
|
|
20
|
+
|
|
21
|
+
## [0.20.2] — 2026-07-31
|
|
22
|
+
|
|
23
|
+
### Changed — заметки релиза перестали дублироваться
|
|
24
|
+
|
|
25
|
+
Тело GitHub Release собиралось `git-cliff`-ом, то есть из заголовков коммитов — вместо
|
|
26
|
+
осмысленного описания. Теперь текст живёт в одном месте и переиспользуется по цепочке:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
lib/CHANGELOG.md (руками) → описание PR → тело релиза → npm
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `release.yml` при публикации ставит в тело релиза **описание релизного PR** `dev→main`. PR
|
|
33
|
+
находится по коммиту, на который указывает тег; не нашёлся или пуст — тело не трогается.
|
|
34
|
+
- Новый `lib/scripts/release-notes.mjs` печатает секцию `## [x.y.z]` **текущей** версии пакета —
|
|
35
|
+
это и есть тело PR:
|
|
36
|
+
`gh pr create … --body "$(cd lib && node scripts/release-notes.mjs)"`.
|
|
37
|
+
Версия берётся из `package.json`, а не из аргумента: иначе можно выпустить заметки одной
|
|
38
|
+
версии под тегом другой. Нет записи для версии — exit 1 с той же подсказкой, что у `check:docs`.
|
|
39
|
+
- `git-cliff` и `cliff.toml` удалены. После перехода на заметки из PR от них оставались только
|
|
40
|
+
аннотация тега и подсказка про bump: первое даёт обычный `git log`, второе избыточно —
|
|
41
|
+
забытый бамп и так виден (тег такой версии уже есть → шаг пропускается → релиза нет).
|
|
42
|
+
Побочно: в job, который делает `npm publish`, больше нет стороннего экшена; из workflow
|
|
43
|
+
осталось только first-party (`actions/checkout`, `actions/setup-node`).
|
|
44
|
+
|
|
45
|
+
- `release.yml` берёт тело релиза **тем же скриптом из CHANGELOG**, а не через PR-API. Первая
|
|
46
|
+
попытка читала описание PR (`gh pr list/view`) и падала `Resource not accessible by
|
|
47
|
+
integration` — GITHUB_TOKEN на release-событии не получает доступ к PR-API этого репозитория,
|
|
48
|
+
и `pull-requests: read` не помог. Из-за `set -e` падал весь job, то есть `npm publish`
|
|
49
|
+
пропускался. Теперь зависимости от PR нет: чекаут стоит на теге, значит CHANGELOG и
|
|
50
|
+
package.json — ровно той версии, что публикуется; из прав нужен только `contents: write`.
|
|
51
|
+
|
|
52
|
+
Тег остался **аннотированным** — в сообщении список коммитов от предыдущего тега
|
|
53
|
+
(`git log --no-merges --pretty='- %s'`), так что `git show <tag>` показывает состав версии.
|
|
54
|
+
Шагов в workflow стало меньше: `tag` 3 (было 6), `release` 6 (было 8).
|
|
55
|
+
|
|
5
56
|
## [0.20.1] — 2026-07-31
|
|
6
57
|
|
|
7
58
|
### Fixed — движок схемы больше не отстаёт молча
|
|
@@ -60,7 +111,7 @@
|
|
|
60
111
|
```
|
|
61
112
|
push dev → ci (typecheck + check:docs + 198 тестов)
|
|
62
113
|
merge dev→main → tag (аннотированный тег из lib/package.json)
|
|
63
|
-
publish Release → release (
|
|
114
|
+
publish Release → release (описание из PR + npm publish + смоук артефакта)
|
|
64
115
|
```
|
|
65
116
|
|
|
66
117
|
- `ci.yml` — только `push: dev`. Ни `pull_request`, ни `push: main`: релизный PR и сам merge
|
|
@@ -75,18 +126,21 @@ publish Release → release (заметки git-cliff + npm publish + см
|
|
|
75
126
|
`test`. Без неё запрет «не мерджить на красном» держится на дисциплине: у PR своей проверки
|
|
76
127
|
нет, гарантию даёт зелёный прогон того же SHA на `dev`.
|
|
77
128
|
|
|
78
|
-
### Changed — флоу
|
|
129
|
+
### Changed — флоу релиза: тег с историей, заметки из PR, без сторонних экшенов
|
|
130
|
+
|
|
131
|
+
`tag.yml` ставит **аннотированный** тег: в сообщении — список коммитов от предыдущего тега,
|
|
132
|
+
поэтому `git show <tag>` и GitHub → Tags показывают состав версии без GitHub Release.
|
|
79
133
|
|
|
80
|
-
`
|
|
81
|
-
|
|
82
|
-
|
|
134
|
+
`release.yml` при публикации ставит в тело релиза **описание релизного PR** `dev→main`: оно
|
|
135
|
+
писалось осмысленно (что и почему, с замерами), в отличие от списка заголовков коммитов. PR
|
|
136
|
+
находится по коммиту, на который указывает тег; если PR не нашёлся или пуст — тело не трогается.
|
|
83
137
|
|
|
84
|
-
`
|
|
85
|
-
|
|
86
|
-
поэтому заметки не теряют коммиты между публикациями). Описание релиза писать руками не нужно.
|
|
138
|
+
Источник версии — `lib/package.json`: тег обязан равняться тому, что уедет в npm. Забытый бамп
|
|
139
|
+
виден сразу — тег такой версии уже существует, шаг пропускается, релиза нет.
|
|
87
140
|
|
|
88
|
-
|
|
89
|
-
|
|
141
|
+
`git-cliff` и `cliff.toml` (заводились по образцу VP) удалены: после перехода на заметки из PR
|
|
142
|
+
от них оставались только аннотация тега и подсказка про bump — первое даёт обычный `git log`,
|
|
143
|
+
второе избыточно. Побочно ушла и зависимость от стороннего экшена в job, который публикует в npm.
|
|
90
144
|
|
|
91
145
|
## [0.20.0] — 2026-07-29
|
|
92
146
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "letopis",
|
|
3
|
-
"version": "0.20.
|
|
3
|
+
"version": "0.20.3",
|
|
4
4
|
"description": "Letopis (летопись): append-only versioned entity store on TimescaleDB with dot-notation chains — every change is a new row, history is first-class (asOf, versions, watch, cascade tombstones)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"timescaledb",
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Печатает в stdout секцию CHANGELOG для ТЕКУЩЕЙ версии пакета — тело релизного PR.
|
|
4
|
+
*
|
|
5
|
+
* cd lib && node scripts/release-notes.mjs # посмотреть
|
|
6
|
+
* gh pr create --base main --head dev --title "Release: …" \
|
|
7
|
+
* --body "$(cd lib && node scripts/release-notes.mjs)" # так и создавать PR
|
|
8
|
+
*
|
|
9
|
+
* Зачем: описание PR было единственным местом контура, где текст писался заново, хотя тот же
|
|
10
|
+
* текст уже есть в lib/CHANGELOG.md — источнике истины версии (его сверяет check-docs.mjs с
|
|
11
|
+
* package.json). Цепочка становится без дублирования:
|
|
12
|
+
*
|
|
13
|
+
* lib/CHANGELOG.md (руками) → описание PR → тело релиза (release.yml берёт из PR) → npm
|
|
14
|
+
*
|
|
15
|
+
* Версия НЕ передаётся аргументом намеренно: берётся из package.json, чтобы нельзя было
|
|
16
|
+
* выпустить заметки одной версии под тегом другой.
|
|
17
|
+
*/
|
|
18
|
+
//
|
|
19
|
+
// FILE: lib/scripts/release-notes.mjs
|
|
20
|
+
// VERSION: 1.0.0
|
|
21
|
+
// START_MODULE_CONTRACT
|
|
22
|
+
// PURPOSE: Вырезать из lib/CHANGELOG.md секцию текущей версии пакета и напечатать её — тело релизного PR, из которого release.yml берёт заметки релиза.
|
|
23
|
+
// SCOPE: чтение package.json + CHANGELOG, извлечение секции, печать в stdout.
|
|
24
|
+
// DEPENDS: none
|
|
25
|
+
// LINKS: M-RELEASE-NOTES, V-M-RELEASE-NOTES
|
|
26
|
+
// ROLE: SCRIPT
|
|
27
|
+
// MAP_MODE: LOCALS
|
|
28
|
+
// END_MODULE_CONTRACT
|
|
29
|
+
//
|
|
30
|
+
// START_MODULE_MAP
|
|
31
|
+
// section - (local) секция CHANGELOG по версии: от "## [x.y.z]" до следующей "## ["
|
|
32
|
+
// END_MODULE_MAP
|
|
33
|
+
//
|
|
34
|
+
// START_CHANGE_SUMMARY
|
|
35
|
+
// LAST_CHANGE: [v1.0.0 - Новый скрипт: тело релизного PR берётся из CHANGELOG, а не пишется заново]
|
|
36
|
+
// END_CHANGE_SUMMARY
|
|
37
|
+
import { readFile } from 'node:fs/promises';
|
|
38
|
+
import { fileURLToPath } from 'node:url';
|
|
39
|
+
import { join } from 'node:path';
|
|
40
|
+
|
|
41
|
+
const LIB = fileURLToPath(new URL('..', import.meta.url));
|
|
42
|
+
|
|
43
|
+
// START_CONTRACT: section
|
|
44
|
+
// PURPOSE: Достать из текста CHANGELOG секцию конкретной версии (без её заголовка).
|
|
45
|
+
// INPUTS: { changelog: string - текст lib/CHANGELOG.md; version: string - x.y.z }
|
|
46
|
+
// OUTPUTS: { string - тело секции; пусто, если версии в файле нет }
|
|
47
|
+
// SIDE_EFFECTS: none
|
|
48
|
+
// LINKS: M-RELEASE-NOTES, V-M-RELEASE-NOTES
|
|
49
|
+
// END_CONTRACT: section
|
|
50
|
+
function section(changelog, version) {
|
|
51
|
+
const start = changelog.indexOf(`## [${version}]`);
|
|
52
|
+
if (start < 0) return '';
|
|
53
|
+
const after = changelog.indexOf('\n## [', start + 1);
|
|
54
|
+
const body = changelog.slice(changelog.indexOf('\n', start) + 1, after < 0 ? undefined : after);
|
|
55
|
+
return body.trim();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const [pkgRaw, changelog] = await Promise.all([
|
|
59
|
+
readFile(join(LIB, 'package.json'), 'utf8'),
|
|
60
|
+
readFile(join(LIB, 'CHANGELOG.md'), 'utf8'),
|
|
61
|
+
]);
|
|
62
|
+
const { version } = JSON.parse(pkgRaw);
|
|
63
|
+
const body = section(changelog, version);
|
|
64
|
+
|
|
65
|
+
if (!body) {
|
|
66
|
+
console.error(
|
|
67
|
+
`release-notes: в lib/CHANGELOG.md нет записи "## [${version}]" — подними версию в ` +
|
|
68
|
+
'package.json или добавь запись (то же самое проверяет npm run check:docs)',
|
|
69
|
+
);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Ссылку на полный changelog добавляем всегда: релиз читают из GitHub, а не из репозитория.
|
|
74
|
+
process.stdout.write(
|
|
75
|
+
`${body}\n\n---\n\nПолный changelog — [lib/CHANGELOG.md](https://github.com/alepri51/letopis/blob/main/lib/CHANGELOG.md).\n`,
|
|
76
|
+
);
|