@kikedealba/recap 0.0.0-stage → 0.9.0

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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +388 -2
  3. package/Resources/ask-prompt.md +49 -0
  4. package/Resources/detect-prompt.md +71 -0
  5. package/Resources/proposals-prompt.md +44 -0
  6. package/Resources/summary-prompt.md +37 -0
  7. package/Resources/wrapup-prompt.md +32 -0
  8. package/commands/recap-ask.md +28 -0
  9. package/commands/recap-list.md +21 -0
  10. package/commands/recap-proposals.md +32 -0
  11. package/commands/recap-start.md +47 -0
  12. package/commands/recap-status.md +14 -0
  13. package/commands/recap-stop.md +69 -0
  14. package/commands/recap-summarize.md +31 -0
  15. package/dist/bin/recap.js +4 -0
  16. package/dist/bita/client.js +155 -0
  17. package/dist/bita/hook.js +81 -0
  18. package/dist/bita/proposals.js +419 -0
  19. package/dist/bita/wrapup.js +254 -0
  20. package/dist/capture/capture.js +101 -0
  21. package/dist/capture/import.js +80 -0
  22. package/dist/capture/recording.js +125 -0
  23. package/dist/cli/args.js +83 -0
  24. package/dist/cli/commands/ask.js +127 -0
  25. package/dist/cli/commands/config.js +40 -0
  26. package/dist/cli/commands/hook.js +94 -0
  27. package/dist/cli/commands/live.js +23 -0
  28. package/dist/cli/commands/media.js +53 -0
  29. package/dist/cli/commands/proposals.js +76 -0
  30. package/dist/cli/commands/query.js +172 -0
  31. package/dist/cli/commands/recording.js +102 -0
  32. package/dist/cli/commands/setup.js +132 -0
  33. package/dist/cli/output.js +24 -0
  34. package/dist/cli/router.js +94 -0
  35. package/dist/core/active.js +46 -0
  36. package/dist/core/config.js +77 -0
  37. package/dist/core/dates.js +30 -0
  38. package/dist/core/fsutil.js +44 -0
  39. package/dist/core/json.js +70 -0
  40. package/dist/core/live-settings.js +140 -0
  41. package/dist/core/lock.js +114 -0
  42. package/dist/core/meeting.js +201 -0
  43. package/dist/core/paths.js +55 -0
  44. package/dist/core/proc.js +129 -0
  45. package/dist/core/record.js +46 -0
  46. package/dist/core/self.js +18 -0
  47. package/dist/core/text.js +89 -0
  48. package/dist/core/tools.js +91 -0
  49. package/dist/errors.js +36 -0
  50. package/dist/live/ask.js +77 -0
  51. package/dist/live/asking.js +185 -0
  52. package/dist/live/context.js +90 -0
  53. package/dist/live/dedupe.js +21 -0
  54. package/dist/live/detector.js +498 -0
  55. package/dist/live/files.js +48 -0
  56. package/dist/live/merger.js +100 -0
  57. package/dist/live/origin.js +91 -0
  58. package/dist/live/stream.js +390 -0
  59. package/dist/live/worker.js +191 -0
  60. package/dist/media/media.js +83 -0
  61. package/dist/media/operations.js +131 -0
  62. package/dist/media/probe.js +50 -0
  63. package/dist/pipeline/claude.js +73 -0
  64. package/dist/pipeline/pipeline.js +275 -0
  65. package/dist/pipeline/resources.js +16 -0
  66. package/dist/pipeline/stages.js +27 -0
  67. package/dist/pipeline/summary.js +56 -0
  68. package/dist/pipeline/transcript.js +116 -0
  69. package/dist/setup/deps.js +119 -0
  70. package/dist/setup/integration.js +108 -0
  71. package/dist/setup/legacy.js +28 -0
  72. package/dist/version.js +6 -0
  73. package/package.json +57 -4
  74. package/skills/recap/SKILL.md +182 -0
