Compare commits
7 Commits
e98e4ca9ae
...
295f620710
| Author | SHA1 | Date | |
|---|---|---|---|
| 295f620710 | |||
| e04a2ddb72 | |||
| 489a63be69 | |||
| 6521d9c431 | |||
| c2cdf40cad | |||
| e6903f8b13 | |||
| a6a4d4fee3 |
@@ -17,11 +17,15 @@ curl -fsSL https://git.codelab.vc/ai/pi-kit/-/raw/main/install.sh | bash
|
||||
```
|
||||
|
||||
Скрипт проверит Node.js (>= 20), поставит Pi (если нет), установит этот пакет, **спросит
|
||||
твой профиль**, поставит нужные скилы и подскажет, какие переменные окружения нужны
|
||||
(ключ вашего LLM-провайдера, `TRACKER_URL`, `JIRA_TOKEN`).
|
||||
твой профиль**, поставит нужные скилы и **интерактивно настроит окружение** (`TRACKER_URL`,
|
||||
`JIRA_TOKEN`, `GITLAB_TOKEN`, ключ LLM-провайдера). Секреты вводятся скрыто и сохраняются в
|
||||
`~/.config/pi-kit/env.sh` (`chmod 600`), который подключается из твоего `~/.zshrc`/`~/.bashrc`.
|
||||
Pi провайдер-агностичен — модель/провайдера пакет не навязывает, каждый выбирает свой
|
||||
(Anthropic, OpenAI, OpenRouter, …).
|
||||
|
||||
Пропустить интерактивную настройку окружения: `PI_KIT_SETUP_ENV=0`. Значения потом можно
|
||||
поменять прямо в `~/.config/pi-kit/env.sh` или перезапустив `./install.sh`.
|
||||
|
||||
Профиль можно задать заранее (для CI/неинтерактивной установки):
|
||||
|
||||
```bash
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"gitHost": "git.codelab.vc",
|
||||
"trackerUrl": "TODO",
|
||||
"docsUrl": "TODO",
|
||||
"gitHost": "gitlab.tech.mvideo.ru",
|
||||
"trackerUrl": "https://jira.mvideo.ru",
|
||||
"docsUrl": "https://wiki.mvideo.ru",
|
||||
"repoMap": "TODO: где какой код лежит",
|
||||
"rules": [
|
||||
"не коммитить секреты",
|
||||
|
||||
@@ -22,10 +22,12 @@ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
||||
const DANGEROUS_PATTERNS: Array<{ re: RegExp; reason: string }> = [
|
||||
{ re: /\brm\s+(-\w*r\w*f|-\w*f\w*r|--recursive)/i, reason: "recursive force delete (rm -rf)" },
|
||||
{ re: /\bgit\s+push\b[^\n]*(--force\b|--force-with-lease\b|\s-f\b)/i, reason: "force push" },
|
||||
{
|
||||
re: /\bgit\s+push\b[^\n]*\b(main|master|release\/[^\s]+)\b/i,
|
||||
reason: "push to a protected branch (main/master/release/*)",
|
||||
},
|
||||
{ re: /\bgit\s+push\b[^\n]*\b(main|master)\b/i, reason: "push to main/master" },
|
||||
// Deploy convention: a `release-*` branch push deploys to STAGE, and a `v*`
|
||||
// tag push deploys to PROD. Guard both the branch and the tag pushes.
|
||||
{ re: /\bgit\s+push\b[^\n]*\brelease[-/]\S+/i, reason: "push to a release-* branch (deploys to stage)" },
|
||||
{ re: /\bgit\s+push\b[^\n]*(--tags\b|--follow-tags\b)/i, reason: "push tags (a v* tag deploys to PROD)" },
|
||||
{ re: /\bgit\s+push\b[^\n]*\sv\d[\w.-]*/i, reason: "push a v* version tag (deploys to PROD)" },
|
||||
{
|
||||
re: /\bkubectl\b[^\n]*(--context[=\s]?\S*prod|--namespace[=\s]?\S*prod|\bctx-prod\b)/i,
|
||||
reason: "kubectl against a production context/namespace",
|
||||
|
||||
132
install.sh
132
install.sh
@@ -187,10 +187,17 @@ if [ "${#PROFILE_PUBLIC[@]}" -gt 0 ]; then
|
||||
done
|
||||
fi
|
||||
|
||||
# --- 7. Provider API keys ---------------------------------------------------
|
||||
# Pi is provider-agnostic: engineers use different LLM providers (Anthropic,
|
||||
# OpenAI, OpenRouter, Google, ...). The package does NOT pin a provider/model.
|
||||
# We only check that *some* provider key is present and hint if none is.
|
||||
# --- 7. Environment (URLs + secrets) ---------------------------------------
|
||||
# Interactive setup: prompts (via /dev/tty so it works under curl | bash),
|
||||
# stores chosen values in ~/.config/pi-kit/env.sh (chmod 600) and sources it
|
||||
# from the shell rc. Secrets are read hidden and never echoed/logged.
|
||||
# URLs have no package default yet (config/company.json is filled by maintainers);
|
||||
# the current value is offered as the default. Skip with PI_KIT_SETUP_ENV=0.
|
||||
CONFIG_DIR="$HOME/.config/pi-kit"
|
||||
ENV_FILE="$CONFIG_DIR/env.sh"
|
||||
RC_MARK=">>> pi-kit >>>"
|
||||
|
||||
# Which provider key (if any) is already present in the environment.
|
||||
PROVIDER_KEYS=(ANTHROPIC_API_KEY OPENAI_API_KEY OPENROUTER_API_KEY GEMINI_API_KEY GOOGLE_API_KEY GROQ_API_KEY)
|
||||
found_key=""
|
||||
for k in "${PROVIDER_KEYS[@]}"; do
|
||||
@@ -199,21 +206,109 @@ for k in "${PROVIDER_KEYS[@]}"; do
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -n "$found_key" ]; then
|
||||
info "Найден ключ LLM-провайдера: ${found_key} — ок."
|
||||
else
|
||||
warn "Не найден ни один ключ LLM-провайдера."
|
||||
cat <<'EOF'
|
||||
Pi работает с разными провайдерами — выбери свой и задай ключ, например:
|
||||
export ANTHROPIC_API_KEY="..." # Anthropic
|
||||
export OPENAI_API_KEY="..." # OpenAI
|
||||
export OPENROUTER_API_KEY="..." # OpenRouter
|
||||
Провайдер и модель выбираются флагами --provider/--model или в настройках Pi
|
||||
(см. `pi --list-models`) — пакет их не навязывает.
|
||||
|
||||
Для скилла работы с трекером также понадобятся:
|
||||
export TRACKER_URL="..." # адрес Jira (или возьмётся из корп. контекста)
|
||||
export JIRA_TOKEN="..." # Jira personal access token (Server/DC)
|
||||
detect_rc() {
|
||||
case "$(basename "${SHELL:-}")" in
|
||||
zsh) echo "$HOME/.zshrc" ;;
|
||||
bash) echo "$HOME/.bashrc" ;;
|
||||
*) echo "$HOME/.profile" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Escape a value for safe embedding inside single quotes.
|
||||
esc_sq() { printf "%s" "$1" | sed "s/'/'\\\\''/g"; }
|
||||
|
||||
env_setup_interactive() {
|
||||
info "Настройка окружения — значения сохранятся в ${ENV_FILE} (chmod 600)."
|
||||
# Load previously stored values so re-runs keep them as defaults.
|
||||
# shellcheck disable=SC1090
|
||||
[ -f "$ENV_FILE" ] && . "$ENV_FILE" || true
|
||||
|
||||
local tracker="${TRACKER_URL:-}" jira="${JIRA_TOKEN:-}" gitlab="${GITLAB_TOKEN:-}" ans=""
|
||||
|
||||
# TRACKER_URL (not a secret): visible prompt, current value as default.
|
||||
printf 'TRACKER_URL (адрес Jira)%s: ' "${tracker:+ [${tracker}]}" >/dev/tty
|
||||
read -r ans </dev/tty || ans=""
|
||||
[ -n "$ans" ] && tracker="$ans"
|
||||
|
||||
# JIRA_TOKEN (secret): hidden input; empty keeps the current value.
|
||||
printf 'JIRA_TOKEN (скрытый ввод, Enter — оставить как есть): ' >/dev/tty
|
||||
read -rs ans </dev/tty || ans=""
|
||||
printf '\n' >/dev/tty
|
||||
[ -n "$ans" ] && jira="$ans"
|
||||
|
||||
# GITLAB_TOKEN (secret, для create-mr.sh): hidden input.
|
||||
printf 'GITLAB_TOKEN (скрытый ввод, Enter — пропустить): ' >/dev/tty
|
||||
read -rs ans </dev/tty || ans=""
|
||||
printf '\n' >/dev/tty
|
||||
[ -n "$ans" ] && gitlab="$ans"
|
||||
|
||||
# LLM provider key — only ask if none is already set.
|
||||
local prov_name="" prov_val=""
|
||||
if [ -z "$found_key" ]; then
|
||||
printf 'LLM-провайдер: 1) anthropic 2) openai 3) openrouter 4) пропустить [1-4]: ' >/dev/tty
|
||||
read -r ans </dev/tty || ans=""
|
||||
case "$ans" in
|
||||
1 | anthropic) prov_name=ANTHROPIC_API_KEY ;;
|
||||
2 | openai) prov_name=OPENAI_API_KEY ;;
|
||||
3 | openrouter) prov_name=OPENROUTER_API_KEY ;;
|
||||
*) prov_name="" ;;
|
||||
esac
|
||||
if [ -n "$prov_name" ]; then
|
||||
printf '%s (скрытый ввод): ' "$prov_name" >/dev/tty
|
||||
read -rs prov_val </dev/tty || prov_val=""
|
||||
printf '\n' >/dev/tty
|
||||
fi
|
||||
fi
|
||||
|
||||
# Write env file with restrictive permissions (umask 077 => 600).
|
||||
mkdir -p "$CONFIG_DIR"
|
||||
(
|
||||
umask 077
|
||||
{
|
||||
echo "# Managed by pi-kit install.sh — не коммить. chmod 600, plaintext."
|
||||
[ -n "$tracker" ] && echo "export TRACKER_URL='$(esc_sq "$tracker")'"
|
||||
[ -n "$jira" ] && echo "export JIRA_TOKEN='$(esc_sq "$jira")'"
|
||||
[ -n "$gitlab" ] && echo "export GITLAB_TOKEN='$(esc_sq "$gitlab")'"
|
||||
[ -n "$prov_name" ] && [ -n "$prov_val" ] && echo "export ${prov_name}='$(esc_sq "$prov_val")'"
|
||||
} >"$ENV_FILE"
|
||||
)
|
||||
chmod 600 "$ENV_FILE"
|
||||
info "Сохранено: ${ENV_FILE}"
|
||||
|
||||
# Ensure the shell rc sources the env file (managed block, idempotent).
|
||||
local rc
|
||||
rc="$(detect_rc)"
|
||||
if [ -f "$rc" ] && grep -qF "$RC_MARK" "$rc" 2>/dev/null; then
|
||||
info "Подключение уже есть в ${rc}."
|
||||
else
|
||||
{
|
||||
echo ""
|
||||
echo "# ${RC_MARK}"
|
||||
echo '[ -f "$HOME/.config/pi-kit/env.sh" ] && . "$HOME/.config/pi-kit/env.sh"'
|
||||
echo "# <<< pi-kit <<<"
|
||||
} >>"$rc"
|
||||
info "Добавил подключение в ${rc}. Применить сейчас: source ${rc}"
|
||||
fi
|
||||
warn "Токены лежат в ${ENV_FILE} (chmod 600, plaintext). Для строгих требований — секрет-менеджер."
|
||||
}
|
||||
|
||||
if [ "${PI_KIT_SETUP_ENV:-1}" != 0 ] && [ -r /dev/tty ]; then
|
||||
env_setup_interactive
|
||||
else
|
||||
# Non-interactive fallback: just check for a provider key and print guidance.
|
||||
if [ -n "$found_key" ]; then
|
||||
info "Найден ключ LLM-провайдера: ${found_key} — ок."
|
||||
else
|
||||
warn "Не найден ключ LLM-провайдера (установка неинтерактивная — пропускаю настройку)."
|
||||
fi
|
||||
cat <<'EOF'
|
||||
Задай нужные переменные вручную (например, в ~/.config/pi-kit/env.sh):
|
||||
export ANTHROPIC_API_KEY="..." # или OPENAI_API_KEY / OPENROUTER_API_KEY
|
||||
export TRACKER_URL="..." # адрес Jira (Server/DC)
|
||||
export JIRA_TOKEN="..." # Jira personal access token
|
||||
export GITLAB_TOKEN="..." # для создания MR (scripts/create-mr.sh)
|
||||
Провайдер/модель — флагами --provider/--model или в настройках Pi (пакет не навязывает).
|
||||
EOF
|
||||
fi
|
||||
|
||||
@@ -225,6 +320,7 @@ cat <<EOF
|
||||
|
||||
Запуск: pi
|
||||
Обновление: pi update --extensions
|
||||
Окружение: ${ENV_FILE} (TRACKER_URL/JIRA_TOKEN/GITLAB_TOKEN/ключ провайдера)
|
||||
Сменить профиль: PI_KIT_PROFILE=backend ./install.sh (или перезапусти и выбери)
|
||||
Команды: /bugfix <тикет> /feature <тикет>
|
||||
/review [фокус] /rfc <тема> /kit-config
|
||||
|
||||
@@ -7,7 +7,7 @@ description: Используй при написании, ревью и про
|
||||
|
||||
Наш основной стек — **Go**. Скилл описывает, как писать, проверять и оформлять код.
|
||||
Реалистичные общепринятые дефолты приведены ниже; то, что специфично для компании,
|
||||
помечено `TODO` — уточняй, не выдумывай.
|
||||
заполнено дефолтами индустрии — тюним под M.Video позже.
|
||||
|
||||
## Структура сервиса
|
||||
|
||||
@@ -21,7 +21,7 @@ pkg/ # переиспользуемый публичный
|
||||
api/ # спецификации API (proto/openapi)
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой сервиса компании -->
|
||||
> Ориентир по индустрии: `cmd/` + `internal/` + `pkg/`. Эталон под M.Video уточним позже.
|
||||
|
||||
## Линтеры
|
||||
|
||||
@@ -29,19 +29,23 @@ api/ # спецификации API (proto/openapi)
|
||||
- Статический анализ: `go vet ./...`.
|
||||
- Основной линтер: **golangci-lint** — `golangci-lint run ./...`.
|
||||
Набор линтеров задаётся в `.golangci.yml` в корне репозитория.
|
||||
<!-- TODO: указать корпоративный .golangci.yml / общий пресет, если он есть -->
|
||||
Базовый набор: `govet`, `staticcheck`, `errcheck`, `ineffassign`, `gosimple`, `unused`.
|
||||
Корпоративный `.golangci.yml` добавим позже.
|
||||
|
||||
## Тесты
|
||||
|
||||
- Прогон всех тестов: `go test ./...`.
|
||||
- С гонками и покрытием: `go test -race -cover ./...`.
|
||||
- Требования к покрытию и обязательные виды тестов: `<!-- TODO: пороги покрытия, интеграционные тесты -->`.
|
||||
- Покрытие: мягкий ориентир ~70%+ для бизнес-логики, критичные пути — обязательно;
|
||||
интеграционные тесты для внешних зависимостей. (пороги уточним)
|
||||
- Именование: `TestXxx`, табличные тесты приветствуются.
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits (feat:, fix:, chore:) или свой -->`.
|
||||
- **Ветки:** от основной, именование `<!-- TODO: напр. feature/PROJ-123-short-desc -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- **Описание MR:** что и зачем изменено, как проверено (линтеры + тесты), ссылка на тикет
|
||||
|
||||
@@ -52,16 +52,17 @@ GITLAB_TOKEN=... ./scripts/create-mr.sh "Fix PROJ-123: NPE" main "" PROJ-123
|
||||
|
||||
Флаги окружения `create-mr.sh`: `GITLAB_TOKEN` (обязателен), `GITLAB_HOST` (override хоста),
|
||||
`MR_PUSH=0` (не пушить ветку), `MR_DRY_RUN=1` (показать запрос без вызова API).
|
||||
MR из защищённой ветки (`main`/`master`/`release/*`) скрипт создавать откажется.
|
||||
MR из защищённой/релизной ветки (`main`/`master`/`release-*`) скрипт создавать откажется.
|
||||
|
||||
## Соглашения
|
||||
|
||||
<!-- TODO: заполнить реальными значениями компании -->
|
||||
|
||||
- **Формат ключей задач:** `<!-- TODO: например PROJ-123, префиксы проектов -->`
|
||||
- **Статусы и переходы:** `<!-- TODO: рабочий процесс, напр. To Do → In Progress → In Review → Done -->`
|
||||
- **Кто и когда меняет статус:** `<!-- TODO: договорённости команды -->`
|
||||
- **Что писать в комментарии при старте/готовности:** `<!-- TODO -->`
|
||||
- **Формат ключей задач:** вида `PROJ-123` (буквенный префикс проекта + номер).
|
||||
`<!-- TODO: перечислить реальные префиксы проектов -->`
|
||||
- **Статусы и переходы:** To Do → In Progress → Review → Done.
|
||||
- **Кто и когда меняет статус:** разработчик переводит тикет: в **In Progress** — при старте работы;
|
||||
в **Review** — при выставлении MR (в тикет добавляется ссылка на MR); в **Done** — после мержа.
|
||||
- **Что писать в комментарии:** при старте — кратко о начале работы; при готовности — ссылку на MR
|
||||
(используй `create-mr.sh`, который сразу приложит ссылку, либо `link-mr.sh`).
|
||||
|
||||
## Полезное
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ JIRA_KEY="${4:-}"
|
||||
|
||||
# --- Refuse to open an MR *from* a protected branch (safety). ----------------
|
||||
case "$SOURCE" in
|
||||
main | master | release/*)
|
||||
echo "Refusing: source branch '$SOURCE' looks protected. Create a feature branch first." >&2
|
||||
main | master | release-* | release/*)
|
||||
echo "Refusing: source branch '$SOURCE' looks protected/release. Create a feature branch first." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Используй при написании, ревью и про
|
||||
# Стандарты Kotlin
|
||||
|
||||
Один из наших языков — **Kotlin** (в первую очередь Android). Ниже — общепринятые дефолты
|
||||
экосистемы; специфичное для компании помечено `TODO` — уточняй, не выдумывай.
|
||||
экосистемы; специфичное для компании заполнено дефолтами индустрии — тюним под M.Video позже.
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -22,20 +22,20 @@ app/ # Android-модуль приложения
|
||||
<feature-module>/ # модульная структура
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой проекта/модулей и версией AGP/Gradle -->
|
||||
> Ориентир: модульный Android-проект на Gradle (Kotlin DSL), актуальные AGP/Gradle. Эталон уточним.
|
||||
|
||||
## Линтеры и форматирование
|
||||
|
||||
- Стиль/формат: **ktlint** — `./gradlew ktlintCheck` (автоформат `./gradlew ktlintFormat`).
|
||||
- Статический анализ: **detekt** — `./gradlew detekt` (конфиг `detekt.yml`).
|
||||
- Android Lint: `./gradlew lint`.
|
||||
<!-- TODO: корпоративные конфиги ktlint/detekt (общий пресет), если есть -->
|
||||
Дефолт: ktlint (official code style) + стартовый `detekt.yml`. Корпоративный пресет добавим позже.
|
||||
|
||||
## Тесты
|
||||
|
||||
- Unit: `./gradlew test`.
|
||||
- Инструментальные (Android): `./gradlew connectedAndroidTest` (нужен эмулятор/устройство).
|
||||
- Требования к покрытию / обязательные виды тестов: `<!-- TODO -->`.
|
||||
- Покрытие: замер через JaCoCo, мягкий ориентир; критичную логику — обязательно. (пороги уточним)
|
||||
|
||||
## Сборка и зависимости
|
||||
|
||||
@@ -44,7 +44,10 @@ app/ # Android-модуль приложения
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits или свой -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- Перед MR: `ktlintCheck`, `detekt`, `test` (и `lint`) — всё зелёное.
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Используй при написании, ревью и про
|
||||
# Стандарты Python
|
||||
|
||||
Один из наших языков — **Python**. Ниже — общепринятые дефолты экосистемы; специфичное для
|
||||
компании помечено `TODO` — уточняй, не выдумывай.
|
||||
компании заполнено дефолтами индустрии — тюним под M.Video позже.
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -19,28 +19,32 @@ src/<package>/ # src-layout
|
||||
tests/
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой / шаблоном (менеджер: poetry/uv/pip-tools?) -->
|
||||
> Ориентир: src-layout, `pyproject.toml`, окружение через uv. Эталон уточним.
|
||||
|
||||
## Линтеры и форматирование
|
||||
|
||||
- Линтер + форматтер: **ruff** — `ruff check .` и `ruff format --check .`
|
||||
(локально `ruff format .`). Конфиг — в `pyproject.toml` (`[tool.ruff]`).
|
||||
- Типы: **mypy** — `mypy .` (конфиг `[tool.mypy]`).
|
||||
<!-- TODO: корпоративный набор правил ruff/mypy (строгость), если есть -->
|
||||
Дефолт: ruff (правила `E`,`F`,`I`,`UP`,`B`) + mypy строгий для нового кода. Корпоративный пресет уточним.
|
||||
|
||||
## Тесты
|
||||
|
||||
- Прогон: **pytest** — `pytest` (с покрытием — `pytest --cov`).
|
||||
- Требования к покрытию / обязательные виды тестов: `<!-- TODO -->`.
|
||||
- Покрытие: `uv run pytest --cov`, мягкий ориентир ~80% для бизнес-логики. (пороги уточним)
|
||||
|
||||
## Окружение и зависимости
|
||||
|
||||
- Менеджер зависимостей и lock: `<!-- TODO: poetry / uv / pip-tools -->` — lock коммитим.
|
||||
- Виртуальное окружение — обязательно; глобально пакеты не ставим.
|
||||
- Менеджер зависимостей: **uv** — `uv sync` (установка), `uv add <pkg>`; lock `uv.lock` коммитим.
|
||||
- Команды запускай через `uv run …` (напр. `uv run pytest`, `uv run ruff check .`, `uv run mypy .`).
|
||||
- Виртуальное окружение (`.venv`) создаёт uv; глобально пакеты не ставим.
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits или свой -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- Перед MR: `ruff check .`, `ruff format --check .`, `mypy .`, `pytest` — всё зелёное.
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Используй при написании, ревью и про
|
||||
# Стандарты Rust
|
||||
|
||||
Один из наших языков — **Rust**. Ниже — общепринятые дефолты экосистемы; специфичное для
|
||||
компании помечено `TODO` — уточняй, не выдумывай.
|
||||
компании заполнено дефолтами индустрии — тюним под M.Video позже.
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -21,20 +21,20 @@ tests/ # интеграционные тесты
|
||||
benches/ # бенчмарки (если есть)
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой crate/workspace компании -->
|
||||
> Ориентир: стандартный cargo-лейаут (`src/`, `tests/`), workspace при нескольких crate. Эталон уточним.
|
||||
|
||||
## Линтеры и форматирование
|
||||
|
||||
- Форматирование: `cargo fmt --all` (проверка в CI — `cargo fmt --all -- --check`).
|
||||
- Линтер: **clippy** — `cargo clippy --all-targets --all-features -- -D warnings`.
|
||||
Настройки — в `clippy.toml` / атрибутах crate.
|
||||
<!-- TODO: корпоративный набор clippy-lints, если есть -->
|
||||
Дефолт: clippy с `-D warnings`; точечные `allow` — только с комментарием. Корпоративный набор уточним.
|
||||
|
||||
## Тесты
|
||||
|
||||
- Прогон: `cargo test --all-features`.
|
||||
- Для workspace: `cargo test --workspace`.
|
||||
- Требования к покрытию / обязательные виды тестов: `<!-- TODO -->`.
|
||||
- Покрытие: `cargo-llvm-cov` (или tarpaulin), мягкий ориентир ~70%+. (пороги уточним)
|
||||
|
||||
## Сборка и зависимости
|
||||
|
||||
@@ -44,7 +44,10 @@ benches/ # бенчмарки (если есть)
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits или свой -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- Перед MR: `cargo fmt --check`, `cargo clippy -D warnings`, `cargo test` — всё зелёное.
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Используй при написании, ревью и про
|
||||
# Стандарты Swift
|
||||
|
||||
Один из наших языков — **Swift** (iOS/macOS). Ниже — общепринятые дефолты экосистемы;
|
||||
специфичное для компании помечено `TODO` — уточняй, не выдумывай.
|
||||
значения под M.Video заполнены дефолтами индустрии — тюним позже.
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -18,28 +18,31 @@ Sources/<Target>/...
|
||||
Tests/<Target>Tests/...
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой (SwiftPM vs Xcodeproj, менеджер зависимостей: SPM/CocoaPods) -->
|
||||
> Ориентир: SwiftPM-пакет (`Package.swift`), `Sources/` + `Tests/`. Эталон уточним.
|
||||
|
||||
## Линтеры и форматирование
|
||||
|
||||
- Форматирование: **swiftformat** — `swiftformat --lint .` (автоформат `swiftformat .`).
|
||||
- Линтер: **swiftlint** — `swiftlint` (конфиг `.swiftlint.yml`), в CI `swiftlint --strict`.
|
||||
<!-- TODO: корпоративные конфиги swiftformat/swiftlint (общий пресет), если есть -->
|
||||
Дефолт: SwiftLint + SwiftFormat (дефолтные конфиги). Корпоративный пресет уточним.
|
||||
|
||||
## Тесты
|
||||
|
||||
- SwiftPM: `swift test`.
|
||||
- Xcode-проект: `xcodebuild test -scheme <Scheme> -destination 'platform=iOS Simulator,name=iPhone 15'`.
|
||||
- Требования к покрытию / обязательные виды тестов: `<!-- TODO -->`.
|
||||
- Покрытие: `swift test --enable-code-coverage`, мягкий ориентир. (пороги уточним)
|
||||
|
||||
## Сборка и зависимости
|
||||
|
||||
- Сборка: `swift build` (или `xcodebuild build -scheme <Scheme>`).
|
||||
- Зависимости: `<!-- TODO: SwiftPM / CocoaPods -->` — lock (`Package.resolved`/`Podfile.lock`) коммитим.
|
||||
- Зависимости: **SwiftPM** (`Package.resolved` коммитим); CocoaPods — только для легаси.
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits или свой -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- Перед MR: `swiftformat --lint .`, `swiftlint --strict`, тесты — всё зелёное.
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Используй при написании, ревью и про
|
||||
# Стандарты TypeScript
|
||||
|
||||
Один из наших языков — **TypeScript** (фронтенд и Node-сервисы). Ниже — общепринятые дефолты
|
||||
экосистемы; специфичное для компании помечено `TODO` — уточняй, не выдумывай.
|
||||
экосистемы; значения под M.Video заполнены дефолтами индустрии — тюним позже.
|
||||
|
||||
## Структура
|
||||
|
||||
@@ -21,28 +21,31 @@ src/
|
||||
test/ | *.test.ts # рядом с кодом или в test/
|
||||
```
|
||||
|
||||
<!-- TODO: заполнить реальной эталонной структурой / шаблоном проекта (менеджер пакетов: npm/pnpm/yarn?) -->
|
||||
> Ориентир: TS-проект/монорепо на pnpm workspaces, strict `tsconfig`. Эталон уточним.
|
||||
|
||||
## Линтеры и форматирование
|
||||
|
||||
- Типы: `tsc --noEmit` — без ошибок типов.
|
||||
- Линтер: **ESLint** — `eslint .` (конфиг `.eslintrc*` / `eslint.config.*`).
|
||||
- Форматирование: **Prettier** — `prettier --check .` (в CI), `prettier --write .` локально.
|
||||
<!-- TODO: корпоративный конфиг eslint/prettier (общий пресет?), если есть -->
|
||||
Дефолт: typescript-eslint (recommended) + Prettier (дефолтный конфиг). Корпоративный пресет уточним.
|
||||
|
||||
## Тесты
|
||||
|
||||
- Прогон: `<!-- TODO: vitest / jest / node --test -->` — напр. `npm test`.
|
||||
- Требования к покрытию: `<!-- TODO -->`.
|
||||
- Прогон: **vitest** — `pnpm test` (покрытие `pnpm test --coverage`).
|
||||
- Покрытие: мягкий ориентир ~80% для бизнес-логики. (пороги уточним)
|
||||
|
||||
## Сборка и зависимости
|
||||
|
||||
- Сборка: `npm run build` (или скрипт проекта).
|
||||
- Пакетный менеджер и lock-файл: `<!-- TODO: npm/pnpm/yarn -->` — lock коммитим.
|
||||
- Сборка: `pnpm build` (или скрипт проекта).
|
||||
- Пакетный менеджер: **pnpm** — `pnpm install`; lock `pnpm-lock.yaml` коммитим.
|
||||
|
||||
## Коммиты и MR
|
||||
|
||||
- **Формат коммитов:** `<!-- TODO: например Conventional Commits или свой -->`.
|
||||
- **Формат коммитов:** Conventional Commits (`feat:`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:` …).
|
||||
- **Ветки и деплой:** фича-ветки — от `main` (в имя ветки желательно включать ключ тикета).
|
||||
Деплой управляется ветками/тегами: ветка `release-*` → раскатка на **stage**; тег `v*` → раскатка в **прод**.
|
||||
Ветки `release-*` и теги `v*` без необходимости не пушь — `permission-gate` переспросит.
|
||||
- **MR обязателен** (см. корпоративные правила из контекста сессии). Прямой push в защищённые
|
||||
ветки запрещён — расширение `permission-gate` дополнительно переспросит.
|
||||
- Перед MR: `tsc --noEmit`, `eslint .`, `prettier --check .`, тесты — всё зелёное.
|
||||
|
||||
Reference in New Issue
Block a user