@nan0web/release 1.0.2 → 3.1.0

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 (57) hide show
  1. package/README.md +42 -17
  2. package/bin/nan0release.js +3 -39
  3. package/knip.json +21 -0
  4. package/nan0web.nan0 +16 -0
  5. package/package.json +48 -49
  6. package/project.yaml +79 -0
  7. package/src/README.md.js +463 -0
  8. package/src/Release/Person.js +1 -1
  9. package/src/agents/inspectors/git-reviewer.md +35 -0
  10. package/src/agents/inspectors/package-hygiene.md +63 -0
  11. package/src/agents/workflows/commit.md +28 -0
  12. package/src/agents/workflows/npm-release.md +40 -0
  13. package/src/agents/workflows/release.md +205 -0
  14. package/src/agents/workflows/zero-tolerance-git.md +21 -0
  15. package/src/domain/App.js +33 -0
  16. package/src/domain/CheckCommand.js +193 -0
  17. package/src/domain/CloseCommand.js +68 -0
  18. package/src/domain/DepsCommand.js +104 -0
  19. package/src/domain/InitCommand.js +57 -0
  20. package/src/domain/PublishCommand.js +89 -0
  21. package/src/domain/SpecCommand.js +43 -0
  22. package/src/domain/StatusCommand.js +25 -0
  23. package/src/index.js +9 -0
  24. package/types/Release/Person.d.ts +3 -3
  25. package/types/Team.d.ts +3 -3
  26. package/types/commands/CheckCommand.d.ts +24 -0
  27. package/types/commands/CloseCommand.d.ts +2 -1
  28. package/types/commands/Command.d.ts +6 -1
  29. package/types/commands/DepsCommand.d.ts +2 -1
  30. package/types/commands/InitCommand.d.ts +2 -1
  31. package/types/commands/PublishCommand.d.ts +2 -1
  32. package/types/commands/SpecCommand.d.ts +2 -1
  33. package/types/domain/App.d.ts +16 -0
  34. package/types/domain/CheckCommand.d.ts +24 -0
  35. package/types/domain/CloseCommand.d.ts +17 -0
  36. package/types/domain/DepsCommand.d.ts +22 -0
  37. package/types/domain/InitCommand.d.ts +18 -0
  38. package/types/domain/PublishCommand.d.ts +27 -0
  39. package/types/domain/SpecCommand.d.ts +17 -0
  40. package/types/domain/StatusCommand.d.ts +7 -0
  41. package/types/index.d.ts +8 -0
  42. package/types/ui/cli/index.d.ts +1 -0
  43. package/types/utils/runSpawn.d.ts +1 -0
  44. package/src/Team.js +0 -35
  45. package/src/cli/index.js +0 -9
  46. package/src/co/AppCommandOptions.js +0 -25
  47. package/src/commands/CloseCommand.js +0 -67
  48. package/src/commands/Command.js +0 -48
  49. package/src/commands/DepsCommand.js +0 -143
  50. package/src/commands/InitCommand.js +0 -57
  51. package/src/commands/PublishCommand.js +0 -105
  52. package/src/commands/SpecCommand.js +0 -41
  53. package/src/commands/StatusCommand.js +0 -26
  54. package/src/db/ReleaseDB.js +0 -54
  55. package/src/ui/cli/ReleaseCLi.js +0 -52
  56. package/src/ui/cli/index.js +0 -0
  57. package/src/utils/runSpawn.js +0 -0
package/README.md CHANGED
@@ -6,29 +6,36 @@ Project management as code, Git-native, GPG-signed, and test-driven.
6
6
 
7
7
  Unlike traditional project tools that require constant syncing or manual updates,
8
8
  `@nan0web/release` enforces project structure where:
9
+
9
10
  - Tasks are represented as tests in `.test.js` files.
10
11
  - Status is tracked via test outcomes.
11
12
  - Team roles and approvals are stored in structured files.
12
13
  - All changes are signed, versioned, and composable.
13
14
 
15
+
14
16
  This ensures:
17
+
15
18
  - Clear, automatable project tracking.
16
19
  - Immutable release notes and retro reflections.
17
20
  - Zero ambiguity – tasks don't exist unless tested.
18
21
 
