fix(ai): match target root dir by basename in _apply_plan() (#76)
The planner sees basename(target) in the tree output (e.g. "luminos_lib") and uses that as the path in its plan. But _apply_plan() mapped the target root to "." via os.path.relpath(), so the planner's path never matched and the allocation was silently dropped. Fix: register both "." and basename(target) as aliases for the target root in the lookup table. Also log a warning when plan paths don't match any known directory, so future mismatches are visible. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3efc1cadf5
commit
79bb10b9dc
2 changed files with 43 additions and 0 deletions
|
|
@ -1549,21 +1549,29 @@ def _apply_plan(all_dirs, to_investigate, plan, target):
|
|||
return list(to_investigate), {}
|
||||
|
||||
# Build lookup from relative path to absolute path.
|
||||
# The target root maps to "." via relpath, but the planner sees
|
||||
# basename(target) in the tree output and uses that as the path.
|
||||
# Register both so either form matches (#76).
|
||||
rel_to_abs = {}
|
||||
for d in all_dirs:
|
||||
rel = os.path.relpath(d, target)
|
||||
rel_to_abs[rel] = d
|
||||
if rel == ".":
|
||||
rel_to_abs[os.path.basename(d)] = d
|
||||
|
||||
# Classify directories by tier.
|
||||
skip_set = set()
|
||||
priority_set = set()
|
||||
shallow_set = set()
|
||||
turn_map = {}
|
||||
unmatched = []
|
||||
|
||||
for entry in plan.get("skip_dirs", []):
|
||||
rel = entry.get("path", "")
|
||||
if rel in rel_to_abs:
|
||||
skip_set.add(rel_to_abs[rel])
|
||||
else:
|
||||
unmatched.append(rel)
|
||||
|
||||
for entry in plan.get("priority_dirs", []):
|
||||
rel = entry.get("path", "")
|
||||
|
|
@ -1573,6 +1581,8 @@ def _apply_plan(all_dirs, to_investigate, plan, target):
|
|||
abs_path = rel_to_abs[rel]
|
||||
priority_set.add(abs_path)
|
||||
turn_map[abs_path] = capped
|
||||
else:
|
||||
unmatched.append(rel)
|
||||
|
||||
for entry in plan.get("shallow_dirs", []):
|
||||
rel = entry.get("path", "")
|
||||
|
|
@ -1580,6 +1590,15 @@ def _apply_plan(all_dirs, to_investigate, plan, target):
|
|||
abs_path = rel_to_abs[rel]
|
||||
shallow_set.add(abs_path)
|
||||
turn_map[abs_path] = _SHALLOW_TURNS
|
||||
else:
|
||||
unmatched.append(rel)
|
||||
|
||||
if unmatched:
|
||||
print(
|
||||
f" [AI] Warning: plan referenced unknown dirs: "
|
||||
f"{', '.join(unmatched)}",
|
||||
file=sys.stderr,
|
||||
)
|
||||
|
||||
# Remove skipped dirs from the investigation list.
|
||||
remaining = [d for d in to_investigate if d not in skip_set]
|
||||
|
|
|
|||
|
|
@ -878,6 +878,30 @@ class TestApplyPlan(unittest.TestCase):
|
|||
)
|
||||
self.assertEqual(len(ordered), len(subset))
|
||||
|
||||
def test_target_root_matched_by_basename(self):
|
||||
"""Plan can reference the target root by its basename, not just '.' (#76)."""
|
||||
plan = _default_plan()
|
||||
basename = os.path.basename(self.tmp)
|
||||
plan["priority_dirs"] = [
|
||||
{"path": basename, "reason": "root is important",
|
||||
"suggested_turns": 18},
|
||||
]
|
||||
_, turn_map = _apply_plan(
|
||||
self.all_dirs, list(self.all_dirs), plan, self.target,
|
||||
)
|
||||
self.assertEqual(turn_map[self.tmp], 18)
|
||||
|
||||
def test_target_root_matched_by_dot(self):
|
||||
"""Plan can also reference the target root as '.'."""
|
||||
plan = _default_plan()
|
||||
plan["priority_dirs"] = [
|
||||
{"path": ".", "reason": "root", "suggested_turns": 16},
|
||||
]
|
||||
_, turn_map = _apply_plan(
|
||||
self.all_dirs, list(self.all_dirs), plan, self.target,
|
||||
)
|
||||
self.assertEqual(turn_map[self.tmp], 16)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# _get_child_summaries (updated placeholder behavior)
|
||||
|
|
|
|||
Loading…
Reference in a new issue