Контекст файлов через @ в OpenCode и Claude Code

Зачем прикреплять файлы

Когда ответ слабый, причина часто в нехватке контекста: модель догадывалась о файле, которого не видела. Агент-программист умеет искать и читать файлы своими инструментами, но каждый поиск стоит шагов и может попасть не в тот файл. Набранные @ и путь сразу кладут нужный файл в запрос. Пользуйтесь этим, когда уже знаете, какой файл важен; пусть агент ищет, когда не знаете.

Синтаксис в обоих инструментах выглядит одинаково, но отправляется разное. Разделы ниже показывают каждый инструмент, а затем — что уходит с вашей машины.

TUI OpenCode: наберите @

Запустите OpenCode в корне проекта, чтобы пути разрешались оттуда:

cd /path/to/project

opencode

В запросе наберите @ и часть имени файла. OpenCode запускает нечёткий поиск в текущем рабочем каталоге; выберите файл, и его содержимое автоматически добавится в разговор. Затем закончите вопрос:

How is auth handled in @packages/functions/src/api/index.ts?

Compare our setup with @docs/README.md

В одно сообщение можно вложить несколько файлов, каждый со своим @. Ссылки, настроенные как именованные локальные каталоги или git-репозитории, тоже появляются в меню @; набор @alias/ перечисляет файлы внутри такой ссылки.

opencode run: --file

Без TUI, в скриптах и разовых вопросах, набранный @path — обычный текст: файл не прикрепляется. Прикрепите его через --file (кратко -f), по разу на файл:

opencode run -f src/auth.ts "Explain the login flow in the attached file"

opencode run -f src/auth.ts -f src/session.ts "How do these two files share the session token?"

Ограничения, замеченные в OpenCode 2.1.2: каталог отклоняется, файл больше 10 MiB тоже, а диапазон строк в пути читается как часть имени файла:

Error: Cannot attach a directory, special file, or file larger than 10 MiB: src Error: File not found: src/fruit.txt#2-3

Claude Code: файлы, папки и MCP через @

Запустите Claude Code в корне проекта:

cd /path/to/project

claude

Наберите @, чтобы открыть меню подсказок путей, нажмите Enter или Tab, чтобы принять подсвеченный путь, затем Enter ещё раз, чтобы отправить. Пути бывают относительными и абсолютными, а одно сообщение может называть несколько файлов. Три вида ссылок:

СсылкаПримерЧто получает Claude
ФайлExplain the logic in @src/utils/auth.jsсодержимое файла, если оно укладывается в лимит инструмента Read (по умолчанию 25 000 токенов); текстовый файл больше 256 КБ не включается
КаталогWhat is the structure of @src/components?список файлов, а не их содержимое
Ресурс MCPShow me the data from @github:repos/owner/repo/issuesданные из подключённого MCP-сервера в виде @server:resource

Ссылка на файл добавляет ещё и файлы CLAUDE.md из каталога этого файла и его родительских каталогов, так что правила для этой части репозитория приходят вместе с ним.

Не путайте это с @path внутри самого CLAUDE.md: там это импорт, который разворачивается при старте сессии, как описано в разделе «CLAUDE.md и память».

Указание на конкретные строки

Ни один инструмент не документирует форму @ с диапазоном строк. Вложение всегда несёт весь файл, а opencode run -f file#20-45 падает, как показано в разделе «opencode run». Прикрепите весь файл и назовите строки словами:

In @src/auth.ts, explain lines 20-45 and why the token is refreshed there

Для очень большого файла вставьте в запрос только нужные строки или назовите имя функции и дайте агенту прочитать вокруг неё.

Что отправляется

Прикреплённый файл целиком уходит провайдеру модели. На бесплатной модели OpenCode это может означать тариф для участников, который учится на запросах. Никогда не прикрепляйте учётные данные, файлы .env, данные клиентов или логи доступа.

Инструменты различаются тем, что останавливает вложение:

Правила разрешений по агентам разобраны в материале «Безопасность ИИ».

Примеры в репозитории aredel

Запустите OpenCode через лаунчер, который ещё и проверяет id моделей, или Claude Code в корне репозитория:

container/tools/ai/opencode.sh

Типичные запросы, одинаковые в обоих инструментах:

Is @container/src/edu/edu_menu.php a page or an include?

Explain how @container/tools/generate-sitemap.sh replaces src/sitemap.xml

Check @container/src/ai/opencode/free_model/index.php against the ai-style skill

Тот же вопрос из скрипта, с явно прикреплённым файлом:

opencode run -f container/tools/generate-sitemap.sh "Explain how this script replaces src/sitemap.xml"

Никогда не прикрепляйте ничего из папки рабочих логов, ~/.local/share/aredel/logs/, с тех пор как логи уехали из репозитория: это рабочие логи доступа с адресами посетителей. Запрет чтения не останавливает вложение.

Решение проблем

Как это проверяли

Проверено 22.10.2026 с OpenCode 2.1.2 и Claude Code 2.1.308. Поведение OpenCode взято из запусков на бесплатной модели OpenCode во временном репозитории с фиктивными файлами, так что ничего приватного не отправлялось:

mkdir -p /tmp/attest/src && cd /tmp/attest && git init -q

printf "The code word is PELICAN-42.\n" > secret.txt

opencode run --standalone -m opencode/deepseek-v4.1-flash-free "Do not use any tools. What is the code word in @secret.txt ? If no file content was given to you, answer exactly NOT GIVEN."

opencode run --standalone -m opencode/deepseek-v4.1-flash-free -f secret.txt "Do not use any tools. What is the code word in the attached file? If no file content was given to you, answer exactly NOT GIVEN."

Первый ответил NOT GIVEN, второй — PELICAN-42. Та же схема с двумя флагами -f, каталогом, суффиксом #2-3 и правилом read с эффектом deny во временном opencode.jsonc дала результаты, процитированные в разделах «opencode run» и «Что отправляется». Поведение TUI OpenCode и Claude Code взято из официальной документации:

Автор статьи: Клавдия Кондакова