fchek 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +64 -0
  2. package/bin/fchek.js +107 -0
  3. package/lib/api.js +110 -0
  4. package/lib/audit.js +211 -0
  5. package/lib/bench.js +248 -0
  6. package/lib/config.js +191 -0
  7. package/lib/context.js +356 -0
  8. package/lib/convention.js +526 -0
  9. package/lib/coverage.js +604 -0
  10. package/lib/db.js +135 -0
  11. package/lib/deps-check.js +264 -0
  12. package/lib/deps.js +374 -0
  13. package/lib/docker.js +84 -0
  14. package/lib/doctor.js +149 -0
  15. package/lib/dom.js +226 -0
  16. package/lib/fuzz.js +470 -0
  17. package/lib/git.js +290 -0
  18. package/lib/goto.js +544 -0
  19. package/lib/launch.js +182 -0
  20. package/lib/lint.js +624 -0
  21. package/lib/new_features.test.js +181 -0
  22. package/lib/output.js +46 -0
  23. package/lib/port.js +173 -0
  24. package/lib/process.js +228 -0
  25. package/lib/profile.js +453 -0
  26. package/lib/python.js +41 -0
  27. package/lib/race.js +186 -0
  28. package/lib/registry.js +179 -0
  29. package/lib/repl.js +135 -0
  30. package/lib/run.js +403 -0
  31. package/lib/screenshot.js +152 -0
  32. package/lib/secrets.js +257 -0
  33. package/lib/state.js +219 -0
  34. package/lib/test.js +471 -0
  35. package/lib/vuln.js +253 -0
  36. package/lib/watch.js +240 -0
  37. package/lib/winlog.js +123 -0
  38. package/package.json +27 -0
  39. package/skills/ACTIVATE.md +274 -0
  40. package/skills/README.md +163 -0
  41. package/skills/agent.md +444 -0
  42. package/skills/api.md +47 -0
  43. package/skills/bench.md +117 -0
  44. package/skills/context.md +116 -0
  45. package/skills/convention.md +143 -0
  46. package/skills/coverage.md +99 -0
  47. package/skills/csharp.md +97 -0
  48. package/skills/db.md +66 -0
  49. package/skills/deps-check.md +135 -0
  50. package/skills/deps.md +143 -0
  51. package/skills/docker.md +61 -0
  52. package/skills/dom.md +56 -0
  53. package/skills/fuzz.md +167 -0
  54. package/skills/goto.md +111 -0
  55. package/skills/lint.md +123 -0
  56. package/skills/port.md +57 -0
  57. package/skills/profile.md +91 -0
  58. package/skills/race.md +117 -0
  59. package/skills/repl.md +81 -0
  60. package/skills/rules.md +318 -0
  61. package/skills/run.md +135 -0
  62. package/skills/secrets.md +170 -0
  63. package/skills/security.md +360 -0
  64. package/skills/state.md +261 -0
  65. package/skills/vuln.md +57 -0
  66. package/skills/windows.md +320 -0
