100 lines
3.6 KiB
Bash
Executable File
100 lines
3.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# ARCHI→MEETING PIPELINE — feeds recommendations to meeting rooms
|
|
# Cron: */6h
|
|
TS=$(date -Iseconds)
|
|
ARCHI=/var/www/html/api/architecture-scanner.php
|
|
MEETING_DATA=/var/www/html/api/meeting-archi-agenda.json
|
|
LOG=/tmp/archi-meeting-pipeline.log
|
|
|
|
echo "$TS === ARCHI→MEETING ===" >> $LOG
|
|
|
|
# 1. Fetch fresh recommendations
|
|
RECS=$(curl -sk --max-time 30 'https://127.0.0.1/api/architecture-scanner.php' -H 'Host: weval-consulting.com' 2>/dev/null)
|
|
|
|
# 2. Parse and assign to squads
|
|
python3 << 'PYEND'
|
|
import json,sys,time
|
|
|
|
try:
|
|
data = json.loads(open("/dev/stdin").read() if False else "")
|
|
except:
|
|
import urllib.request,ssl
|
|
ctx=ssl._create_unverified_context()
|
|
req=urllib.request.Request("https://127.0.0.1/api/architecture-scanner.php",headers={"Host":"weval-consulting.com"})
|
|
data=json.loads(urllib.request.urlopen(req,context=ctx,timeout=30).read())
|
|
|
|
recs = data.get("recommendations", [])
|
|
ts = time.strftime("%Y-%m-%dT%H:%M:%S")
|
|
|
|
# Map categories to squads + agents
|
|
SQUAD_MAP = {
|
|
"INFRA": {"squad": "infra", "lead": "CORTEX", "agents": ["CORTEX", "Gap Detector"]},
|
|
"DOCKER": {"squad": "infra", "lead": "CORTEX", "agents": ["CORTEX"]},
|
|
"SECURITY": {"squad": "security", "lead": "Dark Tools", "agents": ["Dark Tools", "CrowdSec"]},
|
|
"OPTIMIZATION": {"squad": "ia", "lead": "WEVIA Master", "agents": ["WEVIA Master", "L99"]},
|
|
"SCALABILITY": {"squad": "dev", "lead": "NonReg", "agents": ["NonReg", "Evolution"]},
|
|
"KNOWLEDGE": {"squad": "ia", "lead": "DeerFlow", "agents": ["DeerFlow", "WEVIA Master"]},
|
|
"AI": {"squad": "ia", "lead": "OpenClaw", "agents": ["OpenClaw", "WEVIA Master"]},
|
|
}
|
|
|
|
agenda = {
|
|
"ts": ts,
|
|
"type": "archi-review",
|
|
"title": "Architecture Review — " + ts[:10],
|
|
"score": data.get("score", "?"),
|
|
"total_recs": len(recs),
|
|
"items": [],
|
|
"decisions": [],
|
|
"actions": []
|
|
}
|
|
|
|
for r in recs:
|
|
cat = r.get("category", "INFRA")
|
|
sev = r.get("severity", "info")
|
|
squad = SQUAD_MAP.get(cat, {"squad": "infra", "lead": "CORTEX", "agents": ["CORTEX"]})
|
|
|
|
item = {
|
|
"severity": sev,
|
|
"category": cat,
|
|
"title": r.get("title", ""),
|
|
"detail": r.get("detail", ""),
|
|
"squad": squad["squad"],
|
|
"lead": squad["lead"],
|
|
"agents": squad["agents"],
|
|
"action_type": r.get("action", "manual"),
|
|
"fix_cmd": r.get("fix_cmd", ""),
|
|
"status": "pending"
|
|
}
|
|
agenda["items"].append(item)
|
|
|
|
# Auto-generate decisions based on severity
|
|
if sev in ["critical", "warning"]:
|
|
agenda["decisions"].append({
|
|
"item": r.get("title", ""),
|
|
"decision": "FIX IMMEDIATE" if sev == "critical" else "PLANIFIER FIX",
|
|
"assigned_to": squad["lead"],
|
|
"squad": squad["squad"],
|
|
"deadline": "24h" if sev == "critical" else "7j"
|
|
})
|
|
agenda["actions"].append({
|
|
"action": r.get("title", ""),
|
|
"agent": squad["lead"],
|
|
"type": r.get("action", "manual"),
|
|
"cmd": r.get("fix_cmd", ""),
|
|
"status": "pending"
|
|
})
|
|
elif sev in ["info", "opportunity"]:
|
|
agenda["decisions"].append({
|
|
"item": r.get("title", ""),
|
|
"decision": "BACKLOG" if sev == "info" else "OPPORTUNITE",
|
|
"assigned_to": squad["lead"],
|
|
"squad": squad["squad"],
|
|
"deadline": "30j"
|
|
})
|
|
|
|
json.dump(agenda, open("/var/www/html/api/meeting-archi-agenda.json", "w"), indent=2, ensure_ascii=False)
|
|
print(f"AGENDA: {len(agenda['items'])} items, {len(agenda['decisions'])} decisions, {len(agenda['actions'])} actions")
|
|
PYEND
|
|
|
|
echo "$TS DONE" >> $LOG
|