Files
weval-consulting/api/oss-cache-gen.py

92 lines
3.1 KiB
Python

import json, os
from datetime import datetime
DB = '/opt/wevads/vault/oss-discovery.json'
SKILLS_DF = '/opt/deer-flow/skills/weval'
SKILLS_CC = '/opt/claw-code/weval-skills'
OUT = '/var/www/html/api/oss-cache.json'
db = json.load(open(DB))
tools = db.get('tools', {})
by_status = {'discovered':0,'evaluated':0,'integrated':0,'rejected':0}
by_need = {}
top = []
wire_ok = wire_fail = 0
for k, t in tools.items():
st = t.get('status','discovered')
by_status[st] = by_status.get(st,0) + 1
for n in t.get('matched_needs', []):
by_need[n] = by_need.get(n, 0) + 1
score = t.get('score', 0)
name = t.get('full_name', t.get('name', k))
ws = t.get('wire_status', '')
is_wired = ws in ('wired', 'success', 'integrated')
if is_wired: wire_ok += 1
elif ws in ('failed', 'error'): wire_fail += 1
if score >= 5:
top.append({
'name': name, 'score': score, 'status': st,
'needs': t.get('matched_needs', []),
'wire_date': t.get('wire_date', ''),
'wire_status': 'success' if is_wired else ws,
'test_status': t.get('test_status', ''),
'stars': t.get('stars', 0),
'slug': t.get('skill_slug', '')
})
top.sort(key=lambda x: -x['score'])
by_need = dict(sorted(by_need.items(), key=lambda x: -x[1]))
# Build FLAT skills array — this is what the page JS expects
all_skills = []
# DeerFlow skills
if os.path.isdir(SKILLS_DF):
for d in sorted(os.listdir(SKILLS_DF)):
dp = os.path.join(SKILLS_DF, d)
if os.path.isdir(dp):
sp = os.path.join(dp, 'SKILL.md')
sz = os.path.getsize(sp) if os.path.exists(sp) else 0
all_skills.append({'slug': d, 'name': d, 'size': sz, 'source': 'deerflow'})
# Claw Code skills
if os.path.isdir(SKILLS_CC):
for f in sorted(os.listdir(SKILLS_CC)):
if f.endswith('.gpt.md'):
fp = os.path.join(SKILLS_CC, f)
slug = f.replace('.gpt.md', '')
all_skills.append({'slug': slug, 'name': slug, 'size': os.path.getsize(fp), 'source': 'claw-code'})
wired_names = [t.get('full_name', t.get('name', k)).split('/')[-1] for k,t in tools.items() if t.get('wire_status') in ('wired','success','integrated')]
cache = {
'report': {
'ok': True, 'total': len(tools),
'by_status': by_status, 'by_need': by_need,
'top': top[:50],
'skills_injected': len(all_skills),
'last_scan': db.get('last_scan', ''),
'test_summary': db.get('test_summary', {}),
'wire_stats': {'success': wire_ok, 'failed': wire_fail, 'pending': len(tools)-wire_ok-wire_fail, 'total_evaluated': len(tools), 'auto_wired': wire_ok},
'already_wired': wired_names[:60],
'integration_targets': list(by_need.keys())[:15],
'updated': datetime.now().isoformat() + 'Z'
},
'skills': {
'ok': True,
'total': len(all_skills),
'path': SKILLS_DF,
'skills': all_skills
}
}
with open(OUT, 'w') as f:
json.dump(cache, f)
print(f'OK: {len(tools)} tools | {wire_ok} wired | {len(all_skills)} skills flat array | top {len(top[:50])}')