chore(smoke): run smoke:tui for real in GitHub CI - #2489
Conversation
Drop the process.env.CI self-skip, which left the TUI with no end-to-end CI signal. The PTY from #2147 already removed the TTY blocker, and ubuntu-latest ships util-linux script(1). Removing the skip alone is not enough: Ink detects CI via is-in-ci and suppresses every interactive frame, so under CI=true the TUI enters the alt screen and paints nothing (verified in ubuntu:24.04, util-linux 2.39.3). The smoke now pins CI/CONTINUOUS_INTEGRATION=false for the child; with that it passes 3/3 in the container under CI=true. Docs that described smoke:tui as local-only are updated; the local gate now has one local-only step (Firefox). Also corrects the publish job comment — pack:verify never ran smoke:tui. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: cliffhall <cliff@futurescale.com>
There was a problem hiding this comment.
Copilot review overview
🔵 Needs a closer look
Add regression coverage proving both CI variables are forced to "false" in the spawned child.
Review effort: Balanced
Findings: None
What changed in this PR
Enables the PTY-backed TUI smoke test in GitHub CI by preventing Ink from suppressing interactive rendering.
Changes:
- Removes the CI self-skip and overrides child CI variables.
- Updates workflow-gate tests, comments, and documentation.
- Corrects CI and publish workflow guidance.
| File | Description |
|---|---|
scripts/smoke-tui.mjs |
Enables CI execution; the environment override lacks regression coverage. |
scripts/lib/workflow-gate.test.mjs |
Updates the TUI smoke test description. |
scripts/lib/workflow-gate.mjs |
Documents the revised CI/local split. |
README.md |
Updates the local-gate summary. |
docs/quality-gate.md |
Documents TUI smoke coverage in CI. |
clients/launcher/README.md |
Documents CI execution and environment handling. |
AGENTS.md |
Updates mandatory gate guidance. |
.github/workflows/main.yml |
Corrects smoke and publishing comments. |
.claude/skills/pre-push-gate/SKILL.md |
Updates gate procedure guidance. |
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
|
Copilot review round 1 — closed. Findings: none, no inline comments, no suppressed block. The headline suggestion (regression coverage proving Loop stopped per the round-exit rule: the only item was declined, so another round would only re-argue it. |
Closes #2408
What changed
smoke:tuiself-skipped wheneverprocess.env.CIwas set, so CI gave no signal on TUI regressions. This PR removes that skip, so the smoke now runs in thebuildjob's existingnpm run smokestep. The workflow's steps are unchanged; only its comments move.Why removing the skip alone was not enough
The PTY wrapper from #2147 had already removed the original blocker, a headless runner with no TTY, and
ubuntu-latestships util-linuxscript(1). But with the skip removed, the smoke failed on Linux underCI=true:\e[?1049h) and never painted "MCP Servers", even with a 40s budget.is-in-ci, and whenCIorCONTINUOUS_INTEGRATIONis set to anything but0/falseit suppresses every interactive frame and writes only the last one on unmount.ubuntu:24.04(util-linux 2.39.3) with the same spawn:CI=truegave 0 marker hits andCI=falsegave 1. The pty's 0×0 window size was ruled out: it renders fine unsized.So the smoke now pins
CI: "false"andCONTINUOUS_INTEGRATION: "false"in the child's env. It uses"false"rather than deleting the keys becauseis-in-citreats exactly that value as not-CI, whatever else the runner exports.Verification
ubuntu-latest: inubuntu:24.04withCI=true CONTINUOUS_INTEGRATION=true, 3/3 runssmoke:tui OK — rendered "MCP Servers" at ~270ms and was still running 2000ms later. The survival and raw-mode-error assertions from smoke:tui reports success for a TUI that crashed: it asserts first paint, not survival #2147 still apply.npm run local:gatepassed (EXIT=0), includingsmoke:tui OK.buildjob.Docs
Everything that described
smoke:tuias local-only or self-skipping is updated:docs/quality-gate.md(the canonical CI-vs-local split), thepre-push-gateskill,AGENTS.md,README.md,clients/launcher/README.md, and theworkflow-gateheader and test name. The local gate now has one local-only step (Firefox) where it had two.The publish job's comment is also corrected: it claimed
smoke:tuiself-skipped insidepack:verify, butpack:verifyonly runs--tui --help.No screenshots: this changes CI and smoke tooling, not the TUI itself.
🤖 Generated with Claude Code