@@ -30,6 +30,7 @@ import { toLap } from './serializer';
3030import { generateSkill } from './skill' ;
3131import { enhanceSkill , hasClaudeCli } from './skill_llm' ;
3232import { compile } from './compilers/index' ;
33+ import { LAPClient } from './client' ;
3334
3435// ── Helpers ─────────────────────────────────────────────────────────
3536
@@ -69,6 +70,8 @@ Commands:
6970 skill-batch <dir> -o <outdir> Batch generate skills
7071 [--layer 1|2] [-v] Layer + verbose mode
7172 skill-install <name> [--dir <path>] Install skill from registry
73+ search <query> [--tag t] [--sort s] Search the LAP registry for APIs
74+ [--limit n] [--offset n] [--json] Pagination and JSON output
7275
7376Environment:
7477 LAP_REGISTRY Registry URL (default: https://registry.lap.sh)` ) ;
@@ -395,6 +398,66 @@ async function cmdSkillBatch(args: string[]): Promise<void> {
395398 info ( `Generated ${ success } skills, ${ failed } failures` ) ;
396399}
397400
401+ async function cmdSearch ( args : string [ ] ) : Promise < void > {
402+ const queryParts : string [ ] = [ ] ;
403+ let tag : string | undefined ;
404+ let sort : string | undefined ;
405+ let limit : number | undefined ;
406+ let offset : number | undefined ;
407+ let jsonOutput = false ;
408+
409+ for ( let i = 0 ; i < args . length ; i ++ ) {
410+ if ( args [ i ] === '--tag' && i + 1 < args . length ) { tag = args [ ++ i ] ; }
411+ else if ( args [ i ] === '--sort' && i + 1 < args . length ) { sort = args [ ++ i ] ; }
412+ else if ( args [ i ] === '--limit' && i + 1 < args . length ) { limit = parseInt ( args [ ++ i ] , 10 ) ; }
413+ else if ( args [ i ] === '--offset' && i + 1 < args . length ) { offset = parseInt ( args [ ++ i ] , 10 ) ; }
414+ else if ( args [ i ] === '--json' ) { jsonOutput = true ; }
415+ else if ( ! args [ i ] . startsWith ( '-' ) ) { queryParts . push ( args [ i ] ) ; }
416+ }
417+
418+ const query = queryParts . join ( ' ' ) . trim ( ) ;
419+ if ( ! query ) error ( 'Please provide a search query. Usage: lapsh search <query>' ) ;
420+
421+ const client = new LAPClient ( ) ;
422+ const registryUrl = getRegistryUrl ( ) ;
423+ const result = await client . search ( registryUrl , query , { tag, sort, limit, offset } ) ;
424+
425+ if ( jsonOutput ) {
426+ console . log ( JSON . stringify ( result , null , 2 ) ) ;
427+ return ;
428+ }
429+
430+ if ( result . results . length === 0 ) {
431+ info ( `No results for '${ query } '.` ) ;
432+ return ;
433+ }
434+
435+ const rows = result . results . map ( r => {
436+ const name = r . name || '' ;
437+ const desc = r . description || '' ;
438+ const ep = typeof r . endpoints === 'number' ? `${ r . endpoints } endpoints` : '' ;
439+ const size = r . size ;
440+ const lean = r . lean_size ;
441+ const ratio = ( typeof size === 'number' && typeof lean === 'number' && lean )
442+ ? `${ ( size / lean ) . toFixed ( 1 ) } x compressed` : '' ;
443+ const skill = r . has_skill ? ' [skill]' : '' ;
444+ return { name, ep, ratio, desc, skill } ;
445+ } ) ;
446+
447+ const nameW = Math . max ( ...rows . map ( r => r . name . length ) ) ;
448+ const epW = Math . max ( ...rows . map ( r => r . ep . length ) ) ;
449+ const ratioW = Math . max ( ...rows . map ( r => r . ratio . length ) ) ;
450+
451+ for ( const { name, ep, ratio, desc, skill } of rows ) {
452+ console . log ( ` ${ name . padEnd ( nameW ) } ${ ep . padStart ( epW ) } ${ ratio . padStart ( ratioW ) } ${ desc } ${ skill } ` ) ;
453+ }
454+
455+ const shown = ( result . offset || 0 ) + result . results . length ;
456+ if ( shown < result . total ) {
457+ info ( `Showing ${ shown } /${ result . total } results. Use --offset ${ shown } for more.` ) ;
458+ }
459+ }
460+
398461async function cmdSkillInstall ( args : string [ ] ) : Promise < void > {
399462 let name = '' ;
400463 let dir = '' ;
@@ -467,6 +530,9 @@ async function main(): Promise<void> {
467530 case 'skill-install' :
468531 await cmdSkillInstall ( args . slice ( 1 ) ) ;
469532 break ;
533+ case 'search' :
534+ await cmdSearch ( args . slice ( 1 ) ) ;
535+ break ;
470536 default :
471537 console . error ( `Unknown command: ${ command } ` ) ;
472538 usage ( ) ;
0 commit comments