@bridge4dev/runner 0.69.0 → 0.69.1

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.
@@ -327,9 +327,53 @@ export function inspectBashCommand(command) {
327
327
  * значит вставать на пути каждого чтения и записи, а в обычных режимах эти
328
328
  * инструменты и так закрыты политикой.
329
329
  */
330
+ /**
331
+ * `--env-file <путь>` и `--env-file=<путь>` — значение, которое уходит докеру.
332
+ *
333
+ * Кавычки учтены, потому что именно так этот флаг и пишут в гайде выкладки.
334
+ */
335
+ const DOCKER_ENV_FILE_FLAG = /--env-file(?:=|\s+)(?:"[^"]*"|'[^']*'|\S+)/g;
336
+ /** Границы между командами в одной строке. Грубо и намеренно: сторож ошибается в сторону запрета. */
337
+ const COMMAND_SEPARATORS = /&&|\|\||;|\||\n/;
338
+ /**
339
+ * Передать файл докеру — не то же самое, что прочитать его (#463).
340
+ *
341
+ * `docker compose --env-file …` и `docker run --env-file …` содержимое файла
342
+ * агенту НЕ показывают: он уходит в контейнер. Правило же ловило по одному
343
+ * факту упоминания пути, и 19.09 вместе с дырой закрылась вся документированная
344
+ * выкладка — `docs/operations/deployment/rebuild-deploy.md` перестал работать из
345
+ * сессии целиком, включая миграции.
346
+ *
347
+ * Поэтому здесь вырезаются значения `--env-file` — и ТОЛЬКО в тех отрезках
348
+ * команды, которые начинаются с `docker`. Остаток проверяется тем же правилом:
349
+ * стоит рядом появиться `cat …`, `grep …` или второму отрезку с защищённым
350
+ * путём — запрет возвращается. `cat --env-file …` не спасается: это не отрезок
351
+ * докера.
352
+ *
353
+ * **Чего это не закрывает, честно.** `docker run --env-file X … sh -lc 'cat
354
+ * /proc/self/environ'` и `docker compose --env-file X config` секреты напечатают.
355
+ * Это принято сознательно, и вот почему: послабление живёт ТОЛЬКО в хуке, а
356
+ * политика (`commandMentionsSecretPath` у `evaluateToolUse`) остаётся прежней.
357
+ * Значит в обычных режимах такая команда по-прежнему отвергается, а хук — это
358
+ * единственный сторож ровно в режиме «Полный доступ», где агенту и так открыт
359
+ * инструмент `Read` на тот же самый файл: матчер хука закрывает только `Bash`
360
+ * (см. шапку `inspectSecretPaths`). Запрещать там, где рядом открыта дверь
361
+ * пошире, — не защита, а сломанная выкладка.
362
+ */
363
+ function handsFileToDocker(command) {
364
+ const cleaned = command
365
+ .split(COMMAND_SEPARATORS)
366
+ .map((segment) => /^\s*(?:sudo\s+)?docker\b/.test(segment)
367
+ ? segment.replace(DOCKER_ENV_FILE_FLAG, ' ')
368
+ : segment)
369
+ .join(' ; ');
370
+ return !commandMentionsSecretPath(cleaned);
371
+ }
330
372
  function inspectSecretPaths(command) {
331
373
  if (!commandMentionsSecretPath(command))
332
374
  return { dangerous: false };
375
+ if (handsFileToDocker(command))
376
+ return { dangerous: false };
333
377
  return {
334
378
  dangerous: true,
335
379
  reason: 'Blocked: this command touches a protected path — a machine login, a key, or an agent ' +
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const RUNNER_VERSION = "0.69.0";
1
+ export declare const RUNNER_VERSION = "0.69.1";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Kept in sync with package.json by the release script (manual for now).
2
- export const RUNNER_VERSION = '0.69.0';
2
+ export const RUNNER_VERSION = '0.69.1';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bridge4dev/runner",
3
- "version": "0.69.0",
3
+ "version": "0.69.1",
4
4
  "description": "DevBridge dev runner — connects a dev server to DevBridge and runs agent sessions (Claude Code / Codex)",
5
5
  "homepage": "https://bridge4.dev",
6
6
  "license": "MIT",