1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# Managed by IssueSpec. Hand edits are welcome; keep the schema valid.
id: 5
title: "Définir l'architecture et le modèle de données"
state: closed
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
labels:
- "kind::chore"
- "documentation"
- "priority::high"
- "size::M"
milestone: "Initialize"
epic: "Specifications"
related:
- 2
- 3
- 4
body: |
## Contexte
Une fois ACP ([#2 — Spike : maîtriser le protocole ACP et le valider avec mm](.tickets/issues/0002-spike-maitriser-le-protocole-acp-et-le-valider-a.yaml)) et la stack ([#3 — Spike : choisir la stack Wails et frontend](.tickets/issues/0003-spike-choisir-la-stack-wails-et-frontend.yaml)) compris, il faut fixer le découpage du code avant d'écrire la première ligne de prod.
## Pourquoi
- Plusieurs features se recouvrent (un agent est partagé entre plusieurs channels, une même session ACP alimente le chat et le panel Agents) : sans modèle clair on obtient du couplage frontend ↔ processus agents.
- La persistance Pebble est « si besoin » dans le draft : cette issue doit **décider où elle est nécessaire** (channels, historique, mapping channel ↔ session ACP) et où elle ne l'est pas (la config reste en YAML, source de vérité éditable).
## Proposition de découpage Go
```
cmd/sidekicks/ point d'entrée Wails
internal/config/ chargement / validation / watch du YAML
internal/acp/ client JSON-RPC ACP (transport stdio)
internal/agents/ cycle de vie des processus agents
internal/channels/ channels, membres, routage des messages
internal/store/ Pebble (messages, sessions)
internal/workspace/ fichiers + exec (local, sbx, container)
frontend/ UI
```
Règle : le frontend ne parle **qu'aux services Wails** ; il ne connaît pas ACP.
## Modèle de données (première version)
- `Agent` (vient de la config) — `Channel` — `Membership(channel, agent, acpSessionId)` — `Message(channel, author: user|agent, parts[], createdAt)`.
## Critères d'acceptation
- [ ] ADR architecture rédigé, avec un schéma (draw.io).
- [ ] Modèle de données et clés Pebble définis.
- [ ] Liste des événements backend → frontend (cf. [#13 — Pont d'événements entre Go et le frontend](.tickets/issues/0013-pont-d-evenements-entre-go-et-le-frontend.yaml)).
tasks:
- id: 1
title: "Découpage en packages et responsabilités"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 2
title: "Modèle de données et schéma de clés Pebble"
state: closed
priority: high
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 3
title: "Décider : 1 session ACP par (channel, agent)"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 4
title: "Catalogue des événements Wails backend → frontend"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
- id: 5
title: "Schéma d'architecture"
state: closed
priority: medium
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T07:20:03.000Z
updatedAt: 2026-10-29T08:51:00.000Z
closedAt: 2026-10-29T08:51:00.000Z
comments:
- id: 1
author:
name: k33g
email: ph.charriere@gmail.com
createdAt: 2026-10-29T08:51:00.000Z
body: |
## Résultat
[ADR 0003 — architecture](docs/adr/0003-architecture.md) et schéma [docs/diagrams/packages.drawio](docs/diagrams/packages.drawio) (+ SVG/PNG).
- Packages : `cmd/sidekicks`, `internal/app` (seule API vue par l'UI), `channels`, `agents`, `acp`, `config`, `store`, `workspace`, `schema`.
- YAML = ce qui existe ; Pebble v2 = ce qui se passe (une base par fichier de config) ; les channels n'ont qu'une maison : Pebble.
- Modèle de données (ULID), clés Pebble, catalogue de 12 événements, flux d'un message.
- Un message est écrit à la fin du tour, pas à chaque chunk.
|