@@ -131,6 +131,134 @@ var registrySyncCmd = &cobra.Command{
131131 },
132132}
133133
134+ var registrySourcesCmd = & cobra.Command {
135+ Use : "sources" ,
136+ Short : "List registered registry sources" ,
137+ RunE : func (cmd * cobra.Command , args []string ) error {
138+ client := clientFromCmd (cmd )
139+ rawJSON , _ := cmd .Flags ().GetBool ("json" )
140+
141+ var resp []map [string ]any
142+ if err := client .Get ("/api/registry/sources" , & resp ); err != nil {
143+ return err
144+ }
145+
146+ if rawJSON {
147+ tuioutput .JSON (resp )
148+ return nil
149+ }
150+
151+ tuioutput .Header (fmt .Sprintf ("Registry Sources (%d)" , len (resp )))
152+ tuioutput .Separator ()
153+ for _ , source := range resp {
154+ tuioutput .Row (
155+ fmt .Sprint (source ["id" ]),
156+ fmt .Sprint (source ["type" ]),
157+ fmt .Sprint (source ["visibility" ]),
158+ fmt .Sprint (source ["trustTier" ]),
159+ fmt .Sprint (source ["url" ]),
160+ )
161+ }
162+ return nil
163+ },
164+ }
165+
166+ var registryAddSourceCmd = & cobra.Command {
167+ Use : "add-source" ,
168+ Short : "Register a custom plugin registry source" ,
169+ RunE : func (cmd * cobra.Command , args []string ) error {
170+ client := clientFromCmd (cmd )
171+ rawJSON , _ := cmd .Flags ().GetBool ("json" )
172+ id , _ := cmd .Flags ().GetString ("id" )
173+ name , _ := cmd .Flags ().GetString ("name" )
174+ sourceType , _ := cmd .Flags ().GetString ("type" )
175+ sourceURL , _ := cmd .Flags ().GetString ("url" )
176+ visibility , _ := cmd .Flags ().GetString ("visibility" )
177+ trustTier , _ := cmd .Flags ().GetString ("trust-tier" )
178+ syncInterval , _ := cmd .Flags ().GetString ("sync-interval" )
179+ token , _ := cmd .Flags ().GetString ("token" )
180+ enabled , _ := cmd .Flags ().GetBool ("enabled" )
181+
182+ body := map [string ]any {
183+ "id" : id ,
184+ "name" : name ,
185+ "type" : sourceType ,
186+ "url" : sourceURL ,
187+ "visibility" : visibility ,
188+ "trustTier" : trustTier ,
189+ "syncInterval" : syncInterval ,
190+ "enabled" : enabled ,
191+ }
192+ if token != "" {
193+ body ["token" ] = token
194+ }
195+
196+ var resp map [string ]any
197+ if err := client .Post ("/api/registry/sources" , body , & resp ); err != nil {
198+ return err
199+ }
200+
201+ if rawJSON {
202+ tuioutput .JSON (resp )
203+ return nil
204+ }
205+
206+ tuioutput .OK (fmt .Sprintf ("Registry source registered: %v (%v)" , resp ["id" ], resp ["type" ]))
207+ return nil
208+ },
209+ }
210+
211+ var registryRemoveSourceCmd = & cobra.Command {
212+ Use : "remove-source <sourceId>" ,
213+ Short : "Remove a custom plugin registry source" ,
214+ Args : cobra .ExactArgs (1 ),
215+ RunE : func (cmd * cobra.Command , args []string ) error {
216+ client := clientFromCmd (cmd )
217+ rawJSON , _ := cmd .Flags ().GetBool ("json" )
218+
219+ if err := client .Delete ("/api/registry/sources/" + args [0 ]); err != nil {
220+ return err
221+ }
222+
223+ if rawJSON {
224+ tuioutput .JSON (map [string ]any {"id" : args [0 ], "removed" : true })
225+ return nil
226+ }
227+
228+ tuioutput .OK ("Registry source removed: " + args [0 ])
229+ return nil
230+ },
231+ }
232+
233+ var registrySyncSourceCmd = & cobra.Command {
234+ Use : "sync-source <sourceId>" ,
235+ Short : "Sync one custom registry source now" ,
236+ Args : cobra .ExactArgs (1 ),
237+ RunE : func (cmd * cobra.Command , args []string ) error {
238+ client := clientFromCmd (cmd )
239+ rawJSON , _ := cmd .Flags ().GetBool ("json" )
240+
241+ var resp map [string ]any
242+ if err := client .Post ("/api/registry/sources/" + args [0 ]+ "/sync" , map [string ]any {}, & resp ); err != nil {
243+ return err
244+ }
245+
246+ if rawJSON {
247+ tuioutput .JSON (resp )
248+ return nil
249+ }
250+
251+ tuioutput .OK (
252+ fmt .Sprintf (
253+ "Registry source synced: %v entries from %v" ,
254+ resp ["entriesSynced" ],
255+ resp ["source" ],
256+ ),
257+ )
258+ return nil
259+ },
260+ }
261+
134262var registryStatusCmd = & cobra.Command {
135263 Use : "status" ,
136264 Short : "Show registry service status" ,
@@ -166,7 +294,29 @@ func init() {
166294 registryListCmd .Flags ().String ("type" , "" , "Filter by type" )
167295 registryListCmd .Flags ().Bool ("compatible" , false , "Only show entries compatible with this SYNAPSE version" )
168296
169- registryCmd .AddCommand (registryListCmd , registryVersionsCmd , registrySyncCmd , registryStatusCmd )
297+ registryAddSourceCmd .Flags ().String ("id" , "" , "Source ID (defaults to a slug from name)" )
298+ registryAddSourceCmd .Flags ().String ("name" , "" , "Source display name" )
299+ registryAddSourceCmd .Flags ().String ("type" , "" , "Source type: github, gitlab, forgejo, or maven" )
300+ registryAddSourceCmd .Flags ().String ("url" , "" , "Registry source URL" )
301+ registryAddSourceCmd .Flags ().String ("visibility" , "store" , "Visibility: store or internal" )
302+ registryAddSourceCmd .Flags ().String ("trust-tier" , "community" , "Trust tier: official, community, or private" )
303+ registryAddSourceCmd .Flags ().String ("sync-interval" , "PT1H" , "Sync interval as an ISO-8601 duration" )
304+ registryAddSourceCmd .Flags ().String ("token" , "" , "Bearer token for private registry sources" )
305+ registryAddSourceCmd .Flags ().Bool ("enabled" , true , "Enable source after registration" )
306+ registryAddSourceCmd .MarkFlagRequired ("name" )
307+ registryAddSourceCmd .MarkFlagRequired ("type" )
308+ registryAddSourceCmd .MarkFlagRequired ("url" )
309+
310+ registryCmd .AddCommand (
311+ registryListCmd ,
312+ registryVersionsCmd ,
313+ registrySyncCmd ,
314+ registryStatusCmd ,
315+ registrySourcesCmd ,
316+ registryAddSourceCmd ,
317+ registryRemoveSourceCmd ,
318+ registrySyncSourceCmd ,
319+ )
170320 commandfeatures .BindSubcommandListing (registryCmd )
171321 rootCmd .AddCommand (registryCmd )
172322}
0 commit comments