Krohnos
English

Agente de conhecimento do X

Transforma os posts que você salvou no X em receitas curtas de conhecimento.

Uso pessoal: lê a sua própria conta, pela sua própria sessão, só em modo leitura.

O que é

Transforma os posts que você salvou (bookmarks) no X em receitas curtas de conhecimento. Uso pessoal: lê a sua própria conta, pela sua própria sessão, em modo somente leitura.

Sem senha e sem API paga: o agente nunca faz login, usa a sessão que você já tem aberta no navegador. Cada passo é idempotente: salvo já visto não é coletado de novo e receita já gravada não chama o LLM outra vez.

Como funciona

Fluxo do agente de conhecimento do XCinco etapas em sequência: salvos do X, coleta, extração, receita e uso.1Salvos do Xseus bookmarks, sua conta2Coletanavegador sem tela, somente leitura3Extraçãoo post é dado, LLM só de texto4Receitavalidada, status curta5Usobiblioteca ou texto de issue

Fluxo do agente de conhecimento do X

  1. Salvos do X: os bookmarks da sua conta.
  2. Coleta (coletar): navegador sem tela, cookies da sua sessão, uma coleta por dia, somente leitura. Grava <saida>/AAAA-MM-DD.jsonl e vistos.json (ids já coletados); grava ERRO se a sessão cair.
  3. Extração (extrair): o post vira dado dentro de um bloco com delimitador aleatório; o LLM (claude -p) roda sem ferramentas, sem servidores MCP e sem configurações de usuário.
  4. Receita: validada (frontmatter, tamanho, sem URL fora dos links do post, sem comando perigoso). Com destino = "biblioteca" vai para <saida>/receitas/<tema>/<id>-<titulo>.md (status curta); com "issue", para <saida>/issues/<id>-<titulo>.md.
  5. Uso: a receita entra na biblioteca de referências, ou vira texto de issue, e é aplicada em trabalho real.

Instalar

