on main help sign in
chore: refactor implementation
commit2ddc453573b1e5eefb36344f59ab050ca34145c5 authorKujtim Hoxha <kujtimii.h@gmail.com> dateThu 31 Jul 2025, 19:16 (1 year ago) parent3eed184
4 files changed+29−33
internal/fsext/fileutil.go+20 internal/llm/tools/edit.go+4−16 internal/llm/tools/multiedit.go+3−11 internal/llm/tools/write.go+2−6
internal/fsext/fileutil.go+20
@@ -262,3 +262,23 @@ func DirTrim(pwd string, lim int) string {
262262 out = filepath.Join("~", out)
263263 return out
264264}
265+
266+// PathOrPrefix returns the prefix if the path starts with it, or falls back to
267+// the path otherwise.
268+func PathOrPrefix(path, prefix string) string {
269+ if HasPrefix(path, prefix) {
270+ return prefix
271+ }
272+ return path
273+}
274+
275+// HasPrefix checks if the given path starts with the specified prefix.
276+func HasPrefix(path, prefix string) bool {
277+ if abs, err := filepath.Abs(path); err == nil {
278+ path = abs
279+ }
280+ if abs, err := filepath.Abs(prefix); err == nil {
281+ prefix = abs
282+ }
283+ return strings.HasPrefix(path, prefix)
284+}
internal/llm/tools/edit.go+4−16
@@ -11,6 +11,7 @@ import (
1111 "time"
1212
1313 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
1415 "github.com/charmbracelet/crush/internal/history"
1516
1617 "github.com/charmbracelet/crush/internal/lsp"
@@ -215,14 +216,10 @@ func (e *editTool) createNewFile(ctx context.Context, filePath, content string,
215216 content,
216217 strings.TrimPrefix(filePath, e.workingDir),
217218 )
218− permissionPath := filePath
219− if strings.HasPrefix(filePath, e.workingDir) {
220− permissionPath = e.workingDir
221− }
222219 p := e.permissions.Request(
223220 permission.CreatePermissionRequest{
224221 SessionID: sessionID,
225− Path: permissionPath,
222+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
226223 ToolCallID: call.ID,
227224 ToolName: EditToolName,
228225 Action: "write",
@@ -340,15 +337,10 @@ func (e *editTool) deleteContent(ctx context.Context, filePath, oldString string
340337 strings.TrimPrefix(filePath, e.workingDir),
341338 )
342339
343− permissionPath := filePath
344− if strings.HasPrefix(filePath, e.workingDir) {
345− permissionPath = e.workingDir
346− }
347−
348340 p := e.permissions.Request(
349341 permission.CreatePermissionRequest{
350342 SessionID: sessionID,
351− Path: permissionPath,
343+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
352344 ToolCallID: call.ID,
353345 ToolName: EditToolName,
354346 Action: "write",
@@ -476,14 +468,10 @@ func (e *editTool) replaceContent(ctx context.Context, filePath, oldString, newS
476468 strings.TrimPrefix(filePath, e.workingDir),
477469 )
478470
479− permissionPath := filePath
480− if strings.HasPrefix(filePath, e.workingDir) {
481− permissionPath = e.workingDir
482− }
483471 p := e.permissions.Request(
484472 permission.CreatePermissionRequest{
485473 SessionID: sessionID,
486− Path: permissionPath,
474+ Path: fsext.PathOrPrefix(filePath, e.workingDir),
487475 ToolCallID: call.ID,
488476 ToolName: EditToolName,
489477 Action: "write",
internal/llm/tools/multiedit.go+3−11
@@ -11,6 +11,7 @@ import (
1111 "time"
1212
1313 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
1415 "github.com/charmbracelet/crush/internal/history"
1516 "github.com/charmbracelet/crush/internal/lsp"
1617 "github.com/charmbracelet/crush/internal/permission"
@@ -250,14 +251,9 @@ func (m *multiEditTool) processMultiEditWithCreation(ctx context.Context, params
250251 // Check permissions
251252 _, additions, removals := diff.GenerateDiff("", currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
252253
253− permissionPath := params.FilePath
254− if strings.HasPrefix(params.FilePath, m.workingDir) {
255− permissionPath = m.workingDir
256− }
257−
258254 p := m.permissions.Request(permission.CreatePermissionRequest{
259255 SessionID: sessionID,
260− Path: permissionPath,
256+ Path: fsext.PathOrPrefix(params.FilePath, m.workingDir),
261257 ToolCallID: call.ID,
262258 ToolName: MultiEditToolName,
263259 Action: "write",
@@ -364,13 +360,9 @@ func (m *multiEditTool) processMultiEditExistingFile(ctx context.Context, params
364360
365361 // Generate diff and check permissions
366362 _, additions, removals := diff.GenerateDiff(oldContent, currentContent, strings.TrimPrefix(params.FilePath, m.workingDir))
367− permissionPath := params.FilePath
368− if strings.HasPrefix(params.FilePath, m.workingDir) {
369− permissionPath = m.workingDir
370− }
371363 p := m.permissions.Request(permission.CreatePermissionRequest{
372364 SessionID: sessionID,
373− Path: permissionPath,
365+ Path: fsext.PathOrPrefix(params.FilePath, m.workingDir),
374366 ToolCallID: call.ID,
375367 ToolName: MultiEditToolName,
376368 Action: "write",
internal/llm/tools/write.go+2−6
@@ -11,6 +11,7 @@ import (
1111 "time"
1212
1313 "github.com/charmbracelet/crush/internal/diff"
14+ "github.com/charmbracelet/crush/internal/fsext"
1415 "github.com/charmbracelet/crush/internal/history"
1516
1617 "github.com/charmbracelet/crush/internal/lsp"
@@ -172,15 +173,10 @@ func (w *writeTool) Run(ctx context.Context, call ToolCall) (ToolResponse, error
172173 strings.TrimPrefix(filePath, w.workingDir),
173174 )
174175
175− permissionPath := filePath
176− if strings.HasPrefix(filePath, w.workingDir) {
177− permissionPath = w.workingDir
178− }
179−
180176 p := w.permissions.Request(
181177 permission.CreatePermissionRequest{
182178 SessionID: sessionID,
183− Path: permissionPath,
179+ Path: fsext.PathOrPrefix(filePath, w.workingDir),
184180 ToolCallID: call.ID,
185181 ToolName: WriteToolName,
186182 Action: "write",