From 61740e5561b7b9d48dcc0d6554c746d6c8feefdd Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Tue, 23 Dec 2025 10:45:24 +0900 Subject: [PATCH] feat(non-interactive-env): add banned command detection using SHELL_COMMAND_PATTERNS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Detect and warn about interactive commands (vim, nano, less, etc.) - Filter out descriptive entries with parentheses from pattern matching 🤖 GENERATED WITH ASSISTANCE OF OhMyOpenCode (https://github.com/code-yeongyu/oh-my-opencode) --- src/hooks/non-interactive-env/index.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/hooks/non-interactive-env/index.ts b/src/hooks/non-interactive-env/index.ts index 9144823..c05d45f 100644 --- a/src/hooks/non-interactive-env/index.ts +++ b/src/hooks/non-interactive-env/index.ts @@ -1,15 +1,28 @@ import type { PluginInput } from "@opencode-ai/plugin" -import { HOOK_NAME, NON_INTERACTIVE_ENV } from "./constants" +import { HOOK_NAME, NON_INTERACTIVE_ENV, SHELL_COMMAND_PATTERNS } from "./constants" import { log } from "../../shared" export * from "./constants" export * from "./types" +const BANNED_COMMAND_PATTERNS = SHELL_COMMAND_PATTERNS.banned + .filter((cmd) => !cmd.includes("(")) + .map((cmd) => new RegExp(`\\b${cmd}\\b`)) + +function detectBannedCommand(command: string): string | undefined { + for (let i = 0; i < BANNED_COMMAND_PATTERNS.length; i++) { + if (BANNED_COMMAND_PATTERNS[i].test(command)) { + return SHELL_COMMAND_PATTERNS.banned[i] + } + } + return undefined +} + export function createNonInteractiveEnvHook(_ctx: PluginInput) { return { "tool.execute.before": async ( input: { tool: string; sessionID: string; callID: string }, - output: { args: Record } + output: { args: Record; message?: string } ): Promise => { if (input.tool.toLowerCase() !== "bash") { return @@ -25,6 +38,11 @@ export function createNonInteractiveEnvHook(_ctx: PluginInput) { ...NON_INTERACTIVE_ENV, } + const bannedCmd = detectBannedCommand(command) + if (bannedCmd) { + output.message = `⚠️ Warning: '${bannedCmd}' is an interactive command that may hang in non-interactive environments.` + } + log(`[${HOOK_NAME}] Set non-interactive environment variables`, { sessionID: input.sessionID, env: NON_INTERACTIVE_ENV,