Pegue o pacote: ele é o módulo hub/x_salvos/ do repositório do Krohnos (https://github.com/BRK13/krohnos). Clone e rode todos os comandos desta página na raiz do clone:

bash
git clone https://github.com/BRK13/krohnos.git
cd krohnos
  • Python 3.11 ou mais novo e um Chrome ou Chromium instalado.
  • Só o playwright; o navegador é o do sistema, apontado pela chave chrome:
  • Para extrair: o CLI claude instalado e autenticado (ele roda como claude -p --tools "" --strict-mcp-config --setting-sources "": só texto, sem ferramentas, sem servidores MCP e sem configurações nem hooks de usuário e projeto), ou a sua própria função executar_llm(prompt) se você chama o módulo pelo Python.
bash
pip install playwright

Exporte os cookies (próxima seção) e crie o x_salvos.toml (seção Configuração). Teste à mão, primeiro a coleta e depois a extração:

bash
python3 -m hub.x_salvos coletar --config x_salvos.toml
python3 -m hub.x_salvos extrair --config x_salvos.toml

Para rodar todo dia, agende isto no cron do sistema (--jitter espera de 0 a jitter_max_s antes de começar; à mão, rode sem ele):

bash
python3 -m hub.x_salvos coletar --jitter --config x_salvos.toml

Os comandos são os do README do módulo, hub/x_salvos/README.md.

Como exportar os cookies

O agente nunca faz login: usa a sessão que você já tem aberta no navegador. A sessão é sua, a senha não entra, e não há API paga.

  • Entre no X no navegador, com a sua conta.
  • Com uma extensão que exporta cookies, ou pelo DevTools (Application, Cookies, https://x.com), copie só o valor de auth_token, ct0 e twid.
  • Grave um JSON com apenas essas três chaves:
json
{"auth_token": "...", "ct0": "...", "twid": "..."}
  • chmod 600 no arquivo. Um arquivo mais aberto é corrigido e avisado, e o valor nunca aparece no log.
  • Arquivo com senha, usuário ou qualquer credencial de login é recusado.
bash
chmod 600 ~/.config/x-salvos/cookies.json

Quando a sessão expira, a coleta grava ERRO na pasta de saída e para (código 2): exporte cookies novos.

Configuração

Arquivo x_salvos.toml. Precedência: padrões, depois arquivo, depois variáveis de ambiente. Chave desconhecida é erro. Todas as chaves:

toml
cookies = "~/.config/x-salvos/cookies.json"   # JSON com auth_token, ct0, twid (chmod 600)
cookies_origem = ""                           # opcional: arquivo ou pasta onde os cookies chegam de outra máquina
saida = "~/x-salvos"                          # jsonl, vistos.json, ERRO e receitas
temas = ["seo", "automacao"]                  # opcional: receita fora dos temas vai marcada, nunca é descartada
destino = "biblioteca"                        # "biblioteca" ou "issue"
max_itens = 150                               # itens por rodada (máximo 500)
max_paginas = 40                              # rolagens por rodada
limite_taxa_s = 1.5                           # intervalo mínimo entre navegações, em segundos
jitter_max_s = 1200                           # com --jitter: espera de 0 a este valor antes de começar
chrome = "/usr/bin/google-chrome"
trava = "~/x-salvos/.trava"                   # arquivo do flock contra duas coletas; padrão <saida>/.trava
Chaves do x_salvos.toml
ChaveO que faz
cookiesJSON com auth_token, ct0, twid (chmod 600)
cookies_origemOpcional: arquivo ou pasta onde os cookies chegam de outra máquina (em pasta: o mesmo nome do arquivo de cookies ou x-cookies.json)
saidaPasta de saída: jsonl, vistos.json, ERRO e receitas
temasOpcional: receita fora dos temas vai marcada, nunca é descartada
destino"biblioteca" grava em <saida>/receitas/<tema>/<id>-<titulo>.md (status curta); "issue" grava em <saida>/issues/<id>-<titulo>.md
max_itensLimite: itens por rodada, máximo 500
max_paginasLimite: rolagens por rodada
limite_taxa_sLimite: intervalo mínimo entre navegações, em segundos
jitter_max_sCom --jitter: espera de 0 a este valor antes de começar
chromeCaminho do Chrome ou Chromium do sistema
travaArquivo do flock contra duas coletas ao mesmo tempo; padrão <saida>/.trava

Variáveis de ambiente:

text
KROHNOS_X_SALVOS_CONFIG, KROHNOS_X_SALVOS_COOKIES, KROHNOS_X_SALVOS_COOKIES_ORIGEM, KROHNOS_X_SALVOS_SAIDA, KROHNOS_X_SALVOS_TEMAS, KROHNOS_X_SALVOS_DESTINO, X_MAX_ITENS, KROHNOS_X_SALVOS_MAX_PAGINAS, KROHNOS_X_SALVOS_LIMITE_TAXA_S, KROHNOS_X_SALVOS_JITTER_MAX_S, KROHNOS_X_SALVOS_CHROME, KROHNOS_X_SALVOS_TRAVA

Os 6 guardrails e o teste que prova cada um

Todos estão em código (guardrails.py) e cada um falha se o código for removido. Os testes ficam em tests/test_x_salvos_guardrails.py, tests/test_x_salvos_extrair.py e tests/test_x_salvos_config.py.

Guardrails e testes
GuardrailO que garanteTeste que prova
1. Somente leituraMétodo de escrita e endpoint de escrita (inclusive em GET) são abortados e registrados sem corpo. O único clique permitido é expandir respostas; curtir, repostar e seguir são recusados. URL ilegível, codificação ou subdomínio não abrem brecha: a falha fecha. A trava fica no contexto do navegador, inclusive em --refazer-fio. Service Workers são bloqueados, então nada escapa da trava.tests/test_x_salvos_guardrails.py: TestSomenteLeitura.test_metodos_de_escrita_bloqueados, test_endpoints_de_escrita_bloqueados_mesmo_em_get, test_instalar_aborta_escrita_e_registra_sem_corpo, test_clique_de_acao_recusado, test_url_ilegivel_aborta_fail_closed, test_brechas_de_codificacao_e_subdominio, test_abrir_instala_a_trava_no_contexto, test_refazer_fio_abre_pelo_abrir
2. A sessão é suaSó auth_token, ct0 e twid; credencial de login é recusada. Não existe fluxo de login e a coleta não navega para a tela de login. Cookies vindos de outra máquina (cookies_origem) são copiados só se mais novos, com chmod 600, sem valor no log.tests/test_x_salvos_guardrails.py: TestSessaoDoUsuario.test_cookies_so_os_tres, test_rejeita_credencial_de_login, test_fonte_sem_fluxo_de_login, test_nao_navega_para_login, TestCookiesOrigem
3. Limite de taxa, teto e parada se a sessão cairIntervalo mínimo entre navegações (limite_taxa_s) e teto de rolagens e de itens por rodada. Se a sessão cair, a coleta detecta pela URL, grava ERRO na pasta de saída e para sem insistir (código 2).tests/test_x_salvos_guardrails.py: TestLimiteETeto.test_intervalo_minimo_entre_navegacoes, test_ir_respeita_a_taxa, test_teto_de_rolagens, test_teto_de_itens, test_sessao_caiu_por_url, TestParada
4. O conteúdo do post é dado, não instruçãoO texto do post fica dentro de um bloco com delimitador aleatório; delimitador forjado é neutralizado. A extração roda claude -p só de texto: sem ferramentas, sem servidores MCP, sem configurações de usuário e projeto, e sem pular permissões. A resposta é validada: comando perigoso, URL fora dos links do post, formato ou tamanho inválido rejeitam a receita e o resto segue.tests/test_x_salvos_extrair.py: TestPrompt, TestValidacao, TestDestino.test_resposta_perigosa_nao_grava_e_pipeline_segue, TestDestino.test_padrao_nao_usa_bypass
5. SegredosValor de cookie é mascarado em qualquer log e no arquivo ERRO. Os cookies são gravados com chmod 600, de forma atômica; permissão mais aberta é corrigida e avisada, sem mostrar o valor.tests/test_x_salvos_guardrails.py: TestSegredos.test_mascarar, test_log_nunca_mostra_valor, test_erro_gravado_vai_mascarado, test_gravar_cookies_600_atomico, test_permissao_mais_aberta_e_corrigida_sem_valor, test_ler_cookies_corrige_permissao
6. Termos de uso: uso pessoalLê só os seus próprios salvos; a busca pública fica fora deste agente. Sem scraping em massa e sem escrever nada no X. No máximo 500 itens por coleta (também com --forcar, que serve para a carga inicial ou uma correção), uma coleta por dia e uma por vez. O aviso sai em --help e na primeira rodada. Cumprir os termos de uso do X é responsabilidade de quem usa.tests/test_x_salvos_guardrails.py: TestTermos.test_aviso_tem_o_essencial, test_ajuda_e_primeira_rodada_imprimem_aviso, test_teto_500, test_uma_coleta_por_dia, TestColetorPuro.test_trava_impede_segunda_coleta

Destino e teto inválidos são recusados antes de coletar (tests/test_x_salvos_config.py). Rodar a prova:

bash
python3 -m unittest tests.test_x_salvos_config tests.test_x_salvos_guardrails tests.test_x_salvos_extrair

Aviso de termos

Atenção: Esta ferramenta lê só os salvos da sua própria conta, em modo somente leitura; a busca pública fica fora deste agente. Sem scraping em massa: no máximo 500 itens por coleta e uma coleta por dia (--forcar serve para a carga inicial ou uma correção e também respeita o teto). Uso pessoal. Você é responsável por cumprir os termos de uso do X.