@@ -52,48 +52,46 @@ function capitalizePrefix(prefix) {
5252 . join ( "/" ) ;
5353}
5454
55- // --- Extract and normalize all prefixes in title ---
56- function extractPrefixes ( title ) {
57- const bracketMatch = title . match ( / ^ \s * \[ ( [ ^ \] ] + ) \] / ) ;
58- if ( bracketMatch ) {
59- const raw = bracketMatch [ 1 ]
60- . split ( / [ , ] + / )
61- . map ( ( p ) => p . trim ( ) )
62- . filter ( Boolean ) ;
63- return raw . map ( ( p ) => `[${ capitalizePrefix ( p ) } ]` ) ;
55+ // --- Extract and normalize all prefixes in title (merged into one [..] if multiple) ---
56+ function extractAndNormalizePrefixes ( title ) {
57+ // 1️⃣ Находим все подряд идущие [Префикс]
58+ const matches = [ ...title . matchAll ( / \[ ( [ ^ \] ] + ) \] / g) ] ;
59+ if ( matches . length ) {
60+ const combined = matches
61+ . map ( m => m [ 1 ] . split ( ',' ) . map ( p => p . trim ( ) ) . filter ( Boolean ) . map ( capitalizePrefix ) )
62+ . flat ( ) ;
63+ return {
64+ prefix : `[${ combined . join ( ', ' ) } ]` ,
65+ cleanTitle : title . replace ( / ^ ( \s * \[ [ ^ \] ] + \] \s * ) + / , '' ) . trim ( ) ,
66+ } ;
6467 }
6568
66- const match = title . match (
69+ // 2️⃣ Если префикс в виде "✅ chore:" или "Feat:"
70+ const singleMatch = title . match (
6771 / ^ ( [ ^ \w ] * ) ( b u g | f e a t | e n h a n c e m e n t | r e f a c t o r | d o c s | t e s t | c h o r e | t a s k | c o m p o s i t e | u x \/ u i | p r o p o s a l | i d e a | d i s c u s s i o n ) [: \- \s] / i
6872 ) ;
69- if ( match ) {
70- return [ `[${ capitalizePrefix ( match [ 2 ] ) } ]` ] ;
73+ if ( singleMatch ) {
74+ const normalized = capitalizePrefix ( singleMatch [ 2 ] ) ;
75+ return { prefix : `[${ normalized } ]` , cleanTitle : title . replace ( singleMatch [ 0 ] , '' ) . trim ( ) } ;
7176 }
7277
73- return [ ] ;
78+ return { prefix : '' , cleanTitle : title } ;
7479}
7580
76- // --- Normalize title: make sure prefix becomes [Prefix] ---
81+ // --- Normalize title ---
7782function normalizeTitlePrefixes ( title ) {
78- const prefixes = extractPrefixes ( title ) ;
79- if ( ! prefixes . length ) return title . trim ( ) ;
80-
81- let clean = title
82- . replace ( / ^ \s * (?: \[ ( [ ^ \] ] + ) \] | ( [ ^ \s : ] + ) ) \s * : ? \s * / i, "" )
83- . trim ( ) ;
84- return `${ prefixes . join ( ", " ) } ${ clean } ` ;
83+ const { prefix, cleanTitle } = extractAndNormalizePrefixes ( title ) ;
84+ return prefix ? `${ prefix } ${ cleanTitle } ` : cleanTitle ;
8585}
8686
8787// --- Classify title ---
8888function classifyTitle ( title ) {
89- const prefixes = extractPrefixes ( title ) ;
90- if ( ! prefixes . length ) return "Other" ;
89+ const { prefix } = extractAndNormalizePrefixes ( title ) ;
90+ if ( ! prefix ) return "Other" ;
9191
92- for ( const prefix of prefixes ) {
93- const clean = prefix . replace ( / [ \[ \] ] / g, "" ) . toLowerCase ( ) ;
94- if ( PREFIX_MAP [ clean ] ) return PREFIX_MAP [ clean ] ;
95- }
96- return "Other" ;
92+ // Берём первый префикс для классификации
93+ const firstPrefix = prefix . split ( ',' ) [ 0 ] . replace ( / [ \[ \] ] / g, '' ) . toLowerCase ( ) ;
94+ return PREFIX_MAP [ firstPrefix ] || "Other" ;
9795}
9896
9997// --- Fetch all closed PRs ---
0 commit comments