Skip to content
Back to skills

Openloomi Setup

BSecurity

Run OpenLoomi one-time setup — auto-chains install → set Codex provider → launch → wait API → mint guest session token → ready in one call. Mirrors Claude's `/openloomi:setup`. Triggers: setup openloomi, install openloomi, install and run, 一键装好并跑起来, fix openloomi, finalize openloomi, install_required, awaiting_user_action, session_initialization_required, ai_provider_required, install_failed, api_not_ready, what now, what next, first time, what can i do.

  • 1,036 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added August 31, 2026
ai-agentsgoshellbashreactnodegitapi

Works with

  • cli
  • api

Security analysis

B75/100
  • criticalSends environment variables or credentials to an external URL

Pro shows the line behind each finding and how to fix it

Scanned August 31, 2026

npx -y skills add melandlabs/openloomi --skill openloomi-setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Openloomi Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Openloomi Setup
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/melandlabs-openloomi-setup/badge)](https://www.skillsdirectory.com/skills/melandlabs-openloomi-setup)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: openloomi-setup
description: "Run OpenLoomi one-time setup — auto-chains install → set Codex provider → launch → wait API → mint guest session token → ready in one call. Mirrors Claude's `/openloomi:setup`. Triggers: setup openloomi, install openloomi, install and run, 一键装好并跑起来, fix openloomi, finalize openloomi, install_required, awaiting_user_action, session_initialization_required, ai_provider_required, install_failed, api_not_ready, what now, what next, first time, what can i do."
allowed-tools: "Bash(node $SKILL_DIR/../../scripts/loomi-bridge.mjs setup *)"
---

# OpenLoomi Setup (end-to-end wizard)

The bridge now exposes a **single end-to-end wizard**: `setup --yes`. One
invocation walks the full Codex state machine:

```
install OpenLoomi.app from the official GitHub release
  → set OPENLOOMI_AGENT_PROVIDER=codex in the GUI launchd / environment.d
     (auto-restarts the desktop if it was already running)
  → launch the desktop app (`open -a <desktopMarker>` / platform equivalent)
  → wait for the local HTTP API to come up on http://localhost:3414
  → mint a guest bearer (one-tap sign-in) into ~/.openloomi/token
  → { ready: true }
```

Each transition is automatic. **Do not** ask the user to click anything in
the GUI. The bridge only surfaces a stop condition when the next step
truly requires human action — e.g. AI provider not configured, or the
native Codex runtime isn't reachable.

This wizard is the **Codex-side equivalent of Claude's `/openloomi:setup`**.
Both plugins speak the same bridge commands, the same flag names, and the
same stop-condition vocabulary so an install step that works on one works
on the other.

## Quick workflow

1. Make sure the **Codex sandbox is set to a mode that allows the wizard
   to actually run**. `setup` needs to write to `/Applications` (macOS) or
   `~/.config/environment.d/` (Linux), install/launch the desktop helper,
   and reach `http://localhost:3414`. `workspace-write` is the minimum
   that usually works; `danger-full-access` is the safe choice for the
   first run. If you do not have approval, ask the user before invoking
   the bridge.
2. If the bridge returns `setup: install_attempted` (only happens on the
   very first invocation when `--yes` is required), this is informational
   — `--yes` is already passed through and the wizard proceeds.
3. Run:

   ```bash
   node "$SKILL_DIR/../../scripts/loomi-bridge.mjs" setup --yes [--max-wait <ms>] [--api-timeout <ms>] [--install-timeout <ms>] [--launch-timeout <ms>] [--permission-timeout <ms>] [--bin-path <path>]
   ```
4. Read the JSON. The bridge writes an audit trail of what it did into
   `steps[]`. Surface that to the user so they can see which transitions
   fired (`status_check` → `install` → `runtime_env_write` →
   `quit_for_env_reload` (only when needed) → `launch` → `wait_api` →
   `guest_login`).
5. If `setup: ready` → done.
6. If `setup: awaiting_user_action` → the chain hit a step that genuinely
   needs the user (e.g. `nextAction: install_openloomi` because `--yes`
   wasn't passed, `nextAction: configure_ai_provider` because no AI
   provider is configured, or `nextAction: open_openloomi` because the
   desktop process won't auto-launch). Explain what the user needs to do
   and stop — do **not** auto-retry.
7. If `setup: api_not_ready` → show the bridge's `hints[]` and the
   pre-built `resumeCommand`. Re-running the wizard is always safe; the
   state machine is idempotent. Re-approval may be needed to leave the
   sandbox.

## Flags

All flags are also accepted by the bridge directly. Names + defaults are
identical to Claude's `/openloomi:setup` so the two plugins speak the same
dial language.

| Flag                   | Default | Meaning                                                                                                                                                          |
| ---------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--yes`                | off     | Pre-approve install. Without it, the bridge stops at `INSTALL_CONFIRMATION_REQUIRED` because Codex can't presume consent. With it, the chain runs end-to-end.    |
| `--max-wait`           | 120000  | Global cap (ms) across the wait stages. Defaults to 120 s to absorb the first-run install + TCC prompts.                                                        |
| `--api-timeout`        | 120000  | Per-stage budget for "waiting for local API". Independent of `--max-wait`.                                                                                       |
| `--install-timeout`    | 300000  | Per-stage budget for "installing OpenLoomi". Covers download + copy on a 50 Mbps link.                                                                           |
| `--launch-timeout`     | 10000   | Per-stage budget for `open -a <bundle>` (and platform equivalents). Almost never actually hit; included for parity with the Claude side.                       |
| `--permission-timeout` | 60000   | Extra grace wait after `--api-timeout` when the desktop process is up but the API never woke up — only fires when the bridge can confirm the process is alive.   |
| `--bin-path`           | _auto_  | Explicit path to the OpenLoomi desktop bundle (e.g. `/Applications/OpenLoomi.app`). Mirrors Claude's flag and overrides the usual discovery order.                |

## Live status

While the wizard is inside a long stage, the bridge writes a throttled
1 Hz line to **stderr** so the user can see progress:

```
  · installing OpenLoomi  (12s / max 5m) …
  · waiting for local API  (4s / max 2m) …
  · waiting on macOS permission prompt  (3s / max 1m) …
```

Stdout is reserved for the final JSON result — do not mix it.

## `api_not_ready` payload

When `--api-timeout` (+ `--permission-timeout` grace) elapses, the wizard
returns an **actionable** JSON payload you can use to drive chat-side
guidance. The original `setup: "api_not_ready"` shape is preserved for
backwards compatibility; new fields are added alongside it.

| Field               | Type     | Meaning                                                                                                              |
| ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------- |
| `ok`                | bool     | Always `false` for this stop condition.                                                                              |
| `setup`             | string   | Always `"api_not_ready"` here.                                                                                       |
| `code`              | string   | Stable machine code: `"API_NOT_READY"` or `"PERMISSION_PROMPT_LIKELY"` (when desktop process is up but API is not). |
| `stage`             | string   | Always `"wait_api"`. Reserved for future per-stage error codes.                                                      |
| `elapsedMs`         | number   | Wall-clock time since `setup --yes` started.                                                                         |
| `effectiveBudgetMs` | number   | Total wait budget actually granted (api + permission grace).                                                         |
| `canResume`         | bool     | Always `true`. Re-running the wizard is the supported "keep waiting" action.                                         |
| `resumeCommand`     | string   | A pre-built command the user can paste — already uses a sensible raised `--max-wait`.                                |
| `hints`             | string[] | 1–3 hints, safe to print verbatim. Includes the macOS TCC prompt hint on Darwin.                                     |
| `overCap`           | bool     | `true` if the elapsed time exceeded the global `--max-wait` cap (informational).                                     |
| `steps`             | Step[]   | The existing audit trail.                                                                                            |
| `wait`              | object   | The raw `waitForApi` payload (code, elapsedMs, attempted, lastError, optional graceWait).                             |
| `status`            | object   | The latest `setup-status` snapshot.                                                                                  |

## Stop conditions and what they mean

| `setup`                        | When it fires                                                                                                                                                                                                                                                                                                |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ready`                        | All transitions completed. The desktop app is running, the API is reachable, the guest session token is minted, **and** the native Codex provider is the active agent. Surface `mode`, `version`, and `executionProviderSource` from `status`. |
| `awaiting_user_action`         | A transition that needs the user ran without a programmatic path. Most commonly: `nextAction: install_openloomi` because `--yes` wasn't passed, `nextAction: configure_ai_provider` because no provider is configured, `nextAction: open_openloomi` because the desktop process didn't wake, or `nextAction: inspect_codex_runtime` because the native Codex agent is not active. Walk the user through what they need to do and stop. |
| `install_attempted`            | (Informational.) The first `setup` invocation in a fresh environment must install before it can confirm READY. `--yes` already authorised the install; treat this as a normal await. |
| `install_failed`               | The platform install script exited non-zero (or hit `--install-timeout`). Show `install.code` / `install.message`.                                                                                                                                                                                            |
| `runtime_env_failed`           | The `set-codex-runtime-env` step failed (rare; usually a TCC prompt on macOS, or a write-permission error on Linux). Follow `runtimeEnv.message`.                                                                                                                                                            |
| `quit_for_env_reload_failed`   | The desktop app was running, the env var was written, but `quitDesktopApp` couldn't bring it down (TCC prompt blocking the kill). The only stop condition that **truly** needs the user to Quit+Reopen by hand. Surface `quit.message`.                                                                       |
| `launch_failed`                | `open -a <desktopMarker>` (or platform equivalent) returned a non-zero exit. On macOS this almost never happens for a signed .app; if it does, fall back to manual launch instructions.                                                                                                                       |
| `api_not_ready`                | The desktop app was launched but the local HTTP API didn't respond within `--api-timeout`. The bridge only adds `--permission-timeout` grace when it can confirm the desktop process is alive. `code` distinguishes network/slow (`API_NOT_READY`) vs TCC prompt (`PERMISSION_PROMPT_LIKELY`); `hints[]` and `resumeCommand` are pre-built; `canResume: true` makes re-running the wizard the recommended action. |
| `guest_login_failed`           | API is up but the one-tap guest login was rejected by `/api/auth/guest`. Show `session.code` / `session.error`. The user can sign in via the GUI and re-run setup.                                                                                                                                         |
| `step_limit_reached`           | Hit the internal step ceiling without reaching READY (default 8 transitions). Almost certainly a state-machine bug; show `steps[]`.                                                                                                                                                                          |

The bridge's stdout output is authoritative. Never invoke the platform
install script (`setup.{macos,linux,windows}.*`) directly — only the
bridge may run it, and only after explicit user consent (which is what
`--yes` records).

## Codex provider wiring

Before any launch, the bridge writes `OPENLOOMI_AGENT_PROVIDER=codex` so
the freshly-started desktop server picks up the Codex runtime. On macOS
this is done via `launchctl setenv` plus a LaunchAgent so the variable
survives reboot; on Linux the bridge edits `~/.config/environment.d/`; on
Windows the user must set the variable manually. `codex-runtime-info`
always reports the current effective value.

## Post-`ready` walkthrough

When `setup: ready` fires, the wizard is done. Print the canonical
post-setup hand-off so the user knows what they just installed and what
to try next. The bridge JSON above is for machines; this section is the
human-facing surface and supersedes the earlier "do not improvise" rule
with a richer, scripted intro + tour. Print all four parts on the very
first `setup: ready` emission. On later re-runs you may abbreviate to
the audit table plus "where to go next" line, but never skip the intro.

### 1. One-paragraph intro

> OpenLoomi is your **open-source, local-first AI partner**, built to
> protect your attention. It runs as a desktop
> app on your Mac, connects to the tools you authorise (Gmail, Slack,
> GitHub, Google Calendar, Notion, Linear, etc. via Composio, plus
> native bots for Telegram / WhatsApp / iMessage / Feishu / DingTalk /
> QQ / WeChat), watches the signals that come in, and surfaces daily
> decisions as cards on the desktop pet (Loomi the fox). You tap
> **Approve** and the action runs through the same connector — the
> result is written back into Memory so the next judgement is sharper.
> Nothing leaves your machine unless you opt in to a Connector.

### 2. Where things live (orientation)

| Surface | Where |
| --- | --- |
| Desktop app | `/Applications/OpenLoomi.app` |
| Local HTTP API | `http://localhost:3414` (fallback `3515`) |
| Guest bearer token | `~/.openloomi/token` (base64-encoded JWT) |
| Codex runtime env | `OPENLOOMI_AGENT_PROVIDER=codex` (LaunchAgent, survives reboot) |
| Memory files | `~/.openloomi/data/memory/{people,projects,notes,strategy,chats,channels}/` |
| Knowledge Base | `GET /api/rag/documents` |
| Audit log | `GET /api/audit/...` |
| Pet widget | Watcher polls `~/.openloomi/loop/decisions.json` every 2s |

### 3. The five-step first tour

After `setup: ready`, suggest this exact sequence. Each step is a
single shell call plus a one-line description of what the user will
see. Skip steps the user has already done — but always emit step 1
(health check) so the user knows what "still ready" looks like.

| # | What | Command | What you'll see |
| --- | --- | --- | --- |
| 1 | **Health check** | `node "$PLUGIN/scripts/loomi-bridge.mjs" setup-status` | Same audit table you just got. Confirms Codex runtime is still the active default agent. |
| 2 | **Pet reacts** | `node "$PLUGIN/scripts/loomi-bridge.mjs" pet happy` | Loomi the fox flips to the happy sprite. Try `thinking`, `working`, `juggling` to see the rest of the 9-state set. |
| 3 | **Connect a tool** | Native: `node "$PLUGIN/skills/openloomi-connectors/scripts/openloomi-connectors.cjs" connect telegram` *or* OAuth: `composio link gmail` | A QR scan or browser OAuth opens; once you approve, the account shows in `list-accounts`. |
| 4 | **Run one Loop tick** | `TOKEN=$(cat ~/.openloomi/token \| base64 -d); curl -X POST http://localhost:3414/api/loop/tick -H "Authorization: Bearer $TOKEN"` | Loop pulls signals, classifies them, and enqueues decisions. Then `GET /api/loop/decisions?status=pending` to see the cards. Approve with `POST /api/loop/action/schedule`. |
| 5 | **Seed Memory** | `node "$PLUGIN/skills/openloomi-memory/scripts/openloomi-memory.cjs" add-memory "About me: ..." --file=tour/about-me.md` | A tour-owned `.md` shows up in `~/.openloomi/data/memory/tour/`. Future Loop ticks have grounding context without overwriting user memory. |

Optional extensions after step 4 (skip if the user is new):

- **Custom Loop channel** — register your own signal source
  (`PUT /api/loop/channels` with `toolkit` + `toolSlug`).
- **Classifier rule** — deterministic overrides for known signal
  patterns (`PUT /api/loop/classifier-rules`).
- **Custom decision type** — your own `DecisionType` icon + label
  (`PUT /api/loop/types`).

If the user asks for a hands-on walkthrough rather than just a
recommendation, hand off to the `openloomi-tour` skill — it runs the
same five steps with live probes and stops between each one for the
user to react.

### 4. Quick reference card

End with this closed list so the user doesn't have to memorise URLs.

| Want to… | Run |
| --- | --- |
| See health | `setup-status` |
| Flip the pet | `pet <state>` |
| Re-confirm Codex runtime | `codex-runtime-info` |
| List connectors | `openloomi-connectors list-accounts` |
| Search memory | `openloomi-memory search-all "<query>"` |
| Run a Loop tick | `POST /api/loop/tick` |
| See pending decisions | `GET /api/loop/decisions?status=pending` |
| Approve a decision | `POST /api/loop/action/schedule {decision_id, action:"run"}` |
| Archive old data | `archive` |

### 5. Hand-off

Finish with: "Run `openloomi-tour` from this Codex session for a
guided walkthrough, or pick a number above and I'll run that step for
you."

## After `api_not_ready`

When the wizard times out waiting for the API, the recommended chat-side
flow is:

1. Show the bridge's `hints[]` verbatim. Each is safe-to-print.
2. If `canResume: true` (always the case for `api_not_ready`), suggest
   the user simply re-runs the wizard. The state machine is idempotent —
   already-completed steps (e.g. install, env write) will be skipped
   immediately, and the wizard will land back inside `wait_api`.
3. If the user wants to _raise_ the budget once, ship the pre-built
   `resumeCommand` (e.g. `node <plugin>/scripts/loomi-bridge.mjs setup
   --yes --max-wait 180000`) rather than asking them to invent the flag.

## Follow-up commands

| Follow-up         | Bridge command                                          | When to suggest                                                                |
| ----------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------ |
| Status snapshot   | `setup-status`                                          | User asks "is everything wired up?" — read-only snapshot.                      |
| Pet state         | `pet happy` / `pet normal` / etc.                       | User asks about the Pet widget or wants to flip its state manually.            |
| Code runtime env  | `codex-runtime-info`                                    | User asks whether the desktop app is wired to Codex.                           |
| Install-only      | `install-openloomi --confirm`                           | User asks to install without launching (rare; mostly CI / VDI).                |

## Sandbox notes

The `setup` wizard **must be run outside the Codex sandbox** (or with
`danger-full-access`) — it needs to write to system application
directories (`/Applications` on macOS, `~/.config/environment.d/` on
Linux), launch a signed GUI helper, and reach the local HTTP API at
`http://localhost:3414`. None of those survive `read-only` or default
`workspace-write` mode in a fresh environment. If you are still inside a
sandbox when the user asks for setup, request approval and re-run
outside the sandbox before invoking the bridge. The bridge surfaces a
sandbox-y reason in `awaiting_user_action`, `launch_failed`, or
`api_not_ready`; the `hints[]` payload calls out the next concrete step
(approve the request and retry).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.