@evolith/smart-cli 0.0.3-beta → 1.1.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 (156) hide show
  1. package/README.es.md +51 -15
  2. package/README.md +51 -15
  3. package/dist/app.module.js +2 -0
  4. package/dist/app.module.js.map +1 -1
  5. package/dist/application/ports/webhook-notifier.port.d.ts +4 -0
  6. package/dist/application/ports/webhook-notifier.port.js +3 -0
  7. package/dist/application/ports/webhook-notifier.port.js.map +1 -0
  8. package/dist/application/services/index.d.ts +1 -0
  9. package/dist/application/services/index.js +28 -2
  10. package/dist/application/services/index.js.map +1 -1
  11. package/dist/application/services/initialize-project.spec.d.ts +1 -0
  12. package/dist/application/services/initialize-project.spec.js +211 -0
  13. package/dist/application/services/initialize-project.spec.js.map +1 -0
  14. package/dist/application/use-cases/evaluate-gate.use-case.d.ts +20 -0
  15. package/dist/application/use-cases/evaluate-gate.use-case.js +72 -0
  16. package/dist/application/use-cases/evaluate-gate.use-case.js.map +1 -0
  17. package/dist/application/use-cases/validate-satellite.use-case.d.ts +1 -0
  18. package/dist/application/use-cases/validate-satellite.use-case.js +7 -3
  19. package/dist/application/use-cases/validate-satellite.use-case.js.map +1 -1
  20. package/dist/commands/adr/adr.command.d.ts +2 -0
  21. package/dist/commands/adr/adr.command.js +36 -14
  22. package/dist/commands/adr/adr.command.js.map +1 -1
  23. package/dist/commands/architecture/scaffold.command.d.ts +1 -0
  24. package/dist/commands/architecture/scaffold.command.js +23 -1
  25. package/dist/commands/architecture/scaffold.command.js.map +1 -1
  26. package/dist/commands/gate/gate.command.d.ts +23 -0
  27. package/dist/commands/gate/gate.command.js +210 -0
  28. package/dist/commands/gate/gate.command.js.map +1 -0
  29. package/dist/commands/sdlc/gate-status.command.d.ts +3 -1
  30. package/dist/commands/sdlc/gate-status.command.js +78 -3
  31. package/dist/commands/sdlc/gate-status.command.js.map +1 -1
  32. package/dist/commands/sdlc/gate-status.command.spec.d.ts +1 -0
  33. package/dist/commands/sdlc/gate-status.command.spec.js +302 -0
  34. package/dist/commands/sdlc/gate-status.command.spec.js.map +1 -0
  35. package/dist/commands/sdlc/generate-domain.command.d.ts +2 -0
  36. package/dist/commands/sdlc/generate-domain.command.js +123 -12
  37. package/dist/commands/sdlc/generate-domain.command.js.map +1 -1
  38. package/dist/commands/sdlc/generate-domain.command.spec.js +103 -29
  39. package/dist/commands/sdlc/generate-domain.command.spec.js.map +1 -1
  40. package/dist/commands/sdlc/handoff.command.js +2 -2
  41. package/dist/commands/sdlc/handoff.command.js.map +1 -1
  42. package/dist/commands/sdlc/sdlc.command.js +40 -6
  43. package/dist/commands/sdlc/sdlc.command.js.map +1 -1
  44. package/dist/commands/sdlc/sdlc.command.spec.js +48 -14
  45. package/dist/commands/sdlc/sdlc.command.spec.js.map +1 -1
  46. package/dist/commands/validate/validate.command.d.ts +2 -0
  47. package/dist/commands/validate/validate.command.js +16 -2
  48. package/dist/commands/validate/validate.command.js.map +1 -1
  49. package/dist/core/abstractions/interfaces.d.ts +1 -0
  50. package/dist/core/abstractions/interfaces.js.map +1 -1
  51. package/dist/core/abstractions/providers/config-parser.provider.spec.d.ts +1 -0
  52. package/dist/core/abstractions/providers/config-parser.provider.spec.js +18 -0
  53. package/dist/core/abstractions/providers/config-parser.provider.spec.js.map +1 -0
  54. package/dist/core/abstractions/providers/mock-filesystem.provider.d.ts +1 -0
  55. package/dist/core/abstractions/providers/mock-filesystem.provider.js +4 -0
  56. package/dist/core/abstractions/providers/mock-filesystem.provider.js.map +1 -1
  57. package/dist/core/abstractions/providers/mock-filesystem.provider.spec.d.ts +1 -0
  58. package/dist/core/abstractions/providers/mock-filesystem.provider.spec.js +56 -0
  59. package/dist/core/abstractions/providers/mock-filesystem.provider.spec.js.map +1 -0
  60. package/dist/core/abstractions/providers/node-filesystem.provider.d.ts +1 -0
  61. package/dist/core/abstractions/providers/node-filesystem.provider.js +4 -0
  62. package/dist/core/abstractions/providers/node-filesystem.provider.js.map +1 -1
  63. package/dist/core/architecture/nx-workspace.strategy.d.ts +3 -0
  64. package/dist/core/architecture/nx-workspace.strategy.js +35 -6
  65. package/dist/core/architecture/nx-workspace.strategy.js.map +1 -1
  66. package/dist/core/architecture/nx-workspace.strategy.spec.d.ts +1 -0
  67. package/dist/core/architecture/nx-workspace.strategy.spec.js +187 -0
  68. package/dist/core/architecture/nx-workspace.strategy.spec.js.map +1 -0
  69. package/dist/core/architecture/workspace-manager.strategy.d.ts +1 -0
  70. package/dist/core/generators/hexagonal-scaffolder.d.ts +6 -0
  71. package/dist/core/generators/hexagonal-scaffolder.js +260 -0
  72. package/dist/core/generators/hexagonal-scaffolder.js.map +1 -0
  73. package/dist/core/generators/hexagonal-scaffolder.spec.d.ts +1 -0
  74. package/dist/core/generators/hexagonal-scaffolder.spec.js +164 -0
  75. package/dist/core/generators/hexagonal-scaffolder.spec.js.map +1 -0
  76. package/dist/core/generators/mermaid-class-parser.d.ts +38 -0
  77. package/dist/core/generators/mermaid-class-parser.js +183 -0
  78. package/dist/core/generators/mermaid-class-parser.js.map +1 -0
  79. package/dist/core/generators/mermaid-class-parser.spec.d.ts +1 -0
  80. package/dist/core/generators/mermaid-class-parser.spec.js +148 -0
  81. package/dist/core/generators/mermaid-class-parser.spec.js.map +1 -0
  82. package/dist/core/mcp/server.d.ts +3 -1
  83. package/dist/core/mcp/server.js +82 -108
  84. package/dist/core/mcp/server.js.map +1 -1
  85. package/dist/core/mcp/server.spec.js +20 -4
  86. package/dist/core/mcp/server.spec.js.map +1 -1
  87. package/dist/core/mcp/tools/gate.d.ts +1 -0
  88. package/dist/core/mcp/tools/gate.js +68 -0
  89. package/dist/core/mcp/tools/gate.js.map +1 -0
  90. package/dist/core/metrics/dora-calculator.d.ts +18 -0
  91. package/dist/core/metrics/dora-calculator.js +146 -0
  92. package/dist/core/metrics/dora-calculator.js.map +1 -0
  93. package/dist/core/metrics/dora-calculator.spec.d.ts +1 -0
  94. package/dist/core/metrics/dora-calculator.spec.js +164 -0
  95. package/dist/core/metrics/dora-calculator.spec.js.map +1 -0
  96. package/dist/core/metrics/git-log-reader.d.ts +14 -0
  97. package/dist/core/metrics/git-log-reader.js +39 -0
  98. package/dist/core/metrics/git-log-reader.js.map +1 -0
  99. package/dist/core/metrics/git-log-reader.spec.d.ts +1 -0
  100. package/dist/core/metrics/git-log-reader.spec.js +108 -0
  101. package/dist/core/metrics/git-log-reader.spec.js.map +1 -0
  102. package/dist/core/observability/command-watcher.spec.d.ts +1 -0
  103. package/dist/core/observability/command-watcher.spec.js +123 -0
  104. package/dist/core/observability/command-watcher.spec.js.map +1 -0
  105. package/dist/core/observability/index.d.ts +1 -0
  106. package/dist/core/observability/index.js +3 -1
  107. package/dist/core/observability/index.js.map +1 -1
  108. package/dist/core/observability/tool-usage-telemetry.service.d.ts +46 -0
  109. package/dist/core/observability/tool-usage-telemetry.service.js +181 -0
  110. package/dist/core/observability/tool-usage-telemetry.service.js.map +1 -0
  111. package/dist/core/services/command-history.service.d.ts +1 -0
  112. package/dist/core/services/command-history.service.js +4 -0
  113. package/dist/core/services/command-history.service.js.map +1 -1
  114. package/dist/core/services/command-history.service.spec.js +217 -126
  115. package/dist/core/services/command-history.service.spec.js.map +1 -1
  116. package/dist/core/upgrade/satellite-upgrade.service.spec.js +204 -144
  117. package/dist/core/upgrade/satellite-upgrade.service.spec.js.map +1 -1
  118. package/dist/core/validators/deep-architecture-analyzer.spec.js +27 -57
  119. package/dist/core/validators/deep-architecture-analyzer.spec.js.map +1 -1
  120. package/dist/core/validators/evaluators/evaluator.interface.d.ts +14 -0
  121. package/dist/core/validators/evaluators/evaluator.interface.js +3 -0
  122. package/dist/core/validators/evaluators/evaluator.interface.js.map +1 -0
  123. package/dist/core/validators/evaluators/native-evaluator.d.ts +31 -0
  124. package/dist/core/validators/evaluators/native-evaluator.js +461 -0
  125. package/dist/core/validators/evaluators/native-evaluator.js.map +1 -0
  126. package/dist/core/validators/evaluators/opa-evaluator.d.ts +20 -0
  127. package/dist/core/validators/evaluators/opa-evaluator.js +249 -0
  128. package/dist/core/validators/evaluators/opa-evaluator.js.map +1 -0
  129. package/dist/core/validators/phase-gate-validator.service.d.ts +4 -0
  130. package/dist/core/validators/phase-gate-validator.service.js +74 -9
  131. package/dist/core/validators/phase-gate-validator.service.js.map +1 -1
  132. package/dist/core/validators/rule-evaluation-engine.d.ts +34 -0
  133. package/dist/core/validators/rule-evaluation-engine.js +187 -0
  134. package/dist/core/validators/rule-evaluation-engine.js.map +1 -0
  135. package/dist/core/validators/rule-evaluation-engine.spec.d.ts +1 -0
  136. package/dist/core/validators/rule-evaluation-engine.spec.js +243 -0
  137. package/dist/core/validators/rule-evaluation-engine.spec.js.map +1 -0
  138. package/dist/core/validators/ruleset-validator.service.d.ts +2 -0
  139. package/dist/core/validators/ruleset-validator.service.js +29 -4
  140. package/dist/core/validators/ruleset-validator.service.js.map +1 -1
  141. package/dist/domain/gate-evidence.d.ts +59 -0
  142. package/dist/domain/gate-evidence.js +38 -0
  143. package/dist/domain/gate-evidence.js.map +1 -0
  144. package/dist/domain/services/adr.service.d.ts +2 -2
  145. package/dist/domain/services/adr.service.js +12 -8
  146. package/dist/domain/services/adr.service.js.map +1 -1
  147. package/dist/infrastructure/adapters/webhook.adapter.d.ts +5 -0
  148. package/dist/infrastructure/adapters/webhook.adapter.js +19 -0
  149. package/dist/infrastructure/adapters/webhook.adapter.js.map +1 -0
  150. package/dist/infrastructure/cli/command-executor.spec.d.ts +1 -0
  151. package/dist/infrastructure/cli/command-executor.spec.js +149 -0
  152. package/dist/infrastructure/cli/command-executor.spec.js.map +1 -0
  153. package/dist/infrastructure/cli/providers/providers.spec.d.ts +1 -0
  154. package/dist/infrastructure/cli/providers/providers.spec.js +251 -0
  155. package/dist/infrastructure/cli/providers/providers.spec.js.map +1 -0
  156. package/package.json +23 -5
