Skip to content

Выполнение скриптов навыка

Что вы сможете сделать после изучения

  • Использовать инструмент run_skill_script для выполнения исполняемых скриптов в каталоге навыка
  • Передавать параметры командной строки в скрипты
  • Понимать контекст рабочего каталога при выполнении скриптов
  • Обрабатывать ошибки выполнения скриптов и коды выхода
  • Освоить настройку разрешений скриптов и механизмы безопасности

Ваша текущая проблема

Вы хотите, чтобы ИИ выполнял автоматизированные скрипты определённого навыка, например сборку проекта, запуск тестов или развёртывание приложения. Но вы не уверены, как вызывать скрипты, или сталкиваетесь с проблемами, такими как ошибки разрешений, невозможность найти скрипты и т. д.

Когда использовать этот метод

  • Автоматизация сборки: выполнение скриптов build.sh или build.py навыка для сборки проекта
  • Запуск тестов: запуск тестового набора навыка для генерации отчёта о покрытии кодом
  • Процесс развёртывания: выполнение скриптов развёртывания для публикации приложения в производственной среде
  • Обработка данных: запуск скриптов для обработки файлов и преобразования форматов данных
  • Установка зависимостей: выполнение скриптов для установки зависимостей, требуемых навыку

Основная идея

Инструмент run_skill_script позволяет вам выполнять исполняемые скрипты в контексте каталога навыка. Преимущества этого подхода:

  • Правильная среда выполнения: скрипты запускаются в каталоге навыка и имеют доступ к конфигурации и ресурсам навыка
  • Автоматизированные рабочие процессы: навыки могут содержать набор автоматизированных скриптов, что сокращает количество повторяющихся операций
  • Проверка разрешений: выполняются только файлы с правами на выполнение, что предотвращает случайное выполнение обычных текстовых файлов
  • Перехват ошибок: перехват кодов выхода и вывода скриптов для упрощения отладки

Правила обнаружения скриптов

Плагин рекурсивно ищет исполняемые файлы в каталоге навыка (максимальная глубина 10 уровней):

  • Пропускаемые каталоги: скрытые каталоги (начинающиеся с .), node_modules, __pycache__, .git, .venv и т. д.
  • Проверка на исполняемость: только файлы с правами на выполнение (mode & 0o111) будут включены в список скриптов
  • Относительные пути: пути скриптов указываются относительно каталога навыка, например tools/build.sh

Сначала просмотрите доступные скрипты

Перед выполнением используйте get_available_skills для просмотра списка скриптов навыка:

docker-helper (project)
  Руководство по контейнеризации и развёртыванию Docker [scripts: build.sh, deploy.sh]

::

Пошаговое руководство

Шаг 1: Выполнение скрипта навыка

Предположим, у вас есть навык docker-helper, содержащий скрипт build.sh:

Ввод пользователя:
Выполните скрипт build.sh навыка docker-helper

Ответ системы:
Building Docker image...
Successfully built abc123def456
Tagged as myapp:latest

Что вы должны увидеть: вывод скрипта отображается в ответе.

При выполнении скрипта рабочий каталог уже переключён на каталог навыка, поэтому build.sh может корректно получить доступ к ресурсам навыка, таким как Dockerfile.

Шаг 2: Передача параметров командной строки

Многие скрипты поддерживают параметры. Например, deploy.sh может требовать указания среды:

Ввод пользователя:
Выполните deploy.sh навыка docker-helper с параметром production

Ответ системы:
Deploying to production environment...
Uploading image to registry...
Deployment successful: https://myapp.example.com

Вы также можете передать несколько параметров:

Ввод пользователя:
Разверните с помощью deploy.sh с параметрами staging и --force

Ответ системы:
Deploying to staging environment (--force mode)...
Skipping validation...
Deployment successful

Что вы должны увидеть: скрипт получает параметры и выполняет соответствующие операции.

Шаг 3: Выполнение скриптов из вложенных каталогов

Скрипты могут находиться в подкаталогах навыка, например tools/setup.sh:

Ввод пользователя:
Выполните tools/setup.sh навыка docker-helper

Ответ системы:
Setting up Docker environment...
✓ Docker network created
✓ Volume mounted
✓ Environment configured

Относительный путь всегда указывается относительно каталога навыка, независимо от фактической глубины расположения скрипта.

