You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 7be6789
Browse filesBrowse the repository at this point in the historyBrowse files
docs/ spec e ADRs (docs/adr/0001: bots headless com chat)
23
23
```
24
24
25
25
## Comandos
@@ -50,31 +50,29 @@ Em dev, use `$env:BOTLOFT_HOME = "$PWD\.dev\home"` (caminho absoluto) no daemon
50
50
- Código, identificadores, comentários, commits e README em **inglês**. Docs em `docs/` podem ser em português.
51
51
- Arquivos com no máximo **~300 linhas**. Passou disso, divida por responsabilidade.
52
52
- Erros: `thiserror` nos crates de biblioteca, `anyhow` só no binário.
53
-
- IDs são ULID com prefixo (`crw_`, `bot_`, `msg_`, `dlv_`, `tsk_`). Tempo em ms Unix.
53
+
- IDs são ULID com prefixo (`crw_`, `bot_`, `msg_`, `dlv_`, `tsk_`, `cht_`, `apr_`, `att_`). Tempo em ms Unix.
54
54
- Tudo que é específico de Windows fica em `crates/botloftd/src/platform/`. O resto do daemon não chama Win32 direto.
55
55
- A UI depende só da interface `BotloftApi` (`app/src/lib/api.ts`). Testes de componente usam `FakeBotloft`.
56
56
- Nunca edite `app/src/lib/protocol.gen.ts` à mão.
57
57
- Commits pequenos, no formato Conventional Commits (`feat(courier): ...`).
58
58
59
59
## Windows: armadilhas conhecidas
60
60
61
-
- O inbox do Claude Code no Windows é um **named pipe** criado pelo próprio Claude Code. O daemon é cliente. A primeira linha tem que ser o auth com `CLAUDE_CODE_MESSAGING_TOKEN`, senão a conexão é descartada. Abra o pipe só com a mensagem pronta.
62
-
- Hooks usam **exec form** (`"args": [...]`) chamando `botloftd.exe hook <evento>`. Nada de hook em bash ou PowerShell. O subcomando sai sempre com 0 e nunca escreve no stdout.
63
-
- Só o `claude.exe` nativo roda. O `claude.cmd` do npm é recusado: passar por `cmd.exe` estraga o quoting na PTY.
64
-
- ConPTY não tem fd para `poll`: leitura da PTY em thread dedicada + canal. Ao fim do processo, feche o pseudoconsole, senão a leitura nunca vê EOF.
65
-
- O ConPTY do `portable-pty` (com `PSEUDOCONSOLE_INHERIT_CURSOR`) manda `ESC[6n` ao iniciar e trava o filho até a resposta. O daemon responde `ESC[1;1R` à primeira consulta.
61
+
- Cada bot é `claude -p` com `stream-json` no stdin e no stdout (spec 7.4, 8, 9.2). O processo fica calado até a primeira mensagem; fechar o stdin o encerra. O formato de entrada não é documentado: qualquer mudança passa por teste real e vai para a seção 19.
62
+
- Bots rodam com `--setting-sources project,local` e `--strict-mcp-config`: nada de hooks, skills, modo de permissão ou MCP pessoais do dono. Aprovações passam pela tool `permission_prompt` do nosso MCP.
63
+
- Servidor MCP por HTTP: o Claude Code aborta a request em 60 s e a chamada em 5 min sem resposta, a menos que o `mcp.json` tenha `timeout` no servidor. A aprovação depende disso.
64
+
- Só o `claude.exe` nativo roda. O `claude.cmd` do npm é recusado: passar por `cmd.exe` estraga o quoting dos argumentos.
66
65
- O bot recebe o ambiente padrão do usuário (`CreateEnvironmentBlock`), nunca o do daemon: em dev o daemon herda variáveis da sessão do Claude Code (`CLAUDE_CODE_MESSAGING_SOCKET`, `ANTHROPIC_BASE_URL`...).
67
66
- PATH real pode ter aspas soltas. Separe só por `;`; `std::env::split_paths` trata aspas como agrupamento e engole o resto.
68
-
- Numa sessão interativa, os hooks só rodam depois de aceitar a confiança da pasta. Teste manual de bot novo começa pelo diálogo de confiança no terminal.
69
-
- Todo processo de bot entra num Job Object com kill-on-close.
67
+
- Todo processo de bot entra num Job Object com kill-on-close e roda sem console (`CREATE_NO_WINDOW`).
70
68
- Permissão de arquivo é ACL (SID do usuário atual), não modo Unix.
71
69
- Estado em `%LOCALAPPDATA%`, nunca `%APPDATA%` (roaming).
72
70
- Cuidado com o limite de 260 caracteres em caminhos de workspace.
73
71
74
72
## Segurança e privacidade
75
73
76
74
- Daemon só em `127.0.0.1`.
77
-
- Nunca logar token, corpo de mensagemou saída de terminal em nível `info` ou acima. Bots podem lidar com dado pessoal e de saúde.
75
+
- Nunca logar token, corpo de mensagem, anexo ou item do chat (resposta, saída de ferramenta) em nível `info` ou acima. Bots podem lidar com dado pessoal e de saúde.
78
76
- Tokens de bot ficam no banco só como SHA-256.
79
77
- Nada de telemetria.
80
78
@@ -83,10 +81,10 @@ Em dev, use `$env:BOTLOFT_HOME = "$PWD\.dev\home"` (caminho absoluto) no daemon
83
81
Uma tarefa só está pronta quando:
84
82
85
83
1.`cargo fmt`, `clippy -D warnings` e `cargo test` passam (e `pnpm check`, se mexeu no app);
86
-
2. comportamento novo tem teste (supervisor, courier e terminal testados com `FakeRuntime`);
84
+
2. comportamento novo tem teste (supervisor, courier e chat testados com `FakeRuntime`);
87
85
3. a spec continua verdadeira;
88
86
4. o que depende do Claude Code real está listado no PR com o passo de teste manual.
89
87
90
88
## Ordem de trabalho
91
89
92
-
Siga os marcos da spec (seção 17): M0 -> M1 -> M2 -> M3 -> M4 -> M5. Não comece rotinas, caixa de perguntas, busca ou acesso remoto antes do M5.
90
+
Siga os marcos da spec (seção 17): M0 -> M1 -> M2 -> M3 -> M4 -> M4.1 -> M5. Não comece rotinas, caixa de perguntas, busca ou acesso remoto antes do M5.
0 commit comments