@@ -481,47 +481,134 @@ func main() {
481481 }
482482
483483 var sharedLsCmd = & cobra.Command {
484- Use : "ls" ,
485- Short : "List all shared files" ,
484+ Use : "ls [file-name-pattern]" ,
485+ Aliases : []string {"list" , "find" , "search" },
486+ Short : "List shared files (optionally search by name)" ,
487+ Long : `List all shared files, or search by partial/fuzzy filename match.
488+
489+ Without arguments: Shows all shared files with references and dates.
490+ With file-name-pattern: Searches for files matching the pattern.
491+
492+ Examples:
493+ zep shared ls # List all shared files
494+ zep shared list # Same as ls (alias)
495+ zep shared find report.pdf # Find files matching "report.pdf"
496+ zep shared search report # Same as find (alias)` ,
497+ Args : cobra .MaximumNArgs (1 ),
486498 Run : func (cmd * cobra.Command , args []string ) {
487499 session , err := getEffectiveSession ()
488500 if err != nil {
489501 fmt .Printf ("❌ Authentication failed: %v\n " , err )
490502 return
491503 }
492504
493- files := utils .ListSharedFiles (session )
494- if len (files ) == 0 {
495- fmt .Println ("No shared files." )
505+ // If no arguments, list all shared files
506+ if len (args ) == 0 {
507+ files := utils .ListSharedFiles (session )
508+ if len (files ) == 0 {
509+ fmt .Println ("No shared files." )
510+ return
511+ }
512+
513+ fmt .Println ("\n 📤 SHARED FILES" )
514+ fmt .Println ("REFERENCE FILE NAME SHARED AT" )
515+ fmt .Println ("--------- ---------- ---------" )
516+ for _ , f := range files {
517+ fmt .Printf ("%-9s %-24s %s\n " , f .Reference , f .OriginalPath , f .SharedAt .Format ("2006-01-02 15:04" ))
518+ }
519+ fmt .Println ()
520+ return
521+ }
522+
523+ // If argument provided, search by name
524+ nameQuery := args [0 ]
525+ matches , err := utils .FindSharedFilesByName (nameQuery , session )
526+ if err != nil {
527+ fmt .Printf ("❌ %v\n " , err )
528+ return
529+ }
530+
531+ if len (matches ) == 0 {
532+ fmt .Printf ("❌ No shared files found matching '%s'\n " , nameQuery )
496533 return
497534 }
498535
499- fmt .Println ("\n 📤 SHARED FILES" )
500- fmt .Println ("REFERENCE FILE NAME SHARED AT" )
501- fmt .Println ("--------- ---------- ---------" )
502- for _ , f := range files {
503- fmt .Printf ("%-9s %-24s %s\n " , f .Reference , f .OriginalPath , f .SharedAt .Format ("2006-01-02 15:04" ))
536+ fmt .Printf ("\n 📂 Found %d match(es) for '%s':\n \n " , len (matches ), nameQuery )
537+ for i , match := range matches {
538+ fmt .Printf ("[%d] %s\n " , i + 1 , match .FileName )
539+ fmt .Printf (" Vault Path: %s\n " , match .OriginalPath )
540+ fmt .Printf (" Reference: %s\n " , match .Reference )
541+ fmt .Printf (" Match Type: " )
542+ if match .MatchScore == 0 {
543+ fmt .Println ("Exact match" )
544+ } else if match .MatchScore < 50 {
545+ fmt .Println ("Prefix match" )
546+ } else {
547+ fmt .Println ("Substring match" )
548+ }
549+ fmt .Println ()
504550 }
505- fmt .Println ()
506551 },
507552 }
508553
509554 var sharedRmCmd = & cobra.Command {
510- Use : "rm [reference]" ,
511- Aliases : []string {"revoke" , "delete" },
512- Short : "Revoke/remove a shared file" ,
513- Args : cobra .ExactArgs (1 ),
555+ Use : "rm [reference-or-name]" ,
556+ Aliases : []string {"revoke" , "delete" , "remove" },
557+ Short : "Revoke/remove a shared file by reference or name" ,
558+ Long : `Revoke a shared file using its reference hash or file name.
559+
560+ Can match by:
561+ - Reference hash: zep shared rm AbC123
562+ - File name (exact or partial): zep shared rm report.pdf
563+
564+ Fuzzy matching is supported for file names:
565+ - Exact match: "report.pdf"
566+ - Prefix match: "report"
567+ - Substring match: "port.pdf"
568+
569+ If multiple files match a name, you'll be prompted to be more specific.` ,
570+ Args : cobra .ExactArgs (1 ),
514571 Run : func (cmd * cobra.Command , args []string ) {
515572 session , err := getEffectiveSession ()
516573 if err != nil {
517574 fmt .Printf ("❌ Authentication failed: %v\n " , err )
518575 return
519576 }
520577
521- reference := args [0 ]
578+ query := args [0 ]
579+
580+ // First, try to find by name (name matching is more flexible)
581+ matches , err := utils .FindSharedFilesByName (query , session )
582+ var reference string
583+ var displayName string
584+
585+ if len (matches ) > 0 {
586+ // Found by name
587+ if len (matches ) > 1 {
588+ // Ambiguous - show options
589+ fmt .Printf ("Multiple files match '%s':\n \n " , query )
590+ for i , match := range matches {
591+ fmt .Printf ("[%d] %s (ref: %s)\n " , i + 1 , match .FileName , match .Reference )
592+ }
593+ fmt .Println ("\n ⚠️ Please be more specific with the file name." )
594+ return
595+ }
596+ // Exactly one match
597+ reference = matches [0 ].Reference
598+ displayName = matches [0 ].FileName
599+ } else {
600+ // Not found by name - try as reference directly
601+ entry , err := utils .GetSharedFileInfo (query , session )
602+ if err != nil {
603+ fmt .Printf ("❌ No shared file found matching '%s'\n " , query )
604+ return
605+ }
606+ reference = entry .Reference
607+ displayName = entry .OriginalPath
608+ }
522609
523610 // Confirm revocation
524- fmt .Printf ("⚠️ Revoke shared file %s ? (y/N): " , reference )
611+ fmt .Printf ("⚠️ Revoke shared file '%s' ? (y/N): " , displayName )
525612 var confirm string
526613 fmt .Scanln (& confirm )
527614 if confirm != "y" && confirm != "yes" {
@@ -541,7 +628,7 @@ func main() {
541628 session .Save ()
542629 }
543630
544- fmt .Printf ("✔ Shared file '%s' revoked.\n " , reference )
631+ fmt .Printf ("✔ Shared file '%s' revoked.\n " , displayName )
545632 },
546633 }
547634
0 commit comments