INCIDENT: user installed via curl|bash and reported "kei did not auto-launch".
Root cause: under curl|bash, stdin is the pipe from curl. Every interactive
gate `[ -t 0 ]` returned FALSE, silently skipping FIVE places:
install/lib-i18n.sh language picker
install/lib-preflight.sh preflight checks
install/lib-hooks.sh hook activation prompt
install/lib-wizard.sh sleep wizard
install.sh:270 PATH wiring
bootstrap.sh kei-onboard primary CLI picker
bootstrap.sh launch prompt "запустить kei сейчас?"
Per rules/tty-interactivity-gate.md the rule is "gate on stdin, never stdout"
— and we did. But under curl|bash BOTH are non-tty. /dev/tty is the only
reliable signal that the user is interactive.
FIX: in bootstrap.sh, ONCE, before invoking install.sh:
if [ -r /dev/tty ] && [ -w /dev/tty ]; then
exec </dev/tty
fi
This redirects bootstrap.sh's OWN stdin to /dev/tty. Every child process
inherits it via fork — install.sh, lib-*.sh, kei-onboard.sh, kei-pick.sh,
kei-mcp-wire.sh — and their `[ -t 0 ]` gates now correctly report true.
Headless / CI / nohup (no /dev/tty) → skipped, gates stay false, no prompts.
Simplified the v0.47 onboarding + launch-prompt blocks: they no longer
need have_tty() or explicit </dev/tty redirects on read — the global
reattach handles it cascadally.
Smoke-tested 2 of 3 paths (curl|bash via `echo "" | bash script.sh` ✓;
plain bash needs real TTY which Claude Code sandbox doesn't provide;
headless needs setsid which is Linux-only). Logic verified.
Version bump v0.47 → v0.48 because behaviour materially changes for every
curl|bash user (5 prompts now fire that were silently skipped).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1. Splash (bin/kei) — благородная насыщенная жёлто-бронзовая drop-shadow
on the KEISEI ASCII art:
- New CS color: \033[1;38;5;130m (noble saturated bronze-gold).
- Shadow block printed FIRST (6 lines, offset +2 cols right).
- \e[7A cursor-up returns to start; blue art overwrites where they overlap.
- Visible shadow: right-edge 2-col tail on blue rows 2-6 + full
shadow row 6 standalone (offset down-right).
- TTY-gated: no terminal → no shadow, no colors (existing fallback).
2. bootstrap.sh — post-install launch prompt:
"Запустить kei сейчас? [Y/n]" at the very end, after all install +
onboarding + next-steps text. Default Y on Enter.
- Stdin-TTY gate only (rule: tty-interactivity-gate.md — `-t 1` would
falsely skip under curl|bash because the bootstrap log tees stdout).
- Reads from /dev/tty explicitly so curl|bash piped install still works.
- KEI_NO_AUTORUN=1 env opt-out for CI / scripts.
3. README — Platforms section: honest Windows status.
- macOS + Linux: fully supported.
- Windows: substrate is Bash-only; WSL2 recommended path; MCP-server
binary (.exe) ships in releases for MCP-only mode; native PowerShell
port NOT on roadmap (WSL gives 100% coverage with 0 code duplication).
4. v0.47 version bumps: plugin.json + bin/kei splash + README counts header.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirror of keigit 3aff0029. lib-hooks.sh apostrophe-in-jq closed the bash single-quote and broke every install (fixed). cortex-ui removed from profiles+menu; forgejo/zoekt source lib-launchd; portable kei-message id (BSD date fallback); non-TTY default minimal; install stamps .kei-profile; README hook count 54; web-install warns before discarding local edits in the managed clone.
Any Claude Code session can message any other (not just Agent-Teams teammates),
no tmux. Append-only jsonl bus + UserPromptSubmit hook pulling unread per turn.
kei-message.sh (send/inbox/list, address by cwd-basename or "all"),
mailbox-inject.sh (cursor dedup, first-turn baseline, no self-echo), bin/kei
`message` dispatch, lib-scaffold copies all scripts/*.sh, snippet wires the hook.
Bypass KEI_MAILBOX_BYPASS=1. Verified by 2-session simulation.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Splash was cyan; rebrand to blue/yellow: sky-blue (38;5;39) logo + dim-blue
separators, gold (38;5;220) brand line + field values. Version v0.16→v0.38.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>