* feat(wiki): support local Claude and Codex providers
* chore(autofix): apply prettier + eslint fixes via /autofix command
* fix(wiki): address local CLI provider review findings
- Add subprocess timeout: LocalCLIConfig gains requestTimeoutMs,
runLocalCLI sets a kill timer that rejects with an actionable error
matching the HTTP timeout message format. --timeout is no longer
silently ignored for claude/codex providers.
- Add windowsHide: true to spawn() to prevent console window flash on
Windows, matching cursor-client.ts behavior.
- Skip GITNEXUS_MODEL env var for local providers so a user's OpenAI
model name doesn't cross-contaminate claude/codex CLI invocations.
Precedence for local providers: --model → savedLocalModel → ''.
- Guard against empty stdout: reject with actionable error when CLI
exits 0 but produces no output, preventing silent empty wiki pages.
* fix(wiki): address deep-review findings in local CLI providers
- Move empty-output guard from runLocalCLI to per-provider callers so
Codex can read --output-last-message file even when stdout is empty
- Merge existing config in interactive setup (local + Azure paths) to
prevent saveCLIConfig from erasing previously saved API keys
- Use StringDecoder for stdout/stderr to handle multi-byte UTF-8 chars
split across pipe chunk boundaries
- Distinguish ENOENT from non-zero exit in detectLocalCLI so users see
auth guidance instead of misleading "CLI not found" when the binary
exists but is not authenticated
* test(wiki): add subprocess contract tests for local CLI providers
Add 21 integration-level tests covering the Claude and Codex subprocess
contracts that wiki-flags.test.ts mocks out:
- Claude argv: -p, --output-format text, --no-session-persistence,
--model conditional, stdin prompt content, CI=1, windowsHide:true
- Codex argv: exec subcommand, --sandbox read-only, -c approval_policy,
--output-last-message temp path, --cd, stdin marker, --model
- Timeout: kill timer fires and rejects, no timer when unset
- Codex file fallback: stdout used when file missing, error when both empty
- detectLocalCLI: warn on non-ENOENT, silent on ENOENT
- onChunk: cumulative byte count forwarded
Also register the test in cross-platform-tests.ts SPAWN_CLI section and
fix detectLocalCLI ENOENT detection logic (invert the check so non-ENOENT
errors produce a warning).
* fix(wiki): platform-aware process tree kill and Codex contract snapshot
- Add killChildTree helper that uses taskkill /T /F /PID on Windows to
terminate the entire process tree (including cmd.exe grandchildren),
with fallback to child.kill() if taskkill fails or on non-Windows
- Add Codex CLI flag contract snapshot test that locks the exact spawn
args — any flag rename, reorder, or removal is caught immediately
- Add Windows taskkill tests: success path asserts taskkill called with
correct PID and /T /F flags, failure path verifies child.kill() fallback
---------
Co-authored-by: eddie.pan2 <eddie.pan2@jtexpress.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gergő Magyar <gergomagyar@icloud.com>
Co-authored-by: Test <test@example.com>