Compare commits

...

8 Commits

Author SHA1 Message Date
github-actions[bot]
50226a2eb8 chore(release): v0.8.0-preview.1 2026-01-22 08:19:07 +00:00
tanzhenxin
2aa681f610 Merge pull request #1578 from QwenLM/fix/pkg-dependence
fix prompts denpendence
2026-01-22 16:04:59 +08:00
LaZzyMan
3b6849be94 fix prompts denpendence 2026-01-22 15:48:54 +08:00
tanzhenxin
a7e55ccf43 Merge pull request #1576 from QwenLM/fix/pkg-dependence
fix github pkg dependence
2026-01-22 15:30:29 +08:00
LaZzyMan
c0d78a8f3c fix github pkg dependence 2026-01-22 15:14:55 +08:00
tanzhenxin
64eea4889d Merge pull request #1574 from QwenLM/fix/pkg-dependence
fix dependences of core pkg
2026-01-22 14:26:02 +08:00
LaZzyMan
aa80e738fb fix dependences of core pkg 2026-01-22 14:09:08 +08:00
tanzhenxin
06b64b07e7 Merge pull request #1534 from QwenLM/feat/extension
Feat/extension
2026-01-22 12:29:01 +08:00
10 changed files with 81 additions and 70 deletions

23
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@qwen-code/qwen-code",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@qwen-code/qwen-code",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"workspaces": [
"packages/*"
],
@@ -17343,7 +17343,7 @@
},
"packages/cli": {
"name": "@qwen-code/qwen-code",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"dependencies": {
"@google/genai": "1.30.0",
"@iarna/toml": "^2.2.5",
@@ -17355,7 +17355,6 @@
"comment-json": "^4.2.5",
"diff": "^7.0.0",
"dotenv": "^17.1.0",
"extract-zip": "^2.0.1",
"fzf": "^0.5.2",
"glob": "^10.5.0",
"highlight.js": "^11.11.1",
@@ -17365,7 +17364,6 @@
"ink-spinner": "^5.0.0",
"lowlight": "^3.3.0",
"open": "^10.1.2",
"prompts": "^2.4.2",
"qrcode-terminal": "^0.12.0",
"react": "^19.1.0",
"read-package-up": "^11.0.0",
@@ -17374,7 +17372,6 @@
"string-width": "^7.1.0",
"strip-ansi": "^7.1.0",
"strip-json-comments": "^3.1.1",
"tar": "^7.5.2",
"undici": "^6.22.0",
"update-notifier": "^7.3.1",
"wrap-ansi": "9.0.2",
@@ -17394,12 +17391,10 @@
"@types/diff": "^7.0.2",
"@types/dotenv": "^6.1.1",
"@types/node": "^20.11.24",
"@types/prompts": "^2.4.9",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/semver": "^7.7.0",
"@types/shell-quote": "^1.7.5",
"@types/tar": "^6.1.13",
"@types/yargs": "^17.0.32",
"archiver": "^7.0.1",
"ink-testing-library": "^4.0.0",
@@ -17982,11 +17977,12 @@
},
"packages/core": {
"name": "@qwen-code/qwen-code-core",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"hasInstallScript": true,
"dependencies": {
"@anthropic-ai/sdk": "^0.36.1",
"@google/genai": "1.30.0",
"@iarna/toml": "^2.2.5",
"@modelcontextprotocol/sdk": "^1.25.1",
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/exporter-logs-otlp-grpc": "^0.203.0",
@@ -18006,6 +18002,7 @@
"chokidar": "^4.0.3",
"diff": "^7.0.0",
"dotenv": "^17.1.0",
"extract-zip": "^2.0.1",
"fast-levenshtein": "^2.0.6",
"fast-uri": "^3.0.6",
"fdir": "^6.4.6",
@@ -18022,9 +18019,11 @@
"open": "^10.1.2",
"openai": "5.11.0",
"picomatch": "^4.0.1",
"prompts": "^2.4.2",
"shell-quote": "^1.8.3",
"simple-git": "^3.28.0",
"strip-ansi": "^7.1.0",
"tar": "^7.5.2",
"undici": "^6.22.0",
"uuid": "^9.0.1",
"ws": "^8.18.0"
@@ -18036,6 +18035,8 @@
"@types/fast-levenshtein": "^0.0.4",
"@types/minimatch": "^5.1.2",
"@types/picomatch": "^4.0.1",
"@types/prompts": "^2.4.9",
"@types/tar": "^6.1.13",
"@types/ws": "^8.5.10",
"msw": "^2.3.4",
"typescript": "^5.3.3",
@@ -21441,7 +21442,7 @@
},
"packages/test-utils": {
"name": "@qwen-code/qwen-code-test-utils",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"dev": true,
"license": "Apache-2.0",
"devDependencies": {
@@ -21453,7 +21454,7 @@
},
"packages/vscode-ide-companion": {
"name": "qwen-code-vscode-ide-companion",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"license": "LICENSE",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.25.1",

View File

@@ -1,6 +1,6 @@
{
"name": "@qwen-code/qwen-code",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"engines": {
"node": ">=20.0.0"
},
@@ -13,7 +13,7 @@
"url": "git+https://github.com/QwenLM/qwen-code.git"
},
"config": {
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.8.0"
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.8.0-preview.1"
},
"scripts": {
"start": "cross-env node scripts/start.js",

View File

@@ -1,6 +1,6 @@
{
"name": "@qwen-code/qwen-code",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"description": "Qwen Code",
"repository": {
"type": "git",
@@ -33,7 +33,7 @@
"dist"
],
"config": {
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.8.0"
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.8.0-preview.1"
},
"dependencies": {
"@google/genai": "1.30.0",
@@ -46,8 +46,6 @@
"comment-json": "^4.2.5",
"diff": "^7.0.0",
"dotenv": "^17.1.0",
"prompts": "^2.4.2",
"extract-zip": "^2.0.1",
"fzf": "^0.5.2",
"glob": "^10.5.0",
"highlight.js": "^11.11.1",
@@ -65,7 +63,6 @@
"string-width": "^7.1.0",
"strip-ansi": "^7.1.0",
"strip-json-comments": "^3.1.1",
"tar": "^7.5.2",
"undici": "^6.22.0",
"update-notifier": "^7.3.1",
"wrap-ansi": "9.0.2",
@@ -81,13 +78,11 @@
"@types/command-exists": "^1.2.3",
"@types/diff": "^7.0.2",
"@types/dotenv": "^6.1.1",
"@types/prompts": "^2.4.9",
"@types/node": "^20.11.24",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"@types/semver": "^7.7.0",
"@types/shell-quote": "^1.7.5",
"@types/tar": "^6.1.13",
"@types/yargs": "^17.0.32",
"archiver": "^7.0.1",
"ink-testing-library": "^4.0.0",

View File

@@ -23,6 +23,7 @@ vi.mock('./utils.js', () => ({
getLoadedExtensions: mockGetLoadedExtensions,
toOutputString: mockToOutputString,
}),
extensionToOutputString: mockToOutputString,
}));
vi.mock('../../utils/errors.js', () => ({

View File

@@ -6,7 +6,7 @@
import type { CommandModule } from 'yargs';
import { getErrorMessage } from '../../utils/errors.js';
import { getExtensionManager } from './utils.js';
import { extensionToOutputString, getExtensionManager } from './utils.js';
import { t } from '../../i18n/index.js';
export async function handleList() {
@@ -21,7 +21,7 @@ export async function handleList() {
console.log(
extensions
.map((extension, _): string =>
extensionManager.toOutputString(extension, process.cwd()),
extensionToOutputString(extension, extensionManager, process.cwd()),
)
.join('\n\n'),
);

View File

@@ -4,13 +4,15 @@
* SPDX-License-Identifier: Apache-2.0
*/
import { ExtensionManager } from '@qwen-code/qwen-code-core';
import { ExtensionManager, type Extension } from '@qwen-code/qwen-code-core';
import { loadSettings } from '../../config/settings.js';
import {
requestConsentOrFail,
requestConsentNonInteractive,
} from './consent.js';
import { isWorkspaceTrusted } from '../../config/trustedFolders.js';
import * as os from 'node:os';
import chalk from 'chalk';
export async function getExtensionManager(): Promise<ExtensionManager> {
const workspaceDir = process.cwd();
@@ -25,3 +27,53 @@ export async function getExtensionManager(): Promise<ExtensionManager> {
await extensionManager.refreshCache();
return extensionManager;
}
export function extensionToOutputString(
extension: Extension,
extensionManager: ExtensionManager,
workspaceDir: string,
): string {
const cwd = workspaceDir;
const userEnabled = extensionManager.isEnabled(
extension.config.name,
os.homedir(),
);
const workspaceEnabled = extensionManager.isEnabled(
extension.config.name,
cwd,
);
const status = workspaceEnabled ? chalk.green('✓') : chalk.red('✗');
let output = `${status} ${extension.config.name} (${extension.config.version})`;
output += `\n Path: ${extension.path}`;
if (extension.installMetadata) {
output += `\n Source: ${extension.installMetadata.source} (Type: ${extension.installMetadata.type})`;
if (extension.installMetadata.ref) {
output += `\n Ref: ${extension.installMetadata.ref}`;
}
if (extension.installMetadata.releaseTag) {
output += `\n Release tag: ${extension.installMetadata.releaseTag}`;
}
}
output += `\n Enabled (User): ${userEnabled}`;
output += `\n Enabled (Workspace): ${workspaceEnabled}`;
if (extension.contextFiles.length > 0) {
output += `\n Context files:`;
extension.contextFiles.forEach((contextFile) => {
output += `\n ${contextFile}`;
});
}
if (extension.commands && extension.commands.length > 0) {
output += `\n Commands:`;
extension.commands.forEach((command) => {
output += `\n /${command}`;
});
}
if (extension.config.mcpServers) {
output += `\n MCP servers:`;
Object.keys(extension.config.mcpServers).forEach((key) => {
output += `\n ${key}`;
});
}
return output;
}

View File

@@ -1,6 +1,6 @@
{
"name": "@qwen-code/qwen-code-core",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"description": "Qwen Code Core",
"repository": {
"type": "git",
@@ -37,6 +37,7 @@
"@opentelemetry/sdk-node": "^0.203.0",
"@types/html-to-text": "^9.0.4",
"@xterm/headless": "5.5.0",
"@iarna/toml": "^2.2.5",
"ajv": "^8.17.1",
"ajv-formats": "^3.0.0",
"async-mutex": "^0.5.0",
@@ -59,10 +60,13 @@
"mnemonist": "^0.40.3",
"open": "^10.1.2",
"openai": "5.11.0",
"prompts": "^2.4.2",
"picomatch": "^4.0.1",
"shell-quote": "^1.8.3",
"simple-git": "^3.28.0",
"strip-ansi": "^7.1.0",
"tar": "^7.5.2",
"extract-zip": "^2.0.1",
"undici": "^6.22.0",
"uuid": "^9.0.1",
"ws": "^8.18.0"
@@ -84,6 +88,8 @@
"@types/minimatch": "^5.1.2",
"@types/picomatch": "^4.0.1",
"@types/ws": "^8.5.10",
"@types/tar": "^6.1.13",
"@types/prompts": "^2.4.9",
"msw": "^2.3.4",
"typescript": "^5.3.3",
"vitest": "^3.1.1"

View File

@@ -36,7 +36,6 @@ import {
} from './github.js';
import type { LoadExtensionContext } from './variableSchema.js';
import { Override, type AllExtensionsEnablementConfig } from './override.js';
import chalk from 'chalk';
import { parseMarketplaceSource } from './marketplace.js';
import {
isGeminiExtensionConfig,
@@ -1056,49 +1055,6 @@ export class ExtensionManager {
);
}
/**
* Converts an extension to output string.
*/
toOutputString(extension: Extension, workspaceDir?: string): string {
const cwd = workspaceDir ?? this.workspaceDir;
const userEnabled = this.isEnabled(extension.config.name, os.homedir());
const workspaceEnabled = this.isEnabled(extension.config.name, cwd);
const status = workspaceEnabled ? chalk.green('✓') : chalk.red('✗');
let output = `${status} ${extension.config.name} (${extension.config.version})`;
output += `\n Path: ${extension.path}`;
if (extension.installMetadata) {
output += `\n Source: ${extension.installMetadata.source} (Type: ${extension.installMetadata.type})`;
if (extension.installMetadata.ref) {
output += `\n Ref: ${extension.installMetadata.ref}`;
}
if (extension.installMetadata.releaseTag) {
output += `\n Release tag: ${extension.installMetadata.releaseTag}`;
}
}
output += `\n Enabled (User): ${userEnabled}`;
output += `\n Enabled (Workspace): ${workspaceEnabled}`;
if (extension.contextFiles.length > 0) {
output += `\n Context files:`;
extension.contextFiles.forEach((contextFile) => {
output += `\n ${contextFile}`;
});
}
if (extension.commands && extension.commands.length > 0) {
output += `\n Commands:`;
extension.commands.forEach((command) => {
output += `\n /${command}`;
});
}
if (extension.config.mcpServers) {
output += `\n MCP servers:`;
Object.keys(extension.config.mcpServers).forEach((key) => {
output += `\n ${key}`;
});
}
return output;
}
async performWorkspaceExtensionMigration(
extensions: Extension[],
requestConsent: (options?: ExtensionRequestOptions) => Promise<void>,

View File

@@ -1,6 +1,6 @@
{
"name": "@qwen-code/qwen-code-test-utils",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"private": true,
"main": "src/index.ts",
"license": "Apache-2.0",

View File

@@ -2,7 +2,7 @@
"name": "qwen-code-vscode-ide-companion",
"displayName": "Qwen Code Companion",
"description": "Enable Qwen Code with direct access to your VS Code workspace.",
"version": "0.8.0",
"version": "0.8.0-preview.1",
"publisher": "qwenlm",
"icon": "assets/icon.png",
"repository": {