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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# skill: fchek context — дамп символов проекта
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Извлекает все функции, классы, методы и типы из кодовой базы через AST (Python)
|
|
6
|
+
или regex (JS/TS/Rust/C/Go). Строит `name_index` для быстрого поиска дублей.
|
|
7
|
+
|
|
8
|
+
**Вызывай ДО написания нового кода** — чтобы не создавать функцию которая уже существует.
|
|
9
|
+
|
|
10
|
+
## Поддерживаемые языки
|
|
11
|
+
|
|
12
|
+
| Язык | Метод | Что извлекает |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Python | AST (точный) | functions, async_functions, classes + methods |
|
|
15
|
+
| JS/TS | regex | functions, arrow_functions, classes, methods, exports |
|
|
16
|
+
| Rust | regex | fn, struct, enum, trait, impl, type, const |
|
|
17
|
+
| C/C++ | regex | functions, classes, structs, macros |
|
|
18
|
+
| Go | regex | functions, structs, interfaces |
|
|
19
|
+
| **C#** | **regex** | **classes, methods, properties, interfaces, enum, record** |
|
|
20
|
+
|
|
21
|
+
## Синтаксис
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
fchek context <file_or_dir> [--names-only] [--depth=N]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- `--names-only` — только список имён (компактно, без деталей)
|
|
28
|
+
- `--depth=N` — глубина обхода папок (default: 5)
|
|
29
|
+
|
|
30
|
+
## Вывод JSON
|
|
31
|
+
|
|
32
|
+
### Полный
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"status": "ok",
|
|
36
|
+
"command": "context",
|
|
37
|
+
"data": {
|
|
38
|
+
"target": "/project/src",
|
|
39
|
+
"total_files": 12,
|
|
40
|
+
"total_symbols": 87,
|
|
41
|
+
"files": [
|
|
42
|
+
{
|
|
43
|
+
"file": "/project/src/auth.py",
|
|
44
|
+
"lang": "python",
|
|
45
|
+
"symbols": [
|
|
46
|
+
{ "kind": "function", "name": "validate_token", "line": 15, "args": ["token", "secret"] },
|
|
47
|
+
{ "kind": "class", "name": "AuthManager", "line": 42, "methods": ["login", "logout"] }
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"name_index": {
|
|
52
|
+
"validate_token": [{ "file": "src/auth.py", "kind": "function", "line": 15 }]
|
|
53
|
+
},
|
|
54
|
+
"duplicates": []
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### С --names-only
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"data": {
|
|
63
|
+
"total_symbols": 87,
|
|
64
|
+
"names": ["AuthManager", "login", "logout", "validate_token", ...],
|
|
65
|
+
"duplicates": []
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Как AI должен использовать это
|
|
71
|
+
|
|
72
|
+
### Сценарий: "Хочу добавить функцию parse_config()"
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 1. Проверить — уже есть такая функция?
|
|
76
|
+
fchek context src/ --names-only
|
|
77
|
+
|
|
78
|
+
# 2. Смотрю data.names — есть ли "parse_config"?
|
|
79
|
+
# Нашёл → НЕ создаю дубль → использую существующую или выбираю другое имя
|
|
80
|
+
|
|
81
|
+
# 3. Если нет — смотрю data.name_index на похожие имена
|
|
82
|
+
# ("parse_cfg", "loadConfig", "read_config" — может быть уже есть аналог)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Сценарий: "Рефакторинг — найти всё что использует старое имя"
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
fchek context src/
|
|
89
|
+
# data.name_index["old_function_name"] → все файлы где оно есть
|
|
90
|
+
# Потом: fchek goto src/auth.py:42 → все ссылки
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Алгоритм принятия решений
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
ЕСЛИ name_index содержит имя которое собираюсь создать:
|
|
97
|
+
→ НЕ создаю дубль
|
|
98
|
+
→ Читаю существующую реализацию: fchek goto <file:line>
|
|
99
|
+
→ Решаю: использовать существующую ИЛИ выбрать другое имя
|
|
100
|
+
|
|
101
|
+
ЕСЛИ duplicates не пустой:
|
|
102
|
+
→ В проекте уже есть конфликты имён
|
|
103
|
+
→ Сообщаю об этом перед добавлением нового кода
|
|
104
|
+
|
|
105
|
+
ЕСЛИ total_symbols = 0:
|
|
106
|
+
→ Папка пустая или нет поддерживаемых файлов
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Ключевые поля
|
|
110
|
+
|
|
111
|
+
| Поле | Что означает |
|
|
112
|
+
|---|---|
|
|
113
|
+
| `name_index` | Словарь имя → [{file, kind, line}] |
|
|
114
|
+
| `duplicates` | Имена встречающиеся в нескольких файлах |
|
|
115
|
+
| `total_symbols` | Общее число найденных символов |
|
|
116
|
+
| `files[].symbols` | Полный список символов в каждом файле |
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# skill: fchek convention — паттерны проекта
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Сканирует проект и извлекает его неписаные правила:
|
|
6
|
+
как обрабатываются ошибки, какой стиль именования, где лежат тесты, что используется для логирования.
|
|
7
|
+
|
|
8
|
+
**Вызывай при первом входе в незнакомый проект** — чтобы новый код не выбивался из общего стиля.
|
|
9
|
+
|
|
10
|
+
## Поддерживаемые языки
|
|
11
|
+
|
|
12
|
+
| Язык | Инструменты | Что анализирует |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| Python | ruff check | error_handling, naming, async, imports, logging, test_locations |
|
|
15
|
+
| JS/TS | regex | error_handling, naming, async, imports, logging, test_locations |
|
|
16
|
+
| Rust | regex | error_handling, error_style_summary, async (tokio/async-std), logging |
|
|
17
|
+
| C/C++ | regex | error_handling (errno/throw/assert), naming, logging |
|
|
18
|
+
| Go | regex | error_handling (if err!=nil / panic), async (goroutines), logging |
|
|
19
|
+
| **C#** | **regex** | **framework detection, error_handling, async (Task/CancellationToken), logging (ILogger/Serilog/NLog)** |
|
|
20
|
+
|
|
21
|
+
## Синтаксис
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
fchek convention <project_dir>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Вывод JSON
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"status": "ok",
|
|
32
|
+
"command": "convention",
|
|
33
|
+
"data": {
|
|
34
|
+
"project": "/project",
|
|
35
|
+
"languages": ["python", "javascript"],
|
|
36
|
+
"structure": {
|
|
37
|
+
"has_tests_dir": true,
|
|
38
|
+
"has_src_dir": true,
|
|
39
|
+
"has_ci": true,
|
|
40
|
+
"has_linter_config": true,
|
|
41
|
+
"config_files": ["package.json", "pyproject.toml"]
|
|
42
|
+
},
|
|
43
|
+
"conventions": [
|
|
44
|
+
{
|
|
45
|
+
"lang": "python",
|
|
46
|
+
"naming_style": "snake",
|
|
47
|
+
"test_files": 8,
|
|
48
|
+
"test_locations": ["tests/test_auth.py", "tests/test_utils.py"],
|
|
49
|
+
"error_handling": [
|
|
50
|
+
{ "pattern": "try/except", "occurrences": 24 },
|
|
51
|
+
{ "pattern": "raise custom", "occurrences": 11 }
|
|
52
|
+
],
|
|
53
|
+
"async_patterns": [
|
|
54
|
+
{ "pattern": "async def", "occurrences": 15 },
|
|
55
|
+
{ "pattern": "await", "occurrences": 31 }
|
|
56
|
+
],
|
|
57
|
+
"logging_style": [
|
|
58
|
+
{ "pattern": "logging module", "occurrences": 42 }
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"summary": "Project uses: python. python: naming=snake"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Как AI должен использовать это
|
|
68
|
+
|
|
69
|
+
### При первом входе в проект — обязательно
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
fchek convention .
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Затем применяй правила при написании кода:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
naming_style = "snake" → пиши get_user_data(), не getUserData()
|
|
79
|
+
naming_style = "camel" → пиши getUserData(), не get_user_data()
|
|
80
|
+
|
|
81
|
+
error_handling[0] = "try/except" → используй try/except, не коды возврата
|
|
82
|
+
error_handling[0] = "Result<T,E>" → возвращай Result, не паникуй
|
|
83
|
+
|
|
84
|
+
logging_style[0] = "logging module" → используй logging.info(), не print()
|
|
85
|
+
logging_style[0] = "console.log" → используй console.log()
|
|
86
|
+
|
|
87
|
+
async_patterns[0] = "async def" → проект асинхронный, используй async/await
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Тесты — где их создавать
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
test_locations[0] = "tests/test_auth.py"
|
|
94
|
+
→ новые тесты кладу в tests/
|
|
95
|
+
→ файлы называю test_<module>.py
|
|
96
|
+
|
|
97
|
+
test_locations[0] = "src/__tests__/auth.test.ts"
|
|
98
|
+
→ тесты рядом с кодом в __tests__/
|
|
99
|
+
→ файлы <module>.test.ts
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Rust — error_style_summary
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
"unwrap-heavy (consider ? operator)"
|
|
106
|
+
→ проект использует .unwrap() — спорный стиль
|
|
107
|
+
→ для нового кода используй ? оператор и Result<T,E>
|
|
108
|
+
|
|
109
|
+
"Result<T,E> with ? operator"
|
|
110
|
+
→ правильный стиль — продолжай в том же духе
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### C# — уникальные поля
|
|
114
|
+
|
|
115
|
+
`framework` — автоопределение по импортам:
|
|
116
|
+
```
|
|
117
|
+
"ASP.NET Core" → Microsoft.AspNetCore в using
|
|
118
|
+
"WPF" → System.Windows или .xaml файлы
|
|
119
|
+
"MAUI/Xamarin" → Xamarin или MAUI namespace
|
|
120
|
+
"Unity" → UnityEngine namespace
|
|
121
|
+
"Blazor" → Blazor namespace
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Используй `framework` чтобы понять контекст — в WPF не нужен HttpClient, в ASP.NET не нужен DispatcherTimer.
|
|
125
|
+
|
|
126
|
+
`logging_style` для C#:
|
|
127
|
+
```
|
|
128
|
+
"ILogger" → Microsoft.Extensions.Logging (ASP.NET Core стандарт)
|
|
129
|
+
"Serilog" → структурированное логирование
|
|
130
|
+
"NLog" → классический логгер
|
|
131
|
+
```
|
|
132
|
+
Никогда не вводи новую logging библиотеку если уже есть существующая.
|
|
133
|
+
|
|
134
|
+
### Ключевые поля
|
|
135
|
+
|
|
136
|
+
| Поле | Что означает |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `naming_style` | snake / camel / pascal |
|
|
139
|
+
| `error_handling[0]` | Самый частый паттерн обработки ошибок |
|
|
140
|
+
| `test_locations` | Куда класть новые тесты |
|
|
141
|
+
| `logging_style[0]` | Какую библиотеку логирования использует проект |
|
|
142
|
+
| `structure.has_linter_config` | Есть ли конфиг линтера — если да, линтер строже |
|
|
143
|
+
| `async_patterns` | Какой async-стиль использует проект |
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# skill: fchek coverage — покрытие кода тестами
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Запускает тесты и показывает, какие строки кода **не покрыты** ни одним тестом.
|
|
6
|
+
Незаменимо перед рефакторингом — не трогай то, что не проверено.
|
|
7
|
+
|
|
8
|
+
## Поддерживаемые языки
|
|
9
|
+
|
|
10
|
+
| Язык | Инструмент | Установка |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Python (.py) | coverage.py | `pip install coverage` |
|
|
13
|
+
| C/C++ (.c .cpp) | gcov | `apt install gcc` |
|
|
14
|
+
| Rust (Cargo.toml) | cargo-tarpaulin (Linux) / cargo-llvm-cov | `cargo install cargo-tarpaulin` |
|
|
15
|
+
| JS/TS (package.json) | c8 | `npm install -g c8` |
|
|
16
|
+
|
|
17
|
+
## Синтаксис
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
fchek coverage <file_or_dir> [--html] [--threshold=<0-100>]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- `--html` — сгенерировать HTML-отчёт в `./coverage_html/`
|
|
24
|
+
- `--threshold=80` — если покрытие ниже N% → `status: "error"`
|
|
25
|
+
|
|
26
|
+
## Вывод JSON
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"status": "ok",
|
|
31
|
+
"command": "coverage",
|
|
32
|
+
"data": {
|
|
33
|
+
"file": "/project/test_auth.py",
|
|
34
|
+
"lang": "python",
|
|
35
|
+
"tool": "coverage.py",
|
|
36
|
+
"total_pct": 74,
|
|
37
|
+
"threshold": 80,
|
|
38
|
+
"passed_threshold": false,
|
|
39
|
+
"files": [
|
|
40
|
+
{ "file": "src/auth.py", "stmts": 120, "missed": 31, "coverage_pct": 74, "missing_lines": "45-52, 88-95" }
|
|
41
|
+
],
|
|
42
|
+
"uncovered_files": [ ... ],
|
|
43
|
+
"html_report": "/project/coverage_html/index.html"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Как AI должен использовать это
|
|
49
|
+
|
|
50
|
+
### Сценарий: "Перед рефакторингом — найти непокрытый код"
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# 1. Запусти coverage
|
|
54
|
+
fchek coverage tests/
|
|
55
|
+
|
|
56
|
+
# 2. Смотри data.uncovered_files — это зоны без тестов
|
|
57
|
+
# 3. Для каждого файла смотри missing_lines
|
|
58
|
+
# 4. Перейди к непокрытой строке через goto
|
|
59
|
+
fchek goto src/auth.py:45
|
|
60
|
+
# 5. Оцени риск изменения непокрытого кода
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Сценарий: "Поставить gates для CI"
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
fchek coverage . --threshold=80
|
|
67
|
+
# status: "error" если coverage < 80% → CI должен упасть
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Алгоритм принятия решений
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
ЕСЛИ total_pct < threshold:
|
|
74
|
+
→ status будет "error"
|
|
75
|
+
→ смотри uncovered_files → предложи добавить тесты
|
|
76
|
+
|
|
77
|
+
ЕСЛИ total_pct = 100:
|
|
78
|
+
→ полное покрытие, но не значит что тесты хорошие
|
|
79
|
+
|
|
80
|
+
ЕСЛИ coverage.py не нашёл файлы:
|
|
81
|
+
→ убедись что передаёшь файл с тестами, а не с кодом
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Ключевые поля для AI
|
|
85
|
+
|
|
86
|
+
| Поле | Что означает |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `total_pct` | Общее покрытие в процентах |
|
|
89
|
+
| `uncovered_files[]` | Файлы с покрытием < 100% |
|
|
90
|
+
| `missing_lines` | Строки которые не выполнялись ни разу |
|
|
91
|
+
| `passed_threshold` | true/false — прошёл ли threshold |
|
|
92
|
+
| `html_report` | Путь к HTML — можно открыть для визуализации |
|
|
93
|
+
|
|
94
|
+
## Платформенные ограничения
|
|
95
|
+
|
|
96
|
+
- `gcov` — только Linux (нужен gcc с `-fprofile-arcs`)
|
|
97
|
+
- `cargo-tarpaulin` — только Linux; на macOS/Windows используй `cargo-llvm-cov`
|
|
98
|
+
- `c8` — работает везде где есть Node.js и npm test
|
|
99
|
+
- `coverage.py` — работает везде
|
package/skills/csharp.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# skill: fchek + C# — полная поддержка
|
|
2
|
+
|
|
3
|
+
## Поддержка по командам
|
|
4
|
+
|
|
5
|
+
| Команда | Статус | Инструмент |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `fchek context .` | ✓ | regex AST — классы, методы, properties, интерфейсы |
|
|
8
|
+
| `fchek convention .` | ✓ | Анализ паттернов — framework, errors, async, logging |
|
|
9
|
+
| `fchek run File.cs` | ✓ | `dotnet run` |
|
|
10
|
+
| `fchek secrets .` | ✓ | Regex, .dll/bin/obj игнорируются |
|
|
11
|
+
| `fchek lint .` | ✓ | `dotnet format` + `dotnet build` warnings |
|
|
12
|
+
| `fchek coverage .` | ✓ | `dotnet test` + coverlet (XPlat Code Coverage) |
|
|
13
|
+
| `fchek deps .` | ✓ | `dotnet list package` — outdated + vulnerable |
|
|
14
|
+
| `fchek goto File.cs:42` | ✓ | Grep-based symbol search по всему проекту |
|
|
15
|
+
| `fchek profile` | — | Нет (используй dotnet-trace / VS Profiler) |
|
|
16
|
+
| `fchek race` | — | Нет (используй VS Diagnostic Tools) |
|
|
17
|
+
| `fchek fuzz` | — | Нет (используй SharpFuzz вручную) |
|
|
18
|
+
|
|
19
|
+
**Требует:** .NET SDK установлен (`fchek doctor` покажет статус `dotnet`).
|
|
20
|
+
|
|
21
|
+
## Workflow для C# проекта
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# 1. Узнать стиль проекта
|
|
25
|
+
fchek convention .
|
|
26
|
+
# → framework: ASP.NET Core / WPF / Unity / Blazor / MAUI
|
|
27
|
+
# → error_handling, async_patterns, logging_style
|
|
28
|
+
|
|
29
|
+
# 2. Проверить существующие символы (избежать дублей)
|
|
30
|
+
fchek context src/ --names-only
|
|
31
|
+
|
|
32
|
+
# 3. Написать код, затем:
|
|
33
|
+
fchek run Program.cs # dotnet run — exit_code = 0?
|
|
34
|
+
|
|
35
|
+
# 4. Линт и форматирование
|
|
36
|
+
fchek lint . # dotnet format + build warnings
|
|
37
|
+
|
|
38
|
+
# 5. Покрытие тестами
|
|
39
|
+
fchek coverage . # dotnet test + coverlet
|
|
40
|
+
|
|
41
|
+
# 6. NuGet зависимости
|
|
42
|
+
fchek deps . # outdated + vulnerable packages
|
|
43
|
+
|
|
44
|
+
# 7. Поиск символа
|
|
45
|
+
fchek goto Services/UserService.cs:42
|
|
46
|
+
|
|
47
|
+
# 8. Секреты перед коммитом
|
|
48
|
+
fchek secrets . # .dll/bin/obj игнорируются
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Как читать вывод fchek convention для C#
|
|
52
|
+
|
|
53
|
+
`framework` — автоопределение по using/namespace:
|
|
54
|
+
- `ASP.NET Core` → DI через constructor, `ILogger<T>`, `IConfiguration`
|
|
55
|
+
- `WPF` → MVVM, `INotifyPropertyChanged`, `DispatcherTimer`
|
|
56
|
+
- `Unity` → `MonoBehaviour`, lifecycle methods
|
|
57
|
+
- `Blazor` → компонентный подход
|
|
58
|
+
|
|
59
|
+
`logging_style[0]`:
|
|
60
|
+
- `ILogger` → продолжай использовать `_logger.LogInformation(...)`
|
|
61
|
+
- `Console.Write` → проект использует Console — вероятно legacy или CLI app
|
|
62
|
+
|
|
63
|
+
## Правила для C# кода
|
|
64
|
+
|
|
65
|
+
### Секреты
|
|
66
|
+
```csharp
|
|
67
|
+
// ❌
|
|
68
|
+
var connStr = "Server=prod;Password=Secret123;";
|
|
69
|
+
|
|
70
|
+
// ✅
|
|
71
|
+
var connStr = _configuration.GetConnectionString("DefaultConnection");
|
|
72
|
+
// или
|
|
73
|
+
var connStr = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Async
|
|
77
|
+
```csharp
|
|
78
|
+
// ❌ Sync внутри async context
|
|
79
|
+
var result = GetDataAsync().Result;
|
|
80
|
+
|
|
81
|
+
// ✅
|
|
82
|
+
var result = await GetDataAsync(cancellationToken);
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Error handling
|
|
86
|
+
```csharp
|
|
87
|
+
// ❌ Глотать исключения
|
|
88
|
+
try { DoSomething(); } catch { }
|
|
89
|
+
|
|
90
|
+
// ✅ Логировать + пробрасывать или custom exception
|
|
91
|
+
try { await DoSomethingAsync(ct); }
|
|
92
|
+
catch (Exception ex) when (ex is not OperationCanceledException)
|
|
93
|
+
{
|
|
94
|
+
_logger.LogError(ex, "Failed to do something");
|
|
95
|
+
throw new MyDomainException("...", ex);
|
|
96
|
+
}
|
|
97
|
+
```
|
package/skills/db.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# skill: fchek db — Инспекция и запросы к БД (SQLite)
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Позволяет просматривать схему таблиц SQLite баз данных и выполнять произвольные SQL-запросы прямо из командной строки.
|
|
6
|
+
|
|
7
|
+
## Синтаксис
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Получить схему базы данных (таблицы, колонки, индексы)
|
|
11
|
+
fchek db schema <db_path>
|
|
12
|
+
|
|
13
|
+
# Выполнить SQL запрос
|
|
14
|
+
fchek db query <db_path> "<sql_query>"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Вывод JSON
|
|
18
|
+
|
|
19
|
+
### db schema
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"status": "ok",
|
|
23
|
+
"command": "db",
|
|
24
|
+
"data": {
|
|
25
|
+
"database": "data.db",
|
|
26
|
+
"tables": [
|
|
27
|
+
{
|
|
28
|
+
"name": "users",
|
|
29
|
+
"columns": [
|
|
30
|
+
{ "name": "id", "type": "INTEGER", "notnull": false, "dflt_value": null, "pk": true },
|
|
31
|
+
{ "name": "email", "type": "TEXT", "notnull": true, "dflt_value": null, "pk": false }
|
|
32
|
+
],
|
|
33
|
+
"indexes": ["sqlite_autoindex_users_1"]
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### db query
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"status": "ok",
|
|
44
|
+
"command": "db",
|
|
45
|
+
"data": {
|
|
46
|
+
"query": "SELECT * FROM users",
|
|
47
|
+
"count": 1,
|
|
48
|
+
"rows": [
|
|
49
|
+
{ "id": 1, "email": "alice@example.com" }
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## КАК AI ДОЛЖЕН ИСПОЛЬЗОВАТЬ ЭТО
|
|
56
|
+
|
|
57
|
+
### Сценарии
|
|
58
|
+
|
|
59
|
+
1. **Проверка схемы**: если код падает с ошибкой базы данных (например, `no such column`), исследуй схему:
|
|
60
|
+
```bash
|
|
61
|
+
fchek db schema app.db
|
|
62
|
+
```
|
|
63
|
+
2. **Проверка данных**: убедись, что транзакция или миграция сработала корректно:
|
|
64
|
+
```bash
|
|
65
|
+
fchek db query app.db "SELECT * FROM migrations"
|
|
66
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# skill: fchek deps-check — актуальность API библиотеки
|
|
2
|
+
|
|
3
|
+
## Что делает
|
|
4
|
+
|
|
5
|
+
Делает live-запрос к реестру пакетов (npm / PyPI / crates.io) и возвращает:
|
|
6
|
+
- установленную версию vs последнюю
|
|
7
|
+
- deprecated флаги на версиях
|
|
8
|
+
- yanked версии (Rust)
|
|
9
|
+
- предупреждения о deprecated методах из changelog
|
|
10
|
+
|
|
11
|
+
**Закрывает проблему галлюцинаций API** — данные из реального реестра, не из памяти модели.
|
|
12
|
+
|
|
13
|
+
## Поддерживаемые реестры
|
|
14
|
+
|
|
15
|
+
| Язык | Реестр | Авто-определение |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| Node.js | registry.npmjs.org | `package.json` в папке |
|
|
18
|
+
| Python | pypi.org | `requirements.txt` / `pyproject.toml` |
|
|
19
|
+
| Rust | crates.io | `Cargo.toml` в папке |
|
|
20
|
+
|
|
21
|
+
## Синтаксис
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
fchek deps-check <lib> [--lang=node|python|rust] [--show-changelog]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- `--lang` — принудительно указать язык (если авто-определение не сработало)
|
|
28
|
+
- `--show-changelog` — добавить ссылку на changelog
|
|
29
|
+
|
|
30
|
+
## Вывод JSON
|
|
31
|
+
|
|
32
|
+
### Online (есть сеть)
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"status": "ok",
|
|
36
|
+
"command": "deps-check",
|
|
37
|
+
"data": {
|
|
38
|
+
"lib": "requests",
|
|
39
|
+
"registry": "pypi",
|
|
40
|
+
"installed_version": "2.28.0",
|
|
41
|
+
"latest_version": "2.34.2",
|
|
42
|
+
"up_to_date": false,
|
|
43
|
+
"is_deprecated": false,
|
|
44
|
+
"deprecation_notices": [],
|
|
45
|
+
"recent_versions": ["2.34.2", "2.34.1", "2.34.0"],
|
|
46
|
+
"requires_python": ">=3.8",
|
|
47
|
+
"description": "Python HTTP for Humans."
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Offline (нет сети)
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"data": {
|
|
56
|
+
"offline": true,
|
|
57
|
+
"offline_note": "No internet connection. Showing installed version only.",
|
|
58
|
+
"installed_version": "2.28.0",
|
|
59
|
+
"latest_version": null,
|
|
60
|
+
"up_to_date": null
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### npm — deprecated версия
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"data": {
|
|
69
|
+
"lib": "request",
|
|
70
|
+
"installed_deprecated": "DEPRECATED! Use axios or node-fetch instead.",
|
|
71
|
+
"deprecated_versions": [
|
|
72
|
+
{ "version": "2.88.2", "message": "request has been deprecated..." }
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Как AI должен использовать это
|
|
79
|
+
|
|
80
|
+
### ПРАВИЛО — перед использованием любой библиотеки
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
fchek deps-check <lib>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Алгоритм принятия решений
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
ЕСЛИ installed_deprecated не null:
|
|
90
|
+
→ СТОП — установленная версия помечена deprecated
|
|
91
|
+
→ Сообщи пользователю: "Эта библиотека deprecated: <сообщение>"
|
|
92
|
+
→ Предложи альтернативу из сообщения
|
|
93
|
+
|
|
94
|
+
ЕСЛИ up_to_date = false:
|
|
95
|
+
→ Установлена старая версия
|
|
96
|
+
→ Проверь breaking changes в последней версии
|
|
97
|
+
→ Используй API из installed_version, не из latest
|
|
98
|
+
|
|
99
|
+
ЕСЛИ offline = true:
|
|
100
|
+
→ Нет сети — проверка невозможна
|
|
101
|
+
→ Используй только хорошо известные стабильные API
|
|
102
|
+
→ Предупреди пользователя что не смог проверить актуальность
|
|
103
|
+
|
|
104
|
+
ЕСЛИ yanked_versions содержит installed_version (Rust):
|
|
105
|
+
→ Версия была отозвана — возможно баг безопасности
|
|
106
|
+
→ Рекомендуй обновить
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Примеры использования
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Перед использованием requests
|
|
113
|
+
fchek deps-check requests --lang=python
|
|
114
|
+
|
|
115
|
+
# Проверить express перед написанием кода
|
|
116
|
+
fchek deps-check express
|
|
117
|
+
|
|
118
|
+
# Rust — проверить serde
|
|
119
|
+
fchek deps-check serde --lang=rust
|
|
120
|
+
|
|
121
|
+
# Посмотреть changelog
|
|
122
|
+
fchek deps-check react --show-changelog
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Ключевые поля
|
|
126
|
+
|
|
127
|
+
| Поле | Что означает |
|
|
128
|
+
|---|---|
|
|
129
|
+
| `installed_version` | Что реально установлено (null если не установлено) |
|
|
130
|
+
| `latest_version` | Последняя в реестре |
|
|
131
|
+
| `up_to_date` | true/false/null (null = офлайн) |
|
|
132
|
+
| `installed_deprecated` | Сообщение если установленная версия deprecated |
|
|
133
|
+
| `deprecation_notices` | Тексты из описания пакета о deprecated методах |
|
|
134
|
+
| `yanked_versions` | Версии отозванные из реестра (Rust) |
|
|
135
|
+
| `offline` | true = нет сети, данные из локальных файлов |
|