@dev-kosaly/kagents 0.1.1 → 0.2.1
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 +22 -3
- package/agents/architect.md +22 -9
- package/bin/kagents.js +179 -14
- package/bin/postinstall.js +26 -0
- package/commands/architect-status.md +1 -1
- package/docs/architect-commands.md +1 -1
- package/package.json +2 -1
- package/rules/domains/architect-chat.md +154 -36
- package/skills/architect-decision/SKILL.md +1 -1
- package/skills/architect-impact/SKILL.md +4 -4
- package/skills/architect-status/SKILL.md +3 -3
- package/templates/architect-decision/template.md +1 -1
- package/templates/architect-design/template.md +1 -1
- package/templates/architect-output/template.md +4 -8
- package/templates/architect-spec/template.md +1 -1
- package/workflows/architect-impact.md +2 -2
- package/workflows/architect-spec.md +1 -1
package/README.md
CHANGED
|
@@ -50,16 +50,35 @@ Prérequis : Node 18 ou plus. Depuis la racine du projet :
|
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
52
|
npx @dev-kosaly/kagents # ou : pnpm dlx @dev-kosaly/kagents
|
|
53
|
-
npx @dev-kosaly/kagents --tools claude,cursor,agents
|
|
53
|
+
npx @dev-kosaly/kagents --tools claude,cursor,agents # sans question
|
|
54
|
+
npx @dev-kosaly/kagents --tools all # tous les outils, sans question
|
|
55
|
+
npx @dev-kosaly/kagents --configure # rechoisir les outils
|
|
54
56
|
npx @dev-kosaly/kagents --copy # copies au lieu de liens (utile sous Windows)
|
|
55
57
|
npx @dev-kosaly/kagents uninstall
|
|
56
58
|
```
|
|
57
59
|
|
|
58
|
-
|
|
60
|
+
Ajouter le paquet comme dépendance (`npm add @dev-kosaly/kagents` ou `pnpm add @dev-kosaly/kagents`) lance aussi l'installation automatiquement. Avec **pnpm**, les scripts des dépendances sont bloqués tant qu'ils ne sont pas approuvés : lancez `pnpm approve-builds` une fois (ou `pnpm exec kagents` à la main). `KAGENTS_SKIP_POSTINSTALL=1` désactive l'installation automatique.
|
|
61
|
+
|
|
62
|
+
Dans un terminal, l'installation pose la question :
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
? Pour quels outils installer KAgents ?
|
|
66
|
+
❯ ◯ Tous les outils
|
|
67
|
+
────────
|
|
68
|
+
◉ Claude Code (.claude/commands, .claude/agents)
|
|
69
|
+
◯ Cursor (.cursor/commands, .cursor/agents, .cursor/rules)
|
|
70
|
+
◉ Codex et autres outils AGENTS.md (.agents/skills)
|
|
71
|
+
↑↓ naviguer · espace cocher · a tout (dé)sélectionner · entrée valider
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
« Tous les outils » coche ou décoche l'ensemble des outils d'un coup ; la touche `a` fait la même chose depuis n'importe quelle ligne.
|
|
75
|
+
|
|
76
|
+
Le choix est mémorisé dans `.kagents/config.json` et rejoué aux mises à jour. Sans terminal (CI) ou avec `--yes`, les outils sont détectés automatiquement (`.claude/`, `.cursor/`) et `.agents/skills/` est ajouté.
|
|
59
77
|
|
|
60
78
|
Ce que fait l'installation :
|
|
61
|
-
- Le kit est copié dans `.kagents/`. `.claude
|
|
79
|
+
- Le kit est copié dans `.kagents/`. `.claude/` et `.cursor/` reçoivent des liens relatifs vers les commandes et les agents (les skills restent dans `.kagents/skills/` pour ne pas polluer le menu `/`) ; `.agents/skills/` expose les skills aux outils qui le lisent.
|
|
62
80
|
- Le bloc `<!-- kagents:start/end -->` de `AGENTS.md` est régénéré (mode d'emploi, agents, routage). Le reste du fichier n'est jamais modifié.
|
|
81
|
+
- `.gitignore` reçoit un bloc `# kagents:start/end` qui ignore le kit dans `.kagents/` mais pas `.kagents/docs/` (livrables et contexte, à versionner).
|
|
63
82
|
- Un fichier existant qui n'est pas géré par KAgents n'est jamais écrasé.
|
|
64
83
|
|
|
65
84
|
**Mise à jour** : relancer avec `@latest`. Les fichiers du kit dans `.kagents/` sont régénérés (ne pas les éditer). `.kagents/docs/`, qui contient les livrables des agents et `knowledge/context.md`, n'est jamais touché.
|
package/agents/architect.md
CHANGED
|
@@ -10,7 +10,7 @@ Role **IDE-agnostique**. Cursor et autres IDE : `adapters/` uniquement.
|
|
|
10
10
|
|
|
11
11
|
## Mission
|
|
12
12
|
|
|
13
|
-
Comprehension architecturale et **preparation des changements** : repository inconnu ou existant, impact d'une evolution,
|
|
13
|
+
Comprehension architecturale et **preparation des changements** : repository inconnu ou existant, impact d'une evolution, **relais** documentaires (voir ci-dessous), livrable persistant pour la suite du pipeline **sans relire la conversation**.
|
|
14
14
|
|
|
15
15
|
## Commandes publiques (racine `kagents architect`)
|
|
16
16
|
|
|
@@ -82,11 +82,18 @@ Un seul niveau principal ; justifier ; condition d'escalade si besoin.
|
|
|
82
82
|
|
|
83
83
|
Le livrable `outputs/*.md` est la **memoire Architect** principale. Un Change Brief (`templates/change-brief/`) reste optionnel pour processus projet legacy ; l'Architect ne le remplace pas automatiquement sauf demande explicite.
|
|
84
84
|
|
|
85
|
-
## Analyse
|
|
85
|
+
## Analyse d'impact (mode Impact) — structure adaptative
|
|
86
86
|
|
|
87
|
-
Modele / Controleur / Vue
|
|
87
|
+
**Aucune grille imposee.** MVC (Modele / Controleur / Vue) n'est qu'une grille possible parmi d'autres, a utiliser **seulement** si l'architecture du projet est reellement MVC et si elle clarifie le propos.
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
Choisir les axes d'apres la nature du projet et de la demande, par exemple : couches du projet (API, services, UI, jobs), modules ou domaines metier, flux de donnees, parcours utilisateur, donnees et schema, securite et droits, integrations externes, performance et cout, exploitation, tests, migration.
|
|
90
|
+
|
|
91
|
+
Principes :
|
|
92
|
+
|
|
93
|
+
- Ne presenter que les zones **reellement touchees** ; ne pas lister les zones non concernees (au plus une phrase : « le reste n'est pas touche »).
|
|
94
|
+
- Nommer les zones avec le vocabulaire **du projet** (ses modules, ses ecrans, ses services), pas avec des categories generiques.
|
|
95
|
+
- Pour chaque zone : ce qui change, pourquoi ca compte, ampleur (faible / moyenne / forte).
|
|
96
|
+
- Choisir le format qui rend l'impact le plus lisible : phrases, liste, tableau, schema de flux ou de dependances. Voir `rules/domains/architect-chat.md`.
|
|
90
97
|
|
|
91
98
|
## Questions
|
|
92
99
|
|
|
@@ -94,7 +101,7 @@ Max **5** questions **bloquantes** par cycle ; concretes, ordonnees, justifiees.
|
|
|
94
101
|
|
|
95
102
|
## Sortie chat
|
|
96
103
|
|
|
97
|
-
Contrat
|
|
104
|
+
Contrat obligatoire pour toute reponse visible : `rules/domains/architect-chat.md` (comprehension, filtre lecteur, chat distinct du livrable). Ne pas s'appuyer sur les gabarits de `commands/` pour le texte affiche a l'utilisateur.
|
|
98
105
|
|
|
99
106
|
## Livrable persistant
|
|
100
107
|
|
|
@@ -103,11 +110,17 @@ Contrat adaptatif : `rules/domains/architect-chat.md`. Riche et lisible, **sans*
|
|
|
103
110
|
- Template : `templates/architect-output/template.md`
|
|
104
111
|
- Registre : `INDEX.md` via skill `architect-index`
|
|
105
112
|
|
|
106
|
-
##
|
|
113
|
+
## Relais (passage a l'etape suivante)
|
|
114
|
+
|
|
115
|
+
**Relais** = ce que l'Architect laisse **ecrit dans le livrable** pour que la suite puisse agir sans relire le chat : validation humaine, agent **Base** (donnees), ou implementation future. Ce n'est pas un statut ni une commande ; c'est une section de document (titre `## Relais` dans les templates).
|
|
116
|
+
|
|
117
|
+
### Relais vers Base (Database Expert)
|
|
118
|
+
|
|
119
|
+
Contexte, besoin, elements concernes, impact suppose, questions, inconnues, contraintes, decisions deja validees — **sans** fausse decision BDD. Base ecrit dans `base-docs/` uniquement. (Le template output peut aussi avoir une section dediee « Impact Base » ; les deux se completent.)
|
|
107
120
|
|
|
108
|
-
|
|
121
|
+
### Relais implementation (mention seule)
|
|
109
122
|
|
|
110
|
-
|
|
123
|
+
Perimetre implementation **apres** validations ; ne pas definir le role Developer ici.
|
|
111
124
|
|
|
112
125
|
## Separation des responsabilites
|
|
113
126
|
|
|
@@ -116,7 +129,7 @@ Handoff Developer : perimetre implementation **apres** validations ; ne pas defi
|
|
|
116
129
|
| `agents/architect.md` | Qui, limites, modes, principes |
|
|
117
130
|
| `rules/domains/architect-invariants.md` | Invariants non negociables |
|
|
118
131
|
| `rules/domains/architect-chat.md` | Contrat de sortie conversationnelle |
|
|
119
|
-
| `skills/architect-*` | Procedures |
|
|
132
|
+
| `skills/architect-*` | Procedures (installées dans `.kagents/skills/<nom>/SKILL.md` : les charger par ce chemin) |
|
|
120
133
|
| `workflows/architect-*.md` | Enchainement |
|
|
121
134
|
| `templates/architect-output/` | Structure livrable |
|
|
122
135
|
| `commands/architect*.md` | Entrees explicites |
|
package/bin/kagents.js
CHANGED
|
@@ -5,25 +5,29 @@
|
|
|
5
5
|
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const path = require('path');
|
|
8
|
+
const readline = require('readline');
|
|
9
|
+
const tty = require('tty');
|
|
8
10
|
|
|
9
11
|
const PKG_ROOT = path.resolve(__dirname, '..');
|
|
10
12
|
const PKG = JSON.parse(fs.readFileSync(path.join(PKG_ROOT, 'package.json'), 'utf8'));
|
|
11
13
|
const KIT_DIRS = ['agents', 'skills', 'commands', 'rules', 'templates', 'checklists', 'workflows', 'governance', 'docs'];
|
|
12
14
|
const SKIP = new Set(['README.md', '.gitkeep']);
|
|
13
15
|
const BLOCK_RE = /<!-- kagents:start -->[\s\S]*?<!-- kagents:end -->/;
|
|
16
|
+
const GITIGNORE_RE = /# kagents:start\n[\s\S]*?# kagents:end\n?/;
|
|
17
|
+
// On ignore le kit (régénérable) mais pas docs/ : livrables et contexte sont à versionner.
|
|
14
18
|
|
|
15
19
|
// Adaptateurs : un outil = une liste [dossier du kit, destination, type].
|
|
16
20
|
// type : files (fichiers), dirs (dossiers), agents (fichiers .md avec `name:`).
|
|
21
|
+
// Les skills ne sont volontairement PAS liées dans .claude/ ni .cursor/ : ces outils les listeraient
|
|
22
|
+
// comme commandes `/`. Les agents et commandes les chargent par chemin depuis .kagents/skills/.
|
|
17
23
|
const ADAPTERS = {
|
|
18
24
|
agents: [['skills', '.agents/skills', 'dirs']],
|
|
19
25
|
claude: [
|
|
20
26
|
['commands', '.claude/commands', 'files'],
|
|
21
|
-
['skills', '.claude/skills', 'dirs'],
|
|
22
27
|
['agents', '.claude/agents', 'agents'],
|
|
23
28
|
],
|
|
24
29
|
cursor: [
|
|
25
30
|
['commands', '.cursor/commands', 'files'],
|
|
26
|
-
['skills', '.cursor/skills', 'dirs'],
|
|
27
31
|
['agents', '.cursor/agents', 'agents'],
|
|
28
32
|
['rules/global', '.cursor/rules', 'files'],
|
|
29
33
|
['rules/domains', '.cursor/rules', 'files'],
|
|
@@ -32,14 +36,18 @@ const ADAPTERS = {
|
|
|
32
36
|
|
|
33
37
|
const HELP = `kagents ${PKG.version}
|
|
34
38
|
|
|
35
|
-
Usage : kagents [install] [--tools claude,cursor,agents|auto] [--copy]
|
|
39
|
+
Usage : kagents [install] [--tools claude,cursor,agents|all|auto|none] [--yes] [--copy]
|
|
40
|
+
kagents --configure (rechoisir les outils)
|
|
36
41
|
kagents uninstall
|
|
37
42
|
kagents --help | --version
|
|
38
43
|
|
|
39
|
-
À lancer depuis la racine du projet.
|
|
40
|
-
|
|
41
|
-
--
|
|
42
|
-
|
|
44
|
+
À lancer depuis la racine du projet. Dans un terminal, une liste permet de choisir
|
|
45
|
+
les outils à brancher ; le choix est mémorisé dans .kagents/config.json.
|
|
46
|
+
--tools outils à brancher, sans question (all = tous les outils)
|
|
47
|
+
--yes, -y ne pose pas de question (détection automatique)
|
|
48
|
+
--configure pose à nouveau la question
|
|
49
|
+
--copy copies au lieu de liens symboliques (aussi KAGENTS_MODE=copy)
|
|
50
|
+
uninstall retire ce que KAgents a installé (docs/ est conservé)
|
|
43
51
|
`;
|
|
44
52
|
|
|
45
53
|
const log = (m) => console.log(`kagents: ${m}`);
|
|
@@ -51,12 +59,14 @@ const die = (m) => {
|
|
|
51
59
|
|
|
52
60
|
// --- Arguments ----------------------------------------------------------------
|
|
53
61
|
function parseArgs(argv) {
|
|
54
|
-
const o = { cmd: 'install', tools:
|
|
62
|
+
const o = { cmd: 'install', tools: null, yes: false, configure: false, copy: process.env.KAGENTS_MODE === 'copy' };
|
|
55
63
|
for (let i = 0; i < argv.length; i++) {
|
|
56
64
|
const a = argv[i];
|
|
57
65
|
if (a === '-h' || a === '--help') o.cmd = 'help';
|
|
58
66
|
else if (a === '-v' || a === '--version') o.cmd = 'version';
|
|
59
67
|
else if (a === '--copy') o.copy = true;
|
|
68
|
+
else if (a === '-y' || a === '--yes') o.yes = true;
|
|
69
|
+
else if (a === '--configure') o.configure = true;
|
|
60
70
|
else if (a === '--tools') o.tools = argv[++i] || die('--tools attend une valeur');
|
|
61
71
|
else if (a.startsWith('--tools=')) o.tools = a.slice(8);
|
|
62
72
|
else if (a === 'install' || a === 'uninstall') o.cmd = a;
|
|
@@ -102,6 +112,7 @@ class Installer {
|
|
|
102
112
|
this.copy = copy;
|
|
103
113
|
this.kagents = path.join(target, '.kagents');
|
|
104
114
|
this.manifest = path.join(this.kagents, '.installed');
|
|
115
|
+
this.config = path.join(this.kagents, 'config.json');
|
|
105
116
|
this.entries = [];
|
|
106
117
|
}
|
|
107
118
|
|
|
@@ -266,15 +277,49 @@ Document partagé, écrit par l'utilisateur. Les agents le lisent, ne l'écriven
|
|
|
266
277
|
fs.writeFileSync(file, out);
|
|
267
278
|
}
|
|
268
279
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
const
|
|
280
|
+
// Bloc .gitignore : le kit et les liens que l'on a posés, jamais docs/ (sauf les fichiers du kit qui s'y trouvent).
|
|
281
|
+
gitignoreBlock() {
|
|
282
|
+
const extra = this.entries.filter((e) => !e.startsWith('.kagents/') || e.startsWith('.kagents/docs/')).sort();
|
|
283
|
+
return ['# kagents:start', '.kagents/*', '!.kagents/docs/', ...extra, '# kagents:end'].join('\n') + '\n';
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
writeGitignore() {
|
|
287
|
+
const file = path.join(this.target, '.gitignore');
|
|
288
|
+
if (!fs.existsSync(file) && !fs.existsSync(path.join(this.target, '.git'))) return;
|
|
289
|
+
const cur = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : '';
|
|
290
|
+
const block = this.gitignoreBlock();
|
|
291
|
+
const out = GITIGNORE_RE.test(cur)
|
|
292
|
+
? cur.replace(GITIGNORE_RE, () => block)
|
|
293
|
+
: (cur && !cur.endsWith('\n') ? cur + '\n' : cur) + (cur ? '\n' : '') + block;
|
|
294
|
+
fs.writeFileSync(file, out);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
detectTools() {
|
|
272
298
|
const has = (p) => fs.existsSync(path.join(this.target, p));
|
|
299
|
+
const t = [];
|
|
273
300
|
if (has('.claude') || has('CLAUDE.md')) t.push('claude');
|
|
274
301
|
if (has('.cursor')) t.push('cursor');
|
|
275
302
|
return t;
|
|
276
303
|
}
|
|
277
304
|
|
|
305
|
+
resolveTools(tools) {
|
|
306
|
+
return tools === 'auto' ? ['agents', ...this.detectTools()] : tools;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
loadConfig() {
|
|
310
|
+
try {
|
|
311
|
+
const c = JSON.parse(fs.readFileSync(this.config, 'utf8'));
|
|
312
|
+
return Array.isArray(c.tools) ? c.tools : null;
|
|
313
|
+
} catch {
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
saveConfig(tools) {
|
|
319
|
+
fs.mkdirSync(this.kagents, { recursive: true });
|
|
320
|
+
fs.writeFileSync(this.config, JSON.stringify({ tools }, null, 2) + '\n');
|
|
321
|
+
}
|
|
322
|
+
|
|
278
323
|
runAdapters(tools) {
|
|
279
324
|
for (const tool of this.resolveTools(tools)) {
|
|
280
325
|
if (!ADAPTERS[tool]) {
|
|
@@ -326,6 +371,7 @@ Document partagé, écrit par l'utilisateur. Les agents le lisent, ne l'écriven
|
|
|
326
371
|
this.createDocs();
|
|
327
372
|
this.writeAgentsMd();
|
|
328
373
|
this.runAdapters(tools);
|
|
374
|
+
this.writeGitignore();
|
|
329
375
|
this.saveManifest();
|
|
330
376
|
log(`installé dans ${this.kagents} (${this.copy ? 'copies' : 'liens'})`);
|
|
331
377
|
}
|
|
@@ -341,22 +387,141 @@ Document partagé, écrit par l'utilisateur. Les agents le lisent, ne l'écriven
|
|
|
341
387
|
else fs.rmSync(file);
|
|
342
388
|
}
|
|
343
389
|
}
|
|
390
|
+
const gi = path.join(this.target, '.gitignore');
|
|
391
|
+
if (fs.existsSync(gi) && GITIGNORE_RE.test(fs.readFileSync(gi, 'utf8'))) {
|
|
392
|
+
const out = fs.readFileSync(gi, 'utf8').replace(GITIGNORE_RE, '').replace(/\n{3,}/g, '\n\n').replace(/\s+$/, '');
|
|
393
|
+
if (out) fs.writeFileSync(gi, out + '\n');
|
|
394
|
+
else fs.rmSync(gi);
|
|
395
|
+
}
|
|
344
396
|
fs.rmSync(this.manifest, { force: true });
|
|
397
|
+
fs.rmSync(this.config, { force: true });
|
|
345
398
|
this.prune(removed);
|
|
346
399
|
log('désinstallé (.kagents/docs/ conservé : ce sont vos livrables)');
|
|
347
400
|
}
|
|
348
401
|
}
|
|
349
402
|
|
|
403
|
+
// --- Question interactive -----------------------------------------------------
|
|
404
|
+
// Terminal utilisable : le nôtre, ou /dev/tty quand on est lancé par un postinstall (stdin/stdout détournés).
|
|
405
|
+
function openTTY() {
|
|
406
|
+
if (process.stdin.isTTY && process.stdout.isTTY) return { input: process.stdin, output: process.stdout, close() {} };
|
|
407
|
+
if (process.env.KAGENTS_FROM_POSTINSTALL && process.platform !== 'win32') {
|
|
408
|
+
try {
|
|
409
|
+
const rfd = fs.openSync('/dev/tty', 'r');
|
|
410
|
+
const wfd = fs.openSync('/dev/tty', 'w');
|
|
411
|
+
const input = new tty.ReadStream(rfd);
|
|
412
|
+
const output = new tty.WriteStream(wfd);
|
|
413
|
+
return { input, output, close: () => { input.destroy(); output.destroy(); } };
|
|
414
|
+
} catch {
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Liste à cocher : ↑↓ déplacer, espace cocher, a tout, entrée valider. Renvoie les ids cochés.
|
|
422
|
+
// Un item `master` (« Tous les outils ») reflète l'état des autres et les coche/décoche d'un coup ;
|
|
423
|
+
// il n'est jamais renvoyé.
|
|
424
|
+
function multiselect(io, message, items) {
|
|
425
|
+
return new Promise((resolve) => {
|
|
426
|
+
const { input, output } = io;
|
|
427
|
+
const state = items.map((i) => ({ ...i }));
|
|
428
|
+
const others = state.filter((i) => !i.master);
|
|
429
|
+
const hasMaster = state.some((i) => i.master);
|
|
430
|
+
const total = state.length + (hasMaster ? 1 : 0) + 2; // + séparateur + ligne d'aide + question
|
|
431
|
+
let cur = 0;
|
|
432
|
+
let drawn = false;
|
|
433
|
+
const toggleAll = () => {
|
|
434
|
+
const all = others.every((i) => i.checked);
|
|
435
|
+
others.forEach((i) => (i.checked = !all));
|
|
436
|
+
};
|
|
437
|
+
const sync = () => state.forEach((i) => i.master && (i.checked = others.every((o) => o.checked)));
|
|
438
|
+
const draw = () => {
|
|
439
|
+
if (drawn) output.write(`\x1b[${total - 1}A`);
|
|
440
|
+
drawn = true;
|
|
441
|
+
output.write(`\x1b[2K\x1b[1m?\x1b[0m ${message}\n`);
|
|
442
|
+
state.forEach((it, i) => {
|
|
443
|
+
const box = it.checked ? '\x1b[32m◉\x1b[0m' : '◯';
|
|
444
|
+
output.write(`\x1b[2K ${i === cur ? '\x1b[36m❯\x1b[0m' : ' '} ${box} ${it.label}\n`);
|
|
445
|
+
if (it.master) output.write('\x1b[2K \x1b[2m────────\x1b[0m\n');
|
|
446
|
+
});
|
|
447
|
+
output.write('\x1b[2K\x1b[2m ↑↓ naviguer · espace cocher · a tout (dé)sélectionner · entrée valider\x1b[0m\n');
|
|
448
|
+
};
|
|
449
|
+
const finish = () => {
|
|
450
|
+
input.removeListener('keypress', onKey);
|
|
451
|
+
input.setRawMode(false);
|
|
452
|
+
input.pause();
|
|
453
|
+
output.write('\x1b[?25h');
|
|
454
|
+
io.close();
|
|
455
|
+
resolve(others.filter((i) => i.checked).map((i) => i.id));
|
|
456
|
+
};
|
|
457
|
+
const onKey = (str, key = {}) => {
|
|
458
|
+
if (key.ctrl && key.name === 'c') {
|
|
459
|
+
output.write('\x1b[?25h\n');
|
|
460
|
+
process.exit(130);
|
|
461
|
+
}
|
|
462
|
+
if (key.name === 'up') cur = (cur + state.length - 1) % state.length;
|
|
463
|
+
else if (key.name === 'down') cur = (cur + 1) % state.length;
|
|
464
|
+
else if (key.name === 'space') {
|
|
465
|
+
if (state[cur].master) toggleAll();
|
|
466
|
+
else state[cur].checked = !state[cur].checked;
|
|
467
|
+
} else if (key.name === 'a') toggleAll();
|
|
468
|
+
else if (key.name === 'return') {
|
|
469
|
+
sync();
|
|
470
|
+
draw();
|
|
471
|
+
return finish();
|
|
472
|
+
}
|
|
473
|
+
sync();
|
|
474
|
+
draw();
|
|
475
|
+
};
|
|
476
|
+
sync();
|
|
477
|
+
readline.emitKeypressEvents(input);
|
|
478
|
+
input.setRawMode(true);
|
|
479
|
+
input.resume();
|
|
480
|
+
output.write('\x1b[?25l');
|
|
481
|
+
input.on('keypress', onKey);
|
|
482
|
+
draw();
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
async function chooseTools(inst, o) {
|
|
487
|
+
if (o.tools) {
|
|
488
|
+
const t = o.tools === 'auto' ? 'auto' : o.tools === 'none' ? [] : o.tools === 'all' ? Object.keys(ADAPTERS) : o.tools.split(',').filter(Boolean);
|
|
489
|
+
if (t !== 'auto') inst.chosen = t;
|
|
490
|
+
return t;
|
|
491
|
+
}
|
|
492
|
+
if (!o.configure) {
|
|
493
|
+
const saved = inst.loadConfig();
|
|
494
|
+
if (saved) return saved;
|
|
495
|
+
}
|
|
496
|
+
if (!o.yes && !process.env.KAGENTS_NO_PROMPT && !process.env.CI) {
|
|
497
|
+
const io = openTTY();
|
|
498
|
+
if (io) {
|
|
499
|
+
const detected = inst.detectTools();
|
|
500
|
+
const picked = await multiselect(io, 'Pour quels outils installer KAgents ?', [
|
|
501
|
+
{ id: 'all', master: true, label: 'Tous les outils' },
|
|
502
|
+
{ id: 'claude', label: 'Claude Code (.claude/commands, .claude/agents)', checked: detected.includes('claude') },
|
|
503
|
+
{ id: 'cursor', label: 'Cursor (.cursor/commands, .cursor/agents, .cursor/rules)', checked: detected.includes('cursor') },
|
|
504
|
+
{ id: 'agents', label: 'Codex et autres outils AGENTS.md (.agents/skills)', checked: true },
|
|
505
|
+
]);
|
|
506
|
+
inst.chosen = picked;
|
|
507
|
+
return picked;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return 'auto';
|
|
511
|
+
}
|
|
512
|
+
|
|
350
513
|
// --- Main ---------------------------------------------------------------------
|
|
351
|
-
function main() {
|
|
514
|
+
async function main() {
|
|
352
515
|
const o = parseArgs(process.argv.slice(2));
|
|
353
516
|
if (o.cmd === 'help') return console.log(HELP);
|
|
354
517
|
if (o.cmd === 'version') return console.log(PKG.version);
|
|
355
518
|
const target = process.cwd();
|
|
356
519
|
if (path.resolve(target) === PKG_ROOT) die("à lancer depuis la racine d'un projet, pas depuis le kit.");
|
|
357
520
|
const inst = new Installer(target, o.copy);
|
|
358
|
-
if (o.cmd === 'uninstall') inst.uninstall();
|
|
359
|
-
|
|
521
|
+
if (o.cmd === 'uninstall') return inst.uninstall();
|
|
522
|
+
const tools = await chooseTools(inst, o);
|
|
523
|
+
inst.install(tools);
|
|
524
|
+
if (inst.chosen) inst.saveConfig(inst.chosen);
|
|
360
525
|
}
|
|
361
526
|
|
|
362
527
|
main();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
// Lancé par npm/pnpm après `add @dev-kosaly/kagents` : installe le kit dans le projet.
|
|
4
|
+
// Ne doit jamais faire échouer l'installation des dépendances.
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const { spawnSync } = require('child_process');
|
|
7
|
+
|
|
8
|
+
const pkgRoot = path.resolve(__dirname, '..');
|
|
9
|
+
const project = process.env.INIT_CWD;
|
|
10
|
+
|
|
11
|
+
const skip = (why) => {
|
|
12
|
+
if (why) console.log(`kagents: installation automatique ignorée (${why}). Lancez : npx kagents`);
|
|
13
|
+
process.exit(0);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
if (process.env.KAGENTS_SKIP_POSTINSTALL) skip();
|
|
17
|
+
if (!project) skip();
|
|
18
|
+
if (process.env.npm_config_global === 'true') skip('installation globale');
|
|
19
|
+
if (!pkgRoot.split(path.sep).includes('node_modules')) skip(); // développement du kit lui-même
|
|
20
|
+
if (path.resolve(project) === pkgRoot) skip();
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
spawnSync(process.execPath, [path.join(__dirname, 'kagents.js')], { cwd: project, stdio: 'inherit', env: { ...process.env, KAGENTS_FROM_POSTINSTALL: '1' } });
|
|
24
|
+
} catch {
|
|
25
|
+
/* jamais bloquant */
|
|
26
|
+
}
|
|
@@ -21,6 +21,6 @@ Sortie chat type :
|
|
|
21
21
|
**Derniere activite :** ...
|
|
22
22
|
**Travaux ouverts / Decisions en attente / Blocages** (si presents)
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Lecture documentaire (pas affichage chat) : travaux en cours, decisions, relais en attente, points d'attention, derniers livrables. Voir `architect-chat.md` pour la sortie utilisateur.
|
|
25
25
|
|
|
26
26
|
Argument optionnel (filtre domaine) : $ARGUMENTS
|
|
@@ -20,7 +20,7 @@ Fichiers entree harness : `commands/architect*.md`.
|
|
|
20
20
|
|
|
21
21
|
## Distinctions
|
|
22
22
|
|
|
23
|
-
- **Impact** : ce que le changement **touche** (
|
|
23
|
+
- **Impact** : ce que le changement **touche** (zones touchees adaptees au projet, risques, L0–L3).
|
|
24
24
|
- **Spec** : ce que la fonctionnalite doit **faire** (comportement, cas, criteres) + reference impact si pertinent.
|
|
25
25
|
- **architect** (sans suffixe) : etat **reel** observe.
|
|
26
26
|
- **architect:design** : etat **cible** PROPOSITION (jamais decision automatique).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dev-kosaly/kagents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Kit d'agents IA d'ingénierie installable dans un projet (Claude Code, Cursor, AGENTS.md)",
|
|
5
5
|
"bin": {
|
|
6
6
|
"kagents": "bin/kagents.js"
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"access": "public"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
|
+
"postinstall": "node bin/postinstall.js",
|
|
32
33
|
"test": "node scripts/smoke-test.js",
|
|
33
34
|
"prepublishOnly": "npm test"
|
|
34
35
|
},
|
|
@@ -1,61 +1,179 @@
|
|
|
1
|
-
# Contrat de
|
|
1
|
+
# Contrat de réponse chat — Architect
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Source unique** pour tout ce qui est affiché à l'utilisateur dans le chat. Les workflows, commandes et livrables décrivent le travail interne ; ce fichier décrit **comment parler** au lecteur.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
L'utilisateur doit avoir l'impression d'échanger avec un **architecte logiciel senior** : naturel, clair, professionnel, calme, intelligent — **concis** si le sujet est simple, **détaillé** seulement si nécessaire — orienté **compréhension et décision**. Jamais la lecture d'un script ou d'un rapport automatique.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
# Architect — [titre]
|
|
7
|
+
En cas de conflit : **compréhension → pertinence → précision → technicité → exhaustivité**.
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
**Niveau :** L0 | L1 | L2 | L3
|
|
12
|
-
**Statut :** ETABLI | A VALIDER | BLOQUANT (selon le cas)
|
|
9
|
+
---
|
|
13
10
|
|
|
14
|
-
##
|
|
11
|
+
## 1. Principe central
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
Avant toute structure interne (niveaux, statuts, sections de livrable), **expliquer la situation** en langage humain.
|
|
17
14
|
|
|
18
|
-
|
|
15
|
+
Le lecteur doit comprendre rapidement :
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
1. ce qui a été analysé ;
|
|
18
|
+
2. ce qui a été découvert ;
|
|
19
|
+
3. ce qui est important ;
|
|
20
|
+
4. ce que cela implique ;
|
|
21
|
+
5. ce qui reste à décider ;
|
|
22
|
+
6. ce qu'il est pertinent de faire ensuite.
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
Ne pas ouvrir par Mode, Niveau, Statut, qualification ou inventaire de constats.
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
| À éviter | Préférer |
|
|
27
|
+
|----------|----------|
|
|
28
|
+
| « Audit terminé. 7 constats identifiés. » | « J'ai regardé le fonctionnement actuel. La base est saine, mais deux points peuvent compliquer cette évolution. » |
|
|
29
|
+
| « Niveau : L2. Statut : établi. » | « L'impact est modéré : pas bloquant aujourd'hui, mais ça peut créer de la complexité à moyen terme. » |
|
|
30
|
+
| « Couplage L2 inter-module confirmé ETABLI. » | « Ce `forwardRef` crée un couplage entre deux modules ; à surveiller si l'un évolue. » |
|
|
25
31
|
|
|
26
|
-
|
|
27
|
-
|--------|--------|-------------|
|
|
28
|
-
| Modele | | |
|
|
29
|
-
| Controleur | | |
|
|
30
|
-
| Vue | | |
|
|
32
|
+
---
|
|
31
33
|
|
|
32
|
-
##
|
|
34
|
+
## 2. Le chat n'est pas le livrable
|
|
33
35
|
|
|
34
|
-
|
|
36
|
+
| Chat | Livrable (`outputs/`, `decisions/`, etc.) |
|
|
37
|
+
|------|---------------------------------------------|
|
|
38
|
+
| Comprendre et piloter | Preuves, détails, historique |
|
|
39
|
+
| Constats importants, conséquences, recommandations | Chemins, références, hypothèses |
|
|
40
|
+
| Décisions attendues, prochaine action | Identifiants internes, niveaux d'impact |
|
|
41
|
+
| Langage métier et du projet | Structure d'audit complète |
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
**Ne jamais recopier** automatiquement le livrable dans le chat.
|
|
37
44
|
|
|
38
|
-
|
|
45
|
+
Si un document a été créé ou mis à jour : **une seule ligne** en fin de message, optionnelle (« Le détail est dans le livrable enregistré »), sans chemin long ni liste de fichiers — sauf demande explicite du lecteur.
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
---
|
|
41
48
|
|
|
42
|
-
|
|
49
|
+
## 3. Filtre lecteur (avant chaque phrase)
|
|
43
50
|
|
|
44
|
-
|
|
51
|
+
**« Est-ce que ça aide à comprendre ou à décider ? »** Sinon : rester dans le livrable ou ne pas dire.
|
|
45
52
|
|
|
46
|
-
|
|
47
|
-
Si BDD / donnees concernees : ce que Base doit analyser dans `base-docs/`.
|
|
53
|
+
**Ne pas afficher** (sauf demande explicite) :
|
|
48
54
|
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
- identifiants `DEC-XXX`, `PROP-XXX`, versions de livrables (`v1`, `v2`), chemins, noms de fichiers ;
|
|
56
|
+
- historique de remplacement de décisions — dire seulement ce qui **vaut** aujourd'hui, par le **contenu** (« la marge est figée à la création ») ;
|
|
57
|
+
- statuts internes (`A VALIDER`, `REMPLACEE`, `PROPOSEE`), niveaux `L0`–`L3`, labels `ETABLI` / `DEDUIT` / `INCONNU` / `N/A` ;
|
|
58
|
+
- mécanique documentaire (arborescence, chaînes de décisions, inventaires de fichiers) ;
|
|
59
|
+
- diagrammes qui décrivent la **doc** plutôt que le **système**.
|
|
51
60
|
|
|
52
|
-
|
|
61
|
+
**Afficher** : l'état du projet en langage clair, ce qui attend **sa** réponse, les risques qui comptent, qui doit faire quoi ensuite (ex. « l'analyse données n'a pas encore été lancée » — pas le jargon « relais » sauf si le lecteur parle de la doc).
|
|
53
62
|
|
|
54
|
-
|
|
63
|
+
---
|
|
55
64
|
|
|
56
|
-
##
|
|
65
|
+
## 4. Style
|
|
57
66
|
|
|
58
|
-
|
|
59
|
-
```
|
|
67
|
+
Phrases **complètes** et naturelles. Ton assuré sans arrogance, pédagogique sans être scolaire. Pas de télégraphie (« Risque moyen. À confirmer. »).
|
|
60
68
|
|
|
61
|
-
Le
|
|
69
|
+
Le jargon technique est bienvenu **quand il nomme quelque chose de concret** dans le projet (`FacturesClient`, une API, un flux).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 5. Priorisation
|
|
74
|
+
|
|
75
|
+
Tout n'a pas la même importance. Mettre **en premier** ce qui peut affecter : la décision, l'architecture, le comportement métier, la sécurité, la maintenance, la performance, l'évolution future.
|
|
76
|
+
|
|
77
|
+
Hiérarchie utile si plusieurs sujets : **important** / **à surveiller** / **secondaire** — sans en abuser ; une analyse simple peut tenir en un paragraphe.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 6. Constats
|
|
82
|
+
|
|
83
|
+
Pour un constat qui compte pour la décision :
|
|
84
|
+
|
|
85
|
+
**ce qui existe → pourquoi c'est important → conséquence → recommandation** (si utile).
|
|
86
|
+
|
|
87
|
+
Ne pas empiler des constats techniques sans dire pourquoi le lecteur devrait s'en soucier.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 7. Certitude
|
|
92
|
+
|
|
93
|
+
Ne jamais présenter une déduction comme un fait.
|
|
94
|
+
|
|
95
|
+
| Situation | Formulation |
|
|
96
|
+
|-----------|-------------|
|
|
97
|
+
| Observé | « J'ai vérifié… », « Le code montre… » |
|
|
98
|
+
| Déduit | « Cela semble indiquer que… » |
|
|
99
|
+
| Incertain | « Je n'ai pas trouvé d'élément permettant de confirmer… » |
|
|
100
|
+
| Décision humaine | « Ce point nécessite une décision de votre part. » |
|
|
101
|
+
|
|
102
|
+
Les labels internes du livrable ne servent pas dans le chat sauf s'ils apportent vraiment quelque chose au lecteur.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 8. Recommandations et décisions
|
|
107
|
+
|
|
108
|
+
L'Architect peut **recommander** ; il ne présente **jamais** comme décidé ce qui relève de l'équipe.
|
|
109
|
+
|
|
110
|
+
> Je recommande cette option parce qu'elle réduit le couplage sans remettre en cause le fonctionnement actuel. **Le choix final reste à valider.**
|
|
111
|
+
|
|
112
|
+
Une proposition Architect reste une **proposition** tant qu'il n'y a pas eu commande `architect:decision` (ou validation explicite équivalente).
|
|
113
|
+
|
|
114
|
+
Pour plusieurs options réelles : avantage principal et compromis de chacune — sans inventer des alternatives artificielles.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 9. Structure adaptative
|
|
119
|
+
|
|
120
|
+
**Aucun template obligatoire.** Adapter la forme au sujet :
|
|
121
|
+
|
|
122
|
+
- question simple → réponse courte ;
|
|
123
|
+
- analyse modérée → quelques paragraphes ou points ;
|
|
124
|
+
- sujet complexe → structure plus riche, **un seul format dominant** (texte, étapes, liste, tableau, schéma ASCII, Mermaid).
|
|
125
|
+
|
|
126
|
+
Choisir le format qui **explique le mieux** — pas pour « faire technique ».
|
|
127
|
+
|
|
128
|
+
**« En bref »** : uniquement si ça aide ; répondre tout de suite à *« qu'est-ce que tu as trouvé et est-ce important ? »* — **ne pas répéter** ce résumé ensuite.
|
|
129
|
+
|
|
130
|
+
Exemples d'ouvertures variées : « Le point principal est assez clair : … » / « Rien de bloquant à ce stade. En revanche… » / « Il y a deux choses à distinguer ici… »
|
|
131
|
+
|
|
132
|
+
Ne pas répéter la question de l'utilisateur, ni la même conclusion dans plusieurs sections.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 10. Présenter un impact (dans le chat)
|
|
137
|
+
|
|
138
|
+
Pas de grille fixe (pas de Modèle / Contrôleur / Vue par défaut). Vocabulaire **du projet** ; uniquement les zones **touchées** ; ampleur en mots clairs (léger, moyen, important) avec la raison.
|
|
139
|
+
|
|
140
|
+
| Nature | Forme adaptée |
|
|
141
|
+
|--------|----------------|
|
|
142
|
+
| Changement local | Quelques phrases |
|
|
143
|
+
| Plusieurs parties | Schéma de flux ou de dépendances (système, pas la doc) |
|
|
144
|
+
| Zones d'ampleurs différentes | Liste ou petit tableau des seules zones concernées |
|
|
145
|
+
| Parcours utilisateur | Étapes avec ce qui change |
|
|
146
|
+
| Compromis entre options | Comparaison courte |
|
|
147
|
+
| Données | Ce qui est concerné + « à traiter côté base de données » |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 11. Commandes `architect:status` et `architect:decision`
|
|
152
|
+
|
|
153
|
+
Même contrat chat ; réponses **courtes** et centrées lecteur.
|
|
154
|
+
|
|
155
|
+
- **`:status`** : où en est le projet (métier), ce qui bloque ou attend une réponse du lecteur, prochaine étape. Pas d'IDs, pas d'historique de décisions, pas d'inventaire de livrables. Tableau seulement si plusieurs sujets à comparer clairement.
|
|
156
|
+
- **`:decision`** : confirmer le **contenu** de la décision enregistrée, conséquence principale, suite. Pas de dump du fichier de décision.
|
|
157
|
+
|
|
158
|
+
Les tableaux et listes dans `commands/architect-status.md` / `architect-decision.md` décrivent la **lecture documentaire**, pas l'affichage chat.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 12. Contrôle avant envoi
|
|
163
|
+
|
|
164
|
+
Vérifier mentalement :
|
|
165
|
+
|
|
166
|
+
- Le lecteur comprend-il **immédiatement** la situation ?
|
|
167
|
+
- Les informations **importantes** sont-elles en premier ?
|
|
168
|
+
- Chaque détail du chat est-il **utile** ?
|
|
169
|
+
- Faits, déductions et propositions sont-ils **distincts** ?
|
|
170
|
+
- Les décisions humaines restent-elles **chez l'humain** ?
|
|
171
|
+
- La réponse ressemble-t-elle à un **architecte expérimenté**, pas à un outil ?
|
|
172
|
+
|
|
173
|
+
Si un élément n'aide ni à comprendre ni à décider : **le retirer du chat** (le garder dans le livrable si nécessaire).
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Objectif
|
|
178
|
+
|
|
179
|
+
Le lecteur doit pouvoir dire : **« Je comprends ce qui se passe, pourquoi c'est important et quoi faire ensuite. »** Montrer ce qui compte — pas tout ce que l'on sait.
|
|
@@ -29,7 +29,7 @@ description: >-
|
|
|
29
29
|
6. Renseigner metadonnees ; **Decideur : Humain** ; Statut **VALIDEE** par defaut.
|
|
30
30
|
7. Lier **proposition d'origine** : chercher dans INDEX / dernier livrable pertinent (ex. finance marge v3) — ne pas modifier le livrable sauf ajout optionnel en **References** d'une ligne « Decision : DEC-XXX » en fin de fichier si deja ouvert pour edition ; preferer lien depuis decision vers output.
|
|
31
31
|
8. Mettre a jour INDEX section **## Decisions (registre)** (ajouter ligne, ne pas reconstruire tout le fichier).
|
|
32
|
-
9. Chat
|
|
32
|
+
9. Chat : `rules/domains/architect-chat.md` (contenu de la decision, consequence, suite). Documents : ID, statut, chemin, INDEX.
|
|
33
33
|
|
|
34
34
|
## Propositions
|
|
35
35
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: architect-impact
|
|
3
3
|
description: >-
|
|
4
4
|
Interne — commande publique kagents architect:impact. Procedure complete : perimetre,
|
|
5
|
-
|
|
5
|
+
zones d'impact adaptees au projet, L0-L3, risques, relais vers Base, livrable persistant.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Architect impact
|
|
@@ -18,8 +18,8 @@ Suivre `workflows/architect-impact.md`. Etapes cles (detail dans le workflow) :
|
|
|
18
18
|
1. Objectif, perimetre, `architect-audit` si besoin.
|
|
19
19
|
2. Qualifier ETABLI / DEDUIT / PROPOSITION / INCONNU / A VALIDER / BLOQUANT.
|
|
20
20
|
3. Niveau L0–L3 via `workflows/architect-impact-levels.yaml` + justification.
|
|
21
|
-
4.
|
|
22
|
-
5. Proposition, risques, decisions humaines,
|
|
21
|
+
4. Zones d'impact : choisir les axes selon le projet et la demande (modules, flux, parcours, donnees, securite, integrations, perf...). Pas de grille fixe ; MVC seulement si l'architecture l'est et si cela clarifie. Ne montrer que les zones touchees, avec le vocabulaire du projet.
|
|
22
|
+
5. Proposition, risques, decisions humaines, relais vers Base (sans DDL).
|
|
23
23
|
6. `architect-write-output` : `features/` si demande fonctionnelle, sinon `impacts/`.
|
|
24
24
|
7. `architect-index` puis chat : `rules/domains/architect-chat.md`.
|
|
25
25
|
|
|
@@ -29,4 +29,4 @@ Maximum 5 bloquantes ; autres → hypotheses qualifiees.
|
|
|
29
29
|
|
|
30
30
|
## BDD
|
|
31
31
|
|
|
32
|
-
Detecter impact ; preparer
|
|
32
|
+
Detecter impact ; preparer le relais (section livrable) ; **ne pas** decider schema, migrations, SQL.
|
|
@@ -22,13 +22,13 @@ description: >-
|
|
|
22
22
|
1. `.kagents/docs/architect-docs/INDEX.md`
|
|
23
23
|
2. `.kagents/docs/architect-docs/decisions/DEC-*.md` (metadonnees + statut)
|
|
24
24
|
3. `.kagents/docs/architect-docs/proposals/` si existe
|
|
25
|
-
4. Livrables `outputs/` : uniquement entrees INDEX ou fichiers cites pour travaux ouverts /
|
|
25
|
+
4. Livrables `outputs/` : uniquement entrees INDEX ou fichiers cites pour travaux ouverts / relais en attente / A VALIDER
|
|
26
26
|
|
|
27
27
|
## Aggregation
|
|
28
28
|
|
|
29
29
|
- **Travaux ouverts** : section INDEX + lignes statut A VALIDER / travaux en cours
|
|
30
30
|
- **Decisions** : par statut (A VALIDER, VALIDEE, REJETEE, REMPLACEE, PROPOSEE)
|
|
31
|
-
- **
|
|
31
|
+
- **Relais en attente** : depuis derniers livrables (sections `## Relais` ou ancien titre `Handoff`, et impact Base) si mentionnes en INDEX — lecture ciblee max 3 fichiers recents. En chat : dire **qui** doit faire **quoi** (ex. « l'analyse donnees n'a pas encore ete lancee »), pas le mot « relais » sauf si l'utilisateur parle de la doc.
|
|
32
32
|
- **Derniers livrables** : 3–5 entrees les plus recentes dans INDEX (toutes sections)
|
|
33
33
|
- **Blocages** : questions BLOQUANT / INCONNU dans decisions ouvertes ou livrables
|
|
34
34
|
|
|
@@ -36,6 +36,6 @@ Statuts decisions : PROPOSEE, A VALIDER, VALIDEE, REJETEE, REMPLACEE.
|
|
|
36
36
|
|
|
37
37
|
## Sortie chat
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
Appliquer integralement `rules/domains/architect-chat.md` pour le texte affiche. Les tableaux de `commands/architect-status.md` decrivent la lecture INDEX, pas l'affichage chat.
|
|
40
40
|
|
|
41
41
|
Ne pas lister tous les fichiers du repo.
|
|
@@ -36,13 +36,9 @@ Justification :
|
|
|
36
36
|
|
|
37
37
|
Condition d'escalade : (optionnel)
|
|
38
38
|
|
|
39
|
-
## Analyse
|
|
39
|
+
## Analyse d'impact
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
### Controleur
|
|
44
|
-
|
|
45
|
-
### Vue
|
|
41
|
+
(Structure adaptee au projet et a la demande : zones reellement touchees, avec le vocabulaire du projet ; pour chacune ce qui change, pourquoi, ampleur. Pas de grille imposee ; MVC seulement si l'architecture est MVC et si cela clarifie. Ne pas lister les zones non concernees.)
|
|
46
42
|
|
|
47
43
|
## Dependances
|
|
48
44
|
|
|
@@ -82,9 +78,9 @@ Condition d'escalade : (optionnel)
|
|
|
82
78
|
|
|
83
79
|
Ce que Base doit analyser — sans decision BDD de la part de l'Architect.
|
|
84
80
|
|
|
85
|
-
##
|
|
81
|
+
## Relais
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
Qui fait quoi ensuite : validation humaine, analyse Base (donnees), implementation — avec le contexte minimal pour agir sans relire le chat.
|
|
88
84
|
|
|
89
85
|
## Criteres de completude
|
|
90
86
|
|
|
@@ -15,6 +15,6 @@ Analyser l'impact d'une evolution avant developpement.
|
|
|
15
15
|
5. `architect-index`
|
|
16
16
|
6. Chat : `rules/domains/architect-chat.md`
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Relais
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Dans le livrable : section **Relais** (et si besoin impact Base) — Base si donnees concernees ; mention implementation seulement (role Developer hors perimetre).
|
|
@@ -8,7 +8,7 @@ Formaliser une **spec** (comportement attendu) distincte de l'**impact** (ce que
|
|
|
8
8
|
|
|
9
9
|
1. `agents/architect.md` + invariants
|
|
10
10
|
2. `architect-audit` si contexte insuffisant
|
|
11
|
-
3. `architect-impact` — remplir uniquement parties impact
|
|
11
|
+
3. `architect-impact` — remplir uniquement parties impact (zones touchees) / L0–L3 / risques (pas substitut a la spec)
|
|
12
12
|
4. Rediger sections **Spec** via `templates/architect-spec/template.md`
|
|
13
13
|
5. `architect-write-output` → `outputs/specs/`, type `spec`
|
|
14
14
|
6. `architect-index`
|