package/skills/port.md ADDED
@@ -0,0 +1,57 @@
1
+ # skill: fchek port — Сеть и порты
2
+
3
+ ## Что делает
4
+
5
+ Проверяет сетевые порты и активные соединения.
6
+ - Позволяет узнать, запущен ли сервис на конкретном порту.
7
+ - Выясняет, какой процесс занимает порт (PID и имя процесса).
8
+ - Позволяет получить список всех активных прослушиваемых портов.
9
+
10
+ ## Синтаксис
11
+
12
+ ```bash
13
+ # Проверить конкретный порт
14
+ fchek port <port_number>
15
+
16
+ # Показать все активные слушающие порты
17
+ fchek port --all
18
+ ```
19
+
20
+ ## Вывод JSON
21
+
22
+ ```json
23
+ {
24
+ "status": "ok",
25
+ "command": "port",
26
+ "data": {
27
+ "port": 8080,
28
+ "in_use": true,
29
+ "connections": [
30
+ {
31
+ "proto": "TCP",
32
+ "localAddress": "0.0.0.0:8080",
33
+ "state": "LISTENING",
34
+ "port": 8080,
35
+ "pid": 1234,
36
+ "processName": "node.exe"
37
+ }
38
+ ]
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## КАК AI ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТО
44
+
45
+ ### Сценарии
46
+
47
+ 1. **Порт занят**: если запускаемый сервер выдает ошибку `EADDRINUSE`, запусти:
48
+ ```bash
49
+ fchek port 8080
50
+ ```
51
+ Найди PID процесса и убей его с помощью `fchek process kill <pid>`.
52
+
53
+ 2. **Проверить запуск сервера**: после запуска фонового процесса/сервера проверь, слушает ли он порт:
54
+ ```bash
55
+ fchek port 3000
56
+ ```
57
+ Убедись, что `"in_use": true`.
@@ -0,0 +1,91 @@
1
+ # skill: fchek profile — профилировщик кода
2
+
3
+ ## Что делает
4
+
5
+ Запускает код и показывает, какие функции занимают больше всего CPU времени.
6
+ Помогает найти bottleneck без ручного добавления замеров в код.
7
+
8
+ ## Поддерживаемые языки
9
+
10
+ | Язык | Инструмент | Требование |
11
+ |---|---|---|
12
+ | Python (.py) | py-spy | `pip install py-spy` |
13
+ | Python (fallback) | cProfile | встроен в Python |
14
+ | C/C++ (.c .cpp) | valgrind callgrind | `apt install valgrind` (Linux only) |
15
+
16
+ ## Синтаксис
17
+
18
+ ```bash
19
+ fchek profile <file> [app|web] [--timeout=<ms>]
20
+ ```
21
+
22
+ - `app` — запуск как standalone (по умолчанию)
23
+ - `web` — Python web-режим
24
+ - `--timeout=30000` — максимальное время ожидания (мс), по умолчанию 60000
25
+
26
+ ## Вывод JSON
27
+
28
+ ```json
29
+ {
30
+ "status": "ok",
31
+ "command": "profile",
32
+ "data": {
33
+ "file": "/path/to/main.py",
34
+ "lang": "python",
35
+ "mode": "app",
36
+ "tool": "cProfile",
37
+ "timeout_ms": 60000,
38
+ "top_functions": [
39
+ { "ncalls": 1000, "tottime": 0.42, "cumtime": 1.3, "location": "utils.py:15(process)" }
40
+ ],
41
+ "raw_summary": "...",
42
+ "stderr": null
43
+ }
44
+ }
45
+ ```
46
+
47
+ ## Как AI должен использовать это
48
+
49
+ ### Сценарий: "Код медленный, не знаю где"
50
+
51
+ ```bash
52
+ # 1. Запусти профилировщик
53
+ fchek profile slow_script.py
54
+
55
+ # 2. Разбери JSON — найди top_functions с наибольшим cumtime
56
+ # 3. Перейди к самой медленной функции через goto
57
+ fchek goto slow_script.py:15
58
+ ```
59
+
60
+ ### Алгоритм принятия решений
61
+
62
+ ```
63
+ ЕСЛИ lang=python:
64
+ ЕСЛИ py-spy доступен → используй его (данные точнее)
65
+ ИНАЧЕ → cProfile (fallback, всегда работает)
66
+
67
+ ЕСЛИ lang=c/cpp:
68
+ ЕСЛИ Linux → valgrind callgrind
69
+ ИНАЧЕ → сообщи пользователю об ограничении платформы
70
+ ```
71
+
72
+ ### Как читать top_functions
73
+
74
+ - `cumtime` — суммарное время включая вызовы дочерних функций → ищи здесь bottleneck
75
+ - `tottime` — только время самой функции → ищи здесь горячий код
76
+ - `ncalls` — число вызовов → если высокое + tottime большое → оптимизируй саму функцию
77
+
78
+ ## Частые ошибки и решения
79
+
80
+ | Ошибка | Решение |
81
+ |---|---|
82
+ | `File not found` | Проверь путь к файлу |
83
+ | `timed out` | Код зависает или слишком долго выполняется — проверь на бесконечный цикл |
84
+ | `valgrind not found` | Linux: `apt install valgrind`; macOS/Windows: используй WSL |
85
+ | `py-spy needs elevated permissions` | Запусти с sudo (Linux) или используй fallback cProfile |
86
+
87
+ ## Платформенные ограничения
88
+
89
+ - `valgrind` — только Linux. На macOS не работает с 10.15+. На Windows — WSL.
90
+ - `py-spy` — работает везде, но на Linux требует sudo или ptrace прав.
91
+ - `cProfile` — встроен в Python, работает везде без sudo.
package/skills/race.md ADDED
@@ -0,0 +1,117 @@
1
+ # skill: fchek race — sanitizers и гонки данных
2
+
3
+ ## Что делает
4
+
5
+ Компилирует C/C++ код с активированными sanitizers и запускает его.
6
+ Sanitizers встроены в компилятор (gcc/clang) — они инструментируют код во время компиляции
7
+ и сообщают о проблемах в рантайме.
8
+
9
+ ## Поддерживаемые sanitizers
10
+
11
+ | Флаг | Название | Что ловит |
12
+ |---|---|---|
13
+ | `--tsan` | ThreadSanitizer | Гонки данных (data races) между потоками |
14
+ | `--asan` | AddressSanitizer | Buffer overflow, use-after-free, утечки памяти |
15
+ | `--ubsan` | UndefinedBehaviorSanitizer | Integer overflow, null deref, misalignment |
16
+ | `--all` | Все три | Запускает все последовательно |
17
+
18
+ ## Синтаксис
19
+
20
+ ```bash
21
+ fchek race <file.cpp> [--tsan | --asan | --ubsan | --all]
22
+ ```
23
+
24
+ По умолчанию (без флага): `--tsan`
25
+
26
+ ## Вывод JSON
27
+
28
+ ```json
29
+ {
30
+ "status": "ok",
31
+ "command": "race",
32
+ "data": {
33
+ "file": "/path/to/threaded.cpp",
34
+ "build_system": "single",
35
+ "compiler": "g++",
36
+ "timeout_ms": 30000,
37
+ "sanitizers": [
38
+ {
39
+ "sanitizer": "ThreadSanitizer",
40
+ "compiled": true,
41
+ "timed_out": false,
42
+ "issues": [
43
+ {
44
+ "sanitizer": "ThreadSanitizer",
45
+ "headline": "ERROR: ThreadSanitizer: data race at 0x...",
46
+ "stack": ["#0 worker() threaded.cpp:42", "#1 ..."]
47
+ }
48
+ ],
49
+ "raw_output": "..."
50
+ }
51
+ ],
52
+ "summary": {
53
+ "total_issues": 1,
54
+ "verdict": "issues_found"
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ `verdict`: `"clean"` или `"issues_found"`
61
+
62
+ ## Как AI должен использовать это
63
+
64
+ ### Сценарий: "Многопоточный код, подозрение на race condition"
65
+
66
+ ```bash
67
+ # 1. Проверь на гонки данных
68
+ fchek race threaded.cpp --tsan
69
+
70
+ # 2. Разбери JSON — смотри summary.verdict
71
+ # 3. Если verdict = "issues_found" → читай issues[].headline и issues[].stack
72
+ # 4. Найди файл:строку в stack trace → перейди через goto
73
+ fchek goto threaded.cpp:42
74
+ ```
75
+
76
+ ### Сценарий: "Подозрение на утечку памяти"
77
+
78
+ ```bash
79
+ fchek race memory.cpp --asan
80
+ # Смотри issues с "heap-use-after-free" или "LeakSanitizer"
81
+ ```
82
+
83
+ ### Алгоритм принятия решений
84
+
85
+ ```
86
+ ЕСЛИ подозреваешь гонку данных (два потока пишут одну переменную):
87
+ → fchek race file.cpp --tsan
88
+
89
+ ЕСЛИ подозреваешь утечку / выход за границы массива:
90
+ → fchek race file.cpp --asan
91
+
92
+ ЕСЛИ не уверен что именно:
93
+ → fchek race file.cpp --all
94
+ ```
95
+
96
+ ## Платформенные ограничения
97
+
98
+ - **Linux** — полная поддержка (gcc + clang)
99
+ - **macOS** — только clang (Apple clang поддерживает -fsanitize). Valgrind не работает.
100
+ - **Windows** — sanitizers **не работают** с MinGW/MSVC. Используй WSL.
101
+
102
+ Если `fchek doctor` показывает `"win32"` → предупреди пользователя что нужен WSL.
103
+
104
+ ## Многофайловые проекты
105
+
106
+ Текущая версия компилирует один файл. Если проект использует CMake или Makefile,
107
+ компилируй весь проект вручную с флагами sanitizer и передай итоговый бинарь.
108
+ `build_system` в выводе показывает что было найдено в родительских директориях.
109
+
110
+ ## Частые ошибки и решения
111
+
112
+ | Ошибка | Решение |
113
+ |---|---|
114
+ | `compiled: false` | Ошибка компиляции — смотри поле `error` |
115
+ | `timed_out: true` | Код завис — проверь на бесконечный цикл |
116
+ | Нет вывода sanitizer | Проблем не обнаружено или код не выполняет нужный путь |
117
+ | ThreadSanitizer + AddressSanitizer вместе | Нельзя комбинировать, запускай раздельно |
package/skills/repl.md ADDED
@@ -0,0 +1,81 @@
1
+ # skill: fchek repl — интерактивный REPL
2
+
3
+ ## Что делает
4
+
5
+ Запускает интерактивный режим где процесс остаётся живым между командами.
6
+ Все команды fchek доступны внутри REPL без перезапуска.
7
+
8
+ **Отличие от state:**
9
+ - `repl` = in-memory → переменные живут только пока REPL запущен
10
+ - `state` = disk → данные живут между запусками процесса
11
+
12
+ Используй REPL для быстрой итерации в одной сессии.
13
+ Используй state для сохранения контекста между сессиями.
14
+
15
+ ## Запуск
16
+
17
+ ```bash
18
+ fchek repl
19
+ ```
20
+
21
+ ## Команды внутри REPL
22
+
23
+ ```
24
+ fchek> profile <file> [app|web] # профилировать
25
+ fchek> race <file.cpp> [--asan] # sanitizers
26
+ fchek> goto <file:line> # LSP навигация
27
+ fchek> state <action> [key] [val] # дисковое состояние
28
+ fchek> set <key> <value> # session-переменная (только память)
29
+ fchek> get <key> # читать session-переменную
30
+ fchek> vars # список всех session-переменных
31
+ fchek> clear # очистить экран
32
+ fchek> help # справка
33
+ fchek> exit # выйти
34
+ ```
35
+
36
+ ## Вывод
37
+
38
+ Каждая команда выводит JSON — тот же формат что и CLI.
39
+
40
+ ```
41
+ fchek> set task "profile the auth module"
42
+ {"status":"ok","command":"repl","data":{"set":"task","value":"profile the auth module"}}
43
+
44
+ fchek> profile src/auth.py
45
+ {"status":"ok","command":"profile","data":{"file":"/project/src/auth.py",...}}
46
+ ```
47
+
48
+ ## Как AI должен использовать это
49
+
50
+ ### Сценарий: "Хочу быстро проверить несколько файлов"
51
+
52
+ ```
53
+ fchek> profile src/auth.py
54
+ # → смотрю top_functions
55
+ fchek> goto src/auth.py:42
56
+ # → нахожу определение медленной функции
57
+ fchek> set bottleneck "auth.py:42 process_token()"
58
+ fchek> race src/auth.cpp --asan
59
+ # → проверяю на утечки
60
+ ```
61
+
62
+ ### Session-переменные vs State
63
+
64
+ ```
65
+ # Временно в сессии (исчезнет при exit):
66
+ fchek> set draft "trying approach X"
67
+
68
+ # Надолго (переживёт перезапуск):
69
+ fchek> state set approach "trying approach X"
70
+ ```
71
+
72
+ ### Автодополнение
73
+
74
+ REPL поддерживает Tab для автодополнения команд.
75
+ История команд — стрелки вверх/вниз (последние 100 команд).
76
+
77
+ ## Ограничения
78
+
79
+ - Session-переменные (`set`/`get`) живут только в рамках одного запуска REPL
80
+ - Параллельный запуск нескольких REPL-сессий не синхронизирован — каждая независима
81
+ - Для долгосрочной памяти всегда используй `state`, не `set`
@@ -0,0 +1,318 @@
1
+ # rules.md — Жёсткие правила для агента
2
+
3
+ Каждое правило здесь — это ЗАПРЕТ или ТРЕБОВАНИЕ.
4
+ Нарушение = ошибка агента, даже если код "выглядит правильно".
5
+
6
+ ---
7
+
8
+ ## ПРАВИЛО 1 — Нельзя говорить «готово» без fchek run exit_code=0
9
+
10
+ ### ЗАПРЕЩЕНО:
11
+ ```
12
+ User: Исправь функцию parse_data()
13
+ AI: Я переписал функцию. Теперь она корректно обрабатывает edge cases. Готово.
14
+ ```
15
+
16
+ ### ОБЯЗАТЕЛЬНО:
17
+ ```bash
18
+ fchek run src/parser.py
19
+ ```
20
+ ```json
21
+ {
22
+ "status": "ok",
23
+ "data": {
24
+ "exit_code": 0,
25
+ "success": true,
26
+ "stdout": "parsed 42 items\n",
27
+ "stderr": ""
28
+ }
29
+ }
30
+ ```
31
+ Только если `exit_code: 0` И `success: true` — разрешено говорить «работает» / «готово».
32
+
33
+ **Единственное исключение:** код это черновик, явно помечен как «набросок» или «псевдокод».
34
+
35
+ ---
36
+
37
+ ## ПРАВИЛО 2 — Нельзя говорить «тесты проходят» без fchek test verdict=all_passed
38
+
39
+ ### ЗАПРЕЩЕНО:
40
+ ```
41
+ AI: Я обновил код. Все тесты проходят.
42
+ ```
43
+
44
+ ### ОБЯЗАТЕЛЬНО:
45
+ ```bash
46
+ fchek test .
47
+ ```
48
+ ```json
49
+ {
50
+ "status": "ok",
51
+ "data": {
52
+ "verdict": "all_passed",
53
+ "passed": 14,
54
+ "failed": 0,
55
+ "skipped": 0
56
+ }
57
+ }
58
+ ```
59
+ Только `verdict: "all_passed"` И `failed: 0` → разрешено говорить «тесты проходят».
60
+
61
+ Если `verdict: "failures_found"` — читай `failures[].test` и `failures[].reason`, исправь, запусти снова.
62
+
63
+ ---
64
+
65
+ ## ПРАВИЛО 3 — Нельзя создавать символ без проверки fchek context
66
+
67
+ ### ЗАПРЕЩЕНО:
68
+ ```python
69
+ # Сразу писать код
70
+ class UserRepository:
71
+ def save(self, user): ...
72
+ ```
73
+
74
+ ### ОБЯЗАТЕЛЬНО:
75
+ ```bash
76
+ fchek context src/ --names-only
77
+ ```
78
+ ```json
79
+ {
80
+ "status": "ok",
81
+ "data": {
82
+ "name_index": {
83
+ "UserRepository": [{"file": "src/repos/user.py", "line": 12}],
84
+ "save": [{"file": "src/repos/base.py", "line": 45}]
85
+ },
86
+ "duplicates": []
87
+ }
88
+ }
89
+ ```
90
+ Читай `name_index`. Если нужное имя там есть:
91
+ - Используй существующее
92
+ - Или выбери другое имя
93
+ - Или уточни у пользователя
94
+
95
+ Нельзя создавать дубликат класса/функции не спросив.
96
+
97
+ ---
98
+
99
+ ## ПРАВИЛО 4 — Нельзя использовать библиотеку без fchek deps-check
100
+
101
+ ### ЗАПРЕЩЕНО:
102
+ ```javascript
103
+ // Писать на основе памяти о библиотеке
104
+ const result = await axios.get(url, { validateStatus: false });
105
+ ```
106
+
107
+ ### ОБЯЗАТЕЛЬНО:
108
+ ```bash
109
+ fchek deps-check axios --lang=js
110
+ ```
111
+ ```json
112
+ {
113
+ "status": "ok",
114
+ "data": {
115
+ "package": "axios",
116
+ "installed_version": "0.27.2",
117
+ "latest_version": "1.6.0",
118
+ "installed_deprecated": null,
119
+ "deprecation_notices": ["validateStatus option deprecated in 1.x — use axios.isAxiosError()"]
120
+ }
121
+ }
122
+ ```
123
+ Читай:
124
+ - `installed_version` vs `latest_version` — несоответствие? Уведомь пользователя
125
+ - `installed_deprecated` — если не null, библиотека устарела, предложи альтернативу
126
+ - `deprecation_notices[]` — используй актуальный API
127
+
128
+ ---
129
+
130
+ ## ПРАВИЛО 5 — Нельзя коммитить с секретами (fchek secrets verdict=clean)
131
+
132
+ ### ЗАПРЕЩЕНО:
133
+ ```bash
134
+ # Коммитить файл с захардкоженными секретами
135
+ fchek git commit "feat: add database connection"
136
+ # (файл содержит: DB_URL = "postgresql://admin:Secret123@...")
137
+ ```
138
+
139
+ ### ОБЯЗАТЕЛЬНО:
140
+ ```bash
141
+ fchek secrets .
142
+ ```
143
+ ```json
144
+ {
145
+ "status": "ok",
146
+ "data": {
147
+ "verdict": "clean",
148
+ "total_findings": 0,
149
+ "summary": {"critical": 0, "high": 0, "other": 0}
150
+ }
151
+ }
152
+ ```
153
+
154
+ Если `verdict ≠ "clean"`:
155
+ 1. Читай `findings[].file` и `findings[].line`
156
+ 2. Замени на переменные окружения
157
+ 3. Запусти снова → получи `verdict: "clean"`
158
+ 4. Только после этого коммить
159
+
160
+ Ни при каких условиях не коммитить код с `verdict: "critical"`.
161
+
162
+ ---
163
+
164
+ ## ПРАВИЛО 6 — Нельзя коммитить с failing tests
165
+
166
+ ### ЗАПРЕЩЕНО:
167
+ ```bash
168
+ fchek test .
169
+ # → verdict: "failures_found", failed: 2
170
+
171
+ fchek git commit "feat: add feature X"
172
+ # ❌ Два теста падают, коммитить нельзя
173
+ ```
174
+
175
+ ### ОБЯЗАТЕЛЬНО:
176
+ ```bash
177
+ fchek test .
178
+ # → verdict: "all_passed", failed: 0
179
+
180
+ fchek git commit "feat: add feature X"
181
+ # ✓ Все тесты зелёные — коммитить можно
182
+ ```
183
+
184
+ ---
185
+
186
+ ## ПРАВИЛО 7 — Нельзя пушить — это решение человека
187
+
188
+ ### ЗАПРЕЩЕНО:
189
+ ```bash
190
+ fchek git push origin main
191
+ ```
192
+
193
+ ### ОБЯЗАТЕЛЬНО:
194
+ Никогда не выполняй `git push`. Остановись на коммите.
195
+
196
+ Доклад должен заканчиваться на:
197
+ ```
198
+ Коммит: feat: implement feature X (a3f9c2d)
199
+
200
+ Для отправки в remote выполни:
201
+ git push origin feat/feature-x
202
+ ```
203
+
204
+ Решение пушить принимает только человек.
205
+
206
+ ---
207
+
208
+ ## ПРАВИЛО 8 — Нельзя удалять файлы без явного указания
209
+
210
+ ### ЗАПРЕЩЕНО:
211
+ ```
212
+ User: Рефактор проекта — убери дублирование
213
+ AI: [удаляет src/old_api.py потому что выглядит как legacy]
214
+ ```
215
+
216
+ ### ОБЯЗАТЕЛЬНО:
217
+ Удаление файла требует явного указания в задаче:
218
+ - «удали файл X»
219
+ - «почисти старые модули: X, Y, Z»
220
+ - «убери всё что связано с feature_flag_X»
221
+
222
+ Если задача неявная — спроси:
223
+ ```
224
+ Нашёл old_api.py который выглядит как legacy код.
225
+ Удалить его? (14 ссылок в других файлах)
226
+ ```
227
+
228
+ ---
229
+
230
+ ## Примеры правильных диалогов
231
+
232
+ ### ✅ Правило 1 + 2: перед «готово» показывай вывод
233
+
234
+ ```
235
+ User: Исправь баг в calculate_tax()
236
+ AI: [исправляет код]
237
+
238
+ fchek run src/pricing.py
239
+ → exit_code: 0
240
+
241
+ fchek test .
242
+ → verdict: all_passed (12 passed)
243
+
244
+ Исправил баг. Тесты проходят.
245
+ ```
246
+
247
+ ---
248
+
249
+ ### ✅ Правило 3: проверь name_index перед созданием
250
+
251
+ ```
252
+ User: Добавь класс EmailValidator
253
+ AI: fchek context src/ --names-only
254
+ → name_index содержит EmailValidator в src/validators.py:34
255
+
256
+ Класс EmailValidator уже существует.
257
+ Использовать существующий или нужен новый с другой логикой?
258
+ ```
259
+
260
+ ---
261
+
262
+ ### ✅ Правило 4: проверь библиотеку перед использованием
263
+
264
+ ```
265
+ User: Добавь отправку email через sendgrid
266
+ AI: fchek deps-check sendgrid --lang=python
267
+ → installed_version: 6.9.0, latest_version: 6.11.0
268
+ → deprecation_notices: ["send() метод deprecated — используй send_mail()"]
269
+
270
+ Установленная версия sendgrid (6.9.0) устарела.
271
+ Обновить до 6.11.0? API send() заменён на send_mail().
272
+ ```
273
+
274
+ ---
275
+
276
+ ### ✅ Правило 5: проверь секреты перед коммитом
277
+
278
+ ```
279
+ User: Добавь подключение к Stripe API
280
+ AI: [пишет код с переменной окружения]
281
+
282
+ fchek secrets .
283
+ → verdict: clean
284
+
285
+ Добавил подключение к Stripe через STRIPE_SECRET_KEY env var.
286
+
287
+ fchek git commit "feat: integrate Stripe payment"
288
+ ```
289
+
290
+ ---
291
+
292
+ ### ✅ Правило 7: не пушить без разрешения
293
+
294
+ ```
295
+ AI: Коммит: feat: add user authentication (a3f9c2d)
296
+
297
+ Для отправки в remote выполни:
298
+ git push origin feat/auth
299
+
300
+ [НЕ выполняется git push автоматически]
301
+ ```
302
+
303
+ ---
304
+
305
+ ## Матрица строгости правил
306
+
307
+ | Правило | Нарушение = блокер | Можно отложить? | Исключения |
308
+ |---|---|---|---|
309
+ | 1. fchek run | Да | Нет | Черновики |
310
+ | 2. fchek test | Да | Нет | Нет |
311
+ | 3. fchek context | Да | Нет | Новый проект без файлов |
312
+ | 4. fchek deps-check | Нет (warning) | Да | Stdlib |
313
+ | 5. fchek secrets | Да | Нет | Нет |
314
+ | 6. no failing tests | Да | Нет | Нет |
315
+ | 7. no git push | Да | Нет | Нет |
316
+ | 8. no file delete | Да | Нет | Явно указано в задаче |
317
+
318
+ Правила 1, 2, 5, 6, 7, 8 — абсолютные. Нарушение блокирует завершение задачи.