Участие в разработке
Pull request'ы приветствуются, и ждать приглашения не нужно. Это маленький проект; полезное обычно не большая функция, а строка в таблице, фраза в переводе или сообщение об ошибке, достаточно подробное, чтобы по нему можно было действовать.
Самые полезные вклады
Строка в таблице моделей. Проверка модели — фиксированная пятиминутная задача. Таблица короткая, потому что в ней только те модели, которые кто-то запускал, а отрицательный результат стоит столько же, сколько положительный: о модели, которая не сработала, никто не пишет, поэтому её открывает заново каждый.
Перевод — или одна строка исправления в нём. Их десять. Любой можно исправлять по фразе, не трогая остального — см. Языки. Новый язык — это один файл JSON.
Сообщение об ошибке с четырьмя вещами. Модель и поставщик, записанные точно
(qwen3-coder:30b на Ollama, а не «локальная модель»), о чём вы попросили, что
произошло, и пятьдесят строк из ~/.opencli/log вокруг сбоя. Перед вставкой
просмотрите эти строки на предмет ключей.
Рассказать нам, что вы на самом деле хотели сделать. Встроенные отделы и навыки написаны из догадок о том, что людям нужно. То, за чем вы потянулись и чего не нашли, — самое полезное, что вы можете сказать.
Прежде чем писать код
Для всего крупнее одной правки сначала откройте issue. Не как шлагбаум — а чтобы договориться о подходе прежде, чем вы потратите на него вечер. PR, пришедший без issue за спиной, всё равно будет прочитан.
Настройка окружения
Rust и pnpm; рабочее пространство — opencli-rs/, веб-интерфейс — web/,
настольная оболочка — desktop/.
git clone https://github.com/ai-dashboad/opencli
cd opencli
pnpm install
cargo build -p opencli-cli
just из корня репозитория запускает вспомогательные команды рабочего
пространства; just help их перечисляет.
Прежде чем открывать PR
just fmt
just fix -p <crate>
cargo test -p <crate>
Не запускайте голый cargo fmt. Дерево отформатировано с
imports_granularity=Item, а это опция только для nightly. На stable она
молча игнорируется, поэтому cargo fmt перепишет блок импортов почти в
каждом файле рабочего пространства и похоронит вашу правку под сотнями
посторонних диффов. just fmt вызывает nightly именно поэтому. Без
nightly-тулчейна (rustup toolchain install nightly) форматируйте только те
файлы, которых касались, а остальное пусть подтвердит CI.
Если вы трогали веб-интерфейс, python3 scripts/i18n-check.py находит
английский, который так и не обернули для перевода, включая случаи, которые
легко пропустить: текст, разрезанный строчным тегом, и подписи, собираемые в
момент импорта.
Что делает PR лёгким для слияния
- Одно дело. Несвязанные правки — отдельными PR.
- Тест, который падает до вашей правки и проходит после. Не полное покрытие — одно утверждение, которое поймало бы эту ошибку.
- Каждый коммит собирается. Именно это делает возможными ревью и откат.
- Документация, если поведение изменилось. README,
opencli --helpили та страница здесь, которая теперь неверна. - Что, зачем и как в описании. Именно зачем по диффу не прочитать.
Никакого CLA
Подписывать нечего. Вклады идут под Apache-2.0, как и всё остальное дерево.
Сообщить об уязвимости
Не открывайте публичный issue из-за уязвимости. Воспользуйтесь формой закрытого уведомления на GitHub: она доходит до сопровождающих, ничего не публикуя.
Больше всего внимания заслуживают: политика песочницы, путь подтверждений и всё, что решает, к чему вызову инструмента позволено прикасаться. У агента, который читает ваши файлы и выполняет команды на вашей машине, большая поверхность, и лучше, чтобы её нашли вы, а не кто-то другой.
По-человечески
Относитесь к людям с уважением; мы следуем Contributor Covenant. Предполагайте добрые намерения — письменное общение даётся трудно, ошибайтесь в сторону великодушия. Если что-то сбивает с толку, это само по себе стоит issue: сбивающая с толку документация — это ошибка в документации.