AgentSkillsCN

bash-strategy

在无头环境中采用非交互式Shell策略,这对于防止系统挂起至关重要。

SKILL.md
--- frontmatter
name: bash-strategy
description: Non-interactive shell strategy for headless environments. CRITICAL for preventing hangs.

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

bash
yes | ./install_script.sh

Heredoc Input

bash
./configure.sh <<EOF
option1
option2
EOF

Echo Pipe

bash
echo "password" | sudo -S command

Timeout Wrapper (last resort)

bash
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:

code
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:

markdown
Do not use logging.getLogger()
Don't create CLI code here

Use:

markdown
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.