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.
- package/README.md +64 -0
- package/bin/fchek.js +107 -0
- package/lib/api.js +110 -0
- package/lib/audit.js +211 -0
- package/lib/bench.js +248 -0
- package/lib/config.js +191 -0
- package/lib/context.js +356 -0
- package/lib/convention.js +526 -0
- package/lib/coverage.js +604 -0
- package/lib/db.js +135 -0
- package/lib/deps-check.js +264 -0
- package/lib/deps.js +374 -0
- package/lib/docker.js +84 -0
- package/lib/doctor.js +149 -0
- package/lib/dom.js +226 -0
- package/lib/fuzz.js +470 -0
- package/lib/git.js +290 -0
- package/lib/goto.js +544 -0
- package/lib/launch.js +182 -0
- package/lib/lint.js +624 -0
- package/lib/new_features.test.js +181 -0
- package/lib/output.js +46 -0
- package/lib/port.js +173 -0
- package/lib/process.js +228 -0
- package/lib/profile.js +453 -0
- package/lib/python.js +41 -0
- package/lib/race.js +186 -0
- package/lib/registry.js +179 -0
- package/lib/repl.js +135 -0
- package/lib/run.js +403 -0
- package/lib/screenshot.js +152 -0
- package/lib/secrets.js +257 -0
- package/lib/state.js +219 -0
- package/lib/test.js +471 -0
- package/lib/vuln.js +253 -0
- package/lib/watch.js +240 -0
- package/lib/winlog.js +123 -0
- package/package.json +27 -0
- package/skills/ACTIVATE.md +274 -0
- package/skills/README.md +163 -0
- package/skills/agent.md +444 -0
- package/skills/api.md +47 -0
- package/skills/bench.md +117 -0
- package/skills/context.md +116 -0
- package/skills/convention.md +143 -0
- package/skills/coverage.md +99 -0
- package/skills/csharp.md +97 -0
- package/skills/db.md +66 -0
- package/skills/deps-check.md +135 -0
- package/skills/deps.md +143 -0
- package/skills/docker.md +61 -0
- package/skills/dom.md +56 -0
- package/skills/fuzz.md +167 -0
- package/skills/goto.md +111 -0
- package/skills/lint.md +123 -0
- package/skills/port.md +57 -0
- package/skills/profile.md +91 -0
- package/skills/race.md +117 -0
- package/skills/repl.md +81 -0
- package/skills/rules.md +318 -0
- package/skills/run.md +135 -0
- package/skills/secrets.md +170 -0
- package/skills/security.md +360 -0
- package/skills/state.md +261 -0
- package/skills/vuln.md +57 -0
- 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`
|
package/skills/rules.md
ADDED
|
@@ -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 — абсолютные. Нарушение блокирует завершение задачи.
|