@nan0web/release 1.0.1 → 1.0.2
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/README.md +24 -42
- package/bin/nan0release.js +27 -42
- package/package.json +21 -14
- package/src/Release/Document.js +13 -19
- package/src/Release/MarkdownToTest.js +35 -33
- package/src/Release/Person.js +3 -8
- package/src/Release/Scanner.js +179 -0
- package/src/Release.js +19 -12
- package/src/Team.js +9 -9
- package/src/architecture/ProjectManagementAsCode.js +8 -8
- package/src/cli/index.js +9 -0
- package/src/co/AppCommandOptions.js +4 -6
- package/src/commands/CloseCommand.js +67 -0
- package/src/commands/Command.js +48 -0
- package/src/commands/DepsCommand.js +143 -0
- package/src/commands/InitCommand.js +48 -56
- package/src/commands/PublishCommand.js +80 -119
- package/src/commands/SpecCommand.js +41 -0
- package/src/commands/StatusCommand.js +26 -0
- package/src/db/ReleaseDB.js +5 -5
- package/src/index.js +18 -0
- package/src/ui/cli/ReleaseCLi.js +52 -0
- package/src/utils/runSpawn.js +0 -0
- package/types/Release/Document.d.ts +2 -2
- package/types/Release/Person.d.ts +3 -3
- package/types/Release/Scanner.d.ts +90 -0
- package/types/Release.d.ts +37 -33
- package/types/ReleaseCLI.d.ts +29 -28
- package/types/Team.d.ts +3 -3
- package/types/architecture/ProjectManagementAsCode.d.ts +1 -1
- package/types/cli/index.d.ts +2 -0
- package/types/co/AppCommandMessage.d.ts +10 -11
- package/types/co/AppCommandOptions.d.ts +1 -2
- package/types/commands/BaseCommand.d.ts +23 -0
- package/types/commands/ChatCommand.d.ts +9 -9
- package/types/commands/ChatMessage.d.ts +36 -0
- package/types/commands/CloseCommand.d.ts +25 -0
- package/types/commands/Command.d.ts +28 -0
- package/types/commands/DepsCommand.d.ts +32 -0
- package/types/commands/DepsMessage.d.ts +28 -0
- package/types/commands/HostCommand.d.ts +7 -7
- package/types/commands/HostMessage.d.ts +44 -0
- package/types/commands/InitCommand.d.ts +24 -19
- package/types/commands/InitMessage.d.ts +24 -0
- package/types/commands/ListCommand.d.ts +8 -8
- package/types/commands/ListMessage.d.ts +30 -0
- package/types/commands/PublishCommand.d.ts +36 -47
- package/types/commands/PublishMessage.d.ts +39 -0
- package/types/commands/SealCommand.d.ts +7 -7
- package/types/commands/SealMessage.d.ts +28 -0
- package/types/commands/ServeCommand.d.ts +7 -7
- package/types/commands/ServeMessage.d.ts +30 -0
- package/types/commands/ShowCommand.d.ts +7 -7
- package/types/commands/SpecCommand.d.ts +25 -0
- package/types/commands/StatusCommand.d.ts +9 -0
- package/types/commands/SubCommand.d.ts +9 -7
- package/types/commands/ValidateCommand.d.ts +7 -7
- package/types/commands/ValidateMessage.d.ts +20 -0
- package/types/db/ReleaseDB.d.ts +2 -2
- package/types/index.d.ts +10 -0
- package/types/ui/cli/ReleaseCLi.d.ts +10 -0
- package/types/ui/cli/index.d.ts +0 -0
- package/types/utils/runSpawn.d.ts +0 -0
- package/.datasets/README.dataset.jsonl +0 -19
- package/.editorconfig +0 -20
- package/CHANGELOG.md +0 -6
- package/CONTRIBUTING.md +0 -42
- package/bin/commands/InitCommand.js +0 -10
- package/bin/lib/functions.js +0 -240
- package/bin/lib/functions.test.js +0 -138
- package/bin/release.js +0 -12
- package/bin/release.test.js +0 -73
- package/bin/temp/package.json +0 -1
- package/docs/system.uk.md +0 -413
- package/docs/uk/README.md +0 -284
- package/legacy/PrepareCommand.js +0 -154
- package/legacy/PrepareCommand.test.js +0 -189
- package/legacy/changelog.js +0 -446
- package/releases/1/0/v1.0.0/models/Person.js +0 -26
- package/releases/1/0/v1.0.0/models/Person.test.js +0 -44
- package/releases/1/0/v1.0.0/models/company.js +0 -11
- package/releases/1/0/v1.0.0/models/members.js +0 -14
- package/releases/1/0/v1.0.0/models/members.test.js +0 -21
- package/releases/1/0/v1.0.0/models/teams/DevTeam.js +0 -6
- package/releases/1/0/v1.0.0/models/teams/DevTeam.test.js +0 -15
- package/releases/1/0/v1.0.0/models/teams/index.js +0 -5
- package/releases/1/0/v1.0.0/release.js +0 -12
- package/releases/1/0/v1.0.0/release.md +0 -121
- package/releases/1/0/v1.0.0/release.test.js +0 -36
- package/releases/1/0/v1.0.0/test/YaRaSLove/git-native.test.js +0 -14
- package/releases/current.js +0 -3
- package/releases/index.js +0 -11
- package/src/README.md.js +0 -468
- package/src/Release/MarkdownToTest.test.js +0 -60
- package/src/ReleaseCLI.js +0 -122
- package/src/architecture/ProjectManagementAsCode.test.js +0 -128
- package/src/co/AppCommandMessage.js +0 -22
- package/src/commands/ChatCommand.js +0 -56
- package/src/commands/HostCommand.js +0 -63
- package/src/commands/ListCommand.js +0 -56
- package/src/commands/SealCommand.js +0 -51
- package/src/commands/ServeCommand.js +0 -53
- package/src/commands/ShowCommand.js +0 -58
- package/src/commands/SubCommand.js +0 -21
- package/src/commands/ValidateCommand.js +0 -66
- package/system.md +0 -571
- package/tsconfig.json +0 -23
- /package/{bin/lib/temp/pnpm-lock.yaml → src/ui/cli/index.js} +0 -0
package/docs/system.uk.md
DELETED
|
@@ -1,413 +0,0 @@
|
|
|
1
|
-
# 🤙 `system.md` — специфікація проєкту `@nan0web/release`
|
|
2
|
-
|
|
3
|
-
<blockquote style="padding: 2rem 1rem; background-image: linear-gradient(33deg, #00f6, #ff03)">
|
|
4
|
-
<ul>
|
|
5
|
-
<li>Прогрес — це пройдені тести.</li>
|
|
6
|
-
<li>Правда знаходиться в Git.</li>
|
|
7
|
-
<li>Ідентичність підтверджена підписом.</li>
|
|
8
|
-
<li>Дисципліна — це любов.</li>
|
|
9
|
-
</ul>
|
|
10
|
-
</blockquote>
|
|
11
|
-
|
|
12
|
-
Це канонічна специфікація для **`nan0web/release`**:
|
|
13
|
-
Лаконічна, орієнтована на тести, система управління проєктами, створена для Git.
|
|
14
|
-
|
|
15
|
-
Створена для розумних команд, які цінують **правду, чіткість і завершеність**.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 🎯 Ціль
|
|
20
|
-
|
|
21
|
-
Замінити припущення в управлінні проєктами на **виконувану правду**.
|
|
22
|
-
|
|
23
|
-
Визначати кожне завдання, команду та схвалення в коді — а потім дозволити тестам і підписам **підтвердити прогрес**.
|
|
24
|
-
|
|
25
|
-
Без нарад. Без оновлень. Без слів.
|
|
26
|
-
|
|
27
|
-
Лише те, що пройшло, що підписано і що закомічено.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## 🧘♂️ Філософія
|
|
32
|
-
|
|
33
|
-
1. **Лаконічність > Складність**
|
|
34
|
-
Мінімальна структура. Максимальна чіткість.
|
|
35
|
-
|
|
36
|
-
2. **Код > Завдання**
|
|
37
|
-
Завдання живуть в Git. Якщо не протестовано — не виконано.
|
|
38
|
-
|
|
39
|
-
3. **Прогрес через тести**
|
|
40
|
-
Статус завдання = результат тесту. Ніяких ручних оновлень.
|
|
41
|
-
|
|
42
|
-
4. **Асинхронна комунікація**
|
|
43
|
-
Чат є архівним. Виживають лише рішення.
|
|
44
|
-
|
|
45
|
-
5. **Робота офлайн, працюємо з Git**
|
|
46
|
-
Працюємо без інтернету. Випускаємо з інтегритетом.
|
|
47
|
-
|
|
48
|
-
6. **Ідентичність доведена**
|
|
49
|
-
Ти — той, за кого ти підписуєшся — не той, ким ти себе називаєш.
|
|
50
|
-
|
|
51
|
-
7. **Команда – це клас**
|
|
52
|
-
Ролі, контакти, очікування — все визначено в коді.
|
|
53
|
-
|
|
54
|
-
8. **Ти — те, що ти випускаєш**
|
|
55
|
-
Твій результат — це твоя репутація. Git це доводить.
|
|
56
|
-
|
|
57
|
-
> _"Будь правдивим. Роби. Вчись. Повторюй."_
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 📁 Структура даних
|
|
62
|
-
|
|
63
|
-
```
|
|
64
|
-
releases/
|
|
65
|
-
1/
|
|
66
|
-
0/
|
|
67
|
-
v1.0.0/ ← Корінь релізу
|
|
68
|
-
release.md ← Нотатки до релізу (завдання, розділи)
|
|
69
|
-
release.js ← Команда, ролі, конфігурація (клас Release)
|
|
70
|
-
release.test.js ← Набір тестів (вхідна точка CI)
|
|
71
|
-
test/
|
|
72
|
-
{username}/ ← Опціональний простір
|
|
73
|
-
tasks.test.js ← Користувацькі тести
|
|
74
|
-
chat/ ← Обговорення релізу
|
|
75
|
-
2025/08/18/
|
|
76
|
-
162000420.{username}.md ← Повідомлення (часова мітка + користувач)
|
|
77
|
-
task/
|
|
78
|
-
ux.logo/ ← Завдання за slug
|
|
79
|
-
config.json ← { assignee, priority, dependsOn }
|
|
80
|
-
approved/
|
|
81
|
-
ceo.json ← Запис схвалення (GPG-підписаний)
|
|
82
|
-
chat/
|
|
83
|
-
2025/08/18/
|
|
84
|
-
162000420.{username}.md ← Повідомлення по конкретному завданню
|
|
85
|
-
assets/ ← Дизайни, документи, результати
|
|
86
|
-
retro.md ← Фінальне спостереження (запечатаний)
|
|
87
|
-
.cache/ ← gitignored: стан читання, сесія
|
|
88
|
-
|
|
89
|
-
.recover/{username}/ ← Оголошення втрати ключа
|
|
90
|
-
.well-known/keys.json ← Реєстр публічних ключів
|
|
91
|
-
.nanorc.js ← Конфігурація проєкту (необов'язкова)
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
> ✅ Усі дані під контролем версій, перевіряються, повторювані.
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## 🔄 Робочий процес
|
|
99
|
-
|
|
100
|
-
```mermaid
|
|
101
|
-
flowchart TD
|
|
102
|
-
A[Початок релізу] --> B[Визначення команди в release.js]
|
|
103
|
-
B --> C[Написання release.md з завданнями]
|
|
104
|
-
C --> D[Написання release.test.js або test/@user/tasks.test.js]
|
|
105
|
-
D --> E[Commit → CI запускає тести]
|
|
106
|
-
E --> F{Тести пройшли?}
|
|
107
|
-
F -->|Ні| G[Блокування CI, невиконаний реліз]
|
|
108
|
-
F -->|Так| H[Завдання виконане]
|
|
109
|
-
H --> I[Оновити поступ, ETA]
|
|
110
|
-
I --> J[Чат: Обговорення заклинених завдань асинхронно]
|
|
111
|
-
J --> K[Схвалення: Файл в approved/ceo.json]
|
|
112
|
-
K --> L[Усі тести пройшли → Тег v1.0.0]
|
|
113
|
-
L --> M[Запечатати реліз, написати retro.md]
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
Основні правила:
|
|
117
|
-
|
|
118
|
-
- Немає завдання "виконане" доки тесту не пройшов
|
|
119
|
-
- Немає випуску без тегу
|
|
120
|
-
- Немає схвалення без `.json` файлу і підтвердженням ідентичності
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## 🔐 Ідентичність та GPG Підпис
|
|
125
|
-
|
|
126
|
-
### 🔑 Чому GPG?
|
|
127
|
-
|
|
128
|
-
GPG дає **криптографічне підтвердження** того, хто зробив коміт чи схвалення.
|
|
129
|
-
|
|
130
|
-
Це не опціонально.
|
|
131
|
-
Це **основа довіри**.
|
|
132
|
-
|
|
133
|
-
### ✅ Налаштування GPG Ключа (в кожному repo)
|
|
134
|
-
|
|
135
|
-
1. **Генерація GPG ключа**
|
|
136
|
-
|
|
137
|
-
```bash
|
|
138
|
-
gpg --full-generate-key
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
- Type: `1` (RSA and RSA)
|
|
142
|
-
- Size: `4096`
|
|
143
|
-
- Expires: `0` (ніколи)
|
|
144
|
-
- Name: `UserName`
|
|
145
|
-
- Email: `email@example.com`
|
|
146
|
-
|
|
147
|
-
2. **Перегляд ключів**
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
gpg --list-secret-keys --keyid-format=long
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Отримаємо:
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
sec rsa4096/ABC123456789 2025-01-01 [SC]
|
|
157
|
-
Key fingerprint = 123A 456B 789C ...
|
|
158
|
-
uid [ultimate] UserName <email@example.com>
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
3. **Налаштування Git (в кожному repo)**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
cd /path/to/your/repo
|
|
165
|
-
|
|
166
|
-
git config user.name "UserName"
|
|
167
|
-
git config user.email "email@example.com"
|
|
168
|
-
git config user.signingkey ABC123456789
|
|
169
|
-
git config commit.gpgsign true
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
4. **Тест коміту з підписом**
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
git commit -S -m "First signed commit"
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
> Вас попросять passphrase.
|
|
179
|
-
|
|
180
|
-
5. **Перевірка підпису**
|
|
181
|
-
```bash
|
|
182
|
-
git log --show-signature -1
|
|
183
|
-
```
|
|
184
|
-
Перевірити:
|
|
185
|
-
```
|
|
186
|
-
gpg: Good signature from "UserName <email@example.com>"
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
> ❗ Ніколи не використовуйте `--global` для `user.signingkey` або `commit.gpgsign`
|
|
190
|
-
> Ідентичність залежить від **контексту** — одне repo, одна роль, один ключ.
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## 🔄 Втрата ключа: Відновлення ідентичності
|
|
195
|
-
|
|
196
|
-
**Ви не можете відновити втрачений приватний ключ.**
|
|
197
|
-
Але ви можете довести перехід.
|
|
198
|
-
|
|
199
|
-
### 3-крокова процедура відновлення
|
|
200
|
-
|
|
201
|
-
#### 1. **Написати декларацію переходу (якщо можливо)**
|
|
202
|
-
|
|
203
|
-
Якщо ще маєте доступ до старого ключа, підпишіть:
|
|
204
|
-
|
|
205
|
-
```text
|
|
206
|
-
Я, UserName <email@example.com>, володів GPG ключем: ABC123456789
|
|
207
|
-
Станом на 2025-08-20, я втратив доступ до нього.
|
|
208
|
-
Мій новий ключ: DEF987654321
|
|
209
|
-
Підписано: [GPG clearsign цього повідомлення зі старим ключем]
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
Записується як:
|
|
213
|
-
|
|
214
|
-
```
|
|
215
|
-
.recover/username/rotation-2025-08-20.md
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
#### 2. **Оновлення ідентичності в проєкті**
|
|
219
|
-
|
|
220
|
-
```js
|
|
221
|
-
// releases/1/0/v1.0.0.js
|
|
222
|
-
class Members {
|
|
223
|
-
static UserName = new Person({
|
|
224
|
-
name: "UserName",
|
|
225
|
-
contacts: [new Contact("https://example.com")],
|
|
226
|
-
gpgKey: "DEF987654321", // новий ключ
|
|
227
|
-
revokedKey: "ABC123456789", // старий, втрачений ключ
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
Або в `.well-known/keys.json`:
|
|
233
|
-
|
|
234
|
-
```json
|
|
235
|
-
{
|
|
236
|
-
"user": "ya.raslove",
|
|
237
|
-
"currentKey": "DEF987654321",
|
|
238
|
-
"revokedKeys": [
|
|
239
|
-
{
|
|
240
|
-
"key": "ABC123456789",
|
|
241
|
-
"revokedAt": "2025-08-20",
|
|
242
|
-
"proof": "/recovery/ya.raslove/rotation-2025-08-20.md"
|
|
243
|
-
}
|
|
244
|
-
]
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
#### 3. **CI валідує перехід**
|
|
249
|
-
|
|
250
|
-
На першому коміті з новим ключем:
|
|
251
|
-
|
|
252
|
-
- CI перевіряє валідність ключа
|
|
253
|
-
- Шукає доказ переходу
|
|
254
|
-
- Блокує, якщо ключ непідписаний або без пояснення
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## 🛠 CLI Команди
|
|
259
|
-
|
|
260
|
-
| Команда | Опис |
|
|
261
|
-
| -------------------------------------------------- | -------------------------- |
|
|
262
|
-
| `nan0release` | Показ статуса релізу |
|
|
263
|
-
| `nan0release v1.0.0` | Показ конкретного релізу |
|
|
264
|
-
| `nan0release ls` | Список релізів |
|
|
265
|
-
| `nan0release todo` | Список моїх завдань |
|
|
266
|
-
| `nan0release todo > todo.md` | Експорт завдань |
|
|
267
|
-
| `nan0release chat write "msg"` | Написати у загальний чат |
|
|
268
|
-
| `nan0release chat write ux.logo "help needed"` | Написати у конкретний чат |
|
|
269
|
-
| `nan0release validate` | Перевірити структуру, тести, GPG |
|
|
270
|
-
| `nan0release serve` | Запустити локальний сервер |
|
|
271
|
-
| `nan0release host --webui` | Хостити онлайн з автентифікацією |
|
|
272
|
-
| `nan0release init v1.0.0` | Створити новий реліз |
|
|
273
|
-
| `nan0release seal v1.0.0` | Зробити реліз незмінним |
|
|
274
|
-
|
|
275
|
-
> Усі команди працюють з CI. Вивід через `--json`, `--quiet`.
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 🧪 Життєвий цикл завдання
|
|
280
|
-
|
|
281
|
-
| Стан | Як реалізовано |
|
|
282
|
-
| ------------------ | ---------------------------------------- |
|
|
283
|
-
| `todo` | Тест визначено через `it.todo()` |
|
|
284
|
-
| `in-progress` | Тест написано, але не пройшов |
|
|
285
|
-
| `done` | Тест пройдено, жодних ручних оновлень |
|
|
286
|
-
| `blocked` | Залежить від іншого завдання/схвалення |
|
|
287
|
-
| `skipped` | `it.skip()` — рідко використовується |
|
|
288
|
-
|
|
289
|
-
Статус є **виводимий**, ніколи не написаний.
|
|
290
|
-
|
|
291
|
-
---
|
|
292
|
-
|
|
293
|
-
## ✅ Система схвалення
|
|
294
|
-
|
|
295
|
-
Схвалення — це **GPG-підписані JSON файли**:
|
|
296
|
-
|
|
297
|
-
```
|
|
298
|
-
task/ux.logo/approved/ceo.json
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
```json
|
|
302
|
-
{
|
|
303
|
-
"by": "UserName <email@example.com>",
|
|
304
|
-
"sign": "gpg:DEF987654321",
|
|
305
|
-
"time": "2025-08-20T12:00:00Z"
|
|
306
|
-
}
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
Тестування:
|
|
310
|
-
|
|
311
|
-
```js
|
|
312
|
-
it("CEO approved logo", () => {
|
|
313
|
-
expect(fileExists("task/ux.logo/approved/ceo.json")).toBe(true);
|
|
314
|
-
});
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
Дозволяється кілька схвалень:
|
|
318
|
-
|
|
319
|
-
- `ceo.json`, `cfo.json`, `legal.json`
|
|
320
|
-
|
|
321
|
-
CI перевіряє наявність файлу — **ви доводите це**.
|
|
322
|
-
|
|
323
|
-
---
|
|
324
|
-
|
|
325
|
-
## 🔒 Валідація на коміт
|
|
326
|
-
|
|
327
|
-
Git hook (через `husky` або `simple-git-hooks`) запускає:
|
|
328
|
-
|
|
329
|
-
```bash
|
|
330
|
-
nan0release validate
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
Помилка, якщо:
|
|
334
|
-
|
|
335
|
-
- Завдання згадано, але немає тестів
|
|
336
|
-
- Виконавець не існує в `release.js`
|
|
337
|
-
- Відсутній GPG підпис на важливому коміті
|
|
338
|
-
- Ключ — не поточний
|
|
339
|
-
- Спроба редагування пройденого завдання
|
|
340
|
-
|
|
341
|
-
Блокує `git commit` до виправлення.
|
|
342
|
-
|
|
343
|
-
> Правда підтверджена в джерелах.
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
## 🌐 Хостинг та інтерфейс
|
|
348
|
-
|
|
349
|
-
### `nan0release serve`
|
|
350
|
-
|
|
351
|
-
- Запускає локальний сервер
|
|
352
|
-
- Подає WebUI (`@nan0web/release-ui-lit`)
|
|
353
|
-
- Індекс у пам’яті для пошуку
|
|
354
|
-
- Без автентифікації (лише локально)
|
|
355
|
-
|
|
356
|
-
### `nan0release host --webui`
|
|
357
|
-
|
|
358
|
-
- Хостується онлайн
|
|
359
|
-
- Вимагає GPG автентифікації (через challenge-response)
|
|
360
|
-
- Синхронує `.cache` з Redis (необов’язково)
|
|
361
|
-
- WebSockets для миттєвих оновлень
|
|
362
|
-
|
|
363
|
-
> UI = ті ж дані, що й CLI. Лише візуалізація.
|
|
364
|
-
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
## 🧩 `.nan0rc.js` (Необов’язково)
|
|
368
|
-
|
|
369
|
-
```js
|
|
370
|
-
// .nanorc.js
|
|
371
|
-
export default {
|
|
372
|
-
git: {
|
|
373
|
-
user: "UserName",
|
|
374
|
-
email: "email@example.com",
|
|
375
|
-
signingKey: "ABC123456789",
|
|
376
|
-
gpgsign: true,
|
|
377
|
-
},
|
|
378
|
-
hooks: {
|
|
379
|
-
"on-release-done": "git tag v1.0.0",
|
|
380
|
-
"on-task-fail": "echo @pm: task failure",
|
|
381
|
-
},
|
|
382
|
-
};
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
Використовується:
|
|
386
|
-
|
|
387
|
-
```bash
|
|
388
|
-
nan0release init --trust-config
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
---
|
|
392
|
-
|
|
393
|
-
## Формат нотаток релізу
|
|
394
|
-
|
|
395
|
-
- `h1` - версія і дата релізу `# vX.Y.Z - YYYY-MM-DD`
|
|
396
|
-
- `h2` - розділ релізу
|
|
397
|
-
- `h3` - заголовок завдання з його описом
|
|
398
|
-
|
|
399
|
-
---
|
|
400
|
-
|
|
401
|
-
## 📜 Остаточна правда
|
|
402
|
-
|
|
403
|
-
> **Проєкт не той, який ви сказали.**
|
|
404
|
-
> **Він той, який тести пройшли.**
|
|
405
|
-
> **Він той, який коміти що демонструють.**
|
|
406
|
-
> **Він той, який підписи підтверджують.**
|
|
407
|
-
|
|
408
|
-
`nan0web/release` — це не інструмент.
|
|
409
|
-
Це **система дисципліни** для тих, хто шукає майстерності.
|
|
410
|
-
|
|
411
|
-
Починайте з малого.
|
|
412
|
-
Будьте правдивими.
|
|
413
|
-
Робіть релізи.
|
package/docs/uk/README.md
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
# @nan0web/release
|
|
2
|
-
|
|
3
|
-
| Назва пакету | [Статус](https://github.com/nan0web/monorepo/blob/main/system.md#написання-сценаріїв) | Документація | Покриття тестами | Особливості | Версія npm |
|
|
4
|
-
|--------------|----------------------------------------------------------------------------------------|---------------|------------------|-------------|------------|
|
|
5
|
-
| [@nan0web/release](https://github.com/nan0web/release/) |🟢 `97.1%` | 🧪 [Англійською 🏴](https://github.com/nan0web/release/blob/main/README.md)<br />[Українською 🇺🇦](https://github.com/nan0web/release/blob/main/docs/uk/README.md) |🟡 `84.2%` | ✅ d.ts 📜 system.md 🕹️ playground | — |
|
|
6
|
-
|
|
7
|
-
Керування проєктами як код, орієнтоване на Git, підписане GPG та кероване тестами.
|
|
8
|
-
|
|
9
|
-
На відміну від традиційних інструментів керування проєктами, які потребують постійної синхронізації чи ручних оновлень,
|
|
10
|
-
`@nan0web/release` забезпечує структуру проєкту, де:
|
|
11
|
-
- Завдання представлені як тести у файлах `.test.js`.
|
|
12
|
-
- Статус відстежується через результати виконання тестів.
|
|
13
|
-
- Ролі в команді та погодження зберігаються у структурованих файлах.
|
|
14
|
-
- Всі зміни підписані, версійовані та компонуємі.
|
|
15
|
-
|
|
16
|
-
Це гарантує:
|
|
17
|
-
- Чітке, автоматизоване відстеження проєкту.
|
|
18
|
-
- Незмінні нотатки релізів і рефлексії після них.
|
|
19
|
-
- Нульову неоднозначність – завдання не існують, якщо не протестовані.
|
|
20
|
-
|
|
21
|
-
## Встановлення
|
|
22
|
-
|
|
23
|
-
Як встановити за допомогою pnpm?
|
|
24
|
-
```bash
|
|
25
|
-
pnpm add @nan0web/release
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Як встановити за допомогою npm?
|
|
29
|
-
```bash
|
|
30
|
-
npm install @nan0web/release
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Як встановити за допомогою yarn?
|
|
34
|
-
```bash
|
|
35
|
-
yarn add @nan0web/release
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Використання CLI
|
|
39
|
-
|
|
40
|
-
Почніть із ініціалізації нового релізу:
|
|
41
|
-
|
|
42
|
-
Як ініціалізувати нову версію релізу?
|
|
43
|
-
```bash
|
|
44
|
-
release init v1.0.0
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
const cli = new ReleaseCLI()
|
|
48
|
-
Показати деталі релізу:
|
|
49
|
-
|
|
50
|
-
Як показати інформацію про реліз?
|
|
51
|
-
```bash
|
|
52
|
-
release show [--full]
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
const release = new Release({
|
|
56
|
-
version: "v1.0.0",
|
|
57
|
-
createdAt: new Date("2025-08-20")
|
|
58
|
-
})
|
|
59
|
-
console.info(release.version) // v1.0.0
|
|
60
|
-
Список усіх релізів у проєкті:
|
|
61
|
-
|
|
62
|
-
Як отримати список усіх релізів?
|
|
63
|
-
```bash
|
|
64
|
-
release list [--json]
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
const cli = new ReleaseCLI()
|
|
68
|
-
Додати повідомлення до поточного релізу:
|
|
69
|
-
|
|
70
|
-
Як написати повідомлення до релізу?
|
|
71
|
-
```bash
|
|
72
|
-
release chat write --user alice "Проблема з пайплайном збірки"
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
const cli = new ReleaseCLI()
|
|
76
|
-
Запустити статичний сервер для перегляду релізів:
|
|
77
|
-
|
|
78
|
-
Як запустити інтерфейс релізів?
|
|
79
|
-
```bash
|
|
80
|
-
release host [--webui] [--port 3000]
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
const cli = new ReleaseCLI()
|
|
84
|
-
Обслуговувати всі файли релізу для локального перегляду:
|
|
85
|
-
|
|
86
|
-
Як обслуговувати статичні ресурси релізу?
|
|
87
|
-
```bash
|
|
88
|
-
release serve [--port 8080]
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
const cli = new ReleaseCLI()
|
|
92
|
-
Перевірити завдання та цілісність релізу:
|
|
93
|
-
|
|
94
|
-
Як перевірити завдання релізу?
|
|
95
|
-
```bash
|
|
96
|
-
release validate [--ignore-fail]
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
const release = new Release({
|
|
100
|
-
version: "v1.0.0",
|
|
101
|
-
createdAt: new Date("2025-08-20")
|
|
102
|
-
})
|
|
103
|
-
Завершити реліз з рефлексією:
|
|
104
|
-
|
|
105
|
-
Як завершити (запечатати) реліз?
|
|
106
|
-
```bash
|
|
107
|
-
release seal [--message "Усі основні API стабільні і протестовані"]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
const cli = new ReleaseCLI()
|
|
111
|
-
## Основні концепції
|
|
112
|
-
|
|
113
|
-
### 1. Реліз як об’єкт
|
|
114
|
-
|
|
115
|
-
Об’єкт `Release` включає:
|
|
116
|
-
- `version`: ідентифікатор релізу (vX.Y.Z).
|
|
117
|
-
- `createdAt`, `startAt`, `planAt`, `completeAt`: часові мітки.
|
|
118
|
-
- `document`: розібраний markdown-документ із структурною орієнтацією.
|
|
119
|
-
|
|
120
|
-
Усі властивості типізовані та автоматично перевіряються через JSDoc та runtime-аналіз.
|
|
121
|
-
|
|
122
|
-
Як створити об’єкт Release?
|
|
123
|
-
```js
|
|
124
|
-
import { Release } from '@nan0web/release'
|
|
125
|
-
const release = new Release({
|
|
126
|
-
version: "v1.0.0",
|
|
127
|
-
createdAt: "2025-08-20T10:00:00Z"
|
|
128
|
-
})
|
|
129
|
-
console.info(release.version) // ← v1.0.0
|
|
130
|
-
console.info(release.createdAt instanceof Date) // ← true
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
### 2. Розпізнавання документа релізу
|
|
134
|
-
|
|
135
|
-
`ReleaseDocument` розширює `@nan0web/markdown`:
|
|
136
|
-
- Структурний аналіз markdown-файлу нотаток релізу
|
|
137
|
-
- Видобування розділів і завдань
|
|
138
|
-
- Аналіз команд і ролей із frontmatter чи коду
|
|
139
|
-
|
|
140
|
-
Як перетворити markdown-нотатки релізу у структуровані дані?
|
|
141
|
-
```js
|
|
142
|
-
import { ReleaseDocument } from '@nan0web/release'
|
|
143
|
-
const md = `# v1.0.0 - 2025-08-20
|
|
144
|
-
|
|
145
|
-
## Огляд
|
|
146
|
-
Цей реліз включає поліпшення інтерфейсу та стабілізацію API.
|
|
147
|
-
|
|
148
|
-
### Завдання
|
|
149
|
-
### Done **Реалізувати основний дизайн інтерфейсу** [ui.core-design]
|
|
150
|
-
### InProgress **Виправити проблеми адаптивності на мобільних пристроях** [ui.mobile-fixes]`
|
|
151
|
-
|
|
152
|
-
const doc = ReleaseDocument.from(md)
|
|
153
|
-
console.info(doc.version) // ← v1.0.0
|
|
154
|
-
console.info(doc.date instanceof Date) // ← true
|
|
155
|
-
console.info(doc.document.children instanceof Array) // ← true
|
|
156
|
-
|
|
157
|
-
```
|
|
158
|
-
### 3. Структури персони та команди
|
|
159
|
-
|
|
160
|
-
Об’єкт `Person` включає:
|
|
161
|
-
- `name`: HumanName
|
|
162
|
-
- `gender`: HumanGender
|
|
163
|
-
- `contacts`: масив HumanContact
|
|
164
|
-
|
|
165
|
-
Як створити об’єкт Person із типізованими властивостями?
|
|
166
|
-
```js
|
|
167
|
-
import { Person } from '@nan0web/release'
|
|
168
|
-
const person = new Person({
|
|
169
|
-
name: ["Alice", "Developer"],
|
|
170
|
-
gender: "female",
|
|
171
|
-
contacts: ["mailto:alice@example.com"]
|
|
172
|
-
})
|
|
173
|
-
console.info(person.name.firstName) // ← Alice
|
|
174
|
-
console.info(person.contacts.length >= 0) // ← true
|
|
175
|
-
|
|
176
|
-
```
|
|
177
|
-
## Архітектура: керування проєктами як код
|
|
178
|
-
|
|
179
|
-
Ця архітектура розглядає завдання як тести, ролі — як класи, а прогрес — як підтверджені результати.
|
|
180
|
-
|
|
181
|
-
### Управління завданнями
|
|
182
|
-
|
|
183
|
-
Завдання фіксуються як `taskId` → `testFilePath` в `ProjectManagement`.
|
|
184
|
-
Статус визначається через запуск наборів тестів `node:test`.
|
|
185
|
-
|
|
186
|
-
Як зареєструвати та перевірити завдання за допомогою тестів?
|
|
187
|
-
```js
|
|
188
|
-
import { ProjectManagement } from '@nan0web/release'
|
|
189
|
-
const pm = new ProjectManagement()
|
|
190
|
-
pm.registerTask("task-1", "./tests/task1.test.js")
|
|
191
|
-
pm.registerTask("task-2", "./tests/task2.test.js")
|
|
192
|
-
|
|
193
|
-
const mockResults = {
|
|
194
|
-
passed: ["task-1"],
|
|
195
|
-
failed: [],
|
|
196
|
-
pending: ["task-2"]
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
pm.validateProjectState = async () => mockResults
|
|
200
|
-
const results = await pm.validateProjectState()
|
|
201
|
-
|
|
202
|
-
console.info(results.passed.includes("task-1")) // ← true
|
|
203
|
-
console.info(results.pending.includes("task-2")) // ← true
|
|
204
|
-
|
|
205
|
-
```
|
|
206
|
-
### Обробка релізу
|
|
207
|
-
|
|
208
|
-
`ReleaseManager` координує релізи і перевіряє готовність.
|
|
209
|
-
Він гарантує:
|
|
210
|
-
- Всі зареєстровані тести проходять
|
|
211
|
-
- Версія правильно збільшується
|
|
212
|
-
- Git-тег встановлюється, якщо всі перевірки успішні
|
|
213
|
-
|
|
214
|
-
Як виконати реліз після перевірки?
|
|
215
|
-
```js
|
|
216
|
-
import { ReleaseManager, ProjectManagement } from '@nan0web/release'
|
|
217
|
-
const pm = new ProjectManagement()
|
|
218
|
-
const rm = new ReleaseManager(pm)
|
|
219
|
-
|
|
220
|
-
rm.calculateVersion = () => "v1.0.1"
|
|
221
|
-
rm.publish = async () => true
|
|
222
|
-
|
|
223
|
-
const result = await rm.executeRelease("patch")
|
|
224
|
-
console.info(result.version) // ← v1.0.1
|
|
225
|
-
console.info(result.published) // ← true
|
|
226
|
-
|
|
227
|
-
```
|
|
228
|
-
### Інтеграція з CHANGELOG
|
|
229
|
-
|
|
230
|
-
Через `ChangelogTaskManager` можна:
|
|
231
|
-
- Видобувати означення завдань з записів змін
|
|
232
|
-
- Генерувати відповідні тести
|
|
233
|
-
- Автоматизувати перевірку завдань у CI
|
|
234
|
-
|
|
235
|
-
Як розібрати changelog і видобути завдання?
|
|
236
|
-
```js
|
|
237
|
-
import { ChangelogTaskManager } from '@nan0web/release'
|
|
238
|
-
const ctm = new ChangelogTaskManager()
|
|
239
|
-
const changelog = `# Зміни
|
|
240
|
-
|
|
241
|
-
## [1.0.0] - 2025-08-20
|
|
242
|
-
### Added
|
|
243
|
-
- Створено основну структуру [core.init]
|
|
244
|
-
- Додано підтримку нотаток релізу [docs.release-notes]`
|
|
245
|
-
|
|
246
|
-
const tasks = ctm.parseChangelog(changelog)
|
|
247
|
-
console.info(Array.isArray(tasks)) // ← true
|
|
248
|
-
console.info(tasks.length >= 0) // ← true
|
|
249
|
-
|
|
250
|
-
```
|
|
251
|
-
## Особливості Java•Script
|
|
252
|
-
|
|
253
|
-
Використовує JSDoc і .d.ts для автозаповнення
|
|
254
|
-
|
|
255
|
-
## Демонстрація CLI
|
|
256
|
-
|
|
257
|
-
Спробуйте пакет у терміналі:
|
|
258
|
-
|
|
259
|
-
Як запустити демо playground?
|
|
260
|
-
```bash
|
|
261
|
-
git clone https://github.com/nan0web/release.git
|
|
262
|
-
cd release
|
|
263
|
-
pnpm install
|
|
264
|
-
pnpm run playground
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## Статус проєкту
|
|
268
|
-
|
|
269
|
-
Перевірити готовність проєкту можна так:
|
|
270
|
-
|
|
271
|
-
Як перевірити статус перед публікацією?
|
|
272
|
-
```bash
|
|
273
|
-
npm test
|
|
274
|
-
npm run test:coverage
|
|
275
|
-
npm run test:status
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
## Внески
|
|
279
|
-
|
|
280
|
-
Як зробити внесок? — [перегляньте тут](./CONTRIBUTING.md)
|
|
281
|
-
|
|
282
|
-
## Ліцензія
|
|
283
|
-
|
|
284
|
-
Як застосувати ліцензію ISC? — [перегляньте тут](./LICENSE)
|