Skip to content

fix(edit_match): prefer literal paths over glob#133

Open
tobwen wants to merge 2 commits into
cortexkit:mainfrom
tobwen:edit-match-literal-brackets
Open

fix(edit_match): prefer literal paths over glob#133
tobwen wants to merge 2 commits into
cortexkit:mainfrom
tobwen:edit-match-literal-brackets

Conversation

@tobwen

@tobwen tobwen commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Fixes #132

What and why?

Existing paths with brackets are now treated as literal files instead of glob patterns. Falls back to glob when the path doesn't exist or validation fails.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Prefer literal paths over globs in edit_match when the path exists on disk, even if it contains [ ] * ? { }. Use glob only when the path doesn’t exist.

  • Bug Fixes
    • Added should_treat_as_glob: prefer literal when validate_path resolves an existing path; on validate_path errors (including path_outside_root and unknown), defer to the single-file flow so errors surface correctly.
    • Added regression tests for bracketed literal paths (absolute and relative) and a sanity test for parentheses.

Written for commit d3d29eb. Summary will update on new commits.

Review in cubic

Greptile Summary

This PR fixes issue #132 by replacing the blunt is_glob_pattern character-scan with should_treat_as_glob, which calls validate_path to check whether the path actually exists on disk before routing to the glob handler. Literal paths whose names contain [, ], *, ?, or { are now handled correctly as single-file edits.

  • Core fix (edit_match.rs): New should_treat_as_glob prefers literal interpretation when validate_path resolves an existing path; falls back to glob when the candidate doesn't exist. Both path_outside_root and unknown validate_path errors now defer to the single-file handler (fail-safe), addressing a prior review finding.
  • Tests (edit_test.rs): Three integration tests cover the regression (absolute bracketed path, parentheses sanity check, relative bracketed path under restrict_to_project_root: true), giving direct coverage of the reported failure modes.

Confidence Score: 5/5

Safe to merge — the change is narrowly scoped, all error arms in the new routing function are fail-safe, and the prior reviewer concern about unknown errors has been addressed.

The new should_treat_as_glob function correctly defers every non-glob, non-existent, and error path to handle_single_file_edit_match, which re-validates and surfaces errors properly. Three targeted integration tests directly reproduce the reported bug.

No files require special attention.

Important Files Changed

Filename Overview
crates/aft/src/commands/edit_match.rs Introduces should_treat_as_glob to replace the bare is_glob_pattern check; calls validate_path to confirm disk existence before routing to the glob handler. All error arms defer to the single-file handler (fail-safe).
crates/aft/tests/integration/edit_test.rs Adds three regression tests: absolute path with brackets, parentheses sanity check, and relative path with brackets under a configured project root.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[handle_edit_match] --> B{should_treat_as_glob?}
    B -->|is_glob_pattern = false| C[handle_single_file_edit_match]
    B -->|is_glob_pattern = true| D[validate_path]
    D -->|Ok - candidate exists| C
    D -->|Ok - candidate NOT exists| E[handle_glob_edit_match]
    D -->|Err: path_outside_root| C
    D -->|Err: other| C
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[handle_edit_match] --> B{should_treat_as_glob?}
    B -->|is_glob_pattern = false| C[handle_single_file_edit_match]
    B -->|is_glob_pattern = true| D[validate_path]
    D -->|Ok - candidate exists| C
    D -->|Ok - candidate NOT exists| E[handle_glob_edit_match]
    D -->|Err: path_outside_root| C
    D -->|Err: other| C
Loading

Reviews (3): Last reviewed commit: "fix(edit_match): fail-safe on unknown va..." | Re-trigger Greptile

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 2 files

Re-trigger cubic

Comment thread crates/aft/src/commands/edit_match.rs

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 2 files

Re-trigger cubic

tobwen added 2 commits June 24, 2026 05:13
Existing paths with brackets are now treated as literal files
instead of glob patterns. Falls back to glob when the path
does not exist or validation fails.
Addresses Greptile P2: the Err(_) => true catch-all silently routed
unknown validate_path errors to the glob handler. Return false instead
so the single-file handler re-validates and surfaces the error.
Dead code today (all errors use path_outside_root), zero behavior change.
@tobwen tobwen force-pushed the edit-match-literal-brackets branch from 56ca4d5 to d3d29eb Compare June 24, 2026 05:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

(bug) AFT tools don't handle file paths that contain brackets like () []

1 participant