@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.
Files changed (73) hide show
  1. package/bin/nan0release.js +33 -2
  2. package/bin/serve.js +73 -0
  3. package/package.json +45 -17
  4. package/src/Release/Document.js +1 -0
  5. package/src/Release/Scanner.js +3 -2
  6. package/src/Release.js +7 -7
  7. package/src/domain/App.js +31 -2
  8. package/src/domain/BumpCommand.js +10 -3
  9. package/src/domain/CheckCommand.js +504 -146
  10. package/src/domain/CheckCommand.story.js +92 -0
  11. package/src/domain/CloseCommand.js +13 -9
  12. package/src/domain/Dashboard/Dashboard.story.js +155 -0
  13. package/src/domain/Dashboard/DashboardModel.js +308 -0
  14. package/src/domain/Dashboard/ReleaseDiscovery.js +132 -0
  15. package/src/domain/Dashboard/ReleaseParser.js +226 -0
  16. package/src/domain/Dashboard/index.js +19 -0
  17. package/src/domain/DepsCommand.js +5 -2
  18. package/src/domain/InitCommand.js +18 -16
  19. package/src/domain/ListCommand.js +45 -0
  20. package/src/domain/PreviewCommand.js +39 -0
  21. package/src/domain/PublishCommand.js +7 -3
  22. package/src/domain/Registry/Registry.story.js +82 -0
  23. package/src/domain/Registry/RegistryModel.js +124 -0
  24. package/src/domain/ServeCommand.js +165 -0
  25. package/src/domain/ServeCommand.story.js +88 -0
  26. package/src/domain/SpecCommand.js +3 -1
  27. package/src/domain/StatusCommand.js +249 -3
  28. package/src/domain/ViewCommand.js +99 -0
  29. package/src/domain/WebCommand.js +140 -0
  30. package/src/domain/inspect/ReleaseAuditor.js +508 -0
  31. package/src/domain/inspect/ReleaseAuditor.story.js +136 -0
  32. package/src/domain/templates/release.html +34 -0
  33. package/src/domain/templates/release.html.template.js +34 -0
  34. package/src/index.js +6 -0
  35. package/src/inspectors/inspect-js.js +32 -0
  36. package/src/releases/1/0/v1.0.3/task.test.js +1 -1
  37. package/src/utils/nodejs/GitTelemetry.js +154 -0
  38. package/types/Release/Document.d.ts +24 -27
  39. package/types/Release/MarkdownToTest.d.ts +1 -1
  40. package/types/Release/Person.d.ts +9 -7
  41. package/types/Release/Scanner.d.ts +41 -41
  42. package/types/Release.d.ts +42 -42
  43. package/types/architecture/ProjectManagementAsCode.d.ts +59 -64
  44. package/types/domain/App.d.ts +24 -7
  45. package/types/domain/BumpCommand.d.ts +11 -6
  46. package/types/domain/CheckCommand.d.ts +128 -16
  47. package/types/domain/CheckCommand.story.d.ts +1 -0
  48. package/types/domain/CloseCommand.d.ts +4 -6
  49. package/types/domain/Dashboard/Dashboard.story.d.ts +1 -0
  50. package/types/domain/Dashboard/DashboardModel.d.ts +273 -0
  51. package/types/domain/Dashboard/GitTelemetry.d.ts +23 -0
  52. package/types/domain/Dashboard/ReleaseDiscovery.d.ts +47 -0
  53. package/types/domain/Dashboard/ReleaseParser.d.ts +79 -0
  54. package/types/domain/Dashboard/index.d.ts +3 -0
  55. package/types/domain/DepsCommand.d.ts +6 -6
  56. package/types/domain/InitCommand.d.ts +4 -6
  57. package/types/domain/ListCommand.d.ts +18 -0
  58. package/types/domain/PreviewCommand.d.ts +6 -0
  59. package/types/domain/PublishCommand.d.ts +8 -6
  60. package/types/domain/Registry/Registry.story.d.ts +1 -0
  61. package/types/domain/Registry/RegistryModel.d.ts +61 -0
  62. package/types/domain/ServeCommand.d.ts +59 -0
  63. package/types/domain/ServeCommand.story.d.ts +1 -0
  64. package/types/domain/SpecCommand.d.ts +4 -6
  65. package/types/domain/StatusCommand.d.ts +38 -3
  66. package/types/domain/ViewCommand.d.ts +27 -0
  67. package/types/domain/WebCommand.d.ts +47 -0
  68. package/types/domain/inspect/ReleaseAuditor.d.ts +134 -0
  69. package/types/domain/inspect/ReleaseAuditor.story.d.ts +1 -0
  70. package/types/domain/templates/release.html.template.d.ts +2 -0
  71. package/types/index.d.ts +18 -10
  72. package/types/inspectors/inspect-js.d.ts +2 -0
  73. 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('@nan0web/ui').ModelAsAppOptions>);
20
- /**
21
- * @returns {AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>}
22
- */
23
- run(): AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>;
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('@nan0web/ui').ModelAsAppOptions>);
17
- /**
18
- * @returns {AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>}
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,6 @@
1
+ /**
2
+ * PreviewCommand - ModelAsApp Subcommand to generate, serve and preview PM-as-Code Web Dashboard.
3
+ */
4
+ export default class PreviewCommand extends WebCommand {
5
+ }
6
+ import WebCommand from './WebCommand.js';
@@ -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('@nan0web/ui').ModelAsAppOptions>);
24
- /**
25
- * @returns {AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>}
26
- */
27
- run(): AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>;
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('@nan0web/ui').ModelAsAppOptions>);
16
- /**
17
- * @returns {AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>}
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
- import { ModelAsApp } from '@nan0web/ui';
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
- * @returns {AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>}
34
+ * @param {Partial<StatusCommand>} [data]
35
+ * @param {import('@nan0web/types').ModelOptions} [options]
9
36
  */
10
- run(): AsyncGenerator<import('@nan0web/ui').Intent, import('@nan0web/ui').ResultIntent, any>;
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;