@iola_adm/iola-cli 0.1.34 → 0.1.36
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 +10 -1
- package/package.json +2 -2
- package/src/cli.js +69 -23
- package/wiki/Home.md +1 -1
- 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 +9 -0
- 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
|
|
|
@@ -37,6 +37,15 @@ npx -y @iola_adm/iola-cli
|
|
|
37
37
|
|
|
38
38
|
При первом запуске `iola` открывает мастер настройки, затем запускает интерактивный агент. Короткая справка: `iola help`, полный список команд: `iola commands`.
|
|
39
39
|
|
|
40
|
+
Повторный запуск мастера:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
iola wizard
|
|
44
|
+
iola setup wizard
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Мастер обновляет только выбранные разделы и не сбрасывает остальные настройки.
|
|
48
|
+
|
|
40
49
|
Основные команды:
|
|
41
50
|
|
|
42
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.36",
|
|
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
|
@@ -265,17 +265,18 @@ const DATASETS = {
|
|
|
265
265
|
},
|
|
266
266
|
};
|
|
267
267
|
const BANNER = `\x1b[38;5;45m┌────────────────────────────────────────────────────────────────────────────┐
|
|
268
|
-
│\x1b[38;5;51m ____ _ ___ ____ ____ ___ _____ _ _______ \x1b[38;5;45m│
|
|
269
|
-
│\x1b[38;5;51m / ___| | |_ _| | _ \\| _ \\ / _ \\| ____| |/ /_ _| \x1b[38;5;45m│
|
|
270
|
-
│\x1b[38;5;51m | | | | | |_____| |_) | |_) | | | | _| | ' / | | \x1b[38;5;45m│
|
|
271
|
-
│\x1b[38;5;51m | |___| |___ | |_____| __/| _ <| |_| | |___| . \\ | | \x1b[38;5;45m│
|
|
272
|
-
│\x1b[38;5;51m \\____|_____|___| |_| |_| \\_\\\\___/|_____|_|\\_\\ |_| \x1b[38;5;45m│
|
|
273
268
|
│ │
|
|
274
|
-
│\x1b[38;5;
|
|
269
|
+
│\x1b[38;5;51m ____ _ ___ __ ______ ____ _ _ _ __ _ ____ \x1b[38;5;45m│
|
|
270
|
+
│\x1b[38;5;51m / ___| | |_ _| \\ \\ / / ___|| _ \\| | | | |/ / / \\ | _ \\ \x1b[38;5;45m│
|
|
271
|
+
│\x1b[38;5;51m | | | | | | _____ \\ V /\\___ \\| | | | |_| | ' / / _ \\ | |_) | \x1b[38;5;45m│
|
|
272
|
+
│\x1b[38;5;51m | |___| |___ | | |_____| | | ___) | |_| | _ | . \\ / ___ \\| _ < \x1b[38;5;45m│
|
|
273
|
+
│\x1b[38;5;51m \\____|_____|___| |_| |____/|____/|_| |_|_|\\_\\/_/ \\_\\_| \\_\\ \x1b[38;5;45m│
|
|
274
|
+
│ │
|
|
275
|
+
│\x1b[38;5;213m CLI-ЙОШКАР-ОЛА \x1b[38;5;45m│
|
|
275
276
|
│ │
|
|
276
277
|
│\x1b[38;5;250m открытые данные • MCP • локальный AI \x1b[38;5;45m│
|
|
277
278
|
│ │
|
|
278
|
-
│\x1b[38;5;82m
|
|
279
|
+
│\x1b[38;5;82m VERSION_LINE \x1b[38;5;45m│
|
|
279
280
|
└────────────────────────────────────────────────────────────────────────────┘\x1b[0m`;
|
|
280
281
|
|
|
281
282
|
const COMMANDS = new Map([
|
|
@@ -353,6 +354,7 @@ const COMMANDS = new Map([
|
|
|
353
354
|
["mcp-info", showMcpInfo],
|
|
354
355
|
["setup", setupClient],
|
|
355
356
|
["onboard", onboard],
|
|
357
|
+
["wizard", onboard],
|
|
356
358
|
]);
|
|
357
359
|
|
|
358
360
|
export async function main(argv) {
|
|
@@ -404,12 +406,12 @@ export async function main(argv) {
|
|
|
404
406
|
}
|
|
405
407
|
|
|
406
408
|
async function showHelp() {
|
|
407
|
-
showBanner();
|
|
408
|
-
console.log(`iola -
|
|
409
|
+
await showBanner();
|
|
410
|
+
console.log(`iola - CLI и AI-агент городского округа "Город Йошкар-Ола"
|
|
409
411
|
|
|
410
412
|
Запуск:
|
|
411
413
|
iola открыть интерактивный агент
|
|
412
|
-
iola
|
|
414
|
+
iola wizard мастер настройки
|
|
413
415
|
iola ask "найди школу 29" задать вопрос
|
|
414
416
|
iola search "Петрова" поиск по открытым данным
|
|
415
417
|
|
|
@@ -433,7 +435,7 @@ Requirements:
|
|
|
433
435
|
}
|
|
434
436
|
|
|
435
437
|
async function showCommands() {
|
|
436
|
-
showBanner();
|
|
438
|
+
await showBanner();
|
|
437
439
|
console.log(`iola - CLI для открытых данных городского округа "Город Йошкар-Ола"
|
|
438
440
|
|
|
439
441
|
Usage:
|
|
@@ -533,6 +535,7 @@ Usage:
|
|
|
533
535
|
iola mcp-info [--json]
|
|
534
536
|
iola setup codex
|
|
535
537
|
iola onboard
|
|
538
|
+
iola wizard
|
|
536
539
|
iola version
|
|
537
540
|
|
|
538
541
|
Environment:
|
|
@@ -552,7 +555,7 @@ async function runDefaultCli() {
|
|
|
552
555
|
|
|
553
556
|
initDatabase();
|
|
554
557
|
if (!isFirstRunCompleted()) {
|
|
555
|
-
showBanner();
|
|
558
|
+
await showBanner();
|
|
556
559
|
console.log("Первый запуск iola-cli. Сейчас откроется мастер настройки.");
|
|
557
560
|
console.log("После мастера запустится интерактивный агент.");
|
|
558
561
|
console.log("");
|
|
@@ -565,7 +568,7 @@ async function runDefaultCli() {
|
|
|
565
568
|
}
|
|
566
569
|
|
|
567
570
|
async function startAgent() {
|
|
568
|
-
showBanner();
|
|
571
|
+
await showBanner();
|
|
569
572
|
console.log("Интерактивный режим. Введите /help для списка команд, /exit для выхода.");
|
|
570
573
|
await runHooks("SessionStart", { mode: "agent" });
|
|
571
574
|
|
|
@@ -895,7 +898,7 @@ async function handleAgentLine(line, state) {
|
|
|
895
898
|
}
|
|
896
899
|
|
|
897
900
|
if (command === "banner") {
|
|
898
|
-
showBanner();
|
|
901
|
+
await showBanner();
|
|
899
902
|
return false;
|
|
900
903
|
}
|
|
901
904
|
|
|
@@ -960,6 +963,8 @@ async function handleAgentLine(line, state) {
|
|
|
960
963
|
search: ["search", args],
|
|
961
964
|
"mcp-info": ["mcp-info", args],
|
|
962
965
|
setup: ["setup", args],
|
|
966
|
+
wizard: ["wizard", args],
|
|
967
|
+
onboard: ["onboard", args],
|
|
963
968
|
}[command];
|
|
964
969
|
|
|
965
970
|
if (!mapped) {
|
|
@@ -978,6 +983,7 @@ function printAgentHelp() {
|
|
|
978
983
|
/help
|
|
979
984
|
/health
|
|
980
985
|
/doctor
|
|
986
|
+
/wizard
|
|
981
987
|
/db status
|
|
982
988
|
/sessions
|
|
983
989
|
/resume SESSION_ID
|
|
@@ -1096,14 +1102,32 @@ function safePrompt(rl, closed = false) {
|
|
|
1096
1102
|
}
|
|
1097
1103
|
}
|
|
1098
1104
|
|
|
1099
|
-
function showBanner() {
|
|
1105
|
+
async function showBanner(options = {}) {
|
|
1106
|
+
const version = getPackageVersion();
|
|
1107
|
+
const latest = options.skipUpdate ? null : await getLatestNpmVersion("@iola_adm/iola-cli");
|
|
1108
|
+
const updateAvailable = latest && compareVersions(latest, version) > 0;
|
|
1109
|
+
const versionLine = updateAvailable ? `v${version} -> v${latest} • npm install -g @iola_adm/iola-cli@latest` : `v${version} • iola help`;
|
|
1100
1110
|
if (process.stdout.isTTY && process.env.NO_COLOR !== "1") {
|
|
1101
|
-
console.log(BANNER);
|
|
1111
|
+
console.log(BANNER.replace("VERSION_LINE", padBannerLine(versionLine)));
|
|
1112
|
+
if (updateAvailable) {
|
|
1113
|
+
console.log(`Доступно обновление: v${version} -> v${latest}`);
|
|
1114
|
+
console.log("Обновить: npm install -g @iola_adm/iola-cli@latest");
|
|
1115
|
+
}
|
|
1102
1116
|
return;
|
|
1103
1117
|
}
|
|
1104
1118
|
|
|
1105
|
-
console.log(
|
|
1119
|
+
console.log(`CLI-ЙОШКАР-ОЛА ${updateAvailable ? `v${version} -> v${latest}` : `v${version}`}`);
|
|
1106
1120
|
console.log("открытые данные • MCP • локальный AI");
|
|
1121
|
+
if (updateAvailable) console.log("Обновить: npm install -g @iola_adm/iola-cli@latest");
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
function padBannerLine(value) {
|
|
1125
|
+
const text = String(value).slice(0, 62);
|
|
1126
|
+
return `${text}${" ".repeat(Math.max(0, 62 - bannerVisibleLength(text)))}`;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
function bannerVisibleLength(value) {
|
|
1130
|
+
return [...String(value)].length;
|
|
1107
1131
|
}
|
|
1108
1132
|
|
|
1109
1133
|
function getPackageVersion() {
|
|
@@ -1386,7 +1410,7 @@ async function initCli(args = []) {
|
|
|
1386
1410
|
const options = parseOptions(args);
|
|
1387
1411
|
const nodeStatus = getNodeRequirementStatus();
|
|
1388
1412
|
|
|
1389
|
-
showBanner();
|
|
1413
|
+
await showBanner();
|
|
1390
1414
|
console.log("Проверка окружения");
|
|
1391
1415
|
initDatabase();
|
|
1392
1416
|
const dbStatus = getDbStatus();
|
|
@@ -1433,7 +1457,7 @@ async function handleAi(args) {
|
|
|
1433
1457
|
const [subcommand = "help", ...rest] = args;
|
|
1434
1458
|
|
|
1435
1459
|
if (subcommand === "help") {
|
|
1436
|
-
showBanner();
|
|
1460
|
+
await showBanner();
|
|
1437
1461
|
console.log(`AI-команды:
|
|
1438
1462
|
iola ai ask TEXT [--provider ollama|openai|openrouter] [--model MODEL]
|
|
1439
1463
|
iola ai context TEXT [--json]
|
|
@@ -3705,7 +3729,7 @@ async function aiSetup(args) {
|
|
|
3705
3729
|
const [provider] = args;
|
|
3706
3730
|
|
|
3707
3731
|
if (!provider) {
|
|
3708
|
-
showBanner();
|
|
3732
|
+
await showBanner();
|
|
3709
3733
|
const selected = await chooseAiProvider();
|
|
3710
3734
|
await aiSetup([selected]);
|
|
3711
3735
|
return;
|
|
@@ -6314,10 +6338,15 @@ async function searchAll(args) {
|
|
|
6314
6338
|
}
|
|
6315
6339
|
|
|
6316
6340
|
async function setupClient(args) {
|
|
6317
|
-
const [client] = args;
|
|
6341
|
+
const [client, ...rest] = args;
|
|
6342
|
+
|
|
6343
|
+
if (client === "wizard" || client === "onboard") {
|
|
6344
|
+
await onboard(rest);
|
|
6345
|
+
return;
|
|
6346
|
+
}
|
|
6318
6347
|
|
|
6319
6348
|
if (client !== "codex") {
|
|
6320
|
-
throw new Error('
|
|
6349
|
+
throw new Error('Доступно: iola setup codex, iola setup wizard.');
|
|
6321
6350
|
}
|
|
6322
6351
|
|
|
6323
6352
|
await runCommand("codex", ["mcp", "add", "yoshkarOlaPublicData", "--url", `${await getMcpBaseUrl()}/mcp`], { inherit: true });
|
|
@@ -6327,7 +6356,10 @@ async function setupClient(args) {
|
|
|
6327
6356
|
|
|
6328
6357
|
async function onboard(args = []) {
|
|
6329
6358
|
const options = parseOptions(args);
|
|
6330
|
-
showBanner();
|
|
6359
|
+
await showBanner();
|
|
6360
|
+
console.log("Мастер настройки iola-cli.");
|
|
6361
|
+
console.log("Повторный запуск обновляет только выбранные разделы и не сбрасывает остальные настройки.");
|
|
6362
|
+
console.log("");
|
|
6331
6363
|
initDatabase();
|
|
6332
6364
|
await handleConfig(["validate"]);
|
|
6333
6365
|
await doctor(["--summary"]);
|
|
@@ -6360,6 +6392,16 @@ async function onboard(args = []) {
|
|
|
6360
6392
|
await aiSetup(["codex"]);
|
|
6361
6393
|
}
|
|
6362
6394
|
if (components.includes("codex-mcp")) await setupClient(["codex"]);
|
|
6395
|
+
if (components.includes("browser")) {
|
|
6396
|
+
const status = await getBrowserStatus();
|
|
6397
|
+
if (status.installed === "yes") console.log("Browser runtime уже установлен.");
|
|
6398
|
+
else await installBrowserRuntime();
|
|
6399
|
+
}
|
|
6400
|
+
if (components.includes("gosuslugi")) {
|
|
6401
|
+
await handleGosuslugi(["terms"]);
|
|
6402
|
+
if (process.stdin.isTTY) await handleGosuslugi(["consent"]);
|
|
6403
|
+
console.log("Параметры подключения можно указать командой: iola gosuslugi configure --auth-url URL --token-url URL --client-id ID --scope openid");
|
|
6404
|
+
}
|
|
6363
6405
|
if (components.includes("index")) {
|
|
6364
6406
|
await setFilesMode("read-only", await loadConfig());
|
|
6365
6407
|
console.log("Индекс документов можно запустить командой: iola index folder ./docs");
|
|
@@ -6380,6 +6422,8 @@ async function chooseOnboardComponents() {
|
|
|
6380
6422
|
console.log("6. Codex CLI");
|
|
6381
6423
|
console.log("7. MCP для Codex");
|
|
6382
6424
|
console.log("8. Индекс локальных документов");
|
|
6425
|
+
console.log("9. Browser runtime");
|
|
6426
|
+
console.log("10. Личное подключение Госуслуг");
|
|
6383
6427
|
console.log("");
|
|
6384
6428
|
const rl = readline.createInterface({ input, output });
|
|
6385
6429
|
try {
|
|
@@ -6394,6 +6438,8 @@ async function chooseOnboardComponents() {
|
|
|
6394
6438
|
6: "codex",
|
|
6395
6439
|
7: "codex-mcp",
|
|
6396
6440
|
8: "index",
|
|
6441
|
+
9: "browser",
|
|
6442
|
+
10: "gosuslugi",
|
|
6397
6443
|
};
|
|
6398
6444
|
return [...selected].map((item) => map[item] || item).filter(Boolean);
|
|
6399
6445
|
} finally {
|
package/wiki/Home.md
CHANGED
|
@@ -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
|
-
|