From 0b8d4d1c590cfe38bb6c5de66a67a3d68de11886 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:23:48 +0500 Subject: [PATCH 1/9] docs(context): make Projects git repos found by Scan, dropping Root and Kind Refs #57 --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yml | 2 +- CONTEXT.md | 16 ++++------------ CONTRIBUTING.md | 2 +- ...0001-projects-are-git-repos-found-by-scan.md | 17 +++++++++++++++++ 5 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 docs/adr/0001-projects-are-git-repos-found-by-scan.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d7b482e..5d90df9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -8,7 +8,7 @@ body: id: what-happened attributes: label: What happened? - description: A clear description of the bug, including which Project or Root was involved. + description: A clear description of the bug, including which Project was involved. validations: required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index cba161d..941d690 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -15,7 +15,7 @@ body: id: solution attributes: label: Proposed solution - description: What you would like cdd to do, using the project's vocabulary (Root, Kind, Project, Jump, Visit, History, Scan, Picker, Wrapper) where relevant. + description: What you would like cdd to do, using the project's vocabulary (Project, Jump, Visit, History, Scan, Picker, Wrapper) where relevant. validations: required: true - type: textarea diff --git a/CONTEXT.md b/CONTEXT.md index 6893ba0..6c95e8d 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -4,16 +4,8 @@ A terminal UI for jumping to recently used projects. It remembers where you have ## Language -**Root**: -The top-level directory whose Kinds are searched for Projects. -_Avoid_: Base, home, workspace, projects dir - -**Kind**: -A first-level directory under Root that groups Projects by purpose. -_Avoid_: Category, group, type, namespace - **Project**: -A directory exactly one level below a Kind, identified by its path relative to Root. It need not be a repository or contain anything in particular. +A directory holding a git repository (a `.git` directory or file), identified by its absolute path. It may sit at any depth, and a directory that is not a repository is never a Project. _Avoid_: Repo, workspace, folder, directory **Jump**: @@ -25,7 +17,7 @@ A single recorded Jump to a Project, or an entry seeded for a Project by a Scan. _Avoid_: Access, hit, entry, usage **Stale Visit**: -A Visit whose Project is no longer found under Root, whatever the cause. It contributes nothing to the Picker and is never pruned; it ages out of History. +A Visit whose Project no longer has a `.git` at its path, whatever the cause. It contributes nothing to the Picker and is never pruned; it ages out of History. _Avoid_: Orphan, dead entry, dangling, missing project **History**: @@ -33,7 +25,7 @@ The ordered record of Visits from which recent Projects are derived. _Avoid_: Cache, log, database, store **Scan**: -A one-off sweep of Root that seeds History with a Visit per Project, dated from evidence found inside the Project itself. +A one-off sweep of the directories given to it (the home directory by default) that seeds History with a Visit per Project found at any depth below them, dated from evidence found inside the Project itself. Nothing about which directories were swept is remembered. _Avoid_: Import, index, crawl, rebuild **Picker**: @@ -41,7 +33,7 @@ The interactive screen that lists Projects and lets the user choose one to Jump _Avoid_: Menu, list, finder, selector **Layout**: -One of the arrangements in which the Picker draws Projects: the Grouped Layout puts them under Kind headers, the List Layout in one flat run. +One of the arrangements in which the Picker draws Projects. The List Layout, the only one today, draws them in one flat run. _Avoid_: View, mode, style, theme, skin **Wrapper**: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac091c2..b6ce69b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ recently used Projects. ## Vocabulary Before writing code or docs, read [`CONTEXT.md`](CONTEXT.md). It is the -glossary for this project: terms like Root, Kind, Project, Jump, Visit, Stale +glossary for this project: terms like Project, Jump, Visit, Stale Visit, History, Scan, Picker, and Wrapper have precise, agreed meanings. Use those terms verbatim in code, comments, commit messages, and pull requests instead of synonyms, so the codebase and its discussions share one diff --git a/docs/adr/0001-projects-are-git-repos-found-by-scan.md b/docs/adr/0001-projects-are-git-repos-found-by-scan.md new file mode 100644 index 0000000..5e42fc4 --- /dev/null +++ b/docs/adr/0001-projects-are-git-repos-found-by-scan.md @@ -0,0 +1,17 @@ +# Projects are git repositories found by Scan + +Until v0.3.0 cdd searched a configured Root with a fixed shape: every directory under Root was a Kind, every directory under a Kind was a Project, and any directory counted. That shape forced one layout onto the disk and listed folders that were never meant to be jumped to, while repositories nested deeper, or kept outside Root, could not be reached at all. + +A Project is now any directory holding a `.git` directory or file, at any depth, and there is no Root or Kind to configure. Only `cdd scan [dir...]` walks the disk (the home directory by default); it seeds History with absolute paths, and the Picker lists History alone, dropping any Visit whose `.git` has gone. The walk stops descending at the first repository it finds, except in a directory named to Scan, so a dotfiles repository at the home directory does not hide everything under it. + +## Considered options + +- **Walk the home directory each time the Picker opens.** Always fresh, but opening cost grows with the whole home directory; opening the Picker must stay instant. +- **Remember the directories Scan was given.** A plain `cdd scan` could re-walk them, but that is a configured Root under another name. +- **Record any `cd` into a repository through the Wrapper.** Useful, but it changes what counts as a Visit; it can be added later without undoing this decision. + +## Consequences + +- History lines written before v0.3.0 hold Root-relative paths; they are skipped as malformed and age out, and a fresh Scan rebuilds the order. +- The Grouped Layout drew Kind headers, so it is gone; `picker.layout` stays for layouts still to come. +- A config.toml still setting `root`, or `picker.layout = "grouped"`, is a hard error naming the change, so nobody is left wondering why their Root is ignored. From f9bf163fce62bfb4ed738e9b32b0fd60b573916b Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:25:03 +0500 Subject: [PATCH 2/9] feat(history): store Projects as absolute paths, skipping Root-relative lines Refs #57 --- internal/history/compact_test.go | 34 +++++++-------- internal/history/concurrent_test.go | 2 +- internal/history/history.go | 6 +-- internal/history/history_test.go | 65 ++++++++++++++++++----------- internal/history/line.go | 6 ++- internal/history/seed_test.go | 20 ++++----- internal/history/write.go | 25 ++++++++--- 7 files changed, 95 insertions(+), 63 deletions(-) diff --git a/internal/history/compact_test.go b/internal/history/compact_test.go index 697b707..65a0394 100644 --- a/internal/history/compact_test.go +++ b/internal/history/compact_test.go @@ -21,7 +21,7 @@ func seedLines(t *testing.T, path string, n int) { var sb strings.Builder for i := range n { at := base.Add(time.Duration(i) * time.Second) - fmt.Fprintf(&sb, "%s\tjump\tproj/%d\n", at.Format(time.RFC3339), i) + fmt.Fprintf(&sb, "%s\tjump\t/proj/%d\n", at.Format(time.RFC3339), i) } if err := os.WriteFile(path, []byte(sb.String()), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) @@ -59,7 +59,7 @@ func TestRecord_CompactsPastTenPercentThreshold(t *testing.T) { if err != nil { t.Fatalf("Open: unexpected error: %v", err) } - if err := h.Record("proj/new"); err != nil { + if err := h.Record("/proj/new"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } if got := countLines(t, path); got != 11 { @@ -68,7 +68,7 @@ func TestRecord_CompactsPastTenPercentThreshold(t *testing.T) { // One more append pushes the file past the threshold and must compact // down to maxVisits lines. - if err := h.Record("proj/newer"); err != nil { + if err := h.Record("/proj/newer"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } if got := countLines(t, path); got != maxVisits { @@ -87,7 +87,7 @@ func TestCompact_KeepsNewestLines(t *testing.T) { if err != nil { t.Fatalf("Open: unexpected error: %v", err) } - if err := h.Record("proj/last"); err != nil { + if err := h.Record("/proj/last"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } @@ -98,11 +98,11 @@ func TestCompact_KeepsNewestLines(t *testing.T) { if len(latest) != maxVisits { t.Fatalf("Latest: got %d visits, want %d", len(latest), maxVisits) } - if latest[0].Project != "proj/last" { - t.Errorf("Latest[0].Project = %q, want %q (most recent survives compaction)", latest[0].Project, "proj/last") + if latest[0].Project != "/proj/last" { + t.Errorf("Latest[0].Project = %q, want %q (most recent survives compaction)", latest[0].Project, "/proj/last") } for _, v := range latest { - if v.Project == "proj/0" { + if v.Project == "/proj/0" { t.Errorf("Latest: found proj/0, oldest Visit should have been compacted away") } } @@ -113,8 +113,8 @@ func TestCompact_DropsScanShadowedByNewerJump(t *testing.T) { path := filepath.Join(dir, "history") maxVisits := 3 - content := "2026-01-01T00:00:00Z\tscan\tproj/a\n" + - "2026-01-01T00:00:01Z\tjump\tproj/a\n" + content := "2026-01-01T00:00:00Z\tscan\t/proj/a\n" + + "2026-01-01T00:00:01Z\tjump\t/proj/a\n" if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) } @@ -124,13 +124,13 @@ func TestCompact_DropsScanShadowedByNewerJump(t *testing.T) { t.Fatalf("Open: unexpected error: %v", err) } // Force compaction with enough appends to cross the threshold. - if err := h.Record("proj/b"); err != nil { + if err := h.Record("/proj/b"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } - if err := h.Record("proj/c"); err != nil { + if err := h.Record("/proj/c"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } - if err := h.Record("proj/d"); err != nil { + if err := h.Record("/proj/d"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } @@ -141,7 +141,7 @@ func TestCompact_DropsScanShadowedByNewerJump(t *testing.T) { defer func() { _ = f.Close() }() scanner := bufio.NewScanner(f) for scanner.Scan() { - if strings.Contains(scanner.Text(), "\tscan\tproj/a") { + if strings.Contains(scanner.Text(), "\tscan\t/proj/a") { t.Errorf("compacted file still contains shadowed scan line: %q", scanner.Text()) } } @@ -152,8 +152,8 @@ func TestOpen_MalformedLinesDoNotPreventFutureCompaction(t *testing.T) { path := filepath.Join(dir, "history") content := "garbage line with no tabs\n" + - "2026-01-01T00:00:00Z\tjump\tproj/a\n" + - "2026-01-01T00:00:01\tjump\tproj/b\n" // malformed timestamp + "2026-01-01T00:00:00Z\tjump\t/proj/a\n" + + "2026-01-01T00:00:01\tjump\t/proj/b\n" // malformed timestamp if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) } @@ -170,7 +170,7 @@ func TestOpen_MalformedLinesDoNotPreventFutureCompaction(t *testing.T) { if len(latest) != 1 { t.Fatalf("Latest: got %d visits, want 1 (malformed lines skipped)", len(latest)) } - if latest[0].Project != "proj/a" { - t.Errorf("Project = %q, want %q", latest[0].Project, "proj/a") + if latest[0].Project != "/proj/a" { + t.Errorf("Project = %q, want %q", latest[0].Project, "/proj/a") } } diff --git a/internal/history/concurrent_test.go b/internal/history/concurrent_test.go index f83327b..5e6fccb 100644 --- a/internal/history/concurrent_test.go +++ b/internal/history/concurrent_test.go @@ -123,7 +123,7 @@ func countHistoryLines(t *testing.T, path string) int { } func project(g, i int) string { - return "proj/" + strconv.Itoa(g) + "-" + strconv.Itoa(i) + return "/proj/" + strconv.Itoa(g) + "-" + strconv.Itoa(i) } func readAllForTest(t *testing.T, h *history.History) ([]history.Visit, error) { diff --git a/internal/history/history.go b/internal/history/history.go index 7ee40be..893c5ef 100644 --- a/internal/history/history.go +++ b/internal/history/history.go @@ -1,6 +1,6 @@ // Package history stores the ordered record of Visits from which recent -// Projects are derived. It stores Kind and Project only as path strings and -// does not import internal/project. +// Projects are derived. It stores each Project as its absolute path and does +// not import internal/project. package history import ( @@ -27,7 +27,7 @@ type Visit struct { At time.Time // Source is how the Visit was recorded: SourceJump or SourceScan. Source Source - // Project is the Project's path relative to Root, e.g. "tools/cdd". + // Project is the Project's absolute path, e.g. "/home/me/tools/cdd". Project string } diff --git a/internal/history/history_test.go b/internal/history/history_test.go index 584ab0b..b3a12ed 100644 --- a/internal/history/history_test.go +++ b/internal/history/history_test.go @@ -46,7 +46,7 @@ func TestRecord_AppendsAndReadsBack(t *testing.T) { t.Fatalf("Open: unexpected error: %v", err) } - if err := h.Record("tools/cdd"); err != nil { + if err := h.Record("/p/tools/cdd"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } @@ -57,8 +57,8 @@ func TestRecord_AppendsAndReadsBack(t *testing.T) { if len(latest) != 1 { t.Fatalf("Latest: got %d visits, want 1", len(latest)) } - if latest[0].Project != "tools/cdd" { - t.Errorf("Project = %q, want %q", latest[0].Project, "tools/cdd") + if latest[0].Project != "/p/tools/cdd" { + t.Errorf("Project = %q, want %q", latest[0].Project, "/p/tools/cdd") } if latest[0].Source != history.SourceJump { t.Errorf("Source = %q, want %q", latest[0].Source, history.SourceJump) @@ -75,10 +75,10 @@ func TestLatest_NewestPerProject(t *testing.T) { // tools/other's newest line predates tools/cdd's newest line, so Latest // must order tools/cdd first despite tools/other appearing earlier in // the file too. - content := "2026-09-16T14:00:00Z\tjump\ttools/other\n" + - "2026-09-16T14:01:00Z\tjump\ttools/cdd\n" + - "2026-09-16T14:02:00Z\tjump\ttools/other\n" + - "2026-09-16T14:03:00Z\tjump\ttools/cdd\n" + content := "2026-09-16T14:00:00Z\tjump\t/p/tools/other\n" + + "2026-09-16T14:01:00Z\tjump\t/p/tools/cdd\n" + + "2026-09-16T14:02:00Z\tjump\t/p/tools/other\n" + + "2026-09-16T14:03:00Z\tjump\t/p/tools/cdd\n" if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) } @@ -95,11 +95,11 @@ func TestLatest_NewestPerProject(t *testing.T) { if len(latest) != 2 { t.Fatalf("Latest: got %d visits, want 2 (one per Project)", len(latest)) } - if latest[0].Project != "tools/cdd" { - t.Errorf("Latest[0].Project = %q, want %q (most recently jumped)", latest[0].Project, "tools/cdd") + if latest[0].Project != "/p/tools/cdd" { + t.Errorf("Latest[0].Project = %q, want %q (most recently jumped)", latest[0].Project, "/p/tools/cdd") } - if latest[1].Project != "tools/other" { - t.Errorf("Latest[1].Project = %q, want %q", latest[1].Project, "tools/other") + if latest[1].Project != "/p/tools/other" { + t.Errorf("Latest[1].Project = %q, want %q", latest[1].Project, "/p/tools/other") } } @@ -113,15 +113,15 @@ func TestCount_PerProject(t *testing.T) { } for range 3 { - if err := h.Record("tools/cdd"); err != nil { + if err := h.Record("/p/tools/cdd"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } } - if err := h.Record("tools/other"); err != nil { + if err := h.Record("/p/tools/other"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } - n, err := h.Count("tools/cdd") + n, err := h.Count("/p/tools/cdd") if err != nil { t.Fatalf("Count: unexpected error: %v", err) } @@ -129,7 +129,7 @@ func TestCount_PerProject(t *testing.T) { t.Errorf("Count(tools/cdd) = %d, want 3", n) } - n, err = h.Count("tools/never-visited") + n, err = h.Count("/p/tools/never-visited") if err != nil { t.Fatalf("Count: unexpected error: %v", err) } @@ -148,11 +148,11 @@ func TestCounts_AllProjectsInOneRead(t *testing.T) { } for range 3 { - if err := h.Record("tools/cdd"); err != nil { + if err := h.Record("/p/tools/cdd"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } } - if err := h.Record("tools/other"); err != nil { + if err := h.Record("/p/tools/other"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } @@ -160,7 +160,7 @@ func TestCounts_AllProjectsInOneRead(t *testing.T) { if err != nil { t.Fatalf("Counts: unexpected error: %v", err) } - want := map[string]int{"tools/cdd": 3, "tools/other": 1} + want := map[string]int{"/p/tools/cdd": 3, "/p/tools/other": 1} if len(counts) != len(want) { t.Fatalf("Counts: got %d Projects, want %d", len(counts), len(want)) } @@ -169,8 +169,8 @@ func TestCounts_AllProjectsInOneRead(t *testing.T) { t.Errorf("Counts[%q] = %d, want %d", project, counts[project], n) } } - if counts["never/visited"] != 0 { - t.Errorf("Counts of an unvisited Project = %d, want 0", counts["never/visited"]) + if counts["/never/visited"] != 0 { + t.Errorf("Counts of an unvisited Project = %d, want 0", counts["/never/visited"]) } } @@ -178,10 +178,11 @@ func TestReadVisits_SkipsMalformedLines(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "history") - content := "2026-09-16T14:03:22Z\tjump\ttools/cdd\n" + + content := "2026-09-16T14:03:22Z\tjump\t/p/tools/cdd\n" + "not a valid line\n" + - "2026-09-16T14:04:00Z\tflyby\ttools/bad-source\n" + - "2026-09-16T14:05:00Z\tjump\ttools/good\n" + "2026-09-16T14:04:00Z\tflyby\t/p/tools/bad-source\n" + + "2026-09-16T14:04:30Z\tjump\ttools/root-relative\n" + + "2026-09-16T14:05:00Z\tjump\t/p/tools/good\n" if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) } @@ -209,9 +210,9 @@ func TestReadVisits_SkipsOverLongMalformedLine(t *testing.T) { path := filepath.Join(dir, "history") garbage := strings.Repeat("x", 100*1024) // well past the 64 KiB limit - content := "2026-09-16T14:03:22Z\tjump\ttools/cdd\n" + + content := "2026-09-16T14:03:22Z\tjump\t/p/tools/cdd\n" + garbage + "\n" + - "2026-09-16T14:05:00Z\tjump\ttools/good\n" + "2026-09-16T14:05:00Z\tjump\t/p/tools/good\n" if err := os.WriteFile(path, []byte(content), 0o644); err != nil { t.Fatalf("WriteFile: unexpected error: %v", err) } @@ -229,3 +230,17 @@ func TestReadVisits_SkipsOverLongMalformedLine(t *testing.T) { t.Fatalf("Latest: got %d visits, want 2 (over-long line skipped, surrounding lines parsed)", len(latest)) } } + +func TestRecord_RejectsRelativeProject(t *testing.T) { + h, err := history.Open(filepath.Join(t.TempDir(), "history"), 1000) + if err != nil { + t.Fatalf("Open: unexpected error: %v", err) + } + + if err := h.Record("tools/cdd"); err == nil { + t.Error("Record: want an error for a relative Project, got nil") + } + if err := h.Seed("tools/cdd", time.Now()); err == nil { + t.Error("Seed: want an error for a relative Project, got nil") + } +} diff --git a/internal/history/line.go b/internal/history/line.go index 9c89d4f..46062a5 100644 --- a/internal/history/line.go +++ b/internal/history/line.go @@ -4,6 +4,7 @@ import ( "bufio" "io" "os" + "path/filepath" "strings" "time" ) @@ -16,7 +17,8 @@ func formatLine(v Visit) string { // parseLine parses one History line into a Visit. It reports ok=false for // any malformed line: wrong field count, an unparseable timestamp, an -// unknown source, or an empty Project. +// unknown source, or a Project that is not an absolute path (which also +// covers the Root-relative lines History held before v0.3.0). func parseLine(line string) (v Visit, ok bool) { fields := strings.Split(line, "\t") if len(fields) != 3 { @@ -39,7 +41,7 @@ func parseLine(line string) (v Visit, ok bool) { } project := fields[2] - if project == "" { + if !filepath.IsAbs(project) { return Visit{}, false } diff --git a/internal/history/seed_test.go b/internal/history/seed_test.go index b497fe5..91151ad 100644 --- a/internal/history/seed_test.go +++ b/internal/history/seed_test.go @@ -16,7 +16,7 @@ func TestSeed_AppendsWhenProjectHasNoVisit(t *testing.T) { } at := time.Date(2026, 9, 16, 14, 0, 0, 0, time.UTC) - if err := h.Seed("tools/cdd", at); err != nil { + if err := h.Seed("/p/tools/cdd", at); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } @@ -45,14 +45,14 @@ func TestSeed_AppendsWhenNewestVisitIsOlderScan(t *testing.T) { older := time.Date(2026, 9, 16, 14, 0, 0, 0, time.UTC) newer := time.Date(2026, 9, 16, 15, 0, 0, 0, time.UTC) - if err := h.Seed("tools/cdd", older); err != nil { + if err := h.Seed("/p/tools/cdd", older); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } - if err := h.Seed("tools/cdd", newer); err != nil { + if err := h.Seed("/p/tools/cdd", newer); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } - n, err := h.Count("tools/cdd") + n, err := h.Count("/p/tools/cdd") if err != nil { t.Fatalf("Count: unexpected error: %v", err) } @@ -79,14 +79,14 @@ func TestSeed_SkipsWhenNewestVisitIsScanNotOlder(t *testing.T) { at := time.Date(2026, 9, 16, 14, 0, 0, 0, time.UTC) earlierOrEqual := at // same instant: not strictly older, so no append - if err := h.Seed("tools/cdd", at); err != nil { + if err := h.Seed("/p/tools/cdd", at); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } - if err := h.Seed("tools/cdd", earlierOrEqual); err != nil { + if err := h.Seed("/p/tools/cdd", earlierOrEqual); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } - n, err := h.Count("tools/cdd") + n, err := h.Count("/p/tools/cdd") if err != nil { t.Fatalf("Count: unexpected error: %v", err) } @@ -102,18 +102,18 @@ func TestSeed_SkipsWhenNewestVisitIsJump(t *testing.T) { t.Fatalf("Open: unexpected error: %v", err) } - if err := h.Record("tools/cdd"); err != nil { + if err := h.Record("/p/tools/cdd"); err != nil { t.Fatalf("Record: unexpected error: %v", err) } // A Scan dated well in the future must still never overwrite a jump // Visit. future := time.Now().UTC().Add(24 * time.Hour) - if err := h.Seed("tools/cdd", future); err != nil { + if err := h.Seed("/p/tools/cdd", future); err != nil { t.Fatalf("Seed: unexpected error: %v", err) } - n, err := h.Count("tools/cdd") + n, err := h.Count("/p/tools/cdd") if err != nil { t.Fatalf("Count: unexpected error: %v", err) } diff --git a/internal/history/write.go b/internal/history/write.go index 37e2ee5..449827d 100644 --- a/internal/history/write.go +++ b/internal/history/write.go @@ -13,19 +13,25 @@ import ( // 4 KiB advisory limit. const maxLineBytes = 4096 -// Record appends a jump Visit for project, timestamped now (UTC, second -// precision). +// Record appends a jump Visit for project, an absolute path, timestamped +// now (UTC, second precision). func (h *History) Record(project string) error { + if err := checkAbs(project); err != nil { + return err + } v := Visit{At: time.Now().UTC(), Source: SourceJump, Project: project} return h.withLock(func(f *os.File) error { return h.appendAndCompact(f, v) }) } -// Seed appends a scan Visit for project, timestamped at, but only if the -// Project has no Visit at all, or its newest Visit is a scan line older -// than at. A jump Visit is never overwritten by a Scan. +// Seed appends a scan Visit for project, an absolute path, timestamped at, +// but only if the Project has no Visit at all, or its newest Visit is a scan +// line older than at. A jump Visit is never overwritten by a Scan. func (h *History) Seed(project string, at time.Time) error { + if err := checkAbs(project); err != nil { + return err + } v := Visit{At: at.UTC(), Source: SourceScan, Project: project} return h.withLock(func(f *os.File) error { visits, err := parseVisits(f) @@ -42,6 +48,15 @@ func (h *History) Seed(project string, at time.Time) error { }) } +// checkAbs rejects a Project that is not an absolute path: readVisits would +// skip its line as malformed, so the Visit would be silently lost. +func checkAbs(project string) error { + if !filepath.IsAbs(project) { + return fmt.Errorf("history: project %q is not an absolute path", project) + } + return nil +} + // newestFor returns the newest Visit recorded for project, if any. func newestFor(visits []Visit, project string) (Visit, bool) { var newest Visit From 74567f9e0753347493130794d9ea4d0f67a1c836 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:28:29 +0500 Subject: [PATCH 3/9] feat(scan): find git repositories at any depth below the dirs given to cdd scan Projects are now any directory holding .git, found by walking the dirs passed to cdd scan (home by default). The Picker lists History alone, dropping Stale Visits, and exact-match accepts a name or trailing path. Refs #57 --- internal/cli/cli.go | 2 +- internal/cli/cli_test.go | 8 - internal/cli/scan.go | 23 ++- internal/jump/jump.go | 79 +++++----- internal/jump/order.go | 57 ------- internal/jump/order_test.go | 135 ----------------- internal/jump/resolve_test.go | 225 ++++++++++++++++------------ internal/jump/rows.go | 47 ++++++ internal/jump/rows_test.go | 67 +++++++++ internal/project/discover.go | 179 ++++++++++------------ internal/project/discover_test.go | 241 +++++++++++++++--------------- internal/project/project.go | 31 ++-- internal/project/project_test.go | 21 +-- internal/scan/evidence.go | 29 ++-- internal/scan/scan.go | 32 ++-- internal/scan/scan_test.go | 74 +++++---- 16 files changed, 606 insertions(+), 644 deletions(-) delete mode 100644 internal/jump/order.go delete mode 100644 internal/jump/order_test.go create mode 100644 internal/jump/rows.go create mode 100644 internal/jump/rows_test.go diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 4e22aa7..27d63f1 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -56,7 +56,7 @@ func Run(args []string, stdout, stderr io.Writer) int { func newRootCmd() *cobra.Command { root := &cobra.Command{ Use: "cdd", - Short: "cdd finds Projects under a Root and Jumps to the one you pick", + Short: "cdd Jumps to the git repository you pick from your recent Projects", } root.Flags().BoolP("version", "V", false, "print the cdd version and exit") diff --git a/internal/cli/cli_test.go b/internal/cli/cli_test.go index b8c9a39..131a702 100644 --- a/internal/cli/cli_test.go +++ b/internal/cli/cli_test.go @@ -149,14 +149,6 @@ func TestPickUsageError(t *testing.T) { } } -// TestScanUsageError checks that "cdd scan" with an argument exits 2. -func TestScanUsageError(t *testing.T) { - code, _, _ := runCLI(t, "scan", "extra") - if code != 2 { - t.Errorf("exit code = %d, want 2", code) - } -} - // TestHelp checks that "cdd help" and "cdd --help" both exit 0 and print // something to stdout. func TestHelp(t *testing.T) { diff --git a/internal/cli/scan.go b/internal/cli/scan.go index ba3f0ca..36a5237 100644 --- a/internal/cli/scan.go +++ b/internal/cli/scan.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "os" "github.com/spf13/cobra" @@ -10,14 +11,22 @@ import ( "github.com/kryft-dev/cdd/internal/scan" ) -// newScanCmd builds "cdd scan": seed History with one Visit per discovered -// Project and print a one-line summary. +// newScanCmd builds "cdd scan [dir...]": seed History with one Visit per +// Project found at any depth below each dir (the home directory when none +// is given) and print a one-line summary. func newScanCmd() *cobra.Command { return &cobra.Command{ - Use: "scan", - Short: "seed History with one Visit per discovered Project", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + Use: "scan [dir...]", + Short: "seed History with one Visit per git repository found below each dir (default: home)", + RunE: func(cmd *cobra.Command, dirs []string) error { + if len(dirs) == 0 { + home, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("cdd: locate home directory: %w", err) + } + dirs = []string{home} + } + cfg, err := config.Load() if err != nil { return err @@ -33,7 +42,7 @@ func newScanCmd() *cobra.Command { return err } - summary, err := scan.Run(cmd.Context(), cfg, hist) + summary, err := scan.Run(cmd.Context(), dirs, cfg, hist) if err != nil { return err } diff --git a/internal/jump/jump.go b/internal/jump/jump.go index 7807f53..0e308eb 100644 --- a/internal/jump/jump.go +++ b/internal/jump/jump.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" "os" - "path" + "path/filepath" + "strings" "github.com/kryft-dev/cdd/internal/config" "github.com/kryft-dev/cdd/internal/git" @@ -24,19 +25,14 @@ var ErrCancelled = errors.New("jump: cancelled") type PickFunc func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) // Resolve runs the pick flow that turns query into the absolute path of -// the Project to Jump to: discover Projects, read History's latest Visits, -// take the exact-match shortcut on a Project's Name or Rel, otherwise run -// the Picker (via pick) with query prefilled, confirm the chosen -// directory still exists, Record the Visit, and return the absolute path. +// the Project to Jump to: read History's latest Visits, drop the Stale +// ones, take the exact-match shortcut on a Project's name or trailing path, +// otherwise run the Picker (via pick) with query prefilled, confirm the +// chosen directory still exists, Record the Visit, and return the path. // // A cancelled Picker yields ErrCancelled. A Visit that fails to Record // only prints a warning to stderr; Resolve still returns the path. func Resolve(ctx context.Context, cfg config.Config, hist *history.History, query string, pick PickFunc) (string, error) { - projects, err := project.Discover(cfg.Root, cfg.Exclude, cfg.IncludeHidden) - if err != nil { - return "", fmt.Errorf("jump: discover projects: %w", err) - } - latest, err := hist.Latest() if err != nil { return "", fmt.Errorf("jump: %w", err) @@ -47,30 +43,43 @@ func Resolve(ctx context.Context, cfg config.Config, hist *history.History, quer return "", fmt.Errorf("jump: %w", err) } - rel, abs, err := choose(cfg, projects, latest, counts, query, pick) + path, err := choose(cfg, live(latest), counts, query, pick) if err != nil { return "", err } - if _, err := os.Stat(abs); err != nil { - return "", fmt.Errorf("jump: %q no longer exists: %w", abs, err) + if _, err := os.Stat(path); err != nil { + return "", fmt.Errorf("jump: %q no longer exists: %w", path, err) } - if err := hist.Record(rel); err != nil { - fmt.Fprintf(os.Stderr, "cdd: warning: recording Visit for %q: %v\n", rel, err) + if err := hist.Record(path); err != nil { + fmt.Fprintf(os.Stderr, "cdd: warning: recording Visit for %q: %v\n", path, err) } - return abs, nil + return path, nil +} + +// live drops each Stale Visit from latest: one whose Project no longer +// holds a git repository. +func live(latest []history.Visit) []history.Visit { + out := make([]history.Visit, 0, len(latest)) + for _, v := range latest { + if project.IsRepo(v.Project) { + out = append(out, v) + } + } + return out } // choose picks a Project either via the exact-match shortcut or by running -// the Picker, and returns its Rel and absolute path. -func choose(cfg config.Config, projects []project.Project, latest []history.Visit, counts map[string]int, query string, pick PickFunc) (rel, abs string, err error) { - if p, ok := exactMatch(projects, query); ok { - return p.Rel(), p.Abs(cfg.Root), nil +// the Picker, and returns its absolute path. +func choose(cfg config.Config, latest []history.Visit, counts map[string]int, query string, pick PickFunc) (string, error) { + if p, ok := exactMatch(latest, query); ok { + return p, nil } - rows := order(projects, latest, counts, cfg.Root) + home, _ := os.UserHomeDir() + rows := toRows(latest, counts, home) status := func(c context.Context, dir string) git.Status { s, _ := git.GetStatus(c, dir) return s @@ -78,29 +87,29 @@ func choose(cfg config.Config, projects []project.Project, latest []history.Visi row, ok, err := pick(rows, status, picker.Options{Vim: cfg.Keys.Vim, Query: query, Layout: picker.LayoutStyle(cfg.Picker.Layout)}) if err != nil { - return "", "", fmt.Errorf("jump: %w", err) + return "", fmt.Errorf("jump: %w", err) } if !ok { - return "", "", ErrCancelled + return "", ErrCancelled } - - rel = path.Join(row.Project.Kind, row.Project.Name) - return rel, row.Project.Path, nil + return row.Project.Path, nil } -// exactMatch reports whether query is exactly one Project's Name or Rel. -// A query matching two or more Projects (e.g. the same Name in different -// Kinds), or none, is not an exact match. -func exactMatch(projects []project.Project, query string) (project.Project, bool) { +// exactMatch reports whether query names exactly one Project in latest: +// its name, or any trailing run of its path ("cdd", "tools/cdd"), or the +// whole path. A query matching two or more Projects, or none, is not an +// exact match. +func exactMatch(latest []history.Visit, query string) (string, bool) { + query = strings.TrimSuffix(query, "/") if query == "" { - return project.Project{}, false + return "", false } - var found project.Project + var found string count := 0 - for _, p := range projects { - if p.Name == query || p.Rel() == query { - found = p + for _, v := range latest { + if v.Project == query || strings.HasSuffix(v.Project, string(filepath.Separator)+query) { + found = v.Project count++ } } diff --git a/internal/jump/order.go b/internal/jump/order.go deleted file mode 100644 index 23b4196..0000000 --- a/internal/jump/order.go +++ /dev/null @@ -1,57 +0,0 @@ -// Package jump resolves the query a Jump starts from into the chosen -// Project's absolute path: it discovers Projects, orders them by History, -// takes the exact-match shortcut, and otherwise runs the Picker. -package jump - -import ( - "sort" - "time" - - "github.com/kryft-dev/cdd/internal/history" - "github.com/kryft-dev/cdd/internal/picker" - "github.com/kryft-dev/cdd/internal/project" -) - -// order applies the ordering rule to projects, given History's latest -// Visits: Projects with a Visit come first, newest Visit first, ties break -// alphabetically by Rel; never-visited Projects follow, alphabetically. A -// Visit for a Project not present in projects (a Stale Visit) contributes -// no row. counts supplies each Project's Visit total for the preview and -// may be nil. order is a pure function: it does not touch the filesystem or -// History itself. -func order(projects []project.Project, latest []history.Visit, counts map[string]int, root string) []picker.Row { - lastVisit := make(map[string]time.Time, len(latest)) - for _, v := range latest { - lastVisit[v.Project] = v.At - } - - ranked := make([]project.Project, len(projects)) - copy(ranked, projects) - - sort.SliceStable(ranked, func(i, j int) bool { - a, b := ranked[i], ranked[j] - aAt, aVisited := lastVisit[a.Rel()] - bAt, bVisited := lastVisit[b.Rel()] - if aVisited != bVisited { - return aVisited - } - if aVisited && !aAt.Equal(bAt) { - return aAt.After(bAt) - } - return a.Rel() < b.Rel() - }) - - rows := make([]picker.Row, len(ranked)) - for i, p := range ranked { - rows[i] = picker.Row{ - Project: picker.Project{ - Kind: p.Kind, - Name: p.Name, - Path: p.Abs(root), - }, - LastVisit: lastVisit[p.Rel()], - Visits: counts[p.Rel()], - } - } - return rows -} diff --git a/internal/jump/order_test.go b/internal/jump/order_test.go deleted file mode 100644 index ac27544..0000000 --- a/internal/jump/order_test.go +++ /dev/null @@ -1,135 +0,0 @@ -package jump - -import ( - "testing" - "time" - - "github.com/kryft-dev/cdd/internal/history" - "github.com/kryft-dev/cdd/internal/picker" - "github.com/kryft-dev/cdd/internal/project" -) - -// TestOrder_VisitedFirstNewestThenNeverVisited checks the ordering rule: -// Projects with a Visit come first, newest Visit first, ties break -// alphabetically by Rel, and never-visited Projects follow, alphabetically. -func TestOrder_VisitedFirstNewestThenNeverVisited(t *testing.T) { - projects := []project.Project{ - {Kind: "tools", Name: "cdd"}, - {Kind: "tools", Name: "dotfiles"}, - {Kind: "oss", Name: "lib"}, - {Kind: "work", Name: "api"}, - {Kind: "archive", Name: "old"}, - } - - latest := []history.Visit{ - {Project: "tools/cdd", At: time.Unix(3000, 0)}, - {Project: "work/api", At: time.Unix(5000, 0)}, - {Project: "oss/lib", At: time.Unix(1000, 0)}, - } - - got := order(projects, latest, nil, "/root") - - want := []string{ - "work/api", // newest Visit - "tools/cdd", // next newest Visit - "oss/lib", // oldest Visit - "archive/old", // never visited, alphabetical - "tools/dotfiles", // never visited, alphabetical - } - - assertRowOrder(t, got, want) -} - -// TestOrder_TiesBreakAlphabetically checks that Projects sharing the exact -// same Visit timestamp sort alphabetically by Rel among themselves. -func TestOrder_TiesBreakAlphabetically(t *testing.T) { - projects := []project.Project{ - {Kind: "tools", Name: "zeta"}, - {Kind: "tools", Name: "alpha"}, - } - - tie := time.Unix(1000, 0) - latest := []history.Visit{ - {Project: "tools/zeta", At: tie}, - {Project: "tools/alpha", At: tie}, - } - - got := order(projects, latest, nil, "/root") - - want := []string{"tools/alpha", "tools/zeta"} - assertRowOrder(t, got, want) -} - -// TestOrder_NeverVisitedAlphabetical checks that, with no Visits at all, -// order falls back to plain alphabetical by Rel. -func TestOrder_NeverVisitedAlphabetical(t *testing.T) { - projects := []project.Project{ - {Kind: "tools", Name: "zeta"}, - {Kind: "archive", Name: "old"}, - {Kind: "tools", Name: "alpha"}, - } - - got := order(projects, nil, nil, "/root") - - want := []string{"archive/old", "tools/alpha", "tools/zeta"} - assertRowOrder(t, got, want) -} - -// TestOrder_StaleVisitContributesNoRow checks that a Visit for a Project no -// longer discovered (a Stale Visit) does not appear as a row, and that the -// remaining rows order as if it never existed. -func TestOrder_StaleVisitContributesNoRow(t *testing.T) { - projects := []project.Project{ - {Kind: "tools", Name: "cdd"}, - } - - latest := []history.Visit{ - {Project: "tools/cdd", At: time.Unix(1000, 0)}, - {Project: "gone/vanished", At: time.Unix(9000, 0)}, - } - - got := order(projects, latest, nil, "/root") - - if len(got) != 1 { - t.Fatalf("order: got %d rows, want 1", len(got)) - } - if got[0].Project.Kind != "tools" || got[0].Project.Name != "cdd" { - t.Errorf("row = %+v, want tools/cdd", got[0]) - } -} - -// assertRowOrder checks got's rows, in order, have Rel (Kind/Name) matching -// want. -func assertRowOrder(t *testing.T, got []picker.Row, want []string) { - t.Helper() - - if len(got) != len(want) { - t.Fatalf("order: got %d rows, want %d", len(got), len(want)) - } - for i, w := range want { - rel := got[i].Project.Kind + "/" + got[i].Project.Name - if rel != w { - t.Errorf("row %d = %q, want %q", i, rel, w) - } - } -} - -// TestOrder_FillsVisitCounts checks that each row carries the Project's -// Visit total from counts, and zero for a Project counts does not know. -func TestOrder_FillsVisitCounts(t *testing.T) { - projects := []project.Project{ - {Kind: "tools", Name: "cdd"}, - {Kind: "tools", Name: "dotfiles"}, - } - latest := []history.Visit{{Project: "tools/cdd", At: time.Unix(3000, 0)}} - counts := map[string]int{"tools/cdd": 4} - - got := order(projects, latest, counts, "/root") - - if got[0].Visits != 4 { - t.Errorf("tools/cdd Visits = %d, want 4", got[0].Visits) - } - if got[1].Visits != 0 { - t.Errorf("tools/dotfiles Visits = %d, want 0", got[1].Visits) - } -} diff --git a/internal/jump/resolve_test.go b/internal/jump/resolve_test.go index a4e762a..730e19f 100644 --- a/internal/jump/resolve_test.go +++ b/internal/jump/resolve_test.go @@ -5,7 +5,9 @@ import ( "errors" "os" "path/filepath" + "slices" "testing" + "time" "github.com/kryft-dev/cdd/internal/config" "github.com/kryft-dev/cdd/internal/history" @@ -13,19 +15,35 @@ import ( "github.com/kryft-dev/cdd/internal/picker" ) -// mkProjects creates each rel path as a Kind/Name directory tree under -// root, and returns a Config pointing at root. -func mkProjects(t *testing.T, rels ...string) (config.Config, string) { +// mkProjects creates each rel path under a fresh root as a Project (a +// directory holding .git) and Records a Visit for it in hist, in order, so +// the last one is the most recent. It returns a Config and the root. +func mkProjects(t *testing.T, hist *history.History, rels ...string) (config.Config, string) { t.Helper() root := t.TempDir() for _, rel := range rels { - if err := os.MkdirAll(filepath.Join(root, rel), 0o755); err != nil { + if err := os.MkdirAll(filepath.Join(root, rel, ".git"), 0o755); err != nil { t.Fatalf("MkdirAll(%q): %v", rel, err) } + if err := hist.Record(filepath.Join(root, rel)); err != nil { + t.Fatalf("Record(%q): %v", rel, err) + } } - return config.Config{Root: root, History: config.History{MaxVisits: 1000}}, root + return config.Config{History: config.History{MaxVisits: 1000}}, root +} + +// capturePick returns a PickFunc that stores the rows and Options it was +// run with and chooses the row at path, or cancels when path is "". +func capturePick(rows *[]picker.Row, opts *picker.Options, path string) jump.PickFunc { + return func(r []picker.Row, _ picker.StatusFunc, o picker.Options) (picker.Row, bool, error) { + *rows, *opts = r, o + if path == "" { + return picker.Row{}, false, nil + } + return picker.Row{Project: picker.Project{Path: path}}, true, nil + } } // newHistory opens a fresh History in a temp directory. @@ -50,91 +68,136 @@ func failPick(t *testing.T) jump.PickFunc { } } -func TestResolve_ExactNameShortcutSkipsPicker(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd") - hist := newHistory(t) - - got, err := jump.Resolve(context.Background(), cfg, hist, "cdd", failPick(t)) - if err != nil { - t.Fatalf("Resolve: unexpected error: %v", err) +func TestResolve_ExactMatchShortcutSkipsPicker(t *testing.T) { + tests := []struct { + name, query, want string + }{ + {"name", "grg", "tools/grg"}, + {"trailing path", "tools/cdd", "tools/cdd"}, + {"trailing path with slash", "tools/cdd/", "tools/cdd"}, + {"deeper trailing path", "work/client/cdd", "work/client/cdd"}, } - want := filepath.Join(root, "tools", "cdd") - if got != want { - t.Errorf("Resolve = %q, want %q", got, want) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + hist := newHistory(t) + cfg, root := mkProjects(t, hist, "tools/cdd", "tools/grg", "work/client/cdd") + + got, err := jump.Resolve(context.Background(), cfg, hist, tt.query, failPick(t)) + if err != nil { + t.Fatalf("Resolve: unexpected error: %v", err) + } + if want := filepath.Join(root, tt.want); got != want { + t.Errorf("Resolve = %q, want %q", got, want) + } + }) } - - assertRecorded(t, hist, "tools/cdd") } -func TestResolve_ExactKindNameShortcutSkipsPicker(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd", "archive/cdd") +func TestResolve_WholePathShortcutSkipsPicker(t *testing.T) { hist := newHistory(t) + cfg, root := mkProjects(t, hist, "tools/cdd") + want := filepath.Join(root, "tools", "cdd") - got, err := jump.Resolve(context.Background(), cfg, hist, "tools/cdd", failPick(t)) + got, err := jump.Resolve(context.Background(), cfg, hist, want, failPick(t)) if err != nil { t.Fatalf("Resolve: unexpected error: %v", err) } - - want := filepath.Join(root, "tools", "cdd") if got != want { t.Errorf("Resolve = %q, want %q", got, want) } +} - assertRecorded(t, hist, "tools/cdd") +func TestResolve_AmbiguousOrPartialQueryOpensPickerPrefilled(t *testing.T) { + for _, query := range []string{"cdd", "ools/cdd", "nope"} { + t.Run(query, func(t *testing.T) { + hist := newHistory(t) + cfg, root := mkProjects(t, hist, "archive/cdd", "tools/cdd") + want := filepath.Join(root, "tools", "cdd") + + var rows []picker.Row + var opts picker.Options + got, err := jump.Resolve(context.Background(), cfg, hist, query, capturePick(&rows, &opts, want)) + if err != nil { + t.Fatalf("Resolve: unexpected error: %v", err) + } + + if opts.Query != query { + t.Errorf("Picker Query = %q, want %q", opts.Query, query) + } + if len(rows) != 2 { + t.Errorf("Picker got %d rows, want 2", len(rows)) + } + if got != want { + t.Errorf("Resolve = %q, want %q", got, want) + } + assertRecorded(t, hist, want) + }) + } } -func TestResolve_AmbiguousNameOpensPickerPrefilled(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd", "archive/cdd") +func TestResolve_RowsComeFromHistoryNewestFirst(t *testing.T) { hist := newHistory(t) + cfg, root := mkProjects(t, hist, "old") + if err := os.MkdirAll(filepath.Join(root, "never-visited", ".git"), 0o755); err != nil { + t.Fatalf("MkdirAll: %v", err) + } + newer := filepath.Join(root, "newer") + if err := os.MkdirAll(filepath.Join(newer, ".git"), 0o755); err != nil { + t.Fatalf("MkdirAll: %v", err) + } + if err := hist.Seed(newer, time.Now().Add(time.Hour)); err != nil { + t.Fatalf("Seed: %v", err) + } + + var rows []picker.Row + var opts picker.Options + _, _ = jump.Resolve(context.Background(), cfg, hist, "", capturePick(&rows, &opts, "")) - var gotQuery string - var gotRows int - pick := func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) { - gotQuery = opts.Query - gotRows = len(rows) - return picker.Row{Project: picker.Project{ - Kind: "tools", Name: "cdd", Path: filepath.Join(root, "tools", "cdd"), - }}, true, nil + var got []string + for _, r := range rows { + got = append(got, r.Project.Path) + } + want := []string{newer, filepath.Join(root, "old")} + if !slices.Equal(got, want) { + t.Errorf("Picker rows = %v, want %v (History only, newest first)", got, want) } +} - got, err := jump.Resolve(context.Background(), cfg, hist, "cdd", pick) - if err != nil { - t.Fatalf("Resolve: unexpected error: %v", err) +func TestResolve_StaleVisitGivesNoRowAndNoShortcut(t *testing.T) { + hist := newHistory(t) + cfg, root := mkProjects(t, hist, "tools/cdd", "archive/cdd") + if err := os.RemoveAll(filepath.Join(root, "archive", "cdd", ".git")); err != nil { + t.Fatalf("RemoveAll: %v", err) } - if gotQuery != "cdd" { - t.Errorf("Picker Query = %q, want %q", gotQuery, "cdd") + got, err := jump.Resolve(context.Background(), cfg, hist, "cdd", failPick(t)) + if err != nil { + t.Fatalf("Resolve: unexpected error: %v", err) } - if gotRows != 2 { - t.Errorf("Picker got %d rows, want 2 (both Projects named cdd)", gotRows) + if want := filepath.Join(root, "tools", "cdd"); got != want { + t.Errorf("Resolve = %q, want %q (the Stale Visit leaves one match)", got, want) } - want := filepath.Join(root, "tools", "cdd") - if got != want { - t.Errorf("Resolve = %q, want %q", got, want) + var rows []picker.Row + var opts picker.Options + _, _ = jump.Resolve(context.Background(), cfg, hist, "", capturePick(&rows, &opts, "")) + if len(rows) != 1 { + t.Errorf("Picker got %d rows, want 1 (Stale Visit dropped)", len(rows)) } - - assertRecorded(t, hist, "tools/cdd") } // TestResolve_ForwardsPickerOptions verifies that the config keys that // configure the Picker reach it: the vim key map and the layout. func TestResolve_ForwardsPickerOptions(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd") + hist := newHistory(t) + cfg, root := mkProjects(t, hist, "tools/cdd") cfg.Keys.Vim = true cfg.Picker.Layout = "list" - hist := newHistory(t) + var rows []picker.Row var got picker.Options - pick := func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) { - got = opts - return picker.Row{Project: picker.Project{ - Kind: "tools", Name: "cdd", Path: filepath.Join(root, "tools", "cdd"), - }}, true, nil - } - - if _, err := jump.Resolve(context.Background(), cfg, hist, "", pick); err != nil { + if _, err := jump.Resolve(context.Background(), cfg, hist, "", capturePick(&rows, &got, filepath.Join(root, "tools", "cdd"))); err != nil { t.Fatalf("Resolve: unexpected error: %v", err) } @@ -146,64 +209,38 @@ func TestResolve_ForwardsPickerOptions(t *testing.T) { } } -func TestResolve_NoMatchOpensPickerPrefilled(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd") - hist := newHistory(t) - - var gotQuery string - pick := func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) { - gotQuery = opts.Query - return picker.Row{Project: picker.Project{ - Kind: "tools", Name: "cdd", Path: filepath.Join(root, "tools", "cdd"), - }}, true, nil - } - - if _, err := jump.Resolve(context.Background(), cfg, hist, "nope", pick); err != nil { - t.Fatalf("Resolve: unexpected error: %v", err) - } - if gotQuery != "nope" { - t.Errorf("Picker Query = %q, want %q", gotQuery, "nope") - } -} - func TestResolve_CancelReturnsErrCancelled(t *testing.T) { - cfg, _ := mkProjects(t, "tools/cdd") hist := newHistory(t) + cfg, _ := mkProjects(t, hist, "tools/cdd") - pick := func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) { - return picker.Row{}, false, nil - } - - _, err := jump.Resolve(context.Background(), cfg, hist, "anything", pick) + var rows []picker.Row + var opts picker.Options + _, err := jump.Resolve(context.Background(), cfg, hist, "anything", capturePick(&rows, &opts, "")) if !errors.Is(err, jump.ErrCancelled) { t.Fatalf("Resolve error = %v, want ErrCancelled", err) } } func TestResolve_VanishedDirectoryErrors(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd") hist := newHistory(t) + cfg, root := mkProjects(t, hist, "tools/cdd") + var rows []picker.Row + var opts picker.Options gone := filepath.Join(root, "tools", "vanished") - pick := func(rows []picker.Row, status picker.StatusFunc, opts picker.Options) (picker.Row, bool, error) { - return picker.Row{Project: picker.Project{Kind: "tools", Name: "vanished", Path: gone}}, true, nil - } - - _, err := jump.Resolve(context.Background(), cfg, hist, "anything", pick) - if err == nil { + if _, err := jump.Resolve(context.Background(), cfg, hist, "anything", capturePick(&rows, &opts, gone)); err == nil { t.Fatal("Resolve: want error for a chosen directory that no longer exists, got nil") } } func TestResolve_FailingHistoryWriteStillReturnsPath(t *testing.T) { - cfg, root := mkProjects(t, "tools/cdd") - historyDir := t.TempDir() historyPath := filepath.Join(historyDir, "history") hist, err := history.Open(historyPath, 1000) if err != nil { t.Fatalf("history.Open: %v", err) } + cfg, root := mkProjects(t, hist, "tools/cdd") // Force Record to fail by making its directory unwritable, without // touching the Project directories under root. @@ -223,8 +260,8 @@ func TestResolve_FailingHistoryWriteStillReturnsPath(t *testing.T) { } } -// assertRecorded checks History's latest Visits contain rel. -func assertRecorded(t *testing.T, hist *history.History, rel string) { +// assertRecorded checks History's latest Visits contain path. +func assertRecorded(t *testing.T, hist *history.History, path string) { t.Helper() latest, err := hist.Latest() @@ -232,9 +269,9 @@ func assertRecorded(t *testing.T, hist *history.History, rel string) { t.Fatalf("Latest: %v", err) } for _, v := range latest { - if v.Project == rel { + if v.Project == path { return } } - t.Errorf("History has no Visit for %q after Resolve", rel) + t.Errorf("History has no Visit for %q after Resolve", path) } diff --git a/internal/jump/rows.go b/internal/jump/rows.go new file mode 100644 index 0000000..0081a49 --- /dev/null +++ b/internal/jump/rows.go @@ -0,0 +1,47 @@ +// Package jump resolves the query a Jump starts from into the chosen +// Project's absolute path: it reads History, drops Stale Visits, takes the +// exact-match shortcut, and otherwise runs the Picker. +package jump + +import ( + "path/filepath" + "strings" + + "github.com/kryft-dev/cdd/internal/history" + "github.com/kryft-dev/cdd/internal/picker" +) + +// toRows turns History's latest Visits, already newest first, into Picker +// rows in the same order. counts supplies each Project's Visit total for +// the preview and may be nil. home, when not empty, is shortened to "~" in +// each row's parent directory. toRows is a pure function: it does not touch +// the filesystem or History itself. +func toRows(latest []history.Visit, counts map[string]int, home string) []picker.Row { + rows := make([]picker.Row, len(latest)) + for i, v := range latest { + rows[i] = picker.Row{ + Project: picker.Project{ + Kind: shortenHome(filepath.Dir(v.Project), home), + Name: filepath.Base(v.Project), + Path: v.Project, + }, + LastVisit: v.At, + Visits: counts[v.Project], + } + } + return rows +} + +// shortenHome writes dir with a leading home replaced by "~". +func shortenHome(dir, home string) string { + if home == "" { + return dir + } + if dir == home { + return "~" + } + if rest, ok := strings.CutPrefix(dir, home+string(filepath.Separator)); ok { + return "~" + string(filepath.Separator) + rest + } + return dir +} diff --git a/internal/jump/rows_test.go b/internal/jump/rows_test.go new file mode 100644 index 0000000..1d19ff9 --- /dev/null +++ b/internal/jump/rows_test.go @@ -0,0 +1,67 @@ +package jump + +import ( + "testing" + "time" + + "github.com/kryft-dev/cdd/internal/history" +) + +// TestToRows_KeepsHistoryOrder checks that rows come out in the order +// History's latest Visits are given, newest first, each carrying its +// Visit's time. +func TestToRows_KeepsHistoryOrder(t *testing.T) { + latest := []history.Visit{ + {Project: "/home/me/work/api", At: time.Unix(5000, 0)}, + {Project: "/home/me/tools/cdd", At: time.Unix(3000, 0)}, + {Project: "/srv/lib", At: time.Unix(1000, 0)}, + } + + got := toRows(latest, nil, "/home/me") + + if len(got) != len(latest) { + t.Fatalf("toRows: got %d rows, want %d", len(got), len(latest)) + } + for i, v := range latest { + if got[i].Project.Path != v.Project || !got[i].LastVisit.Equal(v.At) { + t.Errorf("row %d = %+v, want %s at %v", i, got[i], v.Project, v.At) + } + } +} + +// TestToRows_SplitsParentAndName checks each row's parent directory, with +// the home directory shortened to "~", and its name. +func TestToRows_SplitsParentAndName(t *testing.T) { + tests := []struct { + path, home, dir, name string + }{ + {"/home/me/tools/cdd", "/home/me", "~/tools", "cdd"}, + {"/home/me/cdd", "/home/me", "~", "cdd"}, + {"/home/meta/cdd", "/home/me", "/home/meta", "cdd"}, + {"/srv/lib", "/home/me", "/srv", "lib"}, + {"/home/me/tools/cdd", "", "/home/me/tools", "cdd"}, + } + + for _, tt := range tests { + got := toRows([]history.Visit{{Project: tt.path}}, nil, tt.home)[0].Project + if got.Kind != tt.dir || got.Name != tt.name { + t.Errorf("toRows(%q, home %q) = %q + %q, want %q + %q", tt.path, tt.home, got.Kind, got.Name, tt.dir, tt.name) + } + } +} + +// TestToRows_FillsVisitCounts checks that each row carries the Project's +// Visit total from counts, and zero for a Project counts does not know. +func TestToRows_FillsVisitCounts(t *testing.T) { + latest := []history.Visit{{Project: "/p/cdd"}, {Project: "/p/dotfiles"}} + counts := map[string]int{"/p/cdd": 4} + + got := toRows(latest, counts, "") + + if got[0].Visits != 4 { + t.Errorf("/p/cdd Visits = %d, want 4", got[0].Visits) + } + if got[1].Visits != 0 { + t.Errorf("/p/dotfiles Visits = %d, want 0", got[1].Visits) + } +} diff --git a/internal/project/discover.go b/internal/project/discover.go index 75cd6e3..6f30c61 100644 --- a/internal/project/discover.go +++ b/internal/project/discover.go @@ -3,137 +3,120 @@ package project import ( "fmt" "os" - "path" "path/filepath" "sort" "strings" ) -// Discover walks root, treating every directory directly under root as a -// Kind and every directory directly under a Kind as a Project. Names -// starting with "." are skipped at both levels unless includeHidden is -// true. Each entry of exclude is matched with path.Match, once against the -// Kind name alone (e.g. "archive") and once against the Project's Rel -// (e.g. "tools/scratch", "archive/*", "*/node_modules"); a match at either -// level skips that Kind or Project. Symlinked directories count as -// directories; non-directories are ignored. The result is sorted by Rel. -func Discover(root string, exclude []string, includeHidden bool) ([]Project, error) { +// Discover walks each of dirs to any depth and returns the absolute path of +// every Project found, sorted and without duplicates. +// +// The walk stops descending at a Project, so repositories nested inside one +// are not listed, except in a directory named in dirs: that is always +// walked, and listed too when it is itself a Project. Symlinks met during +// the walk are not followed, though a directory in dirs may be one. +// Directories that cannot be read are skipped silently. +// +// Names starting with "." are skipped unless includeHidden is true. Each +// exclude pattern is matched with filepath.Match: a pattern containing "/" +// against a directory's absolute path (e.g. "/home/me/go/pkg/*"), any other +// against its name alone (e.g. "node_modules"). A match skips the directory +// and everything below it. +func Discover(dirs, exclude []string, includeHidden bool) ([]string, error) { if err := validatePatterns(exclude); err != nil { return nil, err } - kindEntries, err := os.ReadDir(root) - if err != nil { - return nil, fmt.Errorf("read root %q: %w", root, err) - } - - var projects []Project - for _, kindEntry := range kindEntries { - kind := kindEntry.Name() - if skipHidden(kind, includeHidden) { - continue - } - - isDir, err := isDirEntry(root, kindEntry) + w := walker{exclude: exclude, includeHidden: includeHidden, found: map[string]bool{}} + for _, dir := range dirs { + abs, err := filepath.Abs(dir) if err != nil { - return nil, err + return nil, fmt.Errorf("resolve %q: %w", dir, err) } - if !isDir { - continue - } - - matched, err := matchAny(exclude, kind) + info, err := os.Stat(abs) if err != nil { - return nil, err + return nil, fmt.Errorf("read %q: %w", dir, err) } - if matched { - continue - } - - kindPath := filepath.Join(root, kind) - projEntries, err := os.ReadDir(kindPath) - if err != nil { - return nil, fmt.Errorf("read kind %q: %w", kindPath, err) + if !info.IsDir() { + return nil, fmt.Errorf("%q is not a directory", dir) } + w.walk(abs, true) + } - for _, projEntry := range projEntries { - name := projEntry.Name() - if skipHidden(name, includeHidden) { - continue - } + projects := make([]string, 0, len(w.found)) + for p := range w.found { + projects = append(projects, p) + } + sort.Strings(projects) + return projects, nil +} - isDir, err := isDirEntry(kindPath, projEntry) - if err != nil { - return nil, err - } - if !isDir { - continue - } +// walker carries one Discover's settings and the Projects found so far. +type walker struct { + exclude []string + includeHidden bool + found map[string]bool +} - p := Project{Kind: kind, Name: name} +// walk records dir when it is a Project and descends into its child +// directories. given marks a directory named to Discover, which is walked +// even when it is a Project. +func (w walker) walk(dir string, given bool) { + entries, err := os.ReadDir(dir) + if err != nil { + return + } - matched, err := matchAny(exclude, p.Rel()) - if err != nil { - return nil, err + for _, e := range entries { + if e.Name() == gitEntry { + w.found[dir] = true + if !given { + return } - if matched { - continue - } - - projects = append(projects, p) + break } } - sort.Slice(projects, func(i, j int) bool { - return projects[i].Rel() < projects[j].Rel() - }) - - return projects, nil -} - -// skipHidden reports whether name should be skipped for starting with "." -// when includeHidden is false. -func skipHidden(name string, includeHidden bool) bool { - return !includeHidden && strings.HasPrefix(name, ".") + for _, e := range entries { + // A symlink's DirEntry is never a directory, so symlinks are not + // followed. + if !e.IsDir() || e.Name() == gitEntry { + continue + } + child := filepath.Join(dir, e.Name()) + if w.skip(e.Name(), child) { + continue + } + w.walk(child, false) + } } -// isDirEntry reports whether entry, found in dir, is a directory. A -// symlink is resolved and counts as a directory when its target is one; a -// broken symlink is treated as not a directory. -func isDirEntry(dir string, entry os.DirEntry) (bool, error) { - if entry.Type()&os.ModeSymlink == 0 { - return entry.IsDir(), nil +// skip reports whether the directory named name at path is hidden (and +// hidden directories are not included) or matches an exclude pattern. +func (w walker) skip(name, path string) bool { + if !w.includeHidden && strings.HasPrefix(name, ".") { + return true } - - info, err := os.Stat(filepath.Join(dir, entry.Name())) - if err != nil { - // A broken symlink is not a directory. - return false, nil + for _, p := range w.exclude { + target := name + if strings.Contains(p, "/") { + target = path + } + // validatePatterns has already rejected malformed patterns. + if matched, _ := filepath.Match(p, target); matched { + return true + } } - return info.IsDir(), nil + return false } // validatePatterns returns an error if any exclude pattern is malformed, -// per path.Match. +// per filepath.Match. func validatePatterns(exclude []string) error { for _, p := range exclude { - if _, err := path.Match(p, ""); err != nil { + if _, err := filepath.Match(p, ""); err != nil { return fmt.Errorf("invalid exclude pattern %q: %w", p, err) } } return nil } - -// matchAny reports whether s matches any of the exclude patterns. -func matchAny(exclude []string, s string) (bool, error) { - for _, p := range exclude { - matched, err := path.Match(p, s) - if err != nil { - return false, fmt.Errorf("invalid exclude pattern %q: %w", p, err) - } - if matched { - return true, nil - } - } - return false, nil -} diff --git a/internal/project/discover_test.go b/internal/project/discover_test.go index bf8f88c..227e761 100644 --- a/internal/project/discover_test.go +++ b/internal/project/discover_test.go @@ -3,6 +3,7 @@ package project_test import ( "os" "path/filepath" + "slices" "testing" "github.com/kryft-dev/cdd/internal/project" @@ -18,176 +19,176 @@ func mkDirs(t *testing.T, root string, rels ...string) { } } -func TestDiscoverNestedLayout(t *testing.T) { - root := t.TempDir() - mkDirs(t, root, "tools/cdd", "tools/scratch", "archive/old") +// mkRepos creates each rel path under root as a Project, with a .git +// directory inside it. +func mkRepos(t *testing.T, root string, rels ...string) { + t.Helper() + for _, rel := range rels { + mkDirs(t, root, filepath.Join(rel, ".git")) + } +} - got, err := project.Discover(root, nil, false) +// discover runs Discover over dirs and fails the test on error. +func discover(t *testing.T, dirs []string, exclude []string, includeHidden bool) []string { + t.Helper() + got, err := project.Discover(dirs, exclude, includeHidden) if err != nil { t.Fatalf("Discover: %v", err) } + return got +} - want := []project.Project{ - {Kind: "archive", Name: "old"}, - {Kind: "tools", Name: "cdd"}, - {Kind: "tools", Name: "scratch"}, +// assertProjects compares got against the Projects at want's rel paths +// under root, in order. +func assertProjects(t *testing.T, root string, got []string, want ...string) { + t.Helper() + abs := make([]string, len(want)) + for i, rel := range want { + abs[i] = filepath.Join(root, rel) + } + if !slices.Equal(got, abs) { + t.Errorf("Discover() = %v, want %v", got, abs) } - assertProjects(t, got, want) } -func TestDiscoverHiddenSkippedByDefault(t *testing.T) { +func TestDiscoverFindsReposAtAnyDepth(t *testing.T) { root := t.TempDir() - mkDirs(t, root, ".hidden/proj", "tools/.hidden", "tools/visible") + mkRepos(t, root, "cdd", "tools/grg", "work/client/api") + mkDirs(t, root, "notes/2026", "tools/scratch") - got, err := project.Discover(root, nil, false) - if err != nil { - t.Fatalf("Discover: %v", err) - } + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, "cdd", "tools/grg", "work/client/api") +} - want := []project.Project{ - {Kind: "tools", Name: "visible"}, +func TestDiscoverGitFileCountsAsRepo(t *testing.T) { + root := t.TempDir() + mkDirs(t, root, "worktree") + if err := os.WriteFile(filepath.Join(root, "worktree", ".git"), []byte("gitdir: /elsewhere\n"), 0o644); err != nil { + t.Fatalf("WriteFile: %v", err) } - assertProjects(t, got, want) + + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, "worktree") } -func TestDiscoverIncludeHidden(t *testing.T) { +func TestDiscoverStopsAtFirstRepo(t *testing.T) { root := t.TempDir() - mkDirs(t, root, ".hidden/proj", "tools/.hidden", "tools/visible") + mkRepos(t, root, "mono", "mono/vendor/lib") - got, err := project.Discover(root, nil, true) - if err != nil { - t.Fatalf("Discover: %v", err) - } + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, "mono") +} - want := []project.Project{ - {Kind: ".hidden", Name: "proj"}, - {Kind: "tools", Name: ".hidden"}, - {Kind: "tools", Name: "visible"}, - } - assertProjects(t, got, want) +func TestDiscoverWalksIntoGivenDirThatIsRepo(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, ".", "tools/cdd") + + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, ".", "tools/cdd") +} + +func TestDiscoverManyDirsDeduplicated(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, "a/one", "b/two") + + got := discover(t, []string{filepath.Join(root, "a"), filepath.Join(root, "b"), root}, nil, false) + assertProjects(t, root, got, "a/one", "b/two") +} + +func TestDiscoverRelativeDirResolved(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, "tools/cdd") + t.Chdir(root) + + got := discover(t, []string{"tools"}, nil, false) + assertProjects(t, root, got, "tools/cdd") +} + +func TestDiscoverHiddenSkippedByDefault(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, ".dotfiles", ".cache/deep/repo", "visible") + + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, "visible") +} + +func TestDiscoverIncludeHidden(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, ".dotfiles", ".cache/deep/repo", "visible") + + got := discover(t, []string{root}, nil, true) + assertProjects(t, root, got, ".cache/deep/repo", ".dotfiles", "visible") } func TestDiscoverExcludePatterns(t *testing.T) { + root := t.TempDir() tests := []struct { name string exclude []string - want []project.Project + want []string }{ - { - name: "kind name excludes whole kind", - exclude: []string{"archive"}, - want: []project.Project{ - {Kind: "tools", Name: "cdd"}, - {Kind: "tools", Name: "scratch"}, - }, - }, - { - name: "kind/name excludes one project", - exclude: []string{"tools/scratch"}, - want: []project.Project{ - {Kind: "archive", Name: "old"}, - {Kind: "tools", Name: "cdd"}, - }, - }, - { - name: "kind/* excludes all projects under a kind", - exclude: []string{"archive/*"}, - want: []project.Project{ - {Kind: "tools", Name: "cdd"}, - {Kind: "tools", Name: "scratch"}, - }, - }, - { - name: "*/name excludes a project name under any kind", - exclude: []string{"*/scratch"}, - want: []project.Project{ - {Kind: "archive", Name: "old"}, - {Kind: "tools", Name: "cdd"}, - }, - }, + {"name alone matches at any depth", []string{"archive"}, []string{"tools/cdd", "tools/scratch"}}, + {"name glob", []string{"scr*"}, []string{"archive/old", "tools/cdd"}}, + {"path pattern", []string{filepath.Join(root, "tools", "*")}, []string{"archive/old"}}, + {"path pattern names one directory", []string{filepath.Join(root, "tools", "scratch")}, []string{"archive/old", "tools/cdd"}}, } + mkRepos(t, root, "tools/cdd", "tools/scratch", "archive/old") for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - root := t.TempDir() - mkDirs(t, root, "tools/cdd", "tools/scratch", "archive/old") - - got, err := project.Discover(root, tt.exclude, false) - if err != nil { - t.Fatalf("Discover: %v", err) - } - assertProjects(t, got, tt.want) + got := discover(t, []string{root}, tt.exclude, false) + assertProjects(t, root, got, tt.want...) }) } } func TestDiscoverInvalidPattern(t *testing.T) { - root := t.TempDir() - mkDirs(t, root, "tools/cdd") - - _, err := project.Discover(root, []string{"["}, false) - if err == nil { + if _, err := project.Discover([]string{t.TempDir()}, []string{"["}, false); err == nil { t.Fatal("Discover with invalid pattern: want error, got nil") } } -func TestDiscoverIgnoresNonDirectories(t *testing.T) { - root := t.TempDir() - mkDirs(t, root, "tools") - if err := os.WriteFile(filepath.Join(root, "README.md"), []byte("x"), 0o644); err != nil { - t.Fatalf("WriteFile: %v", err) - } - if err := os.WriteFile(filepath.Join(root, "tools", "notes.txt"), []byte("x"), 0o644); err != nil { - t.Fatalf("WriteFile: %v", err) - } - mkDirs(t, root, "tools/cdd") - - got, err := project.Discover(root, nil, false) - if err != nil { - t.Fatalf("Discover: %v", err) +func TestDiscoverMissingDirIsError(t *testing.T) { + missing := filepath.Join(t.TempDir(), "missing") + if _, err := project.Discover([]string{missing}, nil, false); err == nil { + t.Fatal("Discover of a missing directory: want error, got nil") } - want := []project.Project{{Kind: "tools", Name: "cdd"}} - assertProjects(t, got, want) } -func TestDiscoverSymlinkedDirectoryCountsAsDirectory(t *testing.T) { +func TestDiscoverSymlinksNotFollowedDuringWalk(t *testing.T) { root := t.TempDir() elsewhere := t.TempDir() - mkDirs(t, elsewhere, "real-kind/real-project") - - if err := os.Symlink(filepath.Join(elsewhere, "real-kind"), filepath.Join(root, "linked-kind")); err != nil { + mkRepos(t, elsewhere, "real") + if err := os.Symlink(elsewhere, filepath.Join(root, "link")); err != nil { t.Fatalf("Symlink: %v", err) } - got, err := project.Discover(root, nil, false) - if err != nil { - t.Fatalf("Discover: %v", err) - } - want := []project.Project{{Kind: "linked-kind", Name: "real-project"}} - assertProjects(t, got, want) + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got) } -func TestDiscoverEmptyKindYieldsNothing(t *testing.T) { +func TestDiscoverGivenSymlinkIsFollowed(t *testing.T) { root := t.TempDir() - mkDirs(t, root, "empty-kind") - - got, err := project.Discover(root, nil, false) - if err != nil { - t.Fatalf("Discover: %v", err) + elsewhere := t.TempDir() + mkRepos(t, elsewhere, "real") + link := filepath.Join(root, "link") + if err := os.Symlink(elsewhere, link); err != nil { + t.Fatalf("Symlink: %v", err) } - assertProjects(t, got, nil) + + got := discover(t, []string{link}, nil, false) + assertProjects(t, link, got, "real") } -// assertProjects compares got against want by Rel(), since ordering and -// content are what Discover promises. -func assertProjects(t *testing.T, got, want []project.Project) { - t.Helper() - if len(got) != len(want) { - t.Fatalf("Discover() = %v, want %v", got, want) - } - for i := range got { - if got[i] != want[i] { - t.Errorf("Discover()[%d] = %+v, want %+v", i, got[i], want[i]) - } +func TestDiscoverUnreadableDirSkipped(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, "open/repo") + mkDirs(t, root, "locked") + if err := os.Chmod(filepath.Join(root, "locked"), 0); err != nil { + t.Fatalf("Chmod: %v", err) } + t.Cleanup(func() { _ = os.Chmod(filepath.Join(root, "locked"), 0o755) }) + + got := discover(t, []string{root}, nil, false) + assertProjects(t, root, got, "open/repo") } diff --git a/internal/project/project.go b/internal/project/project.go index 2b3600c..5c50139 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -1,27 +1,20 @@ -// Package project discovers Projects under a Root: every directory directly -// under Root is a Kind, and every directory directly under a Kind is a -// Project. +// Package project finds Projects, directories holding a git repository, by +// walking the directories a Scan is given, and tells whether a path still +// holds one. package project import ( - "path" + "os" "path/filepath" ) -// Project is a directory exactly one level below a Kind, identified by its -// path relative to Root. -type Project struct { - Kind string - Name string -} - -// Rel returns the Project's path relative to Root, as "kind/name". -func (p Project) Rel() string { - return path.Join(p.Kind, p.Name) -} +// gitEntry is the name whose presence, as a directory (a clone) or a file +// (a worktree or submodule), makes a directory a Project. +const gitEntry = ".git" -// Abs returns the Project's absolute path given root, the Root it was -// discovered under. -func (p Project) Abs(root string) string { - return filepath.Join(root, p.Kind, p.Name) +// IsRepo reports whether dir holds a git repository: a .git directory or +// file directly inside it. +func IsRepo(dir string) bool { + _, err := os.Lstat(filepath.Join(dir, gitEntry)) + return err == nil } diff --git a/internal/project/project_test.go b/internal/project/project_test.go index 465858f..6b4d882 100644 --- a/internal/project/project_test.go +++ b/internal/project/project_test.go @@ -1,23 +1,24 @@ package project_test import ( + "os" "path/filepath" "testing" "github.com/kryft-dev/cdd/internal/project" ) -func TestProjectRel(t *testing.T) { - p := project.Project{Kind: "tools", Name: "cdd"} - if got, want := p.Rel(), "tools/cdd"; got != want { - t.Errorf("Rel() = %q, want %q", got, want) +func TestIsRepo(t *testing.T) { + root := t.TempDir() + mkRepos(t, root, "clone") + mkDirs(t, root, "plain", "worktree") + if err := os.WriteFile(filepath.Join(root, "worktree", ".git"), []byte("gitdir: /elsewhere\n"), 0o644); err != nil { + t.Fatalf("WriteFile: %v", err) } -} -func TestProjectAbs(t *testing.T) { - p := project.Project{Kind: "tools", Name: "cdd"} - root := "/home/user/Developer" - if got, want := p.Abs(root), filepath.Join(root, "tools", "cdd"); got != want { - t.Errorf("Abs(%q) = %q, want %q", root, got, want) + for dir, want := range map[string]bool{"clone": true, "worktree": true, "plain": false, "missing": false} { + if got := project.IsRepo(filepath.Join(root, dir)); got != want { + t.Errorf("IsRepo(%s) = %v, want %v", dir, got, want) + } } } diff --git a/internal/scan/evidence.go b/internal/scan/evidence.go index 669256a..ee84d5e 100644 --- a/internal/scan/evidence.go +++ b/internal/scan/evidence.go @@ -8,22 +8,21 @@ import ( "time" "github.com/kryft-dev/cdd/internal/git" - "github.com/kryft-dev/cdd/internal/project" ) // workers bounds the number of concurrent git calls a Scan makes while -// gathering each Project's evidence time, so scanning a large Root never +// gathering each Project's evidence time, so a Scan finding many Projects never // spawns one git process per Project at once. const workers = 8 -// gatherEvidence returns each Project's evidence time, keyed by Rel: the -// Project's git.LastCommit time when it is a repository with a commit, -// else its directory's mtime. Git calls are bounded to workers at a time. -func gatherEvidence(ctx context.Context, root string, projects []project.Project) (map[string]time.Time, error) { +// gatherEvidence returns each Project's evidence time, keyed by its path: +// the Project's git.LastCommit time when the repository has a commit, else +// its directory's mtime. Git calls are bounded to workers at a time. +func gatherEvidence(ctx context.Context, projects []string) (map[string]time.Time, error) { type result struct { - rel string - at time.Time - err error + path string + at time.Time + err error } sem := make(chan struct{}, workers) @@ -32,14 +31,14 @@ func gatherEvidence(ctx context.Context, root string, projects []project.Project for _, p := range projects { wg.Add(1) - go func(p project.Project) { + go func(p string) { defer wg.Done() sem <- struct{}{} defer func() { <-sem }() - at, err := evidenceTime(ctx, p.Abs(root)) - results <- result{rel: p.Rel(), at: at, err: err} + at, err := evidenceTime(ctx, p) + results <- result{path: p, at: at, err: err} }(p) } @@ -51,15 +50,15 @@ func gatherEvidence(ctx context.Context, root string, projects []project.Project evidence := make(map[string]time.Time, len(projects)) for r := range results { if r.err != nil { - return nil, fmt.Errorf("scan: evidence time for %q: %w", r.rel, r.err) + return nil, fmt.Errorf("scan: evidence time for %q: %w", r.path, r.err) } - evidence[r.rel] = r.at + evidence[r.path] = r.at } return evidence, nil } // evidenceTime returns dir's evidence time: its git.LastCommit time when -// dir is a repository with a commit, else dir's mtime. The result is +// the repository has a commit, else dir's mtime. The result is // truncated to UTC second precision, matching History's own line format, so // repeated Scans compare equal rather than drifting on sub-second noise. func evidenceTime(ctx context.Context, dir string) (time.Time, error) { diff --git a/internal/scan/scan.go b/internal/scan/scan.go index b94422c..e400408 100644 --- a/internal/scan/scan.go +++ b/internal/scan/scan.go @@ -1,6 +1,6 @@ -// Package scan discovers Projects under a Root and seeds History with one -// Visit per Project, so a fresh cdd installation has a starting order -// before any real Jump happens. +// Package scan discovers Projects below the directories it is given and +// seeds History with one Visit per Project, so a fresh cdd installation has +// a starting order before any real Jump happens. package scan import ( @@ -18,35 +18,35 @@ import ( type Summary struct { // Seeded is the number of Visits actually appended to History. Seeded int - // Projects is the number of Projects discovered under Root. + // Projects is the number of Projects discovered. Projects int } -// Run discovers Projects under cfg.Root, honoring cfg.Exclude and +// Run discovers Projects at any depth below dirs, honoring cfg.Exclude and // cfg.IncludeHidden, and seeds hist with one Visit per Project. Each -// Project's evidence time is git.LastCommit when the Project is a -// repository with a commit, else the Project directory's mtime. +// Project's evidence time is git.LastCommit when the repository has a +// commit, else the Project directory's mtime. // // Whether a given Project actually gains a new Visit is entirely up to // Seed's own idempotency rule (a Project with a newer real Visit is left // alone); Run does not re-implement that rule, only reports how many // Visits it produced. -func Run(ctx context.Context, cfg config.Config, hist *history.History) (Summary, error) { - projects, err := project.Discover(cfg.Root, cfg.Exclude, cfg.IncludeHidden) +func Run(ctx context.Context, dirs []string, cfg config.Config, hist *history.History) (Summary, error) { + projects, err := project.Discover(dirs, cfg.Exclude, cfg.IncludeHidden) if err != nil { return Summary{}, fmt.Errorf("scan: discover projects: %w", err) } - evidence, err := gatherEvidence(ctx, cfg.Root, projects) + evidence, err := gatherEvidence(ctx, projects) if err != nil { return Summary{}, err } summary := Summary{Projects: len(projects)} for _, p := range projects { - seeded, err := seedOne(hist, p.Rel(), evidence[p.Rel()]) + seeded, err := seedOne(hist, p, evidence[p]) if err != nil { - return Summary{}, fmt.Errorf("scan: seed %q: %w", p.Rel(), err) + return Summary{}, fmt.Errorf("scan: seed %q: %w", p, err) } if seeded { summary.Seeded++ @@ -60,15 +60,15 @@ func Run(ctx context.Context, cfg config.Config, hist *history.History) (Summary // Visit, by comparing History's Visit count for project before and after. // This leans on history.Count rather than re-implementing Seed's // idempotency rule. -func seedOne(hist *history.History, rel string, at time.Time) (bool, error) { - before, err := hist.Count(rel) +func seedOne(hist *history.History, project string, at time.Time) (bool, error) { + before, err := hist.Count(project) if err != nil { return false, err } - if err := hist.Seed(rel, at); err != nil { + if err := hist.Seed(project, at); err != nil { return false, err } - after, err := hist.Count(rel) + after, err := hist.Count(project) if err != nil { return false, err } diff --git a/internal/scan/scan_test.go b/internal/scan/scan_test.go index 0353c5e..24d6dfd 100644 --- a/internal/scan/scan_test.go +++ b/internal/scan/scan_test.go @@ -36,24 +36,25 @@ func runGit(t *testing.T, dir string, args ...string) { } } -// newProjectDir creates a directory for a Project at kind/name under root. -func newProjectDir(t *testing.T, root, kind, name string) string { +// newProjectDir creates a Project at rel under root: a git repository with +// no commit yet, and returns its path. +func newProjectDir(t *testing.T, root, rel string) string { t.Helper() - dir := filepath.Join(root, kind, name) + dir := filepath.Join(root, rel) if err := os.MkdirAll(dir, 0o755); err != nil { t.Fatalf("mkdir %s: %v", dir, err) } + runGit(t, dir, "init", "-q", "-b", "main") return dir } -// newRepoProjectDir creates a Project directory that is also a git -// repository with one commit, and returns its path. -func newRepoProjectDir(t *testing.T, root, kind, name string) string { +// newRepoProjectDir creates a Project at rel under root with one commit, +// and returns its path. +func newRepoProjectDir(t *testing.T, root, rel string) string { t.Helper() - dir := newProjectDir(t, root, kind, name) - runGit(t, dir, "init", "-q", "-b", "main") + dir := newProjectDir(t, root, rel) runGit(t, dir, "config", "user.name", "cdd test") runGit(t, dir, "config", "user.email", "cdd-test@example.com") if err := os.WriteFile(filepath.Join(dir, "file.txt"), []byte("hi"), 0o644); err != nil { @@ -76,13 +77,13 @@ func newHistory(t *testing.T) *history.History { return hist } -func newConfig(root string, exclude []string) config.Config { - return config.Config{Root: root, Exclude: exclude} +func newConfig(exclude []string) config.Config { + return config.Config{Exclude: exclude} } func TestRun_RepositorySeededFromCommitTime(t *testing.T) { root := t.TempDir() - dir := newRepoProjectDir(t, root, "tools", "cdd") + dir := newRepoProjectDir(t, root, "tools/cdd") commitTime, ok, err := git.LastCommit(context.Background(), dir) if err != nil || !ok { @@ -90,7 +91,7 @@ func TestRun_RepositorySeededFromCommitTime(t *testing.T) { } hist := newHistory(t) - summary, err := scan.Run(context.Background(), newConfig(root, nil), hist) + summary, err := scan.Run(context.Background(), []string{root}, newConfig(nil), hist) if err != nil { t.Fatalf("Run: %v", err) } @@ -105,8 +106,8 @@ func TestRun_RepositorySeededFromCommitTime(t *testing.T) { if len(visits) != 1 { t.Fatalf("len(visits) = %d, want 1", len(visits)) } - if visits[0].Project != "tools/cdd" { - t.Fatalf("project = %q, want tools/cdd", visits[0].Project) + if visits[0].Project != dir { + t.Fatalf("project = %q, want %q", visits[0].Project, dir) } if visits[0].Source != history.SourceScan { t.Fatalf("source = %q, want scan", visits[0].Source) @@ -116,9 +117,9 @@ func TestRun_RepositorySeededFromCommitTime(t *testing.T) { } } -func TestRun_NonRepositorySeededFromMtime(t *testing.T) { +func TestRun_RepositoryWithoutCommitSeededFromMtime(t *testing.T) { root := t.TempDir() - dir := newProjectDir(t, root, "tools", "scratch") + dir := newProjectDir(t, root, "tools/scratch") info, err := os.Stat(dir) if err != nil { @@ -126,7 +127,7 @@ func TestRun_NonRepositorySeededFromMtime(t *testing.T) { } hist := newHistory(t) - summary, err := scan.Run(context.Background(), newConfig(root, nil), hist) + summary, err := scan.Run(context.Background(), []string{root}, newConfig(nil), hist) if err != nil { t.Fatalf("Run: %v", err) } @@ -149,10 +150,10 @@ func TestRun_NonRepositorySeededFromMtime(t *testing.T) { func TestRun_AlreadyJumpedProjectNotOverwritten(t *testing.T) { root := t.TempDir() - newProjectDir(t, root, "tools", "cdd") + dir := newProjectDir(t, root, "tools/cdd") hist := newHistory(t) - if err := hist.Record("tools/cdd"); err != nil { + if err := hist.Record(dir); err != nil { t.Fatalf("Record: %v", err) } before, err := hist.Latest() @@ -160,7 +161,7 @@ func TestRun_AlreadyJumpedProjectNotOverwritten(t *testing.T) { t.Fatalf("Latest: %v", err) } - summary, err := scan.Run(context.Background(), newConfig(root, nil), hist) + summary, err := scan.Run(context.Background(), []string{root}, newConfig(nil), hist) if err != nil { t.Fatalf("Run: %v", err) } @@ -179,16 +180,16 @@ func TestRun_AlreadyJumpedProjectNotOverwritten(t *testing.T) { func TestRun_SecondRunSeedsNothingNew(t *testing.T) { root := t.TempDir() - newProjectDir(t, root, "tools", "cdd") + newProjectDir(t, root, "tools/cdd") hist := newHistory(t) - cfg := newConfig(root, nil) + cfg := newConfig(nil) - if _, err := scan.Run(context.Background(), cfg, hist); err != nil { + if _, err := scan.Run(context.Background(), []string{root}, cfg, hist); err != nil { t.Fatalf("first Run: %v", err) } - summary, err := scan.Run(context.Background(), cfg, hist) + summary, err := scan.Run(context.Background(), []string{root}, cfg, hist) if err != nil { t.Fatalf("second Run: %v", err) } @@ -199,11 +200,11 @@ func TestRun_SecondRunSeedsNothingNew(t *testing.T) { func TestRun_ExcludedProjectSkipped(t *testing.T) { root := t.TempDir() - newProjectDir(t, root, "tools", "cdd") - newProjectDir(t, root, "tools", "scratch") + dir := newProjectDir(t, root, "tools/cdd") + newProjectDir(t, root, "tools/scratch") hist := newHistory(t) - summary, err := scan.Run(context.Background(), newConfig(root, []string{"tools/scratch"}), hist) + summary, err := scan.Run(context.Background(), []string{root}, newConfig([]string{"scratch"}), hist) if err != nil { t.Fatalf("Run: %v", err) } @@ -215,7 +216,22 @@ func TestRun_ExcludedProjectSkipped(t *testing.T) { if err != nil { t.Fatalf("Latest: %v", err) } - if len(visits) != 1 || visits[0].Project != "tools/cdd" { - t.Fatalf("visits = %+v, want only tools/cdd", visits) + if len(visits) != 1 || visits[0].Project != dir { + t.Fatalf("visits = %+v, want only %q", visits, dir) + } +} + +func TestRun_PlainDirectoryNotSeeded(t *testing.T) { + root := t.TempDir() + if err := os.MkdirAll(filepath.Join(root, "notes"), 0o755); err != nil { + t.Fatalf("mkdir: %v", err) + } + + summary, err := scan.Run(context.Background(), []string{root}, newConfig(nil), newHistory(t)) + if err != nil { + t.Fatalf("Run: %v", err) + } + if summary != (scan.Summary{}) { + t.Fatalf("summary = %+v, want nothing seeded", summary) } } From 64fd18c18d3824f4adf5b3f5713b93579b87bdb7 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:29:53 +0500 Subject: [PATCH 4/9] feat(picker): remove the Grouped Layout, making List the default Refs #57 --- internal/picker/layout.go | 14 ++--- internal/picker/model.go | 68 +++------------------- internal/picker/model_test.go | 29 +--------- internal/picker/picker.go | 19 ++---- internal/picker/styles.go | 16 ++---- internal/picker/view.go | 96 ++----------------------------- internal/picker/view_list.go | 8 +-- internal/picker/view_list_test.go | 14 ++--- internal/picker/view_test.go | 67 ++++++--------------- 9 files changed, 59 insertions(+), 272 deletions(-) diff --git a/internal/picker/layout.go b/internal/picker/layout.go index aba67ad..c2af824 100644 --- a/internal/picker/layout.go +++ b/internal/picker/layout.go @@ -12,7 +12,8 @@ const nameFloor = 8 // it the preview is not drawn at all. const previewFloor = 30 -// caretWidth is the fixed-width caret/gutter column (" " or " › "). +// caretWidth is the fixed gutter each row spends outside its columns: the +// selection bar and the spacing around it. const caretWidth = 3 // statusReserve is the width the status column is held at from the first @@ -36,7 +37,7 @@ type Layout struct { // form (now, 5m, 2h, 3d, 2w, 3mo, 1y). ShortTime bool - // ListWidth is the total width given to the grouped list pane. + // ListWidth is the total width given to the list pane. ListWidth int // PreviewWidth is the width given to the preview pane, when ShowPreview // is true. @@ -127,17 +128,12 @@ func (m Model) frameSize() (width, height int) { } // computeLayout sizes one frame from the rows it has to show. The name -// column holds the Project name in the grouped layout and "kind/name" in -// the list layout; the two layouts spend the same total width on their -// other columns, so one budget serves both. +// column holds "kind/name". func (m Model) computeLayout(rows []match, now time.Time, width, height int) Layout { longestName, widestStatus := 0, 1 times := make([]time.Time, 0, len(rows)) for _, mt := range rows { - n := len([]rune(mt.row.Project.Name)) - if m.layout == LayoutList { - n += len([]rune(mt.row.Project.Kind)) + 1 // "kind/" - } + n := len([]rune(mt.row.Project.Kind)) + 1 + len([]rune(mt.row.Project.Name)) // "kind/name" if n > longestName { longestName = n } diff --git a/internal/picker/model.go b/internal/picker/model.go index 9d13c21..2a9bba9 100644 --- a/internal/picker/model.go +++ b/internal/picker/model.go @@ -21,7 +21,7 @@ const ( ) // match is one row along with where, if anywhere, the current query matched -// its Project's path, for highlighting and ordering within its Kind group. +// its Project's path, for highlighting. type match struct { row Row matches []int // rune indexes into the matched string, for highlighting @@ -37,7 +37,7 @@ type Model struct { query string focus focus - cursor int // index into the current visible/filtered+grouped rows + cursor int // index into the current visible (filtered) rows statuses map[string]git.Status // keyed by Project.Path @@ -63,7 +63,7 @@ func NewModel(rows []Row, status StatusFunc, opts Options) Model { } layout := opts.Layout if layout == "" { - layout = LayoutGrouped + layout = LayoutList } return Model{ rows: rows, @@ -135,11 +135,8 @@ func statusCmd(status StatusFunc, path string, sem chan struct{}) tea.Cmd { } } -// visible returns the current query's matches over rows, in row order -// (which preserves History order within a match set, since fuzzy.Find is -// stable relative to its input order for equal scores is not guaranteed, -// but grouping below only depends on first-appearance order of Kind, not on -// score order). +// visibleMatches returns the current query's matches over rows: every row +// in History order when the query is empty, otherwise fuzzy.Find's ranking. func (m Model) visibleMatches() []match { if m.query == "" { out := make([]match, len(m.rows)) @@ -162,57 +159,8 @@ func (m Model) visibleMatches() []match { return out } -// kindGroup is one Kind's header plus the matches that fall under it, in -// the order Kinds first appear among the visible matches. -type kindGroup struct { - kind string - matches []match -} - -// groupByKind groups matches under their Project's Kind, ordering Kinds by -// first appearance in matches (which is History order, or fuzzy-ranked -// order when a query is active) and keeping each Kind's own rows in that -// same order. -func groupByKind(matches []match) []kindGroup { - var groups []kindGroup - index := make(map[string]int) - for _, mt := range matches { - kind := mt.row.Project.Kind - i, ok := index[kind] - if !ok { - i = len(groups) - index[kind] = i - groups = append(groups, kindGroup{kind: kind}) - } - groups[i].matches = append(groups[i].matches, mt) - } - return groups -} - -// visibleGroups returns the current query's matches grouped by Kind, in the -// order rows are actually displayed: the order the Picker's cursor and -// filtering operate on. -func (m Model) visibleGroups() []kindGroup { - return groupByKind(m.visibleMatches()) -} - -// visibleRows returns the current query's matches in the order the active -// layout draws them: grouped by Kind for LayoutGrouped, flat History order -// for LayoutList. It is the order the cursor indexes into. +// visibleRows returns the current query's matches in the order the layout +// draws them. It is the order the cursor indexes into. func (m Model) visibleRows() []match { - matches := m.visibleMatches() - if m.layout == LayoutList { - return matches - } - return flatten(groupByKind(matches)) -} - -// flatten lays a Kind grouping out as a single ordered slice of matches, -// matching the row order the list draws (header lines aside). -func flatten(groups []kindGroup) []match { - var out []match - for _, g := range groups { - out = append(out, g.matches...) - } - return out + return m.visibleMatches() } diff --git a/internal/picker/model_test.go b/internal/picker/model_test.go index f63605d..b63355a 100644 --- a/internal/picker/model_test.go +++ b/internal/picker/model_test.go @@ -24,8 +24,8 @@ func noopStatus(context.Context, string) git.Status { } func rowsForKindOrder() []picker.Row { - // History order: "work" holds the most recent Visit, so it must lead - // the Kind groups even though "tools" and "oss" rows also exist. + // Rows in the order they were given, which the Picker keeps: rows of + // one Kind are not pulled together. return []picker.Row{ {Project: picker.Project{Kind: "tools", Name: "cdd", Path: "/root/tools/cdd"}, LastVisit: time.Unix(3000, 0)}, {Project: picker.Project{Kind: "work", Name: "api", Path: "/root/work/api"}, LastVisit: time.Unix(5000, 0)}, @@ -34,31 +34,6 @@ func rowsForKindOrder() []picker.Row { } } -// TestModel_KindOrder verifies that moving the cursor through the grouped -// list visits Kinds in the order they first appear among rows (History -// order), not alphabetically, and that each Kind's own rows stay in the -// order they were given. -func TestModel_KindOrder(t *testing.T) { - rows := rowsForKindOrder() - m := picker.NewModel(rows, fakeStatus, picker.Options{}) - - // Rows come in as: tools/cdd, work/api, oss/lib, tools/dotfiles. - // Grouped by first appearance: tools{cdd, dotfiles}, work{api}, oss{lib}. - want := []string{ - "/root/tools/cdd", - "/root/tools/dotfiles", - "/root/work/api", - "/root/oss/lib", - } - - for i, wantPath := range want { - got := chosenAt(t, m, i) - if got.Project.Path != wantPath { - t.Errorf("row %d = %q, want %q", i, got.Project.Path, wantPath) - } - } -} - // chosenAt moves the cursor to index i from the top and returns the Row // enter would choose there, using the default key map. func chosenAt(t *testing.T, m picker.Model, i int) picker.Row { diff --git a/internal/picker/picker.go b/internal/picker/picker.go index 4de8ffd..b33aafd 100644 --- a/internal/picker/picker.go +++ b/internal/picker/picker.go @@ -43,21 +43,14 @@ type Row struct { // without blocking the screen. type StatusFunc func(ctx context.Context, dir string) git.Status -// LayoutStyle names one of the Picker's two layouts. It is a standing +// LayoutStyle names one of the Picker's layouts. It is a standing // preference, set once in config.toml, not a per-session toggle. type LayoutStyle string -const ( - // LayoutGrouped is the default layout: rows grouped under Kind - // headers, a caret on the selected row, and the filter line on top. - LayoutGrouped LayoutStyle = "grouped" - - // LayoutList is the flat fzf-style layout: no Kind headers, rows in - // History order with "kind/" muted before each Project name, the - // filter prompt below the list, and a bar plus background highlight - // on the selected row. - LayoutList LayoutStyle = "list" -) +// LayoutList is the flat fzf-style layout, and the default: rows in History +// order with "kind/" muted before each Project name, the filter prompt +// below the list, and a bar plus background highlight on the selected row. +const LayoutList LayoutStyle = "list" // Options configures a Run of the Picker. type Options struct { @@ -73,7 +66,7 @@ type Options struct { Query string // Layout selects which layout is drawn. The zero value is - // LayoutGrouped. + // LayoutList. Layout LayoutStyle } diff --git a/internal/picker/styles.go b/internal/picker/styles.go index b65e795..0025a24 100644 --- a/internal/picker/styles.go +++ b/internal/picker/styles.go @@ -55,8 +55,7 @@ var plainStyle = lipgloss.NewStyle() // padRightOn and padLeftOn pad a plain or styled string to a display // width, putting the padding through base so a row background covers it -// too. The grouped layout passes plainStyle; the list layout passes the -// selected row's background. +// too. The list layout passes the selected row's background. func padRightOn(base lipgloss.Style, s string, w int) string { if d := w - lipgloss.Width(s); d > 0 { return s + base.Render(strings.Repeat(" ", d)) @@ -84,15 +83,10 @@ const ( glyphLoading = "…" ) -// statusCluster renders the compact coloured glyph cluster for one row's -// status: "✓", "● ?", "● ↑3↓2", "—", "…", "!". -func (t theme) statusCluster(st git.Status, loaded bool) string { - return t.statusClusterOn(plainStyle, st, loaded) -} - -// statusClusterOn renders statusCluster over base, which carries the row's -// background in the list layout so the highlight runs through the glyphs -// and the space between them. +// statusClusterOn renders the compact coloured glyph cluster for one row's +// status ("✓", "● ?", "● ↑3↓2", "—", "…", "!") over base, which carries the +// row's background in the list layout so the highlight runs through the +// glyphs and the space between them. func (t theme) statusClusterOn(base lipgloss.Style, st git.Status, loaded bool) string { f := func(c color.Color, s string) string { return base.Foreground(c).Render(s) } diff --git a/internal/picker/view.go b/internal/picker/view.go index 87af3d6..a0b25eb 100644 --- a/internal/picker/view.go +++ b/internal/picker/view.go @@ -11,9 +11,9 @@ import ( "github.com/kryft-dev/cdd/internal/git" ) -// View renders the current frame in the Model's layout: the grouped -// layout by default, the flat fzf-style one when Options.Layout selected -// it. Both share the sizing, the preview pane and the footer. +// View renders the current frame in the Model's layout. The layout's own +// frame draws the list; the preview pane and footer here are shared by any +// layout. func (m Model) View() tea.View { if m.quitting { return tea.NewView("") @@ -31,40 +31,7 @@ func (m Model) View() tea.View { t := newTheme(m.dark) now := time.Now() - if m.layout == LayoutList { - return fullScreen(m.listFrame(t, now)) - } - return fullScreen(m.groupedFrame(t, now)) -} - -// groupedFrame renders the default layout: the filter line, the list -// grouped under Kind headers (with a preview pane beside it when there is -// room), and the footer. -func (m Model) groupedFrame(t theme, now time.Time) string { - groups := m.visibleGroups() - rows := flatten(groups) - width, height := m.frameSize() - lay := m.computeLayout(rows, now, width, height) - - var b strings.Builder - b.WriteString(m.filterLine(t)) - b.WriteString("\n") - - list := m.groupedBody(t, groups, rows, lay, now) - if lay.ShowPreview { - // The preview box is exactly ListHeight lines tall (lipgloss v2 - // counts the border in Height), so joining it at the top keeps - // the frame at the terminal height: one taller and the renderer - // drops the filter line and repaints every tick. - b.WriteString(lipgloss.JoinHorizontal(lipgloss.Top, list, " ", m.previewView(t, rows, lay, now))) - } else { - b.WriteString(list) - } - - b.WriteString("\n") - b.WriteString(m.footerView(t, width, len(rows), lay)) - - return b.String() + return fullScreen(m.listFrame(t, now)) } // fullScreen wraps content in a View drawn on the alternate screen. The @@ -94,61 +61,6 @@ func (m Model) filterLine(t theme) string { return prompt + m.query } -// groupedBody renders the grouped list body: a header line per Kind, then -// its rows, with the cursor's row carrying the caret and accent name. The -// body is windowed to exactly Layout.ListHeight lines, scrolled so the -// cursor's line (counting Kind header lines) stays on screen. -func (m Model) groupedBody(t theme, groups []kindGroup, rows []match, lay Layout, now time.Time) string { - var lines []string - i := 0 - cursorLine := 0 - for _, g := range groups { - rule := t.rule_(max(lay.ListWidth-len([]rune(g.kind))-1, 0)) - lines = append(lines, t.accentBold().Render(g.kind)+" "+rule) - for _, mt := range g.matches { - if i == m.cursor { - cursorLine = len(lines) - } - lines = append(lines, m.rowView(t, mt, i == m.cursor, lay, now)) - i++ - } - } - if len(rows) == 0 { - lines = append(lines, t.muted_().Render("no projects match")) - } - - return window(lines, cursorLine, lay.ListHeight) -} - -// rowView renders one Project row: NAME STATUS LAST VISIT, with a caret -// and accent name when selected. -func (m Model) rowView(t theme, mt match, selected bool, lay Layout, now time.Time) string { - caret := " " - nameStyle := lipgloss.NewStyle().Bold(true) - if selected { - caret = t.fg(t.accent).Bold(true).Render(" › ") - nameStyle = nameStyle.Foreground(t.accent) - } - - name := mt.row.Project.Name - if len([]rune(name)) > lay.NameWidth { - name = truncateName(name, lay.NameWidth) - } - offset := len([]rune(mt.row.Project.Path)) - len([]rune(mt.row.Project.Name)) - name = padRightOn(plainStyle, highlightMatches(name, mt.matches, offset, nameStyle, t), lay.NameWidth) - - st, loaded := m.statuses[mt.row.Project.Path] - status := padRightOn(plainStyle, t.statusCluster(st, loaded), lay.StatusWidth) - - rel := RelativeTime(mt.row.LastVisit, now) - if lay.ShortTime { - rel = RelativeTimeShort(mt.row.LastVisit, now) - } - rel = padLeftOn(plainStyle, t.muted_().Render(rel), lay.TimeWidth) - - return caret + name + " " + status + " " + rel -} - // previewView renders the right-hand preview box for the selected row. func (m Model) previewView(t theme, rows []match, lay Layout, now time.Time) string { var body strings.Builder diff --git a/internal/picker/view_list.go b/internal/picker/view_list.go index c69ad0c..2c45024 100644 --- a/internal/picker/view_list.go +++ b/internal/picker/view_list.go @@ -7,14 +7,12 @@ import ( "charm.land/lipgloss/v2" ) -// selBar marks the selected row in the list layout, standing in for the -// grouped layout's caret. +// selBar marks the selected row in the list layout. const selBar = "▌" // listFrame renders the flat fzf-style layout: rows in the order they were -// given (History order, never-visited Projects last) with no Kind headers, -// the filter prompt below them where fzf users expect it, and the shared -// preview pane and footer. +// given (History order), the filter prompt below them where fzf users +// expect it, and the shared preview pane and footer. func (m Model) listFrame(t theme, now time.Time) string { rows := m.visibleRows() width, height := m.frameSize() diff --git a/internal/picker/view_list_test.go b/internal/picker/view_list_test.go index a0893c1..f290a22 100644 --- a/internal/picker/view_list_test.go +++ b/internal/picker/view_list_test.go @@ -18,19 +18,19 @@ func listModel(rows []picker.Row, width, height int) picker.Model { // selBarGlyph is the bar the list layout draws on the selected row. const selBarGlyph = "▌" -// TestOptions_LayoutDefaultsToGrouped pins the zero Options to the grouped -// layout, so a caller that says nothing keeps the accepted look. -func TestOptions_LayoutDefaultsToGrouped(t *testing.T) { +// TestOptions_LayoutDefaultsToList pins the zero Options to the list +// layout, so a caller that says nothing gets the only layout there is. +func TestOptions_LayoutDefaultsToList(t *testing.T) { m := sizedModel(rowsForKindOrder(), "", 120, 24) lines := strings.Split(plain(m.View().Content), "\n") - if !strings.Contains(lines[0], "type to filter") { - t.Errorf("first line = %q, want the grouped layout's filter line on top", lines[0]) + if !strings.Contains(lines[0], "tools/cdd") { + t.Errorf("first line = %q, want the list layout's first row on top", lines[0]) } } // TestModel_ListLayout_FlatHistoryOrder verifies that the list layout walks -// rows in the order they were given (History order, never-visited last) -// rather than regrouping them under their Kinds. +// rows in the order they were given (History order) rather than regrouping +// them by Kind. func TestModel_ListLayout_FlatHistoryOrder(t *testing.T) { m := picker.NewModel(rowsForKindOrder(), fakeStatus, picker.Options{Layout: picker.LayoutList}) diff --git a/internal/picker/view_test.go b/internal/picker/view_test.go index 3d27159..9eba076 100644 --- a/internal/picker/view_test.go +++ b/internal/picker/view_test.go @@ -12,10 +12,10 @@ import ( "github.com/kryft-dev/cdd/internal/picker" ) -// bothLayouts is every layout the Picker can draw, for the behaviour the -// two share: the frame's height, the alternate screen, equal-width rows +// allLayouts is every layout the Picker can draw, for the behaviour each +// must share: the frame's height, the alternate screen, equal-width rows // and windowing the body to the terminal. -var bothLayouts = []picker.LayoutStyle{picker.LayoutGrouped, picker.LayoutList} +var allLayouts = []picker.LayoutStyle{picker.LayoutList} // sizedModel builds a Model in the given layout, sends it one // tea.WindowSizeMsg and reports the terminal's background as dark: a sized @@ -36,7 +36,7 @@ var ansi = regexp.MustCompile(`\x1b\[[0-9;]*m`) // plain is s with its styling escapes removed, as the terminal shows it. func plain(s string) string { return ansi.ReplaceAllString(s, "") } -// manyRows builds n rows all under the same Kind, so the list body is long +// manyRows builds n rows all in the same Kind, so the list body is long // enough to need scrolling at a modest terminal height. func manyRows(n int) []picker.Row { rows := make([]picker.Row, n) @@ -51,44 +51,20 @@ func manyRows(n int) []picker.Row { return rows } -// TestModel_View_PreviewUnderFilterLine verifies that the preview box does -// not land on the same row as the filter line: the first rendered line -// must be the filter prompt, with no preview box border on it. -func TestModel_View_PreviewUnderFilterLine(t *testing.T) { - rows := []picker.Row{ - {Project: picker.Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}, - } - m := sizedModel(rows, picker.LayoutGrouped, 120, 40) - - out := m.View().Content - lines := strings.Split(out, "\n") - if len(lines) == 0 { - t.Fatalf("View() produced no lines") - } - first := lines[0] - if !strings.Contains(first, "type to filter") { - t.Errorf("first line = %q, want it to contain the filter prompt", first) - } - if strings.ContainsAny(first, "╭╮╰╯│─") { - t.Errorf("first line = %q, should not contain any preview box border", first) - } -} - // TestModel_View_ListWindowedToHeight verifies that a list far taller than // the terminal is clipped to Layout.ListHeight rows rather than pushing the // footer off screen, and that scrolling the cursor to the last row keeps it // on screen. func TestModel_View_ListWindowedToHeight(t *testing.T) { rows := manyRows(40) - m := sizedModel(rows, picker.LayoutGrouped, 120, 20) + m := sizedModel(rows, picker.LayoutList, 120, 20) lay := picker.ComputeLayout(10, 1, make([]time.Time, len(rows)), time.Now(), 120, 20) out := m.View().Content lines := strings.Split(out, "\n") - // Without windowing, every one of the 40 rows plus its Kind header - // would be drawn, pushing the total well past Height; with windowing + // Without windowing, every one of the 40 rows would be drawn, pushing the total well past Height; with windowing // the whole frame stays close to the terminal height. if len(lines) > lay.ListHeight+6 { t.Errorf("View() produced %d lines at Height 20 (ListHeight=%d); footer likely pushed off screen:\n%s", len(lines), lay.ListHeight, out) @@ -118,24 +94,20 @@ func TestModel_View_ListWindowedToHeight(t *testing.T) { } // TestModel_View_RowsShareEqualWidth verifies that every list row renders -// to the same display width, selected or not: the grouped layout keeps a -// fixed-width caret gutter on every row rather than a caret that shrinks -// the selected row by a column, and the list layout pads every row out so -// the selected row's background spans the pane. +// to the same display width, selected or not: the list layout pads every +// row out so the selected row's background spans the pane. func TestModel_View_RowsShareEqualWidth(t *testing.T) { rows := []picker.Row{ {Project: picker.Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}, {Project: picker.Project{Kind: "work", Name: "beta", Path: "/root/work/beta"}}, {Project: picker.Project{Kind: "work", Name: "gamma", Path: "/root/work/gamma"}}, } - // The list layout prefixes "kind/"; the grouped layout puts the Kind - // in a header instead, so each looks for its own row text. + // Each layout looks for its own row text. label := map[picker.LayoutStyle]func(picker.Row) string{ - picker.LayoutGrouped: func(r picker.Row) string { return r.Project.Name }, - picker.LayoutList: func(r picker.Row) string { return r.Project.Kind + "/" + r.Project.Name }, + picker.LayoutList: func(r picker.Row) string { return r.Project.Kind + "/" + r.Project.Name }, } - for _, layout := range bothLayouts { + for _, layout := range allLayouts { t.Run(string(layout), func(t *testing.T) { // A narrow terminal keeps the preview pane from being drawn, // so each Project name appears exactly once, in its list row. @@ -162,11 +134,11 @@ func TestModel_View_RowsShareEqualWidth(t *testing.T) { } // TestModel_View_FrameMatchesTerminalHeight pins the frame to exactly the -// terminal height in both layouts, with and without the preview pane. One +// terminal height in every layout, with and without the preview pane. One // line taller and Bubble Tea's renderer drops a line off the top. func TestModel_View_FrameMatchesTerminalHeight(t *testing.T) { rows := manyRows(11) - for _, layout := range bothLayouts { + for _, layout := range allLayouts { t.Run(string(layout), func(t *testing.T) { for _, width := range []int{110, 45} { for _, height := range []int{40, 30, 24, 14, 9} { @@ -182,18 +154,17 @@ func TestModel_View_FrameMatchesTerminalHeight(t *testing.T) { } // TestModel_View_FilterLineSitsWhereTheLayoutPutsIt pins the filter line -// to the top of the grouped frame and to the line directly below the list -// body in the list layout, where fzf users expect the prompt. +// to where each layout puts it: directly below the list body in the list +// layout, where fzf users expect the prompt. func TestModel_View_FilterLineSitsWhereTheLayoutPutsIt(t *testing.T) { rows := manyRows(11) const width, height = 110, 24 lay := picker.ComputeLayout(20, 1, make([]time.Time, len(rows)), time.Now(), width, height) promptLine := map[picker.LayoutStyle]int{ - picker.LayoutGrouped: 0, - picker.LayoutList: lay.ListHeight, + picker.LayoutList: lay.ListHeight, } - for _, layout := range bothLayouts { + for _, layout := range allLayouts { t.Run(string(layout), func(t *testing.T) { m := sizedModel(rows, layout, width, height) lines := strings.Split(plain(m.View().Content), "\n") @@ -210,10 +181,10 @@ func TestModel_View_FilterLineSitsWhereTheLayoutPutsIt(t *testing.T) { } } -// TestModel_View_UsesAlternateScreen pins both layouts to the alternate +// TestModel_View_UsesAlternateScreen pins every layout to the alternate // screen so nothing is left above the shell prompt after a Jump or cancel. func TestModel_View_UsesAlternateScreen(t *testing.T) { - for _, layout := range bothLayouts { + for _, layout := range allLayouts { t.Run(string(layout), func(t *testing.T) { if m := sizedModel(manyRows(3), layout, 100, 30); !m.View().AltScreen { t.Errorf("View().AltScreen = false, want true") From d495d481eafbfdec0b010438cd81824e74590d60 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:31:28 +0500 Subject: [PATCH 5/9] feat(picker): show each Project's parent directory, trimmed from the start, ahead of its name The filter now matches the directory and name as shown, so highlights line up with the row. Refs #57 --- internal/jump/rows.go | 12 ++++- internal/jump/rows_test.go | 18 ++++--- internal/picker/layout.go | 18 ++++++- internal/picker/model.go | 4 +- internal/picker/model_test.go | 20 +++---- internal/picker/palette_test.go | 2 +- internal/picker/picker.go | 17 +++--- internal/picker/update_test.go | 8 +-- internal/picker/view.go | 2 +- internal/picker/view_list.go | 52 +++++++++--------- internal/picker/view_list_test.go | 89 +++++++++++++++++++++---------- internal/picker/view_test.go | 12 ++--- 12 files changed, 160 insertions(+), 94 deletions(-) diff --git a/internal/jump/rows.go b/internal/jump/rows.go index 0081a49..26f4eca 100644 --- a/internal/jump/rows.go +++ b/internal/jump/rows.go @@ -21,7 +21,7 @@ func toRows(latest []history.Visit, counts map[string]int, home string) []picker for i, v := range latest { rows[i] = picker.Row{ Project: picker.Project{ - Kind: shortenHome(filepath.Dir(v.Project), home), + Dir: shownDir(filepath.Dir(v.Project), home), Name: filepath.Base(v.Project), Path: v.Project, }, @@ -32,6 +32,16 @@ func toRows(latest []history.Visit, counts map[string]int, home string) []picker return rows } +// shownDir writes dir as a row shows it: ending in a separator, with a +// leading home replaced by "~". +func shownDir(dir, home string) string { + dir = shortenHome(dir, home) + if strings.HasSuffix(dir, string(filepath.Separator)) { + return dir + } + return dir + string(filepath.Separator) +} + // shortenHome writes dir with a leading home replaced by "~". func shortenHome(dir, home string) string { if home == "" { diff --git a/internal/jump/rows_test.go b/internal/jump/rows_test.go index 1d19ff9..d2be475 100644 --- a/internal/jump/rows_test.go +++ b/internal/jump/rows_test.go @@ -30,22 +30,24 @@ func TestToRows_KeepsHistoryOrder(t *testing.T) { } // TestToRows_SplitsParentAndName checks each row's parent directory, with -// the home directory shortened to "~", and its name. +// the home directory shortened to "~" and a trailing separator, and its +// name. func TestToRows_SplitsParentAndName(t *testing.T) { tests := []struct { path, home, dir, name string }{ - {"/home/me/tools/cdd", "/home/me", "~/tools", "cdd"}, - {"/home/me/cdd", "/home/me", "~", "cdd"}, - {"/home/meta/cdd", "/home/me", "/home/meta", "cdd"}, - {"/srv/lib", "/home/me", "/srv", "lib"}, - {"/home/me/tools/cdd", "", "/home/me/tools", "cdd"}, + {"/home/me/tools/cdd", "/home/me", "~/tools/", "cdd"}, + {"/home/me/cdd", "/home/me", "~/", "cdd"}, + {"/home/meta/cdd", "/home/me", "/home/meta/", "cdd"}, + {"/srv/lib", "/home/me", "/srv/", "lib"}, + {"/lib", "/home/me", "/", "lib"}, + {"/home/me/tools/cdd", "", "/home/me/tools/", "cdd"}, } for _, tt := range tests { got := toRows([]history.Visit{{Project: tt.path}}, nil, tt.home)[0].Project - if got.Kind != tt.dir || got.Name != tt.name { - t.Errorf("toRows(%q, home %q) = %q + %q, want %q + %q", tt.path, tt.home, got.Kind, got.Name, tt.dir, tt.name) + if got.Dir != tt.dir || got.Name != tt.name { + t.Errorf("toRows(%q, home %q) = %q + %q, want %q + %q", tt.path, tt.home, got.Dir, got.Name, tt.dir, tt.name) } } } diff --git a/internal/picker/layout.go b/internal/picker/layout.go index c2af824..177f0b7 100644 --- a/internal/picker/layout.go +++ b/internal/picker/layout.go @@ -128,12 +128,12 @@ func (m Model) frameSize() (width, height int) { } // computeLayout sizes one frame from the rows it has to show. The name -// column holds "kind/name". +// column holds the Project's parent directory and name. func (m Model) computeLayout(rows []match, now time.Time, width, height int) Layout { longestName, widestStatus := 0, 1 times := make([]time.Time, 0, len(rows)) for _, mt := range rows { - n := len([]rune(mt.row.Project.Kind)) + 1 + len([]rune(mt.row.Project.Name)) // "kind/name" + n := len([]rune(mt.row.Project.Dir)) + len([]rune(mt.row.Project.Name)) if n > longestName { longestName = n } @@ -183,6 +183,20 @@ func widestTime(times []time.Time, now time.Time, short bool) int { return w } +// truncateLeft shortens s to width columns by dropping runes from its +// start behind a leading "…", keeping the end, which says the most about a +// path. +func truncateLeft(s string, width int) string { + r := []rune(s) + if len(r) <= width { + return s + } + if width <= 1 { + return string(r[len(r)-max(width, 0):]) + } + return "…" + string(r[len(r)-width+1:]) +} + // truncateName shortens name to width columns, ending in "…" when it does // not fit, and never going below nameFloor unless name itself is shorter. func truncateName(name string, width int) string { diff --git a/internal/picker/model.go b/internal/picker/model.go index 2a9bba9..e2b48e4 100644 --- a/internal/picker/model.go +++ b/internal/picker/model.go @@ -21,7 +21,7 @@ const ( ) // match is one row along with where, if anywhere, the current query matched -// its Project's path, for highlighting. +// its Project's shown path (Dir then Name), for highlighting. type match struct { row Row matches []int // rune indexes into the matched string, for highlighting @@ -148,7 +148,7 @@ func (m Model) visibleMatches() []match { paths := make([]string, len(m.rows)) for i, r := range m.rows { - paths[i] = r.Project.Path + paths[i] = r.Project.Dir + r.Project.Name } results := fuzzy.Find(m.query, paths) diff --git a/internal/picker/model_test.go b/internal/picker/model_test.go index b63355a..b00825b 100644 --- a/internal/picker/model_test.go +++ b/internal/picker/model_test.go @@ -23,14 +23,14 @@ func noopStatus(context.Context, string) git.Status { return git.Status{Kind: git.NotRepo} } -func rowsForKindOrder() []picker.Row { - // Rows in the order they were given, which the Picker keeps: rows of - // one Kind are not pulled together. +func historyRows() []picker.Row { + // Rows in the order they were given, which the Picker keeps: rows + // sharing a parent directory are not pulled together. return []picker.Row{ - {Project: picker.Project{Kind: "tools", Name: "cdd", Path: "/root/tools/cdd"}, LastVisit: time.Unix(3000, 0)}, - {Project: picker.Project{Kind: "work", Name: "api", Path: "/root/work/api"}, LastVisit: time.Unix(5000, 0)}, - {Project: picker.Project{Kind: "oss", Name: "lib", Path: "/root/oss/lib"}, LastVisit: time.Unix(1000, 0)}, - {Project: picker.Project{Kind: "tools", Name: "dotfiles", Path: "/root/tools/dotfiles"}, LastVisit: time.Unix(2000, 0)}, + {Project: picker.Project{Dir: "~/tools/", Name: "cdd", Path: "/root/tools/cdd"}, LastVisit: time.Unix(3000, 0)}, + {Project: picker.Project{Dir: "~/work/", Name: "api", Path: "/root/work/api"}, LastVisit: time.Unix(5000, 0)}, + {Project: picker.Project{Dir: "~/oss/", Name: "lib", Path: "/root/oss/lib"}, LastVisit: time.Unix(1000, 0)}, + {Project: picker.Project{Dir: "~/tools/", Name: "dotfiles", Path: "/root/tools/dotfiles"}, LastVisit: time.Unix(2000, 0)}, } } @@ -57,9 +57,9 @@ func chosenAt(t *testing.T, m picker.Model, i int) picker.Row { // rows to those whose Project path fuzzy-matches it. func TestModel_FuzzyFilter(t *testing.T) { rows := []picker.Row{ - {Project: picker.Project{Kind: "work", Name: "api-gateway", Path: "/root/work/api-gateway"}}, - {Project: picker.Project{Kind: "work", Name: "billing", Path: "/root/work/billing"}}, - {Project: picker.Project{Kind: "oss", Name: "bubbletea", Path: "/root/oss/bubbletea"}}, + {Project: picker.Project{Dir: "~/work/", Name: "api-gateway", Path: "/root/work/api-gateway"}}, + {Project: picker.Project{Dir: "~/work/", Name: "billing", Path: "/root/work/billing"}}, + {Project: picker.Project{Dir: "~/oss/", Name: "bubbletea", Path: "/root/oss/bubbletea"}}, } m := picker.NewModel(rows, noopStatus, picker.Options{}) next, _ := m.Update(tea.WindowSizeMsg{Width: 120, Height: 40}) diff --git a/internal/picker/palette_test.go b/internal/picker/palette_test.go index b13ea8a..b76bbc8 100644 --- a/internal/picker/palette_test.go +++ b/internal/picker/palette_test.go @@ -13,7 +13,7 @@ import ( // paletteModel is a Model sized to a terminal but told nothing yet about // its background colour: the state the Picker opens in. func paletteModel() Model { - rows := []Row{{Project: Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}} + rows := []Row{{Project: Project{Dir: "~/work/", Name: "alpha", Path: "/root/work/alpha"}}} m := NewModel(rows, func(context.Context, string) git.Status { return git.Status{} }, Options{}) next, _ := m.Update(tea.WindowSizeMsg{Width: 110, Height: 30}) return next.(Model) diff --git a/internal/picker/picker.go b/internal/picker/picker.go index b33aafd..b0b49f0 100644 --- a/internal/picker/picker.go +++ b/internal/picker/picker.go @@ -2,8 +2,8 @@ // user choose one to Jump to. // // The Picker never computes History order itself: Run receives rows already -// ordered by the caller (History order, most recent Visit first, then -// never-visited Projects A-Z) and only filters and displays them. +// ordered by the caller (History order, most recent Visit first) and only +// filters and displays them. package picker import ( @@ -17,11 +17,16 @@ import ( "github.com/kryft-dev/cdd/internal/git" ) -// Project is the identity of one Picker row: its Kind, its Name, and its -// absolute path on disk. +// Project is the identity of one Picker row: its parent directory as shown, +// its name, and its absolute path on disk. type Project struct { - Kind string + // Dir is the Project's parent directory as the row shows it, ending in + // a separator, with the home directory shortened to "~" (e.g. + // "~/Developer/tools/"). + Dir string + // Name is the Project directory's own name, e.g. "cdd". Name string + // Path is the Project's absolute path, where a Jump lands. Path string } @@ -48,7 +53,7 @@ type StatusFunc func(ctx context.Context, dir string) git.Status type LayoutStyle string // LayoutList is the flat fzf-style layout, and the default: rows in History -// order with "kind/" muted before each Project name, the filter prompt +// order with the parent directory muted before each Project name, the filter prompt // below the list, and a bar plus background highlight on the selected row. const LayoutList LayoutStyle = "list" diff --git a/internal/picker/update_test.go b/internal/picker/update_test.go index 43f9c60..2670af6 100644 --- a/internal/picker/update_test.go +++ b/internal/picker/update_test.go @@ -13,8 +13,8 @@ import ( func twoRowModel(opts picker.Options) picker.Model { rows := []picker.Row{ - {Project: picker.Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}, - {Project: picker.Project{Kind: "work", Name: "beta", Path: "/root/work/beta"}}, + {Project: picker.Project{Dir: "~/work/", Name: "alpha", Path: "/root/work/alpha"}}, + {Project: picker.Project{Dir: "~/work/", Name: "beta", Path: "/root/work/beta"}}, } return picker.NewModel(rows, noopStatus, opts) } @@ -70,8 +70,8 @@ func TestModel_Update_StatusResult(t *testing.T) { } m := picker.NewModel( []picker.Row{ - {Project: picker.Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}, - {Project: picker.Project{Kind: "work", Name: "beta", Path: "/root/work/beta"}}, + {Project: picker.Project{Dir: "~/work/", Name: "alpha", Path: "/root/work/alpha"}}, + {Project: picker.Project{Dir: "~/work/", Name: "beta", Path: "/root/work/beta"}}, }, keyedStatus(statuses), picker.Options{}, diff --git a/internal/picker/view.go b/internal/picker/view.go index a0b25eb..15ee035 100644 --- a/internal/picker/view.go +++ b/internal/picker/view.go @@ -69,7 +69,7 @@ func (m Model) previewView(t theme, rows []match, lay Layout, now time.Time) str st, loaded := m.statuses[p.Path] label := func(s string) string { return t.muted_().Render(padRightOn(plainStyle, s, 11)) } - body.WriteString(t.muted_().Render(p.Kind+"/") + t.accentBold().Render(p.Name) + "\n\n") + body.WriteString(t.muted_().Render(p.Dir) + t.accentBold().Render(p.Name) + "\n\n") body.WriteString(label("path") + p.Path + "\n") if loaded && st.Kind == git.Found { body.WriteString(label("branch") + st.Branch + "\n") diff --git a/internal/picker/view_list.go b/internal/picker/view_list.go index 2c45024..672d530 100644 --- a/internal/picker/view_list.go +++ b/internal/picker/view_list.go @@ -51,7 +51,7 @@ func (m Model) listBody(t theme, rows []match, lay Layout, now time.Time) string return window(lines, m.cursor, lay.ListHeight) } -// listRowView renders one row as "▌ STATUS kind/NAME LAST VISIT", padded +// listRowView renders one row as "▌ STATUS ~/dir/NAME LAST VISIT", padded // out to Layout.ListWidth. Every segment, padding included, is rendered // through base, so the selected row's background highlight runs unbroken // to the edge of the pane. @@ -64,11 +64,11 @@ func (m Model) listRowView(t theme, mt match, selected bool, lay Layout, now tim nameStyle = base.Foreground(t.selFg).Bold(true) bar = base.Foreground(t.blue).Render(selBar) } - kindStyle := base.Foreground(t.muted) + dirStyle := base.Foreground(t.muted) st, loaded := m.statuses[mt.row.Project.Path] status := padRightOn(base, t.statusClusterOn(base, st, loaded), lay.StatusWidth) - name := m.listNameField(t, mt, lay, base, kindStyle, nameStyle) + name := m.listNameField(t, mt, lay, base, dirStyle, nameStyle) rel := RelativeTime(mt.row.LastVisit, now) if lay.ShortTime { @@ -82,34 +82,34 @@ func (m Model) listRowView(t theme, mt match, selected bool, lay Layout, now tim } // listNameFloor is the least room the Project name keeps in the name -// column. A Kind long enough to crowd it out is truncated instead: the -// name is what the user is reading for. +// column. A parent directory long enough to crowd it out is truncated +// instead: the name is what the user is reading for. const listNameFloor = 4 -// listNameField renders "kind/name" padded to Layout.NameWidth, with the -// Kind muted ahead of the Project name and any fuzzy-match runes -// highlighted. The Project name is truncated first when the pair is too -// wide, and the Kind once the name is down to listNameFloor. Each segment -// keeps its own style, so a long Kind never mutes the name with it. -func (m Model) listNameField(t theme, mt match, lay Layout, base, kindStyle, nameStyle lipgloss.Style) string { +// listNameField renders the Project's parent directory and name padded to +// Layout.NameWidth, the directory muted ahead of the name and any +// fuzzy-match runes highlighted. The name is truncated first when the pair +// is too wide, and the directory, from its start, once the name is down to +// listNameFloor. Each segment keeps its own style, so a long directory +// never mutes the name with it. +func (m Model) listNameField(t theme, mt match, lay Layout, base, dirStyle, nameStyle lipgloss.Style) string { p := mt.row.Project - kind := p.Kind + "/" - name := p.Name - - // Matched indexes are rune offsets into the Project's path, of which - // "kind/name" is the tail; shift them onto each segment. - pathLen := len([]rune(p.Path)) - kindOffset := pathLen - len([]rune(kind)) - len([]rune(name)) - nameOffset := pathLen - len([]rune(name)) - - kindWidth := len([]rune(kind)) - if over := kindWidth - (lay.NameWidth - listNameFloor); over > 0 { - kindWidth = max(kindWidth-over, 0) - kind = truncateName(kind, kindWidth) + dir, name := p.Dir, p.Name + + // Matched indexes are rune offsets into Dir+Name; shift them onto each + // segment, and past whatever truncateLeft drops from the directory. + dirWidth := len([]rune(dir)) + nameOffset := dirWidth + dirOffset := 0 + if over := dirWidth - (lay.NameWidth - listNameFloor); over > 0 { + kept := max(dirWidth-over, 0) + dir = truncateLeft(dir, kept) + dirOffset = dirWidth - kept + dirWidth = kept } - name = truncateName(name, max(lay.NameWidth-kindWidth, 0)) + name = truncateName(name, max(lay.NameWidth-dirWidth, 0)) - field := highlightMatches(kind, mt.matches, kindOffset, kindStyle, t) + + field := highlightMatches(dir, mt.matches, dirOffset, dirStyle, t) + highlightMatches(name, mt.matches, nameOffset, nameStyle, t) return padRightOn(base, field, lay.NameWidth) } diff --git a/internal/picker/view_list_test.go b/internal/picker/view_list_test.go index f290a22..0d03665 100644 --- a/internal/picker/view_list_test.go +++ b/internal/picker/view_list_test.go @@ -1,6 +1,7 @@ package picker_test import ( + "regexp" "strings" "testing" @@ -21,7 +22,7 @@ const selBarGlyph = "▌" // TestOptions_LayoutDefaultsToList pins the zero Options to the list // layout, so a caller that says nothing gets the only layout there is. func TestOptions_LayoutDefaultsToList(t *testing.T) { - m := sizedModel(rowsForKindOrder(), "", 120, 24) + m := sizedModel(historyRows(), "", 120, 24) lines := strings.Split(plain(m.View().Content), "\n") if !strings.Contains(lines[0], "tools/cdd") { t.Errorf("first line = %q, want the list layout's first row on top", lines[0]) @@ -30,9 +31,9 @@ func TestOptions_LayoutDefaultsToList(t *testing.T) { // TestModel_ListLayout_FlatHistoryOrder verifies that the list layout walks // rows in the order they were given (History order) rather than regrouping -// them by Kind. +// them by parent directory. func TestModel_ListLayout_FlatHistoryOrder(t *testing.T) { - m := picker.NewModel(rowsForKindOrder(), fakeStatus, picker.Options{Layout: picker.LayoutList}) + m := picker.NewModel(historyRows(), fakeStatus, picker.Options{Layout: picker.LayoutList}) want := []string{ "/root/tools/cdd", @@ -49,10 +50,10 @@ func TestModel_ListLayout_FlatHistoryOrder(t *testing.T) { } // TestModel_ListLayout_StartsWithARowNotAHeader verifies that the frame -// opens on the first Project row: no filter line above it and no Kind -// header taking a line. +// opens on the first Project row: no filter line above it and no header +// taking a line. func TestModel_ListLayout_StartsWithARowNotAHeader(t *testing.T) { - m := listModel(rowsForKindOrder(), 120, 24) + m := listModel(historyRows(), 120, 24) lines := strings.Split(plain(m.View().Content), "\n") if !strings.Contains(lines[0], "tools/cdd") { @@ -63,14 +64,15 @@ func TestModel_ListLayout_StartsWithARowNotAHeader(t *testing.T) { } } -// TestModel_ListLayout_KindPrefixAndPreview verifies a row shows "kind/" -// before the Project name and that the shared preview pane is still drawn. -func TestModel_ListLayout_KindPrefixAndPreview(t *testing.T) { - m := listModel(rowsForKindOrder(), 120, 24) +// TestModel_ListLayout_DirPrefixAndPreview verifies a row shows its parent +// directory before the Project name and that the shared preview pane is +// still drawn. +func TestModel_ListLayout_DirPrefixAndPreview(t *testing.T) { + m := listModel(historyRows(), 120, 24) out := plain(m.View().Content) - if !strings.Contains(out, "work/api") { - t.Errorf("View() output is missing the %q row:\n%s", "work/api", out) + if !strings.Contains(out, "~/work/api") { + t.Errorf("View() output is missing the %q row:\n%s", "~/work/api", out) } if !strings.ContainsAny(out, "╭╮╰╯") { t.Errorf("View() output is missing the preview box:\n%s", out) @@ -80,7 +82,7 @@ func TestModel_ListLayout_KindPrefixAndPreview(t *testing.T) { // TestModel_ListLayout_SelectedRowCarriesBar verifies the selected row is // marked with the "▌" bar, and only the selected row. func TestModel_ListLayout_SelectedRowCarriesBar(t *testing.T) { - m := listModel(rowsForKindOrder(), 120, 24) + m := listModel(historyRows(), 120, 24) if n := strings.Count(plain(m.View().Content), selBarGlyph); n != 1 { t.Errorf("View() drew %d %q bars, want exactly 1 (the selected row)", n, selBarGlyph) @@ -89,44 +91,77 @@ func TestModel_ListLayout_SelectedRowCarriesBar(t *testing.T) { next, _ := m.Update(tea.KeyPressMsg{Code: tea.KeyDown}) m = next.(picker.Model) for _, l := range strings.Split(plain(m.View().Content), "\n") { - if strings.Contains(l, selBarGlyph) && !strings.Contains(l, "work/api") { + if strings.Contains(l, selBarGlyph) && !strings.Contains(l, "~/work/api") { t.Errorf("after one move down the bar is on %q, want it on the work/api row", l) } } } -// TestModel_ListLayout_LongKindKeepsTheName verifies that a Kind too long -// for the name column is the part that gives way: the Project name stays -// on screen, and it keeps its own styling rather than being muted along -// with the Kind. -func TestModel_ListLayout_LongKindKeepsTheName(t *testing.T) { +// TestModel_ListLayout_LongDirKeepsTheName verifies that a parent directory +// too long for the name column is the part that gives way, from its start: +// the Project name and the directory's end stay on screen, and the name +// keeps its own styling rather than being muted along with the directory. +func TestModel_ListLayout_LongDirKeepsTheName(t *testing.T) { rows := []picker.Row{ {Project: picker.Project{ - Kind: "infrastructure-platform", + Dir: "~/work/infrastructure-platform/", Name: "obs", - Path: "/root/infrastructure-platform/obs", + Path: "/root/work/infrastructure-platform/obs", }}, } - m := listModel(rows, 34, 12) // narrow enough that "kind/" alone overruns + m := listModel(rows, 34, 12) // narrow enough that the directory alone overruns lines := strings.Split(m.View().Content, "\n") row := lines[0] if !strings.Contains(plain(row), "obs") { t.Fatalf("row = %q, want the Project name %q still drawn", plain(row), "obs") } + if !strings.Contains(plain(row), "…") || !strings.Contains(plain(row), "platform/") || strings.Contains(plain(row), "~/work") { + t.Errorf("row = %q, want the directory's start dropped behind \"…\" and its end kept", plain(row)) + } - // The Kind is muted and the selected row's name is not: the two + // The directory is muted and the selected row's name is not: the two // segments must not share one styling run. name := styleOf(row, "obs") - kind := styleOf(row, "infra") + dir := styleOf(row, "platform") if name == "" { t.Fatalf("row = %q, could not find a styling run around the name", row) } - if name == kind { - t.Errorf("name and Kind share the styling run %q, want the Kind muted and the name not", name) + if name == dir { + t.Errorf("name and directory share the styling run %q, want the directory muted and the name not", name) + } +} + +// TestModel_ListLayout_FilterMatchesDirAndHighlights verifies the filter +// matches the parent directory as well as the name, and that the matched +// runes of a truncated directory still land on the right characters. +func TestModel_ListLayout_FilterMatchesDirAndHighlights(t *testing.T) { + rows := []picker.Row{ + {Project: picker.Project{Dir: "~/work/infrastructure-platform/", Name: "obs", Path: "/w/i/obs"}}, + {Project: picker.Project{Dir: "~/tools/", Name: "cdd", Path: "/t/cdd"}}, + } + m := listModel(rows, 34, 12) + for _, r := range "platf" { + next, _ := m.Update(tea.KeyPressMsg{Text: string(r)}) + m = next.(picker.Model) + } + + row := strings.Split(m.View().Content, "\n")[0] + if !strings.Contains(plain(row), "obs") { + t.Fatalf("row = %q, want the obs row, matched by its directory", plain(row)) + } + var highlighted strings.Builder + for _, sm := range underlined.FindAllStringSubmatch(row, -1) { + highlighted.WriteString(sm[1]) + } + if got := highlighted.String(); got != "platf" { + t.Errorf("highlighted runes = %q, want %q", got, "platf") } } +// underlined matches one rune drawn in the underlined match style. +var underlined = regexp.MustCompile(`\x1b\[1;4;[0-9;]*m([^\x1b])\x1b\[m`) + // styleOf returns the SGR escape introducing the run of styled text that // contains want, or "" when want is not found in a styled run. func styleOf(line, want string) string { @@ -159,7 +194,7 @@ func TestModel_ListLayout_ScrollsCursorIntoView(t *testing.T) { // TestModel_ListLayout_NoMatches shows the shared empty-filter message // rather than an empty pane. func TestModel_ListLayout_NoMatches(t *testing.T) { - m := listModel(rowsForKindOrder(), 120, 24) + m := listModel(historyRows(), 120, 24) for _, r := range "zzzzzz" { next, _ := m.Update(tea.KeyPressMsg{Text: string(r)}) m = next.(picker.Model) diff --git a/internal/picker/view_test.go b/internal/picker/view_test.go index 9eba076..6ec6f12 100644 --- a/internal/picker/view_test.go +++ b/internal/picker/view_test.go @@ -36,14 +36,14 @@ var ansi = regexp.MustCompile(`\x1b\[[0-9;]*m`) // plain is s with its styling escapes removed, as the terminal shows it. func plain(s string) string { return ansi.ReplaceAllString(s, "") } -// manyRows builds n rows all in the same Kind, so the list body is long +// manyRows builds n rows all in the same directory, so the list body is long // enough to need scrolling at a modest terminal height. func manyRows(n int) []picker.Row { rows := make([]picker.Row, n) for i := range rows { name := "project-" + string(rune('a'+i%26)) + string(rune('0'+i/26)) rows[i] = picker.Row{Project: picker.Project{ - Kind: "work", + Dir: "~/work/", Name: name, Path: "/root/work/" + name, }} @@ -98,13 +98,13 @@ func TestModel_View_ListWindowedToHeight(t *testing.T) { // row out so the selected row's background spans the pane. func TestModel_View_RowsShareEqualWidth(t *testing.T) { rows := []picker.Row{ - {Project: picker.Project{Kind: "work", Name: "alpha", Path: "/root/work/alpha"}}, - {Project: picker.Project{Kind: "work", Name: "beta", Path: "/root/work/beta"}}, - {Project: picker.Project{Kind: "work", Name: "gamma", Path: "/root/work/gamma"}}, + {Project: picker.Project{Dir: "~/work/", Name: "alpha", Path: "/root/work/alpha"}}, + {Project: picker.Project{Dir: "~/work/", Name: "beta", Path: "/root/work/beta"}}, + {Project: picker.Project{Dir: "~/work/", Name: "gamma", Path: "/root/work/gamma"}}, } // Each layout looks for its own row text. label := map[picker.LayoutStyle]func(picker.Row) string{ - picker.LayoutList: func(r picker.Row) string { return r.Project.Kind + "/" + r.Project.Name }, + picker.LayoutList: func(r picker.Row) string { return r.Project.Dir + r.Project.Name }, } for _, layout := range allLayouts { From 9b0453061990e9f70c878c6cbf3f0f1d26927d80 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:31:45 +0500 Subject: [PATCH 6/9] feat(picker): drop the not-a-repo status, now that every Project is a repository A .git that git cannot read shows as unknown instead. Refs #57 --- internal/picker/styles.go | 17 +++++++---------- internal/picker/update_test.go | 4 ++-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/internal/picker/styles.go b/internal/picker/styles.go index 0025a24..c9a7e7c 100644 --- a/internal/picker/styles.go +++ b/internal/picker/styles.go @@ -79,12 +79,11 @@ const ( glyphAhead = "↑" glyphBehind = "↓" glyphUnknown = "!" - glyphNotRepo = "—" glyphLoading = "…" ) // statusClusterOn renders the compact coloured glyph cluster for one row's -// status ("✓", "● ?", "● ↑3↓2", "—", "…", "!") over base, which carries the +// status ("✓", "● ?", "● ↑3↓2", "…", "!") over base, which carries the // row's background in the list layout so the highlight runs through the // glyphs and the space between them. func (t theme) statusClusterOn(base lipgloss.Style, st git.Status, loaded bool) string { @@ -93,10 +92,9 @@ func (t theme) statusClusterOn(base lipgloss.Style, st git.Status, loaded bool) if !loaded { return f(t.muted, glyphLoading) } - switch st.Kind { - case git.NotRepo: - return f(t.muted, glyphNotRepo) - case git.Unknown: + // A Project's .git can still fail to read, or vanish after the Picker + // opened; git's answer is then as unknown as a timeout. + if st.Kind != git.Found { return f(t.red, glyphUnknown) } @@ -157,7 +155,6 @@ func (t theme) legend() string { f(t.accent, glyphAhead, "ahead"), f(t.accent, glyphBehind, "behind"), f(t.red, glyphUnknown, "unknown"), - f(t.muted, glyphNotRepo, "not a repo"), f(t.muted, glyphLoading, "loading"), }, " ") } @@ -179,7 +176,7 @@ func previewStatusWords(t theme, st git.Status, loaded bool) string { } switch st.Kind { case git.NotRepo: - return t.muted_().Render(glyphNotRepo + " not a repository") + return t.fg(t.red).Render(glyphUnknown + " git could not read it") case git.Unknown: return t.fg(t.red).Render(glyphUnknown + " git timed out") } @@ -197,8 +194,8 @@ func previewStatusWords(t theme, st git.Status, loaded bool) string { } // previewSync spells the ahead/behind/upstream state out, for the preview -// pane's "sync" line. It is "" when there is nothing to report (not a -// repository, unknown, or still loading). +// pane's "sync" line. It is "" when there is nothing to report (git could +// not read the repository, or it is still loading). func previewSync(t theme, st git.Status, loaded bool) string { if !loaded || st.Kind != git.Found { return "" diff --git a/internal/picker/update_test.go b/internal/picker/update_test.go index 2670af6..44e6838 100644 --- a/internal/picker/update_test.go +++ b/internal/picker/update_test.go @@ -123,8 +123,8 @@ func TestModel_Update_StatusResult(t *testing.T) { if !strings.Contains(alphaLine, "●") { t.Errorf("alpha row = %q, want it to contain the dirty glyph ●", alphaLine) } - if !strings.Contains(betaLine, "—") { - t.Errorf("beta row = %q, want it to contain the not-a-repo glyph —", betaLine) + if !strings.Contains(betaLine, "!") { + t.Errorf("beta row = %q, want it to contain the unknown glyph !, since git could not read it", betaLine) } } From e0b3e673af5728de656e2047154add6624b772fb Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:33:01 +0500 Subject: [PATCH 7/9] feat(config): drop root and the grouped layout, making config.toml optional A leftover root or layout = "grouped" fails with why it was removed. Exclude patterns match a name, or with a "/" an absolute path, and expand a leading ~. Refs #57 --- internal/config/config.go | 126 +++++++++++------------ internal/config/config_test.go | 181 ++++++++++++--------------------- 2 files changed, 124 insertions(+), 183 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index cf6e730..f1c2313 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,6 +1,6 @@ -// Package config loads cdd's configuration: the Root to search for Kinds -// and Projects, Exclude globs, hidden-directory handling, and the History -// and Picker settings. +// Package config loads cdd's configuration: the Exclude globs and +// hidden-directory handling a Scan walks with, and the History and Picker +// settings. Every key is optional, and so is the file itself. package config import ( @@ -9,6 +9,7 @@ import ( "os" "path/filepath" "slices" + "strconv" "strings" toml "github.com/pelletier/go-toml/v2" @@ -16,17 +17,15 @@ import ( // Config is cdd's configuration, decoded from config.toml. type Config struct { - // Root is the top-level directory whose Kinds are searched for - // Projects. Required; a leading "~" is expanded to the user's home - // directory, but "$VAR" is left as-is. - Root string `toml:"root"` - - // Exclude holds paths relative to Root, matched with path.Match - // semantics, that are skipped when discovering Kinds and Projects. + // Exclude holds filepath.Match patterns for directories a Scan skips, + // with everything below them: a pattern containing "/" is matched + // against a directory's absolute path, any other against its name + // alone. A leading "~" is expanded to the user's home directory, but + // "$VAR" is left as-is. Exclude []string `toml:"exclude"` - // IncludeHidden, when false (the default), excludes hidden - // directories at both Kind and Project level. + // IncludeHidden, when false (the default), makes a Scan skip hidden + // directories. IncludeHidden bool `toml:"include_hidden"` // History configures the ordered record of Visits. @@ -56,17 +55,27 @@ type Keys struct { // Picker configures the Picker's appearance. type Picker struct { - // Layout selects which layout the Picker draws: "grouped" (the - // default) groups rows under Kind headers with a caret on the - // selected row; "list" is a flat fzf-style list with the filter - // prompt below it and a background-highlighted selected row. Both - // draw the same preview pane. + // Layout selects which layout the Picker draws. "list", the default + // and only layout today, is a flat fzf-style list with the filter + // prompt below it and a background-highlighted selected row. Layout string `toml:"layout"` } // pickerLayouts are the values Picker.Layout accepts, in the order the // error message lists them. -var pickerLayouts = []string{"grouped", "list"} +var pickerLayouts = []string{"list"} + +// removedKeys maps each key cdd once accepted to why it is gone, so an old +// config.toml fails with the reason rather than a bare "unknown key". +var removedKeys = map[string]string{ + "root": "root was removed in v0.3.0: cdd now finds git repositories with cdd scan [dir...], so delete this line", +} + +// removedLayouts maps each picker.layout value cdd once accepted to why it +// is gone. +var removedLayouts = map[string]string{ + "grouped": `the grouped layout was removed in v0.3.0 along with Kinds; use "list"`, +} // defaultConfig returns a Config with every default applied, before a // config.toml's fields are decoded on top of it. @@ -76,29 +85,10 @@ func defaultConfig() Config { IncludeHidden: false, History: History{MaxVisits: 1000}, Keys: Keys{Vim: false}, - Picker: Picker{Layout: "grouped"}, + Picker: Picker{Layout: "list"}, } } -// exampleConfigBody is the example config.toml shown in errors and printed -// by ExampleConfig. -const exampleConfigBody = `root = "~/Developer" # required, no default -exclude = [] # paths relative to Root, glob-matched -include_hidden = false -[history] -max_visits = 1000 # must be >= 1 -[keys] -vim = false -[picker] -layout = "grouped" # or "list" for the flat fzf-style layout -` - -// ExampleConfig returns an example config.toml, for the cli package to print -// when Load or LoadFrom fails. -func ExampleConfig() string { - return exampleConfigBody -} - // Load reads cdd's configuration from $XDG_CONFIG_HOME/cdd/config.toml, // defaulting to ~/.config/cdd/config.toml when XDG_CONFIG_HOME is unset. func Load() (Config, error) { @@ -113,18 +103,19 @@ func Load() (Config, error) { return LoadFrom(filepath.Join(dir, "cdd", "config.toml")) } -// LoadFrom reads cdd's configuration from path. It is exported separately -// from Load so tests can point it at a fixture file. +// LoadFrom reads cdd's configuration from path. A missing file is every +// default. It is exported separately from Load so tests can point it at a +// fixture file. func LoadFrom(path string) (Config, error) { + cfg := defaultConfig() data, err := os.ReadFile(path) if err != nil { if errors.Is(err, os.ErrNotExist) { - return Config{}, fmt.Errorf("config: %s not found\n\nExample config.toml:\n\n%s", path, exampleConfigBody) + return cfg, nil } return Config{}, fmt.Errorf("config: read %s: %w", path, err) } - cfg := defaultConfig() dec := toml.NewDecoder(strings.NewReader(string(data))) dec.DisallowUnknownFields() if err := dec.Decode(&cfg); err != nil { @@ -140,14 +131,20 @@ func LoadFrom(path string) (Config, error) { // describeDecodeError rewrites a toml decode error so it names the // offending key and line. For an unknown-key error (StrictMissingError) it -// reports each missing field's key and position; other decode errors -// (wrong types) already carry a key and position via DecodeError.String. +// reports each missing field's key and position, and why a removed key is +// gone; other decode errors (wrong types) already carry a key and position +// via DecodeError.String. func describeDecodeError(err error) error { var strict *toml.StrictMissingError if errors.As(err, &strict) { msgs := make([]string, len(strict.Errors)) for i, e := range strict.Errors { row, col := e.Position() + key := strings.Join(e.Key(), ".") + if why, ok := removedKeys[key]; ok { + msgs[i] = fmt.Sprintf("line %d column %d: %s", row, col, why) + continue + } msgs[i] = fmt.Sprintf("unknown key %q at line %d column %d", e.Key(), row, col) } return errors.New(strings.Join(msgs, "; ")) @@ -163,37 +160,34 @@ func describeDecodeError(err error) error { } // validate checks the decoded Config against the rules Load and LoadFrom -// enforce: Root is required, expanded, and must be an existing directory; -// History.MaxVisits must be at least 1; Picker.Layout must name a known -// layout. +// enforce, expanding "~" in each Exclude pattern on the way: every Exclude +// pattern must be well formed; History.MaxVisits must be at least 1; +// Picker.Layout must name a known layout. func (c *Config) validate(path string) error { - if c.Root == "" { - return fmt.Errorf("config: %s: root is required\n\nExample config.toml:\n\n%s", path, exampleConfigBody) - } - - root, err := expandHome(c.Root) - if err != nil { - return fmt.Errorf("config: %s: expand root %q: %w", path, c.Root, err) - } - c.Root = root - - info, err := os.Stat(c.Root) - if err != nil { - if errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("config: %s: root %q does not exist", path, c.Root) + for i, p := range c.Exclude { + expanded, err := expandHome(p) + if err != nil { + return fmt.Errorf("config: %s: expand exclude pattern %q: %w", path, p, err) } - return fmt.Errorf("config: %s: root %q: %w", path, c.Root, err) - } - if !info.IsDir() { - return fmt.Errorf("config: %s: root %q is not a directory", path, c.Root) + if _, err := filepath.Match(expanded, ""); err != nil { + return fmt.Errorf("config: %s: invalid exclude pattern %q: %w", path, p, err) + } + c.Exclude[i] = expanded } if c.History.MaxVisits < 1 { return fmt.Errorf("config: %s: history.max_visits must be >= 1, got %d", path, c.History.MaxVisits) } + if why, ok := removedLayouts[c.Picker.Layout]; ok { + return fmt.Errorf("config: %s: picker.layout: %s", path, why) + } if !slices.Contains(pickerLayouts, c.Picker.Layout) { - return fmt.Errorf("config: %s: picker.layout must be %s, got %q", path, strings.Join(pickerLayouts, " or "), c.Picker.Layout) + quoted := make([]string, len(pickerLayouts)) + for i, l := range pickerLayouts { + quoted[i] = strconv.Quote(l) + } + return fmt.Errorf("config: %s: picker.layout must be %s, got %q", path, strings.Join(quoted, " or "), c.Picker.Layout) } return nil diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 99460fb..39668fc 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -3,6 +3,7 @@ package config_test import ( "os" "path/filepath" + "slices" "strings" "testing" @@ -21,33 +22,10 @@ func writeConfig(t *testing.T, body string) string { return path } -func TestLoadFromMissingFile(t *testing.T) { - path := filepath.Join(t.TempDir(), "does-not-exist.toml") - - _, err := config.LoadFrom(path) - if err == nil { - t.Fatal("LoadFrom missing file: got nil error, want error") - } - if !strings.Contains(err.Error(), path) { - t.Errorf("error = %q, want it to name the path %q", err.Error(), path) - } - if !strings.Contains(err.Error(), `root = "~/Developer"`) { - t.Errorf("error = %q, want it to include the example config", err.Error()) - } -} - -func TestLoadFromMinimalAppliesDefaults(t *testing.T) { - root := t.TempDir() - path := writeConfig(t, `root = "`+root+`"`+"\n") - - cfg, err := config.LoadFrom(path) - if err != nil { - t.Fatalf("LoadFrom: %v", err) - } +// assertDefaults checks every key of cfg holds its default. +func assertDefaults(t *testing.T, cfg config.Config) { + t.Helper() - if cfg.Root != root { - t.Errorf("Root = %q, want %q", cfg.Root, root) - } if len(cfg.Exclude) != 0 { t.Errorf("Exclude = %v, want empty", cfg.Exclude) } @@ -60,15 +38,29 @@ func TestLoadFromMinimalAppliesDefaults(t *testing.T) { if cfg.Keys.Vim { t.Errorf("Keys.Vim = true, want false") } - if cfg.Picker.Layout != "grouped" { - t.Errorf("Picker.Layout = %q, want %q", cfg.Picker.Layout, "grouped") + if cfg.Picker.Layout != "list" { + t.Errorf("Picker.Layout = %q, want %q", cfg.Picker.Layout, "list") + } +} + +func TestLoadFromMissingFileIsDefaults(t *testing.T) { + cfg, err := config.LoadFrom(filepath.Join(t.TempDir(), "does-not-exist.toml")) + if err != nil { + t.Fatalf("LoadFrom missing file: %v", err) + } + assertDefaults(t, cfg) +} + +func TestLoadFromEmptyFileIsDefaults(t *testing.T) { + cfg, err := config.LoadFrom(writeConfig(t, "")) + if err != nil { + t.Fatalf("LoadFrom: %v", err) } + assertDefaults(t, cfg) } func TestLoadFromEachKey(t *testing.T) { - root := t.TempDir() - body := `root = "` + root + `" -exclude = ["archive", "tools/scratch", "*/node_modules"] + body := `exclude = ["archive", "/srv/scratch", "node_*"] include_hidden = true [history] max_visits = 42 @@ -77,24 +69,13 @@ vim = true [picker] layout = "list" ` - path := writeConfig(t, body) - - cfg, err := config.LoadFrom(path) + cfg, err := config.LoadFrom(writeConfig(t, body)) if err != nil { t.Fatalf("LoadFrom: %v", err) } - if cfg.Root != root { - t.Errorf("Root = %q, want %q", cfg.Root, root) - } - wantExclude := []string{"archive", "tools/scratch", "*/node_modules"} - if len(cfg.Exclude) != len(wantExclude) { - t.Fatalf("Exclude = %v, want %v", cfg.Exclude, wantExclude) - } - for i, want := range wantExclude { - if cfg.Exclude[i] != want { - t.Errorf("Exclude[%d] = %q, want %q", i, cfg.Exclude[i], want) - } + if want := []string{"archive", "/srv/scratch", "node_*"}; !slices.Equal(cfg.Exclude, want) { + t.Errorf("Exclude = %v, want %v", cfg.Exclude, want) } if !cfg.IncludeHidden { t.Errorf("IncludeHidden = false, want true") @@ -110,33 +91,34 @@ layout = "list" } } -func TestLoadFromTildeExpansion(t *testing.T) { +func TestLoadFromExcludeTildeExpansion(t *testing.T) { home, err := os.UserHomeDir() if err != nil { t.Fatalf("os.UserHomeDir: %v", err) } - // Expand against "~" itself (the home directory), which always - // exists, rather than fabricating a subdirectory under the real home. - path := writeConfig(t, `root = "~"`+"\n") + cfg, err := config.LoadFrom(writeConfig(t, `exclude = ["~/go/pkg/*", "~", "$HOME/x", "node_modules"]`+"\n")) + if err != nil { + t.Fatalf("LoadFrom: %v", err) + } + want := []string{filepath.Join(home, "go", "pkg", "*"), home, "$HOME/x", "node_modules"} + if !slices.Equal(cfg.Exclude, want) { + t.Errorf("Exclude = %v, want %v", cfg.Exclude, want) + } +} - cfg, err2 := config.LoadFrom(path) - if err2 != nil { - t.Fatalf("LoadFrom: %v", err2) +func TestLoadFromInvalidExcludePatternRejected(t *testing.T) { + _, err := config.LoadFrom(writeConfig(t, `exclude = ["["]`+"\n")) + if err == nil { + t.Fatal("LoadFrom invalid exclude pattern: got nil error, want error") } - if cfg.Root != home { - t.Errorf("Root = %q, want %q", cfg.Root, home) + if !strings.Contains(err.Error(), "exclude") { + t.Errorf("error = %q, want it to name exclude", err.Error()) } } func TestLoadFromUnknownKeyRejected(t *testing.T) { - root := t.TempDir() - body := `root = "` + root + `" -bogus = true -` - path := writeConfig(t, body) - - _, err := config.LoadFrom(path) + _, err := config.LoadFrom(writeConfig(t, "bogus = true\n")) if err == nil { t.Fatal("LoadFrom unknown key: got nil error, want error") } @@ -145,15 +127,20 @@ bogus = true } } -func TestLoadFromMaxVisitsZeroRejected(t *testing.T) { - root := t.TempDir() - body := `root = "` + root + `" -[history] -max_visits = 0 -` - path := writeConfig(t, body) +func TestLoadFromRemovedRootExplained(t *testing.T) { + _, err := config.LoadFrom(writeConfig(t, `root = "~/Developer"`+"\n")) + if err == nil { + t.Fatal("LoadFrom root: got nil error, want error") + } + for _, want := range []string{"root", "removed", "cdd scan", "line 1"} { + if !strings.Contains(err.Error(), want) { + t.Errorf("error = %q, want it to contain %q", err.Error(), want) + } + } +} - _, err := config.LoadFrom(path) +func TestLoadFromMaxVisitsZeroRejected(t *testing.T) { + _, err := config.LoadFrom(writeConfig(t, "[history]\nmax_visits = 0\n")) if err == nil { t.Fatal("LoadFrom max_visits = 0: got nil error, want error") } @@ -163,65 +150,25 @@ max_visits = 0 } func TestLoadFromUnknownPickerLayoutRejected(t *testing.T) { - root := t.TempDir() - body := `root = "` + root + `" -[picker] -layout = "fancy" -` - path := writeConfig(t, body) - - _, err := config.LoadFrom(path) + _, err := config.LoadFrom(writeConfig(t, "[picker]\nlayout = \"fancy\"\n")) if err == nil { t.Fatal(`LoadFrom layout = "fancy": got nil error, want error`) } - for _, want := range []string{"picker.layout", "fancy", "grouped", "list"} { + for _, want := range []string{"picker.layout", "fancy", `"list"`} { if !strings.Contains(err.Error(), want) { t.Errorf("error = %q, want it to contain %q", err.Error(), want) } } } -func TestLoadFromRootNotDirectoryRejected(t *testing.T) { - file, err := os.CreateTemp(t.TempDir(), "root-*") - if err != nil { - t.Fatalf("os.CreateTemp: %v", err) - } - if err := file.Close(); err != nil { - t.Fatalf("close temp file: %v", err) - } - - body := `root = "` + file.Name() + `"` + "\n" - path := writeConfig(t, body) - - _, err = config.LoadFrom(path) - if err == nil { - t.Fatal("LoadFrom root not a directory: got nil error, want error") - } - if !strings.Contains(err.Error(), "not a directory") { - t.Errorf("error = %q, want it to say root is not a directory", err.Error()) - } -} - -func TestLoadFromRootMissing(t *testing.T) { - path := writeConfig(t, `include_hidden = true`+"\n") - - _, err := config.LoadFrom(path) +func TestLoadFromGroupedLayoutExplained(t *testing.T) { + _, err := config.LoadFrom(writeConfig(t, "[picker]\nlayout = \"grouped\"\n")) if err == nil { - t.Fatal("LoadFrom missing root: got nil error, want error") - } - if !strings.Contains(err.Error(), "root") { - t.Errorf("error = %q, want it to mention root", err.Error()) - } - if !strings.Contains(err.Error(), `root = "~/Developer"`) { - t.Errorf("error = %q, want it to include the example config", err.Error()) + t.Fatal(`LoadFrom layout = "grouped": got nil error, want error`) } -} - -func TestExampleConfig(t *testing.T) { - got := config.ExampleConfig() - for _, want := range []string{"root =", "exclude =", "include_hidden =", "[history]", "max_visits =", "[keys]", "vim =", "[picker]", "layout ="} { - if !strings.Contains(got, want) { - t.Errorf("ExampleConfig() = %q, want it to contain %q", got, want) + for _, want := range []string{"picker.layout", "grouped", "removed", `"list"`} { + if !strings.Contains(err.Error(), want) { + t.Errorf("error = %q, want it to contain %q", err.Error(), want) } } } From 4da641f6fa64f33f41c00187b80dff27a8097082 Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:33:27 +0500 Subject: [PATCH 8/9] docs(readme): document cdd scan [dir...], git Projects and the v0.2 upgrade Refs #57 --- README.md | 96 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 56 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 7378627..d3b4724 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # cdd -A TUI that lets you jump to recent Projects. +A TUI that lets you jump to the git repositories you work in, most recent +first. There is nothing to lay out or configure: `cdd scan` finds every +repository below the directories you give it, at any depth. ## Demo - + ![cdd demo](demo/demo.gif) ## Install @@ -54,21 +56,35 @@ eval "$(cdd init zsh)" ## First run -Create a `config.toml` (see [Config reference](#config-reference)) with at -least a `root`, then seed History with a Scan of everything already under -Root: +Seed History with a Scan. With no arguments it walks your home directory; +give it one or more directories to walk those instead: ```sh -cdd scan +cdd scan # every git repository below ~ +cdd scan ~/Developer ~/work # only below these ``` +A Project is any directory holding a `.git` directory or file (so +worktrees and submodules count). The walk goes to any depth but stops at a +repository, so repositories nested inside one are not listed, unless you +name that repository to `cdd scan` itself. It does not follow symlinks, +skips hidden directories and anything matched by `exclude`, and passes over +directories it cannot read. Run it again whenever you clone something new: +it never overrides the date of a real Jump. + ## Usage ```sh cdd # open the Picker over History, ordered by recency -cdd # open the Picker pre-filtered by query +cdd # Jump straight there when exactly one Project matches, else + # open the Picker pre-filtered by query ``` +A query matches a Project straight away when it is the Project's name +(`cdd cdd`), a trailing part of its path (`cdd tools/cdd`), or its whole +path. The Picker lists only Projects in History, and drops any whose `.git` +has since gone. + ### Keys Default key map: @@ -96,63 +112,63 @@ Vim key map (`keys.vim = true`): the list is focused on open. ### Layout -The Picker ships two Layouts, selected with `picker.layout`. - -The **Grouped Layout** (`grouped`, the default) groups Projects under Kind -headers, marks the selected row with a caret, and puts the filter line -above the list. - -The **List Layout** (`list`) is a flat fzf-style run: no Kind headers, -Projects in History order with never-visited ones last, `kind/` muted -before each Project name, the filter prompt below the list, and a `▌` bar -plus a background highlight on the selected row. - -Both draw the same preview pane, use the same keys, status glyphs and -colours, and degrade the same way on a narrow terminal. +The Picker draws the **List Layout**: a flat fzf-style run of Projects in +History order, each Project's parent directory muted before its name (`~` +standing in for your home directory, and trimmed from the start on a narrow +terminal), the filter prompt below the list, and a `▌` bar plus a +background highlight on the selected row. The filter matches the parent +directory as well as the name. ## Config reference `cdd` reads `config.toml` from `$XDG_CONFIG_HOME/cdd/config.toml`, falling -back to `~/.config/cdd/config.toml` when `XDG_CONFIG_HOME` is unset. +back to `~/.config/cdd/config.toml` when `XDG_CONFIG_HOME` is unset. The +file is optional, and so is every key in it; these are the defaults: ```toml -root = "~/Developer" # required, no default -exclude = [] # paths relative to Root, glob-matched +exclude = [] include_hidden = false [history] -max_visits = 1000 # must be >= 1 +max_visits = 1000 [keys] vim = false [picker] -layout = "grouped" # or "list" for the flat fzf-style layout +layout = "list" ``` -- `root` (required): the top-level directory whose Kinds are searched for - Projects. A leading `~` is expanded to the user's home directory; - `$VAR` is left as-is. -- `exclude`: paths relative to Root, matched with `path.Match` semantics, - that are skipped when discovering Kinds and Projects. -- `include_hidden`: when `false` (the default), hidden directories are - excluded at both Kind and Project level. +- `exclude`: glob patterns (`filepath.Match` semantics) for directories + `cdd scan` skips, along with everything below them. A pattern containing + `/` is matched against the directory's absolute path, any other against + its name alone, as in `.gitignore`: `["node_modules", "~/go/pkg/*"]`. A + leading `~` is expanded to your home directory; `$VAR` is left as-is. +- `include_hidden`: when `false` (the default), `cdd scan` skips hidden + directories. - `[history].max_visits`: the maximum number of Visits kept in History. Must be at least 1; defaults to `1000`. - `[keys].vim`: when `true`, the Picker opens with the list focused and uses the vim key map described above. Defaults to `false`, the default key map. -- `[picker].layout`: which Layout the Picker draws, `"grouped"` (the - default) or `"list"`, as described above. Any other value is a config - error. +- `[picker].layout`: which Layout the Picker draws. `"list"`, described + above, is the default and, for now, the only one. Any other value is a + config error. + +Upgrading from v0.2: `root` and the `"grouped"` layout are gone. Delete +them from `config.toml` (cdd names the offending line), then run `cdd scan` +to rebuild History, since the old entries were stored relative to Root and +are ignored. History is stored at `$XDG_DATA_HOME/cdd/history`, falling back to `~/.local/share/cdd/history` when `XDG_DATA_HOME` is unset. ## How it works -A Scan sweeps Root once and seeds History with a Visit per discovered -Project, dated from evidence found inside the Project itself. The Picker -lists Projects drawn from History, most recently visited first, and lets -you choose one; choosing a Project records a new Visit and hands its path -to the Wrapper, which turns it into a Jump in your shell. +A Scan walks the directories it is given once and seeds History with a +Visit per git repository it finds, dated from the repository's last commit +(or the directory's mtime, before the first commit). The Picker lists +Projects drawn from History alone, most recently visited first, so opening +it never walks the disk; choosing a Project records a new Visit and hands +its path to the Wrapper, which turns it into a Jump in your shell. See +[ADR 0001](docs/adr/0001-projects-are-git-repos-found-by-scan.md) for why. ## Contributing From dcc9a14d7da805a308cc3cb063bf4dc5f86a8f7f Mon Sep 17 00:00:00 2001 From: Hammad Majid Date: Wed, 30 Sep 2026 19:35:33 +0500 Subject: [PATCH 9/9] docs(demo): record the demo against a fake home of nested git repositories Refs #57 --- demo/demo.gif | Bin 217958 -> 188164 bytes demo/demo.tape | 5 ++-- demo/setup.sh | 68 +++++++++++++++++++++---------------------------- 3 files changed, 32 insertions(+), 41 deletions(-) diff --git a/demo/demo.gif b/demo/demo.gif index b282d4a7c670cab85a51cd6e686ab54b52ea51bc..db6f8e1d03ff0cc677dda335d6f727944b65b1ab 100644 GIT binary patch literal 188164 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 iq<3eQZ_ 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

