1 of 200

THE RED GUILD / 01

​

una introducción random

a algunas cosas interesantes

De un commit, a un trabajo autónomo

matta

security knowmad

@mattaereal

2 of 200

GITHUB × AI

THE RED GUILD / 02

Seis ejercicios

01

Publicar la landing

02

Ejecutar un check propio

03

Conversar con Hermes

04

Exponer una página local

05

Recibir un evento de GitHub

06

Pedir una review del PR

Automatizar checks, delegar una revisión y evaluar el resultado con criterio humano.

3 of 200

GITHUB × AI

THE RED GUILD / 03

6 mandamientos

01

No usar AI

(a menos que lo autorice)

02

Pensar, probar, fallar

03

Pingponear con otras

personas, amigos

04

Buscar en internet

05

Consultarle a un agente en

chat

06

Delegárselo a un agente

4 of 200

EJERCICIO 1

THE RED GUILD / 04

01

Una landing publicada

Cloná el material. Mové la app a una carpeta lab

nueva.

5 of 200

EJERCICIO 1

THE RED GUILD / 05

La landing del HackerSpace

Nodo Serrano · Tandil

La landing viene lista.

​

Reconocé el título y las secciones.

​

El ejercicio sigue un cambio visible.

Foto del espacio publicada en NodoSerrano.org.

6 of 200

EJERCICIO 1

THE RED GUILD / 06

Clonar el material en tu equipo

Host · acceso al material resuelto antes del taller

git clone https://github.com/theredguild/github-ai-automation-lab.git

cd github-ai-automation-lab

Este checkout contiene guía y slides. No será el repo de tu app.

7 of 200

EJERCICIO 1

THE RED GUILD / 07

Mover la app a una carpeta lab

Host · desde github-ai-automation-lab/

mv hackerspace-site ../lab

El destino lab NO debe existir. Si hay un error, detenete.

8 of 200

TERMINAL Y WEB

THE RED GUILD / 08

Entrar en TU proyecto

Host · después del movimiento correcto

cd ../lab

pwd

Ejemplo de salida

/home/TU_USUARIO/proyectos/lab

Debe terminar en /lab. Si falla cd, no ejecutes git init.

9 of 200

EJERCICIO 1

THE RED GUILD / 09

Todo el sitio viaja en esta carpeta

Host · carpeta lab, fuera del material

lab/

app/

package.json

pnpm-lock.yaml

.gitignore

.dockerignore

Dockerfile

.devcontainer/devcontainer.json

Vista parcial. public/ y el resto del sitio también se movieron; .git sigue en el material.

10 of 200

EJERCICIO 1

THE RED GUILD / 10

Crear TU repositorio en GitHub

01

Abrí github.com/new en tu

cuenta personal.

02

Elegí un nombre y Private.

03

Dejalo vacío: sin README,

licencia ni .gitignore.

Interfaz de referencia · documentación oficial

11 of 200

EJERCICIO 1

THE RED GUILD / 11

Crear un token fino para la práctica

01

Abrí Fine-grained tokens →

Generate new token.

02

Nombre reconocible y

vencimiento corto: 7 días.

03

Resource owner: tu cuenta

personal.

Referencia oficial de GitHub · 2022 · interfaz histórica

12 of 200

EJERCICIO 1

THE RED GUILD / 12

Seleccionar sólo TU repo privado

01

Repository access: Only select

repositories.

02

Seleccioná sólo el repo recién

creado.

03

No elijas All repositories.

Referencia oficial de GitHub · 2022 · cuentas de ejemplo

13 of 200

EJERCICIO 1

THE RED GUILD / 13

Permisos para Git y PR del ejercicio 1

Repository permission

Acceso

Contents

Read and write

Pull requests

Read and write

Metadata

Read-only, automático

14 of 200

TERMINAL Y WEB

THE RED GUILD / 14

Login con el token de TU repo

Host · después de crear repo y token

gh auth login

gh auth status

Elegí Paste an authentication token. Pegalo en privado, con entrada oculta.

15 of 200

EJERCICIO 1

THE RED GUILD / 15

Opciones del login interactivo

Ejemplo de prompts · GitHub CLI 2.103.3

GitHub.com

Paste an authentication token

HTTPS

Authenticate Git: Yes

Token: entrada oculta

El token sólo se pega cuando gh lo pide. No es un comando ni una captura real.

16 of 200

EJERCICIO 1

THE RED GUILD / 16

Iniciar el historial de lab

Host · sólo dentro de lab, con Dockerfile y package.json

git init -b main

git config user.name

git config user.email

Nombre y email del commit no son el login de GitHub.

17 of 200

EJERCICIO 1

THE RED GUILD / 17

Publicar esta carpeta en TU repo

Host · lab, antes de instalar dependencias

git add .

git commit -m "Inicio del sitio"

git remote add origin https://github.com/TU_USUARIO/REPO.git

git push -u origin main

Revisá git status antes del commit. El repo remoto debe estar vacío.

18 of 200

EJERCICIO 1

THE RED GUILD / 18

Abrir el proyecto en el editor

lab/

app/

public/

package.json

pnpm-lock.yaml

Dockerfile

.gitignore

.devcontainer/

package.json · fragmento

{

"scripts": {

"dev": "next dev",

"build": "next build"

}

}

Editor local · ejemplo ilustrativo. Los archivos ya vienen en la app.

19 of 200

EJERCICIO 1

THE RED GUILD / 19

.gitignore ya viene incluido

lab/

app/

public/

package.json

pnpm-lock.yaml

Dockerfile

.gitignore

.devcontainer/

.gitignore

**/node_modules/

**/.next/

**/.vercel/

.env

.env.*

!.env.example

*.pem

*.key

Fragmento: no reemplaces el archivo incluido; ya protege también caches y metadatos.

20 of 200

EJERCICIO 1

THE RED GUILD / 20

Verificar herramientas del host

Host · raíz del clon de TU repo

node --version

pnpm --version

Ejemplo de salida

v22.x.x

10.20.0

Node 22 y pnpm 10.20.0 en tu equipo.

21 of 200

EJERCICIO 1

THE RED GUILD / 21

Instalar las dependencias

Host · raíz del clon de TU repo

pnpm install --frozen-lockfile

Ejemplo de salida

Lockfile is up to date

Done in … using pnpm v10.20.0

La landing y el lockfile ya vienen incluidos en el starter.

22 of 200

EJERCICIO 1

THE RED GUILD / 22

Build de producción

Host · lab, después de instalar

pnpm build

Ejemplo de salida

Compiled successfully

Generating static pages …

El build va antes de pnpm dev. Esperá que termine sin errores.

23 of 200

EJERCICIO 1

THE RED GUILD / 23

Ver archivos ignorados después del build

Host · lab, después de pnpm install y pnpm build

git status --ignored

git ls-files node_modules .next

Si ls-files no muestra nada, no hay archivos seguidos que reparar.

24 of 200

EJERCICIO 1

THE RED GUILD / 24

Sólo si ya se habían versionado artefactos

Reparación opcional · no ejecutar en el starter limpio

git rm -r --cached CARPETA

CARPETA: node_modules o .next, sólo si ls-files la mostró. --cached conserva el disco.

25 of 200

EJERCICIO 1

THE RED GUILD / 25

Archivos que vamos a usar

Archivo

Qué vas a tocar

app/page.tsx

El título visible de la landing

package.json

Comandos del proyecto

pnpm-lock.yaml

Dependencias fijadas

Dockerfile

Entorno del runner

26 of 200

EJERCICIO 1

THE RED GUILD / 26

Servidor de desarrollo

Host · lab, después del build

pnpm dev

Ejemplo de salida

Local: http://localhost:3000

Ready in …

Abrí http://localhost:3000 en tu equipo. Dejá esta terminal abierta.

27 of 200

EJERCICIO 1

THE RED GUILD / 27

Primera comprobación de la página

EN TU

PROYECTO

01

Comprobá el título HackerSpace Nodo Serrano.

02

Usá Conocer el espacio para navegar por la

página.

03

Revisá los enlaces de contacto.

04

Localizá el título en app/page.tsx.

28 of 200

EJERCICIO 1

THE RED GUILD / 28

