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.
Files changed (119) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/cli.d.ts +16 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +295 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/indexer.d.ts +21 -0
  8. package/dist/core/indexer.d.ts.map +1 -0
  9. package/dist/core/indexer.js +96 -0
  10. package/dist/core/indexer.js.map +1 -0
  11. package/dist/graph/dependency-graph.d.ts +37 -0
  12. package/dist/graph/dependency-graph.d.ts.map +1 -0
  13. package/dist/graph/dependency-graph.js +94 -0
  14. package/dist/graph/dependency-graph.js.map +1 -0
  15. package/dist/graph/impact-resolver.d.ts +40 -0
  16. package/dist/graph/impact-resolver.d.ts.map +1 -0
  17. package/dist/graph/impact-resolver.js +108 -0
  18. package/dist/graph/impact-resolver.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +299 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/parsers/base-parser.d.ts +111 -0
  24. package/dist/parsers/base-parser.d.ts.map +1 -0
  25. package/dist/parsers/base-parser.js +7 -0
  26. package/dist/parsers/base-parser.js.map +1 -0
  27. package/dist/parsers/detector.d.ts +10 -0
  28. package/dist/parsers/detector.d.ts.map +1 -0
  29. package/dist/parsers/detector.js +61 -0
  30. package/dist/parsers/detector.js.map +1 -0
  31. package/dist/parsers/extractors/api-calls.d.ts +10 -0
  32. package/dist/parsers/extractors/api-calls.d.ts.map +1 -0
  33. package/dist/parsers/extractors/api-calls.js +99 -0
  34. package/dist/parsers/extractors/api-calls.js.map +1 -0
  35. package/dist/parsers/extractors/auth-guards.d.ts +8 -0
  36. package/dist/parsers/extractors/auth-guards.d.ts.map +1 -0
  37. package/dist/parsers/extractors/auth-guards.js +23 -0
  38. package/dist/parsers/extractors/auth-guards.js.map +1 -0
  39. package/dist/parsers/prisma-parser.d.ts +45 -0
  40. package/dist/parsers/prisma-parser.d.ts.map +1 -0
  41. package/dist/parsers/prisma-parser.js +197 -0
  42. package/dist/parsers/prisma-parser.js.map +1 -0
  43. package/dist/parsers/typescript-parser.d.ts +28 -0
  44. package/dist/parsers/typescript-parser.d.ts.map +1 -0
  45. package/dist/parsers/typescript-parser.js +374 -0
  46. package/dist/parsers/typescript-parser.js.map +1 -0
  47. package/dist/setup.d.ts +10 -0
  48. package/dist/setup.d.ts.map +1 -0
  49. package/dist/setup.js +135 -0
  50. package/dist/setup.js.map +1 -0
  51. package/dist/storage/index-store.d.ts +36 -0
  52. package/dist/storage/index-store.d.ts.map +1 -0
  53. package/dist/storage/index-store.js +108 -0
  54. package/dist/storage/index-store.js.map +1 -0
  55. package/dist/tools/changelog.d.ts +36 -0
  56. package/dist/tools/changelog.d.ts.map +1 -0
  57. package/dist/tools/changelog.js +212 -0
  58. package/dist/tools/changelog.js.map +1 -0
  59. package/dist/tools/check.d.ts +31 -0
  60. package/dist/tools/check.d.ts.map +1 -0
  61. package/dist/tools/check.js +180 -0
  62. package/dist/tools/check.js.map +1 -0
  63. package/dist/tools/graph.d.ts +20 -0
  64. package/dist/tools/graph.d.ts.map +1 -0
  65. package/dist/tools/graph.js +192 -0
  66. package/dist/tools/graph.js.map +1 -0
  67. package/dist/tools/guard.d.ts +30 -0
  68. package/dist/tools/guard.d.ts.map +1 -0
  69. package/dist/tools/guard.js +132 -0
  70. package/dist/tools/guard.js.map +1 -0
  71. package/dist/tools/health.d.ts +33 -0
  72. package/dist/tools/health.d.ts.map +1 -0
  73. package/dist/tools/health.js +241 -0
  74. package/dist/tools/health.js.map +1 -0
  75. package/dist/tools/impact.d.ts +10 -0
  76. package/dist/tools/impact.d.ts.map +1 -0
  77. package/dist/tools/impact.js +45 -0
  78. package/dist/tools/impact.js.map +1 -0
  79. package/dist/tools/regression.d.ts +29 -0
  80. package/dist/tools/regression.d.ts.map +1 -0
  81. package/dist/tools/regression.js +151 -0
  82. package/dist/tools/regression.js.map +1 -0
  83. package/dist/tools/routes.d.ts +40 -0
  84. package/dist/tools/routes.d.ts.map +1 -0
  85. package/dist/tools/routes.js +203 -0
  86. package/dist/tools/routes.js.map +1 -0
  87. package/dist/tools/schema.d.ts +37 -0
  88. package/dist/tools/schema.d.ts.map +1 -0
  89. package/dist/tools/schema.js +214 -0
  90. package/dist/tools/schema.js.map +1 -0
  91. package/dist/tools/search.d.ts +18 -0
  92. package/dist/tools/search.d.ts.map +1 -0
  93. package/dist/tools/search.js +99 -0
  94. package/dist/tools/search.js.map +1 -0
  95. package/dist/tools/tool-definitions.d.ts +15 -0
  96. package/dist/tools/tool-definitions.d.ts.map +1 -0
  97. package/dist/tools/tool-definitions.js +157 -0
  98. package/dist/tools/tool-definitions.js.map +1 -0
  99. package/dist/utils/import-resolver.d.ts +33 -0
  100. package/dist/utils/import-resolver.d.ts.map +1 -0
  101. package/dist/utils/import-resolver.js +150 -0
  102. package/dist/utils/import-resolver.js.map +1 -0
  103. package/dist/utils/logger.d.ts +15 -0
  104. package/dist/utils/logger.d.ts.map +1 -0
  105. package/dist/utils/logger.js +49 -0
  106. package/dist/utils/logger.js.map +1 -0
  107. package/dist/utils/path.d.ts +6 -0
  108. package/dist/utils/path.d.ts.map +1 -0
  109. package/dist/utils/path.js +12 -0
  110. package/dist/utils/path.js.map +1 -0
  111. package/dist/utils/scanner.d.ts +13 -0
  112. package/dist/utils/scanner.d.ts.map +1 -0
  113. package/dist/utils/scanner.js +55 -0
  114. package/dist/utils/scanner.js.map +1 -0
  115. package/dist/utils/validators.d.ts +45 -0
  116. package/dist/utils/validators.d.ts.map +1 -0
  117. package/dist/utils/validators.js +54 -0
  118. package/dist/utils/validators.js.map +1 -0
  119. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/tools/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Outil MCP : impact
