# Быстрый старт
Ноль зависимостей — нужен только Node.js ≥ 18.
git clone → сразу работает. Один вход всегда даёт один и тот же выход.
# Зависимостей нет — достаточно Node.js >= 18
node bin/kodik.js --help
# Интерактивное меню (стрелки ↑/↓, Enter) — запуск без аргументов
node bin/kodik.js
# Полный аудит проекта одной командой
node bin/kodik.js audit examples/demo-project
# Полная демонстрация всех команд
npm run demo
# Опционально — глобальная команда kodik
npm link && kodik --help
Analyze Project
kodik audit <путь> [--json] [--no-fix] [--dry-run]
Рекурсивно сканирует папку, определяет стек (React / Express / PostgreSQL / …), рисует карту проекта и выдаёт единую оценку 0–100 по шести измерениям: качество кода, безопасность, архитектура, документация, тесты, производительность — со списком рекомендаций. В интерактивном режиме открывается меню действий: Find Bugs (баги с % уверенности), Review Code, Explain Architecture, Generate Docs, Ask AI.
Аудит проекта · /examples/demo-project
Карта проекта
Frontend: React
Backend: Express
База данных: PostgreSQL
Язык: JavaScript
Файлы: 5 исходных, 1 тестов
Покрытие: ~20% (оценка)
Общая оценка 62 / 100
────────────────────────────────────────
Качество кода ███████░░░ 68
Безопасность ████░░░░░░ 41
Архитектура ████████░░ 80
Документация ██████░░░░ 55
Тесты ███░░░░░░░ 30
Производительность ████████░░ 83
Находки: 4
2× hardcoded-secret
1× sql-injection
1× empty-catch
Рекомендации:
1. Вынесите захардкоженные секреты в переменные окружения (process.env).
2. Используйте параметризованные запросы вместо конкатенации SQL.
3. Добавьте тесты — покрытие ниже 30%.
Режим: офлайн (детерминированно) · KodikShield активен
Безопасные автоправки как в git: цветной diff → подтверждение
[Y/n] → бэкап в .kodik-backups/ → запись. Откат —
kodik undo <путь>. Флаг --dry-run только показывает диффы.
Generate Unit Tests
kodik gen-tests --file <путь> [--lang js|py] [--framework jest|pytest]
Разбирает функции файла и генерирует unit-тесты Jest или
Pytest с тремя кейсами на функцию: happy path, граничный случай
и негативный сценарий. Язык и фреймворк определяются автоматически
(переопределяются через --lang / --framework).
Результат — блок кода + предлагаемое имя файла (*.test.js / test_*.py).
Генерация тестов · jest · js
Распознано функций: 3 (calculateDiscount, formatUser, riskyParse)
// Тесты Jest (Kodik-Helper, офлайн)
describe('calculateDiscount', () => {
test('happy path', () => {
expect(calculateDiscount(1, 2)).toBeDefined();
});
test('граничный случай', () => {
expect(() => calculateDiscount(0, 0)).not.toThrow();
});
test('некорректный ввод', () => {
expect(() => calculateDiscount(undefined, undefined))
.toBeDefined();
});
});
Генерация тестов · pytest · py
# Тесты Pytest (Kodik-Helper, офлайн)
import pytest
def test_calculate_discount_happy_path():
assert calculate_discount(1, 2) is not None
def test_calculate_discount_edge_case():
assert calculate_discount(0, 0) is not None
def test_calculate_discount_invalid_input():
with pytest.raises(Exception):
calculate_discount(None, None)
Generate Documentation
kodik gen-docs --file <путь> [--scope file|project]
Собирает README.md по одному файлу или по всему дереву проекта:
обзор, таблицы публичного API (функции и их параметры), обнаруженные классы,
блоки установки и тестирования. Перед разбором каждый файл проходит через
KodikShield, поэтому секреты не попадают в документацию.
Документация · scope=project · файлов: 5
KodikShield: замаскировано чувствительных фрагментов — 2
```markdown
# demo-project
> Документация сгенерирована Kodik-Helper (офлайн-режим).
## Обзор
Проект содержит 5 модулей и 11 функций.
## Структура и API
### `backend/auth/login.js`
| Функция | Параметры |
|------------|------------------|
| `login` | `req`, `res` |
| `verify` | `token` |
### `backend/orders/orders.js`
| Функция | Параметры |
|--------------|-------------|
| `createOrder`| `items` |
| `getPrice` | `sku` |
Analyze Logs
kodik analyze-log --file <путь> · cat error.log | kodik analyze-log
Парсит стектрейсы Java / Python / Node, находит верхний кадр и
строит цепочку вызовов, сопоставляет ошибку с базой распространённых проблем
(NullPointerException, KeyError, ECONNREFUSED, …)
и выдаёт вероятную причину, рекомендацию, пример исправления и оценку уверенности.
PII и секреты внутри лога маскируются до анализа.
Анализ лога / стектрейса
Ошибка: KeyError: 'sku-404'
Место: get_price — app/utils.py:12
Цепочка вызовов:
↳ handle_order (app/handlers.py:88)
↳ get_price (app/utils.py:12)
Вероятная причина: Обращение к несуществующему ключу словаря.
Рекомендация: Используйте dict.get(key, default) или проверяйте
наличие ключа через in.
Пример исправления:
```python
value = data.get(key) # безопасный доступ
if value is None:
return
```
[Уверенность: 90%]
KodikShield: в логе замаскировано чувствительных данных — 3
В примере лог содержал строку подключения к БД с паролем и email пользователя —
KodikShield заменил их на плейсхолдеры <SECRET_1> / <PII_2>
до того, как лог был обработан.
AI Refactor
kodik refactor --file <путь>
Применяет набор безопасных автозамен и показывает цветной diff:
var → let, == → ===, != → !== для JS и
== None → is None для Python. Если безопасных автоправок нет —
выдаёт рекомендации к ручному рефакторингу (Extract Method, Rename, DRY).
Правки попадают на диск только после подтверждения и создания бэкапа.
Рефакторинг · js · examples/sample.js
KodikShield: чувствительных фрагментов — 2 (не показаны)
Применённые улучшения:
• var → let (block-scoping)
• == → === (строгое сравнение)
Diff:
```diff
- var result = price - (price * percent) / 100;
+ let result = price - (price * percent) / 100;
- if (result == 0) {
+ if (result === 0) {
```
Применить правки к файлу? [y/N]
AI Chat
Интерактивное меню → 6 · AI Chat (Ask AI по проекту)
Проектно-осведомлённый вопрос-ответ. Гибридный движок: в офлайне —
детерминированные ответы по обнаруженному стеку, инвентарю файлов и сводке
находок аудита; при подключённом KODIK_LLM санитизированный контекст
уходит в LLM с откатом к офлайн-ответу при любой ошибке. Понимает вопросы про
безопасность, тесты/покрытие, авторизацию и архитектуру.
Задавайте вопросы по проекту. Пустая строка — выход.
Ask AI › есть ли проблемы с безопасностью?
По безопасности:
• Найдены захардкоженные секреты — вынесите их в
переменные окружения (process.env).
• Есть риск SQL-инъекции — используйте параметризованные
запросы ($1, ?, %s).
[режим: offline]
Ask AI › какое покрытие тестами?
Покрытие тестами оценивается в ~20%. Сгенерируйте
недостающие тесты командой kodik gen-tests --file <путь>.
[режим: offline]
Движок ИИ переключается в Settings: облако
(KODIK_LLM=openai|anthropic + ключ) или
локальный Ollama. В офлайне отвечает детерминированный движок.
Перед отправкой промпт всегда проходит через KodikShield.
Generate AI Commit
Интерактивное меню → 7 · 🐙 Generate AI Commit
Smart Git Companion. Анализирует незакоммиченные изменения и
генерирует идеальное сообщение по спецификации Conventional Commits.
Берёт git diff --cached, а если staged-изменений нет —
git diff. Дифф уходит в AI-роутер (облако или
локальный Ollama); при недоступности ИИ срабатывает детерминированная эвристика по
именам и статусам файлов — фича работает всегда. Коммит выполняется
безопасно, без shell-инъекций.
Изменения: не проиндексировано (unstaged), файлов: 2
🐙 Analyzing Git changes and generating commit message...
┌──────────────────────────────────────────────┐
│ ✨ Proposed Commit Message │
├──────────────────────────────────────────────┤
│ │
│ feat(auth): add login with input validation │
│ │
└──────────────────────────────────────────────┘
[источник: local, ollama]
Do you want to commit with this message? (y - yes / n - cancel / e - edit) y
✓ Коммит создан.
feat(auth): add login with input validation
[master a1b2c3d] feat(auth): add login with input validation
y — закоммитить (git commit -m для staged,
git commit -a -m для unstaged), e — отредактировать
сообщение вручную, n — отмена. Если папка не git-репозиторий —
понятная ошибка и возврат в меню.
Generate API Boilerplate
Интерактивное меню → 8 · 🏗️ Generate API Boilerplate
Instant Backend Scaffolder. Генерирует рабочую архитектуру REST API
по простому текстовому описанию. Шаг 1 — описание бэкенда (напр.
Voting system with users and projects); шаг 2 — выбор стека
(FastAPI + SQLAlchemy + SQLite или Go + SQLite).
ИИ возвращает JSON-массив файлов, который парсится устойчиво (снятие markdown-ограждений,
ремонт «тройных кавычек», вырезание массива из текста), после чего файлы рекурсивно
создаются в ./generated-api/. При невалидном JSON или недоступном ИИ —
офлайн-шаблон рабочего каркаса.
Опишите бэкенд: Voting system with users and projects
Tech Stack: 1. FastAPI (Python) + SQLAlchemy + SQLite
🏗️ Constructing backend architecture and database models via AI...
┌──────────────────────────────────────────────┐
│ 🏗️ Backend Scaffolder Success │
├──────────────────────────────────────────────┤
│ │
│ Stack: FastAPI + SQLAlchemy + SQLite │
│ Location: ./generated-api/ │
│ │
│ Generated Files: │
│ ├── main.py │
│ ├── database.py │
│ ├── models.py │
│ └── routes.py │
│ │
│ API is ready! Run it and start coding. │
└──────────────────────────────────────────────┘
Press ENTER to return to the main menu...
Папка не перезаписывается: если generated-api/ уже есть — создаётся
generated-api-<timestamp>. Пути из ответа ИИ санируются —
../, абсолютные и диск-префиксы блокируются.
Local AI — Privacy-First Mode 🔒
Settings → Toggle AI Engine → Local (Ollama)
Флагманский режим для анализа корпоративного кода: все запросы к ИИ уходят
только на localhost через Ollama — данные никогда не покидают машину. Единый
AI-роутер обслуживает все ИИ-фичи (AI Commit, API Scaffolder, AI Chat,
аудит) и переключается между облаком и локальным движком одним тумблером. Выбор
хранится персистентно в ~/.kodikrc.json.
# 1) Запустить локальный сервер
ollama serve
# 2) Скачать модель (fallback → qwen2)
ollama pull llama3
# 3) В KodikDevKit:
# Settings → Toggle AI Engine → Local
Настройки
Движок ИИ: Local - Ollama (Privacy-First)
Эфф. режим: local
Конфиг: ~/.kodikrc.json
› Toggle AI Engine (Current: Local - Ollama)
Выбрать модель Ollama (llama3)
Проверить связь с локальным ИИ
✓ Ollama на связи. Модели: llama3, qwen2
Если Ollama не запущен — понятное предупреждение:
⚠️ Connection to local AI failed. Ensure Ollama is running on port 11434
(run 'ollama serve'). — и мягкий откат в офлайн-режим, CLI не падает.
🛡️ KodikShield — локальная анонимизация
Ключевая особенность проекта. Перед тем как любой фрагмент кода или лога будет
обработан (или отправлен в опциональный LLM), он проходит через детерминированный
анонимайзер. Секреты и PII заменяются на стабильные плейсхолдеры с картой для
обратной подстановки (rehydrate).
🔑 Секреты
API-ключи, AWS / Google / OpenAI-ключи, GitHub / Slack-токены, JWT, PEM-приватные ключи, пароли в строках подключения к БД.
👤 PII
Email, IPv4-адреса, телефоны, номера карт — заменяются на
<PII_1>, <PII_2>, …
✅ Не трогает
Ссылки на process.env.* и ${ENV_VAR} не маскируются —
это не секреты, а корректный способ хранения.
# Вход
const API_KEY = "sk-abcdefghijklmnopqrstuvwxyz0123456789";
const dbUrl = "postgresql://admin:SuperSecret123@10.0.0.5:5432/prod";
# После KodikShield
const API_KEY = <SECRET_1>;
const dbUrl = <SECRET_2>; # host/пароль замаскированы
# Все команды CLI
| Команда | Что делает |
|---|---|
audit |
Полный аудит: скан, стек, оценка 0-100, рекомендации |
gen-tests |
Unit-тесты Jest / Pytest (happy path, граничные, негативные) |
gen-docs |
README.md по файлу или проекту |
analyze-log |
Разбор стектрейса, причина ошибки и пример исправления |
refactor |
Безопасные автоправки с diff (var→let, ==→===, ==None→is None) |
static-check |
Эвристический линтер: ошибки, code smells, захардкоженные секреты |
scaffold |
Каркас проекта (webapp/API, JS/Python, БД, Dockerfile, CI) |
ci-config |
YAML для GitHub Actions / GitLab CI под стек |
cicd-generator |
Готовый .github/workflows/kodik-ci.yml по автодетекту стека |
undo |
Откат последней правки из бэкапа .kodik-backups/ |