Importar TU repo en Vercel

01

Add New → Project → Import Git

Repository.

02

Elegí tu cuenta y TU repo

personal.

03

Autorizá sólo ese repo a la

GitHub App de Vercel.

Interfaz de referencia · documentación oficial

29 of 200

EJERCICIO 1

THE RED GUILD / 29

La integración tiene sus propios permisos

01

GitHub → Installed GitHub Apps

→ Vercel.

02

Configure → Only select

repositories.

03

Elegí tu repo y guardá; no

pegues el PAT.

Ejemplo genérico de GitHub App · documentación oficial

30 of 200

EJERCICIO 1

THE RED GUILD / 30

Reconocer la autodetección del framework

01

Framework: Next.js.

02

Raíz: . en TU repo; no hackerspace-site/.

03

Conservá detección por package.json y lockfile.

Recorte de documentación oficial de Vercel

31 of 200

EJERCICIO 1

THE RED GUILD / 31

Configuración del deployment

Campo

Ejemplo del workshop

Framework Preset

Next.js

Root Directory

. (raíz de TU repo)

Install Command

Automático según pnpm-lock.yaml

Build Command

pnpm build

Environment Variables

Ninguna necesaria para la landing

32 of 200

EJERCICIO 1

THE RED GUILD / 32

Leer el build antes de abrir la URL

01

Después de Deploy, abrí Build Logs.

02

Si falla, leé el primer error.

03

Ready no basta: también hay que abrir la landing.

Interfaz de referencia · documentación oficial

33 of 200

EJERCICIO 1

THE RED GUILD / 33

Deployment, Logs y Resources

01

Deployment: estado y

URL de la versión.

02

Logs: salida de la

ejecución.

03

Resources: archivos y

funciones publicados.

Interfaz de referencia · documentación oficial

34 of 200

EJERCICIO 1

THE RED GUILD / 34

Comprobar lo publicado en Vercel

01

Verificá Production, Ready y main.

02

Abrí la URL y reconocé la landing.

03

Abrí el commit en GitHub y compará el SHA.

Interfaz de referencia · documentación oficial

35 of 200

EJERCICIO 1

THE RED GUILD / 35

Comprobar qué rama es Production

01

Settings → Environments →

Production.

02

Branch Tracking: main.

03

Preview: ramas no asignadas

a Production.

Captura pública · Vercel Community · septiembre de 2025

36 of 200

EJERCICIO 1

THE RED GUILD / 36

Guardar, confirmar y enviar

Guardar

archivo en tu equipo

Commit

versión local

Push

repositorio de

GitHub

El repositorio recibe el cambio después del push.

Guardar cambia el archivo. Commit crea una versión. Push la envía a GitHub.

37 of 200

EJERCICIO 1

THE RED GUILD / 37

Branch development

Host · raíz del clon de TU repo

git switch main

git pull --ff-only

git switch -c development

Ejemplo de salida

Switched to a new branch 'development'

Si development ya existe, usá git switch development

38 of 200

EJERCICIO 1

THE RED GUILD / 38

Cambiar de rama: switch y checkout

switch: cambia ramas

checkout: también restaura archivos

Crear: git switch -c development

Crear: git checkout -b development

Cambiar: git switch main

Cambiar: git checkout main

39 of 200

EJERCICIO 1

THE RED GUILD / 39

Cambio visible en development

app/page.tsx

ANTES

<h1 id="titulo">HackerSpace Nodo Serrano</h1>

DESPUÉS

<h1 id="titulo">Aprender y construir en comunidad</h1>

Cambiá sólo el texto y guardá el archivo

40 of 200

EJERCICIO 1

THE RED GUILD / 40

Diff antes del commit

Terminal · development · después de editar el título

git status

git diff

Ejemplo de salida

On branch development

modified: app/page.tsx

Revisá el cambio antes de confirmarlo.

41 of 200

EJERCICIO 1

THE RED GUILD / 41

Commit y push de development

Host · raíz del clon de TU repo

git diff

git add app/page.tsx

git commit -m "Actualiza la portada del HackerSpace"

git push -u origin development

Ejemplo de salida

development -> development

El push entrega el nuevo commit a la integración de Vercel

42 of 200

EJERCICIO 1

THE RED GUILD / 42

El commit que acabás de enviar

Host · raíz del clon de TU repo

git log -1 --oneline

git rev-parse --short HEAD

Ejemplo de salida

49a1de0 Actualiza la portada del HackerSpace

49a1de0

El SHA identifica esa versión del cambio.

43 of 200

EJERCICIO 1

THE RED GUILD / 43

Production y Preview

GitHub · main

build

Production

GitHub · development

build

Preview

main conserva Production. development recibe su Preview.

44 of 200

EJERCICIO 1

THE RED GUILD / 44

Preview no requiere otro proyecto

01

Push a development: Preview

automático.

02

Mismo proyecto →

Deployments → Preview.

03

Comprobá rama, commit y

Ready.

Interfaz de referencia · documentación oficial

45 of 200

EJERCICIO 1

THE RED GUILD / 45

Preview creado no significa acceso anónimo

01

Deployment Protection

controla quién puede entrar.

02

Si pide login, usá la sesión

autorizada.

03

No desactives protección

para ocultar un fallo.

Interfaz de referencia · documentación oficial

46 of 200

EJERCICIO 1

THE RED GUILD / 46

Comparación de las dos URLs

EN TU

PROYECTO

01

En Preview, buscá Aprender y construir en

comunidad.

02

En Production, buscá HackerSpace Nodo Serrano.

03

Compará branch y SHA en Vercel.

04

Conservá ambas URLs abiertas.

47 of 200

EJERCICIO 1

THE RED GUILD / 47

Propuesta de integración en main

01

En GitHub, abrí Pull requests.

02

Creá un PR con base main y compare development.

03

Leé el título y la descripción antes de enviarlo.

Interfaz de referencia · documentación oficial

48 of 200

GITHUB × AI

THE RED GUILD / 48

development propone cambios a main

01

Base: main, la rama que recibe los cambios.

02

Compare: development, la rama que los propone.

03

El PR muestra el diff antes de integrar.

Interfaz de referencia · documentación oficial

49 of 200

EJERCICIO 1

THE RED GUILD / 49

Corroborar Preview desde el PR

01

Último commit: buscá el

estado de Vercel.

02

Inspect / Visit Preview / View

deployment.

03

En Vercel compará repo,

rama, SHA y URL.

Interfaz de referencia · documentación oficial

50 of 200

EJERCICIO 1

THE RED GUILD / 50

El estado de Vercel también llega a GitHub

01

Buscá Vercel en checks del último commit.

02

Details abre el deployment correspondiente.

03

No es el workflow manual de Actions que veremos después.

Interfaz de referencia · documentación oficial

51 of 200

TERMINAL Y WEB

THE RED GUILD / 51

Crear el PR con gh

Terminal del proyecto · repo de la práctica

gh pr create --base main --head development \

--title "Actualiza la portada del HackerSpace" \

--body "Cambia el titulo visible de la landing."

gh pr list --state open

Ejemplo de salida

https://github.com/TU_USUARIO/REPO/pull/NUMERO

La CLI devuelve el enlace del PR creado.

52 of 200

EJERCICIO 1

THE RED GUILD / 52

Files changed del PR

01

Abrí Files changed.

02

Localizá app/page.tsx.

03

Compará el texto eliminado y el agregado.

04

Abrí el Preview asociado si aparece.

Interfaz de referencia · documentación oficial

53 of 200

TERMINAL Y WEB

THE RED GUILD / 53

Leer el PR desde la terminal

Reemplazá NUMERO por el número del PR

gh pr view NUMERO --json number,title,state,url

gh pr diff NUMERO

gh pr view NUMERO --web

Ejemplo de salida

PR #NUMERO · development → main

app/page.tsx

El mismo PR tiene una vista en la terminal y otra en GitHub.

54 of 200

EJERCICIO 1

THE RED GUILD / 54

La revisión desde GitHub

01

Files changed muestra el cambio propuesto.

02

Review changes permite enviar el comentario de revisión.

03

Otra persona puede aprobar o pedir cambios.

Interfaz de referencia · documentación oficial

55 of 200

