Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .agentsroom/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# AgentsRoom: local cache and personal files (not committed)
*-cache.json
*-personal.json
agents-local.json
*.migrated.json
sessions/
team-runs/
4 changes: 4 additions & 0 deletions .agentsroom/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"projectId": "proj-1779762290633-3fulfr",
"backlogId": "proj-1779762290633-3fulfr"
}
40 changes: 40 additions & 0 deletions .claude/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,46 @@ Each entry: **what** changed, **why** it was needed, **files** touched.

---

## 2026-05-25 — v0.7.0 — Mission Control orchestration dashboard

**What**
- `lib/mission-control.sh` — `install_mission_control` (git clone + Node 22 + pnpm install + pnpm build + `.env` with auto-gen `AUTH_PASS`/`API_KEY`) and `setup_mission_control_systemd` (opt-in unit on port `MC_PORT`).
- `profiles/openclaw/03-mission-control.sh` — wires `OPENCLAW_CONFIG_PATH` and `OPENCLAW_STATE_DIR` so the OpenClaw gateway adapter sees the local install.
- `profiles/hermes/03-mission-control.sh`, `profiles/paperclip/03-mission-control.sh` — generic API gateway path (no native adapter).
- `profiles/cli-bundle/10-mission-control.sh` — wires `MC_CLAUDE_HOME=~/.claude` for the Claude SDK adapter.
- `.env.example` in all 4 profiles: new `INSTALL_MISSION_CONTROL` block (toggle, dir, port, service mode, auth user/pass/key, allowed hosts, data dir, gateway-optional flag, OpenClaw paths).
- `tests/test_mission_control.bats` — 2 no-op tests (toggle false / toggle unset).

**Why**
- Mission Control is the natural pair to OpenClaw (first-class adapter) and a general dashboard for any agent talking over its REST API (101 endpoints). One install path, opt-in per profile.
- Auto-generated secrets remove the worst foot-gun (default-empty-password on a public VPS). Operator can override via `MC_AUTH_PASS` / `MC_API_KEY` if they need stable values.
- Node 22+ requirement bumped at install time (Mission Control needs Next.js 16 / React 19), separate from each profile's own Node version pin.

**Files**
- `lib/mission-control.sh` (new)
- `profiles/openclaw/03-mission-control.sh` (new)
- `profiles/hermes/03-mission-control.sh` (new)
- `profiles/paperclip/03-mission-control.sh` (new)
- `profiles/cli-bundle/10-mission-control.sh` (new)
- `profiles/{cli-bundle,openclaw,hermes,paperclip}/install.sh` (calls the script)
- `profiles/{cli-bundle,openclaw,hermes,paperclip}/.env.example` (`MC_*` block)
- `tests/test_mission_control.bats` (new — 2 tests)

---

## 2026-05-25 — v0.6.1 — OpenSpec spec-driven dev CLI

**What**
- `lib/plugins.sh` — new `install_openspec` (npm global of `@fission-ai/openspec`).
- `profiles/cli-bundle/09-plugins.sh` — `INSTALL_OPENSPEC` toggle. Telemetry off by default via `OPENSPEC_TELEMETRY=0` in `~/.bashrc`.
- `.env.example` — `INSTALL_OPENSPEC`, `OPENSPEC_VERSION`, `OPENSPEC_TELEMETRY` knobs.
- `tests/test_plugins.bats` — 2 new tests (errors when npm missing; invokes correct npm install command).

**Why**
- OpenSpec is the only spec-driven plugin in this set that runs as a standalone CLI (npm-global) rather than a Claude marketplace plugin. Once installed, every AI CLI can drive it via `/opsx:*` slash commands.

---

## 2026-05-25 — v0.6.0 — Official plugins (Linear/Slack/etc) + headless browser as base tool

**What**
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
**/.env
**/*.tgz
**/.harness-profile
.mcp.json
124 changes: 124 additions & 0 deletions lib/mission-control.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#!/usr/bin/env bash
# ============================================================
# lib/mission-control.sh — Mission Control dashboard install.
#
# Upstream: https://github.com/builderz-labs/mission-control
# Runtime: Node.js 22+, pnpm. SQLite (better-sqlite3). Default port 3000.
# Native gateway adapters: OpenClaw, CrewAI, LangGraph, AutoGen, Claude SDK.
# REST API: 101 endpoints documented at /api-docs.
# ============================================================