3
+ * "Je modifie ce fichier — qu'est-ce qui est touche ?"
4
+ */
5
+ import type { ProjectIndex } from '../storage/index-store.js';
6
+ import type { ImpactResult } from '../graph/impact-resolver.js';
7
+ export declare function runImpactAnalysis(index: ProjectIndex, filePath: string): ImpactResult;
8
+ /** Formate le resultat pour affichage MCP (texte lisible) */
9
+ export declare function formatImpactResult(result: ImpactResult): string;
10
+ //# sourceMappingURL=impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.d.ts","sourceRoot":"","sources":["../../src/tools/impact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAGrF;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyC/D"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Outil MCP : impact
3
+ * "Je modifie ce fichier — qu'est-ce qui est touche ?"
4
+ */
5
+ import { ImpactResolver } from '../graph/impact-resolver.js';
6
+ export function runImpactAnalysis(index, filePath) {
7
+ const resolver = new ImpactResolver(index);
8
+ return resolver.resolve(filePath);
9
+ }
10
+ /** Formate le resultat pour affichage MCP (texte lisible) */
11
+ export function formatImpactResult(result) {
12
+ const lines = [];
13
+ lines.push(`## Impact : ${result.sourceFile}`);
14
+ lines.push(`**Risque** : ${result.risk.toUpperCase()} — ${result.riskReasons.join(', ')}`);
15
+ lines.push(`**Fichiers impactes** : ${result.impactCount}`);
16
+ if (result.directDependents.length > 0) {
17
+ lines.push('');
18
+ lines.push('### Dependants directs');
19
+ for (const dep of result.directDependents) {
20
+ lines.push(`- ${dep}`);
21
+ }
22
+ }
23
+ if (result.allDependents.length > result.directDependents.length) {
24
+ lines.push('');
25
+ lines.push('### Cascade (transitif)');
26
+ const indirect = result.allDependents.filter((d) => !result.directDependents.includes(d));
27
+ for (const dep of indirect) {
28
+ lines.push(`- ${dep}`);
29
+ }
30
+ }
31
+ if (result.affectedRoutes.length > 0) {
32
+ lines.push('');
33
+ lines.push('### Routes API affectees');
34
+ for (const route of result.affectedRoutes) {
35
+ lines.push(`- ${route.method} ${route.path} (${route.handler})`);
36
+ }
37
+ }
38
+ if (result.affectedExports.length > 0) {
39
+ lines.push('');
40
+ lines.push('### Exports concernes');
41
+ lines.push(result.affectedExports.join(', '));
42
+ }
43
+ return lines.join('\n');
44
+ }
45
+ //# sourceMappingURL=impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/tools/impact.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,QAAgB;IACrE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5C,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Outil MCP : regression_map
3
+ * "Je modifie ce fichier — quelles pages/routes dois-je retester ?"
4
+ * Utilise le graphe transitif pour trouver les fichiers "terminaux"
5
+ * (pages, routes API, entry points) impactes par un changement.
6
+ */
7
+ import type { ProjectIndex } from '../storage/index-store.js';
8
+ export interface RegressionTarget {
9
+ /** Chemin du fichier terminal (page, route, entry point) */
10
+ filePath: string;
11
+ /** Type de cible */
12
+ kind: 'page' | 'api-route' | 'entry-point' | 'component';
13
+ /** URL/route associee si applicable */
14
+ route?: string;
15
+ /** Distance dans le graphe (1 = dependant direct, 2+ = transitif) */
16
+ depth: number;
17
+ }
18
+ export interface RegressionResult {
19
+ /** Fichier source modifie */
20
+ sourceFile: string;
21
+ /** Pages/routes a retester */
22
+ targets: RegressionTarget[];
23
+ /** Nombre total de cibles */
24
+ targetCount: number;
25
+ }
26
+ export declare function runRegressionMap(index: ProjectIndex, filePath: string): RegressionResult;
27
+ /** Formate le resultat pour affichage MCP */
28
+ export declare function formatRegressionResult(result: RegressionResult): string;
29
+ //# sourceMappingURL=regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/tools/regression.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,CAAC;IACzD,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CA8CxF;AAuED,6CAA6C;AAC7C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAkDvE"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Outil MCP : regression_map
3
+ * "Je modifie ce fichier — quelles pages/routes dois-je retester ?"
4
+ * Utilise le graphe transitif pour trouver les fichiers "terminaux"
5
+ * (pages, routes API, entry points) impactes par un changement.
6
+ */
7
+ import { DependencyGraph } from '../graph/dependency-graph.js';
8
+ import { toShortPath } from '../utils/path.js';
9
+ export function runRegressionMap(index, filePath) {
10
+ const graph = DependencyGraph.fromIndex(index);
11
+ const targets = [];
12
+ // BFS depuis le fichier modifie pour trouver les fichiers terminaux
13
+ const visited = new Set();
14
+ const queue = [{ file: filePath, depth: 0 }];
15
+ while (queue.length > 0) {
16
+ const { file, depth } = queue.shift();
17
+ const dependents = graph.getDependents(file);
18
+ for (const dep of dependents) {
19
+ if (visited.has(dep))
20
+ continue;
21
+ visited.add(dep);
22
+ const node = index.files[dep];
23
+ const kind = classifyFile(dep, node);
24
+ if (kind) {
25
+ targets.push({
26
+ filePath: dep,
27
+ kind,
28
+ route: extractRoute(dep, node),
29
+ depth: depth + 1,
30
+ });
31
+ }
32
+ // Continuer le BFS meme si c'est une cible (il peut y avoir des cibles plus loin)
33
+ queue.push({ file: dep, depth: depth + 1 });
34
+ }
35
+ }
36
+ // Trier : pages et routes API d'abord, puis par profondeur
37
+ targets.sort((a, b) => {
38
+ const kindOrder = { 'page': 0, 'api-route': 1, 'entry-point': 2, 'component': 3 };
39
+ const kindDiff = kindOrder[a.kind] - kindOrder[b.kind];
40
+ if (kindDiff !== 0)
41
+ return kindDiff;
42
+ return a.depth - b.depth;
43
+ });
44
+ return {
45
+ sourceFile: filePath,
46
+ targets,
47
+ targetCount: targets.length,
48
+ };
49
+ }
50
+ /** Classifie un fichier selon son role dans le projet */
51
+ function classifyFile(filePath, node) {
52
+ const normalized = filePath.replace(/\\/g, '/');
53
+ // Pages Next.js (app/**/page.tsx)
54
+ if (/\/app\/.*\/page\.(tsx?|jsx?)$/.test(normalized))
55
+ return 'page';
56
+ if (/\/pages\/.*\.(tsx?|jsx?)$/.test(normalized) && !normalized.includes('_app') && !normalized.includes('_document'))
57
+ return 'page';
58
+ // Routes API
59
+ if (/\/app\/.*\/route\.(ts|js)$/.test(normalized))
60
+ return 'api-route';
61
+ if (/\/api\/.*\.(ts|js)$/.test(normalized))
62
+ return 'api-route';
63
+ // Controllers NestJS
64
+ if (node?.classes.some((c) => c.decorators.includes('Controller')))
65
+ return 'api-route';
66
+ // Routes detectees par le parser
67
+ if (node?.routes && node.routes.length > 0)
68
+ return 'api-route';
69
+ // Entry points
70
+ if (normalized.endsWith('/index.ts') || normalized.endsWith('/index.js')) {
71
+ // Seulement les index a la racine de src/, pas les barrels internes
72
+ if (normalized.includes('/src/index.') || normalized.includes('/main.'))
73
+ return 'entry-point';
74
+ }
75
+ if (normalized.endsWith('/main.ts') || normalized.endsWith('/main.js'))
76
+ return 'entry-point';
77
+ // Composants React (fichiers dans components/ qui sont des feuilles)
78
+ if (normalized.includes('/components/') && /\.(tsx|jsx)$/.test(normalized))
79
+ return 'component';
80
+ return null;
81
+ }
82
+ /** Extrait la route/URL associee a un fichier */
83
+ function extractRoute(filePath, node) {
84
+ const normalized = filePath.replace(/\\/g, '/');
85
+ // Next.js page : deduire l'URL du chemin
86
+ const pageMatch = normalized.match(/\/app(\/.*?)\/page\.(tsx?|jsx?)$/);
87
+ if (pageMatch) {
88
+ return pageMatch[1].replace(/\[([^\]]+)\]/g, ':$1') || '/';
89
+ }
90
+ // Next.js pages dir
91
+ const pagesMatch = normalized.match(/\/pages(\/.*?)\.(tsx?|jsx?)$/);
92
+ if (pagesMatch) {
93
+ const route = pagesMatch[1].replace(/\/index$/, '') || '/';
94
+ return route.replace(/\[([^\]]+)\]/g, ':$1');
95
+ }
96
+ // Next.js API route
97
+ const apiMatch = normalized.match(/\/app(\/.*?)\/route\.(ts|js)$/);
98
+ if (apiMatch) {
99
+ return apiMatch[1].replace(/\[([^\]]+)\]/g, ':$1');
100
+ }
101
+ // Routes detectees par le parser
102
+ if (node?.routes && node.routes.length > 0) {
103
+ return node.routes.map((r) => `${r.method} ${r.path}`).join(', ');
104
+ }
105
+ return undefined;
106
+ }
107
+ /** Formate le resultat pour affichage MCP */
108
+ export function formatRegressionResult(result) {
109
+ const lines = [];
110
+ lines.push(`## Regression Map : ${toShortPath(result.sourceFile)}`);
111
+ lines.push(`**Cibles a retester** : ${result.targetCount}`);
112
+ if (result.targets.length === 0) {
113
+ lines.push('');
114
+ lines.push('> Aucune page, route ou entry point impacte. Pas de regression a craindre.');
115
+ return lines.join('\n');
116
+ }
117
+ const pages = result.targets.filter((t) => t.kind === 'page');
118
+ const apiRoutes = result.targets.filter((t) => t.kind === 'api-route');
119
+ const entryPoints = result.targets.filter((t) => t.kind === 'entry-point');
120
+ const components = result.targets.filter((t) => t.kind === 'component');
121
+ if (pages.length > 0) {
122
+ lines.push('');
123
+ lines.push('### Pages a retester');
124
+ for (const t of pages) {
125
+ lines.push(`- ${t.route ?? toShortPath(t.filePath)} (profondeur: ${t.depth})`);
126
+ }
127
+ }
128
+ if (apiRoutes.length > 0) {
129
+ lines.push('');
130
+ lines.push('### Routes API affectees');
131
+ for (const t of apiRoutes) {
132
+ lines.push(`- ${t.route ?? toShortPath(t.filePath)} (profondeur: ${t.depth})`);
133
+ }
134
+ }
135
+ if (entryPoints.length > 0) {
136
+ lines.push('');
137
+ lines.push('### Entry points');
138
+ for (const t of entryPoints) {
139
+ lines.push(`- ${toShortPath(t.filePath)} (profondeur: ${t.depth})`);
140
+ }
141
+ }
142
+ if (components.length > 0) {
143
+ lines.push('');
144
+ lines.push('### Composants impactes');
145
+ for (const t of components) {
146
+ lines.push(`- ${toShortPath(t.filePath)} (profondeur: ${t.depth})`);
147
+ }
148
+ }
149
+ return lines.join('\n');
150
+ }
151
+ //# sourceMappingURL=regression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.js","sourceRoot":"","sources":["../../src/tools/regression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Outil MCP : route_guard
3
+ * Coherence des routes frontend ↔ backend.
4
+ * Detecte les routes fantomes, les appels dans le vide, et les routes sensibles sans auth.
5
+ */
6
+ import type { ProjectIndex } from '../storage/index-store.js';
7
+ import type { RouteInfo, ApiCallInfo } from '../parsers/base-parser.js';
8
+ export interface RouteIssue {
9
+ severity: 'info' | 'warn' | 'danger';
10
+ message: string;
11
+ /** Route backend ou appel frontend concerne */
12
+ route?: {
13
+ method: string;
14
+ path: string;
15
+ };
16
+ /** Fichier source */
17
+ filePath: string;
18
+ line: number;
19
+ }
20
+ export interface RouteGuardResult {
21
+ /** Toutes les routes backend detectees */
22
+ backendRoutes: RouteInfo[];
23
+ /** Tous les appels API frontend detectes */
24
+ frontendCalls: Array<ApiCallInfo & {
25
+ filePath: string;
26
+ }>;
27
+ /** Problemes detectes */
28
+ issues: RouteIssue[];
29
+ /** Resume */
30
+ summary: {
31
+ total: number;
32
+ danger: number;
33
+ warn: number;
34
+ info: number;
35
+ };
36
+ }
37
+ export declare function runRouteGuard(index: ProjectIndex): RouteGuardResult;
38
+ /** Formate le resultat pour affichage MCP */
39
+ export declare function formatRouteGuardResult(result: RouteGuardResult): string;
40
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/tools/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,0CAA0C;IAC1C,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,4CAA4C;IAC5C,aAAa,EAAE,KAAK,CAAC,WAAW,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,yBAAyB;IACzB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,aAAa;IACb,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAyBD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CA0DnE;AAuFD,6CAA6C;AAC7C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAiDvE"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Outil MCP : route_guard
3
+ * Coherence des routes frontend ↔ backend.
4
+ * Detecte les routes fantomes, les appels dans le vide, et les routes sensibles sans auth.
5
+ */
6
+ /** Domaines sensibles — routes qui DOIVENT avoir un middleware d'auth */
7
+ const SENSITIVE_PATTERNS = [
8
+ /\/admin/i,
9
+ /\/auth\/delete/i,
10
+ /\/auth\/reset/i,
11
+ /\/users\/.*delete/i,
12
+ /\/payment/i,
13
+ /\/billing/i,
14
+ /\/settings/i,
15
+ /\/account/i,
16
+ ];
17
+ /** Routes qui n'ont pas besoin d'auth (login, register, health, public) */
18
+ const PUBLIC_ROUTE_PATTERNS = [
19
+ /\/auth\/login/i,
20
+ /\/auth\/register/i,
21
+ /\/auth\/signup/i,
22
+ /\/auth\/callback/i,
23
+ /\/health/i,
24
+ /\/public/i,
25
+ /\/webhook/i,
26
+ ];
27
+ export function runRouteGuard(index) {
28
+ const backendRoutes = collectBackendRoutes(index);
29
+ const frontendCalls = collectFrontendCalls(index);
30
+ const issues = [];
31
+ // 1. Routes backend pas appelees par le frontend (routes fantomes)
32
+ for (const route of backendRoutes) {
33
+ const isCalled = frontendCalls.some((call) => routeMatchesCall(route, call));
34
+ if (!isCalled) {
35
+ issues.push({
36
+ severity: 'info',
37
+ message: `Route backend jamais appelee par le frontend : ${route.method} ${route.path}`,
38
+ route: { method: route.method, path: route.path },
39
+ filePath: route.filePath,
40
+ line: route.line,
41
+ });
42
+ }
43
+ }
44
+ // 2. Appels frontend vers des routes inexistantes (appels dans le vide)
45
+ for (const call of frontendCalls) {
46
+ const exists = backendRoutes.some((route) => routeMatchesCall(route, call));
47
+ if (!exists) {
48
+ issues.push({
49
+ severity: 'warn',
50
+ message: `Appel frontend vers une route inexistante : ${call.method} ${call.url}`,
51
+ route: { method: call.method, path: call.url },
52
+ filePath: call.filePath,
53
+ line: call.line,
54
+ });
55
+ }
56
+ }
57
+ // 3. Routes sensibles sans middleware d'auth
58
+ for (const route of backendRoutes) {
59
+ if (!isSensitiveRoute(route.path))
60
+ continue;
61
+ if (isPublicRoute(route.path))
62
+ continue;
63
+ const hasAuth = route.authGuards && route.authGuards.length > 0;
64
+ if (!hasAuth) {
65
+ issues.push({
66
+ severity: 'danger',
67
+ message: `Route sensible sans middleware d'auth : ${route.method} ${route.path}`,
68
+ route: { method: route.method, path: route.path },
69
+ filePath: route.filePath,
70
+ line: route.line,
71
+ });
72
+ }
73
+ }
74
+ const summary = {
75
+ total: issues.length,
76
+ danger: issues.filter((i) => i.severity === 'danger').length,
77
+ warn: issues.filter((i) => i.severity === 'warn').length,
78
+ info: issues.filter((i) => i.severity === 'info').length,
79
+ };
80
+ return { backendRoutes, frontendCalls, issues, summary };
81
+ }
82
+ /** Collecte toutes les routes definies dans le backend */
83
+ function collectBackendRoutes(index) {
84
+ const routes = [];
85
+ for (const file of Object.values(index.files)) {
86
+ if (file.routes.length > 0) {
87
+ routes.push(...file.routes);
88
+ }
89
+ }
90
+ return routes;
91
+ }
92
+ /** Collecte les appels API dans les fichiers frontend (pas les fichiers backend) */
93
+ function collectFrontendCalls(index) {
94
+ const calls = [];
95
+ for (const file of Object.values(index.files)) {
96
+ if (!file.apiCalls || file.apiCalls.length === 0)
97
+ continue;
98
+ // Heuristique : un fichier qui definit des routes est un fichier backend
99
+ // Ses appels API sont des appels inter-services, pas des appels frontend
100
+ if (file.routes.length > 0)
101
+ continue;
102
+ // Chemins typiquement backend — exclure
103
+ const normalized = file.filePath.replace(/\\/g, '/');
104
+ if (/\/(controllers?|routes?|api|server|middleware)\//i.test(normalized))
105
+ continue;
106
+ for (const call of file.apiCalls) {
107
+ calls.push({ ...call, filePath: file.filePath });
108
+ }
109
+ }
110
+ return calls;
111
+ }
112
+ /** Prefixes courants ajoutes par les clients API (axios baseURL, proxy, etc.) */
113
+ const API_PREFIXES = ['/api/v1', '/api/v2', '/api'];
114
+ /** Verifie si une route backend correspond a un appel frontend */
115
+ function routeMatchesCall(route, call) {
116
+ // Methode doit correspondre (ou UNKNOWN cote frontend = wildcard)
117
+ if (call.method !== 'UNKNOWN' && call.method !== route.method)
118
+ return false;
119
+ const routePath = normalizePath(route.path);
120
+ const callUrl = normalizePath(call.url);
121
+ // Match direct
122
+ if (matchPaths(routePath, callUrl))
123
+ return true;
124
+ // Retenter en retirant les prefixes courants de l'URL frontend
125
+ for (const prefix of API_PREFIXES) {
126
+ if (callUrl.startsWith(prefix)) {
127
+ const stripped = callUrl.slice(prefix.length) || '/';
128
+ if (matchPaths(routePath, stripped))
129
+ return true;
130
+ }
131
+ }
132
+ return false;
133
+ }
134
+ /** Compare deux chemins segment par segment (supporte :param et [param]) */
135
+ function matchPaths(routePath, callUrl) {
136
+ if (routePath === callUrl)
137
+ return true;
138
+ const routeSegments = routePath.split('/');
139
+ const callSegments = callUrl.split('/');
140
+ if (routeSegments.length !== callSegments.length)
141
+ return false;
142
+ return routeSegments.every((seg, i) => {
143
+ if (seg.startsWith(':') || seg.startsWith('['))
144
+ return true;
145
+ if (callSegments[i].startsWith(':'))
146
+ return true;
147
+ return seg === callSegments[i];
148
+ });
149
+ }
150
+ function normalizePath(path) {
151
+ return path.replace(/\/+/g, '/').replace(/\/$/, '').toLowerCase();
152
+ }
153
+ function isSensitiveRoute(path) {
154
+ return SENSITIVE_PATTERNS.some((pattern) => pattern.test(path));
155
+ }
156
+ function isPublicRoute(path) {
157
+ return PUBLIC_ROUTE_PATTERNS.some((pattern) => pattern.test(path));
158
+ }
159
+ /** Formate le resultat pour affichage MCP */
160
+ export function formatRouteGuardResult(result) {
161
+ const lines = [];
162
+ lines.push('## Route Guard');
163
+ lines.push(`- Routes backend : ${result.backendRoutes.length}`);
164
+ lines.push(`- Appels API frontend : ${result.frontendCalls.length}`);
165
+ if (result.issues.length === 0) {
166
+ lines.push('');
167
+ lines.push('> Aucun probleme detecte. Les routes frontend et backend sont coherentes.');
168
+ return lines.join('\n');
169
+ }
170
+ lines.push(`- Problemes : ${result.summary.total} (${result.summary.danger} critiques, ${result.summary.warn} alertes, ${result.summary.info} infos)`);
171
+ // Danger en premier
172
+ const dangerIssues = result.issues.filter((i) => i.severity === 'danger');
173
+ if (dangerIssues.length > 0) {
174
+ lines.push('');
175
+ lines.push('### Routes sensibles sans auth');
176
+ for (const issue of dangerIssues) {
177
+ lines.push(`- /!\\ ${issue.message}`);
178
+ lines.push(` → ${issue.filePath}:${issue.line}`);
179
+ }
180
+ }
181
+ // Warn ensuite
182
+ const warnIssues = result.issues.filter((i) => i.severity === 'warn');
183
+ if (warnIssues.length > 0) {
184
+ lines.push('');
185
+ lines.push('### Appels frontend vers routes inexistantes');
186
+ for (const issue of warnIssues) {
187
+ lines.push(`- ! ${issue.message}`);
188
+ lines.push(` → ${issue.filePath}:${issue.line}`);
189
+ }
190
+ }
191
+ // Info en dernier
192
+ const infoIssues = result.issues.filter((i) => i.severity === 'info');
193
+ if (infoIssues.length > 0) {
194
+ lines.push('');
195
+ lines.push('### Routes backend non utilisees par le frontend');
196
+ for (const issue of infoIssues) {
197
+ lines.push(`- ${issue.message}`);
198
+ lines.push(` → ${issue.filePath}:${issue.line}`);
199
+ }
200
+ }
201
+ return lines.join('\n');
202
+ }
203
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/tools/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Outil MCP : schema_check
3
+ * Coherence Prisma ↔ DTOs backend ↔ types frontend.
4
+ * Detecte les champs manquants, types incompatibles, enums desynchronises.
5
+ */
6
+ import type { ProjectIndex } from '../storage/index-store.js';
7
+ export interface SchemaIssue {
8
+ severity: 'error' | 'warning' | 'info';
9
+ model: string;
10
+ message: string;
11
+ prismaFile?: string;
12
+ matchFile?: string;
13
+ }
14
+ export interface SchemaResult {
15
+ /** Nombre de modeles Prisma trouves */
16
+ modelCount: number;
17
+ /** Nombre d'enums Prisma trouves */
18
+ enumCount: number;
19
+ /** Correspondances trouvees (modele Prisma → DTO/type) */
20
+ matches: SchemaMatch[];
21
+ /** Problemes detectes */
22
+ issues: SchemaIssue[];
23
+ issueCount: number;
24
+ }
25
+ export interface SchemaMatch {
26
+ prismaModel: string;
27
+ matchedType: string;
28
+ matchedFile: string;
29
+ /** Champs Prisma absents du type matche */
30
+ missingFields: string[];
31
+ /** Champs dans le type mais pas dans Prisma */
32
+ extraFields: string[];
33
+ }
34
+ export declare function runSchemaCheck(index: ProjectIndex): SchemaResult;
35
+ /** Formate le resultat pour affichage MCP */
36
+ export declare function formatSchemaResult(result: SchemaResult): string;
37
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yBAAyB;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAiIhE;AA2DD,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAyD/D"}