@quaglius/ai-comms 0.1.0 → 0.3.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/README.md +81 -2
- package/dist/agent-cli.d.ts +36 -0
- package/dist/agent-cli.js +69 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/auto-answer.d.ts +45 -0
- package/dist/auto-answer.js +183 -0
- package/dist/auto-answer.js.map +1 -0
- package/dist/budget.d.ts +25 -0
- package/dist/budget.js +80 -0
- package/dist/budget.js.map +1 -0
- package/dist/bus-ask.d.ts +25 -0
- package/dist/bus-ask.js +62 -0
- package/dist/bus-ask.js.map +1 -0
- package/dist/cli.js +49 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +108 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.js +9 -3
- package/dist/context.js.map +1 -1
- package/dist/daemon.d.ts +6 -0
- package/dist/daemon.js +51 -8
- package/dist/daemon.js.map +1 -1
- package/dist/envelope.d.ts +4 -4
- package/dist/instructions.d.ts +13 -0
- package/dist/instructions.js +57 -0
- package/dist/instructions.js.map +1 -0
- package/dist/mcp.js +89 -25
- package/dist/mcp.js.map +1 -1
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +3 -0
- package/dist/paths.js.map +1 -1
- package/dist/store.d.ts +8 -1
- package/dist/store.js +44 -1
- package/dist/store.js.map +1 -1
- package/dist/time.d.ts +4 -0
- package/dist/time.js +21 -0
- package/dist/time.js.map +1 -0
- package/docs/OPEN-QUESTIONS.md +50 -2
- package/docs/SETUP-FOR-AGENTS.md +46 -1
- package/docs/SPEC-v0.3.md +181 -0
- package/package.json +1 -1
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/time.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Human-readable duration, e.g. `2h57m`, `45m`, `3h`. */
|
|
2
|
+
export declare function formatDuration(ms: number): string;
|
|
3
|
+
export declare function formatRemaining(until: string, now?: Date): string;
|
|
4
|
+
export declare function overlapRemainingMs(untilA: string, untilB: string, now?: Date): number;
|
package/dist/time.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Human-readable duration, e.g. `2h57m`, `45m`, `3h`. */
|
|
2
|
+
export function formatDuration(ms) {
|
|
3
|
+
if (ms <= 0)
|
|
4
|
+
return '0m';
|
|
5
|
+
const totalMinutes = Math.floor(ms / 60_000);
|
|
6
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
7
|
+
const minutes = totalMinutes % 60;
|
|
8
|
+
if (hours > 0 && minutes > 0)
|
|
9
|
+
return `${hours}h${minutes}m`;
|
|
10
|
+
if (hours > 0)
|
|
11
|
+
return `${hours}h`;
|
|
12
|
+
return `${minutes}m`;
|
|
13
|
+
}
|
|
14
|
+
export function formatRemaining(until, now = new Date()) {
|
|
15
|
+
return formatDuration(new Date(until).getTime() - now.getTime());
|
|
16
|
+
}
|
|
17
|
+
export function overlapRemainingMs(untilA, untilB, now = new Date()) {
|
|
18
|
+
const overlapEnd = Math.min(new Date(untilA).getTime(), new Date(untilB).getTime());
|
|
19
|
+
return Math.max(0, overlapEnd - now.getTime());
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=time.js.map
|
package/dist/time.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAClC,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAC7D,OAAO,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,MAAc,EACd,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
package/docs/OPEN-QUESTIONS.md
CHANGED
|
@@ -23,8 +23,12 @@ Conservative interpretations applied. They do not change the envelope schema.
|
|
|
23
23
|
|
|
24
24
|
**Protocol/spec:** daemon step 3 — `from.dev === config.dev`.
|
|
25
25
|
|
|
26
|
-
**Interpretation:**
|
|
27
|
-
|
|
26
|
+
**Interpretation:** skip desktop notification only. Every valid envelope is
|
|
27
|
+
persisted to `log.jsonl` regardless of author — the log reconstructs the full
|
|
28
|
+
channel, and filtering by author breaks that invariant (e.g. own claims vanish
|
|
29
|
+
after a cold start). MCP `bus_send` also appends locally; the daemon must not
|
|
30
|
+
drop duplicates on ingest. Always advance `cursor.json` so the message is not
|
|
31
|
+
reprocessed.
|
|
28
32
|
|
|
29
33
|
## 2. Notification sound
|
|
30
34
|
|
|
@@ -51,3 +55,47 @@ parsing. Extreme case; in normal use truncating `body` is enough.
|
|
|
51
55
|
**Interpretation:** use `daemon.pid` + `process.kill(pid, 0)` and `log.jsonl`
|
|
52
56
|
`mtime`. False positive if the bus is quiet but the daemon is alive; false
|
|
53
57
|
negative if the pidfile is stale.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## v0.3
|
|
62
|
+
|
|
63
|
+
Conservative interpretations applied. They do not change the envelope schema.
|
|
64
|
+
|
|
65
|
+
### 1. `bus_ask` without `team` roster
|
|
66
|
+
|
|
67
|
+
**Spec:** default `to` is all devs in `team` minus self.
|
|
68
|
+
|
|
69
|
+
**Interpretation:** if `.ai-comms.json` `team` is empty or missing, `bus_ask`
|
|
70
|
+
returns an error asking for explicit `to`. It does not fall back to `["*"]`.
|
|
71
|
+
|
|
72
|
+
### 2. `bus_ask` and `need` vs `blocking`
|
|
73
|
+
|
|
74
|
+
**Spec:** mentions publishing `need` when `blocking`.
|
|
75
|
+
|
|
76
|
+
**Interpretation:** the v0.3 MCP signature has no `blocking` flag. `bus_ask`
|
|
77
|
+
always publishes `type: "ask"`. Use `bus_send` with `type: "need"` for blocking
|
|
78
|
+
requests that do not wait for a reply.
|
|
79
|
+
|
|
80
|
+
### 3. Auto-answer repo cwd with multiple registered repos
|
|
81
|
+
|
|
82
|
+
**Spec:** headless cwd is the repo path from `config.json`.
|
|
83
|
+
|
|
84
|
+
**Interpretation:** auto-answer runs only when the project has **exactly one**
|
|
85
|
+
registered repo in `projects[p].repos`. With zero or multiple repos, the daemon
|
|
86
|
+
logs the reason and leaves the ask unanswered.
|
|
87
|
+
|
|
88
|
+
### 4. Cursor read-only restriction
|
|
89
|
+
|
|
90
|
+
**Spec:** `cursor-agent -p` with a read-only equivalent.
|
|
91
|
+
|
|
92
|
+
**Interpretation:** launch with `--mode ask` (documented read-only). Do not pass
|
|
93
|
+
`--force` / `--yolo`. If Cursor changes mode semantics, treat as unsupported and
|
|
94
|
+
do not launch.
|
|
95
|
+
|
|
96
|
+
### 5. `link` instruction prompt
|
|
97
|
+
|
|
98
|
+
**Spec:** `link` offers to write the instruction block.
|
|
99
|
+
|
|
100
|
+
**Interpretation:** interactive `link` prompts `[Y/n]` (default yes). `--no-instructions`
|
|
101
|
+
skips the prompt and the write entirely.
|
package/docs/SETUP-FOR-AGENTS.md
CHANGED
|
@@ -121,6 +121,11 @@ npx @quaglius/ai-comms link
|
|
|
121
121
|
- `project`: from step 3 (default: `defaultProject`)
|
|
122
122
|
- `repo`: repo name (default: directory basename)
|
|
123
123
|
|
|
124
|
+
By default, `link` also offers to write an ai-comms instruction block into
|
|
125
|
+
`CLAUDE.md` (and `AGENTS.md` if present), between `<!-- ai-comms:start -->` and
|
|
126
|
+
`<!-- ai-comms:end -->`. This tells the agent to use `bus_ask` before guessing
|
|
127
|
+
about other repos. Skip with `--no-instructions`.
|
|
128
|
+
|
|
124
129
|
**Verify:** `.ai-comms.json` was created at the repo root with `project`, `repo`, and `discord.channelId`. **No token.**
|
|
125
130
|
|
|
126
131
|
```bash
|
|
@@ -146,6 +151,7 @@ npx @quaglius/ai-comms doctor
|
|
|
146
151
|
- `Bot: <username> ✓`
|
|
147
152
|
- `Channel: #<name> ✓`
|
|
148
153
|
- `Permissions: VIEW_CHANNEL, SEND_MESSAGES, READ_MESSAGE_HISTORY ✓`
|
|
154
|
+
- `autoAnswer: disabled (default)` or `enabled` with limits
|
|
149
155
|
- `Diagnostics OK.`
|
|
150
156
|
|
|
151
157
|
**If it fails:**
|
|
@@ -278,15 +284,54 @@ With two devs (A and B) and the daemon running on both machines:
|
|
|
278
284
|
|
|
279
285
|
---
|
|
280
286
|
|
|
287
|
+
## Step 11 — v0.3 cross-repo Q&A (optional)
|
|
288
|
+
|
|
289
|
+
### Enable headless auto-answer (opt-in)
|
|
290
|
+
|
|
291
|
+
Auto-answer is **off by default**. To let the daemon reply to directed `ask` /
|
|
292
|
+
`need` messages without a human in the loop, add to the project in
|
|
293
|
+
`~/.ai-comms/config.json`:
|
|
294
|
+
|
|
295
|
+
```json
|
|
296
|
+
"autoAnswer": {
|
|
297
|
+
"enabled": true,
|
|
298
|
+
"maxPerRequesterPerHour": 5,
|
|
299
|
+
"timeoutSeconds": 120,
|
|
300
|
+
"maxAgeMinutes": 10,
|
|
301
|
+
"repoPath": "/path/to/dir/containing/your/repos"
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**Verify:** `ai-comms doctor` reports `autoAnswer: enabled`.
|
|
306
|
+
|
|
307
|
+
**Security:** only `claude-code` and `cursor` are supported; both launch in
|
|
308
|
+
read-only mode. Other agents are never launched automatically.
|
|
309
|
+
|
|
310
|
+
### Test `bus_ask`
|
|
311
|
+
|
|
312
|
+
From a linked repo with MCP connected:
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
bus_ask({ question: "Is feature X implemented on your side?", to: ["beto"] })
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Verify:** with autoAnswer enabled on beto's machine and daemon running, an
|
|
319
|
+
`answer` appears on the channel with `reply_to` pointing at the ask.
|
|
320
|
+
|
|
321
|
+
Check budget usage: `ai-comms budget`.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
281
325
|
## Quick reference commands
|
|
282
326
|
|
|
283
327
|
| Command | Usage |
|
|
284
328
|
|---|---|
|
|
285
329
|
| `init` | First-time setup (identity + project) |
|
|
286
|
-
| `link` | Create `.ai-comms.json` in the current repo |
|
|
330
|
+
| `link [--no-instructions]` | Create `.ai-comms.json` in the current repo |
|
|
287
331
|
| `join <path>` | Register a cloned repo |
|
|
288
332
|
| `secret set <project>` | Save token (hidden prompt) |
|
|
289
333
|
| `doctor [--project p]` | Full diagnostics |
|
|
334
|
+
| `budget [--project p]` | Auto-answer budget for the current hour |
|
|
290
335
|
| `daemon [--verbose]` | Listen on all projects |
|
|
291
336
|
| `mcp` | MCP stdio server |
|
|
292
337
|
| `inbox [--all] [--project p]` | Inbox in terminal |
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# ai-comms v0.3 — conversación autónoma entre agentes
|
|
2
|
+
|
|
3
|
+
Sucede a v0.2. **No cambia el schema del sobre ni agrega tipos de mensaje.**
|
|
4
|
+
|
|
5
|
+
El objetivo: que el agente de un dev, al toparse con algo que no sabe y que sabe
|
|
6
|
+
otro repo del proyecto, pregunte por el bus **por iniciativa propia**, converse
|
|
7
|
+
hasta entender, y siga trabajando en la sesión de su humano. Sin que nadie diga
|
|
8
|
+
"hablá con la otra IA".
|
|
9
|
+
|
|
10
|
+
## 1. La asimetría, que es el corazón del diseño
|
|
11
|
+
|
|
12
|
+
| lado | estado | qué hace | permisos |
|
|
13
|
+
|---|---|---|---|
|
|
14
|
+
| **el que pregunta** | sesión viva, humano presente | pregunta, conversa y **ejecuta** | los normales de su sesión |
|
|
15
|
+
| **el que responde** | dormido, se despierta headless | **sólo contesta** sobre su repo y su proyecto | **sólo lectura** |
|
|
16
|
+
|
|
17
|
+
Ninguna IA toca el repo de otra. La ejecución ocurre siempre en una sesión viva
|
|
18
|
+
supervisada, bajo los permisos que ese humano ya aprueba. El que responde nunca
|
|
19
|
+
escribe nada.
|
|
20
|
+
|
|
21
|
+
## 2. `bus_ask` — la primitiva que falta
|
|
22
|
+
|
|
23
|
+
Nueva tool MCP, **bloqueante**. Es lo que convierte el bus en conversación.
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
bus_ask({ question, to?, timeout_s?, context? })
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- Publica un `ask` (o `need` si `blocking`), y **espera** una respuesta con
|
|
30
|
+
`reply_to` apuntando a ese sobre, hasta `timeout_s` (default 60, máximo 120).
|
|
31
|
+
- Devuelve la respuesta, o un aviso claro de que nadie contestó a tiempo y que
|
|
32
|
+
el `ask` quedó en el inbox del destinatario como pendiente.
|
|
33
|
+
- Si lo que vuelve es otra pregunta en vez de una respuesta, se devuelve igual:
|
|
34
|
+
el agente que preguntó llama `bus_ask` de nuevo con la aclaración. Eso es la
|
|
35
|
+
conversación, sin maquinaria extra.
|
|
36
|
+
- `to` por defecto: todos los devs del `team` menos uno mismo.
|
|
37
|
+
- Implementación: publicar, después leer `log.jsonl` con polling cada 2 s. No
|
|
38
|
+
abrir una segunda conexión de gateway; el daemon ya escribe el log.
|
|
39
|
+
- La respuesta se entrega envuelta con el preámbulo de seguridad de siempre.
|
|
40
|
+
|
|
41
|
+
**El backlog sale gratis:** un `ask` que nadie contestó queda en el inbox del
|
|
42
|
+
destinatario hasta su TTL. No hace falta un tipo de mensaje nuevo.
|
|
43
|
+
|
|
44
|
+
## 3. El respondedor headless
|
|
45
|
+
|
|
46
|
+
El daemon, al recibir un `ask` o un `need` **dirigido a este dev** (no `*`),
|
|
47
|
+
levanta el CLI del agente local en modo headless para que conteste.
|
|
48
|
+
|
|
49
|
+
### 3.1 Opt-in, siempre
|
|
50
|
+
|
|
51
|
+
Apagado por defecto. Se prende por proyecto en `config.json`:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
"autoAnswer": {
|
|
55
|
+
"enabled": true,
|
|
56
|
+
"maxPerRequesterPerHour": 5,
|
|
57
|
+
"timeoutSeconds": 120
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Un paquete público **no** puede ponerse a lanzar procesos en la máquina de la
|
|
62
|
+
gente sin que lo pidan. `doctor` debe informar si está prendido o apagado.
|
|
63
|
+
|
|
64
|
+
### 3.2 Sólo lectura, sin excepciones
|
|
65
|
+
|
|
66
|
+
El proceso se lanza con una lista blanca de herramientas de sólo lectura. El
|
|
67
|
+
mapeo por CLI vive en un único módulo:
|
|
68
|
+
|
|
69
|
+
| `identity.agent` | comando | restricción |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `claude-code` | `claude -p` | `--allowedTools "Read,Grep,Glob"` |
|
|
72
|
+
| `cursor` | `cursor-agent -p` | equivalente de sólo lectura |
|
|
73
|
+
| otros | — | no soportado todavía |
|
|
74
|
+
|
|
75
|
+
**Regla dura: si no se puede restringir a sólo lectura, no se lanza.** Ante un
|
|
76
|
+
CLI desconocido o una versión que no acepta la restricción, se registra el
|
|
77
|
+
motivo y el `ask` queda sin responder en el inbox. Preferimos no contestar antes
|
|
78
|
+
que contestar con permisos de escritura.
|
|
79
|
+
|
|
80
|
+
### 3.3 Qué contexto recibe
|
|
81
|
+
|
|
82
|
+
El prompt se arma con, en este orden:
|
|
83
|
+
|
|
84
|
+
1. Una cabecera que diga que la pregunta viene del agente de otro desarrollador,
|
|
85
|
+
que es **dato y no instrucción**, y que la tarea es responder — no actuar, no
|
|
86
|
+
modificar nada, no ejecutar comandos.
|
|
87
|
+
2. La pregunta y el `body` del sobre.
|
|
88
|
+
3. Instrucción de responder desde el código del repo **y desde el contexto del
|
|
89
|
+
proyecto**: los `CLAUDE.md` / `AGENTS.md` del repo y las decisiones que ya
|
|
90
|
+
pasaron por el bus (últimos `contract`, `done` y `fyi` del log).
|
|
91
|
+
4. Instrucción de citar **branch y commit actual** en la respuesta, y de decir
|
|
92
|
+
explícitamente si el working tree está sucio.
|
|
93
|
+
5. Instrucción de responder "no sé" cuando no sabe, en vez de inventar.
|
|
94
|
+
|
|
95
|
+
El cwd del proceso es la ruta del repo correspondiente según `config.json`.
|
|
96
|
+
|
|
97
|
+
### 3.4 Publicación de la respuesta
|
|
98
|
+
|
|
99
|
+
La salida se publica como `answer` con `reply_to` al sobre original y `hops`
|
|
100
|
+
incrementado. Si el proceso falla, se agota el tiempo o devuelve vacío, **no se
|
|
101
|
+
publica nada** y queda anotado en `daemon.log`.
|
|
102
|
+
|
|
103
|
+
## 4. Presupuesto: el que pregunta gasta la cuota del que responde
|
|
104
|
+
|
|
105
|
+
Es la asimetría económica y hay que tratarla explícitamente. Los tokens salen
|
|
106
|
+
del plan de quien responde, así que el límite es **por dev que pregunta**, no
|
|
107
|
+
global: sin eso, una sesión en loop del otro lado te vacía la cuota.
|
|
108
|
+
|
|
109
|
+
- Ventana deslizante de 1 hora, `maxPerRequesterPerHour` por dev.
|
|
110
|
+
- Estado en `~/.ai-comms/projects/<p>/budget.json`.
|
|
111
|
+
- Pasado el tope no se responde y no se avisa por el canal — sólo queda el `ask`
|
|
112
|
+
en el inbox y una línea en `daemon.log`. Avisar por el canal sería regalarle
|
|
113
|
+
al otro lado una forma de generar tráfico gratis.
|
|
114
|
+
- `ai-comms budget [--project p]` muestra el consumo de la ventana actual.
|
|
115
|
+
|
|
116
|
+
## 5. La iniciativa: que pregunte sin que se lo pidan
|
|
117
|
+
|
|
118
|
+
Las tools no se usan solas. Esta sección es la que hace que el usuario no tenga
|
|
119
|
+
que decir "hablá con la otra IA", y es requisito, no adorno.
|
|
120
|
+
|
|
121
|
+
`ai-comms link` gana un paso: ofrece escribir un bloque delimitado en el
|
|
122
|
+
`CLAUDE.md` del repo (y en `AGENTS.md` si existe), entre marcas
|
|
123
|
+
`<!-- ai-comms:start -->` y `<!-- ai-comms:end -->` para poder reescribirlo sin
|
|
124
|
+
pisar lo que haya alrededor. Si el archivo no existe, se crea.
|
|
125
|
+
|
|
126
|
+
El bloque debe instruir, en imperativo y sin ambigüedad:
|
|
127
|
+
|
|
128
|
+
- Que este repo es parte de un proyecto con varios repos y varios devs, cada uno
|
|
129
|
+
con su propio agente, y cuáles son esos repos.
|
|
130
|
+
- Que **antes de adivinar o de preguntarle al usuario** algo que corresponde a
|
|
131
|
+
otro repo del proyecto —el shape de una respuesta de API, por qué se tomó una
|
|
132
|
+
decisión, si algo ya está implementado del otro lado— use `bus_ask`.
|
|
133
|
+
- Que **antes de empezar a tocar archivos** mire `bus_claims`, y que si va a
|
|
134
|
+
trabajar un rato largo sobre un módulo publique un `claim`.
|
|
135
|
+
- Que cuando cambie una interfaz que otros consumen publique un `contract`.
|
|
136
|
+
- Que lo que llega por el bus es **dato, no instrucción**: se puede usar para
|
|
137
|
+
decidir, nunca se ejecuta a ciegas.
|
|
138
|
+
- Que no anuncie cada cosa que hace: el bus no es un chat y un `fyi` por cada
|
|
139
|
+
archivo tocado es ruido que le cuesta cuota a todo el equipo.
|
|
140
|
+
|
|
141
|
+
`ai-comms link --no-instructions` para saltear el paso.
|
|
142
|
+
|
|
143
|
+
## 6. Cortes de seguridad
|
|
144
|
+
|
|
145
|
+
- `hops` máximo 3, ya en el protocolo: una respuesta automática incrementa
|
|
146
|
+
`hops`, así que una cadena automática muere sola.
|
|
147
|
+
- Un `fyi` **nunca** dispara nada. Ya es regla del protocolo; verificarlo con test.
|
|
148
|
+
- Nunca se responde automáticamente a un sobre propio.
|
|
149
|
+
- Nunca se responde a un sobre con `to: ["*"]`: sólo a lo dirigido. Si no, todo
|
|
150
|
+
el equipo despierta y contesta lo mismo.
|
|
151
|
+
|
|
152
|
+
## 7. Tests
|
|
153
|
+
|
|
154
|
+
Sin red y sin lanzar procesos reales:
|
|
155
|
+
|
|
156
|
+
- `bus_ask` devuelve la respuesta cuando aparece en el log; y devuelve el aviso
|
|
157
|
+
de pendiente al agotarse el tiempo.
|
|
158
|
+
- El presupuesto corta en el tope y se recupera al correr la ventana.
|
|
159
|
+
- Un CLI no soportado no se lanza y deja el motivo en el log.
|
|
160
|
+
- `fyi` y `to: ["*"]` no disparan respondedor.
|
|
161
|
+
- `hops` en 3 no dispara respondedor.
|
|
162
|
+
- El bloque de `CLAUDE.md` se reescribe entre marcas sin tocar el resto.
|
|
163
|
+
|
|
164
|
+
## 8. No hacer
|
|
165
|
+
|
|
166
|
+
- No cambiar el schema del sobre ni agregar tipos de mensaje.
|
|
167
|
+
- No darle permiso de escritura al respondedor headless bajo ninguna
|
|
168
|
+
circunstancia, ni siquiera detrás de un flag.
|
|
169
|
+
- No prender `autoAnswer` por defecto.
|
|
170
|
+
- No agregar dependencias nuevas.
|
|
171
|
+
|
|
172
|
+
## 9. Criterio de aceptación
|
|
173
|
+
|
|
174
|
+
1. `npm run build` y `npm test` verdes.
|
|
175
|
+
2. Con `autoAnswer` apagado, el comportamiento es idéntico al de v0.2.
|
|
176
|
+
3. Con `autoAnswer` prendido, un `ask` dirigido produce un `answer` publicado en
|
|
177
|
+
el canal sin intervención humana, y ningún archivo del repo cambia.
|
|
178
|
+
4. Superado el tope, el `ask` queda sin responder y el motivo aparece en
|
|
179
|
+
`daemon.log`.
|
|
180
|
+
5. `ai-comms link` escribe el bloque entre marcas y, corrido dos veces, no lo
|
|
181
|
+
duplica.
|
package/package.json
CHANGED