Что вы должны увидеть: скрипты из вложенных каталогов также выполняются корректно.

Шаг 4: Обработка ошибки отсутствия навыка

Если вы ввели неправильное название навыка:

Ввод пользователя:
Выполните build.sh навыка docker-asistant

Ответ системы:
Skill "docker-asistant" not found. Did you mean "docker-helper"?

Плагин предложит правильное название навыка на основе нечёткого сопоставления. Вы можете сначала вызвать get_available_skills для просмотра доступных навыков.

Что вы должны увидеть: сообщение об ошибке и предлагаемое правильное название.

Шаг 5: Обработка ошибки отсутствия скрипта

Если скрипт отсутствует в списке скриптов навыка:

Ввод пользователя:
Выполните run.sh навыка docker-helper

Ответ системы:
Script "run.sh" not found in skill "docker-helper". Did you mean "build.sh"?
Available scripts: build.sh, deploy.sh

Плагин перечислит все доступные скрипты, что позволит вам выбрать правильное название скрипта.

Что вы должны увидеть: сообщение об ошибке и список доступных скриптов.

Шаг 6: Понимание сбоя выполнения скрипта

Если выполнение скрипта завершилось неудачей (код выхода не равен 0), плагин вернёт информацию об ошибке:

Ввод пользователя:
Выполните build.sh навыка docker-helper

Ответ системы:
Script failed (exit 1): Dockerfile not found in /path/to/skill

Информация об ошибке включает:

  • Код выхода: exit 1 означает, что скрипт завершился с ненулевым статусом
  • Вывод ошибки: содержимое stderr или stdout скрипта
  • Причина сбоя: конкретная информация об ошибке скрипта

Что вы должны увидеть: подробная информация об ошибке поможет вам локализовать проблему.

Контрольная точка ✅

  • [ ] Можете ли вы выполнять исполняемые скрипты в каталоге навыка?
  • [ ] Можете ли вы передавать параметры командной строки в скрипты?
  • [ ] Понимаете ли вы контекст рабочего каталога при выполнении скриптов?
  • [ ] Можете ли вы выявлять и обрабатывать ошибки выполнения скриптов?
  • [ ] Знаете ли вы, как проверить настройки разрешений скриптов?

Предупреждения о подводных камнях

Ловушка 1: Скрипт не имеет прав на выполнение

Если вы создали новый скрипт, но забыли установить права на выполнение, он не появится в списке скриптов.

Проявление ошибки:

Available scripts: build.sh  # Ваш новый скрипт new-script.sh отсутствует в списке

Причина: у файла нет прав на выполнение (mode & 0o111 равно false).

Решение: установите права на выполнение в терминале:

bash
chmod +x .opencode/skills/my-skill/new-script.sh

Проверка: снова вызовите get_available_skills для просмотра списка скриптов.

Ловушка 2: Неверный путь к скрипту

Путь к скрипту должен быть относительным путём относительно каталога навыка, нельзя использовать абсолютные пути или ссылки на родительский каталог.

Неверный пример:

bash
# ❌ Ошибка: использование абсолютного пути
Выполните /path/to/skill/build.sh навыка docker-helper

# ❌ Ошибка: попытка доступа к родительскому каталогу (хотя пройдёт проверку безопасности, но путь неверный)
Выполните ../build.sh навыка docker-helper

Верный пример:

bash
# ✅ Правильно: использование относительного пути
Выполните build.sh навыка docker-helper
Выполните tools/deploy.sh навыка docker-helper

Причина: плагин проверяет безопасность пути, предотвращая атаки directory traversal, и при этом относительный путь основывается на каталоге навыка.

Ловушка 3: Скрипт зависит от рабочего каталога

Если скрипт предполагает, что текущий каталог — это корневой каталог проекта, а не каталог навыка, выполнение может завершиться неудачей.

Неверный пример:

bash
# build.sh в каталоге навыка
#!/bin/bash
# ❌ Ошибка: предполагается, что текущий каталог — корневой каталог проекта
docker build -t myapp .

Проблема: при выполнении текущий каталог — это каталог навыка (.opencode/skills/docker-helper), а не корневой каталог проекта.

Решение: скрипты должны использовать абсолютные пути или динамически определять корневой каталог проекта:

bash
# ✅ Правильно: использование относительного пути для определения корневого каталога проекта
docker build -t myapp ../../..