@@ -0,0 +1,182 @@
1
+ ---
2
+ name: recap
3
+ description: Graba reuniones con la CLI `recap` y las convierte en minuta (resumen, acuerdos, pendientes y preguntas abiertas). Úsala cuando el usuario quiera empezar o terminar de grabar una reunión, saber si se está grabando, regenerar la minuta, o consultar qué se habló, qué se acordó o qué quedó pendiente en reuniones pasadas. Frases que la disparan: "graba la reunión", "empieza a grabar la junta", "ya terminó la reunión", "para la grabación", "¿se está grabando?", "¿qué acordamos en la reunión de ayer?", "pendientes de la junta con X", "rehaz la minuta".
4
+ ---
5
+
6
+ # recap
7
+
8
+ `recap` graba reuniones (en macOS, con Recap.app) y las procesa localmente en
9
+ macOS, Windows y Linux. Todo vive en una carpeta por reunión bajo `~/Recap` (o
10
+ la raíz configurada): `meeting.json`, la grabación, `transcript.md`, `frames/` y
11
+ `summary.md`.
12
+
13
+ Fuera de macOS no se puede grabar (`start` falla con `CAPTURE_UNAVAILABLE`):
14
+ la reunión se graba con cualquier otra app y se procesa con
15
+ `recap import <archivo> [--title "…"] [--in-person|--remote] --json`.
16
+
17
+ Todos los comandos aceptan `--json` y devuelven un sobre
18
+ `{schemaVersion, ok, command, data, error}`. Usa `--json` siempre que vayas a
19
+ leer el resultado; el texto plano es para mostrarlo tal cual.
20
+
21
+ ## Modos
22
+
23
+ Hay que elegir el modo siempre; no tiene valor por defecto.
24
+
25
+ | Modo | Flag | Cuándo |
26
+ |---|---|---|
27
+ | Remota | `--remote` | Meet, Zoom, Teams, Slack huddle, llamada, videollamada, "en línea" |
28
+ | Presencial | `--in-person` | En sala, en oficina, en persona, junta física, comida, "aquí con" |
29
+
30
+ En remota se graba pantalla, audio del sistema y micrófono; en presencial solo
31
+ el micrófono, sin pantalla ni capturas. Si el contexto no deja claro cuál es,
32
+ pregunta con una sola línea ("¿remota o presencial?") antes de arrancar.
33
+
34
+ ## Ciclo
35
+
36
+ ```sh
37
+ recap start --remote "Planeación sprint 42"
38
+ recap status
39
+ recap stop
40
+ ```
41
+
42
+ - `start` falla con `ALREADY_RECORDING` si ya hay una grabación activa: no
43
+ arranques otra, avísalo.
44
+ - `stop` cierra el archivo y lanza el procesamiento en segundo plano
45
+ (transcripción, capturas y minuta). Tarda de segundos a unos minutos según la
46
+ duración. `recap status` y `recap show <id>` dicen en qué etapa va.
47
+ - `recap discard` descarta la grabación activa y borra su carpeta. Solo si el
48
+ usuario lo pide explícitamente.
49
+
50
+ ## Liberar espacio
51
+
52
+ Solo si el usuario lo pide; todos aceptan `<id>` o `--bita-entry <id>` y `--json`.
53
+
54
+ ```sh
55
+ recap compress-video <id> --preset light|medium|max # recomprime el video en HEVC (solo remotas)
56
+ recap strip-video <id> # quita el video y deja recording.m4a con ambas pistas de audio
57
+ recap prune <id> --intermediates # borra mic.wav, system.wav, transcript-mic/system.json y live/chunks
58
+ recap delete <id> # borra la carpeta completa de la reunión
59
+ ```
60
+
61
+ `compress-video` y `strip-video` aceptan `--prune-intermediates`. Fallan con
62
+ `NOT_REMOTE` en reuniones presenciales, `NO_VIDEO` si ya no hay video,
63
+ `MEETING_ACTIVE` mientras se graba y `NOT_SMALLER` si la compresión no ahorra
64
+ espacio (el original se conserva). `recap list --json` trae `storage` y
65
+ `hasVideo` de cada reunión.
66
+
67
+ Errores típicos y qué hacer:
68
+
69
+ | Código | Causa | Acción |
70
+ |---|---|---|
71
+ | `SCREEN_DENIED` | Recap.app sin permiso de grabación de pantalla | Pide activarlo en Configuración > Privacidad y seguridad > Grabación de pantalla y audio del sistema |
72
+ | `MICROPHONE_DENIED` | Sin permiso de micrófono | Igual, en Micrófono |
73
+ | `RECORDER_TIMEOUT` | Un diálogo de permisos quedó esperando | `recap setup` |
74
+ | `DEPENDENCY_MISSING`, `MODEL_MISSING` | Falta ffmpeg, whisper-cli, claude o el modelo | `recap setup --install-deps` |
75
+ | `CAPTURE_UNAVAILABLE` | No hay grabador en este equipo (Windows, Linux, o falta Recap.app) | Graba con otra app y usa `recap import <archivo>`; en mac, `recap setup` |
76
+
77
+ ## Con bita
78
+
79
+ Si `recap status --json` trae `data.bitaLinked: true` (recap está suscrito a
80
+ los eventos de bita desde `recap setup`), **arranca y para las reuniones desde
81
+ bita**, no desde recap: así el tiempo queda medido y la grabación sigue al
82
+ contador.
83
+
84
+ ```sh
85
+ bita start "<título>" --kind remote-meeting
86
+ bita start "<título>" --kind in-person-meeting
87
+ bita stop <id> --json # sin --did y sin escribir la página
88
+ recap wait --bita-entry <id> --json # espera a que todo quede listo
89
+ ```
90
+
91
+ Al parar, recap hace todo lo demás sin que nadie lo pida:
92
+
93
+ - transcribe y escribe la minuta;
94
+ - le pone al contador un título real, si el que tenía era genérico;
95
+ - le asigna el proyecto si no tenía y la conversación lo deja claro;
96
+ - crea la página en ese proyecto, o agrega una sección a la que ya tenía, y la escribe;
97
+ - pasa pendientes y preguntas abiertas al backlog;
98
+ - deja la minuta en la sección «Reunión» de la entrada.
99
+
100
+ El resultado está en `data.wrapup` de `recap wait`. Si `wrapup.projectResolved`
101
+ es false, pregunta el proyecto y aplícalo con `bita amend`, y mueve la página y
102
+ el backlog con inkwell si está instalado (`inkwell page move --project`,
103
+ `inkwell backlog edit --project`) o, si no, con `bita docs page move --project`
104
+ y `bita backlog edit --project`.
105
+
106
+ Las páginas, las propuestas y el backlog se escriben con inkwell cuando está
107
+ instalado y ya migró los documentos de bita; si no, con `bita docs`/`bita backlog`.
108
+
109
+ ## En vivo
110
+
111
+ Mientras se graba, recap transcribe por tramos de 5 a 20 s en
112
+ `live/transcript.jsonl` (una línea `{startMs, endMs, channel, text}`; `mic` es
113
+ Sala y `system` Remotos). Es aproximada: la transcripción de después del stop
114
+ (`transcript.md`) sigue siendo la fuente de verdad.
115
+
116
+ Para responder una pregunta que hicieron en la reunión, con las páginas de bita
117
+ y los repos del proyecto (`bita project repo ls`):
118
+
119
+ ```sh
120
+ recap ask --active --json # la última pregunta de la transcripción
121
+ recap ask --active --question "¿cómo se despliega X?" --json
122
+ recap ask --meeting <id> --question "..." --json-stream # eventos question/progress/delta/source/done
123
+ recap ask --sources --project <p> --json # qué consultaría, sin llamar a claude
124
+ ```
125
+
126
+ La respuesta lleva `found` y `sources` (página, `archivo:línea` o commit) y se
127
+ guarda en `live/answers.jsonl`. Con `found: false` no está documentado: no lo
128
+ completes por tu cuenta. Se configura con `recap config get|set`
129
+ (`live.enabled`, `live.openWindow`, `live.proposals`, `live.maxChunkSeconds`,
130
+ `live.assistModel`, `live.autoAsk`, `live.autoAskModel`,
131
+ `live.autoAskMinSeconds`).
132
+
133
+ Con `live.autoAsk` (encendido por omisión), el live-worker detecta solo las
134
+ preguntas técnicas de la reunión y las responde sin que nadie las pida: esas
135
+ respuestas llevan `auto: true` en `live/answers.jsonl`. Mientras se responde
136
+ algo, `live/asking.json` dice qué pregunta va (`{question, startedAt, auto}`);
137
+ solo corre una respuesta a la vez y una manual detiene a la automática.
138
+
139
+ ## Cambios propuestos a la documentación
140
+
141
+ Si la reunión está ligada a bita, la etapa `proposals` (antes de `wrapup`)
142
+ detecta los cambios explícitos y firmes a páginas que ya existen y los deja en
143
+ la rama `proposal/meeting-<entrada>` de los docs, sin tocar `main`. Ideas,
144
+ dudas y lo que se corrigió después no entran.
145
+
146
+ ```sh
147
+ recap proposals ls <id> --json # o --bita-entry <id>
148
+ recap proposals show <id> <n> --json # markdown, citas y diff
149
+ recap proposals accept <id> <n> [--md <archivo editado>] --json
150
+ recap proposals reject <id> <n> --json
151
+ ```
152
+
153
+ Acepta o rechaza **solo cuando el usuario lo pida**. Si `accept` deja la
154
+ propuesta en `stale`, la página cambió desde entonces: edítala sobre la versión
155
+ actual y acéptala con `--md`. Cuando no queda ninguna pendiente, recap borra la
156
+ rama. Usa `/recap-proposals` para revisarlas en la sesión.
157
+
158
+ ## Consultar reuniones
159
+
160
+ ```sh
161
+ recap list --json
162
+ recap show <id|parte del id|last> --json
163
+ recap show <id> --path
164
+ ```
165
+
166
+ Para responder qué se habló o qué se acordó, lee `summary.md` de las reuniones
167
+ que apliquen. Si hace falta precisión (una cifra, quién dijo qué), ve a
168
+ `transcript.md`, que lleva el minuto de cada párrafo. Cita la reunión y el
169
+ minuto en la respuesta. En reuniones remotas, **Sala** es el micrófono local y
170
+ **Remotos** el audio de la llamada; no hay separación por persona.
171
+
172
+ ## Regenerar la minuta
173
+
174
+ - Sin intervención: `recap process <id> --from summarize`.
175
+ - Dentro de la sesión, cuando el usuario quiere dirigir el enfoque o corregir
176
+ algo: usa `/recap-summarize`.
177
+
178
+ ## Lo que no hace
179
+
180
+ - No separa hablantes por persona: los nombres salen del contexto.
181
+ - No sube nada a la nube salvo la transcripción que lee Claude al resumir, al
182
+ responder con `recap ask` y al buscar cambios propuestos.