diff --git a/.agentsroom/.gitignore b/.agentsroom/.gitignore new file mode 100644 index 0000000..133dfaf --- /dev/null +++ b/.agentsroom/.gitignore @@ -0,0 +1,7 @@ +# AgentsRoom: local cache and personal files (not committed) +*-cache.json +*-personal.json +agents-local.json +*.migrated.json +sessions/ +team-runs/ diff --git a/.agentsroom/project.json b/.agentsroom/project.json new file mode 100644 index 0000000..d575129 --- /dev/null +++ b/.agentsroom/project.json @@ -0,0 +1,4 @@ +{ + "projectId": "proj-1779762290633-3fulfr", + "backlogId": "proj-1779762290633-3fulfr" +} \ No newline at end of file diff --git a/.claude/CHANGELOG.md b/.claude/CHANGELOG.md index b36f614..19f97a3 100644 --- a/.claude/CHANGELOG.md +++ b/.claude/CHANGELOG.md @@ -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** diff --git a/.gitignore b/.gitignore index f94c26a..210e445 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/.env **/*.tgz **/.harness-profile +.mcp.json diff --git a/lib/mission-control.sh b/lib/mission-control.sh new file mode 100644 index 0000000..7b6f395 --- /dev/null +++ b/lib/mission-control.sh @@ -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" < 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 <