# Expected env (see each profile's .env.example):
# INSTALL_MISSION_CONTROL true/false
# MC_DIR clone destination (default $HOME/mission-control)
# MC_REPO git URL (default upstream)
# MC_BRANCH default main
# MC_PORT HTTP port (default 3000)
# MC_AS_SERVICE true → install systemd unit
# MC_AUTH_USER / MC_AUTH_PASS admin creds (PASS auto-gen if empty)
# MC_API_KEY headless API key (auto-gen if empty)
# MC_ALLOWED_HOSTS comma-separated host allowlist
# MC_DATA_DIR data dir (default $HOME/.mission-control)
# MC_CLAUDE_HOME default $HOME/.claude
# OPENCLAW_CONFIG_PATH default $HOME/.openclaw/openclaw.json
# OPENCLAW_STATE_DIR default $HOME/.openclaw

install_mission_control() {
if [[ "${INSTALL_MISSION_CONTROL:-false}" != "true" ]]; then
echo "==> Mission Control disabled (INSTALL_MISSION_CONTROL != true)."
return 0
fi

local repo="${MC_REPO:-https://github.com/builderz-labs/mission-control.git}"
local branch="${MC_BRANCH:-main}"
local dir="${MC_DIR:-$HOME/mission-control}"
local data_dir="${MC_DATA_DIR:-$HOME/.mission-control}"

# Node 22+ is required by Mission Control (Next.js 16 / React 19).
if command -v install_node >/dev/null 2>&1; then
install_node 22
fi
if command -v install_pnpm >/dev/null 2>&1; then
install_pnpm latest
fi

echo "==> Cloning Mission Control into $dir"
if [[ -d "$dir/.git" ]]; then
git -C "$dir" fetch --all --prune
git -C "$dir" checkout "$branch"
git -C "$dir" pull --ff-only
else
git clone --branch "$branch" "$repo" "$dir"
fi

mkdir -p "$data_dir"
chmod 700 "$data_dir"

# Auto-generate secrets if operator left them blank.
local auth_pass="${MC_AUTH_PASS:-$(openssl rand -base64 24 | tr -d '/+=' | head -c 24)}"
local api_key="${MC_API_KEY:-$(openssl rand -hex 32)}"

cat > "$dir/.env" <<EOF
# Auto-generated by lib/mission-control.sh — edit then rerun installer to refresh.
PORT=${MC_PORT:-3000}
AUTH_USER=${MC_AUTH_USER:-admin}
AUTH_PASS=${auth_pass}
API_KEY=${api_key}
MC_ALLOWED_HOSTS=${MC_ALLOWED_HOSTS:-}
NEXT_PUBLIC_GATEWAY_OPTIONAL=${MC_GATEWAY_OPTIONAL:-true}
MC_CLAUDE_HOME=${MC_CLAUDE_HOME:-$HOME/.claude}
MISSION_CONTROL_DATA_DIR=${data_dir}
OPENCLAW_CONFIG_PATH=${OPENCLAW_CONFIG_PATH:-$HOME/.openclaw/openclaw.json}
OPENCLAW_STATE_DIR=${OPENCLAW_STATE_DIR:-$HOME/.openclaw}
EOF
chmod 600 "$dir/.env"

echo "==> Installing JS deps + building"
(
cd "$dir" || exit 1
pnpm install --frozen-lockfile 2>/dev/null || pnpm install
pnpm build
)

echo
echo "==> Mission Control built at $dir"
echo " Port: ${MC_PORT:-3000}"
echo " Data dir: $data_dir"
echo " .env: $dir/.env (chmod 600 — contains AUTH_PASS + API_KEY)"
echo " First run: http://localhost:${MC_PORT:-3000}/setup"

if [[ "${MC_AS_SERVICE:-false}" == "true" ]]; then
setup_mission_control_systemd "$dir"
else
echo " Manual run: cd $dir && pnpm start"
fi
}

