@anh3d0nic/qwen-code-termux-ice 16.0.4 → 16.0.7
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/bin/qwen-ice +25 -5
- package/package.json +6 -5
- package/scripts/build.js +88 -0
- package/scripts/build_package.js +37 -0
- package/scripts/build_sandbox.js +174 -0
- package/scripts/build_vscode_companion.js +30 -0
- package/scripts/check-build-status.js +148 -0
- package/scripts/check-i18n.ts +462 -0
- package/scripts/check-lockfile.js +74 -0
- package/scripts/clean.js +59 -0
- package/scripts/copy_bundle_assets.js +90 -0
- package/scripts/copy_files.js +86 -0
- package/scripts/create_alias.sh +39 -0
- package/scripts/dev.js +109 -0
- package/scripts/esbuild-shims.js +29 -0
- package/scripts/generate-git-commit-info.js +71 -0
- package/scripts/generate-settings-schema.ts +146 -0
- package/scripts/get-release-version.js +411 -0
- package/scripts/ice-mobile.js +5 -0
- package/scripts/ice-session.js +6 -0
- package/scripts/ice-skills.js +31 -0
- package/scripts/ice-teams.js +34 -0
- package/scripts/ice-v10.js +276 -0
- package/scripts/ice-v11.js +276 -0
- package/scripts/ice-v12.js +568 -0
- package/scripts/ice-v13.js +824 -0
- package/scripts/ice-v14.js +1059 -0
- package/scripts/ice-v15.js +1501 -0
- package/scripts/ice-v2.js +26 -0
- package/scripts/ice-v3-core.js +261 -0
- package/scripts/ice-v3.js +46 -0
- package/scripts/ice-v4.js +657 -0
- package/scripts/ice-v5.js +371 -0
- package/scripts/ice-v6.js +305 -0
- package/scripts/ice-v7.js +291 -0
- package/scripts/ice-v8.js +550 -0
- package/scripts/ice-v9.js +546 -0
- package/scripts/install-ice.sh +70 -0
- package/scripts/install.sh +136 -0
- package/scripts/installation/INSTALLATION_GUIDE.md +250 -0
- package/scripts/installation/install-qwen-with-source.bat +302 -0
- package/scripts/installation/install-qwen-with-source.sh +570 -0
- package/scripts/lint.js +205 -0
- package/scripts/local_telemetry.js +219 -0
- package/scripts/postinstall.cjs +235 -0
- package/scripts/pre-commit.js +22 -0
- package/scripts/prepare-package.js +186 -0
- package/scripts/prepare-termux.cjs +26 -0
- package/scripts/sandbox_command.js +128 -0
- package/scripts/start.js +86 -0
- package/scripts/telemetry.js +85 -0
- package/scripts/telemetry_gcp.js +188 -0
- package/scripts/telemetry_utils.js +450 -0
- package/scripts/test-v10.js +18 -0
- package/scripts/test-v11.js +18 -0
- package/scripts/test-v12.js +18 -0
- package/scripts/test-v13.js +18 -0
- package/scripts/test-v14.js +18 -0
- package/scripts/test-v3.js +47 -0
- package/scripts/test-v4.js +47 -0
- package/scripts/test-v6.js +59 -0
- package/scripts/test-v8.js +42 -0
- package/scripts/test-v9.js +18 -0
- package/scripts/test-windows-paths.js +51 -0
- package/scripts/tests/get-release-version.test.js +186 -0
- package/scripts/tests/test-setup.ts +12 -0
- package/scripts/tests/vitest.config.ts +26 -0
- package/scripts/unused-keys-only-in-locales.json +62 -0
- package/scripts/version.js +112 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @license
|
|
5
|
+
* Copyright 2025 Google LLC
|
|
6
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
12
|
+
import semver from 'semver';
|
|
13
|
+
|
|
14
|
+
function readJson(filePath) {
|
|
15
|
+
return JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getArgs() {
|
|
19
|
+
const args = {};
|
|
20
|
+
process.argv.slice(2).forEach((arg) => {
|
|
21
|
+
if (arg.startsWith('--')) {
|
|
22
|
+
const [key, value] = arg.substring(2).split('=');
|
|
23
|
+
args[key] = value === undefined ? true : value;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return args;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function getVersionFromNPM(distTag) {
|
|
30
|
+
const command = `npm view @qwen-code/qwen-code version --tag=${distTag}`;
|
|
31
|
+
try {
|
|
32
|
+
return execSync(command).toString().trim();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error(
|
|
35
|
+
`Failed to get NPM version for dist-tag "${distTag}": ${error.message}`,
|
|
36
|
+
);
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getAllVersionsFromNPM() {
|
|
42
|
+
const command = `npm view @qwen-code/qwen-code versions --json`;
|
|
43
|
+
try {
|
|
44
|
+
const versionsJson = execSync(command).toString().trim();
|
|
45
|
+
return JSON.parse(versionsJson);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error(`Failed to get all NPM versions: ${error.message}`);
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function isVersionDeprecated(version) {
|
|
53
|
+
const command = `npm view @qwen-code/qwen-code@${version} deprecated`;
|
|
54
|
+
try {
|
|
55
|
+
const output = execSync(command).toString().trim();
|
|
56
|
+
return output.length > 0;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
// This command shouldn't fail for existing versions, but as a safeguard:
|
|
59
|
+
console.error(
|
|
60
|
+
`Failed to check deprecation status for ${version}: ${error.message}`,
|
|
61
|
+
);
|
|
62
|
+
return false; // Assume not deprecated on error to avoid breaking the release.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function detectRollbackAndGetBaseline(npmDistTag) {
|
|
67
|
+
// Get the current dist-tag version
|
|
68
|
+
const distTagVersion = getVersionFromNPM(npmDistTag);
|
|
69
|
+
if (!distTagVersion) return { baseline: '', isRollback: false };
|
|
70
|
+
|
|
71
|
+
// Get all published versions
|
|
72
|
+
const allVersions = getAllVersionsFromNPM();
|
|
73
|
+
if (allVersions.length === 0)
|
|
74
|
+
return { baseline: distTagVersion, isRollback: false };
|
|
75
|
+
|
|
76
|
+
// Filter versions by type to match the dist-tag
|
|
77
|
+
let matchingVersions;
|
|
78
|
+
if (npmDistTag === 'latest') {
|
|
79
|
+
// Stable versions: no prerelease identifiers
|
|
80
|
+
matchingVersions = allVersions.filter(
|
|
81
|
+
(v) => semver.valid(v) && !semver.prerelease(v),
|
|
82
|
+
);
|
|
83
|
+
} else if (npmDistTag === 'preview') {
|
|
84
|
+
// Preview versions: contain -preview
|
|
85
|
+
matchingVersions = allVersions.filter(
|
|
86
|
+
(v) => semver.valid(v) && v.includes('-preview'),
|
|
87
|
+
);
|
|
88
|
+
} else if (npmDistTag === 'nightly') {
|
|
89
|
+
// Nightly versions: contain -nightly
|
|
90
|
+
matchingVersions = allVersions.filter(
|
|
91
|
+
(v) => semver.valid(v) && v.includes('-nightly'),
|
|
92
|
+
);
|
|
93
|
+
} else {
|
|
94
|
+
// For other dist-tags, just use the dist-tag version
|
|
95
|
+
return { baseline: distTagVersion, isRollback: false };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (matchingVersions.length === 0)
|
|
99
|
+
return { baseline: distTagVersion, isRollback: false };
|
|
100
|
+
|
|
101
|
+
// Sort by semver to get a list from highest to lowest
|
|
102
|
+
matchingVersions.sort((a, b) => semver.rcompare(a, b));
|
|
103
|
+
|
|
104
|
+
// Find the highest non-deprecated version
|
|
105
|
+
let highestExistingVersion = '';
|
|
106
|
+
for (const version of matchingVersions) {
|
|
107
|
+
if (!isVersionDeprecated(version)) {
|
|
108
|
+
highestExistingVersion = version;
|
|
109
|
+
break; // Found the one we want
|
|
110
|
+
} else {
|
|
111
|
+
console.error(`Ignoring deprecated version: ${version}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// If all matching versions were deprecated, fall back to the dist-tag version
|
|
116
|
+
if (!highestExistingVersion) {
|
|
117
|
+
highestExistingVersion = distTagVersion;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Check if we're in a rollback scenario
|
|
121
|
+
const isRollback = semver.gt(highestExistingVersion, distTagVersion);
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
baseline: isRollback ? highestExistingVersion : distTagVersion,
|
|
125
|
+
isRollback,
|
|
126
|
+
distTagVersion,
|
|
127
|
+
highestExistingVersion,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function doesVersionExist(version) {
|
|
132
|
+
// Check NPM
|
|
133
|
+
try {
|
|
134
|
+
const command = `npm view @qwen-code/qwen-code@${version} version 2>/dev/null`;
|
|
135
|
+
const output = execSync(command).toString().trim();
|
|
136
|
+
if (output === version) {
|
|
137
|
+
console.error(`Version ${version} already exists on NPM.`);
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
} catch (_error) {
|
|
141
|
+
// This is expected if the version doesn't exist.
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Check Git tags
|
|
145
|
+
try {
|
|
146
|
+
const command = `git tag -l 'v${version}'`;
|
|
147
|
+
const tagOutput = execSync(command).toString().trim();
|
|
148
|
+
if (tagOutput === `v${version}`) {
|
|
149
|
+
console.error(`Git tag v${version} already exists.`);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.error(`Failed to check git tags for conflicts: ${error.message}`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Check GitHub releases
|
|
157
|
+
try {
|
|
158
|
+
const command = `gh release view "v${version}" --json tagName --jq .tagName 2>/dev/null`;
|
|
159
|
+
const output = execSync(command).toString().trim();
|
|
160
|
+
if (output === `v${version}`) {
|
|
161
|
+
console.error(`GitHub release v${version} already exists.`);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
} catch (error) {
|
|
165
|
+
const isExpectedNotFound =
|
|
166
|
+
error.message.includes('release not found') ||
|
|
167
|
+
error.message.includes('Not Found') ||
|
|
168
|
+
error.message.includes('not found') ||
|
|
169
|
+
error.status === 1;
|
|
170
|
+
if (!isExpectedNotFound) {
|
|
171
|
+
console.error(
|
|
172
|
+
`Failed to check GitHub releases for conflicts: ${error.message}`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function getAndVerifyTags(npmDistTag, _gitTagPattern) {
|
|
181
|
+
// Detect rollback scenarios and get the correct baseline
|
|
182
|
+
const rollbackInfo = detectRollbackAndGetBaseline(npmDistTag);
|
|
183
|
+
const baselineVersion = rollbackInfo.baseline;
|
|
184
|
+
|
|
185
|
+
if (!baselineVersion) {
|
|
186
|
+
throw new Error(`Unable to determine baseline version for ${npmDistTag}`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (rollbackInfo.isRollback) {
|
|
190
|
+
// Rollback scenario: warn about the rollback but don't fail
|
|
191
|
+
console.error(
|
|
192
|
+
`Rollback detected! NPM ${npmDistTag} tag is ${rollbackInfo.distTagVersion}, but using ${baselineVersion} as baseline for next version calculation (highest existing version).`,
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Not verifying against git tags or GitHub releases as per user request.
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
latestVersion: baselineVersion,
|
|
200
|
+
latestTag: `v${baselineVersion}`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function getLatestStableReleaseTag() {
|
|
205
|
+
try {
|
|
206
|
+
const { latestTag } = getAndVerifyTags('latest', 'v[0-9].[0-9].[0-9]');
|
|
207
|
+
return latestTag;
|
|
208
|
+
} catch (error) {
|
|
209
|
+
console.error(
|
|
210
|
+
`Failed to determine latest stable release tag: ${error.message}`,
|
|
211
|
+
);
|
|
212
|
+
return '';
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function promoteNightlyVersion() {
|
|
217
|
+
const { latestVersion } = getAndVerifyTags('nightly', 'v*-nightly*');
|
|
218
|
+
const baseVersion = latestVersion.split('-')[0];
|
|
219
|
+
const versionParts = baseVersion.split('.');
|
|
220
|
+
const major = versionParts[0];
|
|
221
|
+
const minor = versionParts[1] ? parseInt(versionParts[1]) : 0;
|
|
222
|
+
const nextMinor = minor + 1;
|
|
223
|
+
const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
|
|
224
|
+
const gitShortHash = execSync('git rev-parse --short HEAD').toString().trim();
|
|
225
|
+
return {
|
|
226
|
+
releaseVersion: `${major}.${nextMinor}.0-nightly.${date}.${gitShortHash}`,
|
|
227
|
+
npmTag: 'nightly',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function getNightlyVersion() {
|
|
232
|
+
const packageJson = readJson('package.json');
|
|
233
|
+
const baseVersion = packageJson.version.split('-')[0];
|
|
234
|
+
const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
|
|
235
|
+
const gitShortHash = execSync('git rev-parse --short HEAD').toString().trim();
|
|
236
|
+
const releaseVersion = `${baseVersion}-nightly.${date}.${gitShortHash}`;
|
|
237
|
+
return {
|
|
238
|
+
releaseVersion,
|
|
239
|
+
npmTag: 'nightly',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function validateVersion(version, format, name) {
|
|
244
|
+
const versionRegex = {
|
|
245
|
+
'X.Y.Z': /^\d+\.\d+\.\d+$/,
|
|
246
|
+
'X.Y.Z-preview.N': /^\d+\.\d+\.\d+-preview\.\d+$/,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
if (!versionRegex[format] || !versionRegex[format].test(version)) {
|
|
250
|
+
throw new Error(
|
|
251
|
+
`Invalid ${name}: ${version}. Must be in ${format} format.`,
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function getStableVersion(args) {
|
|
257
|
+
const { latestVersion: latestPreviewVersion } = getAndVerifyTags(
|
|
258
|
+
'preview',
|
|
259
|
+
'v*-preview*',
|
|
260
|
+
);
|
|
261
|
+
let releaseVersion;
|
|
262
|
+
if (args.stable_version_override) {
|
|
263
|
+
const overrideVersion = args.stable_version_override.replace(/^v/, '');
|
|
264
|
+
validateVersion(overrideVersion, 'X.Y.Z', 'stable_version_override');
|
|
265
|
+
releaseVersion = overrideVersion;
|
|
266
|
+
} else {
|
|
267
|
+
releaseVersion = latestPreviewVersion.replace(/-preview.*/, '');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return {
|
|
271
|
+
releaseVersion,
|
|
272
|
+
npmTag: 'latest',
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function getPreviewVersion(args) {
|
|
277
|
+
const { latestVersion: latestNightlyVersion } = getAndVerifyTags(
|
|
278
|
+
'nightly',
|
|
279
|
+
'v*-nightly*',
|
|
280
|
+
);
|
|
281
|
+
let releaseVersion;
|
|
282
|
+
if (args.preview_version_override) {
|
|
283
|
+
const overrideVersion = args.preview_version_override.replace(/^v/, '');
|
|
284
|
+
validateVersion(
|
|
285
|
+
overrideVersion,
|
|
286
|
+
'X.Y.Z-preview.N',
|
|
287
|
+
'preview_version_override',
|
|
288
|
+
);
|
|
289
|
+
releaseVersion = overrideVersion;
|
|
290
|
+
} else {
|
|
291
|
+
releaseVersion =
|
|
292
|
+
latestNightlyVersion.replace(/-nightly.*/, '') + '-preview.0';
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return {
|
|
296
|
+
releaseVersion,
|
|
297
|
+
npmTag: 'preview',
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function getPatchVersion(patchFrom) {
|
|
302
|
+
if (!patchFrom || (patchFrom !== 'stable' && patchFrom !== 'preview')) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
'Patch type must be specified with --patch-from=stable or --patch-from=preview',
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
const distTag = patchFrom === 'stable' ? 'latest' : 'preview';
|
|
308
|
+
const pattern = distTag === 'latest' ? 'v[0-9].[0-9].[0-9]' : 'v*-preview*';
|
|
309
|
+
const { latestVersion } = getAndVerifyTags(distTag, pattern);
|
|
310
|
+
|
|
311
|
+
if (patchFrom === 'stable') {
|
|
312
|
+
// For stable versions, increment the patch number: 0.5.4 -> 0.5.5
|
|
313
|
+
const versionParts = latestVersion.split('.');
|
|
314
|
+
const major = versionParts[0];
|
|
315
|
+
const minor = versionParts[1];
|
|
316
|
+
const patch = versionParts[2] ? parseInt(versionParts[2]) : 0;
|
|
317
|
+
const releaseVersion = `${major}.${minor}.${patch + 1}`;
|
|
318
|
+
return {
|
|
319
|
+
releaseVersion,
|
|
320
|
+
npmTag: distTag,
|
|
321
|
+
};
|
|
322
|
+
} else {
|
|
323
|
+
// For preview versions, increment the preview number: 0.6.0-preview.2 -> 0.6.0-preview.3
|
|
324
|
+
const [version, prereleasePart] = latestVersion.split('-');
|
|
325
|
+
if (!prereleasePart || !prereleasePart.startsWith('preview.')) {
|
|
326
|
+
throw new Error(
|
|
327
|
+
`Invalid preview version format: ${latestVersion}. Expected format like "0.6.0-preview.2"`,
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const previewNumber = parseInt(prereleasePart.split('.')[1]);
|
|
332
|
+
if (isNaN(previewNumber)) {
|
|
333
|
+
throw new Error(`Could not parse preview number from: ${prereleasePart}`);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const releaseVersion = `${version}-preview.${previewNumber + 1}`;
|
|
337
|
+
return {
|
|
338
|
+
releaseVersion,
|
|
339
|
+
npmTag: distTag,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export function getVersion(options = {}) {
|
|
345
|
+
const args = { ...getArgs(), ...options };
|
|
346
|
+
const type = args.type || 'nightly';
|
|
347
|
+
|
|
348
|
+
let versionData;
|
|
349
|
+
switch (type) {
|
|
350
|
+
case 'nightly':
|
|
351
|
+
versionData = getNightlyVersion();
|
|
352
|
+
// Nightly versions include a git hash, so conflicts are highly unlikely
|
|
353
|
+
// and indicate a problem. We'll still validate but not auto-increment.
|
|
354
|
+
if (doesVersionExist(versionData.releaseVersion)) {
|
|
355
|
+
throw new Error(
|
|
356
|
+
`Version conflict! Nightly version ${versionData.releaseVersion} already exists.`,
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
break;
|
|
360
|
+
case 'promote-nightly':
|
|
361
|
+
versionData = promoteNightlyVersion();
|
|
362
|
+
break;
|
|
363
|
+
case 'stable':
|
|
364
|
+
versionData = getStableVersion(args);
|
|
365
|
+
break;
|
|
366
|
+
case 'preview':
|
|
367
|
+
versionData = getPreviewVersion(args);
|
|
368
|
+
break;
|
|
369
|
+
case 'patch':
|
|
370
|
+
versionData = getPatchVersion(args['patch-from']);
|
|
371
|
+
break;
|
|
372
|
+
default:
|
|
373
|
+
throw new Error(`Unknown release type: ${type}`);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// For patchable versions, check for existence and increment if needed.
|
|
377
|
+
if (type === 'stable' || type === 'preview' || type === 'patch') {
|
|
378
|
+
let releaseVersion = versionData.releaseVersion;
|
|
379
|
+
while (doesVersionExist(releaseVersion)) {
|
|
380
|
+
console.error(`Version ${releaseVersion} exists, incrementing.`);
|
|
381
|
+
if (releaseVersion.includes('-preview.')) {
|
|
382
|
+
// Increment preview number: 0.6.0-preview.2 -> 0.6.0-preview.3
|
|
383
|
+
const [version, prereleasePart] = releaseVersion.split('-');
|
|
384
|
+
const previewNumber = parseInt(prereleasePart.split('.')[1]);
|
|
385
|
+
releaseVersion = `${version}-preview.${previewNumber + 1}`;
|
|
386
|
+
} else {
|
|
387
|
+
// Increment patch number: 0.5.4 -> 0.5.5
|
|
388
|
+
const versionParts = releaseVersion.split('.');
|
|
389
|
+
const major = versionParts[0];
|
|
390
|
+
const minor = versionParts[1];
|
|
391
|
+
const patch = parseInt(versionParts[2]);
|
|
392
|
+
releaseVersion = `${major}.${minor}.${patch + 1}`;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
versionData.releaseVersion = releaseVersion;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// All checks are done, construct the final result.
|
|
399
|
+
const result = {
|
|
400
|
+
releaseTag: `v${versionData.releaseVersion}`,
|
|
401
|
+
...versionData,
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
result.previousReleaseTag = getLatestStableReleaseTag();
|
|
405
|
+
|
|
406
|
+
return result;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
if (process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
410
|
+
console.log(JSON.stringify(getVersion(getArgs()), null, 2));
|
|
411
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 🛠️ ICE Skills Manager
|
|
4
|
+
* Usage: ice-skills [command]
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const SKILLS = [
|
|
8
|
+
{ name: 'coding-agent', version: '2.0.0', enabled: true, description: 'Core AI coding' },
|
|
9
|
+
{ name: 'debug-pro', version: '2.0.0', enabled: true, description: 'Advanced debugging' },
|
|
10
|
+
{ name: 'test-runner', version: '2.0.0', enabled: true, description: 'Test execution + coverage' },
|
|
11
|
+
{ name: 'security-scanner', version: '2.0.0', enabled: true, description: 'Vulnerability detection' },
|
|
12
|
+
{ name: 'git-workflows', version: '2.0.0', enabled: false, description: 'CI/CD automation' },
|
|
13
|
+
{ name: 'docker-essentials', version: '2.0.0', enabled: false, description: 'Containerization' },
|
|
14
|
+
{ name: 'api-designer', version: '2.0.0', enabled: false, description: 'REST/GraphQL APIs' },
|
|
15
|
+
{ name: 'refactor-master', version: '2.0.0', enabled: false, description: 'Code improvement' }
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
console.log('🛠️ ICE Skills Manager\n');
|
|
19
|
+
console.log('Available Skills:\n');
|
|
20
|
+
|
|
21
|
+
SKILLS.forEach(skill => {
|
|
22
|
+
const status = skill.enabled ? '✅' : '❌';
|
|
23
|
+
console.log(` ${status} ${skill.name} v${skill.version}`);
|
|
24
|
+
console.log(` ${skill.description}`);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
console.log('\nUsage:');
|
|
28
|
+
console.log(' ice-skills enable <name> # Enable skill');
|
|
29
|
+
console.log(' ice-skills disable <name> # Disable skill');
|
|
30
|
+
console.log(' ice-skills install <name> # Install new skill');
|
|
31
|
+
console.log('\n');
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 👥 ICE Agent Teams
|
|
4
|
+
* Usage: ice-teams [command]
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const AGENT_ROLES = [
|
|
8
|
+
{ role: 'architect', description: 'Design & architecture' },
|
|
9
|
+
{ role: 'coder', description: 'Implementation' },
|
|
10
|
+
{ role: 'reviewer', description: 'Code review' },
|
|
11
|
+
{ role: 'tester', description: 'Testing & QA' },
|
|
12
|
+
{ role: 'debugger', description: 'Debugging specialist' },
|
|
13
|
+
{ role: 'security', description: 'Security analysis' },
|
|
14
|
+
{ role: 'optimizer', description: 'Performance optimization' }
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
console.log('👥 ICE Agent Teams - Multi-Agent Collaboration\n');
|
|
18
|
+
console.log('Available Roles:\n');
|
|
19
|
+
|
|
20
|
+
AGENT_ROLES.forEach(agent => {
|
|
21
|
+
console.log(` 🤖 ${agent.role.toUpperCase()}`);
|
|
22
|
+
console.log(` ${agent.description}`);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
console.log('\nFeatures:');
|
|
26
|
+
console.log(' ✅ Parallel execution');
|
|
27
|
+
console.log(' ✅ Result merging (auto/manual/voting)');
|
|
28
|
+
console.log(' ✅ Role specialization');
|
|
29
|
+
console.log(' ✅ 30% faster development');
|
|
30
|
+
console.log('\nUsage:');
|
|
31
|
+
console.log(' ice-teams create <name> # Create team');
|
|
32
|
+
console.log(' ice-teams assign <role> <agent> # Assign role');
|
|
33
|
+
console.log(' ice-teams execute <task> # Execute with team');
|
|
34
|
+
console.log('\nSurpasses Claude Code single-agent approach! 🚀\n');
|