Skip to content

Commit dfb302e

Browse files
committed
Added repository maps to remove reduntant exploration of files
1 parent d378c6d commit dfb302e

7 files changed

Lines changed: 469 additions & 5 deletions

git_utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,23 @@ def is_dirty(repo_path: Union[str, os.PathLike]) -> bool:
114114
return repo.is_dirty(untracked_files=True)
115115

116116

117+
def get_dirty_file_names(repo_path: Union[str, os.PathLike]) -> list:
118+
"""Returns the paths (relative to the repo root) of all modified, added,
119+
deleted, and untracked files — the set that add_all_files_and_commit would commit."""
120+
repo = Repo(repo_path)
121+
names = []
122+
# -uall lists files inside untracked directories individually (instead of "dir/").
123+
for line in repo.git.status("--porcelain", "-uall").splitlines():
124+
if not line.strip():
125+
continue
126+
path = line[3:]
127+
# Renames are reported as "old -> new"; the new path is what gets committed.
128+
if " -> " in path:
129+
path = path.split(" -> ", 1)[1]
130+
names.append(path.strip('"'))
131+
return names
132+
133+
117134
def add_all_files_and_commit(
118135
repo_path: Union[str, os.PathLike],
119136
commit_message: str,

render_machine/actions/agent_fix_conformance_test.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import file_utils
44
import plain_spec
5+
import repo_map
56
from memory_management import MemoryManager
67
from plain2code_console import console
78
from plain2code_trace import preview, trace
@@ -564,7 +565,7 @@ def _build_start_task_params(
564565
Shared by the first-attempt path and the session-rotation path so the two
565566
stay in sync.
566567
"""
567-
return {
568+
task_params = {
568569
"specifications": specifications,
569570
"test_output_file": test_output_file,
570571
"prepare_environment_output_file": prepare_environment_output_file,
@@ -584,6 +585,23 @@ def _build_start_task_params(
584585
"keep_session_alive": True, # Mark this as a persistent session
585586
}
586587

588+
# Orientation seeds: codebase map (boosted by spec terms and the failing test
589+
# output, so the files implicated in the failure keep their outlines when the
590+
# map is over budget) plus the per-FRID implementation history.
591+
relevance_text = specifications + "\n" + repo_map.read_text_tail(test_output_file)
592+
repo_map_text = repo_map.build_repo_map_param(
593+
render_context,
594+
conformance_tests_folder=conformance_test_folder,
595+
relevance_text=relevance_text,
596+
)
597+
if repo_map_text:
598+
task_params["repo_map"] = repo_map_text
599+
code_brief = repo_map.read_code_brief(render_context.build_folder)
600+
if code_brief:
601+
task_params["code_brief"] = code_brief
602+
603+
return task_params
604+
587605
def _add_optional_task_params(
588606
self,
589607
task_params: dict,

render_machine/actions/agent_fix_unit_tests.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import file_utils
55
import plain_spec
6+
import repo_map
67
from memory_management import MemoryManager
78
from render_machine.actions.base_action import BaseAction
89
from render_machine.agent import agent_runner
@@ -45,8 +46,9 @@ def execute(self, render_context: RenderContext, previous_action_payload: Any |
4546
test_output_file = self._save_test_output_to_file(test_output)
4647
linked_resource_paths = self._get_linked_resource_paths(render_context)
4748

49+
specifications = self._build_specifications_text(render_context)
4850
task_params = {
49-
"specifications": self._build_specifications_text(render_context),
51+
"specifications": specifications,
5052
"linked_resource_paths": linked_resource_paths,
5153
"test_output_file": test_output_file,
5254
"unit_tests_script_path": render_context.unittests_script or "",
@@ -56,6 +58,16 @@ def execute(self, render_context: RenderContext, previous_action_payload: Any |
5658
"memory_folder": render_context.memory_manager.memory_folder,
5759
"memory_file_names": MemoryManager.list_memory_files(render_context.memory_manager.memory_folder),
5860
}
61+
# Orientation seeds: codebase map (boosted by spec terms and the failing test
62+
# output, so implicated files keep their outlines when the map is over budget)
63+
# plus the per-FRID implementation history.
64+
relevance_text = specifications + "\n" + test_output[-4_000:]
65+
repo_map_text = repo_map.build_repo_map_param(render_context, relevance_text=relevance_text)
66+
if repo_map_text:
67+
task_params["repo_map"] = repo_map_text
68+
code_brief = repo_map.read_code_brief(render_context.build_folder)
69+
if code_brief:
70+
task_params["code_brief"] = code_brief
5971

6072
tool_executor = ToolExecutor(available_tools=FIX_UNIT_TESTS_TOOLS)
6173
response = agent_runner.run("fix_unit_tests", task_params, render_context, tool_executor)

render_machine/actions/agent_render_conformance_tests.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import file_utils
55
import plain_spec
6+
import repo_map
67
from memory_management import MemoryManager
78
from plain2code_console import console
89
from render_machine.actions.base_action import BaseAction
@@ -113,8 +114,9 @@ def _render_conformance_tests(self, render_context: RenderContext):
113114

114115
all_acceptance_tests = render_context.frid_context.specifications.get(plain_spec.ACCEPTANCE_TESTS, [])
115116

117+
specifications = self._build_specifications_text(render_context)
116118
task_params = {
117-
"specifications": self._build_specifications_text(render_context),
119+
"specifications": specifications,
118120
"linked_resource_paths": self._get_linked_resource_paths(render_context),
119121
"acceptance_tests": all_acceptance_tests,
120122
"build_folder": render_context.build_folder,
@@ -129,12 +131,29 @@ def _render_conformance_tests(self, render_context: RenderContext):
129131
"memory_folder": render_context.memory_manager.memory_folder,
130132
"memory_file_names": MemoryManager.list_memory_files(render_context.memory_manager.memory_folder),
131133
}
134+
self._add_orientation_params(task_params, render_context, conformance_tests_folder_name, specifications)
132135

133136
tool_executor = ToolExecutor(available_tools=RENDER_CONFORMANCE_TESTS_TOOLS)
134137
agent_runner.run("render_conformance_tests", task_params, render_context, tool_executor)
135138

136139
return self.SUCCESSFUL_OUTCOME, None
137140

141+
@staticmethod
142+
def _add_orientation_params(
143+
task_params: dict, render_context: RenderContext, conformance_tests_folder_name: str, specifications: str
144+
) -> None:
145+
"""Seed the session with the codebase map and the module's implementation history."""
146+
repo_map_text = repo_map.build_repo_map_param(
147+
render_context,
148+
conformance_tests_folder=conformance_tests_folder_name,
149+
relevance_text=specifications,
150+
)
151+
if repo_map_text:
152+
task_params["repo_map"] = repo_map_text
153+
code_brief = repo_map.read_code_brief(render_context.build_folder)
154+
if code_brief:
155+
task_params["code_brief"] = code_brief
156+
138157
def _render_acceptance_test(self, render_context: RenderContext):
139158
if plain_spec.ACCEPTANCE_TESTS not in render_context.frid_context.specifications:
140159
return self.SUCCESSFUL_OUTCOME, None
@@ -156,8 +175,9 @@ def _render_acceptance_test(self, render_context: RenderContext):
156175

157176
console.info(f"Agent generating acceptance test:\n {acceptance_test}")
158177

178+
specifications = self._build_specifications_text(render_context)
159179
task_params = {
160-
"specifications": self._build_specifications_text(render_context),
180+
"specifications": specifications,
161181
"linked_resource_paths": self._get_linked_resource_paths(render_context),
162182
"acceptance_test": acceptance_test,
163183
"existing_conformance_tests": conformance_tests_files_content,
@@ -173,6 +193,7 @@ def _render_acceptance_test(self, render_context: RenderContext):
173193
"memory_folder": render_context.memory_manager.memory_folder,
174194
"memory_file_names": MemoryManager.list_memory_files(render_context.memory_manager.memory_folder),
175195
}
196+
self._add_orientation_params(task_params, render_context, conformance_tests_folder_name, specifications)
176197

177198
tool_executor = ToolExecutor(available_tools=RENDER_CONFORMANCE_TESTS_TOOLS)
178199
agent_runner.run("render_conformance_tests", task_params, render_context, tool_executor)

render_machine/actions/agent_render_functional_requirement.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import file_utils
44
import plain_spec
55
import render_machine.render_utils as render_utils
6+
import repo_map
67
from memory_management import MemoryManager
78
from plain2code_console import console
89
from render_machine.actions.base_action import BaseAction
@@ -49,15 +50,24 @@ def execute(self, render_context: RenderContext, _previous_action_payload: Any |
4950
console.info(msg)
5051

5152
memory_folder = render_context.memory_manager.memory_folder
53+
specifications = self._build_specifications_text(render_context)
5254
task_params = {
53-
"specifications": self._build_specifications_text(render_context),
55+
"specifications": specifications,
5456
"linked_resource_paths": self._get_linked_resource_paths(render_context),
5557
"include_unittests": render_context.should_run_unit_tests(),
5658
"build_folder": render_context.build_folder,
5759
"module_name": render_context.module_name,
5860
"memory_folder": memory_folder,
5961
"memory_file_names": MemoryManager.list_memory_files(memory_folder),
6062
}
63+
# Orientation seeds: codebase map + per-FRID implementation history. Built after
64+
# revert_changes_for_frid so the map reflects the baseline the agent will see.
65+
repo_map_text = repo_map.build_repo_map_param(render_context, relevance_text=specifications)
66+
if repo_map_text:
67+
task_params["repo_map"] = repo_map_text
68+
code_brief = repo_map.read_code_brief(render_context.build_folder)
69+
if code_brief:
70+
task_params["code_brief"] = code_brief
6171

6272
tool_executor = ToolExecutor(available_tools=RENDER_FUNCTIONAL_REQUIREMENT_TOOLS)
6373
agent_runner.run("render_functional_requirement", task_params, render_context, tool_executor)

render_machine/actions/commit_implementation_code_changes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Any
22

33
import git_utils
4+
import repo_map
45
from render_machine.actions.base_action import BaseAction
56
from render_machine.render_context import RenderContext
67

@@ -12,6 +13,15 @@ def __init__(self, base_commit_message: str):
1213
self.base_commit_message = base_commit_message
1314

1415
def execute(self, render_context: RenderContext, _previous_action_payload: Any | None):
16+
# Record this FRID in the module's rolling code brief before committing, so the
17+
# brief travels with the same commit and future agent sessions see it.
18+
repo_map.append_code_brief_entry(
19+
render_context.build_folder,
20+
render_context.frid_context.frid,
21+
render_context.frid_context.functional_requirement_text,
22+
git_utils.get_dirty_file_names(render_context.build_folder),
23+
)
24+
1525
git_utils.add_all_files_and_commit(
1626
render_context.build_folder,
1727
self.base_commit_message.format(render_context.frid_context.frid),

0 commit comments

Comments
 (0)