@@ -0,0 +1,187 @@
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.RuleEvaluationEngine = void 0;
40
+ const path = __importStar(require("path"));
41
+ const abstractions_1 = require("../abstractions");
42
+ const ajv_1 = __importDefault(require("ajv"));
43
+ const ajv_formats_1 = __importDefault(require("ajv-formats"));
44
+ const native_evaluator_1 = require("./evaluators/native-evaluator");
45
+ const ALREADY_CHECKED = new Set(['GOV-01', 'GOV-02', 'INH-02', 'ACL-01', 'OCB-01']);
46
+ class RuleEvaluationEngine {
47
+ constructor(options) {
48
+ const container = (0, abstractions_1.getContainer)();
49
+ this.fs = options?.fileSystem ?? container.createFileSystem();
50
+ this.logger = options?.logger ?? container.createLogger('RuleEvaluationEngine');
51
+ this.strategy = options?.strategy ?? new native_evaluator_1.NativeEvaluator(this.fs, this.logger);
52
+ this.ajv = new ajv_1.default({ allErrors: true });
53
+ (0, ajv_formats_1.default)(this.ajv);
54
+ }
55
+ async discoverAndEvaluate(satellitePath, corePath) {
56
+ const rules = await this.loadAllRulesets(corePath);
57
+ const ctx = { satellitePath, corePath };
58
+ const results = [];
59
+ const rulesToEval = rules.filter(rule => !ALREADY_CHECKED.has(rule.id));
60
+ results.push(...await this.strategy.evaluateAll(rulesToEval, ctx));
61
+ return results;
62
+ }
63
+ async loadAllRulesets(corePath) {
64
+ const rulesetsDir = path.join(corePath, 'rulesets');
65
+ if (!await this.fs.exists(rulesetsDir))
66
+ return [];
67
+ const files = await this.findRulesetFiles(rulesetsDir);
68
+ const rules = [];
69
+ for (const filePath of files) {
70
+ try {
71
+ const content = await this.fs.readFile(filePath);
72
+ const parsed = JSON.parse(content);
73
+ if (!filePath.endsWith('phase-gates.rules.json')) {
74
+ if (!this.validateSchema) {
75
+ const schemaPath = path.join(rulesetsDir, 'schema', 'ruleset-standard.schema.json');
76
+ const schemaContent = await this.fs.readFile(schemaPath);
77
+ this.validateSchema = this.ajv.compile(JSON.parse(schemaContent));
78
+ }
79
+ const valid = this.validateSchema(parsed);
80
+ if (!valid) {
81
+ throw new Error(`Schema validation failed: ${this.ajv.errorsText(this.validateSchema.errors)}`);
82
+ }
83
+ }
84
+ const relative = filePath.replace(corePath + path.sep, '');
85
+ rules.push(...this.normalizeRuleset(parsed, relative));
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ this.logger.error(`Malformed ruleset detected at ${filePath}: ${message}`);
90
+ throw new Error(`Ruleset validation error in ${filePath}: ${message}`);
91
+ }
92
+ }
93
+ return rules;
94
+ }
95
+ async findRulesetFiles(dir, depth = 0) {
96
+ if (depth > 4)
97
+ return [];
98
+ const files = [];
99
+ const entries = await this.fs.readdirNames(dir);
100
+ for (const entry of entries) {
101
+ const full = path.join(dir, entry);
102
+ if (entry.endsWith('.rules.json')) {
103
+ files.push(full);
104
+ continue;
105
+ }
106
+ if (!entry.includes('.')) {
107
+ const stat = await this.fs.stat(full);
108
+ if (stat?.isDirectory?.()) {
109
+ files.push(...await this.findRulesetFiles(full, depth + 1));
110
+ }
111
+ }
112
+ }
113
+ return files;
114
+ }
115
+ normalizeRuleset(parsed, sourceFile) {
116
+ const rawList = (parsed['rules'] ?? parsed['principles']);
117
+ if (!Array.isArray(rawList))
118
+ return [];
119
+ if (rawList.length > 0 && !rawList[0]['id'] && rawList[0]['rules'])
120
+ return [];
121
+ return rawList
122
+ .filter(r => Boolean(r['id']))
123
+ .map(r => ({
124
+ id: String(r['id']),
125
+ severity: this.normalizeSeverity(r),
126
+ category: this.deriveCategory(r),
127
+ title: String(r['title'] ?? r['principle'] ?? r['id']),
128
+ description: String(r['description'] ?? r['statement'] ?? ''),
129
+ blocking: Boolean(r['blocking'] ?? this.defaultBlocking(r)),
130
+ validationQuery: r['validationQuery'] ? String(r['validationQuery']) : undefined,
131
+ sourceFile,
132
+ }));
133
+ }
134
+ normalizeSeverity(r) {
135
+ const raw = String(r['severity'] ?? '').toUpperCase().trim();
136
+ if (raw === 'MUST NOT')
137
+ return 'MUST NOT';
138
+ if (raw === 'MUST')
139
+ return 'MUST';
140
+ if (raw === 'SHOULD')
141
+ return 'SHOULD';
142
+ if (raw === 'COULD' || raw === 'MAY')
143
+ return 'COULD';
144
+ return r['blocking'] === true || r['enforcement'] ? 'MUST' : 'SHOULD';
145
+ }
146
+ defaultBlocking(r) {
147
+ const sev = String(r['severity'] ?? '').toUpperCase();
148
+ return sev === 'MUST' || sev === 'MUST NOT';
149
+ }
150
+ deriveCategory(r) {
151
+ if (r['category'])
152
+ return String(r['category']);
153
+ const prefix = String(r['id'] ?? '')
154
+ .replace(/-(?:EVD|RR|PAR)-?\d*$/, '')
155
+ .replace(/-\d+$/, '')
156
+ .toLowerCase();
157
+ const map = {
158
+ 'inh': 'inheritance', 'acl': 'anti-corruption',
159
+ 'ocb': 'open-core', 'gov': 'governance',
160
+ 'evd': 'identity', 'obs-evd': 'tracing',
161
+ 'dep': 'version-pinning', 'tax': 'naming-conventions',
162
+ 'hxa': 'layer-structure', 'git': 'branch-naming',
163
+ 'cicd': 'ci-cd', 'tpy': 'testing-pyramid',
164
+ 'mtn': 'multi-tenancy', 'prot': 'protocol',
165
+ 'runt': 'multi-runtime', 'dora': 'metrics',
166
+ 'space': 'metrics', 'drift': 'governance',
167
+ 'cli-rr': 'build', 'cli-par': 'shared-logic',
168
+ 'mcp': 'protocol', 'f1': 'topology',
169
+ 'f2': 'module-autonomy', 'f3': 'autonomous-deployment',
170
+ };
171
+ return map[prefix] ?? 'general';
172
+ }
173
+ toValidationIssues(results) {
174
+ return results
175
+ .filter(r => r.result === 'failed')
176
+ .map(r => ({
177
+ ruleId: r.rule.id,
178
+ severity: (r.rule.severity === 'MUST NOT' ? 'MUST' : r.rule.severity),
179
+ category: r.rule.category,
180
+ title: r.rule.title,
181
+ description: r.message ?? r.rule.description,
182
+ blocking: r.rule.blocking,
183
+ }));
184
+ }
185
+ }
186
+ exports.RuleEvaluationEngine = RuleEvaluationEngine;
187
+ //# sourceMappingURL=rule-evaluation-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluation-engine.js","sourceRoot":"","sources":["../../../src/core/validators/rule-evaluation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const rule_evaluation_engine_1 = require("./rule-evaluation-engine");
4
+ const makeFs = (overrides = {}) => ({
5
+ exists: jest.fn().mockResolvedValue(false),
6
+ existsSync: jest.fn().mockReturnValue(false),
7
+ readFile: jest.fn().mockResolvedValue(''),
8
+ readJson: jest.fn().mockResolvedValue({}),
9
+ writeFile: jest.fn().mockResolvedValue(undefined),
10
+ readdirNames: jest.fn().mockResolvedValue([]),
11
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false, isFile: () => true }),
12
+ ...overrides,
13
+ });
14
+ const makeLogger = () => ({ info: jest.fn(), warn: jest.fn(), error: jest.fn(), debug: jest.fn() });
15
+ const ctx = { satellitePath: '/sat', corePath: '/core' };
16
+ const makeRule = (partial) => ({
17
+ id: 'TEST-01',
18
+ severity: 'MUST',
19
+ category: 'test',
20
+ title: 'Test rule',
21
+ description: 'A test rule',
22
+ blocking: true,
23
+ sourceFile: 'test.rules.json',
24
+ ...partial,
25
+ });
26
+ describe('RuleEvaluationEngine — normalisation', () => {
27
+ it('normalises standard rules format', async () => {
28
+ const fs = makeFs({
29
+ exists: jest.fn().mockResolvedValue(true),
30
+ readdirNames: jest.fn().mockResolvedValue(['dep.rules.json']),
31
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false }),
32
+ readFile: jest.fn().mockResolvedValue(JSON.stringify({
33
+ rules: [
34
+ { id: 'DEP-01', severity: 'MUST NOT', category: 'version-pinning', title: 'No ^', description: 'No caret', blocking: true },
35
+ ],
36
+ })),
37
+ });
38
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
39
+ const rules = await engine.loadAllRulesets('/core');
40
+ expect(rules).toHaveLength(1);
41
+ expect(rules[0].id).toBe('DEP-01');
42
+ expect(rules[0].severity).toBe('MUST NOT');
43
+ });
44
+ it('normalises principles format (acl/governance style)', async () => {
45
+ const fs = makeFs({
46
+ exists: jest.fn().mockResolvedValue(true),
47
+ readdirNames: jest.fn().mockResolvedValue(['acl.rules.json']),
48
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false }),
49
+ readFile: jest.fn().mockResolvedValue(JSON.stringify({
50
+ principles: [
51
+ { id: 'ACL-01', principle: 'Validate', statement: 'Validate incoming data', severity: 'MUST', validationQuery: 'check', blocking: true },
52
+ ],
53
+ })),
54
+ });
55
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
56
+ const rules = await engine.loadAllRulesets('/core');
57
+ expect(rules[0].id).toBe('ACL-01');
58
+ expect(rules[0].title).toBe('Validate');
59
+ expect(rules[0].description).toBe('Validate incoming data');
60
+ });
61
+ it('skips engineering-manifesto (nested principles without top-level id)', async () => {
62
+ const fs = makeFs({
63
+ exists: jest.fn().mockResolvedValue(true),
64
+ readdirNames: jest.fn().mockResolvedValue(['manifesto.rules.json']),
65
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false }),
66
+ readFile: jest.fn().mockResolvedValue(JSON.stringify({
67
+ principles: [
68
+ { name: 'Quality', acronym: 'Q', rules: [{ text: 'do quality' }] },
69
+ ],
70
+ })),
71
+ });
72
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
73
+ const rules = await engine.loadAllRulesets('/core');
74
+ expect(rules).toHaveLength(0);
75
+ });
76
+ it('derives category from rule ID prefix when category field absent', async () => {
77
+ const fs = makeFs({
78
+ exists: jest.fn().mockResolvedValue(true),
79
+ readdirNames: jest.fn().mockResolvedValue(['inh.rules.json']),
80
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false }),
81
+ readFile: jest.fn().mockResolvedValue(JSON.stringify({
82
+ principles: [
83
+ { id: 'INH-01', principle: 'Immutability', statement: 'Core is immutable', enforcement: 'CLI validates' },
84
+ ],
85
+ })),
86
+ });
87
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
88
+ const rules = await engine.loadAllRulesets('/core');
89
+ expect(rules[0].category).toBe('inheritance');
90
+ });
91
+ });
92
+ describe('RuleEvaluationEngine — version-pinning evaluator', () => {
93
+ it('passes when no caret or tilde in dependencies', async () => {
94
+ const fs = makeFs({
95
+ exists: jest.fn().mockResolvedValue(true),
96
+ readJson: jest.fn().mockResolvedValue({ dependencies: { lodash: '4.17.21' } }),
97
+ readdirNames: jest.fn().mockResolvedValue([]),
98
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => false }),
99
+ });
100
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
101
+ const rule = makeRule({ id: 'DEP-01', category: 'version-pinning' });
102
+ const results = await engine.discoverAndEvaluate('/sat', '/core');
103
+ expect(results.filter(r => r.rule.id === 'DEP-01')).toHaveLength(0);
104
+ const result = await engine.evalVersionPinning(rule, ctx);
105
+ expect(result.result).toBe('passed');
106
+ });
107
+ it('fails when caret found in dependencies', async () => {
108
+ const fs = makeFs({
109
+ exists: jest.fn().mockResolvedValue(true),
110
+ readJson: jest.fn().mockResolvedValue({ dependencies: { lodash: '^4.17.21' } }),
111
+ });
112
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
113
+ const rule = makeRule({ id: 'DEP-01', category: 'version-pinning' });
114
+ const result = await engine.evalVersionPinning(rule, ctx);
115
+ expect(result.result).toBe('failed');
116
+ expect(result.message).toContain('lodash');
117
+ });
118
+ it('fails DEP-02 when tilde found', async () => {
119
+ const fs = makeFs({
120
+ exists: jest.fn().mockResolvedValue(true),
121
+ readJson: jest.fn().mockResolvedValue({ devDependencies: { jest: '~29.0.0' } }),
122
+ });
123
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
124
+ const rule = makeRule({ id: 'DEP-02', category: 'version-pinning' });
125
+ const result = await engine.evalVersionPinning(rule, ctx);
126
+ expect(result.result).toBe('failed');
127
+ });
128
+ });
129
+ describe('RuleEvaluationEngine — lock-file evaluator', () => {
130
+ it('passes when package-lock.json exists at corePath', async () => {
131
+ const fs = makeFs({
132
+ exists: jest.fn().mockImplementation(async (p) => p.endsWith('package-lock.json')),
133
+ });
134
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
135
+ const rule = makeRule({ id: 'DEP-04', category: 'lock-file' });
136
+ const result = await engine.evalLockFile(rule, ctx);
137
+ expect(result.result).toBe('passed');
138
+ });
139
+ it('fails when no package-lock.json anywhere', async () => {
140
+ const fs = makeFs({ exists: jest.fn().mockResolvedValue(false) });
141
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
142
+ const rule = makeRule({ id: 'DEP-04', category: 'lock-file' });
143
+ const result = await engine.evalLockFile(rule, ctx);
144
+ expect(result.result).toBe('failed');
145
+ });
146
+ });
147
+ describe('RuleEvaluationEngine — evidence evaluator', () => {
148
+ const evidencePath = '/core/.harness/evidence';
149
+ it('passes EVD-01 when all required fields present', async () => {
150
+ const manifest = JSON.stringify({
151
+ id: 'evd-001', source: 'test', generatedAt: '2026-01-01', producer: 'harness',
152
+ evaluatedRules: ['EVD-01'], status: 'passed', blockingFailures: [],
153
+ retentionPeriod: '90d', owner: 'team', sourceRef: 'sdk/cli',
154
+ });
155
+ const fs = makeFs({
156
+ exists: jest.fn().mockResolvedValue(true),
157
+ readdirNames: jest.fn().mockResolvedValue(['smoke.json']),
158
+ readFile: jest.fn().mockResolvedValue(manifest),
159
+ });
160
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
161
+ const rule = makeRule({ id: 'EVD-01', category: 'identity' });
162
+ const result = await engine.evalEvidence(rule, { ...ctx, corePath: '/core' });
163
+ expect(result.result).toBe('passed');
164
+ });
165
+ it('fails EVD-01 when id field missing', async () => {
166
+ const manifest = JSON.stringify({
167
+ source: 'test', generatedAt: '2026-01-01', producer: 'harness', evaluatedRules: ['EVD-01'],
168
+ });
169
+ const fs = makeFs({
170
+ exists: jest.fn().mockResolvedValue(true),
171
+ readdirNames: jest.fn().mockResolvedValue(['smoke.json']),
172
+ readFile: jest.fn().mockResolvedValue(manifest),
173
+ });
174
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
175
+ const rule = makeRule({ id: 'EVD-01', category: 'identity' });
176
+ const result = await engine.evalEvidence(rule, { ...ctx, corePath: '/core' });
177
+ expect(result.result).toBe('failed');
178
+ expect(result.message).toContain('id');
179
+ });
180
+ it('fails EVD-01 when no evidence files exist', async () => {
181
+ const fs = makeFs({
182
+ exists: jest.fn().mockImplementation(async (p) => p === evidencePath),
183
+ readdirNames: jest.fn().mockResolvedValue([]),
184
+ });
185
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
186
+ const rule = makeRule({ id: 'EVD-01', category: 'identity' });
187
+ const result = await engine.evalEvidence(rule, { ...ctx, corePath: '/core' });
188
+ expect(result.result).toBe('failed');
189
+ });
190
+ it('fails EVD-02 when sourceRef missing', async () => {
191
+ const manifest = JSON.stringify({ id: 'x', source: 'x', generatedAt: 'x', producer: 'x', evaluatedRules: [] });
192
+ const fs = makeFs({
193
+ exists: jest.fn().mockResolvedValue(true),
194
+ readdirNames: jest.fn().mockResolvedValue(['ev.json']),
195
+ readFile: jest.fn().mockResolvedValue(manifest),
196
+ });
197
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
198
+ const rule = makeRule({ id: 'EVD-02', category: 'traceability' });
199
+ const result = await engine.evalEvidence(rule, { ...ctx, corePath: '/core' });
200
+ expect(result.result).toBe('failed');
201
+ expect(result.message).toContain('sourceRef');
202
+ });
203
+ });
204
+ describe('RuleEvaluationEngine — build evaluator', () => {
205
+ it('passes when dist/main.js exists', async () => {
206
+ const fs = makeFs({
207
+ exists: jest.fn().mockImplementation(async (p) => p.endsWith('dist/main.js')),
208
+ });
209
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
210
+ const rule = makeRule({ id: 'CLI-RR-01', category: 'build' });
211
+ const result = await engine.evalBuild(rule, { ...ctx, corePath: '/core' });
212
+ expect(result.result).toBe('passed');
213
+ });
214
+ it('fails when dist/main.js missing', async () => {
215
+ const fs = makeFs({ exists: jest.fn().mockResolvedValue(false) });
216
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: fs, logger: makeLogger() });
217
+ const rule = makeRule({ id: 'CLI-RR-01', category: 'build' });
218
+ const result = await engine.evalBuild(rule, { ...ctx, corePath: '/core' });
219
+ expect(result.result).toBe('failed');
220
+ });
221
+ });
222
+ describe('RuleEvaluationEngine — toValidationIssues', () => {
223
+ it('maps failed results to ValidationIssues', () => {
224
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: makeFs(), logger: makeLogger() });
225
+ const rule = makeRule({ id: 'DEP-01', severity: 'MUST', blocking: true });
226
+ const issues = engine.toValidationIssues([
227
+ { rule, result: 'failed', message: 'caret found' },
228
+ { rule: makeRule({ id: 'DEP-02' }), result: 'passed' },
229
+ { rule: makeRule({ id: 'DEP-03' }), result: 'skipped' },
230
+ ]);
231
+ expect(issues).toHaveLength(1);
232
+ expect(issues[0].ruleId).toBe('DEP-01');
233
+ expect(issues[0].description).toBe('caret found');
234
+ expect(issues[0].blocking).toBe(true);
235
+ });
236
+ it('converts MUST NOT severity to MUST for ValidationIssue', () => {
237
+ const engine = new rule_evaluation_engine_1.RuleEvaluationEngine({ fileSystem: makeFs(), logger: makeLogger() });
238
+ const rule = makeRule({ id: 'DEP-01', severity: 'MUST NOT', blocking: true });
239
+ const issues = engine.toValidationIssues([{ rule, result: 'failed', message: 'x' }]);
240
+ expect(issues[0].severity).toBe('MUST');
241
+ });
242
+ });
243
+ //# sourceMappingURL=rule-evaluation-engine.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluation-engine.spec.js","sourceRoot":"","sources":["../../../src/core/validators/rule-evaluation-engine.spec.ts"],"names":[],"mappings":"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"}
@@ -41,11 +41,13 @@ export interface RulesetValidatorOptions {
41
41
  fileSystem?: IFileSystem;
42
42
  configParser?: IConfigParser;
43
43
  logger?: ILogger;
44
+ engineType?: 'native' | 'opa';
44
45
  }
