@solidxai/solidctl 0.1.28-beta.3 โ 0.1.28-beta.30
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.
- package/README.md +3 -0
- package/dist/commands/agent-helper.d.ts +2 -0
- package/dist/commands/agent-helper.js +197 -1
- package/dist/commands/agent-helper.js.map +1 -1
- package/dist/commands/agent.command.js +372 -31
- package/dist/commands/agent.command.js.map +1 -1
- package/dist/commands/generate.command.js +2 -2
- package/dist/commands/generate.command.js.map +1 -1
- package/dist/commands/info.command.js +1 -1
- package/dist/commands/info.command.js.map +1 -1
- package/dist/commands/mcp.command.js +2 -1
- package/dist/commands/mcp.command.js.map +1 -1
- package/dist/commands/release.command.js +626 -94
- package/dist/commands/release.command.js.map +1 -1
- package/dist/commands/seed.command.js +1 -1
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/commands/start.command.js +72 -6
- package/dist/commands/start.command.js.map +1 -1
- package/dist/commands/test.command.js +1 -1
- package/dist/commands/test.command.js.map +1 -1
- package/dist/commands/upgrade.command.js +4 -1
- package/dist/commands/upgrade.command.js.map +1 -1
- package/dist/helper.d.ts +1 -0
- package/dist/helper.js +14 -0
- package/dist/helper.js.map +1 -1
- package/dist/main.js +16 -1
- package/dist/main.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -6,12 +6,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.registerReleaseCommand = registerReleaseCommand;
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
9
11
|
const path_1 = __importDefault(require("path"));
|
|
10
12
|
const DEFAULT_CONFIG = {
|
|
11
13
|
mainBranch: 'main',
|
|
12
14
|
devBranch: 'dev',
|
|
13
15
|
reverseMerge: true,
|
|
14
16
|
};
|
|
17
|
+
const SANDBOX_GATED_RELEASE_PROJECTS = new Set(['solid-core-module', 'solid-core-ui']);
|
|
18
|
+
const SANDBOX_BASE_API_URL = 'https://api.demo.solidxai.com';
|
|
19
|
+
const SANDBOX_TEST_REQUEST_COMPANY_NAME = 'Logicloop Ventures Ltd';
|
|
20
|
+
const SANDBOX_STATUS_PAGE_BASE_URL = 'https://demo.solidxai.com/admin/core/sandbox-builder/sandbox/form';
|
|
21
|
+
const SANDBOX_POLL_INTERVAL_MS = 15_000;
|
|
22
|
+
const SANDBOX_POLL_TIMEOUT_MS = 90 * 60 * 1000;
|
|
23
|
+
const SANDBOX_PENDING_STATUSES = new Set([
|
|
24
|
+
'PENDING',
|
|
25
|
+
'VERIFYING',
|
|
26
|
+
'PROVISIONING',
|
|
27
|
+
'ACTIVE',
|
|
28
|
+
'TESTING',
|
|
29
|
+
'EXPIRING',
|
|
30
|
+
'DELETING',
|
|
31
|
+
]);
|
|
32
|
+
const SANDBOX_SUCCESS_STATUSES = new Set(['TEST_PASSED']);
|
|
33
|
+
const SANDBOX_FAILURE_STATUSES = new Set([
|
|
34
|
+
'VERIFICATION_FAILED',
|
|
35
|
+
'TEST_FAILED',
|
|
36
|
+
'STOPPED',
|
|
37
|
+
'FAILED',
|
|
38
|
+
'DELETED',
|
|
39
|
+
]);
|
|
15
40
|
function loadConfig() {
|
|
16
41
|
const configPaths = [
|
|
17
42
|
path_1.default.join(process.cwd(), 'solidctl.config.json'),
|
|
@@ -34,9 +59,78 @@ function loadConfig() {
|
|
|
34
59
|
}
|
|
35
60
|
return DEFAULT_CONFIG;
|
|
36
61
|
}
|
|
62
|
+
function readPackageJson(packageJsonPath = path_1.default.join(process.cwd(), 'package.json')) {
|
|
63
|
+
if (!fs_1.default.existsSync(packageJsonPath)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function readRequiredPackageJson(packageJsonPath) {
|
|
74
|
+
const packageJson = readPackageJson(packageJsonPath);
|
|
75
|
+
if (!packageJson) {
|
|
76
|
+
console.error(`โ Could not read package.json at ${packageJsonPath}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
return packageJson;
|
|
80
|
+
}
|
|
81
|
+
function resolveReleaseProject() {
|
|
82
|
+
const cwdName = path_1.default.basename(process.cwd());
|
|
83
|
+
const packageJson = readPackageJson();
|
|
84
|
+
const packageName = packageJson?.name;
|
|
85
|
+
const solidApiPackageJsonPath = path_1.default.join(process.cwd(), 'solid-api', 'package.json');
|
|
86
|
+
const solidApiPackageName = readPackageJson(solidApiPackageJsonPath)?.name;
|
|
87
|
+
switch (cwdName) {
|
|
88
|
+
case 'solidctl':
|
|
89
|
+
if (packageName === '@solidxai/solidctl') {
|
|
90
|
+
console.log(`๐ฆ Release project resolved: solidctl (${packageName})`);
|
|
91
|
+
return { type: 'solidctl', cwdName, packageName, versionSourcePath: path_1.default.join(process.cwd(), 'package.json') };
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case 'solid-core-module':
|
|
95
|
+
if (packageName === '@solidxai/core') {
|
|
96
|
+
console.log(`๐ฆ Release project resolved: solid-core-module (${packageName})`);
|
|
97
|
+
return { type: 'solid-core-module', cwdName, packageName, versionSourcePath: path_1.default.join(process.cwd(), 'package.json') };
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case 'solid-core-ui':
|
|
101
|
+
if (packageName === '@solidxai/core-ui') {
|
|
102
|
+
console.log(`๐ฆ Release project resolved: solid-core-ui (${packageName})`);
|
|
103
|
+
return { type: 'solid-core-ui', cwdName, packageName, versionSourcePath: path_1.default.join(process.cwd(), 'package.json') };
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
case 'solid-library-management':
|
|
107
|
+
if (solidApiPackageName === '@library-management/solid-api') {
|
|
108
|
+
console.log(`๐ฆ Release project resolved: solid-library-management (${solidApiPackageName})`);
|
|
109
|
+
return {
|
|
110
|
+
type: 'solid-library-management',
|
|
111
|
+
cwdName,
|
|
112
|
+
packageName: solidApiPackageName,
|
|
113
|
+
versionSourcePath: solidApiPackageJsonPath,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
console.error(`โ Could not resolve release project from folder "${cwdName}" and package name "${packageName || solidApiPackageName || 'unknown'}".`);
|
|
119
|
+
console.error(' Supported release folders are solidctl, solid-core-module, solid-core-ui, and solid-library-management.');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
37
122
|
function getCurrentBranch() {
|
|
38
123
|
return (0, child_process_1.execSync)('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
39
124
|
}
|
|
125
|
+
function getRequiredBranch(preid, mainBranch, devBranch) {
|
|
126
|
+
if (preid === 'alpha') {
|
|
127
|
+
return 'predev';
|
|
128
|
+
}
|
|
129
|
+
if (preid) {
|
|
130
|
+
return devBranch;
|
|
131
|
+
}
|
|
132
|
+
return mainBranch;
|
|
133
|
+
}
|
|
40
134
|
function exec(cmd, dryRun) {
|
|
41
135
|
if (dryRun) {
|
|
42
136
|
console.log(`[dry-run] ${cmd}`);
|
|
@@ -45,6 +139,518 @@ function exec(cmd, dryRun) {
|
|
|
45
139
|
(0, child_process_1.execSync)(cmd, { stdio: 'inherit' });
|
|
46
140
|
return '';
|
|
47
141
|
}
|
|
142
|
+
function sleep(ms) {
|
|
143
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
144
|
+
}
|
|
145
|
+
function shouldRunSandboxReleaseGate(project, preid) {
|
|
146
|
+
if (!SANDBOX_GATED_RELEASE_PROJECTS.has(project.type)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return preid === undefined || preid === 'beta';
|
|
150
|
+
}
|
|
151
|
+
function buildSandboxStatusPageUrl(sandboxId) {
|
|
152
|
+
return `${SANDBOX_STATUS_PAGE_BASE_URL}/${sandboxId}?viewMode=view&activeTab=page-provisioning-logs`;
|
|
153
|
+
}
|
|
154
|
+
function buildSandboxTestRunsPageUrl(sandboxId) {
|
|
155
|
+
return `${SANDBOX_STATUS_PAGE_BASE_URL}/${sandboxId}?viewMode=view&activeTab=page-test-runs`;
|
|
156
|
+
}
|
|
157
|
+
function formatTimestamp(date) {
|
|
158
|
+
return date.toLocaleString('en-IN', {
|
|
159
|
+
year: 'numeric',
|
|
160
|
+
month: 'short',
|
|
161
|
+
day: '2-digit',
|
|
162
|
+
hour: '2-digit',
|
|
163
|
+
minute: '2-digit',
|
|
164
|
+
second: '2-digit',
|
|
165
|
+
hour12: true,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function formatDuration(durationMs) {
|
|
169
|
+
const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));
|
|
170
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
171
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
172
|
+
const seconds = totalSeconds % 60;
|
|
173
|
+
if (hours > 0) {
|
|
174
|
+
return `${hours}h ${minutes}m ${seconds}s`;
|
|
175
|
+
}
|
|
176
|
+
if (minutes > 0) {
|
|
177
|
+
return `${minutes}m ${seconds}s`;
|
|
178
|
+
}
|
|
179
|
+
return `${seconds}s`;
|
|
180
|
+
}
|
|
181
|
+
function getExpectedVersion(project, versionType, preid) {
|
|
182
|
+
if (!project.versionSourcePath) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
const packageJson = readRequiredPackageJson(project.versionSourcePath);
|
|
186
|
+
if (!packageJson.version) {
|
|
187
|
+
console.error(`โ package.json is missing a version at ${project.versionSourcePath}`);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
return planNextVersion(packageJson.version, versionType, preid);
|
|
191
|
+
}
|
|
192
|
+
function formatSandboxReleaseName(project, plannedVersion) {
|
|
193
|
+
const label = project.packageName || project.type;
|
|
194
|
+
return plannedVersion ? `Release validation for ${label} ${plannedVersion}` : `Release validation for ${label}`;
|
|
195
|
+
}
|
|
196
|
+
function extractApiErrorMessage(payload, fallbackMessage) {
|
|
197
|
+
if (!payload || typeof payload !== 'object') {
|
|
198
|
+
return fallbackMessage;
|
|
199
|
+
}
|
|
200
|
+
const candidate = payload;
|
|
201
|
+
if (typeof candidate.error === 'string' && candidate.error.trim().length > 0) {
|
|
202
|
+
return candidate.error;
|
|
203
|
+
}
|
|
204
|
+
if (Array.isArray(candidate.message) && candidate.message.length > 0) {
|
|
205
|
+
return candidate.message.join(', ');
|
|
206
|
+
}
|
|
207
|
+
if (typeof candidate.message === 'string' && candidate.message.trim().length > 0) {
|
|
208
|
+
return candidate.message;
|
|
209
|
+
}
|
|
210
|
+
return fallbackMessage;
|
|
211
|
+
}
|
|
212
|
+
async function requestJson(url, init, fallbackMessage) {
|
|
213
|
+
const response = await fetch(url, init);
|
|
214
|
+
const rawBody = await response.text();
|
|
215
|
+
const parsedBody = rawBody ? JSON.parse(rawBody) : undefined;
|
|
216
|
+
if (!response.ok) {
|
|
217
|
+
throw new Error(extractApiErrorMessage(parsedBody, fallbackMessage));
|
|
218
|
+
}
|
|
219
|
+
return parsedBody;
|
|
220
|
+
}
|
|
221
|
+
async function promptSandboxReleaseCredentials() {
|
|
222
|
+
const answers = await inquirer_1.default.prompt([
|
|
223
|
+
{
|
|
224
|
+
type: 'input',
|
|
225
|
+
name: 'releaserName',
|
|
226
|
+
message: 'Your full name:',
|
|
227
|
+
validate: (value) => (value.trim().length > 0 ? true : 'Name is required.'),
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
type: 'input',
|
|
231
|
+
name: 'releaserEmail',
|
|
232
|
+
message: 'Your email address:',
|
|
233
|
+
validate: (value) => {
|
|
234
|
+
const trimmedValue = value.trim();
|
|
235
|
+
if (!trimmedValue) {
|
|
236
|
+
return 'Email is required.';
|
|
237
|
+
}
|
|
238
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmedValue) ? true : 'Enter a valid email address.';
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
type: 'input',
|
|
243
|
+
name: 'releaserMobile',
|
|
244
|
+
message: 'Your mobile number:',
|
|
245
|
+
validate: (value) => (value.trim().length > 0 ? true : 'Mobile number is required.'),
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
type: 'input',
|
|
249
|
+
name: 'username',
|
|
250
|
+
message: 'Sandbox microservice username:',
|
|
251
|
+
validate: (value) => (value.trim().length > 0 ? true : 'Username is required.'),
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: 'password',
|
|
255
|
+
name: 'password',
|
|
256
|
+
message: 'Sandbox microservice password:',
|
|
257
|
+
mask: '*',
|
|
258
|
+
validate: (value) => (value.trim().length > 0 ? true : 'Password is required.'),
|
|
259
|
+
},
|
|
260
|
+
]);
|
|
261
|
+
return {
|
|
262
|
+
releaserName: answers.releaserName.trim(),
|
|
263
|
+
releaserEmail: answers.releaserEmail.trim(),
|
|
264
|
+
releaserMobile: answers.releaserMobile.trim(),
|
|
265
|
+
username: answers.username.trim(),
|
|
266
|
+
password: answers.password,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
async function authenticateSandboxReleaseUser(credentials) {
|
|
270
|
+
const response = await requestJson(`${SANDBOX_BASE_API_URL}/api/iam/authenticate`, {
|
|
271
|
+
method: 'POST',
|
|
272
|
+
headers: {
|
|
273
|
+
'Content-Type': 'application/json',
|
|
274
|
+
},
|
|
275
|
+
body: JSON.stringify({
|
|
276
|
+
username: credentials.username,
|
|
277
|
+
password: credentials.password,
|
|
278
|
+
}),
|
|
279
|
+
}, 'Failed to authenticate with the sandbox microservice.');
|
|
280
|
+
const accessToken = response.data?.accessToken;
|
|
281
|
+
if (!accessToken) {
|
|
282
|
+
throw new Error('Sandbox microservice authentication did not return an access token.');
|
|
283
|
+
}
|
|
284
|
+
return accessToken;
|
|
285
|
+
}
|
|
286
|
+
async function launchReleaseValidationSandbox(project, accessToken, credentials, plannedVersion) {
|
|
287
|
+
const response = await requestJson(`${SANDBOX_BASE_API_URL}/api/sandbox/test-request`, {
|
|
288
|
+
method: 'POST',
|
|
289
|
+
headers: {
|
|
290
|
+
'Content-Type': 'application/json',
|
|
291
|
+
Authorization: `Bearer ${accessToken}`,
|
|
292
|
+
},
|
|
293
|
+
body: JSON.stringify({
|
|
294
|
+
name: credentials.releaserName,
|
|
295
|
+
emailAddress: credentials.releaserEmail,
|
|
296
|
+
companyName: SANDBOX_TEST_REQUEST_COMPANY_NAME,
|
|
297
|
+
mobile: credentials.releaserMobile,
|
|
298
|
+
}),
|
|
299
|
+
}, 'Failed to create the sandbox test request.');
|
|
300
|
+
if (!response.data?.id) {
|
|
301
|
+
throw new Error('Sandbox test request did not return a sandbox id.');
|
|
302
|
+
}
|
|
303
|
+
return response.data;
|
|
304
|
+
}
|
|
305
|
+
async function fetchSandboxStatus(sandboxId) {
|
|
306
|
+
const response = await requestJson(`${SANDBOX_BASE_API_URL}/api/sandbox/${sandboxId}`, {
|
|
307
|
+
method: 'GET',
|
|
308
|
+
headers: {
|
|
309
|
+
Accept: 'application/json',
|
|
310
|
+
},
|
|
311
|
+
}, `Failed to fetch sandbox status for sandbox ${sandboxId}.`);
|
|
312
|
+
return response.data;
|
|
313
|
+
}
|
|
314
|
+
function printSandboxLaunchMessage(sandbox) {
|
|
315
|
+
const sandboxName = sandbox.displayName || sandbox.slug || `sandbox-${sandbox.id}`;
|
|
316
|
+
const sandboxStatus = sandbox.status || 'UNKNOWN';
|
|
317
|
+
const statusPageUrl = buildSandboxStatusPageUrl(sandbox.id);
|
|
318
|
+
console.log(`๐งช Test sandbox launched: ${sandboxName}`);
|
|
319
|
+
console.log(`๐ Provisioning logs: ${statusPageUrl}`);
|
|
320
|
+
console.log(`โน๏ธ The test sandbox has been provisioned and we will wait for the automated test cases to finish before continuing with the release. In the meantime, you can open the sandbox microservice status page above to monitor provisioning progress and review details.`);
|
|
321
|
+
console.log(`๐ Current sandbox status: ${sandboxStatus}`);
|
|
322
|
+
}
|
|
323
|
+
async function waitForSandboxTerminalStatus(sandboxId) {
|
|
324
|
+
const startedAt = Date.now();
|
|
325
|
+
let lastLoggedStatus;
|
|
326
|
+
while (Date.now() - startedAt < SANDBOX_POLL_TIMEOUT_MS) {
|
|
327
|
+
const sandbox = await fetchSandboxStatus(sandboxId);
|
|
328
|
+
const currentStatus = sandbox.status || 'UNKNOWN';
|
|
329
|
+
if (currentStatus !== lastLoggedStatus) {
|
|
330
|
+
console.log(`โณ Sandbox ${sandbox.id} status: ${currentStatus}`);
|
|
331
|
+
lastLoggedStatus = currentStatus;
|
|
332
|
+
}
|
|
333
|
+
if (SANDBOX_SUCCESS_STATUSES.has(currentStatus) || SANDBOX_FAILURE_STATUSES.has(currentStatus)) {
|
|
334
|
+
return sandbox;
|
|
335
|
+
}
|
|
336
|
+
if (!SANDBOX_PENDING_STATUSES.has(currentStatus)) {
|
|
337
|
+
return sandbox;
|
|
338
|
+
}
|
|
339
|
+
await sleep(SANDBOX_POLL_INTERVAL_MS);
|
|
340
|
+
}
|
|
341
|
+
throw new Error(`Timed out waiting for sandbox ${sandboxId} to reach a terminal status after ${Math.floor(SANDBOX_POLL_TIMEOUT_MS / 1000)} seconds.`);
|
|
342
|
+
}
|
|
343
|
+
async function runSandboxReleaseGate(project, dryRun, preid, plannedVersion) {
|
|
344
|
+
if (!shouldRunSandboxReleaseGate(project, preid)) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (dryRun) {
|
|
348
|
+
console.log('[dry-run] Would prompt for sandbox microservice credentials, launch a validation sandbox, and wait for TEST_PASSED before publishing.');
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
console.log(`๐งช ${project.type} releases require sandbox validation before publishing.`);
|
|
352
|
+
const credentials = await promptSandboxReleaseCredentials();
|
|
353
|
+
const accessToken = await authenticateSandboxReleaseUser(credentials);
|
|
354
|
+
const sandbox = await launchReleaseValidationSandbox(project, accessToken, credentials, plannedVersion);
|
|
355
|
+
printSandboxLaunchMessage(sandbox);
|
|
356
|
+
const finalSandbox = await waitForSandboxTerminalStatus(sandbox.id);
|
|
357
|
+
const finalStatus = finalSandbox.status || 'UNKNOWN';
|
|
358
|
+
if (SANDBOX_SUCCESS_STATUSES.has(finalStatus)) {
|
|
359
|
+
console.log(`โ
Sandbox validation passed with status ${finalStatus}. Continuing with release...`);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
const testRunsPageUrl = buildSandboxTestRunsPageUrl(finalSandbox.id);
|
|
363
|
+
const failureReason = finalSandbox.failureReason ? ` Reason: ${finalSandbox.failureReason}` : '';
|
|
364
|
+
throw new Error(`Sandbox validation failed with status ${finalStatus}. Cancelling release.${failureReason} Review the failed test runs here: ${testRunsPageUrl}`);
|
|
365
|
+
}
|
|
366
|
+
function getReleaseOptions(options) {
|
|
367
|
+
const config = loadConfig();
|
|
368
|
+
return {
|
|
369
|
+
mainBranch: options.mainBranch || config.mainBranch,
|
|
370
|
+
devBranch: options.devBranch || config.devBranch,
|
|
371
|
+
reverseMerge: options.merge !== false && config.reverseMerge,
|
|
372
|
+
dryRun: options.dryRun || false,
|
|
373
|
+
force: options.force || false,
|
|
374
|
+
preid: options.preid,
|
|
375
|
+
isPrerelease: !!options.preid,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function validateReleaseBranch(preid, mainBranch, devBranch, force) {
|
|
379
|
+
const currentBranch = getCurrentBranch();
|
|
380
|
+
const requiredBranch = preid ? getRequiredBranch(preid, mainBranch, devBranch) : mainBranch;
|
|
381
|
+
if (currentBranch !== requiredBranch) {
|
|
382
|
+
if (force) {
|
|
383
|
+
console.log(`โ ๏ธ Not on ${requiredBranch} branch (on ${currentBranch}), but --force flag set. Continuing...`);
|
|
384
|
+
return currentBranch;
|
|
385
|
+
}
|
|
386
|
+
if (preid === 'alpha') {
|
|
387
|
+
console.error(`โ Must be on predev branch to publish alpha pre-releases. Currently on: ${currentBranch}`);
|
|
388
|
+
}
|
|
389
|
+
else if (preid) {
|
|
390
|
+
console.error(`โ Must be on ${devBranch} branch to publish ${preid} pre-releases. Currently on: ${currentBranch}`);
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
console.error(`โ Must be on ${mainBranch} branch to publish stable releases. Currently on: ${currentBranch}`);
|
|
394
|
+
}
|
|
395
|
+
console.error(' Use --force to override this check.');
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
return currentBranch;
|
|
399
|
+
}
|
|
400
|
+
function getVersionCommand(versionType, preid) {
|
|
401
|
+
if (preid) {
|
|
402
|
+
if (versionType === 'patch' || versionType === 'prerelease') {
|
|
403
|
+
return `npm version prerelease --preid=${preid}`;
|
|
404
|
+
}
|
|
405
|
+
if (versionType === 'preminor' || versionType === 'minor') {
|
|
406
|
+
return `npm version preminor --preid=${preid}`;
|
|
407
|
+
}
|
|
408
|
+
if (versionType === 'premajor' || versionType === 'major') {
|
|
409
|
+
return `npm version premajor --preid=${preid}`;
|
|
410
|
+
}
|
|
411
|
+
return `npm version prerelease --preid=${preid}`;
|
|
412
|
+
}
|
|
413
|
+
return `npm version ${versionType}`;
|
|
414
|
+
}
|
|
415
|
+
function parseVersion(version) {
|
|
416
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+)\.(\d+))?$/);
|
|
417
|
+
if (!match) {
|
|
418
|
+
throw new Error(`Unsupported version format: ${version}`);
|
|
419
|
+
}
|
|
420
|
+
return {
|
|
421
|
+
major: Number(match[1]),
|
|
422
|
+
minor: Number(match[2]),
|
|
423
|
+
patch: Number(match[3]),
|
|
424
|
+
prereleaseId: match[4],
|
|
425
|
+
prereleaseNumber: match[5] === undefined ? undefined : Number(match[5]),
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
function formatVersion(parsed) {
|
|
429
|
+
const base = `${parsed.major}.${parsed.minor}.${parsed.patch}`;
|
|
430
|
+
if (parsed.prereleaseId === undefined || parsed.prereleaseNumber === undefined) {
|
|
431
|
+
return base;
|
|
432
|
+
}
|
|
433
|
+
return `${base}-${parsed.prereleaseId}.${parsed.prereleaseNumber}`;
|
|
434
|
+
}
|
|
435
|
+
function planNextVersion(currentVersion, versionType, preid) {
|
|
436
|
+
const parsed = parseVersion(currentVersion);
|
|
437
|
+
if (!preid) {
|
|
438
|
+
if (versionType === 'minor') {
|
|
439
|
+
return formatVersion({ major: parsed.major, minor: parsed.minor + 1, patch: 0 });
|
|
440
|
+
}
|
|
441
|
+
if (versionType === 'major') {
|
|
442
|
+
return formatVersion({ major: parsed.major + 1, minor: 0, patch: 0 });
|
|
443
|
+
}
|
|
444
|
+
return formatVersion({ major: parsed.major, minor: parsed.minor, patch: parsed.patch + 1 });
|
|
445
|
+
}
|
|
446
|
+
if (versionType === 'minor' || versionType === 'preminor') {
|
|
447
|
+
return formatVersion({
|
|
448
|
+
major: parsed.major,
|
|
449
|
+
minor: parsed.minor + 1,
|
|
450
|
+
patch: 0,
|
|
451
|
+
prereleaseId: preid,
|
|
452
|
+
prereleaseNumber: 0,
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
if (versionType === 'major' || versionType === 'premajor') {
|
|
456
|
+
return formatVersion({
|
|
457
|
+
major: parsed.major + 1,
|
|
458
|
+
minor: 0,
|
|
459
|
+
patch: 0,
|
|
460
|
+
prereleaseId: preid,
|
|
461
|
+
prereleaseNumber: 0,
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
if (parsed.prereleaseId) {
|
|
465
|
+
return formatVersion({
|
|
466
|
+
major: parsed.major,
|
|
467
|
+
minor: parsed.minor,
|
|
468
|
+
patch: parsed.patch,
|
|
469
|
+
prereleaseId: preid,
|
|
470
|
+
prereleaseNumber: parsed.prereleaseId === preid ? (parsed.prereleaseNumber ?? 0) + 1 : 0,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
return formatVersion({
|
|
474
|
+
major: parsed.major,
|
|
475
|
+
minor: parsed.minor,
|
|
476
|
+
patch: parsed.patch + 1,
|
|
477
|
+
prereleaseId: preid,
|
|
478
|
+
prereleaseNumber: 0,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
function getMovingDockerTag(preid) {
|
|
482
|
+
if (preid) {
|
|
483
|
+
return preid;
|
|
484
|
+
}
|
|
485
|
+
return 'latest';
|
|
486
|
+
}
|
|
487
|
+
function copyDirectoryForDockerBuild(sourcePath, destinationPath) {
|
|
488
|
+
fs_1.default.cpSync(sourcePath, destinationPath, {
|
|
489
|
+
recursive: true,
|
|
490
|
+
filter: (currentPath) => {
|
|
491
|
+
const baseName = path_1.default.basename(currentPath);
|
|
492
|
+
return !['.git', 'node_modules', 'dist', 'coverage', '.DS_Store', 'logs', '.venv', '.pytest_cache'].includes(baseName);
|
|
493
|
+
},
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
function createSolidLibraryManagementDockerfile() {
|
|
497
|
+
return `FROM node:20-bookworm
|
|
498
|
+
|
|
499
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
500
|
+
WORKDIR /workspace/agent
|
|
501
|
+
|
|
502
|
+
RUN apt-get update \\
|
|
503
|
+
&& apt-get install -y python3 python3-pip python3-venv supervisor \\
|
|
504
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
505
|
+
|
|
506
|
+
RUN npm install -g @angular-devkit/schematics-cli
|
|
507
|
+
|
|
508
|
+
COPY agent /workspace/agent
|
|
509
|
+
|
|
510
|
+
RUN python3 -m venv /opt/agent-venv
|
|
511
|
+
RUN /bin/sh -lc ". /opt/agent-venv/bin/activate && cd /workspace/agent && pip install --no-cache-dir -e /workspace/agent/vendor/mini-swe-agent && pip install --no-cache-dir -e '.[full]'"
|
|
512
|
+
RUN mkdir -p /opt/prebuilt/agent-ui-dist
|
|
513
|
+
RUN cd /workspace/agent/agent-ui && npm i --legacy-peer-deps && npm run build -- --outDir /opt/prebuilt/agent-ui-dist --emptyOutDir
|
|
514
|
+
`;
|
|
515
|
+
}
|
|
516
|
+
async function runSharedReleaseFlow(versionType, options, project) {
|
|
517
|
+
const { mainBranch, devBranch, reverseMerge, dryRun, force, preid, isPrerelease } = getReleaseOptions(options);
|
|
518
|
+
const releaseStartedAt = new Date();
|
|
519
|
+
try {
|
|
520
|
+
console.log(`๐ Release started at: ${formatTimestamp(releaseStartedAt)}`);
|
|
521
|
+
const currentBranch = validateReleaseBranch(preid, mainBranch, devBranch, force);
|
|
522
|
+
const plannedVersion = getExpectedVersion(project, versionType, preid);
|
|
523
|
+
if (dryRun) {
|
|
524
|
+
console.log('๐งช Dry run mode - no changes will be made\n');
|
|
525
|
+
}
|
|
526
|
+
await runSandboxReleaseGate(project, dryRun, preid, plannedVersion);
|
|
527
|
+
const versionCmd = getVersionCommand(versionType, preid);
|
|
528
|
+
if (isPrerelease) {
|
|
529
|
+
console.log(`๐ Updating package version (pre-release: ${preid})...`);
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
console.log(`๐ Updating package version (${versionType})...`);
|
|
533
|
+
}
|
|
534
|
+
exec(versionCmd, dryRun);
|
|
535
|
+
console.log('๐ฆ Pushing to git (with tags)...');
|
|
536
|
+
exec('git push --follow-tags', dryRun);
|
|
537
|
+
console.log('๐ฆ Publishing package...');
|
|
538
|
+
if (isPrerelease) {
|
|
539
|
+
exec(`npm publish --tag ${preid}`, dryRun);
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
exec('npm publish', dryRun);
|
|
543
|
+
}
|
|
544
|
+
console.log('โ
Published successfully!\n');
|
|
545
|
+
if (!isPrerelease && reverseMerge) {
|
|
546
|
+
console.log(`๐ Merging ${mainBranch} into ${devBranch}...`);
|
|
547
|
+
exec(`git checkout ${devBranch}`, dryRun);
|
|
548
|
+
exec(`git pull origin ${devBranch}`, dryRun);
|
|
549
|
+
try {
|
|
550
|
+
exec(`git merge ${mainBranch} -m "chore: merge ${mainBranch} after publish"`, dryRun);
|
|
551
|
+
exec(`git push origin ${devBranch}`, dryRun);
|
|
552
|
+
console.log(`โ
Successfully merged ${mainBranch} into ${devBranch}\n`);
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
console.error('\nโ ๏ธ Merge conflict detected. Please resolve manually.');
|
|
556
|
+
console.error(` You are now on the ${devBranch} branch.`);
|
|
557
|
+
process.exit(1);
|
|
558
|
+
}
|
|
559
|
+
exec(`git checkout ${mainBranch}`, dryRun);
|
|
560
|
+
console.log(`๐ Back on ${mainBranch} branch`);
|
|
561
|
+
}
|
|
562
|
+
else if (!isPrerelease && !reverseMerge) {
|
|
563
|
+
console.log('โญ๏ธ Skipping reverse merge (--no-merge)');
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
console.log(`๐ Staying on ${currentBranch} branch`);
|
|
567
|
+
}
|
|
568
|
+
const releaseEndedAt = new Date();
|
|
569
|
+
console.log(`๐ Release finished at: ${formatTimestamp(releaseEndedAt)}`);
|
|
570
|
+
console.log(`โฑ๏ธ Total release duration: ${formatDuration(releaseEndedAt.getTime() - releaseStartedAt.getTime())}`);
|
|
571
|
+
console.log('\n๐ All done!');
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
const releaseEndedAt = new Date();
|
|
575
|
+
console.error(`๐ Release finished at: ${formatTimestamp(releaseEndedAt)}`);
|
|
576
|
+
console.error(`โฑ๏ธ Total release duration: ${formatDuration(releaseEndedAt.getTime() - releaseStartedAt.getTime())}`);
|
|
577
|
+
console.error('โ Error:', error instanceof Error ? error.message : error);
|
|
578
|
+
process.exit(1);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
function runSolidLibraryManagementReleaseFlow(versionType, options, project) {
|
|
582
|
+
const { mainBranch, devBranch, dryRun, force, preid, isPrerelease } = getReleaseOptions(options);
|
|
583
|
+
const solidApiPackageJsonPath = project.versionSourcePath || path_1.default.join(process.cwd(), 'solid-api', 'package.json');
|
|
584
|
+
const solidApiPackageJson = readRequiredPackageJson(solidApiPackageJsonPath);
|
|
585
|
+
const currentVersion = solidApiPackageJson.version;
|
|
586
|
+
const agentRepoPath = process.env.SOLIDX_AI_AGENT_PATH;
|
|
587
|
+
const imageRepository = 'solidxaiorg/solid-library-management-sandbox-base-image';
|
|
588
|
+
if (!currentVersion) {
|
|
589
|
+
console.error(`โ solid-api package.json is missing a version at ${solidApiPackageJsonPath}`);
|
|
590
|
+
process.exit(1);
|
|
591
|
+
}
|
|
592
|
+
if (!agentRepoPath) {
|
|
593
|
+
console.error('โ SOLIDX_AI_AGENT_PATH is not set. This release flow needs the local agent checkout.');
|
|
594
|
+
process.exit(1);
|
|
595
|
+
}
|
|
596
|
+
if (!fs_1.default.existsSync(agentRepoPath)) {
|
|
597
|
+
console.error(`โ SOLIDX_AI_AGENT_PATH does not exist: ${agentRepoPath}`);
|
|
598
|
+
process.exit(1);
|
|
599
|
+
}
|
|
600
|
+
const currentBranch = validateReleaseBranch(preid, mainBranch, devBranch, force);
|
|
601
|
+
const plannedVersion = planNextVersion(currentVersion, versionType, preid);
|
|
602
|
+
const movingDockerTag = getMovingDockerTag(preid);
|
|
603
|
+
const versionCmd = getVersionCommand(versionType, preid);
|
|
604
|
+
const buildContextRoot = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'solid-library-management-release-'));
|
|
605
|
+
const dockerfilePath = path_1.default.join(buildContextRoot, 'Dockerfile');
|
|
606
|
+
const agentCopyPath = path_1.default.join(buildContextRoot, 'agent');
|
|
607
|
+
const versionImageTag = `${imageRepository}:${plannedVersion}`;
|
|
608
|
+
const movingImageTag = `${imageRepository}:${movingDockerTag}`;
|
|
609
|
+
try {
|
|
610
|
+
console.log(`๐ณ Preparing solid-library-management sandbox base image release (${plannedVersion})...`);
|
|
611
|
+
console.log(`๐ฆ Docker image repository: ${imageRepository}`);
|
|
612
|
+
console.log(`๐ฆ Docker base image: node:20-bookworm`);
|
|
613
|
+
console.log(`๐ฆ Docker tags to publish: ${plannedVersion}, ${movingDockerTag}`);
|
|
614
|
+
console.log(`๐ฆ Agent source path: ${agentRepoPath}`);
|
|
615
|
+
if (dryRun) {
|
|
616
|
+
console.log('๐งช Dry run mode - no changes will be made\n');
|
|
617
|
+
}
|
|
618
|
+
console.log(`๐ Updating solid-api version (${isPrerelease ? `pre-release: ${preid}` : versionType})...`);
|
|
619
|
+
exec(`cd solid-api && ${versionCmd}`, dryRun);
|
|
620
|
+
if (!dryRun) {
|
|
621
|
+
const actualVersion = readRequiredPackageJson(solidApiPackageJsonPath).version;
|
|
622
|
+
if (!actualVersion) {
|
|
623
|
+
throw new Error('Failed to determine solid-api version after npm version.');
|
|
624
|
+
}
|
|
625
|
+
if (actualVersion !== plannedVersion) {
|
|
626
|
+
throw new Error(`Expected solid-api version ${plannedVersion}, but found ${actualVersion} after npm version.`);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
console.log('๐ฆ Creating Docker build context...');
|
|
630
|
+
if (!dryRun) {
|
|
631
|
+
copyDirectoryForDockerBuild(agentRepoPath, agentCopyPath);
|
|
632
|
+
fs_1.default.writeFileSync(dockerfilePath, createSolidLibraryManagementDockerfile(), 'utf-8');
|
|
633
|
+
}
|
|
634
|
+
console.log('๐ณ Building sandbox base image...');
|
|
635
|
+
exec(`docker build --progress=plain -t ${versionImageTag} -t ${movingImageTag} ${buildContextRoot}`, dryRun);
|
|
636
|
+
console.log('๐ฆ Pushing git commit and tags...');
|
|
637
|
+
exec('git push --follow-tags', dryRun);
|
|
638
|
+
console.log('๐ฆ Publishing Docker image...');
|
|
639
|
+
exec(`docker push ${versionImageTag}`, dryRun);
|
|
640
|
+
exec(`docker push ${movingImageTag}`, dryRun);
|
|
641
|
+
console.log(`๐ Staying on ${currentBranch} branch`);
|
|
642
|
+
console.log('\n๐ Docker image release completed!');
|
|
643
|
+
}
|
|
644
|
+
catch (error) {
|
|
645
|
+
console.error('โ Error:', error instanceof Error ? error.message : error);
|
|
646
|
+
process.exit(1);
|
|
647
|
+
}
|
|
648
|
+
finally {
|
|
649
|
+
if (!dryRun) {
|
|
650
|
+
fs_1.default.rmSync(buildContextRoot, { recursive: true, force: true });
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}
|
|
48
654
|
function registerReleaseCommand(program) {
|
|
49
655
|
program
|
|
50
656
|
.command('release [version-type]')
|
|
@@ -62,12 +668,12 @@ Examples:
|
|
|
62
668
|
$ solidctl release minor # minor: 0.0.12 โ 0.1.0
|
|
63
669
|
$ solidctl release major # major: 0.0.12 โ 1.0.0
|
|
64
670
|
|
|
65
|
-
Pre-releases
|
|
66
|
-
$ solidctl release --preid=alpha # 0.0.12 โ 0.0.13-alpha.0
|
|
671
|
+
Pre-releases:
|
|
672
|
+
$ solidctl release --preid=alpha # from predev: 0.0.12 โ 0.0.13-alpha.0
|
|
67
673
|
$ solidctl release --preid=alpha # 0.0.13-alpha.0 โ 0.0.13-alpha.1
|
|
68
|
-
$ solidctl release minor --preid=alpha # 0.0.12 โ 0.1.0-alpha.0
|
|
69
|
-
$ solidctl release --preid=beta # 0.0.13-alpha.1 โ 0.0.13-beta.0
|
|
70
|
-
$ solidctl release --preid=rc # 0.0.13-beta.1 โ 0.0.13-rc.0
|
|
674
|
+
$ solidctl release minor --preid=alpha # from predev: 0.0.12 โ 0.1.0-alpha.0
|
|
675
|
+
$ solidctl release --preid=beta # from dev: 0.0.13-alpha.1 โ 0.0.13-beta.0
|
|
676
|
+
$ solidctl release --preid=rc # from dev: 0.0.13-beta.1 โ 0.0.13-rc.0
|
|
71
677
|
|
|
72
678
|
Options:
|
|
73
679
|
$ solidctl release --dry-run # Preview without making changes
|
|
@@ -86,95 +692,21 @@ Configuration:
|
|
|
86
692
|
}
|
|
87
693
|
}
|
|
88
694
|
`)
|
|
89
|
-
.action((versionType = 'patch', options) => {
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
if (isPrerelease) {
|
|
107
|
-
console.error(`โ Must be on ${devBranch} branch to publish pre-releases. Currently on: ${currentBranch}`);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
console.error(`โ Must be on ${mainBranch} branch to publish stable releases. Currently on: ${currentBranch}`);
|
|
111
|
-
}
|
|
112
|
-
console.error(` Use --force to override this check.`);
|
|
113
|
-
process.exit(1);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (dryRun) {
|
|
117
|
-
console.log('๐งช Dry run mode - no changes will be made\n');
|
|
118
|
-
}
|
|
119
|
-
let versionCmd;
|
|
120
|
-
if (isPrerelease) {
|
|
121
|
-
if (versionType === 'patch' || versionType === 'prerelease') {
|
|
122
|
-
versionCmd = `npm version prerelease --preid=${preid}`;
|
|
123
|
-
}
|
|
124
|
-
else if (versionType === 'preminor' || versionType === 'minor') {
|
|
125
|
-
versionCmd = `npm version preminor --preid=${preid}`;
|
|
126
|
-
}
|
|
127
|
-
else if (versionType === 'premajor' || versionType === 'major') {
|
|
128
|
-
versionCmd = `npm version premajor --preid=${preid}`;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
versionCmd = `npm version prerelease --preid=${preid}`;
|
|
132
|
-
}
|
|
133
|
-
console.log(`๐ Updating package version (pre-release: ${preid})...`);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
versionCmd = `npm version ${versionType}`;
|
|
137
|
-
console.log(`๐ Updating package version (${versionType})...`);
|
|
138
|
-
}
|
|
139
|
-
exec(versionCmd, dryRun);
|
|
140
|
-
console.log('๐ฆ Pushing to git (with tags)...');
|
|
141
|
-
exec('git push --follow-tags', dryRun);
|
|
142
|
-
console.log('๐ฆ Publishing package...');
|
|
143
|
-
if (isPrerelease) {
|
|
144
|
-
exec(`npm publish --tag ${preid}`, dryRun);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
exec('npm publish', dryRun);
|
|
148
|
-
}
|
|
149
|
-
console.log('โ
Published successfully!\n');
|
|
150
|
-
if (!isPrerelease && reverseMerge) {
|
|
151
|
-
console.log(`๐ Merging ${mainBranch} into ${devBranch}...`);
|
|
152
|
-
exec(`git checkout ${devBranch}`, dryRun);
|
|
153
|
-
exec(`git pull origin ${devBranch}`, dryRun);
|
|
154
|
-
try {
|
|
155
|
-
exec(`git merge ${mainBranch} -m "chore: merge ${mainBranch} after publish"`, dryRun);
|
|
156
|
-
exec(`git push origin ${devBranch}`, dryRun);
|
|
157
|
-
console.log(`โ
Successfully merged ${mainBranch} into ${devBranch}\n`);
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
console.error(`\nโ ๏ธ Merge conflict detected. Please resolve manually.`);
|
|
161
|
-
console.error(` You are now on the ${devBranch} branch.`);
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
164
|
-
exec(`git checkout ${mainBranch}`, dryRun);
|
|
165
|
-
console.log(`๐ Back on ${mainBranch} branch`);
|
|
166
|
-
}
|
|
167
|
-
else if (!isPrerelease && !reverseMerge) {
|
|
168
|
-
console.log(`โญ๏ธ Skipping reverse merge (--no-merge)`);
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
console.log(`๐ Staying on ${currentBranch} branch`);
|
|
172
|
-
}
|
|
173
|
-
console.log('\n๐ All done!');
|
|
174
|
-
}
|
|
175
|
-
catch (error) {
|
|
176
|
-
console.error('โ Error:', error instanceof Error ? error.message : error);
|
|
177
|
-
process.exit(1);
|
|
695
|
+
.action(async (versionType = 'patch', options) => {
|
|
696
|
+
const project = resolveReleaseProject();
|
|
697
|
+
switch (project.type) {
|
|
698
|
+
case 'solidctl':
|
|
699
|
+
await runSharedReleaseFlow(versionType, options, project);
|
|
700
|
+
break;
|
|
701
|
+
case 'solid-core-module':
|
|
702
|
+
await runSharedReleaseFlow(versionType, options, project);
|
|
703
|
+
break;
|
|
704
|
+
case 'solid-core-ui':
|
|
705
|
+
await runSharedReleaseFlow(versionType, options, project);
|
|
706
|
+
break;
|
|
707
|
+
case 'solid-library-management':
|
|
708
|
+
runSolidLibraryManagementReleaseFlow(versionType, options, project);
|
|
709
|
+
break;
|
|
178
710
|
}
|
|
179
711
|
});
|
|
180
712
|
}
|