Files
k8s-manifests/portfolio/configmap-ze-manual.yaml
chemavx 9508ddffee feat(portfolio): add ze manual page at /ze
- 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
2026-05-16 11:21:44 +00:00

342 lines
31 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 &lt; 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 &lt; 40, &gt;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\">040 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\">030 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\">020 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\">010 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>040</td><td>Likes + upvotes en escala logarítmica</td></tr>\n
\ <tr><td>Recencia</td><td>030</td><td>&lt;6h → 30 · &lt;24h → 22 · &lt;48h
→ 12 · &lt;72h → 5</td></tr>\n <tr><td>Idioma español</td><td>020</td><td>Detectado
por palabras clave en el texto</td></tr>\n <tr><td>Competencia baja</td><td>010</td><td>0
replies → 10 · &lt;5 → 7 · &lt;15 → 4 · &lt;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