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/deps.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# skill: fchek deps — dependency граф и dead code
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Показывает что импортируется/зависит от чего, что не используется совсем,
|
|
6
|
+
и какие пакеты лишние. Невозможно держать в голове по всему проекту — пусть делает инструмент.
|
|
7
|
+
|
|
8
|
+
## Поддерживаемые языки
|
|
9
|
+
|
|
10
|
+
| Язык | Инструменты | Что находит |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Python | ruff (F401) + vulture + pydeps | unused imports, dead functions, граф |
|
|
13
|
+
| Rust | cargo-machete + cargo-udeps | unused Cargo.toml зависимости |
|
|
14
|
+
| JS/TS | madge + depcheck | circular deps, unused npm packages |
|
|
15
|
+
| Go | go mod + deadcode | unused modules, dead functions |
|
|
16
|
+
|
|
17
|
+
## Синтаксис
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
fchek deps <file_or_dir> [--graph] [--unused-only]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `--graph` — включить полный граф зависимостей (может быть большим)
|
|
24
|
+
- `--unused-only` — показать только неиспользуемое
|
|
25
|
+
|
|
26
|
+
## Вывод JSON
|
|
27
|
+
|
|
28
|
+
### Python
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"status": "ok",
|
|
32
|
+
"command": "deps",
|
|
33
|
+
"data": {
|
|
34
|
+
"target": "src/",
|
|
35
|
+
"lang": "python",
|
|
36
|
+
"tools_used": ["ruff", "vulture"],
|
|
37
|
+
"unused_imports": [
|
|
38
|
+
{ "file": "src/auth.py", "line": 3, "symbol": "'os' imported but unused", "code": "F401" }
|
|
39
|
+
],
|
|
40
|
+
"dead_code": [
|
|
41
|
+
{ "file": "src/utils.py", "line": 42, "issue": "unused function 'helper' (80% confidence)" }
|
|
42
|
+
],
|
|
43
|
+
"graph": null
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Rust
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"data": {
|
|
52
|
+
"lang": "rust",
|
|
53
|
+
"tools_used": ["cargo-machete"],
|
|
54
|
+
"unused_deps": ["serde_json", "regex"],
|
|
55
|
+
"machete_raw": "The following packages are not used: serde_json, regex"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### JS/TS
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"data": {
|
|
64
|
+
"lang": "javascript",
|
|
65
|
+
"tools_used": ["madge", "depcheck"],
|
|
66
|
+
"circular_deps": [["src/a.ts", "src/b.ts", "src/a.ts"]],
|
|
67
|
+
"circular_count": 1,
|
|
68
|
+
"unused_packages": ["lodash", "moment"],
|
|
69
|
+
"unused_dev_packages": ["jest-circus"],
|
|
70
|
+
"missing_packages": ["react-dom"]
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Как AI должен использовать это
|
|
76
|
+
|
|
77
|
+
### Сценарий: "Почистить проект перед релизом"
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 1. Найти всё лишнее
|
|
81
|
+
fchek deps .
|
|
82
|
+
|
|
83
|
+
# 2. Python: unused_imports → удали импорты или fchek lint для автофикса
|
|
84
|
+
fchek lint src/ --strict
|
|
85
|
+
|
|
86
|
+
# 3. Rust: unused_deps → удали из Cargo.toml
|
|
87
|
+
# "unused_deps": ["regex"] → убери regex из [dependencies]
|
|
88
|
+
|
|
89
|
+
# 4. JS: unused_packages → удали из package.json
|
|
90
|
+
# npm uninstall lodash moment
|
|
91
|
+
|
|
92
|
+
# 5. circular_deps → это архитектурный баг → исправь вручную
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Сценарий: "Найти мёртвый код"
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
fchek deps src/ --unused-only
|
|
99
|
+
# → dead_code[] содержит функции/классы с низкой уверенностью использования
|
|
100
|
+
# → для каждого: fchek goto <file:line> → проверь references
|
|
101
|
+
fchek goto src/utils.py:42
|
|
102
|
+
# Если ref_count = 0 → безопасно удалить
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Алгоритм принятия решений
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
ЕСЛИ unused_imports не пустой:
|
|
109
|
+
→ запусти fchek lint --fix для автоматического удаления
|
|
110
|
+
|
|
111
|
+
ЕСЛИ dead_code содержит items с confidence > 80%:
|
|
112
|
+
→ высокая уверенность → проверь через goto → удали если ref_count = 0
|
|
113
|
+
|
|
114
|
+
ЕСЛИ circular_deps не пустой:
|
|
115
|
+
→ это архитектурная проблема
|
|
116
|
+
→ нельзя фиксировать автоматически
|
|
117
|
+
→ нужен рефакторинг структуры модулей
|
|
118
|
+
|
|
119
|
+
ЕСЛИ unused_packages (JS):
|
|
120
|
+
→ npm uninstall <package> для production deps
|
|
121
|
+
→ npm uninstall --save-dev <package> для devDeps
|
|
122
|
+
|
|
123
|
+
ЕСЛИ missing_packages (JS) не пустой:
|
|
124
|
+
→ код использует пакеты которых нет в package.json
|
|
125
|
+
→ npm install <package>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Ключевые поля для AI
|
|
129
|
+
|
|
130
|
+
| Поле | Что означает |
|
|
131
|
+
|---|---|
|
|
132
|
+
| `unused_imports[]` | Импорты которые объявлены но не используются |
|
|
133
|
+
| `dead_code[]` | Функции/классы которые (вероятно) нигде не вызываются |
|
|
134
|
+
| `circular_deps[]` | Циклические зависимости — A→B→A |
|
|
135
|
+
| `unused_deps[]` | Пакеты в зависимостях которые не используются в коде |
|
|
136
|
+
| `missing_packages[]` | Пакеты используются в коде но не объявлены |
|
|
137
|
+
|
|
138
|
+
## Точность
|
|
139
|
+
|
|
140
|
+
- `vulture` может давать false positives (помечает код используемый через reflection/eval)
|
|
141
|
+
- Для Rust `cargo-machete` быстрее и не требует nightly; `cargo-udeps` точнее но нужен nightly
|
|
142
|
+
- `madge` анализирует статические import/require — динамические import() не всегда находит
|
|
143
|
+
- `depcheck` может не видеть зависимости используемые через конфиги (babel, jest и т.д.)
|
package/skills/docker.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# skill: fchek docker — Работа с контейнерами
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Предоставляет интерфейс к Docker CLI. Позволяет просматривать запущенные контейнеры и получать логи для отладки приложений.
|
|
6
|
+
|
|
7
|
+
## Синтаксис
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Показать запущенные контейнеры (добавь --all для всех)
|
|
11
|
+
fchek docker list [--all]
|
|
12
|
+
|
|
13
|
+
# Получить логи контейнера (по умолчанию последние 50 строк)
|
|
14
|
+
fchek docker logs <container_name_or_id> [--tail=<num>]
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Вывод JSON
|
|
18
|
+
|
|
19
|
+
### docker list
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"status": "ok",
|
|
23
|
+
"command": "docker",
|
|
24
|
+
"data": {
|
|
25
|
+
"containers": [
|
|
26
|
+
{
|
|
27
|
+
"ID": "a1b2c3d4e5f6",
|
|
28
|
+
"Names": "web-app",
|
|
29
|
+
"Image": "node:22",
|
|
30
|
+
"Status": "Up 2 hours",
|
|
31
|
+
"Ports": "0.0.0.0:8080->8080/tcp"
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### docker logs
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"status": "ok",
|
|
42
|
+
"command": "docker",
|
|
43
|
+
"data": {
|
|
44
|
+
"container": "web-app",
|
|
45
|
+
"logs": "Server running at http://localhost:8080\n"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## КАК AI ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТО
|
|
51
|
+
|
|
52
|
+
### Сценарии
|
|
53
|
+
|
|
54
|
+
1. **Контейнер упал**: проверь список всех контейнеров, чтобы увидеть статус:
|
|
55
|
+
```bash
|
|
56
|
+
fchek docker list --all
|
|
57
|
+
```
|
|
58
|
+
2. **Отладка ошибок**: получи логи контейнера для локализации проблемы:
|
|
59
|
+
```bash
|
|
60
|
+
fchek docker logs web-app --tail=100
|
|
61
|
+
```
|
package/skills/dom.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# skill: fchek dom — Web автоматизация и парсинг HTML
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Загружает веб-страницу по URL или открывает локальный HTML-файл и извлекает элементы с помощью простых селекторов (теги, классы, ID). Позволяет получать текстовое содержимое, внутренний HTML-код или значения атрибутов.
|
|
6
|
+
|
|
7
|
+
## Синтаксис
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Получить все ссылки с их HTML и текстом
|
|
11
|
+
fchek dom https://example.com a
|
|
12
|
+
|
|
13
|
+
# Получить значение атрибута href для всех ссылок
|
|
14
|
+
fchek dom https://example.com a --attr=href
|
|
15
|
+
|
|
16
|
+
# Найти элемент с ID header в локальном файле
|
|
17
|
+
fchek dom index.html #header
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Вывод JSON
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"status": "ok",
|
|
25
|
+
"command": "dom",
|
|
26
|
+
"data": {
|
|
27
|
+
"source": "index.html",
|
|
28
|
+
"selector": "#header",
|
|
29
|
+
"count": 1,
|
|
30
|
+
"matches": [
|
|
31
|
+
{
|
|
32
|
+
"tag": "div",
|
|
33
|
+
"attributes": {
|
|
34
|
+
"id": "header",
|
|
35
|
+
"class": "banner"
|
|
36
|
+
},
|
|
37
|
+
"text": "Welcome to my website",
|
|
38
|
+
"html": "<div id=\"header\" class=\"banner\">Welcome to my website</div>"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## КАК AI ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТО
|
|
46
|
+
|
|
47
|
+
### Сценарии
|
|
48
|
+
|
|
49
|
+
1. **Проверка UI**: после запуска веб-сервера проверь структуру страницы:
|
|
50
|
+
```bash
|
|
51
|
+
fchek dom http://localhost:3000 h1
|
|
52
|
+
```
|
|
53
|
+
2. **Извлечение данных**: собери все ссылки или пути изображений из файла разметки:
|
|
54
|
+
```bash
|
|
55
|
+
fchek dom dist/index.html img --attr=src
|
|
56
|
+
```
|
package/skills/fuzz.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# skill: fchek fuzz — fuzzing на минималках
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Запускает fuzzer — инструмент который генерирует случайные/мутированные входы
|
|
6
|
+
и ищет краши, зависания, неожиданное поведение.
|
|
7
|
+
Находит edge cases которые ты никогда не напишешь вручную.
|
|
8
|
+
|
|
9
|
+
## Поддерживаемые языки
|
|
10
|
+
|
|
11
|
+
| Язык | Инструмент | Установка |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| C/C++ | AFL++ | `apt install afl++` (Linux/macOS) |
|
|
14
|
+
| Rust | cargo-fuzz (libFuzzer) | `cargo install cargo-fuzz` + nightly |
|
|
15
|
+
| Python | Atheris (Google libFuzzer) | `pip install atheris` (Linux/macOS) |
|
|
16
|
+
| Go | go test -fuzz | встроен в Go 1.18+ |
|
|
17
|
+
|
|
18
|
+
## Синтаксис
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
fchek fuzz <file> [--duration=60] [--target=<name>] [--corpus=<dir>]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `--duration=60` — сколько секунд фаззить (default: 60)
|
|
25
|
+
- `--target=<name>` — имя fuzz-цели (Rust: имя файла в fuzz/fuzz_targets/, Go: имя Fuzz* функции)
|
|
26
|
+
- `--corpus=<dir>` — директория с seed-входами (начальные примеры для мутации)
|
|
27
|
+
|
|
28
|
+
**Начни с `--duration=30` чтобы проверить что setup работает.**
|
|
29
|
+
|
|
30
|
+
## Вывод JSON
|
|
31
|
+
|
|
32
|
+
### Чисто (no crash)
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"status": "ok",
|
|
36
|
+
"command": "fuzz",
|
|
37
|
+
"data": {
|
|
38
|
+
"file": "/project/parse_input.c",
|
|
39
|
+
"lang": "c",
|
|
40
|
+
"tool": "AFL++",
|
|
41
|
+
"duration_s": 60,
|
|
42
|
+
"crashes_found": 0,
|
|
43
|
+
"hangs_found": 0,
|
|
44
|
+
"queue_entries": 47,
|
|
45
|
+
"verdict": "clean",
|
|
46
|
+
"findings_dir": "/tmp/fchek_findings"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Краш найден
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"data": {
|
|
55
|
+
"crashes_found": 3,
|
|
56
|
+
"verdict": "crashes_found",
|
|
57
|
+
"findings_dir": "/tmp/fchek_findings/default/crashes"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Rust
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"data": {
|
|
66
|
+
"lang": "rust",
|
|
67
|
+
"tool": "cargo-fuzz (libFuzzer)",
|
|
68
|
+
"fuzz_target": "fuzz_parse",
|
|
69
|
+
"crashed": true,
|
|
70
|
+
"crash_reason": "heap-use-after-free on address 0x...",
|
|
71
|
+
"execs_per_sec": 12400,
|
|
72
|
+
"coverage_points": 342,
|
|
73
|
+
"verdict": "crash_found"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Как AI должен использовать это
|
|
79
|
+
|
|
80
|
+
### Сценарий: "Проверить парсер на краши"
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# 1. Запустить fuzzer на 60 секунд
|
|
84
|
+
fchek fuzz parse_input.c --duration=60
|
|
85
|
+
|
|
86
|
+
# 2. Если crashes_found > 0:
|
|
87
|
+
ls /tmp/fchek_findings/default/crashes/
|
|
88
|
+
# → каждый файл в этой папке = входные данные которые крашат программу
|
|
89
|
+
# → запусти вручную чтобы воспроизвести:
|
|
90
|
+
./parse_input < /tmp/fchek_findings/default/crashes/id:000000,...
|
|
91
|
+
|
|
92
|
+
# 3. Если verdict = "clean" — либо багов нет, либо нужно больше времени
|
|
93
|
+
fchek fuzz parse_input.c --duration=300 # 5 минут
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Сценарий: "Rust fuzz target"
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Сначала создай fuzz target если нет:
|
|
100
|
+
# cargo fuzz add fuzz_parse
|
|
101
|
+
# (отредактируй fuzz/fuzz_targets/fuzz_parse.rs)
|
|
102
|
+
|
|
103
|
+
fchek fuzz . --target=fuzz_parse --duration=60
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Сценарий: "Python — auto harness"
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Если в файле нет atheris кода — fchek создаёт harness автоматически
|
|
110
|
+
# Ищет функции parse(), process() как точки входа
|
|
111
|
+
fchek fuzz my_parser.py --duration=30
|
|
112
|
+
|
|
113
|
+
# Если auto_harness: true в выводе — harness сгенерирован автоматически
|
|
114
|
+
# Для точного контроля — напиши fuzz target вручную с FuzzedDataProvider
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Алгоритм принятия решений
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
ЕСЛИ verdict = "crashes_found" или crashed: true:
|
|
121
|
+
→ КРИТИЧНО — найден баг
|
|
122
|
+
→ смотри crash_reason (AddressSanitizer / heap-use-after-free / etc.)
|
|
123
|
+
→ находки лежат в findings_dir/default/crashes/
|
|
124
|
+
→ воспроизведи минимальный краш-кейс
|
|
125
|
+
→ исправь → запусти fuzz снова для проверки
|
|
126
|
+
|
|
127
|
+
ЕСЛИ verdict = "hangs_found":
|
|
128
|
+
→ найдены входы вызывающие зависание
|
|
129
|
+
→ возможен бесконечный цикл при определённых условиях
|
|
130
|
+
→ смотри findings_dir/default/hangs/
|
|
131
|
+
|
|
132
|
+
ЕСЛИ verdict = "clean":
|
|
133
|
+
→ за этот период багов не найдено
|
|
134
|
+
→ не значит что их нет — fuzzing статистический
|
|
135
|
+
→ увеличь --duration для большей уверенности
|
|
136
|
+
|
|
137
|
+
ЕСЛИ queue_entries высокий (AFL++):
|
|
138
|
+
→ fuzzer нашёл много интересных путей выполнения
|
|
139
|
+
→ хороший знак — coverage растёт
|
|
140
|
+
|
|
141
|
+
ЕСЛИ execs_per_sec очень низкий:
|
|
142
|
+
→ код работает медленно → сначала fchek profile
|
|
143
|
+
→ медленный код = медленный fuzzing = меньше охвата
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Что делать с найденными крашами
|
|
147
|
+
|
|
148
|
+
1. Файлы в `findings_dir/default/crashes/` — это минимальные входы вызывающие краш
|
|
149
|
+
2. Воспроизведи каждый вручную и убедись что воспроизводится
|
|
150
|
+
3. Добавь как regression test
|
|
151
|
+
4. Исправь баг
|
|
152
|
+
5. Запусти `fchek fuzz` снова — убедись что crash не воспроизводится
|
|
153
|
+
|
|
154
|
+
## Платформенные ограничения
|
|
155
|
+
|
|
156
|
+
| Инструмент | Linux | macOS | Windows |
|
|
157
|
+
|---|---|---|---|
|
|
158
|
+
| AFL++ | ✓ | ✓ (brew) | ✗ WSL |
|
|
159
|
+
| cargo-fuzz | ✓ | ✓ | частично |
|
|
160
|
+
| Atheris | ✓ | ✓ (clang) | ✗ |
|
|
161
|
+
| go test -fuzz | ✓ | ✓ | ✓ |
|
|
162
|
+
|
|
163
|
+
## Требования к Rust fuzzing
|
|
164
|
+
|
|
165
|
+
- `cargo install cargo-fuzz`
|
|
166
|
+
- `rustup default nightly` (cargo-fuzz требует nightly)
|
|
167
|
+
- Наличие fuzz targets в `fuzz/fuzz_targets/*.rs`
|
package/skills/goto.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# skill: fchek goto — LSP навигация по коду
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Показывает определение символа на заданной строке и все места где этот символ используется.
|
|
6
|
+
Работает в batch-режиме (без открытия редактора) — через LSP-протокол напрямую.
|
|
7
|
+
|
|
8
|
+
## Поддерживаемые языки
|
|
9
|
+
|
|
10
|
+
| Расширение | LSP сервер | Установка |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `.rs` | rust-analyzer | `rustup component add rust-analyzer` |
|
|
13
|
+
| `.cpp` / `.cc` / `.c` | clangd | `apt install clangd` |
|
|
14
|
+
| `.py` | pyright | `pip install pyright` |
|
|
15
|
+
| `.ts` / `.js` | typescript-language-server | `npm install -g typescript-language-server typescript` |
|
|
16
|
+
|
|
17
|
+
## Синтаксис
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
fchek goto <file:line>
|
|
21
|
+
fchek goto <file:line:col>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
- `line` — номер строки (начиная с 1)
|
|
25
|
+
- `col` — номер символа в строке (опционально, по умолчанию 0)
|
|
26
|
+
|
|
27
|
+
## Вывод JSON
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"status": "ok",
|
|
32
|
+
"command": "goto",
|
|
33
|
+
"data": {
|
|
34
|
+
"query": {
|
|
35
|
+
"file": "/path/to/main.rs",
|
|
36
|
+
"line": 42,
|
|
37
|
+
"col": 0
|
|
38
|
+
},
|
|
39
|
+
"lsp": {
|
|
40
|
+
"server": "rust-analyzer",
|
|
41
|
+
"language": "rust",
|
|
42
|
+
"root": "/path/to/project",
|
|
43
|
+
"timeout_ms": 15000
|
|
44
|
+
},
|
|
45
|
+
"definition": {
|
|
46
|
+
"file": "/path/to/utils.rs",
|
|
47
|
+
"line": 12,
|
|
48
|
+
"col": 4
|
|
49
|
+
},
|
|
50
|
+
"references": [
|
|
51
|
+
{ "file": "/path/to/main.rs", "line": 42, "col": 10 },
|
|
52
|
+
{ "file": "/path/to/tests.rs", "line": 8, "col": 3 }
|
|
53
|
+
],
|
|
54
|
+
"ref_count": 2
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`definition: null` означает что LSP не нашёл определение (возможно, символ — встроенный).
|
|
60
|
+
|
|
61
|
+
## Как AI должен использовать это
|
|
62
|
+
|
|
63
|
+
### Сценарий: "Хочу понять что делает функция на строке X"
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# 1. Перейди к определению
|
|
67
|
+
fchek goto main.rs:42
|
|
68
|
+
|
|
69
|
+
# 2. Прочитай файл определения: data.definition.file, начиная с data.definition.line
|
|
70
|
+
# 3. Посмотри все места использования: data.references
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Сценарий: "Хочу найти все места где используется эта функция перед рефакторингом"
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
fchek goto utils.py:15
|
|
77
|
+
# → data.references содержит все места вызова
|
|
78
|
+
# Это точнее чем grep — LSP понимает скоупы
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Алгоритм принятия решений
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
ЕСЛИ definition = null:
|
|
85
|
+
→ символ встроенный, или LSP не смог разрезолвить
|
|
86
|
+
→ попробуй col= точнее (укажи col начала идентификатора)
|
|
87
|
+
|
|
88
|
+
ЕСЛИ ref_count = 0:
|
|
89
|
+
→ функция нигде не используется (возможно мёртвый код)
|
|
90
|
+
|
|
91
|
+
ЕСЛИ LSP server not found:
|
|
92
|
+
→ запусти fchek doctor → посмотри что не установлено
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Автоопределение корня проекта
|
|
96
|
+
|
|
97
|
+
`fchek goto` ищет корень проекта вверх по директориям:
|
|
98
|
+
`Cargo.toml` / `package.json` / `CMakeLists.txt` / `.git` / `pyproject.toml` / `go.mod`
|
|
99
|
+
|
|
100
|
+
Это важно для LSP — он должен знать root чтобы найти все файлы проекта.
|
|
101
|
+
|
|
102
|
+
## Платформенные ограничения
|
|
103
|
+
|
|
104
|
+
- Работает на Linux, macOS, Windows (если LSP-сервер установлен)
|
|
105
|
+
- На Windows пути содержат `\` — fchek автоматически конвертирует в `file://` URI
|
|
106
|
+
- Первый запуск rust-analyzer может быть медленным (индексация проекта)
|
|
107
|
+
|
|
108
|
+
## Таймаут
|
|
109
|
+
|
|
110
|
+
По умолчанию 15 секунд. Если LSP не отвечает — возвращает `status: "error"` с описанием.
|
|
111
|
+
rust-analyzer на больших проектах может быть медленным при первом запуске.
|
package/skills/lint.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# skill: fchek lint — линтер + автофикс + diff
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Запускает лучший линтер для языка, применяет safe auto-fixes,
|
|
6
|
+
и показывает точный diff что именно изменилось.
|
|
7
|
+
Один вызов вместо "запусти линтер, посмотри вывод, примени fix, проверь что изменилось".
|
|
8
|
+
|
|
9
|
+
## Поддерживаемые языки
|
|
10
|
+
|
|
11
|
+
| Язык | Инструменты | Установка |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Python | ruff check + ruff format | `pip install ruff` |
|
|
14
|
+
| Rust | cargo clippy --fix | встроен в cargo |
|
|
15
|
+
| JS/TS | eslint --fix | `npm install -g eslint` |
|
|
16
|
+
| C/C++ | clang-tidy + clang-format | `apt install clang-tidy clang-format` |
|
|
17
|
+
| Go | gofmt -w + go vet | встроен в Go |
|
|
18
|
+
|
|
19
|
+
## Синтаксис
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
fchek lint <file_or_dir> [--no-fix] [--strict]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- `--no-fix` — только репорт, не менять файлы
|
|
26
|
+
- `--strict` — включить предупреждения (не только ошибки)
|
|
27
|
+
|
|
28
|
+
## Вывод JSON
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"status": "ok",
|
|
33
|
+
"command": "lint",
|
|
34
|
+
"data": {
|
|
35
|
+
"target": "src/auth.py",
|
|
36
|
+
"lang": "python",
|
|
37
|
+
"tool": "ruff",
|
|
38
|
+
"fix_applied": true,
|
|
39
|
+
"issues_before": 12,
|
|
40
|
+
"issues_after": 3,
|
|
41
|
+
"fixed_count": 9,
|
|
42
|
+
"remaining_issues": [
|
|
43
|
+
{ "file": "src/auth.py", "line": 42, "col": 1, "code": "E501", "message": "line too long (95 > 88)" }
|
|
44
|
+
],
|
|
45
|
+
"diff": [
|
|
46
|
+
{
|
|
47
|
+
"file": "src/auth.py",
|
|
48
|
+
"from_line": 15,
|
|
49
|
+
"changes": [
|
|
50
|
+
{ "op": "-", "line": 15, "text": "import os,sys" },
|
|
51
|
+
{ "op": "+", "line": 15, "text": "import os" },
|
|
52
|
+
{ "op": "+", "line": 16, "text": "import sys" }
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Как AI должен использовать это
|
|
61
|
+
|
|
62
|
+
### Сценарий: "Починить стиль перед коммитом"
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# 1. Применить все safe-fixes
|
|
66
|
+
fchek lint src/
|
|
67
|
+
|
|
68
|
+
# 2. Смотри remaining_issues — то что нельзя починить автоматически
|
|
69
|
+
# 3. Смотри diff — что именно изменилось
|
|
70
|
+
|
|
71
|
+
# Если хочешь только проверить без изменений:
|
|
72
|
+
fchek lint src/ --no-fix
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Сценарий: "Code review — найти все проблемы"
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
fchek lint . --strict --no-fix
|
|
79
|
+
# → remaining_issues содержит всё включая предупреждения
|
|
80
|
+
# → fix_applied: false → файлы не тронуты
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Алгоритм принятия решений
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
ЕСЛИ remaining_issues пустой после fix:
|
|
87
|
+
→ код чист ✓
|
|
88
|
+
|
|
89
|
+
ЕСЛИ remaining_issues не пустой:
|
|
90
|
+
→ issues которые нельзя починить автоматически
|
|
91
|
+
→ смотри code (E501, W0611 и т.д.)
|
|
92
|
+
→ реши сам: исправить вручную или добавить исключение
|
|
93
|
+
|
|
94
|
+
ЕСЛИ diff содержит изменения в логике (не только форматирование):
|
|
95
|
+
→ проверь через fchek bench что поведение не изменилось
|
|
96
|
+
|
|
97
|
+
ЕСЛИ fix_applied: true, но issues_before === issues_after:
|
|
98
|
+
→ все найденные проблемы — только ручные (lint не умеет их фиксить)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Ключевые поля для AI
|
|
102
|
+
|
|
103
|
+
| Поле | Что означает |
|
|
104
|
+
|---|---|
|
|
105
|
+
| `fixed_count` | Сколько проблем починено автоматически |
|
|
106
|
+
| `remaining_issues[]` | Что осталось — нужно исправить вручную |
|
|
107
|
+
| `diff[].changes` | op: `-` = удалено, `+` = добавлено, ` ` = контекст |
|
|
108
|
+
| `issue_count` | Общее число оставшихся проблем |
|
|
109
|
+
|
|
110
|
+
## Diff формат
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
{ "op": "-", "line": 15, "text": "import os,sys" } ← удалено
|
|
114
|
+
{ "op": "+", "line": 15, "text": "import os" } ← добавлено
|
|
115
|
+
{ "op": " ", "line": 16, "text": "import sys" } ← контекст (не изменилось)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Платформенные замечания
|
|
119
|
+
|
|
120
|
+
- `ruff` — самый быстрый Python линтер, заменяет flake8/pylint/isort за один вызов
|
|
121
|
+
- `cargo clippy --fix` требует чистого git состояния, или передай `--allow-dirty` (уже передаётся внутри)
|
|
122
|
+
- `clang-format` применяет форматирование по стилю проекта (`.clang-format` файл если есть)
|
|
123
|
+
- `eslint` требует конфиг `.eslintrc` в проекте — без него может дать мало находок
|