|
94 | 94 | tacit status Check daemon status |
95 | 95 | tacit update Update tacit to the latest version |
96 | 96 | tacit list [duration] List knowledge entries (default: 24h) |
97 | | - tacit search <pattern> Search knowledge entries by pattern |
| 97 | + tacit search [--duration <d>] <pattern> Search knowledge entries by pattern |
98 | 98 | tacit get <file-path>... Print the full content of one or more knowledge entries |
99 | 99 | tacit config view Show current configuration |
100 | 100 | tacit config edit Open configuration in a text editor |
@@ -832,25 +832,54 @@ func cmdList() { |
832 | 832 |
|
833 | 833 | // cmdSearch searches the knowledge base for entries matching a pattern. |
834 | 834 | func cmdSearch() { |
835 | | - if len(os.Args) < 3 { |
836 | | - fmt.Fprintf(os.Stderr, "Usage: tacit search <pattern>\n") |
| 835 | + // Parse args: tacit search [--duration <dur>] <pattern> |
| 836 | + args := os.Args[2:] |
| 837 | + var since time.Time |
| 838 | + var patternArgs []string |
| 839 | + |
| 840 | + for i := 0; i < len(args); i++ { |
| 841 | + if args[i] == "--duration" && i+1 < len(args) { |
| 842 | + d, err := parseDuration(args[i+1]) |
| 843 | + if err != nil { |
| 844 | + fmt.Fprintf(os.Stderr, "Invalid duration %q: %v\n", args[i+1], err) |
| 845 | + fmt.Fprintf(os.Stderr, "Examples: 1h, 30m, 24h, 1d, 7d, 2w\n") |
| 846 | + os.Exit(1) |
| 847 | + } |
| 848 | + since = time.Now().Add(-d) |
| 849 | + i++ // skip duration value |
| 850 | + } else { |
| 851 | + patternArgs = append(patternArgs, args[i]) |
| 852 | + } |
| 853 | + } |
| 854 | + |
| 855 | + if len(patternArgs) == 0 { |
| 856 | + fmt.Fprintf(os.Stderr, "Usage: tacit search [--duration <duration>] <pattern>\n") |
| 857 | + fmt.Fprintf(os.Stderr, "Examples: tacit search meeting, tacit search --duration 1h meeting\n") |
837 | 858 | os.Exit(1) |
838 | 859 | } |
839 | 860 |
|
840 | | - pattern := os.Args[2] |
| 861 | + pattern := patternArgs[0] |
841 | 862 | baseDir := config.BaseDir() |
842 | 863 |
|
843 | | - results, err := search.Search(baseDir, pattern) |
| 864 | + results, err := search.Search(baseDir, pattern, since) |
844 | 865 | if err != nil { |
845 | 866 | log.Fatalf("Search failed: %v", err) |
846 | 867 | } |
847 | 868 |
|
848 | 869 | if len(results) == 0 { |
849 | | - fmt.Printf("No results found for %q.\n", pattern) |
| 870 | + if !since.IsZero() { |
| 871 | + fmt.Printf("No results found for %q in the last %s.\n", pattern, formatDuration(time.Since(since))) |
| 872 | + } else { |
| 873 | + fmt.Printf("No results found for %q.\n", pattern) |
| 874 | + } |
850 | 875 | return |
851 | 876 | } |
852 | 877 |
|
853 | | - fmt.Printf("Found %d result(s) for %q:\n\n", len(results), pattern) |
| 878 | + if !since.IsZero() { |
| 879 | + fmt.Printf("Found %d result(s) for %q in the last %s:\n\n", len(results), pattern, formatDuration(time.Since(since))) |
| 880 | + } else { |
| 881 | + fmt.Printf("Found %d result(s) for %q:\n\n", len(results), pattern) |
| 882 | + } |
854 | 883 | for _, r := range results { |
855 | 884 | fmt.Printf("[%s] %s / %s\n", r.CreatedAt.Format("2006-01-02 15:04:05"), r.Category, r.Title) |
856 | 885 | fmt.Printf(" File: %s\n", r.FilePath) |
|
0 commit comments