EJERCICIO 1

THE RED GUILD / 55

El mismo review desde gh

Terminal · repo de práctica

gh pr diff NUMERO

gh pr review NUMERO --comment \

--body "Revisé el cambio del título."

gh pr view NUMERO --web

Comment sirve también para practicar con tu propio PR.

56 of 200

EJERCICIO 1

THE RED GUILD / 56

Tres formas de integrar un PR

Opción

Qué queda en main

Merge commit

Los commits de la rama y un commit de merge

Squash and merge

Un commit que agrupa los cambios del PR

Rebase and merge

Commits reaplicados con SHA nuevos y sin merge

57 of 200

EJERCICIO 1

THE RED GUILD / 57

Merge commit conserva el recorrido

Cada círculo es un commit. Los SHA son de ejemplo.

tiempo

main

development

4f2a9b1

81c7d02

c50e8ab

49a1de0

ab8f40c

M e73ac91

El dibujo representa commits de ejemplo.

58 of 200

EJERCICIO 1

THE RED GUILD / 58

Squash agrupa los cambios

Cada círculo es un commit. Los SHA son de ejemplo.

tiempo

main

development

4f2a9b1

81c7d02

c50e8ab

49a1de0

ab8f40c

S 958bc21

2 commits → 1 nuevo commit en main

El dibujo representa commits de ejemplo.

59 of 200

EJERCICIO 1

THE RED GUILD / 59

Rebase deja una historia lineal

Cada círculo es un commit. Los SHA son de ejemplo.

tiempo

main

development

4f2a9b1

81c7d02

c50e8ab

49a1de0

ab8f40c

D′ 958bc21

E′ b62a103

Los commits reaplicados tienen SHA nuevos.

El dibujo representa commits de ejemplo.

60 of 200

EJERCICIO 1

THE RED GUILD / 60

La integración desde la interfaz

01

Revisá la conversación y los

checks.

02

Elegí el método de integración

en el desplegable.

03

Para el taller: Create a merge

commit y confirmar.

Interfaz de referencia · documentación oficial

61 of 200

TERMINAL Y WEB

THE RED GUILD / 61

Merge del PR con gh

Después de revisar el diff · conservar development

gh pr merge NUMERO --merge

gh pr view NUMERO --json state,mergeCommit

Ejemplo de salida

state: MERGED

mergeCommit: SHA_DEL_MERGE

Elegí una sola operación de merge para ese PR.

62 of 200

EJERCICIO 1

THE RED GUILD / 62

La historia después de integrar

Cada círculo es un commit. Los SHA son de ejemplo.

tiempo

main

development

4f2a9b1

81c7d02

c50e8ab

49a1de0

ab8f40c

M e73ac91

main avanzó al merge y development conserva su referencia.

63 of 200

EJERCICIO 1

THE RED GUILD / 63

Comprobación después del merge

EN TU

PROYECTO

01

Esperá el nuevo deployment de Production.

02

Comprobá Aprender y construir en comunidad.

03

Revisá branch main y el commit del merge.

04

Conservá development para los próximos

ejercicios.

64 of 200

EJERCICIO 1

THE RED GUILD / 64

Diagnóstico del primer deployment

Síntoma

Dónde mirar

El repo no aparece

Owner y autorización de la integración

No detecta Next.js

Root Directory y package.json

El build falla

Primer error de los logs

No aparece el cambio

Push, branch, SHA y URL abierta

Se subieron builds o dependencias

.gitignore y reparación de la guía 1.1

65 of 200

EJERCICIO 1

THE RED GUILD / 65

Resultado del ejercicio

01

Un repo propio con main y development.

02

Una aplicación Next.js que construye.

03

URLs de Production y Preview identificadas.

04

Un cambio integrado mediante un PR.

05

Los archivos confirmados y enviados a GitHub.

66 of 200

EJERCICIO 1

THE RED GUILD / 66

Demo opcional: abrir Codespaces

01

Sólo TU repo publicado y main

funcionando.

02

Reutilizá una instancia o abrí

Code → Codespaces.

03

Revisá main, cuenta

pagadora y cuota.

Interfaz de referencia · documentación oficial

67 of 200

EJERCICIO 1

THE RED GUILD / 67

Demo: la misma landing, remota

Codespace · checkout propio limpio, main ya sincronizada

pnpm install --frozen-lockfile

pnpm dev

Sólo landing. Sin gh auth login ni refresh. Ejercicios 2–6 en el host.

68 of 200

EJERCICIO 1

THE RED GUILD / 68

Ver la demo y volver al host

01

Ports → 3000 → Open in Browser.

02

Mantené el puerto privado y reconocé la landing.

03

Ctrl+C, Stop codespace y volvé al host.

Interfaz de referencia · documentación oficial

69 of 200

EJERCICIO 1

THE RED GUILD / 69

El mismo recorrido en tu proyecto

Se conserva

Se adapta

Repo, branches, commits y PR.

Integración Git con Vercel.

Comparación de Preview y

Production.

Framework y directorio raíz.

Gestor, lockfile y build.

Variables que realmente necesita

la app.

70 of 200

EJERCICIO 2

THE RED GUILD / 70

02

Docker y runner

Volvé al host. Los checks se ejecutarán en

containers.

71 of 200

EJERCICIO 2

THE RED GUILD / 71

Host, VM y container

MÁQUINA VIRTUAL

CONTAINERS LINUX

Aplicaciones

Kernel propio de la VM

Hipervisor

Container A

Container B

Proceso Node

Proceso Python

Filesystem A

Filesystem B

Kernel Linux del host compartido

Host físico o VM

Cada container aísla procesos y archivos, pero comparte el kernel del host Linux.

72 of 200

EJERCICIO 2

THE RED GUILD / 72

Dos configuraciones, dos usos

Archivo dentro de lab

Para qué se usa

Dockerfile

docker build local: imagen taller

.dockerignore

Archivos fuera del contexto de build

.devcontainer/devcontainer.json

Sólo demo opcional de Codespaces

73 of 200

EJERCICIO 2

THE RED GUILD / 73

Leer la receta antes de construir

En el editor: lab/Dockerfile · extracto del archivo real

FROM node:22.23.4-bookworm-slim

RUN npm install --global pnpm@10.20.0

WORKDIR /workspace

USER node

CMD ["bash"]

Base → instalación → carpeta → usuario → comando inicial.

74 of 200

EJERCICIO 2

THE RED GUILD / 74

Cliente y daemon de Docker

Host · lab, con Docker Desktop o Engine iniciado

docker version

Ejemplo de salida

Client: Docker Engine …

Server: Docker Engine …

docker version debe mostrar Client y Server.

75 of 200

EJERCICIO 2

THE RED GUILD / 75

Herramientas incluidas

Herramienta

Uso

Node 22 y pnpm 10.20.0

Aplicación y checks

git y gh 2.103.3

Git y API de GitHub

cloudflared 2026.10.3

Túneles de los ejercicios 4 a 6

Runner 2.338.2

Ejecutar un job de Actions

libatomic1

Node administrado por Hermes en Linux glibc

76 of 200

EJERCICIO 2

THE RED GUILD / 76

Comprobar permisos antes del build

Preflight con el instructor · Linux con Docker Engine

id -u

id -g

El ejemplo usa node 1000:1000. Si tus IDs difieren, elegí antes la alternativa de la guía.

77 of 200

EJERCICIO 2

THE RED GUILD / 77

Dockerfile, imagen y container

Dockerfile

receta

Imagen

herramientas

build

Container A

Container B

run

La imagen se construye una vez. Cada docker run crea una instancia.

78 of 200

EJERCICIO 2

THE RED GUILD / 78

Build sólo para UID/GID 1000:1000

Host · si elegiste el build adaptado, omití este comando

docker build -t taller .

Ejemplo de salida

Building …

Imagen disponible: taller

No ejecutes ambas opciones: este build sobrescribe la imagen adaptada.

79 of 200

EJERCICIO 2

THE RED GUILD / 79

Reconocer la imagen construida

Host del taller

docker image ls taller

Ejemplo de salida

REPOSITORY TAG

taller latest

Buscá la imagen taller. Todavía no es un container en ejecución.

80 of 200

EJERCICIO 2

