Исследуйте большую кодовую базу слоями
Большой репозиторий не помещают в prompt. Его проходят воронкой: структура, инструкции, entry points, символы, callers, tests и только затем полный текст выбранных файлов. Четыре слоя поиска идут от общего к частному: карта (языки, packages, manifests, test directories), имена (exact grep по error, route, type, schema), связи (callers, imports, ownership данных, ближайшие тесты) и содержимое (полностью читаются только файлы, которые действительно меняют решение).
Тот же ограниченный обход из companion-проекта работает и здесь.
async function visit(directory: string): Promise<void> {
const children = await readdir(directory, { withFileTypes: true });
children.sort((left, right) => left.name.localeCompare(right.name));
for (const child of children) {
if (entries.length >= options.maxFiles) {
truncated = true;
return;
}
if (ignoredNames.has(child.name)) {
continue;
}
const absolutePath = join(directory, child.name);
if (child.isSymbolicLink()) {
continue;
}
if (child.isDirectory()) {
await visit(absolutePath);
if (truncated) {
return;
}
continue;
}
if (!child.isFile()) {
continue;
}
await resolveExistingContained(root, absolutePath);
const fileStats = await stat(absolutePath);
const relativePath = normalizeRelativePath(relative(root, absolutePath));
entries.push({
path: relativePath,
bytes: Math.min(fileStats.size, options.maxBytesPerFile),
kind: classify(relativePath)
});
totalBytes += fileStats.size;
}
}
await visit(root);
return { root, entries, totalBytes, truncated };По сигналу выбирается действие и ожидаемый артефакт - это удерживает поиск в рамках.
Сигнал · Действие агента · Артефакт
- Error text - Exact search, затем callers; Набор
file:symbol - Новая capability - Найти два существующих аналога; Сравнение pattern и отличий
- Cross-package change - Прочитать package boundaries и contracts; План по packages
- Нестабильный test - История, shared state, time, network; Гипотезы с командами проверки
Отдельно важно, что индекс продукта и security boundary - не одно и то же. Cursor документирует repository indexing и два ignore-файла, и официальная страница прямо предупреждает: .cursorignore ограничивает доступ AI-функций, но terminal и MCP tools этим файлом не блокируются, а .cursorindexingignore исключает только из индекса. Поэтому защита секретов должна жить также в permissions, sandbox и самой системе секретов.
Search summary требует проверки. Если отдельный исследователь или subagent вернул список файлов, основной исполнитель должен открыть решающие фрагменты сам. Summary экономит контекст, но не является доказательством строки кода.
И бюджет: задайте max files, max output и вопрос остановки - достаточно ли найдено, чтобы назвать root cause и минимальный scope. Иначе поиск превращается в бесконечный обзор архитектуры.
Карта готова. Пора менять код - и хороший patch минимален и связен.