@nan0web/release 3.4.0 → 3.5.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 +0 -35
- package/bin/nan0release.js +2 -2
- package/package.json +9 -8
- package/src/domain/App.js +2 -0
- package/src/domain/PMaCParser.js +418 -0
- package/src/domain/PMaCParser.story.js +152 -0
- package/src/domain/ValidateCommand.js +426 -0
- package/src/domain/ValidateCommand.story.js +92 -0
- package/src/domain/models/ReleaseIssueModel.js +27 -0
- package/src/domain/models/ReleaseMemberModel.js +21 -0
- package/src/domain/models/ReleaseModel.js +191 -0
- package/src/domain/models/ReleaseParityModel.js +27 -0
- package/src/domain/models/ReleaseTaskModel.js +33 -0
- package/src/domain/models/index.js +6 -0
- package/src/index.js +9 -0
- package/types/domain/App.d.ts +2 -1
- package/types/domain/PMaCParser.d.ts +64 -0
- package/types/domain/PMaCParser.story.d.ts +1 -0
- package/types/domain/ValidateCommand.d.ts +69 -0
- package/types/domain/ValidateCommand.story.d.ts +1 -0
- package/types/domain/models/ReleaseIssueModel.d.ts +35 -0
- package/types/domain/models/ReleaseMemberModel.d.ts +25 -0
- package/types/domain/models/ReleaseModel.d.ts +122 -0
- package/types/domain/models/ReleaseParityModel.d.ts +37 -0
- package/types/domain/models/ReleaseTaskModel.d.ts +46 -0
- package/types/domain/models/index.d.ts +5 -0
- package/types/index.d.ts +3 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Model } from '@nan0web/types'
|
|
2
|
+
|
|
3
|
+
export class ReleaseMemberModel extends Model {
|
|
4
|
+
static role = { type: 'string', required: true }
|
|
5
|
+
static name = { type: 'string', required: true }
|
|
6
|
+
static handle = { type: 'string' }
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {Partial<ReleaseMemberModel>} [data={}]
|
|
10
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
11
|
+
*/
|
|
12
|
+
constructor(data = {}, options = {}) {
|
|
13
|
+
super(data, options)
|
|
14
|
+
/** @type {string} Role / Position (Посада) */
|
|
15
|
+
this.role
|
|
16
|
+
/** @type {string} Full Name (Ім'я) */
|
|
17
|
+
this.name
|
|
18
|
+
/** @type {string} Login / Handle (Логін без @) */
|
|
19
|
+
this.handle
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Model } from '@nan0web/types'
|
|
2
|
+
import { ReleaseMemberModel } from './ReleaseMemberModel.js'
|
|
3
|
+
import { ReleaseTaskModel } from './ReleaseTaskModel.js'
|
|
4
|
+
import { ReleaseParityModel } from './ReleaseParityModel.js'
|
|
5
|
+
import { ReleaseIssueModel } from './ReleaseIssueModel.js'
|
|
6
|
+
|
|
7
|
+
export class ReleaseModel extends Model {
|
|
8
|
+
static version = { type: 'string', required: true }
|
|
9
|
+
static title = { type: 'string', required: true }
|
|
10
|
+
static status = { type: 'string', default: 'todo' } // 'todo' | 'work' | 'done' | 'fail'
|
|
11
|
+
static type = { type: 'string', default: 'minor' } // 'major' | 'minor' | 'patch' | 'hotfix' | 'chore'
|
|
12
|
+
static summary = { type: 'string' }
|
|
13
|
+
static epic = { type: 'string' }
|
|
14
|
+
static sprint = { type: 'string' }
|
|
15
|
+
static tracker = { type: 'string' }
|
|
16
|
+
|
|
17
|
+
// Sub-collections
|
|
18
|
+
static team = { type: 'array', itemType: ReleaseMemberModel, default: [] }
|
|
19
|
+
static tasks = { type: 'array', itemType: ReleaseTaskModel, default: [] }
|
|
20
|
+
static criteria = { type: 'array', itemType: ReleaseTaskModel, default: [] }
|
|
21
|
+
static parity = { type: 'array', itemType: ReleaseParityModel, default: [] }
|
|
22
|
+
static issues = { type: 'array', itemType: ReleaseIssueModel, default: [] }
|
|
23
|
+
static files = { type: 'array', default: [] }
|
|
24
|
+
static meta = { type: 'object', default: {} }
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param {Partial<ReleaseModel>} [data={}]
|
|
28
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
29
|
+
*/
|
|
30
|
+
constructor(data = {}, options = {}) {
|
|
31
|
+
super(data, options)
|
|
32
|
+
/** @type {string} Release version */
|
|
33
|
+
this.version
|
|
34
|
+
/** @type {string} Release title */
|
|
35
|
+
this.title
|
|
36
|
+
/** @type {'todo' | 'work' | 'done' | 'fail'} Release status */
|
|
37
|
+
this.status
|
|
38
|
+
/** @type {'major' | 'minor' | 'patch' | 'hotfix' | 'chore'} Release type */
|
|
39
|
+
this.type
|
|
40
|
+
/** @type {string} Release summary / description */
|
|
41
|
+
this.summary
|
|
42
|
+
/** @type {string} Epic identifier */
|
|
43
|
+
this.epic
|
|
44
|
+
/** @type {string} Sprint name */
|
|
45
|
+
this.sprint
|
|
46
|
+
/** @type {string} External tracker URL template */
|
|
47
|
+
this.tracker
|
|
48
|
+
/** @type {ReleaseMemberModel[]} Team members (ролі, імена, логіни) */
|
|
49
|
+
this.team
|
|
50
|
+
/** @type {ReleaseTaskModel[]} Tasks in scope */
|
|
51
|
+
this.tasks
|
|
52
|
+
/** @type {ReleaseTaskModel[]} Acceptance criteria (DoD) */
|
|
53
|
+
this.criteria
|
|
54
|
+
/** @type {ReleaseParityModel[]} Data parity verification items */
|
|
55
|
+
this.parity
|
|
56
|
+
/** @type {ReleaseIssueModel[]} Issues and risks */
|
|
57
|
+
this.issues
|
|
58
|
+
/** @type {Array<{file: string, size?: string, hash?: string, type?: string}>} Artifact files */
|
|
59
|
+
this.files
|
|
60
|
+
/** @type {Record<string, any>} Frontmatter / metadata */
|
|
61
|
+
this.meta
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static SECTIONS = {
|
|
65
|
+
summary: [
|
|
66
|
+
// EN (English)
|
|
67
|
+
'summary', 'objective', 'description', 'overview',
|
|
68
|
+
// UK (Українська)
|
|
69
|
+
'опис', 'мета', 'ціль', 'огляд',
|
|
70
|
+
// ES (Español)
|
|
71
|
+
'resumen', 'objetivo', 'descripcion',
|
|
72
|
+
// FR (Français)
|
|
73
|
+
'resume', 'objectif',
|
|
74
|
+
// DE (Deutsch)
|
|
75
|
+
'zusammenfassung', 'ziel', 'beschreibung',
|
|
76
|
+
// ZH (中文 - Chinese)
|
|
77
|
+
'摘要', '目标', '描述',
|
|
78
|
+
// RU (Російська - для сумісності з двомовними українцями)
|
|
79
|
+
'описание', 'цель', 'обзор',
|
|
80
|
+
],
|
|
81
|
+
team: [
|
|
82
|
+
// EN (English)
|
|
83
|
+
'team', 'members', 'contributors', 'roles',
|
|
84
|
+
// UK (Українська)
|
|
85
|
+
'команда', 'учасники', 'ролі',
|
|
86
|
+
// ES (Español)
|
|
87
|
+
'equipo', 'miembros',
|
|
88
|
+
// FR (Français)
|
|
89
|
+
'equipe', 'membres',
|
|
90
|
+
// DE (Deutsch)
|
|
91
|
+
'mitglieder',
|
|
92
|
+
// ZH (中文 - Chinese)
|
|
93
|
+
'团队', '成员',
|
|
94
|
+
// RU (Російська)
|
|
95
|
+
'участники', 'роли',
|
|
96
|
+
],
|
|
97
|
+
tasks: [
|
|
98
|
+
// EN (English)
|
|
99
|
+
'tasks', 'scope', 'work plan', 'wbs', 'backlog', 'plan',
|
|
100
|
+
// UK (Українська)
|
|
101
|
+
'план', 'задачі', 'робочий план', 'обсяг',
|
|
102
|
+
// ES (Español)
|
|
103
|
+
'tareas', 'plan de trabajo',
|
|
104
|
+
// FR (Français)
|
|
105
|
+
'taches', 'plan de travail',
|
|
106
|
+
// DE (Deutsch)
|
|
107
|
+
'aufgaben', 'arbeitsplan',
|
|
108
|
+
// ZH (中文 - Chinese)
|
|
109
|
+
'任务', '工作计划',
|
|
110
|
+
// RU (Російська)
|
|
111
|
+
'задачи', 'рабочий план',
|
|
112
|
+
],
|
|
113
|
+
criteria: [
|
|
114
|
+
// EN (English)
|
|
115
|
+
'acceptance', 'acceptance criteria', 'dod', 'definition of done', 'requirements',
|
|
116
|
+
// UK (Українська)
|
|
117
|
+
'критерії', 'критерії прийнятності', 'вимоги',
|
|
118
|
+
// ES (Español)
|
|
119
|
+
'criterios', 'criterios de aceptacion', 'requisitos',
|
|
120
|
+
// FR (Français)
|
|
121
|
+
'criteres', 'criteres d acceptation', 'exigences',
|
|
122
|
+
// DE (Deutsch)
|
|
123
|
+
'akzeptanzkriterien', 'anforderungen',
|
|
124
|
+
// ZH (中文 - Chinese)
|
|
125
|
+
'验收标准', '准入条件', '要求',
|
|
126
|
+
// RU (Російська)
|
|
127
|
+
'критерии', 'критерии приемки', 'требования',
|
|
128
|
+
],
|
|
129
|
+
parity: [
|
|
130
|
+
// EN (English)
|
|
131
|
+
'parity', 'data parity', 'audit', 'verification',
|
|
132
|
+
// UK (Українська)
|
|
133
|
+
'паритет', 'аудит', 'паритет даних', 'верифікація',
|
|
134
|
+
// ES (Español)
|
|
135
|
+
'paridad', 'auditoria',
|
|
136
|
+
// FR (Français)
|
|
137
|
+
'parite',
|
|
138
|
+
// DE (Deutsch)
|
|
139
|
+
'datenparitaet',
|
|
140
|
+
// ZH (中文 - Chinese)
|
|
141
|
+
'数据对齐', '数据一致性', '审计',
|
|
142
|
+
// RU (Російська)
|
|
143
|
+
'паритет данных', 'верификация',
|
|
144
|
+
],
|
|
145
|
+
issues: [
|
|
146
|
+
// EN (English)
|
|
147
|
+
'issues', 'risks', 'blockers', 'problems', 'notes',
|
|
148
|
+
// UK (Українська)
|
|
149
|
+
'ризики', 'зауваження', 'блокери', 'проблеми',
|
|
150
|
+
// ES (Español)
|
|
151
|
+
'riesgos', 'problemas',
|
|
152
|
+
// FR (Français)
|
|
153
|
+
'risques',
|
|
154
|
+
// DE (Deutsch)
|
|
155
|
+
'risiken', 'hinweise',
|
|
156
|
+
// ZH (中文 - Chinese)
|
|
157
|
+
'风险', '问题', '注意事项',
|
|
158
|
+
// RU (Російська)
|
|
159
|
+
'риски', 'замечания', 'блокеры',
|
|
160
|
+
],
|
|
161
|
+
artifacts: [
|
|
162
|
+
// EN (English)
|
|
163
|
+
'artifacts', 'files', 'provenance', 'deliverables',
|
|
164
|
+
// UK (Українська)
|
|
165
|
+
'артефакти', 'файли',
|
|
166
|
+
// ES (Español)
|
|
167
|
+
'artefactos', 'archivos',
|
|
168
|
+
// FR (Français)
|
|
169
|
+
'artefacts', 'fichiers',
|
|
170
|
+
// DE (Deutsch)
|
|
171
|
+
'artefakte', 'dateien',
|
|
172
|
+
// ZH (中文 - Chinese)
|
|
173
|
+
'产物', '文件',
|
|
174
|
+
// RU (Російська)
|
|
175
|
+
'артефакты',
|
|
176
|
+
],
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Extend section synonyms dictionary with custom locale mappings.
|
|
181
|
+
* @param {Record<string, string[]>} localeMap
|
|
182
|
+
*/
|
|
183
|
+
static addLocaleSections(localeMap) {
|
|
184
|
+
for (const [section, words] of Object.entries(localeMap)) {
|
|
185
|
+
if (this.SECTIONS[section]) {
|
|
186
|
+
this.SECTIONS[section].push(...words)
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Model } from '@nan0web/types'
|
|
2
|
+
|
|
3
|
+
export class ReleaseParityModel extends Model {
|
|
4
|
+
static collection = { type: 'string', required: true }
|
|
5
|
+
static expected = { type: 'number', required: true }
|
|
6
|
+
static actual = { type: 'number', required: true }
|
|
7
|
+
static synced = { type: 'boolean', default: true }
|
|
8
|
+
static comment = { type: 'string' }
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {Partial<ReleaseParityModel>} [data={}]
|
|
12
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
13
|
+
*/
|
|
14
|
+
constructor(data = {}, options = {}) {
|
|
15
|
+
super(data, options)
|
|
16
|
+
/** @type {string} Collection name */
|
|
17
|
+
this.collection
|
|
18
|
+
/** @type {number} Expected count */
|
|
19
|
+
this.expected
|
|
20
|
+
/** @type {number} Actual count */
|
|
21
|
+
this.actual
|
|
22
|
+
/** @type {boolean} Synced flag */
|
|
23
|
+
this.synced
|
|
24
|
+
/** @type {string} Audit comment */
|
|
25
|
+
this.comment
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Model } from '@nan0web/types'
|
|
2
|
+
|
|
3
|
+
export class ReleaseTaskModel extends Model {
|
|
4
|
+
static id = { type: 'string', required: true }
|
|
5
|
+
static title = { type: 'string', required: true }
|
|
6
|
+
static status = { type: 'string', default: 'todo' } // 'todo' | 'work' | 'done' | 'fail'
|
|
7
|
+
static assignee = { type: 'string' }
|
|
8
|
+
static estimateHours = { type: 'number' }
|
|
9
|
+
static spentHours = { type: 'number' }
|
|
10
|
+
static notes = { type: 'string' }
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {Partial<ReleaseTaskModel>} [data={}]
|
|
14
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
15
|
+
*/
|
|
16
|
+
constructor(data = {}, options = {}) {
|
|
17
|
+
super(data, options)
|
|
18
|
+
/** @type {string} Task ID */
|
|
19
|
+
this.id
|
|
20
|
+
/** @type {string} Task Title */
|
|
21
|
+
this.title
|
|
22
|
+
/** @type {'todo' | 'work' | 'done' | 'fail'} Task Status */
|
|
23
|
+
this.status
|
|
24
|
+
/** @type {string} Assignee */
|
|
25
|
+
this.assignee
|
|
26
|
+
/** @type {number} Estimated Hours */
|
|
27
|
+
this.estimateHours
|
|
28
|
+
/** @type {number} Spent Hours */
|
|
29
|
+
this.spentHours
|
|
30
|
+
/** @type {string} Notes */
|
|
31
|
+
this.notes
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ReleaseMemberModel } from './ReleaseMemberModel.js'
|
|
2
|
+
export { ReleaseTaskModel } from './ReleaseTaskModel.js'
|
|
3
|
+
export { ReleaseParityModel } from './ReleaseParityModel.js'
|
|
4
|
+
export { ReleaseIssueModel } from './ReleaseIssueModel.js'
|
|
5
|
+
export { ReleaseModel } from './ReleaseModel.js'
|
|
6
|
+
|
package/src/index.js
CHANGED
|
@@ -35,4 +35,13 @@ export { default as PreviewCommand } from './domain/PreviewCommand.js'
|
|
|
35
35
|
export { RegistryModel } from './domain/Registry/RegistryModel.js'
|
|
36
36
|
export { DashboardModel } from './domain/Dashboard/DashboardModel.js'
|
|
37
37
|
export { ReleaseAuditor } from './domain/inspect/ReleaseAuditor.js'
|
|
38
|
+
export {
|
|
39
|
+
ReleaseModel,
|
|
40
|
+
ReleaseMemberModel,
|
|
41
|
+
ReleaseTaskModel,
|
|
42
|
+
ReleaseParityModel,
|
|
43
|
+
ReleaseIssueModel,
|
|
44
|
+
} from './domain/models/index.js'
|
|
45
|
+
export { PMaCParser, resolveTrackerUrl } from './domain/PMaCParser.js'
|
|
46
|
+
export { ValidateCommand } from './domain/ValidateCommand.js'
|
|
38
47
|
|
package/types/domain/App.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export class ReleaseApp extends ModelAsApp {
|
|
|
5
5
|
};
|
|
6
6
|
static command: {
|
|
7
7
|
help: string;
|
|
8
|
-
options: (typeof CheckCommand | typeof CloseCommand | typeof DepsCommand | typeof PublishCommand | typeof StatusCommand | typeof WebCommand | typeof ListCommand | typeof ServeCommand)[];
|
|
8
|
+
options: (typeof CheckCommand | typeof CloseCommand | typeof DepsCommand | typeof PublishCommand | typeof StatusCommand | typeof WebCommand | typeof ListCommand | typeof ServeCommand | typeof ValidateCommand)[];
|
|
9
9
|
positional: boolean;
|
|
10
10
|
default: typeof ViewCommand;
|
|
11
11
|
};
|
|
@@ -30,4 +30,5 @@ import StatusCommand from './StatusCommand.js';
|
|
|
30
30
|
import WebCommand from './WebCommand.js';
|
|
31
31
|
import ListCommand from './ListCommand.js';
|
|
32
32
|
import ServeCommand from './ServeCommand.js';
|
|
33
|
+
import ValidateCommand from './ValidateCommand.js';
|
|
33
34
|
import ViewCommand from './ViewCommand.js';
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clean text from emoji, symbols, markdown formatting and trim.
|
|
3
|
+
* @param {string} text
|
|
4
|
+
* @returns {string}
|
|
5
|
+
*/
|
|
6
|
+
export function cleanSectionTitle(text: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Match section title against known synonyms in ReleaseModel.SECTIONS.
|
|
9
|
+
* @param {string} headingText
|
|
10
|
+
* @param {typeof ReleaseModel} ModelClass
|
|
11
|
+
* @returns {string | null} Recognized section key or null
|
|
12
|
+
*/
|
|
13
|
+
export function identifySection(headingText: string, ModelClass?: typeof ReleaseModel): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve external tracker URL for a task or issue ID using template URL.
|
|
16
|
+
* Example: trackerUrl = "https://github.com/org/repo/issues/{id}", rawId = "[#142]" -> "https://github.com/org/repo/issues/142"
|
|
17
|
+
* @param {string} id
|
|
18
|
+
* @param {string} trackerTemplate
|
|
19
|
+
* @returns {string}
|
|
20
|
+
*/
|
|
21
|
+
export function resolveTrackerUrl(id: string, trackerTemplate: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* PMaCParser - Parses PMaC Release/Task specification documents into ReleaseModel instances.
|
|
24
|
+
*/
|
|
25
|
+
export class PMaCParser {
|
|
26
|
+
/**
|
|
27
|
+
* Static shortcut to parse specification
|
|
28
|
+
* @param {string} markdownContent
|
|
29
|
+
* @returns {ReleaseModel}
|
|
30
|
+
*/
|
|
31
|
+
static parse(markdownContent: string): ReleaseModel;
|
|
32
|
+
/**
|
|
33
|
+
* @param {typeof ReleaseModel} [modelClass]
|
|
34
|
+
*/
|
|
35
|
+
constructor(modelClass?: typeof ReleaseModel);
|
|
36
|
+
ModelClass: typeof ReleaseModel;
|
|
37
|
+
/**
|
|
38
|
+
* Parse markdown content into a ReleaseModel instance.
|
|
39
|
+
* @param {string} markdownContent
|
|
40
|
+
* @returns {ReleaseModel}
|
|
41
|
+
*/
|
|
42
|
+
parse(markdownContent: string): ReleaseModel;
|
|
43
|
+
/**
|
|
44
|
+
* @private
|
|
45
|
+
*/
|
|
46
|
+
private _parseTeamSection;
|
|
47
|
+
/**
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
private _parseTasksSection;
|
|
51
|
+
/**
|
|
52
|
+
* @private
|
|
53
|
+
*/
|
|
54
|
+
private _parseParitySection;
|
|
55
|
+
/**
|
|
56
|
+
* @private
|
|
57
|
+
*/
|
|
58
|
+
private _parseIssuesSection;
|
|
59
|
+
/**
|
|
60
|
+
* @private
|
|
61
|
+
*/
|
|
62
|
+
private _parseArtifactsSection;
|
|
63
|
+
}
|
|
64
|
+
import { ReleaseModel } from './models/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ValidateCommand - CLI Release Inspector & Multi-Format Validator.
|
|
3
|
+
* Validates PMaC compliance, tasks, criteria, parity and outputs in text, json, nan0, or csv.
|
|
4
|
+
*/
|
|
5
|
+
export class ValidateCommand extends ModelAsApp {
|
|
6
|
+
static alias: string;
|
|
7
|
+
static UI: {
|
|
8
|
+
title: string;
|
|
9
|
+
header: string;
|
|
10
|
+
scanningCount: string;
|
|
11
|
+
projectHeader: string;
|
|
12
|
+
noReleases: string;
|
|
13
|
+
savedReport: string;
|
|
14
|
+
summary: string;
|
|
15
|
+
};
|
|
16
|
+
static target: {
|
|
17
|
+
help: string;
|
|
18
|
+
default: string;
|
|
19
|
+
type: string;
|
|
20
|
+
positional: boolean;
|
|
21
|
+
};
|
|
22
|
+
static format: {
|
|
23
|
+
help: string;
|
|
24
|
+
default: string;
|
|
25
|
+
options: string[];
|
|
26
|
+
type: string;
|
|
27
|
+
alias: string;
|
|
28
|
+
};
|
|
29
|
+
static output: {
|
|
30
|
+
help: string;
|
|
31
|
+
default: string;
|
|
32
|
+
type: string;
|
|
33
|
+
alias: string;
|
|
34
|
+
};
|
|
35
|
+
static registryFile: {
|
|
36
|
+
help: string;
|
|
37
|
+
default: string;
|
|
38
|
+
type: string;
|
|
39
|
+
alias: string;
|
|
40
|
+
};
|
|
41
|
+
static all: {
|
|
42
|
+
help: string;
|
|
43
|
+
default: boolean;
|
|
44
|
+
type: string;
|
|
45
|
+
alias: string;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* @param {Partial<ValidateCommand>} [data]
|
|
49
|
+
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options]
|
|
50
|
+
*/
|
|
51
|
+
constructor(data?: Partial<ValidateCommand>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
52
|
+
/** @type {string} */ target: string;
|
|
53
|
+
/** @type {'text' | 'json' | 'nan0' | 'csv'} */ format: "text" | "json" | "nan0" | "csv";
|
|
54
|
+
/** @type {string} */ output: string;
|
|
55
|
+
/** @type {string} */ registryFile: string;
|
|
56
|
+
/** @type {boolean} */ all: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Execute release validation and format rendering
|
|
59
|
+
* @returns {AsyncGenerator<import('@nan0web/ui').Intent, { success: boolean, releases: any[], output: string }, any>}
|
|
60
|
+
*/
|
|
61
|
+
run(): AsyncGenerator<import("@nan0web/ui").Intent, {
|
|
62
|
+
success: boolean;
|
|
63
|
+
releases: any[];
|
|
64
|
+
output: string;
|
|
65
|
+
}, any>;
|
|
66
|
+
#private;
|
|
67
|
+
}
|
|
68
|
+
export default ValidateCommand;
|
|
69
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export class ReleaseIssueModel extends Model {
|
|
2
|
+
static level: {
|
|
3
|
+
type: string;
|
|
4
|
+
default: string;
|
|
5
|
+
};
|
|
6
|
+
static code: {
|
|
7
|
+
type: string;
|
|
8
|
+
};
|
|
9
|
+
static message: {
|
|
10
|
+
type: string;
|
|
11
|
+
required: boolean;
|
|
12
|
+
};
|
|
13
|
+
static source: {
|
|
14
|
+
type: string;
|
|
15
|
+
};
|
|
16
|
+
static file: {
|
|
17
|
+
type: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @param {Partial<ReleaseIssueModel>} [data={}]
|
|
21
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
22
|
+
*/
|
|
23
|
+
constructor(data?: Partial<ReleaseIssueModel>, options?: Partial<import("@nan0web/types").ModelOptions>);
|
|
24
|
+
/** @type { 'error' | 'warning' | 'info' } Level of issue */
|
|
25
|
+
level: "error" | "warning" | "info";
|
|
26
|
+
/** @type {string} Issue code */
|
|
27
|
+
code: string;
|
|
28
|
+
/** @type {string} Issue message */
|
|
29
|
+
message: string;
|
|
30
|
+
/** @type {string} Issue source */
|
|
31
|
+
source: string;
|
|
32
|
+
/** @type {string} Issue file */
|
|
33
|
+
file: string;
|
|
34
|
+
}
|
|
35
|
+
import { Model } from '@nan0web/types';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class ReleaseMemberModel extends Model {
|
|
2
|
+
static role: {
|
|
3
|
+
type: string;
|
|
4
|
+
required: boolean;
|
|
5
|
+
};
|
|
6
|
+
static name: {
|
|
7
|
+
type: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
};
|
|
10
|
+
static handle: {
|
|
11
|
+
type: string;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* @param {Partial<ReleaseMemberModel>} [data={}]
|
|
15
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
16
|
+
*/
|
|
17
|
+
constructor(data?: Partial<ReleaseMemberModel>, options?: Partial<import("@nan0web/types").ModelOptions>);
|
|
18
|
+
/** @type {string} Role / Position (Посада) */
|
|
19
|
+
role: string;
|
|
20
|
+
/** @type {string} Full Name (Ім'я) */
|
|
21
|
+
name: string;
|
|
22
|
+
/** @type {string} Login / Handle (Логін без @) */
|
|
23
|
+
handle: string;
|
|
24
|
+
}
|
|
25
|
+
import { Model } from '@nan0web/types';
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export class ReleaseModel extends Model {
|
|
2
|
+
static version: {
|
|
3
|
+
type: string;
|
|
4
|
+
required: boolean;
|
|
5
|
+
};
|
|
6
|
+
static title: {
|
|
7
|
+
type: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
};
|
|
10
|
+
static status: {
|
|
11
|
+
type: string;
|
|
12
|
+
default: string;
|
|
13
|
+
};
|
|
14
|
+
static type: {
|
|
15
|
+
type: string;
|
|
16
|
+
default: string;
|
|
17
|
+
};
|
|
18
|
+
static summary: {
|
|
19
|
+
type: string;
|
|
20
|
+
};
|
|
21
|
+
static epic: {
|
|
22
|
+
type: string;
|
|
23
|
+
};
|
|
24
|
+
static sprint: {
|
|
25
|
+
type: string;
|
|
26
|
+
};
|
|
27
|
+
static tracker: {
|
|
28
|
+
type: string;
|
|
29
|
+
};
|
|
30
|
+
static team: {
|
|
31
|
+
type: string;
|
|
32
|
+
itemType: typeof ReleaseMemberModel;
|
|
33
|
+
default: never[];
|
|
34
|
+
};
|
|
35
|
+
static tasks: {
|
|
36
|
+
type: string;
|
|
37
|
+
itemType: typeof ReleaseTaskModel;
|
|
38
|
+
default: never[];
|
|
39
|
+
};
|
|
40
|
+
static criteria: {
|
|
41
|
+
type: string;
|
|
42
|
+
itemType: typeof ReleaseTaskModel;
|
|
43
|
+
default: never[];
|
|
44
|
+
};
|
|
45
|
+
static parity: {
|
|
46
|
+
type: string;
|
|
47
|
+
itemType: typeof ReleaseParityModel;
|
|
48
|
+
default: never[];
|
|
49
|
+
};
|
|
50
|
+
static issues: {
|
|
51
|
+
type: string;
|
|
52
|
+
itemType: typeof ReleaseIssueModel;
|
|
53
|
+
default: never[];
|
|
54
|
+
};
|
|
55
|
+
static files: {
|
|
56
|
+
type: string;
|
|
57
|
+
default: never[];
|
|
58
|
+
};
|
|
59
|
+
static meta: {
|
|
60
|
+
type: string;
|
|
61
|
+
default: {};
|
|
62
|
+
};
|
|
63
|
+
static SECTIONS: {
|
|
64
|
+
summary: string[];
|
|
65
|
+
team: string[];
|
|
66
|
+
tasks: string[];
|
|
67
|
+
criteria: string[];
|
|
68
|
+
parity: string[];
|
|
69
|
+
issues: string[];
|
|
70
|
+
artifacts: string[];
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Extend section synonyms dictionary with custom locale mappings.
|
|
74
|
+
* @param {Record<string, string[]>} localeMap
|
|
75
|
+
*/
|
|
76
|
+
static addLocaleSections(localeMap: Record<string, string[]>): void;
|
|
77
|
+
/**
|
|
78
|
+
* @param {Partial<ReleaseModel>} [data={}]
|
|
79
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
80
|
+
*/
|
|
81
|
+
constructor(data?: Partial<ReleaseModel>, options?: Partial<import("@nan0web/types").ModelOptions>);
|
|
82
|
+
/** @type {string} Release version */
|
|
83
|
+
version: string;
|
|
84
|
+
/** @type {string} Release title */
|
|
85
|
+
title: string;
|
|
86
|
+
/** @type {'todo' | 'work' | 'done' | 'fail'} Release status */
|
|
87
|
+
status: "todo" | "work" | "done" | "fail";
|
|
88
|
+
/** @type {'major' | 'minor' | 'patch' | 'hotfix' | 'chore'} Release type */
|
|
89
|
+
type: "major" | "minor" | "patch" | "hotfix" | "chore";
|
|
90
|
+
/** @type {string} Release summary / description */
|
|
91
|
+
summary: string;
|
|
92
|
+
/** @type {string} Epic identifier */
|
|
93
|
+
epic: string;
|
|
94
|
+
/** @type {string} Sprint name */
|
|
95
|
+
sprint: string;
|
|
96
|
+
/** @type {string} External tracker URL template */
|
|
97
|
+
tracker: string;
|
|
98
|
+
/** @type {ReleaseMemberModel[]} Team members (ролі, імена, логіни) */
|
|
99
|
+
team: ReleaseMemberModel[];
|
|
100
|
+
/** @type {ReleaseTaskModel[]} Tasks in scope */
|
|
101
|
+
tasks: ReleaseTaskModel[];
|
|
102
|
+
/** @type {ReleaseTaskModel[]} Acceptance criteria (DoD) */
|
|
103
|
+
criteria: ReleaseTaskModel[];
|
|
104
|
+
/** @type {ReleaseParityModel[]} Data parity verification items */
|
|
105
|
+
parity: ReleaseParityModel[];
|
|
106
|
+
/** @type {ReleaseIssueModel[]} Issues and risks */
|
|
107
|
+
issues: ReleaseIssueModel[];
|
|
108
|
+
/** @type {Array<{file: string, size?: string, hash?: string, type?: string}>} Artifact files */
|
|
109
|
+
files: Array<{
|
|
110
|
+
file: string;
|
|
111
|
+
size?: string;
|
|
112
|
+
hash?: string;
|
|
113
|
+
type?: string;
|
|
114
|
+
}>;
|
|
115
|
+
/** @type {Record<string, any>} Frontmatter / metadata */
|
|
116
|
+
meta: Record<string, any>;
|
|
117
|
+
}
|
|
118
|
+
import { Model } from '@nan0web/types';
|
|
119
|
+
import { ReleaseMemberModel } from './ReleaseMemberModel.js';
|
|
120
|
+
import { ReleaseTaskModel } from './ReleaseTaskModel.js';
|
|
121
|
+
import { ReleaseParityModel } from './ReleaseParityModel.js';
|
|
122
|
+
import { ReleaseIssueModel } from './ReleaseIssueModel.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class ReleaseParityModel extends Model {
|
|
2
|
+
static collection: {
|
|
3
|
+
type: string;
|
|
4
|
+
required: boolean;
|
|
5
|
+
};
|
|
6
|
+
static expected: {
|
|
7
|
+
type: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
};
|
|
10
|
+
static actual: {
|
|
11
|
+
type: string;
|
|
12
|
+
required: boolean;
|
|
13
|
+
};
|
|
14
|
+
static synced: {
|
|
15
|
+
type: string;
|
|
16
|
+
default: boolean;
|
|
17
|
+
};
|
|
18
|
+
static comment: {
|
|
19
|
+
type: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @param {Partial<ReleaseParityModel>} [data={}]
|
|
23
|
+
* @param {Partial<import('@nan0web/types').ModelOptions>} [options={}]
|
|
24
|
+
*/
|
|
25
|
+
constructor(data?: Partial<ReleaseParityModel>, options?: Partial<import("@nan0web/types").ModelOptions>);
|
|
26
|
+
/** @type {string} Collection name */
|
|
27
|
+
collection: string;
|
|
28
|
+
/** @type {number} Expected count */
|
|
29
|
+
expected: number;
|
|
30
|
+
/** @type {number} Actual count */
|
|
31
|
+
actual: number;
|
|
32
|
+
/** @type {boolean} Synced flag */
|
|
33
|
+
synced: boolean;
|
|
34
|
+
/** @type {string} Audit comment */
|
|
35
|
+
comment: string;
|
|
36
|
+
}
|
|
37
|
+
import { Model } from '@nan0web/types';
|