Launch or reopen the Memoir UI through the plugin helper. Do not call memoir ui directly.
Run:
PLUGIN_ROOT="${PLUGIN_ROOT:-}"
if [ -z "$PLUGIN_ROOT" ]; then
PLUGIN_ROOT=$(find "${CODEX_HOME:-$HOME/.codex}/plugins" -path '*/.codex-plugin/plugin.json' -print 2>/dev/null \
| while IFS= read -r manifest; do
python3 - "$manifest" <<'PY'
import json, sys
from pathlib import Path
path = Path(sys.argv[1])
try:
data = json.loads(path.read_text())
except Exception:
raise SystemExit(0)
if data.get("name") == "memoir":
print(path.parent.parent)
PY
done | head -n 1)
fi
if [ -z "$PLUGIN_ROOT" ] || [ ! -x "$PLUGIN_ROOT/scripts/memoir-ui-ctl.sh" ]; then
echo "Memoir Codex plugin not found" >&2
exit 127
fi
STORE="${MEMOIR_STORE:-$(bash "$PLUGIN_ROOT/scripts/derive-store-path.sh")}"
bash "$PLUGIN_ROOT/scripts/memoir-ui-ctl.sh" start "$STORE"
The helper prints JSON with url, pid, store, and reused.
Reply in 4-6 short lines:
[mode=ui-launched|ui-reopened]
Memoir UI: <url>
Store: <store>
Mode: readonly, LLM off
PID: <pid>
Use [mode=ui-reopened] when reused is true; otherwise use [mode=ui-launched].
If the helper exits non-zero, show the failure briefly. Do not run open, xdg-open, or start; the helper already opens the browser tab.