AI-ассистент мост между LLM в чате и локальной файловой системой разработчика.
aica позволяет AI-агентам безопасно читать файлы проекта через HTTP API и предлагать изменения через систему патчей с подтверждением человеком.
GET/POST /get-file— получение содержимого файлаGET/POST /list-files— список файлов в директорииGET/POST /grep— поиск по содержимому файловGET/POST /file-info— метаданные файла (размер, хэш, дата)GET/POST /tree— дерево каталогов
- patch — применение unified diff
- replace — замена файла целиком
- create — создание нового файла
- delete — удаление файла
- rename — переименование
- append — дописать в конец
- exec — выполнение команд из whitelist
- sequence — последовательность действий
- Whitelist путей (запрет node_modules, .env, .git, секретов)
- Whitelist команд для exec (npm test, npm run *, и т.д.)
- Авторизация через Bearer token или query parameter
- Экранирование ANSI escape последовательностей
- Критические правила против эмуляции ответов
- Автоматические бэкапы перед изменениями
- Логирование всех HTTP запросов с контекстом
- Поддержка AGENTS.md для контекста проекта
- Туннели: UPnP, cloudflared, localtunnel
- Стоп-фраза
~agent-stopдля завершения сессии - Параметр
notifyдля автоприменения без подтверждения
git clone <repo> aica
cd aica
npm install
npm link # для глобальной команды `aica`cd ~/projects/my-project
aica aidevПри запуске увидите:
╔══════════════════════════════════════════════════════════╗
║ 🤖 aica — агент "aidev" запущен ║
║ 📁 /home/user/projects/my-project ║
║ 🌐 Локально: http://localhost:3000 ║
║ 🌍 Публично: https://xxx.trycloudflare.com ║
║ 🔑 Пароль: abc123xyz ║
╚══════════════════════════════════════════════════════════╝
Скопируйте в чат с LLM:
────────────────────────────────────────
Используй aica-ассистента для работы с файлами проекта.
Твоя роль: aidev.
Сервер: https://xxx.trycloudflare.com
Пароль: abc123xyz
Используй доступные HTTP инструменты для запросов к серверу.
Получи справку: GET https://xxx.trycloudflare.com/help?password=abc123xyz
Следуй инструкциям из ответа сервера.
────────────────────────────────────────
aica <role> [options]
Опции:
--port <number> Порт сервера (по умолчанию: автовыбор от 3000)
--url <url> Использовать существующий URL туннеля
--upnp Проброс порта через UPnP
--ip Показать внешний IP без туннеля
--cloudflared Использовать cloudflared для туннеля
--q-get Режим: только GET эндпоинты для чтения
--q-post Режим: только POST эндпоинты для чтения
--q-mix Режим: GET и POST эндпоинты (по умолчанию)
--auto Автоматическое применение патчей без подтверждения# Базовый запуск
aica aidev
# С UPnP пробросом порта
aica aidev --upnp
# С cloudflared туннелем
aica aidev --cloudflared
# Только POST для чтения (безопаснее)
aica aidev --q-post
# Автоматическое применение патчей
aica aidev --auto
# Указать конкретный порт
aica aidev --port 8080
# Использовать существующий туннель
aica aidev --url https://my-tunnel.ngrok.ioДва способа:
- Bearer token:
Authorization: Bearer <password> - Query parameter:
?password=<password>
curl "http://localhost:3000/get-file?path=src/core.js&password=abc123"curl -X POST http://localhost:3000/get-file \
-H "Authorization: Bearer abc123" \
-H "Content-Type: application/json" \
-d '{"path": "src/core.js", "reason": "Анализ функции"}'Ответ:
{
"success": true,
"content": "...",
"size": 48523,
"hash": "a1b2c3d4",
"lines": 1490
}Одиночное действие:
{
"action": "patch",
"file": "src/core.js",
"description": "Оптимизация функции",
"reason": "Производительность",
"content": "--- a/src/core.js\n+++ b/src/core.js\n...",
"notify": true
}Последовательность действий:
{
"action": "sequence",
"description": "Оптимизация + тесты",
"steps": [
{"action": "patch", "file": "src/core.js", "content": "..."},
{"action": "exec", "command": "npm test"},
{"action": "exec", "command": "npm run lint"}
],
"notify": true
}Ответ:
{
"success": true,
"id": 4342,
"filename": "ai-patch-aidev.txt",
"status": "pending"
}curl "http://localhost:3000/help?password=abc123"Возвращает markdown инструкцию для LLM.
Файл: ai-patch-{role}.txt
Action: patch
File: src/core.js
Description: Замена String() на конкатенацию
Reason: Оптимизация
--- a/src/core.js
+++ b/src/core.js
@@ -150,3 +150,3 @@
- return String(key)...
+ return ("" + key)...
Action: sequence
Description: Оптимизация + тесты
---
Action: patch
File: src/core.js
--- a/src/core.js
+++ b/src/core.js
@@ -150,3 +150,3 @@
- return String(key)...
+ return ("" + key)...
---
Action: exec
Command: npm test
node_modules/.env,.env.*.git/.ai-log/- Файлы с
secret,password,token,keyв имени - Пути вне рабочего каталога
npm test
npm run *
npx jest
npx vitest
npx eslint *
npx tsc
yarn test
yarn run *
pnpm test
pnpm run *
Создайте aica.config.json в корне проекта:
{
"allowedCommands": [
"npm test",
"npm run lint",
"npm run build",
"docker compose up"
]
}Все действия пишутся в .ai-log/:
requests.log— HTTP запросы с комментариями агентаcounter.txt— счётчик ID патчей*.applied_*— применённые патчи*.rejected_*— отклонённые патчи.backup_*— бэкапы файлов
Для завершения работы агента в чате:
~agent-stop
LLM немедленно выйдет из роли агента.
1. LLM делает POST /help → получает инструкцию
2. LLM читает AGENTS.md (если есть) → POST /get-file
3. LLM анализирует код → POST /grep, /get-file
4. LLM хочет изменить → POST /create-patch
→ получает { id: 4342, status: "pending" }
5. Человек в консоли видит патч → Y/n
6. Человек копирует "applied:4342" → вставляет в чат
7. LLM видит результат → продолжает работу
┌────────────────────────────────────────────────────────┐
│ 📨 PATCH #4342 ai-patch-aidev.txt │
│ Замена String() на конкатенацию │
└────────────────────────────────────────────────────────┘
📁 Файл: src/core.js
💡 Причина: Оптимизация: конкатенация быстрее на 20-30%
📊 Изменения:
📁 Файлов: 1
🟢 Добавлено: +1
🔴 Удалено: -1
Файлы:
• src/core.js
? Применить? [Y/n/q]
✅ Патч применён
📤 Для чата
applied:4342
(скопируйте в чат)
Только GET эндпоинты для чтения. Безопаснее, но менее гибко.
Только POST эндпоинты для чтения. Рекомендуется.
GET и POST эндпоинты. По умолчанию.
Автоматическое применение патчей без подтверждения человека. Используйте с осторожностью!
aica aidev --upnpАвтоматический проброс порта через UPnP на роутере.
aica aidev --cloudflaredСоздаёт туннель через cloudflared (нужен установленный cloudflared).
aica aidev --ipПоказывает внешний IP без создания туннеля.
aica/
├── bin/
│ └── aica.js # CLI точка входа
├── lib/
│ ├── actions.js # выполнение действий
│ ├── backup.js # бэкапы
│ ├── logger.js # логирование
│ ├── parser.js # парсер патчей
│ ├── password.js # генерация паролей
│ ├── security.js # валидация путей и команд
│ ├── server.js # HTTP сервер
│ ├── tunnel.js # туннели (UPnP, cloudflared)
│ └── ui.js # консольный UI
├── package.json
└── README.md
{
"chalk": "^5.3.0",
"diff": "^5.2.0",
"express": "^4.19.0",
"nat-upnp": "^1.1.0"
}- Fork репозитория
- Создайте ветку для фичи (
git checkout -b feature/amazing-feature) - Commit изменения (
git commit -m 'Add amazing feature') - Push в ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
MIT
- Один агент = одна роль (нельзя запустить два агента с одной ролью)
- При закрытии консоли сервер останавливается
- Туннели могут быть нестабильны при плохом интернете
- exec команды ограничены whitelist (по соображениям безопасности)
Если нашли баг или есть предложение — создайте issue в репозитории.
aica — безопасный мост между AI и вашим кодом.