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'); }