@evolith/smart-cli 0.0.1-beta → 0.0.2-beta

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 (84) hide show
  1. package/ARCHITECTURE.md +667 -89
  2. package/dist/app.module.js +2 -0
  3. package/dist/app.module.js.map +1 -1
  4. package/dist/application/services/index.d.ts +14 -5
  5. package/dist/application/services/index.js +41 -3
  6. package/dist/application/services/index.js.map +1 -1
  7. package/dist/application/services/phase-transition.use-case.spec.d.ts +1 -0
  8. package/dist/application/services/phase-transition.use-case.spec.js +297 -0
  9. package/dist/application/services/phase-transition.use-case.spec.js.map +1 -0
  10. package/dist/commands/docs/docs.command.d.ts +5 -0
  11. package/dist/commands/docs/docs.command.js +159 -3
  12. package/dist/commands/docs/docs.command.js.map +1 -1
  13. package/dist/commands/drift/drift.command.d.ts +24 -0
  14. package/dist/commands/drift/drift.command.js +250 -0
  15. package/dist/commands/drift/drift.command.js.map +1 -0
  16. package/dist/commands/init/agents.command.spec.d.ts +1 -0
  17. package/dist/commands/init/agents.command.spec.js +152 -0
  18. package/dist/commands/init/agents.command.spec.js.map +1 -0
  19. package/dist/commands/init/upgrade.command.d.ts +10 -0
  20. package/dist/commands/init/upgrade.command.js +134 -1
  21. package/dist/commands/init/upgrade.command.js.map +1 -1
  22. package/dist/commands/sdlc/gate-status.command.d.ts +5 -0
  23. package/dist/commands/sdlc/gate-status.command.js +114 -0
  24. package/dist/commands/sdlc/gate-status.command.js.map +1 -0
  25. package/dist/commands/sdlc/sdlc.command.js +3 -1
  26. package/dist/commands/sdlc/sdlc.command.js.map +1 -1
  27. package/dist/commands/validate/validate.command.d.ts +4 -0
  28. package/dist/commands/validate/validate.command.js +39 -0
  29. package/dist/commands/validate/validate.command.js.map +1 -1
  30. package/dist/core/agents/agent-ruleset-builder.d.ts +30 -0
  31. package/dist/core/agents/agent-ruleset-builder.js +75 -0
  32. package/dist/core/agents/agent-ruleset-builder.js.map +1 -0
  33. package/dist/core/agents/agent-ruleset-builder.spec.d.ts +1 -0
  34. package/dist/core/agents/agent-ruleset-builder.spec.js +135 -0
  35. package/dist/core/agents/agent-ruleset-builder.spec.js.map +1 -0
  36. package/dist/core/mcp/server.d.ts +14 -9
  37. package/dist/core/mcp/server.js +236 -181
  38. package/dist/core/mcp/server.js.map +1 -1
  39. package/dist/core/services/command-history.service.spec.d.ts +1 -0
  40. package/dist/core/services/command-history.service.spec.js +166 -0
  41. package/dist/core/services/command-history.service.spec.js.map +1 -0
  42. package/dist/core/upgrade/satellite-upgrade.service.d.ts +48 -0
  43. package/dist/core/upgrade/satellite-upgrade.service.js +358 -0
  44. package/dist/core/upgrade/satellite-upgrade.service.js.map +1 -0
  45. package/dist/core/upgrade/satellite-upgrade.service.spec.d.ts +1 -0
  46. package/dist/core/upgrade/satellite-upgrade.service.spec.js +143 -0
  47. package/dist/core/upgrade/satellite-upgrade.service.spec.js.map +1 -0
  48. package/dist/core/validators/architecture-drift.service.d.ts +68 -0
  49. package/dist/core/validators/architecture-drift.service.js +266 -0
  50. package/dist/core/validators/architecture-drift.service.js.map +1 -0
  51. package/dist/core/validators/architecture-drift.service.spec.d.ts +1 -0
  52. package/dist/core/validators/architecture-drift.service.spec.js +315 -0
  53. package/dist/core/validators/architecture-drift.service.spec.js.map +1 -0
  54. package/dist/core/validators/phase-gate-validator.service.d.ts +71 -0
  55. package/dist/core/validators/phase-gate-validator.service.js +271 -0
  56. package/dist/core/validators/phase-gate-validator.service.js.map +1 -0
  57. package/dist/core/validators/phase-gate-validator.service.spec.d.ts +1 -0
  58. package/dist/core/validators/phase-gate-validator.service.spec.js +326 -0
  59. package/dist/core/validators/phase-gate-validator.service.spec.js.map +1 -0
  60. package/dist/core/validators/ruleset-validator-architecture.spec.d.ts +1 -0
  61. package/dist/core/validators/ruleset-validator-architecture.spec.js +178 -0
  62. package/dist/core/validators/ruleset-validator-architecture.spec.js.map +1 -0
  63. package/dist/core/validators/ruleset-validator.service.d.ts +24 -0
  64. package/dist/core/validators/ruleset-validator.service.js +394 -0
  65. package/dist/core/validators/ruleset-validator.service.js.map +1 -1
  66. package/dist/core/validators/ruleset-validator.service.spec.js +4 -3
  67. package/dist/core/validators/ruleset-validator.service.spec.js.map +1 -1
  68. package/dist/domain/services/adr.service.spec.d.ts +1 -0
  69. package/dist/domain/services/adr.service.spec.js +141 -0
  70. package/dist/domain/services/adr.service.spec.js.map +1 -0
  71. package/dist/domain/services/agent-registry.service.spec.d.ts +1 -0
  72. package/dist/domain/services/agent-registry.service.spec.js +162 -0
  73. package/dist/domain/services/agent-registry.service.spec.js.map +1 -0
  74. package/dist/domain/services/standards.service.spec.d.ts +1 -0
  75. package/dist/domain/services/standards.service.spec.js +140 -0
  76. package/dist/domain/services/standards.service.spec.js.map +1 -0
  77. package/dist/domain/services/tool-usage-telemetry.service.spec.d.ts +1 -0
  78. package/dist/domain/services/tool-usage-telemetry.service.spec.js +180 -0
  79. package/dist/domain/services/tool-usage-telemetry.service.spec.js.map +1 -0
  80. package/dist/infrastructure/formatters/output-formatter.service.spec.d.ts +1 -0
  81. package/dist/infrastructure/formatters/output-formatter.service.spec.js +164 -0
  82. package/dist/infrastructure/formatters/output-formatter.service.spec.js.map +1 -0
  83. package/dist/main.js +0 -0
  84. package/package.json +1 -1
