179 lines
5.0 KiB
Bash
Executable File
179 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Export Loki Mode tasks to Vibe Kanban format
|
|
# Usage: ./scripts/export-to-vibe-kanban.sh [export_dir]
|
|
|
|
set -uo pipefail
|
|
|
|
LOKI_DIR=".loki"
|
|
EXPORT_DIR="${1:-${VIBE_KANBAN_DIR:-$HOME/.vibe-kanban/loki-tasks}}"
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
|
|
|
# Check if .loki directory exists
|
|
if [ ! -d "$LOKI_DIR" ]; then
|
|
log_warn "No .loki directory found. Run Loki Mode first."
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$EXPORT_DIR"
|
|
|
|
# Get current phase from orchestrator
|
|
CURRENT_PHASE="UNKNOWN"
|
|
if [ -f "$LOKI_DIR/state/orchestrator.json" ]; then
|
|
CURRENT_PHASE=$(python3 -c "import json; print(json.load(open('$LOKI_DIR/state/orchestrator.json')).get('currentPhase', 'UNKNOWN'))" 2>/dev/null || echo "UNKNOWN")
|
|
fi
|
|
|
|
# Map Loki phases to Vibe Kanban columns
|
|
phase_to_column() {
|
|
case "$1" in
|
|
BOOTSTRAP|DISCOVERY|ARCHITECTURE) echo "planning" ;;
|
|
INFRASTRUCTURE|DEVELOPMENT) echo "in-progress" ;;
|
|
QA) echo "review" ;;
|
|
DEPLOYMENT) echo "deploying" ;;
|
|
BUSINESS_OPS|GROWTH|COMPLETED) echo "done" ;;
|
|
*) echo "backlog" ;;
|
|
esac
|
|
}
|
|
|
|
# Export tasks from all queues
|
|
export_queue() {
|
|
local queue_file="$1"
|
|
local status="$2"
|
|
|
|
if [ ! -f "$queue_file" ]; then
|
|
return
|
|
fi
|
|
|
|
python3 << EOF
|
|
import json
|
|
import os
|
|
from datetime import datetime
|
|
|
|
try:
|
|
with open("$queue_file") as f:
|
|
content = f.read().strip()
|
|
if not content or content == "[]":
|
|
tasks = []
|
|
else:
|
|
tasks = json.loads(content)
|
|
except (json.JSONDecodeError, FileNotFoundError):
|
|
tasks = []
|
|
|
|
export_dir = os.path.expanduser("$EXPORT_DIR")
|
|
exported = 0
|
|
|
|
for task in tasks:
|
|
task_id = task.get('id', 'unknown')
|
|
|
|
# Determine status based on queue and claimed state
|
|
if "$status" == "pending":
|
|
vibe_status = "todo"
|
|
elif "$status" == "in-progress":
|
|
vibe_status = "doing"
|
|
elif "$status" == "completed":
|
|
vibe_status = "done"
|
|
elif "$status" == "failed":
|
|
vibe_status = "blocked"
|
|
else:
|
|
vibe_status = "todo"
|
|
|
|
# Build description from payload
|
|
payload = task.get('payload', {})
|
|
if isinstance(payload, dict):
|
|
desc_parts = []
|
|
if 'action' in payload:
|
|
desc_parts.append(f"Action: {payload['action']}")
|
|
if 'description' in payload:
|
|
desc_parts.append(payload['description'])
|
|
if 'command' in payload:
|
|
desc_parts.append(f"Command: {payload['command']}")
|
|
description = "\n".join(desc_parts) if desc_parts else json.dumps(payload, indent=2)
|
|
else:
|
|
description = str(payload)
|
|
|
|
# Get agent type for tagging
|
|
agent_type = task.get('type', 'unknown')
|
|
swarm = agent_type.split('-')[0] if '-' in agent_type else 'general'
|
|
|
|
# Priority mapping (Loki uses 1-10, higher is more important)
|
|
priority = task.get('priority', 5)
|
|
if priority >= 8:
|
|
priority_tag = "priority-high"
|
|
elif priority >= 5:
|
|
priority_tag = "priority-medium"
|
|
else:
|
|
priority_tag = "priority-low"
|
|
|
|
vibe_task = {
|
|
"id": f"loki-{task_id}",
|
|
"title": f"[{agent_type}] {payload.get('action', 'Task')}",
|
|
"description": description,
|
|
"status": vibe_status,
|
|
"agent": "claude-code",
|
|
"tags": [
|
|
agent_type,
|
|
f"swarm-{swarm}",
|
|
priority_tag,
|
|
f"phase-$CURRENT_PHASE".lower()
|
|
],
|
|
"metadata": {
|
|
"lokiTaskId": task_id,
|
|
"lokiType": agent_type,
|
|
"lokiPriority": priority,
|
|
"lokiPhase": "$CURRENT_PHASE",
|
|
"lokiRetries": task.get('retries', 0),
|
|
"createdAt": task.get('createdAt', datetime.utcnow().isoformat() + 'Z'),
|
|
"claimedBy": task.get('claimedBy'),
|
|
"lastError": task.get('lastError')
|
|
}
|
|
}
|
|
|
|
# Write task file
|
|
task_file = os.path.join(export_dir, f"{task_id}.json")
|
|
with open(task_file, 'w') as out:
|
|
json.dump(vibe_task, out, indent=2)
|
|
exported += 1
|
|
|
|
print(f"EXPORTED:{exported}")
|
|
EOF
|
|
}
|
|
|
|
log_info "Exporting Loki Mode tasks to Vibe Kanban..."
|
|
log_info "Export directory: $EXPORT_DIR"
|
|
log_info "Current phase: $CURRENT_PHASE"
|
|
|
|
TOTAL=0
|
|
|
|
# Export from each queue
|
|
for queue in pending in-progress completed failed dead-letter; do
|
|
queue_file="$LOKI_DIR/queue/${queue}.json"
|
|
if [ -f "$queue_file" ]; then
|
|
result=$(export_queue "$queue_file" "$queue")
|
|
count=$(echo "$result" | grep "EXPORTED:" | cut -d: -f2)
|
|
if [ -n "$count" ] && [ "$count" -gt 0 ]; then
|
|
log_info " $queue: $count tasks"
|
|
TOTAL=$((TOTAL + count))
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Create summary file
|
|
cat > "$EXPORT_DIR/_loki_summary.json" << EOF
|
|
{
|
|
"exportedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
"currentPhase": "$CURRENT_PHASE",
|
|
"totalTasks": $TOTAL,
|
|
"lokiVersion": "$(cat VERSION 2>/dev/null || echo 'unknown')",
|
|
"column": "$(phase_to_column "$CURRENT_PHASE")"
|
|
}
|
|
EOF
|
|
|
|
log_info "Exported $TOTAL tasks total"
|
|
log_info "Summary written to $EXPORT_DIR/_loki_summary.json"
|