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.
- wuptracker-0.1.0/.gitignore +13 -0
- wuptracker-0.1.0/LICENSE +21 -0
- wuptracker-0.1.0/PKG-INFO +442 -0
- wuptracker-0.1.0/README.md +415 -0
- wuptracker-0.1.0/pyproject.toml +42 -0
- wuptracker-0.1.0/uv.lock +705 -0
- wuptracker-0.1.0/wuptracker/__init__.py +3 -0
- wuptracker-0.1.0/wuptracker/capture.py +342 -0
- wuptracker-0.1.0/wuptracker/cli.py +187 -0
- wuptracker-0.1.0/wuptracker/common.py +382 -0
- wuptracker-0.1.0/wuptracker/config.py +156 -0
- wuptracker-0.1.0/wuptracker/configtool.py +561 -0
- wuptracker-0.1.0/wuptracker/generate.py +282 -0
- wuptracker-0.1.0/wuptracker/llm.py +315 -0
- wuptracker-0.1.0/wuptracker/paths.py +25 -0
- wuptracker-0.1.0/wuptracker/profiles.py +293 -0
|
@@ -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
|
wuptracker-0.1.0/LICENSE
ADDED
|
@@ -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.
|