@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.
@@ -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
 
@@ -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';