THE RED GUILD / 80

Primera shell dentro de la imagen

Host del taller

docker run --rm -it --name herramientas taller

CMD abre Bash. No hace falta una red propia para explorar la imagen.

81 of 200

EJERCICIO 2

THE RED GUILD / 81

Reconocer dónde estás

Dentro del container herramientas

whoami

pwd

node --version

pnpm --version

Ejemplo de salida

node

/workspace

v22.x.x

10.20.0

Usuario node, directorio /workspace y las versiones esperadas.

82 of 200

EJERCICIO 2

THE RED GUILD / 82

Otro proceso en el mismo container

Otra terminal del host, mientras herramientas siga abierto

docker exec -it herramientas bash

Aparece una segunda shell en la misma instancia.

83 of 200

EJERCICIO 2

THE RED GUILD / 83

Workflow, job y steps

checks.yml

Workflow

Job check

Runner elegido

Instalar lockfile

Biome

TypeScript

El job elige un runner. Sus steps ejecutan los comandos.

84 of 200

EJERCICIO 2

THE RED GUILD / 84

Permisos cuando aparece Actions

Operación del mismo repo

Permiso del PAT

Iniciar y leer runs por CLI

Actions: Read and write

Enviar .github/workflows por Git

Workflows: Write

Runner registrado desde la web

Ningún permiso nuevo del PAT

85 of 200

EJERCICIO 2

THE RED GUILD / 85

Agregar el workflow por terminal

Alternativa CLI · si elegís la web, seguí a su paso sin ejecutar este bloque

git switch main

git pull --ff-only

mkdir -p .github/workflows

cp docs/snippets/checks.yml .github/workflows/checks.yml

git add .github/workflows/checks.yml

git commit -m "Agrega checks manuales"

git push origin main

Elegí una sola forma de agregar el archivo: terminal o web.

86 of 200

EJERCICIO 2

THE RED GUILD / 86

Evento, permisos y runner

Editor · .github/workflows/checks.yml · primera parte

name: Checks del workshop

on:

workflow_dispatch:

permissions:

contents: read

jobs:

check:

runs-on: [self-hosted, linux, workshop]

timeout-minutes: 10

workshop debe coincidir con la label del runner.

87 of 200

EJERCICIO 2

THE RED GUILD / 87

Los comandos que ejecutará el job

Editor · mismo job · segunda parte

steps:

- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1

with:

persist-credentials: false

- run: pnpm install --frozen-lockfile

- run: pnpm lint

- run: pnpm typecheck

El commit de checkout queda fijado y Git no conserva su credencial.

88 of 200

EJERCICIO 2

THE RED GUILD / 88

Agregar el workflow desde GitHub

EN TU

PROYECTO

01

Alternativa web: abrí docs/snippets/checks.yml.

02

En GitHub creá .github/workflows/checks.yml en

main con ese contenido.

03

Después, sincronizá main y development con el

bloque siguiente.

04

Si ya lo enviaste por CLI, sólo comprobá el archivo

en GitHub.

89 of 200

EJERCICIO 2

THE RED GUILD / 89

El mismo workflow en development

Host · árbol limpio · web o CLI: sincronizá ambas ramas

git switch main

git pull --ff-only

git switch development

git merge main

git push origin development

development contiene el workflow que se va a ejecutar.

90 of 200

EJERCICIO 2

THE RED GUILD / 90

Cómo recibe trabajo el runner

Persona

Inicia workflow

GitHub

Job pendiente

UI o gh workflow run

Runner

Conexión saliente

Consulta trabajo

Job asignado

El runner inicia la conexión hacia GitHub. No requiere un túnel.

91 of 200

EJERCICIO 2

THE RED GUILD / 91

Registro desde la interfaz de GitHub

01

Settings, Actions, Runners.

02

Elegí New self-hosted runner.

03

Seleccioná Linux y la arquitectura de tu imagen.

Interfaz de referencia · documentación oficial

92 of 200

EJERCICIO 2

THE RED GUILD / 92

Instancia dedicada al runner

Host · nueva terminal para el runner

docker run --rm -it --name lab-runner taller

Instancia efímera, sin perfil de Hermes ni archivos del host.

93 of 200

EJERCICIO 2

THE RED GUILD / 93

Registro de un runner efímero

Dentro de lab-runner

cd /opt/actions-runner

./config.sh --url https://github.com/TU_USUARIO/REPO \

--name workshop-runner --labels workshop --ephemeral

El programa pide el token temporal con entrada oculta. No uses tu PAT.

94 of 200

EJERCICIO 2

THE RED GUILD / 94

Escucha del runner

Dentro de /opt/actions-runner

exec ./run.sh

Ejemplo de salida

Listening for Jobs

La terminal queda esperando trabajo.

95 of 200

EJERCICIO 2

THE RED GUILD / 95

Inicio del workflow por la web

01

Abrí Actions y Checks del

workshop.

02

Elegí Run workflow y la branch

development.

03

Confirmá el inicio de esa

ejecución.

Interfaz de referencia · documentación oficial

96 of 200

EJERCICIO 2

THE RED GUILD / 96

Inicio del workflow por gh

Otra terminal del host

gh workflow run checks.yml --ref development

gh run list --workflow checks.yml --limit 5

Anotá el RUN_ID de la ejecución recién creada.

97 of 200

EJERCICIO 2

THE RED GUILD / 97

Esperar el resultado del run

Host · reemplazá RUN_ID por el número real

gh run view RUN_ID --json status,conclusion

gh run view RUN_ID --web

Ejemplo de salida

check completed success

Estado puntual por CLI; seguimiento del run y steps en el navegador.

98 of 200

EJERCICIO 2

THE RED GUILD / 98

Lectura del primer error

01

Abrí el job y sus steps.

02

Localizá el primer step que

falla.

03

Leé archivo, línea y mensaje

antes de reintentar.

Interfaz de referencia · documentación oficial

99 of 200

EJERCICIO 2

THE RED GUILD / 99

Un fallo de tipos controlado

app/estado.ts

ANTES

export const plazas: number = 20;

DESPUÉS

export const plazas: number = "20";

Guardá este cambio en development.

100 of 200

EJERCICIO 2

THE RED GUILD / 100

Enviar el error de tipos

Host · development

git diff

git add app/estado.ts

git commit -m "Introduce un error de tipos para la practica"

git push origin development

El nuevo SHA identifica la versión que debe fallar.

101 of 200

EJERCICIO 2

THE RED GUILD / 101

Nuevo runner para el segundo run

EN TU

PROYECTO

01

Creá otra instancia lab-runner desde la misma

imagen.

02

Obtené un token nuevo y repetí config.sh con

--ephemeral.

03

Iniciá run.sh y dispará checks.yml sobre

development.

04

Comprobá que TypeScript señale app/estado.ts.

102 of 200

EJERCICIO 2

THE RED GUILD / 102

El fallo desde la terminal

Host · RUN_ID de la ejecución con el error

gh run view RUN_ID --log-failed

Ejemplo de salida

app/estado.ts(1,14): error TS2322:

Type 'string' is not assignable to type 'number'.

TypeScript debe señalar la asignación incompatible.

103 of 200

EJERCICIO 2

THE RED GUILD / 103

Corrección del error

app/estado.ts

ANTES

export const plazas: number = "20";

DESPUÉS

export const plazas: number = 20;

Guardá y enviá la corrección.

104 of 200

EJERCICIO 2

THE RED GUILD / 104

Confirmar y ejecutar la corrección

Host · después de repetir el registro efímero

git add app/estado.ts

git commit -m "Corrige el tipo de plazas"

git push origin development

# Con otro runner efímero registrado y escuchando:

gh workflow run checks.yml --ref development

Buscá el run nuevo y comparalo con los dos anteriores.

105 of 200

EJERCICIO 2

THE RED GUILD / 105

Tres versiones y sus resultados

Ejecución

Qué se reconoce

Baseline

SHA inicial y checks completos

Error introducido

SHA nuevo y typecheck fallido

Corrección

Tercer SHA y checks completos

En tu proyecto

Los mismos comandos que usa tu equipo

106 of 200

EJERCICIO 2

THE RED GUILD / 106

Comprobación antes del agente

