wuptracker 0.1.0__tar.gz

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.
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ venv/
5
+ dist/
6
+ *.egg-info/
7
+
8
+ # saída local (a config/sessões de verdade agora vivem em ~/.config e
9
+ # ~/.local/share/wuptracker; isso aqui é só resíduo de dev/testes na raiz)
10
+ writeups/
11
+ sessions/
12
+ .env
13
+ config.local.json
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Felipe Ratto
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,442 @@
1
+ Metadata-Version: 2.5
2
+ Name: wuptracker
3
+ Version: 0.1.0
4
+ Summary: Captura screenshots de uma sessão de trabalho e gera writeups com IA
5
+ Project-URL: Homepage, https://github.com/rattinho/wuptracker
6
+ Project-URL: Repository, https://github.com/rattinho/wuptracker
7
+ Author: Felipe Ratto
8
+ License: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,ctf,llm,pentest,screenshot,writeup
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Security
17
+ Classifier: Topic :: Utilities
18
+ Requires-Python: >=3.10
19
+ Requires-Dist: mss>=9
20
+ Requires-Dist: pillow>=10
21
+ Requires-Dist: plyer>=2.1
22
+ Requires-Dist: pynput>=1.7
23
+ Requires-Dist: python-dotenv>=1.0
24
+ Provides-Extra: anthropic
25
+ Requires-Dist: anthropic>=0.40; extra == 'anthropic'
26
+ Description-Content-Type: text/markdown
27
+
28
+ # wuptracker
29
+
30
+ **Writeups automáticos a partir de screenshots.** Você trabalha normalmente
31
+ (um pentest, um CTF, uma sessão de dev, uma pesquisa), aperta uma tecla nos
32
+ momentos importantes, e no fim uma IA transforma as capturas em um writeup
33
+ técnico completo em Markdown — com as imagens já recortadas e otimizadas.
34
+
35
+ ```
36
+ capturar ──▶ [F9] screenshot ──▶ IA analisa o frame ──▶ .png + .json
37
+
38
+ └─▶ [F10] encerra
39
+ generate ──▶ IA lê todas as análises ──▶ writeup.md
40
+ ```
41
+
42
+ ---
43
+
44
+ ## Índice
45
+
46
+ - [Instalação](#instalação)
47
+ - [Uso rápido](#uso-rápido)
48
+ - [Comandos](#comandos)
49
+ - [Provedores de IA](#provedores-de-ia)
50
+ - [Perfis e estilos de writeup](#perfis-e-estilos-de-writeup)
51
+ - [Captura de tela](#captura-de-tela)
52
+ - [Imagens no writeup](#imagens-no-writeup)
53
+ - [Configuração](#configuração)
54
+ - [Estrutura de arquivos](#estrutura-de-arquivos)
55
+ - [Como funciona por dentro](#como-funciona-por-dentro)
56
+
57
+ ---
58
+
59
+ ## Instalação
60
+
61
+ wuptracker é um pacote Python de verdade (`pyproject.toml`, entry point
62
+ `wuptracker`) — instale com [**uv**](https://docs.astral.sh/uv/)
63
+ (`curl -LsSf https://astral.sh/uv/install.sh | sh`) ou `pipx`, sem precisar
64
+ mexer em venv na mão.
65
+
66
+ ```bash
67
+ git clone <repo> wuptracker && cd wuptracker
68
+ uv tool install . # ou: pipx install .
69
+ ```
70
+
71
+ Isso coloca o comando `wuptracker` no seu PATH (`~/.local/bin`), rodando numa
72
+ venv isolada que o `uv`/`pipx` gerencia sozinho. Editando o código depois?
73
+ `uv tool install --editable .` reflete mudanças sem reinstalar.
74
+
75
+ **Sem instalar nada**, direto do repo: `uv run wuptracker <subcomando>` (o `uv`
76
+ monta o ambiente na primeira vez, a partir do `pyproject.toml`).
77
+
78
+ **Com o backend padrão (`claude_cli`) não precisa de API key** — ele usa o CLI do
79
+ Claude Code, que consome a cota da sua assinatura. Veja [Provedores de IA](#provedores-de-ia)
80
+ para as outras opções (Ollama local, OpenAI, etc.).
81
+
82
+ ### Onde ficam os dados
83
+
84
+ | O quê | Onde |
85
+ |---|---|
86
+ | Configuração (`config set/unset`) | `~/.config/wuptracker/config.json` |
87
+ | Chaves de API | `~/.config/wuptracker/.env` (chmod 600) |
88
+ | Sessões capturadas | `~/.local/share/wuptracker/sessions/` |
89
+ | Writeups gerados | `./writeups/` — relativo a onde você roda o comando |
90
+
91
+ Sessões e config ficam num lugar fixo (padrão XDG), independente de onde você
92
+ chama o `wuptracker`; os writeups nascem junto do seu trabalho, no diretório atual
93
+ (ou em `--export DIR`).
94
+
95
+ ### Dependências de sistema
96
+
97
+ | Para quê | Pacote (Arch) | Observação |
98
+ |---|---|---|
99
+ | Captura no Wayland/KDE | `spectacle` | ou `grim` (wlroots), `gnome-screenshot` (GNOME) |
100
+ | Captura no X11 | — | usa `mss` (Python), fallback `scrot`/`maim` |
101
+ | Notificações | `libnotify` | `notify-send`; fallback `plyer` |
102
+ | Backend `claude_cli` | Claude Code | comando `claude` no PATH |
103
+ | Backend `ollama` | `ollama` | + um modelo com visão (`ollama pull llama3.2-vision`) |
104
+
105
+ ---
106
+
107
+ ## Uso rápido
108
+
109
+ Primeira vez? Rode o assistente — ele pergunta o essencial, **explica cada
110
+ opção** (digite `?` numa pergunta de múltipla escolha) e já testa a integração
111
+ no final:
112
+
113
+ ```bash
114
+ wuptracker config helper # ou: wuptracker setup
115
+ ```
116
+
117
+ ```bash
118
+ # 1. inicia a captura (fica rodando)
119
+ wuptracker capture "Skynet" --profile thm
120
+ # F9 = capturar a tela · F10 / Ctrl+C = encerrar
121
+ # Wayland: use os sinais que o programa imprime (kill -USR1 <PID>)
122
+
123
+ # 2. veja suas sessões
124
+ wuptracker show
125
+
126
+ # 3. gere o writeup (número vem do 'show'; vazio = a mais recente)
127
+ wuptracker generate 1
128
+ wuptracker generate 1 --style tecnico,linkedin --export ~/writeups/skynet
129
+ ```
130
+
131
+ ---
132
+
133
+ ## Comandos
134
+
135
+ ### `wuptracker capture ["Nome"] [--profile thm|generico]`
136
+
137
+ Inicia o modo de captura. Bloqueia até você encerrar. Cria
138
+ `sessions/AAAA-MM-DD_HH-MM_nome/`.
139
+
140
+ - **F9** — captura a tela. O screenshot é salvo na hora; a análise pela IA roda
141
+ em background (você pode disparar vários F9 seguidos).
142
+ - **F10** ou **Ctrl+C** — encerra. Espera as análises pendentes terminarem, com
143
+ barra de progresso, avisando para não fechar. Um segundo **Ctrl+C** força a
144
+ saída (os `.png` já estão salvos).
145
+ - **Wayland**: teclas globais não chegam a apps em background. O programa imprime
146
+ o PID e os comandos `kill -USR1 <PID>` (capturar) / `kill -USR2 <PID>`
147
+ (encerrar) — ideal para amarrar num atalho global do KDE/GNOME.
148
+
149
+ ### `wuptracker show`
150
+
151
+ Lista as sessões, mais recentes primeiro:
152
+
153
+ ```
154
+ # SESSÃO DATA/HORA CAPS PERFIL STATUS
155
+ 1 Skynet 2026-09-10 14:32 12 thm writeup
156
+ 2 Refatorar 2026-09-09 20:10 4 generico ativa
157
+ ```
158
+
159
+ `CAPS` mostra `+N?` quando há análises que não terminaram. `STATUS`: `ativa`
160
+ (capturando agora), `interrompida` (crashou), `writeup` (já gerado).
161
+
162
+ ### `wuptracker generate [SESSÃO] [opções]`
163
+
164
+ Gera o writeup. `SESSÃO` = número do `show`, nome da pasta, caminho, ou vazio
165
+ (a mais recente).
166
+
167
+ | Opção | Efeito |
168
+ |---|---|
169
+ | `--style a,b,c` | gera vários estilos de uma vez (padrão: `config DEFAULT_STYLE`) |
170
+ | `--profile thm\|generico` | força o domínio (padrão: o gravado na captura) |
171
+ | `--export DIR` | copia os `.md` gerados e a pasta `assets/` para `DIR` |
172
+ | `--open` | abre o resultado no editor padrão |
173
+
174
+ ### `wuptracker styles`
175
+
176
+ Lista os estilos e perfis disponíveis.
177
+
178
+ ### `wuptracker config [...]`
179
+
180
+ Ver e alterar configurações e integrações — veja [Configuração](#configuração).
181
+
182
+ ---
183
+
184
+ ## Provedores de IA
185
+
186
+ O backend é escolhido com `wuptracker config backend <nome>`. Todos fazem as
187
+ duas tarefas: **analisar cada screenshot** (visão) e **escrever o writeup** (texto).
188
+
189
+ | Backend | Custo | Precisa de | Privacidade |
190
+ |---|---|---|---|
191
+ | **`claude_cli`** (padrão) | grátis (usa sua assinatura Claude Code Pro/Max) | comando `claude` no PATH | sobe pra Anthropic |
192
+ | **`anthropic`** | por token | `ANTHROPIC_API_KEY` | sobe pra Anthropic |
193
+ | **`ollama`** | grátis | Ollama rodando + modelo com visão | **100% local / offline** |
194
+ | **`openai`** | depende do endpoint | `OPENAI_API_KEY` (ou servidor local) | depende do endpoint |
195
+ | **`gemini`** | **tier grátis** generoso | `GEMINI_API_KEY` | sobe pro Google |
196
+
197
+ ### `claude_cli` (padrão)
198
+
199
+ Nada a configurar além de ter o `claude` instalado e logado.
200
+
201
+ ```bash
202
+ wuptracker config backend claude_cli
203
+ wuptracker config set cli-model claude-opus-5 # opcional
204
+ ```
205
+
206
+ ### `anthropic` (API da Anthropic)
207
+
208
+ ```bash
209
+ wuptracker config backend anthropic
210
+ wuptracker config api-key sk-ant-... # grava no .env, chmod 600
211
+ wuptracker config set model claude-sonnet-5 # opcional
212
+ ```
213
+
214
+ ### `ollama` (local, offline, privado)
215
+
216
+ Ideal para pentests onde as telas não podem sair da sua máquina.
217
+
218
+ ```bash
219
+ ollama pull llama3.2-vision # ou llava, qwen2.5vl, minicpm-v, moondream
220
+ wuptracker config backend ollama
221
+ wuptracker config set ollama-model llama3.2-vision
222
+ wuptracker config set ollama-host http://localhost:11434 # padrão
223
+ ```
224
+
225
+ > O modelo **precisa ter visão** para a análise dos frames funcionar. Modelos só
226
+ > de texto geram o writeup, mas não interpretam as imagens.
227
+
228
+ ### `openai` (qualquer endpoint compatível)
229
+
230
+ Serve para OpenAI, **Groq**, **OpenRouter**, **LM Studio**, **llama.cpp server**,
231
+ vLLM, etc.
232
+
233
+ ```bash
234
+ wuptracker config backend openai
235
+ wuptracker config set openai-url https://api.openai.com/v1
236
+ wuptracker config set openai-model gpt-4o-mini
237
+ wuptracker config api-key sk-... # grava OPENAI_API_KEY no .env
238
+ ```
239
+
240
+ Exemplos:
241
+
242
+ ```bash
243
+ # Groq
244
+ wuptracker config set openai-url https://api.groq.com/openai/v1
245
+ wuptracker config set openai-model llama-3.2-90b-vision-preview
246
+
247
+ # LM Studio local (sem chave)
248
+ wuptracker config set openai-url http://localhost:1234/v1
249
+ wuptracker config set openai-model local-model
250
+ ```
251
+
252
+ ### `gemini` (Google — tem tier grátis)
253
+
254
+ Pegue uma chave em <https://aistudio.google.com/apikey> (o tier gratuito dá pra
255
+ usar bastante sem cartão).
256
+
257
+ ```bash
258
+ wuptracker config backend gemini
259
+ wuptracker config api-key AIza... # grava GEMINI_API_KEY no .env
260
+ wuptracker config set gemini-model gemini-2.0-flash # ou gemini-2.5-flash, -pro
261
+ ```
262
+
263
+ ---
264
+
265
+ ## Perfis e estilos de writeup
266
+
267
+ São dois eixos independentes.
268
+
269
+ ### Perfil (`--profile`) — o domínio da sessão
270
+
271
+ | Perfil | Foco | Seções (estilo `tecnico`) |
272
+ |---|---|---|
273
+ | `thm` | pentest / CTF | Reconhecimento · Enumeração · Acesso Inicial · Pós-Exploração · Privesc · Flags · Lições |
274
+ | `generico` | qualquer trabalho no PC | Resumo · Linha do Tempo · Descobertas · Problemas · Estado Final · Ferramentas |
275
+
276
+ Gravado em `meta.json` na captura. Padrão: `config DEFAULT_PROFILE`.
277
+
278
+ ### Estilo (`--style`) — o formato do texto
279
+
280
+ | Estilo | Saída |
281
+ |---|---|
282
+ | `tecnico` | denso e preciso, seções fixas, âncoras de horário `[HH:MM:SS]` (padrão) |
283
+ | `corrido` | narrativa fluida em texto corrido |
284
+ | `resumo` | resumo executivo, ~250 palavras, bullets |
285
+ | `blog` | artigo técnico didático (dev.to / Medium) |
286
+ | `linkedin` | post pronto pra publicar — texto puro, hashtags, **generaliza dados sensíveis** |
287
+
288
+ `tecnico` / `corrido` / `blog` embutem as imagens (saída vira uma pasta
289
+ `writeups/<sessão>/`); `resumo` / `linkedin` saem como `.md` avulso sem imagens.
290
+
291
+ ```bash
292
+ wuptracker generate 1 --style tecnico,corrido,linkedin
293
+ wuptracker config set style tecnico,linkedin # muda o padrão
294
+ ```
295
+
296
+ ---
297
+
298
+ ## Captura de tela
299
+
300
+ - **X11**: `mss` (rápido, multi-monitor). Fallback: `scrot`, `maim`, `import`.
301
+ - **Wayland**: `spectacle` (KDE), `grim` (wlroots), `gnome-screenshot` (GNOME).
302
+ - **Multi-monitor**: por padrão captura **só o monitor onde o cursor está**
303
+ (`CAPTURE_ACTIVE_MONITOR_ONLY`). Desligue para capturar todos juntos.
304
+
305
+ ```bash
306
+ wuptracker config set monitor off
307
+ ```
308
+
309
+ ---
310
+
311
+ ## Imagens no writeup
312
+
313
+ Cada análise da IA devolve também um retângulo (`crop`) com a **região relevante**
314
+ da tela. O `capture` gera um `<nome>_crop.png` recortado — o screenshot original
315
+ fica intacto.
316
+
317
+ Na geração, as imagens usadas são:
318
+
319
+ 1. **Recortadas** para a região relevante (se a IA indicou uma útil).
320
+ 2. **Redimensionadas** para no máx. `IMAGE_MAX_WIDTH` px (1600).
321
+ 3. **Convertidas para WebP** (`WEBP_QUALITY` 80) — na prática **~10× menores** que
322
+ o PNG. Sem WebP no Pillow, cai para PNG otimizado.
323
+ 4. Copiadas para `writeups/<sessão>/assets/` e embutidas no `.md` no ponto
324
+ cronológico certo.
325
+
326
+ ```bash
327
+ wuptracker config set webp off # volta pra PNG
328
+ wuptracker config set webp-quality 90
329
+ wuptracker config set max-width 1920 # 0 = não redimensionar
330
+ wuptracker config set crop off # não recortar
331
+ ```
332
+
333
+ ---
334
+
335
+ ## Configuração
336
+
337
+ ### Assistente interativo
338
+
339
+ ```bash
340
+ wuptracker config helper
341
+ ```
342
+
343
+ Passo a passo: escolhe a IA (com explicação de cada uma — custo, privacidade, o
344
+ que precisa instalar), pede a chave/host/modelo correspondente, escolhe o perfil
345
+ e o estilo padrão (também com explicação de cada opção), pergunta umas
346
+ preferências rápidas (monitor ativo, WebP, notificação) e no final **testa a
347
+ integração** e mostra o resumo. Rodar de novo é seguro — reaproveita o que já
348
+ está configurado como valor padrão de cada pergunta.
349
+
350
+ ### Manual
351
+
352
+ `wuptracker config` (sem argumentos) mostra o estado das **integrações** e toda a
353
+ config, marcando cada valor como `padrão` ou `local`:
354
+
355
+ ```
356
+ Integrações
357
+ LLM ollama · llama3.2-vision · http://localhost:11434: ok (local, offline, grátis)
358
+ Captura spectacle · monitor ativo: on
359
+ Notificação notify-send · som: on · desktop: on
360
+
361
+ Configuração (local sobrepõe o padrão)
362
+ backend ollama local (padrão: claude_cli)
363
+ ollama-model llama3.2-vision local (padrão: llama3.2-vision)
364
+ ...
365
+ ```
366
+
367
+ | Comando | Ação |
368
+ |---|---|
369
+ | `wuptracker config` | mostra tudo |
370
+ | `wuptracker config set <chave> <valor>` | grava em `~/.config/wuptracker/config.json` |
371
+ | `wuptracker config get <chave>` | valor efetivo |
372
+ | `wuptracker config unset <chave>` | volta ao padrão |
373
+ | `wuptracker config backend <nome>` | atalho para `set backend` |
374
+ | `wuptracker config api-key <chave>` | grava a chave do backend ativo no `.env` (chmod 600) |
375
+
376
+ **Chaves**: `backend`, `model`, `cli-model`, `ollama-host`, `ollama-model`,
377
+ `openai-url`, `openai-model`, `gemini-model`, `profile`, `style`, `monitor`,
378
+ `crop`, `crop-padding`, `images`, `webp`, `webp-quality`, `max-width`,
379
+ `screenshot-quality`, `sound`, `notify`, `open`, `sessions-dir`, `writeups-dir`.
380
+
381
+ - `~/.config/wuptracker/config.json` sobrepõe os padrões de `config.py`.
382
+ - As API keys **nunca** entram no JSON — vão só para `~/.config/wuptracker/.env`
383
+ (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`), com `chmod 600`.
384
+
385
+ ---
386
+
387
+ ## Estrutura de arquivos
388
+
389
+ Sessões vivem em `~/.local/share/wuptracker/sessions/` (padrão XDG, fora do seu
390
+ diretório de trabalho):
391
+
392
+ ```
393
+ ~/.local/share/wuptracker/sessions/2026-09-10_14-32_skynet/
394
+ ├── meta.json # room, profile, started_at, ended_at, duration
395
+ ├── session.json # lista ordenada das capturas (reescrita a cada F9)
396
+ ├── capture.pid # PID enquanto a captura roda (removido ao encerrar)
397
+ └── captures/
398
+ ├── 00-02-14.png # screenshot original
399
+ ├── 00-02-14_crop.png # recorte da região relevante (se houver)
400
+ ├── 00-02-14.json # análise da IA daquele frame
401
+ └── ...
402
+
403
+ ```
404
+
405
+ E, no diretório onde você rodou `wuptracker generate` (não no XDG — é o produto
406
+ do seu trabalho ali):
407
+
408
+ ```
409
+ ./writeups/2026-09-10_14-32_skynet/ # quando o estilo embute imagens
410
+ ├── writeup.md
411
+ ├── writeup-corrido.md
412
+ └── assets/
413
+ ├── 00-02-14.webp
414
+ └── ...
415
+ ./writeups/2026-09-10_14-32_skynet-linkedin.md # estilos sem imagem
416
+ ```
417
+
418
+ Se uma sessão for interrompida abruptamente, `session.json` e `meta.json` já
419
+ estão gravados — o `generate` funciona com o que houver.
420
+
421
+ ---
422
+
423
+ ## Como funciona por dentro
424
+
425
+ Pacote Python normal (`wuptracker/`), instalado via `pyproject.toml`
426
+ (`[project.scripts] wuptracker = "wuptracker.cli:main"`):
427
+
428
+ ```
429
+ wuptracker/
430
+ ├── cli.py # CLI (argparse) — despacha para os módulos abaixo
431
+ ├── capture.py # modo de captura: teclado/sinais, ThreadPoolExecutor, drain
432
+ ├── generate.py # contexto cronológico, chama a IA por estilo, embute/otimiza imagens
433
+ ├── llm.py # backend: claude_cli/anthropic/ollama/openai/gemini (subprocess/urllib)
434
+ ├── profiles.py # prompts de visão (por perfil) e de geração (perfil × estilo)
435
+ ├── configtool.py # lógica do `wuptracker config` (+ o wizard)
436
+ ├── common.py # captura de tela, recorte, WebP, list_sessions(), notificações
437
+ ├── config.py # padrões + overlay de ~/.config/wuptracker/config.json
438
+ └── paths.py # caminhos XDG (config/dados)
439
+ ```
440
+
441
+ Análises são assíncronas: o `capture` conta `submitted`/`completed` e só encerra
442
+ quando tudo termina (ou você força). O `generate` é uma chamada por estilo.