@dev-sergeev/datalab-kit 0.1.6 → 0.1.7

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.
Files changed (33) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +8 -8
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/dist/extension.js +2 -2
  5. package/dist/install.d.ts +2 -2
  6. package/dist/install.js +14 -12
  7. package/docs/adr/0002-package-delivery.md +5 -5
  8. package/node_modules/node-addon-api/common 2.gypi +21 -0
  9. package/node_modules/node-addon-api/except 2.gypi +25 -0
  10. package/node_modules/node-addon-api/napi 2.h +3463 -0
  11. package/node_modules/node-addon-api/napi-inl 2.h +7250 -0
  12. package/node_modules/node-addon-api/napi-inl.deprecated 2.h +186 -0
  13. package/node_modules/node-addon-api/node_addon_api 2.gyp +42 -0
  14. package/node_modules/node-addon-api/node_api 2.gyp +9 -0
  15. package/node_modules/node-addon-api/noexcept 2.gypi +26 -0
  16. package/node_modules/node-addon-api/nothing 2.c +0 -0
  17. package/node_modules/pi-toggle-skills/toggle-skills 2.ts +316 -0
  18. package/node_modules/pi-toggle-skills/vitest.config 2.ts +15 -0
  19. package/node_modules/sprintf-js/.npmignore 2 +1 -0
  20. package/node_modules/sprintf-js/LICENSE 2 +24 -0
  21. package/node_modules/sprintf-js/README 2.md +88 -0
  22. package/node_modules/sprintf-js/bower 2.json +14 -0
  23. package/node_modules/sprintf-js/gruntfile 2.js +36 -0
  24. package/node_modules/sprintf-js/package 2.json +22 -0
  25. package/node_modules/tree-sitter-bash/tree-sitter-bash 2.wasm +0 -0
  26. package/node_modules/typebox/license 2 +23 -0
  27. package/node_modules/typebox/package 2.json +87 -0
  28. package/node_modules/typebox/readme 2.md +370 -0
  29. package/node_modules/zod/compile 2.cjs +96 -0
  30. package/node_modules/zod/compile 2.js +52 -0
  31. package/node_modules/zod/index 2.cjs +52 -0
  32. package/node_modules/zod/index 2.js +7 -0
  33. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.7 — 2026-10-20
4
+
5
+ - Совместимость с Pi закреплена строго на `0.85.1`: peer-зависимости `pi-ai`, `pi-coding-agent` и `pi-tui` больше не допускают произвольные версии.
6
+ - `@dev-sergeev/pi-gigachat` закреплён на `0.6.4` в манифесте, lockfile и отдельном источнике Pi. Установщик больше не запрашивает `latest`; штатное обновление Pi сохраняет закреплённую версию.
7
+ - Прежняя незакреплённая запись GigaChat мигрирует на `npm:@dev-sergeev/pi-gigachat@0.6.4` с сохранением фильтров ресурсов. Явно выбранные пользователем версии и остальные настройки сохраняются.
8
+
3
9
  ## 0.1.6 — 2026-10-15
4
10
 
5
11
  - В пакет включены навыки `init` и `skill-creator`, доступные во всех проектах после глобальной установки набора. Добавлены короткие команды `/init` и `/skill-creator`; явное отключение ресурсов Pi сохраняет приоритет.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Установка
6
6
 
7
- Нужны Node.js ≥ 22.19 и установленный Pi. Совместимость проверяется с Pi 0.85.1.
7
+ Нужны Node.js ≥ 22.19 и установленный Pi **строго 0.85.1**. Peer-зависимости `@earendil-works/pi-ai`, `@earendil-works/pi-coding-agent` и `@earendil-works/pi-tui` закреплены на `0.85.1`, без диапазонов версий, как в `pi-gigachat` 0.6.4. Это декларация совместимости npm, а не runtime-проверка: управляемый установщик Pi использует `--legacy-peer-deps`.
8
8
 
