@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.
- package/README.md +42 -17
- package/bin/nan0release.js +3 -39
- package/knip.json +21 -0
- package/nan0web.nan0 +16 -0
- package/package.json +48 -49
- package/project.yaml +79 -0
- package/src/README.md.js +463 -0
- package/src/Release/Person.js +1 -1
- package/src/agents/inspectors/git-reviewer.md +35 -0
- package/src/agents/inspectors/package-hygiene.md +63 -0
- package/src/agents/workflows/commit.md +28 -0
- package/src/agents/workflows/npm-release.md +40 -0
- package/src/agents/workflows/release.md +205 -0
- package/src/agents/workflows/zero-tolerance-git.md +21 -0
- package/src/domain/App.js +33 -0
- package/src/domain/CheckCommand.js +193 -0
- package/src/domain/CloseCommand.js +68 -0
- package/src/domain/DepsCommand.js +104 -0
- package/src/domain/InitCommand.js +57 -0
- package/src/domain/PublishCommand.js +89 -0
- package/src/domain/SpecCommand.js +43 -0
- package/src/domain/StatusCommand.js +25 -0
- package/src/index.js +9 -0
- package/types/Release/Person.d.ts +3 -3
- package/types/Team.d.ts +3 -3
- package/types/commands/CheckCommand.d.ts +24 -0
- package/types/commands/CloseCommand.d.ts +2 -1
- package/types/commands/Command.d.ts +6 -1
- package/types/commands/DepsCommand.d.ts +2 -1
- package/types/commands/InitCommand.d.ts +2 -1
- package/types/commands/PublishCommand.d.ts +2 -1
- package/types/commands/SpecCommand.d.ts +2 -1
- package/types/domain/App.d.ts +16 -0
- package/types/domain/CheckCommand.d.ts +24 -0
- package/types/domain/CloseCommand.d.ts +17 -0
- package/types/domain/DepsCommand.d.ts +22 -0
- package/types/domain/InitCommand.d.ts +18 -0
- package/types/domain/PublishCommand.d.ts +27 -0
- package/types/domain/SpecCommand.d.ts +17 -0
- package/types/domain/StatusCommand.d.ts +7 -0
- package/types/index.d.ts +8 -0
- package/types/ui/cli/index.d.ts +1 -0
- package/types/utils/runSpawn.d.ts +1 -0
- package/src/Team.js +0 -35
- package/src/cli/index.js +0 -9
- package/src/co/AppCommandOptions.js +0 -25
- package/src/commands/CloseCommand.js +0 -67
- package/src/commands/Command.js +0 -48
- package/src/commands/DepsCommand.js +0 -143
- package/src/commands/InitCommand.js +0 -57
- package/src/commands/PublishCommand.js +0 -105
- package/src/commands/SpecCommand.js +0 -41
- package/src/commands/StatusCommand.js +0 -26
- package/src/db/ReleaseDB.js +0 -54
- package/src/ui/cli/ReleaseCLi.js +0 -52
- package/src/ui/cli/index.js +0 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
|
package/bin/nan0release.js
CHANGED
|
@@ -1,42 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { bootstrapApp } from '@nan0web/ui-cli'
|
|
4
|
+
import { App } from '../src/domain/App.js'
|
|
4
5
|
|
|
5
|
-
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|