@@ -318,13 +318,14 @@ type pluginCLIAvailableList struct {
318318}
319319
320320type pluginCLIMarketplaceEntry struct {
321- Name string `json:"name"`
322- Source string `json:"source,omitempty"`
323- Repo string `json:"repo,omitempty"`
324- URL string `json:"url,omitempty"`
325- Path string `json:"path,omitempty"`
326- Package string `json:"package,omitempty"`
327- InstallLocation string `json:"installLocation,omitempty"`
321+ Name string `json:"name"`
322+ Source string `json:"source,omitempty"`
323+ Repo string `json:"repo,omitempty"`
324+ URL string `json:"url,omitempty"`
325+ Path string `json:"path,omitempty"`
326+ Package string `json:"package,omitempty"`
327+ SparsePaths []string `json:"sparsePaths,omitempty"`
328+ InstallLocation string `json:"installLocation,omitempty"`
328329}
329330
330331func runPluginCLI (ctx context.Context , state * bootstrap.State , args []string , stdout io.Writer , stderr io.Writer ) int {
@@ -717,6 +718,9 @@ func runPluginMarketplaceListCLI(state *bootstrap.State, args []string, stdout i
717718 if source := pluginCLIMarketplaceSourceText (marketplace ); source != "" {
718719 fmt .Fprintf (stdout , " Source: %s\n " , source )
719720 }
721+ if len (marketplace .SparsePaths ) > 0 {
722+ fmt .Fprintf (stdout , " Sparse paths: %s\n " , strings .Join (marketplace .SparsePaths , ", " ))
723+ }
720724 if marketplace .InstallLocation != "" {
721725 fmt .Fprintf (stdout , " Install location: %s\n " , marketplace .InstallLocation )
722726 }
@@ -1184,7 +1188,11 @@ func pluginCLIMarketplaceEntries(settings contracts.Settings) []pluginCLIMarketp
11841188 switch sourceType {
11851189 case "github" :
11861190 entry .Repo = pluginCLIStringFromMap (source , "repo" )
1187- case "git" , "url" :
1191+ entry .SparsePaths = pluginCLIStringSliceFromMap (source , "sparsePaths" )
1192+ case "git" :
1193+ entry .URL = pluginCLIStringFromMap (source , "url" )
1194+ entry .SparsePaths = pluginCLIStringSliceFromMap (source , "sparsePaths" )
1195+ case "url" :
11881196 entry .URL = pluginCLIStringFromMap (source , "url" )
11891197 case "directory" , "file" :
11901198 entry .Path = pluginCLIStringFromMap (source , "path" )
@@ -1280,17 +1288,9 @@ func pluginCLINormalizeMarketplaceSourceArg(sourceType string, value string) (st
12801288}
12811289
12821290func compactPluginCLISparsePaths (paths []string ) []any {
1291+ paths = compactPluginCLIStrings (paths )
12831292 out := make ([]any , 0 , len (paths ))
1284- seen := map [string ]struct {}{}
12851293 for _ , path := range paths {
1286- path = strings .TrimSpace (path )
1287- if path == "" {
1288- continue
1289- }
1290- if _ , ok := seen [path ]; ok {
1291- continue
1292- }
1293- seen [path ] = struct {}{}
12941294 out = append (out , path )
12951295 }
12961296 return out
@@ -1353,6 +1353,43 @@ func pluginCLIStringFromMap(values map[string]any, key string) string {
13531353 return strings .TrimSpace (value )
13541354}
13551355
1356+ func pluginCLIStringSliceFromMap (values map [string ]any , key string ) []string {
1357+ if len (values ) == 0 {
1358+ return nil
1359+ }
1360+ switch raw := values [key ].(type ) {
1361+ case []string :
1362+ return compactPluginCLIStrings (raw )
1363+ case []any :
1364+ out := make ([]string , 0 , len (raw ))
1365+ for _ , item := range raw {
1366+ if value , ok := item .(string ); ok {
1367+ out = append (out , value )
1368+ }
1369+ }
1370+ return compactPluginCLIStrings (out )
1371+ default :
1372+ return nil
1373+ }
1374+ }
1375+
1376+ func compactPluginCLIStrings (values []string ) []string {
1377+ out := make ([]string , 0 , len (values ))
1378+ seen := map [string ]struct {}{}
1379+ for _ , value := range values {
1380+ value = strings .TrimSpace (value )
1381+ if value == "" {
1382+ continue
1383+ }
1384+ if _ , ok := seen [value ]; ok {
1385+ continue
1386+ }
1387+ seen [value ] = struct {}{}
1388+ out = append (out , value )
1389+ }
1390+ return out
1391+ }
1392+
13561393func pluginCLIMCPServerNames (servers map [string ]contracts.MCPServer ) []string {
13571394 names := make ([]string , 0 , len (servers ))
13581395 for name := range servers {
0 commit comments