--BWX6UjTBG#53DhR2`mF6`ysJ^o&0 z_}7z}etF{Azdv6ME55(Fd-CH70FEp)=)Z)w{aIDX1Z2e@2t`*xG9LEOI zgpr@pLgN5=A~wu9?Rh!i3tTJJ?3!6z5}rI=)!d|MPTd7w`x;|}r>3eWU!W(`WpQ=i z1%8q^$k?+w$y1s*iHi@$Pi}G)3=SC!MV>}f%7I(ia=6+jL0@ZE*@+z71 zQW5fg%f58=@1m-j_nP!lF|W6}mE^R(WU=XzhS$Da!WZlx=;4;`)G8~*|<*zXW`4}0WHneh& z68>#u2{u40{Ls`0-6QSY zQsr&z=R0-BMoHS&ZN+aNj=P<4Dbf$mar-j=EnL=0z(I!pL4jYbU(kVAfaa}${*~a{ z)%KbzgRlKU?_~yZ=Lc`BgdIS`vS4&P$UovaIXnRtA+#FV1BvX(4O8=vZb*;v;tR4` zjmd(=_+>6<_F|a6KdByi91zYN9SI{xU3XP&W2?W7@R; zHLKNYP8f!dirV+b*Q_RU<1GbN+}-?%a!nB;YnNr#NXGc9U5zjUe5%`80wb~3X)P^s zZNAL^13Nz57*Al_g=RI83h}u&*D|^BS>Mx>yYTpa{M}%D&K!#KI{r)BTJF=;oOx)@ zKFa6MS`r|DBDX?$Zc!j~##5qs;N4oGQoxPD^g`o+D^>wFxA4Vt{&@$NN&?rfM+Pih zT`yHzJ?FQEHaK&0wCUzlJw36dx%_fK&Yks&EPN&ZT;-cH>2m=)IRUpfR&E;$-~JPj z3TipcvQe#sud#nuBN0fH3-tdLP}j3k$6-}(wGm+7GWc-)&OE+B4q6-;crhU`k`UM= z`mL#)y{^0^p*Aqyb)&_}?=H7R^Wet$=Nnb#%UAEDz;JZXK^hP4qNQ+}=w4=QGw4 z9AO^(L}%-TjNc?#;N`!@m-om|7lYMF!OssAlKv^A^#@NwT1N^+M}-v4Hx!ikw%^pQ zO!p|fZD@QOxHe$g7-=fDOm5AV_(+<_Dh6Rv|)bbJck*=p!;stsqo_>FZa{OiAVpv*4Yxf-^m-RAe<;Q3t+ zu^JArs-1a9S;;P<&WlTOi%YT-1&`nvTIMn7w6facH4NgsNaJ+hV{_W$kMlW|xYy^k z2MLT2Xh#ZEsG8J9(1nDTg}PPI{d>Zj-Xbql=kxa1OCnBtBTsLtp4*QQyRjq&?$Uzq zBfY<$R`wJX?gH`eOJplaScvnSixkk@m#R{cx=|zH9tm*Tm)Y@>O^j3|MWUW9qHaX) zdvyr~?w@&8b*8(Er%_Gh-oAWymHf=U^xVFpg_qK%+HtMI>jO1$`uO(xy zU4vAq3pYgZSDyLa|KnVpI;-gb8?9YGy9*98;_diB)m1l)L$azEad!aV@dRV_pT_5+ zO-z28SVx;){7E-;k2drEX%-Z19`(~aG1|gk!w9U*Dh1^68L+I2wz~V%syo{H(NF84 zXqy*5ZDyivKi#*@)KKgqAc{124u9H#W3a5husksrgnwO-jIo#hWv?D{aW(o(qLqX7 zFNcdUj_$u4y_g;54$wIuf&<7jdW-!s%VnN@{m3gDOSv}zIisb%F6i(SA5WPT!ogf zC>1q3q=X=V8LUiN%IRqIt>WMH%@pBVH z2>NS!y|`ns`_)B9v{0D|(-BbVaqsDPLg82Uggf_cmuiQ+ip#c~A@%AAG@zMhi3zJI zx=B}&IKb^sarwWl=4BriHI`Q2JgQC?hf@i>^^91T0a=m5uCkmQmW0mYKm9KJMg_mC zyc0xYsX#pf_$EQ~v&r8rm#FrTe6a5WeQkQ+sg&LXVFNTWdPt4|;>Md85KO?Bxdi58 zMu3;tu#N!@tjA!>ClNpo54umuvLKCw4viQ*Z4tJCE)lI>Wq+ar8r+)5oJ8$O(d>V5 z{CFnu$*1EdONmc6kDvZXe0F^N44gz|J)!a>4G5nMNG1)+pA4!e4V^m~GD#Y?KKVC% zF=@p8WW+mZH0WeBDrqe7WGp3VJo{w)M$$yZ$wXb!^SdX{yOUl#I(adaH2LCWawh5J zr<0dUNmH9AQ$Lbk9iO}sj%BMRJgo*$!1{{)RPYHw>;&8+@b`721ZV5O8NDIx;lmk| zYqFZzic%?xxFON;xc7AL=;Hz2aiTimuXeWn@yIY7O8`v|sMlZfZ-0V#&%|^{{QN@e z{f8$K@0plC6X)+<`&w}&+Isf$5B-HxwF}PRMR@~#&{NvX-=!Vg8>qpXKI-yC1NMFZ z51J_9F(iQ=_!?|*?kR}D2S1BTIaD#~DSE15Pe7xoTNZ?8Pp<3K3imsjGH4>=M@-C2 z06IWH6(91*_@Yj3;7pBK#T2Cuhb`|ny{?m|n;x6D@t3&0 zefsyvU+UDGyDr^lRZ(k$_NuO-44UX-b)>(teadC{OS_azytm34**hz6?m{V za9MG4eIZM}E?3>wkZ?hkmbx0kPgcGsVw@!^Ai9_(S}4eyZpmBXa^>=4ONvC83nm!qSu=)oP!MPqFp#%wO5 zyLN0^;p^Ynr6?-K5G3Ux5GEar7=Q@2qQ6z#{j!^189k+gh0{}YjLYH&*H^0u5V^JL zRQ|xVnhcqiwb~rbjkP+8x!ihvkyGIMoie|c^@hsWjrGQAvfM^feM#U(b5ldhMoVkY z#>U-_QM%k_>;3nEn{9n7Et~fqA8c&4Qz7zO9mD)VTb<)FcelDGH8;1qr_JTJ@4s~l z+I}$WcXzwzbL{4JFO4k!y>GcB==;O9hP&VUw|X|eKiVCY-+BD=ebCO6!b_2U&9s`zu-^i;^t*BIHhpKolmwtvoG zEfjyfb#M;(_0Gk=?bmycxb0sbaOsK%vp%IE2Osf`Z3lC~z1s($!p9VUe~$hT^7~8t zYTNJmq~G-I-(Lw(r9)cksnElP4B2~!i#b}~50@wwN=M5@&Y?%&%KYygtyIQ+KU%F$ zSNgM7UmE&ny{YlupN-bu?|(Ks#*~h??tch9-tJqycl`bF@9)PuRH*XF?(nIwlf7}- z_LKcdt(}t}(-z8qf4+4N`}=Fwzy0sQ=eV7}ziH{p{|=W+!~PwuHMalzv(>xv?|64i znSS!~Lm2(<;c7em-^uSCIvv1P4S-^(Afa6X%%+-gt4W3E?h+9>)l9OO0l3>PNr15g zqcuLjk+7SBWUGN$UTG?knMng;>I+eZ`AFddlmK!VTs7{M_V zAb0L{{GBp=8Y|-g4Hg&DW0%2VmPn&X-Q9f7Nh9Gy!k7}IlST07x-YMb5sbnZ{Gttl zglEz4r!aK^imF(s0Pz-nWmL_|$SSgSNmv*uT`>TF`6f}J!R920hpO0h6%e2Q0pTp_ zwer!p#aTc849G5$y-W%ubB8)w>WE}!ET5tjcZpolUA{oz|EEIf0+4`MAn5;Zg&N5) zQ2TS(xK#V!3T4?<&!|vFe!-rm#@YNz7oY#PLTN|o>WSCzpACHQ??kVzu5PLhb3^XZ z^PfJF(b(75Ok_7+8A|Av2Yz|};I4Cpf5UawI?Jt_JTA}vQ=!`2Ny$?+GtnzHip|MV z0@q&jwtsylYj-lkbap4x?Q7FJq_K}OZHyvmty#9jv=HU*j`&yNY>_unZIT`8uA|iN z=F;)madLKV?L&w6(%T4fxkDAUIi}?0qu#I^vVlqG#^h9WzmSsUuS|*5a1BTqVJv+(o7wT9p$yQEZ;1rN(S|D4os}38QpZpMqO8t{0aEV_Z zU&vBW@*UvdcR?7#6yM{$t)!L(hS<-2A2()E=%7mGtMUdc8=6T7rWD%9tS=YZX|jAP zvUd{vR_vf_X$)5l{wQ5~IrQpMnavl355+{ra-}@DXMLq2eDus}W%T=i)m!l^&8xSQ z4*s`7{cnZ(e^jAr*!(d=LUX%hZAPeI-1v~_pWSpcTP=c~jv1B^+RMP$)N+@O56kH8 zWnyz`c^fe!a&CKBE|XrZ9yAbdctJK^63AJPHWyV{fT?Ky770Zag|4&afk}aSf z_+L-OOV1SfuVVQhPj%--sfzdiQ7jvuC%PM7RiRVhr>&x;$N#HX?l;dgV(YA=UGBHM z`;Vvkk7D`IjvLC#)p^kRu^T_bP%I_ev%TR<&u>}x-uv<>en>55ui9h~%Ik6ev`t^f z!ca!d%B9J^&ZYk-mfH$yqwFs%eCr3a;N$^LH0{g{l0@hFOw+}?nl=v~Y%&zfi`y>+ ze)v+vKd%XoEU6bJzUex=Wc#>pZ)sfq&E=`b4}Yvq*U`Iip6O}Av(gQiPA{{;&qvq^ z`tJGNp|Aj~n$(q7PoEsmyjgltW%umq-)jEPm7M^IbEdpd0UQ;`gBUI)aQ1P{$E(^P zs)2^HDY?8GPy83s1pNBmUSli=ETkh1P8pxNhmRz4bGXnbY|v=&9Nqn*ZcDIgHDXY9 zWxOu;^q-``Avh;nZLZ$RvS+@AeNOd4p^fIckBPYXnQui7PJ&LbbGW^9(eg4H0mpWl z2Gu(x%-HBW7oZJtHPX7ztFO%7cqMB{L1gIfSF+?Ayu=QnYZm^Ndde8Q@%hF$!WDIcvycz|Kb}g)-0A=J zRNQg)Y;qJD5afclf5CF&U(DFKZyM78IM3m)W`jNvDoRR!KOA82Z5L|oDkQN-YkG@(-w6Rdw2d;UD@N(TGW3CIy z9FA?;+M6~NTebhMr?M?Bx+0l;pGE-l)l;XzjI4sGUUt1*G`wo%M|=0($q5ti?=r9{ z7_v;{ER<4Vcq)9S54QGyJXPTry8asua~u(!<)o!SV(X(x+6aZZs9~UDJ~bQ$6@99i z`X8ODZ4Dmvsb=UV`EkjAsV{w6bHQP+?LVICpW{aHL&Cs|va=dQ-ih&{JpJD|ZvdNK zN6ss~O;p`0IXwzxbh$?62B)U01Mbhyx5++QTlfCQQ+-JNi&mMw?ry?~1ZFA@Zh56& zLDf^nmHLuE!}6iSfO@gJwEgFZisikbr|(#+8R&<8V)PEfQ{h0*pz2xGjIT(7%H*R$ z0kgxHAp+;wM0cw>L})-915j%*PT3U16940=_C~35jy~t0L~-MOlR=?5#AW830r-Cu z%k{NH-j8_<#p2Q@%uprvAI+@C0jAc{k$=UA)@uZD6rPQrED#yo~l`ck!~+txDSM}<_Tm*&MnM()DUjWwokOdf#q$Dcz=OFjJbIJ+ie=UXbS3HwK_ z1<+qzH{ec`cnD7T$UuD0Ablh>V2Y<(99&`8o4ToW{C8N)vXcqjB*arP6DS7;&25Ld&rCDo{Np?s>?{CD4MF=tR` z%f(qQpT2>2{+NX9PZ{GSy}l!7IN~0Hx?C;HzNSm^)#nANEr$EQbwdow34d>Y``aLjfq!+}xFo0s-lh)5iD z5alQD^3ZzzK&@=>9aEUSMAAIojcHI#Q^mBPa8cCG{wag71t`KQ=p%slPfjbw=pS8a z`g1rzITN1xchpYql}pdrds3$1dcLQhy&vs;pynxA@huO1G|5@q&Q^qGvJJPShx5Za zElWR7JT~Wh8Q+jy)OhlZ>Dl3cs^(6K_m*$ARo_hpHaxyJ0gqlidM!B9%2jp@1#07< zV#vlq>qIvJCV@BAJ?mLJA6GL8&Z9jssuqDBYjZ7gj|X2yv=(!3xHU>WtaKct{?FA)a=j+BZDL{6)E&jW%st!i>PmNM zs;%;ayDy9IuO785#V__Fls-Q+!^a@Z4hu=yWolsO*^JfzOIlar zhx}s$7e`)8ET>~2R`nq1-TXNnf?oJ?+sQK5v z@0>rLYyW*PBKFieuKi?Xb^2)9S^h_z-8BVg`X9Di1_!sQPPP-P(&y;c>E9nI|Jzrd z{<#una5VGk-&WeQzu{L5PgbAx{+gjONIn6Qlz^a!3&~ECgz6(*jUXvx zc*z}-)KI6Cv{OL*DVk*|d(0%=vaqwWDd@fwBkf>q?NoCNuVH*@l4GjXY^r`i>UnKP z8-X;3vWtQ)X}f3BT>8=qMpHcEQy7aNUS&$o+T`XtX^v2HH)rzJ9lqdMp=ep*KIeqX zc=Fgts#&j{kYl>fNc!jENR#wbwjRE*mGtBX@vh>o0sQIAKkYr~`1EauR7?MioA08- z@WDPP*VWMs)3_u@pkF0EEh^rVCpNRT@mhvJW&ogFyDZ}lCNrWmd!R4N`)5Y$nr+%xwBl-HH&=G9xfKc;aefsGKb6%bbGfA`bX+R| ztCe5@4J!I}@zI0eJ&5ZA7xxtmehQQ8e``PO7KKBwS*=FDOC_1OH- zKHqPSv3pI?f6LL7TO?R*s2=uj%{Q*7&9N*>Ku(z%&dcGKN5jJ#fK$W%rQuuD0*X%-OX zlUXF(T-I<<#1kOIk?!4mvn0&*Mv`kqk51<8=0F{%vgwt=Zp$0;QssA=$?49;+va|~ z8K=%#ls$S_P|;iwARQ8>bBlGg-0Et9mril!dSDGp#VdMq<(H!zIhKp{S1Z3pmoI$_ zy}K@u`789KXdlI6K6YgTagdiDR+-dP33)xB%J8=A(u z(csVoNPqz8;GQNp!JQyMgA)=oIKjPfx1b@oCBf1_aBJLMf~Ro^0fz6KQ*+Kt%~Z|B z)YM%3ulL2SRqtBwUbWxn_dIUE{H56p4*Xc}zVvy6cl7v;Cmc|*G!EJ|}_)M?8-nrCzv@oxy-XQHg&1t6ijA zUko1WCn?T^Z4Vz88!J-V6!FqxEm~Q4U#3TT;38$z?B%_tPRG7K5iVNdEgJtzIF7OZ zecx8ZnW7>*tmwga=bgLle3uVNxH837ud<}Q(m>r|zdl<_;m2ev=vpeghtrgKiI#b0 zgl@2t3qCF@=8WXNr;hvmt3*F{>3>e}VoKi)N+F<H{%)Xe1k(yQ>LW=@Zt*6u4o zlzCHhr&9S3g7T|x-mQO9^{Fb}F-H&B#0~70t0aAyD-%lXt?-{MUo4Yf5v^obsMw0k z(F?Eq5Lv#KQCat=5)+x_N>JJLif&W1s;sl}&ny2}k19!EHFsLo&2Gi)t7=5V=Wu<4 z5+?L&Z-CY#RQqzSfVAZvn79b%jRejHq&a%DQX`Xva``99Dqr3k(FGwZLt>da^h zkh@WGgta~W^Ibutg-we!8Vshqm;VBQ60|FnD5a@ z+))2Mie36TolmI&ZQCdu$Rqmwi`#&NKHaxBzv{Jj8-({L8I-=oD}9Z&XY;UsBeMH# zhJrF~ULwf*`zYymk*IGqn~nTd-!q~blf;^sUnGS^rjmV4QlYAu`0Q{HSzmljn=aPO zgctq3EGD`yp8l#taMJeewan%b8k(*qhacg-K?np+O#d6kizf8s-{P|rW zSL@nX==_spQxVVI6BNI4Pij*oQAX2pa+@#x&+jzJG?aBIe+z+SUsLz{Fr{^ogN^9< z-q?j`G;QC;hu+FBeYp-Eru%y0p|mY_-q}Ro4upD27W(}Z3h@*hesXjWw0x=ZabeCX zCeR%`|6Kmg+fCDjh@iIFSx8-S{{5!G6+u5++!M&#+20j@MRPOXl{~dfsKP2c7 z?pD^s)7Yo~xACV@!MxAlaqnQ_KE+CTSA*j4N8SEk(ZgPNeIDX@ShPPWX&U$BhOf%& zYO)ITzS@0g?ybkmIo$sg{dWX#(|dn8j_WUMY^htA9VPA=5{oWKAhdA!TLU`y$`?IK z6VrdzKkA?LZRT!4pQE*ZcmZu6{>;QPznaLu>F=0PU=#LDeVWnu(Dw)FS>;U+dr7%d zZ@DHSKE_KPORti zm900Iua&Bz+PK_~gLEHW;&>Ao6cn-QBo13W68=)vhT zv006dnf9GTvCt^G3Y)WySnrl**`dOGUy1Ymq5_7leUGW6n}~Amu$Jo>-Ny{^2T{-` zK~;-$O=l+A7g{_QdSeXwTNixi7lvDP(F}_V(H;#di=V<5 z8P}$*ycg&07&?|2Dwlj~7Z{dSZI)1uJ$kdDec;lCsGj8J;%|@pR6gVya15?WEN&kt zY`-a-jb7&X)AWcU78E)2m|!-zX}O|kMd=Cpm}_jaVw~w3A0!&- zGMeS12Cie)gbur&K>C@S*44I0N$5uH40G#lCYtrv*L^pFOP4^(8$%i_cjQZQP4P?Ji7b6*mJKR^?(hWm-4c{5Dl2H{Rp^vb)_>&scNw+wd69 zG~!ABeK+*WusKcJX_bF?CCG1GTLt;?6*4K_^tI1;W7y!^SG7>a)l|Bjk34~93!=Y$ zwhStNl{z^Q>hBg;{`kVvP;*#$?6s@Sw)-PyPgixOsV%5Xa_<7PUp=(Z;bhcWxsqqH zuc@%#zZBunyFUa`?J?P~Wo%t0IPeHR&|o-7y{)Re^?4}dyS~#F+SZZI;}x;EynWa~ z-nw?^sG~<;224TzpZ5~Rep2B2gZvb9}ku~qD$}6 z=h*HBj>5P)n4S)&8)F;}x@dm?IEU2!@?9$8S!XoxCCpu3i(Ro$+z6;h4xsF{l=!t& z-Z!|Ai2eK|Vsu%o_@j^Xrg+NFzKC4py*vXO_tFha z`sE&TGKDkbOf#sRocp53Q$8m)7sxDM;P|(HE-benJeIH@n_{1ezPOlSxO^{pM1R*= z5_j!cbs7Bbx)u6K*&0LEHtzl9>!;V3e3e(Tw|kj!QIbr9;mfOvzsmBNjuQqO`h1QM zcX59xmJAz+FxMtyMRBQ4Oj~IA>xmeQuwY0*cA|IXgp zNg^F?UQ+(-$MBPSA=80)*~sKY>SO!qW|xvs##U~_oym&VJvldCCmWtYb18T^M=u5= z>{ICv#ozsI-D&Q5@Y@^iadwnxZTyyz|K^WS%<@!t>G8sNB?6mL3@(L3Wmzqicv+zQ z{CCS5v}5rh{cyu_c&AEdDYA~Fb0$(t<;NG%ht8#VedN&ZH*!Qyd^Fa4&$?<}%)@1H zJ%VFJ8T~=L3e2+O?-W?#qKAJb_rIv^8~1VLRpKZq)NJLf`l-o7r!fbA`E>l_@ylmD ztb7d*2W0q$Hf%ICRfI0Q`BX)ImG3Bv{%#o?#$E5M8=<=a@vBS8($}j?LuIw^8f2)f zCSFRAp0W?hJua%(Y+`NT*HWqRc2%i3G#pY^7Gi7A#+4Tk(9zl3J?&QKvmn*c{c6;p zYv}EBrfcjW`(^Tv`f2qG>R)z=dKPi5{CbwDR_C%==EgkY7~UkL+Ba8wK|@Eg1UJLC zbrOl)eKYnNDDy?p3q!YQ9Cv;9Wykw0i8OJjU=di^L)3nC^Xuz@zc`orAE>@uh;Jpl zkDu|ye&adsL>DSN8hFQ-y6}N~>iufC(AJq*?DKOzqnhH1XET$>zEQeJJ)TL6l-KTB zmM8rUBbL<9VqaRNc{oj2<@mc(=#X5$kKcl7=)SbhOMNh5U7YK#`KDl%?$4b~W_GNi zZRyt(a{J03Tcg8&lb(Dtaj24|b!g~2^>X}5OmV%|+y7ACENi)2%*Nwn%UfPTam%qI z9(WE(Wq|3BxVsdZHY` zn6>gF2TD|vEp!@o6?rozf0`wK={eff13u8Lk&7(13Yj(-rG+(A>KHq^eQ{VLKztic zR(BtIZG5EksdY-N%6HN3b#j_^yVB$8kRg~E=@ZT_o)lOA#l1T-2EvYR)fE1O2Ce~E zl-}T*2bP%)_SO>Kll`#|3i1Rh1YTyoic?B%7&knySKNIyyTsSn(6He6t{Jg-_&~Yz zjQdl-p6)34!no7e{#{Hn&&DU6?*liwE(3pzwnfXoPA22K)zDS#IbE>Lo$=HbKGDU5 zPV2AV*nJpkescO=r**H@#ADSy@qAb>rM{uccqwyPdvdz$db8>RL$@+ZCY+Bg=(%iyUChPL^4^qd)Bl>ugP$MeIM8prI=C#AcyycUctsmlfCY*MT>y$EjU~R=J@DgI;1M%7a;3;yMOD?ceYv_qJ#W_ZTR-blYYh zln+YO%?$avvm$|xYf}E_BXm+AX{uie(!<{e^Ya2j8xJ zoLm#@7lZwT9!$1cyZ6u;Z>l=C9%S?T(CIH<3of=C{C#^D5cGW+^vJV4gcBqD*l2ZD z!ZU#3*0~VNXN}^buIp>ek=nDYA*x^Bq9tsepXhBq2^(*F4LND9 z7yrRmawRWVsgd=o#hCW%_YrG`)2nl%?FV4d{y4~Z;nVCmnXszS?8DSzHDjdu>#B*0 z*!;4$4DtFxRa33EPt$+w$QL^)K$ZzAjz-8tW0fySVG~ zv~+m{a*iQb+6ka4T}_R>^yj?Yj{a4$9s;@YQCj+y^tEKuCHCrrUCvfkSjjIl$RGDe zzs*9uk{y-UKQ3jG8|9Bn_Cz4p&i#z*^%unl9I@AqyLY#%Ej`7*DItID2!5>mOf5bN zTyp;kCAb>V_M1(<-Q1qPz8Wm|YpKc|-2dTy-M#PE{Nwo`roj6zitFy%$nwCcxA#qx zgMZ_)|G=e|_icUoUEOb{fxl0@?<)77TVDUrA^0a=Pn#2EDu&WjLYNpLH0)4@-YB(5 zgh3`kwG5@(j8g7LXwM^F?xHlVQHlgoYIITxobAeD?Q-{0Jwqv3yY`nX;=d!MR5RNT z%B0MjrS|*V?dRKfciWw>rM3w=+~_(sIbV2*y;xW32sG?ivFix+ez6?c5trGqSoR{J z`NcwiN78)9-0q8K-tE!^(!19$W;r`~=%imLN#Ai9b|UOLIlQHxM@m1=?35_$WNnrf z@0Wf!-zmD=3A>gSA&_CB`zgfvlV0qn;42v+@y=-_8Cv_Fe33t?Gk=OS$w>IfOqKnl zoBuhn`;&6uC!C;*{aR+6Q}&5i*QipLkfH2|T^EF|OFTnX+NWzUQdXu}cA&pYeZH%2 zw@c?*wueB@n6A5vQ_faQ?x&KRi(z+%UAK?7TzjOPf2JI&Ojfp~ySHCXaY1f)SMKHC zZZv_sT9%{$m%Ijj&-XI9V8fnocJdM4@@q=+TH^BZSv_0WU%Zn#y|iWh>ZSc%WdkOD z`b_k2^7ihKDHtd#9KTX9W>t9ZqwqRfK`Kk(&a7O)(4jYIUwCW1m+56w^j`(NW(Ai1 zm_(VrB<;Rr%f1xXzSQ8pw4}cD!oH09zRbdy)y}@`jlP`IzFbg$9z}mXYyT%u|2$uR zp>}_fWq+}2e@SqEX>{LoVt-kE|CgWrK8@ks;U3kRC&2bzBlv`h@NZVa@Y4*UQOq9~rWvnum(40g6~%^(K5SidG% z4xW}}^&}~WkJCogP?bdt_MHxNMkG(6mAf|vgYctAjFjv7GY9@c$5@rejT9%v2YH@7 zn;@becO7aKr~95hgf1UyX`!2&iCm;mzMJ8KRPht65Gk+HtF9GNt?$3wpiuG2SJ}!M z*rXsW^iT$5^!H(I{=hC|%bm{p4sZ zE1L0alnG}HMmfgJHug|pj74^gRcDONYV48Q*x_t%=Vhbk1ld-db9{e0toI zi~&XElmX_@C;5*PDC{^tlkjrhRa}YGj>~3aYrP}O()&!!*F}2?BJMw>5j@B)>{pKO ztn$6mI`)kAjb@ZQXb|p-u{n|rrk|+h(3bqH1@fL4mYImvDu202*nBk3>qXD>dEz7c zL+WHKW)-@9uT9e*?wbdPU z3?-NP3@&AId$YUnpc|0J4JnG`b8 zqMAfJ1rMBA+mAHVA&m-w)3@u}aL*>|=s8=?WY*|r4e2*APrAk{zPllAWuJ3dor#T^ zEfCO779iSY%`7@&NTxR^*_`bB@G7!vF6eA3WPUnQ=T)7Eio#!&LIyp5f!Q+0)cLIb zxP$5N7@dOb*{tmOoccM9RsE)ld6J0v+Qs>yQ6;~E=@xFob}QNHfT1hA*xG*|zHE)|O~{&?UaihjE1SWe3X^LF z=+4>V?b*^-%bgX=T_N*!q)Vga#u*i=z1j4CJ(rGUmqr;@ zE?pxB8D0^CO)nZ|zBw!>F)a5aFNrnGrx=-)-59z1nmq!}uHTsSwVL3oteS@`=HATB zbj`KPno&bmtFmXQ{h;fzisP+w9p5HLE!SXPeKa{kBNE0_DoXW5lq5^5uZRsfmxj+a zmwItbwl){iLF;$q1A6lUX1tHgin7<(Rn12zO;dNwnEaHuizBZkmOq~*i|MWqEgASa zzS^LiWUe&tC$_w_vgCU(h zW!=sMQ9f_WJ1=t^$9D!t-Zn-NnkAZFB4R6Zd^LSfw~;*RA#6K|ZJ&0(Y_k~HCT(S> z_%+8vgekCWQzajEP|oSiGo|q)Wjy$z6+0K-%^;J>2<8p{BfHWmBQv>`EIE6kN1I+w5m4Q=P1Y% zN+fqRmbMg}hPJ_P`45r&a_NIymMSL3+XoItU{e{elYH#&arcD5TnzGk-Fzc1W3={fW-oz_1g zoEK77fIVASzgJSvF!PPh;I~FUAllUr)@>=@;0W1W3p)33wRkx0lZ3q+3Ep~}e8|(d zswDW^&aL9K@$lj6-+QWpGQ-xpDa#Epj(DGc*S8(TNcMgvJ#rV^15r6E73b!jI?nRH zeXa6ti?YW;wQ@CY>9r(e1G8^pRi7oz_@F9i6X_uT3T}VC|F`3{dh^Rqsu2g~QaTq5||i z-lLgNsc+(hE&dt)Ov#w z_q~4VSiD=@C4-&$@5!(C77>sGTc)>4P?w=0Ll1ZR+!Ql2YtsSA-wwDJ@@nTTIiz~& z@c7AdH>ww&Lbf07@{%h(yqDSTF+typgn!A8{{iX#UkFPd0eAqU0Q!4z_e;RtO_Wr1 zo>U+nF0GM133F!{2 z3MX3hW;~VH+D}7TswLxNWBq@k5of<&9QD5~?%zp7c*s48h|j4l{4pRfjD(5Ixu$vr zkFV3gYTPDjy4ytRwy*T^scewgjb_ITD z9gXAk_7%RkHsn=m0dtlw%!BKDRRHeh+mPs=D;6g#|;A?Uhro}YDl%RscDB-{Bhaf<7;q>B^nprYZ`pKW8PA7%x(4n)^0bNzTu zvIfJ!yr^)?W~-Zggj6(Cl%+KEU9^a{#r;G%hwFHQ>>{OLmqYlOWPn~{Tz(}=x#^?48pJ}t~N?~^PxHoI`NjdNEdthRQRtnZ0ouZjI5 z{tbOJ3y%Md`FRkB)+CS`+n`&4lqFo!9}$Fg;PC}G944w2jrXvgV-(Efyt@$bLaMD; z>N=z;J<*DQO1TEY?d570S*F)T=H@(s(+**P6{qD%?V~H?{lBfm7Za*cIXxddvc1?D z^~W7Ukzb&?pp4G~F!PpFTilJ17+3oX)7~-}X7J{d6D{tg(1I6u&3a}@Z68>4HwnL_ z>_2~gmmzQ&Tou*mb|nmtl4s`D?IbQDbxwRsBL4b9H-65 zf%sP&#E5MgND2{iQ0nXMO*vm~i!Kdl)YT5gbwT35W%yms}`?X$cxKeXvSQuAnNw7Xmpg z2*XT%q~82(-@o8NkR*fjx}Be`WdF!T1jf>lfaFxOq3owbwDn99SP!%-m6rds94Z_Q*E}>JT*85NFy~C@5TQZE za;vCFDj1W?FMB9JC_b|jz`%3Ma3!SF4Yj~vW(`BC3}*X{%q&$;M^r*|t_G!Qt<;t+ z+pWXOZZ8OyeF%(kWg&9?dE9j_bQ!WWXZ3Z~kp#a>fm*E6e^w!2sm&8A%ajQR{M8HpG+%t^& z@j)OHN<5c1$#YgL==*7!Mk6VBFAAGPybu*cq(3V^VwKJYdPu~~^;64tGca*VkFLU5 zI?`Y#B|#OZ0)Q2#Y-UY?#K9p&i9PM3AXgT^iKj_;wm=e0lcZi7nqpLG7Mes`;o3?3 zOgKOahu9PiAi6)D?eFb?pOHkoDAST`;{PL}hvL4@VL-+E&%}Rax*4O}tMjEp{)6fM zFZ=;a+Qe0%Hox~jnC^f01HzOn8kT#eTiE5EKhRv zG&kza8awVS-B5UFE}??Rak35X`2)eaQl8kB?=DGR7m~TE5*7rllXdnb)Y+@&zgMi> z@1Saoe=m=>zsReN_%(TK9jvq5asOzWrrG9+HW65WDLP>?6f@nDoQlg`?L} z#`Qt?&}YS%NMYLrg;fwp943ux>&h1$B=}u@0|6$272N}AX=9*H6nUKZ-rzHs8ZU|M z27*T!!zK@9H6NBZZmEj`Qe}GrqPb~cF}#}fmug@uqOlMp6KS3@pT8z3h$wfXQvpX8 zk`yZ0_!rPA!yXJ9k}#=tMZh+Rc%^WiX0TPUU7J`fM5=lL(ztWw*m0s`mv>TjN|gE! zqv3lS>pkhB3`m8N*G>1qFM-r78Mc9!bv}LJCwfzs(^tJN!A|MzZJM$nvtSfWIqXz7l$2n!Z7zH{Ib(2gfd+m z0;n`Pj!I_)pb=#u4*-fgcjDpl3!{L+JAm-)8@iL>=j>9Hk|^Rc;H>bR=XjseIgmL!{_)a95sB3uRhi*amm*v<2> zIu=YJ1<3TL=okpL8J=(<`FBP0`Zj<8Bm7eR7nK}?Q(*KJ@WYA5xiLQhV=d!m(qoBP zjw&oHUOeEE286{Gg~PXvBfK97^-No5D1ZaVqafi| z9#EH3X?h_nR+jHI1g!cyKx0pHx@p*5A)PY7ZxN0vyj{g&yv(QFg!kO9vjbSp5{lG9 zQBfPj%0!z}84Cw6EpWtY6iU(VI)`Ez1$>lo?xdgW#S$cIF9^&7L>RdS63SH*IQC*Q z?V>|PxXb`7a6)roogN9v(Ey$qY_~5+Ly_ReNN6FD$(}qMNLCZ;o?*d|D;z+GG>!5u zFQDHIz?B3`0U3!p7?0U;#U@CrKCpqXHNR01jlYZYK*xZBJi~C9Lt{uV0J1;M){-k4 z5FZ7-x50M4EU}M*OUxnT3mS~U2VgOb286N56oT=z5gF?T;oJwZJZO;@ zJE(z(DF=XZQ4TLwnWMpX`a588_TWm*`apsiX?g`bDFQ50i05EFkPZ$`MMX~HtD90@ zdWHaF`SE;DKWf{m_n0&5LO2}MGTZlOp09{DWmT>-Ah!)49*));N2}6;_1g)WNOZej zRTHx0p@pvE%p!;F@*C>#~}ff{dxTEtcaU z&k?$r0Lty7CfMqG*8;l6nJk3U%7jmz`4dyR7ea?e!|y%MYHX`RVm9-M--Q>@;NnR= z+L9pn;w2Glg|NohvnHp)>lgFQpc#?^yO zJ35JR^`&3513=`;=H<+#hdeo6P`Gj#@GWQAK3a^~c94BC!|?s1dM<(HI_Q6y7&emue&c@*x-jYn5dn zlgq1ng!>VYd2com4FItOG!TISHUJ}3@S6o}Jj#1lAs;y>v5lapc*0_Poc9222VUY} z$tntnX&6CqJ5V9ODbpW)FGgv{d&GXp8JqVJm*14kAtRWysoK%+@u$hBPfAJmt5-N* zGRyMbCw58@#E0@DA2O9)1_GnsL0=cP;~_~X$+Q{P6pKoma%Y6ICw+pz=mlaS(SXU| z)nFdv8sm-vHqO0yuGy~w8r2z3oI-Vo_e?&a6FO8JnCeW^F*Z$JPSy3)TEnHx8E{VvnDs`koG-Z z!M%M4h(5x{M!cUR0l?L@FY}0q13;I~ROQn|fAS#8)glC@_?KuR1q?^bdqATpGz4Q- z>+))$T3m<>OK%z&<01Nt08Jovd z$_c?n3^%X^0Po;HV^hdEz?K0Wvi_I|8~}s@o>t{qvXkIlA#trPpra3=$sXd;$QQUs z7o@4v76Nd60boI5iDNher-6P*D3Sz=6ZKa21Rn&uk7R;TRulT)fw6_)`1_hbr#xs? z-aS>seV^4li6R~YK!Th>>}Y^qh${~X*2P0y5CH!#M*YwdvVtIBQa3gr!8$<`F(W_P zu6PW=aJ+>99j5mN%y0%I&LIVs*E(2M4!{wBmHL$cj>bu$_5`aNm9ad_FM-&a;yRH5 zn)9HQGb%`Rp^lFPS7;nM4D{D8!=0~K?(d<`Eg-^HkSccKK!jV0GxQ4r5FG$bL_Ji^ zgFZNo+|1*?D13{(hE-S^gKZAjswV`(@s0tOaCKk_8-y4R!cvTbYeT-F-&v9yGoypC zHKI>@v9aC6^T&uA1xRKRIRCzhY3m|}oI*hXgy(nF_=p)7tUxS8HKB+NQ3~QIyXo5? zfJOERWUD%gXM$)C4b}~3?Gi``|Apn32Q2`IK#(#@Q-DP{v`vO&lnk1j%H*7?4hG;K z1MoGSJy>-i4->GMVbEO+^zt2G#uRG2@`fYN^%5y%m-0H6+LR@LeIJYSPXGZE@}Vv2 z133nNt6Fz^Qnt{>2x|KDG9l%N7i0{>F-GDjBW-_u10LlOF;^3M?EqqqqHcJjC$RC4 zstK`4ggpz1vDc#&Qn2Ju$(mL%GS1L4IG`*E9D#w%P$?${fDEeNX(9qx;Go?+2pGw< zSL*2P3D`B&1Cr=|fP)OwakBA2taliI3r45Z272zw{U?uT@G4z1KoYE=PPw9Lg<*nx zfRZS_pL7OL&f=7$#HW>rYNE1^8{m89_{wL{!!(y##it(pP_77`v2X(DSn8Cg=py2Q z1GOVE4=_d^43s7D6vP_>K+l~ccJ*Pe({Z|a`GdYDQNWE(8o^r9KwD=W;=IRrp~+uu?AwnDcyQ&^`=k zzzK$_U>J5K2>Cp%0OD_HNp`xwsv+uVXg(lmNcl7WvT2=bgPd4aNtPA8_&iFB;z z&d?5Yks4m9<_z&3qChV#WbeK!ePq4LBN~tfKD`p)fkn7f%YaFgJMu&gVAu#$;fZ<} zeu#(Aod6!)v=tJ?(vSdkuMY2F!I{O!H>i$Ln65m}gE*ma{N!}y(2$@vxVxqiP9a$Q z`ap71HZZ_=4&dBQ0Y&P91-Bl{t>6}@gPE&&qG+MtW(dy%oajynjNzc-N5pZ3{=b8P zG4Bm>A~U}rvFOmm77bZ*VFYj_7{!q_M~%0*4c>!6-H|xPrnqS<@~i=%c2`hL0#=C@ zgj)~q*c4h(2yoSdIIW}ync^!TuRat zg<3Y#mGlr+Y`)Ms1GJUV&w$HnLIXG`#Mv%R258yOTktUS2?pE46yMksWLtf&0s#u4 z%=gxCS*ycEEeJQPLHM|C_DCRj4ZK?oc>oLLh4a|IZ?c8CQ~ZH3kmyoako2=^!zT#k z0iZ23g*_(e69p|) z>xC4>;KFf-U~yM@#N8{ncV@a(nh^ZtOo>^d%xZ4%yN7=2=q>m&1cu-%Kkgv>-V19K z7hyh!#1j?ZX4)glCFuf5NxM`N3N8@;=E4rRE4Em{;9H@ITuiwb)Rl$#n{A6pgq#7k zrbM^Nco6}FbsJdJ>R{PmX)ZQw7c{W~0K2ampKp!m@dd!XnsB6W9Q&-OV+Gvup1UJ} zAfQfX5s8P#3-rq)!e=Am;^!I03>TmYC+&%V#mLu|kVV-2+F;svTEy@-@iCnhl) zg5yCJ3FCf>Ozorl;RJ@nnroQXTWBI%IL!P;4*X83IZta*9elMqCCmE47$ZP{#$gQB zbjN%qM{yL~C^J~GGR6>B>&xrjjRA+@1bm$`26->D$2e_ar3a?w9NLf+B+|N6X)Hhn z&OzcU&4(>DPEF<~!)MHZ7P`3szWvOvq$P~S{Fqah#H?1p`9y%|SjdmO0MsSPq|OR* zArVpss*ekSu|%?(1&r&$$g4d#OjrF19y6dM>v$y?oJfc|Sl!bl$RCOrcZz`FKyh_` zA9*&){-9Wkl{@v-2~m>bXl5fVAcvxQj@~-g*9i|-B`2#eBA-^LI*{29 zgPn3sD&(CB=FpIc^~Ez2aJ2Igb==X)7!1pwnj-)Km!zev7Lac{z#A2Ty)XUf#DKj* zbc2T8Vve8P-5p=S0aC~fhTIdWQOx(YJ=)b5vw)LZ_^Hfq=tUlI_0x$G6AfDq(Tmro z(*CDXdCV_gpG5*s)u3k=&H$-^W!<|o-9XQYauOBjnXLaQdBBP3k8?HVbMnBmH%w2=`io9XAb^rTqQdH7%AaIo?~l+HWV%a{IYrxR+or%Ys_cVPW$AOr(s zAvpjXsonDj9C)lJ|L_OiQjhXr)EfT_{y-stO~rhnMj9WB5N>It{0wIJBZTlbG2YtR zhH8$4?=6T{dt3bznGSL$tpmZEAwa$~P69I5DATDh>B`XAn@r=&mXv_G?djKA-SY?6 z~TmlMVS3eLUY4bjC7r3lb@kuqq}pYj|mYk7tuhr8Ij({~_UxQs$F)jT2W1*2=lh6eB5K zX%@E!BV<)4E=hNO{A&RJe|Z4^pGBLyFWO!nq8)?-C3@%sbIywjw4zqb5`Kmb4!zSP za-OQn{SnI~wsk)Q3q{1tivKa}8(WqjrcxtQD6ZY?PnCja(Idwm4S3^z%tNLR{!&YO z#CKe7OJ1t}N!f6Tkk_nqEJyBlyieM@;?Yd)@1LUo@Rd$d@bxVPbGYy5l~|9r6?siL z>ek8pXew+b|DskQ^^-R5O1E?Ti=FY>fs*i(*FWDXc6f$2ZZF_F_PL$*UKRWR1k#zO zk?&3wkC(o^$|nI8M8j|&(FYUHo7zVk-Qg3DF=HH~|Bptz|LOq$>Hz;T6Z{`+6#vy4 N{@pkHe{Kz8{|)cW%Deyo literal 217958 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 D{LC(2 diff --git a/demo/demo.tape b/demo/demo.tape index 9ae5df0..4822cc8 100644 --- a/demo/demo.tape +++ b/demo/demo.tape @@ -1,5 +1,5 @@ # Records demo/demo.gif against the environment built by demo/setup.sh. -# Run `demo/setup.sh` first; it never touches your real Root or History. +# Run `demo/setup.sh` first; it never touches your real home or History. # # demo/setup.sh && vhs demo/demo.tape # @@ -19,12 +19,13 @@ Set TypingSpeed 60ms Env XDG_CONFIG_HOME "/tmp/cdd-demo/xdg/config" Env XDG_DATA_HOME "/tmp/cdd-demo/xdg/data" +Env HOME "/tmp/cdd-demo/home" Hide Type "set -gx PATH /tmp/cdd-demo/bin $PATH" Enter Type "set -g fish_autosuggestion_enabled 0" Enter Type "cdd init fish | source" Enter -Type "cd /tmp/cdd-demo/root/lab/notes" Enter +Type "cd ~/notes" Enter Type "clear" Enter Show diff --git a/demo/setup.sh b/demo/setup.sh index 1057b8f..3c8f2aa 100755 --- a/demo/setup.sh +++ b/demo/setup.sh @@ -1,19 +1,19 @@ #!/usr/bin/env bash # Builds a self-contained demo environment for recording cdd, so the -# recording never touches your real Root, config, or History. +# recording never touches your real home, config, or History. # # demo/setup.sh # builds /tmp/cdd-demo # DEMO_DIR=~/x demo/setup.sh # # Layout it creates: -# $DEMO_DIR/root a fake Root with five Kinds and a few Projects +# $DEMO_DIR/home a fake home with git repositories at several depths # $DEMO_DIR/xdg/config XDG_CONFIG_HOME holding cdd/config.toml # $DEMO_DIR/xdg/data XDG_DATA_HOME holding cdd/history # $DEMO_DIR/bin/cdd the binary built from this checkout set -euo pipefail DEMO_DIR="${DEMO_DIR:-/tmp/cdd-demo}" -ROOT="$DEMO_DIR/root" +ROOT="$DEMO_DIR/home" CONFIG="$DEMO_DIR/xdg/config" DATA="$DEMO_DIR/xdg/data" BIN="$DEMO_DIR/bin" @@ -27,7 +27,7 @@ mkdir -p "$ROOT" "$CONFIG/cdd" "$DATA/cdd" "$BIN" # out so `cdd scan` seeds a varied History. git_demo() { git -c user.name=demo -c user.email=demo@example.com -c commit.gpgsign=false "$@"; } -repo() { # repo +repo() { # repo local dir="$ROOT/$1"; mkdir -p "$dir" git_demo -C "$dir" init -q -b main echo "# ${1##*/}" > "$dir/$3" @@ -41,54 +41,44 @@ ago() { # ago -> ISO timestamp, GNU or BSD date || date -u -v-"$1"d +%Y-%m-%dT%H:%M:%SZ } -repo domain/kryft.dev 1 README.md -repo domain/wowaitech.com 3 README.md -repo domain/candidex.dev 12 README.md -repo tools/cdd 0 main.go -repo tools/grg 6 main.go -repo tools/dotfiles 40 README.md -repo ops/internal 2 README.md -repo ops/backups 90 README.md -repo lab/bubbletea-play 5 main.go -repo uni/compilers 20 notes.md +repo Developer/domain/kryft.dev 1 README.md +repo Developer/domain/wowaitech.com 3 README.md +repo Developer/tools/cdd 0 main.go +repo Developer/tools/grg 6 main.go +repo Developer/tools/lab/bubbletea-play 5 main.go +repo work/internal 2 README.md +repo work/clients/acme/api 9 README.md +repo dotfiles 40 README.md +repo uni/2025/compilers 20 notes.md # clean vs. dirty vs. untracked vs. ahead -echo "wip" >> "$ROOT/domain/wowaitech.com/README.md" # modified -touch "$ROOT/tools/grg/scratch.go" # untracked -echo "wip" >> "$ROOT/ops/internal/README.md"; touch "$ROOT/ops/internal/new.txt" # both +echo "wip" >> "$ROOT/Developer/domain/wowaitech.com/README.md" # modified +touch "$ROOT/Developer/tools/grg/scratch.go" # untracked +echo "wip" >> "$ROOT/work/internal/README.md"; touch "$ROOT/work/internal/new.txt" # both upstream="$DEMO_DIR/upstream.git" git_demo init -q --bare "$upstream" -git_demo -C "$ROOT/domain/kryft.dev" remote add origin "$upstream" -git_demo -C "$ROOT/domain/kryft.dev" push -q -u origin main -echo "more" >> "$ROOT/domain/kryft.dev/README.md" -git_demo -C "$ROOT/domain/kryft.dev" commit -q -am "second commit" # ahead by 1 +git_demo -C "$ROOT/Developer/domain/kryft.dev" remote add origin "$upstream" +git_demo -C "$ROOT/Developer/domain/kryft.dev" push -q -u origin main +echo "more" >> "$ROOT/Developer/domain/kryft.dev/README.md" +git_demo -C "$ROOT/Developer/domain/kryft.dev" commit -q -am "second commit" # ahead by 1 -mkdir -p "$ROOT/lab/notes" # not a repository -mkdir -p "$ROOT/.archive/old-thing" "$ROOT/uni/.hidden" # hidden, never listed +mkdir -p "$ROOT/notes/2026" # not a repository, never listed +repo Developer/tools/cdd/vendor/inner 1 README.md # inside a repository, never listed +repo .cache/some-tool 1 README.md # hidden, never listed # --- Config and History --------------------------------------------------- -cat > "$CONFIG/cdd/config.toml" <> "$hist" -printf '%s\tjump\t%s\n' "$(ago 1)" domain/kryft.dev >> "$hist" -printf '%s\tjump\t%s\n' "$(ago 2)" ops/internal >> "$hist" +printf '%s\tjump\t%s\n' "$(ago 0)" "$ROOT/Developer/tools/cdd" >> "$hist" +printf '%s\tjump\t%s\n' "$(ago 1)" "$ROOT/Developer/domain/kryft.dev" >> "$hist" +printf '%s\tjump\t%s\n' "$(ago 2)" "$ROOT/work/internal" >> "$hist" cat <