22
+
19
23
  ## Installation
20
24
 
21
25
  How to install with pnpm?
26
+
22
27
  ```bash
23
28
  pnpm add @nan0web/release
24
29
  ```
25
30
 
26
31
  How to install with npm?
32
+
27
33
  ```bash
28
34
  npm install @nan0web/release
29
35
  ```
30
36
 
31
37
  How to install with yarn?
38
+
32
39
  ```bash
33
40
  yarn add @nan0web/release
34
41
  ```
@@ -38,14 +45,15 @@ yarn add @nan0web/release
38
45
  Start by initializing a new release:
39
46
 
40
47
  How to initialize a new release version?
48
+
41
49
  ```bash
42
- release init v1.0.0
50
+ nan0release init v1.0.0
43
51
  ```
44
52
 
45
- const cli = ReleaseCLi()
46
53
  Show release details:
47
54
 
48
55
  How to show release information?
56
+
49
57
  ```bash
50
58
  release show [--full]
51
59
  ```
@@ -58,66 +66,66 @@ console.info(release.version) // v1.0.0
58
66
  List all releases in the project:
59
67
 
60
68
  How to list all releases?
69
+
61
70
  ```bash
62
- release list [--json]
71
+ nan0release list [--json]
63
72
  ```
64
73
 
65
- const cli = ReleaseCLi()
66
74
  Add a chat message to the current release:
67
75
 
68
76
  How to write a release chat message?
77
+
69
78
  ```bash
70
- release chat write --user alice "Issue with the build pipeline"
79
+ nan0release chat write --user alice "Issue with the build pipeline"
71
80
  ```
72
81
 
73
- const cli = ReleaseCLi()
74
82
  Host a static server for viewing releases:
75
83
 
76
84
  How to host release UI?
85
+
77
86
  ```bash
78
- release host [--webui] [--port 3000]
87
+ nan0release host [--webui] [--port 3000]
79
88
  ```
80
89
 
81
- const cli = ReleaseCLi()
82
90
  Serve all release files for local inspection:
83
91
 
84
92
  How to serve release static assets?
93
+
85
94
  ```bash
86
- release serve [--port 8080]
95
+ nan0release serve [--port 8080]
87
96
  ```
88
97
 
89
- const cli = ReleaseCLi()
90
98
  Validate release tasks and integrity:
91
99
 
92
100
  How to validate release tasks?
101
+
93
102
  ```bash
94
- release validate [--ignore-fail]
103
+ nan0release validate [--ignore-fail]
95
104
  ```
96
105
 
97
- const release = new Release({
98
- version: 'v1.0.0',
99
- createdAt: new Date('2025-08-20'),
100
- })
101
106
  Seal the release with retro reflection:
102
107
 
103
108
  How to seal a release?
109
+
104
110
  ```bash
105
- release seal [--message "All core APIs are stable and tested"]
111
+ nan0release seal [--message "All core APIs are stable and tested"]
106
112
  ```
107
113
 
108
- const cli = ReleaseCLi()
109
114
  ## Core Concepts
110
115
 
111
116
  ### 1. Release as Object
112
117
 
113
118
  A `Release` is a structured class containing:
119
+
114
120
  - `version`: release identifier (vX.Y.Z).
115
121
  - `createdAt`, `startAt`, `planAt`, `completeAt`: datetime milestones.
116
122
  - `document`: parsed markdown document with structure-aware parsing.
117
123
 
124
+
118
125
  Each property is typed and validated automatically via JSDoc and runtime parsing.
119
126
 
120
127
  How to instantiate a Release?
128
+
121
129
  ```js
122
130
  import { Release } from '@nan0web/release'
123
131
  const release = new Release({
@@ -130,11 +138,14 @@ console.info(release.createdAt instanceof Date) // ← true
130
138
  ### 2. Release Document Parsing
131
139
 
132
140
  A `ReleaseDocument` extends `@nan0web/markdown` with:
141
+
133
142
  - Structured parsing of markdown release notes
134
143
  - Extraction of sections and tasks
135
144
  - Team and role parsing from markdown frontmatter or code
136
145
 
146
+
137
147
  How to parse release notes markdown into structured data?
148
+
138
149
  ```js
