v2.1.6
Cross-Harness Portability (F0-F8) + RCE elimination
F0 — Python portátil
\sys.executable\ em todos os hooks.
esolvePythonCmd()\ no JS (prefere \python3, fallback \python).
F1 — Path resolution unificada
_paths.py\ com
ead_with_fallback(). Dados migrados para ~/.gstack/.
F2 — Input normalization
_harness.py\ mapeia snake_case + camelCase (\lastMessage/ \last_assistant_message, etc).
F3 — Crash safety
\sys.excepthook\ global em \stop.py\ — qualquer exceção gera JSON válido no stdout.
F4 — MCP para Claude
\claude.js\ escreve MCP servers em ~/.claude/settings.json\ além de ~/.mcp.json.
F5 — Bridge real
\writeRealHarnessBridge\ aponta para ~/.gstack/hooks/\ em vez do diretório morto ~/.gstack-vibehard/hooks/.
F6 — Claude independente do Codex
Hooks copiados do pacote (\hooks/hooks/) — não mais de ~/.codex/hooks/.
F7 — OpenCode com stdin
Plugin \gstack-session.js\ passa payload JSON com {cwd, transcript_path, last_assistant_message}'.
F8 — Detectores
Windsurf, Gemini CLI, Kiro, Zed adicionados ao \detector.js.
RCE elimination
- \safeDownloadAndRun: PowerShell use \param(,)\ bind — URL nunca interpretada como comando.
- \headroom.js: 6 \execSync\ convertidos para \execFileSync\ com {shell:false}.
- README corrigido: claims falsas sobre 'todo o código usa execFileSync' removidas.