Fix: Ensure all skills are tracked as files, not submodules
This commit is contained in:
178
skills/loki-mode/scripts/export-to-vibe-kanban.sh
Executable file
178
skills/loki-mode/scripts/export-to-vibe-kanban.sh
Executable file
@@ -0,0 +1,178 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user