@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.
- package/LICENSE +21 -0
- package/README.md +388 -2
- package/Resources/ask-prompt.md +49 -0
- package/Resources/detect-prompt.md +71 -0
- package/Resources/proposals-prompt.md +44 -0
- package/Resources/summary-prompt.md +37 -0
- package/Resources/wrapup-prompt.md +32 -0
- package/commands/recap-ask.md +28 -0
- package/commands/recap-list.md +21 -0
- package/commands/recap-proposals.md +32 -0
- package/commands/recap-start.md +47 -0
- package/commands/recap-status.md +14 -0
- package/commands/recap-stop.md +69 -0
- package/commands/recap-summarize.md +31 -0
- package/dist/bin/recap.js +4 -0
- package/dist/bita/client.js +155 -0
- package/dist/bita/hook.js +81 -0
- package/dist/bita/proposals.js +419 -0
- package/dist/bita/wrapup.js +254 -0
- package/dist/capture/capture.js +101 -0
- package/dist/capture/import.js +80 -0
- package/dist/capture/recording.js +125 -0
- package/dist/cli/args.js +83 -0
- package/dist/cli/commands/ask.js +127 -0
- package/dist/cli/commands/config.js +40 -0
- package/dist/cli/commands/hook.js +94 -0
- package/dist/cli/commands/live.js +23 -0
- package/dist/cli/commands/media.js +53 -0
- package/dist/cli/commands/proposals.js +76 -0
- package/dist/cli/commands/query.js +172 -0
- package/dist/cli/commands/recording.js +102 -0
- package/dist/cli/commands/setup.js +132 -0
- package/dist/cli/output.js +24 -0
- package/dist/cli/router.js +94 -0
- package/dist/core/active.js +46 -0
- package/dist/core/config.js +77 -0
- package/dist/core/dates.js +30 -0
- package/dist/core/fsutil.js +44 -0
- package/dist/core/json.js +70 -0
- package/dist/core/live-settings.js +140 -0
- package/dist/core/lock.js +114 -0
- package/dist/core/meeting.js +201 -0
- package/dist/core/paths.js +55 -0
- package/dist/core/proc.js +129 -0
- package/dist/core/record.js +46 -0
- package/dist/core/self.js +18 -0
- package/dist/core/text.js +89 -0
- package/dist/core/tools.js +91 -0
- package/dist/errors.js +36 -0
- package/dist/live/ask.js +77 -0
- package/dist/live/asking.js +185 -0
- package/dist/live/context.js +90 -0
- package/dist/live/dedupe.js +21 -0
- package/dist/live/detector.js +498 -0
- package/dist/live/files.js +48 -0
- package/dist/live/merger.js +100 -0
- package/dist/live/origin.js +91 -0
- package/dist/live/stream.js +390 -0
- package/dist/live/worker.js +191 -0
- package/dist/media/media.js +83 -0
- package/dist/media/operations.js +131 -0
- package/dist/media/probe.js +50 -0
- package/dist/pipeline/claude.js +73 -0
- package/dist/pipeline/pipeline.js +275 -0
- package/dist/pipeline/resources.js +16 -0
- package/dist/pipeline/stages.js +27 -0
- package/dist/pipeline/summary.js +56 -0
- package/dist/pipeline/transcript.js +116 -0
- package/dist/setup/deps.js +119 -0
- package/dist/setup/integration.js +108 -0
- package/dist/setup/legacy.js +28 -0
- package/dist/version.js +6 -0
- package/package.json +57 -4
- 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.
|