# Install + enable a systemd unit. Idempotent.
setup_mission_control_systemd() {
local dir="$1"
local pnpm_bin
pnpm_bin="$(command -v pnpm)"

echo "==> Installing systemd unit (mission-control.service)"
sudo tee /etc/systemd/system/mission-control.service >/dev/null <<EOF
[Unit]
Description=Mission Control (AI agent orchestration dashboard)
After=network.target

[Service]
Type=simple
User=$USER
WorkingDirectory=$dir
EnvironmentFile=$dir/.env
ExecStart=$pnpm_bin start
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mission-control.service
sudo systemctl --no-pager status mission-control.service || true
}
22 changes: 22 additions & 0 deletions profiles/cli-bundle/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,25 @@ SUPERPOWERS_OPENCODE=true
# When true and INSTALL_ANTIGRAVITY=true, 09-plugins.sh prints a manual hint
# only (option (b) — no blind attempt).
SUPERPOWERS_ANTIGRAVITY=false

# ============================================================
# Mission Control — self-hosted AI agent orchestration dashboard.
# Upstream: https://github.com/builderz-labs/mission-control
# Runtime: Node 22+, pnpm, SQLite. Default port 3000.
# ============================================================
INSTALL_MISSION_CONTROL=false
MC_DIR=/home/ubuntu/mission-control
MC_REPO=https://github.com/builderz-labs/mission-control.git
MC_BRANCH=main
MC_PORT=3000
MC_AS_SERVICE=false
MC_AUTH_USER=admin
# Leave MC_AUTH_PASS / MC_API_KEY empty to auto-generate on first install.
MC_AUTH_PASS=
MC_API_KEY=
MC_ALLOWED_HOSTS=
MC_DATA_DIR=/home/ubuntu/.mission-control
MC_CLAUDE_HOME=/home/ubuntu/.claude
MC_GATEWAY_OPTIONAL=true
OPENCLAW_CONFIG_PATH=/home/ubuntu/.openclaw/openclaw.json
OPENCLAW_STATE_DIR=/home/ubuntu/.openclaw
28 changes: 28 additions & 0 deletions profiles/cli-bundle/10-mission-control.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env bash
# ============================================================
# 10-mission-control.sh — Mission Control dashboard for cli-bundle.
# Wires MC_CLAUDE_HOME=~/.claude so the Claude SDK adapter sees the
# local session/config tree.
# ============================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"

if [[ ! -f "$ENV_FILE" ]]; then
echo "ERROR: $ENV_FILE not found."
exit 1
fi

# shellcheck disable=SC1090
set -a; source "$ENV_FILE"; set +a

# shellcheck source=../../lib/base-packages.sh
source "$REPO_ROOT/lib/base-packages.sh"
# shellcheck source=../../lib/mission-control.sh
source "$REPO_ROOT/lib/mission-control.sh"

export MC_CLAUDE_HOME="${MC_CLAUDE_HOME:-$HOME/.claude}"

install_mission_control
1 change: 1 addition & 0 deletions profiles/cli-bundle/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ bash "$SCRIPT_DIR/08-obsidian.sh" # vault skeleton first; MCP step below regis
bash "$SCRIPT_DIR/06-mcp.sh"
bash "$SCRIPT_DIR/07-dream.sh"
bash "$SCRIPT_DIR/09-plugins.sh" # plugin marketplaces (Claude headless; others manual hint)
bash "$SCRIPT_DIR/10-mission-control.sh" # opt-in orchestration dashboard

mutex_set "cli-bundle"

Expand Down
22 changes: 22 additions & 0 deletions profiles/hermes/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,25 @@ INSTALL_CLICKHOUSE_CLIENT=true

# Headless browser (chromium via apt; fallback to Playwright bundled Chromium)
INSTALL_HEADLESS_BROWSER=true

# ============================================================
# Mission Control — self-hosted AI agent orchestration dashboard.
# Upstream: https://github.com/builderz-labs/mission-control
# Runtime: Node 22+, pnpm, SQLite. Default port 3000.
# ============================================================
INSTALL_MISSION_CONTROL=false
MC_DIR=/home/ubuntu/mission-control
MC_REPO=https://github.com/builderz-labs/mission-control.git
MC_BRANCH=main
MC_PORT=3000
MC_AS_SERVICE=false
MC_AUTH_USER=admin
# Leave MC_AUTH_PASS / MC_API_KEY empty to auto-generate on first install.
MC_AUTH_PASS=
MC_API_KEY=
MC_ALLOWED_HOSTS=
MC_DATA_DIR=/home/ubuntu/.mission-control
MC_CLAUDE_HOME=/home/ubuntu/.claude
MC_GATEWAY_OPTIONAL=true
OPENCLAW_CONFIG_PATH=/home/ubuntu/.openclaw/openclaw.json
OPENCLAW_STATE_DIR=/home/ubuntu/.openclaw
26 changes: 26 additions & 0 deletions profiles/hermes/03-mission-control.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
# ============================================================
# 03-mission-control.sh — Mission Control dashboard for Hermes.
# Mission Control via generic API gateway (Hermes uses Python; no native adapter, REST API only).
# ============================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"