9
9
  ```bash
10
10
  pi install npm:@dev-sergeev/datalab-kit
@@ -17,7 +17,7 @@ pi
17
17
  npm ci --ignore-scripts --legacy-peer-deps
18
18
  npm run build
19
19
  npm pack
20
- npm install --prefix /tmp/datalab-kit-local --legacy-peer-deps ./dev-sergeev-datalab-kit-0.1.6.tgz
20
+ npm install --prefix /tmp/datalab-kit-local --legacy-peer-deps ./dev-sergeev-datalab-kit-0.1.7.tgz
21
21
  pi install /tmp/datalab-kit-local/node_modules/@dev-sergeev/datalab-kit
22
22
  ```
23
23
 
@@ -29,7 +29,7 @@ pi install /tmp/datalab-kit-local/node_modules/@dev-sergeev/datalab-kit
29
29
 
30
30
  | Пакет | Версия |
31
31
  | --- | --- |
32
- | `@dev-sergeev/pi-gigachat` | `latest` при установке / явном обновлении |
32
+ | `@dev-sergeev/pi-gigachat` | 0.6.4 |
33
33
  | `@juicesharp/rpiv-ask-user-question` | 2.11.0 |
34
34
  | `pi-powerline-footer` | 0.17.2 |
35
35
  | `@gotgenes/pi-permission-system` | 33.0.5 |
@@ -42,9 +42,9 @@ pi install /tmp/datalab-kit-local/node_modules/@dev-sergeev/datalab-kit
42
42
  | `pi-toggle-skills` | 0.1.20 |
43
43
  | `@zigai/pi-mention-skill` | 0.10.4 |
44
44
 
45
- Одиннадцать фиксированных компонентов включены в архив npm вместе с их зависимостями. GigaChat устанавливается отдельно без закрепления версии.
45
+ Одиннадцать фиксированных компонентов включены в архив npm вместе с их зависимостями. GigaChat устанавливается отдельно с закреплением версии `0.6.4`.
46
46
 
47
- Datalab Kit загружает штатное расширение GigaChat 0.6.1 без изменения его кода. `/gigachat` открывает интерактивный мастер подключений, авторизации и выбора моделей из каталогов серверов; это не интерфейс настройки через аргументы. Сохранённые подключения и пользовательские настройки остаются под управлением upstream. Основную модель выбирают через `/model`.
47
+ Datalab Kit загружает штатное расширение GigaChat 0.6.4 без изменения его кода. `/gigachat` открывает интерактивный мастер подключений, авторизации и выбора моделей из каталогов серверов; это не интерфейс настройки через аргументы. Сохранённые подключения и пользовательские настройки остаются под управлением upstream.
48
48
 
49
49
  ## DataLab из окружения
50
50
 
@@ -123,13 +123,13 @@ YOLO автоматически разрешает `ask`. Явные `deny` и
123
123
  pi update --extensions
