* feat(wiki): add grok local CLI provider
Wiki generation can use `gitnexus wiki --provider grok` to spawn the
authenticated Grok Build CLI (`grok --prompt-file`) instead of an HTTP API key.
* style(wiki): prettier grok-client for CI format check
CI quality/format failed on grok-client.ts. Auto-format matches repo prettier so the GitNexus /autofix comment is applied locally.
* Update Grok CLI configuration to use empty allowlist and increase max tu
* Replace Grok tool allowlist with explicit denylist and strict sandbox
* Increase Grok max turns to 15 to accommodate prompt variance
* chore(wiki): drop Unreleased CHANGELOG hunk and restore lockfile libc selectors
Feature PRs do not own CHANGELOG.md. Restore the 16 libc platform selectors
deleted from package-lock.json with no dependency change.
* fix(wiki): resolve grok CLI through Windows cmd.exe shims
Extract resolveWindowsCliCommand from the local CLI client and use it for
grok detect/spawn so npm .cmd installs work without a shell. Keep
detectGrokCLI() returning the display name for the wiki menu.
* fix(wiki): wait for grok child close before timeout cleanup
Do not reject the grok spawn promise on the timeout timer. Kill the child,
escalate SIGKILL after 2s, and reject only on close (or a second 2s hard
deadline) so callGrokLLM cannot rm the sandbox while the process is alive.
* fix(wiki): reject incomplete grok stopReason and distinct parse errors
Honor JSON stopReason (end_turn or omitted succeeds; anything else throws).
Split empty-output / non-JSON / missing-text messages and include a truncated
stdout excerpt. Drop unused GrokConfig.workingDirectory.
* fix(wiki): keep grok temp dir on hung timeout and ignore stdin
Hard-deadline reject no longer removes --cwd while the child may still
be running. Spawn stdin is ignored so grok's unused pipe cannot EPIPE
the wiki process.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* fix(wiki): require grok stopReason=end_turn for a finished page
Live grok 1.0.5 with wiki spawn flags returns stopReason end_turn.
Omitted, null, or empty stopReason is no longer treated as success, so
generateLeafPage cannot write a page that never completed.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* style(wiki): deslop grok parse nesting and extra comments
Flatten parseGrokOutput with early returns and drop narrative comments
that restated the timeout/stdin/stopReason constraints. Behavior unchanged.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* test(wiki): make grok Windows spawn tests match real cmd.exe
On Windows CI, detectGrokCLI also calls where.exe, ComSpec is an
absolute cmd.exe path, and waitForSpawn must wait for real fs I/O.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* test(wiki): expect taskkill on Windows grok timeout, not child.kill
killChildTree uses taskkill /T /F on win32 and only falls back to
child.kill() if that fails.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* test(wiki): remove grok temp dir after hard-deadline leak assertion
The hard-deadline test must keep the dir until close, then emit close so
late cleanup runs and the temp directory is not left behind.
Co-Authored-By: Grok 4.6 <grok4.6@x.ai>
* test(wiki): wait for grok temp dir rm after late close
Windows CI failed the hard-deadline test because 30 setImmediate ticks
cannot observe fire-and-forget fs.rm. Poll with real timers after close.
---------
Co-authored-by: Grok 4.6 <grok4.6@x.ai>
* 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>