Skip to content

Commit df96c96

Browse files
cailmdaleyclaude
andcommitted
perf: use metadata-only Find for single-fiber commands
Commands that locate a fiber by ID prefix (edit, tag, comment, unlink, show) now use FindMetadata + targeted Read instead of full-parse Find, avoiding unnecessary body parsing for the lookup step. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1b612c6 commit df96c96

File tree

6 files changed

+95
-20
lines changed

6 files changed

+95
-20
lines changed

cmd/add.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,21 @@ var addCmd = &cobra.Command{
5959
}
6060
}
6161
if len(addDeps) > 0 {
62+
felts, err := storage.ListMetadata()
63+
if err != nil {
64+
return err
65+
}
66+
6267
// Resolve dependency IDs
6368
for _, dep := range addDeps {
64-
depFelt, err := storage.Find(dep)
69+
depFelt, err := felt.FindByPrefix(felts, dep)
6570
if err != nil {
6671
return fmt.Errorf("dependency %q: %w", dep, err)
6772
}
6873
f.DependsOn = append(f.DependsOn, felt.Dependency{ID: depFelt.ID})
6974
}
7075

7176
// Check for cycles
72-
felts, err := storage.ListMetadata()
73-
if err != nil {
74-
return err
75-
}
7677
// Add the new felt temporarily for cycle check
7778
felts = append(felts, f)
7879
g := felt.BuildGraph(felts)

cmd/edit.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ Examples:
3838
}
3939

4040
storage := felt.NewStorage(root)
41-
f, err := storage.Find(args[0])
41+
target, err := storage.FindMetadata(args[0])
42+
if err != nil {
43+
return err
44+
}
45+
f, err := storage.Read(target.ID)
4246
if err != nil {
4347
return err
4448
}
@@ -108,9 +112,14 @@ Examples:
108112
}
109113
}
110114
if cmd.Flags().Changed("depends-on") {
115+
felts, err := storage.ListMetadata()
116+
if err != nil {
117+
return err
118+
}
119+
111120
// Resolve and add dependencies
112121
for _, dep := range editDeps {
113-
depFelt, err := storage.Find(dep)
122+
depFelt, err := felt.FindByPrefix(felts, dep)
114123
if err != nil {
115124
return fmt.Errorf("dependency %q: %w", dep, err)
116125
}
@@ -125,10 +134,6 @@ Examples:
125134
}
126135

127136
// Check for cycles
128-
felts, err := storage.ListMetadata()
129-
if err != nil {
130-
return err
131-
}
132137
g := felt.BuildGraph(felts)
133138
g.Nodes[f.ID] = f
134139
g.Upstream[f.ID] = f.DependsOn
@@ -167,7 +172,11 @@ var commentCmd = &cobra.Command{
167172
}
168173

169174
storage := felt.NewStorage(root)
170-
f, err := storage.Find(args[0])
175+
target, err := storage.FindMetadata(args[0])
176+
if err != nil {
177+
return err
178+
}
179+
f, err := storage.Read(target.ID)
171180
if err != nil {
172181
return err
173182
}
@@ -256,12 +265,16 @@ var unlinkCmd = &cobra.Command{
256265

257266
storage := felt.NewStorage(root)
258267

259-
f, err := storage.Find(args[0])
268+
source, err := storage.FindMetadata(args[0])
269+
if err != nil {
270+
return fmt.Errorf("source: %w", err)
271+
}
272+
f, err := storage.Read(source.ID)
260273
if err != nil {
261274
return fmt.Errorf("source: %w", err)
262275
}
263276

264-
dep, err := storage.Find(args[1])
277+
dep, err := storage.FindMetadata(args[1])
265278
if err != nil {
266279
return fmt.Errorf("dependency: %w", err)
267280
}

cmd/show.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,25 @@ Detail levels control progressive disclosure:
5252
return outputJSON(f)
5353
}
5454

55-
// Full render path: single List(), find target in list, build graph
56-
felts, err := storage.List()
55+
felts, err := storage.ListMetadata()
5756
if err != nil {
5857
return err
5958
}
60-
f, err := felt.FindByPrefix(felts, args[0])
59+
target, err := felt.FindByPrefix(felts, args[0])
6160
if err != nil {
6261
return err
6362
}
6463
graph := felt.BuildGraph(felts)
6564

65+
f := target
66+
if detail == DepthSummary || detail == DepthFull {
67+
f, err = storage.Read(target.ID)
68+
if err != nil {
69+
return err
70+
}
71+
graph.Nodes[f.ID] = f
72+
}
73+
6674
fmt.Print(renderFelt(f, graph, detail))
6775
return nil
6876
},

