关于 hyva-exec-shell-cmd
为 Magento 开发项目提供的辅助技能,可检测运行环境并给出相应的命令包装方式。供其他需要执行项目内命令的技能调用。
主要功能
- 01检测 Warden、docker-magento、DDEV 或本地环境
- 02按环境提供命令包装方式
- 03说明哪些命令无需包装
- 04支持通过标准输入运行容器内脚本
适用场景
- 01在不同 Magento 环境中执行 bin/magento 命令
- 02判断命令应在容器内还是主机上运行
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hyva-themes/ hyva-ai-tools --skill hyva-exec-shell-cmd安装后在 Claude Code 中输入/hyva-exec-shell-cmd确认已加载。
附带文件scripts/detect_env.sh
详细介绍
在 Magento 环境中执行 Shell 命令
此工具技能可检测 Magento 开发环境,并提供适当的命令包装器来执行 Shell 命令。
用法
其他技能需要在 Magento 环境中执行命令时,应引用此技能。检测到的包装器可确保命令在正确的上下文(容器或本地环境)中运行。
第 1 步:检测环境
重要: 请从 Magento 项目根目录执行此脚本,或将该路径作为参数提供。
在任何需要执行 Shell 命令的技能开始时,运行一次此检测:
<skill_path>/scripts/detect_env.sh [magento_root_path]
其中,<skill_path> 是此 SKILL.md 文件所在的目录(例如 .claude/skills/hyva-exec-shell-cmd)。
可选参数 magento_root_path 指定 Magento 安装目录。如果省略,脚本将使用当前工作目录。
输出:warden、docker-magento、ddev 或 local
第 2 步:应用命令包装器
根据检测到的环境,按如下方式包装命令:
| 环境 | 命令包装器 | 描述 |
|---|---|---|
| Warden | warden env exec -T php-fpm bash -c "<command>" | 由 Warden 管理的 Docker 环境 |
| docker-magento | bin/clinotty bash -c "<command>" | Mark Shust 的 docker-magento 配置 |
| DDEV | ddev exec <command> | DDEV 容器化环境 |
| Local | 直接运行 <command> | 不使用容器的原生环境 |
示例
单条命令
# Warden
warden env exec -T php-fpm bash -c "bin/magento cache:clean"
# docker-magento
bin/clinotty bash -c "bin/magento cache:clean"
# DDEV
ddev exec bin/magento cache:clean
# Local
bin/magento cache:clean
带目录切换的命令
# Warden
warden env exec -T php-fpm bash -c "cd vendor/hyva-themes/magento2-default-theme/web/tailwind && npm run build"
# docker-magento
bin/clinotty bash -c "cd vendor/hyva-themes/magento2-default-theme/web/tailwind && npm run build"
# DDEV
ddev exec bash -c "vendor/hyva-themes/magento2-default-theme/web/tailwind && npm run build"
# Local
cd vendor/hyva-themes/magento2-default-theme/web/tailwind && npm run build
无需包装的命令
某些命令在主机系统上运行,不应进行包装:
composer命令(在主机上运行,而非容器中)git命令- 主机文件系统上的文件操作(
ls、find、cp,用于访问主机上的文件) wardenCLI 命令ddevCLI 命令
集成模式
需要执行命令的技能应:
- 引用此技能:“使用
hyva-exec-shell-cmd技能确定命令包装器” - 使用第 1 步检测一次环境
- 保存包装器模式,以便在整个技能中使用
- 按照第 2 步,将包装器应用于所有容器命令
在环境中运行捆绑的技能脚本
某些技能附带了辅助脚本(例如 scripts/ 下的 PHP 脚本),必须通过 PHP/Node 解释器运行。在经过安全加固的主机上没有本地解释器,而且安装在用户级别(~/.../skills/...)的技能不在项目目录中,因此容器无法访问它。不要将脚本复制到项目树中:文件如何进入容器取决于不同环境(绑定挂载、Mutagen、命名卷),而且有些路径根本不会同步(例如,Warden 从独立卷提供 var/、generated/、pub/static、pub/media,因此在主机上写入这些目录的文件不会出现在容器中)。
相反,通过 stdin 将脚本流式传入解释器——此方法不受挂载/同步策略影响,无需临时文件,也无需清理:
-
检测环境(第 1 步)并确定包装器(第 2 步)。
-
容器化环境——通过包装器将脚本传递给
php /dev/stdin(使用非 TTY 的-Texec,以便转发 stdin)。<skill_path>是调用技能的 SKILL.md 文件所在目录:# Warden cat "<skill_path>/scripts/<script>.php" | warden env exec -T php-fpm bash -c "php /dev/stdin [args]" # docker-magento cat "<skill_path>/scripts/<script>.php" | bin/clinotty bash -c "php /dev/stdin [args]" # DDEV cat "<skill_path>/scripts/<script>.php" | ddev exec bash -c "php /dev/stdin [args]"脚本运行时,容器的工作目录为项目根目录,因此通过
getcwd()定位项目的脚本可以照常运行。捕获 stdout 作为结果。此方法对脚本的限制: 脚本不能同时读取 stdin(stdin 中包含脚本本身),也不能依赖
__FILE__/__DIR__(其值为/dev/stdin)——应改用getcwd()定位项目文件。 -
local环境:主机上没有解释器(已在安全加固时移除)。不要尝试直接运行脚本——请报告此步骤需要容器化开发环境(或本地解释器)。