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/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 и т.д.)
@@ -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` в проекте — без него может дать мало находок