cmd/tag.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ var tagCmd = &cobra.Command{
2020
}
2121

2222
storage := felt.NewStorage(root)
23-
f, err := storage.Find(args[0])
23+
target, err := storage.FindMetadata(args[0])
24+
if err != nil {
25+
return err
26+
}
27+
f, err := storage.Read(target.ID)
2428
if err != nil {
2529
return err
2630
}
@@ -54,7 +58,11 @@ var untagCmd = &cobra.Command{
5458
}
5559

5660
storage := felt.NewStorage(root)
57-
f, err := storage.Find(args[0])
61+
target, err := storage.FindMetadata(args[0])
62+
if err != nil {
63+
return err
64+
}
65+
f, err := storage.Read(target.ID)
5866
if err != nil {
5967
return err
6068
}

internal/felt/storage.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ func (s *Storage) ReadMetadata(id string) (*Felt, error) {
7272
return s.readWithMode(id, ParseMetadataOnly)
7373
}
7474

75+
// FindMetadata returns the first felt matching the ID prefix or hex suffix,
76+
// reading only metadata from the matching file.
77+
func (s *Storage) FindMetadata(query string) (*Felt, error) {
78+
return s.findWithMode(query, ParseMetadataOnly)
79+
}
80+
7581
func (s *Storage) readWithMode(id string, mode ParseMode) (*Felt, error) {
7682
path := s.Path(id)
7783
if mode == ParseMetadataOnly {
@@ -150,6 +156,10 @@ func (s *Storage) listWithMode(mode ParseMode, includeModTime bool) ([]*Felt, er
150156
// Find returns the first felt matching the ID prefix or hex suffix.
151157
// Uses ReadDir + filename matching to avoid reading all files.
152158
func (s *Storage) Find(query string) (*Felt, error) {
159+
return s.findWithMode(query, ParseFull)
160+
}
161+
162+
func (s *Storage) findWithMode(query string, mode ParseMode) (*Felt, error) {
153163
entries, err := os.ReadDir(s.root)
154164
if err != nil {
155165
return nil, fmt.Errorf("reading directory: %w", err)
@@ -176,7 +186,7 @@ func (s *Storage) Find(query string) (*Felt, error) {
176186
case 0:
177187
return nil, fmt.Errorf("no felt found matching %q", query)
178188
case 1:
179-
f, err := s.Read(matchIDs[0])
189+
f, err := s.readWithMode(matchIDs[0], mode)
180190
if err != nil {
181191
return nil, err
182192
}

internal/felt/storage_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,41 @@ func TestStorageListMetadataWithModTimePopulatesModifiedAt(t *testing.T) {
249249
}
250250
}
251251

252+
func TestStorageFindMetadataSkipsBody(t *testing.T) {
253+
dir := t.TempDir()
254+
s := NewStorage(dir)
255+
s.Init()
256+
257+
f := &Felt{
258+
ID: "test-task-12345678",
259+
Title: "Test Task",
260+
Status: StatusOpen,
261+
CreatedAt: time.Now(),
262+
Outcome: "Metadata survives",
263+
Body: "Body should be skipped.",
264+
}
265+
if err := s.Write(f); err != nil {
266+
t.Fatalf("Write() error: %v", err)
267+
}
268+
269+
found, err := s.FindMetadata("1234")
270+
if err != nil {
271+
t.Fatalf("FindMetadata() error: %v", err)
272+
}
273+
if found.ID != f.ID {
274+
t.Errorf("ID = %q, want %q", found.ID, f.ID)
275+
}
276+
if found.Outcome != f.Outcome {
277+
t.Errorf("Outcome = %q, want %q", found.Outcome, f.Outcome)
278+
}
279+
if found.Body != "" {
280+
t.Errorf("Body = %q, want empty", found.Body)
281+
}
282+
if found.ModifiedAt.IsZero() {
283+
t.Fatal("ModifiedAt should be populated for FindMetadata")
284+
}
285+
}
286+
252287
func TestReadFrontmatter(t *testing.T) {
253288
content := strings.NewReader(`---
254289
title: Test Task

0 commit comments

Comments
 (0)