77from rich .progress import Progress , SpinnerColumn , TextColumn
88from rich .prompt import Prompt
99
10- from skillport .modules .skills import add_skill
11- from skillport .modules .skills .internal import detect_skills , fetch_github_source , parse_github_url
1210from skillport .modules .indexing import build_index
11+ from skillport .modules .skills import add_skill
12+ from skillport .modules .skills .internal import (
13+ detect_skills ,
14+ fetch_github_source_with_info ,
15+ parse_github_url ,
16+ )
17+
1318from ..context import get_config
14- from ..theme import console , stderr_console , is_interactive , print_error , print_success , print_warning
19+ from ..theme import (
20+ console ,
21+ is_interactive ,
22+ print_error ,
23+ print_success ,
24+ print_warning ,
25+ stderr_console ,
26+ )
1527
1628
1729def _is_external_source (source : str ) -> bool :
@@ -35,10 +47,11 @@ def _get_default_namespace(source: str) -> str:
3547 return Path (source .rstrip ("/" )).name
3648
3749
38- def _detect_skills_from_source (source : str ) -> tuple [list [str ], str , Path | None ]:
39- """Detect skills from source. Returns (skill_names, source_name, temp_dir)."""
50+ def _detect_skills_from_source (source : str ) -> tuple [list [str ], str , Path | None , str ]:
51+ """Detect skills from source. Returns (skill_names, source_name, temp_dir, commit_sha )."""
4052 source_name = _get_source_name (source )
4153 temp_dir : Path | None = None
54+ commit_sha : str = ""
4255
4356 if source .startswith ("https://" ):
4457 try :
@@ -50,27 +63,29 @@ def _detect_skills_from_source(source: str) -> tuple[list[str], str, Path | None
5063 transient = True ,
5164 ) as progress :
5265 progress .add_task (f"Fetching { source } ..." , total = None )
53- temp_dir = fetch_github_source (source )
66+ fetch_result = fetch_github_source_with_info (source )
67+ temp_dir = fetch_result .extracted_path
68+ commit_sha = fetch_result .commit_sha
5469
5570 skills = detect_skills (Path (temp_dir ))
5671 skill_names = [s .name for s in skills ] if skills else [source_name ]
57- return skill_names , source_name , temp_dir
72+ return skill_names , source_name , temp_dir , commit_sha
5873 except Exception as e :
5974 if temp_dir and Path (temp_dir ).exists ():
6075 shutil .rmtree (temp_dir , ignore_errors = True )
6176 print_warning (f"Could not fetch source: { e } " )
62- return [source_name ], source_name , None
77+ return [source_name ], source_name , None , ""
6378
6479 source_path = Path (source ).expanduser ().resolve ()
6580 if source_path .exists () and source_path .is_dir ():
6681 try :
6782 skills = detect_skills (source_path )
6883 skill_names = [s .name for s in skills ] if skills else [source_name ]
69- return skill_names , source_name , None
84+ return skill_names , source_name , None , ""
7085 except Exception :
71- return [source_name ], source_name , None
86+ return [source_name ], source_name , None , ""
7287
73- return [source_name ], source_name , None
88+ return [source_name ], source_name , None , ""
7489
7590
7691def add (
@@ -116,11 +131,12 @@ def add(
116131):
117132 """Add skills from various sources."""
118133 temp_dir : Path | None = None
134+ commit_sha : str = ""
119135
120136 try :
121137 # Interactive namespace selection for external sources
122138 if _is_external_source (source ) and keep_structure is None and namespace is None :
123- skill_names , source_name , temp_dir = _detect_skills_from_source (source )
139+ skill_names , source_name , temp_dir , commit_sha = _detect_skills_from_source (source )
124140 is_single = len (skill_names ) == 1
125141
126142 # Non-interactive mode: use sensible defaults
@@ -137,12 +153,12 @@ def add(
137153 console .print (f"\n [bold]Found { len (skill_names )} skill(s):[/bold] { skill_display } " )
138154 console .print ("[bold]Where to add?[/bold]" )
139155 if is_single :
140- console .print (f" [cyan ][1][/cyan ] Flat → skills/{ skill_names [0 ]} /" )
141- console .print (f" [cyan ][2][/cyan ] Namespace → skills/[dim]<ns>[/dim]/{ skill_names [0 ]} /" )
156+ console .print (f" [info ][1][/info ] Flat → skills/{ skill_names [0 ]} /" )
157+ console .print (f" [info ][2][/info ] Namespace → skills/[dim]<ns>[/dim]/{ skill_names [0 ]} /" )
142158 else :
143- console .print (f" [cyan ][1][/cyan ] Flat → skills/{ skill_names [0 ]} /, skills/{ skill_names [1 ]} /, ..." )
144- console .print (f" [cyan ][2][/cyan ] Namespace → skills/[dim]<ns>[/dim]/{ skill_names [0 ]} /, ..." )
145- console .print (" [cyan ][3][/cyan ] Skip" )
159+ console .print (f" [info ][1][/info ] Flat → skills/{ skill_names [0 ]} /, skills/{ skill_names [1 ]} /, ..." )
160+ console .print (f" [info ][2][/info ] Namespace → skills/[dim]<ns>[/dim]/{ skill_names [0 ]} /, ..." )
161+ console .print (" [info ][3][/info ] Skip" )
146162 choice = Prompt .ask ("Choice" , choices = ["1" , "2" , "3" ], default = "1" )
147163
148164 if choice == "3" :
@@ -163,6 +179,7 @@ def add(
163179 namespace = namespace ,
164180 name = name ,
165181 pre_fetched_dir = temp_dir ,
182+ pre_fetched_commit_sha = commit_sha ,
166183 )
167184
168185 # Auto-reindex if skills were added
0 commit comments