124
124
  ```
125
125
 
126
- GigaChat обновляется независимо от версии набора. Обычный запуск Pi не обращается к реестру npm и не устанавливает обновления.
126
+ GigaChat закреплён на `0.6.4` в зависимостях набора и отдельном источнике Pi `npm:@dev-sergeev/pi-gigachat@0.6.4`. `pi update --extensions` не переводит его на более новую версию из `latest`; для смены версии нужен новый релиз набора либо явное пользовательское переопределение источника. Обычный запуск Pi не обращается к реестру npm и не устанавливает обновления.
127
127
 
128
- **Известное отклонение от спецификации:** Pi 0.85.1 перезаписывает список пакетов из своего кеша после `npm postinstall`. Поэтому отдельная запись GigaChat для штатного обновления восстанавливается при первом запуске Pi. Между установкой набора и первым запуском `pi update --extensions` не гарантирует обновление GigaChat при неизменной версии набора. Для полного выполнения этого требования нужна поддержка со стороны Pi; установленный Pi пакет не изменяет. Подробнее: [ADR](docs/adr/0002-package-delivery.md).
128
+ **Особенность Pi 0.85.1:** установщик перезаписывает список пакетов из своего кеша после `npm postinstall`. Поэтому при первом запуске Pi набор восстанавливает отдельную закреплённую запись GigaChat. Прежний незакреплённый источник `npm:@dev-sergeev/pi-gigachat` заменяется на `npm:@dev-sergeev/pi-gigachat@0.6.4` с сохранением фильтров ресурсов. Подробнее: [ADR](docs/adr/0002-package-delivery.md).
129
129
 
130
130
  Явно закреплённый пользователем источник GigaChat сохраняется. При удалении набора отдельная запись GigaChat остаётся; её можно удалить стандартным `pi remove npm:@dev-sergeev/pi-gigachat`. Установка с `-l` пока не проверена.
131
131
 
132
- GigaChat загружается через штатную точку входа как внутри набора, так и через отдельную запись пакета. Для 0.6.1 настройка подключений и моделей выполняется интерактивным `/gigachat`; прежние утверждения о встроенных GLM/Qwen и автоматическом default `gigachat/Qwen3.5-397b` относились к 0.5.1 и к этой версии неприменимы. Datalab Kit не переписывает исходники GigaChat, не очищает авторизацию или сохранённые подключения. Дополнительный провайдер DataLab не меняет текущую модель или defaults. Модель recap настраивается независимо.
132
+ GigaChat загружается через штатную точку входа как внутри набора, так и через отдельную запись пакета. Для 0.6.4 настройка подключений и моделей выполняется интерактивным `/gigachat`; прежние утверждения о встроенных GLM/Qwen и автоматическом default `gigachat/Qwen3.5-397b` относились к 0.5.1 и к этой версии неприменимы. Datalab Kit не переписывает исходники GigaChat, не очищает авторизацию или сохранённые подключения. Дополнительный провайдер DataLab не меняет текущую модель или defaults. Модель recap настраивается независимо.
133
133
 
134
134
  ## Разработка
135
135
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Datalab Kit includes the following upstream components. Their licenses and copyright notices remain in their package directories and apply to those components and their transitive dependencies. Datalab Kit modifies permission-system, plan-mode, subagents and recap's default model during build; see scripts/prepare-upstream.mjs. GigaChat is downloaded separately.
4
4
 
5
- - @dev-sergeev/pi-gigachat (latest, independently installed): MIT, git+https://github.com/dev-sergeev/pi-gigachat.git.
5
+ - @dev-sergeev/pi-gigachat@0.6.4 (independently installed, version pinned): MIT, git+https://github.com/dev-sergeev/pi-gigachat.git.
6
6
  - @juicesharp/rpiv-ask-user-question@2.11.0: MIT, git+https://github.com/juicesharp/rpiv-mono.git.
7
7
  - pi-powerline-footer@0.17.2: MIT, git+https://github.com/nicobailon/pi-powerline-footer.git.
8
8
  - @gotgenes/pi-permission-system@33.0.5: MIT, git+https://github.com/gotgenes/pi-packages.git.
package/dist/extension.js CHANGED
@@ -16,10 +16,10 @@ export default async function datalabKit(pi) {
16
16
  const provider = await import(pathToFileURL(gigaChatExtensionPath(packageRoot)).href);
17
17
  await provider.default(pi);
18
18
  }
19
- if (!configured && managedAgentDir(packageRoot) === resolve(agentDir)) {
19
+ if (managedAgentDir(packageRoot) === resolve(agentDir)) {
20
20
  pi.on('session_start', async () => {
21
21
  // Pi 0.85.1 persists a cached package list after npm postinstall; repair
22
- // that list at first activation without downloading or updating anything.
22
+ // that list and migrate the kit's former floating source without networking.
23
23
  await registerGigaChat(agentDir);
24
24
  });
25
25
  }
package/dist/install.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- export declare const gigaChatSource = "npm:@dev-sergeev/pi-gigachat";
1
+ export declare const gigaChatSource: string;
2
2
  export declare function managedAgentDir(packageRoot: string): string | undefined;
3
3
  export declare function isGigaChatSource(entry: unknown): boolean;
4
4
  export declare function hasConfiguredGigaChat(agentDir: string): Promise<boolean>;
5
- /** Preserve every user field and package filter; only add a missing source. */
5
+ /** Preserve user fields and filters; migrate the kit's former floating source. */
6
6
  export declare function registerGigaChat(agentDir: string): Promise<void>;
7
7
  /** Only run inside an explicit npm installation; Pi startup never calls this. */
8
8
  export declare function finishInstallation(packageRoot: string): Promise<void>;
package/dist/install.js CHANGED
@@ -5,7 +5,9 @@ import { createRequire } from 'node:module';
5
5
  import { promisify } from 'node:util';
6
6
  import { execFile } from 'node:child_process';
7
7
  import { randomUUID } from 'node:crypto';
8
- export const gigaChatSource = 'npm:@dev-sergeev/pi-gigachat';
8
+ const gigaChatPackageSource = 'npm:@dev-sergeev/pi-gigachat';
9
+ const gigaChatVersion = createRequire(import.meta.url)('../package.json').dependencies['@dev-sergeev/pi-gigachat'];
10
+ export const gigaChatSource = `${gigaChatPackageSource}@${gigaChatVersion}`;
9
11
  const execFileAsync = promisify(execFile);
10
12
  export function managedAgentDir(packageRoot) {
11
13
  const npmRoot = resolve(packageRoot, '../../..');
@@ -14,7 +16,7 @@ export function managedAgentDir(packageRoot) {
14
16
  }
15
17
  export function isGigaChatSource(entry) {
16
18
  const source = typeof entry === 'string' ? entry : entry && typeof entry === 'object' && 'source' in entry ? entry.source : undefined;
17
- return typeof source === 'string' && (source === gigaChatSource || source.startsWith(`${gigaChatSource}@`));
19
+ return typeof source === 'string' && (source === gigaChatPackageSource || source.startsWith(`${gigaChatPackageSource}@`));
18
20
  }
19
21
  async function readSettings(agentDir) {
20
22
  let content;
@@ -35,7 +37,7 @@ export async function hasConfiguredGigaChat(agentDir) {
35
37
  const settings = await readSettings(agentDir);
36
38
  return Array.isArray(settings.packages) && settings.packages.some(isGigaChatSource);
37
39
  }
38
- /** Preserve every user field and package filter; only add a missing source. */
40
+ /** Preserve user fields and filters; migrate the kit's former floating source. */
39
41
  export async function registerGigaChat(agentDir) {
40
42
  await mkdir(agentDir, { recursive: true });
41
43
  const lock = join(agentDir, 'settings.json.lock');
@@ -46,9 +48,13 @@ export async function registerGigaChat(agentDir) {
46
48
  if (settings.packages !== undefined && !Array.isArray(settings.packages))
47
49
  throw new Error('Pi packages must be an array');
48
50
  const packages = (settings.packages ?? []);
49
- if (packages.some(isGigaChatSource))
51
+ const existing = packages.find(isGigaChatSource);
52
+ const source = typeof existing === 'string' ? existing : existing && typeof existing === 'object' && 'source' in existing ? existing.source : undefined;
53
+ if (existing && source !== gigaChatPackageSource)
50
54
  return;
51
- settings.packages = [...packages, gigaChatSource];
55
+ settings.packages = existing
56
+ ? packages.map(entry => entry !== existing ? entry : typeof entry === 'string' ? gigaChatSource : { ...entry, source: gigaChatSource })
57
+ : [...packages, gigaChatSource];
52
58
  await writeFile(temp, `${JSON.stringify(settings, null, 2)}\n`, { mode: 0o600 });
53
59
  await rename(temp, join(agentDir, 'settings.json'));
54
60
  }
@@ -66,7 +72,7 @@ export async function finishInstallation(packageRoot) {
66
72
  const existing = Array.isArray(settings.packages) ? settings.packages.find(isGigaChatSource) : undefined;
67
73
  const source = typeof existing === 'string' ? existing : existing?.source;
68
74
  // An explicitly selected user version remains authoritative.
69
- if (typeof source === 'string' && source !== gigaChatSource)
75
+ if (typeof source === 'string' && source !== gigaChatPackageSource && source !== gigaChatSource)
70
76
  return;
71
77
  await refreshGigaChat(agentDir);
72
78
  await registerGigaChat(agentDir);
@@ -89,14 +95,10 @@ async function npm(args) {
89
95
  return result.stdout;
90
96
  }
91
97
  async function refreshGigaChat(agentDir) {
92
- const metadata = JSON.parse(await npm(['view', '@dev-sergeev/pi-gigachat@latest', 'version', '--json']));
93
- const latest = Array.isArray(metadata) ? metadata.at(-1) : metadata;
94
- if (typeof latest !== 'string' || !/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(latest))
95
- throw new Error('Invalid GigaChat registry version');
96
98
  const destination = join(agentDir, 'npm/node_modules/@dev-sergeev/pi-gigachat');
97
99
  try {
98
100
  const installed = JSON.parse(await readFile(join(destination, 'package.json'), 'utf8'));
99
- if (installed.version === latest)
101
+ if (installed.version === gigaChatVersion)
100
102
  return;
101
103
  }
102
104
  catch (error) {
@@ -109,7 +111,7 @@ async function refreshGigaChat(agentDir) {
109
111
  const replacement = join(stage, 'replacement');
110
112
  let moved = false;
111
113
  try {
112
- await npm(['install', '--prefix', stage, `@dev-sergeev/pi-gigachat@${latest}`,
114
+ await npm(['install', '--prefix', stage, `@dev-sergeev/pi-gigachat@${gigaChatVersion}`,
113
115
  '--ignore-scripts', '--legacy-peer-deps', '--no-audit', '--no-fund']);
114
116
  await cp(join(stage, 'node_modules/@dev-sergeev/pi-gigachat'), replacement, { recursive: true });
115
117
  // Preserve the staged dependency tree so compiled ESM imports stay resolvable.
@@ -1,6 +1,6 @@
1
1
  # ADR 0002: Доставка компонентов и значений по умолчанию
2
2
 
3
- Status: accepted for implementation; known spec gap remains
3
+ Status: accepted
4
4
 
5
5
  ## Контекст
6
6
 
@@ -20,12 +20,12 @@ Pi 0.85.1 загружает ресурсы из `pi.extensions`, но не пр
20
20
 
21
21
  Дополнительное согласование от 2026-10-14: задержка автоматического recap после бездействия сокращена с 5 до 2 минут. Таймаут отдельного запроса остаётся 60 секунд.
22
22
 
23
- GigaChat остаётся зависимостью `latest`. При явной установке postinstall проверяет актуальную версию, устанавливает её в управляемый каталог Pi и добавляет незакреплённый источник. При первой активации расширение восстанавливает запись, которую установщик Pi мог затереть; загрузка не выполняет сетевых запросов. До появления отдельной записи провайдер подключается через расширение набора. После её появления его загружает Pi самостоятельно.
23
+ Пересмотр от 2026-10-20: начиная с Datalab Kit 0.1.7 поддерживается строго Pi 0.85.1; три peer-зависимости Pi закреплены на этой версии без диапазонов, как в `pi-gigachat` 0.6.4. Это декларация совместимости, а не runtime-проверка: управляемый установщик Pi отключает разрешение peer-зависимостей. GigaChat закреплён на `0.6.4` в манифесте, lockfile, postinstall и отдельном источнике `npm:@dev-sergeev/pi-gigachat@0.6.4`. Версия для установщика берётся из манифеста набора; запрос `latest` удалён. Прежний незакреплённый источник мигрирует на закреплённый с сохранением фильтров ресурсов; явно выбранные пользователем версии остаются приоритетными. При первой активации расширение восстанавливает запись, которую установщик Pi мог затереть; загрузка не выполняет сетевых запросов. До появления отдельной записи провайдер подключается через расширение набора, после её появления его загружает Pi самостоятельно. Этот пересмотр заменяет прежнее требование независимо обновлять GigaChat до `latest`.
24
24
 
25
25
  ## Последствия и пределы
26
26
 
27
- - После первой активации работает штатное `pi update --extensions`, даже если версия набора не изменилась.
28
- - Обновление до первой активации не выполняет требование спецификации об независимо обновляемом GigaChat. Это открытый дефект совместимости с Pi; спецификация не ослабляется.
29
- - Полное решение требует изменения установщика Pi: сохранить добавленные lifecycle источники либо поддержать декларацию зависимых пакетов / hook обновления. Пакет не патчит установленный Pi и не запускает фоновый процесс изменения настроек.
27
+ - Штатное `pi update --extensions` сохраняет GigaChat 0.6.4, даже если реестр публикует более новую версию.
28
+ - Pi 0.85.1 по-прежнему может затереть добавленный в postinstall источник; он восстанавливается при первом запуске. Это больше не нарушает требование независимо обновлять GigaChat: такое требование отменено.
29
+ - Пакет не патчит установленный Pi и не запускает фоновый процесс изменения настроек.
30
30
  - Исходные конфиги и явно закреплённые источники пользователя сохраняются.
31
31
  - Отдельный GigaChat остаётся после удаления набора. Очистка, `-l` и существующие независимые установки других компонентов не определены спецификацией.
@@ -0,0 +1,21 @@
1
+ {
2
+ 'variables': {
3
+ 'NAPI_VERSION%': "<!(node -p \"process.env.NAPI_VERSION || process.versions.napi\")",
4
+ 'disable_deprecated': "<!(node -p \"process.env['npm_config_disable_deprecated']\")"
5
+ },
6
+ 'conditions': [
7
+ ['NAPI_VERSION!=""', { 'defines': ['NAPI_VERSION=<@(NAPI_VERSION)'] } ],
8
+ ['NAPI_VERSION==2147483647', { 'defines': ['NAPI_EXPERIMENTAL', 'NODE_API_EXPERIMENTAL_NO_WARNING'] } ],
9
+ ['disable_deprecated=="true"', {
10
+ 'defines': ['NODE_ADDON_API_DISABLE_DEPRECATED']
11
+ }],
12
+ ['OS=="mac"', {
13
+ 'cflags+': ['-fvisibility=hidden'],
14
+ 'xcode_settings': {
15
+ 'OTHER_CFLAGS': ['-fvisibility=hidden']
16
+ }
17
+ }]
18
+ ],
19
+ 'cflags': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ],
20
+ 'cflags_cc': [ '-Werror', '-Wall', '-Wextra', '-Wpedantic', '-Wunused-parameter' ]
21
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ 'defines': [ 'NAPI_CPP_EXCEPTIONS' ],
3
+ 'cflags!': [ '-fno-exceptions' ],
4
+ 'cflags_cc!': [ '-fno-exceptions' ],
5
+ 'conditions': [
6
+ ["OS=='win'", {
7
+ "defines": [
8
+ "_HAS_EXCEPTIONS=1"
9
+ ],
10
+ "msvs_settings": {
11
+ "VCCLCompilerTool": {
12
+ "ExceptionHandling": 1,
13
+ 'EnablePREfast': 'true',
14
+ },
15
+ },
16
+ }],
17
+ ["OS=='mac'", {
18
+ 'xcode_settings': {
19
+ 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
20
+ 'CLANG_CXX_LIBRARY': 'libc++',
21
+ 'MACOSX_DEPLOYMENT_TARGET': '10.7',
22
+ },
23
+ }],
24
+ ],
25
+ }