9508ddffee
- Add ze-manual-html ConfigMap serving ze-manual.html at /ze/index.html - Mount ze-manual-html in nginx at /usr/share/nginx/html/ze - Add Projects section in portfolio index with ze card linking to /ze
342 lines
31 KiB
YAML
342 lines
31 KiB
YAML
apiVersion: v1
|
||
data:
|
||
index.html: "<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n<meta charset=\"UTF-8\">\n<meta
|
||
name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ze
|
||
— Manual · Zona de Exclusión</title>\n<link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=Syne:wght@400;700;800&display=swap\"
|
||
rel=\"stylesheet\">\n<style>\n *, *::before, *::after { box-sizing: border-box;
|
||
margin: 0; padding: 0; }\n\n :root {\n --bg: #080c10;\n --bg2: #0d1219;\n
|
||
\ --bg3: #111923;\n --border: #1e2d3d;\n --border2: #00B4D8;\n --text:
|
||
#c9d8e8;\n --muted: #4a6070;\n --accent: #00B4D8;\n --accent2: #0077a0;\n
|
||
\ --green: #39d98a;\n --amber: #f5a623;\n --red: #f05252;\n --mono:
|
||
'JetBrains Mono', monospace;\n --sans: 'Syne', sans-serif;\n }\n\n html {
|
||
scroll-behavior: smooth; }\n\n body {\n background: var(--bg);\n color:
|
||
var(--text);\n font-family: var(--mono);\n font-size: 14px;\n line-height:
|
||
1.7;\n min-height: 100vh;\n }\n\n /* Noise overlay */\n body::before {\n
|
||
\ content: '';\n position: fixed;\n inset: 0;\n background-image: url(\"data:image/svg+xml,%3Csvg
|
||
viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence
|
||
type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect
|
||
width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E\");\n
|
||
\ pointer-events: none;\n z-index: 0;\n opacity: 0.4;\n }\n\n .container
|
||
{\n max-width: 860px;\n margin: 0 auto;\n padding: 0 24px 80px;\n position:
|
||
relative;\n z-index: 1;\n }\n\n /* Header */\n header {\n padding: 60px
|
||
0 48px;\n border-bottom: 1px solid var(--border);\n margin-bottom: 48px;\n
|
||
\ position: relative;\n }\n\n .logo-line {\n display: flex;\n align-items:
|
||
center;\n gap: 16px;\n margin-bottom: 20px;\n }\n\n .ze-badge {\n font-family:
|
||
var(--sans);\n font-size: 13px;\n font-weight: 700;\n letter-spacing:
|
||
0.15em;\n color: var(--accent);\n background: rgba(0,180,216,0.08);\n border:
|
||
1px solid rgba(0,180,216,0.3);\n padding: 4px 12px;\n text-transform: uppercase;\n
|
||
\ }\n\n .version {\n font-size: 12px;\n color: var(--muted);\n }\n\n h1
|
||
{\n font-family: var(--sans);\n font-size: clamp(32px, 5vw, 52px);\n font-weight:
|
||
800;\n color: #fff;\n line-height: 1.05;\n letter-spacing: -0.02em;\n
|
||
\ margin-bottom: 16px;\n }\n\n h1 span { color: var(--accent); }\n\n .subtitle
|
||
{\n color: var(--muted);\n font-size: 14px;\n max-width: 500px;\n }\n\n
|
||
\ .scanline {\n position: absolute;\n top: 0; right: 0;\n width: 200px;
|
||
height: 100%;\n background: linear-gradient(90deg, transparent, rgba(0,180,216,0.02));\n
|
||
\ pointer-events: none;\n }\n\n /* Nav */\n nav {\n display: flex;\n gap:
|
||
4px;\n flex-wrap: wrap;\n margin-bottom: 48px;\n padding-bottom: 24px;\n
|
||
\ border-bottom: 1px solid var(--border);\n }\n\n nav a {\n color: var(--muted);\n
|
||
\ text-decoration: none;\n font-size: 12px;\n padding: 6px 12px;\n border:
|
||
1px solid transparent;\n transition: all 0.15s;\n letter-spacing: 0.05em;\n
|
||
\ }\n\n nav a:hover {\n color: var(--accent);\n border-color: var(--border);\n
|
||
\ background: var(--bg2);\n }\n\n /* Sections */\n section {\n margin-bottom:
|
||
56px;\n animation: fadeIn 0.4s ease both;\n }\n\n @keyframes fadeIn {\n from
|
||
{ opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0);
|
||
}\n }\n\n .section-header {\n display: flex;\n align-items: center;\n
|
||
\ gap: 12px;\n margin-bottom: 28px;\n }\n\n .section-num {\n font-size:
|
||
11px;\n color: var(--accent);\n letter-spacing: 0.1em;\n opacity: 0.7;\n
|
||
\ }\n\n h2 {\n font-family: var(--sans);\n font-size: 22px;\n font-weight:
|
||
700;\n color: #fff;\n letter-spacing: -0.01em;\n }\n\n h3 {\n font-family:
|
||
var(--sans);\n font-size: 15px;\n font-weight: 700;\n color: var(--accent);\n
|
||
\ margin-bottom: 12px;\n margin-top: 28px;\n letter-spacing: 0.05em;\n
|
||
\ text-transform: uppercase;\n font-size: 12px;\n }\n\n p {\n color:
|
||
var(--text);\n margin-bottom: 16px;\n max-width: 680px;\n }\n\n /* Code
|
||
blocks */\n pre {\n background: var(--bg2);\n border: 1px solid var(--border);\n
|
||
\ border-left: 3px solid var(--accent);\n padding: 20px 24px;\n overflow-x:
|
||
auto;\n margin: 16px 0 24px;\n position: relative;\n }\n\n pre::before
|
||
{\n content: attr(data-label);\n position: absolute;\n top: 8px; right:
|
||
12px;\n font-size: 10px;\n color: var(--muted);\n letter-spacing: 0.1em;\n
|
||
\ text-transform: uppercase;\n }\n\n code {\n font-family: var(--mono);\n
|
||
\ font-size: 13px;\n color: #e2f0f8;\n }\n\n p code, li code {\n background:
|
||
rgba(0,180,216,0.08);\n border: 1px solid rgba(0,180,216,0.15);\n padding:
|
||
1px 6px;\n color: var(--accent);\n font-size: 12px;\n }\n\n /* Terminal
|
||
mockup */\n .terminal {\n background: #05080b;\n border: 1px solid var(--border);\n
|
||
\ margin: 20px 0 28px;\n }\n\n .terminal-bar {\n background: var(--bg3);\n
|
||
\ border-bottom: 1px solid var(--border);\n padding: 10px 16px;\n display:
|
||
flex;\n align-items: center;\n gap: 8px;\n }\n\n .dot { width: 10px; height:
|
||
10px; border-radius: 50%; }\n .dot-r { background: #f05252; }\n .dot-y { background:
|
||
#f5a623; }\n .dot-g { background: #39d98a; }\n\n .terminal-title {\n font-size:
|
||
11px;\n color: var(--muted);\n margin-left: 8px;\n letter-spacing: 0.05em;\n
|
||
\ }\n\n .terminal-body {\n padding: 20px 24px;\n font-size: 13px;\n line-height:
|
||
1.8;\n }\n\n .prompt { color: var(--accent); }\n .cmd { color: #fff; }\n .out-green
|
||
{ color: var(--green); }\n .out-muted { color: var(--muted); }\n .out-amber
|
||
{ color: var(--amber); }\n .out-red { color: var(--red); }\n .out-blue { color:
|
||
#60a5fa; }\n .out-white { color: #e2f0f8; }\n\n /* Tables */\n table {\n width:
|
||
100%;\n border-collapse: collapse;\n margin: 16px 0 28px;\n font-size:
|
||
13px;\n }\n\n th {\n text-align: left;\n padding: 10px 16px;\n background:
|
||
var(--bg3);\n border: 1px solid var(--border);\n color: var(--accent);\n
|
||
\ font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n
|
||
\ font-weight: 500;\n }\n\n td {\n padding: 10px 16px;\n border: 1px
|
||
solid var(--border);\n color: var(--text);\n vertical-align: top;\n }\n\n
|
||
\ tr:nth-child(even) td { background: rgba(255,255,255,0.01); }\n\n td:first-child
|
||
{ color: var(--accent); font-weight: 500; }\n\n /* Badges */\n .badge {\n display:
|
||
inline-block;\n padding: 2px 8px;\n font-size: 11px;\n font-weight: 700;\n
|
||
\ letter-spacing: 0.05em;\n border-radius: 2px;\n }\n\n .badge-green {
|
||
background: rgba(57,217,138,0.12); color: var(--green); border: 1px solid rgba(57,217,138,0.25);
|
||
}\n .badge-amber { background: rgba(245,166,35,0.12); color: var(--amber); border:
|
||
1px solid rgba(245,166,35,0.25); }\n .badge-red { background: rgba(240,82,82,0.12);
|
||
\ color: var(--red); border: 1px solid rgba(240,82,82,0.25); }\n\n /* Cards
|
||
*/\n .card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit,
|
||
minmax(240px, 1fr));\n gap: 16px;\n margin: 20px 0 32px;\n }\n\n .card
|
||
{\n background: var(--bg2);\n border: 1px solid var(--border);\n padding:
|
||
20px;\n transition: border-color 0.15s;\n }\n\n .card:hover { border-color:
|
||
var(--accent2); }\n\n .card-icon {\n font-size: 20px;\n margin-bottom:
|
||
12px;\n display: block;\n }\n\n .card-title {\n font-family: var(--sans);\n
|
||
\ font-weight: 700;\n color: #fff;\n font-size: 14px;\n margin-bottom:
|
||
8px;\n }\n\n .card-desc {\n color: var(--muted);\n font-size: 12px;\n
|
||
\ line-height: 1.6;\n }\n\n /* Divider */\n .divider {\n border: none;\n
|
||
\ border-top: 1px solid var(--border);\n margin: 48px 0;\n }\n\n /* Keys
|
||
*/\n kbd {\n display: inline-block;\n background: var(--bg3);\n border:
|
||
1px solid var(--border);\n border-bottom: 2px solid var(--muted);\n padding:
|
||
2px 8px;\n font-family: var(--mono);\n font-size: 12px;\n color: #fff;\n
|
||
\ border-radius: 3px;\n }\n\n /* Scoring bars */\n .score-row {\n display:
|
||
flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n }\n\n
|
||
\ .score-label { color: var(--text); min-width: 140px; font-size: 13px; }\n .score-pts
|
||
{ color: var(--accent); min-width: 48px; font-size: 12px; }\n\n .score-bar-bg
|
||
{\n flex: 1;\n height: 4px;\n background: var(--bg3);\n border-radius:
|
||
2px;\n overflow: hidden;\n }\n\n .score-bar {\n height: 100%;\n background:
|
||
var(--accent);\n border-radius: 2px;\n animation: grow 0.8s ease both;\n
|
||
\ }\n\n @keyframes grow { from { width: 0 !important; } }\n\n /* Footer */\n
|
||
\ footer {\n border-top: 1px solid var(--border);\n padding-top: 24px;\n
|
||
\ margin-top: 48px;\n color: var(--muted);\n font-size: 12px;\n display:
|
||
flex;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px;\n
|
||
\ }\n\n footer a { color: var(--accent); text-decoration: none; }\n\n /* Blinking
|
||
cursor */\n .cursor::after {\n content: '█';\n color: var(--accent);\n
|
||
\ animation: blink 1s step-end infinite;\n }\n\n @keyframes blink { 0%,100%{opacity:1}
|
||
50%{opacity:0} }\n</style>\n</head>\n<body>\n<div class=\"container\">\n\n <header>\n
|
||
\ <div class=\"scanline\"></div>\n <div class=\"logo-line\">\n <span
|
||
class=\"ze-badge\">Zona de Exclusión</span>\n <span class=\"version\">v1.0
|
||
· @ZonaDeExclusion</span>\n </div>\n <h1><span>ze</span> — Manual de instrucciones</h1>\n
|
||
\ <p class=\"subtitle\">Herramienta CLI para gestionar la presencia en X y Reddit.
|
||
Busca, puntúa y genera respuestas con IA usando el contenido del blog.</p>\n </header>\n\n
|
||
\ <nav>\n <a href=\"#instalacion\">Instalación</a>\n <a href=\"#uso-rapido\">Uso
|
||
rápido</a>\n <a href=\"#busqueda\">Modo búsqueda</a>\n <a href=\"#respuestas\">Respuestas</a>\n
|
||
\ <a href=\"#manual\">Modo manual</a>\n <a href=\"#opciones\">Opciones CLI</a>\n
|
||
\ <a href=\"#scoring\">Scoring</a>\n <a href=\"#personalizar\">Personalizar</a>\n
|
||
\ </nav>\n\n <!-- INSTALACIÓN -->\n <section id=\"instalacion\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">01</span>\n <h2>Instalación</h2>\n </div>\n\n
|
||
\ <h3>Dependencias del sistema</h3>\n <pre data-label=\"bash\"><code># Linux
|
||
X11\nsudo apt install xclip\n\n# Linux Wayland\nsudo apt install wl-clipboard</code></pre>\n\n
|
||
\ <h3>Dependencias Python</h3>\n <pre data-label=\"bash\"><code>cd ze-promote\npip
|
||
install -r requirements.txt</code></pre>\n\n <h3>Variables de entorno</h3>\n
|
||
\ <pre data-label=\"bash\"><code>cp .env.example .env\n# Edita .env con tus
|
||
claves</code></pre>\n\n <table>\n <tr><th>Variable</th><th>Necesaria</th><th>Para
|
||
qué</th></tr>\n <tr><td>ANTHROPIC_API_KEY</td><td>Sí</td><td>Generar respuestas
|
||
con Claude</td></tr>\n <tr><td>GETX_API_KEY</td><td>No</td><td>Búsquedas
|
||
en X/Twitter. Sin ella solo funciona Reddit</td></tr>\n </table>\n\n <h3>Instalar
|
||
el comando ze</h3>\n <pre data-label=\"bash\"><code>bash install.sh\nsource
|
||
~/.bashrc # o ~/.zshrc si usas zsh</code></pre>\n <p>Crea el alias <code>ze</code>
|
||
en tu shell y el ejecutable <code>/usr/local/bin/ze</code>. Después puedes usar
|
||
<code>ze</code> desde cualquier directorio.</p>\n </section>\n\n <hr class=\"divider\">\n\n
|
||
\ <!-- USO RÁPIDO -->\n <section id=\"uso-rapido\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">02</span>\n <h2>Uso rápido</h2>\n </div>\n\n
|
||
\ <div class=\"card-grid\">\n <div class=\"card\">\n <span class=\"card-icon\">\U0001F50D</span>\n
|
||
\ <div class=\"card-title\">Búsqueda automática</div>\n <div class=\"card-desc\">Busca
|
||
en X y Reddit, puntúa resultados y genera respuestas.</div>\n </div>\n <div
|
||
class=\"card\">\n <span class=\"card-icon\">✍️</span>\n <div class=\"card-title\">Modo
|
||
manual</div>\n <div class=\"card-desc\">Pega cualquier tweet o post para
|
||
generar una respuesta directamente.</div>\n </div>\n <div class=\"card\">\n
|
||
\ <span class=\"card-icon\">⚙️</span>\n <div class=\"card-title\">Flexible</div>\n
|
||
\ <div class=\"card-desc\">Filtra por fuente, limita resultados o desactiva
|
||
Twitter si no tienes clave.</div>\n </div>\n </div>\n\n <div class=\"terminal\">\n
|
||
\ <div class=\"terminal-bar\">\n <div class=\"dot dot-r\"></div><div
|
||
class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n <span class=\"terminal-title\">chemavx@chemavx-k8</span>\n
|
||
\ </div>\n <div class=\"terminal-body\">\n <div><span class=\"prompt\">$
|
||
</span><span class=\"cmd\">ze</span></div>\n <div><span class=\"prompt\">$
|
||
</span><span class=\"cmd\">ze --manual</span></div>\n <div><span class=\"prompt\">$
|
||
</span><span class=\"cmd\">ze --no-twitter</span></div>\n <div><span class=\"prompt\">$
|
||
</span><span class=\"cmd\">ze --limit 10</span></div>\n <div><span class=\"prompt\">$
|
||
</span><span class=\"cmd\">ze --help</span><span class=\"cursor\"></span></div>\n
|
||
\ </div>\n </div>\n </section>\n\n <hr class=\"divider\">\n\n <!-- MODO
|
||
BÚSQUEDA -->\n <section id=\"busqueda\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">03</span>\n <h2>Modo búsqueda</h2>\n </div>\n\n
|
||
\ <p>Al arrancar sin flags, el programa hace tres cosas automáticamente:</p>\n\n
|
||
\ <div class=\"terminal\">\n <div class=\"terminal-bar\">\n <div
|
||
class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n
|
||
\ <span class=\"terminal-title\">ze — arranque</span>\n </div>\n <div
|
||
class=\"terminal-body\">\n <div><span class=\"prompt\">$ </span><span class=\"cmd\">ze</span></div>\n
|
||
\ <br>\n <div><span class=\"out-muted\">── Zona de Exclusión — Promotion
|
||
Tool ──</span></div>\n <br>\n <div><span class=\"out-green\">✓</span>
|
||
<span class=\"out-white\">9 artículos del blog cargados</span> <span class=\"out-muted\">|</span>
|
||
\ <span class=\"out-white\">68 resultados encontrados</span></div>\n </div>\n
|
||
\ </div>\n\n <h3>La tabla de resultados</h3>\n <p>Cada resultado muestra:
|
||
score, recomendación automática, fuente, autor, preview del contenido, estadísticas
|
||
y fecha.</p>\n\n <div class=\"terminal\">\n <div class=\"terminal-bar\">\n
|
||
\ <div class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot
|
||
dot-g\"></div>\n <span class=\"terminal-title\">tabla de resultados</span>\n
|
||
\ </div>\n <div class=\"terminal-body\" style=\"overflow-x:auto\">\n
|
||
\ <div><span class=\"out-muted\"># Score Acción Src Autor
|
||
\ Stats Fecha</span></div>\n <div><span class=\"out-white\">1
|
||
\ 78 </span><span class=\"out-green\">✅ Responder</span><span class=\"out-white\">
|
||
\ r/UFOs u/uap_tracker ↑312 \U0001F4AC7 16/05 09:00</span></div>\n
|
||
\ <div><span class=\"out-white\">2 53 </span><span class=\"out-green\">✅
|
||
Responder</span><span class=\"out-white\"> \U0001D54F @DocAlienista ♥5.5K
|
||
\U0001F4AC8 \U0001F501589 13/05 18:57</span></div>\n <div><span class=\"out-white\">3
|
||
\ 45 </span><span class=\"out-amber\">⚠️ Opcional</span><span class=\"out-white\">
|
||
\ r/UFOs u/someone ↑60 \U0001F4AC24 15/05 19:11</span></div>\n
|
||
\ <div><span class=\"out-white\">4 22 </span><span class=\"out-red\">❌
|
||
Saltar </span><span class=\"out-white\"> r/UFOs u/another ↑5 \U0001F4AC199
|
||
\ 15/05 16:08</span></div>\n </div>\n </div>\n\n <h3>Recomendación
|
||
automática</h3>\n <table>\n <tr><th>Indicador</th><th>Condición</th><th>Por
|
||
qué</th></tr>\n <tr>\n <td><span class=\"badge badge-green\">✅ Responder</span></td>\n
|
||
\ <td>Score ≥ 40 y < 15 comentarios</td>\n <td>Poca competencia,
|
||
buena visibilidad garantizada</td>\n </tr>\n <tr>\n <td><span
|
||
class=\"badge badge-amber\">⚠️ Opcional</span></td>\n <td>Score ≥ 40 y
|
||
15-80 comentarios</td>\n <td>Puede merecer la pena si el contenido encaja
|
||
muy bien</td>\n </tr>\n <tr>\n <td><span class=\"badge badge-red\">❌
|
||
Saltar</span></td>\n <td>Score < 40, >80 comentarios o post de opinión</td>\n
|
||
\ <td>Demasiado ruido o sin contexto factual para responder</td>\n </tr>\n
|
||
\ </table>\n\n <p style=\"color: var(--muted); font-size: 12px;\">Los posts
|
||
de opinión (\"what do you think\", \"¿qué pensáis?\", \"debate\", \"CMV\"…) se
|
||
descartan automáticamente.</p>\n\n <h3>Navegar por los resultados</h3>\n <p>Tras
|
||
la tabla, el programa muestra cada post con su panel de detalle:</p>\n\n <div
|
||
class=\"terminal\">\n <div class=\"terminal-bar\">\n <div class=\"dot
|
||
dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n
|
||
\ <span class=\"terminal-title\">panel de detalle</span>\n </div>\n
|
||
\ <div class=\"terminal-body\">\n <div><span class=\"out-muted\">╭──
|
||
Reddit r/UFOs ● 78 pts u/uap_tracker 1/15 ──╮</span></div>\n <div><span
|
||
class=\"out-muted\">│ </span><span class=\"out-white\">Pentagon releases new UAP
|
||
footage from 2023 </span><span class=\"out-muted\">│</span></div>\n <div><span
|
||
class=\"out-muted\">│ │</span></div>\n
|
||
\ <div><span class=\"out-muted\">│ </span><span class=\"out-muted\">↑ 312
|
||
upvotes | \U0001F4AC 7 comentarios · 16/05 09:00 </span><span class=\"out-muted\">│</span></div>\n
|
||
\ <div><span class=\"out-muted\">│ </span><span class=\"out-blue\">https://reddit.com/r/UFOs/comments/abc123/
|
||
\ </span><span class=\"out-muted\">│</span></div>\n <div><span class=\"out-muted\">│
|
||
\ │</span></div>\n <div><span
|
||
class=\"out-muted\">│ </span><span class=\"out-white\">Recomendación: </span><span
|
||
class=\"out-green\">✅ Responder </span><span class=\"out-muted\">│</span></div>\n
|
||
\ <div><span class=\"out-muted\">╰───────────────────────────────────────────────────╯</span></div>\n
|
||
\ <div><span class=\"out-white\">Acción (R/S/Q): </span><span class=\"cursor\"></span></div>\n
|
||
\ </div>\n </div>\n\n <table>\n <tr><th>Tecla</th><th>Acción</th></tr>\n
|
||
\ <tr><td><kbd>r</kbd></td><td>Generar respuesta con Claude</td></tr>\n <tr><td><kbd>s</kbd></td><td>Saltar
|
||
al siguiente resultado</td></tr>\n <tr><td><kbd>q</kbd></td><td>Salir</td></tr>\n
|
||
\ </table>\n </section>\n\n <hr class=\"divider\">\n\n <!-- RESPUESTAS -->\n
|
||
\ <section id=\"respuestas\">\n <div class=\"section-header\">\n <span
|
||
class=\"section-num\">04</span>\n <h2>Generación de respuestas</h2>\n </div>\n\n
|
||
\ <p>Al pulsar <kbd>r</kbd>, Claude genera una respuesta teniendo en cuenta:</p>\n
|
||
\ <ul style=\"margin: 0 0 20px 20px; color: var(--text); line-height: 2;\">\n
|
||
\ <li>El texto del post o tweet completo</li>\n <li>Los artículos publicados
|
||
en el blog (busca si alguno es relevante para incluir su link)</li>\n <li>El
|
||
idioma del post — responde en inglés si el post es en inglés, en español si es
|
||
en español</li>\n <li>El límite de 240 caracteres para X</li>\n </ul>\n\n
|
||
\ <div class=\"terminal\">\n <div class=\"terminal-bar\">\n <div
|
||
class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n
|
||
\ <span class=\"terminal-title\">respuesta generada</span>\n </div>\n
|
||
\ <div class=\"terminal-body\">\n <div><span class=\"out-muted\">╭───
|
||
Respuesta generada ──────────────────────────────╮</span></div>\n <div><span
|
||
class=\"out-muted\">│ </span><span class=\"out-white\">Ruppelt dirigió Blue Book
|
||
1951-53, su etapa más </span><span class=\"out-muted\">│</span></div>\n <div><span
|
||
class=\"out-muted\">│ </span><span class=\"out-white\">activa. Un briefing clasificado
|
||
del 52 sería </span><span class=\"out-muted\">│</span></div>\n <div><span
|
||
class=\"out-muted\">│ </span><span class=\"out-white\">historia UAP fundamental.
|
||
30 días para saberlo. </span><span class=\"out-muted\">│</span></div>\n <div><span
|
||
class=\"out-muted\">│ │</span></div>\n
|
||
\ <div><span class=\"out-muted\">│ </span><span class=\"out-green\">187/240
|
||
caracteres ✓ </span><span class=\"out-muted\">│</span></div>\n
|
||
\ <div><span class=\"out-muted\">╰─────────────────────────────────────────────────────╯</span></div>\n
|
||
\ <div><span class=\"out-white\">Respuesta (C/E/S): </span><span class=\"cursor\"></span></div>\n
|
||
\ </div>\n </div>\n\n <table>\n <tr><th>Tecla</th><th>Acción</th></tr>\n
|
||
\ <tr><td><kbd>c</kbd></td><td>Copiar al portapapeles</td></tr>\n <tr><td><kbd>e</kbd></td><td>Editar
|
||
inline antes de copiar</td></tr>\n <tr><td><kbd>s</kbd></td><td>Descartar
|
||
y pasar al siguiente</td></tr>\n </table>\n\n <h3>URL de destino</h3>\n
|
||
\ <p>Tras copiar, el programa muestra exactamente dónde pegar la respuesta:</p>\n\n
|
||
\ <div class=\"terminal\">\n <div class=\"terminal-bar\">\n <div
|
||
class=\"dot dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n
|
||
\ <span class=\"terminal-title\">url de destino</span>\n </div>\n <div
|
||
class=\"terminal-body\">\n <div><span class=\"out-green\">✓ Copiado al
|
||
portapapeles</span></div>\n <br>\n <div><span class=\"out-muted\">╭──────────────────────────────────────────────────╮</span></div>\n
|
||
\ <div><span class=\"out-muted\">│ </span><span class=\"out-white\">→ Pega
|
||
tu respuesta aquí: </span><span class=\"out-muted\">│</span></div>\n
|
||
\ <div><span class=\"out-muted\">│ </span><span class=\"out-blue\">https://reddit.com/r/UFOs/comments/abc123/
|
||
\ </span><span class=\"out-muted\">│</span></div>\n <div><span class=\"out-muted\">╰──────────────────────────────────────────────────╯</span></div>\n
|
||
\ </div>\n </div>\n\n <h3>Links automáticos del blog</h3>\n <p>Claude
|
||
compara el tema concreto del post con los artículos publicados. Si hay solapamiento
|
||
real, incluye la URL del artículo de forma natural. Si no hay coincidencia precisa,
|
||
no incluye ningún link — una respuesta sin link es mejor que un link forzado.</p>\n
|
||
\ </section>\n\n <hr class=\"divider\">\n\n <!-- MODO MANUAL -->\n <section
|
||
id=\"manual\">\n <div class=\"section-header\">\n <span class=\"section-num\">05</span>\n
|
||
\ <h2>Modo manual</h2>\n </div>\n\n <p>Para cuando encuentras algo interesante
|
||
navegando manualmente — como cuando alguien te manda una captura de pantalla.</p>\n\n
|
||
\ <pre data-label=\"bash\"><code>ze --manual\n# o\nze -m</code></pre>\n\n <div
|
||
class=\"terminal\">\n <div class=\"terminal-bar\">\n <div class=\"dot
|
||
dot-r\"></div><div class=\"dot dot-y\"></div><div class=\"dot dot-g\"></div>\n
|
||
\ <span class=\"terminal-title\">flujo manual</span>\n </div>\n <div
|
||
class=\"terminal-body\">\n <div><span class=\"prompt\">$ </span><span class=\"cmd\">ze
|
||
--manual</span></div>\n <br>\n <div><span class=\"out-muted\">Pega
|
||
el texto del tweet o post (línea vacía para terminar):</span></div>\n <div><span
|
||
class=\"out-white\">Estados Unidos desclasifica 162 archivos UAP...</span></div>\n
|
||
\ <div><span class=\"out-white\">[línea vacía]</span></div>\n <br>\n
|
||
\ <div><span class=\"out-muted\">Fuente (t=Twitter, r=Reddit): </span><span
|
||
class=\"out-white\">t</span></div>\n <br>\n <div><span class=\"out-muted\">Generando
|
||
respuesta…</span></div>\n </div>\n </div>\n </section>\n\n <hr class=\"divider\">\n\n
|
||
\ <!-- OPCIONES CLI -->\n <section id=\"opciones\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">06</span>\n <h2>Opciones de línea de comandos</h2>\n
|
||
\ </div>\n\n <table>\n <tr><th>Flag</th><th>Descripción</th><th>Ejemplo</th></tr>\n
|
||
\ <tr><td>(sin flags)</td><td>Búsqueda completa en X y Reddit</td><td><code>ze</code></td></tr>\n
|
||
\ <tr><td><code>--manual, -m</code></td><td>Pega texto directamente para generar
|
||
respuesta</td><td><code>ze -m</code></td></tr>\n <tr><td><code>--no-twitter</code></td><td>Omitir
|
||
búsquedas en X/Twitter</td><td><code>ze --no-twitter</code></td></tr>\n <tr><td><code>--no-reddit</code></td><td>Omitir
|
||
búsquedas en Reddit</td><td><code>ze --no-reddit</code></td></tr>\n <tr><td><code>--limit
|
||
N, -n N</code></td><td>Mostrar solo los N mejores resultados</td><td><code>ze
|
||
-n 10</code></td></tr>\n <tr><td><code>--help</code></td><td>Mostrar ayuda</td><td><code>ze
|
||
--help</code></td></tr>\n </table>\n\n <pre data-label=\"ejemplos\"><code>ze
|
||
--no-twitter # solo Reddit, útil sin GETX_API_KEY\nze --limit 15 #
|
||
ver solo el top 15\nze -m # modo manual\nze --no-reddit --limit
|
||
5 # solo los 5 mejores tweets</code></pre>\n </section>\n\n <hr class=\"divider\">\n\n
|
||
\ <!-- SCORING -->\n <section id=\"scoring\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">07</span>\n <h2>Algoritmo de scoring</h2>\n
|
||
\ </div>\n\n <p>Cada resultado recibe una puntuación de 0 a 100 basada en
|
||
cuatro criterios:</p>\n\n <div style=\"margin: 24px 0 32px;\">\n <div
|
||
class=\"score-row\">\n <span class=\"score-label\">Engagement</span>\n
|
||
\ <span class=\"score-pts\">0–40 pts</span>\n <div class=\"score-bar-bg\"><div
|
||
class=\"score-bar\" style=\"width:40%\"></div></div>\n </div>\n <div
|
||
class=\"score-row\">\n <span class=\"score-label\">Recencia</span>\n <span
|
||
class=\"score-pts\">0–30 pts</span>\n <div class=\"score-bar-bg\"><div
|
||
class=\"score-bar\" style=\"width:30%; animation-delay:0.1s\"></div></div>\n </div>\n
|
||
\ <div class=\"score-row\">\n <span class=\"score-label\">Idioma español</span>\n
|
||
\ <span class=\"score-pts\">0–20 pts</span>\n <div class=\"score-bar-bg\"><div
|
||
class=\"score-bar\" style=\"width:20%; animation-delay:0.2s\"></div></div>\n </div>\n
|
||
\ <div class=\"score-row\">\n <span class=\"score-label\">Competencia
|
||
baja</span>\n <span class=\"score-pts\">0–10 pts</span>\n <div class=\"score-bar-bg\"><div
|
||
class=\"score-bar\" style=\"width:10%; animation-delay:0.3s\"></div></div>\n </div>\n
|
||
\ </div>\n\n <table>\n <tr><th>Criterio</th><th>Puntos</th><th>Detalle</th></tr>\n
|
||
\ <tr><td>Engagement</td><td>0–40</td><td>Likes + upvotes en escala logarítmica</td></tr>\n
|
||
\ <tr><td>Recencia</td><td>0–30</td><td><6h → 30 · <24h → 22 · <48h
|
||
→ 12 · <72h → 5</td></tr>\n <tr><td>Idioma español</td><td>0–20</td><td>Detectado
|
||
por palabras clave en el texto</td></tr>\n <tr><td>Competencia baja</td><td>0–10</td><td>0
|
||
replies → 10 · <5 → 7 · <15 → 4 · <40 → 1</td></tr>\n </table>\n\n
|
||
\ <p style=\"color: var(--muted); font-size: 12px;\">Tweets con cero engagement
|
||
en las tres métricas (likes, replies y retweets todos por debajo del umbral mínimo)
|
||
se descartan antes de puntuar.</p>\n </section>\n\n <hr class=\"divider\">\n\n
|
||
\ <!-- PERSONALIZAR -->\n <section id=\"personalizar\">\n <div class=\"section-header\">\n
|
||
\ <span class=\"section-num\">08</span>\n <h2>Personalizar búsquedas</h2>\n
|
||
\ </div>\n\n <p>Edita <code>ze_promote/sources.py</code> para cambiar las
|
||
queries y subreddits:</p>\n\n <pre data-label=\"sources.py\"><code># Queries
|
||
para X/Twitter (texto plano, sin operadores avanzados)\nTWITTER_QUERIES = [\n
|
||
\ \"UAP OVNI desclasificacion 2026\",\n \"OVNI España avistamiento\",\n \"UAP
|
||
disclosure Pentagon\",\n]\n\n# Subreddits y queries para Reddit\nREDDIT_SEARCHES
|
||
= [\n (\"UFOs\", \"UAP\"),\n (\"HighStrangeness\", \"UAP\"),\n (\"conspiracyespanol\",
|
||
\"OVNI\"),\n (\"es\", \"OVNI avistamiento\"),\n # añade más: (\"subreddit\",
|
||
\"query\")\n]</code></pre>\n\n <h3>Estructura del proyecto</h3>\n <pre data-label=\"árbol\"><code>ze-promote/\n├──
|
||
install.sh # Instalador del comando ze\n├── main.py # Punto
|
||
de entrada CLI\n├── ze_promote/\n│ ├── scraper.py # Scraping de zonadeexclusion.com\n│
|
||
\ ├── sources.py # Búsqueda en X y Reddit\n│ ├── scorer.py # Algoritmo
|
||
de scoring 0-100\n│ ├── responder.py # Generación de respuestas con Claude\n│
|
||
\ └── ui.py # Interfaz Rich (tabla, paneles, prompts)\n├── requirements.txt\n├──
|
||
.env.example\n└── README.md</code></pre>\n </section>\n\n <footer>\n <span>ze
|
||
· Zona de Exclusión · <a href=\"https://zonadeexclusion.com\">zonadeexclusion.com</a></span>\n
|
||
\ <span>@ZonaDeExclusion · v1.0</span>\n </footer>\n\n</div>\n</body>\n</html>\n"
|
||
kind: ConfigMap
|
||
metadata:
|
||
name: ze-manual-html
|
||
namespace: portfolio
|