@nan0web/release 1.0.1 → 1.0.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.
Files changed (109) hide show
  1. package/README.md +24 -42
  2. package/bin/nan0release.js +27 -42
  3. package/package.json +48 -42
  4. package/project.yaml +79 -0
  5. package/src/README.md.js +90 -93
  6. package/src/Release/Document.js +13 -19
  7. package/src/Release/MarkdownToTest.js +35 -33
  8. package/src/Release/Person.js +3 -8
  9. package/src/Release/Scanner.js +179 -0
  10. package/src/Release.js +19 -12
  11. package/src/Team.js +9 -9
  12. package/src/architecture/ProjectManagementAsCode.js +8 -8
  13. package/src/cli/index.js +9 -0
  14. package/src/co/AppCommandOptions.js +4 -6
  15. package/src/commands/CloseCommand.js +67 -0
  16. package/src/commands/Command.js +48 -0
  17. package/src/commands/DepsCommand.js +143 -0
  18. package/src/commands/InitCommand.js +48 -56
  19. package/src/commands/PublishCommand.js +80 -119
  20. package/src/commands/SpecCommand.js +41 -0
  21. package/src/commands/StatusCommand.js +26 -0
  22. package/src/db/ReleaseDB.js +5 -5
  23. package/src/index.js +18 -0
  24. package/src/ui/cli/ReleaseCLi.js +52 -0
  25. package/src/utils/runSpawn.js +0 -0
  26. package/types/Release/Document.d.ts +2 -2
  27. package/types/Release/Person.d.ts +3 -3
  28. package/types/Release/Scanner.d.ts +90 -0
  29. package/types/Release.d.ts +37 -33
  30. package/types/ReleaseCLI.d.ts +29 -28
  31. package/types/Team.d.ts +3 -3
  32. package/types/architecture/ProjectManagementAsCode.d.ts +1 -1
  33. package/types/cli/index.d.ts +2 -0
  34. package/types/co/AppCommandMessage.d.ts +10 -11
  35. package/types/co/AppCommandOptions.d.ts +1 -2
  36. package/types/commands/BaseCommand.d.ts +23 -0
  37. package/types/commands/ChatCommand.d.ts +9 -9
  38. package/types/commands/ChatMessage.d.ts +36 -0
  39. package/types/commands/CloseCommand.d.ts +25 -0
  40. package/types/commands/Command.d.ts +28 -0
  41. package/types/commands/DepsCommand.d.ts +32 -0
  42. package/types/commands/DepsMessage.d.ts +28 -0
  43. package/types/commands/HostCommand.d.ts +7 -7
  44. package/types/commands/HostMessage.d.ts +44 -0
  45. package/types/commands/InitCommand.d.ts +24 -19
  46. package/types/commands/InitMessage.d.ts +24 -0
  47. package/types/commands/ListCommand.d.ts +8 -8
  48. package/types/commands/ListMessage.d.ts +30 -0
  49. package/types/commands/PublishCommand.d.ts +36 -47
  50. package/types/commands/PublishMessage.d.ts +39 -0
  51. package/types/commands/SealCommand.d.ts +7 -7
  52. package/types/commands/SealMessage.d.ts +28 -0
  53. package/types/commands/ServeCommand.d.ts +7 -7
  54. package/types/commands/ServeMessage.d.ts +30 -0
  55. package/types/commands/ShowCommand.d.ts +7 -7
  56. package/types/commands/SpecCommand.d.ts +25 -0
  57. package/types/commands/StatusCommand.d.ts +9 -0
  58. package/types/commands/SubCommand.d.ts +9 -7
  59. package/types/commands/ValidateCommand.d.ts +7 -7
  60. package/types/commands/ValidateMessage.d.ts +20 -0
  61. package/types/db/ReleaseDB.d.ts +2 -2
  62. package/types/index.d.ts +10 -0
  63. package/types/ui/cli/ReleaseCLi.d.ts +10 -0
  64. package/types/ui/cli/index.d.ts +0 -0
  65. package/types/utils/runSpawn.d.ts +0 -0
  66. package/.datasets/README.dataset.jsonl +0 -19
  67. package/.editorconfig +0 -20
  68. package/CHANGELOG.md +0 -6
  69. package/CONTRIBUTING.md +0 -42
  70. package/bin/commands/InitCommand.js +0 -10
  71. package/bin/lib/functions.js +0 -240
  72. package/bin/lib/functions.test.js +0 -138
  73. package/bin/release.js +0 -12
  74. package/bin/release.test.js +0 -73
  75. package/bin/temp/package.json +0 -1
  76. package/docs/system.uk.md +0 -413
  77. package/docs/uk/README.md +0 -284
  78. package/legacy/PrepareCommand.js +0 -154
  79. package/legacy/PrepareCommand.test.js +0 -189
  80. package/legacy/changelog.js +0 -446
  81. package/releases/1/0/v1.0.0/models/Person.js +0 -26
  82. package/releases/1/0/v1.0.0/models/Person.test.js +0 -44
  83. package/releases/1/0/v1.0.0/models/company.js +0 -11
  84. package/releases/1/0/v1.0.0/models/members.js +0 -14
  85. package/releases/1/0/v1.0.0/models/members.test.js +0 -21
  86. package/releases/1/0/v1.0.0/models/teams/DevTeam.js +0 -6
  87. package/releases/1/0/v1.0.0/models/teams/DevTeam.test.js +0 -15
  88. package/releases/1/0/v1.0.0/models/teams/index.js +0 -5
  89. package/releases/1/0/v1.0.0/release.js +0 -12
  90. package/releases/1/0/v1.0.0/release.md +0 -121
  91. package/releases/1/0/v1.0.0/release.test.js +0 -36
  92. package/releases/1/0/v1.0.0/test/YaRaSLove/git-native.test.js +0 -14
  93. package/releases/current.js +0 -3
  94. package/releases/index.js +0 -11
  95. package/src/Release/MarkdownToTest.test.js +0 -60
  96. package/src/ReleaseCLI.js +0 -122
  97. package/src/architecture/ProjectManagementAsCode.test.js +0 -128
  98. package/src/co/AppCommandMessage.js +0 -22
  99. package/src/commands/ChatCommand.js +0 -56
  100. package/src/commands/HostCommand.js +0 -63
  101. package/src/commands/ListCommand.js +0 -56
  102. package/src/commands/SealCommand.js +0 -51
  103. package/src/commands/ServeCommand.js +0 -53
  104. package/src/commands/ShowCommand.js +0 -58
  105. package/src/commands/SubCommand.js +0 -21
  106. package/src/commands/ValidateCommand.js +0 -66
  107. package/system.md +0 -571
  108. package/tsconfig.json +0 -23
  109. /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)