# Или: использование переменных окружения или файлов конфигурации
PROJECT_ROOT="${SKILL_DIR}/../../.."
docker build -t myapp "$PROJECT_ROOT"

Примечание: в каталоге навыка может отсутствовать Dockerfile проекта, поэтому скрипты должны самостоятельно находить файлы ресурсов.

Ловушка 4: Чрезмерно длинный вывод скрипта

Если скрипт выводит много журнальных сообщений (например, ход загрузки при npm install), ответ может стать очень длинным.

Проявление:

bash
Ответ системы:
npm WARN deprecated package...
npm notice created a lockfile...
added 500 packages in 2m
# Возможно, сотни строк вывода

Рекомендация: скрипты должны иметь краткий вывод, отображающий только ключевую информацию:

bash
#!/bin/bash
echo "Installing dependencies..."
npm install --silent
echo "✓ Dependencies installed (500 packages)"

Итог урока

Инструмент run_skill_script позволяет вам выполнять исполняемые скрипты в контексте каталога навыка и поддерживает:

  • Передачу параметров: передача параметров командной строки через массив arguments
  • Переключение рабочего каталога: при выполнении скрипта CWD переключается на каталог навыка
  • Обработку ошибок: перехват кодов выхода и вывода ошибок для упрощения отладки
  • Проверку разрешений: выполняются только файлы с правами на выполнение
  • Безопасность путей: проверка пути скрипта для предотвращения directory traversal

Правила обнаружения скриптов:

  • Рекурсивное сканирование каталога навыка, максимальная глубина 10 уровней
  • Пропуск скрытых каталогов и распространённых каталогов зависимостей
  • Включаются только файлы с правами на выполнение
  • Путь является относительным путём относительно каталога навыка

Лучшие практики:

  • Вывод скриптов должен быть кратким, отображать только ключевую информацию
  • Скрипты не должны предполагать, что текущий каталог — корневой каталог проекта
  • Используйте chmod +x для установки прав на выполнение для новых скриптов
  • Сначала используйте get_available_skills для просмотра доступных скриптов

Предварительный обзор следующего урока

В следующем уроке мы изучим Чтение файлов навыков.

Вы узнаете:

  • Использование инструмента read_skill_file для доступа к документации и конфигурации навыка
  • Понимание механизма проверки безопасности пути для предотвращения атак directory traversal
  • Освоение форматов чтения файлов и внедрения содержимого XML
  • Научитесь организовывать вспомогательные файлы в навыках (документация, примеры, конфигурация и т. д.)

Приложение: Справочник по исходному коду

Нажмите, чтобы просмотреть расположение исходного кода

Время обновления: 2026-01-24

ФункцияПуть к файлуНомер строки
Определение инструмента RunSkillScriptsrc/tools.ts137-198
Функция findScriptssrc/skills.ts59-99

Ключевые типы:

  • Script = { relativePath: string; absolutePath: string }: метаданные скрипта, содержащие относительный и абсолютный пути

Ключевые константы:

  • Максимальная глубина рекурсии: 10 (skills.ts:64) — ограничение глубины поиска скриптов
  • Список пропускаемых каталогов: ['node_modules', '__pycache__', '.git', '.venv', 'venv', '.tox', '.nox'] (skills.ts:61)
  • Маска прав на выполнение: 0o111 (skills.ts:86) — проверка, является ли файл исполняемым

Ключевые функции:

  • RunSkillScript(skill: string, script: string, arguments?: string[]): выполнение скрипта навыка, поддерживает передачу параметров и переключение рабочего каталога
  • findScripts(skillPath: string): рекурсивный поиск исполняемых файлов в каталоге навыка, возвращает отсортированный по относительным путям список

Бизнес-правила:

  • При выполнении скрипта переключение рабочего каталога на каталог навыка (tools.ts:180): $.cwd(skill.path)
  • Выполняются только скрипты из списка scripts навыка (tools.ts:165-177)
  • При отсутствии скрипта возвращается список доступных скриптов, поддерживаются предложения по нечёткому сопоставлению (tools.ts:168-176)
  • При сбое выполнения возвращаются код выхода и вывод ошибки (tools.ts:184-195)
  • Пропускаются скрытые каталоги (начинающиеся с .) и распространённые каталоги зависимостей (skills.ts:70-71)