@@ -36,6 +36,16 @@ type SecurityStatus = {
3636 model : string | null ;
3737} ;
3838
39+ type ModerationStatus = {
40+ isSuspicious : boolean ;
41+ isMalwareBlocked : boolean ;
42+ verdict ?: "clean" | "suspicious" | "malicious" ;
43+ reasonCodes ?: string [ ] ;
44+ updatedAt ?: number | null ;
45+ engineVersion ?: string | null ;
46+ summary ?: string | null ;
47+ } ;
48+
3949export async function cmdInspect ( opts : GlobalOpts , slug : string , options : InspectOptions = { } ) {
4050 const trimmed = slug . trim ( ) ;
4151 if ( ! trimmed ) fail ( "Slug required" ) ;
@@ -121,6 +131,7 @@ export async function cmdInspect(opts: GlobalOpts, slug: string, options: Inspec
121131 skill : skillResult . skill ,
122132 latestVersion : skillResult . latestVersion ,
123133 owner : skillResult . owner ,
134+ moderation : skillResult . moderation ?? null ,
124135 version : versionResult ?. version ?? null ,
125136 versions : versionsList ?. items ?? null ,
126137 file : options . file ? { path : options . file , content : fileContent } : null ,
@@ -140,6 +151,7 @@ export async function cmdInspect(opts: GlobalOpts, slug: string, options: Inspec
140151 ( versionResult ?. version as { license ?: string | null } | undefined ) ?. license ?? null ,
141152 owner : skillResult . owner ,
142153 } ) ;
154+ printModerationSummary ( skillResult . moderation ?? null ) ;
143155 }
144156
145157 if ( shouldPrintMeta && versionResult ?. version ) {
@@ -236,6 +248,60 @@ function printVersionSummary(version: unknown) {
236248 }
237249}
238250
251+ function printModerationSummary ( moderation : unknown ) {
252+ const status = normalizeModeration ( moderation ) ;
253+ if ( ! status ) return ;
254+ const label = status . isMalwareBlocked
255+ ? "MALICIOUS"
256+ : status . isSuspicious
257+ ? "SUSPICIOUS"
258+ : ( status . verdict ?? "clean" ) . toUpperCase ( ) ;
259+ console . log ( `Moderation: ${ label } ` ) ;
260+ if ( status . reasonCodes ?. length ) {
261+ console . log ( `Reasons: ${ status . reasonCodes . join ( ", " ) } ` ) ;
262+ }
263+ if ( typeof status . updatedAt === "number" ) {
264+ console . log ( `Moderation Updated: ${ formatTimestamp ( status . updatedAt ) } ` ) ;
265+ }
266+ if ( status . engineVersion ) {
267+ console . log ( `Moderation Engine: ${ status . engineVersion } ` ) ;
268+ }
269+ if ( status . summary ) {
270+ console . log ( `Moderation Summary: ${ truncate ( status . summary , 160 ) } ` ) ;
271+ }
272+ }
273+
274+ function normalizeModeration ( moderation : unknown ) : ModerationStatus | null {
275+ if ( ! moderation || typeof moderation !== "object" ) return null ;
276+ const value = moderation as {
277+ isSuspicious ?: unknown ;
278+ isMalwareBlocked ?: unknown ;
279+ verdict ?: unknown ;
280+ reasonCodes ?: unknown ;
281+ updatedAt ?: unknown ;
282+ engineVersion ?: unknown ;
283+ summary ?: unknown ;
284+ } ;
285+ if ( typeof value . isSuspicious !== "boolean" ) return null ;
286+ if ( typeof value . isMalwareBlocked !== "boolean" ) return null ;
287+ const verdict =
288+ value . verdict === "clean" || value . verdict === "suspicious" || value . verdict === "malicious"
289+ ? value . verdict
290+ : undefined ;
291+ const reasonCodes = Array . isArray ( value . reasonCodes )
292+ ? value . reasonCodes . filter ( ( reason ) : reason is string => typeof reason === "string" )
293+ : undefined ;
294+ return {
295+ isSuspicious : value . isSuspicious ,
296+ isMalwareBlocked : value . isMalwareBlocked ,
297+ verdict,
298+ reasonCodes,
299+ updatedAt : typeof value . updatedAt === "number" ? value . updatedAt : null ,
300+ engineVersion : typeof value . engineVersion === "string" ? value . engineVersion : null ,
301+ summary : typeof value . summary === "string" && value . summary . trim ( ) ? value . summary : null ,
302+ } ;
303+ }
304+
239305function normalizeTags ( tags : unknown ) : Record < string , string > {
240306 if ( ! tags || typeof tags !== "object" ) return { } ;
241307 const entries = Object . entries ( tags as Record < string , unknown > ) ;
0 commit comments