@nan0web/release 3.3.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 +33 -2
- package/bin/serve.js +73 -0
- package/package.json +46 -17
- package/src/Release/Document.js +1 -0
- package/src/Release/Scanner.js +3 -2
- package/src/Release.js +7 -7
- package/src/domain/App.js +33 -2
- package/src/domain/BumpCommand.js +10 -3
- package/src/domain/CheckCommand.js +504 -146
- package/src/domain/CheckCommand.story.js +92 -0
- package/src/domain/CloseCommand.js +13 -9
- package/src/domain/Dashboard/Dashboard.story.js +155 -0
- package/src/domain/Dashboard/DashboardModel.js +308 -0
- package/src/domain/Dashboard/ReleaseDiscovery.js +132 -0
- package/src/domain/Dashboard/ReleaseParser.js +226 -0
- package/src/domain/Dashboard/index.js +19 -0
- package/src/domain/DepsCommand.js +5 -2
- package/src/domain/InitCommand.js +18 -16
- package/src/domain/ListCommand.js +45 -0
- package/src/domain/PMaCParser.js +418 -0
- package/src/domain/PMaCParser.story.js +152 -0
- package/src/domain/PreviewCommand.js +39 -0
- package/src/domain/PublishCommand.js +7 -3
- package/src/domain/Registry/Registry.story.js +82 -0
- package/src/domain/Registry/RegistryModel.js +124 -0
- package/src/domain/ServeCommand.js +165 -0
- package/src/domain/ServeCommand.story.js +88 -0
- package/src/domain/SpecCommand.js +3 -1
- package/src/domain/StatusCommand.js +249 -3
- package/src/domain/ValidateCommand.js +426 -0
- package/src/domain/ValidateCommand.story.js +92 -0
- package/src/domain/ViewCommand.js +99 -0
- package/src/domain/WebCommand.js +140 -0
- package/src/domain/inspect/ReleaseAuditor.js +508 -0
- package/src/domain/inspect/ReleaseAuditor.story.js +136 -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/domain/templates/release.html +34 -0
- package/src/domain/templates/release.html.template.js +34 -0
- package/src/index.js +15 -0
- package/src/inspectors/inspect-js.js +32 -0
- package/src/releases/1/0/v1.0.3/task.test.js +1 -1
- package/src/utils/nodejs/GitTelemetry.js +154 -0
- package/types/Release/Document.d.ts +24 -27
- package/types/Release/MarkdownToTest.d.ts +1 -1
- package/types/Release/Person.d.ts +9 -7
- package/types/Release/Scanner.d.ts +41 -41
- package/types/Release.d.ts +42 -42
- package/types/architecture/ProjectManagementAsCode.d.ts +59 -64
- package/types/domain/App.d.ts +25 -7
- package/types/domain/BumpCommand.d.ts +11 -6
- package/types/domain/CheckCommand.d.ts +128 -16
- package/types/domain/CheckCommand.story.d.ts +1 -0
- package/types/domain/CloseCommand.d.ts +4 -6
- package/types/domain/Dashboard/Dashboard.story.d.ts +1 -0
- package/types/domain/Dashboard/DashboardModel.d.ts +273 -0
- package/types/domain/Dashboard/GitTelemetry.d.ts +23 -0
- package/types/domain/Dashboard/ReleaseDiscovery.d.ts +47 -0
- package/types/domain/Dashboard/ReleaseParser.d.ts +79 -0
- package/types/domain/Dashboard/index.d.ts +3 -0
- package/types/domain/DepsCommand.d.ts +6 -6
- package/types/domain/InitCommand.d.ts +4 -6
- package/types/domain/ListCommand.d.ts +18 -0
- package/types/domain/PMaCParser.d.ts +64 -0
- package/types/domain/PMaCParser.story.d.ts +1 -0
- package/types/domain/PreviewCommand.d.ts +6 -0
- package/types/domain/PublishCommand.d.ts +8 -6
- package/types/domain/Registry/Registry.story.d.ts +1 -0
- package/types/domain/Registry/RegistryModel.d.ts +61 -0
- package/types/domain/ServeCommand.d.ts +59 -0
- package/types/domain/ServeCommand.story.d.ts +1 -0
- package/types/domain/SpecCommand.d.ts +4 -6
- package/types/domain/StatusCommand.d.ts +38 -3
- package/types/domain/ValidateCommand.d.ts +69 -0
- package/types/domain/ValidateCommand.story.d.ts +1 -0
- package/types/domain/ViewCommand.d.ts +27 -0
- package/types/domain/WebCommand.d.ts +47 -0
- package/types/domain/inspect/ReleaseAuditor.d.ts +134 -0
- package/types/domain/inspect/ReleaseAuditor.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/domain/templates/release.html.template.d.ts +2 -0
- package/types/index.d.ts +21 -10
- package/types/inspectors/inspect-js.d.ts +2 -0
- package/types/utils/nodejs/GitTelemetry.d.ts +23 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import('./ReleaseParser.js').TaskItem} TaskItem
|
|
3
|
+
* @typedef {Object} ProjectDashboardEntry
|
|
4
|
+
* @property {string} path - Relative project path
|
|
5
|
+
* @property {string} name - Project name
|
|
6
|
+
* @property {string} version - Current release version
|
|
7
|
+
* @property {number} hours - Development hours spent
|
|
8
|
+
* @property {number} iterations - Test runs / refactor iterations
|
|
9
|
+
* @property {number} rrs - Release Readiness Score
|
|
10
|
+
* @property {'wip' | 'closed' | 'unknown'} status - Release state
|
|
11
|
+
* @property {TaskItem[]} tasks - Parsed tasks from release.md
|
|
12
|
+
* @property {string} branch - Git branch name
|
|
13
|
+
* @property {'clean' | 'dirty'} gitStatus - Git workspace status
|
|
14
|
+
* @property {string} userContent - Raw user.md content
|
|
15
|
+
* @property {string} releaseContent - Raw release.md content
|
|
16
|
+
* @property {string} sourceDoc - Relative path to the parsed release document
|
|
17
|
+
* @property {string} sourceUserDoc - Relative path to user.md
|
|
18
|
+
* @property {string?} deadline - Project release deadline
|
|
19
|
+
* @property {number?} daysRemaining - Days remaining until deadline
|
|
20
|
+
* @property {string?} priority - Priority (0 | 1 | 2 | 3)
|
|
21
|
+
* @property {number} [releasesCount] - Number of releases found
|
|
22
|
+
* @property {number} [totalHours] - Total hours across all releases
|
|
23
|
+
* @property {number} [totalIterations] - Total iterations across all releases
|
|
24
|
+
* @property {Array<any>} [allReleases] - List of all releases for project
|
|
25
|
+
*
|
|
26
|
+
* @typedef {Object} DashboardSummary
|
|
27
|
+
* @property {number} totalProjects - Total tracked projects
|
|
28
|
+
* @property {number} totalHours - Sum of hours across projects
|
|
29
|
+
* @property {number} totalIterations - Sum of iterations
|
|
30
|
+
* @property {number} wipCount - Active WIP releases
|
|
31
|
+
* @property {number} closedCount - Closed releases
|
|
32
|
+
* @property {number} [totalReleases] - Total releases counted
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* DashboardModel - Aggregates release telemetry, tasks and readiness across projects.
|
|
36
|
+
*/
|
|
37
|
+
export class DashboardModel extends ModelAsApp {
|
|
38
|
+
static registryFile: {
|
|
39
|
+
help: string;
|
|
40
|
+
default: string;
|
|
41
|
+
type: string;
|
|
42
|
+
};
|
|
43
|
+
static summary: {
|
|
44
|
+
help: string;
|
|
45
|
+
default: {
|
|
46
|
+
totalProjects: number;
|
|
47
|
+
totalHours: number;
|
|
48
|
+
totalIterations: number;
|
|
49
|
+
wipCount: number;
|
|
50
|
+
closedCount: number;
|
|
51
|
+
};
|
|
52
|
+
type: string;
|
|
53
|
+
};
|
|
54
|
+
static projects: {
|
|
55
|
+
help: string;
|
|
56
|
+
default: () => never[];
|
|
57
|
+
type: string;
|
|
58
|
+
};
|
|
59
|
+
static UI: {
|
|
60
|
+
aggregating: string;
|
|
61
|
+
done: string;
|
|
62
|
+
};
|
|
63
|
+
static parseUserMetrics: typeof parseUserMetrics;
|
|
64
|
+
static normalizePriority: typeof normalizePriority;
|
|
65
|
+
static sortTasks: typeof sortTasks;
|
|
66
|
+
static versionToPath: typeof versionToPath;
|
|
67
|
+
/**
|
|
68
|
+
* @param {Partial<DashboardModel>} [data={}]
|
|
69
|
+
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions & { gitTelemetry?: any }>} [options={}]
|
|
70
|
+
*/
|
|
71
|
+
constructor(data?: Partial<DashboardModel>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions & {
|
|
72
|
+
gitTelemetry?: any;
|
|
73
|
+
}>);
|
|
74
|
+
/** @type {string} Path to releases.txt registry file */ registryFile: string;
|
|
75
|
+
/** @type {DashboardSummary} Aggregated metrics summary */ summary: DashboardSummary;
|
|
76
|
+
/** @type {ProjectDashboardEntry[]} List of projects with metrics */ projects: ProjectDashboardEntry[];
|
|
77
|
+
/** @type {any} Optional git telemetry adapter */
|
|
78
|
+
_gitTelemetry: any;
|
|
79
|
+
/**
|
|
80
|
+
* Canonical OLMUI Generator: Yields progress, show, and returns result.
|
|
81
|
+
* @returns {AsyncGenerator<import('@nan0web/ui').Intent, any, any>}
|
|
82
|
+
*/
|
|
83
|
+
run(): AsyncGenerator<import("@nan0web/ui").Intent, any, any>;
|
|
84
|
+
/**
|
|
85
|
+
* Programmatic aggregation helper
|
|
86
|
+
* @param {Function} [onProgress]
|
|
87
|
+
* @returns {Promise<{ summary: DashboardSummary, projects: ProjectDashboardEntry[] }>}
|
|
88
|
+
*/
|
|
89
|
+
aggregate(onProgress?: Function): Promise<{
|
|
90
|
+
summary: DashboardSummary;
|
|
91
|
+
projects: ProjectDashboardEntry[];
|
|
92
|
+
}>;
|
|
93
|
+
aggregateStream(): AsyncGenerator<{
|
|
94
|
+
current: number;
|
|
95
|
+
total: number;
|
|
96
|
+
project: string;
|
|
97
|
+
}, {
|
|
98
|
+
summary: DashboardSummary;
|
|
99
|
+
projects: ({
|
|
100
|
+
name: any;
|
|
101
|
+
version: any;
|
|
102
|
+
path: any;
|
|
103
|
+
status: string;
|
|
104
|
+
hours: number;
|
|
105
|
+
iterations: number;
|
|
106
|
+
rrs: number;
|
|
107
|
+
branch: any;
|
|
108
|
+
gitStatus: any;
|
|
109
|
+
tasks: never[];
|
|
110
|
+
deadline: null;
|
|
111
|
+
daysRemaining: null;
|
|
112
|
+
priority: string;
|
|
113
|
+
releasesCount: number;
|
|
114
|
+
totalHours: number;
|
|
115
|
+
totalIterations: number;
|
|
116
|
+
allReleases: never[];
|
|
117
|
+
sourceDoc: string;
|
|
118
|
+
sourceUserDoc: string;
|
|
119
|
+
userContent: string;
|
|
120
|
+
releaseContent: string;
|
|
121
|
+
} | {
|
|
122
|
+
path: string;
|
|
123
|
+
name: string;
|
|
124
|
+
version: string;
|
|
125
|
+
hours: number;
|
|
126
|
+
iterations: number;
|
|
127
|
+
totalHours: number;
|
|
128
|
+
totalIterations: number;
|
|
129
|
+
releasesCount: number;
|
|
130
|
+
allReleases: {
|
|
131
|
+
version: any;
|
|
132
|
+
path: any;
|
|
133
|
+
hours: number;
|
|
134
|
+
iterations: number;
|
|
135
|
+
rrs: number;
|
|
136
|
+
status: "wip" | "closed" | "unknown";
|
|
137
|
+
tasks: import("./ReleaseParser.js").TaskItem[];
|
|
138
|
+
sourceDoc: string;
|
|
139
|
+
}[];
|
|
140
|
+
rrs: number;
|
|
141
|
+
status: "wip" | "closed" | "unknown";
|
|
142
|
+
tasks: import("./ReleaseParser.js").TaskItem[];
|
|
143
|
+
branch: any;
|
|
144
|
+
gitStatus: any;
|
|
145
|
+
userContent: string;
|
|
146
|
+
releaseContent: string;
|
|
147
|
+
sourceDoc: string;
|
|
148
|
+
sourceUserDoc: string;
|
|
149
|
+
deadline: any;
|
|
150
|
+
daysRemaining: number | null;
|
|
151
|
+
priority: "0" | "1" | "2" | "3";
|
|
152
|
+
})[];
|
|
153
|
+
}, unknown>;
|
|
154
|
+
#private;
|
|
155
|
+
}
|
|
156
|
+
export type TaskItem = import("./ReleaseParser.js").TaskItem;
|
|
157
|
+
export type ProjectDashboardEntry = {
|
|
158
|
+
/**
|
|
159
|
+
* - Relative project path
|
|
160
|
+
*/
|
|
161
|
+
path: string;
|
|
162
|
+
/**
|
|
163
|
+
* - Project name
|
|
164
|
+
*/
|
|
165
|
+
name: string;
|
|
166
|
+
/**
|
|
167
|
+
* - Current release version
|
|
168
|
+
*/
|
|
169
|
+
version: string;
|
|
170
|
+
/**
|
|
171
|
+
* - Development hours spent
|
|
172
|
+
*/
|
|
173
|
+
hours: number;
|
|
174
|
+
/**
|
|
175
|
+
* - Test runs / refactor iterations
|
|
176
|
+
*/
|
|
177
|
+
iterations: number;
|
|
178
|
+
/**
|
|
179
|
+
* - Release Readiness Score
|
|
180
|
+
*/
|
|
181
|
+
rrs: number;
|
|
182
|
+
/**
|
|
183
|
+
* - Release state
|
|
184
|
+
*/
|
|
185
|
+
status: "wip" | "closed" | "unknown";
|
|
186
|
+
/**
|
|
187
|
+
* - Parsed tasks from release.md
|
|
188
|
+
*/
|
|
189
|
+
tasks: TaskItem[];
|
|
190
|
+
/**
|
|
191
|
+
* - Git branch name
|
|
192
|
+
*/
|
|
193
|
+
branch: string;
|
|
194
|
+
/**
|
|
195
|
+
* - Git workspace status
|
|
196
|
+
*/
|
|
197
|
+
gitStatus: "clean" | "dirty";
|
|
198
|
+
/**
|
|
199
|
+
* - Raw user.md content
|
|
200
|
+
*/
|
|
201
|
+
userContent: string;
|
|
202
|
+
/**
|
|
203
|
+
* - Raw release.md content
|
|
204
|
+
*/
|
|
205
|
+
releaseContent: string;
|
|
206
|
+
/**
|
|
207
|
+
* - Relative path to the parsed release document
|
|
208
|
+
*/
|
|
209
|
+
sourceDoc: string;
|
|
210
|
+
/**
|
|
211
|
+
* - Relative path to user.md
|
|
212
|
+
*/
|
|
213
|
+
sourceUserDoc: string;
|
|
214
|
+
/**
|
|
215
|
+
* - Project release deadline
|
|
216
|
+
*/
|
|
217
|
+
deadline: string | null;
|
|
218
|
+
/**
|
|
219
|
+
* - Days remaining until deadline
|
|
220
|
+
*/
|
|
221
|
+
daysRemaining: number | null;
|
|
222
|
+
/**
|
|
223
|
+
* - Priority (0 | 1 | 2 | 3)
|
|
224
|
+
*/
|
|
225
|
+
priority: string | null;
|
|
226
|
+
/**
|
|
227
|
+
* - Number of releases found
|
|
228
|
+
*/
|
|
229
|
+
releasesCount?: number | undefined;
|
|
230
|
+
/**
|
|
231
|
+
* - Total hours across all releases
|
|
232
|
+
*/
|
|
233
|
+
totalHours?: number | undefined;
|
|
234
|
+
/**
|
|
235
|
+
* - Total iterations across all releases
|
|
236
|
+
*/
|
|
237
|
+
totalIterations?: number | undefined;
|
|
238
|
+
/**
|
|
239
|
+
* - List of all releases for project
|
|
240
|
+
*/
|
|
241
|
+
allReleases?: any[] | undefined;
|
|
242
|
+
};
|
|
243
|
+
export type DashboardSummary = {
|
|
244
|
+
/**
|
|
245
|
+
* - Total tracked projects
|
|
246
|
+
*/
|
|
247
|
+
totalProjects: number;
|
|
248
|
+
/**
|
|
249
|
+
* - Sum of hours across projects
|
|
250
|
+
*/
|
|
251
|
+
totalHours: number;
|
|
252
|
+
/**
|
|
253
|
+
* - Sum of iterations
|
|
254
|
+
*/
|
|
255
|
+
totalIterations: number;
|
|
256
|
+
/**
|
|
257
|
+
* - Active WIP releases
|
|
258
|
+
*/
|
|
259
|
+
wipCount: number;
|
|
260
|
+
/**
|
|
261
|
+
* - Closed releases
|
|
262
|
+
*/
|
|
263
|
+
closedCount: number;
|
|
264
|
+
/**
|
|
265
|
+
* - Total releases counted
|
|
266
|
+
*/
|
|
267
|
+
totalReleases?: number | undefined;
|
|
268
|
+
};
|
|
269
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
270
|
+
import { parseUserMetrics } from './ReleaseParser.js';
|
|
271
|
+
import { normalizePriority } from './ReleaseParser.js';
|
|
272
|
+
import { sortTasks } from './ReleaseParser.js';
|
|
273
|
+
import { versionToPath } from './ReleaseDiscovery.js';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset internal Git caches (useful for testing or cache invalidation)
|
|
3
|
+
*/
|
|
4
|
+
export function resetGitCache(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Retrieve git branch and workspace status (clean / dirty)
|
|
7
|
+
* @param {string} [projectDir]
|
|
8
|
+
* @returns {{ branch: string, gitStatus: 'clean' | 'dirty' }}
|
|
9
|
+
*/
|
|
10
|
+
export function getGitInfo(projectDir?: string): {
|
|
11
|
+
branch: string;
|
|
12
|
+
gitStatus: "clean" | "dirty";
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Retrieve development hours and iterations from git commit log
|
|
16
|
+
* @param {string} [projectDir]
|
|
17
|
+
* @param {string} [releasePath]
|
|
18
|
+
* @returns {{ hours: number, iterations: number }}
|
|
19
|
+
*/
|
|
20
|
+
export function getGitCommitTelemetry(projectDir?: string, releasePath?: string): {
|
|
21
|
+
hours: number;
|
|
22
|
+
iterations: number;
|
|
23
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse semver string into [major, minor, patch] numbers
|
|
3
|
+
* @param {string} [v='']
|
|
4
|
+
* @returns {[number, number, number]}
|
|
5
|
+
*/
|
|
6
|
+
export function parseSemver(v?: string): [number, number, number];
|
|
7
|
+
/**
|
|
8
|
+
* Compare two semver strings in descending order
|
|
9
|
+
* @param {string} [a='']
|
|
10
|
+
* @param {string} [b='']
|
|
11
|
+
* @returns {number}
|
|
12
|
+
*/
|
|
13
|
+
export function compareSemverDesc(a?: string, b?: string): number;
|
|
14
|
+
/**
|
|
15
|
+
* Format release version to path segments e.g. "1.0.0" -> "1/0/v1.0.0"
|
|
16
|
+
* @param {string} [version='']
|
|
17
|
+
* @returns {string}
|
|
18
|
+
*/
|
|
19
|
+
export function versionToPath(version?: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Check whether a document exists in the virtual database
|
|
22
|
+
* @param {any} db
|
|
23
|
+
* @param {string} path
|
|
24
|
+
* @returns {Promise<boolean>}
|
|
25
|
+
*/
|
|
26
|
+
export function documentExists(db: any, path: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Load release doc (release.md, task.md, plan.md) and extract tasks
|
|
29
|
+
* @param {any} db
|
|
30
|
+
* @param {string} releaseDir
|
|
31
|
+
* @returns {Promise<{ releaseContent: string, sourceDoc: string, tasks: import('./ReleaseParser.js').TaskItem[] }>}
|
|
32
|
+
*/
|
|
33
|
+
export function loadReleaseDoc(db: any, releaseDir: string): Promise<{
|
|
34
|
+
releaseContent: string;
|
|
35
|
+
sourceDoc: string;
|
|
36
|
+
tasks: import("./ReleaseParser.js").TaskItem[];
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Discover release version directories using database listDir
|
|
40
|
+
* @param {any} db
|
|
41
|
+
* @param {string} projectRoot
|
|
42
|
+
* @returns {Promise<Array<{ version: string, path: string }>>}
|
|
43
|
+
*/
|
|
44
|
+
export function discoverReleases(db: any, projectRoot: string): Promise<Array<{
|
|
45
|
+
version: string;
|
|
46
|
+
path: string;
|
|
47
|
+
}>>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {Object} TaskItem
|
|
3
|
+
* @property {string} content - Task title or description
|
|
4
|
+
* @property {string} status - todo | InProgress | Done
|
|
5
|
+
* @property {string} slug - Task slug / identifier
|
|
6
|
+
* @property {'0' | '1' | '2' | '3'} [priority] - Numeric priority
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Parse frontmatter YAML from markdown text
|
|
10
|
+
* @param {*} input
|
|
11
|
+
* @returns {Record<string, any>}
|
|
12
|
+
*/
|
|
13
|
+
export function parseFrontmatter(input: any): Record<string, any>;
|
|
14
|
+
/**
|
|
15
|
+
* Normalize priority to numeric string '0' | '1' | '2' | '3'
|
|
16
|
+
* @param {any} input
|
|
17
|
+
* @returns {'0' | '1' | '2' | '3'}
|
|
18
|
+
*/
|
|
19
|
+
export function normalizePriority(input: any): "0" | "1" | "2" | "3";
|
|
20
|
+
/**
|
|
21
|
+
* Extract clean task items from release markdown
|
|
22
|
+
* @param {*} input
|
|
23
|
+
* @returns {TaskItem[]}
|
|
24
|
+
*/
|
|
25
|
+
export function extractTasks(input: any): TaskItem[];
|
|
26
|
+
/**
|
|
27
|
+
* Calculate days remaining until deadline
|
|
28
|
+
* @param {string} [deadlineStr]
|
|
29
|
+
* @returns {number | null}
|
|
30
|
+
*/
|
|
31
|
+
export function calculateDaysRemaining(deadlineStr?: string): number | null;
|
|
32
|
+
/**
|
|
33
|
+
* Parse user.md content for telemetry metrics (hours, iterations, RRS) across languages
|
|
34
|
+
* @param {*} [input]
|
|
35
|
+
* @returns {{ hours: number, iterations: number, rrs: number }}
|
|
36
|
+
*/
|
|
37
|
+
export function parseUserMetrics(input?: any): {
|
|
38
|
+
hours: number;
|
|
39
|
+
iterations: number;
|
|
40
|
+
rrs: number;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Resolve priority from frontmatter or days remaining
|
|
44
|
+
* @param {Record<string, any>} fm
|
|
45
|
+
* @param {number | null} daysRemaining
|
|
46
|
+
* @returns {'0' | '1' | '2' | '3'}
|
|
47
|
+
*/
|
|
48
|
+
export function resolvePriority(fm?: Record<string, any>, daysRemaining?: number | null): "0" | "1" | "2" | "3";
|
|
49
|
+
/**
|
|
50
|
+
* Sort tasks by criteria ('priority', 'status', 'alphabetical')
|
|
51
|
+
* @param {TaskItem[]} [tasks=[]]
|
|
52
|
+
* @param {'priority' | 'status' | 'alphabetical'} [criteria='priority']
|
|
53
|
+
* @returns {TaskItem[]}
|
|
54
|
+
*/
|
|
55
|
+
export function sortTasks(tasks?: TaskItem[], criteria?: "priority" | "status" | "alphabetical"): TaskItem[];
|
|
56
|
+
/**
|
|
57
|
+
* Determine release status ('wip' | 'closed' | 'unknown')
|
|
58
|
+
* @param {object} params
|
|
59
|
+
* @returns {'wip' | 'closed' | 'unknown'}
|
|
60
|
+
*/
|
|
61
|
+
export function determineReleaseStatus({ fmStatus, hasSpec, hasTest, tasks, userStr, metrics }?: object): "wip" | "closed" | "unknown";
|
|
62
|
+
export type TaskItem = {
|
|
63
|
+
/**
|
|
64
|
+
* - Task title or description
|
|
65
|
+
*/
|
|
66
|
+
content: string;
|
|
67
|
+
/**
|
|
68
|
+
* - todo | InProgress | Done
|
|
69
|
+
*/
|
|
70
|
+
status: string;
|
|
71
|
+
/**
|
|
72
|
+
* - Task slug / identifier
|
|
73
|
+
*/
|
|
74
|
+
slug: string;
|
|
75
|
+
/**
|
|
76
|
+
* - Numeric priority
|
|
77
|
+
*/
|
|
78
|
+
priority?: "0" | "1" | "2" | "3" | undefined;
|
|
79
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { DashboardModel } from "./DashboardModel.js";
|
|
2
|
+
export { parseFrontmatter, extractTasks, calculateDaysRemaining, parseUserMetrics, normalizePriority, resolvePriority, sortTasks, determineReleaseStatus } from "./ReleaseParser.js";
|
|
3
|
+
export { parseSemver, compareSemverDesc, versionToPath, documentExists, loadReleaseDoc, discoverReleases } from "./ReleaseDiscovery.js";
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ModelAsApp } from '@nan0web/ui';
|
|
2
1
|
export default class DepsCommand extends ModelAsApp {
|
|
3
2
|
static fix: {
|
|
4
3
|
help: string;
|
|
@@ -16,9 +15,10 @@ export default class DepsCommand extends ModelAsApp {
|
|
|
16
15
|
* @param {Partial<DepsCommand>} [data]
|
|
17
16
|
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options]
|
|
18
17
|
*/
|
|
19
|
-
constructor(data?: Partial<DepsCommand>, options?: Partial<import(
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
constructor(data?: Partial<DepsCommand>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
19
|
+
/** @type {boolean} Apply fixes automatically */
|
|
20
|
+
fix: boolean;
|
|
21
|
+
/** @type {boolean} Update packages to the latest available versions */
|
|
22
|
+
latest: boolean;
|
|
24
23
|
}
|
|
24
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ModelAsApp } from '@nan0web/ui';
|
|
2
1
|
export default class InitCommand extends ModelAsApp {
|
|
3
2
|
static version: {
|
|
4
3
|
help: string;
|
|
@@ -13,9 +12,8 @@ export default class InitCommand extends ModelAsApp {
|
|
|
13
12
|
* @param {Partial<InitCommand>} [data]
|
|
14
13
|
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options]
|
|
15
14
|
*/
|
|
16
|
-
constructor(data?: Partial<InitCommand>, options?: Partial<import(
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
*/
|
|
20
|
-
run(): AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>;
|
|
15
|
+
constructor(data?: Partial<InitCommand>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
16
|
+
/** @type {string} Release version */
|
|
17
|
+
version: string;
|
|
21
18
|
}
|
|
19
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ListCommand - ModelAsApp Subcommand to list all available releases in chronological order.
|
|
3
|
+
*/
|
|
4
|
+
export default class ListCommand extends ModelAsApp {
|
|
5
|
+
static alias: string;
|
|
6
|
+
static UI: {
|
|
7
|
+
title: string;
|
|
8
|
+
help: string;
|
|
9
|
+
noReleases: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @param {Partial<ListCommand>} [data]
|
|
13
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
14
|
+
*/
|
|
15
|
+
constructor(data?: Partial<ListCommand>, options?: import("@nan0web/types").ModelOptions);
|
|
16
|
+
run(): AsyncGenerator<import("@nan0web/ui/src/core/Intent.js").ShowIntent, import("@nan0web/ui/src/core/Intent.js").ResultIntent, unknown>;
|
|
17
|
+
}
|
|
18
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -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 {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ModelAsApp } from '@nan0web/ui';
|
|
2
1
|
export default class PublishCommand extends ModelAsApp {
|
|
3
2
|
static major: {
|
|
4
3
|
help: string;
|
|
@@ -20,9 +19,12 @@ export default class PublishCommand extends ModelAsApp {
|
|
|
20
19
|
* @param {Partial<PublishCommand>} [data]
|
|
21
20
|
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options]
|
|
22
21
|
*/
|
|
23
|
-
constructor(data?: Partial<PublishCommand>, options?: Partial<import(
|
|
24
|
-
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
constructor(data?: Partial<PublishCommand>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
23
|
+
/** @type {boolean} Bump major version */
|
|
24
|
+
major: boolean;
|
|
25
|
+
/** @type {boolean} Bump minor version */
|
|
26
|
+
minor: boolean;
|
|
27
|
+
/** @type {boolean} Bump patch version */
|
|
28
|
+
patch: boolean;
|
|
28
29
|
}
|
|
30
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {Object} ProjectEntry
|
|
3
|
+
* @property {string} path - Project relative or absolute path
|
|
4
|
+
* @property {string} name - Package name from package.json or folder basename
|
|
5
|
+
* @property {string} version - Package version from package.json
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* RegistryModel - PM-as-Code Project Registry manager.
|
|
9
|
+
* Reads project paths from releases.txt and discovers package metadata.
|
|
10
|
+
*/
|
|
11
|
+
export class RegistryModel extends Model {
|
|
12
|
+
static filePath: {
|
|
13
|
+
help: string;
|
|
14
|
+
default: string;
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
static projects: {
|
|
18
|
+
help: string;
|
|
19
|
+
default: () => never[];
|
|
20
|
+
type: string;
|
|
21
|
+
};
|
|
22
|
+
static UI: {
|
|
23
|
+
fileNotFound: string;
|
|
24
|
+
loadingProjects: string;
|
|
25
|
+
projectsLoaded: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Parse raw content of releases.txt into array of clean paths
|
|
29
|
+
* @param {string} content
|
|
30
|
+
* @returns {string[]}
|
|
31
|
+
*/
|
|
32
|
+
static parsePaths(content?: string): string[];
|
|
33
|
+
/**
|
|
34
|
+
* @param {Partial<RegistryModel>} [data]
|
|
35
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
36
|
+
*/
|
|
37
|
+
constructor(data?: Partial<RegistryModel>, options?: import("@nan0web/types").ModelOptions);
|
|
38
|
+
/** @type {string} Path to registry file */ filePath: string;
|
|
39
|
+
/** @type {ProjectEntry[]} List of registered projects */ projects: ProjectEntry[];
|
|
40
|
+
/**
|
|
41
|
+
* Load project entries from registry file using injected DB instance
|
|
42
|
+
* @returns {Promise<ProjectEntry[]>}
|
|
43
|
+
*/
|
|
44
|
+
loadProjects(): Promise<ProjectEntry[]>;
|
|
45
|
+
}
|
|
46
|
+
export default RegistryModel;
|
|
47
|
+
export type ProjectEntry = {
|
|
48
|
+
/**
|
|
49
|
+
* - Project relative or absolute path
|
|
50
|
+
*/
|
|
51
|
+
path: string;
|
|
52
|
+
/**
|
|
53
|
+
* - Package name from package.json or folder basename
|
|
54
|
+
*/
|
|
55
|
+
name: string;
|
|
56
|
+
/**
|
|
57
|
+
* - Package version from package.json
|
|
58
|
+
*/
|
|
59
|
+
version: string;
|
|
60
|
+
};
|
|
61
|
+
import { Model } from '@nan0web/types';
|