Host del taller

docker ps

Ejemplo de salida

CONTAINER ID IMAGE COMMAND NAMES

…

El runner efímero terminó antes de dar acceso al agente.

107 of 200

EJERCICIO 3

THE RED GUILD / 107

03

Hermes con OpenRouter

y Telegram

Configurar el agente y conversar desde dos

interfaces.

108 of 200

EJERCICIO 3

THE RED GUILD / 108

Instancia del agente

Host · runner cerrado · imagen taller

docker run -it --name lab-agent \

-p 127.0.0.1:8644:8644 \

-v hermes-home:/home/node/.hermes \

-v "$PWD":/workspace \

taller

Hermes en lab-agent:8644. Next irá en lab-app:3000.

Comparten /workspace y node_modules; paquetes del sistema separados. Perfil Hermes sólo en lab-agent.

109 of 200

EJERCICIO 3

THE RED GUILD / 109

Modelo, harness y agente

Parte

En esta práctica

Modelo

Responde y propone llamadas a herramientas. Opción gratuita.

Harness

Hermes coordina el modelo y ejecuta herramientas habilitadas.

Agente

Sistema con modelo, harness, instrucciones y herramientas.

Proveedor

OpenRouter da acceso al modelo.

Canal

Terminal y Telegram.

Entorno

lab-agent ejecuta Hermes y sus herramientas.

110 of 200

EJERCICIO 3

THE RED GUILD / 110

Instalar Hermes en vivo

lab-agent · /workspace · usuario node · proyecto y perfil escribibles

hermes --version

Si la instalación o el check fallan, detenete. No uses Hermes como root ni borres el perfil.

1. Seguí la instalación CLI para Linux dentro de lab-agent.

Guía oficial: https://hermes-agent.nousresearch.com/docs/getting-started/installation#linux--macos--wsl2

2. Después de instalar, comprobá la versión. No necesita proveedor.

111 of 200

EJERCICIO 3

THE RED GUILD / 111

Wizard de configuración

Terminal del agente · Hermes disponible

hermes setup

Full Setup permite seleccionar OpenRouter y usar tu propia credencial.

112 of 200

EJERCICIO 3

THE RED GUILD / 112

Selección de OpenRouter

01

Navegá con las flechas hasta OpenRouter.

02

Confirmá la elección.

03

Si pide API key, creala en openrouter.ai/settings/keys.

04

Autorizá o ingresá la credencial en el wizard, sin proyectarla.

Captura de referencia publicada por OpenRouter

113 of 200

EJERCICIO 3

THE RED GUILD / 113

Elección del modelo gratuito

01

En el catálogo de OpenRouter, elegí una entrada :free.

02

Comprobá contexto de al menos 64K y soporte de herramientas.

03

Seleccioná ese ID exacto en Hermes.

04

Continuá con esa opción gratuita y sin fallback a modelos pagos.

114 of 200

EJERCICIO 3

THE RED GUILD / 114

Primera conversación por terminal

Con OpenRouter y el modelo guardados

hermes chat

Ejemplo de salida

Hermes conectado.

Mensaje de prueba: Respondé exactamente: Hermes conectado.

115 of 200

EJERCICIO 3

THE RED GUILD / 115

Creación del bot en Telegram

EN TU

PROYECTO

01

Abrí el BotFather oficial: t.me/BotFather.

02

Enviá /newbot y elegí un nombre.

03

Elegí un username único terminado en bot.

04

Guardá el token en privado para el wizard.

116 of 200

EJERCICIO 3

THE RED GUILD / 116

Canal Telegram en el wizard

Tené el token del bot y tu ID numérico de Telegram

hermes gateway setup

# Canal: Telegram

# Bot token: el que entregó BotFather

# Allowed users: tu ID numérico

El ID numérico identifica al usuario permitido. El @username es otro dato.

117 of 200

EJERCICIO 3

THE RED GUILD / 117

Gateway de mensajería

Sólo si el wizard no dejó un gateway activo

hermes gateway run

Si el wizard ya lo inició, conservá esa instancia. Usá sólo una por bot.

118 of 200

EJERCICIO 3

THE RED GUILD / 118

Primera respuesta por Telegram

EN TU

PROYECTO

01

Abrí el chat privado del bot que creaste.

02

Pulsá Start y enviá /help.

03

Enviá: Respondé exactamente: Hermes conectado.

04

Comprobá la respuesta y los mensajes del

gateway.

119 of 200

EJERCICIO 3

THE RED GUILD / 119

Telegram antes del túnel

Long polling por HTTPS

Gateway

Hermes

API de

Telegram

App de

Telegram

Consulta actualizaciones

Envía un mensaje

Recibe la respuesta

Recibe el mensaje

Hermes inicia la conexión. Este canal funciona sin abrir un puerto público.

120 of 200

EJERCICIO 3

THE RED GUILD / 120

Diagnóstico de la conversación

Síntoma

Qué revisar

Error 401 del proveedor

Credencial de OpenRouter

Error 429 o modelo sin endpoint

Cuota o disponibilidad de la entrada gratuita

Usuario no autorizado

ID en la allowlist de Telegram

Dos gateways para el mismo bot

Dejar una sola instancia activa

Responde /help, pero no el mensaje

Proveedor, modelo y logs del gateway

121 of 200

EJERCICIO 4

THE RED GUILD / 121

04

Entender y crear

el túnel

Seguir una request desde otra máquina hasta tu

aplicación.

122 of 200

TÚNELES

THE RED GUILD / 122

Cloudflare sin cuenta ni dominio

Quick Tunnel

Una URL temporal para el servicio local.

Sin registrar un dominio para seguir el taller.

Los túneles con nombre y dominio propio quedan como referencia opcional.

123 of 200

EJERCICIO 4

THE RED GUILD / 123

Las partes de una URL

https://tu-hostname.trycloudflare.com/api/health

HTTPS · puerto 443

DNS público

Ruta de Next

Estructura de ejemplo: usá el hostname real de tus logs.

El hostname localiza el servicio. El path elige un recurso.

124 of 200

EJERCICIO 4

THE RED GUILD / 124

Dos localhost diferentes

Host del taller

Container cloudflared

localhost

vuelve al host

localhost

vuelve al connector

Para otro container: http://lab-app:3000

127.0.0.1 siempre vuelve al entorno desde el que se hace la consulta.

125 of 200

EJERCICIO 4

THE RED GUILD / 125

Dirección según el lugar de la consulta

Desde dónde

Origen de Next

Host del taller

http://127.0.0.1:3000

Dentro de lab-app

http://127.0.0.1:3000

Otro container en red-taller

http://lab-app:3000

Otra computadora en Internet

La URL HTTPS del túnel

126 of 200

EJERCICIO 4

THE RED GUILD / 126

Red compartida: recién cuando hace falta

Host · antes de app y connector del túnel

docker network create red-taller

Ejemplo de salida

NAME DRIVER

red-taller bridge

Conecta app y connector por nombre. No era necesaria en ejercicios anteriores.

127 of 200

EJERCICIO 4

THE RED GUILD / 127

Container de la aplicación

Host · raíz del repo · imagen taller

docker run -it --name lab-app \

--network red-taller \

-p 127.0.0.1:3000:3000 \

-v "$PWD":/workspace \

taller

Next en lab-app:3000; Hermes en lab-agent:8644.

Comparten /workspace y node_modules; paquetes del sistema separados. Perfil Hermes sólo en lab-agent.

128 of 200

EJERCICIO 4

THE RED GUILD / 128

Publicación de un puerto

Host

127.0.0.1:3000

lab-app

0.0.0.0:3000

-p 127.0.0.1:3000:3000

Publicación del host

Dirección de escucha de Next

127.0.0.1:3000 del host se reenvía al puerto 3000 de lab-app.

129 of 200

EJERCICIO 4

THE RED GUILD / 129

La app que usaremos como origen

Dentro de lab-app · /workspace

pnpm install --frozen-lockfile

pnpm build

pnpm start --hostname 0.0.0.0

Ejemplo de salida

Local: http://localhost:3000

Ready in …

El servidor queda escuchando en el puerto 3000.

130 of 200

EJERCICIO 4

THE RED GUILD / 130

