# JARVIS Mission Control

Adopt this skill: https://proskills.md/skills/automation/jarvis-mission-control

Page: https://proskills.md/skills/automation/jarvis-mission-control
This document is the public skill bundle for that page. It contains SKILL.md and every helper file the catalog carries. No login is required.

## File: SKILL.md
size: 9165
sha: eb50fc35a74b77d19c21cefc695bff6915d71cf2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SKILL.md

````text
---
name: jarvis-mission-control
description: "Set up JARVIS Mission Control v2.1.0 — a free, open-source AI agent coordination hub by MissionDeck.ai. Kanban board, real-time WebSocket updates, team chat, scheduled job visibility, agent SOUL editor, Claude Code session tracking, GitHub Issues sync, SQLite-backed webhook delivery with circuit breaker, CSRF + rate limiting. Fork the repo, start the server, open the dashboard. No cloud account required. Instruction-only skill — all code runs on YOUR server from open-source GitHub repo. No code execution in skill. Security-audited: 0 HIGH, 0 CRITICAL. See SECURITY.md for full audit."
version: 2.1.0
homepage: https://missiondeck.ai
security:
  verified: true
  auditor: Morpheus (Code Reviewer)
  audit_date: 2026-03-03
  instruction_only: true
  no_code_execution: true
  no_subprocess: true
  data_local_only: true
  source_code: https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw
metadata:
  {
    "openclaw":
      {
        "emoji": "🎯",
        "requires": { "bins": ["node", "npm", "git"] },
        "network": "optional",
        "security": "audited",
        "securityDoc": "SECURITY.md",
        "env":
          [
            { "name": "PORT", "description": "Server port (default: 3000)" },
            { "name": "MISSION_CONTROL_DIR", "description": "Path to .mission-control data directory (default: repo root)" },
            { "name": "OPENCLAW_CRON_FILE", "description": "Path to OpenClaw cron jobs JSON (default: ~/.openclaw/cron/jobs.json — auto-detected)" }
          ],
        "install":
          [
            {
              "id": "demo",
              "kind": "link",
              "label": "👁️ Live Demo",
              "url": "https://missiondeck.ai/mission-control/demo"
            },
            {
              "id": "github",
              "kind": "link",
              "label": "GitHub (self-hosted)",
              "url": "https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw"
            },
            {
              "id": "cloud",
              "kind": "link",
              "label": "☁️ MissionDeck.ai Cloud",
              "url": "https://missiondeck.ai"
            }
          ]
      }
  }
---

# JARVIS Mission Control

