@iola_adm/iola-cli 0.1.33 → 0.1.35

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,7 +2,7 @@
2
2
 
3
3
  # iola-cli
4
4
 
5
- CLI и AI-агент для работы с открытыми данными городского округа "Город Йошкар-Ола".
5
+ CLI и AI-агент городского округа "Город Йошкар-Ола".
6
6
 
7
7
  Подробная документация: [GitHub Wiki](https://github.com/adm-iola/iola-cli/wiki).
8
8
 
@@ -26,16 +26,26 @@ npm --version
26
26
 
27
27
  ```bash
28
28
  npm install -g @iola_adm/iola-cli
29
- iola init
30
- iola --help
29
+ iola
31
30
  ```
32
31
 
33
32
  Без глобальной установки:
34
33
 
35
34
  ```bash
36
- npx -y @iola_adm/iola-cli init
35
+ npx -y @iola_adm/iola-cli
37
36
  ```
38
37
 
38
+ При первом запуске `iola` открывает мастер настройки, затем запускает интерактивный агент. Короткая справка: `iola help`, полный список команд: `iola commands`.
39
+
40
+ Повторный запуск мастера:
41
+
42
+ ```bash
43
+ iola wizard
44
+ iola setup wizard
45
+ ```
46
+
47
+ Мастер обновляет только выбранные разделы и не сбрасывает остальные настройки.
48
+
39
49
  Основные команды:
40
50
 
41
51
  ```bash
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.1.33",
4
- "description": "CLI и AI-агент для работы с открытыми данными городского округа Йошкар-Ола.",
3
+ "version": "0.1.35",
4
+ "description": "CLI и AI-агент городского округа Йошкар-Ола.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/adm-iola/iola-cli#readme",
7
7
  "repository": {
package/src/cli.js CHANGED
@@ -271,7 +271,7 @@ const BANNER = `\x1b[38;5;45m┌────────────────
271
271
  │\x1b[38;5;51m | |___| |___ | |_____| __/| _ <| |_| | |___| . \\ | | \x1b[38;5;45m│
272
272
  │\x1b[38;5;51m \\____|_____|___| |_| |_| \\_\\\\___/|_____|_|\\_\\ |_| \x1b[38;5;45m│
273
273
  │ │
274
- │\x1b[38;5;213m Й О Ш К А Р - О Л Ы \x1b[38;5;45m│
274
+ │\x1b[38;5;213m C L I - Й О Ш К А Р - О Л А \x1b[38;5;45m│
275
275
  │ │
276
276
  │\x1b[38;5;250m открытые данные • MCP • локальный AI \x1b[38;5;45m│
277
277
  │ │
@@ -280,6 +280,7 @@ const BANNER = `\x1b[38;5;45m┌────────────────
280
280
 
281
281
  const COMMANDS = new Map([
282
282
  ["help", showHelp],
283
+ ["commands", showCommands],
283
284
  ["version", showVersion],
284
285
  ["update", checkUpdate],
285
286
  ["doctor", doctor],
@@ -352,10 +353,16 @@ const COMMANDS = new Map([
352
353
  ["mcp-info", showMcpInfo],
353
354
  ["setup", setupClient],
354
355
  ["onboard", onboard],
356
+ ["wizard", onboard],
355
357
  ]);
356
358
 
357
359
  export async function main(argv) {
358
- if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
360
+ if (argv.length === 0) {
361
+ await runDefaultCli();
362
+ return;
363
+ }
364
+
365
+ if (argv[0] === "--help" || argv[0] === "-h") {
359
366
  await showHelp();
360
367
  return;
361
368
  }
@@ -398,6 +405,35 @@ export async function main(argv) {
398
405
  }
399
406
 
400
407
  async function showHelp() {
408
+ showBanner();
409
+ console.log(`iola - CLI и AI-агент городского округа "Город Йошкар-Ола"
410
+
411
+ Запуск:
412
+ iola открыть интерактивный агент
413
+ iola wizard мастер настройки
414
+ iola ask "найди школу 29" задать вопрос
415
+ iola search "Петрова" поиск по открытым данным
416
+
417
+ Основные разделы:
418
+ iola agent интерактивный режим
419
+ iola ai setup настройка AI-профиля
420
+ iola browser status браузерный runtime
421
+ iola gosuslugi status личное подключение Госуслуг
422
+ iola mcp status MCP-подключение
423
+ iola doctor диагностика
424
+ iola wiki документация
425
+
426
+ Справка:
427
+ iola help короткая справка
428
+ iola commands полный список команд
429
+ iola version версия
430
+
431
+ Requirements:
432
+ Node.js >= ${MIN_NODE_VERSION}
433
+ `);
434
+ }
435
+
436
+ async function showCommands() {
401
437
  showBanner();
402
438
  console.log(`iola - CLI для открытых данных городского округа "Город Йошкар-Ола"
403
439
 
@@ -498,6 +534,7 @@ Usage:
498
534
  iola mcp-info [--json]
499
535
  iola setup codex
500
536
  iola onboard
537
+ iola wizard
501
538
  iola version
502
539
 
503
540
  Environment:
@@ -509,6 +546,26 @@ Requirements:
509
546
  `);
510
547
  }
511
548
 
549
+ async function runDefaultCli() {
550
+ const nodeStatus = getNodeRequirementStatus();
551
+ if (!nodeStatus.ok) {
552
+ throw new Error(`Нужен Node.js ${MIN_NODE_VERSION} или новее. Сейчас: ${nodeStatus.current}. Запустите: iola init --upgrade-node`);
553
+ }
554
+
555
+ initDatabase();
556
+ if (!isFirstRunCompleted()) {
557
+ showBanner();
558
+ console.log("Первый запуск iola-cli. Сейчас откроется мастер настройки.");
559
+ console.log("После мастера запустится интерактивный агент.");
560
+ console.log("");
561
+ await onboard([]);
562
+ markFirstRunCompleted();
563
+ console.log("");
564
+ }
565
+
566
+ await startAgent([]);
567
+ }
568
+
512
569
  async function startAgent() {
513
570
  showBanner();
514
571
  console.log("Интерактивный режим. Введите /help для списка команд, /exit для выхода.");
@@ -905,6 +962,8 @@ async function handleAgentLine(line, state) {
905
962
  search: ["search", args],
906
963
  "mcp-info": ["mcp-info", args],
907
964
  setup: ["setup", args],
965
+ wizard: ["wizard", args],
966
+ onboard: ["onboard", args],
908
967
  }[command];
909
968
 
910
969
  if (!mapped) {
@@ -923,6 +982,7 @@ function printAgentHelp() {
923
982
  /help
924
983
  /health
925
984
  /doctor
985
+ /wizard
926
986
  /db status
927
987
  /sessions
928
988
  /resume SESSION_ID
@@ -1042,12 +1102,13 @@ function safePrompt(rl, closed = false) {
1042
1102
  }
1043
1103
 
1044
1104
  function showBanner() {
1105
+ const version = getPackageVersion();
1045
1106
  if (process.stdout.isTTY && process.env.NO_COLOR !== "1") {
1046
- console.log(BANNER);
1107
+ console.log(BANNER.replace("> iola help", `v${version} • iola help`));
1047
1108
  return;
1048
1109
  }
1049
1110
 
1050
- console.log("CLI-ПРОЕКТ ЙОШКАР-ОЛЫ");
1111
+ console.log(`CLI-ЙОШКАР-ОЛА v${version}`);
1051
1112
  console.log("открытые данные • MCP • локальный AI");
1052
1113
  }
1053
1114
 
@@ -4421,6 +4482,34 @@ function getDbStatus() {
4421
4482
  }
4422
4483
  }
4423
4484
 
4485
+ function getMetaValue(key) {
4486
+ initDatabase();
4487
+ const db = openDatabase();
4488
+ try {
4489
+ return db.prepare("SELECT value FROM meta WHERE key = ?").get(key)?.value || null;
4490
+ } finally {
4491
+ db.close();
4492
+ }
4493
+ }
4494
+
4495
+ function setMetaValue(key, value) {
4496
+ initDatabase();
4497
+ const db = openDatabase();
4498
+ try {
4499
+ db.prepare("INSERT INTO meta(key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, String(value));
4500
+ } finally {
4501
+ db.close();
4502
+ }
4503
+ }
4504
+
4505
+ function isFirstRunCompleted() {
4506
+ return getMetaValue("first_run_completed") === "1";
4507
+ }
4508
+
4509
+ function markFirstRunCompleted() {
4510
+ setMetaValue("first_run_completed", "1");
4511
+ }
4512
+
4424
4513
  function recordAskHistory({ question, answer, providerConfig, dataContext, error, sessionId }) {
4425
4514
  try {
4426
4515
  initDatabase();
@@ -6231,10 +6320,15 @@ async function searchAll(args) {
6231
6320
  }
6232
6321
 
6233
6322
  async function setupClient(args) {
6234
- const [client] = args;
6323
+ const [client, ...rest] = args;
6324
+
6325
+ if (client === "wizard" || client === "onboard") {
6326
+ await onboard(rest);
6327
+ return;
6328
+ }
6235
6329
 
6236
6330
  if (client !== "codex") {
6237
- throw new Error('Only "iola setup codex" is available in this first release.');
6331
+ throw new Error('Доступно: iola setup codex, iola setup wizard.');
6238
6332
  }
6239
6333
 
6240
6334
  await runCommand("codex", ["mcp", "add", "yoshkarOlaPublicData", "--url", `${await getMcpBaseUrl()}/mcp`], { inherit: true });
@@ -6245,10 +6339,20 @@ async function setupClient(args) {
6245
6339
  async function onboard(args = []) {
6246
6340
  const options = parseOptions(args);
6247
6341
  showBanner();
6342
+ console.log("Мастер настройки iola-cli.");
6343
+ console.log("Повторный запуск обновляет только выбранные разделы и не сбрасывает остальные настройки.");
6344
+ console.log("");
6248
6345
  initDatabase();
6249
6346
  await handleConfig(["validate"]);
6250
6347
  await doctor(["--summary"]);
6251
- await ensureArchiveTool({ install: true });
6348
+ if (options.full || options.install) {
6349
+ await ensureArchiveTool({ install: true });
6350
+ } else {
6351
+ const archiveTool = await findCommand(["7z", "7zz", "7za"], ["--help"]);
6352
+ if (!archiveTool) {
6353
+ console.log("7-Zip не найден. Для архивов можно позже запустить: iola archive doctor");
6354
+ }
6355
+ }
6252
6356
 
6253
6357
  const components = options.yes ? ["workspace", "policy", "ollama", "openai", "openrouter", "codex", "codex-mcp", "index"] : await chooseOnboardComponents();
6254
6358
  if (components.includes("workspace")) await handleWorkspace(["init"]);
@@ -6270,10 +6374,21 @@ async function onboard(args = []) {
6270
6374
  await aiSetup(["codex"]);
6271
6375
  }
6272
6376
  if (components.includes("codex-mcp")) await setupClient(["codex"]);
6377
+ if (components.includes("browser")) {
6378
+ const status = await getBrowserStatus();
6379
+ if (status.installed === "yes") console.log("Browser runtime уже установлен.");
6380
+ else await installBrowserRuntime();
6381
+ }
6382
+ if (components.includes("gosuslugi")) {
6383
+ await handleGosuslugi(["terms"]);
6384
+ if (process.stdin.isTTY) await handleGosuslugi(["consent"]);
6385
+ console.log("Параметры подключения можно указать командой: iola gosuslugi configure --auth-url URL --token-url URL --client-id ID --scope openid");
6386
+ }
6273
6387
  if (components.includes("index")) {
6274
6388
  await setFilesMode("read-only", await loadConfig());
6275
6389
  console.log("Индекс документов можно запустить командой: iola index folder ./docs");
6276
6390
  }
6391
+ markFirstRunCompleted();
6277
6392
  console.log("Onboard завершен.");
6278
6393
  }
6279
6394
 
@@ -6289,6 +6404,8 @@ async function chooseOnboardComponents() {
6289
6404
  console.log("6. Codex CLI");
6290
6405
  console.log("7. MCP для Codex");
6291
6406
  console.log("8. Индекс локальных документов");
6407
+ console.log("9. Browser runtime");
6408
+ console.log("10. Личное подключение Госуслуг");
6292
6409
  console.log("");
6293
6410
  const rl = readline.createInterface({ input, output });
6294
6411
  try {
@@ -6303,6 +6420,8 @@ async function chooseOnboardComponents() {
6303
6420
  6: "codex",
6304
6421
  7: "codex-mcp",
6305
6422
  8: "index",
6423
+ 9: "browser",
6424
+ 10: "gosuslugi",
6306
6425
  };
6307
6426
  return [...selected].map((item) => map[item] || item).filter(Boolean);
6308
6427
  } finally {
package/wiki/Home.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # iola-cli
2
2
 
3
- `iola-cli` - терминальный инструмент и AI-агент для работы с открытыми данными городского округа "Город Йошкар-Ола".
3
+ `iola-cli` - CLI и AI-агент городского округа "Город Йошкар-Ола".
4
4
 
5
5
  Основные сценарии:
6
6
 
@@ -4,6 +4,8 @@
4
4
 
5
5
  ```bash
6
6
  iola --help
7
+ iola help
8
+ iola commands
7
9
  iola init
8
10
  iola doctor
9
11
  iola doctor --fix
@@ -3,16 +3,42 @@
3
3
  Первый запуск:
4
4
 
5
5
  ```bash
6
- iola init
6
+ iola
7
7
  ```
8
8
 
9
- Команда проверит:
9
+ При первом запуске команда откроет мастер настройки, а затем запустит интерактивный агент.
10
+
11
+ Мастер проверит:
10
12
 
11
13
  - Node.js и npm;
12
14
  - локальную SQLite-БД;
13
15
  - доступность публичного API/MCP;
14
- - Ollama и подходящую локальную модель;
15
- - обновления npm-пакета.
16
+ - обновления npm-пакета;
17
+ - выбранные компоненты: workspace, policy, локальную модель, API-ключи, Codex, MCP, индекс документов.
18
+
19
+ Обычный последующий запуск:
20
+
21
+ ```bash
22
+ iola
23
+ ```
24
+
25
+ Команда сразу откроет интерактивный CLI-агент.
26
+
27
+ Справка:
28
+
29
+ ```bash
30
+ iola help
31
+ iola commands
32
+ ```
33
+
34
+ Повторный запуск мастера:
35
+
36
+ ```bash
37
+ iola wizard
38
+ iola setup wizard
39
+ ```
40
+
41
+ Мастер обновляет только выбранные разделы и не сбрасывает остальные настройки.
16
42
 
17
43
  Диагностика:
18
44
 
@@ -1,6 +1,6 @@
1
1
  # Платформа агента
2
2
 
3
- `iola-cli` можно использовать не только как набор команд, но и как локальную платформу агента для работы с открытыми данными городского округа "Город Йошкар-Ола".
3
+ `iola-cli` можно использовать не только как набор команд, но и как локальную платформу AI-агента городского округа "Город Йошкар-Ола".
4
4
 
5
5
  ## MCP server
6
6
 
@@ -101,4 +101,3 @@ iola review data
101
101
  iola review docs ./docs
102
102
  iola review report report.docx
103
103
  ```
104
-