bug_bunny 4.8.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.agents/skills/documentation-writer/SKILL.md +45 -0
  3. data/.agents/skills/gem-release/SKILL.md +114 -0
  4. data/.agents/skills/quality-code/SKILL.md +51 -0
  5. data/.agents/skills/sentry/SKILL.md +135 -0
  6. data/.agents/skills/sentry/references/api-endpoints.md +147 -0
  7. data/.agents/skills/sentry/scripts/sentry.rb +194 -0
  8. data/.agents/skills/skill-builder/SKILL.md +232 -0
  9. data/.agents/skills/skill-manager/SKILL.md +172 -0
  10. data/.agents/skills/skill-manager/scripts/sync.rb +310 -0
  11. data/.agents/skills/yard/SKILL.md +311 -0
  12. data/.agents/skills/yard/references/tipos.md +144 -0
  13. data/CHANGELOG.md +8 -0
  14. data/CLAUDE.md +28 -231
  15. data/lib/bug_bunny/version.rb +1 -1
  16. data/skill/SKILL.md +230 -0
  17. data/skill/references/client-middleware.md +144 -0
  18. data/skill/references/consumer.md +104 -0
  19. data/skill/references/controller.md +105 -0
  20. data/skill/references/errores.md +97 -0
  21. data/skill/references/resource.md +116 -0
  22. data/skill/references/routing.md +82 -0
  23. data/skill/references/testing.md +138 -0
  24. data/skills.lock +24 -0
  25. data/skills.yml +19 -0
  26. metadata +24 -28
  27. data/.claude/commands/gem-ai-setup.md +0 -174
  28. data/.claude/commands/pr.md +0 -53
  29. data/.claude/commands/release.md +0 -52
  30. data/.claude/commands/rubocop.md +0 -22
  31. data/.claude/commands/service-ai-setup.md +0 -168
  32. data/.claude/commands/test.md +0 -28
  33. data/.claude/commands/yard.md +0 -46
  34. data/docs/_index.md +0 -50
  35. data/docs/ai/_index.md +0 -56
  36. data/docs/ai/antipatterns.md +0 -166
  37. data/docs/ai/api.md +0 -251
  38. data/docs/ai/architecture.md +0 -92
  39. data/docs/ai/errors.md +0 -158
  40. data/docs/ai/faq_external.md +0 -133
  41. data/docs/ai/faq_internal.md +0 -86
  42. data/docs/ai/glossary.md +0 -45
  43. data/docs/concepts.md +0 -140
  44. data/docs/howto/controller.md +0 -194
  45. data/docs/howto/middleware_client.md +0 -119
  46. data/docs/howto/middleware_consumer.md +0 -127
  47. data/docs/howto/rails.md +0 -214
  48. data/docs/howto/resource.md +0 -200
  49. data/docs/howto/routing.md +0 -133
  50. data/docs/howto/testing.md +0 -259
  51. data/docs/howto/tracing.md +0 -119
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 530b51aca7e53b2ed09942cdc0c861d8fda733b250f772e99dfa4264b6f8d51d
4
- data.tar.gz: 193f518a70e3ce7f129d805b1d1d7abd3e1a664159bcf144ca0f5b2e2aef9805
3
+ metadata.gz: 35c04cd113b0a3056cab1dcfda6d389fa996e13bb44992d4791bdef29b93fc7d
4
+ data.tar.gz: aa7d145fb3eb1d80f435c0541e1009df78a636019e6c6452be0e0a0515b1f1a8
5
5
  SHA512:
