MODULE_03 · УРОК 3.4

Контекст проекта

Harness у вас один, а проекты разные: где-то pytest, где-то uv run test, где-то «не трогай migrations». Можно пытаться угадать, а можно просто положить в репо файл AGENTS.md - как записку коллеге. При старте harness его прочитает и вклеит в системный промпт.

ЧТО ПОЛУЧИТСЯ В main.py: если в cwd есть AGENTS.md - читаем и передаём в build_system_prompt(..., project_context=...). Нет файла — работаем как раньше, без ошибки.

Слова по делу

  • AGENTS.md — markdown в корне проекта с локальными правилами: команды, архитектура, «не делай вот это». Тот же трюк, что .cursorrules / CLAUDE.md, только имя общее для агентов.
  • project_context — ключ в вашем PromptContext: сюда кладём текст файла.

Быстрый путь

  1. В main.py перед сборкой промпта проверить cwd / "AGENTS.md".
  2. Если есть — прочитать utf-8 и передать как project_context.
  3. Положить тестовый AGENTS.md и спросить агента про команду тестов.

Какие файлы трогаем

Файл Что делать
main.py Править. Чтение AGENTS.md + передача в билдер.
prompts.py Уже умеет project_context (урок 3.2). Если вырезали — верните блок.
AGENTS.md в cwd проекта Создать для проверки (можно временный).

Шаг 1. Чтение файла в main.py

Прямо перед build_system_prompt(...):

main.py — фрагмент

from pathlib import Path
from prompts import build_system_prompt

agents_path = cwd / "AGENTS.md"
project_context = (
    agents_path.read_text(encoding="utf-8")
    if agents_path.is_file()
    else None
)

instructions = build_system_prompt({
    "working_directory": str(cwd),
    "sandbox_type": "local",
    "tool_names": ["read", "grep", "bash"],
    **({"project_context": project_context} if project_context else {}),
})

Всё. Плагинов нет. Известное имя файла в корне — convention over configuration, как любят ленивые (то есть опытные) инженеры.

ЕСЛИ НЕТ СЕКЦИИ В prompts.py В build_system_prompt должен быть кусок из урока 3.2:
if project := ctx.get("project_context"):
    parts.append(f"""
# Инструкции проекта (из AGENTS.md)
{project}
""")
Без него файл прочитаете, а модель не увидит.

Шаг 2. Что писать в AGENTS.md

Только то, чего harness сам из кода не выведет:

AGENTS.md — пример

# Инструкции проекта

## Команды
- Тесты: `uv run pytest`
- Не использовать `npm test` — это не Node-проект

## Стиль
- Коммиты: `feat(scope): message`

## Грабли
- Не править файлы миграций руками — только генерировать новые

Проверьте

Положите такой файл в каталог, который передаёте первым аргументом (.), затем:

uv run python main.py . "Какой командой в этом проекте гонять тесты?"

С файлом агент должен ответить про uv run pytest (потому что так написано), а не угадать npm test.

Переименуйте / уберите AGENTS.md и спросите снова — harness не падает, ответ снова «на глаз».

ПОКА ОДИН ФАЙЛ В монорепах ходят вверх по дереву и мержат несколько AGENTS.md. Мы этого не делаем: один файл в cwd закрывает идею. Хождение по родителям — когда дорастёте до Module 4 / боли.

Готово, если:

  • В main.py проверяется наличие cwd/AGENTS.md
  • Содержимое (если есть) уходит в project_context
  • С файлом агент отвечает на вопрос о тестах по AGENTS.md
  • Без файла агент стартует без ошибки
ЭКСПЕРИМЕНТ Напишите в AGENTS.md заведомую чушь («тесты запускаются командой make coffee»). Спросите агента. Если послушно цитирует бред — инъекция работает. Потом верните нормальный файл, пока коллеги не увидели.