@evolith/infra-providers 1.0.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,15 @@
1
+ import { IConfigParser, IConfigParserProvider } from '@evolith/core-domain/domain/interfaces';
2
+ export declare class YamlConfigParserProvider implements IConfigParserProvider {
3
+ createConfigParser(_format: string): IConfigParser;
4
+ }
5
+ export declare class YamlConfigParserImpl implements IConfigParser {
6
+ parse(content: string): unknown;
7
+ stringify(data: unknown): string;
8
+ }
9
+ export declare class JsonConfigParserProvider implements IConfigParserProvider {
10
+ createConfigParser(_format: string): IConfigParser;
11
+ }
12
+ export declare class JsonConfigParserImpl implements IConfigParser {
13
+ parse(content: string): unknown;
14
+ stringify(data: unknown): string;
15
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.JsonConfigParserImpl = exports.JsonConfigParserProvider = exports.YamlConfigParserImpl = exports.YamlConfigParserProvider = void 0;
37
+ const yaml = __importStar(require("yaml"));
38
+ class YamlConfigParserProvider {
39
+ createConfigParser(_format) {
40
+ return new YamlConfigParserImpl();
41
+ }
42
+ }
43
+ exports.YamlConfigParserProvider = YamlConfigParserProvider;
44
+ class YamlConfigParserImpl {
45
+ parse(content) {
46
+ return yaml.parse(content);
47
+ }
48
+ stringify(data) {
49
+ return yaml.stringify(data);
50
+ }
51
+ }
52
+ exports.YamlConfigParserImpl = YamlConfigParserImpl;
53
+ class JsonConfigParserProvider {
54
+ createConfigParser(_format) {
55
+ return new JsonConfigParserImpl();
56
+ }
57
+ }
58
+ exports.JsonConfigParserProvider = JsonConfigParserProvider;
59
+ class JsonConfigParserImpl {
60
+ parse(content) {
61
+ return JSON.parse(content);
62
+ }
63
+ stringify(data) {
64
+ return JSON.stringify(data, null, 2);
65
+ }
66
+ }
67
+ exports.JsonConfigParserImpl = JsonConfigParserImpl;
68
+ //# sourceMappingURL=config-parser.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-parser.provider.js","sourceRoot":"","sources":["../src/config-parser.provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAG7B,MAAa,wBAAwB;IACnC,kBAAkB,CAAC,OAAe;QAChC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AAJD,4DAIC;AAED,MAAa,oBAAoB;IAC/B,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AARD,oDAQC;AAED,MAAa,wBAAwB;IACnC,kBAAkB,CAAC,OAAe;QAChC,OAAO,IAAI,oBAAoB,EAAE,CAAC;IACpC,CAAC;CACF;AAJD,4DAIC;AAED,MAAa,oBAAoB;IAC/B,KAAK,CAAC,OAAe;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;CACF;AARD,oDAQC"}
@@ -0,0 +1,16 @@
1
+ import { IFileSystem, ILogger } from "@evolith/core-domain/domain/interfaces";
2
+ import { NormalizedRule } from "@evolith/core-domain/domain/models/normalized-rule";
3
+ import { IRulesetRepository } from "@evolith/core-domain/domain/ports/ruleset-repository.port";
4
+ export declare class DiskRulesetRepository implements IRulesetRepository {
5
+ private readonly fs;
6
+ private readonly logger;
7
+ private readonly ajv;
8
+ private validateSchema?;
9
+ constructor(fs: IFileSystem, logger: ILogger);
10
+ loadAllRulesets(corePath: string): Promise<NormalizedRule[]>;
11
+ private findRulesetFiles;
12
+ private normalizeRuleset;
13
+ private normalizeSeverity;
14
+ private defaultBlocking;
15
+ private deriveCategory;
16
+ }
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.DiskRulesetRepository = void 0;
40
+ const path = __importStar(require("path"));
41
+ const ajv_1 = __importDefault(require("ajv"));
42
+ const ajv_formats_1 = __importDefault(require("ajv-formats"));
43
+ class DiskRulesetRepository {
44
+ constructor(fs, logger) {
45
+ this.fs = fs;
46
+ this.logger = logger;
47
+ this.ajv = new ajv_1.default({ allErrors: true });
48
+ (0, ajv_formats_1.default)(this.ajv);
49
+ }
50
+ async loadAllRulesets(corePath) {
51
+ const rulesetsDir = path.join(corePath, "rulesets");
52
+ if (!(await this.fs.exists(rulesetsDir)))
53
+ return [];
54
+ const files = await this.findRulesetFiles(rulesetsDir);
55
+ const rules = [];
56
+ for (const filePath of files) {
57
+ try {
58
+ const content = await this.fs.readFile(filePath);
59
+ const parsed = JSON.parse(content);
60
+ if (!filePath.endsWith("phase-gates.rules.json")) {
61
+ if (!this.validateSchema) {
62
+ const schemaPath = path.join(rulesetsDir, "schema", "ruleset-standard.schema.json");
63
+ const schemaContent = await this.fs.readFile(schemaPath);
64
+ this.validateSchema = this.ajv.compile(JSON.parse(schemaContent));
65
+ }
66
+ const valid = this.validateSchema(parsed);
67
+ if (!valid) {
68
+ throw new Error(`Schema validation failed: ${this.ajv.errorsText(this.validateSchema.errors)}`);
69
+ }
70
+ }
71
+ const relative = filePath.replace(corePath + path.sep, "");
72
+ rules.push(...this.normalizeRuleset(parsed, relative));
73
+ }
74
+ catch (err) {
75
+ const message = err instanceof Error ? err.message : String(err);
76
+ this.logger.error(`Malformed ruleset detected at ${filePath}: ${message}`);
77
+ throw new Error(`Ruleset validation error in ${filePath}: ${message}`);
78
+ }
79
+ }
80
+ return rules;
81
+ }
82
+ async findRulesetFiles(dir, depth = 0) {
83
+ if (depth > 4)
84
+ return [];
85
+ const files = [];
86
+ const entries = await this.fs.readdirNames(dir);
87
+ for (const entry of entries) {
88
+ const full = path.join(dir, entry);
89
+ if (entry.endsWith(".rules.json")) {
90
+ files.push(full);
91
+ continue;
92
+ }
93
+ if (!entry.includes(".")) {
94
+ const stat = await this.fs.stat(full);
95
+ if (stat?.isDirectory?.()) {
96
+ files.push(...(await this.findRulesetFiles(full, depth + 1)));
97
+ }
98
+ }
99
+ }
100
+ return files;
101
+ }
102
+ normalizeRuleset(parsed, sourceFile) {
103
+ const rawList = (parsed["rules"] ?? parsed["principles"]);
104
+ if (!Array.isArray(rawList))
105
+ return [];
106
+ if (rawList.length > 0 && !rawList[0]["id"] && rawList[0]["rules"])
107
+ return [];
108
+ return rawList
109
+ .filter((r) => Boolean(r["id"]))
110
+ .map((r) => ({
111
+ id: String(r["id"]),
112
+ severity: this.normalizeSeverity(r),
113
+ category: this.deriveCategory(r),
114
+ title: String(r["title"] ?? r["principle"] ?? r["id"]),
115
+ description: String(r["description"] ?? r["statement"] ?? ""),
116
+ blocking: Boolean(r["blocking"] ?? this.defaultBlocking(r)),
117
+ validationQuery: r["validationQuery"]
118
+ ? String(r["validationQuery"])
119
+ : undefined,
120
+ sourceFile,
121
+ }));
122
+ }
123
+ normalizeSeverity(r) {
124
+ const raw = String(r["severity"] ?? "")
125
+ .toUpperCase()
126
+ .trim();
127
+ if (raw === "MUST NOT")
128
+ return "MUST NOT";
129
+ if (raw === "MUST")
130
+ return "MUST";
131
+ if (raw === "SHOULD")
132
+ return "SHOULD";
133
+ if (raw === "COULD" || raw === "MAY")
134
+ return "COULD";
135
+ return r["blocking"] === true || r["enforcement"] ? "MUST" : "SHOULD";
136
+ }
137
+ defaultBlocking(r) {
138
+ const sev = String(r["severity"] ?? "").toUpperCase();
139
+ return sev === "MUST" || sev === "MUST NOT";
140
+ }
141
+ deriveCategory(r) {
142
+ if (r["category"])
143
+ return String(r["category"]);
144
+ const prefix = String(r["id"] ?? "")
145
+ .replace(/-(?:EVD|RR|PAR)-?\d*$/, "")
146
+ .replace(/-\d+$/, "")
147
+ .toLowerCase();
148
+ const map = {
149
+ inh: "inheritance",
150
+ acl: "anti-corruption",
151
+ ocb: "open-core",
152
+ gov: "governance",
153
+ evd: "identity",
154
+ "obs-evd": "tracing",
155
+ dep: "version-pinning",
156
+ tax: "naming-conventions",
157
+ hxa: "layer-structure",
158
+ git: "branch-naming",
159
+ cicd: "ci-cd",
160
+ tpy: "testing-pyramid",
161
+ mtn: "multi-tenancy",
162
+ prot: "protocol",
163
+ runt: "multi-runtime",
164
+ dora: "metrics",
165
+ space: "metrics",
166
+ drift: "governance",
167
+ "cli-rr": "build",
168
+ "cli-par": "shared-logic",
169
+ mcp: "protocol",
170
+ f1: "topology",
171
+ f2: "module-autonomy",
172
+ f3: "autonomous-deployment",
173
+ };
174
+ return map[prefix] ?? "general";
175
+ }
176
+ }
177
+ exports.DiskRulesetRepository = DiskRulesetRepository;
178
+ //# sourceMappingURL=disk-ruleset.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-ruleset.repository.js","sourceRoot":"","sources":["../src/disk-ruleset.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { NodeFileSystemProvider } from './node-filesystem.provider';
2
+ export { NestLoggerProvider, ConsoleLoggerProvider, NoOpLoggerProvider } from './logger.provider';
3
+ export { YamlConfigParserProvider, JsonConfigParserProvider } from './config-parser.provider';
4
+ export { DiskRulesetRepository } from './disk-ruleset.repository';
5
+ export { WebhookAdapter } from './webhook.adapter';
6
+ export { MoscowPrioritizationService, MoscowItem, MoscowAnalysis, MoscowPriority, } from './moscow-prioritization.service';
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MoscowPrioritizationService = exports.WebhookAdapter = exports.DiskRulesetRepository = exports.JsonConfigParserProvider = exports.YamlConfigParserProvider = exports.NoOpLoggerProvider = exports.ConsoleLoggerProvider = exports.NestLoggerProvider = exports.NodeFileSystemProvider = void 0;
4
+ var node_filesystem_provider_1 = require("./node-filesystem.provider");
5
+ Object.defineProperty(exports, "NodeFileSystemProvider", { enumerable: true, get: function () { return node_filesystem_provider_1.NodeFileSystemProvider; } });
6
+ var logger_provider_1 = require("./logger.provider");
7
+ Object.defineProperty(exports, "NestLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.NestLoggerProvider; } });
8
+ Object.defineProperty(exports, "ConsoleLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.ConsoleLoggerProvider; } });
9
+ Object.defineProperty(exports, "NoOpLoggerProvider", { enumerable: true, get: function () { return logger_provider_1.NoOpLoggerProvider; } });
10
+ var config_parser_provider_1 = require("./config-parser.provider");
11
+ Object.defineProperty(exports, "YamlConfigParserProvider", { enumerable: true, get: function () { return config_parser_provider_1.YamlConfigParserProvider; } });
12
+ Object.defineProperty(exports, "JsonConfigParserProvider", { enumerable: true, get: function () { return config_parser_provider_1.JsonConfigParserProvider; } });
13
+ var disk_ruleset_repository_1 = require("./disk-ruleset.repository");
14
+ Object.defineProperty(exports, "DiskRulesetRepository", { enumerable: true, get: function () { return disk_ruleset_repository_1.DiskRulesetRepository; } });
15
+ var webhook_adapter_1 = require("./webhook.adapter");
16
+ Object.defineProperty(exports, "WebhookAdapter", { enumerable: true, get: function () { return webhook_adapter_1.WebhookAdapter; } });
17
+ var moscow_prioritization_service_1 = require("./moscow-prioritization.service");
18
+ Object.defineProperty(exports, "MoscowPrioritizationService", { enumerable: true, get: function () { return moscow_prioritization_service_1.MoscowPrioritizationService; } });
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAC/B,qDAAkG;AAAzF,qHAAA,kBAAkB,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AACtE,mEAA8F;AAArF,kIAAA,wBAAwB,OAAA;AAAE,kIAAA,wBAAwB,OAAA;AAC3D,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,iFAKyC;AAJvC,4IAAA,2BAA2B,OAAA"}
@@ -0,0 +1,10 @@
1
+ import { ILogger, ILoggerProvider } from '@evolith/core-domain/domain/interfaces';
2
+ export declare class NestLoggerProvider implements ILoggerProvider {
3
+ createLogger(context: string): ILogger;
4
+ }
5
+ export declare class NoOpLoggerProvider implements ILoggerProvider {
6
+ createLogger(_context: string): ILogger;
7
+ }
8
+ export declare class ConsoleLoggerProvider implements ILoggerProvider {
9
+ createLogger(context: string): ILogger;
10
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsoleLoggerProvider = exports.NoOpLoggerProvider = exports.NestLoggerProvider = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class NestLoggerProvider {
6
+ createLogger(context) {
7
+ return new NestLogger(context);
8
+ }
9
+ }
10
+ exports.NestLoggerProvider = NestLoggerProvider;
11
+ class NestLogger {
12
+ constructor(context) {
13
+ this.logger = new common_1.Logger(context);
14
+ }
15
+ debug(message, context) {
16
+ this.logger.debug(message, context);
17
+ }
18
+ info(message, context) {
19
+ this.logger.log(message, context);
20
+ }
21
+ warn(message, context) {
22
+ this.logger.warn(message, context);
23
+ }
24
+ error(message, context) {
25
+ this.logger.error(message, context);
26
+ }
27
+ }
28
+ class NoOpLoggerProvider {
29
+ createLogger(_context) {
30
+ return new NoOpLogger();
31
+ }
32
+ }
33
+ exports.NoOpLoggerProvider = NoOpLoggerProvider;
34
+ class NoOpLogger {
35
+ constructor() {
36
+ this.logs = [];
37
+ }
38
+ debug(message, _context) {
39
+ this.logs.push({ level: 'debug', message, timestamp: new Date().toISOString() });
40
+ }
41
+ info(message, _context) {
42
+ this.logs.push({ level: 'info', message, timestamp: new Date().toISOString() });
43
+ }
44
+ warn(message, _context) {
45
+ this.logs.push({ level: 'warn', message, timestamp: new Date().toISOString() });
46
+ }
47
+ error(message, _context) {
48
+ this.logs.push({ level: 'error', message, timestamp: new Date().toISOString() });
49
+ }
50
+ getLogs() {
51
+ return [...this.logs];
52
+ }
53
+ clear() {
54
+ this.logs = [];
55
+ }
56
+ }
57
+ class ConsoleLoggerProvider {
58
+ createLogger(context) {
59
+ return new ConsoleLogger(context);
60
+ }
61
+ }
62
+ exports.ConsoleLoggerProvider = ConsoleLoggerProvider;
63
+ class ConsoleLogger {
64
+ constructor(context) {
65
+ this.context = context;
66
+ }
67
+ format(level, message) {
68
+ const timestamp = new Date().toISOString();
69
+ return `[${timestamp}] [${level.toUpperCase()}] [${this.context}] ${message}`;
70
+ }
71
+ debug(message, _context) {
72
+ console.debug(this.format('debug', message));
73
+ }
74
+ info(message, _context) {
75
+ console.info(this.format('info', message));
76
+ }
77
+ warn(message, _context) {
78
+ console.warn(this.format('warn', message));
79
+ }
80
+ error(message, _context) {
81
+ console.error(this.format('error', message));
82
+ }
83
+ }
84
+ //# sourceMappingURL=logger.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.provider.js","sourceRoot":"","sources":["../src/logger.provider.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAGxC,MAAa,kBAAkB;IAC7B,YAAY,CAAC,OAAe;QAC1B,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;CACF;AAJD,gDAIC;AAED,MAAM,UAAU;IAGd,YAAY,OAAe;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAiB;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAiB;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAiB;QACrC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAiB;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAa,kBAAkB;IAC7B,YAAY,CAAC,QAAgB;QAC3B,OAAO,IAAI,UAAU,EAAE,CAAC;IAC1B,CAAC;CACF;AAJD,gDAIC;AAED,MAAM,UAAU;IAAhB;QACU,SAAI,GAAe,EAAE,CAAC;IAyBhC,CAAC;IAvBC,KAAK,CAAC,OAAe,EAAE,QAAkB;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,QAAkB;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,QAAkB;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,QAAkB;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;CACF;AAED,MAAa,qBAAqB;IAChC,YAAY,CAAC,OAAe;QAC1B,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;CACF;AAJD,sDAIC;AAED,MAAM,aAAa;IAGjB,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,IAAI,SAAS,MAAM,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,QAAkB;QACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,QAAkB;QACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,QAAkB;QACtC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,QAAkB;QACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import { IFileSystem, ILogger } from '@evolith/core-domain/domain/interfaces';
2
+ export type MoscowPriority = 'MUST' | 'SHOULD' | 'COULD' | 'WONT';
3
+ export interface MoscowItem {
4
+ id: string;
5
+ description: string;
6
+ priority: MoscowPriority;
7
+ category: string;
8
+ rationale: string;
9
+ phase: string;
10
+ }
11
+ export interface MoscowAnalysis {
12
+ repository: string;
13
+ phase: string;
14
+ items: MoscowItem[];
15
+ summary: {
16
+ must: number;
17
+ should: number;
18
+ could: number;
19
+ wont: number;
20
+ total: number;
21
+ };
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ }
25
+ export declare class MoscowPrioritizationService {
26
+ private readonly fs;
27
+ constructor(options?: {
28
+ fileSystem?: IFileSystem;
29
+ logger?: ILogger;
30
+ });
31
+ createAnalysis(repoPath: string, phase: string, items: Omit<MoscowItem, 'id'>[]): Promise<MoscowAnalysis>;
32
+ loadAnalysis(repoPath: string, phase: string): Promise<MoscowAnalysis | null>;
33
+ updateItem(repoPath: string, phase: string, itemId: string, updates: Partial<MoscowItem>): Promise<MoscowAnalysis | null>;
34
+ removeItem(repoPath: string, phase: string, itemId: string): Promise<MoscowAnalysis | null>;
35
+ listAnalyses(repoPath: string): Promise<Array<{
36
+ phase: string;
37
+ path: string;
38
+ updatedAt: string;
39
+ }>>;
40
+ validateAnalysis(analysis: MoscowAnalysis): {
41
+ valid: boolean;
42
+ issues: string[];
43
+ };
44
+ generateReport(analysis: MoscowAnalysis): string;
45
+ private percentage;
46
+ private getAnalysisPath;
47
+ private saveAnalysis;
48
+ }
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MoscowPrioritizationService = void 0;
37
+ const path = __importStar(require("path"));
38
+ const node_filesystem_provider_1 = require("./node-filesystem.provider");
39
+ class MoscowPrioritizationService {
40
+ constructor(options) {
41
+ this.fs = options?.fileSystem ?? new node_filesystem_provider_1.NodeFileSystemProvider().createFileSystem();
42
+ }
43
+ async createAnalysis(repoPath, phase, items) {
44
+ const analysis = {
45
+ repository: repoPath,
46
+ phase,
47
+ items: items.map((item, index) => ({
48
+ ...item,
49
+ id: `${phase.toUpperCase()}-${String(index + 1).padStart(3, '0')}`,
50
+ })),
51
+ summary: {
52
+ must: 0,
53
+ should: 0,
54
+ could: 0,
55
+ wont: 0,
56
+ total: items.length,
57
+ },
58
+ createdAt: new Date().toISOString(),
59
+ updatedAt: new Date().toISOString(),
60
+ };
61
+ analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
62
+ analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
63
+ analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
64
+ analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
65
+ await this.saveAnalysis(repoPath, phase, analysis);
66
+ return analysis;
67
+ }
68
+ async loadAnalysis(repoPath, phase) {
69
+ const analysisPath = this.getAnalysisPath(repoPath, phase);
70
+ if (await this.fs.exists(analysisPath)) {
71
+ const content = await this.fs.readFile(analysisPath);
72
+ return JSON.parse(content);
73
+ }
74
+ return null;
75
+ }
76
+ async updateItem(repoPath, phase, itemId, updates) {
77
+ const analysis = await this.loadAnalysis(repoPath, phase);
78
+ if (!analysis)
79
+ return null;
80
+ const itemIndex = analysis.items.findIndex(i => i.id === itemId);
81
+ if (itemIndex === -1)
82
+ return null;
83
+ analysis.items[itemIndex] = { ...analysis.items[itemIndex], ...updates };
84
+ analysis.updatedAt = new Date().toISOString();
85
+ analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
86
+ analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
87
+ analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
88
+ analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
89
+ await this.saveAnalysis(repoPath, phase, analysis);
90
+ return analysis;
91
+ }
92
+ async removeItem(repoPath, phase, itemId) {
93
+ const analysis = await this.loadAnalysis(repoPath, phase);
94
+ if (!analysis)
95
+ return null;
96
+ analysis.items = analysis.items.filter(i => i.id !== itemId);
97
+ analysis.summary.total = analysis.items.length;
98
+ analysis.updatedAt = new Date().toISOString();
99
+ analysis.summary.must = analysis.items.filter(i => i.priority === 'MUST').length;
100
+ analysis.summary.should = analysis.items.filter(i => i.priority === 'SHOULD').length;
101
+ analysis.summary.could = analysis.items.filter(i => i.priority === 'COULD').length;
102
+ analysis.summary.wont = analysis.items.filter(i => i.priority === 'WONT').length;
103
+ await this.saveAnalysis(repoPath, phase, analysis);
104
+ return analysis;
105
+ }
106
+ async listAnalyses(repoPath) {
107
+ const moscoDir = path.join(repoPath, '.evolith', 'moscow');
108
+ const analyses = [];
109
+ if (await this.fs.exists(moscoDir)) {
110
+ const entries = await this.fs.readdirNames(moscoDir);
111
+ for (const entry of entries) {
112
+ if (entry.endsWith('.json')) {
113
+ const phase = entry.replace('.json', '');
114
+ const analysisPath = path.join(moscoDir, entry);
115
+ const _stat = await this.fs.stat(analysisPath);
116
+ analyses.push({
117
+ phase,
118
+ path: analysisPath,
119
+ updatedAt: new Date().toISOString(),
120
+ });
121
+ }
122
+ }
123
+ }
124
+ return analyses;
125
+ }
126
+ validateAnalysis(analysis) {
127
+ const issues = [];
128
+ if (analysis.items.length === 0) {
129
+ issues.push('No items in analysis');
130
+ }
131
+ const mustItems = analysis.items.filter(i => i.priority === 'MUST');
132
+ if (mustItems.length === 0) {
133
+ issues.push('No MUST items defined - at least one is required');
134
+ }
135
+ if (mustItems.length > analysis.items.length * 0.6) {
136
+ issues.push('Too many MUST items (>60%) - MoSCoW loses effectiveness');
137
+ }
138
+ const invalidPriorities = analysis.items.filter(i => !['MUST', 'SHOULD', 'COULD', 'WONT'].includes(i.priority));
139
+ if (invalidPriorities.length > 0) {
140
+ issues.push(`Invalid priorities found: ${invalidPriorities.map(i => i.priority).join(', ')}`);
141
+ }
142
+ const duplicateIds = analysis.items.filter((item, index) => analysis.items.findIndex(i => i.id === item.id) !== index);
143
+ if (duplicateIds.length > 0) {
144
+ issues.push(`Duplicate IDs found: ${duplicateIds.map(i => i.id).join(', ')}`);
145
+ }
146
+ return {
147
+ valid: issues.length === 0,
148
+ issues,
149
+ };
150
+ }
151
+ generateReport(analysis) {
152
+ const lines = [
153
+ `# MoSCoW Prioritization Report`,
154
+ ``,
155
+ `**Repository:** ${analysis.repository}`,
156
+ `**Phase:** ${analysis.phase}`,
157
+ `**Created:** ${analysis.createdAt}`,
158
+ `**Updated:** ${analysis.updatedAt}`,
159
+ ``,
160
+ `## Summary`,
161
+ ``,
162
+ `| Priority | Count | Percentage |`,
163
+ `|----------|-------|------------|`,
164
+ `| MUST | ${analysis.summary.must} | ${this.percentage(analysis.summary.must, analysis.summary.total)} |`,
165
+ `| SHOULD | ${analysis.summary.should} | ${this.percentage(analysis.summary.should, analysis.summary.total)} |`,
166
+ `| COULD | ${analysis.summary.could} | ${this.percentage(analysis.summary.could, analysis.summary.total)} |`,
167
+ `| WONT | ${analysis.summary.wont} | ${this.percentage(analysis.summary.wont, analysis.summary.total)} |`,
168
+ `| **Total** | **${analysis.summary.total}** | **100%** |`,
169
+ ``,
170
+ `## Items by Priority`,
171
+ ``,
172
+ ];
173
+ for (const priority of ['MUST', 'SHOULD', 'COULD', 'WONT']) {
174
+ const items = analysis.items.filter(i => i.priority === priority);
175
+ if (items.length > 0) {
176
+ lines.push(`### ${priority}`);
177
+ lines.push(``);
178
+ for (const item of items) {
179
+ lines.push(`- **${item.id}**: ${item.description}`);
180
+ lines.push(` - Category: ${item.category}`);
181
+ lines.push(` - Rationale: ${item.rationale}`);
182
+ lines.push(``);
183
+ }
184
+ }
185
+ }
186
+ const validation = this.validateAnalysis(analysis);
187
+ if (!validation.valid) {
188
+ lines.push(`## Validation Issues`);
189
+ lines.push(``);
190
+ for (const issue of validation.issues) {
191
+ lines.push(`- ⚠️ ${issue}`);
192
+ }
193
+ lines.push(``);
194
+ }
195
+ return lines.join('\n');
196
+ }
197
+ percentage(count, total) {
198
+ if (total === 0)
199
+ return '0%';
200
+ return `${Math.round((count / total) * 100)}%`;
201
+ }
202
+ getAnalysisPath(repoPath, phase) {
203
+ return path.join(repoPath, '.evolith', 'moscow', `${phase}.json`);
204
+ }
205
+ async saveAnalysis(repoPath, phase, analysis) {
206
+ const analysisPath = this.getAnalysisPath(repoPath, phase);
207
+ await this.fs.ensureDir(path.dirname(analysisPath));
208
+ await this.fs.writeJson(analysisPath, analysis);
209
+ }
210
+ }
211
+ exports.MoscowPrioritizationService = MoscowPrioritizationService;
212
+ //# sourceMappingURL=moscow-prioritization.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moscow-prioritization.service.js","sourceRoot":"","sources":["../src/moscow-prioritization.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAE7B,yEAAoE;AA4BpE,MAAa,2BAA2B;IAGtC,YAAY,OAAwD;QAClE,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,iDAAsB,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB,EAAE,KAAa,EAAE,KAA+B;QACnF,MAAM,QAAQ,GAAmB;YAC/B,UAAU,EAAE,QAAQ;YACpB,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACjC,GAAG,IAAI;gBACP,EAAE,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aACnE,CAAC,CAAC;YACH,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjF,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACnF,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEjF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,KAAa;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE3D,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAa,EAAE,MAAc,EAAE,OAA4B;QAC5F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACjE,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QACzE,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9C,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjF,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACnF,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEjF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAa,EAAE,MAAc;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAC7D,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAC/C,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9C,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QACjF,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QACrF,QAAQ,CAAC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACnF,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAEjF,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEnD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAA8D,EAAE,CAAC;QAE/E,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC/C,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK;wBACL,IAAI,EAAE,YAAY;wBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gBAAgB,CAAC,QAAwB;QACvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QACpE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,iBAAiB,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChH,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,6BAA6B,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACzD,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,CAC1D,CAAC;QACF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,wBAAwB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,QAAwB;QACrC,MAAM,KAAK,GAAG;YACZ,gCAAgC;YAChC,EAAE;YACF,mBAAmB,QAAQ,CAAC,UAAU,EAAE;YACxC,cAAc,QAAQ,CAAC,KAAK,EAAE;YAC9B,gBAAgB,QAAQ,CAAC,SAAS,EAAE;YACpC,gBAAgB,QAAQ,CAAC,SAAS,EAAE;YACpC,EAAE;YACF,YAAY;YACZ,EAAE;YACF,mCAAmC;YACnC,mCAAmC;YACnC,YAAY,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;YACzG,cAAc,QAAQ,CAAC,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;YAC/G,aAAa,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;YAC5G,YAAY,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI;YACzG,mBAAmB,QAAQ,CAAC,OAAO,CAAC,KAAK,iBAAiB;YAC1D,EAAE;YACF,sBAAsB;YACtB,EAAE;SACH,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAqB,EAAE,CAAC;YAC/E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;YAClE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC7C,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,KAAa;QAC7C,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;IACjD,CAAC;IAEO,eAAe,CAAC,QAAgB,EAAE,KAAa;QACrD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAE,QAAwB;QAClF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF;AA9MD,kEA8MC"}
@@ -0,0 +1,23 @@
1
+ import { IFileSystem, IFileSystemProvider, FileExistsOptions, FileReadOptions, FileWriteOptions, DirEntry } from '@evolith/core-domain/domain/interfaces';
2
+ export declare class NodeFileSystemProvider implements IFileSystemProvider, IFileSystem {
3
+ createFileSystem(): IFileSystem;
4
+ private resolvePath;
5
+ exists(filePath: string, options?: FileExistsOptions): Promise<boolean>;
6
+ existsSync(filePath: string): boolean;
7
+ readFile(filePath: string, options?: FileReadOptions): Promise<string>;
8
+ readFileBuffer(filePath: string): Promise<Buffer>;
9
+ readJson<T = unknown>(filePath: string, options?: FileReadOptions): Promise<T>;
10
+ writeFile(filePath: string, content: string, options?: FileWriteOptions): Promise<void>;
11
+ writeJson(filePath: string, data: unknown, options?: FileWriteOptions): Promise<void>;
12
+ readdir(filePath: string): Promise<DirEntry[]>;
13
+ readdirNames(filePath: string): Promise<string[]>;
14
+ remove(filePath: string): Promise<void>;
15
+ ensureDir(filePath: string): Promise<void>;
16
+ stat(filePath: string): Promise<{
17
+ isDirectory: () => boolean;
18
+ isFile: () => boolean;
19
+ }>;
20
+ mkdir(path: string): Promise<void>;
21
+ copy(src: string, dest: string): Promise<void>;
22
+ ensureFile(filePath: string): Promise<void>;
23
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.NodeFileSystemProvider = void 0;
37
+ const fs = __importStar(require("fs-extra"));
38
+ const path = __importStar(require("path"));
39
+ class NodeFileSystemProvider {
40
+ createFileSystem() {
41
+ return this;
42
+ }
43
+ resolvePath(filePath, cwd) {
44
+ if (path.isAbsolute(filePath)) {
45
+ return filePath;
46
+ }
47
+ return cwd ? path.join(cwd, filePath) : path.resolve(filePath);
48
+ }
49
+ async exists(filePath, options) {
50
+ const resolved = this.resolvePath(filePath, options?.cwd);
51
+ return fs.pathExists(resolved);
52
+ }
53
+ existsSync(filePath) {
54
+ const resolved = this.resolvePath(filePath);
55
+ return fs.existsSync(resolved);
56
+ }
57
+ async readFile(filePath, options) {
58
+ const resolved = this.resolvePath(filePath, options?.cwd);
59
+ return fs.readFile(resolved, options?.encoding || 'utf-8');
60
+ }
61
+ async readFileBuffer(filePath) {
62
+ const resolved = this.resolvePath(filePath);
63
+ return fs.readFile(resolved);
64
+ }
65
+ async readJson(filePath, options) {
66
+ const content = await this.readFile(filePath, options);
67
+ return JSON.parse(content);
68
+ }
69
+ async writeFile(filePath, content, options) {
70
+ const resolved = this.resolvePath(filePath, options?.cwd);
71
+ await fs.writeFile(resolved, content, options?.encoding || 'utf-8');
72
+ }
73
+ async writeJson(filePath, data, options) {
74
+ const resolved = this.resolvePath(filePath, options?.cwd);
75
+ await fs.writeJson(resolved, data, { spaces: 2, ...options });
76
+ }
77
+ async readdir(filePath) {
78
+ const resolved = this.resolvePath(filePath);
79
+ const entries = await fs.readdir(resolved, { withFileTypes: true });
80
+ return entries.map(entry => ({
81
+ name: entry.name,
82
+ isDirectory: () => entry.isDirectory(),
83
+ isFile: () => entry.isFile(),
84
+ }));
85
+ }
86
+ async readdirNames(filePath) {
87
+ const resolved = this.resolvePath(filePath);
88
+ return fs.readdir(resolved);
89
+ }
90
+ async remove(filePath) {
91
+ const resolved = this.resolvePath(filePath);
92
+ await fs.remove(resolved);
93
+ }
94
+ async ensureDir(filePath) {
95
+ const resolved = this.resolvePath(filePath);
96
+ await fs.ensureDir(resolved);
97
+ }
98
+ async stat(filePath) {
99
+ const resolved = this.resolvePath(filePath);
100
+ const stat = await fs.stat(resolved);
101
+ return {
102
+ isDirectory: () => stat.isDirectory(),
103
+ isFile: () => stat.isFile(),
104
+ };
105
+ }
106
+ async mkdir(path) {
107
+ await fs.promises.mkdir(path, { recursive: true });
108
+ }
109
+ async copy(src, dest) {
110
+ await fs.promises.copyFile(src, dest);
111
+ }
112
+ async ensureFile(filePath) {
113
+ await fs.ensureFile(filePath);
114
+ }
115
+ }
116
+ exports.NodeFileSystemProvider = NodeFileSystemProvider;
117
+ //# sourceMappingURL=node-filesystem.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-filesystem.provider.js","sourceRoot":"","sources":["../src/node-filesystem.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IWebhookNotifier } from '@evolith/core-domain/application/ports/webhook-notifier.port';
2
+ import { GateEvidence } from '@evolith/core-domain/domain/gate-evidence';
3
+ export declare class WebhookAdapter implements IWebhookNotifier {
4
+ notify(url: string, evidence: GateEvidence): Promise<void>;
5
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookAdapter = void 0;
4
+ const request_context_1 = require("@evolith/core-domain/common/request-context");
5
+ class WebhookAdapter {
6
+ async notify(url, evidence) {
7
+ const context = request_context_1.requestContextStorage.getStore();
8
+ const headers = {
9
+ 'Content-Type': 'application/json',
10
+ };
11
+ if (context) {
12
+ if (context.correlationId)
13
+ headers['x-correlation-id'] = context.correlationId;
14
+ if (context.initiative)
15
+ headers['x-evolith-initiative'] = context.initiative;
16
+ if (context.tenant)
17
+ headers['x-evolith-tenant'] = context.tenant;
18
+ if (context.phase)
19
+ headers['x-evolith-phase'] = context.phase;
20
+ }
21
+ const response = await fetch(url, {
22
+ method: 'POST',
23
+ headers,
24
+ body: JSON.stringify(evidence),
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Webhook delivery failed with status: ${response.status}`);
28
+ }
29
+ }
30
+ }
31
+ exports.WebhookAdapter = WebhookAdapter;
32
+ //# sourceMappingURL=webhook.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.adapter.js","sourceRoot":"","sources":["../src/webhook.adapter.ts"],"names":[],"mappings":";;;AAEA,iFAAoF;AAMpF,MAAa,cAAc;IACzB,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,QAAsB;QAC9C,MAAM,OAAO,GAAG,uCAAqB,CAAC,QAAQ,EAAE,CAAC;QACjD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,aAAa;gBAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;YAC/E,IAAI,OAAO,CAAC,UAAU;gBAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;YAC7E,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YACjE,IAAI,OAAO,CAAC,KAAK;gBAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;CACF;AAxBD,wCAwBC"}
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@evolith/infra-providers",
3
+ "version": "1.0.0",
4
+ "description": "Shared infrastructure providers for Evolith Core",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public",
13
+ "registry": "https://registry.npmjs.org"
14
+ },
15
+ "scripts": {
16
+ "build": "tsc"
17
+ },
18
+ "dependencies": {
19
+ "@evolith/core-domain": "1.0.0",
20
+ "@nestjs/common": "11.1.27",
21
+ "ajv": "8.20.0",
22
+ "ajv-formats": "3.0.1",
23
+ "fs-extra": "10.1.0",
24
+ "yaml": "1.10.3"
25
+ },
26
+ "devDependencies": {
27
+ "@types/fs-extra": "11.0.4",
28
+ "@types/node": "26.0.0",
29
+ "typescript": "6.0.3"
30
+ }
31
+ }