skhaall-codeguard 0.1.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/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +295 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/indexer.d.ts +21 -0
- package/dist/core/indexer.d.ts.map +1 -0
- package/dist/core/indexer.js +96 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +37 -0
- package/dist/graph/dependency-graph.d.ts.map +1 -0
- package/dist/graph/dependency-graph.js +94 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/impact-resolver.d.ts +40 -0
- package/dist/graph/impact-resolver.d.ts.map +1 -0
- package/dist/graph/impact-resolver.js +108 -0
- package/dist/graph/impact-resolver.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +299 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/base-parser.d.ts +111 -0
- package/dist/parsers/base-parser.d.ts.map +1 -0
- package/dist/parsers/base-parser.js +7 -0
- package/dist/parsers/base-parser.js.map +1 -0
- package/dist/parsers/detector.d.ts +10 -0
- package/dist/parsers/detector.d.ts.map +1 -0
- package/dist/parsers/detector.js +61 -0
- package/dist/parsers/detector.js.map +1 -0
- package/dist/parsers/extractors/api-calls.d.ts +10 -0
- package/dist/parsers/extractors/api-calls.d.ts.map +1 -0
- package/dist/parsers/extractors/api-calls.js +99 -0
- package/dist/parsers/extractors/api-calls.js.map +1 -0
- package/dist/parsers/extractors/auth-guards.d.ts +8 -0
- package/dist/parsers/extractors/auth-guards.d.ts.map +1 -0
- package/dist/parsers/extractors/auth-guards.js +23 -0
- package/dist/parsers/extractors/auth-guards.js.map +1 -0
- package/dist/parsers/prisma-parser.d.ts +45 -0
- package/dist/parsers/prisma-parser.d.ts.map +1 -0
- package/dist/parsers/prisma-parser.js +197 -0
- package/dist/parsers/prisma-parser.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +28 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +374 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +135 -0
- package/dist/setup.js.map +1 -0
- package/dist/storage/index-store.d.ts +36 -0
- package/dist/storage/index-store.d.ts.map +1 -0
- package/dist/storage/index-store.js +108 -0
- package/dist/storage/index-store.js.map +1 -0
- package/dist/tools/changelog.d.ts +36 -0
- package/dist/tools/changelog.d.ts.map +1 -0
- package/dist/tools/changelog.js +212 -0
- package/dist/tools/changelog.js.map +1 -0
- package/dist/tools/check.d.ts +31 -0
- package/dist/tools/check.d.ts.map +1 -0
- package/dist/tools/check.js +180 -0
- package/dist/tools/check.js.map +1 -0
- package/dist/tools/graph.d.ts +20 -0
- package/dist/tools/graph.d.ts.map +1 -0
- package/dist/tools/graph.js +192 -0
- package/dist/tools/graph.js.map +1 -0
- package/dist/tools/guard.d.ts +30 -0
- package/dist/tools/guard.d.ts.map +1 -0
- package/dist/tools/guard.js +132 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/health.d.ts +33 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +241 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/impact.d.ts +10 -0
- package/dist/tools/impact.d.ts.map +1 -0
- package/dist/tools/impact.js +45 -0
- package/dist/tools/impact.js.map +1 -0
- package/dist/tools/regression.d.ts +29 -0
- package/dist/tools/regression.d.ts.map +1 -0
- package/dist/tools/regression.js +151 -0
- package/dist/tools/regression.js.map +1 -0
- package/dist/tools/routes.d.ts +40 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +203 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +37 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +214 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/search.d.ts +18 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +99 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tool-definitions.d.ts +15 -0
- package/dist/tools/tool-definitions.d.ts.map +1 -0
- package/dist/tools/tool-definitions.js +157 -0
- package/dist/tools/tool-definitions.js.map +1 -0
- package/dist/utils/import-resolver.d.ts +33 -0
- package/dist/utils/import-resolver.d.ts.map +1 -0
- package/dist/utils/import-resolver.js +150 -0
- package/dist/utils/import-resolver.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +6 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +12 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/scanner.d.ts +13 -0
- package/dist/utils/scanner.d.ts.map +1 -0
- package/dist/utils/scanner.js +55 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/validators.d.ts +45 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +54 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stockage de la carte du projet en JSON.
|
|
3
|
+
* La carte est sauvegardee dans .codeguard/index.json a la racine du projet cible.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, statSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { validateProjectIndex } from '../utils/validators.js';
|
|
9
|
+
const MAX_INDEX_BYTES = 52_428_800; // 50 Mo
|
|
10
|
+
export class IndexStore {
|
|
11
|
+
indexPath;
|
|
12
|
+
snapshotPath;
|
|
13
|
+
codeguardDir;
|
|
14
|
+
constructor(projectRoot) {
|
|
15
|
+
this.codeguardDir = join(projectRoot, '.codeguard');
|
|
16
|
+
this.indexPath = join(this.codeguardDir, 'index.json');
|
|
17
|
+
this.snapshotPath = join(this.codeguardDir, 'snapshot.json');
|
|
18
|
+
}
|
|
19
|
+
/** Charge l'index existant ou retourne null */
|
|
20
|
+
load() {
|
|
21
|
+
if (!existsSync(this.indexPath))
|
|
22
|
+
return null;
|
|
23
|
+
try {
|
|
24
|
+
const size = statSync(this.indexPath).size;
|
|
25
|
+
if (size > MAX_INDEX_BYTES) {
|
|
26
|
+
logger.warn('Index trop volumineux, ignore', { size, maxBytes: MAX_INDEX_BYTES });
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const raw = readFileSync(this.indexPath, 'utf-8');
|
|
30
|
+
const parsed = JSON.parse(raw);
|
|
31
|
+
if (!validateProjectIndex(parsed)) {
|
|
32
|
+
logger.warn('Index invalide (schema non conforme), sera re-genere');
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return parsed;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger.warn('Index corrompu, sera re-genere', {
|
|
39
|
+
error: error instanceof Error ? error.message : String(error),
|
|
40
|
+
});
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Sauvegarde l'index complet */
|
|
45
|
+
save(index) {
|
|
46
|
+
if (!existsSync(this.codeguardDir)) {
|
|
47
|
+
mkdirSync(this.codeguardDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
writeFileSync(this.indexPath, JSON.stringify(index, null, 2), 'utf-8');
|
|
50
|
+
logger.info('Index sauvegarde', { fileCount: index.fileCount });
|
|
51
|
+
}
|
|
52
|
+
/** Met a jour un seul fichier dans l'index (re-indexation incrementale) */
|
|
53
|
+
updateFile(index, node) {
|
|
54
|
+
index.files[node.filePath] = node;
|
|
55
|
+
index.fileCount = Object.keys(index.files).length;
|
|
56
|
+
index.indexedAt = Date.now();
|
|
57
|
+
return index;
|
|
58
|
+
}
|
|
59
|
+
/** Supprime un fichier de l'index */
|
|
60
|
+
removeFile(index, filePath) {
|
|
61
|
+
delete index.files[filePath];
|
|
62
|
+
index.fileCount = Object.keys(index.files).length;
|
|
63
|
+
index.indexedAt = Date.now();
|
|
64
|
+
return index;
|
|
65
|
+
}
|
|
66
|
+
/** Verifie si l'index existe */
|
|
67
|
+
exists() {
|
|
68
|
+
return existsSync(this.indexPath);
|
|
69
|
+
}
|
|
70
|
+
/** Sauvegarde l'index actuel comme snapshot (avant un reindex) */
|
|
71
|
+
saveSnapshot() {
|
|
72
|
+
if (!existsSync(this.indexPath))
|
|
73
|
+
return;
|
|
74
|
+
try {
|
|
75
|
+
const raw = readFileSync(this.indexPath, 'utf-8');
|
|
76
|
+
if (!existsSync(this.codeguardDir)) {
|
|
77
|
+
mkdirSync(this.codeguardDir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
writeFileSync(this.snapshotPath, raw, 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
logger.warn('Impossible de sauvegarder le snapshot', {
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Charge le snapshot precedent ou retourne null */
|
|
88
|
+
loadSnapshot() {
|
|
89
|
+
if (!existsSync(this.snapshotPath))
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
const size = statSync(this.snapshotPath).size;
|
|
93
|
+
if (size > MAX_INDEX_BYTES)
|
|
94
|
+
return null;
|
|
95
|
+
const raw = readFileSync(this.snapshotPath, 'utf-8');
|
|
96
|
+
const parsed = JSON.parse(raw);
|
|
97
|
+
if (!validateProjectIndex(parsed)) {
|
|
98
|
+
logger.warn('Snapshot invalide (schema non conforme), ignore');
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return parsed;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=index-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-store.js","sourceRoot":"","sources":["../../src/storage/index-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,QAAQ;AAa5C,MAAM,OAAO,UAAU;IACb,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,YAAY,CAAS;IAE7B,YAAY,WAAmB;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IAED,+CAA+C;IAC/C,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;YAC3C,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;gBAClF,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAsB,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;gBAC5C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,CAAC,KAAmB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,2EAA2E;IAC3E,UAAU,CAAC,KAAmB,EAAE,IAAc;QAC5C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAClC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAClD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,UAAU,CAAC,KAAmB,EAAE,QAAgB;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7B,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;QAClD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gCAAgC;IAChC,MAAM;QACJ,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED,kEAAkE;IAClE,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO;QACxC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE;gBACnD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,oDAAoD;IACpD,YAAY;QACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;YAC9C,IAAI,IAAI,GAAG,eAAe;gBAAE,OAAO,IAAI,CAAC;YACxC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,MAAsB,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outil MCP : changelog
|
|
3
|
+
* Compare l'ancien index (snapshot) avec l'index actuel.
|
|
4
|
+
* Genere un diff lisible : fichiers, exports, routes, types ajoutes/supprimes.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectIndex } from '../storage/index-store.js';
|
|
7
|
+
export interface ChangelogEntry {
|
|
8
|
+
category: 'file' | 'export' | 'route' | 'type' | 'import';
|
|
9
|
+
action: 'added' | 'removed' | 'modified';
|
|
10
|
+
description: string;
|
|
11
|
+
filePath: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ChangelogResult {
|
|
14
|
+
/** Snapshot disponible ? */
|
|
15
|
+
hasSnapshot: boolean;
|
|
16
|
+
/** Date du snapshot */
|
|
17
|
+
snapshotDate: number | null;
|
|
18
|
+
/** Date de l'index actuel */
|
|
19
|
+
currentDate: number;
|
|
20
|
+
/** Liste des changements */
|
|
21
|
+
entries: ChangelogEntry[];
|
|
22
|
+
/** Resume */
|
|
23
|
+
summary: {
|
|
24
|
+
filesAdded: number;
|
|
25
|
+
filesRemoved: number;
|
|
26
|
+
filesModified: number;
|
|
27
|
+
exportsAdded: number;
|
|
28
|
+
exportsRemoved: number;
|
|
29
|
+
routesAdded: number;
|
|
30
|
+
routesRemoved: number;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export declare function runChangelog(current: ProjectIndex, snapshot: ProjectIndex | null): ChangelogResult;
|
|
34
|
+
/** Formate le resultat pour affichage MCP */
|
|
35
|
+
export declare function formatChangelogResult(result: ChangelogResult): string;
|
|
36
|
+
//# sourceMappingURL=changelog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/tools/changelog.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1D,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,aAAa;IACb,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,eAAe,CA2FlG;AAuFD,6CAA6C;AAC7C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAoDrE"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outil MCP : changelog
|
|
3
|
+
* Compare l'ancien index (snapshot) avec l'index actuel.
|
|
4
|
+
* Genere un diff lisible : fichiers, exports, routes, types ajoutes/supprimes.
|
|
5
|
+
*/
|
|
6
|
+
export function runChangelog(current, snapshot) {
|
|
7
|
+
if (!snapshot) {
|
|
8
|
+
return {
|
|
9
|
+
hasSnapshot: false,
|
|
10
|
+
snapshotDate: null,
|
|
11
|
+
currentDate: current.indexedAt,
|
|
12
|
+
entries: [],
|
|
13
|
+
summary: { filesAdded: 0, filesRemoved: 0, filesModified: 0, exportsAdded: 0, exportsRemoved: 0, routesAdded: 0, routesRemoved: 0 },
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const entries = [];
|
|
17
|
+
const currentFiles = new Set(Object.keys(current.files));
|
|
18
|
+
const snapshotFiles = new Set(Object.keys(snapshot.files));
|
|
19
|
+
let filesAdded = 0;
|
|
20
|
+
let filesRemoved = 0;
|
|
21
|
+
let filesModified = 0;
|
|
22
|
+
let exportsAdded = 0;
|
|
23
|
+
let exportsRemoved = 0;
|
|
24
|
+
let routesAdded = 0;
|
|
25
|
+
let routesRemoved = 0;
|
|
26
|
+
// Fichiers ajoutes
|
|
27
|
+
for (const filePath of currentFiles) {
|
|
28
|
+
if (!snapshotFiles.has(filePath)) {
|
|
29
|
+
filesAdded++;
|
|
30
|
+
entries.push({ category: 'file', action: 'added', description: `Nouveau fichier`, filePath });
|
|
31
|
+
// Tous les exports de ce fichier sont "nouveaux"
|
|
32
|
+
const node = current.files[filePath];
|
|
33
|
+
for (const exp of node.exports) {
|
|
34
|
+
exportsAdded++;
|
|
35
|
+
entries.push({ category: 'export', action: 'added', description: `Export ajoute : ${exp.name} (${exp.kind})`, filePath });
|
|
36
|
+
}
|
|
37
|
+
for (const route of node.routes) {
|
|
38
|
+
routesAdded++;
|
|
39
|
+
entries.push({ category: 'route', action: 'added', description: `Route ajoutee : ${route.method} ${route.path}`, filePath });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Fichiers supprimes
|
|
44
|
+
for (const filePath of snapshotFiles) {
|
|
45
|
+
if (!currentFiles.has(filePath)) {
|
|
46
|
+
filesRemoved++;
|
|
47
|
+
entries.push({ category: 'file', action: 'removed', description: `Fichier supprime`, filePath });
|
|
48
|
+
const node = snapshot.files[filePath];
|
|
49
|
+
for (const exp of node.exports) {
|
|
50
|
+
exportsRemoved++;
|
|
51
|
+
entries.push({ category: 'export', action: 'removed', description: `Export supprime : ${exp.name} (${exp.kind})`, filePath });
|
|
52
|
+
}
|
|
53
|
+
for (const route of node.routes) {
|
|
54
|
+
routesRemoved++;
|
|
55
|
+
entries.push({ category: 'route', action: 'removed', description: `Route supprimee : ${route.method} ${route.path}`, filePath });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Fichiers modifies (presents dans les deux mais differents)
|
|
60
|
+
for (const filePath of currentFiles) {
|
|
61
|
+
if (!snapshotFiles.has(filePath))
|
|
62
|
+
continue;
|
|
63
|
+
const oldNode = snapshot.files[filePath];
|
|
64
|
+
const newNode = current.files[filePath];
|
|
65
|
+
const changes = diffFileNode(oldNode, newNode);
|
|
66
|
+
if (changes.length > 0) {
|
|
67
|
+
filesModified++;
|
|
68
|
+
for (const change of changes) {
|
|
69
|
+
entries.push({ ...change, filePath });
|
|
70
|
+
if (change.category === 'export') {
|
|
71
|
+
if (change.action === 'added')
|
|
72
|
+
exportsAdded++;
|
|
73
|
+
if (change.action === 'removed')
|
|
74
|
+
exportsRemoved++;
|
|
75
|
+
}
|
|
76
|
+
if (change.category === 'route') {
|
|
77
|
+
if (change.action === 'added')
|
|
78
|
+
routesAdded++;
|
|
79
|
+
if (change.action === 'removed')
|
|
80
|
+
routesRemoved++;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
hasSnapshot: true,
|
|
87
|
+
snapshotDate: snapshot.indexedAt,
|
|
88
|
+
currentDate: current.indexedAt,
|
|
89
|
+
entries,
|
|
90
|
+
summary: { filesAdded, filesRemoved, filesModified, exportsAdded, exportsRemoved, routesAdded, routesRemoved },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Compare deux FileNode et retourne les differences */
|
|
94
|
+
function diffFileNode(oldNode, newNode) {
|
|
95
|
+
const changes = [];
|
|
96
|
+
// Diff exports
|
|
97
|
+
const oldExports = new Map(oldNode.exports.map((e) => [exportKey(e), e]));
|
|
98
|
+
const newExports = new Map(newNode.exports.map((e) => [exportKey(e), e]));
|
|
99
|
+
for (const [key, exp] of newExports) {
|
|
100
|
+
if (!oldExports.has(key)) {
|
|
101
|
+
changes.push({ category: 'export', action: 'added', description: `Export ajoute : ${exp.name} (${exp.kind})` });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const [key, exp] of oldExports) {
|
|
105
|
+
if (!newExports.has(key)) {
|
|
106
|
+
changes.push({ category: 'export', action: 'removed', description: `Export supprime : ${exp.name} (${exp.kind})` });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Diff routes
|
|
110
|
+
const oldRoutes = new Map(oldNode.routes.map((r) => [routeKey(r), r]));
|
|
111
|
+
const newRoutes = new Map(newNode.routes.map((r) => [routeKey(r), r]));
|
|
112
|
+
for (const [key, route] of newRoutes) {
|
|
113
|
+
if (!oldRoutes.has(key)) {
|
|
114
|
+
changes.push({ category: 'route', action: 'added', description: `Route ajoutee : ${route.method} ${route.path}` });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const [key, route] of oldRoutes) {
|
|
118
|
+
if (!newRoutes.has(key)) {
|
|
119
|
+
changes.push({ category: 'route', action: 'removed', description: `Route supprimee : ${route.method} ${route.path}` });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Diff types (proprietes ajoutees/supprimees dans les interfaces)
|
|
123
|
+
const oldTypes = new Map(oldNode.types.map((t) => [t.name, t]));
|
|
124
|
+
const newTypes = new Map(newNode.types.map((t) => [t.name, t]));
|
|
125
|
+
for (const [name, newType] of newTypes) {
|
|
126
|
+
const oldType = oldTypes.get(name);
|
|
127
|
+
if (!oldType)
|
|
128
|
+
continue; // nouveau type = deja couvert par les exports
|
|
129
|
+
const oldProps = new Set(oldType.properties.map((p) => `${p.name}:${p.type}`));
|
|
130
|
+
const newProps = new Set(newType.properties.map((p) => `${p.name}:${p.type}`));
|
|
131
|
+
for (const prop of newProps) {
|
|
132
|
+
if (!oldProps.has(prop)) {
|
|
133
|
+
const propName = prop.split(':')[0];
|
|
134
|
+
changes.push({ category: 'type', action: 'modified', description: `Type ${name} : propriete ajoutee "${propName}"` });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
for (const prop of oldProps) {
|
|
138
|
+
if (!newProps.has(prop)) {
|
|
139
|
+
const propName = prop.split(':')[0];
|
|
140
|
+
changes.push({ category: 'type', action: 'modified', description: `Type ${name} : propriete supprimee "${propName}"` });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Diff imports (nouveaux imports / imports supprimes)
|
|
145
|
+
const oldImportSources = new Set(oldNode.imports.map((i) => i.source));
|
|
146
|
+
const newImportSources = new Set(newNode.imports.map((i) => i.source));
|
|
147
|
+
for (const source of newImportSources) {
|
|
148
|
+
if (!oldImportSources.has(source)) {
|
|
149
|
+
changes.push({ category: 'import', action: 'added', description: `Import ajoute : ${source}` });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
for (const source of oldImportSources) {
|
|
153
|
+
if (!newImportSources.has(source)) {
|
|
154
|
+
changes.push({ category: 'import', action: 'removed', description: `Import supprime : ${source}` });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return changes;
|
|
158
|
+
}
|
|
159
|
+
function exportKey(exp) {
|
|
160
|
+
return `${exp.name}:${exp.kind}`;
|
|
161
|
+
}
|
|
162
|
+
function routeKey(route) {
|
|
163
|
+
return `${route.method}:${route.path}`;
|
|
164
|
+
}
|
|
165
|
+
/** Formate le resultat pour affichage MCP */
|
|
166
|
+
export function formatChangelogResult(result) {
|
|
167
|
+
const lines = [];
|
|
168
|
+
lines.push('## Changelog');
|
|
169
|
+
if (!result.hasSnapshot) {
|
|
170
|
+
lines.push('');
|
|
171
|
+
lines.push('> Pas de snapshot disponible. Le changelog sera disponible apres le prochain reindex.');
|
|
172
|
+
lines.push('> (Le reindex sauvegarde automatiquement un snapshot de l\'ancien index)');
|
|
173
|
+
return lines.join('\n');
|
|
174
|
+
}
|
|
175
|
+
if (result.snapshotDate === null)
|
|
176
|
+
return lines.join('\n');
|
|
177
|
+
const snapshotDate = new Date(result.snapshotDate).toLocaleString('fr-FR');
|
|
178
|
+
const currentDate = new Date(result.currentDate).toLocaleString('fr-FR');
|
|
179
|
+
lines.push(`- Avant : ${snapshotDate}`);
|
|
180
|
+
lines.push(`- Apres : ${currentDate}`);
|
|
181
|
+
const s = result.summary;
|
|
182
|
+
if (s.filesAdded + s.filesRemoved + s.filesModified === 0) {
|
|
183
|
+
lines.push('');
|
|
184
|
+
lines.push('> Aucun changement detecte depuis le dernier reindex.');
|
|
185
|
+
return lines.join('\n');
|
|
186
|
+
}
|
|
187
|
+
lines.push(`- Fichiers : +${s.filesAdded} / -${s.filesRemoved} / ~${s.filesModified}`);
|
|
188
|
+
lines.push(`- Exports : +${s.exportsAdded} / -${s.exportsRemoved}`);
|
|
189
|
+
lines.push(`- Routes : +${s.routesAdded} / -${s.routesRemoved}`);
|
|
190
|
+
// Grouper par fichier
|
|
191
|
+
const byFile = new Map();
|
|
192
|
+
for (const entry of result.entries) {
|
|
193
|
+
const existing = byFile.get(entry.filePath) ?? [];
|
|
194
|
+
existing.push(entry);
|
|
195
|
+
byFile.set(entry.filePath, existing);
|
|
196
|
+
}
|
|
197
|
+
for (const [filePath, entries] of byFile) {
|
|
198
|
+
lines.push('');
|
|
199
|
+
const shortPath = filePath.replace(/\\/g, '/').replace(/.*\/src\//, 'src/');
|
|
200
|
+
const fileEntry = entries.find((e) => e.category === 'file');
|
|
201
|
+
const icon = fileEntry?.action === 'added' ? '(+)' : fileEntry?.action === 'removed' ? '(-)' : '(~)';
|
|
202
|
+
lines.push(`### ${icon} ${shortPath}`);
|
|
203
|
+
for (const entry of entries) {
|
|
204
|
+
if (entry.category === 'file')
|
|
205
|
+
continue; // deja dans le titre
|
|
206
|
+
const prefix = entry.action === 'added' ? '+' : entry.action === 'removed' ? '-' : '~';
|
|
207
|
+
lines.push(`- ${prefix} ${entry.description}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return lines.join('\n');
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=changelog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/tools/changelog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outil MCP : check
|
|
3
|
+
* Verification post-modification — detecte les casses apres un changement.
|
|
4
|
+
* Re-parse le fichier modifie, compare avec l'ancien index, signale les problemes.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectIndex } from '../storage/index-store.js';
|
|
7
|
+
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
8
|
+
export interface CheckIssue {
|
|
9
|
+
severity: IssueSeverity;
|
|
10
|
+
message: string;
|
|
11
|
+
file: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CheckResult {
|
|
14
|
+
filePath: string;
|
|
15
|
+
issueCount: number;
|
|
16
|
+
issues: CheckIssue[];
|
|
17
|
+
removedExports: string[];
|
|
18
|
+
addedExports: string[];
|
|
19
|
+
brokenImports: BrokenImport[];
|
|
20
|
+
reindexed: boolean;
|
|
21
|
+
/** Index mis a jour (l'appelant doit le sauvegarder) */
|
|
22
|
+
updatedIndex: ProjectIndex;
|
|
23
|
+
}
|
|
24
|
+
export interface BrokenImport {
|
|
25
|
+
importingFile: string;
|
|
26
|
+
symbolName: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function runCheck(index: ProjectIndex, filePath: string): Promise<CheckResult>;
|
|
29
|
+
/** Formate le resultat pour affichage MCP */
|
|
30
|
+
export declare function formatCheckResult(result: CheckResult): string;
|
|
31
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/tools/check.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAO9D,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,wDAAwD;IACxD,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CAqJtB;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAqC7D"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outil MCP : check
|
|
3
|
+
* Verification post-modification — detecte les casses apres un changement.
|
|
4
|
+
* Re-parse le fichier modifie, compare avec l'ancien index, signale les problemes.
|
|
5
|
+
*/
|
|
6
|
+
import { TypeScriptParser } from '../parsers/typescript-parser.js';
|
|
7
|
+
import { DependencyGraph } from '../graph/dependency-graph.js';
|
|
8
|
+
import { importPointsTo } from '../utils/import-resolver.js';
|
|
9
|
+
import { resolveImportPath } from '../utils/import-resolver.js';
|
|
10
|
+
export async function runCheck(index, filePath) {
|
|
11
|
+
// Travailler sur une copie pour ne pas muter l'original
|
|
12
|
+
const updatedIndex = {
|
|
13
|
+
...index,
|
|
14
|
+
files: { ...index.files },
|
|
15
|
+
};
|
|
16
|
+
const issues = [];
|
|
17
|
+
const removedExports = [];
|
|
18
|
+
const addedExports = [];
|
|
19
|
+
const brokenImports = [];
|
|
20
|
+
const oldNode = index.files[filePath];
|
|
21
|
+
const oldExportNames = new Set((oldNode?.exports ?? []).map((e) => e.name));
|
|
22
|
+
// -- Re-parser le fichier modifie --
|
|
23
|
+
let newNode = null;
|
|
24
|
+
let reindexed = false;
|
|
25
|
+
try {
|
|
26
|
+
const parser = new TypeScriptParser();
|
|
27
|
+
if (parser.canParse(filePath)) {
|
|
28
|
+
newNode = await parser.parseFile(filePath);
|
|
29
|
+
updatedIndex.files[filePath] = newNode;
|
|
30
|
+
updatedIndex.fileCount = Object.keys(updatedIndex.files).length;
|
|
31
|
+
updatedIndex.indexedAt = Date.now();
|
|
32
|
+
reindexed = true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
issues.push({
|
|
37
|
+
severity: 'error',
|
|
38
|
+
message: `Impossible de re-parser : ${error instanceof Error ? error.message : String(error)}`,
|
|
39
|
+
file: filePath,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (!newNode) {
|
|
43
|
+
return { filePath, issueCount: issues.length, issues, removedExports, addedExports, brokenImports, reindexed, updatedIndex };
|
|
44
|
+
}
|
|
45
|
+
// -- Comparer les exports --
|
|
46
|
+
const newExportNames = new Set(newNode.exports.map((e) => e.name));
|
|
47
|
+
for (const name of oldExportNames) {
|
|
48
|
+
if (!newExportNames.has(name))
|
|
49
|
+
removedExports.push(name);
|
|
50
|
+
}
|
|
51
|
+
for (const name of newExportNames) {
|
|
52
|
+
if (!oldExportNames.has(name))
|
|
53
|
+
addedExports.push(name);
|
|
54
|
+
}
|
|
55
|
+
// -- Detecter les imports casses (resolution complete, pas par nom de base) --
|
|
56
|
+
if (removedExports.length > 0) {
|
|
57
|
+
const graph = DependencyGraph.fromIndex(updatedIndex);
|
|
58
|
+
const dependents = graph.getDependents(filePath);
|
|
59
|
+
for (const depFile of dependents) {
|
|
60
|
+
const depNode = updatedIndex.files[depFile];
|
|
61
|
+
if (!depNode)
|
|
62
|
+
continue;
|
|
63
|
+
for (const imp of depNode.imports) {
|
|
64
|
+
if (!imp.source.startsWith('.'))
|
|
65
|
+
continue;
|
|
66
|
+
if (!importPointsTo(imp.source, filePath, depFile, updatedIndex.files, updatedIndex.projectRoot))
|
|
67
|
+
continue;
|
|
68
|
+
if (removedExports.includes(imp.name)) {
|
|
69
|
+
brokenImports.push({ importingFile: depFile, symbolName: imp.name });
|
|
70
|
+
issues.push({
|
|
71
|
+
severity: 'error',
|
|
72
|
+
message: `Import casse : "${imp.name}" n'est plus exporte par ${filePath}`,
|
|
73
|
+
file: depFile,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// -- Suppressions sans casse immediate --
|
|
80
|
+
if (removedExports.length > 0 && brokenImports.length === 0) {
|
|
81
|
+
issues.push({
|
|
82
|
+
severity: 'warning',
|
|
83
|
+
message: `${removedExports.length} export(s) supprime(s) : ${removedExports.join(', ')}. Aucun import casse detecte.`,
|
|
84
|
+
file: filePath,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// -- Comparer les types (changement de shape) --
|
|
88
|
+
if (oldNode) {
|
|
89
|
+
for (const newType of newNode.types) {
|
|
90
|
+
const oldType = oldNode.types.find((t) => t.name === newType.name);
|
|
91
|
+
if (!oldType)
|
|
92
|
+
continue;
|
|
93
|
+
const oldProps = new Set(oldType.properties.map((p) => p.name));
|
|
94
|
+
const newProps = new Set(newType.properties.map((p) => p.name));
|
|
95
|
+
const removedProps = [...oldProps].filter((p) => !newProps.has(p));
|
|
96
|
+
if (removedProps.length > 0) {
|
|
97
|
+
issues.push({
|
|
98
|
+
severity: 'warning',
|
|
99
|
+
message: `Type "${newType.name}" : propriete(s) supprimee(s) : ${removedProps.join(', ')}.`,
|
|
100
|
+
file: filePath,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const addedRequiredProps = newType.properties
|
|
104
|
+
.filter((p) => !oldProps.has(p.name) && !p.isOptional)
|
|
105
|
+
.map((p) => p.name);
|
|
106
|
+
if (addedRequiredProps.length > 0) {
|
|
107
|
+
issues.push({
|
|
108
|
+
severity: 'warning',
|
|
109
|
+
message: `Type "${newType.name}" : nouvelle(s) propriete(s) requise(s) : ${addedRequiredProps.join(', ')}.`,
|
|
110
|
+
file: filePath,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// -- Verifier les imports du fichier modifie (resolution complete) --
|
|
116
|
+
for (const imp of newNode.imports) {
|
|
117
|
+
if (imp.source.startsWith('.')) {
|
|
118
|
+
const resolved = resolveImportPath(filePath, imp.source, updatedIndex.files, updatedIndex.projectRoot);
|
|
119
|
+
if (!resolved) {
|
|
120
|
+
issues.push({
|
|
121
|
+
severity: 'error',
|
|
122
|
+
message: `Import vers "${imp.source}" — fichier cible introuvable.`,
|
|
123
|
+
file: filePath,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// -- Nouveaux exports --
|
|
129
|
+
if (addedExports.length > 0) {
|
|
130
|
+
issues.push({
|
|
131
|
+
severity: 'info',
|
|
132
|
+
message: `${addedExports.length} nouvel(s) export(s) : ${addedExports.join(', ')}`,
|
|
133
|
+
file: filePath,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
filePath,
|
|
138
|
+
issueCount: issues.filter((i) => i.severity === 'error' || i.severity === 'warning').length,
|
|
139
|
+
issues,
|
|
140
|
+
removedExports,
|
|
141
|
+
addedExports,
|
|
142
|
+
brokenImports,
|
|
143
|
+
reindexed,
|
|
144
|
+
updatedIndex,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** Formate le resultat pour affichage MCP */
|
|
148
|
+
export function formatCheckResult(result) {
|
|
149
|
+
const lines = [];
|
|
150
|
+
const icon = result.issueCount === 0 ? 'OK' : 'PROBLEMES';
|
|
151
|
+
lines.push(`## Check : ${icon} — ${result.filePath}`);
|
|
152
|
+
lines.push(`**Re-indexe** : ${result.reindexed ? 'oui' : 'non'}`);
|
|
153
|
+
if (result.removedExports.length > 0) {
|
|
154
|
+
lines.push(`**Exports supprimes** : ${result.removedExports.join(', ')}`);
|
|
155
|
+
}
|
|
156
|
+
if (result.addedExports.length > 0) {
|
|
157
|
+
lines.push(`**Exports ajoutes** : ${result.addedExports.join(', ')}`);
|
|
158
|
+
}
|
|
159
|
+
if (result.brokenImports.length > 0) {
|
|
160
|
+
lines.push('');
|
|
161
|
+
lines.push('### Imports casses');
|
|
162
|
+
for (const bi of result.brokenImports) {
|
|
163
|
+
lines.push(`- **${bi.importingFile}** importe "${bi.symbolName}" qui n'existe plus`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (result.issues.length > 0) {
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push('### Problemes detectes');
|
|
169
|
+
for (const issue of result.issues) {
|
|
170
|
+
const prefix = issue.severity === 'error' ? '/!\\ ' : issue.severity === 'warning' ? '! ' : '';
|
|
171
|
+
lines.push(`- ${prefix}[${issue.severity.toUpperCase()}] ${issue.message}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (result.issueCount === 0) {
|
|
175
|
+
lines.push('');
|
|
176
|
+
lines.push('> Aucun probleme detecte. Le fichier est coherent avec le reste du projet.');
|
|
177
|
+
}
|
|
178
|
+
return lines.join('\n');
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/tools/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outil MCP : graph
|
|
3
|
+
* Genere un diagramme Mermaid du graphe de dependances.
|
|
4
|
+
* Deux modes : complet (tout le projet) ou focus (centre sur un fichier).
|
|
5
|
+
*/
|
|
6
|
+
import type { ProjectIndex } from '../storage/index-store.js';
|
|
7
|
+
export interface GraphResult {
|
|
8
|
+
/** Code Mermaid du diagramme */
|
|
9
|
+
mermaid: string;
|
|
10
|
+
/** Nombre de noeuds dans le diagramme */
|
|
11
|
+
nodeCount: number;
|
|
12
|
+
/** Nombre d'aretes dans le diagramme */
|
|
13
|
+
edgeCount: number;
|
|
14
|
+
/** Mode utilise */
|
|
15
|
+
mode: 'full' | 'focus';
|
|
16
|
+
}
|
|
17
|
+
export declare function generateGraph(index: ProjectIndex, focusFile?: string): GraphResult;
|
|
18
|
+
/** Formate le resultat pour affichage MCP */
|
|
19
|
+
export declare function formatGraphResult(result: GraphResult): string;
|
|
20
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/tools/graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAQb;AAiMD,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAW7D"}
|