@nan0web/release 3.3.0 → 3.4.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/bin/nan0release.js +33 -2
- package/bin/serve.js +73 -0
- package/package.json +45 -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 +31 -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/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/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/templates/release.html +34 -0
- package/src/domain/templates/release.html.template.js +34 -0
- package/src/index.js +6 -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 +24 -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/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/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/templates/release.html.template.d.ts +2 -0
- package/types/index.d.ts +18 -10
- package/types/inspectors/inspect-js.d.ts +2 -0
- package/types/utils/nodejs/GitTelemetry.d.ts +23 -0
|
@@ -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';
|
|
@@ -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';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServeCommand - Universal ModelAsApp for data or release catalogs.
|
|
3
|
+
*
|
|
4
|
+
* Generates HTML content from README.md and release templates using $db and Markdown.
|
|
5
|
+
* Pure OLMUI model: does not start HTTP server, does not call node:fs or child_process.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* pnpm exec serve releases/ # Runs via CLI bootstrap
|
|
9
|
+
*/
|
|
10
|
+
export default class ServeCommand extends ModelAsApp {
|
|
11
|
+
static alias: string;
|
|
12
|
+
static UI: {
|
|
13
|
+
title: string;
|
|
14
|
+
help: string;
|
|
15
|
+
serving: string;
|
|
16
|
+
dirNotFound: string;
|
|
17
|
+
};
|
|
18
|
+
static dir: {
|
|
19
|
+
help: string;
|
|
20
|
+
positional: boolean;
|
|
21
|
+
type: string;
|
|
22
|
+
default: string;
|
|
23
|
+
};
|
|
24
|
+
static port: {
|
|
25
|
+
help: string;
|
|
26
|
+
default: number;
|
|
27
|
+
type: string;
|
|
28
|
+
alias: string;
|
|
29
|
+
};
|
|
30
|
+
static open: {
|
|
31
|
+
help: string;
|
|
32
|
+
default: boolean;
|
|
33
|
+
type: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* @param {Partial<ServeCommand>} [data]
|
|
37
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
38
|
+
*/
|
|
39
|
+
constructor(data?: Partial<ServeCommand>, options?: import("@nan0web/types").ModelOptions);
|
|
40
|
+
/** @type {string} */
|
|
41
|
+
dir: string;
|
|
42
|
+
/** @type {number} */
|
|
43
|
+
port: number;
|
|
44
|
+
/** @type {boolean} */
|
|
45
|
+
open: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Convert markdown string to HTML using @nan0web/markdown
|
|
48
|
+
* @param {string} mdRaw
|
|
49
|
+
* @returns {string}
|
|
50
|
+
*/
|
|
51
|
+
renderMarkdownToHtml(mdRaw: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Render HTML content for the target directory
|
|
54
|
+
* @returns {Promise<string>}
|
|
55
|
+
*/
|
|
56
|
+
renderHtml(): Promise<string>;
|
|
57
|
+
run(): AsyncGenerator<import("@nan0web/ui/src/core/Intent.js").ShowIntent, import("@nan0web/ui/src/core/Intent.js").ResultIntent, unknown>;
|
|
58
|
+
}
|
|
59
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ModelAsApp } from '@nan0web/ui';
|
|
2
1
|
export default class SpecCommand extends ModelAsApp {
|
|
3
2
|
static version: {
|
|
4
3
|
help: string;
|
|
@@ -12,9 +11,8 @@ export default class SpecCommand extends ModelAsApp {
|
|
|
12
11
|
* @param {Partial<SpecCommand>} [data]
|
|
13
12
|
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options]
|
|
14
13
|
*/
|
|
15
|
-
constructor(data?: Partial<SpecCommand>, options?: Partial<import(
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
*/
|
|
19
|
-
run(): AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>;
|
|
14
|
+
constructor(data?: Partial<SpecCommand>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
15
|
+
/** @type {string} Release version filter */
|
|
16
|
+
version: string;
|
|
20
17
|
}
|
|
18
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -1,11 +1,46 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* StatusCommand - ModelAsApp Subcommand to display PM-as-Code dashboard and project inspector.
|
|
3
|
+
*/
|
|
2
4
|
export default class StatusCommand extends ModelAsApp {
|
|
5
|
+
static alias: string;
|
|
3
6
|
static UI: {
|
|
4
7
|
title: string;
|
|
5
8
|
help: string;
|
|
9
|
+
header: string;
|
|
10
|
+
summaryHeader: string;
|
|
11
|
+
summaryRow1: string;
|
|
12
|
+
summaryRow2: string;
|
|
13
|
+
noProjects: string;
|
|
14
|
+
};
|
|
15
|
+
static registryFile: {
|
|
16
|
+
help: string;
|
|
17
|
+
default: string;
|
|
18
|
+
type: string;
|
|
19
|
+
alias: string;
|
|
20
|
+
};
|
|
21
|
+
static target: {
|
|
22
|
+
help: string;
|
|
23
|
+
default: string;
|
|
24
|
+
positional: boolean;
|
|
25
|
+
type: string;
|
|
26
|
+
};
|
|
27
|
+
static sort: {
|
|
28
|
+
help: string;
|
|
29
|
+
default: string;
|
|
30
|
+
type: string;
|
|
31
|
+
alias: string;
|
|
6
32
|
};
|
|
7
33
|
/**
|
|
8
|
-
* @
|
|
34
|
+
* @param {Partial<StatusCommand>} [data]
|
|
35
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
9
36
|
*/
|
|
10
|
-
|
|
37
|
+
constructor(data?: Partial<StatusCommand>, options?: import("@nan0web/types").ModelOptions);
|
|
38
|
+
/** @type {string} */ registryFile: string;
|
|
39
|
+
/** @type {string} */ target: string;
|
|
40
|
+
/** @type {string} */ sort: string;
|
|
41
|
+
/**
|
|
42
|
+
* @returns {AsyncGenerator<import('@nan0web/ui').Intent, any, any>}
|
|
43
|
+
*/
|
|
44
|
+
run(): AsyncGenerator<import("@nan0web/ui").Intent, any, any>;
|
|
11
45
|
}
|
|
46
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewCommand - ModelAsApp Subcommand to inspect and view release details across multimodal interfaces.
|
|
3
|
+
*/
|
|
4
|
+
export default class ViewCommand extends ModelAsApp {
|
|
5
|
+
static alias: string;
|
|
6
|
+
static UI: {
|
|
7
|
+
title: string;
|
|
8
|
+
help: string;
|
|
9
|
+
noReleases: string;
|
|
10
|
+
selectPrompt: string;
|
|
11
|
+
};
|
|
12
|
+
static version: {
|
|
13
|
+
help: string;
|
|
14
|
+
positional: boolean;
|
|
15
|
+
type: string;
|
|
16
|
+
default: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @param {Partial<ViewCommand>} [data]
|
|
20
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
21
|
+
*/
|
|
22
|
+
constructor(data?: Partial<ViewCommand>, options?: import("@nan0web/types").ModelOptions);
|
|
23
|
+
/** @type {string} */
|
|
24
|
+
version: string;
|
|
25
|
+
run(): AsyncGenerator<import("@nan0web/ui/src/core/Intent.js").ShowIntent, import("@nan0web/ui/src/core/Intent.js").ResultIntent, unknown>;
|
|
26
|
+
}
|
|
27
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebCommand - ModelAsApp Subcommand to generate and launch PM-as-Code Web Dashboard.
|
|
3
|
+
*/
|
|
4
|
+
export default class WebCommand extends ModelAsApp {
|
|
5
|
+
static alias: string;
|
|
6
|
+
static UI: {
|
|
7
|
+
title: string;
|
|
8
|
+
help: string;
|
|
9
|
+
loading: string;
|
|
10
|
+
generated: string;
|
|
11
|
+
serving: string;
|
|
12
|
+
};
|
|
13
|
+
static registryFile: {
|
|
14
|
+
help: string;
|
|
15
|
+
default: string;
|
|
16
|
+
type: string;
|
|
17
|
+
alias: string;
|
|
18
|
+
};
|
|
19
|
+
static out: {
|
|
20
|
+
help: string;
|
|
21
|
+
default: string;
|
|
22
|
+
type: string;
|
|
23
|
+
alias: string;
|
|
24
|
+
};
|
|
25
|
+
static port: {
|
|
26
|
+
help: string;
|
|
27
|
+
default: number;
|
|
28
|
+
type: string;
|
|
29
|
+
alias: string;
|
|
30
|
+
};
|
|
31
|
+
static open: {
|
|
32
|
+
help: string;
|
|
33
|
+
default: boolean;
|
|
34
|
+
type: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* @param {Partial<WebCommand>} [data]
|
|
38
|
+
* @param {import('@nan0web/types').ModelOptions} [options]
|
|
39
|
+
*/
|
|
40
|
+
constructor(data?: Partial<WebCommand>, options?: import("@nan0web/types").ModelOptions);
|
|
41
|
+
/** @type {string} */ registryFile: string;
|
|
42
|
+
/** @type {string} */ out: string;
|
|
43
|
+
/** @type {number} */ port: number;
|
|
44
|
+
/** @type {boolean} */ open: boolean;
|
|
45
|
+
run(): AsyncGenerator<import("@nan0web/ui/src/core/Intent.js").ProgressIntent | import("@nan0web/ui/src/core/Intent.js").ShowIntent, import("@nan0web/ui/src/core/Intent.js").ResultIntent, unknown>;
|
|
46
|
+
}
|
|
47
|
+
import { ModelAsApp } from '@nan0web/ui';
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {Object} ReleaseDiagnostic
|
|
3
|
+
* @property {'error' | 'warning' | 'info'} level
|
|
4
|
+
* @property {string} code
|
|
5
|
+
* @property {string} [check]
|
|
6
|
+
* @property {string} [file]
|
|
7
|
+
* @property {string} error
|
|
8
|
+
* @property {string} [suggestion]
|
|
9
|
+
* @property {string} [fix]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* ReleaseAuditor — Architecture auditor and validator for PM-as-Code release structures.
|
|
13
|
+
*/
|
|
14
|
+
export class ReleaseAuditor extends AuditorModel {
|
|
15
|
+
static changed: {
|
|
16
|
+
help: string;
|
|
17
|
+
default: boolean;
|
|
18
|
+
type: string;
|
|
19
|
+
alias: string;
|
|
20
|
+
};
|
|
21
|
+
static all: {
|
|
22
|
+
help: string;
|
|
23
|
+
default: boolean;
|
|
24
|
+
type: string;
|
|
25
|
+
alias: string;
|
|
26
|
+
};
|
|
27
|
+
static registryFile: {
|
|
28
|
+
help: string;
|
|
29
|
+
default: string;
|
|
30
|
+
type: string;
|
|
31
|
+
alias: string;
|
|
32
|
+
};
|
|
33
|
+
static UI: {
|
|
34
|
+
title: string;
|
|
35
|
+
header: string;
|
|
36
|
+
skipped: string;
|
|
37
|
+
missingPackageJson: string;
|
|
38
|
+
noReleasesDir: string;
|
|
39
|
+
releasesFound: string;
|
|
40
|
+
releaseHeader: string;
|
|
41
|
+
releaseDocCompleted: string;
|
|
42
|
+
missingReleaseDoc: string;
|
|
43
|
+
missingUserDoc: string;
|
|
44
|
+
incompleteUserMetrics: string;
|
|
45
|
+
userMetricsValid: string;
|
|
46
|
+
ambiguousContracts: string;
|
|
47
|
+
missingContract: string;
|
|
48
|
+
activeContractWip: string;
|
|
49
|
+
sealedRegressionClosed: string;
|
|
50
|
+
orphanFile: string;
|
|
51
|
+
summary: string;
|
|
52
|
+
Diagnostics: {
|
|
53
|
+
MISSING_PACKAGE_JSON: {
|
|
54
|
+
level: string;
|
|
55
|
+
code: string;
|
|
56
|
+
message: string;
|
|
57
|
+
fix: string;
|
|
58
|
+
};
|
|
59
|
+
MISSING_RELEASES_DIR: {
|
|
60
|
+
level: string;
|
|
61
|
+
code: string;
|
|
62
|
+
message: string;
|
|
63
|
+
fix: string;
|
|
64
|
+
};
|
|
65
|
+
MISSING_RELEASE_MD: {
|
|
66
|
+
level: string;
|
|
67
|
+
code: string;
|
|
68
|
+
message: string;
|
|
69
|
+
fix: string;
|
|
70
|
+
};
|
|
71
|
+
MISSING_USER_MD: {
|
|
72
|
+
level: string;
|
|
73
|
+
code: string;
|
|
74
|
+
message: string;
|
|
75
|
+
fix: string;
|
|
76
|
+
};
|
|
77
|
+
INCOMPLETE_USER_METRICS: {
|
|
78
|
+
level: string;
|
|
79
|
+
code: string;
|
|
80
|
+
message: string;
|
|
81
|
+
fix: string;
|
|
82
|
+
};
|
|
83
|
+
AMBIGUOUS_CONTRACTS: {
|
|
84
|
+
level: string;
|
|
85
|
+
code: string;
|
|
86
|
+
message: string;
|
|
87
|
+
fix: string;
|
|
88
|
+
};
|
|
89
|
+
MISSING_CONTRACT: {
|
|
90
|
+
level: string;
|
|
91
|
+
code: string;
|
|
92
|
+
message: string;
|
|
93
|
+
fix: string;
|
|
94
|
+
};
|
|
95
|
+
ORPHAN_RELEASE_FILE: {
|
|
96
|
+
level: string;
|
|
97
|
+
code: string;
|
|
98
|
+
message: string;
|
|
99
|
+
fix: string;
|
|
100
|
+
};
|
|
101
|
+
PROCEDURAL_RELEASE_ARTIFACT: {
|
|
102
|
+
level: string;
|
|
103
|
+
code: string;
|
|
104
|
+
message: string;
|
|
105
|
+
fix: string;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* @param {Partial<ReleaseAuditor> | Record<string, any>} [data={}]
|
|
111
|
+
* @param {Partial<import('@nan0web/ui').ModelAsAppOptions>} [options={}]
|
|
112
|
+
*/
|
|
113
|
+
constructor(data?: Partial<ReleaseAuditor> | Record<string, any>, options?: Partial<import("@nan0web/ui").ModelAsAppOptions>);
|
|
114
|
+
/** @type {boolean} */ changed: boolean;
|
|
115
|
+
/** @type {boolean} */ all: boolean;
|
|
116
|
+
/** @type {string} */ registryFile: string;
|
|
117
|
+
/**
|
|
118
|
+
* Runs the PM-as-Code release audit.
|
|
119
|
+
* @returns {AsyncGenerator<import('@nan0web/ui').Intent, any, any>}
|
|
120
|
+
*/
|
|
121
|
+
run(): AsyncGenerator<import("@nan0web/ui").Intent, any, any>;
|
|
122
|
+
#private;
|
|
123
|
+
}
|
|
124
|
+
export default ReleaseAuditor;
|
|
125
|
+
export type ReleaseDiagnostic = {
|
|
126
|
+
level: "error" | "warning" | "info";
|
|
127
|
+
code: string;
|
|
128
|
+
check?: string | undefined;
|
|
129
|
+
file?: string | undefined;
|
|
130
|
+
error: string;
|
|
131
|
+
suggestion?: string | undefined;
|
|
132
|
+
fix?: string | undefined;
|
|
133
|
+
};
|
|
134
|
+
import { AuditorModel } from '@nan0web/inspect/domain/AuditorModel';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: "<!DOCTYPE html>\n<html lang=\"uk\" data-bs-theme=\"dark\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Releases Catalog \u2014 NaN\u2022Web</title>\n <style>\n :root {\n --bg: #0f172a;\n --surface: #1e293b;\n --accent: #38bdf8;\n --text: #f8fafc;\n --text-dim: #94a3b8;\n --border: #334155;\n }\n body { font-family: system-ui, -apple-system, sans-serif; background: var(--bg); color: var(--text); margin: 0; padding: 2.5rem 1.5rem; display: flex; justify-content: center; line-height: 1.6; }\n .container { max-width: 880px; width: 100%; }\n h1, h2, h3 { color: #fff; font-weight: 700; margin-top: 1.5rem; }\n h1 { font-size: 2rem; border-bottom: 1px solid var(--border); padding-bottom: 0.8rem; }\n a { color: var(--accent); text-decoration: none; }\n a:hover { text-decoration: underline; }\n table { width: 100%; border-collapse: collapse; margin: 1.5rem 0; background: var(--surface); border-radius: 8px; overflow: hidden; }\n th, td { padding: 0.85rem 1rem; text-align: left; border-bottom: 1px solid var(--border); }\n th { background: rgba(0,0,0,0.2); font-weight: 600; color: var(--accent); }\n pre { background: var(--surface); padding: 1rem; border-radius: 8px; border: 1px solid var(--border); overflow-x: auto; color: #a5b4fc; font-family: monospace; }\n blockquote { border-left: 4px solid var(--accent); margin: 1rem 0; padding: 0.5rem 1rem; background: var(--surface); border-radius: 0 8px 8px 0; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n {{CONTENT}}\n </div>\n</body>\n</html>";
|
|
2
|
+
export default _default;
|