overmind-mcp 2.0.1 → 2.0.2
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 +145 -232
- package/dist/server.d.ts +40 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +104 -61
- package/dist/server.js.map +1 -1
- package/dist/services/ClaudeRunner.d.ts.map +1 -1
- package/dist/services/ClaudeRunner.js +68 -47
- package/dist/services/ClaudeRunner.js.map +1 -1
- package/docs/INDEX.md +144 -0
- package/docs/README.md +128 -0
- package/docs/api/prompt/Claude_code.md +74 -0
- package/docs/api/prompt/Kilo.md +74 -0
- package/docs/api/prompt/Kilo_Hermes.md +170 -0
- package/docs/api/prompt/Minimax4.md +96 -0
- package/docs/changelog/CHANGELOG.add.md +106 -0
- package/docs/index.html +569 -0
- package/docs/library.html +239 -0
- package/docs/prompt.html +1212 -0
- package/docs/script.js +428 -0
- package/docs/styles.css +2816 -0
- package/docs/tools.md +794 -0
- package/package.json +5 -13
- package/scripts/docker-manager.mjs +2 -2
- package/scripts/install-dependencies.mjs +266 -87
- package/scripts/postinstall.mjs +98 -129
- package/scripts/setup.mjs +4 -6
- package/scripts/uninstall.mjs +224 -0
- package/SETUP_WINDOWS.md +0 -362
- package/dist/tools/metadata.d.ts +0 -20
- package/dist/tools/metadata.d.ts.map +0 -1
- package/dist/tools/metadata.js +0 -246
- package/dist/tools/metadata.js.map +0 -1
- package/docker-compose.overmind.yml +0 -172
- /package/{CHANGELOG.md → docs/changelog/CHANGELOG.md} +0 -0
- /package/{DEPLOYMENT.md → docs/guides/DEPLOYMENT.md} +0 -0
- /package/{SWARM_USAGE.md → docs/guides/SWARM_USAGE.md} +0 -0
package/SETUP_WINDOWS.md
DELETED
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
# ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
-
# OVERMIND-MCP: SETUP WINDOWS (PostgreSQL Existant)
|
|
3
|
-
# ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
-
# Guide de configuration pour OverMind-MCP avec PostgreSQL + pgvector existant
|
|
5
|
-
#
|
|
6
|
-
# Prérequis:
|
|
7
|
-
# - Docker Desktop démarré
|
|
8
|
-
# - PostgreSQL + pgvector en Docker (container: postgres-pgvector)
|
|
9
|
-
# - Node.js 20+ installé
|
|
10
|
-
# - pnpm installé
|
|
11
|
-
# ═══════════════════════════════════════════════════════════════════════════════
|
|
12
|
-
|
|
13
|
-
## 📋 ÉTAPE 1: Configuration de l'environnement
|
|
14
|
-
|
|
15
|
-
### 1.1 Créer le fichier .env
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# Copier l'exemple
|
|
19
|
-
cp .env.example .env
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### 1.2 Éditer .env avec votre configuration PostgreSQL existante
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
# ─── WORKSPACE ───────────────────────────────────────────────────────────────────
|
|
26
|
-
OVERMIND_WORKSPACE=C:/Users/Deamon/Desktop/Backup/Serveur MCP
|
|
27
|
-
|
|
28
|
-
# ─── DATABASE (VOTRE POSTGRESQL EXISTANT) ──────────────────────────────────────
|
|
29
|
-
POSTGRES_HOST=host.docker.internal # ← IMPORTANT pour Docker
|
|
30
|
-
POSTGRES_PORT=5432
|
|
31
|
-
POSTGRES_DATABASE=overmind_memory # Sera créé automatiquement
|
|
32
|
-
POSTGRES_USER=postgres
|
|
33
|
-
POSTGRES_PASSWORD=votre_mot_de_passe_ici # ← CHANGEZ CECI
|
|
34
|
-
POSTGRES_SSL=false
|
|
35
|
-
|
|
36
|
-
# ─── MEMORY ───────────────────────────────────────────────────────────────────────
|
|
37
|
-
OVERMIND_MEMORY_TYPE=postgres
|
|
38
|
-
|
|
39
|
-
# ─── EMBEDDINGS (Qwen 8B - 4096D) ────────────────────────────────────────────────
|
|
40
|
-
OVERMIND_EMBEDDING_URL=https://openrouter.ai/api/v1
|
|
41
|
-
OVERMIND_EMBEDDING_KEY=sk-or-v1-votre_cle_api_ici # ← CHANGEZ CECI
|
|
42
|
-
OVERMIND_EMBEDDING_MODEL=qwen/qwen3-embedding-8b
|
|
43
|
-
OVERMIND_EMBEDDING_DIMENSIONS=4096
|
|
44
|
-
|
|
45
|
-
# ─── MESSAGE BROKER (Docker RabbitMQ) ────────────────────────────────────────────
|
|
46
|
-
OVERMIND_BROKER=rabbitmq
|
|
47
|
-
RABBITMQ_URL=amqp://overmind:overmind_secret_password_change_me@localhost:5672
|
|
48
|
-
|
|
49
|
-
# ─── WORKFLOW (Docker Temporal) ───────────────────────────────────────────────────
|
|
50
|
-
OVERMIND_WORKFLOW=temporal
|
|
51
|
-
TEMPORAL_ADDRESS=localhost:7233
|
|
52
|
-
|
|
53
|
-
# ─── TELEMETRY (Désactivé par défaut) ────────────────────────────────────────────
|
|
54
|
-
OTEL_ENABLED=false
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## 🗄️ ÉTAPE 2: Initialiser la base OverMind
|
|
60
|
-
|
|
61
|
-
### Option A: Script automatique (RECOMMANDÉ)
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
# Lancer le script de setup
|
|
65
|
-
node scripts/setup-overmind-db.js
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**Le script va:**
|
|
69
|
-
1. Se connecter à votre PostgreSQL existant
|
|
70
|
-
2. Vérifier que pgvector est installé
|
|
71
|
-
3. Créer la base `overmind_memory`
|
|
72
|
-
4. Activer l'extension pgvector
|
|
73
|
-
5. Initialiser les tables
|
|
74
|
-
|
|
75
|
-
### Option B: Manuel
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Se connecter à votre PostgreSQL Docker
|
|
79
|
-
docker exec -it postgres-pgvector psql -U postgres
|
|
80
|
-
|
|
81
|
-
# Créer la base de données
|
|
82
|
-
CREATE DATABASE overmind_memory;
|
|
83
|
-
|
|
84
|
-
# Se connecter à la nouvelle base
|
|
85
|
-
\c overmind_memory
|
|
86
|
-
|
|
87
|
-
# Activer pgvector
|
|
88
|
-
CREATE EXTENSION IF NOT EXISTS vector;
|
|
89
|
-
|
|
90
|
-
# Quitter
|
|
91
|
-
\q
|
|
92
|
-
|
|
93
|
-
# Exécuter le script d'initialisation
|
|
94
|
-
docker exec -i postgres-pgvector psql -U postgres -d overmind_memory < init-db.sql
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 🐳 ÉTAPE 3: Lancer les services Docker OverMind
|
|
100
|
-
|
|
101
|
-
### 3.1 Lancer RabbitMQ + Temporal
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
# Lancer les services minimal
|
|
105
|
-
docker-compose -f docker-compose.overmind.yml up -d
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
**Services démarrés:**
|
|
109
|
-
- ✅ RabbitMQ (ports 5672, 15672)
|
|
110
|
-
- ✅ Temporal (ports 7233, 8088)
|
|
111
|
-
- ✅ Temporal Web UI
|
|
112
|
-
|
|
113
|
-
### 3.2 Vérifier que tout tourne
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
# Vérifier les containers
|
|
117
|
-
docker ps
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**Vous devriez voir:**
|
|
121
|
-
```
|
|
122
|
-
postgres-pgvector (déjà existant)
|
|
123
|
-
overmind-rabbitmq (nouveau)
|
|
124
|
-
overmind-temporal (nouveau)
|
|
125
|
-
overmind-temporal-web (nouveau)
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### 3.3 Tester les interfaces
|
|
129
|
-
|
|
130
|
-
- **RabbitMQ Management UI**: http://localhost:15672
|
|
131
|
-
- User: `overmind`
|
|
132
|
-
- Pass: `overmind_secret_password_change_me`
|
|
133
|
-
|
|
134
|
-
- **Temporal Web UI**: http://localhost:8088
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## 🔨 ÉTAPE 4: Builder et démarrer OverMind
|
|
139
|
-
|
|
140
|
-
### 4.1 Builder le projet
|
|
141
|
-
|
|
142
|
-
```bash
|
|
143
|
-
cd "C:/Users/Deamon/Desktop/Backup/Serveur MCP/Workflow"
|
|
144
|
-
pnpm run build
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### 4.2 Démarrer OverMind
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
# Mode développement (avec watch)
|
|
151
|
-
pnpm run dev
|
|
152
|
-
|
|
153
|
-
# Ou mode production
|
|
154
|
-
pnpm run start
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## ✅ ÉTAPE 5: Vérifier l'installation
|
|
160
|
-
|
|
161
|
-
### 5.1 Tester la connexion PostgreSQL
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
# Lancer un test simple
|
|
165
|
-
node -e "
|
|
166
|
-
const { Client } = require('pg');
|
|
167
|
-
const client = new Client({
|
|
168
|
-
host: 'localhost',
|
|
169
|
-
port: 5432,
|
|
170
|
-
user: 'postgres',
|
|
171
|
-
password: 'votre_mot_de_passe',
|
|
172
|
-
database: 'overmind_memory'
|
|
173
|
-
});
|
|
174
|
-
client.connect().then(() => {
|
|
175
|
-
console.log('✅ Connexion PostgreSQL réussie !');
|
|
176
|
-
return client.query('SELECT version()');
|
|
177
|
-
}).then(res => {
|
|
178
|
-
console.log('PostgreSQL version:', res.rows[0].version);
|
|
179
|
-
return client.end();
|
|
180
|
-
}).catch(err => {
|
|
181
|
-
console.error('❌ Erreur:', err.message);
|
|
182
|
-
process.exit(1);
|
|
183
|
-
});
|
|
184
|
-
"
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### 5.2 Vérifier les services Docker
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
# Vérifier RabbitMQ
|
|
191
|
-
curl http://localhost:15672/api/overview
|
|
192
|
-
# User: overmind
|
|
193
|
-
# Pass: overmind_secret_password_change_me
|
|
194
|
-
|
|
195
|
-
# Vérifier Temporal
|
|
196
|
-
curl http://localhost:7233
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## 🧪 ÉTAPE 6: Premier test
|
|
202
|
-
|
|
203
|
-
### 6.1 Créer un agent de test
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
# Via l'interface MCP (Cursor, Claude Code, etc.)
|
|
207
|
-
|
|
208
|
-
create_agent({
|
|
209
|
-
name: 'test-agent',
|
|
210
|
-
prompt: 'Tu es un agent de test pour vérifier l\'installation',
|
|
211
|
-
runner: 'claude'
|
|
212
|
-
})
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### 6.2 Tester la mémoire
|
|
216
|
-
|
|
217
|
-
```bash
|
|
218
|
-
# Stocker une connaissance
|
|
219
|
-
memory_store({
|
|
220
|
-
text: 'OverMind-MCP est installé sur Windows avec PostgreSQL existant',
|
|
221
|
-
source: 'setup',
|
|
222
|
-
agentName: 'system'
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
# Rechercher
|
|
226
|
-
memory_search({
|
|
227
|
-
query: 'installation Windows',
|
|
228
|
-
limit: 5
|
|
229
|
-
})
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## 📊 ÉTAPE 7: Monitoring (Optionnel)
|
|
235
|
-
|
|
236
|
-
Si vous voulez activer l'observabilité, décommentez les services Prometheus et Grafana dans `docker-compose.overmind.yml`:
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
# Arrêter les services
|
|
240
|
-
docker-compose -f docker-compose.overmind.yml down
|
|
241
|
-
|
|
242
|
-
# Éditer docker-compose.overmind.yml
|
|
243
|
-
# Décommentez les sections prometheus et grafana
|
|
244
|
-
|
|
245
|
-
# Relancer
|
|
246
|
-
docker-compose -f docker-compose.overmind.yml up -d
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**Interfaces disponibles:**
|
|
250
|
-
- Prometheus: http://localhost:9090
|
|
251
|
-
- Grafana: http://localhost:3000 (admin/grafana_password_change_me)
|
|
252
|
-
|
|
253
|
-
---
|
|
254
|
-
|
|
255
|
-
## 🛠️ COMMANDES UTILES
|
|
256
|
-
|
|
257
|
-
### Docker
|
|
258
|
-
|
|
259
|
-
```bash
|
|
260
|
-
# Voir les logs
|
|
261
|
-
docker-compose -f docker-compose.overmind.yml logs -f
|
|
262
|
-
|
|
263
|
-
# Arrêter les services
|
|
264
|
-
docker-compose -f docker-compose.overmind.yml down
|
|
265
|
-
|
|
266
|
-
# Redémarrer un service
|
|
267
|
-
docker-compose -f docker-compose.overmind.yml restart rabbitmq
|
|
268
|
-
|
|
269
|
-
# Voir l'état
|
|
270
|
-
docker-compose -f docker-compose.overmind.yml ps
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
### OverMind
|
|
274
|
-
|
|
275
|
-
```bash
|
|
276
|
-
# Builder
|
|
277
|
-
pnpm run build
|
|
278
|
-
|
|
279
|
-
# Linter
|
|
280
|
-
pnpm run lint
|
|
281
|
-
|
|
282
|
-
# Tests
|
|
283
|
-
pnpm run test
|
|
284
|
-
|
|
285
|
-
# Démarrer
|
|
286
|
-
pnpm run dev # Développement
|
|
287
|
-
pnpm run start # Production
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## 🐛 DÉPANNAGE
|
|
293
|
-
|
|
294
|
-
### Problème: "ECONNREFUSED" PostgreSQL
|
|
295
|
-
|
|
296
|
-
**Solution:**
|
|
297
|
-
```bash
|
|
298
|
-
# Vérifier que PostgreSQL tourne
|
|
299
|
-
docker ps | grep postgres-pgvector
|
|
300
|
-
|
|
301
|
-
# Vérifier le port
|
|
302
|
-
docker port postgres-pgvector
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### Problème: "pgvector not installed"
|
|
306
|
-
|
|
307
|
-
**Solution:**
|
|
308
|
-
```bash
|
|
309
|
-
# Se connecter au container
|
|
310
|
-
docker exec -it postgres-pgvector psql -U postgres
|
|
311
|
-
|
|
312
|
-
# Installer pgvector
|
|
313
|
-
CREATE EXTENSION IF NOT EXISTS vector;
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### Problème: "RabbitMQ connection refused"
|
|
317
|
-
|
|
318
|
-
**Solution:**
|
|
319
|
-
```bash
|
|
320
|
-
# Vérifier que RabbitMQ tourne
|
|
321
|
-
docker ps | grep overmind-rabbitmq
|
|
322
|
-
|
|
323
|
-
# Voir les logs
|
|
324
|
-
docker logs overmind-rabbitmq
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
### Problème: "Temporal can't connect to PostgreSQL"
|
|
328
|
-
|
|
329
|
-
**Solution:**
|
|
330
|
-
```bash
|
|
331
|
-
# Vérifier .env
|
|
332
|
-
# POSTGRES_HOST doit être "host.docker.internal"
|
|
333
|
-
# POSTGRES_PASSWORD doit être correct
|
|
334
|
-
|
|
335
|
-
# Redémarrer Temporal
|
|
336
|
-
docker-compose -f docker-compose.overmind.yml restart temporal
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
---
|
|
340
|
-
|
|
341
|
-
## 🎯 RÉSUMÉ
|
|
342
|
-
|
|
343
|
-
**Setup minimal:**
|
|
344
|
-
- ✅ PostgreSQL existant réutilisé
|
|
345
|
-
- ✅ RabbitMQ (message broker)
|
|
346
|
-
- ✅ Temporal (workflow orchestrator)
|
|
347
|
-
- ✅ OverMind agents (Node.js natif)
|
|
348
|
-
|
|
349
|
-
**Services disponibles:**
|
|
350
|
-
- 📊 RabbitMQ Management UI: http://localhost:15672
|
|
351
|
-
- 📈 Temporal Web UI: http://localhost:8088
|
|
352
|
-
- 🗄️ PostgreSQL: localhost:5432
|
|
353
|
-
- 🤖 OverMind Agents: Processus Node.js
|
|
354
|
-
|
|
355
|
-
**Prochaine étape:**
|
|
356
|
-
Créer vos agents et workflows personnalisés ! 🚀
|
|
357
|
-
|
|
358
|
-
---
|
|
359
|
-
|
|
360
|
-
**Pour plus d'informations:**
|
|
361
|
-
- Documentation: https://deamondev888.github.io/overmind-mcp/
|
|
362
|
-
- Support: https://discord.gg/4AR82phtBz
|
package/dist/tools/metadata.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export declare const metadataSchema: z.ZodObject<{
|
|
3
|
-
path: z.ZodDefault<z.ZodString>;
|
|
4
|
-
depth: z.ZodDefault<z.ZodNumber>;
|
|
5
|
-
includeStats: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
-
}, z.core.$strip>;
|
|
7
|
-
export declare function metadataTool(args: z.infer<typeof metadataSchema>): Promise<{
|
|
8
|
-
isError: boolean;
|
|
9
|
-
content: {
|
|
10
|
-
type: "text";
|
|
11
|
-
text: string;
|
|
12
|
-
}[];
|
|
13
|
-
} | {
|
|
14
|
-
content: {
|
|
15
|
-
type: "text";
|
|
16
|
-
text: string;
|
|
17
|
-
}[];
|
|
18
|
-
isError?: undefined;
|
|
19
|
-
}>;
|
|
20
|
-
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,cAAc;;;;iBAIzB,CAAC;AAuNH,wBAAsB,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC;;;;;;;;;;;;GAoDtE"}
|
package/dist/tools/metadata.js
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { readdir, readFile, stat, realpath } from 'fs/promises';
|
|
3
|
-
import { join, extname, basename, resolve, sep } from 'path';
|
|
4
|
-
export const metadataSchema = z.object({
|
|
5
|
-
path: z.string().default('.').describe('Chemin du projet (défaut: répertoire courant)'),
|
|
6
|
-
depth: z.number().min(1).max(8).default(3).describe("Profondeur de l'arborescence (défaut: 3)"),
|
|
7
|
-
includeStats: z.boolean().default(true).describe('Inclure les statistiques (défaut: true)'),
|
|
8
|
-
});
|
|
9
|
-
const IGNORED = new Set([
|
|
10
|
-
'node_modules',
|
|
11
|
-
'.git',
|
|
12
|
-
'.github',
|
|
13
|
-
'dist',
|
|
14
|
-
'.next',
|
|
15
|
-
'build',
|
|
16
|
-
'coverage',
|
|
17
|
-
'__pycache__',
|
|
18
|
-
'.cache',
|
|
19
|
-
'.turbo',
|
|
20
|
-
'.pnpm-store',
|
|
21
|
-
]);
|
|
22
|
-
const CONFIG_FILES = [
|
|
23
|
-
'package.json',
|
|
24
|
-
'tsconfig.json',
|
|
25
|
-
'tsconfig.base.json',
|
|
26
|
-
'.env.example',
|
|
27
|
-
'vite.config.ts',
|
|
28
|
-
'vite.config.js',
|
|
29
|
-
'vitest.config.ts',
|
|
30
|
-
'eslint.config.js',
|
|
31
|
-
'.eslintrc.json',
|
|
32
|
-
'prettier.config.js',
|
|
33
|
-
'.prettierrc',
|
|
34
|
-
'Dockerfile',
|
|
35
|
-
'docker-compose.yml',
|
|
36
|
-
];
|
|
37
|
-
const LANG_MAP = {
|
|
38
|
-
'.ts': 'TypeScript',
|
|
39
|
-
'.tsx': 'TypeScript (JSX)',
|
|
40
|
-
'.js': 'JavaScript',
|
|
41
|
-
'.jsx': 'JavaScript (JSX)',
|
|
42
|
-
'.py': 'Python',
|
|
43
|
-
'.go': 'Go',
|
|
44
|
-
'.rs': 'Rust',
|
|
45
|
-
'.java': 'Java',
|
|
46
|
-
'.cs': 'C#',
|
|
47
|
-
'.cpp': 'C++',
|
|
48
|
-
'.c': 'C',
|
|
49
|
-
'.md': 'Markdown',
|
|
50
|
-
'.json': 'JSON',
|
|
51
|
-
'.yaml': 'YAML',
|
|
52
|
-
'.yml': 'YAML',
|
|
53
|
-
'.toml': 'TOML',
|
|
54
|
-
'.sh': 'Shell',
|
|
55
|
-
'.bat': 'Batch',
|
|
56
|
-
'.sql': 'SQL',
|
|
57
|
-
'.html': 'HTML',
|
|
58
|
-
'.css': 'CSS',
|
|
59
|
-
'.scss': 'SCSS',
|
|
60
|
-
};
|
|
61
|
-
async function buildTree(dir, depth, currentDepth = 0) {
|
|
62
|
-
if (currentDepth >= depth)
|
|
63
|
-
return [];
|
|
64
|
-
let entries;
|
|
65
|
-
try {
|
|
66
|
-
entries = await readdir(dir, { withFileTypes: true });
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
const nodes = [];
|
|
72
|
-
for (const entry of entries) {
|
|
73
|
-
if (IGNORED.has(entry.name) || (entry.name.startsWith('.') && entry.name !== '.env.example'))
|
|
74
|
-
continue;
|
|
75
|
-
if (entry.isDirectory()) {
|
|
76
|
-
const children = await buildTree(join(dir, entry.name), depth, currentDepth + 1);
|
|
77
|
-
nodes.push({ name: entry.name, type: 'dir', children });
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
nodes.push({ name: entry.name, type: 'file' });
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return nodes.sort((a, b) => {
|
|
84
|
-
if (a.type !== b.type)
|
|
85
|
-
return a.type === 'dir' ? -1 : 1;
|
|
86
|
-
return a.name.localeCompare(b.name);
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
function renderTree(nodes, prefix = '') {
|
|
90
|
-
let out = '';
|
|
91
|
-
for (let i = 0; i < nodes.length; i++) {
|
|
92
|
-
const node = nodes[i];
|
|
93
|
-
const isLast = i === nodes.length - 1;
|
|
94
|
-
const connector = isLast ? '└── ' : '├── ';
|
|
95
|
-
const icon = node.type === 'dir' ? '📁 ' : '📄 ';
|
|
96
|
-
out += `${prefix}${connector}${icon}${node.name}\n`;
|
|
97
|
-
if (node.children?.length) {
|
|
98
|
-
out += renderTree(node.children, prefix + (isLast ? ' ' : '│ '));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return out;
|
|
102
|
-
}
|
|
103
|
-
async function collectStats(dir) {
|
|
104
|
-
const stats = { totalFiles: 0, totalLines: 0, languages: {}, filePaths: [] };
|
|
105
|
-
async function walk(d) {
|
|
106
|
-
let entries;
|
|
107
|
-
try {
|
|
108
|
-
entries = await readdir(d, { withFileTypes: true });
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
for (const entry of entries) {
|
|
114
|
-
if (IGNORED.has(entry.name))
|
|
115
|
-
continue;
|
|
116
|
-
const fullPath = join(d, entry.name);
|
|
117
|
-
if (entry.isDirectory()) {
|
|
118
|
-
await walk(fullPath);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
const ext = extname(entry.name).toLowerCase();
|
|
122
|
-
const lang = LANG_MAP[ext];
|
|
123
|
-
if (lang) {
|
|
124
|
-
stats.totalFiles++;
|
|
125
|
-
stats.languages[lang] = (stats.languages[lang] ?? 0) + 1;
|
|
126
|
-
// Store relative path from project root
|
|
127
|
-
stats.filePaths.push(fullPath.slice(dir.length + 1).replace(/\\/g, '/'));
|
|
128
|
-
try {
|
|
129
|
-
const content = await readFile(fullPath, 'utf8');
|
|
130
|
-
stats.totalLines += content.split('\n').length;
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// skip unreadable files
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
await walk(dir);
|
|
140
|
-
stats.filePaths.sort();
|
|
141
|
-
return stats;
|
|
142
|
-
}
|
|
143
|
-
async function getConfigs(dir) {
|
|
144
|
-
const result = {};
|
|
145
|
-
for (const file of CONFIG_FILES) {
|
|
146
|
-
try {
|
|
147
|
-
const filePath = join(dir, file);
|
|
148
|
-
const s = await stat(filePath);
|
|
149
|
-
if (s.size > 1024 * 1024) {
|
|
150
|
-
result[file] = '[FILE TOO LARGE >1MB — skipped]';
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
const content = await readFile(filePath, 'utf8');
|
|
154
|
-
result[file] = content.length > 2000 ? content.slice(0, 2000) + '\n…(tronqué)' : content;
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
// file absent
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
function withinRoot(candidate, root) {
|
|
163
|
-
// Normalize: add trailing sep so /foo doesn't match /foobar
|
|
164
|
-
const norm = (s) => {
|
|
165
|
-
const withSep = s.endsWith(sep) ? s : s + sep;
|
|
166
|
-
// Case-insensitive on Windows
|
|
167
|
-
return process.platform === 'win32' ? withSep.toLowerCase() : withSep;
|
|
168
|
-
};
|
|
169
|
-
return norm(candidate).startsWith(norm(root));
|
|
170
|
-
}
|
|
171
|
-
async function resolveAbsPath(p) {
|
|
172
|
-
const cwd = await realpath(process.cwd());
|
|
173
|
-
if (!p || p === '.')
|
|
174
|
-
return cwd;
|
|
175
|
-
// Pre-check before stat (catches obvious traversal early)
|
|
176
|
-
const candidate = resolve(cwd, p);
|
|
177
|
-
if (!withinRoot(candidate, cwd)) {
|
|
178
|
-
throw new Error(`Chemin refusé : "${p}" est en dehors du répertoire de travail. Utilisez un chemin relatif.`);
|
|
179
|
-
}
|
|
180
|
-
let real;
|
|
181
|
-
try {
|
|
182
|
-
const s = await stat(candidate);
|
|
183
|
-
if (!s.isDirectory())
|
|
184
|
-
throw new Error(`"${p}" n'est pas un répertoire.`);
|
|
185
|
-
// Resolve symlinks and re-check — prevents symlink escape on Linux/Mac
|
|
186
|
-
real = await realpath(candidate);
|
|
187
|
-
}
|
|
188
|
-
catch (e) {
|
|
189
|
-
if (e instanceof Error && (e.message.startsWith('Chemin refusé') || e.message.startsWith('"')))
|
|
190
|
-
throw e;
|
|
191
|
-
throw new Error(`Répertoire introuvable : "${p}"`);
|
|
192
|
-
}
|
|
193
|
-
if (!withinRoot(real, cwd)) {
|
|
194
|
-
throw new Error(`Chemin refusé : "${p}" pointe (via symlink) en dehors du répertoire de travail.`);
|
|
195
|
-
}
|
|
196
|
-
return real;
|
|
197
|
-
}
|
|
198
|
-
export async function metadataTool(args) {
|
|
199
|
-
const { path: rawPath, depth, includeStats } = args;
|
|
200
|
-
let absPath;
|
|
201
|
-
try {
|
|
202
|
-
absPath = await resolveAbsPath(rawPath);
|
|
203
|
-
}
|
|
204
|
-
catch (e) {
|
|
205
|
-
return {
|
|
206
|
-
isError: true,
|
|
207
|
-
content: [
|
|
208
|
-
{ type: 'text', text: `❌ ${e instanceof Error ? e.message : String(e)}` },
|
|
209
|
-
],
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
const projectName = basename(absPath);
|
|
213
|
-
let output = `# 🗂️ Metadata — \`${projectName}\`\n\n`;
|
|
214
|
-
output += `> **Chemin :** \`${absPath}\`\n\n`;
|
|
215
|
-
// Arborescence
|
|
216
|
-
const tree = await buildTree(absPath, depth);
|
|
217
|
-
output += `## 📁 Arborescence (profondeur ${depth})\n\`\`\`\n${projectName}/\n${renderTree(tree)}\`\`\`\n\n`;
|
|
218
|
-
// Configs
|
|
219
|
-
const configs = await getConfigs(absPath);
|
|
220
|
-
if (Object.keys(configs).length > 0) {
|
|
221
|
-
output += `## ⚙️ Fichiers de configuration\n`;
|
|
222
|
-
for (const [file, content] of Object.entries(configs)) {
|
|
223
|
-
const ext = file.endsWith('.json') ? 'json' : file.endsWith('.md') ? 'markdown' : 'yaml';
|
|
224
|
-
output += `### \`${file}\`\n\`\`\`${ext}\n${content}\n\`\`\`\n\n`;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// Stats
|
|
228
|
-
if (includeStats) {
|
|
229
|
-
const stats = await collectStats(absPath);
|
|
230
|
-
output += `## 📊 Statistiques\n`;
|
|
231
|
-
output += `- **Fichiers sources :** ${stats.totalFiles}\n`;
|
|
232
|
-
output += `- **Lignes totales :** ${stats.totalLines.toLocaleString()}\n`;
|
|
233
|
-
output += `- **Langages :**\n`;
|
|
234
|
-
const sorted = Object.entries(stats.languages).sort((a, b) => b[1] - a[1]);
|
|
235
|
-
for (const [lang, count] of sorted) {
|
|
236
|
-
output += ` - ${lang}: ${count} fichier${count > 1 ? 's' : ''}\n`;
|
|
237
|
-
}
|
|
238
|
-
output += `\n## 📋 Fichiers sources (${stats.totalFiles})\n\`\`\`\n`;
|
|
239
|
-
output += stats.filePaths.join('\n');
|
|
240
|
-
output += `\n\`\`\`\n`;
|
|
241
|
-
}
|
|
242
|
-
return {
|
|
243
|
-
content: [{ type: 'text', text: output }],
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
//# sourceMappingURL=metadata.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/tools/metadata.ts"],"names":[],"mappings":"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"}
|