Контекст файлов через @ в 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? | список файлов, а не их содержимое |
| Ресурс MCP | Show 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, данные клиентов или логи доступа.
Инструменты различаются тем, что останавливает вложение:
- OpenCode: правило read с эффектом deny блокирует инструмент чтения агента, но не файл, который вы прикрепили сами. С правилом, запрещающим *secret*, инструмент чтения ответил Permission denied: read, а opencode run -f secret.txt всё равно отправил файл. Единственная защита — не прикреплять его.
- Claude Code: правило Read с эффектом deny останавливает и ссылку @ от включения файла. Переменная CLAUDE_CODE_DISABLE_FILE_MENTIONS=1 в оболочке или в блоке env пользовательских либо управляемых настроек не даёт @ включать какое-либо содержимое; тогда Claude получает только пути. Нужен Claude Code 2.1.299 или новее, в проектных настройках переменная игнорируется.
- Хуки: хуки PreToolUse Claude Code не срабатывают на ссылку @, потому что включение файла — не вызов инструмента. Не полагайтесь на хук в защите того, что прикрепляется.
Правила разрешений по агентам разобраны в материале «Безопасность ИИ».
Примеры в репозитории 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/, с тех пор как логи уехали из репозитория: это рабочие логи доступа с адресами посетителей. Запрет чтения не останавливает вложение.
Решение проблем
- Модель говорит, что не получила файл в opencode run: набранный @path там не прикрепляется; используйте -f path.
- File not found при # в пути: диапазоны строк не поддерживаются; прикрепите файл и назовите строки в запросе.
- Cannot attach a directory: прикрепляйте нужные файлы по одному или в Claude Code укажите папку ради списка.
- После @ нет подсказок путей: сессия начата вне проекта; перезапустите её в корне проекта.
- Большой файл не включён в Claude Code: он превышает лимит инструмента Read или 256 КБ; назовите функцию или вставьте строки.
- Ответ всё ещё слабый с прикреплённым файлом: модели не хватает соседей, а не файла; прикрепите вызывающий код или тест либо повышайте модель, как в разделе «Рабочие приёмы».
Как это проверяли
Проверено 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 взято из официальной документации:
- opencode.ai/docs/tui (ссылки на файлы)
- code.claude.com/docs/en/common-workflows (ссылки на файлы и каталоги)
Автор статьи: Клавдия Кондакова