6
- metadata.gz: 0c021d2134ac9d2044d75719617ed31acd9ad84619fad84cd455286f9505c4cf35c60587a4b1b084b8d5e18b7730a847bd485ec67a0c2c08ec604931e3683563
7
- data.tar.gz: cc3b8fffa105d8572dc08470e7de97b4b34381072b0f0d1a32428d10722b6ca3b313408fe751267d14d6ecbaf6745fb61da104c72f02e721ab792caec8e85e7d
6
+ metadata.gz: 9efee5f3deb6a52c76a361230032e040c964e22a1b52a2419873cb3d1c06159a1c52a042f424974a697a591342e8116aea1e39dd57e0bf71aa617ed5245e0860
7
+ data.tar.gz: 1f569f9e8b6fdfa2b48dd2270494a9a6b8f8aec2539ebadec5e20bc27f3ccd23407a340891b15c1567fe48ce593ee45a694b843987e5078852bb14d94ad37d70
@@ -0,0 +1,45 @@
1
+ ---
2
+ name: documentation-writer
3
+ description: 'Diátaxis Documentation Expert. An expert technical writer specializing in creating high-quality software documentation, guided by the principles and structure of the Diátaxis technical documentation authoring framework.'
4
+ ---
5
+
6
+ # Diátaxis Documentation Expert
7
+
8
+ You are an expert technical writer specializing in creating high-quality software documentation.
9
+ Your work is strictly guided by the principles and structure of the Diátaxis Framework (https://diataxis.fr/).
10
+
11
+ ## GUIDING PRINCIPLES
12
+
13
+ 1. **Clarity:** Write in simple, clear, and unambiguous language.
14
+ 2. **Accuracy:** Ensure all information, especially code snippets and technical details, is correct and up-to-date.
15
+ 3. **User-Centricity:** Always prioritize the user's goal. Every document must help a specific user achieve a specific task.
16
+ 4. **Consistency:** Maintain a consistent tone, terminology, and style across all documentation.
17
+
18
+ ## YOUR TASK: The Four Document Types
19
+
20
+ You will create documentation across the four Diátaxis quadrants. You must understand the distinct purpose of each:
21
+
22
+ - **Tutorials:** Learning-oriented, practical steps to guide a newcomer to a successful outcome. A lesson.
23
+ - **How-to Guides:** Problem-oriented, steps to solve a specific problem. A recipe.
24
+ - **Reference:** Information-oriented, technical descriptions of machinery. A dictionary.
25
+ - **Explanation:** Understanding-oriented, clarifying a particular topic. A discussion.
26
+
27
+ ## WORKFLOW
28
+
29
+ You will follow this process for every documentation request:
30
+
31
+ 1. **Acknowledge & Clarify:** Acknowledge my request and ask clarifying questions to fill any gaps in the information I provide. You MUST determine the following before proceeding:
32
+ - **Document Type:** (Tutorial, How-to, Reference, or Explanation)
33
+ - **Target Audience:** (e.g., novice developers, experienced sysadmins, non-technical users)
34
+ - **User's Goal:** What does the user want to achieve by reading this document?
35
+ - **Scope:** What specific topics should be included and, importantly, excluded?
36
+
37
+ 2. **Propose a Structure:** Based on the clarified information, propose a detailed outline (e.g., a table of contents with brief descriptions) for the document. Await my approval before writing the full content.
38
+
39
+ 3. **Generate Content:** Once I approve the outline, write the full documentation in well-formatted Markdown. Adhere to all guiding principles.
40
+
41
+ ## CONTEXTUAL AWARENESS
42
+
43
+ - When I provide other markdown files, use them as context to understand the project's existing tone, style, and terminology.
44
+ - DO NOT copy content from them unless I explicitly ask you to.
45
+ - You may not consult external websites or other sources unless I provide a link and instruct you to do so.
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: gem-release
3
+ description: Automatiza el proceso de liberación (release) de gemas Ruby siguiendo estándares de industria. Úsala cuando necesites subir una nueva versión a RubyGems. Ejecuta quality-code, propone versión, genera CHANGELOG, regenera la skill y publica. Soporta [patch|minor|major].
4
+ ---
5
+
6
+ # Gem Release Expert
7
+
8
+ Sos el responsable de garantizar que el proceso de publicación de una gema sea seguro, pase todos los controles de calidad y tenga documentación de clase mundial.
9
+
10
+ ## Parámetros de Uso
11
+ - `/gem-release` — El agente analiza los cambios y propone el tipo de bump.
12
+ - `/gem-release patch|minor|major` — Override manual del tipo de bump.
13
+
14
+ ## Flujo de Trabajo Obligatorio
15
+
16
+ ### Paso 1 — Quality Code
17
+ Ejecutá `quality-code` para validar linting, tests, YARD incremental y skill.
18
+
19
+ ### Paso 2 — Propuesta de Versión
20
+ No asumas rutas fijas. Investigá el entorno:
21
+ - Detectá el nombre de la gema del `.gemspec`.
22
+ - Localizá el archivo de versión (`lib/**/version.rb`).
23
+ - Leé la versión actual.
24
+ - **Análisis de cambios:** Revisá **todas** las fuentes de cambios:
25
+ 1. Commits desde el último tag: `git log [último-tag]...HEAD`
26
+ 2. Diff commiteado contra el tag: `git diff [último-tag]...HEAD`
27
+ 3. Cambios sin commitear (staged + unstaged): `git status` y `git diff` / `git diff --cached`
28
+
29
+ **Importante:** Los cambios sin commitear son parte del release.
30
+
31
+ Clasificá todos los cambios en conjunto:
32
+ - **major** — Breaking changes: métodos/clases eliminados o renombrados, cambios en firmas de métodos públicos, cambios incompatibles en comportamiento.
33
+ - **minor** — Nuevas funcionalidades: métodos/clases nuevos, nuevas opciones de configuración, funcionalidad extendida sin romper compatibilidad.
34
+ - **patch** — Bugfixes, mejoras de performance, refactors internos sin cambios en la API pública.
35
+ - **Propuesta:** Mostrá un resumen de los cambios, la clasificación y la versión propuesta (Actual → Nueva). Esperá confirmación.
36
+ - Si el usuario pasó un override (`/gem-release major`), usá ese tipo directamente.
37
+
38
+ ### Paso 3 — Documentación y Skill
39
+ 1. **Skill Experta:** Ejecutá `skill-builder` en modo **completo** para regenerar `skill/SKILL.md` (y `references/`, `scripts/` si aplica) con la API actualizada de la nueva versión.
40
+ 2. **Gemspec — Empaquetado de la Skill:** Ejecutá `/skill-manager check` para validar que el gemspec esté en orden. Verificá que `skill/` esté incluido en `spec.files`.
41
+ - Si `spec.files` usa `git ls-files`, asegurate de que `skill/` esté commiteado.
42
+ - Si `spec.files` usa un glob explícito, asegurate de que incluya `skill/**/*`.
43
+ - Asegurá la presencia de `metadata["documentation_uri"]` apuntando a `skill/`.
44
+
45
+ ### Paso 4 — Aplicación del Release
46
+ 1. Actualizá el archivo `version.rb` con la Nueva Versión.
47
+ 2. **Generar entrada de CHANGELOG** (ver sección "Generación de CHANGELOG" abajo).
48
+ 3. **Persistencia Git:**
49
+ - `git add .`
50
+ - `git commit -m "release: v[NUEVA_VERSION]"`
51
+ - `git tag -a v[NUEVA_VERSION] -m "Version [NUEVA_VERSION]"`
52
+
53
+ ### Paso 5 — Publicación (Requiere confirmación final)
54
+ - Construí la gema: `gem build [nombre].gemspec`
55
+ - Empujá a RubyGems: `gem push [nombre]-[NUEVA_VERSION].gem`
56
+ - Eliminá el artefacto `.gem` local después de subirlo.
57
+
58
+ ---
59
+
60
+ ## Generación de CHANGELOG
61
+
62
+ ### Fuente de datos
63
+ Leer todos los commits desde el último tag: `git log [último-tag]...HEAD --format="%H %s (%an)"`
64
+
65
+ ### Filtrado
66
+ Ignorar commits que matcheen:
67
+ - `release:` — commits de release anteriores
68
+ - `Merge branch` / `Merge pull request` — merges automáticos
69
+ - `chore:` — tareas de mantenimiento sin impacto funcional
70
+
71
+ ### Agrupación por tipo
72
+ Clasificar cada commit por su prefijo conventional commit:
73
+
74
+ ```markdown
75
+ ## [X.X.X] — YYYY-MM-DD
76
+
77
+ ### Nuevas funcionalidades
78
+ - Agregar endpoint de facturación (#123) — @dev1
79
+ - Soportar filtro por fecha en listado — @dev2
80
+
81
+ ### Correcciones
82
+ - Corregir cálculo de IVA en pagos parciales — @dev1
83
+ - Resolver timeout en conexión a Redis — @dev3
84
+
85
+ ### Mejoras internas
86
+ - Extraer servicio de notificaciones — @dev2
87
+ - Optimizar queries de reportes — @dev1
88
+ ```
89
+
90
+ **Mapeo de prefijos:**
91
+ - `feat:` → **Nuevas funcionalidades**
92
+ - `fix:` → **Correcciones**
93
+ - `refactor:`, `perf:`, `style:` → **Mejoras internas**
94
+ - `docs:` → **Documentación**
95
+ - `test:` → **Tests**
96
+ - Sin prefijo reconocido → **Otros cambios**
97
+
98
+ ### Formato
99
+ - Cada entrada: descripción limpia (sin el prefijo), PR o issue si está en el mensaje, autor (`@nombre`).
100
+ - Fecha en formato `YYYY-MM-DD`.
101
+ - Si el `CHANGELOG.md` no existe, crearlo con header `# Changelog`.
102
+ - La entrada nueva va al tope del archivo, debajo del header.
103
+
104
+ ### Atribución
105
+ Extraer el autor de cada commit con `git log --format="%an"`. Esto permite saber qué dev contribuyó a cada cambio en el release.
106
+
107
+ ---
108
+
109
+ ## Reglas de Seguridad y Estilo
110
+ - **Tag con `v`:** Los tags de gemas usan formato `vX.X.X`.
111
+ - **Stop on Failure:** Si quality-code falla, detenete. No fuerces el release.
112
+ - **Confirmation:** Siempre esperá confirmación antes de persistir cambios en Git y publicar.
113
+ - **Sin Hardcoding:** No uses versiones de Ruby o rutas específicas. Confiá en el entorno configurado.
114
+ - **CHANGELOG is Law:** Todo release debe tener su entrada en CHANGELOG.md.
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: quality-code
3
+ description: Validación de calidad para proyectos Ruby (gemas y servicios). Ejecuta RuboCop, tests, YARD incremental y actualiza la skill del proyecto. Invocala manualmente en cualquier momento o dejá que `gem-release` y `service-release` la ejecuten como primer paso.
4
+ ---
5
+
6
+ # Quality Code
7
+
8
+ Barrera de calidad para proyectos Ruby. Valida que el código cumpla los estándares antes de mergear, hacer release o en cualquier momento que quieras verificar el estado de tu branch.
9
+
10
+ ## Detección de tipo de proyecto
11
+
12
+ - **Gema**: existe `.gemspec` en la raíz.
13
+ - **Servicio**: existe `config/application.rb`.
14
+
15
+ ## Flujo de Trabajo
16
+
17
+ ### Paso 1 — Linting
18
+ - Ejecutá `bundle exec rubocop -a` (o `-A`) para corregir ofensas automáticas.
19
+ - Si quedan ofensas que no se pueden auto-corregir, reportalas y detenete.
20
+
21
+ ### Paso 2 — Tests
22
+ - Ejecutá `bundle exec rspec` (o el test runner detectado).
23
+ - Si un test falla, el proceso se detiene inmediatamente.
24
+
25
+ ### Paso 3 — Base de Datos (solo servicios)
26
+ - Verificá si hay migraciones en `db/migrate/`.
27
+ - Asegurate de que `db/schema.rb` esté actualizado y consistente.
28
+
29
+ ### Paso 4 — Auditoría YARD Incremental (Boy Scout Rule)
30
+ Solo documentá lo que cambió:
31
+ - Analizá `git diff [PRIMARY_BRANCH]...HEAD` para detectar métodos públicos o protegidos nuevos o modificados.
32
+ - **Importante:** También revisá cambios sin commitear (`git status`, `git diff`, `git diff --cached`).
33
+ - Todo método afectado DEBE tener documentación YARD completa (`@param`, `@return`, `@yield` si aplica).
34
+ - Si falta documentación en métodos tocados, generala basándote en la lógica del código.
35
+
36
+ ### Paso 5 — Sincronización de Skill
37
+ - Ejecutá `skill-builder` en modo **incremental** para actualizar `skill/SKILL.md` (y `references/`, `scripts/` si aplica) con los cambios actuales.
38
+ - Auditá si el `README.md` necesita actualizarse por los cambios.
39
+
40
+ ### Paso 6 — Reporte
41
+ Mostrá un resumen de lo ejecutado:
42
+ - RuboCop: OK / X ofensas corregidas
43
+ - Tests: OK / X tests, X failures
44
+ - YARD: OK / X métodos documentados
45
+ - Skill: actualizada / sin cambios
46
+ - README: actualizado / sin cambios
47
+
48
+ ## Reglas
49
+ - **Stop on Failure:** Si los tests o el linting fallan, detenete. No continues con los pasos siguientes.
50
+ - **Sin Hardcoding:** No uses versiones de Ruby o rutas específicas. Confiá en el entorno configurado.
51
+ - **Explain the Why:** Si sugerís cambios en documentación, explicá cómo mejora la mantenibilidad.
@@ -0,0 +1,135 @@
1
+ ---
2
+ name: sentry
3
+ description: Experto en la instancia self-hosted de Sentry de Wispro. Úsala SIEMPRE que necesites buscar errores, listar issues, ver stacktraces, resolver o asignar issues en Sentry. Funciona con cualquier proyecto del ecosistema.
4
+ ---
5
+
6
+ # Sentry Expert
7
+
8
+ Skill de conocimiento completo sobre la instancia de Sentry self-hosted de Wispro. Consultame para buscar errores, analizar stacktraces, gestionar issues o diagnosticar problemas en producción.
9
+
10
+ ## Configuración
11
+
12
+ ```bash
13
+ SENTRY_TOKEN=$SENTRY_TOKEN
14
+ SENTRY_URL="https://sentry.cloud.wispro.co"
15
+ SENTRY_ORG="wispro"
16
+ ```
17
+
18
+ **Importante:** Siempre usar `-k` en curl (certificado self-hosted). Nunca exponer el token en las respuestas.
19
+
20
+ ## Glosario
21
+
22
+ **Issue** — Agrupación de eventos similares. Tiene un ID numérico y un shortId legible (ej: `PROJECT-123`).
23
+
24
+ **Event** — Ocurrencia individual de un error. Contiene stacktrace, contexto, usuario, breadcrumbs.
25
+
26
+ **Project slug** — Identificador del proyecto en Sentry. Cada microservicio tiene uno. Si no lo sabés, listá los proyectos primero.
27
+
28
+ **statsPeriod** — Período de estadísticas: `24h`, `14d` o vacío para todo el historial.
29
+
30
+ ## Flujos de Trabajo
31
+
32
+ ### Buscar errores en un proyecto
33
+
34
+ 1. Si no tenés el project slug, listá los proyectos primero (ver API).
35
+ 2. Consultá issues del proyecto filtrando por período y query.
36
+ 3. Para cada issue relevante, consultá los eventos para ver el stacktrace.
37
+
38
+ ### Diagnosticar un error desde el código
39
+
40
+ 1. Tomá el mensaje de error o excepción del código/logs.
41
+ 2. Buscá en Sentry con `query=<mensaje>` en el proyecto correspondiente.
42
+ 3. Si hay match, mostrá el stacktrace y la frecuencia.
43
+ 4. Si no hay match, indicá que el error no está reportado en Sentry.
44
+
45
+ ### Gestionar issues
46
+
47
+ - **Resolver**: `status=resolved`
48
+ - **Ignorar**: `status=ignored`
49
+ - **Asignar**: `assignedTo=<username>`
50
+ - **Marcar como visto**: `hasSeen=true`
51
+
52
+ ### Análisis de tendencias
53
+
54
+ 1. Consultá issues con `statsPeriod=14d` para ver tendencias.
55
+ 2. Ordená por `count` o `userCount` para priorizar.
56
+ 3. Revisá `firstSeen` y `lastSeen` para detectar regresiones.
57
+
58
+ ## API — Endpoints principales
59
+
60
+ Todos los endpoints usan base URL `$SENTRY_URL/api/0/` y header `Authorization: Bearer $SENTRY_TOKEN`.
61
+
62
+ Ver catálogo completo en [references/api-endpoints.md](references/api-endpoints.md).
63
+
64
+ ### Listar proyectos
65
+ ```bash
66
+ curl -sk -H "Authorization: Bearer $SENTRY_TOKEN" \
67
+ "$SENTRY_URL/api/0/organizations/$SENTRY_ORG/projects/" | jq '.[] | {slug, name}'
68
+ ```
69
+
70
+ ### Listar issues de un proyecto
71
+ ```bash
72
+ curl -sk -H "Authorization: Bearer $SENTRY_TOKEN" \
73
+ "$SENTRY_URL/api/0/projects/$SENTRY_ORG/{PROJECT_SLUG}/issues/?statsPeriod=24h&query=is:unresolved"
74
+ ```
75
+
76
+ ### Ver detalle de un issue
77
+ ```bash
78
+ curl -sk -H "Authorization: Bearer $SENTRY_TOKEN" \
79
+ "$SENTRY_URL/api/0/organizations/$SENTRY_ORG/issues/{ISSUE_ID}/"
80
+ ```
81
+
82
+ ### Ver eventos de un issue (con stacktrace)
83
+ ```bash
84
+ curl -sk -H "Authorization: Bearer $SENTRY_TOKEN" \
85
+ "$SENTRY_URL/api/0/organizations/$SENTRY_ORG/issues/{ISSUE_ID}/events/?full=true&limit=1"
86
+ ```
87
+
88
+ ### Buscar por mensaje de error
89
+ ```bash
90
+ curl -sk -H "Authorization: Bearer $SENTRY_TOKEN" \
91
+ "$SENTRY_URL/api/0/projects/$SENTRY_ORG/{PROJECT_SLUG}/issues/?query={MENSAJE}&statsPeriod=24h"
92
+ ```
93
+
94
+ ### Resolver un issue
95
+ ```bash
96
+ curl -sk -X PUT -H "Authorization: Bearer $SENTRY_TOKEN" \
97
+ -H "Content-Type: application/json" \
98
+ -d '{"status":"resolved"}' \
99
+ "$SENTRY_URL/api/0/organizations/$SENTRY_ORG/issues/{ISSUE_ID}/"
100
+ ```
101
+
102
+ ## FAQ
103
+
104
+ ### ¿Cómo encuentro el project slug de mi servicio?
105
+ Ejecutá el endpoint de listar proyectos. El campo `slug` es lo que necesitás. Generalmente coincide con el nombre del repo en minúsculas.
106
+
107
+ ### ¿Cómo veo el stacktrace completo?
108
+ Usá el endpoint de eventos con `full=true`. El stacktrace está en `entries[].data.values[].stacktrace.frames[]`. Cada frame tiene `filename`, `lineNo`, `function` y `context`.
109
+
110
+ ### ¿Cómo filtro por nivel de error?
111
+ Agregá `query=level:error` o `query=level:warning` al endpoint de issues.
112
+
113
+ ### ¿Cómo pagino resultados?
114
+ La API devuelve un header `Link` con cursores. Usá el parámetro `cursor` del link `next` para la siguiente página.
115
+
116
+ ## Antipatrones
117
+
118
+ **Buscar sin project slug** — No consultes issues a nivel organización si sabés el proyecto. Es más lento y devuelve ruido de otros servicios.
119
+
120
+ **Ignorar la paginación** — Por defecto la API devuelve pocos resultados. Si necesitás más, paginá con el cursor.
121
+
122
+ **Hardcodear issue IDs** — Los IDs cambian. Siempre buscá por query o filtrá por período.
123
+
124
+ ## Errores comunes
125
+
126
+ **401 Unauthorized** — Token inválido o expirado. Verificá que `$SENTRY_TOKEN` esté en el entorno.
127
+
128
+ **404 Not Found** — Project slug incorrecto. Listá los proyectos para verificar.
129
+
130
+ **SSL Certificate Error** — Falta el flag `-k` en curl. Es necesario porque es self-hosted.
131
+
132
+ ## Referencias
133
+
134
+ - [API Endpoints](references/api-endpoints.md) — Catálogo completo de endpoints con parámetros
135
+ - [sentry.rb](scripts/sentry.rb) — Script helper para queries comunes
@@ -0,0 +1,147 @@
1
+ # Sentry API — Catálogo de Endpoints
2
+
3
+ Base URL: `$SENTRY_URL/api/0/`
4
+ Auth: `Authorization: Bearer $SENTRY_TOKEN`
5
+ Siempre usar `-k` en curl (certificado self-hosted).
6
+
7
+ ## Proyectos
8
+
9
+ ### Listar proyectos de la organización
10
+ ```
11
+ GET /organizations/{org}/projects/
12
+ ```
13
+ Respuesta: array de objetos con `slug`, `name`, `id`, `platform`, `dateCreated`.
14
+
15
+ ### Obtener detalle de un proyecto
16
+ ```
17
+ GET /projects/{org}/{project_slug}/
18
+ ```
19
+
20
+ ## Issues
21
+
22
+ ### Listar issues de un proyecto
23
+ ```
24
+ GET /projects/{org}/{project_slug}/issues/
25
+ ```
26
+ Query params:
27
+ - `statsPeriod` — `24h`, `14d` o vacío (default: `24h`)
28
+ - `query` — Búsqueda estructurada (default: `is:unresolved`)
29
+ - `shortIdLookup` — `true` para buscar por shortId
30
+ - `cursor` — Paginación
31
+
32
+ Respuesta: array de issues con `id`, `title`, `culprit`, `count`, `userCount`, `firstSeen`, `lastSeen`, `level`, `status`, `shortId`, `project`.
33
+
34
+ ### Listar issues de la organización
35
+ ```
36
+ GET /organizations/{org}/issues/
37
+ ```
38
+ Mismos query params. Devuelve issues de todos los proyectos.
39
+
40
+ ### Obtener detalle de un issue
41
+ ```
42
+ GET /organizations/{org}/issues/{issue_id}/
43
+ ```
44
+ Respuesta: issue completo con `activity`, `assignedTo`, `count`, `firstSeen`, `lastSeen`, `firstRelease`, `lastRelease`, `participants`, `userReportCount`, `stats`.
45
+
46
+ ### Actualizar un issue
47
+ ```
48
+ PUT /organizations/{org}/issues/{issue_id}/
49
+ ```
50
+ Body (JSON, todos opcionales):
51
+ - `status` — `resolved`, `resolvedInNextRelease`, `unresolved`, `ignored`
52
+ - `assignedTo` — username o team
53
+ - `hasSeen` — boolean
54
+ - `isBookmarked` — boolean
55
+ - `isSubscribed` — boolean
56
+ - `isPublic` — boolean
57
+
58
+ ### Eliminar un issue
59
+ ```
60
+ DELETE /organizations/{org}/issues/{issue_id}/
61
+ ```
62
+
63
+ ### Bulk update issues de un proyecto
64
+ ```
65
+ PUT /projects/{org}/{project_slug}/issues/
66
+ ```
67
+ Query params:
68
+ - `id` — lista de issue IDs a actualizar
69
+
70
+ Body: mismos campos que update individual.
71
+
72
+ ## Eventos
73
+
74
+ ### Listar eventos de un issue
75
+ ```
76
+ GET /organizations/{org}/issues/{issue_id}/events/
77
+ ```
78
+ Query params:
79
+ - `full` — `true` para incluir body completo con stacktrace
80
+ - `statsPeriod` — período de filtro
81
+ - `environment` — filtrar por entorno
82
+ - `query` — búsqueda dentro de eventos
83
+ - `cursor` — paginación
84
+
85
+ Respuesta: array de eventos con `id`, `eventID`, `groupID`, `title`, `message`, `dateCreated`, `tags`, `user`, `location`, `culprit`.
86
+
87
+ ### Listar eventos de error de un proyecto
88
+ ```
89
+ GET /projects/{org}/{project_slug}/events/
90
+ ```
91
+
92
+ ### Obtener evento específico de un proyecto
93
+ ```
94
+ GET /projects/{org}/{project_slug}/events/{event_id}/
95
+ ```
96
+ Respuesta completa con stacktrace en `entries[].data.values[].stacktrace.frames[]`.
97
+
98
+ Cada frame contiene:
99
+ - `filename` — archivo
100
+ - `lineNo` — línea
101
+ - `function` — método
102
+ - `context` — líneas de código alrededor
103
+ - `inApp` — boolean, si es código de la app o dependencia
104
+
105
+ ## Tags
106
+
107
+ ### Valores de un tag en un issue
108
+ ```
109
+ GET /organizations/{org}/issues/{issue_id}/tags/{tag_key}/values/
110
+ ```
111
+ Tags comunes: `environment`, `server_name`, `browser`, `os`, `release`.
112
+
113
+ ### Detalle de un tag en un issue
114
+ ```
115
+ GET /organizations/{org}/issues/{issue_id}/tags/{tag_key}/
116
+ ```
117
+
118
+ ## Hashes
119
+
120
+ ### Listar hashes de un issue
121
+ ```
122
+ GET /organizations/{org}/issues/{issue_id}/hashes/
123
+ ```
124
+ Útil para entender qué variantes de stacktrace se agrupan en el mismo issue.
125
+
126
+ ## Paginación
127
+
128
+ La API usa cursor-based pagination. El header `Link` de la respuesta contiene:
129
+
130
+ ```
131
+ Link: <url>; rel="previous"; results="false"; cursor="...",
132
+ <url>; rel="next"; results="true"; cursor="..."
133
+ ```
134
+
135
+ Usar el valor de `cursor` del link `next` como query param para la siguiente página. Cuando `results="false"` en `next`, no hay más páginas.
136
+
137
+ ## Queries estructuradas
138
+
139
+ El parámetro `query` soporta:
140
+ - `is:unresolved` / `is:resolved` / `is:ignored`
141
+ - `level:error` / `level:warning` / `level:info`
142
+ - `assigned:username` / `assigned:me`
143
+ - `bookmarks:me`
144
+ - `firstSeen:>2024-01-01`
145
+ - `lastSeen:<24h`
146
+ - `times_seen:>100`
147
+ - Texto libre para buscar en título/mensaje