Endpoint sencillo para observar la conexión

Editor · app/api/health/route.ts · ya provisto

export function GET() {

return Response.json({ status: "ok", service: "nodoserrano" });

}

GET /api/health devuelve un JSON pequeño.

131 of 200

EJERCICIO 4

THE RED GUILD / 131

Primera request desde el host

Otra terminal del host

curl -i http://127.0.0.1:3000/api/health

Ejemplo de salida

HTTP/1.1 200 OK

{"status":"ok","service":"nodoserrano"}

HTTP 200 y status ok del servicio nodoserrano.

132 of 200

EJERCICIO 4

THE RED GUILD / 132

Request desde la red interna

Host · se crea un cliente temporal en la misma red

docker run --rm --network red-taller \

taller \

curl -i http://lab-app:3000/api/health

Ejemplo de salida

HTTP/1.1 200 OK

{"status":"ok","service":"nodoserrano"}

La respuesta debe ser la del mismo origen.

133 of 200

EJERCICIO 4

THE RED GUILD / 133

Cloudflare y cloudflared

Cloudflare

cloudflared

Red pública que recibe HTTPS y

enruta la request.

Proceso junto al origen que inicia

y mantiene el túnel.

134 of 200

EJERCICIO 4

THE RED GUILD / 134

La conexión empieza desde adentro

Red red-taller

cloudflared

Next

lab-app:3000

Cloudflare

Red pública

Conexión

saliente

cloudflared abre una conexión saliente hacia Cloudflare.

135 of 200

EJERCICIO 4

THE RED GUILD / 135

Primer Quick Tunnel

Host · con lab-app respondiendo en la red interna

docker run --rm -it --name lab-tunnel \

--network red-taller \

taller \

cloudflared tunnel --no-autoupdate \

--url http://lab-app:3000

cloudflared imprime una URL HTTPS trycloudflare.com.

136 of 200

EJERCICIO 4

THE RED GUILD / 136

La URL que generó tu proceso

EN TU

PROYECTO

01

Buscá la URL HTTPS en los logs de cloudflared.

02

Copiala completa y abrila en otra pestaña.

03

Comprobá que muestra la landing del

HackerSpace.

04

Conservá abierta la terminal del túnel.

137 of 200

EJERCICIO 4

THE RED GUILD / 137

La misma ruta por la URL pública

Otra terminal del host · reemplazá TU_URL_PUBLICA

curl -i https://TU_URL_PUBLICA/api/health

Ejemplo de salida

HTTP/1.1 200 OK

{"status":"ok","service":"nodoserrano"}

Compará el body con la respuesta local.

138 of 200

EJERCICIO 4

THE RED GUILD / 138

Ida y vuelta de la request

Cliente

URL HTTPS

Cloudflare

Next

/api/health

cloudflared

La respuesta vuelve

por el mismo

recorrido.

HTTPS público

HTTP interno

Cliente, Cloudflare, connector y origen conservan roles distintos.

139 of 200

EJERCICIO 4

THE RED GUILD / 139

DNS: de un nombre a una dirección

Nombre

Dónde se resuelve

localhost / 127.0.0.1

El propio entorno de la consulta

lab-app

DNS interno de red-taller

Tu hostname trycloudflare.com

DNS público hacia Cloudflare

/api/health

Ruta dentro de la aplicación

140 of 200

EJERCICIO 4

THE RED GUILD / 140

Comprobación desde otro cliente

EN TU

PROYECTO

01

Abrí la URL pública desde el teléfono u otro

navegador.

02

Agregá /api/health al final de esa misma URL.

03

Compará la respuesta con curl local.

04

Identificá qué terminal mantiene la app y cuál el

túnel.

141 of 200

EJERCICIO 4

THE RED GUILD / 141

Interrupción del origen

Host · cloudflared sigue abierto

docker stop lab-app

curl -i https://TU_URL_PUBLICA/api/health

Ejemplo de salida

HTTP/2 502

…

La request pública ya no puede obtener una respuesta sana del origen.

142 of 200

EJERCICIO 4

THE RED GUILD / 142

Recuperar la aplicación

EN TU

PROYECTO

01

En el host: docker start -ai lab-app.

02

Cuando vuelva Bash: pnpm start --hostname

0.0.0.0.

03

En otra terminal repetí curl local y público.

143 of 200

EJERCICIO 4

THE RED GUILD / 143

Otro arranque y otra URL

EN TU

PROYECTO

01

Detené sólo la terminal del túnel con Ctrl+C.

02

Comprobá que la app todavía responde

localmente.

03

Repetí el docker run de cloudflared.

04

Usá el hostname nuevo que impriman sus logs.

144 of 200

EJERCICIO 4

THE RED GUILD / 144

Diagnóstico por capas

Síntoma

Primera comprobación

Falla curl local

Next, build y puerto publicado

Falla lab-app:3000 desde la red

Nombre, red y escucha 0.0.0.0

Connector no conecta

Salida de red y logs de cloudflared

URL anterior no responde

Hostname del último proceso

Origen responde pero ruta no existe

Path enviado y Route Handler

145 of 200

EJERCICIO 4

THE RED GUILD / 145

Qué acceso público estamos habilitando

01

El túnel alcanza el servicio al que apuntaste, con sus rutas.

02

HTTPS protege el transporte público.

03

La URL no reemplaza la autenticación de tu aplicación.

04

GitHub necesita llegar sin un formulario de login interactivo.

146 of 200

EJERCICIO 4

THE RED GUILD / 146

Referencia opcional: dirección estable

Quick Tunnel

Túnel con nombre

Un comando, hostname temporal

y sin cuenta o dominio.

Configuración de cuenta y una

dirección estable para el servicio.

147 of 200

EJERCICIO 4

THE RED GUILD / 147

Referencia de la interfaz de túneles

01

Cloudflare agrupa los túneles en su panel de red.

02

Esta captura muestra Hostname routes.

03

El taller continúa con Quick Tunnels desde la terminal.

Interfaz de referencia · documentación oficial

148 of 200

EJERCICIO 4

THE RED GUILD / 148

El mismo túnel para tu proyecto

EN TU

PROYECTO

01

Identificá el proceso y su puerto de escucha.

02

Comprobá su ruta local de health.

03

Elegí el origen correcto desde donde corre

cloudflared.

04

Seguí una request completa y una interrupción.

149 of 200

EJERCICIO 5

THE RED GUILD / 149

05

GitHub llama a

nuestro servidor

Recibir un webhook firmado y entender cada parte

de su entrega.

150 of 200

EJERCICIO 5

THE RED GUILD / 150

Consultar o recibir un aviso

Polling

Webhook

Tu proceso pregunta si hay

novedades, aunque no haya

cambios.

GitHub hace un POST cuando

ocurre un evento seleccionado.

151 of 200

EJERCICIO 5

THE RED GUILD / 151

Qué contiene el aviso

Persona

Abre un PR

GitHub

POST firmado

Evento pull_request

Next

/api/github

Cloudflare

+ cloudflared

Body JSON → validación → HTTP 200

El evento inicia una request; la respuesta HTTP confirma la recepción.

152 of 200

EJERCICIO 5

THE RED GUILD / 152

El receptor ya está en el proyecto

01

Ruta del ejemplo: POST /api/github.

02

Archivo provisto: app/api/github/route.ts.

03

Hermes puede adaptarlo a tu backend.

04

La firma y los filtros siguen siendo requisitos del receptor.

153 of 200

EJERCICIO 5

THE RED GUILD / 153

Abrir el sobre HTTP

Parte

Qué identifica

POST + /api/github

Método y ruta del receptor

X-GitHub-Event

Tipo de evento: pull_request

X-GitHub-Delivery

ID de esta entrega

X-Hub-Signature-256

HMAC del body con el secret

Body JSON

Repo, acción y datos del PR

154 of 200

EJERCICIO 5

THE RED GUILD / 154

Una firma compartida

GitHub

Secret + body

Receptor

Mismo secret + raw body

Firma enviada

Firma calculada

¿Iguales?

Ambos extremos calculan HMAC-SHA256 sobre los mismos bytes.

155 of 200

EJERCICIO 5

THE RED GUILD / 155

Qué debe hacer el receptor