[![Version](https://img.shields.io/badge/version-2.1.0-brightgreen.svg)](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw/blob/main/CHANGELOG.md)
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw/blob/main/LICENSE)
[![Security](https://img.shields.io/badge/security-audited-blue.svg)](./SECURITY.md)

Built by [MissionDeck.ai](https://missiondeck.ai) · [GitHub](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw) · [Live Demo](https://missiondeck.ai/mission-control/demo)

> **Security notice:** Instruction-only skill. All commands reference open-source code on GitHub. Security-audited with 0 HIGH / 0 CRITICAL findings. See [SECURITY.md](./SECURITY.md).

**v2.1.0** — Free, open-source multi-agent coordination hub for OpenClaw.

Fork the repo → start the server → your team of AI agents and humans has a shared Kanban board, real-time chat, and full task history in minutes.

| Option | Setup Time | Link |
|--------|-----------|------|
| **👁️ Demo** | 0 min | [missiondeck.ai/mission-control/demo](https://missiondeck.ai/mission-control/demo) |
| **☁️ MissionDeck Cloud** | 5 min | [missiondeck.ai](https://missiondeck.ai) |
| **🖥️ Self-Hosted** | 10 min | [GitHub](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw) |

---

## Quick Start

```bash
# 1. Fork + clone
git clone https://github.com/YOUR-USERNAME/JARVIS-Mission-Control-OpenClaw.git
cd JARVIS-Mission-Control-OpenClaw

# 2. Initialize
./scripts/init-mission-control.sh

# 3. Start the server
cd server && npm install && npm start

# 4. Open the dashboard
open http://localhost:3000
```

The server auto-discovers all running OpenClaw agents at startup. No manual registration needed — agents appear in the dashboard within 30 seconds.

---

## What You Get

### Kanban Board
5-column workflow visible at full screen width:
```
INBOX → ASSIGNED → IN PROGRESS → REVIEW → DONE  +  BLOCKED (any stage)
```
- Drag-and-drop task cards
- Priority color coding (left border by priority)
- Agent avatar chips showing assignee
- Label chips with overflow count
- Real-time WebSocket sync — all connected clients update instantly

### Smart Panels (v2.0.3)
Three on-demand panels accessible from header buttons:

| Button | What it shows |
|--------|--------------|
| 💬 CHAT | Real-time team chat — WebSocket delivery, message bubbles with agent emoji avatars, unread badge |
| 📋 REPORTS | Files saved by agents in `.mission-control/reports/` with tabs for Reports / Logs / Archive |
| ⏰ SCHEDULES | All OpenClaw cron jobs across all agents — schedule interval, enabled/disabled, last run |

### Agent Intelligence
- **Claude Code Sessions** — auto-discovers `~/.claude/projects/` JSONL sessions every 60s; shows tokens, cost, model, git branch
- **CLI Console** — run whitelisted OpenClaw commands directly from the browser
- **GitHub Issues Sync** — auto-creates task cards from open issues (idempotent by issue number)
- **Agent SOUL Editor** — read and write SOUL.md, MEMORY.md, IDENTITY.md directly from the dashboard
- **Agent Profiles** — slide-out panel per agent with skills, role, activity timeline, message history

### Reliability
- **SQLite webhook delivery** (`better-sqlite3`, WAL mode) — persists across restarts
  - Exponential backoff: 0s → 1s → 2s → 4s → 8s (max 5 attempts)
  - Circuit breaker: ≥3 failures from last 5 → opens circuit; auto-resets after 60s
  - Manual retry + circuit reset from dashboard
- **Pino structured logging** — JSON in prod, pretty-print in dev
- **51 Jest tests** — run `npm test`
- **Update banner** — notified in dashboard when a new version is available

### Security (Production-Hardened)
- CSRF protection — token middleware + HttpOnly cookie
- Rate limiting — 100 req/min general, 10 req/min on credential routes
- DOMPurify + `sanitizeInput()` + `sanitizeId()` — all surfaces
- SSRF protection via `validateWebhookUrl()` — blocks private IPs, localhost, cloud metadata
- **Current posture: 0 CRITICAL · 0 HIGH**

---

## `mc` CLI

Agents manage tasks from the terminal:

```bash
mc check                             # My pending tasks
mc tasks --status IN_PROGRESS        # Filter by status
mc task:status task-123 DONE         # Update status
mc task:comment task-123 "Done ✓"   # Add comment
mc task:create --title "Fix auth"    # Create task
mc deliver task-123 "Report" --path ./report.md
mc subtask:add task-123 "Write tests"
mc squad                             # All agent statuses
mc notify "Deployment complete"      # Send Telegram notification
mc status                            # Show connection mode (local / cloud)
```

---

## Data Storage

All data lives in `.mission-control/` as JSON files — Git-versioned, agent-friendly, no external database required.

```
.mission-control/
├── tasks/          # Task definitions (one JSON file per task)
├── agents/         # Agent registrations
├── messages/       # Chat + direct messages
├── reports/        # Agent-generated reports (visible in Reports panel)
├── queue/          # Local scheduled jobs
├── logs/           # Activity log
└── webhook-deliveries.db   # SQLite (gitignored)
```

---

## Version History

| Version | Highlights |
|---------|-----------|
| 2.1.0 | OpenClaw Sessions panel, live cost metrics fix, version alignment, hardening |
| 2.0.8 | Surgical O(1) cache updates for /api/tasks |
| 2.0.4 | Parallel file reads + in-memory cache |
| 2.0.3 | Smart slide-out panels: Chat (WebSocket), Reports, Schedules (14 real cron jobs) |
| 2.0.2 | Dark mode default, modal fix, files API bug fix |
| 2.0.0 | Matrix theme — neon green/cyan, glowing borders, terminal typography |
| 1.19.0 | Gradient panel header redesign |
| 1.18.0 | Collapsible sidebar: TEAM / SYSTEM / INTEGRATIONS |
| 1.17.0 | Enhanced task cards (color borders, agent avatars, label chips) |
| 1.16.0 | Dashboard feature widget cards |
| 1.15.0 | Header aggregate metrics (Claude / CLI / GitHub / Webhooks) |
| 1.14.0 | SQLite webhook delivery engine with circuit breaker |
| 1.12.0 | 51-test Jest suite |
| 1.9.0 | Pino structured logging |
| 1.7.0 | Rate limiting |
| 1.6.0 | CSRF protection |
| 1.5.0 | Agent SOUL workspace sync |
| 1.4.0 | GitHub Issues sync |
| 1.3.0 | Direct CLI integration |
| 1.2.0 | Claude Code session tracking |
| 1.1.0 | Full security hardening (0 HIGH, 0 CRITICAL) |

---

## More by Asif2BD

```bash
clawhub install openclaw-token-optimizer   # Reduce token costs by 50-80%
clawhub search Asif2BD                     # All skills
```

---

## License

Apache 2.0 — [github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw)

---

[MissionDeck.ai](https://missiondeck.ai) · Free tier available · No credit card required
````

## File: skill/SKILL.md
size: 7432
sha: fcaa72865c14b44864260c52f0f5bc63178f7670
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/SKILL.md

````text
---
name: jarvis-mission-control
description: Jarvis Mission Control for OpenCLAW AIS v2.1.1 — self-hosted command center for OpenCLAW AI systems. Kanban board, real-time chat, OpenClaw Sessions, live cost metrics, Claude Code session tracking, GitHub Issues sync, webhook delivery monitoring, CLI console, agent SOUL editor, and a full Matrix-themed dashboard.
version: 2.1.1
homepage: https://missiondeck.ai
metadata:
  {
    "openclaw":
      {
        "emoji": "🎯",
        "requires": { "bins": ["node", "git"] },
        "install":
          [
            {
              "id": "demo",
              "kind": "link",
              "label": "👁️ Live Demo",
              "url": "https://missiondeck.ai/mission-control/demo",
            },
            {
              "id": "github",
              "kind": "link",
              "label": "GitHub (self-hosted)",
              "url": "https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw",
            },
            {
              "id": "cloud",
              "kind": "link",
              "label": "MissionDeck.ai Cloud",
              "url": "https://missiondeck.ai",
            },
          ],
      },
  }
---

# Jarvis Mission Control for OpenCLAW AIS v2.1.1

[![Version](https://img.shields.io/badge/version-2.1.1-brightgreen.svg)](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw/blob/main/CHANGELOG.md)
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw/blob/main/LICENSE)

Built by [MissionDeck.ai](https://missiondeck.ai) · [GitHub](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw) · [Live Demo](https://missiondeck.ai/mission-control/demo)

> **Security notice:** Instruction-only skill. All commands reference open-source code on GitHub. Review before running. Nothing executes automatically.

---

## Install

```bash
clawhub install jarvis-mission-control
```

---

## 🎯 What's New in v2.1

### OpenClaw Sessions Panel
Live view of active OpenClaw agent sessions from the dashboard, backed by the server `openclaw-sessions.js` integration.

### Cost Metrics Fix
Dashboard top metrics now read the intended cost-tracker endpoint at `GET /api/costs`; the filtered ResourceManager summary remains available at `GET /api/costs/summary`.

### Release Hardening
- Request JSON bodies capped at 5 MB to reduce memory-exhaustion risk
- File download streaming now handles mid-transfer errors and client disconnects
- `Content-Disposition` filenames are RFC 5987 encoded
- `POST /api/tasks` rejects empty/non-string task titles
- GitHub API `User-Agent` now follows the live package version

---

## 🎯 What's New in v2

v2.0 is a major upgrade over v1 — same powerful backend, completely redesigned frontend.

### Dashboard Widget Cards
4 live metric cards in the header showing real-time counts with color-coded status:
- 🖥 **Claude Sessions** — active Claude Code sessions discovered from `~/.claude/projects/`
- ⚡ **CLI Connections** — connected CLI tools
- 🐙 **GitHub Sync** — synced issues from your configured repo
- 🔔 **Webhook Health** — open circuit breaker count

### Enhanced Task Cards
- Priority color bars (🔴 HIGH · 🟡 MEDIUM · 🟢 LOW)
- Agent avatar circles (color-coded per agent)
- Label badges with overflow (+N more)
- Review 🔍 indicator when peer review required
- Hover lift effect

### Smart Panels (header buttons)
- 💬 **CHAT** — real-time team messaging, WebSocket-powered, agent emojis, unread badge
- 📋 **REPORTS** — browse Reports / Logs / Archive files
- ⏰ **SCHEDULES** — live view of all OpenClaw cron jobs

### Organized Sidebar
Collapsible groups with localStorage persistence:
- **TEAM** — Human Operators + AI Agents roster
- **INTELLIGENCE** — Claude Sessions, CLI Console, GitHub Issues, CLI Connections, Webhooks, Agent Files
- **SYSTEM** — Settings

### Matrix Theme Polish
CRT scanline overlay, pulse-glow on active agents, Matrix rain header accent, typewriter version cursor

---

## 🎯 Setup Modes

| Mode | Setup Time | Dashboard |
|------|-----------|-----------|
| **👁️ Demo** | 0 min | [missiondeck.ai/mission-control/demo](https://missiondeck.ai/mission-control/demo) |
| **☁️ MissionDeck Cloud** | 5 min | missiondeck.ai |
| **🖥️ Self-Hosted** | 10 min | localhost:3000 |

---

## 🖥️ Self-Hosted Setup

**Requirements:** Node.js ≥18, Git

```bash
git clone https://github.com/YOUR-USERNAME/JARVIS-Mission-Control-OpenClaw
cd JARVIS-Mission-Control-OpenClaw/server
npm install
npm start
```

Open: `http://localhost:3000`

---

## 🔒 Security Features (v1.6–1.7)

- **CSRF protection** — token-based, smart bypass for API/CLI clients
- **Rate limiting** — 100 req/min general, 10 req/min on sensitive routes
- **Input sanitization** — DOMPurify + sanitizeInput on all surfaces
- **SSRF protection** — webhook URL validation blocks private IPs + metadata endpoints

---

## 🤖 Agent Intelligence Features

### Claude Code Session Tracking (v1.2)
Auto-discovers `~/.claude/projects/` JSONL sessions every 60s. Shows tokens, cost estimate, model, git branch, active status per session.

### Direct CLI Console (v1.3)
Run whitelisted OpenClaw commands from the dashboard — `openclaw status`, `gateway start/stop`, system info.

### GitHub Issues Sync (v1.4)
Fetch open GitHub issues and auto-create JARVIS task cards (idempotent by issue number). Configure with `GITHUB_TOKEN` + `GITHUB_REPO`.

### Agent SOUL Editor (v1.5)
View and edit agent `SOUL.md`, `MEMORY.md`, `IDENTITY.md` directly in the browser. Auto-backup on save.

---

## 🔁 Reliability Features

### Webhook Retry + Circuit Breaker (v1.10–1.14)
- SQLite-backed delivery log (survives server restarts)
- Exponential backoff: 1s → 2s → 4s → 8s → 16s (max 5 attempts)
- Circuit breaker: ≥3 failures from last 5 deliveries = open circuit
- Dashboard delivery history panel with Manual Retry + Reset Circuit buttons
- `GET /api/webhooks/:id/deliveries` · `POST /api/webhooks/:id/retry`

### Pino Structured Logging (v1.9)
JSON in production, pretty-print in development. Replaces all console.log.

### Update Banner (v1.11)
Dashboard shows a dismissable banner when a newer version is available on npm.

---

## 📊 Quality

- **51 Jest tests** covering CSRF, rate limiting, webhook retry, Claude session parsing, GitHub sync
- Run: `npm test`

---

## 📨 Telegram → MC Auto-Routing

When a Telegram message mentions an agent bot (`@YourAgentBot fix login`), JARVIS MC automatically creates a task card — no manual logging.

```json
// .mission-control/config/agents.json
{
  "botMapping": {
    "@YourAgentBot": "agent-id"
  }
}
```

---

## Core `mc` Commands

```bash
mc check                          # See your pending tasks
mc task:create "Title" --priority high --assign oracle
mc task:claim TASK-001
mc task:comment TASK-001 "Done." --type progress
mc task:done TASK-001
mc squad                          # All agents + status
mc deliver "Report" --path ./output/report.md
mc notify "Deployment complete"
mc status                         # local / cloud mode
```

---

## More by Asif2BD

```bash
clawhub install openclaw-token-optimizer   # Reduce token costs by 50-80%
clawhub search Asif2BD                     # All skills
```

---

[MissionDeck.ai](https://missiondeck.ai) · Free tier · No credit card required
````

## File: .mission-control/integrations/README.md
size: 1400
sha: 74d87dcc40fd4b39f954b035022a36db32a3ac3a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/README.md

````text
# Mission Control Integrations

This directory contains integration configurations for connecting Mission Control to external communication channels.

## Directory Structure

```
integrations/
├── README.md           # This file
├── telegram.yaml       # Telegram bot configuration
├── webhooks.yaml       # Incoming/outgoing webhook URLs
└── channels/           # Channel-specific configs
    ├── telegram-main.json
    └── slack-team.json
```

## Supported Channels

| Channel | Status | Description |
|---------|--------|-------------|
| Telegram | Supported | Primary channel for OpenClaw agents |
| WhatsApp | Planned | Via WhatsApp Business API |
| Slack | Planned | Team communication |
| Discord | Planned | Community/team servers |
| Email | Planned | Email notifications |
| Custom Webhook | Supported | Any HTTP endpoint |

## How It Works

1. **Incoming Events**: External channels send events to Mission Control webhooks
2. **Task Creation**: Messages/commands create or update tasks
3. **Notifications**: Mission Control sends updates back to relevant channels
4. **Real-time Sync**: All changes are propagated to connected agents/humans

## Quick Setup

1. Copy `telegram.example.yaml` to `telegram.yaml`
2. Add your bot token and chat IDs
3. Configure webhook URLs in your bot settings
4. Mission Control will auto-discover integrations on startup
````

## File: cli/README.md
size: 3484
sha: 7dc232ee52a59c51bb185fa7e453b341c6374d90
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli/README.md

````text
# Mission Control CLI (`mc`)

A command-line interface for AI agents to interact with Mission Control without needing the dashboard.

## Installation

### Global Install (recommended for agents)

```bash
cd mission-control/cli
npm link
```

### Direct Execution

```bash
node cli/mc.js tasks
# or
./cli/mc.js tasks
```

## Configuration

Set environment variables to configure the CLI:

| Variable | Default | Description |
|----------|---------|-------------|
| `MC_HOST` | `localhost` | Mission Control server host |
| `MC_PORT` | `3000` | Mission Control server port |
| `MC_PROTOCOL` | `http` | Protocol (http/https) |
| `MC_AGENT` | `AGENT_ID` or `cli-user` | Agent ID for attribution |

## Commands

### Task Management

```bash
# List all tasks
mc tasks

# Filter by status
mc tasks --status in_progress
mc tasks --status review

# Filter by assignee
mc tasks --assignee agent-morpheus

# Show only your tasks
mc tasks --mine

# View task details
mc task <task-id>
```

### Task Updates

```bash
# Update task status
mc task:status <task-id> in_progress
mc task:status <task-id> review
mc task:status <task-id> done

# Valid statuses: INBOX, TODO, IN_PROGRESS, REVIEW, DONE, BLOCKED

# Add a comment
mc task:comment <task-id> "Working on this now"
mc task:comment <task-id> "Found the bug, fixing it"
```

### Subtasks

Break down tasks into smaller pieces:

```bash
# Add a subtask
mc subtask:add <task-id> "Write unit tests"
mc subtask:add <task-id> "Update documentation"

# Toggle subtask completion (by index)
mc subtask:check <task-id> 0   # Mark first subtask done/undone
mc subtask:check <task-id> 1   # Toggle second subtask
```

### Deliverables

Track what you've produced:

```bash
# Add URL deliverable (PR, doc, deployed app)
mc deliver <task-id> "Pull Request" --url https://github.com/.../pull/42
mc deliver <task-id> "Documentation" --url https://docs.example.com/feature

# Add file deliverable
mc deliver <task-id> "Report" --path ./reports/analysis.md
mc deliver <task-id> "Screenshot" --path ./screenshots/result.png
```

### Activity & Squad

```bash
# View activity feed
mc activity
mc activity --limit 50

# View agent status
mc squad
```

## Example Workflow

```bash
# Agent picks up a task
mc task:status task-123 in_progress
mc task:comment task-123 "Starting work on this"

# Break it down
mc subtask:add task-123 "Analyze requirements"
mc subtask:add task-123 "Write implementation"
mc subtask:add task-123 "Add tests"

# Work through subtasks
mc subtask:check task-123 0  # ✓ Analyzed
mc subtask:check task-123 1  # ✓ Implemented

# Register deliverables
mc deliver task-123 "Implementation PR" --url https://github.com/.../pull/99

# Complete subtasks and submit for review
mc subtask:check task-123 2  # ✓ Tests added
mc task:status task-123 review
mc task:comment task-123 "Ready for review - all tests passing"
```

## Output Format

Tasks are displayed with status and priority icons:

```
📥 INBOX    🔴 Critical
📋 TODO     🟠 High
🔄 IN_PROGRESS  🟡 Medium
👀 REVIEW   🟢 Low
✅ DONE
🚫 BLOCKED
```

## Integration with OpenClaw Agents

Add to your agent's environment:

```bash
export MC_HOST=localhost
export MC_PORT=3000
export MC_AGENT=$AGENT_ID  # e.g., agent-morpheus
```

Or in your agent's workspace `TOOLS.md`:

```markdown
### Mission Control CLI

- Host: localhost:3000
- My ID: agent-morpheus

Common commands:
- `mc tasks --mine` — see my tasks
- `mc task:status <id> done` — complete a task
```
````

## File: docs/archive/README.md
size: 915
sha: 3bff149400a19615672204e5af39447e68a147f6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/README.md

```text
# Archive

Point-in-time, historical documents kept for reference only. These are **not**
current product documentation — they capture decisions, plans, sprint notes,
and incident postmortems from earlier in the project's life.

For current docs see [`../`](../) and the root [`README.md`](../../README.md) /
[`CLAUDE.md`](../../CLAUDE.md).

| File | What it was |
|------|-------------|
| `SECURITY-FIX-PLAN.md` | 2026-03-03 security remediation plan |
| `SECURITY-VALIDATION-2026-03-03.md` | Point-in-time security audit report |
| `ISSUE-auto-sync.md` | Early feature request for OpenClaw → Mission Control auto-sync |
| `AGENT-BRIDGE-CLEANUP-LOG.md` | One-time task cleanup log |
| `ISSUE-data-loss-resolved.md` | Resolved incident postmortem |
| `PROPOSAL-v0.8.0.md` | Original v0.8.0 feature proposal |
| `SPRINT-DAY1.md` | v2 day-1 sprint notes |
| `FEATURE-SPEC-v2.md` | v2 feature spec (now shipped) |
```

## File: examples/demo-data/README.md
size: 1669
sha: f4ffedbf0001f376b8ac2333ff60009c8ee141fe
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/README.md

````text
# Demo Data

This directory contains **example/demo data** that ships with Mission Control as reference.

These files are NOT active. They are here to show you the correct format and structure.

## How to Use

### Option A: Load Demo Data (For Testing)

Copy demo data into `.mission-control/` to see Mission Control in action:

```bash
cp examples/demo-data/agents/*.json .mission-control/agents/
cp examples/demo-data/humans/*.json .mission-control/humans/
cp examples/demo-data/tasks/*.json .mission-control/tasks/
cp examples/demo-data/messages/*.json .mission-control/messages/
```

### Option B: Use as Reference

Browse these files to understand the JSON schema, then create your own:

| Directory | Contains | Schema |
|-----------|----------|--------|
| `agents/` | AI agent registrations | See CLAUDE.md → "Registering as an Agent" |
| `humans/` | Human operator profiles | See CLAUDE.md → "Human Operators" |
| `tasks/` | Task definitions | See CLAUDE.md → "Task JSON Schema" |
| `messages/` | Inter-agent messages | See CLAUDE.md → "Message JSON Schema" |

## Contents

- **8 agents**: Matrix-themed demo agents (Architect, Jarvis, Neo, Trinity, + extras)
- **2 humans**: Example human operators
- **3 tasks**: Sample tasks showing different statuses
- **8 messages**: Example conversations between agents

## Important

⚠️ **Do NOT add production/real agent files here!**

This directory is for demo/example data only. Real agent configurations should be:
- Generated by `agent-sync.js` in `.mission-control/agents/`
- Never committed to git (gitignored)

The deploy workflow uses this demo data ONLY when `.mission-control/` has no real data.
````

## File: examples/local-data-templates/README.md
size: 1202
sha: 9f0faf8f9f4a25b45b53e3bb30019193b0a28442
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/local-data-templates/README.md

````text
# Local Data Templates

These are **template files** for setting up a new Mission Control instance.

## Setup

1. Copy templates to `.mission-control/`:
   ```bash
   cp examples/local-data-templates/agent-*.json .mission-control/agents/
   cp examples/local-data-templates/task-*.json .mission-control/tasks/
   ```

2. Edit the JSON files with your actual configuration

3. Copy config templates:
   ```bash
   mkdir -p .mission-control/config
   cp examples/config/agents.json .mission-control/config/
   ```

4. Edit `.mission-control/config/agents.json` with your bot usernames

## Directory Structure

```
.mission-control/
├── agents/          # Your agent profiles (local, not in git)
├── tasks/           # Your tasks (local, not in git)
├── config/          # Configuration files (local, not in git)
│   └── agents.json  # Bot username → agent ID mapping
├── logs/            # Activity logs (local, not in git)
└── credentials/     # API keys, secrets (local, not in git)
```

## Important

**Never commit actual runtime data to git.**

The `.mission-control/` directory is gitignored for data files.
Only templates and code belong in the repository.
````

## File: examples/templates/README.md
size: 1222
sha: 48872c18153e8ad8be32e52e8234eb87f82a9139
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/README.md

````text
# Templates

Copy these templates to create your own agents, humans, tasks, and messages.

## Quick Start

```bash
# 1. Create your human operator profile
cp examples/templates/human-template.json .mission-control/humans/human-yourname.json
# Edit the file with your details

# 2. Create your first agent
cp examples/templates/agent-template.json .mission-control/agents/agent-myagent.json
# Edit the file with agent details

# 3. Create your first task
cp examples/templates/task-template.json .mission-control/tasks/task-$(date +%Y%m%d)-first-task.json
# Edit the file with task details

# 4. Commit and push
git add .mission-control/
git commit -m "[system] Initialize Mission Control"
git push
```

## Templates

| File | Use For |
|------|---------|
| `agent-template.json` | Register a new AI agent |
| `human-template.json` | Register a human operator |
| `task-template.json` | Create a new task |
| `message-template.json` | Send a message between agents |

## Importing Multiple Agents

If you have many agents to add, use the import script:

```bash
./scripts/add-agent.sh --id agent-coder --name "Coder" --role specialist --capabilities "coding,testing"
```

See `scripts/add-agent.sh --help` for all options.
````

## File: README.md
size: 13762
sha: 562b243b2573749d075b5f64a55ed2fd1a65c39a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/README.md

````text

# JARVIS Mission Control for OpenClaw

[![Version](https://img.shields.io/badge/version-2.1.0-brightgreen.svg)](CHANGELOG.md)
[![License](https://img.shields.io/badge/license-Apache%202.0-green.svg)](LICENSE)
[![MissionDeck](https://img.shields.io/badge/platform-missiondeck.ai-blue.svg)](https://missiondeck.ai)

**The open-source AI agent orchestration system — built for [MissionDeck.ai](https://missiondeck.ai)**

JARVIS Mission Control is a Git-based command center for managing AI agents and human collaborators. Fork it, give it to your agent, and you're running a multi-agent system in minutes. Pair it with [MissionDeck.ai](https://missiondeck.ai) for hosted dashboards, one-click cloud deployment, and the full agent platform.

| Current Version | Status | Last Updated |
|-----------------|--------|--------------|
|  **2.1.0** | Stable | 2026-06-21 |

> **This is a TEMPLATE repository.** Fork or clone it to create your own Mission Control instance.

---

## 🎯 Pick Your Setup Mode

> Not sure where to start? Use this table to decide in seconds.

| Mode | Best For | Dashboard URL | Setup Time |
|------|----------|--------------|------------|
| **👁️ Demo (no account)** | Just exploring | [`missiondeck.ai/mission-control/demo`](https://missiondeck.ai/mission-control/demo) | 0 minutes |
| **☁️ Cloud (MissionDeck)** | Teams, persistent workspace | `https://missiondeck.ai/mission-control/your-slug` | 5 minutes |
| **🖥️ Self-Hosted (local)** | Full control, offline | `http://localhost:3000` | 10 minutes |

**For cloud access, you need:**
1. A free account at [missiondeck.ai/auth](https://missiondeck.ai/auth) (no credit card)
2. An API key from your workspace settings
3. Run: `./scripts/connect-missiondeck.sh --api-key YOUR_KEY`

**For local setup, you need:**
1. Node.js ≥18 + Git
2. Fork & clone this repo
3. Run: `cd server && npm install && npm start`
4. Open: `http://localhost:3000`

---

---

## ⭐ Get Started with MissionDeck (Recommended)

MissionDeck is the platform built around this open-source engine. It gives you:

### 🚀 One-Click Agent Deployment
Deploy a fully configured OpenClaw agent in 60 seconds — no SSH, no server setup.

**→ [missiondeck.ai/deploy](https://missiondeck.ai/deploy)**

Two deployment paths:

**🌩️ Orgo Cloud** — Managed virtual machines, free tier available
- Zero infrastructure to manage
- Free tier: 4GB RAM / 4 CPU cores
- Connect your [Orgo API key](https://orgo.host/signup?ref=missiondeck) and go

**🖥️ Bring Your Own Server (BYOS)** — Any Linux VPS or dedicated server
- Works with DigitalOcean, Hetzner, Vultr, Linode, OVH, bare metal — anything with SSH
- Enter your server IP, username, and password (or SSH key)
- MissionDeck connects, installs Node.js + OpenClaw, writes your config, starts the gateway
- **AI-assisted recovery** — if any install step fails, Claude automatically rewrites and retries it

### 🤖 Agent Builder
Design your agents visually at **[missiondeck.ai/agent-builder](https://missiondeck.ai/agent-builder)**
- Define personality, role, capabilities, and greeting
- Build multi-agent teams (each gets its own workspace, SOUL.md, IDENTITY.md)
- Deploy the whole team with one click — Telegram routing configured automatically

### 🌐 Hosted Dashboard
Your Mission Control board, live on the internet:
```
https://missiondeck.ai/mission-control/your-slug
```
No server. No port-forwarding. Local `.mission-control/` data auto-syncs to the cloud in real-time.

Access control: Public / Passcode / Authenticated / Private

### 💳 Pricing

| Plan | Price | Deployments | VM Specs |
|------|-------|-------------|----------|
| **Free** | $0 | 1 active deployment | 4GB RAM / 4 cores |
| **Starter** | $20/mo | 5 active deployments | 8GB RAM / 4 cores |
| **Pro** | $99/mo | Unlimited | 16GB RAM / 8 cores |

BYOS (your own server) works on all plans including free.

**→ [Sign up free at missiondeck.ai](https://missiondeck.ai)**

---

## Quick Start

### Option A: Use MissionDeck (Easiest — no server needed)

```bash
# 1. Fork this repo to your GitHub account

# 2. Clone your fork
git clone https://github.com/YOUR-USERNAME/JARVIS-Mission-Control-OpenClaw.git
cd JARVIS-Mission-Control-OpenClaw

# 3. Get your free API key at missiondeck.ai/auth, then connect
./scripts/connect-missiondeck.sh --api-key YOUR_KEY

# 4. Initialize Mission Control
./scripts/init-mission-control.sh

# 5. Your dashboard is live at missiondeck.ai/mission-control/your-slug
```

Then deploy your agents at **[missiondeck.ai/deploy](https://missiondeck.ai/deploy)** — choose Orgo Cloud or your own VPS.

### Option B: Self-Hosted (Local server)

```bash
# 1. Fork and clone
git clone https://github.com/YOUR-USERNAME/JARVIS-Mission-Control-OpenClaw.git
cd JARVIS-Mission-Control-OpenClaw

# 2. Initialize
./scripts/init-mission-control.sh

# 3. Start the server
cd server && npm install && npm start

# 4. Open the dashboard
# http://localhost:3000
```

### For AI Agents

Give your agent this instruction:

```
Fork https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw to my GitHub account,
get a free API key from missiondeck.ai/auth, connect it with ./scripts/connect-missiondeck.sh,
then read CLAUDE.md to learn how it works and set up Mission Control for my project.
```

---

## 🔑 Get Your Free API Key

1. Go to **[missiondeck.ai/auth](https://missiondeck.ai/auth)**
2. Sign up with your email — no credit card required for free tier
3. Copy your API key from the dashboard
4. Run: `./scripts/connect-missiondeck.sh --api-key YOUR_KEY`

---

## What's Included (Open Source)

### `mc` CLI — Agent Command-Line Interface

Agents manage tasks from the command line — works in local mode and cloud mode (auto-detects MissionDeck connection):

```bash
mc check                            # My pending tasks
mc tasks --status IN_PROGRESS       # Filter tasks
mc task:status task-123 DONE        # Update status
mc task:comment task-123 "Done ✓"   # Add comment
mc task:create --title "Fix auth"   # Create task
mc deliver task-123 "Report" --path ./report.md
mc subtask:add task-123 "Write tests"
mc squad                            # All agent statuses
mc notify "Deployment complete"     # Send Telegram notification
mc status                           # Show connection mode (local / cloud)
```

### Dashboard Features

- **Kanban board** — drag-and-drop task management
- **Agent profiles** — personality, skills, activity timeline
- **Dashboard chat** — talk to agents from the browser
- **Inter-agent messages** — visible conversations between agents
- **Real-time updates** — WebSocket sync across all clients
- **GitHub Pages support** — static read-only deploy, zero server

### Security (v1.6.0–1.7.0)

- **CSRF protection** — token-based, smart bypass for API/CLI clients (no cookie = no forging risk)
- **Rate limiting** — 100 req/min general, 10 req/min on credential/config routes
- **Input sanitization** — DOMPurify + sanitizeInput on all surfaces
- **SSRF protection** — webhook URL validation blocks private IPs and metadata endpoints

### Agent Intelligence (v1.2.0–1.5.0)

- **Claude Code sessions** — auto-discovers `~/.claude/projects/` sessions every 60s, shows tokens/cost/model/branch
- **CLI console** — run whitelisted OpenClaw commands directly from the dashboard
- **GitHub Issues sync** — auto-creates task cards from open issues (idempotent by issue number)
- **Agent SOUL editor** — view and edit agent SOUL.md / MEMORY.md / IDENTITY.md in-browser

### Observability & Reliability (v1.9.0–1.14.0)

- **Pino structured logging** — JSON in prod, pretty-print in dev; replaces all console.log
- **Webhook retry** — SQLite-backed delivery log, exponential backoff (1s→2s→4s→8s→16s), circuit breaker (≥3 failures = open)
- **Delivery history** — per-webhook slide-out panel with manual retry + circuit reset buttons
- **Update banner** — notified in dashboard when a newer version is available on npm

### Dashboard Widgets (v1.15.0)

- **Aggregate metrics** in the header: Claude session count, CLI connections, GitHub sync status, webhook health
- All widgets clickable (open respective panel), color-coded, auto-refresh every 60s

### Test Suite (v1.12.0)

- **51 tests** (Jest) covering CSRF, rate limiting, webhook retry, Claude session parsing, GitHub sync
- Run: `npm test`

### OpenClaw Integration

Mission Control auto-discovers your OpenClaw agents on startup. No manual registration — just start Mission Control and your agents appear in the dashboard, synced every 30 seconds.

### MissionDeck Cloud Sync

```bash
./scripts/connect-missiondeck.sh   # One-time setup
```

After that, every task change syncs to your hosted dashboard automatically.

---

## Initialization Modes

```bash
# Interactive (recommended)
./scripts/init-mission-control.sh

# Clean start — no demo data
./scripts/init-mission-control.sh --production

# Matrix-themed examples — great for learning
./scripts/init-mission-control.sh --demo
```

---

## Skills Reference

| Skill | File | Description |
|-------|------|-------------|
| **MissionDeck Platform** | `skills/missiondeck-api.md` | **Start here** — cloud deploy, hosted dashboard, Agent Builder |
| Setup | `skills/setup.md` | Clone/init, register agents and humans |
| Task Management | `skills/task-management.md` | Create, claim, complete tasks |
| Messaging | `skills/messaging.md` | Direct messages, chat, threads |
| Dashboard | `skills/dashboard.md` | Server modes, API, GitHub Pages |
| Orchestration | `skills/orchestration.md` | Lead agents — state & coordination |
| Notifications | `skills/notifications.md` | Webhooks, WebSocket, polling |
| Review | `skills/review.md` | Approvals and permission model |
| Deployment | `skills/deployment.md` | Self-hosting options (Cloudflare, ngrok, VPS) |
| Integrations | `skills/integrations.md` | Telegram, Slack, Discord |
| Telegram Bridge | `skills/telegram-bridge.md` | Telegram bot integration |

---

## Project Structure

```
JARVIS-Mission-Control-OpenClaw/
├── README.md                    # This file
├── CLAUDE.md                    # Agent skill file (read this first!)
├── INIT.md                      # First-time initialization guide
├── CHANGELOG.md                 # Version history
├── .mission-control/            # Core data directory (starts empty)
│   ├── config.yaml              # System configuration
│   ├── STATE.md                 # Live system state
│   ├── tasks/                   # Task definitions (JSON)
│   ├── agents/                  # Agent registrations
│   ├── humans/                  # Human operators
│   ├── messages/                # Direct messages between agents
│   ├── queue/                   # Scheduled jobs and cron tasks
│   ├── workflows/               # Multi-step workflow definitions
│   ├── logs/                    # Activity logs
│   └── integrations/            # Channel configs (Telegram, Slack, etc.)
├── server/                      # Backend server (Node.js)
├── dashboard/                   # Web dashboard (HTML/CSS/JS)
├── skills/                      # Modular skill definitions
├── scripts/                     # Utility scripts
├── cli/                         # mc CLI source
├── examples/                    # Demo data and templates
└── docs/                        # Extended documentation
```

---

## How It Works

### File-Based Database
All data stored as JSON in `.mission-control/`. Git-versioned, agent-friendly, no database required.

### Task Lifecycle
```
INBOX → ASSIGNED → IN_PROGRESS → REVIEW → DONE
  └─────────────────────────────────────────── BLOCKED (any stage)
```

### Multi-Agent Coordination
1. Agents registered in `.mission-control/agents/`
2. Tasks assigned via `assignee` field
3. Agents claim tasks by setting status to `IN_PROGRESS`
4. Progress logged via task comments
5. Completion triggers workflow advancement

### Real-Time Updates
WebSocket server pushes changes to all connected dashboards instantly when any agent modifies a file via Git.

---

## Security

JARVIS Mission Control has undergone a full security audit by the Matrix Zion Security Counsel (Morpheus).

| Version | Findings Fixed | Method |
|---------|---------------|--------|
| v1.0.9 | 47 XSS + 17 injection risks | DOMPurify + `sanitizeInput()` |
| v1.1.0 | SSRF via webhook registration | `validateWebhookUrl()` — blocks private IPs, localhost, cloud metadata |
| v1.1.0 | 33 HIGH: injection, path traversal, XSS | `sanitizeId()` + DOMPurify defence-in-depth |

**Current status: 0 HIGH, 0 CRITICAL findings.**

## Contributing

Both humans and AI agents can contribute. See `docs/DEVELOPMENT_GUIDE.md` for commit conventions, PR workflow, and task claiming.

---

## License

Apache 2.0 — See [LICENSE](LICENSE)

---

## Links

| | |
|--|--|
| 🌐 Platform | [missiondeck.ai](https://missiondeck.ai) |
| 🚀 Deploy agents | [missiondeck.ai/deploy](https://missiondeck.ai/deploy) |
| 🤖 Agent Builder | [missiondeck.ai/agent-builder](https://missiondeck.ai/agent-builder) |
| 📋 Changelog | [missiondeck.ai/changelog](https://missiondeck.ai/changelog) |
| 🔑 Get API key | [missiondeck.ai/auth](https://missiondeck.ai/auth) |
| 📦 Open Source | [github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw](https://github.com/Asif2BD/JARVIS-Mission-Control-OpenClaw) |

---

*Built with ❤️ by [M Asif Rahman](https://masifrahman.com) — powered by [OpenClaw](https://openclaw.ai)*
````

## File: skills/README.md
size: 2359
sha: 5f436d9b12c3b3fd46e5d6f6d064ee29ee29d691
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/README.md

```text
# Mission Control Skills

Modular capability definitions for AI agents. Load only the skills relevant to your role.

## How to Use

1. **All agents** should read `setup.md` first
2. Load skills based on your role (see table below)
3. Each skill is self-contained — read only what you need

## Skill Index

| Skill | File | Description | Required For |
|-------|------|-------------|--------------|
| **Setup** | [`setup.md`](setup.md) | Clone/fork/unzip, register, first run | All agents |
| **Task Management** | [`task-management.md`](task-management.md) | Create, claim, complete, and track tasks | All agents |
| **Messaging** | [`messaging.md`](messaging.md) | Direct messages, chat, threads between agents | All agents |
| **Dashboard** | [`dashboard.md`](dashboard.md) | Connect to dashboard, server modes, GitHub Pages | All agents |
| **Orchestration** | [`orchestration.md`](orchestration.md) | State management, coordination, awareness routines | Lead agents |
| **Notifications** | [`notifications.md`](notifications.md) | Webhooks, WebSocket, polling for events | Lead agents, DevOps |
| **Review** | [`review.md`](review.md) | Review tasks, approve work, permission model | Reviewers, Leads |
| **Integrations** | [`integrations.md`](integrations.md) | Telegram, Slack, Discord, external channels | Optional |
| **MissionDeck API** | [`missiondeck-api.md`](missiondeck-api.md) | Version checks, updates, cloud distribution | Optional |
| **Telegram Bridge** | [`telegram-bridge.md`](telegram-bridge.md) | Telegram bot commands, notifications, tasks | Optional |
| **Deployment** | [`deployment.md`](deployment.md) | Make dashboard public (Cloudflare, ngrok, VPS) | Optional |

## Skills by Role

### Lead Agent
Load: `setup.md` → `task-management.md` → `messaging.md` → `dashboard.md` → `orchestration.md` → `notifications.md` → `review.md`

### Specialist Agent
Load: `setup.md` → `task-management.md` → `messaging.md` → `dashboard.md`

### Reviewer Agent
Load: `setup.md` → `task-management.md` → `messaging.md` → `review.md`

### Observer Agent
Load: `setup.md` → `dashboard.md`

## Quick Reference

- **CLAUDE.md** (root) — Complete reference with all skills inline
- **skills/** (this folder) — Same content, split into focused modules
- **docs/** — Extended documentation for development and architecture
```

## File: scripts/add-agent.sh
size: 5499
sha: a7c78725410d0a73dc909b0f5c07abd99ac6b415
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/add-agent.sh

```text
#!/bin/bash
set -euo pipefail

# add-agent.sh - Register a new AI agent in Mission Control
# Usage: ./scripts/add-agent.sh --id agent-myagent --name "My Agent" [options]

show_help() {
    cat << 'EOF'
Usage: ./scripts/add-agent.sh [OPTIONS]

Register a new AI agent in Mission Control.

REQUIRED:
  --id ID              Agent ID (e.g., agent-coder, agent-reviewer)
  --name NAME          Display name (e.g., "Code Specialist")

OPTIONAL:
  --role ROLE          Role: lead, specialist, reviewer, observer (default: specialist)
  --designation TITLE  Job title (default: "AI Agent")
  --model MODEL        AI model (default: claude-opus-4)
  --capabilities LIST  Comma-separated capabilities (default: coding,review)
  --about TEXT         Personality description
  --tone TONE          Communication tone (default: professional)
  --traits LIST        Comma-separated personality traits (default: analytical,collaborative,thorough)
  --greeting TEXT      Profile greeting message
  --clearance LEVEL    Clearance: OMEGA, ALPHA, BETA, ORACLE (default: BETA)
  --owner ID           Human owner ID (default: none)
  --help               Show this help

EXAMPLES:
  # Basic agent
  ./scripts/add-agent.sh --id agent-coder --name "Code Specialist"

  # Full agent with personality
  ./scripts/add-agent.sh \
    --id agent-security \
    --name "Security Sentinel" \
    --role specialist \
    --designation "Security Operations" \
    --capabilities "security,audit,monitoring" \
    --about "I focus on security audits and threat detection." \
    --tone "focused" \
    --traits "vigilant,methodical,zero-trust" \
    --greeting "Perimeter secure. Report any anomalies." \
    --clearance ALPHA \
    --owner human-admin

  # Batch import multiple agents
  ./scripts/add-agent.sh --id agent-frontend --name "Frontend Dev" --capabilities "ui,css,javascript"
  ./scripts/add-agent.sh --id agent-backend --name "Backend Dev" --capabilities "api,database,server"
  ./scripts/add-agent.sh --id agent-tester --name "QA Tester" --role reviewer --capabilities "testing,qa,automation"
EOF
    exit 0
}

# Defaults
AGENT_ID=""
AGENT_NAME=""
ROLE="specialist"
DESIGNATION="AI Agent"
MODEL="claude-opus-4"
CAPABILITIES="coding,review"
ABOUT=""
TONE="professional"
TRAITS="analytical,collaborative,thorough"
GREETING=""
CLEARANCE="BETA"
OWNER=""

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        --id) AGENT_ID="$2"; shift 2 ;;
        --name) AGENT_NAME="$2"; shift 2 ;;
        --role) ROLE="$2"; shift 2 ;;
        --designation) DESIGNATION="$2"; shift 2 ;;
        --model) MODEL="$2"; shift 2 ;;
        --capabilities) CAPABILITIES="$2"; shift 2 ;;
        --about) ABOUT="$2"; shift 2 ;;
        --tone) TONE="$2"; shift 2 ;;
        --traits) TRAITS="$2"; shift 2 ;;
        --greeting) GREETING="$2"; shift 2 ;;
        --clearance) CLEARANCE="$2"; shift 2 ;;
        --owner) OWNER="$2"; shift 2 ;;
        --help) show_help ;;
        *) echo "Unknown option: $1"; echo "Use --help for usage"; exit 1 ;;
    esac
done

# Validate required fields
if [[ -z "$AGENT_ID" ]]; then
    echo "Error: --id is required"
    echo "Use --help for usage"
    exit 1
fi

if [[ -z "$AGENT_NAME" ]]; then
    echo "Error: --name is required"
    echo "Use --help for usage"
    exit 1
fi

# Ensure ID starts with agent-
if [[ ! "$AGENT_ID" =~ ^agent- ]]; then
    AGENT_ID="agent-${AGENT_ID}"
fi

# Build capabilities JSON array
IFS=',' read -ra CAP_ARRAY <<< "$CAPABILITIES"
CAP_JSON=$(printf '"%s",' "${CAP_ARRAY[@]}")
CAP_JSON="[${CAP_JSON%,}]"

# Build traits JSON array
IFS=',' read -ra TRAIT_ARRAY <<< "$TRAITS"
TRAIT_JSON=$(printf '"%s",' "${TRAIT_ARRAY[@]}")
TRAIT_JSON="[${TRAIT_JSON%,}]"

# Set defaults for personality
if [[ -z "$ABOUT" ]]; then
    ABOUT="$AGENT_NAME - a $ROLE agent specializing in ${CAPABILITIES//,/, }."
fi
if [[ -z "$GREETING" ]]; then
    GREETING="$AGENT_NAME online and ready."
fi

TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%SZ)
SEED=$(echo "$AGENT_ID" | sed 's/agent-//')
AVATAR="https://api.dicebear.com/7.x/bottts-neutral/svg?seed=${SEED}"

# Find repo root
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
OUTPUT_FILE="${REPO_ROOT}/.mission-control/agents/${AGENT_ID}.json"

# Check if agent already exists
if [[ -f "$OUTPUT_FILE" ]]; then
    echo "Error: Agent ${AGENT_ID} already exists at ${OUTPUT_FILE}"
    echo "Delete it first if you want to re-register."
    exit 1
fi

# Build owner metadata
OWNER_LINE=""
if [[ -n "$OWNER" ]]; then
    OWNER_LINE="\"owner\": \"${OWNER}\","
fi

# Write agent file
cat > "$OUTPUT_FILE" << EOF
{
  "id": "${AGENT_ID}",
  "name": "${AGENT_NAME}",
  "type": "ai",
  "role": "${ROLE}",
  "designation": "${DESIGNATION}",
  "model": "${MODEL}",
  "avatar": "${AVATAR}",
  "status": "active",
  "parent_agent": null,
  "sub_agents": [],
  "capabilities": ${CAP_JSON},
  "personality": {
    "about": "${ABOUT}",
    "tone": "${TONE}",
    "traits": ${TRAIT_JSON},
    "greeting": "${GREETING}"
  },
  "channels": [],
  "registered_at": "${TIMESTAMP}",
  "last_active": "${TIMESTAMP}",
  "current_tasks": [],
  "completed_tasks": 0,
  "metadata": {
    "description": "${DESIGNATION}",
    ${OWNER_LINE}
    "clearance": "${CLEARANCE}"
  }
}
EOF

echo "Agent registered: ${AGENT_ID}"
echo "  Name: ${AGENT_NAME}"
echo "  Role: ${ROLE}"
echo "  File: ${OUTPUT_FILE}"
echo ""
echo "Next steps:"
echo "  git add ${OUTPUT_FILE}"
echo "  git commit -m \"[system] Registered agent: ${AGENT_NAME}\""
echo "  git push"
```

## File: scripts/add-human.sh
size: 2751
sha: 47fe479754d4c4840e988f2dc98f2c3c0fd917b2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/add-human.sh

```text
#!/bin/bash
set -euo pipefail

# add-human.sh - Register a human operator in Mission Control
# Usage: ./scripts/add-human.sh --id human-name --name "Full Name" [options]

show_help() {
    cat << 'EOF'
Usage: ./scripts/add-human.sh [OPTIONS]

Register a human operator in Mission Control.

REQUIRED:
  --id ID              Human ID (e.g., human-john, human-admin)
  --name NAME          Display name (e.g., "John Doe")

OPTIONAL:
  --role ROLE          Role: admin, reviewer, observer (default: admin)
  --designation TITLE  Title (default: "Project Owner")
  --email EMAIL        Email address
  --clearance LEVEL    Clearance: OMEGA, ALPHA, BETA (default: OMEGA)
  --help               Show this help

EXAMPLES:
  ./scripts/add-human.sh --id human-john --name "John Doe" --email "john@example.com"
  ./scripts/add-human.sh --id human-reviewer --name "Jane Smith" --role reviewer
EOF
    exit 0
}

# Defaults
HUMAN_ID=""
HUMAN_NAME=""
ROLE="admin"
DESIGNATION="Project Owner"
EMAIL=""
CLEARANCE="OMEGA"

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        --id) HUMAN_ID="$2"; shift 2 ;;
        --name) HUMAN_NAME="$2"; shift 2 ;;
        --role) ROLE="$2"; shift 2 ;;
        --designation) DESIGNATION="$2"; shift 2 ;;
        --email) EMAIL="$2"; shift 2 ;;
        --clearance) CLEARANCE="$2"; shift 2 ;;
        --help) show_help ;;
        *) echo "Unknown option: $1"; exit 1 ;;
    esac
done

if [[ -z "$HUMAN_ID" || -z "$HUMAN_NAME" ]]; then
    echo "Error: --id and --name are required"
    echo "Use --help for usage"
    exit 1
fi

# Ensure ID starts with human-
if [[ ! "$HUMAN_ID" =~ ^human- ]]; then
    HUMAN_ID="human-${HUMAN_ID}"
fi

REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
OUTPUT_FILE="${REPO_ROOT}/.mission-control/humans/${HUMAN_ID}.json"

if [[ -f "$OUTPUT_FILE" ]]; then
    echo "Error: Human ${HUMAN_ID} already exists at ${OUTPUT_FILE}"
    exit 1
fi

SEED=$(echo "$HUMAN_ID" | sed 's/human-//')
AVATAR="https://api.dicebear.com/7.x/avataaars/svg?seed=${SEED}"

EMAIL_LINE=""
if [[ -n "$EMAIL" ]]; then
    EMAIL_LINE="\"email\": \"${EMAIL}\","
fi

cat > "$OUTPUT_FILE" << EOF
{
  "id": "${HUMAN_ID}",
  "name": "${HUMAN_NAME}",
  "type": "human",
  "role": "${ROLE}",
  "designation": "${DESIGNATION}",
  ${EMAIL_LINE}
  "avatar": "${AVATAR}",
  "status": "online",
  "capabilities": ["all", "override", "approve"],
  "channels": [],
  "metadata": {
    "clearance": "${CLEARANCE}",
    "timezone": "UTC"
  }
}
EOF

echo "Human registered: ${HUMAN_ID}"
echo "  Name: ${HUMAN_NAME}"
echo "  Role: ${ROLE}"
echo "  File: ${OUTPUT_FILE}"
echo ""
echo "Next steps:"
echo "  git add ${OUTPUT_FILE}"
echo "  git commit -m \"[system] Registered human: ${HUMAN_NAME}\""
echo "  git push"
```

## File: scripts/check-updates.sh
size: 2085
sha: a87de633f264b7b915a17a215babe1f21d4a4dca
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/check-updates.sh

```text
#!/bin/bash
# check-updates.sh - Check for Mission Control updates via MissionDeck API
#
# Usage: ./scripts/check-updates.sh
#
# Requires: MISSIONDECK_API_KEY environment variable or config.json

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MC_ROOT="$(dirname "$SCRIPT_DIR")"

# Get API key from env or config
API_KEY="${MISSIONDECK_API_KEY:-}"
if [ -z "$API_KEY" ] && [ -f "$MC_ROOT/.mission-control/config.json" ]; then
  API_KEY=$(grep -o '"apiKey"[[:space:]]*:[[:space:]]*"[^"]*"' "$MC_ROOT/.mission-control/config.json" 2>/dev/null | head -1 | cut -d'"' -f4)
fi

if [ -z "$API_KEY" ]; then
  echo "ℹ️  No MissionDeck API key configured"
  echo "   Set MISSIONDECK_API_KEY or add to .mission-control/config.json"
  exit 0
fi

# Get current version
CURRENT_VERSION="0.0.0"
if [ -f "$MC_ROOT/VERSION" ]; then
  CURRENT_VERSION=$(cat "$MC_ROOT/VERSION")
elif [ -f "$MC_ROOT/CHANGELOG.md" ]; then
  CURRENT_VERSION=$(grep -o '\*\*[0-9]*\.[0-9]*\.[0-9]*\*\*' "$MC_ROOT/CHANGELOG.md" | head -1 | tr -d '*')
fi

# Check latest version
API_URL="${MISSIONDECK_API_BASE:-https://missiondeck.ai/api/distribution}/version"

echo "🔍 Checking for updates..."
echo "   Current version: $CURRENT_VERSION"

RESPONSE=$(curl -s -H "x-api-key: $API_KEY" "$API_URL" 2>/dev/null || echo '{"error":"failed"}')

if echo "$RESPONSE" | grep -q '"error"'; then
  echo "❌ Failed to check for updates"
  echo "   Response: $RESPONSE"
  exit 1
fi

LATEST=$(echo "$RESPONSE" | grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)

if [ -z "$LATEST" ]; then
  echo "❌ Could not parse version from response"
  exit 1
fi

echo "   Latest version:  $LATEST"

if [ "$LATEST" != "$CURRENT_VERSION" ]; then
  echo ""
  echo "🚀 New version available: $LATEST"
  echo ""
  echo "To update, run:"
  echo "  ./scripts/update-mission-control.sh"
  echo ""
  echo "Or download manually:"
  echo "  curl -H \"x-api-key: \$MISSIONDECK_API_KEY\" \\"
  echo "    $API_URL/../download/latest -o mission-control.zip"
else
  echo ""
  echo "✅ Mission Control is up to date!"
fi
```

## File: scripts/connect-missiondeck.sh
size: 8704
sha: dbe238eb84768c0574f3376206801220cb7ec32e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/connect-missiondeck.sh

```text
#!/usr/bin/env bash
# =============================================================
# MissionDeck Cloud Connect
# Connects your local JARVIS Mission Control to MissionDeck.ai
# so your dashboard is live at missiondeck.ai/mission-control/[slug]
# =============================================================

set -euo pipefail

GREEN='\033[0;32m'
CYAN='\033[0;36m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BOLD='\033[1m'
NC='\033[0m'

MISSIONDECK_URL="${MISSIONDECK_URL:-https://missiondeck.ai}"
# API base: Supabase direct URL (works now). Override once missiondeck.ai proxy is configured.
MISSIONDECK_API_URL="${MISSIONDECK_API_URL:-https://sqykgceibcmnmgfuioso.supabase.co/functions/v1}"
MC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
CONFIG_FILE="$MC_DIR/.mission-control/config.yaml"

echo ""
echo -e "${CYAN}${BOLD}☁️  MissionDeck Cloud Connect${NC}"
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""

# ── Cloud API status check ─────────────────────────────────────────
echo -e "${YELLOW}Checking cloud API availability...${NC}"
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
  --max-time 8 \
  "$MISSIONDECK_API_URL/mc-api/verify" 2>/dev/null || echo "000")

CLOUD_AVAILABLE=false
if [ "$STATUS_CODE" = "200" ] || [ "$STATUS_CODE" = "401" ]; then
  CLOUD_AVAILABLE=true
  echo -e "  ${GREEN}✅ Cloud API is available${NC}"
elif [ "$STATUS_CODE" = "405" ] || [ "$STATUS_CODE" = "404" ] || [ "$STATUS_CODE" = "000" ]; then
  echo -e "  ${YELLOW}⚠️  Cloud sync API not yet deployed (HTTP $STATUS_CODE)${NC}"
  echo ""
  echo -e "  ${BOLD}What this means:${NC}"
  echo -e "  • Your local Mission Control works perfectly (http://localhost:3000)"
  echo -e "  • Cloud sync to missiondeck.ai is not yet available"
  echo -e "  • Your config will be saved — sync will activate when the API goes live"
  echo ""
  echo -e "  ${BOLD}What to do now:${NC}"
  echo -e "  • Re-run this script when cloud sync is announced at missiondeck.ai"
  echo -e "  • For remote access today, see: skills/deployment.md"
  echo -e "  • Your local board at http://localhost:3000 is fully functional"
  echo ""
  read -rp "  Save local config anyway and continue? [y/N]: " CONTINUE
  if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}Exiting. Local setup is fully functional without this step.${NC}"
    exit 0
  fi
else
  echo -e "  ${YELLOW}⚠️  Unexpected HTTP $STATUS_CODE — proceeding anyway${NC}"
fi

echo ""
echo "Your cloud dashboard URL (once API is live):"
echo -e "  ${BOLD}missiondeck.ai/mission-control/your-slug${NC}"
echo ""

# ── Step 1: Get API key ────────────────────────────────────────────
echo -e "${YELLOW}Step 1${NC} — Enter your API key"
echo ""
echo "  Get a free key at: ${BOLD}${MISSIONDECK_URL}/settings/api-keys${NC}"
echo ""
if [ -t 0 ]; then
  read -rsp "  Paste API key (or press Enter to skip): " API_KEY
  echo ""
else
  API_KEY="${MISSIONDECK_API_KEY:-}"
fi

if [ -z "$API_KEY" ]; then
  echo -e "  ${YELLOW}ℹ️  No key provided — saving placeholder config${NC}"
  API_KEY="REPLACE_WITH_YOUR_KEY"
fi

# ── Step 2: Workspace slug ─────────────────────────────────────────
WORKSPACE_SLUG=""

if [ "$CLOUD_AVAILABLE" = true ] && [ "$API_KEY" != "REPLACE_WITH_YOUR_KEY" ]; then
  echo ""
  echo -e "${YELLOW}Step 2${NC} — Verifying key..."

  HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 8 \
    -H "Authorization: Bearer $API_KEY" \
    "$MISSIONDECK_API_URL/mc-api/verify" 2>/dev/null || echo "000")

  if [ "$HTTP_CODE" = "200" ]; then
    VERIFY_BODY=$(curl -s --max-time 8 \
      -H "Authorization: Bearer $API_KEY" \
      "$MISSIONDECK_API_URL/mc-api/verify" 2>/dev/null || echo "{}")
    WORKSPACE_SLUG=$(echo "$VERIFY_BODY" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('slug',''))" 2>/dev/null || echo "")
    [ -n "$WORKSPACE_SLUG" ] && echo -e "  ${GREEN}✅ Verified — workspace: ${BOLD}$WORKSPACE_SLUG${NC}"
  fi
fi

if [ -z "$WORKSPACE_SLUG" ]; then
  echo ""
  echo -e "${YELLOW}Step 2${NC} — Workspace slug"
  read -rp "  Enter your username/slug (default: my-workspace): " WORKSPACE_SLUG
  WORKSPACE_SLUG="${WORKSPACE_SLUG:-my-workspace}"
fi

DASHBOARD_URL="$MISSIONDECK_URL/mission-control/$WORKSPACE_SLUG"

# ── Step 3: Save config ────────────────────────────────────────────
echo ""
echo -e "${YELLOW}Step 3${NC} — Saving configuration..."

mkdir -p "$MC_DIR/.mission-control"

if [ -f "$CONFIG_FILE" ]; then
  grep -v "^missiondeck_" "$CONFIG_FILE" > "${CONFIG_FILE}.tmp" 2>/dev/null || true
  mv "${CONFIG_FILE}.tmp" "$CONFIG_FILE"
fi

printf '\n# MissionDeck Cloud (added by connect-missiondeck.sh)\nmissiondeck_enabled: true\nmissiondeck_slug: %s\nmissiondeck_url: %s\n' \
  "$WORKSPACE_SLUG" "$MISSIONDECK_URL" >> "$CONFIG_FILE"

printf 'MISSIONDECK_API_KEY=%s\nMISSIONDECK_URL=%s\nMISSIONDECK_SLUG=%s\nMISSIONDECK_API_URL=%s\n' \
  "$API_KEY" "$MISSIONDECK_URL" "$WORKSPACE_SLUG" "$MISSIONDECK_API_URL" > "$MC_DIR/.missiondeck"
chmod 600 "$MC_DIR/.missiondeck"

echo -e "  ${GREEN}✅ Config saved to .missiondeck${NC}"

# ── Step 4: Sync (only if cloud available) ────────────────────────
if [ "$CLOUD_AVAILABLE" = true ] && [ "$API_KEY" != "REPLACE_WITH_YOUR_KEY" ]; then
  echo ""
  echo -e "${YELLOW}Step 4${NC} — Syncing tasks to cloud..."

  TASKS_DIR="$MC_DIR/.mission-control/tasks"
  TASK_COUNT=0
  [ -d "$TASKS_DIR" ] && TASK_COUNT=$(ls "$TASKS_DIR"/*.json 2>/dev/null | wc -l | tr -d ' ') || true

  if [ "$TASK_COUNT" -gt 0 ]; then
    PAYLOAD=$(python3 -c "
import json, os, glob
tasks = []
for f in glob.glob('$TASKS_DIR/*.json'):
    try:
        tasks.append(json.load(open(f)))
    except: pass
print(json.dumps({'tasks': tasks, 'agents': [], 'deleted_ids': [], 'client_version': '2.1.0'}))
")

    SYNC_CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 \
      -X POST \
      -H "Authorization: Bearer $API_KEY" \
      -H "Content-Type: application/json" \
      -d "$PAYLOAD" \
      "$MISSIONDECK_API_URL/mc-sync" 2>/dev/null || echo "000")

    if [ "$SYNC_CODE" = "200" ]; then
      echo -e "  ${GREEN}✅ $TASK_COUNT tasks synced${NC}"
    else
      echo -e "  ${YELLOW}⚠️  Sync returned HTTP $SYNC_CODE — will retry on server start${NC}"
    fi
  else
    echo -e "  ${YELLOW}ℹ️  No tasks yet — will sync automatically when you create tasks${NC}"
  fi
else
  echo ""
  echo -e "  ${YELLOW}ℹ️  Skipping sync — cloud API not available${NC}"
  echo -e "  Tasks are safe locally. Sync activates when the API goes live."
fi

# ── Step 5: Restart server ─────────────────────────────────────────
echo ""
echo -e "${YELLOW}Step 5${NC} — Server restart..."

if pm2 list 2>/dev/null | grep -q "mission-control-server"; then
  pm2 restart mission-control-server --update-env 2>/dev/null && \
    echo -e "  ${GREEN}✅ Server restarted${NC}" || \
    echo -e "  ${YELLOW}⚠️  Restart manually: pm2 restart mission-control-server --update-env${NC}"
else
  echo -e "  ${YELLOW}ℹ️  Restart server to pick up new config:${NC}"
  echo -e "  source .missiondeck && node server/index.js"
fi

# ── Done ────────────────────────────────────────────────────────────
echo ""
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
if [ "$CLOUD_AVAILABLE" = true ]; then
  echo -e "${GREEN}${BOLD}✅ MissionDeck Cloud connected!${NC}"
  echo -e "  🌐 Dashboard: ${BOLD}$DASHBOARD_URL${NC}"
  echo -e "  🔄 Auto-sync: Active"
else
  echo -e "${YELLOW}${BOLD}Config saved — cloud sync coming soon${NC}"
  echo -e "  🖥️  Local dashboard: ${BOLD}http://localhost:3000${NC}  ← Works now"
  echo -e "  ☁️  Cloud dashboard: ${BOLD}$DASHBOARD_URL${NC}  ← Available when API goes live"
  echo -e ""
  echo -e "  Re-run this script when MissionDeck cloud sync is announced."
  echo -e "  For remote access now: see skills/deployment.md"
fi
echo ""
```

## File: scripts/create-github-issue.sh
size: 3896
sha: c93443c19570fa4531cebc9164e62976bca1c25e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/create-github-issue.sh

````text
#!/bin/bash
# Create GitHub Issue for Auto-Task Spam Bug
# Usage: GITHUB_TOKEN=ghp_xxx ./scripts/create-github-issue.sh

set -e

REPO="Asif2BD/JARVIS-Mission-Control-OpenClaw"
TITLE="[BUG] Agent Bridge auto-creates junk tasks for every spawn"
LABELS="bug,agent-bridge,cleanup"
ASSIGNEES="morpheus"

BODY=$(cat <<'EOF'
## Problem Description

The Agent Bridge is configured to automatically create a Mission Control task for **every agent spawn** via `sessions_spawn`, resulting in dashboard clutter with meaningless tasks like:

- "Agent session started" (24+ duplicate instances)
- Generic session tasks with no context
- Real work buried under auto-generated noise

## Root Cause

**File:** `server/agent-bridge.js`  
**Function:** `processNewSession()`

The bridge creates a task whenever it detects a spawned subagent session.

**Config:** `.mission-control/config.yaml`
```yaml
openclaw:
  hooks:
    on_agent_start:
      - action: create_task
        template: "agent_session"
```

This creates noise for casual agent conversations, quick questions, and internal coordination.

## Current Workaround

**Environment variable override:**
```bash
AUTO_CREATE_TASKS=false node start-all.js
```

**Changes applied:**
- Added `AUTO_CREATE_TASKS` check in `agent-bridge.js`
- Archived 24 junk tasks to `archived-tasks/`
- Updated `config.yaml` with policy documentation

## Proposed Solution

**Option 1: Make Auto-Create Configurable (Recommended)**

Add to `config.yaml`:
```yaml
openclaw:
  auto_create_tasks:
    enabled: false  # Default off
    rules:
      - spawn_label_contains: "task:"
      - prompt_starts_with: "Task ID:"
```

**Option 2: Require Explicit Task Linking**

- Spawns with `Task ID: task-xyz` → link to existing task
- Spawns without reference → no task created
- Forces deliberate task management

## Expected Behavior

**For meaningful work:**
1. Create task JSON explicitly
2. Spawn with reference: `sessions_spawn("tank", "Task ID: task-xyz...")`
3. Bridge links session → updates task status
4. No duplicate created

**For casual work:**
1. Spawn without reference
2. Bridge logs session only (no task)
3. Dashboard stays clean

## Impact

- UX: Dashboard cluttered
- Maintenance: Manual cleanup needed
- Trust: Users lose confidence in tracking

## Acceptance Criteria

- [ ] `config.yaml` controls auto-task behavior
- [ ] Default: `auto_create_tasks: false`
- [ ] Bridge respects config
- [ ] Docs updated (`AGENT-BRIDGE.md`, `CLAUDE.md`)
- [ ] Tests for both modes
- [ ] Migration guide

**Related:**
- `docs/AGENT-BRIDGE-CLEANUP-LOG.md` (previous cleanup 2026-02-05)
- `MISSION_CONTROL_PROTOCOL.md` (workflow documentation)

**Discovered:** 2026-02-06 by Tank (user report)  
**Affected versions:** v0.8.0+

**Assignee recommendation:** Morpheus (code review specialist)
EOF
)

if [ -z "$GITHUB_TOKEN" ]; then
    echo "Error: GITHUB_TOKEN environment variable not set"
    echo ""
    echo "To create the issue, run:"
    echo "  export GITHUB_TOKEN=ghp_your_token_here"
    echo "  ./scripts/create-github-issue.sh"
    echo ""
    echo "Or create manually at:"
    echo "  https://github.com/$REPO/issues/new"
    echo ""
    echo "Title: $TITLE"
    echo "Labels: $LABELS"
    echo "Body: (see below)"
    echo ""
    echo "$BODY"
    exit 1
fi

echo "Creating GitHub issue..."

RESPONSE=$(curl -s -X POST \
    -H "Authorization: token $GITHUB_TOKEN" \
    -H "Accept: application/vnd.github.v3+json" \
    "https://api.github.com/repos/$REPO/issues" \
    -d @- <<JSON_PAYLOAD
{
  "title": "$TITLE",
  "body": $(echo "$BODY" | jq -Rs .),
  "labels": ["bug", "agent-bridge", "cleanup"],
  "assignees": []
}
JSON_PAYLOAD
)

ISSUE_URL=$(echo "$RESPONSE" | grep -o '"html_url": "[^"]*' | cut -d'"' -f4)

if [ -n "$ISSUE_URL" ]; then
    echo "✅ Issue created: $ISSUE_URL"
else
    echo "❌ Failed to create issue"
    echo "$RESPONSE"
    exit 1
fi
````

## File: scripts/create-task.js
size: 4462
sha: b3e85552869ee20b5e8b1d2364551b1448ce90f9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/create-task.js

```text
#!/usr/bin/env node
/**
 * Create Task CLI - Mission Control
 * 
 * Creates meaningful tasks from command line or programmatically.
 * Usage:
 *   node create-task.js "Task Title" "Description" --assignee oracle --priority high --labels "feature,important"
 *   
 * Or via API:
 *   curl -X POST http://localhost:3000/api/tasks -H "Content-Type: application/json" \
 *     -d '{"title":"Task Title","description":"Description","assignee":"oracle"}'
 */

const fs = require('fs').promises;
const path = require('path');

const MISSION_CONTROL_DIR = path.join(__dirname, '..', '.mission-control');
const TASKS_DIR = path.join(MISSION_CONTROL_DIR, 'tasks');

/**
 * Generate a task ID
 */
function generateTaskId() {
    const date = new Date().toISOString().split('T')[0].replace(/-/g, '');
    const rand = Math.random().toString(36).substring(2, 8);
    return `task-${date}-${rand}`;
}

/**
 * Create a new task
 */
async function createTask(options) {
    const {
        title,
        description,
        assignee = null,
        priority = 'medium',
        labels = [],
        status = 'INBOX',
        created_by = 'system'
    } = options;

    if (!title) {
        throw new Error('Task title is required');
    }

    const task = {
        id: generateTaskId(),
        title,
        description: description || '',
        status,
        priority,
        assignee,
        created_by,
        labels: Array.isArray(labels) ? labels : labels.split(',').map(l => l.trim()).filter(Boolean),
        comments: [],
        attachments: [],
        created_at: new Date().toISOString(),
        updated_at: new Date().toISOString()
    };

    // Ensure directory exists
    await fs.mkdir(TASKS_DIR, { recursive: true });

    // Write task file
    const filePath = path.join(TASKS_DIR, `${task.id}.json`);
    await fs.writeFile(filePath, JSON.stringify(task, null, 2));

    console.log(`✅ Task created: ${task.id}`);
    console.log(`   Title: ${task.title}`);
    console.log(`   Priority: ${task.priority}`);
    console.log(`   Assignee: ${task.assignee || 'Unassigned'}`);
    console.log(`   File: ${filePath}`);

    return task;
}

/**
 * Parse command line arguments
 */
function parseArgs(args) {
    const options = {
        title: null,
        description: null,
        assignee: null,
        priority: 'medium',
        labels: [],
        status: 'INBOX',
        created_by: 'cli'
    };

    let i = 0;
    while (i < args.length) {
        const arg = args[i];

        if (arg === '--assignee' || arg === '-a') {
            options.assignee = args[++i];
        } else if (arg === '--priority' || arg === '-p') {
            options.priority = args[++i];
        } else if (arg === '--labels' || arg === '-l') {
            options.labels = args[++i].split(',').map(l => l.trim());
        } else if (arg === '--status' || arg === '-s') {
            options.status = args[++i];
        } else if (arg === '--created-by' || arg === '-c') {
            options.created_by = args[++i];
        } else if (arg === '--help' || arg === '-h') {
            console.log(`
Usage: node create-task.js "Title" "Description" [options]

Options:
  -a, --assignee    Agent ID to assign (e.g., oracle, tank, morpheus)
  -p, --priority    Priority level (low, medium, high, critical)
  -l, --labels      Comma-separated labels
  -s, --status      Initial status (INBOX, ASSIGNED, IN_PROGRESS, REVIEW, DONE)
  -c, --created-by  Creator identifier
  -h, --help        Show this help

Examples:
  node create-task.js "Setup Piper TTS" "Install and configure local TTS system" -a oracle -p high
  node create-task.js "Review PR #42" "Review dashboard fixes" -a tank -l "review,code" -p medium
`);
            process.exit(0);
        } else if (!options.title) {
            options.title = arg;
        } else if (!options.description) {
            options.description = arg;
        }
        i++;
    }

    return options;
}

// Run if called directly
if (require.main === module) {
    const args = process.argv.slice(2);
    
    if (args.length === 0) {
        console.error('Error: Task title required. Use --help for usage.');
        process.exit(1);
    }

    const options = parseArgs(args);
    
    createTask(options)
        .then(() => process.exit(0))
        .catch(err => {
            console.error('Error:', err.message);
            process.exit(1);
        });
}

module.exports = { createTask, generateTaskId };
```

## File: scripts/create-task.sh
size: 5695
sha: 71b9b0b1d2f357ed882b0ff9d22891ad45bd6140
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/create-task.sh

```text
#!/bin/bash
#
# JARVIS Mission Control - Create Task Script
# Creates a new task file in .mission-control/tasks/
#
# Usage: ./scripts/create-task.sh "Task Title" [options]
#
# Options:
#   --priority <level>    Set priority (critical, high, medium, low)
#   --labels <labels>     Comma-separated labels
#   --assignee <id>       Assign to agent/human
#   --description <text>  Task description (or read from stdin)
#   --dry-run            Show task JSON without creating file
#

set -euo pipefail

# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
TASKS_DIR="$PROJECT_ROOT/.mission-control/tasks"

# Defaults
PRIORITY="medium"
LABELS=""
ASSIGNEE=""
DESCRIPTION=""
DRY_RUN=false
CREATED_BY="${MC_AGENT_ID:-human-user}"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Functions
usage() {
    cat << EOF
Usage: $(basename "$0") "Task Title" [options]

Options:
  --priority <level>     Set priority (critical, high, medium, low)
  --labels <labels>      Comma-separated labels
  --assignee <id>        Assign to agent/human (e.g., agent-jarvis)
  --description <text>   Task description
  --dry-run              Show task JSON without creating file
  -h, --help             Show this help message

Examples:
  $(basename "$0") "Implement login feature" --priority high --labels feature,backend
  $(basename "$0") "Fix bug #123" --assignee agent-backend-specialist
  echo "Detailed description" | $(basename "$0") "Task Title" --description -
EOF
}

error() {
    echo -e "${RED}Error: $1${NC}" >&2
    exit 1
}

info() {
    echo -e "${GREEN}$1${NC}"
}

warn() {
    echo -e "${YELLOW}$1${NC}"
}

# Generate task ID
generate_id() {
    local date_part=$(date +%Y%m%d)
    local title_slug=$(echo "$1" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9-' | head -c 30)
    echo "task-${date_part}-${title_slug}"
}

# Parse labels into JSON array
parse_labels() {
    local labels="$1"
    if [ -z "$labels" ]; then
        echo "[]"
        return
    fi

    local json="["
    local first=true
    IFS=',' read -ra LABEL_ARRAY <<< "$labels"
    for label in "${LABEL_ARRAY[@]}"; do
        label=$(echo "$label" | xargs)  # trim whitespace
        if [ "$first" = true ]; then
            first=false
        else
            json+=","
        fi
        json+="\"$label\""
    done
    json+="]"
    echo "$json"
}

# Generate task JSON
generate_task_json() {
    local id="$1"
    local title="$2"
    local description="$3"
    local priority="$4"
    local labels_json="$5"
    local assignee="$6"
    local created_by="$7"
    local timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

    local assignee_json="null"
    if [ -n "$assignee" ]; then
        assignee_json="\"$assignee\""
    fi

    local status="INBOX"
    if [ -n "$assignee" ]; then
        status="ASSIGNED"
    fi

    cat << EOF
{
  "id": "$id",
  "title": "$title",
  "description": "$description",
  "status": "$status",
  "priority": "$priority",
  "assignee": $assignee_json,
  "created_by": "$created_by",
  "created_at": "$timestamp",
  "updated_at": "$timestamp",
  "due_date": null,
  "labels": $labels_json,
  "estimated_hours": null,
  "actual_hours": null,
  "comments": [
    {
      "id": "comment-001",
      "author": "$created_by",
      "content": "Task created via create-task.sh",
      "timestamp": "$timestamp",
      "type": "system"
    }
  ],
  "deliverables": [],
  "dependencies": [],
  "blocked_by": [],
  "workflow_id": null,
  "metadata": {}
}
EOF
}

# Parse arguments
if [ $# -lt 1 ]; then
    usage
    exit 1
fi

TITLE=""

while [ $# -gt 0 ]; do
    case "$1" in
        -h|--help)
            usage
            exit 0
            ;;
        --priority)
            shift
            PRIORITY="$1"
            if [[ ! "$PRIORITY" =~ ^(critical|high|medium|low)$ ]]; then
                error "Invalid priority: $PRIORITY (must be critical, high, medium, or low)"
            fi
            ;;
        --labels)
            shift
            LABELS="$1"
            ;;
        --assignee)
            shift
            ASSIGNEE="$1"
            ;;
        --description)
            shift
            if [ "$1" = "-" ]; then
                DESCRIPTION=$(cat)
            else
                DESCRIPTION="$1"
            fi
            ;;
        --dry-run)
            DRY_RUN=true
            ;;
        -*)
            error "Unknown option: $1"
            ;;
        *)
            if [ -z "$TITLE" ]; then
                TITLE="$1"
            else
                error "Unexpected argument: $1"
            fi
            ;;
    esac
    shift
done

# Validate
if [ -z "$TITLE" ]; then
    error "Task title is required"
fi

# Use title as description if not provided
if [ -z "$DESCRIPTION" ]; then
    DESCRIPTION="$TITLE"
fi

# Generate task
TASK_ID=$(generate_id "$TITLE")
LABELS_JSON=$(parse_labels "$LABELS")
TASK_JSON=$(generate_task_json "$TASK_ID" "$TITLE" "$DESCRIPTION" "$PRIORITY" "$LABELS_JSON" "$ASSIGNEE" "$CREATED_BY")

# Output
if [ "$DRY_RUN" = true ]; then
    warn "Dry run - task not created"
    echo ""
    echo "Task ID: $TASK_ID"
    echo "File: $TASKS_DIR/$TASK_ID.json"
    echo ""
    echo "$TASK_JSON"
    exit 0
fi

# Ensure tasks directory exists
mkdir -p "$TASKS_DIR"

# Write task file
TASK_FILE="$TASKS_DIR/$TASK_ID.json"
echo "$TASK_JSON" > "$TASK_FILE"

info "Task created successfully!"
echo ""
echo "ID:   $TASK_ID"
echo "File: $TASK_FILE"
echo ""
echo "Next steps:"
echo "  1. Review the task: cat $TASK_FILE"
echo "  2. Commit: git add $TASK_FILE && git commit -m '[$CREATED_BY] Created task: $TITLE'"
echo "  3. Push: git push"
```

## File: scripts/init-mission-control.sh
size: 9869
sha: 8a78c517ab8bd353e610583c8f948822b2dbe8e3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/init-mission-control.sh

```text
#!/bin/bash
#
# init-mission-control.sh - Initialize Mission Control for production or demo mode
#
# Usage:
#   ./scripts/init-mission-control.sh              # Interactive mode
#   ./scripts/init-mission-control.sh --production # Skip demo, clean setup
#   ./scripts/init-mission-control.sh --demo       # Load demo data
#   ./scripts/init-mission-control.sh --help       # Show help
#
# This script properly separates demo data from production deployments.
#

set -e

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
BOLD='\033[1m'

# Get script directory and repo root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(dirname "$SCRIPT_DIR")"
MC_DIR="$REPO_ROOT/.mission-control"
DEMO_DATA_DIR="$REPO_ROOT/examples/demo-data"
DEMO_FLAG="$MC_DIR/.demo-loaded"
INIT_FLAG="$MC_DIR/.initialized"

# Print banner
print_banner() {
    echo -e "${CYAN}"
    echo "╔═══════════════════════════════════════════════════════════════╗"
    echo "║           JARVIS Mission Control - Initialization             ║"
    echo "╚═══════════════════════════════════════════════════════════════╝"
    echo -e "${NC}"
}

# Print help
print_help() {
    echo "Usage: $0 [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  --production    Initialize for production (no demo data)"
    echo "  --demo          Initialize with demo data (Matrix-themed examples)"
    echo "  --force         Force re-initialization (overwrite existing)"
    echo "  --help          Show this help message"
    echo ""
    echo "Without options, runs in interactive mode."
    echo ""
    echo "Examples:"
    echo "  $0                  # Interactive mode"
    echo "  $0 --production     # Clean production setup"
    echo "  $0 --demo           # Load demo data for testing"
    echo "  $0 --production --force  # Re-initialize (destructive)"
}

# Check if already initialized
check_existing() {
    if [[ -f "$INIT_FLAG" ]]; then
        echo -e "${YELLOW}⚠️  Mission Control is already initialized.${NC}"
        
        if [[ -f "$DEMO_FLAG" ]]; then
            echo -e "   Mode: ${CYAN}Demo${NC} (Matrix-themed examples loaded)"
        else
            echo -e "   Mode: ${GREEN}Production${NC}"
        fi
        
        echo ""
        
        if [[ "$FORCE" != "true" ]]; then
            echo -e "${YELLOW}To re-initialize, run with --force flag.${NC}"
            echo -e "${RED}WARNING: --force will DELETE all existing tasks, agents, and messages!${NC}"
            exit 0
        else
            echo -e "${RED}--force flag detected. Proceeding with re-initialization...${NC}"
            echo ""
        fi
    fi
}

# Count existing data
count_existing_data() {
    local tasks=$(find "$MC_DIR/tasks" -name "*.json" 2>/dev/null | wc -l)
    local agents=$(find "$MC_DIR/agents" -name "*.json" 2>/dev/null | wc -l)
    local messages=$(find "$MC_DIR/messages" -name "*.json" 2>/dev/null | wc -l)
    local humans=$(find "$MC_DIR/humans" -name "*.json" 2>/dev/null | wc -l)
    
    echo "$tasks tasks, $agents agents, $humans humans, $messages messages"
}

# Clear all data directories (for production or re-init)
clear_data() {
    echo -e "${YELLOW}Clearing existing data...${NC}"
    
    # Remove JSON files from data directories
    rm -f "$MC_DIR/tasks/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/agents/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/messages/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/humans/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/queue/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/workflows/"*.json 2>/dev/null || true
    
    # Clear logs
    rm -f "$MC_DIR/logs/"*.log 2>/dev/null || true
    
    # Remove flags
    rm -f "$DEMO_FLAG" 2>/dev/null || true
    rm -f "$INIT_FLAG" 2>/dev/null || true
    
    echo -e "${GREEN}✓ Data cleared${NC}"
}

# Load demo data
load_demo_data() {
    echo -e "${CYAN}Loading demo data (Matrix-themed examples)...${NC}"
    
    # Copy demo data to .mission-control
    if [[ -d "$DEMO_DATA_DIR/agents" ]]; then
        cp "$DEMO_DATA_DIR/agents/"*.json "$MC_DIR/agents/" 2>/dev/null || true
        echo -e "  ${GREEN}✓${NC} Agents loaded"
    fi
    
    if [[ -d "$DEMO_DATA_DIR/humans" ]]; then
        cp "$DEMO_DATA_DIR/humans/"*.json "$MC_DIR/humans/" 2>/dev/null || true
        echo -e "  ${GREEN}✓${NC} Humans loaded"
    fi
    
    if [[ -d "$DEMO_DATA_DIR/tasks" ]]; then
        cp "$DEMO_DATA_DIR/tasks/"*.json "$MC_DIR/tasks/" 2>/dev/null || true
        echo -e "  ${GREEN}✓${NC} Tasks loaded"
    fi
    
    if [[ -d "$DEMO_DATA_DIR/messages" ]]; then
        cp "$DEMO_DATA_DIR/messages/"*.json "$MC_DIR/messages/" 2>/dev/null || true
        echo -e "  ${GREEN}✓${NC} Messages loaded"
    fi
    
    # Create demo flag
    echo "Loaded: $(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$DEMO_FLAG"
    
    echo -e "${GREEN}✓ Demo data loaded successfully${NC}"
}

# Initialize for production (clean state)
init_production() {
    echo -e "${GREEN}Initializing for production (clean state)...${NC}"
    
    # Create welcome task
    local timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
    local date_prefix=$(date +%Y%m%d)
    
    cat > "$MC_DIR/tasks/task-${date_prefix}-welcome.json" << EOF
{
  "id": "task-${date_prefix}-welcome",
  "title": "Welcome to Mission Control",
  "description": "Your Mission Control is ready for production use!\\n\\nNext steps:\\n1. Register your human operator: ./scripts/add-human.sh\\n2. Register your agent: ./scripts/add-agent.sh\\n3. Create your first task: ./scripts/create-task.sh\\n\\nSee CLAUDE.md for complete documentation.",
  "status": "INBOX",
  "priority": "high",
  "assignee": null,
  "created_by": "system",
  "created_at": "${timestamp}",
  "updated_at": "${timestamp}",
  "labels": ["setup", "getting-started"],
  "comments": [],
  "deliverables": [],
  "dependencies": [],
  "blocked_by": []
}
EOF
    
    echo -e "  ${GREEN}✓${NC} Welcome task created"
    echo -e "${GREEN}✓ Production initialization complete${NC}"
}

# Create initialization flag
mark_initialized() {
    local mode=$1
    local timestamp=$(date -u +%Y-%m-%dT%H:%M:%SZ)
    
    cat > "$INIT_FLAG" << EOF
# Mission Control Initialized
mode: ${mode}
initialized_at: ${timestamp}
initialized_by: init-mission-control.sh
EOF
    
    echo -e "${GREEN}✓ Initialization complete (${mode} mode)${NC}"
}

# Print summary
print_summary() {
    local mode=$1
    
    echo ""
    echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
    echo -e "${CYAN}║                    Initialization Complete                     ║${NC}"
    echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
    echo ""
    
    if [[ "$mode" == "demo" ]]; then
        echo -e "Mode: ${CYAN}Demo${NC}"
        echo -e "Data: Matrix-themed agents, tasks, and messages loaded"
        echo ""
        echo -e "${YELLOW}Note: This is demo data. For production, re-run with --production --force${NC}"
    else
        echo -e "Mode: ${GREEN}Production${NC}"
        echo -e "Data: Clean state with welcome task"
        echo ""
        echo -e "Next steps:"
        echo -e "  1. Register yourself: ${CYAN}./scripts/add-agent.sh --id agent-primary --name 'Your Name' --role lead${NC}"
        echo -e "  2. Register human:    ${CYAN}./scripts/add-human.sh --id human-admin --name 'Admin Name'${NC}"
        echo -e "  3. Start dashboard:   ${CYAN}cd server && npm install && npm start${NC}"
    fi
    
    echo ""
    echo -e "Current data: $(count_existing_data)"
    echo ""
}

# Interactive mode
interactive_mode() {
    echo ""
    echo -e "${BOLD}How would you like to initialize Mission Control?${NC}"
    echo ""
    echo -e "  ${GREEN}1)${NC} ${BOLD}Production${NC} - Clean setup, no demo data"
    echo -e "     Best for: Real projects, deployments, your own agents"
    echo ""
    echo -e "  ${CYAN}2)${NC} ${BOLD}Demo${NC} - Load Matrix-themed examples"
    echo -e "     Best for: Learning, testing, exploring features"
    echo ""
    
    read -p "Enter choice (1 or 2): " choice
    
    case $choice in
        1)
            MODE="production"
            ;;
        2)
            MODE="demo"
            ;;
        *)
            echo -e "${RED}Invalid choice. Exiting.${NC}"
            exit 1
            ;;
    esac
}

# Parse arguments
MODE=""
FORCE="false"

while [[ $# -gt 0 ]]; do
    case $1 in
        --production)
            MODE="production"
            shift
            ;;
        --demo)
            MODE="demo"
            shift
            ;;
        --force)
            FORCE="true"
            shift
            ;;
        --help|-h)
            print_help
            exit 0
            ;;
        *)
            echo -e "${RED}Unknown option: $1${NC}"
            print_help
            exit 1
            ;;
    esac
done

# Main execution
print_banner

# Check if already initialized
check_existing

# If no mode specified, run interactive
if [[ -z "$MODE" ]]; then
    interactive_mode
fi

# Clear existing data
clear_data

# Initialize based on mode
if [[ "$MODE" == "demo" ]]; then
    load_demo_data
    mark_initialized "demo"
else
    init_production
    mark_initialized "production"
fi

# Print summary
print_summary "$MODE"
```

## File: scripts/jarvis-install.sh
size: 935
sha: f519feb1e9130fd08813423bf740beaae30d644f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/jarvis-install.sh

```text
#!/usr/bin/env bash
# DEPRECATED — Use scripts/mc-install.sh instead. Superseded by v1.0.0 mc CLI.
# jarvis-install.sh — Install jarvis CLI globally via symlink
# Run from any directory: bash /path/to/scripts/jarvis-install.sh

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
JARVIS_JS="$SCRIPT_DIR/jarvis.js"
TARGET="/usr/local/bin/jarvis"

if [ ! -f "$JARVIS_JS" ]; then
  echo "❌ Error: $JARVIS_JS not found." >&2
  exit 1
fi

# Ensure executable
chmod +x "$JARVIS_JS"

# Symlink
if [ -L "$TARGET" ] || [ -f "$TARGET" ]; then
  echo "→ Removing existing: $TARGET"
  rm -f "$TARGET"
fi

ln -s "$JARVIS_JS" "$TARGET"
echo "✔ jarvis installed → $TARGET"
echo ""
echo "Configure your environment:"
echo "  export AGENT_ID=tank"
echo "  export MC_API_URL=http://localhost:3000   # optional, this is the default"
echo ""
echo "Quick test:"
echo "  jarvis --help"
echo "  jarvis tasks"
echo "  jarvis squad"
```

## File: scripts/jarvis.js
size: 20914
sha: 73847fc5215567e24917a0d8d877329bb7ef9c70
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/jarvis.js

```text
#!/usr/bin/env node
/**
 * DEPRECATED — Use `mc` instead (scripts/mc). This file is superseded by v1.0.0.
 * JARVIS CLI — Agent command-line interface for JARVIS Mission Control
 * Inspired by clawe (https://github.com/getclawe/clawe)
 *
 * Usage: jarvis <command> [args...]
 *
 * Config env vars:
 *   MC_API_URL  — Mission Control API base URL (default: http://localhost:3000)
 *   AGENT_ID    — Your agent identity (e.g. tank, oracle, morpheus)
 */

'use strict';

const http   = require('http');
const https  = require('https');
const fs     = require('fs');
const path   = require('path');
const crypto = require('crypto');

// ─────────────────────────────────────────────
// CONFIG
// ─────────────────────────────────────────────
const MC_API_URL = process.env.MC_API_URL || 'http://localhost:3000';
const AGENT_ID   = process.env.AGENT_ID   || 'tank';

// Resolve .mission-control dir (repo-root/.mission-control)
const MC_DIR = path.join(__dirname, '..', '.mission-control');

// ─────────────────────────────────────────────
// COLORS
// ─────────────────────────────────────────────
const C = {
  reset:   '\x1b[0m',
  bold:    '\x1b[1m',
  dim:     '\x1b[2m',
  red:     '\x1b[31m',
  green:   '\x1b[32m',
  yellow:  '\x1b[33m',
  blue:    '\x1b[34m',
  magenta: '\x1b[35m',
  cyan:    '\x1b[36m',
  white:   '\x1b[37m',
};

const STATUS_COLOR = {
  INBOX:       C.white,
  TODO:        C.cyan,
  IN_PROGRESS: C.yellow,
  REVIEW:      C.magenta,
  DONE:        C.green,
  BLOCKED:     C.red,
  CANCELLED:   C.dim,
};

const PRIORITY_COLOR = {
  critical: C.red,
  high:     C.yellow,
  medium:   C.cyan,
  low:      C.dim,
};

const colorStatus   = s => (STATUS_COLOR[s]   || '') + s + C.reset;
const colorPriority = p => (PRIORITY_COLOR[p] || '') + p + C.reset;
const bold          = s => C.bold    + s + C.reset;
const dim           = s => C.dim     + s + C.reset;
const green         = s => C.green   + s + C.reset;
const red           = s => C.red     + s + C.reset;
const cyan          = s => C.cyan    + s + C.reset;
const yellow        = s => C.yellow  + s + C.reset;
const magenta       = s => C.magenta + s + C.reset;

// ─────────────────────────────────────────────
// HTTP HELPERS
// ─────────────────────────────────────────────
function apiRequest(method, urlPath, body) {
  return new Promise((resolve, reject) => {
    const fullUrl  = new URL(urlPath, MC_API_URL);
    const transport = fullUrl.protocol === 'https:' ? https : http;
    const bodyStr  = body ? JSON.stringify(body) : null;

    const options = {
      hostname: fullUrl.hostname,
      port:     fullUrl.port || (fullUrl.protocol === 'https:' ? 443 : 80),
      path:     fullUrl.pathname + fullUrl.search,
      method,
      headers: {
        'Content-Type': 'application/json',
        'X-Agent-Id': AGENT_ID,
        ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}),
      },
    };

    const req = transport.request(options, (res) => {
      let data = '';
      res.on('data', chunk => { data += chunk; });
      res.on('end', () => {
        try { resolve({ status: res.statusCode, body: JSON.parse(data) }); }
        catch { resolve({ status: res.statusCode, body: data }); }
      });
    });

    req.setTimeout(5000, () => { req.destroy(); reject(new Error('Request timeout')); });
    req.on('error', reject);
    if (bodyStr) req.write(bodyStr);
    req.end();
  });
}

// ─────────────────────────────────────────────
// TASK FILE HELPERS  (direct file I/O fallback)
// ─────────────────────────────────────────────
function readTaskFile(id) {
  const p = path.join(MC_DIR, 'tasks', `${id}.json`);
  if (!fs.existsSync(p)) throw new Error(`Task file not found: ${p}`);
  return JSON.parse(fs.readFileSync(p, 'utf-8'));
}

function writeTaskFile(task) {
  const p = path.join(MC_DIR, 'tasks', `${task.id}.json`);
  fs.mkdirSync(path.dirname(p), { recursive: true });
  fs.writeFileSync(p, JSON.stringify(task, null, 2));
}

async function fetchTask(id) {
  try {
    const r = await apiRequest('GET', `/api/tasks/${id}`);
    if (r.status === 200) return r.body;
  } catch { /* server down — fall through */ }
  return readTaskFile(id);
}

async function persistTask(task) {
  task.updated_at = new Date().toISOString();
  try {
    const r = await apiRequest('PUT', `/api/tasks/${task.id}`, task);
    if (r.status === 200 || r.status === 201) return r.body;
  } catch { /* server down */ }
  writeTaskFile(task);
  return task;
}

// ─────────────────────────────────────────────
// DISPLAY HELPERS
// ─────────────────────────────────────────────
const SEP = dim('─'.repeat(60));

function printTask(task) {
  console.log(SEP);
  console.log(`${bold(task.id)}  ${colorStatus(task.status)}  ${colorPriority(task.priority || 'medium')}`);
  console.log(`${bold('Title:')}     ${task.title}`);
  if (task.assignee)   console.log(`${bold('Assignee:')}  ${cyan(task.assignee)}`);
  if (task.description) {
    const firstLine = task.description.split('\n')[0];
    console.log(`${bold('Desc:')}      ${firstLine}${task.description.includes('\n') ? ' …' : ''}`);
  }
  if (task.labels && task.labels.length)
    console.log(`${bold('Labels:')}    ${task.labels.map(l => magenta('#' + l)).join(' ')}`);
  console.log(`${bold('Created:')}   ${dim(task.created_at || '—')}`);
  console.log(`${bold('Updated:')}   ${dim(task.updated_at || '—')}`);

  // Subtasks
  if (task.subtasks && task.subtasks.length) {
    console.log(`\n${bold('Subtasks:')}`);
    task.subtasks.forEach((st, i) => {
      const check = st.done ? green('✔') : dim('○');
      console.log(`  ${check}  [${i}] ${st.done ? dim(st.text) : st.text}`);
    });
    const done = task.subtasks.filter(s => s.done).length;
    console.log(dim(`       ${done}/${task.subtasks.length} complete`));
  }

  // Deliverables (stored as attachments with type=deliverable)
  const deliverables = (task.attachments || []).filter(a => a.type === 'deliverable');
  if (deliverables.length) {
    console.log(`\n${bold('Deliverables:')}`);
    deliverables.forEach(d => {
      console.log(`  ${green('📦')} ${bold(d.name)}  ${dim(d.url || d.path || '—')}`);
    });
  }

  // Comments (last 3)
  if (task.comments && task.comments.length) {
    console.log(`\n${bold('Comments:')} ${dim('(' + task.comments.length + ')')}`);
    task.comments.slice(-3).forEach(c => {
      console.log(`  ${cyan(c.author)}  ${dim((c.timestamp || '').slice(0, 16))}`);
      console.log(`    ${c.content}`);
    });
  }
  console.log(SEP);
}

// ─────────────────────────────────────────────
// COMMANDS
// ─────────────────────────────────────────────

/** task:status <id> <status> */
async function cmdTaskStatus(id, status) {
  if (!id || !status) {
    console.error(red('Usage: jarvis task:status <task_id> <status>'));
    console.error(dim('  Statuses: INBOX TODO IN_PROGRESS REVIEW DONE BLOCKED CANCELLED'));
    process.exit(1);
  }
  const task = await fetchTask(id);
  const old  = task.status;
  task.status = status.toUpperCase();
  await persistTask(task);
  console.log(`${green('✔')} ${bold(id)} status: ${colorStatus(old)} → ${colorStatus(task.status)}`);
}

/** task:comment <id> "message" */
async function cmdTaskComment(id, message) {
  if (!id || !message) {
    console.error(red('Usage: jarvis task:comment <task_id> "message"'));
    process.exit(1);
  }
  const task = await fetchTask(id);
  if (!task.comments) task.comments = [];
  const comment = {
    id:        `comment-${crypto.randomBytes(4).toString('hex')}`,
    author:    AGENT_ID,
    content:   message,
    timestamp: new Date().toISOString(),
    type:      'agent',
  };
  task.comments.push(comment);
  await persistTask(task);
  console.log(`${green('✔')} Comment added to ${bold(id)} by ${cyan(AGENT_ID)}`);
  console.log(`  ${dim(comment.id)}  ${comment.content}`);
}

/** task:view <id> */
async function cmdTaskView(id) {
  if (!id) { console.error(red('Usage: jarvis task:view <task_id>')); process.exit(1); }
  const task = await fetchTask(id);
  printTask(task);
}

/** subtask:add <id> "description" */
async function cmdSubtaskAdd(id, desc) {
  if (!id || !desc) {
    console.error(red('Usage: jarvis subtask:add <task_id> "description"'));
    process.exit(1);
  }
  const task = await fetchTask(id);
  if (!task.subtasks) task.subtasks = [];
  const idx = task.subtasks.length;
  task.subtasks.push({ text: desc, done: false, added_by: AGENT_ID, added_at: new Date().toISOString() });
  await persistTask(task);
  console.log(`${green('✔')} Subtask [${idx}] added to ${bold(id)}: ${desc}`);
}

/** subtask:check <id> <index> */
async function cmdSubtaskCheck(id, indexStr) {
  if (!id || indexStr === undefined) {
    console.error(red('Usage: jarvis subtask:check <task_id> <index>'));
    process.exit(1);
  }
  const idx  = parseInt(indexStr, 10);
  const task = await fetchTask(id);
  if (!task.subtasks || !task.subtasks[idx]) {
    console.error(red(`Subtask [${idx}] not found on task ${id}`));
    process.exit(1);
  }
  task.subtasks[idx].done = !task.subtasks[idx].done;
  const state = task.subtasks[idx].done ? green('✔ done') : yellow('○ undone');
  await persistTask(task);
  console.log(`${green('✔')} Subtask [${idx}] toggled → ${state}: ${task.subtasks[idx].text}`);
}

/** subtask:list <id> */
async function cmdSubtaskList(id) {
  if (!id) { console.error(red('Usage: jarvis subtask:list <task_id>')); process.exit(1); }
  const task = await fetchTask(id);
  if (!task.subtasks || task.subtasks.length === 0) {
    console.log(dim(`No subtasks on ${id}`));
    return;
  }
  console.log(`${bold('Subtasks for')} ${cyan(id)}:`);
  console.log(SEP);
  task.subtasks.forEach((st, i) => {
    const check = st.done ? green('✔') : dim('○');
    console.log(`  ${check}  [${i}]  ${st.done ? dim(st.text) : st.text}`);
  });
  const done  = task.subtasks.filter(s => s.done).length;
  const total = task.subtasks.length;
  console.log(dim(`\n  ${done}/${total} complete`));
  console.log(SEP);
}

/** deliver <id> "name" --path ./file | --url https://... */
async function cmdDeliver(id, name, flags) {
  if (!id || !name) {
    console.error(red('Usage: jarvis deliver <task_id> "name" --path ./file.md'));
    console.error(red('       jarvis deliver <task_id> "name" --url https://...'));
    process.exit(1);
  }
  if (!flags.path && !flags.url) {
    console.error(red('Must provide --path or --url'));
    process.exit(1);
  }
  const task = await fetchTask(id);
  if (!task.attachments) task.attachments = [];
  const deliverable = {
    name,
    type:        'deliverable',
    description: flags.desc || '',
    added_by:    AGENT_ID,
    added_at:    new Date().toISOString(),
    ...(flags.path ? { path: flags.path } : {}),
    ...(flags.url  ? { url:  flags.url  } : {}),
  };
  task.attachments.push(deliverable);
  await persistTask(task);
  console.log(`${green('✔')} Deliverable "${bold(name)}" registered on ${bold(id)}`);
  console.log(`  ${dim(flags.url || flags.path)}`);
}

/** tasks [--status X] [--assignee Y] */
async function cmdTasks(flags) {
  let tasks = [];
  try {
    const r = await apiRequest('GET', '/api/tasks');
    if (r.status === 200 && Array.isArray(r.body)) tasks = r.body;
    else throw new Error('API error');
  } catch {
    // fallback: read files directly
    const dir = path.join(MC_DIR, 'tasks');
    if (!fs.existsSync(dir)) { console.log(dim('No tasks found.')); return; }
    tasks = fs.readdirSync(dir)
      .filter(f => f.endsWith('.json'))
      .map(f => { try { return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8')); } catch { return null; } })
      .filter(Boolean);
  }

  if (flags.status)   tasks = tasks.filter(t => t.status && t.status.toUpperCase() === flags.status.toUpperCase());
  if (flags.assignee) tasks = tasks.filter(t => t.assignee && t.assignee.includes(flags.assignee));

  if (tasks.length === 0) { console.log(dim('No tasks match.')); return; }

  console.log(`\n${bold('JARVIS Tasks')}  ${dim('(' + tasks.length + ')')}\n`);
  console.log(
    bold(padR('ID', 34)) +
    bold(padR('STATUS', 14)) +
    bold(padR('PRI', 10)) +
    bold(padR('ASSIGNEE', 18)) +
    bold('TITLE')
  );
  console.log(SEP);
  tasks.forEach(t => {
    console.log(
      padR(t.id, 34) +
      padR(t.status || '—', 14) +
      padR(t.priority || '—', 10) +
      padR(t.assignee || '—', 18) +
      (t.title || '').slice(0, 38)
    );
  });
  console.log(SEP + '\n');
}

/** notify "message" --to <agent> */
async function cmdNotify(message, flags) {
  if (!message) {
    console.error(red('Usage: jarvis notify "message" --to <agent>'));
    process.exit(1);
  }
  const to = flags.to || 'all';
  const body = {
    id:        `msg-${crypto.randomBytes(4).toString('hex')}`,
    from:      AGENT_ID,
    to,
    content:   message,
    timestamp: new Date().toISOString(),
    type:      'notification',
    read:      false,
  };

  let sent = false;
  try {
    const r = await apiRequest('POST', '/api/messages', body);
    if (r.status === 200 || r.status === 201) sent = true;
  } catch { /* server down */ }

  if (!sent) {
    const dir = path.join(MC_DIR, 'messages');
    fs.mkdirSync(dir, { recursive: true });
    fs.writeFileSync(path.join(dir, `${body.id}.json`), JSON.stringify(body, null, 2));
  }

  console.log(`${green('✔')} Notification sent ${cyan(AGENT_ID)} → ${cyan(to)}`);
  console.log(`  "${message}"`);
}

/** squad — show all agents + their active task */
async function cmdSquad() {
  let agents = [];
  let tasks  = [];

  try {
    const r = await apiRequest('GET', '/api/agents');
    if (r.status === 200 && Array.isArray(r.body)) agents = r.body;
  } catch {}

  if (!agents.length) {
    const dir = path.join(MC_DIR, 'agents');
    if (fs.existsSync(dir)) {
      agents = fs.readdirSync(dir)
        .filter(f => f.endsWith('.json'))
        .map(f => { try { return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8')); } catch { return null; } })
        .filter(Boolean);
    }
  }

  try {
    const r = await apiRequest('GET', '/api/tasks');
    if (r.status === 200 && Array.isArray(r.body)) tasks = r.body;
  } catch {}

  if (!tasks.length) {
    const dir = path.join(MC_DIR, 'tasks');
    if (fs.existsSync(dir)) {
      tasks = fs.readdirSync(dir)
        .filter(f => f.endsWith('.json'))
        .map(f => { try { return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8')); } catch { return null; } })
        .filter(Boolean);
    }
  }

  const activeTasks = tasks.filter(t => t.status === 'IN_PROGRESS');
  const taskByAssignee = {};
  activeTasks.forEach(t => { if (t.assignee) taskByAssignee[t.assignee] = t; });

  console.log(`\n${bold('⚡ JARVIS Squad Status')}\n`);
  console.log(SEP);

  if (!agents.length) {
    console.log(dim('  No agents found.'));
  } else {
    agents.forEach(a => {
      const status  = a.status || 'unknown';
      const dot     = status === 'online'  ? green('●') :
                      status === 'offline' ? red('●')   : yellow('●');
      const agentId = a.id || a.name || '?';
      const task    = taskByAssignee[agentId];
      const taskStr = task
        ? `${yellow(task.id)}  ${dim((task.title || '').slice(0, 35))}`
        : dim('— idle');
      console.log(`  ${dot}  ${bold(padR(agentId, 22))}  ${taskStr}`);
    });
  }

  console.log(SEP + '\n');
}

// ─────────────────────────────────────────────
// ARG PARSING
// ─────────────────────────────────────────────
function padR(str, len) {
  str = String(str);
  return str.length >= len ? str.slice(0, len - 1) + ' ' : str + ' '.repeat(len - str.length);
}

function parseArgs(args) {
  const flags      = {};
  const positional = [];
  for (let i = 0; i < args.length; i++) {
    if (args[i].startsWith('--')) {
      const key = args[i].slice(2);
      flags[key] = (args[i + 1] && !args[i + 1].startsWith('--')) ? args[++i] : true;
    } else {
      positional.push(args[i]);
    }
  }
  return { flags, positional };
}

// ─────────────────────────────────────────────
// HELP
// ─────────────────────────────────────────────
function printHelp() {
  console.log(`
${bold(cyan('JARVIS CLI'))} — Mission Control Command Interface
${dim('Agent: ' + AGENT_ID + '  |  API: ' + MC_API_URL)}

${bold('Task Management')}
  ${yellow('jarvis task:status')} <id> <status>        Update task status
  ${yellow('jarvis task:comment')} <id> "msg"           Add a comment
  ${yellow('jarvis task:view')} <id>                   View full task details

${bold('Subtasks')}
  ${yellow('jarvis subtask:add')} <id> "desc"           Add a subtask
  ${yellow('jarvis subtask:check')} <id> <idx>          Toggle subtask done/undone
  ${yellow('jarvis subtask:list')} <id>                List all subtasks

${bold('Deliverables')}
  ${yellow('jarvis deliver')} <id> "name" --path ./f    Register a file deliverable
  ${yellow('jarvis deliver')} <id> "name" --url https   Register a URL deliverable

${bold('Listing')}
  ${yellow('jarvis tasks')}                             List all tasks
  ${yellow('jarvis tasks')} --status IN_PROGRESS        Filter by status
  ${yellow('jarvis tasks')} --assignee oracle            Filter by agent

${bold('Notifications & Squad')}
  ${yellow('jarvis notify')} "msg" --to oracle           Notify an agent
  ${yellow('jarvis squad')}                             Show all agents + active task

${bold('Valid Statuses:')}
  INBOX  TODO  IN_PROGRESS  REVIEW  DONE  BLOCKED  CANCELLED

${bold('Env Vars:')}
  MC_API_URL   API base URL  (default: http://localhost:3000)
  AGENT_ID     Your agent ID (default: tank)
  DEBUG        Set to 1 for stack traces on errors
`);
}

// ─────────────────────────────────────────────
// MAIN
// ─────────────────────────────────────────────
async function main() {
  const argv = process.argv.slice(2);
  if (!argv.length || argv[0] === '--help' || argv[0] === '-h') {
    printHelp();
    return;
  }

  const cmd                 = argv[0];
  const { flags, positional } = parseArgs(argv.slice(1));

  try {
    switch (cmd) {
      case 'task:status':  await cmdTaskStatus(positional[0], positional[1]);           break;
      case 'task:comment': await cmdTaskComment(positional[0], positional[1]);          break;
      case 'task:view':    await cmdTaskView(positional[0]);                            break;
      case 'subtask:add':  await cmdSubtaskAdd(positional[0], positional[1]);           break;
      case 'subtask:check':await cmdSubtaskCheck(positional[0], positional[1]);         break;
      case 'subtask:list': await cmdSubtaskList(positional[0]);                         break;
      case 'deliver':      await cmdDeliver(positional[0], positional[1], flags);       break;
      case 'tasks':        await cmdTasks(flags);                                       break;
      case 'notify':       await cmdNotify(positional[0], flags);                      break;
      case 'squad':        await cmdSquad();                                            break;
      default:
        console.error(red(`Unknown command: ${cmd}`));
        printHelp();
        process.exit(1);
    }
  } catch (err) {
    console.error(red(`Error: ${err.message}`));
    if (process.env.DEBUG) console.error(err.stack);
    process.exit(1);
  }
}

main();
```

## File: scripts/list-tasks.sh
size: 5560
sha: ebc10a4ef4d44a74614943af08b9a8de1c60a61e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/list-tasks.sh

```text
#!/bin/bash
#
# JARVIS Mission Control - List Tasks Script
# Lists all tasks with optional filtering
#
# Usage: ./scripts/list-tasks.sh [options]
#
# Options:
#   --status <status>     Filter by status
#   --assignee <id>       Filter by assignee
#   --priority <level>    Filter by priority
#   --label <label>       Filter by label
#   --format <format>     Output format (table, json, simple)
#

set -euo pipefail

# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
TASKS_DIR="$PROJECT_ROOT/.mission-control/tasks"

# Defaults
STATUS_FILTER=""
ASSIGNEE_FILTER=""
PRIORITY_FILTER=""
LABEL_FILTER=""
FORMAT="table"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'

# Usage
usage() {
    cat << EOF
Usage: $(basename "$0") [options]

Options:
  --status <status>     Filter by status (INBOX, ASSIGNED, IN_PROGRESS, REVIEW, DONE, BLOCKED)
  --assignee <id>       Filter by assignee
  --priority <level>    Filter by priority (critical, high, medium, low)
  --label <label>       Filter by label
  --format <format>     Output format: table (default), json, simple
  -h, --help            Show this help message

Examples:
  $(basename "$0")
  $(basename "$0") --status IN_PROGRESS
  $(basename "$0") --assignee agent-jarvis --format json
EOF
}

# Status color
status_color() {
    case "$1" in
        INBOX) echo -e "${CYAN}$1${NC}" ;;
        ASSIGNED) echo -e "${BLUE}$1${NC}" ;;
        IN_PROGRESS) echo -e "${YELLOW}$1${NC}" ;;
        REVIEW) echo -e "${PURPLE}$1${NC}" ;;
        DONE) echo -e "${GREEN}$1${NC}" ;;
        BLOCKED) echo -e "${RED}$1${NC}" ;;
        *) echo "$1" ;;
    esac
}

# Priority color
priority_color() {
    case "$1" in
        critical) echo -e "${RED}$1${NC}" ;;
        high) echo -e "${YELLOW}$1${NC}" ;;
        medium) echo -e "${CYAN}$1${NC}" ;;
        low) echo -e "${GREEN}$1${NC}" ;;
        *) echo "$1" ;;
    esac
}

# Parse arguments
while [ $# -gt 0 ]; do
    case "$1" in
        -h|--help)
            usage
            exit 0
            ;;
        --status)
            shift
            STATUS_FILTER="$1"
            ;;
        --assignee)
            shift
            ASSIGNEE_FILTER="$1"
            ;;
        --priority)
            shift
            PRIORITY_FILTER="$1"
            ;;
        --label)
            shift
            LABEL_FILTER="$1"
            ;;
        --format)
            shift
            FORMAT="$1"
            ;;
        *)
            echo "Unknown option: $1"
            usage
            exit 1
            ;;
    esac
    shift
done

# Check if jq is available
if ! command -v jq &> /dev/null; then
    echo "Error: jq is required but not installed"
    echo "Install with: apt-get install jq (Linux) or brew install jq (macOS)"
    exit 1
fi

# Check tasks directory
if [ ! -d "$TASKS_DIR" ]; then
    echo "No tasks found (directory does not exist)"
    exit 0
fi

# Collect tasks
TASKS=()
for file in "$TASKS_DIR"/*.json 2>/dev/null; do
    [ -e "$file" ] || continue

    # Read task data
    id=$(jq -r '.id' "$file")
    title=$(jq -r '.title' "$file")
    status=$(jq -r '.status' "$file")
    priority=$(jq -r '.priority' "$file")
    assignee=$(jq -r '.assignee // "unassigned"' "$file")
    labels=$(jq -r '.labels | join(",")' "$file")

    # Apply filters
    if [ -n "$STATUS_FILTER" ] && [ "$status" != "$STATUS_FILTER" ]; then
        continue
    fi

    if [ -n "$ASSIGNEE_FILTER" ] && [ "$assignee" != "$ASSIGNEE_FILTER" ]; then
        continue
    fi

    if [ -n "$PRIORITY_FILTER" ] && [ "$priority" != "$PRIORITY_FILTER" ]; then
        continue
    fi

    if [ -n "$LABEL_FILTER" ] && [[ ! "$labels" == *"$LABEL_FILTER"* ]]; then
        continue
    fi

    TASKS+=("$id|$title|$status|$priority|$assignee|$labels|$file")
done

# No tasks found
if [ ${#TASKS[@]} -eq 0 ]; then
    echo "No tasks found"
    exit 0
fi

# Output based on format
case "$FORMAT" in
    json)
        echo "["
        first=true
        for task in "${TASKS[@]}"; do
            IFS='|' read -r id title status priority assignee labels file <<< "$task"
            if [ "$first" = true ]; then
                first=false
            else
                echo ","
            fi
            cat "$file"
        done
        echo ""
        echo "]"
        ;;

    simple)
        for task in "${TASKS[@]}"; do
            IFS='|' read -r id title status priority assignee labels file <<< "$task"
            echo "$id: $title [$status]"
        done
        ;;

    table|*)
        # Print header
        printf "%-35s %-40s %-12s %-10s %-25s\n" "ID" "TITLE" "STATUS" "PRIORITY" "ASSIGNEE"
        printf "%s\n" "$(printf '=%.0s' {1..130})"

        # Print tasks
        for task in "${TASKS[@]}"; do
            IFS='|' read -r id title status priority assignee labels file <<< "$task"

            # Truncate title if too long
            if [ ${#title} -gt 38 ]; then
                title="${title:0:35}..."
            fi

            # Truncate assignee if too long
            if [ ${#assignee} -gt 23 ]; then
                assignee="${assignee:0:20}..."
            fi

            # Print with colors
            printf "%-35s %-40s " "$id" "$title"
            printf "%-12b " "$(status_color "$status")"
            printf "%-10b " "$(priority_color "$priority")"
            printf "%-25s\n" "$assignee"
        done

        echo ""
        echo "Total: ${#TASKS[@]} task(s)"
        ;;
esac
```

## File: scripts/mc
size: 25219
sha: 224a8fe78f3bb6770977c372e804799e9b33c4f0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/mc

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/mc

## File: scripts/mc-install.sh
size: 197
sha: 3ecea62d7bfc1971c653cdec63dfa381dc5e4a4c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/mc-install.sh

```text
#!/usr/bin/env bash
set -euo pipefail
MC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
ln -sf "$MC_DIR/scripts/mc" /usr/local/bin/mc
echo "✅ mc installed to /usr/local/bin/mc"
echo "   Run: mc --help"
```

## File: scripts/mc-task.sh
size: 1615
sha: 26ccb4342b3472b0d9f016c015acefea02dafecc
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/mc-task.sh

```text
#!/bin/bash
# mc-task.sh - Create/update Mission Control tasks from CLI
# Usage: ./mc-task.sh create "Task title" "Description" [assignee]
# Usage: ./mc-task.sh update <task-id> <status> [result]

MC_URL="${MC_SERVER_URL:-http://localhost:3000}"
MC_DIR="${MISSION_CONTROL_DIR:-/root/.openclaw/workspace/agents/tank/mission-control/.mission-control}"

create_task() {
    local title="$1"
    local description="$2"
    local assignee="${3:-unassigned}"
    local task_id="task-$(date +%Y%m%d)-$(date +%s)"
    
    cat > "$MC_DIR/tasks/$task_id.json" << EOF
{
  "id": "$task_id",
  "title": "$title",
  "description": "$description",
  "status": "pending",
  "priority": "normal",
  "assignee": "$assignee",
  "createdAt": "$(date -Iseconds)",
  "createdBy": "agent",
  "mentions": ["$assignee"],
  "progress": 0
}
EOF
    echo "Created: $task_id"
}

update_task() {
    local task_id="$1"
    local status="$2"
    local result="${3:-}"
    local task_file="$MC_DIR/tasks/$task_id.json"
    
    if [ ! -f "$task_file" ]; then
        echo "Task not found: $task_id"
        exit 1
    fi
    
    # Update status using jq if available, else sed
    if command -v jq &> /dev/null; then
        jq ".status = \"$status\" | .updatedAt = \"$(date -Iseconds)\"" "$task_file" > "$task_file.tmp" && mv "$task_file.tmp" "$task_file"
    else
        sed -i "s/\"status\": \"[^\"]*\"/\"status\": \"$status\"/" "$task_file"
    fi
    echo "Updated: $task_id -> $status"
}

case "$1" in
    create) create_task "$2" "$3" "$4" ;;
    update) update_task "$2" "$3" "$4" ;;
    *) echo "Usage: $0 {create|update} ..." ;;
esac
```

## File: scripts/mc-telegram-task.sh
size: 793
sha: 1dff302020ea0ebc0fed5c40449a0993de44143b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/mc-telegram-task.sh

```text
#!/bin/bash
# mc-telegram-task.sh - Create Mission Control task from Telegram message
# Called by agents when they receive a task assignment
#
# Usage: ./mc-telegram-task.sh "from_user" "message_text" [chat_id] [message_id]
#
# Examples:
#   ./mc-telegram-task.sh "User" "@MyAgentBot fix the bug"
#   ./mc-telegram-task.sh "User" "@AgentBot review" "-123456789" "456"

MC_URL="${MC_SERVER_URL:-http://localhost:3000}"

FROM="${1:-User}"
MESSAGE="${2:?Message required}"
CHAT_ID="${3:-0}"
MESSAGE_ID="${4:-0}"

curl -s -X POST "${MC_URL}/api/telegram/task" \
  -H "Content-Type: application/json" \
  -d "{
    \"from\": \"${FROM}\",
    \"message\": \"${MESSAGE}\",
    \"chat_id\": \"${CHAT_ID}\",
    \"message_id\": \"${MESSAGE_ID}\",
    \"timestamp\": \"$(date -Iseconds)\"
  }"

echo ""
```

## File: scripts/report-context.sh
size: 947
sha: 4b6ecc772df316529dd753445c4e561465a7f6b2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/report-context.sh

```text
#!/bin/bash
# report-context.sh — agent reports context window usage to local Mission Control
# Called from OpenClaw heartbeat or cron.
#
# Usage: ./scripts/report-context.sh <agent_id> <tokens_used> <tokens_total> [model]
#
# Example (from OpenClaw heartbeat via exec tool):
#   ./scripts/report-context.sh oracle 45000 200000 claude-sonnet-4-6
#
# Or use environment variables:
#   export MC_AGENT_ID=oracle
#   export MC_CONTEXT_USED=45000
#   export MC_CONTEXT_TOTAL=200000
#   ./scripts/report-context.sh

AGENT_ID="${1:-${MC_AGENT_ID:-agent}}"
USED="${2:-${MC_CONTEXT_USED:-0}}"
TOTAL="${3:-${MC_CONTEXT_TOTAL:-200000}}"
MODEL="${4:-${MC_MODEL:-unknown}}"
MC_PORT="${MC_PORT:-3001}"
MC_SERVER="${MC_SERVER_URL:-http://localhost:$MC_PORT}"

curl -s -X POST "$MC_SERVER/api/agents/$AGENT_ID/context" \
  -H "Content-Type: application/json" \
  -d "{\"used\":$USED,\"total\":$TOTAL,\"model\":\"$MODEL\"}" \
  --max-time 5 > /dev/null

exit 0
```

## File: scripts/safe-deploy.sh
size: 8999
sha: 3b22e1f3b17e1473e44be90a43453f22188d227c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/safe-deploy.sh

```text
#!/bin/bash
#
# safe-deploy.sh - Deploy Mission Control with data protection
#
# Usage:
#   ./scripts/safe-deploy.sh                    # Deploy current state (preserves data)
#   ./scripts/safe-deploy.sh --backup           # Create backup only
#   ./scripts/safe-deploy.sh --restore BACKUP   # Restore from backup
#   ./scripts/safe-deploy.sh --demo             # Deploy with demo data (WARNING: destructive)
#   ./scripts/safe-deploy.sh --pull             # Safe git pull (backs up first)
#
# RULE: User data is NEVER overwritten without explicit --demo flag
#

set -e

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(dirname "$SCRIPT_DIR")"
MC_DIR="$REPO_ROOT/.mission-control"
BACKUP_DIR="$REPO_ROOT/.backups"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)

# Ensure backup directory exists
mkdir -p "$BACKUP_DIR"

print_banner() {
    echo -e "${CYAN}"
    echo "╔═══════════════════════════════════════════════════════════════╗"
    echo "║         Mission Control - Safe Deployment Tool                ║"
    echo "╚═══════════════════════════════════════════════════════════════╝"
    echo -e "${NC}"
}

# Create backup of all user data
create_backup() {
    local backup_name="${1:-data-backup-$TIMESTAMP}"
    local backup_path="$BACKUP_DIR/$backup_name.tar.gz"
    
    echo -e "${CYAN}📦 Creating backup: $backup_name${NC}"
    
    # Count what we're backing up
    local agent_count=$(find "$MC_DIR/agents" -name "*.json" 2>/dev/null | wc -l)
    local task_count=$(find "$MC_DIR/tasks" -name "*.json" 2>/dev/null | wc -l)
    local human_count=$(find "$MC_DIR/humans" -name "*.json" 2>/dev/null | wc -l)
    local msg_count=$(find "$MC_DIR/messages" -name "*.json" 2>/dev/null | wc -l)
    
    echo "   Agents: $agent_count | Tasks: $task_count | Humans: $human_count | Messages: $msg_count"
    
    # Create tarball of user data directories
    tar -czf "$backup_path" \
        -C "$REPO_ROOT" \
        .mission-control/agents \
        .mission-control/tasks \
        .mission-control/humans \
        .mission-control/messages \
        .mission-control/config.yaml \
        .mission-control/config \
        2>/dev/null || true
    
    echo -e "${GREEN}✅ Backup created: $backup_path${NC}"
    echo "$backup_path"
}

# Restore from backup
restore_backup() {
    local backup_path="$1"
    
    if [ ! -f "$backup_path" ]; then
        # Try finding in backup dir
        if [ -f "$BACKUP_DIR/$backup_path" ]; then
            backup_path="$BACKUP_DIR/$backup_path"
        elif [ -f "$BACKUP_DIR/$backup_path.tar.gz" ]; then
            backup_path="$BACKUP_DIR/$backup_path.tar.gz"
        else
            echo -e "${RED}❌ Backup not found: $backup_path${NC}"
            echo "Available backups:"
            ls -la "$BACKUP_DIR"/*.tar.gz 2>/dev/null || echo "  (none)"
            exit 1
        fi
    fi
    
    echo -e "${YELLOW}⚠️  Restoring from: $backup_path${NC}"
    echo -e "${YELLOW}   This will REPLACE current data with backup contents.${NC}"
    read -p "Continue? (y/N) " -n 1 -r
    echo
    
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo "Cancelled."
        exit 0
    fi
    
    # Backup current state first
    echo -e "${CYAN}Creating pre-restore backup...${NC}"
    create_backup "pre-restore-backup-$TIMESTAMP"
    
    # Extract backup
    echo -e "${CYAN}Restoring data...${NC}"
    tar -xzf "$backup_path" -C "$REPO_ROOT"
    
    echo -e "${GREEN}✅ Data restored from backup${NC}"
}

# Safe git pull (backs up data first)
safe_pull() {
    echo -e "${CYAN}🔄 Safe Git Pull${NC}"
    
    # Check for uncommitted changes
    if ! git -C "$REPO_ROOT" diff --quiet; then
        echo -e "${YELLOW}⚠️  You have uncommitted changes:${NC}"
        git -C "$REPO_ROOT" status --short
        echo ""
        read -p "Stash changes and continue? (y/N) " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 0
        fi
        git -C "$REPO_ROOT" stash
    fi
    
    # Create backup
    local backup_path=$(create_backup "pre-pull-backup-$TIMESTAMP")
    
    # Pull
    echo -e "${CYAN}Pulling latest changes...${NC}"
    git -C "$REPO_ROOT" pull
    
    echo ""
    echo -e "${GREEN}✅ Pull complete. Your data is preserved.${NC}"
    echo -e "   Backup: $backup_path"
    echo ""
    echo -e "${YELLOW}NOTE: If anything looks wrong, restore with:${NC}"
    echo "   ./scripts/safe-deploy.sh --restore pre-pull-backup-$TIMESTAMP"
}

# Deploy with demo data (DESTRUCTIVE)
deploy_demo() {
    echo -e "${RED}"
    echo "╔═══════════════════════════════════════════════════════════════╗"
    echo "║  ⚠️  WARNING: DESTRUCTIVE OPERATION                            ║"
    echo "║                                                               ║"
    echo "║  This will REPLACE all your data with demo data!             ║"
    echo "╚═══════════════════════════════════════════════════════════════╝"
    echo -e "${NC}"
    
    # Count existing data
    local agent_count=$(find "$MC_DIR/agents" -name "*.json" 2>/dev/null | wc -l)
    local task_count=$(find "$MC_DIR/tasks" -name "*.json" 2>/dev/null | wc -l)
    
    if [ "$agent_count" -gt 0 ] || [ "$task_count" -gt 0 ]; then
        echo -e "${YELLOW}You have existing data:${NC}"
        echo "   Agents: $agent_count"
        echo "   Tasks: $task_count"
        echo ""
        echo "Type 'DEMO' to confirm replacement: "
        read -r confirm
        
        if [ "$confirm" != "DEMO" ]; then
            echo "Cancelled."
            exit 0
        fi
        
        # Backup first
        create_backup "pre-demo-backup-$TIMESTAMP"
    fi
    
    # Clear existing data
    echo -e "${CYAN}Clearing existing data...${NC}"
    rm -f "$MC_DIR/agents/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/tasks/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/humans/"*.json 2>/dev/null || true
    rm -f "$MC_DIR/messages/"*.json 2>/dev/null || true
    
    # Copy demo data
    echo -e "${CYAN}Loading demo data...${NC}"
    cp "$REPO_ROOT/examples/demo-data/agents/"*.json "$MC_DIR/agents/" 2>/dev/null || true
    cp "$REPO_ROOT/examples/demo-data/tasks/"*.json "$MC_DIR/tasks/" 2>/dev/null || true
    cp "$REPO_ROOT/examples/demo-data/humans/"*.json "$MC_DIR/humans/" 2>/dev/null || true
    cp "$REPO_ROOT/examples/demo-data/messages/"*.json "$MC_DIR/messages/" 2>/dev/null || true
    
    # Mark as demo
    touch "$MC_DIR/.demo-loaded"
    
    echo -e "${GREEN}✅ Demo data loaded${NC}"
}

# Show usage
show_help() {
    echo "Usage: $0 [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  --backup           Create backup of current data"
    echo "  --restore BACKUP   Restore from a backup file"
    echo "  --pull             Safe git pull (backs up first)"
    echo "  --demo             Load demo data (DESTRUCTIVE - requires confirmation)"
    echo "  --list             List available backups"
    echo "  --help             Show this help"
    echo ""
    echo "Default behavior: Creates a backup (safe operation)"
    echo ""
    echo "Examples:"
    echo "  $0 --pull                              # Update code safely"
    echo "  $0 --restore data-backup-20260210      # Restore specific backup"
    echo "  $0 --list                              # See all backups"
}

# List backups
list_backups() {
    echo -e "${CYAN}Available backups:${NC}"
    echo ""
    if ls "$BACKUP_DIR"/*.tar.gz 1>/dev/null 2>&1; then
        for f in "$BACKUP_DIR"/*.tar.gz; do
            local size=$(du -h "$f" | cut -f1)
            local name=$(basename "$f")
            echo "  $name ($size)"
        done
    else
        echo "  (no backups found)"
    fi
}

# Main
print_banner

case "${1:-}" in
    --backup)
        create_backup
        ;;
    --restore)
        if [ -z "${2:-}" ]; then
            echo -e "${RED}❌ Please specify a backup to restore${NC}"
            list_backups
            exit 1
        fi
        restore_backup "$2"
        ;;
    --pull)
        safe_pull
        ;;
    --demo)
        deploy_demo
        ;;
    --list)
        list_backups
        ;;
    --help|-h)
        show_help
        ;;
    "")
        # Default: just create a backup
        create_backup
        echo ""
        echo "Run with --help for more options"
        ;;
    *)
        echo -e "${RED}Unknown option: $1${NC}"
        show_help
        exit 1
        ;;
esac
```

## File: scripts/update-mission-control.sh
size: 2598
sha: dec14b67066a52dab61df4815a8d03e5ee5468d4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/update-mission-control.sh

```text
#!/bin/bash
# update-mission-control.sh - Download and apply Mission Control updates
#
# Usage: ./scripts/update-mission-control.sh [--force]
#
# Options:
#   --force    Skip confirmation prompt
#
# Requires: MISSIONDECK_API_KEY environment variable or config.json

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
MC_ROOT="$(dirname "$SCRIPT_DIR")"

FORCE=false
if [ "$1" = "--force" ]; then
  FORCE=true
fi

# Get API key
API_KEY="${MISSIONDECK_API_KEY:-}"
if [ -z "$API_KEY" ] && [ -f "$MC_ROOT/.mission-control/config.json" ]; then
  API_KEY=$(grep -o '"apiKey"[[:space:]]*:[[:space:]]*"[^"]*"' "$MC_ROOT/.mission-control/config.json" 2>/dev/null | head -1 | cut -d'"' -f4)
fi

if [ -z "$API_KEY" ]; then
  echo "❌ No MissionDeck API key configured"
  echo "   Set MISSIONDECK_API_KEY or add to .mission-control/config.json"
  exit 1
fi

API_BASE="${MISSIONDECK_API_BASE:-https://missiondeck.ai/api/distribution}"

# Get latest version info
echo "🔍 Checking latest version..."
VERSION_INFO=$(curl -s -H "x-api-key: $API_KEY" "$API_BASE/version")
LATEST=$(echo "$VERSION_INFO" | grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)

if [ -z "$LATEST" ]; then
  echo "❌ Could not get version info"
  exit 1
fi

echo "   Latest version: $LATEST"

# Confirm update
if [ "$FORCE" != "true" ]; then
  echo ""
  read -p "📦 Download and apply update? (y/N) " -n 1 -r
  echo ""
  if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "Cancelled."
    exit 0
  fi
fi

# Create backup
BACKUP_DIR="$MC_ROOT/../mission-control-backup-$(date +%Y%m%d-%H%M%S)"
echo ""
echo "💾 Creating backup at: $BACKUP_DIR"
cp -r "$MC_ROOT" "$BACKUP_DIR"

# Download update
TEMP_ZIP="/tmp/mission-control-$LATEST.zip"
echo "⬇️  Downloading Mission Control $LATEST..."
curl -s -H "x-api-key: $API_KEY" "$API_BASE/download/latest" -o "$TEMP_ZIP"

if [ ! -f "$TEMP_ZIP" ] || [ ! -s "$TEMP_ZIP" ]; then
  echo "❌ Download failed"
  exit 1
fi

# Extract (preserve local data)
echo "📂 Extracting update..."
cd "$MC_ROOT"

# Extract everything except local data
unzip -o "$TEMP_ZIP" -x ".mission-control/agents/*" ".mission-control/tasks/*" ".mission-control/humans/*" ".mission-control/messages/*" ".mission-control/config.json" ".mission-control/logs/*" 2>/dev/null || true

# Update VERSION file
echo "$LATEST" > VERSION

# Cleanup
rm -f "$TEMP_ZIP"

echo ""
echo "✅ Updated to Mission Control $LATEST!"
echo ""
echo "📋 What's new: Check CHANGELOG.md"
echo "🔙 Backup at: $BACKUP_DIR"
echo ""
echo "Note: Your local data (.mission-control/agents, tasks, etc.) was preserved."
```

## File: scripts/validate.sh
size: 9250
sha: fb45c2ae10d6de672c1c301bdb291b84ec1e1f5d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/validate.sh

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts/validate.sh

## File: .claude/rules.md
size: 6537
sha: dcc44386d9ce2cb235e3fee2e250a5891cadf7ce
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/rules.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/rules.md

## File: .claude/skills/architecture.md
size: 3495
sha: d2aa6d9a5a59613fe6c6fe0affad16dfc38dde85
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/architecture.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/architecture.md

## File: .claude/skills/coding-patterns.md
size: 4465
sha: 49775765f77fb38abf3e650a91716918aefe911a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/coding-patterns.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/coding-patterns.md

## File: .claude/skills/deploy.md
size: 2858
sha: e4f637e0febd634e8b9f525e3f48468f464caebf
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/deploy.md

````text
# Deploy Guide — JARVIS Mission Control

## Production Environment

- **Server:** zion.asif.dev (this IS the local machine — no SSH needed)
- **Local URL:** http://localhost:3000
- **External URL:** https://zion.asif.dev (nginx proxy, basic auth protected)
- **Process:** PM2 (`mission-control-server`)
- **Repo path:** `/root/.openclaw/workspace/agents/tank/mission-control/`

⚠️ **zion.asif.dev is PRIVATE** — never share it publicly, never put it in docs/READMEs.
**Public demo:** https://missiondeck.ai/mission-control/demo

## Standard Deploy (after merge to main)

```bash
cd /root/.openclaw/workspace/agents/tank/mission-control

# Safe pull (backs up .mission-control/ first, then pulls)
./scripts/safe-deploy.sh --pull

# Restart PM2
pm2 restart mission-control-server

# Verify
pm2 status mission-control-server
curl http://localhost:3000/api/metrics
```

## Deploy Checklist

- [ ] PR merged to `main` by Oracle
- [ ] `./scripts/safe-deploy.sh --pull` (NOT raw `git pull`)
- [ ] `pm2 restart mission-control-server`
- [ ] Check `pm2 logs mission-control-server` for errors
- [ ] Verify `http://localhost:3000` responds
- [ ] Update CHANGELOG.md if version bump

## Backup & Restore

```bash
# Create named backup before risky changes
./scripts/safe-deploy.sh --backup pre-v2.1.0

# List backups
ls .mission-control-backups/

# Restore
./scripts/safe-deploy.sh --restore pre-v2.1.0
```

## PM2 Commands

```bash
pm2 status                           # All processes
pm2 status mission-control-server    # This process only
pm2 restart mission-control-server   # Restart (preserves env)
pm2 logs mission-control-server      # View logs
pm2 logs mission-control-server --lines 50  # Last 50 lines
pm2 delete mission-control-server    # Kill it
pm2 start ecosystem.config.cjs       # Start from ecosystem config (full env reload)
```

## Environment Variables

Stored in `ecosystem.config.cjs` — do not hardcode in source files.

Key vars:
- `PORT` — server port (default 3000)
- `TELEGRAM_BOT_TOKEN` — Telegram bridge token
- `MISSIONDECK_API_KEY` — MissionDeck sync key
- `BASIC_AUTH_USER` / `BASIC_AUTH_PASS` — external access credentials (see credentials file)

## nginx Config

nginx proxies `zion.asif.dev` → `localhost:3000`. Do not touch the nginx config unless explicitly asked. If the server needs a restart:

```bash
systemctl reload nginx
```

## Version Bump Process

1. Update `VERSION` file with new semver
2. Update `CHANGELOG.md` with changes
3. Update version in `package.json`
4. Commit: `[agent:tank] chore: bump version to X.Y.Z`
5. Open PR → tag Oracle → wait for merge
6. After merge: deploy as above

## Rollback

If deploy breaks production:

```bash
# Immediate rollback
./scripts/safe-deploy.sh --restore BACKUP_NAME
pm2 restart mission-control-server
```

Then report to Oracle with what happened.
````

## File: .claude/skills/git-rules.md
size: 1859
sha: ba13e207dfa754804a8046ba18c040a5ecc74eea
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/git-rules.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/skills/git-rules.md

## File: .claude/testing-rules.md
size: 5854
sha: 59980323beaf2e16355f895a041b1a74e9016799
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/testing-rules.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.claude/testing-rules.md

## File: .clawhubignore
size: 401
sha: e6ceb5f38c057eb22eaf3a293cce0c8275331988
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.clawhubignore

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.clawhubignore

## File: .clawhubsafe
size: 382
sha: 5e8c09a9494d5b2b628794ce8ce6ff0e91661e15
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.clawhubsafe

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.clawhubsafe

## File: .context/DECISIONS.md
size: 7661
sha: 4eb74ab1e907913ca68256ca6c1e81405d5a22d2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context/DECISIONS.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context/DECISIONS.md

## File: .context/PROJECT_CONTEXT.md
size: 12328
sha: 153264cf47211be71592884a050776874abddb30
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context/PROJECT_CONTEXT.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context/PROJECT_CONTEXT.md

## File: .env.example
size: 1007
sha: 6a5e3903bcc5f5019533d149612ea51870f35e2c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.env.example

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.env.example

## File: .github/ISSUE_TEMPLATE/bug_report_auto_task_spam.md
size: 5161
sha: 8da96456db66f006ec3e2fe28110599ab8806f10
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github/ISSUE_TEMPLATE/bug_report_auto_task_spam.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github/ISSUE_TEMPLATE/bug_report_auto_task_spam.md

## File: .github/workflows/deploy.yml
size: 2460
sha: eab157b5896c1cbb48749531727a439cf5a23826
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github/workflows/deploy.yml

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github/workflows/deploy.yml

## File: .gitignore
size: 1126
sha: d276052dc3db72261e9e72995908c09ac6d633a1
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.gitignore

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.gitignore

## File: .mission-control/.gitignore
size: 967
sha: eb10e7d238a9000bc2398ebc7746c30e97593f5e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/.gitignore

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/.gitignore

## File: .mission-control/agents/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/agents/.gitkeep

```text

```

## File: .mission-control/checklists/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/checklists/.gitkeep

```text

```

## File: .mission-control/config.yaml
size: 6257
sha: bbb8d115202f6d9f9abed12002016e2f6e254ca4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/config.yaml

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/config.yaml

## File: .mission-control/hooks/on-agent-complete.sh
size: 2358
sha: 2d0d4923b2651c7c02b7426a5efb3b1135ef7b13
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-complete.sh

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-complete.sh

## File: .mission-control/hooks/on-agent-error.sh
size: 2249
sha: 145696d740591d330a055d5d8b48b4935511f0d3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-error.sh

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-error.sh

## File: .mission-control/hooks/on-agent-start.sh
size: 2889
sha: 5d3d8a17e4a57ea3a7941f4ed9c34de29a8b09f9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-start.sh

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-agent-start.sh

## File: .mission-control/hooks/on-tool-use.sh
size: 2746
sha: 117cdbfb0f377d9f3c5c149d21f0d444eeda2f07
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-tool-use.sh

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/hooks/on-tool-use.sh

## File: .mission-control/humans/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/humans/.gitkeep

```text

```

## File: .mission-control/integrations/events.schema.json
size: 3081
sha: d0318ecec2430efacc019bebbdcf076f982cf0dd
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/events.schema.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/events.schema.json

## File: .mission-control/integrations/telegram.example.yaml
size: 2360
sha: 1a78ceb73b9dc534542a5c61cecb993d45ebdcdc
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/telegram.example.yaml

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/telegram.example.yaml

## File: .mission-control/integrations/webhooks.yaml
size: 2048
sha: 63ae9d1b97c8f53824babe776bc1cd62630e36db
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/webhooks.yaml

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/integrations/webhooks.yaml

## File: .mission-control/messages/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/messages/.gitkeep

```text

```

## File: .mission-control/queue/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/queue/.gitkeep

```text

```

## File: .mission-control/quotas/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/quotas/.gitkeep

```text

```

## File: .mission-control/resources/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/resources/.gitkeep

```text

```

## File: .mission-control/schema/agent.schema.json
size: 3700
sha: 16a901efb9a3ddd1e89498c7c53a2e28cc1b8dad
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/agent.schema.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/agent.schema.json

## File: .mission-control/schema/task.schema.json
size: 4521
sha: 507fc4b841808047631169f86fda2b32c753b88b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/task.schema.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/task.schema.json

## File: .mission-control/schema/workflow.schema.json
size: 3457
sha: f11d127c95307f3ecf6f33ae7aeda17f25fab787
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/workflow.schema.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/schema/workflow.schema.json

## File: .mission-control/STATE.md
size: 3337
sha: b1e3f3dab04697aba4852dfdca1d5f1968ba578d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/STATE.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/STATE.md

## File: .mission-control/tasks/.gitkeep
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/tasks/.gitkeep

```text

```

## File: .mission-control/workflows/.gitkeep
size: 70
sha: 7e8b22b30edeff3bb87d30e7df47c858343185f9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control/workflows/.gitkeep

```text
# Workflows directory
# Store workflow definitions here as JSON files
```

## File: .nojekyll
size: 0
sha: e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.nojekyll

```text

```

## File: CHANGELOG.md
size: 16190
sha: 2273b88e6319b3a257105c230b3e7cf056233e32
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/CHANGELOG.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/CHANGELOG.md

## File: CLAUDE.md
size: 49383
sha: 16f275b212c0eab0f7ffed6a9da4357fc2487b57
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/CLAUDE.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/CLAUDE.md

## File: cli/mc.js
size: 14970
sha: 4a8f2bdbd18c3e1205f9dad90e074efdec9e7758
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli/mc.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli/mc.js

## File: cli/package.json
size: 357
sha: aab68e6729096a945c9840142eab4cc5e231cbc6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli/package.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli/package.json

## File: dashboard/css/events-feed.css
size: 5788
sha: f0da032dd5f956bbfa90a2a78ddea448cb844c0b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/events-feed.css

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/events-feed.css

## File: dashboard/css/jarvis-hud.css
size: 11613
sha: 1802341c59cc15ac70f446edb31b2f4cd975dd9e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/jarvis-hud.css

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/jarvis-hud.css

## File: dashboard/css/mobile.css
size: 18406
sha: 47cc1c407858dfd5180d1a890790b5b899e971f6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/mobile.css

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/mobile.css

## File: dashboard/css/styles.css
size: 128674
sha: 6615036df0532b215ecda91fcf049ad6929493c4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/styles.css

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/styles.css

## File: dashboard/css/themes.css
size: 15018
sha: bced51104b53d584d2f9ef2f2473fdd23204f01a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/themes.css

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/css/themes.css

## File: dashboard/index.html
size: 97433
sha: 85621566728599b817d33d40c87dc6e0daad6dfc
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/index.html

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/index.html

## File: dashboard/js/api.js
size: 15884
sha: 565ef0c39320b0182ab7b513dddd35894fab6c00
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/api.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/api.js

## File: dashboard/js/app.js
size: 120868
sha: f1443a3234cf2af160eb03dc438b2e65f0e739f8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/app.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/app.js

## File: dashboard/js/claude-sessions.js
size: 8997
sha: c2c0fa980fe545b05d829fb11fed31193ae3eeb0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/claude-sessions.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/claude-sessions.js

## File: dashboard/js/cli-connections.js
size: 7809
sha: 5a47b5ec777e937807b2de7b818652f02b343c30
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/cli-connections.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/cli-connections.js

## File: dashboard/js/cli.js
size: 4316
sha: e9d0a8c5a5f4c75d79d44737dcea1505ff1c842d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/cli.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/cli.js

## File: dashboard/js/dashboard-widgets.js
size: 6585
sha: b7cd6d0e6bf533b78df9eef17961ab48a9882b46
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/dashboard-widgets.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/dashboard-widgets.js

## File: dashboard/js/data.js
size: 52583
sha: 68a8ea44f5d5c067de1991fa7df41c3778608891
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/data.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/data.js

## File: dashboard/js/events-feed.js
size: 9885
sha: 3d2b7489289dd5d032c3aff296b6328636b349b3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/events-feed.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/events-feed.js

## File: dashboard/js/github-issues.js
size: 6191
sha: c63ef25cded16501e3e9af84cadd8116800fc68e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/github-issues.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/github-issues.js

## File: dashboard/js/jarvis-hud.js
size: 14633
sha: 2b14ad49ff9c2c8547d7016abe0b24992a2e709a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/jarvis-hud.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/jarvis-hud.js

## File: dashboard/js/jarvis-voice.js
size: 5279
sha: 214cef8edf403e7e9398726adb3a1ea2e492357f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/jarvis-voice.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/jarvis-voice.js

## File: dashboard/js/openclaw-sessions.js
size: 8676
sha: 7d3f69d52e5506f0c2a3e29132aaf876a6b742a3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/openclaw-sessions.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/openclaw-sessions.js

## File: dashboard/js/smart-panels.js
size: 18029
sha: a348d5d66ce97a3ed8edab4da8a469752f69d2d6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/smart-panels.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/smart-panels.js

## File: dashboard/js/soul-files.js
size: 6132
sha: addeb42a257766c6d1847923f76367bec0cdbe55
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/soul-files.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/soul-files.js

## File: dashboard/js/update-banner.js
size: 2172
sha: 10db0f99f08198b979b3c60c2b193f8951273313
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/update-banner.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/update-banner.js

## File: dashboard/js/webhooks.js
size: 10682
sha: 21277959a9713ead456082078e4ccb7d0db20d5e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/webhooks.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/js/webhooks.js

## File: dashboard/robots.txt
size: 26
sha: 1f53798bb4fe33c86020be7f10c44f29486fd190
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/robots.txt

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard/robots.txt

## File: DEPLOYMENT-RULES.md
size: 3579
sha: 14ec52f1bef17323ee90790a4c75f37d32afed0f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/DEPLOYMENT-RULES.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/DEPLOYMENT-RULES.md

## File: docs/AGENT-BRIDGE.md
size: 6024
sha: 4329ef059159c3976b4e230794b23bebc81d94aa
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/AGENT-BRIDGE.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/AGENT-BRIDGE.md

## File: docs/AGENT_ADOPTION.md
size: 8576
sha: 04738d6a7da342d162207c2c43dd2510b6722708
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/AGENT_ADOPTION.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/AGENT_ADOPTION.md

## File: docs/api-reference.md
size: 10430
sha: 788c7fa7fb894845b8c4f5fd5ee4b69bd91c9e91
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/api-reference.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/api-reference.md

## File: docs/architecture.md
size: 15131
sha: 5affc85fcd73266026bc0925bea2dd02c8c9247a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/architecture.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/architecture.md

## File: docs/archive/AGENT-BRIDGE-CLEANUP-LOG.md
size: 2540
sha: 6ad92f24f31e06a603f7bbe8bd920bf64546bc56
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/AGENT-BRIDGE-CLEANUP-LOG.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/AGENT-BRIDGE-CLEANUP-LOG.md

## File: docs/archive/FEATURE-SPEC-v2.md
size: 9558
sha: 264323469dfb8fb65aa8726823e67118ac34a077
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/FEATURE-SPEC-v2.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/FEATURE-SPEC-v2.md

## File: docs/archive/ISSUE-auto-sync.md
size: 3425
sha: 08643d9413e9dd2ed1bbfc7983e172b9f421e8ab
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/ISSUE-auto-sync.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/ISSUE-auto-sync.md

## File: docs/archive/ISSUE-data-loss-resolved.md
size: 2222
sha: 764e3110ec32e8d2d5883820724a1ceae51fd905
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/ISSUE-data-loss-resolved.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/ISSUE-data-loss-resolved.md

## File: docs/archive/PROPOSAL-v0.8.0.md
size: 20482
sha: 508e6ea7bfbddf58a3b88692be8ee6b06db8a8c5
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/PROPOSAL-v0.8.0.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/PROPOSAL-v0.8.0.md

## File: docs/archive/SECURITY-FIX-PLAN.md
size: 2422
sha: cf221ca93c204c68c6d05f1f36ad61f68fc6a6e4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SECURITY-FIX-PLAN.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SECURITY-FIX-PLAN.md

## File: docs/archive/SECURITY-VALIDATION-2026-03-03.md
size: 5893
sha: 0946474df695a57d05d8c65d832790c561d10ab8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SECURITY-VALIDATION-2026-03-03.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SECURITY-VALIDATION-2026-03-03.md

## File: docs/archive/SPRINT-DAY1.md
size: 6492
sha: 9ec9bb695eff4dd7838e70364edc588afec05427
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SPRINT-DAY1.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/archive/SPRINT-DAY1.md

## File: docs/DEVELOPMENT_GUIDE.md
size: 15869
sha: 9eb567d01e1123c70451a8be471d4d20ab22c5f0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/DEVELOPMENT_GUIDE.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/DEVELOPMENT_GUIDE.md

## File: docs/examples/example-agent-specialist.json
size: 964
sha: d60aa2a56cb972e2ca5fc8c177f27950a5540b76
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/examples/example-agent-specialist.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/examples/example-agent-specialist.json

## File: docs/examples/example-workflow.json
size: 2057
sha: 640959df2dcc154317bbb90d0fc6be0993ec2f0b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/examples/example-workflow.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/examples/example-workflow.json

## File: docs/openclaw-integration.md
size: 8790
sha: 97b9f8f143fb1e80135e899422749dec75c764c9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/openclaw-integration.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/openclaw-integration.md

## File: docs/RESOURCE-MANAGEMENT.md
size: 6563
sha: 75b6f9a215404075e2bf5f0a52354fdcec73fede
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/RESOURCE-MANAGEMENT.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/RESOURCE-MANAGEMENT.md

## File: docs/SECURITY.md
size: 8977
sha: f026eb4a8b94d1b2636c28e370ece4eafb205fd2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/SECURITY.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/SECURITY.md

## File: docs/TELEGRAM-INTEGRATION.md
size: 4027
sha: 260db2f35b8db25ad50bdb9e0eab07d6fe56c300
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/TELEGRAM-INTEGRATION.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs/TELEGRAM-INTEGRATION.md

## File: ecosystem.config.cjs
size: 490
sha: 85ba9046ace5b6a7f2a6f13b46d14c17ec533f7d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/ecosystem.config.cjs

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/ecosystem.config.cjs

## File: examples/config/agents.json
size: 258
sha: c35ffebf6b22204afadb149a8468cdb3032ef237
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/config/agents.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/config/agents.json

## File: examples/demo-data/agents/agent-architect.json
size: 1401
sha: ec349768d4577022319762508d98c0da66b33448
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-architect.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-architect.json

## File: examples/demo-data/agents/agent-casey-feb.json
size: 864
sha: 2c87eb1107aa8cb3130d43ae3d480578ed17892d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-casey-feb.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-casey-feb.json

## File: examples/demo-data/agents/agent-jarvis.json
size: 1643
sha: 13680f12bfe4e7b1553c0d2f09dbaf78c330165a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-jarvis.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-jarvis.json

## File: examples/demo-data/agents/agent-jordan-feb.json
size: 847
sha: 7177ead51e8d5832869bba064c9b074b73fa0ec4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-jordan-feb.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-jordan-feb.json

## File: examples/demo-data/agents/agent-morgan-feb.json
size: 876
sha: 73f81c0f11be3938a2c356b70fb75cbc6ef389d3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-morgan-feb.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-morgan-feb.json

## File: examples/demo-data/agents/agent-neo.json
size: 1314
sha: 16e42c8acf4078bfcd05de520c46db2476c78cd2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-neo.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-neo.json

## File: examples/demo-data/agents/agent-sam-feb.json
size: 873
sha: 3547b330714b4b58553635c30689213707a4f5b5
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-sam-feb.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-sam-feb.json

## File: examples/demo-data/agents/agent-trinity.json
size: 1325
sha: 1cbae51aa76c86018960082e26d441f6c9a8b7b7
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-trinity.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/agents/agent-trinity.json

## File: examples/demo-data/humans/architect.json
size: 629
sha: 9034e6a41a57259f4872431dc7c4e54df4dc26a5
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/architect.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/architect.json

## File: examples/demo-data/humans/human-alex-feb.json
size: 361
sha: db8b2c7c855aa85f47effe7ea94962725cdeffc3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/human-alex-feb.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/human-alex-feb.json

## File: examples/demo-data/humans/human-nobin.json
size: 749
sha: 98f2e3752802e9ae66e99453a9aad1eb2aa98d93
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/human-nobin.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/humans/human-nobin.json

## File: examples/demo-data/messages/msg-20260205-001.json
size: 324
sha: cc1d4e1c689c8c70cf69eb11911d02584561d3d3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-001.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-001.json

## File: examples/demo-data/messages/msg-20260205-002.json
size: 279
sha: 23523cb1b5d04b461109fc8d5f473cdcd2981d2b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-002.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-002.json

## File: examples/demo-data/messages/msg-20260205-003.json
size: 322
sha: 16904bc95fa723bb7e4c00e619704c7617bf8a98
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-003.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-003.json

## File: examples/demo-data/messages/msg-20260205-004.json
size: 336
sha: 9a08183fdbccd67ccb6893ef1257f738730ffa62
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-004.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-004.json

## File: examples/demo-data/messages/msg-20260205-010.json
size: 252
sha: 2f4498ec8e8249673cbfb66d3278952450900c76
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-010.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-010.json

## File: examples/demo-data/messages/msg-20260205-011.json
size: 342
sha: e20aa926f4acb8d69644fae855f47827ccd4f9e7
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-011.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-011.json

## File: examples/demo-data/messages/msg-20260205-012.json
size: 248
sha: 74e58bd96d2c116be6d4f41e9411d7ea0796518a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-012.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-012.json

## File: examples/demo-data/messages/msg-20260205-013.json
size: 287
sha: b017782fd37d4a3e969ff988be08286bd5beee33
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-013.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/messages/msg-20260205-013.json

## File: examples/demo-data/tasks/task-20260205-example-feature.json
size: 1591
sha: 1d034c006285baa67ebb85d5598550af1e435388
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-example-feature.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-example-feature.json

## File: examples/demo-data/tasks/task-20260205-security-audit.json
size: 1289
sha: e6b68377d1034db9a4787620f913b0aceab036b8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-security-audit.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-security-audit.json

## File: examples/demo-data/tasks/task-20260205-setup-project.json
size: 2114
sha: 4661e51a1c3d0b0991ddc8153696d72e69e4164d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-setup-project.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/demo-data/tasks/task-20260205-setup-project.json

## File: examples/local-data-templates/agent-example.json
size: 287
sha: e9419c6f74075261c924ecf8d01cd78cc0981dd8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/local-data-templates/agent-example.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/local-data-templates/agent-example.json

## File: examples/local-data-templates/task-example.json
size: 352
sha: 6d665d7bb46123729dba85e7f3072ce29c39cb5f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/local-data-templates/task-example.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/local-data-templates/task-example.json

## File: examples/templates/agent-template.json
size: 898
sha: e957475ffb6f7e58ec802c2e993ee0a35b5fee29
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/agent-template.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/agent-template.json

## File: examples/templates/checklists/checklist-code-review.json
size: 1001
sha: 22d4d6202d0fc9fdb88ffe2f3a66597933a6c2f9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/checklists/checklist-code-review.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/checklists/checklist-code-review.json

## File: examples/templates/checklists/checklist-deployment.json
size: 871
sha: 9334a13af760db2d1f64caf7f316ee80a950968d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/checklists/checklist-deployment.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/checklists/checklist-deployment.json

## File: examples/templates/human-template.json
size: 379
sha: e9c827e6d2086fc83ea743cdf0f1093796c8528a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/human-template.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/human-template.json

## File: examples/templates/message-template.json
size: 242
sha: ae3f26968748447dd63d3c413d0c084c5dea3520
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/message-template.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/message-template.json

## File: examples/templates/queue/job-agent-sync.json
size: 580
sha: 3120ca44fcc26bc69df9cadcb71258c6d3a9c33c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-agent-sync.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-agent-sync.json

## File: examples/templates/queue/job-backup.json
size: 556
sha: 2c395938e9a75b7389310967e04927c502cbcd9d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-backup.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-backup.json

## File: examples/templates/queue/job-daily-report.json
size: 570
sha: 79e6bfe568f845a382dab9dc9d5db6556547f0f0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-daily-report.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-daily-report.json

## File: examples/templates/queue/job-heartbeat-oracle.json
size: 535
sha: 1da4caee8932281347ac089b7e06f19b2ae4d2f4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-heartbeat-oracle.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/job-heartbeat-oracle.json

## File: examples/templates/queue/queue-data-sync.json
size: 637
sha: 04dfe20be71158baecc4426a95347e84e76c5e18
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/queue-data-sync.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/queue-data-sync.json

## File: examples/templates/queue/queue-health-check.json
size: 646
sha: dec8f06bd59065edc88540816b0cf40d5ac0e2ea
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/queue-health-check.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/queue/queue-health-check.json

## File: examples/templates/quotas/quota-global-tokens.json
size: 310
sha: 9056532a63a1fd829fce196980a9529a6e52e2e3
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quota-global-tokens.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quota-global-tokens.json

## File: examples/templates/quotas/quota-sam-feb-api-calls.json
size: 309
sha: f694358ae146019017bf4dae3357457215879d68
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quota-sam-feb-api-calls.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quota-sam-feb-api-calls.json

## File: examples/templates/quotas/quotas.json
size: 745
sha: 86b82042272e91e750c0edd2ad50d78bc3f9ed6f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quotas.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/quotas/quotas.json

## File: examples/templates/resources/res-anthropic-api.json
size: 710
sha: 2f290158eb73afffd90231112f6fe799048ee3bf
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-anthropic-api.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-anthropic-api.json

## File: examples/templates/resources/res-brave-search.json
size: 896
sha: 42bd56ef7faa687ab19949363d6a624b05964f03
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-brave-search.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-brave-search.json

## File: examples/templates/resources/res-compute-cluster.json
size: 740
sha: 260d543aed60cda5be62c1571193b75e0dbb069d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-compute-cluster.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-compute-cluster.json

## File: examples/templates/resources/res-elevenlabs-tts.json
size: 842
sha: 5fea4b85868ab64834b8875a7fca2cbf083e8c81
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-elevenlabs-tts.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-elevenlabs-tts.json

## File: examples/templates/resources/res-github-api.json
size: 810
sha: b3f90904d03f61e37328fc02e8bc2e4b875f84f6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-github-api.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-github-api.json

## File: examples/templates/resources/res-github-enterprise.json
size: 669
sha: 1fd774c80ff66d1535ba68773a96b4068577142a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-github-enterprise.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-github-enterprise.json

## File: examples/templates/resources/res-matrix-server.json
size: 863
sha: eeff96be79fed2463c404ad4ca3688e63852b15a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-matrix-server.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-matrix-server.json

## File: examples/templates/resources/res-openai-api.json
size: 677
sha: 02c695d3263f8728eecbe0d6836abc1392fe217a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-openai-api.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-openai-api.json

## File: examples/templates/resources/res-telegram-bot.json
size: 888
sha: ba189c571c3cf343a16f079d50fcd404d467a716
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-telegram-bot.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/resources/res-telegram-bot.json

## File: examples/templates/task-template.json
size: 406
sha: 868b30d5615b07fc870f7b2d96b0b14f5dacbde5
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/task-template.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/task-template.json

## File: examples/templates/workflows/workflow-default.json
size: 328
sha: 0e49c63d5fb782c767ffeb81109572239019d304
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/workflows/workflow-default.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/workflows/workflow-default.json

## File: examples/templates/workflows/workflow-multi-level.json
size: 506
sha: 94c9e27b4e9d3d72ffd48ecc2222037445fc640b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/workflows/workflow-multi-level.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples/templates/workflows/workflow-multi-level.json

## File: index.html
size: 280
sha: 4681cbef8d265e42d47ebc8d2314654f41a15d35
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/index.html

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/index.html

## File: INIT.md
size: 4552
sha: 60fa07c3f3d5013ef32fa10108ae15515ded6f98
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/INIT.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/INIT.md

## File: LICENSE
size: 10784
sha: aa406a27b09e9c949410c57ecdcb6898773a2b3d
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/LICENSE

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/LICENSE

## File: package-lock.json
size: 162965
sha: 32857899853e3d98145649e82564e4fc548077e0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/package-lock.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/package-lock.json

## File: package.json
size: 656
sha: 7ee2623166c155edb0a7cf07afe7af69931ad6d8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/package.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/package.json

## File: SECURITY.md
size: 6705
sha: d010ee8d4b9b31d5ea691091b728f082b7367894
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY.md

## File: server/agent-bridge.js
size: 34540
sha: f600e9c71b59176dd55cfd3c6e3cf0a94834ddcb
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/agent-bridge.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/agent-bridge.js

## File: server/agent-sync.js
size: 14537
sha: 1bcc8d8ad893950ee828cb759ee1efbf1478d360
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/agent-sync.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/agent-sync.js

## File: server/claude-sessions.js
size: 9616
sha: cdd1f251539ac237b8d5371cdec406b612550c9f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/claude-sessions.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/claude-sessions.js

## File: server/cli-connections.js
size: 3780
sha: 9d7d4b403f33928ec47bcc01716b50a9e9dd5852
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/cli-connections.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/cli-connections.js

## File: server/index.js
size: 112323
sha: 4836068def4ee0c32b733f2e8c608dca6b7badc8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/index.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/index.js

## File: server/lib/cost-tracker.js
size: 5681
sha: 2d369a67ec546030c582c91b130d77cd70cf544a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/lib/cost-tracker.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/lib/cost-tracker.js

## File: server/lib/event-logger.js
size: 4944
sha: f467afc650e4794542e844847cf61a5ea7c38480
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/lib/event-logger.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/lib/event-logger.js

## File: server/logger.js
size: 1033
sha: dc32cba5916f146fbecbccefb4a40f9d9839381f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/logger.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/logger.js

## File: server/middleware/basic-auth.js
size: 1939
sha: c06ee584d64df921611c18196eb4bc4a8a49914c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/middleware/basic-auth.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/middleware/basic-auth.js

## File: server/missiondeck-sync.js
size: 9038
sha: 7d624990d936604ebfd34e544e5eed67edc32502
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/missiondeck-sync.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/missiondeck-sync.js

## File: server/openclaw-sessions.js
size: 6913
sha: 8139425ea78ec10019217020b9107c418ead66c0
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/openclaw-sessions.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/openclaw-sessions.js

## File: server/package-lock.json
size: 66223
sha: 1be955b083935a5d23a66d1b6be7fba80e2c863b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/package-lock.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/package-lock.json

## File: server/package.json
size: 722
sha: 9d0b32376bfc5111ff6043c57de634d99fc05456
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/package.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/package.json

## File: server/resource-manager.js
size: 19755
sha: 3b8ea042d581e6535bc6397e068e95119e42d85a
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/resource-manager.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/resource-manager.js

## File: server/review-manager.js
size: 21752
sha: fedd956264955162bf178d73ba0b6602001e13cc
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/review-manager.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/review-manager.js

## File: server/start-all.js
size: 1675
sha: 5b05e0570c131c506f440253dba7403eb47ef28e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/start-all.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/start-all.js

## File: server/telegram-bridge.js
size: 5682
sha: 7232193cff33b0ff5c98b30acf31102dabe5448b
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/telegram-bridge.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/telegram-bridge.js

## File: server/webhook-delivery.js
size: 12998
sha: 7a4a09c689d9352b085ab9dbfcc07152c7a82baf
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/webhook-delivery.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server/webhook-delivery.js

## File: skill/.clawhubsafe
size: 1704
sha: 5f35ee576133d0f038c53b093e2811cf728b0847
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/.clawhubsafe

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/.clawhubsafe

## File: skill/_meta.json
size: 1985
sha: 65638b1b2236262f245e02fe34c71947c1f658b6
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/_meta.json

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/_meta.json

## File: skill/references/1-setup.md
size: 1872
sha: fe35b176c866d0e98cfc7eb86b08d729a2462ca2
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/1-setup.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/1-setup.md

## File: skill/references/2-missiondeck-connect.md
size: 3052
sha: 3a887d33a871e6ffa4b2ff72e776928a648f8c18
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/2-missiondeck-connect.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/2-missiondeck-connect.md

## File: skill/references/3-mc-cli.md
size: 2894
sha: fd7fcfd212dd7c4e16178e8b291ba1cba0712599
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/3-mc-cli.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/3-mc-cli.md

## File: skill/references/4-data-population.md
size: 3146
sha: 78976451b22f0782ac3ea671b0e1d0dc5ea1bf26
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/4-data-population.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/references/4-data-population.md

## File: skill/SECURITY.md
size: 4030
sha: c0bba08bbcf0456f678f5ebf342954ab3e036ecc
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/SECURITY.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill/SECURITY.md

## File: skills/dashboard.md
size: 4740
sha: bf16ac3a1c8226d0b10e474d7320e2b4604f0241
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/dashboard.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/dashboard.md

## File: skills/deployment.md
size: 8916
sha: c5efdbe74d2988557c83a1251f2b40f73c32f5d9
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/deployment.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/deployment.md

## File: skills/integrations.md
size: 2510
sha: 6ff931a17b5516c6390e6a67bafa343b88d6ab69
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/integrations.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/integrations.md

## File: skills/messaging.md
size: 3737
sha: 5ccac570f2d75ba4c213bad1119113e4adc92be4
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/messaging.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/messaging.md

## File: skills/missiondeck-api.md
size: 7621
sha: 52a8d625740b34ce4946f88d040be08fdf61857c
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/missiondeck-api.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/missiondeck-api.md

## File: skills/notifications.md
size: 3448
sha: f87188d0ca328d7fcaae0044cfc6586fae7234ef
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/notifications.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/notifications.md

## File: skills/orchestration.md
size: 3638
sha: 7a1d0b7b8aedbb0954057c13e3895dc217d1aac8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/orchestration.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/orchestration.md

## File: skills/review.md
size: 3590
sha: 3de53ee6e8200dd47745918a125f729433c3a09f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/review.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/review.md

## File: skills/setup.md
size: 5045
sha: 6711669c92173f8d3c81de7b551789fdac0fc9c7
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/setup.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/setup.md

## File: skills/task-management.md
size: 3971
sha: 6a61b50546840cf8214cd7792839b0147f60e626
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/task-management.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/task-management.md

## File: skills/telegram-bridge.md
size: 5008
sha: 3e7c266a62f42fb540a055a59493b10126de9b3e
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/telegram-bridge.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills/telegram-bridge.md

## File: tests/basic-auth.test.js
size: 2444
sha: f9f72d6b16f0891187d651b308a194c69de6a014
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/basic-auth.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/basic-auth.test.js

## File: tests/claude-sessions.test.js
size: 6686
sha: 1985f0ebc2cb917476329b81c7b539836c3d0fa8
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/claude-sessions.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/claude-sessions.test.js

## File: tests/csrf.test.js
size: 2456
sha: c63df899e9a96a14af1577699a5f6cbaf9b67092
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/csrf.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/csrf.test.js

## File: tests/github-issues.test.js
size: 5335
sha: 3d76126389fb554077c2d8ad5b0ad7c54712fb9f
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/github-issues.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/github-issues.test.js

## File: tests/rate-limiter.test.js
size: 1804
sha: 9b0eed1cf72cb3fbf4493c3dda088a7ac1b4a684
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/rate-limiter.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/rate-limiter.test.js

## File: tests/webhook-retry.test.js
size: 7156
sha: 908f5b846b57115146f00513d401fa22a125e947
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/webhook-retry.test.js

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests/webhook-retry.test.js

## File: VERSION
size: 6
sha: 7ec1d6db40877765247db18e7f9a4e36a0def4ad
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/VERSION

```text
2.1.0
```

## File: .context
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.context

## File: .github
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.github

## File: .mission-control
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/.mission-control

## File: ISSUE-auto-sync.md
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/ISSUE-auto-sync.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/ISSUE-auto-sync.md

## File: SECURITY-FIX-PLAN.md
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY-FIX-PLAN.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY-FIX-PLAN.md

## File: SECURITY-VALIDATION-2026-03-03.md
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY-VALIDATION-2026-03-03.md

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/SECURITY-VALIDATION-2026-03-03.md

## File: cli
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/cli

## File: dashboard
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/dashboard

## File: docs
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/docs

## File: examples
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/examples

## File: scripts
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/scripts

## File: server
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/server

## File: skill
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skill

## File: skills
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/skills

## File: tests
upstream: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests

Content is not inlined in the catalog. Read the upstream file: https://github.com/asif2bd/jarvis-mission-control-openclaw/blob/HEAD/tests
