@@ -519,6 +519,12 @@ def _get_extension_suppressions(mod_loaders):
519519 def _display_cached_help (self , help_index ):
520520 """Display help from cached help index without loading modules."""
521521 from azure .cli .core ._help import WELCOME_MESSAGE , PRIVACY_STATEMENT
522+ import re
523+
524+ def _strip_ansi (text ):
525+ """Remove ANSI color codes from text for length calculation."""
526+ ansi_escape = re .compile (r'\x1b\[[0-9;]*m' )
527+ return ansi_escape .sub ('' , text )
522528
523529 # Show privacy statement if first run
524530 ran_before = self .cli_ctx .config .getboolean ('core' , 'first_run' , fallback = False )
@@ -537,38 +543,49 @@ def _display_cached_help(self, help_index):
537543 groups = help_index .get ('groups' , {})
538544 commands = help_index .get ('commands' , {})
539545
540- # Calculate max name length including tags for proper alignment
541- def _get_display_len (name , tags ):
542- tag_len = len (tags ) + 1 if tags else 0 # +1 for space before tags
543- return len (name ) + tag_len
544-
545- max_len = 0
546- if groups :
547- max_len = max (max_len , max (_get_display_len (name , item .get ('tags' , '' )) for name , item in groups .items ()))
548- if commands :
549- max_len = max (max_len , max (_get_display_len (name , item .get ('tags' , '' )) for name , item in commands .items ()))
550-
551546 # Display subgroups
552547 if groups :
553548 print ("\n Subgroups:" )
549+ # Calculate max line length for groups only (matching knack's logic)
550+ max_len = 0
551+ for name , item in groups .items ():
552+ tags = item .get ('tags' , '' )
553+ tags_len = len (_strip_ansi (tags ))
554+ line_len = len (name ) + tags_len + (2 if tags_len else 1 )
555+ max_len = max (max_len , line_len )
556+
554557 for name in sorted (groups .keys ()):
555558 item = groups [name ]
556559 tags = item .get ('tags' , '' )
557560 summary = item .get ('summary' , '' )
558- name_with_tags = f"{ name } { tags } " if tags else name
559- padding = ' ' * (max_len - _get_display_len (name , tags ))
560- print (f" { name_with_tags } { padding } : { summary } " )
561+ # Calculate padding (matching knack's _get_padding_len logic)
562+ tags_len = len (_strip_ansi (tags ))
563+ line_len = len (name ) + tags_len + (2 if tags_len else 1 )
564+ pad_len = max_len - line_len + (1 if tags else 0 )
565+ padding = ' ' * pad_len
566+ # Format matches knack: name + padding + tags + " : " + summary
567+ print (f" { name } { padding } { tags } : { summary } " )
561568
562569 # Display commands
563570 if commands :
564571 print ("\n Commands:" )
572+ # Calculate max line length for commands only
573+ max_len = 0
574+ for name , item in commands .items ():
575+ tags = item .get ('tags' , '' )
576+ tags_len = len (_strip_ansi (tags ))
577+ line_len = len (name ) + tags_len + (2 if tags_len else 1 )
578+ max_len = max (max_len , line_len )
579+
565580 for name in sorted (commands .keys ()):
566581 item = commands [name ]
567582 tags = item .get ('tags' , '' )
568583 summary = item .get ('summary' , '' )
569- name_with_tags = f"{ name } { tags } " if tags else name
570- padding = ' ' * (max_len - _get_display_len (name , tags ))
571- print (f" { name_with_tags } { padding } : { summary } " )
584+ tags_len = len (_strip_ansi (tags ))
585+ line_len = len (name ) + tags_len + (2 if tags_len else 1 )
586+ pad_len = max_len - line_len + (1 if tags else 0 )
587+ padding = ' ' * pad_len
588+ print (f" { name } { padding } { tags } : { summary } " )
572589
573590 print ("\n To search AI knowledge base for examples, use: az find \" az \" " )
574591
0 commit comments