curl|bash reads this script byte-by-byte from the pipe; a bare `exec < /dev/tty`
then made bash read the NEXT line (the bootstrap exec) from the keyboard →
infinite hang after "delegating", bootstrap never started. Fix: merge the
redirect into the bootstrap exec (one command). Verified piped-under-pty:
buggy=HANG, fixed=full install completes.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
E2E (curl install.keisei.app | bash, no controlling terminal) died at
`exec < /dev/tty` — "No such device or address". `[ -r /dev/tty ]` stat's
the path readable but the device can't be opened without a controlling
terminal (CI/cron/ssh non-interactive) — the documented `| bash -s -- --yes`
CI path. Now probes a real open via `{ : < /dev/tty; }` and reattaches only
on success; else proceeds non-interactively. Verified RC=0 end-to-end.
audit-2026-05-18 (соседняя сессия на gx10, 3 бага из 5 подтверждены):
#1 [HIGH] cortex profile сломан — kei-cortex depends on kei-router
path-dep'ом, а kei-router → kei-model. kei-model не было в
profile list, cargo build падал с «failed to read kei-model/
Cargo.toml». Добавил kei-model в cortex profile.
#3 [HIGH] cortex-ui отсутствует в репо — был в profile list, но
исходника нет ни в _primitives/_rust/, ни в _ts_packages/.
Удалил из profile.
#4 [MEDIUM] web-install.sh теряет /dev/tty — exec | tee + curl|bash
делают stdin pipe, wizard'у read нечего читать, onboarding падает
на первом prompt. Переподключаю stdin к /dev/tty перед exec
bootstrap.sh, если /dev/tty доступен.
#2 (linux-arm64 prebuild) — tag v0.38.0 не запушен на github, CI
release.yml не сработал. Требует RULE 0.1 triple-confirm.
#5 (non-TTY default = minimal) — уже корректно, install.sh:141
`PROFILE="${PROFILE:-minimal}"` + lib-menu.sh skip on non-TTY.
Thin wrapper (88 LOC) that lets a fresh machine install KeiSeiKit with
one line, no prior clone:
curl -fsSL https://install.keisei.app | bash
curl -fsSL https://install.keisei.app | bash -s -- --profile=dev --yes
## Why a third install entry point
Existing install path required `git clone` + `cd` + `./bootstrap.sh` —
three commands the user has to type, plus they must already have the
repo URL handy. For private repos with SSH auth this is real friction.
`web-install.sh` is meant to be served as a static file (Cloudflare
Pages / nginx) at install.keisei.app. It does ONE thing: prereq → clone
→ delegate to ./bootstrap.sh. Single source of truth — no duplicated
install logic.
## What it does
1. Splash + log to ~/.keisei-install.log
2. Hard prereq: git (the one thing bootstrap.sh cannot self-install)
3. SSH auth probe for git@github.com — clear error message if key missing
4. Clone/pull KeiSeiLab/KeiSeiKit-1.0 to $KEISEI_ROOT (default ~/.local/share/keisei)
5. git submodule update --init (pulls kei-registries)
6. exec ./bootstrap.sh "$@" — pass-through all flags
## Env overrides
- KEISEI_ROOT — install location
- KEISEI_REPO — git URL
- KEISEI_REF — branch/tag/sha
## Hosting
Push this file to install.keisei.app (Cloudflare Pages, S3+CF, nginx
static — anything that serves a single .sh over HTTPS).
## README updated
Quick start section now shows the curl one-liner as the recommended
path. Repo URL corrected from KeiSei84 → KeiSeiLab org.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>