@@ -0,0 +1,271 @@
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.PhaseGateValidatorService = void 0;
37
+ const path = __importStar(require("path"));
38
+ const abstractions_1 = require("../abstractions");
39
+ class PhaseGateValidatorService {
40
+ constructor(corePath) {
41
+ this.cachedRuleset = null;
42
+ const container = (0, abstractions_1.getContainer)();
43
+ this.fs = container.createFileSystem();
44
+ this.logger = container.createLogger('PhaseGateValidatorService');
45
+ const resolvedCorePath = corePath || this.findCorePath(process.cwd());
46
+ this.rulesetPath = path.join(resolvedCorePath, 'rulesets', 'sdlc', 'phase-gates.rules.json');
47
+ }
48
+ async loadRuleset() {
49
+ if (this.cachedRuleset) {
50
+ return this.cachedRuleset;
51
+ }
52
+ try {
53
+ const content = await this.fs.readFile(this.rulesetPath);
54
+ this.cachedRuleset = JSON.parse(content);
55
+ return this.cachedRuleset;
56
+ }
57
+ catch (error) {
58
+ const message = error instanceof Error ? error.message : String(error);
59
+ this.logger.error(`Failed to load phase gates ruleset: ${message}`);
60
+ throw new Error(`Cannot load phase gates ruleset from ${this.rulesetPath}: ${message}`);
61
+ }
62
+ }
63
+ async validateGate(phaseNumber, projectPath) {
64
+ const ruleset = await this.loadRuleset();
65
+ const gate = ruleset.gates.find(g => g.phase === phaseNumber);
66
+ if (!gate) {
67
+ throw new Error(`Phase gate ${phaseNumber} not defined in ruleset`);
68
+ }
69
+ const evidenceResults = await this.validateEvidence(gate, projectPath);
70
+ const blockingChecks = await this.checkBlockingCriteria(gate, projectPath, evidenceResults);
71
+ const allEvidencePassed = evidenceResults.every(e => e.passed || !e.required);
72
+ const noBlocking = blockingChecks.every(b => !b.triggered);
73
+ return {
74
+ gateId: `PG-${gate.phase}`,
75
+ phase: gate.phase,
76
+ name: gate.name,
77
+ passed: allEvidencePassed && noBlocking,
78
+ evidenceResults,
79
+ blockingChecks,
80
+ waiverAvailable: true,
81
+ accountableRole: gate.accountableRole,
82
+ waiverAuthority: gate.waiverAuthority,
83
+ };
84
+ }
85
+ async validateAllGates(projectPath) {
86
+ const ruleset = await this.loadRuleset();
87
+ const results = [];
88
+ for (const gate of ruleset.gates) {
89
+ const result = await this.validateGate(gate.phase, projectPath);
90
+ results.push(result);
91
+ }
92
+ return results;
93
+ }
94
+ async getGateStatus(projectPath) {
95
+ const results = await this.validateAllGates(projectPath);
96
+ let currentPhase = 0;
97
+ let gatesPassed = 0;
98
+ let gatesFailed = 0;
99
+ let gatesPending = 0;
100
+ for (const result of results) {
101
+ if (result.passed) {
102
+ gatesPassed++;
103
+ currentPhase = result.phase;
104
+ }
105
+ else {
106
+ const hasRequiredFailures = result.evidenceResults.some(e => !e.passed && e.required);
107
+ if (hasRequiredFailures) {
108
+ gatesFailed++;
109
+ if (currentPhase === result.phase - 1) {
110
+ break;
111
+ }
112
+ }
113
+ else {
114
+ gatesPending++;
115
+ }
116
+ }
117
+ }
118
+ return {
119
+ currentPhase,
120
+ gatesPassed,
121
+ gatesFailed,
122
+ gatesPending: results.length - gatesPassed - gatesFailed,
123
+ results,
124
+ };
125
+ }
126
+ async validateEvidence(gate, projectPath) {
127
+ const results = [];
128
+ for (const evidence of gate.mandatoryEvidence) {
129
+ const result = await this.validateSingleEvidence(evidence, projectPath);
130
+ results.push(result);
131
+ }
132
+ return results;
133
+ }
134
+ async validateSingleEvidence(evidence, projectPath) {
135
+ const artifactPath = this.resolveArtifactPath(evidence.artifact, projectPath);
136
+ const exists = await this.fs.exists(artifactPath);
137
+ if (!exists) {
138
+ return {
139
+ artifact: evidence.artifact,
140
+ passed: false,
141
+ found: false,
142
+ schemaValid: false,
143
+ validationMessage: `Artifact not found: ${artifactPath}`,
144
+ required: true,
145
+ };
146
+ }
147
+ let schemaValid = true;
148
+ if (evidence.schemaRef) {
149
+ schemaValid = await this.validateSchema(evidence.schemaRef, artifactPath, projectPath);
150
+ }
151
+ const validationMessage = schemaValid
152
+ ? `Artifact found and valid: ${artifactPath}`
153
+ : `Artifact found but schema validation failed: ${artifactPath}`;
154
+ return {
155
+ artifact: evidence.artifact,
156
+ passed: exists && schemaValid,
157
+ found: true,
158
+ schemaValid,
159
+ validationMessage,
160
+ required: true,
161
+ };
162
+ }
163
+ resolveArtifactPath(artifact, projectPath) {
164
+ const artifactPaths = {
165
+ 'PRD': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'prd-template.md'),
166
+ 'Discovery Canvas': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'discovery-canvas-template.md'),
167
+ 'Business Case ROI': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'business-case-roi-template.md'),
168
+ 'Ballpark Estimation': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'ballpark-estimation-template.md'),
169
+ 'ADR Registry': path.join(projectPath, 'reference', 'architecture', 'adrs', 'adr-matrix.json'),
170
+ 'Functional Stories': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'functional-story-template.md'),
171
+ 'Bounded Context Map': path.join(projectPath, 'reference', 'architecture', 'contexts', 'bounded-context-map.md'),
172
+ 'Technical Stories': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'technical-story-template.md'),
173
+ 'Test Summary Report': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'test-summary-report-template.md'),
174
+ 'Release Notes': path.join(projectPath, 'reference', 'governance', 'sdlc', '04-artifact-templates', 'release-notes-template.md'),
175
+ 'evolith.yaml': path.join(projectPath, 'evolith.yaml'),
176
+ 'package.json': path.join(projectPath, 'package.json'),
177
+ 'rulesets': path.join(projectPath, 'rulesets'),
178
+ '.harness': path.join(projectPath, '.harness'),
179
+ 'src': path.join(projectPath, 'src'),
180
+ 'contracts': path.join(projectPath, 'contracts'),
181
+ 'Dockerfile': path.join(projectPath, 'Dockerfile'),
182
+ };
183
+ return artifactPaths[artifact] || path.join(projectPath, artifact);
184
+ }
185
+ async validateSchema(schemaRef, artifactPath, projectPath) {
186
+ try {
187
+ const schemaPath = path.join(path.dirname(this.rulesetPath), schemaRef);
188
+ if (!await this.fs.exists(schemaPath)) {
189
+ this.logger.warn(`Schema file not found: ${schemaPath}`);
190
+ return false;
191
+ }
192
+ const artifactContent = await this.fs.readFile(artifactPath);
193
+ if (!artifactContent || artifactContent.trim().length === 0) {
194
+ return false;
195
+ }
196
+ return true;
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ }
202
+ async checkBlockingCriteria(gate, projectPath, evidenceResults) {
203
+ const results = [];
204
+ for (const criterion of gate.blockingCriteria) {
205
+ const triggered = await this.isCriterionTriggered(criterion, projectPath, evidenceResults);
206
+ results.push({
207
+ criterion: criterion.criterion,
208
+ triggered,
209
+ action: criterion.action,
210
+ });
211
+ }
212
+ return results;
213
+ }
214
+ async isCriterionTriggered(criterion, projectPath, evidenceResults) {
215
+ const criterionText = criterion.criterion.toLowerCase();
216
+ if (criterionText.includes('scope is ambiguous') || criterionText.includes('funding')) {
217
+ const prdEvidence = evidenceResults.find(e => e.artifact === 'PRD');
218
+ return !prdEvidence?.found;
219
+ }
220
+ if (criterionText.includes('architecture decisions are undocumented')) {
221
+ const adrEvidence = evidenceResults.find(e => e.artifact === 'ADR Registry');
222
+ return !adrEvidence?.found;
223
+ }
224
+ if (criterionText.includes('bounded context')) {
225
+ const contextEvidence = evidenceResults.find(e => e.artifact === 'Bounded Context Map');
226
+ return !contextEvidence?.found;
227
+ }
228
+ if (criterionText.includes('functional stories lack acceptance criteria')) {
229
+ const storyEvidence = evidenceResults.find(e => e.artifact === 'Functional Stories');
230
+ return !storyEvidence?.found;
231
+ }
232
+ if (criterionText.includes('ci fails')) {
233
+ const ciPath = path.join(projectPath, '.github', 'workflows');
234
+ return !await this.fs.exists(ciPath);
235
+ }
236
+ if (criterionText.includes('coverage below')) {
237
+ const coveragePath = path.join(projectPath, 'coverage');
238
+ return !await this.fs.exists(coveragePath);
239
+ }
240
+ if (criterionText.includes('cve')) {
241
+ const securityPath = path.join(projectPath, 'security-scan.json');
242
+ return !await this.fs.exists(securityPath);
243
+ }
244
+ if (criterionText.includes('monitoring')) {
245
+ const observabilityPath = path.join(projectPath, 'observability');
246
+ return !await this.fs.exists(observabilityPath);
247
+ }
248
+ if (criterionText.includes('rollback')) {
249
+ const releaseEvidence = evidenceResults.find(e => e.artifact === 'Release Notes');
250
+ return !releaseEvidence?.found;
251
+ }
252
+ if (criterionText.includes('traceable')) {
253
+ const releaseEvidence = evidenceResults.find(e => e.artifact === 'Release Notes');
254
+ return !releaseEvidence?.found;
255
+ }
256
+ return false;
257
+ }
258
+ findCorePath(projectPath) {
259
+ const parts = projectPath.split(path.sep);
260
+ while (parts.length > 0) {
261
+ parts.pop();
262
+ const candidate = path.join(parts.join(path.sep), 'rulesets');
263
+ if (this.fs.existsSync(candidate)) {
264
+ return parts.join(path.sep);
265
+ }
266
+ }
267
+ return path.join(projectPath, '..', 'evolith');
268
+ }
269
+ }
270
+ exports.PhaseGateValidatorService = PhaseGateValidatorService;
271
+ //# sourceMappingURL=phase-gate-validator.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-gate-validator.service.js","sourceRoot":"","sources":["../../../src/core/validators/phase-gate-validator.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const phase_gate_validator_service_1 = require("./phase-gate-validator.service");
4
+ const abstractions_1 = require("../abstractions");
5
+ const createMockFileSystem = (overrides) => {
6
+ const mock = {
7
+ exists: jest.fn().mockResolvedValue(true),
8
+ existsSync: jest.fn().mockReturnValue(true),
9
+ readFile: jest.fn().mockResolvedValue(''),
10
+ readJson: jest.fn().mockResolvedValue({}),
11
+ readdirNames: jest.fn().mockResolvedValue([]),
12
+ writeFile: jest.fn().mockResolvedValue(undefined),
13
+ writeJson: jest.fn().mockResolvedValue(undefined),
14
+ ensureDir: jest.fn().mockResolvedValue(undefined),
15
+ remove: jest.fn().mockResolvedValue(undefined),
16
+ stat: jest.fn().mockResolvedValue({ isDirectory: () => true, isFile: () => false }),
17
+ ...overrides,
18
+ };
19
+ return mock;
20
+ };
21
+ const mockRuleset = {
22
+ gates: [
23
+ {
24
+ phase: 1,
25
+ name: 'Business Sign-Off',
26
+ description: 'Scope frozen; funding authorized; architectural constraints aligned.',
27
+ mandatoryEvidence: [
28
+ { artifact: 'PRD', schemaRef: '../schema/prd.schema.json', status: 'Approved', validation: 'PRD status = Approved' },
29
+ { artifact: 'Discovery Canvas', validation: 'Initiative registered' },
30
+ { artifact: 'Business Case ROI', validation: 'Financial viability documented' },
31
+ { artifact: 'Ballpark Estimation', validation: 'T-Shirt sizing completed' },
32
+ ],
33
+ blockingCriteria: [
34
+ { criterion: 'Scope is ambiguous', action: 'BLOCK — return to Phase 1' },
35
+ { criterion: 'Funding outcome is unclear', action: 'BLOCK — return to Phase 1' },
36
+ { criterion: 'Architecture constraints are ignored', action: 'BLOCK — return to Phase 1' },
37
+ ],
38
+ accountableRole: 'Product Owner',
39
+ waiverAuthority: 'Executive Sponsor',
40
+ waiverRequiredFields: ['criterion', 'justification', 'risk', 'owner', 'expirationDate', 'mitigationPlan'],
41
+ },
42
+ {
43
+ phase: 2,
44
+ name: 'Design Baseline Approved',
45
+ description: 'Architecture decisions documented; bounded contexts defined.',
46
+ mandatoryEvidence: [
47
+ { artifact: 'ADR Registry', validation: 'All architecture decisions have ADR' },
48
+ { artifact: 'Functional Stories', schemaRef: '../schema/functional-story.schema.json', validation: 'All stories in Ready state' },
49
+ { artifact: 'Bounded Context Map', validation: 'All contexts identified' },
50
+ ],
51
+ blockingCriteria: [
52
+ { criterion: 'Significant architecture decisions are undocumented', action: 'BLOCK — require ADR' },
53
+ { criterion: 'Bounded context boundaries are contradictory', action: 'BLOCK — require context map resolution' },
54
+ { criterion: 'Functional stories Lack acceptance criteria', action: 'BLOCK — return to story writing' },
55
+ ],
56
+ accountableRole: 'Software Architect',
57
+ waiverAuthority: 'Architecture Board',
58
+ waiverRequiredFields: ['criterion', 'justification', 'risk', 'owner', 'expirationDate', 'mitigationPlan'],
59
+ },
60
+ {
61
+ phase: 3,
62
+ name: 'Successful Build',
63
+ description: 'All code merged to main; CI passes; quality gates green.',
64
+ mandatoryEvidence: [
65
+ { artifact: 'Technical Stories', schemaRef: '../schema/technical-story.schema.json', validation: 'All technical stories Done' },
66
+ { artifact: 'CI Pipeline', validation: 'CI run green on main branch' },
67
+ { artifact: 'Coverage Report', validation: 'Business logic coverage >= 80%' },
68
+ ],
69
+ blockingCriteria: [
70
+ { criterion: 'CI fails on main branch', action: 'BLOCK merge — fix CI' },
71
+ { criterion: 'Coverage below threshold (< 80%)', action: 'BLOCK merge — add tests' },
72
+ { criterion: 'High or Critical CVEs detected', action: 'BLOCK merge — remediate CVEs' },
73
+ { criterion: 'Missing code review approval', action: 'BLOCK merge — require review' },
74
+ ],
75
+ accountableRole: 'Tech Lead',
76
+ waiverAuthority: 'Architecture Board (with exception for CVEs requires Executive Risk Acceptance)',
77
+ waiverRequiredFields: ['criterion', 'justification', 'risk', 'owner', 'expirationDate', 'mitigationPlan', 'approvalAuthority'],
78
+ },
79
+ {
80
+ phase: 4,
81
+ name: 'RC Stamped',
82
+ description: 'All quality thresholds verified; security scans clean; UAT passed.',
83
+ mandatoryEvidence: [
84
+ { artifact: 'Test Summary Report', schemaRef: '../schema/test-summary-report.schema.json', validation: 'All quality gates green' },
85
+ { artifact: 'Acceptance Validation', validation: 'Product Owner signs off' },
86
+ { artifact: 'Security Scan Report', validation: 'Zero High/Critical CVEs' },
87
+ ],
88
+ blockingCriteria: [
89
+ { criterion: 'Any mandatory quality metric fails', action: 'BLOCK RC stamp — remediate or waiver' },
90
+ { criterion: 'Acceptance criteria remain unverified', action: 'BLOCK RC stamp — return to validation' },
91
+ { criterion: 'Technical debt ratio exceeds 5%', action: 'BLOCK RC stamp — remediation plan required' },
92
+ ],
93
+ accountableRole: 'QA Lead',
94
+ waiverAuthority: 'Architecture Board',
95
+ waiverRequiredFields: ['criterion', 'justification', 'risk', 'owner', 'expirationDate', 'mitigationPlan'],
96
+ },
97
+ {
98
+ phase: 5,
99
+ name: 'Production Live',
100
+ description: 'Deployment executed; observability verified nominal; monitoring active.',
101
+ mandatoryEvidence: [
102
+ { artifact: 'Release Notes', schemaRef: '../schema/release-notes.schema.json', validation: 'Release scope, deployment steps, rollback procedure present' },
103
+ { artifact: 'Observability Validation', validation: 'Metrics nominal, logs flowing, traces complete' },
104
+ { artifact: 'Rollback Procedure', validation: 'Rollback steps documented and tested' },
105
+ { artifact: 'Deployment Evidence', validation: 'Deployment artifacts traceable to RC' },
106
+ ],
107
+ blockingCriteria: [
108
+ { criterion: 'Monitoring is not nominal', action: 'BLOCK Production Live — investigate' },
109
+ { criterion: 'Rollback procedure is undefined', action: 'BLOCK Production Live — document rollback' },
110
+ { criterion: 'Release is not traceable to RC', action: 'BLOCK Production Live — ensure RC → Release chain' },
111
+ ],
112
+ accountableRole: 'DevOps Lead',
113
+ waiverAuthority: 'Technology Director',
114
+ waiverRequiredFields: ['criterion', 'justification', 'risk', 'owner', 'expirationDate', 'mitigationPlan'],
115
+ },
116
+ ],
117
+ };
118
+ describe('PhaseGateValidatorService', () => {
119
+ let service;
120
+ let mockFs;
121
+ beforeEach(() => {
122
+ (0, abstractions_1.resetContainer)();
123
+ jest.clearAllMocks();
124
+ mockFs = createMockFileSystem({
125
+ readFile: jest.fn().mockResolvedValue(JSON.stringify(mockRuleset)),
126
+ });
127
+ const mockProvider = {
128
+ createFileSystem: () => mockFs,
129
+ };
130
+ (0, abstractions_1.getContainer)().setFileSystemProvider(mockProvider);
131
+ service = new phase_gate_validator_service_1.PhaseGateValidatorService('/core');
132
+ });
133
+ afterEach(() => {
134
+ (0, abstractions_1.resetContainer)();
135
+ });
136
+ describe('loadRuleset', () => {
137
+ it('should load and cache the ruleset from file', async () => {
138
+ const result = await service.loadRuleset();
139
+ expect(result.gates).toHaveLength(5);
140
+ expect(result.gates[0].phase).toBe(1);
141
+ expect(result.gates[0].name).toBe('Business Sign-Off');
142
+ });
143
+ it('should return cached ruleset on subsequent calls', async () => {
144
+ await service.loadRuleset();
145
+ await service.loadRuleset();
146
+ expect(mockFs.readFile).toHaveBeenCalledTimes(1);
147
+ });
148
+ it('should throw when ruleset file cannot be read', async () => {
149
+ mockFs.readFile.mockRejectedValue(new Error('File not found'));
150
+ await expect(service.loadRuleset()).rejects.toThrow('Cannot load phase gates ruleset');
151
+ });
152
+ });
153
+ describe('validateGate', () => {
154
+ it('should pass gate 1 when all evidence artifacts exist', async () => {
155
+ const result = await service.validateGate(1, '/project');
156
+ expect(result.phase).toBe(1);
157
+ expect(result.name).toBe('Business Sign-Off');
158
+ expect(result.passed).toBe(true);
159
+ expect(result.evidenceResults).toHaveLength(4);
160
+ expect(result.evidenceResults.every(e => e.passed)).toBe(true);
161
+ });
162
+ it('should fail gate 1 when PRD artifact is missing', async () => {
163
+ mockFs.exists.mockImplementation((p) => {
164
+ if (p.includes('prd-template.md'))
165
+ return Promise.resolve(false);
166
+ return Promise.resolve(true);
167
+ });
168
+ const result = await service.validateGate(1, '/project');
169
+ expect(result.passed).toBe(false);
170
+ const prdEvidence = result.evidenceResults.find(e => e.artifact === 'PRD');
171
+ expect(prdEvidence?.passed).toBe(false);
172
+ expect(prdEvidence?.found).toBe(false);
173
+ });
174
+ it('should fail gate when blocking criterion is triggered', async () => {
175
+ mockFs.exists.mockImplementation((p) => {
176
+ if (p.includes('prd-template.md'))
177
+ return Promise.resolve(false);
178
+ return Promise.resolve(true);
179
+ });
180
+ const result = await service.validateGate(1, '/project');
181
+ const triggeredBlocks = result.blockingChecks.filter(b => b.triggered);
182
+ expect(triggeredBlocks.length).toBeGreaterThan(0);
183
+ });
184
+ it('should throw for undefined phase gate', async () => {
185
+ await expect(service.validateGate(99, '/project')).rejects.toThrow('Phase gate 99 not defined');
186
+ });
187
+ it('should return correct accountable role and waiver authority', async () => {
188
+ const result = await service.validateGate(1, '/project');
189
+ expect(result.accountableRole).toBe('Product Owner');
190
+ expect(result.waiverAuthority).toBe('Executive Sponsor');
191
+ expect(result.waiverAvailable).toBe(true);
192
+ });
193
+ });
194
+ describe('validateAllGates', () => {
195
+ it('should validate all 5 phase gates', async () => {
196
+ const results = await service.validateAllGates('/project');
197
+ expect(results).toHaveLength(5);
198
+ expect(results.map(r => r.phase)).toEqual([1, 2, 3, 4, 5]);
199
+ });
200
+ it('should return mixed pass/fail results based on artifact availability', async () => {
201
+ mockFs.exists.mockImplementation((p) => {
202
+ if (p.includes('Dockerfile'))
203
+ return Promise.resolve(false);
204
+ if (p.includes('release-notes'))
205
+ return Promise.resolve(false);
206
+ return Promise.resolve(true);
207
+ });
208
+ const results = await service.validateAllGates('/project');
209
+ const passedGates = results.filter(r => r.passed);
210
+ const failedGates = results.filter(r => !r.passed);
211
+ expect(passedGates.length + failedGates.length).toBe(5);
212
+ });
213
+ });
214
+ describe('getGateStatus', () => {
215
+ it('should return summary with current phase and counts', async () => {
216
+ const status = await service.getGateStatus('/project');
217
+ expect(status).toHaveProperty('currentPhase');
218
+ expect(status).toHaveProperty('gatesPassed');
219
+ expect(status).toHaveProperty('gatesFailed');
220
+ expect(status).toHaveProperty('gatesPending');
221
+ expect(status).toHaveProperty('results');
222
+ expect(status.results).toHaveLength(5);
223
+ });
224
+ it('should calculate correct current phase when gates 1-2 pass', async () => {
225
+ mockFs.exists.mockImplementation((p) => {
226
+ if (p.includes('Dockerfile'))
227
+ return Promise.resolve(false);
228
+ if (p.includes('release-notes'))
229
+ return Promise.resolve(false);
230
+ if (p.includes('Test Summary'))
231
+ return Promise.resolve(false);
232
+ if (p.includes('Technical Stories'))
233
+ return Promise.resolve(false);
234
+ return Promise.resolve(true);
235
+ });
236
+ const status = await service.getGateStatus('/project');
237
+ expect(status.currentPhase).toBeGreaterThanOrEqual(0);
238
+ });
239
+ });
240
+ describe('validateSingleEvidence', () => {
241
+ it('should mark evidence as not found when artifact path does not exist', async () => {
242
+ mockFs.exists.mockResolvedValue(false);
243
+ const result = await service.validateGate(1, '/project');
244
+ const missingEvidence = result.evidenceResults.find(e => !e.found);
245
+ if (missingEvidence) {
246
+ expect(missingEvidence.passed).toBe(false);
247
+ expect(missingEvidence.validationMessage).toContain('Artifact not found');
248
+ }
249
+ });
250
+ it('should validate schema when schemaRef is provided', async () => {
251
+ mockFs.exists.mockResolvedValue(true);
252
+ mockFs.readFile.mockImplementation((p) => {
253
+ if (p.includes('phase-gates.rules.json'))
254
+ return Promise.resolve(JSON.stringify(mockRuleset));
255
+ return Promise.resolve('valid content');
256
+ });
257
+ const result = await service.validateGate(1, '/project');
258
+ const prdEvidence = result.evidenceResults.find(e => e.artifact === 'PRD');
259
+ expect(prdEvidence).toBeDefined();
260
+ });
261
+ it('should fail schema validation when artifact is empty', async () => {
262
+ mockFs.exists.mockResolvedValue(true);
263
+ mockFs.readFile.mockImplementation((p) => {
264
+ if (p.includes('phase-gates.rules.json'))
265
+ return Promise.resolve(JSON.stringify(mockRuleset));
266
+ return Promise.resolve('');
267
+ });
268
+ const result = await service.validateGate(1, '/project');
269
+ const prdEvidence = result.evidenceResults.find(e => e.artifact === 'PRD');
270
+ expect(prdEvidence?.schemaValid).toBe(false);
271
+ });
272
+ });
273
+ describe('resolveArtifactPath', () => {
274
+ it('should resolve PRD artifact to correct path', async () => {
275
+ await service.validateGate(1, '/project');
276
+ expect(mockFs.exists).toHaveBeenCalledWith(expect.stringContaining('prd-template.md'));
277
+ });
278
+ it('should resolve ADR Registry to correct path', async () => {
279
+ await service.validateGate(2, '/project');
280
+ expect(mockFs.exists).toHaveBeenCalledWith(expect.stringContaining('adr-matrix.json'));
281
+ });
282
+ });
283
+ describe('blocking criteria checks', () => {
284
+ it('should detect scope ambiguity when PRD is missing', async () => {
285
+ mockFs.exists.mockImplementation((p) => {
286
+ if (p.includes('prd-template.md'))
287
+ return Promise.resolve(false);
288
+ return Promise.resolve(true);
289
+ });
290
+ const result = await service.validateGate(1, '/project');
291
+ const scopeBlock = result.blockingChecks.find(b => b.criterion.toLowerCase().includes('scope'));
292
+ expect(scopeBlock?.triggered).toBe(true);
293
+ });
294
+ it('should detect undocumented architecture decisions when ADR Registry is missing', async () => {
295
+ mockFs.exists.mockImplementation((p) => {
296
+ if (p.includes('adr-matrix.json'))
297
+ return Promise.resolve(false);
298
+ return Promise.resolve(true);
299
+ });
300
+ const result = await service.validateGate(2, '/project');
301
+ const adrBlock = result.blockingChecks.find(b => b.criterion.toLowerCase().includes('undocumented'));
302
+ expect(adrBlock?.triggered).toBe(true);
303
+ });
304
+ it('should detect CI failure when .github/workflows is missing', async () => {
305
+ mockFs.exists.mockImplementation((p) => {
306
+ if (p.includes('.github/workflows'))
307
+ return Promise.resolve(false);
308
+ return Promise.resolve(true);
309
+ });
310
+ const result = await service.validateGate(3, '/project');
311
+ const ciBlock = result.blockingChecks.find(b => b.criterion.toLowerCase().includes('ci fails'));
312
+ expect(ciBlock?.triggered).toBe(true);
313
+ });
314
+ it('should detect missing rollback procedure when Release Notes are missing', async () => {
315
+ mockFs.exists.mockImplementation((p) => {
316
+ if (p.includes('release-notes'))
317
+ return Promise.resolve(false);
318
+ return Promise.resolve(true);
319
+ });
320
+ const result = await service.validateGate(5, '/project');
321
+ const rollbackBlock = result.blockingChecks.find(b => b.criterion.toLowerCase().includes('rollback'));
322
+ expect(rollbackBlock?.triggered).toBe(true);
323
+ });
324
+ });
325
+ });
326
+ //# sourceMappingURL=phase-gate-validator.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-gate-validator.service.spec.js","sourceRoot":"","sources":["../../../src/core/validators/phase-gate-validator.service.spec.ts"],"names":[],"mappings":"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"}