266 lines
6.5 KiB
Bash
Executable File
266 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Mission Control CLI - Main Entry Point
|
|
# Usage: ./mc.sh <command> [args]
|
|
#
|
|
# Commands:
|
|
# auth Authentication (login, logout, session)
|
|
# task Task operations (delegates to gantt-board)
|
|
# project Project operations (delegates to gantt-board)
|
|
# sprint Sprint operations (delegates to gantt-board)
|
|
# search Search across tasks, projects, documents
|
|
# document Document management
|
|
# due-dates Tasks with due dates
|
|
# dashboard Dashboard data
|
|
#
|
|
# Environment:
|
|
# MC_API_URL Mission Control API URL (default: http://localhost:3001/api)
|
|
# GANTT_BOARD_DIR Path to gantt-board directory (auto-detected)
|
|
# MC_COOKIE_FILE Path to cookie file (default: ~/.config/mission-control/cookies.txt)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
export SCRIPT_DIR
|
|
|
|
# Source API client library
|
|
source "$SCRIPT_DIR/lib/api_client.sh"
|
|
|
|
# Auto-detect gantt-board directory
|
|
if [[ -z "${GANTT_BOARD_DIR:-}" ]]; then
|
|
# Try common locations
|
|
if [[ -d "$SCRIPT_DIR/../../../gantt-board" ]]; then
|
|
GANTT_BOARD_DIR="$SCRIPT_DIR/../../../gantt-board"
|
|
elif [[ -d "$HOME/Documents/Projects/OpenClaw/Web/gantt-board" ]]; then
|
|
GANTT_BOARD_DIR="$HOME/Documents/Projects/OpenClaw/Web/gantt-board"
|
|
elif [[ -d "/Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board" ]]; then
|
|
GANTT_BOARD_DIR="/Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board"
|
|
fi
|
|
fi
|
|
|
|
# Show usage
|
|
usage() {
|
|
cat << 'EOF'
|
|
Mission Control CLI
|
|
|
|
Usage: ./mc.sh <command> [args]
|
|
|
|
Commands:
|
|
auth <subcommand> Authentication operations
|
|
login <email> <password> Login to Mission Control
|
|
logout Logout
|
|
session Show current session
|
|
|
|
task <args> Task operations (delegates to gantt-board)
|
|
See: ./task.sh --help
|
|
|
|
project <args> Project operations (delegates to gantt-board)
|
|
See: ./project.sh --help
|
|
|
|
sprint <args> Sprint operations (delegates to gantt-board)
|
|
See: ./sprint.sh --help
|
|
|
|
search <query> Search across tasks, projects, documents
|
|
|
|
due-dates List tasks with due dates
|
|
|
|
documents Document management
|
|
list List all documents
|
|
get <id> Get document by ID
|
|
|
|
dashboard Get dashboard data
|
|
|
|
Examples:
|
|
./mc.sh auth login user@example.com password
|
|
./mc.sh search "api design"
|
|
./mc.sh due-dates
|
|
./mc.sh task list --status open
|
|
./mc.sh project list
|
|
|
|
Environment Variables:
|
|
MC_API_URL Mission Control API URL (default: http://localhost:3001/api)
|
|
GANTT_BOARD_DIR Path to gantt-board directory
|
|
MC_COOKIE_FILE Path to cookie file
|
|
|
|
EOF
|
|
}
|
|
|
|
# Auth commands
|
|
handle_auth() {
|
|
local subcmd="${1:-}"
|
|
|
|
case "$subcmd" in
|
|
login)
|
|
local email="${2:-}"
|
|
local password="${3:-}"
|
|
if [[ -z "$email" || -z "$password" ]]; then
|
|
echo "Usage: ./mc.sh auth login <email> <password>" >&2
|
|
exit 1
|
|
fi
|
|
mc_login "$email" "$password"
|
|
;;
|
|
logout)
|
|
mc_logout
|
|
;;
|
|
session)
|
|
mc_get "/auth/session" | jq .
|
|
;;
|
|
*)
|
|
echo "Unknown auth subcommand: $subcmd" >&2
|
|
echo "Usage: ./mc.sh auth {login|logout|session}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Search command
|
|
handle_search() {
|
|
local query="${1:-}"
|
|
|
|
if [[ -z "$query" ]]; then
|
|
echo "Usage: ./mc.sh search <query>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
local encoded_query
|
|
encoded_query=$(url_encode "$query")
|
|
mc_get "/search?q=$encoded_query" | jq .
|
|
}
|
|
|
|
# Due dates command
|
|
handle_due_dates() {
|
|
mc_get "/tasks/with-due-dates" | jq .
|
|
}
|
|
|
|
# Documents command
|
|
handle_documents() {
|
|
local subcmd="${1:-list}"
|
|
|
|
case "$subcmd" in
|
|
list)
|
|
mc_get "/documents" | jq .
|
|
;;
|
|
get)
|
|
local id="${2:-}"
|
|
if [[ -z "$id" ]]; then
|
|
echo "Usage: ./mc.sh documents get <id>" >&2
|
|
exit 1
|
|
fi
|
|
mc_get "/documents?id=$id" | jq .
|
|
;;
|
|
*)
|
|
echo "Unknown documents subcommand: $subcmd" >&2
|
|
echo "Usage: ./mc.sh documents {list|get <id>}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Task command - delegate to gantt-board
|
|
handle_task() {
|
|
if [[ -z "${GANTT_BOARD_DIR:-}" ]]; then
|
|
echo "Error: GANTT_BOARD_DIR not set and gantt-board not found" >&2
|
|
echo "Please set GANTT_BOARD_DIR to the path of your gantt-board installation" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$GANTT_BOARD_DIR/scripts/task.sh" ]]; then
|
|
echo "Error: gantt-board task.sh not found at $GANTT_BOARD_DIR/scripts/task.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Delegate to gantt-board task.sh
|
|
exec "$GANTT_BOARD_DIR/scripts/task.sh" "$@"
|
|
}
|
|
|
|
# Project command - delegate to gantt-board
|
|
handle_project() {
|
|
if [[ -z "${GANTT_BOARD_DIR:-}" ]]; then
|
|
echo "Error: GANTT_BOARD_DIR not set and gantt-board not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$GANTT_BOARD_DIR/scripts/project.sh" ]]; then
|
|
echo "Error: gantt-board project.sh not found at $GANTT_BOARD_DIR/scripts/project.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
exec "$GANTT_BOARD_DIR/scripts/project.sh" "$@"
|
|
}
|
|
|
|
# Sprint command - delegate to gantt-board
|
|
handle_sprint() {
|
|
if [[ -z "${GANTT_BOARD_DIR:-}" ]]; then
|
|
echo "Error: GANTT_BOARD_DIR not set and gantt-board not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$GANTT_BOARD_DIR/scripts/sprint.sh" ]]; then
|
|
echo "Error: gantt-board sprint.sh not found at $GANTT_BOARD_DIR/scripts/sprint.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
exec "$GANTT_BOARD_DIR/scripts/sprint.sh" "$@"
|
|
}
|
|
|
|
# Dashboard command
|
|
handle_dashboard() {
|
|
# For now, combine multiple API calls to build dashboard view
|
|
echo "Fetching dashboard data..."
|
|
echo ""
|
|
|
|
echo "=== Tasks with Due Dates ==="
|
|
handle_due_dates | jq -r '.[] | "\(.due_date) | \(.priority) | \(.title)"' 2>/dev/null || echo "No tasks with due dates"
|
|
|
|
echo ""
|
|
echo "=== Recent Activity ==="
|
|
# This would need a dedicated API endpoint
|
|
echo "(Recent activity endpoint not yet implemented)"
|
|
}
|
|
|
|
# Main command dispatcher
|
|
main() {
|
|
local cmd="${1:-}"
|
|
shift || true
|
|
|
|
case "$cmd" in
|
|
auth)
|
|
handle_auth "$@"
|
|
;;
|
|
search)
|
|
handle_search "$@"
|
|
;;
|
|
due-dates)
|
|
handle_due_dates
|
|
;;
|
|
documents|document)
|
|
handle_documents "$@"
|
|
;;
|
|
task)
|
|
handle_task "$@"
|
|
;;
|
|
project)
|
|
handle_project "$@"
|
|
;;
|
|
sprint)
|
|
handle_sprint "$@"
|
|
;;
|
|
dashboard)
|
|
handle_dashboard
|
|
;;
|
|
help|--help|-h)
|
|
usage
|
|
;;
|
|
*)
|
|
if [[ -z "$cmd" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
echo "Unknown command: $cmd" >&2
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
main "$@"
|