Add multi-depository support with global config

- Implement global CLI config at ~/.config/jade/config.yml
- Add jade depo commands (add, list, remove, set-default)
- Support depository short names and context-aware detection
- Remove tag_prefix config, hardcode + syntax for consistency
- Update depository resolution: flag -> context -> default
- Auto-initialize .jade/ directory structure when adding depos
- Update documentation with new multi-depository workflow
This commit is contained in:
2026-01-03 16:25:23 +01:00
parent 0ebfaf835d
commit 1d87d93172
9 changed files with 515 additions and 158 deletions
+31 -15
View File
@@ -12,7 +12,8 @@ import (
)
var (
forceDelete bool
forceDelete bool
permanentDelete bool
rmCmd = &cobra.Command{
Use: "rm [title]",
@@ -24,6 +25,7 @@ var (
func init() {
rmCmd.Flags().BoolVarP(&forceDelete, "force", "f", false, "Skip confirmation prompt")
rmCmd.Flags().BoolVarP(&permanentDelete, "permanent", "p", false, "Delete permanently")
rootCmd.AddCommand(rmCmd)
}
@@ -68,9 +70,15 @@ func removeNote(cmd *cobra.Command, args []string) {
noteToDelete = matches[selection-1]
}
notePath := filepath.Join(jd.Config.DepoPath, noteToDelete.Path)
// Confirm deletion
if !forceDelete {
fmt.Printf("Are you sure you want to delete '%s'? (y/N): ", noteToDelete.Title)
if permanentDelete {
fmt.Printf("Are you sure you want to PERMANENTLY delete '%s'? This cannot be undone. (y/N): ", noteToDelete.Title)
} else {
fmt.Printf("Are you sure you want to move '%s' to trash? (y/N): ", noteToDelete.Title)
}
var confirm string
fmt.Scanln(&confirm)
if strings.ToLower(confirm) != "y" && strings.ToLower(confirm) != "yes" {
@@ -79,20 +87,28 @@ func removeNote(cmd *cobra.Command, args []string) {
}
}
// Move to trash
notePath := filepath.Join(jd.Config.DepoPath, noteToDelete.Path)
trashPath := jd.GetTrashPath()
if permanentDelete {
// Permanently delete the file
if err := os.Remove(notePath); err != nil {
fmt.Fprintf(os.Stderr, "Error deleting note: %v\n", err)
os.Exit(1)
}
fmt.Printf("Permanently deleted '%s'\n", noteToDelete.Title)
} else {
// Move to trash
trashPath := jd.GetTrashPath()
// Create unique filename in trash (add timestamp to avoid conflicts)
timestamp := time.Now().Format("20060102-150405")
trashFilename := fmt.Sprintf("%s-%s", timestamp, filepath.Base(noteToDelete.Path))
trashDestination := filepath.Join(trashPath, trashFilename)
// Create unique filename in trash (add timestamp to avoid conflicts)
timestamp := time.Now().Format("20060102-150405")
trashFilename := fmt.Sprintf("%s-%s", timestamp, filepath.Base(noteToDelete.Path))
trashDestination := filepath.Join(trashPath, trashFilename)
if err := os.Rename(notePath, trashDestination); err != nil {
fmt.Fprintf(os.Stderr, "Error moving note to trash: %v\n", err)
os.Exit(1)
if err := os.Rename(notePath, trashDestination); err != nil {
fmt.Fprintf(os.Stderr, "Error moving note to trash: %v\n", err)
os.Exit(1)
}
fmt.Printf("Moved '%s' to trash\n", noteToDelete.Title)
fmt.Printf("Trash location: %s\n", trashDestination)
}
fmt.Printf("Moved '%s' to trash\n", noteToDelete.Title)
fmt.Printf("Trash location: %s\n", trashDestination)
}