askill
bash-strategy

bash-strategySafety 100Repository

Non-interactive shell strategy for headless environments. CRITICAL for preventing hangs.

0 stars
1.2k downloads
Updated 2/7/2026

Package Files

Loading files...
SKILL.md

Shell Non-Interactive Strategy (Global)

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.

Cognitive & Behavioral Standards

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:

  1. Process Continuity (Turn-Taking):

    • Rule: Never stop after a tool output to "wait for instructions" unless the task is complete.
    • Why: The environment is non-interactive. You must drive the workflow.
    • Mechanism: Commands expecting input MUST use timeouts or explicit "yes" pipes.
  2. Explicit Action Framing (Positive Constraints):

    • Rule: Follow "GOOD" (positive) instructions, ignore "BAD" (negative) assumptions.
    • Why: Models follow explicit directives ("Use -y") better than prohibitions ("Don't prompt").
    • Mechanism: Always preemptively supply non-interactive flags.
  3. Environment Rigor (Context Awareness):

    • Rule: Assume a headless CI environment where any prompt = failure.
    • Why: There is no TTY. "Asking the user" via a shell prompt causes a hang.
    • Mechanism: Strictly avoid editors, pagers, and interactive modes.

1. Core Mandates

  1. Assume CI=true: Act as if running in a headless CI/CD pipeline.
  2. No Editors/Pagers: vim, nano, less, more, man are BANNED.
  3. Force & Yes: Always preemptively supply "yes" or "force" flags.
  4. Use Tools: Prefer Read/Write/Edit tools over shell manipulation (sed, echo, cat).
  5. No Interactive Modes: Never use -i or -p flags that require user input.

2. Environment Variables (Auto-Set)

These environment variables help prevent interactive prompts:

VariableValuePurpose
CItrueGeneral CI detection
DEBIAN_FRONTENDnoninteractiveApt/dpkg prompts
GIT_TERMINAL_PROMPT0Git auth prompts
GIT_EDITORtrueBlock git editor
GIT_PAGERcatDisable git pager
PAGERcatDisable system pager
GCM_INTERACTIVEneverGit credential manager
HOMEBREW_NO_AUTO_UPDATE1Homebrew updates
npm_config_yestrueNPM prompts
PIP_NO_INPUT1Pip prompts
YARN_ENABLE_IMMUTABLE_INSTALLSfalseYarn lockfile

3. Command Reference

Package Managers

ToolInteractive (BAD)Non-Interactive (GOOD)
NPMnpm initnpm init -y
NPMnpm installnpm install --yes
Yarnyarn installyarn install --non-interactive
PNPMpnpm installpnpm install --reporter=silent
Bunbun initbun init -y
APTapt-get install pkgapt-get install -y pkg
APTapt-get upgradeapt-get upgrade -y
PIPpip install pkgpip install --no-input pkg
Homebrewbrew install pkgHOMEBREW_NO_AUTO_UPDATE=1 brew install pkg

Git Operations

ActionInteractive (BAD)Non-Interactive (GOOD)
Commitgit commitgit commit -m "msg"
Mergegit merge branchgit merge --no-edit branch
Pullgit pullgit pull --no-edit
Rebasegit rebase -igit rebase (non-interactive)
Addgit add -pgit add . or git add <file>
Stashgit stash pop (conflicts)git stash pop or handle manually
Loggit log (pager)git log --no-pager or git log -n 10
Diffgit diff (pager)git diff --no-pager or git --no-pager diff

System & Files

ToolInteractive (BAD)Non-Interactive (GOOD)
RMrm file (prompts)rm -f file
RMrm -i filerm -f file
CPcp -i a bcp -f a b
MVmv -i a bmv -f a b
Unzipunzip file.zipunzip -o file.zip
Tartar xf file.tartar xf file.tar (usually safe)
SSHssh hostssh -o BatchMode=yes -o StrictHostKeyChecking=no host
SCPscp file host:scp -o BatchMode=yes file host:
Curlcurl urlcurl -fsSL url
Wgetwget urlwget -q url

Docker

ActionInteractive (BAD)Non-Interactive (GOOD)
Rundocker run -it imagedocker run image
Execdocker exec -it container bashdocker exec container cmd
Builddocker build .docker build --progress=plain .
Composedocker-compose updocker-compose up -d

Python/Node REPLs

ToolInteractive (BAD)Non-Interactive (GOOD)
Pythonpythonpython -c "code" or python script.py
Nodenodenode -e "code" or node script.js
IPythonipythonNever use - always python -c

4. Banned Commands (Will Always Hang)

These commands will hang indefinitely - never use them:

  • Editors: vim, vi, nano, emacs, pico, ed
  • Pagers: less, more, most, pg
  • Manual pages: man
  • Interactive git: git add -p, git rebase -i, git commit (without -m)
  • REPLs: python, node, irb, ghci (without script/command)
  • Interactive shells: bash -i, zsh -i

5. Handling Prompts

When a command doesn't have a non-interactive flag:

The "Yes" Pipe

yes | ./install_script.sh

Heredoc Input

./configure.sh <<EOF
option1
option2
EOF

Echo Pipe

echo "password" | sudo -S command

Timeout Wrapper (last resort)

timeout 30 ./potentially_hanging_script.sh || echo "Timed out"

6. Best Practices

  1. Always test commands mentally for interactive prompts before running
  2. Check man pages (via web search) for -y, --yes, --non-interactive, -f, --force flags
  3. Use --help to discover non-interactive options: cmd --help | grep -i "non-interactive\|force\|yes"
  4. Prefer OpenCode tools over shell commands for file operations
  5. Set timeout for any command that might unexpectedly prompt

7. Advanced Instruction Patterns (Cognitive Optimization)

The Problem: Implicit Constraints

Large Language Models (LLMs) often struggle with:

  1. Negative constraints: Inverting or ignoring "don't do X" instructions.
  2. Turn termination: Stopping after tool execution instead of auto-continuing.
  3. Context weighting: Failing to prioritize authoritative instructions over general knowledge.

Strategy 1: Explicit Action Framing (BAD vs GOOD)

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:

  • "BAD: npm init" → Model identifies the failure pattern.
  • "GOOD: npm init -y" → Model receives a specific, executable instruction.
  • Result: Reduces hallucination of interactive commands by providing a verified substitute.

Strategy 2: Process Continuity

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

Strategy 3: Context Hierarchy

When instructions conflict (e.g., generic docs vs this specific strategy), establish precedence:

  1. Cite the Authority: "Per shell_strategy.md..."
  2. Follow the Specifics: Rules in this file override general model training or other documentation.

Strategy 4: Applying These Patterns Beyond Shell

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.

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

88/100Analyzed 4/5/2026

Comprehensive non-interactive shell strategy that prevents hangs in headless environments. Excellent command reference tables, BAD vs GOOD patterns, and environment variable configurations. Covers package managers, git, Docker, system tools, and banned commands. Includes cognitive optimization patterns for LLM instruction. Highly actionable with clear trigger section. Some OpenCode-specific references but core content is broadly applicable to any CI/CD or headless environment.

100
90
70
85
90

Metadata

Licenseunknown
Version-
Updated2/7/2026
Publisherjralph

Tags

apici-cdgithub-actionsllmobservabilitypromptingsecuritytesting