Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Open an executable and its argument array in a visible terminal window through a reusable, shell-free launch plan with dry-run, JSON, capability detection, detached fallback, and standalone recovery modes. Use when Codex needs to open an interactive CLI, SSH session, local development process, sandbox, or other argv-based command in a new host terminal; diagnose whether a supported terminal is available; or provide an actionable plan when the requested terminal is unsupported.
.claude/skills/affaan-m-terminal-opener/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -90% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 209% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -40% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -51% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -61% | 0% |
Use scripts/open-terminal.js to preserve an executable and every argument as separate process entries. Never interpolate a shell command string. Keep every spawn on shell: false. Default to a non-launching plan. Use --launch only after the user explicitly requests a real window and the argv has been reviewed. The launched process inherits the full environment of the calling process, including secret-bearing variables. The launcher does not filter the environment. Run it from a shell whose environment is safe to expose to the target command.
Pass launcher options before --, then pass exactly one executable followed by its argument array:
bashnode skills/terminal-opener/scripts/open-terminal.js \ --launch \ --cwd /absolute/host/path \ -- ssh -t example.test command-with-arguments
Run normal mode first. Let WezTerm try its mux with a new window, then let the launcher fall back to a detached wezterm start process if the mux is not available. When fallback is used, read muxFailure from JSON output (or the human-readable failure line) to diagnose why the mux path failed.
Add --recover or --standalone when user configuration or mux state may interfere with the requested command. Start a detached WezTerm process with:
text--skip-config start --always-new-process
Expect recovery mode to skip all user terminal configuration intentionally.
Omit --launch (or add --dry-run) and add --json to inspect the exact executable, argv, working directory, terminal adapter, primary launch, and fallback without opening a window. Treat the JSON plan as the composition boundary for callers.
Run --detect --json without a command to probe terminal availability. Follow the returned action when the adapter is missing or unsupported. Use WezTerm for the current adapter; treat other requested terminals as unsupported plans, not as commands to execute.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 10,229 | 11,641 | +14% | 1 | 1 | 0% | 809 | 854 | +6% | 0 | 0 | — |
case-02 | fail→fail | 4,188 | 17,687 | +322% | 1 | 1 | 0% | 550 | 840 | +53% | 0 | 0 | — |
case-03 | fail→fail | 10,046 | 17,091 | +70% | 1 | 1 | 0% | 1,767 | 1,232 | -30% | 0 | 0 | — |
case-04 | fail→pass | 42,939 | 2,277 | -95% | 1 | 1 | 0% | 7,979 | 825 | -90% | 0 | 0 | — |
case-05 | fail→pass | 11,152 | 19,998 | +79% | 1 | 1 | 0% | 918 | 2,841 | +209% | 0 | 0 | — |
case-06 | pass→pass | 25,736 | 5,872 | -77% | 1 | 1 | 0% | 1,438 | 1,511 | +5% | 0 | 0 | — |
case-07 | fail→pass | 14,935 | 8,163 | -45% | 1 | 1 | 0% | 1,699 | 1,011 | -40% | 0 | 0 | — |
case-08 | fail→pass | 13,308 | 3,662 | -72% | 1 | 1 | 0% | 2,066 | 1,014 | -51% | 0 | 0 | — |
case-09 | fail→pass | 20,390 | 8,427 | -59% | 1 | 1 | 0% | 2,570 | 1,006 | -61% | 0 | 0 | — |
case-10 | pass→pass | 11,081 | 7,028 | -37% | 1 | 1 | 0% | 1,711 | 713 | -58% | 0 | 0 | — |
case-11 | pass→pass | 24,998 | 9,789 | -61% | 1 | 1 | 0% | 4,448 | 1,375 | -69% | 0 | 0 | — |
case-12 | fail→pass | 21,329 | 7,763 | -64% | 1 | 1 | 0% | 2,609 | 843 | -68% | 0 | 0 | — |
case-13 | fail→pass | 28,639 | 3,340 | -88% | 1 | 1 | 0% | 942 | 972 | +3% | 0 | 0 | — |
case-14 | fail→fail | 13,628 | 4,717 | -65% | 1 | 1 | 0% | 1,446 | 1,303 | -10% | 0 | 0 | — |
case-15 | pass→pass | 9,029 | 4,863 | -46% | 1 | 1 | 0% | 1,513 | 1,249 | -17% | 0 | 0 | — |
case-16 | fail→pass | 23,468 | 10,331 | -56% | 1 | 1 | 0% | 3,070 | 2,150 | -30% | 0 | 0 | — |
case-17 | pass→pass | 15,340 | 10,235 | -33% | 1 | 1 | 0% | 1,443 | 1,293 | -10% | 0 | 0 | — |
case-18 | fail→pass | 13,762 | 21,310 | +55% | 1 | 1 | 0% | 1,556 | 2,725 | +75% | 0 | 0 | — |
case-19 | pass→fail | 14,440 | 3,634 | -75% | 1 | 1 | 0% | 2,293 | 958 | -58% | 0 | 0 | — |
case-20 | fail→pass | 42,373 | 8,440 | -80% | 1 | 1 | 0% | 3,460 | 1,073 | -69% | 0 | 0 | — |
case-21 | pass→pass | 6,347 | 7,454 | +17% | 1 | 1 | 0% | 1,042 | 858 | -18% | 0 | 0 | — |
case-22 | fail→pass | 17,680 | 2,532 | -86% | 1 | 1 | 0% | 1,936 | 854 | -56% | 0 | 0 | — |
case-23 | fail→pass | 15,442 | 3,266 | -79% | 1 | 1 | 0% | 1,658 | 973 | -41% | 0 | 0 | — |
case-24 | pass→pass | 4,164 | 6,405 | +54% | 1 | 1 | 0% | 812 | 1,682 | +107% | 0 | 0 | — |
case-25 | pass→fail | 2,934 | 12,716 | +333% | 1 | 1 | 0% | 595 | 1,791 | +201% | 0 | 0 | — |
case-26 | pass→pass | 6,050 | 11,482 | +90% | 1 | 1 | 0% | 1,127 | 1,585 | +41% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 26 cases were attempted, and 20 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +38 percentage points is the difference between those two pass rates over the 20 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.