@justmpm/comunicate 0.1.4 → 0.2.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/AGENTS.md +361 -353
- package/CLAUDE.md +336 -356
- package/README.md +147 -31
- package/dist/mcp-server.js +381 -47
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/agent-communication.js +4 -4
- package/dist/mcp-tools/agent-communication.js.map +1 -1
- package/package.json +1 -1
package/AGENTS.md
CHANGED
|
@@ -1,45 +1,36 @@
|
|
|
1
|
-
# @justmpm/comunicate - Guia Completo
|
|
1
|
+
# @justmpm/comunicate - Guia Completo para Agentes
|
|
2
2
|
|
|
3
|
-
Sistema de Comunicação Entre Agentes usando arquivos JSON locais (File-Based Architecture)
|
|
3
|
+
Sistema de Comunicação Entre Agentes usando arquivos JSON locais (File-Based Architecture).
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
## 📋 Índice
|
|
8
8
|
|
|
9
|
-
1. [
|
|
9
|
+
1. [Conceitos Fundamentais](#conceitos-fundamentais)
|
|
10
10
|
2. [Arquitetura](#arquitetura)
|
|
11
|
-
3. [
|
|
12
|
-
4. [
|
|
13
|
-
5. [
|
|
11
|
+
3. [Tokens](#tokens)
|
|
12
|
+
4. [Domínios](#domínios)
|
|
13
|
+
5. [Claims](#claims)
|
|
14
14
|
6. [Fluxos de Trabalho](#fluxos-de-trabalho)
|
|
15
|
-
7. [
|
|
16
|
-
8. [Exemplos](#exemplos)
|
|
17
|
-
9. [
|
|
18
|
-
10. [Troubleshooting](#troubleshooting)
|
|
15
|
+
7. [Todas as Tools](#todas-as-tools)
|
|
16
|
+
8. [Exemplos Completos](#exemplos-completos)
|
|
17
|
+
9. [Troubleshooting](#troubleshooting)
|
|
19
18
|
|
|
20
19
|
---
|
|
21
20
|
|
|
22
|
-
##
|
|
21
|
+
## Conceitos Fundamentais
|
|
23
22
|
|
|
24
|
-
O
|
|
23
|
+
### O que é este sistema?
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
O **@justmpm/comunicate** permite que múltiplos agentes (IAs, scripts, processos) trabalhem juntos no mesmo projeto sem conflitos, através de:
|
|
27
26
|
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- ✅ **No-lock** - Cada agente escreve apenas no seu próprio arquivo
|
|
32
|
-
- ✅ **Otimizado Windows** - File system nativo
|
|
27
|
+
- **Mensagens**: Comunicação assíncrona entre agentes
|
|
28
|
+
- **Domínios**: Separação de responsabilidades por pasta
|
|
29
|
+
- **Claims**: Reserva de arquivos compartilhados
|
|
33
30
|
|
|
34
|
-
###
|
|
31
|
+
### Metáfora
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
|----------|-----------|
|
|
38
|
-
| **Agente** | Entidade que pode enviar/receber mensagens |
|
|
39
|
-
| **Inbox** | Caixa de entrada exclusiva de cada agente |
|
|
40
|
-
| **Domínio** | Diretórios que um agente pode editar naturalmente |
|
|
41
|
-
| **Claim** | Reserva temporária de arquivo fora do domínio |
|
|
42
|
-
| **Heartbeat** | Sinal de vida do agente |
|
|
33
|
+
> Imagine uma sala de equipe onde cada pessoa tem seu próprio quadro de avisos (inbox). Você só escreve no seu quadro, mas pode ler os dos outros. Para escrever no quadro de outra pessoa, você precisa pedir permissão (claim).
|
|
43
34
|
|
|
44
35
|
---
|
|
45
36
|
|
|
@@ -48,160 +39,229 @@ O **@justmpm/comunicate** é um servidor MCP (Model Context Protocol) que permit
|
|
|
48
39
|
```
|
|
49
40
|
.comunicate/
|
|
50
41
|
├── registry/
|
|
51
|
-
│ ├── agents.json # Registro de agentes
|
|
52
|
-
│ ├── tasks.json # Tarefas
|
|
53
|
-
│ └── claims.json # Arquivos reservados
|
|
42
|
+
│ ├── agents.json # Registro de agentes e tokens
|
|
43
|
+
│ ├── tasks.json # Tarefas do sistema
|
|
44
|
+
│ └── claims.json # Arquivos reservados
|
|
54
45
|
├── messages/
|
|
55
|
-
│ ├── inbox-*.json #
|
|
56
|
-
│ └── archive/ # Mensagens
|
|
46
|
+
│ ├── inbox-*.json # Caixa de entrada de cada agente
|
|
47
|
+
│ └── archive/ # Mensagens antigas (gzip)
|
|
57
48
|
└── context/
|
|
58
49
|
├── api-contracts.json
|
|
59
50
|
├── decisions.json
|
|
60
51
|
└── progress.json
|
|
61
52
|
```
|
|
62
53
|
|
|
63
|
-
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Tokens
|
|
57
|
+
|
|
58
|
+
### Admin Token
|
|
59
|
+
|
|
60
|
+
- Configurado na variável de ambiente `COMUNICATE_ADMIN_TOKEN` no arquivo de configuração do MCP
|
|
61
|
+
- Usado para validar operações administrativas: `create_agent`, `list_agents`, `get_inactive_agents`, `get_all_claims`
|
|
62
|
+
- **Função de Segurança**: Garante que apenas o administrador do sistema possa gerenciar agentes e ver informações sensíveis
|
|
63
|
+
- Quando uma tool de admin é chamada, o adminToken passado é comparado com o configurado no sistema
|
|
64
|
+
- Se não corresponder, a operação é negada
|
|
65
|
+
|
|
66
|
+
**IMPORTANTE:**
|
|
67
|
+
- Apenas o administrador deve usar tools de admin
|
|
68
|
+
- Agentes normais não devem ter acesso ao adminToken
|
|
69
|
+
- O adminToken protege contra criação não autorizada de agentes
|
|
70
|
+
|
|
71
|
+
### Agent Token
|
|
72
|
+
|
|
73
|
+
- Gerado pelo `create_agent` quando um admin cria um novo agente
|
|
74
|
+
- **CADA AGENTE TEM SEU PRÓPRIO TOKEN ÚNICO**
|
|
75
|
+
- Usado em TODAS as operações do agente (enviar mensagens, fazer claims, etc.)
|
|
76
|
+
- **GUARDE O TOKEN!** Não será mostrado novamente
|
|
77
|
+
|
|
78
|
+
### Diferença entre os Tokens
|
|
64
79
|
|
|
65
|
-
|
|
80
|
+
| Aspecto | Admin Token | Agent Token |
|
|
81
|
+
|---------|-------------|-------------|
|
|
82
|
+
| **Quem tem** | Apenas administrador | Cada agente tem o seu |
|
|
83
|
+
| **Para que serve** | Gerenciar o sistema | Operações do agente |
|
|
84
|
+
| **Onde é configurado** | Variável de ambiente | Gerado pelo create_agent |
|
|
85
|
+
| **Tools que usa** | create_agent, list_agents, etc. | send_agent_message, claim_file, etc. |
|
|
66
86
|
|
|
67
87
|
---
|
|
68
88
|
|
|
69
|
-
##
|
|
89
|
+
## Domínios
|
|
70
90
|
|
|
71
|
-
|
|
91
|
+
### O que são?
|
|
72
92
|
|
|
73
|
-
|
|
93
|
+
Domínios são pastas onde um agente pode editar arquivos **naturalmente**, sem precisar reservar (fazer claim).
|
|
74
94
|
|
|
75
|
-
|
|
95
|
+
### Exemplo Prático
|
|
76
96
|
|
|
77
|
-
```bash
|
|
78
|
-
npx -y @justmpm/comunicate
|
|
79
97
|
```
|
|
98
|
+
Agente Frontend criado com:
|
|
99
|
+
domains: ["src/components", "src/pages"]
|
|
80
100
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
"command": "npx",
|
|
88
|
-
"args": ["-y", "@justmpm/comunicate"],
|
|
89
|
-
"env": {
|
|
90
|
-
"COMUNICATE_ADMIN_TOKEN": "seu-token-aqui"
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
101
|
+
Resultado:
|
|
102
|
+
✅ Pode editar: src/components/Button.tsx
|
|
103
|
+
✅ Pode editar: src/components/Header/index.tsx
|
|
104
|
+
✅ Pode editar: src/pages/Home.tsx
|
|
105
|
+
❌ NÃO pode editar: src/api/users.ts
|
|
106
|
+
❌ NÃO pode editar: src/types/api.ts
|
|
95
107
|
```
|
|
96
108
|
|
|
97
|
-
###
|
|
109
|
+
### Por que usar domínios?
|
|
98
110
|
|
|
99
|
-
|
|
111
|
+
1. **Segurança**: Agentes só tocam em arquivos de sua responsabilidade
|
|
112
|
+
2. **Eficiência**: Sem necessidade de claims para arquivos próprios
|
|
113
|
+
3. **Organização**: Separação clara de responsabilidades
|
|
100
114
|
|
|
101
|
-
|
|
102
|
-
npm install -g @justmpm/comunicate
|
|
103
|
-
```
|
|
115
|
+
---
|
|
104
116
|
|
|
105
|
-
|
|
117
|
+
## Claims
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"@justmpm/comunicate": {
|
|
111
|
-
"command": "comunicate",
|
|
112
|
-
"env": {
|
|
113
|
-
"COMUNICATE_ADMIN_TOKEN": "seu-token-aqui"
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
+
### O que é um Claim?
|
|
120
|
+
|
|
121
|
+
Um **claim** é uma reserva temporária de um arquivo fora do domínio do agente.
|
|
119
122
|
|
|
120
|
-
|
|
123
|
+
### Quando usar?
|
|
121
124
|
|
|
122
|
-
|
|
125
|
+
- Arquivos compartilhados (ex: `src/types/api.ts`)
|
|
126
|
+
- Configurações globais
|
|
127
|
+
- Arquivos de definição compartilhados
|
|
123
128
|
|
|
124
|
-
|
|
129
|
+
### Ciclo de Vida de um Claim
|
|
125
130
|
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
+
```
|
|
132
|
+
1. Agente tenta editar arquivo fora do domínio
|
|
133
|
+
2. can_edit_file retorna erro
|
|
134
|
+
3. Agente faz claim_file
|
|
135
|
+
4. Arquivo é reservado por X minutos
|
|
136
|
+
5. Agente edita o arquivo
|
|
137
|
+
6. Agente libera com release_file (ou deixa expirar)
|
|
131
138
|
```
|
|
132
139
|
|
|
133
|
-
|
|
140
|
+
### Regras Importantes
|
|
134
141
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"env": {
|
|
142
|
-
"COMUNICATE_ADMIN_TOKEN": "seu-token-aqui"
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
```
|
|
142
|
+
| Regra | Descrição |
|
|
143
|
+
|-------|-----------|
|
|
144
|
+
| Exclusividade | Apenas um claim por arquivo |
|
|
145
|
+
| Expiração | Claims expiram automaticamente |
|
|
146
|
+
| Renovação | Só pode renovar quando faltarem < 5 min |
|
|
147
|
+
| Liberação | Opcional mas recomendada |
|
|
148
148
|
|
|
149
149
|
---
|
|
150
150
|
|
|
151
|
-
##
|
|
151
|
+
## Fluxos de Trabalho
|
|
152
152
|
|
|
153
|
-
### 1
|
|
153
|
+
### Fluxo 1: Setup Inicial (Admin)
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
```
|
|
156
|
+
1. Gerar token admin (32 caracteres hex)
|
|
157
|
+
2. Configurar no mcp.json do Claude Desktop
|
|
158
|
+
3. Criar agentes com create_agent
|
|
159
|
+
4. Distribuir tokens para cada agente
|
|
160
|
+
```
|
|
156
161
|
|
|
157
|
-
|
|
158
|
-
# PowerShell (32 caracteres hex)
|
|
159
|
-
-join ((48..57) + (97..102) | Get-Random -Count 32 | ForEach-Object { [char]$_ })
|
|
162
|
+
### Fluxo 2: Comunicação entre Agentes
|
|
160
163
|
|
|
161
|
-
# Ou via CLI (se instalado globalmente)
|
|
162
|
-
comunicate generate-token
|
|
163
164
|
```
|
|
165
|
+
Agente A (Backend) Agente B (Frontend)
|
|
166
|
+
│ │
|
|
167
|
+
│ 1. Envia mensagem │
|
|
168
|
+
├────────────────────────────────────────>│
|
|
169
|
+
│ send_agent_message │
|
|
170
|
+
│ (tokenA → "frontend") │
|
|
171
|
+
│ │
|
|
172
|
+
│ 2. Lê inbox
|
|
173
|
+
│<────────────────────────────────────────┤
|
|
174
|
+
│ │
|
|
175
|
+
│ get_agent_messages
|
|
176
|
+
│ (tokenB)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Fluxo 3: Edição de Arquivos
|
|
164
180
|
|
|
165
|
-
|
|
181
|
+
```
|
|
182
|
+
Agente precisa editar src/types/api.ts:
|
|
166
183
|
|
|
167
|
-
|
|
184
|
+
PASSO 1: Verificar permissão
|
|
185
|
+
can_edit_file(token, "src/types/api.ts")
|
|
186
|
+
→ Retorna: ❌ "File not in agent domains"
|
|
168
187
|
|
|
169
|
-
|
|
188
|
+
PASSO 2: Reservar arquivo
|
|
189
|
+
claim_file(token, "src/types/api.ts", 30, "Adicionando tipos")
|
|
190
|
+
→ Retorna: ✅ "Reservado até 2026-02-08T23:30:00Z"
|
|
170
191
|
|
|
171
|
-
|
|
192
|
+
PASSO 3: Editar arquivo
|
|
193
|
+
[Edita o arquivo normalmente]
|
|
172
194
|
|
|
173
|
-
|
|
195
|
+
PASSO 4: Liberar (opcional mas recomendado)
|
|
196
|
+
release_file(token, "src/types/api.ts")
|
|
197
|
+
→ Retorna: ✅ "Arquivo liberado"
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Fluxo 4: Renovação de Claim
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
Situação: Edição está demorando mais que o previsto
|
|
204
|
+
|
|
205
|
+
1. Verificar tempo restante
|
|
206
|
+
get_agent_claims(token)
|
|
207
|
+
→ "src/types/api.ts expira em 3 minutos"
|
|
208
|
+
|
|
209
|
+
2. Renovar (só funciona se < 5 min)
|
|
210
|
+
renew_claim(token, "src/types/api.ts", 15)
|
|
211
|
+
→ "Claim renovado até 2026-02-08T23:45:00Z"
|
|
212
|
+
```
|
|
174
213
|
|
|
175
214
|
---
|
|
176
215
|
|
|
177
|
-
## Tools
|
|
216
|
+
## Todas as Tools
|
|
178
217
|
|
|
179
218
|
### Comunicação
|
|
180
219
|
|
|
181
|
-
####
|
|
220
|
+
#### send_agent_message
|
|
182
221
|
Envia mensagem para outro agente.
|
|
183
222
|
|
|
223
|
+
**QUANDO USAR:**
|
|
224
|
+
- Notificar progresso de tarefa
|
|
225
|
+
- Solicitar ajuda
|
|
226
|
+
- Enviar atualizações
|
|
227
|
+
|
|
228
|
+
**PARÂMETROS:**
|
|
229
|
+
- `token`: Seu token de agente
|
|
230
|
+
- `recipientId`: ID do agente destino
|
|
231
|
+
- `message`: Conteúdo (max 4000 chars)
|
|
232
|
+
- `type`: text | assistance_request | task_update | notification
|
|
233
|
+
- `priority`: low | normal | high | urgent
|
|
234
|
+
|
|
235
|
+
**EXEMPLO:**
|
|
184
236
|
```json
|
|
185
237
|
{
|
|
186
|
-
"token": "
|
|
238
|
+
"token": "a1b2c3d4e5f6789012345678abcdef00",
|
|
187
239
|
"recipientId": "frontend",
|
|
188
|
-
"message": "API pronta!",
|
|
240
|
+
"message": "API /users pronta!",
|
|
189
241
|
"type": "task_update",
|
|
190
242
|
"priority": "high"
|
|
191
243
|
}
|
|
192
244
|
```
|
|
193
245
|
|
|
194
|
-
**Tipos:** `text`, `assistance_request`, `task_update`, `notification`
|
|
195
|
-
**Prioridades:** `low`, `normal`, `high`, `urgent`
|
|
196
|
-
|
|
197
246
|
---
|
|
198
247
|
|
|
199
|
-
####
|
|
248
|
+
#### get_agent_messages
|
|
200
249
|
Lê mensagens da inbox.
|
|
201
250
|
|
|
251
|
+
**QUANDO USAR:**
|
|
252
|
+
- Verificar novas mensagens
|
|
253
|
+
- Processar pendências
|
|
254
|
+
|
|
255
|
+
**PARÂMETROS:**
|
|
256
|
+
- `token`: Seu token
|
|
257
|
+
- `includeRead`: Incluir mensagens lidas (default: false)
|
|
258
|
+
- `markAsRead`: Marcar como lidas ao ler (default: true)
|
|
259
|
+
- `limit`: Máximo de mensagens (1-50, default: 10)
|
|
260
|
+
|
|
261
|
+
**EXEMPLO:**
|
|
202
262
|
```json
|
|
203
263
|
{
|
|
204
|
-
"token": "
|
|
264
|
+
"token": "a1b2c3d4e5f6789012345678abcdef00",
|
|
205
265
|
"includeRead": false,
|
|
206
266
|
"markAsRead": true,
|
|
207
267
|
"limit": 10
|
|
@@ -210,283 +270,220 @@ Lê mensagens da inbox.
|
|
|
210
270
|
|
|
211
271
|
---
|
|
212
272
|
|
|
213
|
-
####
|
|
214
|
-
|
|
273
|
+
#### get_unread_count
|
|
274
|
+
Conta mensagens não lidas.
|
|
215
275
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
220
|
-
```
|
|
276
|
+
**QUANDO USAR:**
|
|
277
|
+
- Verificação rápida sem carregar conteúdo
|
|
278
|
+
- Polling ou notificações
|
|
221
279
|
|
|
222
280
|
---
|
|
223
281
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
#### `claim_file`
|
|
227
|
-
Reserva arquivo fora do domínio para edição.
|
|
282
|
+
#### delete_message
|
|
283
|
+
Deleta mensagem específica.
|
|
228
284
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
"filePath": "src/types/api.ts",
|
|
233
|
-
"durationMinutes": 30,
|
|
234
|
-
"reason": "Adicionando tipos da API"
|
|
235
|
-
}
|
|
236
|
-
```
|
|
285
|
+
**QUANDO USAR:**
|
|
286
|
+
- Remover mensagens irrelevantes
|
|
287
|
+
- Limpar spam
|
|
237
288
|
|
|
238
|
-
|
|
289
|
+
**PARÂMETROS:**
|
|
290
|
+
- `token`: Seu token
|
|
291
|
+
- `messageId`: ID da mensagem (formato: msg_xxxxxxxxxxxxxxxx)
|
|
239
292
|
|
|
240
293
|
---
|
|
241
294
|
|
|
242
|
-
####
|
|
243
|
-
|
|
295
|
+
#### clear_read_messages
|
|
296
|
+
Remove todas as mensagens lidas.
|
|
244
297
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
"filePath": "src/types/api.ts",
|
|
249
|
-
"additionalMinutes": 15
|
|
250
|
-
}
|
|
251
|
-
```
|
|
298
|
+
**QUANDO USAR:**
|
|
299
|
+
- Manutenção periódica da inbox
|
|
300
|
+
- Limpar mensagens antigas
|
|
252
301
|
|
|
253
302
|
---
|
|
254
303
|
|
|
255
|
-
|
|
256
|
-
Libera um arquivo reservado antes do tempo.
|
|
257
|
-
|
|
258
|
-
```json
|
|
259
|
-
{
|
|
260
|
-
"token": "token-do-agente",
|
|
261
|
-
"filePath": "src/types/api.ts"
|
|
262
|
-
}
|
|
263
|
-
```
|
|
304
|
+
### Claims (Reserva de Arquivos)
|
|
264
305
|
|
|
265
|
-
|
|
306
|
+
#### can_edit_file
|
|
307
|
+
**SEMPRE CHAME ESTA TOOL ANTES DE EDITAR QUALQUER ARQUIVO!**
|
|
266
308
|
|
|
267
|
-
|
|
268
|
-
Verifica se pode editar um arquivo (domínio ou claim ativo).
|
|
309
|
+
Verifica se você pode editar um arquivo.
|
|
269
310
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
}
|
|
275
|
-
```
|
|
311
|
+
**RESULTADOS:**
|
|
312
|
+
- ✅ "Você pode editar" → Arquivo no domínio ou tem claim ativo
|
|
313
|
+
- ❌ "File not in agent domains" → Use claim_file
|
|
314
|
+
- ❌ "File claimed by X" → Aguarde ou peça para liberar
|
|
276
315
|
|
|
277
316
|
---
|
|
278
317
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
#### `create_agent`
|
|
282
|
-
Cria novo agente.
|
|
318
|
+
#### claim_file
|
|
319
|
+
Reserva arquivo fora do domínio.
|
|
283
320
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
"agentId": "backend",
|
|
288
|
-
"capabilities": ["api", "database", "auth"],
|
|
289
|
-
"domains": ["src/api", "src/models"]
|
|
290
|
-
}
|
|
291
|
-
```
|
|
321
|
+
**QUANDO USAR:**
|
|
322
|
+
- can_edit_file retornou erro de domínio
|
|
323
|
+
- Precisa editar arquivo compartilhado
|
|
292
324
|
|
|
293
|
-
**
|
|
294
|
-
-
|
|
295
|
-
-
|
|
325
|
+
**PARÂMETROS:**
|
|
326
|
+
- `token`: Seu token
|
|
327
|
+
- `filePath`: Caminho do arquivo
|
|
328
|
+
- `durationMinutes`: Tempo de reserva (1-60, default: 15)
|
|
329
|
+
- `reason`: Motivo da reserva (opcional)
|
|
296
330
|
|
|
297
331
|
---
|
|
298
332
|
|
|
299
|
-
####
|
|
300
|
-
|
|
333
|
+
#### renew_claim
|
|
334
|
+
Renova claim prestes a expirar.
|
|
301
335
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
336
|
+
**QUANDO USAR:**
|
|
337
|
+
- Quando faltarem < 5 minutos para expirar
|
|
338
|
+
- Edição está demorando mais que o previsto
|
|
339
|
+
|
|
340
|
+
**RESTRICAO:**
|
|
341
|
+
Só funciona se faltarem menos de 5 minutos!
|
|
307
342
|
|
|
308
343
|
---
|
|
309
344
|
|
|
310
|
-
####
|
|
311
|
-
|
|
345
|
+
#### release_file
|
|
346
|
+
Libera arquivo reservado antes do tempo.
|
|
312
347
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
"timeoutMinutes": 5
|
|
317
|
-
}
|
|
318
|
-
```
|
|
348
|
+
**QUANDO USAR:**
|
|
349
|
+
- Terminou de editar antes da expiração
|
|
350
|
+
- Boas práticas: libere assim que terminar
|
|
319
351
|
|
|
320
352
|
---
|
|
321
353
|
|
|
322
|
-
|
|
354
|
+
#### get_agent_claims
|
|
355
|
+
Lista seus claims ativos.
|
|
323
356
|
|
|
324
|
-
|
|
357
|
+
**QUANDO USAR:**
|
|
358
|
+
- Verificar quais arquivos você reservou
|
|
359
|
+
- Ver quando claims expiram
|
|
325
360
|
|
|
326
|
-
|
|
327
|
-
1. Admin executa: create_agent
|
|
328
|
-
→ Recebe token único do agente
|
|
329
|
-
|
|
330
|
-
2. Agente salva seu token
|
|
331
|
-
|
|
332
|
-
3. Agente A executa: send_agent_message
|
|
333
|
-
→ Mensagem vai para inbox-B.json
|
|
334
|
-
|
|
335
|
-
4. Agente B executa: get_agent_messages
|
|
336
|
-
→ Lê e processa mensagens
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
### Fluxo 2: Coordenação com Claims
|
|
340
|
-
|
|
341
|
-
```
|
|
342
|
-
Backend (domínio: src/models):
|
|
343
|
-
✅ Pode editar: src/models/user.ts
|
|
344
|
-
❌ Não pode: src/components/Button.tsx
|
|
361
|
+
---
|
|
345
362
|
|
|
346
|
-
|
|
347
|
-
✅ Pode editar: src/components/Button.tsx
|
|
348
|
-
❌ Não pode: src/models/user.ts
|
|
349
|
-
|
|
350
|
-
Quando Frontend precisa editar src/types/api.ts:
|
|
351
|
-
1. Executa: can_edit_file → false
|
|
352
|
-
2. Executa: claim_file → success
|
|
353
|
-
3. Executa: can_edit_file → true
|
|
354
|
-
4. [edita o arquivo]
|
|
355
|
-
5. Executa: release_file (ou espera expirar)
|
|
356
|
-
```
|
|
363
|
+
### Administração (requer token de admin)
|
|
357
364
|
|
|
358
|
-
|
|
365
|
+
#### create_agent
|
|
366
|
+
Cria novo agente.
|
|
359
367
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
- Chamar qualquer tool periodicamente (atualiza lastSeen)
|
|
363
|
-
- Ou chamar updateAgentHeartbeat() via código
|
|
368
|
+
**IMPORTANTE:**
|
|
369
|
+
Guarde o token retornado! Não será mostrado novamente.
|
|
364
370
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
371
|
+
**PARÂMETROS:**
|
|
372
|
+
- `adminToken`: Token de admin
|
|
373
|
+
- `agentId`: ID único (ex: backend, frontend)
|
|
374
|
+
- `capabilities`: ["api", "auth"]
|
|
375
|
+
- `domains`: ["src/api", "src/models"]
|
|
368
376
|
|
|
369
377
|
---
|
|
370
378
|
|
|
371
|
-
|
|
379
|
+
#### list_agents
|
|
380
|
+
Lista todos os agentes.
|
|
372
381
|
|
|
373
|
-
|
|
382
|
+
**QUANDO USAR:**
|
|
383
|
+
- Ver configurações
|
|
384
|
+
- Descobrir agentIds para mensagens
|
|
374
385
|
|
|
375
|
-
|
|
376
|
-
# Listar agentes
|
|
377
|
-
comunicate list-agents
|
|
386
|
+
---
|
|
378
387
|
|
|
379
|
-
|
|
380
|
-
|
|
388
|
+
#### get_inactive_agents
|
|
389
|
+
Lista agentes sem heartbeat.
|
|
381
390
|
|
|
382
|
-
|
|
383
|
-
|
|
391
|
+
**QUANDO USAR:**
|
|
392
|
+
- Monitorar saúde do sistema
|
|
393
|
+
- Detectar agentes travados
|
|
384
394
|
|
|
385
|
-
|
|
386
|
-
comunicate check-health 5
|
|
395
|
+
---
|
|
387
396
|
|
|
388
|
-
|
|
389
|
-
|
|
397
|
+
#### get_all_claims
|
|
398
|
+
Lista todos os claims do sistema.
|
|
390
399
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
400
|
+
**QUANDO USAR:**
|
|
401
|
+
- Monitorar uso do sistema
|
|
402
|
+
- Identificar gargalos
|
|
394
403
|
|
|
395
404
|
---
|
|
396
405
|
|
|
397
|
-
## Exemplos
|
|
406
|
+
## Exemplos Completos
|
|
398
407
|
|
|
399
408
|
### Exemplo 1: Backend notifica Frontend
|
|
400
409
|
|
|
401
410
|
```typescript
|
|
402
411
|
// Backend envia atualização
|
|
403
|
-
const result =
|
|
404
|
-
BACKEND_TOKEN,
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
412
|
+
const result = send_agent_message({
|
|
413
|
+
token: BACKEND_TOKEN,
|
|
414
|
+
recipientId: "frontend",
|
|
415
|
+
message: "API /users pronta! Contrato: { id, name, email }",
|
|
416
|
+
type: "task_update",
|
|
417
|
+
priority: "normal"
|
|
418
|
+
});
|
|
409
419
|
```
|
|
410
420
|
|
|
411
|
-
### Exemplo 2: Frontend reserva arquivo
|
|
421
|
+
### Exemplo 2: Frontend reserva arquivo compartilhado
|
|
412
422
|
|
|
413
423
|
```typescript
|
|
414
|
-
// Verifica se pode editar
|
|
415
|
-
const check =
|
|
424
|
+
// 1. Verifica se pode editar
|
|
425
|
+
const check = can_edit_file({
|
|
426
|
+
token: FRONTEND_TOKEN,
|
|
427
|
+
filePath: "src/types/api.ts"
|
|
428
|
+
});
|
|
429
|
+
|
|
416
430
|
if (!check.allowed) {
|
|
417
|
-
// Reserva arquivo
|
|
418
|
-
const claim =
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
30,
|
|
422
|
-
|
|
423
|
-
);
|
|
431
|
+
// 2. Reserva arquivo
|
|
432
|
+
const claim = claim_file({
|
|
433
|
+
token: FRONTEND_TOKEN,
|
|
434
|
+
filePath: "src/types/api.ts",
|
|
435
|
+
durationMinutes: 30,
|
|
436
|
+
reason: "Adicionando tipos da API"
|
|
437
|
+
});
|
|
424
438
|
|
|
425
439
|
if (claim.success) {
|
|
426
|
-
//
|
|
427
|
-
editFile(
|
|
440
|
+
// 3. Edita o arquivo
|
|
441
|
+
editFile("src/types/api.ts", ...);
|
|
428
442
|
|
|
429
|
-
// Libera quando terminar
|
|
430
|
-
|
|
443
|
+
// 4. Libera quando terminar
|
|
444
|
+
release_file({
|
|
445
|
+
token: FRONTEND_TOKEN,
|
|
446
|
+
filePath: "src/types/api.ts"
|
|
447
|
+
});
|
|
431
448
|
}
|
|
432
449
|
}
|
|
433
450
|
```
|
|
434
451
|
|
|
435
|
-
### Exemplo 3:
|
|
452
|
+
### Exemplo 3: Agente verifica e processa mensagens
|
|
436
453
|
|
|
437
454
|
```typescript
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
455
|
+
// Verifica se há mensagens novas
|
|
456
|
+
const unread = get_unread_count({ token: AGENT_TOKEN });
|
|
457
|
+
|
|
458
|
+
if (unread.count > 0) {
|
|
459
|
+
// Lê e processa mensagens
|
|
460
|
+
const messages = get_agent_messages({
|
|
461
|
+
token: AGENT_TOKEN,
|
|
462
|
+
markAsRead: true,
|
|
463
|
+
limit: 10
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
for (const msg of messages) {
|
|
467
|
+
processMessage(msg);
|
|
443
468
|
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// ... quando quiser parar:
|
|
447
|
-
listener.stop();
|
|
469
|
+
}
|
|
448
470
|
```
|
|
449
471
|
|
|
450
472
|
---
|
|
451
473
|
|
|
452
|
-
## Segurança
|
|
453
|
-
|
|
454
|
-
### Timing-Safe Comparison
|
|
455
|
-
|
|
456
|
-
Todos os tokens são comparados usando `crypto.timingSafeEqual()` para prevenir timing attacks.
|
|
457
|
-
|
|
458
|
-
### Token de Admin
|
|
459
|
-
|
|
460
|
-
- Armazene em variável de ambiente `COMUNICATE_ADMIN_TOKEN`
|
|
461
|
-
- Nunca commite tokens em repositório
|
|
462
|
-
- Use tokens longos e aleatórios (32+ caracteres hex)
|
|
463
|
-
|
|
464
|
-
### Claims
|
|
465
|
-
|
|
466
|
-
- Claims expiram automaticamente
|
|
467
|
-
- Só um agente pode ter claim de um arquivo por vez
|
|
468
|
-
- Sequence number previne race conditions
|
|
469
|
-
|
|
470
|
-
### Domínios
|
|
471
|
-
|
|
472
|
-
- Defina domínios restritos ao criar agente
|
|
473
|
-
- Agente só edita arquivos dentro de seus domínios sem claim
|
|
474
|
-
|
|
475
|
-
---
|
|
476
|
-
|
|
477
474
|
## Troubleshooting
|
|
478
475
|
|
|
479
476
|
### "Token inválido"
|
|
480
477
|
|
|
481
478
|
- Verifique se o token está completo (32 caracteres hex)
|
|
482
|
-
- Confirme que o agente está ativo (
|
|
479
|
+
- Confirme que o agente está ativo (list_agents)
|
|
483
480
|
- Verifique se há espaços extras
|
|
484
481
|
|
|
485
482
|
### "File claimed by X"
|
|
486
483
|
|
|
487
484
|
- Outro agente já reservou o arquivo
|
|
488
|
-
- Espere expirar ou peça para liberar
|
|
489
|
-
- Use
|
|
485
|
+
- Espere expirar ou peça para liberar via mensagem
|
|
486
|
+
- Use get_all_claims (admin) para verificar
|
|
490
487
|
|
|
491
488
|
### Mensagens não aparecem
|
|
492
489
|
|
|
@@ -494,77 +491,88 @@ Todos os tokens são comparados usando `crypto.timingSafeEqual()` para prevenir
|
|
|
494
491
|
- Confirme o `recipientId` no envio
|
|
495
492
|
- Verifique o arquivo inbox-*.json manualmente
|
|
496
493
|
|
|
497
|
-
### File
|
|
494
|
+
### "File not in agent domains"
|
|
498
495
|
|
|
499
|
-
-
|
|
500
|
-
-
|
|
501
|
-
- Considere usar `startPolling()` explicitamente
|
|
496
|
+
- Arquivo está fora dos domínios definidos no create_agent
|
|
497
|
+
- Use claim_file para reservar o arquivo
|
|
502
498
|
|
|
503
499
|
### Permissão negada ao escrever JSON
|
|
504
500
|
|
|
505
501
|
- Verifique permissões da pasta `.comunicate/`
|
|
506
|
-
- Execute como administrador se necessário
|
|
507
502
|
- Verifique se outro processo está usando os arquivos
|
|
508
503
|
|
|
509
|
-
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
## Segurança e Permissões
|
|
507
|
+
|
|
508
|
+
### Modelo de Segurança
|
|
509
|
+
|
|
510
|
+
O sistema tem dois níveis de acesso:
|
|
510
511
|
|
|
511
|
-
|
|
512
|
+
#### 1. Administrador
|
|
513
|
+
- Tem acesso ao **adminToken** configurado no sistema
|
|
514
|
+
- Pode criar, listar e monitorar agentes
|
|
515
|
+
- Pode ver todos os claims do sistema
|
|
516
|
+
- Não participa diretamente da comunicação entre agentes
|
|
512
517
|
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
518
|
+
#### 2. Agentes
|
|
519
|
+
- Têm apenas seu **próprio token** (recebido no create_agent)
|
|
520
|
+
- Podem se comunicar entre si via mensagens
|
|
521
|
+
- Podem reservar arquivos fora de seus domínios
|
|
522
|
+
- **NÃO** podem usar tools de admin (create_agent, list_agents, etc.)
|
|
516
523
|
|
|
517
|
-
|
|
518
|
-
|
|
524
|
+
### Validação de Acesso
|
|
525
|
+
|
|
526
|
+
Toda tool de admin valida o adminToken:
|
|
527
|
+
```
|
|
528
|
+
Usuário chama: list_agents(adminToken="abc123...")
|
|
529
|
+
↓
|
|
530
|
+
Sistema compara: adminToken == COMUNICATE_ADMIN_TOKEN?
|
|
531
|
+
↓
|
|
532
|
+
Se SIM → executa a operação
|
|
533
|
+
Se NÃO → retorna "Token de admin inválido"
|
|
519
534
|
```
|
|
520
535
|
|
|
536
|
+
Isso garante que apenas quem tem o token de admin configurado no sistema possa gerenciar agentes.
|
|
537
|
+
|
|
538
|
+
### Por que isso é importante?
|
|
539
|
+
|
|
540
|
+
Imagine um projeto com múltiplos agentes trabalhando:
|
|
541
|
+
- Se qualquer agente pudesse criar outros, o sistema ficaria caótico
|
|
542
|
+
- O adminToken garante controle centralizado sobre quem pode participar
|
|
543
|
+
- Cada agente opera apenas dentro de suas permissões
|
|
544
|
+
|
|
521
545
|
---
|
|
522
546
|
|
|
523
547
|
## Dicas
|
|
524
548
|
|
|
525
|
-
1. **
|
|
526
|
-
-
|
|
527
|
-
-
|
|
528
|
-
- `shared`: `src/types`, `src/utils` (use claims)
|
|
549
|
+
1. **SEMPRE use can_edit_file antes de editar**
|
|
550
|
+
- Previne erros de permissão
|
|
551
|
+
- Identifica necessidade de claim
|
|
529
552
|
|
|
530
553
|
2. **Renove claims antes de expirar**
|
|
531
|
-
- Se
|
|
532
|
-
-
|
|
554
|
+
- Se faltarem < 5 minutos
|
|
555
|
+
- Evita interrupção no meio da edição
|
|
533
556
|
|
|
534
557
|
3. **Use prioridades adequadamente**
|
|
535
|
-
- `urgent`: Bugs críticos
|
|
536
|
-
- `high`: Features importantes
|
|
558
|
+
- `urgent`: Bugs críticos
|
|
559
|
+
- `high`: Features importantes
|
|
537
560
|
- `normal`: Comunicação rotineira
|
|
538
|
-
- `low`: Informações
|
|
561
|
+
- `low`: Informações
|
|
539
562
|
|
|
540
563
|
4. **Limpe mensagens lidas periodicamente**
|
|
541
|
-
- Use
|
|
542
|
-
-
|
|
543
|
-
|
|
544
|
-
---
|
|
545
|
-
|
|
546
|
-
## Referência Rápida
|
|
547
|
-
|
|
548
|
-
### Criar Agente
|
|
549
|
-
```json
|
|
550
|
-
{"adminToken": "...", "agentId": "backend", "capabilities": ["api"], "domains": ["src/api"]}
|
|
551
|
-
```
|
|
564
|
+
- Use clear_read_messages
|
|
565
|
+
- Mantém inbox performática
|
|
552
566
|
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
```
|
|
567
|
+
5. **Libere claims ao terminar**
|
|
568
|
+
- Boas práticas de convivência
|
|
569
|
+
- Permite outros agentes trabalharem
|
|
557
570
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
### Ler Mensagens
|
|
564
|
-
```json
|
|
565
|
-
{"token": "...", "includeRead": false, "markAsRead": true, "limit": 10}
|
|
566
|
-
```
|
|
571
|
+
6. **Proteja o adminToken**
|
|
572
|
+
- Apenas o administrador deve usá-lo
|
|
573
|
+
- Não compartilhe com agentes normais
|
|
574
|
+
- Configurado uma única vez no mcp.json
|
|
567
575
|
|
|
568
576
|
---
|
|
569
577
|
|
|
570
|
-
**Versão 0.1.
|
|
578
|
+
**Versão 0.1.4** | Arquitetura File-Based | Otimizado para Windows
|