@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 +14 -4
- package/package.json +2 -2
- package/src/cli.js +126 -7
- package/wiki/Home.md +1 -1
- package/wiki//320/232/320/276/320/274/320/260/320/275/320/264/321/213.md +2 -0
- package/wiki//320/237/320/265/321/200/320/262/321/213/320/271-/320/267/320/260/320/277/321/203/321/201/320/272.md +30 -4
- package/wiki//320/237/320/273/320/260/321/202/321/204/320/276/321/200/320/274/320/260-/320/260/320/263/320/265/320/275/321/202/320/260.md +1 -2
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
|
|
30
|
-
iola --help
|
|
29
|
+
iola
|
|
31
30
|
```
|
|
32
31
|
|
|
33
32
|
Без глобальной установки:
|
|
34
33
|
|
|
35
34
|
```bash
|
|
36
|
-
npx -y @iola_adm/iola-cli
|
|
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.
|
|
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 Й О Ш К А Р - О Л
|
|
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
|
|
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(
|
|
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('
|
|
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
|
-
|
|
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
|
@@ -3,16 +3,42 @@
|
|
|
3
3
|
Первый запуск:
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
iola
|
|
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
|
-
-
|
|
15
|
-
-
|
|
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
|
-
|