45
46
  export declare class RulesetValidatorService {
46
47
  private readonly logger;
47
48
  private readonly fs;
48
49
  private readonly configParser;
50
+ private readonly engine;
49
51
  constructor(options?: RulesetValidatorOptions);
50
52
  validate(satellitePath: string, corePath?: string): Promise<ValidationResult>;
51
53
  private loadEvolithYaml;
@@ -36,12 +36,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.RulesetValidatorService = void 0;
37
37
  const path = __importStar(require("path"));
38
38
  const abstractions_1 = require("../abstractions");
39
+ const rule_evaluation_engine_1 = require("./rule-evaluation-engine");
40
+ const native_evaluator_1 = require("./evaluators/native-evaluator");
41
+ const opa_evaluator_1 = require("./evaluators/opa-evaluator");
39
42
  class RulesetValidatorService {
40
43
  constructor(options) {
41
44
  const container = (0, abstractions_1.getContainer)();
42
- this.logger = options?.logger || container.createLogger('RulesetValidatorService');
43
- this.fs = options?.fileSystem || container.createFileSystem();
44
- this.configParser = options?.configParser || container.createConfigParser('yaml');
45
+ this.logger = options?.logger ?? container.createLogger('RulesetValidatorService');
46
+ this.fs = options?.fileSystem ?? container.createFileSystem();
47
+ this.configParser = options?.configParser ?? container.createConfigParser('yaml');
48
+ const strategy = options?.engineType === 'opa'
49
+ ? new opa_evaluator_1.OpaEvaluator(this.fs, this.logger)
50
+ : new native_evaluator_1.NativeEvaluator(this.fs, this.logger);
51
+ this.engine = new rule_evaluation_engine_1.RuleEvaluationEngine({
52
+ fileSystem: this.fs,
53
+ logger: this.logger,
54
+ strategy
55
+ });
45
56
  }
46
57
  async validate(satellitePath, corePath) {
47
58
  const issues = [];
@@ -153,6 +164,15 @@ class RulesetValidatorService {
153
164
  blocking: false,
154
165
  });
155
166
  }
167
+ try {
168
+ const engineResults = await this.engine.discoverAndEvaluate(satellitePath, resolvedCorePath);
169
+ const evaluated = engineResults.filter(r => r.result !== 'skipped');
170
+ rulesChecked += evaluated.length;
171
+ issues.push(...this.engine.toValidationIssues(engineResults));
172
+ }
173
+ catch (err) {
174
+ this.logger.warn(`Rule engine error: ${err instanceof Error ? err.message : String(err)}`);
175
+ }
156
176
  const status = issues.some(i => i.blocking) ? 'failed' : issues.length > 0 ? 'warning' : 'passed';
157
177
  return {
158
178
  status,
@@ -232,6 +252,11 @@ class RulesetValidatorService {
232
252
  'acl': 'acl/anti-corruption-layer.rules.json',
233
253
  'open-core': 'governance/open-core-boundary.rules.json',
234
254
  'inheritance': 'governance/inheritance.rules.json',
255
+ 'cli-release': 'cli/release-readiness.rules.json',
256
+ 'cli-parity': 'cli/core-parity.rules.json',
257
+ 'evidence': 'evidence/evidence-manifest.rules.json',
258
+ 'mcp': 'mcp/protocol-compliance.rules.json',
259
+ 'observability': 'observability/telemetry-evidence.rules.json',
235
260
  };
236
261
  const relativePath = mapping[rulesetId.toLowerCase()];
237
262
  if (!relativePath) {
@@ -240,7 +265,7 @@ class RulesetValidatorService {
240
265
  severity: 'SHOULD',
241
266
  category: 'governance',
242
267
  title: `Unknown ruleset ID: ${rulesetId}`,
243
- description: 'Available ruleset IDs: adr-0002, adr-0005, adr-0010, adr-0018, adr-0032, adr-0040, adr-0050, acl, open-core, inheritance',
268
+ description: 'Available ruleset IDs: adr-0002, adr-0005, adr-0010, adr-0018, adr-0032, adr-0040, adr-0050, acl, open-core, inheritance, cli-release, cli-parity, evidence, mcp, observability',
244
269
  blocking: false,
245
270
  });
246
271
  return issues;