if [[ ! -f "$ENV_FILE" ]]; then
echo "ERROR: $ENV_FILE not found."
exit 1
fi

# shellcheck disable=SC1090
set -a; source "$ENV_FILE"; set +a

# shellcheck source=../../lib/base-packages.sh
source "$REPO_ROOT/lib/base-packages.sh"
# shellcheck source=../../lib/mission-control.sh
source "$REPO_ROOT/lib/mission-control.sh"


install_mission_control
1 change: 1 addition & 0 deletions profiles/hermes/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ load_env "$SCRIPT_DIR/.env"

bash "$SCRIPT_DIR/01-system.sh"
bash "$SCRIPT_DIR/02-hermes.sh"
bash "$SCRIPT_DIR/03-mission-control.sh"

mutex_set "hermes"
banner "Hermes Agent installed. See README.md for first-run instructions."
22 changes: 22 additions & 0 deletions profiles/openclaw/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,25 @@ INSTALL_CLICKHOUSE_CLIENT=true

# Headless browser (chromium via apt; fallback to Playwright bundled Chromium)
INSTALL_HEADLESS_BROWSER=true

# ============================================================
# Mission Control — self-hosted AI agent orchestration dashboard.
# Upstream: https://github.com/builderz-labs/mission-control
# Runtime: Node 22+, pnpm, SQLite. Default port 3000.
# ============================================================
INSTALL_MISSION_CONTROL=false
MC_DIR=/home/ubuntu/mission-control
MC_REPO=https://github.com/builderz-labs/mission-control.git
MC_BRANCH=main
MC_PORT=3000
MC_AS_SERVICE=false
MC_AUTH_USER=admin
# Leave MC_AUTH_PASS / MC_API_KEY empty to auto-generate on first install.
MC_AUTH_PASS=
MC_API_KEY=
MC_ALLOWED_HOSTS=
MC_DATA_DIR=/home/ubuntu/.mission-control
MC_CLAUDE_HOME=/home/ubuntu/.claude
MC_GATEWAY_OPTIONAL=true
OPENCLAW_CONFIG_PATH=/home/ubuntu/.openclaw/openclaw.json
OPENCLAW_STATE_DIR=/home/ubuntu/.openclaw
29 changes: 29 additions & 0 deletions profiles/openclaw/03-mission-control.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
# ============================================================
# 03-mission-control.sh — Mission Control dashboard for OpenClaw.
# OpenClaw is a first-class gateway adapter in Mission Control.
# ============================================================
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
ENV_FILE="$SCRIPT_DIR/.env"

if [[ ! -f "$ENV_FILE" ]]; then
echo "ERROR: $ENV_FILE not found."
exit 1
fi

# shellcheck disable=SC1090
set -a; source "$ENV_FILE"; set +a

# shellcheck source=../../lib/base-packages.sh
source "$REPO_ROOT/lib/base-packages.sh"
# shellcheck source=../../lib/mission-control.sh
source "$REPO_ROOT/lib/mission-control.sh"

# Default the OpenClaw paths so MC wires straight into the local install.
export OPENCLAW_CONFIG_PATH="${OPENCLAW_CONFIG_PATH:-$HOME/.openclaw/openclaw.json}"
export OPENCLAW_STATE_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"

install_mission_control
1 change: 1 addition & 0 deletions profiles/openclaw/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ load_env "$SCRIPT_DIR/.env"

bash "$SCRIPT_DIR/01-system.sh"
bash "$SCRIPT_DIR/02-openclaw.sh"
bash "$SCRIPT_DIR/03-mission-control.sh"

mutex_set "openclaw"
banner "OpenClaw installed. See README.md for first-run instructions."
Loading
Loading