Pseudocódigo · el código completo ya está provisto

al recibir POST:

leer bytes con límite de tamaño

verificar HMAC con el secret

interpretar JSON y validar el repo

filtrar los eventos permitidos

detectar una entrega repetida

registrar metadata y responder

La firma se comprueba antes de interpretar el JSON.

156 of 200

EJERCICIO 5

THE RED GUILD / 156

GitHub dentro del agente

Host y después shell de lab-agent

docker exec -it lab-agent bash

gh auth login

gh auth status

Token propio del repo: Contents Read + Pull requests Write; Webhooks si administra hooks.

157 of 200

EJERCICIO 5

THE RED GUILD / 157

Preparar el receptor con Hermes

Hermes chat · /workspace

Revisá app/api/github/route.ts de este proyecto.

Adaptalo sólo si hace falta para este backend.

Usá TU_USUARIO/REPO como repo permitido.

Prepará .env.local sin pisar variables existentes.

Generá un secret aleatorio y guardalo allí.

No imprimas secretos ni hagas push.

Explicá qué cambió y cómo comprobarlo.

Tarea para Hermes dentro del repo autorizado.

158 of 200

EJERCICIO 5

THE RED GUILD / 158

Configurar el webhook con Hermes

Hermes chat · /workspace

Configurá un único webhook en TU_USUARIO/REPO.

URL: https://TU_URL_PUBLICA/api/github

Usá el secret de .env.local sin mostrarlo.

Content type JSON, sólo Pull requests y TLS verificado.

No dupliques ni toques hooks de otros servicios.

Mostrá URL, eventos y estado, sin credenciales.

Tarea para Hermes dentro del repo autorizado.

159 of 200

EJERCICIO 5

THE RED GUILD / 159

Crear el webhook desde GitHub

EN TU

PROYECTO

01

Repo → Settings → Webhooks → Add webhook.

02

Payload URL: tu PUBLIC_URL + /api/github.

03

Content type: application/json; pegá tu secret.

04

Sólo Pull requests, SSL verification y Active.

160 of 200

EJERCICIO 5

THE RED GUILD / 160

La configuración nueva en el servidor

EN TU

PROYECTO

01

En la terminal de lab-app detené Next con Ctrl+C.

02

Ejecutá pnpm start --hostname 0.0.0.0.

03

Si cambió el código, hacé pnpm build antes del

start.

04

Comprobá health y el rechazo de una request sin

firma.

161 of 200

EJERCICIO 5

THE RED GUILD / 161

Comprobar el rechazo sin firma

Host · request deliberadamente sin firma

curl -i -X POST http://127.0.0.1:3000/api/github \

-H 'Content-Type: application/json' \

--data '{"action":"opened"}'

Ejemplo de salida

HTTP/1.1 401 Unauthorized

{"error":"invalid_signature"}

Con el receptor configurado, esperamos HTTP 401.

162 of 200

EJERCICIO 5

THE RED GUILD / 162

Encontrar las entregas reales

01

Abrí tu webhook y Recent Deliveries.

02

Elegí el ping o el evento de PR de tu práctica.

03

Inspeccioná Request, Response y el estado HTTP.

Interfaz de referencia · documentación oficial

163 of 200

EJERCICIO 5

THE RED GUILD / 163

Provocar un evento de PR

Host · si ya hay un PR abierto, usá ese PR

git switch development

git pull --ff-only

# Editá el h1 en app/page.tsx y guardá.

git add app/page.tsx

git commit -m "Presentar el HackerSpace de Nodo Serrano"

git push

gh pr create --base main --head development \

--title "Presentar el HackerSpace" \

--body "Cambio de texto para observar el webhook."

Un PR development → main produce una entrega pull_request.

164 of 200

EJERCICIO 5

THE RED GUILD / 164

El PR que vamos a seguir

Host · misma terminal de práctica

gh pr list --base main --head development

gh pr view NUMERO --web

Anotá el número que muestra tu PR real.

165 of 200

EJERCICIO 5

THE RED GUILD / 165

Seguir una entrega sin saltar capas

EN TU

PROYECTO

01

Anotá acción, PR y delivery GUID en GitHub.

02

Observá el log github-webhook de lab-app.

03

Compará el GUID y el repo en ambos extremos.

04

Comprobá status received en la respuesta HTTP.

166 of 200

EJERCICIO 5

THE RED GUILD / 166

El botón Redeliver de GitHub

EN TU

PROYECTO

01

En Settings, Webhooks abrí el hook de /api/github.

02

Recent Deliveries: elegí la entrega de tu PR.

03

Usá Redeliver para pedir otro intento.

04

Leé la respuesta: duplicate si el receptor recuerda

ese GUID.

167 of 200

EJERCICIO 5

THE RED GUILD / 167

El status orienta la investigación

Respuesta

Dónde mirar

401 invalid_signature

Secret y bytes originales

403 repository_not_allowed

owner/repo del servidor

404 / gateway error

Path, túnel y proceso

413 o 415

Tamaño y Content-Type JSON

503 receiver_not_configured

Variables y reinicio

168 of 200

EJERCICIO 5

THE RED GUILD / 168

Cambiar de receptor para el próximo

ejercicio

EN TU

PROYECTO

01

Identificá el hook que termina en /api/github.

02

En la web desmarcá Active y guardá.

03

También podés pedir a Hermes que desactive sólo

ese hook.

04

Conservá su historial de entregas.

169 of 200

EJERCICIO 5

THE RED GUILD / 169

Repetirlo en otro backend

EN TU

PROYECTO

01

Crear una ruta POST pequeña y una ruta health.

02

Validar HMAC sobre los bytes originales.

03

Limitar body, repo, eventos y duplicados.

04

Correlacionar una entrega con respuesta y logs.

170 of 200

EJERCICIO 6

THE RED GUILD / 170

06

Una revisión

pedida desde GitHub

Filtrar antes del modelo y publicar una revisión que

una persona pueda evaluar.

171 of 200

EJERCICIO 6

THE RED GUILD / 171

Un filtro antes de gastar tokens

Request

HMAC válido

Filtros

repo + label + estado

Tarea

Modelo + gh

No coincide → ignored

Sin llamada al modelo

Sólo un evento permitido se transforma en una tarea.

172 of 200

EJERCICIO 6

THE RED GUILD / 172

Qué cambia respecto del ejercicio 5

Componente

Destino de este ejercicio

Receptor

Gateway de Hermes, puerto 8644

Path público

/webhooks/github-pr-review

Disparador

Etiqueta ai-review en PR propio

Lectura

gh pr view y gh api de repo fijo

Salida

Adaptador github_comment

173 of 200

EJERCICIO 6

THE RED GUILD / 173

Volver al agente dedicado

Host → shell de lab-agent

docker exec -it lab-agent bash

cd /workspace

hermes chat

La configuración se prepara desde la CLI del agente.

174 of 200

EJERCICIO 6

THE RED GUILD / 174

La ruta nativa preparada por Hermes

Hermes chat · /workspace

Leé docs/snippets/hermes-webhook.yaml.

Fusioná la ruta en tu perfil sin borrar Telegram ni OpenRouter.

Fijá TU_USUARIO/REPO, base main y etiqueta ai-review.

Generá un secret nuevo para Webhooks y guardalo en el perfil.

Mantené filtros antes del modelo y destino de comentario fijo.

No imprimas secretos ni habilites proveedores pagos.

Indicá cómo reiniciar el gateway y comprobar /health.

Tarea para Hermes dentro del repo autorizado.

175 of 200

EJERCICIO 6

THE RED GUILD / 175

Webhooks sin perder el setup existente

EN TU

PROYECTO

01

Conservá proveedor, modelo y Telegram del

ejercicio 3.

02

Hermes prepara la ruta nativa desde el archivo

provisto.

03

Usá un secret nuevo para este receptor.

04

Reiniciá el gateway desde su terminal cuando la

configuración esté lista.

176 of 200

EJERCICIO 6

THE RED GUILD / 176

Cuándo se solicita una review

Pseudocódigo · filtros nativos antes del modelo

si repo o head_repo no son el mío: ignorar

si la base no es main: ignorar

si la acción no es labeled: ignorar

