Parent
#355
What to build
Define a ScriptRunner abstraction (function type or single-method interface) that sits between executor orchestration and OS process spawning. Create a ShellRunner concrete adapter that wraps the current shell-exec logic. Update NewExecutor to accept a ScriptRunner parameter. Update the single production caller to pass ShellRunner.
This is purely a plumbing change — no observable behaviour changes, no new tests required. All existing unit tests and Bats integration tests must still pass. The seam this creates is what unblocks the Execute() test suite.
Acceptance criteria
Blocked by
None — can start immediately.
Parent
#355
What to build
Define a
ScriptRunnerabstraction (function type or single-method interface) that sits between executor orchestration and OS process spawning. Create aShellRunnerconcrete adapter that wraps the current shell-exec logic. UpdateNewExecutorto accept aScriptRunnerparameter. Update the single production caller to passShellRunner.This is purely a plumbing change — no observable behaviour changes, no new tests required. All existing unit tests and Bats integration tests must still pass. The seam this creates is what unblocks the Execute() test suite.
Acceptance criteria
ScriptRunnertype is defined (function type or interface with a single method)ShellRunnerconcrete adapter wraps the currentnewOsCommand+Run()logicNewExecutoraccepts aScriptRunnerparameterShellRunnerinstancerunCmddelegates to the injected runner instead of callingos/execdirectlygo test ./...tests passBlocked by
None — can start immediately.