From 34d560adcf4020d8a2ccc2cd3c5b5ba2f7e491df Mon Sep 17 00:00:00 2001 From: tanzhenxin Date: Mon, 13 Apr 2026 18:24:13 +0800 Subject: [PATCH] fix(core): allow Unicode characters in agent names (#3194) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The agent name validation regex only permitted ASCII letters, numbers, hyphens, and underscores, silently rejecting agents with non-ASCII names (e.g., Chinese "项目管理"). Replace the regex with Unicode property escapes (\p{L}\p{N}) to allow letters and numbers from any script. Also guard the lowercase naming convention warning so it only fires when the name contains ASCII letters, since case is meaningless for CJK scripts. Fixes #3149 --- packages/core/src/subagents/validation.test.ts | 13 +++++++++++++ packages/core/src/subagents/validation.ts | 11 +++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/core/src/subagents/validation.test.ts b/packages/core/src/subagents/validation.test.ts index 27db9595f..420483b11 100644 --- a/packages/core/src/subagents/validation.test.ts +++ b/packages/core/src/subagents/validation.test.ts @@ -22,6 +22,11 @@ describe('SubagentValidator', () => { 'code_reviewer', 'agent123', 'my-helper', + '项目管理', + 'コードレビュー', + '코드리뷰', + '项目-manager', + 'проект_менеджер', ]; for (const name of validNames) { @@ -120,6 +125,14 @@ describe('SubagentValidator', () => { ); }); + it('should not warn about case for non-Latin names', () => { + const result = validator.validateName('项目管理'); + expect(result.isValid).toBe(true); + expect(result.warnings).not.toContain( + 'Consider using lowercase names for consistency', + ); + }); + it('should warn about mixed separators', () => { const result = validator.validateName('test-agent_helper'); expect(result.isValid).toBe(true); diff --git a/packages/core/src/subagents/validation.ts b/packages/core/src/subagents/validation.ts index abab2c72a..a885b14c4 100644 --- a/packages/core/src/subagents/validation.ts +++ b/packages/core/src/subagents/validation.ts @@ -116,8 +116,8 @@ export class SubagentValidator { errors.push('Name must be 50 characters or less'); } - // Check valid characters (alphanumeric, hyphens, underscores) - const validNameRegex = /^[a-zA-Z0-9_-]+$/; + // Check valid characters (Unicode letters/numbers, hyphens, underscores) + const validNameRegex = /^[\p{L}\p{N}_-]+$/u; if (!validNameRegex.test(trimmedName)) { errors.push( 'Name can only contain letters, numbers, hyphens, and underscores', @@ -147,8 +147,11 @@ export class SubagentValidator { errors.push(`"${trimmedName}" is a reserved name and cannot be used`); } - // Warnings for naming conventions - if (trimmedName !== trimmedName.toLowerCase()) { + // Warnings for naming conventions (only for names that have case distinctions) + if ( + trimmedName !== trimmedName.toLowerCase() && + /[a-zA-Z]/.test(trimmedName) + ) { warnings.push('Consider using lowercase names for consistency'); }