@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,166 @@
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
+ const command_history_service_1 = require("./command-history.service");
37
+ const fs = __importStar(require("fs-extra"));
38
+ jest.mock('fs-extra', () => ({
39
+ ensureDir: jest.fn().mockResolvedValue(undefined),
40
+ pathExists: jest.fn().mockResolvedValue(false),
41
+ readFile: jest.fn().mockResolvedValue(''),
42
+ appendFile: jest.fn().mockResolvedValue(undefined),
43
+ writeFile: jest.fn().mockResolvedValue(undefined),
44
+ remove: jest.fn().mockResolvedValue(undefined),
45
+ }));
46
+ const mockedFs = fs;
47
+ describe('CommandHistoryService', () => {
48
+ let service;
49
+ let counter = 0;
50
+ beforeEach(() => {
51
+ jest.clearAllMocks();
52
+ mockedFs.pathExists.mockResolvedValue(false);
53
+ mockedFs.readFile.mockResolvedValue('');
54
+ mockedFs.appendFile.mockResolvedValue(undefined);
55
+ mockedFs.remove.mockResolvedValue(undefined);
56
+ service = new command_history_service_1.CommandHistoryService(`/tmp/test-repo-${Date.now()}-${++counter}`);
57
+ });
58
+ describe('initialize', () => {
59
+ it('should create history directory', async () => {
60
+ await service.initialize();
61
+ expect(mockedFs.ensureDir).toHaveBeenCalled();
62
+ });
63
+ it('should load existing history from file', async () => {
64
+ const mockHistory = [
65
+ JSON.stringify({ id: 'h-000001', timestamp: '2026-01-01', command: 'validate', args: [], exitCode: 0, durationMs: 100, success: true }),
66
+ JSON.stringify({ id: 'h-000002', timestamp: '2026-01-02', command: 'init', args: ['--name', 'test'], exitCode: 0, durationMs: 200, success: true }),
67
+ ].join('\n');
68
+ let readCount = 0;
69
+ mockedFs.pathExists.mockImplementation(async () => true);
70
+ mockedFs.readFile.mockImplementation(async () => {
71
+ readCount++;
72
+ return readCount === 1 ? mockHistory : '';
73
+ });
74
+ const newService = new command_history_service_1.CommandHistoryService(`/tmp/test-repo-load-${Date.now()}-${++counter}`);
75
+ await newService.initialize();
76
+ const entries = await newService.list();
77
+ expect(entries.length).toBeGreaterThanOrEqual(2);
78
+ });
79
+ it('should skip malformed lines', async () => {
80
+ const mockContent = 'invalid json\n{"id":"h-000001","timestamp":"2026-01-01","command":"test","args":[],"exitCode":0,"durationMs":100,"success":true}\n';
81
+ let readCount = 0;
82
+ mockedFs.pathExists.mockImplementation(async () => true);
83
+ mockedFs.readFile.mockImplementation(async () => {
84
+ readCount++;
85
+ return readCount === 1 ? mockContent : '';
86
+ });
87
+ const newService = new command_history_service_1.CommandHistoryService(`/tmp/test-repo-malformed-${Date.now()}-${++counter}`);
88
+ await newService.initialize();
89
+ const entries = await newService.list();
90
+ expect(entries.length).toBeGreaterThanOrEqual(1);
91
+ });
92
+ });
93
+ describe('record', () => {
94
+ it('should record a successful command', async () => {
95
+ const id = await service.record('validate', [], 0, 150);
96
+ expect(id).toMatch(/^h-\d{6}$/);
97
+ expect(mockedFs.appendFile).toHaveBeenCalled();
98
+ });
99
+ it('should record a failed command', async () => {
100
+ const id = await service.record('validate', ['--arch'], 1, 50);
101
+ expect(id).toMatch(/^h-\d{6}$/);
102
+ });
103
+ it('should increment entry counter', async () => {
104
+ const id1 = await service.record('cmd1', [], 0, 100);
105
+ const id2 = await service.record('cmd2', [], 0, 100);
106
+ expect(id2).not.toBe(id1);
107
+ });
108
+ });
109
+ describe('list', () => {
110
+ it('should return all history entries', async () => {
111
+ await service.record('cmd1', [], 0, 100);
112
+ await service.record('cmd2', ['--flag'], 0, 200);
113
+ const entries = await service.list();
114
+ expect(entries.length).toBe(2);
115
+ });
116
+ it('should limit results when limit provided', async () => {
117
+ await service.record('cmd1', [], 0, 100);
118
+ await service.record('cmd2', [], 0, 100);
119
+ await service.record('cmd3', [], 0, 100);
120
+ const entries = await service.list(2);
121
+ expect(entries.length).toBe(2);
122
+ });
123
+ });
124
+ describe('search', () => {
125
+ it('should search by command name', async () => {
126
+ await service.record('validate', [], 0, 100);
127
+ await service.record('init', ['--name', 'test'], 0, 200);
128
+ await service.record('validate', ['--arch'], 0, 150);
129
+ const results = await service.search('validate');
130
+ expect(results.length).toBe(2);
131
+ });
132
+ it('should return empty array for no matches', async () => {
133
+ await service.record('validate', [], 0, 100);
134
+ const results = await service.search('nonexistent');
135
+ expect(results.length).toBe(0);
136
+ });
137
+ });
138
+ describe('stats', () => {
139
+ it('should return command statistics', async () => {
140
+ await service.record('validate', [], 0, 100);
141
+ await service.record('validate', [], 0, 200);
142
+ await service.record('init', [], 1, 50);
143
+ const stats = await service.stats();
144
+ expect(stats.totalCommands).toBe(3);
145
+ expect(stats.successRate).toContain('66.7');
146
+ });
147
+ it('should return 0 success rate with no commands', async () => {
148
+ const newService = new command_history_service_1.CommandHistoryService(`/tmp/test-repo-empty-${Date.now()}-${++counter}`);
149
+ const stats = await newService.stats();
150
+ expect(stats.totalCommands).toBe(0);
151
+ expect(stats.successRate).toBe('0%');
152
+ });
153
+ });
154
+ describe('clear', () => {
155
+ it('should clear all history', async () => {
156
+ await service.record('cmd1', [], 0, 100);
157
+ mockedFs.pathExists.mockResolvedValue(true);
158
+ mockedFs.readFile.mockResolvedValue('');
159
+ await service.clear();
160
+ mockedFs.pathExists.mockResolvedValue(false);
161
+ const entries = await service.list();
162
+ expect(entries.length).toBe(0);
163
+ });
164
+ });
165
+ });
166
+ //# sourceMappingURL=command-history.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-history.service.spec.js","sourceRoot":"","sources":["../../../src/core/services/command-history.service.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uEAAkE;AAClE,6CAA+B;AAE/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IACjD,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC9C,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACzC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IAClD,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;IACjD,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CAC/C,CAAC,CAAC,CAAC;AAEJ,MAAM,QAAQ,GAAG,EAOhB,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,OAA8B,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACxC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACjD,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,GAAG,IAAI,+CAAqB,CAAC,kBAAkB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,WAAW,GAAG;gBAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACvI,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;aACpJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAC9C,SAAS,EAAE,CAAC;gBACZ,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,+CAAqB,CAAC,uBAAuB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/F,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAExC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,WAAW,GAAG,oIAAoI,CAAC;YAEzJ,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YACzD,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBAC9C,SAAS,EAAE,CAAC;gBACZ,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,IAAI,+CAAqB,CAAC,4BAA4B,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACpG,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAExC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACrD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;QACpB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzD,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,UAAU,GAAG,IAAI,+CAAqB,CAAC,wBAAwB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAChG,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC5C,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ export interface UpgradePlan {
2
+ currentVersion: string;
3
+ targetVersion: string;
4
+ changes: UpgradeChange[];
5
+ breakingChanges: UpgradeChange[];
6
+ backupRequired: boolean;
7
+ estimatedRisk: 'low' | 'medium' | 'high';
8
+ }
9
+ export interface UpgradeChange {
10
+ type: 'add' | 'modify' | 'remove' | 'migrate';
11
+ sourcePath: string;
12
+ targetPath: string;
13
+ description: string;
14
+ breaking: boolean;
15
+ }
16
+ export interface UpgradeResult {
17
+ success: boolean;
18
+ plan: UpgradePlan;
19
+ changesApplied: number;
20
+ changesSkipped: number;
21
+ backupPath: string | null;
22
+ errors: string[];
23
+ warnings: string[];
24
+ }
25
+ export interface UpgradeOptions {
26
+ satellitePath: string;
27
+ corePath: string;
28
+ dryRun?: boolean;
29
+ force?: boolean;
30
+ skipBackup?: boolean;
31
+ }
32
+ export declare class SatelliteUpgradeService {
33
+ private readonly fs;
34
+ private readonly logger;
35
+ constructor();
36
+ planUpgrade(options: UpgradeOptions): Promise<UpgradePlan>;
37
+ executeUpgrade(options: UpgradeOptions): Promise<UpgradeResult>;
38
+ getUpgradeReport(result: UpgradeResult): Promise<string>;
39
+ private getSatelliteVersion;
40
+ private getCoreVersion;
41
+ private diffSatelliteVsCore;
42
+ private isBreakingChange;
43
+ private findJsonFiles;
44
+ private createBackup;
45
+ private copyDirectory;
46
+ private applyChange;
47
+ private updateSatelliteVersion;
48
+ }
@@ -0,0 +1,358 @@
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.SatelliteUpgradeService = void 0;
37
+ const path = __importStar(require("path"));
38
+ const abstractions_1 = require("../abstractions");
39
+ class SatelliteUpgradeService {
40
+ constructor() {
41
+ const container = (0, abstractions_1.getContainer)();
42
+ this.fs = container.createFileSystem();
43
+ this.logger = container.createLogger('SatelliteUpgradeService');
44
+ }
45
+ async planUpgrade(options) {
46
+ const currentVersion = await this.getSatelliteVersion(options.satellitePath);
47
+ const targetVersion = await this.getCoreVersion(options.corePath);
48
+ this.logger.info('Planning satellite upgrade', JSON.stringify({ currentVersion, targetVersion }));
49
+ const changes = await this.diffSatelliteVsCore(options.satellitePath, options.corePath);
50
+ const breakingChanges = changes.filter(c => c.breaking);
51
+ const estimatedRisk = breakingChanges.length > 3
52
+ ? 'high'
53
+ : breakingChanges.length > 0
54
+ ? 'medium'
55
+ : 'low';
56
+ return {
57
+ currentVersion,
58
+ targetVersion,
59
+ changes,
60
+ breakingChanges,
61
+ backupRequired: changes.length > 0,
62
+ estimatedRisk,
63
+ };
64
+ }
65
+ async executeUpgrade(options) {
66
+ const plan = await this.planUpgrade(options);
67
+ if (plan.changes.length === 0) {
68
+ this.logger.info('No upgrades needed - satellite is up to date');
69
+ return {
70
+ success: true,
71
+ plan,
72
+ changesApplied: 0,
73
+ changesSkipped: 0,
74
+ backupPath: null,
75
+ errors: [],
76
+ warnings: ['Satellite is already up to date'],
77
+ };
78
+ }
79
+ if (plan.breakingChanges.length > 0 && !options.force) {
80
+ return {
81
+ success: false,
82
+ plan,
83
+ changesApplied: 0,
84
+ changesSkipped: plan.changes.length,
85
+ backupPath: null,
86
+ errors: [`Breaking changes detected (${plan.breakingChanges.length}). Use --force to proceed.`],
87
+ warnings: plan.breakingChanges.map(c => `Breaking: ${c.description}`),
88
+ };
89
+ }
90
+ if (options.dryRun) {
91
+ this.logger.info('Dry run - no changes applied');
92
+ return {
93
+ success: true,
94
+ plan,
95
+ changesApplied: 0,
96
+ changesSkipped: plan.changes.length,
97
+ backupPath: null,
98
+ errors: [],
99
+ warnings: ['Dry run mode - no changes were applied'],
100
+ };
101
+ }
102
+ let backupPath = null;
103
+ if (plan.backupRequired && !options.skipBackup) {
104
+ backupPath = await this.createBackup(options.satellitePath);
105
+ }
106
+ const errors = [];
107
+ const warnings = [];
108
+ let changesApplied = 0;
109
+ let changesSkipped = 0;
110
+ for (const change of plan.changes) {
111
+ try {
112
+ await this.applyChange(change, options.satellitePath, options.corePath);
113
+ changesApplied++;
114
+ }
115
+ catch (error) {
116
+ const message = error instanceof Error ? error.message : String(error);
117
+ errors.push(`Failed to apply change: ${change.description} - ${message}`);
118
+ changesSkipped++;
119
+ }
120
+ }
121
+ if (errors.length > 0 && backupPath) {
122
+ warnings.push(`Backup available at: ${backupPath}`);
123
+ }
124
+ await this.updateSatelliteVersion(options.satellitePath, plan.targetVersion);
125
+ return {
126
+ success: errors.length === 0,
127
+ plan,
128
+ changesApplied,
129
+ changesSkipped,
130
+ backupPath,
131
+ errors,
132
+ warnings,
133
+ };
134
+ }
135
+ async getUpgradeReport(result) {
136
+ const lines = [];
137
+ lines.push('Satellite Upgrade Report');
138
+ lines.push('='.repeat(40));
139
+ lines.push(`Current Version: ${result.plan.currentVersion}`);
140
+ lines.push(`Target Version: ${result.plan.targetVersion}`);
141
+ lines.push(`Risk Level: ${result.plan.estimatedRisk}`);
142
+ lines.push('');
143
+ lines.push(`Changes Applied: ${result.changesApplied}`);
144
+ lines.push(`Changes Skipped: ${result.changesSkipped}`);
145
+ if (result.backupPath) {
146
+ lines.push(`Backup: ${result.backupPath}`);
147
+ }
148
+ if (result.warnings.length > 0) {
149
+ lines.push('');
150
+ lines.push('Warnings:');
151
+ for (const w of result.warnings) {
152
+ lines.push(` ⚠ ${w}`);
153
+ }
154
+ }
155
+ if (result.errors.length > 0) {
156
+ lines.push('');
157
+ lines.push('Errors:');
158
+ for (const e of result.errors) {
159
+ lines.push(` ✗ ${e}`);
160
+ }
161
+ }
162
+ lines.push('');
163
+ lines.push(result.success ? '✓ Upgrade completed successfully' : '✗ Upgrade completed with errors');
164
+ return lines.join('\n');
165
+ }
166
+ async getSatelliteVersion(satellitePath) {
167
+ const evolithYamlPath = path.join(satellitePath, 'evolith.yaml');
168
+ if (await this.fs.exists(evolithYamlPath)) {
169
+ try {
170
+ const content = await this.fs.readFile(evolithYamlPath);
171
+ const config = JSON.parse(content);
172
+ return config.coreRef?.version || 'unknown';
173
+ }
174
+ catch {
175
+ return 'unknown';
176
+ }
177
+ }
178
+ return 'unknown';
179
+ }
180
+ async getCoreVersion(corePath) {
181
+ const versionPath = path.join(corePath, 'package.json');
182
+ if (await this.fs.exists(versionPath)) {
183
+ try {
184
+ const pkg = await this.fs.readJson(versionPath);
185
+ return pkg.version || 'unknown';
186
+ }
187
+ catch {
188
+ return 'unknown';
189
+ }
190
+ }
191
+ return 'unknown';
192
+ }
193
+ async diffSatelliteVsCore(satellitePath, corePath) {
194
+ const changes = [];
195
+ const coreRulesetsPath = path.join(corePath, 'rulesets');
196
+ const satelliteRulesetsPath = path.join(satellitePath, 'rulesets');
197
+ if (await this.fs.exists(coreRulesetsPath)) {
198
+ const coreFiles = await this.findJsonFiles(coreRulesetsPath);
199
+ for (const coreFile of coreFiles) {
200
+ const relativePath = path.relative(coreRulesetsPath, coreFile);
201
+ const satelliteFile = path.join(satelliteRulesetsPath, relativePath);
202
+ if (!await this.fs.exists(satelliteFile)) {
203
+ changes.push({
204
+ type: 'add',
205
+ sourcePath: coreFile,
206
+ targetPath: satelliteFile,
207
+ description: `Add new ruleset: ${relativePath}`,
208
+ breaking: this.isBreakingChange(relativePath),
209
+ });
210
+ }
211
+ else {
212
+ const coreContent = await this.fs.readFile(coreFile);
213
+ const satelliteContent = await this.fs.readFile(satelliteFile);
214
+ if (coreContent !== satelliteContent) {
215
+ changes.push({
216
+ type: 'modify',
217
+ sourcePath: coreFile,
218
+ targetPath: satelliteFile,
219
+ description: `Update ruleset: ${relativePath}`,
220
+ breaking: this.isBreakingChange(relativePath),
221
+ });
222
+ }
223
+ }
224
+ }
225
+ }
226
+ const coreHarnessPath = path.join(corePath, '.harness');
227
+ const satelliteHarnessPath = path.join(satellitePath, '.harness');
228
+ if (await this.fs.exists(coreHarnessPath)) {
229
+ const coreHarnessFiles = await this.findJsonFiles(coreHarnessPath);
230
+ for (const coreFile of coreHarnessFiles) {
231
+ const relativePath = path.relative(coreHarnessPath, coreFile);
232
+ const satelliteFile = path.join(satelliteHarnessPath, relativePath);
233
+ if (!await this.fs.exists(satelliteFile)) {
234
+ changes.push({
235
+ type: 'add',
236
+ sourcePath: coreFile,
237
+ targetPath: satelliteFile,
238
+ description: `Add harness file: ${relativePath}`,
239
+ breaking: false,
240
+ });
241
+ }
242
+ }
243
+ }
244
+ return changes;
245
+ }
246
+ isBreakingChange(relativePath) {
247
+ const breakingPatterns = [
248
+ 'inheritance',
249
+ 'anti-corruption',
250
+ 'open-core-boundary',
251
+ 'governance',
252
+ ];
253
+ return breakingPatterns.some(pattern => relativePath.toLowerCase().includes(pattern));
254
+ }
255
+ async findJsonFiles(dirPath) {
256
+ const files = [];
257
+ if (!await this.fs.exists(dirPath)) {
258
+ return files;
259
+ }
260
+ const entries = await this.fs.readdirNames(dirPath);
261
+ for (const entry of entries) {
262
+ const fullPath = path.join(dirPath, entry);
263
+ try {
264
+ const stat = await this.fs.stat(fullPath);
265
+ if (stat.isDirectory && stat.isDirectory()) {
266
+ const subFiles = await this.findJsonFiles(fullPath);
267
+ files.push(...subFiles);
268
+ }
269
+ else if (entry.endsWith('.json')) {
270
+ files.push(fullPath);
271
+ }
272
+ }
273
+ catch {
274
+ }
275
+ }
276
+ return files;
277
+ }
278
+ async createBackup(satellitePath) {
279
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
280
+ const backupPath = path.join(satellitePath, `.evolith-backup-${timestamp}`);
281
+ await this.fs.ensureDir(backupPath);
282
+ const dirsToBackup = ['rulesets', '.harness', 'reference'];
283
+ for (const dir of dirsToBackup) {
284
+ const sourceDir = path.join(satellitePath, dir);
285
+ const backupDir = path.join(backupPath, dir);
286
+ if (await this.fs.exists(sourceDir)) {
287
+ await this.fs.ensureDir(backupDir);
288
+ await this.copyDirectory(sourceDir, backupDir);
289
+ }
290
+ }
291
+ this.logger.info('Backup created', JSON.stringify({ backupPath }));
292
+ return backupPath;
293
+ }
294
+ async copyDirectory(source, target) {
295
+ const entries = await this.fs.readdirNames(source);
296
+ for (const entry of entries) {
297
+ const sourcePath = path.join(source, entry);
298
+ const targetPath = path.join(target, entry);
299
+ try {
300
+ const stat = await this.fs.stat(sourcePath);
301
+ if (stat.isDirectory && stat.isDirectory()) {
302
+ await this.fs.ensureDir(targetPath);
303
+ await this.copyDirectory(sourcePath, targetPath);
304
+ }
305
+ else {
306
+ const content = await this.fs.readFile(sourcePath);
307
+ await this.fs.writeFile(targetPath, content);
308
+ }
309
+ }
310
+ catch {
311
+ }
312
+ }
313
+ }
314
+ async applyChange(change, satellitePath, corePath) {
315
+ switch (change.type) {
316
+ case 'add':
317
+ if (await this.fs.exists(change.sourcePath)) {
318
+ const content = await this.fs.readFile(change.sourcePath);
319
+ const targetDir = path.dirname(change.targetPath);
320
+ await this.fs.ensureDir(targetDir);
321
+ await this.fs.writeFile(change.targetPath, content);
322
+ }
323
+ break;
324
+ case 'modify':
325
+ if (await this.fs.exists(change.sourcePath)) {
326
+ const content = await this.fs.readFile(change.sourcePath);
327
+ const targetDir = path.dirname(change.targetPath);
328
+ await this.fs.ensureDir(targetDir);
329
+ await this.fs.writeFile(change.targetPath, content);
330
+ }
331
+ break;
332
+ case 'migrate':
333
+ this.logger.warn('Migration changes require manual review', JSON.stringify({ change: change.description }));
334
+ break;
335
+ case 'remove':
336
+ this.logger.warn('Remove changes require manual review', JSON.stringify({ change: change.description }));
337
+ break;
338
+ }
339
+ }
340
+ async updateSatelliteVersion(satellitePath, version) {
341
+ const evolithYamlPath = path.join(satellitePath, 'evolith.yaml');
342
+ if (await this.fs.exists(evolithYamlPath)) {
343
+ try {
344
+ const content = await this.fs.readFile(evolithYamlPath);
345
+ const config = JSON.parse(content);
346
+ if (config.coreRef && typeof config.coreRef === 'object') {
347
+ config.coreRef.version = version;
348
+ }
349
+ await this.fs.writeJson(evolithYamlPath, config);
350
+ }
351
+ catch {
352
+ this.logger.warn('Failed to update satellite version');
353
+ }
354
+ }
355
+ }
356
+ }
357
+ exports.SatelliteUpgradeService = SatelliteUpgradeService;
358
+ //# sourceMappingURL=satellite-upgrade.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"satellite-upgrade.service.js","sourceRoot":"","sources":["../../../src/core/upgrade/satellite-upgrade.service.ts"],"names":[],"mappings":"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"}