si la etiqueta no es ai-review: ignorar

si el PR es draft o está cerrado: ignorar

pedir revisión de base SHA y head SHA recibidos

Un push o una etiqueta diferente no gastan una revisión.

177 of 200

EJERCICIO 6

THE RED GUILD / 177

La tarea tiene repo y versión

01

Repo fijo; base SHA y head SHA del evento.

02

Diff inmutable: comparar base SHA...head SHA.

03

Antes de leer y devolver: ambos SHAs iguales; base main.

04

Si cambian, solicitud desactualizada; no review.

178 of 200

EJERCICIO 6

THE RED GUILD / 178

El diff es material para analizar

Diff del PR

Datos no confiables

Agente

Analiza con límites

Lectura para revisar

Permisos del token + container aislado + aprobaciones

El agente tiene acceso al repo autorizado y conserva sus aprobaciones.

179 of 200

EJERCICIO 6

THE RED GUILD / 179

Quién publica la respuesta

Parte

Responsabilidad

Modelo

Analizar el diff y redactar la revisión

Adaptador github_comment

Entregar el texto al PR permitido

Repo y número de PR

Fijar el destino de la entrega

Persona

Evaluar el comentario y decidir el cambio

180 of 200

EJERCICIO 6

THE RED GUILD / 180

Iniciar con la configuración nueva

lab-agent · sesión de gh ya iniciada

hermes gateway run

El proceso mantiene Telegram y Webhooks activos.

181 of 200

EJERCICIO 6

THE RED GUILD / 181

Primero, el gateway local

Otra terminal del host

curl -i http://127.0.0.1:8644/health

Ejemplo de salida

HTTP/1.1 200 OK

El health debe responder antes de exponer el gateway.

182 of 200

EJERCICIO 6

THE RED GUILD / 182

Cambiar el origen del Quick Tunnel

Host · gateway Hermes en lab-agent:8644 activo

# Primero detené el túnel anterior en su terminal.

docker network connect red-taller lab-agent

docker run --rm -it --name lab-tunnel \

--network red-taller \

taller \

cloudflared tunnel --no-autoupdate \

--url http://lab-agent:8644

Detené el túnel anterior. Conectá lab-agent a red-taller una sola vez.

Origen Hermes lab-agent:8644, no Next lab-app:3000. Misma imagen taller y /workspace, incluido node_modules.

183 of 200

EJERCICIO 6

THE RED GUILD / 183

Crear el hook de revisión

EN TU

PROYECTO

01

URL actual del túnel + /webhooks/github-pr-review.

02

Secret nuevo de Hermes, JSON y TLS verificado.

03

Sólo eventos Pull requests.

04

Revisá esos campos en la web o delegá la

configuración al agente.

184 of 200

EJERCICIO 6

THE RED GUILD / 184

La conexión de GitHub al gateway

Hermes chat · /workspace

Creá o actualizá sólo el webhook de esta review.

Repo: TU_USUARIO/REPO

URL: https://TU_URL_PUBLICA/webhooks/github-pr-review

Usá el secret del gateway sin imprimirlo.

Eventos Pull requests, JSON y TLS verificado.

Comprobá que el hook de Next haya quedado inactivo.

Tarea para Hermes dentro del repo autorizado.

185 of 200

EJERCICIO 6

THE RED GUILD / 185

Un cambio que los tipos no detectan

app/capacidad.ts

ANTES

return capacidad - ocupados;

DESPUÉS

return capacidad + ocupados;

Con capacidad 20 y 5 ocupados, buscamos 15 lugares libres.

186 of 200

EJERCICIO 6

THE RED GUILD / 186

Enviar el cambio al PR abierto

Host · después de editar y guardar

git switch development

git add app/capacidad.ts

git commit -m "Practicar revision del calculo de lugares"

git push

El push actualiza el PR; todavía no pide revisión.

187 of 200

EJERCICIO 6

THE RED GUILD / 187

La etiqueta que pide la revisión

01

En el repo creá ai-review si no existe.

02

Creá también prueba-webhook para el caso negativo.

03

En el PR, Labels permite agregar y quitar cada etiqueta.

Interfaz de referencia · documentación oficial

188 of 200

EJERCICIO 6

THE RED GUILD / 188

Otra etiqueta no invoca el modelo

EN TU

PROYECTO

01

En el PR, abrí Labels.

02

Agregá prueba-webhook.

03

Comprobá entrega y resultado según el filtro.

189 of 200

EJERCICIO 6

THE RED GUILD / 189

Pedir ahora la revisión

EN TU

PROYECTO

01

En el PR, abrí Labels.

02

Agregá ai-review.

03

Comprobá entrega y resultado según el filtro.

190 of 200

EJERCICIO 6

THE RED GUILD / 190

Recibido no significa terminado

Entrega GitHub

202 Accepted

Acuse de recepción

Tarea del gateway

Modelo y gh

Comentario

GitHub

El acuse HTTP y el comentario ocurren en momentos distintos.

191 of 200

EJERCICIO 6

THE RED GUILD / 191

Leer la respuesta real

Host · alternativa: conversación del PR

gh pr view NUMERO --web

Leé la conversación del PR y el SHA desde GitHub.

192 of 200

EJERCICIO 6

THE RED GUILD / 192

Dónde se cortó la revisión

Última evidencia

Siguiente comprobación

No hay entrega

Hook activo y evento labeled

Falla de red o firma

Hostname, path, secret y gateway

Evento ignorado

Repo, head, base, label y draft

No lee el diff

toolsets y gh auth status en lab-agent

Respuesta sin comentario

Acceso al PR y github_comment

193 of 200

EJERCICIO 6

THE RED GUILD / 193

Corregir con una decisión humana

app/capacidad.ts

ANTES

return capacidad + ocupados;

DESPUÉS

return capacidad - ocupados;

La persona decide el cambio y lo verifica.

194 of 200

EJERCICIO 6

THE RED GUILD / 194

Comprobar el comportamiento

Host · raíz del repo · Node 22

pnpm test

pnpm lint

pnpm typecheck

Las pruebas existentes comprueban el cálculo, además de lint y tipos.

195 of 200

EJERCICIO 6

THE RED GUILD / 195

Cerrar el ciclo del cambio

Host · PR sigue abierto

git add app/capacidad.ts

git commit -m "Corregir calculo de lugares libres"

git push

El PR conserva la corrección y la conversación.

196 of 200

EJERCICIO 6

THE RED GUILD / 196

Pedir review del commit corregido

EN TU

PROYECTO

01

Después del push corregido, abrí Labels del PR.

02

Quitá ai-review y volvé a agregarla.

03

La entrega nueva debe referirse al SHA corregido.

04

Compará el SHA de la respuesta con el commit

corregido.

197 of 200

EJERCICIO 6

THE RED GUILD / 197

Trasladarlo a tu proyecto

EN TU

PROYECTO

01

Fijá repo y rama base en toda la ruta.

02

Elegí una intención explícita para pedir revisión.

03

Separá código no confiable, credenciales y jobs.

04

Definí quién evalúa el resultado antes del merge.

198 of 200

CIERRE

THE RED GUILD / 198

El sistema que acabamos de conectar

GitHub

Vercel

build y deploy

push del commit

Runner

jobs de Actions

cloudflared

túnel

Hermes

review del PR

job

webhook

tarea

GitHub relaciona cambios, ejecuciones y eventos

199 of 200

CIERRE

THE RED GUILD / 199

Cierre de la práctica

EN TU

PROYECTO

01

Desactivá los hooks. Aunque falle, cerrá la exposición:

detené Next, gateway y túnel del host.

02

Detené lab-tunnel, lab-app, lab-agent, herramientas y lab-runner,

espere o ejecute un job. Cancelá sólo tu run de Actions.

03

Revocá en GitHub los PAT dedicados.

Cerrá también las sesiones temporales con logout.

04

Conservá el repo y los perfiles privados.

No borres credenciales ni recursos ajenos.

También a mitad del curso. Sólo recursos creados; si no usaste Docker, omitilo.

200 of 200

CIERRE

THE RED GUILD / 200

De un commit

a trabajo autónomo

Un cambio, un check, un túnel y una revisión solicitada.

The Red Guild · NodoSerrano