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,150 @@
1
+ /**
2
+ * Resolution d'imports — source unique de verite.
3
+ * Utilise partout : dependency-graph, check, health.
4
+ * Gere :
5
+ * - Convention ESM (import from './foo.js' → fichier reel foo.ts)
6
+ * - Path aliases TypeScript (import from '@/lib/utils' → src/lib/utils.ts)
7
+ */
8
+ import { resolve, dirname, join } from 'node:path';
9
+ import { readFileSync, existsSync } from 'node:fs';
10
+ const JS_EXTENSIONS = ['.js', '.jsx', '.mjs', '.cjs'];
11
+ const TS_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js'];
12
+ // Cache des aliases par projet (eviter de relire tsconfig a chaque appel)
13
+ const aliasCache = new Map();
14
+ /**
15
+ * Charge les path aliases depuis les tsconfig.json du projet.
16
+ * Cherche dans la racine, dans backend/ et frontend/ (monorepo).
17
+ */
18
+ export function loadPathAliases(projectRoot) {
19
+ if (aliasCache.has(projectRoot))
20
+ return aliasCache.get(projectRoot);
21
+ const aliases = [];
22
+ const tsconfigPaths = [
23
+ join(projectRoot, 'tsconfig.json'),
24
+ join(projectRoot, 'backend', 'tsconfig.json'),
25
+ join(projectRoot, 'frontend', 'tsconfig.json'),
26
+ ];
27
+ for (const tsconfigPath of tsconfigPaths) {
28
+ if (!existsSync(tsconfigPath))
29
+ continue;
30
+ try {
31
+ const raw = readFileSync(tsconfigPath, 'utf-8');
32
+ // Essayer le JSON brut d'abord, puis nettoyer les commentaires en fallback
33
+ let config;
34
+ try {
35
+ config = JSON.parse(raw);
36
+ }
37
+ catch {
38
+ // Retirer les commentaires (hors des strings) et trailing commas
39
+ const cleaned = raw
40
+ .replace(/("(?:[^"\\]|\\.)*")|\/\/.*$/gm, (_, str) => str ?? '')
41
+ .replace(/("(?:[^"\\]|\\.)*")|\/\*[\s\S]*?\*\//g, (_, str) => str ?? '')
42
+ .replace(/,\s*([\]}])/g, '$1');
43
+ config = JSON.parse(cleaned);
44
+ }
45
+ const paths = config?.compilerOptions?.paths;
46
+ const baseUrl = config?.compilerOptions?.baseUrl ?? '.';
47
+ const tsconfigDir = dirname(tsconfigPath);
48
+ const resolvedBaseUrl = resolve(tsconfigDir, baseUrl);
49
+ if (paths && typeof paths === 'object') {
50
+ for (const [pattern, targets] of Object.entries(paths)) {
51
+ if (!Array.isArray(targets))
52
+ continue;
53
+ // Pattern : "@/*" → prefix "@/"
54
+ const prefix = pattern.replace(/\*$/, '');
55
+ for (const target of targets) {
56
+ // Target : "src/*" → "src/"
57
+ const targetDir = target.replace(/\*$/, '');
58
+ const resolvedTarget = resolve(resolvedBaseUrl, targetDir);
59
+ aliases.push({ prefix, targets: [resolvedTarget] });
60
+ }
61
+ }
62
+ }
63
+ }
64
+ catch {
65
+ // tsconfig invalide — ignorer
66
+ }
67
+ }
68
+ aliasCache.set(projectRoot, aliases);
69
+ return aliases;
70
+ }
71
+ /** Vide le cache des aliases (pour les tests ou apres reindex) */
72
+ export function clearAliasCache() {
73
+ aliasCache.clear();
74
+ }
75
+ /**
76
+ * Resout un chemin d'import vers un chemin absolu dans l'index.
77
+ * Supporte : chemins relatifs, convention ESM, path aliases TypeScript.
78
+ */
79
+ export function resolveImportPath(fromFile, importSource, fileSet, projectRoot) {
80
+ // 1. Imports relatifs (./ ou ../)
81
+ if (importSource.startsWith('.')) {
82
+ return resolveRelativeImport(fromFile, importSource, fileSet);
83
+ }
84
+ // 2. Path aliases (@/... ou tout alias configure)
85
+ if (projectRoot) {
86
+ const aliases = loadPathAliases(projectRoot);
87
+ for (const alias of aliases) {
88
+ if (importSource.startsWith(alias.prefix)) {
89
+ const rest = importSource.slice(alias.prefix.length);
90
+ for (const targetDir of alias.targets) {
91
+ const resolved = resolve(targetDir, rest);
92
+ const result = tryResolveWithExtensions(resolved, fileSet);
93
+ if (result)
94
+ return result;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ // 3. Non resolu (package externe ou alias inconnu)
100
+ return null;
101
+ }
102
+ /** Resout un import relatif (./foo, ../bar) */
103
+ function resolveRelativeImport(fromFile, importSource, fileSet) {
104
+ const dir = dirname(fromFile);
105
+ const base = resolve(dir, importSource);
106
+ // Tester avec et sans extension JS (convention ESM)
107
+ const bases = [base];
108
+ for (const jsExt of JS_EXTENSIONS) {
109
+ if (base.endsWith(jsExt)) {
110
+ bases.push(base.slice(0, -jsExt.length));
111
+ break;
112
+ }
113
+ }
114
+ for (const b of bases) {
115
+ const result = tryResolveWithExtensions(b, fileSet);
116
+ if (result)
117
+ return result;
118
+ }
119
+ return null;
120
+ }
121
+ /** Essaie de trouver un fichier dans le fileSet avec les extensions TS courantes */
122
+ function tryResolveWithExtensions(basePath, fileSet) {
123
+ // Forward slashes
124
+ const fwd = basePath.replace(/\\/g, '/');
125
+ if (fileSet[fwd] !== undefined)
126
+ return fwd;
127
+ for (const ext of TS_EXTENSIONS) {
128
+ const candidate = (fwd + ext).replace(/\\/g, '/');
129
+ if (fileSet[candidate] !== undefined)
130
+ return candidate;
131
+ }
132
+ // Backslashes (Windows)
133
+ const win = basePath.replace(/\//g, '\\');
134
+ if (fileSet[win] !== undefined)
135
+ return win;
136
+ for (const ext of TS_EXTENSIONS) {
137
+ const candidate = (win + ext).replace(/\//g, '\\');
138
+ if (fileSet[candidate] !== undefined)
139
+ return candidate;
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Verifie si un import depuis fromFile pointe vers targetFile.
145
+ */
146
+ export function importPointsTo(importSource, targetFile, fromFile, fileSet, projectRoot) {
147
+ const resolved = resolveImportPath(fromFile, importSource, fileSet, projectRoot);
148
+ return resolved === targetFile;
149
+ }
150
+ //# sourceMappingURL=import-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../src/utils/import-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Logger structure pour CodeGuard.
3
+ * JAMAIS sur stderr — lecon GitNexus : MCP utilise stderr pour les erreurs de protocole.
4
+ * Les logs vont dans un fichier .codeguard/codeguard.log dans le projet cible.
5
+ */
6
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
7
+ export declare function initLogger(projectRoot: string, level?: LogLevel): void;
8
+ export declare const logger: {
9
+ debug: (msg: string, data?: Record<string, unknown>) => void;
10
+ info: (msg: string, data?: Record<string, unknown>) => void;
11
+ warn: (msg: string, data?: Record<string, unknown>) => void;
12
+ error: (msg: string, data?: Record<string, unknown>) => void;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAYpD,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,QAAiB,GAAG,IAAI,CAO9E;AAsBD,eAAO,MAAM,MAAM;iBACJ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBACvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBACtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBACrC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CACpD,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Logger structure pour CodeGuard.
3
+ * JAMAIS sur stderr — lecon GitNexus : MCP utilise stderr pour les erreurs de protocole.
4
+ * Les logs vont dans un fichier .codeguard/codeguard.log dans le projet cible.
5
+ */
6
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ const LOG_LEVELS = {
9
+ debug: 0,
10
+ info: 1,
11
+ warn: 2,
12
+ error: 3,
13
+ };
14
+ let logFilePath = null;
15
+ let minLevel = 'info';
16
+ export function initLogger(projectRoot, level = 'info') {
17
+ const codeguardDir = join(projectRoot, '.codeguard');
18
+ if (!existsSync(codeguardDir)) {
19
+ mkdirSync(codeguardDir, { recursive: true });
20
+ }
21
+ logFilePath = join(codeguardDir, 'codeguard.log');
22
+ minLevel = level;
23
+ }
24
+ function log(level, message, data) {
25
+ if (LOG_LEVELS[level] < LOG_LEVELS[minLevel])
26
+ return;
27
+ const entry = {
28
+ timestamp: new Date().toISOString(),
29
+ level,
30
+ message,
31
+ ...(data ? { data } : {}),
32
+ };
33
+ // Ecriture dans le fichier si initialise, sinon on perd le log (mieux que stderr)
34
+ if (logFilePath) {
35
+ try {
36
+ writeFileSync(logFilePath, JSON.stringify(entry) + '\n', { flag: 'a' });
37
+ }
38
+ catch {
39
+ // Pas de fallback sur stderr — protocole MCP l'interdit
40
+ }
41
+ }
42
+ }
43
+ export const logger = {
44
+ debug: (msg, data) => log('debug', msg, data),
45
+ info: (msg, data) => log('info', msg, data),
46
+ warn: (msg, data) => log('warn', msg, data),
47
+ error: (msg, data) => log('error', msg, data),
48
+ };
49
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,WAAW,GAAkB,IAAI,CAAC;AACtC,IAAI,QAAQ,GAAa,MAAM,CAAC;AAEhC,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,QAAkB,MAAM;IACtE,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClD,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,SAAS,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAA8B;IAC3E,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAErD,MAAM,KAAK,GAAG;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK;QACL,OAAO;QACP,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAC;IAEF,kFAAkF;IAClF,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;IAC/E,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;IAC7E,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;IAC7E,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;CAChF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Utilitaires de chemins partages.
3
+ */
4
+ /** Extrait un chemin court depuis un chemin absolu (ex: "src/parsers/base-parser") */
5
+ export declare function toShortPath(filePath: string): string;
6
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Utilitaires de chemins partages.
3
+ */
4
+ /** Extrait un chemin court depuis un chemin absolu (ex: "src/parsers/base-parser") */
5
+ export function toShortPath(filePath) {
6
+ const normalized = filePath.replace(/\\/g, '/');
7
+ const srcIdx = normalized.lastIndexOf('/src/');
8
+ if (srcIdx !== -1)
9
+ return normalized.slice(srcIdx + 1);
10
+ return normalized.split('/').slice(-3).join('/');
11
+ }
12
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Scanner de fichiers — parcourt le projet et retourne les fichiers a indexer.
3
+ * Respecte .gitignore et les dossiers a ignorer (node_modules, .next, dist...).
4
+ */
5
+ export interface ScanResult {
6
+ files: string[];
7
+ scannedDirs: number;
8
+ ignoredDirs: number;
9
+ duration: number;
10
+ }
11
+ /** Scanne un projet et retourne tous les fichiers supportes */
12
+ export declare function scanProject(projectRoot: string): ScanResult;
13
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAgD3D"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Scanner de fichiers — parcourt le projet et retourne les fichiers a indexer.
3
+ * Respecte .gitignore et les dossiers a ignorer (node_modules, .next, dist...).
4
+ */
5
+ import { readdirSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { shouldIgnorePath, shouldIgnoreFile, isSupportedFile } from '../parsers/detector.js';
8
+ /** Scanne un projet et retourne tous les fichiers supportes */
9
+ export function scanProject(projectRoot) {
10
+ const start = Date.now();
11
+ const files = [];
12
+ let scannedDirs = 0;
13
+ let ignoredDirs = 0;
14
+ function walk(dir) {
15
+ let entries;
16
+ try {
17
+ entries = readdirSync(dir, { withFileTypes: true });
18
+ }
19
+ catch {
20
+ return; // Permission denied ou lien symbolique casse
21
+ }
22
+ scannedDirs++;
23
+ for (const entry of entries) {
24
+ // Ignorer les liens symboliques (risque de traversee hors projet)
25
+ if (entry.isSymbolicLink())
26
+ continue;
27
+ const fullPath = join(dir, entry.name);
28
+ if (entry.isDirectory()) {
29
+ if (shouldIgnorePath(entry.name)) {
30
+ ignoredDirs++;
31
+ continue;
32
+ }
33
+ walk(fullPath);
34
+ }
35
+ else if (entry.isFile()) {
36
+ if (shouldIgnoreFile(entry.name))
37
+ continue;
38
+ if (!isSupportedFile(fullPath))
39
+ continue;
40
+ // Ignorer les fichiers de declaration (.d.ts)
41
+ if (entry.name.endsWith('.d.ts'))
42
+ continue;
43
+ files.push(fullPath);
44
+ }
45
+ }
46
+ }
47
+ walk(projectRoot);
48
+ return {
49
+ files,
50
+ scannedDirs,
51
+ ignoredDirs,
52
+ duration: Date.now() - start,
53
+ };
54
+ }
55
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/utils/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAY,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAS7F,+DAA+D;AAC/D,MAAM,UAAU,WAAW,CAAC,WAAmB;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,SAAS,IAAI,CAAC,GAAW;QACvB,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,6CAA6C;QACvD,CAAC;QAED,WAAW,EAAE,CAAC;QAEd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,kEAAkE;YAClE,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAS;YAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,WAAW,EAAE,CAAC;oBACd,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,IAAI,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC3C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;oBAAE,SAAS;gBAEzC,8CAA8C;gBAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAE3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,CAAC;IAElB,OAAO;QACL,KAAK;QACL,WAAW;QACX,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Schemas de validation zod pour les donnees externes.
3
+ * Tout ce qui entre depuis stdin, le filesystem, ou un client MCP tiers
4
+ * doit etre valide avant d'etre utilise.
5
+ */
6
+ import { z } from 'zod';
7
+ export declare const HookInputSchema: z.ZodObject<{
8
+ tool_input: z.ZodOptional<z.ZodObject<{
9
+ file_path: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>>;
11
+ cwd: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$loose>;
13
+ export type ValidatedHookInput = {
14
+ filePath: string;
15
+ cwd: string;
16
+ };
17
+ /** Valide et extrait les champs utiles du JSON recu par le hook */
18
+ export declare function validateHookInput(data: unknown): ValidatedHookInput | null;
19
+ export declare const ProjectIndexSchema: z.ZodObject<{
20
+ projectRoot: z.ZodString;
21
+ indexedAt: z.ZodNumber;
22
+ fileCount: z.ZodNumber;
23
+ files: z.ZodRecord<z.ZodString, z.ZodObject<{
24
+ filePath: z.ZodString;
25
+ language: z.ZodString;
26
+ imports: z.ZodArray<z.ZodObject<{
27
+ name: z.ZodString;
28
+ source: z.ZodString;
29
+ isTypeOnly: z.ZodBoolean;
30
+ }, z.core.$strip>>;
31
+ exports: z.ZodArray<z.ZodObject<{
32
+ name: z.ZodString;
33
+ kind: z.ZodString;
34
+ isTypeOnly: z.ZodBoolean;
35
+ }, z.core.$strip>>;
36
+ functions: z.ZodArray<z.ZodAny>;
37
+ classes: z.ZodArray<z.ZodAny>;
38
+ types: z.ZodArray<z.ZodAny>;
39
+ routes: z.ZodArray<z.ZodAny>;
40
+ parsedAt: z.ZodNumber;
41
+ }, z.core.$loose>>;
42
+ }, z.core.$strip>;
43
+ /** Valide un ProjectIndex charge depuis le disque */
44
+ export declare function validateProjectIndex(data: unknown): boolean;
45
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;;;iBAKZ,CAAC;AAEjB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAQ1E;AAwBD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;iBAK7B,CAAC;AAEH,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Schemas de validation zod pour les donnees externes.
3
+ * Tout ce qui entre depuis stdin, le filesystem, ou un client MCP tiers
4
+ * doit etre valide avant d'etre utilise.
5
+ */
6
+ import { z } from 'zod';
7
+ // --- Validation stdin hook (cli.ts) ---
8
+ export const HookInputSchema = z.object({
9
+ tool_input: z.object({
10
+ file_path: z.string().optional(),
11
+ }).optional(),
12
+ cwd: z.string().optional(),
13
+ }).passthrough();
14
+ /** Valide et extrait les champs utiles du JSON recu par le hook */
15
+ export function validateHookInput(data) {
16
+ const result = HookInputSchema.safeParse(data);
17
+ if (!result.success)
18
+ return null;
19
+ return {
20
+ filePath: result.data.tool_input?.file_path ?? '',
21
+ cwd: result.data.cwd ?? '',
22
+ };
23
+ }
24
+ // --- Validation ProjectIndex (index-store.ts) ---
25
+ const FileNodeSchema = z.object({
26
+ filePath: z.string(),
27
+ language: z.string(),
28
+ imports: z.array(z.object({
29
+ name: z.string(),
30
+ source: z.string(),
31
+ isTypeOnly: z.boolean(),
32
+ })),
33
+ exports: z.array(z.object({
34
+ name: z.string(),
35
+ kind: z.string(),
36
+ isTypeOnly: z.boolean(),
37
+ })),
38
+ functions: z.array(z.any()),
39
+ classes: z.array(z.any()),
40
+ types: z.array(z.any()),
41
+ routes: z.array(z.any()),
42
+ parsedAt: z.number(),
43
+ }).passthrough();
44
+ export const ProjectIndexSchema = z.object({
45
+ projectRoot: z.string(),
46
+ indexedAt: z.number(),
47
+ fileCount: z.number().int().nonnegative(),
48
+ files: z.record(z.string(), FileNodeSchema),
49
+ });
50
+ /** Valide un ProjectIndex charge depuis le disque */
51
+ export function validateProjectIndex(data) {
52
+ return ProjectIndexSchema.safeParse(data).success;
53
+ }
54
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yCAAyC;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACjC,CAAC,CAAC,QAAQ,EAAE;IACb,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC,WAAW,EAAE,CAAC;AAOjB,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEjC,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE;QACjD,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED,mDAAmD;AAEnD,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;KACxB,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;KACxB,CAAC,CAAC;IACH,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;CAC5C,CAAC,CAAC;AAEH,qDAAqD;AACrD,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AACpD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "skhaall-codeguard",
3
+ "version": "0.1.0",
4
+ "description": "MCP server — analyse de code TypeScript/Prisma, graphe de dependances, impact analysis pour Claude Code",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "codeguard": "dist/index.js",
9
+ "codeguard-cli": "dist/cli.js",
10
+ "codeguard-setup": "dist/setup.js"
11
+ },
12
+ "files": [
13
+ "dist/",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "start": "node dist/index.js",
21
+ "guard": "node dist/cli.js guard",
22
+ "check": "node dist/cli.js check",
23
+ "test": "node test-mcp.mjs",
24
+ "typecheck": "tsc --noEmit",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "keywords": [
28
+ "mcp",
29
+ "claude",
30
+ "claude-code",
31
+ "code-analysis",
32
+ "impact-analysis",
33
+ "dependency-graph",
34
+ "typescript",
35
+ "prisma",
36
+ "guard",
37
+ "schema-check"
38
+ ],
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/Skhaaall/codeguard.git"
42
+ },
43
+ "author": "Skhaall",
44
+ "license": "MIT",
45
+ "engines": {
46
+ "node": ">=20"
47
+ },
48
+ "dependencies": {
49
+ "@modelcontextprotocol/sdk": "^1.29.0",
50
+ "ts-morph": "^27.0.2",
51
+ "zod": "^4.3.6"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^25.5.2",
55
+ "typescript": "^6.0.2"
56
+ }
57
+ }