diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 88e9527..5dfb05a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,223 +1,14 @@ -# Правила работы агента в проекте fission +# Правила -## ГЛАВНОЕ ПРАВИЛО +## ⛔ ОТВЕЧАТЬ КРАТКО — АБСОЛЮТНОЕ ПРАВИЛО +- Вопрос → короткий ответ → СТОП. Не рассуждать, не исследовать без команды. +- НЕ делать ничего "попутно" без явной просьбы. Сделал — стоп — ждёшь команды. -**НЕ "СОВЕРШЕНСТВОВАТЬ" РАБОЧИЙ КОД БЕЗ ЯВНОГО УКАЗАНИЯ.** +> Подробные правила: [`.github/pravila.md`](pravila.md) ---- - -## Файловая система и выполнение команд - -### Маппинг путей - -Локальная папка `~/remote_dev/` примонтирована через sshfs к `~/terra/` на ВМ `5.172.178.213`. -Это **одна и та же файловая система**: - -| Локально (VS Code) | На ВМ | -|----------------------------------|-------------------------------| -| `/home/naeel/remote_dev/fission` | `/home/naeel/terra/fission` | -| `/home/naeel/remote_dev/sless` | `/home/naeel/terra/sless` | -| `/home/naeel/remote_dev/IoT` | `/home/naeel/terra/IoT` | - -Любой файл, сохранённый локально через VS Code, **мгновенно виден на ВМ**. SCP не нужен. - -### Что можно делать локально - -- **Редактировать файлы** — через VS Code, replace_string_in_file, create_file и т.д. Изменения сразу на ВМ. -- **Читать файлы** — read_file, grep_search, file_search, semantic_search — всё разрешено. - -### Что ЗАПРЕЩЕНО локально - -**Все команды выполнять ИСКЛЮЧИТЕЛЬНО через SSH на ВМ:** - -```bash -ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА' -``` - -**Причина:** локально может быть активен VPN, что вызывает сбои при выполнении сетевых команд, обращениях к кластеру, Docker и пр. - -Запрещено запускать локально (без ssh): -- `go build`, `go test`, `go mod tidy` -- `docker build`, `docker push` -- `kubectl`, `helm` -- `terraform` -- `curl`, `wget` к кластерным сервисам -- `git push`, `git pull` (git операции — через ssh на ВМ) -- Любые bash-скрипты проекта - -### Формат работы - -1. Отредактировать файлы локально (VS Code / инструменты агента) -2. Запустить команды через SSH на ВМ -3. Ждать результата - ---- - -## Документация - -Всё важное фиксировать в `doc/`: -- `doc/thinking/` — лог рассуждений агента (обязательно) -- `doc/progress.md` — трекер задач -- Обновлять после каждого значимого изменения. - -## Git - -Коммитить и пушить после каждого завершённого этапа. - -### Версионирование тегами - -После каждого коммита с изменениями — поднимать версию тега: - -```bash -# Посмотреть текущий тег -git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0" - -# Поднять patch-версию (v0.1.0 → v0.1.1, v0.1.1 → v0.1.2 и т.д.) -git tag vX.Y.Z && git push origin vX.Y.Z -``` - -**Правила:** -- Patch (Z) — любое изменение: правка кода, новая функция, фикс -- Minor (Y) — новая фича/компонент (новый ресурс провайдера, новый модуль консоли) -- Major (X) — breaking change -- Тег ставить ПОСЛЕ успешного коммита и пуша -- Формат: `vMAJOR.MINOR.PATCH` (например `v0.2.3`) - ---- - -## Как создать и задеплоить новую Fission-функцию через Terraform - -### Пошаговая инструкция (ОБЯЗАТЕЛЬНО следовать) - -#### Шаг 1: Создать папку с функцией - -Создать папку в `examples/` по шаблону. Пример: `examples/my-test/` - -Структура: -``` -examples/my-test/ -├── code/ -│ └── main.py # Код функции -└── main.tf # Terraform манифест -``` - -#### Шаг 2: Написать код функции - -Файл `code/main.py` — обязательно функция `main()`: - -```python -def main(): - return "hello from my-test" -``` - -Можно сложнее — с аргументами, JSON, вычислениями: - -```python -import json - -def main(): - result = {"status": "ok", "data": [1, 2, 3]} - return json.dumps(result) -``` - -#### Шаг 3: Написать Terraform манифест - -Файл `main.tf` — КОПИРОВАТЬ этот шаблон и менять только имена и URL: - -```hcl -terraform { - required_providers { - fission = { - source = "nail/fission" - version = "~> 0.1.0" - } - } -} - -provider "fission" { - kubeconfig_path = "/home/naeel/.kube/config" - namespace = "default" -} - -resource "fission_environment" "python" { - name = "УНИКАЛЬНОЕ-ИМЯ-env" - image = "ghcr.io/fission/python-env" - version = 3 -} - -resource "fission_package" "pkg" { - name = "УНИКАЛЬНОЕ-ИМЯ-pkg" - environment = fission_environment.python.name - source_dir = "${path.module}/code" -} - -resource "fission_function" "fn" { - name = "УНИКАЛЬНОЕ-ИМЯ-fn" - environment = fission_environment.python.name - package_name = fission_package.pkg.name - entrypoint = "main.main" -} - -resource "fission_http_trigger" "route" { - name = "УНИКАЛЬНОЕ-ИМЯ-route" - function = fission_function.fn.name - url = "/УНИКАЛЬНЫЙ-URL" - methods = ["GET"] -} -``` - -**ВАЖНО:** Все имена ресурсов (name) должны быть **уникальными** по всему кластеру. -Используй префикс, например `tf-mytest-env`, `tf-mytest-pkg`, `tf-mytest-fn`, `tf-mytest-route`. - -#### Шаг 4: Задеплоить через SSH - -```bash -ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 \ - 'cd ~/terra/fission/examples/my-test && TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform apply -auto-approve' -``` - -**ОБЯЗАТЕЛЬНО:** -- Переменная `TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission` — ВСЕГДА нужна (dev override провайдера) -- `terraform init` НЕ нужен (dev_overrides пропускает init) -- Выполнять ТОЛЬКО через SSH - -#### Шаг 5: Проверить функцию через curl - -Роутер требует JWT. Паттерн: - -```bash -ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 ' -PASSWORD=$(kubectl -n fission get secret router -o jsonpath={.data.password} | base64 -d) -TOKEN=$(curl -sk -X POST https://fission.kube5s.ru/auth/login \ - -H "Content-Type: application/json" \ - -d "{\"username\":\"admin\",\"password\":\"$PASSWORD\"}" \ - | python3 -c "import sys,json; print(json.load(sys.stdin)[\"accesstoken\"])") -curl -sk -H "Authorization: Bearer $TOKEN" https://fission.kube5s.ru/УНИКАЛЬНЫЙ-URL -' -``` - -#### Шаг 6: Удалить (если нужно) - -```bash -ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 \ - 'cd ~/terra/fission/examples/my-test && TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission terraform destroy -auto-approve' -``` - -### Уже задеплоенные функции (НЕ ТРОГАТЬ без явного указания) - -| Папка | Endpoint | Ответ | -|-------|----------|-------| -| `examples/hello-python/` | `GET /tf-hello` | `hello from fission via terraform` | -| `examples/stress-suite/` | `GET /stress/fast` | `fast-ok` | -| `examples/stress-suite/` | `GET /stress/cpu` | `cpu-ok:NUMBER` | -| `examples/stress-suite/` | `GET /stress/json` | `{"status":"ok","service":"json"}` | - -### Частые ошибки - -| Ошибка | Причина | Решение | -|--------|---------|---------| -| `unauthorized: malformed token` | curl без JWT | Добавить JWT (см. шаг 5) | -| `terraform init required` | Забыт `TF_CLI_CONFIG_FILE` | Добавить `TF_CLI_CONFIG_FILE=/tmp/terraformrc-fission` | -| `resource already exists` | Имя не уникальное | Сменить имена на уникальные с префиксом | -| `Error: connection refused` | Команда запущена локально | Выполнять ТОЛЬКО через SSH | -| `package not found` | Опечатка в `source_dir` | Проверить path.module/code и файл main.py | +1. Не трогать рабочий код без явного указания. +2. Файлы редактировать локально — `~/remote_dev/` = `~/terra/` на ВМ (sshfs), SCP не нужен. +3. Все команды — **только через SSH**, никогда локально: + ```bash + ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА' + ``` diff --git a/.github/pravila.md b/.github/pravila.md new file mode 100644 index 0000000..be15fff --- /dev/null +++ b/.github/pravila.md @@ -0,0 +1,56 @@ +# Правила работы агента + +## Файловая система + +`~/remote_dev/` (локально) примонтирован через sshfs к `~/terra/` на ВМ — **одна ФС**. +Файлы, сохранённые локально, мгновенно видны на ВМ. SCP не нужен. + +Монтирование может слетать. Признак: файлы рассинхронизированы. + +```bash +# Размонтировать +fusermount -u ~/remote_dev +# Если завис: sudo umount -l /home/naeel/remote_dev + +# Примонтировать +sshfs naeel@5.172.178.213:/home/naeel/terra ~/remote_dev \ + -o cache=no -o no_readahead -o reconnect \ + -o ServerAliveInterval=15 -o ServerAliveCountMax=3 \ + -o IdentityFile=~/.ssh/naeel_vm_id_ed25519 +``` + +## SSH + +Все команды — только через SSH на ВМ. Локально — только читать и редактировать файлы. + +```bash +ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА' +``` + +Запрещено локально: `go`, `docker`, `kubectl`, `helm`, `terraform`, `curl/wget`, `git push/pull`, любые скрипты проекта. + +## Документация + +- `doc/thinking/` — лог рассуждений агента (обязательно) +- `doc/progress.md` — трекер задач +- Старые файлы `doc/` не перезаписывать — новое в новых файлах с датой + +## Git + +Коммитить и пушить через SSH после каждого завершённого этапа. + +Версионирование тегами: `vMAJOR.MINOR.PATCH` +- Patch — любое изменение кода +- Minor — новая фича / компонент +- Major — breaking change + +```bash +git tag vX.Y.Z && git push origin vX.Y.Z +``` + +## Поведение агента + +- Не трогать рабочий код без явного указания +- Не делать ничего сверх того, о чём явно попросили +- Деструктивные операции (`kubectl delete`, `rm -rf`, `terraform destroy` и др.) — только после явного подтверждения с указанием конкретных объектов +- Отвечать кратко, без вступлений, извинений, благодарностей и прочей воды