139
150
  import { ReleaseDocument } from '@nan0web/release'
140
151
  const md = `# v1.0.0 - 2025-08-20
@@ -151,11 +162,14 @@ console.info(doc.document.children instanceof Array) // ← true
151
162
  ### 3. Person & Team Structures
152
163
 
153
164
  A `Person` instance includes:
165
+
154
166
  - `name`: HumanName
155
167
  - `gender`: HumanGender
156
168
  - `contacts`: array of HumanContact
157
169
 
170
+
158
171
  How to create a Person with typed properties?
172
+
159
173
  ```js
160
174
  import { Person } from '@nan0web/release'
161
175
  const person = new Person({
@@ -176,6 +190,7 @@ Tasks are registered as `taskId` → `testFilePath` in `ProjectManagement`.
176
190
  Their status is derived by running `node:test` suites.
177
191
 
178
192
  How to register and validate tasks as tests?
193
+
179
194
  ```js
180
195
  import { ProjectManagement } from '@nan0web/release'
181
196
  const pm = new ProjectManagement()
@@ -195,11 +210,14 @@ console.info(results.pending.includes('task-2')) // ← true
195
210
 
196
211
  The `ReleaseManager` coordinates releases and validates readiness.
197
212
  It ensures:
213
+
198
214
  - All registered tests pass
199
215
  - Version is correctly incremented
200
216
  - Git tag is applied if all validations succeed
201
217
 
218
+
202
219
  How to execute a release after validation?
220
+
203
221
  ```js
204
222
  import { ReleaseManager, ProjectManagement } from '@nan0web/release'
205
223
  const pm = new ProjectManagement()
@@ -213,11 +231,14 @@ console.info(result.published) // ← true
213
231
  ### Changelog Integration
214
232
 
215
233
  Using `ChangelogTaskManager`, you can:
234
+
216
235
  - Extract task definitions from changelog entries
217
236
  - Generate corresponding test files
218
237
  - Automate task progression in CI
219
238
 
239
+
220
240
  How to parse changelog and extract tasks?
241
+
221
242
  ```js
222
243
  import { ChangelogTaskManager } from '@nan0web/release'
223
244
  const ctm = new ChangelogTaskManager()
@@ -239,6 +260,7 @@ Uses JSDoc and .d.ts files for autocompletion
239
260
  Try the package in the terminal:
240
261
 
241
262
  How to run playground demo?
263
+
242
264
  ```bash
243
265
  git clone https://github.com/nan0web/release.git
244
266
  cd release
@@ -251,6 +273,7 @@ pnpm run playground
251
273
  To verify the project is ready, run:
252
274
 
253
275
  How to check project status before publishing?
276
+
254
277
  ```bash
255
278
  npm test
256
279
  npm run test:coverage
@@ -264,3 +287,5 @@ How to contribute? - [check here](./CONTRIBUTING.md)
264
287
  ## License
265
288
 
266
289
  How to license ISC? - [check here](./LICENSE)
290
+
291
+
@@ -1,42 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import process from 'node:process'
3
+ import { bootstrapApp } from '@nan0web/ui-cli'
4
+ import { App } from '../src/domain/App.js'
4
5
 
5
- import { OutputMessage } from '@nan0web/co'
6
- import Logger from '@nan0web/log'
7
-
8
- import createReleaseCLI from '../src/ui/cli/ReleaseCLi.js'
9
-
10
- class OutputLogger extends Logger {
11
- log(first, ...args) {
12
- if (first && first instanceof OutputMessage) {
13
- if (OutputMessage.TYPES.ERROR === first.type) {
14
- return this.error(first.content, ...args)
15
- } else if (OutputMessage.TYPES.WARNING === first.type) {
16
- return this.warn(first.content, ...args)
17
- } else if (OutputMessage.TYPES.SUCCESS === first.type) {
18
- return this.success(first.content, ...args)
19
- }
20
- return this.info(first.content, ...args)
21
- }
22
- return super.log(first, ...args)
23
- }
24
- }
25
-
26
- const logger = new OutputLogger(Logger.detectLevel(process.argv))
27
-
28
- async function main(argv = []) {
29
- const cli = createReleaseCLI(argv, logger)
30
- logger.info(Logger.style(Logger.LOGO, { color: Logger.MAGENTA }))
31
-
32
- const stream = cli.run()
33
- for await (const entry of stream) {
34
- logger.info(entry)
35
- }
36
- }
37
-
38
- main(process.argv.slice(2)).catch((err) => {
39
- logger.error('❌ Unhandled error:', err.message || err)
40
- if (err.stack) logger.debug(err.stack)
41
- process.exit(1)
42
- })
6
+ bootstrapApp(App)
package/knip.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://unpkg.com/knip@5/schema.json",
3
+ "entry": [
4
+ "src/index.js",
5
+ "bin/nan0release.js",
6
+ "src/README.md.js"
7
+ ],
8
+ "project": ["src/**/*.js", "bin/*.js"],
9
+ "ignoreDependencies": [
10
+ "@nan0web/log",
11
+ "@nan0web/ui",
12
+ "@nan0web/ui-cli",
13
+ "@nan0web/logos",
14
+ "@nan0web/markdown",
15
+ "@nan0web/db",
16
+ "@nan0web/db-fs",
17
+ "@nan0web/types",
18
+ "@nan0web/co",
19
+ "@nan0web/changelog"
20
+ ]
21
+ }
package/nan0web.nan0 ADDED
@@ -0,0 +1,16 @@
1
+ name: "@nan0web/release"
2
+ agents:
3
+ - id: 'release-manager'
4
+ description: 'Release & NPM Publication Manager'
5
+ workflows:
6
+ - 'src/agents/workflows/release.md'
7
+ - 'src/agents/workflows/npm-release.md'
8
+ inspectors:
9
+ - 'src/agents/inspectors/package-hygiene.md'
10
+ - id: 'git-reviewer'
11
+ description: 'Architectural Git Commit Validator'
12
+ workflows:
13
+ - 'src/agents/workflows/commit.md'
14
+ - 'src/agents/workflows/zero-tolerance-git.md'
15
+ inspectors:
16
+ - 'src/agents/inspectors/git-reviewer.md'
package/package.json CHANGED
@@ -1,50 +1,49 @@
1
1
  {
2
- "name": "@nan0web/release",
3
- "version": "1.0.2",
4
- "description": "Project Management as Code, Git-Native, GPG-Signed, Test-Driven",
5
- "main": "src/index.js",
6
- "types": "types/index.d.ts",
7
- "type": "module",
8
- "bin": {
9
- "nan0release": "./bin/nan0release.js",
10
- "release": "./bin/nan0release.js"
11
- },
12
- "scripts": {
13
- "build": "tsc",
14
- "clean": "rm -rf .cache/ && rm -rf dist/",
15
- "clean:modules": "rm -rf node_modules",
16
- "test": "node --test \"src/**/*.test.js\"",
17
- "test1": "node --test \"src/**/*.test.js\" | nan0test parse --fail",
18
- "test:docs": "node --test \"src/README.md.js\"",
19
- "test:release": "node --test \"releases/**/*.test.js\"",
20
- "test:coverage": "node --experimental-test-coverage --test-coverage-include=\"src/**/*.js\" --test-coverage-exclude=\"src/**/*.test.js\" --test \"src/**/*.test.js\"",
21
- "test:coverage:collect": "nan0test coverage",
22
- "test:status": "nan0test status",
23
- "test:all": "npm run test && npm run test:docs && npm run build && npm run knip",
24
- "test:all1": "npm run test && npm run test:docs && npm run test:status && npm run build",
25
- "knip": "knip --production",
26
- "release": "node ./bin/nan0release.js publish",
27
- "precommit": "npm test",
28
- "prepush": "npm test",
29
- "prepare": "husky",
30
- "playground": "node playground/main.js"
31
- },
32
- "dependencies": {
33
- "@nan0web/changelog": "*",
34
- "@nan0web/co": "*",
35
- "@nan0web/db": "*",
36
- "@nan0web/db-fs": "*",
37
- "@nan0web/log": "*",
38
- "@nan0web/markdown": "*",
39
- "@nan0web/types": "*",
40
- "@nan0web/ui": "*",
41
- "@nan0web/ui-cli": "*",
42
- "@nan0web/verse": "*",
43
- "supports-color": "^10.2.2"
44
- },
45
- "devDependencies": {
46
- "@nan0web/test": "*",
47
- "husky": "^9.1.7",
48
- "knip": "^5.85.0"
49
- }
50
- }
2
+ "name": "@nan0web/release",
3
+ "version": "3.1.0",
4
+ "description": "Project Management as Code, Git-Native, GPG-Signed, Test-Driven",
5
+ "main": "src/index.js",
6
+ "types": "types/index.d.ts",
7
+ "type": "module",
8
+ "bin": {
9
+ "nan0release": "./bin/nan0release.js",
10
+ "release": "./bin/nan0release.js"
11
+ },
12
+ "dependencies": {
13
+ "@nan0web/log": "3.1.0",
14
+ "@nan0web/co": "3.1.0",
15
+ "@nan0web/markdown": "3.1.0",
16
+ "@nan0web/db-fs": "3.1.0",
17
+ "@nan0web/types": "3.1.0",
18
+ "@nan0web/changelog": "3.1.0",
19
+ "@nan0web/db": "3.1.0",
20
+ "@nan0web/ui": "3.1.0",
21
+ "@nan0web/logos": "3.1.0",
22
+ "@nan0web/ui-cli": "3.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^25.6.0",
26
+ "husky": "^9.1.7",
27
+ "knip": "^5.86.0",
28
+ "@nan0web/test": "3.1.0"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc",
32
+ "clean": "rm -rf .cache/ && rm -rf dist/",
33
+ "clean:modules": "rm -rf node_modules",
34
+ "test": "node --test \"src/**/*.test.js\"",
35
+ "test1": "node --test \"src/**/*.test.js\" | nan0test parse --fail",
36
+ "test:docs": "node --test \"src/README.md.js\"",
37
+ "test:release": "node --test \"releases/**/*.test.js\"",
38
+ "test:coverage": "node --experimental-test-coverage --test-coverage-include=\"src/**/*.js\" --test-coverage-exclude=\"src/**/*.test.js\" --test \"src/**/*.test.js\"",
39
+ "test:coverage:collect": "nan0test coverage",
40
+ "test:status": "nan0test status",
41
+ "test:all": "npm run test && npm run test:docs && npm run build && npm run knip",
42
+ "test:all1": "npm run test && npm run test:docs && npm run test:status && npm run build",
43
+ "knip": "knip --production",
44
+ "release": "node ./bin/nan0release.js publish",
45
+ "precommit": "npm test",
46
+ "prepush": "npm test",
47
+ "playground": "node playground/main.js"
48
+ }
49
+ }
package/project.yaml ADDED
@@ -0,0 +1,79 @@
1
+ ---
2
+ metadata:
3
+ description: ""
4
+ tags: []
5
+ status: planned
6
+ locale: uk
7
+ sections:
8
+ - title: "🧭 Фаза 1: Філософія та Абстракція (The Seed)"
9
+ content:
10
+ - "**Місія:** Управління проєктами як код (Project Management as Code). Ми відмовляємось від зовнішніх трекерів задач (Jira, Trello). Проєкт — це набір технічних **контрактів**, які проходять шлях від наміру до імплементації, забезпечуючи реальний статус прогресу автоматично."
11
+ - "**Базова Абстракція:** Пакет відповідає за логіку та CLI, яка читає Markdown, генерує контракти (`.spec.js`), а потім закриває їх як тести (`.test.js`) з подальшою вічною регресією (тести копіюються в кодову базу)."
12
+ - "**Глосарій:**"
13
+ - "- **Release Document**: `release.md` з ТЗ та відомостями про команду."
14
+ - "- **WIP Контракт**: `*.spec.js`, який падає/у стані `todo`, доки задачу не взяли і не зробили. Оновлює прогрес автоматично при виконанні."
15
+ - "- **Закритий Контракт**: `*.test.js` (результат команди `close`). Він стає законом і гарантує регресію через `pnpm test`."
16
+ - "---"
17
+ tasks: []
18
+ - title: "📐 Фаза 2: Доменне Моделювання (Data-Driven Models)"
19
+ content:
20
+ - "Сутності і моделі, які керують процесом релізу, не мають жорсткої прив'язки до вебу, але описуються як чисті об'єкти:"
21
+ - "- `Release`: Координує стан (версія, час початку, час завершення)."
22
+ - "- `ReleaseDocument`: Структурує Markdown у модель (дістає задачі)."
23
+ - "- `Person`: Типізована перевірка того, хто схвалив дії (через GPG або JSON підпис)."
24
+ - "- `Scanner`: Абстракція доступу до файлової системи (`releases/`)."
25
+ - "Статуси відстежуються динамічно через статус тестів: `it.todo` -> `it.skip` -> `it()`."
26
+ - "---"
27
+ tasks: []
28
+ - title: "🛠 Фаза 3: Верифікація Логіки (CLI-First)"
29
+ content:
30
+ - "Уся бізнес-логіка @nan0web/release 100% покривається Unit-тестами та CLI командами. Жодного веб-коду. Використовуємо Message-based архітектуру `@nan0web/ui-cli`."
31
+ - "1. **Команди CLI (`bin/nan0release.js`):**"
32
+ - "- `deps`, `publish` (реалізовані)."
33
+ - "- Заплановані (`init`, `spec`, `close`, `status`) інкапсулюють керування `Scanner` та `Release` моделями."
34
+ - "2. **Contract Lifecycle (Автоматизація прогресу):**"
35
+ - "- На старті `.spec.js` мають `it.todo()` → задача в беклозі."
36
+ - "- Коли розробник бере задачу → генерує логіку, змінює на `it()`. При коміті реальний прогрес проекту видно \"зеленим\"."
37
+ - "- `nan0release close` перейменовує `spec → test` і переносить його в `src/releases/` для 100% автоматичної регресії."
38
+ - "---"
39
+ tasks: []
40
+ - title: "🪐 Фаза 4: Sovereign Workbench (The Master IDE)"
41
+ content:
42
+ - "_(Для цього пакету застосовується опціонально, оскільки тут CLI-First)_"
43
+ - "Пакет `release` є постачальником даних для інших Sandbox-середовищ, де може виводитись:"
44
+ - "- Dashboard релізу (таблиці статусів `wip/closed/mixed`)."
45
+ - "- Для цього ми генеруємо `.datasets/README.dataset.jsonl` за допомогою `test:docs`, щоб створювати машиночитабельні знання для LLM-агентів для донавчання або можна користуватись README.md як індексу у реальному часі."
46
+ - "---"
47
+ tasks: []
48
+ - title: "🎨 Фаза 5: Тематизація та Інтерфейс (Theming)"
49
+ content:
50
+ - "_(Може застосовуватися при запуску HTML звітів про реліз або Dashboard)_"
51
+ - "Логіка `release UI` (якщо така з'явиться у додатку `@nan0web/release.app`), буде імпортувати компоненти з `@nan0web/ui-lit` зі строгим слідуванням CSS-змінним (напр. `--co` для кольорів бренду) без створення кастомних стилів."
52
+ - "---"
53
+ tasks: []
54
+ - title: "🏁 Чек-лист готовності пакету (Definition of Done)"
55
+ content: []
56
+ tasks:
57
+ - title: "General"
58
+ content: []
59
+ items:
60
+ - text: "Визначена місія та філософія у `system.md` та `project.md`."
61
+ completed: true
62
+ - text: "Робота з Markdown-нотатками та базова доменна логіка (`Scanner`, `Release`)."
63
+ completed: true
64
+ - text: "Атомарна операція закриття контрактів (`Scanner.close()`)."
65
+ completed: true
66
+ - text: "Всі існуючі специфікації проходять через CLI та `node:test` (22/24 pass, 2 skip)."
67
+ completed: true
68
+ - text: "Прогрес автоматизується зміною статусу `spec.js` (todo/skip/pass)."
69
+ completed: true
70
+ - text: "Усі CLI сценарії для AGRP (spec, close, init, status) завершені."
71
+ completed: false
72
+ - text: "Створені API-ендпоінти для відображення релізного прогресу у React-Dashboard."
73
+ completed: false
74
+ total: 7
75
+ completed: 5
76
+ stats:
77
+ totalTasks: 7
78
+ completedTasks: 5
79
+ progress: 71