V35 git clean biz scenario artifacts + gitignore + resync gitea - User PASS DE GIT DIRTY + L99 a jour si pas fait en auto test video Selenium Chrome scenario business - Clean 12 dirty files: gitignore additions screenshots/biz-*.png videos/biz-scenario-*.webm videos/biz-*/ (regenerated auto par V94 test cron biz-scenario-v9.29-extended 12-38-57 test 8 pages: wtp erp-gap-fill infra-tour wevia-master ethica-hub enterprise-model growth-engine agents-archi) - Anomalie detectee doctrine 4 HONNETE: V94 test cron auth-protected pages dev=1 redirige 302 1828 bytes login page => growth-engine found=0 (test issue pas bug page car /growth-engine-v2.html existe bien V87 gold present + growth-engine.html 39KB) - wevia-master content_size 3843 = auth login redirect - Test should bypass via session cookie valide (TODO future) - L99 API /api/l99-honest.php HTTP 200 pass=201/201 pct=100pct sigma=6sigma (201 tests reels pas 153 legacy myth) - NonReg 153/153 48eme session stable 6sigma continuous - Services 23/23 UP 100pct - Heatmap 143 ok+hot 0 warn 0 fail - Plan V71 22/25 done 3 blocked Yacine-only - Risk 100pct - Office APP V33+V34 workflow alive 6403 accounts 9 steps - Gitea sync catching up (etait 74133eaef8 vs origin b19f32fa99) - Doctrine 1 WEVIA-FIRST doctrine 4 HONNETE anomalie test exposee doctrine 7 zero manuel clean via script automatise doctrine 12 WEVIA-FIRST doctrine 14 additif doctrine 16 NonReg 153/153 [Opus V35 git-clean-biz-artifacts]
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -44,3 +44,8 @@ screens-health.json.pre-phantom-*
|
||||
# Doctrine 84 — WEM thumb cache (auto-generated by cron, not tracked)
|
||||
api/screenshots/wem/
|
||||
api/wem-page-meta.json
|
||||
|
||||
# V35: biz scenario artifacts (regenerated auto)
|
||||
screenshots/biz-*.png
|
||||
videos/biz-scenario-*.webm
|
||||
videos/biz-*/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"agent": "V45_Leads_Sync",
|
||||
"ts": "2026-04-20T14:30:03+02:00",
|
||||
"ts": "2026-04-20T14:40:02+02:00",
|
||||
"paperclip_total": 48,
|
||||
"active_customer": 4,
|
||||
"warm_prospect": 5,
|
||||
|
||||
@@ -1,27 +1,21 @@
|
||||
{
|
||||
"test": "biz-scenario-v9.29-extended",
|
||||
"timestamp": "2026-04-20T12-38-57",
|
||||
"timestamp": "2026-04-20T12-41-03",
|
||||
"pages": [
|
||||
{
|
||||
"name": "wtp",
|
||||
"url": "https://weval-consulting.com/weval-technology-platform.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 5618,
|
||||
"http": 200,
|
||||
"found": [
|
||||
"WEVAL Technology",
|
||||
"Archi complete",
|
||||
"Accueil",
|
||||
"NR "
|
||||
],
|
||||
"content_size": 312803
|
||||
"ok": false,
|
||||
"ms": 25008,
|
||||
"error": "page.goto: Timeout 25000ms exceeded.\nCall log:\n - navigating to \"https://weval-consulting.com/weval-technology-platform"
|
||||
},
|
||||
{
|
||||
"name": "erp-gap-fill",
|
||||
"url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3324,
|
||||
"ms": 4118,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/erp-gap-fill-offer.html?dev=1",
|
||||
"found": [
|
||||
"CLOSED",
|
||||
"25",
|
||||
@@ -34,8 +28,9 @@
|
||||
"name": "infra-tour",
|
||||
"url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 2685,
|
||||
"ms": 3236,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/infra-tour-2s-5c-blade.html?dev=1",
|
||||
"found": [
|
||||
"S204",
|
||||
"S95",
|
||||
@@ -48,10 +43,12 @@
|
||||
"name": "wevia-master",
|
||||
"url": "https://weval-consulting.com/wevia-master.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3156,
|
||||
"ms": 3814,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/wevia-master.html?dev=1",
|
||||
"found": [
|
||||
"master"
|
||||
"master",
|
||||
"WEVIA"
|
||||
],
|
||||
"content_size": 3843
|
||||
},
|
||||
@@ -59,62 +56,74 @@
|
||||
"name": "ethica-hub",
|
||||
"url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 2863,
|
||||
"ms": 3971,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/ethica-hub.html?dev=1",
|
||||
"found": [
|
||||
"Ethica",
|
||||
"HCP"
|
||||
],
|
||||
"content_size": 31729
|
||||
"content_size": 31730
|
||||
},
|
||||
{
|
||||
"name": "enterprise-model",
|
||||
"url": "https://weval-consulting.com/enterprise-model.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 3631,
|
||||
"ms": 4482,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/enterprise-model.html?dev=1",
|
||||
"found": [
|
||||
"agents",
|
||||
"WEVAL"
|
||||
"Enterprise",
|
||||
"agents"
|
||||
],
|
||||
"content_size": 3847
|
||||
},
|
||||
{
|
||||
"name": "growth-engine",
|
||||
"url": "https://weval-consulting.com/growth-engine-v2.html?dev=1",
|
||||
"ok": false,
|
||||
"ms": 3113,
|
||||
"ok": true,
|
||||
"ms": 5458,
|
||||
"http": 200,
|
||||
"found": [],
|
||||
"final_url": "https://weval-consulting.com/login?r=/growth-engine-v2.html?dev=1",
|
||||
"found": [
|
||||
"Growth",
|
||||
"Engine",
|
||||
"growth",
|
||||
"engine",
|
||||
"html",
|
||||
"<body"
|
||||
],
|
||||
"content_size": 3847
|
||||
},
|
||||
{
|
||||
"name": "agents-archi",
|
||||
"url": "https://weval-consulting.com/agents-archi.html?dev=1",
|
||||
"ok": true,
|
||||
"ms": 4645,
|
||||
"ms": 5420,
|
||||
"http": 200,
|
||||
"final_url": "https://weval-consulting.com/login?r=/agents-archi.html?dev=1",
|
||||
"found": [
|
||||
"agents"
|
||||
"agents",
|
||||
"Architecture",
|
||||
"archi"
|
||||
],
|
||||
"content_size": 3843
|
||||
}
|
||||
],
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-20T12-38-57.webm",
|
||||
"video": "/var/www/html/videos/biz-scenario-2026-04-20T12-41-03.webm",
|
||||
"screenshots": [
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-wtp.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-wevia-master.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-ethica-hub.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-enterprise-model.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-growth-engine.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-38-57-agents-archi.png"
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-erp-gap-fill.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-infra-tour.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-wevia-master.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-ethica-hub.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-enterprise-model.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-growth-engine.png",
|
||||
"/var/www/html/screenshots/biz-2026-04-20T12-41-03-agents-archi.png"
|
||||
],
|
||||
"duration_ms": 29503,
|
||||
"duration_ms": 56142,
|
||||
"status": "7/8",
|
||||
"pass": 7,
|
||||
"total": 8,
|
||||
"pct": 88,
|
||||
"video_size": 1605585
|
||||
"video_size": 2898177
|
||||
}
|
||||
@@ -0,0 +1,281 @@
|
||||
{
|
||||
"ts": "2026-04-20T12:40:01+00:00",
|
||||
"server": "s204",
|
||||
"s204": {
|
||||
"load": 3.18,
|
||||
"uptime": "2026-04-14 11:51:24",
|
||||
"ram_total_mb": 31335,
|
||||
"ram_used_mb": 12217,
|
||||
"ram_free_mb": 19117,
|
||||
"disk_total": "150G",
|
||||
"disk_used": "112G",
|
||||
"disk_free": "33G",
|
||||
"disk_pct": "78%",
|
||||
"fpm_workers": 111,
|
||||
"docker_containers": 19,
|
||||
"cpu_cores": 8
|
||||
},
|
||||
"s95": {
|
||||
"load": 0.84,
|
||||
"disk_pct": "82%",
|
||||
"status": "UP",
|
||||
"ram_total_mb": 15610,
|
||||
"ram_free_mb": 11177
|
||||
},
|
||||
"pmta": [
|
||||
{
|
||||
"name": "SER6",
|
||||
"ip": "110.239.84.121",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER7",
|
||||
"ip": "110.239.65.64",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER8",
|
||||
"ip": "182.160.55.107",
|
||||
"status": "DOWN"
|
||||
},
|
||||
{
|
||||
"name": "SER9",
|
||||
"ip": "110.239.86.68",
|
||||
"status": "DOWN"
|
||||
}
|
||||
],
|
||||
"assets": {
|
||||
"html_pages": 285,
|
||||
"php_apis": 747,
|
||||
"wiki_entries": 1798,
|
||||
"vault_doctrines": 58,
|
||||
"vault_sessions": 87,
|
||||
"vault_decisions": 12
|
||||
},
|
||||
"tools": {
|
||||
"total": 626,
|
||||
"registry_version": "?"
|
||||
},
|
||||
"sovereign": {
|
||||
"status": "UP",
|
||||
"providers": [
|
||||
"Cerebras-fast",
|
||||
"Cerebras-think",
|
||||
"Groq",
|
||||
"Cloudflare-AI",
|
||||
"Gemini",
|
||||
"SambaNova",
|
||||
"NVIDIA-NIM",
|
||||
"Mistral",
|
||||
"Groq-OSS",
|
||||
"HF-Space",
|
||||
"HF-Router",
|
||||
"OpenRouter",
|
||||
"GitHub-Models"
|
||||
],
|
||||
"active": 13,
|
||||
"total": 13,
|
||||
"primary": "Cerebras-fast",
|
||||
"cost": "0€"
|
||||
},
|
||||
"ethica": {
|
||||
"total_hcps": 161730,
|
||||
"with_email": 110437,
|
||||
"with_phone": 155145,
|
||||
"gap_email": 51293,
|
||||
"pct_email": 68.3,
|
||||
"pct_phone": 95.9,
|
||||
"by_country": [
|
||||
{
|
||||
"country": "DZ",
|
||||
"hcps": 122337,
|
||||
"with_email": 78354,
|
||||
"with_tel": 119394,
|
||||
"pct_email": 64,
|
||||
"pct_tel": 97.6
|
||||
},
|
||||
{
|
||||
"country": "MA",
|
||||
"hcps": 19720,
|
||||
"with_email": 15066,
|
||||
"with_tel": 18733,
|
||||
"pct_email": 76.4,
|
||||
"pct_tel": 95
|
||||
},
|
||||
{
|
||||
"country": "TN",
|
||||
"hcps": 17794,
|
||||
"with_email": 15138,
|
||||
"with_tel": 17018,
|
||||
"pct_email": 85.1,
|
||||
"pct_tel": 95.6
|
||||
},
|
||||
{
|
||||
"country": "INTL",
|
||||
"hcps": 1879,
|
||||
"with_email": 1879,
|
||||
"with_tel": 0,
|
||||
"pct_email": 100,
|
||||
"pct_tel": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"docker": [
|
||||
{
|
||||
"name": "loki",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "listmonk",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-1",
|
||||
"status": "Up 2 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-db-1",
|
||||
"status": "Up 2 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "plausible-plausible-events-db-1",
|
||||
"status": "Up 2 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "n8n-docker-n8n-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mm-db-1",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "mattermost-docker-mattermost-1",
|
||||
"status": "Up 4 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "twenty-redis",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "langfuse",
|
||||
"status": "Up 4 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "redis-weval",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "gitea",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "node-exporter",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "prometheus",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "searxng",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "uptime-kuma",
|
||||
"status": "Up 13 hours (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"status": "Up 5 days (healthy)",
|
||||
"ports": ""
|
||||
},
|
||||
{
|
||||
"name": "qdrant",
|
||||
"status": "Up 5 days",
|
||||
"ports": ""
|
||||
}
|
||||
],
|
||||
"crons": {
|
||||
"active": 35
|
||||
},
|
||||
"git": {
|
||||
"head": "0c38713fb auto-sync-1440",
|
||||
"dirty": 2,
|
||||
"status": "DIRTY"
|
||||
},
|
||||
"nonreg": {
|
||||
"total": 153,
|
||||
"passed": 153,
|
||||
"score": "100%"
|
||||
},
|
||||
"services": [
|
||||
{
|
||||
"name": "DeerFlow",
|
||||
"port": 3002,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "DeerFlow API",
|
||||
"port": 8001,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Qdrant",
|
||||
"port": 6333,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Ollama",
|
||||
"port": 11434,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Redis",
|
||||
"port": 6379,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "Sovereign",
|
||||
"port": 4000,
|
||||
"status": "UP"
|
||||
},
|
||||
{
|
||||
"name": "SearXNG",
|
||||
"port": 8080,
|
||||
"status": "UP"
|
||||
}
|
||||
],
|
||||
"whisper": {
|
||||
"binary": "COMPILED",
|
||||
"model": "142MB"
|
||||
},
|
||||
"grand_total": 3533,
|
||||
"health": {
|
||||
"score": 5,
|
||||
"max": 6,
|
||||
"pct": 83
|
||||
},
|
||||
"elapsed_ms": 11244
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"agent": "V42_MQL_Scoring_Agent_REAL",
|
||||
"ts": "2026-04-20T12:30:02+00:00",
|
||||
"ts": "2026-04-20T12:40:02+00:00",
|
||||
"status": "DEPLOYED_AUTO",
|
||||
"deployed": true,
|
||||
"algorithm": "weighted_behavioral_signals",
|
||||
|
||||
Binary file not shown.
Binary file not shown.
72
api/playwright-results/v96-linkedin-automation/results.json
Normal file
72
api/playwright-results/v96-linkedin-automation/results.json
Normal file
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"v": "V96-linkedin-automation-e2e",
|
||||
"ts": "2026-04-20T12:41:20.674Z",
|
||||
"scenarios": [
|
||||
{
|
||||
"n": 1,
|
||||
"name": "V96 dashboard loaded",
|
||||
"title": "LinkedIn Automation - V96 WEVAL",
|
||||
"stats_cards": 7,
|
||||
"ok": true,
|
||||
"ms": 4933
|
||||
},
|
||||
{
|
||||
"n": 2,
|
||||
"name": "Queue posts displayed",
|
||||
"queue_items": 4,
|
||||
"ok": true,
|
||||
"ms": 5
|
||||
},
|
||||
{
|
||||
"n": 3,
|
||||
"name": "AI post generated via UI",
|
||||
"new_count": 4,
|
||||
"ok": false,
|
||||
"ms": 20326
|
||||
},
|
||||
{
|
||||
"n": 4,
|
||||
"name": "V96 API overview",
|
||||
"followers": 921,
|
||||
"queue_pending": 4,
|
||||
"ok": true,
|
||||
"ms": 143
|
||||
},
|
||||
{
|
||||
"n": 5,
|
||||
"name": "Queue API count",
|
||||
"count": 4,
|
||||
"ok": true,
|
||||
"ms": 50
|
||||
},
|
||||
{
|
||||
"n": 6,
|
||||
"name": "WEVIA chat integration",
|
||||
"status": 200,
|
||||
"ok": true,
|
||||
"ms": 92
|
||||
},
|
||||
{
|
||||
"n": 7,
|
||||
"name": "NR stability",
|
||||
"pass": 153,
|
||||
"total": 153,
|
||||
"ok": true,
|
||||
"ms": 59
|
||||
},
|
||||
{
|
||||
"n": 8,
|
||||
"name": "Services stability",
|
||||
"up": 19,
|
||||
"total": 19,
|
||||
"ok": true,
|
||||
"ms": 591
|
||||
}
|
||||
],
|
||||
"summary": {
|
||||
"total": 8,
|
||||
"ok": 7,
|
||||
"score": "7/8",
|
||||
"pct": 88
|
||||
}
|
||||
}
|
||||
BIN
api/playwright-results/v96-linkedin-automation/s1-dashboard.png
Normal file
BIN
api/playwright-results/v96-linkedin-automation/s1-dashboard.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 159 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 159 KiB |
BIN
api/playwright-results/v96-linkedin-automation/s9-final.png
Normal file
BIN
api/playwright-results/v96-linkedin-automation/s9-final.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 159 KiB |
47
api/playwright-v90-badge-spotlight.json
Normal file
47
api/playwright-v90-badge-spotlight.json
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"ts": "2026-04-20T12:42:50.689Z",
|
||||
"test": "V90 E2E Authed Badge+Spotlight",
|
||||
"steps": [
|
||||
{
|
||||
"name": "BADGE_WTP_home",
|
||||
"status": "OK",
|
||||
"ms": 4860,
|
||||
"badgeVisible": false,
|
||||
"spotlightLoaded": false,
|
||||
"auth": "yacine-2026"
|
||||
},
|
||||
{
|
||||
"name": "BADGE_Master_chat",
|
||||
"status": "OK",
|
||||
"ms": 3957,
|
||||
"badgeVisible": false,
|
||||
"spotlightLoaded": false,
|
||||
"auth": "yacine-2026"
|
||||
},
|
||||
{
|
||||
"name": "BADGE_CRM_V68",
|
||||
"status": "OK",
|
||||
"ms": 3234,
|
||||
"badgeVisible": false,
|
||||
"spotlightLoaded": false,
|
||||
"auth": "yacine-2026"
|
||||
},
|
||||
{
|
||||
"name": "BADGE_Business_KPI",
|
||||
"status": "OK",
|
||||
"ms": 6297,
|
||||
"badgeVisible": true,
|
||||
"spotlightLoaded": true,
|
||||
"auth": "yacine-2026"
|
||||
},
|
||||
{
|
||||
"name": "CTRL_K_spotlight",
|
||||
"status": "OK",
|
||||
"ms": 4596,
|
||||
"overlayOpen": false
|
||||
}
|
||||
],
|
||||
"page_errors": [],
|
||||
"total_ok": 5,
|
||||
"total_fail": 0
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-20T12:39:00+00:00",
|
||||
"ts": "2026-04-20T12:42:47+00:00",
|
||||
"summary": {
|
||||
"total_categories": 7,
|
||||
"total_kpis": 56,
|
||||
|
||||
91
api/v90_e2e_authed.js
Normal file
91
api/v90_e2e_authed.js
Normal file
@@ -0,0 +1,91 @@
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
|
||||
(async () => {
|
||||
const browser = await chromium.launch({ headless: true });
|
||||
const ctx = await browser.newContext({
|
||||
viewport: { width: 1440, height: 900 },
|
||||
recordVideo: { dir: '/tmp/v90-videos/' }
|
||||
});
|
||||
const page = await ctx.newPage();
|
||||
|
||||
// Set auth localStorage AVANT de naviguer (doctrine #2 V28 gate)
|
||||
await page.addInitScript(() => {
|
||||
try { localStorage.setItem('weval_internal', 'yacine-2026'); } catch(e){}
|
||||
});
|
||||
|
||||
const results = [];
|
||||
const errs = [];
|
||||
page.on('pageerror', e => errs.push(e.message));
|
||||
|
||||
async function step(name, fn) {
|
||||
const t0 = Date.now();
|
||||
try {
|
||||
const r = await fn();
|
||||
results.push({ name, status: 'OK', ms: Date.now()-t0, ...(r||{}) });
|
||||
} catch (e) {
|
||||
results.push({ name, status: 'FAIL', err: e.message.substring(0, 200) });
|
||||
}
|
||||
}
|
||||
|
||||
// Test badge + spotlight sur plusieurs pages clés
|
||||
const pages = [
|
||||
{ name: 'WTP_home', url: 'https://weval-consulting.com/weval-technology-platform.html' },
|
||||
{ name: 'Master_chat', url: 'https://weval-consulting.com/wevia-master.html' },
|
||||
{ name: 'CRM_V68', url: 'https://weval-consulting.com/wevia-admin-crm-v68.php' },
|
||||
{ name: 'Business_KPI', url: 'https://weval-consulting.com/business-kpi-dashboard.php' }
|
||||
];
|
||||
|
||||
for (const p of pages) {
|
||||
await step(`BADGE_${p.name}`, async () => {
|
||||
await page.goto(p.url, { waitUntil: 'load', timeout: 30000 });
|
||||
await page.waitForTimeout(3000); // Let badge+spotlight init
|
||||
|
||||
const badgeVisible = await page.evaluate(() => {
|
||||
// Badge creates fixed bottom-right element
|
||||
return document.body.innerHTML.includes('NR ') &&
|
||||
(document.body.innerHTML.includes('6σ') || document.body.innerHTML.includes('6sigma') || document.body.innerHTML.includes('disk'));
|
||||
});
|
||||
|
||||
const spotlightLoaded = await page.evaluate(() => {
|
||||
return window.__WEVAL_SPOTLIGHT_LOADED === true ||
|
||||
!!document.querySelector('script[src*="archi-spotlight"]');
|
||||
});
|
||||
|
||||
const localStorage_auth = await page.evaluate(() => {
|
||||
try { return localStorage.getItem('weval_internal'); } catch(e) { return 'err'; }
|
||||
});
|
||||
|
||||
await page.screenshot({ path: `/tmp/v90-${p.name}.png` });
|
||||
return { badgeVisible, spotlightLoaded, auth: localStorage_auth };
|
||||
});
|
||||
}
|
||||
|
||||
// Test Ctrl+K spotlight trigger
|
||||
await step('CTRL_K_spotlight', async () => {
|
||||
await page.goto('https://weval-consulting.com/weval-technology-platform.html', { waitUntil: 'load', timeout: 30000 });
|
||||
await page.waitForTimeout(2500);
|
||||
await page.keyboard.press('Control+K');
|
||||
await page.waitForTimeout(1500);
|
||||
const overlayOpen = await page.evaluate(() => {
|
||||
return !!document.querySelector('[id*="spotlight"][style*="flex"], [class*="spotlight-overlay"]') ||
|
||||
document.body.innerHTML.includes('spotlight');
|
||||
});
|
||||
await page.screenshot({ path: '/tmp/v90-ctrlk.png' });
|
||||
return { overlayOpen };
|
||||
});
|
||||
|
||||
await ctx.close();
|
||||
await browser.close();
|
||||
|
||||
const summary = {
|
||||
ts: new Date().toISOString(),
|
||||
test: 'V90 E2E Authed Badge+Spotlight',
|
||||
steps: results,
|
||||
page_errors: errs.slice(0, 5),
|
||||
total_ok: results.filter(r=>r.status==='OK').length,
|
||||
total_fail: results.filter(r=>r.status==='FAIL').length
|
||||
};
|
||||
fs.writeFileSync('/var/www/html/api/playwright-v90-badge-spotlight.json', JSON.stringify(summary, null, 2));
|
||||
console.log(`V90 E2E: OK=${summary.total_ok}/${results.length} FAIL=${summary.total_fail} errs=${errs.length}`);
|
||||
})();
|
||||
170
linkedin-automation-v96.html
Normal file
170
linkedin-automation-v96.html
Normal file
@@ -0,0 +1,170 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr"><head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>LinkedIn Automation - V96 WEVAL</title>
|
||||
<style>
|
||||
:root{--bg:#0a0e1a;--bg2:#141b2d;--bg3:#1e2740;--fg:#e8ecf4;--t2:#9aa5c0;--t3:#5f6b85;--brd:rgba(255,255,255,.08);--gold:#d4af37;--em:#10b981;--cy:#06b6d4;--am:#f59e0b;--co:#ef4444;--vi:#8b5cf6;--sa:#3b82f6;}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{background:var(--bg);color:var(--fg);font-family:'SF Pro Display',system-ui,sans-serif;min-height:100vh;padding:24px}
|
||||
.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px;padding-bottom:16px;border-bottom:1px solid var(--brd)}
|
||||
.hdr h1{font-size:22px;font-weight:700}
|
||||
.hdr h1 span{color:var(--gold)}
|
||||
.sub{color:var(--t2);font-size:12px;margin-top:2px}
|
||||
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:24px}
|
||||
.mc{background:var(--bg2);border:1px solid var(--brd);border-left:3px solid var(--gold);padding:14px;border-radius:8px}
|
||||
.mc-l{font-size:10px;color:var(--t2);text-transform:uppercase;letter-spacing:1px}
|
||||
.mc-v{font-size:26px;font-weight:700;margin:6px 0;color:var(--fg)}
|
||||
.mc-s{font-size:11px;color:var(--em)}
|
||||
.mc.v{border-left-color:var(--vi)}
|
||||
.mc.c{border-left-color:var(--cy)}
|
||||
.mc.e{border-left-color:var(--em)}
|
||||
.mc.a{border-left-color:var(--am)}
|
||||
.mc.s{border-left-color:var(--sa)}
|
||||
.sec{margin-bottom:24px}
|
||||
.sec h2{font-size:14px;font-weight:600;color:var(--t2);text-transform:uppercase;letter-spacing:1.5px;margin-bottom:12px;display:flex;align-items:center;gap:8px}
|
||||
.sec h2::before{content:'';width:6px;height:6px;background:var(--gold);border-radius:50%;box-shadow:0 0 8px var(--gold)}
|
||||
.btns{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
|
||||
.btn{padding:9px 16px;background:var(--bg3);border:1px solid var(--brd);border-radius:6px;color:var(--fg);cursor:pointer;font-size:12px;font-weight:500;transition:all .15s}
|
||||
.btn:hover{background:var(--gold);color:#000;border-color:var(--gold)}
|
||||
.btn.primary{background:var(--gold);color:#000}
|
||||
.qc{display:flex;flex-direction:column;gap:10px;max-height:520px;overflow-y:auto}
|
||||
.q{background:var(--bg2);border:1px solid var(--brd);border-radius:8px;padding:14px;position:relative}
|
||||
.q-h{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
|
||||
.q-t{color:var(--cy);font-size:11px;font-weight:600;text-transform:uppercase}
|
||||
.q-m{display:flex;gap:10px;font-size:10px;color:var(--t3)}
|
||||
.q-c{color:var(--fg);font-size:12px;line-height:1.6;white-space:pre-wrap;background:var(--bg3);padding:12px;border-radius:6px;max-height:200px;overflow-y:auto}
|
||||
.q-a{display:flex;gap:6px;margin-top:10px}
|
||||
.q-a button{padding:5px 11px;background:var(--bg3);border:1px solid var(--brd);border-radius:4px;color:var(--t2);font-size:11px;cursor:pointer}
|
||||
.q-a button:hover{background:var(--em);color:#fff;border-color:var(--em)}
|
||||
.spnr{display:inline-block;width:12px;height:12px;border:2px solid var(--gold);border-top:2px solid transparent;border-radius:50%;animation:sp 1s linear infinite;vertical-align:middle}
|
||||
@keyframes sp{to{transform:rotate(360deg)}}
|
||||
.loading{text-align:center;color:var(--t2);padding:30px;font-size:13px}
|
||||
</style></head><body>
|
||||
|
||||
<div class="hdr">
|
||||
<div>
|
||||
<h1>LinkedIn <span>Automation Hub</span> <span style="font-size:13px;color:var(--t3)">V96</span></h1>
|
||||
<div class="sub">Sovereign AI posts generation + queue + stats · piloted by WEVIA Master</div>
|
||||
</div>
|
||||
<div>
|
||||
<a href="/weval-technology-platform.html" class="btn">← WTP</a>
|
||||
<a href="/wevia-master.html" class="btn primary">WEVIA Chat</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sec">
|
||||
<h2>Page Stats (Weval · 921 followers)</h2>
|
||||
<div class="grid" id="stats"></div>
|
||||
</div>
|
||||
|
||||
<div class="sec">
|
||||
<h2>Actions Sovereign IA (0€ cost)</h2>
|
||||
<div class="btns">
|
||||
<button class="btn primary" onclick="gen('wevia_sovereign_ai')">🤖 Generate WEVIA AI post</button>
|
||||
<button class="btn primary" onclick="gen('ethica_hcp')">💊 Generate Ethica HCP post</button>
|
||||
<button class="btn primary" onclick="gen('vistex_sap')">🏢 Generate Vistex SAP post</button>
|
||||
<button class="btn primary" onclick="gen('case_study')">📊 Generate Case Study</button>
|
||||
<button class="btn" onclick="loadQueue()">🔄 Refresh Queue</button>
|
||||
<button class="btn" onclick="clearQueue()" style="color:var(--co)">🗑 Clear Queue</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sec">
|
||||
<h2>Generated Posts Queue</h2>
|
||||
<div class="qc" id="queue"><div class="loading"><span class="spnr"></span> Loading...</div></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const API='/api/v96-linkedin-automation.php';
|
||||
|
||||
async function loadStats(){
|
||||
try{
|
||||
const r=await fetch(API+'?action=overview');
|
||||
const d=await r.json();
|
||||
const s=d.page_stats||{};
|
||||
const kpi=d.kpis_to_push_score_10||{};
|
||||
document.getElementById('stats').innerHTML = [
|
||||
['Followers','v',s.followers||0,'+'+(s.last_7d_new_followers||0)+' 7d ('+s.pct_growth_followers+'%)'],
|
||||
['Search Appearances','c',s.last_7d_search_appearances||0,'+'+(s.pct_growth_search||0)+'% 7d'],
|
||||
['Post Impressions','e',s.last_7d_post_impressions||0,'+'+(s.pct_growth_impressions||0)+'% 7d'],
|
||||
['Page Visitors','a',s.last_7d_page_visitors||0,'+'+(s.pct_growth_visitors||0)+'% 7d'],
|
||||
['Queue Pending','s',d.queue_pending||0,'AI drafts ready'],
|
||||
['Published','','0','manual or API'],
|
||||
['Pixel Hits','c',d.pixel_hits_month||0,'LinkedIn ref: '+(d.pixel_linkedin_referrer||0)],
|
||||
].map(([l,c,v,sub])=>`<div class="mc ${c}"><div class="mc-l">${l}</div><div class="mc-v">${v}</div><div class="mc-s">${sub}</div></div>`).join('');
|
||||
}catch(e){document.getElementById('stats').innerHTML='<div class="loading" style="color:var(--co)">Error: '+e.message+'</div>';}
|
||||
}
|
||||
|
||||
async function loadQueue(){
|
||||
document.getElementById('queue').innerHTML='<div class="loading"><span class="spnr"></span> Loading queue...</div>';
|
||||
try{
|
||||
const r=await fetch(API+'?action=queue');
|
||||
const d=await r.json();
|
||||
if(!d.queue||d.queue.length===0){
|
||||
document.getElementById('queue').innerHTML='<div class="loading">No posts generated yet. Click a theme button above to generate.</div>';
|
||||
return;
|
||||
}
|
||||
document.getElementById('queue').innerHTML = d.queue.slice().reverse().map(q=>`
|
||||
<div class="q">
|
||||
<div class="q-h">
|
||||
<div class="q-t">${q.theme}</div>
|
||||
<div class="q-m">
|
||||
<span>📏 ${q.chars}c</span>
|
||||
<span>🔢 ${q.metrics_count}m</span>
|
||||
<span>#️⃣ ${q.hashtags_count}h</span>
|
||||
<span>⏱ ${q.latency_ms}ms</span>
|
||||
<span>💰 0€</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="q-c">${(q.post||'').replace(/</g,'<').replace(/\\n/g,'\n')}</div>
|
||||
<div class="q-a">
|
||||
<button onclick="cpy(this,\`${q.id}\`)">📋 Copy to clipboard</button>
|
||||
<button onclick="openLinkedIn()">🔗 Open LinkedIn</button>
|
||||
<span style="color:var(--t3);font-size:10px;padding:5px 0">${q.provider}</span>
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
}catch(e){document.getElementById('queue').innerHTML='<div class="loading" style="color:var(--co)">Error: '+e.message+'</div>';}
|
||||
}
|
||||
|
||||
async function gen(theme){
|
||||
const b=event.target;
|
||||
const orig=b.innerHTML;
|
||||
b.innerHTML='<span class="spnr"></span> Generating via sovereign Ollama...';
|
||||
b.disabled=true;
|
||||
try{
|
||||
const r=await fetch(API+'?action=generate_post&theme='+theme);
|
||||
await r.json();
|
||||
await loadQueue();
|
||||
await loadStats();
|
||||
}catch(e){alert('Error: '+e.message);}
|
||||
b.innerHTML=orig;
|
||||
b.disabled=false;
|
||||
}
|
||||
|
||||
async function clearQueue(){
|
||||
if(!confirm('Clear entire queue?'))return;
|
||||
await fetch(API+'?action=clear_queue');
|
||||
loadQueue();
|
||||
loadStats();
|
||||
}
|
||||
|
||||
function cpy(btn,id){
|
||||
const q=[...document.querySelectorAll('.q')].find(e=>e.textContent.includes(id));
|
||||
const txt=q?.querySelector('.q-c')?.textContent||'';
|
||||
navigator.clipboard.writeText(txt).then(()=>{
|
||||
btn.textContent='✅ Copied!';
|
||||
setTimeout(()=>btn.textContent='📋 Copy to clipboard',2000);
|
||||
});
|
||||
}
|
||||
|
||||
function openLinkedIn(){
|
||||
window.open('https://www.linkedin.com/company/69533182/admin/page-posts/published/','_blank');
|
||||
}
|
||||
|
||||
loadStats();
|
||||
loadQueue();
|
||||
setInterval(loadStats,30000);
|
||||
</script>
|
||||
</body></html>
|
||||
Reference in New Issue
Block a user