@iola_adm/iola-cli 0.1.19 → 0.1.21

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 CHANGED
@@ -2,555 +2,79 @@
2
2
 
3
3
  # iola-cli
4
4
 
5
- CLI для работы с открытыми данными городского округа "Город Йошкар-Ола".
5
+ CLI и AI-агент для работы с открытыми данными городского округа "Город Йошкар-Ола".
6
6
 
7
- Проект использует публичные endpoints:
7
+ Подробная документация: [GitHub Wiki](https://github.com/adm-iola/iola-cli/wiki).
8
+
9
+ Публичные endpoints:
8
10
 
9
11
  - `https://apiiola.yasg.ru/api/v1`
10
12
  - `https://apiiola.yasg.ru/mcp`
11
13
 
12
- ## Необходимые компоненты
14
+ ## Быстрый старт
13
15
 
14
- Проверьте Node.js и npm:
16
+ Проверьте Node.js:
15
17
 
16
18
  ```bash
17
19
  node --version
18
20
  npm --version
19
21
  ```
20
22
 
21
- Нужен Node.js `22.5.0` или новее. Это нужно для встроенной SQLite-БД
22
- `node:sqlite`, которую CLI будет использовать для локальной истории, кеша и
23
- сессий без дополнительных нативных зависимостей.
24
-
25
- Если Node.js не установлен или версия ниже `22.5.0`:
26
-
27
- ```bash
28
- # Windows
29
- winget install OpenJS.NodeJS.LTS
30
-
31
- # macOS
32
- brew install node
33
-
34
- # Linux, вариант через NodeSource
35
- curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
36
- sudo apt-get install -y nodejs
37
- ```
38
-
39
- Для локального AI-режима нужен Ollama. Проверка:
40
-
41
- ```bash
42
- ollama --version
43
- ```
23
+ Нужен Node.js `22.5.0` или новее.
44
24
 
45
- Установка Ollama:
25
+ Установка и первый запуск:
46
26
 
47
27
  ```bash
48
- # Windows
49
- winget install Ollama.Ollama
50
-
51
- # macOS
52
- brew install --cask ollama
53
-
54
- # Linux
55
- curl -fsSL https://ollama.com/install.sh | sh
28
+ npm install -g @iola_adm/iola-cli
29
+ iola init
30
+ iola --help
56
31
  ```
57
32
 
58
- Диагностика ПК и подбор локальной модели:
33
+ Без глобальной установки:
59
34
 
60
35
  ```bash
61
36
  npx -y @iola_adm/iola-cli init
62
- npx -y @iola_adm/iola-cli init --upgrade-node
63
- npx -y @iola_adm/iola-cli ai doctor
64
- npx -y @iola_adm/iola-cli ai setup ollama
65
- ```
66
-
67
- ## Установка и запуск
68
-
69
- ```bash
70
- npx -y @iola_adm/iola-cli help
71
- npx -y @iola_adm/iola-cli init --yes
72
- ```
73
-
74
- Глобальная установка:
75
-
76
- ```bash
77
- npm install -g @iola_adm/iola-cli
78
- iola help
79
- iola init
80
37
  ```
81
38
 
82
- ## Команды
39
+ Основные команды:
83
40
 
84
41
  ```bash
85
- iola banner
86
- iola agent
87
- iola chat
88
- iola init
89
- iola doctor
90
- iola db status
91
- iola db init
92
- iola history --limit 20
93
- iola history clear
94
- iola sessions --limit 20
95
- iola resume 1 "продолжи"
96
- iola fork 1 "новый вопрос"
97
- iola features list
98
- iola features enable api-cache
99
- iola permissions list
100
- iola permissions deny export_data
101
- iola permissions allow export_data
102
- iola memory add "Отвечай кратко и указывай источник данных"
103
- iola memory show
104
- iola hooks events
105
- iola hooks add AfterSync "iola quality"
106
- iola agents list
107
- iola agents run quality-checker "проверь школы"
108
- iola mcp status
109
- iola mcp list
110
- iola mcp install codex
111
- iola cache status
112
- iola cache warm
113
- iola cache clear
114
- iola sync
115
- iola sync status
116
- iola diff schools
117
- iola search "Петрова" --local
118
- iola search "Петрова" --local --fts
42
+ iola search "Петрова"
119
43
  iola card "школа 29"
44
+ iola ask "найди школу 29"
45
+ iola sync
120
46
  iola quality
121
- iola quality missing-phones
122
- iola data schools --where address=Петрова --save schools-petrova
123
- iola views
124
- iola view schools-petrova --format csv --output schools-petrova.csv
125
- iola views delete schools-petrova
126
- iola report missing-phones
127
- iola privacy
128
- iola backup create
129
- iola alias add petrova "data schools --where address=Петрова --columns name,address,phone"
130
- iola run "выгрузи школы на Петрова в csv"
131
- iola config get
132
- iola config set api.baseUrl https://apiiola.yasg.ru/api/v1
133
- iola config reset
134
- iola update
135
- iola version --check
136
- iola ask "Найди школу 29"
137
- iola ask "Найди школу 29" --profile codex --events --output answer.txt
138
- iola ask "Найди школу 29" --schema json --no-history
139
- iola ask "Найди школу 29" --bare --quiet
140
- iola ask "выгрузи школы на Петрова в csv" --profile local --tools --reasoning verify
141
- iola data schools --format csv --output schools.csv
142
- iola data schools --limit 10
143
- iola data kindergartens --search "29"
144
- iola data schools --where address=Петрова --columns name,address,phone
145
- iola data schools --format csv
146
- iola ai doctor
147
- iola ai setup ollama
148
- iola ai setup codex --model gpt-5.5
149
- iola ai profiles
150
- iola ai profile add router-qwen --provider openrouter --model qwen/qwen3-32b
151
- iola ai profile use router-qwen
152
- iola ai models openrouter --search qwen
153
- iola ai models codex
154
- iola ai ask "Какие школы есть на улице Петрова?"
155
- iola ai context "школа 29"
156
- iola ai key set openai
157
- iola ai key status
158
- iola ai setup openai --model gpt-4.1-mini
159
- iola ai setup openrouter --model openai/gpt-4.1-mini
160
- iola health
161
- iola layers
162
- iola schools --limit 10
163
- iola schools --format csv
164
- iola schools get --inn 1215067180
165
- iola kindergartens --search "29"
166
- iola kindergartens get --inn 1215077421 --json
167
- iola search "лицей"
168
- iola mcp-info
169
- iola setup codex
170
- ```
171
-
172
- По умолчанию команды выводят компактную таблицу. Для полного ответа API
173
- используйте `--json` или `--format json`. Для выгрузки используйте
174
- `--format csv`.
175
-
176
- ## Интерактивный режим
177
-
178
- ```bash
179
47
  iola agent
180
48
  ```
181
49
 
182
- Внутри agent доступны slash-команды:
183
-
184
- ```text
185
- /help
186
- /health
187
- /doctor
188
- /db status
189
- /sessions
190
- /resume 1
191
- /features list
192
- /permissions
193
- /tools
194
- /memory show
195
- /hooks list
196
- /agents list
197
- /mcp status
198
- /config get
199
- /layers
200
- /data schools --limit 10
201
- /schools --limit 10
202
- /schools get --inn 1215067180
203
- /kindergartens --search 29
204
- /search лицей --limit 3
205
- /mcp-info
206
- /ai doctor
207
- /context школа 29
208
- /profiles
209
- /profile use local
210
- /models openrouter --search qwen
211
- /use ollama
212
- /use openai
213
- /key status
214
- /key set openai
215
- /model
216
- /provider
217
- /config
218
- /history
219
- /history --limit 20
220
- /clear
221
- /update
222
- /init
223
- /exit
224
- ```
225
-
226
- Обычный текст без `/` в `iola agent` отправляется в настроенный AI-провайдер.
227
- `iola chat` запускает тот же интерактивный режим.
228
-
229
- ## AI-запросы
230
-
231
50
  Локальная модель через Ollama:
232
51
 
233
52
  ```bash
234
53
  iola ai setup ollama
235
- iola ai ask "Какие школы есть на улице Петрова?"
236
- iola ask "Какие школы есть на улице Петрова?"
237
- ```
238
-
239
- OpenAI:
240
-
241
- ```bash
242
- iola ai key set openai
243
- iola ai setup openai --model gpt-4.1-mini
244
- iola ai ask "Найди школу 29"
245
- ```
246
-
247
- OpenRouter:
248
-
249
- ```bash
250
- iola ai key set openrouter
251
- iola ai setup openrouter --model openai/gpt-4.1-mini
252
- iola ai ask "Покажи контакты лицея"
253
- ```
254
-
255
- Codex CLI:
256
-
257
- ```bash
258
- codex login
259
- iola ai setup codex --model gpt-5.5
260
- iola setup codex
261
- iola ask "Назови ИНН школы 29"
262
- ```
263
-
264
- AI-профили позволяют держать локальную модель, OpenAI, OpenRouter и Codex
265
- одновременно:
266
-
267
- ```bash
268
- iola ai profiles
269
- iola ai profile add local-small --provider ollama --model llama3.2:1b
270
- iola ai profile add gpt --provider openai --model gpt-4.1-mini
271
- iola ai profile add router-qwen --provider openrouter --model qwen/qwen3-32b
272
- iola ai profile add codex-read --provider codex --model gpt-5.5 --sandbox read-only
273
- iola ai profile use router-qwen
274
- ```
275
-
276
- Списки моделей:
277
-
278
- ```bash
279
- iola ai models ollama
280
- iola ai models openai
281
- iola ai models openrouter --search qwen
282
- iola ai models codex
283
- ```
284
-
285
- Для OpenAI список моделей требует сохраненный ключ. OpenRouter берется из
286
- публичного API OpenRouter. Ollama читает локальные модели через `api/tags`, а
287
- если Ollama не запущен, показывает рекомендуемые локальные модели.
288
-
289
- Проверить, какие данные попадут в AI-контекст:
290
-
291
- ```bash
292
- iola ai context "школа 29"
293
- iola ai context "1215067180" --json
294
- iola ai context "улица Петрова"
295
- ```
296
-
297
- Поиск контекста учитывает номера учреждений, ИНН и улицы.
298
-
299
- AI-ответ строится по контексту из публичного API. Ассистент получает краткий
300
- список источников контекста и должен указывать слой, название и ИНН, если
301
- отвечает по конкретным организациям.
302
-
303
- Ключи OpenAI/OpenRouter сохраняются локально на компьютере пользователя:
304
-
305
- ```text
306
- %USERPROFILE%\.iola\secrets.json
307
- ```
308
-
309
- Управление ключами:
310
-
311
- ```bash
312
- iola ai key set openai
313
- iola ai key set openrouter
314
- iola ai key status
315
- iola ai key delete openai
316
- ```
317
-
318
- Если одновременно задана переменная окружения (`OPENAI_API_KEY` или
319
- `OPENROUTER_API_KEY`) и сохранен локальный ключ, CLI использует переменную
320
- окружения как более приоритетную.
321
-
322
- Если данных в контексте недостаточно, ассистент должен сообщить об этом, а не
323
- выдумывать сведения.
324
-
325
- ## Назначение
326
-
327
- CLI дает прямой терминальный доступ к открытым данным городского округа,
328
- командам подключения MCP/skill, AI-запросам через Ollama/OpenAI/OpenRouter,
329
- интерактивному агентному режиму, экспорту данных и проверке обновлений.
330
-
331
- ## Локальная SQLite-БД
332
-
333
- CLI использует встроенный `node:sqlite` и хранит локальную БД в профиле
334
- пользователя:
335
-
336
- ```text
337
- %USERPROFILE%\.iola\iola.db
338
- ```
339
-
340
- БД создается автоматически при установке npm-пакета и при `iola init`.
341
- В ней хранятся история AI-запросов, контекст ответа, ошибки выполнения,
342
- служебная таблица версии схемы, а также подготовлены таблицы для кеша API и
343
- сохраненных выборок.
344
-
345
- Команды:
346
-
347
- ```bash
348
- iola db status
349
- iola db init
350
- iola db reset
351
- iola history --limit 20
352
- iola history --json
353
- iola history clear
354
- iola sessions --limit 20
355
- iola sessions clear
356
- iola resume 1 "продолжи"
357
- iola fork 1 "новая ветка разговора"
358
- ```
359
-
360
- Ключи OpenAI/OpenRouter в SQLite не сохраняются. Они остаются в локальном
361
- `secrets.json` или в переменных окружения.
362
-
363
- ## Feature flags, MCP и машинный вывод
364
-
365
- Экспериментальные и системные возможности можно включать отдельно:
366
-
367
- ```bash
368
- iola features list
369
- iola features enable api-cache
370
- iola features disable sqlite-history
371
- ```
372
-
373
- MCP-интеграции:
374
-
375
- ```bash
376
- iola mcp status
377
- iola mcp list
378
- iola mcp install codex
379
- iola mcp remove codex
380
- ```
381
-
382
- Для автоматизации доступны события, JSON-ответ и запись результата в файл:
383
-
384
- ```bash
385
- iola ask "Найди школу 29" --events
386
- iola ask "Найди школу 29" --schema json
387
- iola ask "Найди школу 29" --output answer.txt
388
- ```
389
-
390
- ## Кеш, локальный поиск и выборки
391
-
392
- API-ответы можно кешировать локально:
393
-
394
- ```bash
395
- iola cache status
396
- iola cache warm
397
- iola cache clear
398
- iola data schools --cache
399
- ```
400
-
401
- Локальная синхронизация сохраняет открытые слои в SQLite и позволяет искать без
402
- повторного обращения к API:
403
-
404
- ```bash
405
- iola sync
406
- iola sync status
407
- iola diff
408
- iola search "Петрова" --local
409
- iola search "школа Петрова" --local --fts
410
- iola data schools --local --search "лицей"
411
- ```
412
-
413
- Сохраненные выборки:
414
-
415
- ```bash
416
- iola data schools --where address=Петрова --columns name,address,phone --save schools-petrova
417
- iola views
418
- iola view schools-petrova
419
- iola view schools-petrova --format csv --output schools-petrova.csv
420
- iola views delete schools-petrova
421
- ```
422
-
423
- Отчеты, backup и алиасы:
424
-
425
- ```bash
426
- iola report schools-summary
427
- iola report education-contacts
428
- iola report missing-phones
429
- iola report licenses
430
- iola privacy
431
- iola backup create
432
- iola alias add petrova "data schools --where address=Петрова --columns name,address,phone"
433
- iola petrova
434
- iola run "выгрузи школы на Петрова в csv"
435
- ```
436
-
437
- ## Локальный tool-agent для слабых моделей
438
-
439
- Для локального профиля Ollama доступен режим `--tools`. Он сделан специально
440
- для маленьких моделей, которые хуже отвечают свободным текстом, но могут быть
441
- полезны как планировщик действий.
442
-
443
- В этом режиме CLI не доверяет модели напрямую. Модель предлагает JSON-план,
444
- CLI валидирует список разрешенных tools и сам выполняет действия через
445
- проверенные локальные функции:
446
-
447
- - `search_local`
448
- - `get_card`
449
- - `export_data`
450
- - `run_report`
451
- - `save_view`
452
-
453
- Пример:
454
-
455
- ```bash
456
54
  iola ask "выгрузи школы на Петрова в csv" --profile local --tools
457
- iola ask "найди детсады без телефона" --profile local --tools --reasoning verify
458
55
  ```
459
56
 
460
- Режимы:
57
+ Обновление:
461
58
 
462
59
  ```bash
463
- --reasoning fast # один план
464
- --reasoning verify # план с валидацией результата
465
- --reasoning vote # несколько вариантов, выбирается валидный
466
- ```
467
-
468
- OpenAI, OpenRouter и Codex работают как раньше. `--tools` применяется только
469
- к локальному Ollama-профилю, чтобы не менять поведение внешних провайдеров.
470
-
471
- Карточки, качество данных и изменения:
472
-
473
- ```bash
474
- iola card schools 1215067180
475
- iola card "школа 29"
476
- iola quality
477
- iola quality schools
478
- iola quality missing-phones
479
- iola quality invalid-emails
480
- iola quality duplicate-inn
481
- iola sync status
482
- iola diff
483
- iola diff schools
484
- ```
485
-
486
- ## Permissions, memory, hooks и agents
487
-
488
- Permissions ограничивают, что может делать локальный tool-agent:
489
-
490
- ```bash
491
- iola permissions list
492
- iola permissions deny export_data
493
- iola permissions allow export_data
494
- ```
495
-
496
- Memory хранит пользовательские предпочтения в локальной SQLite-БД и добавляет их
497
- в AI-контекст, кроме режима `--bare`:
498
-
499
- ```bash
500
- iola memory add "Если найден конкретный объект, показывай ИНН"
501
- iola memory show
502
- iola memory export
503
- ```
504
-
505
- Hooks запускают локальные команды на события CLI:
506
-
507
- ```bash
508
- iola hooks events
509
- iola hooks add AfterSync "iola quality"
510
- iola hooks list
511
- ```
512
-
513
- Поддерживаемые события: `SessionStart`, `BeforeTool`, `AfterTool`,
514
- `AfterSync`, `BeforeExport`, `SessionEnd`.
515
-
516
- Agents - готовые режимы работы поверх AI-профилей и локальных инструментов:
517
-
518
- ```bash
519
- iola agents list
520
- iola agents run quality-checker "проверь школы"
521
- iola agents run exporter "выгрузи школы на Петрова в csv"
522
- ```
523
-
524
- Для скриптов доступны минимальные режимы:
525
-
526
- ```bash
527
- iola ask "Найди школу 29" --bare
528
- iola ask "Найди школу 29" --quiet
529
- iola ask "Найди школу 29" --schema json --fail-on-empty
530
- iola --debug --debug-file iola-debug.log doctor
60
+ npm install -g @iola_adm/iola-cli@latest
61
+ iola version --check
531
62
  ```
532
63
 
533
- ## Wiki
534
-
535
- Подробные пользовательские инструкции ведутся в GitHub Wiki. Исходники страниц
536
- лежат в папке `wiki/`, чтобы их можно было редактировать и коммитить как обычные
537
- Markdown-файлы.
538
-
539
- Рекомендуемая структура: `Home`, `Установка`, `Первый-запуск`, `AI-профили`,
540
- `Локальный-инструментальный-агент`, `Команды`, `Решение-проблем`.
64
+ ## Документация
541
65
 
542
- ## Переменные окружения
66
+ - [Установка](https://github.com/adm-iola/iola-cli/wiki/Установка)
67
+ - [Первый запуск](https://github.com/adm-iola/iola-cli/wiki/Первый-запуск)
68
+ - [AI-профили](https://github.com/adm-iola/iola-cli/wiki/AI-профили)
69
+ - [Локальный инструментальный агент](https://github.com/adm-iola/iola-cli/wiki/Локальный-инструментальный-агент)
70
+ - [Команды](https://github.com/adm-iola/iola-cli/wiki/Команды)
71
+ - [Решение проблем](https://github.com/adm-iola/iola-cli/wiki/Решение-проблем)
543
72
 
544
- ```bash
545
- IOLA_API_BASE_URL=https://apiiola.yasg.ru/api/v1
546
- IOLA_MCP_BASE_URL=https://apiiola.yasg.ru
547
- ```
548
-
549
- Переменные окружения имеют приоритет над локальной конфигурацией. Локальные
550
- endpoints можно настроить так:
73
+ ## Возможности
551
74
 
552
- ```bash
553
- iola config set api.baseUrl https://apiiola.yasg.ru/api/v1
554
- iola config set api.mcpBaseUrl https://apiiola.yasg.ru
555
- iola config get
556
- ```
75
+ - поиск и выгрузка открытых данных;
76
+ - локальная SQLite-БД, история, сессии и FTS-поиск;
77
+ - AI-профили для Ollama, OpenAI, OpenRouter и Codex CLI;
78
+ - локальный tool-agent для слабых моделей;
79
+ - permissions, memory, hooks и готовые agents;
80
+ - интеграция с публичным MCP-сервером Йошкар-Олы.
package/bin/iola.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.1.19",
3
+ "version": "0.1.21",
4
4
  "description": "CLI и AI-агент для работы с открытыми данными городского округа Йошкар-Ола.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/adm-iola/iola-cli#readme",
package/src/cli.js CHANGED
@@ -153,6 +153,7 @@ const COMMANDS = new Map([
153
153
  ["resume", resumeSession],
154
154
  ["fork", forkSession],
155
155
  ["features", handleFeatures],
156
+ ["wiki", handleWiki],
156
157
  ["permissions", handlePermissions],
157
158
  ["memory", handleMemory],
158
159
  ["hooks", handleHooks],
@@ -248,6 +249,7 @@ Usage:
248
249
  iola resume SESSION_ID [TEXT]
249
250
  iola fork SESSION_ID [TEXT]
250
251
  iola features list|enable|disable
252
+ iola wiki [open|links]
251
253
  iola permissions list|allow|deny
252
254
  iola memory show|add|set|clear|export
253
255
  iola hooks list|add|delete|run
@@ -408,6 +410,11 @@ async function handleAgentLine(line, state) {
408
410
  return false;
409
411
  }
410
412
 
413
+ if (command === "wiki") {
414
+ await handleWiki(args);
415
+ return false;
416
+ }
417
+
411
418
  if (command === "permissions") {
412
419
  await handlePermissions(args);
413
420
  return false;
@@ -537,6 +544,7 @@ async function handleAgentLine(line, state) {
537
544
  resume: ["resume", args],
538
545
  fork: ["fork", args],
539
546
  features: ["features", args],
547
+ wiki: ["wiki", args],
540
548
  permissions: ["permissions", args],
541
549
  memory: ["memory", args],
542
550
  hooks: ["hooks", args],
@@ -576,6 +584,7 @@ function printAgentHelp() {
576
584
  /sessions
577
585
  /resume SESSION_ID
578
586
  /features list
587
+ /wiki
579
588
  /permissions
580
589
  /tools
581
590
  /memory show
@@ -1189,6 +1198,47 @@ async function handleFeatures(args) {
1189
1198
  throw new Error("Команды features: list, enable NAME, disable NAME.");
1190
1199
  }
1191
1200
 
1201
+ async function handleWiki(args) {
1202
+ const [action = "links"] = args;
1203
+ const base = "https://github.com/adm-iola/iola-cli/wiki";
1204
+ const links = [
1205
+ ["Главная", base],
1206
+ ["Установка", `${base}/Установка`],
1207
+ ["Первый запуск", `${base}/Первый-запуск`],
1208
+ ["AI-профили", `${base}/AI-профили`],
1209
+ ["Локальный инструментальный агент", `${base}/Локальный-инструментальный-агент`],
1210
+ ["Команды", `${base}/Команды`],
1211
+ ["Решение проблем", `${base}/Решение-проблем`],
1212
+ ].map(([title, url]) => ({ title, url }));
1213
+
1214
+ if (action === "open") {
1215
+ await openUrl(base);
1216
+ return;
1217
+ }
1218
+
1219
+ if (action === "links" || action === "list" || action === "ls") {
1220
+ printTable(links, [
1221
+ ["title", "Раздел"],
1222
+ ["url", "Ссылка"],
1223
+ ]);
1224
+ return;
1225
+ }
1226
+
1227
+ throw new Error("Команды wiki: links, open.");
1228
+ }
1229
+
1230
+ async function openUrl(url) {
1231
+ if (process.platform === "win32") {
1232
+ await runCommand("rundll32", ["url.dll,FileProtocolHandler", url], { inherit: false });
1233
+ return;
1234
+ }
1235
+ if (process.platform === "darwin") {
1236
+ await runCommand("open", [url], { inherit: false });
1237
+ return;
1238
+ }
1239
+ await runCommand("xdg-open", [url], { inherit: false });
1240
+ }
1241
+
1192
1242
  async function handlePermissions(args) {
1193
1243
  const [action = "list", name] = args;
1194
1244
  const config = await loadConfig();