@iola_adm/iola-cli 0.2.43 → 0.2.45

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iola_adm/iola-cli",
3
- "version": "0.2.43",
3
+ "version": "0.2.45",
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
@@ -16668,6 +16668,7 @@ async function onboard(args = []) {
16668
16668
  if (components.includes("workspace")) await handleWorkspace(["init"]);
16669
16669
  if (components.includes("policy")) await handlePolicy(["use", "analyst"]);
16670
16670
  if (components.includes("archive")) await ensureArchiveTool({ install: true });
16671
+ if (components.includes("city-data")) await checkHealth([]);
16671
16672
  if (components.includes("iola")) {
16672
16673
  await setupIolaLocal(["--yes"]);
16673
16674
  }
@@ -16734,8 +16735,12 @@ async function chooseOnboardComponents(status = null) {
16734
16735
  console.log("");
16735
16736
  console.log("Выберите компоненты через запятую:");
16736
16737
  console.log("0. выход в CLI [без настройки] - пропустить мастер");
16737
- for (const item of onboardComponentRows(componentStatus)) {
16738
- console.log(`${item.number}. ${item.title} [${item.status}] - ${item.hint}`);
16738
+ for (const group of onboardComponentGroups(componentStatus)) {
16739
+ console.log("");
16740
+ console.log(group.title);
16741
+ for (const item of group.rows) {
16742
+ console.log(`${item.number}. ${item.title} [${item.status}] - ${item.hint}`);
16743
+ }
16739
16744
  }
16740
16745
  console.log("");
16741
16746
  const rl = readline.createInterface({ input, output });
@@ -16747,19 +16752,19 @@ async function chooseOnboardComponents(status = null) {
16747
16752
  const map = {
16748
16753
  1: "workspace",
16749
16754
  2: "policy",
16750
- 3: "iola",
16751
- 4: "gigachat",
16752
- 5: "openai",
16753
- 6: "openrouter",
16754
- 7: "codex",
16755
- 8: "codex-mcp",
16756
- 9: "archive",
16757
- 10: "index",
16758
- 11: "browser",
16759
- 12: "ollama",
16760
- 13: "yandex",
16761
- 14: "yandex-cloud",
16762
- 15: "yandex-cloud",
16755
+ 3: "archive",
16756
+ 4: "index",
16757
+ 5: "browser",
16758
+ 6: "city-data",
16759
+ 7: "codex-mcp",
16760
+ 8: "iola",
16761
+ 9: "ollama",
16762
+ 10: "gigachat",
16763
+ 11: "yandex",
16764
+ 12: "yandex-cloud",
16765
+ 13: "openai",
16766
+ 14: "openrouter",
16767
+ 15: "codex",
16763
16768
  };
16764
16769
  return [...selected].map((item) => map[item] || item).filter(Boolean);
16765
16770
  } finally {
@@ -16772,7 +16777,7 @@ function isOnboardExitAnswer(answer) {
16772
16777
  }
16773
16778
 
16774
16779
  async function getOnboardComponentStatus() {
16775
- const [config, readiness, browser, archive, codexVersion, ollamaVersion, yandexGeocoderKey, secrets] = await Promise.all([
16780
+ const [config, readiness, browser, archive, codexVersion, ollamaVersion, yandexGeocoderKey, secrets, cityDataHealth] = await Promise.all([
16776
16781
  loadConfig(),
16777
16782
  getAiReadiness(),
16778
16783
  getBrowserStatus(),
@@ -16781,6 +16786,7 @@ async function getOnboardComponentStatus() {
16781
16786
  getOllamaVersion(),
16782
16787
  getYandexGeocoderKey(),
16783
16788
  loadSecrets(),
16789
+ getMcpBaseUrl().then((baseUrl) => probeEndpoint(`${baseUrl}/mcp-health`)),
16784
16790
  ]);
16785
16791
  const workspaceReady = existsSync(PROJECT_CONTEXT_FILE) || existsSync(PROJECT_CONTEXT_DIR_FILE) || existsSync(PROJECT_IOLA_DIR);
16786
16792
  const policyReady = (config.toolsets?.enabled || []).includes("analyst");
@@ -16795,6 +16801,7 @@ async function getOnboardComponentStatus() {
16795
16801
  openrouter: Boolean(readiness.openrouter),
16796
16802
  codex: Boolean(codexVersion !== "не найден" && readiness.codex),
16797
16803
  "codex-mcp": false,
16804
+ "city-data": cityDataHealth === "доступен",
16798
16805
  archive: Boolean(archive),
16799
16806
  index: false,
16800
16807
  browser: browser.installed === "yes",
@@ -16802,37 +16809,75 @@ async function getOnboardComponentStatus() {
16802
16809
  };
16803
16810
  }
16804
16811
 
16805
- function onboardComponentRows(status) {
16806
- const rows = [
16807
- ["1", "workspace", "workspace и контекст", "рабочая папка, IOLA.md и .iola/context.md"],
16808
- ["2", "policy", "policy analyst", "разрешения и профиль аналитика"],
16809
- ["3", "iola", "IOLA локальная модель", "локальная модель найдена"],
16810
- ["4", "gigachat", "GigaChat API", "authorization key сохранен или есть в env"],
16811
- ["5", "openai", "OpenAI API", "API-ключ сохранен или есть в env"],
16812
- ["6", "openrouter", "OpenRouter API", "API-ключ сохранен или есть в env"],
16813
- ["7", "codex", "Codex CLI", "CLI установлен и авторизация найдена"],
16814
- ["8", "codex-mcp", "MCP для Codex", "можно переустановить/обновить"],
16815
- ["9", "archive", "7-Zip / архивы", "архиватор найден"],
16816
- ["10", "index", "Индекс локальных документов", "настраивается под выбранную папку"],
16817
- ["11", "browser", "Browser runtime", "Playwright/Chromium установлен"],
16818
- ["12", "ollama", "Ollama", "опциональный локальный runtime"],
16819
- ["13", "yandex", "Yandex Connector", "единый вход и категории сервисов Яндекса"],
16820
- ["14", "yandex-cloud", "Yandex Cloud Connector", "геокодинг и YandexGPT"],
16812
+ function onboardComponentGroups(status) {
16813
+ const groups = [
16814
+ {
16815
+ title: "Базовая настройка",
16816
+ rows: [
16817
+ ["1", "workspace", "Рабочая папка и контекст", "IOLA.md и .iola/context.md"],
16818
+ ["2", "policy", "Разрешения и безопасный режим", "профиль аналитика"],
16819
+ ["3", "archive", "7-Zip / архивы", "архиватор найден"],
16820
+ ["4", "index", "Индекс локальных документов", "выбранная папка"],
16821
+ ["5", "browser", "Браузерный модуль", "Playwright/Chromium"],
16822
+ ],
16823
+ },
16824
+ {
16825
+ title: "Городские сервисы",
16826
+ rows: [
16827
+ ["6", "city-data", "Открытые данные Йошкар-Олы", "API/MCP gateway доступен"],
16828
+ ["7", "codex-mcp", "Подключить городские данные к Codex", "MCP для Codex"],
16829
+ ],
16830
+ },
16831
+ {
16832
+ title: "Локальный AI",
16833
+ rows: [
16834
+ ["8", "iola", "IOLA локальная модель", "локальная модель найдена"],
16835
+ ["9", "ollama", "Ollama", "опциональный локальный runtime"],
16836
+ ],
16837
+ },
16838
+ {
16839
+ title: "Российские AI и сервисы",
16840
+ rows: [
16841
+ ["10", "gigachat", "GigaChat API", "authorization key сохранен или есть в env"],
16842
+ ["11", "yandex", "Yandex Connector", "Диск, Почта, Календарь, Контакты"],
16843
+ ["12", "yandex-cloud", "Yandex Cloud Connector", "геокодинг и YandexGPT"],
16844
+ ],
16845
+ },
16846
+ {
16847
+ title: "Зарубежные AI",
16848
+ rows: [
16849
+ ["13", "openai", "OpenAI API", "API-ключ сохранен или есть в env"],
16850
+ ["14", "openrouter", "OpenRouter API", "API-ключ сохранен или есть в env"],
16851
+ ],
16852
+ },
16853
+ {
16854
+ title: "Codex",
16855
+ rows: [
16856
+ ["15", "codex", "Codex CLI", "CLI установлен и авторизация найдена"],
16857
+ ],
16858
+ },
16821
16859
  ];
16822
- return rows.map(([number, key, title, hint]) => ({ number, key, title, hint, status: status[key] ? "готово" : "не настроено" }));
16860
+ return groups.map((group) => ({
16861
+ ...group,
16862
+ rows: group.rows.map(([number, key, title, hint]) => ({ number, key, title, hint, status: status[key] ? "готово" : "не настроено" })),
16863
+ }));
16864
+ }
16865
+
16866
+ function onboardComponentRows(status) {
16867
+ return onboardComponentGroups(status).flatMap((group) => group.rows);
16823
16868
  }
16824
16869
 
16825
16870
  function defaultOnboardSelection(status) {
16826
16871
  const defaults = [];
16827
16872
  if (!status.workspace) defaults.push("1");
16828
16873
  if (!status.policy) defaults.push("2");
16829
- if (!status.iola) defaults.push("3");
16830
- if (!status.archive) defaults.push("9");
16874
+ if (!status.archive) defaults.push("3");
16875
+ if (!status.iola) defaults.push("8");
16831
16876
  return defaults.length ? defaults : ["1", "2"];
16832
16877
  }
16833
16878
 
16834
16879
  function defaultOnboardComponents(status) {
16835
- const map = { 1: "workspace", 2: "policy", 3: "iola", 4: "gigachat", 5: "openai", 6: "openrouter", 7: "codex", 8: "codex-mcp", 9: "archive", 10: "index", 11: "browser", 12: "ollama", 13: "yandex", 14: "yandex-cloud", 15: "yandex-cloud" };
16880
+ const map = { 1: "workspace", 2: "policy", 3: "archive", 4: "index", 5: "browser", 6: "city-data", 7: "codex-mcp", 8: "iola", 9: "ollama", 10: "gigachat", 11: "yandex", 12: "yandex-cloud", 13: "openai", 14: "openrouter", 15: "codex" };
16836
16881
  return defaultOnboardSelection(status).map((item) => map[item]).filter(Boolean);
16837
16882
  }
16838
16883
 
@@ -18,7 +18,7 @@ iola master
18
18
  В мастере выберите:
19
19
 
20
20
  ```text
21
- 14. Yandex Cloud Connector - геокодинг и YandexGPT
21
+ 12. Yandex Cloud Connector - геокодинг и YandexGPT
22
22
  ```
23
23
 
24
24
  CLI не просто открывает консоль. Он печатает короткую инструкцию, что делать дальше, и только потом просит вставить ключи.
@@ -12,75 +12,106 @@ iola master
12
12
 
13
13
  ## Компоненты
14
14
 
15
- ### 1. workspace и контекст
15
+ ```text
16
+ 0. выход в CLI [без настройки] - пропустить мастер
17
+
18
+ Базовая настройка
19
+ 1. Рабочая папка и контекст
20
+ 2. Разрешения и безопасный режим
21
+ 3. 7-Zip / архивы
22
+ 4. Индекс локальных документов
23
+ 5. Браузерный модуль
24
+
25
+ Городские сервисы
26
+ 6. Открытые данные Йошкар-Олы
27
+ 7. Подключить городские данные к Codex
28
+
29
+ Локальный AI
30
+ 8. IOLA локальная модель
31
+ 9. Ollama
32
+
33
+ Российские AI и сервисы
34
+ 10. GigaChat API
35
+ 11. Yandex Connector
36
+ 12. Yandex Cloud Connector
37
+
38
+ Зарубежные AI
39
+ 13. OpenAI API
40
+ 14. OpenRouter API
41
+
42
+ Codex
43
+ 15. Codex CLI
44
+ ```
45
+
46
+ ## Базовая настройка
47
+
48
+ ### 1. Рабочая папка и контекст
16
49
 
17
50
  Создает рабочую среду текущей папки: `.iola/`, `IOLA.md` и `.iola/context.md`.
18
51
 
19
52
  Нужно, если агент будет работать с локальными файлами, документами, задачами, артефактами и контекстом проекта.
20
53
 
21
- ### 2. policy analyst
54
+ ### 2. Разрешения и безопасный режим
22
55
 
23
56
  Включает профиль разрешений для аналитической работы: открытые данные, отчеты, безопасные локальные операции.
24
57
 
25
- ### 3. IOLA локальная модель
58
+ ### 3. 7-Zip / архивы
26
59
 
27
- Проверяет штатную локальную модель IOLA и готовит ее к работе через доступный runtime.
28
-
29
- Если модель уже скачана и доступна, пункт показывается как `готово`.
60
+ Проверяет 7-Zip. Если архиватор не найден, мастер устанавливает его.
30
61
 
31
- После настройки локальную модель можно менять в интерактивном агенте через `/model`. Помимо штатной IOLA-модели можно выбрать установленную или рекомендуемую Ollama-модель, либо вручную ввести имя любой модели из библиотеки Ollama.
62
+ Нужен для чтения, распаковки, сборки и индексирования архивов.
32
63
 
33
- ### 4. GigaChat API
64
+ ### 4. Индекс локальных документов
34
65
 
35
- Настраивает профиль GigaChat и сохраняет authorization key локально у пользователя.
66
+ Готовит режим чтения файлов и подсказывает команду индексирования локальной папки:
36
67
 
37
- Российский провайдер вызывается напрямую, без gateway/proxy.
68
+ ```bash
69
+ iola index folder ./docs
70
+ ```
38
71
 
39
- ### 5. OpenAI API
72
+ ### 5. Браузерный модуль
40
73
 
41
- Настраивает профиль OpenAI и сохраняет API-ключ локально у пользователя.
74
+ Проверяет Playwright/Chromium runtime. Нужен для браузерного агента.
42
75
 
43
- После сохранения ключа мастер предлагает выбрать модель из доступного списка.
76
+ ## Городские сервисы
44
77
 
45
- ### 6. OpenRouter API
78
+ ### 6. Открытые данные Йошкар-Олы
46
79
 
47
- Настраивает профиль OpenRouter и сохраняет API-ключ локально у пользователя.
80
+ Проверяет доступность городского API/MCP-шлюза `apiiola.yasg.ru`.
48
81
 
49
- После сохранения ключа мастер предлагает выбрать разработчика моделей OpenRouter, а затем одну из свежих моделей для текстовой работы. В списке моделей `0` возвращает к выбору разработчика.
82
+ Этот пункт ничего не устанавливает локально. Он нужен, чтобы пользователь явно видел: CLI подключен к городским слоям открытых данных и может проверять школы, детские сады и другие подключенные городские сервисы через проверяемый gateway.
50
83
 
51
- ### 7. Codex CLI
84
+ ### 7. Подключить городские данные к Codex
52
85
 
53
- Проверяет наличие Codex CLI и авторизации. Если Codex уже установлен и вход выполнен, пункт показывается как `готово`.
86
+ Добавляет MCP-сервер открытых данных Йошкар-Олы во внешний Codex CLI. Этот пункт нужен только тем, кто хочет, чтобы Codex CLI тоже видел городские данные как MCP-инструменты.
54
87
 
55
- ### 8. MCP для Codex
88
+ Для обычной работы `iola-cli` с городскими слоями этот пункт не обязателен: сам CLI уже ходит к городскому API/MCP-шлюзу напрямую.
56
89
 
57
- Добавляет MCP-сервер открытых данных Йошкар-Олы в Codex. Этот пункт можно запускать повторно для обновления подключения.
90
+ ## Локальный AI
58
91
 
59
- ### 9. 7-Zip / архивы
92
+ ### 8. IOLA локальная модель
60
93
 
61
- Проверяет 7-Zip. Если архиватор не найден, мастер устанавливает его.
94
+ Проверяет штатную локальную модель IOLA и готовит ее к работе через доступный runtime.
62
95
 
63
- Нужен для чтения, распаковки, сборки и индексирования архивов.
96
+ Если модель уже скачана и доступна, пункт показывается как `готово`.
64
97
 
65
- ### 10. Индекс локальных документов
98
+ После настройки локальную модель можно менять в интерактивном агенте через `/model`. Помимо штатной IOLA-модели можно выбрать установленную или рекомендуемую Ollama-модель, либо вручную ввести имя любой модели из библиотеки Ollama.
66
99
 
67
- Готовит режим чтения файлов и подсказывает команду индексирования локальной папки:
100
+ ### 9. Ollama
68
101
 
69
- ```bash
70
- iola index folder ./docs
71
- ```
102
+ Опциональный локальный runtime для выбора сторонних моделей из библиотеки Ollama.
72
103
 
73
- ### 11. Browser runtime
104
+ Если runtime уже установлен, пункт показывается как `готово`.
74
105
 
75
- Проверяет Playwright/Chromium runtime. Нужен для браузерного агента.
106
+ ## Российские AI и сервисы
76
107
 
77
- ### 12. Ollama
108
+ ### 10. GigaChat API
78
109
 
79
- Опциональный локальный runtime для выбора сторонних моделей из библиотеки Ollama.
110
+ Настраивает профиль GigaChat и сохраняет authorization key локально у пользователя.
80
111
 
81
- Если runtime уже установлен, пункт показывается как `готово`.
112
+ Российский провайдер вызывается напрямую, без gateway/proxy.
82
113
 
83
- ### 13. Yandex Connector
114
+ ### 11. Yandex Connector
84
115
 
85
116
  Настраивает единый коннектор пользовательских сервисов Яндекса.
86
117
 
@@ -95,7 +126,7 @@ iola index folder ./docs
95
126
 
96
127
  Инструкция: [Yandex Connector](Yandex-Connector).
97
128
 
98
- ### 14. Yandex Cloud Connector
129
+ ### 12. Yandex Cloud Connector
99
130
 
100
131
  Настраивает Yandex Cloud Connector: геокодер и, при необходимости, YandexGPT.
101
132
 
@@ -107,6 +138,26 @@ iola index folder ./docs
107
138
 
108
139
  Инструкция: [Yandex Cloud Connector](Yandex-Cloud-Connector).
109
140
 
141
+ ## Зарубежные AI
142
+
143
+ ### 13. OpenAI API
144
+
145
+ Настраивает профиль OpenAI и сохраняет API-ключ локально у пользователя.
146
+
147
+ После сохранения ключа мастер предлагает выбрать модель из доступного списка.
148
+
149
+ ### 14. OpenRouter API
150
+
151
+ Настраивает профиль OpenRouter и сохраняет API-ключ локально у пользователя.
152
+
153
+ После сохранения ключа мастер предлагает выбрать разработчика моделей OpenRouter, а затем одну из свежих моделей для текстовой работы. В списке моделей `0` возвращает к выбору разработчика.
154
+
155
+ ## Codex
156
+
157
+ ### 15. Codex CLI
158
+
159
+ Проверяет наличие Codex CLI и авторизации. Если Codex уже установлен и вход выполнен, пункт показывается как `готово`.
160
+
110
161
  ## Повторный запуск
111
162
 
112
163
  Если компонент уже настроен, его можно не выбирать. Если нужно переустановить или обновить компонент, выберите его номер вручную.