chore(rules): ignore .tmp scratch; IFT e2e needs SMOKE_USER. [skip ci]
This commit is contained in:
+120
-119
@@ -1,119 +1,120 @@
|
|||||||
---
|
---
|
||||||
description: Типичные ошибки агентов EventHub — shell, git, docker, scope, токены (корень + субагенты)
|
description: Типичные ошибки агентов EventHub — shell, git, docker, scope, токены (корень + субагенты)
|
||||||
alwaysApply: true
|
alwaysApply: true
|
||||||
---
|
---
|
||||||
|
|
||||||
# EventHub: типичные ошибки агентов (избегать)
|
# EventHub: типичные ошибки агентов (избегать)
|
||||||
|
|
||||||
Канон. Субагентам: включать в промпт «следуй `agent-pitfalls.mdc` + `shell-wsl-not-powershell.mdc`».
|
Канон. Субагентам: включать в промпт «следуй `agent-pitfalls.mdc` + `shell-wsl-not-powershell.mdc`».
|
||||||
|
|
||||||
## 1. Shell / PowerShell
|
## 1. Shell / PowerShell
|
||||||
|
|
||||||
| Симптом | Причина | Как правильно |
|
| Симптом | Причина | Как правильно |
|
||||||
|---------|---------|---------------|
|
|---------|---------|---------------|
|
||||||
| `bash: /mnt/c/.../.tmp-*.sh: No such file or directory` при том что `ls` файл видит | **CRLF** от Cursor Write: shebang = `bash\r` | **Всегда** `wsl -e bash /mnt/c/Users/alexc/.cursor/eventhub/run-wsl-sh.sh /mnt/c/.../script.sh` (или `sed -i 's/\r$//' && bash`). **Не** голый `wsl -e bash /mnt/c/.../script.sh` |
|
| `bash: /mnt/c/.../.tmp-*.sh: No such file or directory` при том что `ls` файл видит | **CRLF** от Cursor Write: shebang = `bash\r` | **Всегда** `wsl -e bash /mnt/c/Users/alexc/.cursor/eventhub/run-wsl-sh.sh /mnt/c/.../script.sh` (или `sed -i 's/\r$//' && bash`). **Не** голый `wsl -e bash /mnt/c/.../script.sh` |
|
||||||
| `unexpected EOF`, `ParserError`, пустой curl | PS ломает `"`, `$`, heredoc, `&&` | Файл `.sh` → `run-wsl-sh.sh` |
|
| IFT e2e: **N skipped**, exit 0 | Нет `SMOKE_USER_*` (голый `npm run test:e2e:ift`) | `run-front-ift.sh` / source `eventhub-ift.env` **до** npm. Не путать со «стенд недоступен». CI уже крутит e2e-ift → локально не дублировать |
|
||||||
| `bash: syntax error near '('` | `grep -E ^(...)` в PS; **`fix(ci):` / `(…)` в `wsl -lc` one-liner** | Только внутри `.sh`; commit → `-F` файл (см. ниже) |
|
| `unexpected EOF`, `ParserError`, пустой curl | PS ломает `"`, `$`, heredoc, `&&` | Файл `.sh` → `run-wsl-sh.sh` |
|
||||||
| `{{.Names}}: command not found` | `docker --format "{{…}}"` в PS | Формат в `.sh` или простой `docker ps` |
|
| `bash: syntax error near '('` | `grep -E ^(...)` в PS; **`fix(ci):` / `(…)` в `wsl -lc` one-liner** | Только внутри `.sh`; commit → `-F` файл (см. ниже) |
|
||||||
| `&&` is not valid | PowerShell не bash | Отдельные команды или `.sh` |
|
| `{{.Names}}: command not found` | `docker --format "{{…}}"` в PS | Формат в `.sh` или простой `docker ps` |
|
||||||
|
| `&&` is not valid | PowerShell не bash | Отдельные команды или `.sh` |
|
||||||
**Запрещено в PS:** голый `wsl -e bash /mnt/c/.../.tmp-*.sh` (без `run-wsl-sh.sh`), `wsl -e bash -lc "…\"…"`, `curl -d "{\"x\":…}"`, heredoc commit, `npm`/`rebar3`.
|
|
||||||
|
**Запрещено в PS:** голый `wsl -e bash /mnt/c/.../.tmp-*.sh` (без `run-wsl-sh.sh`), `wsl -e bash -lc "…\"…"`, `curl -d "{\"x\":…}"`, heredoc commit, `npm`/`rebar3`.
|
||||||
Канон запуска скриптов: см. `shell-wsl-not-powershell.mdc` § CRLF.
|
|
||||||
|
Канон запуска скриптов: см. `shell-wsl-not-powershell.mdc` § CRLF.
|
||||||
## 2. Git
|
|
||||||
|
## 2. Git
|
||||||
| Симптом | Как правильно |
|
|
||||||
|---------|---------------|
|
| Симптом | Как правильно |
|
||||||
| `#` в `-m` обрезает сообщение | `-F` файл; в тексте `Refs EventHub/EventHubBack#N` |
|
|---------|---------------|
|
||||||
| `syntax error near '('` на commit | Сообщение `fix(ci): …` inline в `wsl -lc '… git-commit.sh … fix(ci): …'` | **Только** `.tmp-commit-msg.txt` + `git commit -F`; или `.sh` без inline `-m` |
|
| `#` в `-m` обрезает сообщение | `-F` файл; в тексте `Refs EventHub/EventHubBack#N` |
|
||||||
| `Co-authored-by: Cursor <…>` / `<` ParserError | `git commit -F .tmp-msg.txt` из PS **или** `git-commit.sh` **из `.sh`**, не из PS one-liner |
|
| `syntax error near '('` на commit | Сообщение `fix(ci): …` inline в `wsl -lc '… git-commit.sh … fix(ci): …'` | **Только** `.tmp-commit-msg.txt` + `git commit -F`; или `.sh` без inline `-m` |
|
||||||
| `editor` / not a terminal | Не `git commit` без `-F` в WSL; из Windows: `git commit -F file` |
|
| `Co-authored-by: Cursor <…>` / `<` ParserError | `git commit -F .tmp-msg.txt` из PS **или** `git-commit.sh` **из `.sh`**, не из PS one-liner |
|
||||||
| Сотни `M` после reset на `/mnt/c` | `git config core.filemode false` (локально); не «чинить» код |
|
| `editor` / not a terminal | Не `git commit` без `-F` в WSL; из Windows: `git commit -F file` |
|
||||||
| Удалились `.cursor/`, `.idea/` | **`git clean -fdx` только с backup** env + certs; IDE-директории **не трогать** |
|
| Сотни `M` после reset на `/mnt/c` | `git config core.filemode false` (локально); не «чинить» код |
|
||||||
| Push «висит» / ждёт login | **Не** `git push origin` — только `~/.cursor/eventhub/git-push.sh` / `git-push-main.sh` |
|
| Удалились `.cursor/`, `.idea/` | **`git clean -fdx` только с backup** env + certs; IDE-директории **не трогать** |
|
||||||
| Push заблокирован Auto-review | Push в `master` — только по явной просьбе; `request_smart_mode_approval` |
|
| Push «висит» / ждёт login | **Не** `git push origin` — только `~/.cursor/eventhub/git-push.sh` / `git-push-main.sh` |
|
||||||
|
| Push заблокирован Auto-review | Push в `master` — только по явной просьбе; `request_smart_mode_approval` |
|
||||||
**`git clean` / reset к origin:** сначала сохранить `docker/.env*`, `.env.development`, `docker/traefik/certs/*`.
|
|
||||||
|
**`git clean` / reset к origin:** сначала сохранить `docker/.env*`, `.env.development`, `docker/traefik/certs/*`.
|
||||||
**Push:** запрещены голые `git push` / `git push origin …`. Канон — `bash /mnt/c/Users/alexc/.cursor/eventhub/git-push.sh <repo-dir>` (токен из secrets).
|
|
||||||
|
**Push:** запрещены голые `git push` / `git push origin …`. Канон — `bash /mnt/c/Users/alexc/.cursor/eventhub/git-push.sh <repo-dir>` (токен из secrets).
|
||||||
**Commit (сообщение со скобками, `#`, `$`, пробелами):** не передавать subject/body аргументом через PowerShell или `wsl -e bash -lc '…'`. Пиши `.tmp-commit-msg.txt` в репо, затем в `.sh`:
|
|
||||||
|
**Commit (сообщение со скобками, `#`, `$`, пробелами):** не передавать subject/body аргументом через PowerShell или `wsl -e bash -lc '…'`. Пиши `.tmp-commit-msg.txt` в репо, затем в `.sh`:
|
||||||
```bash
|
|
||||||
cd /mnt/c/Users/alexc/IdeaProjects/eventHub/EventHubBack
|
```bash
|
||||||
git add path/to/file
|
cd /mnt/c/Users/alexc/IdeaProjects/eventHub/EventHubBack
|
||||||
GIT_EDITOR=true git commit -F .tmp-commit-msg.txt
|
git add path/to/file
|
||||||
```
|
GIT_EDITOR=true git commit -F .tmp-commit-msg.txt
|
||||||
|
```
|
||||||
Запуск из PS: `wsl -e bash /mnt/c/Users/alexc/.cursor/eventhub/run-wsl-sh.sh /mnt/c/.../EventHubBack/.tmp-commit.sh` — **без** голого `wsl -e bash …/.tmp-commit.sh`, **без** `-lc` и **без** `-m "fix(ci): …"`.
|
|
||||||
|
Запуск из PS: `wsl -e bash /mnt/c/Users/alexc/.cursor/eventhub/run-wsl-sh.sh /mnt/c/.../EventHubBack/.tmp-commit.sh` — **без** голого `wsl -e bash …/.tmp-commit.sh`, **без** `-lc` и **без** `-m "fix(ci): …"`.
|
||||||
## 3. Docker dev (Swarm локально)
|
|
||||||
|
## 3. Docker dev (Swarm локально)
|
||||||
| Ошибка | Правильно |
|
|
||||||
|--------|-----------|
|
| Ошибка | Правильно |
|
||||||
| «Балансировка» → 3× eventhub | **dev:** `traefik=1` + **`eventhub=1`** (см. `EventHubDevOps/docs/STANDS.md`) |
|
|--------|-----------|
|
||||||
| `host-mode port already in use` | У eventhub опубликованы 8080/8445 — **нельзя** scale >1; LB = traefik |
|
| «Балансировка» → 3× eventhub | **dev:** `traefik=1` + **`eventhub=1`** (см. `EventHubDevOps/docs/STANDS.md`) |
|
||||||
| Собрали admin-ui/front без просьбы | «Только бэк» → eventhub (+ traefik если нужен HTTPS), **без** Front/Admin образов |
|
| `host-mode port already in use` | У eventhub опубликованы 8080/8445 — **нельзя** scale >1; LB = traefik |
|
||||||
| Эмулятор не остановился | `docker service scale eventhub_bot-emulator-users=0` |
|
| Собрали admin-ui/front без просьбы | «Только бэк» → eventhub (+ traefik если нужен HTTPS), **без** Front/Admin образов |
|
||||||
| `No such image: eventhub:latest` | Сначала `docker build -t eventhub:latest …` или `docker/build-images.sh` |
|
| Эмулятор не остановился | `docker service scale eventhub_bot-emulator-users=0` |
|
||||||
| Admin API dev не отвечает на :443 | Traefik без ports → **`http://127.0.0.1:8445`**; stage → SSH + `--resolve …:443:127.0.0.1` |
|
| `No such image: eventhub:latest` | Сначала `docker build -t eventhub:latest …` или `docker/build-images.sh` |
|
||||||
|
| Admin API dev не отвечает на :443 | Traefik без ports → **`http://127.0.0.1:8445`**; stage → SSH + `--resolve …:443:127.0.0.1` |
|
||||||
## 4. Scope (не додумывать)
|
|
||||||
|
## 4. Scope (не додумывать)
|
||||||
- Делать **ровно** запрос; не раздувать (полный `build-images.sh`, 3 ноды, admin-ui, spec commit).
|
|
||||||
- Перед scale/deploy — прочитать compose и STANDS.md.
|
- Делать **ровно** запрос; не раздувать (полный `build-images.sh`, 3 ноды, admin-ui, spec commit).
|
||||||
- Секреты: `gitea.ps1` / `.sh` + env; не inline `source secrets` в PS one-liner.
|
- Перед scale/deploy — прочитать compose и STANDS.md.
|
||||||
|
- Секреты: `gitea.ps1` / `.sh` + env; не inline `source secrets` в PS one-liner.
|
||||||
## 5. Субагенты (Task)
|
|
||||||
|
## 5. Субагенты (Task)
|
||||||
В промпт субагента добавлять:
|
|
||||||
|
В промпт субагента добавлять:
|
||||||
```text
|
|
||||||
Shell: только WSL + .sh (см. shell-wsl-not-powershell.mdc, agent-pitfalls.mdc).
|
```text
|
||||||
Один репо. Итог на русском. Не push без явного OK.
|
Shell: только WSL + .sh (см. shell-wsl-not-powershell.mdc, agent-pitfalls.mdc).
|
||||||
```
|
Один репо. Итог на русском. Не push без явного OK.
|
||||||
|
```
|
||||||
## 6. Экономия токенов / лимитов моделей
|
|
||||||
|
## 6. Экономия токенов / лимитов моделей
|
||||||
### Контекст чата
|
|
||||||
- **Один чат — одна задача**; после «готово / CI зелёный» — новый чат на следующий шаг (см. `WORKFLOW.md` §5).
|
### Контекст чата
|
||||||
- Workspace: для Back-задачи достаточно **`EventHubBack`** (+ Spec при необходимости); не держать все репо без нужды.
|
- **Один чат — одна задача**; после «готово / CI зелёный» — новый чат на следующий шаг (см. `WORKFLOW.md` §5).
|
||||||
- **`@` точечно** — файл/папка, не `@Codebase` без причины.
|
- Workspace: для Back-задачи достаточно **`EventHubBack`** (+ Spec при необходимости); не держать все репо без нужды.
|
||||||
- Не просить «проанализируй все transcripts» — они огромные.
|
- **`@` точечно** — файл/папка, не `@Codebase` без причины.
|
||||||
|
- Не просить «проанализируй все transcripts» — они огромные.
|
||||||
### Дешёвые vs дорогие действия
|
|
||||||
| Дорого | Дешевле |
|
### Дешёвые vs дорогие действия
|
||||||
|--------|---------|
|
| Дорого | Дешевле |
|
||||||
| Task explore «very thorough» | `grep` + 1–2 файла |
|
|--------|---------|
|
||||||
| Полный `build-images.sh` | Только нужный образ |
|
| Task explore «very thorough» | `grep` + 1–2 файла |
|
||||||
| Весь лог CI (80k строк) | API job + 20 строк вокруг ошибки |
|
| Полный `build-images.sh` | Только нужный образ |
|
||||||
| Несколько subagents «на всякий» | 1 subagent, узкий промпт |
|
| Весь лог CI (80k строк) | API job + 20 строк вокруг ошибки |
|
||||||
| Browser deep-walk stage | Smoke-скрипт / один URL |
|
| Несколько subagents «на всякий» | 1 subagent, узкий промпт |
|
||||||
|
| Browser deep-walk stage | Smoke-скрипт / один URL |
|
||||||
### Меньше итераций
|
|
||||||
- Сразу **`.sh`**, не 5 попыток PS one-liner (каждая = новый turn).
|
### Меньше итераций
|
||||||
- Git перед commit: **один** `status` + `diff`, не три раза подряд.
|
- Сразу **`.sh`**, не 5 попыток PS one-liner (каждая = новый turn).
|
||||||
- Тесты: `rebar3 eunit --module=…` если трогали один модуль; не полный suite без нужды.
|
- Git перед commit: **один** `status` + `diff`, не три раза подряд.
|
||||||
- Docker: не rebuild, если `docker images` уже есть нужный tag.
|
- Тесты: `rebar3 eunit --module=…` если трогали один модуль; не полный suite без нужды.
|
||||||
|
- Docker: не rebuild, если `docker images` уже есть нужный tag.
|
||||||
### Модели и режимы
|
|
||||||
- **Ask / Plan** — вопросы и варианты без tool calls.
|
### Модели и режимы
|
||||||
- **Agent** — только когда нужны команды и правки.
|
- **Ask / Plan** — вопросы и варианты без tool calls.
|
||||||
- Bugbot / Security Review — не на каждый мелкий diff.
|
- **Agent** — только когда нужны команды и правки.
|
||||||
|
- Bugbot / Security Review — не на каждый мелкий diff.
|
||||||
### Scope в запросе (шаблон)
|
|
||||||
```text
|
### Scope в запросе (шаблон)
|
||||||
Репо: EventHubBack
|
```text
|
||||||
Issue: #N
|
Репо: EventHubBack
|
||||||
Scope: только …
|
Issue: #N
|
||||||
Не: front, docker, push, spec
|
Scope: только …
|
||||||
Done: eunit / lint / …
|
Не: front, docker, push, spec
|
||||||
```
|
Done: eunit / lint / …
|
||||||
|
```
|
||||||
### Subagents
|
|
||||||
- Редко; промпт = issue + файлы + done, **без** всей переписки.
|
### Subagents
|
||||||
- `one-repo-per-agent` — меньше контекста и ошибок.
|
- Редко; промпт = issue + файлы + done, **без** всей переписки.
|
||||||
|
- `one-repo-per-agent` — меньше контекста и ошибок.
|
||||||
### Повторяемое — в скрипты
|
|
||||||
Токены verify, smoke creds, stage deploy — **`~/.cursor/eventhub/*.sh`**, не заново через SSH в каждом чате.
|
### Повторяемое — в скрипты
|
||||||
|
Токены verify, smoke creds, stage deploy — **`~/.cursor/eventhub/*.sh`**, не заново через SSH в каждом чате.
|
||||||
|
|||||||
+45
-42
@@ -1,42 +1,45 @@
|
|||||||
/EventHubBack.iml
|
/EventHubBack.iml
|
||||||
/.idea/
|
/.idea/
|
||||||
.rebar3
|
.rebar3
|
||||||
_build
|
_build
|
||||||
_checkouts
|
_checkouts
|
||||||
_vendor
|
_vendor
|
||||||
.eunit
|
.eunit
|
||||||
*.o
|
*.o
|
||||||
*.beam
|
*.beam
|
||||||
*.plt
|
*.plt
|
||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
.erlang.cookie
|
.erlang.cookie
|
||||||
ebin
|
ebin
|
||||||
log
|
log
|
||||||
erl_crash.dump
|
erl_crash.dump
|
||||||
.rebar
|
.rebar
|
||||||
logs
|
logs
|
||||||
data
|
data
|
||||||
ci-out
|
ci-out
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
rebar3.crashdump
|
rebar3.crashdump
|
||||||
*~
|
*~
|
||||||
/.tool-versions
|
/.tool-versions
|
||||||
/rebar.lock
|
/rebar.lock
|
||||||
/build/
|
/build/
|
||||||
docker/.env
|
docker/.env
|
||||||
docker/.env.ift
|
docker/.env.ift
|
||||||
docker/.env.stage
|
docker/.env.stage
|
||||||
/Mnesia.*/
|
/Mnesia.*/
|
||||||
/doc/
|
/doc/
|
||||||
|
|
||||||
# Локальные учётки admin для Tsung IFT (см. test/tsung/ift-admin.csv.example)
|
# Локальные учётки admin для Tsung IFT (см. test/tsung/ift-admin.csv.example)
|
||||||
/test/tsung/ift-admin.csv
|
/test/tsung/ift-admin.csv
|
||||||
# Пул пользователей для stress hot-path (см. test/tsung/ift-users.csv.example)
|
# Пул пользователей для stress hot-path (см. test/tsung/ift-users.csv.example)
|
||||||
/test/tsung/ift-users.csv
|
/test/tsung/ift-users.csv
|
||||||
|
|
||||||
# Traefik TLS private keys (generated locally for dev/staging).
|
# Traefik TLS private keys (generated locally for dev/staging).
|
||||||
# Никогда не коммитим приватный ключ в репозиторий.
|
# Никогда не коммитим приватный ключ в репозиторий.
|
||||||
docker/traefik/certs/*.key
|
docker/traefik/certs/*.key
|
||||||
docker/traefik/certs/*.pem
|
docker/traefik/certs/*.pem
|
||||||
|
|
||||||
|
# Temporary/scratch files
|
||||||
|
.tmp-*
|
||||||
|
|||||||
Reference in New Issue
Block a user