一键导入
shell-command
Execute shell commands with strict adherence to non-interactive flags and environment variables to prevent hanging in OpenCode's headless environment.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Execute shell commands with strict adherence to non-interactive flags and environment variables to prevent hanging in OpenCode's headless environment.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Implement or update support for an underlying agent CLI in Ralph after specs are defined, including factory wiring and tests.
Create or update agent integration specs before implementation. Use this whenever a request is about defining how a new or existing agent should behave in Ralph.
| name | shell-command |
| description | Execute shell commands with strict adherence to non-interactive flags and environment variables to prevent hanging in OpenCode's headless environment. |
| metadata | {"source":"https://github.com/JRedeker/opencode-shell-strategy/blob/1f83c6e477d2d2f1cb791d7cc9be7f165a4f670b/shell_strategy.md"} |
Context: OpenCode's shell environment is strictly non-interactive. It lacks a TTY/PTY, meaning any command that waits for user input, confirmation, or launches a UI (editor/pager) will hang indefinitely and timeout.
Goal: Achieve parity with Claude Code's shell capabilities through internalized knowledge of non-interactive flags and environment variables.
To match the high-agency, autonomous capabilities of advanced models (like Claude Sonnet), this strategy enforces strict cognitive patterns. These are not just shell tips; they are behavioral requirements for success in this environment.
Goal: Eliminate "human-in-the-loop" dependency during task execution.
Key Behaviors:
Process Continuity (Turn-Taking):
Explicit Action Framing (Positive Constraints):
Environment Rigor (Context Awareness):
CI=true: Act as if running in a headless CI/CD pipeline.vim, nano, less, more, man are BANNED.Read/Write/Edit tools over shell manipulation (sed, echo, cat).-i or -p flags that require user input.These environment variables help prevent interactive prompts:
| Variable | Value | Purpose |
|---|---|---|
CI | true | General CI detection |
DEBIAN_FRONTEND | noninteractive | Apt/dpkg prompts |
GIT_TERMINAL_PROMPT | 0 | Git auth prompts |
GIT_EDITOR | true | Block git editor |
GIT_PAGER | cat | Disable git pager |
PAGER | cat | Disable system pager |
GCM_INTERACTIVE | never | Git credential manager |
HOMEBREW_NO_AUTO_UPDATE | 1 | Homebrew updates |
npm_config_yes | true | NPM prompts |
PIP_NO_INPUT | 1 | Pip prompts |
YARN_ENABLE_IMMUTABLE_INSTALLS | false | Yarn lockfile |
| Tool | Interactive (BAD) | Non-Interactive (GOOD) |
|---|---|---|
| NPM | npm init | npm init -y |
| NPM | npm install | npm install --yes |
| Yarn | yarn install | yarn install --non-interactive |
| PNPM | pnpm install | pnpm install --reporter=silent |
| Bun | bun init | bun init -y |
| APT | apt-get install pkg | apt-get install -y pkg |
| APT | apt-get upgrade | apt-get upgrade -y |
| PIP | pip install pkg | pip install --no-input pkg |
| Homebrew | brew install pkg | HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg |
| Action | Interactive (BAD) | Non-Interactive (GOOD) |
|---|---|---|
| Commit | git commit | git commit -m "msg" |
| Merge | git merge branch | git merge --no-edit branch |
| Pull | git pull | git pull --no-edit |
| Rebase | git rebase -i | git rebase (non-interactive) |
| Add | git add -p | git add . or git add <file> |
| Stash | git stash pop (conflicts) | git stash pop or handle manually |
| Log | git log (pager) | git log --no-pager or git log -n 10 |
| Diff | git diff (pager) | git diff --no-pager or git --no-pager diff |
| Tool | Interactive (BAD) | Non-Interactive (GOOD) |
|---|---|---|
| RM | rm file (prompts) | rm -f file |
| RM | rm -i file | rm -f file |
| CP | cp -i a b | cp -f a b |
| MV | mv -i a b | mv -f a b |
| Unzip | unzip file.zip | unzip -o file.zip |
| Tar | tar xf file.tar | tar xf file.tar (usually safe) |
| SSH | ssh host | ssh -o BatchMode=yes -o StrictHostKeyChecking=no host |
| SCP | scp file host: | scp -o BatchMode=yes file host: |
| Curl | curl url | curl -fsSL url |
| Wget | wget url | wget -q url |
| Action | Interactive (BAD) | Non-Interactive (GOOD) |
|---|---|---|
| Run | docker run -it image | docker run image |
| Exec | docker exec -it container bash | docker exec container cmd |
| Build | docker build . | docker build --progress=plain . |
| Compose | docker-compose up | docker-compose up -d |
| Tool | Interactive (BAD) | Non-Interactive (GOOD) |
|---|---|---|
| Python | python | python -c "code" or python script.py |
| Node | node | node -e "code" or node script.js |
| IPython | ipython | Never use - always python -c |
These commands will hang indefinitely - never use them:
vim, vi, nano, emacs, pico, edless, more, most, pgmangit add -p, git rebase -i, git commit (without -m)python, node, irb, ghci (without script/command)bash -i, zsh -iWhen a command doesn't have a non-interactive flag:
yes | ./install_script.sh
./configure.sh <<EOF
option1
option2
EOF
echo "password" | sudo -S command
timeout 30 ./potentially_hanging_script.sh || echo "Timed out"
Alternatively, use a subshell to start the hanging command and kill it after completion (e.g., for starting a dev server).
-y, --yes, --non-interactive, -f, --force flags--help to discover non-interactive options: cmd --help | grep -i "non-interactive\|force\|yes"Large Language Models (LLMs) often struggle with:
This plugin uses the BAD vs GOOD pattern to enforce positive constraints. Instead of saying "Don't use interactive flags", we provide a concrete "Good" alternative.
Why it works:
In non-interactive environments, the agent must drive the process forward.
The Rule: Never stop after a tool execution unless the task is complete.
Pattern:
1. Execute command (e.g., git status)
2. Analyze output
3. Explicitly state next step: "Status is clean. Next: I will run tests."
4. Execute next step immediately
When instructions conflict (e.g., generic docs vs this specific strategy), establish precedence:
The cognitive strategies used here (Explicit Action Framing) apply to all coding tasks:
Instead of:
Do not use logging.getLogger()
Don't create CLI code here
Use:
ALWAYS USE: config.logging_config.get_logger()
USE THIS REPO FOR: API backend only
By framing instructions as "Actionable Positive Constraints", you reduce hallucination and improve compliance across all models.